<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-3676448</id><updated>2012-01-10T00:34:09.150Z</updated><category term='VBScript'/><category term='sysadmin'/><category term='transport'/><category term='bosnia'/><category term='movies'/><category term='books'/><category term='Frisco'/><category term='development'/><category term='GooglePlus'/><category term='jeBlogger'/><category term='privacy'/><category term='Kate'/><category term='cartoons'/><category term='Windows'/><category term='pythonaro'/><category term='webmail'/><category term='bambini'/><category term='Reddit'/><category term='N900'/><category term='springsteen'/><category term='video'/><category term='tarfile'/><category term='unicode'/><category term='greed'/><category term='feedreaders'/><category term='GMail'/><category term='sched'/><category term='dcom'/><category term='sport'/><category term='i18n'/><category term='hdd'/><category term='MSN'/><category term='java'/><category term='ukip'/><category term='kmymoney'/><category term='rants'/><category term='putty'/><category term='gSculpt'/><category term='philosophy'/><category term='django'/><category term='chroot'/><category term='ideas'/><category term='UK'/><category term='maemo'/><category term='j2me'/><category term='Firefox'/><category term='kio'/><category term='whyIhavedoubtsaboutmovingtotheus'/><category term='anobii'/><category term='GData'/><category term='Amnesty International'/><category term='delicious'/><category term='saas'/><category term='webcomics'/><category term='marketing'/><category term='Atomic'/><category term='blogging'/><category term='SanFrancisco'/><category term='pydoctor'/><category term='svn'/><category term='stickyouriphonewherethesundontshine'/><category term='education'/><category term='domains'/><category term='Microsoft'/><category term='NoScript'/><category term='NYC'/><category term='advertising'/><category term='wine'/><category term='ftplib'/><category term='genocide'/><category term='passaporto'/><category term='giornalismoincapace'/><category term='spy'/><category term='JohnBoltonIsATwat'/><category term='Resolver'/><category term='PowerShell'/><category term='lazyweb'/><category term='GoogleGroups'/><category term='pywin32'/><category term='phpeace'/><category term='Trolltech'/><category term='LibraryLookup'/><category term='IRC'/><category term='Obama'/><category term='libero.it'/><category term='BT'/><category term='Facebook'/><category term='IM'/><category term='hardware'/><category term='mod_mp3'/><category term='eric'/><category term='p2p'/><category term='Debian'/><category term='PyQt'/><category term='JetBrains'/><category term='startup'/><category term='PyCharm'/><category term='ssh'/><category term='music'/><category term='discrimination'/><category term='vnc'/><category term='WSH'/><category term='Google'/><category term='kde'/><category term='idiocy'/><category term='PyconUK'/><category term='literature'/><category term='kdelicious'/><category term='akonadi'/><category term='vote with your wallet'/><category term='ireland'/><category term='kamaelia'/><category term='ATI'/><category term='alanmoore'/><category term='Ubuntu'/><category term='wmi'/><category term='Thinlet'/><category term='charset'/><category term='Silverlight'/><category term='PythonNorthWest'/><category term='BobWalsh'/><category term='icann'/><category term='openid'/><category term='GoogleFinance'/><category term='whytheEUcanbegoodforBritain'/><category term='SQL'/><category term='pymedia'/><category term='comedy'/><category term='ICQ'/><category term='theinbredparty'/><category term='TouchMouse'/><category term='ovi'/><category term='plasma'/><category term='odbc'/><category term='fuck I hate vegans'/><category term='tories'/><category term='travel'/><category term='Jython'/><category term='utf8'/><category term='LinkedIn'/><category term='eclipse'/><category term='openSUSE'/><category term='IronPython'/><category term='mafiaa'/><category term='greasemonkey'/><category term='dataprotection'/><category term='phorm'/><category term='dbxml'/><category term='tld'/><category term='laptop'/><category term='webplumbing'/><category term='backup'/><category term='chm'/><category term='backupify'/><category term='racism'/><category term='mafia'/><category term='meego'/><category term='S60'/><category term='foreverythingelsetherespython'/><category term='shelfari'/><category term='Italy'/><category term='imsotemptedtotagthiswiththeemployersname'/><category term='setuptools'/><category term='mysql'/><category term='logic'/><category term='Nokia'/><category term='vmware'/><category term='sourceforge'/><category term='com'/><category term='OEL'/><category term='Simotrone'/><category term='Amarok'/><category term='pykde'/><category term='Blogger'/><category term='SuSE'/><category term='toggl'/><category term='GeekDiary'/><category term='labour'/><category term='oracle'/><category term='kde4'/><category term='channel4'/><category term='rv350'/><category term='radeon'/><category term='coopbank'/><category term='paulgraham'/><category term='pytthon'/><category term='Japan'/><category term='googlemaps'/><category term='Qt'/><category term='HackerNews'/><category term='Emacs'/><category term='corruption'/><category term='Stockport'/><category term='journalism'/><category term='OpenBSD'/><category term='Atom'/><category term='proxy'/><category term='goodreads'/><category term='jdbc'/><category term='javascript'/><category term='Lost'/><category term='weezer'/><category term='kded'/><category term='apple'/><category term='comics'/><category term='Slashdot'/><category term='LinuxMint'/><category term='webwise'/><category term='libdems'/><category term='grest'/><category term='youtube'/><category term='MJHibbett'/><category term='Gentoo'/><category term='Politics'/><category term='kdiary'/><category term='activism'/><category term='SQLAlchemy'/><category term='python'/><category term='amazon'/><category term='burocrazia'/><category term='internet'/><category term='librarything'/><category term='piratebay'/><category term='docbook'/><category term='football'/><category term='itsadaylikethat'/><category term='diemicrosoftdie'/><category term='SiliconValley'/><category term='linux'/><category term='apache'/><category term='personal finances'/><category term='creditcards'/><category term='children'/><category term='zipfile'/><category term='Ravenbrook'/><category term='personal'/><category term='Lost Theories'/><category term='kubuntu'/><category term='american football'/><category term='callblocker'/><category term='python3'/><category term='greens'/><category term='programming'/><category term='games'/><category term='BNP'/><category term='jedit'/><category term='WSGI'/><category term='pykeylicious'/><category term='Manchester'/><category term='OpenSource'/><category term='rethoric'/><category term='Pycon'/><category term='xorg'/><category term='adblock'/><category term='Sun'/><category term='web2.0'/><category term='food'/><category term='GeekDiay'/><category term='personal OMGim30'/><category term='KMail'/><category term='konqueror'/><category term='biscotto'/><category term='qemu'/><category term='LiveConnector'/><category term='why Alan Moore should be made Wizard of England'/><category term='PingFire'/><category term='opensolaris'/><category term='fail'/><category term='pykdeextensions'/><category term='mercurial'/><category term='2minutesofhate'/><title type='text'>Subclassed</title><subtitle type='html'>Pythonaro, oh-oh-oh.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://blog.pythonaro.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3676448/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://blog.pythonaro.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/3676448/posts/default?start-index=101&amp;max-results=100'/><author><name>Giacomo Lacava</name><uri>https://profiles.google.com/112001311733983789595</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-WWGLdc8H1Uk/AAAAAAAAAAI/AAAAAAAAAYE/tA6iBrZYdng/s512-c/photo.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>280</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-3676448.post-2796004136764803207</id><published>2012-01-10T00:22:00.000Z</published><updated>2012-01-10T00:23:27.483Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='Slashdot'/><category scheme='http://www.blogger.com/atom/ns#' term='Reddit'/><category scheme='http://www.blogger.com/atom/ns#' term='GeekDiary'/><category scheme='http://www.blogger.com/atom/ns#' term='HackerNews'/><category scheme='http://www.blogger.com/atom/ns#' term='GooglePlus'/><category scheme='http://www.blogger.com/atom/ns#' term='webplumbing'/><title type='text'>Conversation silos are an anti-pattern</title><content type='html'>It looks (to me) like people just stopped commenting on blog posts. More and more, I might find some great, very technical post, just to discover it has zero comments; ironically, I'd probably got there through a link on Hacker News or Reddit or G+, where it'd have dozens (if not hundreds) of comments. The original author might or might not know about the conversation; if it's happening on one of the large portals, he'll probably find out because of the traffic surge and its side-effects (db crash, bandwidth bill, etc), but if it's happening in a smaller community he doesn't participate in, he might remain completely oblivious to its existence.&lt;br /&gt;
&lt;br /&gt;
This is a sad anti-pattern, exactly as bad as Disqus; it's just another way of building information silos. It's even more sad to see this model being pushed by the geek community, who should know better. Yes, trackback/pingback and &amp;nbsp;RSS have failed; but there &lt;i&gt;must&lt;/i&gt; be a better way to interlink the debate across this bunch of URLs we call "the web".&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3676448-2796004136764803207?l=blog.pythonaro.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.pythonaro.com/feeds/2796004136764803207/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3676448&amp;postID=2796004136764803207' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3676448/posts/default/2796004136764803207'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3676448/posts/default/2796004136764803207'/><link rel='alternate' type='text/html' href='http://blog.pythonaro.com/2012/01/conversation-silos-are-anti-pattern.html' title='Conversation silos are an anti-pattern'/><author><name>Giacomo Lacava</name><uri>https://profiles.google.com/112001311733983789595</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-WWGLdc8H1Uk/AAAAAAAAAAI/AAAAAAAAAYE/tA6iBrZYdng/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3676448.post-9006773283075579240</id><published>2012-01-04T03:27:00.000Z</published><updated>2012-01-05T10:10:12.446Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='GeekDiary'/><category scheme='http://www.blogger.com/atom/ns#' term='Jython'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='PyCharm'/><category scheme='http://www.blogger.com/atom/ns#' term='JetBrains'/><title type='text'>IntelliJ PyCharm 2.0 and Jython 2.2 don't really go together</title><content type='html'>UPDATE: Dmitry Jemerov from IntelliJ &lt;a href="http://blog.jetbrains.com/pycharm/2012/01/the-story-behind-jython-support-in-pycharm"&gt;responded&lt;/a&gt;, explaining what the situation is. TL;DR: 2.2 is simply too old, other features might come if there is demand. I've amended the post to reflect this. &lt;br /&gt;
&lt;br /&gt;
Let me preface this rant by saying that I've been happily using &lt;a href="http://www.jetbrains.com/"&gt;JetBrains&lt;/a&gt; &lt;a href="http://www.jetbrains.com/pycharm/"&gt;PyCharm&lt;/a&gt; for a few months, and it's certainly one of the best Python &lt;abbr title="Integrated Development Environment"&gt;IDE&lt;/abbr&gt;s out there. The price is ridiculously low and if you're serious about Python, buying PyCharm is one of the best investments you can make. It can be used for free for 30 days, so you really should give it a shot.&lt;br /&gt;
&lt;br /&gt;
This said, if you happen to work with &lt;a href="http://www.jython.org"&gt;Jython 2.2&lt;/a&gt;, you'll probably want to use something else. The claim that Jython is fully supported as a runtime, while literally true, &lt;strike&gt;is somehow stretched&lt;/strike&gt; is only valid for 2.5+.&lt;br /&gt;
&lt;br /&gt;
Let's say you work on Windows, and you have your Jython installed under C:\jython-2.2 (yes, it's damn old, but it's still the most widely-deployed release out there -- just ask IBM and Oracle).&lt;br /&gt;
&lt;br /&gt;
You create a new project in PyCharm, then go to Settings -&amp;gt; Python interpreter, remove the preconfigured CPython runtime, then click on &lt;i&gt;Add&lt;/i&gt; and point to your &lt;nobr&gt;C:\jython-2.2\jython.bat&lt;/nobr&gt;. Bang, "SDK is not valid". The list of library paths, which supposed to be automatically generated by the IDE picking up the environment configuration, is now empty.&lt;br /&gt;
&lt;br /&gt;
Still, PyCharm should be smart enough to parse arbitrary .py files in specific directories, right? So let's click on &lt;i&gt;Add...&lt;/i&gt; to point to &lt;nobr&gt;C:\jython-2.2\Lib&lt;/nobr&gt;, then OK.&lt;br /&gt;
Now let's create a .py file, "from pprint import pprint", the module is recognised; "Run" the script, output is correct, life is good: Jython is indeed supported as a Python &lt;i&gt;runtime&lt;/i&gt;.&lt;br /&gt;
&lt;br /&gt;
Ok, let's do some file I/O, "import os"... uh, &lt;i&gt;os&lt;/i&gt; is not recognised as a valid module. Same for &lt;i&gt;sys&lt;/i&gt;. Apparently, they are somewhat special in Jython and are implemented directly into the main jar, so PyCharm can't see them for autocompletion or any other smart feature. I don't know what else is "special" in Jython 2.2, but I'd rather not have to find out.&lt;br /&gt;
&lt;br /&gt;
Which brings us to the main shortcoming of PyCharm as a Jython IDE: it simply won't recognise or parse any Java jar. This is somewhat surprising, considering how the program is basically a spin-off of &lt;a href="http://www.jetbrains.com/idea/"&gt;IntelliJ IDEA&lt;/a&gt;, a Java IDE, and is completely built on Java. In fact, it shares the codebase with the Python Plugin for IDEA. One would think PyCharm would be ideally suited to the task of handling the "Python on Java" mesh that is Jython, but alas that's not the case. A quick search on the IntelliJ forum brings up recent posts stating that full Jython support for autocompletion is simply not on the cards; Jython is supported &lt;i&gt;as a runtime&lt;/i&gt; and nothing more. In fact, the Python plugin for IDEA &lt;strike&gt;probably&lt;/strike&gt; handles a Jython setup better than PyCharm, and that's not going to change any time soon. The main target for PyCharm are clearly Django/web developers, not integrators. UPDATE: see &lt;a href="http://blog.jetbrains.com/pycharm/2012/01/the-story-behind-jython-support-in-pycharm"&gt;this blog post&lt;/a&gt; for more details on the real situation.&lt;br /&gt;
&lt;br /&gt;
This state of things is a bit saddening. I don't know if this is a way for JetBrains to avoid cannibalizing its main cash-cow (IDEA), or simply a commercial oversight; the fact is that we have a product, ideally positioned to completely own a niche, which simply refuses to do so and actually delivers a second-rate experience. I hope JetBrains will re-evaluate their stance at some point, because it's a bit of a shame really.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3676448-9006773283075579240?l=blog.pythonaro.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.pythonaro.com/feeds/9006773283075579240/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3676448&amp;postID=9006773283075579240' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3676448/posts/default/9006773283075579240'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3676448/posts/default/9006773283075579240'/><link rel='alternate' type='text/html' href='http://blog.pythonaro.com/2012/01/intellij-pycharm-and-jython-dont-really.html' title='IntelliJ PyCharm 2.0 and Jython 2.2 don&apos;t really go together'/><author><name>Giacomo Lacava</name><uri>https://profiles.google.com/112001311733983789595</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-WWGLdc8H1Uk/AAAAAAAAAAI/AAAAAAAAAYE/tA6iBrZYdng/s512-c/photo.jpg'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3676448.post-5563315572593009563</id><published>2011-12-28T11:39:00.000Z</published><updated>2011-12-28T11:56:11.604Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='GeekDiary'/><category scheme='http://www.blogger.com/atom/ns#' term='TouchMouse'/><category scheme='http://www.blogger.com/atom/ns#' term='Microsoft'/><title type='text'>The Microsoft Touch Mouse Needs Better Software</title><content type='html'>I've recently picked up a &lt;a href="http://www.amazon.co.uk/gp/product/B0055857VY/ref=as_li_ss_tl?ie=UTF8&amp;amp;tag=subclassed-21&amp;amp;linkCode=as2&amp;amp;camp=1634&amp;amp;creative=19450&amp;amp;creativeASIN=B0055857VY"&gt;Microsoft Touch Mouse&lt;/a&gt; in post-Christmas sales with a huge discount, and I thought I'd describe my experience.&lt;br /&gt;
&lt;br /&gt;
The mouse itself is a nice (Apple-inspired) concept: a multitouch sensor replacing good ol' mouse buttons and wheel; after enduring several mice with hardware defects, having one (almost) without any mechanical moving parts feels reassuring.&lt;br /&gt;
&lt;br /&gt;
Actual usage is slightly less natural than you'd expect. Scrolling is probably the trickiest activity, since in practice it now depends on friction between your finger and the mouse surface, and you have no mechanical feedback.&lt;br /&gt;
Right-clicking is also a bit weird, if you're in the habit of resting your index finger while doing it: the sensor detects "rested index + clicking middle" as a different (void) activity, not as a right-click, so you'll need to actually lift the index as you click with the middle finger, or move all the way and right-click with your index finger.&lt;br /&gt;
&lt;br /&gt;
I believe the two items above are to be blamed for 99% of bad reviews; they break long-standing muscle memory for power users, who are heavy on their scrolling and right-clicking, and give a feel that the mouse will randomly decide what to do rather than respond to actual gestures.&lt;br /&gt;
&lt;br /&gt;
The scrolling speed can be&amp;nbsp;adjusted in the driver properties, reducing awkwardness, but there is no tweak for the right-click problem. And this is where Microsoft really failed: there is no way to easily customize the device.&lt;br /&gt;
&lt;br /&gt;
The driver defines a limited set of gestures that you can turn on or off, but you cannot override their assignment (i.e. what they actually do) nor create new ones. Some of these gestures are quite nice: three-finger swipes will bring up the Windows equivalent of Apple's Expose'; two-finger swipes work like Win+Arrows (probably the best feature in the Windows 7 Aero desktop), thumb swipes perform Back/Forward in a very natural way. Unfortunately there is a long list of other gestures that one would really need (open/close browser tabs, a middle-click replacement, window resizing, etc etc) and there is no way to add them; worse, there is no way to simply remap existing gestures to new commands, which should be dead easy; one can only remap left and right click, which nobody will ever do.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;object class="BLOGGER-youtube-video" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0" data-thumbnail-src="http://3.gvt0.com/vi/E4I5n7cuJbc/0.jpg" height="266" width="320"&gt;&lt;param name="movie" value="http://www.youtube.com/v/E4I5n7cuJbc&amp;fs=1&amp;source=uds" /&gt;

&lt;param name="bgcolor" value="#FFFFFF" /&gt;

&lt;embed width="320" height="266"  src="http://www.youtube.com/v/E4I5n7cuJbc&amp;fs=1&amp;source=uds" type="application/x-shockwave-flash"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;
Apparently there is a C#/C++ SDK for the sensor (&lt;a href="http://research.microsoft.com/en-us/downloads/8ca8f8d1-c0b8-43a3-a519-0276195a6eec/default.aspx"&gt;32bit&lt;/a&gt; and &lt;a href="http://research.microsoft.com/en-us/downloads/8e2847f1-0e2d-48d3-b924-71400b358c17/default.aspx"&gt;64bit&lt;/a&gt;), and some students have already come up with nice improvements (like the one shown in this embedded video), but it's a shame that Microsoft, a software company first and foremost, &amp;nbsp;let down this lovely piece of hardware so badly by not shipping a proper gesture editor or mapper. I really do hope they'll release updated drivers with more features in the near future.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3676448-5563315572593009563?l=blog.pythonaro.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.pythonaro.com/feeds/5563315572593009563/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3676448&amp;postID=5563315572593009563' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3676448/posts/default/5563315572593009563'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3676448/posts/default/5563315572593009563'/><link rel='alternate' type='text/html' href='http://blog.pythonaro.com/2011/12/microsoft-touch-mouse-needs-better.html' title='The Microsoft Touch Mouse Needs Better Software'/><author><name>Giacomo Lacava</name><uri>https://profiles.google.com/112001311733983789595</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-WWGLdc8H1Uk/AAAAAAAAAAI/AAAAAAAAAYE/tA6iBrZYdng/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3676448.post-5263965807094888890</id><published>2011-12-21T13:05:00.000Z</published><updated>2011-12-21T13:07:17.341Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='VBScript'/><category scheme='http://www.blogger.com/atom/ns#' term='Jython'/><category scheme='http://www.blogger.com/atom/ns#' term='sysadmin'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='PowerShell'/><category scheme='http://www.blogger.com/atom/ns#' term='IronPython'/><title type='text'>VBScript, PowerShell, Python, IronPython, Jython, or... ?</title><content type='html'>In my job, more and more I find that we end up building distributed architectures, i.e. multi-server installations where services are routinely spread around 20+ Windows boxes, plus the occasional Unix. These services have specific startup and shutdown sequences and dependencies, so they can't just be set to Automatic startup; we&amp;nbsp;usually provide batch files to manage them, but this is quickly becoming ugly and unreliable as the number of machines go up every year. It's also tricky to test actual service availability -- some are binary-based, some are HTTP based, some are Weblogic services, etc etc etc...&amp;nbsp;So I'm investigating alternatives.&lt;br /&gt;
&lt;br /&gt;
The first, natural choice for me was obviously Python: it does everything I need, it's flexible etc. However, distributing scripts to customers is a bitch; either you compile everything with cx_freeze (crashy) or py2exe (no python 3! no 64bit bundling! party like it was 2004! have fun tracking down which un-redistributable DLL or manifest you need on each release...), or you drop an entire environment and teach the customer what python is -- not ideal.&lt;br /&gt;
&lt;br /&gt;
The traditional "native" approach to these problems in the Windows world is VBScript. It's fairly flexible, doesn't need to be deployed on Windows Win2003+ (yes, we still deal with loads of Win2003 servers), documentation is extensive and there are plenty of resources out there.&lt;br /&gt;
The problem with VBScript, apart from the ugly syntax and pseudo-OOP quirkiness, is that it's clearly seen as legacy by Microsoft. Year after year, running scripts becomes more cumbersome, security checks increase and new technologies don't expose the necessary interfaces. Does it make sense, in 2011, to invest time and effort building solutions that are, de-facto, already obsolete?&lt;br /&gt;
&lt;br /&gt;
So we come to PowerShell, Microsoft's "future of scripting", which must be the less intuitive shell I've ever had the pleasure to deal with. I simply can't get my head around the way it deals with input and output; it doesn't seem to have reference assignment, so you have to retrieve an object on every line before you can use it; the syntax seems to combine the worst of Perl and Bash, and it quickly becomes unreadable. Also, deploying it on anything older than Vista has to be done manually and has to be justified to customers.&lt;br /&gt;
&lt;br /&gt;
I honestly can't see a good solution here. I keep looking at IronPython, but its infrastructure baffles me and I wouldn't know where to start redistributing programs (I don't use Visual Studio). It's clearly a second-class citizen in the .Net world, with all that it entails.&lt;br /&gt;
&lt;br /&gt;
Maybe Jython? After all, the products we install will drop JREs absolutely everywhere, so I could leverage that. I'd like to avoid going full-Java if I can, I hate the whole byzantine toolchain and I'm not really up to speed with post-1.4 changes; plus, there's always a degree of customization required in each environment, so I'd like to keep stuff as easily-editable as possible.&lt;br /&gt;
&lt;br /&gt;
Please feel free to drop any suggestions in comments, I could really do with them!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3676448-5263965807094888890?l=blog.pythonaro.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.pythonaro.com/feeds/5263965807094888890/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3676448&amp;postID=5263965807094888890' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3676448/posts/default/5263965807094888890'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3676448/posts/default/5263965807094888890'/><link rel='alternate' type='text/html' href='http://blog.pythonaro.com/2011/12/vbscript-powershell-or-python.html' title='VBScript, PowerShell, Python, IronPython, Jython, or... ?'/><author><name>Giacomo Lacava</name><uri>https://profiles.google.com/112001311733983789595</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-WWGLdc8H1Uk/AAAAAAAAAAI/AAAAAAAAAYE/tA6iBrZYdng/s512-c/photo.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3676448.post-5964836291932108687</id><published>2011-12-06T21:34:00.001Z</published><updated>2011-12-06T22:03:58.945Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='python3'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='Debian'/><title type='text'>State of Python 3</title><content type='html'>&lt;p&gt;I want to start a little side-project, basically a few lines of HTTP automation and mail sending; nothing that some Taco Bell Programming couldn't handle, but I don't particularly like shell scripts and I figured it'd be cleaner in Python.&lt;/p&gt;&lt;p&gt;It's 2011 and &lt;i&gt;One Should Really Use Python 3&lt;/i&gt;, right ? The box I'll work on is a brand new Debian Testing where Python 2.x is not even installed, perfect! I'll just grab virtualenv... Waitamminute, "python" doesn't even run, but I'm sure I had installed the python3 package...? Oh, "python3" in Debian doesn't give you /usr/bin/python but rather /usr/bin/python&lt;b&gt;3&lt;/b&gt; !&lt;br /&gt;Thank you, Debian Project, for your &lt;i&gt;consistent inconsistency&lt;/i&gt; dealing with anything Python-related. Ok, so a quick run of update-alternatives and that's sorted.&lt;/p&gt;&lt;p&gt;Now I'll &lt;pre&gt;easy_install virtualenv&lt;/pre&gt;... sorry, easy_install&lt;b&gt;3&lt;/b&gt; virtualenv, of course... oops, syntax error, clearly a Python 2.x package there. Does easy_install discriminate between 2.x and 3.x package? Er, no. Joy.&lt;/p&gt;&lt;p&gt;Whatever, I'll just grab virtualenv.py and drop it in /usr/local/bin, right? cool, works a treat. Activated my virtualenv, let's try again to download a couple of libs... paramiko: syntax error, clearly a 2.x package. funkload: syntax error, again a 2.x package. I know, I'll use pip! ... no difference.&lt;/p&gt;&lt;p&gt;Basically I can choose whether to handle libraries like it was 2001, website after website, setup.py after setup.py; or I can develop like it was 2009, i.e. with python 2.x.&lt;/p&gt;&lt;p&gt;I think for now I'll choose life, and drop python 3.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3676448-5964836291932108687?l=blog.pythonaro.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.pythonaro.com/feeds/5964836291932108687/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3676448&amp;postID=5964836291932108687' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3676448/posts/default/5964836291932108687'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3676448/posts/default/5964836291932108687'/><link rel='alternate' type='text/html' href='http://blog.pythonaro.com/2011/12/state-of-python-3.html' title='State of Python 3'/><author><name>Giacomo Lacava</name><uri>https://profiles.google.com/112001311733983789595</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-WWGLdc8H1Uk/AAAAAAAAAAI/AAAAAAAAAYE/tA6iBrZYdng/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3676448.post-9032936232968366794</id><published>2011-09-16T11:13:00.005+01:00</published><updated>2011-09-16T11:46:55.847+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='pywin32'/><category scheme='http://www.blogger.com/atom/ns#' term='GeekDiary'/><category scheme='http://www.blogger.com/atom/ns#' term='Windows'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='wmi'/><title type='text'>Python WMI, services and UAC</title><content type='html'>&lt;p&gt;In this day and age, security-conscious Windows users "enjoy" the protection of User Access Control (UAC), a feature introduced with Vista and now a stalwart of the Microsoft world in Windows Server 2008 and Windows 7. This is why you get prompted to "allow this program to make changes to your computer" every time you install a program, or if you run a lot of "legacy" Win32 applications.&lt;/p&gt;
&lt;p&gt;Under UAC, even when you are a local administrator, the programs you launch will not, by default, enjoy all system privileges you would expect. Until you get prompted by UAC to allow for system access, processes will run under a &lt;i&gt;basic&lt;/i&gt; user profile.&lt;/p&gt;
&lt;p&gt;This is a problem when you try to interoperate with Windows from Python. As soon as you try to manipulate system objects, for example to start/stop services, you'll get a lot of "Access Denied" return codes.&lt;/p&gt;
&lt;p&gt;One solution, obviously, is to use the "Run as Administrator" option to launch python.exe, so that you get prompted by UAC and the resulting process will effectively run under elevated privileges. Note that it's not enough to launch Command Prompt (cmd.exe) with "run as an administrator" and to then call python.exe from there. You must explicitly hunt down python.exe in explorer and right-click on it, nothing less will do.&lt;/p&gt;
&lt;p&gt;This is fine and dandy for the basic REPL interpreter, but what if you need to do  it from a script? How do you elevate the process from inside a running python.exe?&lt;/p&gt;
&lt;p&gt;The answer is to use ShellExecute with the "runas" verb, like this:&lt;/p&gt;
&lt;pre&gt;import win32api
win32api.ShellExecute( 0, # parent window
    "runas", # need this to force UAC to act
    "C:\\python27\\python.exe", 
    "c:\\path\\to\\script.py", 
    "C:\\python27", # base dir
    1 ) # window visibility - 1: visible, 0: background
&lt;/pre&gt;

UAC will then prompt the user and elevate the process. For an example script that you can only run under elevated privileges, check this:
&lt;pre&gt;import wmi
c = wmi.WMI()
serviceToStart = 'aspnet_state' # example
for service in c.Win32_Service(Name=serviceToStart): 
    service.StartService()
&lt;/pre&gt;
&lt;p&gt;Note: I haven't tested this with py2exe yet, but at worst you should be able to right-click on the py2exe-generated binary and select to Run as Administrator anyway.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3676448-9032936232968366794?l=blog.pythonaro.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.pythonaro.com/feeds/9032936232968366794/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3676448&amp;postID=9032936232968366794' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3676448/posts/default/9032936232968366794'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3676448/posts/default/9032936232968366794'/><link rel='alternate' type='text/html' href='http://blog.pythonaro.com/2011/09/python-wmi-services-and-uac.html' title='Python WMI, services and UAC'/><author><name>Giacomo Lacava</name><uri>https://profiles.google.com/112001311733983789595</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-WWGLdc8H1Uk/AAAAAAAAAAI/AAAAAAAAAYE/tA6iBrZYdng/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3676448.post-975134179442068528</id><published>2011-06-20T12:47:00.001+01:00</published><updated>2011-06-20T12:47:51.478+01:00</updated><title type='text'>Random Linux tips</title><content type='html'>Playing with Arch Linux, I was forced to learn a thing or two about terminals. For example, I've often seen that silly annoyance where VI would start typing A, B etc when using arrow keys in insert mode; apparently it's due to a mismatch between what VI thinks the $TERM type should send and what actually gets there.
In my case, I had to add the following option in my .vimrc: 
set term=builtin_xterm

Also: xterms colors and options go in a .Xresources file, which must be loaded at some point with "xrdb -merge .Xresources"

Meanwhile, emacs was taking ages to start up. Turns out it's doing some funky things with hostnames, you can use strace to see where it gets stuck polling for what emacs thinks is the machine name, and make sure that name can be resolved quickly (e.g. fix your /etc/hosts).

Who knew grep can use colours? grep --color=auto (note: the "auto" scheme assumes a dark background for the terminal).
And who knew there was such a thing as colordiff?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3676448-975134179442068528?l=blog.pythonaro.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.pythonaro.com/feeds/975134179442068528/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3676448&amp;postID=975134179442068528' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3676448/posts/default/975134179442068528'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3676448/posts/default/975134179442068528'/><link rel='alternate' type='text/html' href='http://blog.pythonaro.com/2011/06/random-linux-tips.html' title='Random Linux tips'/><author><name>Giacomo Lacava</name><uri>https://profiles.google.com/112001311733983789595</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-WWGLdc8H1Uk/AAAAAAAAAAI/AAAAAAAAAYE/tA6iBrZYdng/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3676448.post-6343975405545895095</id><published>2011-03-23T21:54:00.005Z</published><updated>2011-03-23T22:28:35.737Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='Facebook'/><category scheme='http://www.blogger.com/atom/ns#' term='LinkedIn'/><category scheme='http://www.blogger.com/atom/ns#' term='GeekDiary'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>Social experiments with Facebook IDs</title><content type='html'>&lt;p&gt;Having just watched "The Social Network", I stumbled on a post on Twitter pointing to &lt;a href="http://graph.facebook.com"&gt;graph.facebook.com&lt;/a&gt;, the free API you can use to scrape the shit out of FB (well, almost).&lt;/p&gt;

&lt;p&gt;Turns out the API will work with IDs. Since FB started as a Harvard-only site, the first few hundred users were all Harvard alumni, obviously. So I started thinking about simple experiments like finding the most popular surnames, certain of having my class-based prejudices reinforced by loads of Winklevoss-style "aristonames". Turns out the most common names are actually Asian -- the elites of tomorrow, of course.&lt;/p&gt;

&lt;p&gt;That's the issue, isn't it? Harvard is (supposedly) a top institution, churning out the "elites of tomorrow"; they won't all become Mark Zuckerberg, but they probably won't be homeless either.&lt;/p&gt;

&lt;p&gt;So, as a joke, I wrote a script looking for Wikipedia pages dedicated to the first 1000 users of Facebook. Turns out there are a lot of very common names, which obviously result in false positives; unfortunately Wikipedia doesn't give you easily-parsed metadata (here's a new project for Jimbo Wales and friends), so I couldn't do things like discarding everyone born before 1970. With a bit of patience, I narrowed down the number to a rough 6%. Some of them are (or were) Facebook employees, of course, but there are also young poets, writers and comedians.&lt;/p&gt;

&lt;p&gt;You would probably get better results by replacing Wikipedia with LinkedIn, which would include more successful businesspeople and professionals -- Harvard's bread and butter. Obviously you could also start digging across the entire FB userbase, beyond the first lucky Harvardites.&lt;/p&gt;

&lt;p&gt;These web APIs are a great tool for smart researchers; you now have a lot of data to be correlated with a little bit of programming glue and very little time. The result might not be scientifically exact, but could still unearth surprising insights.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3676448-6343975405545895095?l=blog.pythonaro.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.pythonaro.com/feeds/6343975405545895095/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3676448&amp;postID=6343975405545895095' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3676448/posts/default/6343975405545895095'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3676448/posts/default/6343975405545895095'/><link rel='alternate' type='text/html' href='http://blog.pythonaro.com/2011/03/social-experiments-with-facebook-ids.html' title='Social experiments with Facebook IDs'/><author><name>Giacomo Lacava</name><uri>https://profiles.google.com/112001311733983789595</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-WWGLdc8H1Uk/AAAAAAAAAAI/AAAAAAAAAYE/tA6iBrZYdng/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3676448.post-6137486788504910550</id><published>2011-02-25T08:33:00.010Z</published><updated>2011-02-25T10:32:56.113Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='GeekDiary'/><title type='text'>XKCD Fanfiction</title><content type='html'>&lt;small&gt;&lt;i&gt;Panel 1:&lt;/i&gt;&lt;/small&gt;&lt;br /&gt;
Stick Figure &lt;b&gt;A&lt;/b&gt;: "Can you believe it? I once touched Michael Jackson's HAND!"&lt;br /&gt;
Stick Figure &lt;b&gt;B&lt;/b&gt;: "So what?"&lt;br /&gt;&lt;br /&gt;
&lt;small&gt;&lt;i&gt;Panel 2:&lt;/i&gt;&lt;/small&gt;&lt;br /&gt;
SF&lt;b&gt;B&lt;/b&gt;: "You touched the hand of a singer famous for grabbing his private parts while dancing. Did this improve your life in any way?"&lt;br /&gt;&lt;br /&gt;
SF&lt;b&gt;A&lt;/b&gt;: "..."&lt;br /&gt;&lt;br /&gt;
&lt;small&gt;&lt;i&gt;Panel 3:&lt;/i&gt;&lt;/small&gt;&lt;br /&gt;
SF&lt;b&gt;B&lt;/b&gt;: "I mean, did you ever SPEAK to him? Did he write you a SONG or something?"&lt;br /&gt;&lt;br /&gt;
&lt;small&gt;&lt;i&gt;Panel 4:&lt;/i&gt;&lt;/small&gt;&lt;br /&gt;
SF&lt;b&gt;A&lt;/b&gt;: "No, but last year Donald Knuth waved at me through a cafeteria window."&lt;br /&gt;
SF&lt;b&gt;B&lt;/b&gt;: "Dude, that's &lt;i&gt;AWESOME!&lt;/i&gt;"&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;
&lt;small&gt;ALT-TEXT: "He was really looking at some Finnish creep behind me, one Snoopy Torvalds I think. Yeah, never heard of him either."&lt;/small&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3676448-6137486788504910550?l=blog.pythonaro.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.pythonaro.com/feeds/6137486788504910550/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3676448&amp;postID=6137486788504910550' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3676448/posts/default/6137486788504910550'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3676448/posts/default/6137486788504910550'/><link rel='alternate' type='text/html' href='http://blog.pythonaro.com/2011/02/xkcd-fanfiction.html' title='XKCD Fanfiction'/><author><name>Giacomo Lacava</name><uri>https://profiles.google.com/112001311733983789595</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-WWGLdc8H1Uk/AAAAAAAAAAI/AAAAAAAAAYE/tA6iBrZYdng/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3676448.post-4992379779507081546</id><published>2010-10-24T20:49:00.006+01:00</published><updated>2010-10-27T23:39:09.778+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='pykde'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='kde'/><category scheme='http://www.blogger.com/atom/ns#' term='kio'/><title type='text'>Valid keywords for KIO.Job.addMetaData</title><content type='html'>&lt;p&gt;I spent three hours last night, pulling my hair out, while trying to add a custom &lt;abbr title="HyperText Transfer Protocol"&gt;HTTP&lt;/abbr&gt; header to a &lt;a href="http://api.kde.org/4.x-api/kdelibs-apidocs/kio/html/classKIO_1_1StoredTransferJob.html"&gt;StoredTransferJob&lt;/a&gt; generated by &lt;a href="http://api.kde.org/4.x-api/kdelibs-apidocs/kio/html/namespaceKIO.html#acbf810e468e3904f7fe17e77933b4a54"&gt;KIO.storedHttpPost&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;In my naivety, I thought &lt;a href="http://api.kde.org/4.x-api/kdelibs-apidocs/kio/html/classKIO_1_1Job.html#af509b3764a6b915df1273424e40b80d2"&gt;KIO.Job.addMetaData(key,value)&lt;/a&gt; would accept an &lt;abbr title="HyperText Transfer Protocol"&gt;HTTP&lt;/abbr&gt; header name as key, and the actual header value as value. I was twice wrong: "key" is a limited list of accepted keywords (documented in the obscure &lt;a href="http://lxr.kde.org/source/KDE/kdelibs/kio/DESIGN.metadata"&gt;DESIGN.metadata&lt;/a&gt; file, buried in the &lt;acronym title="K Desktop Environment"&gt;KDE&lt;/acronym&gt; source tree and not linked by any tutorial), and "value" is the complete header (e.g. "Content-Type: application/x-www-form-urlencoded"). It's essential to get the key right, or the metadata will be silently dropped (argh); I had to fiddle with &lt;a href="http://www.wireshark.org"&gt;Wireshark&lt;/a&gt; to find out. By the way, the two essential keys you probably want to remember are "content-type" and the life-saving &lt;del&gt;"CustomHTTPHeader"&lt;/del&gt;&lt;ins&gt;"customHTTPHeader" (DAMN LOWERCASE C!!! it's wrong in the design document, btw.)&lt;/ins&gt;.&lt;/p&gt;

&lt;p&gt;(That's the terrible thing about &lt;acronym title="K Desktop Environment"&gt;KDE&lt;/acronym&gt; &lt;abbr title="Application Programming Interface"&gt;API&lt;/abbr&gt;s: lots of barely-documented quirkiness hidden under an appearance of ease-of-use. You start developing thinking that it's all going to be easy, and find out along the way that things are not really as simple as they seem. I guess I should be thankful that at least they have good web tools to browse and grep their source, and fairly complete doxygen docs... but it still hurts more than it should.)&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3676448-4992379779507081546?l=blog.pythonaro.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.pythonaro.com/feeds/4992379779507081546/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3676448&amp;postID=4992379779507081546' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3676448/posts/default/4992379779507081546'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3676448/posts/default/4992379779507081546'/><link rel='alternate' type='text/html' href='http://blog.pythonaro.com/2010/10/valid-keywords-for-kiojobaddmetadata.html' title='Valid keywords for KIO.Job.addMetaData'/><author><name>Giacomo Lacava</name><uri>https://profiles.google.com/112001311733983789595</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-WWGLdc8H1Uk/AAAAAAAAAAI/AAAAAAAAAYE/tA6iBrZYdng/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3676448.post-4004475560922664746</id><published>2010-07-23T20:00:00.001+01:00</published><updated>2010-08-21T23:26:28.849+01:00</updated><title type='text'>If anything can go wrong...</title><content type='html'>Blogger forced people to move off FTP publishing... expect breakage.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3676448-4004475560922664746?l=blog.pythonaro.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.pythonaro.com/feeds/4004475560922664746/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3676448&amp;postID=4004475560922664746' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3676448/posts/default/4004475560922664746'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3676448/posts/default/4004475560922664746'/><link rel='alternate' type='text/html' href='http://blog.pythonaro.com/2010/07/if-anything-can-go-wrong.html' title='If anything can go wrong...'/><author><name>Giacomo Lacava</name><uri>https://profiles.google.com/112001311733983789595</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-WWGLdc8H1Uk/AAAAAAAAAAI/AAAAAAAAAYE/tA6iBrZYdng/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3676448.post-4836210923099235287</id><published>2010-03-09T20:30:00.003Z</published><updated>2010-03-09T21:18:33.753Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='PyQt'/><category scheme='http://www.blogger.com/atom/ns#' term='meego'/><category scheme='http://www.blogger.com/atom/ns#' term='GeekDiary'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='maemo'/><title type='text'>The joys of Python and Qt</title><content type='html'>&lt;p&gt;I'm currently working on a tutorial regarding &lt;a href="http://meego.com/"&gt;MeeGo&lt;/a&gt;, the new Linux-based embedded platform born by the merging of (Nokia-sponsored) &lt;a href="http://maemo.org"&gt;Maemo&lt;/a&gt; and (Intel-adopted) &lt;a href="http://moblin.org"&gt;Moblin&lt;/a&gt;. MeeGo is probably the closest thing we'll ever get to a real "Linux for the masses": differently from Android, where Linux is just a kernel for Java to run on top, here we'll have the full GNU toolchain, X display, desktop technologies based on &lt;a href="http://www.freedesktop.org/"&gt;FreeDesktop&lt;/a&gt; standards, &lt;abbr title="Redhat Package Management"&gt;RPM&lt;/abbr&gt; packages, etc etc.&lt;/p&gt;
&lt;p&gt;The main development toolkit for MeeGo, from now on, will officially be &lt;a href="http://qt.nokia.com/products"&gt;QT&lt;/a&gt;. This seems to fly in the face of reason, having two existing &lt;a href="http://gtk.org"&gt;GTK&lt;/a&gt;-based codebases from both "parent" systems which have already been deployed on production devices, but it's actually a very smart choice, as I was reminded just today.&lt;/p&gt;
&lt;p&gt;This morning, I was working on a laptop running Windows XP. I built a couple of forms with Qt Designer, then fired up my trusty &lt;abbr title="Integrated Development Environment"&gt;IDE&lt;/abbr&gt; and wrote the main code, about 150 lines of &lt;a href="http://www.python.org"&gt;Python&lt;/a&gt; that will download some files, manage a few controls and then display a web page.&lt;/p&gt;&lt;p&gt;After completing a full set of tests on the local machine, I copied it to my (Maemo) phone, and again it was working perfectly -- without any change, recompilation, deployment, anything. Then I went home and copied it back to a different laptop running Kubuntu Linux, and again it was running just fine. Had I had a Mac (or iPad?) laying around, I'm confident it would have run there as well without any change. Consider that the version of QT and &lt;a href="http://riverbankcomputing.com/software/pyqt/"&gt;PyQt&lt;/a&gt; was slightly different on all machines, just to give it a further twist.&lt;/p&gt;
 &lt;p&gt;Obviously this level of portability has a price. I had to write my code using constructs like &lt;a href="http://qt.nokia.com/doc/4.6/qsettings.html"&gt;QSettings&lt;/a&gt; and &lt;a href="http://qt.nokia.com/doc/4.6/qnetworkaccessmanager.html"&gt;QNetworkAccessManager&lt;/a&gt; rather than messing directly with the Windows Registry or HTTP_PROXY variables. I have yet another (leaky) abstraction layer on top of the &lt;abbr title="Operating System"&gt;OS&lt;/abbr&gt;, which may or may not be to everyone's taste, and the program runs in a sandboxed runtime, which might be slower than natively-compiled code (although this is debatable, these days); but I didn't have to write three different codepaths for each and every interoperation with the &lt;abbr title="Operating System"&gt;OS&lt;/abbr&gt;. I didn't have to worry about having a $HOME or a %HOME%. If I have to worry about packaging is just because I have to write about the ins and outs of a particular platform; in other circumstances I could have simply relied on python tools to do the right thing.&lt;/p&gt;&lt;p&gt;Python and QT could finally deliver the dream of portability that Java promised, if only we give them a sporting chance.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3676448-4836210923099235287?l=blog.pythonaro.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.pythonaro.com/feeds/4836210923099235287/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3676448&amp;postID=4836210923099235287' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3676448/posts/default/4836210923099235287'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3676448/posts/default/4836210923099235287'/><link rel='alternate' type='text/html' href='http://blog.pythonaro.com/2010/03/joys-of-python-and-qt.html' title='The joys of Python and Qt'/><author><name>Giacomo Lacava</name><uri>https://profiles.google.com/112001311733983789595</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-WWGLdc8H1Uk/AAAAAAAAAAI/AAAAAAAAAYE/tA6iBrZYdng/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3676448.post-1725620328728127004</id><published>2010-03-03T15:25:00.004Z</published><updated>2010-03-03T15:53:21.233Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='PyQt'/><category scheme='http://www.blogger.com/atom/ns#' term='GeekDiary'/><category scheme='http://www.blogger.com/atom/ns#' term='pytthon'/><category scheme='http://www.blogger.com/atom/ns#' term='maemo'/><category scheme='http://www.blogger.com/atom/ns#' term='callblocker'/><title type='text'>CallBlocker for Maemo</title><content type='html'>&lt;p&gt;Last week, Vinu Thomas came up with &lt;a href="http://www.mynokiaworld.com/2010/02/block-unwanted-calls-on-your-n900/"&gt;an ingenious script&lt;/a&gt; that will silently drop calls on your N900 if they come from a list of "blocked" callers. I never thought you could do that, but apparently there have been quite a few apps for this sort of things on more established platforms like Symbian and iPhone.&lt;/p&gt;
&lt;p&gt;At first I suggested a few minor improvements to the script, then I thought I might as well repackage it in a proper application with a proper GUI. I asked permission to Vinu (something the author of "pycallblocker" didn't bother to do), and then I went ahead and put it on Garage.&lt;/p&gt;
&lt;p&gt;So there you have it: &lt;a href="http://garage.maemo.org/projects/callblocker"&gt;CallBlocker 1.0 for Maemo 5&lt;/a&gt;. Note that it relies on the python2.5-qt4-gui package, currently available only in the &lt;a href="http://wiki.maemo.org/Extras-testing"&gt;extras-testing&lt;/a&gt; repository.&lt;/p&gt;
&lt;p&gt;The current feature-set is quite limited: you basically enter a list of phone numbers, and callers (exactly) matching them will be sent a busy signal or redirected to voicemail.&lt;/p&gt;
&lt;p&gt;It did get quite a warm reception on &lt;a href="http://talk.maemo.org"&gt;talk.maemo.org&lt;/a&gt;, so I'm motivated to keep development ongoing (at the expense of other, still-unreleased stuff I have almost ready). The current plan is to release a 1.1 version with support for suffix wildcards (e.g. entering +441234*, all numbers beginning with +441234 would be matched and dropped) and better daemon management. Then, time permitting, I'd like to have a 2.0 with features like blocking all withheld/private numbers, blocking SMS texts, blocking specific contacts from address book, blocking all numbers not in addressbook, blocking only during some hours, and possibly even a "whitelist" mode.&lt;/p&gt;
&lt;p&gt;Once it reaches a certain maturity, I'll probably consider moving it to the Ovi Store, at which point PyQt licensing issues might arise, but we'll cross that bridge when we get to it.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3676448-1725620328728127004?l=blog.pythonaro.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.pythonaro.com/feeds/1725620328728127004/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3676448&amp;postID=1725620328728127004' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3676448/posts/default/1725620328728127004'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3676448/posts/default/1725620328728127004'/><link rel='alternate' type='text/html' href='http://blog.pythonaro.com/2010/03/callblocker-for-maemo.html' title='CallBlocker for Maemo'/><author><name>Giacomo Lacava</name><uri>https://profiles.google.com/112001311733983789595</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-WWGLdc8H1Uk/AAAAAAAAAAI/AAAAAAAAAYE/tA6iBrZYdng/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3676448.post-873638003953441728</id><published>2010-02-21T23:56:00.001Z</published><updated>2010-02-21T23:56:45.769Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='GeekDiary'/><category scheme='http://www.blogger.com/atom/ns#' term='kde'/><category scheme='http://www.blogger.com/atom/ns#' term='kubuntu'/><title type='text'>KDE 4.4.0 on Kubuntu Karmic 9.10 -- a note of warning</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;&lt;p&gt;I just upgraded my Kubuntu 9.10 "Karmic Koala" from KDE 4.3.4 to 4.4.0 using the &lt;em&gt;backports&lt;/em&gt; repository. A note of warning: take a backup.&lt;/p&gt;&lt;p&gt;It took me something like 4 or 5 runs of &lt;code&gt;apt-get dist-upgrade&lt;/code&gt; / &lt;code&gt;apt-get -f install&lt;/code&gt; to get back a working setup. APT complained about a couple of things (python-qt3-doc conflicting with some newer package which includes the same examples, and Bilbo having been renamed Blogilo) but eventually pulled it through.&lt;/p&gt;&lt;p&gt;I was smart enough to backup the &lt;em&gt;.kde&lt;/em&gt; home directory before launching a 4.4 session, and I'm glad I was. First run: Plasma crashed hard on a segfault, and didn't restart. Ok, this happened with some past upgrade already, let's just move away the old &lt;em&gt;.kde&lt;/em&gt; home... got back a default desktop. Playing around with widgets, I hit another crash. And another. The culprit was always the Plasma Desktop, actual applications were running fine. Eventually, I moved back the old &lt;em&gt;.kde&lt;/em&gt; home except the plasma* files under .kde/share/config/. This gave me back all my old KDE settings, except for Plasma. Win, I thought, and merrily set out to recreate my previous desktop arrangement.&lt;/p&gt;&lt;p&gt;Another crash.&lt;/p&gt;&lt;p&gt;So uhm. I'll try to track down what exactly Plasma doesn't like in my setup (which was, for the record, with two panels on left and right edge; Lancelot and a couple of QuickAccess widgets on the left, task manager and shutdown button on the right; two Plasma "views" and 4 virtual desktops), but if you are planning a similar upgrade, make sure you put aside some time for it, and get a good backup beforehand.&lt;/p&gt;&lt;p&gt;(I guess the question now would be "&lt;em&gt;is it worth it?&lt;/em&gt;". Well, KDE does look more polished, applications are faster to launch and more responsive... it does look like we're finally at the point where one could upgrade from a 3.5.x release to 4.x and feel a bit awestruck.)&lt;/p&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3676448-873638003953441728?l=blog.pythonaro.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.pythonaro.com/feeds/873638003953441728/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3676448&amp;postID=873638003953441728' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3676448/posts/default/873638003953441728'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3676448/posts/default/873638003953441728'/><link rel='alternate' type='text/html' href='http://blog.pythonaro.com/2010/02/kde-440-on-kubuntu-karmic-910-note-of.html' title='KDE 4.4.0 on Kubuntu Karmic 9.10 -- a note of warning'/><author><name>Giacomo Lacava</name><uri>https://profiles.google.com/112001311733983789595</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-WWGLdc8H1Uk/AAAAAAAAAAI/AAAAAAAAAYE/tA6iBrZYdng/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3676448.post-1176077099993772440</id><published>2010-02-09T08:16:00.005Z</published><updated>2010-02-10T10:23:08.335Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='PyQt'/><category scheme='http://www.blogger.com/atom/ns#' term='Nokia'/><category scheme='http://www.blogger.com/atom/ns#' term='GeekDiary'/><category scheme='http://www.blogger.com/atom/ns#' term='S60'/><category scheme='http://www.blogger.com/atom/ns#' term='Qt'/><category scheme='http://www.blogger.com/atom/ns#' term='maemo'/><title type='text'>Mobile applications for Nokia phones with... javascript ?!?</title><content type='html'>&lt;p&gt;A few days ago the lovely folks at &lt;a href="http://www.nsmanchester.com"&gt;NSManchester&lt;/a&gt;, an Apple user group, gave a chance to "the enemy" (i.e. &lt;a href="http://www.forum.nokia.com"&gt;Nokia&lt;/a&gt;) to present their technology stack and business strategies for attracting developers.&lt;/p&gt;
&lt;p&gt;The two presenter were a bit underwhelming (understandable after they went through the usual, hellish experience with British railway services), and there was little talk of my beloved &lt;a href="http://www.maemo.org"&gt;Maemo&lt;/a&gt;, but it's hard to dismiss the technology stack they have chosen to go forward. Key element seems to be the &lt;a href="http://qt.nokia.com"&gt;QT&lt;/a&gt; library they acquired last year, which I know and love through the &lt;a href="http://www.riverbankcomputing.co.uk/software/pyqt"&gt;original Python bindings&lt;/a&gt;. It's powerful and as cross-platform as it can be, with a lot of mindshare in the Linux and Windows communities; this said, it's still C++, and it's hard to get excited about C++ these days. Also, the runtime will gradually appear on new and recent phones but probably won't make it to older ones.&lt;/p&gt;
&lt;p&gt;The second development platform they are pushing, however, was more of a surprise to me. Apparently, you can use &lt;a href="http://en.wikipedia.org/wiki/JavaScript"&gt;JavaScript&lt;/a&gt; to write applications for recent smartphones (S60 5th ed. -- N97 and 5800 -- and S60 3rd ed. &lt;abbr title="Feature Pack"&gt;FP&lt;/abbr&gt;2 -- e.g. E72, N85, N96 etc). You can access &lt;abbr title="Global Positioning System"&gt;GPS&lt;/abbr&gt; coordinates, contacts and calendar items, as well as having complete freedom to design the &lt;abbr title="User Interface"&gt;UI&lt;/abbr&gt; with standard &lt;abbr title="HyperText Markup Language"&gt;HTML&lt;/abbr&gt; and &lt;abbr title="Cascading Sytle Sheets"&gt;CSS&lt;/abbr&gt;. You don't need to sign the resulting packages, the barrier to entry is lowered dramatically. This is potentially a game-changer, and I don't know why Nokia are not shouting it from the rooftops. Early adopters include &lt;a href="http://netflix.com"&gt;Netflix&lt;/a&gt;, which uses a basic JavaScript interface to stream their Flash content (!) -- so yes, you can use flash as well. My head simply went "boom"; I must look into this stuff.&lt;/p&gt;
&lt;p&gt;&lt;small&gt;One other thing I noticed was the presenters' style, typically European: self-deprecation and brutal honesty about things that work and ones that don't. It was refreshing, after weeks of Yanks propaganda from Google and Apple pushing their new gadgets as "fantastic", "amazing", "revolutionary" etc etc etc...&lt;/small&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3676448-1176077099993772440?l=blog.pythonaro.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.pythonaro.com/feeds/1176077099993772440/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3676448&amp;postID=1176077099993772440' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3676448/posts/default/1176077099993772440'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3676448/posts/default/1176077099993772440'/><link rel='alternate' type='text/html' href='http://blog.pythonaro.com/2010/02/mobile-applications-for-nokia-phones.html' title='Mobile applications for Nokia phones with... javascript ?!?'/><author><name>Giacomo Lacava</name><uri>https://profiles.google.com/112001311733983789595</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-WWGLdc8H1Uk/AAAAAAAAAAI/AAAAAAAAAYE/tA6iBrZYdng/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3676448.post-5722872486983710341</id><published>2010-01-29T23:17:00.001Z</published><updated>2010-01-29T23:17:33.798Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='GeekDiary'/><category scheme='http://www.blogger.com/atom/ns#' term='backup'/><category scheme='http://www.blogger.com/atom/ns#' term='backupify'/><title type='text'>Backupify</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;&lt;p&gt;Thanks to the lovely &lt;a title='gPodder' href='http://www.gpodder.org'&gt;gPodder&lt;/a&gt; on my &lt;a title='N900' href='http://maemo.nokia.com/n900/'&gt;Nokia N900&lt;/a&gt;, I've recently discovered the &lt;a title='net@night' href='http://twit.tv/natn'&gt;net@night&lt;/a&gt; podcast by Leo Laporte. Like many regular podcasts, it's mostly full of random chatting and showmanship. In this respect, "new media" tend to be exactly like "old media": forced by their own schedule to blabber for the sake of it. But I digress.&lt;/p&gt;&lt;p&gt;The best segment of Laporte's show is usually an interview with someone from a startup, which is a good way of finding out about new services. Yesterday, it made me sign up for &lt;a title='Backupify' href='http://www.backupify.com'&gt;Backupify&lt;/a&gt;, a "social media backup tool" which will scrape your &lt;a title='GoogleMail' href='http://mail.google.com'&gt;GMail&lt;/a&gt; / &lt;a title='Delicious' href='http://www.delicious.com'&gt;Delicious&lt;/a&gt; / &lt;a title='Facebook' href='htp://www.facebook.com'&gt;Facebook&lt;/a&gt; / &lt;a title='Flickr' href='http://www.flickr.com'&gt;Flickr&lt;/a&gt; / &lt;a title='Twitter' href='http://www.twitter.com'&gt;Twitter&lt;/a&gt; / &lt;a title='Blogger' href='http://www.blogger.com'&gt;Blogger&lt;/a&gt; / &lt;a title='Wordpress.com' href='http://www.wordpress.com'&gt;Wordpress&lt;/a&gt; etc etc and store all the resulting data in a safe place on Amazon's cloud. Not a bad idea: the first 20 years of the Age of the Internet should have taught us, if anything, that data is ephemeral and can disappear at the flick of a switch. &lt;a href='http://en.wikipedia.org/wiki/Geocities#Closure'&gt;What happened to Geocities&lt;/a&gt; is proof that today's giants won't necessarily be with us tomorrow. Conscious of this state of things, Backupify gives you the option to drop your data on your own Amazon server, so that it will still be available if they go belly-up; quite a honest approach for a startup. It used to be a pay-only service, then went free to accelerate growth and get some venture capital; they will move to a freemium model after January 31, so you better try it out now if you can.&lt;/p&gt;&lt;p&gt;Good "Web 2.0" services usually expose APIs that make backups relatively easy for a programmer, but who's got time to write dedicated scripts AND the foresight to run them regularly? Myself, I've probably written half a dozen GMail scrapers, but I hardly ever ran them more than once. I've exported this Blogger-powered site once, and it was a nightmare. Backupify makes it very easy to "set up and forget", and that's good. The data will only be as good as what the various sites will allow; for example you will never be able to "restore" a Twitter account, so Backupify will only give you a PDF of your (and your friends') twits, which is the best you can expect. For Google Spreadsheets you get XLS files, for Blogger you get a big XML containing all your posts, etc etc.&lt;/p&gt;&lt;p&gt;The only problem with the site is the password anti-pattern: in order to get at your data, they often have to ask for your login details, and will store them on their servers. They do use OAuth if the service supports it (like Facebook or Google), but otherwise you'll have to trust them with your credentials. This makes them a very good target for black-hat hackers, among other things. I do hope they know what they are doing.&lt;/p&gt;&lt;p/&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3676448-5722872486983710341?l=blog.pythonaro.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.pythonaro.com/feeds/5722872486983710341/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3676448&amp;postID=5722872486983710341' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3676448/posts/default/5722872486983710341'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3676448/posts/default/5722872486983710341'/><link rel='alternate' type='text/html' href='http://blog.pythonaro.com/2010/01/backupify.html' title='Backupify'/><author><name>Giacomo Lacava</name><uri>https://profiles.google.com/112001311733983789595</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-WWGLdc8H1Uk/AAAAAAAAAAI/AAAAAAAAAYE/tA6iBrZYdng/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3676448.post-4557340005526783126</id><published>2010-01-25T11:18:00.003Z</published><updated>2010-01-25T11:42:22.720Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='personal'/><category scheme='http://www.blogger.com/atom/ns#' term='Nokia'/><category scheme='http://www.blogger.com/atom/ns#' term='N900'/><category scheme='http://www.blogger.com/atom/ns#' term='GeekDiary'/><category scheme='http://www.blogger.com/atom/ns#' term='stickyouriphonewherethesundontshine'/><category scheme='http://www.blogger.com/atom/ns#' term='maemo'/><title type='text'>How the Nokia N900 is improving my life</title><content type='html'>&lt;p&gt;&lt;small&gt;(Small things, but...)&lt;/small&gt;&lt;/p&gt;
&lt;p&gt;Today I had to took my car to the garage, so had to tell my manager I'd likely be late (public transport is not terrible in our area, but it still takes me about twice the time to get to the office than it would with the car). I'm also down with a laryngitis and I can barely whisper.&lt;/p&gt;
&lt;p&gt;I could have booted my home laptop to send an email or IM, but meanwhile the bus would have come and gone. So I hit the road anyway, and thought I would somehow email from the phone.&lt;/p&gt;
&lt;p&gt;But then, the Nokia N900 is no Blackberry; it's a full-fledged linux desktop in your pockets. When I enabled the 3G data connection, the button nearby was the one to set your IM status(es) to Online; so I fired that up, looked up my manager in the wonderfully integrated address book, and she was online, so while I sit on the bus, we had a friendly chat about things to do, without having to share them with other commuters or strain my poor throat.&lt;/p&gt;
&lt;p&gt;All the while, I was listening to &lt;a href="http://www.awaretek.com/python/"&gt;the latest Python 411 podcast&lt;/a&gt; about the (apparently terrific and currently-slashdotted) &lt;a href="http://sikuli.org"&gt;Sikuli project&lt;/a&gt;, updating expenses on the little program I've developed (which I'll upload to the Ovi Store in a few weeks, I promise), and browsing Google Reader. The 30-mins commute was over in what seemed like seconds, and the experience was basically the same I could have had while sitting at my desk with a regular laptop.&lt;/p&gt;
&lt;p&gt;This little thing is simply outstanding. Apple's new "iWhatever" better have a SIM slot, or they can kiss goodbye to their iPhone marketshare.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3676448-4557340005526783126?l=blog.pythonaro.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.pythonaro.com/feeds/4557340005526783126/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3676448&amp;postID=4557340005526783126' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3676448/posts/default/4557340005526783126'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3676448/posts/default/4557340005526783126'/><link rel='alternate' type='text/html' href='http://blog.pythonaro.com/2010/01/how-nokia-n900-is-improving-my-life.html' title='How the Nokia N900 is improving my life'/><author><name>Giacomo Lacava</name><uri>https://profiles.google.com/112001311733983789595</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-WWGLdc8H1Uk/AAAAAAAAAAI/AAAAAAAAAYE/tA6iBrZYdng/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3676448.post-7278480938355450311</id><published>2010-01-21T22:12:00.000Z</published><updated>2010-01-21T22:12:44.524Z</updated><title type='text'>The personal-GPS market has just died</title><content type='html'>&lt;p&gt;Nokia just &lt;a href="http://maemo-freak.com/index.php/miscellaneous/1365-nokia-to-offer-free-navigation-service-to-customers-of-its-smartphones"&gt;announced&lt;/a&gt; that the turn-by-turn navigation addons to their (underwhelming) gps software, Ovi Maps, will now be offered free of charge, completely undercutting TomTom and friends. They can do this thanks to the recent acquisition of Navteq, the top map-making company in the world (which is still selling map data to competitors at a hefty price, by the way, including Google); and they have to do it, because Google is doing it as well on Android and iPhone.&lt;/p&gt;
&lt;p&gt;If Nokia can really deliver (i.e. actually &lt;i&gt;improve&lt;/i&gt; Ovi Maps, which is quite frankly not as good as commercial competitors yet), 2010 will be remembered as the year that GPS devices became obsolete, like it happened to PDAs about three years ago. TomTom shareholders better run for the hills.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3676448-7278480938355450311?l=blog.pythonaro.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://maemo-freak.com/index.php/miscellaneous/1365-nokia-to-offer-free-navigation-service-to-customers-of-its-smartphones' title='The personal-GPS market has just died'/><link rel='replies' type='application/atom+xml' href='http://blog.pythonaro.com/feeds/7278480938355450311/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3676448&amp;postID=7278480938355450311' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3676448/posts/default/7278480938355450311'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3676448/posts/default/7278480938355450311'/><link rel='alternate' type='text/html' href='http://blog.pythonaro.com/2010/01/personal-gps-market-has-just-died.html' title='The personal-GPS market has just died'/><author><name>Giacomo Lacava</name><uri>https://profiles.google.com/112001311733983789595</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-WWGLdc8H1Uk/AAAAAAAAAAI/AAAAAAAAAYE/tA6iBrZYdng/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3676448.post-5301784128121172852</id><published>2010-01-19T10:54:00.001Z</published><updated>2010-01-19T10:54:35.121Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='GeekDiary'/><category scheme='http://www.blogger.com/atom/ns#' term='Windows'/><title type='text'>Remote shutdown on Windows</title><content type='html'>&lt;p&gt;This might sound useless or obvious to many, but i didn't know it and it made my life easier today...&lt;/p&gt;
&lt;p&gt;If you ever need to shutdown a remote Windows machine, and you can't access it with Remote Desktop or similar tools, you can use Shutdown.exe from another Windows machine, like this: &lt;code&gt;shutdown /m \\my-remote-host&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Additional parameters can be seen with /? but the most useful ones are:&lt;dl&gt;&lt;dt&gt;/r&lt;/dt&gt;&lt;dd&gt;reboot after shutdown&lt;/dd&gt;&lt;dt&gt;/f&lt;/dt&gt;&lt;dd&gt;force shutdown -- useful when the machine looks stuck, which is what happened to me today...&lt;/dd&gt;&lt;dt&gt;/d xx:yy&lt;/dt&gt;&lt;dd&gt;give a reason for reboot. See /? for the available codes.&lt;/dd&gt;&lt;/dl&gt;&lt;/p&gt;
&lt;p&gt;I hope this means I can say goodbye to dangerous hard-reboots...&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3676448-5301784128121172852?l=blog.pythonaro.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.pythonaro.com/feeds/5301784128121172852/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3676448&amp;postID=5301784128121172852' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3676448/posts/default/5301784128121172852'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3676448/posts/default/5301784128121172852'/><link rel='alternate' type='text/html' href='http://blog.pythonaro.com/2010/01/remote-shutdown-on-windows.html' title='Remote shutdown on Windows'/><author><name>Giacomo Lacava</name><uri>https://profiles.google.com/112001311733983789595</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-WWGLdc8H1Uk/AAAAAAAAAAI/AAAAAAAAAYE/tA6iBrZYdng/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3676448.post-3159256159182819263</id><published>2010-01-18T14:51:00.005Z</published><updated>2010-01-18T15:40:36.348Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='Nokia'/><category scheme='http://www.blogger.com/atom/ns#' term='GeekDiary'/><category scheme='http://www.blogger.com/atom/ns#' term='fail'/><category scheme='http://www.blogger.com/atom/ns#' term='saas'/><category scheme='http://www.blogger.com/atom/ns#' term='ovi'/><category scheme='http://www.blogger.com/atom/ns#' term='apple'/><title type='text'>Nokia Ovi Store Policies on SaaS / subscriptions: fail</title><content type='html'>&lt;p&gt;&lt;small&gt;(Chances are that nobody will answer this question, like it happened to &lt;a href="http://discussion.forum.nokia.com/forum/showthread.php?t=190706"&gt;this developer on forum.nokia.com&lt;/a&gt;, but what the hell)&lt;/small&gt;&lt;/p&gt;
&lt;p&gt;I have an interesting business idea. I'll develop a mobile application with some interesting functionality, and I'll give it away for free. The application will contain an option to upload some data to a remote server, which you will then access from any computer as a regular site. The website will have some advanced features to analyze the data etc etc. The site will operate as &lt;abbr title="Software as a Service"&gt;SaaS&lt;/abbr&gt;, with a free 30-day trial. Basically, the site will make the real money, in a way similar to what FeedDemon and NewsGator tried a few years ago in a different market.&lt;/p&gt;
&lt;p&gt;Now, if I wanted to do that on Nokia platforms, I would try and put my mobile app on the &lt;a href="http://store.ovi.com"&gt;Ovi Store&lt;/a&gt; as a free download, right? After all, it will be a useful program in its own right, with the online services being 100% optional. Nokia / Ovi get a free, useful app enriching its (crappy) customer experience, the developer gets a big distribution channel, it's a win-win!&lt;/p&gt;
&lt;p&gt;Except that landlords don't like uppity sharecroppers. From the &lt;a href="http://wiki.forum.nokia.com/index.php/Ovi_Publish_-_Developer_Terms_and_Conditions"&gt;Ovi Terms &amp;amp Conditions&lt;/a&gt;:
&lt;blockquote&gt;4.7. Free Content Restriction&lt;br /&gt;&lt;br /&gt;
You are prohibited from collecting future charges from end users for Content that those end users were initially allowed to obtain for free. This is not intended to prevent distribution of free trial versions of Your Content with a later upsell option to obtain the full version of the Content. Such free trials for Content are permitted. However, if You want to collect fees after the free trial expires, &lt;b&gt;You must collect all fees for the full version of Your Content through the Program&lt;/b&gt;. In this Agreement, "free" means there are no charges or fees of any kind for use of the Content. &lt;b&gt;All fees received by You for Content distributed via the Program must be processed by Nokia.&lt;/b&gt;&lt;/blockquote&gt;
&lt;p&gt;Now, I can see the motive behind such a "racket clause". Nokia doesn't want Ovi to end up a cesspool of trialware, or to be associated with "click once and pay forever" scams. But the rule is too broad, and it reads like any SaaS scenario is simply out of the question (especially when you consider that Ovi does not support "subscriptions" at the moment, only one-off payments). SaaS is probably the best revenue model in the software world at the moment, and Nokia is telling developers they can't use it.&lt;/p&gt;
&lt;p&gt;I honestly do not know if Apple put similar restrictions in place on their store. They probably did (and then some), control-freak as they are, and this is why I wouldn't want to touch the iPhone ecosystem with a barge pole. But Nokia was supposed to be trying hard to regain developer mindshare...&lt;/p&gt;
&lt;p&gt;So the question I'd like to ask, before I shell out for the Ovi "publisher" license, is: dear Nokia, my application does something useful on your mobiles. It will then, optionally, send some data to my server, and I will personally collect money to have people access that data on the web, aggregated in various ways. Can I put the app on Ovi?&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3676448-3159256159182819263?l=blog.pythonaro.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.pythonaro.com/feeds/3159256159182819263/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3676448&amp;postID=3159256159182819263' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3676448/posts/default/3159256159182819263'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3676448/posts/default/3159256159182819263'/><link rel='alternate' type='text/html' href='http://blog.pythonaro.com/2010/01/nokia-ovi-store-policies-on-saas.html' title='Nokia Ovi Store Policies on SaaS / subscriptions: fail'/><author><name>Giacomo Lacava</name><uri>https://profiles.google.com/112001311733983789595</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-WWGLdc8H1Uk/AAAAAAAAAAI/AAAAAAAAAYE/tA6iBrZYdng/s512-c/photo.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3676448.post-2706050276262489322</id><published>2010-01-12T00:41:00.002Z</published><updated>2010-01-12T08:35:18.929Z</updated><title type='text'>More notes on N900</title><content type='html'>&lt;p&gt;The N900 is lovely, but the more I use it, the more I get the feeling that releasing it as a mass-market phone might have been a bit premature.&lt;/p&gt;
&lt;p&gt;Take the "grid" icons. Technically, you can sort them: each icon can be given a "priority" number, and the lower it is, the higher it will appear. Technically, you can create additional subfolders and even auto-sort icons depending on the application classification (office, media etc). Unfortunately, all of this must be done *by manually editing an XML file* (/etc/xdg/menus/hildon.menu) plus several other text files (the .desktop and .application files in /usr/share/applications/hildon). For a consumer-grade device, this is shocking. It's even worse: if you mess up said files, the system goes in a "reboot loop" from which is very hard to escape (hint: get the flasher tool and use it with only parameter --enable-rd-mode, then fix the file, then use flasher again with --disable-rd-mode; if that doesn't work, you'll have to do a full reflash).&lt;/p&gt;&lt;p&gt;Also, it does not work with the SIM cards from network Three in UK and Denmark; considering that Three is a favourite of data-heavy users, who should be the main target for this device, this was a big mistake.&lt;/p&gt;&lt;p&gt;Some applications are clearly half-baked (Maps), and the Ovi Store is still closed. You make a big launch taking over the entire ad-space on Gizmodo for a day, and your supposedly flagship applcation store is not working ?&lt;/p&gt;&lt;p&gt;Nokia are slowly addressing these issues by releasing over-the-air updates, which is good, but the overall feeling remains: as released (late), the N900 is for hackers and hobbyists. Which, considering the platform potential and role, is a crying shame.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3676448-2706050276262489322?l=blog.pythonaro.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.pythonaro.com/feeds/2706050276262489322/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3676448&amp;postID=2706050276262489322' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3676448/posts/default/2706050276262489322'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3676448/posts/default/2706050276262489322'/><link rel='alternate' type='text/html' href='http://blog.pythonaro.com/2010/01/more-notes-on-n900.html' title='More notes on N900'/><author><name>Giacomo Lacava</name><uri>https://profiles.google.com/112001311733983789595</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-WWGLdc8H1Uk/AAAAAAAAAAI/AAAAAAAAAYE/tA6iBrZYdng/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3676448.post-8403992679427732217</id><published>2010-01-07T23:21:00.001Z</published><updated>2010-01-07T23:21:47.798Z</updated><title type='text'>N900 first impression</title><content type='html'>Cool. Feels sturdier than iPhone. Opening the battery compartment is shockingly hard, which is surprising if you think that Nokia always paid a lot of attention to battery slots etc. The hardware keyboard is undoubtedly better than virtual ones, and key size is about right for my clumsy fingers. Desktop navigation is da bomb, incredibly better and more customizable than anything seen before. Default browser is lovely if a bit idiosyncratic, mostly due to the erratic touchscreen. Ah, the touchscreen: worse than iPhone, sorry. The stylus is still quite handy.
Apps: quite a bit of them, after enabling the extras repository, and decent quality. Will try the ovi store later. The feeling is that, finally, Nokia built a device &lt;i&gt;for the internet&lt;/i&gt;: the network is taken for granted and integrated everywhere. The web experience is so good that custom clients (e.g. for twitter or facebook) are hardly needed. I'm writing this post from MaStory, but I could have used blogger.com and the experience would not have been much worse.

