Viernes 27 de marzo de 2015

Emerson Posadas

Emerson Posadas
toxickore BLOG

Pending: create a custom fact to retrieve the network UUID
Luis Armando Medina

Luis Armando Medina
Como Instalar Linux

Ubuntu 15.04 Beta Final Disponible

Canonical ha anunciado la disponibilidad de Ubuntu 15.04 Final Beta con nombre código "Vivid Vervet" y que incluye la ya tradicional gama de ediciones con los diferentes entornos de escritorio. Descarga las versiones Beta Finales Aqui. Continue reading
Julio Mayorga

Julio Mayorga

Lo que tenés que saber sobre Windows 10

Hay muchos rumores en internet acerca de esta nueva versión del sistema operativo. Muchas fuentes dicen que será free, pero no es tan gratuito como se imaginan…

Windows 10 será gratuito solo para aquellos que tengan instalado en sus máquinas Windows 8.1 o Windows 7 (Original) y que actualicen desde el mismo sistema operativo a la version 10.

El equipo de Microsoft pensó esto así para que fuese más fácil migrar a los usuarios a Windows 10.

A continuación algunas de las novedades de Windows 10:

  • El regreso del botón inicio

El nuevo inicio será una combinacion de Windows 7 con las baldozas del Windows 8 y Windows Phone.

  • Una única versión Multiplataforma.

Microsoft busca unificar todas las plataformas (PC, Movil, Tablet, Televisor) con un mismo sistema operativo que es el esperado Windows 10, el cual se adaptará a todo tipo de dispositivo al cual se lo quiera instalar.

A pesar de todo esto, Microsoft aún no ha especificado como serán las actualizaciones.


  • Aplicaciones Universales


Así como será multiplataforma, también tendrá una unica tienda de aplicaciones que será compartida entre todos los dispositivos las mismas aplicaciones. Es decir que las aplicaciones que tengamos en nuestra PC, tambien podremos tenerlas en nuestra tablet o telefono móvil.

  • Múltiple escritorios

Windows 10 tendrá una funcionaldad similar a la de Linux, la cual es tener multiples escritorios con procesos o tareas ejecutandose en cada uno de ellos.

A continuación un video con un review

Esperamos que les guste, y recuerden que esta nueva versión estará disponible a finales del 2015.

Jueves 26 de marzo de 2015

Luis Armando Medina

Luis Armando Medina
Como Instalar Linux

Como Descargar Gnome 3.16

Como grabar Gnome 3.6 y probarlo desde una USB live sin que tengas que instalar nada en tu equipo. Continue reading
Luis Armando Medina

Luis Armando Medina
Como Instalar Linux

Gnome 3.16 disponible y con muchas novedades

La nueva versión de GNOME 3.6 ha sido anunciada y lanzada, actualmente se encuentra disponible para probar esas novedades tan mencionadas y que puedes ver en este video. Miralo dentro del post. Continue reading
Óscar A. Parra V.

Óscar A. Parra V.
El Canibal » Geek


Mulaka: Pueblos Originarios es un juego en 3D inspirado en la comunidad Rarámuri creado por programadores chihuahuenses.
El Proyecto esta en Kickstarter y pretende recabar fondos para la creación del juego.

La historia, la música y los avances del juego prometen mucho.

Esperemos que llegue a lograr este proyecto de Lienzo Studio.

Miércoles 25 de marzo de 2015

Eduardo Ruiz Duarte

Eduardo Ruiz Duarte
beck's site

Homosexuality and evolution, an attempt of an a priori argument to end homophobia

What I am going to say here doesn't have any proof, and maybe is not entirely true, but is something I would like to propose as a conjecture, and I have thought for some time, I don't know the answers a priori, because I am not a professional in other areas in science and sociology, but maybe it could be a good theory and I propose a way to take the proof apriori with a possible argument, maybe you can refute it immediately, but the aim of this is to generate a consistent strong theory to avoid discrimination and homophobia.

In the next words when I say homosexual I will be referring to lesbians or male gays.


Lets start, some moments ago I was chatting with a friend, she told me that she has a 'friend' that was a complete retrograde, in the sense that she forbids completely the adoption between homosexuals, or that the best birth control system is god's word in your heart, I do not pretend to offend anybody but if you are going to make an argument trying to forbid or not approve you must have an a priori argument,  and not an argument based on a religious belief or a personal point of view, otherwise, you are imposing an idea like a dictator, making you retrograde.

What I am going to say is a possible-scientific reason to stop being an asshole, and maybe could be a good multidisciplinary work between mathematicians, sociologists, philosophers and evolutive biologists.

The next argument relies in the existence of models to measure situations in the nature, that proves that there is an equilibrium in the reproduction of species, interaction between species and natural resources consumption, this equilibrium is well modeled with five theories which I think are the bridges between mathematics, genetics, macro economy, evolutive biology and game theory, these models are described at the end of this post as an appendix, (Lotka-Volterra equations, Malthus model, logistic function, Nash equilibrium and Memetics).

The idea of this is provide a way to prove this:

Homosexuality is a consequence of evolution.

Development of the conjecture and possible proof:

The models of population growth in terms of natural resources and interaction between species tell us that the convergence of the population when $latex t\rightarrow \infty$ is 0 when the function representing resource consumption is increasing over time, this in common sense is obvious, but more important than obvious, is that it has a mathematical model to prove it, and this models are Malthus equation and Logistic equation.

Another important theory here is Darwinian evolution which occurs with natural selection meaning that the individuals that adapt better to their environment will spread their genes with more frequency because they will be healthier for more time, this better adaptation is done because of a random mutation that makes the individual better than the others in terms of survival circumstances.

Another fact is that there is an excess of population in terms of some resources, (see variable $latex K$ in the logistic equation at the end of this post), there are more humans that the natural resources can support, but this IS NOT because we are lacking of food (this is important to understand), this is because the economic model that prevails (capitalism) bounds this resources in terms of wealth, so there are MORE humans than resources in function of wealth and economy.

So, If you accept the last paragraph, then we can continue, I accept that the last paragraph is a problem that exists, I dont know why but I have an idea that can be wrong or bad, but the veracity of the next paragraph does no depend on the veracity of the original conjeture (is used only to give an idea of why there's an overpopulation)

Conjecture (independent of the original conjecture)
The population increases in function of the advances in medicine 

This may sound a little cruel, but we are trying to make science, not ethics.

With the advances of medicine, people that develops a mortal disease young due to a letal gene does not die and reproduces passing his/her lethal gene to the next generations, slowing down evolution, (note that there's no such thing as anti-evolution, evolution always goes up in terms of adaptation).

So, technology in medicine make us overpopulated, note that is easy to show that evolution occurs and there are examples of this, if there were not a treatment of wisdom teeth people would die of impacted teeth or infection at maybe a young age, making the population with wisdom teeth less and less over generations.

In the book Selfish Gene from Richard Dawkins, he mentions that a non ethical way to evolve faster will be to only permit child conception in the biological limit of age in order to permit the death generated by letal genes, and in consequence, more genetically healthy human beings.

Now, lets return to the original idea.

We know now (or at least I hope I could convince you) that there's an overpopulation in terms of some natural resource which at the same time is in function of the economic model, and that the persistence of humans even when "they have to die" makes harder the natural selection.

Now we are in a point where humans in order to win the battle of resources they first most prevail and the Nash Equilibrium (see the end of the post for details) tell us that there's a point over time when the players (humans) with mixed strategies in this battle will take the most efficient decision in terms of the best decisions of the other, which is the equilibrium, if we identify the capabilities of each player (human) we will be sitting in the Lotka-Volterra equations, when we will identify which is the predator and the pray in terms of the economic model.

This Equilibrium I claim is homosexuality, which is the most natural way to solve the overpopulation, and proving that homosexuality is a natural property of the genes, a mutation in the human DNA, just as the mutation of distinguishing frequencies in our eyes and not just amplitude (colors) which was a mutation that prevailed making evolution of our eyes

First questions of this argument with a possible answer

1) Gay people are not new, there are proofs they have been in society from centuries ago and we did not have overpopulation problems.

Possible answer:
Yes, gays have been in the society for centuries,

But what I claim is that overpopulation has been there too since centuries, and as I said before, not because there's not food... is because the overpopulation is in terms of the economic model, people cannot take an apple from a tree without taking it from somebody's territory (in most cases), so he/she has to pay to the wealthiest, this makes Malthus and Logistic model of population vs resources being in function of the capabilities of resource taking, so if this is true (Is a conjecture as I said) it justifies the same argument.

2) Darwinian Evolution confirms that the genes must be spreaded, and homosexuality is not spreaded with a homosexual couple (just in an artificial way which takes you to question 3).

Possible answer:
Darwinian evolution is proved to be at the level of particles (See Dawkins, first chapter of Selfish Gene), particles tend to form stable structures, and this structures tend to form particles that are self replicable, this is the principle of  evolution pre-life in the planet, and is proven using the primordial soup experiment which consists in the simulation of the condition of the early earth with methane, hidrogen and amonia in combination with lightening, in a period of time monomers will form, then polymers and then self-replicatation molecules, which are the predecesors of the DNA.
This same behaviour is the basis of Darwinian sociology where the concept of spreading the gene will be a cultural concept for the next generation.

3) Gays can use in vitro methods to procreate children or "rent female" wombs (in the case of male gays)

Possible answer:

For this I need to introduce a concept, Memetics

Memetics (Richard Dawkins work for a treatment):
Theory of mental content based on an analogy with Darwinian evolution, is an approach to evolutionary models of cultural information transfer where the unit transfer is a meme.

Darwinian sociology makes the adaptation, natural selection and gene spreading to be taken in a cultural level, and there it can be introduced the concept of memetics, and consider evolution something more complex in humans than just a biological facts because human are equiped with reasoning and a brain capable of thinking in complex dynamic situations.

Gay people can adopt, procreate artificially or not having children, gays are not capable of reproducing themselves, but when they adopt or procreate they spread the gene that makes them homosexual with a probability of 50%,  or in the case of adoption, memetics from Richard Dawkins can be used and they will spread the Meme (See Memetics), which partially answers the previous question and justifies their existence as an evolutionary individual capable of reproducing his/her genes and memes.

Direct consequences of this conjecture

Homosexuality cannot be a disease, or a "condition", in darwinian evolution a mutation that affects the species wont prevail, so homosexuality is a property in human beings making them a naturally evolved organism.

Personal conclusion

Homosexuality is the direct consequence of a future in society when the convergence is of not having men or women, gay or not gay, but having just individuals or human beings, making them the key to find an equilibrium as a specie.

Appendix of used arguments in the previous idea for interaction models for resources modeling in function of population and competition.

Nash Equilibrium
John Nash proved that in a game, (in this case the battle of resources between humans) with mixed strategies (this means that, if there are different set of specific rules to win a game, you can randomly change strategies to win a game) there's always a point of Nash equilibrium between the parts, this means that , if $latex A$ is compiting with $latex B$ , the Nash equilibrium is the point were $latex A$ has the best decision taking in consideration $latex B$ decisions in the evolution of the game, and the same with $latex B$, $latex B$ has the best decision in consideration of $latex A$

Lotka-Volterra Equations tell us the dynamics of two species, where one of this species is a predator of the other (the prey).

$latex \frac{dx}{dt}=\alpha x -\beta xy$
$latex \frac{dy}{dt}=\delta xy -\gamma y$

This equations tell us that if $latex x$ are the number of preys, and $latex y$ are the number of predators , $latex \frac{dx}{dt}$ and $latex \frac{dy}{dt}$ are the changes in population of each other over time $latex t$, $latex \alpha,\beta,\gamma,\delta$ are values that represent the interaction of the species in terms of statistical analysis via observation.

The solution is a function which will tell you what will happen over time with both species and this equations can be generalized to the interaction of more than two.

Malthus equation

Lotka-Volterra equations can be combined with this equation which tells you how the population of an species grow, and what Malthus proved is that is exponential over time.

$latex P(t)=\hat{P} e^{\lambda t}}$

Where $latex P(t)$ is the population at time $latex t$ and $latex \hat{P}$ is the initial number of individuals, and $latex \lambda}$ is a constant (what we want to convert in a function in this idea) that measures the interaction of this specie with their natural resources (or even with other individuals)

Logistic equation

An improved version of the last one is given when you can measure the MAXIMUM number of individuals $latex K$ that an environment can provide resources in a way that no individual will lack of food or a resource that is natural to their lives.

$latex \frac{dP}{dt}=\lambda P(1-P/K)$

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

Julio Mayorga

Julio Mayorga

SEO en WordPress

Hoy daremos a conocer uno de los mejores plugins para WordPress sobre SEO. Una de las ventajas que tiene esta herramienta, es que son varios plugins en uno solo. De esta forma, no debemos tener instalado el de Sitemaps, RSS Footer o Robots, entre otros, porque ya los trae integrados. Y mientras menos tengamos instalados, mas rápido cargará nuestro sitio.

A continuación un breve video que muestra algunas de las funciones de este plugin.

Una vez instalado podemos acceder al plugin por la parte superior del escritorio:

configurar_seo_wordpress_1O por el bloque de la izquierda:

configurar_seo_wordpress_2Para saber un poco más sobre como configurarlo, les facilitamos el siguiente video explicativo

Como ya hemos visto en entradas anteriores, es muy importante el SEO en nuestro sitio web hoy en día, es por esto que te aconsejamos leer nuestro artículo sobre SEO Orgánico o Natural.

Si tienen dudas o consultas sobre posicionamiento, no duden en escribirnos!

Julio Mayorga

Julio Mayorga

Chau IE, Hola Spartan!

Últimamente han rondado muchas noticias de que IE ya murió. Hoy en 123hosting les decimos que no es muy cierta esta noticia. Si bien IE muere como “Marca” el nuevo Windows 10 traerá como browser default a Spartan, que es un Internet Explorer modificado de arriba abajo.

Microsoft apuesta nuevas fichas a este navegador que comenzará a venir con Windows 10. Este nuevo browser trae algunas novedades que no tienen otros navegadores. Uno de estos cambios, es que tendrá un modo de lectura el cual organizará la página de tal forma que el usuario pueda leer mejor.

Otro de los cambios, es que contará con el apoyo de Cortana para poder hacer busquedas con comandos de voz.

Visualmente es un navegador mucho más cómodo y mejor ordenado. Con esto Microsoft busca borrar la mala fama que tuvo Internet Explorer.

Este nuevo browser, que por ahora tiene el nombre de “Proyecto Spartan” y que posiblemente cambie el nombre poco antes de su lanzamiento, será compatible en Windows 10 y sucesores, es por esto que no pueden deshacerse de Internet Explorer tan facilmente.

Con esta noticia rompemos el rumor de que muere IE, ya que quizás muera como marca, pero su esencia continuará!

Renich Bon Ciric

HowTo: Permanently redirect a request with parameter consideration in Tengine/NginX

Well, this one gave me a super hard time. I looked everywhere and found nothing. There is a lot of misinformation.

As usual, the Nginx and Funtoo communities helped me. Thanks to:

  • MTecknology in #nginx @ Freenode
  • Tracerneo in #funtoo @ Freenode

