Ofertas de trabajo informáticas delirantes

A veces, en las búsquedas sucesivas de empleo uno se va encontrando ofertas con determinados requisitos más o menos curiosos, o con determinados personajes tras ellas cuanto menos, sórdidos. Ahí va una pequeña recopilación de algunas que se me vienen a la cabeza, ya sean vistas o sufridas:

  • Oferta de trabajo en la que se pedía «Programador iPhone y Android» y en la que se ponía como requisito Ser una persona positiva. Esta no sería tan llamativa si no fuera con lo que me encontré cuando me llamaron la entrevista. Tras la gran frase pronunciada por el dueño de la «empresa» (entre comillas porque el término chiringuito les pegaría más) ¿Qué es Objective C? seguido por un No sabía que Java tenía algo que ver con Android (desde luego, todo un conocedor en profundidad de su sector el tío) llegó el gran momento de las condiciones laborales: Los seis primeros meses no vas a cobrar, si luego la empresa da beneficios te pagaremos algo. Seguido de un desalentador No hay ningún proyecto, el equipo que contratemos tenéis que generar ideas y desarrollarlas y finalizado con la perla ¿Tienes ordenador? Es que la idea es que traigas tu propio dispositivo.
  • Muy habitual en los últimos tiempos «Se busca programador Junior. Experiencia mínima: de 3 a 5 años». Puede ser contradictorio lo de experiencia y junior, al menos hasta que interpretas la oferta, donde realmente quieren decir Queremos a un programador/dba/administrador con la máxima experiencia posible pero que acepte cobrar como un junior. Claro, suena mejor lo de «se busca Junior con experiencia» que «se busca trajador con experiencia que acepte cobrar una mierda«.
  • Oferta de trabajo «Se necesita programador PHP para proyecto con importante compañía eléctrica». Este la ofertaba a su nombre un autónomo y tenía tela también al llegar a la entrevista. Bueno, no hubo entrevista que la cosa fue por teléfono. Tras desconfiar bastante porque la razón social que daba el tío era un piso vacío (comprobado in situ) le pedí al caballero en cuestión un borrador del contrato y un aval bancario o similar que garantizase que iba a cobrar el trabajo, la respuesta fue Borrador no te puedo llevar porque la idea es que trabajes sin contrato, que fue seguido de un si quieres cotizar te haces autónomo y te pagas la seguridad social y el IVA con lo que te de (claro, habrase visto eso de querer tener contrato… si es que estamos mal acostumbrados), en cuanto al aval bancario (o plan de empresa o… algo) se resumió en Aval no tengo, pero puedes fiarte de mi, que soy de buena familia (ya se nota que es de buena familia, si empieza por tangarle pasta a la seguridad social contratando a gente sin hacerles contrato). Teniendo en cuenta que el tío decía haber estudiado en Harvard, en California (bueno, decir decía Harvard, pero como le veía venir con la cadena y la manta de fantasmóooooon le pregunté ¿En California? y dijo que sí todo convencido) os podéis hacer una idea de pasé bastante de la cuestión (que estoy en el paro, pero no soy tonto y eso apestaba a estafa).
  • A principios de 2011 vi una oferta en la que se pedía «Programador con cinco años de experiencia desarrollando aplicaciones para Android». Partiendo de que en 2006 el proyecto Android estaba arrancando… o querían contratar a un programador de los creadores del sistema operativo o lo iban a tener jodido.
  • No hace mucho en Infojobs «Se necesita programador web con 5 años de experiencia en HTML5 y CSS3»… más o menos como el caso anterior.
  • Una que siempre me pregunté a qué se refería «Se necesita administrador de Microsoft Word«. ¿WTF?
  • Otra grande fue, en una entrevista «Bueno, sí, el contrato es a media jornada, de 10 de la mañana a dos de la tarde de lunes a sábado, pero tienes que llegar a las ocho y luego quedarte hasta las ocho y media de la tarde, para atender a los clientes por teléfono. Esas horas no las cobras.» Al momento de preguntar por la pausa para comer la cosa fue «Trae un bocadillo, que así no tienes que irte y puedes dar atención mientras esperas». Bueno, 400 euros por más de 70 horas semanales es un contrato cojonudo… en China o en la India al menos.
  • En otra entrevista: «Puedes usar el software que quieras, pero eso sí, no vamos a pagar ninguna licencia». Ingénuo de mi pregunté ¿Entonces se trabajará sólo con software libre? y la respuesta fue «Si quieres sí  y si no, lo pirateas«. De hecho utilizaban un FTP privativo pirateado y anticuado en lugar de Filezilla, a pesar de que dicho FTP funcionaba exactamente igual y hasta la interfaz era más fea.

