Keeping Private config files Private in Git

Problem: You are working on a project with several other people, each one of you using radically different test environments. The project uses a configuration file that each developer, and eventually each user has to customize. You also want to keep a 'standard' general purpose config file with sane defaults in the source repository.

This is very commmon when developing web applications. For example, a web app that sends out mail notifications may need to use your private SMTP server. You may not feel like telling the whole world where to find it once they hack into your private network.

Solution: Just don't commit that file to the source repository of course :)

Better Solution: People are clumsy and sometimes forget to ignore it. Furthermore, changes to the config file upstream will make practically every new patch conflict with your own working tree. This becomes hell to manage, unless you are truly awesome. Or you use Git. Git is truly awesome.

Furthermore, by using these sane development practices, you'll see other benefits from them. Git makes some very advanced tricks easy, and will make development easier for everyone on your team.

One thing i recommend for git newbies is to use a graphical browser to just view all the changes each step of the way. I like Qgit personally. This exercise is done through the command line, but for some people it also helps to be able to visualize what is going on.

For starters, this requires a bit of preconfiguration. When coding on FAS, i have two main branches i work with, 'master' and 'loupz'. 'master..loupz' (git-ese for all the patches that are in loupz, but not in master) contains one single patch. This patch fixes the configuration files to use my own environment. It contains a few passwords and some information about my local network topology that i just don't want to share. It looks like this:

yankee@koan ~/Projekten/FAS2 $ git log master..loupz
commit cc4990566df6cfd67707892d81c826b898aff5cd
Author: Yaakov M. Nemoy
Date: Tue Jul 22 15:23:16 2008 +0200

My modded fas.cfg

This commit should never be seen in public. If it does, yell at me.

Once this is set up, it's time to start hacking. In putting together this example, i forgot to 'pre-setup' my hacking session, so i will use git-stash to skip over the 'edit' steps.

yankee@koan ~/Projekten/FAS2 $ git stash
Saved working directory and index state "WIP on loupz: 048419f... My modded fas.cfg"
(To restore them type "git stash apply")
HEAD is now at 048419f My modded fas.cfg

The first thing to do is to create a new branch for all the future development. Since we were hacking on fasclient today, i named it accordingly. This new branch has to branch from loupz, and not master, because loupz has the working configuration.

yankee@koan ~/Projekten/FAS2 $ git checkout -b fasclient loupz
Switched to a new branch "fasclient"

Then I do my hacking, or in this case, just run git-stash apply.

yankee@koan ~/Projekten/FAS2 $ git stash apply
# On branch fasclient
# Changed but not updated:
# (use "git add ..." to update what will be committed)
# modified: fas/model/
# modified: fas/
no changes added to commit (use "git add" and/or "git commit -a")

Then it's time to add code from the working tree to the index, the staging area, so we can commit them to the repository. I like git-add --interactive, because it gives me an extra level of verification as to exactly what is being committed.

yankee@koan ~/Projekten/FAS2 $ git add --interactive
staged unstaged path
1: unchanged +11/-0 fas/model/
2: unchanged +19/-0 fas/

*** Commands ***
1: [s]tatus 2: [u]pdate 3: [r]evert 4: [a]dd untracked
5: [p]atch 6: [d]iff 7: [q]uit 8: [h]elp
What now> 5


The rest of this part is like watching sausage being made ;) . Next we commit our changes.

yankee@koan ~/Projekten/FAS2 $ git commit
Created commit 53dc510: An alternative way to get the data to fasclient as efficiently as possible.
2 files changed, 29 insertions(+), 0 deletions(-)

If you're following along in Qgit, you'll see that the commit history has become a bit forked between stash, loupz, fasclient, etc... Since we don't need the stuff in the stash anymore, let's just clear it.

yankee@koan ~/Projekten/FAS2 $ git stash clear

