Torch7 install in Fedora 22

[UPDATE 25/06: The patch that i wrote for Fedora 22 support has been merged upstream. Hence, the steps on Torch7 website can be used directly instead of following the below steps.]

Fedora is and will always be my first choice for a distro.. Given that I wrote about installing Torch7 in Ubuntu 15.04 recently, how could we leave behind Fedora!!

Unfortunately, the Torch install-dependencies script is hardcoded to support Fedora 20. I have made some changes to the script which makes it support Fedora 22 as well, and have made it available as a github gist (Torch7 install Fedora 22). Have also raised an issue and supplied a patch to the original developers of the script.

Enjoy ‘Torch’-ing away to glory on Fedora 22!!! 🙂

Thick bottom border of titlebars in Gnome 3.16

This is supposedly a bug affecting Gnome 3.16.

However, if this issue is too much of an eye-sore for you too, there’s a simple way to remove this, as detailed in this archlinux blog.The change in appearance is best represented by the below screenshots.

This is the thing I truly love about Linux distros.. if you dont like something, just change it as per your wish! 🙂

Bottom border thickness

Bottom border thickness

Bottom border thickness removed

Bottom border thickness removed

Install Torch7 in Ubuntu

I feel that the install steps listed at the official website of torch have a couple of issues:

  1. it assumes that some of the build system dependencies have been already installed, such as cmake, curl, etc.
  2. One of the cmake steps in install.sh file involves explicit use of luajit2.1, which supposedly is broken in Ubuntu, as listed in this issue.

The following step effectively solves the issue#1 listed above:

#install build related dependencies
sudo apt-get install curl cmake git build-essential \
python-dev libxml2-dev libxslt-dev libfftw3-dev \
libsox-dev libssl-dev

To solve the build error listed in issue#2, open the install.sh file in the torch source folder and edit the following line:

cmake .. -DCMAKE_INSTALL_PREFIX="${PREFIX}" \
-DCMAKE_BUILD_TYPE=Release -DWITH_LUAJIT21=ON

to

cmake .. -DCMAKE_INSTALL_PREFIX="${PREFIX}" \
-DCMAKE_BUILD_TYPE=Release

That’s it! Now delete the build/ folder in torch root directory and restart the build process..
Enjoy!!!

Graphical view of new Android kernel flashing

A picture speaks a thousand words.. Hence, summarizing my experience from the previous two days, below is the graphical overview of new Android kernel flashing steps:

Android kernel flashing steps

Android kernel flashing – graphical overview

Key to the above figure:

  • Items in RED : things to be downloaded from the internet.
  • Boxes in GREEN : Step#1 of the new kernel install – making flashable kernel zip.
  • Box(es) in WHITE : Step#2 of the new kernel install – installing modules.
  • Boxes in YELLOW : a step producing multiple things, and used individually.

Foray into Android Kernel hacking

A post after ages.. and we begin a new journey into the world of (Linux’s cousin) Android kernel hacking.

Presently, have taken baby steps in this field involving:

  • building the kernel from source using default defconfig of my device. Thanks to cheatman for the kernel source for my test device.
  • Thanks to excellent explanation provided at this xda link, kernel build was almost a cakewalk!
  • Kernel build produces a zImage, which is a compressed image of the kernel. Next step involves packaging the kernel into a form that a custom recovery installed in your Android devices can read it (FYI, I am currently using CWM Recovery).
  • Kernel packaging involves the following steps:
    1. Extract ramdisk (or, initramfs on older devices) from an existing boot.img. This can be obtained from freely downloadable flashable kernel zips corresponding to one’s device.
    2. Use this ramdisk along with the built zImage to create a new boot.img
    3. Create a zip out of this boot.img and META-INF folder that was obtained from flashable kernel zip in 1).
  • The linux tools for performing the above can be obtained from this link.
  • Once the zip is ready, copy it to your sdcard, boot to recovery and select option : install from zip and select your flashable kernel file.

Finally, a screenshot from my device 🙂

Screenshot of new kernel install from device's settings view

Screenshot of new kernel install

A major problem am facing presently is that WiFi on this device is not working since the new kernel install. Will try to figure out the issue and post an update soon.

