<rss version="2.0">
  <channel>
    <title>MaxWiki Web Site</title>
    <link>http://www.maxwiki.com/</link>
    <description>MaxWiki</description>
    <language>en-us</language>
    <ttl>40</ttl>
    <item>
      <title>ScalingTwitter</title>
      <description>&lt;h3&gt;Preconceived Notions&lt;/h3&gt;
&lt;p&gt;Scaling on Rails is hard is a preconceived notion&lt;br /&gt;
&lt;br /&gt;
Rails is not inherently difficult to scale&lt;/p&gt;
&lt;h3&gt;The Story&lt;/h3&gt;
&lt;p&gt;Twitter started as side-project of Odeo&lt;br /&gt;
&lt;br /&gt;
South-by-southwest... not sure what this is&lt;br /&gt;
&lt;br /&gt;
Traffic spike happened unexpectedly in March&lt;/p&gt;
&lt;h3&gt;Configuration&lt;/h3&gt;
&lt;p&gt;Just one database (master/slave - slave for reporting)&lt;br /&gt;
&lt;br /&gt;
32 cores - sun machines&lt;br /&gt;
&lt;br /&gt;
120 mongrels&lt;br /&gt;
&lt;br /&gt;
16GB of memcache&lt;br /&gt;
&lt;br /&gt;
MySQL on one 8 core box&lt;/p&gt;
&lt;h3&gt;Traffic&lt;/h3&gt;
&lt;p&gt;200-300 connections / seconds&lt;br /&gt;
&lt;br /&gt;
800 spike per second&lt;br /&gt;
&lt;br /&gt;
MySQL 2,400 queries/second&lt;/p&gt;
&lt;h3&gt;Solution&lt;/h3&gt;
&lt;p&gt;memcache!!!&lt;br /&gt;
&lt;br /&gt;
cache-fu &lt;br /&gt;
&lt;br /&gt;
extended cache stats&lt;/p&gt;
&lt;p&gt;custom API caching&lt;/p&gt;
&lt;p&gt;complex issues of caching of data because data is different for each users&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3&gt;Examples&lt;/h3&gt;
&lt;p&gt;denormalize&amp;nbsp; ...didn't understand this&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Starling... distributed queuing system - written from scratch (aren't there others?)&lt;/p&gt;
&lt;p&gt;...something about how fast disk access is...&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3&gt;Advice&lt;/h3&gt;
&lt;p&gt;Talk to other people in the community&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <pubDate>Sun, 01 Nov 2009 00:06:46 Z</pubDate>
      <guid>http://www.maxwiki.com/ScalingTwitter</guid>
      <link>http://www.maxwiki.com/ScalingTwitter</link>
    </item>
    <item>
      <title>JRubyOnRails</title>
      <description>&lt;h1&gt;JRuby on Rails: A Taste of Honey (for the Enterprise)&lt;/h1&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;Charles Nutter, Thomas Enebo&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://conferences.oreillynet.com/cs/rails2007/view/e_sess/11564"&gt;Session Link&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;Status&lt;/h2&gt;
&lt;ul&gt;
    &lt;li&gt;Most Rails apps will now work on JRuby&lt;/li&gt;
    &lt;li&gt;Most pure Ruby Gems work: Redcloth, etc&lt;/li&gt;
    &lt;li&gt;Rails commands work&lt;/li&gt;
    &lt;li&gt;Ruby DB MySQL adapter works (others close)&lt;/li&gt;
    &lt;li&gt;Extensions that work: Mongrel, OpenSSL, YAML, RMagickJr&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Advantages of JRuby&lt;/h2&gt;
&lt;ul&gt;
    &lt;li&gt;Supports Java Unicode strings, Ruby and Java strings go back and forth safely&lt;/li&gt;
    &lt;li&gt;JRuby supports Ruby's Thread. Same as a system thread so can spin off threads easily. Can pool threads.&lt;/li&gt;
    &lt;li&gt;Access Java libraries&lt;/li&gt;
    &lt;li&gt;JDBC drivers with JNDI connection pooling&lt;/li&gt;
    &lt;li&gt;Supports more databases than Rails, but most still don't pass all tests&lt;/li&gt;
    &lt;li&gt;Can be faster than Ruby (after warmup)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Disadvantages of JRuby&lt;/h2&gt;