So now there should be a string of patches on top of loupz that have been tested with the private configuration file. We know the code works. If we were to call git-push now, the troublesome patch would be included in the push. Here's the fun part. We're going to use the awesomeness of git to rewrite the commit history. This is called rebasing. In this instance, we're going to rebase loupz..fasclient, namely all the patches that are in the fasclient branch, but not in loupz, and rebase them onto master. The command is simple:

yankee@koan ~/Projekten/FAS2 $ git rebase --onto master loupz fasclient
Already on "fasclient"
First, rewinding head to replay your work on top of it...
HEAD is now at 6c583ab Adding some legal voodoo and mumbo jumbo.
Applying An alternative way to get the data to fasclient as efficiently as possible.
warning: squelched 2 whitespace errors
warning: 7 lines add whitespace errors.

To double check this, check git-log

yankee@koan ~/Projekten/FAS2 $ git log
commit 71f41ede6350b481bba358ed612a6cc93fad7a78
Author: Yaakov M. Nemoy
Date: Sun Sep 28 22:40:25 2008 -0400

An alternative way to get the data to fasclient as efficiently as possibl

Ricky and I are trying to figure this out, this commit is one option.

commit 6c583ab7a95f28f3871360a34f233a6454a46e53
Author: Yaakov M. Nemoy
Date: Sun Sep 14 20:22:30 2008 -0400

Adding some legal voodoo and mumbo jumbo.

commit 4adc06b3f4dfd7cfd2adf14a1d990afe1bddbe15
Author: Yaakov M. Nemoy
Date: Sun Sep 14 20:17:45 2008 -0400

Adds help and some documentation to the user

Graphically, you should see that there are now two diverging branches, fasclient and loupz. We now need to merge master to fasclient. This is simple.

yankee@koan ~/Projekten/FAS2 $ git checkout master
Switched to branch "master"
yankee@koan ~/Projekten/FAS2 $ git merge fasclient
Updating 6c583ab..71f41ed
Fast forward
fas/model/ | 10 ++++++++++
fas/ | 19 +++++++++++++++++++
2 files changed, 29 insertions(+), 0 deletions(-)
yankee@koan ~/Projekten/FAS2 $ git branch -d fasclient
Deleted branch fasclient.

Note: we also deleted fasclient because it's no longer needed.

Time to push upstream.

yankee@koan ~/Projekten/FAS2 $ git push
To ssh://
! [rejected] master -> master (non-fast forward)
error: failed to push some refs to 'ssh://'

It turns out that our local repository was not completely up to date. This is not a big deal, because rebase can help us solve this problem as well. We only need to use a more simple incantation of git-rebase. We simply want to take all the patches that are in our local 'master' branch, but are not on the origin/master branch upstream, and have them tacked on the end.

yankee@koan ~/Projekten/FAS2 $ git rebase origin/master
Current branch master is up to date.

Oops, we need to fetch first ;)

yankee@koan ~/Projekten/FAS2 $ git fetch
remote: Counting objects: 61, done.
remote: Compressing objects: 100% (46/46), done.
remote: Total 46 (delta 31), reused 0 (delta 0)
Unpacking objects: 100% (46/46), done.
From ssh://
6c583ab..cc20015 master -> origin/master
yankee@koan ~/Projekten/FAS2 $ git rebase origin/master
First, rewinding head to replay your work on top of it...
HEAD is now at cc20015 Initial fas_client method.
Applying An alternative way to get the data to fasclient as efficiently as possible.
warning: squelched 2 whitespace errors
warning: 7 lines add whitespace errors.

Finally, we can just push all these changes upstream.

yankee@koan ~/Projekten/FAS2 $ git push
Counting objects: 11, done.
Compressing objects: 100% (6/6), done.
Writing objects: 100% (6/6), 1.19 KiB, done.
Total 6 (delta 4), reused 0 (delta 0)
To ssh://
cc20015..3df1588 master -> master

