June 12 2008

Receta: Arroz con carne

Heme aquí de nuevo retomando uno de mis pasatiempos más entretenidos (al menos para mí). ¿Cuantos de nosotros nos hemos quedado solos en casa y sin nadie que nos prepare algo decente para comer? Por supuesto, siendo un fricky lo más seguro es que en realidad lo único que puedas cocinar y sin mucho éxito sea agua, por eso, yo, el Chef-I-Roth he venido a traerte una receta de “fácil preparación”, a prueba de bobos y que te saldrá más barato que ir a comprar comida hecha (no es cierto, pero quiero que te ilusiones). Está es la receta del arroz con carne.

Chef-I-Roth

Ingredientes

Algunos ingredientes

  • Una taza rebosante de arroz
  • 3 tomates
  • 1 rama de cilantro
  • 2 diente de ajo
  • 1 /4 de cebolla en rodajas
  • Sal al gusto
  • 1 cuadrito de consomé instantáneo
  • 1 / 4 de carne de res molida

Preparación

Primero que nada, lava los tomates y el cilántro muy bien. Parte los tomates en cuatro piezas y echálos a la licuadora junto con un diente de ajo sin cascara, algunas rodajas de cebolla, la rama de cilántro, medio cuadro de consomé y un poco de sal. Vierte el arroz en un traste grande y lávalo varias veces, hasta que el agua ya no te salga blanca.

Arroz lavándose

Pon a escurrir el arroz, mientras este se seca un poco, toma una sartén, vierte una capa muy delgada de aceite y fríe a fuego lento el segundo diente de ajo, y lo que quedo de la cebolla. Cuando estén algo doraditos, vierte el arroz a la sartén.

Arroz vertido y dorándose

El arroz debe quedar doradito, no es necesario que lo muevas todo el tiempo, solo que lo vigiles de vez en cuando para que no se te queme y lo muevas un poquito, recuerda hacerlo a fuego lento. cuando el arroz este a punto, vierte lo que previamente licuaste.

Vertiendo el preparado

Deja pasar un minuto, mientras tanto, lava la carne molida con mucho cuidado. Cuando la carne este limpia viertéla en el arroz junto al otro trozo del consomé restante y algo de sal.

Vertiendo carne al arroz

Este es un punto crítico, debes vigilar el arroz para que no se quede sin líquido antes de tiempo, si vez que le falta agua, ponle un poco, no mucho para no arruinar el sabor. Importante que sepas que si descuidas en este punto el arroz jodes el guiso entero y comerás pasta con carne mal cocida, así que deja de jugar en línea, ver pr0n o lo que estés haciendo y ponle atención a tu guisado. No olvides moverle de vez en cuando, y, cuando veas que ya prácticamente esta terminado, ponle un poco más de cilántro.

Ponle cilantro

Deja pasar unos minutos más y prueba tu arroz para ver si ya quedo, lo importante aquí, es que no se te bata y que la carne quede bien cocida. Cuando todo termine, ya puedes sentarte a disfrutar de tu comida, lo recomiendo con galletas saladas y aguacate. ¡Que aproveche!

POR DESGRACIA, LA ÚLTIMA FOTO NO ME QUEDO MUY BIEN QUE DIGAMOS

El resultado final

POR DESGRACIA, LA ÚLTIMA FOTO NO ME QUEDO MUY BIEN QUE DIGAMOS

June 04 2008

Killbox: Porque matarlos, nunca había sido tan fácil

Después de dar algunas recomendaciones sobre que hacer cuando tenemos un virus, decidí escribir esto a manera de segunda parte por una sencilla razón. Hay virus / spywares / troyanos / etc. Que no son tan fáciles de eliminar y aún siguiendo todas las recomendaciones anteriores... pueden darnos un buen dolor de cabeza (y quizá hasta de estómago, por aquello de las úlceras y demás). Googleándo, me encontré esta pequeña herramienta que me ha funcionado muy bien hasta el momento y me ha sacado de muchos apuros, así que, como el conocimiento es poder y el poder se comparte (bueno, excepto con los políticos) he querido compartirlo con ustedes para que puedan vencer esas molestias.

