Mar 30

Ascendiendo para aprender … y para olvidar

Cuando empezamos a trabajar en una empresa, lo normal es que empecemos como programadores (cobrando poco). Símplemente alguien nos dice qué código tenemos que hacer, mejor o peor especificado, lo hacemos y hemos cumplido.

Con el tiempo, si somos buenos programadores, hacemos nuestras tareas rápido, nuestros programas son vistosos y no dan problemas, posiblemente nos "asciendan". Esto significa que seguiremos cobrando lo mismo, pero que pondrán a nuestro cargo a un grupo reducido de programadores más novatos que nosotros, recién llegados.

Nos darán a nosotros el trabajo de tres o cuatro personas, nosotros lo organizaremos con los tres o cuatro que tenemos a nuestro cargo y haremos el código. Ahí es cuando se nos plantea más claramente, si somos programadores astutos, una nueva necesidad. Dos de nuestros muchahos tendrán que hacer cosas distintas, pero una parte será muy parecida del uno al otro, no igual, pero sí con cierta semejanza.

Si somos espabilados buscaremos la forma eficiente de hacer ese algo parecido, es decir, que uno de ellos lo haga de forma que sirva para los dos. Esta necesidad hará, si no lo hemos hecho todavía, que empecemos a descubrir la verdadera potencia de la orientación a objetos (que va más allá de heredar, sobrecargar algún método e implementar alguna interfaz). Descubriremos cómo dos códigos distintos, pero con una leve semejanza, pueden hacerse con una gran parte de código común. Descubriendo la potencia de la orientación a objetos, veremos cada vez más códigos menos semejantes que pueden hacerse en común y descubriremos nuevamente más potencia en la orientación a objetos.

Ahí llegamos a un bucle sin fin. Siempre vemos formas mejores de hacer las cosas, de aprovechar y generar más código común, de usar de una nueva forma el polimorfismo, y podemos pasarnos años haciendo una y otra vez lo mismo, pero cada vez de forma más eficiente y aprendiendo más. Por lo que yo se por experiencia y por lo que he leido, siempre se está aprendiendo … pero vas olvidando el código puro, ya que cada vez codificas menos y piensas más en lo que tienen que codificar los demás.

Sin embargo, este bucle sin fin tiene un fin. Un nuevo ascenso. Como tu grupo, según tus jefes gracias a tí, es un grupo eficiente que cada vez hace mejor las cosas, te vuelven a ascender. Esta vez eres jefe (cobrando lo mismo), de varios grupos como anteriormente era el tuyo. Ya es demasiada gente, ya no te puedes meter en el código en absoluto y casi vas perdiendo de vista las clases UML. Ya tienes que empezar a pensar en paquetes, ejecutables, librerías y dejar que tus sub-jefes (que siguen cobrando lo mismo que cuando eran programadores), piensen el diseño detallado.

Este es el principio del fin de quedarse obsoleto. Pierdes totalmente el contacto con el código. Apenas ves diseño detallado y sólo piensas en alto nivel, en abstracciones. En cuanto lleves unos años en ese puesto, cambiarán el lenguaje de programación, saldrán nuevas tecnologías y ni siquiera servirás para hacer un diseño de alto nivel de esas cosas. Si sabías un montón sobre aplicaciones de escritorio, no puedes hacer un diseño en EJBs, sobre todo porque ni siquiera sabes qué demonios es un EJB. Al final acabas de ser totalmente inútil y es el momento en que te ascienden a jefe de verdad (y es el momento en que te suben el sueldo).

Mar 29

Ingeniería Social

En el trabajo me van a poner un ordenador nuevo. El que tengo tiene ya cinco años y se ve en el monitor la ventana de entrada de Windows usuario/password incluso aunque esté en otro sitio. Vaya, que el monitor está "quemado" y la ventana esa ha dejado su huella en él.

El proceso para el nuevo ordenador es que se lo llevan al departamento de informática/administración, ellos me lo instalan, configuran, etc y luego me lo traen funcionando.

Pues bien, resulta que durante ese proceso me llaman por teléfono y tenemos una conversación algo así como

- estamos configurando tu nuevo ordenador y para dejarlo configurarte el correo necesitaría que me dieras tu password de correo.

