Geek & Roll » programacion

Programando con Ext: Formularios

Cesar January 23rd, 2008 1 comentario

ExtExt 2.0 es una gran librería de propósito general para JavaScript. Nos sirve tanto para efectos, como para GUI y lo que se necesite para construir aplicaciones Web bonitas, consistentes entre navegadores y con llamadas asíncronas al servidor de manera rápida y más sencilla que “a mano”.

Lo que vamos a ver ahora es cómo construir un formulario, validarlo, y enviarlo al servidor. Ya antes vimos como llenar un formulario automáticamente con datos que vienen del servidor, pues lo que vamos a hacer ahora es lo contrario: el usuario llena el formulario y nosotros lo enviamos al servidor para ser procesado y guardado. Es más fácil de lo que parece, veamos: Leer el resto de este post.

Microsoft Volta vs GWT

Cesar December 11th, 2007 3 comentarios

Volta es algo asi como la respuesta de MS a Google y su GWT. Se trata de un toolkit para crear aplicaciones que corran en Web o el escritorio utilizando cualquier lenguaje soportado por el CRL de .NET, eso quiere decir que podemos programar en cosas como IronPython por ejemplo.

Aún en fase beta, Volta promete mucho y entrega poco. Cuando la aplicación demo mide más de dos megas, incluye código de compatibilidad específico para cada navegador sin importar el que tú uses, además de hacer 17 peticiones HTTP al inicio (slow start recuerden amigos) no puedo más que recordar que la mayoría de esos problemas GWT los tiene resueltos, claro no desde sus inicios y claro Volta está en beta. Ya veremos si GWT tiene competencia seria.

Quien necesita soporte para todos los lenguajes del CLR si tienes a Java? (es broma)

Llamadas asíncronas (AJAX) con Ext

Cesar November 28th, 2007 1 comentario

Ext (disponible en la Web Extjs) es una librería Javascript bastante completa con la que podemos hacer desde bonitos efectos para la interfaz gráfica, hasta llamadas asíncronas al servidor (AJAX) de una manera muy sencilla como veremos a continuación. Definitivamente la parte que más me gusta de Ext es la manera en la que se hace una petición de datos al servidor y cómo maneja estos datos una vez que llegan al cliente. Pero basta de palabras, vayamos al grano.

Ext Form Supongamos que tenemos un formulario como el que se muestra en la imagen y queremos llenarlo con datos proveniente de una base de datos pero de manera dinámica (con AJAX, sin hacer refresh). Pueden utilizar sólo Javascript y manejar todas las incompatibilidades de los navegadores por su cuenta, y pueden usar una librería como Prototype que también es muy buena (y de hecho Ext tiene la opción para usarla) o, podemos usar Ext y facilitar tanto el código del lado del cliente como del lado del servidor. En Ext se usa el concepto de Data Stores que son objetos que nos facilitan el acceso a datos con un formato específico, y que después podemos usarlos para llenar por ejemplo una tabla, o un combo, o cualquier cosa. Para crear un Data Store:

  1. var marker_data = new Ext.data.Store({
  2.         proxy: new Ext.data.HttpProxy({url: ‘marcadores.php?accion=obtMarc’}),
  3.         reader: new Ext.data.JsonReader({},[ ‘id’, ‘nombre’, ‘direccion’, ‘latitud’, ‘longitud’, ‘descRed’, ‘descAmp’, ‘numCuartos’, ‘numBanos’, ‘tamano’, ‘colonia’, ‘precio’, ‘enlace’]),
  4.         remoteSort: false
  5. });

Dentro del Data Store estamos creando otros dos objetos: HttpProxy y JsonReader. El primero nos sirve para indicarle la URL que nos regresará los datos que necesitamos, y el segundo es un objeto que, como su nombre nos indica, nos sirve para consumir datos en formato JSON. Esto es muy conveniente ya que, al estar usando JSON, podremos evaluar la respuesta del servidor, convertirla a un objeto Javascript y accesar sus propiedades como lo hacemos con cualquier otro objeto (aunque Ext hace este trabajo por nosotros automágicamente).

Ya que tenemos el Data Store, ahora hay que indicar que pasa una vez que los datos llegan al cliente:

  1. marker_data.on(‘load’,function(){
  2.         fillForm(marker_data);
  3. });

