<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="http://feeds.feedburner.com/~d/styles/rss2full.xsl" type="text/xsl" media="screen"?><?xml-stylesheet href="http://feeds.feedburner.com/~d/styles/itemcontent.css" type="text/css" media="screen"?><rss xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">
  <channel>
    <title>Myers DS Notebook</title>
    <link>http://myersds.com/notebook</link>
    <description>From the Notebook of Larry Myers at the Myers Development Studio. Thoughts on Freelancing, Ruby on Rails, Webdesign, and technology.</description>
    <language>en-us</language>
    <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/myersds" type="application/rss+xml" /><feedburner:browserFriendly></feedburner:browserFriendly><item>
      <title>Integrating Ruby and Linkpoint</title>
      <description>&lt;p&gt;Well, after a decent summer hiatus, I&amp;#8217;ve returned to the blog, brushed the dust off, and am ready to start writing again.&lt;/p&gt;


	&lt;p&gt;To kick things off code must be posted. A recent project involved using Linkpoint to make credit card transactions over the internet. Now yes, &lt;a href="http://www.activemerchant.org/"&gt;Active Merchant&lt;/a&gt; does support linkpoint as a gateway, I just couldn&amp;#8217;t get it work right. I tried several times, futzed a bit, and eventually just wrote my own code since I wasn&amp;#8217;t needing to do anything fancy.&lt;/p&gt;


	&lt;p&gt;Hats off to the guys behind Shopify and Active Merchant, I am very impressed with how Active Merchant has evolved, but sometimes it just ends up being easier to roll your own.&lt;/p&gt;


	&lt;p&gt;Here&amp;#8217;s the proof of concept code I wrote that ended up giving me a &amp;#8220;Hello World!&amp;#8221; as far as the realm of e-commerce goes. This also demonstrates using Net::HTTPS, which might possibly be the most poorly documented part of the ruby standard library. I&amp;#8217;d go so far to say that it is downright hidden.&lt;/p&gt;


	&lt;p&gt;Obviously I wouldn&amp;#8217;t recommend just copy/pasting this into a production environment.&lt;/p&gt;


&lt;pre&gt;
require 'net/https'
require 'rubygems'
require 'builder'

url = 'https://staging.linkpt.net:1129/'
login = '1234567890' # Your store number goes here
pem_file = File.open('1234567890.pem').read # your cert/key goes here

data = "" 
b = Builder::XmlMarkup.new(:target =&amp;gt; data, :indent =&amp;gt; 2)

b.instruct!
b.order do
  b.merchantinfo do
    b.configfile login
  end
  b.orderoptions do
    b.ordertype 'SALE'
  end
  b.payment do
    b.chargetotal '1.00'
  end
  b.creditcard do
    b.cardnumber '4111111111111111'
    b.cardexpmonth '1'
    b.cardexpyear '08'
  end
  b.periodic do
    b.action 'SUBMIT'
    b.installments '12'
    b.threshold '3'
    b.startdate 'immediate'
    b.periodicity 'monthly'
  end
end

puts data

uri = URI.parse(url)

http = Net::HTTP.new(uri.host, uri.port) 
http.use_ssl = true
http.verify_mode    = OpenSSL::SSL::VERIFY_NONE
http.cert = OpenSSL::X509::Certificate.new(pem_file)
http.key = OpenSSL::PKey::RSA.new(pem_file)

response = http.post(uri.path, data)

