topamax once a day

Compile Linux Kernel on Ubuntu 12.04 LTS

This tutorial will outline the process to compile your own kernel for Ubuntu. It will demonstrate both the traditional process using ‘make’ and ‘make install’ as well as the Debian method, using ‘make-dpkg’. This is a quick overview of the compilation process, for a more thourough walkthrough, see Compile Linux Kernel on Ubuntu 12.04 LTS (Detailed).  In both cases, we begin by installing some dependencies:

sudo apt-get install git-core libncurses5 libncurses5-dev libelf-dev asciidoc binutils-dev linux-source qt3-dev-tools libqt3-mt-dev libncurses5 libncurses5-dev fakeroot build-essential crash kexec-tools makedumpfile kernel-wedge kernel-package

Note: qt3-dev-tools and libqt3-mt-dev is necessary if you plan to use ‘make xconfig’ and libncurses5 and libncurses5-dev  if you plan to use ‘make menuconfig’.  Next, copy the kernel sources with wget:


Extract the archive and change into the kernel directory:

tar -xjvf linux-3.2.17.tar.bz2 cd linux-3.2.17/

Now you are in the top directory of a kernel source tree. Before building the kernel, you must configure it. If you wish to re-use the configuration of your currently running kernel, start by copying the current config contained in /boot:

cp -vi /boot/config-`uname -r` .config

Parse the .config file using make with the oldconfig flag.  If there are new options available in the downloaded kernel tree, you may be prompted to make a selection to include them or not.  If unsure, press enter to accept the defaults.

make oldconfig

Since the 2.6.32 kernel, a new feature allows you to update the configuration to only compile modules that are actually used in your system. As above, make selections if prompted, otherwise hit enter for the defaults.

make localmodconfig

Now you can configure the build with ncurses using the ‘menuconfig’ flag:

make menuconfig

or, using a GUI with the ‘xconfig’ flag:

make xconfig

Now we are ready to start the build. You can speed up the compilation process by enabling parallel make with the -j flag. The recommended use is ‘processor cores + 1’, e.g. 5 if you have a quad core processor:

make -j5

Once the initial compilation has completed, install the dynamically loadable kernel modules:

sudo make modules_install

Finally, install the kernel:

sudo make install


Debian Method:

Instead of the compilation process of above, you can alternatively compile the kernel as installable .deb packages. This improves the portability of the kernel, since installation on a different machine is as simple as installing the packages. Rather than using ‘make’ and ‘make install’, we use ‘make-kpkg’:

fakeroot make-kpkg –initrd –append-to-version=-some-string-here kernel-image kernel-headers

Unlike above, you cannot enable parallel compilation with make-kpkg using the -j flag. Instead, define the CONCURRENCY_LEVEL environment variable.


Once the compilation has completed, you can install the kernel and kernel headers using dpkg:

sudo dpkg -i linux-image-3.2.14-mm_3.2.14-mm-10.00.Custom_amd64.deb

sudo dpkg -i linux-headers-3.2.14-mm_3.2.14-mm-10.00.Custom_amd64.deb

Compile Cyanogenmod 9 for Galaxy Nexus

This tutorial will outline the process to compile Cyanogenmod 9 for the Verizon (LTE) Galaxy Nexus (aka toro, a variant of the tuna) on Ubuntu 12.04 LTS.  This process has changed a bit over time, notably with new hassles to configure the Oracle Java JDK.  While the tutorial is specific to the Galaxy Nexus, it generalizes to most devices supported by Cyanogenmod 9.  First, install and configure the Android SDK (more thorough info here):


tar -xvzf android-sdk_r18-linux.tgz

rm android-sdk_r18-linux.tgz

cd android-sdk-linux

tools/android update sdk – -no-ui

It could take a while for the updates to the Android SDK to download and install. Once that has completed, install the package dependencies.

sudo apt-get install git-core gnupg flex bison gperf libsdl1.2-dev libesd0-dev libwxgtk2.6-dev squashfs-tools build-essential zip curl libncurses5-dev zlib1g-dev pngcrush schedtool lib32readline-gplv2-dev

The next step is to download and configure the most recent Java JDK from Oracle.  This part of the tutorial is based on a nice tutorial from John Bokma.

Download the JDK from Oracle here:

sudo mkdir -p /usr/local/java

sudo mv ~/Downloads/jdk-6u31-linux-x64.bin /usr/local/java

cd /usr/local/java

sudo chmod +x jdk-6u31-linux-x64.bin

sudo ./jdk-6u31-linux-x64.bin

The installer will attempt to open a browser, but will fail. Presumably this is because the browser is unable to start as root, but this doesn’t seem to affect the install at all.  Now remove the installer, and create a symlink to /usr/local/java/latest.  This way a new JDK can easily be configured by just moving the /usr/local/java/latest symlink to the most recent version:

sudo rm jdk-6u31-linux-x64.bin

sudo ln -s jdk1.6.0_31 /usr/local/java/latest

Next we will need to configure some environmental variables so the JDK will be recognized. Add the JAVA_HOME and JRE_HOME . For example,

sudo gedit /etc/environment

Then replace the contents with the following:

JAVA_HOME="/usr/local/java/latest" JRE_HOME="/usr/local/java/latest/jre" PATH="/usr/local/java/latest/bin:\ /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games"

If you don’t want to log out and log back in to have the updated /etc/environment parsed by the system, you can use the ‘source’ command:

source /etc/environment

You can test if it is working correctly using

java -version  #  and  javac -version

The output should look something like this:

java version “1.6.0_31” Java(TM) SE Runtime Environment (build 1.6.0_31-b04) Java HotSpot(TM) 64-Bit Server VM (build 20.6-b01, mixed mode)

Then, get the repo tool (a wrapper for git) and make it executable.

mkdir -p ~/bin
mkdir -p ~/cm

curl > ~/bin/repo

chmod a+x ~/bin/repo

Initialize and sync the repo. Change the -b option to checkout another branch (like -b gingerbread). NOTE: reboot may be required for repo to work!

cd ~/cm

repo init -u git:// -b ics

repo sync -j16

After the source has synched, we need to run a script to get the prebuilt binaries, including ROM Manager and Terminal.

cd ~/cm/vendor/cm


Now setup the environment with envsetup

cd ~/cm

. build/

Execute the ‘brunch’ command to see the list of build targets, and make your selection.  For the Galaxy Nexus, select cm_toro-userdebug, for Nexus S, select cm_crespo-userdebug, for Xoom, choose cm_wingray-userdebug


Once a selection is made, the build should start. If it doesn’t, try running the ‘lunch’ instead. Make your selection, then run ‘mka bacon’


mka bacon

If that doesn’t work either, explicitly execute ‘make bacon’. You can use the -j compiler flag to enable parallel make.  The recommended use is ‘processor cores + 1’, e.g. 5 if you have a quad core processor:

make -j[#ofcpus] bacon

Once the build completes, the output will be located in ~/cm/out/target/product/toro/.  This folder contains the system and boot images, as well as a compressed and signed Push the file to the sdcard of the device, and reboot into recovery:

adb push ~/cm/out/target/product/toro/ /sdcard/

adb reboot recovery

Once booted into recovery, MAKE A BACKUP, then flash the


OpenCV + Python

Here are some of the more interesting OpenCV demos using the Python wrapper.  The installation process on Ubuntu is covered in my previous post, OpenCV + Ubuntu. The demo scripts are located in samples/python within the OpenCV release.

The cam shift sample below demonstrates the color/object detection capability of OpenCV. To set the object/color to track, click and drag a box on the video using the mouse.  The histogram window will display the target for OpenCV to locate and track within the field of view.  The more distinct the color from the background of the scene, the better it works.  The trailing 0 at the end means to use camera input device 0.

python ./ 0

To run the face detection demo, you will need to use the -c command line option to specify the classifier to use. Different classifiers detect using different algorithms and so are better suited to certain detection condition, angles, etc. compared to others.  The classifier used in the demo works best with faces directly facing the camera, and doesn’t do as well with tilted, rotated, or otherwise not direct faces.  This is why some of the  titled faces in the Google image search part of the video fail to be recognized by OpenCV.

python ./ -c /usr/local/share/OpenCV/haarcascades/haarcascade_frontalface_alt.xml 0

If you don’t have a camera connected, and still want to verify that the Python wrapper is working correctly, you can run the previous examples  using an image or video file, otherwise try out the following examples (also in samples/python):

python ./

python ./

python ./

python ./

OpenCV + Ubuntu

Building OpenCV 2.3.1 from source on Ubuntu 12.04 x64. Here is an overview of the compilation of OpenCV with x264 and ffmpeg builtin. If you have completed my Kinect + OpenNI + PrimeSensetutorial, this will also support the OpenNI and PrimeSense drivers with OpenCV. This is largely based on the wonderful OpenCV tutorials from Sebastian Montabone and Osman Eralp. Before you start, make sure to have removed ffmpeg and x264 (if applicable):

sudo apt-get remove ffmpeg x264 libx264-dev

Now begin by installing the required dependencies:

sudo apt-get install build-essential libgtk2.0-0 libgtk2.0-dev gtk2-engines-pixbuf libjpeg-dev libtiff4-dev libjasper-dev libopenexr-dev cmake cmake-qt-gui python-dev python-numpy python-sphinx libtbb-dev libeigen2-dev yasm libmp3lame-dev libfaac-dev libopencore-amrnb-dev libopencore-amrwb-dev libtheora-dev libvorbis-dev libxvidcore-dev libhighgui-dev libgtkglext1-dev libdc1394-22-dev libboost-all-dev qtcreator libwxbase2.8-dev libwxgtk2.8-dev wx-common checkinstall libjack-jackd2-dev libsdl1.2-dev libva-dev libvdpau-dev libx11-dev libxfixes-dev texi2html zlib1g-dev libgstreamer0.10-0 libgstreamer0.10-dev gstreamer0.10-tools gstreamer0.10-plugins-base libgstreamer-plugins-base0.10-dev gstreamer0.10-plugins-good gstreamer0.10-plugins-ugly gstreamer0.10-plugins-bad gstreamer0.10-ffmpeg libv4l-dev

Create a directory for the sources:

mkdir ~/opencv cd ~/opencv

Next, clone, build and install x264:

git clone git://

cd x264

./configure –enable-static –enable-pic –enable-shared


sudo make install

The next step is to build and install ffmpeg:

cd ~/opencv


tar -xvjpf ffmpeg-0.8.10.tar.bz2

cd ffmpeg-0.8.10/

./configure –enable-gpl –enable-version3 –enable-nonfree –enable-postproc –enable-libfaac –enable-libopencore-amrnb –enable-libopencore-amrwb –enable-libtheora –enable-libvorbis –enable-libmp3lame –enable-libx264 –enable-libxvid –enable-x11grab –enable-swscale –enable-pic –enable-shared


sudo make install

NOTE: Do NOT clone the mainline source tree with git. This version is NOT compatible (I tried and failed several times!). I’m sure version 0.7 and 0.8 work, anything newer resulted in compilation errors later in the OpenCV build. Next, build and install OpenCV:

cd ~/opencv


tar -xvjpf OpenCV-2.3.1a.tar.bz2

cd OpenCV-2.3.1/

mkdir build

cd build

cmake-gui ..

Now click ‘configure’ and check the following boxes:






NOTE: you can also enable the CUDA extensisons if you have capable nvidia graphics card(s). Click ‘configure’ again, check the output and ensure that there are not any modules that cmake cannot find. If everything looks good, click ‘generate’ to create the makefiles, then close cmake-gui.


sudo make install

Finally, we need to make a few configurations for OpenCV. First, open the opencv.conf file with the following code:

sudo gedit /etc/

Add the following line at the end of the file(it may be an empty file, that is ok) and then save it:


Then edit the system-wide bashrc file:

sudo gedit /etc/bash.bashrc

Add the following new lines to the end of the file:

PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig export PKG_CONFIG_PATH

Now that everything is installed and configured, on to the demos!

cd ~/opencv/OpenCV-2.3.1/build/bin

Build/bin demos worth checking out that don’t require a webcam:




Build/bin demos using camera:




bgfg_segm c true




Google Earth + Mult-axis Controller

Six degree of freedom control for Google Earth using the 3Dconnexion SpaceNavigator on Ubuntu Linux.  Based on directions from here:

First, install the necessary package dependencies:

sudo apt-get install xinput xserver-xorg-input-joystick

Next we add a udev rule to automatically recognize the Space Navigator based on its vendor/product ids and create a symlink at /dev/input/spacenavigator. Create the following file as root:

sudo gedit /etc/udev/rules.d/90-spacenavigator.rules

and add the following line:

KERNEL=="event[0-9]*", SYSFS{idVendor}=="046d", SYSFS{idProduct}=="c62[68]", MODE="0664", GROUP="plugdev", SYMLINK+="input/spacenavigator"

NOTE: This appears to be multiple lines, but should be copied as a single line; udev rules cannot span multiple lines.

Next, we must modify the drivers.ini file to add support for google earth. This file may in exist in several locations depending on how you installed Google Earth. If you installed as root, edit the driver file here. Note: may also be located at /opt/google-earth/drivers.ini depending on software version.

sudo gedit /opt/google/earth/free/drivers.ini

If you installed Google Earth as your local user, edit the driver file here:

gedit ~/.googleearth/drivers.ini

Add the following lines to the SETTINGS stanza of the drivers.ini. Note: these paramaters can be manipulated to suit your own needs. The ‘gutter’ paramater is particularly useful as it defines the ‘dead zone’ around the center axis.

; Settings for multi-axis controllers

SpaceNavigator/sensitivityX = 0.125

SpaceNavigator/sensitivityY = 0.125

SpaceNavigator/sensitivityZ = 0.030

SpaceNavigator/sensitivityPitch = 0.01

SpaceNavigator/sensitivityYaw = 0.004

SpaceNavigator/sensitivityRoll = 0.007

SpaceNavigator/device = /dev/input/spacenavigator

SpaceNavigator/zeroX = 0.0

SpaceNavigator/zeroY = 0.0

SpaceNavigator/zeroZ = 0.0

SpaceNavigator/zeroPitch = 0.0

SpaceNavigator/zeroYaw = 0.0

SpaceNavigator/zeroRoll = 0.0

SpaceNavigator/gutterValue = 0.1

At this point the drivers should be fully functional for use with Google Earth. However, your OS may indentify the SpaceNvigator as a mouse, making control somewhat awkward. You can disable this behavior using the xinput set-int-prop command:

xinput set-int-prop “3Dconnexion SpaceNavigator” “Device Enabled” 8 0

The same command can also be used to re-enable the mouse behavior:

xinput set-int-prop “3Dconnexion SpaceNavigator” “Device Enabled” 8 1


Ubuntu + Kinect + OpenNI + PrimeSense

Getting the OpenNI and PrimeSense drivers working on Ubuntu

Here’s an overview of the process to get the OpenNI and PrimeSense drivers working with the Kinect and Ubuntu. Begin by installing some dependencies:

sudo apt-get install git-core cmake freeglut3-dev pkg-config build-essential libxmu-dev libxi-dev libusb-1.0-0-dev doxygen graphviz mono-complete

Make a directory to store the build, then clone the OpenNI source from Github.

mkdir ~/kinect

cd ~/kinect

git clone

Run the RedistMaker script in the Platform/Linux folder and install the output binaries

cd OpenNI/Platform/Linux/CreateRedist/

chmod +x RedistMaker


cd ../Redist/OpenNI-Bin-Dev-Linux-x64-v1.5.2.23/

sudo ./

Next, clone the Avin2 SensorKinect source from Github.

cd ~/kinect/

git clone git://

Run the RedistMaker script in the Platform/Linux folder and install the output binaries.

cd SensorKinect/Platform/Linux/CreateRedist/

chmod +x RedistMaker


cd ../Redist/Sensor-Bin-Linux-x64-v5.1.0.25/

chmod +x

sudo ./

Then download the OpenNI Compliant Middleware Binaries to ~/kinect
Select these options from the dropdown menus:
PrimeSense NITE Unstable Build for Ubuntu 10.10 x64 v

Extract the contents of the archive and switch to the Data directory contained within.

cd ~/kinect

tar -xvjpf nite-bin-linux-x64-v1.5.2.21.tar.bz2

cd NITE-Bin-Dev-Linux-x64-v1.5.2.21/Data

Now modify the license in the files: Sample-Scene.xml, Sample-Tracking.xml, and Sample-User.xml. Change

<License vendor=”PrimeSense” key=””/>


<License vendor=”PrimeSense” key=”0KOIk2JeIBYClPWVnMoRKn5cdY4=”/>

Change back to the NITE directory and run the install script.

cd ..

sudo ./

That’s it! If you followed steps through to here you should be able to run the sample applications.  The OpenNI samples are here:


and the PrimeSense samples are here:


Note: if you get the error:

InitFromXml failed: Failed to set USB interface!

the solution is to remove the gspca_linect kernel module:

sudo rmmod gspca_kinect