Apr 10 2009

Sujeto-objeto

Con eso de la abolición de la dicotomía sujeto-objeto todo sujeto puede ser objeto y todo objeto es también posiblemente un sujeto. Esa es la experiencia más aterradora de la posmodernidad.


Mar 24 2009

Hard work

I am very tired.

Two long months trying to push my project out of the door.

I never thought that it would be so hard. Indeed it is very hard. You have to have your nose into everything. It is not just the application, that per se is already a very demanding mental and physical activity, but also the paperwork to start a business, the paperwork, the money, fees, taxes, lawyers, the banks, etc. And don’t forget the operational ones: the domain, the SSL certificate, the merchant account, the gateway for the credit card transactions, the look & feel of the app, the database, the unit testing, the functional testing, the load testing. And all of this in your free time, after day work, in the night, sometimes until dawn. Sleeping bad, sleeping with the eyes open in the day. Trying to get more hours of a single day.

Don’t forget the beta testers. I don’t have anything against them, in fact they are the most valuable source of feedback for the app. Without them I would be building beautiful and almost-useless feature-loaded apps that in my fantasy world would met the user needs. They prevent the application to grow into a mess. This alone deserves my most grateful respect for them. But they also give you ideas of new features that, they say, it would be absolutely nice to have in version 1.0. It is easy to consent and add the features to the app. But if you do this, it will never be a version 1.0. So one of the most dificult things in this long way to 1.0 it is to politely say: thank you very much but not in this version. The good thing is, they know that you are hearing them.

Finally, the fear.

This is the most dificult one. Every three or four minutes you think, this is not going to work. This will have no value for anybody. This will be a big failure. Well, it may be. Nothing is for sure. But I try to overcome the fear and to imagine that everything it will be alright. Look, the worst thing that can happen it is that nobody like it. Well, nobody has died of depression (I hope).

The fear is a very powerful enemy. You can’t see it, you can’t forget it. You can’t buy something that makes it disappear. The only thing you can do is confront it. If, at the end, everything goes wrong, you can say that you tried hard.

I’m trying hard. I have fear but I’m trying.

Hopefully, this period will pass soon and I could see if it was worth the effort. Besides, no matter the outcome, I’m learning a lot in the process.

So here I’m, trying to reach 1.0. I can see the finish line already. A little more. Another push.


Jan 2 2009

Vacaciones

Las vacaciones vinieron y se fueron. Dejaron recuerdos, alegrías, asombro, festejos y cansancio. Va el relato:

Todo comenzó el viernes 19 de diciembre. No, más bien, todo comenzó el jueves 18, con mucho trabajo pendiente aún antes de poder irme sin preocupaciones. Después de salir tarde del trabajo, tratando de avanzar lo más posible, me resigné y preferí llegar el viernes muy temprano para terminarlo, sobre todo porque de todas maneras debía yo ir el viernes. Además, ya era hora de llegar a la casa para la cena con Álvaro. Pasé a comprar las botellas de vino para acompañar al fettuccine con salmón que Aline iba a preparar y Álvaro a aprender. La cena estuvo deliciosa como siempre y el vino no se quedó atrás. Nos pusimos a platicar mientras duró la botella y aún nos faltaba poner nuestra maleta. Luego de que Álvaro se retiró, comenzamos a preparar la maleta porque el viernes nuestro vuelo partía a las 2:45 pm. Pero además yo tenía que terminar otro documento para otro proyecto que traigo, por lo que después de terminar con los preparativos para el viaje, me puse a trabajar. Me dormí a las 3:30 am y me levanté a las 6 am. Tratando de verle el lado bueno, ya que ese día era el día que comenzaban las vacaciones, llegué a la oficina a las 7 am a terminar las cosas que dejé pendientes el día anterior. Salí a las 11 am y regresé a la casa. Preparamos la maleta, bañamos a Tristán, revisamos la lista de pendientes y cuando vimos que ya no nos faltaba nada, desayunamos. Tomamos el taxi y nos dirigimos al aeropuerto: dos largas horas de espera, hacer fila para documentar las maletas, Tristán feliz corriendo por todos los lugares a donde no está permitido pasar, comer comida carísima en el aeropuerto; lo normal en estos casos. Abordamos. Tratamos de mantener despierto a Tristán para que viera el avión pero media hora antes de subir cayó rendido. Cuando abordamos el avión lo desperté rápido para que viera el avión (le encantan) pensando que se dormiría nuevamente. Pues no. Se fue todo el vuelo (dos horas) despierto. El problema no es que estuviera despierto, sino que no hubo manera de convencerlo de estarse quieto y no echarse a correr por los pasillos. ¡Toda una hazaña! Al fin, y a pesar de todos los pronósticos en contra, llegamos a Cancún sin que Tristán hiciera del avión su patio de juegos.

