¿Cómo enviar un archivo por Ajax de #jquery?

Para enviar un archivo por medio de Ajax en realidad es muy fácil, sobre todo con la función Ajax de jquery, para ello lo demuestro a continuación:
Primero tenemos el código html siguiente, el cual tiene un formulario con un campo de texto y un input file, es importante que el atributo del form enctype sea multipart/form-data, si no es asi no se enviara el archivo.


<form id="frmFormulario" enctype="multipart/form-data">
    <input type="text" name="uncampo">
    <input type="file" name="archivo">
    <input type="submit" value="Enviar">
</form>

Ahora tenemos que seleccionar(selectores de jquery) el formulario para que haga el envió por Ajax (Ver: ¿Cómo hacer una petición Ajax por medio de submit?) y para ello utilizo el siguiente código en javascript el cual esta comentado a detalle:


  $(document).ready(function () {

        //sobreescribimos el metodo submit para que envie la solicitud por ajax
        $("#frmFormulario").submit(function (e) {

            //esto evita que se haga la petición común, es decir evita que se refresque la pagina
            e.preventDefault();

            //ruta la cual recibira nuestro archivo
            url="@Url.Content("~/Archivo/Recibe")"

            //FormData es necesario para el envio de archivo,
            //y de la siguiente manera capturamos todos los elementos del formulario
            var parametros=new FormData($(this)[0])

            //realizamos la petición ajax con la función de jquery
            $.ajax({
                type: "POST",
                url: url,
                data: parametros,
                contentType: false, //importante enviar este parametro en false
                processData: false, //importante enviar este parametro en false
                success: function (data) {

                   alert("Se capturo el archivo con éxito")
                },
                error: function (r) {

                    alert("Error del servidor");
                }
            });

        })

    })

Y este es el trabajo que se hace en el front-end, ahora solo queda hacer el método en el back-end el cual capture el archivo y lo guarde o realice la acción deseada con el fichero; por ejemplo en Mvc.Net seria de la siguiente manera:

//controlador de mvc.net
public class Archivo : Controller{
  public ActionResult Recibe(string uncampo, HttpPostedFileBase archivo)
        {

          //aqui va el codigo que deseemos para manipular el archivo

       }
}

Y así de fácil se envía un archivo por medio de Ajax. Dudas o comentarios pueden hacérmelos llegar y yo les respondo en breve.

¿Cuál es el mejor lenguaje de programación?

Este artículo lo hago para romper muchos dogmas que existen en el área de desarrollo de software. Primero hablare de conceptos básicos y al final daré la conclusión y mi punto de vista. También hablare de lenguaje de programación encasillando: lenguaje de programación, framework, librería, Software-Stack etc.
Siempre los desarrolladores de software creen que los lenguajes que utilizan son los mejores ya que son los que utilizan. También existe el dogma de creer que el lenguaje de programación de moda (véase Ruby en el 2012, véase Mean últimamente) es el lenguaje más potente de todos.
Siempre defenderemos el lenguaje que sabemos utilizar ya que es el que nos da de comer, pero no por ello quiere decir que es el mejor. Los lenguajes de programación son como los colores, un gusto por el verde no lo hace mejor que el azul. O algo más acercado es, los idiomas con los que nos comunicamos, no por estar escrito el Quijote en inglés es mejor que el japonés. Para entender un poco el fin de este artículo, centrémonos en esto último.
Un libro nos cuenta una historia la cual pasa de generación en generación. Esta historia puede ser traducida y no por eso pierde su simbolismo. En los lenguajes de programación se cuentan al igual historias las cuales pueden ser traducidas de un lenguaje a otro (de programación); algo hecho en java del lado del servidor puede ser traducido a node.js o a php, y el lector de la historia (front-end por ejemplo) recibirá el mismo resultado. Aquí vemos un punto clave: la solución del problema es lo que le importa al cliente. Pero también le importa el tiempo en que es escrita la historia.
El tiempo en que se escribe una historia (programa) es parte de por qué nuestra elección sobre un lenguaje de programación nos hace pensar que es el mejor, pues es el que conocemos. Obviamente lo defenderemos a capa y espada. Aquí ya tenemos dos puntos clave: la historia y el tiempo en que esta es escrita, o a su vez, la solución del problema (historia plasmada en libro) y el tiempo de desarrollo (escritura de la historia).
Ahora ya que hablamos de la similitud de libros y programas, hablemos de otros puntos clave. Existen libros que son malos pero cuentan una historia que es entretenida más o menos, y existen libros que son buenos y cuentan una historia que entretiene, divierte, motiva, bueno es una obra de arte. Esto relacionado a los lenguajes de programación es lo siguiente: existen programas que son lentos, mal hechos pero resuelven el problema más o menos, y existen programas que resuelven el problema pero a su vez hace verlo como una obra de arte por su rapidez, y sobre todo la manera que parece que hace magia con el modelo de negocio del cliente. Es aquí el punto más importante: no importa en qué lenguaje de programación hagas las cosas, lo que importa es que hagas bien las cosas.
Otro punto clave es la antigüedad, la mayoría de las veces un lenguaje viejo es un lenguaje obsoleto (yo no veo a nadie escribiendo libros en griego o en hebreo). Pero no siempre es el caso, es mejor decir que un lenguaje es obsoleto cuando no evoluciona (nunca se implementó lambda, no tiene orms, no tiene plugins que hacen el desarrollo más rápido, etc).