¿Cómo saber que tienes un virus de esos díficiles de quitar?

Revisa si te pasa uno de estos casos

  1. Tenías conexión a Internet, insertaste tu pendrive / memoria a tu Pc y enseguida, casi enseguida o unos minutos después tu conexión se murió.
  2. Después de eso, tu conexión lleva días muerta o errática
  3. Junto a eso, todas las carpetas de tu memoria / pendrive parecen haberse esfumado y ni con attrib (ver el artículo anterior) reaparecen
  4. Tus carpetas no desaparecieron, pero tienes un ejecutable (un archivo con extensión .exe o iconito de ventanita azul con blanco) por cada carpeta
  5. Tus carpetas desaparecieron y tienes solo los ejecutables
  6. Intentaste borrarlos y no pudiste, ni desde el CMD
  7. Intentaste conectar tu memoria / pendrive a una Pc con Linux y te reconoció la memoria, pero no te dejo borrar nada e incluso te marco que el disco (la memoria) está llena, aún y cuando solo tenías algunos cuantos archivos y carpetas

¿Qué hacer?

Tranquilo. No entres en pánico, ni te chupes el dedo, ni des vueltas como loco. Tiene solución y es muy fácil. Seguramente ya intentaste rodo lo que se menciona en el artículo anterior, e incluso medidas más desesperadas (como instalar Norton Antivirus, por ejemplo), haz lo siguiente.

  • Conecta tu memoria / pendrive infectada a tu equipo (descuida, lo más seguro es que ya este infectado también)
  • Abre tu memoria, y fíjate en los nombres de cada archivo y / o carpeta que veas sospechosa (puedes intentar ejecutar attrib, sino puedes, busca un equipo con linux y mira el contenido de tu pendrive ahí)

    Sorpesa, sorpresa! un virus

    NOTA IMPORTANTE: Si intentaste entrar a CMD y no te dejo, o entraste, pero te bota "acceso denegado" el attrib, substituye CMD por command que es el viejo interprete de comandos que hasta Win98 existía y ejecuta attrib desde ahí.

  • Pregúntale a tu mejor amigo por cada uno de los nombres raros y sospechosos que hayas encontrado, para hacértela un poco fácil, te doy algunos de ellos
    CODE:
    1. d.com, at.df, MSOCACHE, Recicler, Recicler.bin, winsystem, nircmd

    IMPORTANTE: No siempre, pero he notado que en varios casos, estos virus agregan una opción más al autoarranque, tal como lo muestra la figura

    Killbox, virus

  • Descarga Killbox. Ejecútalo y presiona el botón que muestra la imagen de abajo, recomiendo también marcar la opción End Explorer Shell While Killing File, solo por si acaso nuestro buen amigo Windows pretenda colgarse a medio camino.

    killbox, buscando

  • Ahora, presiona el botón que marca la imagen de abajo y presiona , cuando te pregunte si quieres hacerlo

    killbox, asesinando un virus

    Para los despistados: El sistema operativo "parpadeara" unos segundos, no pasa nada malo, es normal.

    Por cierto, si tienes un antivirus, desconéctate de Internet por unos momentos (el porno no se va ir lejos si lo haces) y desactívalo mientras haces esto, porque de otra manera solo le estorbará a Killbox.

  • ¡Listo! Memoria limpia

    pendrive libre de virus, limpia

    Ya podemos dedicarnos a pensar en la inmortalidad del cangrejo.

Lo olvidaba, esto debe hacerse también con el equipo, ya que lo más seguro es que esté infectado también.

Cabe mencionar que está no es una medida definitiva. La memoria se mantendrá limpia mientras no la vuelvas a meter a otra PC infectada, también, igual que el método anterior, puede llegar a fallarte, por lo que ni Licencia Creativa, ni el autor, ni su proveedor de servicios, se hacen responsables de los daños ocasionados a tu equipo / memoria / cerebro ocasionados por el mal uso de esta información

May 29 2008

BC Prueba 3: Algoritmos genéticos

Atención : Este artículo es la tercera prueba del Bloggers Confrontation

