<?xml version="1.0" encoding="iso-8859-1" ?>
<rss version="2.0" 
   xmlns:creativeCommons="http://backend.userland.com/creativeCommonsRssModule" 
   xmlns:html="http://www.w3.org/1999/html" 
   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" 
   xmlns:slash="http://purl.org/rss/1.0/modules/slash/">
<channel>
   <title>l e w k . o r g</title>
   <link>http://lewk.org/blog</link>
   <description></description>
   <language>en</language>
   <copyright>Copyright 2007 Luke Macken</copyright>
   <ttl>60</ttl>
   <pubDate>Sat, 17 May 2008 15:10 GMT</pubDate>
   <managingEditor>lewk csh rit edu</managingEditor>
   <generator>PyBlosxom http://pyblosxom.sourceforge.net/ 1.4.2 8/16/2007</generator>
<item>
   <title>liveusb-creator v2.4</title>
   <guid isPermaLink="false">liveusb-creator-2.4</guid>
   <link>http://lewk.org/blog/liveusb-creator-2.4.html</link>
   <description><![CDATA[
<img src="https://fedorahosted.org/liveusb-creator/attachment/wiki/img/fedorausb.png?format=raw" align="right"/>
<p>
Last night I released v2.4 of the <a href="http://fedorahosted.org/liveusb-creator">liveusb-creator</a>, which fixes a bunch of bugs and is much more robust.
</p>
<p>
Someone wrote a pretty cool <a href="http://digg.com/linux_unix/Linux_On_A_Stick_Fedora_9_Puts_Your_Desktop_on_a_USB_Drive">article</a> about the liveusb-creator on Lifehacker the other day, which made it to the front page of digg last night.  <a href="http://digg.com/linux_unix/Linux_On_A_Stick_Fedora_9_Puts_Your_Desktop_on_a_USB_Drive">Digg it up!</a>
</p>
<center>
<script type="text/javascript">
digg_url = 'http://digg.com/linux_unix/Linux_On_A_Stick_Fedora_9_Puts_Your_Desktop_on_a_USB_Drive';
</script>
<script src="http://digg.com/tools/diggthis.js" type="text/javascript"></script>
</center>

]]></description>
   <category domain="http://lewk.org/blog"></category>
   <pubDate>Sat, 17 May 2008 15:10 GMT</pubDate>
</item>
<item>
   <title>Fedora LiveUSB Creator v2.0!</title>
   <guid isPermaLink="false">liveusb-creator-2.0</guid>
   <link>http://lewk.org/blog/liveusb-creator-2.0.html</link>
   <description><![CDATA[
<img src="http://lewk.org/img/liveusb-creator.png" align="right"/>
<p>
The <a href="http://liveusb-creator.fedorahosted.org">liveusb-creator</a> is a cross-platform tool for easily installing live operating systems on to USB flash drives.  Today I released version 2.0, which brings you a brand new graphical interface and a bunch of new features, including:
</p>
<p>
<ul>
    <li>Persistent overlay creation.  This lets you to allocate extra space on your USB stick, allowing you to save files and make modifications to your live operating system that will persist after you reboot.  This essentially lets you carry your own personalized Fedora with you at all times</li>
    <li>Supports downloading various Fedora releases, including <a href="http://docs.fedoraproject.org/release-notes/"><b>Fedora 9!</a></b></li>
  <li>SHA1 checksum verification of known releases, to ensure that you've downloaded the correct bits</li>
  <li>Face-melting hotness</li>
</ul>
</p>
<p>
<b>Windows binary:</b> <a href="https://fedorahosted.org/releases/l/i/liveusb-creator/liveusb-creator-2.3.zip">liveusb-creator-2.3.zip</a> (8.8mb)
</p>
<p>
This release is for Windows-only at the moment.  Linux support is nearing completion, and will exist in later versions.  In the mean time, there are already <a href="http://fedoraproject.org/wiki/FedoraLiveCD/USBHowTo">tools available</a> for creating persistent LiveUSB keys with Fedora.
</p>
<p>
If you would like to help contribute to the liveusb-creator, see the <a href="https://fedorahosted.org/liveusb-creator/wiki/Development">Developers Guide</a> for more information.  If you encounter problems with the tool, please file bug reports <a href="https://fedorahosted.org/liveusb-creator/newticket"><b>here</b></a>.
</p>
<p>
For those interested in trying out this program, but don't have a USB stick, you can buy one <a href="http://astore.amazon.com/lu0b-20/102-6952499-3975331?_encoding=UTF8&node=2">here</a>.
</p>

]]></description>
   <category domain="http://lewk.org/blog"></category>
   <pubDate>Thu, 01 May 2008 01:52 GMT</pubDate>
</item>
<item>
   <title>ThinkPad X300 vs Z61t vs T43</title>
   <guid isPermaLink="false">thinkpad-benchmarks</guid>
   <link>http://lewk.org/blog/thinkpad-benchmarks.html</link>
   <description><![CDATA[
<p>
So I recently purchased a shiny new Thinkpad X300 to replace my T43.  I must say that the X300 is an absolutely incredible machine, but I'll let the graphs speak for themselves :)
</p>
<p>
Below are the results of some benchmarks that I ran comparing the Thinkpad X300, Z61t and T43.  All machines were running Fedora 8 using the 2.6.24.3 kernel.  CPU benchmarks were done using <a href="http://hardinfo.berlios.de/">hardinfo</a>, and disk benchmarks done with <a href="http://www.coker.com.au/bonnie++/">bonnie++</a>.  Graphs created with <a href="http://code.google.com/p/flot/">flot</a>.
</p>
<br/>
<center>
  <img src="/img/tpad-input.png"/>
  <br/>
  <br/>
  <img src="/img/tpad-output.png"/>
  <br/>
  <br/>
  <img src="/img/tpad-random.png"/>
  <br/>
  <br/>
  <img src="/img/tpad-cpu.png"/>
  <br/>
  <br/>
  <img src="/img/tpad-hash.png"/>
  <br/>
</center>
<br/>
More benchmarks comparing various Fedora releases / configurations coming soon!
</p>

]]></description>
   <category domain="http://lewk.org/blog"></category>
   <pubDate>Mon, 07 Apr 2008 20:13 GMT</pubDate>
