<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="http://feeds.feedburner.com/~d/styles/rss2full.xsl" type="text/xsl" media="screen"?><?xml-stylesheet href="http://feeds.feedburner.com/~d/styles/itemcontent.css" type="text/css" media="screen"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:admin="http://webns.net/mvcb/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
<title>Notes</title>
<link>http://www.simplicidade.org/notes/</link>

<description>Building simplicidade.org: notes, projects and ocasional rants</description>
<dc:language>en-us</dc:language>
<dc:creator>melo@simplicidade.org</dc:creator>
<dc:date>2008-11-20T18:09:27+00:00</dc:date>
<admin:generatorAgent rdf:resource="http://www.movabletype.org/?v=3.2" />
<sy:updatePeriod>hourly</sy:updatePeriod>
<sy:updateFrequency>1</sy:updateFrequency>
<sy:updateBase>2000-01-01T12:00+00:00</sy:updateBase>

<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://www.simplicidade.org/notes/42.xml" type="application/rss+xml" /><feedburner:feedFlare href="http://add.my.yahoo.com/rss?url=http%3A%2F%2Fwww.simplicidade.org%2Fnotes%2F42.xml" src="http://us.i1.yimg.com/us.yimg.com/i/us/my/addtomyyahoo4.gif">Subscribe with My Yahoo!</feedburner:feedFlare><feedburner:feedFlare href="http://www.newsgator.com/ngs/subscriber/subext.aspx?url=http%3A%2F%2Fwww.simplicidade.org%2Fnotes%2F42.xml" src="http://www.newsgator.com/images/ngsub1.gif">Subscribe with NewsGator</feedburner:feedFlare><feedburner:feedFlare href="http://feeds.my.aol.com/add.jsp?url=http%3A%2F%2Fwww.simplicidade.org%2Fnotes%2F42.xml" src="http://o.aolcdn.com/favorites.my.aol.com/webmaster/ffclient/webroot/locale/en-US/images/myAOLButtonSmall.gif">Subscribe with My AOL</feedburner:feedFlare><feedburner:feedFlare href="http://www.rojo.com/add-subscription?resource=http%3A%2F%2Fwww.simplicidade.org%2Fnotes%2F42.xml" src="http://blog.rojo.com/RojoWideRed.gif">Subscribe with Rojo</feedburner:feedFlare><feedburner:feedFlare href="http://www.bloglines.com/sub/http://www.simplicidade.org/notes/42.xml" src="http://www.bloglines.com/images/sub_modern11.gif">Subscribe with Bloglines</feedburner:feedFlare><feedburner:feedFlare href="http://www.netvibes.com/subscribe.php?url=http%3A%2F%2Fwww.simplicidade.org%2Fnotes%2F42.xml" src="http://www.netvibes.com/img/add2netvibes.gif">Subscribe with Netvibes</feedburner:feedFlare><feedburner:feedFlare href="http://fusion.google.com/add?feedurl=http%3A%2F%2Fwww.simplicidade.org%2Fnotes%2F42.xml" src="http://buttons.googlesyndication.com/fusion/add.gif">Subscribe with Google</feedburner:feedFlare><feedburner:feedFlare href="http://www.pageflakes.com/subscribe.aspx?url=http%3A%2F%2Fwww.simplicidade.org%2Fnotes%2F42.xml" src="http://www.pageflakes.com/ImageFile.ashx?instanceId=Static_4&amp;fileName=ATP_blu_91x17.gif">Subscribe with Pageflakes</feedburner:feedFlare><item>
<title>Bluetooth between Macs</title>
<link>http://feeds.feedburner.com/~r/simplicidade/notes/~3/459829120/bluetooth_betwe.html</link>

<description>I paired two Macs via BlueTooth but the OBEX File Transfer service was not available. WTF? Is this some limitation of my BT dongle (I can send and receive with a mobile phone...) or something idiotic on Apple part? Any ideas?...</description>

<content:encoded><![CDATA[
<p>I paired two Macs via BlueTooth but the OBEX File Transfer service was not available. WTF?</p>

<p>Is this some limitation of my BT dongle (I can send and receive with a mobile phone...) or something idiotic on Apple part? Any ideas?</p>

<img src="http://feeds.feedburner.com/~r/simplicidade/notes/~4/459829120" height="1" width="1"/>]]></content:encoded>

<guid isPermaLink="false">919@http://www.simplicidade.org/notes/</guid>
<dc:subject>Rants</dc:subject>
<dc:date>2008-11-20T18:09:27+00:00</dc:date>


<feedburner:origLink>http://www.simplicidade.org/notes/archives/2008/11/bluetooth_betwe.html</feedburner:origLink></item>
<item>
<title>FriendFeed</title>
<link>http://feeds.feedburner.com/~r/simplicidade/notes/~3/459495760/friendfeed_1.html</link>

<description>I'm keeping track of all the stuff out there using FriendFeed. For now, it is the best service I found to do it. I'm using a Fluid SSB with the "real-time" view, and I disabled all the XMPP updates. This way, I can glance to the SSB from time to time, without the interruption of real real-time notifications. The only feature I miss, I would like to have an action "Mark as seen" at the top of the page tab (next to the "Pause updates"). This way I could glance at it, mark them as seen (this could make them...</description>

<content:encoded><![CDATA[
<p>I'm keeping track of all the stuff out there using <a href="http://friendfeed.com/">FriendFeed</a>. For now, it is the best service I found to do it.</p>

<p>I'm using a <a href="http://fluidapp.com/">Fluid</a> SSB with the <a href="http://friendfeed.com/realtime">"real-time" view</a>, and I disabled all the XMPP updates. This way, I can glance to the SSB from time to time, without the interruption of real real-time notifications.</p>

<p>The only feature I miss, I would like to have an action "Mark as seen" at the top of the page tab (next to the "Pause updates"). This way I could glance at it, mark them as seen (this could make them grey-ish) and later it would be easy to pick up where I left it.</p>

<p>Now where is the feature request button for FriendFeed?</p>

<img src="http://feeds.feedburner.com/~r/simplicidade/notes/~4/459495760" height="1" width="1"/>]]></content:encoded>

<guid isPermaLink="false">918@http://www.simplicidade.org/notes/</guid>
<dc:subject>Rants</dc:subject>
<dc:date>2008-11-20T12:12:06+00:00</dc:date>


<feedburner:origLink>http://www.simplicidade.org/notes/archives/2008/11/friendfeed_1.html</feedburner:origLink></item>
<item>
<title>Codebits 2008 XMPP presentation</title>
<link>http://feeds.feedburner.com/~r/simplicidade/notes/~3/458334817/codebits_2008_x.html</link>

<description>My "XMPP - Hands on" presentation at Codebits 2008 is online. You can find it at GitHub and download the tarball (the big Download button). Its in Portuguese so most of you can ignore the PDF and dig straight through to the code. I didn't have Keynote.app on the laptop where I wrote it so I decided to try S5 to write my slides. The HTML version is great, and with a bit of syntax highlighter even the XML examples look good. But the PDF version is very basic. I searched around for a better CSS to print S5 slides,...</description>

<content:encoded><![CDATA[
<p>My <a href="http://github.com/melo/codebits/">"XMPP - Hands on" presentation at Codebits 2008 is online</a>. You can find it at GitHub and download the tarball (the big Download button). Its in Portuguese so most of you can ignore the <a href="http://www.simplicidade.org/share/xmpp-mao_na_coisa.pdf">PDF</a> and <a href="http://github.com/melo/codebits/tree/master/2008%2Fxmpp-hands-on%2Fbots">dig straight through to the code</a>.</p>

<p>I didn't have Keynote.app on the laptop where I wrote it so I decided to try <a href="http://meyerweb.com/eric/tools/s5/">S5</a> to write my slides.</p>

<p>The HTML version is great, and with a bit of <a href="http://code.google.com/p/syntaxhighlighter/">syntax highlighter</a> even the XML examples look good.</p>

<p>But the PDF version is very basic. I searched around for a better CSS to print S5 slides, but could not find anything. Maybe CSS is just too limited for decent printing control.</p>

<p>I don't know if I'm going to use it again. The lack of a decent PDF output is a big minus. On the plus side, I really like having the full power of HTML/CSS/JS inside my presentations.</p>

<p>As for the code examples, I wrote two:</p>

<ul>
<li>a <a href="http://github.com/melo/codebits/tree/master/2008%2Fxmpp-hands-on%2Fbots%2Fhttp2xmpp">basic HTTP-to-XMPP gateway</a>: post stuff and send it via XMPP to someone;</li>
<li><a href="http://github.com/melo/codebits/tree/master/2008%2Fxmpp-hands-on%2Fbots%2Fprocess_sync">synchronize several processes to execute in a sequence</a> (for example, restart a web farm, one web server at a time) using a chat room. Includes an auction (very simple, assumes everybody plays fair) to determine the final sequence.</li>
</ul>

<p>All examples are written in Perl using the <a href="http://search.cpan.org/dist/Net-XMPP2/"><code>Net::XMPP2</code></a> framework. I made a few fixes to some of the <code>Net::XMPP2</code> modules, you can <a href="http://github.com/melo/codebits/tree/master/2008%2Fxmpp-hands-on%2Flib">find them inside the repository</a> to make running the bots easier. I'm going to send <a href="http://www.ta-sa.org/">Robin Redeker</a> (<code>Net::XMPP2</code> author) those fixes, so they should appear in a future version.</p>

<img src="http://feeds.feedburner.com/~r/simplicidade/notes/~4/458334817" height="1" width="1"/>]]></content:encoded>

<guid isPermaLink="false">917@http://www.simplicidade.org/notes/</guid>
<dc:subject>Meta</dc:subject>
<dc:date>2008-11-19T12:33:00+00:00</dc:date>


<feedburner:origLink>http://www.simplicidade.org/notes/archives/2008/11/codebits_2008_x.html</feedburner:origLink></item>
<item>
<title>MacPorts</title>
<link>http://feeds.feedburner.com/~r/simplicidade/notes/~3/456248653/macports.html</link>

<description><![CDATA[My love/hate relationship with systems like MacPorts and Fink requires an re-evaluation. I used fink a lot in the 10.2 days, and I didn't like it that much, and given that my OSS software needs where either covered on 10.4 and 10.5 or a simple ./configure --prefix=my_local_app_dir &amp;&amp; make &amp;&amp; make install away, I was always able to stay away from them. But the installation of CouchDB has a lot of dependencies, and there is no way that I'm going to try and install Erlang OTP and SpiderMonkey from source by hand. So I downloaded the MacPorts installer and run...]]></description>

<content:encoded><![CDATA[
<p>My love/hate relationship with systems like MacPorts and Fink requires an re-evaluation.</p>

<p>I used fink a lot in the 10.2 days, and I didn't like it that much, and given that my OSS software needs where either covered on 10.4 and 10.5 or a simple <code>./configure --prefix=my_local_app_dir &amp;&amp; make &amp;&amp; make install</code> away, I was always able to stay away from them.</p>

<p>But the installation of <a href="http://incubator.apache.org/couchdb/">CouchDB</a> has a lot of dependencies, and there is no way that I'm going to try and install <a href="http://erlang.org/">Erlang OTP</a> and <a href="http://www.mozilla.org/js/spidermonkey/">SpiderMonkey</a> from source by hand.</p>

<p>So I downloaded the MacPorts installer and run it only to be greeted with a message like "The following install step failed: run postflight script for MacPorts-1.6.0".</p>

<p>Our friend Google tells me that this is was <a href="http://lists.macosforge.org/pipermail/macports-users/2008-January/008215.html">known problem with the 1.6.0 installer in January of this year</a>, but the mentioned 1.6.1 installer is still not released.</p>

<p>So right now I'm trying to run the <code>postflight</code> script by hand. Lets see how that goes.</p>

<p>And by the way, for all of those that told me that "MacPorts is totally safe, it only install under <code>/opt</code> so a mere <code>rm -rf</code> will remove it from the system", I'll recommend you to <code>lsbom</code> the <code>Archive.bom</code> file inside the package, and stop saying that non-sense.</p>

<p><em>Update:</em> <code>cd /Volumes/MacPorts-1.6.0/MacPorts-1.6.0.pkg/Contents/Resources/English.lproj &amp;&amp; sudo postflight</code> seems to work.</p>

<img src="http://feeds.feedburner.com/~r/simplicidade/notes/~4/456248653" height="1" width="1"/>]]></content:encoded>

<guid isPermaLink="false">916@http://www.simplicidade.org/notes/</guid>
<dc:subject>Rants</dc:subject>
<dc:date>2008-11-17T18:11:25+00:00</dc:date>


<feedburner:origLink>http://www.simplicidade.org/notes/archives/2008/11/macports.html</feedburner:origLink></item>
<item>
<title>GTalk Videochat</title>
<link>http://feeds.feedburner.com/~r/simplicidade/notes/~3/450659440/gtalk_videochat.html</link>

<description>By now, you have probably read that GMail has added video-chat to its web interface. The blog post mentions the usual suspects: XMPP for signaling, RTP for transport and a H264/SVC codec. The implementation uses a browser plugin. Time will tell if this plugin will be bundled with Chrome (most likely) or bundled with Gears (would make sense for Google). The Mac installer includes a meta-package with two packages: Keystone.pkg and the GoogleVoiceandVideo.pkg. The Keystone.pkg includes the GoogleSoftwareUpdate.bundle that is installed at /Library/Google. Inside it has a GoogleSoftwareUpdateDaemon but so far I don't have it running on my system. The...</description>

<content:encoded><![CDATA[
<p>By now, you have probably read that <a href="http://gmailblog.blogspot.com/2008/11/say-hello-to-gmail-voice-and-video-chat.html">GMail has added video-chat to its web interface</a>.</p>

<p>The blog post mentions the usual suspects: <a href="http://xmpp.org/">XMPP</a> for signaling, RTP for transport and a H264/SVC codec. The implementation uses a browser plugin. Time will tell if this plugin will be bundled with <a href="http://www.google.com/chrome">Chrome</a> (most likely) or bundled with <a href="http://gears.google.com/">Gears</a> (would make sense for Google).</p>

<p>The Mac installer includes a meta-package with two packages: <code>Keystone.pkg</code> and the <code>GoogleVoiceandVideo.pkg</code>.</p>

<p>The <code>Keystone.pkg</code> includes the <code>GoogleSoftwareUpdate.bundle</code> that is installed at <code>/Library/Google</code>. Inside it has a <code>GoogleSoftwareUpdateDaemon</code> but so far I don't have it running on my system.</p>

<p>The <code>GoogleVoiceandVideo.pkg</code> is the real deal. It installs several things:</p>

<ul>
<li>two QuickTime components, <code>Google Camera Adapter 0</code> and <code>Google Camera Adapter 1</code>;</li>
<li>an Internet plug-in, <code>googletalkbrowserplugin.plugin</code>;</li>
<li>an <code>GoogleTalkPlugin.app</code> support application.</li>
</ul>

<p>After installation, it opened my GMail account and detected my iSight camera. I wasn't able to find someone to use it with so far, so I'll report back on the quality of the image. I expect a decent quality given the chosen codec.</p>

<p>I'm focusing on Codebits right now, so not much time to check out the XMPP part of this, but it seems to me that then reused the same signaling already used by the Google Talk client, nothing new there.</p>

<p>The big question for me is this: will other sites be able to use this plugin for their own video-chat features? I need to read the license more carefully.</p>

<p>As for Skype, it still has one advantage: I can use it without opening a browser on my Mac. But if I where them, I would start thinking about XMPP support and interoperability with Jingle, but thats just me.</p>

<p>Skype window of opportunity to be the leading XMPP client is shortening every day.</p>

<img src="http://feeds.feedburner.com/~r/simplicidade/notes/~4/450659440" height="1" width="1"/>]]></content:encoded>

<guid isPermaLink="false">915@http://www.simplicidade.org/notes/</guid>
<dc:subject>Rants</dc:subject>
<dc:date>2008-11-12T13:03:15+00:00</dc:date>


<feedburner:origLink>http://www.simplicidade.org/notes/archives/2008/11/gtalk_videochat.html</feedburner:origLink></item>
<item>
<title>Codebits 2008 counting down</title>
<link>http://feeds.feedburner.com/~r/simplicidade/notes/~3/448552465/codebits_2008_c.html</link>

<description>Codebits 2008 is this week, and although I have received a couple of ideas already for my presentation, I still need more. So get of your collective chair-interface-parts and send your ideas. Thanks!...</description>

<content:encoded><![CDATA[
<p><a href="http://codebits.sapo.pt/">Codebits 2008</a> is this week, and although <a href="http://www.simplicidade.org/notes/archives/2008/11/codebits_2008.html">I have received a couple of ideas already for my presentation</a>, I still need more.</p>

<p>So get of your collective chair-interface-parts and send your ideas.</p>

<p>Thanks!</p>

<img src="http://feeds.feedburner.com/~r/simplicidade/notes/~4/448552465" height="1" width="1"/>]]></content:encoded>

<guid isPermaLink="false">914@http://www.simplicidade.org/notes/</guid>
<dc:subject>XMPP</dc:subject>
<dc:date>2008-11-10T16:29:07+00:00</dc:date>


<feedburner:origLink>http://www.simplicidade.org/notes/archives/2008/11/codebits_2008_c.html</feedburner:origLink></item>
<item>
<title>That was quick...</title>
<link>http://feeds.feedburner.com/~r/simplicidade/notes/~3/444904630/that_was_quick.html</link>

<description>Wow... Just 48 hours after winning... change.gov is up....</description>

<content:encoded><![CDATA[
<p>Wow... Just 48 hours after winning... <a href="http://change.gov/">change.gov is up</a>.</p>

<img src="http://feeds.feedburner.com/~r/simplicidade/notes/~4/444904630" height="1" width="1"/>]]></content:encoded>

<guid isPermaLink="false">913@http://www.simplicidade.org/notes/</guid>
<dc:subject>Rants</dc:subject>
<dc:date>2008-11-07T00:32:44+00:00</dc:date>


<feedburner:origLink>http://www.simplicidade.org/notes/archives/2008/11/that_was_quick.html</feedburner:origLink></item>
<item>
<title>AnyEvent::Mojo 0.6</title>
<link>http://feeds.feedburner.com/~r/simplicidade/notes/~3/444485918/anyeventmojo_06.html</link>

<description>Uploaded to PAUSE AnyEvent::Mojo 0.6, should hit the CPAN mirrors throughout the day. Update: uploaded 0.6001, with an attempted fix for some 100% CPU usage cases. The major change is the renaming of AnyEvent::Mojo to AnyEvent::Mojo::Server. There are two reasons for this change. The first is to prepare the release of AnyEvent::Mojo::Client in the next release, wrapping the Mojo::Client API. The second is to free the AnyEvent::Mojo to be used with the new functional API. Starting a Mojo server inside your AnyEvent apps is now very simple: use AnyEvent; use AnyEvent::Mojo; my $server; $server = mojo_server undef, 4323, sub {...</description>

<content:encoded><![CDATA[
<p>Uploaded to <a href="https://pause.perl.org/">PAUSE</a> <a href="http://search.cpan.org/dist/AnyEvent-Mojo/"><code>AnyEvent::Mojo</code></a> 0.6, should hit the <a href="http://cpan.org/SITES.html">CPAN mirrors</a> throughout the day.</p>

<p><em>Update:</em> uploaded 0.6001, with an attempted fix for some 100% CPU usage cases.</p>

<p>The major change is the renaming of <code>AnyEvent::Mojo</code> to <code>AnyEvent::Mojo::Server</code>.</p>

<p>There are two reasons for this change. The first is to prepare the release of <code>AnyEvent::Mojo::Client</code> in the next release, wrapping the <a href="http://search.cpan.org/dist/Mojo/lib/Mojo/Client.pm"><code>Mojo::Client</code></a> API.</p>

<p>The second is to free the <code>AnyEvent::Mojo</code> to be used with the new functional API.</p>

<p>Starting a <code>Mojo</code> server inside your <code>AnyEvent</code> apps is now very simple:</p>

<pre><code>use AnyEvent;
use AnyEvent::Mojo;

my $server; $server = mojo_server undef, 4323, sub {
  my ($self, $tx) = @_;

  $tx-&gt;res-&gt;body('Cool!');  
};

$server-&gt;run;
</code></pre>

<p>The interface is similar to <a href="http://search.cpan.org/dist/AnyEvent/lib/AnyEvent/Socket.pm"><code>AnyEvent::Socket</code></a>.</p>

<p>This is the first beta release. I don't expect to change the API in a backwards incompatible way until 1.0.</p>

<p>I do plan the following for the next releases:</p>

<ul>
<li>implement <code>AnyEvent::Mojo::Client</code> and the correspondent <code>mojo_client</code> function;</li>
<li>implement support for 100 Continue.</li>
</ul>

<p>Mojo is fun!</p>

<p>Oh, and <a href="http://news.perlfoundation.org/2008/11/2008q4_grant_proposal_the_mojo.html">please vote for the Perl Foundation grant to improve Mojo</a>.</p>

<img src="http://feeds.feedburner.com/~r/simplicidade/notes/~4/444485918" height="1" width="1"/>]]></content:encoded>

<guid isPermaLink="false">906@http://www.simplicidade.org/notes/</guid>
<dc:subject>Perl</dc:subject>
<dc:date>2008-11-06T15:52:54+00:00</dc:date>


<feedburner:origLink>http://www.simplicidade.org/notes/archives/2008/11/anyeventmojo_06.html</feedburner:origLink></item>
<item>
<title>Who needs a pony when you have a fairy?</title>
<link>http://feeds.feedburner.com/~r/simplicidade/notes/~3/442294244/who_needs_a_pon.html</link>

<description>The Django people came up with a new logo for the project, a magical pony. Its nice and all, but it doesn't beat the "Best logo of all times, in the Software category"-contest. That prize is still clearly in the hands of SQL::Translator. Sorry guys, but bonus points for effort. The color of the first version was a step in the right direction....</description>

<content:encoded><![CDATA[
<p>The <a href="http://avalonstar.com/blog/2008/sep/9/web-framework-ponies/">Django people came up with a new logo for the project</a>, <a href="http://djangopony.com/">a magical pony</a>.</p>

<p>Its nice and all, but it doesn't beat the "Best logo of all times, in the Software category"-contest. That prize is still clearly in the hands of <a href="http://sqlfairy.sourceforge.net/">SQL::Translator</a>.</p>

<p>Sorry guys, but bonus points for effort. The color of the first version was a step in the right direction.</p>

<img src="http://feeds.feedburner.com/~r/simplicidade/notes/~4/442294244" height="1" width="1"/>]]></content:encoded>

<guid isPermaLink="false">905@http://www.simplicidade.org/notes/</guid>
<dc:subject>Fun</dc:subject>
<dc:date>2008-11-04T17:24:11+00:00</dc:date>


<feedburner:origLink>http://www.simplicidade.org/notes/archives/2008/11/who_needs_a_pon.html</feedburner:origLink></item>
<item>
<title>AnyEvent::Mojo now with resumable requests</title>
<link>http://feeds.feedburner.com/~r/simplicidade/notes/~3/442007771/anyeventmojo_no.html</link>

<description><![CDATA[I've uploaded to PAUSE (give it a couple of hours to appear on your local CPAN mirrors) the latest release (0.5) of AnyEvent::Mojo. The biggest change is the new resumable requests. After your handler is called, you can pause the connection, do other stuff using the AnyEvent asynchrounous nature, and when you are ready to send back the response, you can resume the request. In pratical terms, this is now possible: sub my_handler_cb { my ($self, $tx) = @_; # Pause the connection while we HTTP GET our information $tx-&gt;connection-&gt;pause; # This HTTP get is done asynchronously http_get $status_url, sub...]]></description>

<content:encoded><![CDATA[
<p>I've uploaded to <a href="https://pause.perl.org">PAUSE</a> (give it a couple of hours to appear on your <a href="http://cpan.org/SITES.html">local CPAN mirrors</a>) the latest release (0.5) of <a href="http://search.cpan.org/dist/AnyEvent-Mojo/"><code>AnyEvent::Mojo</code></a>.</p>

<p>The biggest change is the new resumable requests. After your handler is called, you can pause the connection, do other stuff using the AnyEvent asynchrounous nature, and when you are ready to send back the response, you can resume the request.</p>

<p>In pratical terms, this is now possible:</p>

<pre><code>sub my_handler_cb {
    my ($self, $tx) = @_;

  # Pause the connection while we HTTP GET our information
  $tx-&gt;connection-&gt;pause;

  # This HTTP get is done asynchronously
  http_get $status_url, sub {
      my ($data) = @_;
    my $res = $tx-&gt;res;


      if (!defined $data) {
        $res-&gt;code(503);
      }
      else {
        $res-&gt;body($data);
      }

      # Ok, the response will be sent now
      $tx-&gt;connection-&gt;resume;
  }

  # We paused the connection so we can return
  return;
}
</code></pre>

<p>While the inner <code>http_get</code> is going on, the <code>AnyEvent::Mojo</code> server can handle other requests.</p>

<p>This allows you to keep several thousands of requests going on without any effort at all.</p>

<p>I'm still labeling <code>AnyEvent::Mojo</code> as alpha. The interface will change one last time for 0.6. After that it should be beta time until 1.0.</p>

<p>I need to find a decent WebSockets client implementation (or some sort of long-pooling client) to make a decent application with this. Any recomendations?</p>

<img src="http://feeds.feedburner.com/~r/simplicidade/notes/~4/442007771" height="1" width="1"/>]]></content:encoded>

<guid isPermaLink="false">904@http://www.simplicidade.org/notes/</guid>
<dc:subject>Perl</dc:subject>
<dc:date>2008-11-04T11:48:31+00:00</dc:date>


<feedburner:origLink>http://www.simplicidade.org/notes/archives/2008/11/anyeventmojo_no.html</feedburner:origLink></item>
<item>
<title>Codebits 2008</title>
<link>http://feeds.feedburner.com/~r/simplicidade/notes/~3/441112057/codebits_2008.html</link>

<description>Next week I'll be attending the 2008 edition of Codebits. I also have a slot to talk about XMPP and this is where you can help. I don't want to do another abstract talk about XMPP, but instead I want to write code that you would like to see. So if there is some XMPP-based functionality that you want to see how you can get it done, ping me or email me with the high-level details. I'll take all the projects I can cover in an hour and present my skeleton or even complete solution at the conference and discuss...</description>

<content:encoded><![CDATA[
<p>Next week I'll be attending the <a href="http://codebits.sapo.pt/">2008 edition of Codebits</a>.</p>

<p>I also have a <a href="http://codebits.sapo.pt/intra/s/speaker/31">slot to talk about XMPP</a> and this is where you can help.</p>

<p>I don't want to do another abstract talk about XMPP, but instead I want to write code that you would like to see.</p>

<p>So if there is some XMPP-based functionality that you want to see how you can get it done, <a href="xmpp:melo@simplicidade.org?roster">ping me</a> or  <a href="mailto:melo@simpicidade.org?subject=XMPP%20idea">email me</a> with the high-level details.</p>

<p>I'll take all the projects I can cover in an hour and present my skeleton or even complete solution at the conference and discuss why it was done that way.</p>

<p>All the code will be available before the presentation so you can also follow along.</p>

<img src="http://feeds.feedburner.com/~r/simplicidade/notes/~4/441112057" height="1" width="1"/>]]></content:encoded>

<guid isPermaLink="false">903@http://www.simplicidade.org/notes/</guid>
<dc:subject>XMPP</dc:subject>
<dc:date>2008-11-03T16:25:45+00:00</dc:date>


<feedburner:origLink>http://www.simplicidade.org/notes/archives/2008/11/codebits_2008.html</feedburner:origLink></item>
<item>
<title>Kids are my favorite anti-RSI tool</title>
<link>http://feeds.feedburner.com/~r/simplicidade/notes/~3/440910499/kids_are_my_fav.html</link>

<description>Nothing else to see, move along....</description>

<content:encoded><![CDATA[
<p>Nothing else to see, move along.</p>

<img src="http://feeds.feedburner.com/~r/simplicidade/notes/~4/440910499" height="1" width="1"/>]]></content:encoded>

<guid isPermaLink="false">902@http://www.simplicidade.org/notes/</guid>
<dc:subject>Life</dc:subject>
<dc:date>2008-11-03T12:22:36+00:00</dc:date>


<feedburner:origLink>http://www.simplicidade.org/notes/archives/2008/11/kids_are_my_fav.html</feedburner:origLink></item>
<item>
<title>What he said</title>
<link>http://feeds.feedburner.com/~r/simplicidade/notes/~3/440844787/what_he_said.html</link>

<description>Although I like GPLv2, since the first I read the GPLv3 I got a sense of dread. I couldn't put my finger on it. Fortunately someone did, and I can just point to it and say "thats what I wanted to say". Update: and by the way, if you want to see the entire Obama speach that he talks about: Go to Obama faith issue section of his website; click on the "Watch Videos"; scroll all the way down on the video selection box. Its the last one. Direct link to Obama Call to Renewal speech....</description>

<content:encoded><![CDATA[
<p>Although I like GPLv2, since the first I read the GPLv3 I got a sense of dread. I couldn't put my finger on it.</p>

<p><a href="http://torvalds-family.blogspot.com/2008/11/black-and-white.html">Fortunately someone did</a>, and I can just point to it and say "thats what I wanted to say".</p>

<p><em>Update</em>: and by the way, if you want to see the entire Obama speach that he talks about:</p>

<ul>
<li>Go to <a href="http://www.barackobama.com/issues/faith/">Obama faith issue section</a> of his website;</li>
<li>click on the "Watch Videos";</li>
<li>scroll all the way down on the video selection box. Its the last one.</li>
</ul>

<p>Direct link to <a href="http://link.brightcove.com/services/link/bcpid1358313999/bclid933143286/bctid416343938">Obama Call to Renewal speech</a>.</p>

<img src="http://feeds.feedburner.com/~r/simplicidade/notes/~4/440844787" height="1" width="1"/>]]></content:encoded>

<guid isPermaLink="false">901@http://www.simplicidade.org/notes/</guid>
<dc:subject>Rants</dc:subject>
<dc:date>2008-11-03T10:53:52+00:00</dc:date>


<feedburner:origLink>http://www.simplicidade.org/notes/archives/2008/11/what_he_said.html</feedburner:origLink></item>
<item>
<title>Other uses for Rasputine</title>
<link>http://feeds.feedburner.com/~r/simplicidade/notes/~3/440175197/other_uses_for.html</link>

<description>Rasputine was born to connect Moo/MUD/talkers to the XMPP network, but in fact its a generic Telnet-to-XMPP gateway. This opens up a lot of interesting use cases. You could add a buddy for each router that you have. Or one for each perlbal/memcached admin interface. The internals are still a bit messy but after a small cleanup, you could even have two users, with their own Jabber ID, sharing a telnet session to a router. A kind of Pair-Configuration session. Just think of all the devices you have with a Telnet administration console: Rasputine should be able to handle it....</description>

<content:encoded><![CDATA[
<p><a href="http://github.com/melo/rasputine/">Rasputine</a> <a href="http://www.simplicidade.org/notes/archives/2008/11/rasputine.html">was born to connect Moo/MUD/talkers to the XMPP network</a>, but in fact its a generic Telnet-to-XMPP gateway. This opens up a lot of interesting use cases.</p>

<p>You could add a buddy for each router that you have. Or one for each perlbal/memcached admin interface.</p>

<p>The internals are still a bit messy but after a small cleanup, you could even have two users, with their own Jabber ID, sharing a telnet session to a router. A kind of Pair-Configuration session.</p>

<p>Just think of all the devices you have with a Telnet administration console: Rasputine should be able to handle it.</p>

<img src="http://feeds.feedburner.com/~r/simplicidade/notes/~4/440175197" height="1" width="1"/>]]></content:encoded>

<guid isPermaLink="false">900@http://www.simplicidade.org/notes/</guid>
<dc:subject>Tips, Hints &amp; Tricks</dc:subject>
<dc:date>2008-11-02T18:45:56+00:00</dc:date>


<feedburner:origLink>http://www.simplicidade.org/notes/archives/2008/11/other_uses_for.html</feedburner:origLink></item>
<item>
<title>Rasputine</title>
<link>http://feeds.feedburner.com/~r/simplicidade/notes/~3/440152486/rasputine.html</link>

<description>Apparently some things never die. In January 1994, a friend of mine, Paulo Ferreira, created an online community around a Lambda Moo server. Its called Moosaico and it still kicking. I spent an enormous amount of time there and I still have fond memories of that time, of the people, the stories, everything. But access to Moosaico (and other MUD's or Talkers) is usually done with Telnet or using a client like TinyFugue or Atlantis. Keeping one of those open to be connected somehow never entered my normal workflow, so I drifted away. Its amazing that something that I was...</description>

<content:encoded><![CDATA[
<p>Apparently some things never die. In January 1994, a friend of mine, Paulo Ferreira, created an online community around a Lambda Moo server. Its called <a href="http://moosaico.com/">Moosaico</a> and it still kicking.</p>

<p>I spent an enormous amount of time there and I still have fond memories of that time, of the people, the stories, everything.</p>

<p>But access to Moosaico (and other MUD's or Talkers) is usually done with Telnet or using a client like <a href="http://tinyfugue.sourceforge.net/">TinyFugue</a> or <a href="http://www.riverdark.net/atlantis/">Atlantis</a>. Keeping one of those open to be connected somehow never entered my normal workflow, so I drifted away.</p>

<p>Its amazing that something that I was hooked on 14 years ago is still alive in me.</p>

<p>The friday something happened that will pull me back in.</p>

<p>Another friend, <a href="http://mindboosternoori.blogspot.com/">Marcos Marado</a>, commented that he was looking for a XMPP interface to his talker, Selva. I had an headache and didn't feel like working on what I was supposed to, so I took the challenge.</p>

<p>Later that afternoon, <a href="http://github.com/melo/rasputine/">Rasputine</a> was born.</p>

<p>Rasputine (or Ras, as Corto Maltese called him) is a generic Moo/MUD/Talker-to-XMPP gateway. You add a buddy to your roster and then you can use it to connect to that world.</p>

<p>For example, to log in to Moosaico, add <a href="xmpp:moosaico@rasputine.simplicidade.org?roster"><code>moosaico@rasputine.simplicidade.org</code></a> and then type <code>//connect</code>. Presto, the login window of Moosaico should be readily available. The Selva talker is available at <a href="xmpp:selva@rasputine.simplicidade.org?roster"><code>selva@rasputine.simplicidade.org</code></a>.</p>

<p>The code is still very young and feature-less. The copy that I run on my staging server already has per-user status messages and avatars, and next I plan to implement auto-connect (probably even <a href="http://xmpp.org/extensions/xep-0100.html">XEP-0100</a> support).</p>

<p>For now, I'm just enjoying getting back to Moosaico.</p>

<p><em>Update:</em> by the way, if you want to connect your own talker/MUD/Moo, ping me via XMPP or email and I can set you up. At least to try it out.</p>

<img src="http://feeds.feedburner.com/~r/simplicidade/notes/~4/440152486" height="1" width="1"/>]]></content:encoded>

<guid isPermaLink="false">899@http://www.simplicidade.org/notes/</guid>
<dc:subject>XMPP</dc:subject>
<dc:date>2008-11-02T18:13:17+00:00</dc:date>


<feedburner:origLink>http://www.simplicidade.org/notes/archives/2008/11/rasputine.html</feedburner:origLink></item>
<item>
<title>Crazy QRCode tool</title>
<link>http://feeds.feedburner.com/~r/simplicidade/notes/~3/437941056/crazy_qrcode_to.html</link>

<description><![CDATA[Crazy... A QR Code generator that outputs HTML. To use: cpan HTML::QRCode perl -MHTML::QRCode -e 'print HTML::QRCode-&gt;new-&gt;plot($ARGV[0])' TEXT Replace TEXT with the string you want to encode. For example, a QR Code for http://www.simplicidade.org/notes/ looks like this in HTML: Who said tables where dead? Next step: search for a barcode-in-HTML generator....]]></description>

<content:encoded><![CDATA[
<p>Crazy... A <a href="http://en.wikipedia.org/wiki/QR_Code">QR Code</a> <a href="http://search.cpan.org/dist/HTML-QRCode/">generator that outputs HTML</a>.</p>

<p>To use:</p>

<pre><code>cpan HTML::QRCode
perl -MHTML::QRCode -e 'print HTML::QRCode-&gt;new-&gt;plot($ARGV[0])' TEXT
</code></pre>

<p>Replace <code>TEXT</code> with the string you want to encode. For example, a QR Code for <code>http://www.simplicidade.org/notes/</code> looks like this in HTML:</p>

<table style="margin:0;padding:0;border-width:0;border-spacing:0;"><tr style="border:0;margin:0;padding:0;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"></tr><tr style="border:0;margin:0;padding:0;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"></tr><tr style="border:0;margin:0;padding:0;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"></tr><tr style="border:0;margin:0;padding:0;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"></tr><tr style="border:0;margin:0;padding:0;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"></tr><tr style="border:0;margin:0;padding:0;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"></tr><tr style="border:0;margin:0;padding:0;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"></tr><tr style="border:0;margin:0;padding:0;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"></tr><tr style="border:0;margin:0;padding:0;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"></tr><tr style="border:0;margin:0;padding:0;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"></tr><tr style="border:0;margin:0;padding:0;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"></tr><tr style="border:0;margin:0;padding:0;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"></tr><tr style="border:0;margin:0;padding:0;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"></tr><tr style="border:0;margin:0;padding:0;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"></tr><tr style="border:0;margin:0;padding:0;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"></tr><tr style="border:0;margin:0;padding:0;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"></tr><tr style="border:0;margin:0;padding:0;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"></tr><tr style="border:0;margin:0;padding:0;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"></tr><tr style="border:0;margin:0;padding:0;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"></tr><tr style="border:0;margin:0;padding:0;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"></tr><tr style="border:0;margin:0;padding:0;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"></tr><tr style="border:0;margin:0;padding:0;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"></tr><tr style="border:0;margin:0;padding:0;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"></tr><tr style="border:0;margin:0;padding:0;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"></tr><tr style="border:0;margin:0;padding:0;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"></tr><tr style="border:0;margin:0;padding:0;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"></tr><tr style="border:0;margin:0;padding:0;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"></tr><tr style="border:0;margin:0;padding:0;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"></tr><tr style="border:0;margin:0;padding:0;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: black;"><td style="border:0;margin:0;padding:0;width:3px;height:3px;background-color: white;"></tr></table>

<p>Who said tables where dead?</p>

<p>Next step: search for a barcode-in-HTML generator.</p>

<img src="http://feeds.feedburner.com/~r/simplicidade/notes/~4/437941056" height="1" width="1"/>]]></content:encoded>

<guid isPermaLink="false">898@http://www.simplicidade.org/notes/</guid>
<dc:subject>Tips, Hints &amp; Tricks</dc:subject>
<dc:date>2008-10-31T11:29:56+00:00</dc:date>


<feedburner:origLink>http://www.simplicidade.org/notes/archives/2008/10/crazy_qrcode_to.html</feedburner:origLink></item>
<item>
<title>FriendFeed</title>
<link>http://feeds.feedburner.com/~r/simplicidade/notes/~3/437921495/friendfeed.html</link>

<description>Some days ago I found out about the real-time FriendFeed API and yesterday I decided to try it. I've setup all my feeds into my FriendFeed account and subscribed the usual suspects. Also, I used Fluid to create a SSB just for FriendFeed so it doesn't interfere with my main browser. The rate of updates is still too large for my comfort zone, specially because of twitter updates. I need to look for a way to hide them for all my contacts. After that, it should be back under control. My relation with the new social web is still undecided....</description>

<content:encoded><![CDATA[
<p>Some days ago <a href="http://blog.friendfeed.com/2008/10/keeping-it-real-with-friendfeed-real_21.html">I found out about the real-time FriendFeed API</a> and yesterday I decided to try it.</p>

<p>I've setup all my feeds into <a href="http://friendfeed.com/melo">my FriendFeed account</a> and subscribed the usual suspects. Also, I used <a href="http://fluidapp.com/">Fluid</a> to create a SSB just for FriendFeed so it doesn't interfere with my main browser.</p>

<p>The rate of updates is still too large for my comfort zone, specially because of twitter updates. I need to look for a way to hide them for all my contacts. After that,  it should be back under control.</p>

<p>My relation with the new social web is still undecided. There is a lot of very cool stuff out there, but mostly is a big black hole on my productivity, so I tend to be mostly offline.</p>

<p>Technically, it is an interesting topic. For example, the messaging core behind the the micro-blogging sites (at least the ones properly designed) is the kind of stuff that I really like to build.</p>

<p><em>Update</em>: <a href="http://www.simplicidade.org/notes/archives/2008/10/friendfeed.html">via comments</a>, <a href="http://mindboosternoori.blogspot.com/">Marcos Marado</a> saves the day. To hide Twitter updates, go to your FriendFeed homepage, hide one of your Twitter updates, and then a link "hide others like this" will show up and allow you to hide all Twitter updates. To show them again, scroll down to the end of the page, and a "Shown N hidden entries", and click "Un-hide".</p>

<img src="http://feeds.feedburner.com/~r/simplicidade/notes/~4/437921495" height="1" width="1"/>]]></content:encoded>

<guid isPermaLink="false">897@http://www.simplicidade.org/notes/</guid>
<dc:subject>Rants</dc:subject>
<dc:date>2008-10-31T11:01:12+00:00</dc:date>


<feedburner:origLink>http://www.simplicidade.org/notes/archives/2008/10/friendfeed.html</feedburner:origLink></item>
<item>
<title>git-gui screencast</title>
<link>http://feeds.feedburner.com/~r/simplicidade/notes/~3/437908621/gitgui_screenca.html</link>

<description>Yesterday, I uploaded to Vimeo a screencast showing some of the features of git-gui. With a UNIX background, and with only a brief detour to Windows NT 3.51 (the last Windows version with decent internals), I'm mostly keyboard oriented and never before I used a GUI to solve my SCM needs. This changed with git-gui. With the Stage chunk and Stage line features, I'm much more productive with git-gui, and my commit history is cleaner and more logical to follow. These features make it easy for me to commit an hours work into several discrete logical steps, and even do...</description>

<content:encoded><![CDATA[
<p>Yesterday, I uploaded to <a href="http://vimeo.com/">Vimeo</a> a <a href="http://vimeo.com/2111264">screencast showing some of the features of <code>git-gui</code></a>.</p>

<p>With a UNIX background, and with only a brief detour to Windows NT 3.51 (the last Windows version with decent internals), I'm mostly keyboard oriented and never before I used a GUI to solve my SCM needs.</p>

<p>This changed with <code>git-gui</code>. With the <em>Stage chunk</em> and <em>Stage line</em> features, I'm much more productive with <code>git-gui</code>, and my commit history is cleaner and more logical to follow.</p>

<p>These features make it easy for me to commit an hours work into several discrete logical steps, and even do a quick commit to fix a small bug without a full cycle of <code>git-stash</code>/fix/commit/<code>git-stash pop</code>.</p>

<p>Anyway, enough courtship. Enjoy.</p>

<p><object width="400" height="300">   <param name="allowfullscreen" value="true" />   <param name="allowscriptaccess" value="always" />   <param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=2111264&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=&amp;fullscreen=1" />   <embed src="http://vimeo.com/moogaloop.swf?clip_id=2111264&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=&amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="400" height="300"></embed></object><br /><a href="http://vimeo.com/2111264?pg=embed&amp;sec=2111264">git-gui screencast</a> from <a href="http://vimeo.com/pedromelo?pg=embed&amp;sec=2111264">Pedro Melo</a> on <a href="http://vimeo.com?pg=embed&amp;sec=2111264">Vimeo</a>.</p>

<img src="http://feeds.feedburner.com/~r/simplicidade/notes/~4/437908621" height="1" width="1"/>]]></content:encoded>

<guid isPermaLink="false">896@http://www.simplicidade.org/notes/</guid>
<dc:subject>Tips, Hints &amp; Tricks</dc:subject>
<dc:date>2008-10-31T10:44:47+00:00</dc:date>


<feedburner:origLink>http://www.simplicidade.org/notes/archives/2008/10/gitgui_screenca.html</feedburner:origLink></item>
<item>
<title>A nod's as good as a wink to a blind bat</title>
<link>http://feeds.feedburner.com/~r/simplicidade/notes/~3/437135337/a_nods_as_good.html</link>

<description />

<content:encoded><![CDATA[
<p><a href="http://www.flickr.com/photos/33449134@N00/2986432077" title="View 'A nod's as good as a wink to a blind bat' on Flickr.com"><img src="http://farm4.static.flickr.com/3235/2986432077_24c67bfa16.jpg" alt="A nod's as good as a wink to a blind bat" border="0" width="500" height="447" /></a></p>

<img src="http://feeds.feedburner.com/~r/simplicidade/notes/~4/437135337" height="1" width="1"/>]]></content:encoded>

<guid isPermaLink="false">895@http://www.simplicidade.org/notes/</guid>
<dc:subject>Life</dc:subject>
<dc:date>2008-10-30T17:33:42+00:00</dc:date>


<feedburner:origLink>http://www.simplicidade.org/notes/archives/2008/10/a_nods_as_good.html</feedburner:origLink></item>
<item>
<title>Bitflu</title>
<link>http://feeds.feedburner.com/~r/simplicidade/notes/~3/435834231/bitflu.html</link>

<description><![CDATA[My favorite BitTorrent client is Bitflu. It is a head-less client that runs on a server somewhere, and you can manage it using a HTTP or telnet interface. It also supports a auto-start directory where all the torrent files you drop in it will be picked up automatically. What it doesn't have is a way to upload a torrent file programatically. At least, not until today. Check out my torrent-upload branch of Bitflu. It provides a new HTTP-based API to upload a single torrent file. To use it, do this: lwp-request -c 'application/x-bittorrent' -m POST \ http://your.bitflu.site:4081/new_torrent &lt; my.torrent The...]]></description>

<content:encoded><![CDATA[
<p>My favorite <a href="http://www.bittorrent.org/">BitTorrent</a> client is <a href="http://bitflu.workaround.ch/">Bitflu</a>.</p>

<p>It is a head-less client that runs on a server somewhere, and you can manage it using a HTTP or telnet interface. It also supports a auto-start directory where all the torrent files you drop in it will be picked up automatically.</p>

<p>What it doesn't have is a way to upload a torrent file programatically.</p>

<p>At least, not until today. Check out my <a href="http://github.com/melo/bitflu/tree/torrent-upload"><code>torrent-upload</code> branch of Bitflu</a>. It provides a new HTTP-based API to upload a single torrent file.</p>

<p>To use it, do this:</p>

<pre><code>lwp-request -c 'application/x-bittorrent' -m POST \
  http://your.bitflu.site:4081/new_torrent  &lt; my.torrent
</code></pre>

<p>The lwp-request command does not support authentication. I need to hack a <code>Net::Bitflu</code> module to make this easier.</p>

<p>The patch was sent to the author, but I don't know if it is something that he is interested on or not.</p>

<img src="http://feeds.feedburner.com/~r/simplicidade/notes/~4/435834231" height="1" width="1"/>]]></content:encoded>

<guid isPermaLink="false">894@http://www.simplicidade.org/notes/</guid>
<dc:subject>Projects</dc:subject>
<dc:date>2008-10-29T13:33:43+00:00</dc:date>


<feedburner:origLink>http://www.simplicidade.org/notes/archives/2008/10/bitflu.html</feedburner:origLink></item>
<item>
<title>My current git setup</title>
<link>http://feeds.feedburner.com/~r/simplicidade/notes/~3/435718398/my_current_git.html</link>

<description>I've been using git for more than an year now, and I've settled on a repository organization that I like. The foundations of this setup are: a GitHub account: the public face of my repositories. A free account is enough, and although I don't have private repositories at GitHub, I'm using the Micro plan, a mixture of kudos to the GitHub owners, and my preference for HTTPS-based access; gitosis: manages all my git repositories, both public and private; my x-git-update-to-latest-version: I re-compile git every day with the master branch, to help catch regressions. For each project I have, I keep...</description>

<content:encoded><![CDATA[
<p>I've been using <a href="http://git-scm.com/">git</a> for more than an year now, and I've settled on a repository organization that I like.</p>

<p>The foundations of this setup are:</p>

<ul>
<li>a <a href="http://github.com/plans">GitHub account</a>: <a href="http://github.com/melo">the public face of my repositories</a>. A free account is enough, and although I don't have private repositories at GitHub, I'm using the Micro plan, a mixture of kudos to the GitHub owners, and my preference for HTTPS-based access;</li>
<li><a href="http://eagain.net/gitweb/?p=gitosis.git;a=summary">gitosis</a>: manages all my git repositories, both public and private;</li>
<li>my <a href="http://www.simplicidade.org/notes/archives/2008/09/updated_xgitupd.html"><code>x-git-update-to-latest-version</code></a>: I re-compile git every day with the master branch, to help catch regressions.</li>
</ul>

<p>For each project I have, I keep the repository on all my computers in the <code>~/work/</code> directory. Those repositories are synced between work computers (desktop at the office, and laptop everywhere else) using a <a href="http://www.cis.upenn.edu/~bcpierce/unison/">Unison</a> profile.</p>

<p>The use of Unison gives me the possibility of leaving work half done in the desktop, and finish up at home if I feel like it, without having to commit and push from one to the other.</p>

<p>On each repository, I have two main remotes configured.</p>

<p>The <code>origin</code> remote points to my gitosis setup. You can use <a href="http://www.simplicidade.org/notes/archives/2008/09/installing_gito.html">my gitosis install how-to</a> for a painless setup. In addition, I add a <code>Host</code> entry to my <code>~/.ssh/config</code> like this:</p>

<pre><code>Host git
  HostName hostname.of.server.with.gitosis
  User git
</code></pre>

<p>This allows me to use a simple <code>git:melo/repo.git</code> as a remote URL. Short and to the point.</p>

<p>The second remote, named <code>github</code>, is only created on public repositories, and points to <a href="http://github.com/melo">my GitHub account</a>.</p>

<p>Manually I add a third remote named <code>all</code>. I copy the other two remotes <code>url</code>s to it. This allows me to <code>git push all</code> and have my changes pushed to both remotes with a single command. For example, for the <a href="http://github.com/melo/anyevent--mojo/tree/master"><code>AnyEvent::Mojo</code> project</a>, I have this <code>.git/config</code> file:</p>

<pre><code>[remote "origin"]
    url = git:perl/anyevent-mojo.git
    fetch = +refs/heads/*:refs/remotes/origin/*
[remote "github"]
    url = git@github.com:melo/anyevent--mojo.git
    fetch = +refs/heads/*:refs/remotes/github/*
[remote "all"]
    url = git:perl/anyevent-mojo.git
    url = git@github.com:melo/anyevent--mojo.git
</code></pre>

<p>This setup gives me peace of mind (all my code ends up on 4 different systems), and provides a pretty face (Github) for other to use.</p>

<p>Next step: create a script to make all this a one-step process.</p>

<img src="http://feeds.feedburner.com/~r/simplicidade/notes/~4/435718398" height="1" width="1"/>]]></content:encoded>

<guid isPermaLink="false">893@http://www.simplicidade.org/notes/</guid>
<dc:subject>Tips, Hints &amp; Tricks</dc:subject>
<dc:date>2008-10-29T11:14:36+00:00</dc:date>


<feedburner:origLink>http://www.simplicidade.org/notes/archives/2008/10/my_current_git.html</feedburner:origLink></item>
<item>
<title>You go boy!</title>
<link>http://feeds.feedburner.com/~r/simplicidade/notes/~3/435693414/you_go_boy.html</link>

<description>By Christopher Hitchens Those who despise science and learning are not anti-elitist. They are morally and intellectually slothful people who are secretly envious of the educated and the cultured Nothing much to add, really. I don't get to vote on this one....</description>

<content:encoded><![CDATA[
<p>By <a href="http://www.slate.com/id/2203120/">Christopher Hitchens</a> </p>

<blockquote>
  <p>Those who despise science and learning are not anti-elitist. They are morally and intellectually slothful people who are secretly envious of the educated and the cultured</p>
</blockquote>

<p>Nothing much to add, really. I don't get to vote on this one.</p>

<img src="http://feeds.feedburner.com/~r/simplicidade/notes/~4/435693414" height="1" width="1"/>]]></content:encoded>

<guid isPermaLink="false">892@http://www.simplicidade.org/notes/</guid>
<dc:subject>Rants</dc:subject>
<dc:date>2008-10-29T10:34:42+00:00</dc:date>


<feedburner:origLink>http://www.simplicidade.org/notes/archives/2008/10/you_go_boy.html</feedburner:origLink></item>
<item>
<title>Tip: a Macbook Pro without the battery will always hybernate</title>
<link>http://feeds.feedburner.com/~r/simplicidade/notes/~3/431697364/tip_a_macbook_p.html</link>

<description>My laptop battery started expanding to new territories (the outside, really), and given that it is no longer under warranty, I ordered a new one online. But for the last week or two, I've been working on my laptop without the battery, and in the process I learned something useful. If I close the laptop lid, and wait for the light to start glowing, I can then unplug the power cord, move to a new location and plug back it again. The Macbook will use the hibernation feature so I can keep all my state even without any power. Much...</description>

<content:encoded><![CDATA[
<p>My laptop battery started expanding to new territories (the outside, really), and given that it is no longer under warranty, I ordered a new one online.</p>

<p>But for the last week or two, I've been working on my laptop without the battery, and in the process I learned something useful.</p>

<p>If I close the laptop lid, and wait for the light to start glowing, I can then unplug the power cord, move to a new location and plug back it again.</p>

<p>The Macbook will use the hibernation feature so I can keep all my state even without any power.</p>

<p>Much better than the shutdown/startup process I was using until I accidently noticed this.</p>

<img src="http://feeds.feedburner.com/~r/simplicidade/notes/~4/431697364" height="1" width="1"/>]]></content:encoded>

<guid isPermaLink="false">891@http://www.simplicidade.org/notes/</guid>
<dc:subject>Tips, Hints &amp; Tricks</dc:subject>
<dc:date>2008-10-25T14:19:29+00:00</dc:date>


<feedburner:origLink>http://www.simplicidade.org/notes/archives/2008/10/tip_a_macbook_p.html</feedburner:origLink></item>
<item>
<title>AnyEvent::Mojo uploaded</title>
<link>http://feeds.feedburner.com/~r/simplicidade/notes/~3/431693738/anyeventmojo_up.html</link>

<description>Update: uploaded version 0.04, fixes two small things: I was using pre-release 0.8 of Mojo, and apparently I don't know how to use requires in Makefile.PL, causing a stream of CPAN tester failures. Sebastian Riedel released version 0.7 of his new HTTP stack Mojo (also includes a tiny web-framework called Mojolicious). The code is very very nice and clean, and in the future you might be able to run Catalyst apps on top of it. Given that I was looking for a small web framework to run inside my long-lived AnyEvent daemons, I wrote a small glue module to run...</description>

<content:encoded><![CDATA[
<p><em>Update:</em> uploaded version 0.04, fixes two small things: I was using pre-release 0.8 of Mojo, and apparently I don't know how to use requires in Makefile.PL, causing a stream of CPAN tester failures.</p>

<p><a href="http://labs.kraih.com/blog/">Sebastian Riedel</a> <a href="http://labs.kraih.com/blog/2008/10/mojo-07-released-perl-on-rails-in-150-lines-of-code.html">released</a> <a href="http://search.cpan.org/~sri/Mojo-0.7/">version 0.7</a> of his new HTTP stack <a href="http://search.cpan.org/dist/Mojo/">Mojo</a> (also includes a tiny web-framework called <a href="http://search.cpan.org/dist/Mojo/lib/Mojolicious.pm">Mojolicious</a>).</p>

<p>The code is very very nice and clean, and in the future you might be able to run <a href="http://search.cpan.org/dist/Catalyst-Runtime/">Catalyst</a> apps on top of it.</p>

<p>Given that I was looking for a small web framework to run inside my long-lived <a href="http://search.cpan.org/dist/AnyEvent/">AnyEvent</a> daemons, I wrote a small glue module to run Mojo-apps using the <a href="http://search.cpan.org/dist/AnyEvent/lib/AnyEvent/Socket.pm">AnyEvent::Socket</a>/<a href="http://search.cpan.org/dist/AnyEvent/lib/AnyEvent/Handle.pm">AnyEvent::Handle</a> goodness.</p>

<p>The module is <a href="http://search.cpan.org/dist/AnyEvent-Mojo/">AnyEvent::Mojo</a>, and I've just uploaded release 0.2, that includes keep-alive support.</p>

<p>There are three features that I want to do before a 1.0 release:</p>

<ul>
<li>Support for 100 Continue handling: I don't use it but the <a href="http://search.cpan.org/dist/Mojo/lib/Mojo/Server/Daemon.pm">other Mojo::Server classes</a> have it;</li>
<li>Asynchronous processing of requests: you start processing a request, but decide that you need something from a network service somewhere. You can start that request, pause the Mojo transaction, and when you receive the response from the network service, you complete the Mojo transaction;</li>
<li>build a AnyEvent HTTP client using <a href="http://search.cpan.org/dist/Mojo/lib/Mojo/Client.pm">Mojo::Client</a>.</li>
</ul>

<p>Fun stuff, specially the second one.</p>

<p>Performance-wyse, I'm happy with the result so far. The most simple <a href="http://search.cpan.org/dist/Mojo/lib/Mojo/HelloWorld.pm">Mojo::HelloWorld</a> application is capable of this numbers:</p>

<pre><code># Start a server
perl -MEV -MAnyEvent::Mojo -e 'AnyEvent::Mojo-&gt;new-&gt;run' &amp;

# Benchmark
ab -k -c 10 -n 5000 http://127.0.0.1:3000/

# Executive summary
Concurrency Level:      10
Time taken for tests:   6.935770 seconds
Complete requests:      5000
Failed requests:        0
Write errors:           0
Keep-Alive requests:    0
Total transferred:      795000 bytes
HTML transferred:       190000 bytes
Requests per second:    720.90 [#/sec] (mean)
Time per request:       13.872 [ms] (mean)
Time per request:       1.387 [ms] (mean, across all concurrent requests)
Transfer rate:          111.88 [Kbytes/sec] received

# (Quad-core 2.6Ghz, Mac OS X 10.5.4, stock perl 5.8.8)
</code></pre>

<p>At 700 requests per second with a 1.3 ms delay, the overhead seems to be pretty low, for a pure Perl based HTTP 1.1 compliant server.</p>

<img src="http://feeds.feedburner.com/~r/simplicidade/notes/~4/431693738" height="1" width="1"/>]]></content:encoded>

<guid isPermaLink="false">890@http://www.simplicidade.org/notes/</guid>
<dc:subject>Perl</dc:subject>
<dc:date>2008-10-25T14:13:56+00:00</dc:date>


<feedburner:origLink>http://www.simplicidade.org/notes/archives/2008/10/anyeventmojo_up.html</feedburner:origLink></item>
<item>
<title>ADSL woes</title>
<link>http://feeds.feedburner.com/~r/simplicidade/notes/~3/431