puts response.body
&lt;/pre&gt;</description>
      <author>Larry Myers</author>
      <pubDate>Sat, 25 Aug 2007 02:24:04 +0000</pubDate>
      <link>http://myersds.com/notebook/2007/08/25/integrating_ruby_and_linkpoint</link>
      <guid>http://myersds.com/notebook/2007/08/25/integrating_ruby_and_linkpoint</guid>
    </item>
    <item>
      <title>How to Guarantee a Code Rewrite</title>
      <description>&lt;p&gt;Like everything else, code tends to move toward &lt;a href="http://en.wikipedia.org/wiki/Second_law_of_thermodynamics"&gt;increasing entropy&lt;/a&gt;. But software developers tend to like things nice and orderly, because being able to maintain your code is a good thing. Software (unlike hardware) rarely lives in a sealed box, and will mostly like be patched, upgraded, changed frequently. Unfortunately most of these changes are made as quick hacks due to the nature of people wanting things yesterday, or the day before that if at all possible.&lt;/p&gt;


	&lt;p&gt;After a certain period your code will make you queasy, and when at that point the overwhelming urge to rewrite the whole thing becomes almost impossible to ignore.&lt;/p&gt;


	&lt;p&gt;Everybody loves a rewrite. You get to correct past mistakes, do things &amp;#8220;the right way&amp;#8221;, and finally get to attack all those warts that were the result of that last quick fix before the latest release.&lt;/p&gt;


	&lt;p&gt;(Chad Fowler has written several pieces about the &lt;a href="http://www.chadfowler.com/the-big-rewrite"&gt;inherent danger&lt;/a&gt; of the rewrite.)&lt;/p&gt;


	&lt;h2&gt;How to Prevent a Rewrite&lt;/h2&gt;


	&lt;p&gt;As a developer your goal should be to prevent the rewrite at all costs. It may seem like fun at first, it will become painful, especially if you have a tight deadline.&lt;/p&gt;


	&lt;p&gt;So how do you prevent your code from being tossed and rewritten? It&amp;#8217;s easy.&lt;/p&gt;


	&lt;p&gt;&lt;strong&gt;Write readable code.&lt;/strong&gt;&lt;/p&gt;


	&lt;p&gt;Really, it&amp;#8217;s as simple as that. Your code should have plenty of whitespace, decent layout, comments &amp;#8230; you know, all that stuff you know you should do, but never really do. If your code isn&amp;#8217;t readable then it&amp;#8217;s only a matter of time until it gets yanked out of the repository and rewritten (many times by yourself).&lt;/p&gt;


	&lt;p&gt;No matter how slow or buggy your code is, as long as people can understand what in the world is going on there&amp;#8217;s at least a fighting chance that a much easier refactoring will happen instead of a complete rewrite.&lt;/p&gt;


	&lt;p&gt;It doesn&amp;#8217;t matter what language you are using, even verbose monsters like Java can result in well written code that be read cleanly. So please, write readable code, because someone is going to have to look at it one of these days.&lt;/p&gt;</description>
      <author>Larry Myers</author>
      <pubDate>Wed, 27 Jun 2007 12:42:46 +0000</pubDate>
      <link>http://myersds.com/notebook/2007/06/27/how_to_guarantee_a_code_rewrite</link>
      <guid>http://myersds.com/notebook/2007/06/27/how_to_guarantee_a_code_rewrite</guid>
    </item>
    <item>
      <title>That Old British Guy</title>
      <description>&lt;p&gt;&amp;#8220;Broadly speaking, the short words are the best, and the old words best of all.&amp;#8221;&lt;/p&gt;


	&lt;p&gt;- Winston Churchill&lt;/p&gt;


	&lt;p&gt;It seems like the topic of &lt;a href="http://www.codinghorror.com/blog/archives/000878.html"&gt;less code being better&lt;/a&gt; has started to spring up again. Though I do like the Wil Shipley&amp;#8217;s spin on the meme about &lt;a href="http://wilshipley.com/blog/2007/05/pimp-my-code-part-14-be-inflexible.html"&gt;making your code inflexible&lt;/a&gt;.  I figure it&amp;#8217;s only a matter of time before people start blogging again about &lt;a href="http://blogs.msdn.com/oldnewthing/archive/2007/04/06/2036150.aspx"&gt;writing code to be readable&lt;/a&gt;.&lt;/p&gt;


	&lt;p&gt;This is why Ruby is a fantastic language. It is one of the only languages I&amp;#8217;ve ever used where I can write code, leave it alone for 6 months, and still have an idea of what&amp;#8217;s going on when I come back to it. Ruby may not be as fast as C, or have a VM like Java and .NET, but it resists &lt;a href="http://en.wikipedia.org/wiki/Software_rot"&gt;code rot&lt;/a&gt; far better than any other language I&amp;#8217;ve ever used.&lt;/p&gt;</description>
      <author>Larry Myers</author>
      <pubDate>Fri, 01 Jun 2007 11:29:19 +0000</pubDate>
      <link>http://myersds.com/notebook/2007/06/01/that_old_british_guy</link>
      <guid>http://myersds.com/notebook/2007/06/01/that_old_british_guy</guid>
    </item>
    <item>
      <title>Investigating RubyWorks</title>
      <description>&lt;p&gt;I was reading on &lt;a href="http://www.loudthinking.com/posts/5-digesting-railsconf-2007"&gt;&lt;span class="caps"&gt;DHH&lt;/span&gt;&amp;#8217;s blog&lt;/a&gt; that more than 40% of ThoughtWorks new projects are in Ruby. This is exciting, because getting both Ruby and Rails into big business environments will go a long way towards both the legitimacy of Ruby and helping ease the pain of being stuck in a Java monoculture.&lt;/p&gt;


	&lt;p&gt;Digging around the ThoughtWorks site led me to their &lt;a href="http://studios.thoughtworks.com/rubyworks"&gt;RubyWorks page&lt;/a&gt; and the associated &lt;a href="http://rubyworks.rubyforge.org/"&gt;rubyforge project&lt;/a&gt;. My first reaction was pure excitement. In a nutshell RubyWorks is Ruby, Rails, Mongrel, and a few other tools bundled into a single package, with some magic to configure everything out of the box.&lt;/p&gt;


	&lt;p&gt;Supplying a supported one-click install for &lt;span class="caps"&gt;RHEL&lt;/span&gt; and Cent OS is exactly what is needed to help get Ruby into big business. If you&amp;#8217;ve never worked in an &amp;#8220;Enterprise&amp;#8221; environment before, it has everything to do with support contracts and using software that been around long enough that all the gotchas and pitfalls are publicly known.&lt;/p&gt;


	&lt;p&gt;(Believe it or not, being &amp;#8220;Enterprise ready&amp;#8221; rarely has anything to do with performance and well written software. I&amp;#8217;ve seen &lt;span class="caps"&gt;J2EE&lt;/span&gt; web apps in production that are so far away from good programming practices that the mind boggles.)&lt;/p&gt;


	&lt;p&gt;I&amp;#8217;m excited to see what the ThoughtWorks guys can do with Ruby, Rails, and JRuby this summer. The faster Ruby gets established in big business the better.&lt;/p&gt;</description>
      <author>Larry Myers</author>
      <pubDate>Tue, 29 May 2007 00:56:36 +0000</pubDate>
      <link>http://myersds.com/notebook/2007/05/29/investigating_rubyworks</link>
      <guid>http://myersds.com/notebook/2007/05/29/investigating_rubyworks</guid>
    </item>
    <item>
      <title>DBI and Very Large Data Sets</title>
      <description>&lt;p&gt;Recently I had to do some post processing on a MySQL table with 10+ million rows of data. The amount of logic involved necessitated the use of a script, and stored procedures weren&amp;#8217;t an option. The problem was that storing that many rows in memory really isn&amp;#8217;t feasible, unless you&amp;#8217;re blessed with several gigs of memory just sitting around unused.&lt;/p&gt;


	&lt;p&gt;Also, when using a garbage collected language (Ruby, Python, Perl &amp;#8230; or if you must, Java), you just don&amp;#8217;t have as much control over your memory usage, so the problem of keeping memory allocation under control is compounded.&lt;/p&gt;


	&lt;h2&gt;Two Options (That I Couldn&amp;#8217;t Use)&lt;/h2&gt;


	&lt;p&gt;&lt;strong&gt;1. Cursors&lt;/strong&gt;

	&lt;p&gt;If you are using a database that supports cursors, this is a great time to use them. Buffer the data to your script in a reasonably sized chunk. Problem solved.&lt;/p&gt;
&lt;/p&gt;


	&lt;p&gt;&lt;strong&gt;2. mysql_use_result&lt;/strong&gt;&lt;/p&gt;


	&lt;p&gt;Rather than reading all the data at once to a local buffer, you can use &lt;a href="http://dev.mysql.com/doc/refman/5.0/en/mysql-use-result.html"&gt;mysql_use_result&lt;/a&gt; to read the data directly from the database as you need it.&lt;/p&gt;


	&lt;p&gt;This wasn&amp;#8217;t an option for me since it&amp;#8217;s a blocking process and I needed to write the updated rows back to the table as they were processed.&lt;/p&gt;


	&lt;h2&gt;Paging, with a Twist&lt;/h2&gt;


	&lt;p&gt;&lt;em&gt;Update: The solution below stands true for Perl &lt;span class="caps"&gt;DBI&lt;/span&gt;/DBD-mysql. When using Mysql/Ruby&amp;#8217;s free method on Mysql::Result objects it frees up memory just fine. No need to use two scripts when paging.&lt;/em&gt;&lt;/p&gt;


	&lt;p&gt;My first instinct was to use &lt;span class="caps"&gt;LIMIT&lt;/span&gt; and &lt;span class="caps"&gt;OFFSET&lt;/span&gt; to page through the data in reasonably sized chunks.  Yes, it does hurt to have the sort the table every time before you can return data, and this method isn&amp;#8217;t terribly fast when your offset gets big. But it does work.&lt;/p&gt;


	&lt;p&gt;The problem is that reusing the same statement handle over and over again was that the script still eating a ton of memory during the process (which was rather long running, several hours minimum). The memory would never be released until the script finally exited. My research led me to the answer that this is just an unfortunate side effect of the way most garbage collectors work.&lt;/p&gt;


	&lt;p&gt;The solution? Have the script that does the actual processing work run separate from the script that determines the offset for each pass through the loop. What you end up with is a script that invokes the processing script as a separate instance for each page of data returned from the database. As each child process exits the memory is released back to the OS.&lt;/p&gt;


	&lt;p&gt;Some pseudo code (should be similar logic for Perl, Ruby, and Python):&lt;/p&gt;


	&lt;p&gt;The parent script:&lt;/p&gt;


&lt;pre&gt;
total_rows = statement.exec( SELECT COUNT(*) FROM table )
limit = 100000
offset = 0

while ( offset &amp;lt;= total_rows )
  system(processor_script limit offset)

  offset += limit
end
&lt;/pre&gt;

	&lt;p&gt;And the child script:&lt;/p&gt;


&lt;pre&gt;
chunk = statement.exec( SELECT * FROM table ORDER BY id LIMIT limit OFFSET offset )

for each row in chunk
  do some processing logic here
end  
&lt;/pre&gt;

	&lt;p&gt;It still kind of strikes me as a hack, but it works. The memory usage of each invocation of the script stayed well under 50 mb of memory, which was a big difference from the several hundred mb of memory the script was previously eating up.&lt;/p&gt;</description>
      <author>Larry Myers</author>
      <pubDate>Fri, 25 May 2007 04:10:01 +0000</pubDate>
      <link>http://myersds.com/notebook/2007/05/25/dbi_and_very_large_data_sets</link>
      <guid>http://myersds.com/notebook/2007/05/25/dbi_and_very_large_data_sets</guid>
    </item>
    <item>
      <title>Dabbling in Python and Perl</title>
      <description>&lt;p&gt;The past few months have given me the chance to explore both Python and Perl a bit. I&amp;#8217;m using both languages to generate simple scripts, nothing web related yet. Since I&amp;#8217;ve been working almost exclusively with Ruby for the past few years it&amp;#8217;s been nice to get a different perspective when it comes to dynamic languages.&lt;/p&gt;


	&lt;h2&gt;Python&lt;/h2&gt;


	&lt;p&gt;First off, using whitespace instead of brackets or begin .. end didn&amp;#8217;t bother me at all. People who dismiss Python because of the indentation rules need to get over themselves. I was also very impressed with the overall polish of the docs and libraries. Python definitely makes it easy to get things done, and never had to look hard for a library and documentation to accomplish a task. I especially appreciate that MySQLdb for Python emulates cursors in ways that I&amp;#8217;d expect.&lt;/p&gt;


	&lt;p&gt;One of the things that bothered me was that Python can&amp;#8217;t make up it&amp;#8217;s mind when it comes to functions. Most string functions are Ruby style (i.e. &amp;#8220;hello&amp;#8221;.strip(&amp;#8216;ell&amp;#8217;) ), but then there&amp;#8217;s weird exceptions like len(). Why you would have len(&amp;#8220;hello&amp;#8221;) instead of &amp;#8220;hello&amp;#8221;.len() is beyond me.&lt;/p&gt;


	&lt;p&gt;Overall though I came away with a good impression of Python, and think Ruby could learn something from the quality of the documentation and libraries. I&amp;#8217;m hoping this will come naturally as the Ruby community continues to grow.&lt;/p&gt;


	&lt;h2&gt;Perl&lt;/h2&gt;


	&lt;p&gt;I understand why people tend to rip apart Perl when given the chance.  Yes, yes, I realize Perl has &lt;span class="caps"&gt;CPAN&lt;/span&gt;, and it has about every library under the sun, but I haven&amp;#8217;t found it a good enough excuse to voluntarily use the language when given a choice. The syntax made my head hurt, and once I wrote more than a few hundred lines of code I found it hard to keep my train of thought as I worked through a program.&lt;/p&gt;


	&lt;p&gt;The one thing that struck me as odd about Perl, yet I kind of liked, what that for many of its functions it just used the syntax of many of its unix equivalents. If you know sed then you know how to do string  replacement in Perl.&lt;/p&gt;


	&lt;h2&gt;A Recommendation&lt;/h2&gt;


	&lt;p&gt;Perl programmers, please, please move to Ruby. You will find yourself happier and with much more readable code. You will also get a language where object oriented features don&amp;#8217;t feel tacked on and half finished.&lt;/p&gt;</description>
      <author>Larry Myers</author>
      <pubDate>Wed, 23 May 2007 23:57:48 +0000</pubDate>
      <link>http://myersds.com/notebook/2007/05/23/dabbling_in_python_and_perl</link>
      <guid>http://myersds.com/notebook/2007/05/23/dabbling_in_python_and_perl</guid>
    </item>
    <item>
      <title>How To Build JRuby on OS X</title>
      <description>&lt;p&gt;The JRuby has been getting a lot of press lately. It&amp;#8217;s got support in NetBeans, and is getting a lot of support from Sun. It looks like it&amp;#8217;s a popular topic at this year&amp;#8217;s JavaOne as well.&lt;/p&gt;


	&lt;p&gt;JRuby is exciting because it gets Ruby a backdoor to the corporate world. Tomcat and Java 1.5 are common enough in big business these days, and with JRuby nearing 1.0 we&amp;#8217;ll soon have a way to write Ruby code and not have to ruffle the feathers of sys admins with new dependencies for deployment.&lt;/p&gt;


	&lt;p&gt;Here&amp;#8217;s how to get JRuby up and running on your Mac.&lt;/p&gt;


	&lt;h2&gt;What You&amp;#8217;ll Need&lt;/h2&gt;


	&lt;p&gt;&lt;strong&gt;Download JRuby&lt;/strong&gt;&lt;/p&gt;


	&lt;p&gt;First you&amp;#8217;ll need to download the JRuby source, since we&amp;#8217;ll be building it ourselves. You can get the current release from the &lt;a href="http://jruby.codehaus.org/"&gt;JRuby Homepage&lt;/a&gt;. I used version 0.9.9 when writing this.&lt;/p&gt;


	&lt;p&gt;&lt;strong&gt;Install the Developer Tools&lt;/strong&gt;&lt;/p&gt;


	&lt;p&gt;If you haven&amp;#8217;t already, you&amp;#8217;ll need to install the &lt;span class="caps"&gt;OS X&lt;/span&gt; Developer Tools. You can find them on the install DVDs that came with your Mac. This gets us Ant, which we&amp;#8217;ll need later. If you already have Ant installed from somewhere else, just make sure it&amp;#8217;s version 1.6.2 or greater (the Developer Tools version is 1.6.5).&lt;/p&gt;


	&lt;h2&gt;Set Your Environment Variables&lt;/h2&gt;


	&lt;p&gt;Add these two lines to your ~/.bash_profile:&lt;/p&gt;


&lt;pre&gt;
export JAVA_HOME='/System/Library/Frameworks/JavaVM.framework/Home'
export ANT_HOME='/Developer/Java/ant'
&lt;/pre&gt;

	&lt;h2&gt;Build JRuby and Run the Tests&lt;/h2&gt;


	&lt;p&gt;Now you should have your build environment all set and ready to go. First extract the source files and go into the directory that is created:&lt;/p&gt;


&lt;pre&gt;
tar xvzf jruby-src-0.9.9.tar.gz
cd jruby-0.9.9
&lt;/pre&gt;

	&lt;p&gt;Copy the provided JUnit lib over to Ant:&lt;/p&gt;


&lt;pre&gt;
cp lib/junit.jar /Developer/Java/ant/lib/.
&lt;/pre&gt;

	&lt;p&gt;And finally:&lt;/p&gt;


&lt;pre&gt;
ant test
&lt;/pre&gt;

	&lt;p&gt;You should see a bunch of output, and after about a minute or so you should see all the included tests (hopefully) pass. Now you can run one of the samples just as a sanity check:&lt;/p&gt;


&lt;pre&gt;
bin/jruby samples/fib.rb
&lt;/pre&gt;

	&lt;p&gt;And there you have it, JRuby on &lt;span class="caps"&gt;OS X&lt;/span&gt; ready to go.&lt;/p&gt;</description>
      <author>Larry Myers</author>
      <pubDate>Fri, 11 May 2007 02:21:39 +0000</pubDate>
      <link>http://myersds.com/notebook/2007/05/11/how_to_build_jruby_on_os_x</link>
      <guid>http://myersds.com/notebook/2007/05/11/how_to_build_jruby_on_os_x</guid>
    </item>
    <item>
      <title>Code Bloat Without Trying</title>
      <description>&lt;p&gt;Which one of these four was designed by a committee with a fluffed up ego?&lt;/p&gt;


	&lt;p&gt;(Go look at this &lt;a href="http://hackety.org/2007/05/09/soGooeyCanYouSeeTheButton.html"&gt;brief post&lt;/a&gt; on Hackety, really, go ahead, I&amp;#8217;ll wait.)&lt;/p&gt;


	&lt;p&gt;Ladies and gentlemen, I give you Silverlight! Guaranteed to make code unintelligible and absolutely requiring an &lt;span class="caps"&gt;IDE&lt;/span&gt; to generate most of it for you!&lt;/p&gt;


	&lt;p&gt;Tcl/Tk has been around forever (at least in internet terms), and you can tell that it was designed for people that want to create things, not wallow in schemas and brackets.&lt;/p&gt;


	&lt;p&gt;I think Microsoft might have missed the boat on this one, no matter how whiz-bang-cool the technology is.&lt;/p&gt;</description>
      <author>Larry Myers</author>
      <pubDate>Thu, 10 May 2007 20:39:34 +0000</pubDate>
      <link>http://myersds.com/notebook/2007/05/10/code_bloat_without_trying</link>
      <guid>http://myersds.com/notebook/2007/05/10/code_bloat_without_trying</guid>
    </item>
    <item>
      <title>Performance Gains using MySQL Full-Text Searches</title>
      <description>&lt;p&gt;A recent project required me to do searching on some text fields stored in a MySQL database. In the past I&amp;#8217;ve used statements like this:&lt;/p&gt;


	&lt;p&gt;&lt;code&gt;SELECT name FROM people WHERE name LIKE '%bob jones%';&lt;/code&gt;&lt;/p&gt;


	&lt;p&gt;Now this works fine for smaller sets of data, but when you suddenly have data sets with millions of records it no longer works (at least if you remotely care about performance). A normal index won&amp;#8217;t do much good either, since MySQL won&amp;#8217;t use an index if your search string has a leading wildcard.&lt;/p&gt;


	&lt;p&gt;The solution? MySQL&amp;#8217;s full-text search.&lt;/p&gt;


	&lt;p&gt;First thing to do is to add the index to the table:&lt;/p&gt;


	&lt;p&gt;&lt;code&gt;ALTER TABLE people ADD FULLTEXT INDEX name_index(name);&lt;/code&gt;&lt;/p&gt;


	&lt;p&gt;Now you can search against the table like this:&lt;/p&gt;


	&lt;p&gt;&lt;code&gt;SELECT name FROM people WHERE MATCH(name) AGAINST ('"bob jones"' IN BOOLEAN MODE);&lt;/code&gt;&lt;/p&gt;


	&lt;p&gt;Now I&amp;#8217;m using boolean searches to get an exact match on the name &amp;#8220;bob jones&amp;#8221;, but you can drop the boolean mode and you&amp;#8217;ll get search results based off relevancy. MySQL actually has some &lt;a href="http://dev.mysql.com/doc/refman/5.0/en/fulltext-search.html"&gt;pretty good documentation&lt;/a&gt; on everything you can do with full-text searches.&lt;/p&gt;


	&lt;p&gt;In my research I was seeing incredible performance improvements, I had queries which were previously taking 250-275 seconds reduced to 0.5 seconds.&lt;/p&gt;


	&lt;p&gt;Also, as always, be aware that your inserts will take longer since the table will have to regenerate indexes with every insert. The MySQL docs has a good section on how to &lt;a href="http://dev.mysql.com/doc/refman/5.0/en/insert-speed.html"&gt;increase the speed of your inserts&lt;/a&gt; to minimize the hit you take from using indexes.&lt;/p&gt;</description>
      <author>Larry Myers</author>
      <pubDate>Wed, 09 May 2007 01:16:28 +0000</pubDate>
      <link>http://myersds.com/notebook/2007/04/18/performance_gains_using_mysql_full-text_searches</link>
      <guid>http://myersds.com/notebook/2007/04/18/performance_gains_using_mysql_full-text_searches</guid>
    </item>
    <item>
      <title>Simplist 2 For Public Consumption</title>
      <description>&lt;p&gt;A quick note for those of you read regularly, I&amp;#8217;ve stripped out the Myers DS specific code of Simplist 2 and made it available for anyone who wants to try it out. It requires a little leg work to get it up and running, just like any Rails app, but the migrations get you up and running right away and there&amp;#8217;s very generic design to start with.&lt;/p&gt;


	&lt;p&gt;&lt;a href="/simplist_cms"&gt;Simplist &lt;span class="caps"&gt;CMS&lt;/span&gt; Download Page&lt;/a&gt;&lt;/p&gt;


	&lt;p&gt;If you missed the &lt;a href="http://myersds.com/notebook/2007/04/03/running_on_simplist_2"&gt;announcement&lt;/a&gt;, I&amp;#8217;ve rewritten the &lt;span class="caps"&gt;CMS&lt;/span&gt; that powers this site on Rails 1.2. The code is cleaner, the interface is easier to work with, and I feel it&amp;#8217;s a substantial improvement over the original version. Check it out if you&amp;#8217;re looking for a &lt;span class="caps"&gt;CMS&lt;/span&gt; that works with you and serves a good base for building a Rails app that needs content management functionality.&lt;/p&gt;


	&lt;p&gt;Feel free to &lt;a href="/contact"&gt;contact&lt;/a&gt; me with any questions, comments, or bugs you find.&lt;/p&gt;</description>
      <author>Larry Myers</author>
      <pubDate>Mon, 23 Apr 2007 22:24:16 +0000</pubDate>
      <link>http://myersds.com/notebook/2007/04/23/simplist_2_for_public_consumption</link>
      <guid>http://myersds.com/notebook/2007/04/23/simplist_2_for_public_consumption</guid>
    </item>
  </channel>
</rss>
