viernes, 11 de diciembre de 2009

Reinstalar Ubuntu y mantener (casi) todas tus aplicaciones

Soy un desastre. Quien me conoce sabe que la entropía en mí es muy alta (gracias a las clases de física por esta excusa tan socorrida) y que me cuesta mucho llevar un orden cuando no es estrictamente necesario. Y esto me lleva a contaros mi último descubrimiento: cómo reinstalar ubuntu y mantener (casi) todas las aplicaciones que tenías instaladas.

No sé vosotros pero yo cada año (últimamente incluso menos) tengo que formatear el ordenador porque deja de ir lo fino que debería ir (tengo el récord en 10 horas con una instalación de windows), o porque sale una nueva versión del sistema operativo que quiero probar. En este caso ubuntu. Y como no soy capaz de llevar un listado de las aplicaciones que necesito, o qué plugins necesito tener instalados para que me funcione vim como me gusta, investigando llegué a este post que explica cómo volver a instalar todas las aplicaciones que tienes antes de formatear.

Como es corto voy a resumir los pasos:

Hacer una lista de las aplicaciones instaladas:

dpkg  get-selections | grep -v deinstall > my_apps

Instalar las aplicaciones una vez reinstalado el SO:

sudo dpkg --set-selections < my_apps
sudo dselect install

Pero como no todo es coser y cantar, me he encontrado con los siguientes problemas:

  • Las aplicaciones instaladas directamente desde un paquete debian no se instalan
  • He tenido problemas con mysql y phpmyadmin. No hay más que volver a instalarlas como normalmente

Lo suyo sería hacer la copia del listado de aplicaciones desde una instalación nueva, para que no se instalen esos típicos programas que instalas para probar y que luego no usas. Pero como soy como soy, yo no lo he hecho. Igual en la siguiente reinstalación (dentro de unos 6 - 8 meses) me lance.
La política es el arte de buscar problemas, encontrarlos, hacer un diagnostico falso y aplicar después los remedios equivocados. -- Groucho Marx

jueves, 10 de diciembre de 2009

Twitter: ¿La simplicidad excesiva nos desorienta?


Hace tiempo escribí un blog en la web de Madrid on Rails acerca de twitter, y hoy, tras una breve conversación con gente del sector, he decidido republicarlo aquí.

Y el blog dice así:

Hoy en día pregunten a cualquier persona entre 10 y 40 años, qué es facebook o tuenti. Seguramente las definiciones que hagan los sujetos no sean, ni de lejos, unas definiciones completas. Sin embargo, casi todos tendrán muy claro para qué sirven: subir fotos, compartir enlaces, jugar, hacer quedadas... En definitiva, saben qué pueden hacer con ellas.

Ahora pregunten a esa misma gente por twitter. Descarten a todos aquellos que no lo conozcan (seguramente sea un buen porcentaje). Y del resto, me atrevería a decir que la gran mayoría les dirá que no saben para qué sirve (o que no sirve para nada), que es muy raro, que no entienden cómo se utiliza... en definitiva: muchos de ellos se sentirán tan perdidos con twitter como mi abuela cuando le explico en qué consiste mi trabajo.

Y esto es algo que no ha dejado de extrañarme porque mucha gente que conozco, y que considero tecnólogos muchísimo más preparados que yo, responden de esta manera.

Así pues, ¿en qué consiste twitter? Sin entrar en definiciones formales, yo describiría twitter como "el sms de la web". Básicamente se trata de escribir lo que quieras en no más de 140 caracteres, en un entorno de red social, de forma que otra gente pueda leerlo. ¿Simple verdad? Pues esta simpleza parece desorientar a mucha gente, si bien es cierto que esta funcionalidad, en mayor o menor medida, la gente lleva utilizándola mucho tiempo sin ser consciente de ello. Y si no, ¿qué son los estados del messenger, gtalk, yahoo o el mismo facebook?


¿Cómo se utiliza twitter?

Para utilizar twitter, primero se ha de dar de alta una cuenta en twitter. Una vez dada de alta, puedes buscar los usuarios que quieras y comenzar a seguir sus actualizaciones, siempre y cuando tengan abierta su cuenta. En caso de no ser así, se enviará una petición a dicho usuario para que te acepte.


¿Qué diferencia a twitter del resto de redes sociales?

Desde mi punto de vista se resume, citando a Baltasar Gracián: "Lo bueno, si breve, dos veces bueno". Y, a partir de aquí, todo es jugar y hacer con twitter lo que quieras hacer con twitter, siempre y cuando te adaptes a la limitación de los 140 caracteres.


La utilidad de twitter

