martes, 24 de diciembre de 2019

ASP.NET MVC - Mis librerías Javascript favoritas

Cuando necesito iniciar un proyecto desde cero, hay ciertas librerías que incluyo casi por default en el mismo ya que me proporcionan funcionalidad que considero básica.

A continuación te presento la lista de librerías que con toda seguridad verías en mis proyectos, al menos en los que involucren ASP.NET MVC:
  • jQuery y bootstrap: ¿hay algo que explicar? =)
  • bootbox: cuadros de diálogo, alerta, prompt, input, etc. Al igual que con otras librerías, es necesario poner atención a las versiones, por ejemplo, cuando instalé el Nuget package "bootbox" tenía instalado el Bootstrap4 y sucedió que los cuadros de diálogo de bootbox aparecían con el título deforme. Revisé un poco la documentación y me dí cuenta de que estaba usando un bootbox que requería la versión 3 de bootstrap. Fue necesario buscar un paquete de bootbox diferente: Bootbox.JS
  • toastr: notificaciones "non blocking", mensajes que desaparecen solos.
  • bootstrap-select: dropdown list estilizadas, con opciones adicionales como checkboxes y búsqueda entre los elementos disponibles.
    • requiere jQuery, bootstrap, popper.js
  • jquery-editable-select: dropdown lists estilizadas con opciones adicionales pero menor funcionalidad que el anterior.
  • jquery.datatables: para la creación y estilizado de tablas de datos con funcionalidades como exportado a excel, pdf, búsqueda entre los elementos de la tabla, ordenamiento, paginación
    • datatables.bootstrap: para estilizar los datatables con bootstrap
    • datatables.buttons: extensión para datatables, que añade la capacidad de añadir botones de excel, pdf, etc.
      • jszip: necesario para las opciones de exportado a excel
      • datatables/buttons.html5: necesario para uso de los botones en HTML5 (existe otra librería para botones Flash para el caso de navegadores viejos)
    • NOTA: si es necesario utilizar más de un plugin/componente de jQuery datatables, tienen una página de descarga donde puedes indicar qué necesitas y te genera opciones consolidadas para obtenerlo de un CDN, un paquete para descargar, NPM, Yarn o Bower.
  • js.cookie: manejo de cookies (sin dolores de cabeza).

¿Cómo las añado al proyecto?


En el caso de ASP.NET, Algunas de ellas tienen su correspondiente paquete Nuget, tales como:
  • jQuery
  • Bootstrap: normalmente instala también jQuery y popper.js
  • Bootbox
  • Toastr
  • jQuery.DataTables: incluye por default varios archivos como datatables.bootstrap.js y datatables.buttons y buttons.html5, pero no incluye jsZip.
  • jsZip
¿En qué orden las añado? en el mismo orden que se encuentra la lista anterior dado que algunas de ellas tienen dependencia con otras, por ejemplo, Bootbox requiere bootstrap y jQuery mientras que Bootstrap necesita jQuery.

Para proyectos de Angular y similares, las añado manualmente o configuro el bundle si la plataforma lo permite.


Bundling en ASP.NET MVC 5

Por lo general, el proyecto tengo los siguientes bundles:
  • ScriptBundle:
    • jquery: aquí se encuentra solo el jQuery
    • jQueryVal: añadido por ASP.NET
    • modernizr: añadido por ASP.NET
    • bootstrap: contiene todos los archivos de Javascript que son default o casi default en todas las páginas de la aplicación, incluso algunos que no sean necesarios en todas las páginas pero que no sean demasiado grandes. Por ejemplo: bootstrap.js, respond.js, bootbox.js, toastr.js, bootstrap-select.js, jquery.datatables.min.js, datatables.bootstrap.js, datatables.buttons.min.js, js.cookie.js y algún script propio de mi aplicación.
    • datatables_excel_export: dado que no todas las pantallas exportan datos excel, aquí agrupo dos archivos, jsZip.js y buttons.html5.js.
  • StyleBundle:
    • css: aquí añado todos los css necesarios por los componentes de la lista anterior, y claro, los míos propios: bootstrap.css, bootstrap-select.css, toastr.css, jquery.datatables.css, etc, etc.

Para Finalizar

