home icon contact icon rss icon

QUFB !

esto del internet es la hostia… y si eres administrador de sistemas, más divertido aún.

todos los sysadmins saben que el mundo te quiere atacar cuando tienes un servidor, y tu te tienes que defender, eso es lo divertido.

yo en general no tengo ni pu*a idea de defenderme, (soy programador !) pero de vez en cuando miro los logs.

y hoy he visto QUFB ! muuuchos QUFBQUFBQUFBQUFBQUFBQUFB seguidos en los logs.

he hecho un whois de las ips que me atacan (una en hong kong, la otra desde UK), y buscando por el internet he visto una referencia a esto: http://archive.cert.uni-stuttgart.de/incidents/2005/06/msg00007.html

como dice ahi, QUFB es ‘AAAA’ en base64, y ‘AAAA’ lo usan los wannabes en los exploits de buffer-overflow…

os he pillao !

malditos jakers

Generación de contenido

desde que floreció internet, hay un concepto que ha ganado bastante relevancia: contenido.

Está ese concepto de “User Generated Content” que muchas empresas intentan capitalizar (p.ej Flickr, donde el “user-generated content” son las fotos, o Twitter, donde el UGC son los tweets o cambios de estado, está Facebook, donde el UGC son fotos+estados+ mensajes, etc).

Antes había esas empresas llamadas de Media: ellos generaban “contenido” (la CNN generaba videos de noticias, la MTV generaba videoclips, la National Geographic generaba documentales, el NYTimes generaba artículos, las revistas generaban artículos sectoriales…).

Ahora las empresas de internet intentan saltarse el paso de “generar” el contenido, e intentan capitalizar en los usuarios generandolo, y ellos distribuyéndolo, y cobrando por los anuncios, claro.

en algún momento de mi vida he pensado: esto de la “generación de contenido” así en genérico, es una cosa rara. Porque mis actividades diarias como usuario: hacer fotos, escribir cartas, poner mi estado en twitter, chatear, cocinar… pueden ser considerados como “contenido” por alguna empresa. Al fin y al cabo, qué es contenido ? es un registro (foto, texto…) de algun pensamiento o actividad.

Llevando el concepto al extremo, mi pensamiento es contenido, y es mucho ! todo lo que llevo pensando en estos 30 años de vida, y lo que llevo soñando, las imágenes que he imaginado, todo es contenido. Alguno ha sido plasmado (registrado) y otro se perdió en mi cabeza. Y otro queda en la memoria, pero va degradandose, como ya sabeis :P.

Google tiene el mantra de “Organizar la información del mundo”, es decir: organizar el contenido y hacerlo accesible, buscable, indexarlo.

Cuanto “contenido” podria generar una persona en su vida entera ? podria digitalizarse y guardarse ? media hora de sueño: una historia sobre una aventura que tengo escapando de una avalancha de gente por las calles de mi pueblo, y me voy encontrando amigos, y todos escapamos. Imaginad cuantos sueños ! se podria traducir en bytes ? se podria hacer una aproximación en cuantas horas de video, o de texto, han transcurrido por mi cabeza a lo largo de mis (8h/dia365dias/año30años) 87.600 horas de sueño ?

y que decir de mis (87.600*3) 262.800 horas de vigilia ? cada cosa que piensas es contenido, pero no queda registrado, no seria fascinante tenerlo todo indexado y puesto en común ? estaríamos hablando ya de la humanidad convergiendo en un super-ente más divino que humano.

y Google, podria indexarlo ?? jejejje

pensad, amigos mios, pensad !

declaración de la renta y su PADRE 2009

por lo que he visto por ahí, han cambiado el programa PADRE que en teoria nos ayuda a hacer nuestra declaración.

yo no soy experto en usabilidad, pero lo abro, encuentro un sitio donde pone “Nueva Declaración” y una pantalla nueva en la que todos los botones están deshabilitados.

He probado en Mac OS X y pensé que quizás era culpa de la JVM de mac, luego voy a Windows y lo mismo.

vaya, al final he leido por ahí que si no escribes algo un TextBox que hay debajo de “Índice de Declaraciones” está todo deshabilitado, y solo se habilita cuando introduces algun texto en esa imaculada caja de texto, en la que no hay ni un trista Label que diga qué hay que poner, ni un triste ToolTip que te de una pista.

usabilidad: 0.

Elias

lydia o lidya2

Acabo de ver este video de TED:

http://www.youtube.com/watch?v=dE1DuBesGYM

la señora empieza diciendo que cada semana los gamers se pasan 3 billones de horas jugando (3.000.000.000 horas).

entonces dice que ella ha calculado que si en vez de jugar 3 billones de horas a la semana, se jugara 21 billones de horas, podriamos solucionar todos los problemas principales del mundo.

claro cuando cualquier persona racional oye esta afirmación, lo mas sensato que se le ocurre es pulsar “Next” o “Back” o ir a google o a gmail y seguir leyendo otras cosas más interesantes de los Internets…

pero si continuas escuchando el video, te das cuenta de que en realidad esta es una afirmación para captar la atención, y que toda la argumentación que va detras para explicarlo tiene bastante sentido.

mi resumen es este:

hay algo con los juegos online que los hace especiales, algo espectacular y disruptivo. Podemos pensar en ello como un problema que hay que solucionar: los juegos son una pérdida de tiempo y el mundo estaría mejor si la gente se apuntara una ONG en vez de pasar esas horas semanales gritando solo delante de la pantalla del ordenador. Estamos deacuerdo.

pero al final los juegos estan ahi y no van a irse, y si podemos darle la vuelta a la tortilla y extraer lo que hace los juegos tan apasionantes para los gamers, y aplicarlo a la realidad, eso podrían ser 21 billones de horas semanales dedicadas a mejorar el mundo. y probablemente eso lograría solucionar muchos problemas.

la señora continua explicando que ella ha sacado unos rasgos básicos del mundo de los juegos online para saber porqué son tan atractivos.

yo simplificaría diciendo que en los juegos online hay una conexión simple y directa entre el esfuerzo que tu dedicas a resolver un problema y los resultados que obtienes:

+Has matado al Ogro Maldito, tienes +1 punto de fuerza (por el mamporro que le has pegao) +20 de habilidades sociales (por convencer al elfo de que te ayudara a distraerlo mientras le atabas los cordones de los zapatos) +5 de destreza (por el gran nudo marinero que hiciste en sus zapatos) +2 de magia por el hechizo que usaste para sacarlo de su cueva

esto es un juego: utilizas tus habilidades para ir mejorando y salvando obstáculos, y eres recompensado con honor y gloria.

ella se alarga en otras cosas sobre psicología del juego: -Urgent Optimism: Extreme self motivation, desire to act inmidiately to tackle an obstacle combined with the belive that we have a reasonable hope of success. -Social Fabric: Tight Social Fabric, it takes a lot of trust to play a game with someone -Blissful Productivity: gamers are happier working hard for the work than relaxing. -Epic Meaning: Love to be attached to inspiring missions

si te interesa, mirate el video que son 18 minutos, está muy bien y la chica es guapa y lista :D

total, que he pensado que esto es ideal para implementarlo en software y solucionar algunos problemas del mundo donde el software o hardware pudieran ayudar: ver como ejemplo el sistema Ushahidi (www.ushahidi.com) open source que permite reunir información en Internet de forma rápida y eficaz, con la ayuda de SMS, e-mail y web, para ayudar en situaciones de crisis. Ha sido usado en el terremoto de Haití, en kenya, y en muchos sitios en crisis:

“The Ushahidi Engine is a platform that allows anyone to gather distributed data via SMS, email or web and visualize it on a map or timeline. Our goal is to create the simplest way of aggregating information from the public for use in crisis response”

El sistema que propongo permitiría crear software como Ushahidi, en respuesta a demandas del mundo, de forma colaborativa, por programadores-gamers y/o todo tipo de usuarios aportando habilidades.

Aunque primero habría que crear el sistema para organizaro todo esto, y el mismo sitema puede ser creado de la misma forma: colaborativamente.

el funcionamiento seria el siguiente:

Primero hacer un sistema de puntuaciónes al estilo online:

-Puntos de programación en c, java, php, ruby, erlang, etc: mide tu habilidad para programar buen código estable, seguro, fácil, simple, robusto… en algun lenguaje de programación concreto.

