23 feb
2014

Tips para arreglar problemas de spam en envio de emails

Mencione alguna vez que ODIO los sistemas de email? Ironicamente es algo que parece sencillo en el uso de todos los dias, pero que en la parte tecnica de implementacion (desde la instalacion de servidores al uso de los mismos desde el codigo de alguna app) puede ser una tortura. Y esto se debe a que un servidor de email, se basa en un monton de programas, demonios, protocolos independientes que dependen e interaccionan entre si. Hace tiempo que la unica configuracion para servidores que uso es postfix (como MTA) + amavis + clamav (spam + antivirus) + courier ( servidor cliente pop/imap) usando mysql para guardas todos los aliases, etc..

En base a mi experiencia, quiero darles algunos tips para que les sea la vida mas facil y no gasten tanto tiempo en la prueba y error.

1) Verifica que el servidor no sea un Open Relay

Open Relay se le llama a los servidores de email que no estan bien protegidos, y que por lo tanto, cualquiera puede enviar emails a travez de el, este o no authorizado. dependiendo el sistema usado, varian las configuraciones, pero en postfix, hay que prestar atencion a el metodo de authenticacion usado (usualmente SASL) y ademas del parametro smtpd_recipient_restrictions

2) Chequea que el DNS para el dominio este bien configurado

Los sistemas de email dependen muchisimo de los registros de DNS para verificar si este viene de una fuente confiable o no. Por lo tanto, no solo deben existir y estar bien configurados los registros MX, sino tambien, deben estar los registros PTR (para el reverse DNS), los SPF (habilitando la ip del servidor de email para el envio de los mismos con el dominio, muy usado por gmail).

3) Envia los headers y en la forma adecuada

Si estamos enviando emails desde una app manualmente (por ejemplo, usando la funcion mail() de php) es importante mandar las headers correspondientes y formatear el email tambien como corresponde. Yo usualmente envio emails solo en formato html, aunque es una buena practica enviar tambien la copia en txt plano. Plus, debemos enviar las siguientes headers al enviar el email:

1
2
3
4
5
6
MIME-Version: 1.0\n
Content-type: text/html; charset=iso-8859-1\n
To: $toName <$toEmail>\n

From: $fromName <$fromEmail>\n
Return-Path: $fromName <$fromEmail>\n

el \n o \r\n (a mi el \n siempre me funciono, otros dicen que deberia ser \r\n pero no hay una postura concreta) en siempre necesario (acuerdensen de ponerlo en comillas dobles en lenguajes como php !). Tambien, el destinatario lo ponemos en php como primer parametro, este debe tambien tener el formato como en los headers (si no tenemos el nombre, igualmente debemos pasar el email con los brackets).

4) Probar con otro servidor de email como recipiente y elevar el nivel de detalle de los logs para diagnosticar el problema

Hace poco de casualidad descubri un metodo efectivo para diagnosticar problemas complejos. Movi un servidor a otro proveedor, y me di cuenta que enviando mails a otro servidor que tambien es de mi propiedad, estos eran filtrados como spam. Extraniado, abri uno de los arhivos de configuracion de amavis y eleve el log level a 5 ( se abre /etc/amavis/conf.d/20-debian_defaults y se agrega la linea: log_level = 5 ). Esto aumenta exponencialmente la cantidad de informacion, pero lo que mas nos interesa, es la parte donde desglosa como fue compuesto el puntaje final del email para saber si es spam o no. Usen su editor favorito y busquen en los logs por:

1
BAYES_99

eso les va a mostrar una linea parecida a:

1
[BAYES_99=3.5, HTML_MESSAGE=0.001, HTML_MIME_NO_HTML_TAG=0.377, MIME_HTML_ONLY=0.723, RCVD_IN_DNSWL_BLOCKED=0.001, RDNS_NONE=0.793, SPF_PASS=-0.001, TO_NO_BRKTS_NORDNS=2.996]

Estos son mensages de debug de los developers, que detallan las fallas y sus puntajes. cuantos mas podamos eliminar, mejor. muchos son muy descriptivos ( HTML_MIME_NO_HTML_TAG) pero estas aquellos como:

RDNS_NONE = No se encontro el registro de reverse dns para el dominio

TO_NO_BRKTS_NORDNS = Ademas de no encontrarse el registro de reverse dns, el TO no tenia el formato adecuado al no llevar brackets.

Conclusion

Estos son algunos de los errores mas comunes, espero que les sirva de algo, y les recomiendo usar tools como MXToolBox que son muy utiles para diagnosticar estos y otros problemas.

 

 

3 dic
2013

Programando con Starling #2

starling-img

 

Otra tanda de tips para programar en starling, hoy mas enfocado en fonts :D

1) mejora el rendimiento seteando TextField.batchable = true

Si la version de starling que tenes es mas o menos 2 meses vieja, no podes ver esta propiedad, asi que antes que nada, actualiza a la ultima version. Despues de ello, si seteas la propiedad batchable en las instancias que tengas de TextField, mejorara el rendimiento del juego.

