Mascotas

Cuando era niño, veía que familiares y vecinos tenían mascotas, pero yo no. La situación en la casa no permitía criarlas. Sin embargo, un buen día nos tocó que mi tía, quien tenía una bonita perra raza maltés, nos regalar uno de los perritos que acababan de nacer. ¿Mascota? ¿Gratis? ¿De un familiar? En la casa no tenían pretexto para decir que no.

Fue así como me hice de mi primer (y único) perro: Scrappy. Sip, veía Scooby Doo en ese entonces y tenía como 5-6 años. Era obvio que lo nombraría como algo que me gustara en ese momento.

Para mí, era el principio de una etapa: tener mascota. Sin embargo, para Scrappy fue, sinceramente, el principio del infierno., y nunca me he sentido orgulloso de decir eso.

A grandes rasgos: nadie me enseñó cómo se tenía que criar un perro. Era mi responsabilidad, sí, pero sin una guía que me dijera lo que estaba bien y mal, hice las cosas como mejor pude o intuí. ¿El resultado? Scrappy rara vez salió del patio trasero de la casa. Como no estaba acostumbrado a salir, cuando veía la puerta abierta corría hacia la calle como si el mundo se fuera a terminar en ese momento, y atraparlo y traerlo de regreso era cada vez una tarea más difícil.

Claro que jugaba con él en el patio, y era mi compañero inseparable cuando había que “exterminar” a algún roedor que hubiera entrado a la casa. Pero de sacarlo, nada.

Rara vez lo bañaba, por lo que el pelo se le comenzó a convertir en bolas que se hicieron difíciles de cortar, y en las pocas veces en las que llegaba a bañarlo no puedo describir el olor que despedía.

Era mi perro, mi compañero, y yo, sin saberlo, lo hice sufrir prácticamente toda su vida.

Scrappy me acompañó en mi camino durante 13 años. Todavía recuerdo el día que mi papá se lo llevó: tenía días que casi no se movía y ya casi no comía; tardaba en voltear cuando lo llamaba. Se notaba cansado, pero muy tranquilo. Mi mamá se dio cuenta, habló con mi papá, y él se lo llevó. ¿A dónde? Nunca lo supe, y sinceramente no tengo el valor de preguntar.

Fui un mal dueño, pero su partida me dolió tanto que desde ese día hasta la fecha nunca he tenido ninguna otra mascota. Las otras que llegaron a la casa cortesía de mi hermana (que en pocas palabras es Elmyra, de los Tiny Toons, porque tiene mascotas pero nunca las cuida) yo terminaba atendiéndolas, quizá como forma de reparar el daño que le causé a Scrappy. Desde tortugas hasta pájaros, cada semana era una nueva mascota en la casa traída (sin permiso) por mi hermana, y todos menos ella teníamos que hacernos cargo de ellas.

¿Que si me gustaría tener otro perro? Sí, algún día, cuando esté seguro que puedo tratarlo al menos la mitad de bien de lo que hubiera querido tratar a Scrappy.

¿A qué voy con todo esto? A que muchas veces se nos olvida que las mascotas son seres vivos, y que como dueños tenemos una responsabilidad con ellos. No serán humanos, pero sienten, y quieran o no, están ahí para apoyarnos,

En Japón, la situación de las mascotas, especialmente perros y gatos, es preocupante precisamente por la falta de sentimientos de los dueños; algunos incluso consideran a los perros de igual forma que una bolsa de Louis Vuitton: sólo para darles estatus social.

Continue reading “Mascotas”

Implementando PageRank

Tuve oportunidad de leer este artículo técnico de Stanford, titulado “Searching the Web”:

 http://ilpubs.stanford.edu:8090/457/

Básicamente, es una explicación de cómo funcionan las búsquedas en internet; muestra lo que era el state-of-the-art en ese tópico, incluyendo el algoritmo que fue el comienzo de Google: PageRank.

