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
Planeta de desarrolladores uruguayos
por Darío Clavijo (noreply@blogger.com), el 14 de mayo de 2012 a las 18:29
por Darío Clavijo (noreply@blogger.com), el 12 de mayo de 2012 a las 17:52
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
por Darío Clavijo (noreply@blogger.com), el 11 de mayo de 2012 a las 13:43
por Federico Varela (noreply@blogger.com), el 10 de mayo de 2012 a las 03:37
El mes de mayo viene lleno de eventos interesantes en Montevideo, así que la agenda está bastante completita:
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.
Antel organiza una conferencia internacional de Software Libre con expositores interesantes. De destacar la presencia del famoso Jon “maddog” Hall.
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.
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
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 ![]()
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
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.
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.
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.
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.
Á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 ![]()
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
Es algo así como un motor de presentaciones armado en una aplicación web sobre Sinatra. Está muy bueno y práctico.
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.
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
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
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!
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:
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
por noreply@blogger.com (Enrique Almeida), el 1 de mayo de 2012 a las 23:31
por Enrique Place (noreply@blogger.com), el 1 de mayo de 2012 a las 18:48