If you view this graphically, you will see that the branch with the private configuration is horribly out of date. We need rebase one more time. But this time, we need to check out the branch first.

yankee@koan ~/Projekten/FAS2 $ git checkout loupz
Switched to branch "loupz"
yankee@koan ~/Projekten/FAS2 $ git rebase master
First, rewinding head to replay your work on top of it...
HEAD is now at 3df1588 An alternative way to get the data to fasclient as efficiently as possible.
Applying My modded fas.cfg

And that does it!

This method provides three benefits. First, it makes it very easy to maintain a private configuration without conflicting with other developers on your team. Secondly, it makes it very easy to ensure that there are no 'floating bits' that are uncommitted on your working tree. The only thing that isn't handled by Git are the bits you are actively working on. You can keep each branch separate and organised. Thirdly, once you have to merge with upstream, you can do so cleanly, without a nagging 'merge' commit. This will help you maintain a clean and professional looking log to development.

To make the last point very clear, try to find two git repositories, one with 'merge' commits, and one without, and view it in Qgit. You will notice the repo with 'merge' commits will fork frequently any time two developers work simultaneously. It can sometimes be hard to follow. In contrast, look at the other repo. Development goes in a single linear line. It only forks when a developer or team has to work on a radically different feature. It is much clearer why there are forks in this second repo.

How to run the jack audio connection seamlessly in gnome on Fedora

On the coattails of Lennarts excellent post about the status of the Linux audio landscape, I would like to give the more adventurous Fedora user some tips on how to experiment with some of these other technologies.

Problem: The user would like to run 'foo' server in conjunction with Pulseaudio in either gnome or kde without too much 'tinkering'. Tinkering means changing absolutely no files outside of /home without the aid of yum or some otherwise simple and reproducible command. Furthermore, these changes should work reliably across setups.


1) So in this case, the 'foo' server is jack. There are a number of programs I would like to work with that work with Jack instead of Pulse. Jack is essentially lower level than Pulse, so this solution is geared towards things that work underneath Pulse, thus tools that have to be running before Pulse is. Since jack is the defacto audio daemon for Freeeee and a favourite by the developers, Fedora users might want to become more familiar with it.

2) To the best of my knowledge, Gnome starts Pulseaudio by calling up the legacy ESD. Since Pulse wraps ESD nicely, it starts up instead using a systemwide default configuration. KDE on the other hand has a directory for systemwide and user specific start up scripts to be run. Pulse is included as a systemwide script. If the user is a member of pulse-rt, then it automatically uses realtime mode settings. Otherwise it resorts to defaults. We're assuming you want realtime settings.

# usermod -G pulse-rt

Nicely enough, we shouldn't need to do anything more for jack to run in realtime mode as well.

3) Although we can hack the KDE systemwide directories to start jackd as well, or just change the user specific ones, it provides no guarantees that jack can be started before pulse. Furthemore, this is not a possible solution for gnome.

When the user logins from gdm or kdm, the display manager searches for some .dekstop files that specify all the possible desktop environments available to the user. These .desktop files have links to different programs, such as 'gnome-session' or 'startkde'. These programs start up the comprehensive desktop environment. The user can also specify their own script or program to be run on the startup of the X server. This script is stored in a per-user basis at ~/.xsession . Although this is considered a 'legacy' method, it is quite commonly used in more minimalist setups. In order to enable this 'legacy' feature, run:

# yum install xorg-x11-xinit-session

Then create your ~/.xsession script.

$ vi ~/.xsession

and fill it with the following example

#! /bin/sh

jackd --realtime -d alsa &

and finally make it executable

$ chmod +x ~/.xsession

Notice that in the .xsession file, the command for jackd has an ampersand '&' after it. This means that the program is run 'in the background'. gnome-session does not have the ampersand. When gnome-session is finished, then the X server dies. If you replace it with any other program, remember, once that program dies, the X server dies with it. (Try it with xterm or firefox, and see what happens when you close it down.)

