Author Archives: admin - Page 4

Como programar (decente) en PHP

El viernes un cliente me pidió un favor de ayudarle a terminar de instalar un script de un amigo en su servidor. 

Todo parecía ser un simple problema con la importación de MySQL por los acentos, aunque eso solucionó parcialmente aún tenía un error en la parte medular del sistema, en cuanto abri el archivo que estaba dando el error me arrepentí de hacerlo y mi mente se volcó a recordar hace cinco años o tal vez seis cuando se programaba de esa manera =)

Con ese ejemplo me vino a la mente una frase célebre de mi buen amigo Nexus en esas épocas cuando estaba aprendiendo a programar en PHP, mi geek interno terco siguió programando con las antiquísimas $HTTP_POST_VARS a pesar de que se habían desalentado utilizar esas variables y se reemplazó por las variables tipo: $_POST ó $_GET

Recuerdo que cuando Nexus vio un código mio que tenía el $HTTP_POST_VARS me dijo en un chat con (me parece Carlos Cortez): “Programas a la manera viejita jajajaja”. Claro por orgullo después de eso nunca volví a tocar $HTTP_POST_VARS

Aqui tengo unos consejos para que no solamente sea fácil programar, depurar y para otros leer tu código. También para evitar que PHP siga siendo visto como un lenguaje de “bajo presupuesto” (por aquello que muchos prefieren Java por lo ‘empresarial’)

 

Tip: PHP dejó de ser un lenguaje de Script hace años

Lo digo en completo tono sarcástico, si bien PHP no se puede compilar no hay razón para meter todo dentro de un solo archivo como print’s con funciones, prácticamente se debe separar de preferencia en un modelo MVC si no puedes hacerlo, entonces al menos hazlo en VE (Vista-Espaguetti donde vas a meter tanto modelo como controlador)

 

Tip: register_globals está muerto

Por eso me dio miedo abrir el archivo, necesitaba register_globals. Para el que no sepa que es register_globals es simplemente que cuando mandamos parámetros a un script como por ejemplo: prueba.php?variable1=hola&variable2=mundo PHP convierte automáticamente esas dos variables en $variable1 y $variable2 con su respectivo contenido.

Qué fácil, ¿No?. Pues en realidad no, cuando el mundo no se percataba del error fatal de hacer esto, parecía que PHP era tan fácil de programar, vaya no necesitabas ni siquiera  vincular los parámetros.

Poco después un balde de agua fria cayó sobre todos nosotros… el problema es que cualquier tipo con algo de sesos puede simplemente pasar variables y asignar valores de la aplicación. En el caso de una aplicación que no inicializara las variables (el 99% para ser sinceros) podía sufrir porque era fácilmente “hackeada” sin necesidad de hacer mucho.

Por eso rápidamente se eliminó register_globals y se dejó como un parámetro opcional, pero muy opcional. Tanto que en PHP 6 va a desaparecer definitivamente. 

register_globals no ayuda, no hace más rápido el desarrollo; simplemente destruye todo lo bueno que podría tener una aplicación, porque en primer lugar es difícil saber cuales variables son parámetros del usuario y cuales son variables internas. También hace fácil explotar un sistema (creo que ya lo había dicho ;) ).

La solución para esto… reescribe tu aplicación.

 

Tip: die() está muerto

¿Alguien se ha preguntado porqué existe esta construcción del lenguaje de PHP?, supongo que es un legado de los viejos días cuando PHP era un lenguaje de script.

die() permite simplemente eso: hace que el script muera. Muchos lo hacían para verificar una situación intolerable como al abrir una conexión a una base de datos y que no se pudiera conectar; como no se pueden mostrar datos entonces simplemente le decimos al usuario: “perdon pero aqui nos detenemos” un ejemplo es el siguiente:

<?php
    mysql_connect($host, $usuario, $password) or die('No pude conectarme a la base de datos');
?>

¿Cuál es el problema?, muy simple la función die funciona tan perfectamente que el script se muere ahi. Por lo que el usuario simplemente verá una pantalla blanca con un texto críptico. En el peor de los casos mostrará una parte de la página y la “cortará” donde se haya ejecutado esta instrucción.

