Páginas

29 de septiembre de 2015

Tag helpers en MVC 6: Introducción

ASP.NET MVCDesde la creación de MVC, los helpers han sido piezas fundamentales en la composición de nuestras vistas. Llamadas como las habituales Html.ActionLink() o Html.TextBoxFor() nos han permitido durante años crear interfaces de forma sencilla y productiva, pues se trataba de métodos muy reutilizables capaces de ejecutar lógica de presentación y generar bloques de HTML por nosotros (o CSS, o incluso Javascript).

De hecho, los helpers han sido la fórmula recomendada para crear componentes reutilizables de generación de código de marcas en las páginas de nuestras aplicaciones MVC y son muy utilizados tanto por el propio framework como por componentes visuales de terceros. Pero esto no implica que fuera una solución perfecta o exenta de problemas…

Aunque en la mayoría de ocasiones daba la talla, había algunos escenarios relativamente frecuentes en los que la mezcla de código de servidor con código de marcado no quedaba demasiado elegante, como en el siguiente ejemplo:
@using (Html.BeginForm("LogOff", "Account", FormMethod.Post, 
new { id = "logoutForm", @class = "navbar-right" }))
{
@Html.AntiForgeryToken()
<ul class="nav navbar-nav navbar-right">
<li>
@Html.ActionLink("Hello " + User.GetUserName() + "!",
"Manage", "Account",
routeValues: null,
htmlAttributes: new {
title = "Manage"
})
</li>
<li>
<button>Log off</button>
</li>
</ul>
}
Sin duda, es un código que no resultaría familiar a un desarrollador acostumbrado al mundo web porque no podría predecir a primera vista el marcado enviado el cliente y, en cualquier caso, la sintaxis resulta bastante farragosa cuando queremos personalizar un poco la salida HTML de los helpers que vienen de fábrica en MVC, por ejemplo cuando deseamos utilizar Bootstrap o cualquier otro framework basado en estilos.

Hey, antes de continuar, el tradicional disclaimer: ASP.NET y MVC están aún en desarrollo (beta 8), y aún pueden cambiar algunas de las cosas que contemos aquí.

En MVC 6 se ha dado una vuelta de tuerca más a la “inteligencia” del parser de Razor ofreciendo una fórmula alternativa para crear componentes reutilizables de generación de código de marcado desde el lado servidor, llamados Tag Helpers, que son igualmente sencillos de utilizar (incluso más, en algunos casos) y utilizan una sintaxis declarativa que se integra de forma más fluida en el interior de una vista. El siguiente bloque de código es equivalente al anterior, pero utilizando tag helpers:
<form asp-controller="Account" asp-action="LogOff" 
method="post" id="logoutForm" class="navbar-right">
<ul class="nav navbar-nav navbar-right">
<li>
<a asp-controller="Manage" asp-action="Index"
title="Manage">Hello @User.GetUserName()!</a>
</li>
<li>
<button>Log off</button>
</li>
</ul>
</form>
De momento, veréis que apenas hay caracteres de escape de Razor, todo es código de marcado. De hecho, casi todo este código es marcado HTML convencional, salvo en las etiquetas <form> y <a>, que es donde estamos usando tag helpers.

Estos tags especiales son detectados por el motor de Razor y procesados en el lado servidor antes de que se genere la salida HTML que va al cliente. Los atributos “asp-“ que podéis ver es la forma que tenemos de enviar parámetros a tener en cuenta durante dicho proceso. Por ejemplo, en el caso del tag <a>, mediante los atributos asp-controller y asp-action estamos indicando respectivamente el controlador y acción cuya URL aparecerá en el atributo href que se enviará finalmente al cliente.

Por cierto, estos nombres de atributo utilizan el prefijo “asp-“ por convención, para distinguirlos de los atributos originales de la etiqueta e indicar al motor de Razor que se trata de un helper de este tipo, y obviamente no llegarán nunca al lado cliente.

Veamos otro ejemplo, esta vez en la generación de un hiperenlace, donde queda claro lo diferente que resulta leer el código si usamos helpers tradicionales frente a los nuevos tag helpers, siendo el resultado enviado al cliente exactamente el mismo:
@* Usando HTML helpers tradicionales *@
@Html.ActionLink("Hello " + User.GetUserName() + "!",
"Manage", "Account",
routeValues: null,
htmlAttributes: new {
title = "Manage"
})

