domingo, julio 29, 2007

"Memcached: un alivio para las bases de datos"

"Memcached: un alivio para las bases de datos" este es el nombre de un artículo muy bueno sobre Memcached escrito por Pichongol (Daniel López) en "Maestros del Web". Memcached es una de las cosas nuevas que empecé a ver en la empresa donde empecé a trabajar, si bien ya conocía algo sobre este no lo había usado anteriormente porque nunca trabaje en un proyecto que valiera algo de esta talla. Aquí esta Memcached en la Wikipedia (Ingles) que practicamente no agregada nada al artículo anterior.

Dario Ocles.

sábado, julio 28, 2007

Nueva etapa, nuevos tiempos.

Desde el lunes anterior empecé a trabajar en una nueva empresa ésta es Fnbox. Por el tema del viaje tengo poco tiempo por día libre y que obviamente no lo paso adelante de una pantalla. A lo anterior sumemos que estoy terminando de leer el libro de la certificación (si, quiero terminarlo de una vez por todas) así que mucho tiempo para escribir aquí no tengo. Como estoy viendo cosas nuevas en el trabajo y como tengo poco tiempo creo que voy a escribir menos cantidad de artículos pero tratare de que la calidad mejore, por lo pronto tengo varias ideas para escribir un articulo como pueden ser mis queridas y amadas "regex" (el miércoles después de muchos meses las pude volver a usar en algo :-D ).

Dario Ocles.

sábado, julio 21, 2007

"PythonChallenge"

PythonChallenge es una web donde se nos presenta varios desafíos que hay que ir resolviendo con Python (en realidad se puede solucionar con cualquier lenguaje). La idea es dar un "incentivo" para que se aprenda el lenguaje de una forma divertida y practica. La verdad es que la idea esta buena y es bastante adictivo tener un desafío adelante, empiezas con el primero "bueno, vamos a probar" y después de dos horas dices "soluciono este y ya lo dejo... lo prometo... bueno uno mas solamente" :-P


Ya llevo algunos hechos y seguiré haciendo hasta que me aburra o me agarre sueño (lo que ocurra primero). Los primero 3, 4 son fáciles y de a poquito va aumentando la dificultad y en cada desafío tienes que usar algo en especial con lo cual esta bueno para practicar aquellas cosas que conoces o es la excusa perfecta para estudiar algún tema que no conoces. De todas formas invito a todo aquel que se quiera divertir un rato programando y solucionando "problemas de programación" xD no importa si quieres o no estudiar Python, no necesariamente necesita ser Python, con cualquier lenguaje se puede... eso si, solo pasaras algunos niveles si usas bien la cabeza y piensas antes de actuar (no vale buscar ayuda en el foro!!! :-P ).

Veamos hasta donde llego.

Dario Ocles.

viernes, julio 20, 2007

Tabla de comparación de tipos en PHP

Hoy de casualidad encontré algo bastante copado, una "Tabla de comparación de tipos" y que es eso con tan lindo nombre te preguntaras, bueno es muy simple es una tabla donde se muestra como se comportan distintos tipos de datos en PHP ante las comparaciones (flexibles como estrictas).
En realidad esta tabla no tiene nada del otro mundo, pero nunca la había visto y me parece algo bastante lindo para tener a mano cuando te encontras en las primeras etapas del aprendizaje de PHP. Si la vez atentamente y la consultas te podes evitar algunos "comportamientos no deseados" aún que sean totalmente racionales.

Dario Ocles.

jueves, julio 19, 2007

Jerarquía de las Excepciones en Python

Las Excepciones en Python son bastante fáciles de manejar y nos dan una forma muy buena de manejar los errores que pueden ocurrir en nuestros programas.
Hay que tener cuidado cuando se intenta atrapar algunas excepciones, siempre debes tratar de agarrar algún tipo especifico de excepciones y mucho mejor si son excepción definidas por ti. Cuando se intenta agarrar cualquier tipo de excepciones podemos estar enmascarando algún error grave en un "error previsto". Por el motivo anterior es bueno que conozcas la Jerarquía de las Excepciones en Python.
Un ejemplo del porque debes conocer lo anterior y tienes que tener cuidado es el siguiente:

  1. >>> while 1:

  2.     try:

  3.         numero = input("ingresa un numero: ")

  4.         if numero < 10:

  5.             raise Exception("ErrorNumerico", "No me gusto el numero.")

  6.         else:

  7.             raise Exception("ErrorNumerico2", "Tampoco me gusta este numero.")

  8.     except:

  9.         print "Se produjo un error y puede ser de cualquier tipo."


