Weblogs Código

Adrianistán

Estadística en Python: ajustar datos a una distribución (parte VII)

enero 17, 2018 10:20

Ya hemos visto con anterioridad que existen modelos que nos hacen la vida más sencilla. Sin embargo, en esos modelos conocíamos ciertos datos de antemano. ¿Qué pasa si tenemos datos y queremos ver si podemos estar ante un modelo de los ya definidos?

Este tipo de ajuste es muy interesante, ya que nos permite saber si los datos en bruto pueden parecerse a los modelos de Normal u otros y aprovecharlo.

Ajuste de datos a una distribución

Para ajustar datos a una distribución, todas las distribuciones continuas de SciPy cuentan con la función fit. Fit nos devuelve los parámetros con los que ajusta nuestros datos al modelo. ¡Ojo, no nos avisa si es un buen ajuste o no!

Ejemplo: Queremos saber si la altura de los hombres adultos del pueblo de Garray sigue una distribución normal. Para ello tomamos una muestra de 80 alturas de hombres adultos en Garray.
Los datos los tenemos en este CSV, cada altura en una línea:
Altura
180.55743416791302
159.4830930711535
175.54566032406794
149.06378740901533
140.35494067172635
146.65963134242543
171.34024710764376
140.11601629465872
175.6026441151595
158.00860559393507
122.53612034588375
116.10055909040616
152.89225061770068
148.31372767763455
111.17487190927599
160.18952563680827
151.8729737480722
141.50350042949614
165.2379297612276
150.75979657877465
171.5257501059296
157.97922034080895
159.60144363114716
152.52036681430164
172.0678524550487
163.65457704485283
134.9562174388093
189.70206097599245
153.78203142905076
176.1787894042539
190.83025195589502
199.04182673196726
146.97803776211907
174.22118528139467
170.95045320552694
161.2797407784266
190.61061242859464
168.79257731811308
159.87099716863165
136.22823975268153
166.87622973701335
179.58044852016417
172.49583957582817
165.2662334997042
136.6663345224381
161.9352364324168
174.56164027542448
161.62817356012405
167.65579546297906
170.88930983697742
147.22062198310996
151.85737964663497
158.03323614736198
135.77570282853696
161.25435141827515
193.33084953437478
155.43189514766172
155.89204074847055
179.23931091736836
146.485962651657
166.61617663518228
161.70927578953211
164.89798613982495
139.18195138901498
180.30341647946335
162.4811239647979
171.1035005376699
147.01137545913147
187.03282087175134
172.2476631392949
152.9814634955974
174.43159049461713
174.83877117002814
132.66857703218636
173.98029972846837
133.5435543737402
169.62941676289472
166.4887567852903
138.1150540623029
170.52532661450618

Vamos a ajustarlo.
import pandas as pd
import scipy.stats as ss

df = pd.read_csv("alturas.csv")

media, desviacion = ss.norm.fit(df["Altura"])

print(media) # media = 160,37
print(desviacion) # desviacion = 17,41

En este caso nos informa de que estos datos parecen encajar con los de una distribución normal de media 160,37 y desviación típica 17,41.

¿Cómo de bueno es el ajuste? Kolmogorov

Hemos hecho un ajuste, pero no sabemos qué tan bueno es. Existen varios métodos para poner a prueba los ajustes. Existen varios métodos, siendo los más populares Chi-Cuadrado y Kolmogorov-Smirnov.

Chi-Cuadrado no se puede aplicar directamente sobre distribuciones continuas, aún así voy a explicar como se haría. Sin embargo, primero vamos a probar con Kolmogorov-Smirnov, que en SciPy es ktest.

import pandas as pd
import scipy.stats as ss

df = pd.read_csv("altura.csv")
media, desviacion = ss.norm.fit(df["Altura"])
d, pvalor = ss.ktest(df["Altura"],"norm",args=(media,desviacion))
# o alternativamente
d, pvalor = ss.ktest(df["Altura"],lambda x: ss.norm.cdf(x,media,desviacion))

Este test nos devuelve dos valores: D y el p-valor. Yo voy a fijarme en el p-valor. El p-valor es el nivel mínimo de significación para el cual rechazaremos el ajuste. Cuanto más cerca del 1 esté, más confianza hay en el ajuste, cuanto más cerca de cero esté, menos confianza hay en el ajuste. ¿Pero cómo se interpreta exactamente?

Una forma sencillo de entenderlo es hacer obtener el nivel de significación, que es 1 – NivelConfianza/100. Así para una confianza del 95%, este será de 0.05, para una confianza del 99%, el valor se reduce a 0.01. Si el p-valor es inferior a este nivel de significación, el ajuste probablemente no es correcto.

import pandas as pd
import scipy.stats as ss

df = pd.read_csv("altura.csv")
media, desviacion = ss.norm.fit(df["Altura"])
d, pvalor = ss.ktest(df["Altura"],"norm",args=(media,desviacion))

# queremos confianza al 99%
if pvalor < 0.01:
    print("No se ajusta a una normal")
else:
    print("Se puede ajustar a una normal")

Aquí algún estadístico más serio se tiraría de los pelos, porque en realidad lo único que se puede demostrar con seguridad es en el caso de que no se ajuste. Si salta que se puede ajustar a una normal, simplemente querría decir que no se puede rechazar la hipótesis de partida (que sea normal), pero no confirma que sea normal.

Esto es algo común en el contraste de hipótesis y con los p-valores en particular y ha suscitado crítica, hasta tal punto que en 2016, la American Statistical Association publicó una serie de consejos para tratar con p-valores. El p-valor en este caso solo puede demostrar que no se ajusta a una normal. No obstante, para ir poco a poco, podemos simplificar esto un poco.

Chi-Cuadrado

Para hacer el test de Chi-Cuadrado primero hay que dividir los datos continuos. Para uso podemos usar la función de NumPy, histogram o la de SciPy binned_statistic. Tenemos que construir una lista con las frecuencias esperadas si siguiéramos al 100% la distribución a la que queremos ajustarnos.

def test_chicuadrado(data,N):
    n = data.count()
    freqs, edges, _ = ss.binned_statistic(data,data,statistic="count")
    def ei(i):
        return n*(N.cdf(edges[i])- N.cdf(edges[i-1]))
    expected = [ei(i) for i in range(1,len(edges))]
    return ss.chisquare(freqs,expected)

Una vez tengamos una lista con los valores esperados, simplemente podemos comparar las frecuencias reales con las esperadas con chisquare. Esto nos devolverá C y el p-valor. El significado del p-valor es exactamente igual.

Con esto ya hemos visto como empezar con estadística en Python. No sé si haré más artículos de este estilo, si no es así, espero que os hayan gustado esta serie de artículos. El mundo del data science es inmenso y os invito a seguirlo explorando.

La entrada Estadística en Python: ajustar datos a una distribución (parte VII) aparece primero en Blog - Adrianistan.eu.

» Leer más, comentarios, etc...

Variable not found

¿Se pueden desarrollar aplicaciones ASP.NET Core con Visual Basic .NET?

enero 16, 2018 03:01

ASP.NET CoreYa, sé que puede parecer una pregunta extraña a estas alturas, pero el caso es que un alumno del curso de ASP.NET Core en CampusMVP me la envió hace unos días y me ha parecido interesante comentar el asunto por aquí, por si puede interesar a alguien más.

Aunque a muchos nos pueda parecer raro, aún hay bastantes empresas y desarrolladores trabajando en Visual Basic .NET. En ocasiones sólo es para mantener código antiguo, pero otras veces (más de lo que puede parecer) incluso para crear nuevos sistemas aprovechando la experiencia de los desarrolladores y bases de código existente.
Si estáis en esta situación y vais a comenzar a trabajar con ASP.NET Core, mi recomendación siempre es que aprovechéis el momento de cambios para dar el salto a C#. Spoiler: no os arrepentiréis ;)
Bien, respecto a la pregunta motivo del post, en teoría debería poderse, y de hecho ya difundimos por aquí hace tiempo la noticia oficial de que sería soportado, pero la verdad es que desde entonces no he vuelto a oir hablar mucho del tema, ni he visto ejemplos, ni movimiento en la comunidad ni nada parecido, lo cual me hizo dudar de la situación actual de este tema.

En este post vamos a hacer un tour rápido para ver, en la práctica, cómo está el soporte para VB.NET en la versión actual de ASP.NET Core (2.0).

Creación de proyectos ASP.NET Core en Visual Basic .NET

Bien, en este punto nos encontramos con un primer escollo: no existen plantillas para la creación de este tipo de proyectos en Visual Studio, y tampoco en .NET Core CLI, como podemos ver en la ayuda del comando dotnet new:
C:\Users\josem>dotnet new
Uso: new [opciones]

Opciones:
-h, --help Muestra ayuda para este comando.
-l, --list Muestra las plantillas que contienen el nombre especificado. Si no se especifica ningún nombre, muestra todas las plantillas.
-n, --name Nombre de la salida que se va a crear. Si no se especifica ningún nombre, se usa el nombre del directorio actual.
-o, --output Ubicación donde debe ponerse la salida generada.
-i, --install Instala un origen o un paquete de plantillas.
-u, --uninstall Desinstala un origen o un paquete de plantillas.
--type Filtra las plantillas por los tipos disponibles. Los valores predefinidos son "other", "project" o "item".
--force Fuerza la generación de contenido aunque se produzcan cambios en los archivos actuales.
-lang, --language Especifica el idioma de la plantilla que debe crearse.