@* Usando tag helpers *@
<a asp-controller="Manage" asp-action="Index" title="Manage">
Hello @User.GetUserName()!
</a>

@* Resultado enviado al cliente *@
<a href="/manage" title="Manage">Hello, John!</a>
MVC 6 viene de serie acompañado por un buen número de tag helpers, y, por supuesto, es posible añadir nuestras propias extensiones. Seguro que esto desembocará en un interesante ecosistema de este tipo de componentes desde la comunidad de desarrolladores.

¿Cómo es realmente un tag helper por dentro?

Como seguro podréis intuir, un tag helper es básicamente otra sintaxis para expresar la llamada a un helper, pero utilizando un modelo declarativo (usar etiquetas), en lugar de un modelo imperativo (la clásica llamada a Html.UnHelper()).

Debido a su naturaleza, estos helpers se definen de forma muy diferente a los tradicionales, cuya codificación se basaba prácticamente en implementar una función personalizada. Los tag helpers son clases que heredan de TagHelper y son decoradas con atributos que permiten asociarlas con tags HTML (existentes o no) y definir los atributos que deseamos gestionar desde el lado servidor antes de generar el marcado final que será enviado al cliente.

Para muestra, observad el siguiente código: se trata de un extracto del fuente de AnchorTagHelper, el tag helper que hace posible que Razor interprete de forma especial el tag <a>, tal y como hemos visto anteriormente. Como podemos observar, se utiliza [HtmlTargetElement] para indicar qué etiqueta HTML se ve afectado por este tag helper y los atributos de la etiqueta que deseamos procesar, que al fin y al cabo serían los parámetros que necesita el helper para funcionar. Para cada uno de esos atributos encontramos luego una propiedad en la clase; sus valores serán inyectados en tiempo de ejecución, y el HTML de salida se generará en el método Process() que vemos al final:
[HtmlTargetElement("a", Attributes = "asp-action"
[HtmlTargetElement("a", Attributes = "asp-controller")]
public class AnchorTagHelper : TagHelper
{
public AnchorTagHelper(IHtmlGenerator generator)
{
Generator = generator;
}

protected IHtmlGenerator Generator { get; }

[HtmlAttributeName"asp-action"]
public string Action { get; set; }

[HtmlAttributeName("asp-controller")]
public string Controller { get; set; }

public override void Process(TagHelperContext context, TagHelperOutput output)
{
TagBuilder tagBuilder;
tagBuilder = Generator.GenerateActionLink(
linkText: string.Empty,
actionName: Action,
controllerName: Controller,
htmlAttributes: null);

output.MergeAttributes(tagBuilder);
}
}
Fijaos que el código que encontramos en Process() es muy similar al que encontraríamos en un helper tradicional. La única diferencia es que aquí tenemos la oportunidad de que el HTML resultante sustituya por completo a la etiqueta que ha lanzado la ejecución del tag helper, que la modifique (cambiando sus atributos o contenido) o que la complemente (añadiéndole otras etiquetas por delante o por detrás).

Así, siguiendo con el ejemplo que hemos visto más arriba del tag <a>, la forma de procesarse este tag helper sería algo así:
  • Tenemos en el código de nuestra vista una etiqueta como:
    <a asp-controller="Manage" asp-action="Index" title="Manage">
    Hello @User.GetUserName()!
    </a>
  • El motor de Razor, en tiempo de compilación, detecta que la clase AnchorTagHelper afecta a la etiqueta <a> ,  por lo que, en vez de incluir dicha etiqueta directamente en el HTML de salida, la sustituye por una referencia a dicha clase. Sus propiedades Action y Controller son cargadas con los valores presentes en los atributos “asp-action” y “asp-controller” del tag, respectivamente, y se carga en el contexto del helper otra información interesante, como la etiqueta tag original, sus atributos o su contenido.   

  • Ya en tiempo de ejecución, se realiza una llamada al método Process(), que será el que finalmente generará el código de marcado. En este caso concreto, vemos que simplemente se generaría un nuevo tag <a> mediante la llamada a GenerateActionLink(), y se haría un merge con el tag original, de forma que se mantendrían el resto de atributos originales del enlace (por ejemplo, title).

Puesta en marcha de los Tag Helpers

Referencias hacia Microsoft.AspNet.Mvc.TagHelpersComo muchos otros aspectos, los tag helpers son un componente opcional en MVC 6, y para poder utilizarlos lo primero que debemos hacer es asegurarnos de que el proyecto tiene referencias hacia el paquete “Microsoft.AspNet.Mvc.TagHelpers”.

Tras ello, debemos habilitar su uso desde las vistas. La nueva directiva @addTagHelper de Razor permite añadir en las vistas referencias hacia los ensamblados que contienen estos componentes; por comodidad, el ideal es añadir las referencias en el archivo /Views/_ViewImports.cshtml, que ya hemos visto en un post anterior, de forma que las referencias se apliquen a todas las vistas de la aplicación.

El siguiente código, añadido al archivo /Views/_ViewImports.cshtml hará posible la utilización de los tag helpers proporcionados de fábrica por MVC 6 desde todas las vistas de la aplicación:
@addTagHelper "*, Microsoft.AspNet.Mvc.TagHelpers"
Una vez añadida esta línea, podremos comenzar a utilizar estos componentes en nuestras vistas, y Visual Studio nos ayudará aplicando intellisense durante la edición:

Intellisense en tag helpers

Tag helpers disponibles “de serie” en MVC 6

A día de hoy (beta 7 lanzada, beta 8 en camino), tenemos disponibles de serie los siguientes tag helpers en MVC 6:
  • AnchorTagHelper
  • CacheTagHelper
  • EnvironmentTagHelper
  • FormTagHelper
  • ImageTagHelper
  • InputTagHelper
  • LabelTagHelper
  • LinkTagHelper
  • OptionTagHelper
  • ScriptTagHelper
  • SelectTagHelper
  • TextAreaTagHelper
  • ValidationMessageTagHelper
  • ValidationSummaryTagHelper

La mayoría de ellos se puede intuir para qué sirven porque ya teníamos helpers tradicionales que se utilizaban para ello: generación de vínculos, formularios, controles de edición, mensajes de validación… Otros, en cambio, definen nuevos tags (como <cache> o <environment>) que podemos utilizar en nuestras vistas. Para no hacer este post demasiado extenso, iremos viendo los más interesantes en artículos posteriores.

Eh, pero… ¿no es esto la reencarnación de los controles runat=”server” de toda la vida?

Pues la verdad es que al principio sí hay un cierto tufillo a ASP.NET WebForms y a sus célebres controles <asp:XXX runat="Server"> , pero no os preocupéis, esa sensación se pasa pronto ;D

En realidad estamos hablando de cosas bien distintas: aquí no hay ViewState, ni post backs, ni code behind, ni eventos, ni controles en el lado servidor, ni mantenimiento de estado de ningún tipo, es sólo generación de marcado. Simplificando un poco, los tag helper son sólo otra forma de introducir en las vistas llamadas a los helpers usando sintaxis declarativa, aunque con algunas ventajas adicionales sobre los tradicionales @Html.XXX() que hemos usado hasta ahora.

Publicado en Variable not found.


from Variable not found http://www.variablenotfound.com/2015/09/tag-helpers-en-mvc-6-introduccion.html
via IFTTT

28 de septiembre de 2015

Enlaces interesantes 212

Enlaces interesantesAhí van los enlaces recopilados durante la semana pasada, espero que os resulten interesantes :-)

.Net

ASP.NET

Azure / Cloud

Conceptos/Patrones/Buenas prácticas

Data access

Html/Css/Javascript

Visual Studio/Complementos/Herramientas

Otros

Publicado en Variable not found


from Variable not found http://www.variablenotfound.com/2015/09/enlaces-interesantes-212.html
via IFTTT

27 de septiembre de 2015

Habilitar función “hacer click con un toque” en el touchpad Gnome

Touchpad GNOME

En ocasiones muchos usuarios de GNOME nos encontramos con la terrible situación de no poder configurar el touchpad desde el centro de configuraciones que nos proporciona este entorno de escritorio.

Para resolver este inconveniente:

  1. Accedamos al terminal.
  2. “Sin necesidad de acceder como root”, colocamos en el terminal el siguiente comando:

gsettings set org.gnome.desktop.peripherals.touchpad tap-to-click true

Otro modo:

synclient TapButton1=1

Conclusión:

A estas alturas de la vida, problemas como estos no deberían suceder, el entorno debería proporcionar una interfaz gráfica de usuario con la finalidad de configurar el hardware de nuestro PC. Existen personas como mis padres, que no tienen ni la remota idea de como habilitar estas funciones, y al final terminan usando el sistema de la competencia.

Me despido, espero que les sea de utilidad.



from Desde Linux http://blog.desdelinux.net/habilitar-funcion-toque-touchpad-gnome/
via IFTTT

24 de septiembre de 2015

Como asignar correctamente los permisos en Drupal

Es común que muchas veces nuestro sitio no funcione como es de esperar, muchas veces esto no es más que un síntoma de que hemos asignado mal los permisos.

Esto es mas común en entornos Unix, como Linux y también en Mac, donde estos sistemas son mucho más estrictos con el tema de los permisos que por ejemplo el sistema Windows.

Mostrar las variables disponibles para nuestro theme en Drupal 7.x

Cuando estamos trabajando al nivel del theme layer (temas), por ejemplo en nuestro node.tpl.php, a veces nos preguntamos cuales son las variables que tenemos a disposición, es decir cuales son las variables que son enviadas a nuestro archivo .tpl.php
En este post veremos que los archivos .tpl.php de nuestra instalación Drupal están en realidad muy bien documentados pero veremos también otra manera más sencilla y dinámica utilizando la función get_defined_vars().

Archivos .tpl.php
Una forma sencilla y rápida es de tomar el archivo .tpl.php que viene por defecto con nuestra instalación Drupal y al principio de este encontraremos la lista detallada y bien comentada de las variables disponibles.

23 de septiembre de 2015

Configura los metatags en Drupal 7


Aunque hace tiempo Google ya dejó clara la importancia de los metatags para posicionar una web, no está de más dedicarle un poco de tiempo y configurarlas correctamente para los contenidos de tu portal.
Definición: Los metadatos (metatags) son etiquetas html que se incorporan en el encabezado de una página web y que resultan invisibles para un visitante normal, pero de gran utilidad para navegadores u otros programas que puedan valerse de esta información. Su propósito es el de incluir información (metadatos) de referencia sobre la página: autor, título, fecha, palabras clave, descripción, etc. (fuente: Wikipedia).

22 de septiembre de 2015

El archivo _ViewImports en MVC 6

imageDesde la llegada de Razor, hace ya bastante tiempo, usamos en MVC el archivo _ViewStart.cshtml de las carpetas de vistas de nuestra aplicación para introducir código de inicialización de éstas. Era un buen lugar para establecer propiedades como el Layout de forma genérica, sin tener que hacerlo en cada una de las vistas que se encontraran por debajo en el árbol de directorios en el que se definía.

En MVC 6 se le ha unido un compañero llamado _ViewImports.cshtml, cuya finalidad y funcionamiento es parecido al tradicional ViewStart, porque se procesa antes de ejecutar una vista e igualmente afecta a todas las vistas que se encuentren por debajo de este archivo en el árbol de directorios, aunque aporta algunas diferencias bastante interesantes. Comentamos a continuación los aspectos más destacables.
En primer lugar, destacaremos que _ViewImports.cshtml se procesa en todas las vistas. Esto es bastante interesante porque abre el ámbito de aplicación de este nuevo mecanismo; recordad que _ViewStart sólo era ejecutado en las vistas completas y no en parciales o layouts.

18 de septiembre de 2015

Que hacer después de instalar Fedora 22

Fedora_logo_and_wordmark.svg
Hola chicos, quiero presentarles esta sencilla guiá especialmente para novatos guiandolos en el acondicionamiento de su sistema Fedora 22.

Entrar como root

su

Actualizar Sistema

dnf -y update

Utilidades Necesarias

dnf -y install curl wget

Añadiendo Repositorios

Poketty, batallas pokemon en tu terminal.

Es de sobra conocido el éxito de la saga Pokémon y como esta ha inundado nuestra infancia con batallas, pociones etc…

Los defensores del software libre encontramos en PokeMMO una gran alternativa para jugar a Pokémon en nuestro sistema operativo favorito, pero… ¿ y si no disponemos ni siquiera de entorno gráfico ?, para eso existe una alternativa, Poketty.

poketty1.2

Poketty nos ofrece poder simular batallas Pokémons desde nuestra tty/terminal favorita, funciona a través de archivos .pkm, cada archivo .pkm contiene todas las características de cada Pokémon, nombre, ataques, fuerza de cada ataque, salud inicial del Pokémon, pociones que tiene cada pokemon etc… de esta forma, al arrancar el juego nos pedirá que archivos .pkm quieres cargar para la batalla.

Los archivos .pkm no son más que ficheros de configuración donde se especifican los parámetros de cada pokemon, de esta forma, cualquiera puede crear sus propios pokemons o personalizar los ya existentes, con Poketty se distribuyen dos para probar el juego, pikachu e infernape.

Su desarrollo acaba de iniciar, pero ya es completamente funcional, en la versión 1.1 entre otras cosas, se añade modo contra CPU y en su versión 1.2 se agregan cambios como puntos de daño mínimos para cada ataque (especificado en cada .pkm).

Aún no existen binarios precompilados para probar Poketty, pero compilarlo es tan sencillo como bajarse el .tar, descomprimirlo, navegar con la terminal hasta la carpeta descomprimida y hacer un simple:

gcc poketty.c -o poketty

Poketty es completamente software libre, licenciado bajo la GPLv3, es un proyecto oficial de HispaGNU, el sitio oficial del juego es:

http://hispagnu.no-ip.org/poketty

Espero que os guste y que disfrutéis mucho, tanto jugando como leyendo el código fuente y aprendiendo.



from Desde Linux http://blog.desdelinux.net/poketty-batallas-pokemon-terminal/
via IFTTT

15 de septiembre de 2015

Primer ejercicio práctico con Views

Muy Buen video de Charly en Drupal a sur! Excelente!


+Drupal al Sur

Comprimir y descomprimir .gz, .tar.gz, y .zip por linea de comandos en Linux

Más que un post es una nota para mi:
Archivos .tar.gz:
Comprimir: tar -czvf empaquetado.tar.gz /carpeta/a/empaquetar/
Descomprimir: tar -xzvf archivo.tar.gz
Archivos .tar:
Empaquetar: tar -cvf paquete.tar /dir/a/comprimir/
Desempaquetar: tar -xvf paquete.tar
Archivos .gz:
Comprimir: gzip -9 index.php
Descomprimir: gzip -d index.php.gz
Archivos .zip:
Comprimir: zip archivo.zip carpeta
Descomprimir: unzip archivo.zip

La carpeta wwwroot en ASPNET 5

Estructura típica de proyecto MVC 5Seguimos hablando de ASP.NET 5 y los cambios que traerá para los desarrolladores que ya llevamos tiempo utilizando ASP.NET y MVC, porque esta nueva versión viene cargada de cambios y algunos son realmente rompedores. Hoy nos centraremos en un cambio simple, pero bastante importante, que afecta a la estructura de nuestros proyectos: el raíz del sitio web.

Desde siempre el directorio raíz de un proyecto ASP.NET, ya fuera Web Forms, MVC, Web API o cualquier otro, coincidía con la raíz del sitio web en el servidor, es decir, en nuestros equipos se mezclaban los archivos propios del desarrollo con los contenidos estáticos que se subían posteriormente a los entornos de prueba o producción.

Esto creaba un poco de lío a la hora de publicar los proyectos, porque era fácil que nos dejáramos algo por detrás a la hora de subir las aplicaciones al servidor, o que enviáramos más archivos de la cuenta, como archivos .JS sin compactar/empaquetar, fuentes Typescript, estilos Less o Sass, mapas de símbolos, etc. Obviamente esto podía causar problemas de seguridad, puesto que podíamos dejar al descubierto aspectos sensibles de la aplicación y era necesario establecer configuraciones que evitaran la descarga de dichos archivos (por ejemplo, evitar el acceso a archivos .config).

14 de septiembre de 2015

21 de los mejores servicios para almacenar archivos en la nube

mejores servicios guardar datos gratis nube
La nube, ese mundo virtual lleno de tecnología que tanto nos está facilitando la vida. Hace pocos años hubiera sido imposible publicar este artículo.

Los servicios de almacenamiento gratuito en la nube, aunque existen hace años en el mercado, es ahora cuando están en pleno “boom”.

Hay tantos y tan variopintos, que es imperativo analizar cuales son los mejores servicios para almacenar datos en la nube, indagando cuál es su capacidad de almacenaje y todas las opciones gratuitas que ofrecen, porque, aunque no lo parezca, de un servicio a otro (aunque sean gratuitos) varia mucho.

He intentado que estén los discos duros virtuales más importantes, ya que, como comentaba antes, hay mucha diferencia de uno a otro, aunque hay algo que tienen en común: Todos ofrecen un servicio gratis de almacenamiento y todos son discos duros virtuales en el que almacenar archivos de imágenes, música, texto o video, que se pueden compartir o descargar en cualquier momento.

Preguntas frecuentes sobre Mi biblioteca (Google books)

Google Books permite crear una biblioteca personalizada en la que podrás organizar, crear reseñas, puntuar y buscar una selección personalizada de libros. Estas colecciones se publican online, por lo que podrás acceder a ellas desde cualquier lugar donde dispongas de acceso a tu cuenta de Google. Si tu cuenta de Google Libros está vinculada a tu perfil de Google, las estanterías que tengan una visibilidad "Pública" (con el icono en forma de globo) estarán disponibles para amigos que conozcan la URL de tu colección, por lo que una vez que hayas creado una colección, podrás compartirla con ellos enviándoles un enlace a tu biblioteca de Google Libros. Más información sobre las estanterías de bibliotecas

Cómo subir tus libros EPUB y PDF’s a Google Play Books

subir libros google play books cab
En Google Play no sólo encontramos aplicaciones y juegos, la mayoría de ocasiones confundimos Play con la tienda de Apps de Android, cuando en realidad es una tienda de contenidos, en la que se incluyen elementos de todo tipo como libros, películas y música. Para cada uno de esos contenidos Google pone a nuestra disposición los lectores adecuados: Play Music, Play Movies y Play Books.

3, 2, 1… ¡Enlaces interesantes 210!

Enlaces interesantes
Tras el parón vacacional, ya estamos de vuelta totalmente recargados y listos para afrontar con energías la nueva temporada, que va teniendo pinta de ser muy intensa en todos los sentidos.
Y para celebrarlo como se merece, ahí va la primera colección de enlaces recopilados durante las últimas semanas, que como siempre espero que os resulten interesantes :-)

.Net

13 de septiembre de 2015

Instalar un Slideshow para blogger con un solo widget



En esta nueva presentación de Ayudadeblogger.com les presentare un nuevo Slideshow para que lo utilicen en su blog de blogger gratis. En este nuevo Slideshow para blogger no necesitaran instalarlo en el Editor HTML de su plantilla de Blogger, solo copiaran un simple código en su pagina de Diseño en un widget HTML/Javascript y solo cambiaran un paso nada mas, y con esto funcionara su Slideshow para blogger. A este Slideshow para blogger se lo ha hecho tan simple y sencillo para que no tengan ningún problema al momento de instarlo en su blog de blogger. El Slideshow esta hecho en jQuery con efectos de transición, los efectos de transición que les voy a presentar en este Slideshow se mostrara en las imágenes las cuales realizan un efecto único.

Instalar un Slideshow para blogger con un solo widget

11 de septiembre de 2015

Crear un bloque de artículos relacionados (Related articles) con vistas en Drupal 7

En la blogósfera como en la prensa en línea, es bastante común encontrar debajo de un artículo, una lista de artículos relacionados (related articles) asociados al autor o a algunas palabras claves.
Les propongo hoy un post que les explicará como crear un bloque con artículos relacionados por términos de la taxonomía al nodo actual con Views 3 en Drupal 7.x. Verán que será bastante simple y rápido como muchas veces con Drupal.

8 de septiembre de 2015

Octave 4, una nueva forma de ver las cosas…

GNU Octave
Hace algún tiempo se comentaba sobre GNU Octave, un potente programa para análisis numéricos orientado a métodos matriciales parte del proyecto GNU , cuya principal característica es ser explícitamente Software Libre, y ofreciendo como gran ventaja el ser compatible a nivel lenguaje en un alto grado con su contraparte privativa Matlab.