<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:blogger="http://schemas.google.com/blogger/2008" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" gd:etag="W/&quot;CkIHR3k7fyp7ImA9WhBXFE8.&quot;"><id>tag:blogger.com,1999:blog-2136289839485858746</id><updated>2013-03-27T14:42:16.707-07:00</updated><category term="rest" /><category term="obama" /><category term="music" /><category term="technology" /><category term="ruby on rails" /><category term="java" /><category term="politics" /><category term="mac" /><title>tektastic</title><subtitle type="html">Tech ramblings by Konstantin Gredeskoul</subtitle><link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://tektastic.com/feeds/posts/default" /><link rel="alternate" type="text/html" href="http://tektastic.com/" /><link rel="next" type="application/atom+xml" href="http://www.blogger.com/feeds/2136289839485858746/posts/default?start-index=26&amp;max-results=25&amp;redirect=false&amp;v=2" /><author><name>@kig</name><uri>http://www.blogger.com/profile/15696255549758746527</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://1.bp.blogspot.com/-zoKqo1q-CLM/T8sge_-0jSI/AAAAAAAAAVM/-hCFBaxZWBg/s220/moos_icon_lg.jpg" /></author><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>46</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/tektastic" /><feedburner:info uri="tektastic" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><feedburner:browserFriendly></feedburner:browserFriendly><entry gd:etag="W/&quot;D0UBR3w_eCp7ImA9WhBTEU8.&quot;"><id>tag:blogger.com,1999:blog-2136289839485858746.post-2576772801775656339</id><published>2013-02-05T20:34:00.001-08:00</published><updated>2013-02-05T20:34:16.240-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2013-02-05T20:34:16.240-08:00</app:edited><title>Wanelo Case Study: The Case for Vertial Sharding</title><content type="html">Here is a &lt;a href="http://building.wanelo.com/post/42361472646/the-case-for-vertical-sharding" target="_blank"&gt;recently published post&lt;/a&gt; on &lt;a href="http://building.wanelo.com/" target="_blank"&gt;Wanelo's technnical blog&lt;/a&gt; about our recent effort to vertically shard the database. </content><link rel="replies" type="application/atom+xml" href="http://tektastic.com/feeds/2576772801775656339/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=2136289839485858746&amp;postID=2576772801775656339" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2136289839485858746/posts/default/2576772801775656339?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2136289839485858746/posts/default/2576772801775656339?v=2" /><link rel="alternate" type="text/html" href="http://tektastic.com/2013/02/wanelo-case-study-case-for-vertial.html" title="Wanelo Case Study: The Case for Vertial Sharding" /><author><name>@kig</name><uri>http://www.blogger.com/profile/15696255549758746527</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://1.bp.blogspot.com/-zoKqo1q-CLM/T8sge_-0jSI/AAAAAAAAAVM/-hCFBaxZWBg/s220/moos_icon_lg.jpg" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;DEQARnY9eip7ImA9WhJUFkg.&quot;"><id>tag:blogger.com,1999:blog-2136289839485858746.post-5756098388868930454</id><published>2012-09-14T13:59:00.000-07:00</published><updated>2012-09-14T13:59:07.862-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-09-14T13:59:07.862-07:00</app:edited><title>Wanelo Tech Blog: The Big Switch: How We Rebuilt Wanelo from Scratch and Lived to Tell About It</title><content type="html">Just published my &lt;a href="http://blog.wanelo.com/post/31534906083/the-big-switch-how-we-rebuilt-wanelo-from-scratch-and" target="_blank"&gt;first contribution&lt;/a&gt; to &lt;a href="http://blog.wanelo.com/" target="_blank"&gt;Wanelo Blog&lt;/a&gt;&amp;nbsp;on the subject of rewriting technology stack from scratch, and moving from Java to Ruby.&lt;br /&gt;
&lt;br /&gt;
Feel free to leave comments here also!&lt;br /&gt;
&lt;br /&gt;
-- Konstantin (at &lt;a href="http://gogaruco.com/" target="_blank"&gt;GoGaRuCo&lt;/a&gt; 2012).</content><link rel="replies" type="application/atom+xml" href="http://tektastic.com/feeds/5756098388868930454/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=2136289839485858746&amp;postID=5756098388868930454" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2136289839485858746/posts/default/5756098388868930454?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2136289839485858746/posts/default/5756098388868930454?v=2" /><link rel="alternate" type="text/html" href="http://tektastic.com/2012/09/wanelo-tech-blog-big-switch-how-we.html" title="Wanelo Tech Blog: The Big Switch: How We Rebuilt Wanelo from Scratch and Lived to Tell About It" /><author><name>@kig</name><uri>http://www.blogger.com/profile/15696255549758746527</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://1.bp.blogspot.com/-zoKqo1q-CLM/T8sge_-0jSI/AAAAAAAAAVM/-hCFBaxZWBg/s220/moos_icon_lg.jpg" /></author><thr:total>2</thr:total></entry><entry gd:etag="W/&quot;DkANQ34yeSp7ImA9WhJXFEs.&quot;"><id>tag:blogger.com,1999:blog-2136289839485858746.post-368494478473587711</id><published>2012-08-08T15:26:00.003-07:00</published><updated>2012-08-08T15:26:32.091-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-08-08T15:26:32.091-07:00</app:edited><title>Nagios checks for Sidekiq Queue size monitoring and Joyent RAM size</title><content type="html">At Wanelo we are committed to sharing as much of our code as possible with the world, since we are ourselves highly reliant on open source movement (ruby, rails, etc).&lt;br /&gt;
&lt;br /&gt;
Here is a small but growing project with simple BASH shell scripts used by Nagios monitoring system to ensure things are running smoothly.&lt;br /&gt;
&lt;a href="http://www.blogger.com/goog_1581302173"&gt;&lt;br /&gt;&lt;/a&gt;
&lt;a href="https://github.com/wanelo/nagios-checks"&gt;https://github.com/wanelo/nagios-checks&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Please see the examples in the README on how to use it with nagios.</content><link rel="replies" type="application/atom+xml" href="http://tektastic.com/feeds/368494478473587711/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=2136289839485858746&amp;postID=368494478473587711" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2136289839485858746/posts/default/368494478473587711?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2136289839485858746/posts/default/368494478473587711?v=2" /><link rel="alternate" type="text/html" href="http://tektastic.com/2012/08/nagios-checks-for-sidekiq-queue-size.html" title="Nagios checks for Sidekiq Queue size monitoring and Joyent RAM size" /><author><name>@kig</name><uri>http://www.blogger.com/profile/15696255549758746527</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://1.bp.blogspot.com/-zoKqo1q-CLM/T8sge_-0jSI/AAAAAAAAAVM/-hCFBaxZWBg/s220/moos_icon_lg.jpg" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;CE4DRnw7fCp7ImA9WhNQFEs.&quot;"><id>tag:blogger.com,1999:blog-2136289839485858746.post-928465150310592172</id><published>2012-07-26T19:52:00.002-07:00</published><updated>2012-11-20T17:56:17.204-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-11-20T17:56:17.204-08:00</app:edited><title>Getting RMagic and friends to work on OS-X Mountain Lion</title><content type="html">Upgraded my ruby environment today to Mountain Lion.&lt;br /&gt;
&lt;br /&gt;
&lt;div&gt;
Here is a quick checklist that I went through to get everything working. &amp;nbsp;The largest change was having to reinstall XCode and command line tools, and also download XQuarts in order to reinstall ImageMagick successfully. Without it, I was getting errors building RMagick of the following shape:&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;span style="font-size: x-small;"&gt;&lt;span style="font-family: 'Courier New',Courier,monospace;"&gt;ld: file not found: /usr/lib/libltdl.7.dylib for architecture x86_64&lt;/span&gt;&lt;span style="font-family: 'Courier New',Courier,monospace;"&gt;clang: &lt;br /&gt;error: linker command failed with exit code 1 &lt;br /&gt;(use -v to see invocation)&lt;/span&gt;&lt;span style="font-family: 'Courier New',Courier,monospace;"&gt;make: *** [RMagick2.bundle] Error 1&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
Quick checklist: &lt;/div&gt;
&lt;div&gt;
&lt;ol&gt;
&lt;li&gt;Install Mountain Lion &lt;/li&gt;
&lt;li&gt;Install XCode 4.4 &lt;/li&gt;
&lt;li&gt;Install command line tools from XCode 4.4 Preferences dialog &lt;/li&gt;
&lt;li&gt;Install &lt;a href="http://xquartz.macosforge.org/trac/wiki/X112.7.2"&gt;XQuartz&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;In terminal run &lt;/li&gt;
&lt;ol&gt;
&lt;li&gt;brew update &lt;/li&gt;
&lt;li&gt;brew uninstall imagemagick &lt;/li&gt;
&lt;li&gt;brew install --fresh imagemagick &lt;/li&gt;
&lt;li&gt;wipe out your ~/.rvm folder &lt;/li&gt;
&lt;li&gt;reinstall RVM and install the latest ruby 1.9.3-p-194 &lt;/li&gt;
&lt;/ol&gt;
&lt;li&gt;run "bundle" in the project folder &lt;/li&gt;
&lt;li&gt;run "rake" and rejoice &lt;/li&gt;
&lt;/ol&gt;
&lt;br /&gt;
References:&lt;br /&gt;
&lt;br /&gt;
&lt;a href="https://github.com/mroth/lolcommits/issues/65"&gt;https://github.com/mroth/lolcommits/issues/65&lt;/a&gt; &lt;/div&gt;
&lt;ul style="color: #333333; font-family: Arial, Helvetica, FreeSans, sans-serif; font-size: 13.600000381469727px; line-height: 16.799999237060547px; list-style-position: outside; margin-bottom: 10px; margin-left: 0px; margin-top: 0px; padding-left: 3em; padding-top: 0px; text-align: left;"&gt;&lt;/ul&gt;
</content><link rel="replies" type="application/atom+xml" href="http://tektastic.com/feeds/928465150310592172/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=2136289839485858746&amp;postID=928465150310592172" title="8 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2136289839485858746/posts/default/928465150310592172?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2136289839485858746/posts/default/928465150310592172?v=2" /><link rel="alternate" type="text/html" href="http://tektastic.com/2012/07/getting-rmagic-and-friends-to-work-on.html" title="Getting RMagic and friends to work on OS-X Mountain Lion" /><author><name>@kig</name><uri>http://www.blogger.com/profile/15696255549758746527</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://1.bp.blogspot.com/-zoKqo1q-CLM/T8sge_-0jSI/AAAAAAAAAVM/-hCFBaxZWBg/s220/moos_icon_lg.jpg" /></author><thr:total>8</thr:total></entry><entry gd:etag="W/&quot;CE8ASHsyfyp7ImA9WhJRFko.&quot;"><id>tag:blogger.com,1999:blog-2136289839485858746.post-745232524482431754</id><published>2012-07-18T21:40:00.000-07:00</published><updated>2012-07-18T21:40:49.597-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-07-18T21:40:49.597-07:00</app:edited><title>Activity Feed Design</title><content type="html">I normally don't publish work diagrams, but this one sort of looks like work of art. &lt;br /&gt;
&lt;br /&gt;
It represents a collective design we came up with around aggregation of activity feeds on wanelo.com. If you have an account, you will soon see the results of this on &lt;a href="http://wanelo.com/following"&gt;http://wanelo.com/following&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://2.bp.blogspot.com/-QeD341VEvn4/UAePjl_sl6I/AAAAAAAAAV8/uYpjorM5V5c/s1600/activity_feed.jpeg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="476" src="http://2.bp.blogspot.com/-QeD341VEvn4/UAePjl_sl6I/AAAAAAAAAV8/uYpjorM5V5c/s640/activity_feed.jpeg" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;</content><link rel="replies" type="application/atom+xml" href="http://tektastic.com/feeds/745232524482431754/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=2136289839485858746&amp;postID=745232524482431754" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2136289839485858746/posts/default/745232524482431754?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2136289839485858746/posts/default/745232524482431754?v=2" /><link rel="alternate" type="text/html" href="http://tektastic.com/2012/07/activity-feed-design.html" title="Activity Feed Design" /><author><name>@kig</name><uri>http://www.blogger.com/profile/15696255549758746527</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://1.bp.blogspot.com/-zoKqo1q-CLM/T8sge_-0jSI/AAAAAAAAAVM/-hCFBaxZWBg/s220/moos_icon_lg.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/-QeD341VEvn4/UAePjl_sl6I/AAAAAAAAAV8/uYpjorM5V5c/s72-c/activity_feed.jpeg" height="72" width="72" /><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;DEEBQnw_eip7ImA9WhJREUg.&quot;"><id>tag:blogger.com,1999:blog-2136289839485858746.post-7241360377741447410</id><published>2012-07-12T22:13:00.000-07:00</published><updated>2012-07-12T22:17:33.242-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-07-12T22:17:33.242-07:00</app:edited><title>Using CarrierWave with a dynamic fog host and a CDN</title><content type="html">Another simple case of "this took longer than it takes to look up this issue on Google" :)&lt;br /&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;a href="https://github.com/jnicklas/carrierwave/" target="_blank"&gt;CarrierWave&lt;/a&gt; is a fantastic and well supported ruby gem for managing images, including support for cloud storage like Amazon.&lt;br /&gt;
&lt;br /&gt;
Whether or not you use CarrierWave on the cloud, you almost always want to put your user-uploaded images behind a CDN. &amp;nbsp;There are many CDNs available, including Amazon's CloudFront, Fastly.com, CacheFly, Akamai, etc, and comparing them is outside the scope of this article.&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Because browsers, especially older, are limited in how many connections they will establish to a single host, it is sometimes beneficial to have images load from several alternating URLs, for example:&lt;/div&gt;
&lt;pre style="background-color: #f8f8f8; border-bottom-left-radius: 3px; border-bottom-right-radius: 3px; border-top-left-radius: 3px; border-top-right-radius: 3px; border: 1px solid rgb(204, 204, 204); color: #333333; font-family: Consolas, 'Liberation Mono', Courier, monospace; font-size: 13px; line-height: 19px; margin-bottom: 15px; margin-top: 15px; overflow: auto; padding: 6px 10px;"&gt;&lt;span class="s2" style="border: 0px; color: #dd1144; margin: 0px; padding: 0px;"&gt;http://cdn-0.wanelo.com
&lt;/span&gt;&lt;span class="s2" style="border: 0px; color: #dd1144; margin: 0px; padding: 0px;"&gt;http://cdn-1.wanelo.com
http://cdn-2.wanelo.com&lt;/span&gt;&lt;/pre&gt;
&lt;br /&gt;
&lt;div&gt;
etc...&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
CarrierWave supports fog_host variable which can be set to either a string (a static hostname), or a lambda (if for example a randomized string is desired) and the usage &lt;a href="https://github.com/jnicklas/carrierwave/#dynamic-fog-host" target="_blank"&gt;is well described here.&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Unfortunately, due a &lt;a href="https://github.com/jnicklas/carrierwave/issues/763" target="_blank"&gt;bug that is not yet fixed&lt;/a&gt; (and unclear if it will be), you currently can not use the file object directly inside the lambda as it's shown in the examples.&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style="background-color: white;"&gt;If you actually want to use the "file" object inside the fog_host proc in any way, then fog_host must be a double-lambda, because the first lambda gets called by the accessor created in Configuration class. The second is then called in public_url instance method.&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;
Here is the configuration we ended up using, which works perfectly:&lt;br /&gt;
&lt;div class="highlight" style="border: 0px; margin: 0px; padding: 0px;"&gt;
&lt;pre style="background-color: #f8f8f8; border-bottom-left-radius: 3px; border-bottom-right-radius: 3px; border-top-left-radius: 3px; border-top-right-radius: 3px; border: 1px solid rgb(204, 204, 204); margin-bottom: 15px; margin-top: 15px; overflow: auto; padding: 6px 10px;"&gt;&lt;span style="color: #333333; font-family: Consolas, 'Liberation Mono', Courier, monospace;"&gt;&lt;span style="line-height: 19px;"&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span class="n" style="border: 0px; color: #333333; font-family: Consolas, 'Liberation Mono', Courier, monospace; font-size: 13px; line-height: 19px; margin: 0px; padding: 0px;"&gt;config&lt;/span&gt;&lt;span class="o" style="border: 0px; color: #333333; font-family: Consolas, 'Liberation Mono', Courier, monospace; font-size: 13px; font-weight: bold; line-height: 19px; margin: 0px; padding: 0px;"&gt;.&lt;/span&gt;&lt;span class="n" style="border: 0px; color: #333333; font-family: Consolas, 'Liberation Mono', Courier, monospace; font-size: 13px; line-height: 19px; margin: 0px; padding: 0px;"&gt;fog_host&lt;/span&gt;&lt;span style="color: #333333; font-family: Consolas, 'Liberation Mono', Courier, monospace;"&gt;&lt;span style="line-height: 19px;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="o" style="border: 0px; color: #333333; font-family: Consolas, 'Liberation Mono', Courier, monospace; font-size: 13px; font-weight: bold; line-height: 19px; margin: 0px; padding: 0px;"&gt;=&lt;/span&gt;&lt;span style="color: #333333; font-family: Consolas, 'Liberation Mono', Courier, monospace;"&gt;&lt;span style="line-height: 19px;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="nb" style="border: 0px; color: #0086b3; font-family: Consolas, 'Liberation Mono', Courier, monospace; font-size: 13px; line-height: 19px; margin: 0px; padding: 0px;"&gt;lambda&lt;/span&gt;&lt;span style="color: #333333; font-family: Consolas, 'Liberation Mono', Courier, monospace;"&gt;&lt;span style="line-height: 19px;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="k" style="border: 0px; color: #333333; font-family: Consolas, 'Liberation Mono', Courier, monospace; font-size: 13px; font-weight: bold; line-height: 19px; margin: 0px; padding: 0px;"&gt;do&lt;/span&gt;&lt;span style="color: #333333; font-family: Consolas, 'Liberation Mono', Courier, monospace;"&gt;&lt;span style="line-height: 19px;"&gt;
      &lt;/span&gt;&lt;/span&gt;&lt;span class="nb" style="border: 0px; color: #0086b3; font-family: Consolas, 'Liberation Mono', Courier, monospace; font-size: 13px; line-height: 19px; margin: 0px; padding: 0px;"&gt;lambda&lt;/span&gt;&lt;span style="color: #333333; font-family: Consolas, 'Liberation Mono', Courier, monospace;"&gt;&lt;span style="line-height: 19px;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="k" style="border: 0px; color: #333333; font-family: Consolas, 'Liberation Mono', Courier, monospace; font-size: 13px; font-weight: bold; line-height: 19px; margin: 0px; padding: 0px;"&gt;do&lt;/span&gt;&lt;span style="color: #333333; font-family: Consolas, 'Liberation Mono', Courier, monospace;"&gt;&lt;span style="line-height: 19px;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="o" style="border: 0px; color: #333333; font-family: Consolas, 'Liberation Mono', Courier, monospace; font-size: 13px; font-weight: bold; line-height: 19px; margin: 0px; padding: 0px;"&gt;|&lt;/span&gt;&lt;span class="n" style="border: 0px; color: #333333; font-family: Consolas, 'Liberation Mono', Courier, monospace; font-size: 13px; line-height: 19px; margin: 0px; padding: 0px;"&gt;file&lt;/span&gt;&lt;span class="o" style="border: 0px; color: #333333; font-family: Consolas, 'Liberation Mono', Courier, monospace; font-size: 13px; font-weight: bold; line-height: 19px; margin: 0px; padding: 0px;"&gt;|&lt;/span&gt;&lt;span style="color: #333333; font-family: Consolas, 'Liberation Mono', Courier, monospace;"&gt;&lt;span style="line-height: 19px;"&gt;
        &lt;/span&gt;&lt;/span&gt;&lt;span class="n" style="border: 0px; color: #333333; font-family: Consolas, 'Liberation Mono', Courier, monospace; font-size: 13px; line-height: 19px; margin: 0px; padding: 0px;"&gt;host_number&lt;/span&gt;&lt;span style="color: #333333; font-family: Consolas, 'Liberation Mono', Courier, monospace;"&gt;&lt;span style="line-height: 19px;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="o" style="border: 0px; color: #333333; font-family: Consolas, 'Liberation Mono', Courier, monospace; font-size: 13px; font-weight: bold; line-height: 19px; margin: 0px; padding: 0px;"&gt;=&lt;/span&gt;&lt;span style="color: #333333; font-family: Consolas, 'Liberation Mono', Courier, monospace;"&gt;&lt;span style="line-height: 19px;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="n" style="border: 0px; color: #333333; font-family: Consolas, 'Liberation Mono', Courier, monospace; font-size: 13px; line-height: 19px; margin: 0px; padding: 0px;"&gt;file&lt;/span&gt;&lt;span class="o" style="border: 0px; color: #333333; font-family: Consolas, 'Liberation Mono', Courier, monospace; font-size: 13px; font-weight: bold; line-height: 19px; margin: 0px; padding: 0px;"&gt;.&lt;/span&gt;&lt;span class="n" style="border: 0px; color: #333333; font-family: Consolas, 'Liberation Mono', Courier, monospace; font-size: 13px; line-height: 19px; margin: 0px; padding: 0px;"&gt;path&lt;/span&gt;&lt;span class="o" style="border: 0px; color: #333333; font-family: Consolas, 'Liberation Mono', Courier, monospace; font-size: 13px; font-weight: bold; line-height: 19px; margin: 0px; padding: 0px;"&gt;.&lt;/span&gt;&lt;span class="n" style="border: 0px; color: #333333; font-family: Consolas, 'Liberation Mono', Courier, monospace; font-size: 13px; line-height: 19px; margin: 0px; padding: 0px;"&gt;sum&lt;/span&gt;&lt;span style="color: #333333; font-family: Consolas, 'Liberation Mono', Courier, monospace;"&gt;&lt;span style="line-height: 19px;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="o" style="border: 0px; color: #333333; font-family: Consolas, 'Liberation Mono', Courier, monospace; font-size: 13px; font-weight: bold; line-height: 19px; margin: 0px; padding: 0px;"&gt;%&lt;/span&gt;&lt;span style="color: #333333; font-family: Consolas, 'Liberation Mono', Courier, monospace;"&gt;&lt;span style="line-height: 19px;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="mi" style="border: 0px; color: #009999; font-family: Consolas, 'Liberation Mono', Courier, monospace; font-size: 13px; line-height: 19px; margin: 0px; padding: 0px;"&gt;4&lt;/span&gt;&lt;span style="color: #333333; font-family: Consolas, 'Liberation Mono', Courier, monospace;"&gt;&lt;span style="line-height: 19px;"&gt;
        &lt;/span&gt;&lt;/span&gt;&lt;span class="s2" style="border: 0px; color: #dd1144; font-family: Consolas, 'Liberation Mono', Courier, monospace; font-size: 13px; line-height: 19px; margin: 0px; padding: 0px;"&gt;"cdn-s3-%d.ourdomain.com"&lt;/span&gt;&lt;span style="color: #333333; font-family: Consolas, 'Liberation Mono', Courier, monospace;"&gt;&lt;span style="line-height: 19px;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="o" style="border: 0px; color: #333333; font-family: Consolas, 'Liberation Mono', Courier, monospace; font-size: 13px; font-weight: bold; line-height: 19px; margin: 0px; padding: 0px;"&gt;%&lt;/span&gt;&lt;span style="color: #333333; font-family: Consolas, 'Liberation Mono', Courier, monospace;"&gt;&lt;span style="line-height: 19px;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="n" style="border: 0px; color: #333333; font-family: Consolas, 'Liberation Mono', Courier, monospace; font-size: 13px; line-height: 19px; margin: 0px; padding: 0px;"&gt;host_number&lt;/span&gt;&lt;span style="color: #333333; font-family: Consolas, 'Liberation Mono', Courier, monospace;"&gt;&lt;span style="line-height: 19px;"&gt;
      &lt;/span&gt;&lt;/span&gt;&lt;span class="k" style="border: 0px; color: #333333; font-family: Consolas, 'Liberation Mono', Courier, monospace; font-size: 13px; font-weight: bold; line-height: 19px; margin: 0px; padding: 0px;"&gt;end&lt;/span&gt;&lt;span style="color: #333333; font-family: Consolas, 'Liberation Mono', Courier, monospace;"&gt;&lt;span style="line-height: 19px;"&gt;
    &lt;/span&gt;&lt;/span&gt;&lt;span class="k" style="border: 0px; color: #333333; font-family: Consolas, 'Liberation Mono', Courier, monospace; font-size: 13px; font-weight: bold; line-height: 19px; margin: 0px; padding: 0px;"&gt;end&lt;/span&gt;