Para concluir yo aconsejo que se debe conocer un lenguaje de programación con el cual estés cómodo, y después te hagas experto, más tarde en 1 o 2 años, ve conociendo más lenguajes, esto te ayuda a comparar la forma en que otros lenguajes resuelven lo que tú ya has resuelto, esto lograra que tu abstracción crezca y te ayudara a pensar de manera más ágil. Lo que más importa no es el lenguaje de programación sino la abstracción y creatividad que tengas para resolver las cosas.

Ningún lenguaje de programación es el mejor, sino el cómo tú piensas y resuelves el problema, eso es lo que en realidad importa.

¿Cómo concatenar un TimeSpan a un DateTime en c# .Net?

Por alguna circunstancia tenemos un TimeSpan y un DateTime y requerimos concatenarlos, es decir tenemos un TimeStam con la hora “13:30:00” y tenemos un DateTime con “2016-01-01 00:00:00”. Para ello tenemos que hacerlo de la siguiente forma:


DateTime fecha = DateTime.Parse("2016-01-01");
TimeSpan tiempo = TimeSpan.Parse("13:30:00");
DateTime fechaConcatenada = fecha.Value.Add(tiempo);

//fechaConcatenada = 2016-01-01 13:30:00

¿Cómo convertir una imagen de formato RGB a CMYK en c# .Net?

Hace poco termine unos proyectos en los cuales debía manejar la manipulación de imágenes enormes, y me encontré con mucha problemática y poca información, pero gracias a muchas desveladas conseguí el objetivo.
Uno de mis quebraderos de cabeza fue el transformar una imagen de formato RGB a formato CMYK, y hacer de una manera que sea gratuita (ya que encontré algunas empresas que vendían dlls a precios descabellados).

Si van a manipular imágenes enormes, ahórrense martirios y horas de trabajo demás, NO UTILICEN System.Drawing, la misma documentación de Microsoft no recomienda que lo utilices para proyectos con manipulación de imágenes grandes.

Ahora que ya resolví este problema publico este post que a más de uno le servirá, primero vamos a tener que instalar un dll que es gratuito (prácticamente es un wrapper hecho en c++), este magnífico dll se llama Magick.Net. Solo destacare que hay varios dlls con este nombre, lo que los diferencia es que tienen un numero al final, entre sea más elevado el número, se puede trabajar con imágenes mayores, descarguen según les convenga (si utilizaran imágenes enormes les recomiendo que bajen Q16 de 64 bits).
Si no sabes cómo instalar un dll por medio de nuget da clic aquí y te explico con un video como hacerlo.
Una vez que instalamos Magick.Net (otro problema que me encontré es la falta de ejemplos para .Net) vamos a crear la imagen CMYK. Para ellos lo haremos de la siguiente manera:


using(MagickImage image = new MagickImage("miimagenRGB.jpg")){
                        //lineas magicas que convierten a CMYK
                        image.AddProfile(ColorProfile.SRGB);
                        image.AddProfile(ColorProfile.USWebCoatedSWOP);

                        //y si guardamos nuestra imagen cmyk
                        image.Write("imagenCMYK.jpg");
}

Así de fácil se resuelve un problema en el cual estuve investigando casi por un mes (sorpresas de la vida del programador).
Más adelante iré agregando más artículos sobre esta potente librería.

Código gratis, sistema para gimnasio en C# .Net – Gym Hdeleon

Deseas más funcionalidad, ya salio la nueva versión de este sistema para administrar gimnasios, incluye registro con huella, administración de clases, Soporte para puerta eléctrica, membresias semanales,  indice de masa coorporal y más, puedes ver la información aquí.

La descripción del gimnasio ya compilado la hago en el siguiente video:

Si deseas este software en ingles da clic aquí.

