Saltar al contenido

Artículos, tutoriales, trucos, curiosidades, reflexiones y links sobre programación web ASP.NET Core, MVC, Blazor, SignalR, Entity Framework, C#, Azure, Javascript... y lo que venga ;)

17 años online

el blog de José M. Aguilar

Inicio El autor Contactar

Artículos, tutoriales, trucos, curiosidades, reflexiones y links sobre programación web
ASP.NET Core, MVC, Blazor, SignalR, Entity Framework, C#, Azure, Javascript...

¡Microsoft MVP!
miércoles, 28 de diciembre de 2016
Sin duda, el equipo de marketing de Microsoft es conocido por su gran habilidad y creatividad a la hora de nombrar los nuevos productos que la fábrica de Redmond va lanzando al mercado. Pero no sólo eso, también son realmente buenos sabiendo cuándo hay que hacerlo para conseguir captar la atención y elevar el hype.

Pantalla de inicio de Visual Studio Core 1.0Ya 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.

Code Studio VisualComo 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.


[Actualizado 30/12] Nota para despistados: pues no, no es una noticia real, simplemente se trata de una broma por el 28 de diciembre, día de los inocentes en España. Visual Studio 2017 seguirá llamándose así, Azure no cambiará de nombre, y tampoco Xamarin... al menos de momento ;D

Publicado en Variable not found.
martes, 27 de diciembre de 2016
Enlaces interesantesPues 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

viernes, 23 de diciembre de 2016





Os deseo unas muy felices fiestas navideñas y
un 2017 lleno sólo de cosas buenas.

¡Nos vemos por aquí!

Publicado en: www.variablenotfound.com.
martes, 20 de diciembre de 2016
ASP.NET Core MVCComprimir 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 : Controller
{
    [Compress]
    public IActionResult Test()
    {
        var text = new string('x', 1000000);
        return Content(text);
    }
}
En este post vamos a ver cómo implementar ese filtro [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.

lunes, 19 de diciembre de 2016
martes, 13 de diciembre de 2016
ASP.NET Core MVCHace ya algún tiempo, ASP.NET MVC 5.1 introdujo el helper EnumDropDownListFor() para simplificar la creación de cuadros desplegables cuyos elementos eran valores de una enumeración, un escenario relativamente frecuente al desarrollar aplicaciones.

Su uso era bastante sencillo, como se puede observar en el código mostrado a continuación:
// Model:
public enum Language
{     
    CSharp, VbNet, FSharp, NodeJs
}

public class CodeGenerator
{
    public string ApplicationName { get; set; }
    public Language Language { get; set; }
    ...
}

// View:
@model CodeGenerator
...
@Html.LabelFor(m => m.Language)
@Html.EnumDropDownListFor(m => m.Language)
Pues bien, EnumDropDownListFor() ha dejado de existir en ASP.NET Core MVC, aunque por supuesto se ha incluido una alternativa, que incluso diría que es bastante más acertada, para conseguir el mismo objetivo, pues se ha separado de forma clara la generación del desplegable de la obtención de datos para poblarlo.
lunes, 12 de diciembre de 2016
lunes, 5 de diciembre de 2016
Enlaces interesantesAhí van los enlaces recopilados durante la semana pasada. Espero que os resulten interesantes. :-)

.NET

martes, 29 de noviembre de 2016
ASP.NET CoreComo vimos hace algún tiempo, ASP.NET Core viene equipado de serie con una potente infraestructura de logging que ofrece una fórmula sencilla para registrar trazas de lo que va ocurriendo en nuestra aplicación en tiempo de ejecución.

A la hora de registrar las trazas es posible indicar uno de los niveles definidos en la enumeración LogLevel, cuyos miembros son Trace, Debug, Information, Warning, Error y Critical. Estos miembros definen jerárquicamente la "importancia" de los acontecimientos que registramos, de forma que luego podemos configurar los proveedores para que sólo muestren o persistan mensajes a partir de un nivel determinado.
lunes, 28 de noviembre de 2016
martes, 22 de noviembre de 2016
ASP.NET CoreComo sabéis, hace unos días se presento en el evento Connect() la primera revisión de ASP.NET Core, versionada como 1.1.0.

