Utilizamos cookies propias y de terceros para proporcionarte una buena experiencia de navegación. Si sigues navegando, entendemos que aceptas su uso. Acepto


SugarCRM: Como hacer un mass update sobre un campo Custom de tipo Checkbox

SugarCRM es una herramienta con un poder de configuración muy elevado sin embargo los campos de tipo Checkbox añadidos como campo custom no se pueden añadir a la función MASS UPDATE.

Para conseguirlo es relativamente sencillo, tenemos que hacer 3 cosas:

1) Modificar la definición del campo en la base de datos mediante:


update fields_meta_data set massupdate = 0 where custom_module = 'NOMBRE DEL MODULO' and name = 'NOMBRE DEL CAMPO';
update fields_meta_data set mass_update = 0 where custom_module = 'NOMBRE DEL MODULO' and name = 'NOMBRE DEL CAMPO';

2) Cambiar la definición del campo. Para ello edita el siguiente fichero:

custom/Extension/modules/NOMBRE DEL MODULO/Ext/Vardefs/extvardef.php

y añade lo siguiente:


$dictionary['NOMBRE DEL MODULO']['fields']['NOMBRE DEL CAMPO']['massupdate'] = true;

3) Finalmente accede a la administración del SugarCRM y realiza una Reparación y reconstrucción rápida

Comparte esta información:
  • Twitter
  • Facebook
  • del.icio.us
  • Meneame
  • BarraPunto
  • Google Bookmarks
  • PDF
  • email

Evento click del botón del medio del ratón en javascript: Capture & Cancel

Parecía fácil capturar el click del ratón en un enlace para evitar el comportamiento por defecto del navegador. Comprobar además que el botón del medio del ratón es el que está lanzando ese evento, y sólo entonces capturar y cancelar el evento, tampoco tendría que suponer mayor problema.

En principio, algo así, debería funcionar:

$("a.enlace").on('click',function(e) {
 
    if (e.button == 1) {
        e.preventDefault();
        e.stopPropagation();
       alert("Hago lo que quiero con mi enlace");
    }
 
});

Pero parece ser que ni Firefox ni IE8 parecen cancelar el evento de click desde el botón del medio del ratón... decisión que estará justificada en estándares de accesibilidad: ¿Por qué iban a permitir que un javascript cualquiera rompiese una mejora en la usabilidad del propio navegador? Lógico a priori, pero no muy práctico.

Buscando en Google sobre el tema, se llega rápidamente hasta el artículo Javascript Madness: mouse events (en la sección "Can default mouse actions be disabled?"),  y se confirma:  el evento click desde botón del medio del ratón, no es cancelable desde Javascript, ni en Gecko (Firefox), ni en Opera (parece ser que en IE si.. será a partir de la versión 9).

A pesar de todo, seguimos necesitando esta funcionalidad. Nuestra interfaz de usuario nos pide un comportamiento diferente para el click desde el botón del medio del ratón: Necesitamos una solución (que necesariamente pasará por algo no muy elegante, como es habitual con estos temas).

Al  probar el comportamiento del navegador cuando un enlace no tiene atributo href y se hace click con el ratón, el navegador ignora dicho evento. Es más, el enlace deja de ser clickable. Buena señal!

La solución pasará por emular eso mismo: suprimir el atributo href del enlace, dejar que el navegar procese su evento click, y devolver el atributo al enlace  justo después, para que todo quede igual.

Un par de pruebas después, utilizando algo del artículo de Javascript Madness (¿Tan difícil es ponerse de acuerdo con el número que se asigna a cada botón?), aparece una solución:

$("a.enlace").on('mouseup',function(e) {
 
    // Descubrir cual de los botones se ha usado para hacer click > http://unixpapa.com/js/mouse.html
    if (event.which == null) {
        /* IE case */
	button= (event.button < 2) ? "LEFT" :
                                ((event.button == 4) ? "MIDDLE" : "RIGHT");
    } else {
        /* All others */
	button= (event.which < 2) ? "LEFT" :
	                        ((event.which == 2) ? "MIDDLE" : "RIGHT");
    }
 
    if (button == 'MIDDLE') {
        // Cancelar el evento no sirve de nada en gecko (ni en IE8 por lomenos)
        event.stopPropagation();
	event.preventDefault();
 
        // Guardamos en el contexto
        var prevHref = $(this).attr("href");
        $(this).removeAttr("href");
	var $self = $(this);
 
        setTimeout(function() {
	    $self.attr("href",prevHref);
	},100);
 
        // Al finalizar esta función, el navegador recibe el control (a pesar del preventDefault)
        // Pero el enlace está vacío y no hace nada.
        // El enlace se restaura pasados 100ms <img src='http://code.irontec.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />
        // FUNCIONA!
    }
 
});