ginput() in opencv-python

The Image Processing Toolbox in MATLAB has this very useful utility called as ginput, which allows manually picking co-ordinate points from an image. I tried to recreate that functionality in python based OpenCV, and the result is the following code:


import cv2
import numpy as np
from matplotlib import pyplot as plt
import os

a = np.array([0,0], dtype='float32')
def getXY(imgPath):

 try:
   os.environ["DEBUG"]
   DEBUG = 1

 print "-------------------------------"
 print "Using OpenCV version : ",cv2.__version__
 print "-------------------------------"

 print "TASK : Mimic getxy() feature of MATLAB"
 print "***************************************"

 except KeyError:
    #print "For verbose mode, set DEBUG flag"
    DEBUG = 0

 #define the event
 def getxy(event, x, y, flags, param):
   global a
   if event == cv2.EVENT_LBUTTONDOWN :
      a = np.vstack([a, np.hstack([x,y])])
      if (DEBUG):
      print "(row, col) = ", (x,y)

   #Read the image
   img = cv2.imread(imgPath)
   if (DEBUG):
      print "Reading the image..."

   #Set mouse CallBack event
   cv2.namedWindow('image')
   cv2.setMouseCallback('image', getxy)
   if (DEBUG):
      print "Set MouseCallback functionality..."

   #show the image
   print "Click to select a point OR press ANY KEY to continue..."
   cv2.imshow('image', img)
   cv2.waitKey(0)
   cv2.destroyAllWindows()

   #obtain the matrix of the selected points
   b = a[1:,:]
   if (DEBUG):
      print ""
      print "The clicked points..."
      print b, b.dtype, b.shape

   print "The selected points are returned as a float64 MATRIX..."
   return b

Steps to use it :

  • save the above source code as getXY.py in your working directory.
  • In your python code, import this file, i.e.,

from getXY import *

  • Pass the image path to getXY, and start clicking on the displayed image. The no. of times you click, those many points will get saved.
  • If you want a verbose version, set the environment variable DEBUG = 1 from the terminal before running the code, i.e.,

DEBUG=1; export $DEBUG

That’s it! I’ll upload the code onto a git repo as well soon and provide a link here as well.

  • To remove the verbose code, unset the DEBUG variable, i.e, :

unset $DEBUG

vnstat – keeping an eye on your network bandwidth

Once we leave the haloed portals of our alma mater, accessing the internet ceases to be a luxury it once used to be. Keeping an eye on network bandwidth usage in order to stay within data pack limits becomes utmost important. In such a scenario, a simple and extremely elegant command line tool called vnstat comes to our rescue.

  • To begin using vnstat, install it:

$ sudo yum install vnstat

  • Now, we need to tell vnstat which interface to monitor. First check the list of interfaces available on your system:

$ ip link show

This will print something like the following :

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: p2p1: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc mq state DOWN mode DEFAULT qlen 1000
link/ether 00:16:d3:26:73:dc brd ff:ff:ff:ff:ff:ff
3: wlp3s0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT qlen 1000
link/ether 00:16:cf:18:57:6c brd ff:ff:ff:ff:ff:ff
4: wwp0s29f7u2i1: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT qlen 1000
link/ether 58:2c:80:13:92:63 brd ff:ff:ff:ff:ff:ff
5: ppp0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN mode DEFAULT qlen 3
link/ppp

  • On my system, am interested in the mobile broadband connection (ppp0). Hence, we point vnstat to monitor it :

$ sudo vnstat -u -i ppp0

  • Now, make vnstat daemon auto start at boot :

$ sudo systemctl enable vnstat.service

  • Unfortunately, vnstat log file gets created as a root and not as a normal user. Hence, we need to change its permissions to allow vnstat to write data to it. This step will remove the frustrating

ppp0: Not enough data available yet.

issue. Simple type the following to change owner and group:

