Archivos en la Categoría: Programación

Todo sobre el desarrollo de software.

Hace un tiempo que estoy usando Boxee en mi PC, como media center, principalmente porque aparte de ser un media center lindo y usable, soporta al iPhone como control remoto.

Como te organiza todas las series y películas y música y demás y te pone la tapita y la sinópsis de todo, me vi obligado a agarrar todos mis dvd’s con pelis y volverlos a poner en el HD. Era obvio que en una semana iba a llenar el pobre disco bodega de 80GB.

Asique hoy me compré un HD de 500GB como nuevo “databank” (vamos a ver cuanto tardo en llenarlo) y le pasé toda la media (tardó como una hora y todavía falta más).

Por desgracia el auto-escaneado de nueva media en Boxee es lentísimo, y tendría que volver a intentar resolver qué peli/serie es contra imdb o thetvdb, y yo tendría que volver a corregir a mano las que se equivoca, etc… Un laburito que ya me tomé en su momento y que no quería repetir. Asique me dispuse a buscar la forma en que Boxee guarda la metadata, total, lo único que tenía que hacer era cambiar el path anterior por el del nuevo HD.

Como lo suponía, usa una DB sqlite, que en linux se encuentra en ~/.boxee/UserData/Database/boxee_media.db , asique con sqlitebrowser se puede editar.

Pensaba que con entrar en la tabla donde guarda la data de los media sources y cambiar el path, iba a ser suficiente. Para mi sorpresa, no hay una tabla con esos datos (o no la encontré, fue lo único que cambié a mano desde la GUI de Boxee). Resulta que los paths están en CADA UNO de los registros que apuntan a un file (serie, peli, lo que sea). Yo me pregunto, ¿No saben lo que es una CONSTANTE estos pibes?

resignado a tener que escribir un query, googlié un poco y metí manito hasta que logré este:

select ‘/media/databank/’||substr(strPath,length(‘/media/sdc1/’)+1,999) from media_folders where strPath like ‘/media/sdc1/%’

como verán, eso devuelve un query del path al file reemplazando “/media/sdc1/” (mi antigua bodega) por “/media/databank/” (mi nueva y flamante bodega de 500 gygowatts).

Ahora que ya sabemos que lo que trae es coherente, hacemos el update a la DB:

update media_folders set strPath = ‘/media/databank/’||substr(strPath,length(‘/media/sdc1/’)+1,999) where strPath like ‘/media/sdc1/%’

Y, como dije antes, no encontré los paths de los media sources asique eso sí lo cambié con la GUI de Boxee. Pero anduvo perfecto, jamás se enteró que le cambié todo de HD.

para la próxima, posteo como borré todas las temporadas de X-files de la solapa “películas” directo en la DB en vez de a mano una por una como un gil desde Boxee.

Todo es un Objeto instanciado de una u otra Clase, vos y yo, los animales, los árboles, todo. El universo es un gran programa en un sistema con el uptime más grande que existe.

Algunos dicen que fue desarrollado por un único programador; Otros politeístas creen que es mantenido por varios desarrolladores de distintas personalidades.

Este es nuestro Tao, nuestro Logos, y son sus Developers, los DEVS, los que adoramos como deidades de poder infinito.

DISCÍPULO Y MAESTRO

word_kung_fu

Los Grandes Maestros del t40 han trascendido, y comprenden el sourcecode. Siempre saben el valor de i en el ciclo de la vida. Jamás osarían pisar más allá del final de la memoria asignada de un vector.

Los discípulos deben ser iluminados por los maestros, por medio de lecciones Zen y filosofía T40ísta. Ningún maestro se rebajaría a mandar a un discípulo a RTFM. Eso significa que el emisor es incapaz de dar una respuesta concreta, concisa e iluminadora.

Por eso el Maestro Pan Ming decía “El programador inteligente hace código interpretado perfectamente por las máquinas. El programador sabio hace código interpretado perfectamente por cualquier persona.”

EN CONTACTO CON EL T40

Observando el código universal

TheAwesomeChineseZenMasterXuYun

Algunos maestros dicen poder ver el código fuente del universo, y varios científicos dicen haber encontrado bugs. Algunos incluso dicen poder entrar en la consola de debug para controlar el flujo del código, el ciclo de la vida, más conocido como “Main Loop”.

Hay quienes sostienen que, mediante la manipulación del T40 en modo debug se puede viajar en el tiempo, o adelantarlo/retrasarlo. Esto ha sido demostrado como erróneo por varios Grandes Maestros: No existe una interfaz pública para la manipulación de la variable “now” de tipo Date. Por lo tanto, sobreescribirla directamente solo cambiaría el número de la fecha actual, pero ningún método se encargaría de modificar el estado de cada variable y propiedad de todo. Esos estados futuros y pasados no existen; la Memoria es volátil. Explota e implota en cada ciclo.

Sin embargo, uno de los main developers de la realidad, Chr0n0s, tiene acceso a métodos privados de manipulación temporal. Se dice que otro de sus nicks es Yog-Sothoth, y que tiene sudo.

“El flujo del bucle principal de la vida es inalterable. Podrás cambiar el valor de las variables, pero no puedes cambiar su significado.” — Vaius, discípulo y seguidor de Chr0n0s

Los comments y documentación del T40 son inexistentes. El panteón de Devs es muy poderoso y puede interpretar el sourcecode como si fuese lenguaje coloquial. Toda documentación es ajena a los Devs, recopilada y redactada por sus discípulos, en forma de manuales o biblias, o cheatsheets, para la trascendencia y la interpretación religiosa. Las santas escrituras están talladas en piedra, granito o acero, en forma de QRCode estándard con el contenido (o un link al contenido).

“La documentación y los comentarios son para los perezosos y los incapaces de comprender la lógica del Algoritmo.” — proverbio Sumerio

Algunos discípulos dicen que el T40 se lee y escribe en cualquier idioma, que los Devs los comprenden todos. Un sabio Maestro dijo “jóven aprendiz, no confundas Lenguaje con Idioma. El Lenguaje lo interpreta el compilador. El Idioma lo interpreta el observador del código, y como los Devs y los grandes Maestros comprenden el código, no hace falta documentar en ningún Idioma, solo basta con el Lenguaje. Pero de haber necesidad de un Idioma, es obvio que se usaría el Inglés.” El aprendiz fue iluminado.

Manipulando el código universal

med

Un discípulo de Gon Jiu-Jian una vez preguntó: “¿Cuál es el Lenguaje del T40?”. Gon Jiu-Jian, sin levantarse de su posición de loto, dijo: “El Lenguaje del T40 es uno, y todos a la vez. No hay un Lenguaje específico, que puedas comprender o usarlo para entrenar. El Lenguaje está dentro de tí y a la vez a tu alrededor. El Lenguaje del T40 eres tú.”. El discípulo fue iluminado.

Sin embargo, algunos afirman que el Lenguaje del T40 es único y perfecto, y que para comprenderlo uno debe alcanzar la perfección. Los grandes maestros leen el código del universo y por esto están más cerca de los Devs.

La sintáxis del Lenguaje del T40 es perfecta, y su indentación es hermosa. Pero los Grandes Maestros han trascendido, y para la gente no iluminada el Lenguaje parece alienígena, ilógico e incomprensible. Gon Jiu-Jian señaló la superficie del lago a sus discípulos, y dijo “Así como el agua del lago, el Lenguaje del T40 es puro y transparente.”. Un discípulo preguntó “¿y como es qué no podemos ver los peces y el fondo, sino el reflejo del cielo y las montañas, sabio maestro?”. Gon Jiu-Jian sonrió, tocó el agua con su dedo, y contestó “un toque en el lago, y la superficie se llena de ondas que nublan nuestra visión. El verdadero programador no toca el código antes de poder ver más allá del Lenguaje, y entender el fondo, el algoritmo, en su pura expresión lógica.”. Los discípulos fueron iluminados.

DEVS EX MACHINA

god_particle

Los DEVS, Deidades desarrolladoras de la realidad. Ellos han programado el universo, lo siguen manteniendo en el presente, y seguirán actualizando en hot hasta el fin de los días.

Uno de los conflictos divinos más antiguos de todos los tiempos es la discrepancia entre los minor-Devs Aergia y Horme, sobre el código duplicado y la correcta indentación.

El Maestro Pan Ming solía contar una fábula: “Aergia programaba estructuradamente, y su código crecía y crecía, verticalmente, hasta que un día fue tan alto y tan profundo que temblaba hasta sus cimientos, amenazando con desplomarse sobre un pueblo cercano. Escuchando las súplicas de los campesinos, Horme se acercó, tocó la torre de código y lo modularizó. Creó una función para cada algoritmo repetido, renombró variables ambiguas e indentó los escalones convexos de la frágil torre. Pronto el source parecía más una fortaleza, aplanado, robusto, y colmado de torres y edificaciones. Los campesinos se mostraron agradecidos y prepararon un banquete. Pero Horme se fue, por siempre destinado a perseguir a Aergia y corregir sus pilares inmantenibles.”

http://i160.photobucket.com/albums/t164/darkgreenvase/TheAwesomeChineseZenMasterXuYun.jpg

