27 sep
2014

Upload a Amazon S3 directo desde OpenFL / Haxe

openfl-logo

Hoy les tengo un post chiquito, mas anuncio que otra cosa. He liberado una libreria, que permite subir archivos directamente a S3 desde OpenFL (con ayuda de un servidor para calcular el acceso, permisos, etc..). Algo que resulto particularmente dificil, por que OpenFL no soporta correctamente por medio de Loader un request PUT, asi que los metodos tradicionales de subir archivos a S3, que usualmente son asi, no servian. Opte por “emular” una subida de archivos multiform/data como si fuera un form html, pero desde OpenFL.

El uso es basante sencillo, aca hay esta el ejemplo incluido en el repositorio:

1
2
3
4
5
6
7
8
9
10
11
var exampleImage:BitmapData = new BitmapData(800, 600, false, 0xff0000);
S3Utils.getPolicyS3(function(resultJson:Dynamic, args:Dynamic):Void {
S3Utils.uploadToAmazon(resultJson.url, { "key":"folderExample/${filename}", "AWSAccessKeyId":resultJson.uploadObj.s3Key, "acl":"public-read", "success_action_redirect":resultJson.uploadObj.s3Redirect, "policy":resultJson.uploadObj.s3PolicyBase64, "signature":resultJson.uploadObj.s3Signature }, S3Utils.getBytesArrayBitmap(exampleImage), "/folderExample/exampleImage.png", "image/png", function(result:Dynamic):Void {
statusTxt.text = "Uploaded !";
},function(failreason:Dynamic):Void {
statusTxt.text = "Failed Upload !";
});

},function(failReason:String):Void {
statusTxt.text = "Failed to get S3 Policy !";
});

Permite subir cualquier archivos, definir permisos, tamanio maximo, reglas de archivos o formatos etc.. igual como define la specificacion de la API en amazon, aqui

Pensamos ampliar la libreria con muchas mas funciones, asi que esten atentos :)

Pueden bajar el codigo fuente y los ejemplos de uso, directamente desde el repo de Ipsilon Developmentshttps://github.com/ipsilondev/S3UtilsOpenFL

25 jun
2014

Entrusters: la red para comisionistas internacionales

entrusters

 

Para aquellos que vivimos en latino america, poder comprar cosasa afuera (y mas que nada tecnologia, y por estas epocas, es mucho peor si estas en argentina o venezuela) es muchas veces, una pesadilla. Si tenes como pagarlo, con una tarjeta internacional y estas dispuesto a pagar los recargos locales, tenes un 20% solucionado, el problema mas grave lo tenes en aduana y sus reglas subjetivas dependiendo quien te atienda, el dia y que trajiste. Por eso, un amigo que sigo en twitter, Joaquin Trelleira recomendo una pagina llamada Entrusters, una pagina que conecta viajantes que esten por ir a tu pais, y compradores que quieran comprar cosas en el exterior. El sistema tiene integrado la busqueda con productos en amazon, aunque hablando al soporte, pueden hacerse ordenes con cualquier sitio de compra online. Asi, una vez elegido uno o mas productos, Entrusters lo publica en el sitio, para recibir bids (ofertas) del costo total (osea, de lo que estas pidiendo + el fee que te cobre el comisionista) y el tiempo de entrega aproximado. Una vez elegida la propuesta que mas te convenga, Entrusters te envia una factura para pagar (por paypal por ejemplo), asi, este hace de garante del dinero, que no es entregado al comisionista hasta que uno no confirma el recibimiento del mismo.

No haria este post si no lo hubiera usado yo mismo, en este caso, simplemente para probar compre un funduino de $10 usd ( link ). Al otro dia recibi 2 ofertas, una para la entrega en una semana, a un costo total con la comision de 20 usd y otra con un costo de 11 usd (solo 1 usd de comision) con la entrega en 1 mes. No tenia apuro, asi que elegi esta ultima. Aproximadamente al mes, recibo un mail del comisionista diciendo la fecha que llegaba a Buenos Aires, Argentina, para que no encontremos en un cafe y me entregue el producto. Yo vivo en el interior del pais, y mi agenda en el mes cambio, y no me permitia encontrarlo personalmente. Por esto, le consulte si seria posible que me lo despachara por correo. Sorprendentemente acepto, a pesar de que no sabia como hacerlo. Obviamente esto esta fuera de las normas de Entrusters, y aunque te lo permiten, tomas el riesgo de que se “pierda” en el correo.

DSC_0214

Lo despacho cerca de 3-4 dias de su llegada a bs as, y una vez echo eso, me escaneo las facturas y le abone el envio via paypal (mas un extra por la molestia, de mi parte). Me llego en 2 dias, con el pedido adentro sin problemas. Igualmente hubo una particularidad, que vale la pena mencionar. Yo compre un funduino con cable USB. Recibi un Arduuino original (made in italy) sin cable USB. Obviamente, el vendedor mando lo que tenia, y me imagino que es una desventaja de pasar la responsabilidad de recibir y comprar por otra persona, si es algo muy especifico, no se puede determinar e intentar arreglar una posible confusion.

De cualquier manera, la experiencia fue extremadamente satisfactoria, el soporte de Entrusters estuve en cada paso del proceso y de la comunicacion, a pesar de que el sitio es poco intuitivo y tiene varios errores que pueden despertar desconfianza. Creo que es una gran servicio para conseguir cosas muy especificas como kits de desarrollo (como de oculus) que en aduana usualmente lo roban, o directamente no te lo dejan pasar por que ni siquiera saben que es, y lo confunden con un LCD de industria nacional.

14 jun
2014

Open C de ZTE con Firefox OS 1.3 – Review

Open C Firefox OS

 

Soy una persona Pro Open Source. Todo lo que puedo, lo intento liberar bajo alguna licencia Open Source. Hace unos años, escuche a Hernan Colmeneiro en una charla en la JSConfAr, hablando sobre Boot2Gecko, el proyecto de mozilla de hacer un OS para mobiles de bajo costo, donde las apps fueran echas en tecnologia web (html, css js). El OS en si mismo es un navegador, por lo que todo es echo en tecnologia web, y con API’s especiales, se acceden a funciones como almacenamiento, localizacion etc.. Desde ese momento quise tener un Firefox OS, pero tuvieron que pasar varios años hasta que me llegara la oportunidad. En particular el equipo es un Open C de ZTE, que se vendia en ebay a $100 USD. El mas low end de la gama, con Firefox OS 1.3 instalado.

Experiencia del usuario

No quiero hacer una review para consumidores, pero me veo obligado a comentar puntos importantes sobre la usabilidad y capacidad del sistema en si, para que tengan una idea de la plataforma desde el punto de vista del consumidor (que son los usuarios de sus aplicaciones).

El telefono, a pesar de ser low end, se mueve muy fluido y rapidamente. El inicio del sistema es aun mas rapido que uno de similares caracteristicas en android, y la calidad del equipo es excepcional considerando el precio. Servicios como wifi y 3g, funcionan a la perfeccion, aunque no llegue a probar el GPS. Tiene una pantalla multitouch responsiva, de buena calidad, sin ser un iphone, pero siendo muy usable y que responde rapidamente y con precision.

El problema llega a lo que deberia ser su principal ventaja, el software. Mas alla de que hay poquisimas aplicaciones (no esperen whatsapp, telegram tiene un cliente en alpha, la mayoria de las apps no soportan notificaciones, no hay clientes de ssh, ni nada complejo para el nicho de programadores tampoco, ni siquiera un cliente de correo de gmail). Pero igualmente soy tolerante, entiendo que es una plataforma abierta, nueva y es dificil seducir a los developers. El problema no solo esta ahi, sino en el OS en si mismo. No se pueden compartir fotos o contenidos mas alla de que sea por el cliente de correo incluido. Para compartirlas por las redes sociales, hay que abrir la app, y hacerlo desde que ahi (que dicho sea de paso, la app de twitter es un wrapper de su version mobil, con muchas menos funcionalidades que su par en android). Las apps andan bien, se pueden eliminar de su ejecucion como en android, pero es muy confuso y molesto que si la conexion es intermitente, la apps quedan trabadas en negro o en blanco, esperando procesar. No es user friendly ni por asomo,  deberian tener un timeout o mostrar un error si no se pueden conectar.

Otro error garrafal e increible, es que no es posible bajar archivos desde firefox browser ! Tampoco encontre algun editor de textos o suite ofimatica mobil que suele ser muy util. El echo de no tener notificaciones en apps como FB o TW es bastante molesto y no se condice con un OS que teoricamente estaria listo para el consumidor (y orientado a la navegacion web por sobre todo).

Experiencia del programador

La primer impresion desde el punto de vista del desarrollo fue frustrante. Despues de bajarme una template para realizar la primer app (no vi ningun plugin, editor o generador de templates de proyectos), me encontre con el problema de poder conectar el telefono a la PC para poder transferir las apps. En este punto, me di cuenta que depende de ADB para ello. Yo ya lo tenia seteado para android, asi que lo unico que hice fue agregar las reglas udev para el telefono (aclaro que uso linux como OS principal). Igualmente, seguia sin aparecerme en la lista de dispositivos por ADB. Despues de mucho intento, por casualidad me doy cuenta de que cuando el telefono inactivo, este deja de estar visible desde ADB. No hay ninguna instruccion al respecto y no se si esto es culpa del OS o del fabricante (ZTE). Una vez visible, es posible conectarse via el App Manager desde firefox para transferir las apps, aun cuando se ponga en modo inactivo, no se va a desconectar del sistema.

Despues de setear todo, estaba listo para hacer deploy. El proceso es bastante simple, solo agregar la app al manager, y apretar “update” Es muy rapido, y sencillo, mucho mejor que android.

Bechmarks

Obviamente hice unas pruebas de rendimiento, y estos fueron los resultados:

Pixi.js

Pixi.js bechmark

<1000 bunnies = 60fps

<1500 bunnies = 40fps

<2250 bunnies = 30fps

Hay que decir que cuando se agregaban bunnies muy de golpe o al salir y entrar de la app, existe un congelamiento de alrededor 2-3 segundos donde no funciona nada.

Por otro lado, llegue hasta 40.000 bunnies, y aunque obviamente andaba a 5fps, nunca llego a crashear.

OpenFL html5 nativo

OpenFL BunnyMark

Me lleve una sorpresa al ver que solo andaba a 12fps con 500 bunnies. Totalmente inusable.

3D WebGL test

Boxes bechmark

Por ultimo, quise probar el rendimiento con WebGL, para eso use el bechmark que pueden encontrar aqui. Los resultados fueron:

54-60 FPS = 3       Cubos
47-53 FPS = 30     Cubos
34-38 FPS = 100   Cubos
27-31  FPS = 150  Cubos

Conclusion:

No me arrepiento de la compra, creo que es importante apoyar el desarrollo Open Source, aun, sacrificando 100 USD. Por otro lado, no es un telefono listo para el usuario normal, y tampoco para el programador, ni para su uso, ni como plataforma viable para el soporte de productos comerciales. Si estan desarrollando una web app, y tienen los recursos, los animo a sacar una version para Firefox OS. Pero cuando los recursos son limitados y su app no es web ni su principal target es html5 o la web, es inutil. No tengo idea cual es el market share de la plataforma hoy dia, pero con el simple uso, se nota que todavia esta en una etapa muy temprana, y que requiere de mucho apoyo y desarrollo, tanto creando aplicaciones como en el sistema en si.

Espero que evolucione, que se haga masivo en algun punto, y aunque android tambien es Open Source, tiene muchas partes que son cerradas. Plus, por ahi, un OS basado en web, pueda ayudar a que la fragmentacion no sea un problema tan complicado como ahora, con iOS y Android.

 

26 may
2014

Como conectar un telefono android a una maquina virtual Windows, en un host linux con Virtualbox

virtualbox_logo

Hace poco cambie mi maquina principal, por una notebook bastante mas poderosa. La razon es que desarrollo en varias tecnologias (web,juegos, mobile, y desktop) y eso me lleva tambien a usar los 3 OS principales (linux, windows y mac). Hasta ahora, tenia 3 computadoras, una con cada OS, pero al viajar se me complicaba el desarrollo o testing de los proyectos que encarabamos. Mi solucion fue ahora, virtualizar los OS (windows y mac) en un host linux (que fue siempre mi OS principal). Virtualizar un OS no es muy dificil hoy en dia, herramientas como virtualbox hacen que correr una copia de windows sea un paseo. En el caso de Mac, es un poco mas complicado, pero con una simple busqueda en google pueden encontrar facilmente una imagen de VMware lista para usar.

El tema se vuelve un poco mas complicado cuando el host, es un sistema linux, mas que nada por que como es normal, el open source no se lleva bien con drivers y conexiones externas. En mi caso, tengo un Linux Mint 16, que me soporto casi todo por default, con algun trabajo por el lado del wifi y de los drivers de video (como es normal). El objetivo era poder reconocer el telefono o dispositivo android en el windows virtualizado para poder instalar y probar aplicaciones desarrolladas directamente desde windows.

La forma de que windows detecte el dispositivo, es bastante simple, debe conectarse el dispositivo e ir a la seccion USB de la maquina virtual, y agregar el dispositvo a la lista.

virtualbox-usb

 

Si como en mi caso, no te aparece ningun dispositivo en la lista, significa que es necesario una actualizacion del kernel. Debe ser una version superior o igual a 3.11.0-14. En una distribucion basada en debian/ubuntu, seria un comando como el siguiente:

1
sudo apt-get install linux-headers-3.11.0-20 linux-headers-3.11.0-20-generic linux-image-3.11.0-20-generic linux-image-extra-3.11.0-20-generic

Otro problema que puede suceder, es que tengas problemas de escritura o de instalacion de apliaciones en el dispositivo (como que adb no reconozca el dispositivo), ahi es necesario actualizar Virtualbox, como dice este link, en mi caso, tengo la version 4.3 y anda perfecto. Tambien como dice el reporte de bugs, usar puertos USB 3.0 puede tener algunos problemas, asi que es recomendable conectar el dispositivo en un puerto 2.0.

Espero que les sea util, y como a mi, les simplifique el trabajo del dia a dia.

20 mar
2014

IRTranslator: Traductor de un tipo a otro de señales Infrarojas con arduino

 

 

 

Arduino IRTranslator

 

Y  un dia se me rompio el control remoto del LCD. Normal despues de caerse varias veces y aguantar los 100kg que peso cuando me le sente encima. Lo bueno es que no se habia roto totalmente, algo andaba, pero muy muy mal. Lo malo, es que vivo en un pueblo chico, donde encontrar un reemplazo de este, no iba a ser tarea facil. Por eso mismo, agarre mi fiel arduino para buscar una solucion provisoria que me sacara del apuro (esto no pasaba cuando los televisores tienan botones en el aparato mismo !).

Asi, salio el IRTranslator un simple codigo que traduce una senial de un control remoto a otro. Este simple codigo usa la popular libreria de IR Arduino-IRremote para decodificar y enviar seniales IR de manera facil. Al momento de escribir este post, la libreria soporta varios modos y marcas por defaul (sony, NEC, RC5, RC6, Panasonic, JVC) y tambien puede enviar seniales crudas (aca requiere de un conocimiento de como funciona la tecnologia infraroja para poder crear la seniales manualmente).

Fue algo divertido de hacer, que me dio una idea basica de como funciona la tecnologia infraroja y lo comparto con toda la red para que tambien puedan aprender (o usar en caso de emergencia, por que no) como usar un receptor y emisor IR en arduino. Tambien creo que el codigo tiene un potencial de servir como “backup” de seniales IR que todavia funcionen, y que puedan ser usados en el futuro cuando ya no sirvan o no se consiga un reemplazo del emisor. En mi camino de construir este pequenio projecto, me encontre de varias URL’s utiles que tambien quiero compartir, que ofrecen codigo, diagramas de receptores y detalles de como funciona la tecnologia IR (todo en ingles).

Diagramas de receptores y ejemplos de uso de la libreria:

http://arduino-info.wikispaces.com/IR-RemoteControl

Linea de codigo de la libreria donde define el PWN pin a usar cuando emite la senial:

https://github.com/shirriff/Arduino-IRremote/blob/master/IRremoteInt.h#L254

Informacion teorica sobre IR:

http://www.sbprojects.com/knowledge/ir/index.php

Informacion mas tecnica sobre IR aplicada a la libreria:

http://www.righto.com/2009/08/multi-protocol-infrared-remote-library.html

 

 

 

27 feb
2014

Extension para Haxe/OpenFL para acceder a las imagenes de la camara y galeria en android e iOS

github

Hoy vengo mas con un anuncio que con otra cosa. Recientemente mi compania libero bajo licencia BSD (lo que quiere decir que puede ser usado para cualquier projecto, sea comercial o no) una extension para Haxe/OpenFL que basicamente devuelve la direccion absoluta de la imagen seleccionada por el usuario y su rotacion. Con esta informacion, puede ser facilmente leida desde Haxe/OpenFL (con Sys.io por ejemplo) para su uso. Tambien tiene una funcion extra para obtener el directorio de la aplicacion, asi tambien se pueden escribir archivos desde Haxe/OpenFL

Sin mas vueltas, pueden descargar la extension con todas las detalladas instrucciones de su uso, desde aqui: https://github.com/ipsilondev/getimagext

Pueden seguir los anuncios y lanzamientos de mi compania Ipsilon Developments Inc en Facebook y Twitter para mas info :D

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 !

 

Sigueme !

Follow Me! Follow Me! Follow Me!

Categorías