- Bueno… ¿No es aconsejable no dar la password de uno al primero que se la pide por teléfono?

- Si…, claro. Entonces envíamela por correo a fulanito@mi_empresa.com

- No, mejor déjalo, ya me configuro yo el correo.

Parece mentira que en una empresa dedicada a la informática/programación y encima con ciertos requisitos de seguirdad como es la mía, andemos entre informáticos (el que me llamó y yo) con este tipo de tonterías. Es de todos sabidos que una técnica de hackers es la ingeniería social y entre ellos el conseguir la password de los usuarios por teléfono con cualquier excusa.

Y lo que es peor, por lo que he comentado con otros compañeros, parece encima que es habitual este tipo de llamadas por parte de nuestro departamento de informática. Si siguen haciéndolo …. será que la gente habitualmente les da la password, si no, no lo harían, vamos, digo yo.

 

Mar 28

Dominios google

Vía ^^ munDo cOn T ^^ descubro que google tiene registrado el dominio www.466453.com. ¿Por qué?. Prueba a escribir google en tu móvil.

Por supuesto, también tiene dominios similares a los suyos, en los que cambia alguna letra, por si la gente se equivoca al escribir: gogle.com, googel.com, ggoogle.com o gogole.com

También descubro en el mismo blog que google lleva una calculadora integrada. En la caja de búsqueda, prueba a buscar (5+2)*2.

Mar 28

Gestor de paquetes Synaptic

En relación con la anotación anterior sobre muchos .jar, me ha llamado mucho la atención en Ubuntu el gestor de paquetes de Synaptic.

El sistema operativo Ubuntu más las aplicaciones que se instalan está formado por -no recuerdo el número- alrededor de mil paquetes/librerías. El gestor de paquetes mantiene un árbol de dependencias de estas librerías, de forma que sabe en todo momento qué tenemos instalado y qué librería depende de qué librería.

Cuando instalamos algo nuevo a través de este paquete, él sabe todas las dependencias de ese nuevo programa, mira si las tiene o si necesitan actualización y las instala o actualiza si es necesario. También sabe si hay paquetes incompatibles con el que vamos a instalar y nos pregunta si queremos desinstalar el incompatible.

Cuando eliminamos un paquete, el gestor de paquetes sabe qué paquetes dependen del que vamos a desinstalar y avisa que va a desinstalarlos también.

Si instalamos además el paquete deborphan, Synaptic será capaz de decirnos, además, qué paquetes tenemos instalados que nadie usa, de forma que podamos eliminarlos.

En fin, una pequeña maravilla para gestionar dependencias. Tú no tienes que gestionar nada, se gestiona solo.

Mar 27

EL.jar & muchos.jar

En el trabajo estamos juntos dos departamentos en uno solo. Las filosofías de trabajo de ambos eran distintas y nos está costando integrar nuestro código precisamente por eso.

Unos trabajan con la filosofía de EL.jar, es decir, todo el proyecto en un solo jar. Los proyectos corren con tres ejecutables distintos, uno de ellos de interface gráfica de usuario básicamente, pero todos ellos son el mismo jar. Sólo se cambia inidica en el arranque cual es la clase que tiene el main().

Este método demuestra ser eficiente en el sentido de evitar complejidad. EL.jar lo tiene todo, es lo que hay que arrancar y se compila siempre todo junto y a la vez. Cuando viene otro proyecto similar, se copia entero y se sigue desarrollando en la nueva copia.

La pega que tiene es que cuando necesitas algo suelto de ahí, puedes obtenerlo, pero trayéndote EL.jar completo. Si necesitas un pequeño panel de interface de usuario que es capaz de pedir una serie de datos, tienes que traerte EL.jar. Si necesitas un algoritmo que tienen que convierte peras en castañas, también necesitas EL.jar. Al estar todo junto, los programadores no controlan muy bien -y de hecho les da igual- el tema de dependencias de unas clases con otras.

La otra filosofía existente es la de hacer muchos.jar. Cada módulo, tema, etc, se hace en un jar más o menos independiente y separado.

