Sunday, May 30, 2010

Nil-coalescing in Ruby

In Ruby, you can check if an object is nil with the nil? method:

if @foo.nil? then
    @foo = Foo.new
end

But this can be shortened via the || operator:

@foo = @foo || Foo.new

Better yet, we can shorten it even more with the ||= operator:

@foo ||= Foo.new

Both the above assignments assign Foo.new to @foo if and only if @foo is nil or false, else leave @foo as it is.

Saturday, May 15, 2010

Compiling a LaTeX document with Bibtex references

To successfully compile a LaTeX document with Bibtex references, you need to execute 4 steps.

In this case, I'm assuming my document is called MyTexDoc.tex and I want to compile to the pdf file format; for the dvi file format, change the below commands to latex instead of pdflatex.

1. pdflatex MyTexDoc Creates .aux files which include the keywords of your citations
2. bibtex MyTexDoc Extracts cited publications from the .bib file file, using the .aux file and formats them according to your indicated bibliography style. Finally the results are put into a .bbl file
3. pdflatex MyTexDoc Inserts the appropriate reference indications at each citation according to your indicated bibliography style
4. pdflatex MyTexDoc Refines citation and cross references, page formatting and page numbers

Ideally, the above are stored in a shell script (Linux) or batch file (Windows) and execute that file whenever you need to compile the document.

Wednesday, May 12, 2010

Ubuntu with multiple monitors having multiple panels (taskbars)

The following is how I enabled multiple panels (taskbar in Windows) in Ubuntu for my, currently two, monitors and my nvidia card. In this tutorial, the words panel and taskbar will be used interchangeably.

First, go to your nvidia settings page with: sudo nvidia-settings and in the X Server Display Configuration section, set the Configuration of monitors to TwinView. Apply and Save to X configuration File.

After all that, Log Out so that the X Server can be restarted and your settings can be applied.

When you now log in, you should have your multiple monitors enabled and a desktop that is stretched across the monitors. Now it's time to add a panel (taskbar) to your other monitors.

Right click on your existing panel and select New Panel. Your new panel will now be added to your primary monitor. Right click on it and set it's Orientation to Bottom.

Next, hold the ALT key and drag your newly created panel to the other monitor.

The final step is to set the panel to display the windows that currently on that monitor. To do this, right click on it and select Add to Panel and choose Window List. Now you should see your windows on the new taskbar.

Thursday, May 6, 2010

Translating brainfuck code to ANSI-C code with BrainfuckToC

This is my latest project. An application that translates brainfuck code to ANSI-C code.

To download the sources, visit the Google Code brainfucktoc page.

I would also like to thank Reuben Sammut who is a contributer to the project.

Usage

bftoc <source file>

Example:

bftoc bfcode.b

This will take a brainfuck source file and output its equivalent C code.

If you want to redirect the output to a text file, run bftoc as follows:

bftoc bfcode.b > bfcode.c

Examples

Hello World
Input:
++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++.>+.+++++++..+++.>++.<<+++++++++++++++.>.+++.------.--------.>+.>.
Output:
#include <stdio.h>
#include <stdlib.h>

int main () {
    char *ptr = calloc(10000, sizeof *ptr), *start = ptr;
    int i = 0;

    *ptr += 10;
    while (*ptr) {
        ++ptr;
        *ptr += 7;
        ++ptr;
        *ptr += 10;
        ++ptr;
        *ptr += 3;
        ++ptr;
        ++*ptr;
        ptr -= 4;
        --*ptr;
    }

    ++ptr;
    *ptr += 2;
    putchar(*ptr);
    ++ptr;
    ++*ptr;
    putchar(*ptr);
    *ptr += 7;
    putchar(*ptr);
    putchar(*ptr);
    *ptr += 3;
    putchar(*ptr);
    ++ptr;
    *ptr += 2;
    putchar(*ptr);
    ptr -= 2;
    *ptr += 15;
    putchar(*ptr);
    ++ptr;
    putchar(*ptr);
    *ptr += 3;
    putchar(*ptr);
    *ptr -= 6;
    putchar(*ptr);
    *ptr -= 8;
    putchar(*ptr);
    ++ptr;
    ++*ptr;
    putchar(*ptr);
    ++ptr;
    putchar(*ptr);

    free(start);
    return 0;
}