How To: Save yourself from stupid Tech Support Questions

Almost every other geek is pwned by his friends or people he/she knows by their stupid tech support questions. And sometime they drag you to the limits that you get frustrated enough to shoot yourself and bang your head onto your computer screen ๐Ÿ˜› How on earth can someone be so stupid ๐Ÿ˜› But luckily I found a Pidgin Plugin called STFW(Search The F**king Web). This is one really awesome plugin I have seen recently and I (and most other geeks) needed something like this for ages :)

What it does?

When somebody asks you a question, you can reply back with relevant keywords from the message you received prefixed with the command /stfw. The plugin will automatically convert the keywords to a URL understood by the site Let Me Google That For You ( and asker will get a URL like this

How to use?

The Download, installation and usage instruction can be seen on plugin page. So, when someone ask you “Wireless not working on my laptop”, just reply back with the following message

/stfw Wireless not working on my laptop

C’mon guys, ask me tech support questions ๐Ÿ˜›


How To: Configure Dual Display with ATI Radeon (fglrx)

As promised in my last post (News: ATI Catalyst Display Drivers 9.9 Released), I am back with a post on configuring dual display with ATI Radeon HD Graphics Card and proprietary catalyst (fglrx) drivers from ATI.

Hardware Used

Graphics Card: ATI Radeon HD 3200 (256MB, onboard)
Monitor 0: ViewSonic VG1930WM 1440×900 (19″ LCD, Connected via DVI port)
Monitor 1: Samsung SyncMaster 793S 1280×1024 (17″ CRT, Connected via VGA port)

Types of Dual Display

  • Mirror: Both screens have same content, identical refresh rate and resolution.
  • Clone: Both screens have same content but refresh rates and resolutions can be different.
  • Horizontal: Both screens can have different content, refresh rates and resolution. Screen 1 is left or right of Screen2.
  • Vertical: Same as horizontal. The only difference is that Screen1 is above or below Screen2.

In this post, we are interested in Horizontal setup with xinerama on. This way we can have two desktops allowing full screen modes on both of them and allowing us to drag and drop windows from one screen to the other.

Install ATI Drivers

If you don’t have ATI drivers installed already, follow this How To: Install ATI Catalyst (fglrx) Drivers on Fedora 11 (works for any version of ATI Catalyst drivers).

Generate xorg.conf file

If you don’t see the xorg.conf file at /etc/X11/xorg.conf, then you need to generate it to proceed to next step. Use the following command as root to generate one

[root@fedora ~]$ Xorg -configure

This command will generate the default xorg.conf file at /root/ Copy it to /etc/X11/xorg.conf.

[root@fedora ~]$ cp /root/ /etc/X11/xorg.conf

Backup xorg.conf file

Backup your original xorg.conf file so that you can restore it in case the configuration doesn’t work the way you expected.

[root@fedora ~]$ cp /etc/X11/xorg.conf /etc/X11/xorg.conf.backup

Generate Configuration for Dual Display

Now we are ready to generate the configuration for dual display. Use the following command with appropriate arguments (in accordance with your hardware configuration)

# --screen-layout will place second screen on left of your first screen. Other possible values are right,above,below.
# --xinerama=on option enables you to have two different desktops and one of them being passive.
# You can drag and drop windows from one desktop to the other. Task bars appear only on one of the desktops.
[root@fedora ~]$ aticonfig --initial=dual-head --screen-layout=left --xinerama=on
# --resolution=_screen_number_,widthxheight
[root@fedora ~]$ aticonfig --resolution=0,1440x900 --resolution=1,1280x1024
# Set horizontal sync and vertical refresh rates for both monitors.
[root@fedora ~]$ aticonfig --hsync=0,30-60 --hsync=1,30-60 --vrefresh=0,30-60 --vrefresh=1,30-60

You can download my xorg.conf file via this link.

Reboot or Logout and Login Again

If you just setup your ATI drivers and configured the dual display, you need to reboot so that fglrx module can be loaded properly. If you rebooted after setting up the drivers, just logout and login again to checkout your dual display :) If everything works fine, say thanks to me and if not blame ATI ๐Ÿ˜›

Adjust DPI for Normal Font Size

I faced a problem with my font sizes being too big while using xinerama. It was easy to fix by adjusting DPI. Go to System -> Preferences -> Appearance. Go to Fonts tab. Click Details located near the bottom right corner. On that window, try descreasing the “Dots Per Inch” value. Mine worked fine with 85 DPI.

