Posts tagged ‘computing’


Create an HTML version of man pages

There is a program designed for the purpose of creating an HTML version of a manual page (man page). This program is called man2html. However, man2html does not create a table of contents in the resulting HTML, which would be very useful for long man pages. But we can actually accomplish that with the man utility itself, believe it or not!

The man utility gives us the ability to view a man page in a browser, with the man page formatted into HTML (with table of contents). This is done using the following command:

man -Hbrowser page

where “browser” is the browser you wish to use, for example “firefox” or “google-chrome” (these need to be in your PATH), and where “page” is the man page you wish to read, for example “bash” or “emacs”.

Unfortunately, the HTML file created for this purpose is a temporary file which is deleted! So if you close the tab or window of the browser, or even refresh the page, you will get an error telling you the HTML file cannot be found anymore! To get around this, we trick the man utility into using the cat utility as the browser. We then let cat redirect its output of the HTML file to a permanent file, like so:

man -Hcat bash > bash.html

After that, we can view the file in a browser:

google-chrome bash.html



Installing LaTeX packages in your home directory

I was recently in a position where I wanted to use a LaTeX package, but it was not installed on the computer system I was working on. The computer system was at my workplace, at Umeå University. I had a conversation with the systems administrator and he told me that updating the entire TeX distribution would require a lot of work, but that I could place the package in the current directory, with my document, and it would hopefully compile.

I hoped so too. But of course, this being the real world, such luck is rare with computers. So I decided to dive into how I might install a LaTeX package locally, in my home folder. I finally managed to find a solution, and I will detail this below.

This “how-to” will not cover how to create a package, or even how to download ready-made packages or whatever. I had the package that I required installed on my computer at home, so I just copied and pasted that over to the work computer. This tutorial will only cover how to make LaTeX look for packages elsewhere than the default package path.

LaTeX automatically looks to see if there are any package installations in $HOME/texmf/. That search path is the default value of the environment variable TEXMFHOME. This is very nice and handy; what this means is we can use “$HOME/texmf” as a folder to chuck packages into. However, I prefer to have files that I never really intend to open in hidden folders (folders whose name starts with “.” (dot)). So the next step I took was to create a folder where I can put packages, in my home directory (“$HOME”).

> mkdir $HOME/.texmf

After that, I went and added a command to my .bashrc file that will change the value of the TEXMFHOME variable to be that of the newly created folder. This way, LaTeX will search for packages in that folder instead. The following lines were added to the .bashrc file.

# LaTeX stuff
export TEXMFHOME=$HOME/.texmf

I usually use pdflatex to compile my LaTeX documents, so if you use some other program, the environment variable you need to change might be different. I compile my LaTeX documents on the command line, so if you use another system, you might have to find another way to export your environment variable, or even use the specific application settings in your editor, if your editor supports compiling LaTeX documents.


Ubuntu 9.10 boot time


I decided to finally clock the boot time on my installation of Ubuntu 9.10 (Karmic Koala). Total time from the GRUB menu to a fully loaded desktop is 31.5 seconds, including the time it took for me to choose my name and type in my password as fast as I could. Time from GRUB menu until login screen was about… I’m not too sure, but around 15-20 seconds.

Not bad! I would be interesting to hear others’ boot time!


The Naming of the Bovid

Michael Lustfield is crazy. He also wrote a post on his web log in which he, long story short, pretty much claims the GNU project is being a bunch of whiny babies about the whole GNU/Linux / Linux naming convention discussion that’s been going on for a great while now.

I generally share the same opinion as Michael. GNU, in their own documents (as reviewed by Michael), keep saying

  • “We started this thing. We were first. Give us credit.”
  • “GNU is an operating system, just lacking a kernel.”
  • “Most people use a GNU/Linux system which is essentially a GNU system with Linux tacked on.”
  • “We deserve credit because the operating system you use is GNU. (…) Using the Linux kernel.”

I interpret Michael’s opinion to be that “GNU IS NOT an operating system” because they never finished their own kernel, while GNU feels that an operating system is a complete, general system that enables you to do your work with your computer.

It is my belief that it all boils down to one’s definition of “operating system”. I acknowledge several definitions, but one definition is much simpler than the other; it is much easier to just define it as “the kernel”, but if you define it the way GNU defines it you are faced with the difficult problem of where to draw the line. Should a Word Processor count as essential software in the operating system? Media player? GAMES? APPARENTLY according to GNU (again, see Michael’s post and/or GNU’s documents).

