La señorita Cloe

Mi amigo Luisín tenía la fantasía de volar. Extendía los brazos en el aire, hinchaba los carrillos y echaba a volar por todo el patio, mientras emitía sonidos de avioneta. Cometía todo tipo de crímenes de guerra, abusando de los más pequeños, e incluso llevaba a cabo pequeñas razias en contra de algunos mayores desprevenidos, que solían acabar en pelea.

A mí me parecía que no iba a ningún lado con aquellas hostilidades. Además, siempre estaba babeando y moqueando, cosa que me parecía indigna para un oficial de alto rango como él. Así que decidí ayudarle a cumplir su sueño.

Aprovechando un descuido de Doña Marta, que era la carcelera del recreo, nos deslizamos por el pasillo y, esquivando a las señoras de la limpieza, nos colamos en la clase de 3º, en el primer piso, y salimos a la terraza. Era un día espléndido, muy adecuado para la navegación aérea y para estampar la firma de Luisín en el libro de las grandes proezas.

Saqué de la faldriquera unas gafas de bucear que había traído de casa mientras Luisín se quitaba el babi y se lo ponía al modo de las alas de Ícaro, como yo había visto en una ilustración.

Según se iba acercando la hora del despegue, parecía que Luisín se asomaba por el balaustre y guiñaba los ojos en un gesto de indecisión. O a lo mejor era porque no veía bien con las gafas. El caso es que comenzó a recular. Nos había costado mucho eludir la vigilancia de Doña Marta y, después de todo, aquel era el sueño de Luisín, así que yo no podía permitir que se desechara la oportunidad. Tenía que ayudarle a hacer su sueño realidad. Como primera medida, le ayudé a subirse a horcajadas al pasamanos. Él se resistía y pataleaba. No quería ser un piloto de fama inmortal, el muy zafio.

En ese momento, apareció la señorita Cloe y, a pesar de mis protestas, apoyó la actitud cobarde de mi amigo y zanjó la discusión poniendo su mejor cara de determinación.

La señorita Cloe era mi favorita, aunque en muchas ocasiones no coincidiesen nuestras posturas, como acabo de poner de manifiesto. Tenía unas gafas negras, gordas, que le hacían una cara muy fea, y así se lo expresé varias veces, aunque ella era muy bonita cuando se quitaba aquellas gafas para frotarse los ojos.

La señorita Cloe tuvo mucha paciencia para enseñarme los números y las letras. A mí solo me gustaban los dibujos y poco me importaba si las peras comenzaban por P, o si se representaba más o menos cantidad de perros que de gatos. También era mi salvaguarda frente a otras profesoras y empleados de la guardería. Por ejemplo, impedía que Casimiro, el bedel, me atizara capones en la cola del comedor. Él insistía en que yo empujaba y creaba caos, pero no era cierto. Es que tenía siempre mucha hambre y cuando había albóndigas, las husmeaba en el aire y me ponía algo impaciente. Eso es lo que le explicaba la señorita Cloe a aquel bruto bigotudo.

En otra ocasión, al año siguiente, me escondí con mi amiga Lorena en la terraza trasera de 2º, porque era el único sitio donde nos dejaban en paz para jugar a lo que nos gustaba: médicos y enfermeras. En realidad, Lorena siempre hacía de paciente y yo era el practicante. También era investigador y había desarrollado todo tipo de vacunas y remedios para las enfermedades que pugnaban por tomar el control del cuerpo de mi buena amiga. He de reconocer que era un engorro administrar todos aquellos remedios en pleno invierno, ya que Lorena tenía que quitarse el abrigo, los leotardos, el fajín y las bragas, y a veces las bragas dobles que llevaba los días de mucho frío.

El día que recuerdo, nos echó la vista encima Doña Marta, que tenía ojo de halcón y nos descubrió desde un esquinazo del patio. Yo no sé qué gritaba, pero parecía muy alterada. Le administré a Lorena su buena dosis de penicilina y le dije que ya podía vestirse. En esas estábamos cuando apareció Doña Marta, flanqueada por Casimiro. Ella se encargó de Lorena, dándole azotes y pellizcos, enrojeciendo sus blancas carnes. Yo traté de advertirle que aquel tratamiento no era adecuado para las dolencias de mi paciente, pero el bestia de Casimiro me cogió por la patilla y tiró hacia arriba, hacia arriba, dirigiendo mis pasos a un oscuro rincón de la clase de 2º, donde se desahogó abofeteando mi juvenil rostro.

