Thursday, December 25, 2008

Ruby Ternary Search Tree

Simple Ruby Ternary Search Tree Implementation.

Currently supports:


  • Insertion (insert)

  • Search (search, node)

  • Printing (to_s)



git clone at: http://github.com/giancarlo/algorithms.git

Wednesday, December 10, 2008

Ruby 1.9 C Api Extensions Guide

I am writing a guide on the Ruby (SVN) C API. You can see it here: http://coaxialhost.com/tutorials/writing_ruby_extensions.html.

Expect more stuff to be added later.

New Mirror Blog and Theme

I have created a wordpress blog in my own server which will eventually replace this site. The blog is at http://cpb.coaxialhost.com.

This new blog has a better format and will implement new features in the future.

Friday, November 21, 2008

Embed Fonts in HTML document using PHP and Javascript

I wrote a php + js script to replace HTML markup with formatted text in the form of images. The script is called PHPJSFont and it is available at http://code.google.com/p/phpjsfont.

What it does is simple: the Javascript code replaces the text inside HTML tags with an image generated by the PHP script.

Currently it depends on JQuery and PHP 4+ compiled with the GD extension and TTF support.

It should be fairly simple to use, as in:


PJF.replace("h2");
PJF.replace("#topmenu UL > LI");
PJF.replace("h1", { size: 20, color: [255, 0, 0] });

Saturday, November 15, 2008

Install Intel Compiler(icc) in Ubuntu 8.10

To install icc in Ubuntu:

  1. Download icc from Intel website

  2. tar -zxvf the file.

  3. Run 'install.sh'.

  4. Follow the installer instructions.

  5. When it is done add this line to your ~/.bashrc (or initialization script):
    source /opt/intel/Compiler/11.0/069/bin/iccvars.sh ia32
    Replace ia32 with your platform: (ia32, intel64, ia64)

  6. Log off and log in and that is it. You can test it with icc -v

  7. To use icc with a configure script use ./configure CC=icc


NOTE: If you get a libimf.so error like "file does not exists" while using sudo, you will need to write a bash script adding "source /opt/intel/Compiler/11.0/069/bin/iccvars.sh" and the program you are trying to run.

Wednesday, October 1, 2008

Ruby 1.9 Blocks Notes



  • Every function can accept a block.

  • Kernel.block_given? will tell you if a block was passed.


  • def test
    a = 42
    yield(a) if block_given?
    end

  • To assign the block to an argument, you add an ampersand (&) in front of the last argument of your function. This will affect performance.

  • You can call the block inside the function using yield or Proc.call like this:


  • def test(&block)
    a = 42
    yield(a) # or block.call(a,b)
    end

  • yield calls and passes the arguments to the block.

  • block.arity will tell you the number of arguments a block can accept

  • If you have a recursive function accepting a block, you can pass the block to it using '&'.


  • def recursive_function(&block)
    # Do stuff
    recursive_function(&block)
    # pass to other functions accepting blocks
    10.times &block # will run block 10 times
    end

  • If you use the return keyword inside a block, it will return the value and exit the function binded to the block, which is the one that created it.


  • def bl(&block)
    yield
    end

    def test
    bl { return }
    puts "Hello" # this will not be executed.
    end

  • You can use break to return a value inside a block and stop iterating.


  • def bl(&block)
    (0..10).each &block
    end

    def test
    # This block will stop iterating at 5 and return true.
    bl { |x| (break true) if (x == 5); false }
    end

Thursday, September 4, 2008

Using SyntaxHighlighter with Blogger or Blogspot

I added Syntax Highlighting capabilities to this blog and here it is how i did it. You might need another server where to put your files:

  1. Download SyntaxHighlighter from http://code.google.com/p/syntaxhighlighter/downloads/list.

  2. Add this to your Edit HTML code in Layout:

  3. <script language='javascript' src='http://www.url.com/Scripts/shCore.js'></script>
    <script language='javascript'>
    window.onload = function() {
    dp.SyntaxHighlighter.ClipboardSwf = 'http://www.url.com/Scripts/clipboard.swf';
    dp.SyntaxHighlighter.BloggerMode();
    dp.SyntaxHighlighter.HighlightAll('code');
    }
    </script>
    <link href='http://www.url.com/Styles/SyntaxHighlighter.css' rel='stylesheet' type='text/css'/>

  4. Put the code you want to highlight inside a <pre> tag like this:

  5. <pre name='code' class='language'>
    code;
    </pre>

  6. Make sure you replace the url and also '<' with &lt; if you are using HTML code

  7. Add this to the top of your post:

  8. <script language='javascript' src='http://www.url.com/Scripts/shBrushXml.js'></script>

  9. Replace the script name with the one used for your language.



