Archive for 31 julio 2007

Mi noche triste…

julio 31, 2007

Heme aquí lamentando que no hubo Peter Capusotto y sus Videos. Hubo música clásica con Mundstock, que no está tan mal pero es incomparable con el gran Peter. Al parecer en la programación de los lunes ya no está. Espero que no haya que esperar a septiembre. Sino siempre tendremos you tube.

Mientras lamento mi noche triste.

No tengo muchas novedades, sigo probando cosas con jQuery y tengo que ponerme con un sitio que vengo posponiendo hace rato. Ni bien llegue a algo interesante lo publico.

Eso y un bonito trabajo práctico de física para la facu.

¡Salúd!

Anuncios

jQuery

julio 27, 2007

jQuery es una biblioteca javascript. Su slogan es “Escribí menos, hacé más”. La idea es escribir JavaScript de una manera intuitiva.

Ahí me sonó la alarma: ¿escribir JavaScript de una manera intuitiva? ¡Ni loco! Bastante me tomó aprender a garabatear js para andar cambiando a esta altura del partido. Pero seguí, porque me llamaba la atención. Además porque tenía que usarlo con SPIP.

¿En qué consiste entonces esa manera intuitiva?

jQuery nos propone acceder a los elementos mediante consultas al DOM y devolviéndonos un objeto adaptador.

¿Por qué usar esta forma?

La manera de seleccionar los objetos es muy flexible. Se basa en tres formatos, 2 de los cuales son estándar: CSS, XPath y uno propietario (y bastante intuitivo). Se pueden ver acá

A su vez los objetos adaptadores son muy flexibles. Nos permiten manejar los atributos, los eventos, los adyacentes y padres en el DOM, algunos efectos visuales y ajax. Todo esto está muy bien documentado en docs.jquery.com.

¿Cómo empiezo?

Primero hay que bajar la biblioteca. La incluimos en nuestra página mediante:

<script type="text/javascript" src="jquery.js" mce_src="jquery.js">
<script>//mi c&oacute;digo fuente</script>

Una de las primeras cosas que debemos hacer es ejecutar código cuando la estructura del documento está cargada. Esto lo hacíamos con window.onload = function() { … }. Pero había que esperar a que carguen las imágenes. jQuery soluciona esto mediante método $().ready().

$(document).ready(function() { ... })

¿Qué es $()?

Es la consulta propiamente dicha y nos retorna el objeto adaptador. Se le puede pasar un cadena con la consulta, un elemento del DOM o incluso una cadena html que nos genera elementos html en el aire.

Otra propiedad interesante es que los métodos del objeto adapta retornan el mismo objeto (salvo aquellos donde lo que se retorna es un valor, como se verás más abajo). Esto permite encadenar varias acciones sobre los objetos reduciendo las líneas de código.

Para cerrar vamos a mostrar un pequeño ejemplo. Tenemos una lista de títulos y textos descriptivos. Esto podrían ser feeds de un blog. Queremos listar los títulos y ver solo la descripción cuando alguno en particular nos interese.

<ul>
	<li><span>titulo 1</span>
    
Este es el texto de   la descripci&Atilde;&sup3;n colapsable n&Atilde;&ordm;mero 1
    <a href="#" mce_href="#">mostrar</a></li>
	<li><span>titulo 2</span>
   
Este es el texto de   la descripci&Atilde;&sup3;n colapsable n&Atilde;&ordm;mero 2
    <a href="#" mce_href="#">mostrar</a></li>
	<li><span>titulo 3</span>
   
Este es el texto de   la descripci&Atilde;&sup3;n colapsable n&Atilde;&ordm;mero 3
    <a href="#" mce_href="#">mostrar</a></li>
</ul>

El script quedaría de la siguiente forma:

<script>$(document).ready(function(){ //Las etiquetas a que sean contenidas por una etiqueta li $("li > a").click(function() {  //si tienen por rótulo "ocultar"  if ($(this).html()=="ocultar")  {   //ocultan el elemento previo   $(this).html("mostrar").prev().hide("slow");   }  else  {   //sino muestran el elemento previo   $(this).html("ocultar").prev().show("slow");  } 

  return false; }); 

}); 

</script>