Plantillas Nombre corto Idioma Etiquetas
---------------------------------------------------------------------------------------------------------
Console Application console [C#], F#, VB Common/Console
Class library classlib [C#], F#, VB Common/Library
Unit Test Project mstest [C#], F#, VB Test/MSTest
xUnit Test Project xunit [C#], F#, VB Test/xUnit
ASP.NET Core Empty web [C#], F# Web/Empty
ASP.NET Core Web App (Model-View-Controller) mvc [C#], F# Web/MVC
ASP.NET Core Web App razor [C#] Web/MVC/Razor Pages
ASP.NET Core with Angular angular [C#] Web/MVC/SPA
ASP.NET Core with React.js react [C#] Web/MVC/SPA
ASP.NET Core with React.js and Redux reactredux [C#] Web/MVC/SPA
ASP.NET Core Web API webapi [C#], F# Web/WebAPI
global.json file globaljson Config
NuGet Config nugetconfig Config
Web Config webconfig Config
Solution File sln Solution
Razor Page page Web/ASP.NET
MVC ViewImports viewimports Web/ASP.NET
MVC ViewStart viewstart Web/ASP.NET

Examples:
dotnet new mvc --auth Individual
dotnet new angular
dotnet new --help

C:\Users\josem>_
Tampoco hay referencias a plantillas de este tipo en el repositorio oficial el sitio dotnet templates, por lo que supongo que estamos en una vía muerta. Habrá que probar con otras alternativas.

¿Quién dijo que necesitábamos plantillas?

Hemos de recordar que una aplicación ASP.NET Core es simplemente una aplicación de consola venida a más ;) Debido a ello, es completamente posible crear una simple aplicación de consola .NET Core e instalarle los paquetes relativos al framework ASP.NET Core que, como sabemos, en la versión 2.0 están resumidos en el metapaquete Microsoft.AspNetCore.All (puedes leer más sobre este paquete especial en este gran post del amigo Eduard Tomás).

Por tanto, podemos comenzar a trabajar si creamos una simple aplicación de consola para .NET Core, ya sea desde Visual Studio (este tipo de proyectos sí dispone de plantilla) o desde línea de comandos. Una vez creada, añadiremos la referencia al citado metapaquete, por ejemplo editando el archivo .vbproj:
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>netcoreapp2.0</TargetFramework>
</PropertyGroup>

<ItemGroup>
<PackageReference Include="Microsoft.AspNetCore.All" Version="2.0.5" /
</ItemGroup>

</Project>
Con esto ya tenemos la infraestructura necesaria, pero aún nos queda algo de tarea por delante. Lo primero, recordad que para ejecutar una aplicación ASP.NET Core necesitamos crear un servidor y echarlo a andar, algo que tradicionalmente implementamos en el archivo Program.cs de nuestro proyecto. El equivalente en VB.NET sería implementar el siguiente código en la clase Program:
Module Program
Sub Main(args As String())
BuildWebHost(args).Run()
End Sub

Function BuildWebHost(args As String()) As IWebHost
Return WebHost.CreateDefaultBuilder(args).UseStartup(Of Startup)().Build()
End Function
End Module
También necesitamos crear una clase Startup para implementar los métodos de configuración de servicios y el pipeline de nuestra aplicación. Comencemos por algo sencillo como lo siguiente:
Public Class Startup
Sub Configure(app as IApplicationBuilder)
app.UseWelcomePage()
End Sub
End Class
En este momento, si ejecutamos la aplicación y accedemos con el navegador a la dirección localhost:5000, veremos que, como no podría ser de otra forma, ¡nuestra aplicación ASP.NET Core creada con Visual Basic .NET funciona!

Welcome page

Incluso, aunque de forma un pelín incómoda para los que estamos acostumbrados a la concisión de C#, podemos codificar middlewares para procesar peticiones, por lo que ya tendríamos todo lo necesario para crear aplicaciones ASP.NET Core:
Sub Configure(app as IApplicationBuilder)
app.Run(Async Function(context)
Await context.Response.WriteAsync("Hello, world!")
End Function)
End Sub
Por tanto, en este punto podríamos asegurar que, a pesar de que el tooling no nos ayuda especialmente, usando Visual Basic .NET podemos desarrollar aplicaciones ASP.NET Core.

Subimos la apuesta: ¿podemos usar ASP.NET Core MVC con VB.NET?

Para comprobarlo, obviamente lo primero que tendríamos que hacer es configurar apropiadamente los servicios y el pipeline de la aplicación. Un par de líneas en la clase de configuración y listo:
Public Class Startup
Sub ConfigureServices(services as IServiceCollection)
Services.AddMvc()
End Sub

Sub Configure(app as IApplicationBuilder)
app.UseMvcWithDefaultRoute()
End Sub
End Class
Creemos también un controlador para comprobar el funcionamiento del framework MVC:
Public Class HomeController
Inherits Controller
public Function Index() as IActionResult
Return Content("Hello from Visual Basic .NET!")
End Function

End Class
Y por supuesto, todo funcionará como esperamos. Si ejecutamos la aplicación y accedemos a localhost:5000, podremos ver el correspondiente mensaje de saludo:



Entonces, ¿podríamos usar cualquier herramienta del framework MVC, como el rutado por atributos, o el retorno de resultados más complejo, por ejemplo un objeto serializado en formato JSON? Por supuesto:
Public Class HomeController
Inherits Controller

<Route("test")>
Public Function Test() As IActionResult
Return Json(New With {.Name = "John Smith", .Age = 34})
End Function

End Class

JSON object

A tenor de los resultados obtenidos, podríamos concluir que es totalmente posible configurar y poner a funcionar una aplicación con el framework MVC desde un proyecto Visual Basic .NET.

Pero, ah, no podía ser tan sencillo…

¿Y se pueden crear Razor usando Visual Basic .NET?

Pues aquí es donde nos vamos a encontrar los problemas de verdad. Podemos hacer una prueba rápida como la siguiente:
Public Class HomeController
Inherits Controller
Public Function Index() As IActionResult
Return View()
End Function
End Class
Ahora introducimos en la carpeta /Views/Home un archivo Index.vbhtml (recordad que el “vb” en la extensión indica que se trata de sintaxis Razor con Visual Basic .NET):
<!DOCTYPE html>
@{
Dim title = "Hello from VB.NET!"
}

<html>
<head>
<title>@title</title>
</head>
<body>
<div>
<h1>@title</h1>
</div>
</body>
</html>
Si ejecutamos la aplicación y nos dirigimos al raíz del sitio web, veremos que retorna un error 500 y encontraremos la siguiente información en el log:
System.InvalidOperationException: The view 'Index' was not found. The following locations were searched:
/Views/Home/Index.cshtml
/Views/Shared/Index.cshtml
El motivo de este error es que, por defecto, el motor de vistas Razor ni siquiera incluye en sus rutas de búsqueda las vistas con extensión .cshtml. Podríamos pensar que sería sólo cuestión de retocar las rutas de búsqueda del view engine, pero si lo hacemos veremos que el tema es bastante más profundo: en la actualidad, Razor no soporta el lenguaje VB.NET; y, lo que es peor, no parece que vaya a hacerlo a corto plazo.

Y para mayor desconsuelo, si en un proyecto Visual Basic .NET intentamos introducir una vista .cshtml (Razor con C#) tampoco funcionará. Es decir, no podemos tener esta mezcla de lenguajes en el mismo proyecto.

Entonces, ¿No se puede? ¿No quedamos en que VB iba a ser soportado?

Buceando un poco por GitHub podemos encontrar un issue bastante reciente donde se discute sobre el tema y se muestra el siguiente timeline de la información que ha sido difundida al respecto por parte de miembros del equipo del proyecto:
  • Diciembre 2014: “Tenemos planeado tener puntos de extensibilidad para que otros lenguajes como VB o F# puedan ser añadidos en forma de paquete (…)”
  • Abril 2015: “¡Buenas noticias! ¡Hemos anunciado planes para añadir soporte para VB en ASP.NET 5/DNX!”.
  • Noviembre 2016: El soporte para VB en ASP.NET Core desaparece del roadmap oficial.
  • Diciembre 2017: “No hay planes para añadir a ASP.NET Core plantillas para VB”
O sea, que parece que los planes para VB se han quedado en meras buenas intenciones ;) Citando textualmente un comentario de Ryan Nowak, miembro del equipo ASP.NET Core de Microsoft:
“It unfortunately would be incredibly, incredibly expensive for us to add good support for using Razor in a VB project to tooling. The project system in VS for Razor intellisense is based on the idea that we can piggyback on your app’s C# project for intellisense, references, and other settings”  
“(…) For these reasons we have no plans to support Razor in VB projects. Our recommendation is factor your code into a C# app and VB class library. This way if you prefer VB you can write basically everything except Program.Main in VB (including startup, controllers, and models).”

En conclusión

En estos momentos el soporte completo para Visual Basic .NET está encallado, y esta situación no parece que vaya a cambiar de momento. Como hemos visto en este post, técnicamente es posible crear aplicaciones ASP.NET Core e incluso implementar alguno de sus componentes utilizando VB.NET, lo que abriría las puertas a su utilización en el desarrollo de servicios. Es decir, a priori no parece que haya inconveniente en usar este lenguaje si nuestro sistema lo único que hace es responder peticiones de tipo Ajax a un frontend o a otras aplicaciones remotas.

Sin embargo, si intentamos utilizar Visual Basic para implementar soluciones completas, al llegar a las vistas nos toparemos con un muro infranqueable, por lo que la recomendación oficial en este caso es crear un proyecto C# para esta parte y mover el resto, que hemos visto que funciona, a una biblioteca de clases VB :(
Podéis ver un ejemplo de este “mix” en el siguiente repositorio de GitHub.
Por tanto, como os adelanté al principio de este post, si programáis con Visual Basic y estáis en el momento de comenzar un proyecto ASP.NET Core, ni lo penséis: aprovechad la ocasión para saltar a C# :)

Lecturas relacionadas:

Publicado en Variable not found.

» Leer más, comentarios, etc...

Poesía Binaria

Cómo generar ruido de diferentes colores en GNU/Linux

enero 15, 2018 05:45


Los científicos siempre inventan formas curiosas de clasificar los fenómenos (físicos en este caso). Y es que, donde los seres humanos normales escuchan un sonido sin sentido, muchos científicos ven estadística. ¿Y qué tiene que ver eso con los colores?

Explicación física muy rápida de 0 a 100 en 400 palabras

No quiero extenderme mucho, y seguro que en mi explicación faltarán cosas y algunos conceptos serán inexactos. Más que nada porque en Wikipedia podéis encontrar muchísima información sobre el tema. Y si sabes lo que es una onda, su frecuencia, un espectro, un ruido y un color, te puedes saltar este apartado rápidamente.

Básicamente el sonido es una onda. Estas ondas son perturbaciones físicas que se propagan en una dirección determinada. Dichas perturbaciones pueden ser muy complejas, pero por sus características podemos descomponerlas en ondas simples. Una onda simple puede ser un tono, es una oscilación a un ritmo constante, subiendo y bajando, suavemente. Ésta tiene una frecuencia determinada; dicha frecuencia es el número de veces por segundo que la perturbación tiene una amplitud determinada.

Podemos observar cómo la misma nota musical producida por varios instrumentos diferentes (una característica de una nota musical es precisamente la frecuencia principal de la onda que produce el instrumento) tiene un sonido diferente y es que las propiedades del instrumento hacen que no sólo se produzca la frecuencia básica de la nota, sino muchas otras frecuencias que le dan cuerpo a dicho sonido y lo hacen más complejo.

Pero volviendo al tema del post, ¿qué es el ruido? El ruido, en lo que se refiere al sonido puede ser un sonido molesto, aunque no siempre será molesto. Lo podemos considerar como una señal sin sentido, que no está transmitiendo información o que interfiere con información de otra fuente de audio. Por ejemplo, cuando intentamos escuchar una conversación y de repente un vecino se pone a hacer agujeros con un taladro, eso es ruido. Pero los físicos, no tardaron mucho en darse cuenta de que hay muchos tipos de ruido. Vamos, si lo que queremos hacer con un ruido es interferir y dificultar la escucha de otros sonidos, lo mejor es que el ruido sea un sonido compuesto por la mayor cantidad de frecuencias audibles. Y dado que el oído humano se considera entre los 20Hz y los 20KHz, digo se considera, porque pocos son capaces de escuchar dichas frecuencias, las frecuencias del espectro sonoro estarán comprendidas entre esos dos valores. En este caso, un sonido inferior a los 20Hz será un infrasonido y si es superior a los 20KHz será un ultrasonido.
Descomposición de la luz blanca en todos los colores del espectro
Por otro lado, la luz tiene propiedades de onda electromagnética, con su frecuencia, y amplitud, y claro, existe lo llamado luz visible. Dicho espectro comprende el rango de frecuencias que son visibles por el ojo humano, que va desde los 3,84×1014Hz (384THz) a los 7,89×10^14 Hz (789THz), sí, ¡teraherzios! Aunque para definir la luz se suele utilizar más la longitud de onda: desde 7,8×10^−7 m a 3,8×10^-7 m. Las frecuencias más bajas corresponden con el rojo y las más altas con el violeta, por eso, frecuencias inferiores en dicho rango serán infrarrojos y frecuencias superiores serán ultravioletas. Y los valores de frecuencia intermedios darán lugar a todos los colores que podemos ver. Incluso se pueden mezclar, por ejemplo, el blanco es una onda compleja que vibra en varias frecuencias del espectro visible.

Mezclando las cosas

Después de una explicación muy rápida e inexacta. Tenemos que saber que una de las formas de caracterizar un sonido es su gráfica de densidad espectral de potencia (DEP o PSD Power Spectral Density). Es decir, representamos gráficamente la potencia con la que suena cada frecuencia. Y en muchos casos, si hiciéramos lo mismo con la luz, te saldría el color al que hace referencia.

El post se centrará en la generación de estos sonidos desde GNU/Linux, y utilizando software libre. Muchas veces los algoritmos pueden ser muy complicados, aunque estos sonidos podemos generarlos en tiempo real sin problema.

Usos del ruido

El ruido, se suele utilizar para calibrar aparatos de audio, sintetizar voz o instrumentos, generar números aleatorios, camuflar sonidos, relajación o una ayuda para conciliar el sueño, incluso, en mi caso personal, enmascarar tinnitus o acúfenos. Este fenómeno, hace que muchos escuchemos sonidos que en realidad no están y que se producen en alguna parte de nuestro circuito acústico. Puede deberse a un taponamiento de conductos, o tensión muscular, otros problemas del oído medio, problemas en la cóclea (también llamada caracol) o incluso en la interpretación que hace nuestro cerebro de los datos recibidos en el oído. El resultado es escuchar golpeteos, grillos, tonos, motores, etc que en realidad no están sonando y nadie más escucha, en algunos momentos del día (o durante las 24h).

Aunque existen medicamentos, en muchos casos no funcionan, porque en realidad es muy difícil detectar qué parte del circuito falla y por qué. Por lo que hay tratamientos de fisioterapia, se usan relajantes musculares, vitaminas y gran variedad de fármacos de diferente índole. Además de esto existen terapias de habituación, terapias sonoras y muchas más cosas. Y con respecto a las terapias sonoras una de las cosas que merece la pena probar es escuchar diferentes tipos de ruido. El objetivo de este ruido por un lado es tapar o enmascarar el sonido que se escucha y por otro lado, alejar la atención de él.

La clave en muchos casos es no prestarle atención, por lo que, incluso escuchando diferentes tipos de ruido puede que sigamos escuchando el acúfeno si nos empeñamos. Pero algunos tipos de ruido tienen mejor resultado que otros, así que es interesante darles una oportunidad, respirar hondo y aguantar aunque sea una hora escuchándolo mientras estás realizando cualquier tarea.

Listos para escuchar

Aunque en Internet encontramos multitud de páginas web con sonidos para descargar. Muchas veces necesitamos retocar un poco la onda del ruido, o queremos generar elel ruido. Necesitamos un archivo con el ruido con una longitud específica, o incluso si no queremos que nuestro sistema consuma demasiados recursos. Sé que muchos, cuando necesitan este tipo de sonidos, acuden a Youtube o descargan archivos con varias horas de duración. Aunque a veces no es suficiente, necesitamos un sonido con una longitud indefinida o, como dije antes, que nuestro sistema consuma pocos recursos (a estas alturas descomprimir un mp3 no es muy pesado, y reproducir un vídeo tampoco, ¡¡pero no vamos a desaprovechar CPU a lo tonto!!).

Vamos a ver desde aquí diferentes tipos de ruido, a los que llamaremos por su color:

Ruido Blanco

O White Noise. Y con él empezó todo esto de los colores del ruido. El ruido es un sonido cuya amplitud varia con el tiempo de forma aleatoria, pero el ruido blanco intenta distribuir la potencia entre todas las frecuencias del espectro audible. Es decir, el ruido blanco tiene señal en todas las frecuencias del espectro y todas tendrán la misma potencia.
El ruido blanco puede sonar como una lluvia fuerte. Aquí tenemos un ejemplo:

Para generarlo, podemos hacerlo con muchísimos programas. Generar ruido blanco es algo muy sencillo algorítmicamente hablando, sólo tenemos que generar números aleatorios. Podemos utilizar por ejemplo:

  • aplay, cogiendo directamente de la fuente de números aleatorios del ordenador:
    aplay --channels=2 --format=S16_LE --rate=44100 --duration=3600 /dev/urandom
  • melt:
    melt noise

    O incluso podemos generar un fichero de vídeo junto con el ruido (si especificamos un formato sólo de audio se generará solamente el sonido):
    melt noise -consumer avformat:ruidoblanco.mp4 acodec=libmp3lame vcodec=libx264 ab=256K vb=5120K
  • gstreamer:
    gst-launch-1.0 audiotestsrc wave=white-noise volume=1 ! audioconvert ! queue ! autoaudiosink

    O podemos generar un archivo mp3 con el sonido:

    gst-launch-1.0 audiotestsrc wave=white-noise volume=1 num-buffers=150000 ! audioamplify amplification=2 ! queue ! audioconvert ! lamemp3enc bitrate=256  ! filesink location=whitenoise.mp3 max-bitrate=256
  • sox:
    play -n synth whitenoise

    O si queremos salvarlo en un archivo de 10 segundos de audio:
    sox -n -r 44100 whitenoise.mp3 synth 0:04 whitenoise vol 1
  • Y, por supuesto tenemos Audacity, GNURadio, Matlab/Octave y multitud de programas con y sin entorno gráfico. Existe el filtro anoisesrc para ffmpeg/avconv que por detrás usa el generador de gstreamer, por lo que muchas herramientas terminarán utilizando alguno de los programas o bibliotecas mencionados.

Ruido rosa

El ruido rosa se caracteriza en que su nivel sonoro tiene una densidad espectral inversamente proporcional a la frecuencia. Su energía decrece 3dB por octava. Como en cada octava el rango de frecuencias es el doble, la energía decrece a la mitad. Así, si miramos la energía de las componentes de frecuencia por octavas, veremos todas las octavas con la misma energía.

Se usa mucho para calibrar fuentes de audio o ver características acústicas arquitectónicas.
Podemos escuchar este ejemplo:

El ruido rosa se parece mucho al blanco, y puede sonar como cuando soplas a un micrófono con fuerza (de forma constante, con pulmones ilimitados) o como un viento fuerte.

Y por supuesto, al ser fácil de generar también, podemos utilizar algunas herramientas como estas:

  • gstreamer:
    gst-launch-1.0 audiotestsrc wave=pink-noise volume=1 ! audioconvert ! queue ! autoaudiosink

    O podemos generar un archivo mp3 con el sonido:

    gst-launch-1.0 audiotestsrc wave=pink-noise volume=1 num-buffers=150000 ! audioamplify amplification=2 ! queue ! audioconvert ! lamemp3enc bitrate=256  ! filesink location=pink.mp3 max-bitrate=256
  • sox:
    play -n synth pinknoise

    O si queremos salvarlo en un archivo de 10 segundos de audio:
    sox -n -r 44100 pinknoise.mp3 synth 0:04 pinknoise vol 1
  • Otros programas pueden ser speaker-test, el programa que utiliza alsa para probar los altavoces. Audacity también es capaz de generar ruido rosa. Y, por supuesto con octave se puede conseguir un ruido rosa de calidad.

Ruido azul

Tiene baja potencia en bajas frecuencias y su potencia va creciendo 3dB cada octava, por lo que crece de forma proporcional a la frecuencia. El sonido que se percibe es como el de una catarata, aunque hay personas que perciben el mismo sonido que una máquina de cortar césped. Aquí vemos un ejemplo:

Para generarlo, podemos utilizar gstreamer de la siguiente manera:
gstreamer:

gst-launch-1.0 audiotestsrc wave=blue-noise volume=1 ! audioconvert ! queue ! autoaudiosink

O podemos generar un archivo mp3 con el sonido:

gst-launch-1.0 audiotestsrc wave=blue-noise volume=1 num-buffers=150000 ! audioamplify amplification=2 ! queue ! audioconvert ! lamemp3enc bitrate=256  ! filesink location=bluenoise.mp3 max-bitrate=256

Ruido violeta o púrpura

Su potencia se incrementa 6dB por octava. Tiene baja potencia para frecuencias graves y más alta en los agudos. Yo lo uso principalmente para aliviar mi acúfeno y me va mejor que cualquier otro tipo de ruido. Sigue la misma lógica que el azul, pero tiene una pendiente más pronunciada en su gráfica.
Podemos utilizar como ejemplo este:

Y, por supuesto, para generarlo podemos utilizar gstreamer:

gst-launch-1.0 audiotestsrc wave=violet-noise volume=1 ! audioconvert ! queue ! autoaudiosink

O podemos generar un archivo mp3 con el sonido:

gst-launch-1.0 audiotestsrc wave=violet-noise volume=1 num-buffers=150000 ! audioamplify amplification=2 ! queue ! audioconvert ! lamemp3enc bitrate=256  ! filesink location=violetnoise.mp3 max-bitrate=256

Ruido gris

Vemos que los diferentes colores de ruido se van generando aplicando una función matemática a la señal obteniendo diferentes gráficas de densidad espectral. El ruido gris es un caso especial en el que se aplican las características psicoacústicas humanas a dicho ruido. Eso quiere decir que los humanos no escuchamos con la misma intensidad todas las frecuencias del espectro. Las que son muy agudas o muy graves, aunque las escuchamos, pero no lo hacemos con la misma intensidad que las frecuencias medias. Es más, dependiendo del individuo, algunas personas escucharán mejor unas frecuencias que otras. Así que para generar el ruido gris, debemos aplicar una corrección para que la sensación, en teoría, sea que escuchamos todas las frecuencias a la misma intensidad. Para generar este tipo de ruido, podríamos generar un ruido blanco y ecualizar la señal (por ejemplo, con Audacity).

El ruido gris puede compararse con el viento moviendo las hojas de un árbol.

Ruido marrón (o browniano)

Si atendemos al color que se vería si lo llevamos al terreno de la imagen, debería llamarse ruido rojo. Pero como lo descubrió Robert Brown y también es un color, se suele llamar ruido marrón / brown o brownian noise. Además, el color rojo se parece en cierto modo al marrón, y como hay más componentes en el espectro no sería un rojo puro… bueno, lo podemos mirar desde diferentes perspectivas. En éste, al contrario que el ruido violeta, su energía decrece 6dB por octava, por lo que las bajas frecuencias tomarán especial importancia.

Puede ser comparado con el agua del mar. De hecho, se pueden aplicar ciertos efectos que simulan el vaivén de las olas del mar. También hay quienes lo comparan con el ruido de la multitud.

Podemos ver un ejemplo aquí:

También podemos generarlo utilizando gstreamer o sox (en Audacity, por ejemplo también se puede)

  • gstreamer:
    gst-launch-1.0 audiotestsrc wave=red-noise volume=1 ! audioconvert ! queue ! autoaudiosink

    O podemos generar un archivo mp3 con el sonido:

    gst-launch-1.0 audiotestsrc wave=red-noise volume=1 num-buffers=150000 ! audioamplify amplification=2 ! queue ! audioconvert ! lamemp3enc bitrate=256  ! filesink location=brownnoise.mp3 max-bitrate=256
  • sox:
    play -n synth brownnoise

    O si queremos salvarlo en un archivo de 10 segundos de audio:
    sox -n -r 44100 brownnoise.mp3 synth 0:04 brownnoise vol 1

Como extra, indicaré un script muy curioso que ví, y que combina ruido marrón con ruido rosa y aplica una función seno para que sí que parezcan las olas del mar:

play -n synth brownnoise synth pinknoise mix synth sine amod 0.15 10

Más colores del espectro

Podemos pensar a partir de aquí en otros colores como el negro, que puede ser el silencio o que sólo tiene energía en determinadas frecuencias, o también puede ser el que ocurre en ultrasonidos (¿ultravioleta?). En fin, hay mucha literatura sobre esto y poco convenio. El ruido verde suele tener más energía en frecuencias medias, aunque hay autores que lo centran en las frecuencias propias de la voz humana (200Hz-3KHz o tal vez un poco más). Otros centran la máxima energía del ruido verde en torno a 500Hz. Para gustos los colores.
Aunque a partir de aquí, podemos teñir el ruido gracias a un ecualizador. También podemos experimentar con esta página web: MyNoise White Noise Generator.

Foto del prisma: D-Kuru

The post Cómo generar ruido de diferentes colores en GNU/Linux appeared first on Poesía Binaria.

» Leer más, comentarios, etc...

Variable not found

Enlaces interesantes 307

enero 15, 2018 08:08

Enlaces interesantes
Ahí van los enlaces recopilados durante la semana pasada. Espero que os resulten interesantes. :-)

.NET / .NET Core

ASP.NET / ASP.NET Core

Azure / Cloud

Conceptos / Patrones / Buenas prácticas

Data

HTML / CSS / Javascript

Visual Studio / Complementos / Herramientas

Otros


Y como postre, os dejo un tweet que bien podríamos utilizar muchas veces para responder a clientes que no tienen claro que en el mundo del software, igual que en otros ámbitos, existe una proporcionalidad directa entre el resultado obtenido y los recursos necesarios para llegar a él:



Publicado en Variable not found.

» Leer más, comentarios, etc...

Blog Bitix

GitLab, la completa herramienta integrada para desarrollo de software

enero 14, 2018 01:00

Al desarrollar software una herramienta de control de versiones como Git y otras como un gestor de peticiones, una herramienta de integración continua o despliegue contínuo o una wiki para documentación son necesarias. Hay productos específicos para cada uno de ellos pero GitLab proporciona en una único producto todas estas facilitando su instalación y administración estando integradas en el mismo producto.

GitLab

Usar una herramienta de control de versiones para el código fuente de un proyecto o programa es imprescindible para recuperar versiones anteriores de los archivos, comparar y compartir los cambios con el resto de desarrolladores del equipo. Otras herramientas imprescindibles son un gestor de peticiones para documentar cuál es el trabajo a realizar, ver en que se está trabajando, priorizar el trabajo inmediato que se realizará y el estado de cada petición. Por otro lado una herramienta donde recoger documentación del proyecto ayuda a compartir información y hacer que ese conocimiento quede recogido en algún lugar que pueda ser consultado con posterioridad o para futuros desarrolladores. También en estos días es imprescindible una herramienta para automatizar la ejecución de las pruebas unitarias y funcionales en cada commit al repositorio de código fuente.

Para cada una de estas funcionalidades hay herramientas específicas: Git para la herramienta de control de versiones, GitHub con algunas funciones colaborativas como pull request y revisiones de código, Jira para la gestión de peticiones, MediaWiki para documentar cierta información o Jenkins para la ejecución de las pruebas automatizadas. Instalar estas herramientas individualmente requiere tiempo y dedicación, además de mantenimiento posterior.

GitLab es una herramienta que proporciona estas funcionalidades en un único producto y por tanto más fácil de instalar y administrar. Quizá su gestor de peticiones y wiki no tenga tantas opciones como sus respectivos productos específicos pero para la mayoría de casos son más que suficientes. Y tiene un desarrollo muy activo añadiendo características cada pocas semanas.

Hay varias formas de instalar GitLab, una de ellas es instalandolo como un paquete de software en la propia máquina, usando una imagen de Docker o con una imagen de Bitnami. Siguiendo el artículo de Introducción a Bitnami puedes conocer como instalar GitLab en una máquina virtual con VirtualBox y con la serie de artículos sobre Docker como instalarlo en forma de contenedor y en la web de GitLab se explica como instalarlo como un software más de un sistema.

Usando Docker y el siguiente archivo de Docker Compose basta el comando docker-compose up para iniciar GitLab. Instalado GitLab de alguna de las formas anteriores usando un navegador web y con la dirección https://localhost (configurados los certificados SSL y la ubicación de los volúmenes) se accede a la aplicación de GitLab, donde inicialmente se pide la contraseña del usuario administrador root con la que iniciar sesión y realizar las tareas administrativas como crear otros usuarios y proyectos.

Contraseña e inicio de sesión
Página de bienvenida
Perfil de usuario y área de administración

Iniciada sesión ya se puede empezar a usar GitLab a crear usuarios con sus claves SSH, repositorios de Git pudiendo importar otros existentes, crear nuevos, páginas de una wiki y peticiones, integración y entrega continua y personalizar el panel kanban con el flujo que deseamos que sigan las peticiones en la organización, por ejemplo, planning, ready, doing, review, merged y deployed.

Nuevo proyecto
Nueva petición y panel de peticiones
Página wiki

Creado un proyecto GitLab e introducida la clave pública SSH nos proporciona la dirección URL con la que se puede clonar, convertir una carpeta existente en un repositorio o añadir un repositorio existente. Una vez con el repositorio en el sistema de archivos local se puede empezar a subir, modificar y eliminar archivos del repositorio de control de versiones. Hecho algún commit y subido algún archivo desde GitLab se puede ver el contenido del repositorio de Git.

Detalles de proyecto
Contenido de archivo de código fuente

Otras formas de usar GitLab es desde la nube de Amazon EC2 o de forma SaaS a un coste de entre 39€ y 199€ por usuario y mes pero si la nube no es una opción una de las ventajas de GitLab es que se puede instalar en algún sistema propio de cualquiera de las formas anteriores y tener proyecto privados. GitLab es otra herramienta que a añadiría a Herramientas para un proyecto Java. Hay alguna cosa adicional a conocer como realizar una actualización cuando se publique una nueva versión o como hacer copias de seguridad y restaurarlas. Lo que he mostrado aqui son solo una introducción a unas pocas de las muchas posibilidades de GitLab.

El código fuente completo del ejemplo puedes descargarlo del repositorio de ejemplos de Blog Bitix alojado en GitHub y probarlo en tu equipo ejecutando el comando docker-compose up.

» Leer más, comentarios, etc...

Blog Bitix

Hemeroteca #12

enero 13, 2018 10:35

Cuarto año de Blog Bitix y en febrero serán siete desde que empecé con El blog del pico.dev. En los últimos seis meses he seguido publicando casi a dos artículos por semana y durante el 2017 ha sido casi siempre así, en este semestre han sido 48 artículos, que juntos con los 39 del primero son 87 durante el año 2017, mi mayor tasa de publicación en un año.

En estas hemerotecas siempre repaso cual es la evolución de visitas e ingresos de AdSense que quizá a alguien más le resulte de interés. En Junio y Julio alcance unas 50K páginas vistas el mayor pico de visitas, aunque en meses posteriores han descendido, al principio lo achacaba a los meses vacacionales de verano pero luego se han mantenido no se si por alguna penalización de Google o algún artículo que recibía muchas visitas y haya descendido en su posicionamiento. En cualquier caso en los últimos meses del año las visitas han tenido una tendencia ascendente, de unas 40K páginas vistas y superior respecto a las de hace una año que comparándolas han sido de 25K en 2016 y de 38K en 2017 un crecimiento de un 85%. No está mal, si el año siguiente fuese igual me daría por muy satisfecho.

En el apartado de ingresos por la publicidad AdSense, algunos artículos patrocinados y enlaces de afiliación también ha estado bien. En estos momentos por AdSense es raro el día que no recibo al menos un euro y algún día excepcional he recibido 8, otros algo menos de 2 y 3, mensualmente ya es habitual que esté en un rango de 30 y 45€, los ingresos de AdSense se relacionan en gran medida con el número de visitas. Al final el artículo que publiqué sobre los cursos de formación de KeepCoding han merecido la pena como artículo patrocinado con la compra de dos usuario de tres cursos (aunque la mayoría de gente se registran a los cursos gratuitos), pero esto junto con los artículos patrocinados es más esporádico y por el momento poco habitual para mi.

En alguna ocasión me han comentado que me donarían algo por los artículos que escribo, una posibilidad sería usar Patreon o PayPal, sin embargo, no me convence mucho la donación directa por ser demasiado generosa y he preferido añadir una página con ciertos productos tecnológicos y gamers seleccionados para que si alguien le gusta mis artículos, se acuerda y quiere donarme algo lo haga a través de estos enlaces de afiliación. Al que compra le cuesta lo mismo pero yo recibo una comisión. Esto me recuerda que debería hacer alguna nueva donación a proyectos de software libre y estoy pensando en Lineage OS y Replicant.

Quien crea que es mucho que pruebe a crearse una bitácora, un canal en YouTube o un podcast y verá rápidamente que o se acierta en la temática y se es muy bueno creando contenido que genera interés o primero verá que han de pasar dos años y dedicar una ingente cantidad de horas a crear ese contenido para llegar a estas cifras que tampoco son altas, no en vano muchos de estos proyectos son abandonados al cabo de unos meses, por algo será.

Evolución visitas e ingresos de AdSense en 2017

Pero por otra parte he recibido buenos comentarios sobre lo que escribo en Blog Bitix, por algunas personas vía Twitter y otras en algún comentario que me anima a seguir escribiendo y compartiendo como hasta ahora lo que voy aprendiendo e investigando que algún día espero utilizar en algún trabajo antes de que me jubile o pruebe ser un jardinero o barrendero.

Este semestre me propuse publicar una mayor cantidad de artículos relacionados con el lenguaje de programación Java con motivo de la pasada publicación de Java 9. Pero primero empecé con un par de artículos sobre portlets y Apache Tapestry que en algún momento espero añadirlos en alguna sección del libro PlugIn Tapestry. Por supuesto, varios artículos comentando las novedades más relevantes de Java 9 publicado en septiembre entre ellas la modularidad y otras no menos notables.

Una serie de artículos sobre GraphQL como alternativa a una API REST que tiene algunas ventajas. Aún me queda publicar uno de esta serie, en cuanto se acepte un pull request a raíz de una petición que cree con un problema que me encontré.

De los menos en este semestre están relacionados con el software libre. De GitLab tengo otro par de artículos por publicar para realizar integración continua y mostrando más en detalles su gestión de peticiones, wiki y páginas. Si estas navidades tienes algún momento para ver la televisión en uno de los siguientes artículos encontrarás varias ideas relacionadas con la tecnología.

O de opinión.

Algunos artículos de tema alternativos en la temática principal de este blog pero que también me gusta compartir, comentando el cambio que hice de compañía eléctrica a Holaluz, de caldera a termo eléctrico y la diferencia en la factura entre tener caldera y tener termo eléctrico. Un par de artículos de los robles que he plantado que espero prosperen, publicaré alguno más. También algún artículo de desempaquetado.

Una buena colección de libros técnicos que he leído durante el último trío de años y me han gustado junto con una selección de productos tecnológicos.

Espero seguir escribiendo como hasta ahora en el 2018 si el tiempo del que dispongo me lo permite y continuo con motivación. Por lo pronto son unos cuantos artículos que ya tengo escritos a falta de retocar en el momento que los publique. Puedes aprovechar para repasar esta lista y leer alguno si te lo perdiste, por supuesto si aún no lo has hecho, suscríbete con tu lector preferido al feed a Blog Bitix. Finalmente, ya solo me queda desearos con la siguiente imagen linuxera de Klouner… ¡Buen 2016 2018!

¡Buen 2018!

» Leer más, comentarios, etc...

Blog Bitix

Integración y entrega continua con GitLab sobre Docker

enero 13, 2018 09:30

GitLab

GitLab es una herramienta muy completa, una de las necesidades de los proyectos es tener teses y que estos se ejecuten con cada commit para asegurar que los cambios no introducen errores en las funcionalidades cubiertas por los teses, esto es la integración continua. La entrega inmediata es una vez que los teses se han ejecutado correctamente hacer el despliegue en los servidores de forma pasa el tiempo mínimo entre que una funcionalidad está desarrollada y esta se puede utilizar.

GitLab proporciona integración continua (Continuos Integration, CI) y entrega continua (Continuos Delivery, CD) sin necesidad de una herramienta externa más especializada como es Jenkins. En el siguiente ejemplo muestro como configurar GitLab para crear uno o varios runner que son los que realizan las acciones de integración y entrega continua y el archivo descriptor .gitlab-ci.yml en formato yaml que define las acciones específicas del proyecto que se ejecutarán con cada commit en el repositorio Git.

Jenkins es una herramienta más especializada que también sirve para realizar integración y entrega continua. En la página GitLab vs Jenkins se comparan las características de ambas herramientas, aunque en esa página de comparación GitLab está indicando que tiene algunas características más y aunque no tuviera tantas para la mayoría de los casos de uso es más que suficiente con la ventaja de no necesitar una herramienta más al estar estar ya integrado en GitLab que ofrece además del repositorio de código fuente, una wiki o un páginas para un sitio web.

Para realizar integración y entrega continua hay definir las acciones, tareas y comandos de los que se componen del pipeline específico para el proyecto, la descripción del pipeline se define en un archivo .gitlab-ci.yml que se añade en el directorio raíz del código fuente del proyecto en su repositorio de Git. El pipeline según las necesidades del proyecto consta de varios pasos o steps que se ejecutan de forma secuencial. Si en un mismo paso hay varias acciones estas se ejecutan de forma paralela. En el ejemplo de proyecto test con un programa Hola Mundo con Java y usando la herrramienta de contrucción Gradle el pipeline consta de las acciones de compilación y de ejecución de pruebas unitarias y creación de documentación javadoc. La tarea de Gradle build en un proyecto Java realiza la compilación, ejecución de pruebas unitarias y genera el artefacto resultado el el directorio build/distributions y la librería jar con las clases compiladas en build/libs, la tarea javadoc genera la documentación Javadoc de las clases del proyecto.

Añadido el archivo del pipeline al código fuente del proyecto hay que definir un runner que se encargará de ejecutarlo con cada commit que se envíe al repositorio de código fuente. Hay que registrarlo y se necesita un token que se puede obtener desde el área de administración en Overview > Runners.

GitLab Runners

Al registrarlo hay que especificar el tipo de runner, hay varios tipos, en este caso se usa el de docker para ejecutar el pipeline dentro de un contenedor de Docker. En en archivo de Docker Compose es necesario que el runner pueda comunicarse con el servicio de Docker, para ello como punto de montaje del contenedor de gitlab-runner se especificar el archivo docker.sock.

En este ejemplo y con este pipeline el artefacto distribuible de la aplicación y el Javadoc se alamacena en GitLab estando accesible para su descarga desde el panel lateral una vez finalizado el pipeline.

Pipeline

El descriptor usando Docker Compose que define el servicio de GitLab y otro para GitLab Runner es el siguiente. El nombre de dominio que he utilizado para el servidor es gitlab y ha de añadirse al archivo /etc/hosts para que sea resuelto localmente.

En la sección de referencia hay unos buenos enlaces de documentación de GitLab sobre la integración continua, despliegue continuo y entrega continua.

El código fuente completo del ejemplo puedes descargarlo del repositorio de ejemplos de Blog Bitix alojado en GitHub y probarlo en tu equipo ejecutando el comando docker-compose -f docker-compose-all.yml up.

» Leer más, comentarios, etc...

Bitácora de Javier Gutiérrez Chamorro (Guti)

Los programadores y las faltas de ortografía

enero 12, 2018 04:17

Cada vez que me encuentro una falta de ortografía en un contenido público, es decir, que no hemos escrito para nosotros, y guardamos bajo llave, me entran escalofríos. Cuando el texto con defectos proviene, o está asociado a una gran compañía, me invade el rechazo por ella. Si es un periódico, automáticamente pierdo credibilidad en […]

Artículo publicado originalmente en Bitácora de Javier Gutiérrez Chamorro (Guti)

La entrada Los programadores y las faltas de ortografía aparece primero en Bitácora de Javier Gutiérrez Chamorro (Guti).

» Leer más, comentarios, etc...

Picando Código

¿Nintendo Direct? ¿Qué está pasando Nintendo?

enero 11, 2018 12:25

Resulta que Nintendo no ha tenido un Nintendo Direct en un buen tiempo. El Direct es el medio que Nintendo ha elegido para anunciar nuevos títulos e incluso nuevas consolas como pasó cuando revelaron el Nintendo Switch, un streaming en vivo a traves de internet en su sitio web, YouTube, Twitch y demás.

La empresa ha tenido un 2017 espectacular:

  • The Legend Of Zelda: Breath Of The Wild es uno de los juegos más aclamados y más vendidos (tanto en Switch como en Wii U), además de haber ganados varios premios a juego del año.
  • Super Mario Odyssey para Nintendo Switch fue el juego de Mario
  • En sus primeros 10 meses, el Nintendo Switch se convirtió en la consola de videojuegos que más rápido ha vendido en la historia en Estados Unidos y otros países.

Con una lista de títulos excelente y bastante apoyo de third parties, no sabemos tanto qué le depara al Nintendo Switch este año. Sabemos que va a haber un título de Kirby, uno de Yoshi y teóricamente Metroid Prime 4 (siempre se puede atrasar, y no hemos visto ni una imagen). Pero poco más sobre nuevos “grandes títulos”, o la consola virtual, aplicaciones (Navegador Web, Netflix, etc.) y cuándo se va a implementar finalmente el servicio online. ¡Nintendo por favor dame una forma de chatear con la gente en mi Switch!

Hace meses que corre el rumor que va a haber un Nintendo Direct el 11 de enero. Sin embargo Nintendo sigue en su estrategia de no decir nada hasta que dice… Como hizo con la presentación del Switch. Meses llamándolo “NX” y lo único que había era rumores. Ahora resulta que empezaro a twitear cosas como provocando a los fans, pero no confirma cuándo habrá un Direct. En algún momento los Community Managers de Nintendo decidieron enloquecer a sus seguidores, y publicaron lo siguiente:

La cosa no quedó ahí. La tienda oficial de Nintendo en Nueva York también se sumó:

Y para no ser menos, la cuenta de Super Mario Odyssey en el Reino Unido agregó:

Como ven, hay un tema con el fuego… Los memes de usuarios no se hicieron esperar, e incluso alguien prendió fuego un amiibo de Chibi-Robot. Para alimentar más esta incertidumbre, varias cuentas oficiales de videojuegos o empresas de videojuegos se sumaron también: Mega Man, Sonic (si no siguen esta cuenta en Twitter, háganlo, es muy genial), Doom, Assasin’s Creed (las partes 3 y 4 salieron en Wii U, ¿podría haber algún anuncio en el Direct al respecto?), Obsidian, Riot Games, Resident Evil, Star Citizen, Trove. Varios seguramente se sumaron porque no deja de ser una buena estrategia de marketing, pero otros podrían estar insinuando su presencia en Switch. Por ahora no hay nada confirmado, pero todo este asunto es bastante divertido.

Estoy disfrutando muchísimo mi Nintendo Switch. Invertí más de 100 horas en Hyrule con Breath Of The Wild, DOOM está excelente, Super Mario Odyssey… debería escribir una reseña completa al respecto, y vengo jugando Mario Kart 8 online casi todos los días. Espero con anticipación los juegos de Mega Man que se vienen al Switch, Street Fighter 30th Anniversary Collection, y el rumor que espero se confirme con más ansias es el de GTA V para Switch. Pero por ahora tengo de sobra para seguir divirtiéndome con todos los juegos que hay disponibles.

Al momento de escribir esto no hay nada confirmado. Habrá que ver con qué noticia me encuentro mañana… Si quieren ver más locura al respecto, la pueden seguir en el subreddit /r/NintendoSwitch.

Actualización: 11/01/2018 – Nintendo Direct Mini

Finalmente hubo un Nintendo Direct, pero en formato “mini”. Como si fuera poca cosa, Nintendo anunció algún que otro juego first-party de Nintendo para Nintendo Switch y algunos de third-parties:

El resumen:

  • The World Ends With You – Un juego originalmente para Nintendo DS en su versión definitiva Final Remix sale para Nintendo Switch este año.
  • Actualización para Pokken Tournament DX: dos olas de actualizaciones, En la primera ola, Aegislash disponible como luchador, nuevos modos de juegos,  y dos pokemones nuevos de apoyo. Ola 2 Blastoise com nuevo luchador y Mew y Celebi como soporte. El DLC ya se puede comprar e incluye además nuevos avatares. La primera ola estará disponible el 31 de enero y la segunda el 23 de marzo.
  • Kirby Star Allies – Nuevo título de Kirby para Nintendo Switch, disponible el 16 de marzo. También, el demo de Kirby BattleRoyale está disponible a partir de ahora en Nintendo 3DS.
  • Dragon Quest Builders – Demo disponible en Nintendo Switch a partir de ahora.
  • Hyrule Warriors: Definitive Edition -La versión de Wii U de Hyrule Warriors estaba bastante divertida. Esta versión para Nintendo Switch incluye todo el contenido y DLC de las versiones para Nintendo Switch y Nintendo 3DS, además de las ventajas que ofrece el Switch, y disfraces de Breath Of The Wild para Link y Zelda. Muy interesante…
  • Mario Tennis Aces – El spinoff de Mario que aparentemente tiene suficientes seguidores como para siempre estar presente… ¿Dónde está Mario Strikers? En fin, un juego más de Mario Tennis que puede estar interesante, y verá la luz en la primavera del hemisferio norte.
  • Ys VIII: Lacrimosa of DANA – un nuevo RPG que me dió mucho aire a Xenoblades Chronicles 2, disponible para Nintendo Switch en verano del hemisferio norte.
  • Super Mario Odyssey – Una actualización con un nuevo mini-juego online después de terminar la aventura principal.
  • SNK HEROINES Tag Team Frenzy – Juego de pelea con las heroínas favoritas de SNK, disponible para Nintendo Switch este verano del hemisferio norte.
  • NEOGEO Art Of Fighting 2 – Este clásico juego de Neo Geo disponible a partir de hoy en Nintendo Switch.
  • Mario + Rabbids Battle Kingdom – nuevo DLC con Donkey Kong.
  • Payday 2 – disponible para Nintendo Switch a partir del 27 de febrero.
  • Fe – un nuevo juego de plataformas para Nintendo Switch disponible el 16 de febrero.
  • Celeste – otro juego de plataformas disponible en Nintendo Switch a partir del 25 de enero
  • Donkey Kong Country: Tropical Freeze – originalmente disponible para Wii U, el último título de la serie Donkey Kong Country fue migrado a Nintendo Switch, con Funky Kong como nuevo personaje jugable. Disponible el 4 de mayo.
  • Dark Souls Remastered muy bienvenido port de este título tan popular. Disponible el 25 de mayo de este año.

Seguramente habrá algún tipo de Nintendo Direct más “amplio” eventualmente. Acá estaremos… a la espera…

» Leer más, comentarios, etc...

Picando Código

Notificaciones en la web

enero 10, 2018 11:00

¿No les resulta odioso entrar por primera y única vez a un sitio cualquiera para leer un artículo, cerrar la pestaña y nunca volver y encontrarse con esto?

Push Notifications

Se trata de la API de Notificaciones de los navegadores web. Mediante el navegador se puede acceder al sistema de notificaciones de nuestro sistema operativo, algo que se puso de moda hace un tiempo y resulta en general más molesto que útil. Si no lo conocen, pueden probarla en vivo y en directo desde su navegador web en este post:


Se necesita poco código para generar algo así:

Notification.requestPermission()
// Promise { : "pending" }
Notification.permission
// "granted"

Y para crear una notificación, hay que ejecutar:

var options = {
  body: '¡Hola mundo!',
  icon: 'http://picandocodigo.net/wp-content/uploads/2018/01/notification.jpg'
}
new Notification("Picando Código dice:", options)

Este post fue inspirado por Firefox Nightly, el navegador web que se pone cada vez mejor. Acaban de incorporar una característica sumamente necesaria y muy bienvenida. Para que un sitio web tenga acceso a nuestras notificaciones nos tiene que pedir permiso (hacer clic en el botón de “Pedir Ppermiso” más arriba). En general no queremos que nos molesten preguntándonos si damos este permiso.

En los últimos builds de Firefox Nightly, podemos encontrar una preferencia para deshabilitar los permisos en general. Podemos verlo ingresando about:preferences en la barra de direcciones de Firefox (o entrando al menú de Preferencias desde el menú contextual), y seleccionando el menú de Seguridad y Privacidad. Ahí vamos a ver en la sección de Permisos la opción de Notificaciones:

Preferencias de Notificaciones

Además de ver los sitios a los que les hemos dado permiso y a los que no, tenemos la nueva opción de bloquear todos los pedidos de permiso para mostrar notificaciones.

Sólo porque una tecnología está disponible, no quiere decir que debemos abusar de ella. Pero las empresas no lo comprenden… ¿Habrá estadísticas que apoyen el uso de notificaciones para cada sitio de artículos o noticias que existe? ¿O será simplemente por continuar la tendencia de hacer a la web cada vez más invasiva? Obviamente hay varios casos en que las notificaciones son prácticas y útiles. Pero en comparación con la cantidad de sitios que ofrecen mostrar notificaciones, son la excepción.

» Leer más, comentarios, etc...

Picando Código

Películas para ver en 2018

enero 09, 2018 11:00

2018 es un año espectacular en lo que se refiere a cine para muchos de nosotros. Los que disfrutamos los cómics, la ciencia ficción, los monstruos gigantes y demás estamos viviendo de los mejores momentos de cine pochoclero. Acá la lista de las películas que más estoy esperando este año:

Avengers: Infinity War

No me aburro de mirar el trailer de Avengers: Infinity War. Marvel viene armando un universo equivalente al de los cómics desde hace 10 años, arrancando con Iron Man. En 2008 me preguntaba:

¿Estará Marvel preparándonos para la saga de super héroes más espectacular de todos los tiempos llevada al cine? ¿Sería ésto posible?

Y la respuesta llegó. La primera película de Avengers estuvo genial, Age Of Ultron también, mi nivel de expectativa para Infinity War está por las nubes.

Avengers: Infinity War sale en abril/mayo de 2018 dependiendo el país.

Black Panther

Otro capítulo del universo cinematográfico de Marvel: Black Panther. Un personaje importante por haber sido el primer super héroe afroamericano en tener su propia serie de cómics mainstream en su momento. Por lo que se ve en los trailers parece arriesgar un poco más allá de la fórmula que vienen siguiendo las películas de Marvel (y que por ahora me rinden muchísimo). Por suerte no hay que esperar mucho para verla, va a estar en los cines a partir de febrero de 2018.

Ant-Man and the Wasp

Ant-Man and the Wasp

La secuela a Ant-Man y la película número 20 del universo cinematográfico Marvel. Todavía no hay trailer, pero va a estar en los cines en julio de 2018.

Spider-Man Into the Spider-verse

Miles Morales obtiene su merecido lugar en el cine. La animación se ve muy bien, y el spider-verso da para muchas historias interesantes. Definitivamente en la lista de películas para mirar. Se estrena el 14 de diciembre de 2018.

Venom

Una película sobre Venom, el enemigo de Spider-Man, situada en el mismo universo de Spider-Man: Homecoming (¿por lo tanto el MCU?). Todavía no hay trailer, pero parece que va a ser “R-Rated”, no apta para menores de 16 años sin acompañante adulto. Supongo que es la respuesta de Sony al éxito de Deadpool. Si uno va a hacer una película de Venom, qué mejor que hacerla con un toque maduro y mucha violencia. Venom se estrena el 5 de octubre de 2018.

Deadpool 2

Vuelve Ryan “me tocó un guión de mierda en Green Lantern pero igual la remé y fui un Deadpool horrible antes pero no me di por vencido” Reynolds como el mercenario con una boca a los cines en junio de 2018.

New Mutants

Siguiendo con los mutantes, una película que se distancia un poco de las anteriores, ya que si bien usa a los personajes de Marvel Comics, se trata de una película de terror. El trailer se ve interesante y los mutantes dan para hacer una buena película de terror. Se estrena el 13 de abril de 2018.

X-Men Dark Phoenix

La secuela a X-Men: Apocalipsis, una adptación de The Dark Phoenix Saga de Chris Claremont. Por ahora las películas de los X-Men no me han emocionado mucho. Pero esta parece ser un poco más super heróica y en el espacio. Además le estoy volviendo a agarrar el gusto a los X-Men en los cómics, así que tengo un poco más de expectativa con esta película que todas las anteriores. Se estrena el 2 de noviembre de 2018.

Aquaman

Aquaman Movie

Jason Momoa vuelve en el papel de Aquaman. Le tenía mucha fe al personaje, pero fue una de las pocas cosas que no me gustaron de Batman V Superman. Por momentos me parecía puesto ahí como excusa para tirar frases comunes a lo James Hetfield. El guión no le hizo ningún favor. Pero con su propia película, espero que el personaje sea reivindicado. Le tengo fe al director James Wan. Su trabajo en The Conjuring es espectacular. La película se estrena el 21 de diciembre de 2018.

Ready Player One

Aquel libro que tanto disfrutamos leyendo en el club de lectura online de Multiverseros finalmente llega al cine. Si bien puede hacer una buena película no tengo mucha expectativa. El siguiente libro de Ernest Cline: Armada ya sí me resultó más un guión directo para cine. Ready Player One sale en marzo de 2018.

Solo: A Star Wars Story

Los fans de Star Wars no podemos quejarnos. Disney prometió una película de Star Wars por año y viene cumpliendo. En lo personal me viene gustando todo lo que ha salido. The Force Awakens y The Last Jedi, los capítulos de la saga principal, fueron todo lo que quería ver y más. Y Rogue One, otra de las “Star Wars Story” es muy buena y la preferida de mucha gente. Además de la ansiedad general por una nueva película de Star Wars, tengo mucha expectativa de ver a Donald “Troy de Troy and Abed in the moooorning en Community” Glover como Lando Calrissian. La película se estrena en mayo de 2018.

Godzilla: Planet of the Monsters

La primera película animada de Godzilla se estrena a nivel mundial en Netflix en unos días. Otra que me tiene bastante expectante, ¡qué año para las películas de kaiju! La premisa es sumamente interesante y un poco distinta a lo que nos tiene acostumbrado nuestro querido kaiju. En el año 2048, la raza humana abandona la Tierra tras décadas de perder contra Godzilla y otros monstruos gigantes. Los humanos vuelven 20.000 años después para encontrar que Godzilla ha evolucionado y está a cargo del planeta. Se estrenó en Japón en noviembre del 2017 y va a estar disponible a nivel mundial el 17 de enero de 2018.

Algo que espero con más ansias que la película en sí mismo, es que con los derechos de distribución vengan también las películas anteriores de Godzilla a Netflix.

Pacific Rim Uprising

La primera película de Pacific Rim me gustó mucho y se viene una secuela. Monstruos gigantes, robots gigantes, no necesito mucho más para querer ir al cine. Agreguen a John Boyega y Charlie Day a la fórmula y no puede fallar. Una película que definitivamente podremos disfrutar más en la pantalla gigante, se estrena en marzo de 2018.

Rampage

Y como si fuera poco, también tendremos una película ligeramente basada en el videojuego del mismo nombre: Rampage. Jugué bastante a su versión de NES y tuve Rampage World Tour en mi GameBoy Color. Más monstruos gigantes y The Rock, no me quejo. Rampage se estrena el 20 de abril de 2018.

Jurassic World: Fallen Kingdom

Y ya que hablamos de monstruos gigantes, se viene otra película de la saga Jurassic World. Y digo monstruos no dinosaurios porque si somos puristas, son animales basados en el ADN de dinosaurios pero no científicamente precisos. Por si no reciben el Dino Times en sus casillas de correo, recientemente se ha descubierto que varios dinosaurios tenían plumas…
De todas formas, dinosaurios y Chris Pratt, una fórmula que para mí rinde muchísimo. En cines el 22 de junio de 2018.

God Particle

Otra película de la saga de Cloverfield de J.J. Abrams. La película trata de una estación espacial con un acelerador de partículas y resultados inesperados. Por estar en el universo de Cloverfield, asumo que podría tener algo que ver con monstruos gigantes, ojalá… Se estrena el 20 de abril de 2018.

Bumblebee: The Movie

Michael Bay deja de lado la silla de director para un spin-off en el universo Transformers. Disfruté mucho la primera película de Transformers en 2007, pero no seguí las siguientes. En algún momento debería mirarlas, creo que vi la segunda y me aburrió. Esta película seguro se difernecia un poco de las 4 anteriores. Aparte del cambio en el director, está ambientada en la década de los 80’s (1980 si están leyendo esto en el futuro). Y en estos 10 años los efectos especiales deben haber mejorado un poco, así que seguro tenemos por lo menos algo bastante espectacular visualmente, aunque ojalá no quede sólo en eso. Bumblebee llega a los cines el 21 de diciembre de 2018.

The Incredibles 2

Una muy bienvenida secuelta de -como dice un amigo- la mejor película de los Cuatro Fantásticos que se ha hecho. Por lo menos hasta que Disney los traiga al universo cinematográfico de Marvel tras la compra de sus derechos… Los Increíbles vuelven el 15 de junio de 2018, y salvo algunas excepciones, Pixar es garantía de calidad.

Hotel Transylvania 3

Siguiendo con la animación, se estrena también Hotel Transylvania 3. Me gustaron las primeras dos, y ésta también es dirigida y co-escrita por el genio de Genndy Tartakovsky y cuenta con un elenco de varios comediantes famosos. Se estrena el 13 de julio de 2018.

Early Man

También animación, pero desde el Reino Unido y en stop-motion se estrena Early Man. Una comedia de los creadores de Wallace & Gromit. Promete ser graciosa y en otro de los trailers se ven dinosaurios. Se estrena el 26 de enero de 2018.

Wreck It Ralph 2

Vuelve el personaje de Disney que nos lleva al mundo de los videojuegos y pudo contar con un cameo de Mario pero no encontraron la forma y supuestamente sí aparecería en esta secuela. En esta ocasión, Ralph se mete en uno de los mundos más tenebrosos y desagradables pero a la vez más maravillosos de hoy: LA INTERNET. La película se estrena en noviembre de 2018.

Tomb Raider

Otro intento cinematográfico con la heroína de los videojuegos. Esta vez parece que es de la saga Tomb Raider que jugué el año pasado. No le tengo mucha fe pero habrá que ver qué tal. Se estrena el 18 de marzo de 2018.t

Alita: Battle Angel

Basado en un Manga que tuvo una adaptación animada, Alita Battle Angel es la historia de un cyborg en un futuro post-apocalíptico. Está producida por james Cameron, que declaró querer hacer algo fiel al manga original. Buenas noticias, esperemos que la máquina de Hollywood no pasteurice demasiado la historia, el trailer se ve bastante bien. Se estrena el 20 de julio de 2018.

Mortal Engines

Una nueva sagade ciencia ficción, acción y aventura basada en los libros del mismo nombre por Phillip Reev. Peter Jackson está involucrado en el guión. 2.000 años después que la civilización fue destruida, las ciudades son móviles y andan por ahí atacando a ciudades más chicas. Una estética post-apocalíptica steampunk, promete ser interesante. Se estrena el 14 de diciembre de 2018.

The Man who killed Don Quixote

The man who killed Don Quixote

El genio de Terry Gillian (Monty Python, Brazil, The Adventures of Baron Munchausen, 12 Monkeys, The Zero Theorem) nos trae esta película con mucha historia. Se empezó a filmar en los 90’s pero fue cancelada por problemas varios y diversos. Gillian volvió a intentar filmarla varias veces sin éxito, hasta que el año pasado finalmente terminó de filmarla. Una película que tardó casi 20 años en estar lista. Conociendo sus películas anteriores, y toda la historia detrás d e esta producción, tengo expectativas muy altas.

A medida que vayan saliendo nuevos trailers iré actualizando… ¿Faltó alguna película en particular?

 

» Leer más, comentarios, etc...

Bitácora de Javier Gutiérrez Chamorro (Guti)

Parallel Programming Library

enero 09, 2018 10:28

Marco Cantu publicó el interesante artículo Explaining Tasks in Delphi Parallel Library… by Creating too Many Tasks en donde usaba TTask con Delphi para procesar datos en paralelo usando diferentes hilos de ejecución. Entonces decidí profundizar más en TParallel de Embarcadero, el objeto que encapsula las tareas en paralelo dentro de PPL (Parallel Programming Library), […]

Artículo publicado originalmente en Bitácora de Javier Gutiérrez Chamorro (Guti)

La entrada Parallel Programming Library aparece primero en Bitácora de Javier Gutiérrez Chamorro (Guti).

» Leer más, comentarios, etc...

Picando Código

Global Diversity CFP Day – Un día global para la diversidad en las conferencias

enero 08, 2018 11:00

¿Siempre quisiste dar una charla en una conferencia técnica? Que 2018 sea el año que cumples tu sueño. Global Diversity CFP Day es un evento global que busca alentar y ayudar a gente que quiera iniciarse como orador de conferencias:

Sábado 3 de febrero de 2018
El sábado 3 de febrero de 2018 van a haber varios talleres alrededor del mundo animando y aconsejando a oradores novatos a armar su primera propuesta de charla y compartir su perspectiva individual sobre cualquier tema de interés para gente en tecnología.

Cada taller va a contar con oradores experientes a mano para:

  • Darte una buenvenida cálida e inclusiva en un espacio seguro (ve el Código de Conducta al cual todos las participantes deben adherir)
  • ser tus mentores con tu propuesta
  • proveer consejos para tu charla
  • y compartir su entusiasmo para que logres llegar al escenario

Temas
Estos talleres no tienen un lenguaje específico, framework o proceso como foco. Incluso si tu charla no está siquiera relacionada a la tecnología queremos saber de tí! En resumen, si hay algo que querés gritar al mundo, estamos felices de ayudarte a que lo logres independientemente de los límites de la tecnología o las comunidades.

Se está buscando gente en todo el mundo para organizar más talleres. Ya hay talleres confirmados en Argentina, Brasil y varias ciudaes de África, América, Asia, Europa y Oceanía. ¡Faltan muchas ciudades de América Latina y España!. Si quieren organizar un taller en su ciudad, lean esta información. Y si saben de alguien que pueda interesarle, compartan el enlace al sitio de Global Diversity CFP Day.

Es una excelente iniciativa por donde se le mire, esperemos que siga creciendo 🙂

RubyConf Urugay 2014

» Leer más, comentarios, etc...

Poesía Binaria

El 2017 para Poesía Binaria. Posts, cambios, retos y lenguajes

enero 08, 2018 09:21

2017 blog resumen del añoComo todos los años, hago un resumen de mi año con el blog. Resumiendo cambios, hitos, agradeciendo mucho a mucha gente y contando alguna cosilla curiosa.

Si el 2016 fue un buen año para el blog, 2017 ha sido un año más de mantenimiento. Aunque el año empezó fuerte, teniendo en marzo dos posts en Menéame. Uno en portada, Edición de Vídeo en GNU/Linux; y otro en portada de la categoría Linux, Aplicaciones Web Serverless. Por suerte, a pesar de los miles de visitas recibidos en cosa de 3 días, el servidor aguantó el tirón bastante bien. No sólo cuentan las visitas desde Menéame, sino que hubo gente que compartió los contenidos por redes sociales y todo, lo cual me hizo mucha ilusión.

Pero en el terreno personal ha sido un año muy duro y me ha obligado a estar desconectado. He intentado mantener la frecuencia de uno o dos posts semanales, aunque ha habido semanas que no he podido publicar nada. Finalmente, este año he publicado 56 posts nuevos. Y alguno, muy muy largo. También algunos vídeos en Youtube que espero retomar este año.

El plano económico

El año pasado, el blog no me costó dinero. Eso fue una buena noticia para mí, después de andar muchos años invirtiendo para mantenerlo. A ver, es mi hobbie, me hace ilusión y me lo paso bien escribiendo, ¿qué más quiero?. Este año tampoco me ha costado dinero, entre algunos posts patrocinados, algunos referidos de DigitalOcean y alguna cosilla más. Pero entre hosting y dominio ya se fue todo.

De todas formas, de cara a mis visitantes, aunque alguna vez realice algún post patrocinado, suelo llevármelo un poco al terreno de la programación, o administración de sistemas, poner ejemplos de terminal o algún fragmento de código para dar un valor añadido al visitante. No suelo aceptar todos los que me vienen, es más, han sido sólo unos pocos los que he puesto aquí.

Mudanza de dominio

Después de muchos años en el dominio totaki.com al que le tengo cariño y fue casa de uno de mis primeros proyectos web que me gustaría retomar algún día. He decidido adquirir un dominio para este blog. Casi desde que nació el blog quise coger el punto com, pero ese casi supuso que no pudiera hacerlo, por un mes o así y, aunque el dominio no tiene nada y me he puesto en contacto con el dueño, no me contesta. Así que, a mitad de 2017 decidí pillar el punto net.

Como iba siendo un año malo, sabía que de visitas no andaría bien, así que tiré para adelante. Intentando que en lo relativo al SEO no sufriera demasiado. E intentando hacer la migración con el menor tiempo offline. Cerré la web durante media hora y en más o menos hora y media ya estaba todo probado y funcionando, con redirecciones desde el antiguo dominio, algunos plugins que me había resistido a actualizar actualizados y algunos arreglos que se me habían quedado colgados tiempo atrás hechos. Espero escribir pronto un post de cómo hice todo por si a alguien le sirve.

El caso es que tras la mudanza, y pasadas dos semanas o así las visitas subieron, aunque no todos los agregadores se portaron bien.

Redes sociales

Este año no he estado muy activo en redes sociales. Otras veces, publicito los posts en Facebook y en Twitter siempre que salen, o incluso todos los días publico algún post antiguo. Esta vez no he estado tan activo en Facebook, ni Twitter. He publicado varios posts, sobre todo los nuevos, pero tampoco he sido todo lo constante que me gustaría. Y este año no he participado tanto en grupos de Facebook, y se nota mucho en las visitas totales.

Aunque aquí os pongo las 5 publicaciones más populares en Facebook:

  1. Foto de Debian en mi móvil Android. Por cierto, publiqué un vídeo de la instalación.
  2. Rescatando capturas de pantalla perdidas en el disco duro.
  3. Consejos para endurecer un servidor SSH
  4. ¿Qué debemos tener en cuenta a la hora de montar un servidor?
  5. 20 cosas chulas que podemos hacer en la terminal de Linux

En Facebook, la página de Poesía Binaria, tenía 818 likes a día 1 de enero de 2017, y 856 likes a día 1 de enero de 2018. Además, se han descolgado 10 personas de la lista (os echaré de menos).

En lo que respecta a Twitter, tengo muchos proyectos por llevar a cabo y mucho por hacer para terminar de automatizar muchos de los procesos de publicación de posts. Sólo me queda agradeceros a muchos de vosotros la difusión de algunos tweets y posts: @debianhackers, @sysadmit, @aprendizdsys, @almu_hs, @m4r14h, @yoyo308 y @ochobitsunbyte. Y seguro seguro que me dejo a alguien. Tengo pendiente desarrollar alguna herramienta para monitorizarlo, seguro que existen, pero soy de lo que no hay y me encanta programarlo.

Aún tengo pendiente de publicar un artículo invitado, por mi amigo @startgo_connect. Lo haré pronto, no me olvido. Además, estoy abierto a colaboraciones, tanto de personas que quieran publicar aquí como para publicar como invitado en otros blogs.

Aunque no es muy siglo XXI, este año, también estrené newsletter. Aunque sólo envié un e-mail, quiero ponerme un poco las pilas con mis 42 suscritos y enviarles contenidos interesantes.

Lo más visitado

Aunque muchos optáis por Google Analytics, yo utilizo Piwik. Dentro de lo que cabe, intento no utilizar demasiados servicios externos, aunque sean gratis, quiero que la información me pertenezca. Es cierto que también tengo Adsense, y que Google puede monitorizar del mismo modo las visualizaciones y quedarse con la información que le dé la gana de mi blog, pero bueno, siento que con Piwik tengo más control.
Por tanto, lo más visitado este año en mi blog ha sido:

  1. Bucles y cursores en MySQL con ejemplos.
  2. Formas de transformar un entero a cadena en C y C++
  3. Introducción a Timer y TimerTask en Java
  4. 9 trucos para manejar cadenas de caracteres en Bash y no morir en el intento.
  5. ¿Qué características necesito para editar vídeo en GNU/Linux?

Este año, las estadísticas son muy muy variadas. Hay de todo, y está muy repartido.

Lo más buscado

Los usuarios, cada vez usan menos el buscador interno. Casi siempre, las búsquedas suelen ser en Google, y éste remite a una página del blog. Pero bueno, hay cerca de 1000 búsquedas en este sistema. Siendo:

  • imagemagick (11%)
  • bmp (4%)
  • bash (3%)
  • memoria compartida (3%). Me ha resultado muy curioso este resultado.
  • magento (3%)

Además, aunque Google no nos chiva lo que se ha buscado, utilizando las estadísticas de otros sistemas que sí nos lo dicen. Las búsquedas con las que más gente entra son:

  1. amazon
  2. for en bash
  3. poesía binaria
  4. números primos en C
  5. cursores mysql

Aquí hay variaciones con respecto a años anteriores. Pero está muy bien

Navegadores más usados

  • Google Chrome (60%) baja 10% con respecto al año pasado.
  • Mozilla Firefox (22%) baja 1% con respecto al año pasado.
  • Chrome Mobile (6%) entra con fuerza. Tal vez el año pasado el sistema no lo diferenciaba.
  • Safari (2%) baja 1% con respecto al año pasado.
  • Opera (2%) sube 1% con respecto al año pasado.

Aunque creo que es interesante, tal vez el año que viene sí que veamos un cambio en este aspecto. La entrada de Firefox Quantum en nuestras vidas ha sido fuerte. Llevo años utilizando Firefox y Chrome a diario, pero el aumento de rendimiento en Firefox hace que me decante un poco más por éste último.
Internet Explorer, Edge y otros, andan por el 1%, pero están en la novena y undécima posicion.

Sistemas Operativos más usados

  • Windows (62%) sube 1% con respecto al año pasado.
  • GNU/Linux (cualquier distribución) (18%) sube 1% con respecto al año pasado
  • Android (9%) baja 1%
  • Mac OSX (5%) se mantiene

Enlaces entrantes

Bueno, fueron dos días lo que duró lo más fuerte del efecto Menéame (y no fue demasiado fuerte, he visto efectos más fuertes), pero con eso bastó para ponerse la segunda en referencias, por detrás de Facebook. En este listado, dejando fuera las entradas desde redes sociales como Facebook, Twitter, Google+, Youtube y LinkedIn:

Y, ¡qué sorpresa! Encontrarme a un amigo como @elblogdeliher por aquí. Este año, al no publicar tantos posts, otros directorios como bloguers, planetacodigo y planetalinux. Y, otra sorpresa más, algunos de mis posts son enlazados desde aulas virtuales, cosa que me saca una sonrisilla tonta y me hace sentir que mis chuletas le valen a alguien más 🙂

Países

El hecho de tener algún que otro post patrocinado hace que, centre un poco los contenidos en un país en concreto. En este caso España, y es normal que haya subido el porcentaje. Además, la mayor parte de los países de Hispanoamérica que me visitaban, lo hacían desde Facebook:

  • España (63%)
  • EEUU (17%)
  • México (6%)
  • Argentina (3%)
  • Colombia (2%)

Lo más comentado

Empezamos con las consultas a mi WordPress. Aunque no las pondré todas, porque ya tenemos otros sitios donde consultarlas, algunas cambiarán ligeramente, y las pondré aquí. Como la consulta para ver los posts más comentados, que generará enlaces como los siguientes:

1
2
3
4
5
6
7
8
9
10
11
12
13
SELECT WPC.comment_post_ID AS Post_id,
     COUNT(WPC.comment_post_ID) AS Comments,
     WPP.post_title AS Title,
     CONCAT('<li><a href="https://poesiabinaria.net/', WPP.post_name, '">', WPP.post_title,'</a></li>') AS `Link`
  FROM wp_comments WPC LEFT JOIN wp_posts WPP ON WPC.comment_post_id=WPP.ID  WHERE
     WPC.comment_date>='2017-01-01' AND
     WPC.comment_date<'2018-01-01' AND
     WPC.comment_approved=1 AND
     WPC.comment_type<>'trackback' AND
     WPC.comment_type<>'pingback'  
  GROUP BY Post_id
  ORDER BY Comments DESC
  LIMIT 5;

Otras curiosidades

Este año se han publicado 56 posts y 3 páginas (1.13 por semana) de los cuales 27 de ellos contienen código y 29 de ellos ejemplos de uso de terminal (con el plugin SimTerm). Además, he modificado 24 posts de años anteriores.

En total 181 fragmentos de código (79 menos que el año pasado, aunque no he contado los de este post). De los cuales:

  • 45 son de C
  • 28 son de C++
  • 28 son de BASH
  • 20 son de Lisp
  • 18 son de Python
  • 17 son de PHP

Cada post tiene una media de 1919.7018 (393 palabras más que el año pasado) o unas 14721.4386 letras (3211 letras más que el año pasado), ¡enrollándome aún más que otros años!. También he publicado 386 enlaces (más o menos la mitad que en 2016) de los cuales 204 son internos (182 externos).

Los posts más largos

Los posts más cortos

Este año ha habido algunos posts cortos, sobre todo para comentar fotos de mi Instagram, y algunas pequeñas píldoras que quería publicar sin enrollarme demasiado.

Retos del 2018

Han pasado 8 días del año y aquí va el primer post. La media anual, por ahora no va nada bien. Aunque me gustaría llegar a los 150 posts (entre posts y páginas) como me propuse hace dos años. Tengo muchas cosas en el tintero que me gustaría probar y sobre las que me gustaría escribir. Y, aunque el tiempo parece cada vez menor, quiero intentarlo. Aunque a este paso voy a tener que ponerme como reto el número de palabras.

En 2017 empecé fuerte publicando vídeos en mi canal de Youtube, aunque lo tuve que dejar por problemas personales, así que quiero retomarlo, junto con una pequeña sorpresa.

Foto principal: unsplash-logoBrigitte Tohm

The post El 2017 para Poesía Binaria. Posts, cambios, retos y lenguajes appeared first on Poesía Binaria.

» Leer más, comentarios, etc...

Variable not found

Top posts 2017 en Variable not found

enero 08, 2018 07:55

Antes de nada, me gustaría aprovechar este pequeño momento de vuestro tiempo a desearos un gran 2018 repleto de salud, prosperidad, felicidad y mucha diversión, tanto en los aspectos personales como en los profesionales.

Y ahora, como manda la tradición, dedicaremos este primer post del año a repasar cuáles son los contenidos que más han llamado la atención a los seguidores de Variable Not Found durante este 2017 que acabamos de cerrar.


Desarrollador volviéndose locoEncabezado la lista, con mucha diferencia respecto a los siguientes gracias a su difusión a través de Menéame, encontramos el post “Adivina, adivinanza: ¿por qué no compila este código?“, un uso abusivo de la amplitud de UTF8 para conseguir una maldad que, bien empleada, podría volver loco a más de uno ;)

A continuación, tenemos un artículo donde se muestra paso a paso cómo “acceder a IIS Express desde otro equipo de la red local“, un escenario muy frecuente cuando trabajamos en grupo o con varios dispositivos. Aunque es algo sencillo, nunca está de más tener esta información a mano y actualizada a los sistemas operativos y versiones actuales.

En tercera posición le sigue la solución a un problema muy frecuente, que nos ahorrará valiosos segundos en nuestro día a día mientras probamos o depuramos una aplicación en nuestro equipo local. En “cómo hacer que Chrome ignore certificados no válidos en localhost mientras desarrollamos una aplicación con HTTPS” mostramos cómo evitar el molesto mensaje de Chrome cuando el certificado local no es seguro.

El post “Funciones locales en C# 7, también consiguió llamar algo la atención, probablemente por lo novedoso de estas nuevas construcciones del lenguaje con el que trabajamos a diario. Estos artículos sobre las características de C# los escribo principalmente para ayudarme a interiorizar estas novedades, pero me alegra saber que también os pueden resultar útiles para estar al día.

El artículo “¡Hasta la vista, project.json! ¡Hola de nuevo, .csproj!” abría el año pasado echando abajo una de las grandes ideas que había propuesto .NET Core desde sus inicios: la sustitución de los archivos .csproj por una alternativa mucho más ligera y atractiva basada en JSON. Pero el espejismo duró poco, y en la versión 2.0 se solidificó el tooling devolviendo el protagonismo a los tradicionales archivos de proyecto (eso sí, algo renovados y mejorados).

En sexta posición del ranking encontramos la presentación del esperado curso de ASP.NET Core 2 MVC en CampusMVP, con contenidos actualizados a la última versión del framework, que por fin comenzó a mostrar los signos de estabilidad y madurez que muchos estabais esperando para dar el salto. Como siempre, muchas gracias por el apoyo al gran número de desarrolladores que ya han confiado en él para ponerse al día.

A continuación, en el artículo “Retargeting y multitargeting en proyectos ASP.NET Core ” tratábamos uno de los temas más desconcertantes a la hora de comenzar un proyecto con ASP.NET Core: ¿Debo usar el target .NET Core? ¿O quizás .NET Framework? ¿Y por qué no los dos al mismo tiempo?

Otra muestra más de que las novedades de ASP.NET Core han sido grandes protagonistas este año es el artículo “Flushing asíncrono en ASP.NET Core MVC“, donde mostrábamos cómo era posible ir enviando al cliente porciones de página conforme se iban procesando, en lugar de hacerlo esperar para recibirla de forma completa. Aunque con limitaciones, una técnica muy interesante para escenarios donde queremos reducir el TTFB.

En penúltima posición, un post sobre un “descubrimiento” surgido de un escenario real, y publicado por si podía ayudar a alguien más. Llevaba años usando Fiddler, pero hasta que tuve la necesidad jamás lo vi como una herramienta para jugar con peticiones y respuestas y conseguir hacer cosas impensables. Y a juzgar por los comentarios que me habéis hecho llegar por distintos medios, muchos de vosotros también habéis visto que eso de “Probar scripts en producción sin desplegar nada, y otros usos interesantes de Fiddler dan bastante juego.

WinnerY entrando casi de refilón en el ranking porque se publicó un par de días antes de acabar el año, mis “17 consejos definitivos que todo desarrollador debería seguir para triunfar en el mundo del software“, años de conocimiento y experiencia concentrados en diecisiete pildorillas que sin duda os cambiarán la vida. O visto de otra forma, otra de las tradicionales travesuras del 28 de diciembre que tanto me divierten cada año ;D

Espero que este resumen os sea de interés por si os habéis perdido alguno de estos contenidos en su momento o por si queréis volver a revisarlos. Y ahora, ¡vamos a por el nuevo año!

Publicado en Variable not found.

» Leer más, comentarios, etc...

Koalite

Mis tecnologías del 2017

enero 08, 2018 05:06

Hace tres años, a petición de Alfredo, escribí un resumen de las tecnologías que había usado profesionalmente a lo largo del 2015. El año pasado convertí en tradición ese post con mis tecnologías del 2016, y este año toca seguirla, como me recordaba Paco.

Como no espero que nadie se lea los posts anteriores, vuelvo a empezar con pequeño recordatorio del contexto en que escribo este post.

Se trata de repasar las tecnologías que uso profesionalmente, es decir, no incluyo cosas que me puedan gustar más o menos, o parecer más o menos interesantes, pero que no uso en el Mundo Real™. Esto descarta automáticamente considerar este post como una especie de radar tecnológico o similar de esos que les gustan a algunos.

Además, y esto es importante, me dedico a desarrollar productos, no proyectos. Estos productos son, en su mayoría, desplegados en decenas de miles de clientes de forma intencionadamente manual (a veces los modelos de negocio pueden resultar curiosos). Están pensados para durar años y es importante mantener compatibilidad hacia atrás. Eso implica que las decisiones que tomamos están condicionadas a conseguir y mantener una estabilidad en el tiempo y no podemos andar cambiando de plataforma o reescribiendo aplicaciones en el último framework de moda tanto como nos gustaría.

Las plataformas sobre las que trabajamos son, básicamente, .NET para aplicaciones de escritorio (Windows Forms) y servidores, y unas cuantas aplicaciones web en formato SPA desarrolladas con Javascript o TypeScript.

.NET, servidores y escritorio

La parte de .NET es la que menos cambia. En parte, porque nuestro objetivo a medio plazo es alejarnos al máximo de esta plataforma, y en parte porque es la que supone un mayor coste para actualizar dentro de nuestro parque instalado.

Seguimos utilizando .NET Framework 3.5 SP1 en muchas aplicaciones, lo que nos limita la adopción de algunas nuevas funcionalidades, pero desplegar una versión nueva del framework en un parque tan disperso como el nuestro no es trivial. Si a eso le unimos que todavía hay muchos equipos ejecutando Windows Embedded POSReady 2009, una versión de Windows XP SP3 (y con soporte extendido hasta 2019, por si alguien se lo pregunta), actualizar a “lo último de lo último” no es sólo una decisión técnica, sino también comercial.

Dentro del objetivo de alejarnos de .NET este año hemos dado algunos pasos, reescribiendo una de las aplicaciones Windows Forms en TypeScript y lanzando un nuevo desarrollo basado en Java con Sprint Boot, experiencia, por cierto, bastante satisfactoria.

Para los desarrollos que mantenemos en .NET, que siguen siendo parte fundamental de nuestros productos, mantenemos nuestro clásico stack basado en NHibernate, Castle Windsor, log4net y NUnit. También usamos NancyFX (sobre .NET 4.5) en algún proyecto, aunque tendemos a trabajar directamente con un HttpListener, o incluso un TcpListener + protobuf cuando necesitamos rendimiento extra.

Donde sí nos hemos permitido un salto hacia adelante ha sido en la parte de base de datos. Tras un montón de años, nuestra base de datos por defecto ha pasado de ser SQL Server Express 2005 a SQL Server Express 2014, fundamentalmente por necesidades de aumentar el tamaño máximo de la base de datos. Aun mantenemos compatibilidad con ambas, pero algo hemos avanzando. Tal vez resulte raro que no hayamos pasado a la versión 2016 o 2017, pero desgraciadamente no tienen soporte para Windows 7, que es el sistema operativo preferido por nuestros clientes.

Clientes web

En la parte web tenemos más flexibilidad porque tenemos menos años de desarrollo acumulado que mantener, pero también porque a la hora de desplegar un cliente no necesitas desplegar ningún runtime, así que podemos usar lo que queramos en desarrollo, que a la hora de la verdad es sólo contenido estático servido desde una de nuestras aplicaciones hecha en C# o Java.

Todavía tenemos una aplicación con AngularJS (versión 1.algo infernal), pero todo lo demás está desarrollado con ReactJS. Las versiones de javascript varían dependiendo de la aplicación, desde ES5 hastas ES2015, y en las últimas dos aplicaciones hemos utilizando TypeScript.

Empezamos el año pasado a trabajar en serio con TypeScript y de momento seguimos con él. No sólo eso, si no que hemos convertido una de las aplicaciones principales, que era una aplicación de Windows Forms, en una aplicación web desarrollada con React y TypeScript.

En ese sentido, algunos de los problemos originales que tuvimos con TypeScript, especialmente los relacionados con las versiones de librerías y typings, se han minimizado con el tiempo. Realmente no sabría decir si es porque ahora los typings están más actualizados, porque tienen menos fallos, o porque una vez que montamos todas las dependencias hemos tratado de no tocarlas. Probablmente esto último influya mucho.

Para compilar las aplicaciones web tenemos una mezcla de tecnologías que reflejan la evolución de las modas en el mundillo del frontend. Empezamos con grunt, tuvimos algún gulp que nos acabamos cargando, mucho script npm sencillo y, en los proyectos con TypeScript, webpack.

Cuando no usamos webpack, solemos utilizar browserify como bundler, que sigue siendo una opción excelente por su simplicidad y rapidez. Webpack nos viene bien por la gestión completa de recursos (css, imágenes, código, etc.), pero el precio que se paga en complejidad y en lentitud es muy alto. Actualmente hemos llegado a un punto en que para no desesperarmos tenemos quitados incluso los sourcemaps de TypeScript para que la compilación incremental sea medianamente viable tras aplicar todos los trucos habidos y por haber.

Para la parte de testing en frontend existen muchas estrategias, pero al final a nivel de librerías tiramos de las típicas: jasmine, mocha, chai, protractor y karma (para la parte de angular), nightwatch para tests de extremo a extremo con React. Enzyme, que empezamos a usarlo el año pasado para algunos tests de react, se va cayendo poco a poco (ya lo suponíamos) porque el tipo de test que fomenta no es un tipo de test que nos resulte muy útil.

A nivel de interfaz de usuario, después de utilizar material-ui y las omnipresentes alternativas basadas en bootstrap, últimamente me siento más inclinado a utilizar soluciones de tipo utility first css. No es que usemos ninguna librería concreta para ello, pero que en un mundo orientado a componentes tiene cada vez más sentido frente al css “semántico”.

Teniendo en cuenta que usamos React en bastantes aplicaciones y desde hace ya unos años, puede parecer que lógicamente también usamos React Router, del que he escrito bastante, y alguna librería tipo flux o redux, pero lo cierto es que no. En el caso de React Router, acabamos apostando por minimal router, algo razonable teniendo en cuenta que lo diseñamos para nosotros, y en el caso de flux/redux, nos parece que introducen uan complejidad excesiva y un grado de indirección (o desacoplamiento, si prefieres) muy elevado que hace complicado entender procesos simples. No digo que no sean patrones muy útiles en otros escenarios, pero en nuestro caso utilizando prácticas básicas de reutilización de código en react y tratando de mantener las cosas simples nos está yendo razonablemente bien.

Herramientas varias

En la sección de herramientas, pocas novedades, por no decir ninguna. Youtrack, Subversión y CruiseControl .NET lanzando scripts de msbuild coordinando todo (compilación .NET, compilación web, todo tipo de tests, documentación, instaladores, etc.). Sí, es todo viejuno, pero seguimos sin tener incentivo suficiente para asumir el coste de migración a otras herramientas más modernas (y que además son las que muchos usamos fuera del trabajo).

Para .NET, Visual Studio 2013, que es bastante estable, y para todo lo demás, emacs. Seguramente emacs sea uno de los motivos por lo que tampoco hay mucha variedad de editores en mi vida en los últimos años, ya que en lugar de saltar de un editor a otro, cada vez voy conociendo mejor éste y sacándole más partido.

Conclusión

Visto este post, y especialmente si se considera también el del año pasado, puede parecer que a nivel profesional seguimos haciendo lo mismo de siempre. Nada más lejos de la realidad. Este año ha supuesto un salto importante en nuestra estrategia de producto que ha implicado resolver un tipo de problemas al que hacía tiempo no nos enfrentábamos.

El hecho de haber utilizado tecnologías en las que nos sentíamos cómodos y con las que podíamos ser productivos no es más que un reflejo de eso: tratar de sacar el máximo rendimiento a un contexto determinado. A veces resolver problemas complejos no implica utilizar tecnologías novedosas (y mucho más entretenidas) sino, simplemente, ser capaz de buscar una solución adecuada.

Posts relacionados:

  1. Mis tecnologías del 2015
  2. Mis tecnologías del 2016
  3. Resumen 2017

» Leer más, comentarios, etc...

Variable not found

Los 17 consejos definitivos que todo desarrollador debería seguir para triunfar en el mundo del software

enero 07, 2018 12:35

Aunque por aquellos tiempos ya llevaba bastante tiempo enganchado al desarrollo de software, fue en el año 1992 cuando empecé mi andadura profesional en este mundillo, y he de decir que estos más de veinticinco años han dado para mucho. Poco más o menos, creo que he pasado por todos los roles existentes en el mundo del software, en todas las modalidades laborales posibles: programador, analista, consultor, formador, coordinador de equipos de desarrollo, CTO, empleado, empresario, freelance

Aparte de muchas alegrías y algún que otro disgusto, lo que tengo claro es que esta trayectoria me ha dado una visión bastante amplia de cómo funciona el mundo del desarrollo de software y las personas que trabajamos en él.

WinnerComo guardarme estos conocimientos me parecía demasiado egoísta, he decidido compartir con todos vosotros los que considero que son los diecisiete consejos definitivos que debéis seguir si queréis triunfar en el mundo del desarrollo de software.

Por lo que he ido aprendiendo estos años, seguir estas reglas os llevará a conservar indefinidamente vuestros empleos o clientes, aumentaréis vuestro valor en el mercado, mejoraréis salarios y vuestro grado de felicidad y satisfacción personal crecerá hasta límites insospechados.

He de decir que, antes de compartirlos con todos vosotros, varias personas ya los han seguido y sus vidas profesionales han mejorado considerablemente. Por ejemplo, Juan M. R. trabajaba como programador junior en una conocida cárnica hace 6 meses y hoy dirige el equipo técnico en una startup en San Francisco. También, Nacho G. L. pudo firmar hace poco el contrato fijo con el que soñaba, incluso con un aumento de sueldo. Rafael P. G. era un programador del montón y ahora es un reputado project manager por el que se pelean las mejores empresas del mundo.
“Sin los grandes consejos de José María,
mi vida como desarrollador seguiría siendo un infierno”
– Ricardo M. C., 2017
Podéis ser los próximos en dar el salto, sólo depende de vosotros.

Los 17 consejos definitivos que debes seguir si quieres triunfar en el mundo del desarrollo de software

1. Protege tu creación

El sofware que desarrollas es tuyo y así debes sentirlo y protegerlo: como a un hijo. Ofusca el código, introduce nombre de clases, métodos o variables imposibles de entender, y créalas en carpetas, archivos o lugares insospechados del proyecto. Asegura que nadie pueda tocar ese código salvo tú.

Si lo haces así, estarás gananando un trabajo de por vida, incluso mejor que aprobando unas oposiciones, que seguro que es lo que tu madre siempre quiso para tí. No lo dudes, haz feliz a tu madre.

2. Aparenta ser inteligente

La inteligencia es una virtud escasa, y las empresas luchan por tener cerca personas que destaquen en ese aspecto. Crea algoritmos semimágicos que nadie más pueda entender, utiliza abstracciones aunque no sean necesarias, copia código de otros más inteligentes que tú aunque no lo entiendas; pero ojo, sobre todo, nunca atribuyas el mérito a sus autores reales.

Ya lo dijo Julio César (¡el Romano, no el futbolista!): “además de serlo, hay que parecerlo”. Y en este caso, si no lo eres, al menos aprende a disimularlo.

3. Aparenta saberlo todo

Persona inteligente que lo sabe todoEn la línea del punto anterior, el mundo del desarrollo de software está repleto de mediocres. Los reconocerás fácilmente al ser desarrolladores que usan continuamente Google y Stack Overflow porque son tan inútiles que no se saben de memoria el API completo de .NET o no recuerdan cómo se implementa algo tan trivial como el algoritmo de back propagation de una red neuronal.

Esto te da algunas ventajas porque podrás hacer creer con facilidad que lo sabes todo sólo con que domines un vocabulario básico, un par de palabras clave de moda y sepas emplearlos en los momentos adecuados.

4. No cedas ante intentos de revisar tu código

Normalmente son propiciados por personas que no han escrito una línea de código en su vida y sólo persiguen el objetivo de sacar fallos y avergonzarte, sin comprender el contexto o qué motivos han llevado a tenerlo así.

Porque nuestro código es como el papel higiénico usado: a todo el mundo le parecerá sucio si se lo enseñamos, pero seguro que ellos tampoco tienen una forma más limpia de conseguir el mismo resultado.

5. Usa los últimos frameworks (y si no los hay que te gusten, los inventas)

Súbete al carro de los hypes conforme vayan apareciendo, y procura utilizar siempre lo último. Mejorará tu imagen profesional y creará en la empresa una dispersión tecnológica que te hará imprescindible. O si tienes una empresa, estarás consiguiendo clientes cautivos que no podrán sustituirte por otro proveedor con facilidad.

Si eres programador de frontend, incluso te animo enérgicamente a crear tu propio framework para Javascript. No hay aún suficientes, y crear un marco de trabajo propio te distinguirá del resto de desarrolladores, que son simples ovejas que siguen al rebaño.

En mi caso, ando desde hace algún tiempo creando AnguilarJS, una evolución personal de AngularJS (Angular+Aguilar=Anguilar, ¿habéis visto qué juego de palabras tan ingenioso? ;D) que en los próximos meses seguro que revolucionará la forma en que desarrollamos en el frontend y se constituirá, esta vez sí, como el framework definitivo.

6. Cumple siempre las planificaciones, aunque sea a costa de bajar la calidad

Todo el mundo sabe que es mejor entregar algo que no funcione bien que no entregar nada; tus jefes o clientes sabrán que eres una persona de palabra y sabrán pasar por alto que tal o cual funcionalidad falla. La calidad en el software no es un requisito, sino una característica opcional.

A tu favor juega el hecho de que todo el mundo asume que los fallos son inherentes al proceso de desarrollo de software.

7. No dediques el tiempo enseñando o transfiriendo conocimientos a tus compañeros u otros desarrolladores

Gollum con su tesoroAunque sea poco elegante decirlo tan abiertamente, debes considerar a otros desarrolladores, ya sea de tu empresa o externos, como pura competencia. No dudarán en quitarte el puesto o al cliente en cuanto tengan oportunidad, por lo que no debes alimentar esa posibilidad.

Sé práctico y guarda tus conocimientos cual Gollum con su Anillo Único.

8. No inviertas tiempo en automatizar tareas como despliegues o testing

Es lógico, puesto que estarás favoreciendo que las máquinas algún día nos dejen sin trabajo a todos. Crea arquitecturas complejas en las que realizar este tipo de tareas automáticas sea imposible, o al menos aparente serlo.

Además de ayudarte a ti mismo, estarás ayudando indirectamente al sector porque no podemos dejar que las máquinas nos sustituyan ni siquiera en este tipo de tareas.

9. Exige a los demás más que a ti mismo

Si te exiges mucho a ti mismo en algún momento pondrás al descubierto tus carencias. Evítalo. Es mejor hacerlo con el resto de personas, porque esto te hará destacar sobre ellas.

Aprende a descubrir el límite de cada colaborador y llévalo hasta él continuamente. Si no aguanta, es que no merece trabajar contigo; haz lo posible por deshacerte de él y sustitúyelo por otro con más energía.

10. Dedica tiempo a amueblar apropiadamente tu zona de confort

Hazla tan cómoda que incluso otros desarrolladores quieran entrar en ella a tomar café todos los días; no hay nada como ser anfitrión para ganar el respeto de los compañeros y asegurar tu liderazgo.

Una vez la construyas, intenta no salir de ella porque en el exterior serás débil y así lo percibirá el mundo.

11. Las buenas prácticas están sobrevaloradas

La gente usa principios como SOLID porque creen que introducir esas palabras en su vocabulario habitual les hace ser más cool y aparentar ser mejores profesionales, pero no es así: simplemente lo están usando como escudo para ocultar su propia incompetencia. Los programadores de verdad simplemente crean buen software, no necesitan que ningún purista les diga cómo hacerlo y, mucho menos, seguir prácticas que unos señores, que probablemente no han programado mucho, han dado en considerar como buenas.

Por tanto, si el acoplamiento es necesario, no dudes en acoplar. Si debes duplicar código, duplica código sin remordimientos de conciencia. Y, por supuesto, optimiza tu código conforme lo vas creando. Sólo los más grandes crean directamente código que araña nanosegundos y exprime al máximo las capacidades de las modernas CPU.

12. No intentes entender a los usuarios de tus aplicaciones

Perfect user interfaceTodos sabemos que los usuarios son seres creados por el mismísimo diablo con el único fin de fastidiar a los desarrolladores. Cuando tienes alguna experiencia sabes de sobra cómo deben ser tus aplicaciones; el que no sea capaz de entenderlas quizás no sea merecedor de utilizarlas.

Y recuerda que las mejores interfaces son aquellas que surjen sobre la marcha, sin mucha reflexión ni estudio previo, sólo usando tu intuición de desarrollador.

13. Despliega a producción todos los viernes

No sé de dónde habrá salido la leyenda urbana cuya moraleja es que un sistema jamás debe subirse a producción un viernes. Hazlo y verás qué bien te sientes. Ganarás fines de semana de paz, pues llegarás a ellos con la tranquilidad de haber terminado las tareas semanales y podrás comenzar desde cero el lunes siguiente.

Y es que no hay nada como el olor de una aplicación compleja desplegada a producción un viernes a las seis de la tarde.

14. Vuelve al desarrollo en cascada

Se ha demostrado sobradamente que el agilismo es un mito. Nada confunde más a los clientes que unos plazos inciertos, la ausencia de documentación y entregas continuas de un producto sin acabar.

Y por no hablar de la pérdida de tiempo que suponen las reuniones periódicas, como las típicas standup daylies de Scrum; en 2016, científicos de la Universidad de Harvard determinaron que un equipo de 6 desarrolladores que se reúnen durante 15 minutos al día, computan un total de 500 horas/hombre al año. ¡Imagina lo que podrías hacer en ese tiempo desaprovechado!

Las miles de aplicaciones en el mercado creadas usando desarrollo en cascada no pueden estar equivocadas. ¡Desarrolla en cascada como si no hubiera un mañana!

15. Controla tu propia infraestructura

Sinceramente, esto de la nube me parece una patraña propiciada por los grandes players del mercado, a los que le va mucha pasta en ello, y no creo que tenga futuro.

No hay nada más cómodo y fiable que tener junto a tu mesa un servidor en el que alojar tus aplicaciones y servicios. Si quieres escalar, compra un servidor más grande. Si el servidor se cae, vas y lo levantas. Como véis, todas las ventajas de la nube tienen una solución tradicional en el mundo que ahora los hipsters llaman on premise.

Crea tus aplicaciones para que funcionen bien en esa máquina y no te preocupes por otras cosas misteriosas como las arquitecturas distribuidas, pues seguro que no necesitarás utilizarlas. Y por supuesto, no uses contenedores: son puro hype, nada como una máquina de verdad para ver si las cosas funcionan.

16. En cuanto puedas, deja de programar

Seguro que nunca has visto programadores felices, así que lo mejor que puedes hacer es dar el salto a puestos de gestión cuanto antes. Si lo haces, verás que se te da bien porque, por tus conocimientos técnicos, seguro que sabrás exprimir a los demás y obtener el máximo beneficio de su trabajo.

Nadie con más de treinta y cinco años debería seguir desarrollando. Cuando conozcas a alguien así, piensa en el Principio de Peter: si está ahí es porque ha alcanzado su nivel de incompetencia y no puede ascender más en la jerarquía. Y por esa misma razón, podrás comprobar fácilmente que la mayoría de ellos son auténticos patanes en su trabajo.

17. Memoriza estos consejos y aplícalos en tu día a día

Porque si no es así, nada de esto habrá tenido sentido. Debes aprender de memoria estas valiosas recomendaciones y repetirlas diariamente como un mantra. Consigue interiorizarlas de forma que las incluyas en tus pautas de comportamiento diarios.


[Actualización 07/01/2018] Permitidme el consejo 18: no sigáis los consejos anteriores. Es un post publicado el 28 de diciembre, día de los Santos Inocentes, y básicamente os recomienda que hagáis auténticas barbaridades. Probablemente, aunque no os aseguro nada, os irá bastante mejor si hacéis justo lo contrario ;)



¡Y esto es todo! Espero que sepáis valorar estas recomendaciones en su justa medida, porque, si las seguís, os aseguro que os cambiarán la vida.

Ya me lo agradeceréis ;)

Publicado en Variable not found,
Imágenes: Pixabay,

» Leer más, comentarios, etc...

Blog Bitix

Explicación del fallo de seguridad Meltdown y Spectre en los microprocesadores Intel

enero 07, 2018 12:30

Los procesadores Intel se han visto afectados por un grave error de seguridad debido a que fueron diseñados con ejecución especulativa sin tener algunas consideraciones de seguridad, técnica empleada para aumentar el rendimiento pero que tiene efectos colaterales en la cache que pueden se aprovechados para realizar ataques side-channel con los que leer el contenido de la memoria del kernel, independientemente del sistema operativo utilizado.

El año 2018 ha empezando haciéndose público uno de los peores bugs de seguridad que afecta a absolutamente todos los procesadores Intel que esta compañía ha fabricado en la última década, denominado Meltdown y su variante Spectre, el error tiene su propio nombre, logotipo y página web. Un error de diseño en los procesadores que solo se puede corregir reemplazando el microprocesador o modificando los sistemas operativos aunque se especula con una pérdida de rendimiento en ciertas cargas de trabajo, entre un 5% y un 30%. El error es tan grave que permite leer a un programa la memoria del núcleo del sistema operativo que debería estar protegida. En la memoria del kernel residen las claves de acceso a sistemas o datos sensibles que obtenidos y utilizados pueden ocasionar graves problemas de seguridad con consecuencias económicas o de acceso no autorizado a información. Este error es tan grave que deja al viejo conocido fallo de la división de los Pentium a la altura de chiste. Hace unos meses por si fuera poco se conocía otro error de seguridad en el Management Engine (ME) de Intel.

Meltdown Spectre Logotipos de Meltdown y Spectre

Reemplazar todos los microprocesadores es tremendamente caro además de que primero hay que diseñar y fabricar unos que estén exentos del bug que lleva tiempo, meses o años hasta que estén preparados, por lo que la solución hasta el momento pasa por hacer modificaciones en el software y en los sistemas operativos, compiladores y programas para resolver o mitigar el problema. En el sistema operativo la solución consiste en separar el espacio de direcciones del kernel de la de los programas, sin embargo, cada vez que el microprocesador cambia entre un espacio de direcciones a otro hay una penalización en tiempo por lo que en ciertas cargas de trabajo muy intensivas en las que se cambia frecuentemente de contextos como operaciones de red, de almacenamiento rápido o E/S el rendimiento se ve afectado. Para un usuario doméstico, ofimático o juegos la perdida de rendimiento será insignificante y no será apreciable ya que en estos casos el microprocesador no trabaja a la máxima carga o no está cambiando frecuentemente del espacio de direcciones del kernel al de usuario. En grandes centros de datos como la computación en la nube de Amazon Web Services, Google Cloud Platform o Microsoft Azure el rendimiento será más apreciable.

Como usuarios domésticos para estar protegidos conviene descargar únicamente software de fuentes confiables pero para los usuarios empresariales con sus servicios en la nube en donde los sistemas están aislados pero usando infraestructura compartida y con el descubrimiento de este bug es más grave si no se parchea, los proveedores de infraestructura en la nube ya han planificando tareas de mantenimiento y reinicios obligatorios.

Intel AMD ARM

Técnicas para aumentar el rendimiento

Los microprocesadores modernos implementan varias técnicas para aumentar el rendimiento. Una de las mas simples es aumentar la frecuencia de trabajo del microprocesador, uno de los primeros Pentium trabajaba únicamente a 100 Mhz y los actuales llegan hasta los 3 Ghz, casi 30 veces más. Pero aumentar la frecuencia solo es posible hasta cierto límite a partir del cual el microprocesador se calienta mucho y consume mucha energía. Por lo que hay que emplear otras técnicas al mismo tiempo.

Otra de las mas simples es reducir el tamaño de los transistores, unos transistores más pequeños hace que sea posible incluir más transistores en el mismo espacio físico para incluir caches de mayor tamaño o nuevas funcionalidades, con más velocidad y con menor consumo de energía. El tamaño de los transistores de los Pentium originales era de 800 nanómetros e incluía 3.1 millones, los Intel Core de octava generación se fabrican a 14 nanómetros incluyendo unos 5000 millones, unas 60 veces más pequeños. Aún así cada vez es más difícil cumplir con la ley de Moore ya que se está llegando a límite físico de los átomos de los materiales, consistía en que cada dos años se duplica el número de transistores de un microprocesador.

Con la ayuda de unos transistores más pequeños y más espacio se aprovecha para aumentar el rendimiento incluyendo más núcleos de cómputo. Pero para aumentar el rendimiento de un núcleo de cómputo individual o el IPC se emplean otras técnicas como utilizar múltiples pipelines para ejecutar varias instrucciones simultáneamente, ejecución fuera de orden para reorganizar las instrucciones y la ejecución especulativa para mantener llenos esos pipelines.

Escalar

En un microprocesador escalar se ejecuta una instrucción por ciclo, por ejemplo, en esta secuencia de instrucciones que realizan unas sumas se tardarían 6 ciclos de reloj. A estos microprocesadores que ejecutan una instrucción por ciclo de reloj se les denomina escalares, siendo ejemplos el Intel 486 y el ARM1176 usado en la Raspberry Pi 1.

Superescalar

En un microprocesador con dos pipelines o superescalar se pueden realizar varias operaciones simultáneamente, es decir, mientras se realiza la primera operación en la variable m se realiza al mismo tiempo la segunda operación de n, con lo que estas operaciones podrían completarse en únicamente tres ciclos de reloj con la siguiente equivalencia de programa. Ejemplos de microprocesadores superescalares son el Intel Pentium y los ARM Cortex-A7 y Cortex-A53 estos últimos usados en la Raspberry Pi 2 y 3 respectivamente.

Sin embargo, hacer la suma de o y x al mismo tiempo no es posible ya que antes de calcular x hay que calcular o debido a que uno de los operandos en la suma de x es o, es decir, hay una dependencia en estas instrucciones y se han de ejecutar una después de otra. Con lo que en vez de tres ciclos habría que conformase en ejecutar estas instrucciones en cuatro ciclos.

Fuera de orden

Los microprocesadores fuera de orden reordenan las instrucciones de la forma adecuada para que el programa sea equivalente pero manteniendo los pipelines llenos. Cambiando el orden entre las instrucciones x e y se consigue ejecutar las instrucciones en tres ciclos de reloj. Ejemplos de microprocesadores fuera de orden son el Pentium 2 y siguientes microprocesadores Intel y AMD incluyendo varios ARM Cortex-A9, A15, A17 y A57.

Predicción de salto y ejecución especulativa

Los programas incluyen saltos con sentencias condicionales if o de bucle. Los microprocesadores tratan de adivinar si una sentencia de salto se producirá o no (con heurísticas y son bastante buenos acertando) para recuperar y tener preparadas las siguientes instrucciones. Mantener los pipelines llenos es difícil al aumentar su número a tres o cuatro. Para tratar de mantenerlos llenos los microprocesadores usan la predicción de salto y van ejecutando las instrucciones desechando las operaciones si finalmente no se acierta en el salto pero habiendo aumentado el rendimiento si se ha acertado, realizan ejecución especulativa de las instrucciones.

En este otro caso, v depende de u y u depende de t de modo que un microprocesador superescalar sin ejecución especulativa tardará tres ciclos computando t, u y v para determinar el valor de v en la sentencia condicional if (en otro ciclo) momento en que pasa otros tres ciclos calculando w, x e y, en total 4 o 7 ciclos dependiendo de si hay salto en la sentencia condicional.

Si el predictor de salto determina que es probable que la condición sea cierta la ejecución especulativa reordena el programa de la siguiente manera:

Y con la ejecución superescalar se mantiene los pipelines ocupados de modo que el ejemplo tiene la siguiente equivalencia y tardando aproximadamente 3 ciclos cuando antes se necesitaban 7.

Cache

Los microprocesadores son muy rápidos comparados con la memoria o el acceso al almacenamiento secundario. Un Cortex-A53 de una Raspberry Pi puede ejecutar una instrucción en 0.5 nanosegundos pero el acceso a memoria costar 100 nanosegundos. Esto no es bueno pero por fortuna los accesos a memoria siguen patrones, accediendo repetidamente a variables recientemente accedidas y accediendo a variables en posiciones cercanas, de forma que colocando estas variables en una cache más rápida y cercana al procesador que la memoria principal se mitiga en gran medida el problema.

Relación entre ejecución especulativa, cache y Meltdown y Spectre

La ejecución especulativa tiene el efecto colateral de colocar datos en la memoria cache del microprocesador y esto es utilizado para realizar una forma de ataque side-channel. Desde el punto de vista de Meltdown y Spectre y la ejecución especulativa lo importante es que midiendo el tiempo que tarda el acceso a memoria se puede conocer si el dato está en la cache (tarda poco) o no (tarda mucho).

u tiene una dependencia sobre t y v sobre u con lo que el microprocesador usando la superescalabilidad, la ejecución fuera de orden y ejecución especulativa acabaría transformando el programa en la siguiente secuencia de operaciones:

El microprocesador lee de el valor de una dirección del kernel de forma especulativa pero el fallo en la operación de acceso no se produce hasta se conoce el valor de v utilizando en la sentencia condicional no es cero. Limpiando la cache previamente y haciendo que v de cero para que no se produzca la excepción con los valores adecuados de las variables (a, b, c, d) la ejecución especulativa de v, y_ = u+d, user_mem[x_] producirá un acceso a la dirección de memoria 0x000 o 0x100 dependiendo del valor del octavo bit recuperado en el acceso ilegal a la dirección de memoria kern_mem[address]. El ataque side-channel se produce midiendo el tiempo que tarda una instrucción posterior que utilice estas direcciones, si está o no está en la cache (por el tiempo que tarda) determina a que dirección de memoria se ha accedido y cual es el valor del octavo bit de una dirección del kernel. ¡Felicidades has leído un bit de la memoria del kernel!. Bit a bit y con tiempo se puede leer todo el contenido de la memoria del kernel aplicando esta operación millones de veces.

Notas finales

Los microprocesadores ARM1176, Cortex-A7, and Cortex-A53 usados en la Raspberry Pi no se ven afectados por el Meltdown ya que no poseen ejecución especulativa, los AMD Ryzen tampoco se ven afectados por el Meltdown ya que aunque si soportan ejecución especulativa al contrario de Intel la ejecución especulativa no se permite entre diferentes anillos de seguridad, el kernel se ejecuta en el anillo 0 y las aplicaciones en el anillo 3. Sin embargo, una variante de Meltdown es Spectre que es el mismo caso pero en vez de con la memoria del kernel con la memoria de otra aplicación. Como las aplicaciones se ejecutan en el mismo anillo en este caso los AMD Ryzen y algunos modelos de ARM si se ven afectados por Spectre al igual que también los Intel.

La ejecución especulativa hace más rápidos los microprocesadores pero habiéndose descubierto este fallo muy inseguros en el caso de los Intel ya que se ve afectados por Meltdown y Spectre a menos que se implementen parches por software ya que por microcódigo no es posible darle solución. Meltdown es más grave pero se puede corregir modificando el kernel aún con una pérdida de rendimiento, Spectre es más difícil de explotar pero más difícil de corregir y lo que se hará en este último caso es mitigar el problema modificando el sistema operativo, compilador y aplicaciones.

Intel tiene un problema importante, con AMD y sus Ryzen a buen precio, con buen rendimiento y… sin el problema del Meltdown. Para corregir el fallo en el diseño de la arquitectura del hardware Intel va a tener que rediseñar en parte su arquitectura y esto le va a llevar meses hasta tener preparados nuevos modelos de microprocesadores sin el error.

En el kernel de Linux 4.14.11 ya se han aplicado varios parches al igual que posteriormente se implementarán en Windows y macOS. Yo como usuario de Linux con un Intel Core i5-3210M que posee la característica pcid y esa versión del kernel no he notado ninguna perdida de rendimiento apreciable.

» Leer más, comentarios, etc...

Picando Código

Cómics que estoy leyendo en 2018 – Parte 1: Marvel

enero 05, 2018 12:45

Desde que me mudé a Escocia empecé a seguir algunas series regulares de cómics. Tener tiendas de cómics a la mano donde todos los miércoles se celebra el Día de Cómics Nuevos (New Comic Book Day) hace que parte de mis ingresos sean destinados a la colección de historietas. Ser como un niño con sueldo de adulto es peligroso…

Como siempre vengo leyendo más que nada Marvel Comics. No soy de los que cree en la rivalidad entre Marvel y DC Comics, simplemente fueron los cómics que más leí cuando empecé y sus personajes tienen un valor mayor para mí. Pero trato de leer de todo un poco para poder disfrutar más cosas. En este primer post comento un poco lo que vengo leyendo y cómo se está desarrollando el universo Marvel desde el año pasado hasta estos días.

Marvel Generations

Generations fue una serie limitada de 10 números, cada uno con un equipo creativo distinto. En ella varios personajes clásicos de Marvel arman equipo con sus versiones más modernas. Más que nada basado en gustos personales, compré sólo 5 de las 10: Captain Marvel, Thor, Spider-Man, Hulk y Captain America.

Marvel Generations

Carol Danvers (Captain Marvel), Jane Foster (Thor), Miles Morales (Spider-Man), Amadeus Cho (Hulk) y Sam Wilson (Captain America) se enfrentan a sus pares de un pasado donde no los conocen: Mar-Vell, Odinson, Peter Parker, Bruce Banner y Steve Rogers. Destaco Captain Marvel por traer de nuevo a Mar-Vell, el difunto Captain Marvel original que es de los pocos personajes que todavía no ha vuelto a la vida. El número de Hulk me ayudó para conocer el nuevo Totally Awesome Hulk Amadeus Cho. Y todo lo que escriba Jason Aaron de Thor (como es este caso) es generalmente un 10/10.

Se puede conseguir la colección entera en Amazon versión tapa dura y versión Kindle. Es un buen aporte a la colección y fue un excelente punto de arranque para mí para poder arrancar series nuevas, ya que todo sirvió de introducción a lo que vino después. Generations preparó las cosas para…

Marvel Legacy

Marvel Legacy

Un “relanzamiento” que “no es reboot” de varios títulos de Marvel. La idea fue similar a lo que hizo DC con Rebirth, (término que ya Marvel había usado en los 90’s y no estaría mal recordar un día de éstos en el blog). No he he leído nada de DC Rebirth todavía, pero eventualmente hay varias series que me gustaría revisar. El objetivo con estos relanzamientos es devolver un poco el enfoque a lo que fueron los super héroes centrales de Marvel en su momento, regresando el status quo y reencarnando a algún que otro personaje fallecido (nada nuevo y totalmente esperable, pero todavía no ha vuelto Mar-Vell 😢).

Legacy #1 es un número “autoconclusivo”. Si bien no hay que tener demasiado conocimiento previo de los eventos hasta ahí, abre varias historias en paralelo para los héroes Marvel en esta nueva etapa. Además de algunos títulos nuevos, aparecieron algunos #1 y quedaron los que no cambiaron su numeración. Pero la etiqueta Legacy las definió como buenos puntos de arranque para nuevos lectores. Fue así que me engancharon con varias series 😬
Se sintió realmente como un redescubrimiento de Marvel Cómics después de estar alejado de las series actuales por un tiempo.

The Mighty Thor

Mi regreso a los números mensuales de Thor coincidió con al arranque de Thor: God Of Thunder por Jason Aaron y Esad Ribić en 2012. De las mejores series que he leído y sin duda una de las mejores versiones del dios del trueno. Por suerte Aaron sigue escribiendo a Thor, quien desde 2014 viene siendo Jane Foster. Legacy coincidió con Thor #700, iniciando el arco The Death of The Mighty Thor. Jane Foster tiene cáncer y en el contexto de Legacy, no es arriesgado suponer que el Thor original Odinson volverá a ser digno de llevar a Mjölnir y tener el protagónico del título.

Voy sólo 3 números de la serie y es de las que sin dudas pienso seguir. La primera parte es un gran número de colección, como no podía ser de otra manera. Con guión de Jason Aaron, participan artistas varios incluyendo al clásico Walter Simonson. Es a la vez un homenaje al pasado y como buen número introductorio, prepara las cosas para lo que se viene. Los dos siguientes que leí siguen manteniendo un nivel muy bueno y cada uno te deja con ganas de leer el próximo. Si bien se disfrutan individualmente mes a mes, ésta es de las series que también va a valer la pena leer de un tirón cuando esté cerrado el arco. Tanto la historia como el arte en cada número son excelentes.

The Incredible Hulk

 

Captain America

Sam Wilson venía siendo el Captain America hasta que volvió Steve Rogers, que en Secret Empire resulta ser un agente de Hydra pero después resultó que no era tan así. Ahora Steve necesita encontrar su lugar en un mundo que ya no confía en él y le teme. El nombre del escritor fue lo que me convenció de empezar a ver cómo venía la mano con esta serie: Mark Waid, uno de mis autores favoritos.

Por ahora he leído los 2 primeros números y viene bastante bien. Es de los títulos que más muestra ese sentimiento de volver a las raíces de Legacy. Busca rescatar los valores reales que hacen del Capi un héroe. Un arte caricaturesco y una paleta de colores muy particular le dan gran identidad a esta serie. Las dos historias hasta ahora me han resultado entretenidas y reitero, rescata esa esencia que hace de Steve Rogers un personaje interesante.

Spider-Man

Spider-Man fue de los primeros personajes que empecé a leer en cómics, y sigue siendo de mis preferidos. En el universo Marvel actual, conviven más de un arácnido:
Peter Parker en:
Amazing Spider-Man por Dan Slott.
Spider-Man vs. Deadpool por Robbie Thompson.
Peter Parker: The Spectacular Spider-Man por Chip Zdarsky.
Miles Morales con su título Spider-Man, y por último, Ben Reilly -el clon de Peter Parker- en The Scarlet Spider por Peter David.

Me gustaría seguirlas todas, pero no da el bolsillo. Estoy siguiendo la serie principal y la de Zdarsky. En particular me interesa la de Peter David porque es otro autor cuyo material me ha gustado mucho tanto con Hulk como Spider-Man 2099. Spider-Man con Miles Morales es otra serie que me gustaría seguir, pero creo que eventualmente tendría que ponerme a leer todo sobre el personaje a través de colecciones. El único título que no me llama tanto es el crossover con Deadpool.

The Amazing Spider-Man

La serie principal a cargo de Slott se pone interesante en Legacy, arrancando en el #789. Escribir este número me hizo recordar que se viene el #800, y pensar que hace poco seguía la serie y compré el #700… Hasta recientemente Peter Parker se había transformado en un nuevo Tony Stark, explotando su capacidad científica para hacerse un empresario exitoso. Por suerte -y acatando la premisa de Legacy-, todo eso quedó en el pasado y Peter vuelve a encontrarse con su mala suerte, pierde su compañía y termina durmiendo en el sofá de Bobbi Morse (Mockingbird). La impresión que me dejó fue el “volvió el Spider-Man de antes”, el evidente objetivo de Marvel con estos relanzamientos.

Lo malo es que ya arrancaron con los Crossovers. Para seguir la historia actual Venom Inc., tuve que comprar números de Venom. Seguramente pueda leer la historia coleccionando solamente los números de ASM, pero no es lo mismo…

Peter Parker: The Spectacular Spider-Man

Me generó mucha expectativa Peter Parker: The Spectacular Spider-Man por Chip Zdarsky, y estoy más que conforme. Además de darle un aire fresco al personaje, es todavía más una vuelta a su esencia. El humor de Zdarsky combina perfectamente con el arácnido, y cuando la cosa se pone seria sabe por dónde agarrar. Arrancó con el #1 pero retomó la numeración antigua en el #297 después de una pateada de tablero en el #6. Otro de mis títulos preferidos, sumamente recomendable. Los primeros 6 números ya están coleccionados en paperback, Kindle y Comixology.

Avengers

Una de las series que más he coleccionado y seguido: Avengers. Suelen ser el hilo conductor de los eventos Marvel y dan un panorama de los personajes y eventos que dirigen este universo. Actualmente está escrita por Mark Waid, que como si éste título y Cap fueran poco, también se encarga de Champions: Ms. Marvel, Nova, Spider-Man (Miles), Hulk, Viv Vision y Cíclope (del pasado, no el Scott Summers sorete de la actualidad) en un grupo alternativo a los Avengers. La mención viene a que Legacy arranca con un crossover entre estas dos series: Worlds Collide.

Avengers, Champions

Podría decir que no es exactamente el mejor punto de arranque para conocer la dinámica actual de los dos equipos. Si bien el primer número de Avengers me gustó y también me dejó esa idea de “volvió el Marvel de antes”, no me terminó de convencer el arco en general. Es una historia con mucha acción pero parece abarcar mucho y apretar poco. Si bien tiene interacciones y desenlaces interesantes, para ser una historia de Mark Waid y la primera para muchos nuevos lectores, se queda corta. El enemigo principal es High Evolutionary, y parece desperdiciado al estar pasando tanta cosa. Pero voy a esperar a leer el último número para hacer un balance final.

Parece que el “reboot” real de Avengers arranca este mes con Avengers No Surrender. A partir de enero, se transforma en un título semanal en una saga de 16 números que une los tres títulos Avengers y sus autores en uno sólo: Avengers (Mark Waid), U.S. Avengers (Al Ewing) y Uncanny Avengers (Jim Zub). La protagonizan personajes de las tres series y vengadores del pasado y el presente. Me hace acordar a la tan adorada serie de Busiek y Perez en 1998… Si viene por ahí la mano cuenten conmigo. También se promete el regreso de más de un personaje que los fans vienen pidiendo (cantado Bruce Banner) y uno que ni siquiera sabemos que queremos (¿?). Estare atento a cómo se desarrollan las cosas.

The Incredible Hulk

Otro de mis personajes favoritos de Marvel. Por primera vez estoy leyendo al “nuevo” Hulk, Amadeus Cho (antes conocido como Totally Awesome Hulk). Recién voy dos números de este título que vuelve a ser escrito por Greg Pak, quien lleva a Hulk de nuevo a Planet Hulk. Por ahora no creo poder emitir un juicio muy competente al respecto. Me entretuvo leerlo, pero no me gustó como otras tantas cosas que he leído de Hulk. Parece que se quiere poner interesante con el monstruo verde imponiéndose un poco y planteando ese eterno dilema de la doble personalidad. Pero por ahora estoy “esperando a ver si se pone bueno”, con posibilidad de dejarlo si no cambia mucho.

The Incredible Hulk

Conclusión

Además de lo mencionado acá, también he leído alguna que otra cosa de Inhumans. Pero guardo los comentarios para la serie de posts Leyendo a los Inhumanos. También he leído miniseries de otras compañías que iré comentando en otro momento. En la próxima parte de este post les cuento qué he leído de DC y demás. También estoy escribiendo sobre el regreso a un grupo de personajes que nunca me enganchó demasiado: X-Men.

Continuará…

» Leer más, comentarios, etc...

Blog Bitix

Artículo #5 de Yo apoyo al software libre

enero 03, 2018 12:00

La última donación que hice a algún proyecto de software libre fue en mayo del 2017, desde entonces he recibido algunos ingresos por la publicidad AdSense que incluyó en el blog. Los ingresos por AdSense están empezando a ser bastantes constantes de al menos 1€ al día con lo que al mes se convierten en 30€, un més bueno en 50€, con lo que cada dos o tres meses recibo un ingreso.

También hace unos meses escribí un artículo patrocinado con enlaces de afiliación sobre varios cursos de formación de KeepCoding, la mayoría de usuarios se registran en los cursos gratuitos y ya cuando había perdido las esperanzas de que alguien comprase algún curso pagando un par de usuarios se registraron usando mis códigos de afiliado.

En esta ocasión los proyectos a los que he hecho una donación han sido LineageOS y Replicant, dos distribuciones de Android que permiten dar una segunda o tercera vida a móviles que desde hace tiempo se han quedado sin soporte oficial del fabricante ni de Google ni parches de seguridad con lo que ello supone en estos dispositivos que se están convirtiendo en cada vez más imprescindibles. Esto genera dispositivos no actualizados, tarde o temprano potencialmente inseguros y la conocida fragmentación en la plataforma Android.

LineageOS Replicant

Muchos móviles siguen siendo perfectamente útiles aún pasados más de dos años. En mi móvil, un Samsung Galaxy S3 (i9300) del año 2012 con 4 núcleos y un solo giga de memoria RAM con no tantos años de vida pero que ya podría considerarse obsoleto debido al gran avance en capacidades que experimentado los smartphones usaba la extinta CyanogenMod en su versión 10.2 que incorporaba Android 4.4 (KitKat) cuando de fábrica tenía 4.1 o 4.2 (Jelly Bean). En alguna ocasión he pensado en actualizarlo a alguna versión más reciente de Android aunque por el poco uso que hago del móvil ya me era suficiente con la versión 4.4 de Android, también porque me daba un poco de pereza hacer la actualización aún no siendo demasiado complicado y no tardando mucho sabiendo lo que hay que hacer. En estas dos distribuciones de Android el Samsung Galaxy S3 está soportado.

LineageOS

Se trata de la versión heredera de CyanogenMod, soporta una gran cantidad de terminales que con el paso del tiempo va aumentando aunque hasta el momento no he visto que se haya lanzado una versión estable de alguno de ellos, en cualquier caso en el estado actual funcionará bastante bien en cualquiera de los terminales.

Finalmente, ayer precisamente me decidí a instalar LineageOS 14.1 que incorpora una de las últimas versiones de Android, 7.1, y mucho más reciente que la que tenía, no lo había hecho hasta el momento por eso de no tener una versión estable y no estaba seguro de que tal funcionaría en un móvil tan «antiguo». Después de haberlo hecho he comprobado que funciona de forma perfectamente fluida aún con la poca cantidad de RAM que tiene para los tiempos actuales en los que los móviles ya incorporan entre 2 y 4 GiB, incluso mejor ya que funciona la cámara frontal que antes con CyanogenMod no.

Se ofrece de forma gratuita pero los servidores que son necesarios para el desarrollo y el mantenimiento de los sitios web tienen unos costes, este es el detalle de los costes de LineageOS.

CynogenMod 10.2 y LineageOS 14.1

Replicant

Es la distribución de Android recomendada por la FSF. Uno de sus objetivos es los teléfonos móviles respeten la privacidad de los usuarios no realizando seguimiento, posicionamiento y no compartiendo datos e incluyendo en el sistema operativo solo elementos libres. Y es que prácticamente todas las aplicaciones quieren acceder a los contactos, fotos, mensajes SMS, llamadas y otros varios permisos que las aplicaciones solicitan y hay que conceder. Esta distribución de Android es para aquellos le dan gran importancia a la seguridad, privacidad y libertad en estos dispositivos que podrían calificarse de seguimiento y vigilancia. Y por ello esta distribución es importante.

Está basado en LineageOS 13 y Android 6 quitándole los componentes que no mantienen la privacidad y proporcionándole sustitutos. No soporta tantos dispositivos como LineageOS aunque están varios que fueron y son muy populares.

Replicant 6

Comprobantes de las donaciones

En ambos casos las donaciones que he hecho han sido de 15€.

Donación LineageOS y Replicant

Donaciones que he realizado hasta el momento:

  • 2015/12: FSFE 40€
  • 2016/09: Wikipedia 10€, Firefox 10€
  • 2017/01: elementary OS 10€, Libre Office 10€, Arch Linux ARM 10€
  • 2017/05: GNOME 15,31€, VideoLAN (VLC) 10€, Arch Linux 0,31€
  • 2018/01: LineageOS 15€, Replicant 15€

» Leer más, comentarios, etc...

Picando Código

List Categories: Plugin para WordPress

enero 03, 2018 11:00

List Categories es un plugin bastante simple para WordPress que permite listar categorías en un post o página con un shortcode:

[categories orderby=count]

Es básicamente una interfaz a través de la API de shortcodes para la función de WordPress wp_list_categories. Cada uno de los parámetros de wp_list_categories se mapea a un parámetro dentro del shortcode del plugin. Por ejemplo en este blog el código [categories child_of=10] (la categoría con ID 10 es software libre) genera lo siguiente:

  • Categorías
  • Dada la popularidad de List Category Posts (mi otro plugin de WordPress), un pedido de ayuda de un usuario me llevó al desarrollo de List Categories. List Category Posts permite listar posts pertenecientes a una categoría con un shortcode, mientras que éste permite listar categorías con el enlace a cada categoría. Dados los términos y los nombre de los plugins, es comprensible un poco de confusión…

    https://github.com/picandocodigo/List-Categories

    El plugin ya lleva unos 3 años de publicado pero por alguna razón nunca había escrito al respecto. Ha tenido varios reviews positivos. Así que si bien es bastante sencillo y usado por poca gente, es bueno saber que a más de una persona le resulta útil y le facilita un poco el desarrollo de blogs con WordPress. No lo he actualizado demasiado, pero mientras no hayan cambios importantes en la función, no sería muy necesario.

    Pueden descargar el plugin desde su panel de administración de WordPress (buscando “List Categories”), o descargarlo desde el sitio web de WordPress. El código fuente está disponible en GitHub (además del repositorio oficial de plugins de WordPress).

    » Leer más, comentarios, etc...

    Arragonán

    Un repaso a mi 2017

    enero 03, 2018 12:00

    Vuelta al ejercicio de pensar en lo que dio de sí el año, enfrentarlo respecto a los objetivos auto-propuestos en el enero anterior y plantear algunos nuevos para este que acaba de empezar. Así que vamos a ello.

    Con Coding Stones trabajamos en un par de productos bastante grandes; o al menos bastante más grandes de lo que podríamos haberlo hecho individualmente como autónomos. Aparte de mucho trabajo en el backend, tuvimos que seguir poniéndonos las pilas en el frontend para tener un flow similar al de back. Durante el año también salieron algunas formaciones y acompañamientos sobre cuestiones metodológicas y temas de arquitectura/testing en frontend. Además a finales de año grabamos varios cursos con los amigos de Codely TV. Así que hemos conseguido la continuidad que nos habíamos marcado.

    En OutreachTool hemos conseguido tener una aplicación web que nos ha permitido hacer varias consultorías evitando usar las hojas de cálculo que tan dolorosas resultaban a mis compañeras. La segunda mitad del año nos centramos más en automatizar el delivery final (generación de KPIs como presentación, informe…) que en mejorar la experiencia de uso de la herramienta, así que el reto para este año es ese, que consultores que no estén relacionados directamente con la empresa empiecen a usar la herramienta. Así que objetivo cumplido, pero igual un poco a medias.

    Aunque he vuelto a jugar a fútbol, aún sigo arrastrando muchas molestias de mi lesión en el cuádriceps, así que me lo estoy intentando tomar con calma. Sí he conseguido una rutina relativamente buena yendo a entrenar a boxeo, creo que técnicamente se va notando.

    Además de organizar el Startup Open Space Zaragoza, estuve en eventos varios: BilboStack/ElComité, T3chfest Leganés, meetup de DevScola, Lechazoconf, UXSpain, Pamplona Software Craftsmanship, TheAntiEvent, Barcelona Software Craftsmanship, Women Tech Makers, Codemotion Madrid… en alguno de ellos contando cosillas sobre Clean Architecture, Jobsket, alternativas a las estimaciones y JS/testing.

    También tocaron algunas visitas a Valencia, Madrid y Barcelona por trabajo. Aprovechando una boda, conocí Mérida. Empalmé un par de semanas de vacaciones entremezclando mi pueblo, unos días de playa y una visita a Mallorca donde pude conocer a parte de la comunidad agile balear, así que sí hice vacaciones de verdad.

    Donde más he fallado ha sido en los proyectos más personales: para experimentos varios hemos usado Mosica pero nunca me puse en serio en la versión 2, por contra a final de año le he estado dedicando tiempo a otro side-project. Estuve hablando la posibilidad de mentorizar a un dev, pero finalmente no fuimos capaces de darle forma a cómo hacerlo y se terminó diluyendo; sigue siendo algo que me molaría hacer, pero esta vez no me lo voy a plantear como objetivo, y si surge genial.

    Y de nuevo, ahí va un popurrí desordenado:

    • He conocido alguna persona que vale muy mucho la pena.
    • Sin seguir siendo un gran lector, volví a leer bastante y variado: Técnicos, relatos, ensayos, filosóficos, novela…
    • En algunos viajes he podido ir viendo a un buen número de amigos y amigas.
    • Seguimos con la buena costumbre de caballeretes de juntarnos casi todas las semanas a cenar.
    • Estuve con varios amigos un finde de Pirineos Sur.
    • Además de nuevo pude pasármelo genial en un buen puñado de conciertos.
    • Vi nacer MulleresTech y disfruté de su primer evento.
    • Han empeorado mis resacas, por eso voy saliendo menos o con el freno más echado.
    • Me invitaron al Calderón y a San Mamés.
    • Una vez más participamos en Movember.
    • De las tripas, sigo parecido.
    • Seguí un curso de escritura creativa… pero no practiqué.
    • Cambié de gimnasio, creo que acertadamente.
    • Volví a ir de escalada.
    • Fui escribiendo en el medium de Coding Stones y muy poco aquí.
    • Volvimos a estar unos días de retiro en Alcañiz.
    • Empecé a trabajar en una nueva versión web del DNDzgz.
    • Este final de año (e inicio de 2018), he estado preparando un pequeño evento con Cachirulo Valley.

    Objetivos 2018

    • Afianzar Coding Stones. Después de este año de continuidad, creo que hay que terminar de demostrar la sostenibilidad de nuestro modelo. Tenemos algunos leads muy interesantes, pero hay que concretarlos y ver qué tal siguen saliendo las cosas.
    • Reescribir parte del core de OutreachTool, hay que pagar deuda técnica para poder aumentar la velocidad de desarrollo y soportar mejor los cambios que vamos a introducir. Ahora mismo este es nuestro principal impedimento a nivel de producto.
    • Como comentaba más arriba, mejorar la UX de OutreachTool para hacer que el software lo puedan utilizar consultores externos.
    • Por razones varias terminé el año algo cansado de preparar e impartir charlas, al menos ahora mismo no me apetece nada hacerlo próximamente. Así que para este año me he propuesto dejarlo bastante de lado, quiero escribir más y probar algún formato diferente. Quizás el podcast, llevo ya un par de años pensando en hacer algo.
    • Mejorar, o al menos dar continuidad, la rutina de entrenamiento. Y si empiezan con los interclubes, quizás participar en alguno.
    • Lanzar el nuevo DNDzgz como PWA en el próximo par de meses.

    Tengo más ideas que me gustaría llevar a cabo este año, pero no me las quiero poner como objetivos. En realidad son varias cosas que me apetecen mucho hacer pero o bien no quiero meterme ninguna presión, que ya está bien con lo que hay, o dependen principalmente de cuestiones bastante ajenas a mi control.

    ¡Feliz an nou!

    » Leer más, comentarios, etc...

    Adrianistán

    Yew, crea webapps al estilo Angular/React en Rust

    enero 01, 2018 11:23

    Hoy os traigo una librería muy potente y muy útil, ahora que Rust compila a WebAssembly de forma nativa. Se trata de Yew, una librería para diseñar frontends, single-page-applications y en general, una librería que es una alternativa a Angular, React, Vue y Elm.

    En particular, Yew se basa en The Elm Architecture, por lo que los usuarios de Elm serán los que encuentren más familiar a Yew.

    Yew significa tejo. He aquí uno de los tejos más famosos de Valladolid, en la plaza del Viejo Coso

    Instalar cargo-web y el soporte a WebAssembly

    Antes de empezar a programar necesitaremos instalar un plugin para Cargo, llamado cargo-web, que nos ayudará en el desarrollo web con Rust. Por otro lado, hace falta instalar el soporte de Rust a WebAssembly. Existen tres opciones actualmente: asmjs-unknown-emscripten, wasm32-unknown-emscripten y wasm32-unknown-unknown. Para los primeras opciones hace falta tener instalado Emscripten. Para la última, no hace falta nada, por lo que es mi opción recomendada. Por otro lado, wasm32 significa WebAssembly y asmjs es asm.js, que es simplemente JavaScript y será compatible con más navegadores.

    cargo install cargo-web
    rustup target add wasm32-unknown-unknown

    The Elm Architecture

    Los principios de The Elm Architecture se basan en: modelo, mensajes, actualización y vista.

    Para este tutorial vamos a hacer la típica aplicación de una lista donde guardamos notas. Nuestro modelo se va a componer de una lista de tareas, para simplificar, pongamos que una tarea es simplemente un String y un ID. Entonces también nos hará falta almacenar un contador para ir poniendo IDs. También, al tener un campo de texto, nos hará falta una variable para ir almacenando temporalmente lo que escribe el usuario.

    struct Model {
        id: u32,
        tasks: Vec<Task>,
        input: String,
    }
    
    struct Task{
        content: String,
        id: u32,
    }

    Lo siguiente es diseñar los mensajes. Los mensajes interactúan con el modelo y desencadenan una actualización de la vista. En esta aplicación solo nos hacen falta dos mensajes: añadir mensaje y borrar mensaje. Pero como tenemos un campo de texto, tenemos que introducir un mensaje Change y siempre viene bien un mensaje que no haga nada.

    enum Msg {
        Add,
        Remove(u32),
        Change(String),
        None,
    }

    Una vez hecho esto pasamos a crear la función update, en la que hacemos distintas cosas según el mensaje que recibamos.

    fn update(context: &mut Context<Msg>, model: &mut Model, msg: Msg) {
        match msg {
            Msg::Add => {
                let task = Task{
                    content: model.input.clone(),
                    id: model.id,
                };
                model.tasks.push(task);
                model.id += 1;
            }
            Msg::Change(content) => {
                model.input = content;
            }
            Msg::Remove(id) => {
                let mut i = 0;
                for task in model.tasks.iter(){
                    if task.id == id{
                        break;
                    }
                    i+=1;
                }
                model.tasks.remove(i);
            }
            _ => {
    
            }
        }
    }

    Así pues, si se lanza un mensaje Msg::Add lo que hacemos es copiar el valor de la variable temporal input, crear una nueva tarea con su ID y añadirla a la lista de tareas. Ya está. Yew mágicamente actualizará la página para reflejar que la lista de tareas ha sido modificada. Lo mismo pasa con Remove.

    Ahora vamos a las vistas. Una vista es una función que devuelve Html<Msg> y se pueden componer varias funciones así. En nuestro caso, tenemos una vista principal donde se ve un campo de texto y un sitio donde se ejecuta un bucle for con las tareas del modelo. Y a cada tarea se le aplica la vista view_task.

    fn view(model: &Model) -> Html<Msg> {
        html! {
            <div>
                <ul>
                { for model.tasks.iter().map(view_task) }
                </ul>
                <input type="text", value=&model.input, oninput=|e: InputData| Msg::Change(e.value), onkeypress=|e: KeyData|{
                    if e.key == "Enter" {
                        Msg::Add
                    }else{
                        Msg::None
                    }
                }, /> 
            </div>
        }
    }
    
    fn view_task(task: &Task) -> Html<Msg>{
        let id = task.id;
        html!{
            <li><span>{&task.content}</span><button onclick=move |_| Msg::Remove(id),>{format!("X")}</button></li>
        }
    }

    La macro html! nos permite escribir HTML directamente en Rust, con algunas diferencias (¡prestad atención a las comas!). También nos permite introducir código Rust (entre llaves) y closures (observad onclick, oninput y onkeypress).

    Finalmente en el método main, inicializamos el modelo y llamamos a program, que empieza a ejecutar Yew.

    El código final queda así.

    #[macro_use]
    extern crate yew;
    
    use yew::html::*;
    
    struct Model {
        id: u32,
        tasks: Vec<Task>,
        input: String,
    }
    
    struct Task{
        content: String,
        id: u32,
    }
    
    enum Msg {
        Add,
        Remove(u32),
        Change(String),
        None,
    }
    
    fn update(context: &mut Context<Msg>, model: &mut Model, msg: Msg) {
        match msg {
            Msg::Add => {
                let task = Task{
                    content: model.input.clone(),
                    id: model.id,
                };
                model.tasks.push(task);
                model.id += 1;
            }
            Msg::Change(content) => {
                model.input = content;
            }
            Msg::Remove(id) => {
                let mut i = 0;
                for task in model.tasks.iter(){
                    if task.id == id{
                        break;
                    }
                    i+=1;
                }
                model.tasks.remove(i);
            }
            _ => {
    
            }
        }
    }
    
    fn view(model: &Model) -> Html<Msg> {
        html! {
            <div>
                <ul>
                { for model.tasks.iter().map(view_task) }
                </ul>
                <input type="text", value=&model.input, oninput=|e: InputData| Msg::Change(e.value), onkeypress=|e: KeyData|{
                    if e.key == "Enter" {
                        Msg::Add
                    }else{
                        Msg::None
                    }
                }, /> 
            </div>
        }
    }
    
    fn view_task(task: &Task) -> Html<Msg>{
        let id = task.id;
        html!{
            <li><span>{&task.content}</span><button onclick=move |_| Msg::Remove(id),>{format!("X")}</button></li>
        }
    }
    
    fn main() {
        let model = Model {
            id: 0,
            tasks: vec![],
            input: String::from("")
        };
        program(model, update, view);
    }

    Ejecutando la aplicación web

    Usando cargo web, es muy sencillo generar la aplicación web. Simplemente ejecuta:

    cargo web start --target-webasm

    El resultado, se montará en un mini servidor web. Si accedes a la URL que indica Cargo con tu navegador web, verás algo similar a esto:

    Añade items y bórralos. Observa como la aplicación funciona perfectamente.

    Distribuyendo la aplicación

    Realmente cargo web ha hecho muchas cosas por nosotros. Si nosotros queremos usar Yew en la vida real, no usaremos cargo web. Para ello, compilamos la aplicación web:

    cargo web build --target-webasm

    Y accedemos a la carpeta target/wasm32-unknown-unknown/release. Allí encontraremos dos archivos que vamos a necesitar. Uno acabado en .js y otro acabado en .wasm. Ambos ficheros deberemos copiarlos donde queramos usarlos. Por último, será necesario un fichero HTML. En el fichero HTML solo hace falta cargar el fichero JS. Yew hará el resto.

    Si quieres saber más, puedes descargarte el código de ejemplo que se encuentra en GitHub.

    La entrada Yew, crea webapps al estilo Angular/React en Rust aparece primero en Blog - Adrianistan.eu.

    » Leer más, comentarios, etc...

    Una sinfonía en C#

    Javascript tips: Jugando con strings, interpolación y otras yerbas.

    enero 01, 2018 03:58

    Hace un tiempo (3 años) hablé sobre cómo tener strings multilínea en Javascript, una opción no tan conocida incluso hoy en día.

    Bien, con las posteriores versiones del estándar y los navegadores de hoy en día ya contamos con algunas características más avanzadas para el manejo de strings, vamos a ver un poco de qué se trata.

    Interpolación de strings

    Una de las novedades de ECMA Script 6 2015 son los template string (o string interpolado) muy similar a C#, nos permite tener un texto (template) y que el interprete reemplace ciertas cadenas especiales con variables que están dentro del contexto, por ejemplo

    var s = "mundo";
    `Hola ${s}`
    

    En este caso la variable s tiene el valor “mundo” y cuando hacemos referencia en la siguiente línea a la variable por nombre escribiéndola con esa sintaxis ${variable} y usando las comillas invertidas igual que el en caso de los strings multilínea.

    Por supuesto que podemos hacer referencia a objetos complejos

    var o = {"nombre": "Leonado", "twitter": "@leomicheloni"}
    `Hola, mi nombre es ${o.nombre} puedes seguirme en twitter en ${o.twitter}`
    "Hola, mi nombre es Leonado puedes seguirme en twitter en @leomicheloni"
    

    Perfecto, y muy útil para que nuestro código sea más limpio y sea menos propenso a errores, pero hay más.

    Qué pasa si hacemos referencia a algo que no existe, por ejemplo a una propiedad que no existe en el objeto, nada, como Javascript es dinámico simplemente nos muestra undefined.

    var o = {"nombre": "Leonado"}
    `Hola, mi nombre es ${o.nombre} y mi apellido es ${o.apellido}`
    "Hola, mi nombre es Leonado y mi apellido es undefined"
    

    Perfecto, no problem.

    Sin embargo si hacemos referencia a una variable que no existe….

    `Hola, mi nombre es ${nombre}`
    Uncaught ReferenceError: nombre is not defined
        at :1:23
    

    Pumm! se rompe, es decir se comporta igual que si concatenando el strings a la viaja usanza.

    "Hola, mi nombre es " + nombre
    

    Pero hay más

    Procesar expresiones

    También es posible procesar expresiones dentro de un template string, por ejemplo

    `Hola, la suman de 1+2 es ${1+2}`
    "Hola, la suman de 1+2 es 3"
    

    Por supuesto que podemos sumar elementos de objetos

    var o = {a : 1, b: 7};
    `La suman de ${o.a} + ${o.b} es ${o.a + o.b}`
    "La suman de 1 + 7 es 8"
    

    Y listo, no podemos reemplazar una biblioteca de procesamiento de templates como Mustache con esto pero nos permite ahorrar trabajo y evitar errores, además de hacer nuestro código más limpio.

    Nos leemos.

    » Leer más, comentarios, etc...

    Meta-Info

    ¿Que es?

    Planeta Código es un agregador de weblogs sobre programación y desarrollo en castellano. Si eres lector te permite seguirlos de modo cómodo en esta misma página o mediante el fichero de subscripción.

    rss subscripción

    Sponsors

    Puedes utilizar las siguientes imagenes para enlazar PlanetaCodigo:
    planetacodigo

    planetacodigo

    Si tienes un weblog de programación y quieres ser añadido aquí, envíame un email solicitándolo.

    Idea: Juanjo Navarro

    Diseño: Albin