</item>
<item>
   <title>PyCon 2008</title>
   <guid isPermaLink="false">PyCon2008</guid>
   <link>http://lewk.org/blog/PyCon2008.html</link>
   <description><![CDATA[
<p>
I was in Chicago last week for <a href="http://us.pycon.org/2008/about/">PyCon
2008</a>. It was my first time in the windy city, and I must say that I was
thoroughly impressed.  As expected in any city, we got a chance to see a lady
get her purse snattched, and a mentally unstable gentleman on the train yelling
profanities at god.  Anyway, the conference itself was extremely well done, and
tons of awesome innovation happened at the sprints afterwords.
</p>
<p>
<b>Day 1: Tutorials</b><br>
8+ hours of TurboGears/Pylons/WSGI tutorials.  Awesome.  I'm really
excited with what is in the works for TurboGears2.  By wielding Pylons, the
TG2 team was able to completely re-write their framework with minimal amounts
of code, while at the same time, gaining a *ton* of new features
and some amazing middleware.  Mark Ramm and Ben Bangert took turns walking us through the
deep internals of their frameworks, while also giving some examples how to use
them.
</p>
<p>
<b>Sessions</b><br>
During the 3-day conference portion of PyCon, there was a vast plethora of
incredibly interesting sessions and conversations.  You can find a schedule of
the talks and some slides <a
href="http://us.pycon.org/2008/conference/schedule/">here</a>.  Everything was
video taped as well, so the sessions should be making their way on to YouTube
hopefully at some point soon.
</p>
<p>
Here are some things that caught my attention while I was there.
<p>
<b>WSGI</b><br>
Defined by Phillip J. Eby in <a href="http://www.python.org/dev/peps/pep-0333/">PEP-333</a>, the Web Server Gateway Interface is a simple interface between web servers, applications, and frameworks.  Or, as explained by Ian Bicking: WSGI is a series of Tubes.  The basic idea is that it lets you connect a bunch of different applications together into a functioning whole.

Since TurboGears2 is based on Pylons, it will be a full blown WSGI application out the box, loaded with lots of useful middleware (WebError, Routes, Sessions, Caching, etc), and will allow you to use any WSGI server that you wish (Paste, CherryPy, orbited, mod_wsgi, etc).

An example of a basic Hello World WSGI application:
<blockquote><code>
<body bgcolor="#ffffff" text="#000000"><font face="monospace">
<font color="#a52a2a"><b>def</b></font>&nbsp;<font color="#008b8b">wsgi_app</font>(environ, start_response):<br>
&nbsp;&nbsp;&nbsp;&nbsp;start_response('<font color="#ff00ff">200 OK</font>', [('<font color="#ff00ff">content-type</font>', '<font color="#ff00ff">text/html</font>')])<br>
&nbsp;&nbsp;&nbsp;&nbsp;<font color="#a52a2a"><b>return</b></font>&nbsp;['<font color="#ff00ff">Hello world!</font>']<br>
</font>
</code></blockquote>
</p>
<p>
So, what is WSGI middleware?  Well, it's essentially the WSGI equivalent of a python decorator, but instead of wrapping one function in another, you're wrapping one web-app in another.  You can see a list of some existing WSGI middleware <a href="http://www.wsgi.org/wsgi/Middleware_and_Utilities">here</a>.
</p>
<p>
<b>virtualenv</b><br>
With so many new shiny python programs to play with, I really tried to resist
the urge to easy_install everything into my global Python site-packages so I
could tinker with things.  This is generally a Bad Thing in a distribution, as
easy_install not only installs things behind your package managers back,
but it also lacks the ability to uninstall anything with it, unless you want to take <a
href="http://zedshaw.com/blog/index.html?bear">Zed's easy_fucking_uninstall</a>
approach ;) During the TurboGears tutorial, I was introduced to a tool call
virtualenv, which will setup a virtual python environment in which you can
easy_install as many eggs as you want without worrying about butchering
your site-packages.
</p>
<blockquote><code>
    $ easy_install virtualenv<br>
    $ virtualenv --no-site-packages foo<br>
    $ cd foo; source bin/activate<br>
    $ easy_install &lt;shiny python programs&gt;<br>
</code></blockquote>
<p>
<b>nose</b><br>
I've been in love with <a
href="http://somethingaboutorange.com/mrl/projects/nose/">nose</a> since day
one, but realized that I haven't been utilizing it to it's fullest abilities.
I blogged in the <a href="http://lewk.org/blog/tags/nose">past</a> about nose's
profiler plugin.  Come to find out, nose offers a lot more plugins that can
seriously help make your life easier:
<blockquote><code>
$ nosetests --pdb --pdb-failures<br>
.............................................................&gt; /home/lmacken/tg1.1/turbogears/turbogears/identity/tests/test_visit.py(92)test_cookie_permanent()<br>
-&gt; assert abs(should_expire - expires) < 3<br>
(Pdb) locals()<br>
{'morsel': &lt;Morsel: tg-visit='452c94de3900fc2adff2cd6b0b0f04c4533e3e9e'&gt;, 'self': &lt;turbogears.identity.tests.test_visit.TestVisit testMethod=test_cookie_permanent&gt;, 'expires': 1206228604.0, 'should_expire': 1206232205.0, 'permanent': False}<br>
(Pdb) 
</code></blockquote>
</p>
<p>
You can also measure code coverage during your unit test execution using the '--with-coverage' option, which utilizes <a href="http://nedbatchelder.com/code/modules/coverage.html">coverage.py</a>.
</p>
<p>
<b>SQLAlchemy</b><br>
Also known as "the greatest object-relational-mapper created for any language. ever.", 0.4 has seen vast improvements since 0.3.  Among them, a new <a
href="http://www.sqlalchemy.org/docs/04/plugins.html#plugins_declarative">declarative
API</a> is now available that essentially lets you define your class, Table and
mapper constructs "at once" under a single class declaration (giving you a
similar ActiveMapper feel like SQLObject or Elixir).
<blockquote><code>		
<font color="#a020f0">from</font>&nbsp;sqlalchemy.ext.declarative <font color="#a020f0">import</font>&nbsp;declarative_base<br>
<br>
engine = create_engine('<font color="#ff00ff">sqlite://</font>')<br>
Base = declarative_base(engine)<br>
<br>
<font color="#a52a2a"><b>class</b></font>&nbsp;<font color="#008b8b">SomeClass</font>(Base):<br>
&nbsp;&nbsp;&nbsp;&nbsp;__tablename__ = '<font color="#ff00ff">some_table</font>'<br>
&nbsp;&nbsp;&nbsp;&nbsp;id = Column('<font color="#ff00ff">id</font>', Integer, primary_key=True)<br>
&nbsp;&nbsp;&nbsp;&nbsp;name =&nbsp;Column('<font color="#ff00ff">name</font>', String(50))<br>
</code></blockquote>
</p>
<p>
<b>Unicode, demystified.</b><br>
By far, the most frustrating problems I've ever encountered in Python have been
unicode related.  I was fortunate enough to catch Kumar McMillan's
presentation, "Unicode in Python, Completely Demystified".  This presentation
helped enlighten many on the concept of unicode, clear up many misconceptions,
and explain how to handle it properly in Python.  Check out <a
href="http://farmdev.com/talks/unicode">his slides</a> for more details, but
the general idea here is to follow these three rules:
<ul>
    <li>decode early</li>
    <li>unicode everywhere</li>
    <li>encode late</li>
</ul>
His solution to decoding to unicode turns out to be quite elegant compared to
some nasty try/except UnicodeDecodeError blocks that I have written in the past
;)
<blockquote><code>
<font color="#a52a2a"><b>def</b></font>&nbsp;<font color="#008b8b">to_unicode_or_bust</font>(obj, encoding='<font color="#ff00ff">utf-8</font>'):<br>
&nbsp;&nbsp;&nbsp;&nbsp;<font color="#a52a2a"><b>if</b></font>&nbsp;isinstance(obj, basestring):<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#a52a2a"><b>if</b></font>&nbsp;<font color="#a52a2a"><b>not</b></font>&nbsp;isinstance(obj, unicode):<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;obj = unicode(obj, encoding)<br>
&nbsp;&nbsp;&nbsp;&nbsp;<font color="#a52a2a"><b>return</b></font>&nbsp;obj<br>
</code></blockquote>
</p>
<p>
Later that night I went and shined some light on some dark corners of
certain projects that I've been working on to try and handle unicode
the Right Way.
</p>
<p>
<b>Grassyknoll</b><br>
After the code sprints, I got a chance to see these guys show off their hard
work.  <a href="http://code.google.com/p/grassyknoll/">grassyknoll</a> is a
search engine written in Python.  With the ability to handle multiple backends,
frontends, and wire formats, grassyknoll has a ton of potential to
revolutionize the open source search engine.  There has been recent talk in
Fedora land about what kind of search engine to use, and I think grassyknoll is
definitley a viable option.
</p>
<p>
<b>Packaging BOF</b><br>
Toshio, Spot, and I attended a Packaging BOF where we discussed our
experiences with distutils and setuptools with a bunch of people from various
companies and distros.  This then sparked discussions on python-dev and the
distutils-sig mailing lists.  You can also find the details of the BOF session
on the <a href="http://wiki.python.org/moin/PackagingBOF">Python wiki</a>.  There
is definitely a lot of energy behind this, so hopefully we'll see some good changes
in setuptools in the near future that will make our lives as distro packagers much easier :)
</p>
<p>
<p>
<b>Orbited</b><br>
Orbited is an HTTP daemon that is optimized for long-lasting comet
connections.  This allows you to write real-time web applications with
ease.  For example, embeding an irc channel anywhere:
<p>
<iframe style="width:695px;height:390px;scrolling:no;border:0px;"
src="http://fedora.orbited.org:8000/static/chat.html?channel=fedora-devel"></iframe></center>
</p>
<p>
You can also use orbited as a WSGI server!  Toshio did some brief benchmarking
of of CherryPy{2,3}, Paste, and Orbited WSGI servers, and orbited seemed to be
the clear winner in all scenerios.  There is a good chance that we will be using
orbited to handle our comet widgets within MyFedora :)
</p>
</p>
<b>Code Sprints</b><br>
I stayed the entire time for the code sprints, and mainly focused on
TurboGears hacking.
This is what I ended up working on:
<ul>
<li>Added SQLAlchemy support to turbogears.testutil.DBTest (<a
   href="http://trac.turbogears.org/ticket/1764">Ticket #1764</a>).
 		When you inherit from this class, it will automatically set up and tear down your SQLObject
 		or SQLAlchemy database before and after each of your unit tests.</li>
<li>Added a <a href="http://code.google.com/p/twtools/source/browse/trunk/toscawidgets/widgets/twtools/jquery/flot.py">FlotWidget</a>
using <a href="http://toscawidgets.org">ToscaWidgets</a> to <a
href="http://code.google.com/p/twtools/">twTools</a> This widget
allows you to create attractive graphs with ease.</li>
<li>Made the TurboGears2 templating engine configurable (<a
   href="http://trac.turbogears.org/ticket/1680">Ticket #1680</a>).
   Things were hardcoded to use genshi; this is no longer the case.</li>
<li>WebTest integration for unit test (<a
   href="http://trac.turbogears.org/ticket/1762">Ticket #1762</a>).  I
   wrote a some high level unit testing classes that wrap a <a href="http://pythonpaste.org/webtest/">WebTest</a> object
   around your WSGI app.  This gives you an extremely powerful API to
   write "framework independent" unit tests.  The WebTest.get/post
   methods simply return <a href="http://pythonpaste.org/webob/">WebOb</a> objects, which allow for drastic
   simplification of your unittests.  This also helped decouple the TG
   testutils from using CherryPy internals (one step closer to CherryPy3
   support in TurboGears).  As <a href="http://groups.google.com/group/turbogears-trunk/browse_thread/thread/62f781b69f469b8f?hl=en">I mentioned</a> on the TurboGears-trunk list,
   these changes will make writing unit tests a breeze: </li>
<blockquote><code>
<font color="#a52a2a"><b>class</b></font>&nbsp;<font color="#008b8b">TestPages</font>(testutil.DBWebTest):<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;<font color="#a52a2a"><b>def</b></font>&nbsp;<font color="#008b8b">test_forbidden</font>(self):<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.app.get('<font color="#ff00ff">/hot_action</font>', status=403)<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;<font color="#a52a2a"><b>def</b></font>&nbsp;<font color="#008b8b">test_webob_response</font>(self):<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;user = User(user_name=u&quot;<font color="#ff00ff">test</font>&quot;, password=u&quot;<font color="#ff00ff">test</font>&quot;)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.login_user(user)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;res = self.app.get('<font color="#ff00ff">/hot_action</font>')<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#a52a2a"><b>assert</b></font>&nbsp;&quot;<font color="#ff00ff">Hot WSGI action</font>&quot;&nbsp;<font color="#a52a2a"><b>in</b></font>&nbsp;res<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#a52a2a"><b>assert</b></font>&nbsp;res.namespace['<font color="#ff00ff">tg_flash</font>'] == u'<font color="#ff00ff">Hot WSGI action</font>'&nbsp;<br>
</code></blockquote>
The WebTest integration is planned to hit in the TurboGears 1.1 release, deprecating testutils.{call,create_request}.
</ul>
</p>
<p>
Want to read more blog posts about PyCon 2008?  You can find links to lots of PyCon related posts <a href="http://nxsy.org/blog/archives/2008/03/18/pycon-2008-blog-coverage-outstanding">here</a> and on <a href="http://planet.python.org/">Planet Python</a>.

]]></description>
   <category domain="http://lewk.org/blog"></category>
   <pubDate>Mon, 24 Mar 2008 22:05 GMT</pubDate>
</item>
<item>
   <title>Speed up Windows with... encryption !!?!</title>
   <guid isPermaLink="false">truecrypt5</guid>
   <link>http://lewk.org/blog/truecrypt5.html</link>
   <description><![CDATA[
<p>
I was listening to the <a href="http://twit.tv/sn133">Security Now!</a> podcast yesterday, where <a href="http://www.grc.com">Steve Gibson</a> talked about the latest release of <a href="http://www.truecrypt.org/">TrueCrypt</a>.  I've had great experiences with TrueCrypt in the past, and Steve seems to have nothing but good things to say about it as well.
</p>
<p>
The most fascinating thing that he mentioned was that in his benchmarks (which entailed restoring a very fragged XP image, then running a batch script which used ntimer to clock the windows defraggers and vopt), Windows ran <b>significantly *FASTER*</b> when fully-encrypted with TrueCrypt, <b>than without</b>.
</p>
<p>
So it seems that the TrueCrypt guys have created drivers that not only encrypt/decrypt your data seemlessly on the fly, but are actually quite faster than the default Windows drivers.  Amazing.
</p>
<p>
I haven't tried to reproduce this locally, as I try to avoid firing up my
Windows vm guest at all costs.  However, I'm interested to hear if anyone else
notices this dramatic performance boost that Steve talks about when
using TrueCrypt5 in Windows.
</p>

]]></description>
   <category domain="http://lewk.org/blog"></category>
   <pubDate>Wed, 05 Mar 2008 16:46 GMT</pubDate>
</item>
<item>
   <title>gobby.fedoraproject.org</title>
   <guid isPermaLink="false">gobby</guid>
   <link>http://lewk.org/blog/gobby.html</link>
   <description><![CDATA[
<p>
<img src="http://lewk.org/img/gobby.png" align="right"/>
A dedicated <a href="http://gobby.0x539.de/trac/">Gobby</a> session is now
running on <b>gobby.fedoraproject.org</b> !<br/><br/>
<b>*UPDATE*</b>: To address some initial security concerns, I've locked down
this instance to Fedora contributors only.  The password can be found in
<b>~lmacken/gobby</b> on fedorapeople.org (via ssh)

Yes, this raises the bar a little bit, but more of a reason to <a
href="https://admin.fedoraproject.org/accounts/">get a Fedora account</a> ;)
</p>
<p>
What is Gobby, you ask?
<blockquote>
"Gobby is a free collaborative editor supporting multiple documents in one
session and a multi-user chat. It runs on Microsoft Windows, Mac OS X, Linux
and other Unix-like platforms."
</blockquote>
</p>
<p>
If you're running Fedora, simply install the 'gobby' package, and you're ready
to go.  Click "Join Session", and connect to "gobby.fedoraproject.org".  You'll then be able to collaborate in real-time with others on code, documents, notes, etc.
</p>
<p>
<center><a href="/img/gobby-screenshot.png"><img src="/img/gobby-thumb.png" border="0"/></a></center>
</p>
<p>
Since this is wide-open for anyone to use, I've also setup a cron job that
frequently commits the session to a git repository.  You can view the changes
to our gobby session via <a href="http://gobby.fedoraproject.org/git/gitweb.cgi?p=sobby/.git;a=summary">gitweb</a>.  Regardless, you should still save anything that you expect to keep locally.
</p>

]]></description>
   <category domain="http://lewk.org/blog"></category>
   <pubDate>Thu, 21 Feb 2008 01:54 GMT</pubDate>