La señorita Cloe apareció por la puerta y presenció aquella terrible injusticia. Es la única que vez que le vi perder la compostura. Le dio el alto al bedel y le apartó de un empujón, liberándome al fin del cruel castigo. El muy bribón se fue riéndose para dentro, y escocido de tanto pegarme. La señorita Cloe me cogió de la mano y me llevó hecho un ecce homo a la clase, protegiéndome de la burlona mirada de los niños que se habían congregado al olor de la sangre. Allí, toda la rabia que tenía dentro se desató y me puse a llorar. La señorita me dijo que yo no había hecho nada malo. Yo le respondí que ya lo sabía, porque había salvado la vida de mi amiga Lorena gracias a la penicilina.

Más tarde, antes de irme a casa, me condecoró con una medalla de cartón que todavía conservo, con la inscripción “Campeón de la Verdad”. La guardé porque tenía muchos colores y estaba muy bien recortada.

La semana pasada se jubiló la señorita Cloe y le hicieron una fiesta en la clase de mi hija mayor. Al despedirse me dijo, como otras veces, que yo había sido su mejor alumno. No lo tengo tan claro, pero ella sí que fue mi mejor profesora, la que mejor me entendió y me acompañó mientras aprendía.

FIN

~Concurso de relatos #MiMejorMaestro

Manolo

Conozco mucha gente que odia a sus padres, que ha perdido el trabajo en las distintas crisis que nos han golpeado desde que empezó el milenio, que no encuentra en ningún sitio a su pareja ideal… Tiene que haber gente con mala suerte para que pueda haber gente con buena suerte, por pura estadística. Yo soy uno de esos tipos con suerte.

He tenido muy buenos profesores y alguno regular. No solo en el colegio, también en el resto de sitios. Por ejemplo, en la catequesis había dos profesores: una buena y otro malo. El malo era un cura ceñudo y sádico. A mí me tocó la señorita Fuensanta. Cuando nos aprendíamos las oraciones, o las preguntas que tocaran del catecismo, cosa que solía llevar poco tiempo, nos dejaba cotillear los trastos de la iglesia y luego salíamos a jugar a la calle. Los del cura, sin embargo, agotaban toda la hora y salían mortificados y contritos para el resto de la semana.

Mi mejor profesor fue Manolo, el de la autoescuela.

Manolo era un viejo rockero romántico. Llevaba camisa de cuadros y se peinaba hacia atrás la melena plateada. Tenía un sentido del humor de bar de los finos, y unos ojos grandes y melancólicos que dejaban embelesadas a las alumnas.

Manolo no se ganó mi respeto. Lo tomó.

Un día salvé un perro en la calle del Marqués de Urquijo. Era un jovenzuelo. Se le escapó a una señora mayor y correteaba despistado por la mediana, hasta que salió a la carretera, justo cuando venía el de la L. O sea, yo. Reaccioné de inmediato, pisando el freno a fondo y dejando la mitad de los neumáticos en el asfalto. El resto de coches también frenaron y por fin se salvó el chucho.

Luego yo iba soltando la tensión nerviosa acumulada y dándomelas de héroe, aunque Manolo no decía nada, hasta que por fin lo soltó:

—El perro lo he salvado yo.

—¿Cómo que tú? —dije, sorprendido.

Empecé a repasar mentalmente. Ya sabéis que los coches de autoescuela llevan un juego de pedales para el profesor, y desde allí pueden asistir al alumno cuando lo consideran necesario, embragando, frenando y ¿acelerando? Yo no estaba muy seguro de qué podía hacer Manolo con su juego de pedales, así que me quedé callado mientras lo meditaba. ¿Acaso podría haber anulado mi frenazo, desfrenando o acelerando con sus pedales, y todo en una fracción de segundo?

—Manolo…

—Mira la carretera.

Obedecí.

—Manolo, ¿cómo habrías podido evitar que yo frenara para salvar al perro?

—Diciéndotelo.

Solo puedo especular, después del tiempo. Es muy probable que él viera el peligro mucho antes que yo, y mirase por el retrovisor para ver si venía alguien por detrás, o por los lados, y decidiese por mí que era seguro frenar para salvar al chucho. Quizá ni siquiera fuera yo el que frenó en primer lugar, y desde luego tampoco fui yo quien puso las luces de emergencia para advertir del peligro a los otros conductores.

