No soy pobre, no soy pobre


La situación del país está bastante dura, eso ya es evidente para todos desde hace varios meses, el año pasado por estas fechas se empezó a anunciar la venida de la crisis actual, en su momento el gobierno mexicano desestimó el hecho, luego se convirtió en una gripita, y luego ya se había salido de control, actualmente hay unos 10 6 millones de mexicanos desempleados, segun el 10%, aunque no me queda claro qué 10% si hay como 40 millones de mexicanos en edad de trabajar segun yo, así que las estadísticas están raras, aún si fueran 60 millones, no me salen las cuentas. (en realidad son más de 6, tons parece que si salen)

Las soluciones del gobierno han sido bastante argumentables de menos, hablando de LyFC mi opinion no es realmente totalmente negativa, estoy de acuerdo en que se saneen las instituciones, y las empresas de gobierno, pero la verdad es que todos sabemos (bueno no todos, muchos cierran los ojos) que no sirve de gran cosa cerrar LyFC y no cerrar CFE, y que decir del IMSS, que cosa tan triste mantener una institución tan importante para el país que tiene el objetivo de negar el servicio a todo el que se deje (de la SEP mejor ni hablamos).

Y luego pasamos a las babosadas de aumentar impuestos, si, en efecto hay muchos paises que pagan muchos más impuestos que nosotros, pero son paises con un nivel social muy superior, y los impuestos se reflejan en beneficios reales para la población, aqui en México ya todo está privatizado por debajo del agua, en todo pagamos una lanita, y todos los servicios valen gorro, y es bastante obvio que aumentar los impuestos les va a quitar otro cachito de la poca comida que comen 20 millones de mexicanos al día, el cuentito del chancho de que “por cada pesos van a recibir 10” es una reverenda babosada, si estoy seguro que se van a destinar 10 pesos, pero 9.9 de ellos se van a quedar en los beneficios de los altos funcionarios, en mantener a sus esposas y sus camionetotas, y en pagarles el super y las comidas en restaurantes todos los días, porque no es justo que tengan que gastarse un poco de lo que transan a través de manejo de influencias, asignación de contratos de manera “sospechoza”, y en el impuesto de 20% obligatorio para todo contrato a externos que aplican todos los altos funcionarios del país.

Y lo pior es la actitud de mucha gente, no solo están los que no dicen ni hace nada, me parece todavía piorcito que los intelectuales sociales se pongan a decir que trabajemos en vez de estar quejándonos, WTF !!, que hacemos todos los días ??? si es cierto que el país está muy fregado gracias a toda una banda de trabajadores mediocres, pero la verdad es que la gran mayoría están concentrados en la burocracia, un gran porcentaje de la población gana una miseria mientras que tiene que talachearle de albañil, andar cargando bolsas en los mercados, vender cosas en la calle caminando bastantes kilometros al día, y por favor que no vayan a salir con que debieron haber estudiado, si a los 12 años comes 2 veces al día cuando te va bien, lo mejor para tu salud mental es salir a buscar más comida, el ir a estudiar solo te va a meter en más problemas.

Es cierto que todo se puede, pero también es cierto que gran parte de los requerimientos para ser “exitoso económicamente” involucra ya sea nacer en una familia fuera de lo común, o de plano entrarle al esquema corrupción/chingarse-a-los-demás para lograr sobresalir o de menos escapar de la pobreza a la que están condenados 80% de los mexicanos.

Así que por favor !!!, cuando quieras decirle a los demás “ponganse a trabajar”, primero piensa en las condiciones en las que trabajan esos 40 millones de mexicanos que ganan menos de 5 mil pesos al día (nomas estoy hechando números, pero estoy seguro que por ahí andan), con todo gusto se dedicarían a hecharle más ganas y a “ponerse la camiseta” si al menos no tuvieran que gastarse la mitad de ese dinero en impuestos, transporte, y servicios, para quedarse con una miseria que apenas y alcanza para comer (a veces bien).

Y si, los de LyFC tienen demasiada razon en quejarse de que les “den 2 años de sueldo”, te has puesto a pensar que van a hacer los mayores de 35, y pior aún, los mayores de 45, esos de plano ya no van a encontrar empleo, y sabes qué porcentaje de los trabajadores andan en esas edades ?? thank you very much !

Otra cosa sería si de verdad todos nos quejáramos, esa es la actitud de los países que tienen la capacidad económica para pagar los impuestos que nosotros pagamos sin perjudicar su ingesta de alimentos diaria, ese tipo de paises tienen personas que se lanzan a exigirle a sus legistaldores que hagan lo correcto, que se lanzan a destituir a los políticos que son tan descarados como los de México, así que yo si quiero ver que TODOS se quejen, no se trata de dejar de trabajar, de eso pocos pueden darse el lujo, pero si se trata de dejar de ser el pueblo inútil que somos y totalmente despreocupado de los demás.

Si este mensaje es para ti, que tienes dinero para tener una computadora y un contrato de internet, o de menos robarselo al vecino, lo cual singnifica que vives en una zona bastante buena mi cuate.

Buen día

p.d. Se dieron cuenta que el cambio de 2% de impuesto a 1% de IVA ahora le permite a las grandes empresas evadir el pago ?? (bueno, no evadirlo, “recuperar lo que pagan”)



En todos lados se cuecen habas