</item>
<item>
   <title>Creating live Fedora USB sticks, in Windows!</title>
   <guid isPermaLink="false">liveusb-creator</guid>
   <link>http://lewk.org/blog/liveusb-creator.html</link>
   <description><![CDATA[
<p>
<img
src="https://fedorahosted.org/liveusb-creator/attachment/wiki/img/fedorausb.png?format=raw" align="right" />
Last weekend I sat down and developed the <a href="http://fedorahosted.org/liveusb-creator">liveusb-creator</a>, a tool for creating live Fedora USB sticks from Windows.  It will automatically detect all removable drives, find your ISO, extract it to your USB key, modify the syslinux.cfg, and install the bootloader.  Technical details aside for a moment, the end-user workflow turns out to be something like this:
</p>

<ul>
    <li><a href="http://fedoraproject.org/get-fedora">Get Fedora</a> Live Media.</li>
    <li>Download and extract <a href="http://lmacken.fedorapeople.org/liveusb-creator/liveusb-creator-1.0.zip">liveusb-creator.zip</a></li>
    <li>Drag your Fedora Live media into the liveusb-creator directory</li>
    <li>Double click 'liveusb-creator.exe'</li>
</ul>

<p>
At the moment it is a simple a console application that asks the user if it has any questions (by default it won't), and then gets the job done.  So shortly after <a href="https://www.redhat.com/archives/fedora-devel-list/2008-February/msg00087.html">announcing</a> this tool, I started throwing together a graphical interface using PyGTK.  While I was doing this, <a href="http://kushaldas.in/?p=208">Kushal Das</a> was on the other side of the planet working on a PyQT version :)  It turns out his code is much cleaner than my gtk implementation, so I went ahead and committed it.  Furthermore, I'm pretty excited to get a chance to play with The Other widget toolkit for once ;)
</p>

<p>
So, detecting removable devices and such is <a href="https://fedorahosted.org/liveusb-creator/browser/liveusb/creator.py#L117">*trivial*</a> in Windows using the powerfully-undocumented win32api Python module (after playing a few rounds of "match the return code to the enum", of course).  Ideally, I want this tool to work in both Linux and Windows, so I redesigned the code quite a bit, broke it out into various modules, and recently started working on the Linux side of things.  At this point in time, there is now <a href="https://fedorahosted.org/liveusb-creator/browser/liveusb/creator.py">code</a> that detects removable drives using dbus and HAL.  I still have a bunch of sanity checking and other bits to write, but progress is definitely being made.  In the mean time for Linux users, see the <a href="http://fedoraproject.org/wiki/FedoraLiveCD/USBHowTo">USBHowTo</a> for creating a live USB stick using the livecd-iso-to-disk tool.
</p>

<p>
If you're interested in helping out with the liveusb-creator, you can get ahold of the source code using git:
<code><blockquote>
git clone git://git.fedorahosted.org/git/liveusb-creator.git
</code></blockquote>

If you encounter any problems, please create a new ticket at the <a href="https://fedorahosted.org/liveusb-creator/">liveusb-creator trac</a>.
</p>

]]></description>
   <category domain="http://lewk.org/blog"></category>
   <pubDate>Mon, 11 Feb 2008 14:38 GMT</pubDate>