Below is an image of my dual display setup. Click to enlarge.

Dual Display Configuration ViewSonic Samsung Using ATI Radeon Catalyst (fglrx)


News: ATI Catalyst Display Drivers 9.9 Released

AMD has released the next version 9.9 of its ATI Catalyst display drivers for Linux. The drivers can be download from ATI Catalystโ„ขย 9.9 Proprietary Linux x86 Display Driver Page. I have already tried them with kernel and they seem to work fine without SWCursor hack. But I still see corruptions around cursor while moving cursor in a playing video or in Compiz. BTW I got dual display working with Xinerama turned on with this version. I’ll post a HowTo about the same very soon. I think it’ll take some more time before the drivers are completely stable. AMD has been doing a really good job in rolling out drivers at regular intervals.

Note : The installation process is same as version 9.8 and can be access at How To: Install ATI Catalyst (fglrx) 9.8 Drivers on Fedora 11.


How To: Recover Deleted Files in Linux Using Photorec

Frequently I get messages like “I have accidentally deleted my project. Is there any way to recover it in Linux?” or “I worked really hard on that program and managed to deleted it right before submission :( How do I recover?”. Well I didn’t really have any idea on “How to actually recover deleted files in Linux”.

A few days back I was designing the new logo for Videocache in Inkscape. After finishing the design, I saved the svg file carefully. And deleted other images which I embedded in the logo. A few moments later I realized that I just screwed up myself by deleting all those files as the svg file is now good for nothing.

I searched a lot on recovering files in Linux but in vain. Then a friend (bitgeek) told me about Photorec. I managed to recover all the files using photorec. I thought it would be a good idea to let others know and spread a good word about Photorec. Below is a step by step howto on using Photorec to recover your files.

What is Photorec?

From Photorec website,

PhotoRec is file data recovery software designed to recover lost files including video, documents and archives from Hard Disks and CDRom and lost pictures (thus, its ‘Photo Recovery’ name) from digital camera memory. PhotoRec ignores the filesystem and goes after the underlying data, so it will still work even if your media’s filesystem has been severely damaged or re-formatted.

For This HowTo

Lets say I had a file download_arrow.png in /home/saini/Desktop which I have removed accidentally. Login as root and create a directory recover which will be used to store all the recovered files.

Install testdisk/PhotoRec

Photorec comes as a part of testdisk package in Fedora (I hope its same for other distributions as well). Use yum to install testdisk.

[root@fedora-tips ~]$ yum install testdisk

Launch Photorec

Once you are done with installation. Open a terminal and launch photorec (as root).

[root@fedora-tips recover]$ photorec

Select Hard Disk

If you have more than one hard disk in your system, select the one from which you have deleted the file(s).

PhotoRec Hard Disk Selection

Select Partition Type

If your hard disk has Linux partitions, then select [Intel].

PhotoRec Partition Selection

Select Filetype Option

Move to [File Opt] and press enter. Here you can disable all file types by pressing ‘s’ . Use space to toggle the check button. Now since we removed a png file, we are going to check only png file type.

PhotoRec Filetype Selection

Select Options

Photorec also has a list of different options. Under normal circumstances you don’t need to modify them

PhotoRec Option Selection

Select Partition

Move the selector to the partition from which you have removed the file. Then press enter on search.

PhotoRec Partition Selection

Select Filesystem Type

If you are using Linux, its going to be ext2/ext3/ext4. So the default selection is file.

PhotoRec Partition Selection

Select Space for Analysis

Select free if you didn’t write to that partition after removing the particular file otherwise select whole.

PhotoRec Space Selection

Select a Directory to Recover Files

Now select the path where the recovered files will be stored. Then press ‘Y’.

PhotoRec Recovery Directory Selection

Recovery Progress

Photorec will show how many files it has recovered.

PhotoRec Recovery Progress

All recovered file will be stored in the directory selected above. Open them in a file browser and you’ll get the removed file there. I hope this howto will help you recovering files you accidentally delete :)


TIP: Simple Regular Expression for Email Validation

I was playing around with Ruby on Rails and needed an email field for some application. I thought of validating the email address before actually saving it. Googled for same and got tons of results, but none of them was perfect. Few were somewhat exhaustive but horribly difficult to understand and those which were simple wereย  not exhaustive enough for practical use. I thought I’ll just write the regex myself and came up with the following. I have tested it for few weird cases like an email hosted on (a subdomain deep down the hierarchy) etc.


I hope it’ll be of help. And don’t forget to pen down your suggestions via comments.


How To: Install/Configure GNUMP3d – Streaming Audio Server


GNUMP3d is the GNU Streaming MP3/Media Server written in perl. Our mission is to setup GNUMP3d and stream audio over LAN or over internet. Below are the essential steps to install and configure GNUMP3d.


Download latest version of GNUMP3d from GNUMP3d Website.


[kulbirsaini@fedora ~]$ tar -xjf gnump3d-x.x.tar.bz2


[root@fedora ~]$ cd gnump3d-3.0
[root@fedora ~]$ make install (as root)

Now gnump3d is installed on your system. Now you need to configure it according to your taste.


The configuration file is located at /etc/gnump3d/gnump3d.conf. For casual use, you just need to configure port, binding_host and root.

# Port to which gnump3d will be accessible via web interface or via a media player like xmms or winamp.
port = 1111
# The IP Address where gnump3d will bind itself.
binding_host =
# If you want the stream to be accessible via a fully qualified domain name, set hostname variable.
# You don't need to set this in most cases e.g. while setting up gnump3d on LAN.
hostname =
# The directory where are your music files resides.
root = /stuff/Music/

Though you can skip rest of the configuration, you may try to explore other options. My gnump3d.conf file can be download from here.

Thats all you need to do to configure gnump3d.


Now you need to index all you music collection (the audio files in gnump3d root). Run the following command to index

[root@fedora ~]$ gnump3d-index --verbose

Run gnump3d

Once the indexing is done, you are all set to run gnump3d. By default gnump3d tries to index all files whenever you start it, to avoid this we need to use –fast option.

[root@fedora ~]$ gnump3d --fast

By default gnump3d runs in foreground. If you want it to go in background and run quietly, run it as follows.

[root@fedora ~]$ gnump3d --fast --background

Accessing Media Server

To access your gnump3d streaming media server, please visit url http://ip_address:port/ .

Run at startup

If you want gnump3d to start when your computer starts add the following line to /etc/rc.local file.

gnump3d --fast --background

Feel free to comment in case you have a problem.


How To: Install and Configure GitWeb

UPDATE : I recommend using GitList instead of GitWeb. GitList is much easier to setup and has a better web interface. Continue reading this post if you looking for GitWeb setup instructions specifically.


Setting up gitweb (web interface for SCM software git) for your project’s git repository for public access and developer commits via ssh.


  1. You already have your project’s git repository.
  2. You have hosting space somewhere to host gitweb.
  3. You have root access.
  4. You are using Apache as webserver.

Example for this howto

Project : VideoCache
Domain for gitweb :
URL for git access for videocache :
Actual path on server : /home/saini/domains/
Git repository : /home/saini/projects/videocache/


Installation is pretty easy. Just one single command would do everything.

[root@localhost ~]# yum install gitweb (do as root)

This will create a directory /var/www/git which is default for gitweb.

Copy the directory /var/www/git/ to /home/saini/domains/

[root@localhost ~]# cp -r /var/www/git /home/saini/domains/


1. GitWeb

Open the file /etc/gitweb.conf (it may or may not be there) and add the following lines to it.

# Change This
$projectroot = '/home/saini/domains/';
# Change This
$site_name = "Kulbir Saini's git trees.";
# Don't Change the variables below
$my_uri = "/";
$home_link = '/';
@stylesheets = ("/gitweb.css");
$favicon = "/git-favicon.png";
$logo = "/git-logo.png";

2. Apache

Open the file /etc/httpd/conf.d/git.conf and clear all the lines that are already there and add the following lines to it

  DocumentRoot /home/saini/domains/
  ErrorLog "/home/saini/domains/"
  CustomLog "/home/saini/domains/" combined
  SetEnv  GITWEB_CONFIG  /etc/gitweb.conf
  DirectoryIndex gitweb.cgi
    Allow from all
    AllowOverride all
    Order allow,deny
    Options +ExecCGI
    AddHandler cgi-script .cgi
      SetHandler cgi-script
    RewriteEngine on
    RewriteRule ^[a-zA-Z0-9_\-]+\.git/?(\?.*)?$ /gitweb.cgi%{REQUEST_URI} [L,PT]

3. Git repository configuration

Go to your git repository (/home/saini/projects/videocache/) and make the following changes.

(a). Open file .git/description and add a short nice description for your project.

videocache is a squid url rewriter plugin written in Python to facilitate youtube, metacafe, dailymotion, google, vimeo, msn soapbox,,, videos and audio caching.

(b). Open file .git/config and append the following lines

  owner = "Kulbir Saini"

Copy project’s git repository for gitweb

Copy the /home/saini/projects/videocache/.git directory to /home/saini/domains/

[root@localhost ~]# cp -r /home/saini/projects/videocache/.git /home/saini/domains/

Finishing Step

Restart Apache webserver.

[root@localhost ~]# service httpd restart

Now you can browser a list of your projects’ git repositories at .

Adding another project repository

Just copy the project repository’s .git directory to /home/saini/domains/ And it’ll be shown on the list.

Committing (pushing) to the repository

For committing to the repository via ssh use the following command.

# Pushing everything (Please see the username)
[root@localhost videocache]# git push --all ssh://

To update tags on the remote repository use this command.

# Pushing all tags
[root@localhost videocache]# git push --tags ssh://

Well, if you consider just the web interface and committing part for your project, thats all. But things can be fine tuned further. Below are few hacks!

1. Enabling nice urls.

By default the urls for browsing repository via git web are pretty crappy and difficult to remember. The RewriteRule and RewriteEngine lines in your Apache configuration file (/etc/httpd/conf.d/git.conf) takes care of that and produce nice and clean urls.

So you can browser the repository via instead of;a=summary.

2. Enabling remote ls (git-ls-remote or git ls-remote)

This is the most trickiest part. If you try the command below, it won’t produce any output

[root@localhost ~]# git-ls-remote

You need to go to project’s repository in gitweb and then run the following command to update the server info for git.

[root@localhost ~]# cd /home/saini/domains/
[root@localhost ~]# git-update-server-info

Try the ls-remote command now and it should succeed by producing all the branches and tags in the remote repository.

But there is a problem, you have to run the above command after every commit to the remote repository. To solve this issue, you can enable post-update hook for the project’s repository in gitweb. Use the following command to enable it.

[root@localhost ~]# cd /home/saini/domains/
[root@localhost ~]# chmod +x post-update

The above command will update the server info automatically every time you commit.

Thats all you need to do for setting up gitweb. I hope this will be helpful.


How To: Boot Fedora Faster

Note: These tricks apply to any Linux based OS. But I have tested them only on Fedora, so can’t say whether they’ll work on other Linux(s).

My current Fedora installation is now almost one and a half years old. Yes. I am still using Fedora 7 ๐Ÿ˜€ I have Fedora 10 on my other machine. Coming to the agenda, my Fedora installation has grown beyond control and I have services from named, squid, drbl, privoxy, vsftpd, vbox*, smb and what not on a personal desktop. These services really force my system startup to slow down to more than two minutes. While shutting down, its very easy to just cut the power supply but while booting up I can’t help and it frustrates me. And what frustrates me further that I have 4GB DDR2 RAM and AMD64 X2 5600+ (2.8GHz x 2) and booting time is still more than two minutes.


  • Boot Fedora faster using whatever techniques possible.

Remove the services from normal order and delay their execution to a later stage. So, services like network, squid, privoxy, named, vsftpd, smb etc. doesn’t make sense unless I am not logged in and using them. Let us start them after we have login screen.

Turn off all the services by using the command

[root@bordeaux ~]# chkconfig service_name off

where service_name is the service you want to turn off.

Now create a file /etc/ Enter a line like this

[root@bordeaux ~]# service service_name start

for every service that you have turned off in the Step 1.1 and you want it to be running after your machine starts up. Now, your file should look like this

service network start &
service sshd start &
modprobe it87 &
modprobe k8temp &
/usr/bin/iptraf -s eth0 -B &
/usr/bin/iptraf -s lo -B &
service squid start &
service privoxy start &
service httpd start &
service mysqld start &
service named start &
service smb start &
service vboxdrv start &
service vboxnet start &
service vsftpd start &

Add the following line to /etc/rc.local file

/bin/bash /etc/ &

Done!!! Notice the &s in both files. They are for execution in background so that a process can block boot process. You’ll observe a drop of 10-20 seconds in system startup time.

Problem with Hack #1 : The execution is not really parallel. It executes like a process in the background. So we can’t get the real advantage of parallel execution.

Hack #2 solves this problem. Now we don’t put processes in background. We use daemon forking to fork a separate daemon process which will start all the services for us in parallel. Here we’ll get the real advantage and startup time will decrease further.