So, how do we do this? Easy, we use a map:

    # get ready for long redirects
    map_hash_bucket_size 256;
    map_hash_max_size 4092;

    # create the map
    map $request_uri $newuri {
        default 0;

        /index.php?test=1 /yes;

    server {
        listen *;
        root /srv/www/php/test/public;

        # permanent redirect
        if ($newuri) {
            return 301 $newuri;

        index index.php index.html;
        autoindex on;

        include include.d/php.conf;

        access_log /var/log/tengine/php-access.log;
        error_log /var/log/tengine/php-error.log;

So, basically, you want to use the $request_uri in order to catch the the uri with it’s parameters. I wasted all day figuring out why $uri didn’t have this. It turns out it discards the parameters… anyway.

This one was a hard one to find. Please, share and improve!


Lunes 23 de marzo de 2015

Ejercitate para jugar los clásicos de Atari

La compañía Atari, aquella que dominaba el mercado comercial de los videojuegos en los 70 y 80’s ha creado una app para ejercicios.

“Atari Fit” es el nombre de la aplicación que motiva al usuario a mantenerse saludable mediante el desbloqueo de juegos clásicos de Atari como “Pong”, “Super Breakout” y “Centipede”. Básicamente la aplicación te da 100 ejercicios y más de 30 planes de trabajo, entre más estés en forma más puntos ganaras, los cuales podrán ser usados para desbloquear estos juegos.

Esta app es gratis para descargar y fue desarrollada por 8BitFit, que se especializa en esta clase de aplicaciones, el ejecutivo en jefe, Fred Chesnais dijo:

Con Atari Fit, los jugadores alrededor del mundo, podrán ejercitarse y jugar así manteniendo una estrecha unión con estos dos pasatiempos


Y aunque parece ser que la app aún esta en desarrollo, basándome en experiencia personal y en la lectura de la retroalimentación, seria excelente que funcionara a la perfección lo más pronto posible.

¿Que piensan sobre esto? ¿Ejercitarse para jugar? ¡Escriban sus comentarios!

Fuente: Gamespot

Halo 5 usará servidores dedicados

La compañía “343 Industries”, subsidiaria de Microsoft que es encargada de la saga Halo, ha confirmado que las partidas serán solamente a través de servidores dedicados, así eliminando que un jugador haga de host.

Josh Holmes, productor ejecutivo del juego, respondiendo una pregunta ha dicho que las partidas que vayan por matchmaking, incluyendo las personalizadas, usarán un único servidor dedicado y no conexión entre jugadores, así la compañía quiere eliminar los problemas que han sucedido con esta clase de partidas, como la ventaja del host ante el lag siempre presente.

El reciente recopilatorio, Halo: The Master Chief Collection combinaba servidores dedicados para el matchmaking, usando conexión directa entre jugadores para partidas personalizadas y campañas online.

Y que aunque el Xbox One ha reducido dramáticamente la cantidad de retrasos durante el juego, esto parece indicar que podemos llegar a pensar que se eliminará del todo.

¿Que te parece? ¿Emocionado por esto?

Fuente: Vandal

Para ti.... mi pedacito de cielo

Si.. el reclamo es valido... :) pero lo prometido es deuda, aun que se que lo sabes, no esta por demas plasmar aqui, en este lugar donde desde hace mucho tiempo he escrito anecdotas y cosas de mi vida... me alegra que tu seas parte de ella y es por ello que ahora eres una parte muy importante de mi historia y quiero que sepas que de todas las historias y vivencias descritos en este muy humilde blog, sin lugar a dudas, tu eres lo mejor que me ha pasado, te quiero y te amo mucho mucho... 

Asi que ahora como eres parte de esto, tienes que aprender a linuxear :) y  le tienes que agarrar amor al cerro tambien..... jejeje es broma, Gracias, por todo lo bueno que le has traido a mi vida.

Te mando un Caluroso y cariñoso Beso :*

( mmmmm vente paka )

Sábado 21 de marzo de 2015

¿Que jugarás este fin de semana?

Por fin es viernes de nuevo. El trabajo y/o la escuela quedo atrás y ya es tiempo de relajarse.

En Celofans hemos tenido un montón de noticias durante esta semana, contenido vasto y variado para todos los gustos. Noticias agradables y otras no tan agradables.

Pero en lo que todo eso pasa por nuestro sistema es hora de tomar el control y comenzar el fin de semana, así que de nuevo les hago esta pregunta.

¿Que jugaran el fin de semana?

En vista de lo que acaba de acontecer con respecto a las Tortugas Ninja creo que jugare el clásico Turtles in Time para SNES. Le seguiré al Chrono Trigger que aún no acabo ese magnífico juego, y, si tengo algo de tiempo, unas retas de Mario Kart 8

¡Comenten que jugarán este fin de semana y déjenos sus ID’s para poder agregarlos en linea!

Viernes 20 de marzo de 2015

José Oviedo

José Oviedo

En sublime text 3 no puedo escribir acentos

He instalado Sublime text en linux (ubuntu 14.10) y no me permite escribir palabras acentuadas, siempre agrega la apostrofe al inicio de la palabra y no arriba de ella: Como por ejemplo: Jos´e.

La solución es modificar la configuración “Key Bindings” del SublimeText., para eso entramos a:

Preferences > Key Bindings – Users

Y pegamos el siguiente texto en el archivo de configuración, guardar y listo!!!!.

// missing accented characters fix for ubuntu 14.10

// a, [á, å, ä]
{ “keys”: [“´”,”a”], “command”: “insert”, “args”: {“characters”: “á”}},
{ “keys”: [“°”,”a”], “command”: “insert”, “args”: {“characters”: “å”}},
{ “keys”: [“¨”,”a”], “command”: “insert”, “args”: {“characters”: “ä”}},

// A, [Á, Å, Ä]
{ “keys”: [“´”,”A”], “command”: “insert”, “args”: {“characters”: “Á”}},
{ “keys”: [“°”,”A”], “command”: “insert”, “args”: {“characters”: “Å”}},
{ “keys”: [“¨”,”A”], “command”: “insert”, “args”: {“characters”: “Ä”}},

// e, [é, ë]
{ “keys”: [“´”,”e”], “command”: “insert”, “args”: {“characters”: “é”}},
{ “keys”: [“¨”,”e”], “command”: “insert”, “args”: {“characters”: “ë”}},

// E, [É, Ë]
{ “keys”: [“´”,”E”], “command”: “insert”, “args”: {“characters”: “É”}},
{ “keys”: [“¨”,”E”], “command”: “insert”, “args”: {“characters”: “Ë”}},

// i, [í, ï]
{ “keys”: [“´”,”i”], “command”: “insert”, “args”: {“characters”: “í”}},
{ “keys”: [“¨”,”i”], “command”: “insert”, “args”: {“characters”: “ï”}},

// I, [Í, Ï]
{ “keys”: [“´”,”I”], “command”: “insert”, “args”: {“characters”: “Í”}},
{ “keys”: [“¨”,”I”], “command”: “insert”, “args”: {“characters”: “Ï”}},

// o, [ó, ö]
{ “keys”: [“´”,”o”], “command”: “insert”, “args”: {“characters”: “ó”}},
{ “keys”: [“¨”,”o”], “command”: “insert”, “args”: {“characters”: “ö”}},

// O, [Ó, Ö]
{ “keys”: [“´”,”O”], “command”: “insert”, “args”: {“characters”: “Ó”}},
{ “keys”: [“¨”,”O”], “command”: “insert”, “args”: {“characters”: “Ö”}},

// u, [ú, ů, ü]
{ “keys”: [“´”,”u”], “command”: “insert”, “args”: {“characters”: “ú”}},
{ “keys”: [“°”,”u”], “command”: “insert”, “args”: {“characters”: “ů”}},
{ “keys”: [“¨”,”u”], “command”: “insert”, “args”: {“characters”: “ü”}},

// U, [Ú, Ů, Ü]
{ “keys”: [“´”,”U”], “command”: “insert”, “args”: {“characters”: “Ú”}},
{ “keys”: [“°”,”U”], “command”: “insert”, “args”: {“characters”: “Ů”}},
{ “keys”: [“¨”,”U”], “command”: “insert”, “args”: {“characters”: “Ü”}},

// y, [ý, ÿ]
{ “keys”: [“´”,”y”], “command”: “insert”, “args”: {“characters”: “ý”}},
{ “keys”: [“¨”,”y”], “command”: “insert”, “args”: {“characters”: “ÿ”}},

// Y, [Ý, Ÿ]
{ “keys”: [“´”,”Y”], “command”: “insert”, “args”: {“characters”: “Ý”}},
{ “keys”: [“¨”,”Y”], “command”: “insert”, “args”: {“characters”: “Ÿ”}}

Lo que hace esta configuración es detectar el apostrofe + la letra y convertirla a la letra con acento.

Alcance Libre: Nuevo documento: Introducción al sistema de archivos XFS.

Jueves 19 de marzo de 2015

Emerson Posadas

Emerson Posadas
toxickore BLOG

Maintain known_hosts file with a puppet class

Each time an ssh client gets connected to another ssh remote host, a known_hosts file is generated or updated based on the remote host public key.

The purpose of this file is well explaines on the following link:

Let's say that we have a network with 100 servers and each time we add another server to this network all the machines need to update the known_hosts file with the new public key. 

First step: ask the new machine for it's public key with ssh-keyscan:

# ssh-keyscan localhost/remotehost
# localhost SSH-2.0-OpenSSH_5.3
localhost ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAygRKDjzHw1a1L79f5rNaGlqPUDndZv9KhtZPG2MYrUrU/9NiBOiVDWwllUwWXQkLY3fhdTVncjGfzn4oc09876J3uXZJaNWr0PZpD8S7Y6+50iZWYVA0fTM0j32WdD3MMfJjCtrXo+/gDx9+XiQPXlWqkuy5L5PRIvjIzVeZwL6BDDalmQXx3Jw5QcfQn9Bc7m+Bw7ZO80mxnFnKH5zZa8jdjd6XPSLXN0Q+5UlvZ5o5hxaFA+4ywtvKbF6avlQj5rm9+6kGUkVLIZRVw+lkkGqSixsTMGC3mZURH2s38UB1OjHXQSW8DP/mImcAAQWB3V5JDHbswee99C8CU6ekcw==

And manually append the output to your ssh_known_hosts/known_hosts file in the proper format (man ssh-keyscan):

     Output format for rsa1 keys:

     host-or-namelist bits exponent modulus

     Output format for rsa and dsa keys:

     host-or-namelist keytype base64-encoded-key

     Where keytype is either “ssh-rsa” or “ssh-dss”.

Distribute this file with a puppet class on your nodes and you won't be prompted again to add this new key into your known_hosts/ssh_known_hosts file at the first login attempt. 

For sure this is far from perfect, but solves the problem in a short time. 
Alcance Libre: Nuevo documento: Introducción a SystemD.
Héctor Bautista

Héctor Bautista
Soy un Jedi » Gnu/Linux

Admin CFDI en Debian

¿Qué es Admin CFDI?

Es una herramienta para descargar facturas CFDI desde el SAT (tanto emitidas como recibidas), de uno o más correos electrónicos, organizar, validar y reportar facturas CFDI desde directorios.

Los creadores son de Factura Libre que vienen desarrollando esta poderosa herramienta desde hace ya un tiempo.

Tomado de la página del proyecto:

Esta herramienta te permite realizar las siguientes acciones:

  • Descargar facturas (CFDI) emitidas o recibidas directamente del SAT.
  • Descargar facturas (CFDI) recibidas de uno o más correos electrónicos.
  • Organizar las facturas (CFDI) en carpetas por emisor o receptor, año y mes.
  • Generar PDFs de facturas (CFDI) usando una plantilla ODS de Calc de LibreOffice
  • Generar un reporte de facturas (CFDI), así como validar los sellos y su estatus en el SAT

El desarrollo y últimas versiones del proyecto se están llevando en Github.


  • Python 3.4
  • Tk si usas Linux, si usas Windows ya lo integra Python
  • Firefox para la automatización de la descarga del SAT
  • Selenium para la automatización de la descarga del SAT
  • PyGubu para la interfaz gráfica.
  • ReportLab si usas una plantilla JSON (por implementar)
  • LibreOffice si usas la plantilla ODS
  • Extensiones win32 para Python si usas Windows

Tanto en la página del proyecto como en el sitio del buen Linuxman, encontrarán información para la instalación de lo necesario para que funcione.

En el caso particular de Debian, viene Python 2.7 por default, así que es necesario instalar los paquetes necesarios para que funcione.

root@kenobi:/home/hbautista# aptitude install python3-tk python3-pip python3-uno

Hay que tener instalado LibreOffice y Firefox además de los paquetes que se acaban de instalar. Una vez instaladas las dependencias, procedemos a instalar con pip, selenium y pygubu:

root@kenobi:/home/hbautista# pip3 install selenium pygubu

Tanto la instalación de paquetes con apt-get o aptitude, como los que se instalan con pip3, debe hacerse como root.

Descargar versión más reciente de producción: AdminCFDI v0.2.2 (567).

Como usuario normal, procedemos a ejecutar Admin CFDI en el directorio en dónde hayamos extraído el contenido de AdminCFDI:

hbautista@kenobi:~/AdminCFDI_v0.2.2$ python3

Admin CFDI 1Admin CFDI 2

Y eso sería todo

Agradecimientos a Factura Libre y a Linuxman por la ayuda prestada.

Notas relacionadas:

The post Admin CFDI en Debian appeared first on Soy un Jedi.

Miércoles 18 de marzo de 2015

Alcance Libre: Te asesoramos para poner tu aviso de privacidad.

Stoping spam with postfix

Well Ihad some small troubles with spamers on postfix I found some commands to parse logs and get the user.
Sometimes the user password was compromised, we need search the users what is sending spam like:

zgrep 'sasl_method'  /var/log/mail.log* | grep "postfix/smtpd" | awk '{print $9}' |  sort -n | uniq -c | sort -n | tail

that return is


Wow i see that two users login alot of times with the mailserver. That users are sending spam!

Lets check the ips was autheticating:

zgrep $1  /var/log/mail.log* | grep "postfix/smtpd"| grep  -v reject | awk '{print $7}' |uniq -c | sort -n | tail

127 client=unknown[],
127 client=unknown[],
127 client=unknown[],
134 client=unknown[],
136 client=unknown[],
137 client=unknown[],
137 client=unknown[],

that ips are very strange, lets check the country from comes with whois or with geoiplookup

GeoIP Country Edition: UA, Ukraine

That ip is not from mexico lets ban with this script:

    BADIPS=$(egrep -v -E "^#|^$" blocked.ips)

    # create a new iptables list

    for ipblock in $BADIPS
    $IPT -A $SPAMLIST -s $ipblock -j LOG --log-prefix "$SPAMDROPMSG"
    $IPT -A $SPAMLIST -s $ipblock -j DROP


Lunes 16 de marzo de 2015

Eduardo Ruiz Duarte

Eduardo Ruiz Duarte
beck's site

Intuición en transformada de Fourier discreta y correlaciones entre señales

Me he visto en la necesidad de ocupar un poco de análisis de Fourier, y ahora se está poniendo de moda mucho usar Fourier en teoría de Números como es en uno de los problemas del milenio, que es la conjetura de Goldbach que dice que todo número par mayor que 2 puede expresarse como suma de dos números primos.

Harald Helfgott decidió probar la conjetura de Goldbach débil (todo impar mayor que 5 es suma de 3 primos) hace un par de años usando teorema de Convolución, esto es algo muy de teoría de análisis complejo y real, y yo no me imaginaría que la solución fuera por aquí, el teorema de la convolución generalmente se usa en el contexto de señales y Análisis de Fourier, en otro momento lo expondré aquí, la explicación sencilla de Helfgott y su solución aquí.

Yo no soy experto en Fourier, pero lo he usado para varios proyectos y me interesa mucho, les expongo aquí una manera intuitiva de entender la transformada de Fourier discreta.

La Transformada de Fourier trasforma una función periódica en otra función en el espacio de frecuencia, es decir, busca otra representación de la función en términos de combinaciones lineales de otras funciones, en este caso senos y cosenos, como algunos sabrán, toda función se puede aproximar por senos y cosenos por partes, estos coeficientes de senos y cosenos que arman la función original son la información de la transformada de Fourier de una función $latex f$.

$latex \hat{f}(\psi)=\int_{-\infty}^{+\infty}f(t)e^{-2\pi it\psi}dt$

donde su inversa está dada por

$latex f(t)=\int_{-\infty}^{+\infty}\hat{f}(\psi)e^{2\pi i\psi t}d\psi$

Donde $latex t$ es el tiempo y $latex f(t)$ es el valor de la señal en el tiempo $latex t$,  $latex e^{2\pi i t}=cos(2\pi t)+isen(2\pi t)$ y $latex \psi$ es el valor de frecuencia.

La teoría aquí es muy bonita, pero también muy complicada, así que nos adentraremos en la parte discreta

Transformada de Fourier discreta.

La transformada de Fourier discreta (TFD) es un funcional (una función de funciones) que toma como argumento una función $latex f$ que es una señal en el tiempo y te regresa otra función $latex \hat{f}$ que contiene la información de la frecuencia en la señal original.

Para términos prácticos, una señal será sólo una sucesión de números, por ejemplo:

$latex \tilde{f}=\lbrace 1.9, -3.1, 12.3,4.8,22.9,-13.2, 11.8,4.8,-0.3 \rbrace$

Dónde $latex \tilde{f}(n)$ es el valor $latex n-$ésimo comenzando por el $latex 0$, $latex \tilde{f}(0)=1.9$

Le pongo tilde porque queremos trabajar con otra versión de esta señal que ahora explico.

Señales de promedio cero

Queremos comparar señales, para ello necesitamos trabajar con las señales "normalizadas" , en el sentido que si vamos a correlacionar $latex f$ con $latex g$ , una correlación "0" nos indique que son totalmente diferentes, para esto, sólo basta con trabajar con las señales "centradas" en su promedio y basta con restar a cada coeficiente el promedio de la señal en el intervalo de tiempo, si repitiéramos esto en la señal verían que el promedio de la señal ya sería 0 y no habría nada que restar, por eso le llamo "normalización" , en el caso del ejemplo, vemos que el promedio es $latex 4.6$ por lo que la nueva señal quedaría.

$latex f=\lbrace -2.7,-7.7,7.7,.2,18.3,-17.8,7.2,.2,-4.9 \rbrace$
La cual tiene promedio 0.

Correlación entre dos señales

Ahora, ¿cómo comparo dos señales normalizadas $latex f$ y $latex g$?

La manera más usual para señales discretas de tamaño $latex N$:

$latex \displaystyle \sum_{i=0}^N {f(i)g(i)}$

Si se fijan, gracias a la normalización tenemos las señales centradas en su promedio, por lo que si esta suma da 0 nos indicaría que no se parecen nada, ya que si $latex f(i)g(i)\geq 0$ es porque ambos valores tienen el mismo signo $latex f(i)g(i)\leq 0$ nos indicaría que difieren en signo y son "muy diferentes" , las sumas se van a ir acumulando positivamente si no hay estos cambios de signo, por lo que indica que entre más grande sea el número de la suma, más grande es la correlación siendo el máximo de correlación la suma de cuadrados de cada señal, si es un número muy grande negativo indicará que están inversamente correlacionadas (no se cancelan con los positivos) , y si es 0 , es porque las correlaciones siempre se "matan" entre negativas y positivas (no hay correlación).

Aquí dejo como se ven dos señales correlacionadas y no correlacionadas.

Para que esta medida tenga sentido, recuerden que tienen que normalizar ambas señales.

Ahora, entonces, si recuerdan, la transformada de Fourier, se multiplica la función por una exponencial compleja, es decir, están correlacionando la función con una exponencial compleja que al final son senos y cosenos, es decir... están comparando la función con senos y cosenos, y viendo qué tanto se parecen en cierto tiempo $latex t$.

La transformada para tiempo discreto $latex n$ de Fourier para una señal $latex f$ de $latex N$ valores en el tiempo se define como:

$latex F(k):=\displaystyle \sum_{n=0}^{N-1} {f(n)e^{{-2\pi i kn}/N}}$ donde $latex k\in \lbrace 0,...,N-1\rbrace$

Para cada $latex k$ obtenemos un coeficiente de Fourier, hasta ahora... creo que vamos bien, no es difícil en términos prácticos, pero ... qué es correlacionar con la exponencial compleja esa? , se ve feo y raro, pero no, recuerden que.

$latex e^{-i\theta} = cos(\theta)-isen(\theta)$ 

Entonces realmente tenemos que:

$latex F(k):=\displaystyle \sum_{n=0}^{N-1} {f(n)(cos({2\pi kn}/N) - i sen({2\pi kn}/N))$ 
$latex F(k):=\displaystyle \sum_{n=0}^{N-1} {f(n)cos({2\pi kn}/N)}-i\displaystyle \sum_{n=0}^{N-1} {f(n)sen({2\pi kn}/N)}$

Tenemos que para $latex k$ hay una función diferente.

El juego de signos es por las propiedades de paridad del seno y coseno.

Entonces lo que tenemos aquí es que la transformada de fourier realmente guarda la información en senos y cosenos que es lo que dijimos al principio (para eso se usa la exponencial) , es decir correlaciones con ambos tipos de sinusoides, y el usar la parte compleja, tiene un significado tan simple, como el hecho de hacer "linealmente independientes" a las correlaciones, ya que al final lo que nos interesará será el número real que multiplica a la parte imaginario, y no per sé la $latex i$ de análisis complejo (al menos no en este caso).

¿De qué nos sirve?

Veamos un ejemplo, supongamos que tenemos la siguiente señal $latex x(n)$ con 100 sampleos de tiempo, es decir $latex N=100$

En este caso los coeficientes para cada seno y coseno definido por $latex k$ los denotaremos como $latex X(k)$, es decir.

$latex X(k)=\displaystyle \sum_{n=0}^{N-1} {x(n)cos({2\pi kn}/N)}-i\displaystyle \sum_{n=0}^{N-1} {x(n)sen({2\pi kn}/N)}$

Para $latex k=0$ tenemos que $latex \displaystyle \sum_{i=0}^{N-1}x(n)$ 

Es decir solo es la suma de los valores de la señal ($latex sen(0)=0$ , $latex cos(0)=1$) 

Por lo que $latex X(0)\cong 0$ ya que la señal está normalizada y tiene promedio 0.

Para $latex k=1$ tenemos la siguiente información de cada sumando de la serie la transformada de fourier.

Como pueden ver en la gráfica b) y c) que la $latex X(1)=1+0i$  , es decir, no se parece nada la señal $latex x(n)$ en azul a la negra y roja tanto en seno como en coseno, pueden ver en b) , sin ser muy rigurosos en la siguiente oración: "la mitad de la señal está arriba del 0, y la otra mitad abajo" por lo que la correlación dará 0, lo mismo con c), también se cancela al sumarse sus valores. es decir, no se parecen (recuerden que b, respectivamente c) es la parte (real respectivamente compleja) de $latex X(1)$.

Ahora, veamos que pasa en $latex k=3$

Aquí vemos en $latex k=3$ que el seno con la señal  en c) tiene gran parte positiva, y poco negativo... 
por lo que la correlación nos indicará que es grande (no se cancela con negativos en la función original) y si ven en a) , pueden ver que el seno en negro en esa $latex k$ "asemeja" a la función $latex x(n)$ mientras que el coseno realmente no se parece en nada, nunca coincide con $latex x(n)$... y de hecho $latex X(3)=0+49i$.

Realmente lo que estamos buscando aquí en la transformada de Fourier, es cuando una senoidal se parece a la función original... y qué creen? , ya la encontramos, 

La gráfica de esta transformada de fourier se ve así para $latex k=1...20$

Como pueden ver, la transformada de Fourier, nos dice que $latex X(10)$ en el coseno se parece mucho a la función $latex x(n)$  y en $latex k=3$ tenemos que $latex X(3)$ en la parte imaginaria el seno se parece mucho a la función original, es decir hay correlación alta por ejemplo en el coseno con   $latex cos(\pi t/5)$.

Pero bueno Si quiere ver todo de golpe, sin importarles si es seno y coseno (al final ambas funciones son la misma solamente recorridas) , pueden calcular su densidad espectral para cada valor $latex k$ la cual les dirá si hay sinusoides presentes en la señal la cual se define como

$latex DS_{k}(x)=\mathfrak{R}(X(k))^2 + \mathfrak{I}(X(k))^2$

Que es la suma de los cuadrados de la parte real e imaginaria de la transformada de Fourier para cada $latex k$

Por lo que en este ejemplo, la gráfica de la densidad espectral que ya carece de parte imaginaria, junta toda la información (aunque se pierde de qué tipo de sinodal viene, pero esto es fácil deducirlo)

Aquí pueden ver perfectamente que en $latex k=3$ y en $latex k=10$ existen sinusoides interesantes muy correlacionadas con la señal, 

Mucho se habla de Frecuencia, para esto, lo más popular es usar Hz , es decir "cosas que suceden en un segundo" , y para transformar la $latex k$ en Hz , basta decidir "cada cuanto sucede un suceso" a este número llamale $latex r$ , uso $latex r$ porque es de "sampling rate" , y tenemos que en Hz, la frecuencia es $latex \xi=kr/N$ donde $latex N$ es el número de samples, o el número de valores en tu tiempo discreto, entonces ya pueden sustituir la $latex k$ por la frecuencia $latex \xi$.

Espero les haya servido como a mi, las imágenes las saqué de este sitio 

Aquí les dejo del mismo sitio los valores de la señal $latex x[n]$ en el ejemplo.

1.000000, 0.616019, -0.074742, -0.867709, -1.513756, -1.814072, -1.695685, -1.238285, -0.641981, -0.148568, 0.052986, -0.099981, -0.519991, -1.004504, -1.316210, -1.277204, -0.840320, -0.109751, 0.697148, 1.332076, 1.610114, 1.479484, 1.039674, 0.500934, 0.100986, 0.011428, 0.270337, 0.767317, 1.286847, 1.593006, 1.522570, 1.050172, 0.300089, -0.500000, -1.105360, -1.347092, -1.195502, -0.769329, -0.287350, 0.018736, -0.003863, -0.368315, -0.942240, -1.498921, -1.805718, -1.715243, -1.223769, -0.474092, 0.298324, 0.855015, 1.045127, 0.861789, 0.442361, 0.012549, -0.203743, -0.073667, 0.391081, 1.037403, 1.629420, 1.939760, 1.838000, 1.341801, 0.610829, -0.114220, -0.603767, -0.726857, -0.500000, -0.078413, 0.306847, 0.441288, 0.212848, -0.342305, -1.051947, -1.673286, -1.986306, -1.878657, -1.389067, -0.692377, -0.032016, 0.373796, 0.415623, 0.133682, -0.299863, -0.650208, -0.713739, -0.399757, 0.231814, 0.991509, 1.632070, 1.942987, 1.831075, 1.355754, 0.705338, 0.123579, -0.184921, -0.133598, 0.213573, 0.668583, 0.994522, 1.000000

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