For more information and language list visit http://code.google.com/p/syntaxhighlighter/w/list.

Wednesday, September 3, 2008

CSS Sprites



What a wonderful idea, simple and easy. A great way to reduce HTTP GET's.

How to use it in your application:


  1. Find/Buy a good icon set (like tango), try to find a transparent one.

  2. Place a div where the icon would be located and set its onclick event to whatever you want it to do.

  3. create a css class for the icon:


  4. .icon-name {
    display: block; height: 32px; width: 32px;
    background: transparent url(icon.png) -(x)px -(y)px no-repeat;
    cursor: pointer;
    }

  5. Change height, width and (x) and (y) position with the respective values.

  6. assign the class to your div.


Pretty easy.

Ruby on V8



What a great idea, someone put together a hacked version of ruby for the v8 engine based on hotruby.js. It is not a real compiler but it works.

Now, Who is going to make a real port of Ruby to the v8 engine? Sounds like an interesting project. Just what we need, another ruby virtual machine/interpreter!!

Tuesday, September 2, 2008

Chrome


Chrome is fast. Even though I had problems installing it on my laptop win xp sp3, I managed to get a copy of the exe file from http://cache.googlevideo.com/chrome/install/149.27/chrome_installer.exe. I run it and it installed fine. Not sure what the problem was because other people with sp3 could install it just fine. It was probably a disabled service.

Cool things to try in the address bar:

about:network - Network Tools
about:stats - Shhh! This page is secret!
about:cache - Cache.
about:histograms - Data about chrome features.
about:plugins - Installed Plug-ins.
about:dns - DNS records.
about:version - Google Chrome browser version.
https://gmail.com - This one is pretty bad actually... No one is perfect.

To access google's task manager: right click in the blue space at the top and click Task Manager.

Bad news: still doesn't work on linux(nor wine) or macs.

Friday, August 29, 2008

Understanding a Crazy Programmer



Found this on the net. If you have any problems with a programmer in your team, this article/blog might help.

Learning Lisp - Do you know any programmers that exhibit these personality traits?

Tuesday, August 5, 2008

Catching Ctrl+C in Ruby 1.9

Ctrl+C sends a SIGINT signal to the kernel.
To catch it and execute code we use:
Kernel.trap('INT') { code }
Remember to call Kernel.exit if you want to terminate the execution of your ruby script. Kernel.trap can also catch other signals. For more information visit: Kernel.trap

Saturday, August 2, 2008

Storing Passwords securely


The best way to store a password: Salt it then Hash it.

To salt it add random characters to the password entered by the user. Remember we are going to need those random characters later so save them somewhere you can retrieve them later. I would say insert them in fixed locations in the hash. To hash it use the md5 or sha1 function. You can find these functions in the encode ruby extension.

To authenticate the user, you will need to pull the hash associated with the username, retrieve the salt characters, apply them to the password entered by the user, hash it and compare.

Is there a better way?

Tuesday, July 29, 2008

Terminal Awesomeness


The best way to make your desktop look nice is to add true transparency to your terminals. I got urxvt with true transparency enabled working with xcompmgr and it looks wonderful.

xcompmgr is a lightweight composite window manager.
urxvt is an xterm-like terminal lightweight and fast.

I'm using openbox as a window manager and hsetroot to set my desktop wallpaper. These are the contents of my ~/.config/openbox/autostart.sh :

hsetroot -fill ~/Desktop/desktop.jpg &
xcompmgr &
rxvt &
docker &


"docker" takes care of the system tray.

To enable transparency in urxvt you need to add these lines to your ~/.Xresources file:
URxvt*depth: 32
urxvt*background: rgba:0000/0000/0000/cccc
URxvt*background: rgba:0000/0000/0000/cccc
URxvt*foreground: green


Change the background and foreground to whatever color you want.

I believe desktop managers like kde or gnome are overrated. Openbox is great and doesn't consume your precious resources so u can use them for more important things like compiling code.

