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).

miércoles, 9 de marzo de 2011

Funcionalidades no documentadas de la API de Facebook

Facebook hacks

Jugando un poco descubrí una funcionalidad no (muy bien) documentada de la API de Facebook conocida como Facebook Graph API. Realmente es un detalle que me hacía falta utilizar en un proyecto para disminuir el número de peticiones que se hacen a los servidores de Facebook. Cuando leí la documentación se aborda la manera en que la API permite hacer este tipo de cosas e incluso se muestran ejemplos de peticiones sencillas. Les invito a leer este artículo y sabrán de una forma de optimizar las peticiones que se realizan a la API de Facebook y, por consiguiente, mejorar el desempeño de las aplicaciones. Si desea estar al tanto de otros artículos similares, Usted puede suscribirse a este blog mediante RSS.

Lo más frecuente, al utilizar la API antes mencionada, es hacer peticiones para obtener los datos de objetos individuales (e.g. usuarios) o de sus conexiones (e.g. las páginas que le gustan a un usuario). En la documentación se puede encontrar información acerca de cómo hacer esto (y por brevedad asumiré que Usted ya está familiarizado con los detalles, pero si no es así, solícitelo en un comentario y le dedicaré otro artículo a esta materia ;). Solo menciono que para lograrlo se utilizan URLs del tipo https://graph.facebook.com/<ID de objeto> (e.g. la información de la página de la Coca-Cola sería estaría disponible en https://graph.facebook.com/cocacola ).

Sin embargo, a veces es necesario solicitar la misma información para múltiples objetos (e.g. los mensajes de estado de un grupo de usuarios). Si se sigue el procedimiento anterior en este caso se necesitaría efectuar varias peticiones. La API permite hacer esto eficientemente. Por ejemplo, si se necesitara obtener los datos de la página antes mencionada y los de Bret Taylor entonces con una única petición a https://graph.facebook.com/?ids=cocacola,btaylor ya se podrían obtener todos estos datos.

Digamos que queremos obtener los mensajes que varios usuarios han publicado en su status. Ya entonces no resulta tan evidente lo que hay que hacer debido a que la URL para obtener el de un solo usuario es e.g. https://graph.facebook.com/btaylor/statuses . La duda entonces consiste en saber donde situar los IDs de los objetos.

Pues bien, digamos que desea obtener los mensajes míos y de Bret Taylor en una sola petición, entonces la URL sería así https://graph.facebook.com/statuses?ids=btaylor,olemis , es decir se mantiene el tipo de conexión al final y se añaden los IDs de los objetos como parámetros.

Ya lo sabe, si antes no le resultaba evidente, aquí tiene los ejemplos que no aparecen en la documentación oficial. Espero que les sea útil el consejo para optimizar sus aplicaciones. Pregunte cualquier duda, siempre podrá contar con mi ayuda, simelo pide.