And of course, this phone runs linux. Which means that you can hack it to death, and that the market is fully open. 

S60 developers can officially retire, Maemo is simply on another planet. Now let's hope Nokia won't blow this massive chance...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3676448-8403992679427732217?l=blog.pythonaro.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.pythonaro.com/feeds/8403992679427732217/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3676448&amp;postID=8403992679427732217' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3676448/posts/default/8403992679427732217'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3676448/posts/default/8403992679427732217'/><link rel='alternate' type='text/html' href='http://blog.pythonaro.com/2010/01/n900-first-impression.html' title='N900 first impression'/><author><name>Giacomo Lacava</name><uri>https://profiles.google.com/112001311733983789595</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-WWGLdc8H1Uk/AAAAAAAAAAI/AAAAAAAAAYE/tA6iBrZYdng/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3676448.post-5116384161440356537</id><published>2009-12-05T23:52:00.001Z</published><updated>2009-12-05T23:52:23.175Z</updated><title type='text'>Plasma + Python + QThread = bad</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;&lt;p&gt;DOM manipulation performed in a QThread launched from a KDE Plasma applet written in Python is officially a &lt;em&gt;very bad idea&lt;/em&gt;. Minidom: crash. QDomDocument: crash. !Fun.&lt;/p&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3676448-5116384161440356537?l=blog.pythonaro.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.pythonaro.com/feeds/5116384161440356537/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3676448&amp;postID=5116384161440356537' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3676448/posts/default/5116384161440356537'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3676448/posts/default/5116384161440356537'/><link rel='alternate' type='text/html' href='http://blog.pythonaro.com/2009/12/plasma-python-qthread-bad.html' title='Plasma + Python + QThread = bad'/><author><name>Giacomo Lacava</name><uri>https://profiles.google.com/112001311733983789595</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-WWGLdc8H1Uk/AAAAAAAAAAI/AAAAAAAAAYE/tA6iBrZYdng/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3676448.post-4298684286727908826</id><published>2009-11-30T08:17:00.004Z</published><updated>2009-11-30T10:12:37.881Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='GeekDiary'/><category scheme='http://www.blogger.com/atom/ns#' term='marketing'/><category scheme='http://www.blogger.com/atom/ns#' term='kde4'/><title type='text'>If you can't fix it, rebrand it</title><content type='html'>&lt;p&gt;The reputation of the KDE ecosystem was tarnished by a crappy release process for KDE4. Essential desktop components simply weren't ready for release in 4.0 and 4.1 (some of them still are mostly vaporware) after a huge barrage of hype had massively raised expectations, and this generated a lot of (well deserved) bad publicity. The answer?&lt;/p&gt;
&lt;p&gt;&lt;a href="http://dot.kde.org/2009/11/24/repositioning-kde-brand"&gt;Go and rebrand it&lt;/a&gt;, so that the development process can be broken up more easily and people will be persuaded to blame the right developers for each component. And while we are at it, let's throw out KDE's well-earned reputation for deep integration, the idea of the DE as a complete platform for users and developers. Let's give users the idea that KDE is just a "compilation" of bits and bobs thrown together for no particular reason, on the way overlapping as much as possible with the concept of "distribution", making it fun for companies to explain the difference and for developers to understand what they can and cannot rely on for their apps. Now KDE is supposed to be just a "community", a "club" of like-minded (C++) people hanging out in Gran Canaria and the like.&lt;/p&gt;
&lt;p&gt;Yeah, that will be fun.&lt;/p&gt;
&lt;p&gt;&lt;small&gt;Honestly, I've been a big KDE fan for ages, but the development process for KDE4 was clearly wrong on so many levels. Developers' reactions to user feedback in the last two years have been astonishingly patronizing, and this is just another instance of it. Just admit that errors were made and get to work, please, instead of wasting time jet-setting from one "conference" to another (preferably in remote islands with good nightclubs), talking about marketing b*llocks.&lt;/small&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3676448-4298684286727908826?l=blog.pythonaro.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.pythonaro.com/feeds/4298684286727908826/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3676448&amp;postID=4298684286727908826' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3676448/posts/default/4298684286727908826'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3676448/posts/default/4298684286727908826'/><link rel='alternate' type='text/html' href='http://blog.pythonaro.com/2009/11/if-you-cant-fix-it-rebrand-it.html' title='If you can&apos;t fix it, rebrand it'/><author><name>Giacomo Lacava</name><uri>https://profiles.google.com/112001311733983789595</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-WWGLdc8H1Uk/AAAAAAAAAAI/AAAAAAAAAYE/tA6iBrZYdng/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3676448.post-5720475338485452655</id><published>2009-11-29T15:20:00.001Z</published><updated>2009-11-29T15:20:37.691Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='GeekDiary'/><category scheme='http://www.blogger.com/atom/ns#' term='kde4'/><category scheme='http://www.blogger.com/atom/ns#' term='akonadi'/><category scheme='http://www.blogger.com/atom/ns#' term='plasma'/><title type='text'>Akonadi vs Plasma: a tale of disorganized, randomic development</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;&lt;p&gt;The Akonadi::ItemView class, which should provide a default, out-of-the-box view of data stored by Akonadi (KDE 4 technology), depending on the type of resource it represents, cannot be included in a Plasma.Applet (KDE 4 technology) but only in a KXmlGuiClient or KXmlGuiWindow (KDE 3 technology). &lt;/p&gt;&lt;p&gt;Clearly dogfood isn't as tasty as apple pie.&lt;/p&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3676448-5720475338485452655?l=blog.pythonaro.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.pythonaro.com/feeds/5720475338485452655/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3676448&amp;postID=5720475338485452655' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3676448/posts/default/5720475338485452655'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3676448/posts/default/5720475338485452655'/><link rel='alternate' type='text/html' href='http://blog.pythonaro.com/2009/11/akonadi-vs-plasma-tale-of-disorganized.html' title='Akonadi vs Plasma: a tale of disorganized, randomic development'/><author><name>Giacomo Lacava</name><uri>https://profiles.google.com/112001311733983789595</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-WWGLdc8H1Uk/AAAAAAAAAAI/AAAAAAAAAYE/tA6iBrZYdng/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3676448.post-6489045422966482884</id><published>2009-11-25T08:32:00.010Z</published><updated>2009-11-25T09:31:08.270Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='personal'/><category scheme='http://www.blogger.com/atom/ns#' term='bambini'/><category scheme='http://www.blogger.com/atom/ns#' term='passaporto'/><category scheme='http://www.blogger.com/atom/ns#' term='burocrazia'/><category scheme='http://www.blogger.com/atom/ns#' term='giornalismoincapace'/><title type='text'>Passaporto obbligatorio per i bambini da oggi?!? Classico caso di cattivo giornalismo</title><content type='html'>&lt;small&gt;(Apologies, this post is only in Italian)&lt;/small&gt;
&lt;p&gt;Questa mattina il Corriere della Sera ha fatto risparmiare qualche litro di caffe' ai poveri genitori di bambini italiani all'estero. Il pezzo &lt;a href="http://www.corriere.it/cronache/09_novembre_24/passaporto_personale_bambini_e64f680a-d925-11de-a7cd-00144f02aabc.shtml"&gt;"Anche i bimbi avranno il loro passaporto"&lt;/a&gt;, infatti, conteneva abbastanza allarmismo da provocare diversi casi di tachicardia acuta in adulti con prole, quasi tutti in fase di preparazione per l'inevitabile rientro natalizio sul Suolo Patrio.&lt;/p&gt;
&lt;p&gt;Tutto grazie alla seguente affermazione (&lt;a href="http://blog.pythonaro.com/static/corriere.png" target="_blank"&gt;screenshot per i posteri&lt;/a&gt;):&lt;/p&gt;
&lt;blockquote&gt;"Dal 25 novembre, tutti i bambini in viaggio all'estero avranno in mano il loro documento con nome e foto, così come prevede la nuova disciplina comunitaria."&lt;/blockquote&gt;
&lt;p&gt;Panico. Fino a ieri per i minori bastava essere presenti sul passaporto dei genitori. Per avere un nuovo passaporto ci vuole piu' di un mese! Natale e' il 25 dicembre e il nostro aereo e' fra X giorni! Possibile che il Ministero degli Esteri si sia creato dal nulla una montagna di lavoro proprio sotto Natale?&lt;/p&gt;
&lt;p&gt;La risposta e' no. Peccato che il giornalista/scribacchino/redattore che si e' preso la briga di riportare la notizia (probabilmente di agenzia) non abbia nemmeno provato a fare un minimo di verifica o integrazione, magari sul sito della Polizia di Stato (organismo preposto al rilascio dei passaporti), magari leggendo un aggiornamento dal titolo &lt;a href="http://www.poliziadistato.it/articolo/17426-Nuova_disciplina_in_materia_di_passaporti"&gt;"Nuova disciplina in materia di passaporti"&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;"I passaporti contenenti l'iscrizione di minori rilasciati fino ad oggi rimangono comunque validi fino alla scadenza e tutte le richieste di iscrizione del figlio minore sul proprio passaporto pervenute fino a ieri saranno evase fino al 15 dicembre."&lt;/blockquote&gt;
&lt;p&gt;Ergo, l'affermazione che "dal 25 novembre, tutti i bambini in viaggio [...] avranno in mano il loro documento" e' palesemente falsa. E il preoccupato genitore puo' finalmente rilassarsi con una bella tazza di caffe' fumante, magari (per oggi) decaffeinato.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3676448-6489045422966482884?l=blog.pythonaro.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.pythonaro.com/feeds/6489045422966482884/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3676448&amp;postID=6489045422966482884' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3676448/posts/default/6489045422966482884'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3676448/posts/default/6489045422966482884'/><link rel='alternate' type='text/html' href='http://blog.pythonaro.com/2009/11/passaporto-obbligatorio-per-i-bambini.html' title='Passaporto obbligatorio per i bambini da oggi?!? Classico caso di cattivo giornalismo'/><author><name>Giacomo Lacava</name><uri>https://profiles.google.com/112001311733983789595</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-WWGLdc8H1Uk/AAAAAAAAAAI/AAAAAAAAAYE/tA6iBrZYdng/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3676448.post-2411802230341408372</id><published>2009-11-24T19:50:00.002Z</published><updated>2009-11-24T19:53:02.727Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='vnc'/><category scheme='http://www.blogger.com/atom/ns#' term='GeekDiary'/><category scheme='http://www.blogger.com/atom/ns#' term='vmware'/><title type='text'>How to Replace VmWare Server 2.0 Console with VNC</title><content type='html'>&lt;p&gt;VmWare Server 2.0 ships with a web-based user-interface that is, to put it bluntly, an abomination. Supposedly, it is that way in order to simplify requirements: gone is the command-line API-based interface of 1.0 (which is now only available in the pricier products, what a coincidence), now the only thing you need is a web browser and a plugin that will display the consoles of virtualized instances.&lt;/p&gt;
&lt;p&gt;This is all well and good &lt;em&gt;when the plugin works&lt;/em&gt;. Which is, considering the constant flow of browser updates, not quite often. In particular, it seems that after upgrading to Firefox 3.5, the plugin stopped recognizing my arrow keys (of all things). I tried running it as a standalone client, which is surprisingly simple (just locate vmware-vmrc in your Firefox profile folder and use it to connect to the main server on port 8333), with no success. I've even followed some blog advice to add something to /etc/vmware/config, but that didn't do it for me.&lt;/p&gt;
&lt;p&gt;Then I remembered what everyone in the VmWare world knows: these virtual consoles are VNC-based. So there must be a way of using a "proper" VNC client, bypassing the godawful plugin. And indeed there is, just drop the following lines in the .vmx file of the virtual machine you want to VNC-enable:&lt;/p&gt;
&lt;pre&gt;RemoteDisplay.vnc.port = "5900"
RemoteDisplay.vnc.enabled = "TRUE"
RemoteDisplay.vnc.password = "password"&lt;/pre&gt;
&lt;p&gt;Reboot the instance and &lt;em&gt;voil&amp;agrave;&lt;/em&gt;, you will be able to connect with a better client, like xTightVnc, where arrow keys do work properly. You can obviously change the port and password to suit your needs.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3676448-2411802230341408372?l=blog.pythonaro.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.pythonaro.com/feeds/2411802230341408372/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3676448&amp;postID=2411802230341408372' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3676448/posts/default/2411802230341408372'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3676448/posts/default/2411802230341408372'/><link rel='alternate' type='text/html' href='http://blog.pythonaro.com/2009/11/how-to-replace-vmware-server-20-console.html' title='How to Replace VmWare Server 2.0 Console with VNC'/><author><name>Giacomo Lacava</name><uri>https://profiles.google.com/112001311733983789595</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-WWGLdc8H1Uk/AAAAAAAAAAI/AAAAAAAAAYE/tA6iBrZYdng/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3676448.post-8612420230957363001</id><published>2009-11-23T20:01:00.001Z</published><updated>2009-11-23T20:01:45.117Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='GeekDiary'/><category scheme='http://www.blogger.com/atom/ns#' term='Amarok'/><category scheme='http://www.blogger.com/atom/ns#' term='kde4'/><title type='text'>Amarok 2 revisited</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;&lt;p&gt;Considering the sort of negative person I am (I'm sure scientologists would classify me as "suppressive personality" in zero time), it doesn't come as a surprise that one of the most popular items on this blog is &lt;a href='http://blog.pythonaro.com/2008/12/on-amarok-2-or-how-you-can-always-find.html'&gt;a rant about Amarok 2&lt;/a&gt;. Having recently upgraded my Linux laptop, however, I found that Amarok was also upgraded to release 2.2.1, and I decided to give it a go. The experience was, overall, a positive one, so I thought I owed to the developers a follow-up to my previous rap.&lt;/p&gt;&lt;p&gt;&lt;a href='http://amarok.kde.org/'&gt;Amarok&lt;/a&gt; 2.2.1 finally addresses 99% of the problems and regressions that plagued 2.0. The terrible default layout is now highly customizable (click on View -&amp;gt; Lock Layout to unlock the widgets, then drag&amp;amp;drop them where you want), so you can recreate the much-saner 1.x disposition. You can also customize the top toolbar (which by default is wasting so much screen real-estate, you could probably display three different applications in the same amount of space) to be more compact, by selecting &lt;em&gt;View -&amp;gt; Slim Toolbar&lt;/em&gt;. Support for radio and podcasting is now first-rate (I don't know about external disks/mediaplayers), and plugins for various Internet services are quite good. MySQL is back to being an &lt;em&gt;optional&lt;/em&gt; back-end for the internal music catalog. In short, if you still are on 1.x and can upgrade to &lt;acronym title='K Desktop Environment'&gt;KDE&lt;/acronym&gt;4/Qt4, you should probably give it a go.&lt;/p&gt;&lt;p&gt;So, 18 months down the line, Amarok is basically back to where it was in release 1.4, plus some eyecandy and (we are told) a better, more modular infrastructure. In order to achieve this, developers endured a year of bad publicity and hate-mail from their own users, lost market share, and basically looked hapless at prioritizing features and designing interfaces.&lt;/p&gt;&lt;p&gt;Was it worth it? To me, it still looks like another proof that benefits of "big rewrites" are dubious at best, &lt;a href='http://www.joelonsoftware.com/articles/fog0000000069.html'&gt;like Joel Spolsky said so many years ago&lt;/a&gt;. I suspect we will eventually come to say the same about the whole &lt;acronym title='K Desktop Environment'&gt;KDE&lt;/acronym&gt;4 process, but I guess the jury is still out on that one.&lt;/p&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3676448-8612420230957363001?l=blog.pythonaro.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.pythonaro.com/feeds/8612420230957363001/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3676448&amp;postID=8612420230957363001' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3676448/posts/default/8612420230957363001'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3676448/posts/default/8612420230957363001'/><link rel='alternate' type='text/html' href='http://blog.pythonaro.com/2009/11/amarok-2-revisited.html' title='Amarok 2 revisited'/><author><name>Giacomo Lacava</name><uri>https://profiles.google.com/112001311733983789595</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-WWGLdc8H1Uk/AAAAAAAAAAI/AAAAAAAAAYE/tA6iBrZYdng/s512-c/photo.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3676448.post-8790889995927052978</id><published>2009-11-22T17:23:00.001Z</published><updated>2009-11-22T17:23:13.150Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='education'/><category scheme='http://www.blogger.com/atom/ns#' term='GeekDiary'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='children'/><title type='text'>Programming children</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;&lt;p&gt;Children are to parents what Big Rewrites are to programmers: the occasion to start from scratch after taking into account all the hacks and bad decisions from previous versions, resulting in a superior implementation of a well-known solution. Or so parents (and programmers) like to think. &lt;/p&gt;&lt;p&gt;Except that children and programs tend to have a life of their own, and the most successful strategy is often to just get along doing whatever the little monsters are successful at, which may or may not be what the previous release intended to do. &lt;/p&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3676448-8790889995927052978?l=blog.pythonaro.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.pythonaro.com/feeds/8790889995927052978/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3676448&amp;postID=8790889995927052978' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3676448/posts/default/8790889995927052978'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3676448/posts/default/8790889995927052978'/><link rel='alternate' type='text/html' href='http://blog.pythonaro.com/2009/11/programming-children.html' title='Programming children'/><author><name>Giacomo Lacava</name><uri>https://profiles.google.com/112001311733983789595</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-WWGLdc8H1Uk/AAAAAAAAAAI/AAAAAAAAAYE/tA6iBrZYdng/s512-c/photo.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3676448.post-879362670125675834</id><published>2009-11-20T15:26:00.003Z</published><updated>2009-11-20T15:47:37.776Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='imsotemptedtotagthiswiththeemployersname'/><category scheme='http://www.blogger.com/atom/ns#' term='personal'/><category scheme='http://www.blogger.com/atom/ns#' term='GeekDiary'/><title type='text'>How to demotivate your workforce</title><content type='html'>&lt;ul&gt;&lt;li&gt;tell them they are "high cost" compared to Egyptian, Indian or Rumanian counterparts.&lt;/li&gt;&lt;li&gt;tell them that, despite the company being afloat in cash, there's no money for pay increases for the N-th year running.&lt;/li&gt;&lt;li&gt;tell them that the money is "reserved to the mergers&amp;amp;acquisitions strategy". We don't reward our workforce, we reward our competitors; as soon as you can, please go and become one.&lt;/li&gt;&lt;li&gt;tell them that "promotions with no pay increase" are perfectly normal. Same for workload increases. Imply that you should count yourself lucky to still have a job. The beatings will continue until morale improves. &lt;/li&gt;&lt;li&gt;tell them that, if you don't like it, they have a choice (i.e. walking). But at the same time, "we have to get better at sharing knowledge". Sure, I'll get to that right away (not).&lt;/li&gt;&lt;li&gt;give them new internal systems that don't work. When workers complain, dismiss them as whiners. Make sure there is no plan-B after The Big Go-Live. Once TBGL results in complete customer-affecting disaster, panic.
&lt;/li&gt;&lt;/ul&gt;Time to work on personal projects. Big time.