Bueno, hasta aquí llego hoy. Parece que con la crisis a más de uno se le va la pinza o se le ve más el plumero. Podéis colaborar contando las vuestras en los comentarios.

Limitar el número de filas en la salida de un consulta en Oracle

En fin, hoy primer contacto con el SGBD de Oracle (sí, ese privativo tan caro y a la vez tan extendido en la administración), del cual no puedo decir mucho porque con una clase, sobre fundamentos de SQL además (que no es por ir de sobrado, pero la primera semana me da que me voy a aburrir repasando lo más básico de siempre), pues no da para haber testado mucho. Lo que sí comprobé, tonteando un poco, es que la forma de forma de limitar el número de filas en la salida de una consulta no tiene nada que ver ni con SQL-Server, PostgreSQL o MySQL.

Porque claro, tú quieres por ejemplo sacar los 10 que más cobran y en MySQL o en PostgreSQL lo haces tal que así

SELECT nombre FROM empleados ORDER BY salario LIMIT 10

Y si eres de los de tito Bill te apañarías con:

SELECT TOP 10 nombre FROM empleados ORDER BY salario 

Total, que andaba trasteando un rato después de hacer los ejercicios, tipo «me ha sobrado un huevo de tiempo, vamos a probar si otras cosas van igual que en algunos de los sistemas gestore que he usado» y ahí me encuentro que esto cambia, que ni es como en Microsoft ni como en los otros dos SGBD libres. Aunque curiosamente la palabra limit aparezca como reservada (todavía no se para qué, una de las cosas que espero aprender en el susodicho curso). Tras un poco de investigación entre la (vasta) documentación de Oracle me ecuentro con que la cosa va así:

SELECT nombre FROM empleados ORDER BY salario WERE rownum<=10

Conclusión/explicación: Oracle nos ofrece una pseudocolumna (iba a llamarlo variable, pero acabo de leer que este es el término más correcto) llamada rownum (número de fila) que nos servirá, mediante una condición where, para limitar la salida de resultados de la consulta (también puede valer para realizar consultas paginadas en una web, pero igual te chupas demasiadas conexiones al motor si lo haces así en vez de bajar todo de vez y manejarlo en el cliente… ahí ya depende del proyecto). Si quieres 10 filas le dices «que el número de fila sea menor o igual que diez», que quieres 20… lo mismo.

Instalar KDE en Ubuntu

Artículo dedicado a mi buen amigo Brais, que está dispuesto a lanzarse de cabeza al mundo de KDE. Vaya por delante una cuestión, y es que si quieres usar KDE sobre Ubuntu lo mejor es que descargues e instales directamente Kubuntu. Haces la instalación limpia y vía, te funcionará mejor.

Pero supongamos que no es el caso, pensemos que simplemente eres un usuario de Ubuntu que se ha cansado de Unity (todo ese diseño a la Apple a algunos les rechina aunque yo, la verdad, no estoy entre los descontentos, pero sí es cierto que se hace raro en un principio), has visto una demo de KDE y has dicho «Coño, esto es lo mío». ¿Cómo instalar KDE? Tres sencillos pasos desde el terminal y estará listo:

sudo add-apt-repository ppa:kubuntu-ppa/backports
sudo apt-get update
sudo apt-get install kubuntu-desktop

Esto te permitirá instalar KDE sin deshacerte de Unity, por si alguna de sus aplicaciones te resulta interesante, pudiendo así elegir en el GRUB con qué escritorio iniciar.

Si eso añado también otro día cómo hacerlo en Debian, que creo que puede ser interesante.

Función palindrome? en Ruby

Otro de los ejercicios del Curso SAAS de Berkeley era hacer un método que comprobara un palíndromo (ej 1) e incluirlo dentro de la clase String (en el ej… 5 o el 6, no me acuerdo). En todo caso, puede parecer algo extremadamente simple, pero tiene un mínimo de chicha.

Digo que tiene más chicha porque más allá de hacer un simple reverse, que nos valdría para una palabra sola, la idea es hacerlo ignorando espacios y números, para poder aplicarlo a una frase completa, y que además no sea case sensitive (vamos, que no distinga mayúsculas de minúsculas). Tampoco tiene mucha complicación, es todo cuestioń de una expresión regular:

def palindrome?(string)
    letters = string.downcase.scan(/\w/)
    letters == letters.reverse
  end

Cuatro líneas… bueno, realmente dos porque las otras dos definen el método. ¿Y meterlo dentro de String? Dos líneas más, una modificación y vía. Es la potencia de Ruby, que puedes abrir cualquier clase cuando lo necesites:

class String
  def palindrome?
    letters = self.downcase.scan(/\w/)
    letters == letters.reverse
  end
end

El método devolverá true en caso de éxito y nulo en caso de que no haya coincidencia. Sencillo y liquidado.

Libre Software World Conference 2012

Recién llegado estoy de la Libre Software World Conference 2012 (LSWC), que como este año se celebrara en Compostela era pecado no ir. Celebrada en la Ciudad de la Cultura, en otro intento por buscar utilidad y justificar ese monumento a la futilidad y el derroche de dinero público, contamos con dos días de diversas charlas y exposiciones sobre software libre (y muchas barritas de sésamo y zumo de mango en los «coffee breaks»).

El jueves 18 comenzaba todo a las 10 de la mañana con una charla más o menos insulsa a cargo del presidente de Asolif, el de Agasol y una representante de la Xunta cuyo nombre no recuerdo (y no viene el programa). Tras eso, y ya metidos en chicha, uno de los pesos pesados del evento, Bruce Perens, daba la salida con una conferencia más evangelizadora que técnica sobre el por qué usar software libre. Parón para el café y nos metimos en una charla sobre diversos tipos de licencias y formas alternativas al copyright a cargo de una abogada del despacho Lener, si bien la ponente no manejó bien los tiempos y cuando el tema se ponía interesante tuvo que cortar, consumiendo demasiado tiempo en insulsa cháchara promocionando su marca. Tras esto nos metimos en la mesa redonda sobre El ERP como Herramienta para Pymes, donde varios implantadores nos hablaron sobre OpenERP, OpenBravo y Eneboo ERP, siendo una charla bastante interesante (a mi me hizo en pensar en un par de nichos de mercado en este campo) sobre todo por dar a conocer Eneboo, un proyecto del que apenas había oído hablar.

Tras la comida nos perdimos la primera conferencia y pasamos ya directos a la de Wikipedia, Wikimedia y Conocimiento libre, a cargo de Jorge Antonio Sierra Canduela, de Wikimedia España, de nuevo más centrada en despejar ciertos mitos sobre la Wikipedia y animar a colaborar en el proyecto que en cuestiones técnicas, pero puede decirse que fue una charla bastante interesante. Aunque lo que sí vi profundamente interesante fue la confrencia de Torsten Grote sobre el movimiento Free your Android, una causa patrocinada por la Free Software Fundation Europe y sobre la que nos pudimos informar, hablando de forks libres de Android, markets alternativos de apps libres, ideas para difundir el movimiento, problemas para popularizarlo como la falta de drivers… Una muy buena exposición.