Existen muchas páginas que describen en detalle cómo funciona esta técnica; incluso, el artículo mencionado arriba lo menciona de forma entendible, así que no ahondaré mucho en detalles: PageRank determina el grado de importancia de una página con base en el número de páginas que tienen ligas hacia ella. y del mismo grado de importancia de cada una de esas páginas. Es decir: una página será más relevante si muchas otras páginas ligan a ella, o también si las páginas que ligan a ella son a su vez relevantes.

Consideremos el caso de una red que sólo tiene 4 sitios: A, B, C y D, y que están ligados de la siguiente forma:

pagerank-example1

Gracias a PageRank, podemos determinar la relevancia de cada uno de estos sitios, usando la fórmula que aparece en el artículo arriba mencionado:

(1)   \begin{equation*} r(i) = \sum_{j \epsilon B(i)} r(j) / N(j) \end{equation*}

Donde r(i) es el pagerank de la página i, r(j) el pagerank de la página j, y N(j) es el número de links que salen de la página j. B(i) es el conjunto de páginas que tienen liga hacia la página i.

A ojo de buen cubero, la página C tendría un valor de relevancia mayor al de las otras páginas por haber 2 que ligan hacia ella (A y B).

Existen un par de problemas con esta fórmula: si encontramos una serie de páginas que sólo tienen ligas entre ellas, o si llegamos a una página que no tiene ligas a ningún lado, a final de cuentas la relevancia se centrará o en las páginas dentro de un cluster (para el primer caso) o convergerá a 0 (en el segundo caso). En el artículo, el primer caso se nombra como rank sink, mientras que el segundo se nombra rank leak.

Se propone también el modelo del Random Surfer para describir el comportamiento de un usuario: o bien puede seguir las ligas de una página a otra, o bien se puede aburrir y “brincar” directamente a una página.

Para resolver los problemas antes mencionados e implmentar al Random Surfer, lo siguiente es propuesto:

  • Eliminar todas la páginas que no tengan ligas externas (leaks). No necesariamente la mejor solución.
  • Suponer que los leak tienen ligas a todas las otras páginas.
  • Agergar un valor que modele al Random Surfer. Este valor se denomina d (decay factor), y es un valor 0 < d < 1, indicando qué tan frecuentemente el Random Surfer se “aburre” de una página y brinca a otra aleatoriamente.

La fórmula anterior entonces cambia a:

(2)   \begin{equation*} r(i) = d * \sum_{j \epsilon B(i)} r(j) / N(j) + (1 - d) / m \end{equation*}

Donde d es el decay factor explicado arriba, m es el número total de páginas en la red, y el factor (1 – d) / m hace que la suma de todos los pagerank de las páginas consideradas sea igual a 1. Por supuesto, dependiendo del manejo de los sinks y leaks, los resultados varían.

Para información más detallada, consulten el artículo.

Power iteration

Es obvio pensar que teniendo tantas páginas que revisar necesitamos un método que sea lo más eficiente posible. Page y Brin mencionan que es posible hacer el cálculo de PageRank usando el método llamado Power Iteration, y que en un número relativamente bajo de iteraciones ( < 100 ) los valores convergen. Omito aquí la explicación técnica de obtener el principal eigenvector de la matriz de pagerank, y me centro específicamente en explicar el método con estructuras simples:

  1. Inicializamos un vector s de longitud m = número de páginas. Cada valor es el pagerank de la página en cuestión. El valor inicial puede ser aleatorio, pero los autores lo inicializan en 1/m
  2. Usando la fórmula (2), calculamos los nuevos valores de pagerank y los guardamos en un vector r.
  3. Calculamos la L1 Norm de las diferencias absolutas entre rs, y las comparamos con un valor de error máximo e previamente determinado. Si la L1 Norm es menor a e, los valores han convergido y r contiene los pagerank finales de las páginas. Si no, ir a 4.
  4. Asignar a s los valores actuales de r y regresar 2.

Implementación

Como siempre, lo aquí establecido no es la verdad absoluta. Quienes estén interesados en mejorar la implementación o crear la suya propia, ¡adelante!
Continue reading “Implementando PageRank”

Habemus nuevo Dragon Ball Kai