-Puntos de algorítmica: mide tu habilidad para resolver problemas creando algoritmos, independientemente del lenguaje de programación. -Puntos de sociabilidad: mide tu habilidad para hacer mediaciones entre programadores, o con diseñadores, u otros perticipantes, capacidad de lograr que la gente se ponga deacuerdo. -Puntos de liderazgo: mide básicamente tu habilidad de ser un leader: tus decisiones técnicas tienen sentido, si tu diseñas algo hay garantías de que tiene futuro, al estilo del “Benevolent dictator” como Larry Wall era en Perl, o Guido von Rossum en Python, o cualquier lider que tenga una comunidad. -Puntos de lenguas: si hablas español, brasileño, inglés, catalán, XXX entonces tienes puntos. -Puntos de diseño: si haces buenos diseños, tienes más puntos. -Puntos de usabilidad: si sabes mucho de usabilidad, tienes más puntos. -Puntos de arquitectura de sistemas: diseñar sistemas escalables. -Puntos de márketing: sabes diseñar buenas estrategias de comunicación y sabes transmitir la importancia de algo. -Puntos de producto: sabes qué características son necesarias, y cuales son innecesarias.

bueno, esto de los puntos es mucho más facil de hacer en un juego, porque es más inmediato: matas al ogro, consigues N puntos.

Luego estarían las tareas, deberían ser cosas muy concretas que pueden realizarse en una acción continua, no poder subdividirse en bloques, al estilo de lo que sugiere el de Getting Things Done sobre los “tasks”. La subdivisión de un objetivo más general en subtareas seria en sí mismo una tarea, es decir, podria haber meta-tareas.

evidentemente ejecutar una tarea te daría N puntos de una habilidad, M puntos de otra habilidad, etc.

Esto para los expertos en usabilidad seria un poco putada, porque probablemente podrian ganar pocos puntos de una habilidad no muy valorada (usabilidad ??? wtf ;) ) pero hay que tener en cuenta que todo esfuerzo y/o habildad debe ser recompensado para que se mantenga el pilar fundamental del sistema: conexión directa entre las tareas que cometes y los puntos de habilidades que ganas.

Evidentemente el factor social de la herramienta seria muy importante, ya que otra de las cosas que hace que los gamers disfruten jugando es su contacto y conexión con otros gamers.

La distribución de puntos seria un tema crucial: debe tener sentido y no crear grandes disparidades, tiene que ser justo, para proporcionarl el sentimiento de recompensa que es gratificante.

Para encontrar un sistema de puntos que funcione, habrá que hacer iteraciones y probar diferentes sistemas: en cada upgrade tus antiguos puntos se transformarán en nuevos puntos, de una forma que debería ser justa y equitativa.

La primera iteración para los puntos debería basarse en 3 factores: tareas cometidas, valoración de la comunidad y tiempo transcurrido entre cuando surgió la tarea, y cuando has aportado su solución.

El ejecutar satisfactoriamente una tarea te da N puntos automáticamente, pero otros usuarios de la cumunidad deben modular esos puntos, ratificar el trabajo, o darle un valor: los puntos se reparten reflejando esos 2 componentes.

Una tarea podria ser cometida por varios individuos o grupos a la vez, así se fomenta la competición (que también es un factor gratificante de los juegos), pero al final una implementación de esa tarea es la elegida para el sistema, aunque las demás no se descartan, ya que en el futuro igual se decide re-hacer partes del sistema porque se cometió un error con una elección, es decir, el sistema debe ser regenerable, debe fomentar las pruebas, los errores, y la evolución.

Al principio el sistema de puntos podría ser sencillo, como el Karma de slashdot, los diggs, o cualquier sistema de reputación online.

Osea que lo primero que podríamos construir con este sistema, es el sistema mismo.

Necesitamos: -Un sistema de puntos, de momento podemos copiar el karma de slashdot. -Una wiki para ir apuntando las reglas del juego, la arquitectura, etc -Una sistema de registro y autenticación de usuarios para poder saber quién es quien. Debería haber perfiles y home-page del usuario. -Quizás grupos, para organizarse: desarrolladores, web, DataBase Admins, administradores de sistemas… -En lo técnico, definir arquitectura de la aplicación web. Base de datos, lenguaje de programación. -Un GIT público al estilo github para compartir el código.

-En lo social, formas efectivas de comunicar este proyecto, de hacer publicidad y conseguir participantes.

Aclaración: esto no es empresa. No Business Here. Change the World, ese es el mantra. TODO es creative commons, no hay comptetición por apoderarse de una parte del sistema, no hay egos en lucha: es una democracia, es un juego, es para el bien, no para el mal.

Cosas que faltan por decidir: básicamente todo, pero creo que seria bueno decidir si es mejor pensar en una arquitectura federada, al estidlo NTP, o RSS etc, o centralizada, si es centralizada de donde sacar recursos, para los servers, etc.

Post Data: se llama lidya o lydia2 porque según explica la chica de TED, Erodoto documentó la historia de Lydia, una región de Grecia que 2500 años atrás sufrió una terrible hambruna que casi acabó con la civiliazión, los robos se dispararon, las peleas y asesinatos, y en definitiva la paz social se perdió. El rey decretó un dia que a partir de entonces, harían así: un dia se come, al dia siguiente se juega a los dados, al otro dia se juega a los dados, y al siguiente se come.

Esto hicieron, y les fué bien segun cuenta Erodoto: los dados se popularizaron entre la sociedad, se organizaban grandes torneos de dados, y la gente comía solo uno de cada 3 dias. Los juegos son absorventes, excitantes, y son capaces de lograr la paz social evitando las peleas, robos y guerras.

Así pasaron 18 años de hambruna, hasta que el rey decidió organizar un torneo estatal de dados, la mita de la población que ganara, partiría del país a buscar un lugar más habitable a donde trasladar la población. Parece ser que esto hicieron.

La chica dice que recientes investigaciones científicas demuestran que los etruscos, posteriores fundadores de Roma, y en definitiva de nuestra sociedad actual, tienen ADN en común con los antiguos habitantes de Lyidia, por tanto parece bastante plausible que los lydios partieran y fundaran la civilización etrusca (o al menos se unieran a ella), y así gracias a los juegos, el rey de Lydia consiguió evitar el caos y la disolución de su pequeño imperio, aguantar 18 años de hambruna, y finalmente encontrar una solución a su problema y fundar el imperio etrusco, romano, etc.

dice que también hay evidencias científicas de que en esa era hubo una glaciación global, que podria perfectamente ser la causa de la hambruna.

sea cierto o no, es una bonita historia, que puede perfectamente dar nombre a este bonito proyecto :D

PD2: más links sobre el tema: http://t-a-w.blogspot.com/2010/03/personal-experience-points-and-osx.html

algo del estilo: http://www.chorewars.com/

edit: habemus wiki: http://lidian.wikispaces.com/

al final se llama lidian porque todas las otras combinaciones de lidia, con ‘y’ por ‘i’ y añadiendo numeros ya estaban pilladas… pero lidian mola, porque también suena a habitante de lidia :D

particle-wise

After the fractal-wise exercise, today we’re going to do some particles!

have you ever seen those amazing demos created by the guys after Processing ? if not check processing they are great !

some of the most compelling processing demos are done by using particles and particle systems.

basically using particles means that instead of drawing the beautiful images by calculating what colour every pixel must be, for example using mathematical formulas (like the fractal we did the other day), a particle system works by definig some laws (force, acceleration, velocity) that work on some particles. Then you creat the beautiful images by creating a set of forces that evolve with time affecting a set of particles. That gives the dynamics of the demo. Then changing the colours of the particles, or adding some smoke around each particle, you can create very beautiful renders.

For example, to create a fountain, you would define a point that creates particles and gives them some force that pushes the particles up and right (to the top-right), then you define a gravity force that slowly makes the particles decelerate and got down, until they disappear.

you can also do particles that follow the mouse, and you can blur the particles to create a feeling of smog, or fire !

I started learning particles when I first saw this blobsalad this guy also wrote this article on particle systems which (as he says) was inspired by this article

but I like to do things differently, thus I did my own implementation after reading the articles and the code.

I think mine is more performant and thus you can have more particles without degrading movement smoothness.