No damos soporte de esta versión, ya que es la versión gratuita.

Existe una versión premium con costo con muchísimas más funcionalidades, puedes verla dando clic aquí.

Descargar sistema y código para gimnasio 1.0 GRATIS

Versión 1.0 en ingles, puedes acceder a la versión en ingles la cual también es gratuita (incluye código fuente).

IR A TUTORIAL PARA INSTALAR EL SOFTWARE (PARA PERSONAS QUE NO SABEN DE PROGRAMACIÓN)

Cualquier duda no duden en hacérmela en la parte de comentarios.

¿Cómo obtener los dispositivos usb en c#?

Para obtener los dispositivos USB que tiene nuestra computadora en c# vamos a hacer uso de la librería System.Management, esta librería debemos agregarla en las referencias de nuestro proyecto y al inicio de nuestra clase (using System.Management).

La siguientes dos clases hacen el trabajo y esta comentado que hace cada parte:

Clase para guardar la información de los dispositivos


/// <summary>
/// clase para guardar las especificaciones de los dispositivos
/// </summary>
  public class USBInfo
  {

    //constructor
    public USBInfo(string deviceID, string pnpDeviceID, string description)
    {
      this.DeviceID = deviceID;
      this.PnpDeviceID = pnpDeviceID;
      this.Description = description;
    }

    /// <summary>
    /// Device ID
    /// </summary>
    public string DeviceID { get; private set; }

    /// <summary>
    /// Pnp Device Id
    /// </summary>
    public string PnpDeviceID { get; private set; }

    /// <summary>
    /// Descripción del dispositivo o nombre
    /// </summary>
    public string Description { get; private set; }
  }

Clase que se encarga de obtener los dispositivos


 public class Usb
    {

        /// <summary>
        /// obtiene las usb de la computadora
        /// </summary>
        /// <returns></returns>
        public List<USBInfo> GetUSBDevices()
        {

          //creamos una lista de USBInfo
          List<USBInfo> lstDispositivos = new List<USBInfo>();

          //creamos un ManagementObjectCollection para obtener nuestros dispositivos
          ManagementObjectCollection collection;

          //utilizando la WMI clase Win32_USBHub obtenemos todos los dispositivos USB
          using (var searcher = new ManagementObjectSearcher(@"Select * From Win32_USBHub"))

          //asignamos los dispositivos a nuestra coleccion
         collection = searcher.Get();

          //recorremos la colección
          foreach (var device in collection)
          {
            //asignamos el dispositivo a nuestra lista
            lstDispositivos.Add(new USBInfo(
            (string)device.GetPropertyValue("DeviceID"),
            (string)device.GetPropertyValue("PNPDeviceID"),
            (string)device.GetPropertyValue("Description")
            ));
          }

          //liberamos el objeto collection
          collection.Dispose();
          //regresamos la lista
          return lstDispositivos;
        }
     }

Y de esta manera hacemos uso de nuestra clase USB:


Usb oUsb = new Usb();
List<USBInfo> lstUSBD = oUsb.GetUSBDevices();

Cambiar una imagen al dar clic en una imagen en miniatura con #jquery, #galería

Para crear una mini galería básica como la siguiente (den clic en las miniaturas):

Lo podemos hacer de la siguiente forma:

HTML

<div id="thumbs">
   <img style="width: 50px;" alt="" src="../img/images/at.jpg" data-img="../img/images/a.jpg" />
   <img style="width: 50px;" alt="" src="../img/images/bt.jpg" data-img="../img/images/b.jpg" />
</div>

<div>
    <img id="imagenGrande" style="width: 500px;" alt="" src="../img/images/a.jpg" />
</div>

Jquery

$(document).ready(function(){

	//selector de imagenes a aplicar la funcionalidad de click
	$("#thumbs img").click(function(){

		//obtenemos la imagen a mostrar
		urlImagenGrande=$(this).data("img");

		//asignamos la imagen por medio de prop
		$("#imagenGrande").prop("src",urlImagenGrande);

	})

});