Lo más importante para mí acerca de este post es que me digas ¿Cuáles utilizas tu, porqué y para qué?

Saludos!

lunes, 6 de agosto de 2018

Aprender C#, Java ó C++

Recientemente me volvieron a realizar la clásica pregunta de aquellos que quieren aprender a programar: ¿Qué lenguaje debo aprender?

  

Mi respuesta

Voy a dar una respuesta breve y después comentaré las razones de ello y las circunstancias en que doy esa respuesta: aprende C#

Como ya te podrás imaginar, no hay una sola respuesta para ello ya que intervienen muchísimos factores, tales como: si es por hobby o porque te quieres dedicar a ello profesionalmente, si quieres programar sistemas empresariales o videojuegos, aplicaciones de escritorio, aplicaciones web o aplicaciones móviles y un largo etcétera.

Conocer un lenguaje te facilita aprender otro.


Para aquellos que recién comienzan a programar puede parecer que aprender un lenguaje de programación es complicado y que es mejor aprender "el bueno" desde el principio, sin embargo, los que ya somos veteranos en esto podemos decir que lo de menos es aprender la sintaxis lenguaje nuevo.

Actualmente resulta incluso más sencillo que hace unos años puesto que ahora contamos con autocompletado de código, reportes detallados de errores de compilación, un montón de tutoriales en Youtube, portales como StackOverflow y redes sociales donde podemos poner una pregunta y aclarar nuestras dudas.

Hace tiempo, para una conferencia que impartí en la Universidad Autónoma de Nayarit (en 2008 o algo así, ya ha llovido bastante desde entonces) creé el gráfico que ves a la izquierda de este párrafo, supongo que debería actualizarlo y ampliarlo. Lo que trato de expresar con él, es que los lenguajes de programación están muy interconectados, si conoces uno de los "grandes" o "clásicos" entonces ya conoces algo, o mucho, de los que derivaron de él.

Por ejemplo:

  • si conoces C entonces ya conoces algo de C++ y por ello algo de Java y C#.
  • Visual Basic 6 (ahora obsoleto) nos llevó a Visual Basic.NET
  • Pascal te facilita Delphi y sus derivados como Kilyx y Delphi.NET

¿En qué se parecen C++, C# y Java?


Dicen que "para muestra basta un botón", veamos la instrucción "for" en cada uno de los tres lenguajes.

C#
Java

C++



El ciclo "for" se declara de la misma manera en los tres lenguajes. Es cierto que para imprimir algo en la consola C# utiliza "Console.Writeline", Java utiliza "System.out.println" mientras que C++ "cout", si utilizaran exactamente las mismas instrucciones serían exactamente el mismo lenguaje, sin embargo esas similitudes en la sintaxis se repiten con las instrucciones "if", "switch" y en parte, en la declaración de funciones así que aunque tengan sus diferencias, por lo menos sus similitudes te permitirán aprender el segundo lenguaje en menor tiempo que lo que te tomó el primero.

¿En qué se diferencian C++, C# y Java?


Al igual que sucede con todos los lenguajes que comparten una parte de su sintaxis, la primera diferencia que tienen es la otra parte de la sintaxis.

Por ejemplo, el operador para las expresiones Lambda (no es importante que aprendas este concepto en este momento, el ejemplo es solo ilustrativo), en C# se escribe "=>" mientras que en Java es "->", como concepto son lo mismo y de hecho ambos representan una flecha, pero se escriben diferente. Esto es porque surgieron en diferente tiempo en cada lenguaje o simplemente porque dada la filosofía con la que está diseñado el lenguaje hacía más sentido ponerlas de diferente manera.

En C++ el uso de expresiones lambda es posible desde la versión 11, que surgió como estándar en 2011 (ref 1, ref 2). Mientras que en C# están disponibles por lo menos desde C# 3 el cual estuvo disponible en 2007.

Otra diferencia muy importante es: las librerías, funciones o módulos que componen el framework del lenguaje en cuestión. Cada lenguaje va a implementar sus librerías en diferentes clases o jerarquías de objetos aunque al final puedan servir para lo mismo, como el caso de los Buffered Streams en Java y los Stream Readers en C#.

Entonces, ¿porqué C#?


