DevelUY

Planeta de desarrolladores uruguayos

14 de mayo de 2012

Dario Clavijo

Google Linux kernel mirror

Me entero en barrapunto que google creo un mirror publico de los repositorios del linux kernel el cual es de solo-lectura y se actualiza con un git-fetch cada 30 minutos desde git://git.kernel.org

Para clonar un repo instalamos git y seguido:
$ git clone https://kernel.googlesource.com/repo

por Darío Clavijo (noreply@blogger.com), el 14 de mayo de 2012 a las 18:29

12 de mayo de 2012

Dario Clavijo

Mogwai en Montevideo

Recién me entero que una de los grupos de post-rock escoces del cual soy fan va a estar en Montevideo, Uruguay. Se trata de Mogwai.
Este grupo compone su música de forma puramente instrumental la cual cuenta con pasajes fuertes y tranquilos y muchas otras caracteriticas del genero progresivo haciéndola a esta muy agradable de escuchar.
















En la sección de tours del sitio oficial de Mogwai pueden ver la fecha confirmada para el 20 de mayo en el Teatro La Trastienda (Daniel Fernández Crespo 1763 , Tel: 2402 6929).
Las entradas ya están a la venta en Red UTS y en la misma boleteria de La Trastienda.

Un par de videitos espero que los disfruten!!!


































por Darío Clavijo (noreply@blogger.com), el 12 de mayo de 2012 a las 17:52

Martin Balao

Forking de procesos en Linux

La creación de procesos en Linux implica dos etapas: forking y exec -me tomo la licencia de denominarlas así por las familias de funciones implicadas en cada caso-.

En la etapa de forking se duplica el proceso que realiza la llamada de creación. Para esta duplicación se crea un nuevo process descriptor -estructura donde se guarda la información del proceso- y se agrega a la lista de process descriptors que maneja el kernel. Este nuevo process descriptor es muy similar al del proceso padre pero difiere en el process id y en los procesos hijos -el proceso recién creado no tiene hijos y el proceso padre pasó a tener un hijo más-.

En cuanto al espacio de memoria del nuevo proceso, se utiliza la técnica de copy on write para lograr una mayor optimización. Empleando esta técnica ambos procesos tienen su espacio de memoria pero esta división comienza siendo “virtual”. A medida que se realizan operaciones de escritura en la memoria, se duplican las páginas que corresponden.

La etapa de exec permite la carga en memoria y ejecución de un binario. Veremos en este artículo solo forking.

A continuación la parte más divertida:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
 
int main(int argc, char* argv[]){
    pid_t id_del_proceso_hijo = fork();
    pid_t proceso_actual = getpid();
    printf("Mensaje de %d: Mi hijo es %d\n", proceso_actual, id_del_proceso_hijo);
    int* status_ptr = malloc(sizeof(int));
    *status_ptr = -1;
    pid_t estado_del_hijo = waitpid(id_del_proceso_hijo, status_ptr, 0x0);
    printf("Mensaje de %d: Espere hasta que se reportó el proceso %d. Info del reporte: %d\n", proceso_actual, estado_del_hijo, *status_ptr);
    return 0;
}

Lo que hace este programita sencillo es un fork de un proceso. De esa manera se pasan a tener un proceso padre y un proceso hijo. El padre espera a que su hijo termine de ejecutar y termina, imprimiendo algunos flags que permiten trazar este comportamiento:

Mensaje de 15521: Mi hijo es 15522
Mensaje de 15522: Mi hijo es 0
Mensaje de 15522: Espere hasta que se reportó el proceso -1.
Info del reporte: -1
Mensaje de 15521: Espere hasta que se reportó el proceso 15522.
Info del reporte: 0

El número 15521 es el pid (process id) del padre. 15522 es el pid del hijo. En las primeras dos líneas, cada proceso reporta quién es su hijo. El proceso hijo no tiene hijos, por eso reporta 0. En la línea 3, el hijo espera a que sus hijos terminen de ejecutar para seguir. Terminar de ejecutar es esperar por un reporte de estado de los hijos. En ese caso, como no tiene hijos, obtiene el reporte -1. En la línea 4, sucede lo mismo pero con el padre. Allí se puede ver como su hijo terminó y se reportó.

Ahora la parte más más divertida:

strace ./fork_test
clone(child_stack=0, flags=CLONE_CHILD_CLEARTID|
CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0xb7847938) = 15698
getpid()                                = 15697
fstat64(1, {st_mode=S_IFCHR|0620,
st_rdev=makedev(136, 0), ...}) = 0
mmap2(NULL, 4096, PROT_READ|PROT_WRITE,
MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb785b000
write(1, "Mensaje de 15697: Mi hijo es 156"..., 35
Mensaje de 15697: Mi hijo es 15698
) = 35
brk(0)                                  = 0x9a7e000
brk(0x9a9f000)                          = 0x9a9f000
waitpid(15698, Mensaje de 15698: Mi hijo es 0
Mensaje de 15698: Espere hasta que se reportó el proceso -1.
Info del reporte: -1
[{WIFEXITED(s) && WEXITSTATUS(s) == 0}], 0) = 15698
--- SIGCHLD (Child exited) @ 0 (0) ---
write(1, "Mensaje de 15697: Espere hasta q"..., 85
Mensaje de 15697: Espere hasta que se reportó el proceso 15698.
Info del reporte: 0
) = 85
exit_group(0)

Se puede apreciar allí las system calls clone() para hacer el fork, getpid() para obtener el process id y waitpid para esperar por el hijo. Esta traza corresponde al proceso padre, dado que el hijo se independizó cuando fue creado y el strace en este caso no lo capturó. Por obvias razones, esta traza es distinta a la inicial -los pid son diferentes-.

Este artículo se basó en el libro Linux Kernel Development (Robert Love) y en el manual The GNU C Library Reference Manual (GNU).

por martin, el 12 de mayo de 2012 a las 05:02

11 de mayo de 2012

Dario Clavijo

Tig: interfaz de ncurses de GIT

Como dice el titulo tig es una interfaz ncurses de git, hace exactamente lo mismo que el gitk

Para probarlo:

git clone http://jonas.nitro.dk/tig/tig.git/ && cd tig && make 
./tig


por Darío Clavijo (noreply@blogger.com), el 11 de mayo de 2012 a las 13:43

10 de mayo de 2012

Federico Varela

Crónica Media Maratón de Punta del Este

Fin de semana espectacular en Punta del Este, con mucha expectativa corrí mi primera media maratón el domingo pasado, llegando a la decena de carreras desde que comencé en el 2011. Para preparar estos 21K me armé un plancito de un mes, muy conservador con solo dos salidas semanales: entre 8-10K a mitad de semana y un fondo de entre 13-15K los domingos. Puede parecer poco, y seguramente lo sea

por Federico Varela (noreply@blogger.com), el 10 de mayo de 2012 a las 03:37

7 de mayo de 2012

Fernando Briano

Agenda de eventos Mayo – Montevideo

Agenda

Agenda

El mes de mayo viene lleno de eventos interesantes en Montevideo, así que la agenda está bastante completita:

Meetups

En primer lugar tenemos esta semana el meetup de Ruby, el martes 8. Enseguida, el jueves 10 de mayo el reunión mensual del grupo MySQL. Ambos meetups se vienen con todo, con una buena concurrencia y excelentes presentaciones hasta ahora, además de buenas oportunidades para conocer gente del medio y tomar cerveza.

Conferencia Internacional de Software Libre y Código Abierto

Antel organiza una conferencia internacional de Software Libre con expositores interesantes. De destacar la presencia del famoso Jon “maddog” Hall.

EduJAM!

El viernes 11 y sábado 12 en el Complejo de las Telecomunicaciones se realiza el eduJAM. Sigan el enlace por más información, pero básicamente: El principal objetivo del encuentro es fortalecer la comunidad de desarrolladores de software educativo libre, especialmente en América del Sur pero también con el objetivo de incrementar los esfuerzos de colaboración con el resto del mundo.

Montevideo Comics

El fin de semana del 19 y 20 de mayo se realiza la edición del décimo aniversario de Montevideo Comics en el Complejo Cultural Plaza. En breve publico la agenda completa. Al igual que otros años, la oportunidad perfecta para ver qué está pasando en materia de cómics a nivel nacional y regional, entre otras frikadas.

Espero no haberme olvidado de nada… Mes movido Mayo :)

por Fernando, el 7 de mayo de 2012 a las 11:00

5 de mayo de 2012

Fernando Briano

Invitación: Segundo Ruby Meetup Montevideo 2012

Ruby Meetup

Ruby Meetup

Se acerca el segundo martes de Mayo, día de Ruby Meetup en Montevideo. Vale la pena recordar que NO ES NECESARIO SABER RUBY para acercarse:

La excusa es que entre todos nos pongamos un poco al día sobre distintas técnicas, herramientas, metodologías y lo que se nos ocurra. Aprender. Enseñar. Pero primordialmente: conocernos entre todos.

