Miércoles 12 de diciembre de 2018

Usemos Linux: El IRS no esta listo para moverse a Linux debido a sus propios errores
Linux Adictos: Rocket League ha sido actualizado

Martes 11 de diciembre de 2018

Usemos Linux: EPIC Games Store amenaza a la tienda Valve Steam
Linux Adictos: ESET identifico 21 paquetes maliciosos que reemplazan a OpenSSH
Usemos Linux: Llega Nextcloud 15 con la posibilidad de crear redes sociales
Linux Adictos: Llega Firefox 64 con mejoras en la gestión de pestañas

Domingo 02 de diciembre de 2018

Visualizando estadisticas de pokemon usando plotly ( gráfica de radar)


Luego de un tiempo sin escribir, retomo los artículos sobre Ciencia de Datos, ahora con visualización de datos. Para ello se usará la estadística de un repositorio de datos sobre los pokemon.

El gráfico radar es un gráfico que consiste en una secuencia de radios equi-angulares, llamados radios, y cada radio representa una de las variables. La longitud de los datos de un radio es proporcional a la magnitud de la variable para el punto de datos en relación con la longitud máxima de la variable en todos los puntos de datos. Se dibuja una línea que conecta con los valores de los datos para cada radio. Esto le da a la trama una apariencia de estrella  (wikipedia).  Pueden ver un ejemplo en la siguiente figura:



La idea es mostrar multiples variables sobre la información que se tiene de los pokemons. El repositorio de datos de donde se obtiene los datos para trabajar es el sitio de kaggle.


La librería de Python que se usará en este artículo para visualizar los datos usando la gráfica radar se llama plotly, en el siguiente enlace podrán ver una galería de gráficas usando python, ya que dicha librería se puede usar también en el Lenguaje R y en Javascript. Lo bueno de plotly es que maneja más interactividad o dinamismo a las gráficas, no son simples gráficas estáticas.  Plotly se puede usar en línea o desconectado.

La idea de hacer este artículo sobre visualizando estadísticas de pokemon usando plotly fue de un artículo donde usan la gráfica radar pero con matplotlib.


El tutoral básico de como usar la gráfica radar en plotly lo pueden ver en el siguiente enlace.

Este artículo se basa en un notebook que se encuentra en kaggle.

La información que contiene el repositorio es la siguiente:


  • #: ID de cada pokemon.
  • Name: Nombre de cada pokemon.
  • Type 1: Cada pokemon tiene un tipo, esto determina su debilidad/resistencia a ataques.
  • Type 2: Algunos pokemon tienen dos tipos.
  • Total: Suma de todas las estadísticas.
  • HP: Hit point, o health.
  • Defense:  Nivel de resistencia a los ataques.
  • SP Atk: ataque especial.
  • SP Def:  Resistencia contra ataques especiales.
  • Speed: Velocidad en el ataque.




Se importa las librerías necesarias

In [1]:
import pandas as pd
import numpy as np
import plotly.plotly as py
import plotly.graph_objs as go
import plotly

import matplotlib.pyplot as plt
from plotly import tools
from plotly.offline import init_notebook_mode, iplot
init_notebook_mode(connected=True)
import plotly.figure_factory as ff
from IPython.display import HTML, Image

Se lee y convierte el archivo csv de los datos de pokemon en un dataframe

In [2]:
df=pd.read_csv("./datos/Pokemon.csv")

Se muestra las 5 primeras filas de datos

In [3]:
df.head()
Out[3]:
# Name Type 1 Type 2 Total HP Attack Defense Sp. Atk Sp. Def Speed Generation Legendary
0 1 Bulbasaur Grass Poison 318 45 49 49 65 65 45 1 False
1 2 Ivysaur Grass Poison 405 60 62 63 80 80 60 1 False
2 3 Venusaur Grass Poison 525 80 82 83 100 100 80 1 False
3 3 VenusaurMega Venusaur Grass Poison 625 80 100 123 122 120 80 1 False
4 4 Charmander Fire NaN 309 39 52 43 60 50 65 1 False

Se muestra el tipo de dato de cada columna que maneja el dataframe.

In [4]:
df.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 800 entries, 0 to 799
Data columns (total 13 columns):
# 800 non-null int64
Name 800 non-null object
Type 1 800 non-null object
Type 2 414 non-null object
Total 800 non-null int64
HP 800 non-null int64
Attack 800 non-null int64
Defense 800 non-null int64
Sp. Atk 800 non-null int64
Sp. Def 800 non-null int64
Speed 800 non-null int64
Generation 800 non-null int64
Legendary 800 non-null bool
dtypes: bool(1), int64(9), object(3)
memory usage: 75.9+ KB

Se visualiza los datos de un sólo pokemon

In [5]:
#Se busca los datos del pokemon Charizard
x = df[df["Name"] == "Charizard"]
#Se crea la grafica scatterpolar donde se le pasa las variables que se quiere graficar. HP, Ataque, defensa, SP atk,
#Sp def, velocidad y se define los nombres de los ejes.
data = [go.Scatterpolar(
r = [x['HP'].values[0],x['Attack'].values[0],x['Defense'].values[0],x['Sp. Atk'].values[0],x['Sp. Def'].values[0],x['Speed'].values[0],x["HP"].values[0]],
theta = ['HP','Attack','Defense','Sp. Atk','Sp. Def','Speed','HP'],
fill = 'toself'
)]

# se crea el layout, donde se le pasa un diccionario donde se define los ejes de los radios, que son visibles y
#su rango en este caso desde 0 a 250, no se muestra legenda, y el título de la gráfica.

layout = go.Layout(
polar = dict(
radialaxis = dict(
visible = True,
range = [0, 250]
)
),
showlegend = False,
title = "Stats of {}".format(x.Name.values[0])
)
#Se crea la instancia fig donde se pasa los datos y el layout.
fig = go.Figure(data=data, layout=layout)
#Se gràfica la gráfica
iplot(fig, filename = "Single Pokemon stats")



Comparación de 2 pokemons

In [6]:
# Se crea una función donde se hace la comparación vía gráfica de la estadística de dos pokemons.
def compare2pokemon(x,y):
#Se captura los datos de los dos pokemons
x = df[df["Name"] == x]
y = df[df["Name"] == y]

#Se define lo que se quiere gráficar del primer y segundo pokemon.
trace0 = go.Scatterpolar(
r = [x['HP'].values[0],x['Attack'].values[0],x['Defense'].values[0],x['Sp. Atk'].values[0],x['Sp. Def'].values[0],x['Speed'].values[0],x["HP"].values[0]],
theta = ['HP','Attack','Defense','Sp. Atk','Sp. Def','Speed','HP'],
fill = 'toself',
name = x.Name.values[0]
)

trace1 = go.Scatterpolar(
r = [y['HP'].values[0],y['Attack'].values[0],y['Defense'].values[0],y['Sp. Atk'].values[0],y['Sp. Def'].values[0],y['Speed'].values[0],y["HP"].values[0]],
theta = ['HP','Attack','Defense','Sp. Atk','Sp. Def','Speed','HP'],
fill = 'toself',
name = y.Name.values[0]
)

#se define data como una lista que contiene los datos de los dos pokemon
data = [trace0, trace1]

#Se define el layout como en la gráfica anterior.
layout = go.Layout(
polar = dict(
radialaxis = dict(
visible = True,
range = [0, 200]
)
),
showlegend = True,
title = "{} vs {}".format(x.Name.values[0],y.Name.values[0])
)
#Se crea la instancia donde se pasa los datos y el layout
fig = go.Figure(data=data, layout=layout)
#Se crea la grafica.
iplot(fig, filename = "Two Pokemon stats")
In [7]:
# Se compara primeape y muk
compare2pokemon("Primeape", "Muk")




En siguientes artículos se seguirá mostrando ejemplos de usos de la galería de gráficas de plotly.


Viernes 23 de noviembre de 2018

Ubuntips: El potencial de la literatura erótica

Jueves 22 de noviembre de 2018

Ubuntips: Problemas en Amazon antes del Black Friday

Viernes 09 de noviembre de 2018

Dear Martínez

Dear Martínez
La vida linux

¿Lo sabes todo sobre Geometry Dash?

Por supuesto a estas alturas eres un excelente jugador de Geometry Dash. Ya has empezado a aplicar nuestros trucos y vas dominando cada vez mejor el arte de esquivar objetos y pasar de nivel rápido. Pero, ¿realmente eres el experto en Geometry Dash que crees? Si quieres saberlo todo sobre este emocionante juego y que no se te escape ningún detalle, ¡sigue leyendo! En este post te damos la información que necesitas para saberlo absolutamente todo sobre Geometry Dash. ¿A qué esperas para disfrutarlo en tu móvil o tablet? ¡Descárgalo ahora desde la App Store o Google Play!

¿Cómo ha empezado Geometry Dash?

Puede que te lo imagines como un juego reciente, pero lo cierto es que Geometry Dash es un juego solo relativamente reciente, pues ha salido a la luz en agosto de 2013 de las manos de Robert Topala (RobTop). ¡Ahora ya sabes a quién tienes que agradecerle tus horas de diversión!

geometry dash

¿Con qué plataformas es compatible Geometry Dash?

Te encanta Geometry Dash y quieres jugar siempre que encuentras un hueco libre. Pero, ¿aún no sabías que está disponible no solo para tu tablet o móvil sino para tu ordenador también? ¡Geometry Dash es compatible con OS X, Microsoft Windows, iOS, Android y Windows Phone! Por lo tanto para tener el juego en cualquiera de estos sistemas operativos tan solo tienes que dirijirte a sus respectivas tiendas de aplicaciones: Amazon Store, geometry dash por Steam, App Store, Google Play y Windows App Store.

¿Cuál es el modus operandi de Geometry Dash?

Vale, sí, puede que ahora mismo ya estés de vuelta y media de cómo se juega a Geometry Dash, pero también puede ser tu primera vez y no saber muy bien qué tienes que hacer, por lo que vamos a recordarlo. En Geometry Dash lo único que tienes que hacer es tocar en la pantalla con el fin de evitar cualquir tipo de obstáculo que se interponga en el camino del protagonista del juego y de su vehículo. Sí, así de sencillo. Pero, ¡oye! No siempre es tan sencillo. Ten siempre en mente el ritmo y la anticipación. ¡Te vendrán de perlas!

¿Hay algún tipo de merchandising de Geometry Dash?

Nadie habla de camisetas o llaveros, pero sí de música y editores de niveles. Si quieres ir aún un paso más allá no dudes en bajarte los MP3 de este fascinante juego y memorizar sus melodías para poder crear tus propias coreografías con tus dedos al jugar. ¡Y lo mismo con el editor de niveles! Crea tus propios niveles y compártelos con toda la comunidad!

¿Conoces más datos interesantes sobre esta divertida aplicación? ¡Cuéntanos más y estate atento a nuestra siguiente publicación!

La entrada ¿Lo sabes todo sobre Geometry Dash? se publicó primero en La vida linux.

Martes 23 de octubre de 2018

Dear Martínez

Dear Martínez
La vida linux

Construye tu propio parque de atracciones

Prepárate para adentrarte en el maravilloso mundo de Theme Park, un juego de la mano de Electronic Arts que nos llevará a diseñar nuestro propio parque de atracciones, contando con cientos de misiones y el objetivo principal de hacer feliz a los niños de la ciudad.

Theme Park es un título Android que ya ha acaparado la mirada de miles de usuarios en todo el mundo, destacándose en gran medida por su sencilla modalidad de juego, así como también por su dinámica, gráficas y efectos especiales.

Construye tu propio parque de atracciones

Construye tu propio parque de atracciones

Cada usuario estará a cargo de su propio parque de diversiones, debiendo pensar estratégicamente la ubicación de cada atracción, así como también el precio de los tickets de ingreso. Deberás estar atento a cada momento, teniendo en cuenta que el trajín causado en las máquinas podría provocar roturas, las cuales deberán ser reparadas lo más rápido posible si no quieres perder a tu clientela.

Theme Park nos ofrecerá decenas de misiones para completar dentro de nuestro propio parque, ofreciéndonos premios y nuevos elementos a desbloquear. De esta manera, y poco a poco, tendremos la oportunidad de ir expandiendo el territorio y agregando nuevas atracciones o tiendas para hacer feliz a toda la ciudad.

Para adquirir Theme Park deberemos ingresar desde nuestro Android al sitio oficial de Google Play, efectuando una descarga de manera totalmente libre y gratuita.

Requerimientos:

Versión Android recomendada: 3.2 o superiores.

Memoria libre necesaria: 260 MB.

Enlace: Theme Park para Android

La entrada Construye tu propio parque de atracciones se publicó primero en La vida linux.

Lunes 22 de octubre de 2018

Dear Martínez

Dear Martínez
La vida linux

Cómo iniciar sesion en Hotmail

Hotmail es el correo electrónico más grande del mundo podriamos decir que es el #1 preferidos por millones de personas en el mundo. Este cuenta con mas de 100 millones de usuarios en todas partes del mundo, Hotmail nos ofrece un completo servicio de correo electrónico, mensajería instantánea y la más completa información a través de su pagina oficia MSN

Hoy en dia Tener una cuenta de correo electronico se  a combertido en primordial por que esta viene siendo nuestro celular de contacto en la web! y no más que eso nuestro passaporte para poder accerde a paginas del internet. por eso usted deberia de tener una cuenta Hotmail ya que es una de las plataformas mas seguras del mundo y una de la mas completa dicho por millones de personas. Hoy en dia nos enfocaremos a mostrarle como Iniciar Sesión Hotmail.

Iniciar Sesión en Hotmail es muy sencillo siga nuestra guía para tener un mejor entendimiento de como va poder accerder a hotmail.com Lo primero que deben hacer es registrarse en Hotmail, lo cual es bastante fácil y en breve les estaremos mostrando los pasos a seguir en esta guía.

hotmail iniciar sesion

Para que puedan acceder directamente a hotmail.com pueden ingresar mediante el botón que les agregué a la derecha, para que de esa manera vayan directo a iniciar sesión hotmail.

– Primer Paso: Una vez que se hayan registrado, lo único que deben hacer es ingresar a hotmail.com y llenar las dos casillas que podemos observar en la imagen que tenemos arriba, estas dos casilla es una de Usuario o Window Live ID que solo debe colocar allí su email y la de debajo es la de su Contraseña, aquellas contraseña que colocarion cuando se registraron. Para seguir hacemos click en “Iniciar Sesión

– Segundo Paso: Encontrara la pagina de inicio de Hotmail.com como puede observar mas debajo, donde podra encontrar varios botones y una barra buscadora.

– Tercer Paso: Le explicaremos un poco cada boton que puede ver aqui:

Si su interes es entrar a su “Bandeja de entrada” usted debera de oprimir el boton que dice Hotmail como mostramos señalandoselo con el #1

Si su interes es modificar su perfil de Messenger iniciar sesion en messenger entonces puede efectuar esos cambio haciendo click en el Boton señalado con el #2

Si le interesa Buscar un correo, como puede ver en la imagen en el #3 le señalamos una barra buscadora donde podra encontrar cualquier correo que se le haya enviado, ojo esto simplemente para buscar correos de manera rapida si desea ver todos sus correos sin filtro haga click en hotmail (#1). Esta herramienta esta diseñada para busquedas rapidas de email enviados y recibidos.

– Cuarto Paso: Como puede ver en la foto debajo este es lo que debe de ver “Su bandeja de entrada Hotmail”

Como puede ver en la parte superior cuenta con las herramientas requeridas para podes crear, reponder, reenviar, borrar, mover cualquier email que desee. Simplemente le aparecer una lista de los correo más nuevo en orden de llegada (Si posee las opciones predeterminadas). y en la parte derecha en el recuadro mas grande se encuentra el cuerpo del mensaje donde puede leerlo solo haciendo click en el email que desea. Si quiere abrir y leer sus mensajes en una pantalla mas grande solo debe de hacer doble click en el mensaje y podra observar que la pantalla se adapta y desaparece sus lista de email haciendo que la pantalla de leer los email sea más amplia.

En este Blog les estaremos informando en unos dias sobre como Iniciar Sesión Hotmail desde diferentes tipos de dispositivos ya sea Movil o Tabletas.

Hotmail Cuenta con una amplia gama de herramientas que se les ofreces a sus usuarios de forma gratuita. Se puede decir que hotmail a sido y seguirá siendo el sistema de mensajería mas eficaz y completo que se ha podido crear. Desde sus inicios hace años hasta ahora bajo la sombrilla de la Marca Microsoft se ha vuelto líder en su mercado, Siempre innovando y realizando mejoras que hoy en día nos sirven a cada uno de nosotros para poder comunicarnos de manera rápida y segura.

Solo usted al iniciar Sesión en Hotmail podrá sentir que ha hecho la mejor elección de todas, Protejase de sistema de mensajerías baratos que prometen seguridad y estabilidad y ningunas de estas dos son capaces de proveer con homogeneidad.

Si desea iniciar Sesión en Hotmail puede hacer click en el boton que le mostramo debajo:

Entrar a Hotmail.com

La entrada Cómo iniciar sesion en Hotmail se publicó primero en La vida linux.

Domingo 14 de octubre de 2018

Analizando datos del cambio climático y niveles de CO2 en la atmosfera con Python y pandas.

Continuando con los artículos sobre ciencia de datos, esta vez se analizará datos sobre información del clima global y por países, así como los niveles de CO2.

Estos datos y proyecto los encontré en el sitio kaggle, este sitio es para publicar proyectos de ciencia de datos. Los datos para este artículo lo encuentran en el siguiente enlace

El código de este artículo se basa en el artículo que se encuentra en kaggle sobre el tema en inglés Climate Change and CO2 levels in atmosphere.

En este artículo se explora los cambios globales de la temperatura media y el incremento de la concentración del CO2 en la atmosfera.

Los datos se obtienen de los siguientes archivos:

  • GlobalLandTemperaturesByCountry.csv: Contiene la información de la temperatura por país.
  • GlobalTemperatures.csv: Contiene la información global de la temperatura.
  • archive.csv: Contiene la información de los niveles de CO2 en la atmosfera.


A continuación se muestra el notebook:

Se importa las librerías de pantas, matplotlib y seaborn.

In [1]:
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

Se crea los dataframes a partir de los archivos csv.

In [2]:
# Se crea el dataframe data_pais, data_vzla, data_global y co2_ppm

data_pais = pd.read_csv("./datos/GlobalLandTemperaturesByCountry.csv")
#Se crea una copia del dataframe obteniendo solo la información de Venezuela.
data_vzla = data_pais[data_pais["Country"] == "Venezuela"].copy()
data_vzla["dt"] = pd.to_datetime(data_vzla["dt"])