Básicamente me parece que en este momento y para un principiante C# es la mejor opción debido a la flexibilidad que da el poder "moverse" a otros lenguajes. Es cierto que casi casi da lo mismo aprender primero C++ o C# o Java y ya desde ese punto de vista no conviene quebrarse la cabeza.

Supongamos que quieres crear aplicaciones más "cercanas" al procesador, entonces recomendaría C++, pero la verdad es que no me veo programando aplicaciones empresariales (páginas web, reportería o aplicaciones de escritorio) en C++, eso resulta más sencillo en C# ó Java. De igual forma, si solo vas a programar aplicaciones para Android entonces probablemente lo mejor sería aprender Java (y aún eso tiene sus condicionantes), o si serán videojuegos de gama alta, por ejemplo con el motor Unreal Engine o diseñando tus herramientas desde cero, entonces ve agarrando un libro de C++. En cambio te interesan videojuegos multiplataforma (que puedan correr en Android, iPhone, Windows, XBox) lo más lógico sería C#.

Dicho todo lo anterior, hay que recalcar que en esto de la programación una herramienta no es mágica, no sirve para todo, cada una tiene su ámbito, pero creo que actualmente C# te permitiría "moverte" más fácilmente a C++ y Java en caso de ser necesario y además el uso que le han dado herramientas como Unity para creación de videojuegos ó Xamarin para aplicaciones móviles le dan una mayor versatilidad.

¿Y que hay de Visual Basic .NET?, si ya conoces VB.NET entonces te puede resultar muy sencillo moverte a C# debido a que los objetos del framework se encuentran en las mismas clases y librerías, la diferencia es la sintaxis propia del lenguaje pero aún así, conociendo VB.NET diría que conoces por lo menos 50% de la programación con C# (no del lenguaje C# sino de los elementos que intervienen en un programa) y te podría suceder como a mí que realicé "el salto" de VB.NET a C# en una semana, pero claro, ya conocía C++ aunque lo tenía algo oxidado.

¿Eres nuevo, te interesa programar y no sabes por donde empezar?, aprender C#

¿Estás de acuerdo conmigo?, bien, me gustaría conocer tu experiencia, déjame un comentario.

¿Estás en desacuerdo?, excelente, cuéntame tu punto de vista.

Saludos!

martes, 9 de enero de 2018

SQLite Entity Framework en Visual Studio 2017 Community

Recién quise utilizar SQLite con Entity Framework en Visual Studio 2017 y me encontré con que no había paquete de instalación específico para esta versión de Visual Studio y que además, en uno de los hilos del foro de SQLITE el usuario mistchkin indica que parece ser que no creará un paquete de soporte (link al hilo).

Sin embargo, rebuscando en la web, específicamente en StackOverflow, alguien comenta que sí es posible, utilizar SQLite con Entity Framework en Visual Studio 2017. Después de seguir esta guía y fallar miserablemente debido a un tema con la versión específica a utilizar del Entity Framework decidí anotar los pasos, de manera que aquí los tienes desglosados para que te ahorres las horas (y los cabellos) que a mí me costó averiguar el escenario completo.

Nota: Estos pasos son para proyectos tipo "Database First" ya que las herramientas (incluso las oficiales por parte de SQLite) para esta versión no soportan proyectos tipo "Code First"



Instalar el SqlCeToolbox del usuario de Github ErikEJ

Link al instalador de la extensión , Link a las release notes de la extensión (por si quieres un poco más de información acerca del asunto).

Esto agrega una herramienta al menú "Herramientas" en el IDE

El cual es una herramienta para crear/consultar bases de datos SQLite y SQL Server. Lo importante aquí es que la herramienta aparezca en el IDE y que al pulsar el botón de "?" aparezca la línea "SQLite EF6 DbProvider in GAC - Yes" ya que ello indica que la dll de SQLite se encuentra en el GAC y que la herramienta para poder utilizarla en modo "Database First" fue correctamente instalada.



Instalar el SQLite en la GAC