basically what I did for this is to have a singleton object with a couple of arrays holding the X,Y position of each particle, the forces being applied, the velocity (or not? I think velocity is not needed thanks to verelet integration, only the previous X,Y position), then each particle only needs to know its index in the arrays of the Singleton when you do particle.getX or getY. Because the Singleton does the computations for verelet integration in every frame render, it can go very fast because it only uses javascript Numbers indexed in an array (Fast), while you can still use a Particle in an object-oriented fashin like particle.getX,getY or particle.paint().

Then when you have the particles, you define constraints among them. That means defining something like “particle A and B must always be at a distance of 5” and when that constraint is violated (because your particles are smashing against the frame of the canvas) then a force appears that opposes to the violating constraint, thus if the distance is increasing it attracts the particles together, and viceversa.

When you have particles and constraints you can define a rectangle (4 particles, 4 constraints) and you have a moving rectangle, but to keep it in the rectangle shape you need to add a constraint that keeps the two disconnected particles at a distance (the hypotenuse of the triangles that compose the rectangle). You can then create more complex forms by defining more particles and constraints among them.

I’d like to explain more about the paricle systems but have no time now. Just check out the examples I created:

example 1 with my particle engine example 2 with an adaptation of the particle system from blobsalad example 3 with an adaptation also

strip game of life

El XKCD de hoy dice esto: http://xkcd.com/696/

vamos, que falta claramente una version strip-tease de del Game of Life de conway.

