Custom configuration files in CakePHP

Written by: daniel

Date September 19, 2008

In order to speed up our development process and following the DRY rule we always try to split our code in reusable modules. Then when creating a new project we just get them one by one and add to the current code. Its pretty easy and efficient (now we can spend this time on adding new cool features) but there is one problem when this custom modules need some extra functions or configuration.

Let’s take a look for example at our contact module, that creates a simple contact form. In order to work properly, it needs to have these variables configured when cake starts:

Configure::write(’Admin.name’, ‘John Smith’);
Configure::write(’Admin.email’, ‘admin@example.com’);

This way, we can use this data across our application and they can be changed easily if necessary.

OK, as we know this can be added easily to the bootstrap.php file, but there is always a pain to remember to do it when installing a module. And if you have a dozen of modules this becomes a big hassle to go and manually add stuff for each of them.

Our solution is to create a custom directory in app/config, let’s say its my_config, and then command cake to load at bootstrap all files it finds there. Now our modules can provide their own configuration files which are included automatically.

The function that loads these files is placed in /app/config/bootstrap.php and it’s pretty simple:

<?php

//include all php files from app/config/my_config
foreach(glob(APP.”config/my_config/*.php”) as $configFile) {
include($configFile);
}

?>

Quick copy of data from one db to another on linux

Written by: daniel

Date September 18, 2008

mysqldump -u user1 -p -h host1 sourcedatabase | mysql -u user2 -p -h host2 -D destinationdatabase

El pueblo habla

Written by: daniel

Date September 17, 2008

No estoy seguro hasta que punto esto puede ser un reflejo de la omnipresente crisis económica, pero últimamamente ha aumentado mucho el numero de manifestaciones que pasan cerca de mi casa.

Supongo que ante una situación difícil la gente tiende a quejarse más y exigir que las autoridades tomen medidas…

Copy messages from a Thunderbird mbox file to a MySQL table using php

Written by: Maciej Grajcarek

Date July 1, 2008

If for some reason you would like to copy your messages from Thunderbird to a MySQL database, here you can find a simple PHP script which will do it for you! All you have to do is to set some variables in the php class and create a proper database table. Let’s start with the class.

var $file_name = 'some_mbox_file';
var $file_path = '/path/to/file/';

var $db_user = 'user';
var $db_password = 'pass';
var $db_host = 'localhost';
var $db_name = 'mbox';

$file_name is the name of the thunderbird mbox file and $file_path points to the folder it is located (deafult path in Windows looks sth like this: C:\\Documents and Settings\\%user%\\Application Data\\Thunderbird\\Profiles).
You should also define the database connection variables.

Next thing is to create a database table:


CREATE TABLE  `messages` (
`id` int(10) unsigned NOT NULL auto_increment,
`from` varchar(255) collate latin1_general_ci NOT NULL,
`to` varchar(255) collate latin1_general_ci NOT NULL,
`subject` varchar(255) collate latin1_general_ci NOT NULL,
`date` varchar(255) collate latin1_general_ci NOT NULL,
`message` text collate latin1_general_ci NOT NULL,
`received_ip` varchar(15) collate latin1_general_ci NOT NULL,
PRIMARY KEY  (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci;

As you can see, this script will read: from, to, subject, date, received_ip and message fields for each of messages. It will not copy attachments!

It supports also processing of big files. We have used it to parse files bigger than 3GB.

server crash

Written by: daniel

Date July 1, 2008

Hemos perdido temporalmente los datos del blog pero finalmente se ha podido restaurar todo :) Por suerte hemos tenido un backup. Así que ya estamos de vuelta.

CakePHP 1.2 Filter Component

Written by: Maciej Grajcarek

Date June 11, 2008

Tworzenie formularzy i metod służących do filtrowania danych jest bardzo częstym zadaniem w codziennej pracy programisty. Zwykle, aby osiągnąć pożądany efekt, korzystałem z kombinacji metod modelu i kontrolera . Zwykle oznacza to również pisanie wielu linii kodu i strata czasu na mało interesujące zadanie. Zacząłem więc szukać rozwiązania, które zdejmie ze mnie choć troszkę pracy. Najbardziej interesujący okazał się dla mnie kod zaprezentowany przez Pana Nik’a Chankov’a na jego blogu, który to kod stał się fundamentem do moich dalszych prac.

Read the rest of this entry »

Script de inicio de darkice para el Ubuntu

Written by: daniel

Date May 31, 2008

Darkice es uno de los programas más populares, a la hora de montar una radio online sobre el GNU/Linux. Es bastante estable y funciona bien con el Icecast2.

Sin embargo, la versión que está en los repositorios tiene dos pegas:

1) no tiene soporte para emisión en el formato mp3. Y aunque el formato libre ogg está ganando cada vez más popularidad, todavía hay mucha gente que espera tener un stream mp3.

Para resolver este problema, hay que compilar el programa desde el código fuente. Es bastante fácil y puedes encontrar una guía aquí.

2) el programa no funciona por defecto en modo de demonio. Por supuesto podríamos arrancarlo con

sudo darkice -c /etc/config.cfg &

para ponerlo en el segundo plano, pero no tenemos una opción fácil para iniciarlo automáticamente por ejemplo cuando arranca el sistema. El programa tampoco crea un archivo de identificación de proceso (ing: pid file), que podría servirnos si tenemos un sistema de monitorización de servicios como por ejemplo el monit.

Así que, tomando el archivo de aranque que viene con la instalación de icecast2 como modelo, he creado uno para el darkice.

#! /bin/sh
#
# Darkice init file
#

PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
DAEMON=/usr/local/bin/darkice
NAME=darkice
DESC=darkice

test -x $DAEMON || exit 0

# Defaults
CONFIGFILE=”/etc/darkice.cfg”
USERID=root
GROUPID=root
PIDFILE=”/var/run/darkice.pid”

set -e

case “$1″ in
start)
echo -n “Starting $DESC: ”
start-stop-daemon –start –quiet –chuid $USERID:$GROUPID \
-b -m -p $PIDFILE –exec $DAEMON — -c $CONFIGFILE
echo “$NAME.”
;;
stop)
echo -n “Stopping $DESC: ”
start-stop-daemon –stop –oknodo –quiet -p $PIDFILE
echo “$NAME.”
;;
reload|force-reload)
echo “Reloading $DESC configuration files.”
start-stop-daemon –stop –signal 1 –quiet -p $PIDFILE
;;
restart)
echo -n “Restarting $DESC: ”
start-stop-daemon –stop –oknodo –quiet -p $PIDFILE
sleep 1
start-stop-daemon –start –quiet –chuid $USERID:$GROUPID \
-b -m -p $PIDFILE –exec $DAEMON — -c $CONFIGFILE
echo “$NAME.”
;;
*)
echo “Usage: $0 {start|stop|restart|reload|force-reload}” >&2
exit 1
;;
esac

exit 0

Ahora ya podemos ejecutar el darkice con el tradicional:

sudo /etc/init.d/darkice start

De la misma manera podemos crear scripts para otros programas que normalmente no los tienen.

upload behaviour

Written by: adziki

Date May 30, 2008

Upload behaviour jest pomocny przy wysyłaniu plików formularzem html. Kod razem z przykładem użycia można ściągnąć z naszego repozytorium svn.

Podstawowe możliwości

Jest to prosty mechanizm pozwalający na automatyczne zapisywanie plików wysłanych formularzem. Zakładamy, że mamy model Myfile, który łączy się z tabelą myfiles. W tabeli interesuje nas jedno pole myfile typu string (255). W widoku tworzymy prosty formularz który umożliwi wysłanie do interesującego nas pola plik, zamiast tekstu:

$form->create(Myfile,array('type'=>'file'));
$form->input(Myfile.myfile, array('type'=>file));
$form->end('Submit');

Do utworzenia pola uploadu plików można również skorzystać z uploadHelper

W kontrolerze nie musimy dodawac nic poza standardowym kodem który umożliwi zapisanie rekordu. Behaviour wykryje, ze dane pole zawiera plik i automatycznie go przetworzy.

W modelu wystarczy dopisać nastepujaca linie, zeby cieszyć się jego podstawowymi funkcjami.

var $actsAs = array('Upload');

Upload behaviour zapisuje pliki w katalogu APP/webroot/files/[nazwa modelu]. Nazwa pliku jest znormalizowaną nazwą pliku wysyłanego (zawiera tylko litery alfabetu łacińskiego i podkreślenia).

Jeśli nie korzystamy z walidacji, behaviour “testuje” każde pole typu string w modelu - czy nie wysłano za jego pomocą plików. Jeśli tak w polu zostaje umieszczona nazwa pliku a plik zostaje zapisany w docelowym katalogu.

Usuwanie plików

Jeśli nie korzystamy z uploadHelper, należy dodać do formularza pole:

$this->form->input('myfile_delete', array('type'=>'checkbox'));

Zaznaczając checkbox można w łatwy sposób usuwać pliki.

Dla zapewnienia spójności plików z powiązanymi rekordami w bazie danych pliki są również usuwane automatycznie:

  • przy usuwaniu rekordu,
  • oraz przy edycji rekordu połączonej z wysłaniem nowego pliku w miejsce poprzedniego.

Walidacja

Jeśli chcemy skorzystać z walidacji do modelu trzeba dołączyć konfigurację walidacji:

function __construct(){
parent::__construct();
$this->validate = array(
'myfile' => array(
array('rule'=>array('validateUpload'), 'on'=>'create',  'message'=>'', 'last'=>true, 'allowEmpty'=>false),
array('rule'=>array('validateUpload'), 'on'=>'update', 'message'=>'Nie wysłano', 'required'=>false),
array('rule'=>array('validateMime','image'), 'message'=>__("Plik musi być obrazkiem (gif, jpeg albo png)",true)),
),
);
}

Dodatkowo, żeby walidacja przebiegała bez problemów konieczne jest dodanie poniższego kodu do modelu:

function save(&$data, $validate = true, $fieldList = array()){
if(parent::save($data, $validate, $fieldList)){
return true;
}
$data = $this->data;
return false;
}

Jak dotąd dostępne są dwie funkcje walidacji:

  • validateUpload - za jej pomocą można sprawdzić poprawność uploadu pliku
  • validateMime - można określić dozwolone typy plików

validateMime

W validateMime są trzy sposoby zdefiniowania zakresu dozwolonych plików:

  1. Predefiniowane ustawienie - jak narazie tylko ‘image’
    (odpowiada wyrażeniu regularnemu: '/^image\/(pjpeg|jpeg|jpg|png|gif)$/');
    użyte w powyższym przykładzie
  2. Tablica typów mime - np array('text/plain','text/css');
    (Nie może to być tablica wyrażeń regularnych)
  3. Dowolne wyrażenie regularne (Perl-Compatible)

upload Helper

Jest to rozszerzenie dla standardowego formHelper, można je pobrać w naszym repozytorium svn. uploadHelper dostarcza jak dotąd tylko jedną funkcję, bardzo prosta w użyciu, utrzymana w stylu form helpera:

echo $upload->input('myfile', array('delete'=>false, 'preview'=>array('rel'=>'lightbox')));

Standardowo funkcja input generuje link do pliku (jeśli już jakiś został przesłany), pole typu file do wysłania pliku formularzem i pole checkbox do usuwania pliku. Funkcja upload::input() umożliwia dostęp do parametrów linku podglądu, oraz pola do usuwania plików poprzez elementy tablicy opcji o kluczach ‘preview’ oraz ‘delete’. W powyższym przykładzie checkbox do usuwania plików został wyłączony, a do odnośnika został dodany atrybut rel=”lightbox”.

cambios de hardware

Written by: daniel

Date May 30, 2008

Los últimos días han traído muchos cambios de hardware. Primero, después de una larga agonía, se ha muerto mi ordenador principal de trabajo. Daba tantos problemas que decidí cambiarlo por uno nuevo. Opté por algo simple pero aún así es un cohete comparado con el antiguo.

Para poder usar dos pantallas (algo indispensable, creo, a la hora de trabajar cómodamente) le añadí una tarjeta gráfica Ati Sapphire HD3650. La primera elección fue una NVidia PointOfVidew 7300GT pero por alguna estraña razón no he sido capaz hacer que funcionasen con ella los dos monitores a la vez. Así que al final la cambié. Y as ati siempre me han dado buenos resultados con Ubuntu.

Y para terminar, una sintonizadora de tv. No suelo ver mucha tele, pero a veces está bien poder ponerla en el ordenador si justamente echan algo interesante ;) Con una LifeView Trio (con tv analógica, tdt, radio y satélite) no tuve que hacer nada para que funcionase (aunque todavía estoy por probar la tv analógica y la satélite).

De paso probé también una sitonizadora usb para mi portátil, pero la LiveView LV5T no me permitió ver la tele en más de 320×240 (y sin hablar ya de la pantalla completa) y finalmente resití. No sé si es la tarjeta tv o la gráfica del portátil que no llega, pero con 3GB de memoria y dos procesadores esperaría un mínimo ;)

Con la compra de la tarjeta tv me llevé una buena sopresa cuando al abrir la caja me di cuenta que no contenía ni la tarjeta ni el mando de la distancia! Por suerte, en la tienda resultó que la habían puesto en el escaparate y a la chica que me la vendió no se le había ocurrido revisar la caja (ni a mi tampoco). Por suerte todo acabo tan sólo con un pequeño susto.

Otro cambio sorpresa fue una super pantalla Mitsubishi Diamond Pro 2045 de 22 pulgadas, regalo de mi amigo y compañero de trabajo Biel que cambiaba el mobiliario.

Así que después de unos días agitados y muchos cambios ahora otra vez podemos volver a hacer cosas :)

Servidor sms con ubuntu, smsd y nokia 6020

Written by: daniel

Date May 15, 2008

A veces lo nuevo no siempre es lo mejor. Al menos ésta es mi experiencia a la hora de conectar los teléfonos móviles con el linux. En mi casa tengo varios modelos, principalmente de nokia (n70, 6151) y he tenido varios problemas para hacerlos funcionar bien. Así que finalmente tuve que buscar un antiguo nokia 6020 para jugar un poco con los smses en mi sistema.

En el linux existe una manera relativamente simple para crear

Qué necesitamos:
- gnokii, el programa que nos permite conectarnos con el teléfono
- smsd, el servidor de recepción y envío de mensajes
- smsd-mysql, un módulo para guardar los mensajes en la base de datos

Además:
- un teléfono, yo uso un nokia 6020, comprado por tres duros en el ebay.es
- un cable de conexión usb DKU-5 (CA-42 también sirve, parece)

La configuración es bastante simple:
Una vez instalados los programas con el apt, conectamos el teléfono a un puerto usb.

En mi caso, cuando conectaba el cable al teléfono, en la pantalla del móvil aparecía el mensaje “Dispositivo no admitido”, pero comprobándolo con el dmesg en la consola, pude ver que se conectó correctamente y apareció como /dev/ttyUSB0

Ahora configuramos el gnokii, creando el archivo ~/.gnokiirc :
[global]
port = /dev/ttyUSB0
model = 6020
initlength = default
connection = dku5
use_locking = yes
smsc_timeout = 10

podemos comprobar si funciona bien, escribiendo en la consola:
gnokii –identify

esto debería mostrarnos información básica sobre el teléfono.

ahora debemos crear una base de datos para smsd.
Buscamos en el disco:
locate sms.tables.mysql.sql

en mi caso estaba en:
/usr/share/doc/gnokii-smsd-mysql/sms.tables.mysql.sql

y lo ejecutamos con el cliente mysql:
mysql -u root < sms.tables.mysql.sql

ahora podemos inicial el servidor sms:
smsd -u root -d smsgw -m mysql

y en unos segundos podemos ver como el programa descarga los mensajes de nuestro teléfono y los pone en la tabla inbox de la base de datos.