Oracle Java (JDK 7) en Debian 6 (squeeze)

Estamos reconfigurando nuestros servidores en vísperas de los nuevos lanzamientos que tenemos agendados para el 2013. Así que ahora tocó la hora de reconfigurar un servidor Debian con la última versión del JDK de Oracle.

¿Por qué usar la de Oracle? a pesar que muchos critican a Oracle por su constante adquisición de empresas (y Sun no es la excepción de ahí la crecida comunidad generando nuevos proyectos fuera de ese contexto como MariaDB) en nuestro caso los diferentes equipos de desarrollo están usando siempre la última versión del JDK de Oracle, entonces, preferimos mantenernos con esta versión para evitarnos inconvenientes. Consistencia es una de las cualidades que preferimos.

¿Cómo instalar en Debian? He de confesar que una vez que uno entiende cómo hacerlo, el procedimiento es bastante sencillo. Si quieren una versión super archi resumida del asunto, pueden seguir los pasos descriptos aquí.

Primero que nada, descargar la última versión del JDK – http://www.oracle.com/technetwork/java/javase/downloads/index.html. En mi caso jdk-7u11-linux-i586.tar.gz.

Seguir los siguientes pasos en la línea de comandos.

# Descomprimirlo (estamos ubicados en el directorio donde pusimos la descarga)
tar -xvf jdk-7u11-linux-i586.tar.gz
# Crear directorio para todas las versiones de java
mkdir /usr/local/java
# Mover el directorio descomrpimido
mv jdk1.7.0_11 /usr/local/java
# Configurar Debian para que sepa donde pusimos Java
update-alternatives --install /usr/bin/java java /usr/local/java/jdk1.7.0_11/bin/java 1065
update-alternatives --install /usr/bin/javac javac /usr/local/java/jdk1.7.0_11/bin/javac 1065
update-alternatives --install /usr/bin/jar jar /usr/local/java/jdk1.7.0_11/bin/jar 1065
update-alternatives --install /usr/bin/javaws javaws /usr/local/java/jdk1.7.0_11/bin/javaws 1065
# Configuramos el default de java
update-alternatives --config java
# Si solo tenemos uno, el mensaje sería:
# -> There is only one alternative in link group java: /usr/local/java/jdk1.7.0_11/bin/java

¿Cómo verificamos la instalación? Fácil

java -version

Deberíamos ver

java version "1.7.0_11"
Java(TM) SE Runtime Environment (build 1.7.0_11-b21)
Java HotSpot(TM) Server VM (build 23.6-b04, mixed mode)

Y si queremos lujo, podríamos configurar los bash, agregando en el /etc/bash.bashrc

$ vi /etc/bash.bashrc
export JAVA_HOME=/usr/local/java/jdk1.7.0_11
export PATH=$PATH:$JAVA_HOME/bin

Y para que quede todo bien, configuramos usando

source /etc/bash.bashrc
source ~/.bashrc

Con eso estamos… 😉

Adaptando un sitio en Symfony2 para Facebook

Nuestro cliente  solicitó que partes del sitio que estábamos manteniendo pudiera accederse desde una tab de facebook. Más que como un trabajo lo vimos como un desafío: ¿Como agregar un sitio a un tab de facebook haciendo la menor cantidad de cambios posibles?

Luego de un poco de análisis, advertimos que lo único que debía cambiar en el sitio eran las vistas. Los datos a mostrar eran los mismos, pero las vistas tenían que ser obviamente adaptadas para Facebook.

(more…)

PHP básico a Symfony2 considerando lo básico

Hace unos días un cliente nos encomendó el trabajo de mantener un sitio que habían comenzado a desarrollar. El sitio era PHP plano, sin mucha organización apreciable. Y entre el mantenimiento solicitado también estaba el de desarrollar algunas funcionalidades nuevas.

Como siempre el tiempo para terminarlo era el día anterior al que nos lo den, por lo que mucho menos había tiempo para hacerlo todo de nuevo, teníamos que vivir con el sitio tal cual estaba, y agregarle más información.

Nuestra decisión fue ir reemplazando partes del sitio de a poco por una estructura que nos gustara más. Decidimos crear un proyecto de Symfony2 y dentro de la carpeta web de Symfony crear una carpeta legacy donde poner todo el código legado que teníamos.

Luego, modificamos el .htaccess de la carpeta web para delegar TODAS las páginas al directory legacy (utilizando mod_rewrite de Apache2), que tambíen venía con su propio .htaccess para hacer algunas “pretty url” (para optimización SEO) de forma casera.

Lo que conseguimos fue que a pesar de estar en otro directorio, todo el sitio siguiera funcionando, con exactamente las mismas URLs.

Teniendo esto implementado, nuestra idea era ir modificando el .htaccess del directorio web para que las rutas que de a poco iríamos implementando con Symfony en lugar de ir al directorio Legacy, fueran al controller de Symfony.

Entonces implementamos alguna pagina del sitio que nos pareciera simple, pero con Symfony, y configurando en los routes de symfony la misma url que hubiera tenido la original. Accediendo utilizando app_dev.php mientras estabamos desarrollando, una vez terminado el desarrollo modificamos el .htaccess para que esa ruta en lugar de ir al sistema legado, fuera al controller de Symfony.

Al hacer esto se nos planteó el primer problema.

  • Los links al resto del sistema, que aun estaba en legacy, no podían ser generadas por symfony, así que todas las rutas que utilizamos en las páginas, fueron rutas absolutas. Cuando tengamos mayor parte del sitio migrada tal vez las iríamos convirtiendo a path de Symfony.

Luego hubo otro problema con el encoding de la base de datos.

  • La base de datos tenía algunos datos como UTF8, otros como latin1, las tablas estaban mal definidas. Decidimos pagar el precio de tener algunos problemas de encoding. Mitigamos este costo en zonas importantes utilizando utf8_decode para algunos datos (creamos un filter de twig para aplicar la funcion al mostrar los datos) pero rápidamente pudimos atacar las áreas problematicas y arreglar la base de datos.

Luego de tener esta estructura funcionando, y sintiendonos más seguros con el camino elegido, el resto fué (y esta siendo) bastante tranquilo, sin grandes sobresaltos.

Es para comentar en otro post el como resolvimos el tema de encoding de la base de datos, y como pudimos, gracias a Symfony, adaptar parte del sitio a un tab de facebook sin modificar ni un solo controller.

Emprendiendo, gestionando proyectos, RRHH: todo un desafío

Hace ya algunos meses tuve la suerte de participar en uno de los seminarios que dictó el GCBA en sus jornadas para emprendedores. Como no podía ser de otra manera en una mezcla entre seminario de “cómo usted puede hacer tal cosa” mezclado con un “nosotros sabemos hacerlo bien, contratenos” (básicamente, un poco de publicidad, vieron?). En mi caso, al que asistí fue “Elementos a tener en cuenta para el Management y RR.HH de una nueva empresa” que en principio no escuché nada nuevo, pero si me agradó la perspectiva diferente a lo que yo venía acostumbrado.

Nota de autor: recuerden que yo soy ingeniero y me he rodeado generalmente de este tipo de perfil para todo ámbito profesional, salvo contadas excepciones, entonces la perspectiva de dos psicólogos me resultó muy enriquecedora

Veamos el resumen de lo que puede obtener.
(more…)

Gestión de errores en iOS (TestFlight) y estadísticas de uso (Google Analytics)

Hace ya algún tiempo hemos estado desarrollando un port para iOS de nuestra flamante aventura gráfica. He de confesarles que hubo muchos desafíos con el motor, las nuevas restricciones gráficas y de memoria… Pero eso es otra historia.

Lo interesante es que hay dos herramientas que consideramos bastante importantes.

  • TestFlight – Donde uno puede generar builds, subirlos y automáticamente invitará a gente para que los prueben. Hay un interesante instructivo aquíque cuenta un método de agregarlo y evitar que sean incluidas las librerías en el caso que hagamos un release para Apple.
    • una nota importante es que tesflight puede guardar información del uuid para los dispositivos pero esto no puede llegar nunca al Apple Store porque garantiza su rechazo.
  • Google Analytics – Al igual que para las páginas web y los dispositivos Android, se puede también incluir el framework de Analytics y tener unas interesantes estadísticas del uso del sitio.
  • HockeyApp –  Similar a la combinación de ambos anteriores, integra funciones de estadísticas, reportes de errores y, por supuesto, herramientas para hacer testing (de hecho, el testing lo hacen por un convenio con TestFlight según lo que me informaron)

Otra cosa muy interesante es la forma en que se pueden agregar parámetros de configuración. He quedado sumamente sorprendido por lo sencillos que son de usar, pero no amerita que me ponga a contarlos por aquí (la verdad es que están muy bien descriptos en la documentación de Apple) y tienen un soporte nativo a la internacionalización evitándonos tener que hacer un alto desarrollo.

EVA X (2012) – Reversion en el Showcase

Durante el pasado viernes y sábado transcurrió la décima exposición de EVA. 3f, como miembro del ADVA, había sido convocado para participar, como oyente y para presentar algún juego desarrollado en el último año en lo que se llamó Showcase EVA X. Entre otros desarrollos nacionales, tuvimos la oportunidad de presentar Reversion y anunciar que ya estábamos en Steam para aquellos que quisieran votarnos.

Los temas tratados durante estos días fueron de vital información. Me hubiera gustado haber tenido más tiempo para destinarle.

En resumidas cuentas lo que vi, fue:

  • Los chicos de dedalord contaron su historia con los juegos y su amplia experiencia en análisis de datos
  • De Pixowl nos dijeron su experiencia con BulkyPix (publisher de Reversion) y cómo es que su juego se construyó, se ideó y logró comercializarse de la forma en que lo hace.
  • hubo una interesante charla sobre musicalización en juegos
  • Interfaces Humanas, ‘más allá del pulgar’, donde @tembachi nos contó que vincula artes clásicas para la producción de videojuegos

He de confesar que varias charlas me parecieron sumamente interesantes algunas técnicas y otras comerciales, pero todas con algo de gracia. Esperaba que fuera puro chamuyo me llevé una agradable sorpresa.

Vean las algunas fotos del evento, aquí.

Compilando boost para soportar i386 y x86_64 (y PowerPC) en Mac

Queremos compilar el wmelite para MacOS en vísperas del lanzamiento para MacOS de Reversion. Así es que hoy me encuentro desafiando la gravedad o tal vez estoy directamente en una verdadera Odisea luchando contra una raza que parecería ser extraterrestre (desvarié un poco, lo se).

La cosa es sencilla, una vez que uno entiende lo que tiene que hacer (gran desafío diría mi analista), en el momento que estoy escribiendo esto la última estable era la 1.51.

  • Descargar el código fuente (que es super flexible y viene muy preparado)
  • Compilar combinado una arquitectura (x86_64), después la otra (i386)
  • Verificarlas usando lipo
# compilar
./b2 link=static threading=multi toolset=darwin \
architecture=x86 target-os=darwin address-model=32_64 \
stage --with-system --with-filesystem

# verificar que se generó bien
lipo -info stage/lib/libboost_filesystem.a

# resultado esperado:
Architectures in the fat file: stage/lib/libboost_filesystem.a are: i386 x86_64

Yo quería:

  • estáticas (porque sólo necesitaba los .a y no los .dylib)
  • soporte multi-threading
  • sistema operativo basado en darwin (MacOS)
  • arquitecturas combinadas x86 y modelo de direcciones 32/64
  • las librerías system y filesystem

Recuerden que adentro del directorio boost estarán los hpp para incluirlos en cualquiera de nuestros proyectos.
Esta información está basada en esto.

3f participa en el evento de Zebra ISV (Santiago de Chile)

Así como lo cuentan, el último jueves (18 de octubre), desde 3f hicimos una pequeña visita a nuestro país vecino de Chile, específicamente en la zona de Providencia (en Santiago) para un evento que realizó Scan Source, uno de los principales distribuidores de Zebra, invitando a diferentes vendedores de productos.

¿El objetivo? proporcionar un contexto de integración y networking donde los diferentes desarrolladores de soluciones (software) puedan conocer vendedores de hardware y así establecer alianzas para, claro, vender más dispositivos Zebra.

Nuestro objetivo desde 3f fue dar a conocer nuestra plataforma de servicios, algunos casos de éxito y nuestra nueva división, 3f interactivo, para complementar las ofertas del resto de los participantes. Creo que fue un interesante evento, sobre todo porque tenía una orientación poco habitual para nosotros.

Aquí el Prezi que usamos para la presentación. (Estoy en la búsqueda de fotos para acompañar esta publicación, pero aún no tuve novedades)

SD no detectada en laptop Dell usando Linux

Realmente no sucede solo con las computadoras Dell, sino con aquellas computadoras que tienen un chip JMicron como lector de tarjetas SDHC

El problema es que al insertar una tarjeta de memoria SD (como las que usan las camara de fotos) no es detectada.. pero esto solo sucede con Linux, porque en Windows funciona bien!.

Tal vez incluso se dieron cuenta que si prenden la computadora con una tarjeta de memoria insertada, funciona correctamente. El problema es únicamente cuando se prende la pc sin tarjeta de memoria.

Honestamente no se bien los motivos técnico, tiene algo que ver el bus y el hotplug, pero muy bien no lo se, lo que si se es como temporalmente solucionarlo.

El workarround es forzar a un re-scaneo del bus PCI con una tarjeta de memoria insertada. De esta forma lo detectará bien y comenzará a funcionar correctamente hasta que se reinicie la computadora al menos…

Los pasos para poder leer la tarjeta de memoria son:

  1. Insertar un SD en el slot
  2. Si no soy administrador, serlo… sudo su
  3. Forzar el re-scan echo 1 > /sys/bus/pci/rescan

Despues de esos pasos ya deberían poder leer cualquier SD soportada.

ORMLite, Caché, obtención de 10k+ registros en Android

En los últimos meses estuvimos desarrollando una aplicación clásica de gestión de pedidos.

En una conferencia que tuvimos el día de hoy, nos surgió una duda sobre la flexibilidad de SQLite a a hora de contener muchos registros en base de datos. Nuestra filosofía al respecto siempre ha sido la misma: “Aún no tenemos el problema… No nos preocupemos” sin embargo, siguiendo el principio de “la curiosidad mató al gato” nos pusimos a buscar algo de información.

Pareciera mentira… Nos encontramos con un debate (muy interesante, debo agregar) donde se plantea este problema. El conector de SQLite para Android, no soporta resultados que contengan más de 1 megabyte de información (cosa que sería bastante fácil de conseguir si tenemos más de 10.000 registros, por ejemplo). Lo que llama muchísimo la atención es que terminaríamos creando un ciclo para cargar la información porque claramente los dispositivos móviles Android hoy en día tienen muchísima memoria para ocupar 🙂

http://stackoverflow.com/questions/1407442/android-sqlite-and-huge-data-sets

También es anecdótico que, según comentan en el link, el iPhone no tienen ningún problema con la misma cantidad de registros