<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Letsgetdugg&#187; programming</title>
	<atom:link href="http://letsgetdugg.com/category/programming/feed/" rel="self" type="application/rss+xml" />
	<link>http://letsgetdugg.com</link>
	<description>Random tech jargon</description>
	<lastBuildDate>Tue, 31 Aug 2010 22:18:45 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>Ruby LocaleTranslator</title>
		<link>http://letsgetdugg.com/2010/07/20/ruby-locale-translator/</link>
		<comments>http://letsgetdugg.com/2010/07/20/ruby-locale-translator/#comments</comments>
		<pubDate>Tue, 20 Jul 2010 21:05:55 +0000</pubDate>
		<dc:creator>victori</dc:creator>
				<category><![CDATA[main]]></category>
		<category><![CDATA[open source]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[localization]]></category>
		<category><![CDATA[ruby]]></category>

		<guid isPermaLink="false">http://letsgetdugg.com/?p=741</guid>
		<description><![CDATA[Today, I am open sourcing my Ruby LocaleTranslator; the translator uses google&#8217;s translator API to translate a primary seed locale into various other languages. This eases the creation of multi-lingual sites. Not only can the LocaleTranslator translate your main seed locale into different languages but it can also recursively merge in differences, this comes in [...]]]></description>
			<content:encoded><![CDATA[<p>Today, I am open sourcing my Ruby LocaleTranslator; the translator uses google&#8217;s translator API to translate a primary seed locale into various other languages. This eases the creation of multi-lingual sites. Not only can the LocaleTranslator translate your main seed locale into different languages but it can also recursively merge in differences, this comes in handy if you have hand-optimized your translated locales.</p>
<p>Viva Localization!</p>
<p>My projects that use the LocaleTranslator;  <a href="http://uploadbooth.com/">UploadBooth</a>, <a href="http://pastebooth.com/">PasteBooth</a> and <a href="http://shrinkbooth.com/">ShrinkBooth</a>.</p>
<h3>LocaleTranslator Examples</h3>
<p><strong>en.yml</strong></p>
<pre>
<div class="codesnip-container" >site:
  hello_world: Hello World!
  home: Home
  statement: Localization should be simple!</div>
</pre>
<p>Batch Conversion of your English locale.</p>
<div class="codesnip-container" >
<div class="ruby codesnip" style="font-family:monospace;"><span class="co1">#!/opt/local/bin/ruby</span></p>
<p><span class="kw3">require</span> <span class="st0">&#8216;monkey-patches.rb&#8217;</span><br />
<span class="kw3">require</span> <span class="st0">&#8216;locale_translator.rb&#8217;</span></p>
<p>en_yml = <span class="kw4">YAML</span>::<span class="kw3">load</span><span class="br0">&#40;</span><span class="kw4">File</span>.<span class="kw3">open</span><span class="br0">&#40;</span><span class="st0">&#8216;en.yml&#8217;</span><span class="br0">&#41;</span><span class="br0">&#41;</span></p>
<p><span class="br0">&#91;</span><span class="re3">:de</span>,:ru<span class="br0">&#93;</span>.<span class="me1">each</span> <span class="kw1">do</span> <span class="sy0">|</span>lang<span class="sy0">|</span><br />
&nbsp; lang_yml = LocaleTranslator.<span class="me1">translate</span><span class="br0">&#40;</span>en_yml,<br />
&nbsp; &nbsp; <span class="re3">:to</span><span class="sy0">=&gt;</span>lang,<br />
&nbsp; &nbsp; <span class="re3">:html</span><span class="sy0">=&gt;</span>true,<br />
&nbsp; &nbsp; <span class="re3">:key</span><span class="sy0">=&gt;</span><span class="st0">&#8216;GOOGLE API KEY&#8217;</span><span class="br0">&#41;</span><br />
&nbsp; f = <span class="kw4">File</span>.<span class="me1">new</span><span class="br0">&#40;</span><span class="st0">&quot;#{lang.to_s.downcase}.yml&quot;</span>,<span class="st0">&quot;w&quot;</span><span class="br0">&#41;</span><br />
&nbsp; f.<span class="kw3">puts</span><span class="br0">&#40;</span>lang_yml.<span class="me1">ya2yaml</span><span class="br0">&#40;</span><span class="re3">:syck_compatible</span> <span class="sy0">=&gt;</span> <span class="kw2">true</span><span class="br0">&#41;</span><span class="br0">&#41;</span><br />
&nbsp; f.<span class="me1">close</span><br />
&nbsp; <span class="kw3">p</span> <span class="st0">&quot;Translated to #{lang.to_s}&quot;</span><br />
<span class="kw1">end</span></div>
</div>
<p>Merge in new locale keys from your English Locale into your already translated Russian locale.</p>
<div class="codesnip-container" >
<div class="ruby codesnip" style="font-family:monospace;"><span class="co1">#!/opt/local/bin/ruby</span></p>
<p><span class="kw3">require</span> <span class="st0">&#8216;monkey-patches.rb&#8217;</span><br />
<span class="kw3">require</span> <span class="st0">&#8216;locale_translator.rb&#8217;</span></p>
<p>en_yml = <span class="kw4">YAML</span>::<span class="kw3">load</span><span class="br0">&#40;</span><span class="kw4">File</span>.<span class="kw3">open</span><span class="br0">&#40;</span><span class="st0">&#8216;en.yml&#8217;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><br />
ru_yml = <span class="kw4">YAML</span>::<span class="kw3">load</span><span class="br0">&#40;</span><span class="kw4">File</span>.<span class="kw3">open</span><span class="br0">&#40;</span><span class="st0">&#8216;ru.yml&#8217;</span><span class="br0">&#41;</span><span class="br0">&#41;</span></p>
<p>ru_new_yml = LocaleTranslator.<span class="me1">translate</span><span class="br0">&#40;</span>en_yml,<br />
&nbsp; <span class="re3">:to</span><span class="sy0">=&gt;</span>:ru,<br />
&nbsp; <span class="re3">:html</span><span class="sy0">=&gt;</span>true,<br />
&nbsp; <span class="re3">:merge</span><span class="sy0">=&gt;</span>ru_yml,<br />
&nbsp; <span class="re3">:key</span><span class="sy0">=&gt;</span><span class="st0">&#8216;GOOGLE API KEY&#8217;</span><span class="br0">&#41;</span><br />
<span class="kw3">puts</span> ru_new_yml.<span class="me1">ya2yaml</span><span class="br0">&#40;</span><span class="re3">:syck_compatible</span> <span class="sy0">=&gt;</span> <span class="kw2">true</span><span class="br0">&#41;</span></div>
</div>
<h3>The Implementation Code</h3>
<p><strong>Support Monkey Patches</strong></p>
<p><strong>monkey-patches.rb</strong></p>
<div class="codesnip-container" >
<div class="ruby codesnip" style="font-family:monospace;"><span class="kw1">class</span> <span class="kw4">Hash</span><br />
&nbsp; <span class="kw1">def</span> to_list<br />
&nbsp; &nbsp; h2l<span class="br0">&#40;</span><span class="kw2">self</span><span class="br0">&#41;</span><br />
&nbsp; <span class="kw1">end</span><br />
&nbsp; <br />
&nbsp; <span class="kw1">def</span> diff<span class="br0">&#40;</span>hash<span class="br0">&#41;</span><br />
&nbsp; &nbsp; hsh = <span class="br0">&#123;</span><span class="br0">&#125;</span><br />
&nbsp; &nbsp; this = <span class="kw2">self</span><br />
&nbsp; &nbsp; hash.<span class="me1">each</span> <span class="kw1">do</span> <span class="sy0">|</span>k,v<span class="sy0">|</span> <br />
&nbsp; &nbsp; &nbsp; <span class="kw1">if</span> v.<span class="me1">kind_of</span>?<span class="kw4">Hash</span> <span class="kw1">and</span> this.<span class="me1">key</span>?k<br />
&nbsp; &nbsp; &nbsp; &nbsp; tmp = this<span class="br0">&#91;</span>k<span class="br0">&#93;</span>.<span class="me1">diff</span><span class="br0">&#40;</span>v<span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; hsh<span class="br0">&#91;</span>k<span class="br0">&#93;</span> = tmp <span class="kw1">if</span> tmp.<span class="me1">size</span> <span class="sy0">&gt;</span> 0 <br />
&nbsp; &nbsp; &nbsp; <span class="kw1">else</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; hsh<span class="br0">&#91;</span>k<span class="br0">&#93;</span> = v <span class="kw1">unless</span> this.<span class="me1">key</span>?k <br />
&nbsp; &nbsp; &nbsp; <span class="kw1">end</span><br />
&nbsp; &nbsp; <span class="kw1">end</span><br />
&nbsp; &nbsp; hsh<br />
&nbsp; <span class="kw1">end</span><br />
&nbsp; <br />
&nbsp; <span class="kw1">def</span> merge_r<span class="br0">&#40;</span>hash<span class="br0">&#41;</span><br />
&nbsp; &nbsp; hsh = <span class="br0">&#123;</span><span class="br0">&#125;</span><br />
&nbsp; &nbsp; this = <span class="kw2">self</span><br />
&nbsp; &nbsp; hash.<span class="me1">each</span> <span class="kw1">do</span> <span class="sy0">|</span>k,v<span class="sy0">|</span> <br />
&nbsp; &nbsp; &nbsp; <span class="kw1">if</span> v.<span class="me1">kind_of</span>?<span class="kw4">Hash</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; hsh<span class="br0">&#91;</span>k<span class="br0">&#93;</span> = this<span class="br0">&#91;</span>k<span class="br0">&#93;</span>.<span class="me1">merge_r</span><span class="br0">&#40;</span>v<span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; <span class="kw1">else</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; hsh<span class="br0">&#91;</span>k<span class="br0">&#93;</span> = v<br />
&nbsp; &nbsp; &nbsp; <span class="kw1">end</span><br />
&nbsp; &nbsp; <span class="kw1">end</span><br />
&nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">merge</span><span class="br0">&#40;</span>hsh<span class="br0">&#41;</span><br />
&nbsp; <span class="kw1">end</span><br />
&nbsp; <br />
&nbsp; private <br />
&nbsp; &nbsp; <span class="kw1">def</span> h2l<span class="br0">&#40;</span>hash<span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; list = <span class="br0">&#91;</span><span class="br0">&#93;</span><br />
&nbsp; &nbsp; &nbsp; hash.<span class="me1">each</span> <span class="br0">&#123;</span><span class="sy0">|</span>k,v<span class="sy0">|</span> list = <span class="br0">&#40;</span>v.<span class="me1">kind_of</span>?<span class="kw4">Hash</span><span class="br0">&#41;</span> ? list.<span class="me1">merge_with_dups</span><span class="br0">&#40;</span>h2l<span class="br0">&#40;</span>v<span class="br0">&#41;</span><span class="br0">&#41;</span> : list <span class="sy0">&lt;&lt;</span> v <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; list<br />
&nbsp; &nbsp; <span class="kw1">end</span><br />
<span class="kw1">end</span></p>
<p><span class="kw1">class</span> <span class="kw3">Array</span><br />
&nbsp; <span class="kw1">def</span> chunk<span class="br0">&#40;</span><span class="kw3">p</span>=2<span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="kw2">return</span> <span class="br0">&#91;</span><span class="br0">&#93;</span> <span class="kw1">if</span> <span class="kw3">p</span>.<span class="me1">zero</span>?<br />
&nbsp; &nbsp; p_size = <span class="br0">&#40;</span>length.<span class="me1">to_f</span> <span class="sy0">/</span> <span class="kw3">p</span><span class="br0">&#41;</span>.<span class="me1">ceil</span><br />
&nbsp; &nbsp; <span class="br0">&#91;</span>first<span class="br0">&#40;</span>p_size<span class="br0">&#41;</span>, <span class="sy0">*</span>last<span class="br0">&#40;</span>length <span class="sy0">-</span> p_size<span class="br0">&#41;</span>.<span class="me1">chunk</span><span class="br0">&#40;</span><span class="kw3">p</span> <span class="sy0">-</span> 1<span class="br0">&#41;</span><span class="br0">&#93;</span><br />
&nbsp; <span class="kw1">end</span><br />
&nbsp; <span class="kw1">def</span> to_hash<span class="br0">&#40;</span>hash<span class="br0">&#41;</span><br />
&nbsp; &nbsp; l2h<span class="br0">&#40;</span>hash,<span class="kw2">self</span><span class="br0">&#41;</span><br />
&nbsp; <span class="kw1">end</span><br />
&nbsp; <span class="kw1">def</span> merge<span class="br0">&#40;</span>arr<span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="kw2">self</span> <span class="sy0">|</span> arr<br />
&nbsp; <span class="kw1">end</span><br />
&nbsp; <span class="kw1">def</span> merge_with_dups<span class="br0">&#40;</span>arr<span class="br0">&#41;</span><br />
&nbsp; &nbsp; temp = <span class="br0">&#91;</span><span class="br0">&#93;</span><br />
&nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">each</span> <span class="br0">&#123;</span><span class="sy0">|</span>a<span class="sy0">|</span> temp <span class="sy0">&lt;&lt;</span> a <span class="br0">&#125;</span><br />
&nbsp; &nbsp; arr.<span class="me1">each</span> <span class="br0">&#123;</span><span class="sy0">|</span>a<span class="sy0">|</span> temp <span class="sy0">&lt;&lt;</span> a <span class="br0">&#125;</span><br />
&nbsp; &nbsp; temp<br />
&nbsp; <span class="kw1">end</span><br />
&nbsp; <span class="kw1">def</span> merge!<span class="br0">&#40;</span>arr<span class="br0">&#41;</span><br />
&nbsp; &nbsp; temp = <span class="kw2">self</span>.<span class="me1">clone</span><br />
&nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">clear</span><br />
&nbsp; &nbsp; temp.<span class="me1">each</span> <span class="br0">&#123;</span><span class="sy0">|</span>a<span class="sy0">|</span> <span class="kw2">self</span> <span class="sy0">&lt;&lt;</span> a <span class="br0">&#125;</span><br />
&nbsp; &nbsp; arr.<span class="me1">each</span> <span class="br0">&#123;</span><span class="sy0">|</span>a<span class="sy0">|</span> <span class="kw2">self</span> <span class="sy0">&lt;&lt;</span> a <span class="kw1">unless</span> temp.<span class="kw1">include</span>?a <span class="br0">&#125;</span><br />
&nbsp; &nbsp; <span class="kw2">true</span><br />
&nbsp; <span class="kw1">end</span><br />
&nbsp; <span class="kw1">def</span> merge_with_dups!<span class="br0">&#40;</span>arr<span class="br0">&#41;</span><br />
&nbsp; &nbsp; temp = <span class="kw2">self</span>.<span class="me1">clone</span><br />
&nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">clear</span><br />
&nbsp; &nbsp; temp.<span class="me1">each</span> <span class="br0">&#123;</span><span class="sy0">|</span>a<span class="sy0">|</span> <span class="kw2">self</span> <span class="sy0">&lt;&lt;</span> a <span class="br0">&#125;</span><br />
&nbsp; &nbsp; arr.<span class="me1">each</span> <span class="br0">&#123;</span><span class="sy0">|</span>a<span class="sy0">|</span> <span class="kw2">self</span> <span class="sy0">&lt;&lt;</span> a <span class="br0">&#125;</span><br />
&nbsp; &nbsp; <span class="kw2">true</span><br />
&nbsp; <span class="kw1">end</span><br />
&nbsp; private<br />
&nbsp; &nbsp; <span class="kw1">def</span> l2h<span class="br0">&#40;</span>hash,lst<span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; hsh = <span class="br0">&#123;</span><span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; hash.<span class="me1">each</span> <span class="br0">&#123;</span><span class="sy0">|</span>k,v<span class="sy0">|</span> hsh<span class="br0">&#91;</span>k<span class="br0">&#93;</span> = <span class="br0">&#40;</span>v.<span class="me1">kind_of</span>?<span class="kw4">Hash</span><span class="br0">&#41;</span> ? l2h<span class="br0">&#40;</span>v,lst<span class="br0">&#41;</span> : lst.<span class="me1">shift</span> <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; hsh<br />
&nbsp; &nbsp; <span class="kw1">end</span><br />
<span class="kw1">end</span></div>
</div>
<p><strong>The LocaleTranslator Implementation</strong></p>
<p>You need the ya2yaml and easy_translate gems. Ya2YAML can export locales in UTF-8 unlike the standard yaml implementation that can only export in binary for non-standard ascii.</p>
<p><strong>locale-translator.rb</strong></p>
<div class="codesnip-container" >
<div class="ruby codesnip" style="font-family:monospace;"><span class="re0">$KCODE</span> = <span class="st0">&#8216;UTF8&#8242;</span> <span class="kw1">if</span> RUBY_VERSION <span class="sy0">&lt;</span> <span class="st0">&#8217;1.9.0&#8242;</span><br />
<span class="kw3">require</span> <span class="st0">&#8216;rubygems&#8217;</span><br />
<span class="kw3">require</span> <span class="st0">&#8216;ya2yaml&#8217;</span><br />
<span class="kw3">require</span> <span class="st0">&#8216;yaml&#8217;</span><br />
<span class="kw3">require</span> <span class="st0">&#8216;easy_translate&#8217;</span></p>
<p><span class="kw1">class</span> LocaleTranslator<br />
&nbsp; <span class="kw1">def</span> <span class="kw2">self</span>.<span class="me1">translate</span><span class="br0">&#40;</span>text,opts<span class="br0">&#41;</span><br />
&nbsp; &nbsp; opts<span class="br0">&#91;</span><span class="re3">:to</span><span class="br0">&#93;</span> = <span class="br0">&#91;</span>opts<span class="br0">&#91;</span><span class="re3">:to</span><span class="br0">&#93;</span><span class="br0">&#93;</span> <span class="kw1">if</span> opts<span class="br0">&#91;</span><span class="re3">:to</span><span class="br0">&#93;</span> <span class="kw1">and</span> !opts<span class="br0">&#91;</span><span class="re3">:to</span><span class="br0">&#93;</span>.<span class="me1">kind_of</span>?<span class="kw3">Array</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; <span class="kw1">if</span> opts<span class="br0">&#91;</span><span class="re3">:merge</span><span class="br0">&#93;</span>.<span class="me1">kind_of</span>?<span class="kw4">Hash</span> <span class="kw1">and</span> text.<span class="me1">kind_of</span>?<span class="kw4">Hash</span><br />
&nbsp; &nbsp; &nbsp; diff = opts<span class="br0">&#91;</span><span class="re3">:merge</span><span class="br0">&#93;</span>.<span class="me1">diff</span><span class="br0">&#40;</span>text<span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; diff_hsh = LocaleTranslator.<span class="me1">translate</span><span class="br0">&#40;</span>diff,:to<span class="sy0">=&gt;</span>opts<span class="br0">&#91;</span><span class="re3">:to</span><span class="br0">&#93;</span>,:html<span class="sy0">=&gt;</span>true<span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; <span class="kw2">return</span> opts<span class="br0">&#91;</span><span class="re3">:merge</span><span class="br0">&#93;</span>.<span class="me1">merge_r</span><span class="br0">&#40;</span>diff_hsh<span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="kw1">end</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; <span class="kw1">if</span> text.<span class="me1">kind_of</span>?<span class="kw4">Hash</span><br />
&nbsp; &nbsp; &nbsp; t_arr = text.<span class="me1">to_list</span><br />
&nbsp; &nbsp; &nbsp; t_arr = t_arr.<span class="me1">first</span> <span class="kw1">if</span> t_arr.<span class="me1">size</span> == 1<br />
&nbsp; &nbsp; &nbsp; tout_arr = LocaleTranslator.<span class="me1">translate</span><span class="br0">&#40;</span>t_arr,:to<span class="sy0">=&gt;</span>opts<span class="br0">&#91;</span><span class="re3">:to</span><span class="br0">&#93;</span>,:html<span class="sy0">=&gt;</span>true<span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; tout_arr = <span class="br0">&#91;</span>tout_arr<span class="br0">&#93;</span> <span class="kw1">if</span> tout_arr.<span class="me1">kind_of</span>?<span class="kw3">String</span><br />
&nbsp; &nbsp; &nbsp; tout_arr.<span class="me1">to_hash</span><span class="br0">&#40;</span>text<span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="kw1">elsif</span> text.<span class="me1">kind_of</span>?<span class="kw3">Array</span><br />
&nbsp; &nbsp; &nbsp; <span class="kw1">if</span> text.<span class="me1">size</span> <span class="sy0">&gt;</span> 50<br />
&nbsp; &nbsp; &nbsp; &nbsp; out = <span class="br0">&#91;</span><span class="br0">&#93;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; text.<span class="me1">chunk</span>.<span class="me1">each</span> <span class="br0">&#123;</span><span class="sy0">|</span>l<span class="sy0">|</span> out.<span class="me1">merge_with_dups</span>!<span class="br0">&#40;</span>EasyTranslate.<span class="me1">translate</span><span class="br0">&#40;</span>l,opts<span class="br0">&#41;</span>.<span class="me1">first</span><span class="br0">&#41;</span> <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; out<br />
&nbsp; &nbsp; &nbsp; <span class="kw1">else</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; text = text.<span class="me1">first</span> <span class="kw1">if</span> text.<span class="me1">size</span> == 1<br />
&nbsp; &nbsp; &nbsp; &nbsp; EasyTranslate.<span class="me1">translate</span><span class="br0">&#40;</span>text,opts<span class="br0">&#41;</span>.<span class="me1">first</span><br />
&nbsp; &nbsp; &nbsp; <span class="kw1">end</span><br />
&nbsp; &nbsp; <span class="kw1">else</span><br />
&nbsp; &nbsp; &nbsp; EasyTranslate.<span class="me1">translate</span><span class="br0">&#40;</span>text,opts<span class="br0">&#41;</span>.<span class="me1">first</span><br />
&nbsp; &nbsp; <span class="kw1">end</span><br />
&nbsp; <span class="kw1">end</span><br />
<span class="kw1">end</span></div>
</div>



Share and Enjoy:


	<a rel="nofollow"  target="_blank" href="http://digg.com/submit?phase=2&amp;url=http%3A%2F%2Fletsgetdugg.com%2F2010%2F07%2F20%2Fruby-locale-translator%2F&amp;title=Ruby%20LocaleTranslator&amp;bodytext=Today%2C%20I%20am%20open%20sourcing%20my%20Ruby%20LocaleTranslator%3B%20the%20translator%20uses%20google%27s%20translator%20API%20to%20translate%20a%20primary%20seed%20locale%20into%20various%20other%20languages.%20This%20eases%20the%20creation%20of%20multi-lingual%20sites.%20Not%20only%20can%20the%20LocaleTranslator%20transla" title="Digg"><img src="http://letsgetdugg.com/wp-content/plugins/sociable/images/digg.png" title="Digg" alt="Digg" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://sphinn.com/index.php?c=post&amp;m=submit&amp;link=http%3A%2F%2Fletsgetdugg.com%2F2010%2F07%2F20%2Fruby-locale-translator%2F" title="Sphinn"><img src="http://letsgetdugg.com/wp-content/plugins/sociable/images/sphinn.png" title="Sphinn" alt="Sphinn" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://delicious.com/post?url=http%3A%2F%2Fletsgetdugg.com%2F2010%2F07%2F20%2Fruby-locale-translator%2F&amp;title=Ruby%20LocaleTranslator&amp;notes=Today%2C%20I%20am%20open%20sourcing%20my%20Ruby%20LocaleTranslator%3B%20the%20translator%20uses%20google%27s%20translator%20API%20to%20translate%20a%20primary%20seed%20locale%20into%20various%20other%20languages.%20This%20eases%20the%20creation%20of%20multi-lingual%20sites.%20Not%20only%20can%20the%20LocaleTranslator%20transla" title="del.icio.us"><img src="http://letsgetdugg.com/wp-content/plugins/sociable/images/delicious.png" title="del.icio.us" alt="del.icio.us" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://www.facebook.com/share.php?u=http%3A%2F%2Fletsgetdugg.com%2F2010%2F07%2F20%2Fruby-locale-translator%2F&amp;t=Ruby%20LocaleTranslator" title="Facebook"><img src="http://letsgetdugg.com/wp-content/plugins/sociable/images/facebook.png" title="Facebook" alt="Facebook" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://www.mixx.com/submit?page_url=http%3A%2F%2Fletsgetdugg.com%2F2010%2F07%2F20%2Fruby-locale-translator%2F&amp;title=Ruby%20LocaleTranslator" title="Mixx"><img src="http://letsgetdugg.com/wp-content/plugins/sociable/images/mixx.png" title="Mixx" alt="Mixx" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://www.google.com/bookmarks/mark?op=edit&amp;bkmk=http%3A%2F%2Fletsgetdugg.com%2F2010%2F07%2F20%2Fruby-locale-translator%2F&amp;title=Ruby%20LocaleTranslator&amp;annotation=Today%2C%20I%20am%20open%20sourcing%20my%20Ruby%20LocaleTranslator%3B%20the%20translator%20uses%20google%27s%20translator%20API%20to%20translate%20a%20primary%20seed%20locale%20into%20various%20other%20languages.%20This%20eases%20the%20creation%20of%20multi-lingual%20sites.%20Not%20only%20can%20the%20LocaleTranslator%20transla" title="Google Bookmarks"><img src="http://letsgetdugg.com/wp-content/plugins/sociable/images/googlebookmark.png" title="Google Bookmarks" alt="Google Bookmarks" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://www.designfloat.com/submit.php?url=http%3A%2F%2Fletsgetdugg.com%2F2010%2F07%2F20%2Fruby-locale-translator%2F&amp;title=Ruby%20LocaleTranslator" title="Design Float"><img src="http://letsgetdugg.com/wp-content/plugins/sociable/images/designfloat.png" title="Design Float" alt="Design Float" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://www.dzone.com/links/add.html?url=http%3A%2F%2Fletsgetdugg.com%2F2010%2F07%2F20%2Fruby-locale-translator%2F&amp;title=Ruby%20LocaleTranslator" title="DZone"><img src="http://letsgetdugg.com/wp-content/plugins/sociable/images/dzone.png" title="DZone" alt="DZone" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://reddit.com/submit?url=http%3A%2F%2Fletsgetdugg.com%2F2010%2F07%2F20%2Fruby-locale-translator%2F&amp;title=Ruby%20LocaleTranslator" title="Reddit"><img src="http://letsgetdugg.com/wp-content/plugins/sociable/images/reddit.png" title="Reddit" alt="Reddit" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://slashdot.org/bookmark.pl?title=Ruby%20LocaleTranslator&amp;url=http%3A%2F%2Fletsgetdugg.com%2F2010%2F07%2F20%2Fruby-locale-translator%2F" title="Slashdot"><img src="http://letsgetdugg.com/wp-content/plugins/sociable/images/slashdot.png" title="Slashdot" alt="Slashdot" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="" title="TwitThis"><img src="http://letsgetdugg.com/wp-content/plugins/sociable/images/" title="TwitThis" alt="TwitThis" class="sociable-hovers" /></a>


<br/><br/>]]></content:encoded>
			<wfw:commentRss>http://letsgetdugg.com/2010/07/20/ruby-locale-translator/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Scala yEnc Decoder</title>
		<link>http://letsgetdugg.com/2010/06/22/scala-yenc-decoder/</link>
		<comments>http://letsgetdugg.com/2010/06/22/scala-yenc-decoder/#comments</comments>
		<pubDate>Tue, 22 Jun 2010 22:07:17 +0000</pubDate>
		<dc:creator>victori</dc:creator>
				<category><![CDATA[open source]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[scala]]></category>

		<guid isPermaLink="false">http://letsgetdugg.com/?p=671</guid>
		<description><![CDATA[SYEnc is a Scala decoder for the yEnc format that is based on Alex Russ&#8217;s Java yEnc Decoder. SYEnc was designed to be used as a library by applications needing to use yEnc to decode data. It should be thread-safe, so don&#8217;t worry about using it in a threaded context. Uploaded to github: http://github.com/victori/syenc Example: [...]]]></description>
			<content:encoded><![CDATA[<p>SYEnc is a Scala decoder for the <a href="http://www.yenc.org/">yEnc format</a> that is based on Alex Russ&#8217;s Java yEnc Decoder. SYEnc was designed to be used as a library by applications needing to use yEnc to decode data. It should be thread-safe, so don&#8217;t worry about using it in a threaded context.</p>
<p>Uploaded to github: <a href="http://github.com/victori/syenc">http://github.com/victori/syenc</a></p>
<p><b>Example:</b></p>
<div class="codesnip-container" >
<div class="scala codesnip" style="font-family:monospace;"><a href="http://scala-lang.org"><span class="kw1">val</span></a> baos <span class="sy0">=</span> <a href="http://scala-lang.org"><span class="kw1">new</span></a> ByteArrayOutputStream<br />
SYEnc.<span class="me1">decode</span><span class="br0">&#40;</span><a href="http://scala-lang.org"><span class="kw1">new</span></a> ByteArrayInputStream<span class="br0">&#40;</span>stringFromStream.<span class="me1">getBytes</span><span class="br0">&#40;</span><span class="st0">&quot;UTF-8&quot;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>, baos<span class="br0">&#41;</span><br />
println<span class="br0">&#40;</span>baos.<span class="me1">toString</span><span class="br0">&#41;</span></div>
</div>



Share and Enjoy:


	<a rel="nofollow"  target="_blank" href="http://digg.com/submit?phase=2&amp;url=http%3A%2F%2Fletsgetdugg.com%2F2010%2F06%2F22%2Fscala-yenc-decoder%2F&amp;title=Scala%20yEnc%20Decoder&amp;bodytext=SYEnc%20is%20a%20Scala%20decoder%20for%20the%20yEnc%20format%20that%20is%20based%20on%20Alex%20Russ%27s%20Java%20yEnc%20Decoder.%20SYEnc%20was%20designed%20to%20be%20used%20as%20a%20library%20by%20applications%20needing%20to%20use%20yEnc%20to%20decode%20data.%20It%20should%20be%20thread-safe%2C%20so%20don%27t%20worry%20about%20using%20it%20in%20a%20t" title="Digg"><img src="http://letsgetdugg.com/wp-content/plugins/sociable/images/digg.png" title="Digg" alt="Digg" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://sphinn.com/index.php?c=post&amp;m=submit&amp;link=http%3A%2F%2Fletsgetdugg.com%2F2010%2F06%2F22%2Fscala-yenc-decoder%2F" title="Sphinn"><img src="http://letsgetdugg.com/wp-content/plugins/sociable/images/sphinn.png" title="Sphinn" alt="Sphinn" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://delicious.com/post?url=http%3A%2F%2Fletsgetdugg.com%2F2010%2F06%2F22%2Fscala-yenc-decoder%2F&amp;title=Scala%20yEnc%20Decoder&amp;notes=SYEnc%20is%20a%20Scala%20decoder%20for%20the%20yEnc%20format%20that%20is%20based%20on%20Alex%20Russ%27s%20Java%20yEnc%20Decoder.%20SYEnc%20was%20designed%20to%20be%20used%20as%20a%20library%20by%20applications%20needing%20to%20use%20yEnc%20to%20decode%20data.%20It%20should%20be%20thread-safe%2C%20so%20don%27t%20worry%20about%20using%20it%20in%20a%20t" title="del.icio.us"><img src="http://letsgetdugg.com/wp-content/plugins/sociable/images/delicious.png" title="del.icio.us" alt="del.icio.us" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://www.facebook.com/share.php?u=http%3A%2F%2Fletsgetdugg.com%2F2010%2F06%2F22%2Fscala-yenc-decoder%2F&amp;t=Scala%20yEnc%20Decoder" title="Facebook"><img src="http://letsgetdugg.com/wp-content/plugins/sociable/images/facebook.png" title="Facebook" alt="Facebook" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://www.mixx.com/submit?page_url=http%3A%2F%2Fletsgetdugg.com%2F2010%2F06%2F22%2Fscala-yenc-decoder%2F&amp;title=Scala%20yEnc%20Decoder" title="Mixx"><img src="http://letsgetdugg.com/wp-content/plugins/sociable/images/mixx.png" title="Mixx" alt="Mixx" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://www.google.com/bookmarks/mark?op=edit&amp;bkmk=http%3A%2F%2Fletsgetdugg.com%2F2010%2F06%2F22%2Fscala-yenc-decoder%2F&amp;title=Scala%20yEnc%20Decoder&amp;annotation=SYEnc%20is%20a%20Scala%20decoder%20for%20the%20yEnc%20format%20that%20is%20based%20on%20Alex%20Russ%27s%20Java%20yEnc%20Decoder.%20SYEnc%20was%20designed%20to%20be%20used%20as%20a%20library%20by%20applications%20needing%20to%20use%20yEnc%20to%20decode%20data.%20It%20should%20be%20thread-safe%2C%20so%20don%27t%20worry%20about%20using%20it%20in%20a%20t" title="Google Bookmarks"><img src="http://letsgetdugg.com/wp-content/plugins/sociable/images/googlebookmark.png" title="Google Bookmarks" alt="Google Bookmarks" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://www.designfloat.com/submit.php?url=http%3A%2F%2Fletsgetdugg.com%2F2010%2F06%2F22%2Fscala-yenc-decoder%2F&amp;title=Scala%20yEnc%20Decoder" title="Design Float"><img src="http://letsgetdugg.com/wp-content/plugins/sociable/images/designfloat.png" title="Design Float" alt="Design Float" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://www.dzone.com/links/add.html?url=http%3A%2F%2Fletsgetdugg.com%2F2010%2F06%2F22%2Fscala-yenc-decoder%2F&amp;title=Scala%20yEnc%20Decoder" title="DZone"><img src="http://letsgetdugg.com/wp-content/plugins/sociable/images/dzone.png" title="DZone" alt="DZone" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://reddit.com/submit?url=http%3A%2F%2Fletsgetdugg.com%2F2010%2F06%2F22%2Fscala-yenc-decoder%2F&amp;title=Scala%20yEnc%20Decoder" title="Reddit"><img src="http://letsgetdugg.com/wp-content/plugins/sociable/images/reddit.png" title="Reddit" alt="Reddit" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://slashdot.org/bookmark.pl?title=Scala%20yEnc%20Decoder&amp;url=http%3A%2F%2Fletsgetdugg.com%2F2010%2F06%2F22%2Fscala-yenc-decoder%2F" title="Slashdot"><img src="http://letsgetdugg.com/wp-content/plugins/sociable/images/slashdot.png" title="Slashdot" alt="Slashdot" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="" title="TwitThis"><img src="http://letsgetdugg.com/wp-content/plugins/sociable/images/" title="TwitThis" alt="TwitThis" class="sociable-hovers" /></a>


<br/><br/>]]></content:encoded>
			<wfw:commentRss>http://letsgetdugg.com/2010/06/22/scala-yenc-decoder/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Automated ZFS Snapshots</title>
		<link>http://letsgetdugg.com/2010/03/30/automated-zfs-snapshots/</link>
		<comments>http://letsgetdugg.com/2010/03/30/automated-zfs-snapshots/#comments</comments>
		<pubDate>Wed, 31 Mar 2010 00:04:33 +0000</pubDate>
		<dc:creator>victori</dc:creator>
				<category><![CDATA[administration]]></category>
		<category><![CDATA[open source]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[zfs]]></category>

		<guid isPermaLink="false">http://letsgetdugg.com/?p=653</guid>
		<description><![CDATA[I needed something like zfs-auto-snapshot written by Tim Foster but portable so it works on all systems that support ZFS. I reviewed a few scripts on github and was unhappy with what was out there so I decided to write my own. With zbackup.rb you can define what to snapshot and how many rotation days [...]]]></description>
			<content:encoded><![CDATA[<p>I needed something like <a href="http://blogs.sun.com/timf/entry/zfs_automatic_snapshots_0_12">zfs-auto-snapshot</a> written by Tim Foster but portable so it works on all systems that support ZFS. I reviewed a few scripts on github and was unhappy with what was out there so I decided to write my own.</p>
<p>With zbackup.rb you can define what to snapshot and how many rotation days you want to go back. </p>
<p>So say you want a month of snapshots:</p>
<div class="codesnip-container" >/usr/bin/zbackup.rb iraidz/zWork 30</div>
<p>Simple, no? <img src='http://letsgetdugg.com/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
<div class="codesnip-container" >
<div class="ruby codesnip" style="font-family:monospace;"><span class="co1">#!/usr/bin/env ruby</span></p>
<p><span class="co1"># Create snapshots for a 7 day rotation.</span><br />
<span class="co1"># ./zbackup.rb iraidz/zWork 7</span><br />
<span class="co1">#</span><br />
<span class="co1"># Add to crontab</span><br />
<span class="co1"># crontab -e</span><br />
<span class="co1"># 0 2 * * * /usr/bin/zbackup.rb iraidz/zWork 7</span></p>
<p>pool = ARGV<span class="br0">&#91;</span>0<span class="br0">&#93;</span><br />
days_back = ARGV<span class="br0">&#91;</span>1<span class="br0">&#93;</span>.<span class="me1">to_i</span></p>
<p><span class="kw1">if</span> pool.<span class="kw2">nil</span>? <span class="kw1">or</span> pool.<span class="me1">empty</span>?<br />
&nbsp; <span class="kw3">puts</span> <span class="st0">&quot;<span class="es0">\n</span>Define the pool you want to snapshot:&quot;</span><br />
&nbsp; <span class="kw3">puts</span> <span class="st0">&quot;<span class="es0">\t</span>ex: zbackup.rb iraidz/zWork 7<span class="es0">\n</span><span class="es0">\n</span>&quot;</span><br />
&nbsp; <span class="kw3">exit</span> 0<br />
<span class="kw1">end</span></p>
<p><span class="kw1">if</span> days_back.<span class="kw2">nil</span>? <span class="kw1">or</span> days_back <span class="sy0">&lt;</span> 1 <br />
&nbsp; <span class="kw3">puts</span> <span class="st0">&quot;<span class="es0">\n</span>Define how many days for your rotation:&quot;</span><br />
&nbsp; <span class="kw3">puts</span> <span class="st0">&quot;<span class="es0">\t</span>ex: zbackup.rb iraidz/zWork 7<span class="es0">\n</span><span class="es0">\n</span>&quot;</span><br />
&nbsp; <span class="kw3">exit</span> 0<br />
<span class="kw1">end</span></p>
<p><span class="co1"># response from zfs list</span><br />
curr_snaps = <span class="st0">`zfs list -t snapshot -o name`</span><br />
<span class="co1"># days back limit variable</span><br />
date_back = <span class="kw4">Time</span>.<span class="me1">now</span> <span class="sy0">-</span> <span class="br0">&#40;</span>86400<span class="sy0">*</span>days_back<span class="br0">&#41;</span></p>
<p>curr_snaps.<span class="kw3">split</span><span class="br0">&#40;</span><span class="sy0">/</span>\n<span class="sy0">/</span><span class="br0">&#41;</span>.<span class="me1">each</span> <span class="kw1">do</span> <span class="sy0">|</span>pline<span class="sy0">|</span><br />
&nbsp; <span class="kw1">if</span> m = pline.<span class="me1">match</span><span class="br0">&#40;</span><span class="sy0">/</span><span class="co1">#{pool}\@([0-9]+)\-([0-9]+)\-([0-9]+)/)</span><br />
&nbsp; &nbsp; <span class="kw1">if</span> date_back <span class="sy0">&gt;</span>= <span class="kw4">Time</span>.<span class="me1">local</span><span class="br0">&#40;</span>m<span class="br0">&#91;</span><span class="nu0">1</span><span class="br0">&#93;</span>,m<span class="br0">&#91;</span><span class="nu0">2</span><span class="br0">&#93;</span>,m<span class="br0">&#91;</span><span class="nu0">3</span><span class="br0">&#93;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; <span class="st0">`zfs destroy #{pline}`</span><br />
&nbsp; &nbsp; <span class="kw1">end</span><br />
&nbsp; <span class="kw1">end</span><br />
<span class="kw1">end</span></p>
<p><span class="co1"># take snapshot for this run if needed.</span><br />
month = <span class="kw4">Time</span>.<span class="me1">now</span>.<span class="me1">month</span><br />
day = <span class="kw4">Time</span>.<span class="me1">now</span>.<span class="me1">day</span><br />
year = <span class="kw4">Time</span>.<span class="me1">now</span>.<span class="me1">year</span><br />
<span class="kw1">if</span> curr_snaps !~ <span class="sy0">/</span><span class="co1">#{pool}\@#{year}\-#{month}\-#{day}/</span><br />
&nbsp; <span class="st0">`zfs snapshot -r #{pool}@#{year}-#{month}-#{day}`</span><br />
<span class="kw1">end</span></div>
</div>



Share and Enjoy:


	<a rel="nofollow"  target="_blank" href="http://digg.com/submit?phase=2&amp;url=http%3A%2F%2Fletsgetdugg.com%2F2010%2F03%2F30%2Fautomated-zfs-snapshots%2F&amp;title=Automated%20ZFS%20Snapshots&amp;bodytext=I%20needed%20something%20like%20zfs-auto-snapshot%20written%20by%20Tim%20Foster%20but%20portable%20so%20it%20works%20on%20all%20systems%20that%20support%20ZFS.%20I%20reviewed%20a%20few%20scripts%20on%20github%20and%20was%20unhappy%20with%20what%20was%20out%20there%20so%20I%20decided%20to%20write%20my%20own.%0A%0AWith%20zbackup.rb%20you%20ca" title="Digg"><img src="http://letsgetdugg.com/wp-content/plugins/sociable/images/digg.png" title="Digg" alt="Digg" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://sphinn.com/index.php?c=post&amp;m=submit&amp;link=http%3A%2F%2Fletsgetdugg.com%2F2010%2F03%2F30%2Fautomated-zfs-snapshots%2F" title="Sphinn"><img src="http://letsgetdugg.com/wp-content/plugins/sociable/images/sphinn.png" title="Sphinn" alt="Sphinn" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://delicious.com/post?url=http%3A%2F%2Fletsgetdugg.com%2F2010%2F03%2F30%2Fautomated-zfs-snapshots%2F&amp;title=Automated%20ZFS%20Snapshots&amp;notes=I%20needed%20something%20like%20zfs-auto-snapshot%20written%20by%20Tim%20Foster%20but%20portable%20so%20it%20works%20on%20all%20systems%20that%20support%20ZFS.%20I%20reviewed%20a%20few%20scripts%20on%20github%20and%20was%20unhappy%20with%20what%20was%20out%20there%20so%20I%20decided%20to%20write%20my%20own.%0A%0AWith%20zbackup.rb%20you%20ca" title="del.icio.us"><img src="http://letsgetdugg.com/wp-content/plugins/sociable/images/delicious.png" title="del.icio.us" alt="del.icio.us" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://www.facebook.com/share.php?u=http%3A%2F%2Fletsgetdugg.com%2F2010%2F03%2F30%2Fautomated-zfs-snapshots%2F&amp;t=Automated%20ZFS%20Snapshots" title="Facebook"><img src="http://letsgetdugg.com/wp-content/plugins/sociable/images/facebook.png" title="Facebook" alt="Facebook" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://www.mixx.com/submit?page_url=http%3A%2F%2Fletsgetdugg.com%2F2010%2F03%2F30%2Fautomated-zfs-snapshots%2F&amp;title=Automated%20ZFS%20Snapshots" title="Mixx"><img src="http://letsgetdugg.com/wp-content/plugins/sociable/images/mixx.png" title="Mixx" alt="Mixx" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://www.google.com/bookmarks/mark?op=edit&amp;bkmk=http%3A%2F%2Fletsgetdugg.com%2F2010%2F03%2F30%2Fautomated-zfs-snapshots%2F&amp;title=Automated%20ZFS%20Snapshots&amp;annotation=I%20needed%20something%20like%20zfs-auto-snapshot%20written%20by%20Tim%20Foster%20but%20portable%20so%20it%20works%20on%20all%20systems%20that%20support%20ZFS.%20I%20reviewed%20a%20few%20scripts%20on%20github%20and%20was%20unhappy%20with%20what%20was%20out%20there%20so%20I%20decided%20to%20write%20my%20own.%0A%0AWith%20zbackup.rb%20you%20ca" title="Google Bookmarks"><img src="http://letsgetdugg.com/wp-content/plugins/sociable/images/googlebookmark.png" title="Google Bookmarks" alt="Google Bookmarks" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://www.designfloat.com/submit.php?url=http%3A%2F%2Fletsgetdugg.com%2F2010%2F03%2F30%2Fautomated-zfs-snapshots%2F&amp;title=Automated%20ZFS%20Snapshots" title="Design Float"><img src="http://letsgetdugg.com/wp-content/plugins/sociable/images/designfloat.png" title="Design Float" alt="Design Float" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://www.dzone.com/links/add.html?url=http%3A%2F%2Fletsgetdugg.com%2F2010%2F03%2F30%2Fautomated-zfs-snapshots%2F&amp;title=Automated%20ZFS%20Snapshots" title="DZone"><img src="http://letsgetdugg.com/wp-content/plugins/sociable/images/dzone.png" title="DZone" alt="DZone" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://reddit.com/submit?url=http%3A%2F%2Fletsgetdugg.com%2F2010%2F03%2F30%2Fautomated-zfs-snapshots%2F&amp;title=Automated%20ZFS%20Snapshots" title="Reddit"><img src="http://letsgetdugg.com/wp-content/plugins/sociable/images/reddit.png" title="Reddit" alt="Reddit" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://slashdot.org/bookmark.pl?title=Automated%20ZFS%20Snapshots&amp;url=http%3A%2F%2Fletsgetdugg.com%2F2010%2F03%2F30%2Fautomated-zfs-snapshots%2F" title="Slashdot"><img src="http://letsgetdugg.com/wp-content/plugins/sociable/images/slashdot.png" title="Slashdot" alt="Slashdot" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="" title="TwitThis"><img src="http://letsgetdugg.com/wp-content/plugins/sociable/images/" title="TwitThis" alt="TwitThis" class="sociable-hovers" /></a>


<br/><br/>]]></content:encoded>
			<wfw:commentRss>http://letsgetdugg.com/2010/03/30/automated-zfs-snapshots/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Clustering Wicket for fun and profit!</title>
		<link>http://letsgetdugg.com/2010/02/07/clustering-wicket-for-fun-and-profit/</link>
		<comments>http://letsgetdugg.com/2010/02/07/clustering-wicket-for-fun-and-profit/#comments</comments>
		<pubDate>Sun, 07 Feb 2010 17:55:09 +0000</pubDate>
		<dc:creator>victori</dc:creator>
				<category><![CDATA[administration]]></category>
		<category><![CDATA[main]]></category>
		<category><![CDATA[open source]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[clustering]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[wicket]]></category>

		<guid isPermaLink="false">http://letsgetdugg.com/?p=615</guid>
		<description><![CDATA[I hate expired sessions, death to all expired sessions. Traditionally a Java servlet container has a fixed session time, a flood of traffic can potentially cause JVM OOM errors if the session time is set too high. I wanted a smart session container that can hold onto sessions for as long as possible and expire [...]]]></description>
			<content:encoded><![CDATA[<p>I hate expired sessions, death to all expired sessions. Traditionally a Java servlet container has a fixed session time, a flood of traffic can potentially cause <a href="http://java.sun.com/j2se/1.4.2/docs/api/java/lang/OutOfMemoryError.html">JVM OOM errors</a> if the session time is set too high. I wanted a smart session container that can hold onto sessions for as long as possible and expire sessions only when it is absolutely necessary; A <a href="http://memcached.org/">Memcached</a> store would be perfect for this. </p>
<p>There for I recently open sourced the <a href="http://github.com/victori/jetty-session-cache">jetty-session-store</a> to solve this problem. With the jetty-session-store you can save your session state to Ehcache, <a href="http://memcached.org/">Memcached</a> or the database. State should not be bound to a single JVM, Viva Shared Session Stores! </p>
<p>So now that jetty-session-store is out in the wild you can technically cluster Wicket using just the <a href="http://wicket.sourceforge.net/apidocs/wicket/protocol/http/HttpSessionStore.html">HttpSessionStore</a>. However, it isn’t very efficient with the way Memcached allocates data in fixed sized cache buckets.</p>
<p>1. Wicket sessions under the HttpSessionStore can get quite large, well over 1Mb in size. A Wicket session not only stores the session state but also the previous serialized pages the user has visited. </p>
<p>2. Serializing and de-serializing a large data structure can get expensive. The HttpSessionStore retains an <a href="http://wicket.apache.org/docs/1.4/org/apache/wicket/AccessStackPageMap.html">AccessStackPageMap</a>, which is a list data structure consisting of multiple <a href="http://cwiki.apache.org/WICKET/page-maps.html">page map revisions</a>. </p>
<p>So instead of saving one large AccessStackPageMap, I wrote a <a href="http://wicket.apache.org/docs/wicket-1.3.2/wicket/apidocs/org/apache/wicket/protocol/http/SecondLevelCacheSessionStore.html">SecondLevelCacheSessionStore</a> that saves a page map revision per cache entry. This leads to much better cache utilization and a whole lot less serialization on the wire. Not to mention this avoids the whole 1Mb Memcached size limit.</p>
<p>Before you go willy nilly with clustering, read the <a href="http://cwiki.apache.org/WICKET/render-strategies.html">Wicket render strategies page</a>. <b>Wicket requires session affinity for buffered responses with the default rendering strategy.</b></p>
<h3>Clustering Wicket has never been easier.</h3>
<p>Here is an example on how to offload page maps to a hybrid EhCache/Memcached cache. Memcached for long term shared storage while EhCache for short-lived fast cache look ups. </p>
<div class="codesnip-container" >
<div class="java codesnip" style="font-family:monospace;"><span class="kw1">public</span> <span class="kw1">class</span> WebApp <span class="kw1">extends</span> WebApplication <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; @Override<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">protected</span> ISessionStore newSessionStore<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// localhost:11211 &#8212; memcached server</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// &quot;fabpagestore&quot; &#8212; unique appender to avoid key clashes.</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// 300 &#8212; 5 minute TTL for local ehcache.</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="kw1">new</span> SecondLevelCacheSessionStore<span class="br0">&#40;</span><span class="kw1">this</span>,<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">new</span> CachePageStore<span class="br0">&#40;</span><a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Aarrays+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">Arrays</span></a>.<span class="me1">asList</span><span class="br0">&#40;</span><span class="st0">&quot;localhost:11211&quot;</span><span class="br0">&#41;</span>,<span class="st0">&quot;fabpagestore&quot;</span>,300<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
<span class="br0">&#125;</span></div>
</div>
<p>Here is an example on how to offload page maps to the database. </p>
<div class="codesnip-container" >
<div class="java codesnip" style="font-family:monospace;"><span class="kw1">public</span> <span class="kw1">class</span> WebApp <span class="kw1">extends</span> WebApplication <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; @Override<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">protected</span> ISessionStore newSessionStore<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// &quot;fabpagestore&quot; &#8212; unique appender to avoid key clashes.</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="kw1">new</span> SecondLevelCacheSessionStore<span class="br0">&#40;</span><span class="kw1">this</span>,<span class="kw1">new</span> CachePageStore<span class="br0">&#40;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">new</span> DBCache<span class="br0">&#40;</span><span class="st0">&quot;jdbc:mysql://foo/mydb&quot;</span>, <span class="st0">&quot;myname&quot;</span>, <span class="st0">&quot;mypass&quot;</span>, <span class="st0">&quot;com.driver.Name&quot;</span>, <span class="st0">&quot;fabpagestore&quot;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
<span class="br0">&#125;</span></div>
</div>
<p>Here is my CachePageStore;</p>
<div class="codesnip-container" >
<div class="java codesnip" style="font-family:monospace;"><span class="kw1">package</span> <span class="co2">com.base.pagestore</span><span class="sy0">;</span></p>
<p><span class="kw1">import</span> <span class="co2">com.base.cache.AsyncMemcache</span><span class="sy0">;</span><br />
<span class="kw1">import</span> <span class="co2">com.base.cache.ICache</span><span class="sy0">;</span><br />
<span class="kw1">import</span> <span class="co2">org.apache.wicket.Page</span><span class="sy0">;</span><br />
<span class="kw1">import</span> <span class="co2">org.apache.wicket.protocol.http.SecondLevelCacheSessionStore.IClusteredPageStore</span><span class="sy0">;</span><br />
<span class="kw1">import</span> <span class="co2">org.apache.wicket.protocol.http.pagestore.AbstractPageStore</span><span class="sy0">;</span><br />
<span class="kw1">import</span> <span class="co2">org.slf4j.Logger</span><span class="sy0">;</span><br />
<span class="kw1">import</span> <span class="co2">org.slf4j.LoggerFactory</span><span class="sy0">;</span></p>
<p><span class="kw1">import</span> <span class="co2">java.util.List</span><span class="sy0">;</span></p>
<p><span class="kw1">public</span> <span class="kw1">class</span> CachePageStore <span class="kw1">extends</span> AbstractPageStore <span class="kw1">implements</span> IClusteredPageStore <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">private</span> ICache cache<span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">private</span> Logger logger <span class="sy0">=</span> LoggerFactory.<span class="me1">getLogger</span><span class="br0">&#40;</span>CachePageStore.<span class="kw1">class</span><span class="br0">&#41;</span><span class="sy0">;</span></p>
<p>&nbsp; &nbsp; <span class="kw1">public</span> CachePageStore<span class="br0">&#40;</span><span class="kw1">final</span> List<span class="sy0">&lt;</span>String<span class="sy0">&gt;</span> servers, <span class="kw1">final</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> poolName, <span class="kw1">final</span> <span class="kw4">int</span> ttl<span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">this</span><span class="br0">&#40;</span>servers, poolName, <span class="kw2">true</span>, ttl<span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; <span class="kw1">public</span> CachePageStore<span class="br0">&#40;</span><span class="kw1">final</span> List<span class="sy0">&lt;</span>String<span class="sy0">&gt;</span> servers, <span class="kw1">final</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> poolName, <span class="kw4">boolean</span> async, <span class="kw1">final</span> <span class="kw4">int</span> ttl<span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">this</span><span class="br0">&#40;</span><span class="kw1">new</span> AsyncMemcache<span class="br0">&#40;</span>servers, poolName, async, ttl<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; <span class="kw1">public</span> CachePageStore<span class="br0">&#40;</span><span class="kw1">final</span> ICache cache<span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">this</span>.<span class="me1">cache</span> <span class="sy0">=</span> cache<span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; <span class="co1">// If pageVersion -1 must return highest page version.</span><br />
&nbsp; &nbsp; <span class="kw1">protected</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> getKey<span class="br0">&#40;</span><span class="kw1">final</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> sessId, <span class="kw1">final</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> pageMapName, <span class="kw1">final</span> <span class="kw4">int</span> pageId, <span class="kw1">final</span> <span class="kw4">int</span> pageVersion<span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">int</span> pageVer <span class="sy0">=</span> <span class="br0">&#40;</span>pageVersion <span class="sy0">==</span> <span class="sy0">-</span>1<span class="br0">&#41;</span> <span class="sy0">?</span> 0 <span class="sy0">:</span> pageVersion<span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span>pageVersion <span class="sy0">==</span> <span class="sy0">-</span>1<span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a><span class="br0">&#91;</span><span class="br0">&#93;</span> meta <span class="sy0">=</span> getMeta<span class="br0">&#40;</span>sessId, pageMapName, pageId<span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; pageVer <span class="sy0">=</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Ainteger+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">Integer</span></a>.<span class="me1">valueOf</span><span class="br0">&#40;</span>meta<span class="br0">&#91;</span>0<span class="br0">&#93;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> sessId <span class="sy0">+</span> <span class="st0">&quot;:&quot;</span> <span class="sy0">+</span> pageMapName <span class="sy0">+</span> <span class="st0">&quot;:&quot;</span> <span class="sy0">+</span> pageId <span class="sy0">+</span> <span class="st0">&quot;:&quot;</span> <span class="sy0">+</span> pageVer<span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; <span class="co1">// If pageVersion -1 must return highest page version.</span><br />
&nbsp; &nbsp; <span class="co1">// If ajaxVersion -1 must return highest version.</span><br />
&nbsp; &nbsp; <span class="kw1">public</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> getKey<span class="br0">&#40;</span><span class="kw1">final</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> sessId, <span class="kw1">final</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> pageMapName, <span class="kw1">final</span> <span class="kw4">int</span> pageId, <span class="kw1">final</span> <span class="kw4">int</span> pageVersion, <span class="kw1">final</span> <span class="kw4">int</span> ajaxVersion<span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// Default it to 0 initially</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">int</span> ajaxVer <span class="sy0">=</span> <span class="br0">&#40;</span>ajaxVersion <span class="sy0">==</span> <span class="sy0">-</span>1<span class="br0">&#41;</span> <span class="sy0">?</span> 0 <span class="sy0">:</span> ajaxVersion<span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">int</span> pageVer <span class="sy0">=</span> <span class="br0">&#40;</span>pageVersion <span class="sy0">==</span> <span class="sy0">-</span>1<span class="br0">&#41;</span> <span class="sy0">?</span> 0 <span class="sy0">:</span> pageVersion<span class="sy0">;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span>pageVersion <span class="sy0">==</span> <span class="sy0">-</span>1 <span class="sy0">||</span> ajaxVersion <span class="sy0">==</span> <span class="sy0">-</span>1<span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a><span class="br0">&#91;</span><span class="br0">&#93;</span> meta <span class="sy0">=</span> getMeta<span class="br0">&#40;</span>sessId, pageMapName, pageId<span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span>pageVersion <span class="sy0">==</span> <span class="sy0">-</span>1<span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; pageVer <span class="sy0">=</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Ainteger+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">Integer</span></a>.<span class="me1">valueOf</span><span class="br0">&#40;</span>meta<span class="br0">&#91;</span>0<span class="br0">&#93;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span>ajaxVersion <span class="sy0">==</span> <span class="sy0">-</span>1<span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ajaxVer <span class="sy0">=</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Ainteger+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">Integer</span></a>.<span class="me1">valueOf</span><span class="br0">&#40;</span>meta<span class="br0">&#91;</span>1<span class="br0">&#93;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> sessId <span class="sy0">+</span> <span class="st0">&quot;:&quot;</span> <span class="sy0">+</span> pageMapName <span class="sy0">+</span> <span class="st0">&quot;:&quot;</span> <span class="sy0">+</span> pageId <span class="sy0">+</span> <span class="st0">&quot;:&quot;</span> <span class="sy0">+</span> pageVer <span class="sy0">+</span> <span class="st0">&quot;:&quot;</span> <span class="sy0">+</span> ajaxVer<span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; <span class="kw1">protected</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> storeKey<span class="br0">&#40;</span><span class="kw1">final</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> sessionId, <span class="kw1">final</span> Page page<span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> sessionId <span class="sy0">+</span> <span class="st0">&quot;:&quot;</span> <span class="sy0">+</span> page.<span class="me1">getPageMapName</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="sy0">+</span> <span class="st0">&quot;:&quot;</span> <span class="sy0">+</span> page.<span class="me1">getId</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="sy0">+</span> <span class="st0">&quot;:&quot;</span> <span class="sy0">+</span> page.<span class="me1">getCurrentVersionNumber</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="sy0">+</span> <span class="st0">&quot;:&quot;</span> <span class="sy0">+</span> page.<span class="me1">getAjaxVersionNumber</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; <span class="kw1">protected</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> getBaseKey<span class="br0">&#40;</span><a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> sessionId, Page page<span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> sessionId <span class="sy0">+</span> <span class="st0">&quot;:&quot;</span> <span class="sy0">+</span> page.<span class="me1">getPageMapName</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="sy0">+</span> <span class="st0">&quot;:&quot;</span> <span class="sy0">+</span> page.<span class="me1">getId</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; <span class="kw1">protected</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> getMetaKey<span class="br0">&#40;</span><a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> sessionId, <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> pageMap, <span class="kw4">int</span> id<span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> getBaseKey<span class="br0">&#40;</span>sessionId,pageMap,id<span class="br0">&#41;</span><span class="sy0">+</span><span class="st0">&quot;_meta&quot;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; <span class="kw1">protected</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> getMetaKey<span class="br0">&#40;</span><a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> sessionId, Page page<span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> getBaseKey<span class="br0">&#40;</span>sessionId,page<span class="br0">&#41;</span><span class="sy0">+</span><span class="st0">&quot;_meta&quot;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; <span class="kw1">protected</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> getBaseKey<span class="br0">&#40;</span><a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> sessionId, <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> pageMap, <span class="kw4">int</span> id<span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span>id <span class="sy0">==</span> <span class="sy0">-</span>1<span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> sessionId <span class="sy0">+</span> <span class="st0">&quot;:&quot;</span> <span class="sy0">+</span> pageMap<span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span> <span class="kw1">else</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> sessionId <span class="sy0">+</span> <span class="st0">&quot;:&quot;</span> <span class="sy0">+</span> pageMap <span class="sy0">+</span> <span class="st0">&quot;:&quot;</span> <span class="sy0">+</span> id<span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; <span class="kw1">public</span> <span class="kw4">boolean</span> containsPage<span class="br0">&#40;</span><span class="kw1">final</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> sessionId, <span class="kw1">final</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> pageMapName, <span class="kw1">final</span> <span class="kw4">int</span> pageId, <span class="kw1">final</span> <span class="kw4">int</span> pageVersion<span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> key <span class="sy0">=</span> getKey<span class="br0">&#40;</span>sessionId, pageMapName, pageId, pageVersion, <span class="sy0">-</span>1<span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>logger.<span class="me1">isDebugEnabled</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; logger.<span class="me1">debug</span><span class="br0">&#40;</span><span class="st0">&quot;CheckExists: &quot;</span> <span class="sy0">+</span> key<span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> cache.<span class="me1">keyExists</span><span class="br0">&#40;</span>key<span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; <span class="kw1">public</span> <span class="kw4">void</span> destroy<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; <span class="kw1">public</span> <span class="sy0">&lt;</span>T<span class="sy0">&gt;</span> Page getPage<span class="br0">&#40;</span><span class="kw1">final</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> sessionId, <span class="kw1">final</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> pagemap, <span class="kw1">final</span> <span class="kw4">int</span> id, <span class="kw1">final</span> <span class="kw4">int</span> versionNumber, <span class="kw1">final</span> <span class="kw4">int</span> ajaxVersionNumber<span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> key <span class="sy0">=</span> getKey<span class="br0">&#40;</span>sessionId, pagemap, id, versionNumber, ajaxVersionNumber<span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>logger.<span class="me1">isDebugEnabled</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; logger.<span class="me1">debug</span><span class="br0">&#40;</span><span class="st0">&quot;GetPage: &quot;</span> <span class="sy0">+</span> key<span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="br0">&#40;</span>Page<span class="br0">&#41;</span> cache.<span class="me1">get</span><span class="br0">&#40;</span>key<span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; <span class="kw1">public</span> <span class="kw4">void</span> pageAccessed<span class="br0">&#40;</span><span class="kw1">final</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> sessionId, <span class="kw1">final</span> Page page<span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; <span class="co1">// If ID == -1 remove the entire pagemap; getBaseKey() takes care of this.</span><br />
&nbsp; &nbsp; <span class="kw1">public</span> <span class="kw4">void</span> removePage<span class="br0">&#40;</span><span class="kw1">final</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> sessionId, <span class="kw1">final</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> pagemap, <span class="kw1">final</span> <span class="kw4">int</span> id<span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> key <span class="sy0">=</span> getBaseKey<span class="br0">&#40;</span>sessionId, pagemap, id<span class="br0">&#41;</span><span class="sy0">;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>logger.<span class="me1">isDebugEnabled</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; logger.<span class="me1">debug</span><span class="br0">&#40;</span><span class="st0">&quot;RemovePage: &quot;</span> <span class="sy0">+</span> key<span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; cache.<span class="me1">remove</span><span class="br0">&#40;</span>getMetaKey<span class="br0">&#40;</span>sessionId, pagemap, id<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">for</span> <span class="br0">&#40;</span><a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> k <span class="sy0">:</span> cache.<span class="me1">getKeys</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>k.<span class="me1">startsWith</span><span class="br0">&#40;</span>key<span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; cache.<span class="me1">remove</span><span class="br0">&#40;</span>k<span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; <span class="kw1">protected</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a><span class="br0">&#91;</span><span class="br0">&#93;</span> getMeta<span class="br0">&#40;</span><span class="kw1">final</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> sessionId, <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> pageMap, <span class="kw4">int</span> pageId<span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> metaKey <span class="sy0">=</span> getMetaKey<span class="br0">&#40;</span>sessionId,pageMap,pageId<span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Aobject+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">Object</span></a> ret <span class="sy0">=</span> cache.<span class="me1">get</span><span class="br0">&#40;</span>metaKey<span class="br0">&#41;</span><span class="sy0">;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>logger.<span class="me1">isDebugEnabled</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; logger.<span class="me1">debug</span><span class="br0">&#40;</span><span class="st0">&quot;GetMeta: &quot;</span> <span class="sy0">+</span> metaKey<span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span>ret <span class="sy0">==</span> <span class="kw2">null</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="kw1">new</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a><span class="br0">&#91;</span><span class="br0">&#93;</span> <span class="br0">&#123;</span><span class="st0">&quot;0&quot;</span>,<span class="st0">&quot;0&quot;</span><span class="br0">&#125;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span> <span class="kw1">else</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a>.<span class="me1">valueOf</span><span class="br0">&#40;</span>ret<span class="br0">&#41;</span>.<span class="me1">split</span><span class="br0">&#40;</span><span class="st0">&quot;:&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; <span class="kw1">protected</span> <span class="kw4">void</span> storeMeta<span class="br0">&#40;</span><span class="kw1">final</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> sessionId, <span class="kw1">final</span> Page page<span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> metaKey <span class="sy0">=</span> getMetaKey<span class="br0">&#40;</span>sessionId, page<span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Aobject+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">Object</span></a> ret <span class="sy0">=</span> cache.<span class="me1">get</span><span class="br0">&#40;</span>metaKey<span class="br0">&#41;</span><span class="sy0">;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>logger.<span class="me1">isDebugEnabled</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; logger.<span class="me1">debug</span><span class="br0">&#40;</span><span class="st0">&quot;StoreMeta: &quot;</span> <span class="sy0">+</span> metaKey<span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span>ret <span class="sy0">==</span> <span class="kw2">null</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; cache.<span class="me1">put</span><span class="br0">&#40;</span>metaKey,page.<span class="me1">getCurrentVersionNumber</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">+</span><span class="st0">&quot;:&quot;</span><span class="sy0">+</span>page.<span class="me1">getAjaxVersionNumber</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span> <span class="kw1">else</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a><span class="br0">&#91;</span><span class="br0">&#93;</span> vals <span class="sy0">=</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a>.<span class="me1">valueOf</span><span class="br0">&#40;</span>ret<span class="br0">&#41;</span>.<span class="me1">split</span><span class="br0">&#40;</span><span class="st0">&quot;:&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">int</span> currPage <span class="sy0">=</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Ainteger+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">Integer</span></a>.<span class="me1">valueOf</span><span class="br0">&#40;</span>vals<span class="br0">&#91;</span>0<span class="br0">&#93;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">int</span> currAjax <span class="sy0">=</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Ainteger+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">Integer</span></a>.<span class="me1">valueOf</span><span class="br0">&#40;</span>vals<span class="br0">&#91;</span>1<span class="br0">&#93;</span><span class="br0">&#41;</span><span class="sy0">;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span>page.<span class="me1">getCurrentVersionNumber</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="sy0">&gt;</span> currPage<span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; currPage <span class="sy0">=</span> page.<span class="me1">getCurrentVersionNumber</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span>page.<span class="me1">getAjaxVersionNumber</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="sy0">&gt;</span> currAjax<span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; currAjax <span class="sy0">=</span> page.<span class="me1">getAjaxVersionNumber</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; cache.<span class="me1">put</span><span class="br0">&#40;</span>metaKey,currPage<span class="sy0">+</span><span class="st0">&quot;:&quot;</span><span class="sy0">+</span>currAjax<span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; <span class="kw1">public</span> <span class="kw4">void</span> storePage<span class="br0">&#40;</span><span class="kw1">final</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> sessionId, <span class="kw1">final</span> Page page<span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> sKey <span class="sy0">=</span> storeKey<span class="br0">&#40;</span>sessionId, page<span class="br0">&#41;</span><span class="sy0">;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>logger.<span class="me1">isDebugEnabled</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; logger.<span class="me1">debug</span><span class="br0">&#40;</span><span class="st0">&quot;StorePage: &quot;</span> <span class="sy0">+</span> sKey<span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; cache.<span class="me1">put</span><span class="br0">&#40;</span>sKey, page<span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; storeMeta<span class="br0">&#40;</span>sessionId,page<span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; <span class="kw1">public</span> <span class="kw4">void</span> unbind<span class="br0">&#40;</span><span class="kw1">final</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> sessionId<span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>logger.<span class="me1">isDebugEnabled</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; logger.<span class="me1">debug</span><span class="br0">&#40;</span><span class="st0">&quot;Unbind: &quot;</span> <span class="sy0">+</span> sessionId<span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">for</span> <span class="br0">&#40;</span><a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> key <span class="sy0">:</span> cache.<span class="me1">getKeys</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>key.<span class="me1">startsWith</span><span class="br0">&#40;</span>sessionId<span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; cache.<span class="me1">remove</span><span class="br0">&#40;</span>key<span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p><span class="br0">&#125;</span></div>
</div>



Share and Enjoy:


	<a rel="nofollow"  target="_blank" href="http://digg.com/submit?phase=2&amp;url=http%3A%2F%2Fletsgetdugg.com%2F2010%2F02%2F07%2Fclustering-wicket-for-fun-and-profit%2F&amp;title=Clustering%20Wicket%20for%20fun%20and%20profit%21&amp;bodytext=I%20hate%20expired%20sessions%2C%20death%20to%20all%20expired%20sessions.%20Traditionally%20a%20Java%20servlet%20container%20has%20a%20fixed%20session%20time%2C%20a%20flood%20of%20traffic%20can%20potentially%20cause%20JVM%20OOM%20errors%20if%20the%20session%20time%20is%20set%20too%20high.%20I%20wanted%20a%20smart%20session%20container%20t" title="Digg"><img src="http://letsgetdugg.com/wp-content/plugins/sociable/images/digg.png" title="Digg" alt="Digg" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://sphinn.com/index.php?c=post&amp;m=submit&amp;link=http%3A%2F%2Fletsgetdugg.com%2F2010%2F02%2F07%2Fclustering-wicket-for-fun-and-profit%2F" title="Sphinn"><img src="http://letsgetdugg.com/wp-content/plugins/sociable/images/sphinn.png" title="Sphinn" alt="Sphinn" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://delicious.com/post?url=http%3A%2F%2Fletsgetdugg.com%2F2010%2F02%2F07%2Fclustering-wicket-for-fun-and-profit%2F&amp;title=Clustering%20Wicket%20for%20fun%20and%20profit%21&amp;notes=I%20hate%20expired%20sessions%2C%20death%20to%20all%20expired%20sessions.%20Traditionally%20a%20Java%20servlet%20container%20has%20a%20fixed%20session%20time%2C%20a%20flood%20of%20traffic%20can%20potentially%20cause%20JVM%20OOM%20errors%20if%20the%20session%20time%20is%20set%20too%20high.%20I%20wanted%20a%20smart%20session%20container%20t" title="del.icio.us"><img src="http://letsgetdugg.com/wp-content/plugins/sociable/images/delicious.png" title="del.icio.us" alt="del.icio.us" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://www.facebook.com/share.php?u=http%3A%2F%2Fletsgetdugg.com%2F2010%2F02%2F07%2Fclustering-wicket-for-fun-and-profit%2F&amp;t=Clustering%20Wicket%20for%20fun%20and%20profit%21" title="Facebook"><img src="http://letsgetdugg.com/wp-content/plugins/sociable/images/facebook.png" title="Facebook" alt="Facebook" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://www.mixx.com/submit?page_url=http%3A%2F%2Fletsgetdugg.com%2F2010%2F02%2F07%2Fclustering-wicket-for-fun-and-profit%2F&amp;title=Clustering%20Wicket%20for%20fun%20and%20profit%21" title="Mixx"><img src="http://letsgetdugg.com/wp-content/plugins/sociable/images/mixx.png" title="Mixx" alt="Mixx" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://www.google.com/bookmarks/mark?op=edit&amp;bkmk=http%3A%2F%2Fletsgetdugg.com%2F2010%2F02%2F07%2Fclustering-wicket-for-fun-and-profit%2F&amp;title=Clustering%20Wicket%20for%20fun%20and%20profit%21&amp;annotation=I%20hate%20expired%20sessions%2C%20death%20to%20all%20expired%20sessions.%20Traditionally%20a%20Java%20servlet%20container%20has%20a%20fixed%20session%20time%2C%20a%20flood%20of%20traffic%20can%20potentially%20cause%20JVM%20OOM%20errors%20if%20the%20session%20time%20is%20set%20too%20high.%20I%20wanted%20a%20smart%20session%20container%20t" title="Google Bookmarks"><img src="http://letsgetdugg.com/wp-content/plugins/sociable/images/googlebookmark.png" title="Google Bookmarks" alt="Google Bookmarks" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://www.designfloat.com/submit.php?url=http%3A%2F%2Fletsgetdugg.com%2F2010%2F02%2F07%2Fclustering-wicket-for-fun-and-profit%2F&amp;title=Clustering%20Wicket%20for%20fun%20and%20profit%21" title="Design Float"><img src="http://letsgetdugg.com/wp-content/plugins/sociable/images/designfloat.png" title="Design Float" alt="Design Float" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://www.dzone.com/links/add.html?url=http%3A%2F%2Fletsgetdugg.com%2F2010%2F02%2F07%2Fclustering-wicket-for-fun-and-profit%2F&amp;title=Clustering%20Wicket%20for%20fun%20and%20profit%21" title="DZone"><img src="http://letsgetdugg.com/wp-content/plugins/sociable/images/dzone.png" title="DZone" alt="DZone" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://reddit.com/submit?url=http%3A%2F%2Fletsgetdugg.com%2F2010%2F02%2F07%2Fclustering-wicket-for-fun-and-profit%2F&amp;title=Clustering%20Wicket%20for%20fun%20and%20profit%21" title="Reddit"><img src="http://letsgetdugg.com/wp-content/plugins/sociable/images/reddit.png" title="Reddit" alt="Reddit" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://slashdot.org/bookmark.pl?title=Clustering%20Wicket%20for%20fun%20and%20profit%21&amp;url=http%3A%2F%2Fletsgetdugg.com%2F2010%2F02%2F07%2Fclustering-wicket-for-fun-and-profit%2F" title="Slashdot"><img src="http://letsgetdugg.com/wp-content/plugins/sociable/images/slashdot.png" title="Slashdot" alt="Slashdot" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="" title="TwitThis"><img src="http://letsgetdugg.com/wp-content/plugins/sociable/images/" title="TwitThis" alt="TwitThis" class="sociable-hovers" /></a>


<br/><br/>]]></content:encoded>
			<wfw:commentRss>http://letsgetdugg.com/2010/02/07/clustering-wicket-for-fun-and-profit/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>HAProxy 1.4dev6 broken on Solaris</title>
		<link>http://letsgetdugg.com/2010/01/20/haproxy-broken-on-solaris/</link>
		<comments>http://letsgetdugg.com/2010/01/20/haproxy-broken-on-solaris/#comments</comments>
		<pubDate>Wed, 20 Jan 2010 19:45:16 +0000</pubDate>
		<dc:creator>victori</dc:creator>
				<category><![CDATA[administration]]></category>
		<category><![CDATA[open source]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[bugs]]></category>
		<category><![CDATA[solaris]]></category>

		<guid isPermaLink="false">http://letsgetdugg.com/?p=567</guid>
		<description><![CDATA[Update: I feel like a jackass now, I thought I was running this against the stable haproxy build, but in reality this was against haproxy-1.4dev6. DOH! Well on the bright-side, I am helping out the author fix a potentially critical bug. Here is the truss and tcp dump if anyone cares. Well yet another Solaris [...]]]></description>
			<content:encoded><![CDATA[<p><b>Update:</b> I feel like a jackass now, I thought I was running this against the stable haproxy build, but in reality this was against haproxy-1.4dev6. DOH! Well on the bright-side, I am helping out the author fix a potentially critical bug. Here is the <a href="http://temp.fabulously40.com/~victori/haproxydebug.tbz2">truss and tcp dump</a> if anyone cares. </p>
<p>Well yet another Solaris specific bug/issue to report. HAProxy resets long running connections. Meaning users on slow bandwidth connections are affected by this. I have sent tcpdumps and logs to the author of HAProxy, hopefully this bug/issue would be resolved. I am writing this as a precautionary warning to other Solaris admins out there. </p>
<p>Here the way to trigger this, see if your service is affected by this.</p>
<div class="codesnip-container" >wget  &#8211;limit-rate=2k http://somesite.com/onebigfile.txt</div>
<p>Result:</p>
<div class="codesnip-container" >syris:~ victori$ wget  &#8211;limit-rate=20k http://somesite.com/onebigfile.txt<br />
&#8211;2010-01-20 11:19:29&#8211;  http://somesite.com/onebigfile.txt<br />
Resolving somesite.com (somesite.com)&#8230; 72.11.142.91<br />
Connecting to somesite.com (somesite.com)|72.11.142.91|:84&#8230; connected.<br />
HTTP request sent, awaiting response&#8230; 200 OK<br />
Length: 3806025 (3.6M)<br />
Saving to: “onebigfile.txt”</p>
<p> 7% [====>                                                                            ] 269,008     20.1K/s   in 13s     </p>
<p>2010-01-20 11:19:42 (20.1 KB/s) &#8211; Read error at byte 269008/3806025 (Connection reset by peer). Retrying.</p>
<p>&#8211;2010-01-20 11:19:43&#8211;  (try: 2)  http://somesite.com/onebigfile.txt<br />
Connecting to somesite.com (somesite.com)|72.11.142.91|:84&#8230; connected.<br />
HTTP request sent, awaiting response&#8230; 200 OK<br />
Length: 3806025 (3.6M)<br />
Saving to: “onebigfile.txt”</p>
<p> 4% [==>                                                                              ] 186,016     20.0K/s  eta</p></div>
<p>/Raging, why are there so many Solaris TCP issues? First Varnish? now HAProxy? ARGHHHHH!@#!@</p>



Share and Enjoy:


	<a rel="nofollow"  target="_blank" href="http://digg.com/submit?phase=2&amp;url=http%3A%2F%2Fletsgetdugg.com%2F2010%2F01%2F20%2Fhaproxy-broken-on-solaris%2F&amp;title=HAProxy%201.4dev6%20broken%20on%20Solaris&amp;bodytext=Update%3A%20I%20feel%20like%20a%20jackass%20now%2C%20I%20thought%20I%20was%20running%20this%20against%20the%20stable%20haproxy%20build%2C%20but%20in%20reality%20this%20was%20against%20haproxy-1.4dev6.%20DOH%21%20Well%20on%20the%20bright-side%2C%20I%20am%20helping%20out%20the%20author%20fix%20a%20potentially%20critical%20bug.%20Here%20is%20the%20t" title="Digg"><img src="http://letsgetdugg.com/wp-content/plugins/sociable/images/digg.png" title="Digg" alt="Digg" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://sphinn.com/index.php?c=post&amp;m=submit&amp;link=http%3A%2F%2Fletsgetdugg.com%2F2010%2F01%2F20%2Fhaproxy-broken-on-solaris%2F" title="Sphinn"><img src="http://letsgetdugg.com/wp-content/plugins/sociable/images/sphinn.png" title="Sphinn" alt="Sphinn" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://delicious.com/post?url=http%3A%2F%2Fletsgetdugg.com%2F2010%2F01%2F20%2Fhaproxy-broken-on-solaris%2F&amp;title=HAProxy%201.4dev6%20broken%20on%20Solaris&amp;notes=Update%3A%20I%20feel%20like%20a%20jackass%20now%2C%20I%20thought%20I%20was%20running%20this%20against%20the%20stable%20haproxy%20build%2C%20but%20in%20reality%20this%20was%20against%20haproxy-1.4dev6.%20DOH%21%20Well%20on%20the%20bright-side%2C%20I%20am%20helping%20out%20the%20author%20fix%20a%20potentially%20critical%20bug.%20Here%20is%20the%20t" title="del.icio.us"><img src="http://letsgetdugg.com/wp-content/plugins/sociable/images/delicious.png" title="del.icio.us" alt="del.icio.us" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://www.facebook.com/share.php?u=http%3A%2F%2Fletsgetdugg.com%2F2010%2F01%2F20%2Fhaproxy-broken-on-solaris%2F&amp;t=HAProxy%201.4dev6%20broken%20on%20Solaris" title="Facebook"><img src="http://letsgetdugg.com/wp-content/plugins/sociable/images/facebook.png" title="Facebook" alt="Facebook" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://www.mixx.com/submit?page_url=http%3A%2F%2Fletsgetdugg.com%2F2010%2F01%2F20%2Fhaproxy-broken-on-solaris%2F&amp;title=HAProxy%201.4dev6%20broken%20on%20Solaris" title="Mixx"><img src="http://letsgetdugg.com/wp-content/plugins/sociable/images/mixx.png" title="Mixx" alt="Mixx" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://www.google.com/bookmarks/mark?op=edit&amp;bkmk=http%3A%2F%2Fletsgetdugg.com%2F2010%2F01%2F20%2Fhaproxy-broken-on-solaris%2F&amp;title=HAProxy%201.4dev6%20broken%20on%20Solaris&amp;annotation=Update%3A%20I%20feel%20like%20a%20jackass%20now%2C%20I%20thought%20I%20was%20running%20this%20against%20the%20stable%20haproxy%20build%2C%20but%20in%20reality%20this%20was%20against%20haproxy-1.4dev6.%20DOH%21%20Well%20on%20the%20bright-side%2C%20I%20am%20helping%20out%20the%20author%20fix%20a%20potentially%20critical%20bug.%20Here%20is%20the%20t" title="Google Bookmarks"><img src="http://letsgetdugg.com/wp-content/plugins/sociable/images/googlebookmark.png" title="Google Bookmarks" alt="Google Bookmarks" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://www.designfloat.com/submit.php?url=http%3A%2F%2Fletsgetdugg.com%2F2010%2F01%2F20%2Fhaproxy-broken-on-solaris%2F&amp;title=HAProxy%201.4dev6%20broken%20on%20Solaris" title="Design Float"><img src="http://letsgetdugg.com/wp-content/plugins/sociable/images/designfloat.png" title="Design Float" alt="Design Float" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://www.dzone.com/links/add.html?url=http%3A%2F%2Fletsgetdugg.com%2F2010%2F01%2F20%2Fhaproxy-broken-on-solaris%2F&amp;title=HAProxy%201.4dev6%20broken%20on%20Solaris" title="DZone"><img src="http://letsgetdugg.com/wp-content/plugins/sociable/images/dzone.png" title="DZone" alt="DZone" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://reddit.com/submit?url=http%3A%2F%2Fletsgetdugg.com%2F2010%2F01%2F20%2Fhaproxy-broken-on-solaris%2F&amp;title=HAProxy%201.4dev6%20broken%20on%20Solaris" title="Reddit"><img src="http://letsgetdugg.com/wp-content/plugins/sociable/images/reddit.png" title="Reddit" alt="Reddit" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://slashdot.org/bookmark.pl?title=HAProxy%201.4dev6%20broken%20on%20Solaris&amp;url=http%3A%2F%2Fletsgetdugg.com%2F2010%2F01%2F20%2Fhaproxy-broken-on-solaris%2F" title="Slashdot"><img src="http://letsgetdugg.com/wp-content/plugins/sociable/images/slashdot.png" title="Slashdot" alt="Slashdot" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="" title="TwitThis"><img src="http://letsgetdugg.com/wp-content/plugins/sociable/images/" title="TwitThis" alt="TwitThis" class="sociable-hovers" /></a>


<br/><br/>]]></content:encoded>
			<wfw:commentRss>http://letsgetdugg.com/2010/01/20/haproxy-broken-on-solaris/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Relax, Satan is on your side.</title>
		<link>http://letsgetdugg.com/2010/01/05/relax-satan-is-on-your-side/</link>
		<comments>http://letsgetdugg.com/2010/01/05/relax-satan-is-on-your-side/#comments</comments>
		<pubDate>Tue, 05 Jan 2010 22:17:20 +0000</pubDate>
		<dc:creator>victori</dc:creator>
				<category><![CDATA[administration]]></category>
		<category><![CDATA[main]]></category>
		<category><![CDATA[open source]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[satan]]></category>

		<guid isPermaLink="false">http://letsgetdugg.com/?p=540</guid>
		<description><![CDATA[I just pushed up a new version of Satan to GitHub. For the uniformed uninformed Satan is my process reaper for run away unix processes. Satan was designed to work with Solaris&#8217; SMF self-healing properties. Basically, Satan kills while SMF revives. The new version that was pushed up contains HTTP health checks, so Satan now [...]]]></description>
			<content:encoded><![CDATA[<p>I just pushed up a new version of <a href="http://github.com/victori/satan">Satan to GitHub</a>. For the <s>uniformed</s> uninformed Satan is my process reaper for run away unix processes. Satan was designed to work with Solaris&#8217; <a href="http://www.sun.com/bigadmin/features/articles/smf_example.jsp">SMF self-healing properties</a>. Basically, Satan kills while SMF revives. The new version that was pushed up contains HTTP health checks, so Satan now has the ability to kill processes that are not responding back with a HTTP/200 response code. </p>
<p>The motivation behind HTTP health checks was because once a month or so at <a href="http://fabulously40.com/">Fabulously40</a> our <a href="http://activemq.apache.org/">ActiveMQ</a> would break down while still accepting connections, the only way to figure out if it was <em>zombified</em> was to check the HTTP administrator interface. If the ActiveMQ instance was actually knelled over, the administrator interface would come back with a HTTP/500 response code, hence the birth of HTTP health checks. </p>
<p>Here is our Satan configuration file that we use at Fabulously40. </p>
<p>The &#8220;args&#8221; property might be a bit confusing, it is a snippet of text that Satan looks for in the arguments passed to your application to identify the running process. So for example, if you start your ActiveMQ instance with the following arguments; &#8220;java -jar activemq.jar -Dactivemq=8161 -XXXXX&#8221; Placing &#8220;8161&#8243; in args property would be a good unique identifier for Satan to pick up on.</p>
<pre>
<div class="codesnip-container" >Satan.watch do |s|
  s.name = "jvm instances"                # name of job
  s.user = "webservd"                     # under what user
  s.group = "webservd"                    # under what group
  s.deamon = "java"                       # deamon binary name to grep for
  s.args = nil                            # globally look for specific arguments, optional
  s.debug = true                          # if to write out debug information
  s.safe_mode = false                     # If in safe mode, satan will not kill ;-(
  s.interval = 10.seconds                 # interval to run at to collect statistics
  s.sleep_after_kill = 1.minute           # sleep after killing, satan is tired!
  s.contact = "victori@fabulously40.com"  # admin contact, optional if you want email alerts

  s.kill_if do |process|
    process.condition(:cpu) do |cpu|      # on cpu condition
      cpu.name  = "50% CPU limit"         # name for job
      cpu.args  = "jetty"                 # make sure this is a jetty process, optional
      cpu.above = 48.percent              # if above certain percentage
      cpu.times = 5                       # how many times we can hit this condition before killing
    end

    process.condition(:memory) do |memory|  # on memory condition
      memory.name  = "850MB limit"          # name for job
      memory.args  = "jetty"                # make sure this is a jetty process, optional
      memory.above = 850.megabytes          # limit for memory use
      memory.times = 5                      # how many times we can hit this condition before killing
    end

    # ActiveMQ tends to die on us under heavy load so we need the power of satan!
    process.condition(:http) do |http|                        # on http condition
      http.name   = "HTTP ActiveMQ Check"                     # name for job
      http.args   = "8161"                                    # look for specific app arguments
                                                              # to associate app to URI
      http.uri    = "http://localhost:8161/admin/queues.jsp"  # the URI
      http.times  = 5                                         # how many times before kill
    end
  end
end</div>
</pre>



Share and Enjoy:


	<a rel="nofollow"  target="_blank" href="http://digg.com/submit?phase=2&amp;url=http%3A%2F%2Fletsgetdugg.com%2F2010%2F01%2F05%2Frelax-satan-is-on-your-side%2F&amp;title=Relax%2C%20Satan%20is%20on%20your%20side.&amp;bodytext=I%20just%20pushed%20up%20a%20new%20version%20of%20Satan%20to%20GitHub.%20For%20the%20uniformed%20uninformed%20Satan%20is%20my%20process%20reaper%20for%20run%20away%20unix%20processes.%20Satan%20was%20designed%20to%20work%20with%20Solaris%27%20SMF%20self-healing%20properties.%20Basically%2C%20Satan%20kills%20while%20SMF%20revives.%20Th" title="Digg"><img src="http://letsgetdugg.com/wp-content/plugins/sociable/images/digg.png" title="Digg" alt="Digg" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://sphinn.com/index.php?c=post&amp;m=submit&amp;link=http%3A%2F%2Fletsgetdugg.com%2F2010%2F01%2F05%2Frelax-satan-is-on-your-side%2F" title="Sphinn"><img src="http://letsgetdugg.com/wp-content/plugins/sociable/images/sphinn.png" title="Sphinn" alt="Sphinn" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://delicious.com/post?url=http%3A%2F%2Fletsgetdugg.com%2F2010%2F01%2F05%2Frelax-satan-is-on-your-side%2F&amp;title=Relax%2C%20Satan%20is%20on%20your%20side.&amp;notes=I%20just%20pushed%20up%20a%20new%20version%20of%20Satan%20to%20GitHub.%20For%20the%20uniformed%20uninformed%20Satan%20is%20my%20process%20reaper%20for%20run%20away%20unix%20processes.%20Satan%20was%20designed%20to%20work%20with%20Solaris%27%20SMF%20self-healing%20properties.%20Basically%2C%20Satan%20kills%20while%20SMF%20revives.%20Th" title="del.icio.us"><img src="http://letsgetdugg.com/wp-content/plugins/sociable/images/delicious.png" title="del.icio.us" alt="del.icio.us" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://www.facebook.com/share.php?u=http%3A%2F%2Fletsgetdugg.com%2F2010%2F01%2F05%2Frelax-satan-is-on-your-side%2F&amp;t=Relax%2C%20Satan%20is%20on%20your%20side." title="Facebook"><img src="http://letsgetdugg.com/wp-content/plugins/sociable/images/facebook.png" title="Facebook" alt="Facebook" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://www.mixx.com/submit?page_url=http%3A%2F%2Fletsgetdugg.com%2F2010%2F01%2F05%2Frelax-satan-is-on-your-side%2F&amp;title=Relax%2C%20Satan%20is%20on%20your%20side." title="Mixx"><img src="http://letsgetdugg.com/wp-content/plugins/sociable/images/mixx.png" title="Mixx" alt="Mixx" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://www.google.com/bookmarks/mark?op=edit&amp;bkmk=http%3A%2F%2Fletsgetdugg.com%2F2010%2F01%2F05%2Frelax-satan-is-on-your-side%2F&amp;title=Relax%2C%20Satan%20is%20on%20your%20side.&amp;annotation=I%20just%20pushed%20up%20a%20new%20version%20of%20Satan%20to%20GitHub.%20For%20the%20uniformed%20uninformed%20Satan%20is%20my%20process%20reaper%20for%20run%20away%20unix%20processes.%20Satan%20was%20designed%20to%20work%20with%20Solaris%27%20SMF%20self-healing%20properties.%20Basically%2C%20Satan%20kills%20while%20SMF%20revives.%20Th" title="Google Bookmarks"><img src="http://letsgetdugg.com/wp-content/plugins/sociable/images/googlebookmark.png" title="Google Bookmarks" alt="Google Bookmarks" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://www.designfloat.com/submit.php?url=http%3A%2F%2Fletsgetdugg.com%2F2010%2F01%2F05%2Frelax-satan-is-on-your-side%2F&amp;title=Relax%2C%20Satan%20is%20on%20your%20side." title="Design Float"><img src="http://letsgetdugg.com/wp-content/plugins/sociable/images/designfloat.png" title="Design Float" alt="Design Float" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://www.dzone.com/links/add.html?url=http%3A%2F%2Fletsgetdugg.com%2F2010%2F01%2F05%2Frelax-satan-is-on-your-side%2F&amp;title=Relax%2C%20Satan%20is%20on%20your%20side." title="DZone"><img src="http://letsgetdugg.com/wp-content/plugins/sociable/images/dzone.png" title="DZone" alt="DZone" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://reddit.com/submit?url=http%3A%2F%2Fletsgetdugg.com%2F2010%2F01%2F05%2Frelax-satan-is-on-your-side%2F&amp;title=Relax%2C%20Satan%20is%20on%20your%20side." title="Reddit"><img src="http://letsgetdugg.com/wp-content/plugins/sociable/images/reddit.png" title="Reddit" alt="Reddit" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://slashdot.org/bookmark.pl?title=Relax%2C%20Satan%20is%20on%20your%20side.&amp;url=http%3A%2F%2Fletsgetdugg.com%2F2010%2F01%2F05%2Frelax-satan-is-on-your-side%2F" title="Slashdot"><img src="http://letsgetdugg.com/wp-content/plugins/sociable/images/slashdot.png" title="Slashdot" alt="Slashdot" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="" title="TwitThis"><img src="http://letsgetdugg.com/wp-content/plugins/sociable/images/" title="TwitThis" alt="TwitThis" class="sociable-hovers" /></a>


<br/><br/>]]></content:encoded>
			<wfw:commentRss>http://letsgetdugg.com/2010/01/05/relax-satan-is-on-your-side/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Why deadlines go to hell</title>
		<link>http://letsgetdugg.com/2009/12/16/why-deadlines-go-to-hell/</link>
		<comments>http://letsgetdugg.com/2009/12/16/why-deadlines-go-to-hell/#comments</comments>
		<pubDate>Wed, 16 Dec 2009 21:55:27 +0000</pubDate>
		<dc:creator>victori</dc:creator>
				<category><![CDATA[administration]]></category>
		<category><![CDATA[main]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[productivity]]></category>

		<guid isPermaLink="false">http://letsgetdugg.com/?p=527</guid>
		<description><![CDATA[Ted Dziuba beautifully articulated why deadlines go to crap and seemingly straight forward tasks go out the window. You sir have done a public service for us all, thank you. What I hate is fording endless rivers of horseshit that are in the way of seemingly simple tasks. And I hate it even more when [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://teddziuba.com/2009/12/how-i-spot-valuable-engineers.html">Ted Dziuba</a> beautifully articulated why deadlines go to crap and seemingly straight forward tasks go out the window. You sir have done a public service for us all, thank you.</p>
<pre>
<div class="codesnip-container" >What I hate is fording endless rivers of horseshit that are in the way
of seemingly simple tasks. And I hate it even more when I have to explain
to a non-programmer what I am doing, "building LXML against a different
version of libiconv because I think it might be the source of a crash". 

"But all I asked you to do was parse some documents."

Good times.</div>
</pre>



Share and Enjoy:


	<a rel="nofollow"  target="_blank" href="http://digg.com/submit?phase=2&amp;url=http%3A%2F%2Fletsgetdugg.com%2F2009%2F12%2F16%2Fwhy-deadlines-go-to-hell%2F&amp;title=Why%20deadlines%20go%20to%20hell&amp;bodytext=Ted%20Dziuba%20beautifully%20articulated%20why%20deadlines%20go%20to%20crap%20and%20seemingly%20straight%20forward%20tasks%20go%20out%20the%20window.%20You%20sir%20have%20done%20a%20public%20service%20for%20us%20all%2C%20thank%20you.%0A%0A%0A%0AWhat%20I%20hate%20is%20fording%20endless%20rivers%20of%20horseshit%20that%20are%20in%20the%20way%20%0Ao" title="Digg"><img src="http://letsgetdugg.com/wp-content/plugins/sociable/images/digg.png" title="Digg" alt="Digg" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://sphinn.com/index.php?c=post&amp;m=submit&amp;link=http%3A%2F%2Fletsgetdugg.com%2F2009%2F12%2F16%2Fwhy-deadlines-go-to-hell%2F" title="Sphinn"><img src="http://letsgetdugg.com/wp-content/plugins/sociable/images/sphinn.png" title="Sphinn" alt="Sphinn" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://delicious.com/post?url=http%3A%2F%2Fletsgetdugg.com%2F2009%2F12%2F16%2Fwhy-deadlines-go-to-hell%2F&amp;title=Why%20deadlines%20go%20to%20hell&amp;notes=Ted%20Dziuba%20beautifully%20articulated%20why%20deadlines%20go%20to%20crap%20and%20seemingly%20straight%20forward%20tasks%20go%20out%20the%20window.%20You%20sir%20have%20done%20a%20public%20service%20for%20us%20all%2C%20thank%20you.%0A%0A%0A%0AWhat%20I%20hate%20is%20fording%20endless%20rivers%20of%20horseshit%20that%20are%20in%20the%20way%20%0Ao" title="del.icio.us"><img src="http://letsgetdugg.com/wp-content/plugins/sociable/images/delicious.png" title="del.icio.us" alt="del.icio.us" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://www.facebook.com/share.php?u=http%3A%2F%2Fletsgetdugg.com%2F2009%2F12%2F16%2Fwhy-deadlines-go-to-hell%2F&amp;t=Why%20deadlines%20go%20to%20hell" title="Facebook"><img src="http://letsgetdugg.com/wp-content/plugins/sociable/images/facebook.png" title="Facebook" alt="Facebook" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://www.mixx.com/submit?page_url=http%3A%2F%2Fletsgetdugg.com%2F2009%2F12%2F16%2Fwhy-deadlines-go-to-hell%2F&amp;title=Why%20deadlines%20go%20to%20hell" title="Mixx"><img src="http://letsgetdugg.com/wp-content/plugins/sociable/images/mixx.png" title="Mixx" alt="Mixx" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://www.google.com/bookmarks/mark?op=edit&amp;bkmk=http%3A%2F%2Fletsgetdugg.com%2F2009%2F12%2F16%2Fwhy-deadlines-go-to-hell%2F&amp;title=Why%20deadlines%20go%20to%20hell&amp;annotation=Ted%20Dziuba%20beautifully%20articulated%20why%20deadlines%20go%20to%20crap%20and%20seemingly%20straight%20forward%20tasks%20go%20out%20the%20window.%20You%20sir%20have%20done%20a%20public%20service%20for%20us%20all%2C%20thank%20you.%0A%0A%0A%0AWhat%20I%20hate%20is%20fording%20endless%20rivers%20of%20horseshit%20that%20are%20in%20the%20way%20%0Ao" title="Google Bookmarks"><img src="http://letsgetdugg.com/wp-content/plugins/sociable/images/googlebookmark.png" title="Google Bookmarks" alt="Google Bookmarks" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://www.designfloat.com/submit.php?url=http%3A%2F%2Fletsgetdugg.com%2F2009%2F12%2F16%2Fwhy-deadlines-go-to-hell%2F&amp;title=Why%20deadlines%20go%20to%20hell" title="Design Float"><img src="http://letsgetdugg.com/wp-content/plugins/sociable/images/designfloat.png" title="Design Float" alt="Design Float" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://www.dzone.com/links/add.html?url=http%3A%2F%2Fletsgetdugg.com%2F2009%2F12%2F16%2Fwhy-deadlines-go-to-hell%2F&amp;title=Why%20deadlines%20go%20to%20hell" title="DZone"><img src="http://letsgetdugg.com/wp-content/plugins/sociable/images/dzone.png" title="DZone" alt="DZone" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://reddit.com/submit?url=http%3A%2F%2Fletsgetdugg.com%2F2009%2F12%2F16%2Fwhy-deadlines-go-to-hell%2F&amp;title=Why%20deadlines%20go%20to%20hell" title="Reddit"><img src="http://letsgetdugg.com/wp-content/plugins/sociable/images/reddit.png" title="Reddit" alt="Reddit" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://slashdot.org/bookmark.pl?title=Why%20deadlines%20go%20to%20hell&amp;url=http%3A%2F%2Fletsgetdugg.com%2F2009%2F12%2F16%2Fwhy-deadlines-go-to-hell%2F" title="Slashdot"><img src="http://letsgetdugg.com/wp-content/plugins/sociable/images/slashdot.png" title="Slashdot" alt="Slashdot" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="" title="TwitThis"><img src="http://letsgetdugg.com/wp-content/plugins/sociable/images/" title="TwitThis" alt="TwitThis" class="sociable-hovers" /></a>


<br/><br/>]]></content:encoded>
			<wfw:commentRss>http://letsgetdugg.com/2009/12/16/why-deadlines-go-to-hell/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Squid Headers Normalization Patch</title>
		<link>http://letsgetdugg.com/2009/12/06/squid-headers-normalization-patch/</link>
		<comments>http://letsgetdugg.com/2009/12/06/squid-headers-normalization-patch/#comments</comments>
		<pubDate>Mon, 07 Dec 2009 01:48:38 +0000</pubDate>
		<dc:creator>victori</dc:creator>
				<category><![CDATA[administration]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[optimization]]></category>
		<category><![CDATA[performance]]></category>
		<category><![CDATA[squid]]></category>

		<guid isPermaLink="false">http://letsgetdugg.com/?p=503</guid>
		<description><![CDATA[Since Varnish did not work out on Solaris yet again. I have decided to bite the bullet and write a headers normalization patch for Squid 2.7. This patch should produce much better cache hit rates with Squid. Efficiency++ What the patch does: 1. Removes Cache-Control request headers, don&#8217;t let clients by-pass cache if it is [...]]]></description>
			<content:encoded><![CDATA[<p>Since Varnish did not work out on Solaris yet again. I have decided to bite the bullet and write a headers normalization patch for Squid 2.7. This patch should produce much better cache hit rates with Squid. Efficiency++ </p>
<h3>What the patch does:</h3>
<p><b>1.</b> Removes Cache-Control request headers, don&#8217;t let clients by-pass cache if it is primed.<br />
<b>2.</b> Normalize Accept-Encoding Headers for a higher cache hit rate.<br />
<b>3.</b> Clear Accept-Encoding Headers for content that should not be compressed such as image,video and audio.</p>
<p>and the patch: <a href="http://victori.uploadbooth.com/patches/squid-headers-normalization-v5.patch">squid-headers-normalization.patch</a></p>
<p><b>Update:</b> Fixed a minor memory leak, all good now.<br />
<b>Update 2:</b> Added audio exception to strip accept-encoding.</p>
<pre>
<div class="codesnip-container" >--- src/client_side.c.og	2010-01-20 12:00:56.000000000 -0800
+++ src/client_side.c	2010-01-19 20:35:31.000000000 -0800
@@ -3983,6 +3983,7 @@
 	    errorAppendEntry(http->entry, err);
 	    return -1;
 	}
+
 	/* compile headers */
 	/* we should skip request line! */
 	if ((http->http_ver.major >= 1) &#038;&#038; !httpMsgParseRequestHeader(request, &#038;msg)) {
@@ -3992,10 +3993,59 @@
 	    err->url = xstrdup(http->uri);
 	    http->al.http.code = err->http_status;
 	    http->log_type = LOG_TCP_DENIED;
+
 	    http->entry = clientCreateStoreEntry(http, method, null_request_flags);
 	    errorAppendEntry(http->entry, err);
 	    return -1;
 	}
+
+	/*
+	 *  Normalize Request Cache-Control / If-Modified-Since Headers
+	 *  Don't let client by-pass the cache if there is cached content.
+	 */
+	if(httpHeaderHas(&#038;request->header,HDR_CACHE_CONTROL)) {
+		httpHeaderDelByName(&#038;request->header,"cache-control");
+	}
+
+	/*
+	 * Un-comment this if you want Squid to always respond with the request
+	 * instead of returning back with a 304 if the cache has not changed.
+	 */
+	/*
+	if(httpHeaderHas(&#038;request->header,HDR_IF_MODIFIED_SINCE)) {
+		httpHeaderDelByName(&#038;request->header,"if-modified-since");
+	}*/
+
+	/*
+	 * Normalize Accept-Encoding Headers sent from client
+	 */
+	if(httpHeaderHas(&#038;request->header,HDR_ACCEPT_ENCODING)) {
+		String val = httpHeaderGetByName(&#038;request->header,"accept-encoding");
+		if(val.buf) {
+			if(strstr(val.buf,"gzip") != NULL) {
+				httpHeaderDelByName(&#038;request->header,"accept-encoding");
+				httpHeaderPutStr(&#038;request->header,HDR_ACCEPT_ENCODING,"gzip");
+			} else if(strstr(val.buf,"deflate") != NULL) {
+				httpHeaderDelByName(&#038;request->header,"accept-encoding");
+				httpHeaderPutStr(&#038;request->header,HDR_ACCEPT_ENCODING,"deflate");
+			} else {
+				httpHeaderDelByName(&#038;request->header,"accept-encoding");
+			}
+		}
+		stringClean(&#038;val);
+	}
+
+	/*
+	 * Normalize Accept-Encoding Headers for video/image content
+	 */
+	char *mime_type = mimeGetContentType(http->uri);
+	if(mime_type) {
+		if(strstr(mime_type,"image") != NULL || strstr(mime_type,"video") != NULL || strstr(mime_type,"audio") != NULL) {
+			httpHeaderDelByName(&#038;request->header,"accept-encoding");
+		}
+	}
+
+
 	/*
 	 * If we read past the end of this request, move the remaining
 	 * data to the beginning</div>
</pre>



Share and Enjoy:


	<a rel="nofollow"  target="_blank" href="http://digg.com/submit?phase=2&amp;url=http%3A%2F%2Fletsgetdugg.com%2F2009%2F12%2F06%2Fsquid-headers-normalization-patch%2F&amp;title=Squid%20Headers%20Normalization%20Patch&amp;bodytext=Since%20Varnish%20did%20not%20work%20out%20on%20Solaris%20yet%20again.%20I%20have%20decided%20to%20bite%20the%20bullet%20and%20write%20a%20headers%20normalization%20patch%20for%20Squid%202.7.%20This%20patch%20should%20produce%20much%20better%20cache%20hit%20rates%20with%20Squid.%20Efficiency%2B%2B%20%0A%0AWhat%20the%20patch%20does%3A%0A%0A1.%20Re" title="Digg"><img src="http://letsgetdugg.com/wp-content/plugins/sociable/images/digg.png" title="Digg" alt="Digg" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://sphinn.com/index.php?c=post&amp;m=submit&amp;link=http%3A%2F%2Fletsgetdugg.com%2F2009%2F12%2F06%2Fsquid-headers-normalization-patch%2F" title="Sphinn"><img src="http://letsgetdugg.com/wp-content/plugins/sociable/images/sphinn.png" title="Sphinn" alt="Sphinn" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://delicious.com/post?url=http%3A%2F%2Fletsgetdugg.com%2F2009%2F12%2F06%2Fsquid-headers-normalization-patch%2F&amp;title=Squid%20Headers%20Normalization%20Patch&amp;notes=Since%20Varnish%20did%20not%20work%20out%20on%20Solaris%20yet%20again.%20I%20have%20decided%20to%20bite%20the%20bullet%20and%20write%20a%20headers%20normalization%20patch%20for%20Squid%202.7.%20This%20patch%20should%20produce%20much%20better%20cache%20hit%20rates%20with%20Squid.%20Efficiency%2B%2B%20%0A%0AWhat%20the%20patch%20does%3A%0A%0A1.%20Re" title="del.icio.us"><img src="http://letsgetdugg.com/wp-content/plugins/sociable/images/delicious.png" title="del.icio.us" alt="del.icio.us" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://www.facebook.com/share.php?u=http%3A%2F%2Fletsgetdugg.com%2F2009%2F12%2F06%2Fsquid-headers-normalization-patch%2F&amp;t=Squid%20Headers%20Normalization%20Patch" title="Facebook"><img src="http://letsgetdugg.com/wp-content/plugins/sociable/images/facebook.png" title="Facebook" alt="Facebook" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://www.mixx.com/submit?page_url=http%3A%2F%2Fletsgetdugg.com%2F2009%2F12%2F06%2Fsquid-headers-normalization-patch%2F&amp;title=Squid%20Headers%20Normalization%20Patch" title="Mixx"><img src="http://letsgetdugg.com/wp-content/plugins/sociable/images/mixx.png" title="Mixx" alt="Mixx" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://www.google.com/bookmarks/mark?op=edit&amp;bkmk=http%3A%2F%2Fletsgetdugg.com%2F2009%2F12%2F06%2Fsquid-headers-normalization-patch%2F&amp;title=Squid%20Headers%20Normalization%20Patch&amp;annotation=Since%20Varnish%20did%20not%20work%20out%20on%20Solaris%20yet%20again.%20I%20have%20decided%20to%20bite%20the%20bullet%20and%20write%20a%20headers%20normalization%20patch%20for%20Squid%202.7.%20This%20patch%20should%20produce%20much%20better%20cache%20hit%20rates%20with%20Squid.%20Efficiency%2B%2B%20%0A%0AWhat%20the%20patch%20does%3A%0A%0A1.%20Re" title="Google Bookmarks"><img src="http://letsgetdugg.com/wp-content/plugins/sociable/images/googlebookmark.png" title="Google Bookmarks" alt="Google Bookmarks" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://www.designfloat.com/submit.php?url=http%3A%2F%2Fletsgetdugg.com%2F2009%2F12%2F06%2Fsquid-headers-normalization-patch%2F&amp;title=Squid%20Headers%20Normalization%20Patch" title="Design Float"><img src="http://letsgetdugg.com/wp-content/plugins/sociable/images/designfloat.png" title="Design Float" alt="Design Float" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://www.dzone.com/links/add.html?url=http%3A%2F%2Fletsgetdugg.com%2F2009%2F12%2F06%2Fsquid-headers-normalization-patch%2F&amp;title=Squid%20Headers%20Normalization%20Patch" title="DZone"><img src="http://letsgetdugg.com/wp-content/plugins/sociable/images/dzone.png" title="DZone" alt="DZone" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://reddit.com/submit?url=http%3A%2F%2Fletsgetdugg.com%2F2009%2F12%2F06%2Fsquid-headers-normalization-patch%2F&amp;title=Squid%20Headers%20Normalization%20Patch" title="Reddit"><img src="http://letsgetdugg.com/wp-content/plugins/sociable/images/reddit.png" title="Reddit" alt="Reddit" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://slashdot.org/bookmark.pl?title=Squid%20Headers%20Normalization%20Patch&amp;url=http%3A%2F%2Fletsgetdugg.com%2F2009%2F12%2F06%2Fsquid-headers-normalization-patch%2F" title="Slashdot"><img src="http://letsgetdugg.com/wp-content/plugins/sociable/images/slashdot.png" title="Slashdot" alt="Slashdot" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="" title="TwitThis"><img src="http://letsgetdugg.com/wp-content/plugins/sociable/images/" title="TwitThis" alt="TwitThis" class="sociable-hovers" /></a>


<br/><br/>]]></content:encoded>
			<wfw:commentRss>http://letsgetdugg.com/2009/12/06/squid-headers-normalization-patch/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>MogileFS Client on JRuby!</title>
		<link>http://letsgetdugg.com/2009/11/20/mogilefs-client-on-jruby/</link>
		<comments>http://letsgetdugg.com/2009/11/20/mogilefs-client-on-jruby/#comments</comments>
		<pubDate>Sat, 21 Nov 2009 04:19:11 +0000</pubDate>
		<dc:creator>victori</dc:creator>
				<category><![CDATA[programming]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[jruby]]></category>
		<category><![CDATA[jvm]]></category>

		<guid isPermaLink="false">http://letsgetdugg.com/?p=445</guid>
		<description><![CDATA[Are you running JRuby in production? Do you want distributed file storage for your &#8220;enterprise&#8221; application? Look no further, MogileFS is here. MogileFS-Client has compatibility issues with JRuby due to it&#8217;s use of the low level Socket class. JRuby 1.5-dev does not yet support all the Socket methods, so here is a monkey patch to [...]]]></description>
			<content:encoded><![CDATA[<p>Are you running JRuby in production? Do you want distributed file storage for your &#8220;enterprise&#8221; application? Look no further, <a href="http://www.danga.com/mogilefs/">MogileFS</a> is here.</p>
<p>MogileFS-Client has compatibility issues with JRuby due to it&#8217;s use of the low level Socket class. JRuby 1.5-dev does not yet support all the Socket methods, so here is a monkey patch to get the ruby mogilefs client working on JRuby. Yes it blocks, but who cares JRuby has native threads.</p>
<p>This is exactly why I love Ruby; monkey patching.</p>
<div class="codesnip-container" >
<div class="ruby codesnip" style="font-family:monospace;"><span class="kw1">class</span> Socket<br />
&nbsp; <span class="kw1">def</span> <span class="kw2">self</span>.<span class="me1">mogilefs_new</span><span class="br0">&#40;</span>host,port,timeout=5.0<span class="br0">&#41;</span><br />
&nbsp; &nbsp; TCPSocket.<span class="kw3">open</span><span class="br0">&#40;</span>host,port,timeout<span class="br0">&#41;</span><br />
&nbsp; <span class="kw1">end</span><br />
<span class="kw1">end</span><br />
<span class="kw1">class</span> TCPSocket<br />
&nbsp; attr_accessor <span class="re3">:mogilefs_addr</span>, <span class="re3">:mogilefs_connected</span>, <span class="re3">:mogilefs_size</span>, <span class="re3">:mogilefs_tcp_cork</span><br />
&nbsp; <span class="kw1">def</span> <span class="kw2">self</span>.<span class="kw3">open</span><span class="br0">&#40;</span>host,port,timeout = 5.0<span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="kw1">super</span><span class="br0">&#40;</span>host,port.<span class="me1">to_i</span><span class="br0">&#41;</span><br />
&nbsp; <span class="kw1">end</span><br />
&nbsp; <span class="kw1">def</span> readable?<br />
&nbsp; &nbsp; <span class="kw2">true</span><br />
&nbsp; <span class="kw1">end</span><br />
&nbsp; <span class="kw1">def</span> write_nonblock<span class="br0">&#40;</span>data<span class="br0">&#41;</span><br />
&nbsp; &nbsp; write<span class="br0">&#40;</span>data<span class="br0">&#41;</span><br />
&nbsp; <span class="kw1">end</span><br />
&nbsp; <span class="kw1">def</span> recv_nonblock<span class="br0">&#40;</span>size,arg<span class="br0">&#41;</span><br />
&nbsp; &nbsp; recv<span class="br0">&#40;</span>size,arg<span class="br0">&#41;</span><br />
&nbsp; <span class="kw1">end</span><br />
&nbsp; <span class="kw1">def</span> mogilefs_init<span class="br0">&#40;</span>host = <span class="kw2">nil</span>, port = <span class="kw2">nil</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="kw2">true</span><br />
&nbsp; <span class="kw1">end</span><br />
<span class="kw1">end</span></div>
</div>
<p>Here is an example test case on how to get it all to work.</p>
<div class="codesnip-container" >
<div class="ruby codesnip" style="font-family:monospace;"><span class="kw3">require</span> <span class="st0">&#8216;rubygems&#8217;</span><br />
<span class="kw3">require</span> <span class="st0">&#8216;mogilefs&#8217;</span></p>
<p><span class="co1"># jmogilefs.rb is the monkey patch above </span><br />
<span class="co1"># load it after loading mogilefs client.</span><br />
<span class="kw3">require</span> <span class="st0">&#8216;jmogilefs.rb&#8217;</span></p>
<p>mg = <span class="re2">MogileFS::MogileFS</span>.<span class="me1">new</span><span class="br0">&#40;</span><span class="re3">:domain</span><span class="sy0">=&gt;</span><span class="st0">&#8216;testserv&#8217;</span>,:hosts<span class="sy0">=&gt;</span><span class="br0">&#91;</span><span class="st0">&#8216;xxx.xxx.xxx.xxx:6001&#8242;</span><span class="br0">&#93;</span><span class="br0">&#41;</span></p>
<p><span class="kw3">p</span> mg.<span class="me1">get_file_data</span> <span class="st0">&#8216;video:100:default.jpg&#8217;</span></p>
<p><span class="kw3">p</span> mg.<span class="me1">get_paths</span> <span class="st0">&#8216;video:100:default.jpg&#8217;</span>,<span class="kw2">true</span></p>
<p>mg.<span class="me1">list_keys</span><span class="br0">&#40;</span><span class="st0">&#8216;video:100&#8242;</span><span class="br0">&#41;</span><span class="br0">&#91;</span>0<span class="br0">&#93;</span>.<span class="me1">each</span> <span class="kw1">do</span> <span class="sy0">|</span>f<span class="sy0">|</span><br />
&nbsp;<span class="kw3">p</span> f<br />
<span class="kw1">end</span></div>
</div>



Share and Enjoy:


	<a rel="nofollow"  target="_blank" href="http://digg.com/submit?phase=2&amp;url=http%3A%2F%2Fletsgetdugg.com%2F2009%2F11%2F20%2Fmogilefs-client-on-jruby%2F&amp;title=MogileFS%20Client%20on%20JRuby%21&amp;bodytext=Are%20you%20running%20JRuby%20in%20production%3F%20Do%20you%20want%20distributed%20file%20storage%20for%20your%20%22enterprise%22%20application%3F%20Look%20no%20further%2C%20MogileFS%20is%20here.%0A%0AMogileFS-Client%20has%20compatibility%20issues%20with%20JRuby%20due%20to%20it%27s%20use%20of%20the%20low%20level%20Socket%20class.%20JRuby%20" title="Digg"><img src="http://letsgetdugg.com/wp-content/plugins/sociable/images/digg.png" title="Digg" alt="Digg" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://sphinn.com/index.php?c=post&amp;m=submit&amp;link=http%3A%2F%2Fletsgetdugg.com%2F2009%2F11%2F20%2Fmogilefs-client-on-jruby%2F" title="Sphinn"><img src="http://letsgetdugg.com/wp-content/plugins/sociable/images/sphinn.png" title="Sphinn" alt="Sphinn" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://delicious.com/post?url=http%3A%2F%2Fletsgetdugg.com%2F2009%2F11%2F20%2Fmogilefs-client-on-jruby%2F&amp;title=MogileFS%20Client%20on%20JRuby%21&amp;notes=Are%20you%20running%20JRuby%20in%20production%3F%20Do%20you%20want%20distributed%20file%20storage%20for%20your%20%22enterprise%22%20application%3F%20Look%20no%20further%2C%20MogileFS%20is%20here.%0A%0AMogileFS-Client%20has%20compatibility%20issues%20with%20JRuby%20due%20to%20it%27s%20use%20of%20the%20low%20level%20Socket%20class.%20JRuby%20" title="del.icio.us"><img src="http://letsgetdugg.com/wp-content/plugins/sociable/images/delicious.png" title="del.icio.us" alt="del.icio.us" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://www.facebook.com/share.php?u=http%3A%2F%2Fletsgetdugg.com%2F2009%2F11%2F20%2Fmogilefs-client-on-jruby%2F&amp;t=MogileFS%20Client%20on%20JRuby%21" title="Facebook"><img src="http://letsgetdugg.com/wp-content/plugins/sociable/images/facebook.png" title="Facebook" alt="Facebook" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://www.mixx.com/submit?page_url=http%3A%2F%2Fletsgetdugg.com%2F2009%2F11%2F20%2Fmogilefs-client-on-jruby%2F&amp;title=MogileFS%20Client%20on%20JRuby%21" title="Mixx"><img src="http://letsgetdugg.com/wp-content/plugins/sociable/images/mixx.png" title="Mixx" alt="Mixx" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://www.google.com/bookmarks/mark?op=edit&amp;bkmk=http%3A%2F%2Fletsgetdugg.com%2F2009%2F11%2F20%2Fmogilefs-client-on-jruby%2F&amp;title=MogileFS%20Client%20on%20JRuby%21&amp;annotation=Are%20you%20running%20JRuby%20in%20production%3F%20Do%20you%20want%20distributed%20file%20storage%20for%20your%20%22enterprise%22%20application%3F%20Look%20no%20further%2C%20MogileFS%20is%20here.%0A%0AMogileFS-Client%20has%20compatibility%20issues%20with%20JRuby%20due%20to%20it%27s%20use%20of%20the%20low%20level%20Socket%20class.%20JRuby%20" title="Google Bookmarks"><img src="http://letsgetdugg.com/wp-content/plugins/sociable/images/googlebookmark.png" title="Google Bookmarks" alt="Google Bookmarks" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://www.designfloat.com/submit.php?url=http%3A%2F%2Fletsgetdugg.com%2F2009%2F11%2F20%2Fmogilefs-client-on-jruby%2F&amp;title=MogileFS%20Client%20on%20JRuby%21" title="Design Float"><img src="http://letsgetdugg.com/wp-content/plugins/sociable/images/designfloat.png" title="Design Float" alt="Design Float" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://www.dzone.com/links/add.html?url=http%3A%2F%2Fletsgetdugg.com%2F2009%2F11%2F20%2Fmogilefs-client-on-jruby%2F&amp;title=MogileFS%20Client%20on%20JRuby%21" title="DZone"><img src="http://letsgetdugg.com/wp-content/plugins/sociable/images/dzone.png" title="DZone" alt="DZone" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://reddit.com/submit?url=http%3A%2F%2Fletsgetdugg.com%2F2009%2F11%2F20%2Fmogilefs-client-on-jruby%2F&amp;title=MogileFS%20Client%20on%20JRuby%21" title="Reddit"><img src="http://letsgetdugg.com/wp-content/plugins/sociable/images/reddit.png" title="Reddit" alt="Reddit" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://slashdot.org/bookmark.pl?title=MogileFS%20Client%20on%20JRuby%21&amp;url=http%3A%2F%2Fletsgetdugg.com%2F2009%2F11%2F20%2Fmogilefs-client-on-jruby%2F" title="Slashdot"><img src="http://letsgetdugg.com/wp-content/plugins/sociable/images/slashdot.png" title="Slashdot" alt="Slashdot" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="" title="TwitThis"><img src="http://letsgetdugg.com/wp-content/plugins/sociable/images/" title="TwitThis" alt="TwitThis" class="sociable-hovers" /></a>


<br/><br/>]]></content:encoded>
			<wfw:commentRss>http://letsgetdugg.com/2009/11/20/mogilefs-client-on-jruby/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>MogileFS on Solaris</title>
		<link>http://letsgetdugg.com/2009/11/02/mogilefs-on-solaris/</link>
		<comments>http://letsgetdugg.com/2009/11/02/mogilefs-on-solaris/#comments</comments>
		<pubDate>Mon, 02 Nov 2009 23:11:52 +0000</pubDate>
		<dc:creator>victori</dc:creator>
				<category><![CDATA[main]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[mogilefs]]></category>
		<category><![CDATA[perl]]></category>
		<category><![CDATA[perlbal]]></category>
		<category><![CDATA[scalability]]></category>
		<category><![CDATA[solaris]]></category>

		<guid isPermaLink="false">http://letsgetdugg.com/?p=407</guid>
		<description><![CDATA[*Update* Patches got accepted into MogileFS Trunk Just go check out trunk, it has all my patches already included. http://code.sixapart.com/svn/mogilefs/trunk/ The only thing you need is my mogstored disk patch which is still pending. All the issues revolving around postgresql and solaris have been already included in trunk. I fixed a few issues with MogileFS [...]]]></description>
			<content:encoded><![CDATA[<p><strong>*Update*</strong> Patches got <a href="http://groups.google.com/group/mogile/browse_thread/thread/dad894c50ce23ec">accepted</a> into <a href="http://code.sixapart.com/svn/mogilefs/trunk/">MogileFS Trunk</a> <img src='http://letsgetdugg.com/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
<p>Just go check out trunk, it has all my patches already included.</p>
<p><a href="http://code.sixapart.com/svn/mogilefs/trunk/">http://code.sixapart.com/svn/mogilefs/trunk/</a></p>
<p>The only thing you need is my <a href="http://victori.uploadbooth.com/patches/solaris-disk-du.patch">mogstored disk patch</a> which is still pending. All the issues revolving around postgresql and solaris have been already included in trunk.</p>
<hr/>
<p>I fixed a few issues with <a href="http://www.danga.com/mogilefs/">MogileFS</a> and Solaris. MogileFS should run wonderfully on Solaris with my patches applied. </p>
<p>Directory for all my patches: <a href="http://victori.uploadbooth.com/patches">http://victori.uploadbooth.com/patches</a></p>
<p><a href="http://victori.uploadbooth.com/patches/solaris-disk-du.patch">http://victori.uploadbooth.com/patches/solaris-disk-du.patch</a></p>
<p>This patch fixes mogstored to work with solaris&#8217;s df utility. </p>
<p><a href="http://victori.uploadbooth.com/patches/store-max-requests.patch">http://victori.uploadbooth.com/patches/store-max-requests.patch</a>  </p>
<p>This patch adds a new feature to the MogileFS Tracker &#8211; max_requests. </p>
<p>The default is 0, but it is suggested you set it to 1000 max_requests, to avoid memory leaks.</p>
<p>The tracker will give out the database handle up to the max_requests limit before expiring the connection for a new one. This avoids memory leaks with long running persistent connections. PostgreSQL has issues with long persistent connections, it accumulates a lot of ram and does not let go until the process/connection is killed off. This patch makes sure that the connection is expired after so many dbh handle requests. </p>
<p><a href="http://victori.uploadbooth.com/patches/mogilefs-sunos-pg.patch">http://victori.uploadbooth.com/patches/mogilefs-sunos-pg.patch</a></p>
<p>This patch applies the InactiveDestroy argument to avoid the MogileFS Tracker locking up with the PostgreSQL store on Solaris.</p>
<p><a href="http://victori.uploadbooth.com/patches/solaris-mogilefs-full.patch">http://victori.uploadbooth.com/patches/solaris-mogilefs-full.patch </a></p>
<p>This is the full patch for all my fixes. </p>
<p>I am slowly migrating our fab40 static asset data to MogileFS. I have imported >300,000 images, no issues with my patches so far. </p>
<p>/ PLUG go make an account on uploadbooth!</p>
<p>Enjoy <img src='http://letsgetdugg.com/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>



Share and Enjoy:


	<a rel="nofollow"  target="_blank" href="http://digg.com/submit?phase=2&amp;url=http%3A%2F%2Fletsgetdugg.com%2F2009%2F11%2F02%2Fmogilefs-on-solaris%2F&amp;title=MogileFS%20on%20Solaris&amp;bodytext=%2AUpdate%2A%20Patches%20got%20accepted%20into%20MogileFS%20Trunk%20%3B-%29%0A%0AJust%20go%20check%20out%20trunk%2C%20it%20has%20all%20my%20patches%20already%20included.%0A%0Ahttp%3A%2F%2Fcode.sixapart.com%2Fsvn%2Fmogilefs%2Ftrunk%2F%0A%0AThe%20only%20thing%20you%20need%20is%20my%20mogstored%20disk%20patch%20which%20is%20still%20pending.%20All%20the%20" title="Digg"><img src="http://letsgetdugg.com/wp-content/plugins/sociable/images/digg.png" title="Digg" alt="Digg" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://sphinn.com/index.php?c=post&amp;m=submit&amp;link=http%3A%2F%2Fletsgetdugg.com%2F2009%2F11%2F02%2Fmogilefs-on-solaris%2F" title="Sphinn"><img src="http://letsgetdugg.com/wp-content/plugins/sociable/images/sphinn.png" title="Sphinn" alt="Sphinn" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://delicious.com/post?url=http%3A%2F%2Fletsgetdugg.com%2F2009%2F11%2F02%2Fmogilefs-on-solaris%2F&amp;title=MogileFS%20on%20Solaris&amp;notes=%2AUpdate%2A%20Patches%20got%20accepted%20into%20MogileFS%20Trunk%20%3B-%29%0A%0AJust%20go%20check%20out%20trunk%2C%20it%20has%20all%20my%20patches%20already%20included.%0A%0Ahttp%3A%2F%2Fcode.sixapart.com%2Fsvn%2Fmogilefs%2Ftrunk%2F%0A%0AThe%20only%20thing%20you%20need%20is%20my%20mogstored%20disk%20patch%20which%20is%20still%20pending.%20All%20the%20" title="del.icio.us"><img src="http://letsgetdugg.com/wp-content/plugins/sociable/images/delicious.png" title="del.icio.us" alt="del.icio.us" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://www.facebook.com/share.php?u=http%3A%2F%2Fletsgetdugg.com%2F2009%2F11%2F02%2Fmogilefs-on-solaris%2F&amp;t=MogileFS%20on%20Solaris" title="Facebook"><img src="http://letsgetdugg.com/wp-content/plugins/sociable/images/facebook.png" title="Facebook" alt="Facebook" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://www.mixx.com/submit?page_url=http%3A%2F%2Fletsgetdugg.com%2F2009%2F11%2F02%2Fmogilefs-on-solaris%2F&amp;title=MogileFS%20on%20Solaris" title="Mixx"><img src="http://letsgetdugg.com/wp-content/plugins/sociable/images/mixx.png" title="Mixx" alt="Mixx" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://www.google.com/bookmarks/mark?op=edit&amp;bkmk=http%3A%2F%2Fletsgetdugg.com%2F2009%2F11%2F02%2Fmogilefs-on-solaris%2F&amp;title=MogileFS%20on%20Solaris&amp;annotation=%2AUpdate%2A%20Patches%20got%20accepted%20into%20MogileFS%20Trunk%20%3B-%29%0A%0AJust%20go%20check%20out%20trunk%2C%20it%20has%20all%20my%20patches%20already%20included.%0A%0Ahttp%3A%2F%2Fcode.sixapart.com%2Fsvn%2Fmogilefs%2Ftrunk%2F%0A%0AThe%20only%20thing%20you%20need%20is%20my%20mogstored%20disk%20patch%20which%20is%20still%20pending.%20All%20the%20" title="Google Bookmarks"><img src="http://letsgetdugg.com/wp-content/plugins/sociable/images/googlebookmark.png" title="Google Bookmarks" alt="Google Bookmarks" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://www.designfloat.com/submit.php?url=http%3A%2F%2Fletsgetdugg.com%2F2009%2F11%2F02%2Fmogilefs-on-solaris%2F&amp;title=MogileFS%20on%20Solaris" title="Design Float"><img src="http://letsgetdugg.com/wp-content/plugins/sociable/images/designfloat.png" title="Design Float" alt="Design Float" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://www.dzone.com/links/add.html?url=http%3A%2F%2Fletsgetdugg.com%2F2009%2F11%2F02%2Fmogilefs-on-solaris%2F&amp;title=MogileFS%20on%20Solaris" title="DZone"><img src="http://letsgetdugg.com/wp-content/plugins/sociable/images/dzone.png" title="DZone" alt="DZone" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://reddit.com/submit?url=http%3A%2F%2Fletsgetdugg.com%2F2009%2F11%2F02%2Fmogilefs-on-solaris%2F&amp;title=MogileFS%20on%20Solaris" title="Reddit"><img src="http://letsgetdugg.com/wp-content/plugins/sociable/images/reddit.png" title="Reddit" alt="Reddit" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://slashdot.org/bookmark.pl?title=MogileFS%20on%20Solaris&amp;url=http%3A%2F%2Fletsgetdugg.com%2F2009%2F11%2F02%2Fmogilefs-on-solaris%2F" title="Slashdot"><img src="http://letsgetdugg.com/wp-content/plugins/sociable/images/slashdot.png" title="Slashdot" alt="Slashdot" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="" title="TwitThis"><img src="http://letsgetdugg.com/wp-content/plugins/sociable/images/" title="TwitThis" alt="TwitThis" class="sociable-hovers" /></a>


<br/><br/>]]></content:encoded>
			<wfw:commentRss>http://letsgetdugg.com/2009/11/02/mogilefs-on-solaris/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