Tras esto venían varias conferencias sobre banca ética y economía sostenible, que no digo que no fueran intersantes ni que no comparta algunas de esas ideas, pero la verdad es que estábamos más por las cuestiones técnicas, por lo que dimos por finalizada la jornada.
Y llegamos a hoy viernes, comenzando con la gente de la cooperativa Gaueko hablándonos del proyecto Guifi.net, una iniciativa para la creación de una red libre que cumpla con los preceptos de las cuatro libertades. Y otra de las charlas intresantes fue Presente y futuro de KDE, a cargo de José Millán y Alex Fiestas de KDE España, donde destacaron algunas novedades del proyecto KDE como la idea de realizar apps para Android basadas en framework Qt, el uso del concepto de «actividades» para que el usuario organice su información y, lo que a mi más me interesó, el proyecto de escritorio orientado a dispositivos móviles Plasma Active, de hecho nos perderíamos las conferencias posteriores al parón para el café por estar hablando con ellos sobre este tema, visualizando Plasma Active en funcionamiento en una tablet, charlando sobre los problemas con los drivers y el hardware y demás (hay que decirlo, dos chavales muy majos). Pero eso sería adelantarse, porque antes asistimos a una pequeña presentación sobre Joomla (explicando un poco las virtudes de la nueva versión del famoso CMS) y a la charla de Jeremy Allison sobre los proyectos libres de Google, el cual tuvo que ejercer de zafador como un buen boxeador, esquivando ganchos desde la audiencia (incluso de otros conferenciates como Perens o Grote) sobre cuestiones polémicas como las patentes de software o ciertas prácticas fiscales deshonestas de Google (aunque él mismo dijo que una cosa es la opinión de Google como empresa y otra muy distinta la suya como persona, y como defensor del software libre que ha trabajado en una partner de Microsoft no tengo autoridad moral para juzgarle). En fin, como ya dije antes, nos perdimos las siguientes conferencias hablando con la gente de KDE, y a comer.

La tarde comenzó con una más que interesante ponencia de Emanuel Calvo de PalominoDB sobre las novedades que incorpora PostgreSQL 9.2 (seguramente la charla más técnica del evento), aunque me perdí una parte por una llama telefónica. Lo que sí pude ver es que muchas de las mejoras que implementó Microsoft en su R2 de SQL-Server 2008 también fueron implementadas ahora en PostgreSQL, el cual por cierto parece ganar cada vez más mercado frente a MySQL. La gente de Neurowork, por su parte, nos hablaron de otro nuevo proyecto de software libre muy interesante: el framework eMobc, orientado a la creación de apps para móvil en iOS, Android y HTML5 haciendo uso de XML y de pantallas ya diseñadas, en un concepto que tiene pinta de ofrecer gran productividad. Tras esta charla, donde ya se había acumulado un considerable retraso, charlamos un poco sobe el citado framework con la gente de Neurowork, perdiéndonos la siguiente conferencia, y finalmente tocó el turno de John Sullivan, de nuevo con un tono más evangelizador, centrándose en mecanismos para popularizar el software libre, en hacerle llegar el mensaje al consumidor y cerrando así el evento.

Dos días de promoción y presentación de iniciativas de Software Libre de la que sacamos información sobre algunos proyectos que desconocía, alguna idea que puede que explote en el futuro y una divertida anécdota final con uno de los conferenciantes que me reservo para contar entre risas en alguna noche de alcohol y rock and roll.

Software para virtualización (doméstico)

En fin, de nuevo a sugerencia del señor Mozano una entrada sobre virtualización.

