Bitácora

Artículos

Go (golang) plugin in Citellus

Domingo 14 de junio de 2020
I wanted to practice a bit Go programing, so I divided that task in two parts, one, adding a golang extension for Citellus and a sample, but working plugin using it. If interested in the code it’s available at the review at https://review.gerrithub.io/c/citellusorg/citellus/+/495622. The final sample code for it has been: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59// Author: Pablo Iranzo Gómez (Pablo.Iranzo@gmail.com) // Header for citellus metadata // long_name: Report detected number of CPU's // description: List the processors detected in the system // priority: 200 package main import ( "bufio" "io" "os" "runtime" "strconv" "strings" ) func main() { var OKAY, _ = strconv.Atoi(os.Getenv("RC_OKAY")) var SKIP, _ = strconv.Atoi(os.Getenv("RC_SKIPPED")) var INFO, _ = strconv.Atoi(os.Getenv("RC_INFO")) var CITELLUS_ROOT = os.Getenv("CITELLUS_ROOT") var CITELLUS_LIVE, _ = strconv.Atoi(os.Getenv("CITELLUS_LIVE")) var FAILED, _ = strconv.Atoi(os.Getenv("RC_FAILED")) if CITELLUS_LIVE == 1 { // Report # of CPU's var CPUS = runtime.NumCPU() os.Stderr.WriteString(strconv.Itoa(CPUS)) os.Exit(INFO) } else if CITELLUS_LIVE == 0 { file, err := os.Open(CITELLUS_ROOT + "/proc/cpuinfo") if err != nil { os.Stderr.WriteString("Failure to open required file " + CITELLUS_ROOT + "/proc/cpuinfo") os.Exit(SKIP) } defer file.Close() counts := wordCount(file) os.Stderr.WriteString(strconv.Itoa(counts["processor"])) os.Exit(INFO) } else { os.Stderr.WriteString("Undefined CITELLUS_LIVE status") os.Exit(FAILED) } // Failback case, exiting as OK os.Exit(OKAY) } // https://forgetcode.com/go/2348-count-the-number-of-word-occurrence-in-given-a-file func wordCount(rdr io.Reader) map[string]int { counts := map[string]int{} scanner := bufio.NewScanner(rdr) scanner.Split(bufio.ScanWords) for scanner.Scan() { word := scanner.Text() word = strings.ToLower(word) counts[word]++ } return counts } Of course, lot of googling helped to start building the pieces. Things to have in consideration: Go programs are compiled so it requires being compiled with go build XXX or executed with go run XXX Programs executed with go run XXX might face some issues, as return code is not honoured (you can find more information on this). As program needs to be compiled, it will take a while to compile before execution (but still is fast) Undefined variables will make the program compilation to fail. Variable types are checked, so expect to use conversion when reading values, etc to have it compiling and working. For the citellus specifics: In above example, we use Citellus Return Codes as defined in the citellus guidelines, but when executed with go run XXX only standard error codes are returned As citellus metadata parser gets it from headers, an update to the default function was done so that the comment character can be defined, in case of Go programs it is: // citellus then takes it into consideration for the offsets to grab the data. Happy coding!

Diario del coronavirus

Sábado 6 de junio de 2020
2020/03/13¶ Se confirma el cierre de centros educativos a partir del lunes, a priori, de forma indeterminada.. Pasamos por el colegio para recoger los deberes y hacer alguna compra. En el supermercado se ven algunas cosas sin o con poco stock y relativamente bastante gente para ser las 17:00. Piscina 2020/03/14¶ Primer dia de confinamiento. Aprovechamos para hacer limpieza por casa y se sale sólo a tirar la basura, bajando y subiendo por las escaleras, poca gente en la calle. Durante el día un grupo de ‘palmeros’ en el parque, pero poco más. El gobierno anuncia a las 20:30 el estado de alarma con limitación de movimiento (1 miembro de la familia), 1 metro de distancia entre personas. Comercios excepto esenciales cerrados (sólo quedan peluquerias, tintorerías, farmacia, alimentación, estancos, etc). Bares, restaurantes, museos, etc cerrados. La fecha oficial de comienzo es el lunes, aunque se considera ya efectivo (con la publicación en el BOE. Por la tele se ve gente que se lo toma en broma y que han ido a la ‘sierra’ o a la ‘playa’. Algunas localidades están rodeadas por la policia para impedir entrada/salida excepto servicios de emergencia. Pasillos del supermercado Pasillos #2 2020/03/15¶ Se ha visto poco movimiento por la calle y parece que el mensaje de permanecer en casa ha calado algo más. Por las noticias se sigue viendo gente no se lo toma en serio y la policía ha comenzado a tomar medidas y se han anunciado las sanciones. 2020/03/16¶ Hoy han traído un paquete (UPS), el chico casi que me lo tira desde un metro de distancia, sin necesidad de firma, etc Primer día haciendo deberes del colegio, una ficha por día que nos dijeron parece ‘poco’ para llenar todo el día, hemos hecho dos y ahora ‘jugar’ a montar ciudades con Duplo. 2020/03/17¶ Pocos cambios en casa, hacer fichas del colegio, jugar, ver alguna película, actualizar a Fedora 32 los equipos y algo de ver las ruedas de prensa de medio día. Todavía aguantamos sin salir a buscar comida al supermercado. 2020/03/18¶ Se ha visto un coche de la policía por el parque con megáfonos. Fichas del cole. 2020/03/19¶ Un par de paquetes recibidos, magdalenas para celebrar el día del padre y desempolvar la Wii y el Wii Sports (junto con el Wii Fit) 2020/03/20¶ Teníamos cita del médico para nada, porque nos han dicho que se paraban posteriores visitas (así que ya podrían haberlo dicho por teléfono y evitarnos el ‘paseo’). Control de la policía nacional al salir del pueblo, preguntando destino, etc. Aprovechamos para ir a comprar a un centro comercial cercano para volver a intentar aguantar 7 días sin salir de casa. Entradas a Valencia Centro comercial Calle principal Entrada carrefour Colas para pagar en carrefour La cosa más curiosa es que para entrar en Carrefour, se entraba poco a poco, pero una vez dentro no se vigilaba que se mantuvieran las distancias y la gente, tosiendo o palpando el pan para ver cúal coger, etc. Parece que está mejor organizado en otros sitios tipo Consum donde al parecer se controla más. En la calle, tanto en la farmacia como en la tienda de pollos se veía una persona en el interior y el resto esperando ‘distanciados’ en la parte de fuera. La pena es que se sigue viendo gente por la calle en grupos de 2-3 personas andando cerca o incluso en el supermercado comprando de dos en dos. Parece que sigue habiendo gente que no se conciencia :/ 2020/03/21¶ Hoy en casa, por la mañana cocinando algo de la carne que compramos el día anterior. Por la tarde montando el Lego Volkswagen Beetle antes de cenar la sopa con las verduras que se habían comprado. En la comparecencia del gobierno, se sigue evitando dar fechas, así que tiene pinta de ir ‘seguro’ a incluir semana santa. De parte de la GVA y del colegio, mensajes acerca de formación a distancia… el lunes irán llegando más noticias… 2020/03/22¶ Día de ‘relax’, la comida hecha del día anterior, así que en plan tranquilo, jugando, montando el Lego Fiat 500 y merendando un bizcocho. El niño no lo lleva mal, pero el no ‘desfogar’ fuera de casa se empieza a notar. Del colegio han ido llegando más mensajes para desde ‘mañana’ acceder via Web Familia a las instrucciones de los profesores. Por otro lado, se ha alargado 15 días más el estado de alarma (sobre los 7 que nos quedaban todavía), así que todo sigue apuntando a que como minimo hasta finales de pascuas (20 de abril), estaremos así. Hemos ido adaptando un poco la distribución para tener más espacio para ‘jugar’ y para poder ejercitar algo y así compensar las salidas que ahora no se hacen. 2020/03/23¶ Primer día de ‘tele-colegio’, la web de la GVA caída cada 2x3, complicado bajar los materiales y algo incómodo tener que ir descargando ‘de un PDF’ los diversos materiales. Algunos además, apuntaban a otros blogs en la misma web que estaba caída, por lo que se complicaba más. Quitado de estos problemas ‘técnicos’, hay que reconocer que la subida de materiales, preparación, etc se ha llevado a cabo en tiempo récord y que es comprensible que tenga fallos porque no creo que hubiera sido nunca probado a esta escala. La rutina de trabajo en casa con niños no es fácil, sobretodo si se quiere evitar estar todo el día pegados al televisor (por eso no me acababa de convencer la iniciativa de Clan), a ver cómo evoluciona esto en los próximos días. Como dice mi hijo acerca del virus: El virus es malo Hay que lavarlo con agua y con jabón Pone malita a toda la gente Y hace que tosa y no ponga el brazo delante 2020/03/24¶ Ayer, quitado de la dinámica normal, manteniendo la postura para evitar al máximo ver la televisión, hicimos algo de ‘Wii’ por la tarde-noche después de estar jugando, haciendo las fichas del cole, etc Estuve de madrugada intentando hacer compra online, pero al final me cansé porque iba muy lento y al final, cuando ya era tarde, salió un aviso de que estaba ‘en cola’ antes de poder seguir, asi que me di por vencido. Lo que había puesto, al despertarme por la mañana aún seguía, pero en el rato de la comida que intenté continuarlo, fue imposible, se había vaciado la cesta, por lo que lo dejé definitivamente. 2020/03/25¶ Acabar la compra de ayer, volviendo a empezar de cero la lista tras esperar unos ‘20 minutos’ de cola virtual para poder hacerla. Es bastante complicado planificar para comprar algo que hasta dentro de 15 días no te llega, máxime teniendo en cuenta que hay productos que comprarías y que no están ahora en existencias. Creo que debería potenciarse el canal online para evitar aglomeraciones y dejar el presencial para quien no se aclare con el online, por un lado facilitas planificación del centro, por otro, reduces la gente en la calle a los transportistas que pueden ir mejor protegidos, y evitas aglomeración en los puntos de compra. La pena es que parece ser que no se ha reforzado el canal online tanto como debería (y algunas empresas hasta lo han cerrado). 2020/03/26¶ Día relativamente tranquilo, hoy vino un paquete y el chico lo subió hasta arriba, pero dejó a 3 metros o así de la puerta por ‘seguridad’. Las webs de GVA de maestros (blogs) estaban caídas y se reactivaron luego por la tarde. Algunos profesores están organizando reuniones ya vía videoconferencia y se han podido ir preparando otras cosas. La falta de ejercicio, hace que los crios ‘no se cansen’ y estén luego más revoltosos a la hora de dormir… Hoy hace una semana desde la última salida de casa a comprar. Para celebrarlo tocará bajar la basura cuando no haya nadie. 2020/03/27¶ No demasiadas novedades, estar en casa relajadamente viendo una película y jugando por la tarde. 2020/03/28¶ Pocos cambios, hoy día algo más tenso por no salir de casa que hace mella sobretodo con el peque. 2020/03/29¶ Otra rabieta y llamada al médico por unas manchas rojas en el nene. 2020/03/30¶ Videoconferencia con el cole, se nota la falta de quemar energías. En la bañera jugando con un barco de vapor con una vela que tenía de hace años similar a este o este. 2020/03/31¶ Día de hacer pan en casa y comienzo de la campaña de la Renta!!… y el viernes llega la compra que hicimos hace 2 semanas… 2020/04/01¶ Dia complicado, mucho tiempo para hacer la ficha de la ‘Primavera’ del colegio. La web del supermercado (C4) ya no deja hacer compra online, asi que sólo hemos podido hacer dos hasta la fecha que llegan esta semana y la semana siguiente respectivamente. 2020/04/02¶ Llamada con los compañeros del cole y esperando ansiosos la compra de mañana. 2020/04/03¶ La compra tan esperada finalmente llegó, sin un producto que en teoría venía y que no apareció y sin casi la mitad de la compra (espárragos, fruta, etc) que un poco antes del comienzo de la franja de entrega llegó en un correo. Intenté hablar con atención al cliente y se le acabó la batería al teléfono inalámbrico antes de conseguir que me cogieran… Por la tarde tocó salir de ‘emergencia’ al saltar por los aires la planificación de compra que habíamos hecho 15 días atrás. 2020/04/04¶ Dia tranquilo, comiendo de nuevo carne y verduras compradas, el confinamiento se confirma hasta al menos el 26 de abril. Mañana tengo que ir a recoger un pedido online, a ver si no hacen como Carrefour que ni tan siquiera han contestado a lo del producto que según ellos habían entregado y no estaba ni al resto de comentarios/sugerencias sobre la experiencia. 2020/04/05¶ Ir a recoger el click&collect de Hipercor y día en casa, esperemos que con las dos compras llegue para otros 15 días a pesar de las cosas que no venían en los pedidos. 2020/04/06¶ Día tranquilo, pero con pescado fresco, mejor. 2020/04/07¶ Día tranquilo, acabando de montar el autobús de Lego creator por la tarde. 2020/04/08¶ Esta tarde haciendo algo de sitio y luego montando el Lego Lunar Lander. 2020/04/09¶ Comienzo de las vacaciones, todavía no se si las pasaré en la cocina, o el salón, o en el dormitorio… A ver cómo evoluciona el estado de confinamiento, esperemos que se mantenga para que haya servido de algo, no como esta gente que los fines de semana o por las noches intentan escapar a segundas residencias. 2020/04/10¶ Día de cocinar y aprovechar para hacer limpieza en casa. 2020/04/11¶ Día de experimentos, monedas de cobre con vinagre, mezcla de colores básicos y preparar con cilindros de cartón para hacer un tren. 2020/04/12¶ Día tranquilo, jugando, etc. Mañana toca ir a recoger pedido de compra y el viernes, en teoría, entrega de C4, que siguen sin haber dado sañales de vida de la mercancía que ponía como entregada y no sirvieron. 2020/04/13¶ Recogido el pedido, faltaron algunas cosas, pero en general casi todo. Primer día que el crío se queja de que ‘quiere salir al parque y no estar encerrado’. 2020/04/14¶ Noche complicada, el día más o menos llevadero, amenazaba lluvia pero al final hizo buen día. Algo de python para desestresar. 2020/04/15¶ Jugando al Just Dance, haciendo recortables y jugando con el Duplo. Añadido un modo en el que @redken_bot elimina mensajes reenviados para ocultar el remitente original del contenido. 2020/04/16¶ Llegó bastante parte del pedido, pero aun así con las faltas de los otros tenemos que ir a recoger otro el domingo. 2020/04/17¶ Jugando algo con Duplos 2020/04/18¶ Día traquilo jugando a hacer un modelo de lego de Tensegridad https://imgur.com/a/eusA7cx 2020/04/19¶ Recogida de compra y tarde tranquila. 2020/04/20¶ Jugando en casa y algo de programación 2020/04/21¶ Vuelta al trabajo. Anuncio del gobierno de que dejarán salir a niños a la calle. 2020/04/22-25¶ Nada destacable, quitado de alguna salida a comprar. 2020/04/26¶ Celebración en casa de cumpleaños y con primer día de salida a la calle. Fue una vuelta alrededor de la manzana intentando evitar a la gente que no se apartaba. 2020/04/27¶ Salida a la calle con la bicicleta a un parque cercano al que no va nadie, éramos total 4 personas en todo el recinto, así que ‘genial’ el distanciamiento social. 2020/04/28¶ Día tranquilo y pequeño paseo 2020/04/29¶ Salida a la calle con la bicicleta y montar uno de los dos coches de lego del set Lamborghini 2020/04/30¶ Paseo en patinete por la calle y a la vuelta montar el otro coche de Lego del set Lamborghini 2020/05/01¶ Paseo por la calle, empieza a hacer calor (33º), que dificulta el tema de las salidas. 2020/05/02¶ Día en casa, jugando, etc. 2020/05/03¶ Paseo en el parque en el horario, empieza a haber mosquitos :/ 2020/05/10¶ Los días anteriores más o menos lo mismo, vida normal y paseo para que se acostumbre la salida. Por la calle, gente en la calle fuera de la ‘franja horaria’ y llevando la mascarilla cubriendo la barbilla, que debe ser la misma medida de seguridad que cuando la gente en moto lleva el casco en el codo… 2020/06/06¶ Estas dos últimas semanas con peor humor del crio, hace calor y cuesta más salir en las horas que ‘toca’ y la falta de ver niños, etc se nota.

Dell racadm remote ISO load

Martes 12 de mayo de 2020
In order to test IPv6 deployment on Dell hardware I was in need to patch the servers to ensure that UEFI boot mode is in use. Normally I would have use the DSU that runs from within Linux, but as the servers are part of an OpenShift installation (using baremetal-deploy) and using CoreOS as the underlying system I wanted to load ISO from HTTP server on the deployhost (running RHEL). The command is not that hard, let’s first define some variables: 1 2 3 4IDRACIP=1.1.1.1 IDRACUSER=root IDRACPASS=mysecurepass ISOURL="http://10.10.10.10/my.iso" Now, let’s attach the ISO file: 1racadm -r ${IDRACIP} -u ${IDRACUSER} -p ${IDRACPASS} remoteimage -c -l ${ISOURL} Once done, we should check status with: 1racadm -r ${IDRACIP} -u ${IDRACUSER} -p ${IDRACPASS} remoteimage -s Once finished, let’s disconnect: 1racadm -r ${IDRACIP} -u ${IDRACUSER} -p ${IDRACPASS} remoteimage -d And then, verify the status again: 1racadm -r ${IDRACIP} -u ${IDRACUSER} -p ${IDRACPASS} remoteimage -s Hope It’s useful for you!

Lego Speed Champions 76899 Lamborghini Urus ST-X & Lamborghini Huracán Super Trofeo EVO

Jueves 30 de abril de 2020
Today I built the Lamborghini Urus ST-X & Lamborghini Huracán Super Trofeo EVO 🛒. I liked specially the Huracán and the Urus was also very well done, a lot of details! Hope you like it! Follow my channel on Telegram on Lego deals at https://t.me/brickchollo

Lego Speed Champions 76898 Jaguar Racing GEN2 car & Jaguar I-PACE eTROPHY

Martes 28 de abril de 2020
Today I built the Jaguar Racing GEN2 car & Jaguar I-PACE eTROPHY 🛒. I also bought a Light box to take pictures, so here are my first attempts. Hope you like it! Follow my channel on Telegram on Lego deals at https://t.me/brickchollo

Lego 10266 NASA Lunar Lander

Miércoles 8 de abril de 2020
Today, as part of my confinement Lego catchup I was building the Lego NASA Lunar Lander Apollo 11 🛒. It covered the evening after work, and have some nice details. First bags are for the lunar surface and the remainder are for the module starting with the parts which are closer to the moon surface. It includes lots of gold-colour plates and some stickers for the external side (flag, controls of the lunar module and some external surfaces). The module has a dual door that opens close to the ladder and the module sides can be removed and placed again easily so that the astronauts can be put there or outside. Also, the module has two opening closets, one for the camera used to record the astronaut going down the scale :) Lunar Module assembly #1 Lunar Module assembly #2 Compartment interior #1 Compartment interior #2 Ladder detail Laser reflector (for measuring Earth-Moon distance) Flag Detail on module side Module propeller Connection between Module and Lander Propeller Moon crater where the Apollo lands Hope you like it! Follow my channel on Telegram on Lego deals at https://t.me/brickchollo