Para este martes ya somos 18 anotados. Si están interesados en ir, anótense en la página del meetup, así los contamos para la pizza y cerveza :)

La vez pasada estuvo muy buena, hubo bastante gente. Esta vez parece que Marcos Albe (conocido también por ser co-organizador de los MySQL Meetups) va a dar una charla sobre optimización para ORMs en Ruby On Rails :D

Fecha:
Martes 8 de Mayo – 19:30 horas

Lugar:
CoworkingMVD (via Cubox)
Bulevar España 2529, esquina Libertad (mapa)

por Fernando, el 5 de mayo de 2012 a las 17:57

4 de mayo de 2012

Fernando Briano

Reseña del Mozilla Developer Network Hack Day Montevideo 2012

Mozilla Developer Network Hack Day Montevideo 2012

Mozilla Developer Network Hack Day Montevideo 2012

El martes 24 se realizó el MDN Hack Day Montevideo 2012 en Café la diaria. El evento fue auspiciado por Mozilla, Cubox, la diaria y BlueVia.

Antes que nada, quiero aclarar que me reconozco fanboy de Mozilla, Firefox, y todo lo que hacen por la web. Podrán imaginar mi entusiasmo ante la visita de los Mozillianos y la realización de este evento. Pido disculpas si el post desborda en subjetividad :)

Llegué con Diego (“el jefe”) a café la diaria bastante temprano. Cubox participó de la organización, así que estuvimos a eso de las 17:00 para llevar algunas cosas y ver en qué ayudar.

Ahí estaba Havi Hoffman, a quien habíamos tenido el gusto de conocer más temprano en nuestro Coworking. Havi trabaja en Mozilla Labs y WebFWD, y mantiente la cuenta @mozlabs.

También estaba Shezmeen Prasad, Developer Events Manager de Mozilla. Ambas armando el registro y preparando todo para recibir a los asistentes. Pasados pocos minutos ya empezó a caer gente, a quienes se les recibía con stickers de Mozilla MDN y Firefox Aurora.

Dan Mills fue el primer orador y dió su charla en español. El título de su charla fue How to make passwords on your site a thing of the past. En ella presentó una nueva iniciativa de Mozilla para la identidad de los usuarios en la web: Mozilla Persona.

Este sistema se conocía anteriormente como BrowserID, que pasó a ser ahora el nombre del protocolo de cara a los desarrolladores.

Mozilla Persona

Mozilla Persona

Es un sistema muy interesante que pretende resolver varios problemas. Desde el punto de vista de los desarrolladores, evitarles reimplementar un sistema de autenticación en sus aplicaciones. Desde el punto de vista del usuario, evitarles tener que recordar nuevos nombres de usuario, así como no depender de servicios de terceros (Twitter, Facebook Connect, Google Accounts, etc.) para iniciar sesiones en distintos sitios. Lo único que se necesita es una dirección de correo electrónico válida.

El sistema vendría implementado nativo en Firefox, y la idea es que los navegadores que quieran lo implementen. Por el momento, si no se encuentra la característica en el navegador, usa un modal por JavaScript compatible con cualquier navegador para iniciar la sesión.

Desde el punto de vista de la privacidad, no tendremos que andar pasando más nuestra información desde un servicio a otro, sin saber con qué fin se usa.

Voy a seguir con atención Mozilla Persona. Resulta muy interesante, y espero se vaya implementando en cuantas plataformas y sitios sea posible. En estos momentos pueden probar esta nueva funcionalidad en los comentarios de este blog. Instalé el plugin Mozilla BrowserID para que se puedan dejar comentarios con Persona :)

Pueden leer más al respecto en los siguientes enlaces:

La siguiente charla la dió Shane Caraveo sobre Mozilla Marketplace, un mercado de aplicaciones web. La idea es crear un ecosistema abierto para desarrolladores y consumidores, incluyendo un mercado operado por Mozilla. Está basado en estándares web como HTML5, CSS y JavaScript junto a APIs diseñados por Mozilla.

Mozilla Marketplace

Mozilla Marketplace

Se busca evitar el desarrollo nativo para las plataformas propietarias (privativas) como son Android, iOS o Windows.  Aplicaciones HTML5 aseguran la libertad de los desarrolladores y usuarios así como la compatibilidad a lo largo de las distintas plataformas. Mozilla comparte la idea de que la web es algo universal, abierta y estándar, competitiva y mayor que cualquier proveedor.

