Tuesday, June 21, 2016

Recursos Interesantes

Gamepads:
http://www.gamepadjs.com/
http://www.aplu.ch/home/apluhomex.jsp?site=36

Formalización de algoritmos:
http://citc.ui.ac.ir/zamani/clrs.pdf
http://infolab.stanford.edu/~ullman/focs.html

Problemas de programación:
https://projecteuler.net/

Compiladores en web:
http://www.tutorialspoint.com/compile_cpp_online.php
https://jsfiddle.net/
http://cpp.sh/

Visualización de algoritmos de ordenamiento y grafos:
http://algo-visualizer.jasonpark.me/
https://github.com/cytoscape/cytoscape.js

Búsqueda de Islas de vértices y aristas:
http://vlado.fmf.uni-lj.si/pub/networks/doc/sunbelt/islands.pdf
http://vlado.fmf.uni-lj.si/pub/networks/doc/dagstuhl/large.pdf
http://vlado.fmf.uni-lj.si/pub/networks/course/networks.pdf
http://vlado.fmf.uni-lj.si/pub/networks/doc/mix/islands.pdf

Programación de ROM para GB y GBA o emuladores:
http://gbdk.sourceforge.net/
http://www.loirak.com/gameboy/gbatutor.php
http://www.ezflash.cn/
https://www.reinterpretcast.com/writing-a-game-boy-advance-game
http://www.freeinfosociety.com/media/pdf/2901.pdf

Escalado en pixeles:
http://www.cambridgeincolour.com/tutorials/image-resize-for-web.htm
http://www.datagenetics.com/blog/december32013/index.html
http://algolist.manual.ru/graphics/quant/qoverview.php

Mapa del mundo:
http://earthobservatory.nasa.gov/blogs/elegantfigures/files/2011/10/land_shallow_topo_2011_8192.jpg
http://earthobservatory.nasa.gov/blogs/elegantfigures/2011/10/06/crafting-the-blue-marble/

Usar la salida de audio de smartphone
http://www.edn.com/electronics-blogs/embedded-basics/4416138/Turn-a-Smart-Phone-into-a-Signal-Generator

Recursos para juegos
http://html5gamedevelopment.com/2012-01-free-game-graphics-and-audio-resources/
http://www.aseprite.org/

Generación de mecanicas
http://www.cc.gatech.edu/~azook3/paper/zook-aaai-2014.pdf 
https://books.google.com.mx/books?hl=es&lr=&id=61LbUE2K3zoC&oi=fnd&pg=PP1&dq=roleplaying+game+design&ots=cdK7tSL0wA&sig=Uv8Yf029-XGBvCJcdGXXUTQmDcU&redir_esc=y#v=onepage&q=roleplaying%20game%20design&f=false 

Hacer un SNES
http://gizmodo.com/how-to-build-your-own-mini-snes-1790156604

Pixelización
http://www.research.rutgers.edu/~timgerst/
https://sites.google.com/site/tiffanycinglis/research/rasterizing-and-antialiasing-vector-line-art-in-the-pixel-art-style

Monday, December 7, 2015

Criba de Eratóstenes con MPI



Hola, lectores.

Durante mi curso de Sistemas Distribuidos en maestría se me dio la tarea de hacer una versión paralela del conocido algoritmo para obtener números los primos en cierto rango, La Criba de Eratóstenes.

Debo decir que siempre he sido un googleador profesional. Es decir, antes de buscar la solución a un problema, hago una búsqueda en Google para revisar soluciones que ya existen, a veces incluso código fuente para aterrizar el asunto (sé que no soy el único).

Lamentable y sorprendentemente, mi búsqueda no dio como resultado un código  en el cual basarme para hacer este trabajo práctico, por lo que tuve que descifrar las propuestas que encontré en pseudocódigo, lenguaje natural o matemático.

Supongo que la solución a la que llegue podría ser de utilidad para alguien que se encuentre en la situación en la que me encontré yo, así que la subo a este blog, para que esté disponible para esa pobre alma en pena.

