Variable not found
Enlaces interesantes 264
January 10, 2017 07:56 AM
Ahí van los enlaces recopilados durante la semana pasada. Espero que os resulten interesantes. :-).NET
- The week in .NET – On .NET with Glenn Versweyveld, Protobuf.NET, Arizona Sunshine
Bertrand Le Roy - Understanding OutOfMemoryException
Szymon Warda - Notes from the ASP.NET Community Standup –January 3, 2017
Maria Naggaga - Wexflow: Open source workflow engine in C#
Akram El Assas - Boxing y UnBoxing de variables ¿Qué significa?
José Manuel Alarcón - Understanding different GC modes with Concurrency Visualizer
Sergey Teplyakov - Exploring .NET managed heap with ClrMD
Maarten Balliauw - Inject the .Net framework into the browser
Mike Parsons - Back to Basics: String Interpolation in C#
Rick Strahl
ASP.NET
- Streaming files with HttpClient and multiple controllers
Benny Michielsen
.NET Core / ASP.NET Core
- Response Caching in ASP.Net Core 1.1
Talking dotnet - Custom Tag Helper: Toggling Visibility On Existing HTML elements
Scott Sauber - Introducing a new Markdown View Engine for ASP.NET Core
Hisham Bin Ateya - How to enable gZip compression in ASP.NET Core
Talking Dotnet - Understanding and updating package versions for .NET Core 1.0.3
Andrew Lock - Building production ready Angular apps with Visual Studio and ASP.NET Core
Damien Bowden - Onion Architecture In ASP.NET Core MVC
Sandeep Singh Shekhawat
Conceptos/Patrones/Buenas prácticas
- Mitos y leyendas ágiles
Javier Garzás
Html/Css/Javascript
- TypeScript: the missing introduction
Todd Motto - Master web development with these 9,985 weird tricks
David Gilbertson - The Narrative Browser Using Articulate.js
Adam Coti - TypeScript 2.0: More Power for Defining Classes
Peter Vogel - Clean Code concepts adapted for JavaScript
Ryan McDermott - Angular 2 and .NET Core – route directly to your components
Jon Hilton - Improve Your Website’s Accessibility With WAI-ARIA
Louis Lazaris - CSS Grid is Coming
Rachel Andrew - Angular 1.4.8 strongly typed in TypeScript
Manfred Zik - Aprender Javascript en 2016
Carlos Benítez - JavaScript WTF #2: the this keyword (part 1) & #3: Foo.prototype is not prototype of Foo & #4: Undefined vs Null & #5: No map() for Iterables
Ivan Krivyakov
Visual Studio/Complementos/Herramientas
- Cómo mantener sincronizados los ajustes de Visual Studio Code entre todos nuestros equipos
José Manuel Alarcón
Otros
- Making Slack Faster By Being Lazy
Scott Schiller - La comunidad y la farandula
Marc Rubiño - De MVPs, Comunidades, Circulos y otras bestias
Josué Yeray Julián - 22 Rules for Professional Growth
Alex Cleanthous
Variable not found
Top posts 2016 en Variable not found
January 09, 2017 03:37 PM
Como las tradiciones están para cumplirlas, aprovecharemos este primer post del año para hacer el clásico repaso de los diez artículos de 2016 que fueron más visitados durante el año que acabamos de cerrar.He de decir que esta vez he tenido que manipular un poco los resultados porque muchos de los posts más visitados eran los relativos a los anuncios de la gran celebración del décimo aniversario del blog y los espectaculares sorteos y regalos (como éste, éste, este, éste, éste…) que repartimos gracias a nuestros patrocinadores. Por tanto, para no monopolizar el ranking sin añadir mucho valor a estas alturas, no los he tenido en cuenta.
Ya centrados en los artículos con más chicha, veremos que la gran mayoría de entradas destacadas tienen que ver con ASP.NET Core, lo que pone de manifiesto el interés que está despertando el nuevo framework, y dejan claro que vosotros, amigos del blog, sois gente inquieta y os gusta estar a la última ;)
Encabeza el ranking el post "ASP.NET 5 se llama ahora ASP.NET Core", un eco del controvertido anuncio de Microsoft anunciando el cambio de nombre de su nuevo framework de desarrollo para la web. Aunque conceptualmente fue un renombrado correcto, no se puede decir lo mismo del momento que eligieron para hacerlo, que sin duda fue demasiado tarde.
En segunda posición encontramos "¿Cuál es el "Bus factor" de tu proyecto?" una llamada de atención sobre los peligros de concentrar toda la información y conocimiento sobre un proyecto en un grupo reducido de personas. Un tema serio, independientemente de lo divertido del término.
Le sigue en el ranking el artículo "5 cambios destacables en ASP.NET Core RC2", donde comentábamos las principales novedades introducidas en la tardía y rompedora segunda release candidate del nuevo marco de trabajo. Aquí comenzaron a verse aplicados los cambios de nombre, el nuevo modelo de aplicaciones de consola ASP.NET y el descarte de DNX en favor de .NET Core CLI.
El siguiente post más visto fue el que se hacía eco del lanzamiento de la versión 1.0 RTM de .NET Core, ASP.NET Core y Entity Framework Core. Era sin duda un esperado acontecimiento, probablemente el más importante de los últimos años, y era previsible que el tema despertara interés.
A continuación encontramos un artículo con contenido puramente técnico donde explorábamos el uso de variables de sesión en ASP.NET Core 1.0. Aunque a veces denostadas, probablemente por el abuso que históricamente se ha hecho de ellas, las variables de sesión son un recurso útil para el mantenimiento de estado entre peticiones de una aplicación web, y el interés despertado por este contenido dejó claro que aún siguen formando parte de la caja de herramientas de los desarrolladores.
En sexto lugar tenemos un post autorespondiéndome a una curiosidad que arrastraba desde hacía tiempo. En ¿Es ASP.NET Core MVC un middleware? estudiábamos si existía un middleware específico de MVC que fuera el responsable de "enganchar" este framework al pipeline de ASP.NET Core. Spoiler: no, no existe.
En "Convenciones personalizadas en ASP.NET Core MVC" introducíamos el Application Model de MVC, y cómo aprovecharlo para construir convenciones custom en las aplicaciones, como añadir automáticamente el filtro
[ValidateAntiForgeryToken] a todas las acciones accesibles a través del método POST.
Seguidamente encontramos entre los posts más vistos el anuncio del lanzamiento de mi Curso de ASP.NET Core MVC en CampusMVP, demostrando de nuevo el interés de la comunidad de desarrolladores en esta nueva tecnología, y que reflejaba en el gráfico adjunto. Aún estáis a tiempo de echar un vistazo al artículo para decidir si lo empezáis mañana mismo ;)Y finalizamos el top ten con un empate entre dos posts puramente técnicos, también sobre ASP.NET Core. El primero de ellos era el inicio de la serie "Archivos estáticos en aplicaciones ASP.NET Core", que se extendió posteriormente durante tres artículos más. El segundo, es una reedición de un artículo anterior, actualizada a versiones más reciente de ASP.NET Core, tras los cambios introducidos en RC2: "Logging en ASPNET Core (actualizado a RC2)".
Aunque ya hemos completado el ranking de los diez posts más visitados, voy a hacer una excepción para incluir el que hace número 11, porque tiene si mérito: Visual Studio 2017 se llamará finalmente Visual Studio Core 1.0. Y no queda ahí la cosa… Pues sí, la broma escrita para el pasado día de los inocentes (28-dic) entró con fuerza y en sólo tres días se quedó en las puertas de estar entre los diez artículos más vistos del año pasado :DD
Como siempre, aparte de los contenidos generados durante 2016, hemos tenido bastantes visitas a posts que ya son clásicos en el blog y supongo que estarán muy bien posicionados en buscadores, como:
- Los clásicos “101 citas célebres del mundo de la informática” y “Otras 101 citas célebres del mundo de la informática”, los primeros de la serie.
- Pasar variables de script a un Url.Action() o Html.ActionLink(), que muestra algunas opciones que tenemos para introducir parámetros conocidos en tiempo de script a direcciones generadas en MVC por dichos helpers.
- Seguimos teniendo pruebas de que WebForms sigue vivito y coleando, pues “Evitar el postback al pulsar un botón en ASP.Net” continúa atrayendo a muchos visitantes.
- Validación de peticiones en ASP.NET, o cómo evitar el error “Request.Form peligroso”, la solución a un error bastante común.
- ASP.NET MVC: WebGrid con filtro, paginación y ordenación. Los grids siguen siendo un caballo de batalla frecuente en las aplicaciones web.
Y esto es todo! Espero que os haya resultado interesante para conocer algún artículo que os perdisteis en su momento o para rememorar algunos que os llamaron la atención ;)
Publicado en Variable not found.
Koalite
Mis tecnologías del 2016
January 09, 2017 05:06 AM
Soy un hombre de tradiciones y toca continuar la que inicié el año pasado, a petición de Alfredo, repasando mis tecnologías del 2015. Es además una buena forma de resumir las herramientas que uso actualmente para los que puedan estar interesados en conocerlas.
Al igual que el año pasado, me ceñiré a tecnologías que uso profesionalmente porque son con las que más me he pegado y de las que puedo dar una opinión más formada. También quiero recordar que me dedico a desarrollar productos, no proyectos. Son además productos que llevan años en el mercado y (esperamos) durarán unos cuantos años más, y son instalados en miles de clientes por un montón de distribuidores, sobre un parque de equipos (hardware y software) de lo más heterogéneo. Todo esto hace que andar saltando de tecnología en tecnología sólo porque esté de moda o porque prometa maravillosas mejoras no es para nosotros una opción, así que no esperes grandes cambios ni plataformas ultramodernas de dudoso futuro.
.NET
Seguimos planteándonos la posibilidad de abandonar .NET a medio plazo, así que tratamos de minimizar los nuevos desarrollos sobre esta plataforma.
Eso no quiere decir que no la usemos, al contrario, todos nuestros sistemas de backend están desarrollados en C# y trabajamos con ellos todos los días, pero hemos hecho pocos cambios en esta parte.
Mantenemos nuestro stack de librerías por defecto: NHibernate como ORM, Castle Windsor como contenedor IoC, NUnit para tests y log4net para logging. No siempre las usamos, pero lo normal es que si queremos echar mano de alguna librería de ese tipo, recurramos a ellas.
Puede que haya librerías más actuales para todas esas cosas, pero cuando hemos jugado con ellas tampoco nos han aportado lo suficiente para cambiar. Supongo que si nos dedicásemos a hacer proyectos acotados en el tiempo tendríamos más variedad; en nuestro caso, reescribir partes grandes de una aplicación solo pasar a otra librería más moderna que realmente no te aporta mucho más, es una pérdida de tiempo y dinero.
Miramos de reojo .NET Core con ciertas esperanzas de que nos pueda ser útil algún día y que nuestra migración sea a .NET Core desde .NET Framework en lugar de saltar a plataformas más extrañas para nosotros, pero por el momento lo vemos lejos. Quizá esto se aclare dentro de un tiempo, cuando sea un poco más estable, las herramientas estén más consolidadas y se vea más claro dónde va a acabar todo.
Javascript
Si después de hablar de la inestabilidad de .NET Core te digo que HTML5 y Javascript es nuestra plataforma preferida para desarrollar aplicaciones cliente, seguramente te resulte extraño. La diferencia fundamental es la comparación con las alternativas. Mientras que .NET Core todavía lo consideramos una opción inferior (en nuestro escenario, insisto) a .NET Framework, HTML5 y Javascript nos aporta más que soluciones nativas o multiplataforma como Xamarin, lo que nos compensa en cierto modo la falta de estabilidad.
En la parte de Javascript hay menos uniformidad que en .NET y tenemos algún cadáver en el armario desarrollado con AngularJS que nos da un excelente rendimiento económico y unos cuantos quebraderos de cabeza a la hora de mantenerlo.
Todos los desarrollos nuevos los estamos haciendo desde hace un par de años con ReactJS, que cada vez nos gusta más por la flexibilidad que nos da a la hora de estructurar el código.
El año pasado mencionaba nuestras dudas con React Router, y eso ha acabado desembocando en un cambio hacia minimal-router, una microlibrería que surgió de un ejercicio de diseño en abierto y que estamos usando en producción en un par de aplicaciones.
Otra cosa que no nos acababa de gustar era Material-UI, y aunque la aplicación donde lo usamos sigue empleando ese interfaz de usuario (y no tenemos previsto cambiarla), hemos vuelto a diseños basados en Bootstrap o implementados desde cero por nosotros.
En cuanto a herramientas, las mismas que el año pasado: scripts npm (sin Grunt ni Gulp), mocha, chai, …, en fin, los sospechosos habituales. Como incorporación de este año hemos tenido enzyme para testear componentes de ReactJS que nos ha gustado bastante (aunque en general tratemos de evitar ese tipo de tests).
El año de TypeScript
Es la mayor novedad del 2016 para nosotros, y es algo de lo que todavía no estamos muy convencidos.
De momento tenemos alguna aplicación en producción y estamos desarrollando más con TypeScript, pero, sinceramente, aún no las tengo todas conmigo con respecto a esta tecnología.
Un lenguaje que saca versiones nuevas cada 2 meses, introduciendo cambios semánticos importantes, da un poco de miedo. Si a eso le unes que al usarlo te conviertes automáticamente en ciudadano de segunda dentro del ecosistema Javascript y tienes que pegarte más para poder usar determinadas herramientas y librerías que no están pensadas para TypeScript, es normal que surjan dudas.
Sin embargo, hay que reconocer que sus herramientas, uno de los puntos fuertes de TypeScript, facilitan mucho la vida en otros aspectos. Además son ampliamente soportadas por los editores de texto, lo que permite libertad a la hora de elegir el entorno de desarrollo, que es algo que valoro mucho.
Tal vez alguno os preguntéis por qué no hemos optado por otro tipo de lenguajes, como mi “amado” clojurescript. Estuvimos evaluando algunas alternativas, pero lo cierto es que para elegir un lenguaje de programación hay factores que pesan más que el propio lenguaje.
No hemos hecho grandes cambios en nuestra arquitectura o herramientas para integrar TypeScript y mantenemos las mismas herramientas y liberías que con Javascript, sólo que ahora hay que buscar las definiciones de tipos (algo que no siempre es fácil) y los plugins adecuados para preprocesar los ficheros TypeScript y convertirlos a Javascript, como tsify para browserify o ts-node para ejecutar los tests con mocha.
Aquí siempre echo de menos que el compilador de TypeScript no esté implementado como un plugin de Babel; no sé si es posible, pero simplificaría muchísimo todo.
La relación de amor/odio con webpack
Otra de las novedades de este año para nosotros es webpack. Después de haber pasado por grunt y gulp, y haber acabado con una solución muy ligera basada en scripts npm, utilizar una herramienta como webpack nos genera serias dudas.
Por una parte, es muy atractivo poder gestionar todos los recursos de tu aplicación de una forma homogénea, incluyendo TypeScript, less, imágenes, etc. Que sea posible versionarlos con un hash para gestionar la caché es muy útil, y hay partes que encajan especialmente bien con TypeScript, como el plugin file loader, que a la vez que nos permite aprovechar el pipeline de webpack para gestionar ficheros, nos ofrece un acceso “tipado” a las rutas de los ficheros.
Para gestionar los ficheros css, incluyendo la concatenación de ficheros desde distintas rutas y la consolidación de recursos (imágenes, fuentes, etc.) en una única carpeta, no hemos encontrado una solución mejor.
A cambio, introduce una complejidad excesiva. A esto hay que unirle que la documentación es bastante mala (aunque ya vamos estando acostumbrados a eso) y que vive a caballo entre la versión 1.x y la 2.x (aunque la 2.x parece que ya está más cerca), cada una con sus peculiaridades, lo que contribuye a hacerlo todo aún más confuso.
Pero el principal problema es que es lento. Lentísimo. Hay una parte que es culpa del compilador de TypeScript (que tampoco es lo más rápido del mundo), pero con webpack el problema se exacerba. Acostumbrado a tiempos de décimas de segundo para compilar con Babel y Browserify, pasar a varios segundos con webpack y TypeScript se me hace muy duro.
Al menos gracias a la inestimable ayuda de Dani de la Cruz hemos conseguido que la parte de gestión de css sea lo bastante rápida como para que resulte usable.
Pese a que hemos invertido unas cuantas horas en Webpack y tenemos aplicaciones funcionando con él, no tengo nada claro que se mantenga entre nosotros, o por lo menos que lo haga como solución única para compilar TypeScript. Ahora mismo me inclino más por una mezcla con browserify (u otro sistema rápido) durante el desarrollo y usar Webpack para empaquetar sólo de cara al despliegue… Ya veremos cómo acaba la historia.
Y poco más
En la parte de infraestructura no hemos hecho prácticamente ningún cambio con respecto al año pasado y seguimos usando las mismas herramientas (YouTrack, SVN, Cruise Control.NET, …). Estamos pendientes de novedades y, a título personal, usamos otro tipo de soluciones (Git, Trello, etc.), pero lo cierto es que hasta ahora no hemos encontrado motivación suficiente (dado nuestro escenario) para que nos compense la migración a nivel profesional con todo lo que ello implica.
En cuanto a editores, IDEs, y demás, seguimos utilizando Visual Studio 2013 (no hemos necesitado nada del 2015 y las quejas que hemos leído nos han echado un poco para atrás) y, aunque yo sigo fiel a emacs, VS Code ha entrado con fuerza para desbancar a los Atom y Sublime que usaban algunos.
Si alguno tiene curiosidad por alguna herramienta o tecnología en concreto, puede preguntar en los comentarios: no hacemos nada tan secreto que no se pueda contar ;-)
Posts relacionados:
PHP Senior
Tips: cómo resolver el cálculo de un factorial usando recursividad (PHP7)
January 09, 2017 03:33 AM
Por lo general no es muy común que en PHP, y trabajando con sistemas comerciales, tengamos que implementar soluciones recursivas. Pero como tampoco es imposible, les paso un ejemplo. Tengamos en cuenta que aunque parezca obvio:
El ejemplo más clásico es el cálculo de un factorial. Si factorial de 5 se calcula 1 x 2 x 3 x 4 x 5, por lo tanto podemos hacer un método que reciba el número a calcular, y posteriormente se va a ir llamando a sí mismo restando 1, hasta llegar al caso "resoluble directo", es decir 0, posteriormente iniciará el retorno recursivo y haciendo el cálculo "al revés" de la invocación inicial (revisar ejecución al final del ejemplo).

