Python 2-3 Booleanos

Python 2

Los booleanos son probablemente el tipo de dato mas fácil de entender. Ya que solamente pueden tener 2 estados True (verdadero) y False (falso). No existen mas estados mas que esos 2.

Operaciones boolenas

Lo mismo, las operaciones booleanas son bastante sencillas. De hecho solo existen 3 operaciones con booleanos: AND, OR y NOT.

AND

True True True
True False False
False True False
False False False

OR

True True True
True False True
False True True
False False False

NOT

True False
False True

Errores comunes en Python 2

Cuando uno programa hace cierto tipo de suposiciones, por ejemplo tal vez seria perfectamente valido asumir que True y False, son palabras reservadas del lenguaje o que al menos en el caso de actuar como variables que su valor no se pueda modificar. Bueno, en Python 2 NO.

Podemos tener código como el siguiente:

True, False = False, True

Y funcionara perfectamente. Entonces recuerden tener cuidado y no asignarle otros valores a True o False.

Python 3

En Python 3, arreglaron ese pequeño problema. Y ahora True y False son palabras reservadas del lenguaje.

 

Python 2-3 Enteros

En Python 2

32 vs 64 bits

Como ustedes ya saben, 64 bits no solo implica que nuestro procesador puede direccionar mas de 2³² registros de memoria, si no que ademas puede procesar hasta 64 bits en un solo ciclo de CPU. Lo cual significa que podemos usar enteros mas largos con menos costo computacional.

Python 2, tiene precisión arbitraria al trabajar con enteros. Lo que significa que no esta limitado a los 32 o 64 bits que los lenguajes de programación tradicionales están atados.

Pero el rendimiento también es importante, por eso es que Python 2 aplica reglas muy sencillas para obtener una optimización. Por ejemplo, supón que quieres representar el numero 99, Python 2 se dará cuenta que este numero cabe perfectamente dentro de 32 bits y simplemente usara internamente un entero de 32 bits. Si tu versión de python es de 64 bits usara un entero de 64 bits.

Pero ¿que pasa una vez que quiero representar un numero mas grande de lo que puede caber en un entero de 64 bits? Lo que hace Python 2 es promover ese entero a otro tipo de dato llamado Long, donde puede representar de cualquier tamaño, pero a costo de mas ciclos de CPU.

Operaciones Aritméticas

Python 2 tiene la variedad justa de operadores para hacer operaciones aritméticas.

Lista de operadores por orden de precedencia:

  • Suma: x + y
  • Resta: x – y
  • Multiplicación: x * y
  • División entera (si y solo si x & y son enteros): x / y
  • División entera: x // y
  • Modulo: x % y
  • Negativo: -x
  • Sin cambio alguno: +x
  • Potencia: x ** y