Friday, July 25, 2008

More VIM stuff


Set tab size:
set tabstop=2
Quick Write and quit
:wq
If you press Ctrl+S while on a terminal and it freezes then press the following to unfreeze:
Ctrl+Q
Working with tabs
:tabe file # Opens File
:tabn # goes to next tab
:tabp # goes to previous tab
:q # closes current tab
gt # will take you to the next tab
gT # will take you to the previous tab

Auto completion
Ctrl+N Ctrl+P
You can also invoke make and grep within vim
:grep args
:make

If you work on windows (gvim.exe) place your vimrc file in the VIM exe directory. You might need to set the environment variable VIM to the path where gvim.exe. Name your vimrc file as _vimrc

Moving to VIM


I decided to make vim my default text editor. Here are a couple of tips:

To get syntax highlighting in vim, add the following to your ~/.vimrc file or enter while editing (command mode, remember to press ':' before entering):
set background=dark # if your console background is dark..
syntax on

To get line numbers:
set nu
To split the screen in 2
split
vsplit # Vertical Split

To Move from split windows
Ctrl+W+(direction)
Open a file
open file
Close a file
close
Search Reg Ex
/regex
Goto Line Number
:number
Search word under cursor
*

I will post more eventually... vim kicks emacs butt by the way.

Friday, July 18, 2008

Ruby 1.9 C API - Object Instances


To Create a new instance of an object with class Class we will do this:

VALUE obj;

obj = rb_obj_alloc(Class); // Allocate space and create new instance
rb_obj_call_init(obj, 0, 0); // We call the initialize method for the object

Remember rb_obj_alloc() does not initialize the object and will seg fault if you use any custom data types in the object.

The 2nd and 3rd parameters of rb_obj_call_init() are the argument count (argc) and the constructor parameters array ( VALUE* ).

Friday, July 11, 2008

Ruby C API - Classes I


To create a class:


VALUE rb_define_class("name", parent_class);
VALUE rb_define_class_under(module_or_class, "name", parent_class);


To create a method:

rb_define_method(class, "name", c_function, argc)

argc is the number of arguments of the function, not including the first parameter of the c_function which would be the instance variable. Default Parameters can be implemented by setting this number to negative. (-1 would mean variable number of parameters, -2 would create an array to store the arguments)

"name" is the name of the method in ruby, for setter methods you would add the = to the name just like in ruby ( ie "name=" ). The same with operator for the [] operator you will use the string "[]" or "[]=".

The format of a ruby function accepting a variable number of arguments (argc = -1) would be like this:


VALUE function( int argc, VALUE* args, VALUE instance );


argc is the number of arguments passed.
args is an array containing the arguments.
instance is the instance of the object.

The format for a ruby function accepting an array of arguments (argc = -2) :


VALUE function( VALUE instance, VALUE array_of_arguments);


To access instance variables you will use this two methods:


rb_iv_get(instance, "variable");
rb_iv_set(instance, "variable", new_value);


stay tuned for part II.

Thursday, July 10, 2008

Firefox Download Antivirus??


I recently noticed that firefox stopped responding for a couple of seconds every time i downloaded a file. The cause was the new virus scan feature. To disable this ( I tried Tools/Options but couln't find anything ) go to about:config and search for browser.download.manager.scanWhenDone then set it to false.

Sunday, July 6, 2008

Ruby 1.9 C API - Exceptions I


rb_raise(exception_object, string_message);
rb_raise will try to call exception_object.new and display string-message as the exception error message.

Some of the built-in exceptions that can be raised are:
rb_eArgError
rb_eEOFError
rb_eException
rb_eFatal
rb_eFloatDomainError
rb_eIndexError
rb_eInterrupt
rb_eIOError
rb_eKeyError
rb_eLoadError
rb_eLocalJumpError
rb_eNameError
rb_eNoMemError
rb_eNoMethodError
rb_eNotImpError
rb_eRangeError
rb_eRegexpError
rb_eRuntimeError
rb_eScriptError
rb_eSecurityError
rb_eSignal
rb_eStandardError
rb_eStopIteration
rb_eSyntaxError
rb_eSysStackError
rb_eSystemCallError
rb_eSystemExit
rb_eThreadError
rb_eTypeError
rb_eZeroDivError