No hay unas reglas establecidas acerca de qué cosas hay que hacer con twitter. Es el propio uso de la aplicación lo que le da forma: Puedes comunicarte con tus amigos, puedes opinar, volcar tus frustraciones, publicar enlaces de interés, crear temas de debate... ¡La imaginación al poder!

Yo, personalmente lo utilizo para estar en contacto con  amigos, seguir noticias y posts de blogs que me interesan, y conocer opiniones de gente con las mismas inquietudes profesionales y de ocio que yo, a las que, por cierto, ni siquiera conozco en persona (cosa que no se me ocurre hacer en facebook).


Twitter como red de información

Con twitter cada usuario se convierte en un nodo de información, y así, la información se propaga rápidamente a través de toda la red. La utilidad de esta información depende, lógicamente, de lo que considere cada uno como útil. A mí, por ejemplo, que una marca de ropa haya sacado una nueva línea de gorros de lana, me resulta absolutamente irrelevante. Pero seguramente haya gente a la que esto le parezca de una trascendencia extrema (en este mundo, doy gracias, hay gente para todo). Un ejemplo de twitter como red de información es lo que sucedió en Irán tras las revueltas postelectorales que sufrió el país en este año (2009). Censurada la libertad de prensa, fueron los propios ciudadanos los que informaban lo que iba pasando a pie de calle.


Conclusiones (personales)

Twitter está revolucionando la forma de comunicarse en la red, en el sentido en que la información que se propaga es concisa, rápida e inmediata. Además, es muy sencillo de utilizar. Mi consejo: probadlo, utilizadlo, sacad vuestras propias conclusiones y, después, "twiteadlo" ;-)

La programación es una carrera entre ingenieros de software luchando para construir programas cada vez más grandes, mejores y a prueba de idiotas, y el universo intentando producir cada vez más grandes y mejores idiotas. Por ahora, gana el universo. -- Rich Cook

miércoles, 9 de diciembre de 2009

Historia de dos empresas

Leyendo "Fuckowski. Memorias de un ingeniero", me ha venido a la cabeza mi época en mi antigua empresa (de ahora en adelante Vietnam S.L.). Una empresa de esas en las que sabían cómo motivar a la gente:
"En la empresa wadus han despedido a 400 personas, como comprenderás tengo donde elegir"
o mi preferida
"Yo parto de la base de que a mitad del proyecto, cuando no sepas cómo arreglarlo, te piras y nos dejas el marrón a nosotros".
También tenían un gusto exquisito por las nuevas tecnologías:
"El twitter está prohibido", "El gtalk está prohibido", "Gmail está prohibido"
La metodología de trabajo era inmejorable:
[Jefe] Esto tiene que funcionar ya. Hay que subirlo a producción inmediatamente. Así que hazlo así [rellenar con cualquier burrada que se te ocurra]


(Al día siguiente, cuando la solución de turno ha cascado por todos los lados)


[Jefe] Eres un inútil. Es que lo tengo que hacer todo yo. No tenéis ni puta idea. No sabéis ni escribir.
Y además, tenían claro que la formación era lo más importante:
(Llama el cliente y el jefe le pasa la llamada a la última incorporación al equipo, recién salido de la carrera)


[Jefe] Di "esto" que yo no me quiero poner


[Becario] "no esto"


(El jefe le da un colleja y acto seguido mi compañero pide perdón)

En definitiva, me mantuve a flote (siempre por debajo de la delgada línea marrón de Fuckowski, por supuesto) durante los cuatro meses que duró el proyecto gracias a mis queridos Judas Priest, Iron Maiden, Manowar y El Reno Renardo (sin ellos ahora mismo estaría calvo del todo y consumido por el estrés)

Alguno me llamará exagerado (o blando), pero después de la primera amenaza me dediqué a buscar trabajo para cuando terminara el dicho(so) proyecto.

Fue entonces cuando un antiguo compañero de trabajo me envió una oferta vía Twitter (esa herramienta que sólo sirve para perder el tiempo) de una empresa que trabajaba en rails y que buscaban un desarrollador con ganas. Así que me puse en contacto con la empresa para ver si les podía interesar. Yo no tenía experiencia en rails, aunque había trabajado con java, python y php. Pero aún así decidieron que una entrevista no hacía daño.

Fui a dicha empresa y me empezaron a contar su forma de trabajar: teletrabajo, horario flexible (yo a estas alturas ya estaba babeando), y el perfil que buscaban: alguien a quien le guste su trabajo, inquieto, que le guste formarse continuamente... Salí de la entrevista como si después de dos años de matrimonio con una pareja borde, aburrida y fea, hubiera salido de copas y hubiera conocido a una chica impresionante, divertida, que me daba mi propio espacio y que me animaba a poner en marcha todas mis inquietudes: el divorcio era inminente