Existen también, funciones para enteros que vale la pena ser mencionadas:

  • abs (valor absoluto de un entero): abs(x)
  • divmod: divmod(x, y) es igual que (x // y, x % y)
  • pow: pow(x, y) es igual que x ** y

Para el lector perspicaz, se dará cuenta que tal vez no exista la necesidad de una función pow si ya tiene el operador **. Pero existe un secreto en pow y es que pow puede aceptar un tercer argumento, si el tercer argumento es dado se puede crear la siguiente expresión: (x ** y) % z la diferencia es que si ustedes intentan hacerlo con el operador ** se darán cuenta que es mas lento hacer (2 ** 4294967296) % 2 que hacer pow(2, 4294967296, 2).

Cada operador tiene un orden de precedencia, así que tienen que tener cuidado. Por que expresiones como -2 ** 2 podrías esperar como resultado 4 cuando en realidad regresa -4, por el orden de precedencia de los operadores.

Comparaciones

Lista de operadores para comparar enteros, ordenados por precedencia.

  • ¿x es menor a y?: x < y
  • ¿x es menor o igual a y?: x <= y
  • ¿x es mayor a y?: x > y
  • ¿x es mayor o igual a y?: x >= y
  • ¿x es igual a y?: x == y
  • ¿x es diferente a y?: x != y
  • ¿x es el mismo objeto que y?: x is y
  • ¿x es diferente objeto que y?: x is not y

Si utilizamos cuidadosamente los operadores podemos hacer cosas como:

  • ¿x esta entre a y b?: a < x < b
  • ¿x esta entre a y b inclusive?: a <= x <= b

También pueden usar el operador != como <> pero este operador no esta soportado en python 3, entonces no lo usen.

Operaciones a Nivel de bit

  • OR a nivel de bits: x | y
  • XOR a nivel de bits: x ^ y
  • AND a nivel de bits: x & y
  • Desplazar x, n bits a la izquierda: x << n
  • Desplazar x, n bits a la derecha: x >> n
  • Negar todos los bits: ~x

Al desplazar bits, n no puede ser negativo, ya que arrojara una excepción ValueError.

Integer Pool

Python 2 tiene un piscina de enteros, esto es con el propósito de no volver a crear el entero y y usar mas memoria. Y funciona muy bien, pero el rango es limitado usualmente de -5 a 256.

¿Por que es importante mencionar esto? Para que no usen el operador is, como sustituto del operador ==. Porque pueden tener malas experiencias.

Literales

Hexadecimal

Un numero literal en hexadecimal empieza con 0x, por ejemplo 255 sería 0xFF, noten que pueden usar mayúsculas o minúsculas. Y también pueden utilizar el signo de menos. -0xFF seria -255.

Octal

El prefijo para octal es empezar el numero con 0. Así que si planean escribir 08 y esperar 8, les tengo una mala noticia. Y al igual que decimal y hexadecimal pueden usar el signo de menos. -013 seria -11.

Decimal

En python pueden expresar su numero decimal como normalmente lo harían. Y no, no existen separadores de miles. Aunque pueden añadir una L al final de su entero para indicar que es entero long.

En Python 3

Los enteros en Python 3, trabajan ligeramente diferente si lo comparamos con python 2.

La diferencia mas notable es que en python 3 no existe los enteros Long. Ahora todos los enteros son del tipo Long de python 2, pero con el nombre de int. Quitando esa optimización de 32 y 64 bits.

Otra diferencia es que ahora la división x / y regresa un flotante no importa si x & y son enteros.

Y con la adición de algunos métodos extras, los enteros no cambian mucho en python 3.

Introducción a Python

¿Python 2 o Python 3?

En este punto python 3 esta ganando aceptación en numerosos proyectos, pero aun ahí una gran cantidad de proyectos que aun no han migrado a python 2 y probablemente muchos no lo hagan. Así que si no estas seguro con que versión empezar te recomiendo antes investigar si el framework o la librería esta disponible para python 2 o python 3 y elegir la que tenga soporte.

¿32bits o 64bits?

Depende completamente de tu sistema operativo, si tu sistema operativo soporta 64 bits adelante usa python de 64 bits. Si tu sistema operativo no soporta 32 bits.

Recursos para aprender

En español, existen libros, tutoriales, videotutoriales, listas de correos y foros con excelente material. En Inglés hay inclusive mas y mejores recursos. Pero solo para el lenguaje en si. Si, ustedes tratan de buscar información sobre alguna librería o framework en particular en español el material es escaso o muchas veces nulo. En Inglés, siempre hay buen material para aprender pero como dije antes, depende mucho de la librería y la comunidad entorno a esta.

Errores comunes en Windows

A comparación de las distrubuciones Linux mas populares, Mac OS X y cualquier otro *nix robusto. Python esta instalado por defecto, haciendo que elecciones como `32 vs 64 bits` o `python 2 vs 3` sean triviales. Pero no en Windows.

En windows debes de elegir eso por ti mismo y no conforme con eso, hay operaciones adicionales que debes de realizar. Por ejemplo añadir python a tu path.

Pero esto no es nada, porque la mayor desventaja de usar python en windows es la siguiente: Si planeas usar librerías que usen C ó C++ para mejorar el rendimiento, librerías tales como “numpy, mysql, postgresql, wx, qt, gtk, pillow, opencv, lxml” entre otro ciento de librerías vas a necesitar un compilador de C ó C++ con las respectivas librerías que necesites vincular a la hora de compilar. Afortunadamente existe paginas donde te puedes ahorrar todo ese proceso y encontrar esas librerías en forma de .exe donde con un doble click serán instaladas.

Excepto si quieres mantener un virtualenv, en cuyo caso tendrás que hacer o ejecutar un script para el lugar de instalación de esas librerías apunte al virtualenv y no te la instale en el sistema como por defecto lo hacen.

Editores de texto e IDEs

Muchas personas llegan y me preguntan, ¿Cual es el mejor IDE o editor de texto para trabajar con Python? mi respuesta siempre es la misma.

No creo que exista tal como “el mejor IDE o editor de texto” de ser así todos lo estaríamos usando. Mas bien, depende de ti. Hay personas que se sienten comodas trabajando con algun editor de texto en consola, mientras que otros necesitan de ventanitas que tarden mil años en cargar con un centenar de colores diferentes para resaltar su código.

Mi mejor estrategia aquí es probar, prueba tantos editores de texto (o IDEs) como sea necesarios hasta que encuentres alguno donde te sientas satisfecho.

Acerca de aplicaciones para escritorio

Algunos de ustedes viene de ambientes como .NET o Java, donde generar las interfaces de las aplicaciones de escritorio es relativamente fácil, porque tienen hermosas herramientas que hacen trabajo por ustedes.

En Python también tenemos herramientas para eso. Pero a comparación de .NET o Java, no siempre son tan bonitas y casi ninguna herramienta tiene integración con ningún IDE. A comparación de .NET donde después de esperar unos cuantos minutos a cargar mi proyecto puedo crear botones con un solo click.

Pero como siempre depende de que framework uses son las herramientas que tendrás disponibles para realizar X o Y tarea. Y esto no sera gratis, si no siempre es a costa de alguna otra característica que solo tiene otro framework.

Algunos de los frameworks mas notables para crear interfaces gráficas en Python son:

  1. PyQT
  2. GTK
  3. wx
  4. Tkinter

Acerca de aplicaciones web

Muchos usuarios que empiezan a aprender el lenguaje es porque quieren desarrollar sitios webs. Y regularmente estos usuarios son los que mas problemas tienen por 2 cosas.

1. Quieren empezar a construir la casa por el techo

Esto es increíblemente doloroso, porque a comparación de los usuarios que aprenden a desarrollar aplicaciones de escritorio, les importa y les interesa como funciona el lenguaje, incluso no les molesta pasar 1 o 2 semanas en la consola aprendiendo el lenguaje. Mientras que los inician con desarrollo web quieren ver resultados en 30 minutos o menos. No importa que tan sucias practicas usen.

En parte culpo a PHP, por darle a esos usuarios no solamente las peores practicas a la hora de programar, si no que ademas con un simple XAMP o WAMP (un stack con Apache+MySQL+PHP), ya tienes un entorno de producción listo para ser puesto en vivo, haciendo que el usuario se sienta como todo un profesional del desarrollo web. (Si te sentiste identificado, lamento darte las malas noticias.)

Así que si planeas aprender Python con el firme propósito de desarrollar aplicaciones web, te recomiendo primero aprender Python y no esperar ver resultados tan inmediatamente como en PHP.

Y si tu único lenguaje es el español tengo malas noticias para ti. Ya que hasta la fecha, no hay tutoriales, libros u otros recursos que valgan la pena. En cambio en ingles es completamente diferente donde si existe recursos actualizados y de calidad.

2. Estos usuarios los mas renuentes a cambios

Si un usuario viene de PHP y le explicas que tiene que utilizar un webframework para hacer una pagina web. ¡Dios mio! Buscara hasta debajo de las piedras para evitarlo. Pero eso es absolutamente nada porque lo que sigue se pone aun peor.

Sin mas remedio finalmente se rinde y empieza a usar un webframework, para lo cual se dio cuenta que realmente no era mucho trabajo instalar. Todo empieza perfecto excepto que aun quiere hacer las cosas estilo PHP preguntando cosas como:

  • ¿Como hago un `select * from table`? (Así es un raw query, porque no se molestan en revisar el ORM).
  • ¿Como configuro mi apache con mi webframework? (WTF!!! este usuario no ha empezado, ni a escribir una sola linea de código y ya quiere montar un ambiente de producción).
  • O empiezan a implementar validaciones *simples* una y otra vez en lugar de usar las herramientas estándar.

Acerca de aplicaciones móviles

Por mas épico que suene, python las aplicaciones móviles no se llevan muy bien. Si, existen frameworks y herramientas para desarrollar aplicaciones móviles como KivySL4A. Y también existen aplicaciones en la Play Store que usan esas herramientas. Pero cuando empieza a probar esas herramientas se da cuenta que no es lo que uno espera.

Y es completamente lógico, porque Python tiene 2 principales desventajas en el mundo móvil.

La primera es que Python requiere de muchos ciclos de CPU para hacer X o Y tarea, esto en un PC, laptop o servidores no es ningún problema. Pero dispositivos móviles donde menos uso de CPU significa una mejor autonomía (o vida y duración de la batería). Python no es lo mejor para ese tipo de entornos.

El segundo punto es que las grandes compañías (Google y Apple) encargadas de mantener los SDK, el sistema operativo y toda la comunidad, simplemente no le meterán mas dinero solo un pequeño grupo de personas quiera programar en Python. E incluso, si decidieran darle soporte a Python, tener que mantener 2 SDK escritos en lenguajes completamente diferentes sería una pesadilla. (Proyectos como Parrot VM o .NET han tratado de resolver ese problema de 1 librería a N lenguajes).

Migrando de PHP a Python (Rant)

Como usuario intensivo de Python, este ultimo mes he visto una gran cantidad de usuarios de PHP queriéndose pasar a Python y mas específicamente a Django.

Lo cual es genial, porque eso significa que la comunidad sera mas grande y por lo tanto mas prospera. O al menos eso fue lo que pensé. Hasta que me di cuenta que muchas de esas personas querían seguir usando Python como si fuera PHP. Haciendo preguntas como:

  • ¿Cómo ejecuto mi script de Python en apache?
  • ¿Cómo ejecuto un script dentro de otro script? (Algo estilo include de PHP)
  • ¿Cómo hago un goto en Python? (WTF!)
  • ¿Que shared hosting es mejor para mi Python? (Si leyeron bien shared hosting)

Y la lista es interminable, como que si no tienen Apache+MySQL+Python no empezarían a desarrollar nada. Y para colmo todos esos usuarios usan windows lo cual dificulta muchas cosas.

Tal vez ustedes se preguntaran, ¿Pero que tiene de malo, si solo son preguntas? y es que aquí viene la peor parte. Esas personas están tan arraigadas a sus costumbres PHPeras que no pueden pensar de otra forma. Ignorando respuestas serias o de verdad y tratando de revivir algo de ese PHP en Python. O peor aun, haciendo que la comunidad actual de Python los ignore por completo.

Mi recomendación para los que quieran aprender Python o cualquier otro lenguaje de programación y ya saben PHP, es no traten de hacer las cosas como en PHP porque van a sufrir.

¿Microsoft se esta suicidando?

Hay un par de señales por las que creo que últimamente Microsoft tal vez esta planeando suicidarse.

Windows 8

Quito el botón de inicio probablemente la peor decision que tomo en Windows 8

La peor experiencia de usuario, con la interfaz metro la cual si no tienes un touch screen entonces estas jodido.

Windows Phone

Desarrollar de aplicaciones para Windows Phone no es dificil a un nivel tecnico pero si a nivel monetario ya que necesitas las herramientas y licencias que todo eso implica. Ok tal vez existan cosas como PhoneGap donde te ahorres pagar por ciertas herramientas para desarrollar pero si quieres publicar tu app en su marketplace necesitas licencia de desarrollador.

Sincronizacion con una cuenta. Si alguien ha usado alguna vez windows phone se dará cuenta que una vez asociada tu cuenta de hotmail (ahora outlook) hará una sincronización automática de tus contactos de hotmail y tu celular. Otro aspecto importante es que una vez hecha sincronización no te dejara guardar contactos solamente en la sim card o en la memoria del teléfono si no que a fuerza serán añadidos a tus contactos en la nube.

Surface

Salio muy tarde, para cuando sacaron la Surface ya habían un montón de tablets en el mercado y otra mas no iba a hacer la diferencia.

Windows RT, Se ve como windows, actua como windows pero hey no puedo correr mis (.exe) ejecutables aquí porque es una arquitectura diferente. WTF ¿No puedo instalar mas apps solamente del marketplace?

Espacio limitado, saben que decidí comprar la versión mas completa de la surface, que trae un procesador Intel, Windows 8 Pro y un SSD, pero que es esto el puro sistema operativo consume demasiado espacio. Si incluso hay habido demandas por eso.

Xbox One

El peor modelo de negocios para los videos juegos. Ok afrontemoslo nunca seras dueño de tus juegos como lo seras como PlayStation o Nintendo.

Necesita Internet cada 24hrs. Un pequeño resumen de lo que paso:
Microsoft: Necesitara Internet al menos cada 24hrs para que puedas jugar.
Internet: ¿No tienes otra opción?
Microsoft: Si tenemos la Xbox 360.
Internet: Ok, no te compraremos nada. Nos cambiamos a PS4
Microsoft: I don’t give a shit.
*7 días después de una campaña furiosa contra el Xbox One*
Microsoft: Ok, Internet tu ganas, quitaremos esa restricción.

El Xbox One es mas caro que la PS4 y todavía ponen estas ridículas restricciones. ¿Enserio?

Microsoft

Reestructuración, si alguien ha leído las ultimas noticias esto no pinta nada bien.

No todo es malo

IE 10 en adelante ahora ya no apesta tan duro. Y de hecho lo considero como un buen navegador lastima que no este disponible para plataformas como Linux.

¿Como programar de manera profesional?

Lo primero que hace uno es conocer el lenguaje (o varios lenguajes). Estructuras de datos, estructuras de control de flujo, ciclos, macros, structs, unions, enums, punteros, macros, clases, templates, arreglos y todo lo que pueda ofrecer el lenguaje regularmente nada del otro mundo.

Después de conocer el lenguaje y si el lenguaje te lo permite exploras un poco sobre POO (Programación Orientada a Objetos) esto es una vez que ya tienes entendidos los conceptos de clase, objeto, instancia, herencia, polimorfismo, delegación, encapsulamiento, abstracción, Los pones en practica y ves como puedes simplificar tus programas haciendo uso de este paradigma.

Te das cuenta que muchos de las cosas que quieres implementar ya están hechas en otras librerías o frameworks así que empiezas a aprender a usarlas. Después de todo no hay que reinventar la rueda. Por ejemplo frameworks completos para trabajar con: Interfaces gráficas, fechas, expresiones regulares, sockets, threads, base de datos, motores de física de vídeo juegos, generación de reportes y otro montón de librerías que resuelven problemas que ni siquiera te habías planteado.

Una ves que hayas explorado POO y que hayas aprendido usar un par de librerías/frameworks te vas a dar cuenta que existen patrones de diseños para la mayoría de los problemas que enfrentas y ademas que muchas de las librerías/frameworks hacen uso de estos patrones de diseño. Entonces empiezas a hacer uso de estos patrones para implementar tus propias librerías o proyectos enteros.

Muy simplificado, pero en cada paso te puedes tardar años en perfeccionarlo, el orden no esta garantizado y te aseguro que vas a tener que regresar a algún punto anterior. Probablemente haya mas puntos que se me hayan olvidado o incluso que aun no he visto. Pero por ahora es todo lo que puedo ofrecer.

Existen libros enteros dedicados solamente a enseñar un lenguaje, existen otro puñado de libros para aprender POO otro tanto para aprender a utilizar una sola librería o framework y muchos otros para aprender patrones de diseño. Pero todo esto no significa absolutamente nada si no practicas. La clave en llegar a ser bueno es practicar, practicar y practicar y nunca dejar de hacerlo.

Para finalizar esto es un ciclo que nunca termina :)