A continuación desgranaremos un poco qué se incluye en esta entrega, pero gracias al uso de versionado semántico, sin entrar en más detalles ya podemos saber que esta nueva versión añade características adicionales y mejoras compatibles hacia atrás, por lo que no tendríamos que preocuparnos por romper algo si actualizamos a ella (¡al menos en teoría, claro! ;)).

jueves, 3 de noviembre de 2016
Seattle Skyline. Original: http://natewhitehill.com/epically-high-res-seattle-skyline-shot-7573x1947-pixels/

Pues de nuevo este año voy a tener inmensa fortuna de dar el salto a la otra parte del mundo para asistir al eventazo anual que Microsoft organiza para sus MVP. Una nueva ocasión para salir un poco de la cueva y conocer lo que se está cociendo en los hornos del gigante, en el marco incomparable de su campus en Redmond.

Aunque por supuesto, los cientos de sesiones técnicas a las que podré asistir son uno de los grandes motivos para hacer un viaje de esta magnitud, he de reconocer que una de las cosas que más valoro de mi asistencia es pasar unos buenos ratos con colegas y amigos a los que sólo veo en ocasiones como estas y de cuya compañía disfruto cada minuto.

Y dicho esto, cierro las maletas y casi salgo pitando para el aeropuerto, que ya voy tarde ;D

¡Nos vemos a la vuelta!

MVP

Publicado en Variable not found.
lunes, 31 de octubre de 2016
martes, 25 de octubre de 2016
ASP.NET Core MVCHace muuuchos muchos años ya hablé por aquí de lo extraño que resultaba que el framework MVC, que por aquellos entonces rondaba su segunda versión, no contase de serie con un mecanismo para generar automáticamente el atributo maxlength en los cuadros de texto, máxime cuando esta información solíamos incluirla en anotaciones de las clases del modelo con atributos como StringLength o MaxLength.

Y ha llovido bastante desde entonces, incluso el framework MVC se ha "reseteado" y ahora es ASP.NET Core MVC, pero seguimos sin disponer de esa posibilidad, que cubre un escenario muy frecuente al desarrollar aplicaciones con este framework.

En este post vamos a ver, paso a paso, cómo utilizar los maravillosos tag helpers para incluir este atributo de forma automática en los tags <input>  vinculados a propiedades del modelo cuyos metadatos indiquen un tamaño máximo para el campo.
lunes, 24 de octubre de 2016
Enlaces interesantesProbablemente sólo los más frikis veamos este número más redondo, bonito y conmemorable que el 100, pero sin duda lo es ;) El caso es que esta es la recopilación número 256, y para celebrarlo añadimos una nueva sección donde recogeremos de vez en cuando componentes o bibliotecas que pueden resultarnos útiles para nuestros desarrollos.

Como de costumbre, espero que os resulten interesantes :-)

.NET

martes, 18 de octubre de 2016
Curso de ASP.NET Core MVC

Me consta que muchos lo estabais esperando con impaciencia, así que me complace anunciaros que desde hace unos días tenéis disponible mi nuevo curso sobre ASP.NET Core MVC en CampusMVP.

Su creación sido un proceso realmente largo y laborioso porque, a diferencia de ediciones anteriores, los cambios que trae consigo el nuevo marco de trabajo han obligado a replantear desde el principio los contenidos, pero creo que el resultado ha valido la pena: un curso potente y completo en el que recorremos el marco de trabajo desde las bases que lo sustentan (ASP.NET Core) hasta la programación de aplicaciones y servicios con el framework ASP.NET Core MVC.

En este post intentaremos responder a las siguientes preguntas:
martes, 11 de octubre de 2016
ASP.NET CoreComo ocurría en ASP.NET MVC 5 y anteriores, en ASP.NET Core MVC también podemos utilizar la información almacenada en la tabla de rutas para generar URLs hacia nuestras acciones, evitando las frágiles dependencias que introducen en las aplicaciones las direcciones hard-coded.