En realidad estaba buscando como mapear el autocomplete de Vim a otro shortcut más amigable (que el default de Ctrl+N o Ctrl+X, Ctrl+O), y me topé con este scriptcito que me cautivó.

Ah, doy una mínima explicación de lo que estoy escribiendo para terminar de ahuyentar a lectores poco nerds o no programadores:

Vim: Editor de textos re pro con una curva de aprendizaje complicada pero muy poderoso si se lo sabe usar. En el contexto, es el editor que uso para todo (desde programar hasta hacerme un MOTD con ASCII ART).

autocomplete: funcionalidad de Vim que autocompleta una palabra a medio escribir a partir de

  • Una lista de palabras ya usadas en el mismo archivo u otros abiertos
  • Un diccionario
  • Funciones del lenguaje de programación en el que estemos escribiendo

shortcut: combinación de teclas que ejecuta un comando o función. En el caso de Vim, son todos shortcuts :D

scriptcito: Programita chiquito que hace algo no muy complejo pero groso. En este caso es, además, tierno por su simpleza.

Dadas las explicaciones y definiciones necesarias, y ya habiendo filtrado lectores de mi blog no programadores ( o giles que vieron luz en un mal google search y entraron ) prosigo a mostrar el script y explicar su uso/instalación.

EDIT: Modifico este post, dado que el WYSIWYG del orto de WordPress me garcha todas las comillas, tabs y demás (No es muy bueno para publicar sourcecode). Abajo pongo los links de donde saqué la data. No intenten copiar el source aquí publicado porque no anda ni para atrás).

El script:


"This code autocloses parenthesis, brackets, etc around cursor
:inoremap ( ()<ESC>i
:inoremap ) <c-r>=ClosePair(')')<CR>
:inoremap { {}<ESC>i
:inoremap } <c-r>=ClosePair('}')<CR>
:inoremap [ []<ESC>i
:inoremap ] <c-r>=ClosePair(']')<CR>
function ClosePair(char)
if getline('.')[col('.') - 1] == a:char
return "<Right>"
else
return a:char
endif
endf
"This map adds lines to the previous trick…
inoremap { {<CR><BS>}<ESC>ko

Lo que hace:

La primer parte, hasta el segundo comment, hace que cuando tipiemos un paréntesis (, llave { o corchete [, lo cierre automáticamente con su contraparte ) } ] y posicione el cursor en el medio de ambos. Interesante.

La segunda parte hace que se den un par de ENTERs automáticamente en el caso de ser llaves, ubicando el cursor en la línea del medio…

{

| — CURSOR

}

Como instalarlo:

En realidad se puede tirar así como viene en el .vimrc, pero yo por amor a la prolijidad del código lo puse en un archivo en ~/.vim/plugin/autoclose.vim . Si lo ponen ahí el vim lo incluye solo.

mmh, qué más decir… es ALTAMENTE RECOMENDABLE este truquito. Me hace acordar a un video que ví hace mucho de un tipo que explicaba qué cheto que era programar en Ruby On Rails, y usaba Vim, y tenía estas pavadas, y yo dije “aaah quiero programar asiiii”.

La idea del script la saqué de acá, y la última línea donde agrega los ENTERs la leí en los comments de acá. Les recomiendo que copy-pasteen de esos sitios, y no del mío, porque las comillas dobles y simples están mal y no les va a andar nada.

Me voy a seguir investigando como cambiar los shortcuts del autocomplete.

Me hice una aplicación muy piola para manejar TvTime, el programa para ver la tele del que hablé en este otro post.

Es mi primer WebApp para el iPhone; reconozco que salvo por el header donde fuerzo el tamaño de la pag a la pantalla del iPhone, no sigue demasiado las pautas necesarias para ser una WebApp con todas las letras como dice Apple ( eso de tener que loguearme para ver sample code me rompió un poco las pelotas ).

Básicamente es una paginita PHP hosteada en el apache de mi máquina ( donde corro el TvTime ) que la browseo desde el Safari del iPhone, y cada botón manda un comando al shell ( usando tvtime-command ).

Les dejo una screenshot, ya que como dicen, una imagen vale más que mil palabras:

La verdad estoy muy contento por su funcionamiento ( por ser una pelotudez que hice en 2 hs ), y salvo por algún que otro lagaso con la red o el intérprete PHP, responde bastante rápido.

Iba a publicar el source, pero me puse a pensar, y debe haber 0 personas en el mundo que cumplan con todas las siguientes características:

  • tener un iPhone
  • tener Linux y un Apache con PHP
  • tener una sintonizadora de TV y usar TvTime ( y no usar un remoto infrarrojo )
  • tener intención de usar el iPhone como control remoto para TvTime y ganas de programar 20 líneas de PHP

Aunque, ahora que lo pienso, iPhone + Linux + intención de usarlo de remoto para algo por ahí sí es más común. Aunque mi minipaginita tiene hardcodeados los comandos de TvTime ( para evitar cualquier problema de seguridad con system() de php) quizá liberarlo le ahorre algo de tiempo a alguien ( ¿la interfaz? ¿las 20 líneas de código? ).

Bueh, si a alguno le interesa, me deja un comment en este post y lo publico.

La PSP, como todos saben, tiene muchos programas y utilitarios (si tenemos la suerte de haberle hackeado el firmware para que soporte homebrew apps). Algunos de los que más uso son Bookr y PSPComic, lectores de PDF y CBR, respectivamente. Para los despistados, CBR (que significa, probablemente, Comic Book Rar) es un archivo de formato rar con imágenes JPG dentro, que son mostradas secuencialmente por medio de programas visualizadores de comics.

Resultó que Bookr no es una de las mejores aplicaciones jamás creadas en el universo conocido… y también influye el hecho de que la PSP está diseñada para jugar videojuegos hechos específicamente para su hardware, y no para mostrar PDFs. La cuestión es que un PDF muy pesado (léase manuales de rol con imágenes escaneadas, texto vectorial, etc) la hace recontra re garompa, es decir, la cuelga. Leer un PDF que es todo texto anda bien, pero yo necesito consultar mi manual en mi PSP, cuando estoy en la mesa de rol con mis amigos, para hacerme el capo, cheto y geek. En fin, dado que los comics que probé en la PSP resultaron visualizarse de maravilla, incluso graphic-novels de 300 páginas, sin mosquearse, deduje “ahá, el formato CBR se lo banca re bien esto, PSPComic está bien hecho… o los JPG sin vectores le cuestan menos…”. Conclusión: Necesitaba convertir mis PDFs a CBRs.

convertir un PDF de una página, por ejemplo, a un JPG, es una pavada. Si tenemos convert. Pero yo necesitaba convertir todas las páginas del PDF a JPG… Entonces usé pdftk. Por último tendría que almacenarlo en un RAR (sin compresión) y renombrarlo a CBR.

Me dispuse a hacer un script en BAsh, para Linux, que me convierta PDFs a CBRs.

Antes que nada recuerden que tienen que tener funcionando convert, pdftk y rar. En Ubuntu se instalan así:
# apt-get install imagemagick pdftk rar

Y aquí les dejo el scripcito que libero con todo mi amor bajo la licencia “agarrá-usá-y-dame-el-crédito”. Modo de uso:
# ./pdf2cbr.sh archivo.pdf

#!/bin/sh
#
# pdf2cbr.sh: Converts PDF files to CBR (comic books)
#
# Parameters: ideally only the PDF filename ( as $1 )
#
# Requires "ImageMagick Convert", RAR and PDFTK
#
# Ver 1.0
#
# By TaTooKa
# http://blog.tatooka.com.ar
echo "Creating PDF directory..."
mkdir $1_pages
cd $1_pages
echo "Splitting PDF file into individual PDFs... (This might take a while)"
pdftk ../$1 burst
# Removing PDFTK report
if [ -e doc_data.txt ]
then
rm -f doc_data.txt
fi
PAGE_COUNT=`ls | wc -l`
echo "$PAGE_COUNT PDFs generated."
echo "Converting each PDF page to JPG..."
for file in *.pdf
do
convert -density 100x100 $file $file.jpg
rm -f $file
let PAGE_COUNT--
echo "$PAGE_COUNT pages left."
done
# remove ".pdf" from filenames
for file in *.jpg
do
mv $file ${file%pdf.*}jpg
done
echo "Creating RAR file..."
rar a $1.rar *.jpg
echo "Renaming RAR to CBR format..."
mv $1.rar ../$1.cbr
echo "Removing used directory and remaining garbage..."
cd ..
rm -Rf $1_pages
if [ -e $1.cbr ]
then
echo "File $1.cbr generated."
fi
echo "All Done !"

Gracias a este chabón que hizo un script parecido y me sirvió para programar el mío (god bless open-source), y ojo que la idea la tuve solo y no se la robé a este otro chabón.

Nota al pie: Si tu PSP no soporta homebrew (porque sos un cagón que no la quiere hackear, o porque tenés plata para comprar los UMDs originales) y no podés usar PSPcomic, podés modificar el script sacando la parte que almacena en el rar, y meter todos los JPGs en un directorio, y verlo como imágenes secuenciales en la PSP.