Programación Competitiva

¿Cual es la dinámica?

Mas o menos todos los sitios manejan la misma dinámica. Se plantea un problema, te dan un formato especifico de como vas a recibir los datos y te planean como debe de ser el formato de salida. Tu misión es crear un programa que reciba la entrada en el formato dado, que resuelva el problema y que imprimas la solución en el formato que te dieron. Para ponerlo mas interesante tienes limites de memoria, de tiempo de uso del CPU, de lenguajes que puedes usar, de librerías que puedes usar y en algunos casos como code golf el numero de caracteres del código.

Dejo un listado de los sitios a los que solía frecuentar para resolver retos de programación:

CheckIO

Es el sitio que últimamente mas había visitado para resolver un par de retos. Solamente están disponible los lenguajes Python 2.x y Python 3.x, hay muchos problemas interesantes, aunque la redacción de los problemas no es la mejor, ofrece buenos casos de prueba. El sitio trata de seguir una historia y la interfaz parece bastante a un vídeo juego.

http://www.checkio.org/
Visita mi perfil

Teddy ITC MX

En este sitio solamente resolví un uno o dos de problemas. Mas que nada me pareció interesante que lo promoviera una universidad me México.

http://teddy.itc.mx/index.php
Visita mi perfil

Project Euler

Una de las cosas que me gusta y que odio del sitio es que no esta limitado a un solo lenguaje, ni limitado a tiempo. Lo único que hacen es te plantean el problema, te ponen un pequeño ejemplo y después te piden un numero que generalmente es la solución a una instancia mas grande del problema planteado.