El framework nos ofrece distintas fórmulas para generar direcciones, aunque la más básica es utilizar extensores de IUrlHelper como Action(), Link() o RouteUrl(). Tenemos instancias de dicho interfaz disponibles en la propiedad Url de controladores y vistas, pero también podemos reclamarlas directamente al sistema de inyección de dependencias en otros contextos. Asimismo, en las vistas podemos utilizar helpers específicos para generar hipervínculos, como el clásico Html.Action(), o el más reciente tag helper <a>.

lunes, 10 de octubre de 2016
Enlaces interesantesAhí van los enlaces recopilados durante la semana pasada. Espero que os resulten interesantes. :-)

.NET

martes, 4 de octubre de 2016
ASP.NET CoreEn ASP.NET Core, sabemos que la clase Startup es donde introducimos el código de inicialización de nuestras aplicaciones. En sus métodos Configure() y ConfigureServices() encontraremos aspectos de todo tipo, como los siguientes, por citar sólo algunos:
  • La configuración del sistema de settings
  • Definición de destinos de logs y niveles de trazas
  • Configuración de componentes de tratamiento de errores y sistemas de depuración y profiling adicionales
  • Configuración de servicios como caching o estado de sesión
  • Inserción y configuración de servicios y middlewares del framework, como los destinados al proceso de contenidos estáticos, internacionalización, CORS, u otros
  • Middlewares personalizados
  • Registro de servicios en el sistema de inyección de dependencias
  • Inicializaciones específicas de la aplicación, como seeds de bases de datos o configuración de mapeos entre objetos
  • Configuración de rutas de la aplicación
Y todo esto, además, salpicado por la lógica para distinguir entre los distintos tipos de entorno de ejecución (development, staging…), o incluso condicionales basados en el contenido de archivos de configuración.
lunes, 3 de octubre de 2016
Enlaces interesantesAhí van los enlaces recopilados durante la semana pasada. Espero que os resulten interesantes. :-)

.NET

martes, 27 de septiembre de 2016
ASP.NET Core
En más de una ocasión me he topado con artículos que sugerían que ASP.NET Core MVC es un middleware y de hecho, incluso en algunos momentos yo también he tenido la sensación de que podía serlo.

Sin embargo, y esta es la respuesta corta si quieres ahorrar tiempo de lectura, estrictamente hablando no lo es.
lunes, 26 de septiembre de 2016
Enlaces interesantesAhí van los enlaces recopilados durante la semana pasada. Espero que os resulten interesantes. :-)

.NET

miércoles, 20 de julio de 2016
Parecía que no llegaban, pero por fin están aquí las vacaciones :)

Como suele ser habitual por esta época, colgaré temporalmente los hábitos digitales y durante las próximas semanas el blog quedará a merced de las olas. Aunque la mayor parte del tiempo seguiré trabajando en distintos temas, espero poder reducir un poco la intensidad y tomar aunque sea algunos días de descanso para poder disfrutar de la familia y darme algún que otro bañito relajante en las costas de Cádiz.

Espero que nos veamos a la vuelta, todos morenitos y con las pilas al 100%, ya en el mes de septiembre.

¡Felices vacaciones, amigos!

Atardecer en playa
Imagen: Atardecer en Costa Ballena (Rota-Cádiz)
Autor: Ramón Sobrino
https://trapatroles.wordpress.com/2015/04/08/rota-cadiz/

martes, 19 de julio de 2016
ASP.NET CoreContinuamos lamiéndonos las heridas provocadas por los sucesivos terremotos que han supuesto las prereleases y releases públicas de ASP.NET Core, con objeto de ponernos al día en los cambios y novedades que vamos encontrando.

Hoy vamos a hablar de las variables de sesión, un tema que ya tratamos por aquí hace bastante tiempo, pero que conforme evolucionaba el producto ha cambiado lo suficiente como para dedicarle un nuevo post.