Domingo 15 de marzo de 2015

Gunnar Wolf

Gunnar Wolf
Gunnar Wolf

Crowdfunding call: "Natura" short film

My good friend Felipe Esquivel is driving a crowdfunded project: the first part of the "Natura" short film. I urge every reader of my blog to support Felipe's work!

Felipe, the director for this project, is a very talented Chilean-Mexican animator. He has produced short animated films such as A duel and One fine day.

Not only that: It might be interesting for my blog's readers that a good deal of the work of Chamán Animation's work (of course, I am not qualified to state that "all of" their work — But it might well be the case) is done using Free Software, specifically, using Blender.

So, people: Go look at their work. And try to be part of their work!

Itzcoalt Alvarez Moreno

Itzcoalt Alvarez Moreno
Itzcoalt (itz) Álvarez

La familia y el desarrollo profesional de sus integrantes

Sin duda alguna la familia juega un papel importante en el desarrollo personal y profesional de sus integrantes, en el núcleo familiar,los hijos no solo copian los patrones  de conducta de sus padres, si no que en base a las facilidades que estos otorgan, es posible tener un excelente desempeño o  un fracaso total.

Los limites que muchas veces tenemos, nos han sido fijado por nuestra familia de manera directa o indirecta, y dependiendo de nuestro desarrollo, logramos la independencia en la toma de decisiones.

Normalmente,  ante una disyuntiva importante, buscamos el consejo de nuestros padres, y normalmente valoramos fuertemente esta opinión.

He conocido casos que pueden estar en los extremos, en donde personas ya entradas en sus 40tas, deben someter sus acciones y decisiones a la aprobación de sus padres, que normalmente ejercen una control total sobre su hogar y sobre todo lo que en el sucede, aun cuando sus hijos hayan salido del seno familiar, la influencia continua.


Como padres, debemos ofrecer la seguridad necesaria para permitir que nuestros hijos tomen los riesgos (calculados) que ellos deseen, que sean responsables de sus acciones y sobre todo, que comprendan que estamos para apoyarlos, no para resolverles la vida.

Debemos ofrecerles una plataforma que les permita un desempeño libre de vicios y de temores fundados normalmente por nuestros propios temores, finalmente, ellos deben vivir su propia vida y tener su propio futuro.

Siempre debemos pensar, si los controles, o si la falta de estos pueden provocar algo no esperado en el desarrollo de nuestros hijos.


Cada caso es diferente, y debe ser evaluado de manera independiente, y nosotros debemos tener la mente abierta para identificar o aceptar cuando estamos entrando en excesos,


Viernes 13 de marzo de 2015

LibreOffice Styles Tutorial

LibreOffice Styles Tutorial (click to download)

LibreOffice Styles Tutorial

I wrote a small-and-quick tutorial for using LibreOffice Styles. It is intended to quickly let you understand (and hopefully grasp) the concepts behind the use of Styles without having to go through an entire manual.

It briefly covers and exemplifies the notion of Paragraph and Character Styles, Direct Formatting, automatic table of contents generation and chapter rearrangement through the Navigator.

Styles can do much more than explained in the tutorial, but it should get you started saving a significant amount of time.

Download it by clicking on the image or from here: /files/libreoffice-styles.odt

Martes 10 de marzo de 2015

Emerson Posadas

Emerson Posadas
toxickore BLOG

Puppet: estructura de un módulo y como invocar a sus clases

Dicen que es de sabios cambiar de opinión, pero también es de idiotas permanecer aferrados. Como sea, ahora que he estado aprendiendo algo de puppet, he tenido que generarme algunos módulos para hacer algunas tareas básicas de configuración en mis nodos. Para lo que es bueno recordar las siguientes referencias; basado en mi siguiente estructura de directorios:

# tree
└── base
    ├── files
    │   ├── hosts
    │   ├── motd
    │   └── vimrc
    ├── manifests
    │   ├── hosts.pp
    │   ├── init.pp
    │   ├── motd.pp
    │   └── vimrc.pp
    └── tests
        └── init.pp

4 directories, 8 files

Tendría que llamar a las clases de la siguiente manera:

# cat ../manifests/site.pp
node 'foo-host' {
        include base::hosts

node 'default' {
        include base::motd
        include base::vimrc
        include base::hosts

Lunes 09 de marzo de 2015

Fco. de la Torre Inguanzo

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

Control remoto para Kodi XBMC

Con el tiempo he instalado algunos addons pero nunca un control remoto para Kodi (anteriormente XBMC) que es para mi gusto, la cereza en el pastel de este programa multimedia.


Después de buscar un poco encontré a Yatse que en mi corta búsqueda no me quedaron ganas de probar otra aplicación, Yatse lo hace todo y lo hace bien. Es de esas pocas veces que le atinas a la primera a la aplicación que estas buscando.

Controles generales de yatse

Controles generales de Yatse

Configuración de Kodi/XBMC

Para poder controlar Kodi es necesario activar primero una opción. Hay que ir al menú SistemaAjustesServiciosServidor Web y activar la opción que dice Permitir controlar Kodi via HTTP. Se pueden personalizar algunos parámetros, pero con eso es suficiente.

Activando el control por servidor web.

Activando el control por servidor web.

Lo primero que hace Yatse después de instalarlo es intentar localizar a Kodi y darlo de alta. Si no lo dan de alta en este momento pueden agregarlo posteriormente en el menú de ajustes en la sección de Media Centers.

Listado de media centers

Listado de media centers

Todo desde tu teléfono.

Yatse tiene todo tipo de controles por categoría, ya sean Películas, Videos, Música, Imágenes, un control de dirección para navegar por los menús, un teclado para las búsquedas, vamos, hasta tiene un “touchpad” si se nos hace más cómodo. Control de volumen, Mute, muestra la información del archivo que estamos viendo en ese momento. ¡Hasta se pueden descargar los subtítulos!

Reproducción de películas

Muestra la información básica de la película y sus controles.

Se pueden dar de alta varios sistemas de Kodi y se seleccionan desde la pantalla principal. No se como pude vivir tanto tiempo sin él.

Si saben de alguna otro programa para android que sea mejor no duden en recomendarlo en los cometarios.

The post Control remoto para Kodi XBMC appeared first on LINUXMANR4.

Viernes 06 de marzo de 2015

Renich Bon Ciric

CFDI y FOSS @ México

Bueno, de la manera más informal y no oficial, me gustaría escribir el primer artículo; presumo, sobre admin-cfdi.

Es un proyectito que están escribiendo unos batos locos del D.F. y de PythonCabal; así como de otros lados. Una colaboración como pocas que han habido en PythonCabal por lo menos.

En todo caso, qué es el mentado admin-cfdi? Es un administrador de CFDI; escrito en Python. Tengo entendido que va a ser parte de algo más grande pero, por lo pronto, están escribiendo ésto.

Recientemente, me platican, están re-escribiendo algunas cosas. Por ejemplo, van a usar el módulo request en vez de usar selenium (phew!) para hacer la descarga. Bastante bueno, el rollo.

Si quisieses apoyar, pues tuvieses que caerle a las reuniones semanales, que son los Miércoles, creo. Únete a la lista de correo de PythonCabal o, de plano, checa la wiki e infórmate.

También, en un googlazo, me econtré con varios otros proyectos que andan haciedo lo meeeeesmo! A webo!

Bien por ellos y nosotros!

Lunes 02 de marzo de 2015

Gustavo Rubio

Gustavo Rubio
Ahí vamos

That javascript framework was so this morning (and so was that problem)

Una de las cosas que un ingeniero disfruta (o debería) es solucionar problemas, es una actividad naturalmente atractiva para quienes deciden dedicarse a esta fina profesión. Esa misma curiosidad nos hace constantemente buscar otros desafíos.

Particularmente, en el desarrollo de software, buscar soluciones a problemas pequeños es una constante que usualmente nos mantiene entretenidos y ocupados sin embargo, es común que nos bloqueemos al grado de no querer continuar con nuestro trabajo, una especia de “Sindrome de bloqueo del escritor

¿Por qué perdemos el interés en la tarea actual, el proyecto o a veces nuestro empleo?

A todos nos ha pasado: estamos horas tratando de resolver un problema, diseñar un algoritmo, el programa no compila o no corre, en fín, infinidad de obstáculos que después de una cantidad razonable de tiempo se vuelven tediosos y nos aburren. Algunos se levantan de su escritorio a caminar y pensar un poco, otros van a la tienda por una coca, otros se fuman un cigarro… después regresamos a nuestro escritorio con la mente un poco más despavilada a tratar de solucionar el problema.

Otros, como yo, simplemente necesitamos un poco de concentración. A mi particularmente me ayuda estar solo, sin ruido. Es común que mientras trabajo no esté escuchando música como muchos de mis compañeros lo hacen, yo lo relaciono con mi poca capacidad de multitasking (aunque honestamente, no creo que ningún ser humano sea capaz de hacer varias cosas a la vez, o no bien al menos) incluso me es a veces necesario aislarme por completo sin presencia de nadie para poder pensar en la solución más adecuada a un problema, como Sherlock con su “palacio mental“.

El aburrimiento

Estar aburridos creo que es la principal causa de bloqueo u obstáculo para solucionar un problema y tiene todo el sentido del universo, es decir, si no estamos cautivados por lo que nos encontramos haciendo en este mismo instante, es decir, sumamente interesados ¿Cómo nó vamos a estar aburridos? Aunque en este caso el estar aburrido creo es la consecuencia y no la causa, además, estar aburrido es una de las cosas mas naturales y humanas que podemos experimentar los homo sapiens. Osho, conocido (y controvertido) gurú hindú, comentaba en una de sus entrevistas:

No animal is ever bored. Look at a buffalo, chewing grass, the same grass every day, sitting and chewing and chewing, never bored. You may get bored looking at her: she is not bored. No animal is ever bored, you cannot bore an animal. Too thick, too dense a mind -how can you bore? For boredom a very, very high sensitivity is needed, the higher your sensitivity the higher will be your boredom, the more will be your boredom.

Los humanos tenemos una sensibilidad profunda y somos emocionales lo cual fomenta cambios de ánimo, como el estar aburrido y contrario a ser algo negativo es un indicador de que somos seres que razonamos y buscamos adquirir conocimiento constantemente, hasta el día de nuestra muerte.

Estar aburridos, insisto, sería una consecuencia y no una causa.


Obviamente lo primero que se nos viene a la mente son las redes sociales, el teléfono, etc. Aunque conozco muchos colegas que se distraen fácilmente con estos, llamemosle “artefactos“, hay quienes aun sin este tipo de distracción pueden perder el interés. Existen otros detonantes para distraernos de nuestro trabajo ya sean problemas personales, familiares, deudas, el resultado del partido del domingo, un viaje, etc. Creo que todos estos distractores los conocemos bien y no son específicos de nuestra profesión sino de cualquier persona que no sepa hacerse responsable de su trabajo.

Existen otros distractores, sin embargo, que hacen que nos enfademos de nuestro trabajo y que curiosamente los tenemos todo el tiempo entre nosotros, están escondidos ahí, como soldados aqueos en un caballo de madera.

A los primeros les llamaría yo distractores “naturales”, es decir, vienen de paquete con el hecho de que somos humanos y que necesitamos “despavilarnos” de cuando en cuando. El uso (y abuso) de los mismos es responsabilidad de cada individuo: hay trabajadores huevones que siempre buscarán un pretexto para no hacer bien su trabajo y hay otros que simplemente necesitan un “break” e independientemente del tiempo “fuera” cumpliran sus metas.

Al segundo tipo de distractor les llamo “artificiales” porque de alguna manera los desarrollamos inconcientemente, sin saber que estan ahí.

¿Cuáles son estos distractores artificiales, particularmente para los programadores?

Aquí un claro ejemplo:

El tweet anterior no solo es sarcástico y gracioso también es certero. ¿Cuántos nuevos frameworks de desarrollo nacen con la simple justificación de ser nuevos, de ser diferentes?

Programming “Gamification

El término gamification se entiende como la actividad o metodología de “premiar” simbólicamente a un individuo por completar tareas, cumplir metas o resolver problemas. Por ejemplo, un caso contemporaneo es foursquare / swarm o untappd para los amantes de la cerveza: cuantos más lugares conocemos o más tipos de cerveza probemos se nos proporciona un badge, o medallita que, aunque nos hace sentir que competimos, es igual de relevante que las estrellitas que nos pegaban en la frente en el jardín de niños.

Algo que he notado en programadores, sobre todo en los menos experimentados, es precisamente una necesidad de obtener algún tipo de reconocimiento por la cantidad de conocimiento con la que cuentan sin que necesariamente este se traduzca a algo útil para los usuarios finales quienes son, al final del día, la razón por la cual estamos desarrollando nuestro producto.

Conocer más lenguajes modernos, entender los frameworks más inovadores y radicales, cantidad de repositorios en github, todas actividades muy loables y necesariamente perseguibles para no quedarnos atrás con las nuevas tecnologías y perder práctica, sin embargo debe existir un balance saludable entre teoría, práctica y productividad.

Es mas o menos como juzgar un proyecto de software por su cantidad de líneas de código y deducir que a mayor cantidad es mejor, lo cual es obviamente falso. De la misma manera, tener cientos de commits a un proyecto no necesariamente aportan valor. El valor se encuentra en la utilidad de dicho código para quien pretenda utilizar nuestro software.

Como “project manager” constantemente me encuentro con código poco probado que el desarrollador asegura está listo o que incluso pasa las pruebas unitarias y que desde la perspectiva de desarrollo “sirve” pero desde la perspectiva de calidad de producto deja mucho que desear y la razón por la cual sucede esto es precisamente una aparente e innecesaria prisa por entregar rápido y pasarnos al siguiente problema porque ya nos aburrimos del anterior.

Similar a esto, algún colega, desarrollador de PHP comentaba recientemente en un foro el hecho de que muchos programadores apenas tienen algo de experiencia en un lenguaje o herramienta, se brincan a otra para poder solucionar otros problemas con paradigmas diferentes (y que si lo sabemos quienes aun tocamos PHP). Tal es el caso de node.js, tecnología completamente diferente a otros lenguajes o plataformas mas tradicionales que precisamente trata de solucionar problemas diferentes, no los mismos problemas con diferente código.

Desarrollar en tecnologías “viejas” como PHP o Java puede no ser cool, pero puede ser productivo. Desarrollar en nuevas tecnologías solo porque están de moda no necesariamente solucionará nuestros problemas.

En general podría decir que quienes buscan ser productivos se preocupan menos por las herramientas y más por el producto mientras que quienes buscan brillar en la comunidad haran lo contrario: estar al grito de la moda en tecnologías aun cuando no signifique algo laboralmente hablando. Ambos buscan reconocimiento, los primeros de sus clientes y usuarios, los otros de sus propios colegas. Los primeros son relevantes para quien usa el software, los segundos no tanto.

La generación Github

Una de las cosas mas espectaculares que le ha sucedido al gremio de desarrolladores es github y el trabajo en colaboración por medio de Internet ya que propicia inovación sin lugar a duda. Como hub de desarrollo, camaradería y aprendizaje es una plataforma excelente, sin embargo esto no necesariamente significa que todo lo que encontramos en ese vasto sitio sea de calidad.

La idea de colaboración open source no es nueva. Existieron sitios anteriormente como sourceforge, berlios y otros. Incluso antes de que colaborar y compartir código  por Internet fuera razonablemente posible existieron comunidades de desarrollo abiertas por medio de mailing lists, canales de IRC y simples servidores de FTP.

Es precisamente la comunidad de desarrollo abierta la que más experiencia tiene en este tema, la de la vieja escuela. Una de las razones (ampliamente discutida por expertos en el tema) por las cuales, por ejemplo, muchos productos open source o libres no terminan de “cuajar” es por el protagonismo tanto de sus autores como de sus contribuyentes: cuando el autor original de un producto rechaza un parche por mala calidad, no seguir los lineamientos del proyecto o simplemente porque considera que es un feature que no va de la mano con el objetivo del software era común que dicho contribuyente creara un fork o versión alterna del proyecto, que persiguiera los objetivos del segundo. Esta actitud ha dañado al ecosistema de software open source por años, particularmente al software de escritorio. La razón generalmente era la misma: búsqueda de reconocimiento por encima de buscar solución a un problema.

Esta mentalidad se ha ido pasando de generación en generación, particularmente en github y comunidades aledañas: crear software desde cero porque nosotros creemos que nuestra manera de abordar un problema es mejor.

Si lo vemos desde el punto de vista de un programador que pudiera aportar conocimiento y esfuerzo a un proyecto entonces vemos que ese potencial contribuyente a dicho proyecto duplicará esfuerzos tratando de resolver exactamente el mismo problema. De igual manera, quienes consumen su tecnología tendrán que aprender, de nuevo, otra nueva tecnología y muy seguramente, aun sin dominarla, tendrán que estar pendientes el nuevo chico de la cuadra.

Pareciera que estoy en contra de las comunidades de desarrollo y el open source ¿Cierto?

Un claro ejemplo de como se busca más el reconocimiento que los resultados tangibles es el caso de OpenSSL, componente de software utilizado prácticamente en todos lados, en todo el mundo, necesario para encriptar casi cualquier cosa que utilicemos como usuarios finales o como programadores ¿Cuántos contribuyentes existen? ¿Cuántos forks? Recientemente y a raíz del bug heartbleed los mantenedores del proyecto tuvieron que pedir ayuda financiera, casi como limosna, en un llamado de emergencia por la poca cantidad de recursos con la que cuentan.

¿Por qué tan pocos programadores han contribuido al desarrollo de OpenSSL? Bueno es muy simple, porque no es un producto particularmente inovador, hace lo que debe hacer y lo hace bien, a nadie le interesa tocar en una banda de jazz, todos quieren ser miembro de la banda de pop de moda, o un rockstar. Y así como hacer playback es más fácil también lo es crear un pequeño framework web. Tocar jazz en este caso es una buena metáfora para la cantidad de conocimiento, técnica e inteligencia que requiere diseñar algoritmos de seguridad.

Enfoque y objetivos como solución

Tener un objetivo de la tarea actual, milestones de nuestro proyecto o del producto final como tal es sumamente importante, y para poder trazarlos debemos:

  1. Entender el problema que debemos solucionar
  2. Procurar investigar si hay una manera ya existente de solucionarlo, no reinventar la rueda
  3.  Entregar calidad: ¿Hace mi software lo que el usuario espera que haga?

Creo que la mayoría de las veces perdemos precisamente el enfoque por estar pensando e invirtiendo tiempo en temas auxiliares al objetivo principal, como que framework usar, convenciones de código, entornos de desarrollo, proveedores de cloud hosting, bugtrackers, etc. Estos puntos deben de tratarse como decisión o consecuencia del análisis de los 3 puntos que mencioné arriba y no al revés.

Muchas veces veo a desarrolladores sumamente inteligentes y astutos ansiosos por aplicar alguna nueva librería, lenguaje o metodología sin embargo no tienen ningún problema que solucionar. Es más fácil (y divertido) encontrar desafíos y problemas técnicos para aplicar tecnología que inventar o aprender tecnología nueva por si “algún dia la necesitamos”.

Le llevó años de trabajo a Thomas Alva Edison (y a otro puño) desarrollar un foco con filamentos para solucionar un problema simple: iluminación artificial y llevó otros casi 80 años solucionar un nuevo problema: focos que hicieran uso eficiente de energía. ¿Por qué estamos entonces tan apurados como desarrolladores por solucionar un nuevo problema si aun no hemos solucionado el anterior?


Sábado 28 de febrero de 2015

Gunnar Wolf

Gunnar Wolf
Gunnar Wolf

Welcome to the world, little ones!

Welcome to the world, little ones!

Welcome little babies!

Yesterday night, we entered the hospital. Nervous, heavy, and... Well, would we ever be ready? As ready as we could.

A couple of hours later, Alan and Elena Wolf Daichman became individuals on their own right. As is often the case in the case of twins, they were brought to this world after a relatively short preparation (34 weeks, that's about 7.5 months). At 1.820 and 1.980Kg, they are considerably smaller than either of the parents... But we will be working on that!

Regina is recovering from the operation, the babies are under observation. As far as we were told, they seem to be quite healthy, with just minor issues to work on during neonatal care. We are waiting for our doctors to come today and allow us to spend time with them.

And as for us... It's a shocking change to finally see the so long expected babies. We are very very very happy... And the new reality is hard to grasp, to even begin understanding :)

PS- Many people have told me that my blog often errors out under load. I expect it to happen today :) So, if you cannot do it here, there are many other ways to contact us. Use them! :)

Viernes 27 de febrero de 2015

Héctor Daniel Cortés

Héctor Daniel Cortés
'Aztec Eagle' Turbo

Larga vida y prosperidad.

El actor del inolvidable personaje de Star Trek, Doctor Spock, murió hoy 27 de febrero del 2015 a las 08:40 EST a la edad de 83 años por complicaciones de una enfermedad pulmonar crónica. Larga vida y prosperidad.

La nota original en

Otros enlaces: Twitter.

Jueves 26 de febrero de 2015

LogicalBricks Solutions: Ha terminado el soporte para Ruby 1.9.3

Manuelton 2015

Y bueno al mal paso darle prisa, nuestro buen amigo Manuel Medina, en este momento tiene algunas necesidades económicas que no planeaba tener, léase no le caería mal un apoyo económico,como buen mexicano y como hombre orgulloso aún viviendo en el país del sol naciente, no va a publicitarlo en su blog, probablemente en su momento escribirá en retrospectiva de esto, pero dudo que lo haga en estos días en que lo necesita, por lo tanto y tomándolo como ejemplo vamos a tomarnos la libertad de platicarlo por acá.

Manuel como el mismo lo dice, no está en problemas, pero pronto va a tener que hacer un desembolso fuerte de dinero en los próximos meses, es decir no está muriendo de hambre, sin casa o enfermo, sin embargo un poco de apoyo no le vendría mal, y tal cual muchos disfrutamos de su blog y muchos otros de leerlo en el twitter o de haber cruzado palabra en algún medio de mensajería, no seria mala idea apoyarlo con algo mas que “anímate” y convertirlo en ahí van unos pesos, bueno yenes.

No esta demás decir que el propio Manuel organizo una cosa como esta para apoyar a Omar en 2008, por lo mismo yo creo que es una oportunidad de apoyarlo, en todo caso el mismo ha creado una página de preguntas frecuentes sobre el botón de donación que ha creado en su blog ahí mismo esta el botón de donación y alguna información extra, en fin que los invito a que se den una vuelta por su blog y lean la interesante saga que esta escribiendo y claro para que quienes lo leen en planetalinux no se pregunten que diantres hace aquí una entrada de estas, Manuel es linuxero de tiempo atrás y escribe también sobre programación y cosas muy interesantes para quienes visitan PL.

Domingo 22 de febrero de 2015

Héctor Daniel Cortés

Héctor Daniel Cortés
'Aztec Eagle' Turbo

2015-02-22 14:23:14 UPDATED: (M6.2) OFF THE COAST OF JALISCO, MEXICO 18.7 -106.8 (82934)

Geographic coordinates: 18.717N, 106.806W
Magnitude: 6.2
Depth: 10 km
Universal Time (UTC): 22 Feb 2015 14:23:14
Time near the Epicenter: 22 Feb 2015 07:23:15
Local standard time in your area: 22 Feb 2015 08:23:14

Location with respect to nearby cities:
211 km (131 mi) SW of Tomatlan, Mexico
242 km (150 mi) WSW of Cihuatlan, Mexico
264 km (164 mi) W of Manzanillo, Mexico
267 km (166 mi) SW of Puerto Vallarta, Mexico
811 km (503 mi) W of Mexico City, Mexico

event ID : us c000tsak

This is a computer-generated message and has not yet been reviewed by a
For subsequent updates, maps, and technical information, see:


Miércoles 18 de febrero de 2015

César Yáñez Fernández

Escritura a mano, teclados y la devaluación de la tipografía

Algo que me ha llamado la atención por mucho tiempo es la torpeza de nuestros teclados desde un punto de vista tipográfico. Creo que la manera en que las teclas están colocadas puede ser un factor que contribuye a la falta de calidad tipográfica en nuestra escritura diaria y publicación en línea. ¿Cómo se podría solucionar?

Regresando en el tiempo

Antes de la edición por computadora, la mayoría de los libros o revistas publicados eran elaborados por artesanos que tenían las herramientas y habilidades necesarias para reproducir y publicar un texto que cumplía los estándares más altos en legibilidad y tipografía. Mucho de esto tenía que ver con la imprenta y el conocimiento del tipógrafo acerca del idioma y la tipografía. Él o ella sabían que cada caracter en un tipo de letra significaba diferentes cosas así como las diferentes palabras significan diferentes cosas.

Los tipógrafos e impresores tenían acceso a un conjunto de caracteres extenso para ajustar la tipografía de libros y revistas.

La publicación en aquellos días era para producción de información en masa. No era algo que cualquiera podía hacer. Tomaba tiempo, era caro y contenía muchos detalles que tenían que ser cuidadosamente considerados para hacerlo bien.

Lo contrario a la publicación lenta y cara era la escritura a mano. La escritura a mano era rápida, barata y a mi punto de vista era una extensión de la voz humana. Hablábamos cuando nuestro destinatario estaba cerca, y escribíamos cuando estaba lejos. Ya que el propósito de la escritura a mano era imitar la voz, no requería el conjunto de caracteres extendido que la imprenta o el tipógrafo profesional tenían a la mano. En la mayoría de los casos funcionaba bien con únicamente A-Z, a-z y números.

La tipografía y la escritura a mano eran dos cosas que podían vivir juntas ya que no competían entre estas; una era para comunicación rápida e informal, y la otra para una comunicación formal y permanente.

El cruce de caminos

Si miramos a la historia de la máquina de escribir, podremos ver que el propósito de la invención no era para reemplazar o democratizar la impresión o la publicación en maza. Era para reemplazar la escritura a mano en oficinas, la correspondencia formal y la escritura profesional.

[Él] tenía por su gran estudio y dolor y gastos, el inventado y traído a la perfección una máquina artificial o método de impresión o transcripción de letras, una tras de otra, como en la escritura, por lo cual toda la escritura puede ser absortada en papel o pergamino tan claro y exacto tal que no puede ser distinguido de la imprenta, y que dicha máquina o método puede ser de gran uso en asentamientos y registros públicos, la impresión siendo más profunda y más duradera que cualquier otra escritura, y que no se puede borrar o falsificar sin un descubrimiento manifestado. — De la patente de la Máquina de Escribir de Henry Mills, 1714

Había otras patentes solicitadas para dispositivos de tipografía en 1808, 1829 y 1852 pero no ganaron interés público. Alrededor de 1860, la máquina de escribir similar a la que se usaron por muchas décadas fue introducida y ganó popularidad.

Las primeras máquinas de escribir tenían las teclas distribuidas en orden alfabético.

3 5 7 9 N O P Q R S T U V W X Y Z
2 4 6 8 . A B C D E F G H I J K L M

Como se puede ver, solo se tenía de la A a la Z y números en el teclado. Esto muestra que el propósito era el reemplazar la escritura a mano.

Se usaban barras con letras que físicamente “martillaban” las letras en el papel. El problema era que las letras más usadas frecuentemente en esas máquinas de escribir se colocaban muy cerca una de otra lo que resultaba en la obstrucción de las barras y se atoraba el papel.

Alrededor de 1868, Christopher Latham Sholes introdujo el teclado qwerty para prevenir que las barras se atascaran.

Originalmente las teclas se distribuían en orden alfabético, lo que causaba obstrucciones frecuentes de las partes móviles. Sholes redistribuyó las teclas para que las letras más usadas frecuentemente estuvieran dispersas para minimizar el atascado. Obtuvo una patente por su distribución del teclado que se conoció como qwerty y se volvió el teclado us standard 101. — Comparación de teclados QWERTY y DVORAK

Esto fue un mejoramiento enorme desde el punto de vista técnico, pero eso era todo, una solución a un problema técnico. La distribución qwerty hizo que el que teclado fuera más lento y forzaba al usuario a mover los dedos de una manera no natural y de maneras raras de teclear sin atascar las barras. Pero no mejoró la situación del escritor para nada.

En 1878, la distribución qwerty se asentó a como es en la actualidad.

1 2 3 4 5 6 7 8 9 0 - =
Q W E R T Y U I O P [ ] \
A S D F G H J K L ; '
Z X C V B N M , . /

En 1930, la máquina de escribir eléctrica fue inventada y la más popular fue IBM Selectrics, que usaba una esfera para imprimir las letras en el papel.

Sabían poco en aquellos tiempos acerca de la transformación que venía sobre la impresión y publicación digital. Si hubieran sabido podrían haber tomado decisiones muy diferentes.

Con la invención de la esfera para mecanografiar y la máquina de escribir eléctrica pudimos ver dos cosas:

Primero, ya que las barras estaban fuera de la ecuación era posible reacomodar las teclas en cualquier forma que beneficiaría a los que tecleaban y en 1936, el Dr. August Dvorak inventó el teclado DVORAK.

; , . P Y F G C R L
Z Q J K X B M W V _

El teclado Dvorak acomodó las teclas para que las letras más usadas frecuentemente estuvieran distribuidas cerca de los dedos más fuertes de los que tecleaban. Esto fue muy bueno para los mecanógrafos, ya que aumentó la velocidad de la mecanografía y era más placentero de usar. Desafortunadamente, el teclado Dvorak no ganó su momento y el teclado QWERTY se volvió la distribución estándar.

Segundo, el juego de caracteres se pudo haber extendido para parecerse mejor a la variedad en juego de caracteres que se usaba con las imprentas y los tipógrafos profesionales. Pero, al igual que con la máquina de escribir original, la máquina de escribir eléctrica no fue diseñada para competir con la imprenta, la producción en masa o la publicación a gran escala, por lo que era natural seguir con el teclado existente de las máquinas de escribir originales.

La única extensión al juego de caracteres fue la introducción permanente de la tecla SHIFT. Era usada para agregar caracteres al teclado. Vemos caracteres alternos agregados a las teclas numéricas; [ ] @ # $ % & * ( ) ” ‘, por ejemplo.

No he encontrado información de por qué esos caracteres fueron elegidos en favor de otros, que desde el punto de vista tipográfico, son más valiosos. Pero desde que las máquinas de escribir se usaban en oficinas, la comunicación formal, acuerdos, documentos financieros y demás, eran los que más necesitaban esos caracteres.

Desde que el teclado QWERTY extendido se volvió un estándar, significó que las personas empezaran a usar lo que estaba disponible en la máquina de escribir para tipografiar su texto. Aunque las comillas y los signos de interrogación eran tipográficamente incorrectos.

Lo mismo pasó con muchos otros caracteres tipográficamente importantes como el guion medio largo — y la elipsis … por ejemplo. Ya que inicialmente no estaban disponibles, y después en los teclados de computadoras, casi inexistentes, simplemente se olvidaron.

El resultado de la tipografía en la actualidad

La máquina de escribir y la computadora fueron introducidos a través de una cadena de invenciones y patentes que empezaron a reemplazar la escritura a mano. Estas no competían con la impresión tradicional y la publicación, pero en retrospectiva, era muy obvio que el camino de la máquina de escribir iba a liderar la invención de las máquinas de duplicación en masa como el mimeógrafo o la fotocopiadora. Aunque esto es bueno, porque democratizó la comunicación en masa y la publicación que cualquiera puede hacer, casi sin mayor costo, publicar sus propios libros, blogs, revistas o cualquier cosa que puedan imaginar.

La única cosa que puede molestar, es que aún tenemos herramientas tipográficas demasiado especializadas para hacerlo.

Sorprendentemente muchos diseñadores, editores y desarrolladores que gastan la mayoría de su tiempo trabajando con texto y copiado, tienen muy poco o nada de conocimiento sobre las implicaciones del lenguaje con los diferentes juegos de caracteres que usan.

La evolución de la escritura a mano a la mecanografía al teclado puede ser una de las causas de la falta del entendimiento tipográfico en la actualidad.

Así que … ¿Hay algo por hacer? Bueno, el teclado QWERTY no va a irse. Puede haber algunos casos extremos de redistribuir las teclas en el teclado que puedan proveer una solución a corto plazo (o comprar un teclado DVORAK). Pero una solución a largo plazo puede ser el construir un sistema tipográfico dentro del software (que hay algunos que ya existen a un costo de uso muy elevado). La introducción del formato OpenType en gran escala dará acceso público a una variedad de caracteres que los tipógrafos profesionales tenían en sus días. Se necesita continuar empujando las características de OpenType en navegadores y otro software, y una vez hecho se habrá pasado un gran camino. Pero aún no se ha llegado, así que mientras tanto también es igualmente importante continuar con la construcción de otras herramientas como OpenTypography y LaTeX. Estas herramientas, presionarán sobre los desarrolladores de navegadores y mantener la discusión.

Martes 17 de febrero de 2015

Renich Bon Ciric

El dir-foss va creciendo

Que gusto me dá que esté creciendo el proyecto de dir-foss. La gente de México ha estado colaborando bastante para hacer el proyecto de fiar y demás.

Nos faltan algunas cosas, todavía. Por ejemplo:

  • Hay que hacerlo más bonito.
  • Hay que seguir agregando gente.
  • Hay que escribir algunas pruebillas unitarias.

Es un trabajo en progreso pero, la neta, ahí la llevamos.

Muchas gracias a todos los que han colaborado. Han ayudado bastante. Este directorio es el primer paso para unificar a las organizaciones alineadas con el FOSS de México. Una vez que sepamos qué hay, será más fácil establecer canales de comunicación y organizarnos.

Muchas gracias a todos y sigamos con el proyecto.

Viernes 13 de febrero de 2015

Alex Callejas

RetroPie: Contruyendo una consola retro


I don’t like all the attention. I think it’s better to let my work do the talking.

No me gusta toda la atención. Creo que es mejor dejar que mi trabajo hable por mí.

Shigeru Miyamoto (Entrevista en DigitalTrends. 2006)

En días pasados, el buen amigo Dragón, me equipó con una Raspberry Pi, y me dí a la tarea de investigar varios proyectos interesantes que se pueden desarrollar con este hardware tan versátil. El que más llamo mi atención, además de satisfacer una necesidad geek recién adquirida, fue construir una consola de videojuegos retro.

En este post quiero compartirles como la construí. El hardware que utilice es:

Raspberry Pi 1 B+ TP-LINK Wireless Nano USB Adapter SanDisk Ultra microSDHC SNES Retro USB Super Nintendo Controller Charge cable Raspberry Pi 1 B+ Ensamblado 1 Ensamblado 2

Después de ensamblar el hardware, descargue la imagen de Raspbian y la instale en la microSD con el ARM installer de Fedora:

Screenshot from 2015-02-11 22:38:54

Al encender la Raspberry, se ejecuta el raspi-config, donde debemos modificar la configuración:


  • Expand Filesystem [Para que utilice los 8 Gb de la MicroSD]
  • Change User Password [Del usuario Pi]
  • Internationalisation Options [Modificar Teclado y zona horaria]
  • Advanced Options
    • SSH [Habilitar]
    • Hostname [Cambiar]
    • Memory Split [Modificar a 128 o 192]

Al seleccionar Finish, la raspberry se reiniciará. Después del reinicio, conectada a Internet vía Ethernet, actualizamos el firmware de la Pi:

root@heimdall:~# rpi-update 

Y posteriormente los paquetes:

root@heimdall:~# apt-get update
root@heimdall:~# apt-get upgrade

Después del reinicio, validamos que arranque correctamente el modo gráfico:

root@heimdall:~# startx


Al conectar la tarjeta wireless, no la reconocía, googleando un poco, encontré como instalar la tarjeta:

Descargar el driver más actual, siguiendo este post para ubicar el que le corresponde conforme la versión que tengamos, en mi caso:

root@heimdall:~# uname -a
Linux heimdall 3.18.5+ #744 PREEMPT Fri Jan 30 18:19:07 GMT 2015 armv6l GNU/Linux

En el post encontré el comentario acerca de la versión 3.18.5+ que  tengo, donde, para descargar la versión correspondiente había que ejecutar:

root@heimdall:~# wget -O /lib/firmware/rtlwifi/rtl8188eufw.bin

Y después de reiniciar, la tarjeta es funcional y se puede configurar con wpa_cli:

root@heimdall:~# wpa_cli 
Selected interface 'wlan0'

Interactive mode

> scan
> scan_results
bssid / frequency / signal level / flags / ssid
20:73:85:24:e2:a0 2412 46 [WPA2-PSK-CCMP][WPS][ESS] wifi_local 
c0:a5:62:7a:68:c0 2437 0 [WPA2-PSK-CCMP][WPS][ESS] ARRIS-76C3
0c:f8:96:29:f0:b0 2442 0 [WPA-PSK-TKIP+CCMP][WPA2-PSK-TKIP+CCMP][WPS][ESS] ARRIS-F030
> quit

Con esta info, generamos el archivo que contenga la configuración de nuestra red:

root@heimdall:~# vi /etc/wpa_supplicant/wpa_supplicant.conf
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev


Si queremos agregar otra red, como la del trabajo, por ejemplo, podemos editar este mismo archivo, agregando las líneas correspondientes de la red deseada:


Y configuramos la conexión automática al arranque, editando el archivo /etc/network/interfaces, agregando al principio del archivo la línea:

auto wlan0

Al final del mismo archivo, agregamos:

allow-hotplug wlan0
iface wlan0 inet dhcp
wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf
iface default inet dhcp

Al reiniciar, debe conectarse automáticamente a nuestra red inalámbrica, lo comprobamos con wpa_client:

root@heimdall:~# wpa_cli 
Selected interface 'wlan0'

Interactive mode

> status
> quit

Con la wireless funcional, iniciamos la configuración de la RetroPie, para lo cual opte por utilizar el método de la wiki del proyecto en github; entonces, primeramente, instalamos git y sus dependencias:

root@heimdall:~# apt-get install -y git dialog

Con el usuario pi, iniciamos la instalación de RetroPie:

pi@heimdall ~ $ git clone --depth=1 git://
pi@heimdall ~ $ cd RetroPie-Setup
pi@heimdall ~ $ chmod +x
pi@heimdall ~ $ sudo ./

Al terminar la instalación/configuración, nos creará varios directorios dentro del directorio $HOME/RetroPie:

pi@heimdall ~ $ ls RetroPie/*
CARTS.SHA fast.bin gles2n64rom.conf MSX2EXT.ROM MSX2.ROM PAINTER.ROM system.bin

amiga gamegear mame-samples pc snes
amstradcpc gamegear-osmose mastersystem pcengine snes-pisnes
apple2 gb mastersystem-osmose pcengine-libretro snes-snes9xrpi
atari2600-libretro gba megadrive ports vectrex
atari2600-stella gbc megadrive-dgen psx zmachine
atari800 intellivision msx quake3 zxspectrum
atarilynx macintosh n64 scummvm zxspectrum-fbzx
atariststefalcon mame n64-mupen64plus sega32x
c64 mame-advmame neogeo sega32x-dgen
fba mame-artwork neogeo-gngeopi segacd
fba-libretro mame-libretro nes segacd-dgen
pi@heimdall ~ $

Después de reiniciar la Pi, al hacer login, nos muestra el inicio característico de RetroPie:

Retropie Console

Los ROM’s de los juegos hay que transferirlos por SSH al directorio correspondiente de la consola, por ejemplo:

[alex.callejas@isengard retropie]$ scp Super_Mario_Bros.3.nes  pi@

Buscando un poco se pueden encontrar nuestros juegos predilectos ;-)

Para arrancar la consola Retropie, ejecutamos:

pi@heimdall ~ $ emulationstation

La primera vez, nos pedirá configurar el control que deseemos usar y después de eso ya podemos jugar en la consola.

Para mayor información, consulten la wiki del proyecto, acerca de roms, emulación de plataformas, configuración de controles, etc.

Aquí la galería con la RetroPie en funciones:

RetroPie Consola RetroPie emulationstation NES Roms Super Mario Bros 3 Super Mario Bros 3 Super Mario Bros 3 Super Mario Bros 3 emulationstation

Próximamente estaré probando el nuevo modelo, la Raspberry Pi 2 B+, para poder emular Nintendo 64 como se debe:

Ver en YouTube

Espero se diviertan… :-)

Jueves 12 de febrero de 2015

Fco. de la Torre Inguanzo

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

Función para calcular el ISPT 2014 en Excel y LibreOffice

Hace ya algunos años desarrollé una función similar a la que hoy les comparto y la pueden ver en el artículo Función en Excel para calcular el ISPT anual.

ISPT 2014 en Excel y Libreoffice

Nuevamente la rescato del baúl del programador para hacerle algunas modificaciones. En primer lugar, la actualización de los valores de la tabla que sirve para el cálculo que corresponden al ejercicio 2014 y además de que en esta ocasión me pidieron que ya no descontara el subsidio anual y solamente hiciera el cálculo del ISPT.

La Fórmula

Según me explicaron, esta es la fórmula que se utiliza para calcular el ISPT:


Fórmula para calcular el ISPT


El asunto se complica un poco porque varios de los valores se buscan en una tabla dependiendo de las Percepciones Gravables.

Tabla para el cálculo del ISPT 2014

Fig.1 Tabla utilizada para hacer los cálculos.

Por eso creo que el mejor enfoque fue hacer una función para Excel y otra para LibreOffice que hicieran de manera automática la búsqueda de los valores y el cálculo del impuesto.

Código de la función para Excel

Inicialmente desarrolle esta función para Excel ya que es el programa que generalmente usan los contadores.

Código de la función para LibreOffice

El código para LibreOffice es muy similar al de Excel, solo se cambio la función Round por Format para que el resultado lo muestre solamente con 2 decimales.

Software Libre

Los códigos de las funciones son software libre (libertad para usar,copiar y modificar). Aunque hice varias pruebas y lo verifiqué varias veces haciendo el cálculo manualmente no esta exento de errores, así que les pido que si notan algún “detallito” o error, por favor no dejen de reportarlo.

Para que no batallen, les dejo este archivo zip ISPT 2014 v20140212 que incluye sendos ejemplos en Excel y Libreoffice.

Espero que esta función les sea de utilidad a los amigos contadores que siendo honestos, les deberían de dar una medalla por hacer de estos cálculos su trabajo cotidiano.

The post Función para calcular el ISPT 2014 en Excel y LibreOffice appeared first on LINUXMANR4.

Martes 10 de febrero de 2015

Eduardo Ruiz Duarte

Eduardo Ruiz Duarte
beck's site

Encontrando números primos grandes con approach matemático-computacional

Si estás de un smartphone no se verán los símbolos, probablemente quieras verlos así que haz click aquí

Recientemente me vi en la necesidad de encontrar algunos números primos grandes de la forma $latex (3*8^n)-1$ por una cuestión de un problema de geometría aritmética y primality testing, quiénes creo que se podrían interesar en esto fueron en Facebook Esteban Gutierrez y Manuel López Michelone quiénes comentaron sobre esto, un análisis rápido te dice que ese número es primo para $latex n\in \lbrace 1,2,6,72,1092,5687 \rbrace$ pero otro análisis no tan rápido que hice fue para descubrir $latex n=17129$, estos número para el ojo inocente parecerían inofensivos, pero para $latex n=17129$ nos encontramos con un número de 16,000 dígitos aproximadamente, y ahora mi workstation está checando $latex >n=35000$ que son como 32,000 dígitos decimales, es decir 105,000 bits, tardándose aproximadamente 30 minutos por cada thread (hice 32 POSIX-threads) entonces me arroja aproximadamente 32 resultados cada media hora, y el tiempo sube por cada iteración logarítmicamente, así que si sigo así pronto comenzará a tardar horas, el código lo voy a publicar ahorita, así que encontrarán las ligas al final de este post para que lo corra cualquier linuxero, o mejor decir... "POSIXERO" ya que toda el api que uso al final es POSIX compliant y para manejar números grandes y hacer aritmética uso BN  (Bignum) de OpenSSL que considero es lo más rápido ya que se usa en la industria, el código detecta tus procesadores y usa TODOS, así que tomalo en cuenta con el nice, tiene macros para funcionar en OSX (Apple) ya que pthread_set_affinity_np() y CPU_SET funcionan diferente.

La pregunta matemática sería:

¿Existen una cantidad infinita de números primos de esta forma?

Ahora explicaré cómo lo hice para que sea lo más óptimo que se me pudo ocurrir.

1. Construir número optimamente

$latex (3*8^n)-1$ lo podemos fabricar en binario en vez de calcularlo, con esto nos evitamos muchos ciclos del procesador

Por un lado tenemos que $latex 8^n=2^{3n}$  y $latex 2^m=1000...000B$ con $latex m$ $latex 0$'s eso significa que $latex 8^n$ tiene $latex 3n$ ceros y un $latex 1$ al principio, después multiplicar por $latex 3$ es lo mismo que sumar $latex 3$ veces $latex 1000...000B$ el cual será el número $latex 11000...000B$ con $latex 3n$ ceros y restar $latex 1$ será negar todos los ceros y el segundo $latex 1$ por lo que va a quedar    $latex (3*8^n)-1=10111...111B$   donde el número de $latex 1$'s menos significativos es $latex 3n$ , con esto ya no tenemos que calcular exponenciación que es muy costosa.

2. Ignorar números que nos harán perder el tiempo

Sucede MUY frecuentemente que $latex (3*8^n)-1$ es múltiplo de $latex 5$ , esto es fácil verlo
ya que si $latex 3*8^n$ termina en $latex 6$ o $latex 1$ entonces $latex (3*8^n)-1$ es múltiplo de $latex 5$, pero no puede terminar en $latex 1$ porque $latex 3*8^n$ es par, y para que termine en $latex 6$ como $latex 8^n$ termina en $latex 8,4,2,6,8,4,2,6,8,...$ (en ese orden comenzando con n=1) nos interesa saber cuándo $latex 8^n$ termina en $latex 2$ para que $latex 3*8^n$ termine en $latex 6$ y por consiguiente $latex (3*8^n)-1$ sea múltiplo de $latex 5$.

Un chequeo rápido y respaldado por la propiedad inductiva en los número naturales sobre $latex n$ tenemos que $latex 8^n$ termina en $latex 2$ si $latex n=3,7,11,15$ es decir si $latex n=4t-1$ y más computacionalmente si $latex n\equiv 3 \mod 4$ o más humano "si $latex n-3$ es múltiplo de $latex 4$" entonces esto nos dice que podemos eliminar automáticamente 25% de todos los exponentes al checar $latex (3*8^n)-1$ ya que serán múltiplos de $latex 5$

3. Optimizar test de primalidad y utilizar números más familiares para una computadora

Una vez construido el número, y filtrados los exponentes que hacen trivialmente compuesto al número, necesitamos ver que lo que tenemos en efecto sea un número primo.

Para hacer esto nos auxiliaremos en el pequeño teorema de Fermat el cual lo escribo diferente a Fermat para que se entienda dice:

Teorema de Fermat
Si $latex p$ es primo y $latex mcd(p,a)=1$ $latex \Rightarrow$ $latex a^p - a$ es múltiplo de $latex p$


Si $latex p$ es primo y $latex mcd(p,a)=1$ $latex \Rightarrow$ $latex a^{p-1} \equiv 1 \bmod p$

Esto es lo mejor que tenemos y lo peor es que existe la posibilidad de un "falso positivo"
ya que el teorema aquí ya supone que $latex p$ es primo, es decir estamos checando una propiedad que tiene un número primo siempre, pero podría tenerla otro número también ya que el teorema no es un "si y sólo sí" $latex \Leftrightarrow$ , pero para nuestra fortuna, los números que cumplen la propiedad de Fermat y no son primos son "strong pseudo-primes" , "Fermat Liars" y son raros, de hecho yo prefiero Números de Carmichael quién fue el que los estudió y para nuestra fortuna, no hay tantos y son raros, y si nos toparamos con un "posible primo" , cambiamos la $latex a$ del teorema de Fermat y volvemos a probar y si también se cumple la congruencia, es ya casi un hecho que lo que tenemos es primo.

Pero bueno aún podemos optimizar MÁS , vamos a optimizar el teorema de Fermat, ya que como pueden ver... vamos a tener que elevar un número (en mi caso 2) a la $latex x$ donde $latex x$ es un número de más de 30 mil dígitos, módulo es número de 30 mil dígitos... afortunadamente existen algoritmos para hacer esto en tiempo logarítmico pero aún así es tardado, así que si podemos eliminar más ciclos sería bueno.

Tenemos que $latex x=(3*8^n)-1$ nunca es el número primo $latex 2$ así que podemos suponer que es impar sin ningún problema , por un lado tenemos que $latex a^{x-1} \equiv 1 \bmod x \Leftrightarrow a^{x-1} -1 \equiv 0 \bmod x$ si $latex x$ es primo,  ahora,  $latex x-1=2k$ es decir es par, entonces $latex a^{x-1}-1 = a^{2k}-1 = (a^k -1)(a^k + 1) \equiv 0 \bmod x$ (diferencia de cuadrados), como $latex k=\frac{x-1}{2}$ entonces tenemos  que $latex (a^{\frac{x-1}{2}}-1)(a^{\frac{x-1}{2}}+1) \equiv 0 \bmod x$ lo que significa que para que se cumpla Fermat, tiene que suceder que $latex a^{\frac{x-1}{2}}\equiv 1$ ó $latex -1 \bmod x$ donde $latex -1\equiv x-1 \bmod x$ y con esto reducimos 1 ciclo más en la exponenciación modular que es muy costosa, y usamos $latex a=2$ ya que la exponenciación por 2 sólo es shifting a la izquierda, y usando 2 es hermoso para el algoritmo de exponenciación modular porque la complejidad
$latex o(3kn^{1.585})$ (Multiplicación Karasuba y reducción Montgomery para mod_exp hasta donde sé que usa BN de OpenSSL) esperada baja considerablemente teniendo muchos 0's en su expresión lo que reduce pasos (por eso la $latex o(g[n]))$ y no la $latex O(g[n]))$),  donde $latex 3k$ es el número de bits de $latex x$ (nota aquí que la $latex n$ representa la variable de complejidad y no el exponente), y con eso hemos encontrado los primos que mencioné al principio.

Espero opiniones, source code aquí

Eduardo Ruíz Duarte
twitter: @toorandom

Por Morbo aquí les dejo el más grande que he encontrado, tardó 3 minutos en 1 thread. el cual es $latex (3*8^{17129})-1$ el cual tiene 51,388 bits .


Viernes 06 de febrero de 2015

Gunnar Wolf

Gunnar Wolf
Gunnar Wolf

On the number of attempts on brute-force login attacks

I would expect brute-force login attacks to be more common. And yes, at some point I got tired of ssh scans, and added rate-limiting firewall rules, even switched the daemon to a nonstandard port... But I have very seldom received an IMAP brute-force attack. I have received countless phishing scams on my users, and I know some of them have bitten because the scammers then use their passwords on my servers to send tons of spam. Activity is clearly atypical.

Anyway, yesterday we got a brute-force attack on IMAP. A very childish atack, attempted from an IP in the largest ISP in Mexico, but using only usernames that would not belong in our culture (mosty English firstnames and some usual service account names).

What I find interesting to see is that each login was attempted a limited (and different) amount of times: Four account names were attempted only once, eight were attempted twice, and so on — following this pattern:

 1 •
 2 ••
 3 ••
 4 •••••
 5 •••••••
 6 ••••••
 7 •••••
 8 ••••••••
 9 •••••••••
10 ••••••••
11 ••••••••
12 ••••••••••
13 •••••••
14 ••••••••••
15 •••••••••
16 ••••••••••••
17 •••••••••••
18 ••••••••••••••
19 •••••••••••••••
20 ••••••••••••
21 ••••••••••••
22 ••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••

(each dot represents four attempts)

So... What's significant in all this? Very little, if anything at all. But for such a naïve login attack, it's interesting to see the number of attempted passwords per login varies so much. Yes, 273 (over ¼ of the total) did 22 requests, and another 200 were 18 and more. The rest... Fell quite shorter.

In case you want to play with the data, you can grab the list of attempts with the number of requests. I filtered out all other data, as i was basically meaningless. This file is the result of:

  1. $ grep LOGIN /var/log/syslog.1 |
  2. grep FAILED.*|
  3. awk '{print $7 " " $8}'|
  4. sort|uniq -c

logins.txt27.97 KB
Fco. de la Torre Inguanzo

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

Imprimir archivos en orden con lpr y Ruby

El otro día me llegó un problema interesante, tenía una colección de archivos en formato PDF que se tenían que imprimir en orden.

Bueno, al principio no sabía que tenía que ser en orden y para imprimir todos los archivos de una capeta sólo use el comando:

lpr *.pdf

Y cumplía con el objetivo de imprimir todos los archivos PDF de la carpeta, pero luego resultó que el orden de impresión era importante (para buscarlos posteriormente) y es donde el problema se complicó un poco, porque hacerlo a mano simplemente no era una opción ¡Son demasiados!.

Orden alfábetico o númerico.

El problema es que una cosa es el orden alfabético y otro muy distinto el orden numérico.

Por ejemplo, tengo esta colección de archivos:

  • 1.pdf
  • 521.pdf
  • 002.pdf
  • 11.pdf
  • 0850.pdf

El resultado de un ordenamiento estándar sería el siguiente:

archivos = ["1.pdf","521.pdf","002.pdf","11.pdf","0850.pdf"]
puts archivos.sort

  • 002.pdf
  • 0850.pdf
  • 1.pdf
  • 11.pdf
  • 521.pdf
orden alfanumerico en ruby

Fig.1 Ejemplo de un ordenamiento estándar en Ruby.

Como pueden ver, están bien ordenados, pero de manera alfanúmerica. Es una cuestión de interpretación de los datos y generalmente el nombre de un archivo se considera un dato alfanúmerico.

Y el caso se complica aún más porque la longitud del nombre del archivo no es la misma.

Aunque es correcto no es el efecto que deseo.

La solución: Naturally

Buscando en Google dí con Naturally una gema de Ruby que se encarga de interpretar de una forma más humana este tipo de ordenamientos númericos.

Para usar Naturally primero hay que instalarlo.

gem install naturally

Y este es un ejemplo de su uso:

El resultado del ordenamiento es:

  • 1.pdf
  • 002.pdf
  • 11.pdf
  • 521.pdf
  • 0850.pdf
Resultado del ordenamiento usando Naturally.

Fig. 2. Resultado del ordenamiento usando Naturally.

Y ahora si, el orden es el que precisamente estoy buscando ¡Yeeeeeei!

A imprimir.

A estas alturas ya estaba muy cerca de la solución, ahora solo tenía que desarrollar un programa en Ruby que leyera todos los archivos PDF de una carpeta, los ordenara de forma natural y mandar imprimir cada archivo.

Al ejecutar el script empieza la impresión de los archivos PDF en la impresora predeterminada uno por uno, pero ahora en el orden que quiero.

Espero que este artículo les sea de utilidad. Todavía intuyo que es posible hacerlo en bash, pero como ya lo resolví este problema utilizando Ruby y funciona tan bien que voy a dar por cerrado el tema.

Ahora con Bash

Gracias a este comentario en google plus de Rodolfo Zola que me aclaró como resolver el mismo problema usando bash y el comando sort.

Y funciona perfectamente, sólo lo modifiqué un poco para que solamente imprimiera archivos pdf.

The post Imprimir archivos en orden con lpr y Ruby appeared first on LINUXMANR4.

Jueves 29 de enero de 2015

Gustavo Rubio

Gustavo Rubio
Ahí vamos

Grim Fandango y reviviendo otros muertos

Leía entre mis noticias hace un par de días sobre el remake de “La Bella y La Bestia” de Disney que protagonizará Emma Wattson y en dicho artículo de titulado “Why Is Disney Trying So Hard To Dilute it’s Brand?” (que traducido sería mas o menos algo así como “¿Por qué Disney se esfuerza en desaparecer su escencia?“) me llama la atención lo siguiente:

News of a Beauty and the Beast remake indicates that the corporation is less and less worried about approving unoriginal products as long as they’re guaranteed moneymakers.

¿Se trata entonces del simple hecho de repetir fórmulas probadas en vez de intentar evolucionar en el medio del entretenimiento? Difiero y estas son mis razones.

Solía haber un tiempo en el que las películas eran buenas, MTV ponía buenos videos musicales y en general la industria del entretenimiento valía la pena.

Lo anterior es uno de los comentarios mas comunes y latosos que escucharemos de cualquier persona pasada de sus 30’s. Es normal, es natural y es parte de la adultéz. Cuestión melancólica más guiada por puro sentimiento que por otra cosa.

A veces cuando me preguntan si he escuchado alguna canción en el radio de alguna nueva (o no tan nueva banda) suelo responder con un inocente y penoso “no, no me suena” y es que hace ya un tiempo que dejé de escuchar radio y simplemente cargo con mi colección de música para todos lados, ya sea en mi carro, en mi teléfono, en mi computadora, etc.

Inicialmente uno pensaría que la razón es porque la “nueva música” no es de mi agrado o me parece de poca calidad, sin embargo conforme he ido analizando el asunto me he dado cuenta que no es que esté cerrado a “nuevas propuestas”, es simplemente que lo que suelo escuchar es demasiado bueno para no escucharlo una y otra vez. Con algunas excepciones, pocas veces un disco nuevo o película contemporánea a marcado mi vida de manera que necesite volver a escucharla o verla de nuevo, sin embargo, eso no necesariamente significa que esta nueva música, o estas nuevas películas sean de mala calidad.

Me gusta pensar que me “he enamorado de los clásicos”, es decir, ¿A quién no le gustó Volver al Futuro? Cuando la primera entrega de esta saga salio al cine yo probablemente estaba en los brazos de mi madre, y mucha de la música que escucho se hizo cuando ni siquiera había nacido, decir que estos elementos artísticos me agradan porque son de mi generación sería hipócrita de mi parte, lo menos.

¿Cómo es que le tomé gusto a Los Beatles, Led Zeppelin, Hall & Oates Star Wars, Back To The Future, etc.? Bueno, porque simplemente son demasiado buenos para pasar desapercibidos. Y habrá quien no guste de estas bandas o de las mencionadas películas, pero para un grueso de la población simplemente son joyas, tesoros, patrimonio y debe compartirse tras generaciones tal como otras expresiones artísticas como la literatura, la pintura, etc. Simplemente se vuelven clásicos.

Dentro de estas expresiones artísticas existe un nicho que comparte, particularmente, la misma crítica que el cine y que la música para quienes lo consumen: Los Videojuegos.

Podría autodeclararme si bien no necesariamente un gran jugador si una persona que creció con la evolución de los mismos; desde NES con juegos clásicos como Mario, Contra, “El de los patos” hasta consolas actuales. Crecí con arcades o “maquinitas” como les decimos en muchos lugares pero en realidad nunca me convertí en fan ni jugador empedernido salvo por honrosas excepciones como Zelda en 64 y algunos otros títulos de SNES.

Una crítica concurrente entre los declarados “videojugadores genuinos” y a los que consideran como simples mortales son la diferencia entre el amor y pasión a los videojuegos e incluso apreciacion del arte dentro de los mismos y como los segundos simplemente lo ven como otro hobbie o pretexto para entretenerse. Los primeros aseguran que un buen videojuego debe contar con una historia que sumerja al jugador lo suficiente para apreciar este como algo más que un programa de entretenimiento. Aquellos que juegan títulos como Call of Duty, FIFA, Grand Theft Auto y otros títulos “AAA” suelen ser rebajados a n00bs.

Lo cierto es que mucha de la generación actual videojugadora simplemente usa lo que tiene a la mano, juega lo que el mercado le vende, no es tan sencillo como con la música o las películas. Uno puede simplemente comprarse un disco (o descargarselo) y escucharlo o ver una película hecha hace 40 años en un formato moderno con un dispositivo actual, no sucede lo mismo con los videojuegos. Estos últimos suelen estar creados para plataformas mas anticuadas y lo que sucede es que, a diferencia de la música o de las películas, un videojuego es una pieza electrónica de software que requiere interacción mas compleja con el dispositivo, es decir, no puedo tomar un cartucho del viejo NES y simplemente jugarlo en un Play Station 4 o un XBox One.

Y precisamente la razón por la cual es más sencillo que una persona contemporánea, joven de edad, adquiera gusto por discos musicales y títulos de películas clásicas más fácilmente. Remasterizar música y video es relativamente sencillo, “portar” un videojuego a nuevas plataformas no lo es.

Podría decir que me considero parte de los videojugadores que prefieren las buenas historias a unos gráficos que me dejen con la boca abierta. Me intriga más una buena ambientación en un videojuego que la facilidad de jugarlo en línea con otras personas. Y no es precisamente porque sea un hipster o melancólico, es porque afortunadamente me tocó crecer con títulos así.

Cuando comencé a jugar videojuegos por voluntad propia fue cuando tuve acceso a una computadora. Si bien mi hermano mayor y yo tuvimos la fortuna de tener consolas desde muy pequeños, nunca me volví “vicioso“. Tampoco solía gastarme el poco dinero extra que tenía en las maquinitas, nunca existió un enamoramiento de mi parte hacia los videojuegos de consolas, pero eso cambió conforme pude jugar en una computadora ya que ahí los juegos solían ser mucho más desarrollados, con historias más ricas, extensas, mapas mejor diseñados y detallados, ambientación, soundtrack, etc. La experiencia simplemente era abismal comparado a las consolas.

Uno de estos juegos que me cautivó fue Grim Fandando. Videojuego que casualmente será relanzado el día de hoy remasterizado. Un juego que se desarrolló hace casi 20 años por Lucasarts, casa desarrolladora de videojuegos del corporativo de George Lucas, ya inexistente por cierto, y que ahora es parte de los derechos de autor de Disney toda vez que esta última adquirió los derechos de mucho de lo que Lucas había creado con anterioridad.

El videojuego cuenta la trama de Manny Calavera, un personaje en el mundo de los muertos, muy al estilo de la reciente película “The Book Of Life“, pero en videojuego. Este, además de contar con una historia que envuelve y una ambientación “noir”, toma elementos de películas de antaño como “Casablanca” y “El halcón maltés“, todos por cierto, considerados clásicos del cine.

Es obvio que Disney sabe crear clásicos y tiene suficiente talento para crear nuevo material, sin embargo, como menciona el artículo que citaba al principio, pareciera que Disney, y muchas otras empresas se han quedado sin ideas y simplemente pretenden retornar a fórmulas probadas o bien comprar los derechos de productos de incluso otras industrias (como Grim Fandango) para generar ganancias, vivir de los refritos pues.

Creo que si bien en parte lo que busca Disney y otras empresas “reiniciando franquicias” es generar dinero, también el hecho de poder distribuir este material considerado clásico, a nuevas generaciones, es una buena jugada.

Tal como se ha estado desempolvando viejos títulos de cine y relanzando con éxito también se está trayendo clásicos de los videojuegos a aquellos que, como yo con algunos discos musicales, ni siquiera habían nacido. Para mi es algo positivo y definitivamente como consumidor me alegra la noticia.

Como dicen por ahí, “Los clásicos nunca pasarán de moda


Además de haber sido remasterizado, Grim Fandango puede ser comprado desde Steam para plataformas Mac y Linux!

Martes 27 de enero de 2015

Alex Callejas

Seguridad y Hardening en Servidores Linux


Lo mejor que podemos hacer por otro no es sólo compartir con él nuestras riquezas, sino también mostrarle las suyas - Benjamin Disraeli

El pasado Noviembre presente este tema durante un evento, el cuál les quiero compartir, en caso de que no hayan podido asistir:

Ver en YouTube

Además, la tira de Dilbert presentada ese día:

Ver en YouTube

Aquí la presentación.

Espero les sirva…

Sábado 24 de enero de 2015

Lo que no me gusta de nativos digitales

El año que paso lo he discutido bastante en clase y por lo que estuve medio leyendo por ahí varios lo han estado discutiendo en la red, igual menciono los puntos que me parecen importantes.

En más de un momento he expresado que no me gusta la categorización de Nativos Digitales / Inmigrantes Digitales (Prensky 2001[1]), para hablar sobre los estudiantes que tienen facilidad con las TIC, me parece que es un concepto incompleto ya que se basa en un corte por fecha o por decirlo por edad, el cual se sostiene solo en zonas con solvencia económica.

Hablar de que son más inteligentes por estar expuestos a la tecnología también me parece un despropósito, creo que hay dos cosas que especialmente dejan de lado quienes apoyan esta categorización con fiereza, 1) los chicos no solo tienen acceso a la tecnología, tienen mucho tiempo libre para usarla 2) No tienen temor a equivocarse (todavía) por lo mismo a prueba y error descubren como usarla.

Noten que entonces con estos dos puntos no es que nazcan con nuevo chip, que nosotros hayamos nacido con transistores o nuestros padres con bulbos, cada generación dependiendo de su capacidad económica, cultural y otros parámetros ha tenido una exposición diferenciada ya no digamos uso y apropiación a las diferentes tecnologías disponibles.

Pero el punto que más me lleva a pensar sobre esta generalización es que mucha gente mayor que de por si se siente presionada por la velocidad con la que los jóvenes utilizan ahora la tecnología, se siente hoy día más presionados y se auto sabotean al pensar que ellos deben usarla así de rápido, cuando en realidad ellos ya saben mucho más que los otros y si deben aprender cosas, pero no las mismas y en los cursos de formación digital, estamos poniendo énfasis en intenciones distintas, valga el ejemplo que he mencionado en clase y que alude a mi entorno de trabajo.

En algún momento estas materias se sacaron del currículo con la justificación de que todos saben usar una computadora, por lo mismo no hay necesidad de tener una materia que enseñe a usarla, es decir se confundió el medio con el fin, para ponerlo en una metáfora, todos tenemos pies y todos aprendimos a caminar… y no,  yo prefiero ponerlo en, si todos caminamos, pero no por tener pies mañana vamos a participar en un maratón y siquiera terminarlo, hay que aprender a usar las herramientas de las mejores formas o dicho de otra forma no vamos a enseñar a usar la computadora, enseñamos a usar la computadora para hacer cosas escolares y profesionales.


Viernes 23 de enero de 2015

Miguel de Icaza

Miguel de Icaza
Miguel de Icaza

In Defense of the Selfie Stick

From the sophisticated opinion of the trendsetters to Forbes, the Selfie Stick is the recipient of scorn and ridicule.

One of the popular arguments against the Selfie Stick is that you should build the courage to ask a stranger to take a picture of you or your group.

This poses three problems.

First, the courage/imposition problem. Asking a stranger in the street assumes that you will find such a volunteer.

Further, it assumes that the volunteer will have the patience to wait for the perfect shot ("wait, I want the waves breaking" or "Try to get the sign, just on top of me"). And that the volunteer will have the patience to show you the result and take another picture.

Often, the selfista that has amassed the courage to approach a stranger on the street, out of politeness, will just accept the shot as taken. Good or bad.

Except for a few of you (I am looking at you Patrick), most people feel uncomfortable imposing something out of the blue on a stranger.

And out of shyness, will not ask a second stranger for a better shot as long as the first one is within earshot.

I know this.

Second, you might fear for the stranger to either take your precious iPhone 6+ and run, or even worse, that he might sweat all over your beautiful phone and you might need to disinfect it.

Do not pretend like you do not care about this, because I know you do.

Third, and most important, we have the legal aspect.

When you ask someone to take a picture of you, technically, they are the photographer, and they own the copyright of your picture.

This means that they own the rights to the picture and are entitled to copyright protection. The photographer, and, not you, gets to decide on the terms to distribute, redistribute, publish or share the picture with others. Including making copies of it, or most every other thing that you might want to do with those pictures.

You need to explicitly get a license from them, or purchase the rights. Otherwise, ten years from now, you may find yourself facing a copyright lawsuit.

All of a sudden, your backpacking adventure in Europe requires you to pack a stack of legal contracts.

Now your exchange goes from "Can you take a picture of us?" to "Can you take a picture of us, making sure that the church is on the top right corner, and also, I am going to need you to sign this paper".

Using a Selfie Stick may feel awkward, but just like a condom, when properly used, it is the best protection against unwanted surprises.

Jueves 22 de enero de 2015

Curso: Seguridad en el Desarrollo Web

El día 27 de enero participare en un proyecto de, dando el tema de Seguridad en Servidores, en el cual se verán las amenazas comunes que puede sufrir un servidor conectado a Internet. Aprenderemos a monitorear los servidores y a protegerlos frente a este tipo de ataques maliciosos evitando que se conviertan en un blanco fácil para cualquier tipo de atacante.

Sí te interesa saber más checa el programa con cursos.

Dinámica de las sesiones
El objetivo general de esta nueva inciativa es capacitar al profesional para incorporar técnicas de Seguridad tanto a su profesión como a sus aplicaciones. A lo largo de tres semanas llevaremos a cabo una sesión diaria de una duración aproximada de 90 minutos + turno de preguntas a cargo de algunos de los mejores profesionales internacionales en el mundo de la seguridad online.

La plataforma elearning donde se imparten las sesiones te permitirá visualizar la exposición y práctica de cada ponente en tu propio equipo con la máxima calidad, además podrás plantear tus dudas en directo mediante chat o mediante audio y disfrutar de un completo set de herramientas con las que sacar el máximo partido con el mínimo esfuerzo.

Todas las sesiones se celebrarán a las 20:30 horas España (península), es decir 13:30 horas de México, 14:30 de Colombia y Perú, o 16:30 horas de Chile y Argentina. Además todas las clases quedarán íntegramente grabadas en vídeo por lo que no tendrás que preocuparte si por cualquier compromiso no puedes asistir a una o a todas las sesiones.

¿A quien se dirige este Congreso?
A todos aquellos desarrollares, diseñadores y administradores de un sitio web que quieran crear o participar en proyectos robustos gracias a un código seguro protegiéndo la información sensible y crítica manejada en una aplicación web.

Más info[+]

Martes 20 de enero de 2015

Miguel de Icaza

Miguel de Icaza
Miguel de Icaza

In Defense of the Selfie Stick

From the sophisticated opinion of the trendsetters to Forbes, the Selfie Stick is the recipient of scorn and ridicule.

One of the popular arguments against the Selfie Stick is that you should build the courage to ask a stranger to take a picture of you or your group.

This poses three problems.

First, the courage/imposition problem. Asking a stranger in the street assumes that you will find such a volunteer.

Further, it assumes that the volunteer will have the patience to wait for the perfect shot ("wait, I want the waves breaking" or "Try to get the sign, just on top of me"). And that the volunteer will have the patience to show you the result and take another picture.

Often, the selfista that has amassed the courage to approach a stranger on the street, out of politeness, will just accept the shot as taken. Good or bad.

Except for a few of you (I am looking at you Patrick), most people feel uncomfortable imposing something out of the blue on a stranger.

And out of shyness, will not ask a second stranger for a better shot as long as the first stranger is within earshot.

I know this.

Second, you might fear for the stranger to either take your precious iPhone 6+ and run. Or even worse, that he might sweat all over your beautiful phone and you might need to disinfect it.

Do not pretend like you do not care about this, because I know you do.

Third, and most important, we have the legal aspect.

When you ask someone to take a picture of you, technically, they are the photographer, and they own the copyright of your picture.

This means that they own the rights to the picture and are entitled to copyright protection. The photographer, and not you, gets to decide on the terms to distribute, redistribute, publish or share the picture with others. Including making copies of it, or most every other thing that you might want to do with those pictures.

You need to explicitly get a license from them, or purchase the rights. Otherwise, ten years from now, you may find yourself facing a copyright lawsuit.

All of a sudden, your backpacking adventure in Europe requires you to pack a stack of legal contracts.

Now your exchange goes from "Can you take a picture of us?" to "Can you take a picture of us, making sure that the church is on the top right corner, and also, I am going to need you to sign this paper".

Using a Selfie Stick may feel awkward, but just like a condom, when properly used, it is the best protection against unwanted surprises.

Lo que dejo el año viejo

  • Gallery [1] dejo de ser soportado a mediados del año y me entere justo antes de salir de vacaciones, tengo que buscar un remplazo.
  • Zenphoto no me gusto como remplazo… y creo que tiene un rato que anda descuidado [2]
  • Coppermine no me gusta como remplazo de Gallery [3]
  • Aprendí mucho más de Moodle, Claroline y otros muchos LMS [4] de lo que hubiera deseado y espero también se publique un articulo al respecto.
  • Logre pasar unas vacaciones offline casi por completo.
  • Dormí como no había hecho en un buen rato.
  • Planetalinux se movió lejos, pero ahora ya esta de regreso, geográficamente esta lejos, se encuentra cerca y me involucre un poco más.
  • Aprendí que las prioridades cambian con el tiempo, de primera mano
  • Y que es cierto eso de que hay cosas que no se pagan con dinero, sobre todo las satisfactorias.
  • Todavía queda mucho por hacer este año, mucho por organizar y más por concretar, esperemos como lo he planeado pueda sacar el mejor provecho del mismo.


Lunes 19 de enero de 2015

Gustavo Rubio

Gustavo Rubio
Ahí vamos

The invented here syndrome

lazywebCuenta la historia que, hace muchos años, cuando los programadores eran hombres y se escribían sus propias rutinas, clases, funciones y módulos, un fenómeno conocido como reutilización de código comenzaba a volverse hip, igual que las canciones de MC Hammer, los trolls y otras cosas espantosas de la epoca. Para entonces, los más viejos, y no por ello sabios, arraigados a sus ortodoxas, anticuadas y puercas formas, sufrían de lo que se le conoce hoy como el “Not Invented Here” syndrome, o el síndrome de “No se hizo aquí” que significa, en breve, solo utilizar recursos propios de la empresa y evitar a toda costa aquellos de externos, palabras más, palabras menos.

The “Not invented here” syndrome

Desarrollar software es una de las disciplinas más complejas que existen. Quien se dedique a esta biznaga lo sabrá, y quienes no probablemente no lo comprenderán. Y es que, como siempre comento, para desarrollar software útil uno debe no solamente entender su propia profesión relacionada con código, lenguajes de programación, lógica, razonamiento, matemáticas, cálculo y demás chunches sino que además debe entender perfectamente bien el negocio para el cual está desarrollando el producto, sería tonto pensar que solo con saber ciencias computacionales podríamos ser útiles a la sociedad. Para realizar un artefacto (virtual, en este caso) que ayude a mejorar el flujo de trabajo, ahorrar tiempo y eficientar procesos de otros sectores laborales es imperante que uno como ingeniero en software, programador o desarrollador entienda perfectamente bien el problema que intenta solucionar, de hecho, y la mayoría de las veces, aun mejor que quien nos paga para solucionar dicho problema.

Habiendo entonces tantos problemas que solucionar, diagramas que diseñar, juntas, análisis, levantamiento de requerimientos, etc. queda, sino mínimo, sí muy limitado tiempo para hacer lo que nos gusta, “tirar código“, como dicen mis colegas, y es por esta razón que conforme la computación se volvió mas accesible y sobre todo el Internet, se propuso, de manera extra oficial, ayudarnos los unos a los otros, como dice por ahí en algunas escrituras.

Verán, el hecho de reutilizar el trabajo de otros no es nada nuevo. Una de mis frases favoritas, y probablemente lo he dicho un millón de veces es aquella de Sir Isaac Newton, aplicable siempre a muchos de mis posts:

If I have seen further than others, it is by standing upon the shoulders of giants

Mi estimado Isaac se refiere al hecho de que, reutilizando y apoyandose en el trabajo de terceros es posible progresar, de alguna manera, el poder invertir nuestro preciado tiempo solucionando otros problemas nos permite tener mejores resultados, es decir, si ya existen motores que nos permiten mover vehículos es más inteligente reutilizar las leyes de la física, comprobadas, de un motor de bobina o de combustión que reinventar uno nuevo basado en alguna otra cosa. “If it works, don’t try to fix it” es el motto de muchos ingenieros.

Sin embargo, a pesar de esta filosofía, existe aún mucho programador decidido a utilizar solamente su código o aquel de sus colegas propios del mismo empleador. Verán, el programador es un animal sumamente ególatra, celoso de su trabajo y posesivo y hará lo que sea para demostrar que sus dancing moves son los mejores, aun cuando, francamente, a nadie le importa.  Lo anterior se conoce como el not invented here syndrome, o el sindrome de “No está hecho aquí” y aunque cada vez se ha vuelto menos común esta actitúd, aun existe, sobre todo en aquellos de la vieja escuela, no dispuestos a aceptar que hay alguien que probablemente lo haya hecho mejor que nosotros.

El sindrome de “No está hecho aquí” se ha desterrado de muchas industrias a lo largo de los años, no solo de la del desarrollo de software, por ejemplo, hace años, cualquier empresa de manufactura de electrónicos probablemente diseñaría la mayoría de los dispositivos, microcontroladores, tarjetas y chips de una televisión, hoy en día esta misma industria probablemente solo ensamble componentes, hechos en diferentes empresas, de diferentes países, globalización le llaman. ¿Por qué? Bueno porque permite una línea de ensamble muy rápida a menores costos lo cual se traduce a mejores ganancias, o sea lana.

Por otra parte, el hecho de tener enfocado a un equipo de trabajo o empresa en un área específica es sumamente redituable ya que especializa a dicho equipo o empresa a ser líder en su sector o ramo específico y sobre todo de invertir tiempo, dinero e investigación en problemas muy particulares mientras que su vecino de nave industrial hace lo mismo; dedicarse a resolver otros problemas muy particulares.

En nuestro estado, Baja California, existen infinidad de fábricas, o maquilas, como se les conoce, que se dedican a mercados verticales muy específicos, por ejemplo, asientos para aviones, marcos para ventanas, cajas de cartón. Si! Uno podría pensar, y bueno ¿Quién estaría interesado en fabricar marcos para ventanas exclusivamente? Bueno, toda la industria de construcción, hotelera, compañías dedicadas a materiales y muebles, etc. El beneficio es que quien se encarga de uno de estos mercados verticales lo hará perfectamente bien con procesos muy eficientados y esto se vuelve una cadena donde al final la suma de esos mercados verticales se traduce a un producto final para el consumidor de calidad.

El software no es muy diferente a estas otras industrias. Una aplicación requiere de infinidad de componentes y módulos que bien nos pueden llevar años terminar, es por ello que también existen casas de desarrollo y empresas dedicadas a vender productos para nosotros, los programadores, que podemos ensamblar y agregar extras para tener una aplicación útil para el consumidor en un tiempo relativamente corto, el tiempo es dinero así que entre más rápido se saque un release es mejor.

Recuerdo mis primeros pininos intentando hacer algo útil con un lenguaje de programación. Era más difícil de lo habitual, tenía uno muy pocas herramientas a la mano y había que hacer casi todo “a pata”. Alguna vez intenté hacer una aplicación de chat, que se conectara a la recién nacida red de Microsoft MSN, sin embargo, conforme pude juntar los requerimientos para mi aplicación en Visual Basic 6, me dí cuenta que inevitablemente tendría que programar un módulo de sockets TCP para realizar dicha comunicación. Logré realizar un pequeño cliente capáz de iniciar sesión y enviar mensajes, nunca recibirlos. Al final decidí que era más complicado de lo que parecía y tiré la toalla, de cualquier modo ni siquiera me pagaban por ello.

Si hubiera tenido el cuerno de la abundancia de componentes de terceros que existen ahora, y que permiten solucionar problemas muy específicos, otro gallo me hubiera cantado.

Los años dorados

Tiempo después de mis intentos (o varios) de aplicaciones, hace unos 15 años ya, el Internet mejoró no solo la comunicación de los mortales, como nos gusta llamarle a los usuarios comunes a nosotros los geeks, sino que además permitió a quienes ya estábamos metidos en esto volvernos más creativos; salas de chat de temas específicos donde podíamos compartir ideas, foros de Internet donde hacer preguntas cuando alguien estaba atorado en alguna parte de su código y claro, componentes o software de terceros, bien sea pagados o descargados, “de prestado” de algún FTP.

Por ejemplo, mi primer lenguaje de programación oficialmente fue Pascal, con Turbo Pascal de Borland. Aplicaciones de consola en Ms-Dos. No había mucha creatividad que explotar. Tiempo después me di cuenta que no llegaría muy lejos con dicha herramienta y me pasé Visual Basic 6 ya que era lo más fácil de tomar para alguien de la epoca, bien era esto, Visual C++ o Delphi. ¿Por qué no pasarme directamente a Delphi, si era la evolución natural de Turbo Pascal, con la misma empresa, y el mismo lenguaje que ya conocía pero orientado a objetos? Bueno, por los componentes!

Aquellos eran tiempos dorados para ambas empresas. Por una parte, Borland tenía con Delphi sus VCL’s que permitían crear interfaces de usuario en poco tiempo y con mucha funcionalidad, Microsoft Visual Basic 6 incluía ya también componentes que encapsulaban elementos de GUI’s que nos llevarían meses pulir en MFC de Visual C++. ¿El resultado? Bolsillos llenos de dinero tanto para ISV’s como para quienes extendían estos componentes y los vendían como 3rd party libraries listas para usarse, justo como tu madre dejó de hacer caldo de pollo para el guisado y comenzó a comprar cubos de Knorr Suiza.

La segunda ronda

Poco duró el gusto a quienes se estancaron desarrollando aplicaciones para el escritorio. Conforme hubo más Internet y velocidades de acceso más rápidas las aplicaciones web se volvieron un estandard, y con ello, las interfaces de usuario basadas en nuevas tecnologías como HTML con CSS para el diseño y Javascript para la interacción con el usuario. Pero así como Delphi, Visual Basic 6 y Microsoft Visual C++ tenían sus pormenores dependiendo la versión del sistema operativo, del compilador y de las librerías así nos pasó con el desarrollo web: diferentes versiones de navegadores suponían (y suponen aun, hasta el día de hoy) problemas de compatibilidad entre el mismo código, es parte de nuestro trabajo sí, pero lo hace más complicado, y nos quita tiempo, es una de esas cosas las cuales optamos por dejarle a alguien mas resolver mientras nosotros nos enfocamos en solucionar los problemas para los cuales nos ha pagado nuestro cliente o nos pagara nuestro usuario final.

Es así como nacen librerías como Dojo Toolkit, jQuery, y otras que nos permiten encapsular funcionalidad general para varios navegadores y desarrollar interfaces de usuario compatibles entre distintos entornos de una manera fácil.

El web developer vs el programador

Hay quienes onerosamente y con mucho orgullo se hacían llamar web developers. Una especia de nueva profesión nacida del programador de hobbie y con fuertes influencias de aquellos programadores de Visual Basic 6, a quienes seguramente estoy ofendiendo con la comparación, pero veamos, alguien que se dedica al “desarrollo web” suele ser usualmente alguien que:

  • Viene de la industria del diseño o alguna otra área creativa, completamente diferente a la del desarrollo de software
  • Busca maximizar la productividad con el esfuerzo mínimo
  • Entiende conceptos básicos de programación pero no el ciclo de desarrollo de software o teorías computacionales

Por otra parte, quienes se bautizaron en la industria del software con tecnologías como Visual Basic 6:

  • Tendían a ser personas con estudios técnicos con mucha práctica y poca teoría
  • Buscaban entregar productos con la mayor cantidad de características con el esfuerzo mínimo
  • Encapsulaban la mayoría de la carga pesada en el código de sus aplicaciones en componentes de terceros

Siendo que las industrias y sectores ajenos al del software no logran comprender la complejidad del nuestro, es común que buzzwords como web development se vuelvan una moda y se invierta buena cantidad de dinero en ser parte del movimiento, tal como en estos días todo es la nube, para gerentes, CTO’s y otros ejecutivos.

Y como vivimos en la selva y cada quien se tiene que rascar con sus propias uñas, no era raro que quienes ayudados por estos componentes de terceros, content management systems como joomla, drupal o wordpress y conocimientos básicos de programación se hayan vendido como… bueno, web developers.

A diferencia de un web developer, un programador suele conocer los fundamentos del desarrollo de software, metodologías, herramientas y teorías de ciencia computacional que al otro le parecen bien aburridas, pérdida de tiempo o simplemente difíciles de comprender.

Si bien un buen programador e inteligente, usará el trabajo de otros para agilizar su trabajo, conoce el balance entre uso y abuso porque, creanlo o no, como todo en esta vida, es posible abusar también del trabajo de terceros.

El sindrome de “Está hecho aquí

Hace apenas unos días, una situación que ocurrió en el trabajo, me hizo pensar y motivó a escribir este artículo. Era día de release o entrega al cliente, se probó una nueva versión del producto, todo parecía haber funcionado a la perfección tanto en el equipo del desarrollador de frontend encargado de este feature como en la mía al momento de hacer QA, se realizaron pruebas también en el servidor de producción de este feature, todo funcionaba correctamente.

Pasó el fin de semana y recibí un correo de nuestro cliente indicando que uno de los features no funcionaba. Pensé que algo mal habría hecho el cliente ¿Qué podría haber fallado? Es decir, pruebas en todos los entornos se realizaron sin que este feature en especial hubiera fallado.

El lunes al llegar a la oficina probamos el deployment hecho al servidor, efectivamente había un problema en una de las páginas, problema que NO se manifestó cuando inicialmente se hizo el deployment a producción. Después de un par de horas encontramos el problema, problema que fue causado por el framework de UI que utilizamos, AngularJS.

¿Cómo pudo haber pasado esto?

Muy sencillo, a pesar de haber probado el feature A, contra el entorno de producción, y sin problemas, posteriormente se hicieron otras actualizaciones totalmente diferentes al feature A y que de ninguna manera afectaban su funcionamiento, sin embargo hubo un factor diferente, ajeno a nuestro propio código: el script que se corre cada vez que actualizamos realiza un build o empaquetado del frontend por medio de bower:

bower install && bower update

Si, el culpable estaba ahí, no en nuestro código, sino en uno de los (muchos, muchísimos) plugins que utiliza AngularJS, específicamente uno encargado de las rutas de la aplicación.

Una de las veces que se ejecutó este comando, después de haber probado feature A, se actualizó el plugin dejando este feature A, que ya se había probado, con problemas. Es decir, la actualización de código que no controlamos introdujo un problema.

¿Cómo pudimos solucionarlo?

Básicamente tuvimos dos opciones:

  1. Actualizar el plugin, volviendo a ejecutar el comando, pues ya existía una nueva versión con este fix aplicado
  2. Ajustar la versión a una específica dentro de nuestro proyecto, a una que sabemos funciona sin problemas, de manera que bower no actualice nunca el plugin

Y, temporalmente, decidimos aplicar la opción 1, en lo que lograbamos entender realmente el problema y buscar una solución adecuada y de largo plazo.

¿Nos hemos vuelto holgazanes como programadores?

Esta es una pregunta que me hago, y les hago a mis compañeros de trabajo, en repetidas ocasiones. Tal como en algún momento, los programadores de Visual Basic 6 abusaron de los componentes de terceros siento que aun, en pleno 2015, seguimos aplicando las mismas tendencias y malas prácticas, las trajimos del desarrollo de software de aplicaciones de escritorio a las aplicaciones web.

Si bien no estoy en contra de librerías que encapsulan funcionalidad para manipular el DOM entre navegadores, object relational mappers para acceso a base de datos, etc. sí estoy en contra de su abuso.

Alguna vez en uno de mis anteriores empleos, mientras desarrollábamos una aplicación en ASP.Net, uno de mis compañeros, encargado de la parte de UI decidió que era buena idea agregar un DLL como dependencia extra para ahorrarnos trabajo en la generación de cierta parte del código, y, ¿Cuál era esa parte? Un menú, un menú de 5 elementos, una simple lista con 5 enláces para el cual agregamos una dependencia de 1.2Mb solo porque mi colega era demasiado huevón (o inútil) para agregar unas 20 líneas de código HTML y CSS para crear dicho menú pero, oh, nuestro componente incluso tenía un editor visual!

Esta misma aplicación, con esta dependencia contaba además con:

  • jQuery
  • Dojo
  • ASP.Net Ajax Toolkit
  • Otros…

Y esto solo como parte del UI. Podrán imaginarse la aplicación entera, dependencia sobre dependencia, con tiempos de compilación ridículos para lo que debía hacer nuestra aplicación.

La razón por la cual se utilizaron tantos frameworks y librerías es que algunos implementaban features que otros no tenían, es decir, siempre se buscó la manera de complementar la falta de características o plugins de uno con el de otro, pero jamás les pasó por la cabeza la solución mas cercana, obvia y al final del día razón para la cual nos habían contratado: programarlo nosotros mismos.

Hay quienes podrán criticarme y mencionarme términos como DRY, KISS y otros principios de desarrollo y yo les digo: fuimos contratados para programar y resolver problemas.

Es decir, no somos una línea de ensamble, aunque existan empresas que claramente eso quieren y necesitan. Aun, particularmente en entornos donde no necesariamente se vive un ambiente de “maquila de software” se vive un frenesí casi absurdo de dependencia de terceros, donde si utilizamos algo hecho por nosotros esté probablemente mal, porque, ¿sábes? alguien más ya lo hizo en github, pero ¿lo has probado? No! pero no voy a complicarme…

Herramientas como nuget, composer, gems, npm y demás si bien nos han facilitado la vida también nos han vuelto holgazanes, esperando siempre que alguien más resuelva nuestros problemas.

A esta holgazanería la he bautizado como “El sindrome de está hecho aquí”, queda estrictamente prohibido utilizar nuestro código en primer plano de prioridad porque, somos tontos, inferiores y menos inteligentes que cualquier otro indivudo en github.

Las consecuencias de la co-dependencia absurda en tiempos modernos

¿Existen consecuencias de abusar del uso de estos componentes de terceros? Claro! De hecho, todos los extremos son malos, ustedes saben, el ying y el yang.

Una de las cosas que hacen más estables a sistemas como Linux es la filosofía UNIX: cada componente del sistema debe realizar una tarea específica, y realizarla bien. El problema es que que ya no vivimos en tiempos de UNIX cuando los hombres eran hombres, y los programadores programaban. La facilidad y encapsulación de los nuevos lenguajes de programación de muy alto nivel nos han vuelto maquinas ensambladoras y menos pensadores, cuando se desarrollaron la mayoría de las herramientas base de UNIX había otro pensamiento entre el mundo de los ingenieros.

Aun cuando consideramos que cada componente debe realizar una tarea específica y bien hecha y que seguramente quien realizó dicho componente puso empeño en realizarlo con altos estándares de calidad, existen problemas naturales derivados de que quien realizó dichos componentes sufre de un mal común: ser humano. Los humanos no somos perfectos y nos equivocamos así que es muy común que nuestro software contenga bugs o problemas con cada versión, es entendible y natural.

El problema real se asoma cuando, en la búsqueda de volvernos más productivos, nos volvemos consumidores enfermizos del trabajo de otros. Una de las razones por las que más se quejaban los usuarios de aplicaciones a finales de los 90’s y principios de los 2000’s, sobre todo en entornos de Microsoft Windows era la poca calidad y estabilidad de los productos. ¿Adivinen quienes eran los culpables?  DLL’s, librerías de terceros, componentes hechos fuera de casa. Mientras que el fabricante de dicho software esperaba ansiosamente una actualización de dicha librería para solucionar el problema, problema que naturalmente estaría fuera de sus manos resolver pues era código sobre el cual no tenía experiencia, ya habría pasado suficiente tiempo para que tanto el producto como el fabricante fueran tachados como mala calidad, chafa, chino, etc.

No mucho ha cambiado desde entonces ya que solo nos movimos a otras plataformas. He visto aplicaciones web “modernas” utilizar librerías de terceros de una manera abusiva, helpers de bases de datos que agregan megabytes y megabytes a nuestro build solo para realizar algunas pocas validaciones, 35 plugins de node para poder hacer funcionar un pequeño componente de UI en angular.

Tal como los programadores, en su momento, y aun en dias actuales, de C++ y otros lenguajes de mas bajo nivel no temen crear sus propias librerías, frameworks y utilizar componentes de terceros cuando es estrictamente necesario así quienes nos dedicamos a desarrollar aplicaciones web y otras plataformas no deberíamos temer aplicar nuestros conocimientos para crear software inteligente y no solo ensamblarlo, basado en código de otros, código que en cualquier momento puede fallar y del cual no solamente no tenemos el suficiente conocimiento para mantener sino además los recursos.

La colaboración es una de las cosas más extraordinarias que nos ha dado el Internet y las tecnologías distribuidas y hacen nuestro trabajo emocionante e interesante, pero también pensar como solucionar problemas propios y no temer a hacer lo que se supone sabemos hacer es una de las cosas más gratificantes que puede haber, aun cuando podamos pensar que alguien más lo hizo mejor que nosotros. Nunca debemos subestimarnos, pero sobre todo, nunca hay que dejar de sorprendernos a nosotros mismos con lo que podemos hacer individualmente o en un mismo equipo de trabajo.

Y es que colaborar no es un delito pero la mente humana está desarrollada para tomar las mejores decisiones si el sujeto u objetivo en cuestión es uno mismo, ¿Cómo podría siempre, alguien más, decidir la mejor manera de hacer algo?

Existe una anécdota extraída del libro Gabby: A story of courage and hope, de Gabrielle Giffords y Mark Kelly, este último, piloto de la NASA quien llevó varias veces el transbordador allá arriba y esposo de la primera, ex-congresista de EUA y quien recibió un disparo en la cabeza en Arizona hace unos años:

as the doctor described the massively invasive surgery his wife would require, Kelly thought back to the poor decision-making at NASA that had resulted in two fatal accidents. Post-Challenger and -Columbia, NASA set up a conference room to facilitate good decision-making. One wall bears the warning “None of us is as dumb as all of us.”

Determined not to let the medical team march off in lockstep, Kelly gathered all the doctors and residents in a small break room at the hospital. “At NASA, one thing I’ve learned is you can’t ask the space shuttle commander or the flight director or the chief engineer their opinion first. You’ve got to seek out the opinion of the junior people,” said Kelly. So he chose the youngest looking person in the room–an opthamology resident–and asked for her opinion on the injury and procedure. He then went around the room until everyone had had a chance to voice their views. Ultimately, the doctors performed the operation.

Tal como Kelly lo menciona, “None of us is as dumb as all of us” así que quizá, y solo quizá, si de vez en cuando individualizamos nuestro trabajo como ingenieros de una manera objetiva e independiente, de manera que, pensemos en la mejor opción para resolver nuestro propio problema y no el de todos los demás (o el de alguien más en particular) entonces podamos tener mejores resultados. La NASA tomó esta filosofía después de los desastres del columbia y el challenger, no veo porque nosotros como ingenieros en software no podamos aplicarla también… de vez en cuando.


Viernes 16 de enero de 2015

Gerónimo Orozco

Gerónimo Orozco
Patux's booring news

OpenStackGDL Meetup Enero 2015


Jueves 15 de enero de 2015

Itzcoalt Alvarez Moreno

Itzcoalt Alvarez Moreno
Itzcoalt (itz) Álvarez

Buscando la Pasión

Recientemente y ante ciertos acontecimientos, me he puesto a pensar el papel que como padres tenemos en la elección de la carrera universitaria de nuestros hijos.

En teoría, la elección es de ellos, sin embargo, en muchas familias, la opinión de los padres o tal vez la tradición familiar los inclina hacia una profesión, padre contador, madre contadora, hijo contador, por mencionar un ejemplo.

Pero, me pregunto, ¿quiénes somos nosotros para definir o acaso influenciar en tan gran decisión a nuestros hijos?

Pues nadie, aun cuando nosotros paguemos la carrera, además, esta influencia puede ser perjudicial para ellos, porque, como siempre he mencionado, lo importante es que ellos encuentren la pasión que los alimente a seguir adelante, la pasión que les permita ser felices estudiando y haciendo lo que les gusta.

De nada sirve un Médico, que no ejerce, porque lo suyo es el baile clásico, se convierte en un mal médico, si es que alguna vez entra a ese mundo.

O peor aún, que tal si ellos no desean una educación universitaria, o si a lo que desean dedicarse no está basado en una licenciatura.

Finalmente es la decisión de ellos, y debemos respetarla, no obligarlos a hacer algo que no quieren.

Lo que si es importante, es ayudarles a encontrar su pasión, algunos lo hacen pronto, otros por desgracia nunca la encuentran y vagan de un oficio a otro.

Domingo 11 de enero de 2015

Farid Bielma

Oportunidades de la Reforma Energética para ingenieros

Recientemente, para un grupo de trabajo de la carrera de ingeniería industrial del Tecnológico de Monterrey, me hacían la pregunta: para ti, que ventajas trae la reforma energética que podamos aprovechar? Es oportuno mencionar, que por definición, costumbre o necesidad, egresados de esta ingeniería se especializan en temas de gestión de la calidad, sin embargo, con la reforma, existen un mundo que oportunidades que podrían aprovechar.

Enumero una lista de áreas de trabajo a los qué egresados de ingenierías podrían especializarse:

- Identificando o creando necesidades en el mercado
- Analizando la cadena de suministro y creando las oportunidades para optimizar algún proceso
- Diseñando y mejorando métodos de trabajo y resolviendo fallas de mercado
- Simular procesos de extracción
- Ayudando a detectar áreas de mejora para la incorporación de tecnología en la producción
- Participación en concursos públicos y/o privados: licitaciones

Viernes 09 de enero de 2015

Oswaldo Villa

Oswaldo Villa
Villatux Blog <--

Vaciar la cola de correo en postfix

Es una de las cosas secillas pero no menos importantes a la hora de administrar un servidor de correo.

Mostrar los correos encolados:

Eliminar un correo en cola:

postsuper -d queue_id

Ver contenido de un correo:

postcat -q queue_id

Eliminar TODOS los correos en cola:

postsuper -d ALL

Lunes 05 de enero de 2015

Héctor Daniel Cortés

Héctor Daniel Cortés
'Aztec Eagle' Turbo

Fedora 21 (Twenty One)

Año nuevo (2015), Fedora nuevo (21).

Como ya es bien sabido, en esta ocasión hay tres sabores de Fedora: WorkStation, Server y Cloud. Siempre he dudado si Fedora es una distribución adecuada para servidores. En su lugar prefiero Scientific Linux. En cuanto a la nube... habrá que probrarlo.

Mi workstation (en realidad no es mía, pero la UNAM me la presta) requiere la siguiente instrucción para el proceso de actualización:

# fedup --product=workstation --iso Fedora-Server-DVD-x86_64-21.iso --network 21

Ya ha terminado de descargar los archivos... así que volveré cuando termine la instalación.

Jueves 01 de enero de 2015

José Oviedo

José Oviedo

WordPress: Como actualizar wordpress y plugins sin necesidad de contar con FTP o SFTP

Si en tu servidor web donde tienes instalado worpress no cuentas con una conexión FTP o no la quieres agregar en la configuración de wordpress, pero al momento de quere actualizar cualquier plugin o versión de wordpress te solicita información de tu conexión FTP y te marca el error:

Ha sido imposible conectar con el servidor FTP localhost:21

Existe una solución para que todo este proceso lo haga directamente en los archivos de wordpress, solo se necesita agregar la siguiente linea en el archivo de configuración wp-config.php , lo pueden agregar hasta el final del archivo.


Y listo!, cuando actualicen, ya no solicitará información de la conexión

Domingo 28 de diciembre de 2014

Por que y cómo hackearon a

La asociación de editores de diarios españoles, ha sufrido ataques por hackers, estos dejando mensajes “chistosos” o “memes” qué han echo sacar una carcajada a más de uno en su pagina principal, el motivo principal es la Ley de Propiedad Intelectual que ha desplazado a google (news) de españa siendo el primer país en hacer esto (en el mundo mundial):


deface- Deface-2

La página de google news ( )  envía a una pagina de soporte la cual especifica el por que:

Lamentamos tener que informarte que Google Noticias ha cerrado en España y que las publicaciones de los editores españoles ya no aparecen en Google Noticias, a raíz de los recientes cambios en la legislación española. Comprendemos que usuarios como tú podáis estar descontentos con esta nueva situación y por ello queremos explicarte las razones por las cuales hemos tomado esta decisión.

Tras la aprobación de la reforma de la Ley de Propiedad Intelectual hemos tenido que cerrar el servicio de Google Noticias en España. Esta nueva legislación obliga a cualquier publicación española a cobrar, quiera o no, a servicios como Google Noticias por mostrar el más mínimo fragmento de sus publicaciones. Dado que Google Noticias es un servicio que no genera ingresos (no mostramos publicidad en el sitio web), este nuevo enfoque resulta sencillamente insostenible

Las personas que están inconformes con esta ley han buscado la forma de hacerse notar en las Web con su desacuerdo, el objetivo la web de la a asociación de editores de diarios españoles: “”, lo irónico usar google para descubrir por donde atacar:

google dork


La tercer pagina que google indexa “Zona Privada” claramente se nota un usuario y contraseña, el cual se deduce que contiene un form con un login para entrar algún panel de administración:


Cómo siempre eh dicho el internet es un mar de conocimientos que cualquiera puede pescar lo que quiera y a su conveniencia, al encontrar un formulario cómo este se puede hacer varias pruebas de penetración y una de ellas la más básica poner un ' para saltar algún error:


Aquí se puede ver que el mismo error te dice que hay hacer y ya depende de los conocimientos del atacante para poder obtener datos o modificar el sitio web:


Antes de realizar este post se notifico al webmaster ;-) .

{+ google cierra en españa via abc.}

Jueves 18 de diciembre de 2014

Miguel Barajas

Miguel Barajas
GnuOwned's Blog

Este es un pequeño tutorial que hicimos mi hijo Roberto y yo,...

Este es un pequeño tutorial que hicimos mi hijo Roberto y yo, sobre como construir una prueba de concepto para un panel de juegos estilo Jeopardy o 100 Mexicanos dijeron, con Arduino 2 leds, dos pushdown buttons y 3 resistencias.

Espero les guste :-)

Miércoles 17 de diciembre de 2014

El arte de buscar desde la terminal.

Para la mayoría de los linuxeros de hueso colorado esto es cómo el pan de cada día, el buscar desde la terminal se les hace más efectivo que entrar a una UI, aparte de que se ve más “und3rgr0unD”, existen varios comandos con sus diferentes atributos para poder crear la búsqueda perfecta de aquel archivo o palabra dentro de el, la mayoría opta por find qué es uno de los más conocidos.

find [ruta] [expresion_de_bosqueda] [accion]

Digamos que queremos buscar un archivo que se llama index, en el primer find, solo especifico el nombre con -name, el cual no me arroja un resultado, añado * el cual me buscará en cualquier carpeta dentro de donde este buscando, y ha arrojado unos resultados, en el ultimo especifico la carpeta www/ donde buscar:

root@1337 [/h/bucio]$ find  -name index
root@1337 [/h/bucio]$ find  -name index*
root@1337 [/h/bucio]$ find www/ -name index*
root@1337 [/h/bucio]$

El comando find, tiene la opción ya sea mayúsculas y minúsculas:

root@1337 [/h/bucio]$ find www/ -name index*
root@1337 [/h/bucio]$ find www/ -iname index*

Podemos hacer uso de expresiones irregulares para la búsqueda:

  • “[0-9]*” #Todo lo que comienza con dígitos
  • “[Oo]*” #Todo lo que comienza con la letra “o” mayúscula o minúscula
  • “[b-f]*.txt” #Todo lo que comienza con una letra entre la b y f y sea un .txt

root@1337 [/h/bucio]$ find www/ -name "[0-9]*"
root@1337 [/h/bucio]$ find www/ -name "[Oo]*"
root@1337 [/h/bucio]$ find www/ -name "[b-f]*.txt"

Realizar una búsqueda de archivos ocultos:

root@1337 [/h/bucio]$ find www/ -name ".*"
root@1337 [/h/bucio]$ find www/ -name ".*.php"
root@1337 [/h/bucio]$ find www/ -name ".*.jpg"

El atributo -user nos puede ayudara buscar los archivos que pertenece a cierto usuario, también existe -perm para buscar por permisos:

root@1337 [/h/bucio]$ find www/ -user bucio
root@1337 [/h/bucio]$ find www/ -user root
root@1337 [/h/bucio]$ find www/ -user root -perm 777

Para realizar búsquedas por fecha de modificación podemos usar -mmin (minutos), los valores pueden ser indicados de las siguientes formas:

  • +n busca valores mayor que n
  • -n busca valores menor que n
  • n busca exactamente el valor n

root@1337 [/h/bucio]$ find www/ -mmin -20 -type f #Archivos que hayan cambiado en los últimos 20 minutos
root@1337 [/h/bucio]$ find www/ -mmin 7 -type f #exactamente hace 07 minutos

El comando find, contiene más atributos para la búsqueda por tiempos: -amin, -atime, -cmin, ctime, -mmin y -mtime (“min” es para periodos de minutos y “time” para periodos de 24 horas.):

find . -mtime 0  #busca archivos modificados entre ahora y hace un día
find . -mtime -1  #busca archivos modificados hace menos de un día
find . -atime 1  #busca archivos accedidos entre hace 24 y 48 horas
find . -ctime +1  #busca archivos cuyo status haya cambiado hace más de 48 horas

Los que empiezan con “a” (access) indica el tiempo en que fue accedido (leido) por última vez un archivo. Los que empiezan con “c” (change) indica el tiempo que cambió por última vez el status de un archivo, por ejemplo sus permisos. Los que empiezan con “m” (modify) indica el tiempo en que fue modificado (escrito) por última vez un archivo. {via Linux Total}

El poder de -exec

-exec permite ejecutar incorporar comandos externos para ejecutar sobre el resultado devuelto por find, este comando fue muy usado cuando los “hackers” hacían un “mass deface” y modificaban todos los index, la ventaja de poder ejecutar comandos hace a -exec algo “especial”… jaja.

root@1337 [/h/bucio]$ find www/ -size 0 -exec ls {} \;

En comando anterior sale el atributo -size en cual puse 0 para archivos vacíos, seguido de -exec el cual ejecuta ls que nos devuelve una salida de ls se indica la cadena {} que se sustituye por cada salida de find.

Digamos que sabemos que una persona usa el cliente filezilla y sabemos que los archivos .xml se guardan las configuraciones “las contraseñas” y “usuarios” de sus (s)FTP y nos prestan la maquina y solo tenemos 10 min y un USB:

root@1337 [/h/bucio]$ find .filezilla/ -iname '*.xml' -exec cp '{}' /media/USB_delmal \;
root@1337 [/h/bucio]$ }:)

En el 2011 escribí un post parecido donde el tema era la búsqueda de palabras dentro de los archivos *.html, donde yo use xargs:

$> find -name *.html | xargs grep  title *
./index.html:               'a class="lightbox-image" rel="prettyPhoto[2]" href="{{image}}" title="{{title}}"' +
./index.html:                   'img src="{{image_s}}" alt="{{title}}" /' +

En el cual hubo la participación de varios amigos, donde aportaron las diferentes formas que ellos buscaban la cadena en un archivo:

gwolf comment 2011

#Por Gunnar Wolf
>$ find . -name '*.html' -exec grep -r title \{\} +
#Por GnuGet
>$ grep -Hirn cadena_a_buscar .
#Por Gaspar Fernandez
>$ egrep -R 'loquequierobuscar' *.htm

Existen más comando cómo grep, egrep etc… El cual nos pueden ayudar a realizar búsquedas más poderosas. Por el momento me quedo con find y exec, el cual para mi hacen buena combinación.

Y tú ¿Qué usas para las búsquedas dentro de la terminal?

Viernes 12 de diciembre de 2014

Alex Callejas

Que hacer cuando algo falla: Episodio II


No es desesperación, la desesperación es sólo para los que ven el final más allá de toda duda. Nosotros no lo hacemos…

Gandalf [J.R.R. TolkienLa Comunidad del Anillo]

Hace unos días, el buen Rod me comentó que tenía algunos problemas creando relaciones de confianza entre servidores utilizando llaves de SSH. La referencia obligada fueron dos posts anteriores: Mecanismos de confianza con llaves de SSH, donde compartí el procedimiento básico para generarlos, y Que hacer cuando algo falla, en caso de necesitar algún análisis de falla y poder encontrar la causa raíz de la misma, para solucionarla.

Sin embargo, después de varios días, el mecanismo seguía sin funcionar correctamente, por lo que hubo que analizar más a fondo el caso.


El userA desde el serverA se debe conectar al serverB como el userB de forma automática sin contraseña.


Ambos servidores están instalados igual, en el mismo segmento. La única diferencia entre ellos, era que el home de userB en serverB se encontraba bajo /opt.

Primer Análisis

De inicio, no obviamos nada y revisamos lo básico:

En serverA

  • Que exista la llave privada
  • El contenido de la llave pública sea una sola línea y sea el mismo en el serverB
[userA@serverA ~]$ ls -la .ssh/
total 20
drwx------. 2 userA userA 4096 Dec 11 10:32 .
drwx------. 3 userA userA 4096 Dec 11 11:08 ..
-rw-------. 1 userA userA 1675 Dec 11 10:32 id_rsa
-rw-r--r--. 1 userA userA 410 Dec 11 10:32
-rw-r--r--. 1 userA userA 796 Dec 11 19:24 known_hosts
[userA@serverA ~]$ wc -l .ssh/
1 .ssh/
[userA@serverA ~]$ cat .ssh/
ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAz59j3eSrdkgnQPvYpiFXL3EVqdgCE8Q7v4hFfCzORxXxSprXNpZW18L2BkEfo5P/JO//qGTyFSMrZbqRHAm6s7PR/idWbSGtZfXLt3ri5Rw4OUyLcDrXVqzhbBo3bvSADksXXYVcjDu2h0P8p70EOc1mouRsOph5bE0l4Yk2/RYZ6JfMI8DDbtpU/nKfPfdsysjeLQwOJ7XiXrKWwnqSZ+rP3Irol336RkPrgMpoQDzenkoMiAkc68cUYy1K85k1kv34gxWLFYK9riiXp4OriUFm62z7Fx2jaeDNPbLndDOBzCcm65P4b2j8K5vv8MshJtddWUypen+cB34lH7rjbw==

En serverB

  • Que los permisos del home de userB sean 700 y exclusivos del dueño
  • La llave pública se llame authorized_keys, en una sola línea y  con el mismo contenido que en el serverA
[userB@clientB ~]$ ls -ld ~/
drwx------. 3 userB userB 4096 Dec 11 19:20 /opt/userB/
[userB@clientB ~]$ ls -la .ssh/
total 16
drwx------. 2 userB userB 4096 Dec 11 19:20 .
drwx------. 3 userB userB 4096 Dec 11 19:20 ..
-rw-------. 1 userB userB 410 Dec 11 19:20 authorized_keys
-rw-r--r--. 1 userB userB 391 Dec 11 19:18 known_hosts
[userB@clientB ~]$ wc -l .ssh/authorized_keys 
1 .ssh/authorized_keys
[userB@clientB ~]$ cat .ssh/authorized_keys 
ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAz59j3eSrdkgnQPvYpiFXL3EVqdgCE8Q7v4hFfCzORxXxSprXNpZW18L2BkEfo5P/JO//qGTyFSMrZbqRHAm6s7PR/idWbSGtZfXLt3ri5Rw4OUyLcDrXVqzhbBo3bvSADksXXYVcjDu2h0P8p70EOc1mouRsOph5bE0l4Yk2/RYZ6JfMI8DDbtpU/nKfPfdsysjeLQwOJ7XiXrKWwnqSZ+rP3Irol336RkPrgMpoQDzenkoMiAkc68cUYy1K85k1kv34gxWLFYK9riiXp4OriUFm62z7Fx2jaeDNPbLndDOBzCcm65P4b2j8K5vv8MshJtddWUypen+cB34lH7rjbw==

Al comparar el md5 de ambos archivos de llave pública daba el mismo hash:

b02e3cc11c58c8ba36677316bf52ed74  .ssh/
b02e3cc11c58c8ba36677316bf52ed74  .ssh/authorized_keys

Sin embargo, al hacer pruebas, el mecanismo de confianza no funcionaba:

[userA@serverA ~]$ ssh userB@serverB hostname
userB@serverb's password:

[userA@serverA ~]$ ssh -v userB@serverB hostname
OpenSSH_5.3p1, OpenSSL 1.0.1e-fips 11 Feb 2013
debug1: Next authentication method: publickey
debug1: Trying private key: /home/userA/.ssh/identity
debug1: Offering public key: /home/userA/.ssh/id_rsa
debug1: Authentications that can continue: publickey,gssapi-keyex,gssapi-with-mic,password
debug1: Trying private key: /home/userA/.ssh/id_dsa
debug1: Trying private key: /home/userA/.ssh/id_ecdsa
debug1: Next authentication method: password
userB@serverb's password:

[userA@serverA ~]$

Al revisar /var/log/messages y /var/log/secure no se encontraba evidencia alguna de la falla:

[root@clientB ~]# tail -f /var/log/messages /var/log/secure
==> /var/log/messages <==
Dec 12 12:33:30 clientB kernel: type=1305 audit(1418409210.149:4): audit_pid=952 old=0 auid=4294967295 ses=4294967295 subj=system_u:system_r:auditd_t:s0 res=1
Dec 12 12:33:30 clientB kdump: No crashkernel parameter specified for running kernel

==> /var/log/secure <==
Dec 12 12:33:31 clientB sshd[1050]: Server listening on port 22.
Dec 12 12:33:31 clientB sshd[1050]: Server listening on :: port 22.
Dec 12 12:33:40 clientB sshd[1192]: Accepted password for root from port 40110 ssh2
Dec 12 12:33:41 clientB sshd[1192]: pam_unix(sshd:session): session opened for user root by (uid=0)
Dec 12 12:54:30 clientB sshd[1212]: Connection closed by
Dec 12 12:54:38 clientB sshd[1214]: Connection closed by
[root@clientB ~]#

Segundo Análisis

Entonces revisamos la configuración de ssh, /etc/ssh/sshd_config, y lo modificamos para que sólo permita autenticación por llave y amarramos el nombre de la misma como authorized_keys2, para tratar de delimitar la falla:

[root@clientB ~]# cat /etc/ssh/sshd_config | grep ^[A-Z]
Protocol 2
SyslogFacility AUTHPRIV
AuthorizedKeysFile %h/.ssh/authorized_keys2
PasswordAuthentication no
ChallengeResponseAuthentication no
GSSAPIAuthentication no
GSSAPICleanupCredentials yes
UsePAM yes
X11Forwarding yes
Subsystem sftp /usr/libexec/openssh/sftp-server
[root@clientB ~]#

Generamos otra llave, de tipo dsa, y la copiamos en el serverB como authorized_keys2:

[userA@serverA ~]$ ssh-keygen -t dsa -b 1024
[userA@serverA ~]$ cat .ssh/
ssh-dss AAAAB3NzaC1kc3MAAACBAOpcPejQC+G/jRz3v9gUhaJy/CogjtOmXQG9zoL69pIOhKcMfjJy21GED49tS9kAw857WTpjEVzF3ssLJlS2LMqxIervQ/bsaH8WKSqUvueTMOw/4+fiwECbllCPE/g/ULozqJFssDUJlNdTAc+yA6qVbldqT69HVbNjyWeZc3dbAAAAFQDKiDJ5GwkZLiuXbYcJaElS881GtQAAAIEApXBcAfXHfewuQiHLHrBvnd0SePgjJmU8bUgfjWjwu4yoT4Z1aWy+FmtYoQGfc9SUHq4/u6EhwVUz9i7UXLW+WrEA+OtsAftEo0TjKjG8OeH4igcqsoSkosrj2QxLrf6I8l6YQnVIt5ufVtLoE4ZqCVrLtTnsS4elFeaR56hKKT8AAACAA83nEJaqK9tWm3k8RJQJZB5sEY/DAI0ZYd/TTtCKWIOXACz+G0iK+jj1JZtV40gZyJKzIFoD89FJh3RV8PZp1+UosK4kBYsxtP4WXvUjkhwVzh6PPu8A1/BJeEq/RvCqwBPinCY0rnAQrGwLCocMNkpnJxyqjg6ZLu2bsQo1HvE=
[userA@serverA ~]$ 

[userB@clientB ~]$ cat .ssh/authorized_keys2 
ssh-dss AAAAB3NzaC1kc3MAAACBAOpcPejQC+G/jRz3v9gUhaJy/CogjtOmXQG9zoL69pIOhKcMfjJy21GED49tS9kAw857WTpjEVzF3ssLJlS2LMqxIervQ/bsaH8WKSqUvueTMOw/4+fiwECbllCPE/g/ULozqJFssDUJlNdTAc+yA6qVbldqT69HVbNjyWeZc3dbAAAAFQDKiDJ5GwkZLiuXbYcJaElS881GtQAAAIEApXBcAfXHfewuQiHLHrBvnd0SePgjJmU8bUgfjWjwu4yoT4Z1aWy+FmtYoQGfc9SUHq4/u6EhwVUz9i7UXLW+WrEA+OtsAftEo0TjKjG8OeH4igcqsoSkosrj2QxLrf6I8l6YQnVIt5ufVtLoE4ZqCVrLtTnsS4elFeaR56hKKT8AAACAA83nEJaqK9tWm3k8RJQJZB5sEY/DAI0ZYd/TTtCKWIOXACz+G0iK+jj1JZtV40gZyJKzIFoD89FJh3RV8PZp1+UosK4kBYsxtP4WXvUjkhwVzh6PPu8A1/BJeEq/RvCqwBPinCY0rnAQrGwLCocMNkpnJxyqjg6ZLu2bsQo1HvE=
[userB@clientB ~]$ 

Sin embargo, la falla seguía presentándose:

[userA@serverA ~]$ ssh  -v userB@serverB hostname
debug1: Offering public key: /home/userA/.ssh/id_rsa
debug1: Authentications that can continue: publickey
debug1: Offering public key: /home/userA/.ssh/id_dsa
debug1: Authentications that can continue: publickey
debug1: Trying private key: /home/userA/.ssh/id_ecdsa
debug1: No more authentication methods to try.
Permission denied (publickey).
[userA@serverA ~]$ 

Aumentamos el nivel de log de sshd:

[root@clientB ~]# grep LogLevel /etc/ssh/sshd_config
LogLevel DEBUG
[root@clientB ~]#

Al hacer pruebas, continúa la falla, pero el /var/log/secure ya nos daba indicios de lo que estaba sucediendo:

[userA@serverA ~]$ ssh userB@serverB hostname
Permission denied (publickey).
[userA@serverA ~]$

[root@clientB ~]# tail /var/log/secure 
Dec 12 15:40:29 clientB sshd[1432]: debug1: trying public key file /opt/userB/.ssh/authorized_keys2
Dec 12 15:40:29 clientB sshd[1432]: debug1: Could not open authorized keys '/opt/userB/.ssh/authorized_keys2': Permission denied
Dec 12 15:40:29 clientB sshd[1432]: Failed publickey for userB from port 40376 ssh2
Dec 12 15:40:29 clientB sshd[1433]: Connection closed by
Dec 12 15:40:29 clientB sshd[1433]: debug1: do_cleanup
Dec 12 15:40:29 clientB sshd[1432]: debug1: PAM: cleanup
[root@clientB ~]# 

Revisamos los permisos especiales, y validamos las opciones de montado del filesystem:

[root@clientB ~]# lsattr /opt/userB/
[root@clientB ~]#
[root@clientB ~]# getfacl /opt/userB/
getfacl: Removing leading '/' from absolute path names
# file: opt/userB/
# owner: userB
# group: userB

[root@clientB ~]# df -hP /opt/userB
Filesystem                    Size Used Avail Use% Mounted on
/dev/mapper/vg_opt-userB_home 988M 1.3M 936M    1% /opt/userB
[root@clientB ~]#
[root@clientB ~]# tune2fs -l /dev/mapper/vg_opt-userB_home | grep -i options
Default mount options: (none)
[root@clientB ~]#

Tercer Análisis

Al no encontrar indicios en los permisos básicos y extendidos, procedimos a revisar los permisos desde el punto de vista de seguridad:

[root@serverA ~]# getenforce
[root@serverA ~]# ls -lZd /home/userA/
drwx------. userA userA unconfined_u:object_r:user_home_dir_t:s0 /home/userA/
[root@serverA ~]#

[root@clientB ~]# getenforce
[root@clientB ~]# ls -lZd /opt/userB/
drwx------. userB userB system_u:object_r:file_t:s0 /opt/userB/
[root@clientB ~]#

Al parecer, teníamos diferencia en los contextos de SELinux; entonces realizamos una prueba, deshabilitando momentáneamente la seguridad:

[root@clientB ~]# setenforce 0
[root@clientB ~]#
[root@clientB ~]# getenforce
[root@clientB ~]#

[userA@serverA ~]$ ssh userB@serverB hostname
[userA@serverA ~]$

Al deshabilitar SELinux la conexión se realizaba de forma exitosa; sin embargo, era un requisito del cliente tenerlo habilitado.

Para conocer exactamente el comando a ejecutar y restablecer el contexto correctamente; instalamos setroubleshoot, esta herramienta nos ayuda a diagnosticar los problemas con SELinux a partir de las alertas AVC generadas en el log de audit y las parsea para entregarnos información legible en /var/log/messages. Al hacer pruebas, encontramos dicho mensaje:

[root@clientB ~]# yum -y install setroubleshoot
[root@clientB ~]#
[root@clientB ~]# setenforce 1
[root@clientB ~]#
[root@clientB ~]# getenforce
[root@clientB ~]#

[userA@serverA ~]$ ssh userB@serverB hostname
Permission denied (publickey).
[userA@serverA ~]$ 

[root@clientB ~]# tail /var/log/messages 
Dec 12 16:56:32 clientB kernel: type=1305 audit(1418424992.590:4): audit_pid=952 old=0 auid=4294967295 ses=4294967295 subj=system_u:system_r:auditd_t:s0 res=1
Dec 12 16:58:26 clientB setroubleshoot: SELinux is preventing /usr/sbin/sshd from search access on the directory /opt/userB. For complete SELinux messages. run sealert -l f963dd2e-ab81-4c3a-99ad-4d4d1e6736d5
[root@clientB ~]# 

Al ejecutar el comando recomendado, éste nos decía:

[root@clientB ~]# sealert -l f963dd2e-ab81-4c3a-99ad-4d4d1e6736d5
SELinux is preventing /usr/sbin/sshd from search access on the directory /opt/userB.

***** Plugin restorecon (82.4 confidence) suggests *************************

If you want to fix the label.
/opt/userB default label should be usr_t.
Then you can run restorecon.
# /sbin/restorecon -v /opt/userB
[root@clientB ~]#

Ejecutamos la recomendación:

[root@clientB ~]# ls -lZd /opt/userB/
drwx------. userB userB system_u:object_r:file_t:s0 /opt/userB/
[root@clientB ~]#
[root@clientB ~]# restorecon -v /opt/userB
restorecon reset /opt/userB context system_u:object_r:file_t:s0->system_u:object_r:usr_t:s0
[root@clientB ~]#
[root@clientB ~]# ls -lZd /opt/userB/
drwx------. userB userB system_u:object_r:usr_t:s0 /opt/userB/
[root@clientB ~]#

Y al hacer pruebas:

[userA@serverA ~]$ ssh userB@serverB hostname
[userA@serverA ~]$ 

Causa Raíz

El home del usuario esta montado en un volumen sobre /opt, realizamos una prueba, desmontando el volumen y revisando el contexto del directorio y encontramos:

[root@clientB ~]# umount /opt/userB/
[root@clientB ~]#
[root@clientB ~]# ls -lZd /opt/userB/
drwx------. userB userB system_u:object_r:usr_t:s0 /opt/userB/
[root@clientB ~]#

Lo que nos indica que, cuando el usuario fue creado, al montar el volumen no se restablecieron los contextos de su home.

Gracias Rod por la confianza! fue un gusto apoyarte a resolver este caso y poder compartir la experiencia.

Espero les sirva…

Miércoles 10 de diciembre de 2014

Xenode Systems: Mejorar rendimiento de drivers MESA en Fedora 21