Friday, October 8, 2010

Codeigniter Loading Singleton

I tried many times to register at the codeigniter forum, but the captcha is not letting me through. So I'll do my update here.

From this: http://codeigniter.com/forums/viewthread/150117/
Ketama has an example to load a library that is a singleton. However, if you are on PHP 5.2 and lower, you will have a problem. You will get a "Paamayim Nekudotayim" error.


Basically, before PHP 5.3, you cannot call a static method where the class is a variable. So the line below will give you an error.
$CI->$classvar = $name::getInstance($config);

$name cannot be used to make a call to the static method of getInstance. There are two ways around this. First is to use the eval() command, but this is deemed to be up to 10 times slower (read this somewhere...no link), while the second solution of being 3 times slower seems to be the acceptable method. It is to do this:

$CI->$classvar = call_user_func_array(array($name,'getInstance'), $config);

By using the call_user_func_array() function, this will work with PHP versions older than PHP 5.3.

I've also made some minor changes to the code proposed to more suit my liking (in MY_Loader.php [CI version 1.72], subclass from CI_Loader and copy and paste the _ci_init_class() function and make the following change).
// Instantiate the class
$CI =& get_instance();
// modification start
if ($config !== NULL)
{
  if (isset($config['singleton']) ? 
    $config['singleton'] === TRUE : FALSE)
  {
    // for PHP 5.3 and above
    //$CI->$classvar = $name::getInstance($config); 
    $CI->$classvar = call_user_func_array(array($name,'getInstance'), $config);
  } else
  {
    $CI->$classvar = new $name($config);
  }//End If. Added support for singleton Libraries
} else
{
  $CI->$classvar = new $name;
}
// modification ends

To use, put the MY_Loader.php and your singletone file both into your system/applications/libraries/ directory. Then in your controller put in the following:

$this->load->library('MYLogger', array('singleton'=>TRUE));

That's all!

Thursday, February 11, 2010

Centralised Location-based Engine (CLBE)

With the new money being pumped into Wireless@SG, one of the new feature is providing LBS (Location Based Services).

The press release is here

From there you can goto the FAQ page.

So the question is that would you pay $200/mth for this?

Friday, January 22, 2010

Creating ico files

To put it simply, this don't work
http://msdn.microsoft.com/en-us/library/ms997636.aspx

This works.
http://egressive.com/tutorial/creating-a-multi-resolution-favicon-including-transparency-with-the-gimp

Case closed. Wasted 1/2 day following the official advise thinking I did something wrong.

Automating ssh, ftp, scp

A really good way to automate ssh, ftp or scp is to use "Expect" (http://expect.nist.gov/). To kick it off, just use "autoexpect" which records your key stroke into an expect script and you just need to run the expect script and it can be cron. Easy as that.

Then again, if everything is so easy, we would lose our jobs. More often than not, there is some customization required. Expect is based on tcl, so if you are familiar with tcl, you are good. If not just search for what you want to do in tcl and usually there should be someone who has already came across the problem and someone else has helped.

In my case, I need to scp all the files in one directory into a remote server. In autoexpect, I used the following command.

autoexpect scp /somedir/* user@remoteserver:/somewhere/

The problem is that the /somedir/* is expanded to list out all the files in the directory. In the generated expect file it looks like this

spawn scp /somedir/f1 /somedir/f1 /somedir/f3 user@remoteserver:/somewhere/

Now we know that the files will change so this won't work. In this case, a bit of scripting is needed:

set files [glob -directory /home/koopt/user_backups/ *]
set source ""


foreach f $files {
  set source "$source $f"
}
spawn scp $source user@remoteserver:/somewhere/

The function "glob" will list out all the files in full path and we just loop through the files to get a long list of files to scp to the remote server.