Yo no nací para climas cálidos. Prefiero soportar el frío que aguantar el calor. Ya me había hecho a la idea de que me la iba a pasar con la ropa empapada de sudor y pegada al cuerpo. No fue tanto, aunque si es notable el cambio de clima. Nunca había ido al sureste mexicano. Todo mundo me hablaba maravillas de él. Además, tenía un interés especial por conocer Cobá. Hasta bromeaba diciendo que me iba a llevar mi banderita para ir a reclamar el legado de mis antepasados. Pues al fin estaba allá. Llegamos a las 5:30 pm y ya estaba oscureciendo. Esa noche solamente tuvimos tiempo de rentar un auto, cenar en un restaurante mega caro (aunque rico, eso sí) y hacer el check in en el hotel.

En realidad el viaje a Cancún era para asistir a la boda de Mariana, la mejor amiga de Aline, pero fue el pretexto perfecto para conocer esos lugares. La boda era hasta el lunes, lo que nos dejaba libres el sábado y domingo. Desgraciadamente muy poco tiempo para conocer tantos lugares, así que lo aprovechamos lo mejor que pudimos. El sábado nos levantamos temprano, desayunamos y nos fuimos a Tulum. Hermoso, irrealmente paradisiaco. El lugar más hermoso sobre este planeta. De todos los lugares a donde fuimos en estas vacaciones es el que más se me grabó en el alma. El mar es absolutamente hipnotizante. El aire y la vegetación junto con las ruinas sobre la tierra y la arena blanca de la playa le dan un toque mágico que te hace imaginar los tiempos cuando esta zona estaba poblada por sus habitantes originales. Debió se maravilloso vivir en un mundo así. Yo llevaba cargando a Tristán, quería cargarlo cuando viera por primera vez el mar. En algún momento, entre las ruinas, divisamos el mar azul y se lo señale a Tristán. No se que habrá pensado o si para el era igual de trascendente que para mi ese momento. Desde que llegamos a Tulum y comprábamos los boletos para entra a las ruinas arqueológicas comencé a sentir un imperioso deseo de ver el mar. Cada paso que nos acercaba cerca del mar hacia que fuera más grande e irresistible ese deseo. No se si la sangre llama, pero se lo que sentí y por eso cargué a Tristán, para que juntos sintieramos eso. Aline venía a mi lado, emocionada y feliz de estar ahí conmigo y con Tristán. Yo estaba más que feliz de estar ahí con ellos. Hasta ese momento no había comprendido la magnitud de esa visita. Finalmente llegamos a la orilla del mar. Y ahí, Tristán, Aline y yo contemplamos el mar milenario que tantos habían visto antes que yo. En el que tantos se habían sumergido regresado a la matriz del mundo. Definitivamente hay algo en el agua que encanta, que atrae. No aguanté más y sin esperar a los demás me bajé con Tristán las escaleras hasta la playa. Sentí la arena blanca tantas veces descrita. Tristán se empezó a poner nervioso con las olas, con la majestuosidad del mar. Cuando traté de ponerlo sobre la arena comenzó a llorar. Vimos las olas romper contra la arena, sentimos a arena, vimos el horizonte. Aline y sus papás llegaron y nos dispusimos a meternos al mar. Yo no lo pensé dos segundos y, nuevamente sin esperar a los demás, me metí al agua. ¡Oh maravilla! Volver a lo básico, a lo primitivo del hombre. A sus primeras experiencias con el mundo infinito, inabarcable e incomprensible, lleno de misterios y magia; cuando el hombre era más uno con el mundo que en esta época de aviones y compra de boletos a Cancún por internet. Salí por Tristán e intenté que se metiera al mar o que al menos se mojara los pies con las olas que llegaban a la playa. No hubo manera. ¡Vaya que es firme en sus decisiones este niño! Decidió que el mar era demasiado extraño para animarse. Lo cargué y me metí con él hasta que el agua le llegó a las rodillas mientras que yo lo cargaba. Lloraba asustado, así que lo regresé a la playa y se quedó ahí con sus abuelos jugando con la arena. Yo me quedé en el agua todo el tiempo. Aline me alcanzó. Pero el tiempo pasa muy rápido cuando eres feliz. Y llegó el momento de irnos. Me resistía a salir del agua, pero Cobá nos esperaba. Después de varios kilometros y un vuelta mal dado que nos llevo a visitar por accidente Yucatán, llegamos a la zona arqueológica de Cobá. Aline y yo subimos la pirámide Nohoch Mul, que es la principal de Cobá. Una vista impresionante desde arriba. Tomamos fotos, nos sentamos, entramos. También tomé 5 piedritas de la cima de la pirámide como gesto simbólico de la toma de posesión de mis terruños. :) Y de los de Tristán también.

