Haciendo hablar a Windows

Estándar

¿Que bonito es programar, no? El día de hoy les traigo una de esas cosas curiosas que podemos lograr con unas cuantas líneas de código, y que nos puede hacer quedar bien frente a nuestros amigos no tan geeks y fácilmente impresionables. Hoy les explicaré como hacer hablar a su computadora con Windows.

Tal vez parezca algo complicado, y quizá crean que terminarán escuchando una voz toda fea y robótica como las de los programas como Loquendo, pero si tienen un Windows más o menos actual obtendrán una voz bastante clara. Y lo mejor, no necesitamos descargar nada, solo necesitamos el Bloc de Notas y escribir 4 líneas de código. Sí, leyeron bien CUATRO LÍNEAS.

Es tan fácil como abrir el Bloc de notas y copiar las siguientes líneas:

Dim Mensaje, Habla
Mensaje=InputBox("Ingresa texto","Habla")
Set Habla=CreateObject("sapi.spvoice")
Habla.Speak Mensaje

Lo guardamos con el nombre que queramos con la extensión VBS, por ejemplo “habla.vbs”. Ahora simplemente daremos doble clic en el archivo que creamos, nos debe aparecer un mensaje similar al siguiente:

speak

El resto es bastante simple, escribimos el texto que queramos que diga y pulsamos aceptar. Ahora podrán hacer hablar a su computadora cuando quieran.

Ojalá que lo hayan disfrutado. Les deseo, felices trazos.

App Android: Menú Semanal

Estándar

Hace rato que no escribía en el blog sobre temas que no sean el podcast o fotografía, y parte de eso es por que la gran mayoría de los temas sobre los que me gustaría escribir se me olvidan o una vez terminado considero que serían mejor para un podcast. En fin, soy todo un caso…

