dilluns, 8 de desembre del 2008

Utilitzant counterCache en associacions belongsTo

Una de les novetats que vaig veure revisant la documentació de la versió 1.2 no fa massa va ser que l’associació belongsTo incorporava un nou paràmetre: counterCache. El paràmetre counterCache permet mantenir un atribut amb el comptador de quants models té associat a través de hasMany.

Com utilitzar counterCache? Precisament em va anar perfecte perquè tenia un sistema de noticies amb comentaris i volia mostrar el número de comentaris de les noticies a la portada, així que m’estalvio de fer una consulta amb count o recuperar tots els comentaris amb una join per saber quants comentaris en total té cada noticia. Tenint els següents models:

Noticia hasMany Comentari
Comentari belongsTo Noticia

Al model Comentari la relació belongsTo es defineix amb counterCache com a true.

var $belongsTo = array(
    'Noticia' => array(
            'className' => 'Noticia',
            'counterCache' => true,
     )
);

Afegim el camp comentari_count a la taula de la BD noticies i llestos. Cada cop que s’insereixi (o s’esborri) un comentari, cake s’encarregarà d’actualitzar el camp comentari_count. Fàcil no?

dimecres, 22 d’octubre del 2008

VALID_YEAR versió cakephp 1.2

Estic adaptant a la nova RC3 de cakephp una aplicació web realitzada per la versió 1.1 del framework i, aplicant les noves regles de validació en un model, m’he trobat amb un aspecte amb el que fins ara no m’hi havia topat. A la versió 1.1 hi havia 4 regles que ara estan marcades com a deprecated:

  • VALID_NOT_EMPTY
  • VALID_NUMBER
  • VALID_EMAIL
  • VALID_YEAR

L’equivalent de la primera amb la nova validació de la versió 1.2 és ‘notEmpty’, la segona ‘numeric’, la tercera ‘email’ i la quarta...ei! la quarta com?

La meva primera idea ha estat provar sense èxit amb la regla date

'year' => array('rule' => array('date', 'y'))

Però no accepta un format amb només l’any. Llavors he acabat recorrent a l’expressió regular

'rule' => array('custom', '/^[12][0-9]{3}$/')

'rule' => array('date', null, '/^[12][0-9]{3}$/')

Ambdues opcions fan exactament el mateix –date ignora el segon paràmetre si se li passa una expressió regular-, però potser sembla que passant l’expressió regular a date queda més clar.

Alguna opció millor?

dimarts, 21 d’octubre del 2008

PFC vs ModelBaker

A través d'un dels meus feeds de CakePHP he descobert una aplicació semblant a l'aplicació que vull pel meu projecte anomenada ModelBaker, que pinta molt bé tot i ser només per Mac. De moment es poden veure algunes imatges i un parell de screen casts que donen una idea de les funcions del programa.

Tot i tenir una idea similar no és exactament el mateix que el meu PFC. Podriem dir que ModelBaker afegeix una interfície gràfica molt amigable per construir aplicacions CakePHP, com el bake de consola que proporciona el mateix cakephp però amb GUI (i més opcions per personalitzar també).

La meva idea vol arribar al mateix punt però des d'un punt de partida diferent, a partir d'un esquema conceptual UML. Però no seria mala idea afegir un pas intermig similar al que fa ModelBaker per pulir les opcions del codi a generar segons el framework. I és que una de les intencions és no restringir-ho a un framework concret però certament, aquest punt està per veure. El que no crec que pugui aconseguir pas és una interfície tan clara i ordenada.

dijous, 16 d’octubre del 2008

Començant a parlar del PFC

Aprofitaré el bloc per anar deixant constància dels avenços que pugui realitzar amb el meu Projecte de Final de Carrera, per tal d'acabar l'enginyeria informàtica a la FIB. El PFC que vaig proposar realitzar tracta de desenvolupar una aplicació que, a partir d'un diagrama UML, generi l'esquelet d'una aplicació web.  