PD: de paso, lo hacemos usando PHP 7 o superior. Si bien en este ejemplo no se aprovecha mucho, está bueno que nos empecemos a acostumbrar a las nuevas funcionalidades que trae (como en este caso, la validación de tipos tanto en el input como en el output).
/**
* Cómo resolver el cálculo de un factorial usando recursividad
*
* factorial de 5 = 1 x 2 x 3 x 4 x 5
*
*/
class Factorial{
public function calcular(int $numero) : int
{
if ($numero > 0) {
// entro en la recursividad ...
$aux = $this->calcular($numero - 1);
$calculo = $aux * $numero;
echo "$aux * $numero = $calculo \n";
return $calculo;
} else {
// caso resoluble directamente ...
return 1;
}
}
}
$factorial = new Factorial();
echo "resultado = " . $factorial->calcular(5) . " \n";
// Ejecución
php index.php
1 * 1 = 1
1 * 2 = 2
2 * 3 = 6
6 * 4 = 24
24 * 5 = 120
resultado = 120
Espero que les resulte útil! ;-)
Espero todas sus dudas!
PHP Senior
GIT cambiar el editor por defecto a VIM
January 09, 2017 03:32 AM
PHP Senior
Frase: "Para algunos autores, la herencia o las clases no son conceptos esenciales para la paradigma de POO"
January 08, 2017 10:34 PM
Frase leída en Wikipedia sobre el lenguaje "Go" de Google:
| Alan Kay |
![]() |
| Lenguaje Go |
PHP Senior
PHP 7.1: cómo instalarlo en Ubuntu
January 08, 2017 09:21 PM
Para quienes quieren probar PHP 7.1 en Ubuntu, ya que actualmente no está disponible como paquete oficial de instalación, pueden seguir los siguientes pasos:sudo add-apt-repository ppa:ondrej/php
sudo apt-get update
sudo apt-get upgrade
(optional) sudo apt-get remove php7.0
sudo apt-get install php7.1
Adrianistán
Un nuevo lenguaje de programación para juegos
January 08, 2017 12:46 PM
En la inocentada sobre Rust puse un vídeo de Jonathan Blow titulado Ideas about a new programming language for games. En el vídeo, Blow analiza los problemas que presenta C++ para el desarrollo de juegos y por qué según él ni Go ni D ni Rust consiguen mejorar la situación. El lenguaje de programación perfecto para juegos debería tener las siguientes características:
- Poca fricción
- Placer por programar
- Rendimiento
- Simplicidad
- Diseñado para buenos programadores
Con poca fricción se refiere a que la tarea de programar no debe añadir mucha complejidad para solucionar problemas que tendríamos si programásemos de la forma más simple posible. Fricción es para él RAII en C++. Fricción es la gestión de errores en Rust. Fricción se entiende como código que no añade significativamente nada pero que es necesario para un correcto funcionamiento. Fricción es rellenar papeleo de Hacienda. Muchos defensores de estas posturas argumentan que en realidad esa productividad perdida se recupera con el tiempo al reducir el número de bugs que pueden ocurrir. Blow dice que según su experiencia en juegos AAA realmente no compensa. Tardas más tiempo solventado bugs potenciales que bugs reales. Su solución no es evitar al 100% este tipo de bugs (como hace Rust) sino habilitar unas herramientas potentes que ayuden a solucionar estos bugs si alguna vez suceden.
Esto se relaciona con el placer por programar. Un lenguaje que te invite a programar, a experimentar, donde te sientas a gusto. Muchos lenguajes han perdido esa esencia. Con el tiempo muchos lenguajes se han ido complicando de forma innecesaria y se han ido volviendo pesadillas. Ruby sería el caso contrario, un lenguaje que conserva ese placer. Pero Ruby no entra en juego por razones obvias de rendimiento.
Con rendimiento básicamente dice que cualquier lenguaje que disponga de GC (recolector de basura) no es válido. Incluso Go, que tiene un GC mucho mejor que Java o la plataforma .NET no lo considera correcto.
Con simplicidad se busca legibilidad y potencia. El lenguaje debe ser uniforme, con cohesión en todos sus elementos.
Y con diseñado para buenos programadores se refiere a que el lenguaje no debe suponer que el programador es idiota e intentar corregir sus errores. Debe permitir hacer virguerías si así lo desea el programador. Rust está bien pues permite tener código unsafe. Justo lo que se necesita para hacer virguerías. Pero hace falta más trabajo en este aspecto pues supone un cambio de mentalidad.
La idea detrás de RAII es incorrecta
Mucha gente opina que RAII es una de las mejores cosas que han pasado en la programación. Muchos lenguajes presuponen RAII. D por ejemplo considera que RAII es la manera correcta de programar. Resource Acquisition Is Initialization consiste en que cada vez que vamos a acceder a un recurso tenemos que codificarlo en una clase, inicializar el recurso en un constructor y liberar el recurso en un destructor. Añades operadores para permitir copia, … Este sistema presenta una elevada fricción. Y además no funciona bien, en el sentido de que todo se acaba sobrecomplicando. Alejándose de esa simplicidad que estamos buscando.
Uno de los principales problemas de este patrón de diseño es que no existe un recurso. Es una generalización errónea de varios conceptos. Un recurso puede ser memoria, otro recurso puede ser un archivo, una entrada de teclado, etc El problema es que estos recursos son demasiado diferentes como para ser tratados con un mismo patrón de forma óptima. Mientras RAII puede ser interesante hablando de archivos, es una muy mala opción si hablamos de memoria. Porque la memoria es el recurso más importante para un programador. Se podría simplificar diciendo que un programador lo único que hace es modificar la memoria constantemente.
Pero muchos de los usos de RAII tienen que ver con las excepciones. Y a Blow tampoco le gustan las excepciones. La gestión de errores en C es pésima pero las excepciones son muy complejas. Una de las cosas más complejas que implementan los lenguajes de programación que disponen de ellas. Y la implementación de C++ más todavía. Blow se lamenta de que haya gente que siga pensando que es una buena idea. Reduce la claridad del código, complica el flujo del programa. RAII en C++ ayuda a que en caso de que se de una excepción los recursos puedan ser liberados.
No solo lo dice él, sino que enlaza el siguiente vídeo: Systematic Error Handling in C++ por Andrei Alexandrescu.
Un mejor sistema que las excepciones
Go implementa múltiples valores de retorno (al contrario que la mayoría de lenguajes derivados de C donde solo de devuelve una cosa). Go lo soporta de forma nativa. Pero Matt Newport le responde como podría hacer eso en C++11 con std::tie.
#include <iostream>;
#include <tuple>;
#include <functional>;
std::tuple<int, int> f()
{
int x = 5;
return std::make_tuple(x, 7); // return {x,7}; en C++17
}
int main()
{
int a, b;
std::tie(a, b) = f();
std::cout << a << " " << b << "\n";
}
Rust, como Go, soporta esto de forma nativa:
fn f() -> (i32,i32) {
(4,7)
}
fn main() -> () {
let (a,b) = f();
println!("A es {}, B es {}",a,b);
}
Aunque no es la manera en la que Rust maneja los errores. En su lugar posee Option y Result que en C++17 también van a ser implementados en std::optional y que es en realidad un concepto presente en Haskell.
Sintaxis exasperante
En la charla Blow sigue hablando y comenta que desde un punto de visto purista y correcto la sintaxis de punteros de C++11 es incorrecta. Que std::unique_ptr<Vector3[]> implica que quieres un Unique Ptr basado en Vector3 pero en realidad la idea correcta sería quiero un Vector3 con características de Unique Ptr. Lo mismo es aplicable para std::shared_ptr. Este tipo de punteros no deberían estar expresados de esta forma sino que deberían entrar en la sintaxis del lenguaje, por su utilidad práctica.
En Rust, el equivalente a std::unique_ptr sería Box que es el puntero más usado. El equivalente a std::shared_ptr sería Rc, no tan usado pero disponible.
Blow sigue hablando en este vídeo y en el siguiente de más errores que tiene C++, aunque de menor importancia. En todo caso, Blow sigue en el desarrollo de su compilador de Jai. C++ ha avanzado un montón y me ha llegado a sorprender que existiesen cosas como constexpr y los módulos de C++, una solución a los archivos de cabecera que son tan tediosos de escribir.
Si tenéis tiempo y sabéis inglés miráos el vídeo original. Creo que esta mucho mejor explicado que esto. Y también la respuesta de Matt Newport en la que dice que C++ SÍ es válido para todo lo que dice Blow.
La entrada Un nuevo lenguaje de programación para juegos aparece primero en Blog - Adrianistan.eu.
Blog Bitix
Artículo #3 de Yo apoyo al software libre
January 06, 2017 09:00 PM
Los últimos meses me han sido bastante buenos en cuanto a los ingresos por la publicidad AdSense y los enlaces de afiliado de Amazon que incluyo en el blog con el objetivo de monetizarlo un poco. Desde luego esos pequeños ingresos no compensan la enorme cantidad de tiempo que requiere escribir un artículo, y no es solo escribirlo sino también editarlo, crear el ejemplo de código si el artículo es sobre programación, sacar las capturas de pantalla e investigar la materia de la que habla el artículo. Otra forma de monetizar el blog que estoy evaluando es escribir artículos patrocinados con la plataforma Publisuites, sin embargo, aún no he recibido ninguna propuesta ya que quizá haya puesto el precio demasiado alto pero escribir un artículo cuesta unas horas de trabajo.
Por la publicidad de AdSense he notado un significativo aumento de ingresos duante los últimos meses del 2016 superando los 20€ mensuales cuando hasta no hace mucho la cifra estaba en unos 10€. En proporción al aumento de número de visitas que ha experimentado este blog en 2016 como comento en el artículo Heroteca #10 donde hago un repaso de ese año. Esto ha hecho que en poco menos de cinco meses Google me haya hecho otra transferencia por importe de unos 75€. Por los enlaces de afiliado también he recibido otro ingreso por parte de Amazon de unos 35€.
Como me he propuesto en anteriores veces que he recibido algún ingreso por el blog he hecho unas pequeñas donaciones a algunos proyectos de software libre. En anteriores ocasiones han sido a la FSFE, Mozilla, Wikipedia y ahora los proyectos que he elegido a los que hacer una donación han sido Elementary OS, LibreOffice (The Document Foundation) y Arch Linux ARM. Aunque muchos usuarios hagan donaciones la viabilidad de estos proyectos no deberían depender de ellas ya que seguro que no cubren los gastos en los que incurran estos proyectos. Algunos de estos gastos son los servidores para prestar el servicio y páginas web, conferencias a las que asisten sus desarroladores y los viajes de estos, seguro que hay unos cuantos más.
Elementary OS
Aunque la distribución GNU/Linux que uso es Arch Linux he elegido donar a Elementary OS porque me parece una distribución interesante por ofrecer algo distinto a las otras muchas distribuciones que existen y no tienen algo diferenciador. Elementary tiene un diseño, estética y usabilidad de interfaz muy cuidada. Arch Linux es la distribución rolling release que se mantiene siempre actualizada y con una gran documentación en forma de wiki. Las versiones LTS de Ubuntu ofrecen soporte durante un periodo largo de tiempo pero cuya interfaz Unity no convence a muchos. Debian, openSUSE y Fedora son otras de las distribuciones grandes y junto con Linux Mint también a tener en cuenta para los usuarios que quieren dar el cambio a Linux. Pero para un recién llegado a GNU/Linux o que simplemente quiere un sistema para trabajar en mi opinión Elementary OS o Linux Mint o una versión LTS de Ubuntu si nos convence su interfaz Unity sea lo recomendable por lo que usar en un primer momento, desde luego no Arch Linux y posiblemente tampoco Debian, openSUSE o Fedora. Espero que Elementary siga desarrollandose y no sea una de las muchas distribuciones que al cabo de unos años es abandonada por falta de interés de sus desarrolladores, falta de éxito o ingresos.
Libre Office
LibreOffice es el proyecto ofimático que se postula como una de las mejores alternativas ofimáticas a Microsoft Office. Su interfaz, en mi opinión, está saturada de opciones en menús donde es difícil encontrar la funcionalidad que uno necesita siendo parecida a versiones antiguas de Microsoft Office. Sin embargo, en GNU/Linux no hay muchas alternativas ofimáticas tan completas de software libre. Otra alternativa es WPS Office con una interfaz mas cuidada y parecida a Microsoft Office con su interfaz de caja de herramientas ribbon donde es más fácil encontrar las opciones en vez de interminables menús y diálogos de configuración. En LibreOffice me parece tan importante añadir nuevas funcionalidades como mejorar las existentes pero me gustaría que la interfaz fuese mejor, más parecida a la de Microsoft Office si fuese necesario. Parece que están dando los primeros pasos en LibreOffice para evolucionar la barra de herramientas.
Arch Linux ARM
El tercer proyecto al que he donado ha sido a Arch Linux ARM ya que lo uso en la Raspberry Pi con la que hago la descarga de imágenes de alguna distribución que quiera probar, series, películas y libros mediante P2P. Solo tiene 256MiB de memoria y una CPU de un único núcleo pero son más que suficientes para en una noche descargar cualquier contenido que necesite.
Comprobantes de las donaciones
Otros proyectos que me planteo hacer una donación en el futuro son a algún proyecto relacionado con las distribuciones BSD, GNOME o el reproductor VLC. Desde luego no es mucho ni todo lo que recibo como ingresos por la publicidad, sin embargo, espero que ayude a que estos grandes proyectos de software libre sigan mejorando y yo como usuario junto con otros muchos de algunos de ellos disfrutándolos en la totalidad de ellos sin coste alguno en licencias de software.
Hay muchas formas de colaborar con el software libre, donar dinero solo es una de ellas.
Arragonán
Un repaso a mi 2016
January 06, 2017 07:01 PM
Pues ya hemos cambiado de año y no tenía muy claro si escribir algo a modo resumen como en años anteriores, y mucho menos objetivos. Pero oye, que el que salir mencionado al respecto en la bonilista es un buen motivador. Así que al lío.
El primer trimestre del año estuve trabajando con Maubic como contractor haciendo trabajo de backend (node, microservices…) y ayudando a introducir algunos temas de testing, CI… Durante el año he continuado dando soporte a Bichomanía haciendo cositas.
Por otro lado ya estábamos trabajando en la idea de montar los Coding Stones desde principios de año: haciéndonos inception, mucha conversación, ayuda externa… Al fin en Marzo/Abril empezamos con nuestro primer proyecto como banda, durante el año pudimos trabajar en otro, además de hacer trabajos de consultoría y formación. Para mi el estar acompañado de esta gente ha sido (y es) algo que me ha venido la hostia de bien a todos los niveles, lo mejor del año.
En el caso de Outreach Tool, he ido dando soporte puntual a nivel de la web y buscar herramientas. El proyecto ha ido madurando y validando gracias al trabajo del resto del equipo, hemos llegado a un punto donde la limitación es a nivel de producto (un excel), así que en Diciembre decidimos que era el momento de que me pusiera las pilas para desarrollar la aplicación web para hacerlo usable para gente normal.
Además cerramos definitivamente Mhop. Minchador este año ha caído bastante en el olvido y no le he dedicado apenas tiempo. En cambio a mi side-project Mosica le he ido dando cariño a ratos para mejorarlo y resolver un gran problema, el Ayuntamiento de Zaragoza condenó su agenda cultural al ostracismo, sigue publicada como datos abiertos pero tiene una cantidad/calidad de conciertos irrisoria.
En cuanto a viajes… pocos, salvo un par de escapadas, y casi siempre por eventos o trabajo: Estuve en la Qcon London, como voluntario, aproveché para conocer un poco la ciudad. En la BilboStack. Estuvimos todos los Coding Stones de retiro en Alcañiz. En la Tarugoconf. En la Barcelona Software Craftsmanship, donde hice un coding dojo. En Codemotion Madrid donde hablé sobre un proyecto en el que andamos trabajando. En la CAS 2016, donde también hablé, esta vez de equipos indie. En Valencia dando una formación sobre, entre alguna otra cosa, Extreme Programming.
Como se puede ver, este final de año he vuelto a la carretera en cuanto a eventos, llevaba un par en los que sólo presentaba en eventos locales.
Estuve involucrado organizando un nuevo Startup Open Space desde el colectivo CachiruloValley, también moviendo varios FridayDojos y las quedadas de Zaragoza.rb.
En otro (des)orden de cosas:
- Fui a bastantes conciertos, me quedé con las ganas de ir a otros muchos.
- He cerrado bares de vez en cuando, pero menos.
- Entre fútbol sala y fútbol 7 jugué en 3 equipos.
- Además jugué el torneo de fútbol 7 de mi pueblo, con el equipo de Viejas Glorias y me lo pasé genial.
- Tuve mis idas y venidas.
- Disfruté tanto de pilares como de las festas de san roc, pero los años empiezan a pesar.
- Empecé a entrenar a boxeo.
- Cambiamos de oficina a una bastante molona.
- Niko ya no está en la familia. Aún a veces sigo soñando con ello.
- Hicimos muchas cenas en el Bonanza con los caballeretes.
- He improvisado bastantes planes, para acabar teniendo un puñado de aventuras y desventuras.
- Leí una docena de libros, técnicos y no técnicos. Que no es mucho, pero para mi falta de rutina no está mal.
- Tuve 1 despedida y 3 bodas.
- No he notado mucha mejora de mis molestias estomacales respecto al año anterior.
- A algunos amigos los he visto bastante menos de lo que me hubiera gustado.
- Un día fui a escalar.
- Me destrocé el cuádriceps jugando a fútbol 7 y aún estoy recuperándome de ello.
- Volví a participar en Movember.
En conclusión, un año con bastantes luces y algunas sombras, a ver si este hay menos de lo segundo.
Objetivos 2017
Llevo varios años sin marcarme objetivos concretos anuales, mucho menos publicándolos, pero he hecho el ejercicio y aquí van algunos:
- Continuidad con los Coding Stones. Que nos sigan saliendo proyectos y colaboraciones que nos ayuden a seguir creciendo tanto como grupo como individualmente. Tenemos alguna cosa a la vista con muy buena pinta para ello, a ver si sale.
- Tener una versión de Outreach Tool en web en el primer trimestre. A partir de ahí ir refinando y ver a dónde somos capaces de llegar a nivel de negocio.
- Conseguir una rutina de entrenamientos de verdad. Lo que además significaría que me estaría cuidando más.
- Hacer algún viaje de vacaciones de verdad. Tengo un par de destinos pensados, veremos.
- Conseguir volver a darle algo más de vidilla a CachiruloValley. ¿Podcast? ¿Eventos?
- Lanzar la versión 2 de la app móvil de Mosica, y además lanzar algún meta-side-project con un amigo.
- Volver a mentorizar a 1 o 2 desarrolladores. Este año no hicimos Senpai Devs, el formato que teníamos nos consumía demasiado para que fuera sostenible. Pero me apetece mucho ayudar a gente con menos experiencia de la que seguro que yo también aprendería mogollón.
- Ir a algún festival de música. Hay un par que llaman mi atención, pero no sé aún.
Y por pedir algo: Salud, para el resto haré lo que pueda.
¡Feliz an nou!
Bitácora de Javier Gutiérrez Chamorro (Guti)
Cuento: El Test
January 05, 2017 06:35 PM
Desde 2012 con Decreto de Retiro Optativo, que no escribía uno de mis relatos o cuentos. Por motivos obvios, debo excluir el Empieza el día de 2013. Lo cierto es que a principios de 2013, empecé a escribir El Test, pero lo dejé inacabado, hasta recientemente que lo cambié por completo, y lo terminé. No […]
La entrada Cuento: El Test aparece primero en Bitácora de Javier Gutiérrez Chamorro (Guti).
Bitácora de Javier Gutiérrez Chamorro (Guti)
Ejemplo con PB/Forms
January 04, 2017 09:00 AM
En el anterior artículo de Classic PowerBasic gratis, BiaNamaran me sugería hacer un pequeño tutorial tipo “Hello World” explicando la filosofía de trabajo de PowerBasic for Windows (PB/Win), y PowerBasic Forms (PB/Forms), unas herramientas que pese a estar valoradas en 80$, podéis conseguir de manera gratuita. Asumiendo que ya hayáis instalado PBWin y PBForms, cosa […]
La entrada Ejemplo con PB/Forms aparece primero en Bitácora de Javier Gutiérrez Chamorro (Guti).
Una sinfonía en C#
Novedades de C#7: Funciones locales
December 30, 2016 12:36 PM
Ya hemos visto algunas de las novedaes de C#7 en este espacio y es momento de hablar de las funciones locales.
¿Qué son las funciones locales?
En pocas palabras C#7 nos da la posibilidad de declarar una función dentro de otra…si, dentro de otra, con las ventajas que esto aporta:
- Visibilidad acotada
- Acceso a las variables del entorno en que se declara
- No ensuciamos el código con algo muy específico del contexto que necesitamos
Vamos a ver un ejemplo, imaginemos que tenemos una estructura tipo árbol guardada en una base de datos
Simple, cada elemento tiene un padre y así se arma el árbol, del lado de C# tenemos:
class Hoja
{
public string Nombre { get; set; }
public int Id { get; set; }
public IList Hijos { get; set; }
public Hoja Padre { get; set; }
}
Básicamente tiene el nombre, id, el id del padre y el listado de hijos, lo que queremos hacer es armar un árbol poniendo los hijos, lo natural sería hacer algo recursivo.
void BuscarHijos(Hoja hoja, IEnumerable hojas)
{
foreach (var hijo in hojas.Where(i => i.Padre.Id == hoja.Id))
{
hoja.Hijos.Add(hijo);
BuscarHijos(hijo, hojas);
}
}
public IEnumerable Generar()
{
var hojas = Hoja.GetAll();
var lista = new List();
foreach (var item in hojas.Where(i => i.Padre == null)) // buscamos los nodos raíz
{
lista.Add(item);
BuscarHijos(item, hojas);
}
return lista;
}
Entonces, primero buscamos aquellas hojas que no tiene padres (son las raices) y después iteramos esa colección y buscamos las hojas que tienen como padre al nodo raíz actual, usamos una función recursiva para buscar hijos de hijos, esto debería funcionar.
Usando funciones locales.
El mismo código con funciones locales se pude hacer así:
var lista = new List();
foreach (var item in hojas.Where(i=>i.Padre == null))
{
lista.Add(item);
BuscarHijos(item);
void BuscarHijos(Hoja hoja)
{
foreach (var hijo in hojas.Where(i => i.Padre.Id == hoja.Id))
{
hoja.Hijos.Add(hijo);
BuscarHijos(hijo);
}
};
}
Como vemos declaramos la función BuscarHijos no solo dentro del método sino dentro del bucle y acotamos bien su impacto, además tenemos visibilidad de la lista de hojas y de la misma función BuscarHijo, super cool
Hay más detalles sobre las funciones locales en este link, y la propuesta original de la funcionalidad acá.
Nos leemos.
Variable not found
Visual Studio 2017 se llamará finalmente Visual Studio Core 1.0. Y no queda ahí la cosa…
December 30, 2016 08:20 AM
Ya lo demostraron meses atrás con el renombrado de toda nueva pila de tecnologías relacionadas .NET, cuando decidieron cambiar de ASP.NET 5 a ASP.NET Core, una idea que sirvió para centrar las expectativas del producto y entusiasmó a los autores de contenidos (blogs, podcasts, libros, cursos, presentaciones, etc.), sobre todo por lo oportuno de tan estratégico movimiento.Y el renombrado de la suite de desarrollo por excelencia ya se estaba haciendo de esperar, aunque esta vez no nos ha pillado desprevenidos. De hecho, más o menos era un secreto a voces e incluso había algún leak donde se había adelantado la noticia: Visual Studio 2017 se llamará finalmente Visual Studio Core 1.0, rompiendo así con la tradición de versionarlos según el año de aparición, como se lleva haciendo desde el año 2003.
Ayer mismo se publicó la Release Candidate 2, en la que ya figura el nuevo nombre del producto. También es posible descargar ya las actualizaciones de componentes y herramientas de terceros (como JetBrains, Telerik, Component One, DevExpress y otros) con adaptaciones a estos cambios, así como acceder a documentación y materiales actualizados.
Como consecuencia de este cambio, y dado que existe un parecido razonable del nuevo nombre con el popular Visual Studio Code, éste último pasará a denominarse Code Studio Visual, eliminando así toda posibilidad de confusión entre ambos productos, pero manteniendo al mismo tiempo el "aire" de familia entre ellos.La nueva versión disponible a día de hoy, versionada como 2.0, ya hace efectivo este cambio, como podéis ver en la captura de pantalla adjunta.
Pero la oleada de renombrados en la organización no queda aquí, pues lo mismo ocurre con los servicios para desarrolladores en la nube. Con objeto de hacer más sencilla la adopción de la nueva nomenclatura, los servicios conocidos como Visual Studio Online, que luego pasaron a denominarse Visual Studio Team Services, pasarán ahora a llamarse Visual Studio Core Team Online Services, dejando así más patente su relación con la familia de productos y su enfoque de plataforma completamente online.
Aunque algo más adelante, también se verán afectados los servicios generales en la nube, lo que hasta ahora conocíamos como Microsoft Azure, que pasarán a denominarse Microsoft Cloud Core Services. Sin duda, todo un acierto el eliminar la palabra "Azure", que al fin y al cabo no dice nada, y comunicar más claramente dónde se encuentra la aportación de valor del producto, como ya hacen otros proveedores como Amazon, IBM o Google.
Según Patrick Iñuelas, product manager de Microsoft Naming Core Team (la división de marketing encargada de poner en marcha estos cambios) están ahora trabajando en el próximo paso, que es renombrar Xamarin a Silverlight Core, en palabras textuales, "porque tenemos el nombre de dominio disponible".
¿Y mi opinión respecto a todos estos cambios? Pues, por supuesto, absolutamente favorable. Los nombres anteriores sonaban ya algo añejos y a los jóvenes desarrolladores les sonaba a algo “legacy”; es lógico que cada cierto tiempo haya que hacer un reboot para poner los contadores a cero y comenzar de nuevo. En cuanto a los nombres elegidos, creo que son totalmente acertados porque son fáciles de recordar, tienen gancho, y se alinean correctamente con la tendencia "Core" de los últimos tiempos, dando una imagen mucho más fresca y moderna de los productos.
Publicado en Variable not found.
Poesía Binaria
El 2016 para Poesía Binaria. Estadísticas, agradecimientos, redes y SQL. Y sólo es el principio
December 29, 2016 09:10 AM
Ya va acabando el año y, como siempre hago un balance de las estadísticas del blog que comparto con todos vosotros, con algún detalle friki de los que me gustan (como consultas SQL que podríamos hacer todos en nuestro WordPress).
¡Este año el blog no me ha costado dinero!
Y estoy muy contento y orgulloso. Aunque todavía no es un blog rentable. No lo hago por dinero, lo hago porque me ayuda a aclarar mis ideas, me resulta interesante tener una chuleta cuando descubro algo interesante, o cuando paso horas intentando echar a andar un programa, me gusta tener una documentación a mano. Además, intento detallar lo más posible, precisamente porque seguro que dos semanas después de solucionar un problema, no tengo ni idea de cómo lo hice, ni de los pasos que di para llegar a un determinado punto.
Pero ese no es el tema, este año, gracias a que he sido embajador de Siteground, he realizado varios posts patrocinados y por fin, después de 7 años de vida, este año el servidor me ha salido gratis y con lo que me ha sobrado, aprovecharé para hacer una pequeña mejora en el servidor para alojar algunos proyectos personales.
Redes sociales
En Facebook, el 1 de enero de 2016 tenía 651 me “Me gusta”, y a 21/12/20216, hay 818 por lo que, ¡la familia crece! Aunque se han marchado 16 personas. Asiduamente muevo los posts a través de la página, y grupos de programación, por lo que muchos vienen de ahí. En Facebook no sólo publico posts míos, también comparto algunas publicaciones que me parecen interesantes, incluso memes relacionados con la programación.
Aquí van las 5 publicaciones que más éxito tuvieron en Facebook:
- Cuando mi programa compila a la primera… [gif animado]
- Qué sucede cuando la deadline de nuestro proyecto se acerca [gif animado]
- ¿Qué le falta a mi código que no compila? [meme]
- Código fuente original del sistema de orientación del Apollo XI en GitHub. Sí, el proyecto liderado por Margaret Hamilton, que recibió la medalla presidencial de la libertad de Estados Unidos este mismo año.
- Un recorrido de más de 10 años analizando el rendimiento de webs dinámicas en PHP
En lo que respecta a Twitter, he pensado en hacer un Twitter especial para el blog, y separarlo en cierto modo de mi cuenta personal, aunque la programación y la tecnología es una parte muy importante de mi vida, y creo que compartiría aún muchos contenidos similares en las dos cuentas (aunque claro, seguro que si envío algún mensaje a una empresa, programa de televisión o una fotografía de algo que me llame la atención, puede que no le interese a quien sólo me siga por la tecnología). Es una asignatura pendiente. De todas formas, este año, tengo que agradecer especialmente a @Ibermatica_RRHH, @juanfortuna, @jvareblog, @4GeeksLA, @alexcbandera, @maxezek1 (no estáis todos, este año sois muchos los que habéis interactuado por Twitter, y esta es sólo una pequeña muestra. Tengo que automatizar un poco el proceso y las métricas todavía).
Google+… intento meterme, y publicar cosas allí, pero a pesar de los cambios en la interfaz sigue sin llamarme mucho la atención. Sé que para el SEO es bueno, pero siento que entro en una fiesta en la que no conozco a nadie y cuando veo alguna cara que me suena, es un holograma…
Estoy abierto a colaboraciones, aunque este año no he publicado ningún post invitado, podéis contactar conmigo libremente, os haré una mención, os moveré el post por redes sociales, colocaré un link y seguro que será bueno para los dos.
Es más, este año he empezado a animarme de nuevo a escribir posts en otros blogs. Tengo algunas colaboraciones pendientes, pero empecé con esta en DesdeLinux: 5 maneras de desconectar y conectar un dispositivo USB sin retirar las manos del teclado.
Además, estoy guardando como privados todos aquellos posts que haga como invitado, porque en el pasado hice varias colaboraciones en blogs que ya no existen y a mí no me gusta tirar nada.
Lo más visitado
Los que ya me conocéis, sabéis que soy un cabezón y no utilizo Google Analytics, pero utilizo Piwik para contabilizar las visitas. Estos son los 5 posts más visitados este año:
- Bucles y cursores en MySQL con ejemplos. Sube desde la quinta a la primera posición este año.
- Listar archivos dentro de un directorio o carpeta en C
- Creando un servidor que acepte múltiples clientes simultáneos en C
- Introducción a Timer y TimerTask en Java
- Separar palabras de una cadena de caracteres en un array [ C ]
Este año ha sido más variado, pero las visitas que entran de buscadores siempre suelen ser consultas similares.
Lo más comentado
Para conocer lo más comentado en el blog hice lo siguiente:
1 2 3 4 5 6 7 8 9 10 11 12 | SELECT WPC.comment_post_ID AS Post_id, COUNT(WPC.comment_post_ID) AS Comments, WPP.post_title AS Title FROM wp_comments WPC LEFT JOIN wp_posts WPP ON WPC.comment_post_id=WPP.ID WHERE WPC.comment_date>='2015-01-01' AND WPC.comment_date<'2016-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; |
Y obtuve esta lista:
- Crear mapas HTML5 interactivos con RaphaelJS
- El lugar donde se hace este blog
- Cómo instalar o migrar el TPV de Redsys en tu web (nueva versión SHA256)
- Vicio con el teclado, comandos, manías y coletillas que nos salen sin pensar
- Bucles y cursores en MySQL con ejemplos
Lo más buscado dentro de Poesía Binaria
- imagemagick (11%)
- bmp (3%)
- magento (2%)
- servidor (2%)
- fecha (1%)
Es el buscador interno, y casi siempre la gente busca en Google. Yo nunca le he tenido gran estima, pero se han hecho algo más de 1000 búsquedas.
Búsquedas externas
Estas son las palabras clave que vienen de buscadores, sobre todo Google, Bing y Duck Duck Go (en este orden), aunque Google gana de calle como buscador preferido:
- timer java
- for en bash
- for en mysql
- expresiones regulares en c
- eliminar elemento array php
Esto se mantiene casi como estos años atrás, aunque las expresiones regulares en C están ganando terreno… tendré que dedicar algún post más a la causa.
Navegadores más usados
- Google Chrome (70%)
- Mozilla Firefox (23%)
- Safari (3%)
- Opera (1%)
Ya no suele entrar gente con Internet Explorer o Microsoft Edge. Y Google Chrome gana posiciones.
Sistemas operativos
- Windows (61%)
- GNU/Linux (cualquier distribución) (17%)
- Android (10%)
- Mac OSX (5%)
Aunque las posiciones se mantienen, Windows pierde un 1%, las distribuciones de GNU/Linux pierden 2% y Android sube.
Enlaces entrantes
Dejando fuera entradas desde buscadores, Facebook, Twitter y otras redes sociales. Desde estas páginas he recibido más visitas:
- Planet Libre
- bloguers.net
- Ubuntu fácil
- Desde Linux
- BlogStack (ya desaparecido :'(
Países
- España (47%)
- Mexico (16%)
- EEUU (9%)
- Argentina (6%)
- Colombia (6%)
Las visitas de Latinoamérica han caído un poco y Estados Unidos entra con fuerza. Pero casi todo mi público proviene de España.
Horas más visitadas
- 11:00 – 12:00 (7.1%)
- 12:00 – 13:00 (7.1%)
- 10:00 – 11:00 (6.6%)
- 16:00 – 17:00 (6.4%)
- 13:00 – 14:00 (6.3%)
Otras curiosidades
Este año se han publicado 89 posts y 5 páginas (1.8 por semana, aunque muy lejos de mi reto de 150 este año) de los cuales 51 de ellos contienen código y 20 de ellos ejemplos de uso de terminal (con el plugin SimTerm, que lo liberé este verano, por lo que no se cuentan todos los posts con ejemplos). Además, he modificado 26 posts de años antetiores.
En total 260 fragmentos de código (3 menos que el año pasado, aunque no he contado los de este post). De los cuales:
- 71 son de C
- 69 son de BASH
- 46 son de PHP
- 45 son de C++
Cada post tiene una media de 1527.4886 palabras o unas 11510.2386 letras, ¡cómo me enrollo!. También he publicado 732 enlaces (algo menos del doble que el año pasado) de los cuales 304 son internos (428 externos).
Los posts más largos
- Descubrimos WP-CLI para hacer maravillas y automatizar tu WordPress al máximo (28415 letras, 4345 palabras)
- Windows10 y los sistemas operativos modernos (26619 letras y 3992 palabras)
- ¿Cómo crear un chat utilizando WebSockets en C++? Y no morir en el intento (36683 letras y 3723 palabras)
- Balanceo de carga con Amazon Web Services Elastic Load Balancer. Ejemplos, consejos y trucos. (29821 letras y 3624 palabras)
- Cómo convertirte en un señor del tiempo en C/C++ desde cero (Parte 1) (26591 letras y 3558 palabras)
Posts más cortos
Y los posts más cortos (no recopilatorios):
- Cómo hacer un chat punto a punto seguro con openSSL (2571 letras y 283 palabras)
- Un tiempo de descanso obligado para el blog, historias y hexadecimales… (2203 letras y 298 palabras)
- Cómo subir tipos de archivo que WordPress no nos deja subir “por seguridad” (2635 letras y 307 letras)
- Cómo generar una clave privada a partir de un sonido captado por el micrófono (2631 letras y 347 palabras)
- Cifrar y descifrar un archivo fácilmente con openSSL (3625 letras y 439 palabras)
Anexo MySQL
Muchas estadísticas las he sacado consultando la base de datos, aquí os pongo las consultas utilizadas:
Total de posts en el año
1 2 3 4 5 6 |
Posts que contienen código
Utilizo un plugin que utiliza el shortcode [ cc ] … [ /cc ] para colorear el código, con la consulta detecto dónde se ha llamado:
1 2 3 4 5 6 7 |
Posts que usan simterm
En este caso es igual pero con el shortcode [ simterm ]
1 2 3 4 5 6 7 |
Páginas publicadas
1 2 3 4 5 6 |
Contar letras y palabras
Para determinar el número de palabras en el post, se han contado las letras del post con espacios y sin espacios. No es la forma más precisa, pero nos da una idea.
Media de letras y palabras:
1 2 3 4 5 6 7 |
Total de fragmentos de código
1 2 3 4 5 |
Contar enlaces
1 2 3 4 5 6 | SELECT SUM(CHAR_LENGTH(post_content) - CHAR_LENGTH(REPLACE(post_content, '<a href=', '')))/CHAR_LENGTH('<a href=') AS Links FROM wp_posts wpp WHERE post_type = 'post' AND post_status NOT LIKE '%draft' AND post_date>='2016-01-01' AND post_date<'2017-01-01'; |
Posts más largos
1 2 3 4 5 6 7 8 |
Posts más cortos
1 2 3 4 5 6 7 8 9 | SELECT post_title, LENGTH(post_content) AS Chars, LENGTH(post_content) - LENGTH(REPLACE(post_content, ' ', ''))+1 AS Words FROM wp_posts wpp WHERE post_type = 'post' AND post_status NOT LIKE '%draft' AND post_date>='2016-01-01' AND post_date<'2017-01-01' AND post_content NOT LIKE 'BITes%' ORDER BY Words ASC LIMIT 5; |
Mis posts recopilatorios suelen tener BITes al principio del título, por lo que aquí los descarto.
Posts de otros años modificados este 2016
1 2 3 4 5 6 7 |
The post El 2016 para Poesía Binaria. Estadísticas, agradecimientos, redes y SQL. Y sólo es el principio appeared first on Poesía Binaria.
Adrianistán
Mozilla desiste, Rust será sustituido por Jai
December 28, 2016 12:00 AM
La lucha por un nuevo lenguaje de programación que sustituya a C comenzó hace años con los siguientes contendientes: C++14, Go, Rust y D. Finalmente Mozilla ha abandonado el desarrollo del lenguaje de programación Rust. Se ha decidido, no con polémica, iniciar una transición hacia Jai, el lenguaje de programación diseñado por Jonathan Blow.
Muchos conocerán a Jonathan Blow por ser el creador de juegos como Braid o The Witness, pero además, lleva trabajando en Jai desde 2014.
Jai actualmente es un lenguaje que transpila a C++, para posteriormente ser compilado por un compilador normal de C++. La idea detrás de Jai es ser el lenguaje de programación de videojuegos. Tras haber trabajado muchos años con C++, Blow ha diseñado un lenguaje que mejore las partes malas de C, conservando sus partes buenas. Blow criticó al lenguaje Rust asegurando que usar Rust era como la casa que tiene sus esquinas plastificadas pero luego te deja una pistola cargada sobre la mesa.
Brendan Eich, creador de JavaScript ha declarado:
En el fondo sabíamos que podría pasar. En Mozilla solo sabemos diseñar lenguajes horribles. De hecho a mí me dejaron hacer JavaScript y ya sabemos lo que pasó
Ahora Mozilla se ha acercado a Blow para aprender más sobre Jai, un lenguaje mucho más práctico. Jai permite al programador hacer lo que quiera, pero opcionalmente y a través de syntactic sugar es optimizado y analizado para llegar a mejorar en rendimiento incluso a C.
James Gosling, creador de Java ha dicho:
Nosotros diseñamos Java para que fuese muy difícil escribir código malo. Cualquier mejora sobre eso se merece mis aplausos, lástima que no se oigan porque la JVM todavía está arrancando.
A día de hoy no existen compiladores de Jai disponibles al público y la única copia se cree que está en manos de Jonathan Blow. La única documentación existente se encuentra recopilada en GitHub por fans de Jai.
Definitivamente este año no ha sido muy bueno para Mozilla, que ya ha tenido que abandonar otros proyectos como Firefox OS o Matchstick, que prometían innovación pero que por A o por B no han sabido llegar a buen puerto.
ACTUALIZACIÓN: ¡Feliz día de los inocentes!
La entrada Mozilla desiste, Rust será sustituido por Jai aparece primero en Blog - Adrianistan.eu.
Variable not found
Enlaces interesantes 263
December 27, 2016 08:00 AM
Pues ahí va la última recopilación de enlaces de 2016. Cortita, como corresponde a esta época del año, pero espero que igualmente interesante. :-).NET
- C# 7–Default method implementation?
Eduard Tomás - Qué son los tipos por valor y por referencia en .NET y C#
José Manuel Alarcón - The week in .NET – .NET Core triage on On .NET, ShareX
Bertrand Le Roy - Performance exercise: Minimum
Andrey Akinhin - Time Period Library for .NET
Jani Giannoudis - Decimal vs Double and Other Tips About Number Types in .NET
Matthew Jones
.NET Core / ASP.NET Core
- ASP.NET Core Routing Tutorial
Thomas Ardal - Redirecting unknown cultures when using the url culture provider
Andrew Lock - Unit Testing in dotnet core
Anuraj P. - ASP.NET Core Response Optimization
David Pine - Free Intermediate ASP.NET Core 1.0 Training on Microsoft Virtual Academy
Scott Hanselman - Using Web Sockets with ASP.NET Core
Gérald Barré - Distributed Cache using Redis and ASP.NET Core
Petru Faurescu - Implement a client white-list using ASP.NET Core middleware
Damien Bowden
Azure / Cloud
- Going Serverless with Azure Functions: SendGrid
James Montemagno - How to setup a webserver in an Azure Virtual Machine
Anuraj P. - AzCopy 5.1.1 Release
Michael Curd - Working with Azure Logic Apps
Anuraj P. - Several New Azure Services now available in UK
Andres Juarez
Conceptos/Patrones/Buenas prácticas
- Los Patrones de Diseño Hoy: Patrones de Comportamiento
Juan María Hernández - Why Exceptions should be Exceptional
Matt Warren - Making bits faster
Szymon Warda
Data
- JSON in SQL 2016
Prashanth Jayaram - Use NPoco ORM With ASP.NET Core
Talking Dotnet - SQL Server on Linux: How? Introduction
Scott Konersmann & Slava Oks & Tobias Ternstrom
Html/Css/Javascript
- Programación Funcional en JavaScript: Los combinadores
José Antonio Dongil - Introducing CSS3
Louis Lazaris - JavaScript: 2016 in Review
Craig Buckler - CSS Writing Modes
Jen Simmons
Visual Studio/Complementos/Herramientas
- ReSharper Interactive Tutorials
Alexey Totin - A Simple File Explorer Magic Trick
Greg Duncan - Let Other Processes Run When Debugging One Process
Peter Vogel - Awesome, Text-Based Diagrams with Mermaid
Adam Anderson - Introducing Brotli compression in Microsoft Edge
Rob Trace - Visual Studio Debugging and 64 Bit .NET Applications
Rick Strahl - Ghost Browser: múltiples sesiones con un solo navegador
José Manuel Alarcón
Otros
- Myths about programming and programmers
Syed Ishtiaque Ahmad - ¿Por qué hay en la práctica tanta falta de conocimiento sobre cómo gestionar software?
Javier Garzás - Arquitectura de software como habilidad
Modesto San Juan
Publicado en Variable not found
Poesía Binaria
Cómo configurar auto escalado asociado al balanceador de carga de Amazon Web Services
December 26, 2016 06:04 PM
Como hemos visto en anteriores posts, cuando una aplicación crece debemos hacer que el rendimiento sea aceptable, tolerar errores y que no nos salga muy caro. También, hace unos días vimos cómo configurar el balanceo de carga de nuestros servicios en Amazon Web Services.
Amazon, dentro de sus servicios, nos proporciona una forma fácil y amigable de ahorrar costes, al mismo tiempo que mantenemos nuestros servicios online y con el mejor rendimiento posible. Lo lograremos haciendo uso del auto escalado. Es decir, en tiempo real, se contratarán máquinas y comenzarán a servir nuestra aplicación desde nuestro balanceador de carga. La gracia es que la contratación de estas máquinas se realizará en función de los parámetros de uso, como puede ser que la carga de las instancias que hay actualmente supere cierto umbral, y cuando la carga de las máquinas baje de cierto punto, dichas instancias se devolverán y ya no supondrán más coste para nosotros. Con este sistema no tendremos que pagar por máquinas que no estemos utilizando en un momento determinado, al mismo tiempo que nadie tiene que estar pendiente de conectar o desconectar máquinas en el sistema, todo funcionará automáticamente.
Extrayendo la imagen a utilizar
Todas las instancias que se lancen con el autoescalado serán iguales. Todas tendrán el mismo sistema operativo, los mismos programas, tareas, etc. Serán exactamente iguales. Esto es bueno porque sólo hay que configurar una máquina para que todas estén funcionando de igual manera. Es posible que la aplicación web que corres con este sistema se actualice a mayor ritmo del que puedes actualizar tus imágenes. Es decir, las imágenes deberán ser actualizadas con el tiempo para incluir los últimos parches del sistema operativo, software de servidor (Apache, PHP, etc) y configuraciones (políticas de iptables, optimizaciones de memoria, etc), pero tu aplicación web tal vez evolucione mucho más rápido, puedes tener decenas de actualizaciones diarias y no es plan de crear una imagen cada vez que haya una actualización. En estos casos, antes de arrancar la máquina puedes hacer un git pull origin master nada más arrancar para que todo esté al día antes de empezar a servir.
Una vez tengamos preparada una instancia nueva con todo configurado y listo para ser nuestra instancia modelo, debemos crear una imagen de la misma, para ello, en el panel de EC2 hacemos click con el derecho en la instancia, vamos a Image y luego Create Image:
. Con esto, vamos a crear una AMI a partir de la instancia que hemos seleccionado. Nos presentará algo como esto, le damos nombre, descripción y aceptamos:
Configurando el envío de mensajes
Cada vez que se superan umbrales de CPU o transferencia, cada vez que se lanza una máquina o se desactiva otra, Amazon nos puede enviar notificaciones de estos estados por diferentes vías. Ya que Amazon lo tiene todo bien atado estas notificaciones se enviarán a través de SNS (Simple Notification Service, del que comentamos algo hace tiempo). El objetivo para nosotros será estar al tanto en todo momento de qué pasa con nuestros servidores.
Por lo que configuraremos rápidamente SNS, yendo a su panel de control y luego Create topic:
Estableceremos un nombre para nuestro tema de mensajería y un display name (un nombre algo más bonito y visual, aunque por rarezas de la vida debe ser muy corto también):
.
Por último definimos el protocolo (en este caso, para probar, el e-mail) y en EndPoint ponemos nuestra dirección de correo. Cuando queramos hacer algo más serio podemos utilizar el protocolo HTTP o HTTPS para mandar el mensaje directamente a un servidor web (o un servidor de control dentro de nuestra red):
Configurando el auto-escalado
Ahora, dentro de nuestro panel de EC2, nos vamos a Auto Scaling, Launch Configurations y creamos una nueva configuración. Nos preguntará por la AMI a utilizar (la imagen que hemos creado de la instancia anterior):
.
Tras ello, configuramos nuestra configuración de lanzamiento, le damos nombre (en la captura de pantalla el nombre tiene un espacio, no es muy recomendable, a veces da problemas; establecemos opciones de compra (Las Spot Instances nos pueden salir más baratas, pero puede que no haya disponibles o que las perdamos. Finalmente en el tipo de dirección IP, para este caso no es necesario que tenga una IP pública asignada, normalmente no vamos a entrar a esas máquinas desde Internet y no queremos que nadie entre a ellas directamente:
Continuamos estableciendo los volúmenes (nos facturarán por esto, por lo que debemos tener cuidado eligiendo. Aunque elegir algo muy pequeño puede que nos deje sin espacio en el transcurso del servicio, nos deje tirados y nos terminen cobrando más por tener que lanzar más máquinas de forma innecesria).
.
Es momento de configurar el grupo de seguridad. No tenemos por qué aceptar SSH si no queremos:
.
Ahora, crearemos el grupo de auto escalado, para ello debemos dar un tamaño (número de máquinas inicial del grupo), VPC, subred y. como lo creamos para ser utilizado con un balanceador de carga, configuramos el balanceador que estamos utilizando (testinglb), el tiempo que se esperará antes de empezar la monitorización de salud y la protección. Protect From Scale In, evitará que se desconected las máquinas cuando dejan de ser utilizadas, normalmente no lo activaremos porque en caso de servidores web independientes, estos podrán desactivarse y no será necesario saber nada de ellos pero, en ocasiones, puede que en ciertas configuraciones estas máquinas tengan que realizar tareas importantes que no deben ser interrumpidas y su desconexión puede causar un desastre.
Creación de alarmas y políticas de auto escalado
Lo siguiente será crear políticas de auto escalado, por lo que definimos el número mínimo y máximo de máquinas que tendremos dentro del grupo y estableceremos las políticas que seguiremos para incrementar este número o decrementarlo. Este no es el número de máquinas dentro de nuestro balanceador, podemos tener tanto máquinas predefinidas introducidas a mano como grupos de autoescalado que funcionarán por sí solos. Lo comento por si alguna máquina dentro del balanceador va a destinarse a hacer tareas más duras, o no debe ser retirada bajo ningún concepto o debe tener una configuración ligeramente diferente:
.
Dentro de las políticas de incremento de máquinas, tendremos que establecer una política de monitorización que debe cumplirse para añadir una o más máquinas:
.
En mi caso, lanzaré más máquinas cuando iguale el 83% de uso de CPU de media en las máquinas del grupo de auto escalado al menos durante 5 minutos. Como siempre, esto depende de la carga de CPU que introduzca nuestra aplicación, debemos probar el valor óptimo para que el servicio no pierda calidad.
Luego definiremos el tiempo que esperaremos antes de empezar otro escalado. Nuestra máquina tendrá que arrancar, actualizar sus repositorios, identificarse a otros servicios que tengamos conectados y empezar a servir. Normalmente el arranque incrementará el uso de CPU, pero cuando esta máquina sea tenida en cuenta en el balanceador la carga global de nuestro sistema empezará a bajar (se supone), por lo que si tardamos unos 30 segundos en arrancar y otros 30 segundos en ponernos al día, 120 segundos es un buen valor, aunque podemos subirlo un poco más. Pero como siempre, depende de nuestra aplicación.
Haremos lo mismo con las políticas para que esas máquinas sean destruidas:
.
Por último definiremos la política de notificaciones de Amazon (con la que nos enviará notificaciones acerca de las instancias):
.
Ya lo tenemos
¡Ya tenemos todo montado y funcionando! En unos segundos, el número de instancias iniciales especificado será lanzado y empezarán a trabajar dentro del balanceador. ahora bien, ¿cómo vemos que está funcionando todo bien? Para eso dejé el SSH funcionando antes. Dentro del mismo VPC inicio una instancia que conecte con la IP de una de las máquinas que se acaba de lanzar y le pido que calcule por ejemplo dígitos del número pi en python:
1 2 3 4 5 6 7 8 | #!/bin/bash while (( 1 )); do echo "from decimal import Decimal, getcontext getcontext().prec=10000 print sum(1/Decimal(16)**k * (Decimal(4)/(8*k+1) - Decimal(2)/(8*k+4) - Decimal(1)/(8*k+5) - Decimal(1)/(8*k+6)) for k in range(100))" | python ; uptime; done |
Con esto, pronto la CPU de las máquinas subirá y en unos minutos podremos ver que las máquinas empiezan a crearse y, por desgracia, a facturarse.
Ideas para tenerlo todo bien atado
Es importante que personalicemos los scripts de arranque y apagado de la máquina para que esta no sea accesible por el balanceador de carga demasiado pronto. Si tenemos que copiar nuestros datos con git, debemos esperar a que éste termine y si tenemos que hacer conexiones con otras máquinas, debemos establecerlas antes de nada.
Lo mismo antes de que se desconecten las máquinas, debemos sincronizar logs, hacer verificaciones y desconexiones antes de apagar la máquina del todo.
Problemas de conectividad
Tal vez cuando accedáis a instancias internas no tengáis conexión a Internet. Se podrá acceder a ellas, gracias al Internet Gateway, pero éstas no tendrán conexión a Internet. Esta conectividad se puede utilizar creando una NAT Gateway.Para conectar a Internet se necesita una IP pública y dado que no tenemos IP pública necesitamos una forma de conseguirla, así igual que todos los dispositivos de casa (ordenadores, tablets, móviles conectan a Internet a través de nuestro router doméstico (que gracias a nuestro proveedor de Internet tendrá una IP pública), aquí debemos hacer lo mismo, asignar un router.
Puede ser un poco engorroso, pero debemos tener una subred que tenga conexión a este NAT.
Este router puede ser una NAT Gateway (que por supuesto Amazon nos cobrará aparte), o puede ser una instancia de nuestro sistema que sí tenga una IP hacia el exterior, y como tiene una IP puede hacer de puerta de enlace. Esto es, que todas las instancias que quieran tener conexión a Internet deberán pasar por mi instancia puerta de enlace para que ésta las conecte a Internet.
Una pequeña aproximación a una instancia NAT sería utilizar IP Forwarding:
Aunque podéis coger ideas para esto en este post, con el fin de que podamos seleccionar a qué instancias damos permiso a conectarse.
Añadir o quitar áquinas del balanceador desde consola
Algo que también nos puede resultar útil es el hecho de iniciar una instancia EC2 desde la consola de AMAZON y añadirla al balanceador a mano. Esto puede ser útil cuando antes de entrar en el balanceador necesitemos ejecutar ciertas tareas de mantenimiento o incluso podemos utilizar estos comandos a mano para hacer un diagnóstico avanzado de una máquina individual.
Visto aquí.
Y tu, ¿utilizas el auto escalado de Amazon?
¿Qué te parece la idea? Deja tu comentario más abajo.
Foto principal: Calum MacAulay
The post Cómo configurar auto escalado asociado al balanceador de carga de Amazon Web Services appeared first on Poesía Binaria.
Koalite
Resumen 2016
December 26, 2016 05:06 AM
Otro año se termina y, como hombre de costumbres que soy, me toca post resumen de lo que ha sido el blog durante el 2016. No son posts especialmente interesantes, pero seguro que alguien tiene curiosidad por conocer algunas cifras y es un buen momento para recordar algunos posts que a lo mejor te perdiste.
Estadísticas
Sé que es repetir lo que digo cada año, pero quiero dejar claro que los números no son demasiado importantes e me importa mucho más la calidad que la cantidad. Y esa calidad no tiene por qué venir en forma de visitas, puede ser, sencillamente, lo que he aprendido escribiendo los posts o lo que me he divertido haciéndolo.
Dicho esto, este año he escrito 34 posts, 6 menos que el año pasado, en el que a su vez, había escrito 6 menos que el año anterior. Ádemás de la coincidencia de seguir reduciendo la cantidad en 6 posts anuales, al menos he conseguido cumplir el objetivo que me había marcado para este año, que era llegar a los 30 posts. Teniendo en cuenta lo ajetreada que ha sido mi vida este año (para bien, afortunadamente) estoy más que contento.
Si todo va bien, el año que viene espero estar aún más ocupado con otras cosas y poder dedicar menos tiempo al blog, así que me conformaría con llegar a los 24 posts.
Según Google Analytics, han pasado por aquí más de 200.000 visitantes en unas 270.000 sesiones y 380.000 páginas vistas. Son números muy parecidos a los del año pasado; teniendo en cuenta que he escrito menos posts y que no he tenido ningún post anómalo como el de Viejos de 30 años que desvirtúo por completo las estadísticas del 2015, creo que no está mal.
En total hemos dejado 350 comentarios, igual que el año pasado. Considerando que en el 2015 hubo 60 comentarios en un único post (algo totalmente excepcional), estoy especialmente contento con esa cifra. La parte de comentarios, twitter y demás me gusta especialmente porque me permite echar una mano a algunos, aprender de otros, y divertirme discutiendo sobre temas variados.
Lo más visitado
El top 5 de post de año es más o menos variado:
- Las ventajas de no usar inyección de dependencias.
- Los microservicios no son para mi.
- Por qué es importante flux y por qué (probablemente) no debes usarlo.
- Lo peor de desarrollar software.
- Cuando utilizar TDD.
Aunque no se cuela en ese top, es también reseñable el interés despertado por el post sobre Mitos y leyendas sobre métodos estáticos, que pese a haber sido publicado hace sólo un mes se cuela en el top 10.
Esta vez mis posts preferidos están más alineados con los más visitados (seguramente porque cada vez me centro más en escribir sobre cosas que me entretienen), pero como siempre hay alguno que no ha entrado (ni entrará jamás) entre los más visitados.
Me divertí especialmente Resolviendo el acertijo de Einstein y Diseñando un router para aplicaciones SPA. Será que entre tanto post de opiniólogo, como dice Rubén, a veces me apetece jugar con cosas más tangibles.
Hasta luego, y gracias por el pescado
Y con esto doy por cerrado el 2016. Dejo pendiente un post con un resumen tecnológico de lo que ha sido este año para mi, pero ahora toca comer muchas cosas insanas y descansar un poco, que el principio del 2017 se antoja de lo más intenso. Menos mal que 2017 es primo y eso siempre es agradable.
¡Feliz 2017 a todos!
Posts relacionados:
Poesía Binaria
Poesía Binaria os desea ¡Felices fiestas! Y un pequeño juego :)
December 25, 2016 02:00 AM

Tenía que hacer honor al nombre del blog y estas fiestas no iban a ser menos. Hoy os traigo un mensaje encerrado en el árbol y os propongo un juego: para contestar al mensaje, debéis hacerlo de la misma forma en la que está codificado el mensaje.
0
100
011001
100101011
011000110100
101111010001000
00011011100
11000010111011
00110100101100100
01100001011001000010
00000110010001100101011
100110110010001100101001000
00011001010110110000
10000001100010011011000
11011110110011100100000010
10000011011110110010101110011
0110100101100001001000000100001
0011010010110111001100001011100100
11010
01011
00001
The post Poesía Binaria os desea ¡Felices fiestas! Y un pequeño juego :) appeared first on Poesía Binaria.
Blog Bitix
Hemeroteca #10
December 24, 2016 11:00 AM
Echando un vistazo a estos seis últimos meses han sido buenos, en número de artículos que he escrito y publicado como en el aumento de número de páginas vistas mensuales con respecto a inicios de 2016 y en similar proporción los ingresos mensuales por publicidad AdSense. De esta forma el esfuerzo en tiempo que supone escribir los artículos me es recompensado de alguna forma.
Otros seis meses acumulados de vida, ya son poco menos de 7 años desde que tengo un blog y 3 desde que empecé a escribir en Blog Bitix. A pesar de la gran cantidad de tiempo que me requiere escribir y publicar artículos, tanto como entre 3 y 10 horas de dedicación por artículo, es una de las cosas que más me alegro de haber empezado en el año 2010. Lo que aprendo con cada artículo de las cosas que me motivan y compartirlo por si a alguien más le resultan interesantes me resulta muy satisfactorio.
En estos seis meses en vez de publicar un solo artículo por semana he estado publicando dos artículos y algunas semanas incluso 3. El número de páginas vistas mensuales han aumentado hasta el punto de multiplicar por cuatro las páginas vistas que tenía a inicios de año siendo ahora unas 26K/mes. Y no son muchas, otros blogs personales tienen muchas más, dos o tres veces más. La mala noticia es que un porcentaje importante de las visitas provienen de unos pocos artículos bien posicionados en Google. En cualquier caso en una proporción similar que han aumentado las páginas vistas han aumentado los ingresos por publicidad de Google AdSense que incluyo en el blog, e incluso los últimos meses los ingresos han sido de alrededor de 20€ y 25€, con lo que podré hacer más donaciones al software libre y más frecuentemente. En definitiva este ha sido un buen año en este aspecto, si el siguiente fuera similar sería estupendo.
A pesar de la gran mejora en número de visitas mensuales durante este año cuesta un horror hacer crecer al blog y escribir y publicar al ritmo que lo he estado haciendo durante estos últimos meses. Hay que tener un poco de intuición y algo de suerte para acertar con artículos que se posicionen bien en los buscadores si lo que queremos es aumentar las visitas.
Una de las cosas que me estoy arrepintiendo ahora es no de tener dominio propio, no lo hice porque con GitHub Pages me ofrecía el hospedaje gratis y sin complicaciones. Ahora me plantearía hospedar el blog en una máquina de Linode, Digital Ocean o en la reciente competencia de estos con Amazon Lightsail. Mas que por necesidad por practicar con Ansible e implementar en el blog HTTPS/2 o usar Let’s encrypt asi como aprender sobre esos servicios en la nube. La migración es posible pero posiblemente no perfecta.
Durante este periodo de tiempo he realizado algunos cambios a nivel de diseño en el blog como el buscador de contenido con DuckDuckGo, he quitado del panel lateral los artículos recientes, he creado una nueva página por si alguna organización quisiera contactarme por publicidad e incluido un mensaje para aquellos que tengan un bloqueador de anuncios. Para tratar de monetizar algo más el blog también he estado considerando en inscribirme en páginas como Publisuites o Coobis para escribir artículos patrocinados esporádicamente y siempre con artículos escritos por mi, con mi opinión y de la forma más honesta que pueda. Finalmente, me decidí por Publisuites pero aún no he recibido ninguna proposición de artículo patrocinado.
Esta es la recapitulación de artículos que he escrito durante estos seis últimos meses organizados por temática empezando por unos pocos artículos más de la serie web, algunos sobre GNU/Linux con varios artículos sobre juegos y otro sobre varias de las distribuciones más importantes y usadas, otros cuantos sobre programación relacionados con el lenguaje Java, por supuesto y de los que más gratificantes me resultan aunque no sean muy visitados relacionados de alguna forma con Apache Tapestry o algunos de opinión como repaso a las motivaciones que me llevaron a elegir a Pepephone como proveedor de internet y otro de opinión sobre el rápido avance de la tecnología. En total han sido 47 artículos cuando en otros periodos de tiempo solo hubiese publicado unos 26.
He añadido a la serie de artículos sobre desarrollo web varios interesantes que forman parte de lo esencial a conocer.
- Cómo optimizar un sitio web con compresión GZIP en Nginx y Apache HTTPD
- Configurar Nginx como balanceador de carga
- Cómo crear un proxy inverso entre el servidor web Nginx y un servidor de aplicaciones Java
- Las cabeceras de cache del protocolo HTTP
- Configurar Nginx para cachear respuestas del servidor de aplicaciones
- Cómo y por que redirigir tráfico web del dominio raíz al subdominio www (o viceversa)
La sección de artículos sobre GNU/Linux destaca la serie sobre juegos en el sistema del pingüino. He empezado a usar por obligación en el trabajo macOS que me ha servido como excusa para escribir un par de artículos sobre el sistema operativo de Apple.
- Comandos básicos de GNU/Linux
- Guía básica del intérprete de comandos Bash
- Jugar al ajedrez en GNU/Linux con GNOME
- Cómo crear vistas previas de imágenes con ImageMagick
- Jugar al clásico de estrategia de tablero Go en GNU/Linux
- Juegos incluidos en el entorno de escritorio GNOME
- Jugar a videojuegos clásicos y míticos de arcade con Mame en GNU/Linux
- Descargar paquetes a actualizar sin instalarlos en Arch Linux
- 22+ buenos juegos en GNU/Linux
- Varios juegos de culto con ScummVM en GNU/Linux
- Cómo configurar una impresora HP en red en Arch Linux
- Localización de un comando y paquete propietario de un archivo en GNU/Linux
- Cómo instalar y probar macOS con VirtualBox en Windows o GNU/Linux
- Elegir una distribución GNU/Linux según el usuario, uso o equipo
- Guardar contraseñas de forma segura con KeePassX
He escrito otros cuantos artículos de programación en algunos casos relacionados de alguna forma con Apache Tapestry, Java y JavaScript.
- No, un tag JSP o un tag de Grails no es equivalente a un componente de Tapestry
- Por qué guardar las fechas en UTC en la base de datos
- Ejemplo de API REST en Java con JAX-RS y Spring Boot
- Monitorizar con eventos de Google Analytics una página web
- Autenticación con OAuth y Keycloak en un servicio REST con JAX-RS y Spring Boot
- Cliente de un servicio REST autenticado con OAuth en Java
- Generación de código en tiempo de ejecución con Byte Buddy
- Integrar autenticación OAuth con Keycloak, Shiro, Apache Tapestry y Spring Boot
- Componente select de Apache Tapestry con funcionalidades adicionales usando bootstrap-select
- Componente select múltiple en Apache Tapestry
- Añadir botones selectores de opciones a select múltiple de bootsrap-select
- Histórico de datos, auditoría y diferencias entre objetos con Javers en Java
- Usar una imagen de fondo aleatoria al cargar una página web
- Introducción al JavaScript de ECMAScript 6
- Cómo implementar correctamente y por qué los métodos equals y hashCode de los objetos Java
- Transpiling de ECMAScript 6 a 5, Uglify y ESLint con Gulp
En la categoría de artículos de opinion junto con otros de teḿatica variada han sido los siguientes:
- Eligiendo proveedor de internet, finalmente Pepephone
- Sobre los ínfimos impuestos que paga Apple
- Artículo #2 de Yo apoyo al software libre
- Gestionar los enlaces de una bitácora con Hugo
- Sobre el rápido avance de la tecnología
- 3 formas sencillas de monetizar un blog
- Mi primer Mac, yo usuario de GNU/Linux
- Instalar programas con Homebrew en macOS
- Desempaquetado bombillas LED de PHILIPS
- La fábrica de Blog Bitix
¡Felices fiestas! ¡A por el 2017!
Bitácora de Javier Gutiérrez Chamorro (Guti)
Powerbasic gratis
December 21, 2016 02:44 PM
Tras el triste fallecimiento de Robert Zale (Bob), PowerBasic ha entrado en una importante crisis. Tanto es así que han decidido cancelar el desarrollo del PB/Win 11 y PB/CC 7, que quedó detenido en fase alfa antes de fallecer Bob. Prometía grandes mejoras, incluyendo soporte nativo x64. Desgraciadamente Vivian Zale, su esposa a cargo de […]
La entrada Powerbasic gratis aparece primero en Bitácora de Javier Gutiérrez Chamorro (Guti).
Poesía Binaria
7 Servicios online para compilar, ejecutar y ver la salida de pequeños programas
December 21, 2016 09:21 AM

Cuando estamos aprendiendo a programar o, cuando estamos probando algún pequeño código que hemos encontrado en Stack Overflow nos viene muy bien tener a mano un lugar para compilar rápidamente y ver qué sucede. Es más, incluso se nos puede presentar el caso de que una versión específica de un compilador tiene un fallo que nos trae de cabeza y nos vendría bien probar otra versión para salir de dudas.
Actualmente hay multitud de páginas que nos dan la posibilidad de compilar pequeños programas online y probar la salida de los mismos sin necesidad de tener que compilarlos nosotros (no imagináis la de pruebaX.c y pruebaX.cc que tengo en mi disco duro para cosas pequeñas de unas pocas líneas).
Hace unos 10 años tal vez pensaríamos que sería inviable lanzar un compilador dentro de un servidor para que todo el mundo compile lo que quiera (cosas buenas y malas). Por un lado, necesitamos potencia, pero actualmente los servidores son muy potentes, además, no habrá tantos programadores, por otro lado este tipo de servicios tienen controlados los tiempos de compilación y de ejecución, vamos, tenemos un tiempo límite para todo; también controlan la carga en cada momento del servidor, ya que habrá momentos en los que no se pueda compilar y te tienes que esperar, que para eso es gratis; también controlan el espacio en el que ejecutas el código, por un lado el usuario que ejecuta el programa tendrá unos privilegios muy básicos, por otro lado tendremos nuestro sistema enjaulado, además de RAM máxima y espacio en disco acotados; sin olvidar que habrá cosas que no podamos ejecutar. Aún así, son muy buena idea para pequeñas pruebas, algo como jsfiddle, codepen, sqlfiddle, pero para otro tipo de lenguajes.
En algunos casos, estos servicios online nos dicen cuáles son sus límites, en otros casos no, por lo que he llevado a cabo algunos experimentos para determinarlo. Creo que algunos factores importantes que se pueden mirar en estos servicios son los lenguajes soportados, el límite de tiempo de compilación y ejecución (así no hacemos bucles infinitos), el límite de memoria RAM que puede utilizar un programa, el límite de procesos que se pueden crear, y si podemos utilizar ficheros o tenemos acceso a red.
Como veis, son factores que aseguran la persistencia del servicio y que no son utilizados para realizar ataques. Por ejemplo, dejar que ejecutemos muchos procesos o hilos puede dejar sin servicio a otros usuarios haciendo que uno acapare los recursos, lo mismo sucede con la memoria y los tiempos límite. Por otro lado el acceso a red limitado impide que hagamos ataques con la IP de este servidor, o incluso que sea parte de una botnet.
ideone.com
Desde la web podemos crear nuestro código online, compilarlo y ejecutarlo online viendo la respuesta de manera inmediata desde el navegador y sin necesidad de instalar nada. Todo se ejecuta en servidor.
Lenguajes: Ada, Assembler, AWK, BC, Brainfuck, C, C++, C++14, C#, C99, CLIPS, Clojure, COBOL, CoffeScript, Common Lisp, D, Elixir, Erlang, F#, Factor, Falcon, Fantom, Forth, Fortran, Go, Groovy, Icon, Intercal, Haskell, Java, Javascript, Lua, Nemerie, Nice, Nim, Node.js, Objective-C, Ocalml, Octave, Oz, Pascal, Perl, PicoLisp, PHP, Pike, Prolog, Python, R, Ruby, Rust, Scala, Scheme, Smalltalk, SQL, Tcl, Unlambda, VB.NET, Whitespace; incluyendo variantes o compiladores diferentes para algunos de ellos.
Límite de tiempo de compilación: 10s
Límite de tiempo de ejecución: 5s
Límite de memoria: 256Mb
Acceso a red: no
Acceso a ficheros: no
Tamaño máximo del código: 64Kb
Procesos máximos: 16
Codechef
Es una plataforma para programadores de la India. Pero podemos utilizarla para hacer pruebas y cargar nuestros programas.
Podemos utilizar decenas de lenguajes como C, C++, Java, PHP, Bash… Como detalle indicaré que el editor me ha gustado, puedes elegir temas y te ayuda a codificar a medida que vas escribiendo.
Lenguajes: ADA, Assembler, Bash, Bf, C, C++, Clips, D, Erlang, F#, Fortran, Go, Haskell, Ick, Icon, Java, Javascript, Lisp, Lua, Nice, NodeJs, Ocaml, Pascal, Perl, PHP, Pike, Prolog, Python, Ruby, Scala, Scheme, Tcl, Wspace.
Límite de tiempo de ejecución: 5s
Límite de memoria: 1Gb
Acceso a red: no
Acceso a ficheros: no
RemoteInterview
Originalmente esta aplicación sirve para hacer entrevistas de programación online. Es decir, tú como reclutador en una empresa vas a hacer una prueba a un futuro empleado, y quieres ver cómo lo hace. Bueno, es una herramienta que te permite esto, aunque también nos permite compilar en varios lenguajes y utilizar un entorno bastante amigable. Algo muy bueno es que ha publicado en github bajo licencia MIT el software que utilizan para que lo ejecutes en tu servidor. Utilizan docker para crear un sandbox de compilación y ejecución.
Otra cosa muy buena es que, incluso sin ser usuario guardan tus sesiones de edición durante un tiempo (de hecho, mientras estoy probando han pasado varios días y he logrado rescatar código de hace 3 días).
Lenguajes: Bash, C, C++, C#, Clojure, Elixir, Erlang, Go, HTML, Java, Javascript, Objective-C, Perl, PHP, Powershell, Python, Ruby, Scala, Shell, Swift, VB.NET
Límite de tiempo: 20s
Límite de memoria: 128Mb
Límite de procesos: 31
Acceso a red: No
Acceso a ficheros: Sí
Tutorialspoint
Un sistema mucho menos protegido que los anteriores. Y con los límites no muy claros, aunque se pueden averiguar algunas cosas. Todo se ejecuta en servidor también y tenemos una pequeña consola de bash online.
Lenguajes: Ada, Algol, AngularJs, Assembler, Awk, Bash, Basic, Befunge, Brainfuck, C, CSS, Clojure, Cobol, CoffeeScript, Coldfusion, C99, C++, C++0x, C++11, C#, Dart, D, Erlang, Elixir, Factor, Fantom, Falcon, Fortran, Forth, F#, Groovy, Go, Haxe, Haskell, HTML, Intercal, Icon, Java, Javascript, Jquery, Julia, Ksh, Latex, Lisp, LOLCODE, Lua, Octave, Malbolge, Markdown, MathML, Mozart-OZ, Nimrod, Node.js, Objective-C, OCaml, Pascal, Pawn, Perl, PHP, Pike, Processing.js, Prolog, Python, Rexx, Ruby, Rust, R, Scala, Scheme, Smalltalk, SML, Simula, Sqlite, Tcl, Tex, Unlambda, VB.NET, Verilog, Whitespace, Yasm
Límite de tiempo de ejecución: (variable, desde 10s a más de dos minutos)
Límite de memoria: 128Mb
Procesos máximos: 16 (probando)
Acceso a ficheros: Sí.
Acceso a red: Sí
Codepad
En realidad es una web tipo pastebin que permite compilar y ejecutar programas que escribas en él, para ver el resultado del código generado. Es muy sencillo, pero robusto. Los códigos se ejecutan en máquinas virtuales estancas y a menudo se restauran las imágenes de las mismas (por si ha pasado algo). No tiene un editor demasiado bueno, es un simple textarea, pero para copiar y pegar nos vale.
Lenguajes: C, C++, D, Haskell, Lua, OCaml, PHP, Perl, Python, Ruby, Scheme, Tcl
Límite de memoria: 128Mb
Acceso a red: No
Acceso a ficheros: Sí
C++ shell
No informa muy bien acerca de los límites del sistema. Pero para unas pruebas rápidas funciona muy bien. Sólo compila C++98, C++11, o C++14 y tenemos unas pocas opciones para utilizar. Hay veces que el sistema está saturado y no compila bien, o no ejecuta el programa por completo, pero es cuestión de refrescar la página varias veces (eso sí, guardad primero el trabajo que habéis hecho antes!!)
Lenguajes: C++, C++11, C++14
Límite de tiempo de ejecución: >30s
Acceso a red: no
Acceso a ficheros: no
Límite de memoria: 128Mb
Procesos máximos: (He conseguido lanzar más de 200 procesos hijos)
Compile Java
Un editor y compilador online sólo para Java. Permite cambiar temas y bajarte un ZIP con los archivos.
Lenguajes: Java
Límite de tiempo de ejecución: 5s
¿Conoces algún otro?
¿Conoces algún otro sistema para compilar y ejecutar programas en línea? ¿Has tenido alguna experiencia con ellos? ¡Déjanos un comentario!
The post 7 Servicios online para compilar, ejecutar y ver la salida de pequeños programas appeared first on Poesía Binaria.
Variable not found
Comprimir el resultado de acciones específicas en ASP.NET Core MVC
December 20, 2016 08:00 AM
Comprimir el resultado de la ejecución de una acción puede ser una buena idea para acelerar la descarga y evitar un consumo innecesario de datos, y sobre todo en acciones donde se retorne una cantidad importante de información potencialmente comprimible, como texto plano, JSON o marcado HTML.Aunque esta tarea es algo que pueden (y suelen) realizar servidores frontales como IIS o Apache, a veces puede ser interesante que sea nuestra aplicación la que se encargue de ello, por ejemplo si estamos ofreciendo servicios directamente desde los servidores Kestrel o WebListener, o si deseamos aplicar algún tipo de compresión personalizada.
Conceptualmente, la tarea de compresión del resultado de una acción es una buena candidata para ser implementada como filtro. Los filtros son capaces de tomar el control antes y después de la ejecución de las acciones, por lo que, al menos en teoría, serían un buen lugar para implementar la lógica de compresión y retorno al cliente de los resultados, y su uso tendría la siguiente pinta:
public class HomeController : ControllerEn este post vamos a ver cómo implementar ese filtro
{
[Compress]
public IActionResult Test()
{
var text = new string('x', 1000000);
return Content(text);
}
}
[Compress]. Y bueno, aunque implementarlo a mano y desde cero podría tener su gracia, lo que vamos a hacer es aprovechar dos de las últimas e interesantes novedades introducidas recientemente en ASP.NET Core 1.1: el middleware de compresión y la capacidad de utilizar middlewares como filtros de MVC.Como sabréis, hace pocas semanas se presentó ASP.NET Core 1.1 incluyendo el middleware
ResponseCompressionMiddleware en el paquete Nuget Microsoft.AspNetCore.ResponseCompression. Este componente proporciona las funciones de compresión a los resultados de peticiones que circulan por el pipeline. Sin embargo, dada la propia naturaleza de los middlewares que, por definición, van posicionados en el pipeline de proceso de peticiones de la aplicación, en principio no resultaría sencillo aplicarlo únicamente a una acción o un controlador específico.Por otra parte, también se presentó el nuevo filtro
[MiddlewareFilter] que, como su nombre sugiere, permite utilizar middlewares como filtros de acciones MVC de una forma relativamente sencilla.Simplificando bastante (podéis ver más detalles aquí), al aplicar este filtro a un controlador o acción se creará un pipeline "virtual" en el contexto de la ejecución del filtro, en el que podremos insertar middlewares que se ejecutarán en los distintos puntos en los que éste toma el control.
Para ello, lo primero que necesitamos es una clase adaptadora, que en la práctica sólo se utilizará para configurar ese pipeline. De hecho, lo único que se exige en ella es que presente un método
Configure() similar al que encontramos en la clase Startup de ASP.NET Core, donde aprovecharemos para insertar los middlewares que nos interesen. Por ejemplo, la siguiente clase configura el pipeline añadiendo el middleware ResponseCompressionMiddleware:public class ResponseCompressionPipelineMuy importante, antes de que se me olvide: recordad que para usar
{
public void Configure(IApplicationBuilder app)
{
app.UseResponseCompression();
}
}
ResponseCompressionMiddleware es necesario registrar previamente sus servicios, por lo que debemos añadir el siguiente código en el método ConfigureServices() de la clase de inicialización:public void ConfigureServices(IServiceCollection services)Tras ello, ya podríamos aplicar
{
services.AddMvc();
services.AddResponseCompression();
...
}
[MiddlewareFilter] de la siguiente forma:public class HomeController: ControllerY si ejecutamos la aplicación sobre Kestrel y accedemos a "/Home/Test", veremos que el tamaño de la respuesta se reduce de 977KB a sólo 4.5KB cuando activamos este filtro :)
{
[MiddlewareFilter(typeof(ResponseCompressionPipeline))]
public IActionResult Test()
{
var text = new string('x', 1000000);
return Content(text);
}
}
Pero hey, hablábamos al principio que queríamos utilizar un filtro como
[Compress], y no ese churro que comienza con MiddlewareFilter(…) del ejemplo anterior… No pasa nada, podemos implementar ese elegante atributo combinando lo visto anteriormente:public class CompressAttribute : MiddlewareFilterAttribute¡Y esto es todo! De esta forma tan sencilla hemos creado nuestro filtro
{
public CompressAttribute() : base(typeof(ResponseCompressionPipeline)) { }
public class ResponseCompressionPipeline
{
public void Configure(IApplicationBuilder app)
{
app.UseResponseCompression();
}
}
}
[Compress] que podremos aplicar a acciones, controladores, o de forma global.Publicado en Variable not found.
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.
Sponsors
Puedes utilizar las siguientes imagenes para enlazar 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
Fuentes
- .NET o no .NET, esa es la cuestión
- Adrianistán
- Arragonán
- Bitácora de Javier Gutiérrez Chamorro (Guti)
- Blog Bitix
- Blog de Diego Gómez Deck
- Blog de Federico Varela
- Blog de Julio César Pérez Arques
- Bloggingg
- Buayacorp
- Cuaderno de software
- DGG
- Es intuitivo...
- HardBit
- Infectogroovalistic
- Ingenieria de Software / Software Engineering / Project Management / Business Process Management
- Jesús Perales
- Juanjo Navarro
- Koalite
- La luna ilumina por igual a culpables e inocentes
- Made In Flex
- Mal Código
- Metodologías ágiles. De lo racional a la inspiración.
- Mig Salazar
- Navegapolis
- PHP Senior
- PHPBSD.net » webmaster
- Pedro Hernández
- Pensamientos ágiles
- Picando Código
- Poesía Binaria
- Preparando SCJP
- Pwned's blog - Desarrollo de Tecnologia
- Rubí Sobre Rieles
- SobreRaíles
- Spejman's Blog
- Thefull
- USANDO C# (C SHARP)
- Una sinfonía en C#
- Variable not found
- Yet Another Programming Weblog
- carlosrovira.com
- design-nation.blog/es
- proyectos Ágiles
- psé
- vnsjava
- xailer.info