Si lo ejecutastes te darás cuenta que no hay forma de salir, ni con "Ctrl + D"!!!!... esto se debe a que lo anterior lanza una excepción KeyboardInterrupt y esta deriva, como todas las demás, de la clase BaseException y cuando intentas agarrar todas las excepciones con except sin argumentos atrapas todo aquello por debajo de BaseException.

Dario Ocles.

miércoles, julio 18, 2007

Que imprime?

No vale probarlo y responder... respondan lo que crean correcto y luego lo verifican si quieren (atentos despistados!).


<?php

$trece 
chr(13);

switch (
$trece) {
  case 
"\r":
    echo 
1;
    break;
  case 
"\n":
    echo 
2;
    break;
  case 
"\n\r":
    echo 
3;
    break;
}

?>


Dario Ocles.

lunes, julio 16, 2007

CURL y PHP

Muchas veces necesitamos abrir alguna pagina remota y tomar algo de su contenido, para eso existen varias funciones como fopen(), file_get_contents(). Pero existe un problema, que pasa si la pagina/script que intentamos abrir necesita de algún parámetro que vaya por POST? (si fuera GET se coloca en la URL) para estos casos se puede abrir un socket con fsockopen() e enviar las cabeceras HTTP correspondientes (un poco difícil, no?) o simplemente hacer uso de una genial librería llamada CURL. Con esta librería estas cosas son muy fáciles, y no hay nada mejor para mostrar su potencial que con un ejemplo "real". En el ejemplo se hacen uso de dos script para mostrar como funciona, el primero es el que abre la sesión CURL e envía los parámetros y la segunda la que los recibe.

Código del script curl.php:


<?php

$array_post 
= array("Nombre" => "Dario""Apellido" => "Ocles""Edad" => 20);

$ch curl_init("http://localhost/parametros.php?titulo=".urlencode("Este es el titulo pasado por GET."));
curl_setopt($chCURLOPT_USERAGENT$_SERVER['HTTP_USER_AGENT']);
curl_setopt($chCURLOPT_POSTtrue);
curl_setopt($chCURLOPT_POSTFIELDS$array_post);
curl_setopt($chCURLOPT_COOKIE"cookie[0]=dario;cookie[1]=ocles;hola=mundo;");
$postResult curl_exec($ch);

if (
curl_errno($ch)) {
   print 
curl_error($ch);
}
curl_close($ch);
?>



Código del script parametros.php (el que recibe):

<?php

echo '$_POST:<br />'.nl2br(print_r($_POST,true)).'<br /><br />';
echo 
'$_GET:<br />'.nl2br(print_r($_GET,true)).'<br /><br />';
echo 
'$_COOKIE:<br />'.nl2br(print_r($_COOKIE,true));

?>



Y lo anterior imprime lo siguiente:
$_POST:
Array
(
[Nombre] => Dario
[Apellido] => Ocles
[Edad] => 20
)


$_GET:
Array
(
[titulo] => Este es el titulo pasado por GET.
)


$_COOKIE:
Array
(
[cookie] => Array
(
[0] => dario
[1] => ocles
)

[hola] => mundo
)


Como ven, nada difícil... pruebenlo y jueguen un rato. En la sección del manual de curl_setopt() se muestran todas las constantes que se pueden usar, vean un poco así saben que tienen a su disposición.

Dario Ocles.

domingo, julio 15, 2007

Los Generadores de Symfony

