Blog de Julio César Pérez Arques
Historia de una integración (i): El principio
Marzo 31st, 2009 - [Enlace local]
Esta es la historia de un proyecto de desarrollo software. Como toda buena historia tiene momentos difíciles, personajes complejos, un final féliz y más de una lección que aprender.
Antecedentes
Así me encontré al frente de un equipo de desarrollo de 3-6 personas, residente en un importante cliente del sector sanitario público, y dirigiendo un buen número de proyectos Java, consistentes en nuevos desarrollos y mantenimientos.
Pero no sólo yo tenía ganas de cambios para el 2008. En una decisión tan valiente como inesperada, el cliente decide implantar un completo sistema SAP R/3 para sustituir la gran mayoría de sus sistemas de gestión.
Para esta obra faraónica se ha confiado en la típica pirámide de empresas, compuesta por (i) la super multinacional que aporta el nombre, más la élite, (ii)
El proyecto
Mi parte en la historia sería la de dirigir un proyecto consistente en desarrollar una aplicación web Java que hiciera de front-end para varios módulos del futuro SAP R/3 del cliente. El proyecto empezó oficialmente en junio con la idea de llevarlo de forma paralela a la implantación de SAP. El objetivo era poner en funcionamiento una primera versión para el 1 de enero del 2009 para un número de usuarios controlado y poco a poco ir difundiendo su uso. A día de hoy la aplicación está implantada de forma completa y funcionando estable y eficázmente.Como os imaginaréis ha sido una experiencia apasionante pero también muy exigente. Aunque me ha hecho pasar más de un trago amargo, en general estoy satisfecho con su resultado final y sobretodo con lo aprendido por el camino. Un camino que intentaré plasmar en esta serie de posts que espero se conviertan en un útil ejercicio de retrospectiva al que estais todos invitados.
Ecosistema software
No quería cerrar el post sin contar algo de verdad. Así que describiré las distintas partes que forman el ecosistema software que he ido construyendo desde mi llegada.- Eclipse. Una de las primeras decisiones que tomé fue usar Eclipse JEE como ide principal, por su potencia como editor e integración con el resto de herramientas y librerias que usamos. Anteriormente se usaba una antiquísima versión del IntelliJ IDEA pero no entraba en los planes corporativos adquirir licencias más modernas.
- CVS. Es el sistema de control de versiones que tiene implantado nuestro cliente para todos sus proyectos. No hay más. Mi parte aquí se redució a fomentar algunas buenas prácticas de uso, principalmente a incorporar las dependencias de cada proyecto en su estructura.
- Tomcat. Las aplicaciones se implantan en un servidor JBoss 3.2.6 y en un 4.2.2 las más recientes, pero en desarrollo usamos un Tomcat 6 como servidor individual por su mayor velocidad de arranque y fácil integración con Eclipse. Nuestras máquinas de desarrollo no son ninguna maravilla y Eclipse no se integra con JBoss 3.2.6 por si solo (sí con el 3.2.3), para ello necesitabamos las JBoss Tools. Pero entonces todo el entorno iba a pedales, cuando con Tomcat 6 vuela.
- ANT. El cambio a Eclipse-Tomcat y el hecho de incoporar las dependencias a la estructura de proyecto obligó a crear nuevos scripts Ant para automatizar las tareas de construcción de los proyectos. Aunque sólo los nuevos proyectos y los antiguos más significativos han sido migrados al nuevo entorno.
- Hudson. No fue hasta el último trimestre cuando conseguimos implantar Hudson como servidor de integración continua. Actualmente realiza las tareas de construcción, testing unitario y análisis de código Java con los plugins de Emma, Checkstyle y Findbugs.
- JIRA. Como herramienta de gestión de proyectos/tareas continuamos usando una antigua versión de JIRA. Es una maravilla y eso que no creo que estemos aprovechando todas sus posibilidades. Sólo echo de menos un wiki principal para todos los proyectos o individual por proyecto.
- Selenium. Hemos estado experimentando con Selenium para hacer testing funcional de aplicaciones web. Sin embargo estamos teniendo problemas a la hora de ponerlo en funcionamiento en el Hudson. Lo que está dificultando mucho su aceptación y uso generalizado. Aún así lo encuentro básico para dar el siguiente paso de calidad en nuestro modelo de desarrollo. Todos sabemos el infierno que es actualmente el desarrollo web...
- Maven. Aunque Ant es una herramienta genial, el elevado número y hetereogeneidad de proyectos que llevamos hace difícil el mantenimiento de los scripts. Por eso y otras razones quiero probar Maven en uno o dos proyectos serios.
- Mylyn. Mylyn es un plugin para integrar Eclipse con la mayoría de sistemas de control de tareas/tickets de forma avanzada. No sólo permite tener visibilidad de los tickets en Eclipse, también dota de memoría a Eclipse para recordar qué ficheros del proyecto están asociados con cada tarea. Con lo primero espero, sobretodo, mejorar la trazabilidad entre lo que hace el código realmente y lo que dice la descripción de la tarea.
- Wiki. Tengo ganas de probar una wiki para gestionar la documentación interna que vamos generando, en lugar de, como hacemos ahora, crear y copiar documentos word a una carpeta compartida. También me gustaría probarla como herramienta de especificación de requisitos de los proyectos con capacidades reales de colaboración y control de versiones automatizado. La idea sería enlazar desde la descripción de las tareas en el Jira a las páginas del wiki.
» Leer más, comentarios, etc...
Picando Código
Disponible Arora 0.6: Instalación en Debian / Ubuntu
Marzo 31st, 2009 - [Enlace local]

