python singleton

A version of python singleton pattern, it is not very pretty and breaks a bunch of pep 20, but in some cases is useful.

Singleton Pattern

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Singleton(object):
    __instance = {}
 
    def __new__(cls, *args, **kwargs):
        if cls.__name__ not in cls.__instance:
            cls.__instance[cls.__name__] = super(cls.__class__, cls).__new__(cls, *args, **kwargs)
            setattr(cls.__instance[cls.__name__], '__init', True)
        else:
            setattr(cls.__instance[cls.__name__], '__init', False)
        return cls.__instance[cls.__name__]
 
    def __init__(self, *args, **kwargs):
        if getattr(self, '__init', False):
            # do initialization here
            pass

Alternatively consider the Borg Pattern below.

Borg Pattern

1
2
3
4
5
6
7
8
class Borg(object):
    __state = {}
 
    def __init__(self):
        self.__dict__ = self.__state
        if 'my_data' not in self.__dict__:
            # do initialization here, i.e.:
            self.my_data = 'initialize your data'

 

listening to posix style signals

A quick self reminder.

#include <stdio.h>
#include <string.h>
#include <signal.h>
 
void handler(int signal)
{
    printf("Signal: %s\n", strsignal(signal));
    if (signal == SIGABRT)
    {
	raise(SIGKILL); // can't be caught or ignored
    }
}
 
int main(int argc, char *argv[])
{
    signal(SIGABRT, handler); // Abort
    signal(SIGFPE, handler);  // Floating-Point Exception
    signal(SIGILL, handler);  // Illegal Instruction
    signal(SIGINT, handler);  // Interrupt
    signal(SIGSEGV, handler); // Segmentation Violation
    signal(SIGTERM, handler); // Terminate
    signal(SIGQUIT, handler); // Terminal quit
 
    printf("Hello Crazy World!\n");
 
    raise(SIGABRT); // raise Abort
 
    printf("I am never going to be printed...\n");
 
    return 0;
}

 

git memo

Git, in my opinion, is undoubtedly the best version control system, mostly, but not only, for its distributed nature, and the way branching and merging are handled.

However having used subversion for many years I find git learning curve a real pain, some of the commands are slightly arcane, therefore not easy to remember.

In this post I will try to keep a git memo of commands that I occasionally need and regularly forget:

create new repo with first commit and push

assuming new repo is called hayate

  • add hayate to gitosis config file (gitosis.conf)
    more on gitosis in this excellent tutorial: http://scie.nti.st/2007/11/14/hosting-git-repositories-the-easy-and-secure-way

    [group hayate]
    writable = hayate
    members = andrea@myhost

    then git add --all, git commit -a -m 'added hayate repo', git push
  • go in the hayate directory i.e. cd /var/www/hayate and type git init
  • git remote add origin git@hostname.com:hayate.git
  • add and/or update files and directories
  • git add --all
  • git commit -a -m 'First hayate commit'
  • then for the first push: git push origin master:refs/heads/master which creates the master branch

tagging

  • git tag v1.0 -m 'my first tag'
  • git push --tags commits the tag
  • git tag -l list all tags

clone into current directory

  • git clone git@hostname.com:hayate.git . <- note the dot (hayate directory will not be created)

change working branch

  • git branch -l lists local branches
  • git checkout <branch-name> switches working branch to “branch-name”

remove an added file or directory (before it is committed)

  • git reset <file-or-directory-name>

add submodule (an external repository) within local source tree

  • git submodule add <repo-url> <local-path>
    i.e. git submodule add git@hostname.com:hayate.git hayate

checkout a submodule

  • git submodule update --init

create a new remote branch tracking it locally

  • git checkout -b <branch_name>
  • git push -u origin <branch_name>
  • git checkout <branch_name> to switch to the new branch

start tracking a remote branch

  • git checkout --track -b <local name> origin/<remote name>

delete a remote branch

  • git push origin --delete <branch_name>

delete local branch

  • git branch -D <branch_name>

revert a merge

  • git revert -m 1 merge_hash

to suppress the following warning

warning: You did not specify any refspecs to push, and the current remote
warning: has not configured any push refspecs. The default action in this
warning: case is to push all matching refspecs, that is, all branches
warning: that exist both locally and remotely will be updated. This may
warning: not necessarily be what you want to happen.
warning:
warning: You can specify what action you want to take in this case, and
warning: avoid seeing this message again, by configuring ‘push.default’ to:
warning: ‘nothing’ : Do not push anything
warning: ‘matching’ : Push all matching branches (default)
warning: ‘tracking’ : Push the current branch to whatever it is tracking
warning: ‘current’ : Push the current branch

  • git config [--global] push.default current (–global is optional)

 

TIC – Text Image Converter

This is a php5 library (two classes) I wrote to convert TrueType Font text into an image, using the GD library.
The project is hosted and can be downloaded from github: http://github.com/hayate/tic (it includes an example, documentation and some free fonts)
or using git: git clone git://github.com/hayate/tic.git
Documentation is also available online here: http://www.andreabelvedere.com/docs/tic/

To extend the library to add support for other Font types just extend the TIC abstract class and implement the create and dimension methods.

See example below on how to use it:

<?php
/**
 * @file image.php
 */
require_once 'lib/tic.php';
 
TIC::factory('fonts/AAJAX.TTF')
    ->setText('Hello World !')
    ->setBgColor(0x00, 0xff, 0xff)
    ->setFontColor(0x00, 0x00, 0x00)
    ->setFontSize(24)->create(true);

Than in your html:

<img src="image.php" alt="TIC" />

That will output the following image:

TIC

The library is under the LGPL license, which means you can freely use it for commercial and non commercial applications, please post a comment for feedbacks, bugs, or links of projects where you have use it.

subversion propset svn:ignore

This is a quick self-reminder on propset svn:ignore command.

To ignore all content in directory foo but not the directory:
svn propset svn:ignore '*' foo
To ignore the directory and its content:
svn propset svn:ignore 'foo' .

Web Font Tester

The quick brown fox jumps over the lazy dog !

Font Name  (i.e. Arial, Courier etc.)
Font Size
Bold  
 

Linux pipe find with rm

find /path/to/dir -name name_of_file_to_match | xargs /bin/rm

I use often the above command to clean a directory from all the back up files created by emacs, so for example if I am developing a site at: /var/www/a-site/ then at the end of the day or at the beginning of a new one I clean up the directory as follow:
find /var/www/a-site -name '*~' | xargs rm
Be careful with the above command, specially if you run it as root and you get wrong the regex you could delete things you didn’t mean to !

Compile emacs mode extensions

Occasionally I want to compile a new mode for emacs but I can never remember the command so here it is:

M-x byte-compile-file [RET]
This is: press the “Esc” key (top left on my keyboard), then the letter x, then type “byte-compile-file” and press the return key.

or to compile all .el files in a directory:

[ESC] x byte-recompile-directory [RET]