You can of course experiment further with .xsession and put any programs you want to start, regardless of which DE you use.

4) Finally, Pulse must be configured to work with Jack. I used a config provided by jebba, one of the Freeeee developers. It goes in ~/.pulse/ .

$ vi ~/.pulse/

Then fill it with this

load-module module-jack-sink channels=2 channel_map=front-left,front-right
#load-module module-jack-source channels=2 channel_map=front-left,front-right
load-module module-native-protocol-unix
## The following is not mandatory
load-module module-volume-restore
load-module module-default-device-restore
load-module module-rescue-streams
.ifexists /usr/lib/pulse-0.9/modules//
load-module module-x11-publish
## The following can conflict with this config.
#.ifexists /usr/lib/pulse-0.9/modules//
#load-module module-gconf
set-default-sink jack_out
set-default-source jack_in

# no
#load-module module-alsa-sink
#load-module module-alsa-source device=hw:1,0
#load-module module-oss device="/dev/dsp" sink_name=output source_name=input
#load-module module-oss-mmap device="/dev/dsp" sink_name=output source_name=input
#load-module module-null-sink
#load-module module-pipe-sink

### Load several protocols
load-module module-esound-protocol-unix
# no workie
#load-module module-native-protocol-unix

### Network access (may be configured with paprefs, so leave this commented
### here if you plan to use paprefs)
load-module module-esound-protocol-tcp
load-module module-native-protocol-tcp
load-module module-zeroconf-publish

load-module module-rtp-recv
load-module module-null-sink sink_name=rtp format=s16be channels=2 rate=44100 description="martin RTP Multicast Sink"
load-module module-rtp-send source=rtp.monitor

### Publish connection data in the X11 root window
load-module module-x11-publish

5) Finally, log out of your Gnome or KDE session, to come back to your login screen. Under 'session type' you should see a new option for 'Custom' next to KDE and Gnome. Login using that session type. Remember, Gnome or KDE will load up, depending on which you have put in .xsession . If you don't see that option, you may need to restart your computer, in order to restart your display manager. (If you're savy, you can just 'init 3' and then 'init 5' from the command line as root.)

6) One of the nice things about this configuration is that if either Pulse or Jack die, for any reason at all, you only need to open up a terminal and run the following commands.

$ killall pulseaudio ; killall jackd
$ jackd --realtime -d alsa & && pulseaudio &

Since they both now have sane default configurations, there is very little muck that has to be typed in at the command line to restart them.

Happy Hacking!

Palin Should be Impeached, Not Run for Elections

I don't normally use this blog to speak about politics, and certainly not in such definite negative terms. The American Election is a very flame heavy topic i've tried to leave alone, because i know i will probably run the foul side of pretty much everyone on Fedora Planet with my views. I like to keep my political views completely separate from work as much as possible. Occasionally I need to have my say though, and for many of the people who participate in this Planet, this is a very important topic.

To put it plain and simple, Governor Sarah Palin's email accounts were hacked and i'm assuming 99% of all Americans over 18 know about this. For international readers, the email accounts of Governor Sarah Palin, vice presidential candidate for the Republican party, were hacked. The hacker, an amateur, posted both the results and the attack vector online to 4chan, an internet forum, which led to the quick discovery of his identity. It turns out that he is the son of a democratic Senator, although since nothing has gone to court yet, no one knows what the penalties are.

I direct you to this soundbite from the McCain campaign:

"This is a shocking invasion of the governor's privacy and a violation of law."

Indeed, one reason why it's illegal is to protect people from using such private information to harass her and her family, by using cell phones numbers and other private information retrieved out of the email accounts. Most importantly though, this highlights the dangers of having private information leaked to anyone.

Which brings me to my next point. Sarah Palin should be impeached and removed from all political office. I direct you to the information leaked about the attack.