Ese día en la noche fuimos a conocer Playa del Carmen, que es donde nos estuvimos quedando. Cenamos y nos fuimos a dormir.

El domingo nos fuimos a Xel-Há. Muy bonito, muchas actividades, mucha comida y bebida. Mucho buceo con Aline. Bajar el rio buceando con ella es uno de esos momentos memorables. Tristán maravillado viendo iguanas, delfines, tucanes y peces. El clima maravilloso, la comida muy rica, el sol muy agradable. En la noche ya estábamos muy cansados y solamente llegamos a dormir al hotel. Al día siguiente era la boda.

Boda en lunes. Inusual. Se nos hizo tarde y no encontrábamos la iglesia, pero llegamos justo al medio día y al medio de la boda. Después la fiesta en una palapa al lado del mar de Cancún. No pudimos entrar al agua, ya que íbamos muy bien arregladitos. Tristán hasta corbata azul se puso. Después de la fiesta, de la que nos retiramos como a las 8 pm porque el viento al lado del mar estaba imposible de soportar y menos con Tristán saliendo de una gripe, nos fuimos a una plaza comercial muy peculiar llamada La Isla. Ahí, después de darle la obligatoria vuelta para ver las tiendas, cenamos fondue de queso y vino (aunque no tan bueno como los que hace Aline) en un restaurante italiano.

Ya solamente nos quedaba medio día en Cancún y queriamos aprovecharlo, así que el martes muy tempranos nos fuimos a la playa de Playa del Carmen. No tan bonita como Tulum, pero bonita. Tristán nuevamente no se acercó al agua. Solamente Aline y yo. Los papás de Aline y Tristán se quedaron en las sillas jugando en la arena.

Finalmente regresamos al hotel a arreglarnos y hacer el check out. Entregamos el auto y nos llevaron al aeropuerto. Esta vez Tristán pudo ver el avión todo el tiempo y se durmió durante el viaje lo cual fue un par de horas de tranquilidad para nosotros. Llegamos a la Ciudad de México a las 9 con tráfico y toda la cosa. Solamente llegamos a aventar las cosas y preparar nuevamente la maleta porque ahora seguía Puebla.

Salimos a las 6 am, después de dormir 5 horas. Llegamos Aline, Tristán, mi mamá y mi primo a las 10am del 24 de diciembre. Justo a tiempo para iniciar los preparativos de la fiesta que se avecinaba. Al día siguiente se bautizaba mi sobrino.Pero antes, el 24 comimos y cenamos muy rico. Al día siguiente fue el bautizo y luego más comida rica. Ya para entonces resentíamos el cansancio, así que el viernes nos dedicamos a descansar.