This is a problem, so I do actually prefer the OS to be just “the kernel”. This is why I don’t feel bad saying that “I use Linux”, and not that “I use GNU slash Linux”, the latter of which would just sound ridiculous in all honesty.

But even so, if you would take “operating system” to mean what GNU feels an operating system means, you most definitely have to include the kernel, and GNU’s software and the Linux kernel are huge contributions in such an operating system. This is why it would be appropriate to call it GNU/Linux, but then for the same reason, GNU still really isn’t an operating system without Linux, so no, Michael, GNU indeed IS NOT an operating system.

Regarding the quote “with a kernel tacked on” (might be paraphrased), as if the kernel is just a regular piece of software running inside the OS. It’s much more than that—it’s what facilitates all the system resources to all other software in the “operating system”. All this is pretty confusing, but in conclusion, GNU isn’t an operating system by my definition, which is that the operating system is the kernel:

Schematic View of Operating System

Schematic Orientation of Operating System

Interestingly, a Wikipedia article defines the kernel to be, in fact, a part of the operating system, but I don’t think the definition in general is set in stone.

Nonetheless, while the GNU folks do come off as being whiny babies about this, there is truth in that it is important to recognize GNU for the work that they have done and for what they have done and are doing the work, which is a great, great thing. But fussing over the naming of operating systems is definitely not the way to go about doing this. It clearly just causes frustration in the community, and it is dividing it. Luckily I don’t think this fussing is causing a division deep enough to cause any real damage because of shared philosophies, but it is worth being fine with calling it just “Linux”, getting on with your life, and finding another way to promote Free Software.


The 64-bit Difference

I was just reading about the limitations of the WAV audio format.

The WAV format is limited to files that are less than 4 GB in size, because of its use of a 32-bit unsigned integer to record the file size header (some programs limit the file size to 2–4 GB). Although this is equivalent to about 6.8 hours of CD-quality audio (44.1 KHz, 16-bit stereo), it is sometimes necessary to exceed this limit, especially when greater sampling rates or bit resolutions are required. […] Its 64-bit header allows for much longer recording times.

I got to thinking about computer memory and the difference in capacity between N-bit systems. A computer uses an address to access different parts of the memory. The address consists of numbers (internally, ones and zeros), which for a 32-bit system (where the addresses always have a length of 32 bits) would look something like “af34c97b” written using a radix of 16. A 32-bit uses these addresses to look up places in the memory. Each address stands for a certain byte in the memory, so obviously if we only have addresses with 32 bits, we can’t look beyond the address with 32 ones in a row since that is the maximum value 32 bits hold.

Think of when you’re mailing a letter: you can mail the letter to anyone you want using only two numbers for the house or apartment number. You would be able to send it to (0)1-99 Blah Blah St., but not to the guy living at the end of the street at no. 100. Memory addresses work in the same way.

Let’s do some math now. Say your system is working with 32-bit memory addresses. That means the largest value we could have (the farthest down the street we would be able to send the letter) would be 1111 1111 1111 1111 1111 1111 1111 1111, or FFFF FFFF in hexadecimal numbers. Let’s write this figure out in a format that we’re more familiar with, such as Gibibytes (GiB) or as it is more incorrectly known as: Gigabytes (GB). 1 GiB = 1024^3 bytes; 1 GB = 1000^3 bytes.

FFFF FFFF in GiB is 2^32 / 1024^3 = 2^32 / (2^10)^3 = 2^32 / 2^30 = 2^(32-30) = 2^2 = 4 GiB.

You might have heard already that 32-bit systems only can handle 4 GiB of memory, and now you hopefully know why if you didn’t already. Now then, what happens if we double that number, and make it a 64-bit system?

FFFF FFFF FFFF FFFF in GiB would be 2^64 / 2^30 = 2^34 = 17179869184 GiB, or 16 Exbibyte (EiB). A MASSIVE amount of memory. As you can see, with a double increase in address size, we do not get a doubling of the memory space, but rather a number that is the number of bytes in 4 GiB to the power of 2. 4 GiB = 4294967296 Bytes, and 16 EiB = 18446744073709551616 bytes. These numbers are obviously incomprehensible. So I thought it would be easier to demonstrate them with an example, regarding the Wikipedia article quoted at the top of the article.

As the quote says, a 4 GB (actually GiB) WAV file (with file size header of 32 bits) would give us 6.8 hours of music with a sampling rate of 44.1 kHz, a bit depth of 16 bits and 2 channels (stereo).

