🕷 zenspider.com

by ryan davis

Looking for the Ruby Quickref?

CanadaOnRails, day 2, shared notes

Published 2006-04-17 @ 23:57

Tagged rails, thoughts

(sorry this took so long to get out, but Whistler doesn’t have good (free) intarweb)

Canada On Rails, day 2.

Same as before, after the cut…

 Day 2  
 Thomas Fuchs - Advanced Rails AJAX techniques  
 (Talk is based on Prototype 1.5)  
 Enumerables in js are cool. So are $ (fetches DOM object, given id) and $$ (fetches an array of DOM elements, given CSS selector).  
Direct Element extensions  
 if ($('foo').visible())  
 - Visual effects  
 - If it's used right, it's more than eye-candy. "It's a really good thing."  
 - Drag and Drop  
 - Ready-to-use controls  
- Plus some extras (javascript unit testing, DOM builder)  
 On-the-fly JavaScript:  
 Rails javascript Template  
 Rails AJAX: A history  
 Thing(y|ies)                                   Time  
Ideas to make the web snappier                 Late 20th century  
 Prototype 1.0, Rails Helpers                   Rails 0.11, March 22, 2005  
 Prototype 1.3, script.aculo.us                 Rails 0.13, July 6, 2005  
 Prototype 1.4, script.aculo.us 1.5             Rails 1.0, December 13, 2005  
 and another entry that I missed...  
RJS - dynamic javascript - no javascript programming necessary  
 Do it in Ruby, like everything else in Rails  
 page[:cart].update render(:partial => 'cart')  
 page.select('p.hint').each do |hint|  
     hint.visualEffect :highlight  
 Generates javascript:  
 $('cart').update('...rendered partial...');  
     function (value, index) {  
blah action gets called   
blah.rjs generates javascript  
   > this is pure ruby  
 prototype sees text/javascript and evals JavaScript  
 don't think about javascript, think of it as magic  
 Sam Stephenson is the magician (Thomas Fuchs is the sidekick)  
page.replace :list, render(:partial=>'list')  
page.replace_html :list, ...  
   - same as -  
 page[:list].update ...  
 Staying DRY  
 Refreshes contents of element "list" with the partial of the same name  
select in ruby (rjs) == $$ in prototype.   
 page.select('p.hint').pluck('t', 'offsetTop');  
 creates a javasacript "t" variable from the pluck list?  
page.select('p.hint').find_all('h') do  
     page <<'value.visible()'  
 Creates an "h" variable as an array containing all visiblt p.hint elements  
 page[:blah].set_style :backgroundColor => '#F00'  
 page[:blah].set_opacity 0.5  
 creates javascript to do the same  
 First Element  
 Visual Effects  
     :pulsate, :duration => 4.seconds)  
 Other visual effects:  
 ?apper, fade, slide_up, slide_down, blind_up, blind_down, pulsate, switch_off, puff and more  
Render :update (controller-based)  
 def update  
     render(:update) do |page|  
         page.hide :cart  
RJS Helpers  
 module SomeHelper  
     def ajaxy_stuff  
         page.hide :blah  
 Call in .rjs  
 Firefox + Firebug + Web Dev Toolbar  
 Venkman JavaScript Debugger  
 Rules #1 & #2: Use Firefox with extensions  
 Rule 3: Test with all browsers you want to support  
 Safari Web Inspector  
 (video showing and demo of Fluxiom)  
 1500 lines total code - about the length of your average Java XML config file  
 Web 3.0  
 launching in April 2006  
James Adam - Engines: Team Development with Rails  
slides posted at:  
Common functional aspects:  
 * Authentication, etc.  
 * especially so within a domain  
 examples: user control, reporting, charts and graphs, data storage content management auditing, help systems, classic enterprise problems  
These are BORING problems!  
 many applications x many aspects = lots of code + lots of maintenance  
 developers are often lazy and/but concientious  
 but DHH says - Reuse is overrated  
 James Adam - agrees <!> "Reuse is essential... it just depends on the context"  
The context within a given industry allows you to reuse solutions, and prevents you from going insane.  
 An example here is a help system  
 Procedure, make a generator for an application, package as a gem, and distribute the gem.  
 What happens when there is a bug or a new feature in the future.  Does this bug now need to be fixed in every application??  
  - could build a patch and install it on 20 apps x every aspect of those apps.  
  - could repackage the patched version and redist the gem - this is better, run the generator  
 It's not so simple, because the generator (vendor)  code will be customized  For instance one customer might want a method that creates a summary of the help topic.  
generators are difficult to maintain, because you customise the code.  
 use generators instead of code patches  
hard to seperate specific logic vs general logic  
 no way to isolate application spec changes from the basic system  
 We need separation between boring standard code and the specific stuff in your implementation.  
"rails 1.0 happened" - we got plugins!  
 Anatomy of a plugin  
 init.rb is run everytime your web app is loaded  
 install.rb (1.1 feature) evaluated immediately a plugin is installed (example: create directory) only evaluated once  
 lib (folder) automatically loadable file under this directory (required by rails without us requiring them explicitly) added to $LOAD_PATH  
 Plugins are in one folder, they are not mixed into your app.  
 Because they are self-contained it is easy to share within a team, or across a community.  
Crucial for rails developer using plugin  
Sharing with svn:externals (rock - seriously)  
3 Applications, 1 plugin that we want to share across all three  
Instead of copying the plugin into multiple applications we want some sort of link to the plugin in a single location.  
svn propset svn:externals 'my_plugin svn://server/my_plugin' vendor/plugins 
This links the same source for the plugin (in it's own repository) into all three applications, not a copy. Therefore, if we make a change to the plugin and want to propogate it, all you need to do is:  
 svn update vendor/plugins - it pulls all the externals  
"PLEASE PLEASE USE SVN.. and use externals for your plugins."  
 You can use svn:externals to track specific Rails releases in your vendar/rails directory - this locks you into a specific version which is necessary for deployment  
 svn:externals is MASSIVELY IMPORTANT  
If we find a bug we just need to fix and run svn update once  
Files in plugin dir:  
 help.rb - model  
 help_helper.rb - helper  
 help_controller.rb - controller  
hard_to_share {  
     show.rhtml - view  
     help.css - public files  
     001_add_help.rb - migrations  
 there is no way to easily share views , same thing for css or js or migrations - plugins don't work for these  
 we can only share code with plugins  
  (login enginer bane of my life - funny)  
  login engine is what engines are it is just an example  
  refutes propaganda about engines   
  engines are plugins but a little more  
  a mechanism for sharing MVC slices between your application including view, controller, migrations, public assets (css, images) everything  
  no need to relearn arcane file system same as rails file structure under the plugin directory  
It is not a tiny application inside your application. You put a full aplication in there but it would be incredibly hard and, likely, incredibly stupid.  
 from backchannel: {  
 David H:      
 I actually think that engines as james talks about them are not truly evil    
 Engines are potentially cool for in-company sharing  
engines are not standalone applications  
 engines are stored same place as plugins are (vendor/plugin/my_engine/  
 from backchannel: {  
 David H.      
 I think this is where the evil begins     
 That the assumption is that you should share it on the internet  
 but we don't use init.rb instead init_engine.rb  
script/generate engine Help  
 engines predate plugins  
 ridiculously simple, take a loook  
 completely compatible with all the version of rails  
engines are best used for sharing code between your own applications.  
 intra-company usage.  
David H.      
 there's no auto-namespace     
 if you overwrite, you overwrite       
 that's a feature, though  
 allowing you to customize the engine  
engines plugin is opinionated open source  
issues and patches go to  
David H.      
 Just don't share it with the world  
 David H.      
 David H.      
 Engines is a power feature for YOUR applications  
 Geoffrey Grosenbach - Generating Great Graphs with Ruby on Rails  
nuby on rails.  
 * can do very complex stuff, bars, 3d plots, meshes, whales <!>  
* animation  
 * a gem exists for this on rubyforge   
 * fairly simple interface, lots of capability  
 * gem install gnuplot.  
 MRPLOT < mister plot?  
* sinewaves, complex graphing  
* but can it do whales?  
 * need imagemagick, and rmagick  
 * this is written in ruby so you can hack it easily  
 * a bit more simple than gnuplot, but hte code can get complex  
 * uses a very OO approach to breating graphs  
Sparklines Graph library for Ruby  
* Sparklines were created by Edward tufte  
 * sparklines are word sized graphs  
 * It made Geoff famous, got a lot of attention   
gem install sparklines  
Gruff graphs  
 gem install gruff  
 require 'gruff'  

* line graphis, bars  
 * can change colours and fonts, put images in the background  
 * 'radar' or 'spider' graphs were contributed.  
 color scheme widget from firewheel design is useful  
The code example for generating graphs with Gruff is very succinct  
 caches_page :popularity  
  def popularity  
    g= Gruff::Line.new...  
 If you pull up points.png it will still cache it as an html file and your browser won't like it.  
 Use builtin rails helper to make image tags  
 <%= image_tag url_for(:controller => 'report',  
  file will have png appended and be cached correctly.  
 You can use named routes  
 map.report 'report/:action/:id/image.png',  
             :controller => 'report'  
 <%= image_tag report_url(:action => 'popularity',  
                          :id => 5) %>  
 This will generate a nice pretty url: /report/popularity/5/image.png. If you don't do it this way, you either have to add something.png|gif|jpeg to the end of all your graph links, or else when people download them they won't have a file extension. Which is tres annoying.  
 This is an example of how easy it is to pull data for a graph:  
articles = Articles.find_all  
 g.data "Comments", articles.map { |article|  
 yarr. beware the rough underbelly.  
 Rough underbelly is a site Geoff has done that does some nice stuff with gruff and with sparklines.  
 Dimewise - did some nice stuff with gruff  
 Mood-o-meter - graphing personal health and well-being  
 graph your caffeine vs mood!  
 Bellygraph - graphing personal goals  
 animated graphs  
 using ajax animated sliders can regenerate graphs.  
 Future applications of rails and graphics - chainging the sky on a weather site, or based on time of day that you visit a site. (http://1976design.com/blog/ used to do this).  putting different elements together on layers and creating graphics.  
 Geoff is thinking about these non-linear ways of displaying information.  
 Robby Russell  - Sneaking Rails through the (Legacy) System  
 Founder of PLANET ARGON  
slides posted at:  
Using Rails with a Legacy DB  
"Anything before Rails is a legacy system"  
 * Built in an *old* programming language  
 * Something you *inherited*  
 * A *valuable* asset to your company  
..They said it couldn't be done.  
 Extending the legacy system  
 there's a lot of data out there.  
 -meet the damands of today's market.  
 -what do you do when your pointy haired boss says to get that data to his pda (when he's at a hash bar in Amsterdam)  
 -Existing data is highly vaulable.  
 80% of it systems are legacy.  
 migrate the database.  
  -if old db is slow.  
  -if need to get out of expensive licenses  
 ==web services (topic jump?)  
  nice because:  
  - Interacting with web services is nice because they have open standards.  
   (SOA)- ws-deathstar.   
  - Data over http:  
==Encapsulating the Legacy Database  
  - Pure SQL approach with a database adapter  
    this is not fun, with roR you have....   
  - Persistince framework in ror, is handy.  
   you don't have to be an SQL wizard.  
 ==Database abstraction layer  
  How do we do this in rails?  
  Active record, can use it to interact with the legacy system.  
  Active Record << Legacy  
  Acts as Leagacy,  Robby's plugin  
  for interacting with non-rails-convetional table and column names.  
  designed to get your legacy db up and running with rails.  
  This lets you handle things like column or table prefixesvery easily so your code can still be a lot more railsy without  
 Dell DVD store problem  
 PostgreSQL download ...  
 There are some cool sample databases here you can stress test your stuff with.  
 Robbie is doing some live coding here to make a database work with rails  
 categories table and a products table  
 uses acts_as_leacy to specify the table name and primary key name, Robby is huge on script/console  
 Array datatypes (serialize arrays to DB? or encompass multiple rows?)  
 Still has problems with stored procedures, activerecord doesn't handle that in its current state  
 Q: Instead of denormalizing witha table in the middle, what if there was a table with columns, item1, item2, item3, item4, item5.  
 A: no solution for that yet.  
 Robby will be posting more about acts_as_legacy on his blog shortly.  
 resources and links.  
 martin fowlers bliki:  
 Jeremy Voorhis - Internationalizing Rails  
== What is Globalization  
  * Internationalization  
 * Localisation.  
== I18N  
 * Preparation of software to be useful in multiple locales  
 * concerns. strings may be bi-directional  
 * dates, times, currency (commas or periods)  
 == L10N  
 * translated content for a language  
 * designs from right -> left or L-.R  
 * Formatting dates, times and numbers for a specific region  
 * content that is sensitive to your audience's culture.  
 significance of colours, etc.  
 == Unicode  
 * unpopular in japan, and not natively supported in ruby.  
   since unicode had Han unification, which was unpopular in Japan, many Japanese coders prefer JIS which has more acceptable support for japanese characters  
* Support available through jcode module  
 require 'jcode'  
 $KCODE = 'u'  
database must support unicode too.  
 == Locales  
 * Operating definition: a combination of a language and a region  
 * can be identified with a locale tag  
 RFC 3066  
 Primary-subtag = 1*8ALPHA  
 Subtag  = 1**(ALPHA / DIGIT)  
 primary subtag is an ISO 639 language code and should be lowercase  
 Subtag is typically an diso 2166 country code and should be capiutalized  
  eg en-US  
   es-419 <-- latin american spanish.  
 == Globablize  
 * supported through the globalize plugin  
Model translations  
 View transations  
 Date, time, number formatting.  
 == Getting started with globalised  
 239 languages 189 countries  
 $ plugin install http://svn.globalize-rails.org/svn/ globalize/globalize/trunk  
$ rake globalize:setup  
== Setting the Base Language  
 #Include yor applic ation configuratio below  
 Local.set_base_language 'en-US'  
== Capturing Locales.  
 map.connect ':locale/:controller/:action/:permalink'  
Settign an active locale  
in your ApplicationController:  
 before_filer :set_locale  
 This sets your locale, but you can modify the controller to fall back.  
class Feature < ActiveRecord::Base  
  translate :headline, :abstract, :body  
doing it: acts as a method!  
 <%= 'FEATURES'.t -%>  
 <%= :title.t -%>  
There is a translation availability helper.  
 so you can say ' translation not available'   
Showed lots of code examples....  
 Showed some examples of planet argon work with simple admin interfaces for translaters to use.  
 Also showed israeli guitar store, Joshua Harvey coded it, and was the founder of Globalize, the text is reversed because hebrew is R->L.  
   * Trac  
   * Wiki  
   * Mailing list  
  * API Docs  
Joshua Harvey  
 Joshua Sierles  
Q: managing a css or image swapping through globablize?  
 A: Yeah, that might be doable.    
 Q: can we manage different formats like postal codes  
 A: it could, the work has not been done yet on this  
 all slides available as pdf from  
 Sebastian Kanthak - Plugging in with FileColumn  
Sebastian started the presentation taking a picture of all the apple laptops, it was crazy to see so many  
 1. Introduction  
 2. Features  
 3. Extending Rails with Plugins  
 4. ???  
5. Profit!  
A rails plugin to make file uploads easy?  
 What's hard about uploads?  
 - Where to store the files.  
   - Store as BLOB (binary large object) in db or as regular files?  
   - File system is better! opinion.  
  - How to redisplay forms?  
  - What do you do with images?  
    - resizing - there is some support for this.  
Fuck You.t # => Fick Dich  
Store uplaods in filesystem  
 Handles for mesidaplays  
Uploading images: RMagick  
filename stored in the database.  
 in your schema  
 create_table :entries  do |t|  
   t.column :image, :string  # <-- filename  
 File structure examples:  
 file location  
 this is done so that filenames dont' conflict  
 temp files  
 adds validators,   
 imaage extenstion  
 image type {image/jpeg}  
 uses RMagick  
 file_column :image, :magick=> {   
  :crop => 640 x 480  
 does versioning  
 for regular  
 does custom transformations - allows you to define yoru own methods that do whatever you want with rMagick.  
FileColumn makes file uploads as easy as they should be  
 Handling images becomes even easier  
 Q Temp Collects a lot of cruft.  
 A Make a cron to clean it out.  
   Dir["public/**/tmp/**/*"].each{|file| FileUtils.rm_rf file} (something like that)  
 Q How to use another directory   
 A There's a thing.  
   FileColumn::ClassMethods::DEFAULT_OPTIONS.update {  
 :root_path =>  
 File.join(RAILS_ROOT, "public", "system"),  
   :web_root = > "system"   
 Michael Buffington - Using Ruby on Rails to Make a Massive Multiplayer Game  
 His game:  
 He liked macropoly, which disapeared after some time.  It's back but not really good anymore.  
 Brief WoW demo  
 WoW has:  
   * multiple worlds  
   * items and rewards  
   * player levels  
 :WoW = "World of Walking"  
 "Embrace ADD"  
 SFI - Single Finger Interface  
 Minimal Clicks  
 This game is almost all done with scriptaculous  
 Heavy use of moveBy() for car movement and gameboard scrolling.  
 Really Use MVC.  He reaolly learned this lesson  
 Built with:  
JSON is used to move data about.  
 If JSON was/were food, it'd be sushi. Or corn dogs.  
 scale later - don't go crazy  
   he started the application with textdrive  
 Manage growth  
   Close the doors, if you want to stop growing for a while.  
 optimise the obvious  
90% Transparency  
 Open-sourced in October, achieved:  
  * Massive growth  
  * burst of development - some sig. contributions  
   * serious scrutiny from scientists  
   * damned lies! filthy filthy lies!  
  * retaining suicidal patients  
   * Heavy RJS use  
   * Open real estate market - let people design buildings  
  * more like SimCity  
  * Involving more fanatics  
   * Simplify the core - refactor  
   * interface through an aimbot  
 Make Money  
   * maybe advertising on buildings.  
     but he's not committed enough  
 Closing Ceremonies  
And so the gathered conference attendies prepared to end thier collective adventure.  They nervously 
looked around the room, what would become of them after this?  Would they ever 
see each other again? Where were the doughnuts going to come from??  
 And what of the bunnies? And the farm, that was promised.  Life was not as easy as they had been lead to believe at the outset, but it was clear.  It was obvious what they had to do, as they shifted in thier seats, trying to get blood flow through their backsides once more.  
 There was strained laughter at the antics of the rented talent.  Their attempts at humor were modestly appreciated, but mostly for naught.  It was painful in a melancholic sort of way.  
 As each shirt and book was passed off to a lucky winner, the crowd clapped half-heartedly.  
 The new friends, neigh, the new army, steeled thier collective resolve for the next battle on the field of web development.  Even as the last of the prizes were being labouriously handed out by the black clad ladies, there was a single phrase rising from withing the group.... you could almost hear it, 300 people collectively, with one voice, silently screaming, like nothing else in the world mattered or made sense.  
 Fuck you!  
le fin.  
What's the campfire url again?  
-----------------------This is the bottom of the file---------------------