¿Por qué virtualizar? Bueno, si tienes un ordenador medianamente potente te habrás pispado de que tienes potencia suficiente para mover varios sistemas operativos. De vez en cuando te puede apetecer probar una beta inestable de una distribución de Linux (para esos días en los que no puedes esperar a ver las novedades), o tener a mano un Windows 98, un XP o hasta un equipo con MS-DOS para trastear con algún programa o juego viejo, que ya no está soportado en las versiones más modernas de Windows (por ejemplo, me pasó con el emulador de Neo Geo NeoRage, que no funcionaba en Windows Vista). O simplemente para realizar experimentos, como ataques contra un servidor. Este software te permite crear un archivo que funcione como disco duro virtual y ejecutar otro sistema operativo en tu ordenador, como un ordenador dentro del tuyo (lo que llamamos máquina virtual).

El software más popular para virtualizar es el siguiente:

  • Virtual Box: Era un programa original de Sun Microsystems que actualmente ha quedado bajo el control de Oracle. Es gratis y tiene versiones para Windows, MacOS, Linux y, como no, Solaris (sólo jodería que siendo un producto de SUN no tuviese versión en su propio sistema operativo). Su gran atractivo son las Guest Additions, que nos permiten muchas chuminadas, como compartir con facilidad archivos y carpetas entra la máquina virtual y la máquina física, usar las ventanas en «modo fluído», como si el sistema operativo virtualizado fuera un programa en una ventana más. Además, permite clonar discos duros virtuales con gran facilidad y hacer «snapshots» del sistema para deshacer cambios en las pruebas. En mi casa es el que más utilizo.
  • VM Ware: Este software canadiense tiene dos versiones: gratis y de pago (alrededor de 199$), además de otra versión para servidores de la que no hablaremos, ya que no viene al caso. VMWare Player es la versión simple y doméstica, que permite simplemente descargar máquinas y ejecutarlas. La versión de pago, VMWare Workstation añade funcionalidades como una mayor integración entre máquina física y virtual, posibilidad de crear nuestras propias máquinas, creación de snapshots, permite deshacer y repetir cambios, compartir máquinas virtuales en red… Está disponible en Linux y en Windows.
  • Windows Virtual PC: Un limitado producto de Microsoft pero que puede ser muy útil. Sólo disponible para Windows y sólo permite crear máquinas virtuales de Windows. En principio parece un poco chorras la cosa, ok, pero tiene ciertas ventajas. Por ejemplo, pongamos que tienes un Windows 7  y una máquina virtual de Windows XP para usar… el Neo Rage que citaba antes, mismamente. Virtual PC te permitirá instalar Neo Rage en el XP, crear un acceso directo en el escritorio del Windows 7 y ejecutar la aplicación de forma que te parecerá que se ejecuta nativamente (vamos, como si usaras Wine en Linux). Es una opción interesante para usuarios de Windows que quieran usar programas que se han quedado incompatibles con su SO.
  • QEMU: Disponible desde no hace mucho para todas las plataformas (hasta hace un año y pico sólo existía para Linux), es una opción libre y muy potente. La verdad, no he llegado a trabajar con él en profundidad. Permite trabajar sobre todo tipo de arquitecturas (x86, AMD64, Power PC, SPARC… aunque el mejor rendimiento se consigue con una versión aceleraca, kqemu, en arquitectura i386), ser utilizado para proveer hosting virtual, hacer virtualización de escritorio… en él se basa Wine para ejecutar los programas de Windows sobre arquitecturas no Intel. Tengo pendiente profundizar, pero las posibilidades parecen casi infinitas.
  • Parallels: Famoso sobre todo por su versión para MacOS, existe también para Windows y Linux, aunque es menos popular. De pago (79 $), permite emulación de escritorio con una particularidad, cuando se pasa de la máquina física a la virtual fuerza a que el equipo anfitrión  renuncie a parte de su potencia para cederlo a la virtualización.