If we assume the file size is proportional to the playing time of the audio file if the quality specifications remain the same, then we can calculate the playing time of a WAV file with file size header of 64 bits:

17179869184 [GiB] * (6.8 [hours] / 4 [GiB]) [hour-to-filesize ratio] = 29205777612.8 hours of music.

This number is still incomprehensible so let’s walk up the ladder of time units, shall we? Note that when calculating the amount of years, we will use a year length of 365.2425 days, which is the arithmetic mean of amount of days in a year in the Gregorian Calendar, which has a 400-year cycle and 146 097 days: 146097 / 400 = 365.2425 days. This is to take leap years into account. One could also use a day length of 24 hours and 58.3594503 seconds, but that doesn’t feel as nice, somehow.

29205777612.8 hours
= 1216907400.533333333 days
= 173843914.361904762 weeks
= 39981351.585316605 months (average of 30.436875 days/month in one 365.2425-day year)
= 3331779.298776384 years

So we see that just by doubling the address space, we go from 6.8 hours of music — which I guess you could plough through on a really dull and long bus ride — to more than 3.33 million years of music.

That, my friend, is the 64-bit difference.

… hmm? What was that about 128 bits? Shut up. 😦

No but really, to fill a 128-bit hard drive, it would more energy than it would to boil the oceans of the earth. Theoretical breakdown. Enjoy.


Open-Source Calculus

I’m (re(re))taking the second course on calculus during the summer at the university. It’s going much better this time around, which is a good thing.

I did have problems with one problem (har), and I couldn’t make sense of it on my messy notebook, and I didn’t feel like doing the entire problem over again. The only thing wrong with my solution is that the answers in the back of the book said term1 – term2, while I kept getting term2 – term1 in my notebook, so I wasn’t too far off but still couldn’t get it right — couldn’t find the erring minus sign. All I really felt like was doing some programming, which I enjoy, but what would I code if I have no software needs?

Then I thought: I need to get a more structured view of this problem. Why not write it up in LaTeX and make it into a nice, good-enough-to-print, PDF solution. That way, I will get some practice writing LaTeX documents (it’s been a few months, sadly), and writing LaTeX is pretty much programming in a way, so I get to practice LaTeX, scratch my coding itch, and maybe find out where that offending minus sign went.

Sure enough, it worked pretty well.

Solution to problem 6.2.9 in Calculus, A Complete Course (Sixth Edition).

I want to point out that this PDF was produced entirely using Free and Open-Source Software (FOSS):

  • texlive LaTeX distribution (tex->PDF compiler: pdflatex/pdftex)
  • GNU Emacs as the LaTeXt editor
  • Ubuntu Linux to run Emacs and tex compiler
  • Totem to play music while writing up the solution
  • Grip + oggenc to rip CDs to Ogg Vorbis
  • Ogg Vorbis media container format
  • libVorbis 1.2.0 used by oggenc (darn you Ubuntu for not updating libVorbis since 2007)
  • and so forth.

It works, folks!


Unnecessary database updating

I have a really old laptop that I put Ubuntu on. It used to have Xubuntu on it but even though Xfce is faster than GNOME, I like GNOME better.

There is a problem with a fresh install of Ubuntu however (and all other editions I assume), where there’s heavy unnecessary HDD activity, and the top utility reveals mlocate to be the perpetrator.

To disable mlocate running automatically, I just changed the permissions of /etc/cron.daily/mlocate to 644, by running:

$ sudo chmod -x /etc/cron.daily/mlocate

Problem solved, and no more seemingly random slowdowns by heavy activity on the HDD, which is slow as it is!

Also, turning off automatic checking of updates helps a lot too. It’s a great relief not to be interrupted in your… “work”, let’s call it, by heavy HDD activity, so it’s better to perform updates and package listing updates manually when it suits me.


Project Euler