Ahora estoy seguro de que las cosas que me enseñó Manolo me han salvado muchas veces la vida en la carretera, sin yo siquiera advertirlo. Decía, por ejemplo, que los tíos solíamos ser unos chulos y las mujeres eran mejores conductoras, porque eran más listas y miraban más. Mirar por los espejos era una de sus más valiosas lecciones y en más de una ocasión me ha ahorrado algún disgusto.

El día que aprobé el examen de conducir, junto con otros dos alumnos de la autoescuela, fuimos a celebrarlo tomando una copa. Tal vez fueran dos o tres, no lo recuerdo, pero al fin me enteré del porqué de los ojos tristes de Manolo. El hombre se había separado hacía relativamente poco y llevaba muy mal estar lejos de su hijo. Me lo dijo así: “si alguna vez tienes hijos, no les falles nunca”.

Yo no creo que Manolo hubiera fallado a su hijo. Es imposible. Seguramente había pensado que, ante la separación, su hijo estaría mejor con la madre, ya que las mujeres son más listas y se fijan más.

Una materia la puede aprender uno solo, leyendo o buscando en internet. Pero solo los buenos profesores educan a las personas.

FIN

~Concurso de relatos #MiMejorMaestro

AppleScript & interactive shell-script sessions

I thought I should share the brief research I finished yesterday.

Being AppleScript (as the main language to drive apple-events in the mac) the mother of the automation since MacOS 7 days, I was still missing the path to automate interactive shell scripting sessions, such as ssh, telnet, mail, etc., without the need of scripting the Terminal app, which is ugly.

Yesterday I found info about “expect” (google for it and click the first search result if you use english as your main language). It’s kind of a pseudo-terminal which you can invoke just like bash or sh, and it accepts a serie of special commands, being “expect” the killer one.

I’m working in a top-secret project with gnuchess (an app which acts as interface for UCI chess engines => well, the app which in fact was used to determine how UCI chess engines should communicate with UIs) and I needed grabbing input from it. But gnuchess must be launched in interactive mode, etc. And AS’s “do shell script” doesn’t work like that.

So, I wrote my first “expect” script, which works like this:

(“sample.sh” invoked from AS «do shell script “cd xxx; ./sample.sh ‘file.pgn'”»)

#!/usr/bin/expect
# this is how you read passed arguments (index-based)
set pgnName [lindex $argv 0]

cd /path/to/gnuchess-6.0.2/src/;
# start listening
spawn ./gnuchess

expect “White (1) : “
send “pgnload $pgnName\n”

expect “White (1) : “
send “book on\n”

expect “White (1) : “
send “hard\n”

expect “White (1) : “
send “go\n”

expect “) : “
send “quit\n”

close

Basically:

  • spawn: launches and starts listening a process.
  • expect: listens the process to output the given string (such as “White (1) : “).
  • send: upon that string being sent by the process, enter the given string (such as “book on”).
  • close: that is.

I invite you to fire the Terminal and type “man expect”. You will find more options and ways to write more compact code.

Green fields in front of me 😉

This one and the new features in Adobe AIR will keep me busy for the next two years (appart from that damn mobile devices and the html5 headache everyone loves).

Be good.

MySQL remove duplicates (large database + fast)

