<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" version="2.0">

<channel>
	<title>post past :: james murty</title>
	
	<link>http://www.jamesmurty.com</link>
	<description>Contemplating the brave new present</description>
	<lastBuildDate>Mon, 19 Nov 2012 12:04:01 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.5.1</generator>
		<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/postpast" /><feedburner:info xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" uri="postpast" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item>
		<title>xml4h: XML for Humans in Python – 0.1.0 alpha</title>
		<link>http://www.jamesmurty.com/2012/11/19/xml4h-0-1-0-alpha/</link>
		<comments>http://www.jamesmurty.com/2012/11/19/xml4h-0-1-0-alpha/#comments</comments>
		<pubDate>Mon, 19 Nov 2012 12:04:01 +0000</pubDate>
		<dc:creator>James Murty</dc:creator>
				<category><![CDATA[Coding]]></category>
		<category><![CDATA[Python]]></category>

		<guid isPermaLink="false">http://www.jamesmurty.com/?p=669</guid>
		<description><![CDATA[It&#8217;s been quiet here for a while; it&#8217;s about time I announced a new project. Last week I released the first alpha version of xml4h, a library I have created to make it easier to do non-trivial XML processing in &#8230; <a href="http://www.jamesmurty.com/2012/11/19/xml4h-0-1-0-alpha/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>It&#8217;s been quiet here for a while; it&#8217;s about time I announced a new project.</p>
<p>Last week I released the first alpha version of <a href="https://github.com/jmurty/xml4h">xml4h</a>, a library I have created to make it easier to do non-trivial XML processing in Python. </p>
<p>You can find it on:</p>
<ul>
<li>PyPI for installation using <em>pip</em>: <a href="http://pypi.python.org/pypi/xml4h">pypi.python.org/pypi/xml4h</a></li>
<li>GitHub for code and issue tracking: <a href="https://github.com/jmurty/xml4h">github.com/jmurty/xml4h</a></li>
<li>ReadTheDocs for (pretty comprehensive) documentation: <a href="https://xml4h.readthedocs.org">xml4h.readthedocs.org</a></li>
</ul>
<p>I made <em>xml4h</em> because I enjoy working with Python &#8212; it&#8217;s been my language of choice for a while now &#8212; but I always found it painful to work with XML using the tools available there. Of course, dealing with XML tends to be painful in its own right, but the existing Python tools only made it harder. Although there was an excellent base of fast, efficient and powerful XML processing tools, interacting with them always seemed to be harder than it should be.</p>
<p>For years I kept an eye out for a better way, until finally of got off my arse and built it myself.</p>
<p>Right now <em>xml4h</em> is young, a little rough, and likely to undergo changes: in other words it&#8217;s an alpha. My hope is it will grow quickly into a powerful and intuitive tool that makes it as easy to do XML in Python as it now is to <a href="http://docs.python-requests.org/">do HTTP</a> or to <a href="http://www.sqlalchemy.org/">do SQL</a>.</p>
<p>If you&#8217;re into Python and have felt XML-induced pain, it would be great if you could try it out and provide feedback, bug reports, and code to help move the project in the right direction.</p>
<p>Let&#8217;s make this thing awesome.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/postpast?a=2azMGPr17qQ:Af6RssaGdWE:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/postpast?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/postpast?a=2azMGPr17qQ:Af6RssaGdWE:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/postpast?i=2azMGPr17qQ:Af6RssaGdWE:D7DqB2pKExk" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/postpast/~4/2azMGPr17qQ" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.jamesmurty.com/2012/11/19/xml4h-0-1-0-alpha/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>JetS3t 0.9.0 Released</title>
		<link>http://www.jamesmurty.com/2012/03/12/jets3t-0-9-0-released/</link>
		<comments>http://www.jamesmurty.com/2012/03/12/jets3t-0-9-0-released/#comments</comments>
		<pubDate>Tue, 13 Mar 2012 06:02:48 +0000</pubDate>
		<dc:creator>James Murty</dc:creator>
				<category><![CDATA[AWS]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[JetS3t]]></category>

		<guid isPermaLink="false">http://www.jamesmurty.com/?p=658</guid>
		<description><![CDATA[The newest version of JetS3t has been released and is now available for download: JetS3t 0.9.0 This release has been a long time coming, sorry about that. I had intended to get a release out late last year but personal &#8230; <a href="http://www.jamesmurty.com/2012/03/12/jets3t-0-9-0-released/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>The newest version of JetS3t has been released and is now available for download: <a href="http://www.jets3t.org/downloads.html">JetS3t 0.9.0</a></p>
<p>This release has been a long time coming, sorry about that. I had intended to get a release out late last year but personal factors left me short of time: relocating back to Australia from the U.S. and helping out with our newly-arrived baby boy have kept me pretty busy.</p>
<p>Still, the 0.9.0 version is now official. Here are some of the major new features and improvements.</p>
<h3>HttpComponents Upgrade</h3>
<p>A major change in the new version is JetS3t&#8217;s use of the newer 4.x generation of the key <a href="http://hc.apache.org/index.html">HttpClient library</a> (now more accurately called HttpComponents). The older HttpClient 3.x had been end-of-lifed and while it still worked fine, relying on the obsolete version was not a good long-term option.</p>
<p>I need to thank two contributors in particular for doing a lot of this work. Cheers to <a href="https://bitbucket.org/gillouxg">Gilles Gaillard</a> and <a href="https://bitbucket.org/dkocher">David Kocher</a> for their invaluable work; the upgrade wouldn&#8217;t have happened without them.</p>
<p>Note that since this upgrade involved updates to the core JetS3t HTTP code layer, there is a risk of subtle bugs in the HTTP handling with this release. I think the risk is small and some people have been using the pre-release 0.9.0 code successfully for a while now, but when you update to 0.9.0 it&#8217;s worth doing a little more testing than you might normally.</p>
<p>Here are some of the new service-specific features.</p>
<h3>Amazon S3</h3>
<ul>
<li>Support for multiple object deletes in a single request</li>
<li>Explicit support for new S3 locations: Oregon (<tt>us-west-2</tt>), South America (<tt>sa-east-1</tt>), GovCloud US West (<tt>s3-us-gov-west-1</tt>), GovCloud US West FIPS 140-2 (<tt>s3-fips-us-gov-west-1</tt>)</li>
<li>Support for server-side encryption, with per-object setting of algorithm and default algorithm configuration with the new <tt>s3service.server-side-encryption</tt> property</li>
<li>Support for Multipart Upload Part &#8211; Copy operation, to add data from existing S3 objects to multipart uploads.</li>
<li>Support for signing S3 requests with response-altering request parameters like <tt>response-content-type</tt> and <tt>response-content-disposition</tt></li>
</ul>
<h3>Google Storage</h3>
<ul>
<li>Support for OAuth2 authentication mechanism, with automatic access token refresh.</li>
</ul>
<h3>Conclusion</h3>
<p>Please grab the latest version, try it out and let me know how it goes.</p>
<p>Visit the JetS3t web site to <a href="http://www.jets3t.org/downloads.html">download the latest packaged release</a>, view the <a href="http://www.jets3t.org/toolkit/code-samples.html">code samples</a> or read the <a href="http://www.jets3t.org/api/index.html">API Javadoc</a>.</p>
<p>For a more complete list of changes see the <a href="http://jets3t.s3.amazonaws.com/downloads.html#history">Release History</a> or <a href="http://jets3t.s3.amazonaws.com/RELEASE_NOTES.html">Release Notes</a> documents.</p>
<p>Or go to the <a href="http://bitbucket.org/jmurty/jets3t">BitBucket developer site</a> to access the latest code, <a href="https://bitbucket.org/jmurty/jets3t/issues/new">report issues</a> in the bug tracker, and contribute to the project.</p>
<p>P.S. The latest release is on its way to the official Maven2 repository and should be available within a day or so.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/postpast?a=-_G4Q29MjIg:d4w3tOvDse0:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/postpast?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/postpast?a=-_G4Q29MjIg:d4w3tOvDse0:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/postpast?i=-_G4Q29MjIg:d4w3tOvDse0:D7DqB2pKExk" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/postpast/~4/-_G4Q29MjIg" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.jamesmurty.com/2012/03/12/jets3t-0-9-0-released/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Python code to convert UTF-8 to Latin-1</title>
		<link>http://www.jamesmurty.com/2011/12/30/python-code-utf8-to-latin1/</link>
		<comments>http://www.jamesmurty.com/2011/12/30/python-code-utf8-to-latin1/#comments</comments>
		<pubDate>Fri, 30 Dec 2011 23:10:54 +0000</pubDate>
		<dc:creator>James Murty</dc:creator>
				<category><![CDATA[Coding]]></category>
		<category><![CDATA[Python]]></category>

		<guid isPermaLink="false">http://www.jamesmurty.com/?p=645</guid>
		<description><![CDATA[After dealing with UTF-8 to latin1 encoding issues repeatedly over the years I finally put the time into crafting a somewhat complete conversion script in Python that handles things like &#8220;smart&#8221; quotes and other commonly-used symbols. This probably isn&#8217;t the &#8230; <a href="http://www.jamesmurty.com/2011/12/30/python-code-utf8-to-latin1/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>After dealing with UTF-8 to latin1 encoding issues repeatedly over the years I finally put the time into crafting a somewhat complete conversion script in Python that handles things like &#8220;smart&#8221; quotes and other commonly-used symbols.</p>
<p>This probably isn&#8217;t the best place to put this code but hopefully it will help someone, most likely me at some time in the future. Unless perhaps sanity prevails and everyone starts using UTF-8 everywhere&#8230;</p>
<div class="codecolorer-container python twitlight" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="python codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">re</span><br />
<br />
<span style="color: #ff7700;font-weight:bold;">def</span> encode_utf8_to_iso88591<span style="color: black;">&#40;</span>utf8_text<span style="color: black;">&#41;</span>:<br />
&nbsp; &nbsp; <span style="color: #483d8b;">'''<br />
&nbsp; &nbsp; Encode and return the given UTF-8 text as ISO-8859-1 (latin1) with<br />
&nbsp; &nbsp; unsupported characters replaced by '?', except for common special<br />
&nbsp; &nbsp; characters like smart quotes and symbols that we handle as well as we can.<br />
&nbsp; &nbsp; For example, the copyright symbol =&gt; '(c)' etc.<br />
<br />
&nbsp; &nbsp; If the given value is not a string it is returned unchanged.<br />
<br />
&nbsp; &nbsp; References:<br />
&nbsp; &nbsp; en.wikipedia.org/wiki/Quotation_mark_glyphs#Quotation_marks_in_Unicode<br />
&nbsp; &nbsp; en.wikipedia.org/wiki/Copyright_symbol<br />
&nbsp; &nbsp; en.wikipedia.org/wiki/Registered_trademark_symbol<br />
&nbsp; &nbsp; en.wikipedia.org/wiki/Sound_recording_copyright_symbol<br />
&nbsp; &nbsp; en.wikipedia.org/wiki/Service_mark_symbol<br />
&nbsp; &nbsp; en.wikipedia.org/wiki/Trademark_symbol<br />
&nbsp; &nbsp; '''</span><br />
&nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #ff7700;font-weight:bold;">not</span> <span style="color: #008000;">isinstance</span><span style="color: black;">&#40;</span>utf8_text<span style="color: #66cc66;">,</span> <span style="color: #008000;">basestring</span><span style="color: black;">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">return</span> utf8_text<br />
&nbsp; &nbsp; <span style="color: #808080; font-style: italic;"># Replace &quot;smart&quot; and other single-quote like things</span><br />
&nbsp; &nbsp; utf8_text <span style="color: #66cc66;">=</span> <span style="color: #dc143c;">re</span>.<span style="color: black;">sub</span><span style="color: black;">&#40;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; u<span style="color: #483d8b;">'[<span style="color: #000099; font-weight: bold;">\u</span>02bc<span style="color: #000099; font-weight: bold;">\u</span>2018<span style="color: #000099; font-weight: bold;">\u</span>2019<span style="color: #000099; font-weight: bold;">\u</span>201a<span style="color: #000099; font-weight: bold;">\u</span>201b<span style="color: #000099; font-weight: bold;">\u</span>2039<span style="color: #000099; font-weight: bold;">\u</span>203a<span style="color: #000099; font-weight: bold;">\u</span>300c<span style="color: #000099; font-weight: bold;">\u</span>300d]'</span><span style="color: #66cc66;">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #483d8b;">&quot;'&quot;</span><span style="color: #66cc66;">,</span> utf8_text<span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; <span style="color: #808080; font-style: italic;"># Replace &quot;smart&quot; and other double-quote like things</span><br />
&nbsp; &nbsp; utf8_text <span style="color: #66cc66;">=</span> <span style="color: #dc143c;">re</span>.<span style="color: black;">sub</span><span style="color: black;">&#40;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; u<span style="color: #483d8b;">'[<span style="color: #000099; font-weight: bold;">\u</span>00ab<span style="color: #000099; font-weight: bold;">\u</span>00bb<span style="color: #000099; font-weight: bold;">\u</span>201c<span style="color: #000099; font-weight: bold;">\u</span>201d<span style="color: #000099; font-weight: bold;">\u</span>201e<span style="color: #000099; font-weight: bold;">\u</span>201f<span style="color: #000099; font-weight: bold;">\u</span>300e<span style="color: #000099; font-weight: bold;">\u</span>300f]'</span><span style="color: #66cc66;">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #483d8b;">'&quot;'</span><span style="color: #66cc66;">,</span> utf8_text<span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; <span style="color: #808080; font-style: italic;"># Replace copyright symbol</span><br />
&nbsp; &nbsp; utf8_text <span style="color: #66cc66;">=</span> <span style="color: #dc143c;">re</span>.<span style="color: black;">sub</span><span style="color: black;">&#40;</span>u<span style="color: #483d8b;">'[<span style="color: #000099; font-weight: bold;">\u</span>00a9<span style="color: #000099; font-weight: bold;">\u</span>24b8<span style="color: #000099; font-weight: bold;">\u</span>24d2]'</span><span style="color: #66cc66;">,</span> <span style="color: #483d8b;">'(c)'</span><span style="color: #66cc66;">,</span> utf8_text<span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; <span style="color: #808080; font-style: italic;"># Replace registered trademark symbol</span><br />
&nbsp; &nbsp; utf8_text <span style="color: #66cc66;">=</span> <span style="color: #dc143c;">re</span>.<span style="color: black;">sub</span><span style="color: black;">&#40;</span>u<span style="color: #483d8b;">'[<span style="color: #000099; font-weight: bold;">\u</span>00ae<span style="color: #000099; font-weight: bold;">\u</span>24c7]'</span><span style="color: #66cc66;">,</span> <span style="color: #483d8b;">'(r)'</span><span style="color: #66cc66;">,</span> utf8_text<span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; <span style="color: #808080; font-style: italic;"># Replace sound recording copyright symbol</span><br />
&nbsp; &nbsp; utf8_text <span style="color: #66cc66;">=</span> <span style="color: #dc143c;">re</span>.<span style="color: black;">sub</span><span style="color: black;">&#40;</span>u<span style="color: #483d8b;">'[<span style="color: #000099; font-weight: bold;">\u</span>2117<span style="color: #000099; font-weight: bold;">\u</span>24c5<span style="color: #000099; font-weight: bold;">\u</span>24df]'</span><span style="color: #66cc66;">,</span> <span style="color: #483d8b;">'(p)'</span><span style="color: #66cc66;">,</span> utf8_text<span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; <span style="color: #808080; font-style: italic;"># Replace service mark symbol</span><br />
&nbsp; &nbsp; utf8_text <span style="color: #66cc66;">=</span> <span style="color: #dc143c;">re</span>.<span style="color: black;">sub</span><span style="color: black;">&#40;</span>u<span style="color: #483d8b;">'[<span style="color: #000099; font-weight: bold;">\u</span>2120]'</span><span style="color: #66cc66;">,</span> <span style="color: #483d8b;">'(sm)'</span><span style="color: #66cc66;">,</span> utf8_text<span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; <span style="color: #808080; font-style: italic;"># Replace trademark symbol</span><br />
&nbsp; &nbsp; utf8_text <span style="color: #66cc66;">=</span> <span style="color: #dc143c;">re</span>.<span style="color: black;">sub</span><span style="color: black;">&#40;</span>u<span style="color: #483d8b;">'[<span style="color: #000099; font-weight: bold;">\u</span>2122]'</span><span style="color: #66cc66;">,</span> <span style="color: #483d8b;">'(tm)'</span><span style="color: #66cc66;">,</span> utf8_text<span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; <span style="color: #808080; font-style: italic;"># Replace/clobber any remaining UTF-8 characters that aren't in ISO-8859-1</span><br />
&nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">return</span> utf8_text.<span style="color: black;">encode</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'ISO-8859-1'</span><span style="color: #66cc66;">,</span> <span style="color: #483d8b;">'replace'</span><span style="color: black;">&#41;</span></div></div>
<p>Be sure to only feed this method UTF-8 encoded text.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/postpast?a=2KRQOf7s8Fc:NXhjkvDPaiQ:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/postpast?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/postpast?a=2KRQOf7s8Fc:NXhjkvDPaiQ:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/postpast?i=2KRQOf7s8Fc:NXhjkvDPaiQ:D7DqB2pKExk" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/postpast/~4/2KRQOf7s8Fc" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.jamesmurty.com/2011/12/30/python-code-utf8-to-latin1/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Vimdiff for three-way merges in Mercurial</title>
		<link>http://www.jamesmurty.com/2011/05/06/vimdiff-three-way-merges-in-mercurial/</link>
		<comments>http://www.jamesmurty.com/2011/05/06/vimdiff-three-way-merges-in-mercurial/#comments</comments>
		<pubDate>Sat, 07 May 2011 02:53:29 +0000</pubDate>
		<dc:creator>James Murty</dc:creator>
				<category><![CDATA[Coding]]></category>
		<category><![CDATA[Tips]]></category>

		<guid isPermaLink="false">http://www.jamesmurty.com/?p=623</guid>
		<description><![CDATA[I&#8217;ve been using vim as my sole code editor for a couple of years now at work. I find that the more I use it and the more I learn (there will always be more to learn about vim) the &#8230; <a href="http://www.jamesmurty.com/2011/05/06/vimdiff-three-way-merges-in-mercurial/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>I&#8217;ve been using <a href="http://en.wikipedia.org/wiki/Vim_(text_editor)">vim</a> as my sole code editor for a couple of years now at work. I find that the more I use it and the more I learn (there will always be more to learn about vim) the happier I am with this fantastic tool.</p>
<p>After working through some hairy code merges recently I realised I needed a better approach than relying on inline diffs, where merge conflicts are represented in a single file like so:</p>
<div class="codecolorer-container diff twitlight" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="diff codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #991111;">&lt;&lt;&lt;&lt;&lt;&lt;&lt; incoming</span><br />
Someone else's code<br />
=======<br />
My code<br />
<span style="color: #00b000;">&gt;&gt;&gt;&gt;&gt;&gt;&gt; outgoing</span></div></div>
<p>Inline diffs are great for resolving relatively simple conflicts but can quickly become confusing if conflicts span many lines or there are significant differences between files.</p>
<p>So I configured Mercurial to open <code class="codecolorer text default"><span class="text">vimdiff</span></code> upon merge conflicts, but the default three-paned vertical-split view wasn&#8217;t quite what I wanted. It didn&#8217;t include the base version of the conflicted file, and the default window layout made it hard to see exactly what was going on.</p>
<p>A little research turned up <a href="http://www.toofishes.net/blog/three-way-merging-git-using-vim/">a blog post</a> showing how to better configure vimdiff when using git. We use Mercurial at work so I adapted this hint to work with Mercurial&#8217;s <a href="http://mercurial.selenic.com/wiki/MergeProgram">MergeProgram</a> configuration:</p>
<div class="codecolorer-container vim twitlight" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="vim codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"># Three<span style="color: #000000;">-</span>way merge with vimdiff <span style="color: #000000;">&#40;</span>shows result <span style="color: #804040;">in</span> bottom <span style="color: #668080;">window</span><span style="color: #000000;">&#41;</span><br />
# Based <span style="color: #25BB4D;">on</span> http<span style="color: #000000;">://</span>mercurial<span style="color: #000000;">.</span>selenic<span style="color: #000000;">.</span><span style="color: #668080;">com</span><span style="color: #000000;">/</span>wiki<span style="color: #000000;">/</span>MergingWithVim<br />
# and http<span style="color: #000000;">://</span>www<span style="color: #000000;">.</span>toofishes<span style="color: #000000;">.</span>net<span style="color: #000000;">/</span>blog<span style="color: #000000;">/</span>three<span style="color: #000000;">-</span>way<span style="color: #000000;">-</span>merging<span style="color: #000000;">-</span>git<span style="color: #000000;">-</span>using<span style="color: #000000;">-</span>vim<span style="color: #000000;">/</span><br />
<br />
<span style="color: #000000;">&#91;</span>ui<span style="color: #000000;">&#93;</span><br />
merge = vimdiff<br />
<br />
<span style="color: #000000;">&#91;</span>merge<span style="color: #000000;">-</span>tools<span style="color: #000000;">&#93;</span><br />
vimdiff<span style="color: #000000;">.</span><span style="color: #25BB4D;">executable</span> = vim<br />
vimdiff<span style="color: #000000;">.</span>args = <span style="color: #000000;">-</span>d <span style="color: #000000;">-</span>c <span style="color: #C5A22D;">&quot;wincmd J&quot;</span> <span style="color: #C5A22D;">&quot;$output&quot;</span> <span style="color: #C5A22D;">&quot;$local&quot;</span> <span style="color: #C5A22D;">&quot;$other&quot;</span> <span style="color: #C5A22D;">&quot;$base&quot;</span></div></div>
<p>This will show the merged file in a large window at the bottom with the three pre-merge files of interest &#8212; local changes, incoming/other changes, the base file &#8212; in a three-pane vertical split at the top. With this set-up and some practice using the <a href="http://vimdoc.sourceforge.net/htmldoc/diff.html">vimdiff</a> commands, complex conflicting merges are much easier to deal with.</p>
<p>If you use <code class="codecolorer text default"><span class="text">vim</span></code> or want to, be sure to check out the excellent <a href="http://vimcasts.org/">Vim Casts</a> video podcasts to learn (or re-learn) how to get the most out of it. Some <a href="http://vimcasts.org/episodes/fugitive-vim-resolving-merge-conflicts-with-vimdiff/">recent episodes</a> discuss <code class="codecolorer text default"><span class="text">vimdiff</span></code> in the context of a git workflow but are still full of useful pointers for those not using git.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/postpast?a=UJWDgAB0Vmc:88kkWUu954Q:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/postpast?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/postpast?a=UJWDgAB0Vmc:88kkWUu954Q:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/postpast?i=UJWDgAB0Vmc:88kkWUu954Q:D7DqB2pKExk" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/postpast/~4/UJWDgAB0Vmc" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.jamesmurty.com/2011/05/06/vimdiff-three-way-merges-in-mercurial/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>JetS3t 0.8.1 in the wild</title>
		<link>http://www.jamesmurty.com/2011/04/10/jets3t-0-8-1-in-the-wild/</link>
		<comments>http://www.jamesmurty.com/2011/04/10/jets3t-0-8-1-in-the-wild/#comments</comments>
		<pubDate>Mon, 11 Apr 2011 02:48:59 +0000</pubDate>
		<dc:creator>James Murty</dc:creator>
				<category><![CDATA[AWS]]></category>
		<category><![CDATA[Cloud Computing]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[JetS3t]]></category>

		<guid isPermaLink="false">http://www.jamesmurty.com/?p=580</guid>
		<description><![CDATA[The newest version of JetS3t has been released and is now roaming free. Meet 0.8.1. This release has been a long time coming, mainly due to my reluctance to finish the documentation. But it&#8217;s finally here and comes with some &#8230; <a href="http://www.jamesmurty.com/2011/04/10/jets3t-0-8-1-in-the-wild/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>The newest version of JetS3t has been released and is now roaming free. Meet <a href="http://www.jets3t.org/downloads.html">0.8.1</a>.</p>
<p>This release has been a long time coming, mainly due to my reluctance to finish the documentation. But it&#8217;s finally here and comes with some great new features.</p>
<h3>Goodies</h3>
<ul>
<li>Support for Amazon S3&#8242;s multipart uploads, both at the <a href="http://www.jets3t.org/api/org/jets3t/service/S3Service.html#multipartStartUpload(java.lang.String, java.lang.String, java.util.Map)">API level</a> and with a <a href="http://www.jets3t.org/toolkit/code-samples.html#multipart">MultipartUtils</a> tool that makes it very easy to upload files in multiple parts.</li>
<li>Support for Amazon S3&#8242;s website configuration, which makes an S3 bucket act more like a traditional website. I&#8217;m using this new feature to great effect on JetS3t&#8217;s new home domain <a href="http://www.jets3t.org">www.jets3t.org</a>.<br />
The new domain is served from S3 like the old <em>jets3t.s3.amazonaws.com</em> version, but it works much better if you visit places like the <a href="http://www.jets3t.org/">root directory</a> (versus <a href="http://jets3t.s3.amazonaws.com/">this</a>) or a <a href="http://www.jets3t.org/missing">missing page</a> (versus <a href="http://jets3t.s3.amazonaws.com/missing">that</a>).<br />
Now the new domain just needs some Google-juice, so please update your links to point to <strong>www.jets3t.org</strong>.
</li>
<li>Massive improvements to the Synchronize application to reduce its memory footprint when syncing large directory hierarchies and improve its efficiency when comparing local and remote files.<br />
Synchronize also now supports multipart uploads, so you can back up files larger than 5GB and improve reliability by uploading large files in smaller pieces (see the <tt>upload.max-part-size</tt> configuration setting in <em>synchronize.properties</em>).
</li>
<li>Support for custom (non-S3) distribution origins in the CloudFront API. Note that these service changes are not backwards-compatible</li>
<li>A number of bug fixes and other tweaks</li>
</ul>
<p>See the full list of changes in the <a href="http://jets3t.s3.amazonaws.com/downloads.html#history">Release History</a> or <a href="http://jets3t.s3.amazonaws.com/RELEASE_NOTES.html">Release Notes</a> documents.</p>
<h3>Yes Please</h3>
<p>Visit the JetS3t web site to <a href="http://www.jets3t.org/downloads.html">download the latest packaged release</a>, view the latest <a href="http://www.jets3t.org/toolkit/code-samples.html">code samples</a> or read the <a href="http://www.jets3t.org/api/index.html">API Javadoc</a>.</p>
<p>Or go to the <a href="http://bitbucket.org/jmurty/jets3t">BitBucket developer site<a> to access the latest code, <a href="https://bitbucket.org/jmurty/jets3t/issues/new">report issues</a> in the bug tracker, and contribute to the project.</p>
<p>P.S. The latest release is on its way to the official Maven2 repository and should be available within a day or so.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/postpast?a=36U-5nzDKhU:49XR1dMrSOU:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/postpast?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/postpast?a=36U-5nzDKhU:49XR1dMrSOU:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/postpast?i=36U-5nzDKhU:49XR1dMrSOU:D7DqB2pKExk" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/postpast/~4/36U-5nzDKhU" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.jamesmurty.com/2011/04/10/jets3t-0-8-1-in-the-wild/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>JetS3t support for S3 Website Hosting</title>
		<link>http://www.jamesmurty.com/2011/02/17/jets3t-support-for-s3-website-hostin/</link>
		<comments>http://www.jamesmurty.com/2011/02/17/jets3t-support-for-s3-website-hostin/#comments</comments>
		<pubDate>Fri, 18 Feb 2011 06:08:57 +0000</pubDate>
		<dc:creator>James Murty</dc:creator>
				<category><![CDATA[JetS3t]]></category>

		<guid isPermaLink="false">http://www.jamesmurty.com/?p=561</guid>
		<description><![CDATA[I have just released code for JetS3t that adds API-level support for Amazon S3&#8242;s new Website Hosting feature. With a Website Hosting configuration applied to an S3 bucket, the bucket can serve static content but will also act in a &#8230; <a href="http://www.jamesmurty.com/2011/02/17/jets3t-support-for-s3-website-hostin/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>I have just <a href="http://bitbucket.org/jmurty/jets3t/changeset/6a6618f2fbff">released code</a> for JetS3t that adds API-level support for Amazon S3&#8242;s new Website Hosting feature.</p>
<p>With a <a href="http://docs.amazonwebservices.com/AmazonS3/latest/dev/index.html?WebsiteHosting.html">Website Hosting</a> configuration applied to an S3 bucket, the bucket can serve static content but will also act in a somewhat dynamic way to serve <em>index</em> and <em>error</em> documents if someone visits URL paths that don&#8217;t match a real file.</p>
<p>This makes it much more feasible to serve static website content from S3 without having to worry about users receiving strange XML error messages if they venture off the beaten track or try to access partial URL paths. In particular, it allows you serve an <em>index.html</em> file from the root of a bucket, just like a real web server.</p>
<p>To find out more read these:</p>
<ul>
<li><a href="http://aws.typepad.com/aws/2011/02/host-your-static-website-on-amazon-s3.html">Host Your Static Website on Amazon S3</a></li>
<li><a href="http://www.allthingsdistributed.com/2011/02/website_amazon_s3.html">New AWS feature: Run your website from Amazon S3</a></li>
<li><a href="http://docs.amazonwebservices.com/AmazonS3/latest/dev/index.html?WebsiteHosting.html">Developer Guide: Hosting Websites on Amazon S3</a></li>
</ul>
<p>To try out the feature in JetS3t, grab the latest <a href="https://bitbucket.org/jmurty/jets3t/wiki/Build_Instructions">development code</a> and read the <a href="https://bitbucket.org/jmurty/jets3t/src/6a6618f2fbff/src/org/jets3t/tests/TestRestS3Service.java#cl-540">example test code</a> to see how it works.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/postpast?a=0QaJgZoGGrU:-CnTh6CdqiQ:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/postpast?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/postpast?a=0QaJgZoGGrU:-CnTh6CdqiQ:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/postpast?i=0QaJgZoGGrU:-CnTh6CdqiQ:D7DqB2pKExk" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/postpast/~4/0QaJgZoGGrU" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.jamesmurty.com/2011/02/17/jets3t-support-for-s3-website-hostin/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Work-around for Mac OS X python package install error — "lipo: can’t figure out the architecture type"</title>
		<link>http://www.jamesmurty.com/2011/01/29/work-around-osx-lipo-figure-out-architecture-type/</link>
		<comments>http://www.jamesmurty.com/2011/01/29/work-around-osx-lipo-figure-out-architecture-type/#comments</comments>
		<pubDate>Sat, 29 Jan 2011 19:01:28 +0000</pubDate>
		<dc:creator>James Murty</dc:creator>
				<category><![CDATA[Python]]></category>
		<category><![CDATA[Tips]]></category>

		<guid isPermaLink="false">http://www.jamesmurty.com/?p=550</guid>
		<description><![CDATA[This is just some quick documentation of a couple of work-arounds I needed to install the a python package on Mac OS X 10.6.6 (Snow Leopard). This solution could work in a number of cases, not just for this one &#8230; <a href="http://www.jamesmurty.com/2011/01/29/work-around-osx-lipo-figure-out-architecture-type/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>This is just some quick documentation of a couple of work-arounds I needed to install the a python package on Mac OS X 10.6.6 (Snow Leopard). This solution could work in a number of cases, not just for this one package, so I thought I should write it down.</p>
<p>I was trying to install the <a href="http://pypi.python.org/pypi/nose-cov/1.3">nose-cov</a> unit test coverage package, which depends on <a href="http://pypi.python.org/pypi/coverage/3.4">coverage</a>, using the standard pip/easy_install commands without much luck. The compilation phase spat out a stream of error lines followed by the final message:<br />
<code class="codecolorer text default"><span class="text">failed with error code 1</span></code>.</p>
<h3>Mac OS X 10.4 Support</h3>
<p>The first issue was that the coverage package required the optional &#8220;Mac OS X 10.4 Support&#8221; component of XCode, as hinted at by this message I found in the middle of the error log:</p>
<div class="codecolorer-container text twitlight" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">Compiling with an SDK that doesn't seem to exist: /Developer/SDKs/MacOSX10.4u.sdk<br />
Please check your Xcode installation</div></div>
<p>I did not have the 10.4 components installed on my 10.6 machine despite having the rest of the (presumably 10.5+) components. This is easy to fix by re-running the XCode installation from your OS X disk and choosing the extra option.</p>
<h3>GCC Version 4.0 FTW</h3>
<p>After installing the 10.4 pieces the installation still failed, this time with the following message near the end of the error log:</p>
<div class="codecolorer-container text twitlight" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">lipo: can't figure out the architecture type of: /some/file<br />
<br />
error: command 'gcc' failed with exit status 1</div></div>
<h4>[Edit: 2011-02-25]</h4>
<p>A much cleaner way to make your system use GCC version 4.0 instead of a later version is to use the <tt>CC</tt> environment variable. Prefix your pip/easy_install command with CC=/path/to/desired/gcc-version like so:</p>
<div class="codecolorer-container bash twitlight" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #007800;">CC</span>=<span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span>gcc-<span style="color: #000000;">4.0</span> pip <span style="color: #c20cb9; font-weight: bold;">install</span> SOMETHING</div></div>
<p><strong>Try the CC environment variable approach above before you attempt the hack below.</strong></p>
<p>Google lead me to <a href="http://www.mail-archive.com/rpy-list@lists.sourceforge.net/msg02672.html">this post</a> which provided the solution, though it feels like a nasty hack.</p>
<p>My version of OS X (10.6.6) includes two versions of the gcc compiler executable in /usr/bin:</p>
<div class="codecolorer-container bash twitlight" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">$ <span style="color: #c20cb9; font-weight: bold;">ls</span> <span style="color: #660033;">-al</span> <span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>bin <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">grep</span> <span style="color: #c20cb9; font-weight: bold;">gcc</span><br />
lrwxr-xr-x &nbsp; &nbsp; <span style="color: #000000;">1</span> root &nbsp; wheel &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000000;">7</span> <span style="color: #000000;">29</span> Jan <span style="color: #000000;">10</span>:01 <span style="color: #c20cb9; font-weight: bold;">cc</span> -<span style="color: #000000; font-weight: bold;">&gt;</span> gcc-<span style="color: #000000;">4.2</span><br />
lrwxr-xr-x &nbsp; &nbsp; <span style="color: #000000;">1</span> root &nbsp; wheel &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000000;">7</span> <span style="color: #000000;">29</span> Jan <span style="color: #000000;">10</span>:01 <span style="color: #c20cb9; font-weight: bold;">gcc</span> -<span style="color: #000000; font-weight: bold;">&gt;</span> gcc-<span style="color: #000000;">4.2</span><br />
<span style="color: #660033;">-rwxr-xr-x</span> &nbsp; &nbsp; <span style="color: #000000;">1</span> root &nbsp; wheel &nbsp; &nbsp; &nbsp; <span style="color: #000000;">97392</span> <span style="color: #000000;">18</span> May &nbsp;<span style="color: #000000;">2009</span> gcc-<span style="color: #000000;">4.0</span><br />
<span style="color: #660033;">-rwxr-xr-x</span> &nbsp; &nbsp; <span style="color: #000000;">1</span> root &nbsp; wheel &nbsp; &nbsp; &nbsp;<span style="color: #000000;">166128</span> <span style="color: #000000;">18</span> May &nbsp;<span style="color: #000000;">2009</span> gcc-<span style="color: #000000;">4.2</span><br />
. . .</div></div>
<p>The gcc symlink points to gcc-4.2 but only the gcc-4.0 version successfully compiles the package. I <strong>temporarily</strong> moved the original gcc symlink out of the way and created a new one pointing to the 4.0 version, like so:</p>
<div class="codecolorer-container bash twitlight" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">$ <span style="color: #7a0874; font-weight: bold;">cd</span> <span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>bin<br />
$ <span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #c20cb9; font-weight: bold;">mv</span> <span style="color: #c20cb9; font-weight: bold;">gcc</span> gcc_orig<br />
$ <span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #c20cb9; font-weight: bold;">ln</span> <span style="color: #660033;">-s</span> gcc-<span style="color: #000000;">4.0</span> <span style="color: #c20cb9; font-weight: bold;">gcc</span></div></div>
<p>I was then able to install the nose-cov package using pip and it ran just fine. Great!</p>
<p>Finally I replaced the original symlink, because forgetting to do so would almost certainly cause something else to break sooner or later:</p>
<div class="codecolorer-container bash twitlight" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">$ <span style="color: #7a0874; font-weight: bold;">cd</span> <span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>bin<br />
$ <span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #c20cb9; font-weight: bold;">rm</span> <span style="color: #c20cb9; font-weight: bold;">gcc</span><br />
$ <span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #c20cb9; font-weight: bold;">mv</span> gcc_orig <span style="color: #c20cb9; font-weight: bold;">gcc</span></div></div>
<p>So in the end my /usr/bin directory looks exactly the same as it used to and the package is installed. Time to go do some real work.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/postpast?a=GdMG2ABwmFg:NvtU-LRJWqQ:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/postpast?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/postpast?a=GdMG2ABwmFg:NvtU-LRJWqQ:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/postpast?i=GdMG2ABwmFg:NvtU-LRJWqQ:D7DqB2pKExk" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/postpast/~4/GdMG2ABwmFg" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.jamesmurty.com/2011/01/29/work-around-osx-lipo-figure-out-architecture-type/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>JetS3t 0.8.0, now with extra Google</title>
		<link>http://www.jamesmurty.com/2010/10/03/jets3t-0-8-0/</link>
		<comments>http://www.jamesmurty.com/2010/10/03/jets3t-0-8-0/#comments</comments>
		<pubDate>Mon, 04 Oct 2010 03:56:51 +0000</pubDate>
		<dc:creator>James Murty</dc:creator>
				<category><![CDATA[Cloud Computing]]></category>
		<category><![CDATA[Coding]]></category>
		<category><![CDATA[JetS3t]]></category>

		<guid isPermaLink="false">http://www.jamesmurty.com/?p=541</guid>
		<description><![CDATA[I have released the newest version of JetS3t, version 0.8.0. Real Google Storage support Amongst many other things, this release is the first to include native support for Google Storage for Developers (GS). This means that you can now interact &#8230; <a href="http://www.jamesmurty.com/2010/10/03/jets3t-0-8-0/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>I have released the newest version of JetS3t, <a href="http://jets3t.s3.amazonaws.com/downloads.html">version <strong>0.8.0</strong></a>.</p>
<h3>Real Google Storage support</h3>
<p>Amongst many other things, this release is the first to include native support for <a href="http://code.google.com/apis/storage/">Google Storage for Developers</a> (GS). This means that you can now interact with GS using its own API instead of relying on its (mostly) S3-compatible API. Take a look at the <a href="http://jets3t.s3.amazonaws.com/toolkit/code-samples.html#gs-connect">GS sample code</a>.</p>
<p>I would like to thank the Google developers who helped make this possible.</p>
<h3>Major changes &#8212; Take care</h3>
<p>This release includes more changes to the underlying JetS3t codebase than I&#8217;ve made in a long time, hence the move to version 0.8.x. A broad refactoring was necessary to add the brand new GoogleStorageService, and it&#8217;s related Google-specific features, in a relatively sane way.</p>
<p>The <b>advantages</b> of all these changes are:</p>
<ul>
<li>JetS3t now has generic storage service, bucket, object, and multi-threading classes to simplify working with different providers, Amazon S3 or Google Storage</li>
<li>We have finally dropped support for JDK version 1.4 and moved to Java 6+, so we can take advantage of newer language and library features (generics, at last!)
</ul>
<p>The <b>disadvantages</b> of the rework are:</p>
<ul>
<li>We have definitely broken backwards-compatibility for some folks who use older JDKs. Sorry about that</li>
<li>Despite our best intentions we may have broken backwards-compatibility in non-obvious places</li>
</ul>
<p>This release is likely to be more buggy and less stable than you&#8217;ve come to expect from JetS3t. Before you upgrade, be sure to read the full <a href="http://jets3t.s3.amazonaws.com/RELEASE_NOTES.txt">RELEASE_NOTES.txt</a> document and do plenty of testing.</p>
<p>And, of course, <a href="https://bitbucket.org/jmurty/jets3t/issues?status=new&#038;status=open">file bugs</a> if you find any.</p>
<h3>Get the code</h3>
<p>Visit the JetS3t web site to <a href="http://jets3t.s3.amazonaws.com/downloads.html">download the latest release</a>, and to view the latest <a href="http://jets3t.s3.amazonaws.com/toolkit/code-samples.html">code samples</a> and <a href="http://jets3t.s3.amazonaws.com/api/index.html">API Javadoc</a>.</p>
<p>The latest version should be available from the official Maven2 repository within a few days.</p>
<h3>Change Summary</h3>
<p>Here is a summary of new features and changes in this release.</p>
<p>Potentially backwards-incompatible changes:</p>
<ul>
<li>Wide-ranging code changes made adding support for Google Storage may lead to API incompatibilities</li>
<li>JetS3t now requires Java 6+, it is no longer compatible with JDK 1.4</li>
<li>Changed property names:
<ul>
<li>s3service.internal-error-retry-max => storage-service.internal-error-retry-max</li>
<li>s3service.stream-retry-buffer-size => uploads.stream-retry-buffer-size</li>
<li>s3service.defaultStorageClass => s3service.default-storage-class</li>
</ul>
<li>Removed antiquated and unsupported SOAPS3Service</li>
<li>Methods for setting and using AWS DevPay credentials moved from S3Service to RestS3Service</li>
<li>Deprecated a range of S3-specific classes, where provider-agnostic implementations are now available</li>
</ul>
<p>New support for Google Storage provider:</p>
<ul>
<li>Native Google Storage service and ACL implementations: GoogleStorageService, GSAccessControlList</li>
<li>Generic bucket, object, and service classes for interacting with either of the S3 or Google Storage services</li>
<li>Provider-agnostic multi-threaded services: ThreadedStorageService, SimpleThreadedStorageService</li>
<li>Almost all utility classes are compatible with both the S3 and Google Storage services</li>
</ul>
<p>Bug fixes:</p>
<ul>
<li>CloudFrontService: URL signing API changed to support HTTPS and RTMP resources, not just HTTP ones</li>
</ul>
<p>New toolkit functionality:</p>
<ul>
<li>RestS3Service: supports for bucket access policies</li>
<li>CloudFrontService: support for Default Root Object and object invalidation</li>
<li>FileComparer utility and JetS3t apps now uses a trailing slash to denote directory place-holder objects, instead of the custom &#8220;application/x-directory&#8221; content-type</li>
</ul>
<p>Cockpit application updates:</p>
<ul>
<li>Log in to either Amazon S3 or Google Storage services via GUI</li>
<li>Manage a CloudFront distribution&#8217;s Default Root Object</li>
</ul>
<p>Synchronize application updates:</p>
<ul>
<li>Fully supports new GoogleStorageService, allowing synchronization with Google Storage via its native API</li>
<li>Choose target service end-point, Amazon S3 or Google Storage, with the &#8211;provider command argument</li>
</ul>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/postpast?a=f3h4lqvZy5s:84pEr_dzR5s:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/postpast?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/postpast?a=f3h4lqvZy5s:84pEr_dzR5s:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/postpast?i=f3h4lqvZy5s:84pEr_dzR5s:D7DqB2pKExk" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/postpast/~4/f3h4lqvZy5s" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.jamesmurty.com/2010/10/03/jets3t-0-8-0/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>JetS3t 0.7.4</title>
		<link>http://www.jamesmurty.com/2010/07/19/jets3t-0-7-4/</link>
		<comments>http://www.jamesmurty.com/2010/07/19/jets3t-0-7-4/#comments</comments>
		<pubDate>Tue, 20 Jul 2010 05:23:05 +0000</pubDate>
		<dc:creator>James Murty</dc:creator>
				<category><![CDATA[AWS]]></category>
		<category><![CDATA[JetS3t]]></category>

		<guid isPermaLink="false">http://www.jamesmurty.com/?p=528</guid>
		<description><![CDATA[The latest release of JetS3t, version 0.7.4, was released over the weekend. Bug fixes: Shell scripts are more compatible with Cygwin New toolkit functionality: Added support for the new Reduced Redundancy Storage (RRS) class for objects CloudFrontService: Support for HTTPS-only &#8230; <a href="http://www.jamesmurty.com/2010/07/19/jets3t-0-7-4/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>The latest release of JetS3t, <a href="http://jets3t.s3.amazonaws.com/downloads.html">version <strong>0.7.4</strong></a>, was released over the weekend.</p>
<p>Bug fixes:</p>
<ul>
<li>Shell scripts are more compatible with Cygwin</li>
</ul>
<p>New toolkit functionality:</p>
<ul>
<li>Added support for the new <a href="http://jets3t.s3.amazonaws.com/toolkit/code-samples.html#rrs">Reduced Redundancy Storage (RRS)</a> class for objects</li>
<li>CloudFrontService: Support for <strong>HTTPS-only distributions</strong> and logging of streaming distributions</li>
<li>Added support for buckets located in the Asia Pacific (Singapore) location &#8220;ap-southeast-1&#8243;</li>
<li>Improved compatibility with Eucalyptus/Walrus</li>
</ul>
<p>Cockpit application updates:</p>
<ul>
<li>Reduced Redundancy Storage class</li>
<li>Buckets located in the Asia Pacific (Singapore) location</li>
<li>HTTPS-only CloudFront distributions</li>
</ul>
<p>Synchronize application updates:</p>
<ul>
<li>Allow synchronization with third-party buckets that are not owned by the user</li>
</ul>
<p>Other notes:</p>
<ul>
<li>CloudFrontService API changes may break backwards-compatibility</li>
<li>SOAPService is deprecated and will soon be removed from the toolkit</li>
</ul>
<p>Visit the JetS3t web site to <a href="http://jets3t.s3.amazonaws.com/downloads.html">download the latest release</a> and view the latest <a href="http://jets3t.s3.amazonaws.com/toolkit/code-samples.html">code samples</a> and <a href="http://jets3t.s3.amazonaws.com/api/index.html">API Javadoc</a>. The latest version should also be available from the official Maven2 repository by now.</p>
<p>Read about the complete list of changes in the <a href="http://jets3t.s3.amazonaws.com/RELEASE_NOTES.txt">release notes</a>, and visit the <a href="http://bitbucket.org/jmurty/jets3t/">development site</a> to submit bug reports or help out with the project.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/postpast?a=Hqi8HIONHyk:WF_XNAd_Nm0:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/postpast?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/postpast?a=Hqi8HIONHyk:WF_XNAd_Nm0:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/postpast?i=Hqi8HIONHyk:WF_XNAd_Nm0:D7DqB2pKExk" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/postpast/~4/Hqi8HIONHyk" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.jamesmurty.com/2010/07/19/jets3t-0-7-4/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>JetS3t Supports "Reduced Redundancy" Storage</title>
		<link>http://www.jamesmurty.com/2010/05/19/jets3t-supports-reduced-redundancy-storage/</link>
		<comments>http://www.jamesmurty.com/2010/05/19/jets3t-supports-reduced-redundancy-storage/#comments</comments>
		<pubDate>Thu, 20 May 2010 06:16:15 +0000</pubDate>
		<dc:creator>James Murty</dc:creator>
				<category><![CDATA[JetS3t]]></category>

		<guid isPermaLink="false">http://www.jamesmurty.com/?p=514</guid>
		<description><![CDATA[As of a few minutes ago the latest JetS3t code includes support for a new S3 feature called Reduced Redundancy Storage. If you keep non-vital data in S3 you can now choose to accept &#8220;reduced redundancy&#8221; for this data in &#8230; <a href="http://www.jamesmurty.com/2010/05/19/jets3t-supports-reduced-redundancy-storage/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>As of a few minutes ago the latest JetS3t code includes support for a new S3 feature called Reduced Redundancy Storage. If you keep non-vital data in S3 you can now choose to accept &#8220;reduced redundancy&#8221; for this data in return for a cheaper storage rate.</p>
<p>Accept a little more risk, save some bucks. For many S3 customers this will be an attractive option.</p>
<p>See Amazon&#8217;s <a href="http://aws.typepad.com/aws/2010/05/new-amazon-s3-reduced-redundancy-storage-rrs.html">RRS blog post</a> for more information.</p>
<p>Below is a brief overview of how you can use the feature in JetS3t once you have <a href="http://bitbucket.org/jmurty/jets3t/wiki/Build_Instructions">downloaded and built the latest code</a>.</p>
<h3>Cockpit</h3>
<p>The Cockpit application has support for the new storage class in a few places:</p>
<ul>
<li>In the preferences you can choose the default storage class to apply when uploading objects</li>
<li>the Copy or Move Objects dialog allows you to choose the storage class for destination objects. This makes it easy to apply the cheaper storage option to many objects, you simply <strong>copy</strong> the objects in-place after selected the REDUCED_REDUNDANCY storage class</li>
<li>each object&#8217;s current storage class is now shown in the Object Attributes dialog.</li>
</ul>
<h3>API</h3>
<p>In the API you set the storage class of an object prior to uploading it:</p>
<div class="codecolorer-container java twitlight" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="java codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #666666; font-style: italic;">// Create an object as usual</span><br />
S3Object object <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> S3Object<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;my-object&quot;</span>, <span style="color: #0000ff;">&quot;some data&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #666666; font-style: italic;">// Set the non-default storage class prior to upload</span><br />
object.<span style="color: #006633;">setStorageClass</span><span style="color: #009900;">&#40;</span><br />
&nbsp; &nbsp; S3Object.<span style="color: #006633;">STORAGE_CLASS_REDUCED_REDUNDANCY</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #666666; font-style: italic;">// Upload as usual</span><br />
s3Service.<span style="color: #006633;">putObject</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;bucket-name&quot;</span>, object<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></div></div>
<p>To apply the new storage class to existing objects you call the normal RestS3Service copyObject or moveObject methods after setting the storage class attribute of each destination object.</p>
<p>To check the storage class an object is stored under you perform a bucket listing then call the S3Object&#8217;s getStorageClass method:</p>
<div class="codecolorer-container java twitlight" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="java codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">S3Object<span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> objects <span style="color: #339933;">=</span> s3Service.<span style="color: #006633;">listObjects</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;bucket-name&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #000000; font-weight: bold;">for</span> <span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">int</span> i <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span> i <span style="color: #339933;">&lt;</span> objects.<span style="color: #006633;">length</span><span style="color: #339933;">;</span> i<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #003399;">System</span>.<span style="color: #006633;">out</span>.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span>objects<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span>.<span style="color: #006633;">getKey</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">+</span> <span style="color: #0000ff;">&quot;: &quot;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #339933;">+</span> objects<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span>.<span style="color: #006633;">getStorageClass</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span></div></div>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/postpast?a=5evTKLvPqzo:y80eGqC_l7o:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/postpast?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/postpast?a=5evTKLvPqzo:y80eGqC_l7o:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/postpast?i=5evTKLvPqzo:y80eGqC_l7o:D7DqB2pKExk" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/postpast/~4/5evTKLvPqzo" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.jamesmurty.com/2010/05/19/jets3t-supports-reduced-redundancy-storage/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss><!-- Dynamic page generated in 0.703 seconds. --><!-- Cached page generated by WP-Super-Cache on 2013-05-11 18:01:36 --><!-- Compression = gzip -->