No seas perezoso, utiliza construcciones de if() para separar bloques de instrucciones en vez de suicidarte.
Si aún así quieres hacer un die() o un exit() al menos manda a llamar a una plantilla especial que muestre el error con la mayor parte del mismo estilo de la página que vas a mostrar, te lo agradecerá el usuario.

 

 

Tip: include y require es un arma de dos filos

También un legado de aquellos días es que un script luzca como:

<?php include 'cabecera.php'; ?>
<?php print "Hola mundo 'plantilla'; ?>
<?php include 'pie_pagina.php'; ?>

En aquellos días estas eran nuestras plantillas, cabecera.php mostraba el código inicial de HTML y pie_pagina.php cerraba ese código HTML, qué facil, ¿verdad?

Pues no, el problema de este método es que en primer lugar las variables son globales y compartidas, por lo que si haces el código espaguetti anterior es un total NO.

Por ejemplo es fácil sobreescribir variables dentro de un archivo “plantilla” y el error se propaga a las otras “plantillas”.

Otro problema es que hacen difícil seguir un flujo real de plantillas (si no quieres una parte tienes que reescribir todo en lugar de simplemente cambiar por ejemplo la distribución de los objetos en una plantilla general. También es fácil de romper todo el HTML por una etiqueta fuera de lugar

Una vez más, no seas perezoso y utiliza un manejador de plantillas como Smarty

Ahora bien del lado de programación un include() por lo regular es utilizado para incluir pedazos de código tales como funciones, clases, etc. Pero lamentablemente también es utilizado para incluir pedazos de código que tienen el mismo uso que funciones!!

Eso es algo totalmente prohibido, no se porque no utilizas funciones o mejor aún una clase.

 

Tip: mysql_connect y sus vicios

Un legado también de aquellos días es que se programaba de la siguiente manera:

<?php
include 'configuracion_db.php';
mysql_connect($host, $usuario, $password) or die('No pude conectarme a la base de datos');
?>

donde configuracion_db.php era simplemente:

<?php 
$host = 'localhost';
$usuario = 'mi_usuario';
$password = 'mi_password';
?> 

El primero se incluia prácticamente como cabecera para todas las páginas porque necesitaban acceso a la base de datos, y también se incluia dentro de otros bloques dentro de la misma página.

O peor aún, incluir en cada archivo los parámetros de configuración. Esto último es simplemente un caos y es no saber programar, así que toma un curso de programacion básica en otro lenguaje antes de programar en PHP ;)

Para el primer caso si bien es válido, es simplemente malo debido a que otro script puede fácilmente sobreescribir esas variables (o el mismo script por error). Aunque es utilizado, es muchísimo mejor utilizar un patron de diseño llamado: Singleton

El Singleton es un patron de diseño muy simple, en términos de orientación a objetos es un método estático de una clase que regresa siempre la misma instancia de la clase. Es decir solamente existirá un objeto en todo el sistema y que lo creará ese método estático normalmente llamado: obtenerInstancia()

En lenguaje de funciones es simplemente una función que regresará la misma variable (tendrá la misma dirección de memoria) cada vez que se llame, así que en lugar de hacer el primer ejemplo utiliza este:

<?php
function obtenerConectorMysql() {
     static $conector_mysql = null; 
     if ($conector_mysql == null) {
         //aqui insertar las instrucciones para obtener el host, usuario y password, 
         // por ejemplo de un archivo o simplemente escribirlas aqui
         $conector _mysql = mysql_connect($host, $usuario, $password);
     } 

     return $conector_mysql;
}

 

Esto simplemente crea la primera vez que se llame el conector_mysql, después simplemente lo regresa por lo que no se crean diferentes instancias, es la misma conexión a MySQL

Si lo quieres hacer mediante clases, puedes utilizarlo algo similar como una llamada a una función estática o “envolverlo” en la clase que tengas para manejar la base de datos.

Tip: La seguridad no es para sitios de comercio o bancos solamente

Mucha gente piensa que debe hacer “seguro” un sitio solamente si va a tener operaciones monetarias. Nada más fuera de la realidad. 

Todos los sitios necesitan seguridad para evitar que los ataques logren su resultado: hacer “explotar” la aplicación.