En la presentación, Shane hizo una demostración donde ejecutaba aplicaciones web de un borrador funcional del mercado. Incluso mostró como una aplicación se instalaba desde el mercado web, y se ejecutaba como una aplicación más del sistema.

También espero que prospere esta gran iniciativa. Si bien ya existen varios mercados del estilo, cada uno es cerrado en su plataforma. Es importante ser conciente de los objetivos de cada uno, creado por empresas con fines comerciales y no por una fundación sin fines de lucro como Mozilla. Ojalá de acá a un tiempo las Apps de tecnologías estándar de Mozilla ocupen una parte importante del mercado, permitiendo el crecimiento de opciones más sanas para los desarrolladores y consumidores.

La siguiente presentación estuvo a cargo de Andres Leonardo Martinez Ortiz. Representante de BlueVia, comentó sobre el programa para desarrolladores de BlueVia: platforma e iniciativas. BlueVia provee una serie de APIs implementadas para interactuar por ejemplo con el envío de SMS aunque no está orientado exclusivamente al mercado de móviles.

SUPPORT ALL THE RESOLUTIONS!!1!

SUPPORT ALL THE RESOLUTIONS!!1!

La cuarta charla de la noche estuvo a cargo de Nicolás Barrera, colega cuboxer conocido en Internet como DrummerHead. Drummer es diseñador de aplicaciones y desarrollador front-end en Cubox, y nos habló sobre Diseño Web Responsivo.

El DWR (como lo voy a llamar en lo que queda de este post) se adapta a la pantalla del usuario, sin importar el tamaño o dispositivo, permitiendo una navegación y accesibilidad coherente a lo largo de las distintas formas de acceder a él (espero haberme expresado bien, no he dormido mucho…).

En la presentación explicó y demostró cómo implementar un diseño así de cero. Comentó el tag meta viewport para decirle a los navegadores móviles cómo comportarse, explica layout fluído, porcentajes a ems, y Media Queries.

Después de esto, fuimos invitados con unas pizzas, y hubo un breve intervalo para aprovechar a conversar, alimentarse y tomar algo en la barra del café la diaria.

A la vuelta de la comida, se dió lugar a las Lightning Talks. Las Lightning talks son charlas de unos poco minutos. Hubo un pizarrón durante todo el evento para anotar charlas que los asistentes quisieran dar.

Mozilla Dev Derby

Mozilla Dev Derby

Álvaro Mouriño fue el primero en presentar, y nos habló del Mozilla Dev Derby. Se trata de un concurso de Mozilla para crear demos de lo que se puede hacer con tecnologías web abiertas. Cada mes se decide un nuevo tema (actualmente hay uno de Websockets) y se eligen 3 ganadores. Los premios son un teléfono Android, un bolso para laptop y una camiseta de MDN. Álvaro ya ha participado de esta iniciativa, y ganó el segundo premio en el mes de Octubre de 2011.

Después pasó a hablar Evan Henshaw-Plath (“el otro jefe”), que habló sobre Software Libre. De como todo lo usamos y es muy fácil desarrollarlo y colaborar en el desarrollo de software libre. También comentó como en Cubox desarrollamos mucho software libre :D

El siguiente orador fui yo…

Mi charla se titula La web como herramienta social. Hacía mucho tiempo que no hablaba en público así que estaba un poco nervioso, pero creo que fue bastante bien. El objetivo de la charla fue intentar generar conciencia en los programadores hacia la web como herramienta de cambio social. Los 3 frentes que considero importante en esto son el Software Libre, la Web Abierta y los Datos Abiertos.

Así expliqué qué significa cada uno de estos 3 conceptos y las ventajas que trae desarrollar teniéndolos como objetivo y pilares. Me explayé más en la parte de Datos Abiertos, que es con la que vengo más involucrado desde Desarrollando América Latina, en parte buscando más adeptos para desarrollar en base a datos abiertos.

Para armar la presentación usé ShowOff, que no conocía hasta el día antes de tener que dar la charla :P Es algo así como un motor de presentaciones armado en una aplicación web sobre Sinatra. Está muy bueno y práctico.

Boot to Gecko

Boot to Gecko

Para cerrar el evento, pasó a presentar Robert Nyman con JavaScript APIs – The Web is the Platform. La charla arrancó bastante divertida, Robert se presentó como Sueco y comentó algunas particularidades de la gente de Suecia.