Esto evita el problema anterior. Si necesitas algo concreto, te traes un jar pequeño -si acaso con otros jar pequeños de los que depende- y puedes usar ese algo concreto. La gran pega de este sistema es que el despliegue del proyecto se hace relativamente complicado -es casi obligatorio el uso de herramientas o scripts que lo hagan automáticamente-. También el gestionar dependencias y versiones de los jar pequeñitos y las dependencias entre ellos.

Dos filosofías de trabajo distintas. ¿De cual eres partidario? ¿Qué ventajas e inconvenientes ves además de los expuestos?

Mar 24

GParted Y Partition Magic

Otra vez he vuelto a picar y me ha tocado reinstalar Ubuntu.

Ando escasillo de disco para Ubuntu y he decidido darle más espacio, así que a tirar de los editores/gestores de particiones que tengo. La otra vez lo hice con Partition Magic desde Windows y luego el ordenador no arrancaba. Al cambiar el tamaño de la partición, se ve que luego grub no encontraba el fichero de configuración de grub -en /boot/grub/menu.lst-.

Alguien me comentó que debería haberlo hecho desde Ubuntu, con Gparted. Así que esta vez decidí intentarlo por ahí. Pues me salió la primera pega: Desde Gparted con Ubuntu debes tener desmontado el disco que quieres tocar. Para desmontar el disco tiene que NO estar en uso. El disco de Ubuntu está en uso, puesto que Ubuntu está arrancado, por tanto no se puede desmontar y por tanto no se puede tocar con Gparted.

Ahora entiendo por qué sale en internet tanto "LiveCD" con Gparted. Si arrancas desde un CD, no hay ningún disco montado y puedes jugar con todos ellos.

Así que volví a Windows con Partition Magic -me daba mucha pereza bajarme un GParted para CD- y lo hice desde allí, sabedor de que me tocaría reinstalar Ubuntu.

Dicho y hecho, me tocó reinstalar Ubuntu. La verdad que me vino bien, ya que con las últimas pruebas, cargas y descargas, lo había dejado hecho unos trapos al pobre, con montones de errores en el arranque. Instalé dapper que es el que tengo en CD y luego con sudo update-manager -c -d me actualicé a edgy.

Mar 23

Test Continuo

Igual que tenemos integración continua, que básicamente consiste en compilar con frecuencia todo el proyecto desde cero y que hay herramientas que lo hacen automáticmente todos los días, como Cruise Control, también -acabo de descubrir- existe el concepto de test continuo.

Si tenemos unas mínimas buenas costumbres de programación, haremos test unitarios para nuestras clases. Herramientas como Cruise Control y maven se encargan de pasar esos test cada vez que compilamos y nos dicen si hemos o no metido la pata. Pero … ¿por qué no ir más allá?

Acabo de descubrir un plug-in para eclipse -que todavía no he probado, pero lo haré pronto- llamado Continuous Testing Plugin. Tiene pinta de que tú lo instalas en Eclipse, le dices cuales son las clases de test y él, según vas tocando código, va pasando los test de la que eclipse recompila automáticamente. Esto hace que si estropeas un test tocando código, te enteres inmediatamente.

Este mismo Lunes lo pruebo en el trabajo, aunque me da un poco de miedo que ralentice mucho eclipse.

Mar 22

Tutorial

Si buscas en google la palabra Tutorial, verás que aparece como 134 millones de veces. Es una palabra muy común y extendida en internet.

Sin embargo… ¡ No existe en español !

Si vas al diccionario y la buscas, no está. Bueno. Supongo que tendrán que acabar añadiéndola.

Mar 21

Wine

Uno de los motivos para no dejar del todo Windows es Dreamweaver, que uso para mi página web. Aunque en ubuntu hay editores de páginas/sitios web, los que he probado y por lo que he leído, no hay ninguno que le haga sombra a Dreamweaver.

Como posibilidad, se me ocurrió mirar wine, un programa linux capaz de arrancar ejecutables Windows. Hace mucho, mucho, mucho lo probé sin demasiado éxito. Puesto que ubuntu no se parece a los linux de antes, quizás wine tampoco, así que me puse a ello.

Pues bien, no he conseguido todavía arrancar Dreamweaver, pero me ha dejado alucinado el funcionamiento de wine.