Evitando los errores más comunes tendrás una aplicación que si bien no es tan segura como la de la CIA (lease con sarcasmo) evitará el 90% de los ataques comunes.

  1. Al desarrollar una aplicación, recuerda que el usuario no es de fiar, por lo que todo lo que provenga del usuario puede ser alterado
  2. Siempre verifica la información que el usuario envió mediante parámetros. Si es posible restringe mediante un arreglo de valores válidos, si no es posible entonces haz muchas verificaciones, por ejemplo en el caso de un archivo, elimina caracteres peligrosos como: ‘..’ o ‘/’ que pueden hacer que el sistema lea (o incluso escriba) un archivo muy diferente al planeado.
    Esto se hace indispensable si vas a utilizar una función poderosa como include() o acceso al archivo (como fopen() )
  3. Nunca pongas datos importantes en una cookie, utiliza sesiones. Si lees datos de una cookie nunca asumas que por ser cookie es dificil de alterar
    Si los datos van a “perdurar” más alla de una sesión, entonces deja en la cookie un identificador único y guárdalo en la base de datos, de esta manera el usuario solo debe proveer su identificador y no otra información que pudiera ser alterada. 
  4. Siempre “escapa” las variables que vas a utilizar en una consulta a la base de datos, utiliza funciones como: mysql_escape_string(), si utilizas un framework la mayoría de ellos tienen una función para hacer esto (que terminan llamando a algo similar a la primera función)

 

Tip: PHP5 no es una opción, es obligatorio >=)

No veas a PHP5 como una “extensión” o una versión más. El propósito de PHP5 es hacer una transición entre el mundo de scripts de código espaguetti a un sistema de clases muy bien separadas.

Aunque PHP5 aún permite programar sin clases y con solo funciones; si tienes la oportunidad no dudes en utilizar PHP5 con clases con todo lo nuevo que trae. La guia de estudio de Certificación Zend es un buen inicio. 

PHP5 tiene un gran potencial y está esperando para ser plenamente utilizado, algunos frameworks ya están utilizando plenamente su potencial, entre ellos Zend Framework que es altamente recomendable.

 

Último tip: MVC es lo único para web ;)

Si vas a desarrollar una aplicación en PHP que contenga todo lo que una aplicación web contiene (contenido en HTML, bases de datos, procesamiento, etc) simplemente utiliza un framework que tenga un diseño de MVC; los más conocidos son Zend Framework (mi recomendación nuevamente) y CakePHP, también están otros en rápido ascenso como Simfony y Code Igniter

También son de uso popular los CMS como drupal y joomla/mambo, aunque ellos no proveen directamente el modelo MVC si proveen el modelo Vista-Espaguetti por lo que con un poco de trabajo extra puedes lograr algo similar a MVC

 

En resumen PHP es un lenguaje muy poderoso y con historia; por lo que es fácilmente quedarse con las primeras formas de programar, pero con todos los nuevos desarrollos ahora si se puede empezar a hablar de un PHP a nivel empresarial (ya formalmente ;) )

 

Cancion del dia – Susan Tedeschi – Just won’t burn

Una excelente cancion de Blues, a ver si al pollo se le quita el gusto por ese insipido Jazz >=)

Consejo para actualizar la hora y fecha en Linux

Aqui les dejo un comando cuya finalidad es actualizar la hora y fecha actual utilizando un servidor de tiempo (ptocolo NTP):

/usr/sbin/ntpdate time.nist.gov

obviamente necesitan privilegios de administrador para ejecutarlo y necesitan que su configuración de linux esté en la zona horaria correspondiente

Advertencias tontas

El tema de las advertencias “tontas” es ya muy viejo y bastante parodiado, por ejemplo en un capítulo de Los Simpsons cuando un cometa está a punto de chocar contra Springfield (Capítulo El Cometa de Bart), se dispara un cohete que tiene la Advertencia: “No apunte directamente a la cara” =P