Una de las ideas más prometedoras en la inteligencia artificial son los llamados algoritmos genéticos. A mediados de los 70 John Henry Holland, un profesor de Filosofía, de Ingeniería Eléctrica y de Ciencias de la computación en la Universidad de Michigan ideo este concepto. Los algoritmos genéticos o evolutivos, son llamados así, porque se basan en la famosa teoría de la evolución.

Según esta concepción, un algoritmo parte de una determinada población de soluciones potenciales a un problema, todas las cuales son medidas en función de su aptitud. Se parte del supuesto que no todas las soluciones funcionaran o que incluso algunas de ellas pueden llegar a solventar el problema, en cuyo caso, se buscaría mejorar dicha solución. Entonces, una de estas posibles soluciones generalmente conocida como cromosoma puede conservarse, e incluso reproducirse, cada reproducción además, puede sufrir toda una serie de cambios generalmente conocidos como mutaciones. El algoritmo entonces, ira descartando aquellas soluciones que no puedan adaptarse, aquellas que hayan logrado sobrevivir, podrán reproducirse y continuar.

Un algoritmo genético tiene también una serie de parámetros que se tienen que fijar para cada ejecución, como los siguientes:

  • Tamaño de la población: debe de ser suficiente para garantizar la diversidad de las soluciones, y, además, tiene que crecer más o menos con el número de bits del cromosoma, aunque nadie ha aclarado cómo tiene que hacerlo.
  • Condición de terminación: lo más habitual es que la condición de terminación sea la convergencia del algoritmo genético o un número prefijado de generaciones.

Funcionamiento de los algoritmos genéticos

Entonces, el funcionamiento general de un algoritmo genético se puede describir como sigue

  • Se genera una determinada población de soluciones al problema (cromosomas) ya sea de manera aleatoria o no, en cuyo último caso, se deberá contar con la cantidad suficiente de cromosomas para garantizar la no terminación temprana del algoritmo.
  • A cada cromosoma se le mide su “aptitud”, es decir, se somete a prueba para ver que tan buena es.
  • En base a esto último, se eligen los cromosomas que pasaran a la siguiente generación, para ello, se implementa alguno de los métodos de selección existentes. Aunque el predominante generalmente es el método elitista (es decir, aquellos que demostraron mayor aptitud)
  • Se determina la probabilidad de un cromosoma a ser elegido en base al método de selección
  • Una vez elegido, se procede al “cruzamiento” de dos cromosomas para generar dos cromosomas nuevos con características de ambos
  • El algoritmo terminará si y solo si se ha cumplido alguna de estas variables
    • Se ha encontrado la solución más apta
    • Se ha excedido el número de iteraciones necesarias o determinadas (donde cada iteración representa una nueva generación)
    • No hubo cambios en la población, lo que se conoce como convergencia prematura, es decir, el algoritmo termino antes de tiempo al no encontrar un cromosoma superior

¿En qué se usan estos algoritmos?

Entre otras cosas, los algoritmos genéticos se usan para:

  • Investigación en diseño de materiales y diseño multi-objetivo de componentes automovilísticos
  • Diseño automatizado de sistemas de Mecánica de precisión, mediante grafos de bond y programación genética
  • Diseño automatizado de equipamiento industrial
  • Diseño automatizado de sistemas de comercio en el sector financiero
  • Optimización de carga de contenedores
  • Diseño de sistemas de distribución de aguas
  • Diseño de topologías de circuitos impresos
  • Diseño de topologías de redes computacionales
  • En Teoría de juegos, resolución de equilibrios
  • Aprendizaje de comportamiento de robots
  • Aprendizaje de reglas de Lógica difusa
  • Análisis lingüístico, incluyendo inducción gramática, y otros aspectos de Procesamiento de lenguajes naturales, tales como eliminación de ambigüedad de sentido
  • Infraestructura de redes de comunicaciones móviles
  • Etc.

Enlaces relacionados

April 11 2008

Tres opiniones desfavorables