Aquí solamente estamos tomando el objeto marker_data que creamos anteriormente (el Data Store) y le asignamos un manejador de evento. El evento es “load”, es decir, cuando se cargan los datos, y le estamos asignando una función anónima que a su vez llama a otra función (fillForm) que no voy a mostrar aquí por motivos de espacio pero que simplemente toma los valores regresados por el servidor y llena el formulario. Por último hay que decirle al Data Store que haga la llamada y pida los datos:

  1. marker_data.load();

Eso es todo. Al recibir todos los datos del servidor se ejecutará la función creada anteriormente. Donde esto brilla es en la parte del servidor, especialmente si antes utilizabas XML para regresar datos. Siguiendo el mismo ejemplo, el código del servidor en PHP quedaría de la siguiente manera:

  1. $query = mysql_query(“SELECT * FROM marcadores”);
  2. if(!$query){
  3.         die(‘No se pudo conectar a la base de datos: <br />’.mysql_error());
  4.         mysql_close();
  5. }else{
  6.         $arr = array();
  7.         while($obj = mysql_fetch_object($query))
  8.                 $arr[] = $obj; 
  9.         Echo .json_encode($arr).;
  10. }

Bastante sencillo ¿no? aprovechando la función json_encode de PHP enviamos la respuesta con el formato que Ext la espera. Una vez en el cliente podemos utilizar estos datos así:

  1. marker_data.getAt(0).data.colonia

Este objeto una vez que se invoca el método load contiene los datos regresados por el servidor. Utilizando el método getAt y la propiedad totalLength podemos iterar los resultados sin mucho esfuerzo. Y no hay más que decir del tema, Ext simplifica bastante el desarrollo de aplicaciones Web con Javascript y nos permite abstraer cosas como evaluar cadenas JSON o parsear respuestas en formato XML, así como también despreocuparnos por las incompatibilidades entre los diferentes navegadores. Por el lado malo, la documentación es bastante completa pero a mi ver le hacen falta más ejemplos para poder aprender a utilizar la librería de manera más rápida.

Aplicaciones grandes con Javascript

Cesar November 23rd, 2007 3 comentarios

Programar aplicaciones grandes (no triviales) con Javascript es un gran PITA. A aquellos que se dedican a hacer esto (por gusto, trabajo o masoquismo) ¿Cual es el principal problema de la dependencia de Javascript en las nuevas aplicaciones Web? ¿Que librería o framework prefieren (si es que usan una)? ¿Cual es la desventaja de otras tecnologías (GWT, Flash, Silverlight, Flex) frente a Javascript? y por último ¿Que debería tener el lenguaje para mejorar la experiencia del programador?

Navaja suiza de desarrollo

Cesar October 26th, 2007 13 comentarios

Leyendo un hilo de comentarios bastante interesante sobre un post pasado me llegó la idea de postear sobre nuestros ambientes de desarrollo. En repetidas ocasiones platicando con otros programadores me encuentro con verdaderas joyas de software escondidas que hacen nuestro trabajo más agradable. Claro que dependiendo de lo que uno haga (desarrollo web, diseño, programación de escritorio, de móviles, embebida, especializada, etc) será el toolkit que utilice así que aquí trataremos de recopilar la mayor parte ¿ok? Yo empiezo:

Eclipse: El IDE por excelencia. Si de plano necesito usar un IDE, primero volteo a ver a Eclipse y me pregunto si con un plugin se puede hacer lo que yo quiero. Es algo pesado en el uso de los recursos por lo que mucha gente prefiere no usarlo, pero aún no me encuentro algo mejor para desarrollo con Java o para Google Web Toolkit.

Kate: Mi editor de texto favorito. Con todas cosas que un buen editor de texto debe tener, y más. Cuando voy a hacer programación con otro lenguaje que no sea Java, casi siempre Kate es mi ambiente de desarrollo.

Firebug: Ya he hablando bastante de esta extensión de Firefox, pero no la podía dejar pasar. Si vas a programar en JavaScript, Firebug más que un lujo es toda una necesidad.

Linux+Apache+MySQL+PHP+PHPMyAdmin: La pila que utilizo para desarrollo Web. Linux es mi sistema operativo de elección, Apache como servidor Web, MySQL como base de datos administrada con PHPMyAdmin, y por último PHP como lenguaje del lado del servidor. Nada me gustaría más que sustituir PHP por alguna otra cosa, pero mientras JSP no sea el estándar en el Web, me tengo que hacer a la idea de que PHP es un mal necesario.

Lo que aún me falta por encontrar es un buen entorno de desarrollo para Python (que me de la misma funcionalidad de Eclipse con Java por ejemplo) y para PHP. Python me parece un lenguaje interesante, pero aún no he encontrado ese sweet spot para sentirme cómodo a la hora de programar. Con PHP siento que estoy programando en la época de las cavernas, ya que a falta de un depurador me veo forzado a andar imprimiendo valores y adivinando que es lo que sucede.

Una lista para nada extensa, quisiera leer las sugerencias de todos los developers que nos visitan, sea cual sea el desarrollo que hagan.

Creando un feed RSS con PHP

Cesar September 18th, 2007 3 comentarios

Con eso del Web 2.0, RSS se puso de moda. Ahora todos quieren un feed RSS en su sitio pero ¿Cómo podemos crear un feed RSS con PHP?

Un feed RSS no es más que un documento XML con cierto formato, en el cual se agregan nuevas entradas cuando el contenido del sitio cambia. Para propósitos de este tutorial vamos a usar ATOM como formato del feed. Existen otros, pero ATOM es estándar de la IETF además que el gran oráculo de Internet lo usa en sus aplicaciones. Un documento ATOM se ve algo así (tomado de la Wikipedia):

  1. <?xml version=“1.0″ encoding=“utf-8″?>
  2. <feed xmlns=“http://www.w3.org/2005/Atom”>
  3.     <title>Example Feed</title>
  4.     <subtitle>A subtitle.</subtitle>
  5.     <link href=“http://example.org/feed/” rel=“self”/>
  6.     <link href=“http://example.org/”/>
  7.     <updated>2003-12-13T18:30:02Z</updated>
  8.     <author>
  9.        <name>John Doe</name>
  10.        <email>johndoe@example.com</email>
  11.     </author>
  12.     <id>urn:uuid:60a76c80-d399-11d9-b91C-0003939e0af6</id>
  13.  
  14.     <entry>
  15.        <title>Atom-Powered Robots Run Amok</title>
  16.        <link href=“http://example.org/2003/12/13/atom03″/>
  17.        <id>urn:uuid:1225c695-cfb8-4ebb-aaaa-80da344efa6a</id>
  18.        <updated>2003-12-13T18:30:02Z</updated>
  19.        <summary>Some text.</summary>
  20.     </entry>
  21.  
  22. </feed>

Para hacernos la vida más fácil, vamos a crear una clase en PHP que nos haga todo el trabajo repetitivo. La clase se va a encargar de mantener el documento XML y cada vez que se agregue contenido a nuestro sitio, agregará una nueva entrada y eliminará la más antigua si es necesario (en mi caso definí 15 entradas como máximo). Primero definimos el encabezado del documento y la tag que cierra:

  1. $atomheader =   ‘<?xml version="1.0" encoding="utf-8"?>’.
  2.         ‘<feed xmlns="http://www.w3.org/2005/Atom">’.
  3.                 ‘<title>Mi Super Blog</title>’.
  4.                 ‘<link rel="alternate" type="text/html" href="http://superblog.blogspot.com" />’.
  5.                 ‘<modified>’. date(‘Y-m-d\TH:i:s-07:00′).‘</modified>’.
  6.                 ‘<author>’.
  7.                         ‘<name>superblog@gmail.com</name>’.
  8.                 ‘</author>’;
  9.  
  10. $atomfooter =   ‘</feed>’;

Después lo que vamos a hacer es verificar si el feed tiene entradas. En caso de no tener entradas solamente despliega la nueva entrada. Si ya tiene entradas agregamos la nueva al inicio y le adjuntamos las 14 previas, de esa manera nos aseguramos que el orden sea cronológico inverso, es decir, las más nuevas primero:

  1. $entries[] = $content;
  2.  
  3. /*Si hay entradas previas las combina con la nueva. Si es la primera entrada solamente despliega esa*/
  4. $filecontent = @file_get_contents($fname);
  5. if($filecontent == ){
  6.         $result = $entries;
  7. } else {
  8.         $entries2 = unserialize($filecontent);
  9.         $entries3 = array_slice($entries2,0,13);
  10.         $result = array_merge($entries,$entries3);
  11. }

Lo que pasa dentro del else es lo siguiente: como hay entradas anteriores, primero metemos las entradas anteriores al arreglo llamado entries2, eso sucede con la instrucción unserialize. Unserialize lo que hace es tomar un arreglo serializado (guardado en un archivo en el disco duro) y convertirlo de nuevo a su representación como arreglo. La variable filecontent tiene todo el contenido del archivo de serialización. Luego array_slice parte el arreglo obtenido de la serialización, para quedarnos con las primeras 14 entradas. Por último array_merge combina la nueva entrada con las 14 anteriores y lo pone todo en la variable result.