Utilizando la propiedad prop procedemos a cambiar el atributo src de img al momento que se da clic en la miniatura. De esta manera queda la funcionalidad dinámica gracias al selector de jquery ($(“#thumbs img”)).

¿Cómo enviar un mail con archivos adjuntos desde C# .Net? #smtp

Para enviar un email desde .Net, lo podemos hacer muy fácil, ya que .Net ya nos proporciona lo necesario para realizarlo rápidamente.

A continuación plasmo el código de una clase improvisada que sirve para enviar el mail y a su vez tiene comentarios que van explicando parte por parte:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Mail;
using System.Text;
using System.Threading.Tasks;

namespace EnviaMail
{
     class Mail
    {

        string From = ""; //de quien procede, puede ser un alias
        string To;  //a quien vamos a enviar el mail
        string Message;  //mensaje
        string Subject; //asunto
        List<string> Archivo = new List<string>(); //lista de archivos a enviar
        string DE = "[email protected]"; //nuestro usuario de smtp
        string PASS = "tupass"; //nuestro password de smtp

        System.Net.Mail.MailMessage Email;

        public string error = "";

        /// <summary>
        /// constructor
        /// </summary>
        /// <param name="FROM">Procedencia</param>
        /// <param name="Para">Mail al cual se enviara</param>
        /// <param name="Mensaje">Mensaje del mail</param>
        /// <param name="Asunto">Asunto del mail</param>
        /// <param name="ArchivoPedido_">Archivo a adjuntar, no es obligatorio</param>
        public Mail(string FROM, string Para, string Mensaje, string Asunto, List<string> ArchivoPedido_ = null)
        {
            From = FROM;
            To = Para;
            Message = Mensaje;
            Subject = Asunto;
            Archivo = ArchivoPedido_;

        }

        /// <summary>
        /// metodo que envia el mail
        /// </summary>
        /// <returns></returns>
        public bool enviaMail()
        {

            //una validación básica
            if (To.Trim().Equals("") || Message.Trim().Equals("") || Subject.Trim().Equals(""))
            {
                error = "El mail, el asunto y el mensaje son obligatorios";
                return false;
            }

            //aqui comenzamos el proceso
            //comienza-------------------------------------------------------------------------
            try
            {
                //creamos un objeto tipo MailMessage
                //este objeto recibe el sujeto o persona que envia el mail,
                //la direccion de procedencia, el asunto y el mensaje
                Email = new System.Net.Mail.MailMessage(From, To, Subject, Message);

                //si viene archivo a adjuntar
                //realizamos un recorrido por todos los adjuntos enviados en la lista
                //la lista se llena con direcciones fisicas, por ejemplo: c:/pato.txt
                if (Archivo != null)
                {
                    //agregado de archivo
                    foreach (string archivo in Archivo)
                    {
                        //comprobamos si existe el archivo y lo agregamos a los adjuntos
                        if (System.IO.File.Exists(@archivo))
                            Email.Attachments.Add(new Attachment(@archivo));

                    }
                }

                Email.IsBodyHtml = true; //definimos si el contenido sera html
                Email.From = new MailAddress(From); //definimos la direccion de procedencia

                //aqui creamos un objeto tipo SmtpClient el cual recibe el servidor que utilizaremos como smtp
                //en este caso me colgare de gmail
                System.Net.Mail.SmtpClient smtpMail = new System.Net.Mail.SmtpClient("smtp.gmail.com");

                smtpMail.EnableSsl = false;//le definimos si es conexión ssl
                smtpMail.UseDefaultCredentials = false; //le decimos que no utilice la credencial por defecto
                smtpMail.Host = "smtp.gmail.com"; //agregamos el servidor smtp
                smtpMail.Port = 465; //le asignamos el puerto, en este caso gmail utiliza el 465
                smtpMail.Credentials = new System.Net.NetworkCredential(DE, PASS); //agregamos nuestro usuario y pass de gmail

                //enviamos el mail
                smtpMail.Send(Email);

                //eliminamos el objeto
                smtpMail.Dispose();

                //regresamos true
                return true;
            }
            catch (Exception ex)
            {
                //si ocurre un error regresamos false y el error
                error = "Ocurrio un error: " + ex.Message;
                return false;
            }

            return false;

        }
    }
}

Para utilizar la clase anterior lo podemos hacer de la siguiente manera:


           //creamos nuestra lista de archivos a enviar
            List<string> lstArchivos = new List<string>();
            lstArchivos.Add("c:/archivo1.txt");
            lstArchivos.Add("c:/archivo2.txt");

            //creamos nuestro objeto de la clase que hicimos
            Mail oMail = new Mail("[email protected]", "[email protected]",
                                "hola", "un mensaje bien chevere",lstArchivos);

            //y enviamos
            if (oMail.enviaMail())
            {
                Console.Write("se envio el mail");

            }
            else
            {
                Console.Write("no se envio el mail: "+oMail.error);

            }

Nota: si utilizan una cuenta Gmail, a veces va a tardar en conectarse, esto es porque Gmail tiene muchas restricciones de conexiones anónimas, en cambio sí utilizan una conexión smtp propia, no debe darles problema.