Leía el mini artículo Tres opiniones favorables sobre PHP, donde algunos expertos dan su opinión sobre las cosas que favorecen al lenguaje PHP y me parece increíble, no lo que los expertos tengan que decir, sino la sarta de tonterías sin sentido por las que la gente discute. No se ustedes, pero yo estoy harto de estás absurdas peleas sobre cual es mejor lenguaje. Y la moda de hoy es "Ruby es mejor que PHP".

He oído de todo, desde opiniones objetivas y centradas, hasta absurdos como simplemente decir "PHP apesta" sin dar una razón de peso real. Creo que debemos entender una cosa. Lenguajes hay muchos, con propósitos diferentes, nacidos bajo condiciones diferentes, algunos ya cumplieron su ciclo, y otros están en transición, pero lo importante no es competir para ver cual es el mejor lenguaje. Un lenguaje de programación será una excelente herramienta si el programador es excelente, y será una pésima herramienta si el programador es realmente malo. Así que antes de andar por ahí condenando tal o cual lenguaje, creo que primero deberíamos darnos cuenta que tanto conocemos el lenguaje de nuestra preferencia y que tan eficientes somos usándolo. No vaya a ser que nos hallemos adorando a un ídolo de papel construido más sobre nuestro ego e ineptitud que sobre una base, concreta y cuantificable.

Entonces, lejos de criticar un lenguaje, yo recompondría y daría tres opiniones desfavorables no sobre el lenguaje, sino sobre el programador.

  1. El programador tiende a idolatrar el lenguaje de su preferencia
  2. El programador tiende a olvidar que la curva de aprendizaje de un lenguaje nunca es similar en ningún individuo, por eso le es más fácil criticar a quienes empiezan por un lenguaje que no sea su favorito.
  3. El programador tiende a olvidar que él comenzó muchas veces como esos a quienes critica (aunque hay sus casos excepcionales)

PD. A los que me siguen en twitter, mis peleas con Yaraher sobre Ruby son pura joda, como todo lo que se escribe ahí.

To All Pioneers

March 29 2008

¡Wordpress 2.5 Liberado!

¡Al fin salio! mucho se había especulado sobre la versión 2.5 de Wordpress, y apenas hace unas 3 horas que salio la versión definitiva, en palabras mismas del equipo de desarrollo:

Wordpress 2.5 es la culminación de seis meses de trabajo de la comunidad de Wordpress, gente como ustedes. Las mejoras en 2.5 son numerosas, y la mayoría son resultado de la retroalimentación de la comunidad: subida múltiple de archivos, actualización de los plugins con un solo click, galerias prefebricadas, un panel de control personalizable, encriptación de cookies, librería de medios, un editor WYSIWYG que no desordena el código, protección concurrente de edición de contenido, escritura a full screen y una búsqueda que cubre los post y las páginas.

Se antoja para probarlo el fin de semana, ya les estaré pasando mis apreciaciones si es necesario.

March 07 2008

El iPhone SDK ya está aquí

Tal y como lo prometió Apple, el SDK para el iPhone ya está disponible. Junto a él, viene una especie de subscripción al estilo MSDN que aparece en dos sabores: Standard Program con un valor de $99 USD, creado para desarrolladores de aplicaciones caseras, libres de uso y también comerciales. Enterprise Program con valor de $299 para desarrolladores que generen aplicaciones hechas a medida y por supuesto propietarias. Por ahora, estos programas solo estan limitado a un número determinado de desarrolladores en Estados Unidos (quizá porque primero quieren ver si pega).

El iPhone SDK incluye un IDE, herramientas de análisis, un simulador del iPod Touch, ejemplos y otras herramientas más.

November 07 2007

NextGEN Gallery, una galería integral para Wordpress

Pocos plugins me causan tanta emoción como este que acabo de encontrar (Ok, el plugin tiene mucho tiempo de existir, pero apenas yo lo he descubierto). NextGEN es una galería de fotos muy completa, capaz de manejar sets de galerías y albumnes, todo esto con la comodidad de ajustarse a tu Wordpress de manera nativa, usando AJAX, LightBox y Flash, produce resultados realmente muy satisfactorios, teniendo además un panel de administración tan completo que te dejará una grata sensación de amor hacía el autor del plugin (por supuesto figurativo, so pervertidos).