I’ve become an active member of Project Euler (PE) again. Project Euler ( is a collection of (around 300 or so) mathematical and programmatical problems. I’m not sure when I started the first time, but it’s been a couple of years, I think. Now I’m back again with a bit more knowledge and feeling a bit more comfortable with programming, several programming and math courses later.

When I first joined, I was mostly only comfortable with Java as my programming language of choice, but I’m very interested in learning to program comfortably in C for a few reasons:

  • It is the traditional language in Unix/Linux applications.
  • I like GNU/Linux and Free and Open-Source Software.
  • It is a lot faster than Java… but still has very similar syntax!
  • I like handling pointers for some reason. I feel like I’m much more in contact with the data as I have full control of everything. It’s just so gratifying to get Segmentation Fault after Segmentation Fault and then, after some debugging and messing around with my pointers, finally getting the sought output from the program.

I don’t believe it’s mandatory to join Project Euler to take part in the problems, but I recommend you sign up for an account, because if you do:

  • you can provide answers to the problems and Project Euler will keep track of the problems you’ve solved.
  • you may participate in the forum thread for a particular problem upon solving it, allowing you to discuss your solution with fellow members. (It’s incredible to find solutions written in the J and K programming languages, which afford extremely concise programming.) Note that only relatively recent forum threads are open to new posts, but all threads are open to read (upon solving the corresponding problem, as I already mentioned).

Project Euler is a very fine tool to learn a programming language. If you’re not a programmer by profession and you don’t really have any software needs that aren’t fulfilled, Project Euler provides you with a great environment to experiment with a programming language’s syntax and libraries with problems and tasks to solve and complete.

My goal right now is to solve as many problems as I can using only the standard libraries in the GNU Library (glibc), namely stdlib, stdio and occasionally string (so far I’ve used string only for the strlen function, which I felt was unnecessary to write myself). It’s going pretty well, and it’s kind of fun to have to figure out solutions on your own instead of relying on already-written functions to do the job for you.

Some of the problems at PE can be solved only with the help of pen and paper, but most of them require up to thousands of iterations to find the solution and isn’t feasible without some computational aid. However, according to the site’s FAQ section, which they call “About”, all the problems are designed in a way that a well-constructed algorithm should take no more than 1 minute to output the solution to the problem. I’m very proud of C. Most problems finish in milliseconds, even on the super-slow laptop I use sometimes.


Torturing a ten-year old

I assume there is a near-infinite number of ways of making life hard for a decade-old laptop – one of them being

$ yes $(yes)

yes is a program that outputs a string indefinitely until the process is killed. If no parameters are given to the program, the output is “y” followed by a new line, repeated until killed.

What I in the spur of the moment did, just to see what would happen, was that I wanted to use the output of one yes command and use that as the parameter for another yes command to see if the output would grow exponentially. What I was too tired to realize was that even the first reiteration would be infinitely large. Oops! And the memory of the laptop was already filled up by Firefox.

Hard reboot!

Tags: ,

It feels good to be a winner

Yesterday was this year’s Uniaden. A fair held in and closely around the Universum building at Umeå University. The fair has booth spots for many companies that come and talk students who attend the fair to find out where they might end up working one day. It’s a mutual opportunity for both the companies and the students because the companies can make themselves known and attract talented people to work for them, and the students (well at least some) might create connections with the job market and maybe even get job offers.

Just prior to this year’s fair, Ardendo, which I think is a sub branch of Vizrt sent out an e-mail to most of the computing engineers at the university with a challenge and a chance to win a 320 GB hard disk drive.

The entire challenge was contained in a single source code file written in C++. It was a program that would output an image file, if all the bugs in the program were sorted out. I’m not extremely used to C, and I’ve never used C++, but this code was fairly similar to C, so I wasn’t too lost. I managed to at least fix all bugs that I could see, and I got an image file which had an inscribed time stamp and symbol. All participants were to write down this secret time stamp and symbol along with their name and e-mail on a piece of paper and hand it to the folks at the Ardendo booth.

On the day of the fair, I went there, handed in my contribution and had a good chat with the folks there. For the record, Ardendo seems to be a nice place of work. They do some interesting things (create software solutions for professional television broadcasting stations), and they seemed to think that I’d be a good candidate to work there once I’ve finished my education and given my interests and current knowledge.

When the time came to draw the winner of the competition, they took all the pieces of paper, which were different in size, shape and color because everybody wrote it down on their own piece of paper, and indexed them with numbers. The numbers were then mirrored on a different set of indentical pieces of paper, and the winner was drawn from that set. There were about 6 or 7 people who entered the competition.

It turns out I won!

I couldn’t believe it. And it turns out the drive was 400 GB, and one of those smaller, sleek ones that only need enough power to be powered from the USB cable alone, which is brilliant. It was a happy day.

I should mention I didn’t solve the bugs the way it was probably meant, because if I had, I would appparently have seen yet another hidden “easter-egg” message from the creator of the challenge. If I had solved it correctly, I would also have had a chance in an extra lottery where the prize was a beige cardigan with, I think, the Ardendo logo on it.

I’m glad I won the first lottery.