Diseñar webs y aplicaciones móviles rápido y fácil

WireframeA la hora de diseñar ventanas, webs, y aplicaciones para móviles, más de una vez he intentado usar alguna aplicación como mockingbird o Pencil Project. La primera, mockingbird, es una aplicación web a la que se puede acceder desde cualquier navegador y te permite diseñar varias páginas con distintos elementos. En cuanto a la segunda aplicación, Pencil Project, nació inicialmente como una extensión de Firefox, pero ya dispone de versión multiplataforma de escritorio. La verdad es que también va muy bien.

El inconveniente de estas dos aplicaciones, es que por alguna razón, al final siempre me resulta más sencillo coger papel y lápiz y hacer cuatro garabatos mal hechos que me ayudan a organizar mis ideas mejor. Supongo que la razón es que al no ser diseñador, lo mismo me da hacer un diseño churro en papel en 2 minutos, que un diseño churro en un programa con elementos bonitos, donde suelo tardar 3 o 4 veces más… porque al final te lias, te lias… y el tiempo pasa y pasa.

Sea como fuere, el otro día descubrí Wireframe.cc, y la verdad es que quedé bastante impresionado por el UI. Es supersencillo, arrastras el ratón y listo, ya tienes un elemento. Haces click en el tipo de elemento que quieres, y ya lo tienes… haces doble click sobre el elemento, y puedes cambiar atributos, etc…

Realmente, es la primera vez que siento que una aplicación de este tipo no me hace perder el tiempo.  Por lo que he visto, esta aplicación está comenzando, y le faltan varios aspectos que pulir y funcionalidades que añadir, y supongo que se irán añadiendo, pero desde luego para hacer un diseño rápido y sencillo me sobra 😉

Os recomiendo que les echeis un vistazo a las tres aplicaciones que os he comentado, todas tienen sus cosas buenas o malas, y supongo que como todo en la vida, depende de las necesidades y preferencias que uno tenga. Yo de momento me quedo con wireframe.cc

Oferta de trabajo: buscamos programador

 

Update:  Ya hemos cerrado el plazo para enviar solicitudes.

En mi empresa estamos buscando ingeniero desarrollador de software para mi equipo, lo que viene siendo un programador, pero de los buenos ;p

Los detalles de la oferta, así como los datos de contacto, los podeis encontrar en el siguiente enlace:

https://dl.dropbox.com/u/20600084/JobOffer_SDE-Aug2012.pdf

No es una oferta para un programador normal, es una oferta para alguien a quien le apasione programar. Alguien a quien le guste resolver problemas complejos y se sienta cómodo trabajando con proyectos grandes. Alguien con experiencia programando en C/C++, HTML/JS/CSS, Python, … y en lo que le echen. C/C++ hay que dominarlo, lo demás ya es más opcional… alguien que sepa esto se puede adaptar y aprender fácilmente. Tienes puntos extra si has programado en ensamblador y si tienes años demostrables en la industria. Buscamos a alguien autosuficiente, con ganas de hacer cosas nuevas y ganas de mantener productios viejos :p  …hombre, todo no va a ser bueno…

Lo malo es que habrá productos “viejos” y complejos que mantener, lo bueno es que también hay proyectos nuevos y siempre hay tiempo para innovar, mejorar los productos existentes y hacer  prototipos de nuevos productos 😉

La oferta es para trabajar en El Campello, Alicante (España). Si no eres de por la zona, pero te llama la atención la oferta, te diré que como cosas buenas, tienes alquiler de apartamentos a 2 minutos de la oficina, con vistas a la playa y al mar, te diré que el ambiente de trabajo es cojonudo, y te diré que la oficina es bastante amplia (también se ve el mar desde la oficina), tenemos cocina, y realizamos compras mensuales en el supermercado para tener un poco de todo para almorzar. El horario es de 8 horas y salvo contadas ocasiones, no se hacen horas extra, cuando se hacen, se suelen cambiar por días de vacaciones/horas de descanso. Hay 25 días de vacaciones al año, y salvo muy contadas excepciones puedes elegir las fechas a tu gusto. Sé que todo esto suena raro para España, por eso lo comento.

Desde mi punto de vista, el currículum sirve para descartar, pero no para contratar, así que si no tienes demasiada experiencia, pero te encanta programar, y tienes ganas de aprender, manda un e-mail, igual eres tú el candidato que buscamos. Habrá una o varias pruebas para contratar/descartar candidatos, y en las pruebas habrá que calentarse un poco la cabeza… y cómo no, tendrás que demostrar que tienes aptitudes para programar y resolver problemas programando.

Esta oferta de trabajo es una recomendación personal a los lectores del blog. A mi me gusta programar y me gusta mi trabajo, si no no gastaría el tiempo en escribir un post en un día de vacaciones. El trabajo mola y está bien pagado (estamos hablando siempre de Alicante, España). Las cosas que desarrolles afectarán luego a millones de personas, osea que haciendo las cosas bien, también es un trabajo gratificante.

Dicho esto, si conoces a alguien a quien le pueda intersar esta oferta, mándale el PDF.

Suerte!

Nota final: este artículo refleja mis opiniones y valoraciones personales, no los de la empresa

Nota 2: la foto es de David, un compañero de la oficina que me ha dejado poner su foto con la nueva cocina 😉

Hack Manso: Mejorar la velocidad de SQLite en Google App Engine SDK

Una cosa que se suele hacer bastante en javascript es resetear un formulario, es decir, devolver el formulario a su valor inicial.

Con jquery esto es bastante fácil:


$(

, , , , ,

Truco Manso: obtener una cadena hexadecimal aleatoria en python

Obtener una cadena de bytes aleatoria es una de esas cosas que hacen falta de vez en cuando.
La opción más sencilla en python es importar uuid y hacer la siguiente llamada:

uuid.uuid4().hex

Ale, con esa llamada ya tenemos 32 caracteres hexadecimales aleatorios (16 bytes aleatorios).

¿Sabes de algún otro método?

,

TrucoManso: Transformar el tiempo en formato 24h a formato 12h (Python)

Una cosa que se suele hacer bastante en javascript es resetear un formulario, es decir, devolver el formulario a su valor inicial.

Con jquery esto es bastante fácil:


$(

, ,

Google App Engine SDK 1.4.0 released

Ya está disponible la versión 1.4.0 del SDK de Google App Engine.

Particularmente resaltaría 3 cosas de este release:

  • Los taskqueues ya forman parte del API oficial, han dejado de ser experimentales 😉
  • Han multiplicado por 20 los tiempos máximos de ejecución de las tareas cron y de las tareas del task queue de 30 segundos a 600 segundos (10 minutos). Esto es fantástico, aunque puede ser peligroso. Habrá que usarlo sabiamente 😉
  • El uso del Channel API ya está disponible para todo el mundo de forma oficial.

El Channel API me impresionó cuando le eché un vistazo por allá por Mayo. A continuación el video del Channel API. Es bastante técnico y sólo tiene sentido si programas en GAE o si por ejemplo quieres hacer un API para comunicación Comet entre cliente-servidor:

Enlaces:

, , ,

Truco Manso: Obtener la latitud/longitud a partir de una dirección

Para un proyecto que espero que pronto vea la luz, he estado investigando cómo determinar la localización geográfica de cualquier sitio. Esto es, determinar la latitud/longitud a partir de una frase en plan “Elche, Alicante, Spain”

A esto se le llama Geocoding y a poco que he buscado tanto Google como Yahoo tienen APIs REST que te permiten enchufar queries en un servidor (aunque con unos términos de uso limitados).

En el caso de Yahoo, hace falta darse de alta para que te den un appid y poder hacer los queries.

En el caso de Google, no es así, y preguntar la latitud y longitud de “Elche, Alicante, Spain” es tan fácil como:

http://maps.googleapis.com/maps/api/geocode/json?address=Elche,+Alicante,+Spain&sensor=false

Esto devuelve un churrasco en JSON (también lo puedes pedir en XML) y dentro de este churrasco, dice que la latitud/longitud es:
“lat”: 38.2671765,
“lng”: -0.6952196

También existe GeoNames, que es menos preciso, pero puede resultar interesante también (ver enlace más abajo).

Para más información:

, , , , ,

Soporte de unicode en Python: Frustraciones y Soluciones

Una cosa que se suele hacer bastante en javascript es resetear un formulario, es decir, devolver el formulario a su valor inicial.

Con jquery esto es bastante fácil:


$(

, , ,

Serializando datos nativos en Python

Resulta que para un proyecto en Python en el que estoy trabajando necesitaba serializar algunas estructuras. El tema es que únicamente hacía falta serializar tipos nativos como listas, diccionarios, cadenas, enteros, etc…

Lo que me hacía falta era:

  • representación compacta
  • serialización/deserialización rápida
  • legible / editable por un humano

Así que después de pensar un rato, he encontrado 3 posibles soluciones para serializar datos arbitrarios:

  • pickle/cPickle que serializa cualquier cosa, viene con python, pero no es legible/editable
  • simplejson que serializa en formato JSON (el resultado es legible y editable)
  • PyYAML que serializa en YAML (el resultado es legible y editable)

El siguiente paso era coger un buen montón de datos, y hacer tests para ver que tal funcionan los encoders/decoders en cada uno de esos módulos.

A continuación puedes ver los gráficos de los tiempos de encoding/decoding para dos conjuntos de datos empleando cada uno de los formatos anteriores:

Python Serialization Speed Test (Tiny Dataset)

Python Serialization Speed Test (Huge Dataset)

A parte de la velocidad, también me interesaba medir la longitud de las cadenas generadas (cuanto menos, mejor):

  • yaml   tiny = 32604  // huge = 912912
  • json   tiny = 31305 // huge = 876540
  • pickle-raw    tiny = 34504 // huge = 986531
  • pickle-highest   tiny = 37541 // huge = 1101480
Conclusión:

Como se puede ver en las gráficas, y en la tabla anterior, considero que JSON es el que me hace mejor papel. Codifica / decodifica ligeramente más despacio que pickle (un 4% más despacio) pero la cadena resultante es legible y editable y además ocupa menos espacio que picke y que yaml.

Todos los tests han sido realizados con Python 2.5

El código:

Finalmente, aquí dejo un fragmento de código usado para obtener los tiempos que aparecen en los gráficos anteriores:

start = time.time()
for i in range (0, 100):
yaml.safe_load (yaml.safe_dump (data))
self.write ("YAML TIME = %.2f
" % (time.time() - start))
 
start = time.time()
for i in range (0, 100):
JSONDecoder().decode (JSONEncoder().encode (data))
self.write ("JSON TIME = %.2f
" % (time.time() - start))
 
start = time.time()
for i in range (0, 100):
pickle.loads (pickle.dumps (data, pickle.HIGHEST_PROTOCOL))
self.write ("PICKLE TIME = %.2f
" % (time.time() - start))
 
start = time.time()
for i in range (0, 100):
pickle.loads (pickle.dumps (data, 0))
self.write ("PICKLE-RAW TIME = %.2f
" % (time.time() - start))

, , , , ,

bbcodeutils: BBCode parser and BBCode to HTML for Python

Una cosa que se suele hacer bastante en javascript es resetear un formulario, es decir, devolver el formulario a su valor inicial.

Con jquery esto es bastante fácil:


$(

, , ,

prev posts