lunes, 18 de julio de 2016
martes, 12 de julio de 2016
ASP.NET CoreCuando ASP.NET “clásico” modificábamos algún setting de la aplicación almacenado en el archivo web.config, esto traía como consecuencia directa el reciclado del pool, o en otras palabras, la aplicación se reiniciaba irremediablemente para recargar los nuevos valores de configuración.

Pero como sabemos, en ASP.NET Core el sistema de configuración ha cambiado para mejor, y ahora los settings podemos almacenarlos en archivos JSON independientes del resto de configuraciones del proyecto, así como en otros formatos y ubicaciones. Y ya que se ponían con el tema, el equipo de ASP.NET ha aprovechado para hacer que podamos modificar los settings sobre los archivos de configuración y que éstos sean aplicados sobre la marcha, sin necesidad  de volver a arrancar la aplicación.
lunes, 11 de julio de 2016
Enlaces interesantesAhí van los enlaces recopilados durante la semana pasada. Espero que os resulten interesantes. :-)

.NET

lunes, 4 de julio de 2016
Para contaros penas ya están los telediarios, así que simplemente quería compartir vosotros una alegría de la que, de alguna u otra forma, sois también artífices: el pasado viernes me notificaron desde Microsoft que he sido reconocido nuevamente como MVP :)

Supongo que todos habréis visto ya la pinta que tiene este ansiado mail, pero para los que acabéis de llegar, el mensaje de notificación del nombramiento viene a ser más o menos como sigue:

De: support@mvpaward.com
Asunto: ¡Enhorabuena MVP de Microsoft 2016!

image[26]

Estimado/a Jose Maria Aguilar,

Enhorabuena. Nos complace anunciarle el Premio MVP de Microsoft® de 2016.

Este nombramiento se concede a los líderes excepcionales de la comunidad técnica que comparten de forma activa con otras personas su profundo conocimiento técnico así como su experiencia en el uso de la tecnología. Le agradecemos especialmente la contribución que ha realizado en las comunidades técnicas en el área de Visual Studio and Development Technologies a lo largo del pasado año.

Esta vez me ha pillado por sorpresa porque en el fragor de la batalla diaria no me había dado cuenta de que era día uno de julio, que es la fecha en la que conozco si me otorgan o no esta distinción, por lo que no he tenido la tensa espera de otras veces… y os confirmo que, a pesar de ser la sexta vez, la mezcla de emoción, alegría y orgullo es la misma :)

Una novedad curiosa es que dejo de ser MVP en ASP.NET/IIS, como ocurría años anteriores, y paso a ser MVP en la categoría Visual Studio and Development Technologies . Pero no, no es que haya cambiado de especialidad; este cambio es debido a las modificaciones al programa MVP que anunció Microsoft meses atrás, que introducía nuevas categorías de "grano grueso" en las que englobarían especializaciones más concretas:

image[20]

Muchas gracias al equipo del programa MVP en Microsoft, a la gran Cristina González, MVP lead para esta parte del mundo, y a todos vosotros, amigos de Variable not found, por hacerlo posible.

Es un honor seguir formando parte de este privilegiado grupo de personas que cada día dedican su tiempo y entusiasmo para compartir conocimientos con la comunidad de desarrolladores, y entre los que cuento ya grandes amigos. Sinceramente, cada vez me siento más afortunado de pertenecer a esta pandilla y, como sé que esto es algo que lógicamente en algún momento habrá de acabarse, estoy disfrutando el momento como nadie :)

Ah, y ¡enhorabuena al resto de MVP nombrados el mismo día!

Publicado en Variable Not Found.
domingo, 3 de julio de 2016
Resharper Ultimate Pues por última vez en este décimo aniversario del blog, mi querida instancia de System.Random ha introducido a los numerosos participantes en la coctelera y, tras agitarla enérgicamente, ha elegido aleatoriamente a los afortunados ganadores del sorteo de suscripciones a Resharper Ultimate gentilmente ofrecidos por los amigos de JetBrains, a los que desde aquí agradezco su gran apoyo.