No diré que este código este optimizado, ni siquiera diré que corre más rápido que su versión secuencial (es probable que tarde más). Pero sí diré que es una implementación paralela de la Criba de Eratóstenes usando MPI (Message Passing Interface). Más específicamente use MS-MPI junto con Visual Studio 2015. Sugiero revisar el siguiente tutorial para usar MS-MPI en Visual Studio: [link], en caso de que sean tan tontos como yo para seguir usando Windows.

Dejo un enlace a un PDF con el código fuente y una breve explicación del mismo. Recomiendo usarlo solamente como algo didáctico (para entender el funcionamiento de MPI) o quizás como base para generar una mejor solución para el mismo problema.

Tuesday, April 9, 2013

Generación de Sello de Factura Digital con OpenSSL en C#

Actualización: código disponible en GitHub

Si has llegado aquí, seguramente ya sabes que la facturación digital es un desmadre. Y la peor parte es la generación del sello a partir de la cadena original. De hecho, en general, todo lo relacionado con la criptografía es muy complicado, pero hace tiempo un alma bondadosa creo OpenSSL, una "alternativa de Open Source para implementar SSL" que afortunadamente, para los que están tristemente casados con Windows, también se distribuye como .exe.

El openssl.exe se puede usar con de la linea de comandos. En el caso de las facturas digitales, se puede usar para firmar una cadena original (que es un resumen de toda la información de una factura digital) usando los archivos .cer y .key que componen la FIEL que el SAT entrega a los contribuyentes.


Una cadena original es una simple cadena de texto y tiene la siguiente forma (por ejemplo):

||2.0|ABCD|2|03-05-2010T14:11:36|49|2008|INGRESO|UNA SOLA EXHIBICIÓN|2000.00|00.00|2320.00|PAMC660606ER9|CONTRIBUYENTE PRUEBASEIS PATERNOSEIS MATERNOSEIS|PRUEBA SEIS|6|6|PUEBLA CENTRO|PUEBLA|PUEBLA|PUEBLA||MÉXICO|72000|CAUR390312S87|ROSA MARÍA CÁLDERON URIEGAS|TOPOCHICO|52|JARDINES DEL VALLE|NUEVO LEÓN|MEXICO|95465|1.00|SERVICIO|01|ASESORIA FISCAL Y ADMINISTRATIVA|2000.00|IVA|16.00|320.00||

Para obtener un sello a partir de esa cadena original, lo primero que se debe hacer es guardarla en un archivo de texto con codificación UTF-8 sin BOM. No intenten hacerlo con el Bloc de Notas, no sirve de nada. Se necesita un editor de texto como Notepad++ que permite elegir la codificación del archivo.


Una vez que se tiene el archivo cadena.txt (o como le hayan llamado), el segundo paso es crear un archivo .pem a partir del archivo .key de la FIEL porque será necesario para el próximo paso. Para hacer esto, hay que abrir la línea de comandos y usar el siguiente comando:

openssl pkcs8 -inform DER -in c:/ruta/a/miarchivo.key -passin pass:contraseña -out c:/ruta/a/miarchivo.pem

Nota: yo recomiendo que en cuanto terminen de usar el .pem lo borren porque el archivo no esta protegido por la contraseña y si alguien lo obtiene podría firmar fácilmente documentos a nombre del dueño de la FIEL.

Ahora que ya se tiene el archivo .pem, se puede firmar la información (la cadena original en cadena.txt) usando el siguiente comando:

openssl dgst -sha1 -sign c:/ruta/a/miarchivo.pem c:/ruta/a/cadena.txt > c:/ruta/a/sellobinario.txt

El archivo resultante del paso anterior (sellobinario.txt) ¡es el sello!, pero, aún no puede usarse porque está escrito en bytes, y si lo abrimos con un editor de texto veremos caracteres raros que seguramente no son parte del estándar UTF-8 con el que se tienen que representar los XMLs. Por eso el SAT exige que ese sello se reescriba en formato Base64. OpenSSL puede ayudar con el comando:

openssl base64 -in c:/ruta/a/sellobinario.txt -out c:/ruta/a/sello.txt