Arora
Disponible una nueva versión, 0.6, de Arora un excelente navegador web liviano basado en WebKit. Esta versión presenta el doble de cambios que versiones anteriores.
Al día de hoy cuenta con muchas funcionalidades incluidas en otros navegadores como son: Sugerencias de búsqueda de Google, pantalla completa, agregar todas las pestañas a marcadores (y agregar directorios), bloqueo de popups, y varias características nuevas que pueden leer en el anuncio de la disponibilidad de Arora 0.6.
En arora-browser.org pueden descargar instalaciones para Windows, Mac OS X, Pardus y el código fuente para compilarlo. En versiones anteriores publicaban paquetes .deb para Debian y derivados. Pero actualmente no se están publicando.
Al momento de escribir este post, Arora se encuentra en los repositorios de Debian en la versión 0.2-1 en Debian Lenny, 0.5-1 en Squeeze y Sid y 0.5-10 en Experimental. En Ubuntu, pueden encontrar la versión 0.5 en Jaunty y 0.3 en Intrepid.
Las nuevas versiones llegan bastante rápido a Debian Sid, pero de todas formas siempre es más entretenido probar la versión más reciente. La wiki de Arora en Google Code trae instrucciones bien específicas para obtener la última versión de Arora a partir del código fuente. A continuación la instalación en Debian:
- Asegurarse de tener Git instalado.
En Debian conapt-get install git-core
instalamos lo necesario para obtener el código fuente
- Instalar Qt 4.4 o superior
En mi caso ya lo tenía, lo que tuve que instalar fueron las bibliotecas para compilar Arora:apt-get install qt4-make libqt4-dev
- Ahora a obtener el código fuente:
$ git clone git://github.com/Arora/arora.git
y compilarlo:
$ cd arora $ qmake $ make
Esperamos unos minutos que compile y listo. Ejecutando “./arora” desde ese directorio tendrían a Arora corriendo en su versión mas reciente. Para actualizar su versión:
$ cd arora $ git pull $ make distclean $ qmake $ make
Y con todo esto obtenemos una actualización del código y lo volvemos a compilar. Y si quieren meterle mano al código fuente, y en una de esas colaborar con algún parche o modificación, se recomienda el uso del IDE QtCreator.
Probé abrir el proyecto de código fuente de Arora desde QtCreator sin problemas. Incluso hice algunas modificaciones nimias a ver si compilaba bien, y todo funcionó. En una de esas algún día aporto algún cambio de código más útil
» Leer más, comentarios, etc...
HardBit
Programadores y Usuarios de Mac (PUMac)
Marzo 31st, 2009 - [Enlace local]

En esta ocasión les traemos Josué (Blacknash) y yo el sitio www.pumac.net el cual básicamente tendra foros tanto para usuarios como para programadores y habrá una sección de noticias y articulos para todos aquellos afortunados que poseemos una Mac ;).
Mientras terminamos de diseñar el esquema que se manejara, les adelantamos que el sitio se encuentra en linea y pronto esta la información básica para que puedan registrarse todos los maqueros.
» Leer más, comentarios, etc...
knocte :: MonoTema
I14Y happens
Marzo 30th, 2009 - [Enlace local]
Some years ago, I started to get familiarized with abbreviations like 'l10n', 'i18n' when I started contributing to the translation efforts of Mozilla Firefox under the NAVE Project.Some months later I came to know the new term 'a11y', and I started to see it in a lot of places. By that time, I only associated it with the web development world. Terms like "Unobstrusive JavaScript" were very
» Leer más, comentarios, etc...
EsLoMas.com
Consultas SPARQL sobre un almacen de datos con Jena/SDB
Marzo 30th, 2009 - [Enlace local]
Dentro del trabajo de investigación que estoy llevando a cabo en el doctorado me está tocando trabajar con Ontologías OWL y con almacenes de tripletas RDF. La mayoría de las veces necesito únicamente cargar los datos que tengo en RDF en el almacén de tripletas y luego realizar consultas para realizar cálculos sobre los datos o exportarlos a un modelo relacional.
Para ello utilizo una herramienta que se llama Jena/SDB que me está funcionando bastante bien. Lo que hace es ofrecer un almacenamiento de tripletas RDF y su acceso mediante consultas SPARQL, almacenando las tripletas en una base de datos relacional como MySQL en mi caso.
» Leer más, comentarios, etc...
Cerebro en la Sombra » Técnico
Adobe AIR VIII - Información encriptada y persistente
Marzo 29th, 2009 - [Enlace local]
Ya hemos visto como trabajar con bases de datos con AIR, sin embargo he deubierto un nuevo método para conservar datos que puede resultar especialmente útil para mantener información sensible, como claves de acceso a servicios, ya que se guarda encriptada. Hablamos de la clase EncryptedLocalStore.
Una de las peculiaridades de esta clase es que es persistente mientras la aplicación no borre sus contenidos, ya que aunque se desinstale los datos siguen ahí, lo que resulta especialmente útil si tus aplicaciones son de pago (guardar licencias) o tienen periodos de prueba (así no se podrá utilizar de nuevo al desinstalar y volver a instalarla).
Cada aplicación dispone de su propia EncryptedLocalStore con lo que los datos que se guarden en una no interferirán con los de otra.
EncryptedLocalStore tiene sólamente tres métodos estáticos (no es necesario instanciar la clase) que permiten guardar, leer y eliminar datos.
- setItem(”nombre”, valor): guarda un dato.
- getItem(”nombre”): lee el dato.
- removeItem(”nombre”): elimina los datos.
Para dar mayor versatilidad al sistema, los datos a guardar deben ser del tipo ByteArray, así que se podrá guardar cualquier dato que se pueda convertir a este tipo y no sólo cadenas de texto.
Veamos un ejemplo:
-
//guardar datos
-
var clave:String = "password";
-
var bytes:ByteArray = new ByteArray();
-
bytes.writeUTFBytes(str);
-
EncryptedLocalStore.setItem("clave", bytes);
-
-
//leer datos
-
var datos:ByteArray = EncryptedLocalStore.getItem("clave");
-
var miclave:String=datos.readUTFBytes(datos.length));
-
-
//eliminar datos
-
EncryptedLocalStore.removeItem("clave");
Extremadamente sencillo y útil, no se como no lo había visto antes, creo que pasa bastante desapercibida esta manera de guardar datos en la documentación.
De esta manera podemos guardar datos sin necesidad de bases de datos. Eso sí, al parecer no deben exceder los 10mb o comenzaremos a tener problemas de rendimiento. Recuerda lo que decía al principio, aunque el usuario desinstale la aplicación los datos de EncryptedLocalStore siguen en su sistema operativo.
» Leer más, comentarios, etc...
Fetishcode...Thinking in objects
Validador de Números de Tarjetas de crédito en JSF.
Marzo 28th, 2009 - [Enlace local]
A
» Leer más, comentarios, etc...
The New Cult of Dead Cow » desarrollo
Restringiendo los accesos con ControllerBase
Marzo 27th, 2009 - [Enlace local]
Ayer llego a mi casa un amigo buscando alguna forma de restringir el acceso de ciertas partes de una aplicacion en funcion de los permisos de usuario.
La idea era la siguiente, tenia las siguiente URL
- index.php/admin/cursos/add
- index.php/alumno/cursos/list
La idea era que un usuario de tipo administrador pudiera listar los cursos y agregar nuevos cursos. Y que un usuario tipo alumno, solo pudiera lista los cursos.
Una de las soluciones planteadas era poner un archivo de configuracion en la aplicacion que especificara los permisos de acceso; sin embargo esto no era escalable, ya que cualquier cambio en los accesos habria que modificar el codigo de la aplicacion.
La solucion final que se dio fue crear una tabla que estableciera los permisos por ejemplo:
TABLA: permisos
CAMPO: controller
CAMPO: method
CAMPO: user
El campo controller, especificaria para que controlador estamos especifcando el permiso. El campo method, que Action de ese controlador es el afectado y el campo user ( que podria ser cualquier otro, como por ejemplo: usertype ) a que usuario afecta la regla especificada.
Luego tendriamos que agregar un metodo rights en nuestros controlladores, el cual queria mas o menos asi:
public function rights()
{
include_once(”models/permisos.php”);
$priv = new Privilegios();
$priv = $priv->getAll()->WhereAnd(”controller=”,get_class($this))->WhereAnd(”user=”,$_SESSION["user"])->get(0);
if ( $priv->method == “*”) return true;
if ( in_array($this->action,explode(”,”,$priv->method))) return true;
return false;
}
El metodo rights, ya existe en la actualidad en ControllerBase y su funcion es la misma. Determinar si se tiene acceso a algun Action del controlador actual. Sin embargo, por facilidad para el desarrollo siempre devuelve true ( SI TIENE ACCESO ).
Con este metodo, el comportamiento cambia radicalmente. Ya no es un sitio publico por defecto, sino que nadie tiene acceso a ninguna parte del sistema a no ser que se especifique lo contrario en la base de datos ( comportamiento contrario tambien podria lograrse, que todo sea publico a no ser que se especifique lo contrario ).
En la tabla permisos, entonces se deberia llenar de la siguiente manera. Si se desea que el usuario 2 tenga acceso unicamente a todos los metodos del controlador cursos, pero no a otros controladores:
controller | method | user
cIndex | cursos | 2
cCursos | * | 2
Si queremos en cambio que el usuario 1 tenga acceso a todos los reportes, y a listar y agregar cursos pero no borrarlos tendriamos que agregar los siguientes registros
controller | method | user
cIndex | cursos,reportes | 1
cCursos | list,add | 1
Espero esto les sirva para poder controlar efectivamente quienes ingresan a parte de sus sistemas. Si tuviera alguna observacion o un caso especial que no este contemplado … por favor comentenlo para encontrar juntos una solucion.
Tambien te puede interesar
» Leer más, comentarios, etc...
PROGRAMANDO EN .NET
3 formas de obtener la versión de SQL Server desde T-SQL
Marzo 27th, 2009 - [Enlace local]
En un mundo perfecto todas nuestras instalaciones tendrían las mismas versiones de las aplicaciones, motores de bases de datos y librerías auxiliares, pero como este mundo es una utopía, a veces tenemos que averiguar con qué versión del motor de base de datos está trabajando la aplicación.En el caso de SQL Server he descubierto 3 formas de averiguar la versión desde T-SQL, con cualquiera
» Leer más, comentarios, etc...
Arragonán
Abierto el plazo de envío de propuestas para el GSoC
Marzo 27th, 2009 - [Enlace local]
Desde hace unos días que se ha abierto el plazo de envío de propuestas, de estudiantes a organizaciones, para participar en el Google Summer of Code 2009(hasta el 3 de Abril).
Si eres estudiante universitario(también de master y doctorado), te gusta programar y el mundo Open Source, esta es una oportunidad inmejorable para colaborar en algunos los proyectos y organizaciones conocidas mundialmente, como Apache, Mysql, Eclipse, Debian, PHP, Ruby on Rails… Para quien le interese participar, plunchete ha escrito un artículo en debugmodeon con mucha información y consejos para presentar la propuesta
En mi caso este año no voy a participar, no me matriculé para seguir estudiando, aunque sí me planteé hacerlo con el único objetivo de poder participar en el GSoC, finalmente preferí no hacerlo por tener ya demasiados frentes abiertos
» Leer más, comentarios, etc...
HardBit
El trabajo de un arquitecto de software
Marzo 26th, 2009 - [Enlace local]
En varias ocasiones se ha discutido sobre lo que debe hacer o no un arquitecto de software, algunos piensan que es aquel que se dedica a hacer el analisis de la aplicacion y se deslida totalmente de la parte tecnica del desarrollo, este articulo puede cambiar la perspectiva de esa idea, y darnos un paradigma de lo que problamente mas se le acerque a lo que debe realizar un arquitecto de softwarte, para no reescribir el articulo pongo aquí la dirección de este. Les recomiendo su lectura.
El rol de los Arquitectos de Software
» Leer más, comentarios, etc...
Najaraba.com: Software libre, negocios y más.
Scrum y TDD
Marzo 25th, 2009 - [Enlace local]
En realidad este post es solo dos anuncios ;)Hemos abierto un grupo para hablar de TDD en castellano. ¡Apúntate!Los afamados cursos de Scrum de Proyectalis vuelven.Y os cuento, que nosotros estamos en fase de adopción de TDD, y ya trabajando con Scrum. La adopción de TDD no es sencilla, y actualmente estamos invirtiendo en mejorar nuestros desarrollos de testeo unitario, para después cambiar el
» Leer más, comentarios, etc...
Blog de Julio César Pérez Arques
Evaluando WireframeSketcher, plugin Eclipse para diseñar prototipos de pantallas
Marzo 25th, 2009 - [Enlace local]
Me encuentro sumido en un nuevo proyecto, consistente en realizar una fase de análisis de una importante aplicación para gestionar de expedientes en un organismo público. Oh sí, metodología en cascada en toda regla...
Pero a lo que iba, una de las partes más importantes del entregable para el cliente son las pantallas, si no la más. Hasta ahora cuando me ha tocado hacer un esbozo de pantalla, alias wireframe, he sobrevivido con lo primero que he pillado. Pero esta vez, dada la cantidad de pantallas a hacer, me lo he tomado un poco más en serio y he descubierto esta pequeña maravilla: WireframeSketcher.
WireframeSketcher es un plugin para Eclipse que permite dibujar un wireframe de forma intuitiva, ágil y rápida. Muy rápida. Su paleta de componentes es muy completa, sirve tanto para aplicaciones web, como de escritorio. Destacar, también, una ayuda inteligente que te facilita alinear los componentes en base a guías. El acabado es estupendo, agnóstico a estilos y colores, como todo buen wireframe, y se exporta a PNG. Como muestra este screencast.
Requiere Eclipse 3.3. Se puede instalar de forma automática desde Eclipse usando http://wireframesketcher.com/updates como update site. Decir también que cuenta con su propia perspectiva y que de rendimiento va muy bien, no enlentece a Eclipse.
Aunque no todo iba a ser bueno. No es gratis. Pero tiene una versión de prueba permanente gratuita que lo único que hace es añadirte la marca de agua EVALUATION a las imagenes exportadas de las pantallas.
La otra buena noticia es que no es caro, 50-80 dolares cuesta una licencia. Para mí merece la pena, digo el dinero. Así que espero que mi jefe no ponga problemas.
» Leer más, comentarios, etc...
programania
Evitar el spam en wordpress
Marzo 25th, 2009 - [Enlace local]
O al menos la mayoría, comentan en Planeta Wordpress una serie de trucos para el fichero .htaccess, este en concreto me ha parecido bastante interesante, pero intentando subsanar la falta de claridad sobre estos trucos, voy a explicar un poco porqué funciona, aclarar lo primero que evitamos que los bots sean los que postean, la finalidad es que si se recibe una petición de posteo de algo que no viene de nuestro propio dominio la denegaremos.
#1º Activamos las reescrituras
RewriteEngine On
#2º Para las peticiones de método POST
RewriteCond %{REQUEST_METHOD} POST
#3º Que vayan a la página wp-comments-post.php
RewriteCond %{REQUEST_URI} .wp-comments-post\.php*
#4º Y cuyo origen sea distinto de tu blog (sustituir tublog.com por la url que se tercie)
RewriteCond %{HTTP_REFERER} !.*tublog.com.* [OR]
#5º Si se trata de un bot
RewriteCond %{HTTP_USER_AGENT} ^$
#6º Lo mandamos a paseo ![]()
RewriteRule (.*) ^http://%{REMOTE_ADDR}/$ [R=301,L]
» Leer más, comentarios, etc...
programania
Zend_Form: Cómo crear tu propia apariencia de formulario
Marzo 25th, 2009 - [Enlace local]
Zend_Form es uno de los componentes estrella del Zend Framework. Muchas son las ventajas de utilizarlo (generación de apariencia, validación de html, limpieza del código, etc.). El problema es que a menudo podemos encontrarnos con el problema de que la apariencia que genera el propio Zend_Form no nos interesa. Es cierto que podemos personalizarla mediante los decorators. Pero incluso estos pueden resultarnos limitados.
En el ejemplo que expongo a continuación, queremos generar una tabla de checkbox para puntuar del 1 al 3 (malo, regular, bueno) una serie de conceptos. Como veréis, la manera de hacerlo es sobreescribiendo el método render, aunque necesitaremos un poco más de código para hacerlo funcionar todo.
Por supuesto, éste ejemplo podría complicarse infinitamente, si se quisiera mezclar el render por defecto, con un render personalizado. Y, cuidado, ésta técnica es algo sucia y sólo debería utilizarse cuando la posibilidad de crear nuestros propios Zend_Form_Elements o Zend_Form_Decorators es demasiado costosa o insuficiente.
class MyForm extends Zend_Form{
protected $valores = array();
function __construct(){
/*
Aquí se declararían los elementos del zend form que se van a utilizar, sus tipos, valores, validaciones, etc...
Éste Zend Form se va a utilizar como cualquier otro formulario. Aprovecharemos la posibilidad de validarlo desde en controller, etc..
Lo único que cambia es que cuando invoquemos render() no se generará de manera regular, sino de la manera que a nosotros nos plazca.
*/
}//construct
//sobreescribimos el método setDefaults, que Zend_Form llama cuando se van a introducir valores por defecto en el formulario.
// setDefaults también es llamado desde el método populate del Zend_Form.
public function setDefaults(array $values){
// guardamos en "valores" la lista de valores de los campos
//del formulario, para luego poder utilizarlos en el método render()
$this->valores = $values;
parent::setDefaults();
}//setDefaults
function render(Zend_View_Interface $view = null){
return "
Malo
Regular
Bueno
Concepto 1
.(($this->valores['concepto1'] == 1)?'checked':'')." type="radio" name = "concepto1" value = "1"/>
.(($this->valores['concepto1'] == 1)?'checked':'')." type="radio" name = "concepto1" value = "2"/>
.(($this->valores['concepto1'] == 1)?'checked':'')." type="radio" name = "concepto1" value = "3"/>
Concepto 2
.(($this->valores['concepto2'] == 1)?'checked':'')." type="radio" name = "concepto2" value = "1"/>
.(($this->valores['concepto2'] == 1)?'checked':'')." type="radio" name = "concepto2" value = "2"/>
.(($this->valores['concepto2'] == 1)?'checked':'')." type="radio" name = "concepto2" value = "3"/>
Concepto 3
.(($this->valores['concepto3'] == 1)?'checked':'')." type="radio" name = "concepto3" value = "1"/>
.(($this->valores['concepto3'] == 1)?'checked':'')." type="radio" name = "concepto3" value = "2"/>
.(($this->valores['concepto3'] == 1)?'checked':'')." type="radio" name = "concepto3" value = "3"/>
";
}//render
} // MyForm
?>» Leer más, comentarios, etc...
programania
Formularios más seguros con Zend_Form
Marzo 25th, 2009 - [Enlace local]
De forma bastante sencilla, alguien podría atacar tu web intentando hacer un envio POST de un formulario tuyo infinitas veces. Afortunadamente existe una manera sencilla de prevenirlo. Se trata de que cuando alguien haga una petición GET sobre el formulario (para que éste se cargue), el sistema genere una clave aleatoria (token) que se añada como campo hidden al formulario y se guarde como variable de sesión. Al enviar un POST sobre el formulario, se comprobará si el token hidden es igual a lo guardado en sesión. Si es así, se considerará que se cargó primero el formulario antes de enviarlo, así que no se trata de un envío POST directo.
Por supuesto, esto no convierte en invulnerables los formularios. Existen otras muchas maneras de intentar atacarlos, pero si reduce las posibilidades de un ataque básico.
A continuación voy a extender el objeto Zend_Form del Zend Framework para incluir un par de métodos que ayudarán a la generación y validación del token.
class Zend_Form_Token extends Zend_form {
//generamos el token y lo guardamos en una variable de sesion.
protected function generateToken ($seed = 'cocotero'){
$token = md5($seed.mktime());
$globalSession = new Zend_Session_Namespace('global_data');
$globalSession->token = $token;
return $token;
}
//cuando recibamos un envío post, le pasaremos la variable input hidden del token a ésta función para validarlo.
protected function tokenCheck($tokenToCheck=''){
$globalSession = new Zend_Session_Namespace('global_data');
$returnValue = (!empty($tokenToCheck) and $tokenToCheck == $globalSession->token);
return $returnValue;
}
}// Zend_Form_Token
?>Ahora sólo nos queda crear nuestros formularios y llamar a éstas funciones en el controller correspondiente, para poder controlar la respuesta…
» Leer más, comentarios, etc...
Picando Código
UserAgent-Spy plugin para WordPress: versión 1.0
Marzo 25th, 2009 - [Enlace local]
Hoy le hice unos arreglos finales a UserAgent-Spy, mi plugin de WordPress, y finalmente hice el tag “1.0″. ¿Porqué es importante? Porque llegó a un punto donde hace todo lo que tenía pensado que fuera a hacer en un principio, y más. Detecta muchos navegadores, sistemas operativos, y dispositivos. Todavía le faltará alguno, pero agregarlos es bastante sencillo desde que reescribí el código.
Detecta más de 40 navegadores y 20 sistemas operativos (diferenciando distribuciones de GNU/Linux).
Lo que no he probado todavía (y no tengo intenciones de probar por el momento) es la nueva funcionalidad de comentarios “en hilo” estilo discusión que ofrece WordPress a partir de la versión 2.7. Si alguien tiene implementada esta funcionalidad en su blog, estaría interesante saber cómo se comporta UserAgent-Spy. En teoría, por lo que averigüé en el IRC #wordpress, no habrían cambios en las funciones que usa UserAgent-Spy.