&lt;/pre&gt;
&lt;/div&gt;
The advantage of this approach, is that with several CDN hosts (which are useful to increase speed of browser's parallel download of images), this allows you to generate a consistent URL for each file instead of a random one. So a file with name "image.jpg" will always generate "cdn-s3-2.ourdomain.com" because of simple assignment:&lt;br /&gt;
&lt;div class="highlight" style="border: 0px; margin-bottom: 0px !important; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding: 0px;"&gt;
&lt;pre style="background-color: #f8f8f8; border-bottom-left-radius: 3px; border-bottom-right-radius: 3px; border-top-left-radius: 3px; border-top-right-radius: 3px; border: 1px solid rgb(204, 204, 204); color: #333333; font-family: Consolas, 'Liberation Mono', Courier, monospace; font-size: 13px; line-height: 19px; margin-bottom: 15px; margin-top: 15px; overflow: auto; padding: 6px 10px;"&gt;&lt;span class="s2" style="border: 0px; color: #dd1144; margin: 0px; padding: 0px;"&gt;"image.jpg"&lt;/span&gt;&lt;span class="o" style="border: 0px; font-weight: bold; margin: 0px; padding: 0px;"&gt;.&lt;/span&gt;&lt;span class="n" style="border: 0px; margin: 0px; padding: 0px;"&gt;sum&lt;/span&gt; &lt;span class="o" style="border: 0px; font-weight: bold; margin: 0px; padding: 0px;"&gt;%&lt;/span&gt; &lt;span class="mi" style="border: 0px; color: #009999; margin: 0px; padding: 0px;"&gt;4&lt;/span&gt;
&lt;span class="o" style="border: 0px; font-weight: bold; margin: 0px; padding: 0px;"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="mi" style="border: 0px; color: #009999; margin: 0px; padding: 0px;"&gt;2&lt;/span&gt;&lt;/pre&gt;
&lt;div class="highlight" style="border: 0px; margin-bottom: 0px !important; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding: 0px;"&gt;
&lt;span style="background-color: white;"&gt;Thanks to &lt;/span&gt;&lt;a href="https://github.com/jicksta/" style="background-color: white;"&gt;Jay Phillips&lt;/a&gt;&lt;span style="background-color: white;"&gt; for the tricky solution to this one.&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://tektastic.com/feeds/7241360377741447410/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=2136289839485858746&amp;postID=7241360377741447410" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2136289839485858746/posts/default/7241360377741447410?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2136289839485858746/posts/default/7241360377741447410?v=2" /><link rel="alternate" type="text/html" href="http://tektastic.com/2012/07/using-carrierwave-with-dynamic-fog-host.html" title="Using CarrierWave with a dynamic fog host and a CDN" /><author><name>@kig</name><uri>http://www.blogger.com/profile/15696255549758746527</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://1.bp.blogspot.com/-zoKqo1q-CLM/T8sge_-0jSI/AAAAAAAAAVM/-hCFBaxZWBg/s220/moos_icon_lg.jpg" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;CEQAR3gzcSp7ImA9WhVaE0U.&quot;"><id>tag:blogger.com,1999:blog-2136289839485858746.post-7155916531271262910</id><published>2012-06-10T19:35:00.001-07:00</published><updated>2012-06-10T19:39:06.689-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-06-10T19:39:06.689-07:00</app:edited><title>MagmaRails, and Enterprise Architecture with Rails</title><content type="html">This year's &lt;a href="http://magmarails.com/" target="_blank"&gt;MagmaRails&lt;/a&gt;, where I was cordially invited to speak alongside &lt;a href="http://github.com/drnic" target="_blank"&gt;Dr Nic&lt;/a&gt;, &lt;a href="http://github.com/tenderlove" target="_blank"&gt;Aaron Patterson&lt;/a&gt;, &lt;a href="https://github.com/deadprogrammer" target="_blank"&gt;Ron Evans&lt;/a&gt;, &lt;a href="http://github.com/bmizerany" target="_blank"&gt;Blake Mizerany&lt;/a&gt;, &lt;a href="https://github.com/leshill" target="_blank"&gt;Les Hill&lt;/a&gt;,&amp;nbsp;&lt;a href="https://github.com/dfischer" target="_blank"&gt;Daniel Fischer&lt;/a&gt; and many more talented speakers from Mexico and USA, went without a hitch in a beautiful Manzanillo Municipality, Colima, Mexico. &lt;br /&gt;
&lt;br /&gt;
Organized by &lt;a href="http://crowdinteractive.com/" target="_blank"&gt;Crowd Interactive&lt;/a&gt;, this was by far one of my favorite conferences based on the amount of stuff learned, quality of personal interactions, general level of enjoyment, and also, of course, the drinking that went on with all the other fellow attendees and the speakers. &amp;nbsp;What a blast! Can't wait for the next one.&lt;br /&gt;
&lt;br /&gt;
Meanwhile, I've revised my presentation that was originally conceived for SFROR meetup, with more clarity, and a whole new section on how to get things started up and move fast, based in part on an ongoing professional experience at &lt;a href="http://wanelo.com./"&gt;Wanelo.com.&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Here is the presentation! &amp;nbsp;Please leave comments for any feedback or suggestions.&lt;br /&gt;
&lt;div id="__ss_13253703" style="width: 425px;"&gt;
&lt;span style="display: block; margin: 12px 0px 4px;"&gt;&lt;strong style="display: inline !important; margin: 12px 0px 4px;"&gt;&lt;a href="http://www.slideshare.net/kigster/enterprise-architectures-with-ruby-and-rails" target="_blank" title="Enterprise Architectures with Ruby (and Rails)"&gt;Enterprise Architecture with Ruby (and Rails)&lt;/a&gt;&lt;/strong&gt;&lt;/span&gt; &lt;iframe allowfullscreen="" frameborder="0" height="355" marginheight="0" marginwidth="0" scrolling="no" src="http://www.slideshare.net/slideshow/embed_code/13253703" style="border-width: 1px 1px 0; border: 1px solid #CCC;" width="425"&gt;&lt;/iframe&gt; &lt;/div&gt;
&lt;br /&gt;
View more &lt;a href="http://www.slideshare.net/" target="_blank"&gt;presentations&lt;/a&gt; from &lt;a href="http://www.slideshare.net/kigster" target="_blank"&gt;Konstantin Gredeskoul&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;</content><link rel="replies" type="application/atom+xml" href="http://tektastic.com/feeds/7155916531271262910/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=2136289839485858746&amp;postID=7155916531271262910" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2136289839485858746/posts/default/7155916531271262910?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2136289839485858746/posts/default/7155916531271262910?v=2" /><link rel="alternate" type="text/html" href="http://tektastic.com/2012/06/magmarails-and-enterprise-architecture.html" title="MagmaRails, and Enterprise Architecture with Rails" /><author><name>@kig</name><uri>http://www.blogger.com/profile/15696255549758746527</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://1.bp.blogspot.com/-zoKqo1q-CLM/T8sge_-0jSI/AAAAAAAAAVM/-hCFBaxZWBg/s220/moos_icon_lg.jpg" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;A0MHQH4yfSp7ImA9WhVbF0w.&quot;"><id>tag:blogger.com,1999:blog-2136289839485858746.post-2813102660502435341</id><published>2012-06-03T03:10:00.000-07:00</published><updated>2012-06-03T03:30:31.095-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-06-03T03:30:31.095-07:00</app:edited><title>Starting a modern agile rails 3 project for a scale, from scratch - Part 0</title><content type="html">&lt;br /&gt;
As I am entering my fifth month working at &lt;a href="http://wanelo.com/"&gt;Wanelo&lt;/a&gt;, I feel very fortunate to be working with an &lt;a href="http://buildwanelo.tumblr.com/"&gt;amazing group of creative and compassionate people&lt;/a&gt;, building an awesome new application for the new generation social &lt;a href="http://thezcommbuzz.wordpress.com/2012/04/30/want-need-love-wanelo/"&gt;shopping platform that Wanelo had become.&lt;/a&gt; &lt;br /&gt;
&lt;br /&gt;
Because it is all so new — the team, infrastructure, the new application, we had to quickly make a lot of fundamental decisions about what toolsets to use, what processes to follow, how to optimally develop the new code, and how to build features as quickly as possible, how to minimize the amount of technical debt, and how not to forget about the scale (we have plenty of traffic already). Most of all, we wanted to have a ton of fun along the way :)&lt;br /&gt;
&lt;h2&gt;The stack&lt;/h2&gt;For our technology stack we chose Rails 3.2.3, Ruby 1.9.3 and PostgreSQL 9.1 as our base choices for the application. Besides these very fundamental choices, there are easily hundreds of tiny everyday decisions that a team on a new rails project needs to make.  Once the basics are figured out, the frequency of these "big" decisions goes down. But it never stops, as the software for an active application is rarely frozen.&lt;br /&gt;
&lt;h2&gt;A bit of history&lt;/h2&gt;My very first Rails project was back in 2006, and it was an &lt;a href="http://blurb.com/"&gt;e-commerce site.&lt;/a&gt; There was just &lt;a href="http://www.amazon.com/Agile-Web-Development-Rails-Programmers/dp/097669400X/"&gt;one magic book back then&lt;/a&gt;, and that was part of the attraction of Rails. Blurb.com launched a custom build e-commerce site in 4 months with 4 engineers, of whom all but one were new to ruby and rails. Having come from a recent Java project, I was blown away by how quickly everyone had become so incredibly productive.&lt;br /&gt;
&lt;br /&gt;
Since then, attracted by the same promise, thousands of developers had joined, and the ruby universe exploded. What's interesting, is that initially, and importantly, this technology attracted some of the &lt;a href="http://www.hanselman.com/blog/IsMicrosoftLosingTheAlphaGeeks.aspx"&gt;brightest minds in the tech industry&lt;/a&gt; willing to escape to the world of software built in a cleverer, more coincise way that is both maintainable, incredibly compact, and follows the best patterns of software development, such as automated testing (or even TDD). Escaping from Java or PHP to Ruby brought happiness to people's career, including myself.&lt;br /&gt;
&lt;br /&gt;
As a result of exploding ruby-verse, the active toolset changes often. Any new team, having chosen their base set of tools, would have probably chosen a different set six month earlier.  This is a unique trait of our chosen beloved development environment &amp;mdash; i.e. building enterprise and web software with ruby (and often rails), and navigating it's vibrant, ever changing software ecosystem. &lt;br /&gt;
&lt;br /&gt;
There are many excellent (and often free) resources of information on the various open source options available to solve common problems. And when building a web app, especially starting it, many problems you encounter are very common and probably already solved.  So, &lt;br /&gt;
&lt;br /&gt;
&lt;blockquote&gt;What tool is appropriate for ___ task? &lt;br /&gt;
&lt;br /&gt;
Should I use a gem or roll my own code for _____?&lt;br /&gt;
&lt;br /&gt;
How do you setup continuous integration?&lt;br /&gt;
&lt;br /&gt;
How should we all communicate?&lt;br /&gt;
&lt;br /&gt;
Should we be cowboy programmers and work individually "in corners" for 16 hours, or should we use paired programming?&lt;br /&gt;
&lt;/blockquote&gt;&lt;br /&gt;
These are the many questions the new team must answer, and quickly. Arguing about these things is wasteful for the business. Even without an argument, each choice takes time.&lt;br /&gt;
&lt;h2&gt;Some resources&lt;/h2&gt;There is no shortage of most excellent resources (some free, some minimal and well deserved fee), such as:&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href="http://railscasts.com/" target="_blank"&gt;RailsCasts&lt;/a&gt; by &lt;a href="https://github.com/ryanb" target="_blank"&gt;Ryan Bates&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://peepcode.com/" target="_blank"&gt;PeepCode&lt;/a&gt; by &lt;a href="http://geoffreygrosenbach.com/" target="_blank"&gt;Geoffrey Grosenbach&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://rubyrogues.com/" target="_blank"&gt;RubyRogues&lt;/a&gt; - a most excellent podcast by a bunch of really awesome people&lt;/li&gt;
&lt;li&gt;&lt;a href="http://rubyshow.com/" target="_blank"&gt;RubyShow&lt;/a&gt; - another fantastic podcast by &lt;a href="https://twitter.com/#!/peterc"&gt;Peter Cooper&lt;/a&gt; and &lt;a href="https://twitter.com/#!/jseifer"&gt;Jason Seifer&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;And watching/listening to these is most definitely one of the best ways to learn what's out there, and pick up some of best practices along the way.&amp;nbsp;&lt;br /&gt;
&lt;br /&gt;
But that takes time, and time is often scarce. So for those of you really needing to take a shortcut and kick start a modern rails 3 application, follow this series and I will go over a pretty reasonable set of tools and patterns to very common problems. And hopefully, this would be valuable for some people.&lt;br /&gt;
&lt;br /&gt;
Stay tuned for for next part, where we'll talk about some choices around persistence, and serving and storing the data.</content><link rel="replies" type="application/atom+xml" href="http://tektastic.com/feeds/2813102660502435341/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=2136289839485858746&amp;postID=2813102660502435341" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2136289839485858746/posts/default/2813102660502435341?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2136289839485858746/posts/default/2813102660502435341?v=2" /><link rel="alternate" type="text/html" href="http://tektastic.com/2012/06/starting-modern-agile-rails-3-project.html" title="Starting a modern agile rails 3 project for a scale, from scratch - Part 0" /><author><name>@kig</name><uri>http://www.blogger.com/profile/15696255549758746527</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://1.bp.blogspot.com/-zoKqo1q-CLM/T8sge_-0jSI/AAAAAAAAAVM/-hCFBaxZWBg/s220/moos_icon_lg.jpg" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;CEQDRnk6cCp7ImA9WhVaE0U.&quot;"><id>tag:blogger.com,1999:blog-2136289839485858746.post-1526273199437017042</id><published>2012-04-30T01:33:00.000-07:00</published><updated>2012-06-10T19:39:37.718-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-06-10T19:39:37.718-07:00</app:edited><title>SFROR Presentation: Rails in the Real World</title><content type="html">This is a slightly belated post, but recently I gave a presentation to 60+ rails developers in San Francisco about the evolution of the Rails application, and how it all fits together. Presentation, dramatically named "Rails in the Real World" is available on SlideShare.&lt;br /&gt;
&lt;br /&gt;
EDIT: I've updated this presentation for MagmaRails conference in June 2012 (presented in Manzanillo, MX), and the updated presentation is the one that should be viewed.&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://tektastic.com/2012/06/magmarails-and-enterprise-architecture.html" target="_blank"&gt;Please see this post for the actual slides.&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div id="__ss_13253703" style="width: 425px;"&gt;
&lt;strong style="display: block; margin: 12px 0 4px;"&gt;&lt;br /&gt;&lt;/strong&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://tektastic.com/feeds/1526273199437017042/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=2136289839485858746&amp;postID=1526273199437017042" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2136289839485858746/posts/default/1526273199437017042?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2136289839485858746/posts/default/1526273199437017042?v=2" /><link rel="alternate" type="text/html" href="http://tektastic.com/2012/06/sfror-presentation-rails-in-real-world.html" title="SFROR Presentation: Rails in the Real World" /><author><name>@kig</name><uri>http://www.blogger.com/profile/15696255549758746527</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://1.bp.blogspot.com/-zoKqo1q-CLM/T8sge_-0jSI/AAAAAAAAAVM/-hCFBaxZWBg/s220/moos_icon_lg.jpg" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;DkQBQXY9cCp7ImA9WhVbF0w.&quot;"><id>tag:blogger.com,1999:blog-2136289839485858746.post-761827901946132758</id><published>2011-11-12T01:01:00.001-08:00</published><updated>2012-06-03T02:05:50.868-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-06-03T02:05:50.868-07:00</app:edited><title>Why I Like PostgreSQL</title><content type="html">Today I gave a short presentation at work about PostgreSQL, and why I much prefer it to MySQL.&lt;br /&gt;
&lt;br /&gt;
&lt;h2&gt;PostgreSQL vs MySQL: Eternal Battle&lt;/h2&gt;&lt;br /&gt;
I may be misreading this, but it seems that there is a recent trend within startups to move away from MySQL, probably thanks to folks like &lt;a href="http://heroku.com/"&gt;Heroku&lt;/a&gt; on one side (&lt;a href="http://devcenter.heroku.com/articles/database"&gt;who use PostgreSQL to the extreme&lt;/a&gt;, and help and contribute to it's development), vs folks like &lt;a href="http://oracle.com/"&gt;Oracle&lt;/a&gt; on the other side, tainting the "open source pureness" of MySQL :)  &lt;br /&gt;
&lt;br /&gt;
At my work we currently use a mid-sized &lt;a href="http://www.percona.com/"&gt;MySQL 5.1 Percona&lt;/a&gt; instance, which is holding up quite well I must admit.  Both PostgreSQL and MySQL have definitely converged to cover most features that people want, but my leaning is still towards PostgreSQL. I just agree with it's focus on data integrity, recovery, constraints, extensibility, while some of the early decisions in MySQL's design do not agree with me at all (like truncating long strings, 1/0 instead of booleans, ambiguous group by, etc). I think that data integrity may not have been the top priority in MySQL's early design (and it wasn't, MyISAM was fast, but not great at integrity).  &lt;br /&gt;
&lt;br /&gt;
I work for an e-commerce company, where transactions are very, very important. Loosing data is just not acceptable. Creating data that fails validation is a huge pain for our business analysts and accounting, who have to make sense of it.  Early MySQL did not have sufficient constraints and foreign keys to encourage data modellers to use it.&lt;br /&gt;
&lt;br /&gt;
I even believe that this lack of support for constraints and validation was the reason early Rails adopters rejected database constraints, and pushed people towards 100% in-application validation, while treating your database sort of like a document store (early Rails books and applications rarely create non-null columns, or even give varchar columns length specification, leaving MySQL to create all string columns with the default 256 character limit).&lt;br /&gt;
&lt;br /&gt;
Among examples of where MySQL data integrity seems like an afterthought, is one where we recently discovered that a MySQL Replica being used for reporting allows writes, and was in fact quite out of sync with the master. How can you trust your reports that run off a replica, which is no longer a true replica? &lt;br /&gt;
&lt;br /&gt;
Anyway, MySQL has plenty of support, fans and still enjoys wide spread usage. But if you are ready to try out PostgreSQL, here's my crash course of PostgreSQL install, features and some recent gotchas I had to deal with.&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-size: 12px"&gt;Note: parts of this post were inspired by a related post on data and PostgreSQL on &lt;a href="http://corner.squareup.com/2011/06/postgresql-data-is-important.html"&gt;SquareUp Technical blog&lt;/a&gt;.&lt;/span&gt;&lt;br /&gt;
&lt;h2&gt;PostgreSQL Basics&lt;/h2&gt;Installers are now available for &lt;a href="http://www.postgresql.org/download/macosx"&gt;Mac OS-X&lt;/a&gt; and &lt;a href="http://www.postgresql.org/download/windows"&gt;Windows&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
But I prefer compiling from sources. Compiling on unixes is very easy. Download the tar ball, unpack it and then run:&lt;br /&gt;
&lt;pre class="brush: bash"&gt;/configure --prefix=/usr/local/pgsql-9.1
make
make install
&lt;/pre&gt;&lt;br /&gt;
then let's create a database in directory /db on this server:&lt;br /&gt;
&lt;pre class="brush: bash"&gt;/usr/local/pgsql-9.1/bin/initdb –D /db
/usr/local/pgsql-9.1/bin/pg_ctl –D /db start
/usr/local/pgsql-9.1/bin/psql –U postgres postgres
&lt;/pre&gt;&lt;br /&gt;
Note that if you use an installer, your default user may be not "postgres" but your Mac or Windows username. &lt;br /&gt;
&lt;h2&gt;Configuration&lt;/h2&gt;Two critical files in /db:&lt;br /&gt;
&lt;h3&gt;postgresql.conf&lt;/h3&gt;Most db settings, performance, memory, optimizer, network interface to listen on, go into this file.&lt;br /&gt;
&lt;br /&gt;
You will generally want to change the following (let me know if anyone is interested, and I can make some recommendations about which values I use).&lt;br /&gt;
&lt;pre class="brush: bash"&gt;shared_buffers 
temp_buffers 
work_mem 
maintenance_work_mem 
checkpoint_segments 
wal_keep_segments 
effective_cache_size
&lt;/pre&gt;I also like to enable logger for slow queries in pg_log directory:&lt;br /&gt;
&lt;pre class="brush: bash"&gt;logging_collector = on 
log_directory = 'pg_log' 
log_filename = 'postgresql-%Y-%m-%d.log' 
log_rotation_age = 1d 
log_rotation_size = 0 
log_min_error_statement = error 
log_min_duration_statement = 200 
log_lock_waits = on 
log_statement = 'none'
&lt;/pre&gt;&lt;h3&gt;pg_hba.conf&lt;/h3&gt;Access, including network, replication, etc. This is the file you want to modify to allow remote replication, remote access, decide which authentication method to use, etc.  &lt;br /&gt;
&lt;br /&gt;
Most of the time I use trust on a local system, and md5 for remote authentication.&lt;br /&gt;
&lt;h2&gt;Some Neat Features&lt;/h2&gt;PostgreSQL 9 boast a set of pretty cool features, some of them are listed below:&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Partial Indexes (Reduce size of the index (say if only 10% of products are active):&lt;/li&gt;
&lt;/ul&gt;&lt;pre class="brush: sql"&gt;create index on products (category_id) where isactive = true;&lt;/pre&gt;&lt;ul&gt;&lt;li&gt;Function Indexes (instead of creating another column with lower case email):&lt;/li&gt;
&lt;/ul&gt;&lt;pre class="brush: sql"&gt;create index on users to_lower(email);
select * from users where to_lower(‘MyEmail@GMAIL.COM’) = ‘myemail@gmail.com’;
&lt;/pre&gt;&lt;br /&gt;
&lt;h3&gt;More Cool Stuff&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;Create indexes concurrently (without table locks)&lt;/li&gt;
&lt;li&gt;Schema modifications can be done in a transaction&lt;/li&gt;
&lt;li&gt;Instant non-locking adding of nullable columns to large table (major issue today with MySQL)&lt;/li&gt;
&lt;li&gt;Schemas, table spaces! &amp;nbsp;Can create indexes on a different table space (ie disk partition)&lt;/li&gt;
&lt;li&gt;Extensible stored procedures:&amp;nbsp;Java,&amp;nbsp;Perl,&amp;nbsp;Python,&amp;nbsp;Ruby,&amp;nbsp;Tcl.&amp;nbsp;C/C++&amp;nbsp;and its own PL/pgSQL&lt;/li&gt;
&lt;li&gt;Cost-based optimizer is generally better than rule base optimizer. &amp;nbsp;Takes into consideration data distribution&lt;/li&gt;
&lt;li&gt;Full featured text search&lt;/li&gt;
&lt;li&gt;INTERSECT and EXCEP in addition to UNION&lt;/li&gt;
&lt;li&gt;Built-in performance statistics: pg_stat_activity&lt;/li&gt;
&lt;/ul&gt;&lt;h2&gt;PostgreSQL In Practice: Replication&lt;/h2&gt;PostgreSQL 9.1.1 is the latest stable version as of this writing, and since version 9.0 PG supports streaming replication which I have recently setup on several servers. &lt;br /&gt;
&lt;br /&gt;
There are a number of decent guides out there, for example &lt;a href="http://eggie5.com/15-setting-up-pg9-streaming-replication"&gt;here&lt;/a&gt;, and also &lt;a href="http://wiki.postgresql.org/wiki/Streaming_Replication"&gt;here&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
While setting up replication on PostgreSQL 9.1.1, I had a tiny trouble being able to replicate from the master db.  The error was being printed on the master: &lt;b&gt;"FATAL:  must be replication role to start walsender"&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Somehow, superuser "postgres" was not explicitly given "Replication" role.  Weird, considering it's a super user.  I think this may be a recent change in PostgreSQL default permissions.  But to go around this, either add the REPLICATION role to user "postgres", or create a new role for replication only (must also have LOGIN role):&lt;br /&gt;
&lt;pre class="brush: sql"&gt;CREATE ROLE REPLICATOR REPLICATION LOGIN ENCRYPTED PASSWORD '....';&lt;/pre&gt;&lt;br /&gt;
Then in pg_hba.conf:&lt;br /&gt;
&lt;pre class="brush: bash"&gt;host replication  replicator  10.0.0.0/32    md5&lt;/pre&gt;&lt;h3&gt;Using Replica for Queries&lt;/h3&gt;Another bump I ran into is the following: I wanted to use the PostgreSQL replica to run reports, pg_dump and other long-running queries. But they immediately failed with an error: &lt;b&gt;"ERROR: canceling statement due to conflict with recovery"&lt;/b&gt;&lt;br /&gt;
&lt;blockquote&gt;See this thread for more info: &lt;a href="http://postgresql.1045698.n5.nabble.com/Hot-Standby-ERROR-canceling-statement-due-to-conflict-with-recovery-td3402417.html"&gt;http://postgresql.1045698.n5.nabble.com/Hot-Standby-ERROR-canceling-statement-due-to-conflict-with-recovery-td3402417.html&lt;/a&gt;&lt;/blockquote&gt;The solution is to increase the following parameter to allow queries longer than 10 minutes to successfully execute:&lt;br /&gt;
&lt;pre class="brush: bash"&gt;max_standby_streaming_delay = 600s&lt;/pre&gt;This also means your replica may be up to 10 minutes behind the master, but in my case this was an acceptable compromise.  &lt;br /&gt;
&lt;br /&gt;
I am guessing if someone wanted to setup a true hot-standby with minimum delay, it would not be very usable for reporting.  So perhaps the following setup provides both redundancy and a reporting instance:&lt;br /&gt;
&lt;pre class="brush: bash"&gt;[master-db] &amp;lt;- [hot standby] &amp;lt;-- [hot standby, 2 hrs delay, reports]
&lt;/pre&gt;&lt;h3&gt;Where is my Processlist?&lt;/h3&gt;MySQL users will no doubt miss infamous "show processlist" command. Don't fret: there is such thing in PostgreSQL too: &lt;br /&gt;
&lt;pre class="brush: sql"&gt;select * from pg_stat_activity;&lt;/pre&gt;&lt;br /&gt;
This used to be in a separate contrib module, but now included by default. Which is great, because it's fast and provides locking information (whether queries wait on locks).   This module uses a tiny temporary storage (usually in pg_stat_tmp) directory, which if you want to be really fancy, you would mount on a RAM disk partition. It looks like the size of the file inside that directory is constant (does not grow).&lt;/p&gt;&lt;pre class="brush: bash"&gt;Filesystem            Size  Used Avail Use% Mounted on
/dev/ram1             9.7M  226K  9.0M   3% /db/data9/pg_stat_tmp
&lt;/pre&gt;&lt;h3&gt;Locks, Waits, and Deadlocks&lt;/h3&gt;Locks and deadlocks are bane of any database application because they suck: at least one process would have to abort, sometimes more, and depending on how good your error handing is, this may have some undesired consequences.&lt;br /&gt;
&lt;br /&gt;
But how to you find and eliminate deadlocks?  Short answer is -- there is no short answer.&lt;br /&gt;
&lt;br /&gt;
On many applications I worked, whether they were written in C, Perl, Java or Ruby, I've seen deadlocks happen again and again.  Debugging deadlocks is a painful exercise and there is no prescribed answer that works in all cases. Debugging distributed deadlocks (that happen when distributed transactions spanning multiple databases lock up), is a lot harder than debugging deadlocks in a single database.&lt;br /&gt;
&lt;br /&gt;
But in both cases, being able to determine who is locking who, is very very important.  PostgreSQL keep lock information in several supporting tables, which can be queried.  I found this info invaluable, as you can see which processes are blocking, and which ones are waiting, and eventually figure out how reorder operations in your application or reduce contention on the same database object.  The point is that information here is key, and PostgreSQL luckily provides a good deal of it.&lt;br /&gt;
&lt;br /&gt;
If you experience deadlocks, please see this page for detailed queries on lock contentions and deadlocks: &lt;a href="http://wiki.postgresql.org/wiki/Lock_Monitoring"&gt;http://wiki.postgresql.org/wiki/Lock_Monitoring&lt;/a&gt;&lt;br /&gt;
&lt;h2&gt;Summary&lt;/h2&gt;I wanted to share some of the recent finds, gotchas and also excitement about PostgreSQL 9 database, it's features and capabilities.  I hope you found this post informative, and if anything maybe PostgreSQL will peek your interest.  Feel free to leave a comment on any of the related topics.&lt;br /&gt;
&lt;br /&gt;</content><link rel="replies" type="application/atom+xml" href="http://tektastic.com/feeds/761827901946132758/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=2136289839485858746&amp;postID=761827901946132758" title="3 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2136289839485858746/posts/default/761827901946132758?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2136289839485858746/posts/default/761827901946132758?v=2" /><link rel="alternate" type="text/html" href="http://tektastic.com/2011/11/why-i-like-postgresql.html" title="Why I Like PostgreSQL" /><author><name>@kig</name><uri>http://www.blogger.com/profile/15696255549758746527</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://1.bp.blogspot.com/-zoKqo1q-CLM/T8sge_-0jSI/AAAAAAAAAVM/-hCFBaxZWBg/s220/moos_icon_lg.jpg" /></author><thr:total>3</thr:total></entry><entry gd:etag="W/&quot;C08MRXo7eyp7ImA9WhVbF0w.&quot;"><id>tag:blogger.com,1999:blog-2136289839485858746.post-2729076068582558571</id><published>2011-07-25T17:57:00.000-07:00</published><updated>2012-06-03T01:24:44.403-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-06-03T01:24:44.403-07:00</app:edited><title>Ruby, Mac Ports and OS-X Lion</title><content type="html">Today I upgraded my work machine to OS-X Lion.  As I do ruby development on my machine, I quickly stumbled upon a problem with installing "nokogiri" gem.  I was getting this error:  &lt;br /&gt;
&lt;br /&gt;
&lt;blockquote&gt;&lt;pre class="brush: bash"&gt;Installing nokogiri (1.5.0) with native extensions
[snip] `rescue in block in build_extensions': 
ERROR: Failed to build gem native extension. (Gem::Installer::ExtensionBuildError)
/Users/kig/.rvm/rubies/ruby-1.9.2-p290/bin/ruby extconf.rb
checking for libxml/parser.h... *** extconf.rb failed ***
&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;
In addition to installing new XCode from the app store, I also have Mac Ports installed, and so I had to perform the following command to allow nokogiri to build:  &lt;br /&gt;
&lt;blockquote&gt;&lt;span style="font-weight:bold;"&gt;sudo port upgrade libxml2 libxslt&lt;/span&gt;&lt;br /&gt;
&lt;/blockquote&gt;&lt;br /&gt;
After this command completed, Nokogiri happily found libxml and it's dependencies.&lt;br /&gt;
&lt;br /&gt;
UPDATE: Note that I no longer recommend installing libxml2 via ports. Use brew + rbenv instead.&lt;br /&gt;
&lt;br /&gt;</content><link rel="replies" type="application/atom+xml" href="http://tektastic.com/feeds/2729076068582558571/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=2136289839485858746&amp;postID=2729076068582558571" title="3 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2136289839485858746/posts/default/2729076068582558571?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2136289839485858746/posts/default/2729076068582558571?v=2" /><link rel="alternate" type="text/html" href="http://tektastic.com/2011/07/ruby-mac-ports-and-os-x-lion.html" title="Ruby, Mac Ports and OS-X Lion" /><author><name>@kig</name><uri>http://www.blogger.com/profile/15696255549758746527</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://1.bp.blogspot.com/-zoKqo1q-CLM/T8sge_-0jSI/AAAAAAAAAVM/-hCFBaxZWBg/s220/moos_icon_lg.jpg" /></author><thr:total>3</thr:total></entry><entry gd:etag="W/&quot;D04CQHs4cSp7ImA9WhZbEUQ.&quot;"><id>tag:blogger.com,1999:blog-2136289839485858746.post-1500565730657082830</id><published>2011-06-15T20:34:00.001-07:00</published><updated>2011-06-15T20:46:01.539-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-06-15T20:46:01.539-07:00</app:edited><title>New iMacs are Fast. Really Fricken Fast.</title><content type="html">I finally upgraded my home workstation to one of the new just-released iMacs, which are reported to be &lt;a href="http://www.macrumors.com/2011/06/15/27-inch-imac-core-i7-with-ssd-is-fastest-mac-ever/"&gt;the fastest Macs ever&lt;/a&gt; by MacRumors. &lt;p&gt;&lt;/p&gt;

&lt;div&gt;I concur! They are really really fast! For us rubyists, here are some benchmarks building Ruby VM on this machine using RVM (my home directory is on the SSD drive):&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;

&lt;ul&gt;&lt;li&gt;Ruby 1.8.7 (14 seconds to download)&lt;/li&gt;

&lt;pre&gt;
real 1m20.815s
user 0m48.298s
sys 0m11.479s
&lt;/pre&gt;

&lt;li&gt;Ruby 1.8.7 Enterprise Edition (13 seconds to download)&lt;/li&gt;

&lt;pre&gt;
real 2m28.106s
user 1m54.450s
sys 0m14.372s
&lt;/pre&gt;

&lt;li&gt;Ruby 1.9.2 (download time 38 seconds)&lt;/li&gt;

&lt;pre&gt;
real 3m0.167s
user 1m56.891s
sys 0m19.959s
&lt;/pre&gt;

&lt;/ul&gt;

Model Info:

&lt;pre&gt;
  Model Name: iMac
  Model Identifier: iMac12,2
  Processor Name: Intel Core i7
  Processor Speed: 3.4 GHz
  Number of Processors: 1
  Total Number of Cores: 4
  L2 Cache (per Core): 256 KB
  L3 Cache: 8 MB
  Memory: 8 GB
&lt;/pre&gt;</content><link rel="replies" type="application/atom+xml" href="http://tektastic.com/feeds/1500565730657082830/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=2136289839485858746&amp;postID=1500565730657082830" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2136289839485858746/posts/default/1500565730657082830?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2136289839485858746/posts/default/1500565730657082830?v=2" /><link rel="alternate" type="text/html" href="http://tektastic.com/2011/06/new-imacs-are-fast-really-fricken-fast.html" title="New iMacs are Fast. Really Fricken Fast." /><author><name>@kig</name><uri>http://www.blogger.com/profile/15696255549758746527</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://1.bp.blogspot.com/-zoKqo1q-CLM/T8sge_-0jSI/AAAAAAAAAVM/-hCFBaxZWBg/s220/moos_icon_lg.jpg" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;C04AQno6fip7ImA9WhVbF0w.&quot;"><id>tag:blogger.com,1999:blog-2136289839485858746.post-5916019462807129138</id><published>2011-05-31T20:25:00.000-07:00</published><updated>2012-06-03T01:25:43.416-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-06-03T01:25:43.416-07:00</app:edited><title>mc-settings: Gem created at ModCloth for managing configuration</title><content type="html">&lt;div&gt;We at &lt;a href="http://www.modcloth.com/"&gt;ModCloth&lt;/a&gt; have been for a while focused on sharing some of the code we've written with the community, to give back to the open source.  &lt;/div&gt;&lt;br /&gt;
&lt;div&gt;&lt;a href="https://github.com/modcloth/mc-settings"&gt;MC-Settings&lt;/a&gt; is a cute little gem that provides smart ways of managing your multi-platform/per-deployment application configuration in a convenient set of YAML files, which are easily managed and activated using Capistrano.&lt;/div&gt;&lt;br /&gt;
&lt;div&gt;For example, beyond configuration that is specific to Rails environment (such as production, development, etc), you may have configuration that is machine specific, or a cluster specific, etc. For example, if you run on multiple clusters, application servers on one cluster may need to use one set of MemCached servers, while your second cluster could have another set.  How do you manage configuration in your deployments in such a way that allows sensible defaults, and per-system, cluster, environment overrides?&lt;/div&gt;&lt;br /&gt;
&lt;div&gt;This is where MC-Settings gem comes in.   Read up below on how to use the gem, and typical patterns that work with Capistrano.&lt;/div&gt;&lt;br /&gt;
&lt;div&gt;Gem Source: &lt;a href="https://github.com/modcloth/mc-settings"&gt;https://github.com/modcloth/mc-settings&lt;/a&gt;&lt;/div&gt;&lt;h3&gt;Update, June 2012&lt;/h3&gt;While mc-settings is certainly great, it turns out this well maintained gem does very similar thing, but provides more flexibility:&lt;br /&gt;
&lt;a href="https://github.com/railsjedi/rails_config"&gt;Rails Config&lt;/a&gt;</content><link rel="replies" type="application/atom+xml" href="http://tektastic.com/feeds/5916019462807129138/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=2136289839485858746&amp;postID=5916019462807129138" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2136289839485858746/posts/default/5916019462807129138?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2136289839485858746/posts/default/5916019462807129138?v=2" /><link rel="alternate" type="text/html" href="http://tektastic.com/2011/05/mc-settings-gem-created-at-modcloth-for.html" title="mc-settings: Gem created at ModCloth for managing configuration" /><author><name>@kig</name><uri>http://www.blogger.com/profile/15696255549758746527</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://1.bp.blogspot.com/-zoKqo1q-CLM/T8sge_-0jSI/AAAAAAAAAVM/-hCFBaxZWBg/s220/moos_icon_lg.jpg" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;CEcESX88eSp7ImA9WhVbF0w.&quot;"><id>tag:blogger.com,1999:blog-2136289839485858746.post-6705895559157037724</id><published>2011-05-30T16:30:00.000-07:00</published><updated>2012-06-03T01:26:48.171-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-06-03T01:26:48.171-07:00</app:edited><title>RailsConf 2011 Best of Sessions</title><content type="html">&lt;a href="http://4.bp.blogspot.com/-o0_gyDpNmOs/TeQvSVVsOQI/AAAAAAAAAP0/ZSJ9nJYgFUQ/s1600/railsconf2011.jpg" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img  src="http://4.bp.blogspot.com/-o0_gyDpNmOs/TeQvSVVsOQI/AAAAAAAAAP0/ZSJ9nJYgFUQ/s400/railsconf2011.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5612663027622754562" /&gt;&lt;/a&gt;&lt;span class="Apple-style-span" &gt;&lt;div class="wiki-content" &gt;&lt;p &gt;Below I put together my personal list of best RailsConf 2011 presentations that have online slides or PDFs.  I put my comments next to each. Click on the link, then click on the "slideshow" or "PDF" links for each talk.&lt;/p&gt;&lt;ul &gt;&lt;li &gt;&lt;a href="http://en.oreilly.com/rails2011/public/schedule/detail/19431" class="external-link" rel="nofollow" &gt;ActiveSupport 3: What We Should Know About What We Don't Know&lt;/a&gt;&lt;span&gt;&lt;b&gt; -&lt;/b&gt; how to use ActiveSupport in your ruby apps and get lots of behaviors and useful stuff for free&lt;/span&gt;&lt;/li&gt;
&lt;li &gt;&lt;a href="http://en.oreilly.com/rails2011/public/schedule/detail/19279" class="external-link" rel="nofollow" &gt;Building Bulletproof Views&lt;/a&gt;&lt;span&gt; really decent presentation on state of views in general, and best practices. Recommended reading.&lt;/span&gt;&lt;/li&gt;
&lt;li &gt;&lt;a href="http://en.oreilly.com/rails2011/public/schedule/detail/19360" class="external-link" rel="nofollow" &gt;Building Pageless Apps with Rails and Backbone JS&lt;/a&gt;&lt;span&gt; is a great presentation on a new up and coming JS client side framework for building reach apps on the client using pure MVC.&lt;/span&gt;&lt;/li&gt;
&lt;li &gt;&lt;a href="http://en.oreilly.com/rails2011/public/schedule/detail/19068" class="external-link" rel="nofollow" &gt;David Heinemeier Hansson&lt;/a&gt;&lt;span&gt; -- keynote, worth watching&lt;/span&gt;&lt;/li&gt;
&lt;li &gt;&lt;a href="http://en.oreilly.com/rails2011/public/schedule/detail/19466" class="external-link" rel="nofollow" &gt;From 1,000 Transactions a Month to 1 million in a Day: Lessons in Credit Card Processing from LivingSocial&lt;/a&gt;&lt;span&gt; - cool presentation on how BrainTree API is used to encrypt card data in JavaScript before submitting to BT for processing.  Lots of other useful tidbits on credit card processing.&lt;/span&gt;&lt;/li&gt;
&lt;li &gt;&lt;a href="http://en.oreilly.com/rails2011/public/schedule/detail/19501" class="external-link" rel="nofollow" &gt;How To Handle 1,000,000 Daily Users Without Using A Cache&lt;/a&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;em&gt;most interesting&lt;/em&gt;&lt;/span&gt; &lt;span&gt;presentation for performance junkies, on how they outgrew MySQL and explored various other solutions to scale to 1M daily users. Highly recommended.&lt;/span&gt;&lt;/li&gt;
&lt;li &gt;&lt;a href="http://en.oreilly.com/rails2011/public/schedule/detail/18476" class="external-link" rel="nofollow" &gt;KnowSQL: Database Tricks To Make Your Life Easier&lt;/a&gt;&lt;span&gt;&lt;b&gt; &lt;/b&gt;&lt;/span&gt;&lt;span&gt;this is a PostgreSQL heavy presentation on how to get the most out of your database engine.  Recommended to anyone who wants to learn more about using a real database =)&lt;/span&gt;&lt;/li&gt;
&lt;li &gt;&lt;a href="http://en.oreilly.com/rails2011/public/schedule/detail/19463" class="external-link" rel="nofollow" &gt;OmniAuth from the Ground Up&lt;/a&gt;&lt;span&gt;&lt;b&gt; &lt;/b&gt;&lt;/span&gt;&lt;span&gt;a really good presentation on OmniAuth - a generic authentication gem that supports a lot of options, including OpenID, LDAP, etc.&lt;/span&gt; &lt;/li&gt;
&lt;li &gt;&lt;a href="http://en.oreilly.com/rails2011/public/schedule/detail/20219" class="external-link" rel="nofollow" &gt;Open Source E-Commerce With Spree&lt;/a&gt;&lt;span&gt;&lt;b&gt; VERY&lt;/b&gt;&lt;/span&gt; &lt;span&gt;interesting presentation on this open source e-commerce platform.  Great examples on using engines, customizable CSS, and many more. URL: &lt;/span&gt;&lt;a href="https://github.com/spree/spree" class="external-link" rel="nofollow" &gt;https://github.com/spree/spree&lt;/a&gt;&lt;/li&gt;
&lt;li &gt;&lt;a href="http://en.oreilly.com/rails2011/public/schedule/detail/18051" class="external-link" rel="nofollow" &gt;Rails Performance Tools&lt;/a&gt;&lt;span&gt;&lt;b&gt; -&lt;/b&gt;&lt;/span&gt; &lt;span&gt;system tools such as lsof, strace, ltrace, gdb, perftools, memprof, etc to identify bottlenecks in your ruby apps that NewRelic can't, by Aman Gupta.&lt;/span&gt;&lt;/li&gt;
&lt;li &gt;&lt;a href="http://en.oreilly.com/rails2011/public/schedule/detail/19066" class="external-link" rel="nofollow" &gt;Sass: The Future of Stylesheets&lt;/a&gt;&lt;span&gt;&lt;b&gt; &lt;/b&gt;&lt;/span&gt;&lt;span&gt;a great overview of SASS and compass, with examples of @extend and @include.&lt;/span&gt;&lt;/li&gt;
&lt;li &gt;&lt;a href="http://en.oreilly.com/rails2011/public/schedule/detail/19674" class="external-link" rel="nofollow" &gt;Stateful, Scalable Servers with EventMachine and Rails&lt;/a&gt;&lt;span&gt;&lt;b&gt; &lt;/b&gt;&lt;/span&gt;&lt;span&gt;a talk by Aman Gupta (again) on EventMachine and writing non-blocking high concurrency but single-threaded TCP/IP servers. &lt;/span&gt;&lt;span&gt;Highly recommended.&lt;/span&gt;&lt;/li&gt;
&lt;li &gt;&lt;a href="http://en.oreilly.com/rails2011/public/schedule/detail/19359" class="external-link" rel="nofollow" &gt;The Holy Grail (of Databases)&lt;/a&gt;&lt;span&gt;&lt;b&gt; &lt;/b&gt;&lt;/span&gt;&lt;span&gt;Overview of SQL, key-value stores and other NoSQL storage options.&lt;/span&gt; &lt;span&gt;Highly recommended.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;p &gt;And if you are feeling sentimental, and added bonus:&lt;/p&gt;&lt;ul &gt;&lt;li &gt;&lt;a href="http://en.oreilly.com/rails2011/public/schedule/detail/18591" class="external-link" rel="nofollow" &gt;50 in 50&lt;/a&gt;&lt;span&gt; is a &lt;/span&gt;&lt;span&gt;really zany presentation on computer science achievements in the last century.  Great meditative presentation, and goes way over 1 hour.  No relationship to ruby/rails, but everyone will get something out of it&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/div&gt;&lt;div id="labels-section" class="pageSection" &gt;&lt;div class="labels-editor"&gt;&lt;div id="labels-section-content" class="content-column" &gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/span&gt;</content><link rel="replies" type="application/atom+xml" href="http://tektastic.com/feeds/6705895559157037724/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=2136289839485858746&amp;postID=6705895559157037724" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2136289839485858746/posts/default/6705895559157037724?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2136289839485858746/posts/default/6705895559157037724?v=2" /><link rel="alternate" type="text/html" href="http://tektastic.com/2011/05/railsconf-2011-best-of-sessions.html" title="RailsConf 2011 Best of Sessions" /><author><name>@kig</name><uri>http://www.blogger.com/profile/15696255549758746527</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://1.bp.blogspot.com/-zoKqo1q-CLM/T8sge_-0jSI/AAAAAAAAAVM/-hCFBaxZWBg/s220/moos_icon_lg.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/-o0_gyDpNmOs/TeQvSVVsOQI/AAAAAAAAAP0/ZSJ9nJYgFUQ/s72-c/railsconf2011.jpg" height="72" width="72" /><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;CkUASHk5fyp7ImA9WhZWE08.&quot;"><id>tag:blogger.com,1999:blog-2136289839485858746.post-2409224508929000803</id><published>2011-05-13T13:56:00.001-07:00</published><updated>2011-05-13T13:57:29.727-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-05-13T13:57:29.727-07:00</app:edited><title>mms-mime: MM7/MMS MIME parsing gem</title><content type="html">&lt;a href="https://github.com/kigster/mms-mime"&gt;https://github.com/kigster/mms-mime&lt;/a&gt;

&lt;p&gt;This gem was written with a simple aim to parse MM7 wrapped binary and base64 encoded MMS messages received via MM7/XML HTTP post from an MM7 compatible gateway connection (such as OpenWave, OpenMarket, etc).&lt;/p&gt;

&lt;p&gt;The gem provides a simple way to parse and access MMS message contents, such as from, to, subject and content parts (including image and text parts).&lt;/p&gt;</content><link rel="replies" type="application/atom+xml" href="http://tektastic.com/feeds/2409224508929000803/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=2136289839485858746&amp;postID=2409224508929000803" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2136289839485858746/posts/default/2409224508929000803?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2136289839485858746/posts/default/2409224508929000803?v=2" /><link rel="alternate" type="text/html" href="http://tektastic.com/2011/05/mms-mime-mm7mms-mime-parsing-gem.html" title="mms-mime: MM7/MMS MIME parsing gem" /><author><name>@kig</name><uri>http://www.blogger.com/profile/15696255549758746527</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://1.bp.blogspot.com/-zoKqo1q-CLM/T8sge_-0jSI/AAAAAAAAAVM/-hCFBaxZWBg/s220/moos_icon_lg.jpg" /></author><thr:total>1</thr:total></entry><entry gd:etag="W/&quot;DUMNR34-fSp7ImA9Wx5XGEg.&quot;"><id>tag:blogger.com,1999:blog-2136289839485858746.post-4213868341920410823</id><published>2010-09-18T17:35:00.000-07:00</published><updated>2010-09-18T17:51:36.055-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-09-18T17:51:36.055-07:00</app:edited><title>GoGaRuCo 2010 - San Francisco Ruby Conference</title><content type="html">Had an awesome time here for two days, listening to talks, hacking on some code, learning, networking, even managed to sign up for the UCSF gym and to take a swim.

Very nice organization, excellent venue, and fantastic talks.  Definitely coming back next year. For the price it's well worth it.

Here are some highlights:
&lt;ul&gt;&lt;li&gt;    Super useful resource for lookup up shell commands: &lt;a href="http://shellhaters.heroku.com/posix"&gt;http://shellhaters.heroku.com/posix&lt;/a&gt;&lt;/li&gt;&lt;li&gt;    Terminator plugin: start your dev environment as you like it. Gem install terminator&lt;/li&gt;&lt;li&gt;    &lt;a href="http://github.com/rdy/fixture_builder"&gt;http://github.com/rdy/fixture_builder&lt;/a&gt; Factory to Fixtures converter to speed up your tests.&lt;/li&gt;&lt;li&gt;    pprof profile Ruby interpreter.  Rack-Profiler project, great profiling tool.&lt;/li&gt;&lt;li&gt;    Coffee Script - wrapper (ruby-esque) for javascript; rails 3.1 supports coffee script templates&lt;/li&gt;&lt;li&gt;    Machine Learning - &lt;a href="http://www.slideshare.net/igrigorik/intelligent-ruby-machine-learning"&gt;great talk&lt;/a&gt;, and &lt;a href="http://oreilly.com/catalog/9780596529321"&gt;O'Reiley book&lt;/a&gt;, &lt;a href="http://twitter.com/igrigorik"&gt;http://twitter.com/igrigorik&lt;/a&gt;&lt;/li&gt;&lt;li&gt;    minitest fastest testing framework, many mentions, very fast, supports RSpec and Test::Unit syntax&lt;/li&gt;&lt;li&gt;    Caching: using fresh_when(:last_modified =&gt; ...) to enable proper HTTP caching in Rails 3.1&lt;/li&gt;&lt;li&gt;    Arel: enables fragment caching that does not run SQL if the fragment is cached&lt;/li&gt;&lt;li&gt;ruby 1.9: require 'objspace' allows inspection of object counts and memory usage in VM
&lt;/li&gt;&lt;/ul&gt;</content><link rel="replies" type="application/atom+xml" href="http://tektastic.com/feeds/4213868341920410823/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=2136289839485858746&amp;postID=4213868341920410823" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2136289839485858746/posts/default/4213868341920410823?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2136289839485858746/posts/default/4213868341920410823?v=2" /><link rel="alternate" type="text/html" href="http://tektastic.com/2010/09/gogaruco-2010-san-francisco-ruby.html" title="GoGaRuCo 2010 - San Francisco Ruby Conference" /><author><name>@kig</name><uri>http://www.blogger.com/profile/15696255549758746527</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://1.bp.blogspot.com/-zoKqo1q-CLM/T8sge_-0jSI/AAAAAAAAAVM/-hCFBaxZWBg/s220/moos_icon_lg.jpg" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;CEcDRH46eyp7ImA9WhVbF0w.&quot;"><id>tag:blogger.com,1999:blog-2136289839485858746.post-1918986752184261015</id><published>2010-08-03T11:55:00.000-07:00</published><updated>2012-06-03T01:27:55.013-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-06-03T01:27:55.013-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="technology" /><title>Twitter is the slowest social network, Facebook the fastest</title><content type="html">&lt;p&gt;Interesting statistics just came out on &lt;a href="http://blog.alertsite.com/2010/07/facebook-is-fastest-social-network-in-q2-twitter-drops-to-last/"&gt;AlertSite blog post&lt;/a&gt; about performance and response time of various highly trafficked social networks.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;Unsurprisingly, Facebook is the fastest, and Twitter is the slowest.  Facebook has so much more data to deal with, so much media, and so many more users, that it really is a shame for Twitter with it's 140 character data set to be in this unglorious last place.&lt;/p&gt;&lt;p&gt;After continuous reports about &lt;a href="http://nosql.mypopescu.com/post/407159447/cassandra-twitter-an-interview-with-ryan-king"&gt;migrating to Cassandra&lt;/a&gt;, Twitter still serves their &lt;a href="http://engineering.twitter.com/2010/07/cassandra-at-twitter-today.html"&gt;tweets out of MemCaches that sit in front of MySQL&lt;/a&gt;.  When those caches die, it takes a long time to refill them and the site yet again drops the very familiar &lt;a href="http://engineering.twitter.com/2010/07/twitter-performance-update.html"&gt;Fail Whale.&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Perhaps Twitter's infrastructure group could use some new blood to work on scaling and up-time.  I am guessing that adding experienced people who scaled Facebook, or other high traffic sites could really help in the long run.  The problem is that hiring experienced contributors to work on this pain point may feel threatening to the existing crew who continually tried and ultimately failed to fix Twitter's performance problems.  Don't fall into this trap Twitter: people who are having hard time re-engineering current architecture will continue to have a hard time without an influx of fresh energy and new ideas. Consider making the necessary changes, and then perhaps you could pull out of that miserly last place.&lt;/p&gt;</content><link rel="replies" type="application/atom+xml" href="http://tektastic.com/feeds/1918986752184261015/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=2136289839485858746&amp;postID=1918986752184261015" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2136289839485858746/posts/default/1918986752184261015?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2136289839485858746/posts/default/1918986752184261015?v=2" /><link rel="alternate" type="text/html" href="http://tektastic.com/2010/08/twitter-is-slowest-social-network.html" title="Twitter is the slowest social network, Facebook the fastest" /><author><name>@kig</name><uri>http://www.blogger.com/profile/15696255549758746527</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://1.bp.blogspot.com/-zoKqo1q-CLM/T8sge_-0jSI/AAAAAAAAAVM/-hCFBaxZWBg/s220/moos_icon_lg.jpg" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;CEYESH44eip7ImA9WhVbF0w.&quot;"><id>tag:blogger.com,1999:blog-2136289839485858746.post-3033147919793679339</id><published>2010-07-26T16:31:00.000-07:00</published><updated>2012-06-03T01:28:29.032-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-06-03T01:28:29.032-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="technology" /><category scheme="http://www.blogger.com/atom/ns#" term="ruby on rails" /><title>Rails3, Rack and "Where did my Metal go?"</title><content type="html">&lt;p&gt;Our Rails3 (beta4) application had one route mapped in config/routes to a Sinatra app, by means of the following route:&lt;/p&gt;&lt;pre class="brush: ruby"&gt;match '/foo', :to =&gt; EndPointApp, :as =&gt; :endpoint
&lt;/pre&gt;&lt;p&gt;The route was being defined to run as a Sinatra Application&lt;/p&gt;&lt;pre class="brush: ruby"&gt;require 'sinatra'
class EndPointApp &lt; Sinatra::Application
  post '/foo' do
    ...
  end
end
&lt;/pre&gt;
&lt;p&gt;This was working mostly fine, but it was returning Set-Cookie header with the standard Rails sessions cookie, which in this case was preventing the client of this endpoint from successfully interpreting the result.  As I could do nothing about the client side, I had to remove Set-Cookie from the headers, but only for this end-point and obviously not from the entire app.  This proved to be somewhat more complicated than I had hoped, so let me share the solution here in hopes it might save someone else an hour or two.&lt;/p&gt;&lt;p&gt;First, I ran "rake middleware" and observed the following Rack stack:&lt;/p&gt;&lt;pre class="brush: ruby"&gt;use ActionDispatch::Static
use Rack::Lock
use ActiveSupport::Cache::Strategy::LocalCache
use Rack::Runtime
use Rails::Rack::Logger
use ActionDispatch::ShowExceptions
use ActionDispatch::RemoteIp
use Rack::Sendfile
use ActionDispatch::Callbacks
use ActiveRecord::ConnectionAdapters::ConnectionManagement
use ActiveRecord::QueryCache
use ActionDispatch::Cookies
use ActionDispatch::Session::CookieStore
use ActionDispatch::Flash
use ActionDispatch::ParamsParser
use Rack::MethodOverride
use ActionDispatch::Head
run Kigster::Application.routes
&lt;/pre&gt;&lt;p&gt;As can be immediately seen from here, the routes execute very last after Session::CookieStore already wrapped the request.  OK, so looks like I need to bypass the routes somehow, and so I started to look at Rails::Metal, which is supposed to run before all other processing.&lt;/p&gt;&lt;p&gt;Once I started to look for Rails::Metal, I realized pretty quickly that I am missing metal generator:&lt;/p&gt;&lt;pre style="font-size: 10px"&gt;&gt; rails g metal
Could not find generator metal.
&lt;/pre&gt;&lt;p&gt;After a few more rounds of digging around, it turns out that in Rails3 Beta4 Rails::Metal has been &lt;a href=" http://github.com/rails/rails/commit/ed34652d1aca148fea61c5309c1bd5ff3a55abfa"&gt;completely removed&lt;/a&gt;, because it is no longer needed in a Rack environment.&lt;/p&gt;&lt;p&gt;So I had convert my Sinatra module to a Rack module, and insert it into the Rack middleware stack before the Cookie/Sessions:&lt;/p&gt;&lt;pre class="brush: ruby"&gt;require File.expand_path('../../../config/environment',  __FILE__) unless defined?(Rails)

module Kigster
  class EndPoint
    def initialize(app)
      @app = app
    end
    def call(env)
      if env["PATH_INFO"] =~ /^foo/
        process_request(env)
      else
        @app.call(env)
      end
    end

    private
    def process_request(env) 
       req = Rack::Request.new(env)
       params = req.params
       # do stuff
       [ 200, 
         { "Content-Type"   =&gt; "text/html", 
           "Content-Length" =&gt; "0" }, 
         [""]   
       ]
    end
  end
end
&lt;/pre&gt;&lt;p&gt;I had add the following to my config/application.rb to enable this Rack module, and have it run before the ActionDispatch::Session::CookieStore:&lt;/p&gt;&lt;pre class="brush: ruby"&gt;# config/application.rb
# require the file directly
require File.join(File.dirname(__FILE__), '../app/metal/kigster_endpoint')
....
module Kigster
  class Application &lt; Rails::Application
    config.middleware.insert_after Rails::Rack::Logger, 
                                   Kigster::EndPoint
  end
end
&lt;/pre&gt;
&lt;p&gt;Now my handler executes before the session, and the result does not include Set-Cookie header.  &lt;/p&gt;&lt;p&gt;Any other suggestions on how to make this any simpler, or more correct are as always welcome!&lt;/p&gt;</content><link rel="replies" type="application/atom+xml" href="http://tektastic.com/feeds/3033147919793679339/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=2136289839485858746&amp;postID=3033147919793679339" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2136289839485858746/posts/default/3033147919793679339?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2136289839485858746/posts/default/3033147919793679339?v=2" /><link rel="alternate" type="text/html" href="http://tektastic.com/2010/07/rails3-rack-and-where-did-my-metal-go.html" title="Rails3, Rack and &quot;Where did my Metal go?&quot;" /><author><name>@kig</name><uri>http://www.blogger.com/profile/15696255549758746527</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://1.bp.blogspot.com/-zoKqo1q-CLM/T8sge_-0jSI/AAAAAAAAAVM/-hCFBaxZWBg/s220/moos_icon_lg.jpg" /></author><thr:total>1</thr:total></entry><entry gd:etag="W/&quot;D08EQXw8fyp7ImA9WxFbF00.&quot;"><id>tag:blogger.com,1999:blog-2136289839485858746.post-4568163270362820979</id><published>2010-07-08T14:01:00.000-07:00</published><updated>2010-07-09T13:03:20.277-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-07-09T13:03:20.277-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="java" /><category scheme="http://www.blogger.com/atom/ns#" term="technology" /><category scheme="http://www.blogger.com/atom/ns#" term="ruby on rails" /><title>Rails3 and The Inevitable Fragmentation</title><content type="html">&lt;p&gt;I remember one of the early talks at the &lt;a href="http://www.oreillynet.com/ruby/blog/2006/01/canada_on_rails_speakers_annou.html"&gt;Canada On Rails&lt;/a&gt; in 2006 had a slide showing how many books one needs to read to be able to write web applications in Rails, versus Java.&lt;/p&gt;

&lt;p&gt;Of course Java side had about 10 books: Java SE, Java EE, Hibernate, Struts/Tiles/JSF, WebServices, Ant, Maven, Eclipse, JUnit, etc, etc.&lt;/p&gt;

&lt;p&gt;The Rails slide proudly showed the now hopelessly outdated "Agile Web Development With Ruby on Rails", 1st edition.

&lt;p&gt;Those were the times. Back then, during my work for &lt;a href="http://blurb.com/"&gt;Blurb.com&lt;/a&gt; myself and three other engineers managed to learn ruby, rails and build a fully functional e-commerce site in about 3 months.  I was blown away by the productivity gains compared to Java, where months could be spent laying out the project, and creating all necessary infrastructure for builds, deployment, automated testing with or without the database, etc.&lt;/p&gt;

&lt;p&gt;Fast-forward to 2010. We are on a brink of Rails3 release, and oh boy, has the landscape changed since back then.  I would argue that in some ways, you may be better off with Java than with Rails today for a couple of reasons:&lt;/p&gt;

&lt;ul&gt;&lt;li&gt;Rails moves very fast. Books published in 2009 are already outdated.  That pretty much leaves blog posts and online documentation as the main source of information.&lt;/li&gt;&lt;li&gt;Blog posts are not written as well as books are, they are not edited and are often heavily biased. They are also often outdated, and they are also often hard to find.&lt;/li&gt;&lt;li&gt;Rails now supports swapping out view renderers (from Erb, to Haml for example), Javascript libraries (from Prototype to jQuery, etc), ORM layers.&lt;/li&gt;&lt;li&gt;Testing frameworks are now (I think) approaching on a dozen. Forget Test::Unit, now it's all about RSpec, RSpec-Rails, Shoulda, Cucumber, WebRat, Selenium, TDD, BDD, ShmoDD. Hot Damn.&lt;/li&gt;&lt;li&gt;Finally, to make the matters "worse", it's become very trendy to replace RDBMS with a document-based databases such as MongoDB, CouchDB, or even a step further --  with distributed data stores like Cassandra or Riak. As with any trend, people are doing this regardless of whether or not they actually need it. Although this part clearly has nothing to do with Rails.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;As someone who is trying to "quickly" catch up on all the recent changes that happened in the last 18 months during which I did not do any major rails development, it feels like I have to learn a lot of things from scratch, and unlearn a lot of things too. Even though I had three-four years of production Rails experience building &lt;a href="http://www.blurb.com"&gt;Blurb.com&lt;/a&gt; and &lt;a href="http://www.infectious.com"&gt;Infectious.com&lt;/a&gt;.  That makes me wonder, how the newbies feel now joining the "new" Rails ecosystem. I am very curious to find out.  I am guessing there is a lot of frustration and a steep learning curve required to master all the frameworks in isolation, and then bring them all together into the project.  And that brings us back to where Java was exactly four years ago, and still is today.&lt;/p&gt;

&lt;p&gt;I am not at all advocating for you all to go back to coding Java or COBOL :=) And I am absolutely not against Rails.  But it's about time we pull the curtain of naiveté and realize that RoR has become the complex multifaceted enterprise framework it was claiming to replace back in 2006, and to become proficient in it may take just as long, if not longer, then with Java EE.&lt;/p&gt; 

&lt;p&gt;Ironic? I'll let you decide.&lt;/p&gt;</content><link rel="replies" type="application/atom+xml" href="http://tektastic.com/feeds/4568163270362820979/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=2136289839485858746&amp;postID=4568163270362820979" title="6 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2136289839485858746/posts/default/4568163270362820979?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2136289839485858746/posts/default/4568163270362820979?v=2" /><link rel="alternate" type="text/html" href="http://tektastic.com/2010/07/rails3-and-inevitable-fragmentation.html" title="Rails3 and The Inevitable Fragmentation" /><author><name>@kig</name><uri>http://www.blogger.com/profile/15696255549758746527</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://1.bp.blogspot.com/-zoKqo1q-CLM/T8sge_-0jSI/AAAAAAAAAVM/-hCFBaxZWBg/s220/moos_icon_lg.jpg" /></author><thr:total>6</thr:total></entry><entry gd:etag="W/&quot;CUcFQX4yeCp7ImA9WxFUGEk.&quot;"><id>tag:blogger.com,1999:blog-2136289839485858746.post-3089815659967259511</id><published>2010-06-29T13:13:00.000-07:00</published><updated>2010-06-29T13:23:30.090-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-06-29T13:23:30.090-07:00</app:edited><title>Learning Git, And Should You Switch from SVN</title><content type="html">If you are just learning to use git, or you have been using it for a while without too much thinking, &lt;a href="http://www.eecs.harvard.edu/~cduan/technical/git/"&gt;this introduction to Git principles&lt;/a&gt; provides a fantastic overview into the concepts behind git, using a very simple and natural examples.

Do you need to switch to git from svn? My personal take on this is as follows:
&lt;ul&gt;&lt;li&gt;If you have several developers far away with bad internet connection, then YES.&lt;/li&gt;&lt;li&gt;If you have more than several developers (say hundreds) then YES.&lt;/li&gt;&lt;li&gt;If your developers often work on long multi-day features, where they want to commit often, but commits may result in instability of their branch, then YES.  Git allows much easier branching than SVN.&lt;/li&gt;&lt;li&gt;If you want to leverage GitHub's infrastructure for hosting your project privately or publicly, then YES.  &lt;/li&gt;&lt;/ul&gt;&lt;div&gt;To balance this and not to appear as I am advocating everyone to switch, here is the reverse:&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;If you have a small team who works locally and uses a local SVN server then NO.&lt;/li&gt;&lt;li&gt;If your team does not need branching, or prefers to check-in complete features instead of incremental check-ins then NO.&lt;/li&gt;&lt;li&gt;If your team is used to SVN and there are no major issues, then NO.&lt;/li&gt;&lt;li&gt;If your team is using SVN authorization module to create groups and grant them special access per subdirectory then NO.  I am unaware of Git providing this level of access control.&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;The actual tutorial is here:  &lt;span class="Apple-style-span"  style=" ;font-size:15.8333px;"&gt;&lt;a href="http://www.eecs.harvard.edu/~cduan/technical/git/"&gt;http://www.eecs.harvard.edu/~cduan/technical/git/&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://tektastic.com/feeds/3089815659967259511/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=2136289839485858746&amp;postID=3089815659967259511" title="3 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2136289839485858746/posts/default/3089815659967259511?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2136289839485858746/posts/default/3089815659967259511?v=2" /><link rel="alternate" type="text/html" href="http://tektastic.com/2010/06/learning-git-and-should-you-switch-from.html" title="Learning Git, And Should You Switch from SVN" /><author><name>@kig</name><uri>http://www.blogger.com/profile/15696255549758746527</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://1.bp.blogspot.com/-zoKqo1q-CLM/T8sge_-0jSI/AAAAAAAAAVM/-hCFBaxZWBg/s220/moos_icon_lg.jpg" /></author><thr:total>3</thr:total></entry><entry gd:etag="W/&quot;Ak4EQ3s8eyp7ImA9WxFUF0g.&quot;"><id>tag:blogger.com,1999:blog-2136289839485858746.post-281500168097078251</id><published>2009-03-22T21:16:00.001-07:00</published><updated>2010-06-28T14:01:42.573-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-06-28T14:01:42.573-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="technology" /><category scheme="http://www.blogger.com/atom/ns#" term="ruby on rails" /><title>Techtarget's Java ServerSide Symposium 2009 Impressions</title><content type="html">&lt;p&gt;Just got back from Vegas where between Wednesday and Friday a small-&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;ish&lt;/span&gt; java conference was taking place. This was my second one, the first being five years ago in 2004. &lt;/p&gt;&lt;div&gt;
&lt;/div&gt;&lt;div&gt;&lt;p&gt;Of course it's hard not to compare, and I find myself doing it anyway... I can't help but feel that the excitement has left java server software.  Remembering one of the very first java conferences in Sydney 1995, when it was still almost academic and less of an industry conference, I feel like we've come to an end of an era.&lt;/p&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;div&gt;&lt;p&gt;The tedious reality of maintaining enormous enterprise systems built over the the last decade has &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_1"&gt;sinked&lt;/span&gt; in, and unfortunately there is nothing exciting about it, but everything difficult and complex.  Those less fortune whose systems took advantage of &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_2"&gt;EJB&lt;/span&gt;1 and &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_3"&gt;EJB&lt;/span&gt;2s will suffer the most, as those are dying technologies and are rapidly being replaced by simpler more component friendly software.&lt;/p&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;div&gt;&lt;p&gt;The first set of simplification came with frameworks over the last five years - Spring and Hibernate being the most notable. Now the simplifications are being pushed out across language boundaries, because of the need to stay competitive against exploding Ruby on Rails community, and even smaller but still disproportionally more productive frameworks like &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_4"&gt;Django&lt;/span&gt;, when compared to java.&lt;/p&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;div&gt;&lt;p&gt;Several talks focused on &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_5"&gt;jRuby&lt;/span&gt;, and I think this is where the future power lies. Combining the two platforms, Ruby on Rails for web development, and server side java for multi-threaded, asynchronous, transactional behavior seems like a fantastic opportunity.&lt;/p&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;div&gt;&lt;p&gt;However nobody is yet talking about how this all works together in production. What does it mean to run a multi-app server distributed java application, with a &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_6"&gt;RoR&lt;/span&gt; application hosted inside &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_7"&gt;JVM&lt;/span&gt; and interacting with the service layer? What if service layer mixes ActiveRecord and Hibernate?  Questions like this, while entirely logical in early evaluations of emerging technologies, were simply beyond the depth of &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_8"&gt;TSSJS&lt;/span&gt;09.&lt;/p&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;div&gt;&lt;p&gt;But for what it's worth, there was a decent overview of a multitude of scripting languages: javascript, ruby and &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_9"&gt;scala&lt;/span&gt;, and a very impressive talk on Ruby meta programming.&lt;/p&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;div&gt;&lt;p&gt;There were several exciting news for me personally, the first having to do with &lt;b&gt;&lt;a href="http://www.adobe.com/products/flex/"&gt;Flex&lt;/a&gt;&lt;/b&gt; &lt;a href="http://opensource.adobe.com/wiki/display/blazeds/BlazeDS/"&gt;and &lt;/a&gt;&lt;b&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_10"&gt;&lt;a href="http://opensource.adobe.com/wiki/display/blazeds/BlazeDS/"&gt;BlazeDS&lt;/a&gt;&lt;/span&gt;&lt;/b&gt; integration in&lt;b&gt; &lt;a href="http://www.springsource.org/"&gt;Spring 3.0&lt;/a&gt;&lt;/b&gt;.  Basically what this means is that it's now possible to build a typically modular and well understood server-side &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_11"&gt;backend architecture&lt;/span&gt; in Spring, the client side in Flex, and have them directly converse over binary &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_12"&gt;AMF&lt;/span&gt; protocol, which is highly compressed and optimized to send data back and force.  I believe the entire stack is free, except Flex Builder Eclipse-based tool that's not free.  My exposure to Flex is minimal, but I love the ability to build beautiful application &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_13"&gt;UIs&lt;/span&gt; that run consistently within the browser, and expose your &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_14"&gt;backend&lt;/span&gt; in a way of clearly defined REST/XML &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_15"&gt;api&lt;/span&gt;. And the load time in demos appeared significantly faster compared to java &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_16"&gt;RMI&lt;/span&gt; applications I've had experience working with.&lt;/p&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;div&gt;&lt;p&gt;I'll add part II in a couple of days.&lt;/p&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://tektastic.com/feeds/281500168097078251/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=2136289839485858746&amp;postID=281500168097078251" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2136289839485858746/posts/default/281500168097078251?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2136289839485858746/posts/default/281500168097078251?v=2" /><link rel="alternate" type="text/html" href="http://tektastic.com/2009/03/techtargets-java-serverside-symposium.html" title="Techtarget's Java ServerSide Symposium 2009 Impressions" /><author><name>@kig</name><uri>http://www.blogger.com/profile/15696255549758746527</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://1.bp.blogspot.com/-zoKqo1q-CLM/T8sge_-0jSI/AAAAAAAAAVM/-hCFBaxZWBg/s220/moos_icon_lg.jpg" /></author><thr:total>1</thr:total></entry><entry gd:etag="W/&quot;CkAFSH49eip7ImA9WxVQGUs.&quot;"><id>tag:blogger.com,1999:blog-2136289839485858746.post-8447072647038019003</id><published>2009-02-06T14:46:00.000-08:00</published><updated>2009-02-06T14:51:59.062-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-02-06T14:51:59.062-08:00</app:edited><title>Binary PostgreSQL installer broken when used on RedHat EL5.3 / Dell PowerEdge 2950: Hangs server reboot.</title><content type="html">This is a very quick post that would hopefully save someone else hours of hitting the head on the wall like I did.

If you are installing &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;RedHat&lt;/span&gt; Enterprise Server 5.2/5.2 x86_64 on Dell &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_1"&gt;PowerEdge&lt;/span&gt; server, be aware of the following issue with &lt;a href="http://www.enterprisedb.com/products/pgdownload.do"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_2"&gt;PostgreSQL&lt;/span&gt; binary installer offered by &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_3"&gt;EnterpriseDB&lt;/span&gt;&lt;/a&gt;. 

&lt;blockquote&gt;After installation the server is unable to cleanly shutdown due to the fact that the binary installer does some voodoo with &lt;span style="font-weight: bold;"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_4"&gt;libtermcap&lt;/span&gt;&lt;/span&gt; - basically making this system library be used from inside &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_5"&gt;postgres&lt;/span&gt; installation folder.  Because of this, kernel can not &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_6"&gt;umount&lt;/span&gt; /&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_7"&gt;usr&lt;/span&gt; (or whenever your &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_8"&gt;PostgreSQL&lt;/span&gt; is installed) and hangs the shutdown.
&lt;/blockquote&gt;Solution:

&lt;blockquote&gt;Build PostgreSQL from the sources. They are ahead in minor version number anyway.
&lt;/blockquote&gt;Thanks.</content><link rel="replies" type="application/atom+xml" href="http://tektastic.com/feeds/8447072647038019003/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=2136289839485858746&amp;postID=8447072647038019003" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2136289839485858746/posts/default/8447072647038019003?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2136289839485858746/posts/default/8447072647038019003?v=2" /><link rel="alternate" type="text/html" href="http://tektastic.com/2009/02/binary-postgresql-installer-broken-when.html" title="Binary PostgreSQL installer broken when used on RedHat EL5.3 / Dell PowerEdge 2950: Hangs server reboot." /><author><name>@kig</name><uri>http://www.blogger.com/profile/15696255549758746527</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://1.bp.blogspot.com/-zoKqo1q-CLM/T8sge_-0jSI/AAAAAAAAAVM/-hCFBaxZWBg/s220/moos_icon_lg.jpg" /></author><thr:total>1</thr:total></entry><entry gd:etag="W/&quot;CUUHQX0zeSp7ImA9WxdaEUQ.&quot;"><id>tag:blogger.com,1999:blog-2136289839485858746.post-123469726370585088</id><published>2008-08-19T17:28:00.000-07:00</published><updated>2008-08-19T17:47:10.381-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-08-19T17:47:10.381-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="music" /><title>The Magic of Outdoor Raving</title><content type="html">&lt;p&gt;The campout happened, and it was an enormous success, everyone seemed to have had particularly special time this year, and I have to join the ranks. Check out just the &lt;a href="http://coil-lighting.com/gallery/fnf_2008/"&gt;insanely intricate lighting show&lt;/a&gt; put up by the &lt;a href="http://radiantatmospheres.com/"&gt;Radiant Atmospheres&lt;/a&gt; crew.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://coil-lighting.com/gallery/fnf_2008/"&gt;&lt;img style="display:block; margin: auto 10px;" src="http://polygroovers.com/img/photos/fnf_lighting.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I was involved in two music sets this year - a Friday evening downtempo set by &lt;a href="http://polygroovers.com"&gt;PolyGroovers&lt;/a&gt; (with live appearance by &lt;a href="http://vulpinedesign.com"&gt;Telene&lt;/a&gt; and briefly &lt;a href="http://f2sf.com/"&gt;Fabienne&lt;/a&gt;), and then Sunday morning solo live set.  The PolyGroovers stuff had many new tracks from the upcoming album, so that set won't be available for download, but the morning set is below:&lt;/p&gt;

&lt;h2&gt;&lt;a href="http://leftctrl.com/audio/leftctrl_live@fnf2008.mp3"&gt;LeftCtrl Live at Friends and Family Music Campout XII @ Willits CA&lt;/a&gt; (109Mb, 74min)&lt;/h2&gt;

&lt;p&gt;The above set has two songs composed together with &lt;a href="http://kemsf.com"&gt;Kem&lt;/a&gt; (Filip Jach), and one with Joseph Lee of Progress/SF.&lt;/p&gt;

&lt;p&gt;Please feel free to download and leave your feedback as comments!&lt;/p&gt;</content><link rel="replies" type="application/atom+xml" href="http://tektastic.com/feeds/123469726370585088/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=2136289839485858746&amp;postID=123469726370585088" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2136289839485858746/posts/default/123469726370585088?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2136289839485858746/posts/default/123469726370585088?v=2" /><link rel="alternate" type="text/html" href="http://tektastic.com/2008/08/magic-of-outdoor-raving.html" title="The Magic of Outdoor Raving" /><author><name>@kig</name><uri>http://www.blogger.com/profile/15696255549758746527</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://1.bp.blogspot.com/-zoKqo1q-CLM/T8sge_-0jSI/AAAAAAAAAVM/-hCFBaxZWBg/s220/moos_icon_lg.jpg" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;CE4NRn4-eSp7ImA9WxdVE08.&quot;"><id>tag:blogger.com,1999:blog-2136289839485858746.post-4936576140686355652</id><published>2008-07-17T12:26:00.001-07:00</published><updated>2008-07-17T12:29:57.051-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-07-17T12:29:57.051-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="obama" /><category scheme="http://www.blogger.com/atom/ns#" term="technology" /><category scheme="http://www.blogger.com/atom/ns#" term="politics" /><title>Tell Your Mana About Obama, and Obama Car Art</title><content type="html">&lt;h2&gt;Obama's Potential Presidency&lt;/h2&gt;

&lt;p&gt;There is plenty of excitement around Barack Obama's potential presidency, and I think there's a lot to be excited about. There's is an overwhelming feeling among people I talked to in San Francsisco, how Obama is "Our President" &amp;mdash; not a poster boy for old money or a powerful family.  The fact that the Internet fund-raising helped Obama to compete and win against the Clinton clan is a testament to the truly new era, a more democratic one, where if someone can fire up a lot of people they can rally up quckly and effectively.  This efficiency is something to look forward to, if and when Obama becomes a President.&lt;/p&gt;

&lt;p&gt;Whether or not all the people behind Obama will continue to support him, is another question.  People tend to idealize their heroes way to quickly, and that's also dangerous. The recent backlash of liberal bloggers about Obama's compromise vote &amp;mdash; is a great example. Politics is still politics, and nobody ever gets their way all the time. Everyone must compromise at some point.&lt;/p&gt;

&lt;p&gt;But enough said, I think that overall Obama is a great candidate, and will hopefully bring a new fresh perspective into the Washington. So, how do we get there? Well, donating money is, for once, a very easy thing to do thanks to &lt;a href="http://barackobama.com"&gt;http://barackobama.com&lt;/a&gt;.  But now there are other ways.&lt;/p&gt;

&lt;h2&gt;Car Art Contest&lt;/h2&gt;

&lt;p&gt;&lt;a href="http://infectious.com/"&gt;Infectious.com&lt;/a&gt; (the company I work for) is running an open contest for Car Art Submissions around Obama.  There are some restrictions - some specific words can not be used, but it's an amazing opportunity for artists around United States to create Obama Car Art that can be seen by thousands of people commuting daily in the next few months before the election.  This is as &lt;em&gt;grass roots&lt;/em&gt; as it gets.&lt;/p&gt;

&lt;p&gt;
&lt;a href="http://www.infectious.com/obama" target="_new"&gt;&lt;img style="border-width: 0px;" src="http://www.infectious.com/images/v3/badges/infectious-obama-170x200.gif" title="Obama Car Art Contest @ Infectious.com"&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;If you know any artists that may be interested please send them to Infectious. Or you can grab the banner above and put it up on your blog. Either way - thank you!&lt;/p&gt;</content><link rel="replies" type="application/atom+xml" href="http://tektastic.com/feeds/4936576140686355652/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=2136289839485858746&amp;postID=4936576140686355652" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2136289839485858746/posts/default/4936576140686355652?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2136289839485858746/posts/default/4936576140686355652?v=2" /><link rel="alternate" type="text/html" href="http://tektastic.com/2008/07/tell-your-mana-about-obama-and-obama.html" title="Tell Your Mana About Obama, and Obama Car Art" /><author><name>@kig</name><uri>http://www.blogger.com/profile/15696255549758746527</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://1.bp.blogspot.com/-zoKqo1q-CLM/T8sge_-0jSI/AAAAAAAAAVM/-hCFBaxZWBg/s220/moos_icon_lg.jpg" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;Ck8AQX08eip7ImA9WxdQF04.&quot;"><id>tag:blogger.com,1999:blog-2136289839485858746.post-4207869832739271531</id><published>2008-06-17T11:25:00.000-07:00</published><updated>2008-06-17T12:27:20.372-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-06-17T12:27:20.372-07:00</app:edited><title>Firefox3 PR Backfires?</title><content type="html">&lt;p&gt;
After announcing to the world that Firefox 3 will be available at 10am PDT today, June 17th, amidst apparent publicity stunt to generate the record number of downloads per day (has anyone been really keeping a tally?) the web site http://getfirefox.com/ returns the pathetic&lt;/p&gt;

&lt;blockquote&gt;Http/1.1 Service Unavailable&lt;/blockquote&gt;

&lt;p&gt;Firefox is certainly a decent browser, but it's stability seems to have gone reversely proportional to the self-professed greatness and the size of their publicity stunts.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.apple.com/safari/"&gt;Safari&lt;/a&gt; is now by far the best looking, and fastest browser for Windows, and it has been that way for mac for a while.&lt;/p&gt;

&lt;p&gt;Good luck Fifefox 3 (when we see you), but I for one, am not buying it.&lt;/p&gt;

&lt;h2&gt;Update @ 12:23pm&lt;/h2&gt;

&lt;p&gt;OK, so finally FF3 is available for download, and I have it installed and running.  The first thing is that not all plugins are compatible, and if you are using FireBug for web development, you must install the 1.1 version &lt;a href="http://getfirebug.com/releases/firebug/1.1/firebug-1.1.0b11.xpi"&gt;available here.&lt;/a&gt;&lt;/p&gt;</content><link rel="replies" type="application/atom+xml" href="http://tektastic.com/feeds/4207869832739271531/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=2136289839485858746&amp;postID=4207869832739271531" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2136289839485858746/posts/default/4207869832739271531?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2136289839485858746/posts/default/4207869832739271531?v=2" /><link rel="alternate" type="text/html" href="http://tektastic.com/2008/06/firefox3-pr-backfires.html" title="Firefox3 PR Backfires?" /><author><name>@kig</name><uri>http://www.blogger.com/profile/15696255549758746527</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://1.bp.blogspot.com/-zoKqo1q-CLM/T8sge_-0jSI/AAAAAAAAAVM/-hCFBaxZWBg/s220/moos_icon_lg.jpg" /></author><thr:total>2</thr:total></entry></feed>
