<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-6741383955809102317</id><updated>2012-03-05T16:19:44.160+01:00</updated><category term='presentaciones'/><category term='AntiORM'/><category term='PyMite'/><category term='tests'/><category term='diseño'/><category term='PirannaFS'/><category term='brainstorms'/><category term='plugins'/><category term='releases'/><category term='Gaia'/><title type='text'>Piranna's Free Software</title><subtitle type='html'>Changing the world... one line at a time</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://pirannafs.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6741383955809102317/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://pirannafs.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Jesús Leganés Combarro</name><uri>https://profiles.google.com/109968379540878755826</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-G1X-8HwWjfg/AAAAAAAAAAI/AAAAAAAAAAA/RekFnw3Z3WI/s512-c/photo.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>24</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-6741383955809102317.post-2865407518607608754</id><published>2012-02-26T22:22:00.003+01:00</published><updated>2012-02-26T22:22:49.536+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PyMite'/><title type='text'>PyMite from Interruption Space</title><content type='html'>&lt;div style="text-align: justify;"&gt;Se que ultimamente estoy hablando mucho de PyMite en lugar de sobre Gaia, mi verdadero proyecto para el concurso de este año, pero puesto que en cierto modo se me quedo la espinita clavada por &lt;a href="http://pirannafs.blogspot.com/2012/02/pymite.html"&gt;la tonteria del bug&lt;/a&gt; por usar una version de Python demasiada moderna, lo cierto es que lo he estado usando como campo de pruebas para despues aplicar las mejoras a Gaia directamente. Sin embargo, esta vez mi trabajo en PyMite se merece un post por derecho propio:&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: justify;"&gt;&lt;a href="http://2.bp.blogspot.com/-_FpfFcXpHtI/T0qHiMKxoQI/AAAAAAAACcQ/KWRmHDBxPDg/s1600/Pantallazo+del+2012-02-26+19:37:40.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="381" src="http://2.bp.blogspot.com/-_FpfFcXpHtI/T0qHiMKxoQI/AAAAAAAACcQ/KWRmHDBxPDg/s640/Pantallazo+del+2012-02-26+19:37:40.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;PyMite capturando los scancodes del teclado mediante eventos. Si niños: he conseguido capturar y procesar interrupciones directamente desde dentro de Python :-D&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;¿Que como lo he hecho? Bien, vayamos por partes:&lt;/div&gt;&lt;br /&gt;&lt;ul&gt;&lt;li style="text-align: justify;"&gt;En primer lugar, hace falta tener funcionando un &lt;b&gt;gestor de interrupciones&lt;/b&gt; en C. Esto no es demasiado problema, puesto que tambien es necesario para poder capturar las interrupciones del reloj del sistema (que eso &lt;a href="http://pirannafs.blogspot.com/2012/02/it-works.html"&gt;ya lo habia conseguido&lt;/a&gt;) y para poder capturar las interrupciones del teclado para poder usarlo como entrada estandar, asi que eso ya estaba listo. Trivial, vamos.&lt;/li&gt;&lt;li style="text-align: justify;"&gt;Una vez hecho eso, el siguiente es añadir handlers para las interrupciones que queremos manejar (en principio todas). Para ello, me he hecho una funcion &lt;b&gt;init()&lt;/b&gt; nativa dentro de &lt;a href="http://code.google.com/r/piranna-p14p/source/browse/src/platform/multiboot-x86/events.py?name=piranna_v09"&gt;events.py&lt;/a&gt; (un nuevo modulo que he hecho para gestionar los eventos, luego hablo mas de ello) que se encarga de inicializar la cola de eventos, de registrar el handler para las interrupciones en los que estamos interesados para que las guarde en la cola de eventos, y tambien de guardar un puntero a la funcion que se va a encargar despues de extraer los eventos y procesarlos, esta vez ya en Python. Todo el codigo esta sacado de Gaia con pequeñas modificaciones ya que la filosofia de diseño de hacerlo puramente orientado a eventos es comun para los dos, asi que he decidido reutilizar la idea de usar una unica cola global de eventos y que despues se vayan "bombeando" y procesando secuencialmente uno detras de otro como pequeñas unidades de codigo atomicas e independientes, muy inspirado en como funcionan &lt;a href="http://nodejs.org/"&gt;Node.js&lt;/a&gt; o el motor de eventos &lt;a href="http://es.wikipedia.org/wiki/Twisted_(software)"&gt;Twisted&lt;/a&gt; (del cual soy un fan declarado... :-D ).&lt;/li&gt;&lt;li style="text-align: justify;"&gt;Una vez que se produce una interrupcion, se lanza el &lt;b&gt;handler&lt;/b&gt; que hemos definido para manejarlos (tambien nativo) el cual simplemente añade un nuevo evento a la cola de eventos, llama al bombeador de eventos y sale de la interrupcion (esta fue sencilla... ;-) ).&lt;/li&gt;&lt;li style="text-align: justify;"&gt;Finalmente, el bombeador de eventos se asegura de que nadie mas los esta procesando (principalmente porque se haya producido una interrupcion mientras todavia no se habian terminado de procesar los pendientes) y en tal caso, va vaciando la cola de eventos y procesandolos uno a uno ejecutando las funciones que se hubiesen registrado para cada uno de ellos. Al tener que acceder a la cola de eventos y estar esta declarada en C estoy usando un par de funciones nativas para comprobar si esta vacia y para extraer uno de los eventos, nada mas.&lt;/li&gt;&lt;/ul&gt;&lt;div style="text-align: justify;"&gt;Simple, facil y para toda la familia :-D Y por supuesto, todo subido al &lt;a href="http://code.google.com/r/piranna-p14p"&gt;repositorio&lt;/a&gt;... :-)&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="text-align: justify;"&gt;Sin embargo hay truco: por un lado, no estoy generando eventos en Python propiamente dichos, sino que solo estoy guardando el nombre del evento. Esto es asi para que el handler fuera mas pequeño al posponer la conversion a objetos Python y volviera antes de la interrupcion, pero sin lugar a dudas si quiero usar una cola de eventos unica tendre que cambiarlo. Otra opcion seria el tratar las interrupciones en dos pasos, con una cola de interrupciones y despues convertirlas y añadirlas a la cola de eventos en un paso posterior. Esto aislaria por completo el procesamiento de interrupciones de el de eventos con lo que quedaria muchisimo mas limpio, pero tambien añadiria mas retrasos... habra que estudiarlo. Otro truco que usa que &lt;a href="http://groups.google.com/group/python-on-a-chip/msg/463e499e88768007"&gt;me ha sugerido el propio autor de PyMite&lt;/a&gt; (aunque al final no lo estoy haciendo como el me ha propuesto) y que es mas interesante, es que al tener PyMite su propio gestor de hilos y ademas puede cambiar automaticamente de uno a otro si ha estado uno de ellos mucho tiempo en la CPU (¿hilos preemptivos? eso en mi barrio se le llama procesos... :-P ) lo estoy aprovechando y en lugar de procesar los eventos directamente (con lo que el "proceso" que estaba en ejecucion cuando se produjo la interrupcion se queda esperando) los estoy lanzando en un nuevo hilo para que se procesen de forma autonoma mas adelante y asi poder volver inmediatamente de la interrupcion :-)&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Por otra parte, hay espacio para limpiar codigo y para optimizar para aburrir. En primer lugar, actualmente no es threadsafe puesto que no estoy usando ninguna estructura que lo haga. En Gaia el bombeo de eventos esta protegido con un lock, pero al necesitar guardar la funcion a usar para el bombeo desconozco si podria usar una funcion nativa (supongo que si), por lo que estoy usando un simple booleano (¡¡¡error!!! :-S ), asi que eso tengo que arreglarlo pronto. Tambien estaria la posibilidad de usar la clase &lt;a href="http://docs.python.org/library/queue.html"&gt;Queue&lt;/a&gt; de Python, pero tiene muchas dependencias que la libreria estandar de PyMite no me satisface, asi que por el momento descartado. Por ultimo, claro esta, lo que he comentado anteriormente de separar la cola de interrupciones de la de eventos, pero esa es otra historia... :-D En resumen, que en unos commits estara listo ;-)&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Y eso es todo por ahora, me falta explicar como se usan dichas interrupciones desde Python pero eso lo explicare en otro post (aunque lo cierto es que ahora deberia centrarme en estudiar para los examenes... :-/ ). Lo que si me he dado cuenta es que el problema de la &lt;a href="http://pirannafs.blogspot.com/2012/02/gaia-is-back.html"&gt;limitacion de memoria para el kernel&lt;/a&gt; en x86 es &lt;b&gt;real&lt;/b&gt;, ya que me ha vuelto a pasar con PyMite aunque increiblemente en PyMite ha tardado mucho mas en aparecer que con Gaia: ha sido eliminar las funciones de acceso a los puertos de entrada/salida que no estaba usando y arreglarse el problema... :-/&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;P.D.: para los que no lo hayan entendido, el titulo del post es una parodia de &lt;a href="http://es.wikipedia.org/wiki/Plan_9_from_User_Space"&gt;Plan 9 from User Space&lt;/a&gt;, el port para Unix/Linux de las librerias del sistema operativo &lt;a href="http://es.wikipedia.org/wiki/Plan_9_from_Bell_Labs"&gt;Plan 9&lt;/a&gt;, con el cual tengo una relacción de amor-odio digna de poner en el Facebook como "es complicado"... :-P&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6741383955809102317-2865407518607608754?l=pirannafs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pirannafs.blogspot.com/feeds/2865407518607608754/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://pirannafs.blogspot.com/2012/02/pymite-from-interruption-space.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6741383955809102317/posts/default/2865407518607608754'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6741383955809102317/posts/default/2865407518607608754'/><link rel='alternate' type='text/html' href='http://pirannafs.blogspot.com/2012/02/pymite-from-interruption-space.html' title='PyMite from Interruption Space'/><author><name>Jesús Leganés Combarro</name><uri>https://profiles.google.com/109968379540878755826</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-G1X-8HwWjfg/AAAAAAAAAAI/AAAAAAAAAAA/RekFnw3Z3WI/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-_FpfFcXpHtI/T0qHiMKxoQI/AAAAAAAACcQ/KWRmHDBxPDg/s72-c/Pantallazo+del+2012-02-26+19:37:40.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6741383955809102317.post-2087298996847383839</id><published>2012-02-21T16:33:00.001+01:00</published><updated>2012-02-26T20:30:19.933+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Gaia'/><category scheme='http://www.blogger.com/atom/ns#' term='PyMite'/><title type='text'>It works!</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-3gbK-HGRhBg/T0O4gdc5FGI/AAAAAAAACZM/TiblKYY4r-U/s1600/Pantallazo+del+2012-02-21+15_25_36.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="381" src="http://4.bp.blogspot.com/-3gbK-HGRhBg/T0O4gdc5FGI/AAAAAAAACZM/TiblKYY4r-U/s640/Pantallazo+del+2012-02-21+15_25_36.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;a href="http://pirannafs.blogspot.com/2012/02/pymite.html"&gt;PyMite&lt;/a&gt; corriendo sobre QEmu (x86) usando por debajo el codigo de &lt;a href="http://pirannafs.blogspot.com/search/label/Gaia"&gt;Gaia&lt;/a&gt;&amp;nbsp;mostrando un timer basado en interrupciones&amp;nbsp;:-D&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6741383955809102317-2087298996847383839?l=pirannafs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pirannafs.blogspot.com/feeds/2087298996847383839/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://pirannafs.blogspot.com/2012/02/it-works.html#comment-form' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6741383955809102317/posts/default/2087298996847383839'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6741383955809102317/posts/default/2087298996847383839'/><link rel='alternate' type='text/html' href='http://pirannafs.blogspot.com/2012/02/it-works.html' title='It works!'/><author><name>Jesús Leganés Combarro</name><uri>https://profiles.google.com/109968379540878755826</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-G1X-8HwWjfg/AAAAAAAAAAI/AAAAAAAAAAA/RekFnw3Z3WI/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-3gbK-HGRhBg/T0O4gdc5FGI/AAAAAAAACZM/TiblKYY4r-U/s72-c/Pantallazo+del+2012-02-21+15_25_36.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6741383955809102317.post-3718533862971638072</id><published>2012-02-20T18:56:00.000+01:00</published><updated>2012-02-20T18:56:44.677+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Gaia'/><category scheme='http://www.blogger.com/atom/ns#' term='PyMite'/><title type='text'>PyMite</title><content type='html'>Originariamente no iba a desarrollar Gaia, todo fue fruto de las circunstancias.&amp;nbsp;Desde siempre tuve claro que mi sistema operativo tendria una arquitectura microkernel, sin embargo tambien queria que fuera seguro y facil de entender, de ahi que la arquitectura exokernel fuera ganando fuerza: el menor codigo posible corriendo como supervisor, y todo lo demas corriendo como espacio de usuario. Esto se podria potenciar mas si no solo se usan dos ejecutables distintos (Gaia y Uranus) sino que directamente estaban escritos en dos lenguajes distintos, y que dos mejores opciones que mis grandes amores C++ y Python :-D&lt;br /&gt;&lt;br /&gt;Proyectos para hacer un sistema operativo en Python ha habido &lt;a href="http://code.google.com/p/cleese/"&gt;algunos&lt;/a&gt;, pero no han llegado a buen termino, en parte por la mala fama que tiene Python de ser lento (lo cual no es "tan" cierto...). Sin embargo poco antes de comenzar la edicion del concurso de este año descubri la existencia de PyMite, y en ese momento vi claro que es lo que debia hacer :-D&lt;br /&gt;&lt;br /&gt;&lt;a href="http://code.google.com/p/python-on-a-chip"&gt;PyMite&lt;/a&gt;&amp;nbsp;aka Python-on-a-chip es una maquina virtual Python diseñada para correr sobre microcontroladores de 8 bits... y sin sistema operativo por debajo, directamente sobre el metal :-) Ironicamente, aunque existe la posibilidad de compilarlo para escritorio para pruebas no habia ninguna plataforma echa para que corriera sobre PCs estandar directamente, luego ¿que mejor manera de colaborar con el software libre? Y ademas, me conseguia una base solida sobre la que programar mi sistema operativo comodamente sin tener que diseñarme mis propias estructuras de datos: dos por el precio de uno :-)&lt;br /&gt;&lt;br /&gt;Asi que me puse a ello, mirando documentacion y haciendo pruebas. Lo tenia todo listo, y a la hora de ejecutar... fallo. Un bug tan raro que ni el programador original pudo decirme que podria pasar :-( Habia perdido un tiempo precioso y ademas ya estaba mentalizado en desarrollar de una vez por todas mi propio sistema operativo, por lo que decidi cambiar mi proyecto de portar PyMite a la arquitectura x86 a desarrollar mi propio exokernel que sustituyera la labor que realizaria PyMite de abstraer a bajo nivel el hardware, y asi surgio Gaia, la madre tierra.&lt;br /&gt;&lt;br /&gt;Sin embargo, la semana pasada recibi un &lt;a href="http://groups.google.com/group/python-on-a-chip/browse_frm/thread/d7fbb6e929b5e437/c678e96f0813bc23#c678e96f0813bc23"&gt;e-mail&lt;/a&gt; sobre no-se-que indicandome que podria ser mi version de Python ya que al ser muy reciente generaba bytecodes que eran interpretados como basura. Al principio no sabia a que se referia hasta que vi de donde procedia: ¡era el bug que notifique hacia 5 meses! La verdad que no confiaba mucho en una idea feliz tan absurda, aunque tenia sentido asi que decidi probarla: me baje mi &lt;a href="http://code.google.com/r/piranna-p14p"&gt;viejo codigo&lt;/a&gt;, compile el entorno usando Python 2.6 en lugar del 2.7.2 que viene por defecto, ejecuto... y no me lo podia creer, la excepcion habia desaparecido. ¡El ultimo paso que me faltaba, al final lo tenia! :-D Tarde, pero al menos ya no me quedaba con el regusto de no haberlo conseguido: PyMite estaba corriendo sobre una nueva plataforma y todo gracias a mi... y al mensaje de un desconocido :-D&lt;br /&gt;&lt;br /&gt;Asi que estos dias le he estado dando un pequeño empujon canibalizando el codigo de Gaia (al igual que hace 5 meses hice en sentido inverso) y lo cierto es que me estoy llevando una grata noticia: no solo me esta siendo mucho mas facil entender como hacer las cosas al haberme peleado antese-mail con Gaia (y ademas ya funciona el timer con PyMite :-P ) sino que ademas, ¡casi no estoy picando codigo! ¡¡Todo es copy &amp;amp; paste!! :-D Luego en cierto sentido creo que "parte" de mi proposito al desarrollar Gaia se esta cumpliendo: un framework para hacer facil el desarrollo de sistemas operativos sin tener que preocuparse de las menudeces porque ya estan hechas :-) Por el momento el copy&amp;amp;paste es descarado porque al pillarme la noticia un poco por sorpresa actualmente Gaia de framework tiene poco... pero si que el codigo esta bastante claro con lo que no me esta costando nada adaptarlo :-)&lt;br /&gt;&lt;br /&gt;Lo bueno de esto es que me va a servir para tener otro entorno de pruebas aparte de ChaOS para aumentar la portabilidad y abstraccion de Gaia, lo cual es bueno, y ademas tambien me permite colaborar con un proyecto de software libre bastante grande, lo cual esta genial :-D De momento estoy pensando en separar la libreria del sistema a un proyecto aparte (GaiaLib), con vistas a en el futuro sustituirla por NewLib (aunque lo cierto es que no me esta quedando nada mal... :-D ), y quien sabe si no podre sacar mas codigo reutilizable. Al final con la tonteria, lo que iba a ser un simple proyecto para el concurso ya van colaboraciones en cuatro distintos... :-P&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6741383955809102317-3718533862971638072?l=pirannafs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pirannafs.blogspot.com/feeds/3718533862971638072/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://pirannafs.blogspot.com/2012/02/pymite.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6741383955809102317/posts/default/3718533862971638072'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6741383955809102317/posts/default/3718533862971638072'/><link rel='alternate' type='text/html' href='http://pirannafs.blogspot.com/2012/02/pymite.html' title='PyMite'/><author><name>Jesús Leganés Combarro</name><uri>https://profiles.google.com/109968379540878755826</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-G1X-8HwWjfg/AAAAAAAAAAI/AAAAAAAAAAA/RekFnw3Z3WI/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6741383955809102317.post-8345446459182216575</id><published>2012-02-11T03:19:00.000+01:00</published><updated>2012-02-11T03:19:42.373+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='presentaciones'/><category scheme='http://www.blogger.com/atom/ns#' term='PirannaFS'/><category scheme='http://www.blogger.com/atom/ns#' term='AntiORM'/><title type='text'>Featuring AntiORM</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: justify;"&gt;Como os dije en mi &lt;a href="http://pirannafs.blogspot.com/2012/02/gaia-is-back.html"&gt;anterior entrada&lt;/a&gt;, debido al estres y desesperación que me estaba ocasionando el que Gaia cascara por cualquier tonteria decidi darme un respiro y mejorar en mi &lt;a href="http://pirannafs.blogspot.com/search/label/PirannaFS"&gt;sistema de archivos&lt;/a&gt;, y una de esas mejoras fue justamente quitar todas las referencias a SQLite de la capa de abstracción a la base de datos y limpiarla un poquito. ¿Que pasa? Que como tiene la caracteristica de que es bastante generica al tener todas las consultas SQL en archivos externos, entonces ya no hay ninguna referencia al sistema de archivos y se podria aislar como un paquete independiente para poder usarlo en otros proyectos. Pues bien: un poco de magia con la ayuda de GitHub, un poquito de limpieza de codigo para que quede mas presentables y unas cuantas optimizaciones (las cuales incluso han hecho que PirannaFS sea mas limpio y rapido :-) ) y asi es como nacio &lt;a href="https://github.com/piranna/AntiORM"&gt;AntiORM&lt;/a&gt;.&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: justify;"&gt;Tradicionalmente, los &lt;a href="http://es.wikipedia.org/wiki/Mapeo_objeto-relacional"&gt;ORM&lt;/a&gt;&amp;nbsp;se han usado para definir a alto nivel los datos, de forma que fuera facil de usar para el programador, pero de esta forma se pierde el control de como se estan guardando (lo cual no es malo, es la mayoria de los casos no es del todo importante), y ademas al hacerlo de una forma generica ralentizando el acceso y termina siendo un cuello de botella y creando problemas en aplicaciones que necesitan un gran rendimiento.&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: justify;"&gt;Sin embargo, AntiORM funciona al reves: en lugar de centrarse en la aplicacion y generar internamente el codigo SQL necesario para acceder a los datos, se centra justamente en estos y en como se accede a ellos en la base de datos y genera el codigo necesario para poder usarlos desde la aplicacion. De esta forma, se puede diseñar a mano codigo SQL optimizado para la aplicacion en concreto teniendo un control total sobre los datos sin tener que escribir todo el &lt;a href="http://en.wikipedia.org/wiki/Glue_code"&gt;glue code&lt;/a&gt; necesario para poder usarlo ya que de esto ya se encarga AntiORM, y ademas genera una API especifica para la aplicacion muy sencilla de usar. Si a esto le añadimos que ademas el codigo SQL no esta embebido dentro del codigo del programa principal como se ha hecho hasta ahora cuando se necesitaba este tipo de optimizaciones sino que se guarda en archivos independientes faciles de mantener y de actualizar sin tocar el codigo del programa principal, no me extraña que al final de la presentacion que hice ayer en las oficinas de Tuenti para Python-Madrid la gente mostrara tanto interes e incluso me diesen ideas para mejorarlo o quisieran colaborar en su desarrollo... :-)&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;object width="320" height="266" class="BLOGGER-youtube-video" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0" data-thumbnail-src="https://lh6.googleusercontent.com/-dr-RwgALLbM/TzW_YMZ0onI/AAAAAAAACYg/c9MgBI5nRlo/s0/video-2012-02-09-20-29-19.mp4"&gt;&lt;param name="movie" value="http://video.google.com/googleplayer.swf?videoUrl=http://v5.nonxt7.googlevideo.com/videoplayback?id%3D5334963846a4dac4%26itag%3D5%26source%3Dpicasa%26ip%3D0.0.0.0%26ipbits%3D0%26expire%3D1328944065%26sparams%3Did,itag,source,ip,ipbits,expire%26signature%3D35CB6B460FCB2FD2D7DA7EAD3D1C5566659030B5.75A7528FADEAC317E88B5F16B059308FA37742EE%26key%3Dlh1" /&gt;&lt;param name="bgcolor" value="#FFFFFF" /&gt;&lt;embed width="320" height="266"  src="http://video.google.com/googleplayer.swf?videoUrl=http://v5.nonxt7.googlevideo.com/videoplayback?id%3D5334963846a4dac4%26itag%3D5%26source%3Dpicasa%26ip%3D0.0.0.0%26ipbits%3D0%26expire%3D1328944065%26sparams%3Did,itag,source,ip,ipbits,expire%26signature%3D35CB6B460FCB2FD2D7DA7EAD3D1C5566659030B5.75A7528FADEAC317E88B5F16B059308FA37742EE%26key%3Dlh1" type="application/x-shockwave-flash"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;&lt;br /&gt;¿Sera posible que por primera vez haya hecho algo que realmente sea util para la gente? ¿Al final sera capaz PirannaFS de sacarme de pobre? :-P&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6741383955809102317-8345446459182216575?l=pirannafs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pirannafs.blogspot.com/feeds/8345446459182216575/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://pirannafs.blogspot.com/2012/02/featuring-antiorm.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6741383955809102317/posts/default/8345446459182216575'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6741383955809102317/posts/default/8345446459182216575'/><link rel='alternate' type='text/html' href='http://pirannafs.blogspot.com/2012/02/featuring-antiorm.html' title='Featuring AntiORM'/><author><name>Jesús Leganés Combarro</name><uri>https://profiles.google.com/109968379540878755826</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-G1X-8HwWjfg/AAAAAAAAAAI/AAAAAAAAAAA/RekFnw3Z3WI/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6741383955809102317.post-6004474691649429922</id><published>2012-02-05T16:02:00.002+01:00</published><updated>2012-02-05T16:02:53.797+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Gaia'/><title type='text'>Gaia is back</title><content type='html'>Bien es cierto que no escribo mucho por aca, pero lo cierto es que no soy muy dado a escribir... :-P Pero bueno, como considero que debo manteneros informados de mis avances, alla voy :-D&lt;br /&gt;&lt;br /&gt;Lo cierto es que muchos avances no ha habido con Gaia a pesar de el tiempo dedicado, la paginacion me ha estado dando muchos problemas y a ser sinceros, me ha deprimido. He intentado solucionarlo usando el codigo original de James Mallory (de cuyos tutoriales sobre sistemas operativos he estado usando como referencia) para ir adaptandolo a mi arquitectura y ver en donde estaba fallando, pero lo cierto es que ya me aburri (que es lo peor que le puede pasar a alguien que desarrolla software libre, que deje de divertirse con lo que hace) y deje el proyecto aparcado/abandonado hasta que viera un poco de luz. Es por eso por lo que si veis mi perfil en &lt;a href="https://github.com/piranna"&gt;Github&lt;/a&gt; vereis que le he estado dando un buen empujon a &lt;a href="http://pirannafs.blogspot.com/search/label/PirannaFS"&gt;PirannaFS&lt;/a&gt; en las ultimas semanas: por alguna razon, me sigue motivando e inspirando :-)&lt;br /&gt;&lt;br /&gt;Sin embargo... esa luz llego, aunque fuese solo con forma de cerilla: a traves de la wikipedia llegue por casualidad al sistema operativo &lt;a href="https://github.com/safinaskar/gavin"&gt;Gavin&lt;/a&gt;, y justo en uno de los commits indicaba que estaba usando -O2 al compilar para optimizar el codigo porque añadia una variable y dejaba de arrancar (uno de los problemas que me sucedian a mi) ya que al parecer, al arrancar se dispone de muy poco espacio en memoria para el kernel. Añadir el flag, compilar... y adios problema :-D Asi que aprovechando la buena nueva decidi darle un empujon al gestor de interrupciones y limpiar un poco la arquitectura antes de continuar con la paginacion. Gracias a esto puedo decir: si, mi arquitectura funciona, y es correcta, se puede hacer un sistema operativo puramente orientado a eventos :-D Ahora el problema esta en que por alguna razon los syscalls ya no funcionan correctamente, con lo que no puedo leer del teclado :-( Bien es cierto que una de las razones por las que empece Gaia era precisamente para evitar a la gente en el futuro que se rompiera la cabeza como me la estoy rompiendo yo ahora, pero tampoco me imagine que x86 fuese una plataforma tan mala para trabajar a bajo nivel... :-(&lt;br /&gt;&lt;br /&gt;En fin, permanezcan en antena, a ver si hacemos algo de provecho en las proximas semanas...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6741383955809102317-6004474691649429922?l=pirannafs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pirannafs.blogspot.com/feeds/6004474691649429922/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://pirannafs.blogspot.com/2012/02/gaia-is-back.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6741383955809102317/posts/default/6004474691649429922'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6741383955809102317/posts/default/6004474691649429922'/><link rel='alternate' type='text/html' href='http://pirannafs.blogspot.com/2012/02/gaia-is-back.html' title='Gaia is back'/><author><name>Jesús Leganés Combarro</name><uri>https://profiles.google.com/109968379540878755826</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-G1X-8HwWjfg/AAAAAAAAAAI/AAAAAAAAAAA/RekFnw3Z3WI/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6741383955809102317.post-1600922073277644526</id><published>2011-12-24T02:58:00.002+01:00</published><updated>2011-12-24T02:58:47.513+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Gaia'/><title type='text'>Ho-Ho-Ho</title><content type='html'>Esto de estar de vacaciones es una maravilla, menuda semanita me estoy pegando... :-D Para empezar, estoy viendo a un monton de gente que hacia tiempo que no veia (ayer mismo a una antigua compañera de clase que resulta que tambien le gusta ir a las conferencias de Software Libre :-D ), los examenes no me han ido del todo mal (especialmente Sistemas Operativos, que por un error a la hora de corregir las practicas he pasado de un 3 a un 9.1 :-D ), y encima no solo le he estado dando caña al proyecto sino que cuando les pase a mis colegas de AlcorconWireless el enlace a mi &lt;a href="http://pirannafs.blogspot.com/2011/12/ubersecret.html"&gt;anterior entrada&lt;/a&gt; al blog contando en que iba a consistir el proyecto el comentario que ha soltado uno es mitico:&lt;div&gt;&lt;blockquote class="tr_bq"&gt;Piraña se nos ha hecho mayor. Yo ya no me meto con él que me da sopas con honda XD&lt;br /&gt;Respect!&lt;/blockquote&gt;Epic Win!!! :-D Y ademas, otro dice que se apunta, asi que podre acelerarlo un poco mas :-D Tambien me han dicho que se ve mal el texto con el fondo tan oscuro, a ver si cuando tenga tiempo lo arreglo...&lt;br /&gt;&lt;br /&gt;Pero bueno, al turron (y no a las 4 tabletas que me he comprado esta tarde de oferta en el Dia :-P ): los cambios que le he metido a Gaia realmente han sido numerosos, y la verdad que esta quedando una base muy buena para continuar con el desarrollo mas adelante. Para empezar, he estado estandarizando muchas funciones y poniendolas en comun entre Gaia y Uranus, lo cual teniendo en cuenta que ahora se contruyen como dos librerias estaticas por separado (en prevision a que mas adelante Uranus sea un ejecutable independiente) me esta sirviendo para hacerme una stdlib bastante cuca y quizas tambien para en el futuro poder usar &lt;a href="http://sourceware.org/newlib/"&gt;newlib&lt;/a&gt;, que siempre sera mejor que desarrollar mi propia libreria estandar (aunque no es tan dificil como parece...), y ademas todo apunta a que va a ser la unica manera que voy a tener para poder usar memoria dinamica, porque el tema de la paginacion se me resiente y parece que el &lt;a href="http://www.jamesmolloy.co.uk/tutorial_html"&gt;tutorial&lt;/a&gt; que estaba siguiendo ya solo existe en la cache de Google... :-/ Lo cual no es malo, porque buscando alternativas he descubierto que aunque con no excesivo exito, si ha habido &lt;a href="http://wiki.osdev.org/Extensible_Driver_Interface"&gt;intentos&lt;/a&gt;&amp;nbsp;(algunos incluso &lt;a href="http://www.projectudi.org/"&gt;formales&lt;/a&gt;) de hacer una API estandar para drivers, lo cual me viene bastante interesante... :-) Tambien es cierto que lo estoy procrastinando bastante por el respeto que me impone, pero al menos me sirve para avanzar en otros aspectos :-)&lt;br /&gt;&lt;br /&gt;Pero lo mas importante sin lugar a dudas, ¡los eventos ya funcionan! :-D Por el momento de forma muy rustica y simple por no tener memoria dinamica y estar corriendo todo en espacio de kernel, pero al menos demuestran que el concepto y la arquitectura funcionan. Ademas, el diccionario de tamaño estatico que me he hecho me ha quedado chulisimo, para que luego vayan y me suspendan Estructura de Datos por no saber Pascal... :-P Por el momento solo tengo un evento registrado, "putchar", que es llamado desde prinf(), pero lo registra y lo recoge el driver de la VGA sin problemas, pero teniendo en cuenta que printf() esta dentro de la stdlib por el momento vamos bien :-) Tambien he implementado un pequeño driver para el teclado, pero es mas bien simbolico ya que lo unico que hace es enviar lo que escribe a la pantalla enviando el evento de "putchar" igualmente, luego no se registra ni nada. Por el momento se estan registrando los IRQs directamente, asi que cuando ya haga que pasen por el gestor de eventos ya me pondre a hacer algo serio, ya que tambien tendre que definir el formato de los eventos y eso puede variar mucho, asi que prefiero no hacer demasiado que luego tenga que tirar a la basura.&lt;br /&gt;&lt;br /&gt;Y luego por ultimo en el dia de hoy despues de la paliza que me pegue ayer a patear calles pues me he tirado todo el dia en casita limpiando y organizando el proyecto como dije antes, separando cada parte, unificando librerias... dejandolo preciosista :-D Tambien he estado experimentando ahora que se compilan Gaia y Uranus por separado en que la interfaz de las syscalls sea la misma que en nativo, pero el linker se ha quejado diciendo que los simbolos estan duplicados (lo cual es obvio, idiota de mi). Mañana vere si consigo hacer algo al respecto con algun flag al compilar o algo, que seguro que hay alguna solucion... ;-)&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6741383955809102317-1600922073277644526?l=pirannafs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pirannafs.blogspot.com/feeds/1600922073277644526/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://pirannafs.blogspot.com/2011/12/ho-ho-ho.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6741383955809102317/posts/default/1600922073277644526'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6741383955809102317/posts/default/1600922073277644526'/><link rel='alternate' type='text/html' href='http://pirannafs.blogspot.com/2011/12/ho-ho-ho.html' title='Ho-Ho-Ho'/><author><name>Jesús Leganés Combarro</name><uri>https://profiles.google.com/109968379540878755826</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-G1X-8HwWjfg/AAAAAAAAAAI/AAAAAAAAAAA/RekFnw3Z3WI/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6741383955809102317.post-3918313912576828707</id><published>2011-12-20T19:17:00.004+01:00</published><updated>2011-12-20T19:17:58.241+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Gaia'/><title type='text'>Übersecret</title><content type='html'>¿Y cual es ese nuevo proyecto &lt;a href="http://pirannafs.blogspot.com/2011/12/pirannafs-reloaded.html"&gt;en el que ando enfrascado&lt;/a&gt;&amp;nbsp;tan secreto que a pesar de ser uno de mis proyectos "gordos" solo hay tres personas que conocen de su existencia y entre las tres apenas la entienden media? :-P Pues mi mayor sueño desde los 10 años, el cual ya intente anteriormente dos veces de forma infructuosa y como bien supuse, el desarrollo de PirannaFS me iba a dar la autoconfianza que necesitaba para desarrollarlo de forma definitiva: mi propio sistema operativo... o cuanto menos, mi propio kernel :-D&lt;br /&gt;&lt;br /&gt;ChaOS (originariamente CaOS... cosas del marketing y la proyeccion internacional :-P ),&amp;nbsp;el estado desorden primigenio que dio lugar a "el origen de todo", es un sistema operativo puramente orientado a objetos (al igual que el extinto &lt;a href="http://es.wikipedia.org/wiki/BeOS"&gt;BeOS&lt;/a&gt; o su sucesor &lt;a href="http://haiku-os.org/"&gt;Haiku&lt;/a&gt;) y a eventos (como los sistemas operativos en tiempo real), y diseñado por completo orientado a que sea facil de entender y de mantener. Bajo esta filosofia prescinde por completo de los IOCTLs y compañia: todo son objetos. En este aspecto es diametralmente opuesto a Plan 9, que aunque la idea de llevar Unix al extremo haciendo que "todo sean archivos" esta muy bien... realmente solo es practica para su uso desde la shell. No obstante, si se integrara con Python y potente introspeccion y sus tan extendidos "file-like objects" (acceder a cualquier objeto de forma estandar usando los metodos definidos para los archivos) se podria crear un sistema de programacion bastante versatil y poderoso (y de hecho incluso intente hacer recientemente que ChaOS estuviera escrito en Python para poder explotar esta idea), aunque claro, aqui hay un detalle importante... son objetos ;-)&lt;br /&gt;&lt;br /&gt;Sin embargo, vamos a empezar por lo importante: el kernel. El kernel de ChaOS para aumentar su claridad, seguridad y versatilidad se divide (dividira, en realidad) en dos partes: un microkernel (&lt;a href="http://es.wikipedia.org/wiki/Gea"&gt;Gaia&lt;/a&gt;, "la madre tierra") realmente minimo que corre en el &lt;a href="http://en.wikipedia.org/wiki/Ring_(computer_security)#Supervisor_mode"&gt;anillo 0&lt;/a&gt;&amp;nbsp;que solo actua como envoltura del hardware para permitir un acceso mas homogeneo y controlado por parte del resto del software al estilo de los &lt;a href="http://es.wikipedia.org/wiki/Exon%C3%BAcleo"&gt;exokernels&lt;/a&gt; o los &lt;a href="http://es.wikipedia.org/wiki/Hipervisor"&gt;hipervisores&lt;/a&gt;&amp;nbsp;(calculo que no deberia necesitar mas de 7 syscalls en total), y luego el kernel propiamente dicho (&lt;a href="http://en.wikipedia.org/wiki/Uranus_(mythology)"&gt;Uranus&lt;/a&gt;, "el padre del cielo"... e hijo y amante de Gaia :-P&amp;nbsp;) que corre puramente en espacio de usuario. Si, como un programa mas, ahi esta la gracia del asunto: al estar el kernel en espacio de usuario y no ejecutar codigo privilegiado se obtienen varias ventajas, como que el codigo privilegiado es mucho menor, es mas facil de programar y de depurar... e incluso estoy observando que no me costaria demasiado hacer que "cualquier" programa (notense las comillas, no obstante) se podria hacer que funcionara directamente sobre Gaia sin demasiado esfuerzo... o incluso hacer que Uranus corra como una aplicacion mas el cualquier otro sistema operativo o incluso propiamente dentro de ChaOS (el colmo de la recursion: un sistema operativo corriendo sobre si mismo sin maquinas virtuales. ¿Donde deja eso a &lt;a href="http://en.wikipedia.org/wiki/FreeBSD_jail"&gt;jail&lt;/a&gt;? :-D ).&lt;br /&gt;&lt;br /&gt;Por el momento, he conseguido que Gaia sea capaz de arrancar desde &lt;a href="http://es.wikipedia.org/wiki/GNU_GRUB"&gt;GRUB&lt;/a&gt;&amp;nbsp;dentro de &lt;a href="http://wiki.qemu.org/Main_Page"&gt;QEmu&lt;/a&gt;&amp;nbsp;(ya es mas de lo que habia conseguido hasta ahora...) y tambien registra un pequeño driver en espacio para usuario para el &lt;a href="http://en.wikipedia.org/wiki/Programmable_interval_timer"&gt;PIT&lt;/a&gt; y estoy en proceso del driver de la tarjeta de video en lugar de acceder a ella directamente desde el modo kernel. Vale, lo reconozco, es mentira: todavia estoy ejecutandolo todo en espacio kernel, pero la paginacion me estaba dando problemas por lo que decidi adelantarme con la API, y actualmente ya estan funcionando correctamente a traves de las syscalls (de momento solo 3: in, out y register_interrupt_handler). Aparte el codigo es muy homogeneo y claro entre si, y aunque lo este haciendo en C ya que las otras veces que intente hacerlo en C++ fueron callejones sin salida, los namespaces son muy claros de seguir y no costaria demasiado hacer la conversion en el futuro. Vamos, una joyita de las que me gustan, codigo limpio y claro... :-D&lt;br /&gt;&lt;br /&gt;Ahora que he terminado los examenes me pondre con el motor de eventos para asi poder aislar mas aun cada una de las dos partes (Gaia y Uranus) y que el driver de la VGA este completamente en el "pseudo" espacio de usuario. Despues ya continuare intentando la paginacion de memoria y la ejecucion en espacio de usuario &lt;u&gt;de verdad&lt;/u&gt;, y luego ya creo me planteare si continuar con el desarrollo de Gaia como un cargador de kernels en espacio de usuario como habia pensado hasta ahora, o bien como libreria que añadir a aplicaciones estandar para que se ejecuten sin sistema operativo... o bien como las dos cosas :-D&lt;br /&gt;&lt;br /&gt;P.D.: tengo que irme, el sistema de megafonia de la universidad avisa que tenemos que desalojar el edificio, dicen noseque de unos "egometros" que se han salido de su escala...&lt;br /&gt;&lt;br /&gt;:-P&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6741383955809102317-3918313912576828707?l=pirannafs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pirannafs.blogspot.com/feeds/3918313912576828707/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://pirannafs.blogspot.com/2011/12/ubersecret.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6741383955809102317/posts/default/3918313912576828707'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6741383955809102317/posts/default/3918313912576828707'/><link rel='alternate' type='text/html' href='http://pirannafs.blogspot.com/2011/12/ubersecret.html' title='Übersecret'/><author><name>Jesús Leganés Combarro</name><uri>https://profiles.google.com/109968379540878755826</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-G1X-8HwWjfg/AAAAAAAAAAI/AAAAAAAAAAA/RekFnw3Z3WI/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6741383955809102317.post-7747845868411880167</id><published>2011-12-20T17:25:00.000+01:00</published><updated>2011-12-20T17:51:41.087+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PirannaFS'/><title type='text'>PirannaFS reloaded...</title><content type='html'>6 meses han pasado ya desde mi ultima entrada... y con razón. Los examenes me tuvieron al borde de un suspiro, y gracias al proyecto de Gameloft he sabido lo que es un trabajo de verano de 60 horas a la semana (y pensar que yo queria ser un &lt;a href="http://folklore.org/StoryView.py?story=Pirate_Flag.txt"&gt;pirata&lt;/a&gt;&amp;nbsp;con sus 96 horas...). Luego llego el nuevo curso con un primer cuatrimestre supercargado y faltandome horas por todas partes, asi que dije BASTA: decidi centrarme en los estudios y luego ya veria que haria.&lt;br /&gt;&lt;br /&gt;Eso es lo que decidi hacer... otra cosa es que eso fuese lo que hiciese :-D Que no tuviese tiempo para publicar nada no significa que no hiciese avances, y si hice: MUCHOS.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Para empezar consegui mezclar el codigo de las ramas de PyFilesystem con la de FUSE, con lo que ahora mismo ya tenemos (¡al fin! :-D ) un unico codigo base para las dos. Bien es cierto que la predominante es la de PyFilesystem, pero su orientacion a objetos es mucho mas potente y flexible. Aparte, tambien me va a servir de base para desarrollar las herramientas externas :-)&lt;/li&gt;&lt;li&gt;Por otra parte, tambien he conseguido avances para convertir los archivos y los directorios en plugins externos, aunque por alguna razon unittest no me funciona con Louie, el motor de eventos, por lo que tendre que mirarlo con mas calma.&lt;/li&gt;&lt;li&gt;No obstante, este paron forzoso me vino bien para darle vueltas al tema de hacer PirannaFS un sistema de archivos autocontenido, y creo que gracias los &lt;a href="http://www.sqlite.org/vfs.html"&gt;VFS&lt;/a&gt; de SQLite (y en concreto usando como base &lt;a href="http://www.sqlite.org/src/doc/trunk/src/test_onefile.c"&gt;este ejemplo&lt;/a&gt;&amp;nbsp;para funcionar directamente sin sistema de ficheros) voy a tener la papeleta resuelta, aunque probablemente tendria que sustituir el modulo &lt;a href="http://docs.python.org/library/sqlite3.html"&gt;pysqlite&lt;/a&gt;&amp;nbsp;por &lt;a href="http://code.google.com/p/apsw/"&gt;APSW&lt;/a&gt;. APSW tiene la ventaja de que es un wrapper muy fino, siendo las funciones directas con las de SQLite&amp;nbsp;con lo que es mucho mas rapido y ademas obtiene mas rapido todas las mejoras y nuevas funcionalidades de SQLite (incluido el soporte para &lt;a href="http://apidoc.apsw.googlecode.com/hg/vfs.html"&gt;VFSs&lt;/a&gt;) a diferencia de pysqlite, que intenta pythonizarlas. Aparte tambien esta el echo de que APSW no sigue el &lt;a href="http://www.python.org/dev/peps/pep-0249/"&gt;DB-API 2.0&lt;/a&gt; (aunque su API si es muy parecida), pero al parecer el "anti-ORM" que me he desarrollado con PirannaFS puede resolver la papeleta (a la gente le encanta mi idea de desarrollar funciones y objetos Python a partir de codigo SQL :-D ) y probablemente hasta lo limpie y lo saque como modulo aparte. Luego estaria el tema de como hacer para poder acceder a los plugins, pero eso es otra historia...&lt;/li&gt;&lt;li&gt;Y aparte, tambien se me han ocurrido otras novedades como son las "extensiones", que basicamente son como los plugins pero a diferencia de estos, estan orientados a "extender" funcionalidad ya existente (en lugar de añadir nueva) y por lo tanto no necesitan tablas propias sino que modifican directamente las ya existentes, por lo que su acceso es mucho mas rapido (me ahorro hacer un join... :-D ).&lt;/li&gt;&lt;/ul&gt;Pero aunque PirannaFS sea mi niña mimada (al menos por ahora... :-P ) todo eso por el momento tendra que pasar a un segundo plano, puesto que oh, masoca que soy... me he vuelto a inscribir otra vez en el concurso de programacion, &lt;b&gt;y esta vez voy a por todas&lt;/b&gt;. Solo espero que no haya suspendido ninguna este cuatrimestre y que empieza pueda tenerlo tan tranquilito como me imaginaba al principio... :-P&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6741383955809102317-7747845868411880167?l=pirannafs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pirannafs.blogspot.com/feeds/7747845868411880167/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://pirannafs.blogspot.com/2011/12/pirannafs-reloaded.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6741383955809102317/posts/default/7747845868411880167'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6741383955809102317/posts/default/7747845868411880167'/><link rel='alternate' type='text/html' href='http://pirannafs.blogspot.com/2011/12/pirannafs-reloaded.html' title='PirannaFS reloaded...'/><author><name>Jesús Leganés Combarro</name><uri>https://profiles.google.com/109968379540878755826</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-G1X-8HwWjfg/AAAAAAAAAAI/AAAAAAAAAAA/RekFnw3Z3WI/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6741383955809102317.post-636792471630629353</id><published>2011-06-13T19:41:00.001+02:00</published><updated>2011-06-15T14:30:42.733+02:00</updated><title type='text'>Dadaismo</title><content type='html'>&lt;div&gt;&lt;p&gt;&amp;#191;Que es lo siguiente a surrealismo? Que despues de mes y medio en el paro y mogollon de entrevistas y trabajos de mierda, en el momento en que coges autoestima, te valoras como es debido y das un golpe en la mesa ya no hace falta que busques trabajo... el trabajo te busca a ti: la semana pasada dimiti al segundo dia de empezar a trabajar porque Gameloft me queria en sus filas, y ahora que llevo una semana acaba de llamarme Zinkia para hacer la pelicula de Pocoyo a partir de septiembre. Me han pedido el titulo, pero cuando les he dicho que no lo tengo me han respondido que no me preocupe, que les gusta mucho mi perfil y quizas se pueda hacer un chanchullo. &amp;#191;Que sera lo siguiente, Google para un proyecto de inteligencia artificial para su buscador llamado SkyNet?&lt;/p&gt;&lt;p&gt;Lo dicho: surrealismo en estado puro.&lt;/p&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6741383955809102317-636792471630629353?l=pirannafs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pirannafs.blogspot.com/feeds/636792471630629353/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://pirannafs.blogspot.com/2011/06/dadaismo.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6741383955809102317/posts/default/636792471630629353'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6741383955809102317/posts/default/636792471630629353'/><link rel='alternate' type='text/html' href='http://pirannafs.blogspot.com/2011/06/dadaismo.html' title='Dadaismo'/><author><name>Jesús Leganés Combarro</name><uri>https://profiles.google.com/109968379540878755826</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-G1X-8HwWjfg/AAAAAAAAAAI/AAAAAAAAAAA/RekFnw3Z3WI/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6741383955809102317.post-4896840521752699514</id><published>2011-05-27T16:38:00.000+02:00</published><updated>2011-05-27T16:38:48.587+02:00</updated><title type='text'>TagCrowd</title><content type='html'>Gracias a &lt;a href="http://microsiervos.com/"&gt;microsiervos&lt;/a&gt; he descubierto &lt;a href="http://tagcrowd.com/"&gt;TagCrowd&lt;/a&gt;&amp;nbsp;y al pasarlo por el blog me he encontrado con esto...&lt;br /&gt;&lt;style type="text/css"&gt;&lt;!-- #htmltagcloud{/****************************************** * CUSTOMIZE CLOUD CSS BELOW (optional) */ font-size: 100%; width: auto;  /* auto or fixed width, e.g. 500px   */ font-family:'lucida grande','trebuchet ms',arial,helvetica,sans-serif; background-color:#fff; margin:1em 1em 0 1em; border:2px dotted #ddd; padding:2em; /****************************************** * END CUSTOMIZE */}#htmltagcloud{line-height:2.4em;word-spacing:normal;letter-spacing:normal;text-transform:none;text-align:justify;text-indent:0}#htmltagcloud a:link{text-decoration:none}#htmltagcloud a:visited{text-decoration:none}#htmltagcloud a:hover{color:white;background-color:#05f}#htmltagcloud a:active{color:white;background-color:#03d}.wrd{padding:0;position:relative}.wrd a{text-decoration:none}.tagcloud0{font-size:1.0em;color:#ACC1F3;z-index:10}.tagcloud0 a{color:#ACC1F3}.tagcloud1{font-size:1.4em;color:#ACC1F3;z-index:9}.tagcloud1 a{color:#ACC1F3}.tagcloud2{font-size:1.8em;color:#86A0DC;z-index:8}.tagcloud2 a{color:#86A0DC}.tagcloud3{font-size:2.2em;color:#86A0DC;z-index:7}.tagcloud3 a{color:#86A0DC}.tagcloud4{font-size:2.6em;color:#607EC5;z-index:6}.tagcloud4 a{color:#607EC5}.tagcloud5{font-size:3.0em;color:#607EC5;z-index:5}.tagcloud5 a{color:#607EC5}.tagcloud6{font-size:3.3em;color:#4C6DB9;z-index:4}.tagcloud6 a{color:#4C6DB9}.tagcloud7{font-size:3.6em;color:#395CAE;z-index:3}.tagcloud7 a{color:#395CAE}.tagcloud8{font-size:3.9em;color:#264CA2;z-index:2}.tagcloud8 a{color:#264CA2}.tagcloud9{font-size:4.2em;color:#133B97;z-index:1}.tagcloud9 a{color:#133B97}.tagcloud10{font-size:4.5em;color:#002A8B;z-index:0}.tagcloud10 a{color:#002A8B}.freq{font-size:10pt !important;color:#bbb}#credit{text-align:center;color:#333;margin-bottom:0.6em;font:0.7em 'lucida grande',trebuchet,'trebuchet ms',verdana,arial,helvetica,sans-serif}#credit a:link{color:#777;text-decoration:none}#credit a:visited{color:#777;text-decoration:none}#credit a:hover{color:white;background-color:#05f}#credit a:active{text-decoration:underline}// --&gt;&lt;/style&gt;&lt;br /&gt;&lt;br /&gt;&lt;div id="htmltagcloud"&gt;&lt;span class="wrd tagcloud7" id="0"&gt;&lt;a href="http://www.blogger.com/post-create.g?blogID=6741383955809102317#tagcloud"&gt;-d&lt;span class="freq"&gt;&amp;nbsp;(18)&lt;/span&gt;&lt;/a&gt;&lt;/span&gt; &lt;span class="wrd tagcloud4" id="1"&gt;&lt;a href="http://www.blogger.com/post-create.g?blogID=6741383955809102317#tagcloud"&gt;-p&lt;span class="freq"&gt;&amp;nbsp;(11)&lt;/span&gt;&lt;/a&gt;&lt;/span&gt; &lt;span class="wrd tagcloud3" id="2"&gt;&lt;a href="http://www.blogger.com/post-create.g?blogID=6741383955809102317#tagcloud"&gt;aparte&lt;span class="freq"&gt;&amp;nbsp;(10)&lt;/span&gt;&lt;/a&gt;&lt;/span&gt; &lt;span class="wrd tagcloud7" id="3"&gt;&lt;a href="http://www.blogger.com/post-create.g?blogID=6741383955809102317#tagcloud"&gt;archivos&lt;span class="freq"&gt;&amp;nbsp;(16)&lt;/span&gt;&lt;/a&gt;&lt;/span&gt; &lt;span class="wrd tagcloud2" id="4"&gt;&lt;a href="http://www.blogger.com/post-create.g?blogID=6741383955809102317#tagcloud"&gt;blog&lt;span class="freq"&gt;&amp;nbsp;(9)&lt;/span&gt;&lt;/a&gt;&lt;/span&gt; &lt;span class="wrd tagcloud1" id="5"&gt;&lt;a href="http://www.blogger.com/post-create.g?blogID=6741383955809102317#tagcloud"&gt;buzz&lt;span class="freq"&gt;&amp;nbsp;(7)&lt;/span&gt;&lt;/a&gt;&lt;/span&gt; &lt;span class="wrd tagcloud2" id="6"&gt;&lt;a href="http://www.blogger.com/post-create.g?blogID=6741383955809102317#tagcloud"&gt;cierto&lt;span class="freq"&gt;&amp;nbsp;(8)&lt;/span&gt;&lt;/a&gt;&lt;/span&gt; &lt;span class="wrd tagcloud6" id="7"&gt;&lt;a href="http://www.blogger.com/post-create.g?blogID=6741383955809102317#tagcloud"&gt;codigo&lt;span class="freq"&gt;&amp;nbsp;(14)&lt;/span&gt;&lt;/a&gt;&lt;/span&gt; &lt;span class="wrd tagcloud2" id="8"&gt;&lt;a href="http://www.blogger.com/post-create.g?blogID=6741383955809102317#tagcloud"&gt;comentarios&lt;span class="freq"&gt;&amp;nbsp;(8)&lt;/span&gt;&lt;/a&gt;&lt;/span&gt; &lt;span class="wrd tagcloud9" id="9"&gt;&lt;a href="http://www.blogger.com/post-create.g?blogID=6741383955809102317#tagcloud"&gt;compartir&lt;span class="freq"&gt;&amp;nbsp;(21)&lt;/span&gt;&lt;/a&gt;&lt;/span&gt; &lt;span class="wrd tagcloud2" id="10"&gt;&lt;a href="http://www.blogger.com/post-create.g?blogID=6741383955809102317#tagcloud"&gt;correo&lt;span class="freq"&gt;&amp;nbsp;(9)&lt;/span&gt;&lt;/a&gt;&lt;/span&gt; &lt;span class="wrd tagcloud1" id="11"&gt;&lt;a href="http://www.blogger.com/post-create.g?blogID=6741383955809102317#tagcloud"&gt;desarrollar&lt;span class="freq"&gt;&amp;nbsp;(7)&lt;/span&gt;&lt;/a&gt;&lt;/span&gt; &lt;span class="wrd tagcloud0" id="12"&gt;&lt;a href="http://www.blogger.com/post-create.g?blogID=6741383955809102317#tagcloud"&gt;disea&lt;span class="freq"&gt;&amp;nbsp;(6)&lt;/span&gt;&lt;/a&gt;&lt;/span&gt; &lt;span class="wrd tagcloud0" id="13"&gt;&lt;a href="http://www.blogger.com/post-create.g?blogID=6741383955809102317#tagcloud"&gt;documentacion&lt;span class="freq"&gt;&amp;nbsp;(6)&lt;/span&gt;&lt;/a&gt;&lt;/span&gt; &lt;span class="wrd tagcloud1" id="14"&gt;&lt;a href="http://www.blogger.com/post-create.g?blogID=6741383955809102317#tagcloud"&gt;electra3nico&lt;span class="freq"&gt;&amp;nbsp;(7)&lt;/span&gt;&lt;/a&gt;&lt;/span&gt; &lt;span class="wrd tagcloud0" id="15"&gt;&lt;a href="http://www.blogger.com/post-create.g?blogID=6741383955809102317#tagcloud"&gt;empezar&lt;span class="freq"&gt;&amp;nbsp;(6)&lt;/span&gt;&lt;/a&gt;&lt;/span&gt; &lt;span class="wrd tagcloud1" id="16"&gt;&lt;a href="http://www.blogger.com/post-create.g?blogID=6741383955809102317#tagcloud"&gt;enviar&lt;span class="freq"&gt;&amp;nbsp;(7)&lt;/span&gt;&lt;/a&gt;&lt;/span&gt; &lt;span class="wrd tagcloud1" id="17"&gt;&lt;a href="http://www.blogger.com/post-create.g?blogID=6741383955809102317#tagcloud"&gt;era&lt;span class="freq"&gt;&amp;nbsp;(7)&lt;/span&gt;&lt;/a&gt;&lt;/span&gt; &lt;span class="wrd tagcloud1" id="18"&gt;&lt;a href="http://www.blogger.com/post-create.g?blogID=6741383955809102317#tagcloud"&gt;escribe&lt;span class="freq"&gt;&amp;nbsp;(7)&lt;/span&gt;&lt;/a&gt;&lt;/span&gt; &lt;span class="wrd tagcloud1" id="19"&gt;&lt;a href="http://www.blogger.com/post-create.g?blogID=6741383955809102317#tagcloud"&gt;facebook&lt;span class="freq"&gt;&amp;nbsp;(7)&lt;/span&gt;&lt;/a&gt;&lt;/span&gt; &lt;span class="wrd tagcloud5" id="20"&gt;&lt;a href="http://www.blogger.com/post-create.g?blogID=6741383955809102317#tagcloud"&gt;fuse&lt;span class="freq"&gt;&amp;nbsp;(13)&lt;/span&gt;&lt;/a&gt;&lt;/span&gt; &lt;span class="wrd tagcloud2" id="21"&gt;&lt;a href="http://www.blogger.com/post-create.g?blogID=6741383955809102317#tagcloud"&gt;google&lt;span class="freq"&gt;&amp;nbsp;(8)&lt;/span&gt;&lt;/a&gt;&lt;/span&gt; &lt;span class="wrd tagcloud7" id="22"&gt;&lt;a href="http://www.blogger.com/post-create.g?blogID=6741383955809102317#tagcloud"&gt;hacer&lt;span class="freq"&gt;&amp;nbsp;(17)&lt;/span&gt;&lt;/a&gt;&lt;/span&gt; &lt;span class="wrd tagcloud10" id="23"&gt;&lt;a href="http://www.blogger.com/post-create.g?blogID=6741383955809102317#tagcloud"&gt;he&lt;span class="freq"&gt;&amp;nbsp;(24)&lt;/span&gt;&lt;/a&gt;&lt;/span&gt; &lt;span class="wrd tagcloud0" id="24"&gt;&lt;a href="http://www.blogger.com/post-create.g?blogID=6741383955809102317#tagcloud"&gt;hecho&lt;span class="freq"&gt;&amp;nbsp;(6)&lt;/span&gt;&lt;/a&gt;&lt;/span&gt; &lt;span class="wrd tagcloud0" id="25"&gt;&lt;a href="http://www.blogger.com/post-create.g?blogID=6741383955809102317#tagcloud"&gt;lugar&lt;span class="freq"&gt;&amp;nbsp;(6)&lt;/span&gt;&lt;/a&gt;&lt;/span&gt; &lt;span class="wrd tagcloud1" id="26"&gt;&lt;a href="http://www.blogger.com/post-create.g?blogID=6741383955809102317#tagcloud"&gt;otro&lt;span class="freq"&gt;&amp;nbsp;(7)&lt;/span&gt;&lt;/a&gt;&lt;/span&gt; &lt;span class="wrd tagcloud1" id="27"&gt;&lt;a href="http://www.blogger.com/post-create.g?blogID=6741383955809102317#tagcloud"&gt;pequea&lt;span class="freq"&gt;&amp;nbsp;(7)&lt;/span&gt;&lt;/a&gt;&lt;/span&gt; &lt;span class="wrd tagcloud2" id="28"&gt;&lt;a href="http://www.blogger.com/post-create.g?blogID=6741383955809102317#tagcloud"&gt;piraa&lt;span class="freq"&gt;&amp;nbsp;(8)&lt;/span&gt;&lt;/a&gt;&lt;/span&gt; &lt;span class="wrd tagcloud7" id="29"&gt;&lt;a href="http://www.blogger.com/post-create.g?blogID=6741383955809102317#tagcloud"&gt;pirannafs&lt;span class="freq"&gt;&amp;nbsp;(18)&lt;/span&gt;&lt;/a&gt;&lt;/span&gt; &lt;span class="wrd tagcloud1" id="30"&gt;&lt;a href="http://www.blogger.com/post-create.g?blogID=6741383955809102317#tagcloud"&gt;plugins&lt;span class="freq"&gt;&amp;nbsp;(7)&lt;/span&gt;&lt;/a&gt;&lt;/span&gt; &lt;span class="wrd tagcloud7" id="31"&gt;&lt;a href="http://www.blogger.com/post-create.g?blogID=6741383955809102317#tagcloud"&gt;proyecto&lt;span class="freq"&gt;&amp;nbsp;(17)&lt;/span&gt;&lt;/a&gt;&lt;/span&gt; &lt;span class="wrd tagcloud2" id="32"&gt;&lt;a href="http://www.blogger.com/post-create.g?blogID=6741383955809102317#tagcloud"&gt;publicado&lt;span class="freq"&gt;&amp;nbsp;(8)&lt;/span&gt;&lt;/a&gt;&lt;/span&gt; &lt;span class="wrd tagcloud5" id="33"&gt;&lt;a href="http://www.blogger.com/post-create.g?blogID=6741383955809102317#tagcloud"&gt;pyfilesystem&lt;span class="freq"&gt;&amp;nbsp;(13)&lt;/span&gt;&lt;/a&gt;&lt;/span&gt; &lt;span class="wrd tagcloud0" id="34"&gt;&lt;a href="http://www.blogger.com/post-create.g?blogID=6741383955809102317#tagcloud"&gt;python-fuse&lt;span class="freq"&gt;&amp;nbsp;(6)&lt;/span&gt;&lt;/a&gt;&lt;/span&gt; &lt;span class="wrd tagcloud2" id="35"&gt;&lt;a href="http://www.blogger.com/post-create.g?blogID=6741383955809102317#tagcloud"&gt;python&lt;span class="freq"&gt;&amp;nbsp;(8)&lt;/span&gt;&lt;/a&gt;&lt;/span&gt; &lt;span class="wrd tagcloud0" id="36"&gt;&lt;a href="http://www.blogger.com/post-create.g?blogID=6741383955809102317#tagcloud"&gt;realmente&lt;span class="freq"&gt;&amp;nbsp;(6)&lt;/span&gt;&lt;/a&gt;&lt;/span&gt; &lt;span class="wrd tagcloud1" id="37"&gt;&lt;a href="http://www.blogger.com/post-create.g?blogID=6741383955809102317#tagcloud"&gt;sea&lt;span class="freq"&gt;&amp;nbsp;(7)&lt;/span&gt;&lt;/a&gt;&lt;/span&gt; &lt;span class="wrd tagcloud0" id="38"&gt;&lt;a href="http://www.blogger.com/post-create.g?blogID=6741383955809102317#tagcloud"&gt;semanas&lt;span class="freq"&gt;&amp;nbsp;(6)&lt;/span&gt;&lt;/a&gt;&lt;/span&gt; &lt;span class="wrd tagcloud5" id="39"&gt;&lt;a href="http://www.blogger.com/post-create.g?blogID=6741383955809102317#tagcloud"&gt;sistema&lt;span class="freq"&gt;&amp;nbsp;(12)&lt;/span&gt;&lt;/a&gt;&lt;/span&gt; &lt;span class="wrd tagcloud0" id="40"&gt;&lt;a href="http://www.blogger.com/post-create.g?blogID=6741383955809102317#tagcloud"&gt;sistemas&lt;span class="freq"&gt;&amp;nbsp;(6)&lt;/span&gt;&lt;/a&gt;&lt;/span&gt; &lt;span class="wrd tagcloud5" id="41"&gt;&lt;a href="http://www.blogger.com/post-create.g?blogID=6741383955809102317#tagcloud"&gt;tener&lt;span class="freq"&gt;&amp;nbsp;(12)&lt;/span&gt;&lt;/a&gt;&lt;/span&gt; &lt;span class="wrd tagcloud2" id="42"&gt;&lt;a href="http://www.blogger.com/post-create.g?blogID=6741383955809102317#tagcloud"&gt;tengo&lt;span class="freq"&gt;&amp;nbsp;(8)&lt;/span&gt;&lt;/a&gt;&lt;/span&gt; &lt;span class="wrd tagcloud2" id="43"&gt;&lt;a href="http://www.blogger.com/post-create.g?blogID=6741383955809102317#tagcloud"&gt;test&lt;span class="freq"&gt;&amp;nbsp;(8)&lt;/span&gt;&lt;/a&gt;&lt;/span&gt; &lt;span class="wrd tagcloud3" id="44"&gt;&lt;a href="http://www.blogger.com/post-create.g?blogID=6741383955809102317#tagcloud"&gt;tiempo&lt;span class="freq"&gt;&amp;nbsp;(10)&lt;/span&gt;&lt;/a&gt;&lt;/span&gt; &lt;span class="wrd tagcloud3" id="45"&gt;&lt;a href="http://www.blogger.com/post-create.g?blogID=6741383955809102317#tagcloud"&gt;trabajo&lt;span class="freq"&gt;&amp;nbsp;(10)&lt;/span&gt;&lt;/a&gt;&lt;/span&gt; &lt;span class="wrd tagcloud1" id="46"&gt;&lt;a href="http://www.blogger.com/post-create.g?blogID=6741383955809102317#tagcloud"&gt;twitter&lt;span class="freq"&gt;&amp;nbsp;(7)&lt;/span&gt;&lt;/a&gt;&lt;/span&gt; &lt;span class="wrd tagcloud0" id="47"&gt;&lt;a href="http://www.blogger.com/post-create.g?blogID=6741383955809102317#tagcloud"&gt;unidades&lt;span class="freq"&gt;&amp;nbsp;(6)&lt;/span&gt;&lt;/a&gt;&lt;/span&gt; &lt;span class="wrd tagcloud0" id="48"&gt;&lt;a href="http://www.blogger.com/post-create.g?blogID=6741383955809102317#tagcloud"&gt;ver&lt;span class="freq"&gt;&amp;nbsp;(6)&lt;/span&gt;&lt;/a&gt;&lt;/span&gt; &lt;span class="wrd tagcloud2" id="49"&gt;&lt;a href="http://www.blogger.com/post-create.g?blogID=6741383955809102317#tagcloud"&gt;voy&lt;span class="freq"&gt;&amp;nbsp;(8)&lt;/span&gt;&lt;/a&gt;&lt;/span&gt; &lt;/div&gt;&lt;div id="credit"&gt;created at &lt;a href="http://tagcrowd.com/"&gt;TagCrowd.com&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Ese "compartir" sin lugar a dudas tiene un cierto lugar de honor... :-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6741383955809102317-4896840521752699514?l=pirannafs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pirannafs.blogspot.com/feeds/4896840521752699514/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://pirannafs.blogspot.com/2011/05/tagcrowd.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6741383955809102317/posts/default/4896840521752699514'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6741383955809102317/posts/default/4896840521752699514'/><link rel='alternate' type='text/html' href='http://pirannafs.blogspot.com/2011/05/tagcrowd.html' title='TagCrowd'/><author><name>Jesús Leganés Combarro</name><uri>https://profiles.google.com/109968379540878755826</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-G1X-8HwWjfg/AAAAAAAAAAI/AAAAAAAAAAA/RekFnw3Z3WI/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6741383955809102317.post-6610424044324888765</id><published>2011-04-19T14:24:00.000+02:00</published><updated>2011-11-30T17:57:30.714+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PirannaFS'/><title type='text'>Las gallinas que entran por las que salen</title><content type='html'>El viernes pasado fue la final de Madrid del concurso, al igual que el jueves tuve el examen de Fundamentos de los Computadores, y dejando de lado que ya se que no tengo perdon de FSM por tardar tanto en comentar el resultado del partido, lo cierto es que he estado bastante liado/agobiado estos dias.&lt;br /&gt;&lt;br /&gt;Las noticias buenas, primero que creo que al final despues de 5 años me he quitado al fin la famosa asignatura :-D No se porque razon, pero la electronica se me atraganto sobremanera, y eso teniendo en cuenta que me meti en informatica por culpa de que la electronica se me quedaba pequeña... Y la segunda... &lt;b&gt;Piranna wins!!!&lt;/b&gt; :-D Contra todo pronostico y en especial el mio, ¡resulta que PirannaFS ha ganado! :-D Empece el proyecto por hobbie, nada especial, y ademas era muy "friki" y especifico cuando habia otros que estaban mas orientados a la comunidad. Aparte, de los que estuvimos en la final realmente yo habria apostado por los de los demas (cORMoran me parecio bastante practico, e InfantView yo ya le saque alguna que otra utilidad practica...), asi que normal que todos me miraran con cara rara cuando me entro la risa floja cuando me entere que habia ganado porque todavia no me lo creia :-P Pero bueno, no deja de ser ironico que no me cogiese la promocion de la tablet del ABC aprovechando que trabajaba alli y que ahora tenga una Galaxy Tab para sustituir a mi pobre Spica... :-D&lt;br /&gt;&lt;br /&gt;En cualquier caso las dos proximas semanas el proyecto va a estar parado debido a que voy a estar estudiando Java para el examen de Orientacion a Objetos (si, a la vejez viruelas, quien lo diria...), y como no puedo estar haciendo una sola cosa, pues voy a aprovechar para aprender Android y desarrollar el cliente en Java de &lt;a href="http://www.unhosted.org/"&gt;UnHosted&lt;/a&gt; todo a la vez. Como dijo el pirata, "la vida es corta pero ancha"... :-D&lt;br /&gt;&lt;br /&gt;Ahora las malas, y es que a pesar de ser "un tecnico extraordinario" (palabras literales)&amp;nbsp;me despidieron del trabajo&amp;nbsp;porque no buscaban un perfil tan tecnico sino "alguien mas de gestion o administracion capaz de atender al cliente". En resumen, yo preocupandome siempre de que mi codigo hablara por mi y ahora resulta que lo que hay que hacer si quieres seguir ascendiendo es saber colocar correctamente un lazo rosa para que no se vean las grietas ni se desmorone el invento. Pues mira, ellos se pierden el tener un campeon entre sus tropas. Al final cuando hasta en el trabajo te dicen directa o indirectamente que si quieres desarrollar una carrera puramente tecnica te tienes que ir a Estados Unidos, agua lleva.&lt;br /&gt;&lt;br /&gt;Esta claro, no podian pasarme tantas cosas buenas en una semana sin riesgo de provocar un desequilibrio en la constante espacio-tiempo. Maldito karma...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6741383955809102317-6610424044324888765?l=pirannafs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pirannafs.blogspot.com/feeds/6610424044324888765/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://pirannafs.blogspot.com/2011/04/las-gallinas-que-entran-por-las-que.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6741383955809102317/posts/default/6610424044324888765'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6741383955809102317/posts/default/6610424044324888765'/><link rel='alternate' type='text/html' href='http://pirannafs.blogspot.com/2011/04/las-gallinas-que-entran-por-las-que.html' title='Las gallinas que entran por las que salen'/><author><name>Jesús Leganés Combarro</name><uri>https://profiles.google.com/109968379540878755826</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-G1X-8HwWjfg/AAAAAAAAAAI/AAAAAAAAAAA/RekFnw3Z3WI/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6741383955809102317.post-8324692419314619958</id><published>2011-04-06T21:31:00.000+02:00</published><updated>2011-11-30T17:57:30.726+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='diseño'/><category scheme='http://www.blogger.com/atom/ns#' term='PirannaFS'/><title type='text'>Fahrenheit 1832</title><content type='html'>Semanita de aupa llevo, y semanita de aupa me espera. Semanita llevo, porque he "intentado" (no existe una palabra mejor...) mezclar las dos ramas de PirannaFS (FUSE y PyFilesystem) y el repositorio ha acabado como era previsible: apocalipsis post-nuclear y terminar metiendo los archivos a mano de nuevo (con esto ya si que me paso definitivamente a GIT), al hacerlo me he encontrado bugs al prepararlo todo para la integracion (y aqui me veis, un dia antes de terminado el plazo haciendo todavia la memoria) y encima al empezar a hacer las pruebas directamente sobre el disco he descubierto que SQLite es mucho mas lento de lo que pensaba por pura paranoia y voy a tener que configurarlo y optimizarlo muchisimo antes de tener algo usable. Semanita me espera, porque el jueves tengo examen de Fundamentos de los Computadores (y no he estudiado...), el viernes tengo la presentacion del proyecto (y todavia no la he preparado...) y encima me he comprometido a hacer la version Java-Android de &lt;a href="http://www.unhosted.org/"&gt;UnHosted&lt;/a&gt; en lugar de las &lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;aburridas, inutiles y nada practicas&lt;/span&gt; practicas de POO para el examen de dentro de 3 semanas. Me encanta vivir al limite... :-D&lt;br /&gt;&lt;br /&gt;Pero bueno, no todo son buenas noticias, tambien he conseguido sacar tiempo para hacer la memoria del proyecto, y la teneis en la pagina de &lt;a href="http://pirannafs.blogspot.com/p/documentacion.html"&gt;documentacion&lt;/a&gt;. Tambien estoy aprovechando a desarrollar toda la documentacion del proyecto para tenerlo centralizado en algun sitio y que sea usable por otras personas, y una de las cosas mas importantes es la estructura de clases, la cual ademas me ha permitido ver algunos detallitos y hacer algunas optimizaciones (siempre se me ha dado bien la memoria espacial... :-D ).&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-0zrQM9I5MdY/TZy4rC7JkaI/AAAAAAAAAQw/eYLBbukd-o8/s1600/Clases_2011-04-03.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="331" src="http://4.bp.blogspot.com/-0zrQM9I5MdY/TZy4rC7JkaI/AAAAAAAAAQw/eYLBbukd-o8/s640/Clases_2011-04-03.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Vamos a explicar las partes. En primer lugar vemos un conjunto de clases fuera del paquete de PirannaFS a la derecha de este. Son el conjunto de clases encargadas del sistema de plugins, junto con los plugins encargados de los checksums, el log y los links simbolicos (obviamente, todos ellos en la carpeta de plugins... :-D ). Ya dentro de PirannaFS vemos un par de paquetes para las interfaces de FUSE y de PyFilesystem. Obviamente las clases de FUSE estan vacias porque tengo que adaptarlas a la nueva estructura, asi que nos centraremos en la de PyFilesystem. Ahi vemos tres clases: Filesystem, Dir y File, que heredan de sus correspondientes dentro del core, las cuales tienen sus referencias a la base de datos y al dispositivo. Ahora mismo tienen casi toda su funcionalidad dentro a la espera de que se vayan "destilando" al core a medida que reintegre la interfaz de FUSE. Como se ve la estructura por capas es realmente sencilla puesto que he desarrollado el codigo alrededor de las funciones correspondientes a las interfaces (de ahi que casi todo el codigo este ahora mismo dentro de los paquetes FUSE y PyFilesystem) y porque todo el trabajo duro se lo esta llevando la base de datos (de ahi que sea tan lenta...). Luego cuando convierta Dir y File en plugins propios ya veremos que pasa con todo esto... :-P&lt;br /&gt;&lt;br /&gt;Y bueno, aparte de eso, tambien estoy pensando si en lugar de acceder a la base de datos directamente no hacerme un controlador independiente... Eso me permitiria varias ventajas, como el poder serializarlo todo para que tenga soporte multihilo (se le lanzan peticiones y ya se encargara de resolverlas cuando pueda), cachear las peticiones para que funcione mas rapido el sistema (si solo accede el al sistema no deberia haber problema de que esten desactualizados) o incluso simplificar el proceso de sacar el codigo SQL a archivos externos y cargarlos al principio incluso por parte de los plugins... Pura poesia... :-D&lt;br /&gt;&lt;br /&gt;PD: Fahrenheit 1832 es la temperatura a la que arde el silicio en contacto con el aire, convirtiendose en SiO2. &lt;i&gt;Nunca maldigo mi suerteeeeee, porque yo friki naciiiii...&lt;/i&gt; :-P&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6741383955809102317-8324692419314619958?l=pirannafs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pirannafs.blogspot.com/feeds/8324692419314619958/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://pirannafs.blogspot.com/2011/04/fahrenheit-1832.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6741383955809102317/posts/default/8324692419314619958'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6741383955809102317/posts/default/8324692419314619958'/><link rel='alternate' type='text/html' href='http://pirannafs.blogspot.com/2011/04/fahrenheit-1832.html' title='Fahrenheit 1832'/><author><name>Jesús Leganés Combarro</name><uri>https://profiles.google.com/109968379540878755826</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-G1X-8HwWjfg/AAAAAAAAAAI/AAAAAAAAAAA/RekFnw3Z3WI/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-0zrQM9I5MdY/TZy4rC7JkaI/AAAAAAAAAQw/eYLBbukd-o8/s72-c/Clases_2011-04-03.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6741383955809102317.post-4501809018754094306</id><published>2011-03-30T16:16:00.000+02:00</published><updated>2011-11-30T17:57:30.707+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PirannaFS'/><title type='text'>Minority Report</title><content type='html'>Pequeña nota aprovechando un pequeño descanso en el curro mientras se configura el Ubuntu que acabo de instalarle: solo decir que debido a lo caotico que se me presenta el mes de abril entre examenes (¿¿¿quien ha sido el que me ha puesto el examen de Fundamentos de los Computadores justo UN DÍA ANTES de la presentación de PirannaFS???), trabajo, presentaciones y memorias, me voy a centrar durante las dos proximas semanas (aparte de a estudiar) a documentar el proyecto tanto rellenando los DocStrings de las funciones como creando diagramas, haciendo la memoria del proyecto y preparando la presentación que tendre en la final de Madrid del dia 15 de Abril. No tengo nada planeado al respecto, asi que debido a la falta de tiempo de hacer algo mas especifico aprovechare a desarrollar toda la documentacion de forma que me valga para todos los frentes que se me han presentado abiertos. Es por eso que de momento la documentacion se encontrara en la &lt;a href="https://forja.rediris.es/projects/cusl5-pirannafs/"&gt;forja de Red Iris&lt;/a&gt;, donde podreis encontrar &lt;b&gt;absolutamente&lt;/b&gt; todo el material relaccionado con PirannaFS (excepto lo publicado en este blog, que se encargan de guardarmelo muy amablemente los chicos de Google... :-D ).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6741383955809102317-4501809018754094306?l=pirannafs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pirannafs.blogspot.com/feeds/4501809018754094306/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://pirannafs.blogspot.com/2011/03/minority-report.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6741383955809102317/posts/default/4501809018754094306'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6741383955809102317/posts/default/4501809018754094306'/><link rel='alternate' type='text/html' href='http://pirannafs.blogspot.com/2011/03/minority-report.html' title='Minority Report'/><author><name>Jesús Leganés Combarro</name><uri>https://profiles.google.com/109968379540878755826</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-G1X-8HwWjfg/AAAAAAAAAAI/AAAAAAAAAAA/RekFnw3Z3WI/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6741383955809102317.post-5562616141416415993</id><published>2011-03-21T20:03:00.000+01:00</published><updated>2011-11-30T17:57:30.710+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PirannaFS'/><category scheme='http://www.blogger.com/atom/ns#' term='tests'/><title type='text'>PirannaFS Reloaded</title><content type='html'>Dos meses y medio, el ritmo decrece... :-P Lo cierto es que como bien predije este cuatrimestre iba a ser de aupa, y lo ha sido: jornadas de 12 horas, mudanza y media hora mas de transporte... y trabajo para casa los fines de semana. Por suerte hace dos semanas se hizo la presentación de los trenes y no solo la señora &lt;a href="http://es.wikipedia.org/wiki/Cristina_Fern%C3%A1ndez_de_Kirchner"&gt;Cristina Fernández de Kirchner&lt;/a&gt; (para que veais como cotiza el niño... :-D ), sino que encima antes de que se terminara el proyecto conseguí trabajo en Vocento, y tiro oca porque me toca: estoy en todo el centro, tardo la mitad en llegar, el horario es flexible, las horas son ajustadas, el ambiente es agradable, el trabajo es tranquilo... y me pagan un 33% mas. Vamos, que me ha tocado la primitiva :-D Es por eso que despues de varios meses de estress y no dormir no solo vuelvo a tener fuerzas para estudiar en el tren sino que mucho mas importante, vuelvo a tener TIEMPO, y es por eso por lo que en las dos ultimas semanas le he pegado un chute bien fuerte a PirannaFS :-D&lt;br /&gt;&lt;br /&gt;Para empezar, finalmente pude probar como seria el sistema usando PyFilesystem, y no hay lugar a dudas: me ha convencido. Dejando de lado que por su filosofia tan pythonica se queda a bastante alto nivel de lo que seria un sistema de archivos normal (el acceso a los sectores no se hace directamente sino a nivel de archivos...) lo cierto es que su uso de excepciones hasta la estenuación lo hace realmente potente y sencillo de programar: adios a comprobar continuamente valores de retorno que no nos atañen, si no nos interesa una excepcion ya habra otro que se encargue. Relax... y una limpieza de codigo y un estilo Zen minimalista increible. ¡Si hasta en algunos casos los comentarios de cabecera ocupan mas que el codigo! :-P&lt;br /&gt;&lt;br /&gt;Ademas, este reinicio cual ave Phoenix me ha permitido el encontrar algunos fallos ciertamente molestos y solventar algunas idiosincrasias como el hecho de que la longitud de los chunks empezara en 1 para apuntar siempre al siempre simplemente por ahorrar algunas sumas de vez en cuando, aparte de poder limpiar codigo y encontrar soluciones mas optimas a algunos problemas, lo cual me ha llevado a pensar que al tener ahora un nucleo mas limpio, quizas si sea buena idea el tener tambien una version Python-FUSE del sistema de archivos saltandome algunas capas de abstraccion de PyFilesystem. Al fin y al cabo, el usar excepciones en lugar de retornar valores de error era el paso logico a dar para tener un codigo en condiciones, hoy dia el hacer las cosas al "estilo C", por muy simple, portable y optimo que pudiese ser, es un sin sentido teniendo opciones mas potentes (mismamente C++).&lt;br /&gt;&lt;br /&gt;Ahora bien, despues de haberme metido en faena, efectivamente PyFilesystem no es la panacea: todavia esta muy verde e inmaduro, y no esta pensado para desarrollar sistemas de archivos nativos... ni parece que tengan intencion de hacerlo. Al igual que FUSE era famoso porque aparecieron multitud de sistemas de archivos "de juguete" (los sistemas de archivos para acceder a sistemas online son legion) esa filosofia es mucho mas real en PyFilesystem, lo cual tampoco es malo si lo que se pretende es que sea mas facil el desarrollo de sistemas de archivos. Sin embargo esta facilidad lleva implicita cierta abstraccion como es el hecho de acceder a nivel de ficheros (al menos, al ser "file-like objects", la integracion y uso de estos directamente en codigo python externo es directo), y tambien hay algunas decisiones como la ausencia directorio actual y el que los directorios realmente sean sub-sistemas de archivos (logico desde un punto de vista jerarquico-recursivo...) lo hace un poco extraño y dificil de manejar, aparte de que no hay definidas clases neutras desde las que poder heredar de _nada_. Al menos he intentado solucionar estos fallos en mi implementacion de PirannaFS sobre PyFilesystem, asi que cuando lo tenga mas fino y estable los adaptare a la libreria y enviare los parches correspondientes a ver que pasa :-)&lt;br /&gt;&lt;br /&gt;Y recuerden niños: no olviden &lt;strike&gt;supervitaminarse y supermineralizarse&lt;/strike&gt; hacer unidades de test &lt;b&gt;para todo&lt;/b&gt;: no veais el subidon de adrenalina que da despues de haber hecho una metamorfosis completa del codigo el no saber por donde empezar a comprobar que todo esta bien, encontrarse perdido dentro del codigo de PyFilesystem unas unidades de test basicas, ver como te dicen exactamente donde estan los fallos (incluso algunos que ni siquiera suponias que podrias llegar a tener, como es la corrupcion de archivos de gran tamaño) e ir resolviendolos uno a uno (a veces mas ;-) ) poquito a poco y pasar de no superar ninguno de los 49 a que solo queden 10 y la mayoria relaccionados con los hilos... :-D&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6741383955809102317-5562616141416415993?l=pirannafs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pirannafs.blogspot.com/feeds/5562616141416415993/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://pirannafs.blogspot.com/2011/03/pirannafs-reloaded.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6741383955809102317/posts/default/5562616141416415993'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6741383955809102317/posts/default/5562616141416415993'/><link rel='alternate' type='text/html' href='http://pirannafs.blogspot.com/2011/03/pirannafs-reloaded.html' title='PirannaFS Reloaded'/><author><name>Jesús Leganés Combarro</name><uri>https://profiles.google.com/109968379540878755826</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-G1X-8HwWjfg/AAAAAAAAAAI/AAAAAAAAAAA/RekFnw3Z3WI/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6741383955809102317.post-1927291916439177205</id><published>2011-01-02T20:17:00.000+01:00</published><updated>2011-11-30T17:57:30.697+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PirannaFS'/><title type='text'>Volver a empezar</title><content type='html'>Casi dos meses hace desde la ultima entrada, pero lo cierto es que han sido dos meses de aupa: presentación en el trabajo, vencimiento de fechas, jornadas maratonianas (entre el miercoles 22 a las 10 de la mañana -tarde, como siempre- y sale el viernes 24 a las 5 de la madrugada...), examenes... y encima, para colmo un antiguo compañero de trabajo ha empezado &lt;a href="http://www.unhosted.org/"&gt;UnHosted&lt;/a&gt;, un proyecto muy interesante y aparte de colaborar con el &lt;a href="http://www.unhosted.org/HH-Piranna.html"&gt;he participado en el concurso&lt;/a&gt; que ha organizado para ponerlo a prueba, asi que el tiempo que le he podido dedicar a PirannaFS ha tendido a 0.&lt;br /&gt;&lt;br /&gt;Sin embargo no me he olvidado del proyecto y de hecho ha sido uno de mis propositos de año nuevo (otro de ellos era ganar el concurso de UnHosted... :-D ), asi que aqui estoy intentando retomarlo, y una de las primeras que voy a hacer va a ser olvidarme un poco de la obsesion que coji con las unidades de test. Eso lo hice por estabilizar el codigo y poder publicarlo, pero si por dedicarle tiempo dejo de dedicarselo al proyecto, a perder la ilusion de hacer algo y, lo mas importante, dejo de &lt;b&gt;divertirm&lt;/b&gt;e, entonces ya no merece la pena.&lt;br /&gt;&lt;br /&gt;Precisamente por eso voy a retomar el desarrollo puro y duro, y debido a lo potente que he visto en estos dos meses que es PyFilesystem (que no haya programado no significa que no me haya documentado, y el estar inscrito a su &lt;a href="http://groups.google.com/group/pyfilesystem-discussion"&gt;lista de correo&lt;/a&gt; ayuda... :-D ) lo primero que voy a hacer va a ser modificar PirannaFS para que sea una libreria que pueda servir como base para crear una interfaz python-FUSE como hasta ahora y otra nueva interfaz PyFilesystem. Asi, aparte de ser compatible tanto con un sistema que ya es funcional como con otro bastante prometedor pero todavia en desarrollo, me permitira luego desarrollar las utilidades de apoyo sin necesidad de lidiar directamente con el sistema de archivos.&lt;br /&gt;&lt;br /&gt;Asi que dejando de lado estresses varios y que se presenta un cuatrimestre movidito, dejemos que de comienzo la magia... :-D&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6741383955809102317-1927291916439177205?l=pirannafs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pirannafs.blogspot.com/feeds/1927291916439177205/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://pirannafs.blogspot.com/2011/01/volver-empezar.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6741383955809102317/posts/default/1927291916439177205'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6741383955809102317/posts/default/1927291916439177205'/><link rel='alternate' type='text/html' href='http://pirannafs.blogspot.com/2011/01/volver-empezar.html' title='Volver a empezar'/><author><name>Jesús Leganés Combarro</name><uri>https://profiles.google.com/109968379540878755826</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-G1X-8HwWjfg/AAAAAAAAAAI/AAAAAAAAAAA/RekFnw3Z3WI/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6741383955809102317.post-4340437796815056343</id><published>2010-11-04T17:31:00.002+01:00</published><updated>2011-11-30T17:57:30.706+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='diseño'/><category scheme='http://www.blogger.com/atom/ns#' term='PirannaFS'/><category scheme='http://www.blogger.com/atom/ns#' term='tests'/><category scheme='http://www.blogger.com/atom/ns#' term='brainstorms'/><title type='text'>Horror, espanto, pavor (2ª parte... y media)</title><content type='html'>Si antes me quejo de lo malo que es Python-FUSE para depurarlo y para hacer unidades de test, antes me encuentro con &lt;a href="http://efreedom.com/Question/1-3156264/Unmount-Fuse-Fs-Python-Script"&gt;otro con el mismo problema&lt;/a&gt; :-P&lt;br /&gt;&lt;br /&gt;Bindings de FUSE para python hay varios (eso ya lo sabia) y escogí Python-FUSE aparte de por ser el mas famoso y el "oficial" (o al menos es del unico que hay documentación en la pagina de FUSE) porque ya habia paquetes en Ubuntu. Lo que yo no sabia es que otra de las alternativas (&lt;a href="http://code.google.com/p/fusepy/"&gt;fusePy&lt;/a&gt;) tenia paquetes dentro de la CheeseShop (si, asi se llamaba hasta hace poco el repositorio de paquetes oficial de Python antes de "profesionalizarse"), y por lo que parece esta alternativa no solo es mas "pythonica" que Python-FUSE sino que ademas es mas completa respecto a funcionalidad de bajo nivel, y para muestra un boton:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&gt;&gt;&gt; from fs.memoryfs import MemoryFS&lt;br /&gt;&gt;&gt;&gt; from fs.expose import fuse&lt;br /&gt;&gt;&gt;&gt; fs = MemoryFS()&lt;br /&gt;&gt;&gt;&gt; mp = fuse.mount(fs,"/mnt/my-memory-fs")&lt;br /&gt;&gt;&gt;&gt; mp.path&lt;br /&gt;'/mnt/my-memory-fs'&lt;br /&gt;&gt;&gt;&gt; mp.unmount()&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Si con esto no es mas facil el hacer las unidades de test sin necesidad de hackeos que baje FSM y lo vea. El problema viene entonces de tener que rehacer PirannaFS usando como base estos nuevos bindings o si hacer PirannaFS compatible con los dos, asi que quizas lo mejor sea estudiar previamente si realmente sera rentable o no, y leyendose el codigo no creo que baste. No se, otra alternativa podria ser el hacerme algun otro sistema de archivos (¿otro mas?), pero FullFAT no tiene bindings en Python (aparte de que queria usar la libreria para "entrenarme" para el paso a C++ de PirannaFS) y no he encontrado nada de bindings de Ext3 en Python, aunque sin lugar a dudas estaria interesante el hacerse una implementacion completa de Ext3 en Python (para chulo, yo :-P ). ¿Vosotros que opinais? ¿Reciclaje? ¿Reimplementación? ¿Mirar para otro lado y hacer como que no he visto esto? :-P&lt;br /&gt;&lt;br /&gt;Al menos, de regalo me he encuentrado que CUSE, el hermano pequeño y marginado de FUSE para desarrollar drivers de dispositivo en espacio de usuario (el tio que lo desarrolló se dio cuenta que solo hacia falta añadir dos IOCTLs a FUSE para tener soporte para poder escribir drivers genericos fuera del kernel...) y del cual a casi nadie parece importarle (o al menos no he visto ningun proyecto importante o ni siquiera una pagina con documentacion)... ¡¡¡me encuentro con que &lt;a href="http://code.google.com/p/cusepy/"&gt;han desarrollado unos bindings para Python&lt;/a&gt;!!! :-D&lt;br /&gt;&lt;br /&gt;Quizas empezase PirannaFS porque CaOS (mi propio sistema operativo que llevo diseñando desde que tenia 10 años) se me hacia muy grande, pero parece que todo el universo se esta conspirando en que lo saque adelante... :-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6741383955809102317-4340437796815056343?l=pirannafs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pirannafs.blogspot.com/feeds/4340437796815056343/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://pirannafs.blogspot.com/2010/11/horror-espanto-pavor-2-parte-y-media.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6741383955809102317/posts/default/4340437796815056343'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6741383955809102317/posts/default/4340437796815056343'/><link rel='alternate' type='text/html' href='http://pirannafs.blogspot.com/2010/11/horror-espanto-pavor-2-parte-y-media.html' title='Horror, espanto, pavor (2ª parte... y media)'/><author><name>Jesús Leganés Combarro</name><uri>https://profiles.google.com/109968379540878755826</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-G1X-8HwWjfg/AAAAAAAAAAI/AAAAAAAAAAA/RekFnw3Z3WI/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6741383955809102317.post-7970787278972250524</id><published>2010-11-04T00:13:00.001+01:00</published><updated>2011-11-30T17:57:30.723+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PirannaFS'/><category scheme='http://www.blogger.com/atom/ns#' term='tests'/><title type='text'>Horror, espanto, pavor (2ª parte)</title><content type='html'>Nota mental: plantearme hacer de proyecto para el año que viene o una maquina del tiempo o un replicador de cuerpos o diseñar una droga que permita alterar la percepcion del tiempo sin los efectos secundarios de la cocaina y que pegue mas fuerte por las mañanas que un cutrebull del Lidl... la falta de tiempo es acuciante, y ahora que se acercan los examenes creo que la mejor opcion va a ser dedicarme a la meditacion tibetana, a ver si asi consigo concentrarme...&lt;br /&gt;&lt;br /&gt;Quejas varias aparte, pequeño resumen de en lo que he estado &lt;s&gt;perdiendo el tiempo&lt;/s&gt; ocupado las ultimas semanas:&lt;br /&gt;&lt;br /&gt;Para empezar, como ya puse en mi &lt;a href="http://pirannafs.blogspot.com/2010/10/horror-espanto-pavor.html"&gt;anterior post&lt;/a&gt;&amp;nbsp;he empezado a realizar baterias de test para el sistema de archivos. Por un lado me hacia falta aprender a hacerlas, porque es algo que siempre he estado dejando de lado, y aunque no ha sido pan comido lo cierto es que no ha sido tan dificil como pensaba, pero la razon mas importante para hacerlo era el tema de difundir el proyecto, porque siendo un proyecto tan complejo y "delicado" (nadie quiere poner sus datos en peligro, y bastante ya me esta dando por [autocensurado] el Ext4 en el Ubuntu del trabajo poniendose en modo solo lectura cuando le doy un poco de caña por un error del kernel respecto a los timeout en discos lentos y antiguos... ¬¬) se necesitaba algun metodo para controlar la evolucion del proyecto y sobretodo para evitar regresiones. Y si, tengo que reconocer una cosa: funcionan, y mucho mejor de lo que pensaba. Tuve bastantes problemas a la hora de realizarlo por la forma en que esta diseñado python-fuse (no se si seria mejor arreglarlo o rehacerlo de cero...) pero lo cierto es que consegui que funcionara, y cuando despues de arreglar unos pequeños fallos que me encontre en la implementacion vi esto&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;[piranna@Tontodelculo:~/Proyectos/FUSE/PirannaFS/src]&lt;br /&gt;&amp;gt; cat ../test/error.log &lt;br /&gt;...............&lt;br /&gt;----------------------------------------------------------------------&lt;br /&gt;Ran 15 tests in 4.176s&lt;br /&gt;&lt;br /&gt;OK&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;realmente se me puso una sonrisa de oreja a oreja :-D&lt;br /&gt;&lt;br /&gt;Pero mas interesante que esto fue cuando leyendome las especificaciones del OpenGroup vi algo que me dejo totalmente desconcertado: en readdir especifica que los famosos . y .. solo deben ser mostrados si el sistema de archivos en cuestion tiene referencias explicitas a ellos, cosa que no es el caso (y de hecho siempre me ha parecido una tonteria si ya sabemos tanto cual es el directorio actual como cual es el padre). Sin embargo en todos los ejemplos y documentacion que he visto los ponian explicitamente a mano. ¿Que hacer, saltarse el estandar, o seguirlo fielmente a pesar de que luego al listar el directorio se vea raro? Al final, como no sabia si la lista de correo del concurso podria servir para esto (apenas acababa de comenzar a usarse y esto era una pregunta muy especifica y hasta cierto punto yo entendia que seria cierta ventaja si alguien me ayudaba) asi que pregunte a mis colegas de AlcorconWireless, y como suele suceder en estas cosas mi amigo Dani (que al final le voy a tener que meter en los titulos de credito por toda la ayuda que me esta dando :-P ) dio con la mejor solucion:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;mas friki.. activa una opción para verlos o para no verlos.. jajajaaja&lt;/blockquote&gt;&lt;br /&gt;Esa es la diferencia entre un ingeniero y uno que presume de serlo teniendo apenas la mitad de los creditos aprobados. Simplemente brillante.&lt;br /&gt;&lt;br /&gt;En fin, la cuestion es que aunque apenas tengo tiempo sigo sacando las cosas adelante, solo espero que con el trajin que llevo no termine implosionando por el estress :-P Espero a ver si para el proximo post ya tengo terminados las unidades de test, porque iba a haber hecho una release especial para Halloween y lo cierto al final ha sido que hacia una semana que no encendia el PC de casa... :-P&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6741383955809102317-7970787278972250524?l=pirannafs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pirannafs.blogspot.com/feeds/7970787278972250524/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://pirannafs.blogspot.com/2010/11/horror-espanto-pavor-2-parte.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6741383955809102317/posts/default/7970787278972250524'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6741383955809102317/posts/default/7970787278972250524'/><link rel='alternate' type='text/html' href='http://pirannafs.blogspot.com/2010/11/horror-espanto-pavor-2-parte.html' title='Horror, espanto, pavor (2ª parte)'/><author><name>Jesús Leganés Combarro</name><uri>https://profiles.google.com/109968379540878755826</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-G1X-8HwWjfg/AAAAAAAAAAI/AAAAAAAAAAA/RekFnw3Z3WI/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6741383955809102317.post-7846337986900663153</id><published>2010-10-19T00:08:00.001+02:00</published><updated>2011-11-30T17:57:30.721+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PirannaFS'/><category scheme='http://www.blogger.com/atom/ns#' term='tests'/><title type='text'>Horror, espanto, pavor</title><content type='html'>Acabo de darme cuenta de porque casi nadie hace baterías de test de casi nada, y no es porque no lo enseñan en la universidad... Acabo de hacerme la batería de test de la función ftruncate (es en la que mas modificaciones he hecho ultimamente con las optimizaciones. Ademas, por algun sitio tenia que empezar...) siguiendo las indicaciones de funcionalidad y errores de &lt;a href="http://www.opengroup.org/onlinepubs/009695399/functions/ftruncate.html"&gt;OpenGroup&lt;/a&gt; y me ocupa 254 lineas... y eso que solo he comentado lo que hace cada test, que ahora me toca programarlo :-/ Ahora bien, con la paliza que me voy a pegar, ¿que deberia hacer, acceder a las funciones a bajo nivel, o hacerlo rollo shell script y que ya que me pego la paliza con los test al menos que sirva para que otros no tengan que implementarselos tambien?&lt;br /&gt;&lt;br /&gt;Y en plan recursivo... ¿deberia hacer una bateria de test para la bateria de test para testear que la bateria de test testea correctamente? X-D&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6741383955809102317-7846337986900663153?l=pirannafs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='enclosure' type='text/html' href='http://www.opengroup.org/onlinepubs/009695399/functions/ftruncate.html' length='0'/><link rel='replies' type='application/atom+xml' href='http://pirannafs.blogspot.com/feeds/7846337986900663153/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://pirannafs.blogspot.com/2010/10/horror-espanto-pavor.html#comment-form' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6741383955809102317/posts/default/7846337986900663153'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6741383955809102317/posts/default/7846337986900663153'/><link rel='alternate' type='text/html' href='http://pirannafs.blogspot.com/2010/10/horror-espanto-pavor.html' title='Horror, espanto, pavor'/><author><name>Jesús Leganés Combarro</name><uri>https://profiles.google.com/109968379540878755826</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-G1X-8HwWjfg/AAAAAAAAAAI/AAAAAAAAAAA/RekFnw3Z3WI/s512-c/photo.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6741383955809102317.post-3925112538954158801</id><published>2010-10-17T18:12:00.001+02:00</published><updated>2011-11-30T17:57:30.699+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='plugins'/><category scheme='http://www.blogger.com/atom/ns#' term='diseño'/><category scheme='http://www.blogger.com/atom/ns#' term='PirannaFS'/><category scheme='http://www.blogger.com/atom/ns#' term='releases'/><title type='text'>[0.2.3] Checksums de Octubre</title><content type='html'>Casi 20 dias despues... nueva release :-D&lt;br /&gt;&lt;br /&gt;Este mes ha sido de aúpa, entre el trabajo y la demostración de este miércoles (que FSM nos coja confesaos...), los estudios (de los cuales todavía no tengo todos los apuntes), los compromisos sociales (aunque algunos han merecido la pena... aunque podrian haberlo merecido mas :-P ) y que los [auto-censurado] checksums se me habian atragantado no he parado quieto, pero bueno, tal y como dijo Mao "una revolución a la vez" al final esta saliendo todo adelante :-D&lt;br /&gt;&lt;br /&gt;En primer lugar estaba el tema de los plugins. Los checksums no aportaban simplemente funcionalidad no existente como pasaba con los symlinks sino que trabajaban directamente con los datos, por lo que ya no se podia usar un simple mapeo como antes sino que habia que empezar a desarrollar el sistema de plugins, y a ser posible de una forma un poco mas consistente que como lo habia hecho antes. Por suerte fue facil y ademas el codigo ha quedado bastante limpio, pero tengo la sospecha de que en el futuro voy a tener que hacerle profundos cambios para darle mas potencia y versatilidad (conflictos entre modulos es lo primero que se me viene a la cabeza, luego vereis porque).&lt;br /&gt;&lt;br /&gt;Pero el principal problema que tenia con los checksums (y que no identifique hasta hace poco) no estaba relaccionado directamente con ellos, sino que mas bien era un pequeño fallo de diseño (mas bien de falta de planificación) que tuve cuando desarrolle el codigo de escritura y modificación de los archivos (el cual en su momento ya me dio bastante guerra hasta el punto de tener que modificar el diseño de la base de datos tres veces...). Este fallo consistia por un lado que accedia desde distintos puntos del codigo directamente a las funciones DB.Split_Chunks y a LL.Write, con lo que a la hora de generar los eventos para los plugins tendria que generarlos desde multitud de sitios distintos. Sin embargo su funcionalidad era muy parecida y de hecho el codigo era casi el mismo en muchos sitios (como ya indique en mi &lt;a href="http://pirannafs.blogspot.com/2010/10/proyecto-brainstorm.html"&gt;anterior post&lt;/a&gt; entre DB.truncate y DB.Split_Chunks), asi que finalmente he conseguido encarrilar a todo el ganado a través de una nueva función (File.__Split_Chunks) que se encarga efectivamente de llamar a DB.Split_Chunks y de generar el evento correspondiente en caso de que haya producido alguna división.&lt;br /&gt;&lt;br /&gt;Al menos todo este follón me ha servido para varias cosas: en primer lugar, una revisión &lt;b&gt;a fondo&lt;/b&gt; del código de los archivos, de la base de datos y del acceso a bajo nivel (este al fin es una clase y es instanciada en FileSystem, con lo que ya no abrirá y cerrara el dispositivo en cada llamada. La ventaja es que el acceso es mucho mas rápido, el inconveniente que usara los buffers de archivo del sistema y no escribirá los datos directamente a disco y todavía no estoy usando las transacciones, que es justo una de las razones por las que decidí usar un motor de bases de datos, para aprovechar las que ya tiene... :-/ ). Esta revisión me ha permitido aplicarle muchas mejoras menores y reutilizar mucho código duplicado, con lo que ahora el tamaño y las posibilidades de error son menores, pero sobretodo he quitado "inteligencia" a la base de datos (ahora solo ejecuta sentencias SQL, apenas toma decisiones por si misma aunque lo cierto es que se podría "estupidizar" aun mas) y he eliminado la notificación de eventos desde la base de datos y el acceso a bajo nivel, con lo que por un lado permite mayor control de quien envía realmente los eventos (todo se esta perfilando a que la comunicación entre los plugins va a ser realmente sencilla... :-) ) y también permite mayor portabilidad en el futuro a otros motores de bases de datos o sistemas de almacenamiento o incluso a sacar el código SQL a archivos externos y que los parsee en el arranque en lugar de estar directamente dentro del código Python (esta idea la tengo desde hace tiempo, pero aunque permitiría un mejor mantenimiento al poder tenerlo aislado y que sea mas fácil procesarlo con un editor de texto con coloreado de sintaxis -me encantan :-D - todavía no me he planteado en serio el realizarlo porque consumiría mas memoria y seria un poco mas lento... :-/ )&lt;br /&gt;&lt;br /&gt;Ademas todos estos cambios me han hecho replantearme en serio la necesidad de hacer modulos de prueba, por lo que voy a empezar a usar PyUnit, que es el estandar en Python. Nunca he desarrollado ninguno y ademas siempre he sido reaccio a hacerlos (si funciona, ¿para que comprobarlo?) pero un proyecto tan complejo como este lo necesita. Por suerte hace tiempo cuando estaba buscando los codigos de error de los sistemas de archivos tratando de averiguar porque fallaba me encontre con &lt;a href="http://www.opengroup.org/onlinepubs/009695399/"&gt;esta pagina&lt;/a&gt; que contiene la definición de todas las funciones UNIX con sus parametros, errores y limitaciones, con lo que me vendra de perlas para desarrollar los modulos de test (espero que no me pidan comprar una licencia de POSIX o que Linux Tordvalds me preste la suya... :-D ). Tambien aprovechare a documentar todo el codigo con vistas a liberar publicamente la version 0.3 a ver si se apunta alguien a echarme una mano, y tambien aprovechare a cambiar la filosofia de la API, ya que hasta hace poco (bendito trabajo que tambien lo estoy haciendo en Python y me permite aprender de forma intensiva... :-D ) no entendia correctamente uno de los aspectos mas extraños del lenguaje: en Python no hay metodos o atributos privados, todo es publico. Sin embargo por convenio los atributos y metodos que empiezan con un guión bajo (_) no se muestran en el completado de sintaxis, aunque se sigue podiendo acceder normalmente a ellos. Aparte tambien estan los que empiezan por dos guiones bajos (__) que aqui si el lenguaje los considera como atributos especiales y su firma es distinta, haciendo por tanto que sea mucho mas dificil acceder a ellos. Hasta ahora solo usaba este ultimo metodo para emular los atributos privados, pero realmente era un engorro cuando me encontraba con que queria acceder a algo que habia ocultado demasiado hasta que &lt;a href="http://stackoverflow.com/questions/70528/why-are-pythons-private-methods-not-actually-private/70736#70736"&gt;descubri&lt;/a&gt; en que se basaba esta diferencia: la filosofia en Python es la confianza en el programador, por lo tanto no tiene sentido pensar en atributos publicos, protegidos y privados, sino en mostrar (normal), no mostrar (_) y ocultar (__), teniendo en cuenta por ambas partes que si quieres acceder a algun sitio siempre vas a poder pero que necesitas tener buenas razones para ello (por ejemplo, en los debuggers). Despues de tanto tiempo con C++ cuesta acostumbrarse, pero la posibilidad de ver el codigo de los demas para ver que es lo que esta haciendo realmente es de gran ayuda... :-D&lt;br /&gt;&lt;br /&gt;Y bueno, ese es el toston de hoy. Espero que cuando este aprendiendo a usar las unidades de test y documentando el codigo no me encuentre con demasiados problemas como hasta ahora, porque entonces esto va a parecer la biblia... :-P Por el momento para mi desgracia acabo de descubrir que ZFS si tiene &lt;a href="http://en.wikipedia.org/wiki/ZFS#Variable_block_sizes"&gt;bloques de tamaño variable&lt;/a&gt; (lo que yo creia que era una feature exclusivamente mia... ¬¬) pero por otro lado tambien he descubierto que su algoritmo de compresion tiene una &lt;a href="http://code.google.com/p/pylzjb/"&gt;implementación en Python&lt;/a&gt;, asi que no hay mal que por bien no venga... :-D&lt;div style='clear: both; text-align: center; font-size: xx-small;'&gt;Published with Blogger-droid v1.6.2&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6741383955809102317-3925112538954158801?l=pirannafs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pirannafs.blogspot.com/feeds/3925112538954158801/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://pirannafs.blogspot.com/2010/10/cielo-de-octubre.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6741383955809102317/posts/default/3925112538954158801'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6741383955809102317/posts/default/3925112538954158801'/><link rel='alternate' type='text/html' href='http://pirannafs.blogspot.com/2010/10/cielo-de-octubre.html' title='[0.2.3] Checksums de Octubre'/><author><name>Jesús Leganés Combarro</name><uri>https://profiles.google.com/109968379540878755826</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-G1X-8HwWjfg/AAAAAAAAAAI/AAAAAAAAAAA/RekFnw3Z3WI/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6741383955809102317.post-3939869348501515693</id><published>2010-10-03T20:09:00.002+02:00</published><updated>2011-11-30T17:57:30.701+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='diseño'/><category scheme='http://www.blogger.com/atom/ns#' term='PirannaFS'/><category scheme='http://www.blogger.com/atom/ns#' term='brainstorms'/><title type='text'>Proyecto Brainstorm</title><content type='html'>Como habréis podido ver hace días que no escribo por aquí y sin embargo en el &lt;a href="https://forja.rediris.es/projects/cusl5-pirannafs/"&gt;svn&lt;/a&gt; ha habido muchos cambios... Esto es debido por un lado a que las modificaciones en el core para que acepte el lanzamiento de eventos para los plugins esta siendo mas complicado de lo que parecía debido a que hay que pensar en como aislar correctamente cada una de las partes (hasta ahora no tenia problemas, pero el plugin de checksums funciona a muy bajo nivel y además recibe eventos de distintas partes del código). Sin embargo estos replanteamientos están permitiendo una mayor independencia entre cada una de las partes y además me esta permitiendo el optimizar y documentar código bastante antiguo (en concreto estoy rompiéndome la cabeza para que DB.truncate utilice por debajo a DB.Split_Chunks), así que estoy matando tres pájaros de un tiro :-)&lt;br /&gt;&lt;br /&gt;Pero por otro lado también he estado aprovechando el tiempo, y el sistema de plugins ya esta bastante maduro. El sistema me ha quedado bastante escueto y portable, por lo que se podría utilizar en otros sistemas que precisen de un sistema de plugins, pero aunque ya haya otros sistemas de plugins para python (y &lt;a href="http://www.mail-archive.com/python-dev@python.org/msg50471.html"&gt;algunos&lt;/a&gt; ya se me han adelantado en la idea de convertirlos en sistema "oficial") lo cierto es que no he visto ninguno que tenga algún mecanismo de control de dependencias entre plugins, y aunque creía que iba a ser mas complicado lo cierto es que al final ha sido casi obvio: al cargar el modulo obtenemos las clases de los plugins y vemos cuales son sus dependencias. Si no están todas disponibles dejamos el plugin pendiente, y si lo están entonces lo cargamos y comprobamos entre los pendientes si para alguno de ellos ha cambiado la situación. Simple, fácil y para toda la familia :-D&lt;br /&gt;&lt;br /&gt;Es por esto por lo que todavía no le estoy dando mucha popularidad al sistema ya que quiero tenerlo bien fino antes de abrirlo al publico (sobretodo por el tema de los plugins que se meten muy adentro del funcionamiento del sistema), pero probablemente para la versión 0.3 ya haga un llamamiento publico buscando ideas y colaboradores (y si, prometo que intentare poner al día y en la web cuales son los checkpoints para cada versión...). Sin embargo precisamente por esto he estado actualizando (y limpiando) el diagrama de la estructura de tablas mas acorde a como se esta perfilando el sistema ahora que empiezan a funcionar los plugins (mi idea era implementarlo después de la versión 1.0, pero con motivo del concurso y de la "participación de la comunidad" he tenido que cambiar las fechas para hacerlo mas accesible) y este es el resultado:&lt;br /&gt;&lt;br /&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_jgtvDGkZEkU/TKi2frGgTHI/AAAAAAAAAPM/cuvxBVjwfOc/s1600/C:%5Cfakepath%5Ctables_2010-10-03.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="600" src="http://3.bp.blogspot.com/_jgtvDGkZEkU/TKi2frGgTHI/AAAAAAAAAPM/cuvxBVjwfOc/s640/C:%5Cfakepath%5Ctables_2010-10-03.png" width="640" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;(Los colorines son para indicar la dificultad de implementar cada uno de los modulos según cuanto haya que modificar el código: blanco=implementado, verde=directo o casi directo, amarillo=alguna modificación, naranja=reimplementación en parte, rojo=reimplementación de gran parte y turquesa=implementado pero necesita mejoras. Obviamente, con los checksums me equivoque...)&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;Como podéis ver, arriba a la izquierda tenemos el core, ya implementado. He agrupado lo que correspondería al plugin de directorios y al de archivos porque aunque por el momento no tenga pensado implementarlos como modulos externos, lo cierto es que cada vez &lt;a href="http://pirannafs.blogspot.com/2010/09/reduciendo-el-nucleo.html"&gt;me esta tentando mas la idea&lt;/a&gt; (¡Mama mama, sin directorios! ¡Mama mama, sin archivos! ¡Mama mama, sin datos! X-D). Luego en el siguiente nivel tenemos los modulos de implementación que como dije anteriormente son dependientes de los elementos del core, y por ultimo tenemos los de valor añadido, en los cuales he puesto el ACL y el log (antes los tenia como de implementación) debido a que no son dependientes directos del core. También tengo aquí a un nuevo vecino en el barrio, xattrs (atributos extendidos), que aunque si es dependiente del core lo cierto es que no depende de sus claves únicas. Además, realmente voy a implementar los atributos extendidos para completar la funcionalidad del sistema de archivos y porque va a ser igual de sencillo que los symlinks (al igual que estos, se podría hacer con un mapeo directo de funciones) ya que a titulo personal, me parece una solución mucho mejor el usar algún tipo de estructura como las tablas id3 y exif, no un simple clave-valor que no da ninguna idea de cuales datos faltan por rellenar (lo admito, estoy obsesionado con los tags de los mp3s en el iTunes hasta el punto de que no solo relleno todos los campos de autor/album/disco/pista/titulo para tenerlos bien organizados sino que le meto dentro a los archivos todas las imágenes del album e incluso la letra de las canciones... :-P). Sin embargo también tengo que reconocer que aunque no son muy usados (al menos son unos completos desconocidos para el usuario medio, y para mi hasta hace poco), realmente pueden ser muy potentes y en un sistema de archivos "tradicional" puede ser usado para &lt;a href="http://blogs.techrepublic.com.com/opensource/?p=1116"&gt;implementar un ACL&lt;/a&gt; y aumentar el nivel de seguridad, por ejemplo. En cualquier caso, para todo lo que se pueden usar los atributos extendidos un sistema dedicado puede cumplir su tarea mucho mejor, pero las estructuras en los sistemas de archivos tradicionales son demasiado fijas como para añadir este tipo de funcionalidades. Por eso la flexibilidad que ofrecen las bases de datos en estos casos es justo una de las razones que me impulsaron a usar una como base para diseñar el sistema de archivos.&lt;br /&gt;&lt;br /&gt;Pero este pequeño by-pass con replanteamiento de puntos de vista incluido también me esta permitiendo el tener tiempo para pensar sobre nuevos modulos, plugins y funciones que añadir al sistema, y parte del merito se lo tengo que dar a mi buena amiga Jennifer, una completa n00b para estas cosas (bastante que la conseguí sacar del lado oscuro y que empezara a usar Linux... :-P) pero que sin embargo su punto de vista como usuario raso me ha sido bastante útil (¡gracias! :-D ).&lt;br /&gt;&lt;br /&gt;Una de las ideas que me dio fue el implementar algún sistema de búsqueda avanzada en situaciones limite, del estilo "he buscado la foto del garito aquel en la playa en que estuve desfasando con mis amigas en la que salia guapísima, pero no me acuerdo si es de este año o del anterior y no se si las he borrado o que porque no las encuentro" (nota: aunque no haya dicho nada, casi desde que empecé el proyecto en el diagrama arriba a la derecha hay un modulito muy majo llamado "unlinks"... Si, he pensado en todo, también en otro llamado "purge" que no sale ;-) ). "Además, no quiero que salgan las fotos del tío con el que me enrolle esa noche no sea que entre mi novia en un momento inoportuno cuando este buscando la foto" (a esto ultimo lo llamo yo "ganas de fastidiarme", solo que no con estas palabras...). Al leer esto algunos pensaran que eso es imposible, y otros pensaran que quizás SpotLight o Beagle ya lo hacen (realmente esta idea suya les correspondería mas a unas aplicaciones de alto nivel como ellos que a un sistema de archivos, pero un poco de ayuda por debajo les facilitaría mucho la tarea al igual de lo que podría ocurrir si combinásemos ZFS con TimeMachine... :-) ). Lo cierto es que SpotLight es buenísimo (Beagle nunca lo he usado porque siempre lo desinstalaba ya que mis maquinas con Linux nunca han sido lo suficientemente potentes como para encima tener un proceso accediendo al disco todo el rato...) pero nunca he visto que llegara a un nivel de precisión quirúrgica tan avanzado (quizás lanzandolo desde linea de comandos y procesando una consulta muy elaborada, pero si fuera así de fácil habría un montón de artículos escritos en internet al respecto y lo cierto es que no he oído nada). Yo tengo que ser sincero: es muy complicado, pero no imposible. Aquí el mayor problema depende de la adquisición de los metadatos (día-noche, fechas contextualizadas, reconocimiento de caras...) pero si se tienen y están bien organizados, el problema se reduciría a una simple búsqueda en la base de datos. No diré que lo vaya a implementar... pero si que lo tendré en cuenta para orientar posibles mejoras futuras.&lt;br /&gt;&lt;br /&gt;Otras ideas que surgieron entre los dos fueron la eliminación segura de archivos (que ya lo tenia pensado antes pero me gusto ver que no soy el único preocupado :-) ) o la compactación de los archivos (quizás para mas adelante, ya hay suficiente lío con la escritura de los chunks como para encima meter esto). Sin embargo al ver todo lo que esta creciendo el sistema me esta entrando una pequeña duda: ¿y si SQLite no es lo suficientemente potente como para moverlo todo? SQLite es un motor de bases de datos muy optimizado, pero tiene el inconveniente de que cuando se accede a el bloque la base de datos entera, y con tanta funcionalidad añadida a falta de pruebas de rendimiento un sistema que ponga a funcionar muchos modulos podría tener problemas... Una solución bastante practica podría ser el que los modulos en lugar de crear sus tablas en la base de datos principal las creen en bases de datos secundarias, con lo que aparte de aumentar la modularización permitirá el acceder en paralelo a las distintas tablas (sobretodo con equipos multicore como los que se venden hoy día) y además se evitaría el meter "mierda" en la base de datos principal y la desinstalación de modulos seria mas sencilla, sin embargo la adaptación a un sistema autocontenido se complicaría sobremanera. Bien es cierto que todavía queda mucho para entonces, pero siempre es bueno planear tus actos con dos o tres pasos de antelación... :-D Por el momento lo dejo aquí anotado como recordatorio para el futuro ;-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6741383955809102317-3939869348501515693?l=pirannafs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pirannafs.blogspot.com/feeds/3939869348501515693/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://pirannafs.blogspot.com/2010/10/proyecto-brainstorm.html#comment-form' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6741383955809102317/posts/default/3939869348501515693'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6741383955809102317/posts/default/3939869348501515693'/><link rel='alternate' type='text/html' href='http://pirannafs.blogspot.com/2010/10/proyecto-brainstorm.html' title='Proyecto Brainstorm'/><author><name>Jesús Leganés Combarro</name><uri>https://profiles.google.com/109968379540878755826</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-G1X-8HwWjfg/AAAAAAAAAAI/AAAAAAAAAAA/RekFnw3Z3WI/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_jgtvDGkZEkU/TKi2frGgTHI/AAAAAAAAAPM/cuvxBVjwfOc/s72-c/C:%5Cfakepath%5Ctables_2010-10-03.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6741383955809102317.post-669646949007170417</id><published>2010-09-29T22:20:00.002+02:00</published><updated>2011-11-30T17:57:30.717+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='plugins'/><category scheme='http://www.blogger.com/atom/ns#' term='PirannaFS'/><category scheme='http://www.blogger.com/atom/ns#' term='releases'/><title type='text'>[0.2.2] El log de Schindler</title><content type='html'>Hoy debido a la huelga he decidido quedarme en casa, no por apoyarla y no ir a trabajar, sino que ayer me hice una copia de seguridad y he trabajado desde aquí debido al miedo que tenia a los piquetes (no estoy de acuerdo con las reformas, pero tampoco con los sindicatos como la mayoría de la población).&lt;br /&gt;&lt;br /&gt;Al final ha sido mas ruido que otra cosa y podría haber ido sin problemas, pero el caso es que como he terminado pronto me he puesto a darle un empujón al sistema de archivos y bueno... hemos alcanzado otro checkpoint :-D Ahora modulo de log esta operativo, he limpiado el modulo de symlinks (ya no hay funciones mapeadas, todas son lanzadas por eventos gracias a louie :-) ) y empieza a discernirse un borrador de como implementar el sistema de plugins. Esto ultimo es debido a que en el modulo de log no tenia manera de tener una referencia para acceder a la base de datos, ya que antes accedía a través del objeto del sistema de archivos (como se puede ver en symlinks, aunque lo voy a cambiar en breve para unificarlo) y ahora al tener el objeto otra estructura perdía toda referencia a ella, y guardarlo en una variable global me decía el bicho que nanai. ¿Como hacerlo? Pues construyendo una clase. Era reacio a hacerlo a pesar de mi gusto por la orientación a objetos porque entonces ya no bastaría con cargar el modulo para tenerlo habilitado, sino que ademas tendría que meterme dentro, leer la clase y crear un objeto, y eso ya es mucho engorro. Por el momento lo he solucionado con la chapuza de crear una instancia del objeto al final del modulo (niños, no miréis :-P ) pero la ventaja de usar orientación a objetos es que mi idea de en un futuro implementar un sistema de dependencias entre plugins (inspirado en APT para mas señas... ;-) ) va a ser mucho mas sencillo :-)&lt;br /&gt;&lt;br /&gt;En fin, en cualquier caso el modulo de logs ya esta listo, aunque tendré que diseñar algún método para agrupar los eventos y así poder discernir cuales son validos para loggear y cuales no, porque cuando ya estaba operativo con solo hacer un ls me ha salido todo esto...&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;[piranna@Tontodelculo:~/Proyectos/FUSE/PirannaFS/test]&lt;br /&gt;&amp;gt; sqlite3 db.sqlite &lt;br /&gt;SQLite version 3.6.22&lt;br /&gt;Enter ".help" for instructions&lt;br /&gt;Enter SQL statements terminated with a ";"&lt;br /&gt;sqlite&amp;gt; select * from log;&lt;br /&gt;|__init__|DB|2010-09-29 18:34:31||{'self': &lt;pirannafs.db.db 0xb779e36c="" at="" instance=""&gt;, 'db_name': '../test/db.sqlite'}||&lt;br /&gt;|readlink|FileSystem|2010-09-29 18:34:32||{'path': '/nano_link.txt', 'self': &lt;pirannafs.fs.filesystem 0xb779b2cc="" at="" object=""&gt;}||&lt;br /&gt;|readlink|FileSystem|2010-09-29 18:34:32||{'path': '/nano_link.txt', 'self': &lt;pirannafs.fs.filesystem 0xb779b2cc="" at="" object=""&gt;}||&lt;br /&gt;|readlink|FileSystem|2010-09-29 18:34:32||{'path': '/nano_link.txt', 'self': &lt;pirannafs.fs.filesystem 0xb779b2cc="" at="" object=""&gt;}||&lt;br /&gt;|readlink|FileSystem|2010-09-29 18:34:33||{'path': '/nano_link.txt', 'self': &lt;pirannafs.fs.filesystem 0xb779b2cc="" at="" object=""&gt;}||&lt;br /&gt;|readlink|FileSystem|2010-09-29 18:34:33||{'path': '/nano_link.txt', 'self': &lt;pirannafs.fs.filesystem 0xb779b2cc="" at="" object=""&gt;}||&lt;br /&gt;|readlink|FileSystem|2010-09-29 18:34:33||{'path': '/nano_link.txt', 'self': &lt;pirannafs.fs.filesystem 0xb779b2cc="" at="" object=""&gt;}||&lt;br /&gt;|readlink|FileSystem|2010-09-29 18:34:33||{'path': '/nano_link.txt', 'self': &lt;pirannafs.fs.filesystem 0xb779b2cc="" at="" object=""&gt;}||&lt;br /&gt;|readlink|FileSystem|2010-09-29 18:34:33||{'path': '/nano_link.txt', 'self': &lt;pirannafs.fs.filesystem 0xb779b2cc="" at="" object=""&gt;}||&lt;br /&gt;|readlink|FileSystem|2010-09-29 18:34:33||{'path': '/nano_link.txt', 'self': &lt;pirannafs.fs.filesystem 0xb779b2cc="" at="" object=""&gt;}||&lt;br /&gt;|readlink|FileSystem|2010-09-29 18:34:34||{'path': '/nano_link.txt', 'self': &lt;pirannafs.fs.filesystem 0xb779b2cc="" at="" object=""&gt;}||&lt;br /&gt;|readlink|FileSystem|2010-09-29 18:34:34||{'path': '/nano_link.txt', 'self': &lt;pirannafs.fs.filesystem 0xb779b2cc="" at="" object=""&gt;}||&lt;br /&gt;|readlink|FileSystem|2010-09-29 18:34:34||{'path': '/nano_link.txt', 'self': &lt;pirannafs.fs.filesystem 0xb779b2cc="" at="" object=""&gt;}||&lt;br /&gt;|readlink|FileSystem|2010-09-29 18:34:34||{'path': '/nano_link.txt', 'self': &lt;pirannafs.fs.filesystem 0xb779b2cc="" at="" object=""&gt;}||&lt;br /&gt;|readlink|FileSystem|2010-09-29 18:34:34||{'path': '/nano_link.txt', 'self': &lt;pirannafs.fs.filesystem 0xb779b2cc="" at="" object=""&gt;}||&lt;br /&gt;|readlink|FileSystem|2010-09-29 18:34:34||{'path': '/nano_link.txt', 'self': &lt;pirannafs.fs.filesystem 0xb779b2cc="" at="" object=""&gt;}||&lt;br /&gt;|readlink|FileSystem|2010-09-29 18:34:34||{'path': '/nano_link.txt', 'self': &lt;pirannafs.fs.filesystem 0xb779b2cc="" at="" object=""&gt;}||&lt;br /&gt;|readlink|FileSystem|2010-09-29 18:34:35||{'path': '/nano_link.txt', 'self': &lt;pirannafs.fs.filesystem 0xb779b2cc="" at="" object=""&gt;}||&lt;br /&gt;|readlink|FileSystem|2010-09-29 18:34:35||{'path': '/nano_link.txt', 'self': &lt;pirannafs.fs.filesystem 0xb779b2cc="" at="" object=""&gt;}||&lt;br /&gt;|readlink|FileSystem|2010-09-29 18:34:35||{'path': '/nano_link.txt', 'self': &lt;pirannafs.fs.filesystem 0xb779b2cc="" at="" object=""&gt;}||&lt;br /&gt;|readlink|FileSystem|2010-09-29 18:34:35||{'path': '/nano_link.txt', 'self': &lt;pirannafs.fs.filesystem 0xb779b2cc="" at="" object=""&gt;}||&lt;br /&gt;|readlink|FileSystem|2010-09-29 18:34:35||{'path': '/nano_link.txt', 'self': &lt;pirannafs.fs.filesystem 0xb779b2cc="" at="" object=""&gt;}||&lt;br /&gt;|readlink|FileSystem|2010-09-29 18:34:35||{'path': '/nano_link.txt', 'self': &lt;pirannafs.fs.filesystem 0xb779b2cc="" at="" object=""&gt;}||&lt;br /&gt;|readlink|FileSystem|2010-09-29 18:34:35||{'path': '/nano_link.txt', 'self': &lt;pirannafs.fs.filesystem 0xb779b2cc="" at="" object=""&gt;}||&lt;br /&gt;|readlink|FileSystem|2010-09-29 18:34:36||{'path': '/nano_link.txt', 'self': &lt;pirannafs.fs.filesystem 0xb779b2cc="" at="" object=""&gt;}||&lt;br /&gt;|readlink|FileSystem|2010-09-29 18:34:36||{'path': '/nano_link.txt', 'self': &lt;pirannafs.fs.filesystem 0xb779b2cc="" at="" object=""&gt;}||&lt;br /&gt;|readlink|FileSystem|2010-09-29 18:34:36||{'path': '/nano_link.txt', 'self': &lt;pirannafs.fs.filesystem 0xb779b2cc="" at="" object=""&gt;}||&lt;br /&gt;|readlink|FileSystem|2010-09-29 18:34:36||{'path': '/nano_link.txt', 'self': &lt;pirannafs.fs.filesystem 0xb779b2cc="" at="" object=""&gt;}||&lt;br /&gt;|readlink|FileSystem|2010-09-29 18:34:36||{'path': '/nano_link.txt', 'self': &lt;pirannafs.fs.filesystem 0xb779b2cc="" at="" object=""&gt;}||&lt;br /&gt;|readlink|FileSystem|2010-09-29 18:34:36||{'path': '/nano_link.txt', 'self': &lt;pirannafs.fs.filesystem 0xb779b2cc="" at="" object=""&gt;}||&lt;br /&gt;|readlink|FileSystem|2010-09-29 18:34:36||{'path': '/nano_link.txt', 'self': &lt;pirannafs.fs.filesystem 0xb779b2cc="" at="" object=""&gt;}||&lt;br /&gt;|readlink|FileSystem|2010-09-29 18:34:37||{'path': '/nano_link.txt', 'self': &lt;pirannafs.fs.filesystem 0xb779b2cc="" at="" object=""&gt;}||&lt;br /&gt;|readlink|FileSystem|2010-09-29 18:34:37||{'path': '/nano_link.txt', 'self': &lt;pirannafs.fs.filesystem 0xb779b2cc="" at="" object=""&gt;}||&lt;br /&gt;|readlink|FileSystem|2010-09-29 18:34:37||{'path': '/nano_link.txt', 'self': &lt;pirannafs.fs.filesystem 0xb779b2cc="" at="" object=""&gt;}||&lt;br /&gt;|readlink|FileSystem|2010-09-29 18:34:37||{'path': '/nano_link.txt', 'self': &lt;pirannafs.fs.filesystem 0xb779b2cc="" at="" object=""&gt;}||&lt;br /&gt;|readlink|FileSystem|2010-09-29 18:34:37||{'path': '/nano_link.txt', 'self': &lt;pirannafs.fs.filesystem 0xb779b2cc="" at="" object=""&gt;}||&lt;br /&gt;|readlink|FileSystem|2010-09-29 18:34:37||{'path': '/nano_link.txt', 'self': &lt;pirannafs.fs.filesystem 0xb779b2cc="" at="" object=""&gt;}||&lt;br /&gt;|readlink|FileSystem|2010-09-29 18:34:37||{'path': '/nano_link.txt', 'self': &lt;pirannafs.fs.filesystem 0xb779b2cc="" at="" object=""&gt;}||&lt;br /&gt;|readlink|FileSystem|2010-09-29 18:34:38||{'path': '/nano_link.txt', 'self': &lt;pirannafs.fs.filesystem 0xb779b2cc="" at="" object=""&gt;}||&lt;br /&gt;|readlink|FileSystem|2010-09-29 18:34:38||{'path': '/nano_link.txt', 'self': &lt;pirannafs.fs.filesystem 0xb779b2cc="" at="" object=""&gt;}||&lt;br /&gt;|readlink|FileSystem|2010-09-29 18:34:38||{'path': '/nano_link.txt', 'self': &lt;pirannafs.fs.filesystem 0xb779b2cc="" at="" object=""&gt;}||&lt;br /&gt;|readlink|FileSystem|2010-09-29 18:34:38||{'path': '/nano_link.txt', 'self': &lt;pirannafs.fs.filesystem 0xb779b2cc="" at="" object=""&gt;}||&lt;br /&gt;|readlink|FileSystem|2010-09-29 18:34:38||{'path': '/nano_link.txt', 'self': &lt;pirannafs.fs.filesystem 0xb779b2cc="" at="" object=""&gt;}||&lt;br /&gt;|readlink|FileSystem|2010-09-29 18:34:39||{'path': '/nano_link.txt', 'self': &lt;pirannafs.fs.filesystem 0xb779b2cc="" at="" object=""&gt;}||&lt;br /&gt;sqlite&amp;gt;&lt;/pirannafs.fs.filesystem&gt;&lt;/pirannafs.fs.filesystem&gt;&lt;/pirannafs.fs.filesystem&gt;&lt;/pirannafs.fs.filesystem&gt;&lt;/pirannafs.fs.filesystem&gt;&lt;/pirannafs.fs.filesystem&gt;&lt;/pirannafs.fs.filesystem&gt;&lt;/pirannafs.fs.filesystem&gt;&lt;/pirannafs.fs.filesystem&gt;&lt;/pirannafs.fs.filesystem&gt;&lt;/pirannafs.fs.filesystem&gt;&lt;/pirannafs.fs.filesystem&gt;&lt;/pirannafs.fs.filesystem&gt;&lt;/pirannafs.fs.filesystem&gt;&lt;/pirannafs.fs.filesystem&gt;&lt;/pirannafs.fs.filesystem&gt;&lt;/pirannafs.fs.filesystem&gt;&lt;/pirannafs.fs.filesystem&gt;&lt;/pirannafs.fs.filesystem&gt;&lt;/pirannafs.fs.filesystem&gt;&lt;/pirannafs.fs.filesystem&gt;&lt;/pirannafs.fs.filesystem&gt;&lt;/pirannafs.fs.filesystem&gt;&lt;/pirannafs.fs.filesystem&gt;&lt;/pirannafs.fs.filesystem&gt;&lt;/pirannafs.fs.filesystem&gt;&lt;/pirannafs.fs.filesystem&gt;&lt;/pirannafs.fs.filesystem&gt;&lt;/pirannafs.fs.filesystem&gt;&lt;/pirannafs.fs.filesystem&gt;&lt;/pirannafs.fs.filesystem&gt;&lt;/pirannafs.fs.filesystem&gt;&lt;/pirannafs.fs.filesystem&gt;&lt;/pirannafs.fs.filesystem&gt;&lt;/pirannafs.fs.filesystem&gt;&lt;/pirannafs.fs.filesystem&gt;&lt;/pirannafs.fs.filesystem&gt;&lt;/pirannafs.fs.filesystem&gt;&lt;/pirannafs.fs.filesystem&gt;&lt;/pirannafs.fs.filesystem&gt;&lt;/pirannafs.fs.filesystem&gt;&lt;/pirannafs.fs.filesystem&gt;&lt;/pirannafs.fs.filesystem&gt;&lt;/pirannafs.db.db&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Si, efectivamente, FUSE hace muchas llamadas al sistema... ;-)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;P.D.: entrada libre de faltas de "hortográfia" ;-) dedicada a Pau y su &lt;a href="http://pirannafs.blogspot.com/2010/09/symlinks-plugins-y-cintas-de-video.html?showComment=1285568580481#c8141634643429167795"&gt;muy buen consejo&lt;/a&gt; :-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6741383955809102317-669646949007170417?l=pirannafs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pirannafs.blogspot.com/feeds/669646949007170417/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://pirannafs.blogspot.com/2010/09/el-log-de-schindler.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6741383955809102317/posts/default/669646949007170417'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6741383955809102317/posts/default/669646949007170417'/><link rel='alternate' type='text/html' href='http://pirannafs.blogspot.com/2010/09/el-log-de-schindler.html' title='[0.2.2] El log de Schindler'/><author><name>Jesús Leganés Combarro</name><uri>https://profiles.google.com/109968379540878755826</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-G1X-8HwWjfg/AAAAAAAAAAI/AAAAAAAAAAA/RekFnw3Z3WI/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6741383955809102317.post-6204718409381109467</id><published>2010-09-25T21:28:00.001+02:00</published><updated>2011-11-30T17:57:30.712+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='plugins'/><category scheme='http://www.blogger.com/atom/ns#' term='PirannaFS'/><category scheme='http://www.blogger.com/atom/ns#' term='releases'/><title type='text'>[0.2.1] Symlinks, Plugins y cintas de video</title><content type='html'>Aunque he tardado algun tiempo en actualizar cosas debido a lo saturada que tengo la agenda este año entre el trabajo y la carrera (aunque segun he visto en los blogs de los demas no soy el unico, bien por nosotros :-) ) al fin ha llegado el viernes tarde y para desconectar de una semana demasiado corta en tiempo (se me ha pasado volando sin darme cuenta, con lo que me jode...) y demasiado larga en estress en la que incluso he perdido mi maravilloso Android (snif...) me he puesto a darle un pequeño empujon al proyecto y a falta de uno hay dos: primero, ya tenemos links simbolicos, y segundo, ya tenemos una plataforma seria de plugins, aunque por ironico que parezca no por culpa del codigo para generar los links simbolicos, sino por culpa de la creacion de su tabla.&lt;br /&gt;&lt;br /&gt;En primer lugar, los links simbolicos tienen sus propias funciones dentro de FUSE (symlink para crearlos y readlink para parsearlos), los cuales hasta ahora no las habia implementado porque no eran necesarias para el nucleo del sistema de archivos, asi que como primera aproximacion al sistema de plugins decidi mapearlas directamente dentro de la clase, al igual que he hecho con sus equivalentes en la base de datos.&lt;br /&gt;&lt;br /&gt;Sin embargo para la creacion de la tabla no podia mapear ninguna funcion sino que tenia que ejecutarse cuando terminara de hacerse la base de datos entera, asi que buscando algun ejemplo de como hacer un sistema de notificacion de eventos en python (podia hacermelo yo y los ejemplos que encontre eran muy parecidos, pero queria ver si ya habia algo bien hecho y probado que poder reutilizar. Al menos esa es una de las ventajas del software libre, que si ya hay algo bien hecho no hay porque duplicar esfuerzos, ¿no?) y entre todo lo que encontre el que mas se parecia a lo que necesitaba para el sistema de plugins fue&amp;nbsp;&lt;a href="http://www.evanfosmark.com/2009/07/simple-event-driven-plugin-system-in-python/"&gt;este codigo&lt;/a&gt;. Sin embargo aparte de que no me gustaba mucho como tenia implementado el sistema de carga de plugins (¿un archivo de configuracion? Por favor... con lo comodo y practico que es tener un directorio desde donde cargarlos al igual que se hacia con las extensiones del sistema del MacOS Classic...) tambien hacia referencia a&amp;nbsp;&lt;a href="http://pydispatcher.sourceforge.net/"&gt;PyDispatcher&lt;/a&gt;, el cual tambien hacia referencia a&amp;nbsp;&lt;a href="http://louie.berlios.de/"&gt;Louie&lt;/a&gt;. ¿Cual escoger? Al final como muchas otras veces en que tengo alternativas de codigo y me da igual uno que otro, deje que Ubuntu eligiera por mi&amp;nbsp;para ver cual era el metodo mas estandar, y como Louie era el unico que tenia paquetes dentro de los repositorios oficiales, pues me decante por el :-)&lt;br /&gt;&lt;br /&gt;Asi que aunque ha sido por algo completamente accidental, ahora tenemos un sistema de notificacion de eventos bastante avanzado. Puede que sea un problema con vistas a una futura implementacion como sistema de ficheros nativo (mas librerias externas, mas problemas de integracion), pero como apenas todavia estamos en las primeras fases de desarrollo todavia hay tiempo de modificarlo mas adelante si hace falta. De momento en cualquier caso hara falta una plataforma de plugins mas solida que la que tengo actualmente de mapear las funciones directamente, asi que a lo mejor con suerte incluso consigo matar dos pajaros de un tiro y consigo desarrollar un sistema de plugins lo suficientemente bueno como para que me lo incluyan en la libreria estandar de python (y eso si que seria un puntazo... ;-) ).&lt;br /&gt;&lt;br /&gt;Proximo paso, aprender un poco mas como funciona Louie y desarrollar el plugin de log :-D&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6741383955809102317-6204718409381109467?l=pirannafs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pirannafs.blogspot.com/feeds/6204718409381109467/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://pirannafs.blogspot.com/2010/09/symlinks-plugins-y-cintas-de-video.html#comment-form' title='4 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6741383955809102317/posts/default/6204718409381109467'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6741383955809102317/posts/default/6204718409381109467'/><link rel='alternate' type='text/html' href='http://pirannafs.blogspot.com/2010/09/symlinks-plugins-y-cintas-de-video.html' title='[0.2.1] Symlinks, Plugins y cintas de video'/><author><name>Jesús Leganés Combarro</name><uri>https://profiles.google.com/109968379540878755826</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-G1X-8HwWjfg/AAAAAAAAAAI/AAAAAAAAAAA/RekFnw3Z3WI/s512-c/photo.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6741383955809102317.post-4079209257901880163</id><published>2010-09-19T02:02:00.002+02:00</published><updated>2011-11-30T17:57:30.703+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='diseño'/><category scheme='http://www.blogger.com/atom/ns#' term='PirannaFS'/><title type='text'>Una pequeña idea...</title><content type='html'>&lt;div style="text-align: justify;"&gt;Como puse en mi anterior entrada, PirannaFS empece a hacerlo entre otras razones porque queria experimentar con FUSE. Si, cuando quiero probar una nueva tecnologia no me leo un manual y hago el famoso &lt;a href="http://es.wikipedia.org/wiki/Hola_mundo"&gt;Hola Mundo&lt;/a&gt;, me saco mi propio libro :-P y es por eso por lo que debido a todos los problemas que estoy teniendo para desarrollar PirannaFS y lo escueta, ofuscada y desfasada que es la &lt;a href="http://sourceforge.net/apps/mediawiki/fuse/index.php?title=Main_Page"&gt;documentacion&lt;/a&gt; que se puede encontrar en la pagina de FUSE por lo que estoy escribiendo mi propio tutorial de desarrollo de sistemas de archivos usando python y FUSE.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Mi idea en un principio era utilizar PirannaFS directamente como codigo de ejemplo del tutorial y es por eso por lo que he intentado que el codigo fuese lo mas claro y limpio posible, pero lo cierto es que el proyecto se ha convertido en algo realmente grande y complejo, aparte de por las optimizaciones que le he hecho para la escritura de los archivos como sobretodo por el usar una base de datos (y eso ya si que no es normal) asi que decidi empezar de cero otro sistema de archivos, este ya con mas complejo de Hola Mundo ;-)&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;PyRamFs es un sistema de archivos que usa objetos en memoria para guardar los datos: los archivos son strings y los directorios son diccionarios. Mas simple, imposible :-D Lo bueno del caso es que lo he estado escribiendo en orden de importancia a la hora de realizar un sistema de archivos, y es por eso por lo que empece con los archivos antes que con los directorios con lo que hasta ahora es un sistema de archivos de un unico nivel como el de CP/M y similares. Realmente me esta quedando bastante simple y minimalista, en parte por la simpleza del diseño y en parte porque ya no me pilla de nuevas, y es por eso que pense: si este sistema es tan simple porque (por ahora) no tiene subdirectorios... ¿se podran sacar tambien los subdirectorios del nucleo de PirannaFS para que sea aun mas simple e implementarlos como un modulo externo al igual que ha pasado con los links simbolicos?&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Asi que nada, me fui al diagrama en el que tengo organizadas las tablas de la base de datos a echar un vistazo :-D&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: justify;"&gt;&lt;a href="http://3.bp.blogspot.com/_jgtvDGkZEkU/TJVNFxY0RII/AAAAAAAAAOg/AltRbuvlWDY/s1600/tables_2010-09-19.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="456" src="http://3.bp.blogspot.com/_jgtvDGkZEkU/TJVNFxY0RII/AAAAAAAAAOg/AltRbuvlWDY/s640/tables_2010-09-19.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;(Lo que esta en el recuadro azul son las tablas del core, las que estan alrededor son modulos "de ampliacion" ya que sus primary keys coinciden con las de las tablas del core y amplian su funcionalidad, y las dos tablas de abajo son de modulos auxiliares en los que su primary key no es dependiente de ningun elemento almacenado en el core)&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Como podeis ver, dentro del core estan bastante separadas las tablas relativas a los directorios de las relativas puramente a los archivos, por lo que si no fuera por el nombre y por la fecha de creacion de la tabla links no seria complicado el sacar los directorios fuera y que el core funcione con un unico directorio aunque sin lugar a dudas donde se complicaria mas el tema seria con las consultas de acceso a los datos, que tendria que volver a cambiarlas&amp;nbsp;(¿otra vez a cambiar la estructura de la base de datos? no, por favor...).&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Sin embargo, la idea me gusta. No se si sera mejor desarrollarlo tambien como otro modulo externo y que el usuario elija uno u otro, o si ver la posibilidad de sacar los campos de nombre y creacion de la tabla links a una tabla aparte que sea la que se mantuviese dentro de la estructura minima para poder acceder a los archivos, pero en cualquier caso viendo el diagrama me he dado cuenta que aunque no tuviera nombres de archivo tampoco seria mucho problema, ya que si llego a implementar los modulos de metadatos (como el ejemplo que tengo puesto de mp3) se podria acceder directamente a traves de las bibliotecas de musica, fotos o lo que sea puramente a traves de los metadatos y entonces eso si que seria algo revolucionario: un sistema de archivos sin archivos :-P&lt;br /&gt;&lt;br /&gt;Ahora bien, en caso de que llegara a implementarlo, ¿como lo hariais vosotros? ¿que el usuario tenga que decidir entre los dos modulos (un solo nivel o sistema jerarquico), o dividir la tabla links y que el mono-nivel este por defecto? ¿la tabla directories tendria algun sentido entonces (esta puesta para forzar luego en las consultas que links.parent_dir sea efectivamente un directorio valido)? ¿lo tiene ahora?&lt;br /&gt;&lt;br /&gt;Yo, de momento, ya he alineado dir_entries con files y chunks en el diagrama por si sigo adelante con la idea... ;-)&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6741383955809102317-4079209257901880163?l=pirannafs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pirannafs.blogspot.com/feeds/4079209257901880163/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://pirannafs.blogspot.com/2010/09/reduciendo-el-nucleo.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6741383955809102317/posts/default/4079209257901880163'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6741383955809102317/posts/default/4079209257901880163'/><link rel='alternate' type='text/html' href='http://pirannafs.blogspot.com/2010/09/reduciendo-el-nucleo.html' title='Una pequeña idea...'/><author><name>Jesús Leganés Combarro</name><uri>https://profiles.google.com/109968379540878755826</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-G1X-8HwWjfg/AAAAAAAAAAI/AAAAAAAAAAA/RekFnw3Z3WI/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_jgtvDGkZEkU/TJVNFxY0RII/AAAAAAAAAOg/AltRbuvlWDY/s72-c/tables_2010-09-19.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6741383955809102317.post-7596895834144098182</id><published>2010-09-16T22:54:00.000+02:00</published><updated>2011-11-30T17:57:30.719+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PirannaFS'/><title type='text'>Comenzando...</title><content type='html'>Quizas la razon por la que no me gustan los blogs sea la misma por la que de pequeño no me gustaba tener un diario secreto, pero lo cierto es que con la cantidad de veces que me he estampado la cabeza desarrollando el sistema de archivos creo que el hecho de que tengamos que mostrar nuestras inquietudes y nuestros miedos en el concurso es una buena idea, asi que aqui esta: el famoso y siempre infravalorado primer post de un blog :-D&lt;br /&gt;&lt;br /&gt;Y despues del comentario ironico para romper el hielo, la charla. PirannaFS es un sistema de archivos de ambito general con la idea de ser ampliamente modular, ampliable y flexible y que incorpore todas las novedades que traen los sistemas de ficheros modernos pero desde una perspectiva distinta. Hasta ahora, en el State-of-Art todos los grandes sistemas de archivos modernos como son NTFS, Ext3/4, HFS+, el fallecido WinFS o mi siempre idolatrado ZFS han estado implementando funcionalidades de motores de bases de datos como demuestra el hecho de que cuando se abandono el desarrollo de WinFS se utilizo su codigo para mejorar el motor de Microsoft SQL.&lt;br /&gt;&lt;br /&gt;Y dije yo, ¿para que hacer un sistema de archivos que funcione como el motor de una base de datos cuando se puede usar el motor de una base de datos directamente? Llevaba bastante tiempo queriendo probar como funcionaba la libreria FUSE (Filesystem in USErspace) y debido a mis ultimos proyectos con python he estado usando bastante SQLite, asi que cuando llegue al ultimo capitulo del libro de Tanembaum (respecto a la lectura me parezco un poco a Hermione y su "lectura ligera" :-P ) me di cuenta no solo que eran bastante sencillos de implementar sino que ademas habia mucho terreno donde innovar, asi que&amp;nbsp;la inspiracion para empezar a desarrollar PirannaFS fue casi instantanea: desarrollar una prueba de concepto de un sistema de archivos cuya administracion este gestionada enteramente por un motor de base de datos y aprovechar todas sus ventajas, como journaling de datos, poder personalizar las estructuras de las tablas segun se necesite...&lt;br /&gt;&lt;br /&gt;Sin embargo despues empece a recordar los comentarios/criticas/quejas/sugerencias/ideas que habia leido al respecto de que con los discos duros externos y los pendrives tan grandes que hay hoy dia un sistema como FAT32 se hace ineficiente, y las alternativas que hay o bien no son practicas para un sistema portatil (NTFS o Ext3 o HFS+ tienen problemas con la portabilidad, y mas importante aun, con los permisos de lectura/escritura que lo unico que hacen en un pendrive es incordiar) o bien estan sujetos a durisimas patentes como es ExFAT, la evolucion de Fat32 a los 64 bits y a los Exabytes que estan por venir, encontrandonos con que no hay ningun sistema de ficheros apto para las necesidades de hoy dia.&lt;br /&gt;&lt;br /&gt;Por todo esto, cambie las expectativas de PirannaFS a otras mucho mas ambiciosas: desarrollar&amp;nbsp;un sistema de archivos factor comun y minimalista hasta el absurdo delegando toda la funcionalidad extra a modulos externos (el sistema base ni siquiera tiene soporte para links simbolicos :-) ) permitiendo ser usado alla donde no haga falta mas, pero preparado para poder ser ampliado y personalizado a traves de modulos externos que funcionen alla donde esten habilitados segun las necesidades del usuario: versionado de archivos, logging de actividad, ACLs, checksum de los datos, busqueda por metadatos, soporte de varios volumenes de disco simultaneamente...&lt;br /&gt;&lt;br /&gt;Y aunque todavia falte mucho para ello y quizas tenga que cambiar de python a C y embeber el motor de SQLite dentro de la aplicacion, espero que algun dia en lugar de estar la base de datos separada de los datos propiamente dichos llegue a ser autocontenido y pueda llegar a arrancar linux desde el :-D&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6741383955809102317-7596895834144098182?l=pirannafs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pirannafs.blogspot.com/feeds/7596895834144098182/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://pirannafs.blogspot.com/2010/09/comenzando.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6741383955809102317/posts/default/7596895834144098182'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6741383955809102317/posts/default/7596895834144098182'/><link rel='alternate' type='text/html' href='http://pirannafs.blogspot.com/2010/09/comenzando.html' title='Comenzando...'/><author><name>Jesús Leganés Combarro</name><uri>https://profiles.google.com/109968379540878755826</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-G1X-8HwWjfg/AAAAAAAAAAI/AAAAAAAAAAA/RekFnw3Z3WI/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry></feed>