#Se crea una copia del dataframe obteniendo solo la información de Argentina.
data_arg = data_pais[data_pais["Country"] == "Argentina"].copy()
data_arg["dt"] = pd.to_datetime(data_arg["dt"])

#Se crea una copia del dataframe obteniendo solo la información de USA.
data_canada = data_pais[data_pais["Country"] == "Canada"].copy()
data_canada["dt"] = pd.to_datetime(data_canada["dt"])

#Se crea una copia del dataframe obteniendo solo la información de Mexico.
data_mexico = data_pais[data_pais["Country"] == "Mexico"].copy()
data_mexico["dt"] = pd.to_datetime(data_mexico["dt"])

#Se crea una copia del dataframe obteniendo solo la información de Brasil.
data_brasil = data_pais[data_pais["Country"] == "Brazil"].copy()
data_brasil["dt"] = pd.to_datetime(data_brasil["dt"])

#Se crea una copia del dataframe obteniendo solo la información de Venezuela.
data_chile = data_pais[data_pais["Country"] == "Chile"].copy()
data_chile["dt"] = pd.to_datetime(data_chile["dt"])

#Se crea el dataframe de la temperatura global.
data_global = pd.read_csv("./datos/GlobalTemperatures.csv")
#Se modifica la fecha y hora como datetime.
data_global["dt"] = pd.to_datetime(data_global["dt"])
#Se crea el dataframe del co2.
co2_ppm = pd.read_csv("./datos/archive.csv")

Los dataframes creados.

In [3]:
data_pais.head()
Out[3]:

dt AverageTemperature AverageTemperatureUncertainty Country
0 1743-11-01 4.384 2.294 Åland
1 1743-12-01 NaN NaN Åland
2 1744-01-01 NaN NaN Åland
3 1744-02-01 NaN NaN Åland
4 1744-03-01 NaN NaN Åland
Como se puede observar, se tiene la fecha, la temperatura promedio, la temperatura promedio de incertidumbre y país.
In [4]:
data_pais.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 577462 entries, 0 to 577461
Data columns (total 4 columns):
dt 577462 non-null object
AverageTemperature 544811 non-null float64
AverageTemperatureUncertainty 545550 non-null float64
Country 577462 non-null object
dtypes: float64(2), object(2)
memory usage: 17.6+ MB
Los tipos de datos de las columnas son dt objeto, temperatura promedio y temperatura promedio de incertidumbre son float64 y country como objeto

Venezuela

In [5]:
data_vzla.head()
Out[5]:

dt AverageTemperature AverageTemperatureUncertainty Country
562339 1824-01-01 24.613 0.824 Venezuela
562340 1824-02-01 24.670 2.017 Venezuela
562341 1824-03-01 25.527 1.065 Venezuela
562342 1824-04-01 25.732 1.771 Venezuela
562343 1824-05-01 24.999 1.157 Venezuela
Se tiene la misma información anterior pero sólo de Venezuela.
In [6]:
data_vzla.describe().T
Out[6]:

count mean std min 25% 50% 75% max
AverageTemperature 2086.0 25.025686 0.703189 22.777 24.52325 24.9825 25.49525 27.807
AverageTemperatureUncertainty 2086.0 0.586000 0.398460 0.084 0.31000 0.4540 0.76000 4.120
Se tiene 2086 datos, los cuales la temperatura promedio es 25.025 grados, y la incertidumbre es de 0.586, la desviación de la temperatura promedio es de 0.703, y de la incertidumbre es de 0.398, la mínima temperatura fue de 22.77, la máxima de 27.807.
In [7]:
data_vzla.corr()
Out[7]:

AverageTemperature AverageTemperatureUncertainty
AverageTemperature 1.000000 -0.319882
AverageTemperatureUncertainty -0.319882 1.000000
Las dos variables tienen una correlación contraria en cierta manera.

Argentina

In [8]:
data_arg.head()
Out[8]:

dt AverageTemperature AverageTemperatureUncertainty Country
25466 1855-05-01 10.745 1.499 Argentina
25467 1855-06-01 6.995 2.073 Argentina
25468 1855-07-01 6.901 1.568 Argentina
25469 1855-08-01 9.097 1.412 Argentina
25470 1855-09-01 11.316 1.384 Argentina
In [9]:
data_arg.describe().T
Out[9]:

count mean std min 25% 50% 75% max
AverageTemperature 1900.0 14.621194 4.846885 4.796 10.13225 14.6305 19.27875 23.290
AverageTemperatureUncertainty 1900.0 0.527338 0.465652 0.083 0.20900 0.3035 0.74525 2.974

Brasil

In [10]:
data_brasil.head()
Out[10]:

dt AverageTemperature AverageTemperatureUncertainty Country
77110 1832-01-01 24.935 1.372 Brazil
77111 1832-02-01 24.505 1.953 Brazil
77112 1832-03-01 24.617 1.359 Brazil
77113 1832-04-01 23.990 2.013 Brazil
77114 1832-05-01 23.124 1.592 Brazil
In [11]:
data_brasil.describe().T
Out[11]:

count mean std min 25% 50% 75% max
AverageTemperature 2164.0 24.699256 0.978787 21.797 24.02250 24.8295 25.44975 27.151
AverageTemperatureUncertainty 2164.0 0.572940 0.411794 0.060 0.24375 0.4160 0.84000 3.353

Chile

In [12]:
data_chile.head()
Out[12]:

dt AverageTemperature AverageTemperatureUncertainty Country
108248 1855-05-01 7.152 1.296 Chile
108249 1855-06-01 4.257 1.641 Chile
108250 1855-07-01 4.113 1.313 Chile
108251 1855-08-01 5.508 1.168 Chile
108252 1855-09-01 6.684 1.153 Chile
In [13]:
data_chile.describe().T
Out[13]:

count mean std min 25% 50% 75% max
AverageTemperature 1900.0 9.383474 3.179081 3.206 6.502 9.3815 12.37775 15.493
AverageTemperatureUncertainty 1900.0 0.572654 0.418011 0.114 0.281 0.3825 0.80300 2.408

Mexico

In [14]:
data_mexico.head()
Out[14]:

dt AverageTemperature AverageTemperatureUncertainty Country
338438 1835-01-01 15.810 1.484 Mexico
338439 1835-02-01 14.911 1.579 Mexico
338440 1835-03-01 16.826 1.858 Mexico
338441 1835-04-01 19.925 1.966 Mexico
338442 1835-05-01 22.037 1.609 Mexico
In [15]:
data_mexico.describe().T
Out[15]:

count mean std min 25% 50% 75% max
AverageTemperature 2145.0 20.567558 3.753343 12.064 17.109 21.050 24.164 26.926
AverageTemperatureUncertainty 2145.0 0.638233 0.547605 0.091 0.226 0.398 0.970 3.699

Canadá

In [16]:
data_canada.head()
Out[16]:

dt AverageTemperature AverageTemperatureUncertainty Country
97255 1768-09-01 5.257 3.107 Canada
97256 1768-10-01 -3.393 2.981 Canada
97257 1768-11-01 -12.829 3.967 Canada
97258 1768-12-01 -20.582 4.622 Canada
97259 1769-01-01 -24.756 4.722 Canada
In [17]:
data_canada.describe().T
Out[17]:

count mean std min 25% 50% 75% max
AverageTemperature 2504.0 -5.216659 12.878074 -28.736 -17.7025 -4.7285 7.41275 14.796
AverageTemperatureUncertainty 2504.0 1.256211 1.046127 0.123 0.2870 0.8980 2.12025 5.275
Se nota que las variaciones de la temperatura promedio de incertidumbre es mayor en Brasil, Venezuela, Mexico y Canadá en ese orden, con respecto a Chile y Argentina.

Incremento anual de la temperatura promedio global

In [18]:
annual_mean_global = data_global.groupby(data_global["dt"].dt.year).mean()
reference_temperature_global = annual_mean_global.loc[1951:1980].mean()["LandAndOceanAverageTemperature"]
annual_mean_global["Anomaly"] = annual_mean_global["LandAndOceanAverageTemperature"] - reference_temperature_global
In [19]:
plt.figure()
plt.style.use("fivethirtyeight")
annual_mean_global.loc[1960:2015]["Anomaly"].plot(figsize = (10,5), grid=True, legend=True)
plt.title("Anomalia anual de la temperatura promedio global")
plt.xlabel('')
plt.ylabel('Anomalia de la temperatura')
plt.show()



Se nota que anualmente el incremento de la temperatura tiene una tendencia ascendente que ha aumentado en los últimos años, este incremento en el año 2015 fue de 0.75 grados que es conscistente con el cambio climático.

Venezuela.

Se hace el mismo cálculo para el caso de Venezuela.
In [20]:
annual_mean_vzla = data_vzla.groupby(data_vzla["dt"].dt.year).mean()
reference_temperature_vzla = annual_mean_vzla.loc[1951:1980].mean()["AverageTemperature"]
annual_mean_vzla["Anomaly"] = annual_mean_vzla["AverageTemperature"] - reference_temperature_vzla
In [21]:
annual_mean_vzla.head()
Out[21]:

AverageTemperature AverageTemperatureUncertainty Anomaly
dt
1824 24.896545 1.516091 -0.420966
1825 25.071583 1.552083 -0.245928
1826 24.871900 1.440800 -0.445611
1827 25.156273 1.474182 -0.161238
1828 24.751818 1.516727 -0.565693
In [22]:
annual_mean_vzla.tail()
Out[22]:

AverageTemperature AverageTemperatureUncertainty Anomaly
dt
2009 26.084917 0.353917 0.767406
2010 26.150250 0.341333 0.832739
2011 25.677333 0.336750 0.359822
2012 25.688583 0.401417 0.371072
2013 25.912875 0.484500 0.595364
El último registro es del año 2013, el cual el incremento fue de 0.595 grados, hubo un pico en el año 2010 de 0.8332 grados.
In [23]:
plt.figure()
plt.style.use("fivethirtyeight")
annual_mean_vzla.loc[1960:2012]["Anomaly"].plot(figsize = (10,5), grid=True, legend=True)
plt.title("Variación promedio anual de la temperatura de Venezuela")
plt.xlabel('')
plt.ylabel('Incremento de la temperatura')
plt.show()




Argentina

In [24]:
annual_mean_arg = data_arg.groupby(data_arg["dt"].dt.year).mean()
reference_temperature_arg = annual_mean_arg.loc[1951:1980].mean()["AverageTemperature"]
annual_mean_arg["Anomaly"] = annual_mean_arg["AverageTemperature"] - reference_temperature_arg
In [25]:
annual_mean_arg.head()
Out[25]:

AverageTemperature AverageTemperatureUncertainty Anomaly
dt
1855 11.729250 1.711875 -3.090742
1856 13.998750 1.553167 -0.821242
1857 14.221083 1.993417 -0.598908
1858 14.015667 1.770750 -0.804325
1859 14.414583 1.635583 -0.405408
In [26]:
annual_mean_arg.tail()
Out[26]:

AverageTemperature AverageTemperatureUncertainty Anomaly
dt
2009 15.534417 0.215750 0.714425
2010 15.078833 0.218917 0.258842
2011 15.339667 0.219833 0.519675
2012 15.689000 0.265750 0.869008
2013 14.457125 0.276500 -0.362867
In [27]:
plt.figure()
plt.style.use("fivethirtyeight")
annual_mean_arg.loc[1960:2012]["Anomaly"].plot(figsize = (10,5), grid=True, legend=True)
plt.title("Variación promedio anual de la temperatura de Argentina")
plt.xlabel('')
plt.ylabel('Incremento de la temperatura')
plt.show()



Para el caso de Argentina la pendiente de la tendencia de incremento de la temperatura es menos pronunciada.

Brasil

In [28]:
annual_mean_brasil = data_brasil.groupby(data_brasil["dt"].dt.year).mean()
reference_temperature_brasil = annual_mean_brasil.loc[1951:1980].mean()["AverageTemperature"]
annual_mean_brasil["Anomaly"] = annual_mean_brasil["AverageTemperature"] - reference_temperature_brasil
In [29]:
annual_mean_brasil.head()
Out[29]:

AverageTemperature AverageTemperatureUncertainty Anomaly
dt
1832 23.858583 1.734500 -1.072247
1833 24.517833 1.450083 -0.412997
1834 24.346750 1.498083 -0.584081
1835 23.537500 1.298583 -1.393331
1836 23.921167 1.426083 -1.009664
In [30]:
annual_mean_brasil.tail()
Out[30]:

AverageTemperature AverageTemperatureUncertainty Anomaly
dt
2009 25.600583 0.185667 0.669753
2010 25.812417 0.158000 0.881586
2011 25.428917 0.204833 0.498086
2012 25.717083 0.231000 0.786253
2013 25.348125 0.262250 0.417294
In [31]:
plt.figure()
plt.style.use("fivethirtyeight")
annual_mean_brasil.loc[1960:2012]["Anomaly"].plot(figsize = (10,5), grid=True, legend=True)
plt.title("Variación promedio anual de la temperatura de Brasil")
plt.xlabel('')
plt.ylabel('Incremento de la temperatura')
plt.show()


En el caso de Brasil se nota un fuerte incremento en la decada de los 90s con un pico de más de 1 grado, luego la tendencia se ha estabilizado en 0.79 grados.

Chile

In [32]:
annual_mean_chile = data_chile.groupby(data_chile["dt"].dt.year).mean()
reference_temperature_chile = annual_mean_chile.loc[1951:1980].mean()["AverageTemperature"]
annual_mean_chile["Anomaly"] = annual_mean_chile["AverageTemperature"] - reference_temperature_chile
In [33]:
annual_mean_chile.head()
Out[33]:

AverageTemperature AverageTemperatureUncertainty Anomaly
dt
1855 7.070125 1.424125 -2.510742
1856 8.664083 1.319250 -0.916783
1857 8.645917 1.439250 -0.934950
1858 8.810250 1.428333 -0.770617
1859 9.245583 1.376917 -0.335283
In [34]:
annual_mean_chile.tail()
Out[34]:

AverageTemperature AverageTemperatureUncertainty Anomaly
dt
2009 9.994417 0.281917 0.413550
2010 9.712833 0.340000 0.131967
2011 10.032250 0.322250 0.451383
2012 10.272583 0.384583 0.691717
2013 9.877375 0.393875 0.296508
In [35]:
plt.figure()
plt.style.use("fivethirtyeight")
annual_mean_chile.loc[1960:2012]["Anomaly"].plot(figsize = (10,5), grid=True, legend=True)
plt.title("Variación promedio anual de la temperatura de Chile")
plt.xlabel('')
plt.ylabel('Incremento de la temperatura')
plt.show()




La variación no supera el 0.8 grados de temperatura, con un aumento fuerte entre los 70s y 80s y luego un pico en los 90s.

Mexico

In [36]:
annual_mean_mexico = data_mexico.groupby(data_mexico["dt"].dt.year).mean()
reference_temperature_mexico = annual_mean_mexico.loc[1951:1980].mean()["AverageTemperature"]
annual_mean_mexico["Anomaly"] = annual_mean_mexico["AverageTemperature"] - reference_temperature_mexico
In [37]:
annual_mean_mexico.head()
Out[37]:

AverageTemperature AverageTemperatureUncertainty Anomaly
dt
1835 18.993250 1.684083 -1.745911
1836 19.587167 1.695333 -1.151994
1837 19.671083 1.647667 -1.068078
1838 19.337000 1.862417 -1.402161
1839 19.785833 1.603000 -0.953328
In [38]:
annual_mean_mexico.tail()
Out[38]:

AverageTemperature AverageTemperatureUncertainty Anomaly
dt
2009 21.546083 0.205917 0.806922
2010 20.852917 0.217750 0.113756
2011 21.599333 0.245333 0.860172
2012 21.652417 0.324500 0.913256
2013 22.219222 0.365111 1.480061
In [39]:
plt.figure()
plt.style.use("fivethirtyeight")
annual_mean_mexico.loc[1960:2012]["Anomaly"].plot(figsize = (10,5), grid=True, legend=True)
plt.title("Variación promedio anual de la temperatura de Mexico")
plt.xlabel('')
plt.ylabel('Incremento de la temperatura')
plt.show()




Se nota la tendencia al alsa de la temperatura en Mexico pasando el año 2013 a estar por 1.48 grados por encima del promedio.

Canadá

In [40]:
annual_mean_canada = data_canada.groupby(data_canada["dt"].dt.year).mean()
reference_temperature_canada = annual_mean_canada.loc[1951:1980].mean()["AverageTemperature"]
annual_mean_canada["Anomaly"] = annual_mean_canada["AverageTemperature"] - reference_temperature_canada
In [41]:
annual_mean_canada.head()
Out[41]:

AverageTemperature AverageTemperatureUncertainty Anomaly
dt
1768 -7.886750 3.66925 -2.969253
1769 -3.427875 3.50550 1.489622
1770 NaN NaN NaN
1771 NaN NaN NaN
1772 NaN NaN NaN
In [42]:
annual_mean_canada.tail()
Out[42]:

AverageTemperature AverageTemperatureUncertainty Anomaly
dt
2009 -4.135083 0.231833 0.782414
2010 -1.887917 0.218583 3.029581
2011 -3.557083 0.232583 1.360414
2012 -3.176833 0.300083 1.740664
2013 -1.640667 0.533667 3.276831
In [43]:
plt.figure()
plt.style.use("fivethirtyeight")
annual_mean_canada.loc[1960:2012]["Anomaly"].plot(figsize = (10,5), grid=True, legend=True)
plt.title("Variación promedio anual de la temperatura de Canadá")
plt.xlabel('')
plt.ylabel('Incremento de la temperatura')
plt.show()



Se nota la tendencia al alsa de la temperatura en Canadá y lo preocupante es que la variación pase los 3 grados de temperatura en el año 2013.

Niveles anuales de CO2 en la Atmosfera

In [44]:
plt.figure()
plt.style.use("fivethirtyeight")
annual_co2_ppm = co2_ppm.groupby(co2_ppm["Year"]).mean()
annual_co2_ppm.loc[1960:2015]["Carbon Dioxide (ppm)"].plot(figsize = (10,5), grid=True, legend=True)
plt.title("Nivel anual global de CO2 en la Atmosfera")
plt.ylabel("CO2 partes por millón")
plt.show()





Se nota el incremento anual con tendencia al alza.

Se cálcula la relación del CO2 con la temperatura.

In [45]:
annual_co2_temp = pd.merge(annual_mean_global.loc[1960:2015], annual_co2_ppm.loc[1960:2015], left_index=True, right_index=True)
annual_co2_temp = annual_co2_temp[["LandAndOceanAverageTemperature", "Anomaly", "Carbon Dioxide (ppm)"]].copy()
annual_co2_temp.corr()
Out[45]:

LandAndOceanAverageTemperature Anomaly Carbon Dioxide (ppm)
LandAndOceanAverageTemperature 1.000000 1.000000 0.923603
Anomaly 1.000000 1.000000 0.923603
Carbon Dioxide (ppm) 0.923603 0.923603 1.000000
In [46]:
sns.heatmap(annual_co2_temp.corr())
Out[46]:
<matplotlib.axes._subplots.AxesSubplot at 0x7fcacea9cdd8>
In [47]:
plt.figure(figsize=(10,8))
sns.scatterplot(x="Anomaly",y="Carbon Dioxide (ppm)", data=annual_co2_temp)
Out[47]:
<matplotlib.axes._subplots.AxesSubplot at 0x7fcace8d6c50>
" />
Con la gráfica de calor y la scatter, se nota la relación practicamente lineal del incremento de la temperatura y del Dioxido de Carbono. Ambas están relacionadas en el Cambio climático.
In [ ]:
 

En el sitio donde se almacenan los datos hay más archivos, temperatura por ciudad por ejemplo para ir más a detalle de la situación por ciudad. También pueden seguir buscando info de otros países, en el artículo original se hizo el de Grecia, y acá probé con Argentina, Brasil, Chile, Canadá, México y Venezuela.

Jueves 11 de octubre de 2018

Javier Smaldone

Javier Smaldone
Blog de Javier Smaldone

Salvemos los dos riñones

¡Salvemos los dos riñones!

En la Argentina una persona no es libre de decidir sacarse un riñón para donárselo a alguien. La ley sólo lo permite si el receptor tiene un vínculo familiar con el donante o en el caso de las llamadas “donaciones cruzadas” (como sucedió con Jorge Lanata). Pero si un nefrólogo le recomienda a un paciente extirparse un riñón para preservar su salud o su vida, éste puede decidir hacerlo, y un cirujano puede operarlo sin ningún tipo de trámite legal. Este es el caso de X, que acudió para tal práctica médica a un hospital público.

Casualmente, el abogado MBO escuchó —mientras viajaba en un colectivo de la línea 69— que alguien en alguna radio dice que en el mismo hospital donde va a operarse X existe la sospecha de que se extraen órganos innecesariamente para luego venderlos en el mercado negro. Alarmado, se comunica con el periodista MO, y este a su vez con un grupo de ciudadanos que lleva adelante una campaña contra el tráfico de órganos. El abogado MBO decide luego hacer una presentación judicial ante la sospecha, pero el fiscal interviniente descarta la denuncia diciendo que “no hay siquiera un indicio de delito”.

Sin embargo a MO y su grupo esto no los tranquiliza, y sin demora deciden instalarse a protestar en la puerta del nosocomio en cuestión. “Nadie nos dio explicaciones”, reclama MO. “El director de la clínica no nos demostró que a X haya que sacarle un riñón para poder preservar su salud”, acota visiblemente preocupada una de sus seguidoras. Y luego pasan a la acción: uno de los activistas se calza un delantal blanco y, simulando ser médico, se introduce en el hospital para tratar de llegar a X y convencerlo de que está siendo engañado por un médico inescrupuloso.

Unos días después MO es cuestionado por un colega en una entrevista radial. Justifica el accionar de su grupo diciendo que “nunca tuvimos información de que la práctica médica estuviera justificada”. Ante la pregunta de “¿quién te dio poder de policía para intervenir en un asunto privado?”, MO agrega: “yo sólo fui a la vereda a ver qué pasaba, y había 5 o 6 mujeres que estaban realizando una especie de vigilia”. Y luego aclara: “Nosotros no fuimos a hacer de policía, fuimos a peticionar que se pudiera informar si existían las causales para realizar esa práctica médica, procedimos ante el hermetismo que había”, destacando que hay un interés público en evitar el tráfico de órganos.


Mariano Obarrio y su grupo 'pro vida'

Esto pasó —palabras más, palabras menos— pero no en el caso de la extracción de un riñón, sino de un aborto requerido para salvar la vida de una mujer, es decir de una ILE (interrupción legal del embarazo, prevista en el Código Penal argentino desde 1921 y ratificada por el fallo F.A.L. de la Corte Suprema de la Nación en 2012). Y no estoy comparando un riñón con un feto, sino poniendo en evidencia el sinsentido de la intromisión de un grupo de personas en una cuestión médica, privada, íntima y urgente en la que no tienen absolutamente nada que ver.

Amenaza a los médicos

Domingo 07 de octubre de 2018

Generar gráficos animados de burbuja a lo Gapminer con Python

En febrero de 2013 creé un artículo sobre cómo hacer gráficos de burbujas con matplotlib, la idea era ver como se generaba una gráfica al estilo de la presentación de Hans Rosling (por cierto, murió en Febrero de 2017).


A continuación el vídeo que explica la historia de 200 países en 200 años, la experanza de vida y calida de vida.


O su charla TED sobre  sobre las mejores estadísticas que nunca haz visto:


En el artículo que menciono se uso el conjunto de datos de la rata de criminalidad por estado de Estados Unidos del año 2005. Pero sólo mostraba la información y no la variación en el tiempo.


Este artículo se basa en el siguiente tutorial Python Gapminer Animation.

A continuación se muestra el código del script vía notebook de jupyter:


In [1]:
#Se importa las librerias matplitlib, numpy, pandas, seaborn
import matplotlib.pyplot as plt
import numpy as np
import seaborn as sns
sns.set_style("white")
import pandas as pd
my_dpi=96
In [2]:
# Se obtiene los datos en formato csv  y se convierte en un dataframe
url = 'https://python-graph-gallery.com/wp-content/uploads/gapminderData.csv'
data = pd.read_csv(url)
In [3]:
#Se muestra el data frame
data.head()
Out[3]:

country year pop continent lifeExp gdpPercap
0 Afghanistan 1952 8425333.0 Asia 28.801 779.445314
1 Afghanistan 1957 9240934.0 Asia 30.332 820.853030
2 Afghanistan 1962 10267083.0 Asia 31.997 853.100710
3 Afghanistan 1967 11537966.0 Asia 34.020 836.197138
4 Afghanistan 1972 13079460.0 Asia 36.088 739.981106
Tiene las columnas países, año, población, contienen, experanza de vida y pib percapita
In [4]:
#Se revisa los tipos de datos de las columnas
data.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 1704 entries, 0 to 1703
Data columns (total 6 columns):
country 1704 non-null object
year 1704 non-null int64
pop 1704 non-null float64
continent 1704 non-null object
lifeExp 1704 non-null float64
gdpPercap 1704 non-null float64
dtypes: float64(3), int64(1), object(2)
memory usage: 80.0+ KB
Se observa que la columna continente es del tipo objeto. Se necesita convertir en un tipo categoria.
In [5]:
# Transformar los datos de la columna continente a categoria.
data['continent']=pd.Categorical(data['continent'])
data.head()
Out[5]:

country year pop continent lifeExp gdpPercap
0 Afghanistan 1952 8425333.0 Asia 28.801 779.445314
1 Afghanistan 1957 9240934.0 Asia 30.332 820.853030
2 Afghanistan 1962 10267083.0 Asia 31.997 853.100710
3 Afghanistan 1967 11537966.0 Asia 34.020 836.197138
4 Afghanistan 1972 13079460.0 Asia 36.088 739.981106
In [6]:
#Se vuelve a revisar los tipos de las columnas y ahora se tiene que contienen es categoria
data.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 1704 entries, 0 to 1703
Data columns (total 6 columns):
country 1704 non-null object
year 1704 non-null int64
pop 1704 non-null float64
continent 1704 non-null category
lifeExp 1704 non-null float64
gdpPercap 1704 non-null float64
dtypes: category(1), float64(3), int64(1), object(1)
memory usage: 68.5+ KB
Ahora se generará las gráficas por año de experanza de vida y PIB por año, cada gráfica se almacena con su nombre y año a fin de que luego con Image Magick se convierta en un gif animado
In [7]:
# Por cada año
for i in data.year.unique():
# inicializa la figura
fig = plt.figure(figsize=(680/my_dpi, 480/my_dpi), dpi=my_dpi)
# se cambia de color con c y alpha, se mapea el color del eje X.
tmp=data[ data.year == i ]
plt.scatter(tmp['lifeExp'], tmp['gdpPercap'] , s=tmp['pop']/200000 , c=tmp['continent'].cat.codes, cmap="Accent", alpha=0.6, edgecolors="white", linewidth=2)
# Se agrega el título, y los ejes.
plt.yscale('log')
plt.xlabel("Experanza de vida")
plt.ylabel("PIB per capita")
plt.title("Año: "+str(i) )
plt.ylim(0,100000)
plt.xlim(30, 90)

# Se salva el archivo como png, cada archivo por año.
filename='Gapminder_step'+str(i)+'.png'
plt.savefig(filename, dpi=96)
plt.gca()



Se muestra una imagen de las generadas:


Para convertir las imágenes generadas en gif se ejecuta el siguiente comando de image magick:

 convert -delay 80 Gapminder*.png animated_gapminder.gif



El gif resultante se muestra a continuación:



En próximo artículo espero encontrar el conjunto de datos del artículo mencionado al inicio para hacerle una animación como el realizado en este artículo.

Martes 18 de septiembre de 2018

Ubuntips: ¿Ver porno gratis es malo para mi PC?

Jueves 06 de septiembre de 2018

Javier Smaldone

Javier Smaldone
Blog de Javier Smaldone

Boleta única de papel, ya

(Nota publicada en Revista Noticias)

El sistema electoral es “un mísero detalle técnico” —según José Ortega y Gasset— pero del cual dependen “la salud de las democracias, cualesquiera sean su tipo y su grado”. A raíz de las irregularidades detectadas en la Provincia de Buenos Aires, hoy se ha instalado la discusión de uno de sus componentes: el financiamiento de los partidos políticos. Otro, el elemento de votación, lamentablemente ha quedado relegado luego del debate iniciado con la propuesta del Poder Ejecutivo de incorporar la llamada “boleta única electrónica”, que tuvo media sanción en la Cámara de Diputados en agosto de 2016.

Faltando poco más de un año para las elecciones primarias de 2019, es escaso el tiempo que queda para intentar una reforma electoral. Y en lo que respecta al elemento de votación, la implantación de un sistema electrónico de emisión del sufragio —considerando no sólo el tiempo, sino también los múltiples cuestionamientos de la comunidad técnica, académica y científica informática— ya no parece posible. Sin embargo, aún puede realizarse una modificación que muchos consideran una verdadera mejora: la introducción de la boleta única de papel (BUP).

La boleta única de papel —llamada “boleta australiana”, por su debut en Tasmania en 1856— es una grilla de papel en donde se encuentra toda la oferta electoral. En ella se disponen las diferentes categorías electivas y los candidatos en forma de cuadrícula. La BUP es entregada al votante en la mesa de votación, por lo que no es posible ni el robo de boletas ni la introducción de boletas falsas de algún partido. Luego, el elector realiza su selección haciendo marcas en las opciones correspondientes. Finalmente, la BUP es plegada —no es necesaria la utilización de un sobre— y depositada en una urna para su escrutinio al final de la jornada electoral.

En la Argentina la BUP ha sido propuesta en el Congreso al menos dos veces: en el proyecto 7059-D-2008 firmado entre otros por Adrián Pérez, Federico Pinedo y Oscar Aguad, y en el proyecto 4189-D-2011 firmado por entre otros por Fernando Iglesias, Patricia Bullrich, Gabriela Michetti, Federico Pinedo y Ricardo Gil Lavedra. Además, la Cámara Nacional Electoral —máxima autoridad judicial en la materia— se ha pronunciado al respecto en una resolución de agosto de 2017 indicando que la BUP “carece de los riesgos de los dispositivos informáticos y es, de hecho, el sistema más utilizado en todo el mundo”.

Como bien dice la Cámara Nacional Electoral, la abrumadora mayoría de los países del mundo utilizan la BUP como elemento de emisión del sufragio, existiendo variantes que permiten adaptarla a los diferentes sistemas de elección y representación. En particular, la utilizan todos aquellos países que habiendo probado sistemas de voto electrónico, los abandonaron. Incluso muchos argentinos votan desde el año 2007 usando la BUP en elecciones nacionales: aquellos que se encuentran privados de libertad sin condena y los residentes en el exterior.

En octubre de 2017, varias ONG y especialistas en informática y derecho electoral dirigieron una carta al presidente Mauricio Macri manifestando la necesidad de impulsar una serie de reformas electorales, entre las que se incluía la implementación de la BUP. La repuesta a dicha carta fue que el Poder Ejecutivo ya había enviado la reforma que se encuentra frenada en el Congreso.

La principal objeción al uso de la BUP en la Argentina es la supuesta dificultad de disponer toda la oferta electoral en el caso de elecciones complejas como las PASO, y en distritos con una gran cantidad de partidos como la Provincia de Buenos Aires. Claramente esto no es un problema, como lo demuestra el hecho de que la BUP ya se utiliza en nuestro país incluso en elecciones primarias. Una variante que reduce sensiblemente la complejidad y el tamaño de la BUP es dividirla en varias “boletas únicas”, cada una para una categoría electiva. Esta es la solución utilizada en países como Italia y Paraguay, y también en la Provincia de Santa Fe. En la ciudad de Rosario, por ejemplo, en las últimas elecciones primarias hubo 43 listas distintas con candidatos a concejales y la BUP correspondiente era una hoja tamaño A3.


BUP de Rosario en las elecciones primarias de 2017

La BUP también simplifica el proceso de escrutinio, al no existir boletas dentro de sobres, y sobre todo si se utilizan boletas separadas por categorías: las mismas pueden depositarse en urnas distintas, facilitando aún más el conteo posterior. También pueden implementarse sistemas informáticos de asistencia al escrutinio, tales como el prototipo de sistema de reconocimiento de marcas desarrollado por investigadores de la Universidad Nacional de Córdoba, o el basado en tabletas con una aplicación de conteo y emisión de actas utilizado como prueba piloto en dos localidades santafecinas en 2017 con buenos resultados.

En el caso de la Provincia de Santa Fe, la prueba piloto incluyó también un sistema de transmisión de resultados directamente desde los lugares de votación —las escuelas— al centro de cómputos, sin la participación de un correo y bajo la supervisión de las autoridades de mesa y delegados de la Justicia. Este es otro punto crucial a mejorar en el sistema nacional: debe implementarse un sistema realmente transparente para la publicación de resultados provisorios en tiempo real la noche de las elecciones, que aumente las posibilidades de fiscalización por parte de los partidos políticos, las ONG y la ciudadanía en general.

Las elecciones presidenciales de 2019 están a la vuelta de la esquina. La Secretaría de Asuntos Políticos, a cargo de Adrián Pérez, aún no puede exhibir ningún cambio significativo en el sistema electoral. El financiamiento de los partidos políticos aún no empieza a discutirse en el ámbito legislativo, en tanto que la creación de un órgano electoral independiente del Poder Ejecutivo quedó frenada al estar supeditada a la aprobación de la “boleta única electrónica”. Pero todavía hay tiempo de hacer los cambios necesarios para mejorar sustancialmente: la implementación de la boleta única de papel y la mejora en los mecanismos de escrutinio, confección de actas de mesa, transmisión y publicación de resultados pueden hacerse si tanto el Gobierno como el Congreso se abocan cuanto antes a la tarea, dejando de lado los intereses partidarios y coyunturales. “Todo lo demás, es secundario”, finalizaba Ortega y Gasset su frase sobre el sistema electoral y las democracias.

Sábado 28 de julio de 2018

Javier Smaldone

Javier Smaldone
Blog de Javier Smaldone

Los Estados Unidos, el Congo y las máquinas de voto electrónico diseñadas para la Argentina

Las Naciones Unidas han creado una misión llamada MONUSCO para el restablecimiento de la paz en la República Democrática del Congo y esta se encuentra observando el ya demorado proceso electoral que debería haberse realizado en 2016 y fue anunciado por el actual presidente Joseph Kabila para el 23 de diciembre de 2018.

Misión de los EE.UU. en las Naciones Unidas

El cuestionado presidente Kabila planea usar más de 100.000 máquinas de voto electrónico que desde su anuncio resultaron sospechosamente similares al sistema propuesto por el gobierno argentino en 2016, que luego se comprobó habían sido diseñadas para nuestor país e incluso existe una fuerte sospecha de que unas 20.000 máquinas llegaron al Congo desde la Argentina.

El 26 de julio de 2018, la misión de los Estados Unidos en el consejo de seguridad de las Naciones Unidas ha enunciado una serie de advertencias sobre las próximas elecciones en el Congo, incluyendo el posible intento de Kabila de presentarse como candidato —violando la Constitución— y también una fuerte alerta sobre el uso del sistema de voto electrónico conocido como “boleta única electrónica”.

El fragmento referido al sistema de votación electrónica dice lo siguiente:

“Additionally, the Commission must take steps to ensure voters can cast their votes via a mechanism that is tested, trusted, and guarantees secrecy of the vote – namely paper ballots. Deploying more than 100,000 unfamiliar, untested, and possibly unworkable electronic voting machines for the first time during a critical national election poses an enormous and unnecessary risk. What do Congolese authorities plan to do if these untested voting machines malfunction on Election Day and jeopardize the credibility of the results? Is there a backup plan? And if so, what is it?”

En español:

“Además, la Comisión debe tomar medidas para garantizar que los votantes puedan emitir sus votos a través de un mecanismo probado, confiable y que garantice el secreto del voto, es decir, boletas de papel. Desplegar más de 100.000 máquinas de voto electrónico desconocidas, no probadas y posiblemente no viables por primera vez durante una elección nacional crítica plantea un riesgo enorme e innecesario. ¿Qué planean hacer las autoridades congoleñas si estas máquinas de votación no probadas funcionan mal el día de la elección y ponen en peligro la credibilidad de los resultados? ¿Hay un plan de respaldo? Y si es así, ¿cuál es?

Estas advertencias siguen la línea de lo expresado en el informe del grupo de investigación The Sentry (en el cual tuve la oportunidad de participar) y de la carta de ONGs y especialistas argentinos dirigida a la población del Congo, como también de las numerosas objeciones planteadas en el año 2016 tanto en la Cámara de Diputados como en el Senado de la Nación y de las conclusiones del informe que realizó al respecto una comisión del CONICET.

En la Argentina, las objeciones y advertencias sobre el sistema de voto electrónico propuesto por el Gobierno hasta ahora fueron despreciadas, y el proyecto de ley impulsado por el oficialismo tiene media sanción de la Cámara de Diputados. Sirva de ejemplo de esto la respuesta del diputado Pablo Tonelli en 2016 cuando se propuso considerar la boleta única de papel como respaldo ante la posible falla del sistema informático:

Lamentablemente para sus habitantes, tal parece que en la República Democrática del Congo se hará caso omiso de las advertencias, como ocurre en la Argentina.

Sábado 05 de mayo de 2018

Gobierno Abierto / Datos Abiertos II

Mar del Plata Abierta Después de casi un año sin publicar nada por este blog, volvió a aparecer algo que me motiva.

Debo recordar, a modo de introducción, la experiencia fallida del 2014, donde con toda pompa y boato, como hubieran dicho los Les Luthiers, se presentó el Hackaton de aplicaciones basadas en datos abiertos de la Municipalidad de Gral. Pueyrredón.

Evento al que no asistí porque “quien da vía libre y empuja que esto se haga es un paranoico que no tolera el control de su accionar y que ha tenido innumerables actitudes de puro gatopardismo. Alguien que tiene que hacer un esfuerzo muy grande para no compararse con Luis XIV y su “El Estado soy yo”, el cual cambió por un mas modesto “acá gobernamos nosostro, loco, no el concejo”. En otras palabras, Gustavo Pulti, Intendente municipal“, tal como dije en su momento y quedó plasmado en este post.

Posteriormente, casi un año después, mostraba que lamentablemente había vuelto a tener razón, algo que muchas veces odio, pero que me salva en muchas ocasiones de tener que reconocer que me engañaron 😉

Si les interesa, pueden ver esa catarsis en este otro post.

Pues bien, Pulti ya fue. Ahora es Arroyo y en sus primeros 2 años al frente de la Municipalidad ni se habló del tema. Confieso que todavía tengo clavada la espina por no haber tenido la posibilidad de motorizar el tema cuando trabajé para José Cano y el fue designado Secretario de Hacienda, pero bueh, asi es el pasado, inmutable, sin remedio.

De repente, cuando entre algunos conocidos seguíamos trabajando tratando de instalar el tema, aprovechando otras organizaciones de la sociedad civil como Mar del Plata Entre Todos, comenzamos a recibir noticias de que algo se estaba gestando dentro de la Municipalidad.

Era la gente del Departamente de Información Estratégica, que tomaba el tema como una cuestión de Estado y comenzaba a transitar un camino en pos de la apertura de los datos y la transparencia.

Extrañamente, los que integramos ese grupo de insistentes solicitadores de datos fuimos convocados a una reunión, en la cual, la gente de esta dependencia presentó sus intenciones.

Retomar la tarea de liberar y publicar por medio un portal de datos abiertos, adecuar la normativa vigente, integrar otras dependencias, otras organizaciones, a la sociedad civil.

Los felicitamos y nos pusimos a disposición. Les avisamos que los íbamos a ayudar en todo lo que pidieran y les indicamos que habíamos armado un Trello donde pusimos todos nuestros deseos de apertura de datos, páginas y aplicaciones.

No solo no se intimidaron, sino que nos volvieron a convocar, nos contaron como se habían organizado con las otras dependencias y nos presentaron los primeros set de datos que iba a liberar. Pero eso no fue todo. En una segunda convocatoria decidieron contarnos que iban por mas, que habían decidido iniciar el camino hacia el gobierno abierto, con todo lo que eso implica.

Ya hay un borrador de ordenanza de acceso a la información pública, ya se está terminando de organizar algunas páginas de datos que se encuentran desperdigadas, se está en camino de tener un portal específico con los datasets y pulir los mecanismos de participación ciudadana.

Mientras tanto, el próximo jueves 10 de mayo, entre las 16 y las 21, en las instalaciones del Torreón del Monje, se hará la 1a. Jornada de Gobierno Abierto de la Municipalidad de Gral. Pueyrredon, con la participación de sectores de gobierno, académicos, periodismo de datos y sociedad civil.

En este último panel, tengo el honor de haber sido invitado a presentar una pequeña charla, eligiendo el tema de los desafíos que impone a todos estos actores el aventurarse a implementar un gobierno abierto.

Para el día viernes 11 de mayo, de 14 a 18, en el mismo lugar, se hará la Mesa de trabajo para el debatir el anteproyecto de la Ordenanza de Gobierno Abierto y Acceso a la Información Pública.

El sitio oficial donde se puede recabar mas información sobre las exposiciones, los expositores, inscribirse y descargar el anteproyecto de ordenanza se puede ver en este link.

Para finalizar, si llegaron hasta acá con la lectura, me veo obligado a pedirles que se inscriban, vayan, usen unas horas de sus vidas en iniciativas como esta.

Me vienen a la memoria las palabras que escuchaba, cuando era chico, del gran Tato de América, cuando nos decía “No se queje si no se queja”. Algo que, mas allá de la humorada, nos indica que alguna vez tenemos que dejar de quejarnos solo cuando alguno de nuestros intereses ha sido “tocado”, sino que debemos usar la queja como elemento movilizador para la mejora continua de los procesos de gobierno.

En ese entonces, los conceptos de información pública, datos abiertos, gobierno abierto, ciudades digitales, Internet … ni siquiera estaban en la imaginación.

Hoy tenemos todo eso y la posibilidad de ser parte del trazado de los destinos de nuestra ciudad se encuentra al alcance de nuestra mano, ya sea sobre el mouse o en el celular.

Aprovechemos para hacer oir nuestra voz, nuestras propuestas, nuestros reclamos. Si no acompañamos estas iniciativas, le estamos dejando las decisiones a la política de siempre, la de la rosca, la del ocultamiento, la del negociado.

Miércoles 11 de abril de 2018

Eduardo Federico

Eduardo Federico
Paraiso Linux

De 0 a 100, como montar tu propio blog y todo lo demas

Este no va a ser un articulo cortito sobre como instalar wordpress y nada mas (ya tengo uno de esos en el blog). Esto va a ser mas algo desde la idea hasta ‘el éxito’, entiendo que eso no significa vivir de esto, sino lograr lo que estas buscando con un blog. Empecemos por ahí:

Por que quieres tener un blog?

En base a mi experiencia personal, luego de haber tenido decenas de blogs, los cuales todos desaparecieron o los vendi, y luego de haber intentado que familia, amigos, compañeros de la facultad y del trabajo abrieran el suyo, he notado como la mayoria abandona luego de un par de dias, semanas o meses. Y creo que la razon es que no comenzaron un blog por la razon adecuada o simplemente no lo empezaron con un objetivo en mente.

Hace unos años todos podian vivir de esto si le ponian ganas, hoy en dia es mas complicado, asi que su objetivo es ganar dinero, tendras que ponerle muchas muchas ganas.

Pero hay muchas otras razones para escribir en un blog, solo puedo ayudarte listando las que conozco, pero vuelvo a aclarar que solo te van a servir si de verdad estas motivado.

  • Ganas de desahogarte y escribir tu historia
  • Ganas de compartir, conocimientos, sentimientos, experiencia
  • Como practica para un objetivo mayor, por ej si estas intentando aprender sobre Social Media, Marketing, etc
  • Como carta de presentación. Ej: si eres un desarrollador y quieres mostrar que escribes sobre el tema
  • Como ayuda memoria
  • Para practicar un idioma

Cuanto tiempo me va a llevar mantener ‘vivo’ mi blog?

Esto depende enteramente del punto anterior. Pero lo voy a resumir bastante:

Necesitas escribir al menos 1 articulo semanal. Eso son 30 a 90 minutos a la semana.

Y según cuales consejos de los que voy a nombrar en el resto del articulo, van a necesitar, entonces tendrán que invertir algunos minutos mas a la semana. Voy a decir que mas o menos unos 90 minutos extra a la semana.

Total: 3 horas semanales

Elegir tematica, dominio y hosting

Si estas pensando en escribir un blog seguramente tienes lo de la tematica mas o menos resuelto, pero quiero dar un consejo sobre el tema: No seas muy abarcativo, pero tampoco seas demasiado especifico.Ejemplos:

No escribir sobre ‘tecnologia’ porque es un tema demasiado grande.

No escribir sobre ‘sistemas operativos para raspberry py’ porque es demasiado corto y especifico.

En vez de eso elegir por ejemplo: ‘Linux’ o ‘Micro computadoras’. Es algo mas termino medio.

Elegir el dominio correcto también es muy importante, y van a encontrar horas de lectura sobre como hacerlo correctamente. Mi recomendación: usen sentido comun y lo que les guste.

Al final ‘el exito’ de su blog va a depender de tantas cosas que perder 1 mes eligiendo el dominio correcto es una perdida de tiempo.

Y sobre el hosting, lo mejor que puedo decirles es que prueben y que se alejen de los gratuitos. Hay muchos muy buenos y muy económicos, cada tanto voy recomendando alguno en el blog y esta vez les voy a recomendar Clouding.io

Como instalar wordpress

No voy a entrar en mucho detalle aqui porque depende del hosting que contraten van a tener que hacer uso de FTP o tal vez lo puedan instalar desde alguna interfaz grafica.

Con el tiempo van a aprender la diferencia entre hosting compartido, VPS y servidor dedicado. Desde hace muchos años yo siempre uso un FTP, porque un hosting compartido se me queda corto y un servidor dedicado me parece demasiado caro.

En clouding, luego de contratar solo tienen que hacer 3 pasos:

Paso 1- Crear el servidor

Paso 2- Completar los datos basicos para crear el servidor. Les dejo una captura de como lo hice yo.

Como verán cree todo usando el mínimo que te permiten elegir, porque cuando comiencen su blog es todo lo que necesitaran. Seguramente cuando pasen las 100 visitas diarias tendran que mejorar el procesador. A los pocos meses necesitaran mas memoria, etc. Mientras mas visitas tenga el blog mas recursos necesitaran.

Pero tener un VPS por 3 euros al mes es increíble.

Y lo mas increíble de todo es que pueden tener VestaCP instalado sin tener que seguir ningún paso extra! Pueden buscar mis articulos sobre VestaCP en el blog para comparar como lo instalaría en otro hosting.

Paso 3- Esperar el email con el usuario y la contraseña.

Luego de eso podrán ingresar a su panel Vesta escribiendo en la barra de direcciones del navegador [su_ip]:8083

Pequeño comentario: aunque se puede contratar por 3 euros un vps que sera suficiente para el inicio, hay una cosa que les recomiendo activar y son los backups. He hablado mucho sobre esto en el blog y he enfatizado sobre la importancia del tema de guardar tus datos muchas veces. Yo creo que habré perdido unos 5 blogs completitos completitos por usar un servicio de hosting malo y ademas de eso por no activar los backups. Hacerlo en Clouding.io es super fácil. Pueden hacerlo ya desde el inicio (vean la captura de arriba). O pueden hacerlo luego abriendo su panel desde los 3 puntitos que hay al final de la linea con el nombre de su servidor, opción ‘Mas…’.

Luego pestaña Backups y asi es como lo tengo yo:

Como escribir los artículos

Por regla general los artículos deben tener al menos 200 palabras, pero mas largos mejor. WordPress te lo muestra al final de donde escribes. Por ejemplo, ahora mismo voy 546 palabras.

Sobre esto también van a encontrar no cientos sino miles de horas de lectura, otra vez resumo: usen sentido común y lo que se sientan cómodo escribiendo. No sobre esfuercen las palabras claves, trata de escribir en español neutro, con buena ortografía y usando al menos una imagen en cada articulo.

También tendrás que tener presente siempre el SEO cuando escribas, pero eso lo veremos a continuación.

SEO, que es, para que me sirve y como hacerlo?

SEO significa Search Engine Optimization u “Optimización para buscadores” en español. Y hace referencia a todas las tareas, técnicas y herramientas que tendrás que hacer y usar para que tu blog aparezca en buenas posiciones en Google, lo que es básicamente un objetivo intrínseco de tener un blog publico.

Sobre SEO también va a encontrar decenas de miles de horas de información, y esta vez si van a tener que dedicar esa cantidad de tiempo a aprenderlo

Lo bueno es que pueden aprenderlo de a poco, tampoco es urgente porque las acciones que tomen tampoco van a tener efecto inmediato, Google se toma su tiempo para todo.

Como se que hay gente que no tiene ni la mas mínima idea del tema lo voy a super resumir en 3 pilares, pero de todas formas tendran que investigar mas detalles sobre cada uno de estos temas.

El contenido

Esto hace referencia a como escribir para conseguir mejores posiciones, es un tema largo, que abarca desde el largo de los artículos, las palabras clave a usar, la longitud de esas palabras clave, incluso como aprovechar palabras mal escritas para conseguir mas visitas.

El código

Ustedes pensaran: “me estas diciendo que necesito aprender a programar para tener un blog?”. Por supuesto que no. Pero necesitaras saber revisar un poquito el código, minimamente, por ejemplo necesitan saber revisar si un enlace o una imagen tiene los atributos que desean que tenga.

Por supuesto que existen muchos plugins para wordpress que pueden hacer todo este trabajo por ustedes y no tocar código para nada, pero al final les aseguro que aprender un poquito, un mínimo, les va a ayudar bastante.

Los enlaces

Para que Google los tenga en cuenta van a necesitar si o si conseguir enlaces que apunten a su blog. Porque por mas que su contenido sea excelente y todo el sitio este perfectamente optimizado, si no consiguen enlaces entonces los buscadores no los van a tener en cuenta.

Aquí mi recomendación es sencilla, vayan a Google y busquen cosas como “top 100 sitios para conseguir enlaces gratis” o “top 10 formas de conseguir enlaces de calidad”.

Redes sociales

Las redes sociales son importante porque es la segunda forma de conseguir visitas aparte de hacer un buen SEO. Imagina que google tiene tu blog en la pagina 1892 de sus resultados, eso significa mas o menos 1 visita cada 350 años. Pero a no desesperar, si conseguimos un articulo viral entonces tendremos muchas visitas de todas formas.

Voy a ponerlo así:

  • Si haces un buen SEO, tu blog podría tener 10.000 visitas diarias.
  • Si haces un buen trabajo de Social Media, podrías tener 100.000 visitas en un solo día, luego volver a las cantidades normales, pero al menos ese día conseguirán mucha visibilidad.

El trabajo que tendras que hacer con las redes sociales es basicamente crear perfiles para tu blog, conseguir seguidores para esos perfiles, compartir contenido interesante y relacionado a la tematica del blog y compartir los nuevos articulos que vayan escribiendo en el blog.

Ejemplo:

1- Se crean una fan page en facebook

2- Invitan a todos sus amigos y familiares para empezar

3- Comparten contenido relacionado, por ejemplo, en la fan page de paraisolinux comparto cosas como esta:

Pero no solo compartan imágenes y vídeos, también pongan enlaces a blogs de su misma temática, esto los va a ayudar a crear relaciones con ellos.

4- Cada vez que escriban un articulo nuevo en su blog lo comparten en la fan page

5- Y cada tanto comparten también algún articulo viejo del blog

Email marketing

El email marketing sigue siendo una de las mejores formas de conseguir visitas a tu sitio. Esto es muy simple: logras que se suscriban a tu lista de correo y luego les envias emails con contenido interesante. Por ejemplo tus mejores articulos o los articulos nuevos.

La cantidad de emails dependera de cada cuanto escribas y el valor que le puedas dar al email. Si vas a enviar un email semanal y ese email solo va a tener un enlace al unico articulo que escribes cada semana, entonces la gente se va a terminar aburriendo. Se entiende verdad? Es puro sentido comun.

Para ganar suscriptores vía email simplemente crea una cuenta en Mailchimp y busca algún plugin o tutorial para agregar el formulario a tu blog. Puede ser en el sidebar, al final de los artículos o en el footer.

El resto es sencillo, es elegir una plantilla y escribir el mail. Incluso se pueden hacer emails automáticos que automáticamente compartan el contenido nuevo de su blog cada semana o mes. Pero esto ya lo irán aprendiendo poco a poco.

El seguimiento

Lo ultimo que tendrán que aprender es a hacer seguimiento de su blog, sino como saber si están avanzando y lograr el objetivo? Hay que medir de alguna forma.

Agreguen el código de Google Analytics en su blog, puede hacerlo mediante un plugin o escribiendo un pequeño trozo de código.

Google Analytics es una herramienta gratuita de google que registrara datos de las visitas a su pagina. Desde algo tan simple como la cantidad de visitas, hasta cosas como la ubicacion geografica de esas visitas o si estan entrando desde un smartphone o una pc, navegador, sistema operativo, etc.

Esta clase de herramientas seras la que utilizaran para medir los impactos de sus acciones tomadas en relación a SEO, las redes sociales y el marketing.

Mi recomendación con respecto a esto es obsesionarse con esto, va a ser una de las mejores formas de forzarse ustedes mismos a escribir mejores artículos y aprender sobre todos los temas que mencione en este articulo.

Pero otra vez para resumir voy a darles un ejemplo sencillo de que podrían hacer:

  • Primero, intentar tomar las acciones necesarias hasta que logren registrar 100 visitas diarias.
  • Luego pasar a las 500 diarias.
  • Y al final conseguir 1000 diarias. Este es un buen numero para quedarse. No requiere demasiado esfuerzo. Aunque tardaran unos cuantos meses en lograrlo.

Tambien es importante que sepan que tanto las redes sociales que creen como la herramienta que usen para email marketing, tendran sus propios paneles con estadisticas, yo no me obsesionaria con estos, solo los usaria a veces para darme un idea de como mejorar en esos sitios. Por ejemplo, en facebook podrian aprender en que horario es mejor publicar y en el panel de mailchimp podrian aprender cual es el mejor dia para enviar un email.

Y que mas?

Nada mas. Este debería ser un resumen de todo lo que tendrán que hacer. No es para espantarlos, es para animarlos y que tengan un pantallazo de todo. Si tienen dudas me las pueden preguntar en los comentarios.

La entrada De 0 a 100, como montar tu propio blog y todo lo demas pertenece a Paraiso Linux.

Martes 03 de abril de 2018

Javier Ledesma

Javier Ledesma
Rotas Cadenas

Ubuntu Icon Wallpapers


Ubuntu Icon Wallpapers un paquete de fondos de escritorio de gran calidad y disponible en 5 colores diferentes.

Leer más »

Jueves 01 de marzo de 2018

Martín Albisetti

Martín Albisetti
Martin Albisetti's blog

On well executed releases and remote teams

After some blood, sweat and tears, we finally brought Stacksmith into the world, yay!

It’s been a lengthy and intense process that started with putting together a team to be able to build the product in the first place, and taking Bitnami’s experience and some existing tooling to make the cloud more accessible to everyone. It’s been a good week.

However, I learnt something I didn’t quite grasp before: if you find really good people, focus on the right things, scope projects to an achievable goal and execute well, releases lack a certain explosion of emotions that are associated with big milestones. Compounded with the fact that the team that built the product are all working remotely, launch day was pretty much uneventful.
I’m very proud of what we’ve built, we did it with a lot of care and attention, we agonized over trade-offs during the development process, we did load testing to do some capacity planning, added metrics to get hints as to when the user experience would start to suffer, we did CI/CD from day one so deployments were well guarded against breaking changes and did not affect the user experience. We did enough but not too much. We rallied the whole company a few weeks before release to try and break the service, asked people who hadn’t used it before to go through the whole process and document each step, tried doing new and unexpected things with the product. The website was updated! The marketing messaging and material were discussed and tested, analysts were briefed, email campaigns were set up. All the basic checklists were completed. It’s uncommon to be able to align all the teams, timelines and incentives.
What I learned this week is that if you do, releases are naturally boring  🙂

I’m not quite sure what to do with that, there’s a sense of pride when rationalizing it, but I can’t help but feel that it’s a bit unfair that if you do things well enough the intrinsic reward seems to diminish.

I guess what I’m saying is, good job, Bitnami team!

Viernes 09 de febrero de 2018

Eduardo Federico

Eduardo Federico
Paraiso Linux

Como crear un sitio web para tu cliente con WordPress

Este post nace a raíz de un pedido para hacer un sitio para un cliente. Lo iba a hacer como siempre, esto significa con un framework de php y algunos paquetes, librerías y demás utilidades. Esta vez me decidí a hacerlo con WordPress.

Y como siempre he usado este blog como ayuda memoria para mi mismo entonces voy a documentar todo el proceso.

El post va a ser largo y lo voy a dividir en las siguientes secciones:

  • Los requerimientos y por que WordPress?
  • El hosting
  • Crear campos personalizados en WordPress
  • Crear paginas
  • Crear el menu del panel
  • Esconder lo innecesario para el cliente
  • Añadidos de valor en el panel
  • El theme/template

Comencemos…

Los requerimientos y por que WordPress?

Como desarrolladores web que somos sabemos que existen muchos tipos de sitios que se nos suelen solicitar:

  • Sitios empresariales: los típicos de presentación de una empresa, con catalogo de productos, quienes somos, pagina de contacto, etc.
  • Tiendas: donde se puede hacer tu pedido y pagarlo
  • De gestión: mas complejos y muchas veces ni siquiera son accesibles para el publico general.
  • Etc.

Este post va enfocado exclusivamente a los sitios empresariales. Aunque es 100% seguro que WordPress se puede adaptar para casi cualquier tipo de requerimientos, en este post solo voy a hablar de aquello con lo que he tenido experiencia.

Los sitios web empresariales son los mas sencillos de hacer, solo necesitan un panel básico con módulos donde el cliente pueda ingresar datos para las paginas de quienes somos, que hacemos, contacto, etc. Y los campos para estos datos suelen ser input, textarea (simple y enriquecido), imágenes, galerías, relaciones y no mucho mas.

Normalmente este tipo de sitios se pueden hacer con Frameworks como Laravel que tiene muchos paquetes para realizarlos, como ser OctoberCMS, AsgardCMS, laraadmin, etc.

También se pueden hacer sin ayuda de ningun paquete ‘extra’ y bajandose algun template para el panel y programando el resto en php o laravel.

Mi decisión de hacerlo con WordPress radica simplemente es el gusto de aprender a hacerlo así y comprobar por mi mismo si era mas fácil, mas difícil, mas lindo, mas mantenible, etc.

Se que hay muchos que se agarrarian la cabeza chillando a los 4 vientos por escuchar que alguien usa wordpress pero hay que entender que para este tipo de sitios web da ‘casi’ igual como lo hagas mientras al cliente le sirva, no son sistemas complejos. En otra clase de sitios web tendría que pensarlo mejor antes de usar wordpress.

Hay una ventaja extra y es la facilidad de integrar themes y templates. Esto se vera mejor en el ultimo item de este articulo.

El hosting

Aprovechando la oportunidad de que estoy probando con un método distinto para crear sitios web, he aprovechado también para usar un hosting distinto. Esta vez me decidí por Hostinger.

Es un hosting español porque el cliente también lo era. Contrate el plan mas económico que es el de 2 euros y todo va bien por ahora, fluido. Esta claro que este cliente no tiene muchas visitas todavía pero por ahora soporta bien las 100 visitas únicas diarias.

Crear campos personalizados en WordPress

Aqui empieza la parte interesante. Este flujo de: crear los campos, crear paginas, crear el menu, etc, es solo un flujo tentativo que pueden usar para mantener un poco de orden.

Instalen el plugin PODS.

Este plugin básicamente permite crear Post types o Taxonomies. Y dentro de cada uno de esos Post types vamos a crear campos personalizados. Doy un ejemplo para que se entienda mejor:

  • Un post normal tiene un titulo y una descripción.
  • Un nuevo Post type puede tener los campos titulo, dirección, teléfono, email.

Algo así:

Una vez instalado y activado el plugin vamos a ir Post Admin -> Add New o Post Admin -> Edit Pods segun lo que intentemos hacer.

Entonces el primer paso es crear tantos Pods (Post Types o Taxonomies) como necesite nuestro sitio. Entonces por ejemplo podremos tener algo así:

  • Home (Post Type)
  • Sliders Home (Post Type)
  • Productos (Post Type)
  • Categorias Productos (Taxonomy)
  • Empresa (Post Type)
  • Sucursales (Post Type)
  • Contacto (Post Type)

Una cosa importante a explicar es que se pueden crear relaciones entre Pods. Por ejemplo:

  • En la Home hay unos textos dinámicos y algunas imágenes dinámicas + algunos sliders que tienen también su contenido como puede ser: imagen, titulo, subtitulo, enlace.
  • Los productos se categorizan pero no hace falta que sea por un Pod complejo como en el caso de los Sliders, sino que es simplemente una categoría que consiste de una palabra o frase y nada mas.

Para el primer caso agregaremos al Pod “Home” una campo del tipo Relationship.

En cambio para el segundo tipo, lo hacemos directamente desde la Taxonomy creada.

Crear paginas

No todo van a ser Pods. Vamos a usar tambien algunas paginas. Por ejemplo: vamos a crear una pagina para la home, otra para la pagina de contacto.

En esta parte van a tener que tener un poco de imaginacion. No todas las secciones de su sitio van a ser si o si paginas, algunas van a ser directamente Pods. Estos ya cuentan con su respectivo permalink como si fueran cualquier Post type, lo mismo para las taxonomies.

La finalidad de crear paginas es poder setear la opcion Page Template y usar cualquier diseño que ya tengamos con los Pods.

Crear el menu

Luego de tener creadas todos los Pods y las paginas. Es necesario empezar a preparar el menu. Si se fijan todo el menu lateral es un solo despelote de cosas.

Se creo automaticamente el menu para el Post type “Home”. Y lo que hace es brindarnos un menu con 2 items: Ver todos y Agregar. Pero nosotros no necesitamos brindarle al cliente esos menus, porque no va a poder crear infinitas Homes. Solo tiene una Home.

Aqui es donde entra la pagina Home que creamos anteriormente. Obtenemos el enlace de edicion de esa pagina y vamos a crear un menu personalizado que al hacer click directamente abra la vista de edicion de esa pagina.

Para todo esto vamos a usar el plugin Admin Menu Editor:

Es muy sencillo de usar, permite elegir iconos y submenues. Estoy seguro que van a saber usarlo. Pero aqui viene una aclaracion importante!

No recomiendo usar este plugin para esconder items del menu

Ya se que ahora mismo todo esta super feo y parece el infierno de los menues. Pero paciencia, ya llegaremos a eso.

Esconder lo innecesario para el cliente

Lo primero es crear un usuario para el cliente. Recomiendo crearlo con permisos de Editor.

Ahora instalamos el plugin Adminimize

Cuando vamos a la pagina de configuracion de este plugin van a ver un oceano de checkboxes. Cada uno de estos checkboxes esconde algo, literalmente, lo hace desaparecer de la vista del cliente. Como lo creamos con permisos de Editor entonces solo necesitamos preocuparnos por esa columna.

Veran que esta dividido por secciones e incluso hay una seccion por cada Pod que creamos varios pasos atras. Pero lo primero que nos interesa esconder son todos los items del menu que no le vamos a presentar al cliente, como ser, Entradas, Paginas, Medios, Enlaces, Comentarios y todos los pods a los que no se puede acceder sino desde una pagina. Como el ejemplo de la Home de hace un rato.

Luego de eso nos iremos a la seccion de cada Pod a esconder tambien las cosas inncesarias para el cliente. Para no confundirlo con cosas que no necesita. Recomiendo esconder ‘Add New’ si no es necesario, ‘Opciones de pantalla’, ‘Publish Actions’, ‘permalink’ si no es necesario.

Y ahora pueden seguir jugando con este plugin y esconder cosas del footer y del header que el cliente tampoco necesita.

Añadidos del valor al panel de wordpress

Por ultimo y ya para terminar con el panel del cliente voy a recomendar unos cuantos plugins mas.

Custom Dashboard Widgets 

 Este es muy sencillo de usar y nos va a permitir crear un Dashboard o Escritorio que reemplace al de wordpress que la verdad es bastante inutil. Quedaria algo asi:

Algun template para reemplazar el diseño de wordpress y ‘distrazarlo’. Esto va a ser cuestion de gustos pero a mi me gustaron “Fancy Admin UI” y “Slate Admin Theme”.

Y por ultimo algo para mejorar la pagina de login. Puede ser algo tan sencillo como el plugin WP Custom Login Page Logo que nos permite simplemente cambiar el logo.

El theme o template

Ahora ya tenemos el panel completito. Nos falta integrar todo eso en el admin y aqui es donde se vuelve super interesante.

Pueden usar cualquier theme de wordpress y cualquier template que no sea para wordpress. Esto es ideal porque muchas veces esta clase de trabajos son trabajos personalizados, donde no se usa un theme de wordpress sino que se manda a hacer una maqueta personalizada a un diseñador.

Lo primero que van a hacer es agarrar cada una de los archivos de su template y convertirlos en un Page template para wordpress.

Por ejemplo, en el caso de la Home de los puntos anteriores. Seria agregar este pequeño trozo de codigo al inicio del archivo.

<?php
/*
  Template Name: Home Pod Page
*/
?>

Y asi sucesivamente con todos los archivos que esten vinculados a un Pod, una Pagina, un Taxonomy o lo que sea.

Luego, para acceder a los datos de un Pod hay 2 formas. Bueno es una en realidad. Es la siguiente:

<?php
   $slider = new Pod('slider_home');
   $slider->findRecords('name ASC');
?>
<?php while ( $slider->fetchRecord() ) : ?>
   <li>

     <h4><?php echo $slider->get_field('volanta') ?></h4>
     <h1><?php echo $slider->get_field('titulo') ?></h1>
     <img src="<?php echo $slider->get_field('imagen')[0]['guid']?>">

   </li>
 <?php endwhile ?>

Eso seria para acceder a un Pod del que se pueden crear varios. Pero si solo fuera unico. Por ej los datos de contacto, es igual solo que el fetchRecord se hace sin while.

Tambien puede acceder a otros valores del Pod que no hayan creado ustedes sino que forma parte natural de wordpress como ser ‘title’ y ‘permalink’

Y unos ultimos codigos de ayuda, todos estos van en functions.php:

Para asignar Page Template basados en el Post Type:

function get_current_post_type()
{
  global $post, $typenow, $current_screen;
  //we have a post so we can just get the post type from that
  if ( $post && $post->post_type ) {
    return $post->post_type;
  }
  //check the global $typenow - set in admin.php
  elseif ( $typenow ) {
    return $typenow;
  }
  //check the global $current_screen object - set in sceen.php
  elseif ( $current_screen && $current_screen->post_type ) {
    return $current_screen->post_type;
  }
  //check the post_type querystring
  elseif ( isset( $_REQUEST['post_type'] ) ) {
    return sanitize_key( $_REQUEST['post_type'] );
  }
  //lastly check if post ID is in query string
  elseif ( isset( $_REQUEST['post'] ) ) {
    return get_post_type( $_REQUEST['post'] );
  }
  //we do not know the post type!
  return null;
}

add_filter( 'single_template', 'custom_page_template' );
function custom_page_template( $page_template )
{
  // seteo por tipo de post
  switch (get_current_post_type())
  {
    default:
      return get_stylesheet_directory() . '/index.php';
      break;
   case 'calidad':
     return get_stylesheet_directory() . '/sections/calidad.php';
     break;
  case 'producto':
    return get_stylesheet_directory() . '/sections/detalle-productos.php';
    break;
  } // end switch
}

Para asignar el Page Template basados en el Taxonomy

add_filter( 'taxonomy_template', 'custom_taxonomy_template' );
function custom_taxonomy_template( $taxonomy_template )
{
  $taxonomy = get_query_var('taxonomy');

  switch ($taxonomy)
  {
    case 'linea':
      return get_stylesheet_directory() . '/sections/productos.php';
      break;
      default:
        return get_stylesheet_directory() . '/index.php';
        break;
  }
}

Y para obtener la seccion en la que se encuentran. Esto va a ser util para poner class active al menu de la web

function getSection() {

  $page = explode('/', substr($_SERVER['REQUEST_URI'], 1));
  $section = $page[2];

  return $section;
}

Eso es todo. Por ahora. Sientanse libres de darme recomendaciones, criticas y consejos o hacer preguntas en los comentarios.

La entrada Como crear un sitio web para tu cliente con WordPress pertenece a Paraiso Linux.

Domingo 21 de enero de 2018

Eduardo Federico

Eduardo Federico
Paraiso Linux

Instalando Windows por primera vez luego de 10 años usando Linux

Esto va a ser simplemente contar mi experiencia sobre lo que fue volver a instalar Windows luego de mas de 10 años usando Linux.

Por cuestiones de trabajo, me tocaba tener windows instalado, necesitaba varias herramientas que solo pueden ser ejecutadas en ese sistema operativo como ser Visual Studio y C#. Y no, no podía usar las alternativas libres que existen, tenían que ser esas herramientas.

Entonces, me di a la tarea de hacer backup para proceder a instalar windows en mi notebook. Por cierto, puede que a algunos les interese las características de mi notebook: procesador i5, disco ssd 120Gb, 8Gb RAM DDR3.

Primer intento

Buscar un windows “por ahi”. Supuse que el que mejor iba a funcionar era obviamente windows 10. Asi que busque hasta que encontre uno que “me dio confianza”. Lo grabe en un pen drive y lo instale.

  • No me funcionaba el audio, ni parlantes, ni auriculares, ni microfono
  • Las teclas especiales de la notebook tampoco funcionaban
  • No podia conectar mi monitor grande
  • No detectaba la impresora
  • Funcionaba extremadamente lento

Ante estos problemas, me puse a buscar los drivers para la notebook. Resulta que esos drivers solo existían para windows 7 u 8. Al menos eso es lo que mostraba la pagina oficial de la marca de la notebook.

Aun así, baje los drivers, instale los que pude. No mejoro nada. Al conectar el monitor a la notebook este se prendía y apaga aleatoriamente.

Segundo intento

De repente recordé que en la caja de la notebook había un cd que vino con la notebook. Lo busque y la etiqueta decia “Disco de recuperación”. No tenia idea que era, lo puse, reinicie la pc y…oh! que grata sorpresa! es una versión original de windows que se instala, y es windows 7, justo lo que necesito!

Se instalo el S.O. y…

  • No me funcionaba el audio, ni parlantes, ni auriculares, ni microfono
  • Las teclas especiales de la notebook tampoco funcionaban
  • No podia conectar mi monitor grande
  • No detectaba la impresora
  • Funcionaba extremadamente lento

Al bajar los drivers oficiales solo conseguí que todo se pusiera todavía mas lento y raro.

Tercer intento

Esto es el colmo pero…tuve que comprar una notebook nueva. Una que ya viniera con windows 10 instalado y me ahorrara todos los problemas que tuve.

La compre y…no es que funcionara lento, era lo que los físicos han decidido llamar, “la menor velocidad que se puede conseguir en el universo”. Como la velocidad de la luz pero al contrario!

Esa misma noche, luego de comprarla, la lleve a donde me la vendieron, los “tecnicos” del lugar estuvieron haciendo conjeturas estúpidas sobre que era el antivirus que era malo, sobre que “con el tiempo funcionaria mejor” como si fuera un zapato que se estira con el tiempo, al final lo que hicieron fue reiniciarla, salio el cartel de “espere mil siglos hasta que se reinicie” y me dijeron que me la lleve y la traiga de nuevo al día siguiente si el problema persistía.

Por supuesto que el problema continuaba, pero no iba a llevarla para perder mi tiempo de nuevo. Me puse a googlear y encontré que al parecer es un error común con windows! Al abrir el administrador de tareas vi que consumia 100% del uso del disco, una locura.

Tuve que desactivar actualizaciones, desactivar toda la seguridad que pueda tener el sistema operativo y desinstalar antivirus y cualquier app que usara el disco y aun así apenas hubo mejoras.

Conclusión

En el trabajo nos pusieron maquinas remotas con windows para trabajar y al menos no me tengo que preocupar yo por como funciona (funciona mal, solo que no tan mal como mis intentos de instalar windows).

Ahora…no lo entiendo, simplemente no entiendo a la gente que usa windows.

Volví a instalar mi querido Arch Linux (Manjaro esta vez) y estoy feliz, todo funciono a la primera y sin tener que buscar e instalar cosas por aparte. Si les ha tocado una experiencia similar nos lo pueden contar en la caja de comentarios abajo.

La entrada Instalando Windows por primera vez luego de 10 años usando Linux pertenece a Paraiso Linux.

Martes 19 de septiembre de 2017

Sergio Gonzalez

Sergio Gonzalez
hackendemoniado

Comandos útiles para conocer nuestro procesador


Hola volviendo a publicar después de un gran tiempo, ahora vengo a dar ejemplos de distintos comandos útiles para obtener toda la información de nuestros CPU's que suelo utilizar en mi día a día, sin más pasamos directo sin tanto rodeos a los comandos.


Obtener toda la información completa del procesador:

O con el siguiente comando obtenemos la misma información pero agrupada en un simple listado:

Si solamente necesitamos recuperar información más especifica simplemente debemos hacer grep sobre este mismo archivo dependiendo de lo que necesitamos mirar.