Debes instalar el paquete "sqlite-netFx46-setup-bundle-x86-2015-1.0.106.0.exe" que puedes encontrar en los downloads de SQLite. Aquí debes tomar en cuenta lo siguiente: netFx46 indica la versión del framework, así que este se refiere al framework 4.6 de .NET, bundle-x86-2015 se refiere a la arquitectura y versión de visual studio mientras que 1.0.106.0 se refiere a la versión del SQLite. Seguro te preguntarás "y si esto es para VS.NET 2017 ¿porqué voy a instalar algo para VS.NET 2015?" y mi respuesta es: estando en este negocio nada debería sorprenderte ya ;)  pero créeme, así es como va a funcionar. Mi otra respuesta sería: ni busques el paquete para VS.NET 2017 porque por lo menos hasta el momento de escribir este artículo, dicho paquete no existe.

Selecciona "Full Installation" y marca todas las opciones en la siguiente pantalla (ver imágenes a continuación)




Compilar para .NET Framework 4.6

Este paso en ocasiones no es necesario pero solo "por si las moscas", es mejor utilizar el framework 4.6 de .NET.  Para lograrlo, es necesario ir las propiedades de tu proyecto y luego cambiar el "Target Framework" a 4.6





Instalar en tu proyecto las librerías de Entity Framework

Puedes utilizar el NuGet package manager para esto pero cuida de seleccionar la versión versión 6.1.3, ya que debido a un cambio en el Entity Framework en la versión 6.2, las librerías de SQLite versión 1.0.106.0 generan un error que impide al IDE ayudarte a crear las clases para un proyecto "Database First"



Instalar en tu proyecto los paquetes necesarios de SQLite

Los paquetes/dll son los siguientes:
  • System.Data.SQLite
  • System.Data.SQLite.Core
  • System.Data.SQLite.EF6
  • System.Data.SQLite.Linq

Selecciona la versión 1.0.106.0. Si utilizas el NuGet, basta con instalar System.Data.SQLite ya que se instalarán automátciamente los demás debido a las dependencias. Y cuidado, la versión de estas DLL deben ser LA MISMA que la del paso anterior: 1.0.106.0, de lo contrario, el entorno, ya sea en tiempo de compilación o de ejecución, te podría dar un error indicando que no encuentra las librerías.


Verifica tu archivo App.config

En la sección "entityframework" deberán existir estas entradas en "providers"

    <providers>
      <provider invariantName="System.Data.SQLite" type="System.Data.SQLite.EF6.SQLiteProviderServices, System.Data.SQLite.EF6" />
      <provider invariantName="System.Data.SQLite.EF6" type="System.Data.SQLite.EF6.SQLiteProviderServices, System.Data.SQLite.EF6" />
    </providers>


y en system.data deberán aparecer las siguientes líneas DbProviderFactories

    <DbProviderFactories>
      <remove invariant="System.Data.SQLite" />
      <remove invariant="System.Data.SQLite.EF6" />
      <add name="SQLite Data Provider (Entity Framework 6)" invariant="System.Data.SQLite.EF6" description=".NET Framework Data Provider for SQLite (Entity Framework 6)" type="System.Data.SQLite.EF6.SQLiteProviderFactory, System.Data.SQLite.EF6" />
      <add name="SQLite Data Provider" invariant="System.Data.SQLite" description=".NET Framework Data Provider for SQLite" type="System.Data.SQLite.SQLiteFactory, System.Data.SQLite" />
    </DbProviderFactories>


Estas líneas son necesarias para indicarle al .NET cuáles son las dll/clases para conexión con SQLite y con SQLite mediante Entity Framework.

Compila tu proyecto

En ocasiones no es necesario pero lo más seguro es compilarlo y listo, de lo contrario... podría ser que necesites regresar a compilarlo así que ahorrate problemas antes de ejecutar el siguiente paso y simplemente presiona Ctrl+Shift+B para compilar y listo.

Ejecuta el Entity Data Model Wizard

En este punto ya puedes usar el Entity Data Model Wizard para crear el "contexto" y las clases de acceso a  la base de datos.

Añade un nuevo elemento "ADO.NET Entity Data Model"

Selecciona "EF Designer from Database" para tener un proyecto tipo "Database First"
 Selecciona el "SQLite Provider (Simple for EF6 by ErikEJ)", en efecto, esto es lo que instalaste en el primer paso.

 