Pero el sábado nuevamente a las andadas, nos fuimos a visitar el pueblo del que son originarios mi familia. En medio de las montañas de la sierra negra de Puebla, fuimos a visitar la casa donde crecieron mi mamá y mis tios. Muy tranquilo, muy relajante y muy lejos del bullicio de la ciudad. Regresamos de noche por una carretera que aunque de día parecía muy bonita por los paisajes, por las noches es muy peligrosa, ya que está absolutamente sin señalización. De hecho hay puntos donde no sabes en que carril vas y solamente te guías por las luces de los demás automóviles o de plano, donde no hay automóviles, por los gritos asustados de Aline de que ya estábamos saliéndonos de la carretera. :)

Para entonces ya extrañábamos muchísimo nuestra propia cama. Tristán ya estaba harto de tanto viajar en coche y además el lunes regresaba yo a trabajar, así que el domingo al medio día tomamos camino nuevamente a la Ciudad de Mexico. Y para terminar con broche de oro estas vacaciones, con el cuerpo muerto de cansancio y con ganas de llegar y acostarnos, nuestra casa nos recibió con los brazos abiertos y un tiradero que exigía limpieza inmediata. Ni modo, a limpiar. Como a las 8 de la noche terminamos y nos pusimos a ver una película, tomarnos una cerveza y descansar lo poco que se pudiera de estas ajetreadas pero muy divertidas y memorables vacaciones antes de regresar a la rutina de siempre y al trabajo.


Nov 28 2008

Development environment for Seaside

This is my development environment for Seaside.

One virtual machine (vm1) is for Seaside over Squeak development. I work here most time, forwarding X to my host machine and testing the application by pointing to http://vm1:8080/seaside/myapp. Details here.

The second machine (vm0) is for testing integration of my Seaside application on Gemstone/S 64. After loading my app to Gemstone I test the app by pointing to http://vm0:8080/seaside/myapp. Details here.

Finally, in my host machine I have Debian GNU/Linux 5.0 amd64 (Lenny) for my every day work (writing docs, hearing music, watching videos, browsing internet, writing blog posts, IM, etc). Also, from my host machine I can fire the stress tools to test either the load capacity or the load balancing of the application.

Advantages:

  • I start the virtual machines only when I need them.
  • My host laptop boot time it is minimal.
  • I don’t have to create a 32 bit chroot inside my laptop
  • I have a clean 32 bit Debian and a clean 64 bit Debian for other uses
  • I can test having the static content in a virtual machine and the application in other and use a proxy to redirect to the correct machine.
  • I can test having my application behind a proxy
  • I can test load balancing of my servers

Disadvantages:

  • More machines to administer
  • More configuration and setup involved
  • You need a 64 bit machine and a decent amount of RAM and a capable CPU (I have 4GB RAM and a AMD Turion 64 X2 CPU)
  • You need to be comfortable administering several machines

But, for me, it works. Maybe it can work for you too.


Nov 27 2008

Install Squeak/Seaside on a KVM virtual machine

Host Machine
Architecture: x86_64
Name: laptop
OS: Debian GNU/Linux 5.0 amd64 (Lenny)
Virtual Machine
Architecture: i386
Name: vm1
OS: Debian GNU/Linux 4.0 i386 (Etch)
Virtual Machine Software
GemTools 2.3
Seaside One Click Experience 2.8.3

Install the virtual machine following this
instructions. Be sure to select CPU Architecture: x86_64, but install a 32 bit OS.
After installation add the IP address assigned to the virtual machine to
/etc/hosts on the host machine.

I have only installed the Starndard System. That is, no X or desktop environment. Why, because I want to forward X and use my host machine as the X server.

In the virtual machine, install the package xbase-client. This package and its dependencies are the minimal packages necessary to forward X apps to another server. As root:

vm1:~# aptitude install xbase-clients

Now, log out and login again but with a different syntax. Instead of

miguel@laptop:~$ ssh vm1

Log in with the -X option enabled (you can make this option enabled always in .ssh/config. See the man page from ssh)

miguel@laptop:~$ ssh -X vm1

And proceed to download Seaside and the GemTools:

miguel@vm1:~$ wget http://www.seaside.st/distributions/Seaside-2.8.3.app.zip

miguel@vm1:~$ wget http://seaside.gemstone.com/squeak/GemTools-2.3.zip

Unzip them and try them.

Seaside:

miguel@vm1:~$ unzip Seaside-2.8.3.app.zip
miguel@vm1:~$ cd Seaside-2.8-578.app/
miguel@vm1:~/Seaside-2.8-578.app$ ./Seaside.sh

You should see the Seaside Squeak image open as a window on your host machine X server.

The same applies to the GemTools Squeak image. But before trying to connect to the remote Gemstone/S server, you must do some tasks:

1. Add the remote server IP to the virtual machine /etc/hosts. In my case I’m going to connect from vm1 to vm0 (the Gemstone/S server) so I added this line to vm1’s /etc/hosts:

192.168.122.137 vm0

2. You need to add

# Local services
gs64ldi 50377/tcp # Gemstone netldi

to your virtual machine’s /etc/services file. This is because GemTools use this name instead of the port number to connect to Gemstone/S. If you don’t add this line, you must use the port number in the Login window of the GemTools image.
After doing this changes, unzip the GemTools and start the image:

miguel@vm1:~$ unzip GemTools-2.3.zip
miguel@vm1:~$ /home/miguel/GemTools-2.3.app/GemTools.sh

You must start the image using the full path to the script or the connection won’t work because of a softlink pointing to a nonexistant directory. In the Gemstone/S Login window from the GemTools image, write vm0 in the Stone section’s “!tcp@” parameter and in the Gem section’s “!tcp@” parameter. Make sure the Gemstone/S is running on your server and press the Login button. You shouldn’t have any problem.

These instructions are an adaptation from Dale Henrichs and James Foster ones.

There is something very important to have in mind. You are working ON THE REMOTE (virtual machine in this case) machine. You are ONLY viewing the graphics on the local X server. If you modify something, you’re modifying it in the remote machine. Also, the network address, this will be resolved from the perspective of the remote machine. Don’t forget it.

As you can see, by using a 64 bit KVM virtual machine on your x86_64 hardware with a 32 bit OS, you can run a squeak image on a 32bit squeak virtual machine without any problem. What is more, in the case of Debian, you don’t have to create a 32 bit chroot inside your amd64 installation. Very clean.

Enjoy.


Nov 27 2008

Install Gemstone/S 64 on a KVM virtual machine

This instructions are very similar to the slicehost setup from James Foster’s post, but this time on a KVM virtual machine.

Host Machine
Architecture: x86_64
Name: laptop
OS: Debian GNU/Linux 5.0 amd64 (Lenny)
Virtual Machine
Architecture: x86_64
Name: vm0
OS: Debian GNU/Linux 4.0 amd64 (Etch)
Virtual Machine Software
Gemstone/S 64 Web Edition 2.3

Install the virtual machine following those instructions. Add the IP address assigned to the virtual machine to /etc/hosts on the host machine. Log in to the virtual machine and, as root, add your normal user to the sudoers file

vm0:~# visudo

The last lines of the file should be like this:

# User privilege specification
root ALL=(ALL) ALL
miguel ALL=(ALL) ALL

Save changes and as normal user on the virtual machine, download Gemstone/S (Note: this instructions are identical to the ones from James Foster’s post);

miguel@vm0:~$ wget http://seaside.gemstone.com/scripts/installGemstone2.3-Linux.sh
miguel@vm0:~$ sh installGemstone2.3-Linux.sh

This will ask for your user password and then will download and install Gemstone/S 64 Web Edition to the virtual machine’s /opt/gemstone.

Reload your sysctl changes. Either running:

miguel@vm0:~$ sudo sysctl -p

or rebooting the virtual machine:

miguel@vm0:~$ sudo reboot

Log in again to the virtual machine if needed and execute:

miguel@vm0:~$ echo “SHR_PAGE_CACHE_SIZE_KB = 100000;” >> /opt/gemstone/product/seaside/data/system.conf

Start the start the Gemstone/S 64 Web Edition:

miguel@vm0:~$ source /opt/gemstone/product/seaside/defSeaside
miguel@vm0:~$ startGemstone
miguel@vm0:~$ startSeaside_Hyper 8080

And, from your host machine, test Seaside by pointing your web browser to:

http://vm0:8080/seaside

To stop Hyper press Ctrl+C and then stop Gemstone:

miguel@vm0:~$ stopGemstone

That’s all.


Oct 29 2008

Oracle Database 10g Administrator Certified Associate

Several weeks have passed since the last post. Well, I have been busy attending an Oracle course kindly paid by my employer.
This monday was the first certification exam and I passed it. So, now I am an

Oracle Certified Associate

Now to update my Curriculum Vitae.

The last week of November I will be attending the second course and in early December the second exam will take place, this time for the Oracle Certified Professional. That will be harder than this one, I am sure. So to practice.


Sep 27 2008

Gemstone/S and FastCGI with lighttpd

I was reading the post from James Foster about configuring Apache/FastCGI for serving Seaside. I prefer Lighttpd because, as its name implies, it needs less resources to run. And with virtual hosting, as I have my servers, memory it is a big factor.

I followed the steps to install Gemstone/S in my machine. Instead of a hosted server, I used my laptop with my user as server.
After testing that Seaside was running OK in my machine, using:

miguel@laptop:~$ source /opt/gemstone/product/seaside/defSeaside
miguel@laptop:~$ startGemstone
miguel@laptop:~$ startSeaside_Hyper 8080

and navigating to:

http://localhost:8080/seaside

I stoped the Hyper Webserver with Ctrl+C.

Now to install lighttpd in my Debian GNU/Linux 4.0 etch machine. As root:

laptop:~# aptitude install lighttpd lighttpd-doc

and backup the default config file:

laptop:~# cp /etc/lighttpd/lighttpd.conf /etc/lighttpd/lighttpd.conf.bak

then use this configuration for lighttpd.conf:

# Modules activated
server.modules = ( “mod_access”, “mod_alias”, “mod_accesslog”, “mod_fastcgi” )
# Document root, maybe there you have other sites also
server.document-root = “/var/www/”
# logs
server.errorlog = “/var/log/lighttpd/error.log”
accesslog.filename = “/var/log/lighttpd/access.log”
# Welcome file
index-file.names = ( “index.html” )
# Do not server files beginning with
url.access-deny = ( “~”, “.inc” )
# Server config
server.port = 80
server.pid-file = “/var/run/lighttpd.pid”
dir-listing.encoding = “utf-8″
server.dir-listing = “disable”
server.username = “www-data”
server.groupname = “www-data”
# FastCGI
# Debug enabled, disable on production sites
fastcgi.debug = 1
# Do FastCGI for anything with prefix /seaside
# load-balancing with 3 hosts
# check-local disable searching the requested file in the lighttpd document root and
# forward the request to the fastcgi hosts
fastcgi.server = ( “/seaside” => (
    ( “host” => “127.0.0.1″, “port” => 9001, “check-local” => “disable”),
    ( “host” => “127.0.0.1″, “port” => 9002, “check-local” => “disable”),
    ( “host” => “127.0.0.1″, “port” => 9003, “check-local” => “disable”)
  )
)

Instead of starting Seaside over Gemstone/S with startSeaside_Hyper <port>, I used the provided script to start 3 gems for fastcgi as per James’ instructions:

miguel@laptop:~$ runSeasideGems start

This started 3 fastcgi gems, listening in ports 9001, 9002 and 9003.

Then I restarted lighttpd:

laptop:~# /etc/init.d/lighttpd restart
Stopping web server: lighttpd.
Starting web server: lighttpd.

And tested that the default index page for lighttpd (located in /var/www/index.html) was served statically (you can add anything here)  from the server document root (/var/www/), pointing the browser to:

http://localhost/

Finally, I tested that the /seaside part was correctly delegated to Gemstone/S using FastCGI, pointing the browser to:

http://localhost/seaside

This time I get the dispatcher from Seaside, from where you can navigate the links from Seaside without problems.

This way you can use, for example, blueprint for the CSS style of your app, or maybe TinyMCE, for having a full fledged text editor. All you have to do is to put them in a directory inside the document root of lighttpd (/var/www in this example) and in the Seaside application, you reference them with the absolut path to your website, for example:

http://mysite.com/styles/blueprint.css

or

http://mysite.com/tinymce/jscripts/tiny_mce/tiny_mce.js

So, the webserver to serve the static content of your site (faster) and Seaside to serve your webapp.

Enjoy.


Sep 24 2008

Okcoba Fest

Yo, Miguel Cobá, en mi carácter de representante absoluto y vitalicio de mí mismo, con fecha 24 de setiembre del año del señor 2008, siendo las 16:39
horas en el horario local, 21:39 hrs en el horario universal, en la centenaria, hermosa y ahora muy atribulada Ciudad de México

DECLARO

oficialmente iniciados los festejos conmemorativos del natalicio de nuestro humilde, sonriente, amigable, entrañable, guapo, inteligente, trabajador y muy modesto representado.
En este tenor

ORDENO

que, a partir de las 23:59 minutos en tiempo local y durante un periodo no menor a 3 días y no mayor a lo que sea saludable para el buen mantenimiento de la salud del hígado humano normal de una persona adulta de 29 años, deberá festejarse, en cualquier lugar donde se encuentre uno, a la hora en que así sea conveniente, solo o en compañía, de manera preferente con el interesado, con toda suerte de sustancias y actividades tradicionalmente usadas al efecto en ocasiones de similar trascendencia, y apegados a la tradición, tanto mexicana como ingenieríl, incluyendo sin limitar:

  • derivados etílicos de la uva, la cebada, el agave azul, el arroz y las frutas dulces, así como bebidas dulces, derivadas de frutas o carbonatadas que produzcan una combinación agradable al gusto humano
  • los derivados lácteos en sus diversas variedades generalmente conocidas como quesos, preferentemente en sus presentaciones edam, de cabra, manchego y con ceniza
  • abrazos, besos (preferentemente de personas del sexo femenino, aunque del pequeño caballero de la mesa redonda se aceptan sin chistar y con emoción), actividades intimas y lúdicas para adultos (con exclusividad total para la filósofa y aspirante a curadora de arte, mejor conocida como Frau Kunst)
  • actividades de mesa incluyendo sin excepción, cartas, dominó, jenga, así como concursos coloquialmente conocidos como fondos y muppets
  • narración de anécdotas típicas, emotivas, avergonzantes, divertidas, por n-ésima ocasión al calor de la velada, así como la tradicional reinterpretación del sentido de la vida, del hombre y sus motivaciones, el espíritu del vino y el secreto escondido en el cuerpo de las mujeres y en la risa de los niños.
  • música al gusto del momento, con especial atención a la preferida por nuestro conmemorado

Sin otro afán que el de agradar y hacer patente nuestro amor y la felicidad que nos da el pretexto para honrar a Baco en su más mundana faceta y a participar de Eros en su más práctica y apapachante expresión, decreto:

QUE INICIE EL “OKCOBA FEST” 2008

PD. La sede principal de los festejos será, como siempre, la residencia oficial de nuestro conmemorado donde se les espera el día sábado 27 a las 19 horas tiempo local y hasta que el cuerpo (o el hígado) aguanten.

PPD. No se aceptan regalos, solamente asistencias, risas, “saluds”, abrazos y llamadas telefónicas (así como sus equivalentes modernos Web 2.0). Abstemios, se les insta a hacer un esfuerzo y dejar atrás sus arcaicas y no sociales prácticas :).

PPPD. Si alguien quiere traer regalos, estos no serán despreciados sino que se aceptarán con el más humilde y sincero agradecimiento.

PPPPD. Pero no son obligatorios los regalos.

Al margen un sello con el escudo nacional que dice: “Patronato Oficial para el Festejo del 29-nario del Natalicio de Miguel Cobá”. Una firma ilegible. Secretario General del Patronato para el festejo de Miguel Cobá.

Extiendo la presente en 2 fojas útiles, en México, Distrito Federal, a los 24 días del mes de setiembre del año de nuestro señor dos mil ocho, a fin de que sea publicada en el diario oficial de la federación, y en los diarios de mayor circulación nacional a fin de que sea de conocimiento general de la ciudadanía.

Miguel Cobá, Presidente del Consejo de Administración del Fideicomiso 2008/09/25MCM/ aprobado por la H. Cámara de Diputados, en su sesión extraordinaria y urgente del 23 de setiembre del año de nuestro señor dos mil ocho, para la creación del Patronato para el Festejo del N-ario del Natalicio de Miguel Cobá. Presente.