Telegram Redken bot documentation

Sábado 4 de abril de 2020
Redken Manual¶ This document contains some information about regular Redken https://t.me/redken_bot usage and some advanced settings. Introduction¶ By default, new groups where the bot is added are just ready to start being used. General usage: word++ to add karma word-- to remove karma reply to message with ‘++’, ‘—’ or ‘==’ to add or remove karma to user of prior message or to the same words that were used /quote add username text to add a quote for given username with the following text as message /quote username to retrieve a random quote for that username. @all to ping all usernames for users in a channel @all++ to give karma to all usernames in a channel stock to get trading quote for ticker in stock market /hilight Adds/deletes word or lists words that will cause a forward to notify you /feed name url Adds/deletes/lists a new feed form URL on channel /remind name interval text Adds/deletes/lists a new reminder for interval in channel, interval can be specified as ‘1y2m3w5d’ /ical name url Adds/deletes/lists a new ical url to print events happening during the day /cn To get a random Chuck Norris fact related with provided word (or random) /excuse To get a random excuse Also, while nothing is set against, you could use /gconfig to configure several aspects of it like: modulo (to just report karma every modulo points) stock (to define the stock tickers to query when invoking stock) Once you started chatting with the bot, you can also use /hilight word so messages containing that word will be forwarded to you as a private message. By default karma in channels is private to that group, but also, groups can be linked. On the channel to become master execute: /admin link master and it will generate a code (token) to link against just once. On the channel to be linked against master, a.k.a. slave, execute: /admin link slave where token is the code received as reply to the command in master channel. Bargains/Deals¶ Lists amazon bargains/deals published without duplicated during 24 hours, matching ones will be sent privately by https://t.me/descuenbot /ofertas add to add a new word to the ofertas watch /ofertas remove to remove a new word to the ofertas watch /ofertas list to show the words being watched Lists amazon bargains/deal published without duplicated during 24 hours, matching ones will be sent to GROUP by https://t.me/descuenbot /gofertas add to add a new word to the ofertas watch /gofertas remove to remove a new word to the ofertas watch /gofertas list to show the words being watched Special notes¶ Use word for regular substring match in include Use !word for regular substring exclude Use $word for whole word matching in include UIDEnforcer¶ Adds UID (as reported via /info) to the list of safe members of a chat, anyone else, will be Kicked /uidenforcer add to add a new UID to safe list /uidenforcer remove to remove a UID from safe list /uidenforcer list to show the UIDs in safe list Once the list of UID’s is ready, and the bot is set as Group Administrator, enable the check (every hour) by running /gconfig set safelist=True on your group to have the bot start checking on next scheduled execution. BEWARE: If the list is created and setting enabled, bot will start kicking all other users in the chat, ensure that you’re the creator or your user has been whitelisted or you might be kicked out too. Red Hat Jobs¶ Lists Red Hat Jobs published at https://t.me/rhjobs that have word in it: /rhjobs add to add a new word to the rhjobs watch /rhjobs remove to remove a new word to the rhjobs watch /rhjobs list to show the words being watched User/chat configuration¶ common currency: EUR modulo: 1 (to just show karma every X/modulo points, 0 to disable) stock: stock tickers to check cleanlink: True if we want links to be expanded and removed cleankey: Regexp to replace, for example tag= splitkarmaword: Set to ‘False’ to make that johndoe.linux.expert++ stops reporting karma to the word and to johndoe lang: set to language of choice to get some strings translated into supported languages https://poeditor.com/join/project/ubTVkikm1R and override autodetected language. privacy: Enables privacy for forwarded messages, if a message is forwarded and the config is set, redken will remove original message and resend text to the chat so that the original sender is removed but forwarder is credited. If value is set to silent it will just clean the message forwarder. chat isolated: False, if true, allow link, all karma, etc is tied to GID link: empty, if defined, channel is slave to a mater admin: List of admins of channels, default empty: everyone maxage: chats older than this will be removed silent: makes stampy not to output messages to that chat welcome: outputs the text when a new user joins the chat, replacing “\$username” by user name usernamereminder: Set this False to stop reminding new users to get a username to get the most out of karma commands. inactivity: Set this to the number of days without user activity before kicking it out. Extra commands¶ Only for admin user in groups or for individuals against the bot Configuration¶ The bot, once token has been used and admin has been set, will store that information in the database, so you can control it from a chat window /[g|l]config show will list actual defined settings /[g|l]config set var=value will set one of those settings with a new value As of this writing (verbosity, url for api, token, sleep timeout, owner, database, run in daemon mode) /[g|l]config delete var will delete that variable from configuration. Karma¶ /skarma word=value will set specified word to the karma value provided. Auto-karma triggers¶ Bot allows to trigger auto-karma events, so when keyword is given, it will trigger an event to increase karma value for other words /autok key=value Will create a new auto-karma trigger, so each time key is used, it will trigger value++ event /autok list [word] Will show current defined autokarma triggers and in case a word is provided will search based on that word /autok delete key=value will delete a previously defined auto-karma so no more auto-karma events will be triggered for that pair Auto-gif triggers¶ Bot allows to trigger gif sending when a keyword is given. /autog key=value Will create a new auto-gif trigger, so each time key is used, it will trigger gif send event /autog list [word] Will show current defined autogif triggers and in case a word is provided will search based on that word /autog delete key=value will delete a previously defined auto-gif so no more gifs will be sent for that keyword Alias¶ Bot allows to setup aliases, so when karma is given to a word, it will instead add it to a different one (and report that one) /alias key=value Will create a new alias, so each time key++ is used, it will instead do value++ This operation, sums the previous karma of key and value and stores it in value so no karma is lost Recursive aliases can be defined, so doing: /alias lettuce=vegetable /alias vegetable=food lettuce++ will give karma to food. Alias can be defined to groups of words so, it can be defined to have: /alias friday=tgif tfsmif friday++ will increase karma on tgif and tfsmif. /alias list Will show current defined aliases /alias delete key will delete a previously defined alias so each word gets karma on its own quote¶ /quote del id to remove a specific quote id from database

Language detection in @redken_bot

Miércoles 25 de marzo de 2020
Introduction¶ Before the move to Python3, redken had per-group language configuration by using i18n, with the upgrade/rewrite of Python3 code there were some issues and I had to remove the support, defaulting everything to English (most of the outputs where already in English so not a great loss). On another side, having to manually configure each channel could be problematic as most users just add the bot to their groups but don’t care about other settings that might be useful like welcome message, inactivity for kicking out inactive users, etc. Telegram’s approach¶ Initial version was added by expanding regular function that processes the Telegram-Server message to also take consideration of the user-indicated language and use that to store a new field in the database with the language, but that came with problems: Not all users had the language configured, so most times it was “” When talking on a group, the id was the group one, so if a user had language set to something and then other user wrote on the chat, it was just storing the ‘last used’ language interface. Python to the rescue¶ As the bot is written in Python, I did a quick search for language detection and found langdetect which is a port of a Java library to Python that can find certain words, etc in the texts and give some hint about the language. So, instead of using the almost-always-empty user defined language for the interface, it started using langdetect for getting the message language based on the text. This of course, solved on of the problems (no-configured language by users), still left the one on the ‘last-language-used’ and introduced a new one: langdetect does a guess based on common words, accents, characters, etc but it’s just that: a guess. The approach then was to use something that was introduced in @descuenbot and was described in this article: calculate averages based on prior count and new value. In this way, the language moved from being just a string to become a dictionary, storing count and lang: % values, for example: 1{"count": 272, "en": 2.2, "es": 75.36, "it": 3.74, "ca": 3.48, "fi": 2.3, "fr": 1.64, "pt": 1.73, "et": 0.97, "ro": 0.68, "de": 1.11, "hr": 0.68, "sw": 1.09, "tl": 0.96, "lt": 0.68, "sk": 1.22, "so": 1.16, "da": 1.18, "sv": 0.67, "tr": 0.58, "hu": 0.46, "vi": 0.43, "sl": 0.41, "no": 0.37} This is my status, from 272 messages, the library has detected Spanish 75% of times, plus some other messages. As you might infer, there are lot of languages listed there that I never used, so it’s really important to keep this values refreshing with higher message counts. For groups, this becomes even more interesting, as the message languages get updates for each user that speaks in the channel, giving ‘faster’, good results on the language being used: English group: 1{"count": 56, "tr": 1.79, "en": 80.36, "da": 1.79, "af": 1.79, "sl": 1.79, "ca": 1.79, "es": 1.79, "fi": 1.79, "nl": 1.79, "it": 1.79, "sq": 1.79, "so": 1.79} Spanish group: 1{"count": 140, "es": 61.42, "fi": 0.68, "ca": 1.46, "it": 5.72, "tr": 0.68, "sw": 1.46, "pt": 5.74, "so": 2.12, "en": 8.58, "pl": 0.68, "sv": 1.48, "hr": 0.68, "sk": 0.67, "cy": 3.58, "tl": 1.43, "sl": 0.68, "no": 1.44, "de": 0.69, "da": 0.7} Of course, before integrating this code into @redken_bot, I did a small program to validate it: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71from langdetect import detect import json # Add some sentences to an array to test text = [] text.append("It could be that your new system is not getting as much throughput to your hard disks as it should be") text.append("Il mio machina e piu veloce",) text.append("Je suis tres desolè",) text.append("El caballo blando de santiago era blanco",) text.append("My tailor is rich",) text.append("En un lugar de la Mancha de cuyo nombre no quiero acordarme",) text.append("Good morning, hello, good morning hello") text.append("No es cierto angel de amor que en esta apartada orilla no luce el sol sino brilla") text.append("Tears will be falling under the heavy rain") text.append("Que'l heure est il?") text.append("Caracol, col col, saca los cuernos al sol") # Create dictionary empty for this to work language = {} language["count"] = 0 # Process each line in text for line in text: # As we'll be iterating later over a dictionary, prepare updates in a different one updates = {} # Detec language in the line received language_code = detect(line) print(" ") print("Processing Line with detected language ", language_code, "|", line) updates["count"] = language["count"] + 1 # Check if we need to add key to language if language_code not in language: print("New key in language, preparing updates") # New language % is 100 over the total number of updates received before, so 100% for the first message in a group updates[language_code] = 100 / updates["count"] # Process each key we already had in language for key in language: # If the new language matches the one detected, give it a 100%, else, 0% , so that we work on % for each language if key == language_code: value = 100 else: value =0 # As we store message count in the same dictionary, we just skip it if key != "count" : print("Processing key %s in language for average updates" % key) updates[key] = float("{0:.2f}".format(language[key] + ((value - language[key]) / updates["count"]))) print("New average: %s for language %s" % (updates[key], key)) print("Updates: %s" % updates) language.update(updates) print(language) # Validate that final sum of % is close to 100% (consider rounding problems) accum = 0 for key in language: if key != 'count': accum = accum + language[key] print(float("{0:.2f}".format(accum))) # Dump the json of the final detected languages print(json.dumps(language)) Which, when executed, gives as final results: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26Processing Line with detected language fr | Que'l heure est il? Processing key en in language for average updates New average: 40.0 for language en Processing key it in language for average updates New average: 10.0 for language it Processing key fr in language for average updates New average: 20.0 for language fr Processing key es in language for average updates New average: 30.0 for language es Updates: {'count': 10, 'en': 40.0, 'it': 10.0, 'fr': 20.0, 'es': 30.0} {'count': 10, 'en': 40.0, 'it': 10.0, 'fr': 20.0, 'es': 30.0} 100.0 Processing Line with detected language es | Caracol, col col, saca los cuernos al sol Processing key en in language for average updates New average: 36.36 for language en Processing key it in language for average updates New average: 9.09 for language it Processing key fr in language for average updates New average: 18.18 for language fr Processing key es in language for average updates New average: 36.36 for language es Updates: {'count': 11, 'en': 36.36, 'it': 9.09, 'fr': 18.18, 'es': 36.36} {'count': 11, 'en': 36.36, 'it': 9.09, 'fr': 18.18, 'es': 36.36} 99.99 {"count": 11, "en": 36.36, "it": 9.09, "fr": 18.18, "es": 36.36} Conclusion¶ Above code was adapted to redken, so when a new user message was received, both the group when the user wrote a sentence and the user itself, got a new dictionary of languages detected. This approach, of using the ‘moving %’, just requires prior value for language and items count to calculate the new one reducing both the information needed to be stored to a minimum. In the future, when I’m adding back strings for languages, I can automate how redken reacts per channel (unless overridden) so that it provides messages in a more natural way for users. Enjoy!