En resumen ¿Con cual nos  quedamos? A falta de profundizar en QEMU, yo me decanto por Virtual Box. Reconozco que es menos potente que VMWare y menos intuitivo que Parallels, pero incluye muchas variadas y potentes opciones totalmente gratis, es multiplataforma, la curva de aprendizaje no es muy exagerada y permite virtualizar casi cualquier sistema operativo. Para el usuario doméstico, y para las pruebas básicas de un desarrollador, da de sobra. Además, las máquinas virtuales que creas con Virtual Box las puedes ejecutar luego tanto en VMWare como en Parallels, y viceversa, puedes abrir con él un disco duro virtual creado con los otros. Además, desde la inclusión del modo fluído se ha superado su gran handicap frente a sus otros competidores. Si quieres virtualizar sólo para usar programas antiguos en Windows, entonces prueba Virtual PC.

Webs de formación on-line

A petición de mi colega el Señor Mozano hice esta entrada en el año 2012. Ya ni me acordaba de ella, pero el otro día labusqué a raiz de una conversación en Twitter y me he encontrado con que está bastante anticuada. Me he decidido a actualizarla con más webs de formación on-line en el área informática.
 

  • Coursera: En su momento era la página más conocida en cuanto a cursos on line. Los más famosos y que cuentan con más alumnos son los de informática, aunque recogen cursos de varias disciplinas. Todos ellos están patrocinados por universidades estadounidenses e impartidos por profesores de las mismas.
  • Udacity: Fundada por profesores de la universidad de Standford, tiene un gran catálogo de cursos sobre diversos temas relacionados con la informática o las ciencias de la computación (diseño de algoritmos, robótica, física, matemáticas…). Todos los cursos están en inglés.
  • EdX:  EdX oferta cursos on-line de las prestigiosas universidades Berkeley, Harvard y MIT. De momento tienen menos variedad en su oferta que Udacity y Coursera. De hecho algunos de los cursos que ofrecen ya fueron impartidos en Coursera en pasados cuatrimestres. Con todo, es una opción interesante a la hora de buscar formación. La mayoría de los cursos están en inglés, aunque hay algunos en otros idiomas.
  • Incibe: Se trata de la antigua página web de Inteco, el Instituto nacional de tecnologías de la información, que ha cambiado su nombre por el de INCIBE (Instituto Nacional de Ciberseguridad). Tiene una oferta de varios cursos gratis, divididos en tres áreas: seguridad, accesibilidad y calidad. En este caso los cursos están en castellano.
  • Tecnosaber: A diferencia de los otros, Tecnosaber (web que además creo que es dependiente de Tecnoempleo) realmente es una página para la búsqueda de cursos en España, ya sean on-line o presenciales, y gratuitos o de pago. En el caso de buscar cursos gratis lo más abundante son cursos de formación continua para trabajadores en activo, así que si tienes trabajo (cosa extraña en este país) puedes aprovechar y mejorar tu currículum vítae para así poder marchar al extranjero a algún sitio donde te paguen bien y las horas extra sean cobradas.
  • Codeacademy: Codecademy es una plataforma interactiva en línea que ofrece clases gratuitas de programación, dando la opciónde formarse en distintos lenguages y API’s. Su metodología tiene un enfoque muy práctico y lleno de ejercicios.
  • Udemy: Udemy es una plataforma de aprendizaje en línea dirigida a profesionales.​ A diferencia de otros programas académicos MOOC creados por universidades, Udemy utiliza contenido de creadores en línea que vende para conseguir beneficios.​ Por tanto en Udemy no solo tienes la opción de estudiar sino también de crear tu propio material que vender.
  • Lynda.com: Se trata de una empresa de teleformación fundada a mediados de los años 90 por Lynda Weinman en California, pero que alcanzó su mayor valor en la era de internet. En 2015 fue comprada por LinkedIn, que posteriormente sería también absorvida por Microsoft. Sus contenidos están centrados principalmente en los campos de la programación, el diseño y la economía.
  • Futurelearn: Esta web de cursos online fue fundanda en 2012 por la universidad de Milton Keynes, casi en las mismas fechas en las que se publicó el artículo original. Pronto se le unieron varias universidades británicas más. Tiene cursos muy variados, en todo tipo de áreas.
  • UOC: La universidad a distancia pública catalana también tiene una sección desde la que ofrece algunos pequeños cursos abiertos en distintas áreas.
  • Code.org: Es un proyecto formativo estadounidense, financiado por varias empresas tecnológicas, que ofrece recursos para gente que esté aprendiendo a programar, con un funcionamiento muy similar al de la antes citada Codeacademy.
  • Khan Academy: Es una organización educativa sin ánimo de lucro​ y un sitio web creado en 2006 por el educador estadounidense​ Salman Khan. Su objetivo es proporcionar una educación gratuita de nivel mundial para cualquier persona, en cualquier lugar. Su formación está dirigida a escolares de enseñanza primaria y secundaria con cursos sobre matemáticas, biología, química, física, computación también humanidades, economía, finanzas e historia. A pesar de no tratarse de una formación muy avanzada sí es muy útil si queremos reforzar nuestra base de conocimientos en alguna de esas áreas.
  • CNTG: Originalmente,cuando se publicó el artículo, el CNTG no ofrecía cursos en modalidad no presencial, pero con los años eso ha cambiado. Si eres gallego, o por lo menos vives en Galicia, el Centro de Novas Tecnoloxías (Santiago de Compostela) oferta varios cursos y seminarios entre los meses de octubre y junio. Son limitados (15-16 alumnos por curso) y tienen una prueba de acceso previa, pero en algunos te dan de gratis un examen de certificación.