Sin duda este tipo de advertencias son un producto de los manuales demasiado explícitos que rayan en la estupidez del usuario (que obviamente todos los amigos que han trabajado en “Call Centers” pueden verificar que si son necesarios =P) pero eso será tema de otro post

  • Píldoras para dormir: Advertencia, puede provocar somnolencia
  • Bolsa de Cacahuates: Advertencia contiene cacahuates (los alérgicos al cacahuate despistados que compren una bolsa de cacahuates podrán estar ahora prevenidos ;) )
  • Secadora de pelo: No se use mientras se esté bañando
  • Alaciador de pelo: Este producto contiene plomo. Lave todas las áreas que tengan contacto con el alaciador después de su uso ( y después lo vuelves a alaciar ;) ).
  • Frasco de jarabe para niños: No ingiera alcohol o maneje, no se tome si está embarazada o en lactancia (claro para esos niños precoces)
  • Extinguidor de fuego: Advertencia, no flamable
  • Líquido para encender parrilladas: Peligro, flamable (jejeje)
  • Disfraz de Superman: No permite volar a la persona que lo use (… sin palabras …)
  • Luces de Navidad: Solo para uso exterior o interior (que pena yo lo iba a usar en el ‘medior’)
  • Navaja para afeitar desechable: No se use en terremotos
  • Parasol de coches: No se maneje el carro con el parasol puesto
  • Veneno para rata: No para consumo humano (le falto que es mejor usar una pistola :P )
  • Secadora: No se opere mientras está dormida
  • Cerillos: Puede causar fuego (con razón…)
  • Paquete de Sal en McDonalds: La sal contiene sal
  • Plancha: No se use la plancha sobre la ropa que estés vistiendo
  • Enchinadora de pelo (alias Plancha de pelo ;) ): No se inserte en ningún orificio del cuerpo
  • Escopeta: Peligro, disparar el arma contra una persona puede causarle heridas o la muerte
  • Lata de comida para gatos: No hecha para humanos. No se use como comida regular
  • Bloqueador de sol: Para uso externo solamente (si te quiere broncear un pulmón no puedes…)
  • Motosierra: Peligro no intente detener la sierra con las manos
  • Horno de microondas: No se use para secar mascotas ( esto me recuerda a una frase de Homero: ‘¿Ves Marge? por mi ya advierten’ )
  • Cepillo para limpiar retretes: No se use en la boca
  • Lámpara de lava: Tomar alcohol y/o drogas NO hará que la lámpara se vea más psicodélica. En su lugar tu cabeza explotará
  • Juego de cuchillos japoneses: Advertencia, no se use en sus niños
  • Enjuage bucal: en caso de ingestion accidental llame a un centro de control de envenenamiento rápidamente (quisiera saber la marca para nunca usarlo :S)
  • Cartucho de Toner: Advertencia, no se coma el toner
  • Espray de auto-defensa que irrita los ojos: Puede irritar los ojos
  • Envase de líquido antisarro: No reutilice el envase para guardar bebidas
  • Patín del Diablo: Este producto se mueve cuando se utiliza, tenga precaución y sentido común cuando se utilize

Ejemplo de API de Yahoo/Weather.com

La pagina de Yahoo developers tiene el API de Weather.com (que compro hace tiempo), Weather.com ya tenia un xml que ha simplificado Yahoo.com

Esta API nos permite obtener informacion del clima de practicamente cualquier lugar del mundo y sin duda es muy utilizada para varios widgets dentro de páginas o como widgets de escritorio.

Básicamente para usar esta API se hace una llamada a la siguiente dirección:
http://weather.yahooapis.com/forecastrss?p=CODIGO&u=c

Donde código puede ser un Código Postal de Estados Unidos, o un ID de una ciudad en el mundo, el API de yahoo developers, dice brevemente que para conseguir este ID se necesita ir a la página de Yahoo Weather y copiar de la URL el código de la ciudad.

Esto es realmente muy malo ya que lo que se busca es optimizar, pero ahi entra el API viejo de Weather.com, donde podemos enviarle una cadena con la ciudad a buscar y nos regresará diversos resultados que pueden concordar con el código de la ciudad y su nombre “legible”, la url es: 
http://xoap.weather.com/weather/search/search?where=NOMBRE_CIUDAD

Por ejemplo para buscar la ciudad de Puebla, Mexico haremos:
http://xoap.weather.com/weather/search/search?where=Puebla

El resultado nos dará como resultado:

<!-- This document is intended only for use by authorized licensees of The  -->
<!-- Weather Channel. Unauthorized use is prohibited.  Copyright 1995-2008, -->
<!-- The Weather Channel Interactive, Inc.  All Rights Reserved.            -->
<search ver="2.0">
  <loc id="MXPA0070" type="1">Puebla, Mexico</loc>
