<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-1121966792426977205</id><updated>2012-01-18T16:46:29.762-08:00</updated><category term='rubyconf2010'/><title type='text'>Old Fart Developer</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://oldfartdeveloper.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1121966792426977205/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://oldfartdeveloper.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>OldFartDeveloper</name><uri>http://www.blogger.com/profile/02037828059640161019</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>22</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-1121966792426977205.post-3976069530183132</id><published>2012-01-18T16:39:00.000-08:00</published><updated>2012-01-18T16:46:29.779-08:00</updated><title type='text'>Ember JS Meetup</title><content type='html'>Wilker Lucio and I started an &lt;a href="http://www.meetup.com/OC-EmberJS/"&gt;Ember JS Meetup Group&lt;/a&gt; here in Orange County, CA.  Last night we had our first meeting, and I made a presentation oriented towards Ember JS newbies.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The presentation is in the &lt;a href="https://github.com/oldfartdeveloper/rails-emberjs-todos/wiki/Presentation"&gt;wiki&lt;/a&gt; for the GitHub &lt;a href="https://github.com/oldfartdeveloper/rails-emberjs-todos"&gt;repository&lt;/a&gt; for the sample code.  Thanks to &lt;a href="http://www.arailsdemo.com/"&gt;aRailsDemo&lt;/a&gt; for some excellent screencasts and sample code which I shamelessly purloined for my presentation.  My presentation in the wiki may help some of you who were intimidated by the pace of his screencasts; a video won't wait for clarifying questions.  ;-)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Enjoy!&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1121966792426977205-3976069530183132?l=oldfartdeveloper.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oldfartdeveloper.blogspot.com/feeds/3976069530183132/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://oldfartdeveloper.blogspot.com/2012/01/ember-js-meetup.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1121966792426977205/posts/default/3976069530183132'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1121966792426977205/posts/default/3976069530183132'/><link rel='alternate' type='text/html' href='http://oldfartdeveloper.blogspot.com/2012/01/ember-js-meetup.html' title='Ember JS Meetup'/><author><name>OldFartDeveloper</name><uri>http://www.blogger.com/profile/02037828059640161019</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1121966792426977205.post-7342104010919243202</id><published>2011-10-15T16:13:00.000-07:00</published><updated>2011-10-17T19:05:04.443-07:00</updated><title type='text'>RubyMine Still Hanging on Indexing?  Reinstall!</title><content type='html'>Okay, so my &lt;a href="http://oldfartdeveloper.blogspot.com/2011/09/is-your-rubymine-hanging.html"&gt;previous posting&lt;/a&gt; might not be enough.  After initial success, RubyMine again started to hang on reindexing, this time on several large projects.&lt;br /&gt;&lt;br /&gt;So I did an experiment: I ran the same version of RubyMine on another MacBook Pro on the same Rails project that was failing on my first computer.  It ran successfully.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Hmm!?!&lt;br /&gt;&lt;br /&gt;I did some research on "really" removing Macintosh applications, and the following actions cleared the problem.&lt;br /&gt;&lt;div&gt;&lt;ol&gt;&lt;li&gt;In &lt;b&gt;Finder&lt;/b&gt;, remove your RubyMine application from the &lt;span class="Apple-style-span"&gt;/Applications&lt;/span&gt; folder.&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span"&gt;rm -rf ~/Library/Caches/RubyMine32&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span"&gt;rm -rf ~/Library/Logs/RubyMine32&lt;/span&gt;&lt;/li&gt;&lt;li&gt;Reboot the affected laptop&lt;/li&gt;&lt;li&gt;Reinstall from the RubyMine &lt;span class="Apple-style-span"&gt;dmg &lt;/span&gt;file.&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;When I relaunched on the previously hanging project, it launched fine.  When I closed and reopened the project, the quick loading reflected the successfully-generated index files.&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1121966792426977205-7342104010919243202?l=oldfartdeveloper.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oldfartdeveloper.blogspot.com/feeds/7342104010919243202/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://oldfartdeveloper.blogspot.com/2011/10/rubymine-still-hanging-on-indexing.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1121966792426977205/posts/default/7342104010919243202'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1121966792426977205/posts/default/7342104010919243202'/><link rel='alternate' type='text/html' href='http://oldfartdeveloper.blogspot.com/2011/10/rubymine-still-hanging-on-indexing.html' title='RubyMine Still Hanging on Indexing?  Reinstall!'/><author><name>OldFartDeveloper</name><uri>http://www.blogger.com/profile/02037828059640161019</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1121966792426977205.post-5949561763047822440</id><published>2011-09-08T14:40:00.000-07:00</published><updated>2011-10-17T19:07:03.226-07:00</updated><title type='text'>Is Your RubyMine Hanging?</title><content type='html'>I love RubyMine.  But, recently I've been going through struggles with it in which it would hang on indexing when I started it on certain projects.  I'd have to force kill RubyMine (while muttering under my breath) and go use MacVim or something else.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;When I go to JetBrains' YouTRACK, I can see that a lot of RubyMine users are having similar issues.&lt;br /&gt;&lt;br /&gt;After posting my own &lt;a href="http://youtrack.jetbrains.net/issue/RUBY-9372#tab=Comments"&gt;issues&lt;/a&gt; and otherwise researching the problem, it finally dawned on my that maybe my project was giving RubyMine some "really stinky files" to index.  So I checked and found:&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;A 68-megabyte SQL backup file in the root of one of the projects.&lt;/li&gt;&lt;li&gt;Huge log files&lt;/li&gt;&lt;li&gt;Gawd knows what in my tmp directory&lt;/li&gt;&lt;li&gt;Big Java JAR files were in the project&lt;/li&gt;&lt;/ul&gt;Ugh.  How dumb of me!&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So, I did the following:&lt;/div&gt;&lt;div&gt;&lt;ol&gt;&lt;li&gt;If you can't start RubyMine because it hangs on indexing, kill it and then go in and purge any large files that it might be indexing on.  Purge the '.idea' folder so that the next time you try to launch RubyMine on that project it has a "clean slate" to work from.&lt;/li&gt;&lt;li&gt;Be sure that any background processes (like the Rails app you're testing using RubyMine) don't output into any folder that RubyMine indexes on.&lt;/li&gt;&lt;li&gt;When you can successfully launch RubyMine on a project (probably by opening the project folder since you don't yet have a '.idea' folder that works), then exclude troublesome folders in your project.  Do so by selecting menu item 'Preferences' -&amp;gt; 'Project Structure', then exclude the following folders:&lt;ul&gt;&lt;li&gt;log&lt;/li&gt;&lt;li&gt;tmp&lt;/li&gt;&lt;li&gt;Any folder that holds Java JARS or any other large binary files&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;When you have a setup that works (by doing the following), backup your '.idea' folder so you can get back to a configuration that works.&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;Now my RubyMine can simultaneously keep open two large projects that it previously couldn't reliably open either.&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;And again I love my RubyMine!&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;btw, my version of RubyMine is 3.2.4.  And if you still have indexing problems, you may have to &lt;a href="http://oldfartdeveloper.blogspot.com/2011/10/rubymine-still-hanging-on-indexing.html"&gt;reinstall RubyMine&lt;/a&gt;.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1121966792426977205-5949561763047822440?l=oldfartdeveloper.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oldfartdeveloper.blogspot.com/feeds/5949561763047822440/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://oldfartdeveloper.blogspot.com/2011/09/is-your-rubymine-hanging.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1121966792426977205/posts/default/5949561763047822440'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1121966792426977205/posts/default/5949561763047822440'/><link rel='alternate' type='text/html' href='http://oldfartdeveloper.blogspot.com/2011/09/is-your-rubymine-hanging.html' title='Is Your RubyMine Hanging?'/><author><name>OldFartDeveloper</name><uri>http://www.blogger.com/profile/02037828059640161019</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1121966792426977205.post-7738190003723231305</id><published>2010-11-15T21:32:00.000-08:00</published><updated>2010-11-15T22:34:05.804-08:00</updated><title type='text'>Friday Rubyconf Notes</title><content type='html'>&lt;b&gt;Keynote&lt;/b&gt;&lt;div&gt;DHH delivered a passionate, amusing diatribe against the development culture that demands that the programmer must be controlled.  Hence the likes of strictly-typed languages, waterfall, throwing code over the wall, and all the resulting demoralization that goes along with it.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;David asserted that freedom carries with it the potential to do great good as well as great evil.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I suddenly appreciate how special this Ruby community and culture is: because of our freedom, we all aspire to very high moral standards of opportunity, fair play, and nurture.  Because this freedom to express yourself is a precious freedom indeed, I see many people in this community joyously giving themselves to preserve it.  My church makes the same entreaties in its community, yet at this time they don't seem to come even close to this community's results.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;RubyConf has been a refuge from the greater American atmosphere of distrust, cynicism, spinning, and unhappiness.  Thank you all, I am very grateful.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;LDAP, the Original No-SQL&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;My main takeaway from this talk is that LDAP has some special strengths that make it a good choice for some applications:&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Distributed&lt;/li&gt;&lt;li&gt;Mature&lt;/li&gt;&lt;li&gt;Asynchronous&lt;/li&gt;&lt;li&gt;High-Performance&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;If the application has a high read-to-write ratio, the case for using LDAP as opposed to other "No-SQL" solutions is very good indeed.&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Rubinius - What Have You Done for me Today?&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The main goal for this Ruby variant is to leverage the Ruby language itself to implement the Ruby engine as much as possible.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Evan Phoenix has made a lot of progress since I last saw his presentation at Railsconf.  Development has continued to take advantage of the "Ruby-ness": better than average benchmarking and profiling tools.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;They are now working to be compatible with version 1.9.2.  The future includes a Windows version and full concurrency.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;MacRuby - why and how&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;Matt Aimonetti showed the latest version of the Ruby that can directly access the OS X objects in Cocoa.  This make MacRuby a strong contender for implementing Mac applications.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;To the question: when will it be available for iOS, Matt could only say that, aside from having to implement a garbage collector, there are no other technical issues.  The real issue is whether Apple wants to support that capability.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Having used Smalltalk to learn the Windows API in the 1990's, I can only hope that Apple enables the same capability using MacRuby.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;pie: the making of a DSL for simple games&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I was tired of technical presentations and wanted to see what other Ruby efforts were going on.  Here Sarah Allen testimonied about using Ruby to develop a simple DSL for an adventure game.  What was interesting was her thought process and how checking out her early design ideas with others caused all of the "rewriting" to take place in the beginning when it was easy.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;By taking it to children early, she gained valuable insight on what held their attention and what didn't.  As expected, the childrens' ages mattered a lot.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I learned a lot about distributing early versions to the customer and how to benefit from their feedback.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Socalist Software Development&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;CJ Kihlbom is from Sweden and he admits he has a "socialist" point of view about developing i the Agile Ruby environment.  Both amusing and insightful, he illustrated how seeing the opportunity glass "half-full" makes the Ruby community much more joyous and supportive.  Among the software practices that are "socialist":&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Open source&lt;/li&gt;&lt;li&gt;Pair programming&lt;/li&gt;&lt;li&gt;Collaboration&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;The results of these practices are a large number of benefits:&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt; * Flow&lt;/div&gt;&lt;div&gt; * Lessons distractions&lt;/div&gt;&lt;div&gt; * Camaraderie&lt;/div&gt;&lt;div&gt; * Helps w/ morale&lt;/div&gt;&lt;div&gt; * Work w/ people you like&lt;/div&gt;&lt;div&gt; * Better morale&lt;/div&gt;&lt;div&gt; * Stability&lt;/div&gt;&lt;div&gt; * Immunity from a developer hit by a bus ("bus number")&lt;/div&gt;&lt;div&gt; * Learning&lt;/div&gt;&lt;div&gt; * Apprenticeship&lt;/div&gt;&lt;div&gt; * Formal apprenticeship programs&lt;/div&gt;&lt;div&gt; * "Apprenticeship Patterns Guidance for the Aspiring Software Craftsman" O Reilly&lt;/div&gt;&lt;div&gt; * Mentoring&lt;/div&gt;&lt;div&gt; * Find someone we can inspire&lt;/div&gt;&lt;div&gt; * The teacher benefits as well as the student.  Building the community strengthens us.&lt;/div&gt;&lt;div&gt; * Competition&lt;/div&gt;&lt;div&gt; * We're competing for the same talent and sometimes project.  But really we're collaborating.&lt;/div&gt;&lt;div&gt; * See life as more than half full.&lt;/div&gt;&lt;div&gt; * Craftsman swap - competing consulting companies swapped developers for a week.  They learned a lot from each other.  This has been catching on.&lt;/div&gt;&lt;div&gt; * Obie: we are competing against consulting shops outside our community.&lt;/div&gt;&lt;div&gt; * Solidarity - So we can all grow and all improve.&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;One question was raised: how can we influence other software communities.  For example, how could be influence a badly-run Java shop?&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;CJ makes me want to move to Sweden.  ;-)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Automated Acceptance Testing, The Vietnam of Test Driven Development&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Paul Wilson discussed how being unclear about the role and intent of different test strategies can get your development efforts bogged down in a never-ending slog of developing tests that don't really do you any good.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;He focused on acceptance testing, which I realized I had confused w/ end-to-end testing, system testing or integration testing.  They are not the same.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Acceptance specifications are a tool to flesh out unclear business requirements, and acceptance tests verify that the acceptance specifications are implemented.  Hence, the acceptance test is built for the stake-holder and the terminology should reflect his vocabulary.  Phrasing it in UI terms is unnecessary unless the UI is part of the acceptance specification itself; many times it's business rules.  Hence test wherever the acceptance criteria are specified.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Matz's Keynote&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I didn't take notes on Matz's presentation; rather I just listened.  He talked about some upcoming features in Ruby 2.0: mainly features to reduce risk in monkey patching.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;He also talked about "Rite" (Ruby Light) for embedded systems.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1121966792426977205-7738190003723231305?l=oldfartdeveloper.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oldfartdeveloper.blogspot.com/feeds/7738190003723231305/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://oldfartdeveloper.blogspot.com/2010/11/friday-rubyconf-notes.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1121966792426977205/posts/default/7738190003723231305'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1121966792426977205/posts/default/7738190003723231305'/><link rel='alternate' type='text/html' href='http://oldfartdeveloper.blogspot.com/2010/11/friday-rubyconf-notes.html' title='Friday Rubyconf Notes'/><author><name>OldFartDeveloper</name><uri>http://www.blogger.com/profile/02037828059640161019</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1121966792426977205.post-721080055595006404</id><published>2010-11-13T15:40:00.000-08:00</published><updated>2010-11-15T22:37:53.236-08:00</updated><title type='text'>Thursday Rubyconf Notes</title><content type='html'>w00t!  My first Rubyconf!  My testimony of this great event.  Today: Rubyconf's first day:&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Opening Keynote by Dave Thomas&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I didn't take notes on this; just listened.  Dave went thru the history of his involvement w/ Ruby, the books and how it grew beyond his wildest expectations.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;His last part touched me the most: find someone and mentor them into the Ruby community.  His comments would have more meaning to me as the conference unfolded.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Debugging Ruby Systems by Aman Gupta&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;Aman described all the "heavy hitting" tools to use when the problem lies outside of using console or irb to figure out what's going on:&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;lsof&lt;/li&gt;&lt;li&gt;strace - linux only - trace system calls and signals&lt;/li&gt;&lt;li&gt;tcpdump - dump traffic on a network - use wireshark for decomposing results&lt;/li&gt;&lt;li&gt;perftools - google's performance tools&lt;/li&gt;&lt;li&gt;cpuprofiler&lt;/li&gt;&lt;li&gt;perftools.rb (available on github)&lt;/li&gt;&lt;li&gt;rack-perftools - rack middleware for prftools.rb&lt;/li&gt;&lt;li&gt;ltrace - trace library calls.  Is presently unable to trace into shared libraries; ltrace/libdl will fix this.&lt;/li&gt;&lt;li&gt;gdb - the GNU debugger&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;What I would find out later is the attempt to integrate what these tools do in one application.  But these were good; sometimes I've used one or another but it was helpful to have the entire selection explained again.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;The Polite Programmer's Guide to Ruby Etiquette&lt;/b&gt;&lt;/div&gt;&lt;div&gt;by Jim Weirich, Chris Nelson, and Ed Sumerfield&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Basically, how to not break others' code when you use 'method_missing' and similar powerful Ruby features.&lt;/div&gt;&lt;div&gt;&lt;ol&gt;&lt;li&gt;When using &lt;span class="Apple-style-span" &gt;method_missing&lt;/span&gt;, delegate what you don't handle to &lt;b&gt;super&lt;/b&gt;.&lt;/li&gt;&lt;li&gt;Beware there are several "hook" methods:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;span class="Apple-style-span" &gt;method_missing&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" &gt;constant_missing&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;i&gt;etc&lt;/i&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/li&gt;&lt;li&gt;When using &lt;span class="Apple-style-span" &gt;method_missing&lt;/span&gt;, don't forget to handle &lt;span class="Apple-style-span" &gt;responds_to&lt;/span&gt; as well.&lt;/li&gt;&lt;li&gt;When publishing a gem, don't forget to put that gem's dependencies in the gem description file.  There is now a feature in the description file to also specify additional gems depended upon only during development.&lt;/li&gt;&lt;/ol&gt;&lt;b&gt;MetricFu, a code analysis tool&lt;/b&gt;&lt;/div&gt;&lt;div&gt;A static checking toolset.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;There are quite a few independent software packages covering different metrics:&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;Flog&lt;/b&gt; reports.  Measures complexity.  Also top 5% complex ones.&lt;/li&gt;&lt;li&gt;&lt;b&gt;RCov&lt;/b&gt;.  code coverage.  What lines in your code has been executed by tests.&lt;/li&gt;&lt;li&gt;&lt;b&gt;Reek&lt;/b&gt;: bad naming&lt;/li&gt;&lt;li&gt;&lt;b&gt;Play&lt;/b&gt;: copy-paste detection.  Is fairly good at&lt;/li&gt;&lt;li&gt;&lt;b&gt;Saikuro&lt;/b&gt; - cyclosomatic complexity.  Covers branching complexity&lt;/li&gt;&lt;li&gt;&lt;b&gt;Source&lt;/b&gt; - Source Control Churn.&lt;/li&gt;&lt;li&gt;&lt;b&gt;Roodi&lt;/b&gt;: Tries to find definite code design.&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;That's quite a few different outputs to wade through.  MetricFu organizes all output in one graph per method.  Hence, MetricFu is based upon Caliper and accomplishes the "unification" of static metric output on a per method basis.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;ZOMG - Why Is This Code So Slow?&lt;/b&gt;&lt;/div&gt;&lt;div&gt;Aaron Patterson put on a performance that will be a classic video to watch in coming years.  In a very humorous way, he explored a Rails 3 anomaly that we experienced ourselves, a mysterious and significant ActiveRecord performance slowdown.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;In telling it like a detective story, Aaron walks us through his motivations and thinking in&lt;/div&gt;&lt;div&gt;&lt;ol&gt;&lt;li&gt;Discovering the problem&lt;/li&gt;&lt;li&gt;Deciding that it's worth his time to fix it.&lt;/li&gt;&lt;li&gt;Understanding the problem&lt;/li&gt;&lt;li&gt;Fixing the problem&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;Of course it was not that straightforward.  Aaron realizes that understanding the problem will probably take MUCH more time than he wants to invest, so he goes through all the "standard optimization" stuff and gets some benefit.  But, the fundamental problem remains the same: the speed slows down as the square of the number of terms in the query.&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Finally, he breaks down and decides to work to understand the problem.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;He spends 3 weeks (or was it 6) in just this exercise.  An extensive part of his education comes from automated benchmarking; don't leave home without one.  Once Aaron truly understands the code, he realizes some design that will have to be changed.  I.e. a rewrite.  So he does.  At the end, all of the lost time is recovered and then some.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Along the way I "relearned" some computer engineering fundamentals and had was thoroughly entertained as well:  Benchmarking.  Diagrams that describe how the code is organized.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;My takeaway is that Aaron reminded me that tough problems require a plan of action that almost always requires an extensive time period to study and understand the code causing the problem.  This can be hard to choose when you're in a tough constrained time box.  I have to continually "check my footing" before I jump to conclusions about the cause of a problem and attempt a solution before I really understand the problem.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Oh, and checkout graphviz.org for a great free diagramming tool.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;It's Time for a Ruby Editor&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;This talk introduces &lt;b&gt;RedCar&lt;/b&gt;, a recent Ruby-implemented editor.  Why?&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Integration - Syntax analysis is easier&lt;/li&gt;&lt;li&gt;Convenient - Can extend easier&lt;/li&gt;&lt;li&gt;Fun - Not as much a language curve&lt;/li&gt;&lt;li&gt;Power - API not limited by&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;A demo showed examples of the above.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Takeaway: very interesting.  I'm still fantasizing about pairing RedCar with Rubinious as the foundation of a truly impressive Ruby IDE.  ;-)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Maintaining Balance While Reducing Duplication&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;David Chelimsky cited chapter-and-verse about the evils of duplication code.  That being said, he showed how to remove duplication thoughtfully, that is, without breaking it or making it hard to read.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The guiding principal is that removing duplication should improve code clarity, not obscure it.  It therefore helps to remember that DRY calls for the removal of duplicated functionality, not just the minimization of keystrokes.  This is so that functionality can be changed in once place.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Another way to look at it is that every piece of knowledge should have a signle unambiguous authoritative representation.  Always consider purpose and intention.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Improving DRY means adding levels of indirection.  Always make sure that the code depends on other code that is not likely to change.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Suggestions for Making your "DRY-improvements" better:&lt;/div&gt;&lt;div&gt;&lt;ol&gt;&lt;li&gt; Depend on things that are less likely to change.&lt;/li&gt;&lt;li&gt;The problem is not that you have to change code in two places.  The real problem is that you don't know you need to change it in two places.&lt;/li&gt;&lt;li&gt;Duplication is not always obvious.  This is especially pernicious in rspec.&lt;/li&gt;&lt;li&gt;Duplication often results from "feature envy".&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;&lt;b&gt;Knocking Ruby's Date and DateTime Performance Out of the Park with home_run&lt;/b&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Jeremy Evans discusses how the real problem with Date and DateTime performance os the powerful but slow date parsing for date strings.  You can improve this if you limit the parsing options.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1121966792426977205-721080055595006404?l=oldfartdeveloper.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oldfartdeveloper.blogspot.com/feeds/721080055595006404/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://oldfartdeveloper.blogspot.com/2010/11/wednesday-rubyconf-notes.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1121966792426977205/posts/default/721080055595006404'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1121966792426977205/posts/default/721080055595006404'/><link rel='alternate' type='text/html' href='http://oldfartdeveloper.blogspot.com/2010/11/wednesday-rubyconf-notes.html' title='Thursday Rubyconf Notes'/><author><name>OldFartDeveloper</name><uri>http://www.blogger.com/profile/02037828059640161019</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1121966792426977205.post-875034912433142578</id><published>2010-02-26T11:32:00.000-08:00</published><updated>2010-02-26T11:34:15.395-08:00</updated><title type='text'>OCRuby Feb 26, 2000 meeting minutes</title><content type='html'>&lt;span class="Apple-style-span" style="font-family: Times; font-size: medium; "&gt;&lt;div style="font: normal normal normal small/normal georgia; border-top-style: none; border-right-style: none; border-bottom-style: none; border-left-style: none; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: white; margin-top: 3px; margin-right: 3px; margin-bottom: 3px; margin-left: 3px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; background-position: initial initial; background-repeat: initial initial; "&gt;&lt;div&gt;Thought I'd post this here since the OCRuby group submission is moderated.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;This is mainly interesting for the Mongo DB presentation by Tommy Chheng.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Attendees&lt;/b&gt;:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Dash&lt;/div&gt;&lt;div&gt;Tina&lt;/div&gt;&lt;div&gt;Michael Hartl&lt;/div&gt;&lt;div&gt;Tommy Chheng&lt;/div&gt;&lt;div&gt;Scott Smith&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Michael has published 7 chapters of his electronic book at &lt;a href="http://railstutorial.org"&gt;railstutorial.org&lt;/a&gt; &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Tommy: Whither Mongo DB for Natural Development&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Used by:&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;github&lt;/li&gt;&lt;li&gt;EA&lt;/li&gt;&lt;li&gt;The New York Times&lt;/li&gt;&lt;li&gt;sourceforge&lt;/li&gt;&lt;li&gt;The Business Insider&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;The above are "big" sites.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Why?&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;NoSQL trend?&lt;/li&gt;&lt;li&gt;Scalability?&lt;/li&gt;&lt;li&gt;Natural Development!&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;Compare&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;SQL fixed schema&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Data model Rows/Tables&lt;/li&gt;&lt;li&gt;Data Types Primitives&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;MongoDB Dynamic&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;BSON Documents/Collections&lt;/li&gt;&lt;li&gt;Primitives+Arrays/Hashes&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;Records vs Documents&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;SQL&lt;/div&gt;&lt;div&gt;3 tables&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Documents&lt;/li&gt;&lt;li&gt;Revisions&lt;/li&gt;&lt;li&gt;Tags&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;MongoDB&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;document = {title:...}  (reads as Javascript code)&lt;/li&gt;&lt;li&gt;BSON data structure naturally maps to most programming languages hash object.&lt;/li&gt;&lt;li&gt;ORM can just be a thin layer.&lt;/li&gt;&lt;li&gt;Can debug Mongo a lot easier.&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Mongo Install&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.mongodb.org/display/DOCS/Quickstart"&gt;http://www.mongodb.org/display/DOCS/Quickstart&lt;/a&gt; &lt;/li&gt;&lt;li&gt;Chef recipe available&lt;/li&gt;&lt;ul&gt;&lt;li&gt; &lt;a href="http://github.com/schisamo/"&gt;http://github.com/schisamo/&lt;/a&gt; &lt;/li&gt;&lt;li&gt; chef_cookbooks/&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;Start server: ./mongod&lt;/li&gt;&lt;li&gt;Run console: mongo&lt;/li&gt;&lt;li&gt;Works with javascript as the query language&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;How to use in Ruby?&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Easy to use in Rails or Sinatra&lt;/div&gt;&lt;div&gt;2 gems&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;mongo+mongo_ext gem&lt;/li&gt;&lt;li&gt;mongo_mapper gem&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://groups.google.com/group/mongodb-user"&gt;http://groups.google.com/group/mongodb-user&lt;/a&gt; &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;MongoMapper Models&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;No Migrations!&lt;/li&gt;&lt;li&gt;AR Validations&lt;/li&gt;&lt;li&gt;AR Callbacks&lt;/li&gt;&lt;li&gt;Testing using Facory Girl&lt;/li&gt;&lt;li&gt;Rails 3?&lt;/li&gt;&lt;ul&gt;&lt;li&gt; fork which uses ActiveModel, see mailinglist&lt;/li&gt;&lt;li&gt; is complete but not merged in yet.&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;MongoMapper Model&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;(sample code)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;CouchDB or MongoDB?&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;CouchDB&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;One big database&lt;/li&gt;&lt;li&gt;HTTP REST&lt;/li&gt;&lt;li&gt;Find by id ma/reduce JS functions&lt;/li&gt;&lt;li&gt;MVCC&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;MongoDB&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Many collections&lt;/li&gt;&lt;li&gt;sockets&lt;/li&gt;&lt;li&gt;Find by id - dynamic JS queries&lt;/li&gt;&lt;li&gt;Update in place&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;MVCC - updates by making new version copy; good for data safety.&lt;/div&gt;&lt;div&gt;Update in place is a lot faster&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;MongoDB by default writes to disk in batches&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Limitations&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Memory Mapped file:&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt; 32-bit 4GB limit, use 64-bit&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;Atomic updates only at document level&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt; Solve by nesting related data in document&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;MongoDB lacks:&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt; transactions&lt;/li&gt;&lt;li&gt; CouchDB-style MVCC revisioning&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://www.mongodb.org/display/DOCS/Atomic"&gt;http://www.mongodb.org/display/DOCS/Atomic&lt;/a&gt; &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Author&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Blog &lt;a href="http://tommy.chheng.com"&gt;http://tommy.chheng.com&lt;/a&gt; &lt;/div&gt;&lt;div&gt;Twitter @tommychheng&lt;/div&gt;&lt;div&gt;Side project: &lt;a href="http://nextsprocket.com/"&gt;http://nextsprocket.com/&lt;/a&gt; &lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt; using mongoDB + mongo_mapper!&lt;/li&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/ul&gt;&lt;/div&gt;&lt;/div&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1121966792426977205-875034912433142578?l=oldfartdeveloper.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oldfartdeveloper.blogspot.com/feeds/875034912433142578/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://oldfartdeveloper.blogspot.com/2010/02/ocruby-feb-26-2000-meeting-minutes.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1121966792426977205/posts/default/875034912433142578'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1121966792426977205/posts/default/875034912433142578'/><link rel='alternate' type='text/html' href='http://oldfartdeveloper.blogspot.com/2010/02/ocruby-feb-26-2000-meeting-minutes.html' title='OCRuby Feb 26, 2000 meeting minutes'/><author><name>OldFartDeveloper</name><uri>http://www.blogger.com/profile/02037828059640161019</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1121966792426977205.post-4546717781465497562</id><published>2010-02-25T07:41:00.000-08:00</published><updated>2010-02-25T07:50:07.842-08:00</updated><title type='text'>Scenes from LA Ruby Conference - 2010 - Announcements</title><content type='html'>&lt;div&gt;&lt;b&gt;Take Away&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;Continues to be lots of interest and activity in Ruby.  Conferences in San Francisco and Phoenix announced for this year.  Jobs are available, especially in San Francisco.&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Job Available&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Product Manager - Slingshot Labs, incubator for News Corporation&lt;/div&gt;&lt;div&gt;Looking for a senior Rails developer.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Ruby Conference&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;Josh Susser and Jim Myer&lt;/div&gt;&lt;div&gt;Golden Gate Ruby Conference&lt;/div&gt;&lt;div&gt;Announce Fall conference - Sept 10,11 2010 (fri/sat)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Primary Sponsor for Today's Conference&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;ATT Interactive&lt;/div&gt;&lt;div&gt;Buzz.com - social website.  Have t-shirts.  NOthing to do w/ Google&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Ruby Conference&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;Derek w/ Sunnyconf in Phoenix&lt;/div&gt;&lt;div&gt;Sept 25.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;LA Ruby Monthly Meetings&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;Alf Mcgollough 2nd Thursday of each month.&lt;/div&gt;&lt;div&gt;Meetup.com/laruby.&lt;/div&gt;&lt;div&gt;Looking for west side venue that can handle 50 people.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Job Available&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;AT&amp;amp;T interactive hiring&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Ruby and data skills&lt;/li&gt;&lt;li&gt;Ruby and web and UI skills&lt;/li&gt;&lt;li&gt;Oracle/Ruby&lt;/li&gt;&lt;li&gt;Service type work in Ruby/Rails&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Job Available&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;NextspRocket.com&lt;/div&gt;&lt;div&gt;Place to pay money to fix open source bugs.&lt;/div&gt;&lt;div&gt;Check out the site.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Ron Evans - thanks to organizers&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1121966792426977205-4546717781465497562?l=oldfartdeveloper.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oldfartdeveloper.blogspot.com/feeds/4546717781465497562/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://oldfartdeveloper.blogspot.com/2010/02/scenes-from-la-ruby-conference-2010_3032.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1121966792426977205/posts/default/4546717781465497562'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1121966792426977205/posts/default/4546717781465497562'/><link rel='alternate' type='text/html' href='http://oldfartdeveloper.blogspot.com/2010/02/scenes-from-la-ruby-conference-2010_3032.html' title='Scenes from LA Ruby Conference - 2010 - Announcements'/><author><name>OldFartDeveloper</name><uri>http://www.blogger.com/profile/02037828059640161019</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1121966792426977205.post-225341979591675406</id><published>2010-02-25T07:35:00.000-08:00</published><updated>2010-02-25T07:54:05.739-08:00</updated><title type='text'>Scenes from LA Ruby Conference - 2010 - Large Databases</title><content type='html'>&lt;div&gt;&lt;b&gt;Take Away&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;Large databases are very sensitive to mistakes that don't affect smaller databases.  Anything that causes scanning of many records will not only run slowly, it frequently causes the entire web site to go down.  Prevent scanning by careful application of indexes and avoiding data transformation operations when querying.&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Introduction&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;Tim Morgan - scribd&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;We learn rails when we break it&lt;/li&gt;&lt;li&gt;scribd is a really large web site (Amazon S3)&lt;/li&gt;&lt;li&gt;Large sites are easy to break.&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Infamous mistakes&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;These are the ones you remember for a long time (along w/ everyone else).&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Causes&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Almost always problems of scale.&lt;/li&gt;&lt;li&gt;Almost always about how Rails interfaces w/ database.&lt;/li&gt;&lt;li&gt;Postgres/Oracle, but MySql is what is being used.&lt;/li&gt;&lt;li&gt;If you add something that is a SQL request, look at the SQL itself.&lt;/li&gt;&lt;li&gt;Always understand the queries your code is generating.  Look at the query log.&lt;/li&gt;&lt;li&gt;Test with a heavily populated database.  If you find it sucks, think what your customers think.&lt;/li&gt;&lt;li&gt;Pay close attention to your indexes.&lt;/li&gt;&lt;li&gt;MySql and Postgres have very different implementations of bow their indexes work.&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;The problem with find_in_batches.&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Doing it using User.all.each is going to be very slow.&lt;/li&gt;&lt;li&gt;Better to use find_each; uses batch for x items per request.&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;Composite primary keys?  Use composite keys plugin.&lt;/div&gt;&lt;div&gt;http://gist.github.com/105318  is a monkey-patch&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;validates_uniqueness_of&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;:case_sensitive =&gt; false&lt;/li&gt;&lt;li&gt;took site down.&lt;/li&gt;&lt;li&gt;problem was SQL lower(login_name)&lt;/li&gt;&lt;li&gt;In mysql, make the case-insensitive column binary.&lt;/li&gt;&lt;li&gt;solution http://gist.github.com/105367&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;problem with delete and destroy&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;caused by misleading Rails documentation&lt;/li&gt;&lt;li&gt;delete_all is faster than destroy because it doesn't use hooks.&lt;/li&gt;&lt;li&gt;before_destroy positioning is important, must be placed before any associations.&lt;/li&gt;&lt;li&gt;delete_all() doesn't remove the link table record itself; it just sets the id column to nil.&lt;/li&gt;&lt;li&gt;Solution: use delete_all&lt;/li&gt;&lt;li&gt;CategoryMembership.delete_all :category_id =&gt; self.id&lt;/li&gt;&lt;li&gt;Fixed in Rails 3.0&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;problem with indexes&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Think about indexes early.&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;mysql uses only one index at a time, so you may have to figure out an index on multiple columns.&lt;/li&gt;&lt;li&gt;you may have to tell MySql which index to use:&lt;/li&gt;&lt;li&gt;use index (index_documents_on_user_id).&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Conclusions&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Always understand the queries your code is generating.&lt;/li&gt;&lt;li&gt;Test with a heavily populated database.&lt;/li&gt;&lt;li&gt;Pay close attention to your indexes.&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1121966792426977205-225341979591675406?l=oldfartdeveloper.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oldfartdeveloper.blogspot.com/feeds/225341979591675406/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://oldfartdeveloper.blogspot.com/2010/02/scenes-from-la-ruby-conference-2010_1569.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1121966792426977205/posts/default/225341979591675406'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1121966792426977205/posts/default/225341979591675406'/><link rel='alternate' type='text/html' href='http://oldfartdeveloper.blogspot.com/2010/02/scenes-from-la-ruby-conference-2010_1569.html' title='Scenes from LA Ruby Conference - 2010 - Large Databases'/><author><name>OldFartDeveloper</name><uri>http://www.blogger.com/profile/02037828059640161019</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1121966792426977205.post-5027426074968203313</id><published>2010-02-25T07:24:00.000-08:00</published><updated>2010-02-25T07:56:28.054-08:00</updated><title type='text'>Scenes from LA Ruby Conference - 2010 - Data Structures</title><content type='html'>&lt;div&gt;&lt;b&gt;Take Away&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;Fascinating talk on using probabilistic data structures to save oodles of search time if a limited number of false indicators can be tolerated.&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Introduction&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Tyler McMullen - Scribd&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Different Data Structures&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Why?&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Speed&lt;/li&gt;&lt;li&gt;Memory&lt;/li&gt;&lt;li&gt;Clarity&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;Some very interesting structures&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Bloom Filter&lt;/li&gt;&lt;li&gt;BK-tree&lt;/li&gt;&lt;li&gt;Splay Tree&lt;/li&gt;&lt;li&gt;Trie&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Bloom Filters&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Tests for existence in a set&lt;/li&gt;&lt;li&gt;Probabilistic&lt;/li&gt;&lt;li&gt;Minimal memory use&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;Example: 100million strings in a set&lt;/div&gt;&lt;div&gt;Tradition set: 10gb minimum vs 280mb&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;How does it work?&lt;/div&gt;&lt;div&gt;Binary sequence.  Uses hash&lt;/div&gt;&lt;div&gt;In places where occasional false positives are okay&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;BK-tree&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;find items within a distance of a target&lt;/div&gt;&lt;div&gt;reduces search space&lt;/div&gt;&lt;div&gt;works inside a metric space&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Triangle Inequality&lt;/div&gt;&lt;div&gt;If we know the distace between 2 of 3 points, then we can make assumptions about the distance between the remaining "unmeasured" two points.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Uses:&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Most often used for spelling corrections&lt;/li&gt;&lt;li&gt;Work in any metric space&lt;/li&gt;&lt;li&gt;Reduce the search space.&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Splay Tree&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal; "&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Self-blancing binary tree&lt;/li&gt;&lt;li&gt;Brings most accessed items toward root&lt;/li&gt;&lt;li&gt;The more uneven the access pattern, the better the performance.&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;div&gt;Good for caches, garbage collectors, etc.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Trie&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;/b&gt; (pronounced "try")&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;O(1) (order 1) on lookup, add, removal&lt;/li&gt;&lt;li&gt;Ordered traversals&lt;/li&gt;&lt;li&gt;Prefix matchine&lt;/li&gt;&lt;li&gt;Excellent memory management.&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Useful as an autocompleter.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Interesting, he implemented this as a rack filter.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1121966792426977205-5027426074968203313?l=oldfartdeveloper.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oldfartdeveloper.blogspot.com/feeds/5027426074968203313/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://oldfartdeveloper.blogspot.com/2010/02/scenes-from-la-ruby-conference-2010_2384.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1121966792426977205/posts/default/5027426074968203313'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1121966792426977205/posts/default/5027426074968203313'/><link rel='alternate' type='text/html' href='http://oldfartdeveloper.blogspot.com/2010/02/scenes-from-la-ruby-conference-2010_2384.html' title='Scenes from LA Ruby Conference - 2010 - Data Structures'/><author><name>OldFartDeveloper</name><uri>http://www.blogger.com/profile/02037828059640161019</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1121966792426977205.post-5167729232389949033</id><published>2010-02-25T07:15:00.000-08:00</published><updated>2010-02-25T08:06:33.655-08:00</updated><title type='text'>Scenes from LA Ruby Conference - 2010 -Teaching Ruby to Kids</title><content type='html'>&lt;div&gt;&lt;b&gt;Take Away&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;It's great to see Sarah evangelizing software training to kids.  I've thought about it for a long time and her presentation will spur me to do it.  Very good hints on how to do it so that both you and your students both thoroughly enjoy it and become better practitioners.&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Introduction&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Sarah Mei - Teaching Ruby to Kids&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Teaching is her hobby.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Why?&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;Most programming instructors = FAIL&lt;/div&gt;&lt;div&gt;Teacher needs to be a coder.&lt;/div&gt;&lt;div&gt;Programming is becoming part of basic literacy.&lt;/div&gt;&lt;div&gt;Why should you teach?&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Rewarding&lt;/li&gt;&lt;li&gt;Teaching leads to learning by the teacher.&lt;/li&gt;&lt;li&gt;Teaching not rocket science.&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;Agile teaching&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;set goals&lt;/li&gt;&lt;li&gt;form a plan but expect to adapt&lt;/li&gt;&lt;li&gt;keep iterations short&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;Set goals&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;specific&lt;/li&gt;&lt;li&gt;imediate,&lt;/li&gt;&lt;li&gt;measurable&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;Form a plan&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;What do I start with?&lt;/li&gt;&lt;li&gt;Keep your goals in mind.&lt;/li&gt;&lt;li&gt;Software Teaching Tools:&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Shoes&lt;/li&gt;&lt;li&gt;Hackety Hack&lt;/li&gt;&lt;li&gt;Small Ruby&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;Theme&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Kids love anything visual&lt;/li&gt;&lt;li&gt;Anything interactive&lt;/li&gt;&lt;li&gt;irb: compelling for kids (maybe)&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;Plan&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Install all the tools you might use on all the computers the kids have access to.&lt;/li&gt;&lt;li&gt;start small&lt;/li&gt;&lt;li&gt;Use the internet.&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;Short iterations&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Your "lesson plan" should be a series of very small steps.&lt;/li&gt;&lt;li&gt;15 minutes or less&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;Listen to the customer&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Follow tangents!&lt;/li&gt;&lt;li&gt;don't stick to a plan because it's the plan.&lt;/li&gt;&lt;li&gt;Don't worry about "finishing"&lt;/li&gt;&lt;li&gt;Look for teachable moments.&lt;/li&gt;&lt;li&gt;Look for signs they've turned off&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;"Ruby: the programming language for extroverts"&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Deploy continuously&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Do it often, practice&lt;/li&gt;&lt;li&gt;Teaching is a learned skill.&lt;/li&gt;&lt;li&gt;Take all opportunities you can to teach.&lt;/li&gt;&lt;li&gt;talks at your local meetup&lt;/li&gt;&lt;li&gt;pair programming&lt;/li&gt;&lt;li&gt;summer camps, etc, need volunteers&lt;/li&gt;&lt;li&gt;National Lab Day&lt;/li&gt;&lt;li&gt;In SF, I always need teachers for intro workshops.&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;Expect some things you try to fall flat.&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Some students won't engage&lt;/li&gt;&lt;li&gt;Keep at it.&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Summary:&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;You should teach&lt;/li&gt;&lt;li&gt;You can teach&lt;/li&gt;&lt;li&gt;Agile is form more than just development.&lt;/li&gt;&lt;li&gt;Practice.&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;Ruby is a great first language.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;For really young kids:&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Scratch&lt;/li&gt;&lt;li&gt;Kodu (Microsoft)&lt;/li&gt;&lt;li&gt;ISTE has curriculum for elementary school.&lt;/li&gt;&lt;li&gt;cs-unplugged (a web site)&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;web-kit and javascript.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;These are drag-and-drop environments.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1121966792426977205-5167729232389949033?l=oldfartdeveloper.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oldfartdeveloper.blogspot.com/feeds/5167729232389949033/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://oldfartdeveloper.blogspot.com/2010/02/scenes-from-la-ruby-conference-2010_25.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1121966792426977205/posts/default/5167729232389949033'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1121966792426977205/posts/default/5167729232389949033'/><link rel='alternate' type='text/html' href='http://oldfartdeveloper.blogspot.com/2010/02/scenes-from-la-ruby-conference-2010_25.html' title='Scenes from LA Ruby Conference - 2010 -Teaching Ruby to Kids'/><author><name>OldFartDeveloper</name><uri>http://www.blogger.com/profile/02037828059640161019</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1121966792426977205.post-2371457466687894829</id><published>2010-02-25T07:10:00.000-08:00</published><updated>2010-02-25T08:08:50.043-08:00</updated><title type='text'>Scenes from LA Ruby Conference - 2010 - Web App Performance Monitoring</title><content type='html'>&lt;div&gt;&lt;b&gt;Take Away&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;Bjorn showed New Relic in action with how it monitors web sites and identifies issues early and clearly.  Unfortunately my blog entry here fails to capture much of it as it was mostly demo.  Worth looking into.&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Introduction&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Bjorn Freeman-Benson - New Relic&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Building the First Successful Human-Powered Airplane&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;Paul MacCready&lt;/div&gt;&lt;div&gt;1977 - gossamer condor&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Why did Paul succeed?&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;How to make the lightest possible airplane as quickly as possible?  Ended up crashing a lot.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Could repair in less than 12 hours.  Others crash repairs 6 months.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Macready team could iterate faster.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Applied to Software Development&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Presenter wants to be that agile.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;How he uses the New Relic to do that.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;larubyconf&lt;/div&gt;&lt;div&gt;https://rpm.neweelic.com&lt;/div&gt;&lt;div&gt;30 days of RPM Gold for free.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1121966792426977205-2371457466687894829?l=oldfartdeveloper.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oldfartdeveloper.blogspot.com/feeds/2371457466687894829/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://oldfartdeveloper.blogspot.com/2010/02/scenes-from-la-ruby-conference-2010-web.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1121966792426977205/posts/default/2371457466687894829'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1121966792426977205/posts/default/2371457466687894829'/><link rel='alternate' type='text/html' href='http://oldfartdeveloper.blogspot.com/2010/02/scenes-from-la-ruby-conference-2010-web.html' title='Scenes from LA Ruby Conference - 2010 - Web App Performance Monitoring'/><author><name>OldFartDeveloper</name><uri>http://www.blogger.com/profile/02037828059640161019</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1121966792426977205.post-2424678560337914163</id><published>2010-02-22T19:34:00.000-08:00</published><updated>2010-02-25T08:11:22.228-08:00</updated><title type='text'>Scenes from LA Ruby Conference - 2010 -Civic Hacking</title><content type='html'>&lt;div&gt;&lt;b&gt;Take Away&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;Luigi showed how government has lots of useful data but few tools to make sense of the data.  Here's where software developers can make a contribution: to build free tools to make this data more accessible.  He talked about the various opportunities and why accomplishing them would make a real difference.&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Introduction&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Luigi Montanez&lt;/div&gt;&lt;div&gt;luigi@sunlightfoundation.com&lt;/div&gt;&lt;div&gt;&lt;div&gt;@LuigiMontanez&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;Purpose: get government to open up its data and provide software tools to comprehend it.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Over a thousand people in their effort.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;16-paid staff.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;"D.C. is Hollywood for ugly people."&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Guiding principles:&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Electoral Politics no&lt;/li&gt;&lt;li&gt;Governance yes&lt;/li&gt;&lt;li&gt;Open source&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Civic Side Projects&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;Purposes/Challenges&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Challenging entrenched bureacracies&lt;/li&gt;&lt;li&gt;Open source + Open data = better Government&lt;/li&gt;&lt;li&gt;Government opens data; they write apps aeround it.&lt;/li&gt;&lt;li&gt;Government as a wholesaler, not retailer.&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;Sunlight Labs API&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Bio and contact info for elective office holders.&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;OpenSecrets.org &lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Contributions&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Example: how much health insurance money has been spent politically and how.&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;GovTrack.us - Bills and Vote Records&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;MAPLight.org - Vote Influence&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;How representative voted correlated w/ donations.&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;Code for America&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Will choose 5 cities&lt;/li&gt;&lt;li&gt;5 developers will be supplied to each of those cities.&lt;/li&gt;&lt;li&gt;Modeled after Teach for America program.&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;Getting Involved.&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;groups.google.com/group/sunlightlabs&lt;/li&gt;&lt;li&gt;#transparency on Freenode&lt;/li&gt;&lt;li&gt;github &lt;i&gt;didn't get actual repository&lt;/i&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;Benefits:&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Enhance your skillset&lt;/li&gt;&lt;li&gt;Low risk, high reward&lt;/li&gt;&lt;li&gt;Another testing framework?  Really?&lt;/li&gt;&lt;li&gt;Local/state govts. an untapped market&lt;/li&gt;&lt;li&gt;Solve a hard problem.&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;TED Talk&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;David Cameron: in a Ted talk "The next age of government"&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1121966792426977205-2424678560337914163?l=oldfartdeveloper.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oldfartdeveloper.blogspot.com/feeds/2424678560337914163/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://oldfartdeveloper.blogspot.com/2010/02/civic-hacking.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1121966792426977205/posts/default/2424678560337914163'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1121966792426977205/posts/default/2424678560337914163'/><link rel='alternate' type='text/html' href='http://oldfartdeveloper.blogspot.com/2010/02/civic-hacking.html' title='Scenes from LA Ruby Conference - 2010 -Civic Hacking'/><author><name>OldFartDeveloper</name><uri>http://www.blogger.com/profile/02037828059640161019</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1121966792426977205.post-3653522945134624700</id><published>2010-02-22T19:29:00.000-08:00</published><updated>2010-02-25T08:15:01.512-08:00</updated><title type='text'>Scenes from LA Ruby Conference - 2010 - Garbage Collection and the Ruby Heap</title><content type='html'>&lt;div&gt;&lt;b&gt;Take Away&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;The traditional Ruby engine is paranoid about memory management because it has to run in so many disparate environments.  This negatively impacts the garbage collection performance.  If you know or can define where your Ruby installation will run, you can do optimizations that will greatly speed this process.  Indeed, this is one of the benefits of Ruby Enterprise, and Ruby 1.9 accomplishes a subset of the optimizations discussed here.&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal; "&gt;&lt;div&gt;&lt;i&gt;Note: this session went extremely fast and I was not able to collect the notes as I wanted.&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/div&gt;&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Introduction&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-style: normal;"&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;Joe Damato and Aman Gupta&lt;/div&gt;&lt;div&gt;@joedamato     @tmm1&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Garbage Collection and the Ruby Heap&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Why GC&lt;/li&gt;&lt;li&gt;Ruby is simple and elegant&lt;/li&gt;&lt;li&gt;GC makes life easier.&lt;/li&gt;&lt;li&gt;No more memory management&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Menory management&lt;/li&gt;&lt;li&gt;memory leaks&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;MRI&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Always allocated on heap&lt;/li&gt;&lt;li&gt;Fixed size&lt;/li&gt;&lt;li&gt;sizeof(struct RVALUE) = 40&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;See their site to see how to optimize the GC.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Ruby memory leaks:&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;These are reference leaks&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;memprof - replacement for gdb.rb and bleak_house&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1121966792426977205-3653522945134624700?l=oldfartdeveloper.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oldfartdeveloper.blogspot.com/feeds/3653522945134624700/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://oldfartdeveloper.blogspot.com/2010/02/garbage-collection-and-ruby-heap.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1121966792426977205/posts/default/3653522945134624700'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1121966792426977205/posts/default/3653522945134624700'/><link rel='alternate' type='text/html' href='http://oldfartdeveloper.blogspot.com/2010/02/garbage-collection-and-ruby-heap.html' title='Scenes from LA Ruby Conference - 2010 - Garbage Collection and the Ruby Heap'/><author><name>OldFartDeveloper</name><uri>http://www.blogger.com/profile/02037828059640161019</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1121966792426977205.post-203362448819731302</id><published>2010-02-22T19:13:00.000-08:00</published><updated>2010-02-25T20:37:24.820-08:00</updated><title type='text'>Scenes from LA Ruby Conference - 2010 - Threads and Processes</title><content type='html'>&lt;div&gt;&lt;b&gt;Take Away&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;Good discussion of the different facilities available to Ruby and the underlying operating system and their tradeoffs.&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Introduction&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Aman Gupta - Joe Damato - Threads&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;http://timetobleed.com Joe's blog.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Fundamentals&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;What is a thread?&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;A thread is just a set of execution state.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Models&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Green threads&lt;/li&gt;&lt;li&gt;Native&lt;/li&gt;&lt;li&gt;Hybrid&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Green 1:N&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Lightweight&lt;/li&gt;&lt;li&gt;Kernel doesn't know they exist&lt;/li&gt;&lt;li&gt;Implementation is in userland.&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;Pros&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Create lots cheaply&lt;/li&gt;&lt;li&gt;Switch them.&lt;/li&gt;&lt;li&gt;Schedule them however you want.&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;Cons&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Main one is that these can switch only between a single Ruby process.&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Native Threads 1:1&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Kernel knows they exist&lt;/li&gt;&lt;li&gt;Some user land code.&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;Pros&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Take advantage of SMP&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Shared memory&lt;/li&gt;&lt;li&gt;Blocking in one thread doesn't block&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;Cons&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;&lt;i&gt;didn't get&lt;/i&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Hybrid Threads (M;N)&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;Pros&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Take advantage of SMP&lt;/li&gt;&lt;li&gt;Cheap setup and teardown&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;Cons&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Need 2 schedulers&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;Ruby 1.9 and Erlang use hybrid threads&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Preemptive Multitasking&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Operating system switches process regardless of process states.&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;Cooperative Multitasking&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;thread gives up voluntarily.&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Fibers&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Tools&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;strace&lt;/li&gt;&lt;li&gt;google-perf&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;lsof - "list of open files" - a utility.  Can also be used to get a list of open sockets.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;strace&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;trace system calls and signals.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Ruby: SIGVTALRM used&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;github.com/ice799/matzruby&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;heap_stcks branch&lt;/li&gt;&lt;li&gt;heap_stacks_186 branch&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;github.com/tmm1/ruby187&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;fibers branch&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1121966792426977205-203362448819731302?l=oldfartdeveloper.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oldfartdeveloper.blogspot.com/feeds/203362448819731302/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://oldfartdeveloper.blogspot.com/2010/02/scenes-from-la-ruby-conference-2010_8260.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1121966792426977205/posts/default/203362448819731302'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1121966792426977205/posts/default/203362448819731302'/><link rel='alternate' type='text/html' href='http://oldfartdeveloper.blogspot.com/2010/02/scenes-from-la-ruby-conference-2010_8260.html' title='Scenes from LA Ruby Conference - 2010 - Threads and Processes'/><author><name>OldFartDeveloper</name><uri>http://www.blogger.com/profile/02037828059640161019</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1121966792426977205.post-6905542819503624219</id><published>2010-02-22T08:14:00.001-08:00</published><updated>2010-02-25T08:29:35.947-08:00</updated><title type='text'>Scenes from LA Ruby Conference - 2010 - The Next 10 Years</title><content type='html'>&lt;div&gt;&lt;b&gt;Take Away&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;A warning that the rate of change in underlying software development paradigms will require new mental approaches to the large software challenges lying ahead of us.  The "algol-based" languages used by the vast majority of developers will yield to more scalable functional languages.&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;In the meantime, continue to grow you skills and constantly learn how to take advantage of tools to get more bang for the time you spend designing and coding.&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt; &lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Introduction&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;A new look at software development - What will the next 10 years bring?&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Dave Astels&lt;/div&gt;&lt;div&gt;Twitter: @dastels&lt;/div&gt;&lt;div&gt;dastels@engineyard.com&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Observations:&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;You're doing it completely wrong.&lt;/li&gt;&lt;li&gt;Software is hard&lt;/li&gt;&lt;li&gt;Software construction is the most complex endeavor ever undertaken by mankind.&lt;/li&gt;&lt;li&gt;The only software that's worth making is software that does something new.&lt;/li&gt;&lt;li&gt;It's only getting (more)...&lt;/li&gt;&lt;ul&gt;&lt;li&gt;more complex&lt;/li&gt;&lt;li&gt;bigger&lt;/li&gt;&lt;li&gt;distributed&lt;/li&gt;&lt;li&gt;parallel&lt;/li&gt;&lt;li&gt;life critical&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;30 years of software&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;think about...&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;popular languages&lt;/li&gt;&lt;li&gt;flavors, blends, derivatives&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Fortran-&gt;Algol 54/58&lt;/li&gt;&lt;li&gt;Lisp 58&lt;/li&gt;&lt;li&gt;Ruby described as new-age lisp.&lt;/li&gt;&lt;li&gt;Smalltalk from lisp from simula&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;Some outliers&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Prolog --&gt; Erlang&lt;/li&gt;&lt;li&gt;ML --&gt; Haskel&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Time for a change?&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Let the computer do more work.&lt;/div&gt;&lt;div&gt;Declarative Languages&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;What you want to do instead of how.&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;Functional Languages&lt;/div&gt;&lt;div&gt;strong type systems&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;language agda&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;Tools that cooperate&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;real-time analysis of our codes.&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;Do more for the developer&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Giving some insight into the code you're writing.&lt;/li&gt;&lt;li&gt;Static analysis&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;Generated test suites&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Identify boundary cases.&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;Runtime analysis&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Will current ideas continue to server us?&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Speaker says NO!&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;evolution/revolution&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;new way of programming&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;We need parallel strategies&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;problem decomposition&lt;/li&gt;&lt;li&gt;data structure design&lt;/li&gt;&lt;ul&gt;&lt;li&gt;distributed&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;algorithmic organization&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;We need:&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;better languages&lt;/li&gt;&lt;li&gt;better tools&lt;/li&gt;&lt;ul&gt;&lt;li&gt;tools that help us.&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;Google's "Go" language&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;everything is parallelized.&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;parallel and distributed baked in&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;that actively prevent bugs&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;closing quotes: (Guy Steele):&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;The bag of programming tricks that has served us for 50 years is the wrong way to think going forward and must be thrown out.&lt;/li&gt;&lt;li&gt;The great tricks of sequential programming don't work.&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Summary&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;It's a parallel world of parallel problems.&lt;/li&gt;&lt;li&gt;Have strategies that assume imperfection.  How do we write code that way?&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1121966792426977205-6905542819503624219?l=oldfartdeveloper.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oldfartdeveloper.blogspot.com/feeds/6905542819503624219/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://oldfartdeveloper.blogspot.com/2010/02/scenes-from-la-ruby-conference-2010_22.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1121966792426977205/posts/default/6905542819503624219'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1121966792426977205/posts/default/6905542819503624219'/><link rel='alternate' type='text/html' href='http://oldfartdeveloper.blogspot.com/2010/02/scenes-from-la-ruby-conference-2010_22.html' title='Scenes from LA Ruby Conference - 2010 - The Next 10 Years'/><author><name>OldFartDeveloper</name><uri>http://www.blogger.com/profile/02037828059640161019</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1121966792426977205.post-5151837758637295086</id><published>2010-02-22T08:04:00.000-08:00</published><updated>2010-02-25T20:40:08.795-08:00</updated><title type='text'>Scenes from LA Ruby Conference - 2010 - Mobile Ruby</title><content type='html'>&lt;h4&gt;Take Away&lt;/h4&gt;&lt;div&gt;&lt;i&gt;Programming for mobile devices is a lot more than adjusting to the smaller screen; there are additional opportunities in the mobile devices themselves: GPS, camera, motion sensors, etc.  However, they have significant challenges: comparatively primitive development environments, and operating systems.  These are discussed along with how HTML 5 and Rhomobile are working towards a single programming API across mobile platforms.&lt;/i&gt;&lt;/div&gt;&lt;h4&gt;Introduction&lt;/h4&gt;&lt;div&gt;This was presented by Sarah Allen of &lt;b&gt;Blazing Cloud&lt;/b&gt; &lt;i&gt;(gotta retrieve the presenter's name)&lt;/i&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Rhomobile framework call "Rhodes"&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Mobile app development sucks:&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Awkward&lt;/li&gt;&lt;li&gt;In some ways is archaic&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Old languages&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;Brand Transcends Platform&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;My brand instead of cell phone brand.  (Do I agree w/ this?).&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Mobile gives you more than desktop:&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Geolocation&lt;/li&gt;&lt;li&gt;Camera&lt;/li&gt;&lt;li&gt;Connected&lt;/li&gt;&lt;li&gt;Everyone you know is connected&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;Means you have different opportunities than desktop.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;h4&gt;write Once - Run Anywhere&lt;/h4&gt;&lt;div&gt;How to get code onto the device.&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Rhodes is similar to Rails.&lt;/li&gt;&lt;li&gt;Views are HTML.&lt;/li&gt;&lt;li&gt;It all works within the device. So a kind of HTML processor is inside the device.&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;It's also analogous to Rails:&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Controller -&gt; RhoController&lt;/li&gt;&lt;li&gt;Model -&gt; Rhom&lt;/li&gt;&lt;li&gt;View -&gt; eRB files&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;Javascript alternatives:&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Titanium&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1121966792426977205-5151837758637295086?l=oldfartdeveloper.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oldfartdeveloper.blogspot.com/feeds/5151837758637295086/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://oldfartdeveloper.blogspot.com/2010/02/scenes-from-la-ruby-conference-2010.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1121966792426977205/posts/default/5151837758637295086'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1121966792426977205/posts/default/5151837758637295086'/><link rel='alternate' type='text/html' href='http://oldfartdeveloper.blogspot.com/2010/02/scenes-from-la-ruby-conference-2010.html' title='Scenes from LA Ruby Conference - 2010 - Mobile Ruby'/><author><name>OldFartDeveloper</name><uri>http://www.blogger.com/profile/02037828059640161019</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1121966792426977205.post-167617284927033526</id><published>2010-02-22T07:29:00.000-08:00</published><updated>2010-02-25T08:49:48.780-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rubyconf2010'/><title type='text'>Scenes from LA Ruby Conference - 2010 - The Big Rewrite</title><content type='html'>&lt;h1&gt;Take Away&lt;/h1&gt;&lt;div&gt;&lt;i&gt;The primary danger in the major rewrite is proceeding before the business has bought into it; this is usually fatal (or you end up wishing it was fatal).  Along with the important technical skills needed, this talk identifies how to know when the business is behind it, and how to help to navigate the business to support the rewrite.  (Or, to determine that it's not a good idea to do the rewrite at this time.)&lt;/i&gt;&lt;/div&gt;&lt;h1&gt;The Big Rewrite, Doing it Right&lt;/h1&gt;&lt;h2&gt;Rich Kilmer&lt;/h2&gt;&lt;i&gt;btw, he used a presentment software package called &lt;b&gt;Prezi&lt;/b&gt; which was very effective with swirling text while zooming.&lt;/i&gt;&lt;h3&gt;Drivers for a Rewrite&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;Must be business driven&lt;/li&gt;&lt;li&gt;Must NOT be technology driven&lt;/li&gt;&lt;li&gt;Don't call it a rewrite&lt;/li&gt;&lt;li&gt;Complete in a major release cycle&lt;/li&gt;&lt;/ul&gt;Why?  Costs money and resources.  Business has to see value.&lt;h3&gt;Preparing for a rewrite&lt;/h3&gt;Drop a major release before you start.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;One the customer is really happy with.&lt;/li&gt;&lt;li&gt;Understand your domain&lt;/li&gt;&lt;li&gt;Or have a domain expert available all the time.&lt;/li&gt;&lt;li&gt;Break down the current system into logical sets of functionality.  &lt;i&gt;(Rich later showed the resulting code which was incredibly clean; this made a (hopefully) lasting impression on me.)&lt;/i&gt;&lt;/li&gt;&lt;li&gt;Choose the right technology for what you want to do.  Examples:&lt;/li&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;Develop a standard worker framework (minion, resque)&lt;/li&gt;&lt;li&gt;Dedicate resources to repeatable data migration&lt;/li&gt;&lt;li&gt;Keep services code consistent, models clean&lt;/li&gt;&lt;li&gt;Use the right tool for each job&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;h3&gt;Flip It&lt;/h3&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Perform incremental migrations of historic data&lt;/li&gt;&lt;li&gt;Prepare business users for potential disruptions&lt;/li&gt;&lt;li&gt;Run flip scenarios several times&lt;/li&gt;&lt;li&gt;Enable "read only" system during final lip (if needed)&lt;/li&gt;&lt;li&gt;Provide a way to fall back if the flip fails&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;h3&gt;Miscellaneous&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;Don't code for assumptions.&lt;/li&gt;&lt;li&gt;If you find that you want to use the same name for two different classes, you may have two different domains which might need different applications.&lt;/li&gt;&lt;li&gt;Design for expectation that backing up separate systems will probably not backup synchronously.  So be prepared to recover disparities.&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1121966792426977205-167617284927033526?l=oldfartdeveloper.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oldfartdeveloper.blogspot.com/feeds/167617284927033526/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://oldfartdeveloper.blogspot.com/2010/02/scenes-from-la-ruby-conference-2010-big.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1121966792426977205/posts/default/167617284927033526'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1121966792426977205/posts/default/167617284927033526'/><link rel='alternate' type='text/html' href='http://oldfartdeveloper.blogspot.com/2010/02/scenes-from-la-ruby-conference-2010-big.html' title='Scenes from LA Ruby Conference - 2010 - The Big Rewrite'/><author><name>OldFartDeveloper</name><uri>http://www.blogger.com/profile/02037828059640161019</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1121966792426977205.post-729425136070772474</id><published>2009-09-28T10:33:00.000-07:00</published><updated>2009-09-28T11:27:43.304-07:00</updated><title type='text'>UI Flow Shorthand Application - A Proposal</title><content type='html'>&lt;span style="font-weight: bold;"&gt;The OCRuby Users' Group Needs a Group Project&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Here in Orange County, CA, Ruby Users' Group, we're in the process of selecting a "group project".&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;A Suggested Project&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Here's an idea.  Implement a simple graphical tool for Ryan Singer's recent posting on a shorthand notation for UI flow.  Forrest and I both like it.  If you haven't already, read &lt;a href="http://37signals.com/svn/posts/1926-a-shorthand-for-designing-ui-flows"&gt;Ryan's post.&lt;/a&gt;  Here's an example from his article:&lt;br /&gt;&lt;img src="file:///Users/scott/Library/Caches/TemporaryItems/moz-screenshot-1.png" alt="" /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_cWbq1TlOjsU/SsD3dc6z8wI/AAAAAAAAARY/EntW5HySlCs/s1600-h/log-in+flow.png"&gt;&lt;img style="cursor: pointer; width: 320px; height: 142px;" src="http://3.bp.blogspot.com/_cWbq1TlOjsU/SsD3dc6z8wI/AAAAAAAAARY/EntW5HySlCs/s320/log-in+flow.png" alt="" id="BLOGGER_PHOTO_ID_5386577239686247170" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src="file:///Users/scott/Library/Caches/TemporaryItems/moz-screenshot.png" alt="" /&gt;In the following discussion, I'll refer to Ryan's subject matter as "UI shorthand".&lt;br /&gt;&lt;br /&gt;Now, it is to be admitted that Ryan himself protests building a tool for UI shorthand, but Forrest suggests that perhaps Ryan's shorthand could be another Cucumber script.    Just because a Cucumber script doesn't attempt to "document everything" doesn't mean that the metaphor isn't a valuable vehicle for test-driven-development.  We suggest that UI shorthand could be an additional valuable input for TDD.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Implementation Alternatives&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;So, presuming for sake of discussion that this is a project worth pursuing, what do we have w/ UI shorthand?  Its artifacts are hand-drawn diagrams.  Hmm, don't want to parse those.&lt;br /&gt;&lt;br /&gt;If we want to capture the information in the hand-drawn diagrams in a parsible way, I can see two strategies:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Create a DSL (Domain Specific Language) that will generate the diagrams.&lt;/li&gt;&lt;li&gt;Build a WYSIWYG tool to interactively draw the diagrams.&lt;/li&gt;&lt;/ol&gt;Either of these alternatives could be implemented within a web application or as a Ruby-based client application; although some solutions would be more difficult and/or less-satisfying to the user than others.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Alternative 1 - Create a DSL and generate the diagrams&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;This can be implemented either on the server or the client.  Since graphics are involved, if this is done on the client, then the user will need to download the rendering engine we select.  If this is on the server, then the server can generate the graphic in a form that the user's browser will already know how to download and display.&lt;br /&gt;&lt;br /&gt;This would be an opportunity to get involved with a graphics tool like SVN.&lt;br /&gt;&lt;br /&gt;An example of a site doing something equivalent can be found here.  &lt;a href="http://yuml.me/"&gt;http://yuml.me/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Here is an example of their generated output:&lt;br /&gt;&lt;br /&gt;&lt;img src="file:///Users/scott/Library/Caches/TemporaryItems/moz-screenshot-2.png" alt="" /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://yuml.me/diagram/scruffy/class/%5Bnote:%20You%20can%20stick%20notes%20on%20diagrams%20too%21%7Bbg:cornsilk%7D%5D,%5BCustomer%5D%3C%3E1-orders%200..*%3E%5BOrder%5D,%20%5BOrder%5D++*-*%3E%5BLineItem%5D,%20%5BOrder%5D-1%3E%5BDeliveryMethod%5D,%20%5BOrder%5D*-*%3E%5BProduct%5D,%20%5BCategory%5D%3C-%3E%5BProduct%5D,%20%5BDeliveryMethod%5D%5E%5BNational%5D,%20%5BDeliveryMethod%5D%5E%5BInternational%5D"&gt;&lt;img style="cursor: pointer; width: 467px; height: 659px;" src="http://yuml.me/diagram/scruffy/class/%5Bnote:%20You%20can%20stick%20notes%20on%20diagrams%20too%21%7Bbg:cornsilk%7D%5D,%5BCustomer%5D%3C%3E1-orders%200..*%3E%5BOrder%5D,%20%5BOrder%5D++*-*%3E%5BLineItem%5D,%20%5BOrder%5D-1%3E%5BDeliveryMethod%5D,%20%5BOrder%5D*-*%3E%5BProduct%5D,%20%5BCategory%5D%3C-%3E%5BProduct%5D,%20%5BDeliveryMethod%5D%5E%5BNational%5D,%20%5BDeliveryMethod%5D%5E%5BInternational%5D" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;A second step would be to implement a filter that would convert the DSL to Cucumber or RSpec syntax.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Alternative 2 - Build a WYSIWYG tool to interactively draw the diagrams.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;Ruby has all the libraries needed to implement a full WSYIWYG on the client.  In this case, perhaps the tool would also generate the DSL so that it, in turn, could be converted to Cucumber or RSpec as described in alternative 1 above.&lt;br /&gt;&lt;br /&gt;Doing a WYSIWYG is &lt;span style="font-style: italic;"&gt;much&lt;/span&gt; harder on the server.  About all I can think of is having the server rapidly generate a mouse-drag in Ajax while updating a image of the drag.  At best, this is likely to be sluggish.&lt;br /&gt;&lt;br /&gt;Or we could do it in a proprietary browser "desktop" like Microsoft's Silverlight or Flash.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Summary and Call to Action&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Anyways, that's the extent that I've thought about it.  This sound interesting?  OCRubyists, please weigh in w/ comments here.&lt;br /&gt;&lt;br /&gt;Thanks for your participation.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1121966792426977205-729425136070772474?l=oldfartdeveloper.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oldfartdeveloper.blogspot.com/feeds/729425136070772474/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://oldfartdeveloper.blogspot.com/2009/09/ui-flow-shorthand-application-proposal.html#comment-form' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1121966792426977205/posts/default/729425136070772474'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1121966792426977205/posts/default/729425136070772474'/><link rel='alternate' type='text/html' href='http://oldfartdeveloper.blogspot.com/2009/09/ui-flow-shorthand-application-proposal.html' title='UI Flow Shorthand Application - A Proposal'/><author><name>OldFartDeveloper</name><uri>http://www.blogger.com/profile/02037828059640161019</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_cWbq1TlOjsU/SsD3dc6z8wI/AAAAAAAAARY/EntW5HySlCs/s72-c/log-in+flow.png' height='72' width='72'/><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1121966792426977205.post-5290360905212803788</id><published>2009-09-20T18:45:00.000-07:00</published><updated>2009-09-21T09:38:06.006-07:00</updated><title type='text'>RForce/Salesforce Setup for Dummies</title><content type='html'>&lt;span style="font-weight: bold;font-size:130%;" &gt;Justification&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;It took me too many hours to set up Salesforce and then use RForce to verify that Ruby could communicate w/ the Salesforce application.  Hopefully the distillation that follows here will help pave the way for others.  I explain very little "why"; but being able to see something "that works" may be helpful to your understanding.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;Preconditions&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;You have no Salesforce account.&lt;/li&gt;&lt;li&gt;You have not installed RForce&lt;/li&gt;&lt;li&gt;You have Ruby 1.8.7 installed and am reasonably Ruby-fluent.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;Here's what we're going to accomplish:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Create a developer Salesforce account and verify there is data entered into it.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Grab the RForce gem.&lt;/li&gt;&lt;li&gt;Write an unit test to retrieve data from the Salesforce account that was set up.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;Detailed Steps&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Create a Salesforce Developers Account&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;You will need an email account:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Browse &lt;a href="http://www.salesforce.com/platform/developers.jsp"&gt;&lt;span style="text-decoration: underline;"&gt;http://www.salesforce.com/platform/developers.jsp&lt;/span&gt;&lt;/a&gt; &lt;/li&gt;&lt;li&gt;In the middle of the screen:&lt;br /&gt;&lt;h2&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_cWbq1TlOjsU/SrblWH827sI/AAAAAAAAAQo/5q9XAK-WzB4/s1600-h/Picture+4.png"&gt;&lt;img style="cursor: pointer; width: 320px; height: 135px;" src="http://3.bp.blogspot.com/_cWbq1TlOjsU/SrblWH827sI/AAAAAAAAAQo/5q9XAK-WzB4/s320/Picture+4.png" alt="" id="BLOGGER_PHOTO_ID_5383742572822195906" border="0" /&gt;&lt;/a&gt;&lt;/h2&gt; click the large button to the right, "get &lt;span style="color: rgb(255, 0, 0);"&gt;started&lt;/span&gt;".&lt;/li&gt;&lt;li&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;&lt;span style="color: rgb(51, 0, 0);"&gt;Fill in the requested information and submit.&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;&lt;span style="color: rgb(51, 0, 0);"&gt;After a minute or two, check the email account you submitted for an email titled: "Salesforce login confirmation" from &lt;span style="font-weight: bold;"&gt;info@sforce.com&lt;/span&gt;.  Open the email up and click the link supplied to confirm your developer registration and to log in.&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;&lt;span style="color: rgb(51, 0, 0);"&gt;The login page will require you to change your password.  Do so and submit.&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;&lt;span style="color: rgb(51, 0, 0);"&gt;The developer landing page will appear (top-left corner shown here):&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_cWbq1TlOjsU/Srboz4ketkI/AAAAAAAAAQw/kb-LQThzUSQ/s1600-h/Picture+5.png"&gt;&lt;img style="cursor: pointer; width: 635px; height: 115px;" src="http://2.bp.blogspot.com/_cWbq1TlOjsU/Srboz4ketkI/AAAAAAAAAQw/kb-LQThzUSQ/s320/Picture+5.png" alt="" id="BLOGGER_PHOTO_ID_5383746382624372290" border="0" /&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;At this point, you have just created your own "sandbox" CRM application.  Add a  record (that we will later retrieve from Ruby) by clicking the &lt;span style="font-weight: bold;"&gt;Home&lt;/span&gt; tab.  Your home form will appear:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_cWbq1TlOjsU/SrbrnghKNgI/AAAAAAAAAQ4/lDY8bDERl-8/s1600-h/Picture+6.png"&gt;&lt;img style="cursor: pointer; width: 554px; height: 383px;" src="http://1.bp.blogspot.com/_cWbq1TlOjsU/SrbrnghKNgI/AAAAAAAAAQ4/lDY8bDERl-8/s320/Picture+6.png" alt="" id="BLOGGER_PHOTO_ID_5383749468544448002" border="0" /&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;In the upper-left corner to the right of the &lt;span style="font-weight: bold;"&gt;Start Here&lt;/span&gt; tab, click the &lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_cWbq1TlOjsU/Srb4ymigFwI/AAAAAAAAARQ/bVLTDmzjpMM/s1600-h/Picture+9.png"&gt;&lt;img style="cursor: pointer; width: 45px; height: 30px;" src="http://3.bp.blogspot.com/_cWbq1TlOjsU/Srb4ymigFwI/AAAAAAAAARQ/bVLTDmzjpMM/s320/Picture+9.png" alt="" id="BLOGGER_PHOTO_ID_5383763952790411010" border="0" /&gt;&lt;/a&gt; tab.&lt;/li&gt;&lt;li&gt;Click the &lt;span style="font-weight: bold;"&gt;Accounts&lt;/span&gt; link.&lt;/li&gt;&lt;li&gt;Set the dropdown labeled &lt;span style="font-weight: bold;"&gt;View&lt;/span&gt; to "All Accounts" and click &lt;span style="font-weight: bold;"&gt;Go&lt;/span&gt;.&lt;/li&gt;&lt;li&gt;You should see a list of accounts.  We're going to pick one to retrieve: &lt;span style="font-weight: bold;"&gt;sForce&lt;/span&gt;.  Hence, record the following information for it:&lt;br /&gt;&lt;table&gt;&lt;br /&gt;&lt;tbody&gt;&lt;tr&gt;&lt;br /&gt;&lt;th&gt;Column Name&lt;/th&gt;&lt;th&gt;Value&lt;/th&gt;&lt;br /&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;br /&gt;&lt;td&gt;Account Name&lt;/td&gt;&lt;td&gt;sForce&lt;/td&gt;&lt;br /&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;br /&gt;&lt;td&gt;Phone&lt;/td&gt;&lt;td&gt;(415) 901-7000&lt;/td&gt;&lt;br /&gt;&lt;/tr&gt;&lt;br /&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/li&gt;&lt;li&gt;Finally, you're gonna need to set up a security token.  At the very top of the same page, click the link &lt;span style="font-weight: bold;"&gt;Setup&lt;/span&gt;.  You should see your &lt;span style="font-weight: bold;"&gt;Personal Setup&lt;/span&gt; page.&lt;/li&gt;&lt;li&gt;In this part of the page:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_cWbq1TlOjsU/SrbwDCZirFI/AAAAAAAAARA/xiusBurunZM/s1600-h/Picture+7.png"&gt;&lt;img style="cursor: pointer; width: 589px; height: 252px;" src="http://3.bp.blogspot.com/_cWbq1TlOjsU/SrbwDCZirFI/AAAAAAAAARA/xiusBurunZM/s320/Picture+7.png" alt="" id="BLOGGER_PHOTO_ID_5383754339542281298" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;click the (magic) link &lt;span style="font-weight: bold;"&gt;Reset your security token&lt;/span&gt;.&lt;/li&gt;&lt;li&gt;A page, &lt;span style="font-weight: bold;"&gt;Reset Security Token&lt;/span&gt;, will appear.  Click the button &lt;span style="font-weight: bold;"&gt;Reset Security Token&lt;/span&gt;.&lt;/li&gt;&lt;li&gt;A page will appear indicating that the &lt;span style="font-weight: bold;"&gt;security token&lt;/span&gt; has been sent to your email address.&lt;/li&gt;&lt;li&gt;Wait for the email to arrive at your mailbox.  It will be titled &lt;span style="font-weight: bold;"&gt;Salesforce security token confirmation&lt;/span&gt;.  The token will appear after "Security Token:".  Copy it and save it in a safe place.&lt;/li&gt;&lt;/ol&gt;We're done with setting up our Salesforce cloud application and our security token.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Install RForce&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Use Ruby &lt;span style="font-weight: bold;"&gt;gem&lt;/span&gt; to install RForce.  The command is:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;gem install rforce&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;(Don't forget the &lt;span style="font-weight: bold;"&gt;sudo&lt;/span&gt; if you are on the Macintosh.)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Create Test in Test::Unit&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Copy the following unit test code into your favorite text editor:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;&lt;br /&gt;&lt;br /&gt;require 'test/unit'&lt;br /&gt;require 'rubygems'&lt;br /&gt;gem 'rforce'&lt;br /&gt;require 'rforce'&lt;br /&gt;&lt;br /&gt;include RForce&lt;br /&gt;&lt;br /&gt;class RforceRetrievalTest &lt; Test::Unit::TestCase&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;def setup&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;@binding = RForce::Binding.new 'https://login.salesforce.com/services/Soap/u/16.0'&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;userID = 'yourID' # replace w/ your actual Salesforce developer user ID.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;password = 'password' # replace w/ your Salesforce developer account password.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;securityToken = 'token' # replace w/ your security token&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;@binding.login userID, (password + securityToken)&lt;br /&gt;&amp;nbsp;&amp;nbsp;end&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;def test_retrieve_an_account&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;answer = @binding.search :searchString =&gt; "find {sForce} in name fields returning account(id, phone)"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;record = answer[:searchResponse][:result][:searchRecords][:record]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;assert_equal 'Account',  record[:type]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;assert_equal '(415) 901-7000', record[:Phone]&lt;br /&gt;&amp;nbsp;&amp;nbsp;end&lt;br /&gt;&lt;br /&gt;end&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Put this file where your unit test files belong in a Ruby project, run it, and verify that you can retrieve data from your new Salesforce application.&lt;br /&gt;&lt;br /&gt;Enjoy!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1121966792426977205-5290360905212803788?l=oldfartdeveloper.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oldfartdeveloper.blogspot.com/feeds/5290360905212803788/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://oldfartdeveloper.blogspot.com/2009/09/rforcesalesforce-setup-for-dummies.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1121966792426977205/posts/default/5290360905212803788'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1121966792426977205/posts/default/5290360905212803788'/><link rel='alternate' type='text/html' href='http://oldfartdeveloper.blogspot.com/2009/09/rforcesalesforce-setup-for-dummies.html' title='RForce/Salesforce Setup for Dummies'/><author><name>OldFartDeveloper</name><uri>http://www.blogger.com/profile/02037828059640161019</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_cWbq1TlOjsU/SrblWH827sI/AAAAAAAAAQo/5q9XAK-WzB4/s72-c/Picture+4.png' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1121966792426977205.post-8568937329614060850</id><published>2009-04-08T22:50:00.000-07:00</published><updated>2009-04-08T22:52:46.375-07:00</updated><title type='text'>If you're gonna program, you need an editor</title><content type='html'>Learning TextMate, a developer's editor for the Mac, and what an editor it is!  I feel like I paid for a 1000 sq ft house and got a 4000 sq ft one instead.  This editor is overwhelming.  Very powerful, but a lot to learn.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1121966792426977205-8568937329614060850?l=oldfartdeveloper.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oldfartdeveloper.blogspot.com/feeds/8568937329614060850/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://oldfartdeveloper.blogspot.com/2009/04/if-youre-gonna-program-you-need-editor.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1121966792426977205/posts/default/8568937329614060850'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1121966792426977205/posts/default/8568937329614060850'/><link rel='alternate' type='text/html' href='http://oldfartdeveloper.blogspot.com/2009/04/if-youre-gonna-program-you-need-editor.html' title='If you&apos;re gonna program, you need an editor'/><author><name>OldFartDeveloper</name><uri>http://www.blogger.com/profile/02037828059640161019</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1121966792426977205.post-5242052822919308965</id><published>2009-04-02T22:14:00.000-07:00</published><updated>2009-04-02T23:01:28.223-07:00</updated><title type='text'>A Dream Coming True - Rails/Merb on the Macintosh</title><content type='html'>Last friday I received my MacBook Pro 17" laptop from Apple.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Yup.  Me, who wants to do Rails/.NET/Java work, spent a wad on a Mac.  Some of you may be asking, "Why?"&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Simple.  The Mac OS X operating system in a very classy and functional chassis.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;My objective: develop Rails apps and deploy them into a virtual machine.  Without Windows interference.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So, tonight I downloaded &lt;a href="http://www.vmware.com/products/fusion/"&gt;VMWare Fusion&lt;/a&gt; for the &lt;a href="http://www.apple.com/macbookpro/"&gt;Mac&lt;/a&gt; (as well as &lt;a href="http://www.parallels.com/products/desktop/"&gt;Parallel Desktop&lt;/a&gt;, a competitor) and installed them both.  I then &lt;a href="http://salesforceonrails.com/2008/engine-yard-express-a-production-slice-on-your-macbook-pro"&gt;poked around&lt;/a&gt; and, lo, here's a &lt;a href="http://www.vmware.com/appliances/directory/1280"&gt;virtual application&lt;/a&gt; available with both Rails and Merb already installed on it.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;What th' heck!  So I downloaded the Rails/Merb virtual image and had VMWare install and run it.  Voila!  I could browse both the Rails and the Merb instances inside the VMWare virtual machine in my Mac!  I could also ssh to the virtual machine and modify the programs inside.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So, I'm well on my way to "throwing the rope across the canyon."  When I do my first deployment to the virtual machine, I will feel as though I've made it.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Hey.  My wife just brought in the Vista Ultimate DVD package, so I'm now gonna mount that in the MacBook as well.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1121966792426977205-5242052822919308965?l=oldfartdeveloper.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oldfartdeveloper.blogspot.com/feeds/5242052822919308965/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://oldfartdeveloper.blogspot.com/2009/04/dream-coming-true-railsmerb-on.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1121966792426977205/posts/default/5242052822919308965'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1121966792426977205/posts/default/5242052822919308965'/><link rel='alternate' type='text/html' href='http://oldfartdeveloper.blogspot.com/2009/04/dream-coming-true-railsmerb-on.html' title='A Dream Coming True - Rails/Merb on the Macintosh'/><author><name>OldFartDeveloper</name><uri>http://www.blogger.com/profile/02037828059640161019</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1121966792426977205.post-576244919484430950</id><published>2008-12-11T14:36:00.000-08:00</published><updated>2008-12-11T14:55:26.905-08:00</updated><title type='text'>Introduction</title><content type='html'>&lt;span style="font-size:100%;"&gt;I'm 59 years old, have been working in electronics, digital hardware, firmware, and software for 41 of those.  I currently work in web development and continue to be fascinated by tools, languages, and paradigms.  Along the way, I've come across things I'd like to share, but was always too busy (or lazy) to get them out there.&lt;br /&gt;&lt;br /&gt;As one gets older, the "mentoring" instinct kicks in, so my intention is to share my now "old fart" wisdom w/ the young punks.  Hopefully you will find this useful and entertaining.&lt;br /&gt;&lt;br /&gt;btw, my real name is Scott Smith and I live in central Orange County south of Los Angeles.&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1121966792426977205-576244919484430950?l=oldfartdeveloper.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oldfartdeveloper.blogspot.com/feeds/576244919484430950/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://oldfartdeveloper.blogspot.com/2008/12/introduction.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1121966792426977205/posts/default/576244919484430950'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1121966792426977205/posts/default/576244919484430950'/><link rel='alternate' type='text/html' href='http://oldfartdeveloper.blogspot.com/2008/12/introduction.html' title='Introduction'/><author><name>OldFartDeveloper</name><uri>http://www.blogger.com/profile/02037828059640161019</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