Y hoy el algoritmo cuasimágico de generación de números pseudoaleatorios ha determinado que los ganadores son:

image Ibai Imaz @ibaiimaz
Euskal Herria
image L. Alberto Baigorria @uialberto
Santa Cruz de la Sierra, Bolivia
¡Enhorabuena a ambos! En breve me pondré con contacto con vosotros para daros indicaciones sobre el proceso para conseguir vuestras licencias. Muchas gracias también a los que no habéis tenido tanta suerte, pero bueno, no desesperéis, que dentro de diez años seguro que lo celebramos otra vez y tendréis nuevas oportunidades ;D

Y así, damos por finalizada la ronda de sorteos por la celebración del décimo aniversario del blog. Al comenzar esta iniciativa quería que fuera algo grande y espero haber conseguido al menos un poco de dicho objetivo: todos os habéis llevado un libro de O'Reilly, muchos de vosotros conseguisteis grandes premios, pero lo más importante es que con todo esto espero haber sido capaz de transmitiros mi agradecimiento por estar siempre ahí, ayudándome a encontrar la variable.

Venga, ¡a por los próximos diez años!

Publicado en Variable not found
miércoles, 29 de junio de 2016
Sorteo finalizado, ya tenemos los ganadores. ¡Muchas gracias a todos por participar!
Resharper Ultimate, de JetBrainsHoy comenzamos el último sorteo de la celebración del aniversario del blog, unas semanas en las que hemos repartido de todo, gracias a nuestros patrocinadores y amigos. Pero si hay una compañía que no podía faltar en esta celebración, esa era JetBrains, líderes indiscutibles en herramientas para desarrolladores.

Personalmente le tengo bastante aprecio a estos chicos desde que conocí su popular Resharper, una herramienta que uso a diario desde hace años, por lo que no dudé en contactar con ellos y, por supuesto, se ofrecieron amablemente a colaborar en la celebración.

Y gracias a ello, hoy sorteamos dos suscripciones a Resharper Ultimate, la suite de productos que incluye:
  • Resharper para .NET. Indispensable. Creedme, una vez lo probéis os haréis adictos ;)
  • Resharper para C++.
  • DotTrace el profiler de rendimiento para .NET
  • DotMemory, un profiler de memoria para aplicaciones .NET
  • DotCover, runner de pruebas unitarias y control de cobertura de código
  • DotPeek, el descompilador para.NET (que por cierto, de todas formas es gratuito y podéis descargar desde su página).
Sin duda, un pack de categoría.
martes, 28 de junio de 2016
ASP.NET Core¡Por fin! Tras un desarrollo muy largo y convulso, ayer se presentaron las respectivas versiones 1.0 RTM de .NET Core, ASP.NET Core y Entity Framework Core, junto con actualizaciones de una serie de productos relacionados.

La verdad es que hace tan sólo unos años, presentar la nueva versión de ASP.NET en la conferencia Red Hat DevNation habría resultado una auténtica osadía y probablemente habría acabado con tomates volando hacia el escenario. Pero esto es agua pasada, y este simple gesto es una prueba más de que realmente las cosas han cambiado en Microsoft.

Con el lanzamiento de la versión 1.0 de la infraestructura .NET Core y el conjunto de frameworks basados en ella (ASP.NET, MVC, Entity Framework), iniciamos una nueva época en la que aquél sueño de desarrollar o ejecutar fácilmente aplicaciones .NET en cualquier plataforma es ya una realidad, y con todo el soporte y las bendiciones del gigante de Redmond. Escenarios antes impensables, como desarrollar desde Mac para desplegar en Linux, o crear nuestras aplicaciones en Windows y explotarlas desde un contenedor Docker, son ya posibles.