La semana pasada se circuló el hecho de que Mozilla estaba deshabilitando el plugin que Microsoft metió sin aviso alguno a Firefox mediante una actualización. Hoy en la mañana me encuentro con que ya se están poniendo de acuerdo.

Lo que me preocupa del evento, es que poco antes de este “detalle de M$”, google se aventó una jugada similar para “mejorar el desempeño” del MSIE, y M$ respondió agresivamente contra el movimiento con argumentos muy predecibles y podría decirse que hasta razonables, pero ellos hacen exactamente lo mismo que critican !! y después de haberlo criticado !!

Tanto una cosa como la otra tienen el potencial de aprotar inseguridad, la diferencia es que el plugin de google se tiene que instalar explícitamente por el usuario, en cambio el plugin que M$ puso a FF viene sin aviso alguno, no se puede desinstalar por los medios habituales, y aparte en unos pocos días se encontró que tiene problemas de seguridad, entonces me pregunto yo, si eso no es mala leche, entonces que lo será ??

No es esta una oportunidad para renovar las demandas de competencia desleal, cómo es posible que todos soportemos esas tonterías así como así porque vienen de la mayor empresa de software de mundo??

Y bueno, la negociación de Mozilla al menos a mi me deja con cierta desconfianza, pero bueno, veremos que depara (con eso de que mozilla ya no es cuate de google, ahora si es fácil negociar con M$)

buen inicio de semana !



La base de la sociedad actual: y porque no es posible cambiarla fácilmente


Hola, esta reflexión la escribe un pesimista, lo cual facilita mucho el hacer conclusiones aventuradas, pero el estado social de México no ayuda mucho a cambiar la forma de pensar de alguien como yo, no solo es mi entorno, es lo que se ve a gran escala, y es lo que se ven en el general de la población.

La premisa clave de mi discusión será: “La sociedad actual está definida por la necesidad de mantener un estado suficientemente tranquilo como para maximizar las ganancias de las grandes corporaciones”

Esta “regla empírica” define el actuar del gobierno en general, lo cual indirectamente define la situación general del país, la economía del mismo, y las posibilidades de mejorar en el futuro a mediano plazo (5-10 años).

Es por esto que vemos fenómenos tales como la caida del nivel educativo, donde tenemos a “elbita” manipulando no solo a los maestros, sino a gobernadores, y el mismo presidente de la república, o cómo se le puede llamar al hecho de que el presidente se niegue a dialogar abiertamente con la señora, y cuando llega a encontrarse con ella lo hace a escondidas ?, la respuesta es muy simple, el presidente sabe que la mujere tiene la capacidad para genera un movimiento en contra de el que lo llevaría a la ruina. Por tanto FECAL intenta mantener su distancia de la señora para mantener la calma de la población. Si alguna duda quedara, trata de responderte a ti mismo ¿por qué el presindente no quiere negiciar con ella, pero tampoco la “elimina” políticamente?, razones legales hay muchas, corrupción, tráfico de influencias, conflicto de intereses, y así nos podemos ir.

México es un pueblo pacífico, lo cual hace mucho más sencillo el proceso de represión para el gobierno, estamos acostumbrados a estar en crisis, y una nueva crisis no nos preocupa demasiado porque en realidad nunca estuvimos bien. Pero el fenómeno no se limita a nuestro país, la “regla empírica” antes mencionada se aplica a todas las sociedades, por ejemplo USA, nuestro vecino más cercano en todos los sentidos, tiene en su sociedad signos de obedecer la misma regla, nada más tenemos que ver el actuar de los últimos 3 presidentes, Clinton, incluso se dió el lujo de mentir bajo juramento ante toda su nación, pero como es “guapo”, y “simpático”, todos lo perdonaron; Bush Jr. ni siquiera ganó legalmente las elecciones, gracias a los movimiento turbios de Florida, el estado que gobernaba su hermano cuando estaba de candidato, pudo llegar a la corona, y nunca nadie se atrevió a hacer suficiente para impedirlo, por qué ?, porque el pueblo de USA es muy dependiente de su estabilidad financiera, y Bush inmediatamente se encarriló a generar una nueva guerra contra los perpetradores del ataque a las torres gemelas, que aparte de eso, ya tenían en sus manos armas de destrucción masiva !!!, las cuales despues de algunos años no han sido encontradas, y de hecho ni siquiera ha sido capaz de encontrar al que se supone es el jefe máximo (cabe mencioanar que Osaba Bin Laden tiene una amplia familia que se ha dedicado a los negocios con la familia Bush desde hace unos 20 años al menos). Y bueno, términemos con Obama, el presidente que prometió terminar con guantanamo (y que se acaba de retractar un poquito), y con la guerra de Iraq que empezó su antecesor, y que resulta que no ha retirado ni una tropa hasta el momento, y además ya buscó la manera de mantenerla en la región proponiendo una nueva guerra en Afganistan, pero a nadie le parece raro que quiera terminar la guerra ocupando Iraq, Iran y Afganistan, que son paises vecinos.

Cuál es la razón por la que los gringos no detienen las babosadas de sus gobernantes ??, no es porque sean tontos, no es porque no se den cuenta, es porque prefieren “creer” en las palabras, a aceptar que tendrían que empezar un movimiento social en contra del gobierno real que maneja a los políticos de todos los niveles, tendrían que dejas su cómoda casa, para ir a pelear el poder que han acaparado los economistas, lo que controlan la “reserva federal”, tendrían que intentar eliminar la CIA y el FBI para no correr el riesgo de que los líderes de un movimiento como ese fueran asesinados o encarcelados con los más tontos argumentos (seguridad nacional).