Si me conocen seguramente ya saben las siguientes cuatro cosas: Vivo solo, soy algo perezoso, me encanta cocinar y mi vida es programar software. Pues bien, cuando uno vive solo no hay nadie que le haga de comer y comprar comida todos los días puede resultar bastante costoso cuando comes en proporciones mayores a las de una persona normal (#forevergordito). Así que como es obvio, uno mismo tiene que preparar su alimento, cuando eres como yo que te gusta cocinar el problema no es prepararlo, sino decidir qué preparar. Ahora, el problema aumenta cuando trabajas todo el día y tienes que hacer las compras para toda la semana durante el fin de semana. Es por eso que desarrollé esta aplicación, para facilitar el proceso de decisión.

Utilizarla es bastante sencillo, simplemente agregas al listado de platillos todos los que sabes preparar, así nunca te sugerirá nada que no sepas como cocinar — aunque por si las dudas ya incluye 7 platillos genéricos que pueden quitar o cambiar si así lo desean –. Una vez con la lista de platillos terminada puedes ir generando tantos menús como desees, si eres muy riguroso puedes tomarlo como menús fijos y puedes estar seguro de que no repetirás platillos hasta que la lista se termine, por lo que entre mas platillos tengas en la lista mas tardarás en volver a comer lo mismo. O puedes en lugar de platillos colocar lugares donde comer si también te parece una dificil decisión, por ejemplo desde el puesto de garnachas de la esquina hasta el restaurante de moda entre tus amigo. Obviamente solo te genera recomendaciones que puedes seguir religiosamente, o como yo, simplemente tomarlo como ideas para la semana y decidir en base a ellas. Les dejo unas capturas de la app, pueden dar clic en ellas para verlas en todo su esplendor:

Para instalarla solo tienen que habilitar la instalación desde fuentes desconocidas, descargar el APK en su teléfono, y ejecutarlo. Y claro pueden mandarme sus sugerencias sobre la misma.

¿Por qué hacer la App?

Esta es la primer aplicación funcional que termino fuera de las que hago para probar cosas nuevas o de las que programo para el trabajo, por lo que personalmente fue un reto interesante. La idea surgió de un script que programe al poco tiempo de llegar a la casa en que vivo actualmente, dicho script está escrito en Python y realiza la misma tarea tomando los platillos desde un archivo de texto. Esta curiosa forma de elegir cada semana mi menú, y en base a eso hacer las compras, llamó la atención de mi madre y se la comentó algunos familiares. La sorpresa fue que la respuesta de muchos fue: “ojala yo tuviera algo así” o “a mi hija le ayudaría mucho”. Lo más facil habría sido enviarles el script y asunto arreglado, pero muchos de ellos son personas completamente ajenas al mundo tecnológico así que la opción más obvia era hacerlo fácil para ellos. Así que me decidí a generar una aplicación para celular.

Retos al programarla

Cuando empecé este proyecto todo lo que había hecho era programar aplicaciones simples que mostraran una acción sencilla con un botón. El primer reto con el que me encontré era la lista de platillos, como ya comenté originalmente yo los tomaba de un archivo txt y una vez usado los enviaba a otro, sin embargo en Android eso era demasiado rebuscado, así que decidí implementar una pequeña base de datos con una sola tabla en la que tenía el platillo y su estatus (usado o sin usar).

Una vez que comprendí como generar la base de datos usando SQLite y como controlar los mismos solo me tuve que preocupar por la presentación de la misma. Y este aprendizaje terminó ayudándome para desarrollar posteriormente una aplicación más compleja usando bases de datos en el trabajo.

Otro aspecto que me dio algunos problemas fue la forma de elegir los platillos, originalmente pensaba obtener de la base de datos todos los platillos que no habían sido utilizados, ponerlos en un arreglo y seleccionar 5 de forma aleatoria, ponerlos en otro arreglo, mostrarlos en la app y actualizar su estatus en la base de datos a usado. Sin embargo la pereza me llevó a descubrir que podía obtener los 5 platillos de forma aleatoria directamente desde la base de datos y usando el mismo resultado actualizar el estatus de los mismos. Solo tenía que ejecutar una busqueda similar a la siguiente:

SELECT * FROM table ORDER BY RANDOM() LIMIT 5;

Con esta app aprendí bastante sobre el manejo de bases de datos en Android, las características de los ArrayAdapters, así como de los diferentes usos que podemos darle a los ListViews. Me llevó cerca de dos semanas programarla por ratos durante la tarde, pero aprendí mucho en el proceso. Y como creo que ya los aburrí lo dejo hasta ahí. Si alguien tiene una duda de como funciona o quiere saber más al respecto con gusto recibo sus preguntas y trataré de contestarlas lo mejor posible.

Salu2 a todos.

A 30 años del Manifiesto Hacker

Hacking Culture Bootcamp @ Waag Society
Estándar

El día de hoy se cumplen 30 años del Manifiesto Hacker, fue escrito por Loyd Blankenship — un hacker conocido como The Mentor — el 08 de enero de 1986 poco tiempo después de ser arrestado para ser publicado en la revista digital Phrack Magazine y en este breve ensayo plasma lo que muchos que estamos metidos en esto hemos sentido a lo largo de nuestra vida y continua bastante actual a la fecha. La presente es mi traducción del mismo, traté de hacerla lo más fiel a la original.

The Conscience of a Hacker (La Consciencia de un Hacker)

Otro ha sido capturado hoy, está en todos los periódicos. “Adolescente arrestado en escándalo de crimen por computadora”, “Hacker arrestado después de infiltrarse en un banco”…

“Malditos niños. Todos son iguales.”

¿Pero usted, en su psicología de tres piezas y mente tecnológica de 1950, alguna vez ha mirado detrás de los ojos de un hacker? ¿Alguna vez se ha preguntado qué lo motiva, que fuerzas lo formaron, cómo ha sido moldeado?

Yo soy un hacker, entra en mi mundo…

El mío es un mundo que comienza en la escuela… Soy más listo que los otros niños, la basura que nos enseñan me aburre…

“Maldito mediocre. Todos son iguales.”

Estoy en la secundaria o preparatoria. He escuchado a los maestros explicar por quinceava vez como reducir una fracción. Lo entiendo. “No, Srta. Smith, no le mostraré mi trabajo. Lo hice en mi cabeza…”

“Maldito niño. Probablemente lo copió. Todos son iguales.”

Hoy hice un descubrimiento. Encontré una computadora. Espera un segundo, esto es genial. Hace lo que yo quiero. Y si comete un error, es por que yo la he cagado. No porque no le agrado… O se sienta amenazada por mi… O piense que soy un engreído.. O porque no le guste enseñar y no debería estar aquí…

“Maldito niño. Todo lo que hace es estar jugando. Todos son iguales.”

Y entonces sucedió… se abrió una puerta a un mundo… corriendo a través de la línea telefónica como heroína por las venas de un adicto, un pulso electrónico es enviado, un refugio de la incompetencia del día a día es buscado… una tabla es hallada.

“Esto es… aquí es a donde pertenezco…”

Conozco a todos aquí… incluso si nunca los he visto, si nunca les he hablado, o quizá nunca vuelvo a oír de ellos… Los conozco a todos…

“Maldito niño. Ocupando otra vez la línea de teléfono. Todos son iguales.”

Puedes apostar a que todos somos iguales… a todos nos han dado cucharadas de alimento para bebés en la escuela mientras estábamos hambrientos de filete… los pedazos de carne que dejaron pasar estaban pre-masticados e insípidos. Fuimos dominados por sádicos, o ignorados por apáticos. Los pocos que tuvieron algo que enseñarnos encontraron en nosotros alumnos deseosos, pero esos poco son como gotas de agua en el desierto.

Este es ahora nuestro mundo… el mundo del electrón y el interruptor, la belleza del baudio. Hacemos uso de un servicio ya existente sin pagar lo que podría ser muy barato si no fuera administrado por glotones avaros, y nos llaman criminales. Exploramos… y nos llaman criminales. Buscamos conocimiento… y nos llaman criminales. Existimos sin color de piel, sin nacionalidad, sin creencias religiosas… y nos llaman criminales. Ustedes construyen bombas atómicas, patrocinan guerras, asesinan, engañan y nos mienten y tratan de hacernos creer que es por nuestro propio bien, aún así nosotros somos los criminales.

Sí, soy un criminal. Mi crimen es la curiosidad. Mi crimen es juzgar a las personas por lo que dicen y piensan, y no por como lucen. Mi crimen es ser más listo que ustedes, algo que nunca me perdonarán.

Soy un hacker, y este es mi manifiesto. Podrán detener a este individuo, pero no pueden detenernos a todos… después de todo, todos somos iguales.

Foto: Hacking Culture Bootcamp @ Waag Society (Sebastiaan ter Burg)

Cifrado Atbash en Python

Estándar

Algo que muy pocos saben es que soy un aficionado a todo tipo de puzzles, entre ellos obviamente a los mensajes cifrados o en código. Actualmente estoy trabajando en un proyecto personal que los involucra y del cual espero darles noticias más concretas muy pronto. Este proyecto quise empezarlo con algo bastante sencillo, en este caso el cifrado Atbash.

Atbash es un método muy común de cifrado del alfabeto hebreo. Pertenece a la llamada criptografía clásica y es un tipo de cifrado por sustitución. Se le denomina también método de espejo, pues consiste en sustituir la primera letra (álef) por la última (tav), la segunda (bet) por la penúltima (shin) y así sucesivamente. Por tanto en castellano la A será sustituida por la Z, la B por la Y, etc.

Como pueden ver es un método de cifrado muy sencillo, así que veamos el código para conseguirlo. Lo interesante es que por las características de este método el mismo script puede tanto cifrar como descifrar mensajes.

def atbash(message):
    alphabet = u'A B C D E F G H I J K L M N Ñ O P Q R S T U V W X Y Z a b c d e f g h i j k l m n ñ o p q r s t u v w x y z 0 1 2 3 4 5 6 7 8 9'.split()
    backward = u'Z Y X W V U T S R Q P O Ñ N M L K J I H G F E D C B A z y x w v u t s r q p o ñ n m l k j i h g f e d c b a 9 8 7 6 5 4 3 2 1 0'.split()
    cipher = []
    
    for letter in message:
        if letter in alphabet:
            for i in xrange(len(alphabet)):
                if alphabet[i] == letter:
                    pos = i
            cipher.append(backward[pos])
        else:
            cipher.append(letter)
    
    newMessage = ''.join(cipher)
    return newMessage

crypt = atbash(u'Hola Mundo')
print crypt

Trataré de explicar el código de forma simple. Primero definimos la función a la cual enviaremos el mensaje, dentro de esta creamos un par de listas con el alfabeto (mayúsculas y minúsculas) y números en orden normal e inverso. También creamos una tercer lista donde iremos almacenando las letras conforme las vayamos cambiando.

Después, por cada letra en el mensaje verificamos si la letra se encuentra en nuestra lista del alfabeto. Posteriormente revisamos la lista y comparamos los elementos para determinar en qué posición de la lista se encuentra y agregamos a nuestra lista cifrada la letra correspondiente del alfabeto inverso. En el caso de que la letra no se encontrara en ninguna de nuestras listas, como es el caso de los espacios y signos de puntuación los agrega sin cambios a nuestra lista cifrada.

Terminamos la función uniendo la lista cifrada en una sola cadena de texto, la almacenamos en una variable que devolveremos. Como ven es bastante simple de entender y un buen ejercicio para los que apenas se están iniciando en la programación python.

Sin más que agregar solo me queda decirles lo siguiente: Vhkvil jfv hv wrervigzn vnerznwl ñvhzqvh hvxivglh fhznwl vhgv hxirkg. Zwróh

[Python] Comparar elementos en dos listas distintas

Estándar

Hace un par de semanas me solicitaron en el trabajo revisar si contábamos o no en el servidor con fotografías de todos los productos, las fotografías se encontraban en una carpeta especifica y tienen por nombre el código interno del producto, a simple vista parece una tarea relativamente sencilla, solo hacía falta buscar el código de cada producto en el directorio de las fotos, pero contamos con cerca de 15 mil códigos registrados y revisar de uno en uno manualmente habría llevado una eternidad, así que opté por automatizar la revisión.

Continuar leyendo

Script Batch para generar respaldos automáticos

Estándar

Tener un respaldo de nuestra información, ya sea personal o laboral siempre es importante, nunca sabemos a ciencia cierta cuando algo puede fallar o se puede presentar algun problema. Es por ello que un backup será nuestro mejor aliado ante las dificultades.

Pero seamos sinceros, muchos de los programas de backup o respaldo tienen demasiadas características que podrán ser ideales para entornos empresariales o corporativos bastante grandes, pero en aspectos más bien personales, de negocio o empresa pequeña no son necesarias, es por ello que escribí este sencillo script que me solucinó el problema principal al que me enfrenté en el trabajo.

Continuar leyendo