</search>

 

Que vemos que el elemento loc provee el ID de la ciudad y el nombre legible; ahora si podemos contruir la nueva URL que será:

http://weather.yahooapis.com/forecastrss?p=MXPA0070&u=c

El resultado es un documento RSS con un nombre de espacio (namespace) de yweather, la página contiene mucha información, mucha de ella redundante, pero lo que más nos importa es lo que tiene ese nombre de espacios como:

<yweather:condition  text="Partly Cloudy"  code="30"  temp="19"  date="Sat, 27 Sep 2008 5:49 pm CDT" />
<yweather:location city="Puebla" region=""   country="MX"/>
<yweather:units temperature="C" distance="km" pressure="mb" speed="kph"/>
<yweather:wind chill="19"   direction="150"   speed="11.27" />
<yweather:atmosphere humidity="60"  visibility="1607.69"  pressure="0"  rising="0" />
<yweather:astronomy sunrise="7:23 am"   sunset="7:24 pm"/>

El primero es lo más importante (condition), nos mostrará la información del clima, el código de estado (code), la temperatura (temp) y la fecha de cuando se obtuvo la información.
El segundo (location) nos dice información del lugar.
El tercero (units) nos dice en qué unidades está expresada la información, como hemos solicitado en formato de grados Centigrados el sistema muestra la información en sistema métrico.
El cuarto (wind) nos da información del viento.
El quinto (atmosphere) nos da información del medio ambiente en cuanto a humedad, visibilidad, etc
El último (astronomy) nos da una breve información de cuando el sol aparece y se oculta en el horizonte.

La página también incluye una liga a la imagen del estado, yo he decidido utilizar las que provee Weather.com

El nombre del estado no lo usaremos ya que está en inglés, por lo que hice una traducción del estado al nombre correspondiente, los códigos se pueden ver aqui:
http://developer.yahoo.com/weather/#codes

 

Aqui tenemos un ejemplo ensamblado en PHP y Javascript:
http://demo.livesourcing.com/blog_vida/articulos/DanguerArticle_Clima/

 

Básicamente tiene tres partes, la primera nos permite introducir un nombre y obtener el ID de los lugares, obviamente está en ingles por lo que se tienen que hacer busquedas como “Mexico City” para encontrar la información del clima del D.F.

La segunda parte nos permite seleccionar de las distintas opciones de los lugares el que queramos ver su clima, después de seleccionarlo le damos click a “Obtener clima” y obtendremos el clima ;)

El sistema muestra solamente el Estado (en español), la temperatura y la fecha con la imagen correspondiente del estado; en el ejemplo no obtuve información extra como información del viento o del medio ambiente, pero en base al ejemplo se puede extender fácilmente.

 

Descargar el código fuente del ejemplo: 
http://demo.livesourcing.com/blog_vida/articulos/DanguerArticle_Clima.tar.gz

 

Más información:

 

Tranzas en los seguros

Hace pocos días me hablaron para un seguro pero verdad fue todo demasiado raro, les explico como sucedió.

Estaba trabajando en unas modificaciones de un sitio cuando sonó el teléfono, el número de teléfono era: 756-3646 de la ciudad de Puebla, contesto y habla una señorita con un acento muy extraño que me sonaba a centroamericano:

Operadora: Hola, estamos hablando por parte de Visa/Mastercard  a los tarjetahabientes… (aqui pensé que era para ofrecer una tarjeta)
Danguer: ¿Con quien quiere hablar?
Operadora: Con un tarjetahabiente Visa/Mastercard
Danguer: Somos dos, con quien quiere hablar
Operadora: Usted maneja una tarjeta con algún banco
Danguer: Si con banorte, gracias (seguí pensando que era para venderte una tarjeta)
Operadora: Muy bien, ¿Como le ha ido con la tarjeta Banorte?
Danguer: Bien (a secas porque aqui vienen normalmente con que “con la tarjeta XYZ es mucho mejor que la suya, blah, blah, blah)
Operadora: ¿Le llego un paquete verde con su estado de cuenta este mes?
Danguer: No, no me llego nada así, ¿que tenía que ser?
Operadora: Es un paquete con información de seguros, se les da a los tarjetahabientes de Visa/Mastercard
Danguer: No, no me llego nada, y no quiero ningún seguro
Operadora: Es que este es un seguro contra el cancer  [aqui me dan más datos] que se les da a los tarjetahabientes de Visa/Mastercard, solamente necesito confirmar los datos de envio, Aqui me dice que es Calle Moreno Cantinflas 80 [para proteger privacidad :P ]
Danguer: No, es Calle Mario Moreno Cantinflas 80 (ya que lo habian abreviado)
Operadora: ¿Me puede decir entre que calles? 
Busco las calles  y le digo que son de dos expresidentes mexicanos, que por cierto la mona hablaba a todo lo rápido que podía y cuando le dije los nombres no podía entenderlos aún cuando eran demasiado fáciles, otro punto a favor que no era Mexicana la operadora

Operadora: Bueno, para confirmar me puede dar el número de su tarjeta que empieza con 5445
Le doy un número de una tarjeta que por cierto no está activada, porque supuestamente es para confirmar, me pide más datos y entonces caigo en cuenta que pues no es para verificar sino para  obtener información que no tienen

Operadora: Le voy a pasar a mi supervisora para que confirme que la información que le he dado es correcto y que su información le llegue

La supervisora que habla igualmente rápido me repite lo mismo que es para entregarme un seguro, que si todo me quedo claro, que le digo que no mucho y antes de que intente preguntar algo me dice: “ahora vamos a grabar que ha recibido la información”

Esa grabación ya me la han puesto antes y es para aceptar un contrato por teléfono, asi que ya todas las alertas se encendieron.

La “supervisora” rápidamente explica todo y de pronto de la manera más rapida dice: “esto tiene un cargo a su tarjeta de $2 a $8 dolares mensuales” más información y un “¿Acepta?”

Danguer: No, la anterior operadora no me dijo nada del cargo, me dijo que me iban a enviar información
Supervisora: No, es que vea que es una inversión minima
Danguer: No, no estoy interesado en ningún seguro

La supervisora intenta rápidamente “presionarme” como diciendo que ya por eso había puesto la grabación, pero como le dije que no aceptaba explícitamente me dice: “Lo comunico con mi supervisor” y rápidamente toma la llamada su Supervisor

Supervisor: Hola, habla XXX de Seguros Bancomer (eso lo dijeron hasta ese momento), mira que este seguro es para tarjetahabientes …
Danguer: No gracias, ya tengo otros seguros y no quiero adquirir otro, no me habían dicho del costo
Supervisor: Esto no es un seguro, ya que en el momento en el que le detecten cancer le pagan una suma de 37 mil dolares instantáneamente y otros 3 mil para gastos funerarios
Danguer: No, gracias, ya tengo otros seguros similares
Supervisor:  Pero es que este seguro se les entrega a todos los tarjetahabientes de Visa/Mastercard, es algo que la compañia lo hace, es un costo mínimo solamente le pedimos información para hacerle llegar su poliza
Danguer: No, cuando hice el contrato de la tarjeta de crédito en ningún momento acepte ningún seguro por lo que no voy a pagar por lo que no he solicitado
Supervisor: Bueno, pero después le hablará mi Supervisor para confirmar que quiere cancelar este paquete que entrega Visa/Mastercard (como diciendo alla usted si se quiere pelear con los ‘directivos’)

 

Total que después de una llamada mega rápida me quedaron claro varias cosas

 

  • Para venderte un seguro recurren a llamadas que tienen todo el tinte de fraudulentas, por ejemplo al inicio la operadora simplemente se refirio a “Tarjetahabientes Visa/Mastercard” pero haciendo una referencia vaga a que hablaban de parte de Visa/Mastercard lo cual es imposible ya que son compañias rivales, hasta el final me comentaron al final que eran de Seguros Bancomer
  • Para apresurar la “venta” todos están o en el mismo cubículo o están ya preparados escuchando porque los cambios de “supervisores” fueron tan rápidos que no daban tiempo a que les explicaran que había sucedido.
  • Nuestra información está en venta (bueno eso ya lo sabía pero todavía lo tomaba un poco a leyenda urbana), en este caso fui más confiado debido a que mencionaron mi calle y número (parcial, no completo) eso pueden obtenerlo de información de Telmex o similar, pero antes me habían hablado de otros servicios que he notado que debes tener un cierto perfil económico para que te hablen
  • No te mencionan costos, o si lo hacen es extremadamente rápido con tal de que entres a la parte donde aceptas el contrato para que quede grabado (que es igual que una firma)
  • ¿Porque ponen operadoras que no hablan bien el español?, ¿Sera por la misma razón anterior?

 

 