hace poco ya implementé un game-of-life en 2 dimensiones para un ejercicio de Programming Praxis (http://programmingpraxis.com/2009/05/15/cellular-automata/) osea que en cuanto pueda, voy a hacer la versión de striptis del game-of-life con fotos porno de fondo !!

será guay, además con javascript y <canvas> es fácil.

gracias por venir a la fiesta!

bueno, este post no tiene otra explicación que he encontrado una canción divertidísima para agradecer a los amigos que vinieran a la fiesta, y como el 17 de enero fue mi cumple y el viernes pasado (22) hice una fiesta… aquí va !!

http://www.goear.com/listen/8711bb8/Hoy-estoy-contenta-roc%C3%ADo-durcal

perlas de la blogosfera

si eres de esos que tiene (...espera que lo miro) 182 RSS (blogs) a los que estas suscrito, con una media (...calculo) que de 25 posts por dia, a veces te preguntas si merece la pena tanto “estrés informacional” (palabro). Bueno, evidentemente escaneo los rss cada dia como quien ojea los titulares del periódico, y de vez en cuando leo algo interesante. Y de vez en cuando te pones muy contento de haber encontrado una nueva perla ! si eso sucede. recuerdo que empecé a rastrear a un tipo jovenzuelo que se fué a vivir a california porque queria montar una start-up… era muy interesante, una perla (aunque jovenzuelo y un poco capullín).

hoy estoy recordando ese entusiasmo con un revuelo que se ha montado en internet a través de este post (http://www.shirky.com/weblog/2010/01/a-rant-about-women/), yo lo he leido a partir del blog de Tim Bray (ongoing) al que estoy suscrito. Entonces he empezado a leer el de una chica que trabaja en MIcrosoft (bastante successful por lo visto, ya me sonaba su nombre de antes: Danah Boyd http://www.zephoria.org/thoughts/) y me he divertido aún más… y parece que la historia siguen con gente bastante relevante de la blogosfera dando su opinión !

a ver si Martín Varsavsky se anima y también da la suya… yo cuando termine de leer los blogs igual doy mi opinión aquí.

por si os interesa, el tema es que el de shirky.com dice que a las mujeres les falta esa arrogancia y egoísmo que tienen muchos hombres, y que en determinados contextos (lo que el llama two-sided markets, donde además de elegir tu una opción, la opción tiene que elegirte a ti) como universidades, sitios de trabajo, etc es muy importante tener la capacidad de no temer el “auto-bombo”, un poco de soberbia, no tener miedo a quedar mal por “mentir”... el tipo matiza estos significados bastante bien, pero parece que la discusión está servida !

que bien, un domingo por la tarde leyendo blogs sobre un tema en común… viva la interconexión planetaria !!

fractal-wise

if you have ever wondered how those demo-scene guys accomplish so great images with so little code/space, it’s because of generativity. Generativity means finding very concise ways to generate very complex structures (or that’s the way I understand it, anyway :P ).

a programming language can be very generative if it lets you create complex programs in concise syntax.

math lets you express very complex structures with very concise syntax, and recursion takes this even further.

so these demoscene guys combine math with code, and accomplish those beatiful images in less than 24 Kb of machine code.

I’ve always wanted to know more of math, more of programming, and more of beauty ;)

I’m going to start investigating some math-powered image syntesis with fractals today. They are very powerful, since you can create really compelling images from very simple formulas and algorithms.

another day we will investigate particle systems (more dynamic and fun than fractals), and maybe L-systems (L for Lindenmayer), and cellular automatons, and voronoi partitions and… but today let’s do a mandelbrot set.

the theory goes like this: you want to plot points in a plane (2D, x and y, like when you draw in a canvas) and want them to look beatiful. Every point (x,y) will be representing a complex number x+y*j (where j =sqrt(-1) as you all know).

as you have seen in Mandelbrot images ( http://images.google.com/images?q=mandelbrot ) every point in this 2d plane has it’s own color. By now we will let it in just 2 colors: black or white.

Then a mandelbrot fractal is drawn by going through all the points (x,y) and testing if it satisfies the Mandelbrot test (that would mean it belongs to the mandelbrot set).

This test, basically means that you apply a formula to the point, and then to the result, and then to the result of the result and so a couple of times, and see if the resulting numbers go to infinity (grow a lot) or if they stay near some sane friendly-looking number such a s 2, 3 or 4. If it is going greater than 2, we will consider it a “crazy” number (goes to infinity).

so these are the formal definitions you can tell your Math PhD friends:

crazy number => goes to infinity friendly number => stays around what you can count with the fingers of your hands (say 2,3,4..)

now the formula: you start with z0=0+0j, then z1=(z0)^2 + (the-pixel-you're-painting), and z2=(z1)^2+(the-pixel-you're-painting), which means that:

c=x+yj => the pixel you’re painting, but expressed as a complex number. z0=0+0j => initial conditions z[n]=(z[n-1])^2 + c => the formula you will apply a couple of times until you see if z is going crazy or staying friendly.

now functions to sum and multiply complex numbers:

function complexMultiply(c1,c2){
 return [  (c1[0] * c2[0]-c1[1] * c2[1]) , (c1[0] * c2[1]+c1[1] * c2[0]) ];
}    
function complexAdd(c1,c2){
 return [ c1[0]+c2[0],c1[1]+c2[1] ];
}
function mandelTest(num,thres2){
 return (num[0] * num[0]+num[1] * num[1]) > thres2;
}
function mandelbrot(prev,c){
 return complexAdd(complexMultiply(prev,prev),c);
}
var canvas = document.getElementById("canvas");// you should have a < canvas id="canvas" width="300" height="300"/ > in your html.
var ctxt = canvas.getContext("2d");
canvas.setAttribute('width', '300'); // clears the canvas
ctxt.fillStyle = "rgb(255,0,0)";//red !
var prev=[0,0];
var c,belongs;
for(j=150;j>(- 150);j--){// for all the horizontal lines
  for(i=150;i>(- 150);i--){// and for every column in a line
      c=[i/50,j/50];//scale the coordinates (x,y) to where the mandelbrot set likes to live, which is around (2>x>-2) and  (1>y>-1) 
      prev=[0,0];//set the initial conditions
      belongs=true;//suppose the point belongs to the set
      for(a=0;a<15;a++){//do 15 iterations to see if it goes crazy or stays sane
         prev=mandelbrot(prev,c);//apply the function with the previous value and the our point (scaled)
         if(mandelTest(prev,4)){//test if it's gone insane
            belongs=false;//if insane, doesn't belong to mandelbrot
            break;//skip this point and keep iterating 
         }
      }
      if(belongs){// it seems to belong to the mandelbrot set !
         ctxt.fillRect(i+150,j+150,1,1);//let's paint it !
      }
   }
}

see ? it was easy !

you can see the results in here if you have a browser with <canvas>

Like a Daemon !

Now that there’s so much buzz on the net about parallelizing programs, servers and algorithms, I’ve come to love The-Unix-Way more every day.

If you’ve heard some of the discussion, it goes along the lines threads vs processes (concurrent computation), evented vs synchronous (input/output), and there’s also functional vs imperative languages (functional languages help/force you in designing parallelizable servers/algorithms).

I will talk about Unix processes and security today.

Unix processes are easy, you can kill-them and (if your program is ‘stateless’ enough) make no harm. That lets you have some “high-availability”, while in threads, if you just killed one without taking care of the locks it holds, the shared-memory it hasn’t freed, etc… you would be degrading your whole system (the other threads).

Also there are very accurate security semantics for Unix processes. A unix process has a User-ID, a Group-ID, a current working directory, and some File Descriptors open (sockets, files, etc), and you can put them in a jail (chroot) so that they make no harm to your system in case your server got hacked.

So if you program Unix servers, you better know all this stuff.

When I do a netstat -naptu on my servers, I want to see all the processes that are listening on the public internet, see their process-name (the program), and see the User ID in which they are running. This way I easily check I have no services that I don’t strictly need and that I don’t strictly trust how/where they’re giving their service.

Usually in UNIX network servers you do :

(as ROOT)
chroot(chroot_dir)
lisen(public_IP);
setgid(unprivileged_group);
setuid(unprivileged_user);
while(running)
   accept(public_socket);
   process(request);

you you can be sure that if the hacker breaks your program while processing the received request, it can do no harm, since the program is running without privileges (for example, group ‘nogroup’ user ‘nobody’ who has no shell and no home).

In Linux Standard Base (LSB) there’s a definition of how a UNIX network server should be started, stopped and checked. If you follow this guidelines (and return the correct status codes) you can automatically integrate your server in a high-availability scenario, for example with HeartBeat monitoring. (whenever a program sees your server has died, it sends your admin an email so you can complain to your software developers, and the server gets restarted again).

Now enter Java. You do not have all this Unix goodness in Java since it must be multi-platform and not all the operating-systems have this process/security semantics (at least not in the same exact way).

Fortunately there’s this framework called apache commons-daemon and this program called jsvc. It brings UNIX process/security stuff into your Java program.

let’s do an exercise. I did a netstat -naptu and saw I have a program listening on 0.0.0.0:843 and running as rooot. this is bad. even tough it’s running on the Java Virtual Machine and we all trust it very mucho. You dont have to trust any server if you don’t need to. And in this case there’s absolutely no need. We could start listening on 843 and then give-up privileges changing the User-ID and Goup-ID.

that’s what commons-daemon and jsvc is for.

now your java class should implement org.apache.commons.daemon.Daemon. Basically you need:

  • init: start listening on your privileged port (open listening socket)
  • (now jsvc drops privileges, changes UID, GID)
  • start: start your threads that will accept(socket) and process(request)
  • (this will go on and on until you want to stop this daemon, which will trigger a call to stop() as follows)
  • stop: stop accepting and serve the running requests
  • destroy: release resources

This is a sample daemon

public class DaemonPrueba implements Daemon, Runnable {
private Logger log = Logger.getLogger(DaemonPrueba.class);
private Thread worker;
private boolean working=false;
private int workunits=0;
private ServerSocket socket;
public void init(DaemonContext arg0) throws Exception {
    socketServer = new ServerSocket(privileged_port, 5);
    worker = new Thread(this);
    log.debug("Init");
}
public void start() throws Exception {
    worker.start();
    log.debug("Start");
}
public void stop() throws Exception {
    working=false;
    log.debug("Stop");
    serverSocket.close();
}
public void destroy() {
    log.debug("Destroy");
}
public void run() {
    while(working){
        try {
            Socket socket = socketServer.accept();
            PrintWriter socketOut = new PrintWriter(socket.getOutputStream(), true);
            socketOut.println("Work unit "workunits+);
            socket.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

this is a sample server. Now you can use it with commons-daemon, and start it in The-Unix-Way: it can listen on privileged ports (lower than 1024) but still run as an un-privileged user (like www-data or nobody or some other ‘normal’ user). And if it crashed for some reason, you could easily have it restarted by your UNIX system.

in Debian, an init script might look like this:

!/bin/sh

DEBUG=”false”

[ "$DEBUG" = "true" ] && set -x #for debugging
NAME=myDaemon
DESC="a simple daemon Server"
MY_SERVER_HOME="/home/unprivileged/src/java/myDaemon" 
MY_SERVER_STDOUT="$MYY_SERVER_HOME/log/$NAME-stdout.log" 
PID_FILE="$MY_SERVER_HOME/log/$NAME.pid" 
DAEMON_CLASS=DaemonPrueba
DAEMON=/usr/bin/jsvc
JAVA_OPTS="-Xms128m -Xmx256m -XX:PermSize=64m -XX:MaxPermSize=80m "
if [ "$DEBUG" = "true" ]
then 
 JAVA_OPTS="-debug $JAVA_OPTS" 
fi
JVM_TMP="$MY_SERVER_HOME/tmp" 
JSVC_CLASSPATH="$MY_SERVER_HOME/resources:\
$MY_SERVER_HOME/lib/log4j-1.2.14.jar:\
$MY_SERVER_HOME/lib/commons-daemon.jar:\
$MY_SERVER_HOME/target/modules/myserver.jar"
MY_SERVER_USER=unprivileged
JAVA_HOME="/usr/lib/jvm/java-6-sun" 
export JAVA_HOME
case "$1" in
   start)
   echo "Starting $DESC" "$NAME" 
   mkdir $JVM_TMP
   chown $MY_SERVER_USER "$JVM_TMP" 
   cd "$JVM_TMP" 
;;
stop)
echo "Stopping $DESC" "$NAME" 
   $DAEMON -cp "$JSVC_CLASSPATH" -pidfile "$MY_SERVER_USER" \
   -stop "$DAEMON_CLASS" 
rm -rf "$JVM_TMP" 
exit 0
;;
restart|force-reload)
$0 stop
$0 start
;;
status )
;;
try-restart)
if start-stop-daemon --test --start --pidfile "$PID_FILE" \
   --user $MY_SERVER_USER --startas "$JAVA_HOME/bin/java" \
   >/dev/null; then
   $0 start
fi
;;
*)
    echo "Usage: $0 {start|stop|restart|try-restart|force-reload|status}" 
 exit 1
 ;;
