miércoles, 16 de noviembre de 2011

Insertando calendarios de jQuery con Symfony

Calendario de jQuery con plugin sfFormExtraPlugin para Symfony

Recientemente comencé a desarrollar aplicaciones en  PHP con el  framework Simfony. En este corto articulo les narro cómo instalar el  plugin sfFormExtraPlugin y luego facilitarle al usuario la selección de fechas mediante el uso de un calendario (en este caso de  jQuery Datepicker). De más está decir que me ha dado unos cuantos dolores de cabeza , así que espero que este corto tutorial también pueda servirle a todos aquellos que tienen problemas similares al mío. Por el camino, como efecto secundario, también espero que queden claras las razones por las que me gusta  Python, especialmente  las plantillas de Genshi con Django. Espero también que Ustedes con sus comentarios puedan iluminarme el camino que lleva a mejorar la solución que les presento por acá. Les sugiero  suscribirse a este blog mediante RSS si desea estar al tanto de nuevos trucos de programación. Sin más rodeos, let the hacking begin ! .

Pre-requisitos

Formulario estándar de Symfony

Sinceramente hay  muchos tutoriales detallando los primeros pasos en Symfony. Es por esto que no pretendo abordar todos estos pasos. Asumo entonces que ya existe un sitio funcional y muy especialmente una página que utiliza los  formularios de Symfony para ofrecerle al usuario la posibilidad de seleccionar fechas. En otras palabras , ya se tiene una aplicación donde existe una clase TestForm.class.php que utiliza los modelos que brindan acceso a la base de datos; además existen módulos, componentes, y todo lo que sea preciso (... hay muchos caminos para llegar a Roma ;) para obtener una página similar a la que se muestra en la figura.

Instalando el plugin sfFormExtraPlugin

Segun la documentación hay  muchas formas de instalar un plugin de Symfony. De más está decir que Murphy (... mi gran amigo de mil batallas ... Jo jo jo ...) se encargó de que ninguna funcionara. Me explico. Cualquier variante de instalación en línea que incluyera conectarse al  PEAR channel de Symfony siempre terminaba en un adorable mensaje The channel symfony does not support the REST protocol . Por tal razon pasé a la próxima fase : la instalación offline . A continuación les muestro brevemente cómo se hace (basado en  este artículo del sitio My Rant).

Primeramente, edite el fichero config/ProjectConfiguration.class.php y habilite el plugin sfFormExtraPlugin. Le debe quedar algo más o menos así (aunque puede ser diferente si Usted utiliza otros plugins en su aplicación ;) .




class ProjectConfiguration extends sfProjectConfiguration  
{  
  public function setup()  
  {  
    $this->enablePlugins(array('sfDoctrinePlugin', 'sfFormExtraPlugin'));  
  }  
}  

También acostumbro a incluir el plugin en el fichero apps/<appname>/config/settings.yml (aunque sinceramente no he podido constatar la necesidad de hacerlo). Allí sería preciso modificar la directiva enabled_modules y añadir sfFormExtraPlugin , por ejemplo, de la siguiente manera :

enabled_modules:      [default, sfGuardAuth, sfFormExtraPlugin]

Luego proceda a instalar el plugin en cuestión.

$ cd plugins  
$ wget "http://plugins.symfony-project.org/get/sfFormExtraPlugin/sfFormExtraPlugin-1.1.3.tgz"  
$ tar zxvf sfFormExtraPlugin-1.1.3.tgz  
$ mv sfFormExtraPlugin-1.1.3 sfFormExtraPlugin  
$ cd ..  
$ ./symfony plugin:publish-assets  
$ cd web/js  
$ wget "http://code.jquery.com/jquery-1.4.3.min.js"  
$ wget "http://jqueryui.com/download/jquery-ui-1.8.5.custom.zip"  
$ mkdir jquery-ui  
$ cd jquery-ui  
$ unzip ../jquery-ui-1.8.5.custom.zip  
$ mv jquery-ui/css/smoothness ../css  

En este punto ya deberían estar instalados los ficheros del plugin, pero faltan unos detalles. En primer lugar, hay que inyectar las referencias a los ficheros estáticos de jQuery . Por tanto , edite el fichero apps/<app_name>/config/view.yml e incluya los valores mostrados a continuación :

stylesheets:    [main.css, smoothness/jquery-ui-1.8.5.custom.css]  
  
javascripts:    [jquery-1.4.3.min.js, jquery-ui/js/jquery-ui-1.8.5.custom.min.js]  

Ya por último hace falta indicarle a Symfony cuales son los campos para los cuales se ofrecerá la posibilidad de edición mediante un calendario. Edite el fichero del formulario (e.g. lib/form/doctrine/TestForm.class.php ) y edite el método configure añadiendo instrucciones como las que se muestran a continuación.




class TestForm extends BaseTestForm
{
  public function configure()
  {
                $this->widgetSchema['fechainicial'] = new sfWidgetFormJqueryDate();
                $this->widgetSchema['fechafinal'] = new sfWidgetFormJqueryDate();
                $this->widgetSchema['fecharev'] = new sfWidgetFormJqueryDate();
  }
}

Todas las referencias indican que en este punto ya se visualizaría un botón que desplegaría el calendario de jQuery ... pero ...

Cuando Olemis llora Murphy tiembla …

Ejemplo de calendario insertado en formulario

Está de más decir que por alguna razón (... que todavía no he logrado descubrir, así que si la conocen espero sus comentarios con detalles ... ;) no me funciona. Cuando se va a visualizar la página, en mi caso, se muestra el siguiente mensaje Fatal error: Class 'sfWidgetFormJqueryDate' not found in /path/to/project/lib/form/doctrine/TestForm.class.php on line 17 . Sospecho que la causa es que el fichero plugins/.filemap no está correctamente generado (¿ algo que supongo que deba hacer el comando plugin:publish-assets ?). Llego a esa conclusión al comparar los contenidos de mi fichero (mostrado a continuación) con los de otros proyectos que hacen uso del mismo plugin (e.g.  Kakrail)

a:0:{}

Por tales razones me vi obligado a incluir la siguiente línea al principio del fichero lib/form/doctrine/TestForm.class.php. Preste atención al hecho de que la ruta especificada puede cambiar en dependencia del lugar donde se ubique el fichero .php del formulario, pero siempre tiene que resultar en una referencia al fichero plugins/sfFormExtraPlugin/lib/widget/sfWidgetFormJQueryDate.class.php.




require dirname(__FILE__).'/../../../plugins/sfFormExtraPlugin/lib/widget/sfWidgetFormJQueryDate.class.php';

Después de este pequeño detallito, todo funciona. Sin embargo, como ya mencioné anteriormente, me gustaría no tener que incluir esta línea y lograr que se concrete la magia del fichero .filemap ... pero por ahora ¡qué remedio! . De más está decir que espero sus comentarios al respecto.

Agradecimientos

No sería posible concluir este artículo sin agradecer a Yamila , quien se encargó del proceso de creación del sitio de Symfony , los modelos de Doctrine , etc, etc ... y facilitó los enlaces a los  artículos de instalación de los plugins de Symfony, exactamente dos minutos antes de enviarle un ramo de flores a los desarrolladores del plugin y del framework (... y a Murphy ...) .

Conclusiones

Como han podido apreciar es posible enriquecer las interfaces de usuario de sitios implementados con Symfony . En particular se brinda la posibilidad de desplegar un calendario para seleccionar cómodamente fechas. El proceso es ... enriquecedor . La ruta ideal puede fallar en varios puntos del camino , pero al final se logra el objetivo . Recuerde que todo es posible simelo pides ... . Pronto publicaré más artículos sobre temas afines. Si Usted está interesad@ le invito a  suscribirse a este blog mediante RSS . Cualquier sugerencia para mejorar el artículo, correcciones a partes del proceso explicado , preguntas ... pues no dude en compartirlas y dejar su comentario. Podrían ser útiles para que otros resuelvan algún problema y usen eficientemente su tiempo. Hasta pronto

sábado, 15 de octubre de 2011

Tutorial - Eliminando cookies, cache y otros datos privados de navegadores web en Windows

Los 5 grandes navegadores web

En este tutorial utilizaré a  Opera,  Google Chrome,  Mozilla Firefox,  Safari e  Internet Explorer para mostrar con cada uno de ellos cómo eliminar el cache de páginas visitadas, las cookies (e.g. preferencias y sesiones iniciadas en el servidor), y el historial de navegación. Las técnicas aquí mencionadas son específicas para el sistema operativo  Microsoft Windows, pero espero pronto hacer una versión que incluya los detalles para hacer lo mismo en  GNU/Linux y  Mac OS X. Por lo tanto no se asombren si encuentran scripts .bat a lo largo de todo el artículo. Al final también trato el tema de eliminar las cookies específicas de  Adobe Flash Player que son independientes del navegador web.

Google Chrome

 Google Chrome, al igual que  Chromium, guarda la historia, los cookies el cache y los bookmarks en varias bases de datos en el directorio de configuración de aplicaciones del usuario. La ruta en cuestión es C:\Users\<username>\AppData\Local\Google\Chrome\User Data . La manera más fácil de eliminar esos datos es borrar todo lo que esté ahí. El navegador crea todos los ficheros necesarios para empezar desde cero en caso de no encontrar nada allí.


@echo off

set ChromeDir=C:\Users\%USERNAME%\AppData\Local\Google\Chrome\User Data

del /q /s /f "%ChromeDir%"
rd /s /q "%ChromeDir%"

El script primeramente borra todos los ficheros en la carpeta antes mencionada y luego el propio directorio. La opción /q del comando del es para que no se imprima información en la pantalla, mientras que /s es para borrar ficheros y carpetas de forma recursiva y /f se utiliza para obligarlo a que borre ficheros de solo lectura. Las opciones /q y /s del comando rd son similares a las ya mencionadas, solo que en vez de ficheros se borran carpetas.

Mozilla Firefox

 Firefox guarda las cookies, el cache y el historial en dos lugares. Primeramente en el directorio de configuración de aplicaciones C:\Users\<username>\AppData\Local\Mozilla\Firefox\Profiles y, en segundo lugar, en el directorio C:\Users\<username>\AppData\Roaming\Mozilla\Firefox\Profiles. Para eliminar los datos privados se puede proceder a borrar el primer directorio y todas las bases de datos sqlite que se encuentren en el segundo.


@echo off

set DataDir=C:\Users\%USERNAME%\AppData\Local\Mozilla\Firefox\Profiles

del /q /s /f "%DataDir%"
rd /s /q "%DataDir%"

for /d %%x in (C:\Users\%USERNAME%\AppData\Roaming\Mozilla\Firefox\Profiles\*) do del /q /s /f %%x\*sqlite

La primera parte del script es muy similar a la que se explicó anteriormente. El comando for que aparece al final se utiliza para procesar uno a uno los subdirectorios de la carpeta C:\Users\<username>\AppData\Roaming\Mozilla\Firefox\Profiles e ir borrando las bases de datos sqlite que allí aparecen. No es aconsejable borrar completamente esta carpeta porque es allí donde  Firefox guarda las extensiones y sus respectivas configuraciones.

Opera

 Opera también guarda los datos privados en dos lugares diferentes de una forma parecida a Firefox : el directorio de datos de aplicaciones específico para el usuario C:\Users\<username>\AppData\Local\Opera\Opera y la carpeta C:\Users\<username>\AppData\Roaming\Opera\Opera. Si se eliminan los dos directorios se logra el objetivo sin muchos problemas colaterales.


@echo off

set DataDir=C:\Users\%USERNAME%\AppData\Local\Opera\Opera
set DataDir2=C:\Users\%USERNAME%\AppData\Roaming\Opera\Opera

del /q /s /f "%DataDir%"
rd /s /q "%DataDir%"

del /q /s /f "%DataDir2%"
rd /s /q "%DataDir2%"

Apple Safari

El proceso con  Safari es muy parecido al caso de Opera, pero en este caso utilizando los directorios C:\Users\<username>\AppData\Local\Apple Computer\Safari y C:\Users\<username>\AppData\Roaming\Apple Computer\Safari. El script quedaría de la siguiente forma.


@echo off

set DataDir=C:\Users\%USERNAME%\AppData\Local\Applec~1\Safari
set DataDir2=C:\Users\%USERNAME%\AppData\Roaming\Applec~1\Safari

del /q /s /f "%DataDir%\History"
rd /s /q "%DataDir%\History"

del /q /s /f "%DataDir%\Cache.db"
del /q /s /f "%DataDir%\WebpageIcons.db"

del /q /s /f "%DataDir2%"
rd /s /q "%DataDir2%"

Microsoft Internet Explorer

Estoy seguro de que no se sorprenderán cuando les diga que el caso del  Internet Explorer es ... es más complicado :o). La historia de páginas visitadas, los cookies y el cache se encuentra disperso por todos lados, incluyendo el Registro de Windows. A continuación les presento un script que borra toda la información que se encuentra en el sistema de archivos y finalmente en el registro.


@echo off

set DataDir=C:\Users\%USERNAME%\AppData\Local\Microsoft\Intern~1

del /q /s /f "%DataDir%"
rd /s /q "%DataDir%"

set History=C:\Users\%USERNAME%\AppData\Local\Microsoft\Windows\History

del /q /s /f "%History%"
rd /s /q "%History%"

set IETemp=C:\Users\%USERNAME%\AppData\Local\Microsoft\Windows\Tempor~1

del /q /s /f "%IETemp%"
rd /s /q "%IETemp%"

set Cookies=C:\Users\%USERNAME%\AppData\Roaming\Microsoft\Windows\Cookies

del /q /s /f "%Cookies%"
rd /s /q "%Cookies%"

C:\bin\regdelete.exe HKEY_CURRENT_USER "Software\Microsoft\Internet Explorer\TypedURLs"

El ejecutable invocado al final es regdelete.exe. Esta es una aplicación Win32 escrita en C++ que borra cualquier llave del registro, en este caso la historia de navegación. A continuación les muestro el código:


#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <vector>
#include <string>
// compile as: mingw32-g++ regdelete.c -o regdelete.exe -mwindows

#define eq(s1,s2) (strcmp((s1),(s2))==0)

int WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR cmdLine, int nCmdShow) 
{ 
    if (!cmdLine || !strlen(cmdLine)) {
        printf("Usage: regdel.exe <HKEY> <path to regkey> - be careful not to delete whole registry\n");
        return 1;
    }

    int argc;
    LPWSTR *argv = CommandLineToArgvW(GetCommandLineW(), &argc);

    if (argc < 3) {
        printf("Usage: regdel.exe <HKEY> <path to regkey> - be careful not to delete whole registry\n");
        return 1;
    }

    char **argv8 = (char **)malloc(sizeof(char *) * argc);
    for (int i = 0; i<argc; i++) {
        int len = wcslen(argv[i]);
        argv8[i] = (char *)malloc(sizeof(char)*(len+1));
        wcstombs(argv8[i], argv[i], len+1);
    }

    HKEY hkey;
    if (eq(argv8[1], "HKEY_CLASSES_ROOT")) {
        hkey == HKEY_CLASSES_ROOT;
    }
    else if (eq(argv8[1], "HKEY_CURRENT_CONFIG")) {
        hkey = HKEY_CURRENT_CONFIG;
    }
    else if (eq(argv8[1], "HKEY_CURRENT_USER")) {
        hkey = HKEY_CURRENT_USER;
    }
    else if (eq(argv8[1], "HKEY_LOCAL_MACHINE")) {
        hkey = HKEY_LOCAL_MACHINE;
    }
    else if (eq(argv8[1], "HKEY_USERS")) {
        hkey = HKEY_USERS;
    }
    else {
        printf("Unknown hkey\n");
        return 1;
    }

    HKEY key;
    int status = RegOpenKeyEx(hkey, argv8[2], 0, KEY_ALL_ACCESS, &key);
    if (status != ERROR_SUCCESS) {
        printf("failed opening %s\n", argv8[2]);
        return 1;
    }

    std::vector<std::string> vals;

    for (unsigned int i = 0; ; i++) {
        DWORD size = 1024;
        char val[size+1];
        DWORD type;
        status = RegEnumValue(key, i, val, &size, NULL, &type, NULL, NULL);
        if (status == ERROR_NO_MORE_ITEMS) break;
        if (status == ERROR_SUCCESS) {
            vals.push_back(std::string(val));
            continue;
        }
        printf("failed enumerating %s\n", argv8[2]);
        return 1;
    }

    typedef std::vector<std::string>::iterator vsi;
    for (vsi i = vals.begin(); i != vals.end(); i++) {
        status = RegDeleteValue(key, i->c_str());
        if (status != ERROR_SUCCESS) {
            printf("failed deleting %s\n", i->c_str());
            return 1;
        }
    }

    return 0;
}

Realmente bello el código :o) ... bueno ... El fichero .exe se obtiene después de compilar este fichero con  MinGW o  Microsoft Visual Studio.

Flash Cookies

Ha sido largo el camino hasta acá ... así que mejor me apuro y les hablo de los cookies del plugin de Flash. Estos datos se encuentran en la carpeta C:\Users\<username>\AppData\Roaming\Macromedia\Flash Player\*. La forma más fácil de lograr el objetivo es eliminando, de forma similar a como ya lo habíamos hecho antes, todo lo que se encuentra allí.


@echo off

set FlashCookies=C:\Users\%USERNAME%\AppData\Roaming\Macromedia\Flashp~1

del /q /s /f "%FlashCookies%"
rd /s /q "%FlashCookies%"

Conclusiones

¡Eso es todo! Con estos scripts se pueden eliminar todos los datos personales de navegación. Si quiere estar al tanto de nuevos trucos y temas interesantes, le invito a  suscribirse a este blog. Los scripts mostrados pueden ser refinados. Cualquier señalamiento o sugerencia será bienvenida; espero sus comentarios. Recuerde que todo es posible ... simelo pide ....

jueves, 8 de septiembre de 2011

Tutorial - Restringiendo ejecución de aplicaciones en Windows mediante Group Policy Objects

Group Policy Object Editor MMC

Recientemente supe como resolver un problema interesante de administración en el sistema operativo  Microsoft Windows. Si Usted trata de lograr que un(os) usuario(s) solo pueda(n) ejecutar un número reducido de aplicaciones, en este artículo encontrará los detalles explicados paso a paso. Hacer esto puede resultar de utilidad para frenar la difusión de programas malignos, como virus y troyanos ... esos huéspedes indeseables amigos del Kaspersky :P. La solución presentada creo que es lo suficientemente precisa, confiable y elegante como para ser implementada en un entorno de producción. La documentación al respecto es escasa, así que aquí les dejo mis notas. Usted puede  suscribirse a este blog si desea estar al tanto de temas tan raramente abordados como el que les presento a continuación. Espero que a algunos les permita aprovechar su tiempo y realizar esta tarea rápidamente. Como verán me baso en una instalación de Windows en inglés. Si alguien tiene la amabilidad de mencionar los términos equivalentes en español, sin dudas actualizaré el artículo lo más pronto que sea posible. Espero sus comentarios ;o) .

La solución consiste en configurar lo que se conoce como  Software Restriction Policy (SRP) en las políticas (i.e.  Group Policy Object) del usuario en cuestión y no permitirle ejecutar ninguna aplicación excepto

  • Los ficheros ejecutables que intervienen en el inicio de sesión (sino no podrá utilizar el equipo :-$ , así que asegúrese de incluirlos en la sección Additional Rules del SRP y establecer el nivel de seguridad en el valor Unrestricted).
    • C:\Windows\explorer.exe
    • C:\Windows\System32\csrss.exe
    • C:\Windows\System32\dwm.exe
    • C:\Windows\System32\rdclip.exe
    • C:\Windows\System32\taskhost.exe
    • C:\Windows\System32\TSTheme.exe
    • C:\Windows\System32\userinit.exe
  • Las demás aplicaciones que se determine que pueda utilizar el usuario, pues si solo se habilitan los que fueron mencionados anteriormente entonces solo podrá ver su escritorio y no podrá hacer absolutamente nada. Ejemplos que se podrían añadir en la lista Unrestricted Access son:
    • Paint, añada la ruta C:\Windows\System32\paint.exe
    • Microsoft Internet Explorer, añada la ruta C:\Windows\System32\iexplore.exe
    • ...

A continuación menciono los pasos que hay que seguir para deshabilitar la ejecución de programas. Para ejecutarlos se hace imprescindible tener permisos de administración.

  1. Abrir la consola de administración i.e. Microsoft Management Console (Start -> Run -> mmc):
  2. Seleccione File -> Add/Remove Snap-in
  3. Seleccione Group Policy Object
  4. Haga click en Add
  5. Haga click en Browse, y seleccione el usuario al cual desea restringirle los permisos.
  6. Haga click en Finish, y OK. En este momento en el la vista jerárquica aparecerá un nodo <username> Policy.
  7. Navegue a User Configuration -> Windows Settings -> Security Settings -> Software Restriction Policies
  8. Hag click derecho sobre Software Restriction Policies y haga cick en New Software Restriction Policies
  9. Aparecerán dos nodos nuevos en la vista jerárquica. Haga click en Security Levels
  10. Haga doble click en el nivel de seguridad Disallowed y luego click en Set as Default
  11. Acceda al otro nodo, i.e. Additional Rules
  12. Elimine las runas élficas que Windows añade allí de forma predeterminada (i.e. %HKEY_LOCAL_MACHINE\... y otros cuentos de horror ... :o).
  13. Añada las reglas para las aplicaciones mencionadas al principio del artículo. Recuerde que son absolutamente necesarias para que el usuario pueda iniciar su sesión tanto desde el desktop como por acceso remoto.
  14. Añada los caminos a los otros programas que el usuario podrá ejecutar (e.g. C:\windows\system32\paint.exe , ... etc.). Asegúrese de que los usuarios no pueden sobrescribir estos programas, porque sino de todas formas podrán ser capaces de ejecutar cualquier cosa ;o).
  15. Haga click en Save.
  16. Listo!

Conclusiones

Espero que todos aquellos que han leído este artículo ya se hayan convencido de que  Microsoft Windows es el sistema operativo más seguro que existe ...

¡Oh, no! no se preocupe era una broma ... :o)

Me sentiría muy feliz si Usted hubiera encontrado en este artículo la solución a su problema . Si quiere estar al tanto de nuevos trucos y temas interesantes, le invito a  suscribirse a este blog. En caso de tener dudas o necesitar ayuda espero sus comentarios. Recuerde que todo es posible ... simelo pide ....

martes, 30 de agosto de 2011

TuxInfo - Programación funcional en Python

 TuxInfo 40 lista para la descarga!!! ¿Por qué Android es el número uno?

Recientemente fue publicado en la  revista TuxInfo un artículo introductorio a la programación funcional en Python que escribí junto a  Arnau Sánchez. Este es el más reciente de una serie que trata de presentar las características de dicho lenguaje de programación, y muy especialmente demostrar e ilustrar los multiples paradigmas que influencian su sintaxis y definición. A todos aquellos interesados en temas de programación, les invito a leerlo (se agradecen sus comentarios ;o). Puede utilizar  este enlace para descargarla. Si desea descargar numeros anteriores consulte  el archivo.

Antes de terminar es preciso extender un saludo a todos los que han contribuido (de una forma u otra) con la revista que logra mantenerse en la preferencia de los amantes del software libre después de 40 ediciones (ufff ... felicidades Ariel Corgatelli et al. )

o<|:)

jueves, 21 de julio de 2011

Presente y futuro del Festival Rotilla ... el robo

Los Aldeanos en Festival Rotilla 2010

Seguro que muchos esperábamos asistir al  Festival Rotilla 2011. ¡Qué ingenuos! Resulta que las instituciones pretenden secuestrar el evento. Aquí en este artículo Usted encontrará el texto íntegro de la declaración de los organizadores, explicando las razones por las que se suspende la edición que se realizaría el presente año 2011. A modo de introducción este espacio cultural es organizado desde 1998 de forma independiente y está destinado muy precisamente a presentar las manifestaciones culturales de vanguardia para disfrute de los jóvenes cubanos. Las presentaciones, la asistencia y otros detalles eran convocados gratuitamente y sin ánimo de lucro. La edición del 2010 tuvo mucho éxito y tuvo una asistencia superior a los 20,000 participantes, que pudieron disfrutar de agrupaciones como  Los Aldeanos y  otros. En fin, que ojalá que esta iniciativa no naufrague y que no se convierta en otro ejemplo más de cómo la voluntad individual es aplastada cada vez que los empeños independientes de los ciudadanos llegan más allá de una línea que se mueve con el tiempo pretendiendo ajustar nuestros gustos, creencias, pronunciamientos, nuestras convicciones, costumbres alimentarias, nuestra economía ... gracias a la estrategia de dejarnos sin la posibilidad de potenciar nuestras propias opciones por nuestro propio bien. Ahora me viene a la mente una canción de un grupo llamado Lucha Almada que antecedió cronológicamente al proyecto  Habana Abierta que dice apróximadamente así

(...) ¡ay de ti! ¡ay de mí!
!ay de las quimeras en que un día creí!
(...) todo el mundo teme a algo y por si acaso
no se quita la escafandra
(...) en la escuela cuando chicos nos hablaban del amor y la esperanza
(...) y a estas alturas corazón andas buscando solución
que te pasa que te veo así, vendiéndolo todo ... todo
y a estas alturas corazón no has aprendido la lección
porque hay cosas que se van y ya, ya no vuelven más

DECLARACION OFICIAL DEL CONSEJO DIRECTIVO DEL FESTIVAL ROTILLA

La Habana, Cuba. 20 de Julio de 2011

Motivo Denuncia del Secuestro del Festival Rotilla.

 Rotilla Festival, fundado en el año 1998, es el único evento de su tipo en Cuba. Se realiza cada año en el mes de agosto, y durante tres días consecutivos promueve y expone la gran mayoría de las manifestaciones de la vanguardia artística cubana. Es de carácter no lucrativo, totalmente gratuito y abierto a todos los públicos. Al principio comenzó siendo un movimiento promotor exclusivamente de la música electrónica, a partir del 2008 incorporó a su programa artístico bandas musicales de los más variados formatos, pero siempre bajo el principio de promover lo alternativo dentro de las artes. Igualmente el festival desde su nacimiento ha sido administrado de manera INDEPENDIENTE por sus fundadores, y sin prácticamente ninguna colaboración de las autoridades cubanas (estado-gobierno) . Esa ha sido nuestra política y nuestra posición, queríamos crecer desde nosotros mismos, desarrollarnos y generar un movimiento auténtico dirigido especialmente hacia los jóvenes teniendo muy en cuenta sus verdaderas expectativas y exigencias. En la ultima edición (2010), ya por las propuestas artísticas, por el eco de prensa tanto nacional como internacional, por la larga trayectoria y el renombre adquirido mundialmente, el festival obtuvo el récord en asistencia de 20 000 personas, colocándose así como el evento más largo en tiempo y de mayor asistencia juvenil dentro la isla. La gran cantidad de materiales fílmicos acopiados en todo este tiempo así lo legitiman.

Hoy, en el 2011, Rotilla Festival enfrenta su mayor oprobio. El Gobierno Cubano, en la persona del vicepresidente Estaban Lazo, junto al Ministerio de Cultura, en la persona del viceministro Fernando Rojas, pretenden secuestrar el evento de las manos de sus organizadores y fundadores, y realizarlo desde las instituciones estatales, arrebatando y plagiando para esto nuestro nombre, nuestros días señalados y nuestra convocatoria, violentando el concepto propio del evento, llevando al “festival“ bandas que modifican el formato que nosotros, sus legítimos dueños, habíamos establecido. Por otra parte, las instituciones en cuestión han ofrecido remuneraciones económicas a los artistas participantes en este “evento“ para de este modo deteriorar la relación social establecida históricamente (sin basamento lucrativo) entre los organizadores originales y los artistas, asegurando así la presentación de estos últimos.

Tradicionalmente había existido un dialogo con las autoridades, donde estas presionaban para que no se presentara determinado grupo y en cambio cooperaban para que se realizara el festival, se había establecido así un modus vivendi, de coexistencia. Nunca ha sido algo cómodo informar a un artista que no puede presentarse, pues el Ministerio de Cultura lo rechaza. Pero ese, es el folklore tradicional que en cuanto al arte se vive en Cuba. Eso es por todos conocido. Sin embargo, en esta ocasión… han ido demasiado lejos las llamadas instituciones. Nos han comunicado informalmente, a través de Noel Soca, funcionario que dirige la Comisión de Recreación y Cultura en la nueva provincia de Mayabeque, que no teníamos mas nada que ver con ello, que el festival sería realizado por el Ministerio de Cultura y el Instituto de la Música en los días señalados, pues los jóvenes iban a asistir de cualquier manera. La directiva del  Festival Rotilla acudió al Ministerio de Cultura sabiendo que se estaba realizando una reunión con motivo y nombre Rotilla, en las oficinas de Fernando Rojas, viceministro de cultura. De ella fuimos cortésmente expulsados, no habíamos sido convidados.

Una cosa es la censura (ya tradicional), otra muy diferente es el robo, el plagio y el secuestro de una obra que ha alcanzado muy altos niveles de atención a nivel incluso internacional, y que cuenta con las congratulaciones de miles de jóvenes cubanos que allí han asistido por años. El equipo organizador de Rotilla Festival, quiere dejar muy claro y de manera categórica, que este año 2011, se cancela el Festival Rotilla, por la violencia ética que han manifestado las máximas autoridades de la cultura cubana. Nosotros, realizadores y autores de Rotilla Festival, y en mi nombre propio, su director y fundador, DENUNCIAMOS el robo, el plagio y el secuestro que esta actitud significa para todos los jóvenes de esta tierra que hoy representamos. Denunciamos la excesiva y terca censura que se esta ejerciendo contra cualquier actividad cultural que NO provenga de las llamadas instituciones. Denunciamos el acoso a que estamos siendo sometidos de manera constante, a la vigilancia y las amenazas sutiles o directas de las que somos objeto cotidianamente. Un país no se dirige como se dirige un campamento! dijo en ocasión de la guerra chiquita José Martí al generalísimo Máximo Gómez. Y es que en un país debe primar un pensamiento plural, su sociedad debe ser dueña y soberana verdadera de la nación, y por encima de todo, dueña de la buena obra construida con el esfuerzo de los años y el sudor de la propia frente. El robo de una obra propia, que se concibe como proyecto de vida, es el acto más inmoral y deplorable en que se puede ver involucrado el estado-gobierno de una nación. Rompe con todos los principios de la ética revolucionaria, cuyo concepto esta escrito en cada esquina de cada barrio de todo el país. Queremos advertir a nuestros líderes, que este tipo de actos, atacan incluso la base del contrato social vigente en la sociedad cubana. Arremeten contra el principio de respeto que un pueblo debe tener por su gobierno. Consideramos que incluso, contradice los mismos lineamientos que se acaban de lanzar con razón del VI Congreso del Partido Comunista de Cuba, ignorando algunos de los principios que allí quedaron plasmados; dejándonos a los hijos de Cuba sin norte de guía y sin esperanzas. Para reconstruir la nación, es evidentemente necesario que participemos todos. Y esa participación solo se puede generar con la confianza y el respeto entre el estado–gobierno y la base de la sociedad, sus gentes. Este tipo de actos sembrarán entre nosotros, hoy los más jóvenes, la desconfianza a construir y crear en nuestro suelo, pues no existe garantía de hecho ni derecho de que serán respetadas nuestra creación o nuestra inversión en tiempo y recursos humanos y materiales.

Dejamos claro a nuestra contraparte institucional que iniciaremos los procesos legales correspondientes en su contra, pues este acto no es solo violatorio de todos los conceptos de ética y moral conocidos, sino también de un conjunto de leyes sobre derecho de autor y propiedad intelectual que esperamos, estén aún vigentes en la nación cubana. Es hora que cada uno de nosotros exijamos los derechos que nos corresponden como ciudadanos, y que estos marquen nuestra relación con las instituciones. Es tiempo de poner orden a la insensatez y la arbitrariedad. Queremos hacer nuestro ejercicio en nuestra tierra, invertir y ganar haciendo lo que hacemos, nuestro negocio personal, nuestra fiesta, nuestro festival, ese derecho, sí que lo exigimos, por que no lo tenemos. Es justo y necesario. El equipo de Rotilla Festival invita a todo aquel que se identifique o adhiera a esta causa que se haga eco de este discurso y que lo difunda por cualesquiera de los medios a su alcance. Así edificaremos hoy la solidaridad del mañana.

Esperamos que este comunicado sea recibido con el mismo respeto que hemos querido imprimirle, pues es nuestra intención dialogar para reformar, para crecer y salir adelante, para construir una nación para todos donde todos tengan a salvo su propio espacio y crezcan como individuos capaces y seguros de sí.

Que no quepa duda que vamos a continuar reclamando el derecho a realizar nuestro festival en los próximos años, es nuestro legítimo derecho.

 MATRAKA PRODUCCIONES Rotilla Festival

miércoles, 13 de julio de 2011

Yo sigo blogueando bien; resumen primer semestre 2011

Mapa

Han pasado seis meses desde el  último resúmen que hice acerca de la actividad de este blog. En dos años y medio se han registrado unas 5466 visitas desde más de 80 países en 17 regiones o subcontinentes, hecho que me llena de satisfacción :). Es hora de repasar que ha pasado en estos seis útlimos meses. Hasta ahora hemos hablados de muchos temas , así que les invito a conocer cómo es que Ustedes, los lectores, han reaccionado ante los contenidos que aquí se publican. Para mí es un placer saber que Ustedes tienen un lugar para este blog dentro de su tiempo (libre); y ya saben, todo es posible ... SIMELO piden.

Comparando las estadísticas ya mencionadas con las del  reporte del cierre de 2010 se puede apreciar que se suman 6 países. También parece que hubo visitas desde algún punto de algún océano. ¡Nunca me habría imaginado que alguien leería mi blog mientras disfrutaba de unas vacaciones en un crucero :D ! Como se puede apreciar en estos 2 años y medio las visitas son más frecuentes desde Sudamérica, Europa, el Caribe, Centroamérica y Norteamérica. Supongo que esta distribución se deba a los lazos culturales y al conocimiento del idioma español.

En estos últimos seis meses hubo 1152 visitas y los artículos más populares (al menos los que más han accedido directamente ;o) han sido los siguientes :

Página Pageviews Unique pageviews Average time
1.  / 40 35 00:04:17
2.  GeneXus: Convirtiendo aplicaciones de escritorio a web 23 19 00:00:55
3.  Dibujando figuras geométricas con Eukleides y LATEX 17 12 00:05:07
4.  ¿Quiénes somos realmente? 15 9 00:00:39
5.  El misterio de la variable controller en la definición de rutas 13 13 00:07:10
6.  Archivo septiembre 2009 10 4 00:00:15
7.  Uso local de Dragonfly para depurar sitios web con Opera 10 7 00:01:06
8.  Microsoft firma acuerdo con la PSF. ¿Python para Visual Studio? 8 5 00:00:09
9.  Comparación de sistemas de control de versiones (a.k.a.VCS o SCM) 8 3 00:00:30
10.  Funcionalidades no documentadas de la API de Facebook 7 5 00:00:27

Les muestro más gráficos que ilustran que todavía debo ser más sistemático si quiero alcanzar los niveles de audiencia que tuve en marzo del 2010.

  • Visitas

Visitas

  • Visitantes

Visitantes

  • Tráfico

Tráfico

¿Y qué pasará ahora?

Durante este primer semestre han ocurrido muchas cosas interesantes. Además de los artículos que traten temas más relajados y de esparcimiento, y como complemento de esta estrategia, tengo varias ideas en el congelador relacionadas con este blog y los sitios sociales y ... bueno y espero poder escribir algo pronto sobre  Google+ también. También pretendo optimizar las herramientas que utilizo para publicar con el fin de utilizar más eficientemente mi tiempo (y de más está decir que habrá algún artículo al respecto ;o). De hecho el primer paso ya fue dado, y este debe ser el primer artículo que es anunciado automáticamente a través de  mi Twitter (@olemislc) (<= sí, no tengan pena y síganme ;o). ¡Gracias Feedburner! Como siempre, simelo preguntan, les digo que espero que Ustedes sigan ahí escuchando ... ¡ La invitación esta hecha !

PD: ... y a ese 2.86% de usuarios que ha leído  este blog una y otra vez hasta sumar más de 201 visitas, les envío mis más sinceros saludos y les presento mis respetos. Son Ustedes los que realmente hacen que este esfuerzo valga la pena.

domingo, 10 de julio de 2011

Appeartowork - Enmascarando el uso de Facebook

Disfrute Facebook mientras aparenta trabajar

El día 8 de julio de 2011 a las 21:00 h (apróximadamente ;o) finalmente logré desplegar el sitio web  Appeartowork . Consiste en una idea interesante que radica en mostrar ciertos contenidos de  Facebook de una forma que el usuario aparenta estar trabajando. Actualmente hay tres variantes de camuflaje. La primera le da al sitio un aspecto similar al editor de textos  MS Word, y así parece que se está redactando un documento muuuuuy importante ;o). Otra variante es parecida al  MS Excel . ¡Cualquiera puede pensar que estamos haciendo cuentas bien difíciles! ;o). Finalmente si Usted es un poco geek también puede enmascarar su acceso a  Facebook aparentando que usa una consola :O . En todos los casos, aunque todavía faltan varios detalles por pulir, es una idea muy interesante . Espero que les guste. Si tiene otra idea, no dude en compartirla. Recuerde que todo es posible simelo pide.

martes, 14 de junio de 2011

El misterio de la variable controller en la definición de rutas

Routes - mapeo de URLs para aplicaciones web

En este artículo les hablaré acerca de una característica del módulo  PyRoutes que al menos yo no encontré bien documentada. Se trata del manejo de la variable controller dentro de la definición de las rutas en una aplicación web. Le invito a continuar leyendo este artículo si quiere conocer qué es lo que hace este módulo, la naturaleza del problema (si es que se le puede llamar así) y cómo se resuelve.

Acerca del módulo PyRoutes

El módulo  Routes ha sido diseñado para resolver un problema muy frecuente en el desarrollo de aplicaciones web, que es cómo relacionar las URLs con acciones concretas. Por ejemplo, blog/2008/01/08 podría mostrar una lista de artículos publicados en cierta fecha, mientras que login se utilizaría para autentificar los usuarios, ... y así sucesivamente.

Es característico de  Routes el poder definir las acciones del sitio y la jerarquía de URLs de forma independiente, para luego enlazarlas del modo que sea más conveniente. Si en algún momento se cambia de idea acerca de una URL solo se cambia la línea donde se define la regla, y no será necesario tocar la definición de la acción. Incluso es posible tener múltiples caminos para lograr el mismo resultado.

El diseño de  Routes ha sido inspirado por  Ruby On Rails, pero en su estado actual existen divergencias significativas. Con el tiempo se ha convertido en la base de frameworks como  Pylons,  CherryPy, y permitió la integración de  TurboGears 2 con  Pylons.

El problema

 Routes forma parte también de un framework  WSGI muy sencillo que desarrollo desde hace poco tiempo. Al utilizarlo siempre me llamó la atención que la documentación ofrecía ejemplos donde se utilizaba la variable controller en la definición de las rutas. Por ejemplo en este caso :

>>> from routes import Mapper
>>> mapper = Mapper()
>>> mapper.connect('test', '/{controller}/{action}')
>>>
>>> print mapper.routematch('/hello/world')
None

Cómo se puede apreciar este código no funciona. Por otra parte , si se cambia ligeramente el código anterior entonces sí funciona.

>>> from routes import Mapper
>>> mapper = Mapper()
>>> mapper.connect('test', '/hello/{action}', controller='hello')
>>>
>>> mapper.match('/hello/world')
{'action': u'world', 'controller': u'hello'}

¿Entonces cuál es la causa de esta situación aparentemente tan extraña?

Utilizando la variable controller en definiciones de rutas

Pues bien la cuestión es que en el Mapper() no se especifican los controladores. Todo parece indicar que hay que hacer esto explícitamente. La implementación predeterminada utiliza los nombres de los ficheros en un directorio. Sucede que por defecto, si no encuentra el controlador adecuado al procesar la ruta siempre se devuelve None. Ese es también el motivo por el que el segundo ejemplo funciona al especificar un controlador.

Para solucionarlo, existen dos opciones:

  1. Pasar a Mapper() la ruta (absoluta) a los controladores
mapper = Mapper(directory='/ruta/a/los/controllers']

  1. Pasar a Mapper() una función controler_scan que devuelva una lista con los nombres de los controladores disponibles. Por ejemplo:
>>> def controller_scan(directory=None):
...        return 'hello', 'auth'
... 
>>> mapper = Mapper(controller_scan=controller_scan)
>>> mapper.connect('default', '/{controller}/{action}')
>>> mapper.connect('login', '/login', controller='auth', action='login')
>>> mapper.connect('logout', '/logout', controller='auth', action='logout')
>>> mapper.match('/hello/world')
{'action': u'world', 'controller': u'hello'}

En mi caso particular, la segunda opción es la más apropiada. Así que muchas gracias  Chema Cortes por  aclararme esta duda ... ;o) Espero que este artículo le sirva a Usted también de referencia y quizás le ahorre un buen tiempo tratando de hacer que esto funcione.

lunes, 6 de junio de 2011

Uso local de Dragonfly para depurar sitios web con Opera

Dragonfly = Firebug para Opera

Escribo este artículo después de descubrir cómo utilizar una herramienta desarrollo tan importante como Dragonfly sin tener que estar conectado a los servidores de Opera. Despúes de haber pasado mucho tiempo creyendo firmemente que la mejor opción era tener algo como su equivalente Firebug por fin he logrado instalarlo y hacerlo funcionar en la PC donde desarrollo aplicaciones web. Todo parece indicar que encontré el checkbox correcto ;o). Si sigue leyendo este artículo hasta el final Usted descubrirá una forma más cómoda de depurar con Opera los errores o defectos de sus aplicaciones. Como siempre le invito a suscribirse mediante RSS a este blog; especialmente si desea estar informado de temas relacionados con programación, diseño de sitios, herramientas o trucos útiles, y muchas otras cosas interesantes del mundo de la informática.

Instalación paso a paso de Dragonfly

El proceso es realmente simple. Lo primero que hay que hacer es descargar la versión más reciente de Dragonfly desde los servidores de Opera.

Descargar Dragonfly

Una vez hecho esto, extraiga los contenidos del fichero .zip en una carpeta en su sistema de archivos local. En este caso, como utilizo Ubuntu 10.04 Lucid, la carpeta que escogí fue /var/www/dragonfly , pero puede ser cualquiera (... donde el usuario tenga derechos de lectura, por supuesto ;o).

Posteriormente, es preciso sobre-escribir la URL desde donde se descargará la herramienta y remplazarla por una que haga referencia a la ubicación de la carpeta creada anteriormente. Hay dos formas de hacerlo. Las describo a continuación .

Editando el fichero operaprefs.ini

La vía más avanzada consiste en editar manualmente el fichero operaprefs.ini (así que si Usted prefiere los diálogos de configuración, mejor consulte el próximo epígrafe ;o) . En Ubuntu 10.04 este fichero se encuentra en la ruta ~/.opera/operaprefs.ini . En Windows la ruta sería C:\Documents and Settings\<Usuario>\Application Data\Opera\Opera\operaprefs.ini. Cuando lo encuentre, utilice el editor de texto de su preferencia para ver sus contenidos. Debe haber un fragmento similar al que se muestra a continuación

[Developer Tools]
Developer Tools URL=https://dragonfly.opera.com/app/

Remplace esta URL por otra de la forma file://localhost/path/to/dragonfly/client-en.xml. En mi caso, como he extraído los ficheros en /var/www/dragonfly, la configuración quedaría así.

[Developer Tools]
Developer Tools URL=file://localhost/var/www/dragonfly/client-en.xml

Utilizando el editor de preferencias de Opera

Si Usted prefiere utilizar diálogos de configuración, sin dudas esta variente es más apropiada. Si Usted está utilizando Opera simplemente haga click en el enlace que se muestra a continuación y verá el editor de preferencias del navegador. Su apariencia es parecida a la que se muestra en la figura.

Editor de preferencias de Opera

URL predeterminada en panel de preferencias de Opera

Remplace la URL (i.e. https://dragonfly.opera.com/app/) por otra de la forma file://localhost/path/to/dragonfly/client-en.xml. En mi caso, como he extraído los ficheros en /var/www/dragonfly, la URL sería file://localhost/var/www/dragonfly/client-en.xml.

URL predeterminada en panel de preferencias de Opera

Posteriormente, presione la combinación de teclas Shift + Ctrl + I e immediatamente aparecerá Dragonfly en la parte baja de la ventana . Poco tiempo después Usted podrá ver las pestañas que permiten observar y manipular el DOM, inspeccionar las peticiones hechas a través de la red, conocer el espacio dedicado al almacenamiento de datos de sesión, ... y así sucesivamente.

Consejos útiles

Si siguió los pasos anteriores, entonces my probablemente ya estará utilizando Dragonfly sin tener que estar conectado a los servidores de Opera. En este caso quizás desee añadir los siguientes botones para facilitar el acceso directo a estas herramientas. Simplemente arrástrelos (drag) y suéltelos (drop) sobre cualquier panel de Opera.

Enlaces directos a Dragonfly

Reload from cache
Dragonfly

En caso que no le funcione algo o tenga dudas en algun paso, simelo pide, podria ayudarle. Espero sus comentarios ;o).