&lt;span style="font-size:78%;"&gt;Dear SUN employees in Europe, you really &lt;span style="font-style: italic;"&gt;really&lt;/span&gt; should cheer for the EU. May you be spared a terrible fate.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3676448-879362670125675834?l=blog.pythonaro.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.pythonaro.com/feeds/879362670125675834/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3676448&amp;postID=879362670125675834' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3676448/posts/default/879362670125675834'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3676448/posts/default/879362670125675834'/><link rel='alternate' type='text/html' href='http://blog.pythonaro.com/2009/11/how-to-demotivate-your-workforce.html' title='How to demotivate your workforce'/><author><name>Giacomo Lacava</name><uri>https://profiles.google.com/112001311733983789595</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-WWGLdc8H1Uk/AAAAAAAAAAI/AAAAAAAAAYE/tA6iBrZYdng/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3676448.post-43377745557628682</id><published>2009-11-17T20:15:00.002Z</published><updated>2009-11-17T20:18:04.962Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='radeon'/><category scheme='http://www.blogger.com/atom/ns#' term='GeekDiary'/><category scheme='http://www.blogger.com/atom/ns#' term='rv350'/><category scheme='http://www.blogger.com/atom/ns#' term='kde4'/><category scheme='http://www.blogger.com/atom/ns#' term='kubuntu'/><category scheme='http://www.blogger.com/atom/ns#' term='xorg'/><category scheme='http://www.blogger.com/atom/ns#' term='ATI'/><title type='text'>Kubuntu Karmic Koala and Radeon 9600 Mobility M10 (RV350) xorg.conf magic</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;&lt;p&gt;The upgrade to &lt;a href='http://www.kubuntu.org/news/9.10-release'&gt;Kubuntu 9.10 "Karmic Koala"&lt;/a&gt; threw me back to the glorious 90s, when installing Linux would invariably require long battles with the infamous XFree config files. Hours and hours wasted trying out magic incantations in order to escape the brutal world of command-line interfaces. !FUN&lt;/p&gt;&lt;p&gt;Anyway, here's a bit background: basically, &lt;a href='http://ati.amd.com'&gt;ATI&lt;/a&gt; stopped releasing proprietary Linux drivers for their old cards. So you can either use the old drivers, or move to the &lt;a href='http://www.x.org/wiki/radeon'&gt;open-source ones&lt;/a&gt; (a complete rewrite, which only recently got good enough for real use). But here's the problem: the version of (&lt;acronym title='K Desktop Environment'&gt;KDE&lt;/acronym&gt; window manager) KWin shipped with Karmic crashes horribly with the old ATI drivers, and recent Xorg releases don't really work well with them anyway. So you haven't much of a choice: move to the free drivers and thank Stallman for inventing the cure to the annoying problem of manufacturers dropping support for products after less than five years.&lt;/p&gt;&lt;p&gt;The problem with the open-source drivers, however, is that running with default parameters will give you shockingly bad perfomance, especially for 2D (weird). I was forced to delve into xorg.conf and turn on all the "turbo-boost" switches I could find. At the moment, I'm getting decent result with the following parameters:&lt;/p&gt;&lt;pre&gt;Section "Device"
Identifier      "Configured Video Device"
Driver  "radeon"
Option  "AccelDFS"              "on"
Option  "AccelMethod"           "XAA"
Option  "MigrationHeuristic"    "smart" # "greedy" works well also
Option  "EnablePageFlip"        "on"
Option  "EnableDepthMoves"      "on"
Option  "ColorTiling"           "on"
Option  "FBTexPercent"          "0"
Option  "AGPMode"               "4" # this is the real kicker
Option  "TripleBuffer"          "true"
EndSection&lt;/pre&gt;&lt;p&gt;Note AccelMethod being set to XAA. In the future that will probably be EXA (which apparently is a newer algorithm), but my experiments with it included too many crashes for my taste.&lt;/p&gt;&lt;p&gt;There are a few other parameters that I scavenged from Google and &lt;i&gt;man radeon&lt;/i&gt;, but they mostly resulted in crashes on my machine (tbh, I'm not sure they were always the guilty party, but better safe than sorry):&lt;/p&gt;&lt;ul&gt;&lt;li&gt;"AGPSize" "128" -- from what I understand, this should just be the amount of video RAM you have.&lt;/li&gt;&lt;li&gt;"EXAOptimizeMigration" "on" -- relevant only if you use EXA&lt;/li&gt;&lt;li&gt;"XAANoOffscreenPixmaps" "on" -- no idea what this is, but my card doesn't like it&lt;/li&gt;&lt;li&gt;"BIOSHotkeys" "on" -- my screen-related Fn-* hotkeys work anyway, even without this parameter&lt;/li&gt;&lt;li&gt;"AGPFastWrite" "on" -- this hangs X on my laptop (Rock Pegasus Ti)&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;I put this here so I may remember to search my blog next time instead of wasting time going through random forum threads, but I hope it may be of help to fellow Radeon linuxers. All in all, KDE 4.3 is lovely, but it kinda reminded me that five years is quite a long lifespan for a laptop.&lt;/p&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3676448-43377745557628682?l=blog.pythonaro.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.pythonaro.com/feeds/43377745557628682/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3676448&amp;postID=43377745557628682' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3676448/posts/default/43377745557628682'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3676448/posts/default/43377745557628682'/><link rel='alternate' type='text/html' href='http://blog.pythonaro.com/2009/11/kubuntu-karmic-koala-and-radeon-9600.html' title='Kubuntu Karmic Koala and Radeon 9600 Mobility M10 (RV350) xorg.conf magic'/><author><name>Giacomo Lacava</name><uri>https://profiles.google.com/112001311733983789595</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-WWGLdc8H1Uk/AAAAAAAAAAI/AAAAAAAAAYE/tA6iBrZYdng/s512-c/photo.jpg'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3676448.post-823926064956325862</id><published>2009-11-15T20:26:00.003Z</published><updated>2009-11-15T20:26:56.448Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='GeekDiary'/><category scheme='http://www.blogger.com/atom/ns#' term='kde4'/><category scheme='http://www.blogger.com/atom/ns#' term='kubuntu'/><category scheme='http://www.blogger.com/atom/ns#' term='Ubuntu'/><title type='text'>Kubuntu 9.10 / KDE 4.3.3 first impressions</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;&lt;ul&gt;&lt;li&gt;Upgrade installer choked on finding out that python2.6 was already installed. Had to fall back on hardcore dpkg commands to fix it. I understand most "upgraders" had similar issues. -1&lt;/li&gt;&lt;li&gt;Keeps complaining that it can't find my uid-identified partitions straight away (slow HAL?). Considering it eventually manages to mount them just fine (and that the uid scheme was forced upon me by a previous Kubuntu), it just seems stupid. Any idea how I could stop the nagging? Meanwhile, -1&lt;/li&gt;&lt;li&gt;Sluggish. Maybe because KWin would crash on ATI drivers and I had to switch back to the free ones. -5&lt;/li&gt;&lt;li&gt;Eyecandy is fabulous, and very consistent. Much better than Vista.+1&lt;/li&gt;&lt;li&gt;Managed to recreate my old desktop setup almost flawlessly. Most 4.0 regressions due to Plasma have finally been addressed. +1&lt;/li&gt;&lt;li&gt;Many (most?) widgets are useless. Only few of them "get" what Plasma is about. I guess this will be fixed in time. +0&lt;/li&gt;&lt;li&gt;The Widget Dashboard, once you "get it", is fantastic. Makes things like Quick Launcher absolutely redundant. +1&lt;/li&gt;&lt;li&gt;Configuration utilities have been somewhat cleaned up, in a long-overdue effort. +1, but for the love of God stop with the Gnome-like zealotry.&lt;/li&gt;&lt;li&gt;Looks like KNetworkManager won't properly manage my wifi. Somewhat balanced by forcing people (me) to rediscover the joys of full-speed cabled access. Still, -1 (and I'm being generous)&lt;/li&gt;&lt;li&gt;KPackageKit finally gives us a Qt-based alternative to Synaptic. +1&lt;/li&gt;&lt;li&gt;the gmail-plasmoid. Never found a decent counterpart for 3.5. +1&lt;/li&gt;&lt;li&gt;UI to Power Management features is finally as good as anything in the Windows world. Maybe better. +1&lt;/li&gt;&lt;li&gt;Shortcuts every-flipping-where. One day, I might even use them. +1&lt;/li&gt;&lt;li&gt;Lots of good repositories for fresh software, without having to jump through hoops. And the ppa/apt-add-repository combo is a winner. +1&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Total: +1. So I guess it was all worth. &lt;/p&gt;&lt;p&gt;(posted with this newfangled &lt;a href='http://blogilo.gnufolks.org'&gt;Bilbo / Blogilo&lt;/a&gt; thing. Could this be the day I get a decent blog-writing application?)&lt;/p&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3676448-823926064956325862?l=blog.pythonaro.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.pythonaro.com/feeds/823926064956325862/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3676448&amp;postID=823926064956325862' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3676448/posts/default/823926064956325862'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3676448/posts/default/823926064956325862'/><link rel='alternate' type='text/html' href='http://blog.pythonaro.com/2009/11/kubuntu-910-kde-433-first-impressions.html' title='Kubuntu 9.10 / KDE 4.3.3 first impressions'/><author><name>Giacomo Lacava</name><uri>https://profiles.google.com/112001311733983789595</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-WWGLdc8H1Uk/AAAAAAAAAAI/AAAAAAAAAYE/tA6iBrZYdng/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3676448.post-4910833295516490746</id><published>2009-11-12T12:22:00.004Z</published><updated>2009-11-12T13:17:29.891Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='GeekDiary'/><category scheme='http://www.blogger.com/atom/ns#' term='SiliconValley'/><category scheme='http://www.blogger.com/atom/ns#' term='itsadaylikethat'/><title type='text'>Berkeley hills</title><content type='html'>(on music from  Weezer's "&lt;a href="http://www.youtube.com/watch?v=KrBx8fdEZPk"&gt;Beverley Hills&lt;/a&gt;")&lt;br /&gt;&lt;br/&gt;

Where I come from isn't all that great&lt;br /&gt;
My mailserver is a piece of crap&lt;br /&gt;
My admin scripts are a little whack&lt;br /&gt;
And my friends are just as screwy as me&lt;br /&gt;&lt;br /&gt;

I didn't go to any cool schools&lt;br /&gt;
tech startups never looked at me&lt;br /&gt;
Why should they?&lt;br /&gt;
I ain't nobody and got nothing in my webblog&lt;br /&gt;&lt;br /&gt;

Berkeley hills&lt;br /&gt;
That's where I want to be&lt;br /&gt;
Livin' round Berkeley hills&lt;br /&gt;
Berkeley hills&lt;br /&gt;
Coding like a celebrity&lt;br /&gt;
Livin' round Berkeley hills&lt;br /&gt;&lt;br /&gt;

Look at all those geeky stars&lt;br /&gt;
They're all so intelligent and smart&lt;br /&gt;
When their companies get floated&lt;br /&gt;
they get more buyers than Wal-Mart...&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3676448-4910833295516490746?l=blog.pythonaro.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.pythonaro.com/feeds/4910833295516490746/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3676448&amp;postID=4910833295516490746' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3676448/posts/default/4910833295516490746'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3676448/posts/default/4910833295516490746'/><link rel='alternate' type='text/html' href='http://blog.pythonaro.com/2009/11/berkeley-hills.html' title='Berkeley hills'/><author><name>Giacomo Lacava</name><uri>https://profiles.google.com/112001311733983789595</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-WWGLdc8H1Uk/AAAAAAAAAAI/AAAAAAAAAYE/tA6iBrZYdng/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3676448.post-3158728993944086397</id><published>2009-10-22T23:46:00.003+01:00</published><updated>2009-10-23T01:03:49.993+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='personal'/><category scheme='http://www.blogger.com/atom/ns#' term='theinbredparty'/><category scheme='http://www.blogger.com/atom/ns#' term='Politics'/><category scheme='http://www.blogger.com/atom/ns#' term='BNP'/><title type='text'>Baroness Sayeeda Warsi Is The Perfect Example Of Why The BNP Can Win</title><content type='html'>&lt;p&gt;&lt;a href="http://en.wikipedia.org/wiki/Sayeeda_Warsi,_Baroness_Warsi"&gt;Baroness Sayeeda Warsi&lt;/a&gt;, the current Tory Shadow Minister for Community Cohesion, exemplifies why we will always have racist and intolerant fringes in any civilized country.&lt;/p&gt;

&lt;p&gt;Her Pakistani parents were allowed to settle in Britain and prosper, so much so that she could go to university in Leeds (when tuition fees were capped, by the way, thanks to public subsidies), then attend the York "Collage" &lt;a href="http://www.sayeedawarsi.com/biography/"&gt;[sic]&lt;/a&gt; of Law and rise among the ranks of a Tory party desperately looking for credibility with previously-shunned Asian communities. She's one of the sharpest careerists in the country, and was recently nominated as the most powerful Muslim woman in Britain by a magazine poll.&lt;/p&gt;
&lt;p&gt;So you have this fantastic example of positive immigration/integration/equality story, a first-generation Pakistani-English woman (!) making waves in a traditionally white/male-dominated right-wing party.&lt;/p&gt;
&lt;p&gt;Then she goes on TV, in a debate with the leader of &lt;a href="http://bnp.org.uk"&gt;the Inbred Party&lt;/a&gt;, and she says "we need to have a cap on immigration numbers, we need to drastically reduce the amount of immigrants". In other words, &lt;b&gt;she wants to stop other people from enjoying the sort of opportunities that her parents (and herself) enjoyed.&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;The astonishing short-sightedness of her statements would be ironic, if it weren't so incredibly sad. It fits very well in a certain stereotypical profile: the American Bush-supporting hardcore Republican with an unmistakably Italian or Irish surname; the Italian member of the Northern League with a Southern face and lots of money from Northern businesses; the Israeli farmer with a Russian accent that won't let Palestinians work his land... Even my Italian-Japanese wife, who studied and settled in Britain thanks to EU subsidies, constantly falls in this sort of rhetorical trap, this idea that there is an emergency (there isn't), social services are collapsing (they aren't), and the country is too full of people (it isn't), so we have to "defend" our hard-earned wealth by kicking out a few poor souls who are slightly different from "us". We "made it", and we have to stop people from competing with us on an equal foot. Jesus and his thing about casting stones &lt;i&gt;has&lt;/i&gt; to be "temporarily" put aside.&lt;/p&gt;
&lt;p&gt;All this clearly illustrates the age-old concept that &lt;b&gt;the last minority to be oppressed is often the first to oppress another, when given the opportunity&lt;/b&gt;. Baroness Warsi, in her political brinkmanship, is playing the inbreds' own game. The inbreds' leader Nick Griffin lost the personality battle tonight (he was clearly shaking and twitching throughout the entire programme, and was forced to admit his dabbling in racist and fascist ideologies), but he won the political battle: a tired Jack Straw was at pains to point out that Labour did not start any policy of migration and inclusion, Baroness Warsi clearly illustrated Tory policy as "inbreeding light" (on the much-exalted -- and highly discriminatory -- Australian model, also recently introduced in the UK by the Labour government), and the very intelligent LibDem guy kept as silent as he could on the subject. No one dared to defend the right of future generations to enjoy the same (very few) opportunities as previous ones, the right to fairness. They all waxed lyrical on the rights of current minorities not to be gassed and deported, but not one word was spent on the minorities of tomorrow. This was a political Dunkerque.&lt;/p&gt;

&lt;p&gt;Mainstream parties, if they really want to tackle the inbreds, cannot linger in their trenches; they must get to the offensive. The real problem is how to stop people fighting across racial lines what it's always been (and will always be) first and foremost an economic battle for wealth, a war among the poor. This concept has been lost when traditional Socialism was banished from politics in the 90s, but it's the only way to keep tribalist tendencies at bay. Unless we get back to it, the inbreds will keep winning, because people like Baroness Warsi will always be happy to act as the inbreds' own tool.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3676448-3158728993944086397?l=blog.pythonaro.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.pythonaro.com/feeds/3158728993944086397/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3676448&amp;postID=3158728993944086397' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3676448/posts/default/3158728993944086397'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3676448/posts/default/3158728993944086397'/><link rel='alternate' type='text/html' href='http://blog.pythonaro.com/2009/10/baroness-sayeeda-warsi-is-perfect.html' title='Baroness Sayeeda Warsi Is The Perfect Example Of Why The BNP Can Win'/><author><name>Giacomo Lacava</name><uri>https://profiles.google.com/112001311733983789595</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-WWGLdc8H1Uk/AAAAAAAAAAI/AAAAAAAAAYE/tA6iBrZYdng/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3676448.post-1139703270230397885</id><published>2009-09-22T10:08:00.004+01:00</published><updated>2009-09-22T10:31:55.942+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='webcomics'/><category scheme='http://www.blogger.com/atom/ns#' term='comics'/><category scheme='http://www.blogger.com/atom/ns#' term='cartoons'/><category scheme='http://www.blogger.com/atom/ns#' term='personal'/><category scheme='http://www.blogger.com/atom/ns#' term='books'/><category scheme='http://www.blogger.com/atom/ns#' term='literature'/><title type='text'>Metaversing</title><content type='html'>&lt;p&gt;Every once in a while, we get an ironic reminder of how mass-literature is fundamentally formulaic. Cartoonists are especially (but not exclusively) fond of this sort of joke, probably because the nature of &lt;i&gt;their&lt;/i&gt; work is often dismissed as "repetitive" and they have to get back at (mostly disingenuous) critics. Or maybe they just like playing the smartass.&lt;/p&gt;
&lt;p&gt;It is then customary, on my part, to faithfully print the cartoons in question and then point it out to whoever gets around my desk. Some leave in a troubled state of mind, suddenly faced by the emptiness of a universe they hitherto happily inhabited. A few laugh at the old joke. Some think I'm just weird.&lt;/p&gt;
&lt;p&gt;Last May, Aaron Diaz's &lt;i&gt;Dresden Codak&lt;/i&gt; gave us the already-legendary &lt;a href="http://dresdencodak.com/2009/05/11/42-essential-3rd-act-twists/"&gt;42 essential 3rd-act twists by Harvet Ismuths&lt;/a&gt;. Today, David Maliki's &lt;i&gt;Wondermark&lt;/i&gt; built the phantasmagoric &lt;a href="http://wondermark.com/554/"&gt;Electro-Plasmic HydroCephalic Genre-Fiction Generator 2000&lt;/a&gt;. They sit perfectly among the other stuff I hang around my pseudo-cubicle, like words by Carlos Williams, Borges and Pi&amp;ntilde;ero. Why keeping beauty out of the office, when there is so much of it?&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3676448-1139703270230397885?l=blog.pythonaro.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.pythonaro.com/feeds/1139703270230397885/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3676448&amp;postID=1139703270230397885' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3676448/posts/default/1139703270230397885'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3676448/posts/default/1139703270230397885'/><link rel='alternate' type='text/html' href='http://blog.pythonaro.com/2009/09/metaversing.html' title='Metaversing'/><author><name>Giacomo Lacava</name><uri>https://profiles.google.com/112001311733983789595</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-WWGLdc8H1Uk/AAAAAAAAAAI/AAAAAAAAAYE/tA6iBrZYdng/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3676448.post-7873412967616154008</id><published>2009-09-20T22:29:00.004+01:00</published><updated>2009-10-01T22:09:46.501+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='startup'/><category scheme='http://www.blogger.com/atom/ns#' term='GeekDiary'/><category scheme='http://www.blogger.com/atom/ns#' term='books'/><category scheme='http://www.blogger.com/atom/ns#' term='BobWalsh'/><title type='text'>"The Web Startup Success Guide" review, and how to tie-in better</title><content type='html'>&lt;p&gt;Yesterday, I bought Bob Walsh's latest book, &lt;a href="http://www.amazon.co.uk/gp/product/1430219858?ie=UTF8&amp;tag=subclassed-21&amp;linkCode=as2&amp;camp=1634&amp;creative=6738&amp;creativeASIN=1430219858"&gt;The Web Startup Success Guide&lt;/a&gt;&lt;img src="http://www.assoc-amazon.co.uk/e/ir?t=subclassed-21&amp;l=as2&amp;o=2&amp;a=1430219858" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" /&gt;. It's the only thing I've found in "mainstream" bookshops that seemed &lt;i&gt;really&lt;/i&gt; relevant to my current project, and indeed it is.&lt;/p&gt;&lt;p&gt;As "self-help-business" books go, this is a good one: the fluff is kept low (could have done with a few less interviews maybe, especially from bloody Guy Kawasaki -- if you're thinking of starting up and don't know him already, you haven't done your homework), and there's something for everybody, with plenty of practical advice and real tools you can use. A few ones are very US-centric (like &lt;a href="http://www.mint.com"&gt;mint.com&lt;/a&gt;, which is a real shame), but that's par for the course in this area.&lt;/p&gt;
&lt;p&gt;You can also see that Walsh practices what he preaches, and that's always a good sign. Minutes after I twitted on the subject, he "@replied"; he really monitors social media for marketing purposes as much as he says you should do.&lt;/p&gt;
&lt;p&gt;Walsh also couldn't miss the chance to pimp &lt;i&gt;his&lt;/i&gt; latest shot at startupping, &lt;a href="http://www.startuptodo.com"&gt;StartupToDo.com&lt;/a&gt;; after all, he's a good friend of Joel Spolsky, a master of self-publicity. Clearly the book and the site are part of a coordinated marketing effort. Nothing wrong with that: the book is NOT simply a brochure for the site, it's all good content, probably coming from the extensive research Walsh did while building the site as well as his personal experience (which was also enshrined in his previous effort, the famous &lt;a href="http://www.amazon.co.uk/gp/product/1590596013?ie=UTF8&amp;tag=subclassed-21&amp;linkCode=as2&amp;camp=1634&amp;creative=6738&amp;creativeASIN=1590596013"&gt;Micro-ISV: from Vision to Reality&lt;/a&gt;&lt;img src="http://www.assoc-amazon.co.uk/e/ir?t=subclassed-21&amp;l=as2&amp;o=2&amp;a=1590596013" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" /&gt;). What I've found a bit disappointing was that the effort is missing the very last bit. StartupToDo is due to launch next week, but has been in private beta (invite-only) for a while now. The book was published in July. It would have been cool for readers to get some sort of password, a "backdoor" to the beta program, so they could sign up while they're still fired up from the book. For two months, "faithful" followers were just able to leave an email to be reminded when the real launch would actually happen. I'm lucky as I have to wait just a few days, but in the age of Internet-time and instant gratification, that's still a lot. So, Bob (and whoever goes for the next book/website combo): you should try to increase your &lt;i&gt;conversion rate&lt;/i&gt; by making sure that readers can get in straight away.&lt;/p&gt;
&lt;p&gt;&lt;span style="color:red;"&gt;UPDATE:&lt;/span&gt; StartupToDo.com is now live, as Bob correctly points out below. I'm "toyg" on the site, feel free to "friend me"! I've wandered a bit around the site already... lots of good info, recommendations and links which I'm still trying to get my head around. I'll post a better review later.&lt;/p&gt;

&lt;p&gt;And now, back to plotting &lt;i&gt;my&lt;/i&gt; startup...&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3676448-7873412967616154008?l=blog.pythonaro.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.pythonaro.com/feeds/7873412967616154008/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3676448&amp;postID=7873412967616154008' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3676448/posts/default/7873412967616154008'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3676448/posts/default/7873412967616154008'/><link rel='alternate' type='text/html' href='http://blog.pythonaro.com/2009/09/web-startup-success-guide-review-and.html' title='&quot;The Web Startup Success Guide&quot; review, and how to tie-in better'/><author><name>Giacomo Lacava</name><uri>https://profiles.google.com/112001311733983789595</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-WWGLdc8H1Uk/AAAAAAAAAAI/AAAAAAAAAYE/tA6iBrZYdng/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3676448.post-7444468204842551296</id><published>2009-09-19T00:51:00.003+01:00</published><updated>2009-09-19T01:00:42.296+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='GeekDiary'/><category scheme='http://www.blogger.com/atom/ns#' term='Microsoft'/><category scheme='http://www.blogger.com/atom/ns#' term='diemicrosoftdie'/><title type='text'>oops I did it again</title><content type='html'>&lt;p&gt;Designed a very simple website. Looks wonderful in Firefox 3, Opera 9, Chrome 4, Safari 3, Konqueror 3. Yay, ready to upload then! Wait, I think I forgot something... oh yes, Internet Explorer! I'm working on Linux after all. Let's see... IE6: looks shit but who cares, nobody uses it anymore. IE7: looks marginally less shit, but still shit. Damn. Back to the css... this is why I left webplumbing.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3676448-7444468204842551296?l=blog.pythonaro.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.pythonaro.com/feeds/7444468204842551296/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3676448&amp;postID=7444468204842551296' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3676448/posts/default/7444468204842551296'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3676448/posts/default/7444468204842551296'/><link rel='alternate' type='text/html' href='http://blog.pythonaro.com/2009/09/oops-i-did-it-again.html' title='oops I did it again'/><author><name>Giacomo Lacava</name><uri>https://profiles.google.com/112001311733983789595</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-WWGLdc8H1Uk/AAAAAAAAAAI/AAAAAAAAAYE/tA6iBrZYdng/s512-c/photo.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3676448.post-1237927041514315014</id><published>2009-09-14T23:42:00.002+01:00</published><updated>2009-09-15T00:00:36.353+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='personal'/><title type='text'>On Secrecy</title><content type='html'>It's been almost a month since my last blogpost. Many, many things happened, but unfortunately I can't talk about them here, as much as I wish that wasn't the case. Hopefully circumstances will get better in 2010. Meanwhile, check out &lt;a href="http://www.imdb.com/title/tt0093936/"&gt;this classic movie&lt;/a&gt;, &lt;i&gt;completely&lt;/i&gt; unrelated to my situation (oh yeah).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3676448-1237927041514315014?l=blog.pythonaro.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.pythonaro.com/feeds/1237927041514315014/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3676448&amp;postID=1237927041514315014' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3676448/posts/default/1237927041514315014'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3676448/posts/default/1237927041514315014'/><link rel='alternate' type='text/html' href='http://blog.pythonaro.com/2009/09/on-secrecy.html' title='On Secrecy'/><author><name>Giacomo Lacava</name><uri>https://profiles.google.com/112001311733983789595</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-WWGLdc8H1Uk/AAAAAAAAAAI/AAAAAAAAAYE/tA6iBrZYdng/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3676448.post-8299033967617700621</id><published>2009-08-15T10:19:00.003+01:00</published><updated>2009-08-15T11:19:13.968+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='django'/><category scheme='http://www.blogger.com/atom/ns#' term='chm'/><category scheme='http://www.blogger.com/atom/ns#' term='GeekDiary'/><title type='text'>Django 1.1 help file CHM version</title><content type='html'>&lt;p&gt;This is a funny story.&lt;/p&gt;
&lt;p&gt;I happen to think Microsoft's proprietary &lt;abbr title="Compiled Help Messages"&gt;CHM&lt;/abbr&gt; format is lovely. So I went looking for a CHM version of docs for Django, and google found it for me &lt;a href="http://charupload.wordpress.com/2007/12/02/django-documentation-chm/"&gt;on this blog&lt;/a&gt;. I duly downloaded it, tried to to open it and... it wouldn't display. I could only see the &lt;abbr title="Table of contents"&gt;TOC&lt;/abbr&gt;, but not the actual documents. I thought this might be a corrupted version, and it was for an alpha release of Django anyway, so I though I'd compile a version myself. After all, these docs are built with Sphinx, which apparently can generate all sorts of formats...&lt;/p&gt;
&lt;p&gt;So here's the procedure to compile django's docs:&lt;/p&gt;
&lt;ol&gt;&lt;li&gt;download and install Sphinx. &lt;pre&gt;Easy_install Sphinx&lt;/pre&gt; was all I needed. Hurrah for Python.&lt;/li&gt;
&lt;li&gt;Run Sphinx to generate the initial files:&lt;pre&gt;cd Django-1.1/docs
mkdir _build/html
%PYTHONDIR%\scripts\sphinx-build.exe -b htmlhelp -d _build\doctrees . _build\html
&lt;/pre&gt;&lt;/li&gt;
&lt;li&gt;Download and install &lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=00535334-c8a6-452f-9aa0-d597d16580cc&amp;displaylang=en"&gt;Htmlhelp.exe from the Microsoft site&lt;/a&gt;. This will give you the HTML Help Workshop.&lt;/li&gt;
&lt;li&gt;launch the workshop, File -&gt; Compile..., select the file Djangodoc.hhc which should now be in _build/html, and this will produce the chm.&lt;/li&gt;&lt;li&gt;...??? Profit!&lt;/li&gt;&lt;/ol&gt;
&lt;p&gt;... Then I found out the reason that downloaded CHM didn't work was &lt;a href="http://www.west-wind.com/weblog/posts/581253.aspx"&gt;a stupid patch from Microsoft&lt;/a&gt;. Ouch.&lt;/p&gt;
&lt;p&gt;Anyway, if you need it, here's the file: &lt;a href="http://lab.pythonaro.com/releases/Djangodoc-1_1.chm"&gt;Djangodocs 1.1 in CHM format&lt;/a&gt;. If it doesn't work, make sure you follow &lt;a href="http://www.west-wind.com/weblog/posts/581253.aspx"&gt;this suggested procedure&lt;/a&gt;, and save yourself some time...&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3676448-8299033967617700621?l=blog.pythonaro.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.pythonaro.com/feeds/8299033967617700621/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3676448&amp;postID=8299033967617700621' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3676448/posts/default/8299033967617700621'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3676448/posts/default/8299033967617700621'/><link rel='alternate' type='text/html' href='http://blog.pythonaro.com/2009/08/django-11-help-file-chm-version.html' title='Django 1.1 help file CHM version'/><author><name>Giacomo Lacava</name><uri>https://profiles.google.com/112001311733983789595</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-WWGLdc8H1Uk/AAAAAAAAAAI/AAAAAAAAAYE/tA6iBrZYdng/s512-c/photo.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3676448.post-8557894809160647845</id><published>2009-08-10T11:31:00.004+01:00</published><updated>2009-08-10T11:49:12.712+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='whyIhavedoubtsaboutmovingtotheus'/><category scheme='http://www.blogger.com/atom/ns#' term='personal'/><category scheme='http://www.blogger.com/atom/ns#' term='racism'/><category scheme='http://www.blogger.com/atom/ns#' term='discrimination'/><title type='text'>Apparently, US bureaucrats hate bilingual kids</title><content type='html'>&lt;p&gt;&lt;em&gt;&lt;a href="http://bloggingonbilingualism.com/2009/05/08/english-proficiency-tests-huh/"&gt;Bilingual children surely must be stupid&lt;/a&gt;&lt;/em&gt;. The reasoning behind the process is typical of laws promoted by George W. Bush: if you are not a white man from a privileged "amurrican" background, you surely must be stupid. In this case, it's the "No Child Left Behind" act, which results in "subtle" discriminatory practices towards children of immigrants regardless of their actual skills.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3676448-8557894809160647845?l=blog.pythonaro.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.pythonaro.com/feeds/8557894809160647845/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3676448&amp;postID=8557894809160647845' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3676448/posts/default/8557894809160647845'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3676448/posts/default/8557894809160647845'/><link rel='alternate' type='text/html' href='http://blog.pythonaro.com/2009/08/apparently-us-bureaucrats-hate.html' title='Apparently, US bureaucrats hate bilingual kids'/><author><name>Giacomo Lacava</name><uri>https://profiles.google.com/112001311733983789595</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-WWGLdc8H1Uk/AAAAAAAAAAI/AAAAAAAAAYE/tA6iBrZYdng/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3676448.post-6574874389915278553</id><published>2009-07-27T15:00:00.004+01:00</published><updated>2009-07-27T15:13:12.969+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='GeekDiary'/><category scheme='http://www.blogger.com/atom/ns#' term='vmware'/><category scheme='http://www.blogger.com/atom/ns#' term='OEL'/><category scheme='http://www.blogger.com/atom/ns#' term='oracle'/><title type='text'>Oracle (Red Hat) Enterprise Linux 5 on VMware Workstation 5.5.x</title><content type='html'>&lt;p&gt;Just wasted an hour trying to understand why VMware Tools wouldn't properly fix the X server on Oracle "Unbreakable" Enterprise Linux 5. The answer is: because the Tools coming with VMware Workstation 5.5 don't really work with such a modern distribution. So the answer was:
&lt;ol&gt;&lt;li&gt;get hold of a newer release (Workstation 6.0.2 did it for me)&lt;/li&gt;&lt;li&gt;find the file "linux.iso", and copy it across to the old Workstation (you might want to rename/backup the original, just in case) in the same position.&lt;/li&gt;&lt;li&gt;perform a regular installation of VMware Tools. It should correctly detect your X.Org 7.1 and fix it properly. (Note: if you get errors coming from VFS, it means that VW was too quick in unmounting the drive. Remount it, then copy the rpm to the local filesystem before reinstalling.)&lt;/li&gt;&lt;/ol&gt;&lt;/p&gt;
&lt;p&gt;If you haven't got a newer version of VMware, try adding the following lines inside the "Monitor" section of your /etc/X11/xorg.conf:
&lt;pre&gt;HorizSync 1-10000
VertRefresh 1-10000&lt;/pre&gt;
It &lt;i&gt;might&lt;/i&gt; just be enough.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3676448-6574874389915278553?l=blog.pythonaro.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.pythonaro.com/feeds/6574874389915278553/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3676448&amp;postID=6574874389915278553' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3676448/posts/default/6574874389915278553'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3676448/posts/default/6574874389915278553'/><link rel='alternate' type='text/html' href='http://blog.pythonaro.com/2009/07/oracle-red-hat-enterprise-linux-5-on.html' title='Oracle (Red Hat) Enterprise Linux 5 on VMware Workstation 5.5.x'/><author><name>Giacomo Lacava</name><uri>https://profiles.google.com/112001311733983789595</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-WWGLdc8H1Uk/AAAAAAAAAAI/AAAAAAAAAYE/tA6iBrZYdng/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3676448.post-665443625507121690</id><published>2009-07-05T19:37:00.005+01:00</published><updated>2009-07-05T20:10:55.747+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='OpenBSD'/><category scheme='http://www.blogger.com/atom/ns#' term='GeekDiary'/><category scheme='http://www.blogger.com/atom/ns#' term='Windows'/><category scheme='http://www.blogger.com/atom/ns#' term='opensolaris'/><title type='text'>First impressions of OpenSolaris 2009.06, Windows Server 2008, and other various OSes</title><content type='html'>&lt;p&gt;Having &lt;a href="http://blog.pythonaro.com/2009/06/earth-to-vmware-make-some-debs-please.html"&gt;recently installed VMWare Server&lt;/a&gt;, I went on a "installfest of one": Windows Server 2008, Kubuntu 9.04, OpenBSD 4.5 and OpenSolaris 2009.06 are now happily chugging along on my server (which is apparently handling the situation without breaking a sweat -- impressive), with Arch Linux next on the list.&lt;/p&gt;
&lt;p&gt;I have to say that I've been surprisingly impressed by the two "most commercial" offerings.&lt;/p&gt;
&lt;p&gt;Windows 2008 feels really fast and lean. I don't like the new filemanager, but it looks like some of the infamous Windows bloat has been removed here and there. Getting asked for the Administrator password every 5 seconds is irritating, but at least the "Run as Administrator" menu item is more accessible than it used to be, so you can (mostly) preempt it. Also, it seems to work better with Samba, but this might be because Samba itself improved a lot (probably thanks to certain EU antitrust actions, but I digress).&lt;/p&gt;
&lt;p&gt;I was even more impressed by OpenSolaris. Booting in a LiveCD before installation is always nice. The customized Gnome 2.24 (aka "Java Desktop System") is the most polished Gnome I've ever seen. The package manager makes it easy to get additional software (and to get rid of unwanted megabytes of localization files for all sorts of languages). It was a breeze to install NetBeans and its plugins (Python support!), I'll have to give it a spin. It's also curious to see in action Sun's typical "network philosophy": for example, /home folders are NFS mountpoints, which makes a lot of sense if you think about it. The drawbacks are that some things &lt;i&gt;don't&lt;/i&gt; make sense: e.g. the Gnome utility to track free disk space goes bonkers (34 free gb when the disk is only 10...?). But these are details. I'd really like to spend some time learning permissions, ZFS, zones and all that; I hope I'll get some time at work.&lt;/p&gt;
&lt;p&gt;In retrospect, configuring my first DNS server on OpenBSD 4.5 was almost uneventful. I'm not sure I even understand what I did, but it works :) I plan to expose this box to the Big Bad Internet at some point in the future, does anyone need a bit of space?&lt;/p&gt;
&lt;p&gt;I guess the moral of the story is: VmWare server is very nice, when you have the right iron to run it on ;)&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3676448-665443625507121690?l=blog.pythonaro.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.pythonaro.com/feeds/665443625507121690/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3676448&amp;postID=665443625507121690' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3676448/posts/default/665443625507121690'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3676448/posts/default/665443625507121690'/><link rel='alternate' type='text/html' href='http://blog.pythonaro.com/2009/07/first-impressions-of-opensolaris-200906.html' title='First impressions of OpenSolaris 2009.06, Windows Server 2008, and other various OSes'/><author><name>Giacomo Lacava</name><uri>https://profiles.google.com/112001311733983789595</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-WWGLdc8H1Uk/AAAAAAAAAAI/AAAAAAAAAYE/tA6iBrZYdng/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3676448.post-2312758283823899913</id><published>2009-06-29T13:40:00.002+01:00</published><updated>2009-06-29T14:18:58.803+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='GeekDiary'/><category scheme='http://www.blogger.com/atom/ns#' term='Debian'/><category scheme='http://www.blogger.com/atom/ns#' term='vmware'/><title type='text'>Earth to VmWare: make some DEBs, please</title><content type='html'>&lt;p&gt;I've recently installed &lt;a href="http://www.vmware.com/products/server/"&gt;VmWare Server&lt;/a&gt; on a new box. For some reason, VmWare packages &lt;abbr title="Red-hat Package Manager"&gt;RPM&lt;/abbr&gt;s but not &lt;abbr title="Debian package"&gt;DEB&lt;/abbr&gt;s, so I had to do a nonstandard local install from the generic .tar.gz installer. That's not difficult, but now there is no way for me to track updates, including security-related ones.&lt;/p&gt;
&lt;p&gt;Come on VmWare, get your act together: it's 2009, people &lt;em&gt;expect&lt;/em&gt; this sort of feature these days. Since you bother to build &lt;abbr title="Red-hat Package Manager"&gt;RPM&lt;/abbr&gt;s, it's clear that you &lt;em&gt;can&lt;/em&gt; package stuff properly if you want to. If you are not sure what distribution to pick in the sea of available Debian-clones, just track Debian-stable and let the community do the rest.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3676448-2312758283823899913?l=blog.pythonaro.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.pythonaro.com/feeds/2312758283823899913/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3676448&amp;postID=2312758283823899913' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3676448/posts/default/2312758283823899913'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3676448/posts/default/2312758283823899913'/><link rel='alternate' type='text/html' href='http://blog.pythonaro.com/2009/06/earth-to-vmware-make-some-debs-please.html' title='Earth to VmWare: make some DEBs, please'/><author><name>Giacomo Lacava</name><uri>https://profiles.google.com/112001311733983789595</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-WWGLdc8H1Uk/AAAAAAAAAAI/AAAAAAAAAYE/tA6iBrZYdng/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3676448.post-2154471742620443360</id><published>2009-06-08T12:50:00.001+01:00</published><updated>2009-06-08T12:51:39.036+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='personal'/><category scheme='http://www.blogger.com/atom/ns#' term='Politics'/><title type='text'>My new meme</title><content type='html'>&lt;img src="http://blog.pythonaro.com/static/dontblameme.gif" /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3676448-2154471742620443360?l=blog.pythonaro.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.pythonaro.com/feeds/2154471742620443360/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3676448&amp;postID=2154471742620443360' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3676448/posts/default/2154471742620443360'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3676448/posts/default/2154471742620443360'/><link rel='alternate' type='text/html' href='http://blog.pythonaro.com/2009/06/my-new-meme.html' title='My new meme'/><author><name>Giacomo Lacava</name><uri>https://profiles.google.com/112001311733983789595</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-WWGLdc8H1Uk/AAAAAAAAAAI/AAAAAAAAAYE/tA6iBrZYdng/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3676448.post-4804990054878959699</id><published>2009-06-07T19:54:00.004+01:00</published><updated>2009-06-07T20:18:03.597+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tarfile'/><category scheme='http://www.blogger.com/atom/ns#' term='GeekDiary'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='zipfile'/><title type='text'>The pains of backward-compatibility</title><content type='html'>Problem:
&lt;ul&gt;&lt;li&gt;you have several ZIP and TAR archives&lt;/li&gt;
&lt;li&gt;you have to replace ONE FILE in each of them&lt;/li&gt;
&lt;li&gt;you only have Python 2.5&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;From what I see, the only solution in this situation is to completely branch off the two cases, because the relevant Python modules (tarfile and zipfile) have such a completely different interface.&lt;/p&gt;
&lt;p&gt;None of them can simply replace or delete one single file, so you have to unpack the entire archive, edit the file, repack. Inefficient, but consistent approach.&lt;br /&gt;Then ZipFile object will &lt;i&gt;read bytes&lt;/i&gt;, whereas TarFile objects will &lt;i&gt;extract files&lt;/i&gt;.&lt;br /&gt;Finally, ZipFile doesn't feature a method to extract all files in one go, like TarFile has. To be honest, zipfile &lt;i&gt;sucks&lt;/i&gt; in pre-2.6 VMs.&lt;br /&gt;This means that what you can really do (more or less) in the same way (with some essential metaprogramming) is opening/closing archives, listing the contained files, and adding new files.&lt;/p&gt;
&lt;p&gt;Things are much, much better in 2.6 and 3.0, where both interfaces are almost the same, but if you are stuck with 2.5 (like me) then you'll have to do with inelegant solutions. And if you are reading this, maybe you'll waste less time.&lt;/p&gt;
&lt;p&gt;&lt;small&gt;(Memo to self: always, ALWAYS do the easiest thing that could possibly work, no matter how inelegant it is. Premature optimization &lt;i&gt;really&lt;/i&gt; is the root of all evil.)&lt;/small&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3676448-4804990054878959699?l=blog.pythonaro.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.pythonaro.com/feeds/4804990054878959699/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3676448&amp;postID=4804990054878959699' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3676448/posts/default/4804990054878959699'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3676448/posts/default/4804990054878959699'/><link rel='alternate' type='text/html' href='http://blog.pythonaro.com/2009/06/pains-of-backward-compatibility.html' title='The pains of backward-compatibility'/><author><name>Giacomo Lacava</name><uri>https://profiles.google.com/112001311733983789595</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-WWGLdc8H1Uk/AAAAAAAAAAI/AAAAAAAAAYE/tA6iBrZYdng/s512-c/photo.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3676448.post-3473945508823216866</id><published>2009-06-01T09:08:00.003+01:00</published><updated>2009-06-01T09:13:11.477+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='GeekDiary'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>note to self</title><content type='html'>&lt;p&gt;When you start writing hacks like this:
&lt;pre&gt;for attr in ['Something1','someThing2'...'SomeThing215']:
    self.__dict__[attr.lower()+'Widget'].do_something(someValue)
    self.__dict__[attr.lower()+'Widget'].set_parameter(someparameter)&lt;/pre&gt;
... it's probably time for a subclass.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3676448-3473945508823216866?l=blog.pythonaro.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.pythonaro.com/feeds/3473945508823216866/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3676448&amp;postID=3473945508823216866' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3676448/posts/default/3473945508823216866'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3676448/posts/default/3473945508823216866'/><link rel='alternate' type='text/html' href='http://blog.pythonaro.com/2009/06/note-to-self.html' title='note to self'/><author><name>Giacomo Lacava</name><uri>https://profiles.google.com/112001311733983789595</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-WWGLdc8H1Uk/AAAAAAAAAAI/AAAAAAAAAYE/tA6iBrZYdng/s512-c/photo.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3676448.post-1567003733559011831</id><published>2009-05-30T09:45:00.007+01:00</published><updated>2009-06-03T18:43:48.103+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ukip'/><category scheme='http://www.blogger.com/atom/ns#' term='personal'/><category scheme='http://www.blogger.com/atom/ns#' term='tories'/><category scheme='http://www.blogger.com/atom/ns#' term='libdems'/><category scheme='http://www.blogger.com/atom/ns#' term='Politics'/><category scheme='http://www.blogger.com/atom/ns#' term='labour'/><category scheme='http://www.blogger.com/atom/ns#' term='greens'/><title type='text'>"Sigh. I really wish I could vote Labour, but..."</title><content type='html'>"...then they go and put Arlene McCarthy top of the ticket in the North West".&lt;br /&gt;
"Do you mean &lt;a href="http://eupat.ffii.org/players/amccarthy/index.en.html"&gt;that Arlene McCarthy?&lt;/a&gt; The one who pushed so hard for software patents?"&lt;br /&gt;
"Yes, &lt;a href="http://kwiki.ffii.org/SwpatamccarthyEn"&gt;that Arlene McCarthy&lt;/a&gt;."&lt;br /&gt;
"Man, that must hurt."&lt;br /&gt;
"Indeed. And the other ones in the list look more of the same: people concerned mostly with the welfare of big business."&lt;br /&gt;
"But at least the campaign message will surely be about your 'sweet spots': fair opportunities, workers' rights, social Europe..."&lt;br /&gt;
"Er, no, actually. It's a riff on protectionist themes: fight for the UK, defend the country, etc. You would easily confuse them for &lt;a href="http://blog.pythonaro.com/2009/05/bnp-inbred-party.html"&gt;BNP&lt;/a&gt; or &lt;abbr title="UK Independence Party"&gt;UKIP&lt;/abbr&gt; material."&lt;br /&gt;
"I see."&lt;br /&gt;
"So it's gonna be Green again, I guess."&lt;br /&gt;
"F*ck me, the tree-huggers! Man, you even hate recycling schemes! Are you all right? Let me check your temperature..."&lt;br /&gt;
"Actually, their policies are quite sensible these days. They &lt;a href="http://www.greenparty.org.uk/news-archive/2851.html"&gt;really get it&lt;/a&gt; on technology issues. &lt;a href="http://www.openrightsgroup.org/about-org/org-staff/#Jim"&gt;They even have people in the Open Rigths Group&lt;/a&gt;."&lt;br /&gt;
"Well, ain't you a single-issue voter."&lt;br /&gt;
"Single-issue? Labour got it wrong on ALL the issues in the last few years: DRM, net filtering, open source, software patents... they even fought to be exempted from directives on workers' rights!"&lt;br /&gt;
"Yeah, but I mean, the enviro-nazi are full-on plane-haters..."&lt;br /&gt;
"I don't agree with their shenanigans on Heathrow either, but I think they started to understand  that being anti-planes is a lost cause. And we do need more anti-nuclear activists, the original generation basically sold out to Blair."&lt;br /&gt;
"What about the Lib-Dems? Apart from Nick 'David Cameron wannabe' Clegg, they do have good people on."&lt;br /&gt;
"Yeah, I'm checking them out, but they always leave me underwhelmed. The best one they have, Chris Davies, is top of the ticket and is going to get a seat anyway."&lt;br /&gt;
"What about the Tories? David Cameron looks like a nice fellow."&lt;br /&gt;
"I'm actually worried by how much I agreed with the Conservative spokesperson on the last BBC Question Time, very intelligent man. But I'm still convinced they'll pull a &lt;abbr title="George Washington Bush"&gt;GWB&lt;/abbr&gt;-style U-turn as soon as they are in government."&lt;br /&gt; 
"And I guess you wouldn't consider &lt;abbr title="UK Independence Party"&gt;UKIP&lt;/abbr&gt;..."&lt;br /&gt;
"Are you serious? Their motto is 'we're just xenophobes, not full-on racists like the &lt;a href="http://blog.pythonaro.com/2009/05/bnp-inbred-party.html"&gt;BNP&lt;/a&gt;'. If they had free reign, I probably couldn't live here."&lt;br /&gt;
"That settles it, then. Not that I care, I'll campaign for the one with the bigger tits and beat your silly people anyway."&lt;br /&gt;
"Eh. Gotta run now, that's enough politics on the blog for at least another year. It's always so nice talking to you, Mr.Murdoch."

&lt;p&gt;[UPDATE: If you still don't know who to vote for in UK constituencies, have a look at &lt;a href="http://euelection.openrightsgroup.org/"&gt;the Open Rights' Group page listing candidate positions on technology issues&lt;/a&gt;. It's fantastically simple and well-designed.]&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3676448-1567003733559011831?l=blog.pythonaro.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.pythonaro.com/feeds/1567003733559011831/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3676448&amp;postID=1567003733559011831' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3676448/posts/default/1567003733559011831'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3676448/posts/default/1567003733559011831'/><link rel='alternate' type='text/html' href='http://blog.pythonaro.com/2009/05/sigh-i-really-wish-i-could-vote-labour.html' title='&quot;Sigh. I really wish I could vote Labour, but...&quot;'/><author><name>Giacomo Lacava</name><uri>https://profiles.google.com/112001311733983789595</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-WWGLdc8H1Uk/AAAAAAAAAAI/AAAAAAAAAYE/tA6iBrZYdng/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3676448.post-2781692154559727885</id><published>2009-05-29T14:50:00.006+01:00</published><updated>2009-05-29T15:28:18.506+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='personal'/><category scheme='http://www.blogger.com/atom/ns#' term='GeekDiary'/><category scheme='http://www.blogger.com/atom/ns#' term='theinbredparty'/><category scheme='http://www.blogger.com/atom/ns#' term='Politics'/><category scheme='http://www.blogger.com/atom/ns#' term='BNP'/><title type='text'>BNP: the inbred party</title><content type='html'>&lt;p&gt;I try not to worry about political issues too much these days, but this post is not really about politics. &lt;i&gt;Comedy&lt;/i&gt;, rather.&lt;/p&gt;
&lt;p&gt;David Ottewell, aggravated by people doubting the veracity of reports depicting &lt;acronym title="British National Party"&gt;BNP&lt;/acronym&gt; members as full-on racists, &lt;a href="http://blogs.manchestereveningnews.co.uk/politics/2009/05/post_700.html"&gt;reposted&lt;/a&gt; part of &lt;a href="http://bnp.org.uk/Constitution%209th%20Ed%20Sep%202005.pdf"&gt;their constitution&lt;/a&gt;.&lt;/p&gt;
&lt;blockquote&gt;&lt;i&gt;&lt;ol&gt;&lt;li&gt;The British National Party represents the collective National, Environmental, Political, Racial, Folkish, Social, Cultural, Religious and Economic interests of the indigenous Anglo-Saxon, Celtic and Norse folk communities of Britain and those we regard as closely related and ethnically assimilated or assimilable aboriginal members of the European race also resident in Britain. &lt;b&gt;Membership of the BNP is strictly defined within the terms of, and our members also self define themselves within, the legal ambit of a defined ‘racial group’&lt;/b&gt; this being ‘Indigenous Caucasian’ and defined ‘ethnic groups’ emanating from that Race as specified in law in the House of Lords case of Mandla V Dowell Lee (1983) 1 ALL ER 1062, HL.&lt;/li&gt;&lt;li&gt;The indigenous British ethnic groups deriving from the class of ‘Indigenous Caucasian’ consist of members of: &lt;ol&gt;&lt;li&gt;The Anglo-Saxon Folk Community;&lt;/li&gt;&lt;li&gt;The Celtic Scottish Folk Community; &lt;/li&gt;&lt;li&gt;The Scots-Northern Irish Folk Community; &lt;/li&gt;&lt;li&gt;The Celtic Welsh Folk Community; &lt;/li&gt;&lt;li&gt;The Celtic Irish Folk Community; &lt;/li&gt;&lt;li&gt;The Celtic Cornish Folk Community; &lt;/li&gt;&lt;li&gt;The Anglo-Saxon-Celtic Folk Community; &lt;/li&gt;&lt;li&gt;The Celtic-Norse Folk Community; &lt;/li&gt;&lt;li&gt;The Anglo-Saxon-Norse Folk Community; &lt;/li&gt;&lt;li&gt;The Anglo-Saxon-Indigenous European Folk Community; &lt;/li&gt;&lt;li&gt;Members of these ethnic groups who reside either within or outside Europe but ethnically derive from them.&lt;/ol&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;Membership of the party shall be open only to those who are 16 years of age or over and whose ethnic origin is listed within Sub-section 2&lt;/b&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/i&gt;&lt;/blockquote&gt;

&lt;p&gt;The Anglo-Saxon-Norse Welsh-Scottish and Norse-Irish Celtic "Folk Communities" didn't make the list; was it an oversight, or is it because everyone knows they're a bunch of lazy asylum seekers? I'd also be curious to understand how they can check these prerequisites before admission, but I guess this is an implementation detail.&lt;/p&gt;
&lt;p&gt;What really matters, though, is the typical trademark of nazi paranoia: the obsession to precisely classify races on the basis of imaginary concepts. The classic result is this exact sort of documents, produced by people who fail to see the absurdity of their own statements and the self-offensive message they really communicate. What this document really says is that &lt;i&gt;&lt;b&gt;"&lt;acronym title="British National Party"&gt;BNP&lt;/acronym&gt; members are all inbred"&lt;/b&gt;&lt;/i&gt;. I wonder if that is appealing to their target demographic.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3676448-2781692154559727885?l=blog.pythonaro.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.pythonaro.com/feeds/2781692154559727885/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3676448&amp;postID=2781692154559727885' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3676448/posts/default/2781692154559727885'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3676448/posts/default/2781692154559727885'/><link rel='alternate' type='text/html' href='http://blog.pythonaro.com/2009/05/bnp-inbred-party.html' title='BNP: the inbred party'/><author><name>Giacomo Lacava</name><uri>https://profiles.google.com/112001311733983789595</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-WWGLdc8H1Uk/AAAAAAAAAAI/AAAAAAAAAYE/tA6iBrZYdng/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3676448.post-5022572966117424343</id><published>2009-05-29T09:57:00.004+01:00</published><updated>2009-05-29T10:52:06.922+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mercurial'/><category scheme='http://www.blogger.com/atom/ns#' term='GeekDiary'/><category scheme='http://www.blogger.com/atom/ns#' term='svn'/><title type='text'>Notes on Mercurial / MQ and Subversion</title><content type='html'>&lt;p&gt;I am currently working on some patches for a project. The project uses &lt;a href="http://subversion.tigris.org"&gt;Subversion&lt;/a&gt; for version control; I won't have commit rights, but I still want to track the original sources as well as my changes. Rather than configuring svn externals (which are really thought out for different usecases, typically libraries), I decided to try my hand at one of the newest Distributed Version Control Systems, which are built exactly for this sort of scenario.&lt;/p&gt;
&lt;p&gt;Being a Python-whore, I obviously picked &lt;a href="http://www.selenic.com/mercurial/wiki/"&gt;Mercurial&lt;/a&gt;. Here's a little memo with what I've done, mostly following &lt;a href="http://www.selenic.com/mercurial/wiki/WorkingWithSubversion"&gt;the page on the Mercurial wiki dedicated to Subversion interop&lt;/a&gt;. Note that this may not be the optimal solution, it's a work-in-progress:&lt;/p&gt;
&lt;ol&gt;&lt;li&gt;enable the MQ extension in &lt;a href="www.selenic.com/mercurial/hgrc.5.html"&gt;.hgrc or Mercurial.ini&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;check out the original Subversion repository&lt;/li&gt;
&lt;li&gt;in the checked-out copy, do&lt;pre&gt;hg init&lt;/pre&gt;&lt;/li&gt;
&lt;li&gt;in the same place, create a file called .hgignore, listing the files we don't want to track; typically, this means the .svn/ directory and .hgignore itself&lt;/li&gt;
&lt;li&gt;add all the files to Mercurial: &lt;pre&gt;hg ci -Am "Original svn checkout"&lt;/pre&gt;&lt;/li&gt;
&lt;li&gt;initialize MQ: &lt;pre&gt;hg qinit -c&lt;/pre&gt;&lt;/li&gt;
&lt;li&gt;if you have existing patches, you want to start applying them now. If they create new files, you'll need to "hg add" them&lt;/li&gt;
&lt;li&gt;when you want to save state, use &lt;pre&gt;hg qnew -f mynewpatch&lt;/pre&gt;This will create a patch called "mynewpatch" in the MQ stack, listing differences with the original version, and it will consider it as applied. &lt;/li&gt;&lt;/ol&gt;
&lt;p&gt;In this way, I can always resync the svn repository (using svn itself), commit the new "upstream" revision to the local hg repository, then reapply the patch queue. At least in theory :)&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3676448-5022572966117424343?l=blog.pythonaro.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.pythonaro.com/feeds/5022572966117424343/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3676448&amp;postID=5022572966117424343' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3676448/posts/default/5022572966117424343'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3676448/posts/default/5022572966117424343'/><link rel='alternate' type='text/html' href='http://blog.pythonaro.com/2009/05/notes-on-mercurial-mq-and-subversion.html' title='Notes on Mercurial / MQ and Subversion'/><author><name>Giacomo Lacava</name><uri>https://profiles.google.com/112001311733983789595</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-WWGLdc8H1Uk/AAAAAAAAAAI/AAAAAAAAAYE/tA6iBrZYdng/s512-c/photo.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3676448.post-3016808432399088930</id><published>2009-05-22T02:39:00.008+01:00</published><updated>2009-05-22T03:46:41.389+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='journalism'/><category scheme='http://www.blogger.com/atom/ns#' term='ideas'/><category scheme='http://www.blogger.com/atom/ns#' term='GeekDiary'/><category scheme='http://www.blogger.com/atom/ns#' term='feedreaders'/><category scheme='http://www.blogger.com/atom/ns#' term='blogging'/><title type='text'>The Future of Journalism, Today.</title><content type='html'>&lt;p&gt;Seeing how everyone and his dog is nowadays concerned with "the future of Journalism", I'm throwing this idea to the wind, because obviously I won't have time to implement it, I've been saying it for ages, and it's not very original anyway (I'm surprised nobody built it yet, but the Guardian is getting there). It can be done today, in a couple of months, leveraging existing tools. It's not a start-up project though, mainly because you need contacts in the journos community to get a few high-profile hacks to attract critical mass... The Huffington Post could do it, once they burn through their current venture capital. But I digress.&lt;/p&gt;

The Model:
&lt;ul&gt;&lt;li&gt; Author has a site (e.g. at http://content.someauthor.name) where he publishes his content.&lt;ul&gt;&lt;li&gt; public feed is free, summary-only, with ads. (To view the full article, pay $0.49, or get free article with ads, or  pay for "big" stories / analysis)&lt;/li&gt;&lt;li&gt; private feed is full, no ads, $1.49 for 4 articles, $3.99 or $4.99 for 10 articles, $49.99 per year.&lt;/li&gt;&lt;li&gt; subscription gives you full revision history (something the "pro" will want)&lt;/li&gt;&lt;li&gt; subscription gives you sub-by-email&lt;/li&gt;&lt;li&gt; articles can include trackback-like links to aggregators ("published in NewZine on 21/03/2009" etc)&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt; "NewZine" aggregates feeds from various authors&lt;ul&gt;&lt;li&gt; articles are free to view with ads&lt;/li&gt;&lt;li&gt; aggregated feeds are summary-only, with ads.&lt;/li&gt;&lt;li&gt; aggregator pays author 40% of ad revenue on "his" page-articles, or agreed flat.&lt;/li&gt;&lt;li&gt; aggregator pages include canonical links to author site.&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br&gt;Pro:&lt;br&gt;&lt;ul&gt;&lt;li&gt; Author gets much more visibility. You can have Toynbee without &lt;i&gt;The Guardian&lt;/i&gt;, Monbiot without &lt;i&gt;Monde Diplo&lt;/i&gt;, Mura without &lt;i&gt;La Repubblica&lt;/i&gt;, etc. &lt;/li&gt;&lt;li&gt; Author is not subject to "gatekeeping", can potentially "make it" on his own. Platform is very open and flexible.&lt;/li&gt;&lt;li&gt; Author can potentially get more money-per-article, especially if the content is good. See how the &lt;em&gt;iTunes model&lt;/em&gt; is making people pay &lt;i&gt;more&lt;/i&gt; for music even though they don't realize it. This is the main selling point, because you need to persuade &lt;i&gt;authors&lt;/i&gt;, not &lt;i&gt;companies&lt;/i&gt;, to switch. As long as authors will crave the (limited but generous) safety net from the current (oligarchic and scarcity-based) setup, the revolution won't happen.&lt;/li&gt;&lt;li&gt;Lower incentives to work for "agencies" like Reuters, which are bad for the market and will die anyway. Aggregators become real-time agencies.&lt;/li&gt;&lt;li&gt; Aggregator can filter good/bad articles, keeping quality high, without risking much.&lt;/li&gt;&lt;li&gt; Aggregator has extremely low costs, and very high traffic (== money from ads).&lt;/li&gt;&lt;li&gt;Feeds can have all sort of metadata (location, tags..), making it possible to have automated semantic services ("get me all the local news for Stockport", "give me all movie reviews" etc) without any further editorial efforts.&lt;/li&gt;&lt;/ul&gt;&lt;br&gt;Cons:&lt;br&gt;&lt;ul&gt;&lt;li&gt; can take a while to break even&lt;/li&gt;&lt;li&gt; newsreaders might not support private feeds (like GoogleReader)&lt;/li&gt;&lt;li&gt;Authors will need help setting up their feeds / sites.&lt;/li&gt;&lt;li&gt;You need buy-in from a couple of big names, or a scoop, to get initial visibility.&lt;/li&gt;&lt;li&gt; must be implemented very quickly (as usual!) before other models appear. &lt;small&gt;(My bet is that Murdoch will find a way of screwing everyone else, as usual, and make it a de-facto standard.)&lt;/small&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;As much as new models for music are act-based rather than company-based (bands are now supposed to build their fanbase through the net before they get signed), new models for journalism will be &lt;i&gt;journalist-based&lt;/i&gt; rather than &lt;i&gt;journal-based&lt;/i&gt;. Middlemen will tend to disappear, acting only as (unobtrusive) filters/aggregators. Hacks will have to produce a bit more, but they will see a much bigger share of the profits. Pricing can be tailored per feed (sports news: expensive / celeb-gossip: cheap, etc).&lt;/p&gt;
&lt;p&gt;You couldn't have done this in 1999, when only a handful of geeks knew what RSS was; but you can very easily do it today. I'd say a decent hack would easily rake in $20K/30K per month (plus books etc), news quality would improve (as incentives for good and regular material would be higher), and the aggregator's costs would be so low that they'd basically be printing money. What's not to like?&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3676448-3016808432399088930?l=blog.pythonaro.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.pythonaro.com/feeds/3016808432399088930/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3676448&amp;postID=3016808432399088930' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3676448/posts/default/3016808432399088930'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3676448/posts/default/3016808432399088930'/><link rel='alternate' type='text/html' href='http://blog.pythonaro.com/2009/05/future-of-journalism-today.html' title='The Future of Journalism, Today.'/><author><name>Giacomo Lacava</name><uri>https://profiles.google.com/112001311733983789595</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-WWGLdc8H1Uk/AAAAAAAAAAI/AAAAAAAAAYE/tA6iBrZYdng/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3676448.post-6575287880572265595</id><published>2009-05-21T22:03:00.002+01:00</published><updated>2009-05-21T22:06:34.079+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='GeekDiary'/><category scheme='http://www.blogger.com/atom/ns#' term='MSN'/><category scheme='http://www.blogger.com/atom/ns#' term='ICQ'/><category scheme='http://www.blogger.com/atom/ns#' term='IM'/><title type='text'>Problems with ICQ ? Use 443</title><content type='html'>&lt;p&gt;Note to self: switch to port 443 on login.oscar.aol.com if port 5190 is giving you grief. Works a charm.&lt;/p&gt;

&lt;p&gt;Now, if only I find why MSN keeps going offline...&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3676448-6575287880572265595?l=blog.pythonaro.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.pythonaro.com/feeds/6575287880572265595/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3676448&amp;postID=6575287880572265595' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3676448/posts/default/6575287880572265595'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3676448/posts/default/6575287880572265595'/><link rel='alternate' type='text/html' href='http://blog.pythonaro.com/2009/05/problems-with-icq-use-443.html' title='Problems with ICQ ? Use 443'/><author><name>Giacomo Lacava</name><uri>https://profiles.google.com/112001311733983789595</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-WWGLdc8H1Uk/AAAAAAAAAAI/AAAAAAAAAYE/tA6iBrZYdng/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3676448.post-2028923491308089300</id><published>2009-05-02T09:42:00.006+01:00</published><updated>2009-05-04T17:40:12.362+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='NoScript'/><category scheme='http://www.blogger.com/atom/ns#' term='GeekDiary'/><category scheme='http://www.blogger.com/atom/ns#' term='adblock'/><category scheme='http://www.blogger.com/atom/ns#' term='Firefox'/><title type='text'>You should update to NoScript 1.9.2.6</title><content type='html'>Quick recap: 
&lt;ol&gt;&lt;li&gt;NoScript is a Firefox extension. Its author makes money from ads on his webpages (&lt;del&gt;from what he says, pretty much his entire income depends on those ads&lt;/del&gt;&lt;del&gt;&lt;b&gt;UPDATE&lt;/b&gt;: from his bio: "I'm currently teaching Web Programming at the University of Palermo"... yet another blow to his credibility&lt;/del&gt; UPDATE: the bio was outdated).&lt;/li&gt;
&lt;li&gt;AdBlock Plus is a Firefox extension that stops ads. It also allows users to subscribe to third-party lists of sites to block.&lt;/li&gt;
&lt;li&gt;The maintainer of one of those services, "EasyList", took a very zealous approach and targeted NoScript.net (and other sites from the same author) because he found that it implemented some basic workarounds to avoid AdBlock Plus.&lt;/li&gt;
&lt;li&gt;Escalation ensued, and after a series of tit-for-tat eventually the NoScript developer went too far. NoScript, when installed in Firefox, would now check if AdBlock Plus was installed, and if so, force it to whitelist its sites... basically "hacking" ABP &lt;i&gt;client-side&lt;/i&gt;.&lt;/li&gt;
&lt;li&gt;The ABP developer (&lt;del&gt;who up to now was not involved&lt;/del&gt; &lt;a href="http://adblockplus.org/blog/attention-noscript-users"&gt;who apparently instigated the whole thing&lt;/a&gt;) got angry, and denounced the behaviour in various forums, including Slashdot.&lt;/li&gt;
&lt;li&gt;The NoScript author backtracked, removed the offending code in the latest update (NoScript 1.9.2.6) and &lt;a href="http://hackademix.net/2009/05/04/dear-adblock-plus-and-noscript-users-dear-mozilla-community/"&gt;apologized&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Now, I'm sympathetic to the NoScript author's circumstances -- he has a family to feed, he gives his work away for free, and NoScript really is a piece of extremely useful and complex code that most Firefox users enjoy (including me). It seems fair that he should get some compensation for his effort.&lt;/p&gt;
&lt;p&gt;However, clearly NoScript can be (and is) used as an ad-blocker, and the developer even runs AdBlock himself, but then he gets all worked up when these technologies are used against his own sites. There is a bit of hypocrisy there.&lt;/p&gt;
&lt;p&gt;In any case, client-side modification of other people's extensions is just unacceptable, no matter how "transparent" it is. There is a line, and the NS author crossed it. Kudos to him for the eventual backtracking, but he shouldn't have put himself in that position in the first place. NoScript is a security-related extension, and in the security world &lt;i&gt;trust&lt;/i&gt; is precious currency. His reputation is now tarnished, and it will take time for people to forget.&lt;/p&gt;
&lt;p&gt;All this, someone pointed out, highlights the need for a mechanism to reward extension authors. I agree. Mozilla could easily implement a micropayment system on addons.mozilla.org (like the iPhone AppStore), or build some sort of subscription infrastructure in FF (so that people can install extensions, then decide if they are worth paying). My guess is that the world of extension development would literally explode, and that would make FF even more attractive.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3676448-2028923491308089300?l=blog.pythonaro.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.pythonaro.com/feeds/2028923491308089300/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3676448&amp;postID=2028923491308089300' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3676448/posts/default/2028923491308089300'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3676448/posts/default/2028923491308089300'/><link rel='alternate' type='text/html' href='http://blog.pythonaro.com/2009/05/you-should-update-to-noscript-1926.html' title='You should update to NoScript 1.9.2.6'/><author><name>Giacomo Lacava</name><uri>https://profiles.google.com/112001311733983789595</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-WWGLdc8H1Uk/AAAAAAAAAAI/AAAAAAAAAYE/tA6iBrZYdng/s512-c/photo.jpg'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3676448.post-7004176769327911271</id><published>2009-04-30T09:22:00.005+01:00</published><updated>2009-04-30T09:39:37.172+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='GeekDiary'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='zipfile'/><title type='text'>zipfile quirk</title><content type='html'>In Python 2.6.0, &lt;a href="http://bugs.python.org/issue4710"&gt;a bug in the zipfile module&lt;/a&gt; makes the newly-acquired extractall() method basically useless. The function is supposed to extract all members of a zipfile, "no questions asked", like Windows would do with a right-click "Extract All..."; unfortunately, the original implementation makes it fail when the zipfile contains subdirectories. The behaviour was corrected in one of the 2.6.x maintenance releases (and 3.0.x, and 2.7), but if you have the misfortune to be stuck with 2.6.0, here's the banal workaround:
&lt;pre&gt;
zf = zipfile.ZipFile(zpath)
zlist = zf.namelist()
for filename in zlist:
 if filename.endswith("/"):
  destpath = os.path.join(path_to_extract,filename[:-1])
  if not os.path.exists(destpath): os.makedirs(destpath)
 else:
  zf.extract(filename,path_to_extract)
&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3676448-7004176769327911271?l=blog.pythonaro.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.pythonaro.com/feeds/7004176769327911271/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3676448&amp;postID=7004176769327911271' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3676448/posts/default/7004176769327911271'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3676448/posts/default/7004176769327911271'/><link rel='alternate' type='text/html' href='http://blog.pythonaro.com/2009/04/zipfile-quirk.html' title='zipfile quirk'/><author><name>Giacomo Lacava</name><uri>https://profiles.google.com/112001311733983789595</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-WWGLdc8H1Uk/AAAAAAAAAAI/AAAAAAAAAYE/tA6iBrZYdng/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3676448.post-2374166328244200099</id><published>2009-04-27T07:22:00.003+01:00</published><updated>2009-04-27T07:38:14.774+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='libero.it'/><category scheme='http://www.blogger.com/atom/ns#' term='GeekDiary'/><category scheme='http://www.blogger.com/atom/ns#' term='webmail'/><category scheme='http://www.blogger.com/atom/ns#' term='idiocy'/><title type='text'>Braindead policies of Libero.it</title><content type='html'>&lt;p&gt;I have had a @&lt;a href="http://libero.it"&gt;libero.it&lt;/a&gt; email address for more than  10 years. I stopped using it regularly when they disabled &lt;abbr title="Post-Office Protocol"&gt;POP&lt;/abbr&gt;/&lt;abbr title="Internet Message Access Protocol"&gt;IMAP&lt;/abbr&gt; for people connecting through other providers, but still logged in occasionally every once in a while.&lt;/p&gt;
&lt;p&gt;Today I went there and my saved emails were all gone. Apparently I didn't log on for three months (which may or may not be), and this "authorized" them to go and delete all I had left there for 10 years.&lt;/p&gt;
&lt;p&gt;This policy is braindead and guaranteed to piss off people. Storage is cheap; if they really wanted to "temporarily disable the account" (in their words), they could have simply bounced incoming mail, and compressed the few megabytes (!) of data, ready to be restored the first time I logged in again.&lt;/p&gt;
&lt;p&gt;This act of destruction was unnecessary, and carries the risk of being sued by angry people. This is the sort of decisions that made Libero.it (once at the forefront of internet-adoption waves in Italy) a fringe player; while Google and others ate their lunch, they were all busy penny-pinching, pissing off old-time users faster than they were making (very few) new customers.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3676448-2374166328244200099?l=blog.pythonaro.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.pythonaro.com/feeds/2374166328244200099/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3676448&amp;postID=2374166328244200099' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3676448/posts/default/2374166328244200099'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3676448/posts/default/2374166328244200099'/><link rel='alternate' type='text/html' href='http://blog.pythonaro.com/2009/04/braindead-policies-of-liberoit.html' title='Braindead policies of Libero.it'/><author><name>Giacomo Lacava</name><uri>https://profiles.google.com/112001311733983789595</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-WWGLdc8H1Uk/AAAAAAAAAAI/AAAAAAAAAYE/tA6iBrZYdng/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3676448.post-5985901462166749770</id><published>2009-04-21T06:43:00.002+01:00</published><updated>2009-04-21T07:22:37.122+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='toggl'/><category scheme='http://www.blogger.com/atom/ns#' term='personal'/><category scheme='http://www.blogger.com/atom/ns#' term='GeekDiary'/><title type='text'>On Toggl</title><content type='html'>&lt;p&gt;I started tracking my activities using &lt;a href="http://www.toggl.com"&gt;Toggl&lt;/a&gt;. The concept is very simple: the site gives you a timer that you can "toggle" to signal when you are starting a certain task. You define different tasks and group them into projects, and you can mark "billable" hours as such (clearly a feature for consultants / freelancers). It features reports (obviously) and other workgroup-related options, a dotNet-based offline tracker, and premium options for paid subscribers.&lt;/p&gt; &lt;p&gt;The first day I used it, it was enlightening: it turns out that I only spent about 3 hours doing actual "core" work. Most of the remaining time was wasted being sidetracked by other internal projects, plus random chitchat. Ok, it was the day &lt;a href="http://www.sun.com/third-party/global/oracle/"&gt;Oracle bought Sun&lt;/a&gt;, and we were pretty psyched about it (especially me, as the first thought I had when news emerged about the botched &lt;a href="http://www.google.co.uk/finance?q=NYSE:IBM"&gt;IBM&lt;/a&gt;/SUN deal was "well, [&lt;a href="http://www.google.co.uk/finance?q=NASDAQ:ORCL"&gt;Oracle&lt;/a&gt;] would be a much better fit than IBM; db appliances would be very sexy, and most of [Oracle]'s stack is Java-based already", and the others were all "yeah, keep dreaming!"... then Larry vindicated me), I expect the numbers to get better. If they don't, it means my routine needs improving and I'll work on that, but I feel that without Toggl I probably wouldn't have the sort of hindsight that gives a sense of achieving, which is necessary to  maintain continuous efforts.&lt;/p&gt; &lt;p&gt;All in all, Toggl feels cool. Other project-management sites should take note.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3676448-5985901462166749770?l=blog.pythonaro.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.pythonaro.com/feeds/5985901462166749770/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3676448&amp;postID=5985901462166749770' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3676448/posts/default/5985901462166749770'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3676448/posts/default/5985901462166749770'/><link rel='alternate' type='text/html' href='http://blog.pythonaro.com/2009/04/on-toggl.html' title='On Toggl'/><author><name>Giacomo Lacava</name><uri>https://profiles.google.com/112001311733983789595</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-WWGLdc8H1Uk/AAAAAAAAAAI/AAAAAAAAAYE/tA6iBrZYdng/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3676448.post-8011376938687100144</id><published>2009-04-15T14:27:00.004+01:00</published><updated>2009-04-15T14:45:50.828+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='phorm'/><category scheme='http://www.blogger.com/atom/ns#' term='spy'/><category scheme='http://www.blogger.com/atom/ns#' term='greed'/><category scheme='http://www.blogger.com/atom/ns#' term='GeekDiary'/><category scheme='http://www.blogger.com/atom/ns#' term='advertising'/><category scheme='http://www.blogger.com/atom/ns#' term='whytheEUcanbegoodforBritain'/><category scheme='http://www.blogger.com/atom/ns#' term='dataprotection'/><category scheme='http://www.blogger.com/atom/ns#' term='webwise'/><category scheme='http://www.blogger.com/atom/ns#' term='BT'/><category scheme='http://www.blogger.com/atom/ns#' term='privacy'/><title type='text'>Phorm/Webwise must go down</title><content type='html'>&lt;p&gt;&lt;a href="http://www.webwise.com"&gt;Phorm / Webwise&lt;/a&gt; is a disgusting ex-spyware maker now intent in profiteering from your browsing habits without your consent, as described by this &lt;a href="http://www.badphorm.co.uk/page.php?2"&gt;exhaustive explanation of the Phorm system and why it is bad for everyone.&lt;/a&gt; They will basically spy on all your network request and then inject their own advertising on somebody else's pages. This is bad for users (spied on without consent, with very low guarantees of anonymity), and extremely bad for any website holder (whose content is modified and exploited, again without consent, and probably infringing copyright laws).&lt;/p&gt;

&lt;p&gt;Yesterday the European Union, usually so despised by British citizens, &lt;a href="http://news.bbc.co.uk/1/hi/technology/7998009.stm"&gt;formally accused Britain of infringing the EU directive on data protection by implementing Phorm&lt;/a&gt;. Today, &lt;a href="http://news.bbc.co.uk/1/hi/technology/7999635.stm"&gt;Amazon opted out of the system&lt;/a&gt;, as previously did Google, Facebook and many others. I personally opted out a few minutes ago, by sending an email to &lt;a href="mailto:website-exclusion@phorm.com"&gt;website-exclusion@phorm.com&lt;/a&gt; listing all my domains.&lt;/p&gt;

&lt;p&gt;For the sake of the net, Phorm/Webwise MUST fail. If the system goes live, I will ask my ISP whether my traffic will go through BT, and if so, I will switch to a provider who can guarantee they will NOT take part in the system (i.e. not Virgin and not TalkTalk).&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3676448-8011376938687100144?l=blog.pythonaro.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.pythonaro.com/feeds/8011376938687100144/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3676448&amp;postID=8011376938687100144' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3676448/posts/default/8011376938687100144'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3676448/posts/default/8011376938687100144'/><link rel='alternate' type='text/html' href='http://blog.pythonaro.com/2009/04/phormwebwise-must-go-down.html' title='Phorm/Webwise must go down'/><author><name>Giacomo Lacava</name><uri>https://profiles.google.com/112001311733983789595</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-WWGLdc8H1Uk/AAAAAAAAAAI/AAAAAAAAAYE/tA6iBrZYdng/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3676448.post-1405189932306400525</id><published>2009-04-13T18:58:00.004+01:00</published><updated>2009-04-13T19:35:34.311+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rethoric'/><category scheme='http://www.blogger.com/atom/ns#' term='personal'/><category scheme='http://www.blogger.com/atom/ns#' term='education'/><category scheme='http://www.blogger.com/atom/ns#' term='GeekDiary'/><category scheme='http://www.blogger.com/atom/ns#' term='logic'/><title type='text'>One of the (many) problems of modern education...</title><content type='html'>&lt;p&gt;...is that logic and rhetoric are not taught well, or (like in my experience) not taught at all.&lt;/p&gt;
&lt;p&gt;This is reflected in the political debate, which is getting dumbed-down to the point where rational arguments can be completely absent; and it can be seen all over "teh intarwebs", where multitudes of well-intentioned individuals routinely end up acting like trolls.&lt;/p&gt;
&lt;p&gt;One should be able to understand when he is losing the rational argument, and either retreat, reformulate, move the subject onto a different field, or try to bluff his way through. By banging on about the same, lost point over and over again, one doesn't do himself any favour; he might be able to appeal to the basest instincts of some individuals, but he won't be able to win intelligent men to his cause.&lt;/p&gt;
&lt;p&gt;I have to admit, I have been guilty of this behaviour several times during the years. I put it down to my lack of knowledge of the abovementioned fields. At school, they taught us how to analyse sentences for syntactical structure, but rarely for meaning, and never for logic. They told us how to write in a readable style, but didn't really ask us to understand where we are in a debate, how to interact strategically during a verbal confrontation, how to step back from the heat and think hard about your next rhetorical move.&lt;/p&gt;
&lt;p&gt;Is it a form of large conspiracy, where upper classes try to maintain old privileges by "forgetting" to properly teach these subjects to the uninitiated? Or could it be that these are considered too dangerous a weapon, too prone to abuse, to be widely taught? Or is it simply that education topics are constantly squeezed by the furious pace of technological advancement, to the point where you &lt;i&gt;need&lt;/i&gt; to teach kids how to work with newer and newer devices which are &lt;i&gt;fundamental&lt;/i&gt; to the current way of life (computer, tv, ipods etc etc)?&lt;/p&gt;
&lt;p&gt;In any case, it feels like some of the oldest fields of study ever taught ended up being victims of accomplished mass-scholarisation. I don't think this is helping the masses or anyone else, though.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3676448-1405189932306400525?l=blog.pythonaro.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.pythonaro.com/feeds/1405189932306400525/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3676448&amp;postID=1405189932306400525' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3676448/posts/default/1405189932306400525'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3676448/posts/default/1405189932306400525'/><link rel='alternate' type='text/html' href='http://blog.pythonaro.com/2009/04/one-of-many-problems-of-modern.html' title='One of the (many) problems of modern education...'/><author><name>Giacomo Lacava</name><uri>https://profiles.google.com/112001311733983789595</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-WWGLdc8H1Uk/AAAAAAAAAAI/AAAAAAAAAYE/tA6iBrZYdng/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3676448.post-1781714989878511531</id><published>2009-04-10T23:19:00.003+01:00</published><updated>2009-04-10T23:26:15.414+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='GeekDiary'/><category scheme='http://www.blogger.com/atom/ns#' term='Qt'/><title type='text'>How to get precompiled documentation for Qt4</title><content type='html'>&lt;p&gt;Memo to self: if you ever need to download the Qt4 documentation on Windows, instead of scraping &lt;a href="http://doc.trolltech.com/4.4/index.html"&gt;the official site&lt;/a&gt;, just download the &lt;a href="http://packages.debian.org/sid/qt4-doc"&gt;qt4-doc package for Debian&lt;/a&gt;, open it with 7-Zip and extract the .qch files to use with QtAssistant (which also gives you indexing etc).&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3676448-1781714989878511531?l=blog.pythonaro.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.pythonaro.com/feeds/1781714989878511531/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3676448&amp;postID=1781714989878511531' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3676448/posts/default/1781714989878511531'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3676448/posts/default/1781714989878511531'/><link rel='alternate' type='text/html' href='http://blog.pythonaro.com/2009/04/how-to-get-precompiled-documentation.html' title='How to get precompiled documentation for Qt4'/><author><name>Giacomo Lacava</name><uri>https://profiles.google.com/112001311733983789595</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-WWGLdc8H1Uk/AAAAAAAAAAI/AAAAAAAAAYE/tA6iBrZYdng/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3676448.post-225269284303642492</id><published>2009-04-06T16:53:00.004+01:00</published><updated>2009-04-06T17:47:11.285+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='GeekDiary'/><category scheme='http://www.blogger.com/atom/ns#' term='odbc'/><category scheme='http://www.blogger.com/atom/ns#' term='SQL'/><category scheme='http://www.blogger.com/atom/ns#' term='jdbc'/><category scheme='http://www.blogger.com/atom/ns#' term='proxy'/><title type='text'>ODBC proxy/rewriter</title><content type='html'>&lt;p&gt;I have several &lt;abbr title="Open DataBase Connectivity"&gt;ODBC&lt;/abbr&gt; (and &lt;abbr title="Java DataBase Connectivity"&gt;JDBC&lt;/abbr&gt;) requests, all pointing to the same server. They are all queries coming from the same database user. However, &lt;i&gt;depending on who the caller is&lt;/i&gt;, requests should be "rewritten" to point to a different schema (for Oracle) or database (for SQLServer). In short, &lt;i&gt;the identity&lt;/i&gt; should be proxied, because I cannot manually change it client-side.&lt;/p&gt;

&lt;p&gt;Can this be done transparently? Does anybody know of a tool that does it, even commercial ones?&lt;/p&gt;

&lt;p&gt;I thought about using a simple network proxy and redirecting to different &lt;abb title="Relational DataBase Management System"&gt;RDBMS&lt;/abb&gt; instances, but that is not a scalable solution for us; we must be able to separate these requests but still keep them on the same instance.&lt;/p&gt;

&lt;p&gt;I can't find anything on Google, I wonder if the LazyWeb can help...?&lt;/p&gt;

&lt;p&gt;UPDATE: I realized I need something similar to &lt;a href="http://msdn.microsoft.com/en-us/library/ms191296.aspx"&gt;Context Switching in SQLServer 2005/2008&lt;/a&gt;, to wrap all my requests with a "EXECUTE AS" request. I wonder what the equivalent is for Oracle.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3676448-225269284303642492?l=blog.pythonaro.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.pythonaro.com/feeds/225269284303642492/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3676448&amp;postID=225269284303642492' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3676448/posts/default/225269284303642492'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3676448/posts/default/225269284303642492'/><link rel='alternate' type='text/html' href='http://blog.pythonaro.com/2009/04/odbc-proxyrewriter.html' title='ODBC proxy/rewriter'/><author><name>Giacomo Lacava</name><uri>https://profiles.google.com/112001311733983789595</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-WWGLdc8H1Uk/AAAAAAAAAAI/AAAAAAAAAYE/tA6iBrZYdng/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3676448.post-8153240282435830179</id><published>2009-04-02T11:37:00.005+01:00</published><updated>2009-04-02T14:57:51.017+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='personal'/><category scheme='http://www.blogger.com/atom/ns#' term='football'/><category scheme='http://www.blogger.com/atom/ns#' term='bosnia'/><title type='text'>Come on Bosnia!</title><content type='html'>&lt;table class="shorttable" border="1" cellpadding="1" cellspacing="0"&gt;
   &lt;tbody&gt;&lt;tr class="header"&gt;
      &lt;td class="c1"&gt;&amp;nbsp;&lt;/td&gt;
      &lt;td class="c2"&gt;&amp;nbsp;&lt;/td&gt;
      &lt;td class="c3"&gt;&lt;span class="rhst"&gt;P&lt;/span&gt;&lt;/td&gt;
      &lt;td class="c4"&gt;&lt;span class="rhst"&gt;W&lt;/span&gt;&lt;/td&gt;
      &lt;td class="c5"&gt;&lt;span class="rhst"&gt;D&lt;/span&gt;&lt;/td&gt;
      &lt;td class="c6"&gt;&lt;span class="rhst"&gt;L&lt;/span&gt;&lt;/td&gt;
      &lt;td class="c7"&gt;&lt;span class="rhst"&gt;F&lt;/span&gt;&lt;/td&gt;
      &lt;td class="c8"&gt;&lt;span class="rhst"&gt;A&lt;/span&gt;&lt;/td&gt;
      &lt;td class="c9"&gt;&lt;span class="rhst"&gt;GD&lt;/span&gt;&lt;/td&gt;
      &lt;td class="c10"&gt;&lt;span class="rhst"&gt;PTS&lt;/span&gt;&lt;/td&gt;
   &lt;/tr&gt;
   &lt;tr class="r2"&gt;
      &lt;td class="c1"&gt;1&lt;/td&gt;

      &lt;td class="c2"&gt;Spain&lt;/td&gt;
      &lt;td class="c3"&gt;6&lt;/td&gt;
      &lt;td class="c4"&gt;6&lt;/td&gt;
      &lt;td class="c5"&gt;0&lt;/td&gt;
      &lt;td class="c6"&gt;0&lt;/td&gt;
      &lt;td class="c7"&gt;13&lt;/td&gt;

      &lt;td class="c8"&gt;2&lt;/td&gt;
      &lt;td class="c9"&gt;11&lt;/td&gt;
      &lt;td class="c10"&gt;18&lt;/td&gt;
   &lt;/tr&gt;
   &lt;tr class="r1" style="font-weight:bold; background-color:green; color: yellow;"&gt;
      &lt;td class="c1"&gt;2&lt;/td&gt;
      &lt;td class="c2"&gt;&lt;a href="http://www.fifa.com/worldcup/preliminaries/europe/teams/team=44037/index.html"&gt;Bosnia-Herzegovina&lt;/a&gt;&lt;/td&gt;

      &lt;td class="c3"&gt;6&lt;/td&gt;
      &lt;td class="c4"&gt;4&lt;/td&gt;
      &lt;td class="c5"&gt;0&lt;/td&gt;
      &lt;td class="c6"&gt;2&lt;/td&gt;
      &lt;td class="c7"&gt;18&lt;/td&gt;
      &lt;td class="c8"&gt;7&lt;/td&gt;

      &lt;td class="c9"&gt;11&lt;/td&gt;
      &lt;td class="c10"&gt;12&lt;/td&gt;
   &lt;/tr&gt;
   &lt;tr class="r2"&gt;
      &lt;td class="c1"&gt;3&lt;/td&gt;
      &lt;td class="c2"&gt;Turkey&lt;/td&gt;
      &lt;td class="c3"&gt;6&lt;/td&gt;

      &lt;td class="c4"&gt;2&lt;/td&gt;
      &lt;td class="c5"&gt;2&lt;/td&gt;
      &lt;td class="c6"&gt;2&lt;/td&gt;
      &lt;td class="c7"&gt;6&lt;/td&gt;
      &lt;td class="c8"&gt;5&lt;/td&gt;
      &lt;td class="c9"&gt;1&lt;/td&gt;

      &lt;td class="c10"&gt;8&lt;/td&gt;
   &lt;/tr&gt;
   &lt;tr class="r1"&gt;
      &lt;td class="c1"&gt;4&lt;/td&gt;
      &lt;td class="c2"&gt;Belgium&lt;/td&gt;
      &lt;td class="c3"&gt;6&lt;/td&gt;
      &lt;td class="c4"&gt;2&lt;/td&gt;

      &lt;td class="c5"&gt;1&lt;/td&gt;
      &lt;td class="c6"&gt;3&lt;/td&gt;
      &lt;td class="c7"&gt;10&lt;/td&gt;
      &lt;td class="c8"&gt;11&lt;/td&gt;
      &lt;td class="c9"&gt;-1&lt;/td&gt;
      &lt;td class="c10"&gt;7&lt;/td&gt;

   &lt;/tr&gt;
   &lt;tr class="r2"&gt;
      &lt;td class="c1"&gt;5&lt;/td&gt;
      &lt;td class="c2"&gt;Estonia&lt;/td&gt;
      &lt;td class="c3"&gt;6&lt;/td&gt;
      &lt;td class="c4"&gt;1&lt;/td&gt;
      &lt;td class="c5"&gt;2&lt;/td&gt;

      &lt;td class="c6"&gt;3&lt;/td&gt;
      &lt;td class="c7"&gt;5&lt;/td&gt;
      &lt;td class="c8"&gt;15&lt;/td&gt;
      &lt;td class="c9"&gt;-10&lt;/td&gt;
      &lt;td class="c10"&gt;5&lt;/td&gt;
   &lt;/tr&gt;

   &lt;tr class="r1"&gt;
      &lt;td class="c1"&gt;6&lt;/td&gt;
      &lt;td class="c2"&gt;Armenia&lt;/td&gt;
      &lt;td class="c3"&gt;6&lt;/td&gt;
      &lt;td class="c4"&gt;0&lt;/td&gt;
      &lt;td class="c5"&gt;1&lt;/td&gt;

      &lt;td class="c6"&gt;5&lt;/td&gt;
      &lt;td class="c7"&gt;3&lt;/td&gt;
      &lt;td class="c8"&gt;15&lt;/td&gt;
      &lt;td class="c9"&gt;-12&lt;/td&gt;
      &lt;td class="c10"&gt;1&lt;/td&gt;
   &lt;/tr&gt;&lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;Only Germany and Poland managed to score 18 goals. After champagne-football, will we have &lt;a href="http://easteuropeanfood.about.com/od/sausages/r/cevapcici.htm"&gt;cevapcici&lt;/a&gt;-football ?&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3676448-8153240282435830179?l=blog.pythonaro.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.pythonaro.com/feeds/8153240282435830179/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3676448&amp;postID=8153240282435830179' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3676448/posts/default/8153240282435830179'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3676448/posts/default/8153240282435830179'/><link rel='alternate' type='text/html' href='http://blog.pythonaro.com/2009/04/come-on-bosnia.html' title='Come on Bosnia!'/><author><name>Giacomo Lacava</name><uri>https://profiles.google.com/112001311733983789595</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-WWGLdc8H1Uk/AAAAAAAAAAI/AAAAAAAAAYE/tA6iBrZYdng/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3676448.post-2981192656493218363</id><published>2009-04-01T09:10:00.004+01:00</published><updated>2009-04-01T09:23:23.115+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PyQt'/><category scheme='http://www.blogger.com/atom/ns#' term='GeekDiary'/><category scheme='http://www.blogger.com/atom/ns#' term='eric'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>Eric4 startup crash on Windows</title><content type='html'>&lt;p&gt;&lt;small&gt;This post is for google.&lt;/small&gt;&lt;/p&gt;
&lt;p&gt;If your &lt;a href="http://eric-ide.python-projects.org"&gt;Eric4&lt;/a&gt; for Windows keeps crashing on startup, try the following:
&lt;ol&gt;&lt;li&gt;Start eric4-tray.py (which should be in your &lt;nobr&gt;PYTHON_HOME\Lib\site-packages\eric4&lt;/nobr&gt;)&lt;/li&gt;&lt;li&gt;Right-click on the Eric icon tray, and select Preferences&lt;/li&gt;&lt;li&gt;Change something in the Application section, and click Apply then Ok&lt;/li&gt;&lt;li&gt;Right-click again on the icon, and select "Eric IDE". This time it should start ok.&lt;/li&gt;&lt;li&gt;Now you should be able to quit the tray application and start Eric as usual&lt;/li&gt;&lt;/ol&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3676448-2981192656493218363?l=blog.pythonaro.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.pythonaro.com/feeds/2981192656493218363/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3676448&amp;postID=2981192656493218363' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3676448/posts/default/2981192656493218363'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3676448/posts/default/2981192656493218363'/><link rel='alternate' type='text/html' href='http://blog.pythonaro.com/2009/04/eric4-startup-crash-on-windows.html' title='Eric4 startup crash on Windows'/><author><name>Giacomo Lacava</name><uri>https://profiles.google.com/112001311733983789595</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-WWGLdc8H1Uk/AAAAAAAAAAI/AAAAAAAAAYE/tA6iBrZYdng/s512-c/photo.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3676448.post-5999629012491963778</id><published>2009-03-20T10:59:00.002Z</published><updated>2009-03-20T11:01:58.899Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='2minutesofhate'/><category scheme='http://www.blogger.com/atom/ns#' term='GeekDiary'/><category scheme='http://www.blogger.com/atom/ns#' term='channel4'/><title type='text'>2 minutes of hate: Channel4 Windows-only streaming</title><content type='html'>&lt;p&gt;Channel4 "free catch-up" streaming service only works with Windows Media Player. And not even any WMP, you need version 11, the most DRM-infested version ever released.&lt;/p&gt;

&lt;p&gt;If even C4 doesn't get it, then the entire industrial-media complex deserves to die as soon as possible.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3676448-5999629012491963778?l=blog.pythonaro.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.pythonaro.com/feeds/5999629012491963778/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3676448&amp;postID=5999629012491963778' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3676448/posts/default/5999629012491963778'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3676448/posts/default/5999629012491963778'/><link rel='alternate' type='text/html' href='http://blog.pythonaro.com/2009/03/2-minutes-of-hate-channel4-windows-only.html' title='2 minutes of hate: Channel4 Windows-only streaming'/><author><name>Giacomo Lacava</name><uri>https://profiles.google.com/112001311733983789595</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-WWGLdc8H1Uk/AAAAAAAAAAI/AAAAAAAAAYE/tA6iBrZYdng/s512-c/photo.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3676448.post-8039272044111276931</id><published>2009-03-17T17:07:00.002Z</published><updated>2009-03-17T17:12:21.350Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='GeekDiary'/><title type='text'>Money for Nothing, the IT version</title><content type='html'>&lt;blockquote&gt;"[...] I shoulda learned to play the Python&lt;br /&gt;
I shoulda learned to play them Java&lt;br /&gt;
Look at that geek, he's got it runnin' on the server&lt;br /&gt;
Man we could have some fun&lt;br /&gt;
And he's up there, what's that, a COM object?&lt;br /&gt;
Throwing code 'round but they can't do a b-tree&lt;br /&gt;
That ain't workin', that's the way you do it&lt;br /&gt;
Get your money for nothin', get your laptop for free&lt;br /&gt;&lt;br /&gt;

We gotta check our registry keys&lt;br /&gt;
Custom deploys troubleshootin' &lt;br /&gt;
We gotta move these webservers&lt;br /&gt;
We gotta register more libraries...&lt;/blockquote&gt;

&lt;p&gt;(I'm sure I've seen a "proper" geek version somewhere, but google is not helping today, so I made my own...)&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3676448-8039272044111276931?l=blog.pythonaro.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.pythonaro.com/feeds/8039272044111276931/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3676448&amp;postID=8039272044111276931' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3676448/posts/default/8039272044111276931'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3676448/posts/default/8039272044111276931'/><link rel='alternate' type='text/html' href='http://blog.pythonaro.com/2009/03/money-for-nothing-it-version.html' title='Money for Nothing, the IT version'/><author><name>Giacomo Lacava</name><uri>https://profiles.google.com/112001311733983789595</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-WWGLdc8H1Uk/AAAAAAAAAAI/AAAAAAAAAYE/tA6iBrZYdng/s512-c/photo.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3676448.post-1194735674618039556</id><published>2009-03-04T16:10:00.003Z</published><updated>2009-03-04T17:04:24.220Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='dcom'/><category scheme='http://www.blogger.com/atom/ns#' term='GeekDiary'/><category scheme='http://www.blogger.com/atom/ns#' term='Windows'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='IronPython'/><category scheme='http://www.blogger.com/atom/ns#' term='com'/><title type='text'>On The Burden Of Legacy</title><content type='html'>&lt;p&gt;I recently thought it would be good to write a few utilities for one of the products I support. This product was built on &lt;abbr title="Distributed Component Object Model"&gt;DCOM&lt;/abbr&gt; (don't ask me why). Obviously, being a pythonaro, I just &lt;i&gt;had&lt;/i&gt; to use Python. And so my tribulations began.&lt;/p&gt;
&lt;p&gt;Python supports &lt;abbr title="Component Object Model"&gt;COM&lt;/abbr&gt; objects thanks to the lovely &lt;a href="http://pywin32.sourceforge.net/"&gt;Win32 package by Mark Hammond&lt;/a&gt;. When you have a &lt;abbr title="Dynamic-link library"&gt;DLL&lt;/abbr&gt; that you want to use in python, run "makepy.py yourlib.dll" (or just makepy.py, and browse through the registered libraries to choose one) and lo, it's available as a first-class python module. So I do that, and start poking around with various stuff, and eventually I call a method that returns an object &lt;i&gt;whose definition is in another DLL&lt;/i&gt;, so it only comes up as a &lt;i&gt;PyIUnknown&lt;/i&gt; object. Ah well. I run makepy.py on the second DLL, to no avail.&lt;/p&gt;
&lt;p&gt;After a bit of googling and fiddling, I finally stumbled on the right incantation.
&lt;pre&gt;myobj = win32com.client.Dispatch(myobj.QueryInterface(pythoncom.IID_IDispatch))
myobj = win32com.client.CastTo(myobj,'MyIClassName')&lt;/pre&gt;
Basically, I have to find the right interface ID for the object, dispatch it, and then recast the object with a different type &lt;i&gt;which is specified by a string&lt;/i&gt;. Man, isn't that ugly. Not because of having to recast (which I can understand) but because the recasting &lt;i&gt;needs the class name as a string&lt;/i&gt;, you can't somehow derive it from the object. If you don't know the "secret" class name, you can't use its methods even if you know it's of the right type. From a modern OOP point of view, this is quite absurd... but there is an explanation.&lt;/p&gt;
&lt;p&gt;COM was built when reflection was not yet mainstream, and types were static and immutable. Programmers were used to declare types for each variable, and if the type wasn't right, the compiler would cry. Polimorphism, reflection and dynamic interpreters were slowly reaching mainstream acceptance, but Microsoft had to retrofit them on top of existing frameworks, one feature at a time. The result was the incomplete hybrid I now have to deal with.&lt;/p&gt;
&lt;p&gt;Well, I thought, this open-source CPython stuff in Redmond is considered akin to communism, no wonder it doesn't play well with old MS frameworks. Let's try to move further down "the Microsoft Way" and see if things improve: I shall use IronPython. After all, it's just a thin layer on top of the .Net CLR, right? Certainly it will be able to guess types a bit better...&lt;/p&gt;
&lt;p&gt;So, a few installs later (you need at minimum the "Windows SDK 6.0" for good interop tools for .Net 2.0, plus the IronPython installer), there I was, trying to do the same thing.&lt;br /&gt;The .Net version of makepy.py is called "tlbimp.exe", and it will basically build a new DLL to wrap the old one. You then import the new DLL in IronPython and lo, you can use the objects. But what happens when a function returns a reference to an object not defined in the DLL? Well, more or less the same thing as for win32com -- you get an unknown interface. So again,you have to wrap all the other DLLs, and explicitly instance these objects with the right type. Slightly better but not really that much different (so I'll stick to CPython, thank you).&lt;/p&gt;
&lt;p&gt;As I said, this sort of explicit casting was perfectly acceptable 15 or even 10 years ago. But honestly, don't we live so much better without ? Why win32com and (more damning) IronPython cannot yet look up this sort of thing automatically? I understand that I'm working with legacy interop, but still... this sort of "programmer usability improvement" would help a lot in real-world situation where The Big Rewrite is simply not an option.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3676448-1194735674618039556?l=blog.pythonaro.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.pythonaro.com/feeds/1194735674618039556/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3676448&amp;postID=1194735674618039556' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3676448/posts/default/1194735674618039556'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3676448/posts/default/1194735674618039556'/><link rel='alternate' type='text/html' href='http://blog.pythonaro.com/2009/03/on-burden-of-legacy.html' title='On The Burden Of Legacy'/><author><name>Giacomo Lacava</name><uri>https://profiles.google.com/112001311733983789595</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-WWGLdc8H1Uk/AAAAAAAAAAI/AAAAAAAAAYE/tA6iBrZYdng/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3676448.post-6426085415617031552</id><published>2009-02-23T18:04:00.001Z</published><updated>2009-02-23T18:09:57.262Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='piratebay'/><category scheme='http://www.blogger.com/atom/ns#' term='mafiaa'/><category scheme='http://www.blogger.com/atom/ns#' term='p2p'/><category scheme='http://www.blogger.com/atom/ns#' term='music'/><category scheme='http://www.blogger.com/atom/ns#' term='corruption'/><category scheme='http://www.blogger.com/atom/ns#' term='ireland'/><title type='text'>On Piracy</title><content type='html'>From &lt;a href="http://tech.slashdot.org/comments.pl?sid=1137089&amp;cid=26955655"&gt;Slashdot&lt;/a&gt;:
&lt;blockquote&gt;"We shall go on to the end, we shall fight in .com.fr,
we shall fight on the web and on usenet,
we shall fight with growing confidence and growing strength in the air, we shall defend our Internet, whatever the cost may be,
we shall fight on the servers,
we shall fight on port 443,
we shall fight in the VPNs and on P2P,
we shall fight in the darknets;
we shall never surrender, and even if, which I do not for a moment believe, this Internet or a large part of it were subjugated and censored, then our digital Anarchy beyond the web, armed and guarded by ThePirateBay fleet, would carry on the struggle, until, in good time, the New Internet, with all its power and might, steps forth to the rescue and the liberation of the old."&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3676448-6426085415617031552?l=blog.pythonaro.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.pythonaro.com/feeds/6426085415617031552/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3676448&amp;postID=6426085415617031552' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3676448/posts/default/6426085415617031552'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3676448/posts/default/6426085415617031552'/><link rel='alternate' type='text/html' href='http://blog.pythonaro.com/2009/02/on-piracy.html' title='On Piracy'/><author><name>Giacomo Lacava</name><uri>https://profiles.google.com/112001311733983789595</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-WWGLdc8H1Uk/AAAAAAAAAAI/AAAAAAAAAYE/tA6iBrZYdng/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3676448.post-8856233617645926031</id><published>2009-02-06T23:41:00.004Z</published><updated>2009-04-25T18:19:51.958+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='personal'/><category scheme='http://www.blogger.com/atom/ns#' term='movies'/><title type='text'>I hate you, Sam Mendes</title><content type='html'>&lt;p&gt;Dear Sam,&lt;br /&gt;
I have to say, I really hate you. You keep shattering my little dreams of suburban happiness, my little delusions of American Dream; you keep poking your nosey finger at my fears, my neuroses, my false hopes... and for what? For a few bucks more? A few awards more? Didn't you get enough of those with American Beauty and whatnot? No, you had to come back here, you clever bastard, ruining our little and insignificant lives just so that you can keep happy your coke dealer. And this time even &lt;em&gt;with good actors!&lt;/em&gt; You really have some gall, I tell you.&lt;/p&gt;
&lt;p&gt;Well, I have to say your &lt;a href="http://www.imdb.com/title/tt0959337/"&gt;Revolutionary Road&lt;/a&gt; really &lt;em&gt;is&lt;/em&gt; "working the magic" (even though the plot is slightly predictable, but we got to expect that from you). I hope you are happy.&lt;/p&gt;
&lt;p&gt;Now take those big bags of money and get the f**k off my lawn. I'm still paying for it, y'know.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3676448-8856233617645926031?l=blog.pythonaro.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.pythonaro.com/feeds/8856233617645926031/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3676448&amp;postID=8856233617645926031' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3676448/posts/default/8856233617645926031'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3676448/posts/default/8856233617645926031'/><link rel='alternate' type='text/html' href='http://blog.pythonaro.com/2009/02/i-hate-you-sam-mendes.html' title='I hate you, Sam Mendes'/><author><name>Giacomo Lacava</name><uri>https://profiles.google.com/112001311733983789595</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-WWGLdc8H1Uk/AAAAAAAAAAI/AAAAAAAAAYE/tA6iBrZYdng/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3676448.post-3325248349779681778</id><published>2009-02-02T13:16:00.003Z</published><updated>2009-02-02T13:49:04.125Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='personal OMGim30'/><title type='text'>On being 30</title><content type='html'>&lt;p&gt;&lt;cite title="J.L.Borges, 'El milagro segreto', from Ficciones, 1944"&gt;... like all writers, he judged others on their works while expecting to be judged entirely on his unexpressed feelings and plans.&lt;/cite&gt;&lt;/p&gt;
&lt;p&gt;Thanks a lot for all the wishes and messages! They were all lovely.&lt;/p&gt;
&lt;p&gt;I must absolutely report the most "pythonesque" one I got from (obviously) &lt;span class="vcard"&gt;&lt;abbr class="fn" title="Giulio Piancastelli"&gt;&lt;a class="url" rel="Friend" href="http://gpiancastelli.wordpress.com/"&gt;Giulio&lt;/a&gt;&lt;/abbr&gt;&lt;/span&gt;:
&lt;blockquote&gt;Welcome into the 30s or, if you want, your '3.0' version. How incompatible do you feel from yesterday?&lt;/blockquote&gt;
&lt;p&gt;Chapeau, my friend.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3676448-3325248349779681778?l=blog.pythonaro.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.pythonaro.com/feeds/3325248349779681778/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3676448&amp;postID=3325248349779681778' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3676448/posts/default/3325248349779681778'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3676448/posts/default/3325248349779681778'/><link rel='alternate' type='text/html' href='http://blog.pythonaro.com/2009/02/on-being-30.html' title='On being 30'/><author><name>Giacomo Lacava</name><uri>https://profiles.google.com/112001311733983789595</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-WWGLdc8H1Uk/AAAAAAAAAAI/AAAAAAAAAYE/tA6iBrZYdng/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3676448.post-8313084904811414146</id><published>2009-01-16T11:51:00.003Z</published><updated>2009-01-16T11:57:22.805Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='GeekDiary'/><category scheme='http://www.blogger.com/atom/ns#' term='jedit'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>jEdit macro to add encoding declaration to python files</title><content type='html'>&lt;p&gt;This is a little macro to add a &lt;a href="http://www.python.org/dev/peps/pep-0263/"&gt;PEP263&lt;/a&gt;-compliant string at the top of all open buffers in jEdit. It should probably be improved to skip the shell declaration line (if there), and not operate if the line is already there -- feel free to send patches ;D&lt;/p&gt;
&lt;p&gt;&lt;a href="http://lab.pythonaro.com/releases/Add_Encoding_Decl_to_Buffers.bsh"&gt;Download Add_Encoding_Decl_to_Buffers.bsh&lt;/a&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3676448-8313084904811414146?l=blog.pythonaro.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.pythonaro.com/feeds/8313084904811414146/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3676448&amp;postID=8313084904811414146' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3676448/posts/default/8313084904811414146'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3676448/posts/default/8313084904811414146'/><link rel='alternate' type='text/html' href='http://blog.pythonaro.com/2009/01/jedit-macro-to-add-encoding-declaration.html' title='jEdit macro to add encoding declaration to python files'/><author><name>Giacomo Lacava</name><uri>https://profiles.google.com/112001311733983789595</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-WWGLdc8H1Uk/AAAAAAAAAAI/AAAAAAAAAYE/tA6iBrZYdng/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3676448.post-8397501088669029190</id><published>2009-01-15T18:17:00.003Z</published><updated>2009-01-15T18:23:16.344Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='personal'/><category scheme='http://www.blogger.com/atom/ns#' term='genocide'/><category scheme='http://www.blogger.com/atom/ns#' term='Politics'/><title type='text'>"See the market and then die"</title><content type='html'>&lt;p&gt;From medical journal &lt;a href="http://www.thelancet.com/journals/lancet/article/PIIS0140-6736(09)60005-2/fulltext"&gt;TheLancet&lt;/a&gt;: &lt;blockquote&gt;"Mass privatisation programmes were associated with an increase in short-term adult male mortality rates of 12·8%"&lt;/blockquote&gt;&lt;/p&gt;
&lt;p&gt;(via &lt;a href="http://mir.it/servizi/ilmanifesto/estestest/?p=150"&gt;Astrit Dakli&lt;/a&gt;, who translates that percentage to real numbers: 1 million dead.)&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3676448-8397501088669029190?l=blog.pythonaro.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.pythonaro.com/feeds/8397501088669029190/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3676448&amp;postID=8397501088669029190' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3676448/posts/default/8397501088669029190'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3676448/posts/default/8397501088669029190'/><link rel='alternate' type='text/html' href='http://blog.pythonaro.com/2009/01/see-market-and-then-die.html' title='&quot;See the market and then die&quot;'/><author><name>Giacomo Lacava</name><uri>https://profiles.google.com/112001311733983789595</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-WWGLdc8H1Uk/AAAAAAAAAAI/AAAAAAAAAYE/tA6iBrZYdng/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3676448.post-5160048049815608320</id><published>2009-01-07T23:24:00.003Z</published><updated>2009-01-08T00:02:57.142Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='WSH'/><category scheme='http://www.blogger.com/atom/ns#' term='GeekDiary'/><category scheme='http://www.blogger.com/atom/ns#' term='Windows'/><title type='text'>Adventures in Windows - Subinacl, Cscript and how I wasted an evening</title><content type='html'>&lt;p&gt;My wife's desktop machine died a couple of days ago, and now Windows won't boot for some reason. After a few unsuccessful attempts at reviving it, I decided that it would be better to simply move her stuff to a spare machine we had laying around (which actually has better specs, but I digress). &lt;/p&gt;
&lt;p&gt;So I duly connected the old disk to the new machine, and tried to copy across a few files. Windows said "Access is denied". Apparently, the account names between old and new machine where different, so Windows would show her files as belonging to an unknown account, and refusing access even to an Administrator. &lt;br /&gt;
I could have worked around this by booting a Knoppix livecd and taking over, but that would have been slow; I thought that surely there was a pure-Windows solution, some "admin command-line magic", that would fix things. And so the googling started...&lt;/p&gt;

&lt;p&gt;There are basically two main elements in Windows file security: the Owner account, and the Access Control Lists (ACL) applied to the object (or inherited). So the first step was taking ownership of all the objects; I accomplished this with a simple script using &lt;abbr title="WIndows Management Instrumentation"&gt;WMI&lt;/abbr&gt;:
&lt;pre&gt;Set objWMIService = GetObject("winmgmts:\\.\root\cimv2")
Set colFolders = objWMIService.ExecQuery("Select * From Win32_Directory Where Name LIKE 'F:%'")
For Each objFolder in colFolders
    ' Add the input parameters.
    Set objInParam = objFolder.Methods_("TakeOwnerShipEx")._
        inParameters.SpawnInstance_()
    objInParam.Properties_.Item("Recursive") =  true
    objFolder.TakeOwnershipEx
    wscript.echo objFolder.Name
Next&lt;/pre&gt;
&lt;p&gt;The script uses a &lt;abbr title="Windows Query Language"&gt;WQL&lt;/abbr&gt; query to retrieve all the directory objects, then takes ownership of them, using the Recursive option in order to take over all files included in the directory as well. I ran this from the command line with "cscript myfile.vbs" and it worked. &lt;small&gt;(I have to say that for some reason this script failed on a few directories under "Program Files", but I simply ignored them.)&lt;/small&gt;&lt;/p&gt;
&lt;p&gt;Now I could open any directory and set permissions on any object, but I still could not &lt;i&gt;copy&lt;/i&gt; several files; this was because the ACL on these objects were set to refuse access to everyone but the old user. Unfortunately, I didn't know how to do that with WQL (I honestly don't know whether it's even possible); so I used SubInACL instead. This is a little tool you can download from Microsoft; it "enables  administrators to obtain security information about files, registry keys, and  services, and transfer this information from user to user, from local or global  group to group, and from domain to domain." Exactly what I needed!&lt;/p&gt;
&lt;pre&gt;subinacl.exe /subdirectories "F:\*" /grant=Administrators=F&lt;/pre&gt;
&lt;p&gt;This one-liner simply grants Full (F) rights to any object under the F drive. A few minutes later, and I was finally able to copy the files.&lt;/p&gt;
&lt;p&gt;And they say Unix is complicated? If this was an ext2 drive, I could simply have mounted the drive as root to do whatever I wanted. Windows administration is really a bitch.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3676448-5160048049815608320?l=blog.pythonaro.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.pythonaro.com/feeds/5160048049815608320/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3676448&amp;postID=5160048049815608320' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3676448/posts/default/5160048049815608320'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3676448/posts/default/5160048049815608320'/><link rel='alternate' type='text/html' href='http://blog.pythonaro.com/2009/01/adventures-in-windows-subinacl-cscript.html' title='Adventures in Windows - Subinacl, Cscript and how I wasted an evening'/><author><name>Giacomo Lacava</name><uri>https://profiles.google.com/112001311733983789595</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-WWGLdc8H1Uk/AAAAAAAAAAI/AAAAAAAAAYE/tA6iBrZYdng/s512-c/photo.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3676448.post-8309142766980610412</id><published>2009-01-04T10:36:00.004Z</published><updated>2009-01-20T16:37:03.316Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='PingFire'/><category scheme='http://www.blogger.com/atom/ns#' term='NoScript'/><category scheme='http://www.blogger.com/atom/ns#' term='GeekDiary'/><category scheme='http://www.blogger.com/atom/ns#' term='Firefox'/><title type='text'>NoScript + PingFire = problems</title><content type='html'>&lt;p&gt;Note to search engines: the &lt;a href="http://www.pingfire.us"&gt;PingFire&lt;/a&gt; extension for Firefox doesn't work when &lt;a href="http://www.noscript.net"&gt;NoScript&lt;/a&gt; is also installed. Check &lt;a href="http://getsatisfaction.com/schwenkconsulting/topics/problem_with_pingfire_and_noscript"&gt;the official PingFire support thread&lt;/a&gt; for more info.&lt;/p&gt;
&lt;p&gt;&lt;ins&gt;Update: I removed PingFire and replaced it with a simple bookmark-in-sidebar hack:
&lt;ol&gt;&lt;li&gt;Create a bookmark pointing to http://ping.fm/m (the "mobile" site for Ping.fm) and place it on your Bookmarks Toolbar&lt;/li&gt;&lt;li&gt;right-click on it, select Properties&lt;/li&gt;&lt;li&gt;check the option to "Load this bookmark in sidebar"&lt;/li&gt;&lt;/ol&gt;
This is one of the very few occasions in which I found the Firefox sidebar quite  useful.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3676448-8309142766980610412?l=blog.pythonaro.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.pythonaro.com/feeds/8309142766980610412/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3676448&amp;postID=8309142766980610412' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3676448/posts/default/8309142766980610412'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3676448/posts/default/8309142766980610412'/><link rel='alternate' type='text/html' href='http://blog.pythonaro.com/2009/01/noscript-pingfire-problems.html' title='NoScript + PingFire = problems'/><author><name>Giacomo Lacava</name><uri>https://profiles.google.com/112001311733983789595</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-WWGLdc8H1Uk/AAAAAAAAAAI/AAAAAAAAAYE/tA6iBrZYdng/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3676448.post-441086956873717704</id><published>2008-12-31T15:22:00.002Z</published><updated>2008-12-31T15:45:44.595Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='personal'/><category scheme='http://www.blogger.com/atom/ns#' term='music'/><title type='text'>2009 "Year of the Aquarius"</title><content type='html'>&lt;p&gt;Planet Jupiter moves to the Aquarius sector in 2009, and this is supposed to be a good thing for people born (like me) between 21th January and 19th February. Or so my mother says, in her crazy Italian way where "everybody knows" these things are b*llocks but they still believe them "just in case" (exactly like they do with Catholicism and Hell, by the way).&lt;/p&gt;
&lt;p&gt;It certainly won't be an easy year for me, with the new "cryware/nappieware" scheduled for release around July. Things will get pretty hectic, I guess.&lt;/p&gt;

&lt;p&gt;On a less personal note, lots of people said 2008 was "The Year of Obama", "The Year of the Crisis" or even "The Year of YouTube". They are Wrong. Sorry Barack, 2008 was "The Year of ABBA".&lt;/p&gt;

&lt;object width="425" height="344"&gt;&lt;param name="movie" value="http://www.youtube.com/v/dcLMH8pwusw&amp;hl=en&amp;fs=1"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/dcLMH8pwusw&amp;hl=en&amp;fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"&gt;&lt;/embed&gt;&lt;/object&gt;

&lt;p&gt;See you in 2009, perverts.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3676448-441086956873717704?l=blog.pythonaro.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.pythonaro.com/feeds/441086956873717704/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3676448&amp;postID=441086956873717704' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3676448/posts/default/441086956873717704'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3676448/posts/default/441086956873717704'/><link rel='alternate' type='text/html' href='http://blog.pythonaro.com/2008/12/2009-year-of-aquarius.html' title='2009 &quot;Year of the Aquarius&quot;'/><author><name>Giacomo Lacava</name><uri>https://profiles.google.com/112001311733983789595</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-WWGLdc8H1Uk/AAAAAAAAAAI/AAAAAAAAAYE/tA6iBrZYdng/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3676448.post-4111217553227763744</id><published>2008-12-29T14:36:00.004Z</published><updated>2008-12-29T15:04:14.575Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='GeekDiary'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>Guido van Rossum on speed and the array module</title><content type='html'>&lt;p&gt;&lt;span class="vcard"&gt;&lt;abbr class="fn" title="Giulio Piancastelli"&gt;&lt;a class="url" rel="Friend" href="http://gpiancastelli.wordpress.com/"&gt;Giulio&lt;/a&gt;&lt;/abbr&gt;&lt;/span&gt; (through &lt;a href="http://delicious.com/gpiancastelli"&gt;his feed on Delicious.com&lt;/a&gt;) pointed me to a nice post from "benevolent Python-dictator" Guido van Rossum. &lt;a title="Python Patterns - An Optimization Anecdote" href="http://www.python.org/doc/essays/list2str/"&gt;The essay&lt;/a&gt; describes a few general rules for improving performance of Python programs, and it also reminds us of "an odd corner of Python", &lt;a href="http://docs.python.org/library/array.html#module-array"&gt;the array module&lt;/a&gt;. Go and read it, it's worth it.&lt;/p&gt;
&lt;p&gt;It also made me discover "an odd corner" of the Python &lt;i&gt;website&lt;/i&gt;: &lt;a href="http://www.python.org/doc/essays/"&gt;the collection of Guido's essays&lt;/a&gt;. As demonstrated by the original post, this page is much more interesting than &lt;a href="http://neopythonic.blogspot.com/"&gt;Guido's own blog&lt;/a&gt;, and so it's very disappointing that it doesn't have a feed to monitor. Mmhh... Edit: well, stuff there looks a bit stale, I guess Guido doesn't use it very much anymore. Still, it's the sort of thing that should have a feed. Maybe python.org should move to django? ;)&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3676448-4111217553227763744?l=blog.pythonaro.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.pythonaro.com/feeds/4111217553227763744/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3676448&amp;postID=4111217553227763744' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3676448/posts/default/4111217553227763744'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3676448/posts/default/4111217553227763744'/><link rel='alternate' type='text/html' href='http://blog.pythonaro.com/2008/12/guido-van-rossum-on-speed-and-array.html' title='Guido van Rossum on speed and the array module'/><author><name>Giacomo Lacava</name><uri>https://profiles.google.com/112001311733983789595</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-WWGLdc8H1Uk/AAAAAAAAAAI/AAAAAAAAAYE/tA6iBrZYdng/s512-c/photo.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3676448.post-6197556193237372374</id><published>2008-12-19T07:35:00.002Z</published><updated>2008-12-19T08:58:44.959Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='Italy'/><category scheme='http://www.blogger.com/atom/ns#' term='personal'/><title type='text'>La mia Italia</title><content type='html'>&lt;a href="http://en.wikipedia.org/wiki/Sandro_Pertini"&gt;&lt;img src="http://blog.pythonaro.com/static/Sandro_Pertini_Spagna_1982.jpg"&gt;&lt;/a&gt;
&lt;cite title="Sandro Pertini on Socialism"&gt;Libert&amp;agrave; e giustizia sociale, che sono poi le mete del socialismo, costituiscono un binomio inscindibile. Se a me socialista offrissero la riforma pi&amp;ugrave; radicale sul piano sociale, ma privandomi della libert&amp;agrave;, io la rifiuterei. [...] Ma la libert&amp;agrave; senza giustiza sociale pu&amp;ograve; anche essere una conquista vana. Lei pu&amp;ograve; considerare veramente libero un uomo che ha fame, che &amp;egrave; nella miseria, che non ha lavoro, che &amp;egrave; umiliato perch&amp;eacute; non sa come mantenere i suoi figli e educarli? Questo non &amp;egrave; un uomo libero; sar&amp;agrave; libero di bestemmiare e di imprecare, ma questa non &amp;egrave; la libert&amp;agrave; che intendo io.&lt;/cite&gt; -- Alessandro Pertini&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3676448-6197556193237372374?l=blog.pythonaro.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.pythonaro.com/feeds/6197556193237372374/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3676448&amp;postID=6197556193237372374' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3676448/posts/default/6197556193237372374'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3676448/posts/default/6197556193237372374'/><link rel='alternate' type='text/html' href='http://blog.pythonaro.com/2008/12/la-mia-italia.html' title='La mia Italia'/><author><name>Giacomo Lacava</name><uri>https://profiles.google.com/112001311733983789595</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-WWGLdc8H1Uk/AAAAAAAAAAI/AAAAAAAAAYE/tA6iBrZYdng/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3676448.post-7664138491930854473</id><published>2008-12-12T15:26:00.004Z</published><updated>2008-12-15T16:11:46.420Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='Manchester'/><category scheme='http://www.blogger.com/atom/ns#' term='Politics'/><category scheme='http://www.blogger.com/atom/ns#' term='transport'/><title type='text'>On the Manchester Congestion Charge Referendum</title><content type='html'>&lt;p&gt;Residents of Greater Manchester were recently called to vote on a proposal, which would have seen the introduction of a London-style "congestion charge" in exchange for improvements in public transport.&lt;/p&gt;

&lt;p&gt;The results were announced today, and the plans were rejected by 79% of the voters. Turnout was about 53%, which is closer to recent General Elections turnout (about 60%) than Local Elections (about 35%).&lt;/p&gt;

&lt;p&gt;I'd say this was a clear result. Consider this: the plans were strongly supported by all Labour-dominated councils, and opposed only by the few LiberalDemocrats- and Conservative-controlled councils (Trafford and Stockport). It's only because of LibDem and Tory opposition that the referendum was called, and even them were more or less persuaded to support the proposal (after obtaining the referendum).&lt;/p&gt;
&lt;p&gt;When 80% of your own electorate votes against your proposals, it's clear that something doesn't work. The Greater Manchester area is a solid Labour stronghold, and it's been for generations. If the totality of local Labour councillors support a scheme which their own electorate so overwhelmingly despises, then there's something broken in the relationship between public opinion and elected representatives.&lt;/p&gt;

&lt;p&gt;I used to live in a city with a similar situation; it used to be called "The Red Bologna", a city where communists and socialists dominated the political debate for more than 50 years. And then, "all of a sudden", a conservative mayor was voted in, to the shock of political elites only. They were now separated, arrogant, completely unable to understand their own voters and persuaded that they knew better than anyone else. It clearly was a long process, in a city so ideologically rooted in socialist ideology, but they didn't see it coming until too late.&lt;/p&gt;

&lt;p&gt;I hope the local Labour councillors will get the message. Their progressive electorate will not tolerate new, wide-ranging regressive taxes which would only benefit a few private bus companies.&lt;/p&gt;
&lt;p&gt;Please don't force us to vote you out; we'd rather not do it, if only you listened to us a bit more.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3676448-7664138491930854473?l=blog.pythonaro.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.pythonaro.com/feeds/7664138491930854473/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3676448&amp;postID=7664138491930854473' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3676448/posts/default/7664138491930854473'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3676448/posts/default/7664138491930854473'/><link rel='alternate' type='text/html' href='http://blog.pythonaro.com/2008/12/on-manchester-congestion-charge.html' title='On the Manchester Congestion Charge Referendum'/><author><name>Giacomo Lacava</name><uri>https://profiles.google.com/112001311733983789595</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-WWGLdc8H1Uk/AAAAAAAAAAI/AAAAAAAAAYE/tA6iBrZYdng/s512-c/photo.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3676448.post-2690633380884055814</id><published>2008-12-11T16:11:00.002Z</published><updated>2008-12-11T17:14:48.537Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='GeekDiary'/><title type='text'>Yes, I'm schizo</title><content type='html'>&lt;p&gt;The last two posts show complete opposite attitudes. The one on Python shows my better self: rational, positive, calm. The one on Amarok shows my "bad" self: melodramatic, irrational, sarcastic.&lt;/p&gt;
&lt;p&gt;Maybe I seriously need medication...?&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3676448-2690633380884055814?l=blog.pythonaro.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.pythonaro.com/feeds/2690633380884055814/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3676448&amp;postID=2690633380884055814' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3676448/posts/default/2690633380884055814'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3676448/posts/default/2690633380884055814'/><link rel='alternate' type='text/html' href='http://blog.pythonaro.com/2008/12/yes-im-schizo.html' title='Yes, I&apos;m schizo'/><author><name>Giacomo Lacava</name><uri>https://profiles.google.com/112001311733983789595</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-WWGLdc8H1Uk/AAAAAAAAAAI/AAAAAAAAAYE/tA6iBrZYdng/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3676448.post-5338968097416618663</id><published>2008-12-11T14:24:00.006Z</published><updated>2009-11-23T20:06:26.711Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='GeekDiary'/><category scheme='http://www.blogger.com/atom/ns#' term='Amarok'/><title type='text'>On Amarok 2, Or: How You Can Always Find A Way Of Shooting Yourself In The Foot</title><content type='html'>&lt;p&gt;At the beginning, it was WinAmp. And Linux people saw it was good, and lo, XMMS was born. But then XMMS grew old, as it was built with obscure graphic libraries for X-server that no-one knew anymore, and its interface was kludged by too many broken skins. So the desktop-people spawned dozens of their own players, all broken in one way or the other, and the Linux people grew sad.&lt;/p&gt;
&lt;p&gt;One day, from the sky a new player fell, and it had excellent playlist and collection management, and it would read your mind and find music you didn't even know you had anymore. They called it Amarok, and started spreading the good news to the unfaithful, and lo, even the barbarian "windowsers" started being converted by the power of the Loved Wolf.&lt;/p&gt;
&lt;p&gt;But in their hearts, people knew that the good times would end sooner or later. Because it was written that decent programs, when condemned to upgrade cycles, will inevitably be subject to feature creep and unneeded refactoring. And so it was, once again: &lt;a href="http://dot.kde.org/1228929938/"&gt;Amarok 2&lt;/a&gt; was unleashed onto the world, and people could see its brokenness. The program had been corrupted (like many before) by the temptation of integrating "with the web", renouncing playlists and smart features in order to pander to brainless chavs -- people more interested in seeing an album sleeve or reading about the sex life of boybands than listening to the actual music. And the Linux masses were left stranded, once again, without a decent media player, condemned to wander forever in the land of sadness and broken players.&lt;/p&gt;
&lt;p&gt;(All this to say that Amarok 2 sucks -- they've taken away good features in exchange for eye-candy which reminds me of the terrible Windows Media Player. I'm staying on Amarok 1.x forever.)&lt;/p&gt;
&lt;p&gt;&lt;ins&gt;Update: &lt;a href="http://blog.pythonaro.com/2009/11/amarok-2-revisited.html"&gt;a year later...&lt;/a&gt;&lt;/ins&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3676448-5338968097416618663?l=blog.pythonaro.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.pythonaro.com/feeds/5338968097416618663/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3676448&amp;postID=5338968097416618663' title='8 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3676448/posts/default/5338968097416618663'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3676448/posts/default/5338968097416618663'/><link rel='alternate' type='text/html' href='http://blog.pythonaro.com/2008/12/on-amarok-2-or-how-you-can-always-find.html' title='On Amarok 2, Or: How You Can Always Find A Way Of Shooting Yourself In The Foot'/><author><name>Giacomo Lacava</name><uri>https://profiles.google.com/112001311733983789595</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-WWGLdc8H1Uk/AAAAAAAAAAI/AAAAAAAAAYE/tA6iBrZYdng/s512-c/photo.jpg'/></author><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3676448.post-4844873532840082675</id><published>2008-12-06T01:09:00.004Z</published><updated>2008-12-08T15:11:14.534Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='GeekDiary'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='rants'/><title type='text'>If only we could re-use stop-energy...</title><content type='html'>&lt;p&gt;I confess: I'm a whiner, a moaner, a reactionary bitch. I like to pundit and joke about new things, it's actually much easier than &lt;i&gt;making&lt;/i&gt; new things, isn't it... You can just wait there and shoot from the hip, it'll make you feel all righteous and smart, and it's free! &lt;/p&gt;

&lt;p&gt;Italians are champions at moaning.&lt;br /&gt;
&lt;i&gt;Fat lot of good it does to our &lt;abbr title="Gross Domestic Product"&gt;GDP&lt;/abbr&gt;.&lt;/i&gt;&lt;/p&gt;

&lt;p&gt;You probably already know that &lt;a href="http://www.python.org/download/releases/3.0/"&gt;Python 3.0&lt;/a&gt; was released a couple of days ago. After the first 24 hours of joy, the inevitable wave of stop-energy hit the &lt;span style="text-decoration:line-through;"&gt;crap-&lt;/span&gt;blogo-sphere, mostly in the form of classic concern-trolling or uninformed criticism. Now, this is inevitable; for every big action (and releasing Py3k was a &lt;b&gt;huge&lt;/b&gt; step) produces a reaction.&lt;/p&gt;
&lt;p&gt;The transition to Python 3 was announced eight years ago, discussed in detail for ages and eventually implemented in the last two years. Dedicated tools helping the porting effort have been developed and work pretty well, certainly better than most VB6-to-.NET wizards released by Microsoft around 2001. The old codeline will be maintained and updated for well over a year from now, with at least another major release planned, so there's no hurry to upgrade, no pressure whatsoever. Documentation of the changes is pretty exhaustive. Major third-party apps and libs  have been ported already or are in the process of being ported.&lt;/p&gt;
&lt;p&gt;So, what's left to moan about? Breaking backward compatibility. The very first thing that was announced &lt;i&gt;8 years ago&lt;/i&gt;, and since discussed in the most excruciating details, to the point where the "major changes" seem almost banal.&lt;/p&gt;
&lt;p&gt;"Yeah, we got great Unicode support and the &lt;i&gt;with&lt;/i&gt; statement, but so what? &lt;i&gt;print&lt;/i&gt; is now a function! That's it, I'm switching to Ruby!"&lt;br /&gt;&lt;i&gt;"Wait, did you ever actually &lt;b&gt;use&lt;/b&gt; Python? Do you know how much &lt;b&gt;painful&lt;/b&gt; it was to work with Unicode? Or all that crap about new-style and old-style classes?"&lt;/i&gt;&lt;br /&gt;"Well, I don't really know the language much..."&lt;/p&gt;
&lt;p&gt;Stop-energy is for losers and trolls. Ignore the bitching, Python 3 will rock.&lt;/p&gt;
&lt;p&gt;&lt;small&gt;(now, if only I can manage to compile the flipping thing...)&lt;/small&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3676448-4844873532840082675?l=blog.pythonaro.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.pythonaro.com/feeds/4844873532840082675/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3676448&amp;postID=4844873532840082675' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3676448/posts/default/4844873532840082675'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3676448/posts/default/4844873532840082675'/><link rel='alternate' type='text/html' href='http://blog.pythonaro.com/2008/12/if-only-we-could-re-use-stop-energy.html' title='If only we could re-use stop-energy...'/><author><name>Giacomo Lacava</name><uri>https://profiles.google.com/112001311733983789595</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-WWGLdc8H1Uk/AAAAAAAAAAI/AAAAAAAAAYE/tA6iBrZYdng/s512-c/photo.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3676448.post-8963520362768245745</id><published>2008-11-30T23:39:00.001Z</published><updated>2008-11-30T23:42:26.638Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='development'/><category scheme='http://www.blogger.com/atom/ns#' term='GeekDiary'/><category scheme='http://www.blogger.com/atom/ns#' term='paulgraham'/><category scheme='http://www.blogger.com/atom/ns#' term='rants'/><title type='text'>A Big F*** You to Paul Graham, From Worldwide Software-Support People</title><content type='html'>&lt;p&gt;&lt;a href="http://www.paulgraham.com/artistsship.html"&gt;Paul Graham&lt;/a&gt;: &lt;cite&gt;"They'd have sacrificed hundreds of thousands of dollars, perhaps millions, just to be able to deliver more software to users. And you know what? It would have been perfectly safe to let them."&lt;/cite&gt;&lt;/p&gt;
&lt;p&gt;I'm sorry Paul, as a representative of tech-support people worldwide, I have to say: f*** you.&lt;/p&gt;
&lt;p&gt;Developers, even fantastically smart ones, don't test enough &lt;i&gt;as it is&lt;/i&gt;. If you let them have "push-button release" privileges, the software industry would have an even worse reputation for terrible reliability than it already has, and companies would have to spend millions more in order to support all that crappy code that couldn't wait for two more weeks of testing and certification.&lt;/p&gt;
&lt;p&gt;The world would be a better place if developers had to wait &lt;i&gt;two weeks more&lt;/i&gt; than they do now, or even &lt;i&gt;two months&lt;/i&gt;; maybe there would be less s**t around for others to pick up afterwards.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3676448-8963520362768245745?l=blog.pythonaro.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.pythonaro.com/feeds/8963520362768245745/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3676448&amp;postID=8963520362768245745' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3676448/posts/default/8963520362768245745'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3676448/posts/default/8963520362768245745'/><link rel='alternate' type='text/html' href='http://blog.pythonaro.com/2008/11/big-f-you-to-paul-graham-from-worldwide.html' title='A Big F*** You to Paul Graham, From Worldwide Software-Support People'/><author><name>Giacomo Lacava</name><uri>https://profiles.google.com/112001311733983789595</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-WWGLdc8H1Uk/AAAAAAAAAAI/AAAAAAAAAYE/tA6iBrZYdng/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3676448.post-1222806080238912150</id><published>2008-11-30T10:09:00.002Z</published><updated>2008-11-30T10:11:10.461Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='konqueror'/><category scheme='http://www.blogger.com/atom/ns#' term='GeekDiary'/><category scheme='http://www.blogger.com/atom/ns#' term='kde'/><title type='text'>How to disable access keys in Konqueror</title><content type='html'>&lt;p&gt;Well, &lt;a href="http://www.dimis-site.be/node/4"&gt;this suggestion by Dimitri on how to disable access keys in Konqueror&lt;/a&gt; made my day:&lt;br /&gt;&lt;pre&gt;kwriteconfig --file khtmlrc --group "Access Keys" --key Enabled --type bool false&lt;/pre&gt;&lt;br /&gt;"Now  press enter and &lt;i&gt;voil&amp;agrave;&lt;/i&gt;  the access keys are sent to the eternal lands of /dev/null."&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3676448-1222806080238912150?l=blog.pythonaro.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.pythonaro.com/feeds/1222806080238912150/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3676448&amp;postID=1222806080238912150' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3676448/posts/default/1222806080238912150'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3676448/posts/default/1222806080238912150'/><link rel='alternate' type='text/html' href='http://blog.pythonaro.com/2008/11/how-to-disable-access-keys-in-konqueror.html' title='How to disable access keys in Konqueror'/><author><name>Giacomo Lacava</name><uri>https://profiles.google.com/112001311733983789595</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-WWGLdc8H1Uk/AAAAAAAAAAI/AAAAAAAAAYE/tA6iBrZYdng/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3676448.post-824617716846588273</id><published>2008-11-30T00:06:00.003Z</published><updated>2008-11-30T00:28:55.123Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='GeekDiary'/><category scheme='http://www.blogger.com/atom/ns#' term='dbxml'/><title type='text'>Failure of imagination</title><content type='html'>&lt;p&gt;I really wish I knew what to do.&lt;/p&gt;
&lt;p&gt;For the last week, I really wanted to code something up, something new and fresh, and I couldn't figure out &lt;i&gt;what&lt;/i&gt;. I periodically feel like this, and I'm reminded that there's tons of things (started and never finished) which would need attention... and even finished ones, like kdelicious, really need some maintenance. But these are &lt;i&gt;boring&lt;/i&gt; things; since coding for me is just a hobby, I should really spend it on something &lt;i&gt;fun&lt;/i&gt;, right?&lt;/p&gt;
&lt;p&gt;Eventually, I decided to install &lt;a ref="http://www.oracle.com/technology/products/berkeley-db/xml/index.html" title="Oracle Berkeley DbXML"&gt;dbxml&lt;/a&gt;, something I had postponed for a long time. Following &lt;a href="http://commandline.org.uk/electronic-text/2008/aug/14/native-xml-storage-db-xml-part-one"&gt;Zeth's excellent guide&lt;/a&gt;, I avoided the horrendous pitfalls (&lt;i&gt;typos in testing code&lt;/i&gt;? Left there for &lt;i&gt;months&lt;/i&gt;?) and managed to set it up properly, even though checkinstall failed to debianize it. &lt;small&gt;(&lt;abbr title="By The Way"&gt;BTW&lt;/abbr&gt;, why don't we have a .deb somewhere? It was originally released in 2003, one would expect that in 5 years somebody would have come forward...)&lt;/small&gt;&lt;/p&gt;
&lt;p&gt;The good thing about Oracle products is that they come with plenty of documentation; it can be terse, but it's there. (b)dbxml is no exception, so I went through the (excellent) introductory tutorial in a few minutes. Fine. Then I thought "this seems cool, I wonder how could I use it for, maybe some webservice or something"... and the thought died there. My mind had a complete (and utter) failure of imagination. So now I have a very cool xml storage engine with good python bindings, and I don't know what to do with it.&lt;/p&gt;
&lt;p&gt;I ended up playing &lt;acronym title="Multiple Arcade Machine Emulator"&gt;MAME&lt;/acronym&gt; for much of the day.&lt;/p&gt;&lt;p&gt;Bring on Christmas, I need a reboot.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3676448-824617716846588273?l=blog.pythonaro.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.pythonaro.com/feeds/824617716846588273/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3676448&amp;postID=824617716846588273' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3676448/posts/default/824617716846588273'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3676448/posts/default/824617716846588273'/><link rel='alternate' type='text/html' href='http://blog.pythonaro.com/2008/11/failure-of-imagination.html' title='Failure of imagination'/><author><name>Giacomo Lacava</name><uri>https://profiles.google.com/112001311733983789595</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-WWGLdc8H1Uk/AAAAAAAAAAI/AAAAAAAAAYE/tA6iBrZYdng/s512-c/photo.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3676448.post-5915311513888998651</id><published>2008-11-20T13:26:00.003Z</published><updated>2008-11-20T13:42:54.971Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='GeekDiary'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>Python "global" weirdness</title><content type='html'>&lt;p&gt;I'm sure there's a rational explanation for this behaviour, but at the moment is slightly baffling.&lt;/p&gt;
&lt;pre&gt;
class SomeObj:
 def __init__(self):
  self.prop = 1

class SomeClass:
 global objInst
 def __init__(self):
  self.reference = objInst
  self.reference.prop += 1
  
if __name__ == '__main__':
 global objInst
 objInst = SomeObj()
 clsInst = SomeClass()
 print "original:" + str(objInst.prop)
 print "clsInst:" + str(clsInst.reference.prop)

# output:
# &gt;&gt;&gt; x:2
# &gt;&gt;&gt; y:2
&lt;/pre&gt;
&lt;p&gt;This is all good, and expected: you get a reference to a global object and manipulate it. But what happens if you try to &lt;i&gt;rebind&lt;/i&gt; that global name straight in the __init__ method?&lt;/p&gt;
&lt;pre&gt;[..]
class SomeClass:
 global objInst 
 def __init__(self):  
  self.reference = objInst
  self.reference.prop += 1
  objInst = SomeObj()
[..]  
# output:
Traceback (most recent call last):
  File "test.py", line 16, in &lt;module&gt;
    clsInst = SomeClass()
  File "test.py", line 9, in __init__
    self.reference = objInst
UnboundLocalError: local variable 'objInst' referenced before assignment&lt;/pre&gt;
&lt;p&gt;And it gets even more weird! If you move the "global objInst" declaration inside the __init__ method, it works as expected: objInst is bound to a new object with a different state from the one in self.reference. But if you keep the declaration at class level, and simply move the rebinding out in a new method (separated from __init__), you don't get an error but python does not bind the global to a new object.&lt;/p&gt;
&lt;p&gt;I guess it's somehow all a matter of context, and it probably makes perfect sense to programming-language scientists; it just doesn't to me :)&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3676448-5915311513888998651?l=blog.pythonaro.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.pythonaro.com/feeds/5915311513888998651/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3676448&amp;postID=5915311513888998651' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3676448/posts/default/5915311513888998651'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3676448/posts/default/5915311513888998651'/><link rel='alternate' type='text/html' href='http://blog.pythonaro.com/2008/11/python-global-weirdness.html' title='Python &quot;global&quot; weirdness'/><author><name>Giacomo Lacava</name><uri>https://profiles.google.com/112001311733983789595</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-WWGLdc8H1Uk/AAAAAAAAAAI/AAAAAAAAAYE/tA6iBrZYdng/s512-c/photo.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3676448.post-1798853033703405186</id><published>2008-11-16T11:40:00.004Z</published><updated>2008-11-16T11:47:36.634Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='GeekDiary'/><category scheme='http://www.blogger.com/atom/ns#' term='kubuntu'/><title type='text'>I'm impressed</title><content type='html'>&lt;p&gt;Finally we have a Linux system where suspend/resume and even HIBERNATE work out of the box. AND the X-server works as it should, including console-switching. AND it comes with a polished KDE (with a properly-configured kdm), plus an easy upgrade path to KDE4.&lt;/p&gt;