http://projecteuler.net/
razpeitia at project euler

UVA Judge Online

Esta pagina es la que mas solía frecuentar durante mi época de estudiante universitario. Tenían un conjunto de 4 poderosos lenguajes Pascal, C, C++ y Java. Los tiempos eran estrictos, las descripciones a veces eran un poco ambiguas, con el mismo propósito de guiar al programador a otro camino.

Uno de los trucos que mas me gustaba era que para proponer un problema sencillo aplicaban descripciones super complejas, con gráficos he incluso con alguna historia de fondo. Y los problemas mas difíciles muchas veces lo resumían a unas cuantas lineas.

http://uva.onlinejudge.org/
Mi perfil en uHunt

Sphere Online Judge

Este sitio es parecido a UVA Judge Online con la diferencia que el conjunto de lenguajes es mucho mas amplio y en algunos problemas lo interesante es resolverlo en un conjunto limitado de lenguajes. La comunidad como lo pueden ver es mas de Europa occidental.

Al igual que en Teddy ITC MX solamente hice 1 o 2 problemas.

http://www.spoj.com/

Code Chef

Sigue la misma dinámica que Sphere Online Judge, solamente que el diseño de la pagina es mas vistosa y la comunidad parece ser mas global.

Aquí resolví mas problemas que en Sphere Online Judge, pero igual no le di tanto seguimiento.