Antes de que se me pase, y aunque sé que muchos ya lo saben, pero no puedo dejar de mencionarlo.

El domingo pasado (6 de abril) comenzó en Japón la nueva parte de Dragon Ball Kai. Sip, es decir: Dragon Ball Z, la parte de Majin Buu, sin los fillers, todo al grano, y en gloriosa alta definición.  ¿Necesito decir más?

Nuevo opening:

[youtube]https://www.youtube.com/watch?v=gY2iNfG7D7U[/youtube]

Lo “bueno” (?) de esto es que, como es a las 9 am, y One Piece le sigue inmediatamente a las 9:30, me “obligará” a ver la segunda. A ver qué tanto ha avanzado desde la última vez que le puse atención.

11 años – El tiempo vuela

Dicen que cuando te diviertes, el tiempo pasa volando. Aunque no puedo decir que este año fue pura diversión, realmente sí sentí que el número once llegó muy rápido.

Como pudieron notar, el blog estuvo sin contenido nuevo por espacio de 3 semanas. Comencé una entrada nueva, pero la dejé a medias, y es hora de que todavía no termino de editarla. Se me juntaron un buen de cosas a finales de marzo, y hasta ahora me pude sentar y tener tiempo para mí… lo cual no es bueno, porque siempre debo de hacer tiempo para lo que me gusta.

En fin. En el último año he visto muchos casos de odio/amor hacia Japón por parte de extranjeros. Como ya saben, cada quien habla de la feria como le fue en ella, y aunque es cierto que los comentarios positivos son mayoría, los negativos llaman mucho la atención. Mención especial a los que denuncian racismo por acá, aunque lamentablemente es algo a lo que nos tenemos que enfrentar (nada más intenten rentar un departamento por acá…).

Tenemos el caso del equipo Rojos de Urawa, quien por poner un letrero de “Japanese Only” en una entrada del estadio le costó un juego a puerta cerrada; también el caso de un restaurante que niega la entrada a extranjeros argumentando “falta de modales”… No son situaciones nuevas, pero ahora están sonando mucho más porque contrastan con el famoso O-MO-TE-NA-SHI que Japón “vendió” para que Tokio obtuviera los juegos olímpicos del 2020.

En lo personal, la policía me paró 2 veces (nada nuevo), lo curioso fue que una de ellas fue en la estación de la casa, lo cual sí me sorprendió. A final de cuentas no pasa de una inspección de rutina, y luego una mini charla sobre México, etc., etc. Me tocó también pagar la renovación del contrato de la casa, lo cual me dejó en la quiebra en marzo. Explico:

En Tokio (y no sé si en otras partes de Japón, pero en Iizuka nunca me tocó algo similar), los contratos de renta de casas son por 2 años, y cuando expiran, hay que renovarlos, lo que significa que hay que pagarle a la agencia inmobiliaria la módica cantidad de un mes de renta nada más de la pura molestia. O sea, 2 meses de renta en uno. DOUBLE COMBO. Ni modo. No puedo decir que no estaba preparado, pero de todas formas, sí pega.

También tenemos que ya pagamos más IVA (conocido acá como 消費税, shouhizei, impuesto al consumo): de pagar 5%, ahora pagamos 8%. Todo subió de precio; minúsculamente, pero subió. Fue divertido ver a cantidades industriales de personas haciendo compras “de último minuto” antes de que el impuesto subiera: Súper televisiones de 60″ para arriba, carros, el súper de un mes… ustedes saben: #FirstWorldProblems

Pero quizá lo que más puedo comentar de este último año que he estado por acá es que me hizo despertar en varios sentidos, y al mismo tiempo, me hizo recordar por qué estoy aquí y por qué me gustó y me sigue gustando) Japón… pero también resaltaron los aspectos negativos (que varían de persona en persona), y al final todo queda en una balanza que hay que saber nivelar.

Hace un par de semanas platiqué (después de fácil unos 5 años) con uno de mis mejores amigos en México, y la plática y sus comentarios me ayudaron a despejar un par de dudas que tenía respecto a mí mismo y a la situación que me ha tocado vivir de este lado del mundo desde que llegué a Tokio. Fue una plática refrescante, porque él es uno de los que me conoció desde la prepa, y por tanto sabe por todo lo que pasé para llegar a este lugar y hacer lo que vine a hacer, y fue precisamente lo que mencionó. Creo que tener tantas cosas en la mente, aunado con mi personalidad de NUNCA estar conforme con nada, me nublaron la vista y me hicieron dudar de lo que viene. Por fortuna, parece que la costa se aclara y que el barco vuelve a tener rumbo.

El año pasado, cuando cumplí 10 por acá, hice un recuento de lo que había vivido durante ese tiempo en Japón. Ahora, teniendo 11 años aquí, y 2 años y medio en Tokio, tocó hacer un resumen de lo que este año me ha traído.

Tengo un buen de chismes que contar, pero lamentablemente algunos tendrán que esperar, tanto por discreción y respeto hacia algunos colegas, como por precaución. Todo a su tiempo. Sólo espero que este año ese tiempo no me vuelva a dejar como novia de rancho. Ya hace falta que nos reconciliemos.

11 años… Cada día después de haber obtenido el doctorado es un nuevo récord, porque nunca me pasó por la mente de que estaría todavía aquí en 2014.

Kioto, de pisa y corre

La semana pasada me mandaron del trabajo a Kioto, justo como sucedió el año pasado.

La última vez que fui a Kioto de paseo fue hace 4 años, cuando todavía vivía en Fukuoka. Fue la primera vez que experimenté viajar en un autobús nocturno en Japón, y aunque es muy barato, comprendí que no aguanto uno de esos más de 4 horas.

De trabajo fui el año pasado también, aunque a otra área de la ciudad. Esta vez, me tocó muy cerca de Nara, por lo que el hotel fue reservado en esa prefectura.

 

En sí lo que hay que hacer de trabajo no tiene gran ciencia, pero el problema es que a veces la comunicación entre la empresa y el lugar a donde voy (por lo general universidades) a veces no es la adecuada y se genera caos y hasta pequeños conflictos con los encargados del lugar.

A fin de cuentas todo terminó bien, y el segundo día tuve oportunidad de ver a una amiga que solía vivir en Iizuka pero ahora está en Kioto. Primero, fui yo solo al 建仁寺 (Kenninji):

Continue reading “Kioto, de pisa y corre”

Decapre

Quizá muchos no estaban enterados de que el pasado fin de semana Capcom revelaría, por fin, al tan esperado 5to. nuevo personaje de la próxima entrega de Street Fighter: Ultra Street Fighter 4, pero así sucedió, y Capcom cumplió.

El torneo Final Round 17 llegó a su fin, y en Super Street Fighter 4 Arcade Edition 2012 el ganador fue Ryan Heart después de un excelente torneo. Inmediatamente después llegó el momento que muchos esperábamos y el final de tantas especulaciones que se habían hecho a lo largo de los meses:

  • Sabíamos que el personaje era mujer porque Ono así lo reveló hace tiempo.
  • Ono también reveló que no era Rainbow Mika.
  • Retsu, a quien muchos esperaban ver, también fue descartado por Ono en la pasada Capcom Cup (la que ganó Sako con Evil Ryu).

Era el momento, el “hype”. Capcom nos presenta a… Decapre.

[youtube]http://www.youtube.com/watch?v=dC-Hl33Xqpk[/youtube]

Y ComboFiend explica respecto a ella aquí:

[youtube]http://www.youtube.com/watch?v=XfsKVOuEyow[/youtube]

Ciertamente es una personaje nueva, es una personaje “charge” (estilo Guile, que para sacar sus poderes hay que cargar por cierta cantidad de segundos), y lo que quieran y gusten, pero definitivamente no vivió para el “hype” que se había creado durante tanto tiempo. Obviamente ahora no se puede juzgar si es buena o mala porque todavía no sale, pero Capcom supo “matar” el momento al entregarnos a otra de las muñecas de Bison (recordar que Juni y Juli eran jugables en Street Fighter Zero 3).

