La bola mágica, un divertido script en Ruby

la bola mágica

El otro día vi un capitulo de los Simpon en el que Milhouse usa una bola mágica a la que le hace preguntas. Por pura diversión hice un pequeño script en Ruby para simular esta la bola mágica (Magic 8 Ball).

Episodio de los Simpson en el que usan la bola mágica
Episodio de los Simpson en el que usan la bola mágica.

El dispositivo original es bastante ingenioso, se le hace una pregunta a la bola mágica que tiene en su interior un icosaedro y en cada una de sus caras tiene grabada una respuesta que se puede ver a través de una ventanilla.

Read moreLa bola mágica, un divertido script en Ruby

Artículos relacionados (algunos patrocinados)

CodeAcademy una buena idea mal ejecutada

Please try again later

Si más no recuerdo, el mes pasado me enteré del sitio [CodeAcademy](http://www.codecademy.com/) que ofrece cursos para mejorar tus habilidades en varios lenguajes de programación y que estaba estrenando varios de estos cursos en Español.

Me inscribí al curso de **Ruby**, en miras de afianzar mis conocimientos para después tomar el de **Make a Rails App**.

Me gusta el concepto educativo que maneja Codeacademy al estilo de “Mira, este es el concepto” – “Te muestro un ejemplo” – “Modifica el ejemplo” y cuando completes la tarea pasas al siguiente nivel. En el transcurso de los cursos vas acumulando “Medallas” al estilo de “Logros desbloqueados” cuando terminas una lección. Hasta aquí todo parecía genial y por algunos instantes difruté mucho las lecciones. Sin embargo no todo es miel sobre hojuelas en CodeAcademy.

## Capítulos mal enlazados
Durante mi curso de **Ruby** tuve un problema a la mitad del curso, simplemente no podía avanzar a la siguiente lección y en su lugar me aparecía la información de mi perfil.

Después de varios intententos fallidos seguí un consejo que ofrecían en los foros de soporte de CodeAcademy. Busqué en Google la siguiente lección y mediante un enlace del buscador pude avanzar, pero al finalizar el curso me siguen faltando las dos lecciones que tienen el error, así que nunca pude terminarlo y me quedé con un 80% avance. :S

Curso incompleto de Ruby.
Curso incompleto de Ruby.

## El eterno “Try again later”
Me di cuenta que era inútil mirar atrás y continué avanzado. Cuando empecé el curso **Make a Rails App** los problemas aumentaron. Solamente una vez logré que funcionará el curso, de ahí en adelante siempre me ha aparecido el mensaje: **Sorry, something’s gone wrong. Please try again later.** y de ahí no pude salir. Intenté de todo, varios navegadores, cambios en mi conexión a Internet, limpiar el caché y nada … Siempre me aparece el mismo mensaje de error.

Please try again later
Ya no pude avanzar más en este curso.

## Sin soporte
Aunque el diseño de los cursos de CodeAcademy es muy bueno y la metodología me encanta, los problemas frecuentes hacen que la estancia en el salón de clase sea tan frustrante como en un salón real. Lo único que se puede hacer con los *bugs* es reportarlos y [así lo hice](http://www.codecademy.com/forum_questions/54c08859937676fd280008eb), pero tal parece que son foros fantasma, no hay un mensaje de confirmación por parte de algún moderador de CodeAcademy, son los usuarios reportando una y otra vez el mismo problema. Incluso llegué a redactar un reporte más en forma en inglés con más información pero a la fecha no se han solucionado y tampoco he recibido un correo con algún tipo de confirmación o con alguna solución al problema.

Algunos compañeros me han dicho que la versión en inglés del curso no tiene tantos problemas, pero no he encontrado una forma sencilla de cambiar el idioma en mi perfil. Desde mi particular punto de vista creo que no deberían de liberar un producto con tantos problemas si no han probado anteriormente.

Si quieren probar otros cursos adelante, me han dicho que los cursos de HTML y CSS están muy interesantes, espero que no tengan tantos problemas como yo.

Imprimir archivos en orden con lpr y Ruby

ordenamiento alfanúmerico vs natural o númerico

El otro día me llegó un problema interesante, tenía una colección de archivos en formato PDF que se tenían que imprimir en orden.

Bueno, al principio no sabía que tenía que ser en orden y para imprimir todos los archivos de una capeta sólo use el comando:

lpr *.pdf

Y cumplía con el objetivo de imprimir todos los archivos PDF de la carpeta, pero luego resultó que el orden de impresión era importante (para buscarlos posteriormente) y es donde el problema se complicó un poco, porque hacerlo a mano simplemente no era una opción ¡Son demasiados!.

Orden alfábetico o númerico.

El problema es que una cosa es el orden alfabético y otro muy distinto el orden numérico.

Por ejemplo, tengo esta colección de archivos:

  • 1.pdf
  • 521.pdf
  • 002.pdf
  • 11.pdf
  • 0850.pdf

El resultado de un ordenamiento estándar sería el siguiente:

archivos = ["1.pdf","521.pdf","002.pdf","11.pdf","0850.pdf"]    
puts archivos.sort
  • 002.pdf
  • 0850.pdf
  • 1.pdf
  • 11.pdf
  • 521.pdf
orden alfanumerico en ruby
Fig.1 Ejemplo de un ordenamiento estándar en Ruby.

Como pueden ver, están bien ordenados, pero de manera alfanúmerica. Es una cuestión de interpretación de los datos y generalmente el nombre de un archivo se considera un dato alfanúmerico.

Y el caso se complica aún más porque la longitud del nombre del archivo no es la misma.

Aunque es correcto no es el efecto que deseo.

La solución: Naturally

Buscando en Google dí con Naturally una gema de Ruby que se encarga de interpretar de una forma más humana este tipo de ordenamientos númericos.

Para usar Naturally primero hay que instalarlo.

gem install naturally

Y este es un ejemplo de su uso:

El resultado del ordenamiento es:

  • 1.pdf
  • 002.pdf
  • 11.pdf
  • 521.pdf
  • 0850.pdf
Resultado del ordenamiento usando Naturally.
Fig. 2. Resultado del ordenamiento usando Naturally.

Y ahora si, el orden es el que precisamente estoy buscando ¡Yeeeeeei!

A imprimir.

A estas alturas ya estaba muy cerca de la solución, ahora solo tenía que desarrollar un programa en Ruby que leyera todos los archivos PDF de una carpeta, los ordenara de forma natural y mandar imprimir cada archivo.

Al ejecutar el script empieza la impresión de los archivos PDF en la impresora predeterminada uno por uno, pero ahora en el orden que quiero.

Espero que este artículo les sea de utilidad. Todavía intuyo que es posible hacerlo en bash, pero como ya lo resolví este problema utilizando Ruby y funciona tan bien que voy a dar por cerrado el tema.

Ahora con Bash

Gracias a este comentario en google plus de Rodolfo Zola que me aclaró como resolver el mismo problema usando bash y el comando sort.

Y funciona perfectamente, sólo lo modifiqué un poco para que solamente imprimiera archivos pdf.

Actualización.

Al final me decanté por usar el script en bash, le agregué una pausa de 8 segundos (sleep 8) para no saturar la cola de impresión de la impresora de red a la que mando el trabajo y como cereza del pastel, se pueden fijar que ahora el comando lpr especifica que la impresión será en hoja tamaño carta y además hiciera un ajuste en el tamaño de la impresión con la opción fit-to-page.

Para finalizar copié el archivo printsort.sh a la carpeta /usr/bin para que lo pueda llamar a ejecución desde cualquier ubicación de mi sistema.