If you have a look through those emails, some of them are personal or friendly, but in between there are numerous emails regarding State business. Anyone who works at Red Hat and is forced to use the bloatware called collaboration software, instead of being allowed to use a more convenient GMail account should automatically understand why this is a severe problem.

Yahoo email is neither private nor secure. The government can do all the handwaving magic it sees fit, but nothing will change the fact that Yahoo is an international company that presents a very high target to hackers. Thus Yahoo is 100% insecure. Furthermore, Yahoo has full access to emails they host and transmit. Therefore, there is no privacy, and any sensitive government issues could be revealed to the whole world. When you consider the information a VP is privy to, let alone a governor, the potential for misuse is scary. If you want to talk about radicals destroying a large nation for fun or profit, this is the way to go. If you want to discuss shady deals between politicians being revealed, carelessness like this will only make life much easier. Each state has an IT infrastructure as does the US Government, which is secured by one of the best security systems in the world. Using a Yahoo account is downright foolish.

Furthermore, privacy is also there to protect individuals from other malicious individuals. It's tragic, but a matter of ironic justice that Sarah Palin's family is suffering from the exact issues that are brought up when discussing the importance of privacy and data protection.

Yahoo mail is also run outside of the government systems. If you think the data retention policies of the Whitehouse have been bad in the past 8 years, just wait till Sarah Palin comes to power. They won't even exist! Data retention is the law for many reasons, least of all to track the doings of public officers and employees of public corporations. These rules are there to protect the American people and anyone doing business with Americans. While discussions about the data retention policies are reasonable, the bottom line is, without one, our individual rights are doomed. By using Yahoo mail, Sarah Palin has given the middle finger to the systems that keep politicians on the straight and narrow. As a politician who 'cleaned up' Alaska, she should understand this better than most politicians.

My take on this is that Palin didn't do this out of any malicious intent herself. I can imagine that she found the state provided system slow, complicated and onerous, so she decided to use an 'easier' solution. Given the magnitude of discovery, in most places i've worked, anyone who screwed up so bad would probably be fired. There is plenty of room here to make the 'ignorant/unintelligent soccer mom' argument, but she is still an elected politician, which means even a soccer mom would be smarter than that....

Despite this, it's clear that Sarah Palin knows very little about technology, the Internet, and most importantly the laws surrounding it. What ever reason she had for not using a state provided email address shows she thinks some need of hers trumps years of experience that IT professionals have had with privacy and security. On a personal note, it's insulting and disgusting. On a broader note, Sarah Palin is not fit to be a politician in the 21st century, let alone Vice President. Finally, it's clear she's doing something very wrong in Alaska already. She needs to be impeached.

Review Request

Can someone review this review request?

This is FreeJ in all its mighty glory. One nice thing about it is that the upstream developers have asked me to become a maintainer, just to keep the spec file upstream. The FreeJ developers certainly 'get' open source :).

RPMs of FreeJ for Fedora 9

I've been a bit pokey about this too, but I've finally compiled the BLAG Linux SRPMs of FreeJ for Fedora 9. Unfortunately, FreeJ depends on libffmpeg, and cannot go into Fedora proper. Nevertheless, it can have a very welcome place in RPMFusion or Livna.

To rip off the description from the homepage:

FreeJ is a vision mixer: an instrument for realtime video manipulation used in the fields of dance teather, veejaying, medical visualisation and TV.

FreeJ lets you interact with multiple layers of video, filtered by effect chains and then mixed together. Controllers can be scripted for keyboard, midi and joysticks, to manipulate images, movies, live cameras, particle generators, text scrollers, flash animations and more.
All the resulting video mix can be shown on multiple and remote screens, encoded into a movie and streamed live to the internet.

FreeJ can be controlled locally or remotely, also from multiple places at the same time; it can be automated via javascript to be operated via MIDI, Joysticks, wiimotes, mices and keyboards.

FreeJ can be found at its homepage, at:

The RPMs are available on my fedorahosted space. Since the RPMs depend on 'non-free' software, although do not ship any non-free bits themselves, i have created a new non-free repo available at:

I would like to put this package up for review. To those maintainers responsible, would i be better off submitting a review to livna or to rpmfusion?

Ubuntu's Netbook packages available for Fedora

Jonathan Roberts has so kindly updated and rebuilt packages for optimizing Gnome to work on Netbooks and other small screen devices. These packages are a few tools for Gnome that have been written by a few developers inside Canonical that work on any Gnome system. I've updated my repo to host them for now, until they can pass the review. They are available at

The SRPMs and SPEC files are there too, so feel free to rebuild them for other versions of Fedora or other RPM based distros. If you send the packages to me, i'll throw them up there in that space too.

On 8/23/04

In August, 2004, I opened a GMail account after begging a lucky friend for an invite. I received an email titled: Gmail is different. Here's what you need to know.

This included the much discussed whopping 1GB of free storage that of course no one would ever sanely fill, no matter how insanely Google gave out free space. Then suddenly it was 2GB, and then one day Google added a crazy man counter to the GMail login page counting up the amount of available space.

Today, I noticed the following message at the bottom of my GMail account:
You are currently using 1094 MB (15%) of your 7142 MB.

I finally did the impossible!

(Now for breakfast at Milliways.)

In search of a good mailer

Dear Lazyweb,

in the 10 or so hours i have available for Fedora and Red Hat business a week, it seems i spend about five of them wrestling with Zimbra to go through mailing list traffic. I've noticed a bunch of personal emails have gotten lost in the stream. It's obvious i need a better tool to work with. I'm sure many of you have your own personal favorite email reader, which you would just love to rave about. I'm open for something new, provided it can do the following.

I need something that can filter and process email *fast*. Whether it has some magic code that enables it to do IMAP at lightening speed, or maintains a local cache and pushes updates to IMAP in the background, i don't care, so long as it is fast.

I need the ability to label emails with more than one label at a time. This is important for two reasons. One, i label things with Todo and Priority flags based on filters. Two, conversations can cross mailing lists, i want a single thread to have two labels.

Finally, i need the ability to view a discussion by thread, and not just as a series of single emails. Zimbra is really bad at this, and evolution is only marginally better. Unfortunately, either working with the Zimbra web client or the Zimbra connector for Evolution are both recipes for disaster.

As extra credit, any scriptability in Python is definitely worth some serious extra credit.

Any recommendations?

Is it a Browser? Is it an Operating System?

Lately, there's been alot of commotion over Google's latest blitz in the Browser Wars. In the past week, I've seen a million and one opinions ranging from 'oh, another browser, *yawn*', all the way to 'OMGZ, it's the Google OS arisen!'. It's all rather silly.

Let's look at what Google has done. Probably the most original thing in Chrome is that there are tabs where the title bar used to be. The person who can script them out and make them accessible through libwnck or some similar desktop environment based API will certainly get alot of kudos from me. Really, the concept does not belong to Google, but I believe the credit should go to Opera for first integrating the browser widgets with the tab. Another revolutionary concept is binding processes to either tabs or sites, or other process splitting criteria. Again, the credit goes elsewhere, to Microsoft, but thoroughness that Chrome uses is pretty remarkable. In fact many of the 'unique features' in Chrome have already been implemented elsewhere, in some fashion.

Well, what is it that catches the eye? Is it the super optimized Javascript runtime, that supposedly is only really an evolutionary step? Is it that they used Webkit, the poster child for non Linux Open Source cool stuff? I think I found what makes it so special. Google was smart and realized that profiling websites to improve performance is a badly needed developer feature. So they stuck the label 'process manager' on it, and snuck it in like some trojan horse, underneath all that glittery and shininess. Most of the 'Google OS' arguements i've heard are fixated on this one feature as either the mark of the beast of the signs of messianic times.

It's not really just the process manager that spells something different for Chrome. When you go through the list, there are *alot* of features. Each one is done 'differently'. Most importantly though, is how well they come together to form a single paradigm. The paradigm is simple. The user loads a website up, which runs in a bottle. That bottle can be moved around on the desktop in some basic ways, from window to window, or in a standalone window, manageable by the Desktop Environmen's own window manager. I'm presuming that in the future, Google intends to expose a few javascript APIs that will let the website customize the look of its bottle and provide clues to the Desktop Environment. Namely, the website can not use a toolbar, or use a custom toolbar. Perhaps the website can even come with a code layer that is like Mozilla's own chrome, used to do many tricks in Firefox. Or maybe, the website will expose information about what kind of window is being displayed, whether it's a long term window or a transient dialog box. It might even expose context information to Nepomuk about its purpose and its semantic connection to the rest of the world, along with some state token to reload it back to its previous state.

Actually, these are things that Adobe Air and Mozilla Prism aim to do as well. I saw an excellent talk at FOSDEM last February on Mozilla Prism, and it was clear to me that this is the direction the modern browser is going to take. Since Google's Chrome still just works on Plain Ol' HTML and Javascript, i'm hoping that Google is willing to collaborate with Mozilla and Adobe in using the same APIs for each of their respective products.

Chrome isn't an OS though. If it was, where is the Desktop Environment? Where is the kernel to run it all? Where is the hardware support? Where are the millions of man hours that go into releasing a top notch operating system? Too busy writing browsers apparently. Chrome is no more an OS than .Net or Python are OSes either. Chrome is a virtual machine / application container. Way back when, in 1995, there was a question on how to run code both on a client machine and a more powerful server. Way back in 1985 the same question existed. There are rather large sections of Tannenbaum's Principles of a Modern Operating system that go into RPC functions and function stubs. For those of you with long memories, you should all remember how Java was supposed to revolutionize the web, by making it more 'desktop application-like'. As a developer of web applications, i always struggle with the concept of how my code runs like a weird application in the server space, but just a bunch of documents in the client space. I really would like to see more tools that unify the design a bit more, and many of those kinds of tools are coming of age.

Google has been at the forefront of these design paradigms, with Google Gears as their showpiece. Having little personal experience with Google Gears itself, i can't really comment on how it works with Chrome. Just realizing though, how cleverly Google has wrapped an essentially document oriented display framework with a sophisticated programming language on top into a virtual machine system that can interact with the user's desktop in one smooth paradigm, and I can't call it anything but a Virtual Machine.

Random Musing

My brother is asking me about a portable way to take programs and music with him, and just ride piggy back on anyone's computer around. I figured the obvious answer is a persistent Fedora LiveUSB on a really large USB stick. But then I realized, he would be limited to only using i386 computers. The random musing for the day, what would it take to build packages and distros that are akin to "Universal Binaries" found in Mac OS X.

I realize the OS will definitely be bigger, without a doubt. There are also a few concerns, such as using different bootloaders for the various architectures, and then autodetecting the right kernel, and such. Is there a demand for such a thing?

My brother also mentioned he would like to be able to start up the OS image once in Wintendo, or some other OS, in cases where he can't restart the computer, or the computer can't boot up from USB. What would it take to include some virtualization platform in the livecd-to-disc tool that could work in Wintendo so all the user needs to do is run some program and get a popup window with their ever so useful persistent Fedora LiveUSB?

Avidemux is awesome.

The topic says it all. I took a random video of some new lighting toys I got for my room to show some friends, and the camera spit out a 300mb AVI that I knew would choke several people's intarweb trucks. A bit of googling, and I got the name avidemux which was fortunately in that repository which shall not be named. One yum query later, and I even see there's both a gtk and qt version.

I install the GTK version, poke my nose around a bit, tinker with a few features, and 10 minutes later, I've spit out a 40mb mkv encoded in h264 and mp3. The quality is great, and I needed to know only a few basics about video encoding. I'll have to pose the granny test on my family later, but for a power user, the program is excellent.


