<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss version="2.0">
  <channel>
    <title>mary rose cook</title>
    <link>http://www.maryrosecook.com/blog/rss</link>
    <description>mary rose cook's diary and mask</description>
    <language>en-uk</language>
    <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/maryrosecook" type="application/rss+xml" /><item>
      <title>Plosiv</title>
      <description>Plosiv helps you live with the pizazz, the panache, you always wanted.
&lt;br/&gt;
&lt;br/&gt;Now, you can follow a depression of the mind with a depression of a button that precipitates a depression of the air.  A sense of drama will pervade your actions.  A feeling of significance, or tension.
&lt;br/&gt;
&lt;br/&gt;Some have an impact that others lack: movie stars set hearts thumping, video game characters have combustible accessories and musicians are supported by the drop.
&lt;br/&gt;
&lt;br/&gt;Imagine if you could walk into a room and have everyone&amp;#8217;s gaze drawn to you.  Imagine seeing a pretty young lady&amp;#8217;s eyes widen as you deliver a telling insight.  Imagine your father clapping you on the back with the approval and trust you always wanted.
&lt;br/&gt;
&lt;br/&gt;With Plosiv, all this is possible.
&lt;br/&gt;
&lt;br/&gt;It&amp;#8217;s so simple.  Keep it in your pocket.  Finger its hand-crafted, noir-sheen plastic.  And, when you need that extra emphasis, press the button.
&lt;br/&gt;
&lt;br/&gt;Plosiv. Individual emphasis.</description>
      <pubDate>Tue, 04 Nov 2008 18:08:00 +0000</pubDate>
      <link>http://www.maryrosecook.com/post/show/133</link>
      <guid>http://www.maryrosecook.com/post/show/133</guid>
    </item>
    <item>
      <title>Saw Oxes live at The Luminaire in London on Tuesday.  They were pretty fucking great:

&lt;object width="425" height="344"&gt;&lt;param name="movie" value="http://www.youtube.com/v/K5pPCJuJDWc&amp;hl=en&amp;fs=1"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/K5pPCJuJDWc&amp;hl=en&amp;fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"&gt;&lt;/embed&gt;&lt;/object&gt;
</title>
      <description>Saw Oxes live at The Luminaire in London on Tuesday.  They were pretty fucking great:
&lt;br/&gt;
&lt;br/&gt;&lt;object width="425" height="344"&gt;&lt;param name="movie" value="http://www.youtube.com/v/K5pPCJuJDWc&amp;#38;hl=en&amp;#38;fs=1"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/K5pPCJuJDWc&amp;#38;hl=en&amp;#38;fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"&gt;&lt;/embed&gt;&lt;/object&gt;
&lt;br/&gt;</description>
      <pubDate>Fri, 31 Oct 2008 14:04:00 +0000</pubDate>
      <link>http://www.maryrosecook.com/post/show/132</link>
      <guid>http://www.maryrosecook.com/post/show/132</guid>
    </item>
    <item>
      <title>SCJP</title>
      <description>&lt;img src="http://werenotthecoolkids.com/images/scjpnihilism.jpg"&gt;</description>
      <pubDate>Thu, 23 Oct 2008 13:09:00 +0000</pubDate>
      <link>http://www.maryrosecook.com/post/show/131</link>
      <guid>http://www.maryrosecook.com/post/show/131</guid>
    </item>
    <item>
      <title>Giles Bowkett is rocking my world.  Not just for &lt;a href='http://gilesbowkett.blogspot.com/2008/01/drive-propellerhead-reason-with-ruby.html'&gt;Archaeopteryx&lt;/a&gt;, not just for his rant about VC and paternal patronage (a tautology) but because of the way he just hacks away at stuff because it's fun.  I do that, too, but I don't have his admirable ability to not care if no one else cares.</title>
      <description>Giles Bowkett is rocking my world.  Not just for &lt;a href='http://gilesbowkett.blogspot.com/2008/01/drive-propellerhead-reason-with-ruby.html'&gt;Archaeopteryx&lt;/a&gt;, not just for his rant about VC and paternal patronage (a tautology) but because of the way he just hacks away at stuff because it&amp;#8217;s fun.  I do that, too, but I don&amp;#8217;t have his admirable ability to not care if no one else cares.</description>
      <pubDate>Tue, 07 Oct 2008 22:24:00 +0000</pubDate>
      <link>http://www.maryrosecook.com/post/show/129</link>
      <guid>http://www.maryrosecook.com/post/show/129</guid>
    </item>
    <item>
      <title>Creating a music recommendation engine</title>
      <description>I have spent the last six weeks writing a music recommendation engine, theperceptron.com It was fun.