English Game - Baker Street

Martes 24 de marzo de 2020
Introduction¶ Ian, our English teacher from Tailor-Made Communication has given to us this game. There are 5 buildings with consecutive numbers and some data to fill. A set of clues is given in order for the reader to deduct the data and to introduce some vocabulary. Fill-in table¶ Category 12 14 16 18 20 Name Marital status Pet Book Drink Clues¶ Miss Dudd owns a dog The woman at number 12 has two pets. A tortoise and a rabbit. The dog owner drinks beer. Mrs Evans is married. Mr Abraham is a widower, his neighbour is divorced. The married woman reads thriller The woman who likes coffee does not own a pet. There are five pets in Baker Street, a cat, a dog, a canary, a rabbit and a tortoise. The bachelor likes historical novels. Mr Abraham cannot read, he watches TV. The widower and the spinster like beer. Mrs Birt likes to read books by Charles Dickens. The whisky drinker owns a canary. The dog owner living next door to the bachelor is keen on love stories. Mr Charles lives between Miss Dudd and Mrs Birt The married woman drinks wine The pet at number 14 is a dog. Mr Abraham lives at number 20 The dog owner and the cat owner do not live next to each other Fold here Fold here Resolution¶ Category 12 14 16 18 20 Name Mrs Evans Dudd Charles Birt Abraham Marital status Married Spinster Bachelor Divorced Widower Pet Tortoise and Rabbit Dog Canary XXX Cat Book Thriller Love stories Historical novels Dickens Watches TV Drink Wine Beer Whisky Coffee Beer

Lego Creator Fiat 500 10271

Domingo 22 de marzo de 2020
Today, as part of my confinement I was building the Lego Fiat 500 🛒. I was not sure about it, but I liked a lot the building experience and the final result. debugger eval code:2:56 debugger eval code:2:56 debugger eval code:2:56 debugger eval code:2:56 debugger eval code:2:56 debugger eval code:2:56 debugger eval code:2:56 debugger eval code:2:56 debugger eval code:2:56 debugger eval code:2:56 debugger eval code:2:56 Hope you like it! Follow my channel on Telegram on Lego deals at https://t.me/brickchollo