Con la noticia de que he sido aceptado para este Google Summer of Code 2010, con Tux4Kids. Este año inscribí dos proyectos, uno en Oregon State University Open Source Lab con la idea de un Web Crawler Distribuido basado en Pydra, y otro para Tux4Kids, con la idea de crear un Juego RTS (Real Time Strategy) estilo Age of Empires para enseñar historia.
Fue aceptada el projecto para Tux4Kids. Espero sea del interés ver como se va creando el juego. Es un projecto ambicioso, y espero tener la capacidad para poder complirlo, pero creo que el gusto por este tipo de juegos es más importante que otra cosa :).
En este blog iré publicando los avances que trendré. Mientras tanto espero terminar el semestre lo antes posible y así dedicarme de lleno.
Saludos!
martes, 27 de abril de 2010
viernes, 16 de abril de 2010
Google Dev Fest 2010 México: ¿A donde llegaremos?
Hace algunas semanas me enteré de la existencia de este evento, que al parecer ya se viene celebrando en méxico desde hace algún tiempo. Se realizó en el Centro Banamex y trajo Don Dodge (ex empleado de Microsoft y vicepresidente de Napster jaja lol ), Ossama Alami, Chris Messina, Pamela Fox (se ve que es la pura fiesta), Chris Ramsdale y Chris Schalk como los principales desarrolladores. Los temas que se trataron fueron las tecnologías que ofrece google para el mundo de los desarrolladores: Google Web Toolkit, App Engine, Android API, Geo API, Google Wave API.
Las conferencias comenzaron tarde, algo que me tuvo que extrañar de sobremanera, con la asitencia de grupos de programadores (¿enviados de sus empresas?), amantes de Google y muchos programadores amantes de su oficio.
Lo imperdonable: La comida no fue de la calidad a la que nos acostumbra google. ¿Será porque somos simples programadores de México? Y la conexión wifi estuvo inaccesible casi todo el tiempo, incluso para las demos en vivo de los expositores.
En general, me dejó un mal sabor de boca. Google utiliza muchas tecnologías Open/Free Source como Python, pero gran parte de su tecnología (Excepto Chrome y Android) parecen estar restringidas, App Engine nos mantiene atados no a un API, a sus servidores y sus modelos, existen muchos mejores bibliotecas JavaScript que Google Web Toolkit (GWT), y OpenMaps debe volverse superior en los próximos años a Google Maps si queremos que pare la invasión a la privasidad (Google Street que horror!). Y Wave? Nada impresionante, solo se pretende que los desarrolladores contribuyan al desarrollo de Adds y Robots.
Lo se, google aporta mucho a la comunidad del Software Libre/Abierto con eventos como Google Summer of Code, GHOP y los financiamientos que realiza. Pero... el las áreas más importantes de esta empresa son software propietario aprovechando las ventajas del software libre, dando un manejo dudoso a la información(el 70%+ de la información del mundo) que manejan.
Si tanto nos costó a algunos dejar de depender de las tecnologías de una empresa (Microsoft) para caer en las garras de otra, NO GRACIAS.
Que mejor que escribir código en GPL, con herramientas GPL, listas para compliarse desde GNU/Linux para los sistemas operativos que queramos. Ahí si me sientiría bien.
Más info: http://www.googledevfest.com.mx/
Las conferencias comenzaron tarde, algo que me tuvo que extrañar de sobremanera, con la asitencia de grupos de programadores (¿enviados de sus empresas?), amantes de Google y muchos programadores amantes de su oficio.
Lo imperdonable: La comida no fue de la calidad a la que nos acostumbra google. ¿Será porque somos simples programadores de México? Y la conexión wifi estuvo inaccesible casi todo el tiempo, incluso para las demos en vivo de los expositores.
En general, me dejó un mal sabor de boca. Google utiliza muchas tecnologías Open/Free Source como Python, pero gran parte de su tecnología (Excepto Chrome y Android) parecen estar restringidas, App Engine nos mantiene atados no a un API, a sus servidores y sus modelos, existen muchos mejores bibliotecas JavaScript que Google Web Toolkit (GWT), y OpenMaps debe volverse superior en los próximos años a Google Maps si queremos que pare la invasión a la privasidad (Google Street que horror!). Y Wave? Nada impresionante, solo se pretende que los desarrolladores contribuyan al desarrollo de Adds y Robots.
Lo se, google aporta mucho a la comunidad del Software Libre/Abierto con eventos como Google Summer of Code, GHOP y los financiamientos que realiza. Pero... el las áreas más importantes de esta empresa son software propietario aprovechando las ventajas del software libre, dando un manejo dudoso a la información(el 70%+ de la información del mundo) que manejan.
Si tanto nos costó a algunos dejar de depender de las tecnologías de una empresa (Microsoft) para caer en las garras de otra, NO GRACIAS.
Que mejor que escribir código en GPL, con herramientas GPL, listas para compliarse desde GNU/Linux para los sistemas operativos que queramos. Ahí si me sientiría bien.
Más info: http://www.googledevfest.com.mx/
Etiquetas:
2010,
Android,
API,
App Engine,
Dev Fest,
Google Summer of Code,
Wave
jueves, 18 de febrero de 2010
Ortografía en VIM
VIM 7 viene con una grán novedad. Es un spell checker instalado por defecto. Antes, teníamos que descargar plugins opara poder usar estas características. Ahora es múcho más fácil utilizar VIM como editor LATEX, HTML, etc... En el momento en que VIM encuentra una falta de ortografía en nuestro texto podrá esta palabra con fondo rojo. Para usar vim-spell-checker utilizaremos los siguientes comandos:
:setlocal spell spelllang=es_MX
En algunas distribuciones modernas no se tiene los paquetes para español de ispell. Por lo tanto será necesario descargarlos. Ubuntu, en mi caso, intenta descargar los paquetes pero falla en ello. Descargue los paquetes de http://ftp.vim.org/vim/runtime/spell/ y colóquelos en /usr/share/vim/vim72/spell/ donde vim72 puede variar (esto para sistemas tipo debian, asegúrese de saber donde se encuentran los archivos shared de vim en su sistema).
Ahora que ya sirve el spell checker podemos utilizar una serie de comandos:
:setlocal nospell
:setlocal spell spelllang=es_MX
En algunas distribuciones modernas no se tiene los paquetes para español de ispell. Por lo tanto será necesario descargarlos. Ubuntu, en mi caso, intenta descargar los paquetes pero falla en ello. Descargue los paquetes de http://ftp.vim.org/vim/runtime/spell/ y colóquelos en /usr/share/vim/vim72/spell/ donde vim72 puede variar (esto para sistemas tipo debian, asegúrese de saber donde se encuentran los archivos shared de vim en su sistema).
Ahora que ya sirve el spell checker podemos utilizar una serie de comandos:
- ]s Siguiente error ortográfico.
- [s Errór ortográfico anterior.
- zg Aprender palabra.
- zw marcar palabra como error.
- zug y zuw Deshace los comandos respectivos.
- z= Muestra una lista de tamaño completo de palabras sugeridas
- Ctrl-X s Muestra una lista de autocompletado con las palabra sugerdias. Esto en modo incerción.
:setlocal nospell
jueves, 28 de enero de 2010
Tux4Kids Cambia su repositorio de Subversion a Git
El fin de semana pasado Tux4Kids migra de subversion a Git. Definitivamene, uno de los problemas en el mundo es que existen ¡demasiados! sistemas de control de versiones, cada uno "mejor" que la otra. Yo hasta el momento no tengo autoridad para hablar del tema. Únicamente conozco CVS y Subversion. Éste último me encantó por su excelente libro online. Pero es hora de aprender un poco de Git. Comparto con ustedes una referencia rápida de comandos útiles para trabajar sobre este sistema:
git init crea un repositorio.
git clone clona un repositorio remoto.
git add Añade un archivo o directorio al repo. (Si lo agrega de forma recursiva)
git rm -f Elimina un archivo o directorio del arbol. La opción -f fuerza la elimiación de archivos locales.
git mv -f Mueve un directorio o archivo (Misma opción -f)
git checkout [rev] file -f Restaura archivo del branch o revisión (Si se indica) con la misma opción -f
git status Muestra el estatus del actual arbol.
git diff Diferecnias entre el arbol con respecto al remoto.
git commit -a "Subir" (commit) un archivo o todos con la opción
git reset --hard Regrear el arbol al pasado commit y --soft deshacer el commit pero mantener los archivos en arbol
git clean Elimiar archivos que no son del arbol
git blame Obtener lineas modificadas
git fetch Obtener archivos remotos
git pull Obtener archivos remotos y hacer merge con los locales
git checkout branch Cambiar el arbol a un branch indicado
git branch Lista de branch locales
git merge branche Lleva a cabo un merge del barnch con el arbol ptincipal.
git apply < file Aplicar un parche.
git archivo rev > fileExporta un parche de en contraste a una revisión data al archivo.
Para acercarnos a git en verdad que recomiendo: http://cworth.org/hgbook-git/tour/
Es un Tour fácil para adquirir los conocimientos necesarios para comenzar a trabajar sobre un proyecto.
Tambien recomiendo una referencia rápida (Sobre la cual está basada esta entrada): http://jonas.nitro.dk/git/quick-reference.html
Y por último, claro está, la documentación oficial de Git: http://www.kernel.org/pub/software/scm/git/docs/user-manual.html
Suerte probando y jugando con Git!
git init crea un repositorio.
git clone clona un repositorio remoto.
git add Añade un archivo o directorio al repo. (Si lo agrega de forma recursiva)
git rm -f Elimina un archivo o directorio del arbol. La opción -f fuerza la elimiación de archivos locales.
git mv -f Mueve un directorio o archivo (Misma opción -f)
git checkout [rev] file -f Restaura archivo del branch o revisión (Si se indica) con la misma opción -f
git status Muestra el estatus del actual arbol.
git diff Diferecnias entre el arbol con respecto al remoto.
git commit -a "Subir" (commit) un archivo o todos con la opción
git reset --hard Regrear el arbol al pasado commit y --soft deshacer el commit pero mantener los archivos en arbol
git clean Elimiar archivos que no son del arbol
git blame Obtener lineas modificadas
git fetch Obtener archivos remotos
git pull Obtener archivos remotos y hacer merge con los locales
git checkout branch Cambiar el arbol a un branch indicado
git branch Lista de branch locales
git merge branche Lleva a cabo un merge del barnch con el arbol ptincipal.
git apply < file Aplicar un parche.
git archivo rev > fileExporta un parche de en contraste a una revisión data al archivo.
Para acercarnos a git en verdad que recomiendo: http://cworth.org/hgbook-git/tour/
Es un Tour fácil para adquirir los conocimientos necesarios para comenzar a trabajar sobre un proyecto.
Tambien recomiendo una referencia rápida (Sobre la cual está basada esta entrada): http://jonas.nitro.dk/git/quick-reference.html
Y por último, claro está, la documentación oficial de Git: http://www.kernel.org/pub/software/scm/git/docs/user-manual.html
Suerte probando y jugando con Git!
martes, 26 de enero de 2010
Proyecto Kickapoo
En los pasados días he trabajado para desempolvar un viejo proyecto que he tenido guardado. Se trata de Kickapoo, un web spider que extrae información de páginas MySpace utilizando BeautifulSoup, guardando la información en una base de datos mappeada con SQLALchemy. En lo general ya funcion, pero, claro está que hay que pulir el web spider aún más para no perder tanta información hasta ahora.
Principalmente busca por páginas con información acerca de native american, trata de clasificar de que tríbu son utilizando los lugares de residencia. Esto es una presunción que realiza el programa.
El siguiente paso en el proyecto es lograr llevar esta información a un algoritmo de clustering de aprenizaje no asistido para poder agrupar a las diversas personas en categorías de intereses.
Tambien pretendo realizar, con la información estable del MySpace un poco de estadística descriptiva ilustrando los resultados de la investigación.
He publicado el código bajo GPLv3 para que todos puedan ver y reusar el código.
Lo pueden encontrar bajo: https://sourceforge.net/projects/kickapoo/
y pueden navegar por código en: http://kickapoo.svn.sourceforge.net/viewvc/kickapoo/
Por último pueden crear una copia local con: svn co https://kickapoo.svn.sourceforge.net/svnroot/kickapoo kickapoo
Principalmente busca por páginas con información acerca de native american, trata de clasificar de que tríbu son utilizando los lugares de residencia. Esto es una presunción que realiza el programa.
El siguiente paso en el proyecto es lograr llevar esta información a un algoritmo de clustering de aprenizaje no asistido para poder agrupar a las diversas personas en categorías de intereses.
Tambien pretendo realizar, con la información estable del MySpace un poco de estadística descriptiva ilustrando los resultados de la investigación.
He publicado el código bajo GPLv3 para que todos puedan ver y reusar el código.
Lo pueden encontrar bajo: https://sourceforge.net/projects/kickapoo/
y pueden navegar por código en: http://kickapoo.svn.sourceforge.net/viewvc/kickapoo/
Por último pueden crear una copia local con: svn co https://kickapoo.svn.sourceforge.net/svnroot/kickapoo kickapoo
miércoles, 18 de noviembre de 2009
Reporte del GSoC Mentor Summit
Nunca había acudido al Googleplex. Era en verdad una de las ocacionesmás especiales que he tenido de acercamiento con el gran mundo de Silicon valley. Un viaje desde méxico a San Franciso y de ahi con el Caltrain hasta llegar a la estación de Sunnyvaley donde se ecuentra el hotel apartado para todo el grupo de mentores para Google Summer of Code. En este Summer of Code participé como mentor por el proyecto Tux4Kids, del cual soy programador del juego educativo TuxMath. Guié a un estudiante en la programación de una herramienta de administración gráfica para el dos juegos de nuestro proyecto.
Solo había dos lugares por organización participante, y afortunadamente fui elegido para asistir, que en verdad fue todo un honor. :)
Definitivamente, el mundo open source es el mio. Core developers de los proyectos FOSS más importantes asistireron. Debian, Fedor, Linux Foundation, Django, Python, Perl, Apache, MySQL, PostgreSQL, FreeBSD, Gnome, GNU, Eclipse, Joomla!, KDE, PHP, Ruby on Rails, entre tantos otros y por supuesto mis amigos de Sugar Labs y FreiFunk, todos con ganas de abrender y compartir experiencias de otros proyectos, problemas y soluciones.
El evento se organizó los días 24 y 25 de octubre del 2009. A lo largo de los dos días se realizaon pláticas de las diversas organizaciones. Algunas en forma de exposiciones, otras de trabajo, donde los proyectos discutian problemas directos a solucionar y talleres para introducir el uso de tecnologías como OGRE.
Anexo el Wiki del evento, y una foto grupal que nos tomamos!
también contiene las notas de las pláticas, para que todo mundo pueda ver las discuciones tan interesantes que se dieron.
http://gsoc-wiki.osuosl.org/index.php/2009
Solo había dos lugares por organización participante, y afortunadamente fui elegido para asistir, que en verdad fue todo un honor. :)
Definitivamente, el mundo open source es el mio. Core developers de los proyectos FOSS más importantes asistireron. Debian, Fedor, Linux Foundation, Django, Python, Perl, Apache, MySQL, PostgreSQL, FreeBSD, Gnome, GNU, Eclipse, Joomla!, KDE, PHP, Ruby on Rails, entre tantos otros y por supuesto mis amigos de Sugar Labs y FreiFunk, todos con ganas de abrender y compartir experiencias de otros proyectos, problemas y soluciones.
El evento se organizó los días 24 y 25 de octubre del 2009. A lo largo de los dos días se realizaon pláticas de las diversas organizaciones. Algunas en forma de exposiciones, otras de trabajo, donde los proyectos discutian problemas directos a solucionar y talleres para introducir el uso de tecnologías como OGRE.
Anexo el Wiki del evento, y una foto grupal que nos tomamos!
también contiene las notas de las pláticas, para que todo mundo pueda ver las discuciones tan interesantes que se dieron.
http://gsoc-wiki.osuosl.org/index.php/2009
martes, 4 de agosto de 2009
Algoritmos de búsqueda binario, secuencial y secuencial indexado
Este es un programa escrito en ANSI C que demuestra los algoritmos de ordenamiento binario, secuencial y secuencial indexado. Primero crea una vector aleatorio, busca el numero pedido por medio de búsqueda secuenical. Posteriormente odena el vector mediante Quiksort, para después proceder sobre el vector mediante búsqueda binaria y finalmente crea un índice para la búsqueda seciencial indexada.
/*
* Programa: busca.c
*
* Programa muestra de una busqueda secuencial, binaria y sequencial indexada
*
* Autor: Jesús Manuel Mager Hois
* Materia: Informática III
* Facultad de Contaduría y Administración
* UNAM
*
* Licencia GPL 3 o superior
* 2009
*
*/
#include<stdio.h>
#include<stdlib.h>
#define TAM 45
#define MAX_IND 100
typedef struct index{
int valor;
int pos;
}index;
// Funciones de utilidad
void quick_sort(int v[], int size);
void q_sort(int v[], int left, int right);
// Devuelve la posición int del arreglo de enteros v de tamaño tam entero
int b_secuencial(int v[], int tam, int buscar);
int b_binaria(int v[], int tam, int buscar);
int index_creator(int tam);
int b_secindexada(int v[], int tam, int buscar);
int main (int argc, char * argv[]){
int v[TAM];
int i;
int pos;
int temp;
printf("********* Programa demostrar algoritmos de ordenamiento *********\n");
printf("Números generados en el vector: ");
for(i=0; i<TAM; i++){
v[i]=random()%150;
printf("%d ",v[i]);
}
printf("\nNúmero a buscar?");
scanf("%d", &temp);
printf("\n# Por búsqueda secuencial ");
if((pos=b_secuencial(v, TAM, temp))!=-1)
printf("%d se encuenra en la posición: %d\n", temp, pos);
else
printf("%d no se encuentra en la lista", temp);
printf("\nOrdenando la lista.... (Quicksort)");
printf("\nEl vector ordenado es: ");
quick_sort(v, TAM);
for(i=0; i<TAM; i++)
printf("%d ", v[i]);
printf("\n");
printf("\n# Por búsqueda binaria ");
if((pos=b_binaria(v, TAM, temp))!=-1)
printf("%d se encuenra en la posición: %d\n", temp, pos);
else
printf("%d no se encuentra en la lista", temp);
if((pos=b_secindexada(v, TAM, temp))!=-1)
printf("%d se encuenra en la posición: %d\n", temp, pos);
else
printf("%d no se encuentra en la lista", temp);
printf("\n ****************** Fin del Programa *******************\n");
return 0;
}
/*
* Funciones de utilidad para ordenar mediante
* Quicksort
*/
void quick_sort(int v[], int size)
{
q_sort(v, 0, size-1);
}
void q_sort(int v[], int left, int right)
{
int pivot, lTmp, rTmp;
lTmp=left;
rTmp=right;
pivot=v[left];
while ( left < right )
{
while((v[right] >= pivot) && (left < right))
right--;
if(left != right)
{
v[left]=v[right];
left++;
}
while ((v[left] <= pivot) && (left<right))
left++;
if(left!=right)
{
v[right]=v[left];
right--;
}
}
v[left]=pivot;
pivot=left;
left=lTmp;
right=rTmp;
if(left<pivot)
q_sort(v, left, pivot-1);
if(right>pivot)
q_sort(v, pivot+1, right);
}
/*
* Función que recorre el vector sin ordenar en busca
* del valor deseado.
* Devuelve la posición o -1 si no existe el valor
* en el vector.
*/
int b_secuencial(int v[], int tam, int buscar){
int i;
for(i=0; i<tam; i++)
if(v[i]==buscar)
return i;
return -1;
}
/*
* Función que busca un elemento en una lista ordenada
* partiendo la lista en dos, descartando la mitad de la lista
* donde no se puede encontrar el valor buscado, y así
* sucesivamente.
* Devuelve la posición del valor en el vector o -1 si
* no se encontró el valor.
*/
int b_binaria(int v[], int tam, int buscar){
int ini=0;
int fin=tam;
int centro;
while (ini<=fin){
centro=((ini+fin)/2);
if (v[centro] == buscar)
return centro;
if (buscar<v[centro])
fin=centro-1;
else
ini=centro+1;
}
return -1;
}
/*
* Función que busca un intervalo adecuado para el índice
*/
int index_creator(int tam){
int i;
printf("El tamaño del arreglo es %i", tam);
if (tam<=1000){
for(i=5; i<=30; i++)
if(tam%i==0 && tam!=i)
return i;
for (i=5; i>=3; i--)
if(tam%i==0 && tam!=i)
return i;
return -1;
}
else if(tam>1000 && tam < 99999){
for(i=20; i<99; i++)
if(tam%i==0 && tam!=i)
return i;
return -1;
}
}
/* Función que realiza una búsqueda secuencial indexada
* Primero busca un intervalo para el indice, luego
* general el ínidce.
* Una vez teniendo el ínidice realiza una búsqueda
* en secuencial en el ínidce, para posteriormente encontrar
* las claves entre las cuales realizar otra búsqueda
* secuencial y asi encontrar la posición que se devuele.
* Si no existe el valor en el vector se devuelve -1.
* El vector tiene que estar ordenado.
*/
int b_secindexada(int v[], int tam, int buscar){
int intervalo;
int i;
int j=0;
int tam_ind=0;
index indice[MAX_IND];
printf("\nGenerando el indice:\n");
intervalo=index_creator(tam);
if(intervalo==-1){
printf("\nNo se encontró un intervalo adecuado... abortando...\n");
return -1;
}
printf("\nEl intervalo es: %d\n", intervalo);
for(i=0; i<=tam; i=i+intervalo){
indice[tam_ind].pos=i;
indice[tam_ind].valor=v[i];
tam_ind++;
}
for(i=0; i<tam_ind; i++)
printf("\n %d, %d", indice[i].pos,indice[i].valor);
printf("\n");
for(i=0; i<tam_ind; i++)
{
printf("La posición es: %d\n",indice[i].pos);
if(indice[i].valor>=buscar)
{
printf("Estamos buscando %d entre %d a %d \n", buscar, indice[i].pos-intervalo, indice[i].pos);
for(j=(indice[i].pos-intervalo); j<=indice[i].pos; j++)
{
printf("Estamos buscando %d en %d:%d \n", buscar, j, v[j]);
if(v[j]==buscar)
{
return j;
}
}
}
}
return -1;
}
Etiquetas:
Algoritmos,
binaria,
búsqueda,
secuencial,
secuencial indexado
Suscribirse a:
Entradas (Atom)