Por una vez en mi vida, conseguí ligarme a la guapa y ahora estoy trabajando ahí.

Siete meses después, me siento por encima de la delgada línea marrón. Estoy rodeado de gente técnicamente muy buena (algunos de mis compañeros hacen aportaciones al core de rails, o de capistrano), ansiosa por aprender y enseñar, con un sentido crítico muy alto (algo de lo que me han acusado muchas veces en mi vida) y he aprendido más en estos meses que en los dos años en Vietnam SL

Pero además, doy fe de que de esta manera produzco más. Si tengo que echar horas de mi tiempo libre porque hay algo que desconozco y quiero investigarlo no tengo problemas. Es más, me siento animado a hacerlo.

Y claro, las comparaciones son odiosas sobre todo cuando sales perdiendo. Entiendo que toda empresa existe para ganar dinero, pero la diferencia está en los medios utilizados. Y aunque las diferencias son muchas, me quedo con una que creo fundamental: el valor del conocimiento. Mientras que en Vietnam SL el conocimiento era algo irrelevante e, incluso me atrevería a decir que peligroso, en la actual es pilar básico: charlas mensuales en las que algún compañero expone algo que ha aprendido y que además últimamente se han abierto para que asista gente de fuera de la empresa (no me digáis que no es bonito...), se utilizan herramientas de comunicación como irc, yammer, google apps... Y si hay algo que no funciona como debería, no pasa nada: se piensa si es salvable, y si no, se cambia.

Con esto quería exponer dos formas muy diferentes de llevar una empresa y gestionar sus recursos desde "el otro lado": el del empleado. Porque al fin y al cabo somos la otra mitad de la "relación", ¿no?

Me voy a abstener de dar el nombre real de mi querida Vietnam S.L. porque se dice el pecado pero no el pecador, pero para quien se esté preguntando a qué empresa me cambié, ésta es ASPgems.

Seguro que muchos pensarán que soy un pelota por hablar bien de la empresa en la que trabajo. Están en su pleno derecho, pero que conste que no es peloteo: es orgullo.

A veces pienso que la prueba más fehaciente de que existe vida inteligente en el universo es que nadie ha intentado contactar con nosotros. -- Bill Watterson

miércoles, 7 de octubre de 2009

Resolviendo el error al instalar las guest additions de Virtual Box en Ubuntu 9.04 con ATI

Como siempre que me creo una máquina virtual nueva de Ubuntu 9.04 en VirtualBox (OSE), tengo problemas al instalar las Guest Additions.

Nunca me acuerdo de cómo se hacía, así que voy a ponerlo bien clarito aquí para que no se me olvide.

Antes de nada, mi equipo es un HP EliteBook 8530p, de esos que vienen con ATI (nunca más, lo prometo...). El sistema operativo que tengo instalado a día de hoy es Ubuntu 9.04 y la máquina virtual que voy a instalar es otro Ubuntu 9.04. Y dado que no soy ningún genio, me he tenido que seguir las instrucciones de este artículo, que es el que me dio la solución.

Ahora sí, empieza la chicha: después de crear una nueva máquina virtual, instalar el sistema operativo y montar el cd, abro un terminal (en la máquina virtual se entiende) y tecleo:

sudo /media/cdrom/VBoxLinuxAdditions-x86.run


Y el resultado es el siguiente:



¿Veis esas últimas líneas donde dice algo así como: Warning: unknown version of the X Window System installed. Not installing X Window System drivers?

Pues eso nos está indicando que tenemos un problema. Y si reiniciamos la máquina nos encontraremos con esta dichosa pantalla:





Bien, pues para solucionar esto, nos vamos al terminal y ejecutamos:

sudo /media/cdrom/VBoxLinuxAdditions-x86.run --target ~/guest_additions


Esto nos creará los archivos necesarios para la instalación de las guest additions en el directorio /tmp. Tenemos que editar el archivo install.sh (yo utilizo vim)


sudo vim ~/guest_additions/install.sh



Y en la línea 415 y cambiar Cambiar la línea siguiente:


1.5.99.* | 1.6 )


por


1.5.99.* | 1.6.0 )
1.5.99.* | 1.6.* )

Ahora ya podemos ejecutar el script de instalación:


sudo ~/guest_additions/install.sh


Y listos para reiniciar, y poder a utilizar nuestra máquina virtual con Ubuntu 9.04 y las guest additions funcionando correctamente.