El truco se ha testeado en Firefox7+ e IE8+ (En Windows y Linux). En Chrome (webkit), funciona directamente cancelar el evento (con "preventDefault"), aunque el apaño no parece romper nada.

Una pequeña prueba de concepto aquí: middle-click-disabled.html.

Comparte esta información:
  • Twitter
  • Facebook
  • del.icio.us
  • Meneame
  • BarraPunto
  • Google Bookmarks
  • PDF
  • email

Liberamos Green On/Off el software de encendido y apagado remoto que te permitirá ahorrar energía

Green On/Off by Irontec¿Quién no ha necesitado alguna vez poder acceder de manera remota a su equipo de la oficina pero no ha podido porque estaba apagado? ¿Quien no lo ha dejado encendido para poder acceder a él desde fuera y ha sentido que estaba malgastando energía?

En Irontec hemos desarrollado un proyecto multiplataforma de Software Libre para ESLE (Asociación de Software Libre de Empresas de Euskadi) que presenta una solución a éste dilema: Green On/Off. Gracias a éste software, podemos gestionar de manera remota el encendido y apagado de todos los equipos que estén conectados a una red local en nuestra oficina, en casa...etc.

Tenemos la solución para nuestro equipo en la oficina pero, ¿qué ocurre si necesitamos utilizar una aplicación que requiera de servicios que están en otros equipos totalmente independientes y estos están apagados? (por ejemplo un servidor LDAP o de Base de datos externo a nuestro equipo). Para ello ideamos el concepto de "Granja": un conjunto o grupo de ordenadores que son dependientes entre sí y representan un servicio. De ésta manera se posibilita la opción de encender una granja que esté constituida por el servidor en el que se aloja la base de datos, y los ordenadores que vayan a hacer uso de ella.

Si ejecutamos la orden de encender la granja, se encenderán los componentes de ésta que que estén apagados permitiéndonos la utilización de la aplicación en su totalidad. La idea es elevar al usuario a una capa de abstracción superior habilitando un servicio concreto sin necesidad de saber qué hosts están participando. Se podrá visualizar a tiempo real el estado de cada host y crear tareas programadas (utilizando Cron) para que se lleven a cabo de manera automática cuando deseemos.

Además, cuando ya no se necesite utilizar más, podemos dar la orden de apagar la granja o el equipo individual que necesitemos, ahorrando así energía y dinero.

Algunas otras características del software son:

  • Autenticación de usuarios contra servidor LDAP
  • Sistema de permisos para grupos de usuarios
  • Invitaciones con acceso temporal para usuarios externos a la aplicación
  • Programación de tareas
  • Sistema de Log para el control de todas las acciones realizadas
  • Interfaz intuitiva para realizar todas las gestiones

Todo éste software, ha sido escrito sobre Javascript, PHP, MySQL y Shell Scripting en sistemas GNU/Linux. El sistema necesita ser hosteado en un equipo GNU/Linux con Apache y soporte para PHP y MySQL. Es capaz de gestionar el encendido de equipos con GNU/Linux, Mac OS X, Windows y/o cualquier equipo con una tarjeta de red Ethernet con soporte para Wake on Lan. Para apagar equipos de momento solo podemos apagar equipos Linux y Mac OS X (con el servidor SSH activado).

Cualquiera que quiera descargar el software (liberado bajo una licencia Affero Public License v3), lo puede hacer desde nuestro repositorio en GitHub: https://github.com/irontec/On-Off.

También puedes visitar la página web oficial de Green On/Off: Sitio web oficial. (aunque de momento está en construcción :) )

Comparte esta información:
  • Twitter
  • Facebook
  • del.icio.us
  • Meneame
  • BarraPunto
  • Google Bookmarks
  • PDF
  • email

Esaizu! Nuevo agregador social open source