&lt;br/&gt;
&lt;br/&gt;&lt;strong&gt;From the user’s perspective:&lt;/strong&gt;
&lt;br/&gt;&lt;ol&gt;&lt;li&gt;Enter a band you like.&lt;/li&gt;&lt;li&gt;Get recommendations for other bands you might also like.&lt;/li&gt;&lt;li&gt;Test out the artists recommended by visiting their Myspaces and websites, reading their Wikipedia summaries and listening to sample tracks.&lt;/li&gt;&lt;li&gt;Say whether you like or dislike your recommended bands.&lt;/li&gt;&lt;li&gt;Add promising bands to your playlist so you can listen later.&lt;/li&gt;&lt;li&gt;Suggest an artist or two that the site didn’t recommended.&lt;/li&gt;&lt;li&gt;Get on with your life.&lt;/li&gt;&lt;/ol&gt;&lt;strong&gt;From the code’s perspective:&lt;/strong&gt;
&lt;br/&gt;
&lt;br/&gt;Recommendations are made based on connections between artists. These connections are found in data taken from the internet:
&lt;br/&gt;&lt;ul&gt;&lt;li&gt;Recommendations made by actual humans: tinymixtapes.com and epitonic.com and users of the perceptron.&lt;/li&gt;&lt;li&gt;Artist admiration: artists’ top friends on Myspace.&lt;/li&gt;&lt;li&gt;Artists on the same mixtape: muxtape.com&lt;/li&gt;&lt;li&gt;Artists on the same record label: wikipedia.org&lt;/li&gt;&lt;li&gt;Artists posted to the same mp3 blog: hypem.com&lt;/li&gt;&lt;li&gt;Artists who have played gigs together: myspace.com&lt;/li&gt;&lt;/ul&gt;Each rating action that a user can perform on a recommended artist – liking or disliking, visiting websites, listening to songs or adding them to the playlist – is associated with a certain number of points. These points are used in two ways. First, each source has a running total of points given to the recommendations made by the source. Second, each artist connection has a running total of the number of points it has accrued.
&lt;br/&gt;
&lt;br/&gt;Recommendations are given a score based upon these point totals. Ignoring the weightings of the source and connection score, a recommendation&amp;#8217;s score is calculated thus:
&lt;br/&gt;
&lt;br/&gt;&lt;em&gt;score = (source_points + connection_points) / num_source_connections&lt;/em&gt;
&lt;br/&gt;
&lt;br/&gt;the perceptron&amp;#8217;s algorithm is pretty obvious.  What makes the site good is the choice of data sources. However, the algorithm does allow experimentation with adding data sources. If I add a bad one, the scores given to its recommendations drop very rapidly. It only took about 200 user rating actions to get the site’s data source weights pretty good. Here is the current table (higher numbers are better):
&lt;br/&gt;
&lt;br/&gt;&lt;table class="admin_table"&gt;&lt;tr&gt;&lt;td class="admin_table_td"&gt;Source&lt;/td&gt;&lt;td class="admin_table_td"&gt;Score&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="admin_table_td"&gt;Epitonic similar artists&lt;/td&gt;&lt;td class="admin_table_td"&gt;0.439&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="admin_table_td"&gt;Tiny Mix Tapes similar artists&lt;/td&gt;&lt;td class="admin_table_td"&gt;0.316&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="admin_table_td"&gt;Myspace top friends&lt;/td&gt;&lt;td class="admin_table_td"&gt;0.128&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="admin_table_td"&gt;Mixtapes&lt;/td&gt;&lt;td class="admin_table_td"&gt;0.075&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="admin_table_td"&gt;Record labels&lt;/td&gt;&lt;td class="admin_table_td"&gt;0.020&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="admin_table_td"&gt;Epitonic other artists&lt;/td&gt;&lt;td class="admin_table_td"&gt;0.016&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="admin_table_td"&gt;&lt;span class="caps"&gt;MP3&lt;/span&gt; blogs&lt;/td&gt;&lt;td class="admin_table_td"&gt;0.003&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="admin_table_td"&gt;Gigs&lt;/td&gt;&lt;td class="admin_table_td"&gt;Score hasn’t settled, yet.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="admin_table_td"&gt;the perceptron user recommendations&lt;/td&gt;&lt;td class="admin_table_td"&gt;Score hasn’t settled, yet.&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;br/&gt;&lt;strong&gt;Why am I giving away my secrets?&lt;/strong&gt;
&lt;br/&gt;&lt;ol&gt;&lt;li&gt;I would love to see people take my ideas and make them better, or apply them to something else.&lt;/li&gt;&lt;li&gt;I’m a fucking genius. I’ll have some even better ideas tomorrow.&lt;/li&gt;&lt;/ol&gt;</description>
      <pubDate>Sun, 05 Oct 2008 22:27:00 +0000</pubDate>
      <link>http://www.maryrosecook.com/post/show/130</link>
      <guid>http://www.maryrosecook.com/post/show/130</guid>
    </item>
    <item>
      <title>the perceptron</title>
      <description>&lt;a href='http://theperceptron.com'&gt;the perceptron&lt;/a&gt; is not a music recommendation website. It is a giant, bmx-riding, &lt;span class="caps"&gt;AIWA&lt;/span&gt;-headphoned, sunglassed, could-totally-get-an-A-in-maths-brained robot that processes the musical internet, notes your every move, and then plays you music you will fall in love with.
&lt;br/&gt;
&lt;br/&gt;- &lt;a href='http://theperceptron.com/blog/show/20'&gt;the perceptron blog&lt;/a&gt;</description>
      <pubDate>Sat, 20 Sep 2008 09:52:00 +0000</pubDate>
      <link>http://www.maryrosecook.com/post/show/128</link>
      <guid>http://www.maryrosecook.com/post/show/128</guid>
    </item>
    <item>
      <title>He is my hero</title>
      <description>&lt;img src="http://werenotthecoolkids.com/images/joker.jpg"&gt;