&lt;ul&gt;
    &lt;li&gt;Doesn't support SQLITE3?&lt;/li&gt;
    &lt;li&gt;PostgreSQL still fails some tests&lt;/li&gt;
    &lt;li&gt;Oracle, DB2 and MSSQL still not working&lt;/li&gt;
    &lt;li&gt;Native extensions (C extensions) not supported, but people can port them or call to equivalent Java library&lt;/li&gt;
    &lt;li&gt;RMagick not supported (but they are working on it)&lt;/li&gt;
    &lt;li&gt;Command line likely slower (because of JVM warmup)&lt;/li&gt;
    &lt;li&gt;Migrations don't work on all DBs&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Building, Running, Deploying&lt;/h2&gt;
&lt;ul&gt;
    &lt;li&gt;Install JRuby from tar&lt;/li&gt;
    &lt;li&gt;Add to path&lt;/li&gt;
    &lt;li&gt;Install with jruby -S gem install rails -y&lt;/li&gt;
    &lt;li&gt;Install other stuff&lt;/li&gt;
    &lt;li&gt;Can run with native DB, to install JDBC modify environment.rb&lt;/li&gt;
    &lt;li&gt;Run as normal&lt;/li&gt;
    &lt;li&gt;However using Mongrel means that each one needs JVM too, so it takes a lot memory&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Deploy to App Server&lt;/h2&gt;
&lt;ul&gt;
    &lt;li&gt;Install goldspide plugin&lt;/li&gt;
    &lt;li&gt;jruby -S rake war:standalone:create&lt;/li&gt;
    &lt;li&gt;Deploy to glassfish or tomcat&lt;/li&gt;
    &lt;li&gt;Can run GlassFish as a gem (Alpha)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <pubDate>Sun, 01 Nov 2009 00:06:32 Z</pubDate>
      <guid>http://www.maxwiki.com/JRubyOnRails</guid>
      <link>http://www.maxwiki.com/JRubyOnRails</link>
    </item>
    <item>
      <title>RailsConfRealNumber</title>
      <description>&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3&gt;response time&lt;/h3&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;use 90%, not average (90% is where most people will be)&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3&gt;complicated automation&lt;/h3&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;needs to be programmed&lt;/p&gt;
&lt;p&gt;lost of detail on randomization of parallel request streams&lt;/p&gt;
&lt;p&gt;use minimal Ruby code to create test drivers and reports&lt;/p&gt;
&lt;p&gt;most tests... just use production monitoring tools&lt;/p&gt;
&lt;p&gt;uses real-time character output to watch tests running&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3&gt;scaling&lt;/h3&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;if you can bring down your site with one computer, you're already screwed&lt;/p&gt;
&lt;p&gt;need a cluster&lt;/p&gt;
&lt;p&gt;use UDP packets, can be broadcast, stateless&lt;/p&gt;
&lt;p&gt;...tuned out...&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3&gt;user testing&lt;/h3&gt;
&lt;p&gt;use Google analytics&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;write scripts for each page&lt;/p&gt;
&lt;p&gt;simulate production environment in test environment&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <pubDate>Sun, 01 Nov 2009 00:06:21 Z</pubDate>
      <guid>http://www.maxwiki.com/RailsConfRealNumber</guid>
      <link>http://www.maxwiki.com/RailsConfRealNumber</link>
    </item>
    <item>
      <title>RailsConfPlugins</title>
      <description>&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3&gt;The Basics&lt;/h3&gt;