Estamos ante un reboot en toda regla: todos estos frameworks han sido construidos desde cero teniendo en mente conceptos actuales que ni siquiera existían cuando empezaron a gestarse las versiones iniciales de .NET o ASP.NET "clásicos": la nube, alto rendimiento, escalabilidad, APIs, múltiples dispositivos y plataformas, contenedores, microservicios etc. Y creados usando principios y buenas prácticas que tampoco eran los habituales antaño: inyección de dependencias, clases con responsabilidades limitadas, modularidad, componibilidad, abstracciones basadas en interfaces, pruebas unitarias…
lunes, 27 de junio de 2016
Promoción finalizada. Muchas gracias a los más de mil lectores que habéis participado!

¡Consigue un libro gratis de O'Reilly!Pues casi ha pasado un mes desde que lanzamos esta iniciativa, y ya se cuentan por centenares los seguidores de Variable not found que han descargado su libro electrónico de O'Reilly, totalmente gratis.

Sólo quería recordaros que la promoción finaliza el próximo 30 de junio (no sé si ese día aún se podrá, así que, por si acaso, mejor que asumáis que no).

Por si no os enterasteis en su momento, estamos hablando de que para celebrar el aniversario del blog, O'Reilly regala a todos los lectores un libro en formato electrónico, a elegir entre estos diez títulos de programación, o un vídeo-tutorial sobre Web API:

Mastering Cross-Platform Development with Xamarin Mastering Cross-Platform Development with Xamarin
By Can Bilgin
Más info
C# 6 and .NET Core 1.0: Modern Cross-Platform Development C# 6 and .NET Core 1.0: Modern Cross-Platform Development
By Mark J. Price
Más info
jQuery Essentials jQuery Essentials
By Troy Miles
Más info
C# 6.0 in a Nutshell C# 6.0 in a Nutshell, Sixth Edition
By Joseph Albahari & Ben Albahari
Más info

CSS: The Missing Manual CSS: The Missing Manual, Fourth Edition
By David Sawyer McFarland
Más info
Learning NHibernate 4 Learning NHibernate 4
By Suhas Chatekar
Más info
Learning .NET High-performance Programming Learning .NET High-performance Programming
By Antonio Esposito
Más info
Code-First Development with Entity Framework Code-First Development with Entity Framework
By Sergey Barskiy
Más info
AngularJS: Up and Running AngularJS: Up and Running
By Shyam Seshadri, Brad Green
Más info
Concurrency in C# Cookbook Concurrency in C# Cookbook
By Stephen Cleary
Más info
RESTful Services with ASP.NET Web API Vídeo (2h): RESTful Services with ASP.NET Web API By Fanie Reynders
Más info

Además, O'Reilly ofrece a los lectores de Variable not found descuentos del 40% en libros en papel, y de 50% en libros electrónicos y video training utilizando el código PCVW al realizar la compra.

¿Y cómo podéis conseguir vuestro regalo?

Recordad que tenéis hasta el próximo 29 de junio de 2016 para obtener vuestro regalo. Sólo tenéis que lo siguiente:
  • Ayudarme a difundirlo para darle el mayor alcance posible, pues estaréis contribuyendo a que más personas puedan conseguir su regalo. Por tanto, os agradecería mucho:
              
    • Que lo comentéis con vuestros compañeros, amigos y conocidos que aún no se hayan beneficiado de esta iniciativa.
       
    • Que publiquéis en vuestra cuenta de Twitter, Facebook u otras redes sociales un enlace hacia este post. Por ejemplo, estaría bien algo como lo siguiente, aunque podéis demostrar vuestra creatividad y poner otras cosas siempre que vayan en la dirección de los objetivos propuestos :)
      Sólo HOY, @oreillymedia te regala un e-book por ser seguidor de @variablnotfound. ¡Ve a por el tuyo! http://bit.ly/295LSAJ
    • O, como mínimo, para los más perezosos, que retuiteéis en Twitter o compartáis en vuestras redes sociales los mensajes de otras personas que ya lo hayan publicado.
       
  • Si os apetece estar informados de las novedades del blog, seguir la nueva cuenta del blog en Twitter, @variablnotfound. A largo plazo pretendo que sea un canal exclusivo para el blog, separándolo de mi cuenta personal @jmaguilar.
     
  • Finalmente, reclamar vuestro libro o vídeo utilizando este enlace: http://oreil.ly/1W9VAFL. El proceso es muy simple: tendréis que registraros como usuario, elegir el contenido que os interese (uno por persona), y en pocas horas tendréis acceso al mismo.