Symfony no es menos y como cualquier otro framework tiene para generar "scaffolding". Un "scaffolding" es una forma de generar un AMB "automático". Lo que se hace es generar código para manejar una tabla de la base de datos, simplemente se configura como conectarse a la base de datos y luego automáticamente se arma el código para un AMB o CRUD.
A pesar de que lo anterior no solo es de Symfony, y ya es bastante común, Symfony tiene algo que llama más la atención. Tiene otra manera de generar la parte administrativa. En los clásicos scaffolding's o CRUD's se genera el código necesario y luego se puede modificar pero Symfony tiene algo parecido con la diferencia de que el código no se genera (se genera pero de forma interna y no deberíamos modificarlo) y que todo se setea por medio de archivos de configuración. Se setea que campos se muestran, cuales no, se pueden ordenar por secciones los campos a mostrar, también se puede (en otro archivo) setear la validación del formulario, si ésta tabla posee relaciones con otras tablas estas se generan estomáticamente y unos cuando detalles más.
Como resultado de todo lo anterior hoy en una hora genere 6 AMB's completos y de forma muy simple y tengan en cuenta que no tengo experiencia "real" con este framework. A continuación dejo 2 capturas de un ejemplo para mostrar... cabe destacar que cada combo que ven es una relación con otra tabla generada automáticamente.


El listado de los datos cargados y el archivo de configuración YAML



Formulario de ingreso donde se puede ver como se puede setear como debe mostrarse el código y con el archivo YAML correspondiente (que es el mismo que el anterior).
Cabe destacar que el combo que se ve es una relación y esos datos fueron traídos estomáticamente.



Actualización (poco después de la publicación):
Después de escribir el post me quede con la leve impresión de que en algo estaba errado. Realmente no sé si lo estoy o no, pero quiero hacer publico que no estoy seguro de que todos los frameworks poseen herramientas para generar scaffolding pero sin embargo sigo manteniendo la postura de que hoy en día no es nada extraño ni del "mas allá".

Dario Ocles.

sábado, julio 14, 2007

El fin de PHP4

Ayer 13 de Julio se anuncia en la pagina oficial de PHP que se le dejara de dar soporte a PHP4. Si quieren ver la nota simplemente vayan a php.net y podrán leerla sin problemas. En el anuncio dicen que después de este año (31 de Diciembre de 2007) se dejaran de publicar nuevas versiones y que solamente seguirán realizando parches de seguridad hasta el 08 de Agosto de 2008 (un día antes de mi cumple años :-P ) después de eso adiós a PHP4. La noticia la recibo con suma alegría ya que con el inminente llegada en poco tiempo de PHP6 creo que ya era hora de que PHP4 desaparezca.
En si a mi la noticia ni siquiera me "toca" ya que hace bastante estoy con PHP5 pero me imagino todo el revuelo que esto generará ya que muchos proyectos y paginas están hechas con PHP4 que deberán ser portadas. A mas de uno no le gustara la noticia pero al fin y al cabo esto es necesario.

Dario Ocles.

jueves, julio 12, 2007

Variable variable ¿?

Una característica que PHP te da son las "variables variables". En realidad es algo que jamás use en algún desarrollo y dudo que algún día lo use, creo que hay muchas formas de hacer las cosas pero utilizar variables variables no es lo más "claro", es más diría que confunde bastante y no es fácil de leer código con variables variables.

Es simple de leer lo siguiente?

$nombre = 'dario';
$variable = 'nombre';

echo $
$variable;

Yo diría que no.

Dario Ocles.

Symfony y su "guía definitiva"

Este framework es de lo mejorcito que conocí. Este framework cuenta con un libro donde se enseña todo sobre este... obviamente el libro hay que pagarlo pero su traducción es libre y pueden descargar "Symfony, la guía definitiva" de aquí o pueden leerlo on-line desde aquí. Si tienen la oportunidad denlen la oportunidad y lean algunos capítulos, si esos no los convence nada lo hará xD ... es bastante bueno, pero también extenso.
Aclaro que este framework no es para ningún trabajo chico, más bien es para proyectos bastantes grandes, ahorra mucho tiempo y los ABM's se hacen practicamente solos. Tiene cosas muy linda, por ejemplo trae un ORM (definición en Wikipedia) que se llama Propel y es muy bueno a mi parecer (tampoco es que conozca muchos ORM's). Como maneja la vista es muy bueno (o por lo menos me gusta)... bue en general me gusta mucho el framework pero es bastante grande el proyecto y cuesta acostumbrarce y aprender sobre todo.

Bueno, en realidad no pretendo tampoco dar un mensaje del tipo "llamé, llamé ya...!" pero en realidad es muy bueno... lean y veanlo y juzguen ustedes.

Dario Ocles.

martes, julio 10, 2007

Aprender Python en pocos días

Por una cosa u otro nunca me puse a leer de manera sería alguna documentación de Python, simplemente leía la lista, algún capitulo de algo en concreto y dudas puntuales. Haces unos días (5 mas o menos) me propuse leer de punta a punta la Guía de aprendizaje de Python. Mi gran sorpresa es lo chica que es y lo rápido que se lee toda la guía. Con el poco tiempo que tengo ultimamente (muy poco por cierto) y sin dejar de lado ningún compromiso e incluso con varios inconvenientes pude leer toda la guía en pocos días. De más esta decir que aprendí mucho sobre el lenguaje y que si ya eres programador es bastante simple aprenderlo, además de lindo, fácil y poderoso.

Ahora voy por la Referencia de Bibliotecas... obviamente no será una lectura muy profunda ya que sería bastante larga y cuando termine no me acordaría de todo, lo que pretendo es tener el conocimiento de las cosas que hay disponibles y cuando haga falta usar alguna voy y profundizo.

Dario Ocles.

lunes, julio 09, 2007

Ejemplo practico de la Interface Iterator de SPL

Extendiendo el post anterior sobre SPL (Standar PHP Library), aquí voy a mostrar un ejemplo "mejor" (es relativo) del que se muestra en el libro de la certificación. En el post anterior comentaba que el ejemplo del libro si bien es bueno y cumple con su cometido creía que alguien con no mucha experiencia no vería todo el potencial de esto.
Como siempre, yo no soy un experto en esto y puede que este equivocado, si lo estoy sentite libre de corregirme que con gusto modifico el ejemplo y hago publica tu corrección.

El ejemplo que voy a mostrar se basa en una posible implementación de unos cursos (de lo que quieras) a cada curso se le agregan los alumnos correspondientes. En este ejemplo se utiliza la interfaz Iterator para poder iterar sobre el objeto curso para imprimir los nombre de los alumnos.


<?php
class Persona{

}

class 
Alumno extends Persona{
     private 
$nombre '';
     private 
$apellido '';

     public function 
__construct($nombre$apellido false){
          
$this->nombre $nombre;
          
$this->apellido $apellido;
     }

     public function 
__toString(){
          return 
$this->nombre . ( $this->apellido != false ' '.$this->apellido '');
     }
}

class 
Curso implements Iterator{
     private 
$alumnos = array();
     private 
$_current 0;

     public function 
agregarAlumno(Alumno $alumno){
          
$this->alumnos[] = $alumno;
     }

     public function 
quitarAlumno(Alumno $alumno){
          if(
in_array($alumno$this->alumnos))
               unset(
$this->alumnos[array_search($alumno,$this->alumnos)]);
     }

     public function 
current(){
          return (string) 
$this->alumnos[$this->_current];
     }

     public function 
next(){
          
$this->_current += 1;
     }

     public function 
rewind(){
          
$this->_current 0;
     }

     public function 
key(){
          return 
$this->_current;
     }

     public function 
valid(){
          return isset(
$this->alumnos[$this->_current]);
     }
}

$data = new Curso();
$data->agregarAlumno(new Alumno('dario''ocles'));
$data->agregarAlumno(new Alumno('pablo''lecuona'));
$data->agregarAlumno(new Alumno('nestor''Garcia'));

foreach(
$data as $key => $value){
     echo 
"$key: $value<br>";
}
?>


Lo bueno de esta tipo de implementación que cuando necesites recuperar otro dato de los alumnos en lugar del nombre simplemente se cambia el método correspondiente y se acabo el problema.

