New packages in Debian 7.0 Wheezy

Given that Debian 7.0 Wheezy will be released in a few hours, I thought it would be a good time to take part in Michael Prokop's #newinwheezy effort to publicise the new packages that have uploaded to Debian as part of Wheezy. I have introduced two new packages to Debian for this release:

  • nyancat - nyancat is a program to display an animated poptart cat in your terminal
  • transmission-remote-cli - ncurses interface for the Transmission BitTorrent daemon

I've also have become (co-)maintainer of the following packages, updating them for this release:

  • dhex - ncurses based hex editor with diff mode
  • figlet - Make large character ASCII banners out of ordinary text
  • lcd4linux - Grabs information and displays it on an external lcd
  • libconfig - Parsing and manipulation of structured configuration files
  • wavemon - Wireless Device Monitoring Application

I hope you find them useful. Enjoy!

MATLAB R2012a system() function

MATLAB does not integrate nicely with Linux operating systems, and instead, provides its own copies of binaries, and libraries. These libraries are often outdated, which can cause problems such as the one below.

When calling external C++ compilers though the system() function, I found myself running into an eglibc error. This occurred when running MATLAB R2012a on a Debian Wheezy machine with eglibc 2.13 and gcc 4.7.1.

/tmp/hello-world: /opt/matlab/bin/glnxa64/libstdc++.so.6: version
`GLIBCXX_3.4.15' not found (required by /tmp/hello-world.so)

The solution is to override GNU Standard C++ Library version used by MATLAB, and force it to use the system version of the library by using LD_PRELOAD. Start MATLAB using the following command from the terminal which should solve your issues:

LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libstdc++.so.6 matlab

Debian Gitweb server

After getting sick of GitHub's clunky closed-source interface, I decided to migrate my repositories to my own Debian-based server using the gitweb web interface.

Considering that I already have SSH access to the server, I only needed to provide read-only public access. As well as providing this access via the traditional 9418/tcp git protocol port, I wanted to provide access via HTTP too (I sometimes get caught behind firewalls which block 9418/tcp).

For vanity purposes, it was important that a single URL allowed both gitweb access and git cloning. Syntax highlighting for common programming languages is also a nice feature to have when migrating from github.

Finally, it was important that the configuration adhere where possible to the default Debian configuration files. I don't want the whole thing to fall apart when I upgrade to the next stable release!

The configuration below fulfils all the above requirements.

First, install git and apache if not installed:

apt-get install git gitweb git-daemon-sysvinit apache2 highlight

git-daemon-sysvinit is not available in Squeeze due to a dependency issue. You may either use git-daemon-run instead, compile this package yourself and relax the dependency, or else install the latest version of git from squeeze-backports.

Apache2 Virtual Host - /etc/apache2/sites-available/git.dereenigne.org:

<VirtualHost *:80>
ServerName git.dereenigne.org
DocumentRoot /usr/share/gitweb
SetEnv  GITWEB_CONFIG  /etc/gitweb.conf
SetEnv GIT_PROJECT_ROOT /var/cache/git

<Directory /usr/share/gitweb>
  Options FollowSymLinks +ExecCGI
  AddHandler cgi-script .cgi

  DirectoryIndex gitweb.cgi

  # Pretty gitweb URLs
  RewriteEngine On
  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteCond %{REQUEST_FILENAME} !-d
  RewriteRule ^.* /gitweb.cgi/$0 [L,PT]
</Directory>

  # Enable git clone over HTTP
  ScriptAliasMatch \
          "(?x)^/(.*/(HEAD | \
          info/refs | \
          objects/(info/[^/]+ | \
          [0-9a-f]{2}/[0-9a-f]{38} | \
          pack/pack-[0-9a-f]{40}\.(pack|idx)) | \
          git-(upload|receive)-pack))$" \
          /usr/lib/git-core/git-http-backend/$1
</VirtualHost>

Enable the apache2 site:

a2ensite /etc/apache2/sites-available/git.dereenigne.org

Edit /etc/gitweb.conf:

# path to git projects (.git)
$projectroot = "/var/cache/git";

@git_base_url_list = ("git://git.dereenigne.org", "http://git.dereenigne.org");

# directory to use for temp files
$git_temp = "/tmp";

$site_name = "git.dereenigne.org";

# require export flag
$export_ok = "git-daemon-export-ok";
$strict_export = 1;

# target of the home link on top of all pages
#$home_link = $my_uri || "/";

# html text to include at home page
#$home_text = "indextext.html";

# file with project list; by default, simply scan the projectroot dir.
#$projects_list = $projectroot;

# stylesheet to use
#$stylesheet = "gitweb.css";

# javascript code for gitweb
#$javascript = "gitweb.js";

# logo to use
#$logo = "git-logo.png";

# the 'favicon'
#$favicon = "git-favicon.png";

# enable git blame
$feature{'blame'}{'default'} = [1];

# enable pickaxe search
$feature{'pickaxe'}{'default'} = [1];

# enable snapshot downloads
$feature{'snapshot'}{'default'} = ['zip', 'tgz'];

# enable syntax highlighting
$feature{'highlight'}{'default'} = [1];

# enable pretty URLs
$feature{'pathinfo'}{'default'} = [1];

Edit /etc/default/git-daemon:

# Defaults for git-daemon initscript
# sourced by /etc/init.d/git-daemon
# installed at /etc/default/git-daemon by the maintainer scripts

#
# This is a POSIX shell fragment
#

GIT_DAEMON_ENABLE=true
GIT_DAEMON_USER=gitdaemon

GIT_DAEMON_BASE_PATH=/var/cache/git
GIT_DAEMON_DIRECTORY=/var/cache/git

# Additional options that are passed to the Daemon.
GIT_DAEMON_OPTIONS=""

Start the git daemon:

/etc/init.d/git-daemon start

To create a new project:

ssh myserver
mkdir /var/cache/git/myrepo.git
cd /var/cache/git/myrepo.git
git init --bare
echo "myrepo description" > description
touch git-daemon-export-ok

To push to this project:

git add remote myserver user@myserver:/var/cache/git/myrepo.git
git push myserver master

While this page is about Debian, the same commands can be used to set up a similar setup on Ubuntu.

Update Intel CPU Microcode

You are probably familiar with the terms firmware and drivers in the context of computer hardware, and the endless updating that they require. Most people associate these drivers and firmware updates with peripheral equipment such as graphic cards and DVD drives. You might not however be aware that you can also update the firmware on your CPU (firmware is called microcode in CPU speak).

These microcode updates are normally bundled in with BIOS updates. Given the fact that BIOS updates are inherently risky, motherboard manufacturers are reluctant to issue BIOS updates for anything other than major bugs. This means your microcode can become quite dated. Both Intel and AMD realise this and release standalone microcode updates.

If you are running Debian or Ubuntu and Intel CPU (there is a pretty good chance you are), you can use the intel-microcode and microcode.ctl packages to update your microcode. This will download the latest microcode for your CPU and apply the update automatically on each boot. This process does not apply the update permanently, and is completely reversible.

Periodically run

sudo update-intel-microcode

to download the latest microcode version from Intel.

I'm not aware of any analogous utility for Windows, but if anyone does, let me know in the comments. :-)