Instalación

  • Descarga el plugin
  • Descomprime todo en la carpeta wp-content/plugins, te debería crear una carpeta llamada nextgen-gallery
  • Baja el JW Image Rotator, descomprime el archivo, y copia el archivo imagerotator.swf a la carpeta nextgen-gallery
  • Crea en wp-content una carpeta llamada gallery con permisos de escritura
  • Tendrás dos plugins nuevos, NextGEN Gallery y NextGEN Gallery widget, activa el primero y el segundo solo si deseas usarlo en la sidebar

Utilización

Ahora que has activado el Plugin, notarás una nueva sección junto a Options (Opciones)

Opciones

Echemos un vistazo en ella

vistazo

Procedamos ahora a explicar de forma básica su funcionamiento

Creación de Álbumnes

  1. Damos clic en la opción Album dentro de Gallery
  2. Buscamos Add New Album, escribimos el nombre del álbum y presionamos Update

Crear albúm

Nuestro álbum ha sido creado y esta disponible para más adelante

Álbum listo

Creación de Galerías

Veamos ahora como se hacen las galerías, el siguiente paso en nuestro proceso

  • Vayamos a Add Gallery dentro de Gallery
  • En New Gallery, escribamos el nombre de nuestra galería y presionemos Update

New Gallery

Una vez creada, NextGEN nos arroja información importante que usaremos después

galería creada

Administración de Galerías

Ahora que hemos creados una galería, vamos a ver las funciones básicas para su administración, como la edición de la galería, su eliminación y el añadido de fotos a la misma.

Eliminar

  • Nos movemos a Manage Gallery, encontraremos una lista de las galerías que llevamos hasta ahora
  • Presionamos el botón Delete a un lado de la galería correspondiente y le damos clic al botón Ok, de la ventana javascript que nos pide confirmación

eliminar galería

Editar

  • En la misma sección de Manage Gallery, presionamos el botón Edit junto a la galería que vamos a editar
  • Nos lleva a una nueva ventana con las siguientes opciones:
    1. Title: Título de la galería
    2. Description: Descripción de la galería
    3. Path: Ruta relativa de la galería
    4. Page Link To: Podemos ligar la galería a una página creada por Wordpress, el valor por defecto es Not Linked (no ligada)
    5. Preview Image: Imagen que servirá de Thumbnail a toda la galería, el valor por defecto es No Picture (Sin imagen)
    6. Create New Page: Se usa, si queremos que se genera una página Wordpress nueva por cada galería, el valor por defecto es Main Page(no parent) (Página principal sin página padre)
    7. Save Changes: Guarda los cambios
    8. Scan Folder For New Images: Revisa la carpeta por si hemos puesto fotos ahí sin hacer uso de NextGEN y las agrega

Editar galería

Agregar Fotos

  • Vamos a Add Gallery, luego a Upload Images (Este paso lo podemos repetir según la cantidad de fotos que queramos)
  • Por cada foto que se agrega, se genera un botón Remove, por si queremos eliminar alguna foto antes de subirlas a la galería
    Remove Photos
  • En Upload Image, seleccionamos la foto que queremos subir a nuestra galería
  • Luego en In to, escogemos la galería destino
  • Presionamos Upload Images

upload images

Administrar las fotos

¡Hemos subido fotos, es hora de ver que podemos hacer con ellas antes de visualizarlas en nuestro blog.

  • Nos vamos a Manage Gallery, luego pulsamos en Edit sobre la galería en la que hemos añadido las fotos. Si nos fijamos ahora, en la parte inferior de la ventana tenemos una sección que antes existía, pero estaba desierta, analicemos lo que podemos hacer en ella:
    1. ID: El Id de la foto
    2. File Name: El nombre de la foto
    3. Thumbnail: La miniatura de la foto, se puede ocultar, seleccionando el checkbox de la foto y presionando el botón Hide Thumbnails (y similar para mostrarla de nuevo, solo que ahora el botón se llama Show Thumbnails)
    4. Description: Escribe una breve descripción de la imagen
    5. Alt & Title: Para rellenar los atributos Alt y title de la etiqueta img
    6. Exclude: Evita que se vea en la galería
    7. View: Hace una vista previa de la foto
    8. Delete: Elimina la foto