Ahora sí, el archivo sello.txt contiene el sello que podemos agregar en el XML de la factura digital. Sin embargo, este procedimiento se puede automatizar. En mi caso, hice una función de C# (pero debería poderse lograr algo parecido en otros lenguajes del mismo nivel como Java o PHP):

public string Sellar(string keyFile, string pass, string cadena)
{
    string path = "C:\\algun\\directorio";
   
    // Escribir archivo UTF8 de la cadena
    var tempCadena = path + "\\openssl\\cadena" + DateTime.Now.ToString("yyMMddhhmmss");
    System.IO.File.WriteAllText(tempCadena, cadena);

    // Digestion SHA1
    var tempSha = path + "\\openssl\\sha" + DateTime.Now.ToString("yyMMddhhmmss");
    var opensslPath = path + "\\openssl\\openssl.exe";
    Process process = new Process();
    process.StartInfo.WindowStyle = ProcessWindowStyle.Minimized;
    process.StartInfo.FileName = opensslPath;
    process.StartInfo.Arguments = "dgst -sha1 " + tempCadena;
    process.StartInfo.UseShellExecute = false;
    process.StartInfo.ErrorDialog = false;
    process.StartInfo.RedirectStandardOutput = true;
    process.Start();

    String codificado = "";
    codificado = process.StandardOutput.ReadToEnd();
    process.WaitForExit();

    String codificado2 = "";
    // Si quieren cambiar este ciclo por un string.IndexOf('='), adelante, yo soy muy flojo.
    for (int i = 0; i < codificado.Length; i++)
    {
        if (codificado[i] == '=')
        {
            codificado2 = codificado.Substring(i + 2);
            break;
        }
    }
    System.IO.File.WriteAllText(tempSha, codificado2);

    // Crear .pem del .key
    var tempPem = path + "\\openssl\\pem" + DateTime.Now.ToString("yyMMddhhmmss");
    Process process2 = new Process();
    process2.StartInfo.WindowStyle = ProcessWindowStyle.Minimized;
    process2.StartInfo.FileName = opensslPath;
    process2.StartInfo.Arguments = "pkcs8 -inform DER -in " + keyFile + " -passin pass:" + pass + " -out " + tempPem;
    process2.StartInfo.UseShellExecute = false;
    process2.StartInfo.ErrorDialog = false;
    process2.StartInfo.RedirectStandardOutput = true;
    process2.Start();
    process2.WaitForExit();

    // Generar sello
    Process process3 = new Process();
    process3.StartInfo.WindowStyle = ProcessWindowStyle.Minimized;
    process3.StartInfo.FileName = opensslPath;
    process3.StartInfo.Arguments = "dgst -sha1 -sign " + tempPem + " " + tempCadena;
    process3.StartInfo.UseShellExecute = false;
    process3.StartInfo.ErrorDialog = false;
    process3.StartInfo.RedirectStandardOutput = true;
    process3.Start();
   
    // Codificar en Base64
    String selloTxt = process3.StandardOutput.ReadToEnd();
    String b64 = Convert.ToBase64String(Encoding.Default.GetBytes(selloTxt));
    process3.WaitForExit();
   
    // Por aquí deberían borrar los archivos temporales, ¿ya les dije que soy flojo?
   
    return b64;


Espero que les haya sido de ayuda.

Friday, March 15, 2013

How I Make My Comics


In spite of being a kinda-IT-guy, I’m not completely into digital stuff... I like music played with instruments and I also like hand drawn art, so that’s the way I do my line art. First I do a sketch with pencil and then use marker.

When I’m done, I scan the drawing and get something like this:
What's that language? Mexican?


You may notice that the black lines are a bit grayish, also the white background. If you have some experience with image editing you’ll probably tell me to manually correct the contrast and brightness. But I’m too lazy, so I use Inkscape.

Inkscape is freeware; you can download it here and live happily forever. So, the cool thing about Inkscape is that it “re-draws” your image (if it is intended to be b/w). You just need to open the image, click on it, use Shift + Alt + B and you’ll get something like this:


When you press the OK button, the process will start and when It’s over you’ll get something nice like this:

But that’s not all, look closer, those are vectors! Look at the popcorn guy! Isn’t he beautiful?
Iugh, bitmap...

Vector sugoi desu!

Now, I can has color. Inkscape also has the good ol' paint bucket.
Me gustan los tacos.


You’ll have to configure some options for it to work fine...

And then, just click and color.

Hope It’s useful. :)
To see this and more comics go to Power of Power.

Saturday, December 1, 2012

One-Hit Wonder

Hace 3 años, el 1ro de agosto del 2009 hice y publique un cómic llamado Lávese los Dientes en mi cuenta de deviantART y fue relativamente bien recibido. Desde entonces, ha sido visitado 741 veces, ha recibido 45 comentarios y ha sido agregado a favoritos 12 veces. No fue algo viral, claro. Sin embargo, siempre sentí que ese cómic era de lo mejor que había hecho, mis obras en deviantART no suelen pasar de las 100 visitas y de 10 a 15 comentarios.

Pasaron los años y un día, hace unas semanas, decidí hacer una versión del mismo cómic en inglés para mi proyecto de cómics cortos en inglés, Power of Power. A la vez, lo publique en 9GAG para tratar de atraer gente al sitio. Me quise hacer el listo y agregue la URL de Power of Power al campo de Via/Source que haría que al hacer click en la imagen los usuarios fueran redirigidos a mi cómic.


Los resultados fueron inesperadamente buenos. En una semana, el post de
9GAG recibió 26,789 thumbs up, 10,248 likes de facebook, 92 tweets y 89 comentarios. Jamás una obra mía recibió tanta atención (y es probable que jamás vuelva a pasar). El cómic incluso pasó a ser publicado en otros sitios humorísticos como MemeCenter y en otros idiomas (ruso y polaco). Pura locura. Uno pensaría, “Genial, ya la hice. Ya pegue en el Internet”, pero, resulta que no.

Durante la primera semana todo iba muy bien,
Power of Power recibió un número de visitas mayor al usual, aunque no fue algo constante.


A pesar de que el cómic fue un éxito en
9GAG y gente no identificada lo tradujo y publico en otros sitios, sólo el post en 9GAG atrajo algunos clicks. Esto fue un gran error de mi parte. Muy pocas personas saben o imaginan que al hacer click sobre una imagen en 9GAG puede llevarte a la fuente, y de esos pocos sólo una parte se molesta en hacer click para ver de donde proviene el contenido. Debí tomar una precaución muy popular en los cómics web que es: firmar el cómic con una URL. Al firmar el cómic, las personas menos experimentadas reciben el mensaje “¿Te agrado este cómic?, pues hay más, sólo teclea esta URL”. Y no sólo eso, si el contenido es traducido y/o publicado en otro sitio por terceros, es muy probable que conserven la URL con la que se firmo el cómic, después de todo, es más trabajo quitarla.

En conclusión, una recomendación para los autores de web-comics u algún otro contenido: siempre firmen sus cómics con una URL. Aun cuando no publiquen su trabajo en sitios como 9GAG. Nunca se sabe cuando algo que hagan podría volverse viral.

En lo personal, me emociona pensar que algo que hice le agrado a tantas personas y se propago, sobretodo me gustan algunas respuestas muy divertidas como:

Sin embargo, mi cómic recibió sólo 348 visitas, mientras que 9GAG y otros sitios recibieron más de 26,789 (supongo), si hubiera firmado el cómic, posiblemente las visitas de Power of Power habrían incrementado. Y eso es triste. Aprendan de mi error y suerte.

Sunday, October 7, 2012

Fondo Dinámico en Página Web

Hace poco quise agregar un fondo dinámico a una página web (esta, por si la quieren ver), es decir, que al refrescar el fondo cambiara a otra imagen. Lo resolví con el siguiente código:

<style>
  body1{background:url(imagen1.jpg);}
  body2{background:url(imagen2.jpg);}
</style>
<script>
  var randomnumber = Math.floor(Math.random()*2) + 1;

  document.body.className = "body" + randomnumber;
</script>