</item>
<item>
   <title>F8 -> F9 Alpha Live Diff</title>
   <guid isPermaLink="false">f8-f9alpha-livediff</guid>
   <link>http://lewk.org/blog/f8-f9alpha-livediff.html</link>
   <description><![CDATA[
<p>
Fedora 9 Alpha is <a href="http://fedoraproject.org/wiki/Releases/9/Schedule">scheduled</a> to be released today!  Not only did I spin the live bits for this alpha, I also generated some statistics as to what changed in this release since Fedora 8.

Here are the livecd diffs for all of our spins.

<ul>
<li><a href="http://lmacken.fedorapeople.org/f8-f9alpha-live-diff/F9-Alpha-Developer-20080129.0.diff.html">F9-Alpha-Developer-20080129.0.diff</a></li>
<li><a href="http://lmacken.fedorapeople.org/f8-f9alpha-live-diff/F9-Alpha-FEL-i686-20080129.0.diff.html">F9-Alpha-FEL-i686-20080129.0.diff</a></li>
<li><a href="http://lmacken.fedorapeople.org/f8-f9alpha-live-diff/F9-Alpha-games-i686-20080129.0.diff.html">F9-Alpha-games-i686-20080129.0.diff</a></li>
<li><a href="http://lmacken.fedorapeople.org/f8-f9alpha-live-diff/F9-Alpha-i686-20080129.0.diff.html">F9-Alpha-i686-20080129.0.diff</a></li>
<li><a href="http://lmacken.fedorapeople.org/f8-f9alpha-live-diff/F9-Alpha-KDE-i686-20080129.0.diff.html">F9-Alpha-KDE-i686-20080129.0.diff</a></li>
<li><a href="http://lmacken.fedorapeople.org/f8-f9alpha-live-diff/F9-Alpha-KDE-x86_64-20080129.0.diff.html">F9-Alpha-KDE-x86_64-20080129.0.diff</a></li>
<li><a href="http://lmacken.fedorapeople.org/f8-f9alpha-live-diff/F9-Alpha-x86_64-20080129.0.diff.html">F9-Alpha-x86_64-20080129.0.diff</a></li>
</ul>

Below are the details as to what changed in our default GNOME desktop spin since Fedora 8.

<code><blockquote style="line-height: 0.8em">
<font face="monospace">
<font color="#2e8b57"><b>--- F8-Live-i686-20080204.0.iso (694M)</b></font><br>
<font color="#2e8b57"><b>+++ F9-Alpha-i686-20080129.0.iso (698M)</b></font><br>
<font color="#008b8b">+ new package libgdiplus-devel: 8584</font><br>
<font color="#008b8b">+ new package xorg-x11-server-common: 38863</font><br>

<font color="#008b8b">+ new package PolicyKit-gnome-libs: 40188</font><br>
<font color="#008b8b">+ new package kerneloops: 52570</font><br>
<font color="#008b8b">+ new package swfdec-gtk: 55786</font><br>
<font color="#008b8b">+ new package gnome-panel-libs: 56936</font><br>
<font color="#008b8b">+ new package swfdec-mozilla: 75911</font><br>
<font color="#008b8b">+ new package libconfig: 120055</font><br>
<font color="#008b8b">+ new package obex-data-server: 136538</font><br>
<font color="#008b8b">+ new package at-spi-python: 170868</font><br>
<font color="#008b8b">+ new package ncurses-base: 176949</font><br>

<font color="#008b8b">+ new package pixman: 209556</font><br>
<font color="#008b8b">+ new package scim-python: 247730</font><br>
<font color="#008b8b">+ new package libcurl: 258148</font><br>
<font color="#008b8b">+ new package libggz: 289477</font><br>
<font color="#008b8b">+ new package hfsutils: 362228</font><br>
<font color="#008b8b">+ new package libmtp: 398952</font><br>
<font color="#008b8b">+ new package xorg-x11-drv-openchrome: 415754</font><br>
<font color="#008b8b">+ new package ggz-client-libs: 434830</font><br>
<font color="#008b8b">+ new package samyak-fonts: 457144</font><br>

<font color="#008b8b">+ new package perl-Date-Manip: 458629</font><br>
<font color="#008b8b">+ new package libtasn1: 466849</font><br>
<font color="#008b8b">+ new package python-crypto: 571535</font><br>
<font color="#008b8b">+ new package elilo: 613010</font><br>
<font color="#008b8b">+ new package gfs2-utils: 650707</font><br>
<font color="#008b8b">+ new package ncurses-libs: 668620</font><br>
<font color="#008b8b">+ new package swfdec: 958169</font><br>
<font color="#008b8b">+ new package reiserfs-utils: 1022402</font><br>
<font color="#008b8b">+ new package iscsi-initiator-utils: 1138529</font><br>

<font color="#008b8b">+ new package jfsutils: 1138726</font><br>
<font color="#008b8b">+ new package gvfs: 1700127</font><br>
<font color="#008b8b">+ new package totem-pl-parser: 2627745</font><br>
<font color="#008b8b">+ new package xfsprogs: 3408051</font><br>
<font color="#008b8b">+ new package VLGothic-fonts: 3831447</font><br>
<font color="#008b8b">+ new package VLGothic-fonts-proportional: 3831790</font><br>
<font color="#008b8b">+ new package gnome-settings-daemon: 6218660</font><br>
<font color="#008b8b">+ new package mesa-libOSMesa: 7248256</font><br>
<font color="#008b8b">+ new package scim-python-chinese: 7621164</font><br>

<font color="#008b8b">+ new package libgweather: 14592282</font><br>
<font color="#008b8b">+ new package dejavu-fonts: 15593008</font><br>
<font color="#008b8b">+ new package vim-common: 16294034</font><br>
<font color="#008b8b">+ new package xulrunner: 24481155</font><br>
<font color="#008b8b">+ crontabs grew 144 bytes (6.83%) (2107-&gt;2251)</font><br>
<font color="#008b8b">+ libopenraw-gnome grew 348 bytes (7.94%) (4384-&gt;4732)</font><br>
<font color="#008b8b">+ xorg-x11-drv-fbdev grew 380 bytes (1.84%) (20597-&gt;20977)</font><br>

<font color="#008b8b">+ irqbalance grew 400 bytes (1.85%) (21595-&gt;21995)</font><br>
<font color="#008b8b">+ m17n-contrib grew 469 bytes (1.28%) (36757-&gt;37226)</font><br>
<font color="#008b8b">+ pam_ccreds grew 497 bytes (1.49%) (33428-&gt;33925)</font><br>
<font color="#008b8b">+ smolt-firstboot grew 655 bytes (6.01%) (10893-&gt;11548)</font><br>
<font color="#008b8b">+ pcsc-lite-libs grew 848 bytes (2.44%) (34696-&gt;35544)</font><br>
<font color="#008b8b">+ dbus-x11 grew 884 bytes (3.63%) (24353-&gt;25237)</font><br>

<font color="#008b8b">+ numactl grew 896 bytes (1.00%) (89239-&gt;90135)</font><br>
<font color="#008b8b">+ gnome-bluetooth-libs grew 1278 bytes (1.02%) (124866-&gt;126144)</font><br>
<font color="#008b8b">+ xorg-x11-drv-evdev grew 1445 bytes (4.05%) (35642-&gt;37087)</font><br>
<font color="#008b8b">+ m17n-db-hindi grew 1717 bytes (21.74%) (7899-&gt;9616)</font><br>
<font color="#008b8b">+ sysreport grew 1783 bytes (5.30%) (33620-&gt;35403)</font><br>
<font color="#008b8b">+ libpciaccess grew 1796 bytes (7.21%) (24901-&gt;26697)</font><br>

<font color="#008b8b">+ sg3_utils-libs grew 2156 bytes (1.97%) (109392-&gt;111548)</font><br>
<font color="#008b8b">+ pciutils grew 2464 bytes (1.36%) (180975-&gt;183439)</font><br>
<font color="#008b8b">+ setroubleshoot grew 2541 bytes (1.11%) (229578-&gt;232119)</font><br>
<font color="#008b8b">+ gnome-keyring-pam grew 2556 bytes (8.89%) (28760-&gt;31316)</font><br>
<font color="#008b8b">+ libcap grew 2618 bytes (5.79%) (45230-&gt;47848)</font><br>
<font color="#008b8b">+ apr grew 2823 bytes (1.04%) (271801-&gt;274624)</font><br>

<font color="#008b8b">+ bc grew 2861 bytes (1.50%) (190964-&gt;193825)</font><br>
<font color="#008b8b">+ libsepol grew 2992 bytes (1.33%) (224692-&gt;227684)</font><br>
<font color="#008b8b">+ lohit-fonts-telugu grew 3100 bytes (1.78%) (174487-&gt;177587)</font><br>
<font color="#008b8b">+ e2fsprogs-libs grew 3332 bytes (1.33%) (250016-&gt;253348)</font><br>
<font color="#008b8b">+ device-mapper-libs grew 3680 bytes (4.25%) (86516-&gt;90196)</font><br>
<font color="#008b8b">+ glx-utils grew 3704 bytes (10.98%) (33736-&gt;37440)</font><br>

<font color="#008b8b">+ scim-chewing grew 4072 bytes (3.22%) (126383-&gt;130455)</font><br>
<font color="#008b8b">+ dbus-libs grew 4100 bytes (1.63%) (251944-&gt;256044)</font><br>
<font color="#008b8b">+ nash grew 4128 bytes (1.74%) (237698-&gt;241826)</font><br>
<font color="#008b8b">+ libjpeg grew 4420 bytes (1.61%) (275021-&gt;279441)</font><br>
<font color="#008b8b">+ authconfig-gtk grew 4808 bytes (2.75%) (175143-&gt;179951)</font><br>
<font color="#008b8b">+ mkinitrd grew 4854 bytes (4.84%) (100334-&gt;105188)</font><br>

<font color="#008b8b">+ linuxwacom grew 5518 bytes (1.10%) (502293-&gt;507811)</font><br>
<font color="#008b8b">+ desktop-file-utils grew 5523 bytes (4.50%) (122601-&gt;128124)</font><br>
<font color="#008b8b">+ gnome-python2-gnomeprint grew 5547 bytes (1.27%) (437641-&gt;443188)</font><br>
<font color="#008b8b">+ bluez-utils-alsa grew 5856 bytes (13.67%) (42824-&gt;48680)</font><br>
<font color="#008b8b">+ m17n-contrib-telugu grew 6114 bytes (28.08%) (21776-&gt;27890)</font><br>
<font color="#008b8b">+ rsyslog grew 6922 bytes (1.45%) (477587-&gt;484509)</font><br>

<font color="#008b8b">+ ustr grew 7531 bytes (3.12%) (241610-&gt;249141)</font><br>
<font color="#008b8b">+ rhpxl grew 7783 bytes (2.36%) (329907-&gt;337690)</font><br>
<font color="#008b8b">+ xorg-x11-drv-mga grew 8319 bytes (4.91%) (169473-&gt;177792)</font><br>
<font color="#008b8b">+ taglib grew 8368 bytes (1.71%) (489415-&gt;497783)</font><br>
<font color="#008b8b">+ gtk-nodoka-engine grew 8948 bytes (9.32%) (96057-&gt;105005)</font><br>
<font color="#008b8b">+ nscd grew 9484 bytes (6.73%) (140911-&gt;150395)</font><br>

<font color="#008b8b">+ exempi grew 9692 bytes (1.39%) (698782-&gt;708474)</font><br>
<font color="#008b8b">+ gnome-menus grew 9841 bytes (1.57%) (626493-&gt;636334)</font><br>
<font color="#008b8b">+ dbus-glib grew 9970 bytes (2.10%) (473790-&gt;483760)</font><br>
<font color="#008b8b">+ libdhcp6client grew 10524 bytes (6.30%) (166956-&gt;177480)</font><br>
<font color="#008b8b">+ openldap grew 10658 bytes (1.76%) (604986-&gt;615644)</font><br>
<font color="#008b8b">+ nss_ldap grew 12224 bytes (2.17%) (562402-&gt;574626)</font><br>

<font color="#008b8b">+ dmidecode grew 14466 bytes (10.46%) (138266-&gt;152732)</font><br>
<font color="#008b8b">+ NetworkManager-vpnc grew 14477 bytes (4.58%) (316033-&gt;330510)</font><br>
<font color="#008b8b">+ system-config-rootpassword grew 14962 bytes (16.07%) (93118-&gt;108080)</font><br>
<font color="#008b8b">+ gstreamer-python grew 15266 bytes (1.64%) (933175-&gt;948441)</font><br>
<font color="#008b8b">+ rarian grew 15824 bytes (4.99%) (316947-&gt;332771)</font><br>
<font color="#008b8b">+ at-spi grew 16072 bytes (2.38%) (674624-&gt;690696)</font><br>

<font color="#008b8b">+ isomd5sum grew 17146 bytes (36.61%) (46840-&gt;63986)</font><br>
<font color="#008b8b">+ usbutils grew 17192 bytes (19.31%) (89044-&gt;106236)</font><br>
<font color="#008b8b">+ acl grew 17875 bytes (11.97%) (149393-&gt;167268)</font><br>
<font color="#008b8b">+ hicolor-icon-theme grew 17992 bytes (79.30%) (22688-&gt;40680)</font><br>
<font color="#008b8b">+ gnome-python2-desktop grew 18187 bytes (7.44%) (244527-&gt;262714)</font><br>
<font color="#008b8b">+ libdhcp grew 19318 bytes (14.23%) (135727-&gt;155045)</font><br>

<font color="#008b8b">+ which grew 20480 bytes (65.05%) (31485-&gt;51965)</font><br>
<font color="#008b8b">+ NetworkManager-gnome grew 20604 bytes (2.90%) (710665-&gt;731269)</font><br>
<font color="#008b8b">+ pam_krb5 grew 20943 bytes (8.06%) (259736-&gt;280679)</font><br>
<font color="#008b8b">+ system-config-language grew 21674 bytes (8.55%) (253576-&gt;275250)</font><br>
<font color="#008b8b">+ libxcb grew 22328 bytes (5.40%) (413804-&gt;436132)</font><br>
<font color="#008b8b">+ bluez-utils grew 22572 bytes (1.76%) (1280277-&gt;1302849)</font><br>

<font color="#008b8b">+ pygtksourceview grew 23100 bytes (36.06%) (64064-&gt;87164)</font><br>
<font color="#008b8b">+ libgpg-error grew 23525 bytes (12.14%) (193728-&gt;217253)</font><br>
<font color="#008b8b">+ glibmm24 grew 24411 bytes (5.25%) (465396-&gt;489807)</font><br>
<font color="#008b8b">+ fribidi grew 24912 bytes (17.19%) (144894-&gt;169806)</font><br>
<font color="#008b8b">+ gmime grew 24916 bytes (4.24%) (587824-&gt;612740)</font><br>
<font color="#008b8b">+ libuser grew 25215 bytes (1.56%) (1616562-&gt;1641777)</font><br>

<font color="#008b8b">+ httpd grew 28595 bytes (1.12%) (2551734-&gt;2580329)</font><br>
<font color="#008b8b">+ m17n-lib grew 30893 bytes (10.14%) (304750-&gt;335643)</font><br>
<font color="#008b8b">+ rhpl grew 31037 bytes (3.99%) (778235-&gt;809272)</font><br>
<font color="#008b8b">+ libdhcp4client grew 32772 bytes (6.57%) (499144-&gt;531916)</font><br>
<font color="#008b8b">+ bind-utils grew 33408 bytes (10.87%) (307362-&gt;340770)</font><br>
<font color="#008b8b">+ NetworkManager grew 33657 bytes (1.42%) (2377366-&gt;2411023)</font><br>

<font color="#008b8b">+ dbus-python grew 36266 bytes (5.11%) (710089-&gt;746355)</font><br>
<font color="#008b8b">+ gnome-mag grew 36431 bytes (7.21%) (504936-&gt;541367)</font><br>
<font color="#008b8b">+ libXpm grew 37746 bytes (52.09%) (72467-&gt;110213)</font><br>
<font color="#008b8b">+ libgnomekbd grew 38042 bytes (6.68%) (569521-&gt;607563)</font><br>
<font color="#008b8b">+ pm-utils grew 39200 bytes (117.36%) (33402-&gt;72602)</font><br>
<font color="#008b8b">+ nautilus-sendto grew 42489 bytes (16.21%) (262118-&gt;304607)</font><br>

<font color="#008b8b">+ dhclient grew 42699 bytes (8.59%) (497288-&gt;539987)</font><br>
<font color="#008b8b">+ gtksourceview2 grew 42895 bytes (2.00%) (2148753-&gt;2191648)</font><br>
<font color="#008b8b">+ krb5-libs grew 45052 bytes (2.96%) (1522532-&gt;1567584)</font><br>
<font color="#008b8b">+ system-config-printer grew 47675 bytes (5.03%) (948043-&gt;995718)</font><br>
<font color="#008b8b">+ gnutls grew 58282 bytes (5.99%) (972804-&gt;1031086)</font><br>
<font color="#008b8b">+ bluez-gnome grew 60576 bytes (22.56%) (268531-&gt;329107)</font><br>

<font color="#008b8b">+ mono-data grew 61605 bytes (1.21%) (5087435-&gt;5149040)</font><br>
<font color="#008b8b">+ libwnck grew 62234 bytes (5.42%) (1148126-&gt;1210360)</font><br>
<font color="#008b8b">+ gtk2-engines grew 63679 bytes (6.09%) (1045391-&gt;1109070)</font><br>
<font color="#008b8b">+ system-config-users grew 64047 bytes (4.40%) (1455495-&gt;1519542)</font><br>
<font color="#008b8b">+ gnokii grew 68723 bytes (4.36%) (1575916-&gt;1644639)</font><br>
<font color="#008b8b">+ rsync grew 73058 bytes (18.04%) (404896-&gt;477954)</font><br>

<font color="#008b8b">+ hal-info grew 75029 bytes (20.94%) (358305-&gt;433334)</font><br>
<font color="#008b8b">+ mesa-libGLU grew 77812 bytes (17.12%) (454428-&gt;532240)</font><br>
<font color="#008b8b">+ mdadm grew 83417 bytes (4.79%) (1743098-&gt;1826515)</font><br>
<font color="#008b8b">+ shared-mime-info grew 85852 bytes (9.51%) (902332-&gt;988184)</font><br>
<font color="#008b8b">+ compiz-gnome grew 87904 bytes (7.16%) (1227682-&gt;1315586)</font><br>
<font color="#008b8b">+ PolicyKit-gnome grew 89123 bytes (126.49%) (70457-&gt;159580)</font><br>

<font color="#008b8b">+ GConf2 grew 89585 bytes (1.68%) (5342705-&gt;5432290)</font><br>
<font color="#008b8b">+ dhcpv6-client grew 94965 bytes (54.70%) (173599-&gt;268564)</font><br>
<font color="#008b8b">+ system-config-firewall grew 103528 bytes (4.50%) (2300495-&gt;2404023)</font><br>
<font color="#008b8b">+ ntfs-3g grew 107185 bytes (36.31%) (295187-&gt;402372)</font><br>
<font color="#008b8b">+ f-spot grew 110065 bytes (1.44%) (7621883-&gt;7731948)</font><br>
<font color="#008b8b">+ PolicyKit grew 121200 bytes (71.93%) (168495-&gt;289695)</font><br>

<font color="#008b8b">+ gnupg grew 126829 bytes (2.62%) (4841029-&gt;4967858)</font><br>
<font color="#008b8b">+ libgcrypt grew 132376 bytes (38.24%) (346204-&gt;478580)</font><br>
<font color="#008b8b">+ libopenraw grew 136838 bytes (101.68%) (134583-&gt;271421)</font><br>
<font color="#008b8b">+ pykickstart grew 141694 bytes (17.92%) (790784-&gt;932478)</font><br>
<font color="#008b8b">+ gnome-python2-gnomevfs grew 142165 bytes (87.24%) (162958-&gt;305123)</font><br>
<font color="#008b8b">+ shadow-utils grew 144973 bytes (5.29%) (2739389-&gt;2884362)</font><br>

<font color="#008b8b">+ gnome-volume-manager grew 158480 bytes (7.38%) (2146417-&gt;2304897)</font><br>
<font color="#008b8b">+ vbetool grew 162208 bytes (139.43%) (116340-&gt;278548)</font><br>
<font color="#008b8b">+ openssl grew 166448 bytes (4.81%) (3459831-&gt;3626279)</font><br>
<font color="#008b8b">+ libselinux-python grew 171323 bytes (118.46%) (144622-&gt;315945)</font><br>
<font color="#008b8b">+ libsilc grew 180620 bytes (17.41%) (1037560-&gt;1218180)</font><br>
<font color="#008b8b">+ sound-juicer grew 182617 bytes (5.86%) (3114050-&gt;3296667)</font><br>

<font color="#008b8b">+ gnome-system-monitor grew 186353 bytes (3.55%) (5244840-&gt;5431193)</font><br>
<font color="#008b8b">+ gdb grew 193437 bytes (3.11%) (6228176-&gt;6421613)</font><br>
<font color="#008b8b">+ selinux-policy-devel grew 206105 bytes (3.72%) (5545358-&gt;5751463)</font><br>
<font color="#008b8b">+ evolution-data-server grew 208724 bytes (1.89%) (11029422-&gt;11238146)</font><br>
<font color="#008b8b">+ PyOpenGL grew 213779 bytes (4.86%) (4398157-&gt;4611936)</font><br>
<font color="#008b8b">+ tomboy grew 218900 bytes (3.63%) (6022535-&gt;6241435)</font><br>

<font color="#008b8b">+ parted grew 223507 bytes (15.16%) (1474368-&gt;1697875)</font><br>
<font color="#008b8b">+ orca grew 231344 bytes (4.05%) (5718621-&gt;5949965)</font><br>
<font color="#008b8b">+ util-linux-ng grew 245524 bytes (5.17%) (4749959-&gt;4995483)</font><br>
<font color="#008b8b">+ selinux-policy grew 268202 bytes (3.47%) (7731786-&gt;7999988)</font><br>
<font color="#008b8b">+ iso-codes grew 269192 bytes (4.80%) (5605136-&gt;5874328)</font><br>
<font color="#008b8b">+ system-config-date grew 282500 bytes (10.09%) (2798572-&gt;3081072)</font><br>

<font color="#008b8b">+ xorg-x11-drv-ati grew 285328 bytes (35.75%) (798151-&gt;1083479)</font><br>
<font color="#008b8b">+ eog grew 292326 bytes (7.82%) (3740424-&gt;4032750)</font><br>
<font color="#008b8b">+ dbus grew 299134 bytes (58.75%) (509123-&gt;808257)</font><br>
<font color="#008b8b">+ totem grew 321458 bytes (5.87%) (5476956-&gt;5798414)</font><br>
<font color="#008b8b">+ gnome-keyring grew 333541 bytes (32.87%) (1014819-&gt;1348360)</font><br>
<font color="#008b8b">+ glibc grew 347221 bytes (2.59%) (13402107-&gt;13749328)</font><br>

<font color="#008b8b">+ sqlite grew 358672 bytes (76.12%) (471170-&gt;829842)</font><br>
<font color="#008b8b">+ setroubleshoot-server grew 363273 bytes (22.18%) (1637732-&gt;2001005)</font><br>
<font color="#008b8b">+ bind-libs grew 389872 bytes (17.27%) (2258064-&gt;2647936)</font><br>
<font color="#008b8b">+ gcalctool grew 496578 bytes (10.21%) (4862745-&gt;5359323)</font><br>
<font color="#008b8b">+ gnome-panel grew 509960 bytes (4.35%) (11714901-&gt;12224861)</font><br>
<font color="#008b8b">+ ghostscript grew 534784 bytes (1.87%) (28646835-&gt;29181619)</font><br>

<font color="#008b8b">+ rhythmbox grew 678314 bytes (6.41%) (10582223-&gt;11260537)</font><br>
<font color="#008b8b">+ mono-core grew 686301 bytes (2.01%) (34154946-&gt;34841247)</font><br>
<font color="#008b8b">+ nautilus grew 693197 bytes (5.04%) (13751211-&gt;14444408)</font><br>
<font color="#008b8b">+ mono-winforms grew 729754 bytes (7.47%) (9765822-&gt;10495576)</font><br>
<font color="#008b8b">+ totem-mozplugin grew 770229 bytes (136.17%) (565632-&gt;1335861)</font><br>
<font color="#008b8b">+ mono-web grew 797665 bytes (9.85%) (8097242-&gt;8894907)</font><br>

<font color="#008b8b">+ glib2 grew 849381 bytes (29.07%) (2922173-&gt;3771554)</font><br>
<font color="#008b8b">+ gnome-power-manager grew 934030 bytes (8.33%) (11214535-&gt;12148565)</font><br>
<font color="#008b8b">+ nss grew 937664 bytes (44.33%) (2114975-&gt;3052639)</font><br>
<font color="#008b8b">+ libsmbclient grew 1191360 bytes (50.53%) (2357736-&gt;3549096)</font><br>
<font color="#008b8b">+ gnome-games grew 1373569 bytes (4.65%) (29510057-&gt;30883626)</font><br>
<font color="#008b8b">+ kernel grew 2170562 bytes (4.60%) (47161413-&gt;49331975)</font><br>

<font color="#008b8b">+ anaconda grew 2566351 bytes (17.76%) (14448198-&gt;17014549)</font><br>
<font color="#6a5acd">- krb5-auth-dialog shrunk 1 bytes (53674-&gt;53673)</font><br>
<font color="#6a5acd">- libtirpc shrunk 1 bytes (150301-&gt;150300)</font><br>
<font color="#6a5acd">- gmime-sharp shrunk 6 bytes (197336-&gt;197330)</font><br>
<font color="#6a5acd">- gzip shrunk 6 bytes (219689-&gt;219683)</font><br>
<font color="#6a5acd">- gedit shrunk 8 bytes (13487572-&gt;13487564)</font><br>

<font color="#6a5acd">- readline shrunk 8 bytes (350214-&gt;350206)</font><br>
<font color="#6a5acd">- system-config-network shrunk 8 bytes (1905298-&gt;1905290)</font><br>
<font color="#6a5acd">- perl shrunk 14 bytes (31645884-&gt;31645870)</font><br>
<font color="#6a5acd">- ntsysv shrunk 16 bytes (22156-&gt;22140)</font><br>
<font color="#6a5acd">- xdg-utils shrunk 18 bytes (176553-&gt;176535)</font><br>
<font color="#6a5acd">- python-pyblock shrunk 22 bytes (175969-&gt;175947)</font><br>

<font color="#6a5acd">- pavucontrol shrunk 23 bytes (169857-&gt;169834)</font><br>
<font color="#6a5acd">- logrotate shrunk 32 bytes (77454-&gt;77422)</font><br>
<font color="#6a5acd">- libXfont shrunk 32 bytes (456948-&gt;456916)</font><br>
<font color="#6a5acd">- gnome-python2-canvas shrunk 32 bytes (48902-&gt;48870)</font><br>
<font color="#6a5acd">- xorg-x11-drv-vmmouse shrunk 32 bytes (16364-&gt;16332)</font><br>
<font color="#6a5acd">- mono-data-sqlite shrunk 33 bytes (457296-&gt;457263)</font><br>

<font color="#6a5acd">- gnome-pilot shrunk 36 bytes (1930958-&gt;1930922)</font><br>
<font color="#6a5acd">- libflashsupport shrunk 40 bytes (11044-&gt;11004)</font><br>
<font color="#6a5acd">- nautilus-extensions shrunk 48 bytes (31308-&gt;31260)</font><br>
<font color="#6a5acd">- pulseaudio-utils shrunk 56 bytes (234499-&gt;234443)</font><br>
<font color="#6a5acd">- libselinux shrunk 61 bytes (148311-&gt;148250)</font><br>
<font color="#6a5acd">- gimp shrunk 64 bytes (38423455-&gt;38423391)</font><br>

<font color="#6a5acd">- libXrender shrunk 64 bytes (47254-&gt;47190)</font><br>
<font color="#6a5acd">- paps shrunk 64 bytes (51462-&gt;51398)</font><br>
<font color="#6a5acd">- libxkbfile shrunk 96 bytes (146358-&gt;146262)</font><br>
<font color="#6a5acd">- librsvg2 shrunk 120 bytes (337750-&gt;337630)</font><br>
<font color="#6a5acd">- pulseaudio-libs shrunk 128 bytes (343843-&gt;343715)</font><br>
<font color="#6a5acd">- isdn4k-utils shrunk 144 bytes (9789025-&gt;9788881)</font><br>

<font color="#6a5acd">- less shrunk 171 bytes (176124-&gt;175953)</font><br>
<font color="#6a5acd">- pulseaudio shrunk 192 bytes (926686-&gt;926494)</font><br>
<font color="#6a5acd">- xorg-x11-drv-keyboard shrunk 256 bytes (26608-&gt;26352)</font><br>
<font color="#6a5acd">- anacron shrunk 274 bytes (56515-&gt;56241)</font><br>
<font color="#6a5acd">- libgtop2 shrunk 320 bytes (341012-&gt;340692)</font><br>
<font color="#6a5acd">- xorg-x11-drv-cirrus shrunk 355 bytes (77986-&gt;77631)</font><br>

<font color="#6a5acd">- gtkspell shrunk 400 bytes (56779-&gt;56379)</font><br>
<font color="#6a5acd">- pulseaudio-core-libs shrunk 416 bytes (439696-&gt;439280)</font><br>
<font color="#6a5acd">- liberation-fonts shrunk 444 bytes (1865074-&gt;1864630)</font><br>
<font color="#6a5acd">- libpcap shrunk 485 bytes (261897-&gt;261412)</font><br>
<font color="#6a5acd">- nspluginwrapper shrunk 509 bytes (311525-&gt;311016)</font><br>
<font color="#6a5acd">- acpid shrunk 542 bytes (61235-&gt;60693)</font><br>

<font color="#6a5acd">- udev shrunk 601 bytes (654430-&gt;653829)</font><br>
<font color="#6a5acd">- setroubleshoot-plugins shrunk 689 bytes (2422617-&gt;2421928)</font><br>
<font color="#6a5acd">- python-numeric shrunk 1040 bytes (1722779-&gt;1721739)</font><br>
<font color="#6a5acd">- file-libs shrunk 1181 bytes (1669772-&gt;1668591)</font><br>
<font color="#6a5acd">- xorg-x11-drv-vesa shrunk 1208 bytes (26099-&gt;24891)</font><br>
<font color="#6a5acd">- system-config-keyboard shrunk 1259 bytes (182829-&gt;181570)</font><br>

<font color="#6a5acd">- fedora-release shrunk 1450 bytes (46680-&gt;45230)</font><br>
<font color="#6a5acd">- gnome-spell shrunk 1568 bytes (377889-&gt;376321)</font><br>
<font color="#6a5acd">- gparted shrunk 1600 bytes (1569813-&gt;1568213)</font><br>
<font color="#6a5acd">- nspr shrunk 1856 bytes (248628-&gt;246772)</font><br>
<font color="#6a5acd">- dvd+rw-tools shrunk 1860 bytes (283930-&gt;282070)</font><br>
<font color="#6a5acd">- libdrm shrunk 1878 bytes (39456-&gt;37578)</font><br>

<font color="#6a5acd">- at shrunk 1892 bytes (83059-&gt;81167)</font><br>
<font color="#6a5acd">- synaptics shrunk 2072 bytes (113498-&gt;111426)</font><br>
<font color="#6a5acd">- m17n-contrib-hindi shrunk 2162 bytes (16757-&gt;14595)</font><br>
<font color="#6a5acd">- pango shrunk 3747 bytes (862572-&gt;858825)</font><br>
<font color="#6a5acd">- system-config-services shrunk 3768 bytes (561578-&gt;557810)</font><br>
<font color="#6a5acd">- libcdio shrunk 3961 bytes (555394-&gt;551433)</font><br>

<font color="#6a5acd">- audit-libs shrunk 4096 bytes (130447-&gt;126351)</font><br>
<font color="#6a5acd">- atmel-firmware shrunk 4458 bytes (732612-&gt;728154)</font><br>
<font color="#6a5acd">- fontconfig shrunk 4805 bytes (374336-&gt;369531)</font><br>
<font color="#6a5acd">- checkpolicy shrunk 6752 bytes (510825-&gt;504073)</font><br>
<font color="#6a5acd">- ppp shrunk 8123 bytes (841674-&gt;833551)</font><br>
<font color="#6a5acd">- ntp shrunk 8426 bytes (2652615-&gt;2644189)</font><br>

<font color="#6a5acd">- procps shrunk 11625 bytes (374451-&gt;362826)</font><br>
<font color="#6a5acd">- iproute shrunk 11660 bytes (2152986-&gt;2141326)</font><br>
<font color="#6a5acd">- gnome-bluetooth shrunk 12179 bytes (545675-&gt;533496)</font><br>
<font color="#6a5acd">- smolt shrunk 13811 bytes (635219-&gt;621408)</font><br>
<font color="#6a5acd">- b43-fwcutter shrunk 17375 bytes (37123-&gt;19748)</font><br>
<font color="#6a5acd">- im-chooser shrunk 19198 bytes (208789-&gt;189591)</font><br>

<font color="#6a5acd">- evolution shrunk 30364 bytes (38160208-&gt;38129844)</font><br>
<font color="#6a5acd">- ntfsprogs shrunk 33559 bytes (1148797-&gt;1115238)</font><br>
<font color="#6a5acd">- zip shrunk 33692 bytes (302492-&gt;268800)</font><br>
<font color="#6a5acd">- vixie-cron shrunk 46771 bytes (673502-&gt;626731)</font><br>
<font color="#6a5acd">- compiz shrunk 57822 bytes (1846352-&gt;1788530)</font><br>
<font color="#6a5acd">- cups shrunk 73290 bytes (10355510-&gt;10282220)</font><br>

<font color="#6a5acd">- system-config-printer-libs shrunk 88138 bytes (2438676-&gt;2350538)</font><br>
<font color="#6a5acd">- eel2 shrunk 90562 bytes (848996-&gt;758434)</font><br>
<font color="#6a5acd">- yelp shrunk 99732 bytes (2559882-&gt;2460150)</font><br>
<font color="#6a5acd">- xorg-x11-drv-i810 shrunk 249946 bytes (655965-&gt;406019)</font><br>
<font color="#6a5acd">- gtk2 shrunk 308952 bytes (20696815-&gt;20387863)</font><br>
<font color="#6a5acd">- fedora-release-notes shrunk 329470 bytes (12271152-&gt;11941682)</font><br>

<font color="#6a5acd">- firstboot shrunk 356968 bytes (783521-&gt;426553)</font><br>
<font color="#6a5acd">- cairo shrunk 423604 bytes (1623706-&gt;1200102)</font><br>
<font color="#6a5acd">- control-center shrunk 492635 bytes (8945618-&gt;8452983)</font><br>
<font color="#6a5acd">- gnome-media shrunk 782217 bytes (4946507-&gt;4164290)</font><br>
<font color="#6a5acd">- e2fsprogs shrunk 904410 bytes (2366733-&gt;1462323)</font><br>
<font color="#6a5acd">- device-mapper shrunk 917957 bytes (1027430-&gt;109473)</font><br>

<font color="#6a5acd">- gnome-themes shrunk 1007647 bytes (4994173-&gt;3986526)</font><br>
<font color="#6a5acd">- xkeyboard-config shrunk 1188506 bytes (3043679-&gt;1855173)</font><br>
<font color="#6a5acd">- lvm2 shrunk 1386888 bytes (2186994-&gt;800106)</font><br>
<font color="#6a5acd">- xorg-x11-server-Xorg shrunk 1410978 bytes (7431876-&gt;6020898)</font><br>
<font color="#6a5acd">- hwdata shrunk 1768168 bytes (2833960-&gt;1065792)</font><br>
<font color="#6a5acd">- python shrunk 1870258 bytes (18499208-&gt;16628950)</font><br>

<font color="#6a5acd">- xorg-x11-fonts-Type1 shrunk 1919814 bytes (2803806-&gt;883992)</font><br>
<font color="#6a5acd">- ncurses shrunk 2311863 bytes (2562051-&gt;250188)</font><br>
<font color="#6a5acd">- selinux-policy-targeted shrunk 3623635 bytes (27306881-&gt;23683246)</font><br>
<font color="#6a5acd">- gdm shrunk 6450348 bytes (14040436-&gt;7590088)</font><br>
<font color="#6a5acd">- gnome-applets shrunk 8005406 bytes (26478262-&gt;18472856)</font><br>
<font color="#6a5acd">- firefox shrunk 39666395 bytes (42009290-&gt;2342895)</font><br>

<font color="#6a5acd">- removed package fonts-gujarati: 0</font><br>
<font color="#6a5acd">- removed package fonts-korean: 0</font><br>
<font color="#6a5acd">- removed package scim-lang-kannada: 0</font><br>
<font color="#6a5acd">- removed package fonts-arabic: 0</font><br>
<font color="#6a5acd">- removed package fonts-punjabi: 0</font><br>
<font color="#6a5acd">- removed package fonts-oriya: 0</font><br>
<font color="#6a5acd">- removed package fonts-chinese: 0</font><br>
<font color="#6a5acd">- removed package scim-lang-tibetan: 0</font><br>
<font color="#6a5acd">- removed package fonts-kannada: 0</font><br>

<font color="#6a5acd">- removed package fonts-bengali: 0</font><br>
<font color="#6a5acd">- removed package fonts-hebrew: 0</font><br>
<font color="#6a5acd">- removed package fonts-hindi: 0</font><br>
<font color="#6a5acd">- removed package scim-lang-assamese: 0</font><br>
<font color="#6a5acd">- removed package fonts-sinhala: 0</font><br>
<font color="#6a5acd">- removed package scim-lang-sinhalese: 0</font><br>
<font color="#6a5acd">- removed package fonts-tamil: 0</font><br>
<font color="#6a5acd">- removed package fonts-telugu: 0</font><br>
<font color="#6a5acd">- removed package fonts-malayalam: 0</font><br>

<font color="#6a5acd">- removed package m17n-contrib-urdu: 3608</font><br>
<font color="#6a5acd">- removed package m17n-db-assamese: 6079</font><br>
<font color="#6a5acd">- removed package m17n-db-kannada: 7749</font><br>
<font color="#6a5acd">- removed package m17n-contrib-kannada: 8717</font><br>
<font color="#6a5acd">- removed package m17n-contrib-sinhala: 11327</font><br>
<font color="#6a5acd">- removed package m17n-contrib-assamese: 12581</font><br>
<font color="#6a5acd">- removed package m17n-db-sinhala: 14228</font><br>
<font color="#6a5acd">- removed package m17n-db-tibetan: 15214</font><br>
<font color="#6a5acd">- removed package xorg-x11-drv-ark: 18888</font><br>

<font color="#6a5acd">- removed package xorg-x11-drv-tseng: 52907</font><br>
<font color="#6a5acd">- removed package xorg-x11-drv-s3: 58401</font><br>
<font color="#6a5acd">- removed package scim-sinhala: 66881</font><br>
<font color="#6a5acd">- removed package totem-plparser: 70428</font><br>
<font color="#6a5acd">- removed package libbeagle: 94156</font><br>
<font color="#6a5acd">- removed package xorg-x11-drv-avivo: 107204</font><br>
<font color="#6a5acd">- removed package xorg-x11-drv-chips: 154533</font><br>
<font color="#6a5acd">- removed package lohit-fonts-kannada: 210687</font><br>
<font color="#6a5acd">- removed package fuse: 216231</font><br>

<font color="#6a5acd">- removed package beecrypt: 242015</font><br>
<font color="#6a5acd">- removed package lklug-fonts: 333507</font><br>
<font color="#6a5acd">- removed package xorg-x11-drv-via: 363192</font><br>
<font color="#6a5acd">- removed package xorg-x11-fonts-ethiopic: 437981</font><br>
<font color="#6a5acd">- removed package SDL: 495206</font><br>
<font color="#6a5acd">- removed package curl: 514238</font><br>
<font color="#6a5acd">- removed package firstboot-tui: 653472</font><br>
<font color="#6a5acd">- removed package xorg-x11-fonts-truetype: 909077</font><br>
<font color="#6a5acd">- removed package db4o: 1414265</font><br>

<font color="#6a5acd">- removed package jomolhari-fonts: 2293163</font><br>
<font color="#6a5acd">- removed package pwlib: 2423701</font><br>
<font color="#6a5acd">- removed package evince: 3452782</font><br>
<font color="#6a5acd">- removed package aspell-en: 3567971</font><br>
<font color="#6a5acd">- removed package tibetan-machine-uni-fonts: 4529886</font><br>
<font color="#6a5acd">- removed package dejavu-lgc-fonts: 6293390</font><br>
<font color="#6a5acd">- removed package opal: 10988583</font><br>
<font color="#6a5acd">- removed package ekiga: 13323689</font><br>
old has 896 packages<br>

new has 885 packages<br>
</font>
</blockquote></code>
</p>

]]></description>
   <category domain="http://lewk.org/blog"></category>
   <pubDate>Tue, 05 Feb 2008 13:23 GMT</pubDate>