En fin. Ya falta poco para que el título salga a la venta, y sabremos a ciencia cierta si Decapre vale la pena o no.

Crystal

Se dio a conocer el título oficial de la animación de Sailor Moon que saldrá en julio: 美少女戦士セーラームーンCrystal(Bishoujo Senshi Sailor Moon Crystal).

Todavía en estos días me pregunto cómo le hice para aguantar toda la serie de animación original. Originalmente me gustaba el manga de コードネームはセーラV (Code name wa Sailor V), y creo que por eso instintivamente comencé a ver Sailor Moon… Ahora, muchos años después, me sigue gustando el manga, pero no puedo decir lo mismo de la animación. Ojalá que esta nueva entrega reviva el gusto que tenía cuando la conocí.

Como nota, que creo que a estas alturas no es noticia para nadie, el tema oficial de la serie es interpretado por Momoiro Clover Z. Para quienes no ubican al grupo, aquí algunas referencias:

[youtube]http://www.youtube.com/watch?v=u7z9M0vFPbI[/youtube]

[youtube]http://www.youtube.com/watch?v=upjYvN2QlRg[/youtube]

 

Logrotate error en MySQL

Tenía ya tiempo recibiendo a diario esta notificación en los logs:

/etc/cron.daily/logrotate:
error: error running shared postrotate script for /var/log/mysql.log /var/log/mysql/mysql.log /var/log/mysql/mysql-slow.log
run-parts: /etc/cron.daily/logrotate exited with return code 1

Busqué en internet y todos los sitios mencionaban que la causa era que el password de la cuenta debian-sys-maint no era el que estaba indicado en el archivo /etc/mysql/debian.cnf (en Ubuntu):

[client]
host     = localhost
user     = debian-sys-maint
password = xxxxxxxxxxxxxxxx
socket   = /var/run/mysqld/mysqld.sock
[mysql_upgrade]
user     = debian-sys-maint
password = xxxxxxxxxxxxxxxx
socket   = /var/run/mysqld/mysqld.sock
basedir  = /usr

Cambié el password en la base de datos, pero nada. Todo seguía igual. Y al revisar el hash antes y después de cambiar el password era exactamente el mismo, lo que quería decir que el password estaba bien.

Usando ping en mysqladmin

mysqladmin --defaults-file=/etc/mysql/debian.cnf ping

me di cuenta de que no se podía se conectar por problemas del socket. Entonces entendí qué estaba pasando: el directorio en donde el socket de MySQL se crea está especificado en my.cnf, y lo tengo definido como /tmp/mysqld.sock . Le puse ese valor al archivo arriba mencionado, volví a correr el proceso y todo funcionó a la perfección.

Lo anterior pasó porque primero instalé MySQL “a pie”, y recuerdo que cambié varias configuraciones; después, tuve que instalar MySQL usando apt y usé el mismo archivo de configuración. Eso fue lo que causó el problema.

¿Por qué instalé con apt si ya tenía todo configurado bien a mano? Porque lo que instalé por mi cuenta fue para hacer correr un sistema que tenía configuraciones y versiones del año del caldo, y para poder reproducir el comportamiento original tenía que tener exactamente la misma configuración. Afortunadamente eso ya quedó en el pasado y no lo necesito más.

だ y です. ¿Son lo mismo?

Uno de los errores más comunes que se ven en las personas que llevan poco tiempo de estudiar japonés pero que entienden y pueden formular frases simples es el uso de だ, です. No obstante, creo que el problema se debe a la forma en la que se enseña en muchos lugares y textos.

Cuando comenzamos a estudiar japonés, lo primero que generalmente aprendemos a decir es “Soy <nombre>” o “Mi nombre es <nombre>” -> 私は<nombre>です。 私の名前は<nombre>です。 Y después de eso, vemos です usado con adjetivos, estilo “El carro es rojo”, 車は赤いです, e instintivamente relacionamos です con nuestro verbo “ser”. Ciertamente la confusión disminuye cuando aprendemos a decir frases como “tengo sueño”, 私は眠いです, o simplemente 眠い, porque medio comprendemos que です no necesariamente es “ser”.

Ahora bien, todo se vuelve más complicado cuando nos alejamos de la forma “formal”; だ comienza a hacer su aparición y nos enseñan a decir frases en tiempo pasado. En este punto, suena lógico pensar que si “だ” es como la forma informal de “です”, una frase como “el carro es rojo” en informal cambie simplemente a ser 車は赤いだ。, pero ¡oh sorpresa!, esto es incorrecto, así como también intentar decirla en pasado: “車は赤いでした” (lo cual también es incorrecto). “¡Pero si 景色は綺麗だった (el paisaje era hermoso) es correcto!”, exclaman algunos, mientras que otros siguen relacionando a だ, です como “ser”… o algo similar.

Aunque es cierto que a un principiante no se le deben enseñar aspectos profundos del idioma con respecto a esas 2 expresiones, creo que habría menos confusión si desde el principio se especifica que “no siempre es así”.

Hace unas semanas, un amigo vino a Japón después de 5 años de no hacerlo. Al regresar a su país, envío un mensaje de agradecimiento en japonés que terminaba con “minna san ni aete honto ni ureshii deshita”. Obviamente un japonés lee esto y entiende qué es lo que quiere decir, pero gramaticalmente no es correcto.

La pregunta es: ¿es necesario aprender el idioma tan detalladamente?, y la correspondiente respuesta es: “depende de cuál sea tu meta”.

  • Si la idea es venir de vacaciones a Japón y ser capaz de entablar conversaciones simples y simplemente preguntar direcciones para no perderse, definitivamente no. Cualquier cantidad de conocimiento del idioma que traigas, por minúscula que parezca, es útil de este lado del charco.
  • Si la idea es venir a un curso de 3 – 6 meses, depende enteramente de ti. Hay para quienes aprender japonés es una pérdida de tiempo (aun estando en Japón), mientras que otros aprovechan la oportunidad para pulir lo que ya han estudiado.
  • Si la idea es venir por más de 6 meses, ya sea de intercambio, becado, o en “homestay”, mi opinión es que sí es necesario aprender un poco más en detalle esos aspectos del japonés.

Lo que sigue es una breve explicación, (abierta a debate, claro) de algunos esos detalles. Definitivamente no es para principiantes (gente que todavía esté en niveles básicos), pero (quitando la explicación muy detallada de la gramática japonesa) tampoco es para gente con un nivel extremadamente avanzado. No incluyo todo, puesto que sería una entrada larguísima y prefiero dedicar ésas a temas como “Los años maravillosos” o similares.

Continue reading “だ y です. ¿Son lo mismo?”

Un poquito de Scala

Tengo rato queriendo poner ejemplos de código en Scala que sean  relativamente fáciles de seguir: He visto código que he hecho a lo largo de estos años, pero no sé si sea adecuado para mostrar  características del lenguaje.

Encontré el “mini clon” de Twitter que me hicieron crear en la H. compañía descrita en el post de Luz, pero definitivamente no es nada básico. De hecho, ahora que vi el código de nuevo y ya con cierta experiencia en el lenguaje, me doy cuenta de que es la PEOR manera de que alguien entre en el mundo de Scala. Con razón nadie de los de ahí realmente entendía qué estaba pasando.

Voy a intentarlo con un problema simple que tuve hace tiempo, a ver qué tal queda.

Situación

Tengo un archivo de 112528 líneas, que contiene información en pseudo XML (porque no es válido. Un parser no lo procesa por lo mismo). Dentro de esa información están entidades Unicode (por ejemplo algo como &xyz:) que necesito listar. Hay que crear un programa que las extraiga, elimine duplicados, y las imprima en pantalla (en realidad hay que guardarlas en un archivo, pero para este post con ponerlas en pantalla está bien).

Ejemplo de una línea en el archivo:

<xyz type=”なにか”> &jajaja;漢字漢字漢字&jejeje;漢字だらけ&jajajaja;>

De esta línea el resultado sería:

  • &jajaja;
  • &jejeje;

Continue reading “Un poquito de Scala”