A esto lo llaman la hora mágica. El día aún no ha terminado pero la noche aún no ha llegado, y en algun lugar Rocco Sifredi se está cepillando a una mujer que no ama -- Peter Griffin

martes, 6 de octubre de 2009

Las nuevas buenas maneras en el mundo 2.0

Tomándome una cerveza y viendo la tele, que es una de las mejores maneras de tener una idea divagar, me ha surgido la siguiente duda.

Con la implantación cada vez más rápida de la web 2.0 en nuestras vidas (el 24,7% de la población) están surgiendo nuevas maneras de comunicarnos (relacionarnos) entre todos nosotros. No voy a entrar en si la calidad de la comunicación mejora o empeora (igual en otro post me lanzo). Sí me gustaría, en cambio, reflexionar acerca de los nuevos códigos de conducta o protocolos que se van formando. En definitiva, qué es hoy en día una conducta social 2.0 aceptable.

Tengo claro que hay ciertos comportamientos sociales que funcionan de la misma forma en ambos escenarios: tanto en el mundo 2.0 como en el mundo 0.1-beta no suele ser buena idea insultar, descalificar o humillar (salvo que estemos en el parlamento, o en un plató de telecinco)

Hay otros, sin embargo, que mientras pueden suponer una conducta reprochable en uno de nuestros mundos, en el otro sencillamente no aplican. Me intentaré explicar:

Imaginemos a una pareja de concursantes en el Un, dos, tres, presentado por Mayra Gómez Kemp en cualquiera de sus etapas cuando este inventazo, que es internet todavía estaba en el huevo.

(Mayra Gómez Kemp): Ahora, por 374 pesetas, dígannos comportamientos sociales que no son bien aceptados, como por ejemplo, mascar chicle con la boca abierta haciendo ruido. Un, dos, tres, responda otra vez:


(Él): Mascar chicle con la boca abierta haciendo ruido

(Ella): Enseñar la ropa interior



(Él): Escupir en la calle


[...]

Bien, ahora imaginemos que se hace un remake del Un, dos, tres presentado por cualquiera de las presentadoras de la sexta (el Un, 2.0, tres)

(Pibón bendito): Ahora, por 2,25 euros, dígannos comportamientos sociales 2.0 que no son bien aceptados, como por ejemplo, CHATEAR UTILIZANDO EXCLUSIVAMENTE LAS MAYÚSCULAS. Un, dos, tres, responda otra vez:


(Él): CHATEAR UTILIZANDO EXCLUSIVAMENTE LAS MAYÚSCULAS

(Otro él): Copiar contenido de un blog personal sin dar referencias


(Él): Publicar fotos de un tercero en facebook y etiquetarle para que todo el mundo vea el pedo que se pilló la noche anterior a una reunión importantísima a la que no fue porque "se puso malo"



El problema que me he encontrado es que imaginándome esta última escena, no estoy muy convencido de que pudiera sacar demasiada pasta con esta pregunta. Yo sé qué es lo que a mí me parece una conducta poco apropiada, ¿pero será así para el resto? Me consta que no para todo el mundo, pero ¿cómo lo voy a saber si no he tenido una educación 2.0?

Así pues, me gustaría saber qué cosas os molestan de la red, qué buenas costumbres tenéis y creéis que sería bueno que más gente las practicara, o si realmente todo esto es una son paja mental mía...

Nota: Por si no hubiera quedado suficientemente claro quisiera aclarar que el término 2.0 ha sido utilizado de forma sarcástica en todo el artículo (como no podría ser de otra manera)

Pensar es el trabajo más difícil que existe. Quizá esa sea la razón por la que haya tan pocas personas que lo practiquen. -- Henry Ford

jueves, 1 de octubre de 2009

Internacionalización y localización en rails

Lo reconozco: soy un maniático de la localización e internacionalización. Tanto, que casi rozo un trastorno obsesivo compulsivo. En rails considero una práctica casi obligatoria incluir la localización desde el primer momento en que empezamos un nuevo desarrollo.

Pero como Rails está pensado para vagos, nos incluye, al menos desde la versión 2.3.2, el plugin I18n desde el principio. Con esto, simplemente tendremos que configurar nuestra aplicación para que utilice dicha funcionalidad (un punto más para rails!).

Para esto, lo primero es decidir dónde se van a colocar los ficheros yml de traducción. En mi caso siempre opto por ponerlos dentro del directorio config/locales/ de forma que crearé dentro de este directorio, otro más por cada idioma que quiera añadir a la aplicación. Por ejemplo:


config/locales/es-ES
config/locales/en-US


Después hay que decirle a la aplicación que cargue los diferentes archivos de idioma que tengamos en estos directorios. Para esto suelo crear el archivo de inicialización config/initializers/locale.rb


I18n.load_path += Dir[ File.join(RAILS_ROOT, 'config', 'locales', '*', '*.{rb,yml}') ]


Y por último hay que seleccionar el idioma con que queramos que se muestre nuestra aplicación. Para esto tenemos la variable I18n.locale. En el último proyecto en el que estoy, la aplicación sólo va a tener un idioma, por lo tanto bastaría con añadir la siguiente línea en el application_controller:


I18n.locale = 'es-ES'


Esta línea puede ser tratada para que coja la preferencia del usuario actual, por ejemplo:


I18n.locale = current_user.locale


Ahora necesitamos nada más crear los archivos de traducción en el directorio que hemos creado al principio. Estos archivos serán unos archivos yml. Por ejemplo un archivo con las cadenas de texto generales para toda la aplicación podría ser la siguiente:

config/locales/es-ES/general.yml


es-ES:
  general:
    add: Añadir
    are_you_sure: ¿ Estas seguro ?
    accept: Aceptar
    actions: Acciones
    back: Volver
    cancel: Cancelar
    delete: Borrar
    edit: Editar
    exit: Salir
    "no": "No"


Con esto ya tenemos configurada la aplicación para utilizar I18n.

Ahora para mostrar una cadena de texto traducida, podemos utilizar el helper I18n.translate o su alias t, de la siguiente forma:


t('general.accept')


Nos devolverá la cadena "Aceptar".

Esto es útil hacerlo hasta cuando vayamos a tener una aplicación con un solo idioma porque:

  1. Es más fácil mantener los textos de la aplicación si estos están contenidos en unos cuantos ficheros de traducción, que si estuvieran dispersos a lo largo y ancho de toda nuestra aplicación
  2. Siempre es posible que en un futuro nuestra aplicación tenga que ser traducida a otro idioma. De esta forma, simplemente tendríamos que replicar los archivos de traducción y traducir las etiquetas.
  3. Si no internacionalizamos, tendríamos que conformarnos con que cierta información se muestre como viene por defecto: por ejemplo, que el separador de miles sea la coma y no el punto, que la moneda sea el dolar, etc
Estos son los conceptos básicos para internacionalizar una aplicación. En otro momento, cuando tenga más tiempo y me encuentre con humor, intentaré explicar cómo traducir ciertos componentes de rails como los modelos, errores, unidades, etc. Eso sí, para el que le pique la curiosidad siempre estará nuestra amiga la web para resolver todas nuestras dudas.

Y como última recomendación uno de los mejores punteos bajo mi humilde punto de vista: Ram It Down de Judas Priest

Si el cerebro del ser humano fuera tan sencillo que lo pudiéramos entender, entonces seríamos tan estúpidos que tampoco lo entenderíamos -- Jostein Gaardner (El mundo de Sofía)

Validando en rails cuando necesitas acceder a current_user

Estoy en medio de un proyecto con acts_as_authenticated y me he encontrado con el problema siguiente:

A la hora de validar un modelo, necesito comprobar unos atributos del usuario actual. Es decir, necesito acceder a los atributos de current_user.

Sin embargo, dicha variable no está disponible en el modelo. Así que buscando en google encontré esta discusión, que me dio una posible solución.

El resumen es el siguiente:

Hay que crear un atributo de clase thread en User (o en la clase que tengamos definidas para almacenar los usuarios) que me devolverá el current_user:

class User < ActiveRecord::Base
  cattr_accessor :current_user
  def self.current_user
    Thread.current[:user]
  end

  def self.current_user=(user)
    Thread.current[:user] = user
  end

end

Luego, en application_controller, para que esté disponible siempre, se define un before_filter

class ApplicationController < ActionController::Base
  before_filter :set_current_user
private
  def set_current_user
    User.current_user = current_user
  end
end

De esta forma, se asigna al atributo de clase User.current_user, la variable current_user. Ahora basta con llamar a User.current_user para poder acceder a la información que estábamos buscando.

class Project < ActiveRecord::Base
  validate :my_validation
private
  def my_validation
    errors.add(:validating_attribute, 'validating_attribute_error') unless User.current_user.my_method
  end
end



"Si la industria automovilística hubiera seguido el mismo desarrollo que los ordenadores, un Rolls-Royce costaría hoy 100 dólares, circularía un millón de millas con 3,7 litros y explotaría una vez al año, eliminando a todo el que estuviera dentro en ese momento"
-- Robert X. Cringely