This step is totally similar to Step 1.1. So skipping it.

This step is also similar to Step 1.2. The /etc/ file should look like this.

service network start
service xinetd start
service crond start
service anacron start
service atd start
service sshd start
service rpcbind start
service rpcgssd start
service rpcimapd start
modprobe it87
modprobe k8temp
/usr/bin/iptraf -s eth0 -B
/usr/bin/iptraf -s lo -B
service nasd start
service squid start
service privoxy start
service httpd start
service iptables start
service lm_sensors start
service mysqld start
service named start
service nfs start
service nfslock start
service smb start
service vboxdrv start
service vboxnet start
service vsftpd start
service autofs start
service smartd start

Notice the absence of &s in the file.

Download the attached file attached at the end of this post or copy paste the following code to /etc/ file.

#!/usr/bin/env python
# (C) Copyright 2008 Kulbir Saini
# License : GPL
import os
import sys
def fork_daemon(f):
    """This function forks a daemon."""
    # Perform double fork
    r = ''
    if os.fork(): # Parent
        # Wait for the child so that it doesn't defunct
        # Return a function
        return  lambda *x, **kw: r
    # Otherwise, we are the child
    # Perform second fork
    if os.fork():
    def wrapper(*args, **kwargs):
        """Wrapper function to be returned from generator.
        Executes the function bound to the generator and then
        exits the process"""
        f(*args, **kwargs)
    return wrapper
def start_services(startup_file):
    command = '/bin/bash ' + startup_file + ' > /dev/null 2> /dev/null '
if __name__ == '__main__':
    forkd = fork_daemon(start_services)
    print 'Executing ', sys.argv[1], '[  OK  ]'

Add the following line to your /etc/rc.local file.

/usr/bin/python /etc/ /etc/

Thats it. Done!!! Now you’ll experience a boost of about 25-30 seconds of decrease in boot time.

Stats of my machine

With all services started in normal order : 2minutes.
With Hack #1 : 1minute 42 seconds.
With Hack #2 : 1minute.

Warning : These hacks may break your system and can make it unusable. Use at your own risk.


Humour: Funny Apache Logs

The other day I was debugging my drupal installation and had a look at the Apache error logs. And this is what I found ๐Ÿ˜€

[root@gofedora html]# tail -f /var/log/httpd/error_log
[Fri Nov 28 21:00:16 2008] [warn] long lost child came home! (pid 23229)
[Fri Nov 28 21:00:16 2008] [warn] long lost child came home! (pid 23230)
[Fri Nov 28 21:00:16 2008] [warn] long lost child came home! (pid 23231)
[Fri Nov 28 21:00:16 2008] [warn] long lost child came home! (pid 23232)
[Fri Nov 28 21:00:16 2008] [warn] long lost child came home! (pid 23233)
[Fri Nov 28 21:00:16 2008] [warn] long lost child came home! (pid 23234)
[Fri Nov 28 21:00:16 2008] [warn] long lost child came home! (pid 23235)
[Fri Nov 28 21:00:16 2008] [warn] long lost child came home! (pid 23236)
[Fri Nov 28 21:00:16 2008] [warn] long lost child came home! (pid 23237)
[Fri Nov 28 21:00:16 2008] [warn] long lost child came home! (pid 23238)

Reminded me of famous Indian saying, “Kumbh ke mele mein khoya wapis aa gaya“.

And Apache logs it as a warning. You long lost child has come home. You gotta run ๐Ÿ˜›


Info: Spicebird Beta 0.7 Final Released

Reporting from Spicebird blog,

Spicebird is a collaboration client that provides integrated access to email, contacts, calendaring and instant messaging in a single application. It provides easy access to various web services while retaining all the advantages of a desktop application. The application is based on projects like Thunderbird, Lightning and Telepathy and adds more functionality and integration among its components.

This release of Spicebird adds the following functionality:

  • Chat with friends on services like Yahoo, Google Talk, AIM, ICQ and Jabber
  • Add iGoogle Gadgets to Spicebird
  • Disable the applications that are unused
  • Access Google calendar
  • Experimental support for managing blogs
  • Available in more than 10 languages
  • Basic set of add-ons
  • Import data from Thunderbird, Outlook and Outlook Express

For a detailed description of this release, see the release notes.

Get Spicebird!

See how to install Spicebird on Linux. I’ll review the latest release very soon :)