Primero con wine config se crea un directorio .wine donde se guarda todo lo necesario para simular windows. Es decir, un directorio drive_c que simula la unidad C:\ y unos ficheros donde se guardan cosas como el registro de Windows.

Además, al ejecutar algo con wine, se arranca wineserver, que es un servidor que nos da todos los servicios que da Windows.

Luego, para el caso de Dreamweaver, se puede meter el disco de instalación, se va uno al CD-ROM, busca el ejecutable de instalación (no recuerdo cómo se llamaba, pero supón que era install.exe) y lo ejecuta con wine install.exe.

Esto ejecuta perfectamente la instalación de Dreamweaver sobre ubuntu. En el directorio .wine creado anteriormente, dentro de drive_c, se crea un "Archivos de Programa/Macromedia/…." y se instala todo sin problemas. Además, la ventana de instalación tiene el aspecto Windows.

Mi problema fue al ejecutar. Me fuí al directorio donde se instaló y el wine Dreamweaver.exe (o como se llame el ejecutable) se eternizó sin hacer nada hasta que me aburrí y lo maté. Seguiré peleándome un poco.

He visto en Helektron que si ya tenemos Dreamweaver instalado en Windows, podemos ahorrarnos el proceso de instalación de ubuntu. Basta, desde .wine hacer unos links a la instalación de Dreamweaver en el disco de windows, importar y exportar los ficheros de registro de windows para ponerlos debajo de .wine y poco más. Una opción interesante para ahorrar un poco de disco.

Otra cosa que me ha llamado la atención y que he leido por ahí, es que wine NO es un emulador de Windows, puesto que no emula nada. Simplemente nos da TODA la API de Windows más alguna cosilla más, de forma que los programas .exe corren exactamente igual que en Windows, pero trabajando contra otras librerías distintas de fondo que tienen la misma API.

Qué cosas hace la gente. Y además gratis.

Mar 20

Más sobre Ubuntu

Sigo jugando con ubuntu.

Lo primero que parece que me he dado cuenta es que aunque buscando cómo instalar muchas cosas encuentras sitios en que te dicen cómo hacerlo, parece que casi siempre se puede hacer a través de Synaptic o apt-get.

En su momento intenté instalar ntfs-3g para poder escribir en las particiones de windows. Miré cómo se hacía, me lo bajé, seguí las instrucciones, que consistían básicamente en bajarse los fuentes, compilar, etc, etc. Sin embargo, volviendo a mirar ahora, me encuentro con que se puede hacer desde synaptic. Unicamente hay que tocar luego el fichero /etc/fstab para poner el montaje. Algo como esto

/dev/hdc1 /media/hdc1 ntfs-3g silent,umask=0,locale=es_ES.utf8 0 0

reemplazando a la que ya hubiera.

Otra cosa que hice en su momento y que también había que instalar y compilar era poner divx al reproductor de video Totem que viene con Ubuntu. También he descubierto que se puede hacer desde Synaptic, en mi caso cambiándose a Totem-Xine. Funcionó rápidamente y sin problemas, aunque no estoy seguro de qué pasos son exactamente los que hay que dar. En las pruebas vas haciendo cosas que no funcionan y al final no sabes si alguno de esos pasos fallidos era realmente necesario o no.

Ahora ando intentando ver y grabar la televisión con ubuntu. Tengo una tarjeta avertv 203 que ubuntu ha detectado bien. Sólo falta el programa que te permita usarla.

Con TVTime no tuve ningún problema, se instaló solo con Synaptic y funcionó bien. El problema es que no permite (o no he visto) cómo grabar.

Luego he probado con MythTV, pero en la primera prueba quiso instalarme un servidor apache con mysql y php y me falló todo. ¿Para qué demonios quiere eso?. La segunda prueba sólo me instaló la base de datos MySQL, pero no he conseguido hacerlo funcionar. Ya me entra la duda de si este programa es compatible o no con la tarjeta.

Otro que aparece como posible es Xawtv, pero me he echado atrás a instalarlo. Si buscas Xawtv en google, las primeras páginas son todas de fallos, bugs y problemas con ese programa.

Seguiré intentándolo.