&lt;br/&gt;
&lt;br/&gt;</description>
      <pubDate>Sat, 02 Aug 2008 13:37:00 +0000</pubDate>
      <link>http://www.maryrosecook.com/post/show/122</link>
      <guid>http://www.maryrosecook.com/post/show/122</guid>
    </item>
    <item>
      <title>Easy evaluation of data mining approaches</title>
      <description>[This article runs through the approach and provides illustrative Ruby/Rails code snippets. Download all the code &lt;a href='/evaluationapp.zip'&gt;here&lt;/a&gt;.]
&lt;br/&gt;
&lt;br/&gt;I have been working on a dating web site for a while. I have developed a structure for evaluating different methods of picking pairs of users to be introduced. This evaluation structure could be used in any app.
&lt;br/&gt;
&lt;br/&gt;Some precepts. First, methods of picking pairs of users to introduce are called systems. Second, for every match, each system can produce a grade between 0 (worst) and 1 (best). Third, each pair of users that is graded is called a system match. Fourth, there is some &amp;#8220;objective&amp;#8221; system of measuring the real compatibility of two users that can be used as a benchmark. In the case of my site, this objective system gives a grade of 1 to a pair of users where one has said they like the look of the other, and 0 otherwise.
&lt;br/&gt;
&lt;br/&gt;Onto the code.
&lt;br/&gt;
&lt;br/&gt;First, a class to embody the idea of a system. This class can be subclassed to provide an implementation of a specific system. All this implementation needs is a method, calculate_raw_system_grade(), that takes two users and returns a grade. generate_system_matches() goes through each pair of users and calculates its grade using each system. Note how the &lt;span class="caps"&gt;SYSTEMS&lt;/span&gt; array contains some constants, each of which refer to a System subclass. The method then calls calculate_raw_system_grade() on each System subclass for each pair of users. evaluate_system_matches() gets a score for each system by finding the average difference between the system&amp;#8217;s grades and the objective system&amp;#8217;s grades.
&lt;br/&gt;&lt;font face="courier" size=-2&gt;
&lt;br/&gt;class System &lt; ActiveRecord::Base
&lt;br/&gt;&amp;nbsp;&amp;nbsp;has_many :system_grades
&lt;br/&gt;&amp;nbsp;&amp;nbsp;
&lt;br/&gt;&amp;nbsp;&amp;nbsp;MESSAGE_SYSTEM = MessageSystem
&lt;br/&gt;&amp;nbsp;&amp;nbsp;OBJECTIVE_SYSTEM = ObjectiveSystem
&lt;br/&gt;&amp;nbsp;&amp;nbsp;SYSTEMS = [MESSAGE_SYSTEM, &lt;span class="caps"&gt;OBJECTIVE&lt;/span&gt;_SYSTEM]
&lt;br/&gt;
&lt;br/&gt;&amp;nbsp;&amp;nbsp;def self.generate_system_matches()
&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;matches = []
&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;users_to_test = User.find(:all)
&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for user_1 in users_to_test
&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for user_2 in users_to_test
&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if user_1 != user_2
&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;system_grades = []
&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for system_class in &lt;span class="caps"&gt;SYSTEMS&lt;/span&gt;
&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;raw_system_grade = system_class.calculate_raw_system_grade(user_1, user_2)
&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;system_grade = SystemGrade.new_from_matching(system_class.new(), raw_system_grade)
&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;system_grades &lt;&lt; system_grade
&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;end
&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;matches &lt;&lt; SystemMatch.new_from_matching(user_1, user_2, system_grades)
&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;end
&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;end
&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;end
&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;matches
&lt;br/&gt;&amp;nbsp;&amp;nbsp;end
&lt;br/&gt;&amp;nbsp;&amp;nbsp;
&lt;br/&gt;&amp;nbsp;&amp;nbsp;# comes up with scores for each of the matching systems. 0 (worst) to 1 (best)
&lt;br/&gt;&amp;nbsp;&amp;nbsp;def self.evaluate_system_matches()
&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;# boring code
&lt;br/&gt;&amp;nbsp;&amp;nbsp;end
&lt;br/&gt;&amp;nbsp;&amp;nbsp;
&lt;br/&gt;&amp;nbsp;&amp;nbsp;def self.get_system_object(system)
&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.find(:first, :conditions =&gt; &amp;#8220;type = &amp;#8217;#{system}&amp;#8217;&amp;#8221;)
&lt;br/&gt;&amp;nbsp;&amp;nbsp;end
&lt;br/&gt;end
&lt;br/&gt;&lt;/font&gt;
&lt;br/&gt;Second, the class for a system grade. The only notable code here is the Rails data model.
&lt;br/&gt;&lt;font face="courier" size=-2&gt;
&lt;br/&gt;class SystemGrade &lt; ActiveRecord::Base
&lt;br/&gt;&amp;nbsp;&amp;nbsp;belongs_to :system
&lt;br/&gt;&amp;nbsp;&amp;nbsp;belongs_to :system_match
&lt;br/&gt;&amp;nbsp;&amp;nbsp;
&lt;br/&gt;&amp;nbsp;&amp;nbsp;# boring code
&lt;br/&gt;end
&lt;br/&gt;&lt;/font&gt;
&lt;br/&gt;Third, the SystemMatch class. Objects from this class represent a pair of users. Each user match has many system grades attached to it, one for each system. get_objective_system_grade() pulls out the system grade for the &amp;#8220;objective&amp;#8221; system and get_non_objective_system_grades() pulls out all the others.
&lt;br/&gt;&lt;font face="courier" size=-2&gt;
&lt;br/&gt;class SystemMatch &lt; ActiveRecord::Base
&lt;br/&gt;&amp;nbsp;&amp;nbsp;belongs_to :first_user,
&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; :class_name =&gt; &amp;#8220;User&amp;#8221;, 
&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; :foreign_key =&gt; &amp;#8220;first_user_id&amp;#8221; 
&lt;br/&gt;
&lt;br/&gt;&amp;nbsp;&amp;nbsp;belongs_to :second_user,
&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; :class_name =&gt; &amp;#8220;User&amp;#8221;, 
&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; :foreign_key =&gt; &amp;#8220;second_user_id&amp;#8221; 
&lt;br/&gt;&amp;nbsp;&amp;nbsp;
&lt;br/&gt;&amp;nbsp;&amp;nbsp;has_many :system_grades, :dependent =&gt; :destroy
&lt;br/&gt;&amp;nbsp;&amp;nbsp;
&lt;br/&gt;&amp;nbsp;&amp;nbsp;def get_objective_system_grade()
&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;# boring code
&lt;br/&gt;&amp;nbsp;&amp;nbsp;end
&lt;br/&gt;&amp;nbsp;&amp;nbsp;
&lt;br/&gt;&amp;nbsp;&amp;nbsp;def get_non_objective_system_grades()
&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;# boring code
&lt;br/&gt;&amp;nbsp;&amp;nbsp;end
&lt;br/&gt;end
&lt;br/&gt;&lt;/font&gt;
&lt;br/&gt;Fourth, the controller. This just has a method, evaluate_systems(), to run all the lovely system evaluation code.
&lt;br/&gt;&lt;font face="courier" size=-2&gt;
&lt;br/&gt;class AdminController &lt; ApplicationController
&lt;br/&gt;    def evaluate_systems
&lt;br/&gt;    &amp;nbsp;&amp;nbsp;SystemMatch.find(:all).each {|system_match| system_match.destroy() } # destroy all existing system matches
&lt;br/&gt;    &amp;nbsp;&amp;nbsp;System.generate_system_matches().each {|system_match| system_match.save() }
&lt;br/&gt;    &amp;nbsp;&amp;nbsp;@system_match_discrepancies = System.evaluate_system_matches()
&lt;br/&gt;    end
&lt;br/&gt;end
&lt;br/&gt;&lt;/font&gt;
&lt;br/&gt;Fifth, sixth and finally, there are the classes for specific systems, ObjectiveSystem and BlahSystem. The former calculates a benchmark grade for every pair of users. The latter is a system we actually want to test. The model for these classes is:
&lt;br/&gt;&lt;font face="courier" size=-2&gt;
&lt;br/&gt;class ObjectiveSystem &lt; System
&lt;br/&gt;&amp;nbsp;&amp;nbsp;def self.calculate_raw_system_grade(user_1, user_2)
&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;# code to return a grade between 0 and 1
&lt;br/&gt;&amp;nbsp;&amp;nbsp;end
&lt;br/&gt;end
&lt;br/&gt;&lt;/font&gt;
&lt;br/&gt;Now, if you have a brilliant idea in the middle of the night for a new system of matching things, you can just implement a class like the one above, add it as a constant to System and add that constant to the &lt;span class="caps"&gt;SYSTEMS&lt;/span&gt; array and then run your code.</description>
      <pubDate>Sun, 27 Jul 2008 07:57:00 +0000</pubDate>
      <link>http://www.maryrosecook.com/post/show/121</link>
      <guid>http://www.maryrosecook.com/post/show/121</guid>
    </item>
    <item>
      <title>Hacking and transience</title>
      <description>Some people think that programmers are like artists&lt;sup&gt;1&lt;/sup&gt; and others think they are like designers and can, at their best, be like craftsmen&lt;sup&gt;2&lt;/sup&gt;.
&lt;br/&gt;
&lt;br/&gt;Sense and Sensibility, published in 1811, is still widely read and praised.  A beautiful chair carved a hundred years ago can still be admired and sat upon today.  The tin can, invented in 1810&lt;sup&gt;3&lt;/sup&gt;, remains the best method of cheap, long-term food storage.  Thus, there are examples of pieces of art, craftsmanship and design that have longevity.
&lt;br/&gt;
&lt;br/&gt;However, do the fruits of hacking have the same longevity? I am confident that, however good it is, no one will be using the current version of my dating web site in ten years&amp;#8217; time.  In fact, the same could be said of any of today&amp;#8217;s programs and web sites.
&lt;br/&gt;
&lt;br/&gt;Hacking, then, is closest to design because both methods are iterative, whereas artistry and craftsmanship are not.  Novels are written, revised and then published.  Chairs are carved, adjusted and then sold.  In contrast, successful programs and web sites do not remain static, they are improved.  The tin cans we use now are significantly different from the ones made in 1810.  Thus, the difference between hacking and design, and art and craftsmanship, is that, with the former, stasis means death.
&lt;br/&gt;
&lt;br/&gt;Will this change as hacking matures? It hasn&amp;#8217;t changed for design. Design meets a specific, current need.  Art and craftsmanship soothe more general, perennial desires: feeling vicarious sadness, or taking the weight off one&amp;#8217;s feet.
&lt;br/&gt;
&lt;br/&gt;Why are designers and hackers happy making things that will not outlive them? Perhaps the pleasure in the work is enough.  Or perhaps the urge for contemporary approval is greater than the urge for longevity.  But it still makes me sad that I am pouring my creativity onto the ground so that it will nourish the grass for a little while longer.
&lt;br/&gt;
&lt;br/&gt;
&lt;br/&gt;&lt;sup&gt;1&lt;/sup&gt; Paul Graham&amp;#8217;s essay, &lt;a href='http://paulgraham.com/hp.html'&gt;Hackers And Painters&lt;/a&gt;.
&lt;br/&gt;&lt;sup&gt;2&lt;/sup&gt; Joel Spolsky&amp;#8217;s essay, &lt;a href='http://www.joelonsoftware.com/articles/Craftsmanship.html'&gt;Craftsmanship&lt;/a&gt;
&lt;br/&gt;&lt;sup&gt;3&lt;/sup&gt; Wikipedia &lt;a href='http://en.wikipedia.org/wiki/Tin_can'&gt;article on the tin can&lt;/a&gt;</description>
      <pubDate>Fri, 25 Jul 2008 15:19:00 +0000</pubDate>
      <link>http://www.maryrosecook.com/post/show/116</link>
      <guid>http://www.maryrosecook.com/post/show/116</guid>
    </item>
    <item>
      <title>When you come to the end, you go back to the beginning</title>
      <description>[In this post, there are lots of spoilers for The Wire.  If you haven&amp;#8217;t seen all five series, go and watch them.]
&lt;br/&gt;
&lt;br/&gt;Lester Freamon in The Wire: &amp;#8220;We&amp;#8217;re building something here, Detective. We&amp;#8217;re building it from scratch. All the pieces matter.&amp;#8221; 
&lt;br/&gt;
&lt;br/&gt;The writers on The Wire occasionally let their characters say what it is the programme is driving at.
&lt;br/&gt;
&lt;br/&gt;David Simon, the creator, has said that The Wire is about the way institutions affect people&amp;#8217;s lives&lt;sup&gt;1&lt;/sup&gt;.  He has also said the programme is modeled upon Greek tregedies&lt;sup&gt;2&lt;/sup&gt;, and as he noted, Grecian tragedy is obsessed with fate.  If you combine these three insights, you come up with something magical: a piece of art that simultaneously champions two opposing views.  In the case of The Wire: that every piece matters, and that the characters are fated.
&lt;br/&gt;
&lt;br/&gt;For the characters, they are fated.  Their personalities dictate what they will do when placed in circumstance. For the viewer, every piece matters.  They do not have a complete picture of the characters&amp;#8217; personalities.  Thus, they cannot predict what the characters will do in each situation until every personality facet has been revealed.
&lt;br/&gt;
&lt;br/&gt;This contradiction is illustrated by Jimmy McNulty&amp;#8217;s progression through Series 1.  McNulty takes pride in his work and refuses to let police politics or his home life get in the way of his work.  This means that when his superiors become concerned that his indictments will start riling their superiors, he continues his investigation.  At the end of the series, this leads to him being exiled to a dead-end detail in the Baltimore port.
&lt;br/&gt;
&lt;br/&gt;However, there is an extra subtlety: people can be beholden to zero or more institutions.  Can the characters in The Wire choose the institutions to which they belong, and thus have a choice in their fate?
&lt;br/&gt;
&lt;br/&gt;By the end of Series 3, McNulty has had enough of detective work and become a beat officer.  This allows him to join the institution of marriage by moving in with Beatie Russell.
&lt;br/&gt;
&lt;br/&gt;Thus, at the end of Series 3, McNulty withdraws from one institution and joins another.  Did he choose this, and thus his fate? In a sense.  He willfully chose to leave the first institution because it could not meet his terms.
&lt;br/&gt;
&lt;br/&gt;By Series 5, McNulty is a detective again and, consequently, he goes back to drinking and philandering.  However, he was most definitely ripped out of his newly adopted institution by the pull of his old one.  Thus, in that sense, he had no choice.
&lt;br/&gt;
&lt;br/&gt;&lt;sup&gt;1&lt;/sup&gt; &amp;#8220;[The show is] really about the American city, and about how we live together. It&amp;#8217;s about how institutions have an effect on individuals, and how…whether you&amp;#8217;re a cop, a longshoreman, a drug dealer, a politician, a judge [or] lawyer, you are ultimately compromised and must contend with whatever institution you&amp;#8217;ve committed to.&amp;#8221; Source: &lt;a href='http://en.wikipedia.org/wiki/The_Wire_(TV_series)#cite_note-TAR-0'&gt;David Simon &amp;#8220;The Target&amp;#8221; commentary track [DVD], 2005&lt;/a&gt;.
&lt;br/&gt;
&lt;br/&gt;&lt;sup&gt;2&lt;/sup&gt; &amp;#8220;Much of our modern theater seems rooted in the Shakespearean discovery of the modern mind. We’re stealing instead from an earlier, less-traveled construct—the Greeks—lifting our thematic stance wholesale from Aeschylus, Sophocles, Euripides to create doomed and fated protagonists who confront a rigged game and their own mortality.&amp;#8221; Source: &lt;a href='http://www.believermag.com/issues/200708/?read=interview_simon'&gt;David Simon interview in The Believer, 2007&lt;/a&gt;.</description>
      <pubDate>Thu, 10 Jul 2008 11:12:00 +0000</pubDate>
      <link>http://www.maryrosecook.com/post/show/115</link>
      <guid>http://www.maryrosecook.com/post/show/115</guid>
    </item>
    <item>
      <title>If &lt;a href='http://twitter.com'&gt;Twitter&lt;/a&gt; has invented a new mode of communication, and &lt;a href='http://digg.com'&gt;Digg&lt;/a&gt; has invented a new mode of content filtering, does that mean that there is lots of room for Twitter clones that cater to different communities, in the same way that there are lots of Digg clones that lean towards different topics and styles of content?</title>
      <description>If &lt;a href='http://twitter.com'&gt;Twitter&lt;/a&gt; has invented a new mode of communication, and &lt;a href='http://digg.com'&gt;Digg&lt;/a&gt; has invented a new mode of content filtering, does that mean that there is lots of room for Twitter clones that cater to different communities, in the same way that there are lots of Digg clones that lean towards different topics and styles of content?</description>
      <pubDate>Wed, 09 Jul 2008 13:01:00 +0000</pubDate>
      <link>http://www.maryrosecook.com/post/show/114</link>
      <guid>http://www.maryrosecook.com/post/show/114</guid>
    </item>
    <item>
      <title>Listen! Listen!</title>
      <description>Just found an amazing American public radio interview programme, &lt;a href='http://www.maximumfun.org/'&gt;The Sound Of Young America&lt;/a&gt;.  The interviewer asks interesting questions and gets out of the way.  I have listened, in a prostration of amazement, to the following:
&lt;br/&gt;
&lt;br/&gt;&lt;a href='http://www.maximumfun.org/blog/2008/06/podcast-ariel-schrag-cartoonist-and.html'&gt;Ariel Schrag&lt;/a&gt;
&lt;br/&gt;&lt;a href='http://www.maximumfun.org/blog/2007/12/podcast-live-in-chicago-steve-albini.html'&gt;Steve Albini&lt;/a&gt;
&lt;br/&gt;
&lt;br/&gt;</description>
      <pubDate>Tue, 01 Jul 2008 20:34:00 +0000</pubDate>
      <link>http://www.maryrosecook.com/post/show/113</link>
      <guid>http://www.maryrosecook.com/post/show/113</guid>
    </item>
    <item>
      <title>Don't talk to the cops</title>
      <description>An American lawyer enumerates the reasons you should never talk to the police and, more importantly, hammers home the fact that there aren&amp;#8217;t any reasons &lt;strong&gt;to&lt;/strong&gt; talk.
&lt;br/&gt;
&lt;br/&gt;&lt;object width="425" height="344"&gt;&lt;param name="movie" value="http://www.youtube.com/v/i8z7NC5sgik&amp;#38;hl=en"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/i8z7NC5sgik&amp;#38;hl=en" type="application/x-shockwave-flash" width="425" height="344"&gt;&lt;/embed&gt;&lt;/object&gt;
&lt;br/&gt;
&lt;br/&gt;Part 2, a police officer confirms:
&lt;br/&gt;
&lt;br/&gt;&lt;object width="425" height="344"&gt;&lt;param name="movie" value="http://www.youtube.com/v/08fZQWjDVKE&amp;#38;hl=en"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/08fZQWjDVKE&amp;#38;hl=en" type="application/x-shockwave-flash" width="425" height="344"&gt;&lt;/embed&gt;&lt;/object&gt;
&lt;br/&gt;
&lt;br/&gt;</description>
      <pubDate>Wed, 18 Jun 2008 12:53:00 +0000</pubDate>
      <link>http://www.maryrosecook.com/post/show/112</link>
      <guid>http://www.maryrosecook.com/post/show/112</guid>
    </item>
    <item>
      <title>Wow, wow, wow.</title>
      <description>Wow, wow, wow.</description>
      <pubDate>Mon, 09 Jun 2008 23:40:30 +0000</pubDate>
      <link>http://www.maryrosecook.com/post/show/111</link>
      <guid>http://www.maryrosecook.com/post/show/111</guid>
    </item>
    <item>
      <title>Snow Leopard is a cute name for the next release of OS X, but there are two problems with &lt;a href='http://daringfireball.net/2008/06/snow_leopard'&gt;the theory&lt;/a&gt;.  First, if you are not a Mac fan, it is difficult to discern the relationship between Snow Leopard and Leopard.  Which is newer? Do I need one to install the other? Who knows? Second, it has been &lt;a href='http://www.roughlydrafted.com/2008/06/05/wwdc-2008-moscone-west-spy-shots/'&gt;reported&lt;/a&gt; that &lt;a href='http://www.roughlydrafted.com/wp-content/uploads/2008/06/img-0654.jpg'&gt;banners reading "OS X Leopard"&lt;/a&gt; are hanging in Moscone West, ready for WWDC.  Why tout Leopard when you're going to announce Snow Leopard?</title>
      <description>Snow Leopard is a cute name for the next release of &lt;span class="caps"&gt;OS X&lt;/span&gt;, but there are two problems with &lt;a href='http://daringfireball.net/2008/06/snow_leopard'&gt;the theory&lt;/a&gt;.  First, if you are not a Mac fan, it is difficult to discern the relationship between Snow Leopard and Leopard.  Which is newer? Do I need one to install the other? Who knows? Second, it has been &lt;a href='http://www.roughlydrafted.com/2008/06/05/wwdc-2008-moscone-west-spy-shots/'&gt;reported&lt;/a&gt; that &lt;a href='http://www.roughlydrafted.com/wp-content/uploads/2008/06/img-0654.jpg'&gt;banners reading &amp;#8220;OS X Leopard&amp;#8221;&lt;/a&gt; are hanging in Moscone West, ready for &lt;span class="caps"&gt;WWDC&lt;/span&gt;.  Why tout Leopard when you&amp;#8217;re going to announce Snow Leopard?</description>
      <pubDate>Mon, 09 Jun 2008 08:46:00 +0000</pubDate>
      <link>http://www.maryrosecook.com/post/show/110</link>
      <guid>http://www.maryrosecook.com/post/show/110</guid>
    </item>
    <item>
      <title>Des Ark, they break my heart</title>
      <description>I have always really liked Des Ark but, for some reason, for the last week, I have not been able to stop watching their videos on YouTube.
&lt;br/&gt;
&lt;br/&gt;They make me want to cry, Aimee&amp;#8217;s guitar playing makes me boil with envy, and their two delivery methods (crushing rock and crushing acoustic) leave me lost in admiration.
&lt;br/&gt;
&lt;br/&gt;&lt;object width="425" height="355"&gt;&lt;param name="movie" value="http://www.youtube.com/v/JmYdix-XGmg&amp;#38;hl=en"&gt;&lt;/param&gt;&lt;param name="wmode" value="transparent"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/JmYdix-XGmg&amp;#38;hl=en" type="application/x-shockwave-flash" wmode="transparent" width="425" height="355"&gt;&lt;/embed&gt;&lt;/object&gt;
&lt;br/&gt;
&lt;br/&gt;&lt;object width="425" height="355"&gt;&lt;param name="movie" value="http://www.youtube.com/v/PlJq1-mgoto&amp;#38;hl=en"&gt;&lt;/param&gt;&lt;param name="wmode" value="transparent"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/PlJq1-mgoto&amp;#38;hl=en" type="application/x-shockwave-flash" wmode="transparent" width="425" height="355"&gt;&lt;/embed&gt;&lt;/object&gt;
&lt;br/&gt;
&lt;br/&gt;</description>
      <pubDate>Fri, 30 May 2008 21:43:00 +0000</pubDate>
      <link>http://www.maryrosecook.com/post/show/109</link>
      <guid>http://www.maryrosecook.com/post/show/109</guid>
    </item>
    <item>
      <title>&lt;a href='http://www.skyscrapercity.com/showthread.php?t=402544'&gt;Photographs of New York City&lt;/a&gt;, 1965 to 1995.  Despite the sparse text, there is a fascinating narrative here.</title>
      <description>&lt;a href='http://www.skyscrapercity.com/showthread.php?t=402544'&gt;Photographs of New York City&lt;/a&gt;, 1965 to 1995.  Despite the sparse text, there is a fascinating narrative here.</description>
      <pubDate>Tue, 27 May 2008 10:28:00 +0000</pubDate>
      <link>http://www.maryrosecook.com/post/show/108</link>
      <guid>http://www.maryrosecook.com/post/show/108</guid>
    </item>
    <item>
      <title>Nature</title>
      <description>Michael Mann has always given great attention to detail in his films: getting people to train his actors to behave like &lt;a href='http://www.imdb.com/name/nm0120483/bio'&gt;convicts&lt;/a&gt;, &lt;a href='http://findarticles.com/p/articles/mi_m0HNN/is_8_19/ai_n6171215'&gt;capturing the light of sodium street lamps properly&lt;/a&gt;, having &lt;a href='http://www.imdb.com/title/tt0113277/trivia'&gt;his armed characters check chamber&lt;/a&gt;.
&lt;br/&gt;
&lt;br/&gt;&amp;#8220;We have full-time people who just show customers the code, or look at other specifications, and things of that nature.&amp;#8221; 
&lt;br/&gt;
&lt;br/&gt;&amp;#8221;...burn rates, ignition propensities, things of this nature.&amp;#8221; 
&lt;br/&gt;
&lt;br/&gt;The first quote is from a Bill Gates &lt;a href='http://programmersatwork.wordpress.com/bill-gates-1986/'&gt;interview&lt;/a&gt; in 1986.  The second is one of Jeffrey Wigand&amp;#8217;s lines in The Insider.
&lt;br/&gt;
&lt;br/&gt;Both quotes include the phrase, &amp;#8220;thing of [this/that] nature.&amp;#8221;  When I read the interview with Gates, that phrase stuck out as something that only a precise person, an engineer, would say.  And precision is Wigand&amp;#8217;s defining characteristic.</description>
      <pubDate>Tue, 20 May 2008 16:51:00 +0000</pubDate>
      <link>http://www.maryrosecook.com/post/show/107</link>
      <guid>http://www.maryrosecook.com/post/show/107</guid>
    </item>
    <item>
      <title>Eating iPods</title>
      <description>You can please everyone.
&lt;br/&gt;
&lt;br/&gt;Why does everyone love Radiohead and the iPod, yet no one deride them as philistine? Why did reddit go from being a relatively interesting news site to a politically-leaning version of Digg? Why is Digg populated by moronic stories?
&lt;br/&gt;
&lt;br/&gt;It&amp;#8217;s a matter of taste.
&lt;br/&gt;
&lt;br/&gt;Steve Jobs sired the iPod by the force of his refined taste.  The masses loved it because almost everyone can find a use for it, and because it is aesthetically pleasing.
&lt;br/&gt;
&lt;br/&gt;Most pop music only has the former quality &amp;#8211; we all like to dance, and to replay a melody in our heads.  But Radiohead (1) take those nice melodies and spit them out in newish ways.  Thus, they win the approval of everyone, including the critics.  So, to a lesser extent, do Sonic Youth.
&lt;br/&gt;
&lt;br/&gt;A few times a day, I visit a website called Hacker News.  It&amp;#8217;s quite like reddit: people post news items, vote and comment on them, and the most popular items get the most exposure.  The difference with Hacker News is that all the news items are ostensibly focused on hacking (ingenious problem-solving).  Even in the three months since I joined, I&amp;#8217;ve noticed a drop in the overall quality of the news items.  But how does this drop in quality manifest itself?
&lt;br/&gt;
&lt;br/&gt;It is often said of universally revered pieces of art that they have been &amp;#8220;done very well&amp;#8221;.  When people say this, their admiration is a proxy for aesthetic pleasure within a well-understood set of rules.  Jane Austen (2) took the romance novel, a traditionally trashy form, and wrote books that conformed to the established rules, but achieved great artistic heights.  Converge released Jane Doe, a record that toes the metalcore line with its beatdowns and screaming and blast beats and heavy, distorted riffs.  But they show such technical excellence and the music sounds so bleak that the record exceeds everything else in the genre.
&lt;br/&gt;
&lt;br/&gt;Converge are a popular hardcore band, but they are not a popular band.  I like hardcore, but my Mum does not, she says, because of the screaming.  Most people share her view.  Thus, Converge will never achieve the critical and mass popularity of Radiohead because, though they are very aesthetically pleasing, most people cannot find a use for them.  Cathartic screams are just not their cup of tea.
&lt;br/&gt;
&lt;br/&gt;How do you achieve aesthetic pleasure? There are two ways.  One, appeal to a narrowly-defined group of people whose aesthetic judgement is closely aligned. Two, find the superset of the world&amp;#8217;s taste and embody it.
&lt;br/&gt;
&lt;br/&gt;This explains what has happened to reddit and Digg, and what is happening to Hacker News.  These sites began with a core group of users who all had fairly closely aligned interests and values and so it was easy for the site to give them aesthetic pleasure.  Once the user group became more diverse, there were an increasing number of stories posted that only appealed to a subset of the users&amp;#8217; interests and values.  Therefore, these items get fewer votes and less attention.  What rises to the top is the items that are universally appealing.  But wait.  Instead of a dictator with impeccable taste in charge, there is a mass of independent people.  This universal appeal is based upon a lowest common denominator.  We all quite like pictures of cute cats, and Top 10 lists and bold, unsubstantiated headlines.  But these things only push our aesthetic pleasure bars up to maybe a four.  Thus, mediocrity reigns.
&lt;br/&gt;
&lt;br/&gt;The iPod has a dictator with impeccable taste and everyone can find a use for it.  The same is true of Radiohead.  Converge fail because of the second condition of universal popularity.  reddit, the first.
&lt;br/&gt;
&lt;br/&gt;(1) I don’t actually like Radiohead, but I am an outlier.
&lt;br/&gt;(2) See Paul Graham&amp;#8217;s article, &lt;a href='http://www.paulgraham.com/heroes.html'&gt;Some Heroes&lt;/a&gt;, for more on good writers who chose populist genres.</description>
      <pubDate>Tue, 13 May 2008 21:24:00 +0000</pubDate>
      <link>http://www.maryrosecook.com/post/show/106</link>
      <guid>http://www.maryrosecook.com/post/show/106</guid>
    </item>
    <item>
      <title>Throw Text</title>
      <description>I&amp;#8217;ve been working on a large personal project for the last four months.  To keep myself fresh, I&amp;#8217;ve also done a couple of little mini projects.  The first was &lt;a href='http://tweviews.com'&gt;Tweviews&lt;/a&gt;, tiny reviews on Twitter.
&lt;br/&gt;
&lt;br/&gt;I knocked up the second this weekend: &lt;a href='http://throwtext.com'&gt;Throw Text&lt;/a&gt;, instant text storage and retrieval. I know there a lot of these things on the &amp;#8216;net, most called Online Notepad.  But my goals for Throw Text are a bit different:
&lt;br/&gt;
&lt;br/&gt;1. Identical sign-up, edit and retrieve screens.
&lt;br/&gt;2. Text stored as you type.
&lt;br/&gt;3. Clean, clean cleanliness.
&lt;br/&gt;
&lt;br/&gt;Some technical notes.  Throw Text was written in &lt;a href='http://www.rubyonrails.org/'&gt;Ruby on Rails&lt;/a&gt;.  It is hosted on &lt;a href='http://slicehost.com'&gt;Slicehost&lt;/a&gt; for $20 a month.  It is served by &lt;a href='http://www.apache.org/'&gt;Apache&lt;/a&gt; 2 and &lt;a href='http://www.modrails.com/'&gt;mod_rails&lt;/a&gt; (aka Passenger).  The data is stored in &lt;a href='http://www.mysql.com/'&gt;MySQL&lt;/a&gt;.  It took longer to set up the hosting than to write the code.
&lt;br/&gt;
&lt;br/&gt;So, give it a whirl: &lt;a href='http://throwtext.com'&gt;Throw Text&lt;/a&gt;.</description>
      <pubDate>Sun, 11 May 2008 21:51:00 +0000</pubDate>
      <link>http://www.maryrosecook.com/post/show/105</link>
      <guid>http://www.maryrosecook.com/post/show/105</guid>
    </item>
  </channel>
</rss>