$ sudo chown <owner_name> -R /var/lib/vnstat/*

$ sudo chgrp <group_name> -R /var/lib/vnstat/*

(CREDIT : http://realtechtalk.com/vnstat_setup_guidetutorial-1181-articles)

  • As pointed out by Jim, on a multiuser system, it may make more sense to allow everyone to have read-write permissions, that is if the admin so desires. In such a scenario we need to run the following:

$ sudo chmod a+rw -R /var/lib/vnstat/*

  • And we are done! From next boot, vnstat will start logging your network bandwidth. To see realtime / live usage statistics, type:

$ vnstat -l

For non-realtime data:

$ vnstat

There is an excellent article on various vnstat options on Linuxaria. Happy internet-ing without burning a hole into your pocket.

OpenCV with video support in recent Linux distros

There were days when we had to painstakingly go through the manual install process for getting OpenCV running on our systems. Those days are long gone, and for the good. Current day distros bundle both OpenCV and ffmpeg in their repositories, making life extremely easy for enthusiasts and geeks alike. The following 4 steps provide a fully functional OpenCV install on Fedora:

  • sudo yum groupinstall “Development Tools” “Development Libraries”
  • sudo yum install eigen2-devel CTL CTL-devel OpenEXR_CTL-libs tbb yasm yasm-devel tbb-devel OpenEXR CTL-devel  gstreamer-plugins-base-devel libsigc++20-devel glibmm24-devel libxml++-devel gstreamermm xine-lib libunicapgtk-devel xine-lib-devel gstreamermm-devel python-devel sip-macros sip vamp-plugin-sdk audacity sip-devel xorg-x11-proto-devel libXau-devel libX11-devel automake libogg-devel libtheora-devel libvorbis-devel libdc1394-devel x264-devel faac-devel xvidcore-devel dirac-devel gsm-devel zlib-devel faad2-devel speex-devel lame-devel orc-compiler orc-devel libvdpau cppunit libvdpau-devel schroedinger-devel dirac x264 lame faad2 amrwb-devel opencore-amr-devel amrnb amrnb-devel
  • sudo yum install ffmpeg ffmpeg-devel opencv opencv-devel opencv-python
  • sudo updatedb

That’s it! Dont believe me, well run a sample python or c code and see for yourself! 🙂 You can download this PDF file containing a sample code written in both python and C. Provide the video file appropriately and enjoy seeing your OpenCV installation playing a video file.

P.S : For C based codes, run gcc as:

gcc -L/usr/include/opencv -lopencv_core -lopencv_highgui -lm -o a.out fileName.c

For python based codes:

python fileName.py

Video in OpenCV

Video files in OpenCV

Recording from Kinect for offline Kinect-less development

Fakenect, allows for hacking and playing with the libfreenect library without the need for having an actual Kinect device. Assuming you have a pre-“recorded” data, all that needs to be done is:

fakenect <path_to_data_folder> <your_application> <parameters>

For e.g., if we need to run freenect-glcview, that comes bundled with libfreeenct library, we need to execute it as:

fakenect <path_to_data_folder> freenect-glcview

and we’ll get access to the pre-recorded data as though an actual Kinect device was connected! Now comes the interesting part.. How to record such a data? We could do it using freenect-record that comes bundled with libfreenect, but it doesnt let the user know what is being captured due to absence of any GUI.

kinect_record is a nice little code meant to record and show what is being recorded simultaneously. However, compiling this little gem needs some tweaking to the Makefile.linux that comes bundled along:

search for the location where freenect.h is located in your system:

  • locate libfreenect.h (for my system, its something like: /usr/include/libfreenect/libfreenect.h)

copy the path till libfreenect/ (for my system, it will be: /usr/include/libfreenect/). Open Makefile.linux and edit the CFLAGS variable to look like:

  • CFLAGS=-g -Wall -I/usr/include/libfreenect -I/usr/include

This should be enough in most of the cases. I hit an additional error message: undefined reference to symbol ‘pthread_key_delete GLIBC_2.2.5’. This was resolved using this suggestion and the corresponding edit to LDFLAGS variable makes it look like:

  • LDFLAGS = -lfreenect -lGL -lGLU -lm -lglut -L /lib64 -l pthread

That should be it! Just type make and the executable should be ready. To execute it, type:

  • ./kinect-record <path_to_folder>

and enjoy hacking using libfreenect without needing the actual Kinect device!