Sep 22 2008

F***ing MySQL

One more time, I am having trouble with the MySQL database I administer.
Look, this MySQL database was inherited. It contains ~30 databases, most of them MyISAM type. One of them, the biggest, with more than 30GB of data (150 millions registers). The configuration for MySQL especified a first innodb tablespace file of 20GB and a second file of 10MB, with autoextend. From my.cnf:

innodb_data_home_dir = /data/mysql/data
innodb_data_file_path = ibdata1:20000M;ibdata2:10M:autoextend

I was in the migration from MyISAM to InnoDB, in order to have transaction support. But, as I noted after starting the migration of tables, the innodb files used for storing the mysql tables NEVER shrinks. Never, even if you delete tables, drop tables or drop databases. Always grows but never returns unused space to the operating system. Unbelievable.
According to the bug tracking system for mysql (bugs 1341, 1287) this is a design decision to improve performance: if the space were disposed each time a delete is peformed, it would need to be allocated again when more data were written to the database. So it is only marked as deleted but not returned to the operating system. That is reasonable. In fact it is a good point. But there are times when you just need to free the innodb unused space and IT IS NOT possible, in an automatic or, at least, in a manual way.
Why would you need this. Supose, for example, that I have a 100 GB disk. It is used only for mysql. There is only a database of 40GB in it. So I have ~60GB of space free. One day I need to restore an old backup for this database. I create a new database and restore the old backup inside this database. If I have MySQL configured as all Innodb, the new database would be created in the innodb tablespace, so MySQL will grow the tablespace to say 80GB so the restored backup can be loaded. At this moment, I have 80GB used by the tablespace and only 20GB of free space in the disk. After extracting the data from the backup, I delete the restored database. One would think that the 40GB would be returned to the OS, but NO! The table space size is 80GB although only 40GB are really used, in fact, SHOW TABLE STATUS would show that it is only 50% used. If my original database doesn’t grows to fill the 80GB used by the innodb tablespace or grows very slowly I have actually lost 40GB from my disk and I can not do anything easy to recover that space. In other words, I have lost that space.
Of course there are workarounds for this problem, but they involve dumping and restoring the databases and more important, YOU MUST shutdown the database. That is not always posible. Maybe in a weekend or in the night, but that can be too late if you are running out of disk space.
It is needed a command to force MySQL to free unused space, under the responsability of the DB administrator. At this time, there isn’t any.
So the only way to add more free space to my database was by means of the operating system. My filesystem was like this:

[root@usp02 root]# df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/cciss/c0d0p3      64G   36G   26G  59% /
/dev/cciss/c0d0p2      99M   11M   83M  12% /boot
/dev/cciss/c0d1p1      67G   62G  2.4G  97% /data
none                  2.9G     0  2.9G   0% /dev/shm

and there were still 3 tables in the migration process. I was feeling real panic. Besides, it is Monday morning. The only feasible moment for shutdown is the next weekend or, in case of extreme urgency, until tonight.
Finally, after several hours searching for a solution for the problem in MySQL, I decided to search ways to free space in the filesystem of the operating system. Happily I found a way to reduce the space reserved for root in a ext2 filesystem from the default 5% of the disk size to 1%. The instructions are here. And I don’t even have to remount the filesystem. The change was applied inmediately.
I just typed:

[root@usp02 root]# tune2fs -m 1 /dev/cciss/c0d1p1
tune2fs 1.32 (09-Nov-2002)
Setting reserved blocks percentage to 1 (177816 blocks)
[root@usp02 root]# df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/cciss/c0d0p3      64G   36G   26G  59% /
/dev/cciss/c0d0p2      99M   11M   83M  12% /boot
/dev/cciss/c0d1p1      67G   62G  5.1G  93% /data
none                  2.9G     0  2.9G   0% /dev/shm

So I could get 2.7GB that hopefully will last until I can shutdown MySQL, remove the autoextend from the second innodb file and add a third tablespace in another filesystem with enought free space.

One more thing I don’t like about MySQL.

Uff.