El gobierno de USA sabe que puede generar otra guerra, a pesar de haber prometido acabar con la actual, sin que suceda una tragedia social, es por ello que Obama logró ganar prometiendo muchas cosas, y se ha mantenido en el poder a pesar de haber demostrado que no tiene interés en mejorar la sociedad como tal, sino en mejorar las ganancias económicas de las empresas de sus cuates.

El gringo promedio prefiere estabilidad económica pos sobre todas las cosas, de todos es sabido que “el país de la libertad” es uno de los paises con más problemas de violaciones de derechos humanos, es un país plagado de racismo, es un país en el que la gente prefiere sentir que es libre a través del derecho inalienable de drogarse, que a mantener a un gobierno que trabaje transparentemente para el bien social general.

Entonces, tanto el pueblo mexicano, como el pueblo gringo son sociedades suficientemente tranquilas como para que al ser sumergidas en “la mayor crisis” en 60 años, o en “la guerra del narco” que no sirve más que para llenar portadas de periódicos sensacionalistas, estas no hagan nada más que aceptar “su realidad”, y seguir levantandose en la mañana a trabajar para una compañía que les paga apenas para comer, y que además de todo les exige en estos tiempos “ponerse la camiseta” y trabajar más para que los de arriba sigan manteniendo su nivel de vida, mientras que ellos ya no están comiendo carne 1 vez a la semana, sino 1 vez al mes.

Volviendo a México, cómo explicamos que nuestro país está en crisis severa, cuando el hombre más rico del mundo es mexicano, y su fortuna calculada alcanzaría para regalarle unos 40 mil pesos a cada una de las familias del país, que alguien me explique como es que un gobierno puede darse el lujo de generar esa cantidad de dinero para una sola persona y que se atreva a despreciar de la manera que México desprecia a los campecinos, que son los que nos dan de comer !!! es verdaderamente ridículo que aceptemos la situación, pero otra vez, el gobierno sabe que puede apretarnos un poquito más, sin que digamos nada, no nos aprieta demasiado de un solo golpe, solo de a poquito, porque así logramos darle más ganancias.

No tengo números exactos, ni oficiales, pero en general las familias pobres deben estar ganando unos 5 mil pesos al mes, y esas son las familias que trabajan en maquiladoras, etc (ambos padres trabajando), existe el otro lado de la moneda, que son familias que viven pepenando basura, o viven del campo, esas familias pueden llegar a sobrevivir con mil o dos mil pesos al mes, no comen carne prácticamente nunca, no tienen acceso a seguridad social, ni pensiones de vejez, y por supuesto, no tienen la menor posibilidad de darle a sus hijas una educación mínima como para hacer algo mejor que irse a USA a andar de esclavos modernos.

Y bueno, cualquiera diría, en las proporciones está el secreto, pues aproximandamente el 90% de las familias mexicanas sobreviven al mes con menos de 5 mil pesos, si piensas que por ejemplo un kilo de carne les daría para comer 1 días (vamos a ser positivos), para comer carne diario (ya sea de pollo, res, pescado, etc), tendrían que gastar al menos unos 2500 pesos, más todos los implementos, digamos que en total andaríamos en los 3000 pesos, para comer una vez al día carne, y poquita, 1/2 kilo para 4 o 5 personas resulta en una porción bastante pequeña. Entonces resulta que solo les quedan 2 mil pesos para desayuno y cena, lo cual no está tan mal, una dieta balanceada podría llevarse bastante bien con los 5 mil pesos, pero y el transporte, la luz y agua, los uniformes de los hijos, la guardería, ambos trabajan !, y así nos podemos ir, fácilmente descubrimos que esa familia tiene que destinar unos 600 pesos para transporte al trabajo, porque si no los destinan entonces no ganan nada y mueren de hambre. Es explicable porque gran parte de la población no paga agua ni luz ? ahora entiendes porque hay tantos diablitos ?? porque al gobierno le es más rentable pagarles la luz por debajo del agua, a hacerlos enojar más de lo que ya están por la situación del país. Te dejo robarme un poquito en servicios esenciales, y que deberían estar garantizados por simple humanidad, pero te obligo a trabajar por una miseria para que el dueño de la empresa en la que trabajes pueda gastarse en una comida de su familia lo que tu ganas en 1 mes.

No, si en rentablidad somos expertos, ni un matemático podría maximizar mejor la ecuación que los gobiernos de nuestros paises en estos momentos.

Entonces, aquí está la explicación de mi pesimismo social, no se puede hacer gran cosa si la única manera de llegar al poder es a través de corrupción. Se requiere un cambió, pero no de gobierno, sino de sociedad, debemos entrarle a la negociación con caracter, tenemos que lograr que el gobierno tenga menos cuerda de donde jalar, y eso no va a suceder sin agresividad, mientras el pueblo no reaccione violentamente ante cambios que lo perjudiquen, nada va a pasar en este país. Recuerda siempre que el gobierno nos va a tratar de fregar tanto como se pueda sin que nos levantemos a reclamarle, entonces ES HORA DE RECLAMAR !



Mujeres arriba (musicalmente)


Ya hace como meses que quería hacer una buena lista de comentarios sobre 2 discos (y ahora son 3) que me gustan mucho, se trata, en orden de aparición en mi vida de:

  • End of an Era (Nighwish)
  • It’s not me, it’s you (Lily Allen)
  • The Fame (Lady GaGa)

End of an Era

Este disco es la despedida de Tarja Tururen, la vocalista original de NightWish, lo cual en si es toda una historia, pero lo que me gusta de este disco es que es una recopilación de las mejores canciones del grupo tocadas en vivo, en un concierto que al menos se oye muy chido, supongo que fue mucho mejor verlo en vivo.

No soy un gran conocedor del grupo, desde hace muchos años que los he escuchado de vez en cuando, pero nunca había logrado conectar tan fuertemente con su música hasta oír este disco.

La voz de Tarja puede no ser la de la mejor mezzo que exista en el mundo, pero congenia muy bien con la música, y claro, una cosa que me gusta mucho es la velocidad de las canciones rápidas, aunque las tranquilas son muy buenas también, y las intervenciones de Marco siempre le dan un toque agresivo a las rolitas que contrasta perfectamente con la dulzura de Tarja.

En fin, es un muy buen disco, y me gusta mucho oirlo.

Mis preferidas del disco:

  • Dark Chest of Wonders
  • Planet Hell
  • Phantom of the Opera
  • The Siren
  • Sleeping Sun
  • High Hopes (Rolota !!)

It’s not me, it’s you

Este disco es el más reciente de los 3, y el segundo que conocí de los 3, o sea que mi actualización en cuanto a música no está muy bien, ni siquiera sincronizado.

Aparte es el primer disco que escucho de Lily Allen, y obviamente lo empecé a escuchar despues de ver uno de los videos de su canción “Fuck You”, y podría decir que el disco tiene “la cantidad exacta de pop” para mi, casi todas las canciones me gustan, lo cual es bastante raro, y varían desde mentarle la mamá a Bush, hasta el amor por la pareja, e incluso tiene una canción que habla de su mamá, y otra de su papá.

Es bastante irreverente, y de repente grocerita, pero con la vocecita de angel que tiene pos hasta bonito se oye.

Por otro lado, el disco hace una crítica social, o cultural, curiosamente a mi me parece que Lily Allen está encajonada exactamente en el grupo social que desprecia, pero bueno, no la conozco personalmente, igual y cambiaría de opinion.

Como sea, incluso todas las letras me parecen bien hechas, reflejan mucho lo que creo es la personalidad de la autora.

Mis preferidas:

  • Everyone’s at it
  • The Fear
  • Not Fair
  • 22
  • I could say
  • Back to the Start
  • Never Gonna Happen
  • Fuck You
  • Who’d have know
  • Chinese
  • Him
  • He Wans’t there

Aqui si está canijo escoger, todas las canciones me gustan mucho, varias me recuerdan sucesos en mi vida, y otras (Fuck you y Him) son muy acertadas en lo que vivimos actualmente, una sociedad formada por gente estúpida.

The Fame

Este es el último gran disco que he descubierto, apenas hace como 1 mes creo, todo el disco es bastante intracendente, de hecho Lady Gaga dice que todo en su vida se trata de fama, moda, etc, y el disco le hace honor a esa actitud, pero la verdad es que está muy bien hecho, tiene ritmos muy variados para ser un disco “dance”, y creo que lo que más me gusta es la actitud sexual descarada.

En varios sentidos este disco y el anterior se parecen mucho, y a la vez son muy distantes, pero una constante en los dos es que hablan mucho de la forma en la que ambas mujeres aman, y tengo una debilidad muy fuerte por las cantantes que hablan de como aman a los hombres.

Yo creo que ambas cantantes deben prácticamente despreciarse entre si, pero para mi son muy parecidas, y muy buenas en su trabajo.

“Brown Eyes” me parece mega chidisima, solo por mencionar una rola :), pero en general disfruto prácticamente todo el disco, desde las rolas intrascendentes discotequeras, hasta las más romanticonas, o las despechadas.

De hecho en este disco hay una rola que se parece en el tema mucho a otra del disco de Lily Allen pero tomado en una forma muy distinta (“I like it Rough” y “Not Fair”)

Mis preferidas (tengo el disco versión UK):

  • Just Dance, Lovegame, Paparazzi y Pocker Face (nomas pq son divertidas)
  • I like it rough
  • Eh eh (Cherry-cherry bum-bum !! GaGa!)
  • Brown eyes
  • Again Again
  • La verdad es que todas me gustan, pero Lily Allen debe llevarse la corona.


it’s alive !


Hola mundo !

Este es mi primer mensaje (despues de un par de meses creo)

Y pos aprovechando la oportunidad, me dió risa esta nota

Los “detalles” que están dispuestos a soportar los que contratan el servicio comercial de google 🙂

Pero bueno, si ya te han hackeado el servidor “n” veces, pos creo que es el menor de los males.

Y bueno, tengo intenciones de bloguiar más, pero nomas no encuentro el tiempo



archivo de word->txt->perlazo->html


Este es un post sobre el fino arte de piratearse un ebook, aunque no voy a decir que me incrimine, excepto que se trata de una autora contemporanea, de la que hace poco comenté aquí mismo que leí cierta saga de 4 libros sobre vampiritos amables.

Bueno, la historia está así, tengo un archivo de word (.doc), entonces, lo primero que hice fue convertirlo a txt en el word (duh!), luego con el script que está abajo que además usa el programa “txt2html” se divide el texto en capítulos y se convierte a HTML para ser subido a mi iphone y pueda ser leído con el BookReader.

Si tuve que hacerle algunos cambios al “txt”, porque el script no es muy inteligente (como su dueño) (no es mío !!), pero nada que tome más de 1 minuto, al final tengo en mi iphone listo para leerse la más reciente novela de la susodicha misteriosa.

[codesyntax lang=’perl’ container=’pre’]#!/opt/local/bin/perl -w
use strict;
use warnings;

my $file = $ARGV[0];
open FILE, “< $file"; my $oldname = "CHAPTER 0"; open FILE_OUT, ">$oldname.txt”;
while () {
chop;
my $linea = $_;
if ( $_ =~ m/^CHAPTER [\d]+$/ ) {
print “$_ – “;
my $chap = $_;
my $name =
;
chop $name;
print “$name\n”;
close FILE_OUT;
open FILE_OUT, “>$chap-$name.txt”;
`txt2html “$oldname.txt” > “$oldname.html”`;
$oldname = “$chap-$name”;
$linea = “$chap – $name”;
} elsif ( $_ =~ m/^Page [\d]+$/ ) {
$linea =
;
$linea =
or $linea = “”;
}
print FILE_OUT “$linea\n” or warn “Fin de archivo?”;
}
`txt2html “$oldname.txt” > “$oldname.html”`;
[/codesyntax]

El documento original usa un par de patrones para los títulos de cada capítulo y para las páginas, entonces de eso me aproveché para poder dividir en archivos cada capítulo, y bueno, eliminar la molesta etiqueta de “Page 1… Page 2…”. Con lo cual doy el primer paso para dedicarme a convertidor de textos a ebooks 😛

SPOILER: El libro es “The host” o “La Huesped” creo se llama en español, de Stephenie Meyer de quien me declaro fans ! (en realidad esto es pa ayudarle a google a indexar el post 🙂



CGI::Aplication el fino arte de hacer web perl-style


Perl es una maravilla en cuanto a robustes y disponibilidad de módulos para hacer lo que sea, no solo es posible analizar logs al más puro estilo geek, sino que se pueden hacer cosas como “parsear” un archivo de excel para importarlo a una base de datos, o crear sitios web con todas las características que necesitan.

Para crear aplicaciones Web, Perl tiene un monton de opciones, desde hacer un CGI a mano que haga toda la magia de entender los headers, extraer los argumentos de GET y POST, y desplegar HTML intercalado en el código, al más puro estilo de PHP (porque lo heredó de Perl), sino que existen muchos módulos (CPAN) que nos ayudan a hacer las cosas de manera más ordenada y mantenible.

En esta nota quiero abordar la utilización de un módulo muy robusto, casi podríamos decir que es realmente un Framework de desarrollo web, aunque a mi no me gustan los frameworks,  uno no deja de admirar la simplicidad con la que se puede crear una simple paginita web siguiendo bastante fielmente algunos de las más famosas “mejores prácticas”, como el MVC, el uso de capa de abstraccion en la base de datos, y sobre todo el crear código seguro contra ataques de injeccion SQL y XSS.

Para empezar vamos a plantear el clásico ejemplo de crear un blog muy sencillo, que tenga autenticación, guarde en mysql, y nos permita mandar noticias y poner comentarios en ellas, nada exótico.

Empezemos por crear una base de datos:
[codesyntax lang=’sql’ container=’div’]mysql> create database perlblog;
Query OK, 1 row affected (0.09 sec)

mysql> grant all privileges on perlblog.* to blog@localhost identified by `20y1337` ;
Query OK, 0 rows affected (0.27 sec)
mysql>[/codesyntax]
Necesitamos varias columnas, una para los datos del usuario (user), otra para las noticias (news), y otra para comentarios (comments), luego veremos si se requiere algo extra.
[codesyntax lang=’sql’ container=’div’]mysql> create table user (id int unsigned not null auto_increment, login varchar(50) unique, password char(32), name varchar(150), created datetime, last_log datetime, primary key (id));
Query OK, 0 rows affected (0.21 sec)

mysql> create table news (id int unsigned not null auto_increment, title varchar(254), summary tinytext , news text, posted datetime, last_edit datetime, user_id int unsigned not null default 1, primary key (id));
Query OK, 0 rows affected (0.43 sec)

mysql> create table comment (id int unsigned not null auto_increment, title varchar(254), comment text, posted datetime, last_edit datetime, user_id int unsigned not null default 0, name varchar(255), email varchar(255), primary key (id));
Query OK, 0 rows affected (0.09 sec)
[/codesyntax]

El la columna del usuario al menos nos hace falta su correo electrónico, agreguémoslo:
[codesyntax lang=’sql’ container=’div’]mysql> alter table user add column email varchar(255) after password;
Query OK, 0 rows affected (0.18 sec)
Records: 0  Duplicates: 0  Warnings: 0
[/codesyntax]

Ya estamos listos para empezar, posiblemente lo primero que queremos hacer es poder insertar una noticia, así que vamos a crear una paginita de captura. Para esto necesitamos crear el ambiente inicial:

[codesyntax lang=’perl’ container=’pre’]package Blog;
use strict;
use warnings;
use base ‘CGI::Application’;
use CGI::Application::Plugin::AutoRunmode;
use CGI::Application::Plugin::DBH (qw/dbh_config dbh/);

sub cgiapp_init {
my $self = shift;
$self->dbh_config(“dbi:mysql:perlblog”, “blog”, `20y1337`);
}
sub news_list : StartRunmode {
my $self = shift;
my $q = $self->query();

my $sth = $self->dbh->prepare(“SELECT * FROM news ORDER BY posted DESC”);
$sth->execute();
my @rows;
while ( my $row = $sth->fetchrow_hashref ) {
push(@rows, $row);
}
return @rows;
}
1;
[/codesyntax]

Con esto estamos armando el ambiente más mínimo posible, estamos creando un paquete que va a contener todas las rutinas que requiere la aplicación, y estamos usando uso de CGI::Application que será nuestra base para hacer prácticamente toda la programación.

La subrutina “cgiapp_init” es la encargada de inicializar todos los requerimientos, que por lo pronto solamente es la conección a la base de datos, para lo cual estamos usando un plugin para CGI::Application que se llama CGI::Application::Plugin::DBH, en síntesis es meterle la capa DBI directamente nuestro “framework”.

Para poder ejecutar lo que llevamos de aplicación tenemos que crear un script que ejecuta el paquete, lo cual es bastante sencillo, y no volveremos a tocarlo una vez escrito lo siguiente a “index.pl”:

[codesyntax lang=’perl’]#!/opt/local/bin/perl -w
use strict;
use warnings;
use Blog;
my $app = Blog->new();
$app->run();
[/codesyntax]

Noten que estoy usando un path para perl medio extraño, el 99% de los casos se usará el estandar “#!/usr/bin/perl -w”, yo uso ese pq me gusta más trabajar con el perl instalado por macports, el perl nativo de Mac OS X está medio chafita en algunos aspectos y prefiero algo más estandar, con suerte casi nadie que lea este post va a desarrollar sobre Mac 🙂

Una vez creados estos 2 archivos en el directorio de los “cgi-bin”, entonces visitamos en el navegador algo como http://localhost/cgi-bin/index.pl y vamos a ver un número entero, posiblemente cero, que será el número de renglones que existan en la columna “news” de la base de datos.

Con esto estamos aprendiendo un truco útil cuando estemos usando CGI::Application, siempre que quieras debugear algo, puedes poner un return de la variable que sea interesante, funciona como el típico “print” para debuguear, la diferencia es que el return termina en ese punto la ejecución de la rutina, y nos devuelve a la pantalla del navegador solamente el valor de dicha variable. Podríamos haber puesto “return ‘hola mundo'”, pero no sería tan divertido.
Ahora insertemos un renglon en “news”, ejecutando:

[codesyntax lang=’sql’ container=’div’]insert into news values (null, ‘titulo 1’, ‘estes es un resumen’, ‘y esta es la noticia extendida’, now(), now(), 1);
[/codesyntax]

Si recargamos la página en el navegador veremos un “1”, nada excitante, pero podemos meterle más emoción retornando “$rows[0]{‘title’}” en vez de “@rows”, con lo cual ahora veremos un excitante “titulo 1” !!! solo estamos demostrandonos a nosotros mismos que “podemos interactuar con una base de datos de verdad”.

Ahora vamos al paso de presentar esa información en un formato decenton, vamos a crear una plantilla en HTML muy sencilla, solo para llenar el requisito, una vez entendido todo el proceso, será trivial ir a buscar un diseño gratuito y adaptarlo.

[codesyntax lang=’html4strict’]<?xml version=”1.0″ encoding=”UTF-8″?>
<!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.1//EN”
“http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd”>
<html xmlns=”http://www.w3.org/1999/xhtml” xml:lang=”en” >
<head>
<title>[% title %]</title>
</head>
<body>
<p>[% title %]<</p>
</body>
</html>
[/codesyntax]

Tenemos un documento básico de XHTML, pero noten que el título tiene algo extraño ([% title %]), es la presentación del contenido de una variable (title) en el “lenguaje” de Template Toolkit (TT), que será lo que utilizaremos para las plantillas.

El código de nuestro paquete necesita unos cambios ligeros, necesitamos inicializar el sistema de plantillas, y necesitamos decirle a “news_list” que interprete la plantilla “index.html”, vamos a agregar a la rutina “cgiapp_init” esto:

[codesyntax lang=’perl’ container=’div’]$self->tt_config(
TEMPLATE_OPTIONS => {
INCLUDE_PATH => ‘/Users/max/templates/’,
},
);
[/codesyntax]

Y en “news_list” vamos a sustituir la última linea, la del return, por esto:

[codesyntax lang=’perl’ container=’div’]my $vars = {
title => ‘Soy el blog m&aacute;s 1337’,
rows => \@rows,
};
#return $rows[0]{‘title’};
return $self->tt_process(‘index.html’, $vars);
[/codesyntax]

Con esto estamos mandandole a la plantilla 2 variables, aunque solo está utilizando una de ellas. Puedes darle “recargar”, “reload”, o como diga tu navegador :).

Ahora vamos a usar la segunda variable, que en realidad es una ·$&%$&/· referencia a un arreglo que tiene por elementos hashes (o arreglos asociativos), pa su madre no ?? como nota personal, odio las referencias en perl, siempre me confundo en que es una referencia y que no, pero bueno, sigamos.

Queremos cliclar sobre las noticias, pero solo hemos insertado una, inserta unas 2 o 3 más, incluso pueden usar exactamente los mismos datos que la primera, pero a veces ayuda tener una pista de que algo diferente se está haciendo, puedes cambiar el 1 por 2 y luego 3 y luego 4 en el título, y ya con eso tenemos.

Lo que haremos en la plantilla es agregar un ciclo sobre el arreglo “@rows”, no es nada complicado, queda más o menos así:

[codesyntax lang=’html4strict’]

…..

<p>[% title %]</p>
[% FOREACH row IN rows %]
<p>[% row.title %] ([% row.posted %])</p>
<p>[% row.summary %]</p>
<p><a href=”index.pl?rm=view&id=[% row.id%]”>Ver noticia</a></p>

….

[/codesyntax]

Con esto ya tenemos el listado de las noticias, ahora falta que podamos ver la noticia en extenso, y agregarle comentarios. Con el siguiente paso vamos a aprender como se definen más actividades a través de un solo módulo.

En el último cambio a la plantilla estamos agregando una liga, la cual contiene 2 variables con sus respectivos valores, “rm”, e “id”, el primero contiene el nombre de la rutina que se desea ejecutar en el módulo “Blog”, en este caso es “view”, y la segunda variable es el dato extra que necesitamos para saber cual noticia desean ver.

Lo que necesitamos ahora es tener la rutina “view”, donde vamos a seleccionar de la base de datos la noticia con el “id” que el usuario desea ver, y la vamos a mostrar en su respectiva plantilla.

La vista es sencilla, solamente tenemos que seleccionar el ID de la noticia que se desea ver, y mandarla a la plantilla:

[codesyntax lang=’perl’ container=’pre’]sub view : Runmode {
my $self = shift;
my $q = $self->query();
my $sth = $self->dbh->prepare(“SELECT * FROM news where id = ?”);
$sth->execute($q->param(‘id’));
my $row = $sth->fetchrow_hashref;
my $vars = {
title => $row->{‘title’},
row => $row,
};
return $self->tt_process(‘view.html’, $vars);
}
[/codesyntax]
Podemos ver que la vista se define solamente con “Runmode”, esto quiere decir que este módulo solo se va a ejecutar cuando sea llamado explícitamente (rm=view en GET). Y la plantilla puede ser tan sencilla como esto:
[codesyntax lang=’html4strict’]<p>[% title %]</p>
<div>
<h1>[% row.title|html %] ([% row.posted|html %])</h1>
<h2>[% row.summary|html %]</h2>
<div>[% row.news|html %]</div>
<p><a href=”index.pl”>Ir al Inicio</a></p>
</div>
[/codesyntax]
Con esto tenemos la base de la aplicación, pero solo visualmente, todavía no podemos mandar comentarios, ni mandar noticias.
Lo que necesitamos hacer es crear una forma en la plantilla, y recibir en una vista lo que se envía por POST. El modulo “view” cambia un poco, queda mas o menos como esto:
[codesyntax lang=”perl” container=’pre’]sub view : Runmode {
my $self = shift;
my $sth;
my $q = $self->query();
if ( $q->param(‘submit’) ) { # POST METHOD, let’s save the comment
$sth = $self->dbh->prepare(“INSERT INTO comment (title, comment, posted, last_edit, user_id, name, em
ail, news_id) VALUES ( ?, ?, now(), now(), 0, ?, ?, ?)”);
$sth->execute( $q->param(‘title’), $q->param(‘comment’), $q->param(‘name’), $q->param(’email’), $q->param(‘id’)
);
}
$sth = $self->dbh->prepare(“SELECT * FROM news WHERE id = ?”);
$sth->execute($q->param(‘id’));
my $row = $sth->fetchrow_hashref;
$sth = $self->dbh->prepare(“SELECT * FROM comment WHERE news_id = ? ORDER BY posted DESC”);
$sth->execute($q->param(‘id’));
my @comms;
while ( my $comm = $sth->fetchrow_hashref ) {
push(@comms, $comm);
}
my $num_c = @comms;
my $vars = {
title => $row->{‘title’},
num_c => $num_c,
row => $row,
comms => \@comms,
};
return $self->tt_process(‘view.html’, $vars);
}
[/codesyntax]
Con esto está casi completo el objetivo de este pequeño tutorial, pero falta una parte importante, la autenticación, pero como estamos haciendo todo al menor estilo de CGI::Application, solo tenemos que agregar unas cuantas lineas:
[codesyntax lang=’perl’ container=’pre’]use CGI::Application::Plugin::Session;
use CGI::Application::Plugin::Authentication;
Blog->authen->config(
DRIVER => [
‘DBI’,
TABLE => ‘user’, CONSTRAINTS => {
‘user.login’ => ‘__CREDENTIAL_1__’,
‘MD5:user.password’ => ‘__CREDENTIAL_2__’,
},
],
LOGOUT_URL => ‘http://latin.example.com/cgi-bin/index.pl’,
STORE => ‘Session’,
);
Blog->authen->protected_runmodes(qw(view));
[/codesyntax]
y un hacer un INSERT en la tabla “user”:
[codesyntax lang=’sql’]insert into user values (null, ‘admin’, MD5(‘admin’), ’[email protected]’, ‘Admin’, now(), now());
[/codesyntax]
El módulo de autenticación tiene la capacidad de reusar la instancia de DBI, y además nos crea una página de logueo, e incluso redirecciona “inteligentemente” a la página que estabamos tratando de accesar. La información que ponemos en su inicialización es la estrictamente necesaria, la tabla donde están las columnas de usuario y clave, las columnas, el método de “encriptación”, y por supuesto el método que se usará para autenticar, no tiene que ser una base de datos escrictamente, se puede crear un driver personalizado para soportar cosas más exóticas.