Què vol dir això?
Doncs bàsicament una eina CASE específica per a aplicacions web que et generi codi per començar un projecte a partir d'esquemes UML. Però parlar d'aplicació web és massa genèric ja que en realitat el codi generat serà per a un framework PHP.  

Un framework PHP?
Si, concretament per a CakePHP. CakePHP és un framework que evidentment està desenvolupat en PHP i agafa moltes idees de Ruby On Rails. A més aplica patrons com ara el patró MVC, és object-oriented, té una llicència MIT i per si era poc, també és el que conec millor. No obstant, l'aplicació pretén ser el màxim modular possible per a acceptar altres frameworks.
Per desenvolupar l'aplicació he decidit utilitzar C++. La interfície gràfica serà en QT 4, on considero que em puc trobar un dels grans problemes per a generar una interfície suficientment intuitiva on realitzar diagrames de classes en UML. Ja veure'm com va. El que tinc clar és que m'esperen dies de picar tecles i esprémer el cervell... Ah, sabeu quin és el títol?
Desenvolupament d'una eina de traducció UML a esquelet d'aplicació web (per a CakePHP).
No estava gaire inspirat aquell dia, no.

dimecres, 30 de juliol del 2008

Flash que no linka

Fa uns dies que em vaig adonar -per sort abans que l'empresa rebés cap queixa- que una sèrie de banners flash (SWF) que surten a una sèrie de portals de la feina no enllaçaven amb els webs corresponents que publicitaven; simplement s’ignorava el ‘clic’. Això passava amb tots els navegadors, excepte l’ie 6.0 que continuava funcionant normalment, fet que em va fer pensar que deuria ser un tema de seguretat.

Fins avui no he pogut mirar de resoldre el problema. El cas és que els banners estan continguts en un domini diferent als dels portals i he pensat que el problema podia venir d’aquí. No tinc gaire idea de flash però una simple prova utilitzant un dels banners problemàtics però dins del domini del portal ha confirmat les meves sospites: el banner enllaçava correctament.

Una mica de google i he trobat la raó del problema i la solució.

divendres, 25 de juliol del 2008

vendor() deprecated

En ple canvi d'una aplicació web de servidor i domini he aprofitat per actualitzar la versió de cakePHP sobre la que corria per la recent 1.2.0.7296 RC2. El primer problema que m'he trobat ha estat un de previsible que ja havia llegit: la funció vendor() està condemnada a morir i apareix marcada com a deprecated (caducada). En el seu lloc se't marca l'ús d'App::import(), una funció molt més genèrica i a priori de simple ús
App::import('Vendor', 'nomarxiu');
doncs bé, m'he trobat amb un petit problema. Res greu però millor deixar constància per possibles oblits posteriors. El fet és que si l'arxiu PHP amb la classe a carregar té un nom d'arxiu amb una majúscula, com ara, nomArxiu.php. La opció lògica
App::import('Vendor', 'nomArxiu');
no funciona com s'esperaria ja que busca un arxiu amb nom nom_arxiu.php -crec que és per tema de compatibilitat amb PHP4- al directori vendors. Així doncs, o toca canviar el nom de l'arxiu -si és possible- o millor donar un cop d'ull a l'API i optar per una opció que permet incluir la ruta relativa a l'arxiu (a l'exemple, comptant que la classe està dins d'una carpeta anomenada classfolder)
App::import('Vendor', 'nomunic', array('file'=> 'classfolder/nomArxiu.php'));

dilluns, 19 de maig del 2008

Instalació de PHP5 i Apache2 a partir de codi font