Mostró bastante código y comentó sobre nuevas tecnologías web en las que se está trabajando en Mozilla: Fullscreen API (pantalla completa desde JavaScript), acceso a cámaras, WebRTC (capacidad de comunicación en tiempo real a través de APIs JavaScript), Pointer Lock API, IndexedDB, Battery API.

Otro proyecto bien interesante en el que se viene trabajando es Boot To Gecko (B2G). Es un sistema operativo completo e independiente para la web abierta.

Está formado por Gaia – la interfaz de usuario escrita completamente en HTML, CSS y JavaScript. Su interacción con el sistema operativo se realiza a través de Open Web APIs implementados por Gecko. Gecko es el runtime de aplicación, implementando los estándares abiertos para HTML, CSS y JS. El sistema operativo a mas bajo nivel se denomina Gonk, un kernel linux con una capa de abstracción HAL y varias bibliotecas open source.

Gonk es como una mini-distribución de linux, y es un port más al que apunta Gecko, así como hay un Gecko para OS X, y uno para Android. Al tener control sobre Gonk, B2G expone interfaces a Gecko que no son accesibles en otros sistemas. Por ejemplo el acceso a la pila de telefonía y pantalla.

También entre otras cosas hizo mención a Firefox Aurora.

Firefox Aurora

Firefox Aurora

Aurora es la versión pre-beta de Firefox. En estos momentos corresponde a lo que eventualmente será Firefox 14. Desde el evento instalé Aurora en mi computadora con ArchLinux y la verdad que funciona muy bien. Noté una mejora en la reproducción de videos HTML 5, además de no haber sufrido ninguna explosión del navegador hasta ahora y en general lo siento mas rápido en todo.

También comentar que los plugins siguen funcionando de lo mas bien. Solo tuve que instalar una versión alfa de Firebug (1.10a7) porque la 1.9 no funcionaba bien.

El objetivo de este build de Firefox es tener un primer vistazo a las nuevas herramientas de desarrollo, características de seguridad y nuevas tecnologías HTML5 y web en general.

Y así terminó un excelente evento de la mano de Mozilla y demás organizadores. Para mi fue un honor ser parte del evento tanto dando una charla junto a gente tan genial (que está haciendo cosas tan increíbles por el progreso de la web), como ayudando con la organización y difusión.

Quedamos todos muy contentos y agradecidos de haber tenido a los Mozillianos por estos lados, y los esperamos para una próxima visita :)

por Fernando, el 4 de mayo de 2012 a las 12:00

2 de mayo de 2012

Marcos Crispino

Comparación de strings por aproximación

Para una aplicación que estoy haciendo con GeneXus (después cuento de que se trata...), necesitaba poder comparar dos strings, pero no necesito que sean exáctamente iguales, me alcanza con que sean aproximados.

El primer intento fue hacer que uno de los dos strings fuera por lo menos la mitad del largo del otro y que estuviera contenido. Como aproximación está bien, pero si por ejemplo uno de los dos tiene un tilde y el otro no, da que son diferentes.

Gracias a Matías me enteré que existe un algoritmo, llamado Distancia de Levenshtein, que se usa justamente para esto. Según Wikipedia:
En Teoría de la información y Ciencias de la Computación se llama Distancia de Levenshtein, distancia de edición, o distancia entre palabras, al número mínimo de operaciones requeridas para transformar una cadena de caracteres en otra. Se entiende por operación, bien una inserción, eliminación o la sustitución de un carácter. Esta distancia recibe ese nombre en honor al científico ruso Vladimir Levenshtein, quien se ocupara de esta distancia en 1965. Es útil en programas que determinan cuán similares son dos cadenas de caracteres, como es el caso de los correctores de ortografía.
Dejo acá el algoritmo en GeneXus, por si a alguien más le resulta útil:
/*
* Distancia de Levenshtein
*
* Fuente: http://es.wikipedia.org/wiki/Distancia_de_Levenshtein
*
* parm(in:&str1, in:&str2, out:&distance);
*
* Todas las variables son N(4) salvo &str1 y &str2 que son C(100)
*/

&lenStr1 = &str1.Length()
if &lenStr1 > 99
    &lenStr1 = 99
endif

&lenStr2 = &str2.Length()
if &lenStr2 > 99
    &lenStr2 = 99
endif

for &i = 1 to &lenStr1+1
    &distMatrix(&i, 1) = &i-1
endfor
for &j = 1 to &lenStr2+1
    &distMatrix(1, &i) = &j-1
endfor

for &i = 2 to &lenStr1+1
    for &j = 2 to &lenStr2+1
        if &str1.Substring(&i, 1) = &str2.Substring(&j, 1)
            &costo = 0
        else
            &costo = 1
        endif

        &val1 = &distMatrix(&i-1, &j)+1 // deletion
        &val2 = &distMatrix(&i, &j-1)+1 // insertion
        &val3 = &distMatrix(&i-1, &j-1) + &costo // substitution

        &min = &val1
        if &val2 < &min
            &min = &val2
        endif
        if &val3 < &min
            &min = &val3
        endif

        &distMatrix(&i, &j) = &min
    endfor
endfor

&distance = &distMatrix(&lenStr1+1, &lenStr2+1)

por noreply@blogger.com (Marcos Crispino), el 2 de mayo de 2012 a las 18:16

Fernando Briano

Actualizado UserAgent-Spy después de 2 años…

WordPress

Además de List Category Posts, también desarrollé el plugin para WordPress UserAgent-Spy. Es el plugin que uso para mostrar los navegadores, sistemas operativos y dispositivos de los usuarios en los comentarios.

Hacía tiempo que quería retomar su desarrollo, pero siempre lo iba dejando de lado por otras cosas. Finalmente me decidí y volví a él. Tengo que admitir que me costó bastante.

En primer lugar, al igual que List Category Posts, este plugin empezó de un script super básico a crecer poco a poco. El modelo de crecimiento fue al estilo “monstruo de Frankestein”, donde iba metiéndole código por un lado y por otro para alcanzar distintas funcionalidades. El resultado final fue obviamente el esperado: ¡UN MONSTRUO!

Frankenstein WordPress

Frankenstein WordPress

Mirar el código de hace un buen tiempo me hizo pensar que o bien he aprendido mucho en este tiempo, o era un programador horrible en ese momento. En verdad no son mutuamente excluyentes, así que puedo aceptar que ambas afirmaciones son ciertas. Si bien ahora sigo pensando que hay miles de mejoras para hacerle al código, aprolijé bastante por todos lados.

También intenté documentar un poco más. No entendía mi propio código, y tenía ganas de agarrar la máquina del tiempo, buscarme en el momento en que  escribí esas cosas, y pegarme una patada voladora atrás de la oreja.

En fin, después de un buen rato de pelea, salió a la luz UserAgent-Spy 1.2. Para el usuario final hay pocos cambios:

  • Ahora detecta dispositivos Apple, Blackberry y HTC. Al haber retomado, espero poder agregar más dispositivos e información en breve.
  • Detecta PCLinuxOS. Solo porque quería agregar al menos un sistema operativo más. PCLinuxOS está mencionado en los comentarios de la página del plugin, así que lo agregué.

Los cambios más importantes están a nivel de código, ahora se entiende un poco más. Por otro lado, voy a hacer lo mismo que hice con List Category Posts: continuar el desarrollo en GitHub.

Como plataforma para desarrollo colaborativo de software open source, GitHub es la solución ideal. Ya he recibido Pull Requests de otros usuarios en LCP, y el sistema de tickets para bugs, pedidos de nuevas características, etc. es muy bueno. Así que de ahora en más voy a llevar el desarrollo desde ahí, exportando versiones nuevas al repositorio SVN de WordPress.

Comentario aparte: que viejo se siente Subversion.

Se sintió bastante raro ver que la última modificación al código había sido en enero del 2010. No parece haber pasado tanto tiempo. El plugin ya tiene 4 años de desarrollado, y desde entonces siempre estuvo instalado acá en Picando Código y otros de mis blogs. Por eso no me hubiera imaginado que pasaría tanto tiempo sin actualizarlo, y más importante, que volvería a meterle mano. Pero ahora que “volví a la programacíon” mi idea es no dejarlo tan abandonado nuevamente.

Si quieren ayudarme con el desarrollo del plugin, pueden usarlo, probar navegadores, sistemas operativos y dispositivos distintos que no sean detectados, e informarme. Cualquier aporte de código también es bienvenido, y esto resulta mucho mas fácil teniéndolo en GitHub. Espero tener nuevas versiones más seguido, y no que la próxima actualizarlo sea en 2014 :)

por Fernando, el 2 de mayo de 2012 a las 12:00

1 de mayo de 2012

Enrique Almeida

KBDoctor : Para que sirve?

En el GeneXus Marketplace esta la extensión KBDoctor, que desarrollamos con Diego y Marcos hace unos cuantos años.  Se basa en una herramienta que teniamos para GeneXus 9.0, que permitia depurar KBs.

Hace unos días, me preguntaron para que servia y si valía la pena instalarla.