Y con esto está bien la cosa para empezar. En su día este tipo de webs y cursos me ayudaron a engordar mi currículum mientras buscaba trabajo, y ahora que curro a jornada completa me permiten seguir estudiando cosas nuevas pudiendo compaginarlo con mi jornada laboral.

Producto cartesiano de dos arrays en Ruby

Bueno, sigo con el curso de SAAS de Berkeley, y me ha dado por poner otro ejercicio (bueno, realmente es que llevo días sin escribir, estoy sin ideas y como acabo de hacerlo…). En este caso el último del «homework 1», que ha sido todo un alivio porque me esperaba algo jodidérrimo pero… no, para nada, es una chorrada tan gorda como hacer una clase con un método each que muestre el producto cartesiano de dos arrays:

class CartesianProduct
  include Enumerable
  def initialize(col1, col2)
    @col1 = col1
    @col2 = col2
  end

  def each
    return to_enum unless block_given?
    @col1.each do |x| 
      @col2.each { |y| yield [x, y] }
    end
  end
end

Como ya ves el constructor de la clase recibe dos arrays (col1 y col2) para inicializar el objeto, y por otra parte el método each recorre el primero cruzando cada elemento con todos los elementos del segundo (de ahí que haya un each dentro de otro each).

Fácil, rápido y barato… por decir algo.

Piedra-papel-tijera en Ruby

Un pequeño ejercicio de Ruby que he tenido que hacer en el curso de SaaS de Berkeley (en EdX) es un método que «juegue» al tres en raya. Recibiendo un array bidimimensional (la variable game en el ejemplo) debe devolver el resultado de qué jugador sería el ganador. Si hay más de dos jugadores devuelve una excepción, y si alguno mete una letra que no sea R (rock), P (paper), S (scissors) lanza otra excepción (ambas vienen ya dadas en el código de ejemplo). Finalmente, si ambos sacan lo mismo da como ganador al jugador 1 (¿por qué? pues porque es lo que pide el enunciado a reclamarle al maese armero)

En fin, el código sería tal que así:

class WrongNumberOfPlayersError < StandardError ; end
class NoSuchStrategyError < StandardError ; end