</item>
<item>
   <title>FUDCon</title>
   <guid isPermaLink="false">FUDCon2008</guid>
   <link>http://lewk.org/blog/FUDCon2008.html</link>
   <description><![CDATA[
<p>
So <a href="http://fedoraproject.org/wiki/FUDCon">FUDCon</a> happened over the weekend in Raleigh, North Carolina.  It was a great chance to meet a bunch of new people, catch up with some old friends, and kick around in the south for a bit.
  I was amazed to see such a huge turnout for the first day of the hackfest.  It was nice to see a ton of new contributors looking to dive in head first into projects.  My goal for the day was to hack on the <a href="http://fedoraproject.org/wiki/MyFedora">MyFedora</a> framework, and solidify our architecture and base widget classes, making it easy to create and display your own widgets.  It's probably safe to say that we exceeded those expectations.
</p>
<p>
I sat down with J5, Toshio, and Douglas Warner, fired up a Gobby instance, and started hacking.  Thanks to the wonders of distributed source control (git!), TurboGears, and Gobby, we were all able to simultaneously run, commit, and hack on the code.  The result of our days work turns out to be a pretty solid architecture for writing, configuring, and displaying reusable Python widgets (based on <a href="http://toscawidgets.org">ToscaWidgets</a>) that can pull from various data sources.  For example, writing a widget to display the latest entries in an RSS feed couldn't really be much easier:
</p>
<blockquote><code>
<font color="#a52a2a"><b>class</b></font>&nbsp;<font color="#008b8b">FedoraPeopleWidget</font>(RSSWidget):<br>
&nbsp;&nbsp;&nbsp;&nbsp;url = '<font color="#ff00ff"><a href="http://planet.fedoraproject.org/rss20.xml">http://planet.fedoraproject.org/rss20.xml</a></font>'<br>
&nbsp;&nbsp;&nbsp;&nbsp;title = '<font color="#ff00ff">Fedora People</font>'<br>
</code></blockquote>
<p>
The next day during the MyFedora session we got a chance to show off some of the work we did, and get some more ideas from various types of contributors.

This project has the potential to make a lot of peoples lives easier, so if you're interested in helping out, grab the code and dive in:
<code>$ git clone git://git.fedorahosted.org/git/myfedora.git</code>
</p>
<p>
Toshio and I gave a session on TurboGears, which seemed to go pretty well.  Lots of good discussion and code examples.  You can checkout the slides for my presentation here: <a href="http://tg.lewk.org">http://tg.lewk.org</a>.
</p>
<p>
I was going to be giving a session on <a href="http://fedorahosted.org/bodhi">bodhi</a>, which we eventually merged with the TurboGears talk.  However, the TG session went a lot longer than expected, and bodhi never emerged.  So, for those who were interested, you can find my bodhi slides <a href="http://lmacken.fedorapeople.org/bodhi.odp">here</a>, and some <a href="http://lmacken.fedorapeople.org/bodhi-FUDCon2007/">transcripts</a> from our last virtual fudcon.
</p>
<p>
The <a href="http://packagekit.org">PackageKit</a> session went well too.  People definitely were interested, and also had some interesting ideas.
</p>
<p>
Saturday night was FUDPub, where we had the back room of the Flying Saucer all to ourselves.  People kept feeding me drinks, and I didn't complain.  Good times :)
</p>
<p>
Sunday was the second day of the hackfests.  I decided to context-switch a bit and get my <a href="http://fedorahosted.org/func">func</a> on.  I wrote a <a href="https://fedorahosted.org/func/changeset/8c4a154f196383f6d0969934e10641e83ac51af4">patch</a> that adds a "mem" method to the ProcessModule that returns per-program memory usage from your minion in the format of <code>[[Private, Shared, Total RAM used, Program], ...]</code>.  This allows you to do something like,

<blockquote><code>
[lmacken@crow ~]$ sudo func "*" call process mem<br/>
on https://tomservo:51234 running process mem ()<br/>
[['16.8 MiB', '6.5 MiB', '23.4 MiB', 'Xorg'],<br/>
&nbsp;['21.7 MiB', '8.3 MiB', '30.1 MiB', 'tomboy'],<br/>
&nbsp;['33.6 MiB', '2.3 MiB', '35.9 MiB', 'ssh (5)'],<br/>
&nbsp;['23.2 MiB', '14.3 MiB', '37.5 MiB', 'deskbar-applet'],<br/>
&nbsp;['139.9 MiB', '9.9 MiB', '149.8 MiB', 'firefox-bin']]
</code></blockquote>
</p>
<p>
I also discussed a potential TurboGears <a href="https://fedorahosted.org/func/wiki/FuncWebNotes">FuncWeb</a> implementation with Michael DeHaan.  I got a chance to create create a skeleton project, and jot some ideas down.  Just as I was about to dive in, I got a phone call notifying me of my flight cancellation.  I then had to immediately sketch off to catch a 2:20pm flight and head back to Boston.
</p>
<p>
Last night I got a little bit A.D.D. and <a href="https://fedorahosted.org/func/changeset/23c9c26d270ff766133e7aeebffc99a35633ef41">re-wrote</a> <a href="https://fedorahosted.org/func/changeset/79d75b06a1bdae8c5c42026de606ed1787be6030">some</a> <a href="https://fedorahosted.org/func/changeset/a433b0073efcbeb2028dceed5105cc40f5936ddf">chunks</a> of the func minion module_loader/server to make <a href="https://fedorahosted.org/func/wiki/HowToWriteAndDistributeNewModules">writing func modules</a> a lot easier.
</p>
<p>
So, the moral of the story is: <b>FUDCon rocks</b>.  Feeding large quantities of geeks caffeine, beer, and barbeque can result in amazing things.
</p>
<p>
Of course there are no ups without downs, so I was stuck dealing with a nasty cold most of the time there, and my laptop power adapter melted as well.  Thankfully, both of those issue have since been resolved  :)</p>

]]></description>
   <category domain="http://lewk.org/blog"></category>
   <pubDate>Wed, 16 Jan 2008 17:21 GMT</pubDate>
</item>
<item>
   <title>TurboFlot 0.0.1</title>
   <guid isPermaLink="false">TurboFlot</guid>
   <link>http://lewk.org/blog/TurboFlot.html</link>
   <description><![CDATA[
<p>
In an effort to clean up bodhi's metrics code a bit, I wrote a <a href="http://pypi.python.org/pypi/TurboFlot">TurboFlot</a> plugin that allows you to wield the jQuery plugin <a href="http://code.google.com/p/flot/">flot</a> inside of TurboGears applications.  The code is quite trivial -- it's essentially just a TurboGears JSON proxy to the jQuery flot plugin.  Breaking this code out into it's own widget makes it really easy to generate shiny graphs in a Pythonic fashon, without having to write a line of javascript.
</p>

<center><img src="http://lewk.org/img/TurboFlot.png"/></center>

<p>
Check out the <a href="http://hg.lewk.org/TurboFlot/raw-file/c4d33e5072a0/README">README</a> to see the code for the example above.
</p>

<p>
To use TurboFlot in your own application, you just pass your data and graph options to the widget, and then throw it up to your template.  Read the <a href="http://flot.googlecode.com/svn/trunk/API.txt">flot API documentation</a> for details on all of the arguments.  Here is a simple usage example:

<blockquote>
<code>
flot = TurboFlot([<br>
&nbsp;&nbsp;&nbsp;&nbsp;{<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'<font color="#ff00ff">data</font>'&nbsp;&nbsp;: [[0, 3], [4, 8], [8, 5], [9, 13]],<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'<font color="#ff00ff">lines</font>'&nbsp;: { '<font color="#ff00ff">show</font>'&nbsp;: True, '<font color="#ff00ff">fill</font>'&nbsp;: True&nbsp;}<br>
&nbsp;&nbsp;&nbsp;&nbsp;}],<br>
&nbsp;&nbsp;&nbsp;&nbsp;{<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'<font color="#ff00ff">grid</font>'&nbsp;&nbsp;: { '<font color="#ff00ff">backgroundColor</font>'&nbsp;: '<font color="#ff00ff">#fffaff</font>'&nbsp;},<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'<font color="#ff00ff">yaxis</font>'&nbsp;: { '<font color="#ff00ff">max</font>'&nbsp;: '<font color="#ff00ff">850</font>'&nbsp;}<br>
&nbsp;&nbsp;&nbsp;&nbsp;}<br>
)<br>
</code>
</blockquote>

Then, to display the widget in your template, you simply use:
<blockquote>
<code>
${flot.display()}
</code>
</blockquote>
</p>

The code for the widget itself is pretty simple.  It just takes your data and graph options, encodes them as JSON and tosses them at flot.

<blockquote><code>
<font color="#a52a2a"><b>class</b></font>&nbsp;<font color="#008b8b">TurboFlot</font>(Widget):<br>
&nbsp;&nbsp;&nbsp;&nbsp;&quot;&quot;&quot;<br>
<font color="#ff00ff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;A TurboGears Flot Widget.</font><br>
<font color="#ff00ff">&nbsp;&nbsp;&nbsp;&nbsp;</font>&quot;&quot;&quot;<br>
&nbsp;&nbsp;&nbsp;&nbsp;template = &quot;&quot;&quot;<br>
<font color="#ff00ff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;div xmlns:py=&quot;<a href="http://purl.org/kid/ns#">http://purl.org/kid/ns#</a>&quot; id=&quot;turboflot&quot; </font><br>
<font color="#ff00ff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; style=&quot;width:${width};height:${height};&quot;&gt;</font><br>
<font color="#ff00ff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;script&gt;</font><br>
<font color="#ff00ff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$.plot($(&quot;#turboflot&quot;), ${data}, ${options});</font><br>
<font color="#ff00ff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/script&gt;</font><br>
<font color="#ff00ff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/div&gt;</font><br>
<font color="#ff00ff">&nbsp;&nbsp;&nbsp;&nbsp;</font>&quot;&quot;&quot;<br>
&nbsp;&nbsp;&nbsp;&nbsp;params = [&quot;<font color="#ff00ff">data</font>&quot;, &quot;<font color="#ff00ff">options</font>&quot;, &quot;<font color="#ff00ff">height</font>&quot;, &quot;<font color="#ff00ff">width</font>&quot;]<br>
&nbsp;&nbsp;&nbsp;&nbsp;javascript = [JSLink('<font color="#ff00ff">turboflot</font>', '<font color="#ff00ff">excanvas.js</font>'),<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;JSLink(&quot;<font color="#ff00ff">turboflot</font>&quot;, &quot;<font color="#ff00ff">jquery.js</font>&quot;),<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;JSLink(&quot;<font color="#ff00ff">turboflot</font>&quot;, &quot;<font color="#ff00ff">jquery.flot.js</font>&quot;)]<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;<font color="#a52a2a"><b>def</b></font>&nbsp;<font color="#008b8b">__init__</font>(self, data, options={}, height=&quot;<font color="#ff00ff">300px</font>&quot;, width=&quot;<font color="#ff00ff">600px</font>&quot;):<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.data = simplejson.dumps(data)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.options = simplejson.dumps(options)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.height = height<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.width = width<br>
</code>
</blockquote>

<p>
You can download the latest releases from the Python Package Index:
<blockquote><a href="http://pypi.python.org/pypi/TurboFlot"> http://pypi.python.org/pypi/TurboFlot</a>
</blockquote>

Or you can grab my latest development tree out of mercurial:
<blockquote><a href="http://hg.lewk.org/TurboFlot">http://hg.lewk.org/TurboFlot</a>
</blockquote>
As always, patches are welcome :)
</p>

]]></description>
   <category domain="http://lewk.org/blog"></category>
   <pubDate>Wed, 19 Dec 2007 20:21 GMT</pubDate>
</item>
</channel>
</rss>