&lt;p&gt;lib - part of load path&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;install.rb/uninstall.rb - only evaluated once (script plugin)&lt;/p&gt;
&lt;h3&gt;Re-Use&lt;/h3&gt;
&lt;p&gt;Pros and cons&lt;/p&gt;
&lt;p&gt;Speaker is author of engine plugins&lt;/p&gt;
&lt;p&gt;DRY that can be shared&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3&gt;Add behavior to existing Ruby classes&lt;/h3&gt;
&lt;p&gt;Plugins are a bout Ruby&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Example - add copyright function to all plugins&lt;/p&gt;
&lt;p&gt;step one - use include module at the beginning of class&lt;/p&gt;
&lt;p&gt;step two - use include in ActiveRecord::Base&lt;/p&gt;
&lt;p&gt;step three - AR::Base.send( :include, Module ) [will be disallowed in Ruby 2]&lt;/p&gt;
&lt;p&gt;include does not add class method; therefor add class method, then extend the class with the class methods module&lt;/p&gt;
&lt;p&gt;include+extend -&amp;gt; use self.included to include class method module; call class_eval and do extend within it&lt;/p&gt;
&lt;p&gt;this is what plugins are all about!!&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3&gt;Change behavior of Rails&lt;/h3&gt;
&lt;p&gt;Plugins are sanction method to change Rails&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Example html_escape&lt;/p&gt;
&lt;p&gt;a module is inserted above a class, and below the superclass - does not override class behaviour&lt;/p&gt;
&lt;p&gt;redefine methods of a class - don't do this!&lt;/p&gt;
&lt;p&gt;use alias_method&lt;/p&gt;
&lt;p&gt;in Rails - use alias_method_chain (this isn't very simple, but very convenient)&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Engine plugin adds to Dependencies class&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3&gt;Adding behavior of Rails&lt;/h3&gt;
&lt;p&gt;Example validates_ in AR&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Like attr_accessor in Ruby classes - not a keyword, it's a method&lt;/p&gt;
&lt;p&gt;You can call any class method in the class definition!!&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Make method into module, then extend ActiveRecord::Base, and you can use it in class definition&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3&gt;Reference&lt;/h3&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;lazyatom.com/plugins&lt;/p&gt;
&lt;p&gt;&lt;%= email 'james.adam@gmail.com' %&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <pubDate>Sun, 01 Nov 2009 00:06:09 Z</pubDate>
      <guid>http://www.maxwiki.com/RailsConfPlugins</guid>
      <link>http://www.maxwiki.com/RailsConfPlugins</link>
    </item>
    <item>
      <title>Slingshot</title>
      <description>&lt;h1&gt;Slingshot&lt;/h1&gt;
&lt;p&gt;Connection agnostic Rails applications&lt;/p&gt;
&lt;ul&gt;
    &lt;li&gt;Installs on Windows or Mac, updates automatically&lt;/li&gt;
    &lt;li&gt;Runs locally, syncs data back to server&lt;/li&gt;
    &lt;li&gt;Drag-and-drop&lt;/li&gt;
    &lt;li&gt;Update application code&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Using Slingshot&lt;/h2&gt;
&lt;ul&gt;
    &lt;li&gt;Drop in a Rails app&lt;/li&gt;
    &lt;li&gt;Write ActiveRecord transport layer (2 to 30 lines of code, describing how to sync)&lt;/li&gt;
&lt;/ul&gt;</description>
      <pubDate>Sun, 01 Nov 2009 00:05:56 Z</pubDate>
      <guid>http://www.maxwiki.com/Slingshot</guid>
      <link>http://www.maxwiki.com/Slingshot</link>
    </item>
    <item>
      <title>ScriptaculousInsideOut</title>
      <description>&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3&gt;Prototype&lt;/h3&gt;
&lt;p&gt;protoypejs.org - excellent documentation&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Enumerables - array extensions for iterators&lt;/p&gt;
&lt;p&gt;Object.extend&lt;/p&gt;
&lt;p&gt;Function.bind&lt;/p&gt;
&lt;p&gt;DOM Utilities&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3&gt;Animation Engine&lt;/h3&gt;
&lt;p&gt;Time-based&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;http://script.aculo.us/dist/&lt;/p&gt;
&lt;p&gt;Effect.Move Effect.Fade&lt;/p&gt;
&lt;p&gt;Core vs. Combo effects.&lt;/p&gt;
&lt;p&gt;Life Cycle = initialization - animation loop - finishing up&lt;/p&gt;
&lt;p&gt;...speaker walks through code...&lt;/p&gt;
&lt;p&gt;...does demos...&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <pubDate>Sun, 01 Nov 2009 00:05:43 Z</pubDate>
      <guid>http://www.maxwiki.com/ScriptaculousInsideOut</guid>
      <link>http://www.maxwiki.com/ScriptaculousInsideOut</link>
    </item>
    <item>
      <title>AngelsAndDaemons</title>
      <description>&lt;h1&gt;Angels &amp;amp; Daemons&lt;/h1&gt;
&lt;p&gt;&amp;quot;Supporting your rails application with custom daemons&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://conferences.oreillynet.com/cs/rails2007/view/e_sess/11634"&gt;Session Description&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;Sample Project&lt;/h2&gt;
&lt;p&gt;http://thoughtbot.com/projects/ldap-ar-gateway&lt;/p&gt;
&lt;h2&gt;Daemonizing&lt;/h2&gt;
&lt;p&gt;&lt;span class="Code"&gt;
&lt;p&gt;def daemonize&lt;br /&gt;
&amp;nbsp; Kernel.fork and Kernel.exit&lt;br /&gt;
&amp;nbsp; Process.setsid&lt;br /&gt;
&amp;nbsp; Kernel.fork and Kernel.exit&lt;br /&gt;
&amp;nbsp; File.umask 0&lt;br /&gt;
&amp;nbsp; Dir.chdir '/'&lt;br /&gt;
&amp;nbsp; ObjectSpace.each_object(IO) {|io| io.close rescue nil}&lt;br /&gt;
&amp;nbsp; STDIN.open '/dev/null'&lt;br /&gt;
&amp;nbsp; STDOUT.open '/dev/nul', a&lt;br /&gt;
end&lt;/p&gt;
&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;-- or --&lt;/p&gt;
&lt;p&gt;require 'daemons'&lt;br /&gt;
Daemonis.daemonize&lt;br /&gt;
&amp;nbsp; loop {&lt;br /&gt;
&amp;nbsp; ---&lt;br /&gt;
}&lt;/p&gt;
&lt;h2&gt;Interacting with Rails&lt;/h2&gt;
&lt;p&gt;&lt;span class="Code"&gt;
&lt;p&gt;require 'environment.rb'&lt;/p&gt;
&lt;p&gt;if not defined? RAILS_ROOT&lt;br /&gt;
&amp;nbsp; raise 'Error'&lt;br /&gt;
end&lt;/p&gt;
&lt;p&gt;ActiveRecord:;Base.allow_concurrency = true #Otherwise get MySQL lost connection error&lt;/p&gt;
&lt;/span&gt;&lt;/p&gt;
&lt;h2&gt;Alternatives&lt;/h2&gt;
&lt;ul&gt;
    &lt;li&gt;Rakes tasks&lt;/li&gt;
    &lt;li&gt;./script/runner&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These are easy and good for single-shot or periodic tasks but overlapping execution can be a problem.&lt;/p&gt;
&lt;ul&gt;
    &lt;li&gt;BackgroundDRB&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Is good, early versions are buggy&lt;/p&gt;</description>
      <pubDate>Sun, 01 Nov 2009 00:05:31 Z</pubDate>
      <guid>http://www.maxwiki.com/AngelsAndDaemons</guid>
      <link>http://www.maxwiki.com/AngelsAndDaemons</link>
    </item>
    <item>
      <title>CustomRailsHelpers</title>
      <description>&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3&gt;Views are a Mess&lt;/h3&gt;
&lt;p&gt;Rails apps are pretty well designed, except for the Views.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Reasons - mix of languages, HTML, Ruby, JavaScript (every web framework has this problem).&lt;/p&gt;
&lt;p&gt;Refactoring views involves writing helpers.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3&gt;Helpers are not Well Understood&lt;/h3&gt;
&lt;p&gt;Making them work takes practise.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3&gt;HTML Helpers&lt;/h3&gt;
&lt;p&gt;Mutliline string concatenation, or multiline string.&lt;/p&gt;
&lt;p&gt;But, built-in helpers use content_tag( :tagname, :class =&amp;gt; 'classname') - better than HTML, because now we're not mixing languages.&lt;/p&gt;
&lt;p&gt;Another built-in helper: concat, capture.&lt;/p&gt;
&lt;p&gt;Render partial from helper!&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3&gt;Reusability comes from reusing something&lt;/h3&gt;
&lt;p&gt;Rather than designing for reusability...&lt;/p&gt;
&lt;p&gt;But for helpers, use html_options hash, and pass on to&amp;nbsp; HTML helpers.&lt;/p&gt;
&lt;p&gt;If generating multiple tags, html options should apply to outermost tag, and css selectors can be used to define inner css.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3&gt;Helpers that generate JavaScript&lt;/h3&gt;
&lt;p&gt;Avoid putting javascript event handlers into HTML tags. Use observe_field prototype helper instead. Detangles javascript from HTML tag.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3&gt;Learn JavaScript&lt;/h3&gt;
&lt;p&gt;Use objects, user Protoype (well documented now).&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3&gt;Form Builders&lt;/h3&gt;
&lt;p&gt;Introduced with Rails 1.2.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3&gt;Demo&lt;/h3&gt;
&lt;p&gt;Lots of JavaScript !!!&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <pubDate>Sun, 01 Nov 2009 00:05:20 Z</pubDate>
      <guid>http://www.maxwiki.com/CustomRailsHelpers</guid>
      <link>http://www.maxwiki.com/CustomRailsHelpers</link>
    </item>
    <item>
      <title>WikiSpam</title>
      <description>&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3&gt;Munge external links&lt;/h3&gt;
&lt;p&gt;Pissed off users. Stopped spammers for 2 weeks.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3&gt;Content based rejection&lt;/h3&gt;
&lt;p&gt;Reject multiple sequential 2-byte characters on english language wiki. Stopped spammers for 2 weeks.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Problem was rejection notice - tells spammer that things don't work, so they try something else&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3&gt;Tarpit database&lt;/h3&gt;
&lt;p&gt;Identify messages as spam, but them in tarpit. Spammers get shown spam, we and Google see normal content.&lt;/p&gt;
&lt;p&gt;Need to detect spammers. Based on IP addresses... (1) no reverse DNS lookup (90% of spam does not have set it up); (2) comment poster not logged in.&lt;/p&gt;
&lt;p&gt;Worked well for some time.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3&gt;Spammer profile&lt;/h3&gt;
&lt;p&gt;Poker, mortgage etc. posts.&lt;/p&gt;
&lt;p&gt;Obvious spammers.&lt;/p&gt;
&lt;p&gt;Hidden spam - hidden div, height of text = 1px, etc. Need to disallow styles in wiki.&lt;/p&gt;
&lt;p&gt;...various amusing examples of spammers....&lt;/p&gt;
&lt;p&gt;Spammers may put secret hashes on their posts to be able to check success through google.&lt;/p&gt;
&lt;p&gt;Cross-site scripting (e.g. via an attachment on another site). May bypass javascript filter by spelling JaVaScript with mixed case.&lt;/p&gt;
&lt;h3&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3&gt;Spammer myths&lt;/h3&gt;
&lt;p&gt;No-follow links will stop spammers? Does deny google-juice to spammer, but they will try anyway.&lt;/p&gt;
&lt;p&gt;CAPTCHA? PWNtcha defeates this 80-100%, 40% for good once. Or, human defeat - people do this for 1$/hour.&lt;/p&gt;
&lt;p&gt;Spam is created by SpamBots? No, there are a lot of humans doing this.&lt;/p&gt;
&lt;p&gt;Blocking IP addresses? No more - botnets. Botnets rent out time. Botnets use multiple IP addresses - e.g. 7 hour attach, changing 300 pages, with 120 IP addresses (likely, infected PC's).&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3&gt;Ruse Wiki&lt;/h3&gt;
&lt;p&gt;Spam Resistant Wiki&lt;/p&gt;
&lt;p&gt;Login with valid email will keep spam off, but... not as inviting.&lt;/p&gt;
&lt;p&gt;Integrated tar pit - individual pages can be marked as spam.&lt;/p&gt;
&lt;p&gt;RSS Feeds to detect changes to the site.&lt;/p&gt;
&lt;p&gt;Approval of posts by users promotes or demotes author.&lt;/p&gt;
&lt;p&gt;IP filtering - anonymous users can be marked as spam by ip.&lt;/p&gt;
&lt;p&gt;Content filtering of URL's.&lt;/p&gt;
&lt;p&gt;&amp;quot;No minor changes&amp;quot; - minor changes are not listed in history: very effective.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3&gt;Continuous Arms Race !&lt;/h3&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <pubDate>Sun, 01 Nov 2009 00:05:06 Z</pubDate>
      <guid>http://www.maxwiki.com/WikiSpam</guid>
      <link>http://www.maxwiki.com/WikiSpam</link>
    </item>
    <item>
      <title>RealWorldLessions</title>
      <description>&lt;h3&gt;Lessons From The Real World&lt;/h3&gt;
&lt;p&gt;Dirk Elmendorff, co-founder of Rackspace&lt;/p&gt;
&lt;p&gt;twitter - rails app on rackspace   the steps...&lt;/p&gt;
&lt;h3&gt;build team&lt;/h3&gt;
&lt;p&gt;Somebody who knows rails (an &amp;quot;anchor&amp;quot;) is easier.&lt;/p&gt;
&lt;p&gt;Need to understand where on rails learning curve team members are.&lt;/p&gt;
&lt;p&gt;Buy the book!&lt;/p&gt;
&lt;p&gt;Meta-programming can wait&lt;/p&gt;
&lt;p&gt;Focus on conventions&lt;/p&gt;
&lt;p&gt;brings as example rackspace app for kathrina relief&lt;/p&gt;
&lt;h3&gt;build app&lt;/h3&gt;
&lt;p&gt;get it to play with others&lt;/p&gt;
&lt;p&gt;successful apps change over time&lt;/p&gt;
&lt;p&gt;use tests to get back into the app (&amp;quot;interactive documentation&amp;quot;)&lt;/p&gt;
&lt;p&gt;TDD ... haven't gotten there yet.  I&lt;/p&gt;
&lt;p&gt;n the meantime, put stubs into test suites.&lt;/p&gt;
&lt;p&gt;Have to support IE !&lt;/p&gt;
&lt;p&gt;Selenium lets you use Ajax etc. in browser...&lt;/p&gt;
&lt;p&gt;....at this point I tuned out....&lt;/p&gt;</description>
      <pubDate>Sun, 01 Nov 2009 00:04:54 Z</pubDate>
      <guid>http://www.maxwiki.com/RealWorldLessions</guid>
      <link>http://www.maxwiki.com/RealWorldLessions</link>
    </item>
    <item>
      <title>LegacyRailsTesting</title>
      <description>&lt;h3&gt;Adding Tests to Legacy Rails Apps&lt;/h3&gt;
&lt;p&gt;&lt;em&gt;Evan (Rabble) Henshaw-Plath, Hacker, Independent&lt;/em&gt;&lt;/p&gt;
&lt;h3&gt;Adding tests to legacy rails apps&lt;/h3&gt;
&lt;p&gt;Do legacy apps exist - rails &amp;lt; 3 years old!&lt;/p&gt;
&lt;p&gt;&amp;quot;Who has time for tests?&amp;quot;&lt;/p&gt;
&lt;p&gt;Testing == Health Food - good for you but not yummy&lt;/p&gt;
&lt;p&gt;Testing == debugging!&lt;/p&gt;
&lt;p&gt;Don't do it all at once - you won't pull it off.&lt;/p&gt;
&lt;p&gt;Create test database&lt;/p&gt;
&lt;p&gt;Use migrations&lt;/p&gt;
&lt;p&gt;Scaffolded tests don't work... need to fix them first&lt;/p&gt;
&lt;p&gt;Find a bug - write a test;&lt;/p&gt;
&lt;p&gt;step by step  Refactor a method - write a test&lt;/p&gt;
&lt;p&gt;Test one thing at a time - short 3-5 line things (one assertion)&lt;/p&gt;
&lt;p&gt;Running tests - rake or directly&lt;/p&gt;
&lt;p&gt;GOOD IDEA: use development.log to build tests (has parameters, sql, etc.)&lt;/p&gt;
&lt;h3&gt;Test coverage&lt;/h3&gt;
&lt;p&gt;rake stats  rcov - amazing tool, good graphs&lt;/p&gt;
&lt;p&gt;other tools: heckel&lt;/p&gt;
&lt;p&gt;autotest - great testing tool for immediate feedback&lt;/p&gt;
&lt;p&gt;Fixtures, mocks, pull from database, all have pros and minuses&lt;/p&gt;
&lt;p&gt;zentest..?&lt;/p&gt;
&lt;h3&gt;Heckle: Take Your Tests' Lunch Money&lt;/h3&gt;
&lt;p&gt;&lt;em&gt;Kevin Clark, Powerset&lt;/em&gt;  &amp;quot;&lt;/p&gt;
&lt;p&gt;Mutation Tester&amp;quot;&lt;/p&gt;
&lt;p&gt;Randomly permutates your code, then... runs your tests.&lt;/p&gt;
&lt;p&gt;If tests don't fail, code is useless, or no tests are written.&lt;/p&gt;
&lt;p&gt;heckle SomeController -&amp;gt; output is list of mutations that passed the tests.&lt;/p&gt;</description>
      <pubDate>Sun, 01 Nov 2009 00:04:40 Z</pubDate>
      <guid>http://www.maxwiki.com/LegacyRailsTesting</guid>
      <link>http://www.maxwiki.com/LegacyRailsTesting</link>
    </item>
    <item>
      <title>2revolutions</title>
      <description>&lt;h3&gt;2 revolutions - Alan Francis&lt;/h3&gt;
&lt;p&gt;XP expert, particularly interested in culture and business impact  2004 - got a baby and a Mac, started with Ruby, working at ThoughtWorks  there seems to be cross-over between XP people and Ruby people&lt;/p&gt;
&lt;h3&gt;Parallels between RoR and XP&lt;/h3&gt;
&lt;p&gt;more than software - &amp;quot;change the world&amp;quot;, &amp;quot;programming should be fun&amp;quot;  frameworks are extractions from existing projects/programs  creation myth and cult of personality  reaction to what went on before (php, j2ee)  brash teenager personality, opinionated  less process (XP), less code (RoR)&lt;/p&gt;
&lt;h3&gt;Rails as a Religion&lt;/h3&gt;
&lt;p&gt;Quote by Bill Captuo - &amp;quot;religion is the energy that builds around a good idea&amp;quot;  Religion is the wrong word - &amp;quot;movement&amp;quot; is better (rf. Apple Dictionary)  Movements arise as a reaction to something that was there before.... &amp;quot;RUP&amp;quot; in the case of &amp;quot;XP&amp;quot;  Rails' enemy is J2EE. Parallel is Spring - more light-weight than J2EE.  When will Rails become the enemy of something else.....?&lt;/p&gt;
&lt;h3&gt;Growing Up&lt;/h3&gt;
&lt;p&gt;When revolutions loose their brash teenager attitudes... they've either arrived or fizzled out.&lt;/p&gt;
&lt;h3&gt;Ba'h'ais&lt;/h3&gt;
&lt;p&gt;Bahais believe all religious leaders/prophets are manifestations of the same god.  Analogy: Rails is just one other development in the mold of structured programming, objects, patterns, and XP.  Will Rails remain stuck in teenage land? Ward Cunningham quote - long term success will not come from repeating our dogma's louder.&lt;/p&gt;
&lt;h3&gt;DHH response&lt;/h3&gt;
&lt;p&gt;David was in the room, and didn't quite buy it ...  felt that Rails was actually a train of revolutions itself.&lt;/p&gt;</description>
      <pubDate>Sun, 01 Nov 2009 00:04:25 Z</pubDate>
      <guid>http://www.maxwiki.com/2revolutions</guid>
      <link>http://www.maxwiki.com/2revolutions</link>
    </item>
    <item>
      <title>ScaleWithEC2</title>
      <description>&lt;h1&gt;Scale With Amazon EC2&lt;/h1&gt;
&lt;p&gt;&lt;a href="http://info.rightscale.com/"&gt;RightScale&lt;/a&gt;: Web site that manages Amazon EC2&lt;/p&gt;
&lt;h2&gt;Common Use of EC2&lt;/h2&gt;
&lt;ol&gt;
    &lt;li&gt;Upload data to S3&lt;/li&gt;
    &lt;li&gt;Put request in SQS work queue&lt;/li&gt;
    &lt;li&gt;Fork new servers when needed&lt;/li&gt;
    &lt;li&gt;Put changed data back to S3&lt;/li&gt;
    &lt;li&gt;Put message in SQS when done (or POST to web)&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;RightScale Info&lt;/h2&gt;
&lt;ul&gt;
    &lt;li&gt;RightScale monitors work&amp;nbsp; queue and adds or subtracts servers, puts log files in S3 (which is important because when the EC2 instance goes away, all logs are lost) and produces audit records&lt;/li&gt;
    &lt;li&gt;RightGrid and RightWorker manages the EC2 processes&lt;/li&gt;
    &lt;li&gt;RightScale runs 100% on EC2 itself.&lt;/li&gt;
    &lt;li&gt;Have to have a slave DB from day one, since the master can go away. RightScale also backs up DB every 10 minutes to S3.&lt;/li&gt;
    &lt;li&gt;Slowest part is parsing XML with reXML&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;EC2 Experience&lt;/h2&gt;
&lt;ul&gt;
    &lt;li&gt;Dynamic IP, need Dynamic DNS service&lt;/li&gt;
    &lt;li&gt;Very stable: 3 instances with greater than 170 days uptime, dozen instances with greater than 90 days uptime&lt;/li&gt;
    &lt;li&gt;Have seen spontaneous reboots&lt;/li&gt;
    &lt;li&gt;Amazon is very response&lt;/li&gt;
    &lt;li&gt;It's addictive, watch your credit card&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <pubDate>Sun, 01 Nov 2009 00:04:11 Z</pubDate>
      <guid>http://www.maxwiki.com/ScaleWithEC2</guid>
      <link>http://www.maxwiki.com/ScaleWithEC2</link>
    </item>
    <item>
      <title>CommunityFocussedApps</title>
      <description>&lt;p&gt;&lt;br /&gt;
Building Community-focused Apps with Rails Dan Benjamin&lt;br /&gt;
&lt;br /&gt;
cork'd - developer &amp;amp; designer working together&lt;br /&gt;
500 users after a couple of hours, up to 20k users&lt;br /&gt;
acquired.&lt;br /&gt;
&lt;br /&gt;
cork'd startup data center - mac mini in friend's computer closet&lt;br /&gt;
&lt;br /&gt;
stay agile: resist big infrastructure&lt;br /&gt;
&lt;br /&gt;
build right team&lt;br /&gt;
&lt;br /&gt;
have a revenue stream - ads don't count&lt;br /&gt;
&lt;br /&gt;
focus on simplicity&lt;br /&gt;
&lt;br /&gt;
don't release public beta (do private beta)&lt;br /&gt;
&lt;br /&gt;
resist cool features&lt;br /&gt;
&lt;br /&gt;
web design - make sure all the action is &amp;quot;above the fold&amp;quot;&lt;br /&gt;
&lt;br /&gt;
avoid user-entered data (misspelling, etc)&lt;br /&gt;
&lt;br /&gt;
real-time collaboration (not real-space - the two founders met each&lt;br /&gt;
other during acquisition discussions)&lt;br /&gt;
&lt;br /&gt;
re-use plugins&lt;br /&gt;
- attachment_fu&lt;br /&gt;
- acts_as_taggable&lt;br /&gt;
- ym4r_geocode&lt;br /&gt;
&lt;br /&gt;
Google makes a big difference in getting noticed&lt;br /&gt;
- wine community didn't find out about it through blogs etc&lt;br /&gt;
- cork'd is high on google &lt;br /&gt;
- make sure metatags and description are appropriate&lt;br /&gt;
&lt;br /&gt;
sign up should be obvious and minimal - ask for everything but ask for nothing!&lt;br /&gt;
&lt;br /&gt;
keep non-members from doing the cool things to force signups&lt;br /&gt;
&lt;br /&gt;
keep the coming back for more&lt;br /&gt;
&lt;br /&gt;
make frequent improvements, and avoid &amp;quot;big releases&amp;quot;&lt;br /&gt;
&lt;br /&gt;
respond positively to your members - be nice!!! always!&amp;nbsp; apologize first&lt;br /&gt;
&lt;br /&gt;
share your api&lt;/p&gt;</description>
      <pubDate>Sun, 01 Nov 2009 00:03:46 Z</pubDate>
      <guid>http://www.maxwiki.com/CommunityFocussedApps</guid>
      <link>http://www.maxwiki.com/CommunityFocussedApps</link>
    </item>
    <item>
      <title>CleanCode</title>
      <description>&lt;h1&gt;Clean Code&lt;/h1&gt;
&lt;ul&gt;
    &lt;li&gt;Don't do big restructure, improve incrementally.
    &lt;ul&gt;
        &lt;li&gt;One of the berst ways to ruin a probem is to make massive changes in the name of improvement&lt;/li&gt;
        &lt;li&gt;Keep the system running at all times&lt;/li&gt;
        &lt;li&gt;Make a tiny change, then run the tests&lt;/li&gt;
    &lt;/ul&gt;
    &lt;/li&gt;
    &lt;li&gt;Always check-in code a little better than it was before.&lt;/li&gt;
    &lt;li&gt;Testing: rspec, test_unit&lt;/li&gt;
    &lt;li&gt;Open/Closed Principal: open for extension but closed for modification - or - create a barrier between those things that change and those things that don't.&lt;/li&gt;
    &lt;li&gt;Professionals write tests first&lt;/li&gt;
    &lt;li&gt;Professionals cleanup code&lt;/li&gt;
    &lt;li&gt;Professionals know that the only way to go fast -- is to go well&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Is it worth it to clean up code?&lt;/h2&gt;
&lt;ul&gt;
    &lt;li&gt;Bad code gets harder and harder to clean as time goes by.&lt;/li&gt;
    &lt;li&gt;You should clean code as soon as it gets messy.&lt;/li&gt;
    &lt;li&gt;This takes less time than debugging code later&lt;/li&gt;
    &lt;li&gt;Nothing has a more profound and long-term degrading effect than bad code:
    &lt;ul&gt;
        &lt;li&gt;Bad schedules can be redone&lt;/li&gt;
        &lt;li&gt;Bad requirements can be redefined&lt;/li&gt;
        &lt;li&gt;Bad team dynamcis can be resolved&lt;/li&gt;
    &lt;/ul&gt;
    &lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Analogy: What is the quickets way to be done with dinner?&lt;/h2&gt;
&lt;ul&gt;
    &lt;li&gt;After dinnner, get up and walk away and don't clear or do the dishes&lt;/li&gt;
    &lt;li&gt;Or, keep the dishes clean all the time&lt;/li&gt;
    &lt;li&gt;Dinner will take longer, but the whole process of preparing dinner will be quicker&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Links&lt;/h2&gt;
&lt;ul&gt;
    &lt;li&gt;&lt;a href="http://conferences.oreillynet.com/cs/rails2007/view/e_sess/11608"&gt;Session Description&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <pubDate>Sun, 01 Nov 2009 00:03:27 Z</pubDate>
      <guid>http://www.maxwiki.com/CleanCode</guid>
      <link>http://www.maxwiki.com/CleanCode</link>
    </item>
  </channel>
</rss>
