Noticias Weblogs Foros Wiki Código

Meta-Info

¿Que es?

Planeta Código es un agregador de weblogs sobre programación y desarrollo en castellano. Si eres lector te permite seguirlos de modo cómodo en esta misma página o mediante el fichero de subscripción.

rss subscripción

Sponsors

Puedes utilizar las siguientes imagenes para enlazar PlanetaCodigo:
planetacodigo

planetacodigo

Si tienes un weblog de programación y quieres ser añadido aquí, envíame un email solicitándolo.

Idea: Juanjo Navarro

Diseño: Albin

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

En enero del 2008 comenzó una nueva etapa profesional para mi, cambié de compañía en búsqueda de nuevos retos y proyectos donde trabajar, y continuar aprendiendo, en lo que verdaderamente me apasiona, las nuevas tecnologías de desarrollo software. Atrás dejé una cómoda posición como Analista en una factoria de software al cargo de varios aburridos y antediluvianos proyectos de mantenimiento de una importante TELCO.



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) la cárnica el grupo hispano líder que aporta referencias de éxito en proyectos similares más la clase media y (iii) la empresa regional con aspiraciones que aporta el toque local, instalaciones y una masa de programadores a buen precio. Una organización digna de un imperio persa.



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.

Mis planes para este año implican las siguientes mejoras:

Con ésto doy por terminada esta primera parte de introducción y ecosistema. En la segunda me centraré en la arquitectura de la aplicación.

» Leer más, comentarios, etc...

Picando Código

Disponible Arora 0.6: Instalación en Debian / Ubuntu

Marzo 31st, 2009 - [Enlace local]

Arora

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.

Arora 0.6 en Debian

Arora 0.6 en Debian

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:

  1. Asegurarse de tener Git instalado.
    En Debian con

    apt-get install git-core

    instalamos lo necesario para obtener el código fuente

  2. 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
  3. 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 :P

» Leer más, comentarios, etc...

HardBit

Programadores y Usuarios de Mac (PUMac)

Marzo 31st, 2009 - [Enlace local]

pumac_logo copia.png

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.

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:

  1. //guardar datos
  2. var clave:String = "password";
  3. var bytes:ByteArray = new ByteArray();
  4. bytes.writeUTFBytes(str);
  5. EncryptedLocalStore.setItem("clave", bytes);
  6.  
  7. //leer datos
  8. var datos:ByteArray = EncryptedLocalStore.getItem("clave");
  9. var miclave:String=datos.readUTFBytes(datos.length));
  10.  
  11. //eliminar datos
  12. 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

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

Share/Save/Bookmark

» 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

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.

http-headers-status-v3Via: anieto2k

Tambien te puede interesar

Share/Save/Bookmark

» 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:

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.

$mail = new Zend_Mail_Storage_Pop3(array(’host’ => ‘pop3.cocotero.net’,
‘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:

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.

» Leer más, comentarios, etc...

Información legal y técnica