Lo que resta es escribir el encabezado, el contenido del arreglo result y la tag de finalización al archivo XML, y serializar el arreglo result a disco para que todo se encuentre en sincronía. Para agregar contenido en nuestro canal, es algo como lo siguiente:

  1. $newentry = utf8_encode(‘<entry>’.
  2.         ‘<title>El título de mi nueva entrada</title>’.
  3.         ‘<link rel="alternate" type="text/html" href="http://superblog.blogspot.com/nueva_entrada" />’.
  4.         ‘<issued>’.date(‘Y-m-d\TH:i:s-07:00′).‘</issued>’.
  5.         ‘<modified>’.date(‘Y-m-d\TH:i:s-07:00′).‘</modified>’.
  6.         ‘<author><name>Autor del superblog</name></author>’.
  7.         ‘<id>’.$id.‘/’.time().‘</id>’.
  8.         ‘<summary type="text/html" mode="escaped">Aqui va el contenido de la nueva entrada, puede ser HTML</summary>’.
  9. ‘</entry>’);
  10.  
  11. rss::newEntry($newentry);

Eso es todo, con eso tenemos nuestro archivo xml con las nuevas entradas listo para ser consultado por terceros. Pueden descargar la clase completa para usarla en sus proyectos desde acá.

Edit: Gracias a Pablo por su apoyo técnico y moral al estar programando esto.

Nintendo abre la plataforma de desarrollo para el Wii: WiiWare

Cesar June 28th, 2007 3 comentarios

Nintendo ofrecerá la plataforma de desarrollo para el Wii, a todas aquellas personas que deseen crear contenido nuevo, original e independiente para el Wii. Similar a lo que hace actualmente Microsoft con su Xbox 360, los que programen contenido para el Wii con WiiWare podrán venderlo en el canal de compras del Wii.

Lo interesante es poder utilizar esos controles que tanto han dado de que hablar para el Wii, y probar nuestras ideas sobre juegos originales con todo el potencial que tiene la consola.

El comunicado de prensa, Si no fuera por la cofradía, no me entero.

Ese sí es pa’ Hombres.

Axel May 24th, 2007 3 comentarios
El ASP Rules… el código revuelto con el HTML, ese si es lenguaje para hombres. Armando Gutierrez

Google Maps, Google Web Toolkit, y yo

Cesar March 22nd, 2007 21 comentarios

Inspirado por un post de mi buen amigo Adrian Chavira, me dispuse a crear un demo de como utilizar la API de Google Maps utilizando Google Web Toolkit porque no me gusta salir de la comodidad que es Java.

Podríamos utilizar JavaScript desde Java pero eso le quita el encanto a todo, así que mejor utilizamos una extensión a GWT que nos empaqueta la funcionalidad de la API de mapas de Google para así seguir utilizando Java con los mapas.

¿Suena fácil? es porque lo es… Continúen leyendo en una exclusiva más de Geek&Roll. Leer el resto de este post.

Try Ruby!!

Adrian March 15th, 2007 1 comentario

Han probado Ruby??… para los que no saben -como yo hasta hace unos días- “Ruby es un lenguaje de programación open source dinámico que posee un enfoque de simplicidad y productividad”.. o más bien con ese argumento es promocionado.

Remontemonos a su historia ….wikipedia nos cuenta que…

Ruby es un lenguaje de programación reflexivo y orientado a objetos creado por el programador japonés Yukihiro “Matz” Matsumoto en 1993. Combina una sintaxis inspirada en Python, Perl con características de programación orientada a objetos similares a Smalltalk. Comparte también funcionalidad con otros lenguajes de programación como Lisp, Lua, Dylan y CLU. Ruby es un lenguaje de programación interpretado en una sola pasada y su implementación oficial es distribuida bajo una licencia de software libre.

A todo esto y para aquellos que les llame la atención este lenguaje, hagan la prueba programando en Ruby a travez de un interpretador en línea buenisimo (Try Ruby) , el cual también nos ofrece un tutorial guiado para aprender las bases.

No les puedo prometer que se asombraran pero para aquellos que viven o gustan de la programación les servira como una buena experiencia de aprendizaje (como lo fue en mi caso) .

Posts anteriores Posts recientes

Busca

Categorías

Meses