tag:blogger.com,1999:blog-67688054195434064922024-02-18T22:45:35.250-08:00h1n1-AlBlog con información sobre programación, redes, seguridad, y otros temas del mundo de la computación. Se postean poroblemas en C, C++, Python, SQL, Vulnerabilidades, Seguridad, Redes, etc...h1n1-alhttp://www.blogger.com/profile/08368552257448425260noreply@blogger.comBlogger31125tag:blogger.com,1999:blog-6768805419543406492.post-84856015912255864102015-09-12T10:00:00.003-07:002015-09-12T10:00:57.824-07:00Nueva etapa.Una vez concluidos mis estudios en de licenciatura en la UNAM, he decidido entrar a la Maestría en la Universidad Autónoma de México. Será de Ciencias de la Computación, así que espero compartir con todos ustedes las experiencias y los nuevos apredizajes que tendré. Sobre el tema de la tesis que iré trabajando aún no estoy seguro si deba seguir sobre mi línea de algoritmia de búsqueda de caminos en gráficos o un sistema de NLP sobre idioma wixarika. h1n1-alhttp://www.blogger.com/profile/08368552257448425260noreply@blogger.com0tag:blogger.com,1999:blog-6768805419543406492.post-15522808603278202802015-04-22T19:13:00.001-07:002015-04-22T19:15:54.983-07:00Mi implementación del algoritmo Fringe Search para la búsqueda de caminos que tienden a ser óptimos en gráficos de maya.<div class="separator" style="clear: both; text-align: justify;">
El algoritmo Fringe Search propuesto en <a href="http://webdocs.cs.ualberta.ca/~holte/Publications/fringe.pdf">http://webdocs.cs.ualberta.ca/~holte/Publications/fringe.pdf</a> por Yngvi Bjornsson Markus Enzenberger, Robert C. Holte y Jonathan Schaeffer produce caminos que tienden a ser óptimos, pero mejoran la velocidad de ejecución de A* de una manera significativa. Pongo a disposición de todos el código fuente usado en mi tesis titulada: "El Algoritmo Fringe Search como solución superior a A* en la búsqueda de caminos sobre gráficos de malla" presentada en la UNAM, en el cual implemento este algoritmo en lenguaje C. Espero sea útil. </div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgdNCm-5S9vvVCCCJudk01DR_8EgKmspvpytKcd9G_adGcDVOX_p7Lik80gT-h5dPJkOkeF39xl-K1GepzRScXMdodm_yTwubCc7VmM2tzeCOyGdqw3ZrNOR-28MoNWN0n1SWzWnUsqhg8K/s1600/output.bmp" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgdNCm-5S9vvVCCCJudk01DR_8EgKmspvpytKcd9G_adGcDVOX_p7Lik80gT-h5dPJkOkeF39xl-K1GepzRScXMdodm_yTwubCc7VmM2tzeCOyGdqw3ZrNOR-28MoNWN0n1SWzWnUsqhg8K/s1600/output.bmp" height="320" width="320" /></a></div>
<br />
El código puede ser descargado o clonado desde: <a href="https://github.com/pywirrarika/fringesearch">https://github.com/pywirrarika/fringesearch</a>h1n1-alhttp://www.blogger.com/profile/08368552257448425260noreply@blogger.com0tag:blogger.com,1999:blog-6768805419543406492.post-3899941137550779542015-04-08T00:25:00.000-07:002015-09-12T10:01:17.527-07:00Mi implementación del algoritmo A* para gráficos de malla.Dejo a disposición de todo aquel interesado mi repositorio de GitHub donde se puede encontrar el código de mi implementación del algoritmo A* escrito en C. He usado una skiplist para la lista cerrada junto con arreglos de punteros para un acceso rápido y un buen nivel de optimización para mejorar el tiempo de ejecución. El programa lee un archivo <br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiC36tB91w351qJTvcv_1UgHGky3WeShnTnJCitNsAXlkxRPnNZwORLWb4T6QN6lo7Q67Hyw-a-8NTHsg_5O1ZZODeDINQhGLdEqyUTAfQk_5O7NgKzvvXjYsFSDv2kiLhEdpYxLUkldI6U/s1600/output.bmp" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiC36tB91w351qJTvcv_1UgHGky3WeShnTnJCitNsAXlkxRPnNZwORLWb4T6QN6lo7Q67Hyw-a-8NTHsg_5O1ZZODeDINQhGLdEqyUTAfQk_5O7NgKzvvXjYsFSDv2kiLhEdpYxLUkldI6U/s1600/output.bmp" width="320" /></a></div>
BMP del cual cargará las partes negras como obstáculos o como nodos intransitables. Como salida genera un archivo BMP nuevo donde se representa el área en la cual se ha buscado y el mejor camino del nodo de inicio al nodo de destino.<br />
<br />
Para obtener el código simplemente será necesario introducir el siguiente comando en la terminal:<br />
<br />
git clone <a href="https://github.com/pywirrarika/astarmesh">https://github.com/pywirrarika/astarmesh</a><br />
<br />
O descargarlo directamente de la página: <a href="https://github.com/pywirrarika/astarmesh">https://github.com/pywirrarika/astarmesh</a><br />
<br />
<br />h1n1-alhttp://www.blogger.com/profile/08368552257448425260noreply@blogger.com0tag:blogger.com,1999:blog-6768805419543406492.post-25788029430829992702014-12-30T04:11:00.000-08:002014-12-30T04:11:35.841-08:00Python: Convertir todos las las imágenes de una carpeta a otro tamaño. Pequeño script que convierte todas las imágenes de una cierta carpeta a un nuevo tamaño que se especifica en los argumentos de la línea de comandos.
<div style="background-color: white; border-style: dashed; border-width: thin;">
<pre># -*- coding:utf-8 -*-
# Author: Jesús Mager
# Licence: GPL v.3
import os, sys
import Image
if len(sys.argv) != 3:
print "Syntaxis: imgsize.py xsize ysize"
exit()
else:
try:
x = int(sys.argv[1])
y = int(sys.argv[2])
except ValueError:
print "The arguments must be integers."
exit()
size = x,y
def makethumb(inf):
out = inf + ".new"
if inf.split(".")[-1]=="new":
print "%s: Skiped" % inf
return 0
if inf is not out:
try:
im = Image.open(inf)
im.thumbnail(size, Image.ANTIALIAS)
im.save(out, "JPEG")
print "%s: Done" % inf
except IOError:
print "Error opening %s" % inf
if __name__ == "__main__":
files = [ f for f in os.listdir(".") if os.path.isfile(os.path.join(".",f)) ]
for f in files:
makethumb(f)
</pre>
</div>
h1n1-alhttp://www.blogger.com/profile/08368552257448425260noreply@blogger.com0tag:blogger.com,1999:blog-6768805419543406492.post-19111517245606155132014-02-06T09:43:00.000-08:002014-02-06T09:43:06.365-08:00Adecuar la navegación hjkl de VIM a una posición más cómoda.Sólo quiero compartiles una configuración muy simple en VIM que podría ayudar a varios haciendo más fácil la navegación. En vez de usar el desnaturalizado HJKL que viene por defecto en VIM para subir, bajar, e ir a izquierda y derecha, prefiero usar JKLÑ en mi teclado o para los teclados ingleses JKL;.<br />
He aquí el código que hay que agregar a .vimrc en nuestro directorio $HOME.<br />
<br />
<blockquote class="tr_bq">
set nocompatible<br />
noremap ñ l<br />
noremap l k<br />
noremap k j<br />
noremap j h</blockquote>
De esta manera podremos usar ñ para ir a la izquierda, j para ir a la derecha, k para bajar y l para subir. h1n1-alhttp://www.blogger.com/profile/08368552257448425260noreply@blogger.com0tag:blogger.com,1999:blog-6768805419543406492.post-51706315673666512252014-02-06T09:40:00.003-08:002014-02-06T09:42:27.704-08:00Contar líneas de código C¿Quieres saber cuántas líneas de código en C que has escrito en tus archivos de código fuente en una carpeta dada? ¿Además quieres contar sólo las líneas de código sin contar los comentarios y las líneas en blanco? Aquí un pequeño comando en nuestra terminal GNU/Linux o en cualquier sistema *nix.<br />
<blockquote class="tr_bq">
<span style="font-family: Courier New, Courier, monospace;">cat * | sed '/^\s*#/d;/^\s*$/d' | wc -l</span></blockquote>
Obviamente se puede ajustar a todas las necesidades. h1n1-alhttp://www.blogger.com/profile/08368552257448425260noreply@blogger.com0tag:blogger.com,1999:blog-6768805419543406492.post-67489339527386289492014-02-05T10:38:00.002-08:002014-02-06T09:42:47.413-08:00¿Por qué sigue usándose Turbo C/C++ en las escuelas?Turbo C es un compilador creado por Borland en 1987 para el desarrollo en MS-DOS(aunque también hubo versiones para Atari y OS/2) el cual fue reemplazado por Turbo C++ en 1990.La última versión de Turbo C++, la 3.01, en 1992, con lo que posteriormente se concentraría la empresa en su producto Borland C++ y C++ Builder.<br />
<div>
A pesar de ser un compilador histórico, donde muchos de nosotros dimos nuestros primeros pasos en la programación en C y C++, se debe reconocer que nuestro compilador de 16bits ha pasado a la historia y su lugar es estar en una vitrina en el museo de la informática. </div>
<div>
Sin embargo, un gran número de escuelas, tienen como su compilador de cabezera ese viejo conocido: ¡Turbo C! No es extraño encontrarnos hoy en día, en diversos foros de programación código que usa las viejas bibliotecas.</div>
<blockquote class="tr_bq">
¿Me pueden ayudar con este código? ... y se lee: <i>gotoxy(23,5); clrscr();</i> etc. </blockquote>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://img269.imageshack.us/img269/1070/tcbj7.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://img269.imageshack.us/img269/1070/tcbj7.png" height="270" width="400" /></a></div>
<br />
Parecería ser que el tiempo no ha cambiado en nada, que MS-DOS sigue siendo un sistema operativo, y no una terminal emulada por los sistemas windows modernos. A este ritmo no nos sorprendería ver código <span style="background-color: white;">que invoque resoluciones de 320x200 con 256 colores indexados.</span><br />
<span style="background-color: white;"><br /></span>
<span style="background-color: white;"><i> void SetVideo (void)<br /> {<br /> asm{<br /> mov ah,0<br /> mov al,13h<br /> int 10h<br /> }<br /> }</i></span><br />
<span style="background-color: white;"><br /></span>
<span style="background-color: white;">A pesar de que tenemos buenos recuerdos, y extrañamos los hacks del Modo 13h y Modo X, y otras curiosidades, es una verdadera barbaridad que a los alumnos no se enseñe a escribir código en compiladores modernos. Pareciera ser que los maestros, sin ganas de desarrollar nuevos retos de programación para sus alumnos, intentan reproducir una y otra vez los mismos ejercicios obsoletos.</span><br />
<span style="background-color: white;">El problema no solo es que la lógica no se puede reducir a producir cuadros de texto con colores en una consola de los años 90's sobre MS-DOS, sino que no dejan una verdadera experiencia de como se realiza la programación en C y C++ para sistemas modernos (lo cual no necesariamente quiere decir que se requiera una GUI.)</span><br />
<span style="background-color: white;">Recomiendo, para todos aquellos a quienes aún les estén enseñando con este compilador obsoleto, guardarlo en una carpeta llamada muso y descargar la versión del compilador GCC u otro compilador de nueva generación (como VC++ en Windowos) para su sistema operativo. Si requiere alguien de programación gráfica para ver los resultados de su lógica palpables en la pantalla puede usar SDL, que es una excelente biblioteca gráfica multiplataforma. </span><br />
<span style="background-color: white;"><br /></span>
<br />
<ul>
<li>Para Windows recomiendo ampliamente usar la distribución más actual de MingW, en concreto esta: <a href="http://nuwen.net/mingw.html">http://nuwen.net/mingw.html</a> (Evite usar Dev-C++ que su desarrollo ha sido parado, y si requiere un entorno gráfico use <a href="http://wxdsgn.sourceforge.net/">http://wxdsgn.sourceforge.net/</a> a pesar de también ya llevar 2 años sin actividad.)</li>
<li>En GNU/Linux: Instalar el compilador GCC desde su repositorio. ej. en debian like: sudo apt-get install build-essential</li>
<li>En Mac OS X: Instale sus herramientas de desarrollador que incluirán la versión más adecuada de GCC. </li>
</ul>
h1n1-alhttp://www.blogger.com/profile/08368552257448425260noreply@blogger.com0tag:blogger.com,1999:blog-6768805419543406492.post-67796484701943888732011-11-25T13:34:00.000-08:002011-11-25T13:42:03.164-08:00Tux4Kids: Mentor en Google Code-In<a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://code.google.com/intl/es-MX/opensource/gci/2010-11/images/gcilogo.jpg"><img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 300px; height: 200px;" src="http://code.google.com/intl/es-MX/opensource/gci/2010-11/images/gcilogo.jpg" border="0" alt="" /></a><br />Nuevamente Tux4Kids ha sido aceptado en el Google Code-In que es un concurso para jóvenes menores a 18 años, en el cual pueden contribuir de diversas formas a proyectos se software libre y abierto. Desde imágenes, investigaciones, hasta código, los jóvenes pueden incorporar sus esfuerzos a diversos proyectos que todos conocemos. Este año participan, además de Tux4Kids, FreeBSD, GNOME, OpenSUSE, Perl, VideoLAN, PySoy, KDE, entro otros. <br />Los premios por participante comienzan al realizar una contribución, ganando 25 dólares y una playera. Pero los premios aumentan hasta 500 dolares y un viaje todo pagado a GooglePlex en Mountain View California. <br />Para cualquier ayuda o comentario, estaré de asesor para el Proyecto Tux4Kids y pueden ponerse en contacto por este blog o por la lista oficial del proyecto. Espero se animen.h1n1-alhttp://www.blogger.com/profile/08368552257448425260noreply@blogger.com0tag:blogger.com,1999:blog-6768805419543406492.post-10975165351559420162011-11-21T00:19:00.000-08:002011-11-21T00:46:23.818-08:00Flask: Un mundo poderoso y minimalista para la programación Web<a href="http://flask.pocoo.org/"><img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;width: 419px; height: 164px;" src="http://flask.pocoo.org/docs/_images/logo-full2.png" border="0" alt="" /></a><br />He descubierto el mundo de los "microframework"s en Python. Estoy tratando de escribir un nuevo proyecto web, con la intención de hacerlo a mi medida. La herramienta tradicional: Django. que suelo utilizar me ha comenzado a poner piedras en el camino al querer hacer ciertas cosas que no están dentro del estándar. <br /><br />Al investigar, me tomé la molestia de experimentar con varias alternativas. Entre ellas TG, pyramid, cherrypy, web2py, etc... Pero me encantó la elegancia de Flask. Ya con anterioridad había llegado a la página, pero no me había tomado la molestia de revisar su documentación. Resulta ser una de las aplicaciones mejor documentadas, minimalistas, pero a la vez flexibles para todo los que necesito. <br /><br />En mi proyecto utilizaré Jinja2 (que es por cierto mi sistema de Templates preferido) y que viene integrado desde la caja con Flask, junto con el ORM SQLAlchemy, que tiene una exención hecha para Flask. Les presento un rápido extracto de código para que se puedan dar una idea de lo confortable que es trabajar con este microframework.<br /><br /><code class="syntax"><br /><span class="kn">from</span> <span class="nn">flask</span> <span class="kn">import</span> <span class="n">Flask</span><br /><span class="n">app</span> <span class="o">=</span> <span class="n">Flask</span><span class="p">(</span><span class="n">__name__</span><span class="p">)</span><br /><br /><span class="nd">@app.route</span><span class="p">(</span><span class="s">'/'</span><span class="p">)</span><br /><span class="k">def</span> <span class="nf">index</span><span class="p">():</span><br /> <span class="k">return</span> <span class="s">'Index Page'</span><br /><br /><span class="nd">@app.route</span><span class="p">(</span><span class="s">'/hello'</span><span class="p">)</span><br /><span class="k">def</span> <span class="nf">hello</span><span class="p">():</span><br /> <span class="k">return</span> <span class="s">'Hello World'</span><br /><br /><span class="k">if</span> <span class="n">__name__</span> <span class="o">==</span> <span class="s">'__main__'</span><span class="p">:</span><br /> <span class="n">app</span><span class="o">.</span><span class="n">run</span><span class="p">()</span><br /></code><br /><br />Para más información pueden visitar la página de Flask en <a href="http://flask.pocoo.org/">http://flask.pocoo.org/</a> Estaré informando de las diversas dificultades, que seguramente enfrentaré, al desarrollar mi proyecto.h1n1-alhttp://www.blogger.com/profile/08368552257448425260noreply@blogger.com0tag:blogger.com,1999:blog-6768805419543406492.post-40656399802656876062011-09-03T22:16:00.000-07:002011-11-21T00:35:12.927-08:00Usuarios independientes en el Admin de DjangoMuchas veces los programadores de Django quieren usar la poderosa herramienta del Admin para permitir funcionar como un centro de administración para los diversos usuarios que se registran en un sitio. Pero al generar usuarios de staff con acceso al admin, estos pueden editar cualquier campo, a pesar de no ser el suyo. Para evitar esto, es posible configurar nuestro archivo admin.py para sobre heredar el administrador y sobre escribir dos funciones. Veamos el código:<br /><code class="syntax"><br /><br /><span class="kn">from</span> <span class="nn">django.contrib</span> <span class="kn">import</span> <span class="n">admin</span><br /><span class="kn">from</span> <span class="nn">myproject.pages.models</span> <span class="kn">import</span> <span class="n">pagesPage</span><br /><br /><br /><br /><span class="k">class</span> <span class="nc">pagesPageAdmin</span><span class="p">(</span><span class="n">admin</span><span class="o">.</span><span class="n">ModelAdmin</span><span class="p">):</span><br /> <span class="k">def</span> <span class="nf">save_model</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">request</span><span class="p">,</span> <span class="n">obj</span><span class="p">,</span> <span class="n">form</span><span class="p">,</span> <span class="n">change</span><span class="p">):</span><br /> <span class="k">if</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">obj</span><span class="p">,</span> <span class="s">'added_by'</span><span class="p">,</span> <span class="bp">None</span><span class="p">)</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span><br /> <span class="n">obj</span><span class="o">.</span><span class="n">added_by</span> <span class="o">=</span> <span class="n">request</span><span class="o">.</span><span class="n">user</span><br /> <span class="n">obj</span><span class="o">.</span><span class="n">last_modified_by</span> <span class="o">=</span> <span class="n">request</span><span class="o">.</span><span class="n">user</span><br /> <span class="n">obj</span><span class="o">.</span><span class="n">save</span><span class="p">()</span><br /><br /> <span class="k">def</span> <span class="nf">queryset</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">request</span><span class="p">):</span><br /> <span class="n">qs</span> <span class="o">=</span> <span class="nb">super</span><span class="p">(</span><span class="n">pagesPageAdmin</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">queryset</span><span class="p">(</span><span class="n">request</span><span class="p">)</span><br /><br /> <span class="c">#If super-user, shows all rows</span><br /> <span class="k">if</span> <span class="n">request</span><span class="o">.</span><span class="n">user</span><span class="o">.</span><span class="n">is_superuser</span><span class="p">:</span><br /> <span class="k">return</span> <span class="n">qs</span><br /> <span class="k">return</span> <span class="n">qs</span><span class="o">.</span><span class="n">filter</span><span class="p">(</span><span class="n">added_by</span><span class="o">=</span><span class="n">request</span><span class="o">.</span><span class="n">user</span><span class="p">)</span><br /><br /><br /><span class="n">admin</span><span class="o">.</span><span class="n">site</span><span class="o">.</span><span class="n">register</span><span class="p">(</span><span class="n">pagesPage</span><span class="p">,</span> <span class="n">pagesPageAdmin</span><span class="p">)</span><br /></code><br />Tomando en cuenta que hemos declarado en models.py los necesarios campos, como lo es added_by como foreign key a User, de Auth. Espero ayude!h1n1-alhttp://www.blogger.com/profile/08368552257448425260noreply@blogger.com0tag:blogger.com,1999:blog-6768805419543406492.post-63890270166528184912011-07-04T14:05:00.000-07:002011-07-04T14:15:16.172-07:00Autocompletado de Django en VIMPara poder usar el autocompletado de VIM en projectos Django es necearios tener estas lineas en nuestro archivo .vimrc<br /><br /><div style="border-style: dashed; border-width: thin;background-color:#FFFFFF"><pre><br />syntax on<br /><br />autocmd FileType python set omnifunc=pythoncomplete#Complete<br />autocmd FileType javascript set omnifunc=javascriptcomplete#CompleteJS<br />autocmd FileType html set omnifunc=htmlcomplete#CompleteTags<br />autocmd FileType css set omnifunc=csscomplete#CompleteCSS<br /></pre></div><br /><br />Y con esto listo, copiar este script que podemos colocar en alguna dirección dentro del path como lo es /usr/local/bin o crear un directorio para el path local en el home.<br /><br /><div style="border-style: dashed; border-width: thin;background-color:#FFFFFF"><pre><br />#!/bin/bash<br /><br /># Name: djvim<br /># Description: Script to automate the setup of the<br /># enviroment vars to use omicomplete in vim<br /># for Django projects. <br /># Usage: djvim filename<br />#<br /># Author: Jesús Manuel Mager Hois<br /># Copyright: GPL v3 or later<br /><br /><br />#Set the global vars to the Django project<br />function startvim(){<br /> local arr=$(echo $1 | tr "/" "\n")<br /> for x in $arr<br /> do<br /> #echo "[$x]"<br /> local PROJECT=$x<br /> done<br /> echo $PROJECT<br /> cd ..<br /> local DIR=`pwd`<br /> export PYTHONPATH=$PYTHONPATH:$DIR<br /> export DJANGO_SETTINGS_MODULE=$PROJECT.settings <br /> vim $ARGS<br />}<br /><br />#Iter the directory tree to find setting.py<br />function finddjbase(){<br /> cd ..<br /> local DIRF=`pwd`<br /> local FILEF=`echo "$DIRF/settings.py"`<br /> if [ $DIRF == '/' ]<br /> then<br /> echo "Couldn't find the Django base directory"<br /> exit<br /> fi<br /> echo "Trying in $DIRF"<br /> if ( ! fileexists $FILEF )<br /> then<br /> finddjbase<br /> else<br /> startvim "$DIRF"<br /> exit<br /> fi<br />}<br /><br />#Check if we can find setting.py<br />function fileexists(){<br /> local f="$1"<br /> if [ ! -f $f ]<br /> then<br /> echo "This is not the Django base directory... trying"<br /> return 1<br /> else<br /> echo "settings.py FOUND at $1"<br /> return 0<br /> fi<br />}<br /><br />#Main block<br /><br />ARGS=$@<br />DIRN=`pwd`<br />FILEN=`echo "$DIRN/settings.py"`<br /><br />if ( ! fileexists $FILEN )<br />then<br /> finddjbase<br />else<br /> startvim $DIRN<br /> exit<br />fi<br /><br /></pre></div><br /><br />Y listo, podemos abrir nuestro archivo con fjvim nombredelarchivio.pyh1n1-alhttp://www.blogger.com/profile/08368552257448425260noreply@blogger.com2tag:blogger.com,1999:blog-6768805419543406492.post-65573033235587014282011-06-29T22:10:00.000-07:002011-06-29T22:47:16.226-07:00Primera impresión del iPad2 de un programador de Software LibreLa semana pasada mi madre ha decidido comprarse un iPad2 por razones de movilidad. El simpático computador pesa alrededor de 600 gramos, y goza de una muy buena fama. Escogió el modelo con opción 3G y con 32 GB en disco duro. Por mi parte, no encontré ningún motivo para evitar esta compra para un usuario con modestas pretensiones. ¿Cuáles son estas pretensiones?<br /><ul><li>Escribir en un procesador de textos decente.</li><li>Proyectar películas desde YouTube, o presentaciones desde archivos PowerPoint.</li></ul>La propaganda oficial argumenta una gran variedad software disponibles desde AppStore, las cuales es posible adquirir ya sea comprando o descargando gratuitamente. Desde que salió el iPhone, desconfié de esta plataforma cerrada, pero no había tenido la posibilidad de probarla en carne propia.<br />Al ayudar a mi madre en la configuración de su iPad para que pudiera cumplir sus expectativas me encontré con un verdadero calvario que comprobó mis reservas iniciales. Enumeraré lo peor que pude encontrar:<br /><ul><li>De las aplicaciones disponibles desde el AppStore son muy contadas las que ofrecen verdadera calidad, incluso dentro de las aplicaciones con costo.</li><li>No pude encontrar un Procesador de Textos decente. Un trabajo de investigación necesariamente requiere de citas y pies de página. Ni Pages(creado por Apple y la aplicación más avanzada en este sector) pudo ofrecer esta característica tan elemental. Las demás aplicaciones ofimáticas ofrecían aún menos capacidades.</li><li>La conectividad es pésima. El dispositivo se encuentra tan cerrado que no puede acceder libremente una red e imprimir en algún servidor de impresiones. </li><li>Si bien Pages es el procesador de texto más avanzado, su productor no permite conectarse a servicios tan importantes como Dropbox y sólo se limita a sus propios servicios (iDisk y iCloud).</li></ul>Al final mi madre terminó usando DocsToGo para estar constantemente interactuando con su computadora vía Dropbox, aún a costa de características de Pages. En lo particular extrañé compilar las aplicaciones de mi preferencia, usar Python y en general gozar de una verdadera computadora.<br />El harware tiene buena pinta, el problema es lo cerrado del sistema. Yo no compraría uno de estos equipos y no los recomiendo, pero si alguien quiere gastar más de diez mil pesos para escuchar música, ver alguna película y jugar, adelante, quizá esta curiosidad es para ustedes.h1n1-alhttp://www.blogger.com/profile/08368552257448425260noreply@blogger.com0tag:blogger.com,1999:blog-6768805419543406492.post-2743195528324172812011-06-18T23:54:00.000-07:002011-06-19T00:02:53.178-07:00Hacer que autoconf detecte LUA 5.1He tenido algunos problemas para poder hacer detectar las librerías de LUA en autotools. He logrado realizar esto con algunas pruebas de nombres y así lograr incluir las bibliotecas y las cabeceras. AUX_LUA.m4 no logra detectar LUA en Debian, pero no se si también tiene dificultades en otras distribuciones. Al parecer en Ubuntu también existe un problema semejante. <br /><br />Aquí el código básico del configure.ac que busca LUA 5.1.<br /><br /><div style="border-style: dashed; border-width: thin;background-color:#FFFFFF"><pre><br /><br />AC_INIT([luaexp], [1.0], algo@correo.com)<br /><br />AC_PREREQ(2.61)<br />AC_CANONICAL_HOST<br />AC_CANONICAL_BUILD<br />AC_CANONICAL_TARGET<br /><br />AM_INIT_AUTOMAKE([foreign -Wall -Werror])<br />AC_PROG_CC<br /><br /><span style="font-weight:bold;">dnl Check for LibLua: --------------------------------------------------------<br /><br />AC_MSG_CHECKING([for Lua package name])<br />PKG_CHECK_EXISTS([lua5.1], [LUA="lua5.1"],<br /> [PKG_CHECK_EXISTS([lua-5.1], [LUA="lua-5.1"], [LUA="lua"])])<br />AC_MSG_RESULT([$LUA])<br /><br />PKG_CHECK_MODULES([LUA],<br /> [$LUA],<br /> ,<br /> [ [echo "$LUA not found via pkg_config, checking AC_CHECK_LIB:"]<br /> AC_CHECK_LIB([$LUA],<br /> [lua_newstate],<br /> ,<br /> [AC_MSG_ERROR([LUA no found! http://www.lua.org/download.html])]<br /> )<br /> [echo "$LUA successfully located"]<br /> ] <br />)<br /><br />AC_DEFINE([HAVE_LUA],[1],[Define to 1 if you have the `LUA` library])<br /><br /><br />CFLAGS="$CFLAGS $LUA_CFLAGS"<br />LIBS="$LIBS $LUA_LIBS"</span><br /><br />AC_CONFIG_HEADERS([config.h])<br />AC_CONFIG_FILES([Makefile src/Makefile])<br /><br />AC_OUTPUT<br /></pre></div><br /><br />Espero esto ayude a cualquier otra persona que necesite incluir LUA en su proyecto. En negrita resalto el código específico para la detección.h1n1-alhttp://www.blogger.com/profile/08368552257448425260noreply@blogger.com0tag:blogger.com,1999:blog-6768805419543406492.post-11181262673487261462010-11-26T09:04:00.000-08:002010-11-26T09:09:03.006-08:00Google Code-In en acción!Muchos jovenes de menos de 18 años están participando en un verdadero maratón, resolviendo las tareas más variadas que les ponen en el mundo del software libre y abierto. El premio: $500 dólares y una invitación a google de los jóvenes más destacados. Tux4Kids, con todos sus proyectos también está participando, y los primeros resultados son muy halagadores.<br />En este momento me encuentro subiendo al repositorio un arquero que un joven creó para TuxHistory. también tuxMath ha tenido un avance muy importante; la reorganización de sus asteroides en niveles. <br />Inivito a todos lo interesados a darse una vuelta por www.google-melange.com para participar, o simplemente para observar el avance del concurso.h1n1-alhttp://www.blogger.com/profile/08368552257448425260noreply@blogger.com0tag:blogger.com,1999:blog-6768805419543406492.post-34658125576891978692010-08-12T23:01:00.000-07:002010-08-12T23:12:58.563-07:00El verano ha terminado: TuxHistory<a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiGNEn8jDTJ8aDicCNCS9sHPb801YEiE2GFL6ntJGrVwBx4cdlum-4TD-9b6gGpD0FyxY_u314emYOihenxnnUKqlAlRBSvne1AlY5a-cUEDt4Rf9lU4J8kfvGL5T5n4T9oV3_ltrFl_RlQ/s1600/tuxhistory.png"><img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiGNEn8jDTJ8aDicCNCS9sHPb801YEiE2GFL6ntJGrVwBx4cdlum-4TD-9b6gGpD0FyxY_u314emYOihenxnnUKqlAlRBSvne1AlY5a-cUEDt4Rf9lU4J8kfvGL5T5n4T9oV3_ltrFl_RlQ/s320/tuxhistory.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5504771046927612626" /></a><br /><br />Les muestro la primera versión de prueba, limitada, pero funcional como resultado del Google Summer of Code. Falta mucho camino por recorrer para volver a este juego en una opción real de entretenimiento, pero las bases han sido creadas. Lo veo después de mucho esfuerzo, y siento que falta aún tanto.h1n1-alhttp://www.blogger.com/profile/08368552257448425260noreply@blogger.com2tag:blogger.com,1999:blog-6768805419543406492.post-36353636539306680282010-08-07T00:01:00.000-07:002010-08-07T00:14:24.699-07:00Corrupción de memoria? La solución esEsto será una entrada corta. Programando en C uno no puede menos que pensar que en algún momento los punteros, allocs y por supuesto los arreglos no funcionarán como uno espera. Pero encontrar estos errores entre míles de líneas de código definitivamente no es algo agradabale, claro. sin la ayuda de buenas herramientas.<br />Programando Tuxhistory me encontré con una muy desagradable sorpresa, un fallo de segmentación que se daba en los lugares mas diversos. Parecería como si hubiera una sinfín de ellos esparcidos por tódo el código. El debugging simple no daba con el responsable, gdb arrojaba lugares exactos donde sedaban, pero nada parecía estar mal, hasta que, gdb señaló al culpable a glib, malloc, etc... Esto no parecía ser más que una corrupción grave de memoria.<br />Por suerte logré encontrar el fabuloso VALGRIND! Wow! Una estupenda herramienta para poder identificar el verdadero orígen del problema y analizar las errores de escritura, lectura, corrupcion y leaks de memoria. Logré descubrir que el verdadero problema se encontraba en un arreglo que se debordaba con el paso del tiempo y corrompía la memoria aledaña. En verdad, si se encuentran en una situación como esta, les recomiendo ampliamente usar Valgrind <a href="http://valgrind.org/">http://valgrind.org/</a> y su excelente documentación: <a href="http://valgrind.org/docs/manual/manual.html">http://valgrind.org/docs/manual/manual.html</a> <br />Y lo mejor es LIBRE bajo GPL!h1n1-alhttp://www.blogger.com/profile/08368552257448425260noreply@blogger.com0tag:blogger.com,1999:blog-6768805419543406492.post-91886406923418478032010-07-22T21:41:00.000-07:002010-07-22T21:43:09.448-07:00Mi configuración VIMAgrego mi configuración de mi archivo .vimrc Lo hago para compartirlo con el todos y sobre todo para poderlo usar en otras computadoras.<br /><br /><div style="border-style: dashed; border-width: thin;background-color:#FFFFFF"><br /><pre>syntax on<br />set hls<br />set expandtab<br />set textwidth=0<br />set tabstop=4<br />set softtabstop=4<br />set shiftwidth=4<br />set autoindent<br />set backspace=indent,eol,start<br />set incsearch<br />set ignorecase<br />set ruler<br />set wildmenu<br />set smarttab<br />set nu<br />set mouse=a<br /><br />filetype indent on<br />filetype on<br />filetype plugin on<br /><br />let g:pydiction_location = '/home/julio/.vim/after/ftplugin/pydiction/pydiction-1.2/complete-dict'<br /><br />autocmd FileType python set omnifunc=pythoncomplete#Complete<br />autocmd FileType javascript set omnifunc=javascriptcomplete#CompleteJS<br />autocmd FileType html set omnifunc=htmlcomplete#CompleteTags<br />autocmd FileType css set omnifunc=csscomplete#CompleteCSS<br />autocmd FileType xml set omnifunc=xmlcomplete#CompleteTags<br />autocmd FileType php set omnifunc=phpcomplete#CompletePHP<br />autocmd FileType c set omnifunc=ccomplete#Complete<br /><br />map <C-s>:setlocal spell spelllang=es_mx<CR><br />map <C-e>:setlocal spell spelllang=en_us<CR><br />map <C-q>:setlocal nospell<CR><br /></pre></div>h1n1-alhttp://www.blogger.com/profile/08368552257448425260noreply@blogger.com0tag:blogger.com,1999:blog-6768805419543406492.post-53887282710387935112010-07-14T18:29:00.000-07:002010-07-14T18:58:09.473-07:00Arreglos dinámicos multidimensionales en C<p>En muchas ocaciones no queremos crear un arreglo que se utilice sólo la menoria necesaria en tiempo de ejecución. Sin embargo no resulta tan claro crear este tipo de arreglos de forma dinámica. Peor aún, si creamos un arreglo dentro de una función y queremos revolver el valor de un arreglo estatico esto sería imposible, ya que como es una variable local de la función se elimina antes de poder pasar el valor. Por lo tanto incluyo este pequeño código para poder realizar estas funciones.</p><br /><div style="border-style: dashed; border-width: thin;background-color:#FFFFFF"><pre><br />#include <stdlib.h><br />#define FREE(p) do { free(p); (p) = NULL; } while(0)<br /><br />int **alloc_array(int, int);<br />void free_array(int **, int);<br /><br />int **alloc_array(int x_size, int y_size)<br />{<br /> int i;<br /> int **array;<br /> array = malloc(x_size * sizeof(int *));<br /> if(array == NULL)<br /> {<br /> return NULL;<br /> }<br /> for(i = 0; i < x_size; i++)<br /> {<br /> array[i] = malloc(y_size * sizeof(int));<br /> if(array[i] == NULL)<br /> {<br /> return NULL;<br /> }<br /> }<br /> return array;<br />}<br /><br />void free_array(int **array, int x_size)<br />{<br /> int i;<br /> for(i = 0; i < x_size; i++)<br /> FREE(array[i]);<br /> FREE(array);<br />}<br /></pre></div><br /><p><br />Como vemos, tambien es necesario liberar la memoria que hemos reservado para nuestra memoria. Es necesario hacer esto para cada una de las variables y a su vez referenciar todos los punteros a NULL.<br /></p>h1n1-alhttp://www.blogger.com/profile/08368552257448425260noreply@blogger.com0tag:blogger.com,1999:blog-6768805419543406492.post-2812585827387910132010-06-11T11:00:00.000-07:002010-07-14T19:00:36.745-07:00Grep RecursivoAgrego una rápida entrada, que es mas bien para provecho personal :P El comando grep en UNIX nos permite encontrar texto en archivos, una herramienta muy util a la hora de programar. Sin embargo esta magnífica herramienta no tiene una forma de iterar por los directorios hijos. Por lo tanto agrego una combinación entre find y grep que nos permite esto. Sientanse libres de jugar con el comando:<br /><br /><div style="border-style: dashed; border-width: thin;background-color:#FFFFFF"><pre>find . -type f -print | xargs grep "lo que se desea buscar" <br /></pre></div>h1n1-alhttp://www.blogger.com/profile/08368552257448425260noreply@blogger.com0tag:blogger.com,1999:blog-6768805419543406492.post-87770093730260101082010-04-27T10:30:00.000-07:002010-04-27T10:37:25.681-07:00Aceptado otra vez en Google Summer of CodeCon 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.<br />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 :).<br />En este blog iré publicando los avances que trendré. Mientras tanto espero terminar el semestre lo antes posible y así dedicarme de lleno.<br />Saludos!h1n1-alhttp://www.blogger.com/profile/08368552257448425260noreply@blogger.com0tag:blogger.com,1999:blog-6768805419543406492.post-89195305404429398232010-04-16T08:29:00.000-07:002010-04-16T08:51:31.725-07:00Google 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 <span class="tit_verde_peque">Don Dodge (ex empleado de Microsoft y vicepresidente de Napster jaja lol ), </span><span class="tit_verde_peque">Ossama Alami</span><span class="txt">, </span><span class="tit_verde_peque">Chris Messina</span><span class="txt">, </span><span class="tit_verde_peque">Pamela Fox (se ve que es la pura fiesta), </span><span class="tit_verde_peque">Chris Ramsdale</span><span class="txt"> y </span><span class="tit_verde_peque">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.<br />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.<br />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.<br />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.<br />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.<br />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.<br />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.<br />Más info: http://www.googledevfest.com.mx/<br /></span><span class="txt"></span><span class="tit_verde_peque"></span><span class="tit_verde_peque"></span><span class="txt"></span>h1n1-alhttp://www.blogger.com/profile/08368552257448425260noreply@blogger.com0tag:blogger.com,1999:blog-6768805419543406492.post-8852778795226069352010-02-18T14:11:00.000-08:002010-02-18T14:27:04.302-08:00Ortografía en VIMVIM 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:<br /><br /><span style="font-weight: bold;">:setlocal spell spelllang=es_MX</span><br /><br />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).<br /><br />Ahora que ya sirve el spell checker podemos utilizar una serie de comandos:<br /><br /><ul><li><span style="font-weight: bold;">]s</span> Siguiente error ortográfico.</li><li><span style="font-weight: bold;">[s</span> Errór ortográfico anterior.</li><li><span style="font-weight: bold;">zg</span> Aprender palabra.</li><li><span style="font-weight: bold;">zw</span> marcar palabra como error.</li><li><span style="font-weight: bold;">zug</span> y <span style="font-weight: bold;">zuw</span> Deshace los comandos respectivos.<br /></li><li><span style="font-weight: bold;">z=</span> Muestra una lista de tamaño completo de palabras sugeridas</li><li><span style="font-weight: bold;">Ctrl-X s</span> Muestra una lista de autocompletado con las palabra sugerdias. Esto en modo incerción.<br /></li></ul>Para quitar el corrector simplemente use:<br /><br /><span style="font-weight: bold;">:setlocal nospell</span>h1n1-alhttp://www.blogger.com/profile/08368552257448425260noreply@blogger.com0tag:blogger.com,1999:blog-6768805419543406492.post-68609275526209869612010-01-28T00:09:00.000-08:002010-01-28T00:39:45.718-08:00Tux4Kids Cambia su repositorio de Subversion a GitEl 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:<br /><br /><span style="font-weight: bold;">git init </span> crea un repositorio.<br /><span style="font-weight:bold;">git clone </span> clona un repositorio remoto.<br /><span style="font-weight:bold;">git add </span> Añade un archivo o directorio al repo. (Si lo agrega de forma recursiva)<br /><span style="font-weight:bold;">git rm </span> <span style="font-style:italic;">-f</span> Elimina un archivo o directorio del arbol. La opción -f fuerza la elimiación de archivos locales.<br /><span style="font-weight:bold;">git mv </span> <span style="font-style:italic;">-f</span> Mueve un directorio o archivo (Misma opción -f)<br /><span style="font-weight:bold;">git checkout</span> <span style="font-style:italic;">[rev] file -f </span> Restaura archivo del branch o revisión (Si se indica) con la misma opción -f<br /><span style="font-weight:bold;">git status </span> Muestra el estatus del actual arbol.<br /><span style="font-weight:bold;">git diff </span> Diferecnias entre el arbol con respecto al remoto.<br /><span style="font-weight:bold;">git commit </span> <span style="font-style:italic;">-a</span> "Subir" (commit) un archivo o todos con la opción<br /><span style="font-weight:bold;">git reset </span> <span style="font-style:italic;">--hard</span> Regrear el arbol al pasado commit y <span style="font-style:italic;">--soft</span> deshacer el commit pero mantener los archivos en arbol<br /><span style="font-weight:bold;">git clean </span> Elimiar archivos que no son del arbol<br /><span style="font-weight:bold;">git blame </span> Obtener lineas modificadas<br /><span style="font-weight:bold;">git fetch </span> Obtener archivos remotos<br /><span style="font-weight:bold;">git pull </span> Obtener archivos remotos y hacer merge con los locales<br /><span style="font-weight:bold;">git checkout </span><span style="font-style:italic;">branch</span> Cambiar el arbol a un branch indicado<br /><span style="font-weight:bold;">git branch</span> Lista de branch locales<br /><span style="font-weight:bold;">git merge</span> <span style="font-style:italic;">branche</span> Lleva a cabo un merge del barnch con el arbol ptincipal.<br /><span style="font-weight:bold;">git apply </span> <span style="font-style:italic;"> < file </span> Aplicar un parche.<br /><span style="font-weight:bold;">git archivo rev > file</span>Exporta un parche de en contraste a una revisión data al archivo.<br /><span style="font-weight:bold;"></span><br /><br />Para acercarnos a git en verdad que recomiendo: <a href="http://cworth.org/hgbook-git/tour/">http://cworth.org/hgbook-git/tour/</a> <br />Es un Tour fácil para adquirir los conocimientos necesarios para comenzar a trabajar sobre un proyecto.<br />Tambien recomiendo una referencia rápida (Sobre la cual está basada esta entrada): <a href="http://jonas.nitro.dk/git/quick-reference.html">http://jonas.nitro.dk/git/quick-reference.html</a><br />Y por último, claro está, la documentación oficial de Git: <a href="http://www.kernel.org/pub/software/scm/git/docs/user-manual.html">http://www.kernel.org/pub/software/scm/git/docs/user-manual.html</a><br />Suerte probando y jugando con Git!h1n1-alhttp://www.blogger.com/profile/08368552257448425260noreply@blogger.com0tag:blogger.com,1999:blog-6768805419543406492.post-1498491034165272682010-01-26T23:19:00.000-08:002010-01-26T23:30:14.116-08:00Proyecto KickapooEn 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. <br />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. <br />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. <br />Tambien pretendo realizar, con la información estable del MySpace un poco de estadística descriptiva ilustrando los resultados de la investigación.<br />He publicado el código bajo GPLv3 para que todos puedan ver y reusar el código. <br />Lo pueden encontrar bajo: <a href="https://sourceforge.net/projects/kickapoo/">https://sourceforge.net/projects/kickapoo/</a> <br />y pueden navegar por código en: <a href="http://kickapoo.svn.sourceforge.net/viewvc/kickapoo/">http://kickapoo.svn.sourceforge.net/viewvc/kickapoo/</a><br />Por último pueden crear una copia local con: svn co https://kickapoo.svn.sourceforge.net/svnroot/kickapoo kickapooh1n1-alhttp://www.blogger.com/profile/08368552257448425260noreply@blogger.com0tag:blogger.com,1999:blog-6768805419543406492.post-51003151583434047822009-11-18T22:18:00.000-08:002009-11-18T22:56:54.809-08:00Reporte del GSoC Mentor SummitNunca 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. <br />Solo había dos lugares por organización participante, y afortunadamente fui elegido para asistir, que en verdad fue todo un honor. :)<br />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. <br />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.<br />Anexo el Wiki del evento, y una foto grupal que nos tomamos! <br />también contiene las notas de las pláticas, para que todo mundo pueda ver las discuciones tan interesantes que se dieron.<br /><br /><a href="http://gsoc-wiki.osuosl.org/index.php/2009">http://gsoc-wiki.osuosl.org/index.php/2009</a><br /><br /><br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://gallery.eaglescrag.net/d/57400-3/img_6497.jpg"><img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 640px; height: 427px;" src="http://gallery.eaglescrag.net/d/57400-3/img_6497.jpg" border="0" alt="" /></a>h1n1-alhttp://www.blogger.com/profile/08368552257448425260noreply@blogger.com0