¡¡No perdáis la oportunidad, que se acaba!!

Publicado en Variable not found
domingo, 26 de junio de 2016
Telerik Probablemente haya cosas mejores que hacer un domingo por la mañana, pero pocas tan gratificantes como ir a votar y después ponerse a repartir regalos :)

Así que, siguiendo la tradición, nos hemos reunido un servidor y su habitual instancia de System.Random para echar en el bombo las papeletas virtuales y elegir al azar los ganadores del sorteo de licencias de la suite DevCraft Complete de Telerik.

Y hoy la suerte ha señalado a:

Carlos Gómez @devcfgc
Bilbao
Luis Felipe Gil @lamaslg
Madrid
¡Enhorabuena! En breve me pondré con contacto con vosotros para facilitaros vuestras licencias. Y muchas gracias a los que no habéis tenido tanta suerte, pero no desesperéis que todavía tendréis alguna oportunidad más :)

Me gustaría agradecer también a Telerik su gran apoyo a la celebración del aniversario del blog, que ha sido espectacular.

Ah, y mientras comenzamos el próximo sorteo, no olvidéis que por ser lectores del blog ¡aún podéis conseguir vuestro libro gratis de O'Reilly! Daos prisa porque el tiempo se acaba y en breve acabará la promoción :)

Pero seguid atentos al blog, porque el próximo será ya el último sorteo… ¿alguien había dicho que le gustaría tener una licencia de Resharper? ;)

Publicado en Variable not found
miércoles, 22 de junio de 2016
ASP.NET Core Conforme el desarrollo del nuevo framework ha ido avanzando, se han producido bastantes cambios en el sistema de hosting, que es, al fin y al cabo, quien determina la forma en que podemos cambiarle el nombre a "wwwroot". En el pasado hemos publicado varios posts al respecto (aquí y aquí), y ahora vamos a actualizar los conocimientos tras los cambios aparecidos en la RC2 (sí, esa en la que en teoría no iba a cambiar demasiado respecto a la RC1 ;D).

Estructura de un proyecto ASP.NET Core en Visual Studio, donde aparece la carpeta wwwroot con un icono especialComo sabemos, en proyectos ASP.NET Core, la carpeta "wwwroot", también conocida como "Web root", ejerce como raíz para los contenidos estáticos de la web, es decir, es donde encontraremos todos los archivos que en algún momento enviaremos al lado cliente: javascript, CSS, favicons, imágenes, fonts, etc.

El nombre que se ha dado a la carpeta, "wwwroot", es por convención, y simplemente se trata del valor por defecto establecido por el framework, pero si no nos convence podemos cambiarlo por otro que nos parezca más conveniente. No es que vaya va a ser muy frecuente hacerlo en aplicaciones del mundo real, pero saber que se puede cambiar y cómo hacerlo es interesante porque, además de darnos la libertad de elegir, nos obliga a aprender un poco sobre las interioridades del framework.

Así, si deseamos cambiar el nombre de "wwwoot" por cualquier otro, los pasos serían básicamente tres:
  • Renombrar la carpeta a nivel físico desde el IDE o desde el explorador de archivos.
     
  • Cambiar la configuración de preprocesadores como Gulp, Grunt o WebPack para que utilicen vuestra nueva carpeta como directorio de salida, lo que podemos hacer fácilmente editando sus correspondientes archivos de configuración gulpfile.js, grunt.config, webpack.config.js o el que sea.
     
  • Informar al framework de que esa nueva carpeta es la base para los recursos estáticos, lo que permitirá a otros componentes (por ejemplo, los middlewares encargados de retornar este tipo de contenidos) saber dónde se encuentran los archivos.
En este último punto es donde nos centraremos en el resto del post, viendo algunas fórmulas para conseguirlo.