http://www.codechef.com/
Mi perfil en Code Chef

Code Jam

CodeJam es un concurso que hace Google todos los años, y uno de sus propósitos es reclutar e identificar a programadores con talento, pueden usar cualquier lenguaje y no hay limite de tiempo para correr el programa.

Aquí la única diferencia es que debes de subir un archivo de texto con las respuestas del archivo de texto de entrada para tu programa. Te dan dos instancia una pequeña y una grande.

La complejidad de los problemas suben mucho conforme vayas avanzando de ronda. Oh se me olvido mencionar hay una recompensa en efectivo para los primeros lugares sin mencionar el prestigio que otorga este tipo de concursos.

https://code.google.com/codejam

Top Coder

Este sitio es un poco diferente a todos los anteriores, lo único que cambia que es que son proyectos reales para empresas y solamente toman la mejor solución. Hay recompensa en efectivo si tu solución es aceptada pero no tengo idea de cuanto sea la cantidad.

http://www.topcoder.com/

SQL-EX

Esta pagina es mas para entrenamiento de SQL que como resolución de retos, aun así ofrece problemas muy interesantes a pesar de la descripción en ingles es algo rara.

http://sql-ex.ru/

Python Challenge

La dinámica de este sitio es mas que nada descifrar lo que quieren que hagas y resolver el acertijo. Avanzas poniendo el siguiente código o clave en la URL. Yo solamente llegue aproximadamente al problema 12-13.