Por ejemplo, para obtener el nombre del fabricante:

Para ver el modelo:

Para ver la velocidad:

Para saber el número de procesadores:

Otra forma de obtener lo mismo es:

O incluso buscando el string 'processor' dentro del archivo cpuinfo:

Obtener el número de núcleos:

Obtener el número de cpus/cores Físicos:

Obtener el número de cpus lógicos incluyendo los cores con Tecnología de HyperThreading:

Para computadoras antiguas que no tienen el comando nproc ni lscpu es el comando getconf:


Aunque también podemos ocupar el comando dmidecode pero con privilegios:

También podemos instalar algunos paquetes extras que nos pueden brindar alguna información extra como lo son cpufrequtils, cpuid, inxi, aunque logicamente podemos utilizar algunos softwares diseñados para obtener información completa de nuestro sistema pero que con algunos parametros podemos precisar al procesador de nuestro equipo: lshw, hwinfo si queremos instalarlos podemos hacer:

Con cpufrequtils podemos hacer:

Para cpuid es tan simple como:

Con inxi debemos de tirar lo siguiente:

Ahora con lshw debemos de teclear:

Y por último tenemos a hwinfo que lo usaremos de la siguiente manera:

Para cada uno de estos comandos vamos a tener una variedad de información de todo tipo de colores y sabores que con lo cuál dependiendo lo que estemos buscando o asegurando podremos corroborar o demostrar, e incluso conocer mejor nuestro cpu, espero que les sea de utilidad... Saludos

Jueves 06 de julio de 2017

Javier Ledesma

Javier Ledesma
Rotas Cadenas

Software Libre: Una brecha entre el capitalismo de consumo y el capitalismo de acceso

Documental proveniente de la Universidad de Murcia que nos presenta al software libre como una verdadera alternativa al software propietario.


Más información »

Lunes 26 de junio de 2017

¿Realmente te conoce? –AdsBlock

Este post nace a través de este enlace Dataselfie, conociendo al Algoritmo de Facebook y su Machine Learning. en el que hablan de como funciona el proceso de la publicidad que te sale en facebook,  a través del tiempo ya has dibujado tu perfil en facebook sea por búsqueda o por likes todo lo que hagas dentro de esa red social te va a salir, luego que ya saben que es lo que te gusta te empiezan a mandar publicidad acorde a ella, nunca se habían realizado esa pregunta ¿Por que me sale esto?. si quieren conocer que facebook sabe mas que ustedes tranquilamente, pueden abrir  este enlace Preferencias Ads en Facebook

El cual con la sesión abierta de facebook, desglosan en Intereses, y veras todo tus gusto, lo que por alguna razón buscaste o le diste por omisión. Ahí te conocerás realmente que es lo que te gusta.

Ya que donaste los datos, que puedo hacer.

Lo mas sensato es darse de baja de una red social donde juegan con tu información. si quieres seguir usándolo lo mas lógico seria usar AdsBlock  que lo puedes instalar en firefox y chrome, no vas a ver mas publicidad pero igual en cualquier momento que abras un enlace vas a empezar a crear nuevamente tu perfil.

Hace años 10 años una persona que respeto me compartió este video sigue vigente creemos que los servicios que usamos son gratis realmente.
https://www.youtube.com/watch?v=6bYLRGS3vFs

 

 

 

 

 

 

 

 

 

Domingo 25 de junio de 2017

Activar/desactivar registro de usuarios en WordPress

Registro WordPress

La solución es de forma inmediata, dentro del Escritorio (al que accedas administración del WordPress), le vas hacer click en  a Ajustes, Generales y activas o desactiva el checkbox de: Cualquiera puede registrarse. depende para lo que requieras.

Si lo que tienes  problema con usuarios que se registran y en realidad son robots o personas spammers, usa el plugin que mencione anteriormente  http://blog.julioh.com.ve/?p=476 en el cual se hace ocultar la url de wp-admin  otra forma es usando .httpass dentro de los directorios y bloqueando su acceso, o en su momentos podrías saber cual es tu ip para indicarle desde donde te conectas por ejemplo algo así.


order allow,deny
deny from 8.8.8.8
deny from 8.8.8.9
allow from all

Sábado 24 de junio de 2017

Seguridad en WordPress , Garantizar el acceso a wp-admin

WordPress por ser un CMS mas usado pues tienes vulnerabilidades y necesitamos blindarlo en seguridad y que mejor usando plugins para que no tengas una mala experiencia.

Esta es una de esas en la cual la ruta  ../wp-admin/ la remplazas para evitar acceso a ella.

En el caso el plugin WPS Hide Login no vas a eliminar /wp-login.php o /wp-admin , pero si lo va remplazar para no sea visible y colocaremos una url que solo sabremos nosotros.

Lo buscamos  WPS Hide Login en plugins  haz clic en Instalar y posteriormente en Activar.

En el plugin accede a Ajustes, Generales y establece la palabra de paso que sustituirá al clásico:

wp-admin por no-vasaentrar guardas los cambios y pruebas.

Configuración del plugin

Cuando intentas acceder a  http://tu-dominio.com/wp-admin
Te dará un 404 not found

De igual forma  también para  /wp-login.php no existen.

 

Prueba de acceso incorrecta

Si por el contrario pones la url de tu dominio con la palabra de paso establecida:

http://tu-dominio.com/?no-vasaentrar

Te va a salir tu panel para acceder, que se busca con esto, evitar ataques de diccionario, evitar suscripciones y proteger tu CMS de la mejor manera.

si por casualidad no te acuerdas de la url, puedes borrar el plugin en la carpeta wp-content y vuelve a la ruta original

 

Martes 30 de mayo de 2017

Martín Albisetti

Martín Albisetti
Martin Albisetti's blog

A year at Bitnami

I’m a stone’s throw away from reaching my 1 year anniversary at Bitnami, so it feels like a good time to pause a bit and look back.

After 8 years working at Canonical on a wide range of projects and roles, it was a very difficult step to take and was riddled with uncertainty and anxiety about leaving behind so many things I had poured my heart and soul into for so many years behind, and more than anything else a once-in-a-life-time epic team of people to work with.

A year in, I’m overwhelmingly happy I made that decision.

A lot of people expressed surprise I was joining Bitnami as either they hadn’t heard about them at all or they had but thought of them as a company that “made some installers or something”. However, Bitnami had been quietly but consistently growing in size, scope and revenue, all fueled by being organically profitable which is very rare nowadays in the tech world.

Fast forward a year later Bitnami is starting to move out of the shadows and some of what’s been cooking for a while is getting some well deserved time in the spotlight.

Of the things that are public, I would say they fall into two buckets: Kubernetes & Packaging open source applications.

 

Kubernetes

The Kubernetes community has been growing at a healthy and inclusive pace for some time now, some would say it’s the hippest place to be right now.

One of things that was attractive to me when changing jobs was the possibility of being able to use some new and interesting technologies more hands-on as part of my day-to-day job, and K8s was at the very top of my list. Shortly after I joined we made a company decision to go all-in on K8s and began setting up our own clusters and migrating over our internal services to it. Aside from the amount of buzz and customer requests we had, once we started using it more hands on it became obvious to us it would win over hearts and minds fairly quickly and we doubled down on being all-in  🙂

Aside from all the knowledge we gained by setting up, maintaining and upgrading our internal clusters, Bitnami acquired a small but very relevant start-up called Skippbox which brought over further expertise in training, but even more interesting was a project called Kubeless.

Kubeless is a functions-as-a-service framework which has the advantage of having been built on top of K8s native objects, making it very easy to extend and interact with anything inside your cluster. That project has been a lot of fun to play with is a natural addition to our internal clusters to fulfill our stated goal of making it easy and enjoyable for our own development team to get deliver software to production.

It was a busy year, have I said it’s been a busy year? So, as well as all of that along came the Helm project. Once we heard “a packaging format for applications on K8s” we knew someone’s current iteration would be derailed  🙂

We jumped in with Deis and helped get the project off the ground by applying our knowledge of how to package software to Helm and quickly produced the majority of the charts that the project launched with. It’s been getting a healthy string of contributions since then, which is as good as you can hope for.

Because humans are visual creatures, no matter how technical, on the heels of the launch of Helm we took the lead on a new project code-named “Monocular”, which is a web-ui to search and navigate existing Helm charts and even deploy them to your cluster with one click. An app store of sorts for K8s applications.

With all that K8s experience in our toolbelts, we started to realise there was a gap in how to consistently deploy applications across clusters. Why across clusters, you say? A very common pattern is to have at least a staging and a production environment, which in K8s you would likely want to model as different clusters. We happen to internal also provide a development cluster as we do so much development in the K8s and often need to test in larger machines or use some specific features that minikube doesn’t satisfy. The way to do that in Helm is essentially to copy and paste your yaml files, which for a small amount of clusters or apps is fine. For us, this quickly grew out of control and realised that we needed to instrument some amount of re-usability and flexibility when trying to use K8s features that Helm itself hadn’t exposed yet. It turned out, we weren’t alone. Our friends over at hept.io and box.com had similar problems and were in fact trying to address it in a similar way (given there were a few ex-googlers in our ranks, jsonnet was picked as the library to help with re-usability), and as such ksonnet was born. You can take  a look at it more closely if you’re interested, but in essence it takes json & jsonnet templates and compiles them down to native K8s yaml files that you can track and feed directly into your cluster.

 

Packaging open source applications

This is what is probably the most underrated aspect of Bitnami, as it’s probably not very obvious the scale at which we operate and there’s nobody else really to compare the company to.

Let me try and give you some hints at the scale at which we operate. At this exact point in time, you can find Bitnami-built assets as:

  • Windows, Linux and macOS installers
  • Amazon EC2 VMs
  • Azure VMs
  • Google Cloud VMs
  • Oracle Cloud VMs
  • Virtual Machines (OVA’s)
  • Huawei Cloud VMs
  • Deutsche Telekom VMs
  • 1&1 VMs
  • GoDaddy VMs
  • Centurylink VMs
  • Docker containers
  • Eclipse Che containers
  • Docker-compose templates
  • Amazon Cloudformation templates
  • Azure ARM templates
  • Google deployment templates
  • Kubernetes Helm charts
  • …and more on its way  🙂

That is 20 different target environments! Even if you just built one applications for all those targets it would be an interesting problem in itself. However, there’s more  🙂

Bitnami has a catalog of about 170+ open source applications of which we don’t always provide the full catalog to every environment as it doesn’t always make sense (not everything makes sense as a Docker container or a multi-tier application), and while I haven’t looked at the exact numbers it would likely average out over all targets at around ~110 apps. That is 110 x 20 = 2,200 assets to build. That on its own should feel daunting for anyone who’s tried to build an application for more than one environment. But wait, there’s more!
Bitnami’s missions is to make it easy for everyone to use open source software, and to try and reach more of “everyone” you need to support major versions of these applications (because not everyone has migrated to Python 3 yet :), so that ends up with around 4,400 assets. Mind. Blown. But you know how it goes, there’s always more!

Building these images and templates is an interesting and hard problem, but the hardcore last-level boss problem is in doing so in a way where you can keep building those continuously so they are actually up-to-date all the time. In order to do that you have to track a lot of software (eg., libssl, libc, openssh, php, java, rails, etc) packaged in different ways (ie., debs, rpms, gems, pip, etc), so you end up watching thousands of different pieces of software over all, some of which can affect every single image (hello openssl & heartbleed!).
To solve this problem there’s over a decade of code that’s been brewing, carefully structured metadata about how applications like to be configured in different scenarios, regression tests, tracking upstream releases and watching and matching CVEs. Over the last year there’s been a tight focus on taking all that work to streamline the tools to plan for continued growth as the landscape of software expands, and some refactoring to be able to shape it into a product that might be useful to others beyond our internal use.

Daunting problems end up being the most fun to work on and this has been no exception. This is why I joined Bitnami, to lead this effort and make open source software a bit easier to use and access every day.

Martes 09 de mayo de 2017

PCTux: Probando el servicio de VPS Clouding.io
PCTux: Probando el servicio de VPS Clouding.io

Sábado 15 de abril de 2017

Javier Ledesma

Javier Ledesma
Rotas Cadenas

Linux Tiles Wallpapers

Linux Tiles es un bonito pack de wallpapers para tu escritorio Linux. Hecho con Blender 3D y renderizado con Cycles.

http://www.rotascadenas.com/2017/04/linux-tiles-wallpapers.html

Lunes 09 de enero de 2017

Mariano Mendez

Mariano Mendez
[A]NTRAX - [L]ABS

BING: El buscador olvidado


Posicionamiento WEB

Hoy día, quien tiene una un sitio Web de cualquier naturaleza, sea para ofrecer un servicio, producto, o incluso para compartir materiales o documentación digital, si quiere marcar presencia en la red de redes, necesariamente tendrá que considerar el posicionamiento WEB o SEO (Search Engine Optimization). 

Sabemos que el SEO comprende una serie de estrategias, técnicas, o incluso habilidades para lograr las primeras posiciones en los resultados de los buscadores clásicos: Google, Bing, Yahoo, etc.
Va de suyo que podemos pagar marketing publicitario para tales fines; sin embargo las destrezas del SEO nos permiten lograr estupendos posicionamientos en las búsquedas gratuitamente,  aunque impliquen laboriosidad.

En mi opinión, se leen muchísimos tips para el SEO de Google, pero me queda la sensación que tanto Bing como Yahoo, no siempre son tenidos en cuenta en este trabajo de posicionar nuestro sitio digital. 

Aclaro que no es mi idea en esta entrada enumerar estrategias o sugerencias para mejorar el SEO, sino apuntar a que se consideren otros buscadores diferentes de Google a la hora de posicionar un espacio cibernético.  Sino llamar a la reflexión para tener presente al  segundo motor de búsqueda más importante: BING.


Números en BING

La cuota de mercado de BING, según señalan  los expertos va en ascenso:

“...Bing actualmente cuenta con el 21,9% de la cuota de mercado en escritorio en Estados Unidos. Una información que ha llamado nuestra atención y que demuestra que el buscador de Microsoft no ha dejado de crecer. Un punto en el que podrían tener que ver las últimas novedades incorporadas por el gigante tecnológico. Pero vayamos con los datos.



 “En concreto, la cifra supone un incremento de un 0,1 porcentual respecto del mes de junio, cuando contaba con el 21,8%. Los datos ofrecidos por la citada compañía, asimismo, muestran una caída del 0,4 por parte de Google...”

Los números de la gráfica hablan por sí mismos.


Otros comentarios sobre Bing

Más allá de las cifras expuestas, es oportuno recordar que Facebook y Skype emplean a Bing como buscador por defecto y las redes sociales o la mensajería instantánea son puntos claves en el SEO, tanto  por su extendido uso como por su  notoriedad.

Si a esto le agregamos los aspectos técnicos que a Bing le preocupan como, por ejemplo: velocidad, link rotos del sitio, evitar contenidos flash, entre otros; se torna una sumatoria de elementos que no deberían estar olvidados para el SEO de nuestra Web.

Posicionar un espacio digital no es tarea sencilla, pero es la base para el éxito del mismo.
Como comenté antes, no dejaré un tutorial de sugerencias, pero quiero destacar en lo referente al SEO en bing una interesante guía para que al momento de poner manos a la obra la consideren.

Mariano Mendez

Mariano Mendez
[A]NTRAX - [L]ABS

Cómo comprar BITCOINS


En esta entrada hablaremos de las criptomonedas, en particular de los Bitcoin. Seguramente todos han oído hablar de este tipo de moneda digital, pero no está de más recordar qué es y para qué sirven los Bitcoins, sin perjuicio de algunas reflexiones personales sobre las ventajas de su uso.

Referencias previas del término Bitcoin

Si consultamos en Wikipedia el término Bitcoins:


“Bitcoin (signo: BitcoinSign.svg; abr.: BTC, XBT) es una criptodivisa concebida en 2009. El término se aplica también al protocolo y a la red P2P que lo sustenta y de forma común se denomina como una moneda digital. Generalmente se usa «Bitcoin» para referirse a la red o al protocolo y «bitcoin» (plural: «bitcoines») para referirse a las unidades monetarias.”


De la transcripción precedente puede inferirse que bajo la expresión “Bitcoin” se comprenden tres aspectos diferentes:

Como moneda digital o unidades  de pago en intercambios comerciales vía online.


Como protocolo estandarizado que da soporte a las transacciones electrónicas, sin la mediación de terceros.

Como red para donde se negocian las operaciones comerciales.
Desglosadas estas referencias, hay que destacar que la criptomoneda se sustenta en un sistema totalmente peer-to-peer(persona a persona) donde los intermediarios quedan excluidos. La no intervención de terceros y la ausencia de una Autoridad Central bancaria de país alguno,  es una de las ventajas de los Bitcoins, en la medida que inhibe la especulación y la participación en ganancias como lo hacen las entidades financieras. 

Apoyando estas líneas de pensamiento, en bitcoins.org se reseña: 


“De la misma manera que nadie controla la tecnología detrás del correo electrónico, Bitcoin tampoco tiene propietarios. Bitcoin lo controlan todos los usuarios de Bitcoin del mundo. Aunque los programadores mejoran el software, no pueden forzar un cambio en el protocolo de Bitcoin porque todos los demás usuarios son libres de elegir el software y la versión que quieran. Para que sigan siendo compatibles entre sí, todos los usuarios necesitan utilizar software que cumpla con las mismas reglas. Bitcoin sólo puede funcionar correctamente si hay consenso entre todos los usuarios. Por lo tanto, todos los usuarios y programadores tienen un gran aliciente en proteger dicho consenso.”


Se señala como creador del sistema a  Satoshi Nakamoto y el 12/01/2009 se anota como la primera transacción con esta moneda; y desde esa fecha no solo se ha disparado el uso de Bitcoins, sino el valor que los respalda. Razones evidentes por las que se hace recomendable su uso.  

¿Cómo comprar Bitcoins?

Adscribirse al sistema no es difícil y en lo particular recomiendo las orientaciones del siguiente enlace como comprar bitcoins en Argentina, donde se explica detalladamente los pasos a seguir para la adquisición y operaciones con la moneda criptográfica de la que hablamos. Además de contener un estupendo FAQ de preguntas frecuentes que solventan toda duda. 

A modo de cierre de la entrada y en forma sintética  se pueden destacar cuatro puntos a saber:

Seguridad del sistema: basado en un sistema criptográfico altamente seguro.


    Anonimicidad en las transacciones: la privacidad es un elemento fundamental al momento de adquirir, vender, enviar o recibir pagos. 

      Operaciones en tiempo real al instante:se puede enviar y recibir pagos a cualquier lugar del mundo en forma instantánea.
