Author Archive
Create links with absolute paths in Linux
by Mostafa on Jan.16, 2010, under How To ..., Linux, Software
The default behaviour of the linking command (ln) is a little strange under certain circumstances. Since it creates the links using the literal value of the target, symbolic links created using relative path structures can often fail. Consider the following:
$ ln -s targetfile ../src/targetfile_link
Without a doubt, ‘targetfile_link’ will be a broken symlink since it links to a target that it assumes is in the same directory:
$ cd ../src && ls -l targetfile_link lrwxrwxrwx 1 mafgani mafgani 5 2010-01-16 18:19 targetfile_link -> targetfile
This is quite unfortunate since it clearly clashes with the way that the linking mechanism should work intuitively.
The solution is to force ln into automatically appending the absolute path to the target files. This can be achieved by using a simple shell script that acts as a wrapper for the real linking command:
#!/bin/sh
# Step through the supplied arguments and append the absolute
# path to targets that exist
for ARG in $@
do
if [ -e $ARG ]; then
LNARGS="${LNARGS} ${PWD}/${ARG}";
else
LNARGS="${LNARGS} ${ARG}";
fi
done
# Execute the actual link command with the modified args
exec /bin/ln ${LNARGS};
There are two known caveats:
- The link is ’sub-optimal’ if created from within the destination directory (the absolute path contains ‘../’s). It will still work however.
- The links will always be absolute. If that is undesirable, save the script as ‘absln’ or something other than ‘ln’.
Using ‘absln’ instead of ‘ln’ in the previously described scenario now produces a working symlink:
$ absln -s targetfile ../src/targetfile_link $ cd ../src/ && ls -l targetfile_link lrwxrwxrwx 1 mafgani mafgani 16 2010-01-16 19:13 targetfile_link -> /tmp/files/targetfile
Graphics format conversion
by Mostafa on Dec.09, 2009, under LaTeX, Linux, Software
Up until now I have been using the ‘convert‘ tool that comes with ImageMagick to switch between image formats — mainly for creating EPS files from JPG/PNG (raster format) files for use with LaTeX. Then I came across sam2p.
It is a light-weight utility that does one thing only and it does it well: convert between image formats. I’ve been using it for a while now and find that it can greatly reduce files sizes with minimal drop in quality. I’ve even used it to process existing EPS files just to get the reduction in file size. Best of all, it is multi-platform — executables are available for both Windows and Linux on the project homepage.
Goodbye convert and hello sam2p!
Squeezing space in LaTeX
by Mostafa on Oct.29, 2009, under How To ..., LaTeX
Academic papers and articled often come with a predefined maximum page count and it is common to find that it’s a limit that is easily exceeded. Under such circumstances, it becomes necessary to pull a few “dirty tricks” that squeeze out every last bit of available space.
The most common approach is to simply redefine the ‘\baselinestretch’ variable in the preamble of the document. The parameter controls the scaling of the space between the bottom of two successive lines of text. Therefore, the definition used to squeeze that space by 2% is:
\renewcommand{\baselinestretch}{0.98}
While that trick alone is sufficient in most cases, it is useful to be aware of other spacing parameters that can be adjusted. The Cambridge University Engineering Department has a nice page with lots of details. I personally find ‘\textfloatsep’ to be one of the more useful ones:
\addtolength{\textfloatsep}{-5mm}
It is used to reduce the amount of space that is usually left between a float and the adjacent text block (e.g. end of caption of a top-figure and the text below).
Just Host cPanel cleanup script for Greasemonkey
by Mostafa on Oct.23, 2009, under How To ..., Software
I finally decided to get my own domain and signed up with Just Host for the registration and hosting. For now I’m only using it to host this blog that originally started its life on Blogger. The transition was fairly smooth, save for a few minor issues. I’ll talk more about the steps involved a future post (a draft is already in the queue) …
Just Host offers cPanel as a web frontend for managing and running site related tasks. It’s quite a nice tool but there is one big problem. The interface is literally littered with a bunch of annoying ads and affiliate links. Even more annoying is the fact that there doesn’t seem to be any way of permanently moving these offending boxes to the bottom of the screen. This is where Greasemonkey comes in.
Greasemonkey is a nice little extension for Firefox that allows the execution user scripts to change the way a website looks. userscripts.org is a great place for finding scripts that work on major/popular sites on the internet. A search there didn’t turn up anything useful so I decided to write my own. Install Greasemonkey if you don’t have it already and then click on this link to get the script installed. I’ve also put up a copy on userscripts.org.
The script works by setting the ‘display’ style of the offending div boxes to ‘none’. Firebug is another great tool that makes it a breeze to find out the IDs of the divs that need to be blacklisted.
[Update 10-Nov-2009]: Looks like some sneaky new ads injected using Javascript have shown up on the cPanel sidebar. Unlike the old ad boxes however, these lack div IDs. As a result, it is not possible to simply blacklist them. Fortunately, it also means that it is possible to turn the table around by simply blocking the sidebar divs that have a null ID. The script has been updated.
Before:

Before applying greasemonkey script
After:

After applying greasemonkey script
Status report
by Mostafa on Oct.23, 2009, under Life
Looks like it’s been more than a year since the last time I’ve published something here. I’ve just been really busy, now more than ever. I have been periodically saving some blurbs as drafts but I never quite seem to have the time to polish them into real posts.
I really should be working on my thesis and a number of other papers but it does get a bit tiresome. Whenever that happens, I’ll work a bit on the drafts as a distraction and hopefully manage to push a few of them out over the coming weeks…
Realtime collaborative text editing
by Mostafa on Nov.21, 2008, under Linux, Software
A while ago, I came across Etherpad. It a web based platform that allows multiple users to simultaneously edit a single text file. Since it doesn’t seem to support any kind of mark-up at the moment, it would seem that it’s not terribly useful for word processing tasks. Perhaps it’s good for real-time collaborative coding and the creation of agenda type lists …
The software equivalent of Etherpad is Gobby. It’s a multi-platform tool that claims to run on Microsoft Windows, Mac OS X, Linux and other Unix-like platforms — making it almost as flexible as a web-based service. There are a number of other advantages:
- Flexibility and security that comes from having absolute control over the sessions.
- Syntax highlighting!
Bash process substitution
by Mostafa on Oct.03, 2008, under Linux, Software
From the Advanced Bash-Scripting Guide:
“Piping the stdout of a command into the stdin of another is a powerful technique. But, what if you need to pipe the stdout of multiple commands? This is where process substitution comes in.
Process substitution feeds the output of a process (or processes) into the stdin of another process.”
The syntax is:
>(cmd_list) <(cmd_list)
Example: comparing the head of two files using diff
$ diff -u <(head -n3 /var/log/dmesg) <(head -n3 /tmp/dmesg) --- /proc/self/fd/63 2009-05-26 19:52:45.144544140 +0100 +++ /proc/self/fd/62 2009-05-26 19:52:45.149544007 +0100 @@ -1,3 +1,3 @@ -Initializing cgroup subsys cpuset -Initializing cgroup subsys cpu -Linux version 2.6.27.21-170.2.56.fc10.i686 (mockbuild@xenbuilder2.fedora.redhat.com) (gcc version 4.3.2 20081105 (Red Hat 4.3.2-7) (GCC) ) #1 SMP Mon Mar 23 23:37:54 EDT 2009 +Linux version 2.6.22.9-61.fc6 (brewbuilder@hs20-bc2-4.build.redhat.com) (gcc version 4.1.2 20070626 (Red Hat 4.1.2-13)) #1 SMP Thu Sep 27 18:48:03 EDT 2007 +BIOS-provided physical RAM map: + BIOS-e820: 0000000000000000 - 000000000009f000 (usable)
The diff header clearly shows that file descriptors are used as the underlying mechanism.
Embedding fonts in a PDF document
by Mostafa on Oct.03, 2008, under How To ..., LaTeX, Linux, Software
It is often a good idea (or a requirement) to embed the used font faces in a PDF document. This is easily accomplished using ps2pdf during the final stage of conversion of a document from PS to PDF:
$ ps2pdf -sPAPERSIZE=a4 -dPDFSETTINGS=/printer -dCompatibilityLevel=1.3 \
-dMaxSubsetPct=100 -dSubsetFonts=true -dEmbedAllFonts=true \
'input_file.ps' 'output_file.pdf'
An explanation of the command options can be found in the Ps2pdf.htm file in the Ghostscript documentations (or here).
[Source]
Re-encoding MP3 files using LAME
by Mostafa on Jun.06, 2008, under How To ..., Linux, Software
I have some MP3 files encoded at a constant bitrate of 320kbps that my phone seems to have trouble playing smoothly. So, I looked into LAME.
The files I had were named using the following scheme:
01 - Title of track 01.mp3 02 - Title of track 02.mp3 ...
I used the BASH for-loop construct to process the files:
$ for A in *.mp3;\ # Process one mp3 at a time
do B=${A%.mp3};\ # Extract track number and title
C=${B#?? -};\ # Extract the title
D=${B%% - *};\ # Extract the track number
lame --vbr-new -V0 -q0\ # Variable-bitrate, high-quality
--mp3input\ # Inputs are MP3 files
--tt "$C"\ # ID3v2 tags: title
--ta 'Artist Name'\ # ID3v2 tags: artist
--tl 'Album Title'\ # ID3v2 tags: album
--ty 2007\ # ID3v2 tags: year
--tn "$D"\ # ID3v2 tags: track no.
--tg 'GENRE'\ # ID3v2 tags: genre
"$A" processed/"$A";\ # Keep filename and save in ./processed/
done
Since no bit-rate bounds are explicitly provided, the re-encoded files can contain anything between 32kbps and 320kbps. The LAME man-page provides an extensive list of options and their meanings.
Processing files using ‘find’
by Mostafa on Mar.26, 2008, under How To ..., Linux, Software
In its most basic form, find is often used to locate files that are subsequently piped through a complex set of commands for processing. However, this particular method is easily broken by files that contain spaces in their names.
This is where the ‘exec’ option provided by find comes in handy. From the man-page:
-exec command ;
Execute command; true if 0 status is returned. All following
arguments to find are taken to be arguments to the command until
an argument consisting of ‘;’ is encountered. The string ‘{}’
is replaced by the current file name being processed everywhere
it occurs in the arguments to the command, not just in arguments
where it is alone, as in some versions of find. Both of these
constructions might need to be escaped (with a ‘\’) or quoted to
protect them from expansion by the shell. See the EXAMPLES sec-
tion for examples of the use of the ‘-exec’ option. The speci-
fied command is run once for each matched file. The command is
executed in the starting directory. There are unavoidable
security problems surrounding use of the -exec option; you
should use the -execdir option instead.
An example that recursively removes all *.doc files from the current directory would be:
$ find . -name \*.doc -exec rm {} \;