Fotos

Agregar Tags a las fotos

Las Tags son importantes porque ayudan a los navegadores a encontrar nuestras fotos, sirven para categorizar y ordenar también entre otras funciones, para colocar las tags a nuestras fotos, primero hay que usar el checkbox correspondiente a la foto que queremos editar, luego presionar el botón Show Tags (para ocultar las tags, presionamos de nuevo el botón que ahora dice Hide Tags)

taggear fotos

Terminado todo, presionamos Save Changes

Usando NextGen en nuestro blog

Ha llegado la hora de la verdad, veamos como usar NextGEN en nuestro blog. Para mostrar una foto, debemos colocar el siguiente código en un post o una página:

PHP:
  1. [singlepic=id,width,height,mode,float]

Donde:

  • id: Id de la foto
  • width: Ancho de la imagen
  • height: Alto de la imagen
  • mode: Es opcional y se usa uno de dos posibles valoes: web20 - agrega un efecto de reflejo, watermark - agrega una sencilla marca de agua, definida en el mismo panel de administración
  • float: left (izquierda) o right (derecha)

Ejemplos:

web2.0

watermark

Para mostrar una galería:

PHP:
  1. [gallery=id]

Siendo id el ID de la galería. Cabe decir que esto, vierte el contenido de la galería en directo donde sea colocado, con un lindo enlace para cambiar a modo de diapositivas.

Galería

Finalmente, para colocar un álbum se usa:

PHP:
  1. [album=id]

Siendo id, el ID del álbum. Esto te entrega el álbum completo, como usa ajax, desde ahí puedes navegar en las galerías que están dentro del álbum y sus fotos.

album

Hasta aquí llega este extenso artículo sobre el plugin NextGEN Gallery, por supuesto quedaron algunos detalles en el tintero, pero será mejor que explores el plugin y descubras la enorme riqueza que te ofrece, como una idea de lo que faltó, puedes ir a Gallery, Options y configurar muchas cosas del plugin como la marca de agua, los efectos para mostrar las fotos, los thumbnail, etc. ¡Explora y diviertete!

November 01 2007

Gráficas con LibChart en PHP

NOTA: AL momento de re-escribir este artículo, me entere de la nueva versión de la librería con soporte total para PHP5 y nuevos tipos de gráficas, aún así, no ha cambiado en sus funciones básicas que son las que se explican aquí.

LibChart es es una líbrería orientada a objetos de libre distribución y facilidad de uso que te ahorrara la difícil tarea de crear gráficas en tus aplicaciones Web. Todo lo que tienes que hacer, es bajarte la librería, instalarla en tu aplicación y empezar a usarla. Entremos en detalle.

Instalar la librería

Después de descargar la librería, es necesario que está se descomprima y se coloque en un subdirectorio de nuestra aplicación, en mi caso, le he dejado el nombre de la librería a la carpeta, solo para recordar que estoy haciendo.

Libchart

Una vez subidos los archivos, deberás hacer lo siguiente:

  • Otorga el permiso 555 a la carpeta que acabas de subir
  • crea dentro de esa carpeta una subcarpeta donde se van a guardar las gráficas (se generan en formato .PNG) y ponle los atributos 777 (siempre puedes jugar con los permisos), en mi caso, le puesto demo como nombre a la carpeta

Creando gráficos

Al momento, LibChart, soporta gráficas de barras horizontales y verticales, circulares y gráficas de líneas, así que tendremos que elegir cual vamos a crear, pero primero, en nuestras aplicaciones, incluyamos la librería correspondiente (ver la nota el inicio de este artículo).

PHP:
  1. include "libchart/libchart.php";

Recordemos que debemos apuntar al nombre que le hayamos puesto a la carpeta de nuestra librería. Con eso ya tenemos incluida la librería, ahora vemos como crear una gráfico de barras horizontal