Así que más cuidado con las llamadas, ahora si voy a utilizar ese truco de preguntarles todo primero a ellos antes de dar cualquier tipo de información.

 

Posdata: No he recibido ninguna llamada de los “ejecutivos” para cancelar el paquete “obligatorio” (segun ellos) para tarjetahabientes Visa/Mastercard

Policias

Algunos videos de Youtube sobre policias =)

Una buena comedia =)

Policia chiapaneco bailando:

Otro policia bailador:

Otro pero en Estados Unidos:

Este es un policia que es todo un clásico en Estados Unidos, hasta en Los Simpsons lo parodiaron =)

Y por el otro lado, los ladrones, este es uno de los más estupidos jamás visto:

Otro:

 

Frameworks en Javascript

Sin duda los frameworks son una gran idea porque nos ayudan a desarrollar más rápido y sobre todo con una interfaz mas amena al usuario, aqui hay algunos de los frameworks que utilizo o he utilizado:

Prototype y script.aculo.us

Uno de los frameworks más viejos y que inicio con el movimiento AJAX y el de la Web 2.0
De hecho prototype parece ser el que “patentó” las abreviaturas como $(…) para acortar el document.getElementById, algo que otros frameworks también tendrán de forma similar

Ventajas: Limpio y fácil de usar, se usan de manera separada
Desventajas: No tiene muchos widgets

Página de Prototype Página de Script.aculo.us

jQuery

jQuery es una de esas librerías que en el momento en que la comienzas a utilizar no la dejarás ;) es muy simple de utilizar y lo que la llevo a la cima fueron los selectores, esta es una manera muy útil de seleccionar en primer lugar elementos DOM que cumplan con una regla, por ejemplo con jQuery $(‘img.miClase’) estamos seleccionando todas las imagenes que tengan como clase la de nombre “miClase”, esto es algo que toma muchas lineas en javascript “normal”, también regresa esto como un arreglo por lo que se puede ir alterando uno a uno o utilizando sus funciones de jQuery

El manejo de AJAX es un muy simple (como en la mayoría de frameworks), y por último se está trabajando en widgets para darle más poder a este framework

Ventajas: Pequeño, muy poderoso, fácil de usar, documentación bien estructurada (en la mayoría de casos)
Desventajas: No hay widgets, la parte jQuery-UI que se encarga de esto aún está en desarrollo y puede resultar en más tipo de prototipo rápido que en aplicaciones robustas

Página de jQuery Página de JQuery-UI

Mootools

Mootools es otra de esas herramientas que generan adicción, sus grandes ventajas están del lado gráfico ya que tiene efectos muy cuidados y algunos widgets que son muy útiles. También extiende algunas clases de uso común como Array o String para añadirle funciones útiles.

Las nuevas versiones también incluyen selectores aunque más básicos que jQuery

Ventajas: Efectos fáciles de utilizar, extiende funciones directamente a clases nativas
Desventajas: Falta de widgets avanzados

Página de mootools

YUI

Una Mega-Librería de Javascript, básicamente es un conjunto de widgets muy bien ensamblados y programados. Si se necesita programar algo a nivel empresarial sin duda YUI es la mejor solución, incluye widgets como autocompletado o el de calendario (que lo catapultaron a la fama), así como manejo de AJAX en una forma un poco más complicada (si se puede decir de esta manera) pero también más uniforme.

Por ejemplo es fácil crear un dialogo que envie la información de un formulario mediante AJAX debido a que fue pensado en muchos patrones de diseño y  programación.