Expansión de la criptomoneda:actualmente casi todos los negocios online aceptan el Bitcoin como medio de pago. Se habla del Bitcoin como la moneda futurística.


Domingo 08 de enero de 2017

David Moreno

David Moreno
dm's blog

Thanks Debian

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

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

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

[-- The following data is signed --]

Hi,

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

https://nm.debian.org/public/person/damog

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

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

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

http://damog.net/blog/2005/06/29/debian-tattoo/

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

With all best wishes,
David Moreno.
http://damog.net/


[-- End of signed data --]

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

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

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

Peace.

Jueves 15 de diciembre de 2016

Mariano Mendez

Mariano Mendez
[A]NTRAX - [L]ABS

XSS por POST


Hace unos días reportaron un XSS por POST en el formulario de contacto de Underc0de. Por suerte no era nada riesgoso, pero era una vulnerabilidad que debíamos arreglar.
En esta ocasión usaremos el código de ese formulario de contacto para reproducir la falla y para ver como probar si nuestras aplicaciones son vulnerables a los XSS por POST.

El código del formulario de contacto está acá: www.hospedando.com.mx/descargas/formulario.zip por si alguno desea realizar la prueba.

Además, necesitaremos alguna herramienta que modifique los parámetros que enviemos por POST. Yo usare Tamper Data que es un complemento de Firefox:

https://addons.mozilla.org/es/firefox/addon/tamper-data/

Una vez montado el formulario de contacto se vera algo así:



El primer paso será completar todos sus campos y abrie Tamper Data. Una vez hecho esto, damos en "Comenzar Modificación" (En el tamper data) y enviamos el formulario de contacto.
Seguido a esto, nos aparecerá una alerta en Tamper Data para modificar los datos que estamos enviados.


Damos en modificar, y revisamos los valores que está enviando del lado derecho, que son los que hemos cargado desde el formulario.


Ahora es momento de jugar con estos campos. Este formulario de contacto no filtra sus variables, asique colocaremos algún vector de XSS en sus parámetros.
En este caso, coloqué un simple alert en el campo correo.

<script>alert('XSS')</script>

Pero podemos buscar o usar cualquier otro. Al dar en Aceptar, el sitio seguirá cargando con la nueva información suministrada...


Y como podrán apreciar, apareció el Alert con nuestro mensaje.

Espero que les sirva!

Lunes 29 de agosto de 2016

David Moreno

David Moreno
dm's blog

Webhook Setup with Facebook::Messenger::Bot

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

use Facebook::Messenger::Bot;

use constant VERIFY_TOKEN => 'imsosecret';

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

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

Domingo 21 de agosto de 2016

David Moreno

David Moreno
dm's blog

WIP: Perl bindings for Facebook Messenger

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

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

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

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

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

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

$bot->spin();

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

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



…using a simple script like this one.

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

Thanks!

Viernes 05 de febrero de 2016

PCTux: Cupones de descuento en Argentina

Viernes 29 de enero de 2016

Sergio Gonzalez

Sergio Gonzalez
hackendemoniado

script para automatizar tareas (PARTE 3) - Detectar intruso en nuestra red + aviso por mail

Ya vamos por la tercer parte de esta serie de scripts, ahora toca un script muy curioso que me tomo un buen tiempo dejarlo a punto, antes que nada hay que entender que es necesario tener instalado: nmap para poder saber quien esta conectado a nuestra red y también a mutt o cualquier aplicación que nos deje enviar correo a través de la terminal, y después solo necesitas un poco de tiempo y paciencia para ir probando como funciona y adaptarlo a tu redo u organización, como siempre voy a explicar línea a línea para que todos podamos aprender y crecer....

Acá dejo las partes anteriores:
http://hackendemoniado.blogspot.com.ar/2015/11/script-para-automatizar-tareas-parte-1.html

En la parte dos muestro como configurar a mutt para poder mandar mail por la terminal
http://hackendemoniado.blogspot.com.ar/2015/12/script-para-automatizar-tareas-parte-2.html

"POR FAVOR LEER TODO EL POST PORQUE HAY QUE TENER EN CUENTA VARIOS DETALLES PARA ADAPTARLO A SU RED"

Vamos directamente a mostrar el script:




Como se dan cuenta ya tiene comentarios como para llegar a entender algo, pero bueno debo comentar algunos puntos del funcionamiento del script:

  1. Primero que nada este script funciona como base buscando los mac de cada pc o equipo por ende debo de tener una lista blanca de host que yo conozco y que lógicamente no son intrusos recordad que esto incluye no solo las computadoras sino también celulares, routers,.... etc.
  2. El archivo llamado listablanca.txt cuando se ejecuta la primera ves se va a crear con un mac por defecto 00:00:00:00:00:00 el cual si desean lo dejan así la primera ves y ejecutan el script ingresando los rangos a escanear y ver como muestra y reporta los intrusos o detienen el script y modifican los host porniendo las mac pertinentes.
  3. Si la ruta no les apetece simplemente cambien por la de su interés o que se les complique menos, yo simplemente lo programe así por comodidad en la utilización del script.
  4. Tener en cuenta un punto muy importante que es lo siguiente, el script va a lanzar nmap a cada segmento de ip de su red y si tienen varios segmentos va a tomar un buen tiempo..., lo ideal seria que primero lo ejecuten y tomar aproximadamente el tiempo que toma en analizar toda su red y en definitiva dejar que ejecute completo y de a cuerdo a ese tiempo agregarlo a las tareas automáticas.
  5. El script también realiza un nmap sobre el intruso y con más razón tomar bien el tiempo para su próxima ejecución.
  6. Para que no se ejecute cada tanto tiempo podrian poner el script en una pc en cada segmento de red que mande el correo a la misma cuenta y así no hacer que la tarea en cron se ejecute cada mucho tiempo

Bueno luego de las consideraciones del script pasamos a explicar un poco el script por si no llegan a entender bien....

  • El primer if "if [ ! -d $ruta ]; then" pregunta si existe la ruta, osea si ya fué creada la carpeta, con la opción -d verifica sobre carpetas, si no existe simplemente la crea.
  • Segundo if "if [ -f $ruta/listablanca.txt ];" es lo mismo que en el caso anterior solo que con la opción -f que se utiliza para comprobar si existe o no el archivo, asique ya saben -d para directorios y -f para archivos, no tiene el signo "!" porque ya es implícito que deseamos comprobar que existe asique no es indispensable ese signo.
  • El siguiente punto importante es "nmap -sP $ips > $ruta/controlred.txt" aca es muy simple hacemos un escaneo con nmap sobre el segmento de ip que ingresamospor teclado obviamente esto no funcionara si lo ejecutamos con cron... por eso deje un poco más abajo un ejemplo de nmap sin el pedido por teclado "nmap -sP 192.168.100.1-255 --exclude 192.168.100.4 > $ruta/controlred.txt" osea comentamos las líneas anteriores osea desde el echo que pide el segmento hasta el nmap que utiliza lo ingresado por teclado y descomentamos esta línea que deje de ejemplo y ponen su segmento de red.
  • "cat $ruta/controlred.txt | grep Address | cut -c 14-31 | tr -d "()" > $ruta/host.txt" con esto lo que hago es mostrar la salida del nmap guardada en "controlred.txt" y busco la palabra Address y corto justo en el lugar del mac con la opción "cut -c ..." y lo mando a un archivo llamado "host.txt".
  • "cat $ruta/controlred.txt | grep for | cut -c 22-36 | tr -d "()" > $ruta/ip.txt" exactamente lo mismo que en caso anterior pero buscando solo las ip, también lo guardo en un archivo llamad "ip.txt".
  • Luego genero 2 variables que se llaman "hostmac" y "hostip", la idea es que en el bucle se guarde línea por línea los respectivos mac e ip de los host que están conectados y luego en "busca" guardo un 0 (cero) o un 1 dependiendo de que si lo encontró o no en la lista blanca de host permitidos, si debuelve un cero es porque no esta en esa lista y es un intruso.
  • "echo $hostmac | nmap -v -A -O $hostip >> $ruta/infointruso.txt " lo hago porque encontre un intruso e intento descubrir toda la info posible de el y lo guardo en un txt en el cual se va a ir concatenando cada ves que encuentre uno.
  • "echo "Se encontro un intruso con MAC Address: "$hostmac "IP: "$hostip" acá simplemente muestro el mac y el ip del intruso.
  •  "if [ $bandera == 1 ];then" si la bandarea esta en uno significa que encontro aunque sea un intruso en la red entonces debo de mandar el correo.
  • Luego de eso simplemente mando el correo pertinente con el archivo adjunto y borro la info del intruso.

Link para descargar script

Luego lo que hice fue agregar a cron el script de la siguiente manera:

Y luego puse lo siguiente:


Lo puse para que se ejecute cada 15 minutos, algunas capturas de pantalla:









Como muestra la imagen llega el correo con el adjunto que posee la info del intruso.

Si no entienden algo o encuentra algún error por favor me avisan así lo soluciono, como siempre digo la idea es aprender entre todos....

Espero que les resulte interesante y compartan....

Si tienen ideas de script que pueden llegar a ser útiles no duden en contarme y ver si los puedo ayudar a realizarlos....