Xmonad 0.8 Released

Yup, that's right, after a long wait, the latest xmonad has been released. If you're looking for packages, skip to the bottom.

There probably is no real reason why it took so long to be released. Up until 0.7, xmonad was facing roughly a 1-2 month release cycle with alot of rapid and rabid development in between. The fundamental changes to xmonad 0.8 since 0.7 are minor, and fall chiefly in the refinement category. It seems that development to xmonad has become relatively stable. One of the reasons to push the release was that there was so little development on the core parts to begin with. So the decision was made, and the release went by really smoothly.

This does not mean that xmonad is starting to die out. There are two things that make xmonad radically different than many other window managers. First of all, xmonad is based on some fundamental mathematical principles and data structures common to the functional programming world. The original goal to produce a functional window manager (no pun intended, although feel free to interpret one in ;) ) has essentially taken a year to develop from start to finish. It also uses some highly testable development methods including unit tests exposed to QuickCheck, the haskell unit tester, that greatly increase stability. Stable, if slow, development of xmonad implies that after a year of public usage, all the boiler plate code around the window manager has been refined and tested by a large number of users into some elegant minimal code, and by minimal, i mean 1045 significant lines of code style minimal.

The second important component is the contrib library, which is really quite essential to development. It is another ~9000 SLOC with a number of components to make using xmonad far easier and more flexible. In the true functional style, they are just a bunch of user submitted functions that different users have found useful for others too. For example, it includes fancy advanced layouts, layout combinators, alternate syntaxes for window management and key commands, random tools for outputting important information to dzen, or other tools, and for interacting with other parts of the system. Not a single line of code is actually run unless the user uses it.

The config file itself is actually just a haskell program cleverly disguised as a config file. In this latest release, there is an add-on in contrib that will even convert other config file formats into a haskell file, compile it, and run it, all in the background. The only components that are included in the run time are the ones being used. Of course, as a user, you never need to work with compiling your own xmonad window manager; part of that 1000 lines of code is the boilerplate to automatically look for your ~/.xmonad/xmonad.hs, compile it, and load it up, without much trouble. You can even make changes, reload your WM, and that same boilerplate will just pass your session on to the newest version.

I've built some packages, which are available at my personal repo at:

If you are already using my packages and repo, you should automatically get updates through yum. These packages are currently for Fedora 9, i386 only, but if anyone submits some builds for other archs/platforms, i'll be glad to stick them in the repo.

On a side note, I'm having some trouble signing my packages. Anyone know how to make sure rpmsign is using the right gpg key to sign packages?

Finally done with Haskell things

After nearly 9 months, I am finally at the point I wanted to be regarding Haskell. Last January i wanted to submit packages for my favourite window manager to Fedora. I got blocked because of a lack of packaging guidelines and familiarity with Haskell or the Glasgow Haskell Compiler.

I'll admit the process went alot slower than I would have liked, but it was an incredible learning process. In working on the guidelines, I learnt alot about how to get involved in Fedora, how to work with the myriad of communities and committees and boards and groups involved. I got to meet all sorts of people in the Fedora world online and offline. I probably annoyed some people being a crazy upstart kid with all sorts of crazy ideas, but it seems to have turned out alright in the end. I also learnt many random technical facts about how GHC puts together code, and RPM in a display of shocking intimacy that would probably make even my most 'sexually progressive' friends blush. (And believe me, they make everyone else blush.) For someone who 'just wanted to learn how to make RPMs', it was a bit of an intense introduction.

If you're curious, I have several bugs that track the progress of things. I still have a bit of a confusing mess to sort out about handling libraries, but I think I'm a bit tired from all the heat. Anyone familiar with summers in Northern Europe can well understand the problems I'm having in 32 degree weather (Centigrade). (That's 90 degrees Fahrenheit.)

Without further ado:
macros for ghc and rpm: