Bitacora #2: Tile.js generator

Dejando los posts sobre cosas curiosas de javascript para más adelante, cuento un poco sobre una pequeña utilidad que arme para usar en el port del gorillas.

Se trata de un simple generador de tiles para usar sobre un contexto 2d.
Dado que el juego original no utilizaba imágenes, me pareció que no seria correcto hacer un clon que sí las use, por lo que pensé en dibujar los elementos del juego (gorilas, edificios, bananas y el sol) con primitivas del contexto 2d.

Como seria bastante engorroso imaginarme donde tendría que poner cada punto, se me ocurrió hacer una ‘pizarra’ en la que se dibuje cada punto que selecciono. Estos se van guardando en memoria para luego obtener una función con el código para dibujar dichos puntos.

Para manejar de forma ‘elegante’ la orientación a objetos en javascript, use la libreria Base.js. Esta provee de una serie de objetos y métodos que hacen que la herencia y la creación de ‘clases’ sea más llevadero.
El resto del código, consiste en una clase con un ‘canvas virtual’ que lleva registro de los puntos que fueron dibujados para luego obtener el código de cada uno (tanto la clase ‘canvas’ como la clase ‘dot’ saben como obtener su código).
Ademas, al momento de obtener las funciones, se puede especificar un ‘multiplicador’ para reducir el tamaño de los puntos, de esta forma se puede dibujar en grande y de forma comoda, para luego disminuir el tamaño.

Ejemplo:

Tile Generator

Dibujamos esto...

 

 

Drawed gorilla

y obtenemos la función para dibujar esto...

El script es bastante sencillo y carece de buenas prácticas, pero es útil para lo que necesito en este momento.

Para verlo en acción: http://tehsis.me/tilegen/
Repo en github: https://github.com/tehsis/Tile.js-Generator

En el futuro espero hacerlo extensible a primitivas distinta a los puntos (rectángulos en realidad) y poder dibujar otras cosas. No seria complicado, pero ahora la prioridad es el gorillas :D.

Dejo un par de links interesantes,

Base.js – Mini librería para trabajar con objetos, clases, herencia, etc de forma ‘clasica’
Load.js – Mini librería para ‘importar’ scripts js mediante código.
10 Things I learned from jQuery source – Video de Paul Irish contando 10 técnicas interesantes que estan presentes en el código de jQuery.
Tutorial del elemento Canvas (MDC) – Lindo y llevadero tutorial del MDC sobre la etiqueta canvas y el contexto 2d.

Bitacora #1: Funciones y scope en javascript

Para comenzar con la bitácora, me pareció innecesario hablar sobre que es javascript, como se ejecuta y cosas básicas sobre su sintaxis.
Es que de hecho, la mayoría de los desarrolladores web, sabemos que posee una sintaxis basada en C, que es un dialecto de la especificación ECMAScript y que se usa para hacer efectos raros en las páginas web… Si ya se, es prácticamente un cliché decir que javascript es mucho más poderoso que eso, teniendo ejemplos como Twitter, Facebook, Gmail y un largo etcétera, creo que ya no hace falta aclararlo.
Lo cierto es que durante mucho tiempo la mayoría simplemente buscaba en Google como hacer algo en particular sobre Javascript, cambiaba un par de cositas para adaptarlo a su necesidad y decia ‘Tengo que aprender javascript algún día’. Ese ‘algún día’ llego hace rato y hoy es difícil pensar un sitio o un sistema web que no lo utilice.
Es quizás por esto que mucha gente no entiende exactamente como se utiliza Javascript y por lo que muchas de sus capacidades como lenguaje, en el sentido estricto de la palabra, están subestimadas.
Por ello, elegí comenzar a escribir sobre los conceptos básicos que en mi opinión, hacen especial a javascript

Funciones y scopes

Las funciones en javascript son incluso más importantes que en otros lenguajes dado que son el único delimitador de contexto que tenemos a diferencia de C++ o Java en donde las variables tienen alcance solamente en el bloque en donde fueron definidas.

En el ejemplo, definimos una variable a en el contexto global, dentro de una función creamos una variable del mismo nombre a la cual le asignamos un valor. Ejecutamos la función y comprobamos que la variable a, tal y como es de esperarse, no fue modificada.
Sin embargo, dentro del bloque if, creamos una nueva variable a, le asignamos un valor y fuera del bloque, la variable continua teniendo ese valor. Como dije anteriormente, el único scope en javascript son las funciones y el scope global.

Funciones anónimas

Otra cosa interesante de javascript, es la posibilidad de crear funciones anónimas. Con ellas, podemos hacer dos cosas (en principio); asignarlas a una variable e invocarlas como una función común:

O bien, decirles que se autoejecuten, de la siguiente manera:

Esto último, es muy útil, no solo nos permite simular bloques para solucionar el problema del scope que mencionamos antes, si no que sirve para solucionar un problema bastante común e incluso visto en algunos frameworks famosos y es que, cualquier variable que definamos fuera de una función, se encuentra en el scope global. De modo que es muy común que diferentes scripts sobrescriban variables por estar definiendo todas en el contexto global.
Una solución a esto, es la de encerrar todo nuestro código en una gran función anónima que se autoejecute y solo exponer aquellas variables estrictamente necesarias y de esta forma simular espacios de nombres en nuestros scripts.
Un ejemplo práctico de esto, lo podemos ver en el código fuente del framework jQuery

Como vemos, al incluir jQuery en nuestro sitio web, se ejecuta una gran función anónima dentro de la cual, se crea una variable con toda la funcionalidad del framework y luego se la asigna a una propiedad del objeto window.
Para no entrar en mucho detalle simplemente tenemos que saber que dentro de un browser, el objeto window define nuestro contexto global. Es decir, jQuery en el contexto global es el mismo objeto que window.jQuery.

De esta forma, la única colisión de nombres posible es que haya otro objeto llamado jQuery (o $) dentro de window.

Nota 1: El $ en window.$ no es ni más ni menos que un identificador para una variable cualquiera. Es exactamente lo mismo usar jQuery o $, no posee ningún poder otro poder mágico.

Nota 2: Es recomendable usar jQuery en lugar de $, ya que este último es utilizado por otros frameworks y podemos tener efectos no muy deseados si tratamos de trabajar con ellos.

Conclusión

Las funciones en javascript son el único delimitador de scope que tenemos, esto podría resultar un grave problema ya que cualquier identificador que definamos fuera de una función puede colisionar con otro definido en otro script. Es por esto que es una buena práctica encerrar todo nuestro script en funciones anónimas que se autoejecuten y exponer (asignándolos como propiedades del objeto window) solamente aquellos identificadores imprescindibles.
Para cerrar, podemos decir que en javascsript las funciones son objetos, pero eso mejor lo vemos mañana.

Antes de cerrar, quiero comentar que pueden encontrar el estado actual del juego que comente en el post anterior en https://github.com/tehsis/Gorillas.js
Por lo pronto, estuve trabajando más que nada en crear un marco de trabajo para solucionar algunos problemas que vamos a ver más adelante.

Bitácora de viaje hacia la BarcampNEA: Desarrollo de un juego usando HTML5 + JS

Para quien no lo sepa, el Sabado 25 de junio próximo, se va a relizar la primer Barcamp organizada en el NEA (Nordeste Argentino). Evento bautizado BarcampNEA.
Para esto, nos propusimos con @matixfigueroa hacer una comparativa entre Flash+Actionscript y HTML5+Javascript. Para lo cual cada uno va a realizar un port del famoso juego Gorillas incluido con el otrora ponderado Quick Basic.

 

Dado que a diferencia de mi contra parte que descose Actionscript, recién estoy comenzando seriamente a trabajar con Javascript, me pareció que podría ser interesante armar una “bitácora de viaje” contando que fui haciendo, los problemas que encontré y como los solucione de forma tal que pueda compartirlo y de paso afianzar los conceptos aprendidos. Ademas, abro la posibilidad de escuchar sus recomendaciones, sugerencias y/o colaboraciones a este mini proyecto.

No voy a poner una periodicidad fija para cada post ya que todo depende de que tan apretado este con la facultad y/o mi trabajo, pero tratare de cubrir la mayor cantidad de aspectos que pueda.

Este primer post va a ser corto, así no mezclo las cosas. Mañana arranco con un par de conceptos básicos de Javascript.

Me despido no sin antes recomendar dos libros que acabo de leer y que considero muy interesantes para comenzar con este lenguaje.

El primero es “Javascript: The good parts” de Douglas Crockford. Una introducción a Javascript “cortita y al pie”. El creador de JSON muestra en este libro las cosas lindas de javascript y como ocultar implementar correctamente las feas.

El segundo, “Pro Javascript techniques” de John Resig, es un excelente complemento para el primero ya que el autor nos explica soluciones a diferentes problemas utilizadas en los frameworks más famosos , como Prototype, ExtJS, Dojo, jQuery (obviamente ya que su autor es el mismo que el del libro) entre otros.

Nos seguimos leyendo mañana :)

[Perl] Expresiones regulares y cuantificadores no codiciosos

Hace poco tiempo tuve problemas con una regex que no tomaba lo que, al parecer, yo le indicaba. El problema no es grave, pero tiene que ver sobre como Perl trata las expresiones regulares y las wildcards.

Por ejemplo, si tenes el siguiente string “See spot, see spot run, run spot run” y tratamos de capturar lo que se encuentra antes del primer ‘spot’ podríamos querer hacer algo como esto:

Lo cual nos mostraría en pantalla ‘See spot, See spot run, run ‘. En vez del primer ‘See ‘ que ya cumpliría con lo que dice nuestra regex. El tema está en que Perl, tratara de matchear lo más que pueda ya que hace uso de cuantificadores codiciosos (greedy quantifiers). De modo que para traer el primer ‘See ‘ debemos hacer uso de los ‘cuantificadores no codiciosos’ (non-greedy quantifiers), En este caso ‘*?’  que tratara de matchear 0 o más lo menos que pueda. Es decir, cambiando a:

Obtendremos el primer ‘See ‘.

Del mismo modo, asì como con el cuantificador codicioso ‘+’ matchearemos 1 o 0 veces, con ‘+?’ matchearemos 0 o 1 veces (primero 0, luego una). y usando el cuantificador no codicioso  {x,y}? podremos matchear x veces, pero no màs de y.

Conclusión, un problema bastante sencillo pero que puede generar algunas confusiones.

Fuente:  http://perldoc.perl.org/perlretut.html

Importando datos SQL con Perl

Hace algun tiempo tenia que importar CSV a una tabla que tenia guardada en una base de datos Postgre para una materia de la escuela.

Como tenia un problema con la forma oficial para hacer esto y no funcionaba internet, con la ayuda de Perl arme un pequeño script que, leyendo desde un archivo CSV, generaba sentencias “insert” con los datos para luego pegarlos en una consola y de esa forma tener mís datos importados… como quien dice, una “rebuscada freak”

En fin, el código pueden verlo a continuación o bien desde mí cuenta de gitHub en: https://github.com/tehsis/importSQL

EDIT: Debido a que el script fue sufriendo algunos cambios desde que lo publique, dejo solo el link al repo

Presentando a El Goblin

Desde hace un par de semanas, comence a aprender Perl y para esto inicie un pequeño proyecto sobre un buscador de páginas web, sin más intenciones que obtener sitios y buscarlos mediante tags y principalmente, aprender a trabajar con Perl y otras herramientas.
Así fue que nacio “The Goblin Search Engine”. Una serie de scripts que permitian añadir sitios a una base de datos  (MongoDB) y luego buscarlos mediante los tags  (los cuales son obtenidos del sitio).

Habiendo avanzado ya un poco, me dispuse a darle un objetivo más “práctico” a este buscador para que no muera solamente en un puñado de código mal armado y es así como nace Goblin como proyecto personal.

¿En que consiste?

Actualmente, esta dividido en dos partes. “The Goblin server” y “The Goblin client”, conectados el uno con el otro mediante SOAP.
El primero, como ya dije, esta hecho completamente en Perl y es el encargado de agregar los sitios a la base de datos, realizar las busquedas y brindarle los resultados al cliente.
El segundo (el cliente) no es más que una API para poder acceder a los servicios del servidor (valga la redundancia).
Tambien junto con el cliente se incluye un script como ejemplo para usarlo.

¿Y el objetivo?

El objetivo sigue siendo aprender. Las ideas que tengo para implementar en Goblin son muchas y seguramente apareceran más sobre la marcha.
De momento, es solamente un pseudo buscador de páginas web indexadas en una BD que no esta pensado bajo ningun punto de vista para usarlo en producción (aunque bien podría servir como base).
Sin dudas, el siguiente paso sera hacerlo más robusto, actualmente es bastante inestable y “facil de romper”  ademas, claro, que carece de muchas caracteristicas que podrian considerarse un “must” en este tipo de apps. Vamos, que hay que mejorarle TODO.

En conclusión. La idea de este post era solamente comentar sobre Goblin. No recomiendo su uso actualmente, pero el código esta ahí listo para que lo bajen y hagan lo que quieran con el (bueno, siempre que la GPLv3 lo permita ;) )

Por último, quiero agradecer a @guitarrear por impulsarme a aprender Perl y por consiguiente, a comenzar ese humilde proyecto :)

http://github.com/tehsis/Goblin

Fotos de la Bienal del Chaco 2010

Hoy me hice un tiempo para ir a ver la Expocisión Bienal del Chaco (mí provincia) en Resistencia (capital de dicha provincia.

Segun su página web:

La Bienal Internacional de Escultura 2010, del 17 al 24 de Julio, en Resistencia, capital de la provincia del Chaco. Esta edición convoca a 10 de los más prestigiosos artistas del mundo que realizarán, a cielo abierto y ante miles de espectadores, una obra original e inédita.

El destino de las obras será las calles y avenidas de Resistencia, incrementando el patrimonio escultórico de la ciudad, actualmente conformado por más de 520 obras de los más destacados artistas del planeta.

Pero bueno, vamos con las fotos que tome:

Simphple Gallery 0.1 – Galeria de imagenes simple con PHP

Bueno… bastante hace ya de mí último post… espero poder dedicarle más tiempo a esto en estos días, aunque no prometo nada.

Hace unos días para una web que estoy armando, necesitaba hacer una galería de imágenes de forma que el usuario pueda agregar y sacar imágenes a su antojo y como buscando por la web me encontré con varías galerías que usaban AJAX o Flash, decidí armar una donde predomine la simpleza.

El script esta hecho enteramente en PHP de forma que no dependa del navegador que estemos usando para poder visualizarlo correctamente.

Para usarlo, solamente deben crear un directorio llamado “img/” en el mismo lugar que donde tienen el archivo gallery.php (aunque pueden cambiarlo modificando dicho archivo) y meter allí las imágenes que quieren que formen parte de la galería. Luego incluyen el script mediante:

 
<?php include("gallery.php"); ?>

Dentro de su página o bien crean un link directo al mismo.

Al comienzo del código fuente, van a poder encontrar las variables que pueden modificar para poder “personalizar” el script, tal como el directorio desde el cual se tomaran las imágenes, el ancho y largo con el que seran mostradas y los textos que hacen de link a las imágenes anterior y siguiente (de forma que sea sencillo traducirlo).

Las imágenes son redimensionadas por medio de HTML. Sé que podría usar gd para que no pierdan tanta calidad, pero 1-Nunca use gd 2-Por el momento preferí que los requisitos para usar el script sean los menos posibles.

El script no genera ningún estilo CSS ni nada que se le parezca. Esto fue adrede para que podemos agregar uno de nuestra propia manufactura simplemente envolviendo nuestro include con las correspondientes etiquetas. Por ejemplo:

 
<div id='gallery'>

<?php include("gallery.php"); ?>

</div>

Tengan en cuenta que de momento, no hay ningún filtro para los archivos dentro del directorio que contiene las imágenes así que asegurense de meter allí solamente archivos de imágenes (.jpg,.png,etc) si no quieren resultados raros.

Posiblemente más adelante agregue esto junto con el redimensionamiento de imágenes via gd… ya veremos que sale. Por el momento, solamente quería compartir esto que arme para mí uso personal esperando que a alguien más le pueda servir.

Sin más, el link de descarga:

Descargar:  Simphple Gallery 0.1

Un minuto de silencio por una comunidad abandonada (RedUsers)

Lapida

Lapida

Desde hace bastante tiempo que eh participado (a veces más, a veces menos) de los foros de RedUsers (ex- Tectimes) editorial de la famosa-y-venida-a-menos revista USERS, entre otras.
Foros que hoy por hoy (desde hace rato en realidad) están en decadencia debido al abandono que han sufrido por parte de las personas responsables de hacerlos funcionar.

Un poco de historia antigua

Para poder continuar, debería hacer un resumen histórico de estos foros y porque decidí escribir sobre ellos.

La primera vez que ingrese, fue a mediados del 2001. En aquel entonces, eran unos foros muy primitivos (demasiado para la época) recuerdo que ni siquiera agrupaban mensajes por tema. Así y todo, varias veces pude consultar mis dudas recibiendo una respuesta rápida y amable, por parte de quienes participaban en el mismo.
Luego vino lo que yo considero fue su época “dorada” y a la que la mayoría hace referencia cuando habla de “los viejos foros de TecTimes”. En lo técnico no tenían nada de especial, aunque ahora el formato era similar a lo de la mayoría de los foros, si bien no tenían muchas de las características que eran comunes en la mayoría, eran usables y fáciles de seguir (sin ir muy lejos). Con una comunidad muy buena que con el paso del tiempo se fue agrandando y afianzando. Ninguno de los que estábamos ahí eramos supergenios de algún tema en particular (aunque algunos se acercaban bastante) y sin embargo, gracias a esta comunidad, quienes se acercaban al foro, se quedaban. Algunos más, otros menos, pero la comunidad crecía.

Y acá quiero hacer el primer incapie ya que estamos hablando de la comunidad y es el hecho de que salvo muy raras ocasiones, en estos foros no participaba ninguna persona allegada a la revista. De hecho (sin estar 100% seguro) me atrevería a decir que jamas participo algunas de las “estrellas” que tanto hablan de comunidades en sus notas de la revista.
No había moderadores en aquella época, todo era manejado por la buena fe de los usuarios. Esto permitió que algunos temas puedan “subirse de tono”, permitiendo cosas como posts que consistían en hacer puteadas o minas ligeras de ropa.
Toda esta libertad obviamente trajo una serie de problemas que en principio no eran tales, como discusiones con “tono elevado” llegando en algunos casos a insultos racistas o personales, de hecho, un usuario me había amenazado de muerte por no estar de acuerdo con el respecto a su idea de que Google sacaría un sistema operativo basado en Ubuntu (que se tornaron bastante molestas e incluso insistió en seguir con ellas por mail)
Este lindo desastre, fue contrarrestado por los administradores y dueños del foro eligiendo moderadores de la comunidad (y elegidos por la misma) claro que “de buena fe” y fue ahí donde comence a ser moderador de dicho foro.
En principio el remedio fue peor que la enfermedad,  armándose “enfrentamientos” entre determinados grupos de usuarios y los nuevos moderadores que regimos una suerte de “mano dura” y muchas cosas que antes pasaban sin problema, ahora se controlaban un poco más (algunas lo admito, en exceso)
Y este grupo de moderadores continuamos “trabajando” bastante tiempo, sin tantos problemas conforme se fueron calmando las aguas de la “mano dura” y donde la actividad se redujo a mover temas fuera de lugar y cerrar threads de SPAM.
En este punto el foro nuevamente comenzó a crecer. Había, de hecho, un lindo grupo de administradores que se encargaban de solucionar inconvenientes y por sobre todo, ser la base a la que recurrimos los moderadores ante algún inconveniente con el foro (como ya aclare, eramos simples usuarios con ciertos privilegios, no teníamos ninguna relación con la editorial)

Un poco de historia actual

Ahora la editorial quiso prenderse un poco de la “web 2.0” (sabía decisión si la hubieran llevado bien) y comenzaron a darle un poco más de importancia al foro como “generador de contenidos” publicando algunos comentarios en la revista y cosas similares. Luego hicieron una reestructuración del portal y acá es donde todo se derrumbo.

Por que? Por el abandono. El nuevo portal es  “fantástico” integra el foro con las noticias que se publican, se pueden acceder a los blogs que escriben los miembros de la editorial, etc etc … Pero el foro nuevamente se convirtió en tierra de nadie. Los administradores que tanto habían trabajado en su momento dejaron de formar parte de la editorial (aunque sus cuentas del foro aun tenian permisos, para que se den cuenta de lo terrible del abandono) y los moderadores quedamos a la deriva.
De este último tiempo no puedo hablar mucho como moderador, debido a que ultimamente no me podía permitir pasar mucho tiempo y simplemente me daba una vuelta para leer un par de temas y borrar uno que otro spam, pero la situación se volvió insostenible. El nuevo foro tenia algunos problemas, había fallos técnicos por todos lados (servidores caidos, bases de datos que no respondían, imágenes que faltaban). Incluso en el foro de moderadores solo se leían temas de pedido de explicaciones por parte de los moderadores activos (que terminaron siendo 2 o 3 para estas alturas) pero sin respuestas de los administradores que son quienes realmente podían tomar decisiones ahí.

Conclusión…

De todo esto, creo que se pueden desprender varias cosas. Lo principal, creo, es que nuevamente queda demostrado que la mayoría de las veces se subestima a las comunidades web y creen que por el simple hecho de poner un sitio web y no mantenerlo, este va a crecer por sí mismo.
RedUsers (o TecTimes, como prefieran)  a pesar de todo tenia una linda comunidad formada en sus foros y de hecho, esto puede verse en, por ejemplo, Comunidad Argentina. Un foro formado por muchos de los que fueron víctimas de la mano dura excesiva o bien no estaban de acuerdo con los cambios que tuvo el foro en aquel entonces y que ha ido creciendo e incluso gano muchos de los usuarios que salieron despavoridos del foro actual por las situaciones que ya nombre (No, yo no, siendo uno de los responsables que muchos hayan sido baneados de RedUsers no creo que sea muy bienvenido, pero eso ya es otra historia je)

En lo personal creo que podría sacar varias conclusiones, principalmente el hecho de que no sirvo para moderar un foro, pero más allá de eso, lo malas que pueden resultar las “malas interpretaciones”

Es decir, RedUsers tenía (y de hecho, tiene) mucho para ganar, siendo la principal revista de informática de Argentina (que no quiere decir la mejor) con un contra y es la crisis por la que estan pasando muchas revistas impresas y teniendo todo en sus manos para poder fomentar una comunidad online (un tema de moda) que a su vez lleve a la venta de sus revistas, pareciera que se creyó el hecho de que el negocio de la web 2.0 es “tirar una semilla y sentarse a esperar”

Pero en fin, es solo una opinión personal en parte por la decepción que me da ver morir una comunidad de la cual me eh sentido parte… después de todo, ellos son los que manejan una gran editorial, no yo :D

Tuxinfo Número 19

Hace rato que no escribo y eso se siente en las visitas al blog, aunque si los proyectos que estoy iniciando avanzan de la forma esperada, pronto habrá grandes novedades ;)

Por ahora, solo quiero comentar que salio la revista Tuxinfo #19 con nota de tapa “Develando los detalles de la última versión de KDE”, la cual es de mí autoría y es la primer nota que escribo para una revista. En ella, relato un poco los cambios anunciados para KDE4.3 junto con mi experiencia personal en su uso, así que no se la pierdan ;)

El resto de la revista obviamente no tiene desperdicio, hay notas muy interesantes escritas por gente muy grosa que serán de mucha utilidad para aquellos que usen o esten interesados en usar Software Libre. Les dejo el indice:

  • Pág.  2- Editorial.
  • Pág.  4- Pack TuxInfo 19 ¿Cómo obtenerlo?.
  • Pág.  5- Noticias del mes.
  • Pág.  9- Producción Musical usando Software Libre (Segunda Parte).
  • Pág. 12- Páginas recomendadas de TuxInfo.
  • Pág. 15- Opinión – Denegación de Cultura.
  • Pág. 18- Virtualización en OpenSolaris.
  • Pág. 30- Rincón del Lector.
  • Pág. 33- Mi experiencia en GNU/Linux.
  • Pág. 35- Desmitificando Postfix.
  • Pág. 52- Tapa – Develando los detalles de la última versión de KDE.
  • Pág. 63- Tapa – Riesgos Legales de las empresas por uso de software licenciado.
  • Pág. 66- Labo Xpress Kino, MultiDistro, LightScribe en Linux.
  • Pág. 69- Curso de Python. Estructuras de datos básicas.
  • Pág. 74- Probando LiveAndroid v 0.2.

Link para descargar: http://infosertec.loquefaltaba.com/tuxinfo19.pdf

Sitio oficial y números anteriores: http://www.tuxinfo.com.ar