De esta manera tenemos descripciones colapsables con pocas líneas. La mitad del espacio son comentarios y llaves para hacer legible el código.

¿Bastante intuitivo, no?

Quería hacer una mención respecto a $(). En otro post dije que las funciones en JavaScript son objetos de tipo Function. Este es un caso. Se puede ver bien en el código como se usa esta función objeto y como final jQuery se puede usar con otras bibliotecas y frameworks JavaScript.

Esto se hace invocando al método $noConflict() del objeto jQuery. De esta manera $() queda libre (por ejemplo para prototype) y con invocar jQuery en vez de $() tenemos la misma funcionalidad.

Con eso ya hay para divertirse. ¡Hasta la próxima!

Objetos en javascript

julio 20, 2007

Los objetos en JavaScript son un tema que siempre me han traído problemas. En este post voy a tratar de ordenar un par de ideas.

Primero que nada podemos definir 3 tipos de objetos (¡no clases!):
– Objetos estándar del navegador: Varían según el navegador. Entre los comunes están Window, document. Mozilla provee XMLHttpRequest, MSIE los propios de ActiveX.
– Objetos del lenguaje: Los objetos de la implementación, como String, Array, Date, etc.
– Objetos propios: Estos son los objetos definidos por nosotros o por una biblioteca en particular.

Los objetos se pueden crear como funciones:

//Definici&Atilde;&sup3;n del objeto, si se quiere la "clase"
function MiObjeto (valor){
  this.unMetodo = function () {
    alert(this.unAtributo);
  }
  this.unAtributo = valor;
}

//instanciando el objeto
var oObjeto = new MiObjeto('hola, mundo!');
var oOtroObjeto = new MiObjeto();
oObjeto.unMetodo();

Con eso tenemos dos objetos en las variable oObjeto y oOtroObjeto construidos según la función MiObjeto(). A su vez tenemos unAtributo que tiene el valor que le pasamos al constructor y unMetodo que imprime el atributo. No es muy útil, pero sirve para mostrar lo básico.

El concepto de clase es un poco ambiguo en JavaScript. Al menos para el que viene de un lenguaje un poco más “prolijo” como Java o C++. En nuestro pequeño ejemplo, la clase sería MiObjeto y la instancia sería oObjeto. JavaScript nos permite extender nuestro objeto. Esto es tan simple como la línea que sigue.

oObjeto.otroMetodo = function ()
{
  confirm('Me entiende?');
}

oObjeto tiene un método nuevo: otroMetodo que nos va a preguntar si lo entendimos. Si invocamos otroMetodo desde oOtroObjeto vamos a comprobar que no nos pregunta nada. Esto se debe a que en la línea de más arriba solo modificamos la instancia oObjeto. Esto es muy interesante y es una fuente de errores. JavaScript nos permite modificar nuestro objeto en “caliente”. Podemos agregar o redefinir métodos existentes y agregar atributos.

¿Pero podemos cambiar nuestras “clase” MiObjeto? Sí, esto se hace mediante el atributo prototype de MiObjeto. La clase se define mediante una función. Las funciones son objetos de tipo Function (sí, suena a traba-lenguas). Podemos agregar atributos y métodos a nuestro objeto Function mediante el atributo protoype:

MiObjeto.prototype.otroMetodo = function ()
{
  confirm('Ahora me lees?');
}

Si probamos invocar ahora oOtroObeto.otroMetodo() vamos a a ver el confirm preguntando si ahora lo lees. Dejo al lector curioso que verifique qué pasa con oObjeto.otroMetodo().

Lo bueno de esto es que nos permite crear clases y objetos, extenderlos o redefinir su comportamiento. En algunos navegadores, como en Firefox, es posible redefinir y extender los objetos estándar. Algunos sin embargo están “sellados” por motivos de seguridad.

Para cerrar voy a hablar de JSON. Yo trabajaba en avatar y un día me pidieron hacer una aplicación que hacía uso intensivo de JavaScript y DOM. Un compañero me recomendó utilizar JSON. JSON es un acrónimo para JavaScript Object Notation y es una manera de definir objetos y funciones en JavaScript así como también un formato liviano de intercambio de datos, como se define en su sitio. Es muy útil como sustituto de XML en algunos casos. En algunas aplicaciones AJAX podemos recibir cadenas JSON en lugar de XML y evitar tener que lidiar con DOM. El framework The Dojo Toolkit es un ejemplo de esto. Pero esto será objeto de otro post, más adelante.