def rps_game_winner(game)
  raise WrongNumberOfPlayersError unless game.length == 2
  game[0][1] = game[0][1].downcase
  game[1][1] = game[1][1].downcase
  raise NoSuchStrategyError if game[0][1] != 'r' and game[0][1] != 'p' and game[0][1] != 's'
  raise NoSuchStrategyError if game[1][1] != 'r' and game[1][1] != 'p' and game[1][1] != 's'
  ganador = 0
  if game[0][1] == 'r'
   if game[1][1] == 'r'
   elsif game [1][1] == 'p'
   ganador = 1
   else
   end
  elsif game[0][1] == 'p'
   if game[1][1] == 'r'
   elsif game [1][1] == 'p'
   else
   ganador = 1
   end
  else
   if game[1][1] == 'r'
   ganador = 1
   elsif game [1][1] == 'p'
   else
   end
  end
  return game[ganador]
end

La chicha viene con la segunda parte del ejercicio, el modo tournament. Este recibe un array de arrays bidimensionales con todos los enfrentamientos (hay que suponer que están bien formados y bien anidados, y debe permitir cualquier cantidad de jugadores, siempre que crezcan en progresión de potencias de 2: 4,8,16,32… piensa el cualquier Play off de cualquier deporte) y los recorre como una eliminatoria. Ponen como ejemplo que reciba algo tal que así:

[
    [
        [ ["Armando", "P"], ["Dave", "S"] ],
        [ ["Richard", "R"],  ["Michael", "S"] ],
    ],
    [
        [ ["Allen", "S"], ["Omer", "P"] ],
        [ ["David E.", "R"], ["Richard X.", "P"] ]
    ]
]

Ok, ¿qué hacer frente al anidamiento? Pues recursividad, tema que ya explicamos. En este caso, el método comprobará que cada array a su vez contenga un array y si es así vuelve a llamarse a si mismo hasta que llegue a un enfretamiento, donde entonces llamará al método de la primera parte para devolver al ganador.

def rps_tournament_winner(tournament)
  if tournament[0][0].kind_of?(Array)
       rps_game_winner([rps_tournament_winner(tournament[0]), rps_tournament_winner(tournament[1])])
  else
   rps_game_winner(tournament)
  end
end

Y con esto y un bizcocho, ejercicio realizado. Lo he enviado y ya está corregido, y me ha dado el 100%, así que espero que os aclare las dudas. (Como dice un colega mío «no me copiar, me cago en Satán»… en fin, o sí, que yo tampoco soy ni profesor ni vuestro padre). En todo caso veis que con la recursividad un simple if/else resuelve toda la carga de trabajo en cinco líneas (bueno, realmente dos)

Crear una función en MySQL

Aunque se trate de algo muy básico a la hora de programar bases de datos, creo que no está de más hablar de la sintáxis para la creación de funciones definidas por el usuario en MySQL. Dicha sintaxis es la siguiente:

CREATE [AGGREGATE] FUNCTION function_name RETURNS {STRING|INTEGER|REAL}
       SONAME shared_library_name

Explicado rápidamente: function_name es el nombre con el que se va a invocar dicha función. RETURNS nos indica, por otra parte, qué tipo de dato recibiremos como respuesta. Y shared_library_name es el nombre del fichero del objeto compartido que guarda el código de la función. El modificador opcional AGGREGATE permite definir la función como una función de agregado (como SUM() o COUNT()).

Para poder crear una función se necesita tener permiso de INSERT en la base de datos, mientras que para eliminarla se necesitan permisos de DELETE. La sintaxis de borrado de una función es:

DROP FUNCTION function_name

MySQL además del uso de funciones SQL permite también el uso de funciones de C y C++ (como SQL-Server permite el uso de funciones contenidas en una .dll u Oracle el uso de Java). En caso de querer usar una función de C hay que recordar que los tipos de datos en C no se llaman igual que en SQL, para definir el retorno de la función. STRING sería char *, INTEGER sería long long y REAL sería double. También es interesante, aunque no obligatorio, definir una función nombredelafuncion_init() y nombredelafuncion_deinit(), el primero para reservar memoria y el segundo para liberarla. Recuerda que C no reserva memoria automáticamente, así que puede ser indispensable para el uso de la función si esta requiere algo de RAM. Las funciones en C o C++ deben compilarse e instalarse en el equipo donde corre el servidor.