esac
exit 0
$DAEMON -user "$MY_SERVER_USER" -cp "$JSVC_CLASSPATH" \
-outfile SYSLOG -errfile SYSLOG \
-pidfile "$PID_FILE" $JAVA_OPTS "$DAEMON_CLASS"

remember, if something doesn’t work, set -x in bash (so you see what’s happening, and -debug in jsvc. Also you shold configure log4j adding -Dlog4j.configuration=file://$MY_SERVER_HOME/log4j.properties” if something goes wrong.

Now you have a UNIX-compliant java server !

enjoy !

Inauguración

Queda inaugurado el blog.

un momento! "se preciso con tus palabras"! qué debe significar "inaugurar" ? un augurio es una suposición de un devengo futuro (como se nota que me he leido bien la documentación del IVA... devengaaaar !). inaugurar, por tanto seria _no_ hacer suposiciones, materializar.

hmmm estoy leyendo por ahí que los augures eran adivinadores del futuro en la antigua Roma. Mirando el vuelo o escuchando el canto de los pájaros. Cuando los romanos abrían un nuevo templo, invitaban a los augures para que predijeran si era el momento adecuado para la inauguración.

voy a mirar qué twitean los pájaros, para ver si el momento es propicio: http://twitter.com/#search?q=%22start%20blogging%22%202010

si, creo que hay buenos augurios para "Start Blogging 2010"

pus así es, este blog es un hecho (de hacer, en pasado). ahora falta rellenarlo de sabroso contenido.

esto del "se preciso con tus palabras" viene de un libro que varias personas me han recomendado pero que no he leido porque tengo demasiados libros que pagué en Amazon en mi mesita de noche como para añadir más... se llama "Los 4 acuerdos" y aunque el libro no me lo he leido, los 4 acuerdos reflejan bastante el espíritu del gran chamán Guardiola:

  • se impecable con tus palabras

para que nadie pueda recriminarte errores, o malas intenciones.

  • no tomes nada personalmente

porque pocas veces una frase hiriente tenia la intención de herirte, es más probable que quien la formuló no "fuera preciso con sus palabras".

  • no hagas suposiciones

o como diria un jovenzuelo "no te montes paranoias" ;)

  • haz siempre tu mejor esfuerzo

que podria ser equivalente a "se impecable con tus acciones"