2) mejora el rendimiento seteando $elem.touchable =false cuando no se necesite

 Si creas elementos en pantalla, que no requieren de escuchar eventos, es oportuno setear la propiedad touchable en false para aportar a no usar tantos recursos.

3) Siempre que se pueda, usar BitmapFonts

Siempre es mejor, para mostrar texto, usar BitmapFonts, basicamente por que requiere de muchisimo menos recursos para el procesamiento. Para generar una bitmap font a partir de una font normal, yo uso BMFont un programa bastante util, que permite definir el tamanio de letra, el formato a guardar, el tamanio del atlas generado y el fondo por default.  El lado malo de una bitmap font, es que hay un limite en lo grande y chico que se puede renderizar la el texto en la app a partir del tamanio con el que se genero el atlas. Tambien, una vez generado el atlas de la fuente, puede ser incluido en un AtlasTexture para asi cargarla junto con los demas recursos. El uso en codigo de una bitmap font es el siguiente:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
//incluimos el xml del font atlas

[Embed(source="../../../../asset/normal/mfont.fnt", mimeType="application/octet-stream")]
public static const MFontXML:Class;

//la imagen atlas con la font (si lo incluyeron en otro atlas, puede obviar este paso)
[Embed(source="../../../../asset/normal/mfont_0.png")]
public static const MFontTexture:Class;

//registramos la fuente

var textureFont:Texture = Texture.fromBitmap(new MFontTexture());
var xmlFont:XML = XML(new MFontXML());
TextField.registerBitmapFont(new BitmapFont(textureFont, xmlFont));

//y la usamos en el TextField

bPlay.fontName = generalFont; //aca deben pasar el nombre de la fuente original, lo pueden encontrar en el archivo .fnt en el attributo "face"

4) Cuidado con la carga y generacion de assets, congela el UI thread !

Esto me hizo acordar a la estructura de programacion de android. Ahi, tenes 2 thread, el UI thread y el processing, donde se hacen la mayoria de las operaciones, asi, en el UI thread se pueden realizar operaciones del tipo loading para una mejor experiencia de usuario. En AIR/starling, me encontre con la sorpresa, en mobile devices, que cuando se esta haciendo la carga de los assets (cuando se inicializa el TextureAtlas) o se genera visualmente un “freeze” de cualquier animacion de loading que tengas corriendo hasta que se termine la generacion de la pantalla. Este tiempo puede variar obviamente entre las capacidades de los dispositivos, y en low end, puede ser de varios segundos, lo que puede afectar a la experiencia de usuario (lo peor, que piense que la app crasheo, y deje de usarla !). Aca no hay mucho para hacer a nivel tecnico, mas que un poco de ingenio. Particularmente, lo que hice fue cargar una pantalla simple, con un background y un loading, y utilize un efecto de contenido-blanco-contenido (un fade) que se ejecuta cuando los assets se cargaron. De esa manera, el usuario sabe que la app esta cargando, y con el efecto, tiene una transicion gradual que lo hace agradable para el usuario.

 

26 sep
2013

Tips para trabajar a distancia/work at home/teletrabajo

Y no, no es tan asi tampoco pero bue

Y no, no es tan asi tampoco pero bue

Toda mi vida profesional en IT, como dev, la hice desde mi casa. Nunca he trabajado desde una oficina, ni nunca hice un CV (en realidad, nunca hice un CV en mi vida, ni siquiera para trabajos que no eran dentro de IT, pero ese es otro tema). No digo que esto sea bueno o malo en si mismo, pero despues de mas de 7 anios trabajando desde casa, desde los 2 lados, como empleado y empleador, asi que puedo ofrecerles algunos consejos y tips.

Un gran poder viene con una gran responsabilidad

Trabajar desde tu casa tiene muchas ventajas, especialmente la libertad. Aunque tengas un empleador fijo a distancia y tengas que cumplir un horario, tenes la libertad de tener todo lo tuyo al alcanze de la mano. Ahora, al mismo tiempo, eso es una gran fuente de distraccion, por eso mismo, el tener una disciplina, evita que el nivel de procastinacion se eleve a niveles exponenciales. Estando en tu casa siempre esta la excusa de arreglar algo, o mirar algo viejo, y la distraccion se lleva todo el dia que deberia haber sido productivo.

El trabajo remoto es ideal para una startup pero no para todos

La industria IT en general es ideal para el work at home, basicamente por que como normalmente trabajamos sobre entornos y productos virtuales, siempre que tengamos una conexion a internet, podriamos hacerlo desde cualquier lugar. Para una startup, poder trabajar de manera remota es una gran ventaja, se ahorran tiempos y costos al no tener traslados ni una locacion fisica en comun que mantener. Ahora, a no todas las empresas o startups es conveniente el trabajo remoto, y esto debe decidirse sobre 2 premisas:

  • Tipo de projecto: El tipo de projecto en el que se esta trabajando tiene mucho que ver si se puede o no trabajar de manera remota. Si hay un componente de seguridad o materiales fisicos (como plaquetas o dev kits) es necesario hacerlo de manera conjunta en un lugar fisico comun
  • Etapa de desarrollo o tipo de cadena de mando: La manera mas eficiente en la cual el trabajo remoto da frutos es cuando la cadena de mando de la empresa es de tipo piramidal, donde no mas de 2 personas son las que toman las decisiones finales de un projecto. Ademas, debe iniciarse cuando la etapa de disenio inicial del projecto ya esta incluida. Definir caracteristicas de un projecto de manera remota es uno de los errores mas comunes, no son tipos de discusiones y decisiones que se puedan hacer ni de manera correcta ni de manera agil sin los miembros reunidos fisicamente en el mismo lugar

Es muy dificil coordinar un equipo de trabajo remoto para outsourcing

Una gran mayoria de empresas de tecnologia o consultoras, trabajan haciendo outsourcing, osea, creando software para terceros. Por experiencia propia, puedo decir que es extremadamente dificil coordinar un grupo de trabajo que trabaje para terceros. Hay excepciones por supuesto, si los projectos son a largo plazo (+ 6 meses) o son sobre un nicho en especial (como por ejemplo, digamos que todos los projectos de los clientes son de markup html/css). El problema mas grave, es que en muchas ocasiones, el que toma las decisiones finales es el cliente, esto ya de por si es un gran cuello de botella en el avance de un projecto, si a esto le sumamos el retraso de coordinar el equipo y el cambiar de tipo de proyecto con cada nuevo cliente, la cantidad de retraso en completar cada tarea, crece de manera exponencial.

Muchas herramientas, pero hay que quedarse con las mas simples y comodas

Hay miles de herramientas para coordinar un grupo de trabajo. Mobiles, web, desktop, de un color, de otro etc.. pero idealmente, hay que quedarse con la que mas uno se sienta comodo, y agregar al workflow la menor cantidad posible de ellas. Yo normalmente solo trabajo con un manejador de tarea (tipo trello o clockingit) para saber que esta haciendo cada uno, y a lo mucho, teamviewer para poder replicar bugs o revisar trabajo remoto en el escritorio de algun colaborador. Mas herramientas no quiere decir mas productividad, sino todo lo contrario.

Instrucciones claras y siempre hay que estar abierto a consultas

Trabajar de manera remota, es a veces como el telefono descompuesto. Muchas cosas que queremos explicar, se tergiversan o se mal entienden. Como manager o coordinador del grupo de trabajo, hay que tomarse el tiempo de ser lo mas explicitos y claros posibles al designar las tareas necesarias a los colaboradores. Para un dev, ejemplos de codigos o locaciones reales a donde deben crearse o donde esta X codigo es una gran ayuda para que el otro realize la tarea lo mas rapido posible. En el caso de tareas visuales, como disenio o illustracion, ejemplos de otras illustraciones parecidas o editarlas de manera rustica pero que ejemplifiquen nuestro pedido, es la unica manera de lograr que el artista nos entregue lo esperado.

Paciencia, mucha

Una parte fundamental, no importa de que lado estes, es la paciencia. Como manager, vas a tener contratistas que van a desaparecer, o hasta empleados fijos que lo hagan, problemas de conexion, programas que no funcionen, malentendidos, diferentes horarios, etc.. Y como empleado, lo mismo, pero del otro lado, como instrucciones poco detalladas, esperando respuesta del cliente etc.. En esta industria en general, hay que tener paciencia, pero es seguro, que aunque tiene muchas ventajas, el trabajar de manera remota requiere de una cuota extra.

Conclusion

Hoy toda la tecnologia nos la oportunidad de conectarnos de manera increible desde cualquier lugar del mundo, con herramientas que transformaron la forma en la cual no solo nos comunicamos, vivimos, sino tambien trabajamos. Pero tambien, hay que ser conciente de que estas herramientas tambien requieren que nos adaptemos a ellas, socialmente y proceduralmente hablando.

 

25 sep
2013

Programando con Starling #1

 

 

starling-img

 

 

OpenFL/NME me encanta, no voy a mentir, pero aunque su performance es buena y util para muchas cosas, a veces hay que sacrificar lo que a uno le gusta en pos de poder llevar adelante un proyecto. En este caso, estoy con un social game, que requiere la integracion de muchas API’s de terceros (principalmente de FB) y para esto, tenia que escribir extensiones nativas manualmente, lo que me llevaria semanas en android y en caso de iOS, directamente no podria, por mi experiencia con C# es nula. En esta situacion, pase a usar Starling, que es basicamente un framework pasa AS3, compatible con AIR, por lo cual, podemos compilar un swf y ademas empaquetarlo para android (en un APK) e iOS (IPA). Lo bueno es que existen muchas ANE (air native extensions) para todo tipo de API, hasta muchos API providers ofrecen estas ANE listas para usar, asi que me iba a ahorrar muchisimo trabajo para poder concentrarme en el game que es lo mas importante. En el camino, aprendi algunas cosas que estan perdidas por la net, asi que voy a pasar a comentar algunas, por si a alguien le sirve.

Actualiza el Adobe AIR SDK a 3.7 o mas !

Esto es importante, mas si se pretende compilar a android, las versiones iguales o mayores a 3.7 del AIR SDK, cuando empaquetan el APK, incluyen el runtime de AIR, por lo tanto, el usuario final no necesita bajar el runtime por separado. Esto ahora lo hace por default, lo que va a hacer que tu app pese mas (alrededor de 10MB por lo menos el APK y 30MB en el sistema instalado) pero es una gran ventaja para que el usuario no necesite nada externo para correr tu aplicacion (lo que a veces hace perder instalaciones/usuarios). Pueden bajar de aqui y para instalarlo es muy simple, descomprimen, y copian todo el contenido dentro de donde tienen instalado el Flex SDK (en el caso de que se lo instalaran con FlashDevelop, la ruta es: C://Archivos de programa (x86)/FlashDevelop/Tools/flexsdk) les v a a preguntar si quieren re-escribir los archivos, le ponen si a todo, y listo.

Los assets deben estar siempre que se puede, en Sprite sheets power of two (de 1024×1024, no mas !)

Starling no usa la clasica display list de flash para mostrar el contenido, sino que usa el nuevo Stage3D de flash. Esto quiere decir, que lo que vemos no son simples bitmaps, sino cuadrados planos 3D con una textura encima. Esto le da una gran mejora de rendimiento en mobile, pero al mismo tiempo, hay que tener ciertas consideraciones. Basicamente lo ideal, es agrupar el arte de nuestro juego en spritesheets y cargarlos con la clase TextureAtlas que provee starling para esto. Les aseguro que es una gran mejora de rendimiento, aunque la textura tenga espacios en blanco, aun asi, es mucho mas rapido y menos costoso a nivel de procesamiento. Algo importante, es que la textura debe ser por power of two, de no mas de 1024×1024,  mucha info en internet recomienda usar 2048×2048, pero muchos dispositivos android y viejos de iOS, no pueden manejar texturas tan grandes, asi que mejor ir por lo seguro.

No se pueden pasar texturas a bitmaps

Parece obvio (o no) pero es algo a tener en cuenta. Si se carga un TextureAtlas, lo que te va a devolver, son texturas. Ahora, si pensas manipular eso a nivel de bitmap, se te va a hacer imposible, ya que no se puede convertir una textura a un bitmap. En el caso de que necesites modificarlo, la unica que queda es cargarlo de la vieja forma, con la tag [Embed] con el costo de procesamiento que esto lleva, si la imagen es muy grande.

Texture.repeat no funciona asi nomas, y no siempre conviene

Todas las texturas tiene una propiedad que se llama repeat esta *teoricamente* haria que se repitiera en todo el espacio de tu Image ponele. Pues no es tan asi. Para que funcione, la textura debe ser power of two primero, y ademas, debe no venir de un atlas, sino debe ser cargada individualmente (por medio de [Embed]). En caso de que debas repetir un fondo miles de veces, osea, con una imagen muy chica, por ahi tiene sentido. Pero si tu fondo es grande, y tu imagen a repetir tambien lo es (y normalmente esto es cargado cuando hacemos algun tipo de scroll, por lo tanto, si existiese algun delay en la carga del ususario u un congelamiento de la app, afectaria la experiencia del usuario), es preferible cargarla en un TextureAtlas, y de ahi en mas, crear Image() para ir cubriendo toda la superficie necesaria. Yo lo hice con un mapa de 10.000 pixeles de height sin problemas, asi que lo recomiendo (aunque se puede, tampoco recomiendo cargar una cantidad asi de fondo de una sola vez, son errores que se pagan a la larga).

Lineas blancas/colores de fondo entre elementos al moverlos

Esto es bastante estupido, y por ahi te hace perder tiempo buscando complicadas soluciones cuando es mas facil de lo que parece. Cuando hacemos scroll, o movemos elementos en pantalla, es posible que en la transcicion de estos, se vean lineas blancas o los colores de fondo. Esto sucede por que la posicion que le estas asignando al elemento, sea en X o en Y, no es entera. Osea, asegurate que todas las posiciones que calcules de los elementos, al moverlos, sean enteras (facilmente arreglable con Math.ceil o Math.floor cualquiera sea el caso).

Esto es todo por ahora, tengo mas para postear y algunos archivos utiles tambien para hacer deploy mas facil, pero sera en otra entrega !

 

22 sep
2013

Expectativas VS realidad en el oficio del programador

Hoy creo que era un buen dia para sacar un post reflexivo sobre la realidad de lo que es trabajar como programador dia a dia. No solamente para dar un panorama real para aquellos que recien estan estudiando o recien empiezan (o quieren hacerlo) su vida profesional en este rubro, sino tambien por que no, plantear una discusion de como podemos mejorar el workflow de trabajo en nuestro entorno para hacerlo mas dinamico, productivo, agil y eficiente.

Perspectiva Laboral

La razon por la que uno se inicia en esta profesion son muy variadas, desde aquellos que lo hacen por la emocion de resolver problemas, otros por que es una herramienta para crear cosas, y otros simplemente por dinero. Creo que todos tenemos un porcentaje de estas razones, en alguna u otra medida. Pero desde esa razon, probablemente armamos la idealizacion de como queremos que sea nuestro futuro programando para una empresa o por que no, en nuestro pequenio emprendimiento. En la mayoria de los casos, la realidad dista mucho de nuestra idealizacion, veamos algunos casos:

Trabajar para una gran empresa

Tradicionalmente ser contratado por una gran empresa, es siempre un gran orgullo. Normalmente viene acompaniado por una paga, horas fijas, y una tarea a realizar en una empresa de prestigio. Bueno, eso es por lo menos lo que te presentan los de RRHH. La realidad es que para una empresa grande, sos solo un numero, y depende cual sea, puede ser que seas menos que un numero, lo que usualmente afecta directamente en cuanto te pagan. Pensas en que vas a trabajar en projectos de gran embergadura del core de la empresa? no, vas a estar parcheando alguna libreria suelta de alguna app vieja que usan 20 clientes que no quieren actualizar sus sistemas y habra pasado ya por 400 programadores anteriormente. Vas a depender de un manager que te va a usar esas metodologias agiles y la palabra mas usada en todo su vocabulario es scrum. Obviamente, tenes que hacer lo que el quiera, aunque sea tecnicamente un pecado mortal, simplemente por que “arregla el problema”. Probablemente lo unico mas pasable, son las horas que usualmente no se exceden de lo legal, y hasta pueden usarse para cursos y capacitacion, que probablemente te resulten mucho mas interesante que tu propio trabajo en si.

Trabajar para una startup

Huy, que cool, me uni a una empresa que va a cambiar X industria, que tiene 20 millones de dolares de funding de un fondo X y ya los mencionaron en una nota junto con otras mas que hacian los mismo en techcrunch asi que seguro vamos a rockearla en grande, ademas tenemos horarios flexibles, tenemos coca cola y papa fritas sin limites,  y unos pinballs, re cool. Pues no, pueden haber recibido 20M de funding, pero probablemente no te esten pagando lo que corresponde, mas que nada, por que lo del horario flexible, las papas fritas y las diversiones, son solo sutiles tentaciones para que puedas aguantar las 12-14-16 horas que pasas en la oficina cuando te estan pagando 6-8 horas nomas. Obviamente, la excusa de que estas creando algo “nuevo” y “genial”  y estas “resolviendo problemas reales” son los motivantes diarios para que sigas en esa nube de ilusiones. Lo peor de todo, es que te dejaste la vida 6 meses-1 anio o mas. y un dia te dice “bueno muchachos, no hay mas plata, a sus casas” y anda a reclamarle el dinero al inversor que retiro su apoyo, osea tu sueldo, y al management que no vio que el projecto era comercialmente inviable.

Tu propia startup

Voy a hacer mi propia compania, asi puedo quedarme programando todo el dia haciendo cosas locas, revolucionarias  y re divertidas. Y esto probablemente es el caso mas alejado de la realidad posible. Un programador que inicia una startup y no tiene conocimientos y una minima experiencia en negocios, es probablemente la peor decision posible. El caso es que tu idealizacion de “solo programar todo el dia”  no va a estar cerca por nada del mundo. Si tu meta es buscar funding, te vas a pasar los meses presentando tu projecto a inversores que no te van a dar ningun feedback y no vas a poder corregir desde su experiencia que del proyecto esta mal ( o de tu presentacion del mismo, idea/ejecucion son cosas separadas y tienen gran impacto en la decision final del inversor) y si por ahi, con suerte y practica, conseguis un inversor, ya tu emprendimiento no es tuyo solamente y seguramente has tenido que ceder el poder decidir libremente en que proyecto trabajar. Ahora, si vas por el camino de iniciarte de 0, sin inversion, con lo minimo, si, vas a programar un poco, hasta que te encuentres que tenes que hacer marketing de tu producto, que tu producto requiere de una interaccion del usuario, por lo que requiere un disenio que por tu bajo presupuesto vas a intentar hacerlo vos, y si aun asi, cometes el error de vender el producto con el, vas a reconocer la mediocricidad con el casi nulo numero de ventas. Si elegis contratar gente, vas a tener que de cualquier manera, mantener tus costos al minimo, por lo cual, la “experiencia del usuario” va a tener que estar pensada por vos, para que solo contrates un diseniador/artista (hay muy poco diseniador con exp en UX/UI que esten dentro del presupuesto de una startup sin funding). Ahi ya entras en conceptos totalmente ajenos a la programacion, experiencia de usuario, marketing, como llegar a tu target de clientes, soporte etc.. Ya dejaste de programar para ocuparte de 5 areas totalmente distintas.

Generalidades si, pero hacen honor a su nombre

Entiendo que todo lo explicado anteriormente son generalidades, y que no sucede en todos lados, pero la realidad, es que sucede en la mayoria de los casos, es bueno decirlo, y explicarlo, para aquel que busca cualquiera de las 3 opciones pueda elegir conciente y no se pegue un viaje que puede no tener retorno.

Perspectivas tecnicas

Esto es algo a lo que queria llegar, y a lo que creo tiene mas margen de discusion y de mejora a nuestro actual estado. El trabajo del programador es escribir codigo, este codigo son basicamente instrucciones escritas en un lenguaje especial, para que puedan ser entendidas por la unidad computacional para realizar estas acciones. Ironicamente, en vez de facilitar esta barrera comunicacional entre la maquina y el humano, el programador en muchos casos lo hace cada vez mas dificil, influenciado por factores externos como la competencia, el mercado, el costo etc..

No vengo a criticar a los lenguajes de bajo nivel (asm, c++,c etc…) sino justamente lo contrario, mi rant viene a los de alto nivel. Su proposito es proveer de una capa de abstraccion que haga que el desarrollo se produzca de manera mas agil, y facil, ya que hay que ser sincero, el ultimo objetivo del programador es crear una rutina/programa etc.. que cumpla un objetivo/funcion, no perder tiempo con la mania de tal o cual framework. Ejemplos claros esta las implementaciones de flash por ejemplo, ya hice algunos posts al respecto, pero tambien hay ejemplos open source como pueden ser cosas de javascript, la fragmentacion de apis en android y etc.. Errores estupidos que nos llevan horas y hasta dias en arreglar cuando podian ser invertidos en el realizamiento del proyecto en si.

Y como podemos mejorar nuestra calidad tecnica (y por que no, a largo plazo, laboral)?

Hay algo que los devs no se dan cuenta de el gran poder de influencia que tienen una sociedad que hoy dia esta mundialmente informatizada. Todo paso por un dev, desde el timer de tu horno electrico, hasta tu sistema operativo de tu PC o de un telefono. Creo que estupidamente, teniendo un gran poder de influencia, nos dejamos llevar por lo que nos dice el mercado, que aunque es un gran hacedor de decisiones, creo que esta tomando mas de las que deberia. De cualquier manera, el open source es un gran camino para impulsar estandares que nos haga el dia a dia mas facil, y aunque creo que de cualquier manera el open source no es la solucion de todo (justamente por una influencia del mercado, no todo el software es sustentable via open source). Pero creo que podemos seguir llevando innovacion que va a ser implementada por soluciones closed source con las que tengamos que interactuar, y creo que si las licencias abiertas pudieras incluir alguna clausula para que ese codigo sea solo usado si se siguen ciertos estandares y nosotros como devs seamos veedores que eso se cumpla, por ahi podamos mejorar nuestro ecosistema en todo sentido.

Hay que decirle adios al odio en las comunidades

Esto no es nuevo, siempre hay ganas de trollear a otro en una comunidad. En las devs es aun mas violento, y muchas veces producen crispaciones que detenienen el avance de la innovacion. Un ejemplo muy reciente pueden ver aca:  http://forum.starling-framework.org/topic/what-are-the-real-chances-of-crashes-of-a-game-done-with-starlingair en resumen, como era nuevo usando AIR con mobile, queria saber que posibilidades de crashes inesperados habia en comparacion con otras soluciones (tipo openFL o unity), hasta linkeo un bug report al respecto. Recibo la contestacion de un usuario que el problema soy y yo no AIR O_O. Entiendo que las malas practicas de los devs pueden llevar a que una app crashee si no se tienen medidas de seguridad, mas en entornos limitados como mobiles (cosa que aclare en el hilo) pero teniendo en cuenta que estamos corriendo codigo en una sub runtime, echa por adobe, que seamos sinceros, no hacen las mejores runtime del mundo, era algo que necesitaba aclarar, y lo que recibo es agresion. Este tipo de acciones, aleja nuevos devs, y retrae de la participacion colectiva, la que trae los mayores beneficios a todos a largo plazo, a los devs experimentados. Justamente una de las mayores razones por la cuales DevNod fue creado, es para ofrecer un lugar sin odio, sin ataques, sin discusiones vacias. De cualquier manera he visto que este tema se esta hablando en varias comunidades y hasta conferencias, asi que espero que sea un movimiento que progrese.

En fin, es un domingo de reflexiones, obviamente siempre estoy dispuesto al debate, pueden pasar por el foro o dejar un comentario aqui debajo.

Regards.

 

 

19 sep
2013

Drivers y adb especial para tablets RK_30XX

Hace poco adquiri una nueva tablet para el testeo de aplicaciones de android (basicamente necesita una mas para hacer user testing, ademas de la vieja coby que ya tenia) no busque mucho, pero encontre una oportunidad para una nueva, economica, dual core llamada TITAN 7023 (PC7023ME) basicamente basada en rockchip, con un A10. viene con android 4.1, con pantalla multitouch y la verdad, es muy fluida. El problema vino al querer desarrollar con ella. Los que algo han intentado hacer algo en android, han pasado las penurias de los drivers ADB. Los que google incluye en el SDK rara vez funcionan, y normalmente hay que depender de un third party (como el pda net por ejemplo, uno de los que mejor funcionan). En este caso, no me andaba de ninguna manera. Ahora, despues de buscar, encontre una guia para rootear el dispositivo, y baje un exe que teoricamente instalaba el driver. Esto funciono, ya que ahora el dispositivo era reconocido (hasta por pda net) pero con adb no habia caso, no listaba el dispositivo. Despues de seguir buscando una solucion, ahora mas que nada por el chipset (en mi caso, un RK_3066) encontre este driver, que funciono a la perfeccion, Y una version modificada de ADB y sus ddl, que funcionan perfecto con la tablet. Basicamente, despues de instalar los drivers con el administrador de dispositivos, deber ir a SDK_PATH/platform-tools/ ahi, hagan un backup de los archivos que tienen el mismo nombre de la carpeta tools en este zip, y copienlos ahi. Desde ahi, cualquier app que use ADB (monitor.exe, flashdevelop, eclipse etc..) va a poder conectarse a la tablet para realizar las operaciones.

Pueden bajar el zip con todos los archivos aqui:

Que tiene de especial este ADB? no tengo idea, pero por lo menos, funciona !

18 sep
2013

Loader() en flash no soporta redirecciones

No voy a empezar una flame war  sin flash esta muerto o no, etc.. todavia hay gente que programa en el (yo incluido) y aunque no lo parezca, este es un problema grave y bastante estupido. Bugs tan molestos y que requieren de soluciones totalmente rebuscadas por una sucesion de incompetencias, a veces me hace pensar que los programadores en el fondo tenemos algun tipo de gusto por el masoquismo… en fin, sin mas rant, vamos al problema:

Veamos en el escenario que quieren cargar una imagen, de un servidor externo, este tiene un crossdomain.xml que se los permite, asi que usan Loader() para hacerlo. Si la url es la directa y final a la imagen (tipo, www.example.com/imagen.jpg) esto no les va a causar ningun problema, pero normalmente, en sitios grandes (ejem, facebook) las url son relativas, pasan por CDN que les entrega la URL final donde esta el archivo. Osea, reciben un header con un codigo 302 (redireccion permanente) y voila, carga de la imagen. Bueno, en flash, web version (el clasico swf) esto no funciona, simplemente se queda trabado ya que no entiende la redireccion. A esto, veamos las posibles soluciones:

1) Usar URLLoader

Flash, tiene otra clase, para la carga de datos externos, que se llama URLLoader. Esta SI *teoricamente* puede manejar redirecciones, y teoricamente tambien, puede cargar datos binarios. Asi que que hacemos? convertimos el output en ByteArray y se lo pasamos a un Loader.loadBytes() verdad? bueno, esto NO FUNCIONA. Mismo final que con Loader.load(), simplemente no hace nada

2) usar JS para determinar la URL real y pasarsela al flash

No tenemos control del servidor remoto, pero si del cliente, donde carga el flash, asi que lo ideal, seria usar Javascript, con ExternalInterface, le pasamos la url real y lesto no? NO? NO. No importa lo que intentes. Si haces una llamada de ajax a la URL, la redireccion es manejada por el browser, por lo que desde JS, no obtenes NINGUN TIPO DE HEADER 302 asi que es imposible determinar la url final. Otra que intente fue la del iframe, pero claro, las restricciones de dominios, que son diferentes, no te permiten tampoco acceder a la URL que el usuario esta viendo (y el src, siempre va a reportar la URL relativa que le pusiste para iniciarlo).

3) Usar un servidor externo con algun lenguaje de servidor (node, php etc..) para determinar la URL final

Y llegamos al ganador seniores, la solucion mas rebuscada, consumidora de recursos y estupida, es la unica que funciona ! En node.js usando request es algo asi:

1
2
3
request("www.example.com/url-relativa",function (error, response, body) {
res.end(response.request.uri.href);
});

Asi que, simplemente para poder soportar un 302 en flash, requiere de una implementacion externa, que consume recursos en un servidor (si, por ahi no es mucho, pero multipliquenlo por miles de request, son recursos gastados inutilmente). por suerte, esto solo afecta a la version web de flash. Si compilan con AIR o con OpenFL para android/ios/desktop, Loader() si entiende la redireccion y no hay que hacer nada mas. Increible no?

13 sep
2013

Decifrar signed_request pasado por FB API en nodejs

Recientemente tenia que integrar la API de Facebook en una aplicacion de Node.js. La ultima vez que hice algo con la API de FB fue hace mucho y creo que no fue mas que un simple login. Mirando toda la documentacion, me di cuenta que tenia que decifrar el signed_request pasado a la app por medio del canvas. Aunque hay ejemplos en PHP, por suerte encontre uno listo para usar en Node.js que anda de maravillas (no linkeo el gist por que sinceramente no lo tengo ni lo recuerdo, lo siento).

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
function parse_signed_request(signed_request, secret) {
encoded_data = signed_request.split('.',2);
// decode the data
sig = encoded_data[0];
json = base64url.decode(encoded_data[1]);
data = JSON.parse(json); // ERROR Occurs Here!

// check algorithm - not relevant to error
if (!data.algorithm || data.algorithm.toUpperCase() != 'HMAC-SHA256') {
console.error('Unknown algorithm. Expected HMAC-SHA256');
return null;
}

// check sig - not relevant to error
expected_sig = crypto.createHmac('sha256',secret).update(encoded_data[1]).digest('base64').replace(/\+/g,'-').replace(/\//g,'_').replace('=','');
if (sig !== expected_sig) {
console.error('Bad signed JSON Signature!');
return null;
}

return data;
}

basicamente le pasan a la funcion el signed_request y el secret de su app, y listo !. Este codigo requiere de los modulos crypto y base64url que los pueden instalar facilmente con npm :)

9 sep
2013

Cheerio: rapida y flexible implementacion de jquery para node.js

En entradas pasadas hablamos de sistemas de templates, como plates, para poder integrar en backend y frontend dentro de node.js la manipulacion de elementos HTML. Desgraciadamente en producccion, a largo plazo, plates no logro cumplir las expectativas, tenia diferentes bugs raros y habia muchas acciones simples que resultaban muy complejas de realizar. Por suerte al tiempo de buscar una alternativa llamada Cheerio una implementacion liviana, flexible y rapida de jquery especialmente echa para correrla del lado del servidor, osea, en node.js.

La instalacion de la libreria es mediante npm, como siempre ( npm install cheerio ) y la api es igual a jquery, con la mayoria de las funciones que se utilizan para la manipulacion del DOM, como son .attr(), .append() etc.. aca un ejemplo:

1
2
3
4
5
6
7
8
var cheerio = require('cheerio'),
$ = cheerio.load('<h2>Hello world</h2>');

$('h2.title').text('Hello there!');
$('h2').addClass('welcome');

$.html();
//=> <h2>Hello there!</h2>

como ven, es muy sencilla de usar, muy rapida y util cuando se deben manipular DOM del lado del servidor antes de mandarselo al usuario.

Pueden ver mas en el repositorio de github con toda la documentacion bien detallada.

 

8 sep
2013

Emuladores alternativos de android

Si desarrollaste alguna aplicacion de android alguna vez, seguramente te topaste con que el emulador de android que provee google es EXTREMADAMENTE LENTO. Yo tengo una PC de 6 nucleos AMD con 8gb de ram y una placa de video gama media, obviamente no me faltan recursos, asi y todo, simplemente usar el menu de cualquier version de android, le toma mas de 3-4 segundos realizar cualquier accion. Se que hay formas de que funcione mas rapido, como por ejemplo, configurandolo para que use la imagen del procesador intel x86, el tema es que esto depende de un addon de intel que obviamente no funciona en AMD, asi que la opcion en mi caso esta descartado. La solucion mas facil siempre es usar un dispositivo externo, las tablets y telefonos android son muy economicas, pero existe un ocasiones, en que hay que probar diferentes tipos de pantallas, ratios diferentes etc.. para estar seguros que todo esta en su lugar. En este caso, dependemos de un emulador, ya que no es factible para la mayoria tenes +10-20 devices con todos los tipos de pantallas disponibles. Asi que en esta busqueda, encontre lo siguiente:

logo_genymotion

 

Es bastante parecido al AVD que viene por default para manejar las imagenes de los dispositivos. Obviamente, miles de veces mas rapido. Tiene una buena variedad de imagenes para bajar e instalar, muchas parecidas a dispositivos reales (tipo nexus, samsung galaxy series etc…) y pesan +100MB cada una. Permite tambien cambiar el tipo de pantalla, su tamanio y su resolucion (dpi), rotar la pantalla etc…  A mi personalmente todavia no me sirvio, por que por alguna razon cualquier app echa en OpenFL directamente crashea al empezar. Por que sucede, no tengo idea, pero me imagino que sirve para la mayoria de los otros casos.

URL: http://www.genymotion.com/

brand-logo

Este es interesante, pero tambien, mas limitado que sus competidores. Parece mas una app con android adentro, ya que aca no hay imagenes virtuales ni nada parecido, es un solo tipo de pantalla, con una resolucion fija (tipo tablet) y te deja rotar la pantalla pero nada mas. Es rapido obviamente, y es muy plug and play, no tiene la interfaz comun de android, sino un launcher de aplicaciones que obviamente podemos instalar las nuestras. Es muy util para testeos rapidos, ya que la instalacion, inicializacion y testeo de una app es mas rapido que hacerlo en un device normal. Tambien tiene un uso de consumidor, probablemente pueda instalar casi cualquier apk y usarlo como si estuvieras en el celular (digamo whatsapp tal vez? )

URL: http://www.bluestacks.com/

 

Sigueme !

Follow Me! Follow Me! Follow Me!