October 29, 08 by Pedro Hernández
Pués sí, todo comenzó en uno de los post de la Asociación Nacional de Webmasters Perú y luego César Soplín completó la idea de armar el BarCamp Lima 2008, un evento donde todos están invitados, y sobre todo “no hay turistas”.
El primer encuentro es el sábado 8 de noviembre, y pronto en el wiki del evento estará listo el lugar.
La expectativa es grande y espero conocer a todos los asistentes
October 22, 08 by Pedro Hernández
Hace poco se me dió la oportunidad de comenzar un proyecto que requeria comunicación desde la parte de frontend el usar Flash v9.
Como se esta usando symfony comencé a buscar en el repositorio oficial de symfony si habia ya un plugin que integrara AMF, y efectivamente encontré uno: sfAmfPlugin, el problema es que usa SabreAMF que funciona a partir de la versión 5.1 de php y el cliente de este proyecto solo nos proporciona php v5.0 y el mas cercano compatible con esta versión es AMFPHP.
Luego buscando entre el repositorio antiguo de symfony descubrí que alguien ya habia implementado amfphp con symfony, este plugin es: sfAmfphpPlugin; pero la version que usa de AMFPHP es la 1.2, que fue liberada en el 2006.
Partiendo de su proyecto es que he realizado mejoras, usando la ultima version de AMFPHP: v1.9 beta 2 liberada el 2008-01-20. Entre estas mejoras se encuntran:
- Usa la versión más actual de AMFPHP (1.9 beta2).
- Este plugin trae un modulo que permite habilitarce desde cualquier aplicación para poder acceder al gateway o el browser.
- Se puede acceder al browser de clases que trae hecho en flex.
- Por seguridad no se puede acceder al browser desde un site en producción, pero el gateway se puede acceder libremente.
Para poder usar el plugin debes de hacer lo siguiente:
- Crea un proyecto nuevo en symfony, en este caso la ultima version de symfony de la rama 1.0.x es la 1.0.18.
.
- Descarga el plugin que dejo más abajo. De momento no esta en el site oficial de symfony debido a que su creador recién se entera de él
.
.
- Instala el plugin via PEAR como se menciona en el listado 17-16 del libro oficial. Durante ese paso se copiará la carpeta web del plugin a la carpeta web de tu proyecto, solo dejalo así por que alli se encuentra el browser del AMFPHP.
.
>> plugin installing web data for plugin
>> dir+ D:\www\sf10-dev\web\sfAmfphpPlugin\swf
>> dir+ D:\www\sf10-dev\web\sfAmfphpPlugin\swf\browser
>> file+ D:\www\sf10-dev\web\sfAmfphpPlugin\swf\browser\AC_OETags.js
>> file+ D:\www\sf10-dev\web\sfAmfphpPlugin\swf\browser\history.js
>> file+ D:\www\sf10-dev\web\sfAmfphpPlugin\swf\browser\history.swf
>> file+ D:\www\sf10-dev\web\sfAmfphpPlugin\swf\browser\index.html
>> file+ D:\www\sf10-dev\web\sfAmfphpPlu...rowser\playerProductInstall.swf
>> file+ D:\www\sf10-dev\web\sfAmfphpPlu...swf\browser\servicebrowser.mxml
>> file+ D:\www\sf10-dev\web\sfAmfphpPlu...\swf\browser\servicebrowser.swf
>> file+ D:\www\sf10-dev\web\sfAmfphpPlu...swf\browser\services-config.xml
.
- Ahora habilita los modulos del plugin en la aplicacion que gustes desde su settings.yml:
.
all:
.settings:
# Activated modules from plugins or from the symfony core
enabled_modules: [default, sfAmfphpModule]
.
- Ahora agrega las nuevas rutas a tu aplicación desde el routing.yml:
.
sf_amfphp_gateway:
url: /amfphp/gateway
param: { module: sfAmfphpModule, action: gateway }
sf_amfphp_browser:
url: /amfphp/browser
param: { module: sfAmfphpModule, action: browser }
.
Si ahora intentas ingresar a por ejemplo: http://www.myproj.com/frontend_dev.php/amfphp/gateway. Te deberia salir la pagina clasica de AMFPHP diciendo que se instaló correctamente.
Ahora si ingresas a: http://www.sf10-dev.com/frontend_dev.php/amfphp/browser, (recuerda que el browser solo se puede ver desde un entorno de desarrollo) este fallará al cargar debido a que no encuentra la carpeta services.
Para esto entra a la carpeta lib del plugin y copia la carpeta services, finalmente pegala en el lib de tu proyecto. Ahora si vuelve a cargar el browser de AMFPHP y veras los resultados
.