http://www.pythonchallenge.com/

PySchools

Este sitio es mas aprender python, realmente no hay muchos retos aquí. Por eso resolví todo el sitio.

http://www.pyschools.com/

Algunas sugerencias:

  1. Leer acerca de algoritmos
  2. Practicar
  3. No quedarse en un solo problema, si no lo pueden resolver, guarden el problema, resuelvan otros problemas, vuelvan mas tarde y tal vez ahora sera mas fácil, si no repitan el ciclo.
  4. Practicar
  5. Buscar mas fuentes, donde aprender (Blogs, libros, revistas, web, foros, irc, etc…)
  6. Practicar
  7. Crear su propias librerías para tareas comunes
  8. Practicar
  9. Volver al punto 1

Historias (I)

A lo largo de los años como estudiante de Japones me he topado con un montón de historias típicas del folclor japones y otras no tanto.

Entre ellas las mas comunes como Hachiko y Yuki-Onna, otras menos comunes como Sadako Sasaki y Sada Abe y algunas otras que no son Japonesas pero que te dejan impactado.

Hachiko

En 1924, Hidesaburō Ueno, un profesor del departamento de agricultura en la Universidad de Tokyo, tomo a Hachiko, un Akita de color café-dorado, como mascota. Durante la vida de su dueño, Hachiko esperaba al final del día para saludar a su dueño cerca de la estación de Shibuya. La pareja continuo su rutina diaria hasta Mayo de 1925, cuando el profesor Ueno no regreso. El profesor había sufrido una hemorragia cerebral y murió, nunca regresando a la estación donde Hachiko estaba esperando. Cada día de los siguientes 9 años Hachiko espero el regreso de su dueño, apareciendo precisamente cuando el tren llegaba a la estación.