Esaizu es una nueva aplicación web que nace con el objetivo de permitir tener integradas en un único lugar todas tus cuentas "sociales":  Twitter, Facebook, Linkedin, Wordpress y cualquier lector de Feeds.

Creado por Irontec para ESLE (Asociación de Software Libre de Empresas de Euskadi), hoy presentamos la versión 1.0 de este software.

agregador social open source

Escrita sobre PHP, MySQL, jQuery, CodeIgniter, Zend library y testada en el sistema operativo GNU/Linux, Esaizu ha sido desarrollada de manera modular, a partir de un sencillo esquema de plugins.

Este diseño obedece al deseo de crear una herramienta abierta a nuevas funcionalidades y servicios de manera sencilla y atenta a posibles contribuciones de la comunidad.

Liberada bajo una licencia Affero Public License v3, Esaizu cuenta de base, con las siguientes funcionalidades:

- Gestión de usuarios configurable: registro abierto o validado por administrador
- Gestión de identidades por usuario
- Sistema de publicación centralizado que incluye envíos programados (es necesario acceso al cron del sistema).
- Interfaz de usuario minimalista
- Contenido agrupado en columnas personalizables
- Búsquedas en tiempo real en Twitter

El código fuente de la aplicación está disponible en https://github.com/irontec/Esaizu-, y puede ser descargada e instalada libremente.

Comparte esta información:
  • Twitter
  • Facebook
  • del.icio.us
  • Meneame
  • BarraPunto
  • Google Bookmarks
  • PDF
  • email

Ironsocial: Tema para wordpress+buddypress 1.2.8

Ironsocial es un tema para wordpress+buddypress desarrollado a partir del tema por defecto incluído en la versión 1.2.8 de buddypress. En realidad la idea de la que he partido ha sido la de disponer de un tema limpio, que sirva como base para la creación de sitios web basados en redes sociales. Para ello, el tema dispone de una página de opciones donde es posible modificar el layout del sitio, para poder adaptarse a los puntos de partida más cómunes en los proyectos web solicitados (3 o 2 columnas, tamaño de la cabecera, disposición y elementos del menú, etc.), en definitiva, un tema que nos permita ahorrar tiempo en los inicios de un proyecto de este tipo.

Junto con el tema, podéis descargar varios plugins de utilidad, que además pueden servir de base para crear otros más complejos:

- Iron BP Groups

Widget que muestra los grupos de los que el usuario es miembro, ordenados por last_activity del grupo.

- Posibilidad de establecer el titulo del widget.
- Posibilidad de mostrar enlaces de Crear Grupo y Ver Todos y su alineación.
- Seleccionar el Numero de grupos mostrados.
- Mostrar o no el avatar del grupo y seleccionar su tamaño.
- Mostrar o no el nº de miembros de cada grupo.
- Mostrar o no time since de la última actividad de cada grupo.
- Seleccionar el orden en el que serán mostrados (alfabeticamente, más miembros, más activos)
- CSS propio del widget, activar o no. Si se activa se adapta perfectamente al default theme de Buddypress.

- Iron BP Friends

Widget que muestra los amigos del usuario logueado.

- Posibilidad de establecer el titulo del widget.
- Posibilidad de mostrar enlace a ver todos y su alineación.
- Seleccionar el Numero de amigos mostrados.
- Mostrar o no el avatar del amigo y seleccionar su tamaño.
- Mostrar o no time since de la última actividad de cada amigo.
- Seleccionar el orden en el que serán mostrados (alfabeticamente, nuevos, más activos u online)
- CSS propio del widget, activar o no. Si se activa se adapta perfectamente al default theme de Buddypress.

- Iron BP Notifier

Plugin que permite mostrar notificaciones en pantalla de comentarios en el muro de actividad de Buddypress, así como notificar cuando un usuario marca actualizaciones como favorito.

- Permite activar/desactivar las notificaciones en pantalla de comentarios del blog.
- Seleccionar si mostrar la notificación sólo al autor del post o también a los usuarios que han participado en los comentarios. Igualmente para enviar email.
- Permite activar/desactivar las notificaciones en pantalla de actividades marcadas como favoritos. En este caso sólo se envían al autor del item que se ha marcado como favorito.

- Iron BP PrivateSite

Este plugin convierte tu sitio web en privado, es decir, sólo los usuarios logueados podrán acceder a él.

- Activar/Desactivar modo privado.
- Excluir páginas del modo privado y hacerlas públicas.

- Iron Language Widget

Este plugin te permite colocar un selector para cambiar de idioma rápidamente, seleccionando los idiomas disponibles en la carpeta wp-content/languages de wordpress. Soporta buddypress_es_ES, buddypress_en_EN y buddypress_eu_EU (Euskera).

Para instalar el tema deberéis descargar el siguiente archivo: ironsocial_theme.zip y descomprimirlo en la carpeta wp-content/themes, o bien instalarlo desde el panel de administración de wordpress.

Los plugins por su parte, están todos en un archivo zip que podéis descargar aquí: ironsocial_plugins.zip. Para instalarlos deberéis descomprimir cada archivo zip por separado, dentro de la carpeta wp-content/plugins, o bien utilizar el panel administración de wordpress y subir cada uno de los zips contenidos en el paquete.

UPDATE 05-07-2011: Ha salido la versión 1.2.9 de BuddyPress que provocaba un error con las páginas llamadas vía ajax (las pestañas de "Mis amigos", "Mis Grupos", etc.). Se ha resuelto, podéis descargar el tema completo actualizado para la versión 1.2.9 de Buddypress aquí.

Comparte esta información:
  • Twitter
  • Facebook
  • del.icio.us
  • Meneame
  • BarraPunto
  • Google Bookmarks
  • PDF
  • email

Publicando aplicaciones libres

Últimamente, en Irontec, hemos estado desarrollando software que queremos liberar (por algo tenemos GNU/Linux en el nombre de la empresa, ¿no?), y hasta ahora no habíamos tenido una política clara de dónde/cómo liberar.

Anteriormente ya hemos liberado algo de software (un par de plugins para zimbra, PFA) y cada uno de ellos en sitios diferentes.

Sin embargo, a la hora de liberar, nos hemos dado cuenta de que antes de elegir el sitio donde vamos a hacer la publicación, hemos de elegir la licencia con la que queremos publicar, lo que nos obliga a mirar las dependencias que tiene internamente nuestro proyecto.

Por otro lado, dependiendo del software que estemos desarrollando (aplicación de escritorio, aplicación web, móvil, etc) haremos el primer filtro de licencias.

Por partes, que diría un famoso asesino...

Es decir, primeramente filtras en base al tipo software que estás desarrollando, el lenguaje que estás utilizando, ves la licencia(s) del software en el que te basas o enlazas, y finalmente eliges la licencia que tendrá tu creación ;-)

Vale, perfecto, tenemos la licencia elegida. Ahora, ¿dónde libero mi software?. Tenemos que tener en cuenta que no es solamente colgar un archivo comprimido en un servidor, lo cual es fácil, sino que hay que tener una infraestructura alrededor:

  • Soporte de incidencias: porque no somos perfectos y puede tener fallos el software y queremos generar una comunidad para nuestra world-domination-tool.
  • Control de versiones: internamente utilizamos svn para trabajar, con lo cual para nosotros es un plus que tenga soporte svn. Aunque nos podría servir usar conectores svn-git o svn-hg, pero pierde puntos (para nosotros).
  • Listas de distribución o alguna forma de comunicación entre los usuarios de nuestro software y los developers
  • Manuales, o al menos, un mínimo de información sobre nuestro proyecto: logos, las funcionalidades que provee, un roadmap, FAQs, etc. Esto lo cubrimos por medio de wikis o páginas estáticasª
  • ...y si es posible, a coste cero.

Y una vez ya tenemos nuestros requisitos, acudimos donde Madamme Wikipedia, que ya ha realizado esta comparación de servicio por nosotros.

También hay que tener en cuenta, que existe un factor clave en la liberación de software, que es la visibilidad y la centralización de recursos. Como que no tendría mucho sentido liberar una librería Android para usar Y!Maps en codeplex, no? ;-)

Con lo cual nuestros finalistas son:

  • SourceForge: uno de los más viejos del lugar, que lleva muchos años en el hosting de proyectos open source. Requiere una aprobación por parte de los sysadmins no excesivamente larga.
  • GNU Savannah: El sitio oficial de la FSF. Requiere un proceso de aprobación largo, y la subida se realiza cuando el proyecto ha sido revisado y aprobado por la FSF. El proceso es exaustivo y suele tardar.
  • GitHub: Exclusivamente usa git. El proceso es darse de alta, crear un repositorio  y empezar a subir código.
  • Google Code: Ofrece todo lo que queremos, pero es necesario tener una cuenta de Google, tanto para los desarrolladores como para los usuarios.

Así que en breve vereis los posts del nuevo software que iremos liberando, junto con los sitios donde hemos liberado.
Y para los que queráis algo más de información:

Comparte esta información:
  • Twitter
  • Facebook
  • del.icio.us
  • Meneame
  • BarraPunto
  • Google Bookmarks
  • PDF
  • email

Guardando dentro de una imagen PNG, un JSON cifrado en AES, usando PHP

Hace ya varios años, en mis inicios programando en PHP, me pasaba horas, días, semanas, intentando resolver los retos en la web de http://www.bright-shadows.net/. Una de mis categorías preferidas era la de Stegano. Para el que no sepa que es la esteganografía, como siempre puede acudir a http://es.wikipedia.org/wiki/Esteganograf%C3%ADa, que resumiendo sería lo siguiente:

La esteganografía, en el moderno sentido de la palabra y en términos informáticos, se refiere a información o a un archivo cualesquiera que se encuentra oculto dentro de otro, normalmente multimedial, es decir, el portador es una imagen digital, un vídeo o archivo de audio.

Intenté hacer un script en PHP para poder guardar texto dentro de una imagen, pero no logré hacerlo. ¿El problema? Guardaba la imagen en formato JPEG, que utiliza un algoritmo de compresión con pérdida para reducir el tamaño de los archivos de imágenes. Eso hacía que no guardase el color tal y como yo le decía que lo hiciese. Pensando que era problema de PHP, lo abandoné. Hasta hace 1 semana, que retomé el reto de hacerlo en PHP. Me volvió a dar el mismo problema al guardarlo en JPEG, así que esta vez, con pensarlo un poco, lo repetí guardándolo en PNG, que es un formato gráfico basado en un algoritmo de compresión sin pérdida para bitmaps. Al no tener perdidas, los colores se guardan tal y como se le indica.

El método que pensé para guardar el texto dentro de la imagen, sería modificando el último bit de cada color RGB de cada pixel de la imagen. Después me di cuenta de que ese método tenía un nombre, Inserción en el bit menos significativo (Least Significant Bit Insertion), y es el método más común y popular. Por algo se me ocurriría hacerlo así, es lo más lógico xD.

Una vez que ya era capaz de guardar texto dentro de una imagen, ya me puse a hacerlo bien. He creado una clase en PHP con la que podremos coger una imagen y guardar dentro de ella un texto en JSON cifrado en AES. Como viene explicado en el método a usar, todo lo guardado va a ir en binario. Vamos a ir viendo esta clase paso a paso, donde iré explicando lo que hace en cada momento. Para poder usar la clase es necesario tener instalado la biblioteca GD de PHP.

(más...)

Comparte esta información:
  • Twitter
  • Facebook
  • del.icio.us
  • Meneame
  • BarraPunto
  • Google Bookmarks
  • PDF
  • email

Conectando SugarCRM con Mantis Bug Tracker mediante SOAP y LogicHooks

Para contextualizar un poco este post el punto de partida es explicar un poco cual es nuestra forma de trabajar en el área comercial. SugarCRM es una herramienta libre de gestión comercial muy potente. La utilizamos para hacer seguimiento de nuestras cuentas de clientes, contactos y oportunidades. Desde el punto de vista de las oportunidades es muy útil para conocer el volumen de ventas de la cartera de cada persona, conocer los proyectos en fase de presupuesto, los ganados, los perdidos...

Por otro lado utilizamos de Mantis BT como gestor de proyectos y seguimiento de tiempos. Esta herramienta nos sirve para gestionar todas las tareas de nuestro día a día. Las tareas comerciales son las que más tiempo nos ocupan a las personas que llevamos el área comercial y nos parecía fundamental hacer seguimiento del tiempo que se invierte en ellas, igual que se mide lo que se tarda en cualquier proyecto relacionado con la producción.

En este punto teníamos que duplicar el trabajo administrativo. Por un lado crear la oportunidad en el CRM y por otro dar de alta una tarea en el Mantis para hacer el seguimiento de tiempos.

Se nos ocurrió que podíamos hacer uso de los servicios web de Mantis y los logic hooks, que ya comentamos en otro post, para conectar ambas aplicaciones y ahorrarnos tiempo administrativo no útil.

El truco está en el siguiente tutorial:

Requisitos previos:

Primera parte: obtener el ID del proyecto del mantis en el que haremos las inserciones

Para ello accederemos a nuestra base de datos de la forma que más nos guste. En mi caso el cliente MySQL de consola y obtengo el ID de los proyectos que necesito mediante la siguiente consulta: (busco por comercial por que el proyecto que he creado se llama '[IRONTEC] Comercial'

 
SELECT id,name FROM mantis_project_table WHERE name LIKE '%Comercial%';
 

Esto me devuelve que mi ID es el 286. Lo dejo por ahí apuntado para utilizarlo luego. Como veremos más adelante nosotros utilizamos 2 proyectos diferentes para insertar la incidencia, dependiendo del tipo de oportunidad que sea,

Segunda parte: modificar el logic hook para añadir la nota

Para añadir el logic hook tenemos que abrir nuestro Opportunities_Hook.php (ver post sobre logic hooks para saber como hacerlo).

La clave es este cacho de código que tendremos que insertar dentro del fichero.

Primero preparo el tipo de conexión SOAP que quiero hacer y conecto con la API de Mantis

 
$options = array(
'exceptions'=>true,
'trace'=>1);
$mantis = new SoapClient('http://URL_a_mi_mantis/api/soap/mantisconnect.php?wsdl',$options);
 

Preparo el ID del proyecto al que asignar la nota. En nuestro caso tenemos 2 tipos de proyectos por eso es un poco más complicado. Utilizamos un campo personalizado para saber que tipo de proyecto es.

  • 286 - [IRONTEC] Comercial
  • 553 - [VOZ-IP] Pedidos
 
switch ($bean->tiponegocio_c) {
case "ShopIP" :
$proyect_id='553';
$category = 'Pedido';
break;
default :
$proyect_id='286';
$category = 'Comercial';
}
 

A partir de aquí es donde se prepara la incidencia que se va a reportar. Observa que en la nota que voy a meter en mantis pongo una referencia a la oportunidad en el CRM. Así el seguimiento es más cómodo a posteriori.

 
$issue=array ('project' => array ('id' => $proyect_id, 'name' => ''),
'category' => $category,
'priority' => array ('id' => '', 'name' => ''),
'severity' => array ('id' => '', 'name' => ''),
'status' => array ('id' => '', 'name' => ''),
'reproducibility' => array ('id' => '', 'name' => ''),
'resolution' => array ('id' => '', 'name' => ''),
'version' => '',
'projection' => array ('id' => '', 'name' => ''),
'eta' => array ('id' => '', 'name' => ''),
'view_state' => array ('id' => '10', 'name' => ''),
'summary'  => $bean->account_name.' - '.$bean->name
'description' => $bean->description.'
Mas información en https://URL_a_tu_CRM/index.php?module=Opportunities&amp;action=DetailView&amp;record='.$bean->id
);
 

Inserto la nota en el Mantis con un usuario de Mantis que está asignado a los 2 proyectos. La inserción me devuelve en $idissue el ID de la incidencia que acaba de crear.

 
try {
$idissue = $mantis->mc_issue_add("UsuarioMantis", "ContraseñaMantis", $issue);
} catch (Exception $e) {
var_dump($e); //En caso de que no se inserta por lo que sea hago un dump de la excepción
die();
}
 

Modifico la descripción que se insertará en el CRM para tener recogido el ID de la incidencia en Mantis

 
$bean->description = $bean->description. "\n Puedes seguir esta oportunidad en el mantis mediante http://URL_a_tu_mantis/view.php?id=".$idissue;
}
 

Opcionalmente

Opcionalmente podemos meter una modificación en nuestro CRM en forma de campo personalizado que nos permita decidir si queremos que se cree la tarea en mantis o no.

Espero que esto os ayude a unir vuestras herramientas o al menos serviros de ejemplo para hacer cosas más complicadas con la API de Mantis.

Os dejo aquí enlazado el fichero de ejemplo completo para que su lectura sea más sencilla y con toda la lógica que utilizamos nosotros.

Comparte esta información:
  • Twitter
  • Facebook
  • del.icio.us
  • Meneame
  • BarraPunto
  • Google Bookmarks
  • PDF
  • email

Zorionak.irontec.com – postal asíncrona para el 2011

Ayer 29 de Diciembre, nos dimos cuenta que ya casi se había acabado el año, y seguíamos sin desear lo mejor a nuestros clientes (esto es, que sigan contando con nosotros para el año 2011 :) )... Algo había que hacer y rápido!!

Lo mítico hubiera sido tirar de inkscape + gimp y hacer un envío masivo... pero somos demasiado frikis y las ganas nos pudieron, así que decidimos poner en práctica un poco del "kung-fu" utilizado en las acciones de Banden Lehia y Xaramela (que muy pronto postearemos en video).

El objetivo era crear una postal web interactiva en la que los visitantes, pudieran interactuar en tiempo real con los elementos de la misma. La idea estaba inspirada unos imanes de nevera de colores que vimos en casa de un amigo, pero a lo digital.

Así que hoy día 30, y aunque estamos añadiendo alguna funcionalidad nueva, ya podemos contaros como lo hicimos...

Gracias a jQuery y jQuery UI, hemos conseguido hacer todos los elementos se puedan arrastrar (es verdaderamente sencillo).

Para conseguir que los movimientos se compartan y actualicen en tiempo real entre todos los usuarios, hemos utilizado Red5. Gracias a esta aplicación podemos también indicar el número de clientes conectados de forma simultanea.

Aquí es donde nos encontramos con una contradicción: hacemos la interfaz con Javascript, y utilizamos un servidor de objetos pensado para Flash... y es aquí donde entra sharedObjectGW.js, que en un primer momento se desarrolló para nuestra centralita de Voz IP, y hemos pensado que aquí nos encajaría.

La explicación es la siguiente, gracias a Red5, podemos compartir los datos (de manera síncrona) de un objeto entre varios clientes, utilizando un Remote SharedObject de Flash. El caso es que Red5 solo habla con Flash y nuestra interface está basada en HTML+CSS+jQuery. Así que lo que necesitamos es una pequeña aplicación flash que sincronice el ShareObject con Javascript. Para realizar este Flash de forma libre tenemos una forma un poco artesanal (u otra muy artesanal). Así se crea sharedObjectGW un pequeña clase de Javascript que hace que la comunicación fluya entre el SWF (flash) que mencionamos y Javascript.

En principio no es una solución ideal, ya que hace que flash sea un requisito indispensable (los terminales móviles se quedan fuera), pero mientras esperamos y seguimos investigando nuevas tecnologías (WebSockets, Google Wave, etc), esta es nuestra pequeña solución 100% open source, que funciona a las mil maravillas :D .

Bueno, os dejamos un enlace con toda la aplicación (incluyendo fuentes de Java para la mini aplicación Red5, y el fuente para mtasc del conector swf). Se podría decir que el software esta en pre-beta, pero tiene muy poca esperanza de vida (una felicitación a mediados de Enero deja de tener sentido), pero cualquier sugerencia, crítica o comentario será como siempre bienvenido.

Por cierto a lo curiosidad, el diseño de la postal se ha realizado utilizando inkscape.

Algunos enlaces de interes:

Comparte esta información:
  • Twitter
  • Facebook
  • del.icio.us
  • Meneame
  • BarraPunto
  • Google Bookmarks
  • PDF
  • email

Haciendo posible PHP sobre Android.

ASE (Android Scripting Environment) es una aplicación para Android desarrollada por Google gracias a la cual es posible editar y ejecutar scripts en tu terminal móvil. Con este sistema, gran parte de la API de Android, será accesible desde un script. Mediante una capa de interacción JSON RPC implementada en ASE, podremos por ejemplo, realizar llamadas, enviar mensajes o consultar la agenda de teléfonos de nuestros teléfono mediante un secillo script.