&lt;p&gt;Thanks, Kubuntu.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3676448-1798853033703405186?l=blog.pythonaro.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.pythonaro.com/feeds/1798853033703405186/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3676448&amp;postID=1798853033703405186' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3676448/posts/default/1798853033703405186'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3676448/posts/default/1798853033703405186'/><link rel='alternate' type='text/html' href='http://blog.pythonaro.com/2008/11/im-impressed.html' title='I&apos;m impressed'/><author><name>Giacomo Lacava</name><uri>https://profiles.google.com/112001311733983789595</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-WWGLdc8H1Uk/AAAAAAAAAAI/AAAAAAAAAYE/tA6iBrZYdng/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3676448.post-5733785353029315560</id><published>2008-11-15T01:26:00.002Z</published><updated>2008-11-15T01:40:10.243Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='GeekDiary'/><category scheme='http://www.blogger.com/atom/ns#' term='kubuntu'/><category scheme='http://www.blogger.com/atom/ns#' term='kmymoney'/><title type='text'>KMyMoney "proper" builds</title><content type='html'>&lt;p&gt;Just found out that Clay Weber maintains a lovely &lt;a href="https://launchpad.net/~claydoh/+archive"&gt;personal archive of KMyMoney .deb builds&lt;/a&gt;, very up-to-date and (more importantly) packing several optional plugins that standard Ubuntu and Debian builds don't carry -- in particular, the all-important OFX importer. Thanks Clay!&lt;/p&gt;
&lt;p&gt;Oh, and I moved to Kubuntu Hardy. Feels nice.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3676448-5733785353029315560?l=blog.pythonaro.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.pythonaro.com/feeds/5733785353029315560/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3676448&amp;postID=5733785353029315560' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3676448/posts/default/5733785353029315560'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3676448/posts/default/5733785353029315560'/><link rel='alternate' type='text/html' href='http://blog.pythonaro.com/2008/11/kmymoney-proper-builds.html' title='KMyMoney &quot;proper&quot; builds'/><author><name>Giacomo Lacava</name><uri>https://profiles.google.com/112001311733983789595</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-WWGLdc8H1Uk/AAAAAAAAAAI/AAAAAAAAAYE/tA6iBrZYdng/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3676448.post-4693954895164604188</id><published>2008-11-13T13:50:00.002Z</published><updated>2008-11-13T13:53:50.623Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='Facebook'/><category scheme='http://www.blogger.com/atom/ns#' term='GeekDiary'/><title type='text'>Please stop spamming FB apps</title><content type='html'>&lt;p&gt;Seriously, this is getting ridiculous:&lt;/p&gt;
&lt;img src="http://blog.pythonaro.com/static/requests.png" /&gt;
&lt;p&gt;Every time you add a FB application, a third party gets access to your data, so I stopped accepting all invitations.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3676448-4693954895164604188?l=blog.pythonaro.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.pythonaro.com/feeds/4693954895164604188/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3676448&amp;postID=4693954895164604188' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3676448/posts/default/4693954895164604188'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3676448/posts/default/4693954895164604188'/><link rel='alternate' type='text/html' href='http://blog.pythonaro.com/2008/11/please-stop-spamming-fb-apps.html' title='Please stop spamming FB apps'/><author><name>Giacomo Lacava</name><uri>https://profiles.google.com/112001311733983789595</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-WWGLdc8H1Uk/AAAAAAAAAAI/AAAAAAAAAYE/tA6iBrZYdng/s512-c/photo.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3676448.post-3921773328702646169</id><published>2008-11-09T12:17:00.006Z</published><updated>2008-11-20T13:48:58.631Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='personal'/><category scheme='http://www.blogger.com/atom/ns#' term='GeekDiary'/><category scheme='http://www.blogger.com/atom/ns#' term='foreverythingelsetherespython'/><category scheme='http://www.blogger.com/atom/ns#' term='creditcards'/><category scheme='http://www.blogger.com/atom/ns#' term='personal finances'/><category scheme='http://www.blogger.com/atom/ns#' term='kmymoney'/><title type='text'>Crunching Numbers</title><content type='html'>&lt;p&gt;During the last couple of day, I spent my free time trying to sort out the family finances; big (good) changes are on the horizon, we need to plan a bit better from now on, and it's amazing how "bad" expenses stick out straight away when you aggregate them, instead of relying just on rough day-by-day cash-flow estimates ("how much money is still in my account?").&lt;/p&gt;
&lt;p&gt;I tried to use &lt;a href="http://kmymoney2.sourceforge.net"&gt;KMyMoney&lt;/a&gt; for this sort of thing several times in the past, but I was always inevitably thwarted by the effort required to copy records one-by-one from online bank statements, because the sort of bank accounts I use don't allow any desktop clients to automatically pull data. So this time I thought I'd fix it once and for all, and set down to write a few scripts to do that, albeit in a somehow indirect way.&lt;/p&gt;
&lt;p&gt;KMyMoney can natively import transactions in the legacy (and wildly non-standard) &lt;abbr title="Quicken Interchange Format"&gt;QIF&lt;/abbr&gt; format, while &lt;abbr title="Open Financial Exchange"&gt;OFX&lt;/abbr&gt; requires a plugin (why? No idea). Unfortunately, on my Debian Etch, the bloody plugin somehow never gets installed correctly, but hey, maybe one day it will, and &lt;abbr title="Open Financial Exchange"&gt;OFX&lt;/abbr&gt; is the way of the future anyway (it's &lt;abbr title="eXtensible Markup Language"&gt;XML&lt;/abbr&gt;-based and much more exactly specified than the old plaintext-based, informal &lt;abbr title="Quicken Interchange Format"&gt;QIF&lt;/abbr&gt;). So I wrote a Python script to convert the &lt;abbr title="Hyper-Text Markup Language"&gt;HTML&lt;/abbr&gt; or &lt;abbr title="Comma-Separated Values"&gt;CSV&lt;/abbr&gt; produced by my online accounts to &lt;abbr title="Open Financial Exchange"&gt;OFX&lt;/abbr&gt;, then passed the output to ofx2qif, a handy script included in the libofx-dev package (at least in the 0.8.2 version I'm using). The result is ready to be imported in KMyMoney. Slightly cumbersome, but it does the trick. I need to add a bit more intelligence to the scripts, to speed up the categorisation effort that follows (which is the whole point of the exercise), e.g. "LINK xxxxxx" payees should all be set to "cash machine" etc, but it's already working fairly well.&lt;/p&gt;
&lt;p&gt;The effect was startling; finally, all my expenses are tracked and I can properly budget and forecast. &lt;small&gt;&lt;i&gt;(...How the hell I'm spending so much on mobile-phone calls??)&lt;/i&gt;&lt;/small&gt;&lt;/p&gt;
&lt;p&gt;I'm actually slightly pissed off that cash transactions are now so &lt;i&gt;opaque&lt;/i&gt;; I've no idea why &amp;pound;50 were withdrawn from an &lt;abbr title="Automated teller machine"&gt;ATM&lt;/abbr&gt; on that January day (even though I'm sure it made sense when I first checked the statement 6+ months ago), but I know for a fact that those &amp;pound;37.68 from last December were for a delicious Japanese dinner, as I paid for it with my debit-card.&lt;br /&gt;In a way, this goes against the "classic" principle that "by using plastic, you never really know how much money you &lt;i&gt;don't&lt;/i&gt; have" (so you tend to spend more). I still believe in that principle, and I'm slightly baffled by the evidence.&lt;/p&gt;
&lt;p&gt;I'd strongly recommend this sort of exercise to everyone, anyway. You don't need to use a dedicated program like KMyMoney (even though it helps), Excel might be enough, as long as you can easily add transactions from your online account (via CSV or cut&amp;amp;paste).&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3676448-3921773328702646169?l=blog.pythonaro.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.pythonaro.com/feeds/3921773328702646169/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3676448&amp;postID=3921773328702646169' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3676448/posts/default/3921773328702646169'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3676448/posts/default/3921773328702646169'/><link rel='alternate' type='text/html' href='http://blog.pythonaro.com/2008/11/crunching-numbers.html' title='Crunching Numbers'/><author><name>Giacomo Lacava</name><uri>https://profiles.google.com/112001311733983789595</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-WWGLdc8H1Uk/AAAAAAAAAAI/AAAAAAAAAYE/tA6iBrZYdng/s512-c/photo.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3676448.post-2506280664061278025</id><published>2008-11-05T03:09:00.005Z</published><updated>2008-11-05T03:47:26.737Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='personal'/><category scheme='http://www.blogger.com/atom/ns#' term='Obama'/><category scheme='http://www.blogger.com/atom/ns#' term='Politics'/><category scheme='http://www.blogger.com/atom/ns#' term='JohnBoltonIsATwat'/><title type='text'>The American Dream is back</title><content type='html'>&lt;p&gt;I left the office at the beginning of October saying "When I'm back, Obama will be the President Elect!"; people laughed and said it was too early to call. Well, I called the Democratic primaries for Obama in February; &lt;i&gt;that&lt;/i&gt; was difficult.&lt;/p&gt;&lt;p&gt;Note: I'm slightly pissed off that the &lt;abbr title="British Broadcasting Corporation"&gt;BBC&lt;/abbr&gt; is giving space to John Bolton.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3676448-2506280664061278025?l=blog.pythonaro.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.pythonaro.com/feeds/2506280664061278025/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3676448&amp;postID=2506280664061278025' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3676448/posts/default/2506280664061278025'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3676448/posts/default/2506280664061278025'/><link rel='alternate' type='text/html' href='http://blog.pythonaro.com/2008/11/american-dream-is-back.html' title='The American Dream is back'/><author><name>Giacomo Lacava</name><uri>https://profiles.google.com/112001311733983789595</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-WWGLdc8H1Uk/AAAAAAAAAAI/AAAAAAAAAYE/tA6iBrZYdng/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3676448.post-6551362944783991026</id><published>2008-11-05T00:53:00.004Z</published><updated>2008-11-05T01:06:34.526Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='personal'/><category scheme='http://www.blogger.com/atom/ns#' term='Politics'/><title type='text'>Back to the cold shores of England...</title><content type='html'>&lt;p&gt;... and jet-lagged enough to follow yet another &lt;abbr title="United States of America"&gt;USA&lt;/abbr&gt; presidential show. After two episodes with villains winning, it's about time for the good guys to score one, or it will become a &lt;i&gt;clich&amp;eacute;&lt;/i&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.dailykos.com/storyonly/2008/11/4/122035/550/404/652512"&gt;Someone is liveblogging on dailykos&lt;/a&gt;, if you can't stand the usual round of useless TV pundits.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3676448-6551362944783991026?l=blog.pythonaro.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.pythonaro.com/feeds/6551362944783991026/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3676448&amp;postID=6551362944783991026' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3676448/posts/default/6551362944783991026'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3676448/posts/default/6551362944783991026'/><link rel='alternate' type='text/html' href='http://blog.pythonaro.com/2008/11/back-to-cold-shores-of-england.html' title='Back to the cold shores of England...'/><author><name>Giacomo Lacava</name><uri>https://profiles.google.com/112001311733983789595</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-WWGLdc8H1Uk/AAAAAAAAAAI/AAAAAAAAAYE/tA6iBrZYdng/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3676448.post-3737552040863852173</id><published>2008-10-24T08:45:00.004+01:00</published><updated>2008-10-24T08:52:27.864+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='personal'/><category scheme='http://www.blogger.com/atom/ns#' term='travel'/><category scheme='http://www.blogger.com/atom/ns#' term='Japan'/><title type='text'>Kanazawa blues</title><content type='html'>&lt;p&gt;Weather yesterday turned to a very Mancunian-style rain, so our days in Kanazawa feel a bit sad.&lt;/p&gt;&lt;p&gt;I love tatami rooms, I want one in my next house.&lt;/p&gt;&lt;p&gt;(oh, and the japanese keyboard is hell.)&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3676448-3737552040863852173?l=blog.pythonaro.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.pythonaro.com/feeds/3737552040863852173/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3676448&amp;postID=3737552040863852173' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3676448/posts/default/3737552040863852173'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3676448/posts/default/3737552040863852173'/><link rel='alternate' type='text/html' href='http://blog.pythonaro.com/2008/10/kanazawa-blues.html' title='Kanazawa blues'/><author><name>Giacomo Lacava</name><uri>https://profiles.google.com/112001311733983789595</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-WWGLdc8H1Uk/AAAAAAAAAAI/AAAAAAAAAYE/tA6iBrZYdng/s512-c/photo.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3676448.post-4025474295551681632</id><published>2008-10-18T05:35:00.002+01:00</published><updated>2008-10-18T05:48:31.780+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='personal'/><category scheme='http://www.blogger.com/atom/ns#' term='travel'/><category scheme='http://www.blogger.com/atom/ns#' term='Japan'/><title type='text'>in Kyoto</title><content type='html'>&lt;p&gt;Konban-wa!&lt;/p&gt;&lt;p&gt;We've been in Japan for just five days but it feels like we've packed in a lot, mainly thanks to my wife's perfect organization, I mainly stroll around carrying bags and saying "Oishi-ne", "lovely food"!&lt;/p&gt;&lt;p&gt;
We spent the first few days in Tokyo, breathing in modern Japan, with skyscraping malls "bolted on" the immense train stations. People in every directions, but everything flows so smoothly, and it's so incredibly clean everywhere, I have no idea how they do it. It's "organized delirium" to a level Europeans cannot really comprehend, I think.&lt;/p&gt;&lt;p&gt;
We are now in Kyoto, the "old capital", ready for a smorgasbord of "classical Japanese style" (temples, castles, Zen gardens etc), then we'll hit the road to see some rural areas in the northern mountains before going back to Tokyo for the final souvenir-shopping experience. &lt;/p&gt;&lt;p&gt;
"Unfortunately", the food here is so good that I won't be able to lose any weight during this trip. Well, too bad, eh ;)&lt;/p&gt;&lt;p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3676448-4025474295551681632?l=blog.pythonaro.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.pythonaro.com/feeds/4025474295551681632/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3676448&amp;postID=4025474295551681632' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3676448/posts/default/4025474295551681632'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3676448/posts/default/4025474295551681632'/><link rel='alternate' type='text/html' href='http://blog.pythonaro.com/2008/10/in-kyoto.html' title='in Kyoto'/><author><name>Giacomo Lacava</name><uri>https://profiles.google.com/112001311733983789595</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-WWGLdc8H1Uk/AAAAAAAAAAI/AAAAAAAAAYE/tA6iBrZYdng/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3676448.post-5492557374348349493</id><published>2008-10-11T21:31:00.007+01:00</published><updated>2008-11-20T13:54:15.549Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='GoogleFinance'/><category scheme='http://www.blogger.com/atom/ns#' term='GeekDiary'/><category scheme='http://www.blogger.com/atom/ns#' term='foreverythingelsetherespython'/><category scheme='http://www.blogger.com/atom/ns#' term='Google'/><title type='text'>Notes on Google Finance API</title><content type='html'>&lt;p&gt;I recently started dabbling in shares (yeah, I know, I like swimming against the flow), and so I looked around for good stock-price trackers for &lt;acronym title="K Desktop Environment"&gt;KDE&lt;/acronym&gt;3. To my surprise, I couldn't find anything apart from the usual &lt;a href="http://kmymoney2.sourceforge.net/"&gt;KMyMoney&lt;/a&gt; (which I like and use, but it's not really something you can keep open all day on your desktop). I had already put my stock info on &lt;a href="http://finance.google.com"&gt;Google Finance&lt;/a&gt;, and lo, the service has a &lt;a href="http://code.google.com/apis/gdata/"&gt;GData&lt;/a&gt; &lt;abbr title="Application Programming Interface"&gt;API&lt;/abbr&gt;, so I decided to write a small script in Python to retrieve my portfolio and the daily variations.&lt;/p&gt;
&lt;p&gt;The good thing about GData &lt;abbr title="Application Programming Interface"&gt;API&lt;/abbr&gt;s is that they are all the same at a basic level, so even when client libraries don't explicitly expose new features (like in this case, as Finance is quite a new service), you can still use the &lt;abbr title="Application Programming Interface"&gt;API&lt;/abbr&gt;s to get easy authentication and feed-parsing. So I went and downloaded the official (and excellent) &lt;a href="http://code.google.com/p/gdata-python-client/"&gt;gdata-python-client&lt;/a&gt; package, which is dead-easy to use:&lt;/p&gt;
&lt;pre&gt;
from gdata.service import GDataService

client = GDataService()
client.email = 'your_email@gmail.com'
client.password = 'your_password'
client.service = 'finance'

client.ProgrammaticLogin()

baseURL = "http://finance.google.com/finance/feeds/%(email)s/" % {'email':client.email}

# to get all data in one go:
#  bigFeed = client.GetFeed(baseURL + "portfolios?positions=true&amp;returns=true")
# and then positionsFeed is included in each Entry
#  positionsFeed = gdata.GDataFeedFromString(bigfeed.entry[0].FindExtensions('feedLink')[0].children[0].ToString())

# ... but I really just want the first portfolio
positionsFeed = client.GetFeed(baseURL + "portfolios/1/positions?returns=true")

for entry in positionsFeed.entry:
 details = entry.FindExtensions('symbol')[0] 
 symbol = details.attributes['symbol']
 name = details.attributes['fullName']
 
 data = entry.FindExtensions('positionData')[0]
 totalReturn = round(float(data.attributes['returnOverall']) * 100,2)
 gainPerc = round(float(data.attributes['gainPercentage']) * 100,2)
 
 print name + " (" + symbol + ") Return: " + str(totalReturn) + "% - Gain: " + str(gainPerc) + "%" 
&lt;/pre&gt;
&lt;p&gt;One should really make an applet or something for KDE, but I'm leaving for Japan in about six hours so I can't be bothered...&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3676448-5492557374348349493?l=blog.pythonaro.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.pythonaro.com/feeds/5492557374348349493/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3676448&amp;postID=5492557374348349493' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3676448/posts/default/5492557374348349493'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3676448/posts/default/5492557374348349493'/><link rel='alternate' type='text/html' href='http://blog.pythonaro.com/2008/10/notes-on-google-finance-api.html' title='Notes on Google Finance API'/><author><name>Giacomo Lacava</name><uri>https://profiles.google.com/112001311733983789595</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-WWGLdc8H1Uk/AAAAAAAAAAI/AAAAAAAAAYE/tA6iBrZYdng/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3676448.post-965723112346024459</id><published>2008-10-05T14:14:00.005+01:00</published><updated>2008-11-20T00:18:40.048Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='GeekDiary'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='foreverythingelsetherespython'/><category scheme='http://www.blogger.com/atom/ns#' term='Debian'/><title type='text'>Horrible Hack to get Python 2.6 on Debian or Kubuntu</title><content type='html'>&lt;p&gt;I wanted to try out the newly-released 2.6 version of our beloved Python, but unfortunately Debian didn't have a package for it yet (and it still doesn't). I wasn't too afraid of screwing up my laptop, as it's probably going to be formatted very soon anyway, and I didn't want to mess around with deb build scripts, so this is what I've done:
&lt;ol&gt;
&lt;li&gt;got the official source distribution, untarred and cd in the resulting dir Python2.6&lt;/li&gt;
&lt;li&gt;got some additional packages: apt-get install tk8.4-dev libgdbm-dev libdb-dev libreadline-dev libsqlite3-dev libncurses5-dev &lt;i&gt;(and possibly a few others)&lt;/i&gt;&lt;/li&gt;
&lt;li&gt;./configure --prefix=/usr --enable-ipv6&lt;/li&gt;
&lt;li&gt;make&lt;/li&gt;
&lt;li&gt;checkinstall -D --pkgname=python2.6 --pkgversion=2.6 --maintainer=g.lacava@gmail.com --inspect --backup=yes --install=no make altinstall&lt;br /&gt;
This command allowed me to review the package contents and remove what I didn't need, which is basically everything outside the "python2.6" directories and which might already exist on my system (so I didn't want to overwrite it). &lt;br /&gt;
I took out the lines /usr/bin/pydoc, /usr/bin/idle and /usr/share/man/man1/python.1&lt;br /&gt;
UPDATE: when checkinstall asks if you want to create a default set of docs, say "yes", or you might get an error about ranlib further down (see comments).&lt;/li&gt;
&lt;li&gt;installed the produced .deb package&lt;/li&gt;
&lt;li&gt;copied back pydoc and idle (from the build directory) and /usr/share/man/man1/python.1 (from the Misc directory), all with "2.6" appended. &lt;span style="text-decoration: line-through;"&gt;I then set up alternatives with update-alternatives --install &lt;i&gt;symlink name alternative priority&lt;/i&gt; (mainly in order to "redebianize" my impure karma);&lt;/span&gt; UPDATE: well, using alternatives (a 100% Debian solution which works perfectly well for loads of other multi-version script engines) &lt;a href="https://bugs.launchpad.net/ubuntu/+source/python-central/+bug/93518"&gt;will break your system&lt;/a&gt;, because some developers absolutely must reinvent the wheel every 5 minutes and then proudly announce that &lt;a href="https://bugs.launchpad.net/ubuntu/+source/python-central/+bug/92287"&gt;bugs won't be fixed&lt;/a&gt;. The stupidity of it all is staggering.&lt;/li&gt;&lt;/ol&gt;
&lt;/p&gt;&lt;p&gt;First impressions: 2.6 seems fast as hell. I don't know if this is due to the custom compilation though, rather than improvements in the runtime.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3676448-965723112346024459?l=blog.pythonaro.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.pythonaro.com/feeds/965723112346024459/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3676448&amp;postID=965723112346024459' title='13 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3676448/posts/default/965723112346024459'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3676448/posts/default/965723112346024459'/><link rel='alternate' type='text/html' href='http://blog.pythonaro.com/2008/10/horrible-hack-to-get-python-26-on.html' title='Horrible Hack to get Python 2.6 on Debian or Kubuntu'/><author><name>Giacomo Lacava</name><uri>https://profiles.google.com/112001311733983789595</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-WWGLdc8H1Uk/AAAAAAAAAAI/AAAAAAAAAYE/tA6iBrZYdng/s512-c/photo.jpg'/></author><thr:total>13</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3676448.post-8410207257534933534</id><published>2008-10-04T09:39:00.002+01:00</published><updated>2008-10-04T09:55:54.099+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='personal'/><category scheme='http://www.blogger.com/atom/ns#' term='travel'/><title type='text'>inbetween</title><content type='html'>&lt;p&gt;&lt;cite title="George Foster on traveling"&gt;A man travels the world over in search of what he needs and returns home to find it.&lt;/cite&gt; -- George Moore&lt;/p&gt;
&lt;p&gt;Apologies for not posting much recently. It so happens that I was posted to Egypt for a few weeks (what a crazy place), and in a few days I'll be on a plane to Tokyo (purely for pleasure, this time). Despite the lovely Egyptian hospitality, I came back from Cairo with a tonsillitis (ouch), let's hope Japan will be less troublesome.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3676448-8410207257534933534?l=blog.pythonaro.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.pythonaro.com/feeds/8410207257534933534/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3676448&amp;postID=8410207257534933534' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3676448/posts/default/8410207257534933534'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3676448/posts/default/8410207257534933534'/><link rel='alternate' type='text/html' href='http://blog.pythonaro.com/2008/10/inbetween.html' title='inbetween'/><author><name>Giacomo Lacava</name><uri>https://profiles.google.com/112001311733983789595</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-WWGLdc8H1Uk/AAAAAAAAAAI/AAAAAAAAAYE/tA6iBrZYdng/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3676448.post-3877639735187446387</id><published>2008-09-16T12:13:00.004+01:00</published><updated>2008-09-16T14:20:20.164+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PyconUK'/><category scheme='http://www.blogger.com/atom/ns#' term='django'/><category scheme='http://www.blogger.com/atom/ns#' term='GeekDiary'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>on PyconUK 2008</title><content type='html'>&lt;p&gt;Great conference, like last year. Interesting talks, nice people, spotless organization. Go to the &lt;a href="http://pyconuk.org/community/"&gt;PyconUK wiki&lt;/a&gt; if you want slides and (in a few days) recorded audio.&lt;/p&gt;

&lt;p&gt;Next year the same bunch of great guys will host EuroPython, in June. I'm sure it will be fantastic, but I don't know whether I'll be able to attend, as it will happen during weekdays and I probably couldn't justify the absence from work. Apparently it's all because the French don't go to conferences during weekends; it's always their fault, isn't it ;)&lt;/p&gt;