Versión en Inglés | Versión en Español

Yuki-Onna

Esta historia varia dependiendo de la región pero básicamente todos coinciden con la descripción de una mujer alta, muy blanca, de pelo largo y usualmente de labios azules debido al frió. La historia regularmente empieza con una aparición durante alguna tormenta de nieve, seguido del climax donde yuki-onna mata a algun(os) personajes o muere como consecuencia de algún acto de bondad y al final siempre desaparece.

Versión en Inglés | Versión en Español

Sadako Sasaki

Sadako Sasaki fue una niña Japonesa que tenia 2 años de edad cuando cayo la bomba atómica en Hiroshima, Japón. Como resultado de la radiación, años después, desarrollo leucemia, dejándola en el hospital. Un día su mejor amiga Chizuko Hamamoto fue a visitarla al hospital donde le entrego una pieza de papel dorado que después doblo en forma de grulla. En referencia a la historia zenbazuru donde los Dioses le concedían un deseo a quien lograra doblar mas de mil grullas. Existe 2 versiones de la historia una donde no consigue su meta y otra donde si la consigue.

Versión en Inglés | Versión en Español

Sada Abe

Esta historia es como la versión Japonesa del controversial caso John & Lorena Bobittis. Con algunos cambios.

Versión en Inglés | Versión en Español

Shin Dong Hyuk

El es la única persona de la que se sabe que ha escapado de la zona de total control en campos internos de Norcorea.

Versión en Inglés | Versión en Español (No disponible).

Librerías y Ejemplos Inútiles (I)

VaporJS y Vanilla-JS

Explicación: Realmente no son librerías, simplemente te dicen que uses JS plano.

Fuente: VaporJS, Vanilla JS

Semicolons

Explicación: Una librería para forzarte a usar semicolons en tu código js.

Fuente: Semicolons

fartscroll.js

Explicación: Otra sorprendente pieza de software, solamente escuchen ese sonido al bajar el scroll.

Fuente: FartScroll.js

Geo Bootstrap

Explicación: Un tema sublime, solamente apto para los desarrolladores web con el gusto mas refinado.

