Thursday, May 28, 2009

Pure bash cat

So just to see if I could, I wrote a version of cat using pure bash. Pure bash is a bash script which uses nothing but bash builtins to accomplish it's goal. To determine if a particular command is a builtin, you can use the command type -t "command" (the command type, is itself a builtin). Some notable commands which are builtins include echo, read, exec, return. Some notable commands which are not builtins include cat and grep. As follows is my implementation of cat in pure bash.
#!/bin/bash
INPUTS=( "${@:-"-"}" )
for i in "${INPUTS[@]}"; do
    if [[ "$i" != "-" ]]; then
        exec 3< "$i" || exit 1
    else
        exec 3<&0
    fi
    while read -ru 3; do
        echo -E "$REPLY"
    done
done
Now, keep reading if you want a small lesson in advanced bash. I'll go line by line to explain what this is doing.
#!/bin/bash
INPUTS=( "${@:-"-"}" )
Line 1 is the shebang.
#!/bin/bash
INPUTS=( "${@:-"-"}" )
for i in "${INPUTS[@]}"; do
Line 2 assigns the array variable INPUTS either the arguments provided on the command line if they exist, or the single character "-". The way this happens is as follows: $@ is the variable to reference the positional parameters (the arguments to your program). If you have not heard of $*, read this. The way I reference the positional parameters is like ${@}. That's because the brackets allow me to add a "default value" to the variable. A default value is the value that the variable will seem to have if the variable is not set. The way to use a default value is with the :-, like so: ${@:-"hello"}. So if $@ is not set, it will seem to have the value "hello". You will then notice that is all enclosed in (). That makes an array out of the positional parameters (the first argument to the program becomes the first element in the array, the second argument becomes the second element, etc.).
INPUTS=( "${@:-"-"}" )
for i in "${INPUTS[@]}"; do
    if [[ "$i" != "-" ]]; then
Line 3 begins a for loop which will assign to i each value stored in the array INPUTS which was discussed earlier. The @ index used is the same for arrays as $@ is for the positional parameters.

Maybe i'll explain more when i'm less lazy.

Sunday, March 22, 2009

Chromium on Linux

So I decided today to make a shot at compiling google chrome on Linux... aaand after a number of compile errors, it works! Here's a screenshot of what you see when you start it up:



Some things I noted about it:
  • It took a long time to connect to many web sites.
  • It crashed a lot
  • There was no tab interface... opening a new tab worked, but you couldn't close it or get back to any old tabs.
  • It caused google to block me
  • No dialog boxes worked... couldn't open the options pane, no about pane, etc...

In short, the browser is not usable yet.

P.S. As you can see in my screenshot, there is a big disclaimer that this browser is NOT READY YET, so DON'T judge the quality of the linux port of chromium using any information you can get about it today!

Friday, January 23, 2009

Fixed lighttpd

So I made up a patch to lighttpd to allow the xattr Content-Type override anything in the configuration file. Here it is.

EDIT: A similar patch has been applied to the lighttpd trunk at r2425

Thursday, January 22, 2009

merged the getopt and mlock patches

I merged the getopt_long patch and the mlock patches (since they modified the same code).

I cleaned up the patch a bit. It now is enabled via the configure script with the --enable-mlock flag, the flag is now -m/--mlock (instead of -l/--lock).

The configure script also now checks for the presence of mlockall, and checks that glibc is >= 2.5 (the version the mlockall bug was fixed), and disables the mlockall if it is not met. It does the same for getopt_long and the use of getopt.

I also added documentation for --mlock to the manpage.

I renamed --opendisplay to --open-display (opendisplay is improper english). The documentation does not mention it, but --opendisplay will still work for backward compatibility.

Note that for the manpages, I updated the rxvtd.1.pod file, so the rxvtd.1.man.in file will need to be regenerated.

The new patch is here

Edit: It was merged upstream... it should be available when you --enable-frills in the next release.

Wednesday, January 21, 2009

rxvt-unicode and getopt

It seems rxvt-unicode doesn't use getopt. I made a small patch to enable use of getopt on glibc based machines. Note that it doesn't modify the rxvt binary itself, it modifies the rxvtd binary[1].
Here it is.

[1] rxvt has good enough option parsing already, rxvtd has none.

Pissed at Lighttpd

I'm so pissed at lighttpd... they have a feature where you can use xattrs to set the mime type of a file... but you can't *change* it. At least in debian, there is a script which parses /etc/mime.types and includes them in the config file. I checked the lighttpd code, and if the mime type is set in the config file, an xattr does not override it. This seems to be intentional too. WTF! What if I want a .patch file to appear as plain text? I would have to change the config file!

Maybe i'll change it and build my own debian package.

Edit: I did fix it, and built my own debian package. Here is a patch.

Locking applications in memory.

Have you ever been using your computer, and all of a sudden, everything locks up? How about everything just gets really slow? Anyone remember the warning that the early versions of Windows would give you about being "out of virtual memory"? Well I still see this problem. For me, Firefox periodically tries to take >2gb of ram[1]. Since my machine only has 2gb of ram, when that happens, my computer slows to a crawl or even locks up until it is out of swap and the kernel kills firefox.

Usually, the only thing I want to do when my computer starts slowing down is find out the culprit and kill it. All I really need for that is my terminal[2]. So I thought "I wonder if it is possible to prevent my terminal from being swapped out?" With some investigation, I discovered mlock(2) which allows you to do just that! So I just modified my terminal a bit so that it mlocks itself when it starts.

Now my terminal is a little special. I use rxvt-unicode which includes a special two part option: a daemon, and a client. The daemon sits in memory with a full working copy of the terminal, and the client just spawns new instances of that background terminal. The benefit of this is twofold: one, faster bootup... when you start a new client, it only has to read ram to start, instead of having to read from the disk, and two, the read-only parts of the terminal can be (and are) shared among all the clients.

So what i'm saying is that I didn't actually modify the terminal, I modified the daemon. So the patch here modifies the daemon to add the -l or --lock option which calls mlockall to lock itself in memory.


[1] Firefox may not be the real culprit... it may be a plugin (flash).
[2] That's not actually true. I also need things like bash, top, kill, and whatever is interpreting my keystrokes.

Tuesday, January 20, 2009

My Resume

So I decided I need to update my resume. But i've been playing with LaTeX lately, and so I figured i'd do it in LaTeX. What's latex you may ask?

Latex is a typesetting package that allows you to write really pretty documents. here's one I wrote for my biology lab. Everything except the graph is latex. This is the document that made it.

So, short story short, my resume is now here.