In the end, this was for me the fastest method to remove dups from the big db I’m working on:

  1. Duplicate the structure of the database (ie, “db”) to a new database (ie, “db2”, setting the fields you don’t want to be dups to UNIQUE.
  2. Copy db to db2 using INSERT IGNORE:

INSERT IGNORE INTO
db2
(`xxx`,`yyy`,`zzz`)
SELECT `xxx`,`yyy`,`zzz`
FROM `db`

This reduced the amount of time to minutes, while any other method could take many hours, appart from creating large temporary files which could fill the disk holding the temp dir and finally abort the process.

If you don’t need in the end to have those UNIQUE fields (the indexes takes many HD), you should re-dump db2 to a new db without that UNIQUE fields => again some more minutes, but still worth against 12 hours of CPU/RAM intensive working (in a highly mysql responsive profile) with other kind of filtering methods, such as DISTINCT or GROUP BY.

Recover MySQL from files

This is how I recovered my databases from a HD crash using Mac OS X. These included both MyISAM and InnoDB tables.

  1. Get the files, typically from a backup or booting into your machine/server in recovery mode, usually located @ /var/lib/mysql
  2. Read (if you own this file) mysql_upgrade_info, so you see which mysql version created the files.
  3. Install the same version in your machine. If needed, uninstall whatever exists (if you don’t need it, of course):
brew remove mysql
  1. Install the closest mysql version to that you found in mysql_upgrade_info (or whatever you guess is the version). See the available formulas and do it:
brew search mysql
brew install mysql@5.5
  1. I installed myself version 5.5, which is the one I needed.
  2. Now locate the place where the local files reside, typically @ /usr/local/var/mysql
  3. Zip this folder as a backup measure and remove all of its contents.
  4. Move inside all the files and folders you got in step 1.
  5. Launch mysql:
/usr/local/opt/mysql@5.5/bin/mysql.server start
  1. Connect and mysqldump whatever you need.

Bypassing Cloudflare

I use to automate many tasks in the web (such as triggering news and sorting them according to my interests) and some times I hit with Cloudflare’s DDoS protection, I mean client-side, I guess they will have some real DDoS protection server-side, as the client-side is very easy to break.
They use to change their algorithms from time to time, but the basics are always the same:

  1. curl the protected page and you will get an invisible form which auto-sends itself after making some client-side calculations. Currently this form is called challenge-form and has three hidden fields called jschl_vc, pass and jschl_answer.
  2. Compute the javascript you find in the curl-ed page and send the form (the results of the calculations will be populated to the jschl_answer field). You can emulate these calculations in your favorite language (Python, AppleScript, PHP, whatever) or have a JS engine to execute the scripts. I’ve used node for this, which is available as a command-line tool you can install and execute easilly.
  3. If everything is OK, you will have now two cookies: __cfduid and cf_clearance. Using that cookies, you can now surf freely the website.

The details may change from time to time, as Cloudflare updates their methods, but it’s been very similar across the years. Just take a look in your regular browser/developer tools and find the magic under the hoods.

Mac: sqlite3 command-line one-liner load extension

You are using the sqlite3 command-line binary and you need an extension, for example the Levenshtein algorithm which will allow you to find in a database text similar to other texts, let’s say you would like to consider “Jules Verne” and “Julio Verne” the same author.

You learn that you can load the spellfix extension which will allow you to use a function called editdist3, which is this algorithm (also called edit-distance, meaning the amount of changes needed in a string to look like another string).

Mac OS X’s built-in sqlite3 binary doesn’t allow you to load extensions (maybe because of security issues), so after some time googling, you do the following:

  1. Install an alternate copy of sqlite3 through brew (this is a must-have utility if you are some kind of programmer):
    $ brew install sqlite

    This will install a new copy of the sqlite3 binary with the ability to load extensions enabled by default. You will keep your system’s sqlite3 unalthered, so you are safe, as you will be the only one using the “unsafe” sqlite3, installed in
    /usr/local/opt/sqlite3/bin/sqlite3.

  2. Compile yourself the spellfix extension. You will download sqlite’s source code. I got mine from here: https://www.sqlite.org/src/, clicking here or here =>
    Untitled-1
    You may get the tarball if you feel better.
    Unzip the file and look for spellfix.c inside sqlite/ext/misc. Right? Now let’s compile it following official sqlite’s instructions:

    $ cd /path/to/sqlite/ext/misc
    $ gcc -g -fPIC -dynamiclib spellfix.c -o spellfix.dylib

    If you are compiling a different extension, just substitute the words in red (spellfix.c and spellfix.dylib) with the right ones. If you receive this kind of message:

    -bash: gcc: command not found

    Then you dont’ have installed Apple’s command-line tools for Xcode. Go and get them @ Apple’s developer website.

  3. Okay. This was the easy part. Now you are ready to load and run your brand-new copy of sqlite3 with loading-extensions enabled, and your brand-new compiled extension. It doesn’t exist a man page for sqlite3 and you don’t realize the how-to if you happen to run sqlite3 -help in a Terminal window… Using the trial and error method for minutes or hours, depending on your skills or how spirited you are, you will find the syntax. This is the one-liner, as I will be running this code from within another utility which doesn’t let me interact with sqlite3. And this is the reason of this entire post:
    cd /path/to/dir/with/spellfix/; /usr/local/opt/sqlite3/bin/sqlite3 /path/to/database.db 'SELECT load_extension("spellfix.dylib")' 'SELECT title FROM books WHERE editdist3(author, "Jules Verne") < 450'

I colored some things:

/path/to/dir/with/spellfix/ You will run your command from within the directory containing spellfix.dylib. Most probably you could specify the full path to spellfix.dylib later in the load_extension command, but this could lead to issues depending on your OS (ie, Win), so I prefer it this way.

Now follows the full path to the new sqlite3 binary you installed, as the system’s built-in sqlite3 won’t do the job.

/path/to/database.db This is the full path to the database. This means that we will be running the load_extension command from within SQL, not from the binary itself. I didn’t find a way. I tried using the -cmd switch mixed with the dot-command syntax (.load extension) but didn’t work.

load_extension(“spellfix.dylib”) Now we run two separate SQL statements, quoted and space-separated. In the first one we load the extension. In the second one, our statements (ie, searching for something).

editdist3(author, “Verne, Jules”) And here is how we are using the function which is available only after loading the spellfix extension.

BTW, here is the link to the spellfix documentation, just in case you are interested in its capabilities => https://www.sqlite.org/spellfix1.html

JDownloader Mac memory issue + restart [fixed]

It seems that there is a memory problem. A restart of JDownloader is required to fix the problem. If even 2 restarts do not fix it, please visit our support chat.

Do you see this message oftenly? Try this:

  1. Go to the menu JDownloader > About JDownloader. You will see somewhere something like: Memory: Usage: 40 MB – Allocated: 44 MB – Max: 64 MB. This means that JDownloader is being launched with a max heap of 64 MB. Increasing this limit may fix your memory issues.
  2. Quit JDownloader.
  3. Right-click JDownloader’s icon in the Finder, then choose “Show Package Contents” in the context menu.
  4. Open the folder called “Contents”.
  5. Open the file called “vmoptions.txt”. If this file doesn’t exist, create it yourself using a plain text editor.
  6. Add the following:
-Xmx256m

This will increase the max memory to 256 MB. Some people add up to 512 or 1024 MB, but first let’s see if 256 is good enough.

Launch JDownloader, go again to the About JDownloader window and see if the Max field in the Memory section was correctly increased.

eBay endorses fraud

Steps to reproduce the issue:

1. Crash your graphics card and try to find a replacement in eBay => https://www.ebay.es/itm/382559592650?ViewItem=&item=382559592650&ssPageName=ADME:X:COCE:ES:3160

2. Contact a seller which lists such item as New, which according to https://www.ebay.com/pages/help/sell/contextual/condition_1.html means “A brand-new, unused, unopened, undamaged item in its original packaging (where packaging is applicable). Packaging should be the same as what is found in a retail store, unless the item is handmade or was packaged by the manufacturer in non-retail packaging, such as an unprinted box or plastic bag. See the seller’s listing for full details.”:


3. When you go to the details, you can read in a tiny bullet inside a long list: “Used! 90% New”.

4. Contact the seller and ask for a clarification. What does it mean 90% new???

OK, not so difficult to understand: 90% new means 90% new, like renewed (???), so it’s more than new. It’s new renewed. However, that doesn’t sound like brand-new, unused, unopened, undamaged.

However, this isn’t the part related to the apparent endorsement of fraud from the point of view of eBay. Just read the same message focusing on certain keywords:

Also, I’ve reviewed the contact/help pages on eBay, and there is no apparent decent way to contact and REPORT FRAUD. My only chance was calling to an international? phone number, after waiting for (estimate) 34 minutes. No mail, no easy way to report a FRAUDULENT item.

The programmers or the CEO @ eBay, though, seems to suggest that the default behaviour is asking the buyer to buy whatever. Endorsement messages, a mechanism to include a special offers (2% discount)… Very smart.

Insolvable and slow recaptchas fixed (jDownloader Mac)

Launching jDownloader captcha’s solver in a Chrome incognito window (easilly adaptable to other browser?). Look in Advanced prefs for “BrowseCaptchaSolver: Browser Commandline” and enter the following =>

[ "/Applications/Google Chrome.app/Contents/MacOS/Google Chrome", "-incognito", "%s" ]

This will fix the issue of insolvable and slow recaptchas (maybe some kind of conflict between your google id and the process of solving captchas).

The same should work without jDownloader: just solve your captcha in a incognito window.