Saturday, September 8, 2012

Hice una transcripción de una carta que hizo un pariente que vivió durante la Independencia de México:

Autor: Hermenegildo Revuelta
Fecha Original: 1 de noviembre de 1814
Fecha de la Copia: 2 de noviembre de 1814
Texto transcrito (sin correcciones):
Copia del Parte del Comandante de Lagos.

Ayer 1.° entre 7. Y 8. de la mañana me avisaron los vigias
que por el Cerro del Poniente se veían unos hombres que
parecian insurgentes: al momento despaché al piquete de
Dragones de mi Regimiento con orden de reconocerlos y re
tirarse sin perseguir a nadie: luego vieron en la parte
opuesta del cerro una reunion crecida que trato de
embolverlos, pero ellos sosteniendose en retirada, la ve
rificaron sin dexarselos arrimar hasta que se me reunie-
ron. Yo havia salido con doscientos hombres y dos piesas
con la idea de hurtarles la buelta y cogerlos por la
espalda; pero quando lo iva a verificar me avisaron,
que por el rumbo de comanja venia un peloton con
siderable, este avio (segun las noticias anticipadas q.
tenia) me hiso creer que venian convinados con los de
la Sierra y por lo tanto ya solo traté de ponerme
a la defensiva, colocando la tropa en las cortaduras
y baluartes; en el acto de verificarlo se me aproxi-
maron a distancia de cien pasos cosa de 600 man
dados por Hermosillo, Saturnino, San Roman y un
Religioso Franciscano, pero con un tiro de metralla
se alejaron al instante, luego se cargaron por la par
te del Rer, pero alli tumbaron a los tres que prime
ro se arrimaron a las cortaduras y esto basto p.
que los demas se retiraran. Detrás del cerro perma
neció igual ó mayor numero al que se presentó, pero
persuadidos todos de que nada bueno podían ya

Wednesday, May 30, 2012

Thursday, May 17, 2012

Hoy subí la primera tira de "Un Día Como Cualquier Otro" un webcómic que acabo de comenzar en subcultura.es.
 

Friday, April 13, 2012

Friday, March 30, 2012

Saturday, March 17, 2012

Lectura de Voltajes Análogos por Medio de NI LabVIEW 2010 y La Tarjeta Arduino Uno

Desde hace algún tiempo se me encargo el proyecto de obtener una lectura de voltaje análogo como parte de mi servicio de becario. El voltaje provenía de un piranómetro (sensor de la radiación solar). Luego de obtener la lectura debía enviarse de manera digital por el puerto USB y recibirlo en una computadora para guardarlo en una base de datos y dar acceso a la información por una pagina de HTML a través de HTTP.


En un principio, considere usar una computadora con Fedora instalado, ya que este sistema operativo simplifica el uso del puerto USB y la configuración de servidor de HTTP. Sin embargo, me vi obligado a hacerlo en Windows por requerimiento del profesor, que deseaba entender y poder administrar el proyecto en un futuro.

Ya que no encontré ningún tutorial con relación a lo que estaba haciendo, decidí hacer uno. Así que aquí se describe el procedimiento que se siguió para resolver este problema.

Cuando se desea obtener una lectura de voltaje de tipo análogo y procesarla mediante software con una computadora, es necesario pasar por las 4 etapas mostradas en el siguiente diagrama:


Cada etapa tiene sus propios retos. Sin embargo, este proceso puede simplificarse significativamente mediante el uso de dos herramientas:

  • La tarjeta Arduino Uno. Esta tarjeta contiene un microcontrolador ATmega328P, que tiene varias entradas que permiten la lectura de valores análogos. Además, tiene la capacidad de comunicarse con una computadora por medio del puerto USB. Esto cubre las primeras dos etapas del diagrama anterior.
  • El software de desarrollo NI LabVIEW. LabVIEW esta enfocado a la integración de hardware y un lenguaje de programación gráfico. Simplifica en gran medida la tarea de enviar y recibir información por medio de puertos seriales como el USB. Usando LabVIEW se pueden cubrir de manera sencilla las ultimas dos etapas del diagrama.