Dario Ocles.

domingo, julio 08, 2007

SPL - Standar PHP Library

La Standar PHP Library (SPL) es una adición que se le hizo a PHP para solucionar algunos problemas comunes. Sobre esto se habla en el capitulo 8 ("Elements pf Object-oriented Design) del libro de la certificación. Una de las implementaciones y ejemplos que muestra es la siguiente... como acceder a un objeto como si fuera un array. En el libro hay un ejemplo bastante "simplón" que si bien muestra como funciona y su potencial personalmente creo que deberían haber implementado otro ejemplo que muestre realmente su poder.

En este post citare el ejemplo del libro y en el próximo post implementare un ejemplo en el que se note un poco más su potencial. Obviamente, en el libro el ejemplo si bien es simple te das cuenta de su poder pero creo que por mas que te des cuenta debería haber sido un ejemplo un poco más "avanzado"... pero a los hechos practico es in-negable que este ejemplo es suficiente.

Explicación:

En SPL se agregan unas cuantas interfaces para que hagamos uso de ellas cuando necesitemos. Una de las interfaces es Iterator y es la que usaremos aquí. Esta interface nos provee de una interacción simple como la de un array de una dimensión. La interface se parece a lo siguiente:

interface Iterator{
function
current();
function
next();
function
rewind();
function
key();
function
valid();
function
seek($key);
}

Y el ejemplo es así:

<?php
class MyData implements Iterator{
     private 
$_myData = array('foo''bar''baz''bat');
     private 
$_current 0;

     function 
current(){
          return 
$this->_myData[$this->_current];
     }

     function 
next(){
          
$this->_current += 1;
     }

     function 
rewind(){
          
$this->_current 0;
     }

     function 
key(){
          return 
$this->_current;
     }

     function 
valid(){
          return isset(
$this->_myData[$this->_current]);
     }
}

$data = new MyData();

foreach(
$data as $key => $value){
     echo 
"$key: $value<br>";
}
?>


Creo que el código habla por si solo :-D

Dario Ocles.

viernes, julio 06, 2007

Matar procesos de Windows con PHP

Siguiendo con el post anterior "Reiniciar/apagar la computadora con PHP" vuelvo con este post y con el siguiente "tip". En Windows tenemos disponible dos comandos útiles uno es tasklist y el otro taskkill. Con el primero listamos los procesos y con el segundo lo matamos.
Para listar los procesos:

$procesos = "";

exec("tasklist",$procesos);

echo
nl2br(print_r($procesos,true));

Y para matarlos es tan facíl como:

$procesos = "";

exec("taskkill /s localhost /f /im cmd.exe",$procesos);

Para más información Inicio -> Ejecutar -> cmd y allí ejecutan lo siguiente y ya tienen información:

taskkill /?

Bueno, aquí acabo con este post medio inútil pero "curioso"... obviamente esto en GNU/Linux tiene que ser más simple de implementar y porque esto? A mí parecer en GNU/Linux nos tienen acostumbrados a darnos el control a nosotros, el usuario, a diferencia de Windows. En GNU/Linux tenemos todo "a mano" y no nos esconden detalles como en Windows, cuantos conocían estos dos comandos?

Dario Ocles.

miércoles, julio 04, 2007

Mi propia consola

Hydra es el nombre de un kit de desarrollo de tu propia consola. Este kit te permite programar juego para esta "consola casera" y así hacer juegos del mismo estilo que se hacían en los años 70/80.


La noticia ya es "vieja" tiene varios días pero no quería dejar de nombrarla aquí ya que sería algo muy lindo obtener. No creo que la llegue a comprar ya que seria una de esas cosas que se usan los primeros 2 meses y luego nunca más pero sin dudarlo la compraria si me sobraran u$s200.

Dario Ocles.

martes, julio 03, 2007

Intercambio de valores entre dos variables (Python)

Extendiendo el post anterior aquí pretendo mostrar lo mismo pero Python el lenguaje más "elegante" que conozco. En el post anterior hacemos uso de dos funciones que nos provee PHP pero no estamos utilizando una "propiedad" del leguaje mismo.

Unas de las cosas hermosas que tiene Python es la asignación multiple. Aquí, a diferencia del ejemplo anterior, no hacemos uso de funciones ni herramientas que nos da el lenguaje en Python hacemos uso de una caracteristica del lenguaje mismo. El código:

  1. >>> uno, dos = dos, uno

Dario Ocles.

lunes, julio 02, 2007

DCOP, GNU/Debian y Kopete

Hoy chateando con mi padre sobre algunas de las bondades de GNU/Linux quise mostrarle como se puede "jugar" con algunas cosas. Le explique sobre algunas cosas como los archivos FIFO y lo que podía hacer con ellos. También le mostré las cosas que se puede hacer gracias a DCOP... como por ejemplo saltar al siguiente tema en la lista de reproducción de Amarok y cosas de ese tipo. Como lo anterior no lo había sorprendido me dispuse a hacer algo con Kopete y que el pueda "ver" efectivamente lo que puedo hacer y como "juego" con las herramientas que tengo a mano.

Jugando pude entre otras cosas, redimencionar la ventana del chat, cambiar el tamaño, minimizarla, maximizarla... obviamente esta cosas ni las podía ver a menos que le mande alguna captura de la pantalla pero obviamente esto no lo iba a impresionar. Entonces conversando me animo y le digo que le iba a mandar mensajes por medio de la consola y me dijo que no creía que pueda lograrlo. El resultado es el siguiente:

dario@debian:~$ dcop kopete KopeteIface messageContact MAIL_DE_CONTACTO@hotmail.com "prueba para mostrar en el blog."

dario@debian:~$ dcop kopete KopeteIface messageContact MAIL_DE_CONTACTO@hotmail.com "Este es otro mensaje..."

dario@debian:~$ dcop kopete KopeteIface messageContact MAIL_DE_CONTACTO@hotmail.com "tercer mensaje y ultimo que muestro."

Captura de la pantalla para mostrar como funciona.

Como ven lo pude lograr... me llevo un poco de tiempo pero lo pude hacer. Si quieren jugar tecleen "dcop" en la consola y les listara las aplicaciones con las que se pueden hacer cosas, escriban luego "dcop APLICACION" y les listara una lista de funciones y cosas así, es bastante intuitivo.

Dario Ocles.

domingo, julio 01, 2007

Reiniciar/apagar la computadora con PHP

Gracias a un post en ForosDelWeb descubro algo interesante. En el post se pide algún código que reinicie/apague la pc con PHP. La computadora que hace de servidor en este caso es un Windows (crashes?). Me puse a buscar info y enseguida dí con una forma de apagar el Win y de inmediato termine con el siguiente código:

exec('%systemroot%\system32\shutdown.exe -r -t 0');

Si desean apagar simplemente cambien el -r y coloquen -s (shutdown).

Esto funciona y me preocupa un poco... en realidad no sé que pensar, esto es un agujero de seguridad (¿?).

Este es un tip un tanto curioso cuanto menos y creo que esto lo deberíamos de anotar.
De todas formas este tip se tendría que agregar a la lista de "Las 5 cosas geniales que puedes hacer con Windows y PHP" ("5 cool things you can do with windows and PHP")... en realidad no tendrían que ser 6? :-P

En cuanto termine de publicar este post apagare mi CPU e iniciare con mi querido GNU/Debian y probaré algo de esto a ver si funciona.

Actualización 02-07-2007 a las 19:19hs:
Como ya me imaginaba esto también funciona bajo GNU/Linux aunque sigo sosteniendo que por la naturaleza de PHP esto no se tendría que permitir. Cuando digo naturaleza me refiero a que PHP a sido concebido para realizar paginas Web y este no tendría que poder manipular cosas del SO.


Dario Ocles.

Intercambiar valores entre dos variables

Que cosa tan simple dirán algunos. Como lo harias? Yo lo haría así:

list($a,$b) = array($b, $a);

Y tú? Lo harías igual?

Dario Ocles.