M'he trobat amb el problema a la feina d'haver d' instalar apache2 i la versió de php 5.2. De fet això no seria un problema si pogués tirar d'apt-get, però els repositoris de la versió Ubuntu Dapper 6.06 que utilitzo en el meu servidor de proves (altrament dit development server i amb la mateixa configuració que tenen els del servidor on pengem les aplicacions web de l'empresa) no tenen una versió de php 5 més enllà de la 5.1.2, tot degut a que la Dapper és LTS. Aquesta versió m'és insuficient ja que estic desenvolupant una aplicació utilitzant la API de YouTube i vull utilitzar la llibreria Google GData de Zend per PHP, que requereix la 5.2 com a mínim. És més que probable que existeixin alternatives millors o si més no, alternatives diferents com ara instalar utilitzant repositoris de versions posteriors. El fet però, és que m'he llançat a instalar tant l'apache com el php a partir del codi font. El primer pas ha estat descarregar tant l'Apache (versió 2.2.6) com PHP5 (versió 5.2.5) i descomprimir-los amb tar. Un cop descomprimits, comencem per instalar l'Apache. Dins del directori on haguem descomprimit l'Apache, executem el següent:
./configure –enable-so make sudo make install
En el meu cas, com que també necessito el mòdul mod-rewrite i mod-ssl, la configuració del primer pas és una mica més complicada per obligar a que em compili els mòduls durant la instalació:
./configure -enable-so --enable-module=so --enable-module=shared --enable-rewrite=shared --enable-ssl=shared
Si tot surt bé ja tindrem instalat a /usr/local/apache2 el nostre servidor web i un cop iniciat amb la comanda
sudo /usr/local/apache2/bin/apachectl start
hauriem de poder accedir al servidor amb el navegador a través de la direcció http://localhost i rebre un missatge de conformitat. Parem el servidor substituint "start" per "stop" (també existeix "restart", molt útil quan es fan canvis a la configuració de l'Apache) i passem a instalar el PHP5. Ens coloquem a la carpeta on hem descomprimit el PHP, on podem executar ./configure --help per fer un cop d'ull a les opcions que ens dóna PHP5. En el meu cas, utilitzo una sèrie d'opcions on les més importants indiquen la situació del apache2 i de mysql. La resta, com la llibrería GD, depèn de les vostres necessitats.
./configure -with-apxs2=/usr/local/apache2/bin/apxs --with-mysql=/usr/lib/mysql --with-zlib --with-openssl --enable-sockets --enable-soap --with-gd
make
sudo make install clean
Abans de poder veure els nostres arxius PHP al navegador haurem de copiar el php.ini que controla la configuració del PHP a /usr/local/lib
cp php.ini-dist /usr/local/lib/php.ini
i fer uns petits canvis a la configuració de l'Apache. Per canviar la configuració de l'Apache hem d'editar el fitxer httpd.conf, que si no hem indicat el contrari es trobarà a /usr/local/apache2/conf/httpd.conf. Ens hem d'assegurar que la línia “LoadModule php5_module modules/libphp5.so” està descomentada i en cas contrari, descomentar-la. Posteriorment hem d'afegir
AddType application/x-httpd-php-source .phps
AddType application/x-httpd-php .php
perquè ens reconegui els php i per últim, buscar DirectoryIndex i afegir-hi index.php perquè el reconegui i el mostri per defecte.
<ifmodule>
DirectoryIndex index.html index.php
</ifmodule>
Tornem a iniciar el servidor apache i creem un arxiu index.php que copiarem al directori /usr/local/apache2/htdocs, que és per defecte l'arrel del nostre servidor (es pot canviar al httpd.conf indicant un nou DocumentRoot i canviant totes les aparicions del directori per defecte). El contingut del fitxer index.php serà el següent:
<?php phpinfo()?>
Si accedim a http://localhost/index.php i el navegador ens mostra informació de la configuració de PHP, hem acabat la feina amb èxit. Ja tenim PHP5 i Apache2 instalats a partir del codi font.

diumenge, 18 de maig del 2008

Inauguració del blog

Dono per inaugurat aquest bloc sense cap interès més enllà de saciar les meves ganes d'escriure -no massa freqüents- i deixar constància de coses que em puguin haver dut algun mal de cap més del normal en l'art de picar tecles.

Així doncs, Picant Tecles comença com un bloc "egoista" on aniré escribint coses que considero que poden ser útils sobre aspectes dels meus interessos, ara per ara bàsicament aplicacions web amb CakePHP. Però no per això, espero que el bloc sigui inútil pels demés. Ans el contrari, si pot ajudar a algú, millor que millor.