PHP:
  1. $chart = new HorizontalChart(500, 250);

Con barra verticales

PHP:
  1. $chart = new VerticalChart(500, 250);

Circular o de pastel

PHP:
  1. $chart = new PieChart(500, 250);

Líneal

PHP:
  1. $chart = new LineChart(500, 250);

Se ve bastante fácil, por cierto, los parametros numéricos representan ancho y alto respectivamente, $ chart es el nombre que le hemos dado a nuestra variable la cual se deriva de las clases LineChart, VerticalChart, HorizontalChart y PieChart; lo siguiente, es añadir por supuesto el contenido de la gráfica.

PHP:
  1. $chart->;addPoint(new Point("Jan 2005", 273));

addPoint es un método que consiste en agregar un punto a nuestra gráfica, se instancia de la Clase Point, e incluye, el título entre comillas y el valor necesario para poder representarlo, lo que quiere decir que podemos agregar tantos puntos como datos necesitemos representar. Ahora, como ya tenemos los datos, es importante colocarle un título a nuestra gráfica, de otra forma ¿cómo sabremos que estamos ilustrando? setTitle se encarga de ello

PHP:
  1. $chart->setTitle("Este es el título global de la gráfica");

Ahora que ya tenemos todo completo, hay que renderizar el gráfico y que se genere el archivo .png con nuestra gráfica

PHP:
  1. $chart->render("demo/demo2.png");

El método render le dice a donde vamos a depositar la gráfica, es importante como mencione al inicio que el directorio donde vamos a poner las gráficas generadas tenga el permiso 777 o 775, se que para los paranoicos de la seguridad esto es inaudito, pero vamos, hay mecanismos para ello, una recomendación es que no pongan sus gráficas sobre la raíz de su servidor sino quieren llevarse sorpresas desagradables (por aquello de los hackers, crakers, lammers, script kiddies, etc). Lo último que queda por hacer, es simplemente mostrar la gráfica en nuestra aplicación, lo haré de la forma más sencilla posible

PHP:
  1. echo "<img src='demo/demo2.png' />";

Nada del otro mundo, ¿eh? si todo salió bien, ya tienen un perfecto sistema de generación de gráficas. Veamos el código completo de una gráfica y su visualización.

PHP:
  1. include "libchart/libchart.php";
  2. $chart = new HorizontalChart(500, 170);
  3. $chart->addPoint(new Point("Azul", 50));
  4. $chart->addPoint(new Point("Rojo", 83));
  5. $chart->addPoint(new Point("Verde", 142));
  6. $chart->setTitle("Cual es tu color favorito?");
  7. $chart->render("demo/demo2.png");
  8. echo "<img src='demo/demo2.png' />";

libchart

Y las bases de datos, ¿qué?

Sabía que se lo preguntarían, suponiendo que ya tenemos todo el código para la conexión de una base de datos, podemos tomar un ejemplo sencillo de como gráficar datos de alumnos de una determinada escuela.

PHP:
  1. include "libchart/libchart.php";
  2. $chart = new HorizontalChart(500, 170);
  3. $chart->setTitle("Promedio Grupal");
  4. $sql = "select nombre, promedio from alumnos where semestre=2 and idgrupo=3";
  5. $result = mysql_query($sql, $enlace_a_la_bd);
  6. $registros = mysql_num_rows($ result);
  7. if($registros==0)
  8.     echo "<p>No hay datos para gráficar</p>";
  9. else
  10. {
  11.     while($datos = mysql_fetch_array($result))
  12.     {
  13.         $chart->addPoint(new Point($datos["nombre"], $datos["promedio"]));
  14.     }
  15.     $chart->render("demo/demo2.png");
  16.     echo "<img src='demo/demo2.png' />";
  17. }

Cuyo resultado sería:

Libchart

¡Espero que les haya sido de utilidad!

October 26 2007

Capturar la IP real del usuario en PHP

En muchas de nuestras aplicaciones, nos veremos obligados o necesitados de capturar la ip de nuestros usuario, por ejemplo, para fines estadísticos, para alimentar la paranoia de nuestro jefe y / o cliente, etc. Así que la forma de capturar la ip sería:

PHP:
  1. $ip = $_SERVER["REMOTE_ADDR"];

Pero, por supuesto, este dato puede verse falseado por el uso de proxies y trucos similares para enmascarar la ip, así que hagamos una función php que nos devuelva la ip real del usuario

PHP:
  1. function ipreal()
  2. {
  3.     if ($_SERVER)
  4.     {
  5.         if ($_SERVER[HTTP_X_FORWARDED_FOR])
  6.             $ip = $_SERVER["HTTP_X_FORWARDED_FOR"];
  7.         else
  8.             if ( $_SERVER["HTTP_CLIENT_IP"] )
  9.                 $ip = $_SERVER["HTTP_CLIENT_IP"];
  10.             else
  11.                 $ip = $_SERVER["REMOTE_ADDR"];
  12.     }
  13.     else
  14.     {
  15.         if ( getenv( "HTTP_X_FORWARDED_FOR" ) )
  16.             $ip = getenv( "HTTP_X_FORWARDED_FOR" );
  17.         else
  18.             if ( getenv( "HTTP_CLIENT_IP" ) )
  19.                 $ip = getenv( "HTTP_CLIENT_IP" );
  20.             else
  21.                 $ip = getenv( "REMOTE_ADDR" );
  22.     }
  23.     return $ip;
  24. }

Que se utilizaría así

PHP:
  1. echo ipreal();

O así

PHP:
  1. $ip = ipreal();

October 11 2007

Verificando formularios de registro y comentarios en php

Disclaimer: Este es un artículo muy básico, por lo que algunos hardcore programadores y DJSOSO's podrían verlo como juegos de niños, si eres uno de esos, este artículo no es para tí.

Hoy les voy a explicar de una forma muy sencilla, una técnica que utilizan muchos sitios en sus formularios de registro y comentarios para evitar a los spam-bots y cosas similares. Se trata simplemente de obligar al usuario a digitar un número verificador de cuatro cifras generado aleatoriamente, así que, abrimos nuestro editor favorito, y vamos a crear una sencilla función.

PHP:
  1. <?php
  2.     function validador()
  3.     {
  4.         $num = rand(1000,9999);
  5.         return $num;
  6.     }
  7. ?>

Ahora, en cada formulario en el que vayamos a implementar esto, hemos de añadir un poco de código adicional, lo primero será, obviamente notificarle al usuario que tiene que escribir ese valor y de paso explicarle porque debe hacerle, pero también, usaremos un objeto tipo hidden para usarlo del otro lado del formulario. Veamos

PHP:
  1. <?php       
  2.         $n = validador(); //aquí llamamos a nuestra función, no te olvides de hacer el include correspondiente
  3.     echo "<input type='hidden' name='verifica' value='$n' />";
  4. ?>
  5. <p>Verificaci&oacute;n:<strong><?php echo $n ?></strong>. <small>Escriba este valor en la caja de texto</small>
  6. <input type="text" name="verifica_usuario" size="4" maxlength="4" /></p>

Ahora, del otro lado (es decir, cuando el formulario se procesa) simplemente revisamos que no haya quedado vacío el campo y que coincida con los dígitos generados (aquí es donde puedes pensar en AJAX si quieres).

PHP:
  1. <?php
  2. $v = true;
  3. if(strlen(trim($_POST["verifica_usuario"]))>0)
  4. {
  5.      if($_POST["verifica_usuario"]!=$_POST["verifica"])
  6.      {
  7.          $v = false;
  8.          echo "<p>Debe escribir el dígito verificador correcto.</p>";
  9.      }     
  10. }
  11. else
  12. {
  13.       $v = false;
  14.       echo "<p>Debe escribir el dígito verificador.</p>";
  15. }
  16. if($v)
  17. {
  18.      // Aquí se continua con el proceso
  19. }

Por supuesto, esto se puede implementar en un desarrollo propio o hacerle una modificación directa al formulario de comentarios de nuestro blog (sin necesidad de instalar un plug-in).

RSS