Sat, 17 May 2008
liveusb-creator v2.4
Last night I released v2.4 of the liveusb-creator, which fixes a bunch of bugs and is much more robust.
Someone wrote a pretty cool article about the liveusb-creator on Lifehacker the other day, which made it to the front page of digg last night. Digg it up!
posted at: 10:10 | link | | 2 comments
Wed, 30 Apr 2008
Fedora LiveUSB Creator v2.0!
The liveusb-creator 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:
- 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
- Supports downloading various Fedora releases, including Fedora 9!
- SHA1 checksum verification of known releases, to ensure that you've downloaded the correct bits
- Face-melting hotness
Windows binary: liveusb-creator-2.3.zip (8.8mb)
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 tools available for creating persistent LiveUSB keys with Fedora.
If you would like to help contribute to the liveusb-creator, see the Developers Guide for more information. If you encounter problems with the tool, please file bug reports here.
For those interested in trying out this program, but don't have a USB stick, you can buy one here.
posted at: 20:52 | link | | 6 comments
Mon, 07 Apr 2008
ThinkPad X300 vs Z61t vs T43
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 :)
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 hardinfo, and disk benchmarks done with bonnie++. Graphs created with flot.
More benchmarks comparing various Fedora releases / configurations coming soon!
posted at: 15:13 | link | | 2 comments
Mon, 24 Mar 2008
PyCon 2008
I was in Chicago last week for PyCon 2008. 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.
Day 1: Tutorials
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.
Sessions
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 here. Everything was
video taped as well, so the sessions should be making their way on to YouTube
hopefully at some point soon.
Here are some things that caught my attention while I was there.
WSGI
Defined by Phillip J. Eby in PEP-333, 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:
def wsgi_app(environ, start_response):
start_response('200 OK', [('content-type', 'text/html')])
return ['Hello world!']
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 here.
virtualenv
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 Zed's easy_fucking_uninstall
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.
$ easy_install virtualenv
$ virtualenv --no-site-packages foo
$ cd foo; source bin/activate
$ easy_install <shiny python programs>
nose
I've been in love with nose since day
one, but realized that I haven't been utilizing it to it's fullest abilities.
I blogged in the past about nose's
profiler plugin. Come to find out, nose offers a lot more plugins that can
seriously help make your life easier:
$ nosetests --pdb --pdb-failures
.............................................................> /home/lmacken/tg1.1/turbogears/turbogears/identity/tests/test_visit.py(92)test_cookie_permanent()
-> assert abs(should_expire - expires) < 3
(Pdb) locals()
{'morsel': <Morsel: tg-visit='452c94de3900fc2adff2cd6b0b0f04c4533e3e9e'>, 'self': <turbogears.identity.tests.test_visit.TestVisit testMethod=test_cookie_permanent>, 'expires': 1206228604.0, 'should_expire': 1206232205.0, 'permanent': False}
(Pdb)
You can also measure code coverage during your unit test execution using the '--with-coverage' option, which utilizes coverage.py.
SQLAlchemy
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 declarative
API 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).
from sqlalchemy.ext.declarative import declarative_base
engine = create_engine('sqlite://')
Base = declarative_base(engine)
class SomeClass(Base):
__tablename__ = 'some_table'
id = Column('id', Integer, primary_key=True)
name = Column('name', String(50))
Unicode, demystified.
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 his slides for more details, but
the general idea here is to follow these three rules:
- decode early
- unicode everywhere
- encode late
def to_unicode_or_bust(obj, encoding='utf-8'):
if isinstance(obj, basestring):
if not isinstance(obj, unicode):
obj = unicode(obj, encoding)
return obj
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.
Grassyknoll
After the code sprints, I got a chance to see these guys show off their hard
work. grassyknoll 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.
Packaging BOF
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 Python wiki. 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 :)
Orbited
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:
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 :)
Code SprintsI stayed the entire time for the code sprints, and mainly focused on TurboGears hacking. This is what I ended up working on:
- Added SQLAlchemy support to turbogears.testutil.DBTest (Ticket #1764). 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.
- Added a FlotWidget using ToscaWidgets to twTools This widget allows you to create attractive graphs with ease.
- Made the TurboGears2 templating engine configurable (Ticket #1680). Things were hardcoded to use genshi; this is no longer the case.
- WebTest integration for unit test (Ticket #1762). I wrote a some high level unit testing classes that wrap a WebTest 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 WebOb 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 I mentioned on the TurboGears-trunk list, these changes will make writing unit tests a breeze:
class TestPages(testutil.DBWebTest):
def test_forbidden(self):
self.app.get('/hot_action', status=403)
def test_webob_response(self):
user = User(user_name=u"test", password=u"test")
self.login_user(user)
res = self.app.get('/hot_action')
assert "Hot WSGI action" in res
assert res.namespace['tg_flash'] == u'Hot WSGI action'
The WebTest integration is planned to hit in the TurboGears 1.1 release, deprecating testutils.{call,create_request}.
Want to read more blog posts about PyCon 2008? You can find links to lots of PyCon related posts here and on Planet Python.
posted at: 17:05 | link | | 1 comments
Wed, 05 Mar 2008
Speed up Windows with... encryption !!?!
I was listening to the Security Now! podcast yesterday, where Steve Gibson talked about the latest release of TrueCrypt. 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.
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 significantly *FASTER* when fully-encrypted with TrueCrypt, than without.
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.
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.
posted at: 10:46 | link | | 2 comments
Wed, 20 Feb 2008
gobby.fedoraproject.org
A dedicated Gobby session is now
running on gobby.fedoraproject.org !
*UPDATE*: To address some initial security concerns, I've locked down
this instance to Fedora contributors only. The password can be found in
~lmacken/gobby on fedorapeople.org (via ssh)
Yes, this raises the bar a little bit, but more of a reason to get a Fedora account ;)
What is Gobby, you ask?
"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."
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.
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 gitweb. Regardless, you should still save anything that you expect to keep locally.
posted at: 19:54 | link | | 9 comments
Mon, 11 Feb 2008
Creating live Fedora USB sticks, in Windows!
Last weekend I sat down and developed the liveusb-creator, 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:
- Get Fedora Live Media.
- Download and extract liveusb-creator.zip
- Drag your Fedora Live media into the liveusb-creator directory
- Double click 'liveusb-creator.exe'
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 announcing this tool, I started throwing together a graphical interface using PyGTK. While I was doing this, Kushal Das 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 ;)
So, detecting removable devices and such is *trivial* 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 code 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 USBHowTo for creating a live USB stick using the livecd-iso-to-disk tool.
If you're interested in helping out with the liveusb-creator, you can get ahold of the source code using git:
If you encounter any problems, please create a new ticket at the liveusb-creator trac.
git clone git://git.fedorahosted.org/git/liveusb-creator.git
posted at: 08:38 | link | | 17 comments
Tue, 05 Feb 2008
F8 -> F9 Alpha Live Diff
Fedora 9 Alpha is scheduled 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.
- F9-Alpha-Developer-20080129.0.diff
- F9-Alpha-FEL-i686-20080129.0.diff
- F9-Alpha-games-i686-20080129.0.diff
- F9-Alpha-i686-20080129.0.diff
- F9-Alpha-KDE-i686-20080129.0.diff
- F9-Alpha-KDE-x86_64-20080129.0.diff
- F9-Alpha-x86_64-20080129.0.diff
--- F8-Live-i686-20080204.0.iso (694M)
+++ F9-Alpha-i686-20080129.0.iso (698M)
+ new package libgdiplus-devel: 8584
+ new package xorg-x11-server-common: 38863
+ new package PolicyKit-gnome-libs: 40188
+ new package kerneloops: 52570
+ new package swfdec-gtk: 55786
+ new package gnome-panel-libs: 56936
+ new package swfdec-mozilla: 75911
+ new package libconfig: 120055
+ new package obex-data-server: 136538
+ new package at-spi-python: 170868
+ new package ncurses-base: 176949
+ new package pixman: 209556
+ new package scim-python: 247730
+ new package libcurl: 258148
+ new package libggz: 289477
+ new package hfsutils: 362228
+ new package libmtp: 398952
+ new package xorg-x11-drv-openchrome: 415754
+ new package ggz-client-libs: 434830
+ new package samyak-fonts: 457144
+ new package perl-Date-Manip: 458629
+ new package libtasn1: 466849
+ new package python-crypto: 571535
+ new package elilo: 613010
+ new package gfs2-utils: 650707
+ new package ncurses-libs: 668620
+ new package swfdec: 958169
+ new package reiserfs-utils: 1022402
+ new package iscsi-initiator-utils: 1138529
+ new package jfsutils: 1138726
+ new package gvfs: 1700127
+ new package totem-pl-parser: 2627745
+ new package xfsprogs: 3408051
+ new package VLGothic-fonts: 3831447
+ new package VLGothic-fonts-proportional: 3831790
+ new package gnome-settings-daemon: 6218660
+ new package mesa-libOSMesa: 7248256
+ new package scim-python-chinese: 7621164
+ new package libgweather: 14592282
+ new package dejavu-fonts: 15593008
+ new package vim-common: 16294034
+ new package xulrunner: 24481155
+ crontabs grew 144 bytes (6.83%) (2107->2251)
+ libopenraw-gnome grew 348 bytes (7.94%) (4384->4732)
+ xorg-x11-drv-fbdev grew 380 bytes (1.84%) (20597->20977)
+ irqbalance grew 400 bytes (1.85%) (21595->21995)
+ m17n-contrib grew 469 bytes (1.28%) (36757->37226)
+ pam_ccreds grew 497 bytes (1.49%) (33428->33925)
+ smolt-firstboot grew 655 bytes (6.01%) (10893->11548)
+ pcsc-lite-libs grew 848 bytes (2.44%) (34696->35544)
+ dbus-x11 grew 884 bytes (3.63%) (24353->25237)
+ numactl grew 896 bytes (1.00%) (89239->90135)
+ gnome-bluetooth-libs grew 1278 bytes (1.02%) (124866->126144)
+ xorg-x11-drv-evdev grew 1445 bytes (4.05%) (35642->37087)
+ m17n-db-hindi grew 1717 bytes (21.74%) (7899->9616)
+ sysreport grew 1783 bytes (5.30%) (33620->35403)
+ libpciaccess grew 1796 bytes (7.21%) (24901->26697)
+ sg3_utils-libs grew 2156 bytes (1.97%) (109392->111548)
+ pciutils grew 2464 bytes (1.36%) (180975->183439)
+ setroubleshoot grew 2541 bytes (1.11%) (229578->232119)
+ gnome-keyring-pam grew 2556 bytes (8.89%) (28760->31316)
+ libcap grew 2618 bytes (5.79%) (45230->47848)
+ apr grew 2823 bytes (1.04%) (271801->274624)
+ bc grew 2861 bytes (1.50%) (190964->193825)
+ libsepol grew 2992 bytes (1.33%) (224692->227684)
+ lohit-fonts-telugu grew 3100 bytes (1.78%) (174487->177587)
+ e2fsprogs-libs grew 3332 bytes (1.33%) (250016->253348)
+ device-mapper-libs grew 3680 bytes (4.25%) (86516->90196)
+ glx-utils grew 3704 bytes (10.98%) (33736->37440)
+ scim-chewing grew 4072 bytes (3.22%) (126383->130455)
+ dbus-libs grew 4100 bytes (1.63%) (251944->256044)
+ nash grew 4128 bytes (1.74%) (237698->241826)
+ libjpeg grew 4420 bytes (1.61%) (275021->279441)
+ authconfig-gtk grew 4808 bytes (2.75%) (175143->179951)
+ mkinitrd grew 4854 bytes (4.84%) (100334->105188)
+ linuxwacom grew 5518 bytes (1.10%) (502293->507811)
+ desktop-file-utils grew 5523 bytes (4.50%) (122601->128124)
+ gnome-python2-gnomeprint grew 5547 bytes (1.27%) (437641->443188)
+ bluez-utils-alsa grew 5856 bytes (13.67%) (42824->48680)
+ m17n-contrib-telugu grew 6114 bytes (28.08%) (21776->27890)
+ rsyslog grew 6922 bytes (1.45%) (477587->484509)
+ ustr grew 7531 bytes (3.12%) (241610->249141)
+ rhpxl grew 7783 bytes (2.36%) (329907->337690)
+ xorg-x11-drv-mga grew 8319 bytes (4.91%) (169473->177792)
+ taglib grew 8368 bytes (1.71%) (489415->497783)
+ gtk-nodoka-engine grew 8948 bytes (9.32%) (96057->105005)
+ nscd grew 9484 bytes (6.73%) (140911->150395)
+ exempi grew 9692 bytes (1.39%) (698782->708474)
+ gnome-menus grew 9841 bytes (1.57%) (626493->636334)
+ dbus-glib grew 9970 bytes (2.10%) (473790->483760)
+ libdhcp6client grew 10524 bytes (6.30%) (166956->177480)
+ openldap grew 10658 bytes (1.76%) (604986->615644)
+ nss_ldap grew 12224 bytes (2.17%) (562402->574626)
+ dmidecode grew 14466 bytes (10.46%) (138266->152732)
+ NetworkManager-vpnc grew 14477 bytes (4.58%) (316033->330510)
+ system-config-rootpassword grew 14962 bytes (16.07%) (93118->108080)
+ gstreamer-python grew 15266 bytes (1.64%) (933175->948441)
+ rarian grew 15824 bytes (4.99%) (316947->332771)
+ at-spi grew 16072 bytes (2.38%) (674624->690696)
+ isomd5sum grew 17146 bytes (36.61%) (46840->63986)
+ usbutils grew 17192 bytes (19.31%) (89044->106236)
+ acl grew 17875 bytes (11.97%) (149393->167268)
+ hicolor-icon-theme grew 17992 bytes (79.30%) (22688->40680)
+ gnome-python2-desktop grew 18187 bytes (7.44%) (244527->262714)
+ libdhcp grew 19318 bytes (14.23%) (135727->155045)
+ which grew 20480 bytes (65.05%) (31485->51965)
+ NetworkManager-gnome grew 20604 bytes (2.90%) (710665->731269)
+ pam_krb5 grew 20943 bytes (8.06%) (259736->280679)
+ system-config-language grew 21674 bytes (8.55%) (253576->275250)
+ libxcb grew 22328 bytes (5.40%) (413804->436132)
+ bluez-utils grew 22572 bytes (1.76%) (1280277->1302849)
+ pygtksourceview grew 23100 bytes (36.06%) (64064->87164)
+ libgpg-error grew 23525 bytes (12.14%) (193728->217253)
+ glibmm24 grew 24411 bytes (5.25%) (465396->489807)
+ fribidi grew 24912 bytes (17.19%) (144894->169806)
+ gmime grew 24916 bytes (4.24%) (587824->612740)
+ libuser grew 25215 bytes (1.56%) (1616562->1641777)
+ httpd grew 28595 bytes (1.12%) (2551734->2580329)
+ m17n-lib grew 30893 bytes (10.14%) (304750->335643)
+ rhpl grew 31037 bytes (3.99%) (778235->809272)
+ libdhcp4client grew 32772 bytes (6.57%) (499144->531916)
+ bind-utils grew 33408 bytes (10.87%) (307362->340770)
+ NetworkManager grew 33657 bytes (1.42%) (2377366->2411023)
+ dbus-python grew 36266 bytes (5.11%) (710089->746355)
+ gnome-mag grew 36431 bytes (7.21%) (504936->541367)
+ libXpm grew 37746 bytes (52.09%) (72467->110213)
+ libgnomekbd grew 38042 bytes (6.68%) (569521->607563)
+ pm-utils grew 39200 bytes (117.36%) (33402->72602)
+ nautilus-sendto grew 42489 bytes (16.21%) (262118->304607)
+ dhclient grew 42699 bytes (8.59%) (497288->539987)
+ gtksourceview2 grew 42895 bytes (2.00%) (2148753->2191648)
+ krb5-libs grew 45052 bytes (2.96%) (1522532->1567584)
+ system-config-printer grew 47675 bytes (5.03%) (948043->995718)
+ gnutls grew 58282 bytes (5.99%) (972804->1031086)
+ bluez-gnome grew 60576 bytes (22.56%) (268531->329107)
+ mono-data grew 61605 bytes (1.21%) (5087435->5149040)
+ libwnck grew 62234 bytes (5.42%) (1148126->1210360)
+ gtk2-engines grew 63679 bytes (6.09%) (1045391->1109070)
+ system-config-users grew 64047 bytes (4.40%) (1455495->1519542)
+ gnokii grew 68723 bytes (4.36%) (1575916->1644639)
+ rsync grew 73058 bytes (18.04%) (404896->477954)
+ hal-info grew 75029 bytes (20.94%) (358305->433334)
+ mesa-libGLU grew 77812 bytes (17.12%) (454428->532240)
+ mdadm grew 83417 bytes (4.79%) (1743098->1826515)
+ shared-mime-info grew 85852 bytes (9.51%) (902332->988184)
+ compiz-gnome grew 87904 bytes (7.16%) (1227682->1315586)
+ PolicyKit-gnome grew 89123 bytes (126.49%) (70457->159580)
+ GConf2 grew 89585 bytes (1.68%) (5342705->5432290)
+ dhcpv6-client grew 94965 bytes (54.70%) (173599->268564)
+ system-config-firewall grew 103528 bytes (4.50%) (2300495->2404023)
+ ntfs-3g grew 107185 bytes (36.31%) (295187->402372)
+ f-spot grew 110065 bytes (1.44%) (7621883->7731948)
+ PolicyKit grew 121200 bytes (71.93%) (168495->289695)
+ gnupg grew 126829 bytes (2.62%) (4841029->4967858)
+ libgcrypt grew 132376 bytes (38.24%) (346204->478580)
+ libopenraw grew 136838 bytes (101.68%) (134583->271421)
+ pykickstart grew 141694 bytes (17.92%) (790784->932478)
+ gnome-python2-gnomevfs grew 142165 bytes (87.24%) (162958->305123)
+ shadow-utils grew 144973 bytes (5.29%) (2739389->2884362)
+ gnome-volume-manager grew 158480 bytes (7.38%) (2146417->2304897)
+ vbetool grew 162208 bytes (139.43%) (116340->278548)
+ openssl grew 166448 bytes (4.81%) (3459831->3626279)
+ libselinux-python grew 171323 bytes (118.46%) (144622->315945)
+ libsilc grew 180620 bytes (17.41%) (1037560->1218180)
+ sound-juicer grew 182617 bytes (5.86%) (3114050->3296667)
+ gnome-system-monitor grew 186353 bytes (3.55%) (5244840->5431193)
+ gdb grew 193437 bytes (3.11%) (6228176->6421613)
+ selinux-policy-devel grew 206105 bytes (3.72%) (5545358->5751463)
+ evolution-data-server grew 208724 bytes (1.89%) (11029422->11238146)
+ PyOpenGL grew 213779 bytes (4.86%) (4398157->4611936)
+ tomboy grew 218900 bytes (3.63%) (6022535->6241435)
+ parted grew 223507 bytes (15.16%) (1474368->1697875)
+ orca grew 231344 bytes (4.05%) (5718621->5949965)
+ util-linux-ng grew 245524 bytes (5.17%) (4749959->4995483)
+ selinux-policy grew 268202 bytes (3.47%) (7731786->7999988)
+ iso-codes grew 269192 bytes (4.80%) (5605136->5874328)
+ system-config-date grew 282500 bytes (10.09%) (2798572->3081072)
+ xorg-x11-drv-ati grew 285328 bytes (35.75%) (798151->1083479)
+ eog grew 292326 bytes (7.82%) (3740424->4032750)
+ dbus grew 299134 bytes (58.75%) (509123->808257)
+ totem grew 321458 bytes (5.87%) (5476956->5798414)
+ gnome-keyring grew 333541 bytes (32.87%) (1014819->1348360)
+ glibc grew 347221 bytes (2.59%) (13402107->13749328)
+ sqlite grew 358672 bytes (76.12%) (471170->829842)
+ setroubleshoot-server grew 363273 bytes (22.18%) (1637732->2001005)
+ bind-libs grew 389872 bytes (17.27%) (2258064->2647936)
+ gcalctool grew 496578 bytes (10.21%) (4862745->5359323)
+ gnome-panel grew 509960 bytes (4.35%) (11714901->12224861)
+ ghostscript grew 534784 bytes (1.87%) (28646835->29181619)
+ rhythmbox grew 678314 bytes (6.41%) (10582223->11260537)
+ mono-core grew 686301 bytes (2.01%) (34154946->34841247)
+ nautilus grew 693197 bytes (5.04%) (13751211->14444408)
+ mono-winforms grew 729754 bytes (7.47%) (9765822->10495576)
+ totem-mozplugin grew 770229 bytes (136.17%) (565632->1335861)
+ mono-web grew 797665 bytes (9.85%) (8097242->8894907)
+ glib2 grew 849381 bytes (29.07%) (2922173->3771554)
+ gnome-power-manager grew 934030 bytes (8.33%) (11214535->12148565)
+ nss grew 937664 bytes (44.33%) (2114975->3052639)
+ libsmbclient grew 1191360 bytes (50.53%) (2357736->3549096)
+ gnome-games grew 1373569 bytes (4.65%) (29510057->30883626)
+ kernel grew 2170562 bytes (4.60%) (47161413->49331975)
+ anaconda grew 2566351 bytes (17.76%) (14448198->17014549)
- krb5-auth-dialog shrunk 1 bytes (53674->53673)
- libtirpc shrunk 1 bytes (150301->150300)
- gmime-sharp shrunk 6 bytes (197336->197330)
- gzip shrunk 6 bytes (219689->219683)
- gedit shrunk 8 bytes (13487572->13487564)
- readline shrunk 8 bytes (350214->350206)
- system-config-network shrunk 8 bytes (1905298->1905290)
- perl shrunk 14 bytes (31645884->31645870)
- ntsysv shrunk 16 bytes (22156->22140)
- xdg-utils shrunk 18 bytes (176553->176535)
- python-pyblock shrunk 22 bytes (175969->175947)
- pavucontrol shrunk 23 bytes (169857->169834)
- logrotate shrunk 32 bytes (77454->77422)
- libXfont shrunk 32 bytes (456948->456916)
- gnome-python2-canvas shrunk 32 bytes (48902->48870)
- xorg-x11-drv-vmmouse shrunk 32 bytes (16364->16332)
- mono-data-sqlite shrunk 33 bytes (457296->457263)
- gnome-pilot shrunk 36 bytes (1930958->1930922)
- libflashsupport shrunk 40 bytes (11044->11004)
- nautilus-extensions shrunk 48 bytes (31308->31260)
- pulseaudio-utils shrunk 56 bytes (234499->234443)
- libselinux shrunk 61 bytes (148311->148250)
- gimp shrunk 64 bytes (38423455->38423391)
- libXrender shrunk 64 bytes (47254->47190)
- paps shrunk 64 bytes (51462->51398)
- libxkbfile shrunk 96 bytes (146358->146262)
- librsvg2 shrunk 120 bytes (337750->337630)
- pulseaudio-libs shrunk 128 bytes (343843->343715)
- isdn4k-utils shrunk 144 bytes (9789025->9788881)
- less shrunk 171 bytes (176124->175953)
- pulseaudio shrunk 192 bytes (926686->926494)
- xorg-x11-drv-keyboard shrunk 256 bytes (26608->26352)
- anacron shrunk 274 bytes (56515->56241)
- libgtop2 shrunk 320 bytes (341012->340692)
- xorg-x11-drv-cirrus shrunk 355 bytes (77986->77631)
- gtkspell shrunk 400 bytes (56779->56379)
- pulseaudio-core-libs shrunk 416 bytes (439696->439280)
- liberation-fonts shrunk 444 bytes (1865074->1864630)
- libpcap shrunk 485 bytes (261897->261412)
- nspluginwrapper shrunk 509 bytes (311525->311016)
- acpid shrunk 542 bytes (61235->60693)
- udev shrunk 601 bytes (654430->653829)
- setroubleshoot-plugins shrunk 689 bytes (2422617->2421928)
- python-numeric shrunk 1040 bytes (1722779->1721739)
- file-libs shrunk 1181 bytes (1669772->1668591)
- xorg-x11-drv-vesa shrunk 1208 bytes (26099->24891)
- system-config-keyboard shrunk 1259 bytes (182829->181570)
- fedora-release shrunk 1450 bytes (46680->45230)
- gnome-spell shrunk 1568 bytes (377889->376321)
- gparted shrunk 1600 bytes (1569813->1568213)
- nspr shrunk 1856 bytes (248628->246772)
- dvd+rw-tools shrunk 1860 bytes (283930->282070)
- libdrm shrunk 1878 bytes (39456->37578)
- at shrunk 1892 bytes (83059->81167)
- synaptics shrunk 2072 bytes (113498->111426)
- m17n-contrib-hindi shrunk 2162 bytes (16757->14595)
- pango shrunk 3747 bytes (862572->858825)
- system-config-services shrunk 3768 bytes (561578->557810)
- libcdio shrunk 3961 bytes (555394->551433)
- audit-libs shrunk 4096 bytes (130447->126351)
- atmel-firmware shrunk 4458 bytes (732612->728154)
- fontconfig shrunk 4805 bytes (374336->369531)
- checkpolicy shrunk 6752 bytes (510825->504073)
- ppp shrunk 8123 bytes (841674->833551)
- ntp shrunk 8426 bytes (2652615->2644189)
- procps shrunk 11625 bytes (374451->362826)
- iproute shrunk 11660 bytes (2152986->2141326)
- gnome-bluetooth shrunk 12179 bytes (545675->533496)
- smolt shrunk 13811 bytes (635219->621408)
- b43-fwcutter shrunk 17375 bytes (37123->19748)
- im-chooser shrunk 19198 bytes (208789->189591)
- evolution shrunk 30364 bytes (38160208->38129844)
- ntfsprogs shrunk 33559 bytes (1148797->1115238)
- zip shrunk 33692 bytes (302492->268800)
- vixie-cron shrunk 46771 bytes (673502->626731)
- compiz shrunk 57822 bytes (1846352->1788530)
- cups shrunk 73290 bytes (10355510->10282220)
- system-config-printer-libs shrunk 88138 bytes (2438676->2350538)
- eel2 shrunk 90562 bytes (848996->758434)
- yelp shrunk 99732 bytes (2559882->2460150)
- xorg-x11-drv-i810 shrunk 249946 bytes (655965->406019)
- gtk2 shrunk 308952 bytes (20696815->20387863)
- fedora-release-notes shrunk 329470 bytes (12271152->11941682)
- firstboot shrunk 356968 bytes (783521->426553)
- cairo shrunk 423604 bytes (1623706->1200102)
- control-center shrunk 492635 bytes (8945618->8452983)
- gnome-media shrunk 782217 bytes (4946507->4164290)
- e2fsprogs shrunk 904410 bytes (2366733->1462323)
- device-mapper shrunk 917957 bytes (1027430->109473)
- gnome-themes shrunk 1007647 bytes (4994173->3986526)
- xkeyboard-config shrunk 1188506 bytes (3043679->1855173)
- lvm2 shrunk 1386888 bytes (2186994->800106)
- xorg-x11-server-Xorg shrunk 1410978 bytes (7431876->6020898)
- hwdata shrunk 1768168 bytes (2833960->1065792)
- python shrunk 1870258 bytes (18499208->16628950)
- xorg-x11-fonts-Type1 shrunk 1919814 bytes (2803806->883992)
- ncurses shrunk 2311863 bytes (2562051->250188)
- selinux-policy-targeted shrunk 3623635 bytes (27306881->23683246)
- gdm shrunk 6450348 bytes (14040436->7590088)
- gnome-applets shrunk 8005406 bytes (26478262->18472856)
- firefox shrunk 39666395 bytes (42009290->2342895)
- removed package fonts-gujarati: 0
- removed package fonts-korean: 0
- removed package scim-lang-kannada: 0
- removed package fonts-arabic: 0
- removed package fonts-punjabi: 0
- removed package fonts-oriya: 0
- removed package fonts-chinese: 0
- removed package scim-lang-tibetan: 0
- removed package fonts-kannada: 0
- removed package fonts-bengali: 0
- removed package fonts-hebrew: 0
- removed package fonts-hindi: 0
- removed package scim-lang-assamese: 0
- removed package fonts-sinhala: 0
- removed package scim-lang-sinhalese: 0
- removed package fonts-tamil: 0
- removed package fonts-telugu: 0
- removed package fonts-malayalam: 0
- removed package m17n-contrib-urdu: 3608
- removed package m17n-db-assamese: 6079
- removed package m17n-db-kannada: 7749
- removed package m17n-contrib-kannada: 8717
- removed package m17n-contrib-sinhala: 11327
- removed package m17n-contrib-assamese: 12581
- removed package m17n-db-sinhala: 14228
- removed package m17n-db-tibetan: 15214
- removed package xorg-x11-drv-ark: 18888
- removed package xorg-x11-drv-tseng: 52907
- removed package xorg-x11-drv-s3: 58401
- removed package scim-sinhala: 66881
- removed package totem-plparser: 70428
- removed package libbeagle: 94156
- removed package xorg-x11-drv-avivo: 107204
- removed package xorg-x11-drv-chips: 154533
- removed package lohit-fonts-kannada: 210687
- removed package fuse: 216231
- removed package beecrypt: 242015
- removed package lklug-fonts: 333507
- removed package xorg-x11-drv-via: 363192
- removed package xorg-x11-fonts-ethiopic: 437981
- removed package SDL: 495206
- removed package curl: 514238
- removed package firstboot-tui: 653472
- removed package xorg-x11-fonts-truetype: 909077
- removed package db4o: 1414265
- removed package jomolhari-fonts: 2293163
- removed package pwlib: 2423701
- removed package evince: 3452782
- removed package aspell-en: 3567971
- removed package tibetan-machine-uni-fonts: 4529886
- removed package dejavu-lgc-fonts: 6293390
- removed package opal: 10988583
- removed package ekiga: 13323689
old has 896 packages
new has 885 packages
posted at: 07:23 | link | | 0 comments
Wed, 16 Jan 2008
FUDCon
So FUDCon 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 MyFedora 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.
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 ToscaWidgets) 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:
class FedoraPeopleWidget(RSSWidget):
url = 'http://planet.fedoraproject.org/rss20.xml'
title = 'Fedora People'
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:
$ git clone git://git.fedorahosted.org/git/myfedora.git
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: http://tg.lewk.org.
I was going to be giving a session on bodhi, 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 here, and some transcripts from our last virtual fudcon.
The PackageKit session went well too. People definitely were interested, and also had some interesting ideas.
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 :)
Sunday was the second day of the hackfests. I decided to context-switch a bit and get my func on. I wrote a patch that adds a "mem" method to the ProcessModule that returns per-program memory usage from your minion in the format of [[Private, Shared, Total RAM used, Program], ...]. This allows you to do something like,
[lmacken@crow ~]$ sudo func "*" call process mem
on https://tomservo:51234 running process mem ()
[['16.8 MiB', '6.5 MiB', '23.4 MiB', 'Xorg'],
['21.7 MiB', '8.3 MiB', '30.1 MiB', 'tomboy'],
['33.6 MiB', '2.3 MiB', '35.9 MiB', 'ssh (5)'],
['23.2 MiB', '14.3 MiB', '37.5 MiB', 'deskbar-applet'],
['139.9 MiB', '9.9 MiB', '149.8 MiB', 'firefox-bin']]
I also discussed a potential TurboGears FuncWeb 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.
Last night I got a little bit A.D.D. and re-wrote some chunks of the func minion module_loader/server to make writing func modules a lot easier.
So, the moral of the story is: FUDCon rocks. Feeding large quantities of geeks caffeine, beer, and barbeque can result in amazing things.
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 :)
posted at: 11:21 | link | | 0 comments
Wed, 19 Dec 2007
TurboFlot 0.0.1
In an effort to clean up bodhi's metrics code a bit, I wrote a TurboFlot plugin that allows you to wield the jQuery plugin flot 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.

Check out the README to see the code for the example above.
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 flot API documentation for details on all of the arguments. Here is a simple usage example:
flot = TurboFlot([
{
'data' : [[0, 3], [4, 8], [8, 5], [9, 13]],
'lines' : { 'show' : True, 'fill' : True }
}],
{
'grid' : { 'backgroundColor' : '#fffaff' },
'yaxis' : { 'max' : '850' }
}
)
Then, to display the widget in your template, you simply use:
${flot.display()}
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.
class TurboFlot(Widget):
"""
A TurboGears Flot Widget.
"""
template = """
<div xmlns:py="http://purl.org/kid/ns#" id="turboflot"
style="width:${width};height:${height};">
<script>
$.plot($("#turboflot"), ${data}, ${options});
</script>
</div>
"""
params = ["data", "options", "height", "width"]
javascript = [JSLink('turboflot', 'excanvas.js'),
JSLink("turboflot", "jquery.js"),
JSLink("turboflot", "jquery.flot.js")]
def __init__(self, data, options={}, height="300px", width="600px"):
self.data = simplejson.dumps(data)
self.options = simplejson.dumps(options)
self.height = height
self.width = width
You can download the latest releases from the Python Package Index:
http://pypi.python.org/pypi/TurboFlotOr you can grab my latest development tree out of mercurial:
http://hg.lewk.org/TurboFlotAs always, patches are welcome :)
posted at: 14:21 | link | | 1 comments