Y finalmente un punto importante que debemos notar, el uso de sesión, es necesario que guardemos en sesión los datos de autenticación, o el usuario final va a tener que estar metiendo su nombre usuario y clave con demasiada frecuencia, con solo agregar el módulo de session, y decirle al driver de autenticación que guarde las variables en él, ya tenemos un método de autenticación completo y funcional.

Noten que solo estoy poniendo como protegido al módulo “view”, podemos poner a cualquier módulo protegido, (ej. qw(view list otro_modulo) pero normalmente la lista de noticias nos gusta mantenerla pública, y de hecho normalmente la vista extendida de la noticia también, pero en este caso tenemos en el mísmo módulo tanto la vista extensa, como el agregar comentarios, es una buena idea separar los comentarios en otro módulo, de tal manera que podamos atomizar mejor los privilegios sobre la página.

Obviamente este ejemplo es muy mínimo, y se ve terriblemente mal, porque no tiene ni siquiera CSS, pero todo eso se corrige con la ayuda de un diseñador, los programadores no somos buenos diseñadores, así que pa que le hacemos al cuento? (tip: baja una plantilla gratuita de algun sitio 🙂

Espero que a alguien le parezca interesante este resumen de cómo usar CGI::Application, la documentación es bastante buena, pero cada módulo está documentado independientemente, y a veces es un poco complicado para alguien (como yo) de encontrarle la hilación, pero una vez que se entiende la base, lo demás es muy sencillo.
Ah !!, y una de las grandes ventajas de usar CGI::Application es que fácilmente se puede montar tanto sobre CGI como en mod_perl, aunque nunca he usado mod_perl :), pero en teoría no hay prácticamente nada que hacer para que funcione en ambos.

Eso es todo amigos, buen día 🙂



chrome OS: al fin se hace realidad(?)


La noticia de hoy es la propuesta de google a las necesidades modernas de sistemas operativos.

En realidad la propuesta es poco ambiciosa, ya que se enfocará a las “netbook”, las laptops pequeñitas que se han puesto de moda de un año para acá. Y bueno, de las palabras oficiales se entiende que trataran de generar un sistema operativo bastante mínimo, al menos al principio (espero), que trabaje prácticamente todo sobre web, aprovechando

Entre lo más relevante que veo de la propuesta, creo que intentarán replicar el comportamiento de las Mac en cuanto al hibernado/suspención, de tal manera que no tenga nadie que reiniciar más de una o dos veces por mes, o menos, tal vez solo para actualizar.

Lo bueno de la noticia en general es que escogieron Linux, así que podemos esperar un repunte de su popularidad para el año que viene, seguramente no van a lograr algo espectacular, al menos no en un año, pero esto podría significar mucho para Linux a mediano y largo plazo y claro para el SL en general, aunque el SL como tal ya es mucho más popular en sí que Linux.

Para antes de que termine este año veremos a un monton de geeks empezar a probar el nuevo sistema operativo :), me incluyo en la lista.



el recuento de los daños


No puedo dejar pasar la oportunidad para clausurar con broche de oro el final de las elecciones, poniendo esta bella foto como continuación del post anterior

837

Creo que queda claro de que se trató la campaña, de hacerse weyes poniendo espejitos para incandilar a la gente, cuanto apuestan a que cada “contenedor de basura” costó varios miles de pesos ?? pero no les alcanzó para mandar a recojerlos con todo y la basura que tenían, la tuvieron que dejar ahí !! 🙂

Que bueno que ya se acabó la campaña !!, al menos ahora los robos no van a ser tan evidentes.



Problemas para respaldar Iphone 3.0


Desde ayer o antier empezó a darme un error la sincronización del iphone, el itunes me decía algo como:

iTunes could not backup the iPhone “GaReGeD” because the iPhone disconnected.”

Estuve buscando en google soluciones y encontré que este problema se ha dado en diferentes circumstancias desde el firmware 2.x.x, en general está relacionado con el jailbreak, pero ninguna de las soluciones se ajustaba a mi version del OS, a pesar de que la “sintomatología” era la misma, se sincroniza música, aplicaciones y datos correctamente, pero no se respalda el iphone.

Pues finalmente logré crear un respaldo borrando TODAS las aplicaciones, intenté borrando unas cuantas primero, pero nunca se corrigió el problema, entonces lo que hice fue conectar el iphone, seleccionarlo en el itunes, irme a la pestaña de aplicaciones y deseleccionar la opción de sincronizar las aplicaciones, luego dar click en “sync”, esperar a que eliminara todas las aplicaciones, obviamente se pierden los datos, pero no me preocupa mucho, puedo volver a jugar desde el principio los juegos :), una vez que termina de eliminar todas las aplicaciones le di click derecho (dos deditos si es una macbook) en el icono del iphone y seleccione “backup”, con eso creo el respaldo de hoy, así que si llego a tener mayores problemas al menos se que puedo volver a lo que tenía hoy 🙂

Una vez que se termina el respaldo, toma 5-10 minutos, puedes instalar de nuevo todas las aplicaciones, y el sincronizado sigue funcionando 🙂

Estoy casi seguro que el problema tiene que ver con usar installo.us con sincronización hacia el itunes, pero no lo he comprobado.