La idea de esta extensión, es poder corregir algunos problemas comunes que se presentan en KB GeneXus.

A la pregunta si vale la pena instalarla, mi respuesta es que si vale le pena, pues permite diagnosticar algunos problemas y solucionar otros. También permite borrar aquellos objetos que no están siendo usados, que enlentecen el desarrollo y entorpecen el mantenimiento.

Voy a contar cuales son los reportes que pueden sacarse.

Reporte de Atributos

Todos los atributos deben estar basados en dominios.
El reporte "Attributes without domain", permite listar todos aquellos atributos que no estan basados en dominios y que a su vez no son subtipos de otros atributos.
Facilita detectar cuales son los atributos que hay que modificar.

Attributes with no description 
Lista y permite modificar, aquellos atributos que tienen la descripciones que deja por defecto GeneXus.
Permite cambiar el titulo contextual, de las columnas, etc. Es importante ajustar estos literales asociados a atributos, porque ayudan muchisimo en el diseño de pantallas sobre todo si uno basa su desarrollo en patterns.

Attributes Description without unique index. 
El atributo marcado como descripcion en cada tabla, es conveniente que no se repita. Por ejemplo, si tenemos una tabla de paises, no es bueno que dos tengan exactamente el mismo nombre, pues despues se dificulta su identificacaion. Por ejemplo, si hacemos un Dynamic Combo y mostramos las descripciones, se hace imposible saber de que valor estamos hablando viendo unicamente la descripcion. Si se define un indice unico por dicho atributo, este problema se soluciona.

Atributes without table. 
Si la base de conocimiento tiene varios años, es posible que se borren tablas, pero queden atributos referenciados (por ejemplo  variables en objetos, que dependan de artibutos). Estos atributos no pueden ser borrados porque están referenciados aun. Este reporte permite identificarlos.
En la nueva versión (que aun no fue liberada), ya se quitan las referencias en variables y se intenta borrar dichos atributos.

Attributes Char that should be VarChar. 
Estos son atributos char de largo mayor que 50. La mayoria de estos atributos, es conveniente definirlos como Varchar, pora que ocupen menos lugar en la base de datos, optimizando asi el almacenamiento y la performance de la base de datos.

Attributes VarChar that should be Char. 
Los atributos de largo menor a 25 y tengan largo variable, son listados. Estos no se consideran un error, sino que hay que revisarlos.

Attributes Varchar y Key. 
En algunas bases de datos, la comparación de campos VarChar y Char, es problematica, pues los blancos al final, hacen que se tengan diferencias. Por ejemplo, en Oracle, algunos joins entre varchar y char no traen los tuplas correspondientes. Por eso, es recomendable no tener campos clave con campos Varchar. Este reporte lo que hace es listar todos los atributos que son varchar y son clave en alguna tabla, para que se pueda revisar y corregir.

Reportes de Tablas


Tables with no description. 
Este reporte lista todas tablas que no tienen descripción, o que tiene un descripción por defecto.
Permite cambiar la descripción. Es importante poner descripciones bien descriptivas de las tablas, porque las mismas se muestran en los mensajes de integridad referencial de las transacciones y si la tabla tiene un descripción que al usuario no le dice nada, puede provocar problemas de usabilidad.

Subtype groups whit no description. 
Al igual que la tabla, en algunos mensajes se usan las descripciones de los subtipos. Es conveniente que los mismos tengan descripciones que expresen el contenido de dicho subtipos.

Table Width. 
Este es uno de los últimos reportes incorporados al KBDoctor. Muestra el ancho de las tablas (sumando el largo de cada uno de los atributos que la componen). Permite identificar tablas que tengan muchas campos en la clave, que tengan claves demasiado grandes lo cual enlentece la inserción de registros y también muestra la suma de los campos de ancho fijo y los de ancho variable (como varchar, longvarchar).

Reporte de indices.


Indexes with not referenced attributes. 
Uno de los problemas mas comunes de performance, es tener demasiados indices definidos. Algunas veces, es dificil identificar cuales son los indices que no se usan.
La mayoría de las base de datos, brindan reportes de indices no utilizados, pero desde GeneXus es difícil saber cuales son. Este reporte lo que permite es identificar aquellos indices que tienen atributos que no son referenciados por nadie, por lo que el indice (o parte de el) , no esta siendo utilizado por la aplicación generada.

Reportes de Objetos. 


