<?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 xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>fonicmonkey</title>
	
	<link>http://www.fonicmonkey.net</link>
	<description>Fun with Java, Rails and dot net</description>
	<pubDate>Mon, 18 Jan 2010 15:12:50 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.6</generator>
	<language>en</language>
			<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/Fonicmonkey" /><feedburner:info uri="fonicmonkey" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item>
		<title>Why Spotify Premium is too expensive, and how to fix it</title>
		<link>http://feedproxy.google.com/~r/Fonicmonkey/~3/OfwLtlHXH7E/</link>
		<comments>http://www.fonicmonkey.net/posts/why-spotify-premium-is-too-expensive-and-how-to-fix-it/#comments</comments>
		<pubDate>Mon, 18 Jan 2010 15:12:50 +0000</pubDate>
		<dc:creator>lee</dc:creator>
		
		<category><![CDATA[Miscellaneous]]></category>

		<category><![CDATA[Spotify]]></category>

		<category><![CDATA[Subscription business model]]></category>

		<guid isPermaLink="false">http://www.fonicmonkey.net/?p=374</guid>
		<description><![CDATA[I recently became a Spotify Premium customer, for two main reasons:

I&#8217;d spent an afternoon listening to spotify at my desk and wanted to carry on listening to the same playlists on my iPhone while I was walking somewhere.
As a technology guy I was curious if it was any good

So I forked out my £9.99 to [...]<p><a href="http://sharethis.com/item?&#038;wp=2.6&#38;publisher=45f383fd-268d-45f2-99b9-3fb7a80c83c9&#38;title=Why+Spotify+Premium+is+too+expensive%2C+and+how+to+fix+it&#38;url=http%3A%2F%2Fwww.fonicmonkey.net%2Fposts%2Fwhy-spotify-premium-is-too-expensive-and-how-to-fix-it%2F">ShareThis</a></p>]]></description>
			<content:encoded><![CDATA[<p>I recently became a Spotify Premium customer, for two main reasons:</p>
<ol>
<li>I&#8217;d spent an afternoon listening to spotify at my desk and wanted to carry on listening to the same <a href="https://www.spotify.com/en/mobile/overview/" onclick="javascript:urchinTracker ('/outbound/article/www.spotify.com');">playlists on my iPhone</a> while I was walking somewhere.</li>
<li>As a technology guy I was curious if it was any good</li>
</ol>
<p>So I forked out my £9.99 to give it a go for a month. Aside from the fact I had to use their website (rather than just tap an in-app &#8220;buy now&#8221; button on the iPhone), the sign-up experience was simple and easy.</p>
<p>The iPhone app is really good; it suffers from the same problem that all non-Apple music apps have on the iPhone, (namely that the music terminates if you leave the app to reply to an SMS or check your email). It&#8217;s not perfect, but it&#8217;s a really solid 1.0 release. Playing music over 3G appears to Just Work.</p>
<p>However, I won&#8217;t be renewing my subscription for a 2nd month because it&#8217;s just <em><strong>too</strong></em> expensive.</p>
<p>Don&#8217;t get me wrong, I <strong><em>expect</em></strong> Spotify Premium to be expensive: it offers up a huge proportion of the world&#8217;s commercial music for your listening pleasure on a ton of desktop and mobile platforms, ad-free with features like playlist management, integrated art work, artist and album browsing and search and plenty more.</p>
<p>But the kiss of death is that if I pay for Spotify every month for several years and then stop, I leave with NOTHING.</p>
<p>That&#8217;s just not a sensible investment in anybody&#8217;s book. £9.99 can buy me 2 or 3 albums per month if I&#8217;m a real bargain-hunter. By quitting Spotify after 2 years, (£240) I&#8217;ll be down by 80 albums.</p>
<p>Crazy.</p>
<h3>How to help consumers justify Spotify Premium</h3>
<p>If I pay for Premium for more than a month or two, that should tell Spotify that I&#8217;m basically a music lover, and every such user should be rewarded as such.</p>
<p>Why not create a system that allows me to accrue album credits for every continuous month I&#8217;m a paying customer? This both encourages loyalty to the subscription system as well as reinforcing a strong sense of value for money.</p>
<p>As a bare minimum, I should earn the ability to keep 1 or 2 albums per month at the end of my subscription.</p>
<p>If Spotify really want to be disruptive then I&#8217;ll get to accrue at least 5 albums worth of credits for every month I&#8217;m a subscriber (after some initial intro period of about 3 months).</p>
<p>For spotify, the infrastructure costs are practically identical - users get to download a tiny percentage of the tracks that they listen to, (which is already a premium feature to enable &#8216;offline listening&#8217;). The biggest issue is that of licensing - would the record labels be willing to allow a purchase-model of music to be integrated into the subscription streaming-model they&#8217;re currently charging for.</p>
<p>For consumers, it would mean Spotify Premium was no longer a frivolous throwaway cost, and could be looked at as a long term music investment that would likely involve <em>even bigger spending on music</em> because of Spotify&#8217;s enormous streamable catalogue.</p>
<p>That would at least <em>start</em> to give <a href="http://www.apple.com/itunes/" onclick="javascript:urchinTracker ('/outbound/article/www.apple.com');">Mr iTunes</a> and his music monopoly something to worry about.</p>
<div class="zemanta-pixie" style="margin-top: 10px; height: 15px;"><a href="http://reblog.zemanta.com/zemified/3793d93e-1987-4f61-8d90-d9953d6aed4a/"class="zemanta-pixie-a" title="Reblog this post [with Zemanta]"  onclick="javascript:urchinTracker ('/outbound/article/reblog.zemanta.com');"><img class="zemanta-pixie-img" style="border: none; float: right;" src="http://img.zemanta.com/reblog_e.png?x-id=3793d93e-1987-4f61-8d90-d9953d6aed4a" alt="Reblog this post [with Zemanta]" /></a><span class="zem-script more-related more-info pretty-attribution paragraph-reblog"><script src="http://static.zemanta.com/readside/loader.js" type="text/javascript"></script></span></div>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/Fonicmonkey?a=OfwLtlHXH7E:6hqZWOOAnd0:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/Fonicmonkey?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Fonicmonkey?a=OfwLtlHXH7E:6hqZWOOAnd0:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/Fonicmonkey?d=qj6IDK7rITs" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://www.fonicmonkey.net/posts/why-spotify-premium-is-too-expensive-and-how-to-fix-it/feed/</wfw:commentRss>
		<feedburner:origLink>http://www.fonicmonkey.net/posts/why-spotify-premium-is-too-expensive-and-how-to-fix-it/</feedburner:origLink></item>
		<item>
		<title>mig_constraints is not compatible with rails 2.3</title>
		<link>http://feedproxy.google.com/~r/Fonicmonkey/~3/laYh5-iw0sM/</link>
		<comments>http://www.fonicmonkey.net/posts/mig_constraints-is-not-compatible-with-rails-23/#comments</comments>
		<pubDate>Sun, 25 Oct 2009 18:52:27 +0000</pubDate>
		<dc:creator>lee</dc:creator>
		
		<category><![CDATA[Rails]]></category>

		<category><![CDATA[activerecord]]></category>

		<category><![CDATA[Foreign key]]></category>

		<guid isPermaLink="false">http://www.fonicmonkey.net/?p=368</guid>
		<description><![CDATA[Although it&#8217;s old, mig_constraints has sat in my rails plugin directory for a while now because it adds much needed foreign key support to ActiveRecord.
I&#8217;m on of those crazy guys that thinks a relational database should maintain relational integrity, so it&#8217;s been a staple of my rails projects for some time. Unfortunately when I recently [...]<p><a href="http://sharethis.com/item?&#038;wp=2.6&#38;publisher=45f383fd-268d-45f2-99b9-3fb7a80c83c9&#38;title=mig_constraints+is+not+compatible+with+rails+2.3&#38;url=http%3A%2F%2Fwww.fonicmonkey.net%2Fposts%2Fmig_constraints-is-not-compatible-with-rails-23%2F">ShareThis</a></p>]]></description>
			<content:encoded><![CDATA[<p>Although it&#8217;s old, <a href="http://rubyforge.org/projects/mig-constraints/" onclick="javascript:urchinTracker ('/outbound/article/rubyforge.org');">mig_constraints</a> has sat in my rails plugin directory for a while now because it adds much needed foreign key support to ActiveRecord.</p>
<p>I&#8217;m on of those crazy guys that thinks a relational database should maintain relational integrity, so it&#8217;s been a staple of my rails projects for some time. Unfortunately when I recently upgraded to rails 2.3.4, it created a bizarre obscure error that seems to indicate it&#8217;s not compatible with rails 2.3 at all.</p>
<p>As far as I can tell, the best candidate for a replacement is <a href="http://github.com/mlomnicki/foreign_key_migrations" onclick="javascript:urchinTracker ('/outbound/article/github.com');">this github project</a> but I&#8217;ve not yet had the time to try it. For now I simply removed the plugin from my project and db:migrate reverted to a nice working state.</p>
<p><span id="more-368"></span></p>
<p>For maximum google-a-bility, the stacktrace I got when trying to run db:migrate with the incompatible plugin is included below:</p>
<p><code><br />
/usr/bin/ruby -e STDOUT.sync=true;STDERR.sync=true;load($0=ARGV.shift) /usr/bin/rake db:migrate</code></p>
<p><code> </code></p>
<p><code>(in /Users/leem/Software/bsheet)</p>
<p>==  AddSuggestions: migrating =================================================</p>
<p>-- create_table(:suggestions)</p>
<p>rake aborted!</p>
<p>An error has occurred, all later migrations canceled:</p>
<p>Mysql::Error: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1: CREATE TABLE suggestions (#&lt;struct ActiveRecord::ConnectionAdapters::ColumnDefinition base=#&lt;ActiveRecord::ConnectionAdapters::MysqlAdapter:0x23d7eb0 @last_verification=0, @logger=#&lt;Logger:0x1159a04 @level=0, @default_formatter=#&lt;Logger::Formatter:0x11599c8 @datetime_format=nil&gt;, @progname=nil, @logdev=#&lt;Logger::LogDevice:0x11599a0 @filename="/Users/leem/Software/bsheet/log/webapp-development.log", @mutex=#&lt;Logger::LogDevice::LogDeviceMutex:0x1159978 @mon_owner=nil, @mon_waiting_queue=[], @mon_entering_queue=[], @mon_count=0&gt;, @dev=#&lt;File:/Users/leem/Software/bsheet/log/webapp-development.log&gt;, @shift_size=1048576, @shift_age=0&gt;, @formatter=#&lt;Logger::SimpleFormatter:0&#215;263e744 @datetime_format=nil&gt;&gt;, @quoted_table_names={}, @runtime=428.263902664185, @quoted_column_names={:user_id=&gt;&#8221;`user_id`&#8221;, &#8220;suggestions_user_id_fkey&#8221;=&gt;&#8221;`suggestions_user_id_fkey`&#8221;, &#8220;id&#8221;=&gt;&#8221;`id`&#8221;}, @config={:adapter=&gt;&#8221;mysql&#8221;, :username=&gt;&#8221;root&#8221;, :socket=&gt;&#8221;/tmp/mysql.sock&#8221;, :host=&gt;&#8221;localhost&#8221;, :password=&gt;&#8221;*******&#8221;, :database=&gt;&#8221;broadersheet_testing1&#8243;}, @query_cache_enabled=false, @connection=#&lt;Mysql:0&#215;23dc154&gt;, @connection_options=["localhost", "root", "root", "broadersheet_testing1", nil, "/tmp/mysql.sock"]&gt;, name=&#8221;id&#8221;, type=:primary_key, limit=nil, precision=nil, scale=nil, default=nil, null=nil&gt;, #&lt;struct ActiveRecord::ConnectionAdapters::ColumnDefinition base=#&lt;ActiveRecord::ConnectionAdapters::MysqlAdapter:0&#215;23d7eb0 @last_verification=0, @logger=#&lt;Logger:0&#215;1159a04 @level=0, @default_formatter=#&lt;Logger::Formatter:0&#215;11599c8 @datetime_format=nil&gt;, @progname=nil, @logdev=#&lt;Logger::LogDevice:0&#215;11599a0 @filename=&#8221;/Users/leem/Software/bsheet/log/webapp-development.log&#8221;, @mutex=#&lt;Logger::LogDevice::LogDeviceMutex:0&#215;1159978 @mon_owner=nil, @mon_waiting_queue=[], @mon_entering_queue=[], @mon_count=0&gt;, @dev=#&lt;File:/Users/leem/Software/bsheet/log/webapp-development.log&gt;, @shift_size=1048576, @shift_age=0&gt;, @formatter=#&lt;Logger::SimpleFormatter:0&#215;263e744 @datetime_format=nil&gt;&gt;, @quoted_table_names={}, @runtime=428.263902664185, @quoted_column_names={:user_id=&gt;&#8221;`user_id`&#8221;, &#8220;suggestions_user_id_fkey&#8221;=&gt;&#8221;`suggestions_user_id_fkey`&#8221;, &#8220;id&#8221;=&gt;&#8221;`id`&#8221;}, @config={:adapter=&gt;&#8221;mysql&#8221;, :username=&gt;&#8221;root&#8221;, :socket=&gt;&#8221;/tmp/mysql.sock&#8221;, :host=&gt;&#8221;localhost&#8221;, :password=&gt;&#8221;*******&#8221;, :database=&gt;&#8221;broadersheet_testing1&#8243;}, @query_cache_enabled=false, @connection=#&lt;Mysql:0&#215;23dc154&gt;, @connection_options=["localhost", "root", "root", "broadersheet_testing1", nil, "/tmp/mysql.sock"]&gt;, name=:reason, type=:string, limit=10, precision=nil, scale=nil, default=nil, null=false&gt;, #&lt;struct ActiveRecord::ConnectionAdapters::ColumnDefinition base=#&lt;ActiveRecord::ConnectionAdapters::MysqlAdapter:0&#215;23d7eb0 @last_verification=0, @logger=#&lt;Logger:0&#215;1159a04 @level=0, @default_formatter=#&lt;Logger::Formatter:0&#215;11599c8 @datetime_format=nil&gt;, @progname=nil, @logdev=#&lt;Logger::LogDevice:0&#215;11599a0 @filename=&#8221;/Users/leem/Software/bsheet/log/webapp-development.log&#8221;, @mutex=#&lt;Logger::LogDevice::LogDeviceMutex:0&#215;1159978 @mon_owner=nil, @mon_waiting_queue=[], @mon_entering_queue=[], @mon_count=0&gt;, @dev=#&lt;File:/Users/leem/Software/bsheet/log/webapp-development.log&gt;, @shift_size=1048576, @shift_age=0&gt;, @formatter=#&lt;Logger::SimpleFormatter:0&#215;263e744 @datetime_format=nil&gt;&gt;, @quoted_table_names={}, @runtime=428.263902664185, @quoted_column_names={:user_id=&gt;&#8221;`user_id`&#8221;, &#8220;suggestions_user_id_fkey&#8221;=&gt;&#8221;`suggestions_user_id_fkey`&#8221;, &#8220;id&#8221;=&gt;&#8221;`id`&#8221;}, @config={:adapter=&gt;&#8221;mysql&#8221;, :username=&gt;&#8221;root&#8221;, :socket=&gt;&#8221;/tmp/mysql.sock&#8221;, :host=&gt;&#8221;localhost&#8221;, :password=&gt;&#8221;*******&#8221;, :database=&gt;&#8221;broadersheet_testing1&#8243;}, @query_cache_enabled=false, @connection=#&lt;Mysql:0&#215;23dc154&gt;, @connection_options=["localhost", "root", "root", "broadersheet_testing1", nil, "/tmp/mysql.sock"]&gt;, name=:suggestion, type=:string, limit=200, precision=nil, scale=nil, default=nil, null=false&gt;, #&lt;struct ActiveRecord::ConnectionAdapters::ColumnDefinition base=#&lt;ActiveRecord::ConnectionAdapters::MysqlAdapter:0&#215;23d7eb0 @last_verification=0, @logger=#&lt;Logger:0&#215;1159a04 @level=0, @default_formatter=#&lt;Logger::Formatter:0&#215;11599c8 @datetime_format=nil&gt;, @progname=nil, @logdev=#&lt;Logger::LogDevice:0&#215;11599a0 @filename=&#8221;/Users/leem/Software/bsheet/log/webapp-development.log&#8221;, @mutex=#&lt;Logger::LogDevice::LogDeviceMutex:0&#215;1159978 @mon_owner=nil, @mon_waiting_queue=[], @mon_entering_queue=[], @mon_count=0&gt;, @dev=#&lt;File:/Users/leem/Software/bsheet/log/webapp-development.log&gt;, @shift_size=1048576, @shift_age=0&gt;, @formatter=#&lt;Logger::SimpleFormatter:0&#215;263e744 @datetime_format=nil&gt;&gt;, @quoted_table_names={}, @runtime=428.263902664185, @quoted_column_names={:user_id=&gt;&#8221;`user_id`&#8221;, &#8220;suggestions_user_id_fkey&#8221;=&gt;&#8221;`suggestions_user_id_fkey`&#8221;, &#8220;id&#8221;=&gt;&#8221;`id`&#8221;}, @config={:adapter=&gt;&#8221;mysql&#8221;, :username=&gt;&#8221;root&#8221;, :socket=&gt;&#8221;/tmp/mysql.sock&#8221;, :host=&gt;&#8221;localhost&#8221;, , :database=&gt;&#8221;broadersheet_testing1&#8243;}, @query_cache_enabled=false, @connection=#&lt;Mysql:0&#215;23dc154&gt;, @connection_options=["localhost", "root", "root", "broadersheet_testing1", nil, "/tmp/mysql.sock"]&gt;, name=:userinfo, type=:string, limit=80, precision=nil, scale=nil, default=nil, null=nil&gt;, #&lt;struct ActiveRecord::ConnectionAdapters::ColumnDefinition base=#&lt;ActiveRecord::ConnectionAdapters::MysqlAdapter:0&#215;23d7eb0 @last_verification=0, @logger=#&lt;Logger:0&#215;1159a04 @level=0, @default_formatter=#&lt;Logger::Formatter:0&#215;11599c8 @datetime_format=nil&gt;, @progname=nil, @logdev=#&lt;Logger::LogDevice:0&#215;11599a0 @filename=&#8221;/Users/leem/Software/bsheet/log/webapp-development.log&#8221;, @mutex=#&lt;Logger::LogDevice::LogDeviceMutex:0&#215;1159978 @mon_owner=nil, @mon_waiting_queue=[], @mon_entering_queue=[], @mon_count=0&gt;, @dev=#&lt;File:/Users/leem/Software/bsheet/log/webapp-development.log&gt;, @shift_size=1048576, @shift_age=0&gt;, @formatter=#&lt;Logger::SimpleFormatter:0&#215;263e744 @datetime_format=nil&gt;&gt;, @quoted_table_names={}, @runtime=428.263902664185, @quoted_column_names={:user_id=&gt;&#8221;`user_id`&#8221;, &#8220;suggestions_user_id_fkey&#8221;=&gt;&#8221;`suggestions_user_id_fkey`&#8221;, &#8220;id&#8221;=&gt;&#8221;`id`&#8221;}, @config={:adapter=&gt;&#8221;mysql&#8221;, :username=&gt;&#8221;root&#8221;, :socket=&gt;&#8221;/tmp/mysql.sock&#8221;, :host=&gt;&#8221;localhost&#8221;, , :database=&gt;&#8221;broadersheet_testing1&#8243;}, @query_cache_enabled=false, @connection=#&lt;Mysql:0&#215;23dc154&gt;, @connection_options=["localhost", "root", "root", "broadersheet_testing1", nil, "/tmp/mysql.sock"]&gt;, name=:actioned, type=:datetime, limit=nil, precision=nil, scale=nil, default=nil, null=nil&gt;, #&lt;struct ActiveRecord::ConnectionAdapters::ColumnDefinition base=#&lt;ActiveRecord::ConnectionAdapters::MysqlAdapter:0&#215;23d7eb0 @last_verification=0, @logger=#&lt;Logger:0&#215;1159a04 @level=0, @default_formatter=#&lt;Logger::Formatter:0&#215;11599c8 @datetime_format=nil&gt;, @progname=nil, @logdev=#&lt;Logger::LogDevice:0&#215;11599a0 @filename=&#8221;/Users/leem/Software/bsheet/log/webapp-development.log&#8221;, @mutex=#&lt;Logger::LogDevice::LogDeviceMutex:0&#215;1159978 @mon_owner=nil, @mon_waiting_queue=[], @mon_entering_queue=[], @mon_count=0&gt;, @dev=#&lt;File:/Users/leem/Software/bsheet/log/webapp-development.log&gt;, @shift_size=1048576, @shift_age=0&gt;, @formatter=#&lt;Logger::SimpleFormatter:0&#215;263e744 @datetime_format=nil&gt;&gt;, @quoted_table_names={}, @runtime=428.263902664185, @quoted_column_names={:user_id=&gt;&#8221;`user_id`&#8221;, &#8220;suggestions_user_id_fkey&#8221;=&gt;&#8221;`suggestions_user_id_fkey`&#8221;, &#8220;id&#8221;=&gt;&#8221;`id`&#8221;}, @config={:adapter=&gt;&#8221;mysql&#8221;, :username=&gt;&#8221;root&#8221;, :socket=&gt;&#8221;/tmp/mysql.sock&#8221;, :host=&gt;&#8221;localhost&#8221;, , :database=&gt;&#8221;broadersheet_testing1&#8243;}, @query_cache_enabled=false, @connection=#&lt;Mysql:0&#215;23dc154&gt;, @connection_options=["localhost", "root", "root", "broadersheet_testing1", nil, "/tmp/mysql.sock"]&gt;, name=:user_id, type=:integer, limit=11, precision=nil, scale=nil, default=nil, null=nil&gt;, #&lt;struct ActiveRecord::ConnectionAdapters::ColumnDefinition base=#&lt;ActiveRecord::ConnectionAdapters::MysqlAdapter:0&#215;23d7eb0 @last_verification=0, @logger=#&lt;Logger:0&#215;1159a04 @level=0, @default_formatter=#&lt;Logger::Formatter:0&#215;11599c8 @datetime_format=nil&gt;, @progname=nil, @logdev=#&lt;Logger::LogDevice:0&#215;11599a0 @filename=&#8221;/Users/leem/Software/bsheet/log/webapp-development.log&#8221;, @mutex=#&lt;Logger::LogDevice::LogDeviceMutex:0&#215;1159978 @mon_owner=nil, @mon_waiting_queue=[], @mon_entering_queue=[], @mon_count=0&gt;, @dev=#&lt;File:/Users/leem/Software/bsheet/log/webapp-development.log&gt;, @shift_size=1048576, @shift_age=0&gt;, @formatter=#&lt;Logger::SimpleFormatter:0&#215;263e744 @datetime_format=nil&gt;&gt;, @quoted_table_names={}, @runtime=428.263902664185, @quoted_column_names={:user_id=&gt;&#8221;`user_id`&#8221;, &#8220;suggestions_user_id_fkey&#8221;=&gt;&#8221;`suggestions_user_id_fkey`&#8221;, &#8220;id&#8221;=&gt;&#8221;`id`&#8221;}, @config={:adapter=&gt;&#8221;mysql&#8221;, :username=&gt;&#8221;root&#8221;, :socket=&gt;&#8221;/tmp/mysql.sock&#8221;, :host=&gt;&#8221;localhost&#8221;, , :database=&gt;&#8221;broadersheet_testing1&#8243;}, @query_cache_enabled=false, @connection=#&lt;Mysql:0&#215;23dc154&gt;, @connection_options=["localhost", "root", "root", "broadersheet_testing1", nil, "/tmp/mysql.sock"]&gt;, name=:created_at, type=:datetime, limit=nil, precision=nil, scale=nil, default=nil, null=false&gt;, #&lt;struct ActiveRecord::ConnectionAdapters::ColumnDefinition base=#&lt;ActiveRecord::ConnectionAdapters::MysqlAdapter:0&#215;23d7eb0 @last_verification=0, @logger=#&lt;Logger:0&#215;1159a04 @level=0, @default_formatter=#&lt;Logger::Formatter:0&#215;11599c8 @datetime_format=nil&gt;, @progname=nil, @logdev=#&lt;Logger::LogDevice:0&#215;11599a0 @filename=&#8221;/Users/leem/Software/bsheet/log/webapp-development.log&#8221;, @mutex=#&lt;Logger::LogDevice::LogDeviceMutex:0&#215;1159978 @mon_owner=nil, @mon_waiting_queue=[], @mon_entering_queue=[], @mon_count=0&gt;, @dev=#&lt;File:/Users/leem/Software/bsheet/log/webapp-development.log&gt;, @shift_size=1048576, @shift_age=0&gt;, @formatter=#&lt;Logger::SimpleFormatter:0&#215;263e744 @datetime_format=nil&gt;&gt;, @quoted_table_names={}, @runtime=428.263902664185, @quoted_column_names={:user_id=&gt;&#8221;`user_id`&#8221;, &#8220;suggestions_user_id_fkey&#8221;=&gt;&#8221;`suggestions_user_id_fkey`&#8221;, &#8220;id&#8221;=&gt;&#8221;`id`&#8221;}, @config={:adapter=&gt;&#8221;mysql&#8221;, :username=&gt;&#8221;root&#8221;, :socket=&gt;&#8221;/tmp/mysql.sock&#8221;, :host=&gt;&#8221;localhost&#8221;, , :database=&gt;&#8221;broadersheet_testing1&#8243;}, @query_cache_enabled=false, @connection=#&lt;Mysql:0&#215;23dc154&gt;, @connection_options=["localhost", "root", "root", "broadersheet_testing1", nil, "/tmp/mysql.sock"]&gt;, name=:updated_at, type=:datetime, limit=nil, precision=nil, scale=nil, default=nil, null=nil&gt;, CONSTRAINT `suggestions_user_id_fkey` FOREIGN KEY (`user_id`) REFERENCES users (`id`)) ENGINE=InnoDB</p>
<p>(See full trace by running task with &#8211;trace)</p>
<p></code></p>
<p><code>Process finished with exit code 1<br />
</code></p>
<div class="zemanta-pixie" style="margin-top: 10px; height: 15px;"><a href="http://reblog.zemanta.com/zemified/7af8a9eb-9f33-4111-b665-4028de046445/"class="zemanta-pixie-a" title="Reblog this post [with Zemanta]"  onclick="javascript:urchinTracker ('/outbound/article/reblog.zemanta.com');"><img class="zemanta-pixie-img" style="border:none;float:right" src="http://img.zemanta.com/reblog_e.png?x-id=7af8a9eb-9f33-4111-b665-4028de046445" alt="Reblog this post [with Zemanta]" /></a><span class="zem-script more-related more-info pretty-attribution paragraph-reblog"><script src="http://static.zemanta.com/readside/loader.js" type="text/javascript"></script></span></div>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/Fonicmonkey?a=laYh5-iw0sM:lKbhbWDVn50:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/Fonicmonkey?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Fonicmonkey?a=laYh5-iw0sM:lKbhbWDVn50:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/Fonicmonkey?d=qj6IDK7rITs" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://www.fonicmonkey.net/posts/mig_constraints-is-not-compatible-with-rails-23/feed/</wfw:commentRss>
		<feedburner:origLink>http://www.fonicmonkey.net/posts/mig_constraints-is-not-compatible-with-rails-23/</feedburner:origLink></item>
		<item>
		<title>Why is this guy’s face in my email?</title>
		<link>http://feedproxy.google.com/~r/Fonicmonkey/~3/B4_TUfvyhwE/</link>
		<comments>http://www.fonicmonkey.net/posts/who-is-the-crazy-gmail-video-chat-guy/#comments</comments>
		<pubDate>Thu, 13 Aug 2009 09:22:29 +0000</pubDate>
		<dc:creator>lee</dc:creator>
		
		<category><![CDATA[Miscellaneous]]></category>

		<guid isPermaLink="false">http://www.fonicmonkey.net/?p=363</guid>
		<description><![CDATA[I spend several hours a day with this guy, but I don&#8217;t even know his name. 
He&#8217;s been following me around for several months, possibly longer.
Every day he sits and watches me as I do business, send personal messages to friends and family, and arrange my life.
He is&#8230; the gmail video chat advertising guy.
Who is [...]<p><a href="http://sharethis.com/item?&#038;wp=2.6&#38;publisher=45f383fd-268d-45f2-99b9-3fb7a80c83c9&#38;title=Why+is+this+guy%26%238217%3Bs+face+in+my+email%3F&#38;url=http%3A%2F%2Fwww.fonicmonkey.net%2Fposts%2Fwho-is-the-crazy-gmail-video-chat-guy%2F">ShareThis</a></p>]]></description>
			<content:encoded><![CDATA[<p>I spend several hours a day with this guy, but I don&#8217;t even know his name. <a href="http://www.fonicmonkey.net/wp-content/uploads/2009/08/videoguy.jpg" ><img class="alignleft size-full wp-image-364" title="\&quot;Try video chat\&quot;" src="http://www.fonicmonkey.net/wp-content/uploads/2009/08/videoguy.jpg" alt="" width="184" height="226" /></a></p>
<p>He&#8217;s been following me around for several months, possibly longer.</p>
<p>Every day he sits and watches me as I do business, send personal messages to friends and family, and arrange my life.</p>
<p>He is&#8230; the gmail video chat advertising guy.</p>
<p><em>Who is that guy?</em></p>
<p>More to the point, am I the only one who finds instant messaging in their email client difficult to cope with? The immediacy of the interruption is unparalleled so I tend to keep &#8220;chat&#8221; turned off, which annoys colleagues. It&#8217;s important to get in the zone, and minimizing interruptions seems like an important way to improve my chances.</p>
<p>If you&#8217;re a professional programmer, do you still keep IM running all day?</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/Fonicmonkey?a=B4_TUfvyhwE:CinmqnLXDpg:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/Fonicmonkey?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Fonicmonkey?a=B4_TUfvyhwE:CinmqnLXDpg:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/Fonicmonkey?d=qj6IDK7rITs" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://www.fonicmonkey.net/posts/who-is-the-crazy-gmail-video-chat-guy/feed/</wfw:commentRss>
		<feedburner:origLink>http://www.fonicmonkey.net/posts/who-is-the-crazy-gmail-video-chat-guy/</feedburner:origLink></item>
		<item>
		<title>Setting up a kick-ass rails server on Ubuntu 9.04 (Jaunty)</title>
		<link>http://feedproxy.google.com/~r/Fonicmonkey/~3/2j-e806thcA/</link>
		<comments>http://www.fonicmonkey.net/posts/setting-up-a-kick-ass-rails-server-on-ubuntu-904-jaunty/#comments</comments>
		<pubDate>Sat, 27 Jun 2009 01:51:28 +0000</pubDate>
		<dc:creator>lee</dc:creator>
		
		<category><![CDATA[Rails]]></category>

		<guid isPermaLink="false">http://www.fonicmonkey.net/?p=340</guid>
		<description><![CDATA[I recently created a new slicehost and thought I&#8217;d try the latest Ubuntu release with it. Unlike brightbox hosting, you only get a plain boring ubuntu installation out of the box on slicehost (and various other VPS-based hosting services).
A bit of aptitude
Ubuntu/Debian make it really nice and easy to install packages, but this time it [...]<p><a href="http://sharethis.com/item?&#038;wp=2.6&#38;publisher=45f383fd-268d-45f2-99b9-3fb7a80c83c9&#38;title=Setting+up+a+kick-ass+rails+server+on+Ubuntu+9.04+%28Jaunty%29&#38;url=http%3A%2F%2Fwww.fonicmonkey.net%2Fposts%2Fsetting-up-a-kick-ass-rails-server-on-ubuntu-904-jaunty%2F">ShareThis</a></p>]]></description>
			<content:encoded><![CDATA[<p>I recently created a new <a href="http://www.slicehost.com/" onclick="javascript:urchinTracker ('/outbound/article/www.slicehost.com');">slicehost</a> and thought I&#8217;d try the latest <a href="http://www.ubuntu.com/" onclick="javascript:urchinTracker ('/outbound/article/www.ubuntu.com');">Ubuntu</a> release with it. Unlike <a href="http://www.brightbox.co.uk/" onclick="javascript:urchinTracker ('/outbound/article/www.brightbox.co.uk');">brightbox</a> hosting, you only get a plain boring ubuntu installation out of the box on slicehost (and various other VPS-based hosting services).</p>
<h3>A bit of aptitude</h3>
<p>Ubuntu/Debian make it really nice and easy to install packages, but this time it still took me a couple of hours to install everything.</p>
<p>For my (and your) future reference, here&#8217;s <strong>all you need to create a full rails/mysql/apache platform</strong> on Ubuntu 9.04:<br />
<code><br />
apt-get install rubygems ruby1.8-dev mysql-server-5.1 libmysqlclient15-dev apache2 libopenssl-ruby libxslt1-dev libcurl4-gnutls-dev build-essential apache2-prefork-dev  libapr1-dev libaprutil1-dev libmagickwand-dev git-core subversion</code></p>
<p><code>gem install rails --version=<span style="color: #ff6600;">2.2.2</span><br />
gem install rake mysql passenger<br />
</code></p>
<p><code>cd /to/your/app<br />
rake gems:install<br />
</code></p>
<p>Be sure to follow the instructions that appear after installing passenger, and then that&#8217;s it! Make sure you set the version number of rails that you need, or remove the &#8211;version parameter if you just want the latest stable release.</p>
<p>(Note: the last line assumes you&#8217;ve added all the gems your application requires to config/environment.rb. You could make the above list of packages even more minimal, but they cover plenty of common gem dependencies).</p>
<h3>Going the extra mile</h3>
<p>If you need to setup an environment to create screenshots programmatically, you&#8217;ll need a virtual X server, firefox and selenium (which is Java-based). That&#8217;s also fairly easy:<br />
<code><br />
apt-get install xvfb firefox latex-xft-fonts sun-java6-jdk gsfonts-x11 sun-java6-fonts<br />
gem install selenium-client</code></p>
<p>Do you have any <em>must install</em> packages when creating a new server? Please add them in the comments below.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/Fonicmonkey?a=2j-e806thcA:yZY16d66JyM:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/Fonicmonkey?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Fonicmonkey?a=2j-e806thcA:yZY16d66JyM:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/Fonicmonkey?d=qj6IDK7rITs" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://www.fonicmonkey.net/posts/setting-up-a-kick-ass-rails-server-on-ubuntu-904-jaunty/feed/</wfw:commentRss>
		<feedburner:origLink>http://www.fonicmonkey.net/posts/setting-up-a-kick-ass-rails-server-on-ubuntu-904-jaunty/</feedburner:origLink></item>
		<item>
		<title>Wisdom from a different (Internet) age</title>
		<link>http://feedproxy.google.com/~r/Fonicmonkey/~3/yxcsQc1O0lw/</link>
		<comments>http://www.fonicmonkey.net/posts/wisdom-from-a-different-internet-age/#comments</comments>
		<pubDate>Mon, 11 May 2009 15:43:26 +0000</pubDate>
		<dc:creator>lee</dc:creator>
		
		<category><![CDATA[Starting up]]></category>

		<guid isPermaLink="false">http://www.crossbonesystems.com/?p=160</guid>
		<description><![CDATA[It doesn&#8217;t happen very often, but I was pointed to an online article recently that dates back almost a decade. The Pitchman is a story by Malcolm Gladwell about &#8221;Ron Popeil, who invented a better rotisserie in his kitchen and went out and pitched it himself.&#8221;
&#8220;Like most great innovations, it was disruptive. And how do you [...]<p><a href="http://sharethis.com/item?&#038;wp=2.6&#38;publisher=45f383fd-268d-45f2-99b9-3fb7a80c83c9&#38;title=Wisdom+from+a+different+%28Internet%29+age&#38;url=http%3A%2F%2Fwww.fonicmonkey.net%2Fposts%2Fwisdom-from-a-different-internet-age%2F">ShareThis</a></p>]]></description>
			<content:encoded><![CDATA[<p>It doesn&#8217;t happen very often, but I was pointed to an online article recently that dates back almost a decade. <a href="http://www.gladwell.com/2000/2000_10_30_a_pitchman.htm" onclick="javascript:urchinTracker ('/outbound/article/www.gladwell.com');">The Pitchman</a> is a story by Malcolm Gladwell about &#8221;Ron Popeil, who invented a better rotisserie in his kitchen and went out and pitched it himself.&#8221;</p>
<p>&#8220;Like most great innovations, it was disruptive. And how do you persuade people to disrupt their lives? Not merely by ingratiation or sincerity, and not by being famous or beautiful. You have to <strong><em>explain the invention</em></strong> to customers&#8211; not once or twice but <strong><em>three or four times, with a different twist each time</em></strong>. You have to show them exactly how it works and why it works, and make them follow your hands as you chop liver with it, and then tell them precisely how it fits into their routine, and, finally, sell them on the paradoxical fact that, revolutionary as the gadget is, it&#8217;s not at all hard to use.&#8221;</p>
<p>&#8220;in every respect the design of the product must support the transparency and effectiveness of its performance during a demonstration - the better it looks onstage, the easier it is for the pitchman to &#8230; ask for the money.&#8221;</p>
<p>While Ron and the article are focused on gadgets and devices, the above holds true for any kind of innovation that you&#8217;re trying to convince people to buy, or in the case of a free service, just to use.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/Fonicmonkey?a=yxcsQc1O0lw:a4Uc2k1lZ_A:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/Fonicmonkey?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Fonicmonkey?a=yxcsQc1O0lw:a4Uc2k1lZ_A:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/Fonicmonkey?d=qj6IDK7rITs" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://www.fonicmonkey.net/posts/wisdom-from-a-different-internet-age/feed/</wfw:commentRss>
		<feedburner:origLink>http://www.fonicmonkey.net/posts/wisdom-from-a-different-internet-age/</feedburner:origLink></item>
		<item>
		<title>Nokogiri fails to work on Solaris (11), but fix it like this!</title>
		<link>http://feedproxy.google.com/~r/Fonicmonkey/~3/4lS5qEvEMAk/</link>
		<comments>http://www.fonicmonkey.net/posts/nokogiri-fails-to-work-on-solaris-11-but-fix-it-like-this/#comments</comments>
		<pubDate>Tue, 31 Mar 2009 17:20:21 +0000</pubDate>
		<dc:creator>lee</dc:creator>
		
		<category><![CDATA[Rails]]></category>

		<guid isPermaLink="false">http://www.fonicmonkey.net/?p=171</guid>
		<description><![CDATA[I&#8217;ll have a better fix up in the near future, but for now, the ruby gem &#8220;Nokogiri&#8221; crashed out on me on Joyent&#8217;s Solaris platform. Its error was a little cryptic unless you&#8217;re familiar with libc. I can&#8217;t reproduce it here because unfortunately it&#8217;s lost in the sands of scrollback buffer.
The crux of the problem was [...]<p><a href="http://sharethis.com/item?&#038;wp=2.6&#38;publisher=45f383fd-268d-45f2-99b9-3fb7a80c83c9&#38;title=Nokogiri+fails+to+work+on+Solaris+%2811%29%2C+but+fix+it+like+this%21&#38;url=http%3A%2F%2Fwww.fonicmonkey.net%2Fposts%2Fnokogiri-fails-to-work-on-solaris-11-but-fix-it-like-this%2F">ShareThis</a></p>]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ll have a better fix up in the near future, but for now, the ruby gem &#8220;Nokogiri&#8221; crashed out on me on Joyent&#8217;s Solaris platform. Its error was a little cryptic unless you&#8217;re familiar with libc. I can&#8217;t reproduce it here because unfortunately it&#8217;s lost in the sands of scrollback buffer.</p>
<p>The crux of the problem was the reference to a missing vasprintf function. Nokogiri has an extension implemented in C that speeds it up with native functions. The extension is compiled when you do &#8216;gem install nokogiri&#8217; and will compile even though the vasprintf function is missing in your environment.</p>
<p>vasprintf is available in Linux, but not in Windows or Solaris. Nokogiri already have a workaround in place for Windows, but they don&#8217;t yet detect the issue in Solaris so the error still occurs. I plan to submit a patch to detect this automatically. If for any reason you need to get nokogiri working immediately on your Solaris 11-based Joyent accelerator, I did the following after installing the nokogiri gem:</p>
<pre>cd /opt/local/lib/ruby/gems/1.8/gems/nokogiri-1.2.3/ext/nokogiri/</pre>
<pre>vi native.c</pre>
<pre>[remove the #if XP_WIN line and its corresponding #endif]</pre>
<pre>vi native.h</pre>
<pre>[remove the #if XP_WIN line and its corresponding #endif]</pre>
<pre>make</pre>
<pre>make install</pre>
<p>FWIW, on Linux and Mac OS X nokogiri <em>just works</em>.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/Fonicmonkey?a=4lS5qEvEMAk:s8NawCKWYNs:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/Fonicmonkey?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Fonicmonkey?a=4lS5qEvEMAk:s8NawCKWYNs:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/Fonicmonkey?d=qj6IDK7rITs" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://www.fonicmonkey.net/posts/nokogiri-fails-to-work-on-solaris-11-but-fix-it-like-this/feed/</wfw:commentRss>
		<feedburner:origLink>http://www.fonicmonkey.net/posts/nokogiri-fails-to-work-on-solaris-11-but-fix-it-like-this/</feedburner:origLink></item>
		<item>
		<title>Issues with JBCP and Sybase</title>
		<link>http://feedproxy.google.com/~r/Fonicmonkey/~3/XZbpayn44ik/</link>
		<comments>http://www.fonicmonkey.net/posts/issues-with-jbcp-and-sybase/#comments</comments>
		<pubDate>Mon, 09 Feb 2009 14:46:54 +0000</pubDate>
		<dc:creator>lee</dc:creator>
		
		<category><![CDATA[Java]]></category>

		<guid isPermaLink="false">http://www.fonicmonkey.net/?p=156</guid>
		<description><![CDATA[BCP is a method for quickly copying data into SQL Server or Sybase databases. It&#8217;s much faster than running INSERT statements, so if you have a large amount of data, it&#8217;s a tempting option.
However, the trade-off for the speed is that when importing data, it bypasses a large amount of error checking and handling. As [...]<p><a href="http://sharethis.com/item?&#038;wp=2.6&#38;publisher=45f383fd-268d-45f2-99b9-3fb7a80c83c9&#38;title=Issues+with+JBCP+and+Sybase&#38;url=http%3A%2F%2Fwww.fonicmonkey.net%2Fposts%2Fissues-with-jbcp-and-sybase%2F">ShareThis</a></p>]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.google.co.uk/search?hl=en&amp;safe=off&amp;q=BCP+database&amp;btnG=Search&amp;meta=" onclick="javascript:urchinTracker ('/outbound/article/www.google.co.uk');"></a><a href="http://www.flickr.com/photos/timothymorgan/75593157/" onclick="javascript:urchinTracker ('/outbound/article/www.flickr.com');"><img class="alignleft size-full wp-image-167" title="Database" src="http://www.fonicmonkey.net/wp-content/uploads/2009/02/database.jpg" alt="" width="100" height="100" /></a>BCP is a method for quickly copying data into SQL Server or Sybase databases. It&#8217;s much faster than running INSERT statements, so if you have a large amount of data, it&#8217;s a tempting option.</p>
<p>However, the trade-off for the speed is that when importing data, it bypasses a large amount of error checking and handling. As a result, any error messages you do get from the database server can often be cryptic or can even appear to be unrelated to what you&#8217;re trying to accomplish!</p>
<p>As well as the command-line BCP tool, <a href="http://sourceforge.net/projects/jbcp/" onclick="javascript:urchinTracker ('/outbound/article/sourceforge.net');">JBCP</a> is a pure Java library that reimplements the BCP protocol for Java developers. Unfortunately it&#8217;s still relatively immature, and you may find that Sybase gives the following error message in response to almost all JBCP issues:</p>
<p><code>Bad row data received from the client while bulk copying into object 1874356894 in database 4</code></p>
<p>This can be caused by several things. The most common is simply that the table definition has not been setup correctly to allow rows to be BCP&#8217;d into it. One way to resolve the issue is to ensure that the table you are copying into has &#8216;lock allpages&#8217; as part of its definition, for example:</p>
<p><code> CREATE TABLE bcptest (some_key int not null, mydata varchar(50) null) lock allpages<br />
go<br />
</code></p>
<p>Other issues can be caused by using univarchar columns that exceed 255 bytes. This means that all univarchar columns you attempt to copy into must be no larger than univarchar(127). A valid workaround for this issue is to split large column definitions into several smaller columns, and then use an UPDATE statement to reassemble the data from the split columns after it has been uploaded.</p>
<p>To help googlers, here is the complete stack trace I was typically seeing from JBCP before I created my table with the additional lock allpages clauses.</p>
<p><code>java.sql.SQLException: Bad row data received from the client while bulk<br />
copying into object 1874356894 in database 4. Received a row of length<br />
72 whilst maximum or expected row length is 15.<br />
[19/12 10:46:37.160] [TID:lee2BCP1]:Upload of 1 result: FAILED<br />
       at<br />
net.sourceforge.jtds.jdbc.SQLDiagnostic.addDiagnostic(SQLDiagnostic.java:368)<br />
       at net.sourceforge.jtds.jdbc.TdsCore.tdsErrorToken(TdsCore.java:3149)<br />
       at net.sourceforge.jtds.jdbc.TdsCore.nextToken(TdsCore.java:2587)<br />
       at net.sourceforge.jtds.jdbc.TdsCore.getMoreResults(TdsCore.java:734)<br />
       at net.sourceforge.jtds.jdbc.TdsCore.bcpBatch(TdsCore.java:2394)<br />
       at net.sourceforge.jtds.jdbc.BCP.bcpBatch(BCP.java:1134)<br />
..snip..<br />
</code></p>
<p>One final warning for using JBCP - you don&#8217;t always even see the problem by default - some exceptions are supressed causing silent failure! There be dragons!</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~f/Fonicmonkey?a=htLoFQdF"><img src="http://feeds.feedburner.com/~f/Fonicmonkey?d=41" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/Fonicmonkey?a=3Vu9i3MD"><img src="http://feeds.feedburner.com/~f/Fonicmonkey?d=52" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://www.fonicmonkey.net/posts/issues-with-jbcp-and-sybase/feed/</wfw:commentRss>
		<feedburner:origLink>http://www.fonicmonkey.net/posts/issues-with-jbcp-and-sybase/</feedburner:origLink></item>
		<item>
		<title>Getting Rails 2.2 to work on Mac OS X, despite the MySQL ruby “gem”</title>
		<link>http://feedproxy.google.com/~r/Fonicmonkey/~3/7gnXpp9Qasg/</link>
		<comments>http://www.fonicmonkey.net/posts/mysql-ruby-rails-gem-on-mac-os-x-nightmare/#comments</comments>
		<pubDate>Thu, 29 Jan 2009 13:31:41 +0000</pubDate>
		<dc:creator>lee</dc:creator>
		
		<category><![CDATA[Rails]]></category>

		<guid isPermaLink="false">http://www.fonicmonkey.net/?p=153</guid>
		<description><![CDATA[rubygems makes package management a nightmare. This is demonstrated every time you try and setup a new server using your operating system&#8217;s ruby/rails packages. It gets fully demonstrated when you try and upgrade to Rails 2.2 on a Mac. You can go read the full details of the nightmare if you&#8217;re so inclined.
The summary is that rails [...]<p><a href="http://sharethis.com/item?&#038;wp=2.6&#38;publisher=45f383fd-268d-45f2-99b9-3fb7a80c83c9&#38;title=Getting+Rails+2.2+to+work+on+Mac+OS+X%2C+despite+the+MySQL+ruby+%26%238220%3Bgem%26%238221%3B&#38;url=http%3A%2F%2Fwww.fonicmonkey.net%2Fposts%2Fmysql-ruby-rails-gem-on-mac-os-x-nightmare%2F">ShareThis</a></p>]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.rubygems.org/read/book/1" onclick="javascript:urchinTracker ('/outbound/article/www.rubygems.org');">rubygems</a> makes package management a nightmare. This is demonstrated every time you try and setup a new server using your <strong>operating system&#8217;s</strong> ruby/rails packages. It gets <strong>fully</strong> demonstrated when you try and upgrade to Rails 2.2 on a Mac. You can go read <a href="http://notetoself.vrensk.com/2008/07/mysql-gem-on-os-x-leopard/" onclick="javascript:urchinTracker ('/outbound/article/notetoself.vrensk.com');">the full details of the nightmare</a> if you&#8217;re so inclined.</p>
<p>The summary is that rails 2.2 removes the mysql driver and so you have to install a native driver using rubygems. Normally this would be a single command, but MySQL is a mess on Mac OS X. If you have a working MySQL installation on a Mac, chances are you&#8217;ve used MAMP and/or installed it yourself.</p>
<p>After about two hours of pain, I finally came across <a href="http://www.ruby-forum.com/topic/171910#753830" onclick="javascript:urchinTracker ('/outbound/article/www.ruby-forum.com');">this forum post</a> which has the horribly hacky but <em>wonderfully simple</em> idea of copying the mysql driver that worked in older versions of rails into your rails 2.2 app! This finally worked! On my Mac, this meant running the following command:</p>
<pre> cp /Library/Ruby/Gems/1.8/gems/activerecord-2.1.2/lib/active_record/vendor/mysql.rb ~/Software/myapp/lib/</pre>
<p>When I restarted my rails app, it actually worked! Joy!</p>
<p>It&#8217;s worth noting that it&#8217;s probably worth pushing through the pain to install the native mysql gem on your production servers, but this technique is a winner to keep development on the go.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~f/Fonicmonkey?a=2A4Xl8QM"><img src="http://feeds.feedburner.com/~f/Fonicmonkey?d=41" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/Fonicmonkey?a=FwfG0spF"><img src="http://feeds.feedburner.com/~f/Fonicmonkey?d=52" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://www.fonicmonkey.net/posts/mysql-ruby-rails-gem-on-mac-os-x-nightmare/feed/</wfw:commentRss>
		<feedburner:origLink>http://www.fonicmonkey.net/posts/mysql-ruby-rails-gem-on-mac-os-x-nightmare/</feedburner:origLink></item>
		<item>
		<title>Head Hunting; a brand new way to recruit top talent</title>
		<link>http://feedproxy.google.com/~r/Fonicmonkey/~3/e6jrMuTPI-8/</link>
		<comments>http://www.fonicmonkey.net/posts/head-hunting-a-brand-new-way-to-recruit-top-talent/#comments</comments>
		<pubDate>Fri, 23 Jan 2009 10:27:00 +0000</pubDate>
		<dc:creator>import</dc:creator>
		
		<category><![CDATA[Announcements]]></category>

		<category><![CDATA[Starting up]]></category>

		<category><![CDATA[announcement]]></category>

		<category><![CDATA[facebook]]></category>

		<category><![CDATA[launch]]></category>

		<category><![CDATA[social networking]]></category>

		<guid isPermaLink="false">http://www.crossbonesystems.com/?p=136</guid>
		<description><![CDATA[I&#8217;m pleased to announce the first public beta release of an exciting new service from Crossbone Systems.
Head Hunting is a revolutionary new way to recruit employees at a fraction of the cost of other methods such as recruitment agencies and big job sites. As a Facebook application, Head Hunting allows you to hire new employees [...]<p><a href="http://sharethis.com/item?&#038;wp=2.6&#38;publisher=45f383fd-268d-45f2-99b9-3fb7a80c83c9&#38;title=Head+Hunting%3B+a+brand+new+way+to+recruit+top+talent&#38;url=http%3A%2F%2Fwww.fonicmonkey.net%2Fposts%2Fhead-hunting-a-brand-new-way-to-recruit-top-talent%2F">ShareThis</a></p>]]></description>
			<content:encoded><![CDATA[<p>I&#8217;m pleased to announce the first public beta release of an exciting new service from Crossbone Systems.</p>
<p><a href="http://www.facebook.com/apps/application.php?id=6973913202" onclick="javascript:urchinTracker ('/outbound/article/www.facebook.com');">Head Hunting</a> is a revolutionary new way to recruit employees at a fraction of the cost of other methods such as recruitment agencies and big job sites. As a Facebook application, Head Hunting allows you to hire new employees with a little help from your friends.</p>
<p>This week the service has launched into &#8220;public beta&#8221;, which means anyone can post and search job listings for free.<span id="more-308"></span><br />
Although the service has only launched in a beta release, these exciting features for recruiters are now available:</p>
<ol>
<li>Post jobs on <a href="http://www.facebook.com/apps/application.php?id=6973913202" onclick="javascript:urchinTracker ('/outbound/article/www.facebook.com');">Head Hunting</a></li>
<li>Share your jobs on your profile (in a profile box or on a tab), your news feed, with friends, etc.</li>
<li>Receive questions about your jobs (and easily publish follow-up answers)</li>
<li>Get a birds eye view of everyone applying for your vacancies</li>
<li>Easily promote your listing on facebook, your blog or your website</li>
</ol>
<div>Job seekers have not been left out either. We already have a range of powerful features to help people discover exciting, relevant job opportunities. However, during our beta period, our primary focus is on driving small business owners, managers and HR professionals to start listing their vacancies. </div>
<div id="attachment_137" class="wp-caption aligncenter" style="width: 464px"><a href="http://apps.facebook.com/headhunting/pages/recruiter" onclick="javascript:urchinTracker ('/outbound/article/apps.facebook.com');"><img class="size-full wp-image-137" title="Head Hunting" src="http://www.fonicmonkey.net/wp-content/uploads/2009/01/headhunting1.jpg" alt="Browsing for jobs using Head Hunting" width="454" height="366" /></a><p class="wp-caption-text">Browsing for jobs using Head Hunting</p></div>
<p>If you&#8217;re looking for a new employee but don&#8217;t have the time, money or patience for recruitment agents, then <a href="http://apps.facebook.com/headhunting/jobs/new" onclick="javascript:urchinTracker ('/outbound/article/apps.facebook.com');">list your job on Head Hunting today</a>.</p>
<p>The beta period is expected to run for several months. Any questions should be directed to <a href="mailto:lee@crossbonesystems.com">lee@crossbonesystems.com</a>.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/Fonicmonkey?a=e6jrMuTPI-8:m9fntp-Uzfk:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/Fonicmonkey?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Fonicmonkey?a=e6jrMuTPI-8:m9fntp-Uzfk:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/Fonicmonkey?d=qj6IDK7rITs" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://www.fonicmonkey.net/posts/head-hunting-a-brand-new-way-to-recruit-top-talent/feed/</wfw:commentRss>
		<feedburner:origLink>http://www.fonicmonkey.net/posts/head-hunting-a-brand-new-way-to-recruit-top-talent/</feedburner:origLink></item>
		<item>
		<title>Fun with FBJS: “Can’t find variable: a43014453287_slider”</title>
		<link>http://feedproxy.google.com/~r/Fonicmonkey/~3/3S56lm1RG2c/</link>
		<comments>http://www.fonicmonkey.net/posts/fun-with-fbjs-cant-find-variable/#comments</comments>
		<pubDate>Wed, 14 Jan 2009 13:41:11 +0000</pubDate>
		<dc:creator>lee</dc:creator>
		
		<category><![CDATA[General]]></category>

		<category><![CDATA[code]]></category>

		<category><![CDATA[example]]></category>

		<guid isPermaLink="false">http://www.fonicmonkey.net/?p=158</guid>
		<description><![CDATA[I&#8217;ve been trying to get a slider bar working recently as part of a facebook application. To get the example on the Facebook wiki working out-of-the-box was no problem.
The problems came when I wanted to create the slider bar as the result of a user clicking on an input. For some reason, Facebook only loads [...]<p><a href="http://sharethis.com/item?&#038;wp=2.6&#38;publisher=45f383fd-268d-45f2-99b9-3fb7a80c83c9&#38;title=Fun+with+FBJS%3A+%26%238220%3BCan%26%238217%3Bt+find+variable%3A+a43014453287_slider%26%238221%3B&#38;url=http%3A%2F%2Fwww.fonicmonkey.net%2Fposts%2Ffun-with-fbjs-cant-find-variable%2F">ShareThis</a></p>]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve been trying to get a slider bar working recently as part of a facebook application. To get the <a href="http://wiki.developers.facebook.com/index.php/FBJS/Examples/Slider" onclick="javascript:urchinTracker ('/outbound/article/wiki.developers.facebook.com');">example on the Facebook wiki</a> working out-of-the-box was no problem.</p>
<p>The problems came when I wanted to create the slider bar as the result of a user clicking on an input. For some reason, Facebook only loads 3rd party Javascript (ie. mine) in the body of the page. If a user clicks a link that calls a Javascript function before the page has finished loading, the function may fail if it depends on functions kept in external Javascript files (that have not yet loaded). </p>
<p>Because of the complexity of Facebook pages, there is often between 1 and 5 seconds when a user may click one of my links even though the page hasn&#8217;t technically finished loading. If this happens, the user will either see a very cryptic error or nothing will happen. It&#8217;s a completely unacceptable user experience so I was forced to come up with the workaround below.  </p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">var</span> sliderCreated <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">false</span><span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">// can only create one slider per-page with this</span>
<span style="color: #003366; font-weight: bold;">function</span> createSlider<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span>sliderCreated<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #000066; font-weight: bold;">try</span> <span style="color: #009900;">&#123;</span>
            <span style="color: #003366; font-weight: bold;">new</span> slider<span style="color: #009900;">&#40;</span>document.<span style="color: #660066;">getElementById</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'output'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> document.<span style="color: #660066;">getElementById</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'count_slider'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">0</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">100000</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">250</span><span style="color: #339933;">,</span> document.<span style="color: #660066;">getElementById</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'salary_min'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #339933;">,</span> <span style="color: #CC0000;">500</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            sliderCreated <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">true</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span> <span style="color: #000066; font-weight: bold;">catch</span> <span style="color: #009900;">&#40;</span>error<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
            <span style="color: #006600; font-style: italic;">// Errors may get thrown if the fbslider.js wasn't loaded quickly enough, so we wait a second</span>
            setTimeout<span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> createSlider<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">1000</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>This will detect any errors thrown from the creation of the slider (which relies on an external Javascript file). If an error is found, then the attempt to create the slider will occur again after a second. This has the advantage that even if the second attempt fails (if the network is very slow), it will continue to retry with a delay between each attempt.</p>
<p>A variable (sliderCreated) is used to detect when the slider has been successfully created. In case the link that creates the slider is still clickable after the slider is created, this variable guards against multiple sliders being spawned on the page.</p>
<p>It is left as an exercise to the reader to add an upper limit to the retries if required.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~f/Fonicmonkey?a=yDjeh9E8"><img src="http://feeds.feedburner.com/~f/Fonicmonkey?d=41" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/Fonicmonkey?a=Ki5NweU0"><img src="http://feeds.feedburner.com/~f/Fonicmonkey?d=52" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://www.fonicmonkey.net/posts/fun-with-fbjs-cant-find-variable/feed/</wfw:commentRss>
		<feedburner:origLink>http://www.fonicmonkey.net/posts/fun-with-fbjs-cant-find-variable/</feedburner:origLink></item>
	</channel>
</rss><!-- Dynamic Page Served (once) in 0.825 seconds --><!-- Cached page served by WP-Cache -->