UserAgent-Spy
En fin, los invito nuevamente a descargarlo, y recomendarme funcionalidades para agregarle, así como navegadores, sistemas operativos o dispositivos que se identifiquen en su UserAgent, para ser incluidos en el plugin.
Próximas versiones serán “arreglos” (versión 1.0.1), o nuevas características (1.1).
» Leer más, comentarios, etc...
Arragonán
Una semana de Jobsket
Marzo 25th, 2009 - [Enlace local]
La semana pasada anunciamos en el blog de jobsket que empezábamos a enviar las invitaciones, Martín también lo hizo. Si todavía no has recibido la invitación para registrarte, hay una introducción de qué es jobsket.
Después de bastante tiempo trabajando, haciendo y deshaciendo, ya teníamos ganas de poder presentar jobsket bajo los focos, y de ver la respuesta que nos encontrábamos. Y hasta el momento estamos muy contentos con el feedback recibido, aunque todavía nos falta mejorar muchas cosas.
Es un proyecto que parece que está gustando a los primeros usuarios, de los que además estamos recibiendo ánimos para seguir trabajando, ideas para implementar nuevas funcionalidades, mejoras y avisos de bugs; ya sea vía uservoice, email, gtalk, twitter… o delante de una cerveza ;). Muchas gracias a todos!
Nosotros seguiremos trabajando para que llegue a ser el mejor servicio posible y disfrutando del camino
» Leer más, comentarios, etc...
Picando Código
Avistamiento de OVNI en Atlántida - Uruguay
Marzo 25th, 2009 - [Enlace local]
A raíz del post sobre C.R.I.D.O.V.N.I. - Ovnis en Uruguay, comencé a recibir visitas extrañas, comentarios sobre lo paranormal, y correos electrónicos con material de origen dudoso. ¿Será que me están intentando mostrar algo? En fin, los OVNI, créanlo o no, también aparecen por Uruguay.
Hoy recibí en el correo electrónico el video que publico a continuación. El autor no mencionó su nombre, el mensaje contenía únicamente el siguiente texto:
Este es un video de un ovni que aviste el 22 de marzo del 2009 aproximadamente a las 21 horas en el balneario de atlantida si quisiera saber que fue tomado con un celular sony ericcson w200
A continuacíon, el video del OVNI en Atlántida, Uruguay.
No hay mucho para ver, pero ya que el autor se tomó el esfuerzo de enviarlo, acá lo dejo. Si recibo más material del estilo supongo que aprovecharé para publicarlo bajo la categoría de Ciencia Ficción…
» Leer más, comentarios, etc...
avemundi, blog de un micro-isv » Desarrollo de software
el rey ha muerto, ¡ viva el rey !
Marzo 24th, 2009 - [Enlace local]
Por fin se ha resuelto uno de los temas que más de cabeza me han llevado en los últimos meses. En mi trabajo de día llevaba tiempo rondando la posibilidad de una restructuración del departamento donde trabajo, y por fin se ha producido. Esta restructuración supone entre otras cosas que el desarrollo se debe realizar en la medida de lo posible en el entorno corporativo, que está basado en Java con un framework propio. Así que toca aprender Java, y centrarse en todo lo referido a programación para entornos web.
Esto tiene una repercusión también en mi trabajo de noche. Mi intención es seguir manteniendo los programas de alanit, pero me atrae mucho la posibilidad de programar para Mac. Java es un buen lenguaje para programar en OS X, incluso hay look & feels de Java que simulan Aqua bajo Swing. Y muchas más cosas sorprendentes que iré contando por aquí poco a poco.
» Leer más, comentarios, etc...
The New Cult of Dead Cow » desarrollo
Diagrama de Flujo de peticiones web
Marzo 24th, 2009 - [Enlace local]
Como actua el servidor ( Apache por ejemplo ) cuando recibe una peticion web.
Via: anieto2k
Tambien te puede interesar
» Leer más, comentarios, etc...
programania
Obtener visitas desde google images
Marzo 24th, 2009 - [Enlace local]
A continuación un pequeño SEO truco para hacer que los usuarios que nos visitan desde google images y que normalmente ven directamente una foto de nuestra página, nos aporten suculentas visitas. Dejo el decidir si se trata de una técnica moral o no para con los usuarios. A mí me da cierto reparo…
La idea es detectar si una visita hacia nuestra página viene de google images o no. Si viene de google images, en vez de devolver la imagen qeu pide, le devolvereos una página html con esa imagen y todo lo que queramos (publicidad, analytics, unos cuantos links a ver si pulsa, etc…)
Modificaciones en el .htaccess
RewriteEngine On
RewriteCond %{REQUEST_URI} (.*)\.(jpg|jpeg|gif|png|bmp)$ [NC]
RewriteRule (.*) /script.php?imgpath=$1 [PT]
El script en PHP:
// $hr es un array de url´s que identifican a google images. Con él sabremos si nos viene una visita de allí.
$hr = array("images.google", "images.search.yahoo.com",
"search.live.com/images/");
// cuidado, la siguiente asignación no es muy segura, sirve para un ejemplo...
$imgpath = $_GET["imgpath"];
// ¿nos viene una visita de google images?
foreach($hr as $imgreferrer) {
$found = strpos($_SERVER["HTTP_REFERER"], $imgreferrer);
if ($found !== false) {
// Es una visita desde google images, así que vamos a devolverle una página en html, en vez de directamente la imagen.
header("Content-type: text/html");
?>
Imagen embebida
echo $imgpath; ?>" alt="" />
die(); // No sigamos con el loop
}
}
// Si la visita no era de google images, devuelve la imagen normalmente.
header("Content-type: image/jpeg"); // cuidado si no es un jpeg.. habrá que poner lo que corresponda.
echo file_get_contents($imgpath);
file_get_contents()
?>» Leer más, comentarios, etc...
programania
Controlando los errores con Zend Framework
Marzo 24th, 2009 - [Enlace local]
Una vez que somos capaces de controlar y personalizar los errores en PHP y excepciones en PHP, nos puede interesar centralizar los errores y excepciones que nos pueda lanzar Zend Framework.
Lo centralizaremos usando ErrorController, un controlador que, como su propio nombre indica, se encargará exclusivamente de los errores.
Cosas importantes:
- para que funcione deberemos decirle a nuestro FrontController que desactive las excepciones: $fc->throwExceptions(false);
- Para que el ErrorController tome el control, el Zend Framework deberá lanzar una excepción o hacerlo nosotros mismos mediante: throw new Exception(’Error nosequé’);
- Podemos utilizar las excepciones existentes en Zend Framework, o crear las nuestras propias extendiendo Zend_Exception.
- En éste caso guardaremos los errores en un Zend_Log, aunque por supuesto podríamos hacerlo en una BD, o enviarnos un mail, o generar un RSS con los errores… cualquier cosa!
Dicho esto, vayamos al grano. El código del ErrorController:
class ErrorController extends Zend_Controller_Action {
function init(){
$this->initView(); $this->helper->layout->setLayout('error'); }//init public function errorAction() { $errors = $this->getParam('error_handler'); $this->view->mensaje= ''; switch ($errors->type) { //Error MVC case Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_CONTROLLER: case Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_ACTION: //devolveremos un código 404 de página inexistente $this->getResponse()->setHttpResponseCode(404); //Lo que no existe es el controller if ($errors->type == Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_CONTROLLER) { $this->view->mensaje= 'No se ha encontrado el Controller: '; $this->view->mensaje.= $errors->request->getControllerName(); } //Lo que no existe es el action if ($errors->type == Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_ACTION) { $this->view->mensaje= ' No se ha encontrado el Action: '; $this->view->mensaje.= $errors->request->getActionName(); } break; //No es un error MVC default: //se cogenlas excepciones que han saltado $errores = $this->getResponse()->getException(); //se trata cada tipo de excepcion foreach ($errores as $error){ switch(get_class($error)){ case 'Zend_Db_Statement_Exception': $this->view->mensaje = 'ERROR DE BBDD: '.$error->getMessage(); break; case 'Zend_View_Exception': $this->view->mensaje = 'ERROR EN LA VISTA: '.$error->getMessage(); break; case 'Zend_Loader_Exception': $this->view->mensaje = 'ERROR AL CARGAR: '.$error->getMessage(); break; case 'Zend_Form_Exception': $this->view->mensaje = 'ERROR EN EL FORMULARIO: '.$error->getMessage(); break; //cualquier error no especifico default: $this->view->mensaje= 'Error desconocido!'; break; } //end switch(get_class($error)) } break; //terminar con los errores no MVC } /* PARA GUARDAR TODOS LOS DATOS EN UN ARCHIVO DE ERRORES (LOG) $log = new Zend_Log(new Zend_Log_Writer_Stream(Globals::getConfig()->dirs->tmp.'Error.log')); $log->debug($errors->exception->getMessage() . "\n" . $errors->exception->getTraceAsString()); */ return; } // public errorAction } // class ErrorController
» Leer más, comentarios, etc...
programania
Cómo guardar adjuntos con Zend_Mail
Marzo 24th, 2009 - [Enlace local]
Éste ejemplo funciona para mails multipart que codifican los adjuntos en base64. Tengo entendido que podrían venir codificados de otras maneras. Pero en los ejemplos que probamos funcionaban bien. Utilizamos Zend_Mail que es parte del Zend Framework.
‘user’ => ‘usuario$cocotero.net’,
‘password’ => ‘clave’));
$message = $mail->getMessage(1);//zend mail cogerá todos los mensajes,para éste ejemplo nos quedamos con el primero
//un mail llega en diferentes "partes". Nosotros buscamos el adjunto$part = $message->getPart(1);//esto es lo que más nos costó, descubrir que viene codificado y que hay que descodificarlo
$file_content = base64_decode($part->getContent());
$nombre_archivo = '/pathdondeguardar/nombrearchivo.ext';
$contenido = $file_content;
// Asegurarse primero de que el archivo existe y puede escribirse sobre él.
if (is_writable($nombre_archivo)) {
if (!$gestor = fopen($nombre_archivo, 'a')) {
// echo "No se puede abrir el archivo ($nombre_archivo)";
exit;
}
// Escribir $contenido a nuestro arcivo abierto.
if (fwrite($gestor, $contenido) === FALSE) {
//echo "No se puede escribir al archivo ($nombre_archivo)";
exit;
}
fclose($gestor);
} else {
echo "No se puede escribir sobre el archivo $nombre_archivo";
}
» Leer más, comentarios, etc...
SobreRaíles
Novedades en Edge Rails #17
Marzo 23rd, 2009 - [Enlace local]
| Nota: Esta entrada es una traducción de la publicada por Mike Gunderloy el 20 de Marzo de 2009 en el blog de Ruby on Rails. |
Por supuesto la gran novedad de esta semana en Rails ha sido el lanzamiento de Rails 2.3. Pero desde luego esto no significa que la historia de Rails Edge ha concluido antes bien nos estamos embarcando en uno de los proyectos más ambiciosos relacionados con Rails: la creación de Rails 3.0 Continúen leyendo para ver dónde estamos.
Cambios finales en 2.3
Algunas cosas fueron incluidas en Rails 2.3 en los días anteriores a su lanzamiento:
- Transacciones en el lenguaje de definición de datos para bases de datos SQLitecommit
- Compatibilidad entre
render :fileyPathnamecommit - Convenciones de denominación de clases de ActionController para Metal commit
Rails 2.3.2.1
Muy poco después de la publicación de Rails 2.3, que era la versión 2.3.2, se hizo necesario crear una etiqueta 2.3.2.1 porque a la versión etiquetada como 2.3.2 en el repositorio de Rails le falta una corrección importante (la versión instalable por gemas sí la incluye) En resumidas cuentas rake rails:freeze:edge RELEASE=2.3.2 congelaría la versión equivocada de Rails en nuestra aplicación.
Para corregirlo, el equipo de Rails ha reetiquetado el árbol principal en un punto seguro, después de la corrección. Esta nueva etiqueta es la versión 2.3.2.1 así que si estamos congelando Rails 2.3 en nuestra aplicación (en lugar de instalarlo como gema) debemos asegurarnos de utilizar rake rails:freeze:edge RELEASE=2.3.2.1.
El camino a Rails 3.0
Ahora que 2.3 está en la calle, ¿qué viene después? Rails 3.0, que ha sido un hito distante en el horizonte hasta ahora, se acerca con más velocidad. El equipo del core de Rails está discutiendo exactamente como proceder, pero debemos quedarnos con la idea de que dentro de poco veremos una gran cantidad de cambios en la versión inestable de Rails, según el trabajo que ha ido desarrollándose en diferentes forks del repositorio comienza a fusionarse en la rama maestra. Tendremos que ser cautos a la hora de utilizar la versión edge en las aplicaciones ya existentes. En particular, los cambios en el interior de Rails puede hacer que muchas extensiones tengan que ser reescritas. La versión de desarrollo de Rails continuará siendo el último grito, pero tendremos que estar al tanto de los cambios y estar preparados para trabajar con ellos si escogemos utilizar esta versión en desarrollo de Rails.
Pero esto tampoco quiere decir que Rails 2 se haya quedado congelada en el tiempo. Hay una nueva rama 2-3-stable en el repositorio de Rails que alojará todas las revisiones de mantenimiento que sean necesarios en la rama actual. Se continuará trabajando para garantizar que las versiones 2.x funcionan bien pero el centro de gravedad de Rails rápidamente se desplazará hacia Rails 3.0.
Así que permanezcan a la escucha. Continuaremos publicando los avances en el desarrollo de Rails 3.0 según vayan ocurriendo. El proceso será, como siempre, transparente y cualquier idea o comentario serán bienvenidos.