Object not referenced. 
Son aquellos objetos que no son main y que no son referenciados por nadie. Estos objetos pueden borrarse y la aplicación va a seguir funcionando sin inconvenientes. Es conveniente hacer un backup de los mismos y luego borrarlos.

Not reachables objects. 
Este es uno de los reportes mas utiles del KBDoctor. Permite identificar aquellos objetos que no son alcanzables desde ninguno de los objetos main de la aplicación. Ademas de generar un listado, marca a dichos objetos como no generables y los pone en una categoría (KBdoctor.Unreachable) para que sea fácil trabajar con ellos. Se identifican que tablas se dejaron de usar en la aplicación, que atributos podrían borrarse, etc.

With parm() without in:/out:/inout:
Este reporte tiene los objetos que tienen reglas parm() pero no están declarados si sus parámetros son de entrada o de salida. Hace mucho tiempo, todos los parámetros de los objetos en Genexus eran de entrada salida, por lo que es común tener muchos objetos en las KB que no tienen especificados como deben usarse los parámetros.
Es importantisimo establecer el uso de parametros en los objetos, porque queda muchísimo mas claro, la semántica de los objetos, al saber como se van a tratar los parámetros que recibe o devuelve.
Ademas, es una fuente común de errores, el que se modifique un parámetros que se cree que es solo de entrada pero es modificado en el objeto llamado. Recomiendo fuertemente que todos los objetos que tengan regla parm() especifiquen en todos sus parametros si son in:/out: o inout:.

Wtih variables not based in attributes/domain. 
Es conveniente basar las variables en atributos o en dominios. De esta forma, cuando modifique algo en mi atributo, se va a modificar también en las variables basadas en el.
Este reporte muestra cuales son los objetos que tienen variables que no se basan en dominios o atributos y permite corregirlos.

With parm() y Commit on Exit = YES. 
Cuando un objeto, tiene regla parm() puede inferirse que va a ser llamado por otros. Si tiene la regla Commit on Exit = YES, puede hacer que se quieber la integridad transaccional, cortando la transaccion en la base de datos. Es conveniente tener identificado todos los objetos que hacen commit en la base de datos, para que no se nos escapen errores.

Object with variables not used. 
Este reporte muestra cuales son los objetos que tienen variables definidas, pero no son referenciadas.
Desde hace un tiempo utilizo mas el Variables Cleaner desarrollado por DVelop, pues es mas práctico que este reporte, pues ya borra todas las variables que no están siendo usadas.

Estoy trabajando en una versión del KBDoctor que permita hacer mas cambios en la KB, por ejemplo la opción "Clean my KB as much as possible", va a dejar todos los objetos que se necesitan para generar la aplicación, pero va a borrar todo lo accesorio. Como modifica la  KB, tengo que probarlo bastante para no hacer demasiados destrozos.

También estoy trabajando en algunos reportes que identifican objetos "complejos" (grandes, con muchas dependencias, etc) y otro que identifica objetos "similares" (candidatos a refactoring).

Estén atentos a las próximas versiones.

por noreply@blogger.com (Enrique Almeida), el 1 de mayo de 2012 a las 23:31

Enrique Place

Se viene la moda de revivir a los artistas fallecidos a través de hologramas

Según las noticias, hace poco hicieron un recital, y Snoop Dogg no se le ocurrió mejor idea que "revivir" y cantar a duo con el famoso rapero Tupac, fallecido por 1997. Según cuentan, los espectadores más que quedar contentos, quedaron helados, ya que fue una experiencia bastante "tenebrosa" (me pasó lo mismo al verlo).

Esta técnica tuvo sus repercusiones, ahora parece que los "vivos" de los hermanos de Michael Jackson, ya que en vida no accedió a volver a cantar con ellos con Jackson Five, lo quieren "obligar" a través de un holograma, al igual que hicieron con Tupac.

Lo que no me queda claro del holograma de Tupac, si es que están repitiendo literalmente algo que hizo en un recital hace muchos años, o lograron hacerlo hacer cosas que nunca hizo, "nuevas". Estimo que si todo es digital, es un tema de tiempo a que esto ya no sea un límite y lo hagan hacer cualquier cosa que quieran.

Había sentido hace unos años que habían productores en EEUU que estaban adquiriendo los derechos de figuras ya fallecidos para volverlos a la vida... ahora entiendo por qué.



Diseño del efecto del Holograma



Humor



Más información

- Explicación del efecto (inglés)

- Cómo funcionó el holograma de Tupac en Coachella

por Enrique Place (noreply@blogger.com), el 1 de mayo de 2012 a las 18:48