Ventajas: Muchos widgets, uniformidad entre componentes, muy buena documentación y una gran cantidad de ejemplos.
Desventajas: El selector es una característica nueva (BETA), archivos gigantescos (en términos de javascript y que alcanzan un promedio de 500KB para descargar algunos componentes, en espacio de disco puede llegar hasta más de 10 MB si se descomprimen todas las versiones), lamentablemente como muchos componentes están relacionados no hay manera de “cortarlos” (aunque es posible no incluir los elementos adicionales para aliviar un poco la descarga de archivos, pero aún asi la arquitectura debio ser distinta y no incluir todo en un mega-componente)

Página de YUI

Ext-JS

Es una gran librería con muchos widgets de uso para una aplicación empresarial Web 2.0, tiene demos muy interesantes y provee soporte de licencia comercial u open source.

Ventajas: Muchos widgets
Desventajas: No lo he probado ;)

Página de ExtJS

Otras frameworks que prometen saltar a la fama si son llevados a cabo de manera cuidadosa:

Dojo

Aunque siento que Dojo no ha encontrado su “nicho” (a pesar de que está soportado por Zend Framework en la parte de Ajax), este puede ser la parte gráfica desde javascript, por supuesto javascript no puede dibujar sobre el navegador pero si lo puede hacer mediante otros plugins como el caso de SVG, Silverlight o Flash, al parecer ahora solo soporta SVG y Silverlight y no han implementado Flash que es mejor para esto.

Spry

Esta tecnología hay que observarla de cerca porque está madurando y va a ser un modelo a seguir en los próximos años.

Básicamente es un conjunto de widgets que se incrustan mediante xhtml en una página, así en vez del “aburrido” javascript de una vez que se ha cargado el documento asignar variables mediante id’s, nombres, etc; podemos hacer algo como:

<div id="productMenu" spry:region="dsProducts" style="display: none;">
	<table>
		<tr spry:repeat="dsProducts" spry:hover="hover" spry:suggestion="{name}">
			<td><div class="boxshot"><img src="../../demos/products/{boximage}" alt="{name}" /></div><div>{name}</div></td>
		</tr>
	</table>
</div>

Donde claramente se notan partes que serán rendereados en javascript, algo muy innovador.

Página de Spry

Otro Spanglish – Final Countdown

Muy similar a Ken Lee, pero latino y más “clásico” >=)

 

Por cierto, la original era The Final Countdown de Europe

Usando el Google Autosuggest API

Aunque no he encontrado documentación, viendo como Youtube solicita datos de sugerencia me he dado cuenta que existe un pequeño api de sugerencias google, la liga es:

http://suggestqueries.google.com/complete/search?q=lorem

Si entran a la anterior dirección verán que les sirve un documento javascript con una llamada a una función (window.google.ac.h)

El documento regresa un arreglo con tres valores, el primero es la busqueda misma, el segundo es un arreglo de etiquetas y el tercero es un arreglo con la información del número de resultados. Este formato puede cambiar dependiendo de los parámetros enviados.

Hasta donde he probado tiene las siguientes opciones (pronto liberarán las especificaciones oficiales):

  • nolabels, valores posibles: t, f
    Especifica si deben mostrarse el numero de resultados [f] o solamente las etiquetas [t]
  • hl, valores posibles: cualquier valor válido ISO para lenguajes por ejemplo en, es, etc
    El lenguaje en el que se realizará la búsqueda por defecto está en ingles, se puede cambiar a español con hl=es
  • json, valores posibles: t
    Especifica si el resultado será en formato JSON (para ser leido por javascript), cambia un poco el formato ya que no llama la función y no es un arreglo doble como por defecto
  • xml, valores posibles: t
    Especifica si el resultado será en formato XML (muy bueno para PHP, flash o Flex), tiene una información un poco más “limpia” pero por supuesto contiene es más grande el envio de este archivo
  • jsonp, valor posible: nombre de función en javascript
    Con este parámetro podemos decirle que mande a llamar a una función de nuestro código por ejemplo: “resultados”

Pueden ver un ejemplo donde proceso los resultados de google suggest en la siguiente página:

Ejemplo de Google Autosuggest API

http://demo.livesourcing.com/blog_vida/articulos/DanguerArticle_GoogleAutosuggest/

Pueden descargar el código en:
http://demo.livesourcing.com/blog_vida/articulos/DanguerArticle_GoogleAutosuggest.tar.gz