Actualmente, ASE da soporte a varios lenguajes de scripting: Python, Ruby o Lua. Como no podía ser de otra manera, desde Irontec echamos de menos el lenguaje de scripting que más utilizamos: PHP. Viendo la potencia de ASE, que permite que cierto tipo de aplicaciones como notificaciones o integraciones sean realizadas rápidamente con lenguajes de scripting, para nosotros era imprescindible que PHP estuviera ahí.

Irontec cuenta con cierta experiencia en el desarrollo de aplicaciones móviles. En los últimos meses, hemos realizado algún proyecto para Android, aunque en el pasado también se han hecho ciertas cosas con J2ME. A día de hoy, la apuesta en cuanto a plataformas móviles que realiza Irontec, se inclina claramente a favor de Android. Con sus limitaciones, es la opción del mercado que más se ajusta a nuestra filosofía. Es obivo que si además de la potencia de Java, disponemos de PHP para llevar a cabo desarrollos medianos, mejor que mejor.

La incidencia para añadir soporte PHP a ASE, lleva abierta más de un año y hasta ahora, no había habido aportación alguna en cuanto a desarrollo, aunque sí muestras de interés por parte de algunos usuarios.

Es por eso que, hacernos cargo de esa incidencia, nos ha parecido un reto interesante, no sólo de cara a futuros desarrollos internos, sino como algo interesante para una parte importante de la comunidad.

Primero ha sido necesario añadir ciertas clases Java que hacen que ASE tenga información acerca de las características particulares de PHP como intérprete (extensión del fichero, valores booleanos, inicio de script...).

Después ha venido la tarea de preparar un ejecutable de PHP. Se ha barajado utilizar Quercus, una implementación de PHP5.2 escrita en Java. A priori puede parecer la opción natural en ASE, viendo que existe soporte a JRuby. Finalmente nos hemos encontrado con bastante problemas en la conversión del bytecode a la máquina virtual de Android: Dalvyk.

Al final, nos hemos decantado por probar con la implementación oficial de PHP. Encontramos una referencia a una guía sobre compilar PHP para Android de Moshe Doron. Desgraciadamente la página web ya no se encontraba disponible ni cacheada así que contactamos con Moshe, y al de unas horas, respondió diciendo que había vuelto a poner la guía online (gracias moshe!). Hemos realizado una compilación cruzada 100% estática de PHP utilizando las herramientas de CodeSourcery. En la guía se realiza una compilación únicamente del core de PHP, pero como mínimo supusimos que necesitaríamos también las extensiones de "json" y "sockets" para poder interactuar con ASE. Esto nos hizo topar con un bug en la versión de producción actual de PHP 5.3 con lo cual por ahora usamos un snapshot del repositorio de PHP.

Superados ambos retos, nos encontramos con las nuevas clases Java que harían que ASE entendiera a PHP y un binario del intérprete PHP funcionando en Android. La nueva dificultad era poder probar el conjunto. Estudiando el mecanismo de ASE, nos damos cuenta de que éste, proveé los intérpretes que el usuario desea. Por esta vía, nos damos cuenta rápidamente de que no hay una forma evidente de probar nuestro conjunto. Es por eso por lo que optamos por fijar manualmente PHP como intérprete soportado en ASE, al igual que lo está una shell que viene instalada por defecto.

En este punto ya podíamos ejecutar scripts sencillos en PHP desde ASE, pero aún seguimos sin acceso a la API de Android. Dicha comunicación, es relativamente sencilla. Simplemente hace falta una capa de comunicación por sockets mediante mensajes JSON. Tirando de las clases análogas en Python y Ruby, hemos entendido el sistema, y portado la clase a PHP.

A estas alturas, podemos decir que hemos conseguido que PHP esté soportado como lenguaje de scripting en las plataformas Android. En próximos días prepararemos el commit, con lo cual esperamos que ASE tenga soporte para PHP pronto. Un granito de arena aportado desde Irontec, para que PHP (posiblemente de los lenguajes de scripting más popular del mundo), esté soportado en terminales Android. Dada la popularidad de PHP, y la expansión del sistema operativo de Google, esperamos que más gente se una al proyecto.

Queremos agradecer desde aquí a Moshe Doron su trabajo en la guía de compilación cruzada de PHP a Android.

Comparte esta información:
  • Twitter
  • Facebook
  • del.icio.us
  • Meneame
  • BarraPunto
  • Google Bookmarks
  • PDF
  • email