Saludos amigos

      Jueves 28 de enero de 2016

      Sergio Gonzalez

      Sergio Gonzalez
      hackendemoniado

      script para automatizar tareas (PARTE 2) - Controlar logins fallidos y mandar alerta por email

      Hola seguimos con el tema de los script, ahora vamos a dar un pequeño paso más en esto de los script con cosas bastante útiles, la cosa es muy simple controlar los intentos de login en nuestro equipo por el momento a nuestros usuarios osea controlar la cantidad de intentos de acceso y en caso de ser necesario que nos llegue un email a nuestro correo reportando alguna actividad y de paso esta opción la podremos ocupar en el futuro para otros scripts y obviamente utilizaremos algunas cosas de la parte 1.
      Vamos a necesitar un corrego en gmail, y tener conocimentos en comandos variados de linux y programación básica,  pueden leet la parte uno para empezar desde cero porque hay cosas que ya las explique en esa parte y no da que repita lo mismo, todo lo nuevo obvio lo explico paso a paso para no perderce.

      Bueno pasemos directamente a trabajar:

      1. Primero creamos un archivo y le damos los permisos necesarios para ejecutar dicho script:
      2. Bien pasemos de lleno al script voy a explicar línea por línea:
        • La variable unahoramenos sirve para tener guardada una hora menos que la actual, osea si son las 20 horas va a guardar la hora 19, se entiende?? esto lo utilizo para que cuando ejecute el script empiece a controlar no desde la hora actual sino desde una hora antes y revisar la cantidad de intentos de acceso, obvio eso ustedes los pueden manipular como ustedes más gusten.
        • La variable horaactual obtiene la hora actual del sistema sin los segundos.
        • El comando "lastb" es lo principal de este script porque es el que lista los intentos fallidos en el sistema para todos los usuarios con información relevante como fecha, hora, etc. con la "-s" indicamos un horario en el cual queremos revisar para que no nos liste absolutamente todo desde el origen de los tiempos, obvio primero lo hacemos para algún usuario en particular en mi caso el mio (| grep hackende) y luego lo redirigimos a un txt (loginfailshackende.txt).
        • Con el comando "wc -l" lo que hacemos es contar la cantidad de lineas que tiene el archivo de txt que creamos en la línea anterior para saber exactamente la cantidad de intentos fallidos en el sistema y lo redirigimos a un txt (cantfailhackende.txt).
        •  "awk" lo que permite es manipular los strings, y precisamente sacamos lo que tiene la primer columna es decir la cantidad de intentos fallidos y lo guardamos en la variable "contador".
        • Para la variable "dia" utilizamos el comando "awk" de nuevo pero obteniendo la columna 5 que tiene justamente el número del día en que sucedio el intento de acceso del archivo "loginfailshackende.txt" con el comando "head -n 1" hacemos que solo lo haga para la primer línea porque sino guardaria la columna entera y seria ineficiente tener cosas de más.
        • En la variable "hora" justamente guardamos la hora.
        • En la variable "diahoy" guardamos el número del día de hoy.
        • Ahora llega el momento de explicar "if [ $contador -ge 3 ] && [ $dia -eq $diahoy ]; then" bueno es solo un condicional que realizara alguna acción si se cumplen uno o varios factores determinantes que permitan tomar el control para alguna acción en particular, para nuestro caso es muy simple, decimos "si [lo que tiene la variable "contador" es mayor igual a 3] y [la variable "dia" es igual a la variable "diahoy"]" hacemos...., osea simplemente controlamos 2 factores, primero que la variable contador sea mayor a 3 porque en ese caso posiblemente alguien este intentando demasiadas veces entrar y debemos actuar al respecto; y el segundo punto que solo se realice para la fecha de hoy.
        • Acá mandamos directamente el email porque se supone que se cumplieron los 2 factores en la linea de control IF, bueno yo utilice mutt para mandar el email, para instalar simplemente hacemos:Luego lo configuramos modificando el archivo "nano /root/.muttrc":Debemos de cargar los datos para configurar correctamente a mutt para eso hacemos:Esto es solo pegar lo anterior y acomodarlo a su gusto, obviamente cuando lo utilicen se darán cuenta para que se utiliza cada cosa pero obviamente yo solo lo probé en gmail (en hotmail hay que investigar un poco pero bueno como yo ya tenia ese correo lo deje...) una ves echo eso ya estamos listo para mandar email desde la consola, en nuestro script lo realizamos con un "echo" que indica el texto que aparecera en nuestro email como texto simple en nuestro caso la advertencia¡¡¡ luego con una tuberia llamamos a mutt con "-s" para indicar el encabezado del email a enviar.
        • Todo lo demas dentro de ese bucle ya lo conocemos de la parte 1.
      3. Luego el siguiente paso es mandar el script a que se ejecute con cron:
      4. Y solo agregamos la ruta del script al igual como lo hicimos en la parte 1: "3 * * * * root /home/hackendemoniado/Documentos/scripts/login_hackendefail.sh" yo lo configuro para que se ejecute cada 3 minutos para probarlo pero en realidad hay que dejarlo cada una hora eso seria cada 59 minutos o ponerlo dentro de la carpeta que se ejecuta cada hora (al script copiarlo dentro obvio) o como ustedes quieran.
      5. Para root es exactamente lo mismo solo que buscamos todo para root:
      6. Bien pasemos de lleno al script voy a explicar línea por línea:
      7. como ven es casi lo mismo pero adaptado al ususario root, luego lo agregamos a cron como hicimos para nuestro usuario anterior y listo
      8. Imagenes:





      Como ven efectivamente llego el email luego de probar a traves de laterminal el acceso como root y poner 3 veces la clave mal, obvio funciona tanto para root como para nuestro usuario, es algo que me parecio curioso de hacerlo y de paso compartirlo, espero que les sea útil a ustedes y cualquier cosa me consultan porque se pueden precentar una variadad de errores que lógicamente están todos controlados con el script y con la configuración de mutt (igual como digo siempre todo puede fallar¡¡¡¡ jeje) asique ya saben consulten sus dudas y ya estare publicando la parte 3.....

        Domingo 08 de noviembre de 2015

        Sergio A. Alonso

        Sergio A. Alonso
        Bunker Blog

        Taller de Linux y Ruby on Rails

        Hace tiempo que no posteo en el Blog
        Sepan disculpar: no solo no me he retirado, sino que gracias a mis dos últimos empleos, Belatrix y Supercanal (donde sigo trabajando) he aprendido mucho y apenas me ha alcanzado el tiempo para transmitir conocimientos nuevos
        Como para no dejar completamente de lado la docencia, lanzo la cuarta edición de este Taller, con muchas novedades.
        Si bien el Taller es presencial, incluye un aula virtual propia con todo lo necesario para crear los primeros algoritmos en Ruby, diseñar aplicaciones web, hacer scripting, y armar ambientes reales de producción.
        El taller es muy intenso: incluye varios meta conocimientos alrededor de esta tecnología adquiridas a lo largo de 20 años de experiencia: intercambio de llaves, GIT, seteo de Apache, balanceadores de carga, debug sobre el terreno, despliegue de nodos, deploy en clouds, y una larga lista de habilidades tanto del desarrollador web como de esa nueva profesión que se viene gestando llamada DevOp.


        Ejemplo del aula, la cual gracias a Screen y al fantástico Codebox IDE me permite asistir rápidamente a los alumnos:

        Para los impacientes, aquí les dejo un enlace a la descripción del Taller, clase por clase: https://goo.gl/ngQ2BE

        Enlace hacia la nota completa: http://goo.gl/BLyqdy

        Se agradece su difusión.

        Lunes 07 de septiembre de 2015

        Sergio A. Alonso

        Sergio A. Alonso
        Bunker Blog

        Shot of work's laptop




        A typical work session with Arch, Mate Window Manager, Numix Theme + my own colors.

        Vim Janus with Molokai theme, Oh-my-zsh with Agnoster theme, Terminator, Tig, and Fuck correct typos. 

        Wallpaper is one of my favorites related to Owl's Moving Castle, downloadable from here: http://www.allmacwallpaper.com/get/iMac-21-inch-wallpapers/-Howl's-Moving-Castle-1920x1080/5226-9.jpg

        Lunes 31 de agosto de 2015

        Martín Albisetti

        Martín Albisetti
        Martin Albisetti's blog

        Developing and scaling Ubuntu One filesync, part 1

        Now that we’ve open sourced the code for Ubuntu One filesync, I thoughts I’d highlight some of the interesting challenges we had while building and scaling the service to several million users.

        The teams that built the service were roughly split into two: the foundations team, who was responsible for the lowest levels of the service (storage and retrieval of files, data model, client and server protocol for syncing) and the web team, focused on user-visible services (website to manage files, photos, music streaming, contacts and Android/iOS equivalent clients).
        I joined the web team early on and stayed with it until we shut it down, so that’s where a lot of my stories will be focused on.

        Today I’m going to focus on the challenge we faced when launching the Photos and Music streaming services. Given that by the time we launched them we had a few years of experience serving files at scale, our challenge turned out to be in presenting and manipulating the metadata quickly to each user, and be able to show the data in appealing ways to users (showing music by artist, genre and searching, for example). Photos was a similar story, people tended to have many thousands of photos and songs and we needed to extract metadata, parse it, store it and then be able to present it back to users quickly in different ways. Easy, right? It is, until a certain scale  🙂
        Our architecture for storing metadata at the time was about 8 PostgreSQL master databases where we sharded metadata across (essentially your metadata lived on a different DB server depending on your user id) plus at least one read-only slave per shard. These were really beefy servers with a truck load of CPUs, more than 128GB of RAM and very fast disks (when reading this, remember this was 2009-2013, hardware specs seem tiny as time goes by!).  However, no matter how big these DB servers got, given how busy they were and how much metadata was stored (for years, we didn’t delete any metadata, so for every change to every file we duplicated the metadata) after a certain time we couldn’t get a simple listing of a user’s photos or songs (essentially, some of their files filtered by mimetype) in a reasonable time-frame (less than 5 seconds). As it grew we added caches, indexes, optimized queries and code paths but we quickly hit a performance wall that left us no choice but a much feared major architectural change. I say much feared, because major architectural changes come with a lot of risk to running services that have low tolerance for outages or data loss, whenever you change something that’s already running in a significant way you’re basically throwing out most of your previous optimizations. On top of that as users we expect things to be fast, we take it for granted. A 5 person team spending 6 months to make things as you expect them isn’t really something you can brag about in the middle of a race with many other companies to capture a growing market.
        In the time since we had started the project, NoSQL had taken off and matured enough for it to be a viable alternative to SQL and seemed to fit many of our use cases much better (webscale!). After some research and prototyping, we decided to generate pre-computed views of each user’s data in a NoSQL DB (Cassandra), and we decided to do that by extending our existing architecture instead of revamping it completely. Given our code was pretty well built into proper layers of responsibility we hooked up to the lowest layer of our code,-database transactions- an async process that would send messages to a queue whenever new data was written or modified. This meant essentially duplicating the metadata we stored for each user, but trading storage for computing is usually a good trade-off to make, both in cost and performance. So now we had a firehose queue of every change that went on in the system, and we could build a separate piece of infrastructure who’s focus would only be to provide per-user metadata *fast* for any type of file so we could build interesting and flexible user interfaces for people to consume back their own content. The stated internal goals were: 1) Fast responses (under 1 second), 2) Less than 10 seconds between user action and UI update and 3) Complete isolation from existing infrastructure.
        Here’s a rough diagram of how the information flowed throw the system:

        U1 Diagram

        It’s a little bit scary when looking at it like that, but in essence it was pretty simple: write each relevant change that happened in the system to a temporary table in PG in the same transaction that it’s written to the permanent table. That way you get transactional guarantees that you won’t loose any data on that layer for free and use PG’s built in cache that keeps recently added records cheaply accessible.
        Then we built a bunch of workers that looked through those rows, parsed them, sent them to a persistent queue in RabbitMQ and once it got confirmation it was queued it would delete it from the temporary PG table.
        Following that we took advantage of Rabbit’s queue exchange features to build different types of workers that processes the data differently depending on what it was (music was stored differently than photos, for example).
        Once we completed all of this, accessing someone’s photos was a quick and predictable read operation that would give us all their data back in an easy-to-parse format that would fit in memory. Eventually we moved all the metadata accessed from the website and REST APIs to these new pre-computed views and the result was a significant reduction in load on the main DB servers, while now getting predictable sub-second request times for all types of metadata in a horizontally scalable system (just add more workers and cassandra nodes).

        All in all, it took about 6 months end-to-end, which included a prototype phase that used memcache as a key/value store.

        You can see the code that wrote and read from the temporary PG table if you branch the code and look under: src/backends/txlog/
        The worker code, as well as the web ui is still not available but will be in the future once we finish cleaning it up to make it available. I decided to write this up and publish it now because I believe the value is more in the architecture rather than the code itself   🙂

        Jueves 02 de julio de 2015

        Che … ¿y los datos?

        Hace mas de un año, en abril de 2014, hice una presentación sobre Gobierno Abierto / Datos Abiertos para Libres del Sur / FAP.

        En dicha presentación me enteré que dentro de la Secretaría de Desarrollo Tecnológico se había iniciado un proceso de apertura de datos de la administración municipal.

        Como con todo aquello que hace el Intendente Pulti, me pareció bien la iniciativa pero me reservé las opiniones para mas adelante, ya que su costumbre siempre es patear para adelante y esperar que los reclamantes se cansen.

        Ah, y también hacer mucha parafernalia y ruido con poquitas nueces.

        Así fue como apareció el “Portal de Datos Abiertos” de la MGP. Y se hizo un Hackaton. Y un Concurso de Aplicaciones.

        Me voy a referir al primer punto, el portal de datos abiertos.

        Se suponía que allí uno iba a poder encontrar la información que necesitara sobre la Municipalidad y la ciudad, en formatos libres y abiertos, y actualizada.

        Lo que realmente se encuentra (con la excepción de los datos de llamadas al 147, que parecen ser extraídas directamente del sistema que usa el call center), es todo lo que publicaron hace un año y olvidaron ahí.

        Asi se ve la parte sobre datos sobre seguridad:

        datos_seguridad_20150701

        Así los referidos a medio ambiente:

        datos_medioambiente_20150701

        datos_medioambiente_osse_20150701

        Los de movilidad:

        datos_movilidad_20150701

        Los de economía y presupuesto:

        datos_economía_20150701

        datos_presupuesto_20150701

        Adicionalmente, en la página de Información Presupuestaria, los archivos que hasta el 2014 se publicaban en formato de planilla de cálculo, ahora han pasado a estar publicados en pdf, dificultando así cualquier análisis que uno quiera hacer, u obligando a convertirlos, con los problemas que implica cuando se tratan de datos en esquemas de tablas.

        Todo sigue igual. O peor. Pero manteniendo el relato.

        Domingo 17 de mayo de 2015

        25 años de Internet en Argentina

        patchcord_keyboardHoy es el día en que se conmemora el “día de Internet”. En realidad, el Día Mundial de las Telecomunicaciones y de la Sociedad de la Información, pero a veces es bueno simplificar un poco 😉 .

        Este festejo surge de una propuesta de la Cumbre Mundial sobre la Sociedad de la Información, que pidió a la Asamblea General de las Naciones Unidas instituir el 17 de mayo como Día Mundial de la Sociedad de la Información, lo cual resultó decidido en forma afirmativa. Luego, la ITU (International Telecommunication Union) decide unificarlo con su Día de las Telecomunicaciones, dado que en esta fecha, y de eso también hoy se festejan los 150 años, se fundaba dicha unión.

        Pero, lo que es la casualidad, resultó que un día 17 de mayo de 1990, en la ciudad de Buenos Aires y de la mano de Jorge Amodio, Argentina ponía en marcha su primer enlace a Internet.

        Como fue que esto sucedió pueden leerlo en el blog del propio Amodio, haciendo click aquí.

        También destaco este documento histórico: el e-mail en el cual se informa al administrador en USA que el enlace estaba funcionando.

        >From pete Thu May 17 19:55:20 1990
        >Subject: Line up ….
        >To: atina!umd5.umd.edu!rcoltun (Rob Coltun)
        >Date: Thu, 17 May 90 19:55:20 GMT-3:00
        >
        > Hi Rob,
        >
        > glad to contact you again, and very glad now because I’m
        >looking the Cisco console showing “line up” over our link.
        >
        > I sent to Glenn the formal Internet Number and Autonomus
        >System registration.
        >
        > Can you help me with the configuration of the Cisco router,
        >I believe that we are able to do real networking tests ( your words
        >sometime ago ) …
        >
        > I’ll wait your response,
        >
        > Best regards,
        > Jorge.

        Por esto es que quiero enviar mi saludo y las felicitaciones a quienes fueron los pioneros de Internet en Argentina, los que tras 25 años nos han dejado un legado de posibilidades extrarordinarias.

        Gracias colegas!!!

        Martes 30 de septiembre de 2014

        Sergio A. Alonso

        Sergio A. Alonso
        Bunker Blog

        El Mundo Según JuanCPovE: Día de la Tierra, ese pequeño punto azul pálido en...

        El Mundo Según JuanCPovE: Día de la Tierra, ese pequeño punto azul pálido en...: Siempre en este día cito a Carl Sagan y su obra "Pale Blue Dot". Una buena razón para reflexionar y cambiar de una buena vez nue...

        Jueves 04 de octubre de 2012

        LugSaJu: La tecla que te salva del DESASTRE

        Jueves 05 de abril de 2012

        Soft-Libre: GNOME 3.4 disponible con interesantes novedades
        Soft-Libre: Wallpapers para Ubuntu 12.04 LTS
        Soft-Libre: LibreOffice adquiere capacidad colaborativa en la nube + LibreOffice 3.5.2

        Domingo 26 de febrero de 2012

        Luciano Bello

        Luciano Bello
        Luciano's webpage

        Lessons Learned: Fettisdagen y Semla

        Fettisdagen, (martes de carnaval). Fet es grasa, mientras tisdag es martes. El sufijo en es el artículo determinado. Por lo tanto, el martes graso

        Semla, Comida. Etimológicamente, viene de semilla. También llamado fastlagsbulle, es una berlinesa (bola de fraile, que le dicen) con crema y pasta de almendras en su interior.

        SemlaFlickr
        En el post sobre Lucía ya hemos hablado sobre lo sorprendentemente apegado que son los suecos a ciertas fiestas de origen religioso, incluso cuando solo el 23% de ellos dice cree en algo llamado dios (ya no decir "ser cristiano"). Este parece ser un nuevo caso de lo mismo.

        En Argentina, así como en muchos (por no decir todos) países de América existe el carnaval. En otras palabras, festejar y comer antes de los 40 día de ayuno y penitencia por la Cuaresma que comienza el día siguiente, es decir, el Miércoles de Ceniza.

        Acá, y en otros países nórdicos, no parece haber carnaval. Lo que sí hay es Fettisdagen. Éste podría ser un martes de lo más común, si no fuese porque se consumen enormes cantidades de semla.

        Casualmente, ese martes me tocó ser el anfitrión del PhD fika (cuando los estudiantes de doctorado nos juntamos a tomar café y conversar), por lo me subí a la tradición y los invité con semla de distintos sabores. El sabor está dado por la crema, que puede ser común, de vainilla, con canela y otras variantes.

        Los semlor (plural de semla) es algo tan popular en la cultura sueca que un detective de cuentos para chicos llamado Ture Sventon es adicto a estos (y también vuela en una alfombra mágica, pero no viene al caso).

        Y este podría no ser único caso sueco de adición a semla. En el siglo XVII, rey Adolfo Federico habría muerto (literalmente) de un atracón después de clavarse 14 porciones de semla (tradicionalmente servidos con un tazón de leche caliente) como postre.

        La receta, aquí.

        Domingo 15 de enero de 2012

        Luciano Bello

        Luciano Bello
        Luciano's webpage

        Corriendo Debian en un server fanless

        Debido a una reciente mudanza, he bajado unos servers que tenía corriendo en casa de mis padres. Sin embargo, en mi nuevo hogar estoy en proceso de generar una nueva DMZ, esta vez, sin ventiladores.

        El primer paso de este proceso ocurrió en forma de weekend project y consiste en hacerme de un "servidor". Las comillas hacen referencia a que no se trata de un gran server sino un procesador ARM de 200Mhz y 32MB de RAM, lo que es suficiente para que corra Debian y algunos otros servicios que pueden ser interesantes.

        Los ingredientes

        • Un all-in-one LAN server que es la forma en que DealExtreme llama a unos dispositivos con chips de la familia str8132. Dado que vamos a instalar snake-os en ellos (en este caso se trata de la versión 1.3.2-20111019), es importante chequear la lista de compatibilidad. En particular me hice de un NS-K330 por 40 dólares.
        • Storage USB, puede ser en la forma de stick o como disco portable.
        • Un RS232 to TTL level converter, también conocido como cable para Nokia N1200/1208/1650/2630/2670. Es para conectarse por serie a la consola. No lo necesitamos ahora mismo, pero está bueno tenerlo a mano en caso de brickearlo, aunque es un procedimiento que no explicaré esta vez.

        Instalación de Snake-OS

        Es realmente sencillo. Lo primero es bajar snake-os, desde la sección de downloads de la web. Es importante que el archivo sea de la forma snakeos-<versión>-from-original.zip Instalar el que dice from-snake lleva definitivamente al brickearlo y recuperarlo puede ser complejo.
        Desde la página de administración del dispositivo hay que subir el archivo snakeos-<versión>-from-original.bin contenido en el zip bajado. Confirmar el md5sum no está de más.

        Acceso inicial

        Los datos para acceder a la nueva interfaz con el browser:

        http://192.168.0.240 (si es que no hay un DHCP en la red)
        usuario: admin
        contraseña: snake

        Por SSH la contraseña de root la misma y, al cambiarla por la página de administración, se cambia en todos los accesos.

        Post instalación

        Incluso cuando Max opine que el uso de memoria virtual está rumbo a la extinción (lo cierto es que tal vez no es la mejor idea cuando el storage es de estado sólido como en los pendrives), activé el uso de SWAP desde el menú Service-Swapfile.

        Si se quieren las mismas prestaciones que se tenían con el firmware original, hay que instalar unos paquetes adicionales. El sistema de paquetes que utiliza snake-os es opkg y tiene que ser primero activado desde Service-Opkg. Los paquetes pueden bajarse desde la página de download de snake-os y se instalan desde System-Packages. En particular, pueden ser interesantes (siempre pensando en los features originales):
        Transmission: Es un cliente de BitTorrent, para dejar tus descargas corriendo. Es bastante mejor que el original.
        miniDLNA: Es el server de streaming compatible con DLNA/UPnP-AV. Está un poco verde, pero se está trabajando en su mejora.

        Corriendo Debian dentro

        Las instrucciones están acá. Aunque esto es lo más obvio y necesario:

        wget http://snake-os.googlecode.com/files/debian_chroot.tgz
        tar -xvf debian_chroot.tgz
        mount -o bind /proc /usb/sda1/debian/proc
        mount -o bind /dev /usb/sda1/debian/dev
        chroot /usb/sda1/debian/

        Esta instalación base requiere unos 200MB. Tiene todo el potencial de un Debian (¡porque lo es!).
        Claro que falta ajustar varios detalles, pero será la piedra inicial para el resto.

        Lunes 12 de diciembre de 2011

        Luciano Bello

        Luciano Bello
        Luciano's webpage

        Lessons Learned: Lucia

        Lucia, fiesta (13 de diciembre). Tradicional fiesta sueca asociada a Santa Lucía de Siracusa, el solsticio y las velas.

        Según el santoral católico, el 13 de Diciembre (o sea, en un par de horas) es el día dedicado a Santa Lucía. Dato que seguramente pasa totalmente desapercibido para la gran mayoría de la personas del mundo. A menos claro, que se sea habitante de Suecia (o de Sicilia, pero no viene al caso).

        El día de Santa Lucía, o simplemente Lucia como prefieren llamarlo acá, es de la fiestas más importantes de la cultura sueca. Y, como extranjero, me es sumamente difícil de entender como en un país tan poco religioso algo así tiene cabida. Así que analicemos los hechos.

        La santa en cuestión: Durante el siglo III y principios del IV vivió en Siracusa (una ciudad de Sicilia, Italia) una joven católica de familia potentada llamada Lucía, quien tenía intensiones de consagrarse a Dios. Pero un despechado pretendiente la denunció a la autoridades (eran tiempos de persecución a los católicos) y fue enjuiciada y sentenciada a muerte. La tradición cuenta que se ordenó torturarla arrancándole los ojos y que aún así siguió viendo por milagro divino (sí, lo que tiene en la bandeja de la estampita son un par de ojos). Más datos sobre su vida en la Wikipedia y referencias.
        Es, obviamente, patrona de los ciegos. También, aunque bastante menos evidentemente, de los electricistas, choferes, afiladores y cristaleros. Tal vez en este último caso exista alguna relación con el tradicional arte de soplar vidrio que existe en Suecia.

        Su asociación con la luz: El nombre Lucía, hace clara referencia al latín, Lux. La leyenda de los ojos también parecen referir a la luz (o a la falta de ésta). Aunque no pude encontrar referencias, algunas personas me comentan que Santa Lucía fue condenada a la hoguera y que el fuego no la consumía. Y que por esto hay velas durante la celebración. Aún más simpático es que parece ser que, por errores acumulados durante la Edad Media en el calendario Juliano, la festividad de Lucía coincidía con el día más corto del año, el solsticio de invierno.

        Conociendo lo odioso que puede ser la oscuridad en estos lares y lo fanático de las velitas y de los artefactos lumínicos que son lo locales, no parece ser tan loco que quieran festejar que los días empiezan a alargarse (aunque esto no ocurrirá hasta dentro de poco más de una semana).

        Las velas también pueden hacer referencia a una leyenda pre-cristina en que la noche más larga del año lo animales nocturnos adquirían poderes sobrenaturales (incluso podían hablar) y había que mantenerlos alejados con fuego.

        Luciatåg: Significa procesión de Lucia. Es el acto por excelencia y se celebra totalmente independiente de la fiesta religiosa. Se realiza en escuelas (especialmente en las guarderías) y en ámbitos públicos en donde una mujer representa a Lucia llevado "la luz" con una corona de velas (electrónicas en muchos casos, matando cierta divertida tensión macabra). La vestimenta es una túnica blanca ceñida por una faja roja, representando el martirio. Las tärnor (literalmente, golondrinas, aunque también puede ser las damas de honor o doncellas) acompañan a Lucia llevando velas en las manos y cantando canciones tradicionales. Hay más personajes, pero quedarán para otro post.

        Entre las muchas tradiciones gastronómicas asociadas a esta época del año, hay una que hace referencia directa a Lucia: los lussekatter. Son como unas facturas dulces de azafrán y que representan ojos. La palabra lussekatt se traduce como gatos de Lucia y se suele acompañar con Glögg, una especie de glühwein local.

        Para terminar, durante esta fecha se elige en Estocolmo la Sveriges Lucia. Es una especie de concurso por representar a Lucia a nivel nacional en donde cada ciudad propone su candidata. Las participantes representan a una entidad de beneficencia y tengo entendido que se valoran las cualidades para canto y la personalidad con entrevistas que son televisadas. Se puede votar por tu Lucia favorita a través de SMS, aunque creo que la votación para este año ya está cerrada. ¿Que qué se lleva la ganadora? No tengo idea...

        Pero acá les dejo las candidatas finalistas de este año:

        Lunes 07 de noviembre de 2011

        Punto Libre: サイトマップ

        Viernes 01 de abril de 2011

        Tecnoscopio: Clon de Counter-Strike Gratis en tu navegador

        Miércoles 30 de marzo de 2011

        Tecnoscopio: Gestor de Descargas para Megaupload Depositefiles y otros

        Lunes 28 de marzo de 2011

        Tecnoscopio: Generación de electricidad con peatones y tránsito de autos

        Miércoles 09 de marzo de 2011

        Punto Libre: デートを成功させる