Saludos!

Los números y la Quiniela.

julio 11, 2007

Siempre me han gustado los números. Tal vez porque representan un sistema de valores símbolos al que se le pueden asignar valores y definir reglas. Como las cartas(naipes) y los juegos de cartas.

Pero tal vez el misterio más grande que tienen, a mi humilde entender, es La Quiniela. Este es el juego de azar más popular de Argentina. Es un sorteo de 20 números de 4 cifras sobre el cuál el apostador puede elegir uno, dos, tres o cuatro números y su posición y hacer una apuesta que se multiplica según la exactitud del resultado.

La cosa se puede complicar y ya entra la palabra que solo le escuché a Riverito, la redoblona. La redoblona es cuando se juega a dos pares de números de dos cifras. Esta puede ser por extensión, que vale para cualquier ocurrencia de esos dos números de dos cifras, y también puede ser exacta que es cuando también se apuesta a la posición de esos dos números. Pegar una redoblona exacta puede hacer de un pesito tres mil quinientos.

De todos modos, la manera más común es jugar a números de dos cifras. Tan común es esto que se ha compilado una tabla que nos permite asociar los números con objetos, eventos, personas y hasta momentos de la vida.

No se juega así no más, sino que hay ciertos criterios para escoger el número. Voy a mencionar solo tres.

Números, Fechas y años: este método consiste en asociar componentes de la fecha, aniversarios, cumpleaños, cantidad de años cumplidos y todo compenente numérico de un evento dado. Yo nací el 27 de enero, y cumplí 27 en el 2007, puedo jugar una redoblona al 27, puedo jugar al 27, al 01 y 80. O por ejemplo, mi hermano obtuvo 78 en un exámen con puntuación del uno al cien, siendo cien el mejor resultado; dado que esto es una grata ocasión: el método sugiere ir a jugar al 78.

Eventos, efemérides y la tabla: El azar argento tiene su Piedra Rosetta, esta es la tabla de la Quiniela anteriormente citada. Es seguro que esté en su casa de apuestas amigas, no sea tímido y consúltela. El mecanismo es muy sencillo, al menos en apariencia: diversas situaciones, profesiones y cosas tienen un número asociado. Es cuestión de buscarlo en la tabla. En el ejemplo anterior, mi hermano obtuvo un 78, fue una sorpresa para todos porque mi hermano no suele estudiar mucho. Entonces tenemos dos números: 99 los hermanos y 72 sorpresa. Podemos igual jugarle al 78, pero ahí renunciamos a la tabla. Podríamos hablar entonces de un criterio mixto. Pero ojo que el 78 tiene otro significado. El uso de esta técnica tiene mucho de interpretación, ya que la tabla no incluye todo lo que puede pasar directamente, pero un avezado jugador encontrará mediante la interpretación encontrar el significado numérico de cualquier cosa.

Los sueños: tal vez una de las razones por las cuales el psicoanálisis, la interpretación de los sueños de Freud y la psicología en general hayan calado hondo en nuestra cultura tenga que ver con que hasta en el juego de los números interpretamos sueños. El método se basa en la tabla. Uno sueña que le habló una persona muerta hace años y del susto uno se cae en ese mismo sueño. Bien, con la tabla en la mano vemos que tenemos que jugarle al 56 (la caída) y el 48 (el muerto que habla). Nuevamente, este es un caso directo. El campo de la interpretación es fertil e inacabable.

Desde ya que se pueden combinar estos métodos, sin importar las heterodoxias.

El jugador de Quiniela es constante e infatigable. Algún necio dirá que es un vicio, pero se trata de una cita con los números y la suerte. Hay tipos que están dotados con una suerte de intuición infalible y se financian el vicio. Otros juegan toda la vida, todos los días y no sacan gran cosa. Incluso nada. Pero no se trata de ganar, sino de jugar.

Lo bello en esto es tratar de encontrar guiños del destino en los números. Encontrar un orden allá donde parece que solo hay intemperie y nada.

Peter Capusotto vuelve en Septiembre

julio 10, 2007

Todo concluye al fin, nada puede escapar. Parece que nos quedamos sin Peter Capusotto y sus videos hasta el mes de septiembre. Si bien el programa se va a seguir emitiendo con los mejores momentos (esperamos ver a Pomelo y a Luis Almirante Brown seguido), no van a haber novedades hasta el mes de septiembre. Tranquilos, son solo 2 meses.

Al que tenga un riñón para vender o cualquier otra cosa, puede ir a la trastienda a ver Qué Noche Bariloche con entradas desde $ 50. Pero bueno, Bariloche bien vale 50 guitas.

CakePHP: Bake y ACL

julio 7, 2007

Siguiendo con CakePHP me encontré con una serie de tutorials muy interesantes que se pueden seguir acá registrándote o bien por acá si no querés registrarte en otro sitio más. El último link es a un sitio llamado scribd que merece de por sí solo un post. De entrada podemos decir que se propone ser la biblioteca abierta de documentos más grande del mundo.

Habiendo corregido el tema de scaffold, pude seguir haciendo pruebas y cada vez me gusta más. Pero como bien indica la documentación, el scaffold (andamios) no son más que eso, andamios. Son una base para ir haciendo algo y después ir extendiendo uno y dándole a la aplicación el uso original para el que estaba diseñada. Sin embargo es un buen andamiaje para la obra.

Es posible “exportar” el código del sacffold mediante una herramienta de línea de comandos llamada Bake. Esta se encuentra en cake/scripts/bake.php. Se pueden exportar los modelos, las vistas y el controlador. De esta manera ya tenemos el esqueleto de la aplicación con su index (listado) y un abm. Ahí podemos modificar las views al estilo y funcionalidad que queramos. Hay que tener cuidado de no sobreescribir el trabajo que hayamos hecho en los controladores, por eso es recomenrable hacer primero esta exportación y después trabajar sobre los controladores particulares de nuestra aplicación.

Contento ya con esto, vi otra funcionalidad: las Access Control Lists (ACL o listas de control de acceso) que nos ofrecen un modelo de control de acceso a objetos. La idea es sencilla: por un lado tenemos objetos (usuarios y grupos de acceso) que quieren acceder a otros objetos(artículos, productos, cualquier cosa que queremos regular su acceso). A estos que quieren acceder se los llama ARO u Access Request Objects. Es posible también definir una estructura de arbol que nos permite crear grupos de acceso. A los objetos a los que se quiere acceder se los llama ACO u Access Control Objects. Con estas dos entidades podemos definir un sistema de control de acceso asociando los ARO con los ACO. Esta es una relación muchos a muchos y permite hasta agregar niveles de acceso a determinadas funciones (read, update, create y delete) .

Para el que siga el tutorial de IBM, con la versión 1.1.15.5144 tuve los siguientes problemas:

  • En el código del form de registro de usuarios el tutorial usa para verificar que se haya envíado el form un if y la condición es : (!empty($this->params[‘form’])) y también intenta grabar el objeto con $this->params[‘form’]. Eso no me anduvo. Reemplazando en todos los casos eso por $this->data la cosa sale como trompada de loco.
  • Cuando quise dar de alta los ARO con la herramienta de línea de comandophp acl.php create aro 1 null Users

    sale un error. Esto se corrige reemplazando el null por 0. No es lo más elegante pero funciona. Ya que no debería haber referencia a un item 0.

    php acl.php create aro 1 0 Users

Bueno, con esas dos salvedades, el tutorial es muy recomendable. Hasta la próxima.

CakePHP y django

julio 6, 2007

Estoy haciendo las primeras pruebas con CakePHP y viene bastante bien. Si bien muchas cosas ya las había visto en django, CakePHP no tiene nada que envidiarle.

Ambos son dos frameworks basados en MVC. Al parecer ambos muy parecidos a Rails, aunque todavía no he tenido el gusto de jugar con este.
MVC significa, muy por arriba, Modelo Vista Controlador. Si bien django se declara MTV, variante Modelo Template View, la idea es muy similar.

Ambos manejan Modelo como un ORM. Respecto al Modelo CakePHP se basa en extender una clase llamada AppModel que nos provee las funcionalidades CRUD. Esto es similar a los Models de django que heredan de models.Model. Lo más cómodo de CakePHP es que interpreta solo las tablas de la base de datos, si seguimos cierta nomenclatura. También me gusta más la manera que se definen las relaciones. Por otra parte, django tenía las factories de campos y generaba las tablas a partir de cómo había armado el “Modelo”. No digo que una cosa sea mejor que la otra, digo que me gusta más trabajar así.

Los controladores ya no tan son parecidos. Los controladores de django las “views” eran funciones que recibían el request y los parámetros. Para que estos views funcionaran había que asociarlos con una regla de rewrite (idénticas a las de Apache), requería definir a mano un dispatcher (siempre que no se usen genéricos). Estos retornaban un review e indicaban el template al que se asociaban. En CakePHP por cada modelo tengo que definir una clase que hereda de una clase AppController. Definiendo un método para esta clase ya tengo hecho el despacho. Estos métodos se llaman actions.

Las vistas son tal vez el punto más divergente. Es que django tiene su propio sistema de Templates (o Maquetación). Este era un poco extraño al principio, pero con un par de pruebas se terminaba manejando. CakePHP tiene un sistema de Templates que es medio un no-sistema de templates: son tags php los cuales utilizan variables y objetos que se le pasan desde el controlador. No es que en django no pase algo similar, sino que esto es casi como programar los templates en php. En esto me recuerda bastante a este artículo donde se charla acerca de la utilidad de los templates. Así que no hay nada raro en el sistema de templates, los tags y los foreach para iterar listas.

Lo que se extraña es el admin de django. Y estoy medio frustrado porque todavía no pude hacer andar los scaffolds (andamios). Al parecer son como los generics views de django.

Otra cosa que me gusta más de django es el concepto de aplicación bien esquematizado por directorios namespaces. Y de ahí vienen las ventajas de django de estar basado en python que es mucho más elegante como lenguaje orientado a objetos que php. CakePHP utiliza un árbol de directorios donde guardo las vistas en un directorio, los modelos en otro y los controladores en otro más. Si bien hay maneras de separar, esta todo apilado.

Pero irónicamente, la fortaleza de CakePHP es estar desarrollado en php. Y encima compatible con php4 y php5. No voy a entrar en la gran discusión acerca de las ventajas y las limitaciones de php y su relación con los objetos.

Acá en Argentina es mucho más sencillo encontrar hostings que soporten php que python. De hecho prácticamente todos soportan php. El despliegue de django en cambio requiere modificar la configuración de Apache y cargar un módulo más, cosa que pone los pelos de punta de los proveedores de hostings.

Y a nivel global, php sigue siendo el lenguaje web más extendido, no sé si por su flexibilidad o su sencillez, pero creo que tiene mucho que ver la gran comunidad que lo respalda y trabaja con él. La documentación es amplia, todo lo que te puede pasar ya le pasó a alguien. En eso CakePHP me parece que tiene mucho campo para crecer.

Luis Almirante Brown

julio 5, 2007

Luis Almirante Brown es de esos artistas necesarios, que han tratado de llevar la poesía más, si se quiere, excelsa a las mayorías.

Cito uno de sus poemas / trovas:

No tengo brújula para tu viaje,
hoy no hago pacto con tus demonios,
demonios azules

Papeles rotos sobre el mantel
y yo acá no tengo nada,
no tengo nada…
y sin embargo lo tengo todo
ya tu espejo no tiene imagen
en tu mente una música se esboza

vení a tocar mi flauta venosa
acá tengo mi flauta venosa
soplala despasito
ponele los deditos
y a gozar mi flauta venosa
hace sonar a mi flauta venosa.

Lo pueden ver algunos lunes a las 23 hs en Canal 7

Tal vez Luis y Pomelo son caras de una misma desconfianza por el gusto popular. Luis en un ambiente canaláoso y Pomelo con su manager Tony Sorete son ejemplo de arte fabricado a la medida de lo que se espera de su público.
Es innegable que esto funciona en las finanzas. Pero da la sensación de que en algún lado se ha perdido el corazón.

Por suerte tenemos Capusotto.

Saludos.
Miguel