Dejo en descarga el plugin aquí y un proyecto con los ejemplo que vienen para la ultima versión de AMFPHP.
Saludos.
October 20, 08 by Pedro Hernández
Sucede que desde hace un tiempo tengo symfony instalado via SVN (Subversion, pronto haré un tutorial sobre ello), y tratando de empaquetar un plugin me doy con la grata sorpresa de este error:
> pear package
Error: Unknown channel "pear.symfony-project.com"
Parsing of package.xml from file "package.xml" failed
Cannot package, errors in package file
La solución fue simple, era nada más de agregar el canal pear de symfony al channel-discover como si de instalar symfony via PEAR se tratase (pero solo esto, recordar que ya lo tengo instalado via SVN):
> pear channel-discover pear.symfony-project.com
Adding Channel "pear.symfony-project.com" succeeded
Discovery of channel "pear.symfony-project.com" succeeded
Ahora si intentas empaquetar el plugin todo será perfecto
:
> pear package
Package sfTestPlugin-1.0.1.tgz done
Por cierto, a la hora de construir un plugin te vendria bien usar el plugin sfPluginManagerPlugin, puedes ver en el repositorio del plugin como lo usan.
Saludos
September 12, 08 by Pedro Hernández
En estos momentos me encuentro terminando la parte de exportación a excel de unos reportes y como se eligió la libreria pyExcelerator para hacerlo, me tocó encontrar un detallito al momento de hacerle un test del ñandú.
Si probamos algo simple como:
from pyExcelerator import *
wb = Workbook()
ws0 = wb.add_sheet('0')
ws0.write(1, 1, "test del ñandú")
wb.save('output.xls')
Esto falla dandome como error lo siguiente:
SyntaxError: Non-ASCII character '\xc3' in file excel.py on line 6, but no encoding declared; see http://www.python.org/peps/pep-0263.html for details
Ahora si probamos (notese que solo agregé la u de unicode):
from pyExcelerator import *
wb = Workbook()
ws0 = wb.add_sheet('0')
ws0.write(1, 1, u"test del ñandú")
wb.save('output.xls')
El mismo error que el de la primera prueba, para solucionarlo le agregamos la siguiente cabecera: # -*- coding: utf-8 -*-
# -*- coding: utf-8 -*-
from pyExcelerator import *
wb = Workbook()
ws0 = wb.add_sheet('0')
ws0.write(1, 1, u"test del ñandú")
wb.save('output.xls')
Por cierto, esta libreria no tiene documentación, pero pueden guiarce de este post y de algunas cosas de mi delicious.
Y listo, salu2.
August 24, 08 by Pedro Hernández
Hace un tiempo un compañero de trabajo encontró un funcion en MySQL que ha resultado bastante util, la función se llama GROUP_CONCAT() y se encuentra disponible desde la version 4.1, la cual nos permite recuperar registros separados por algún simbolo, en este caso separado por comas.
Por ejemplo, si tuvieramos la tabla cars, un listado simple del mismo podría ser:

Listado simple de la tabla cars
Separar estos tres por comas para que aparescan en una sola fila seria:

Usando GROUP_CONCAT()
Sus usos son muchos, como por ejemplo el de imprimir los tags de tus favoritos como lo hace delicious.com
Saludos
August 16, 08 by Pedro Hernández
No se cuantas veces he puesto en este blog que he regresado … despues de tiempo, pero al menos trataré de poner un post semanal ^^.
Pues bien, desde el 4 de febrero de este año ingresé a trabajar a una empresa de marketing interactivo en la ciudad de Lima y este hecho a consumido gran parte de mi tiempo. Ahora más organizado es cuando decido volver.
He visto que mis posts más vistos son los de instalar pear y symfony cosa que me agrada mucho
.
En todo este tiempo de ausencia es que he aprendido más sobre php, symfony, python, django y mysql; cosas que postearé en su momento. He cambiado el slogan del blog (si asi se puede decir), colocando: “Desarrollo web, Inteligencia artificial y otras paranoias”; y es que de inteligencia artificial me gustaría ir aprendiendo también
.
Algo que me gusto en todo este tiempo es que en Julio se lanzó Stones Throw Records. Un site en el colaboré junto con Roberto Carvajal y Jon Bauher. Por cierto este sitio está hecho en Symfony
.
Antes de terminar agradecer mucho a todas las personas que preguntaron que le pasó al blog y del por que no posteaba, a todos los que me han enviado mails colaborando con los plugins que he desarrollado para Symfony y a Mauro Casuola, quien se integra para ayudarme a desarrollar mi plugin sfCssTabs.
Saludos y gracias.
January 27, 08 by Pedro Hernández
Este tema salio de una urgencia que tubo mi buen amigo Joan y como ya antes en la lista de symfony en español se había preguntado, salio la idea de resolverlo a modo de competencia. Por mi parte como Filtro de Symfony y por la parte de Joan con htaccess.
¿Para que sirven estas soluciones?
Pues bien en Symfony por defecto las URI no terminan en slash (por temas SEO), es decir si terminan en algo así: www.site.com/moudulo/, esto te retornará un 404. Para evitar este problema y hacer una redirección 301 de www.site.com/moudulo/ a www.site.com/moudulo aquí las soluciones:
Con un filtro en symfony:
Solo colócalo en la carpeta lib de tu aplicación
<?php
class redirect301Filter extends sfFilter
{
public function execute($filterChain)
{
if ($this->isFirstCall())
{
$uri = $this->getContext()->getRequest()->getUri();
if (preg_match('#/$#', $uri))
{
$uri = preg_replace('#/$#', '', $uri);
$this->getContext()->getController()->redirect($uri, 301);
}
}
// Ejecutar el proximo filtro
$filterChain->execute();
}
}
Y activas el filtro así:

Ahora la versión de Joan con htaccess:
Options +FollowSymLinks +ExecCGI
<IfModule mod_rewrite.c>
RewriteEngine On
# uncomment the following line, if you are having trouble
# getting no_script_name to work
RewriteBase /
# we skip all files with .something
RewriteCond %{REQUEST_URI} \..+$
RewriteCond %{REQUEST_URI} !\.html$
RewriteRule .* - [L]
# remove trailing slash
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} ^(.*)/$
RewriteRule ^(.*)/$ $1 [R=302,L]
# we check if the .html version is here (caching)
RewriteRule ^$ index.html [QSA]
RewriteRule ^([^.]+)$ $1.html [QSA]
RewriteCond %{REQUEST_FILENAME} !-f
# no, so we redirect to our front web controller
RewriteRule ^(.*)$ index.php [QSA,L]
</IfModule>
# big crash from our front web controller
ErrorDocument 500 "<h2>Application error</h2>symfony application failed to start properly"
Para este caso (y como lo comenta Joan) el RewriteBase / es obligatorio si te quieres evitar problemas.
En las pruebas de rendimiento obviamente htaccess sale ganando, pero queda de tu parte elegir cual usar
.
Si no es del todo legible el código colocado mas arriba (comienzo a odiar al iG:Syntax Hiliter) puedes descargarlo de aquí filtro_vs_htaccess.zip.
January 24, 08 by Pedro Hernández
Hace poco tuve que pasar a hacer unas aplicaciones en Visual Basic .Net dejando de lado el tradicional VB6.0 y MS SQL Server 2000. Pero no recordaba que las bases de datos Northwind y Pubs (esas con que nos mataban en la universidad en el curso de base de datos) ya no existen en MS SQL Server 2005, y me puse a buscar llegando a encontrar algunos conocidos:
MySQL:
MS SQL Server 2000/2005/2008:
Puede que haya más, pero siempre puedes crear tus base de datos usando los modelos de ejemplos que se encuentran en Database Answers y si no entiendes los diagramas (el modelo Entidad/Relación o el modelo de notación IE o IDEF) siempre puedes consultar el video tutorial de esta misma pagina o LaBDA y El curso de BD de la Universitat Pompeu Fabra.
¿Conoces más recursos y bases de datos de ejemplos?
January 18, 08 by Pedro Hernández
Pues eso, me está tocando reparar un bug descubierto en mi plugin sfCssTabs y a la vez agregarle un detalle más: la I18N.
Para esto he tenido que mirar en la cache una vez regenerada después de activar la opción en el archivo settings.yml de la aplicación (frontend, backend, etc….) .
Entonces para verificar si la opción de I18N está activada solo hay que hacer esto:
<?php
if (sfConfig::get('sf_i18n'))
{
// do something....
}
?>
Y como todo helper en symfony es una función, para verificar que esté presente el (valga la redundancia) helper de traducción:
<?php
if (function_exists('__'))
{
// do something....
}
?>
Para más detalles pueden ver el Capítulo 13. Internacionalización y localización de la guía de Symofny.
Listo, salu2 ^^