Fuente: http://divshot.github.io/geo-bootstrap/

3D Cube Form

Explicación: ¿Quieres darle una nueva experiencia a tus clientes llenando sus formularios? Por que no pruebas el demo.

Fuente: http://ux.stackexchange.com/questions/11229/is-this-rotating-cube-interface-user-friendly Demo

No hagas click

Explicación: Ejemplo programado con vanilla js, no hagas click en el link.

Fuente: http://home.hiwaay.net/~lkseitz/javascript/annoy.html

Cool Python (I)

Aquí dejo una lista de cool tricks que pueden usar para hacer su código mas pythonico.

1. Ustedes pueden limitar el numero de caracteres de un string cuando usan formateo de cadenas

my_string = 'Esta cadena es muy larga'
print 'Los primeros 10 caracteres: %.10s' % (my_string,)

2. Cadenas, listas, diccionarios, tuplas y set son falsas si están vacías y verdaderas de lo contrario

my_list = [1, 2, 3]
my_dict = {}

if my_list:
    print 'Lista no vacia', my_list
else:
    print 'Lista vacia', my_list

if my_dict:
    print 'Diccionario no vacio', my_dict
else:
    print 'Diccionario vacio', my_dict

3. Usen Counter para hacer una tabla de frecuencias

from collections import Counter

frec_list = [1, 1, 2, 1, 3, 3, 4, 5, 5, 1, 1, 1, 2, 1]
frec_table = Counter(frec_list)
# Counter({1: 7, 2: 2, 3: 2, 5: 2, 4: 1})

4. Usen sample para obtener n elementos aleatorios de una lista

from random import sample
name_list = ['Ricardo', 'Alejandro', 'Carlos', 'Eduardo', 'Alberto', 'Jose']
print sample(name_list, 3)
# ['Carlos', 'Alejandro', 'Ricardo']

5. Usen list comprehension para hacer un filtrado rápido

price_list = [300, 400, 350, 720, 500, 610, 780, 970, 10]
new_price_list = [price for price in price_list if price >= 500]
# [720, 500, 610, 780, 970]

6. Usen maketrans para tablas de traducción

from string import maketrans

src_table = "abc"
des_table = "xyz"
translation_table = maketrans(src_table, des_table)
src_text = 'abc abc'
des_text = src_text.translate(translation_table)

7. Usen argument unpacking

a, b = 1, 2
print a, b
# 1 2
a, b = b, a
print a, b
# 2 1
def calc_taxes_and_total(subtotal):
    taxes = subtotal * .16
    total = subtotal + taxes
    return (taxes, total)

subtotal = 100
taxes, total = calc_taxes_and_total(subtotal)
print taxes, total
# 116.0, 16.0

7. Usen chaining comparison operators para checar rangos

value = 31
if 0 <= value <= 100:
    print value, 'se encuentra entre 0 y 100 inclusive'

if 0 < value < 31:
    print value, 'se encuentra entre 0 y 31 exclusive'

8. Usen enumerate para enumerar sus listas

color_list = ['rojo', 'azul', 'verde', 'amarillo']
for index, color in enumerate(color_list):
    print index, color

9. Usen el método get de los diccionarios

Ejemplo sin get:

contact_dict = {'Raul': ['555-555'], 'Ricardo': ['555-515'], 'Rogelio': ['555-155']}
# ...
name = 'Roberto'
phone_number = '555-551'
if name not in contact_dict:
    contact_dict[name] = [phone_number]
else:
    contact_dict[name].append(phone_number)

Ejemplo con get:

contact_dict = {'Raul': ['555-555'], 'Ricardo': ['555-515'], 'Rogelio': ['555-155']}
# ...
name = 'Roberto'
phone_number = '555-551'
contact_dict[name] = contact_dict.get(name, []).append(phone_number)

10. Pueden usar diccionarios para formatear cadenas

taxes_dict = {'subtotal': 100, 'total': 116, 'taxes': 16}
print 'El subtotal es %(subtotal)d, los impuestos son %(taxes)d y el total es %(total)d' % taxes_dict