&lt;p&gt;Anyway, it was all good energy to start messing again with Django on a &lt;a href="http://magnatune.com"&gt;magnatune&lt;/a&gt;-inspired project. Also, we'll try to "reboot" &lt;a href="http://groups.google.com/group/python-north-west"&gt;Python North-West&lt;/a&gt; and see if we can stabilise it a bit. It's all fun :)&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3676448-3877639735187446387?l=blog.pythonaro.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.pythonaro.com/feeds/3877639735187446387/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3676448&amp;postID=3877639735187446387' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3676448/posts/default/3877639735187446387'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3676448/posts/default/3877639735187446387'/><link rel='alternate' type='text/html' href='http://blog.pythonaro.com/2008/09/on-pyconuk-2008.html' title='on PyconUK 2008'/><author><name>Giacomo Lacava</name><uri>https://profiles.google.com/112001311733983789595</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-WWGLdc8H1Uk/AAAAAAAAAAI/AAAAAAAAAYE/tA6iBrZYdng/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3676448.post-5118967156434871553</id><published>2008-09-14T16:24:00.001+01:00</published><updated>2008-09-14T16:26:08.985+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='django'/><category scheme='http://www.blogger.com/atom/ns#' term='GeekDiary'/><title type='text'>Fact.</title><content type='html'>Jacob Kaplan-Moss looks like a young Robin Williams.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3676448-5118967156434871553?l=blog.pythonaro.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.pythonaro.com/feeds/5118967156434871553/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3676448&amp;postID=5118967156434871553' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3676448/posts/default/5118967156434871553'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3676448/posts/default/5118967156434871553'/><link rel='alternate' type='text/html' href='http://blog.pythonaro.com/2008/09/fact.html' title='Fact.'/><author><name>Giacomo Lacava</name><uri>https://profiles.google.com/112001311733983789595</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-WWGLdc8H1Uk/AAAAAAAAAAI/AAAAAAAAAYE/tA6iBrZYdng/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3676448.post-717394069722213131</id><published>2008-09-11T21:17:00.003+01:00</published><updated>2008-09-11T21:20:16.888+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PyconUK'/><category scheme='http://www.blogger.com/atom/ns#' term='GeekDiary'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>Off to PyconUK</title><content type='html'>&lt;p&gt;So, tomorrow night I'm off to Birmingham to attend &lt;a href="http://pyconuk.org"&gt;Pycon UK&lt;/a&gt;. I don't think I'll liveblog like last year, I'll try to be more social. To be honest, I'm not as excited as last year, probably because the conference was &lt;i&gt;so good&lt;/i&gt; in 2007 that I doubt they'll be able to top it. This said, let's hope I'm wrong (as usual).&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3676448-717394069722213131?l=blog.pythonaro.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.pythonaro.com/feeds/717394069722213131/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3676448&amp;postID=717394069722213131' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3676448/posts/default/717394069722213131'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3676448/posts/default/717394069722213131'/><link rel='alternate' type='text/html' href='http://blog.pythonaro.com/2008/09/off-to-pyconuk.html' title='Off to PyconUK'/><author><name>Giacomo Lacava</name><uri>https://profiles.google.com/112001311733983789595</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-WWGLdc8H1Uk/AAAAAAAAAAI/AAAAAAAAAYE/tA6iBrZYdng/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3676448.post-3134566807144305413</id><published>2008-09-06T06:07:00.002+01:00</published><updated>2008-09-06T06:16:20.528+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='greasemonkey'/><category scheme='http://www.blogger.com/atom/ns#' term='GeekDiary'/><category scheme='http://www.blogger.com/atom/ns#' term='goodreads'/><category scheme='http://www.blogger.com/atom/ns#' term='books'/><title type='text'>Goodreads Collapse Folders</title><content type='html'>&lt;p&gt;This is yet another &lt;a href="https://addons.mozilla.org/firefox/addon/748"&gt;greasemonkey&lt;/a&gt; script for &lt;a href="http://www.goodreads.com"&gt;Goodreads&lt;/a&gt;, this time to deal with a minor annoyance.&lt;/p&gt;
&lt;p&gt;A GR group (basically a forum) can have "folders" of topics (basically different areas/sub-forums). When you look up a group, you will get a list of all folders, with the last 4 discussions for each folder; on a group with dozens of folders (e.g. &lt;a href="http://www.goodreads.com/group/show/1865.SciFi_and_Fantasy_Book_Club"&gt;the SciFi and Fantasy Book Club&lt;/a&gt;) it means you might have to scroll quite a bit to get the (small) link to the folder you're interested in.&lt;/p&gt;
&lt;p&gt;So &lt;a href="http://userscripts.org/scripts/show/33146"&gt;this script&lt;/a&gt; will make the folders "expandable", and collapse them by default if they are more than a certain amount (by default 2, but you can customize this threshold). Preview:&lt;br /&gt;&lt;img src="http://lab.pythonaro.com/grfoldercollapse.png" /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3676448-3134566807144305413?l=blog.pythonaro.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.pythonaro.com/feeds/3134566807144305413/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3676448&amp;postID=3134566807144305413' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3676448/posts/default/3134566807144305413'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3676448/posts/default/3134566807144305413'/><link rel='alternate' type='text/html' href='http://blog.pythonaro.com/2008/09/goodreads-collapse-folders.html' title='Goodreads Collapse Folders'/><author><name>Giacomo Lacava</name><uri>https://profiles.google.com/112001311733983789595</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-WWGLdc8H1Uk/AAAAAAAAAAI/AAAAAAAAAYE/tA6iBrZYdng/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3676448.post-3915846249936893867</id><published>2008-09-02T11:26:00.003+01:00</published><updated>2008-09-02T11:35:38.932+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='greasemonkey'/><category scheme='http://www.blogger.com/atom/ns#' term='GeekDiary'/><category scheme='http://www.blogger.com/atom/ns#' term='kdiary'/><category scheme='http://www.blogger.com/atom/ns#' term='goodreads'/><category scheme='http://www.blogger.com/atom/ns#' term='books'/><title type='text'>Goodreads Exploder</title><content type='html'>&lt;p&gt;Another little script for fellow GoodReaders: &lt;a href="http://userscripts.org/scripts/show/33002" title="GoodReads Exploder"&gt;GoodReads Exploder&lt;/a&gt; will add a link to "Explode" all the books on the shelf in different tabs. It saves having to CTRL-click on each book or losing the original shelf page while you browse the books.&lt;/p&gt;
&lt;p&gt;Since this might be a bit dangerous with lots of books, if the shelf contains more than 10 books, the script will warn you and give you the option to cancel the operation before your browser "melts". You can change the limit to suit your machine.&lt;/p&gt;
&lt;p&gt;This script uses several of the most recent Greasemonkey features (GM_openInTab, getValue, setValue...). It was a lot of fun to write, Greasemonkey really is a fabulous toolkit; the FF Extensions framework is, in comparison, very complicate and burdensome (which I guess is the trade-off for all the power they give developers).&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3676448-3915846249936893867?l=blog.pythonaro.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.pythonaro.com/feeds/3915846249936893867/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3676448&amp;postID=3915846249936893867' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3676448/posts/default/3915846249936893867'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3676448/posts/default/3915846249936893867'/><link rel='alternate' type='text/html' href='http://blog.pythonaro.com/2008/09/goodreads-exploder.html' title='Goodreads Exploder'/><author><name>Giacomo Lacava</name><uri>https://profiles.google.com/112001311733983789595</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-WWGLdc8H1Uk/AAAAAAAAAAI/AAAAAAAAAYE/tA6iBrZYdng/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3676448.post-4030477724192259600</id><published>2008-09-01T14:42:00.003+01:00</published><updated>2008-09-01T15:04:38.672+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='personal'/><category scheme='http://www.blogger.com/atom/ns#' term='GeekDiary'/><title type='text'>a question of Snopes</title><content type='html'>&lt;p&gt;&lt;i&gt;Somebody you love (or in your family) forwards one of those email-chains. It's not even too bad, &lt;a href="http://www.snopes.com/politics/religion/holocaust.asp"&gt;the content&lt;/a&gt; is not racist or virulently conservative, even though it might be interpreted as a veiled anti-Muslim piece. Quite a few people are CCed in the email. What do you do?
&lt;ol&gt;&lt;li&gt;You just ignore the email. Nobody "on the net" pays attention to those anyway.&lt;/li&gt;&lt;li&gt;You reply only to the sender, pointing to the relevant Snopes link, and admonishing on the perils of forwarding this sort of chain.&lt;/li&gt;&lt;li&gt;You hit "reply to all", pointing to the Snopes link. The level of "flamin' &amp;amp; shamin'" in the reply will depend on your willingness to maintain a friendship with the original person.&lt;/li&gt;&lt;/ol&gt;&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;This just happened to me, and the sender was... my mother, who increasingly uses email (without being particularly techno-inclined).&lt;/p&gt;&lt;p&gt;After careful consideration, I went for option 3, keeping the tone as soft as possible. I have to say I've done it because it explicitly mentioned "UK schools" in a negative tone for something they are not, in fact, doing at all. I also thought this might teach my mom never to forward this sort of things, no matter how good they seem, in a stronger way than just admonishing "behind the scenes". However, I now feel a bit guilty.&lt;/p&gt;&lt;p&gt;What would you have done in my situation?&lt;/p&gt;
&lt;p&gt;(This is clearly material for a comedy sketch...)&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3676448-4030477724192259600?l=blog.pythonaro.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.pythonaro.com/feeds/4030477724192259600/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3676448&amp;postID=4030477724192259600' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3676448/posts/default/4030477724192259600'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3676448/posts/default/4030477724192259600'/><link rel='alternate' type='text/html' href='http://blog.pythonaro.com/2008/09/question-of-snopes.html' title='a question of Snopes'/><author><name>Giacomo Lacava</name><uri>https://profiles.google.com/112001311733983789595</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-WWGLdc8H1Uk/AAAAAAAAAAI/AAAAAAAAAYE/tA6iBrZYdng/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3676448.post-3247969770025857665</id><published>2008-09-01T07:46:00.006+01:00</published><updated>2008-09-06T06:07:29.026+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='greasemonkey'/><category scheme='http://www.blogger.com/atom/ns#' term='GeekDiary'/><category scheme='http://www.blogger.com/atom/ns#' term='goodreads'/><category scheme='http://www.blogger.com/atom/ns#' term='books'/><title type='text'>Amazon-to-Goodreads Greasemonkey script</title><content type='html'>&lt;p&gt;This is a little &lt;a href="https://addons.mozilla.org/firefox/addon/748"&gt;Greasemonkey&lt;/a&gt; script that will add a link to Amazon item pages to see the reviews on &lt;a href="http://www.goodreads.com"&gt;Goodreads&lt;/a&gt; (if the book is available there). The result will look like this:&lt;br /&gt;
&lt;img src="http://blog.pythonaro.com/static/amzgrsample.png" /&gt;&lt;/p&gt;
&lt;p&gt;You can download it from here: &lt;a href="http://lab.pythonaro.com/releases/amazon_to_goodreads.user.js"&gt;Amazon-to-Goodreads Greasemonkey script 2.0&lt;/a&gt;. Note that you will need to install &lt;a href="https://addons.mozilla.org/firefox/addon/748"&gt;Greasemonkey&lt;/a&gt; first, if you haven't already.&lt;br /&gt;
I also &lt;a href="http://userscripts.org/scripts/show/32914"&gt;put the script on Userscripts.org&lt;/a&gt; as well.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3676448-3247969770025857665?l=blog.pythonaro.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.pythonaro.com/feeds/3247969770025857665/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3676448&amp;postID=3247969770025857665' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3676448/posts/default/3247969770025857665'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3676448/posts/default/3247969770025857665'/><link rel='alternate' type='text/html' href='http://blog.pythonaro.com/2008/09/amazon-to-goodreads-greasemonkey-script.html' title='Amazon-to-Goodreads Greasemonkey script'/><author><name>Giacomo Lacava</name><uri>https://profiles.google.com/112001311733983789595</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-WWGLdc8H1Uk/AAAAAAAAAAI/AAAAAAAAAYE/tA6iBrZYdng/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry></feed>