Al elegir la base a la cual conectarte, en la propiedad "Data Source" deberás indicar la ruta del archivo de base de datos SQLite que probablemente ya tienes creado.

 Luego de ello podrás seleccionar las tablas a añadir a tu modelo.
 Y ¡voilá!, las tablas están tu diagrama y las clases de contexto y clases modelo de clase están en el "Explorador de Solución"


Espero que este artículo te haya sido de ayuda. Si te surge algún error no cubierto en esta guía no dudes en dejarme un comentario.


sábado, 12 de septiembre de 2015

Cómo proteger la privacidad en Firefox

4 Pasos para proteger privacidad
Por lo general no nos damos cuenta del rastro de información que vamos dejando cuando navegamos, o de la cantidad de datos que recibimos y que no solicitamos.

Por ejemplo, todos esos banners y anuncios que aparecen en los sitios web no solo juegan con nuestra privacidad si no también consumen ancho de banda cuando se están descargando hacia nuestro navegador. Igual sucede con las cookies de empresas rastreadoras o de publicidad, debido a ello, al bloquear rastreadores y publicidad estamos también optimizando un poco el ancho de banda. De hecho en algún lugar en la página de UBlock Origin leí que en algunos casos el uso del ancho de banda se reduce en 16%.

¿Cómo Proteger la privacidad en Firefox?

Para proteger la privacidad en Firefox tenemos 2 rutas de acción: la primera sería utilizar las configuraciones propias de firefox y la segunda consiste en utilizar algunos plugins que nos ayuden con esta tarea.

Paso 1. Configuraciones de Firefox


  • General:
  • Siempre revisar si Firefox es tu navegador predeterminado
  • Al iniciar FireFox: Mostrar una Página Vacía
  • Página de Inicio: puede quedarse como lo tengas configurado pero recomiendo utilizar https://duckduckgo.com/
  • Buscar: Buscador Predeterminado: DuckDuckGo
  • Privacidad
    • Indicar a los sitios web que no quiero ser rastreado
    • Historial: Usar configuraciones personalizadas
    • NO recordar el historial de búsquedar y formularios
    • Aceptar cookies de terceros: Nunca
  • Seguridad-Contraseñas: NO recordar contraseñas de los sitios


Plugins para Firefox

Ghostery plugin
Paso 2. Ghostery: Este plugin sirve para bloquear las cookies y rastreadores que comúnmente existen en las páginas. De esta manera reforzaremos nuestra seguridad al no quedar a merced de las páginas rastreadoras de actividad o de marketing optimizando de paso (un poco) el uso de nuestro ancho de banda.

UBlock Plugin
Paso 3. UBlock Origin: Este plugin sirve específicamente para bloquear anuncios (ads) en las páginas web. Existe bastante debate acerca de cuál es mejor (AdBlock Plus vs UBlock Origin) sin embargo parece ser que son bastante cercanos en precisión sin embargo recientemente AdBlock Plus comenzó a recibir "retribución" por parte de algunas empresas para permitir que cierta publicidad "no intrusiva" sí sea mostrada (ver noticias), por lo cual he cambiado a UBlock Origin.

HTTPS Everywhere plugin
Paso 4. HTTPS Everywhere: Recientemente comencé a utilizar este plugin, sirve para que en caso de que la página web y las webs de las que extrae datos tenga una versión HTTPS (HTTP Secure, es decir, cuya comunicación viaja encriptada), se utilice esa versión en lugar del http.

Extra

Puede ser algo engorroso al principio pero si de verdad te preocupa tu privacidad, te recomendaría utilizar el buscador DuckDuckGo ya que éste buscador no muestra publicidad y lo más importante: no guardar el historial de las búsquedas que hemos realizado. Tal vez no se pueda reemplazar completamente al buscador de Google pero por lo menos tenemos opciones a utilizar según lo necesitemos.

En el siguiente video te guío por estos 4 pasos:



Saludos!

martes, 8 de septiembre de 2015

Optimizar Windows 10

Un problema bastante común es que conforme pasa el tiempo el rendimiento de nuestro sistema operativo windows va decayendo (windows 10, 7 ,8).

Aquí voy a explicar brevemente los pasos a seguir para recuperar velocidad de ejecución.

El sistema operativo se ve afectado por varios factores: