<?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>Aaron Kavlie</title>
	<atom:link href="http://aaron.kavlie.net/feed/" rel="self" type="application/rss+xml" />
	<link>http://aaron.kavlie.net</link>
	<description>freelance web developer</description>
	<lastBuildDate>Sun, 13 Jan 2013 06:55:00 +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>
		<item>
		<title>Cyrus &#8220;Glitch&#8221; Spencer dancing &#8211; CES 2013</title>
		<link>http://aaron.kavlie.net/2013/01/ces/cyrus-glitch-spencer-dancing-ces-2013/</link>
		<comments>http://aaron.kavlie.net/2013/01/ces/cyrus-glitch-spencer-dancing-ces-2013/#comments</comments>
		<pubDate>Sun, 13 Jan 2013 06:19:33 +0000</pubDate>
		<dc:creator>Aaron Kavlie</dc:creator>
				<category><![CDATA[ces]]></category>

		<guid isPermaLink="false">http://aaron.kavlie.net/?p=340</guid>
		<description><![CDATA[Cyrus &#8220;Glitch&#8221; Spencer dancing to a dubstep mix of &#8220;Feel so Close&#8221; at the Speck booth. This was pretty awesome.]]></description>
				<content:encoded><![CDATA[<p>Cyrus &#8220;Glitch&#8221; Spencer dancing to a dubstep mix of &#8220;Feel so Close&#8221; at the Speck booth.</p>
<p>This was pretty awesome.</p>
<p><iframe width="500" height="281" src="http://www.youtube.com/embed/RC_uo7Xyspo?feature=oembed" frameborder="0" allowfullscreen></iframe></p>
]]></content:encoded>
			<wfw:commentRss>http://aaron.kavlie.net/2013/01/ces/cyrus-glitch-spencer-dancing-ces-2013/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Sony Balanced Optical SteadyShot &#8211; CES 2013</title>
		<link>http://aaron.kavlie.net/2013/01/ces/sony-balanced-optical-steadyshot-ces-2013/</link>
		<comments>http://aaron.kavlie.net/2013/01/ces/sony-balanced-optical-steadyshot-ces-2013/#comments</comments>
		<pubDate>Sun, 13 Jan 2013 05:04:11 +0000</pubDate>
		<dc:creator>Aaron Kavlie</dc:creator>
				<category><![CDATA[ces]]></category>

		<guid isPermaLink="false">http://aaron.kavlie.net/?p=334</guid>
		<description><![CDATA[This was one of the most impressive tech demos I saw at CES, for several reasons: the side by side comparison clearly showed the benefits compared to other image stabilization systems there&#8217;s no trickery here &#8212; the video cameras are actually being shaken and filming us, showing the results live there&#8217;s a tangible benefit on [...]]]></description>
				<content:encoded><![CDATA[<p>This was one of the most impressive tech demos I saw at CES, for several reasons:</p>
<ul>
<li>the side by side comparison clearly showed the benefits compared to other image stabilization systems</li>
<li>there&#8217;s no trickery here &#8212; the video cameras are actually being shaken and filming us, showing the results live</li>
<li>there&#8217;s a tangible benefit on display that anyone who&#8217;s done video will understand and appreciate</li>
</ul>
<p><iframe width="500" height="281" src="http://www.youtube.com/embed/jaG4KKCZcNo?feature=oembed" frameborder="0" allowfullscreen></iframe></p>
]]></content:encoded>
			<wfw:commentRss>http://aaron.kavlie.net/2013/01/ces/sony-balanced-optical-steadyshot-ces-2013/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Winbot Window Cleaner &#8211; CES 2013</title>
		<link>http://aaron.kavlie.net/2013/01/ces/winbot-window-cleaner-ces-2013/</link>
		<comments>http://aaron.kavlie.net/2013/01/ces/winbot-window-cleaner-ces-2013/#comments</comments>
		<pubDate>Sun, 13 Jan 2013 04:43:05 +0000</pubDate>
		<dc:creator>Aaron Kavlie</dc:creator>
				<category><![CDATA[ces]]></category>

		<guid isPermaLink="false">http://aaron.kavlie.net/?p=330</guid>
		<description><![CDATA[I know nothing about this this thing, except what it says in the name. But hey, it&#8217;s a robot. Robots are cool. Especially when they do something useful.]]></description>
				<content:encoded><![CDATA[<p>I know nothing about this this thing, except what it says in the name. But hey, it&#8217;s a robot. Robots are cool. Especially when they do something useful.</p>
<p><iframe width="500" height="281" src="http://www.youtube.com/embed/CRrCJt5Fin4?feature=oembed" frameborder="0" allowfullscreen></iframe></p>
]]></content:encoded>
			<wfw:commentRss>http://aaron.kavlie.net/2013/01/ces/winbot-window-cleaner-ces-2013/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Sennheiser booth tour video: CES 2013</title>
		<link>http://aaron.kavlie.net/2013/01/ces/sennheiser-booth-tour-video-ces-2013/</link>
		<comments>http://aaron.kavlie.net/2013/01/ces/sennheiser-booth-tour-video-ces-2013/#comments</comments>
		<pubDate>Sun, 13 Jan 2013 00:04:26 +0000</pubDate>
		<dc:creator>Aaron Kavlie</dc:creator>
				<category><![CDATA[ces]]></category>

		<guid isPermaLink="false">http://aaron.kavlie.net/?p=321</guid>
		<description><![CDATA[I went to CES for the first time this year with the Stremor crew, so we could show off our handiwork at ShowStoppers. I got a chance to get out to the show floor and shoot a few videos. Here&#8217;s the first one: a brief tour of Sennheiser&#8217;s booth where I show the general layout [...]]]></description>
				<content:encoded><![CDATA[<p>I went to CES for the first time this year with the <a href="http://www.stremor.com/">Stremor</a> crew, so we could show off our handiwork at ShowStoppers. I got a chance to get out to the show floor and shoot a few videos.</p>
<p>Here&#8217;s the first one: a brief tour of Sennheiser&#8217;s booth where I show the general layout and their featured headphones.</p>
<p><iframe width="500" height="281" src="http://www.youtube.com/embed/_azDBr-sP38?feature=oembed" frameborder="0" allowfullscreen></iframe></p>
<p>Enjoy, and watch this space for more.</p>
]]></content:encoded>
			<wfw:commentRss>http://aaron.kavlie.net/2013/01/ces/sennheiser-booth-tour-video-ces-2013/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Amazon.com just closed my seller account. No warning, no details.</title>
		<link>http://aaron.kavlie.net/2011/12/web/amazon-com-just-closed-my-seller-account-no-warning-no-details/</link>
		<comments>http://aaron.kavlie.net/2011/12/web/amazon-com-just-closed-my-seller-account-no-warning-no-details/#comments</comments>
		<pubDate>Tue, 13 Dec 2011 07:30:09 +0000</pubDate>
		<dc:creator>Aaron Kavlie</dc:creator>
				<category><![CDATA[web]]></category>

		<guid isPermaLink="false">http://aaron.kavlie.net/?p=274</guid>
		<description><![CDATA[I&#8217;ve been selling used stuff on Amazon.com off and on for well over three years now &#8212; mostly used video games, movies, accessories and such. Despite fairly hefty seller fees, it&#8217;s been a lot better than the other alternatives for me. Compared to eBay, the listing process is dramatically faster and simpler, sales prices are [...]]]></description>
				<content:encoded><![CDATA[<p>I&#8217;ve been selling used stuff on Amazon.com off and on for well over three years now &#8212; mostly used video games, movies, accessories and such. Despite fairly hefty seller fees, it&#8217;s been a lot better than the other alternatives for me. Compared to eBay, the listing process is dramatically faster and simpler, sales prices are often higher, and items stay listed (at fixed prices) until sold. Compared to craigslist, Amazon.com gets you a much wider market (helpful for obscure games &amp; accessories), and a simpler sales process. (coordinating a meeting time just to sell a $15 game? No thanks.)</p>
<p>So over the weekend I was cleaning out my office and listing some old games and controllers. Then I thought about this Lenovo ThinkPad X220 I&#8217;ve been trying to sell for months. There was a listing on Amazon.com for the X220 with a couple of other used listings, so I thought it wouldn&#8217;t hurt to give it a shot. I listed it Sunday night for $725.</p>
<p>That ThinkPad listing must have triggered an automated account check (due to the dollar amount, no doubt) that the last 3+ years of listings did not. Hours later, close to midnight, I got this cordial email from Amazon.com (emphasis mine):</p>
<blockquote><p>Hello from Amazon.</p>
<p>We are writing to let you know that we have removed your selling privileges, canceled your listings, and placed a temporary hold on any funds in your seller account.</p>
<p>We took this action because our records indicate that this account is related to another selling account that was closed by Amazon. Once selling privileges have been removed, sellers are not allowed to establish new accounts.</p>
<p>Due to the proprietary nature of our business, <strong>we do not provide detailed information on how we determine that accounts are related</strong>.</p>
<p>We encourage you to take appropriate steps to resolve any pending orders. Note that any amounts paid as a result of A-to-z Guarantee claims and chargebacks may be deducted from your seller account.</p>
<p>After 90 days, any remaining funds will be available per your settlement schedule. Once the hold has been removed, balance and settlement information will be available in the “Payments” section of your seller account. If you have questions about these funds, please write to payments-funds@amazon.com.</p>
<p>While we appreciate your interest in selling on Amazon.com, <strong>the closure of this account is a permanent action</strong>.</p>
<p>Regards,</p>
<p>Seller Performance Team<br />
Amazon.com</p>
<p>http://www.amazon.com</p></blockquote>
<p>The tone of the email didn&#8217;t give me a lot of hope. It&#8217;s clear that Amazon is not willing to provide details on how they made this determination, or leave an opportunity for appeal. And to be clear, I&#8217;m certain that I&#8217;ve tripped a false positive of some sort. <strong>I have never used another seller account on Amazon.com</strong>.</p>
<p>I logged into the seller account to see what it looked like. There was a glimmer of hope: an Appeal button. I dutifully filled out an appeal as follows:</p>
<blockquote><p>I have never had another seller account with Amazon.com. I&#8217;ve been using this account to sell stuff off and on for over three years now, without any issues. I can only assume that this was due to an automated false positive. Please review and reinstate my account.</p></blockquote>
<p>Amazon replied less than twelve hours later with this:</p>
<blockquote><p>Hello from Amazon.</p>
<p>Thank you for writing.  After a review of your account by an account specialist, we have decided not to reinstate your selling privileges.</p>
<p>We regret we are unable to provide further information on this situation. Further correspondence regarding the closure of your selling account may not be answered.</p>
<p>The closure of this account is a permanent action. Any subsequent accounts that are opened will be closed as well.</p>
<p>Regards,</p>
<p>Seller Performance Team<br />
Amazon.com<br />
<a href="http://www.amazon.com/" target="_blank">http://www.amazon.com</a></p></blockquote>
<p>So that&#8217;s that, it seems. It&#8217;s clear from the tone of these emails they are not especially sympathetic to the concerns of sellers whose accounts have been mistakenly flagged.</p>
<p>eBay &amp; Paypal have received a lot of well-deserved flak over the years, but compared to this, they come out looking good. They have email addresses and online chat systems and phone numbers answered by actual humans who provide actual details about your case. In many of the Paypal horror stories that circulate, the worst material comes from bad customer service reps. But when you deal with Amazon.com, at least as a seller, there&#8217;s no customer service rep to talk to. Cold emails like this are all you get.</p>
<p>I hope this will be helpful to two groups of people:</p>
<p>1. Sellers &#8212; look for other alternatives. If you sell on Amazon.com, don&#8217;t put all of your eggs in that basket. For me, this just meant a harder time clearing out the closet. But for someone doing a lot of sales on Amazon.com, this could cause a serious loss of business.</p>
<p>2. Amazon.com staff &#8212; seriously, just look at this from the customer&#8217;s point of view, and try to tell me this is a customer friendly process. More transparency is in order. Your secret fraud detection system is fallible, and it should be treated as such.</p>
<p>If nothing else, this has left me seriously second-guessing my loyalty to Amazon.com. They&#8217;ve been far and away my favorite Internet retailer for years, but I&#8217;m not going to be quite as eager to shop there any more, especially in categories with strong competition.</p>
<h3>Update</h3>
<p>Amazon just reactivated my account at 12:15 pm today (AZ time). I did not make any further attempts to contact Amazon after the above account, so I imagine that this was only done as a result of <a href="http://news.ycombinator.com/item?id=3347828">my post</a> hitting the front page of Hacker News. The email regarding the reactivation was as follows:</p>
<blockquote><p>Hello from Amazon.com.</p>
<p>Thank you for writing regarding your Amazon.com selling account. We have reviewed this situation and have reactivated your account.</p>
<p>We apologize for any inconvenience this has caused. In our efforts to protect our community, we sometimes err on the side of caution.</p>
<p>We appreciate your interest and wish you the best of luck selling on Amazon.com.</p></blockquote>
<p>Victory? Well, partially. I&#8217;m not totally satisfied until and unless Amazon admits to problems with their fraud detection system, and puts in place a better process for recourse. Failing that, others who don&#8217;t get this level of publicity will continue to get shafted.</p>
<h3>Update 2</h3>
<p>Here&#8217;s my blog&#8217;s visitor count by service provider, per Google Analytics. Looks like a few people at Amazon have taken notice.</p>
<p><img class="alignnone size-full wp-image-285" title="Google Analytics visitor count by service provider" src="http://aaron.kavlie.net/wp-content/uploads/2011/12/Screen-shot-2011-12-13-at-8.12.14-PM.png" alt="" width="525" height="343" /></p>
]]></content:encoded>
			<wfw:commentRss>http://aaron.kavlie.net/2011/12/web/amazon-com-just-closed-my-seller-account-no-warning-no-details/feed/</wfw:commentRss>
		<slash:comments>115</slash:comments>
		</item>
		<item>
		<title>Comparing internationalization in web frameworks</title>
		<link>http://aaron.kavlie.net/2011/11/python/comparing-internationalization-in-web-frameworks/</link>
		<comments>http://aaron.kavlie.net/2011/11/python/comparing-internationalization-in-web-frameworks/#comments</comments>
		<pubDate>Mon, 21 Nov 2011 17:58:45 +0000</pubDate>
		<dc:creator>Aaron Kavlie</dc:creator>
				<category><![CDATA[java]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[web]]></category>

		<guid isPermaLink="false">http://aaron.kavlie.net/?p=235</guid>
		<description><![CDATA[I&#8217;ve spent the better part of the last six months doing front-end development on a Java project developed with the Spring framework. We&#8217;re currently going through the process of internationalizing the application. This necessitated spending a fair amount of time combing through all the raw English strings in templates and replacing them with Spring directives, to be [...]]]></description>
				<content:encoded><![CDATA[<p>I&#8217;ve spent the better part of the last six months doing front-end development on a Java project developed with the <a href="http://www.springsource.org/">Spring</a> framework. We&#8217;re currently going through the process of internationalizing the application. This necessitated spending a fair amount of time combing through all the raw English strings in templates and replacing them with Spring directives, to be filled in by the <em>.properties</em> file for the user&#8217;s locale.</p>
<p>While there is a lot more to internationalization than replacing static text strings, it&#8217;s the first (and perhaps largest) task to tackle. Here&#8217;s what that process looks like.</p>
<p>Let&#8217;s start with a simple template like this:</p>
<pre class="brush: xml; title: ; notranslate">
&lt;ul&gt;
    &lt;li&gt;&lt;a href=&quot;${welcomeurl}&quot;&gt;Welcome&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;${registerurl}&quot;&gt;Register&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;${contacturl}&quot;&gt;Contact Us&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;${abouturl}&quot;&gt;About&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</pre>
<p>To internationalize it, you replace all of your raw text with <strong>spring:message</strong> directives as follows:</p>
<pre class="brush: xml; title: ; notranslate">
&lt;ul&gt;
    &lt;li&gt;&lt;a href=&quot;${welcomeurl}&quot;&gt;&lt;spring:message code=&quot;common_site_welcome&quot;/&gt;&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;${registerurl}&quot;&gt;&lt;spring:message code=&quot;common_site_register&quot;/&gt;&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;${contacturl}&quot;&gt;&lt;spring:message code=&quot;common_site_contact&quot;/&gt;&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;${abouturl}&quot;&gt;&lt;spring:message code=&quot;common_site_about&quot;/&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</pre>
<p>Ugh, all of my readable text replaced by XML. OK then.</p>
<p>We&#8217;re not done yet; as mentioned, some <em>.properties</em> files need to be created to fill in the proper text strings. So for US English, you would create <strong>i18n/messages_en_US.properties</strong> as follows:</p>
<pre>common_site_welcome=Welcome
common_site_register=Register
common_site_contactUs=Contact Us
common_site_about=About</pre>
<p>and for Spanish, <strong>i18n/messages_es.properties</strong> as follows:</p>
<pre>common_site_welcome=Bienvenido
common_site_register=Registro
common_site_contactUs=Contáctenos
common_site_about=Sobre</pre>
<p>and if everything is configured correctly, you now have Spanish localization for those strings. Congratulations.</p>
<h2>Enter Flask</h2>
<p>That&#8217;s not where the story ends. This is a public-facing application, and that means there&#8217;s a marketing site to go with it. It&#8217;s currently just static html, so I thought it would be best to use a simple web framework for proper i18n support (among other things). I turned to my go-to micro-framework, <a href="http://flask.pocoo.org/">Flask</a>, and set up a small sample app to test out the i18n support.</p>
<p>Flask (along with <a href="https://www.djangoproject.com/">Django</a> and many other web frameworks) uses the standard <a href="http://www.gnu.org/s/gettext/">GNU gettext</a> API for i18n. Here&#8217;s how it works. We start out much the same as in the Spring example, except with Jinja2 templates and Flask&#8217;s <strong>url_for()</strong> function:</p>
<pre class="brush: xml; title: ; notranslate">
&lt;ul&gt;
    &lt;li&gt;&lt;a href=&quot;{{ url_for('welcome') }}&quot;&gt;Welcome&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;{{ url_for('register') }}&quot;&gt;Register&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;{{ url_for('contact') }}&quot;&gt;Contact Us&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;{{ url_for('about') }}&quot;&gt;About&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</pre>
<p>now to internationalize that template, we just do this:</p>
<pre class="brush: xml; title: ; notranslate">
&lt;ul&gt;
	&lt;li&gt;&lt;a href=&quot;{{ url_for('welcome') }}&quot;&gt;{{ _('Welcome') }}&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a href=&quot;{{ url_for('register') }}&quot;&gt;{{ _('Register') }}&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a href=&quot;{{ url_for('contact') }}&quot;&gt;{{ _('Contact Us') }}&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a href=&quot;{{ url_for('about') }}&quot;&gt;{{ _('About') }}&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</pre>
<p>Very cool. I just wrap all strings with a short function (<strong>_()</strong> is the common alias for <strong>gettext()</strong>) and they&#8217;re ready for localization.</p>
<p>Now what about messages? For that, we&#8217;ll turn to the <a href="http://packages.python.org/Flask-Babel/">Flask-Babel extension</a>. After a short config file, we can do this to extract all i18n strings:</p>
<pre class="brush: plain; title: ; notranslate">
$ pybabel extract -F babel.cfg -o messages.pot .
</pre>
<p>That will give us a file with all the extracted strings from our Jinja2 template, along with some header info. What&#8217;s interesting here is the extra metadata you get with each string:</p>
<pre class="brush: plain; title: ; notranslate">
#: templates/index.html:8
msgid &quot;Welcome&quot;
msgstr &quot;&quot;

#: templates/index.html:9
msgid &quot;Register&quot;
msgstr &quot;&quot;
</pre>
<p>To generate a message file from <strong>messages.pot </strong>for a given language (Spanish again in this example), follow with this:</p>
<pre class="brush: plain; title: ; notranslate">
$ pybabel init -i messages.pot -d translations -l es
</pre>
<p>The resulting file looks much the same as <strong>messages.pot</strong>. This is the file to send off to the translator.</p>
<h2>Taking stock of the two approaches</h2>
<p>I see a number of benefits to the approach employed by Flask (and by extension, other frameworks that use gettext tools):</p>
<ol>
<li>Templates preserve the original English &#8212; that makes them easier to convert, more readable, and more searchable.</li>
<li>The Flask approach adds 11 total characters to internationalize a string; Spring adds 25 (and that assumes the variable is the same length as the original English. In a larger project the tendency will be to make it longer for pseudo-namespacing as in the example.)</li>
<li>Spring requires the programmer to define variables for every piece of static text, and manually add them to a properties file. Flask extracts strings with a single command.</li>
<li>Flask&#8217;s <strong>messages.po</strong> files include the file &amp; line number the string came from, as well as the original (English) string. The <em>.properties</em> files in Spring just have a variable name.</li>
<li>In Flask, added and changed strings can be extracted by running a <strong>pybabel update</strong> command. This will add the new strings to all translations, and mark changed text as &#8220;fuzzy&#8221;. In Spring, you have to manage additions and changes across all files by hand.</li>
</ol>
<p>I&#8217;m not able to come up with much in favor of the Spring approach honestly. The gettext method seems a lot easier and more maintainable, especially as the size of the project and number of supported languages increases.</p>
]]></content:encoded>
			<wfw:commentRss>http://aaron.kavlie.net/2011/11/python/comparing-internationalization-in-web-frameworks/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Recent developments in HTML</title>
		<link>http://aaron.kavlie.net/2011/01/web/recent-developments-in-html/</link>
		<comments>http://aaron.kavlie.net/2011/01/web/recent-developments-in-html/#comments</comments>
		<pubDate>Fri, 21 Jan 2011 15:00:03 +0000</pubDate>
		<dc:creator>Aaron Kavlie</dc:creator>
				<category><![CDATA[web]]></category>

		<guid isPermaLink="false">http://aaron.kavlie.net/?p=166</guid>
		<description><![CDATA[Google drops H.264 support; HTML5 becomes just "HTML". Thoughts on both.]]></description>
				<content:encoded><![CDATA[<h3><a href="http://blog.chromium.org/2011/01/html-video-codec-support-in-chrome.html">Google drops H.264 support in Chrome</a></h3>
<p>Plenty of tech pundits have given their two cents on Google&#8217;s turn toward WebM exclusivity, and the vibe is <a href="http://arstechnica.com/web/news/2011/01/googles-dropping-h264-from-chrome-a-step-backward-for-openness.ars">decidedly</a> <a href="http://daringfireball.net/2011/01/simple_questions">negative</a>. On the other hand, the move has garnered strong support from <a href="http://weblogs.mozillazine.org/asa/archives/2011/01/the_web_is_not_built.html">Mozilla</a> and <a href="http://my.opera.com/haavard/blog/2011/01/13/openness">Opera</a>, and not surprisingly, the <a href="https://www.fsf.org/news/supporting-webm">Free Software Foundation</a>.</p>
<p>My take on this is somewhat conflicted. <a href="http://daringfireball.net/2011/01/simple_questions">Gruber has a point</a> that content providers will continue to use H.264, and just use Flash for clients that don&#8217;t serve it directly. At least, <em>in the short term</em>. On the desktop, however, WebM is now poised to take a decided market share lead. Firefox (in 4.0 beta), Chrome and Opera are all shipping with WebM (and that exclusively); while only Safari and IE remain in the H.264 camp. IE alone <em>could</em> tip the scales in favor of H.264, but support is only coming in version 9 (still in beta). Considering the glacial pace of user adoption for new versions of IE, I&#8217;m betting that&#8217;s at least two years out.</p>
<p>There will be plenty of time for WebM to gain traction, and with Adobe soon adding WebM support to Flash, the tables could turn one day &#8212; clients not supporting WebM may default to Flash on many sites. Firefox (and likely now Google) have taken a stand against <em>ever</em> supporting H.264, but the opposite is not true for Apple and Microsoft &#8212; if WebM gains enough momentum, it&#8217;s likely that they (especially Apple) will add WebM support .</p>
<p>The mobile picture is murkier. H.264 has more of a stronghold there, due to Apple&#8217;s strong position, and the importance of hardware decoder support. Even there, word is that WebM hardware support is coming on many chipsets this year. Within the next year or two, it may be commonplace for chipsets to support both formats out of the box.</p>
<p><em>On the other hand:</em> critics have a valid point that Google&#8217;s ideological justification for this move (&#8220;hooray for open&#8221;) rings hollow, considering Google&#8217;s recent embrace of Flash. It would be one thing if Google merely tolerated Flash due to its ubiquitous use on the web, but there&#8217;s more to it than that. Does no one remember Google I/O? Google was practically gloating about Flash support on Android, and Flash support on mobile certainly isn&#8217;t the sort of obligation that it&#8217;s become on the desktop. In fact, many people (myself included) would <em>prefer</em> that mobile platforms remain Flash-free. Not only that, they also announced support for Adobe AIR on Android, trumpeting both with big shiny icons (Flash more than once). And for good measure, they invited Adobe CEO Shantanu Narayen (among others) on stage. This is far more than toleration&#8211;Google has embraced Flash as a competitive advantage against Apple. <em>Open, schmopen; we&#8217;ve got it and they don&#8217;t</em>. That was Google, circa Google I/O 2010. It&#8217;s doubtful that this move means they&#8217;ll treat Flash with any less deference.</p>
<h3><a href="http://blog.whatwg.org/html-is-the-new-html5">HTML5 now just &#8220;HTML&#8221;</a></h3>
<p>HTML5 is now a misnomer &#8212; the WHATWG, the standards body charged with defining this stuff, has decided to turn HTML into a rolling standard. There will be no HTML5.1, HTML6, or what have you. Just continuous revisions of HTML. Oddly this comes just a day after the W3C unveiled their <a href="http://www.w3.org/html/logo/">shiny new HTML5 logo</a> too.</p>
<p>This is a nice development, if only because HTML5 has become an extremely overloaded buzzword. When people say that, they could mean any number of things. Often it just means &#8220;dynamic, JavaScript-driven site.&#8221; It usually <em>doesn&#8217;t</em> mean new semantic markup elements, Web Workers, or Web Storage &#8212; all genuine constituents of the standard formerly known as HTML5. Assuming people get the message, this hopefully compel them to use more accurate terminology.</p>
<p>I&#8217;m not so optimistic about recruiters and their ilk, though. Expect to see job ads erroneously demanding HTML5 skills for some time &#8212; probably until another buzzword is found to take its place.</p>
]]></content:encoded>
			<wfw:commentRss>http://aaron.kavlie.net/2011/01/web/recent-developments-in-html/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Living the dream</title>
		<link>http://aaron.kavlie.net/2010/08/meta/living-the-dream/</link>
		<comments>http://aaron.kavlie.net/2010/08/meta/living-the-dream/#comments</comments>
		<pubDate>Thu, 26 Aug 2010 12:00:27 +0000</pubDate>
		<dc:creator>Aaron Kavlie</dc:creator>
				<category><![CDATA[meta]]></category>

		<guid isPermaLink="false">http://aaron.kavlie.net/?p=137</guid>
		<description><![CDATA[Quitting my day job to do full-time web development.]]></description>
				<content:encoded><![CDATA[<p>After a few short months of doing freelance web development, I have decided to make this a full-time gig. I am quitting my day job as a Desktop Support technician.</p>
<p>I have a few established clients already, some good leads, and some avenues in mind for self-promotion and more work. My ability to pursue leads for more work is severely constrained when this is an after-hours pursuit, not to mention my ability to devote full effort to projects for established clients. The pay is better, and the work more fulfilling. The time is right.</p>
<p>I want to thank my first few clients who have put tremendous faith in me, despite an established track record. I want to especially thank Jared at <a href="http://www.pristineauction.com">Pristine Auction</a>, who gave me the confidence to brush off my inhibitions and pursue freelancing. It&#8217;s worked out better than I could have imagined.</p>
]]></content:encoded>
			<wfw:commentRss>http://aaron.kavlie.net/2010/08/meta/living-the-dream/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Python tip: turn class methods into variables with property()</title>
		<link>http://aaron.kavlie.net/2010/06/python/python-tip-turn-class-methods-into-variables-with-property/</link>
		<comments>http://aaron.kavlie.net/2010/06/python/python-tip-turn-class-methods-into-variables-with-property/#comments</comments>
		<pubDate>Wed, 30 Jun 2010 04:14:29 +0000</pubDate>
		<dc:creator>Aaron Kavlie</dc:creator>
				<category><![CDATA[python]]></category>

		<guid isPermaLink="false">http://aaron.kavlie.net/?p=90</guid>
		<description><![CDATA[How to use the built-in property() method to give your objects a simpler and more consistent API.]]></description>
				<content:encoded><![CDATA[<p>Let&#8217;s say you&#8217;re hashing out a Python model class (<a href="http://www.djangoproject.com/">Django</a>, <a href="http://turbogears.org/">TurboGears</a>, anything &#8212; doesn&#8217;t matter). Following the <a href="http://weblog.jamisbuck.org/2006/10/18/skinny-controller-fat-model">Skinny Controller, Fat Model</a> approach, you want to add some logic and convenience methods to the model, rather than stuffing them into the one or more controllers.</p>
<p>Here&#8217;s a basic example using the <a href="http://www.sqlalchemy.org/">SQLAlchemy</a> ORM:</p>
<pre>class Product(Base):
    __tablename__ = TABLE
    id = Column(Integer, primary_key=True)
    title = Column(TITLE_FIELD, String)
    description = Column(DESC_FIELD, String)

    def get_link(self, link=ITEM_LINK):
        return link % self.id
</pre>
<p>The<strong> get_link()</strong> method calls a predefined string, and uses string formatting to insert the class variable <strong>id</strong>. You might think you could directly define this with a variable, rather than a method. Go ahead, give it a try. But <em>because it calls another (not yet defined) class variable</em>, that simply won&#8217;t work. That&#8217;s just a fundamental reality of object-oriented code, at least in the Python world.</p>
<p>So we end up with an object that works as follows, assuming <strong>item</strong> is an instance of <strong>Product</strong>:</p>
<pre>item.title
item.description
item.get_link()
</pre>
<p>That last line just doesn&#8217;t <em>feel</em> right, does it? It ought to be accessible through an attribute, rather than a method &#8212; as with the title and description. After all, we are talking about a <em>noun</em> here, not a <em>verb</em>. This works, but it&#8217;s inconsistent and inelegant.</p>
<p>Thanks to some perusal of Django models, I found the perfect solution in Python&#8217;s built-in <strong>property()</strong> method.</p>
<p>We can modify the class slightly as follows:</p>
<pre>class Product(Base):
    __tablename__ = TABLE
    id = Column(Integer, primary_key=True)
    title = Column(TITLE_FIELD, String)
    description = Column(DESC_FIELD, String)

    def _get_link(self, link=ITEM_LINK):
        return link % self.id
    link = property(_get_link)
</pre>
<p>And with that simple modification, our <strong>item</strong> instance works as follows:</p>
<pre>item.title
item.description
item.link
</pre>
<p>There, doesn&#8217;t that feel better?</p>
<p>For much more on property(), including how to use for getter <em>and</em> setter methods, and lots of other useful info, see <a href="http://adam.gomaa.us/blog/2008/aug/11/the-python-property-builtin/">this excellent post</a> courtesy of Adam Gomaa.</p>
]]></content:encoded>
			<wfw:commentRss>http://aaron.kavlie.net/2010/06/python/python-tip-turn-class-methods-into-variables-with-property/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>How to get started freelancing? Asked and answered</title>
		<link>http://aaron.kavlie.net/2010/06/freelancing/how-to-get-started-freelancing-asked-and-answered/</link>
		<comments>http://aaron.kavlie.net/2010/06/freelancing/how-to-get-started-freelancing-asked-and-answered/#comments</comments>
		<pubDate>Fri, 04 Jun 2010 20:26:21 +0000</pubDate>
		<dc:creator>Aaron Kavlie</dc:creator>
				<category><![CDATA[freelancing]]></category>

		<guid isPermaLink="false">http://aaron.kavlie.net/?p=83</guid>
		<description><![CDATA[Hacker News has become my go-to source for interesting tech news. It surfaces a much wider variety of interesting content than Techmeme, with a focus on programming-related content. The community is intelligent too, and comment threads are remarkably free of trolling. I noticed a couple of good blog posts that hit the front page by [...]]]></description>
				<content:encoded><![CDATA[<p><a href="http://news.ycombinator.com/">Hacker News</a> has become my go-to source for interesting tech news. It surfaces a much wider variety of interesting content than <a href="http://www.techmeme.com/">Techmeme</a>, with a focus on programming-related content. The community is intelligent too, and comment threads are remarkably free of trolling.</p>
<p>I noticed a couple of good blog posts that hit the front page by one <a href="http://ericharrison.info/">Eric Harrison</a>. Perusing his blog, I was struck by how open he was to helping and corresponding with fellow programmers. Exhibit A: his <a href="http://ericharrison.info/2010/05/26/i-will-mentor-you/">mentorship program</a>, whereby he&#8217;s offering to take a new programmer or two under his wing and show them the ropes. I&#8217;m probably not in the best position to submit myself for that, but another link caught my eye: <a href="http://tumblr.ericharrison.info/ask">Ask Me Anything</a>, right in the sidebar. I was under the (mistaken) impression from his <a href="http://ericharrison.info/2010/04/21/how-i-build-php-applications/">PHP post</a> that he was a freelancer, so I submitted an anonymous post asking how to get started.</p>
<p>The form directed to a virtual black hole. Did it get through? Would I get an answer, and if so, where? I was very happy to see a response&#8230; and a very thorough one, at that!</p>
<p>A lot of the tips he offers are going to be really tough to execute well, especially given my current time constraints. But I like this one in particular:</p>
<blockquote><p><strong>Bonus tip</strong>:  <strong>Make friends with small design shops</strong>. I’m  good  friends with Jake Stutzman over at <a title="Elevate (Worlds  Greatest  Web-Design and Development Firm)" href="http://elevatevc.com/">Elevate</a>.   He’s primary a designer, but often has clients who need to have  designs  and development. Being friends with him (and making sure that  all the  work I produce makes HIM look good) has the potential to land  me as much  freelance work as I could ever hope for. This sort of  interaction  between you (the developer) and other shops (designers,  etc) is crucial  to building a successful freelance business. If you  have clients that  want design work to go with your development, pass  that business along  to your designers. This way, everyone wins.</p></blockquote>
<p><a href="http://ericharrison.info/2010/06/01/ama-how-do-i-get-started-as-a-freelance-web-developer/">Read the rest here</a>.</p>
<p>There&#8217;s a whole cluster of good tech &amp; design firms in the area, the most visible of which are the folks associated with <a href="http://gangplankhq.com/">Gangplank</a>. The only reason I haven&#8217;t made inroads already is my own introversion and lack of initiative.</p>
<p>But now is as good a time to start as any. Any designers that need coding work? I&#8217;m a coder that needs design work. I&#8217;m affordable. <a href="http://aaron.kavlie.net/contact/">Let&#8217;s talk</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://aaron.kavlie.net/2010/06/freelancing/how-to-get-started-freelancing-asked-and-answered/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

<!-- Dynamic page generated in 0.663 seconds. -->
<!-- Cached page generated by WP-Super-Cache on 2013-05-20 23:29:17 -->

<!-- Compression = gzip -->