Transacciones ajax entre dominios, el temido CORS - C#

Buenas noches cybernautas, hace unos días en el mundillo de desarrollo de software me tope con CORS, unas siglas que giran entorno a la data compartida entre dominios.
De acuerdo a wikipedia, nos dice que CORS es un mecanismo para restringir recursos entre dominios.

CORS, presente en el desarrollo de software hace unos días:
Requerimiento: Se tiene una ruta http://aaa.com/ que quiere consumir datos a través de ajax de la ruta http://bbb.com/get/datos. Este trabajo se debe realizar a nivel del Frontend.


Bueno, del lado del dominio A tenemos que realizar una llamada utilizando una función de angular.

 $http.jsonp('http://bbb.com?callback=JSON_CALLBACK&params1=' + 1 + '&params2=' + 2).
 success(function(data) {
                console.log("data >>>", data);
 }).
 error(function (err) {
                console.log("error >>>", err);
 });


Ahora del lado B, trabajamos en el backend para permitir la salida de datos. Para ello primero implementamos la siguiente clase:


 using System.Web.Script.Serialization;
public class JsonpResult : JsonResult
 {
  object data = null;

  public JsonpResult()
  {
  }

  public JsonpResult(object data)
  {
   this.data = data;
  }

  public override void ExecuteResult(ControllerContext controllerContext)
  {
   if (controllerContext != null)
   {
    HttpResponseBase Response = controllerContext.HttpContext.Response;
    HttpRequestBase Request = controllerContext.HttpContext.Request;

    string callbackfunction = Request["callback"];
    if (string.IsNullOrEmpty(callbackfunction))
    {
     throw new Exception("Callback function name must be provided in the request!");
    }
    Response.ContentType = "application/x-javascript";
    if (data != null)
    {
     JavaScriptSerializer serializer = new JavaScriptSerializer();
     Response.Write(string.Format("{0}({1});", callbackfunction, serializer.Serialize(data)));
    }
   }
  }
 }

En nuestro controlador instanciamos la clase antes creada.


 public class equisController : Controller
 {
  public JsonResult getDatos()
  {
                        CodeFirst context = new CodeFirst();
   List q = context.ModelEquis.toList();
   JsonpResult result = new JsonpResult(q);
   return result;
  }
 }

Al final podemos comprobar que la data es transmitida y podemos mostrarlo en un gustoso "console.log"

Comprimir imágenes (*.jpg, *.png) para geeks y usuarios finales

Saludos cybernautas, les cuento que hoy tuve la necesidad de comprimir imágenes *.jpg, *.png de manera que recurrí a googlear un poco, para buscar alguna herramienta, linea comandos o lo que sea.
Así que lo primero que apareció fueron estas herramientas para ubuntu:


Trimage, esta disponible para distintas distribuciones linux: Debian, Ubuntu, Archlinux, etc. Posee una interfaz gráfica desde la cual pueden seleccionar la imagen y a comprimir fácil. 


Jpegoptim, otra herramienta pero en linea de comandos, tambien con soporte para Linux, Solaris, Darwin/OS X. Aqui dejo el repositorio del proyecto Github
Ademas encontré este articulo de un blog muy conocido en el cual explican la instalación y uso.

Bueno hasta el momento, esta son herramientas para los cuales hay que tener cierto conocimiento de informática o almenos usar una plataforma linux, que para ustedes geeks esto va bien. Sin embargo quise evitar la fatiga de comprimir las imágenes y dejarle ese trabajo a la diseñadora. 
Entonces con una búsqueda adicional encontré este sitio web: http://makeitsolutions.com/labs/jic/




Que lo único que tenemos que hacer es arrastrar la imagen que deseamos comprimir, seleccionar el porcentaje de compresión que queremos y listo, podemos descargar la imagen comprimida. 
Con esto me despido, si conocen alguna otra herramienta de compresión para usuarios finales pueden dejarlo en los comentarios. 
Gracias.


Virtualenv, Rvm, Nvm configurando nuestro entorno de programación

Acabo de instalar Ubuntu 14.04.4 LTS, y ahora que?
Apuesto a que esta pregunta fue una de las primeras que siempre solían hacerse cuando aun iniciaban a utilizar la plataforma. Ubuntu para empezar, fedora para otros gustos, redhat, etc.

A medida que el tiempo transcurría el ser nato programador que llevaban dentro empezó a asomar, y es así como poco a poco dejaban de instalar herramientas de ocio y se inclinaban mas por instalar frameworks, librerías.

Recuerdo la primera vez que instale Django 1.3, fue en una clase de programación, 6 meses después salía Django 1.4, entonces algunos problemas se hacian notorios. Como iva a instalar Django.14, si ya tenia la versión anterior?
... esperen, esperen ahora viene la versión 1.9.

La solución: Virtualenv, una herramienta que permite crear entornos aislados para asi poder instalar las versiones que querramos sin perjudicar en lo mas minimo a toda la plataforma.

La instalación no es tan complicada, al menos en ubuntu no.

sudo apt-get update
sudo apt-get install python-setuptools
sudo easy_install pip
sudo pip install virtualenv
cd ~/ # nos dirigimos a nuestra carpeta home
virtualenv --no-site-packages --distribute venv # creamos un entorno donde instalaremos una versión de Django
source venv/bin/activate # activamos el entorno, solo sirve para la sesion actual
pip install django==1.5

Facil verdad? bueno con el paso de los meses me interese por NodeJS, y esta vez con lo aprendido busque inmediatamente algo parecido a Virtualenv, y adivinen que ... encontré NVM (Node virtual machine) con el cual podemos instalar multiples versiones de NodeJS.



La instalación es sencilla, en ubuntu :)

sudo apt-get update
sudo apt-get install build-essential libssl-dev
curl https://raw.githubusercontent.com/creationix/nvm/v0.16.1/install.sh | sh
source ~/.profile # para que tu perfil tome la configuración de nvm
nvm install 0.11.13 # instalas una versión de nodejs
nvm use 0.11.13 # seleccionas la versión que deseas usar
node -v # mostrar la versión de nodejs que estas usando
nvm ls # mostrar las versiones que tienes instalado en tu pc

Ok, esto va bien, poco a poco mi Pc va quedando limpia de instalaciones, y aun asi sigo desarrollando en diferentes versiones. Derrepente ...  vi pasar delante de mis ojos Ruby, no es broma, pues ya había tratado de hecharle mano hace un par de años pero no me animaba del todo.
Pero como todo en la vida, las cosas llegan y esta vez me encuentro programando en ruby.
Y una vez el conocimiento antes adquirido me llevo a realizar una pequeña busqueda topandome asi con RVM (Ruby virtual machine) ya saben cybertnautas la historia es la misma, ambientes separados para no llenar de basura el sistema operativo.



sudo apt-get install build-essential libssl-dev
sudo gpg --keyserver hkp://keys.gnupg.net --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3
\curl -sSL https://get.rvm.io | bash -s stable --ruby
source ~/.profile # tambien puede ser source ~/.bash_profile
rvm gemset list # muestra lista de entornos que tienes
rvm use 2.2.1@teddy --create # crea un entorno con la version de ruby 2.2.1
rvm gem list # muestra las gemas que tienes instalado en tu entorno actual

Ya compartido esto, es hora de programar.
Estoy relajado :)
Chao.

Documentación de software con Markdown

Dentro del desarrollo de software, existe un punto en el cual debemos realizar documentación técnica. Esto puede ser redactado simplemente en un archivo de texto plano, sin formato alguno, o en otros casos con la ayuda de herramientas como Microsoft Office, para los espíritus libres Libre office.

Es así como dentro del equipo de desarrollo de software se encuentran presente los analistas de software, o un personal correspondiente que se encarga de estas actividades. Que por su naturaleza es un ser que no gusta de lidiar con lenguajes de programación, de manera que al realizar la documentación optara por usar herramientas de oficina comunes.

Pero si, es por falta de presupuesto, personal o asares del destino que como programador te ha tocado documentar. No aumentes tu ira en contra de las herramientas de oficina, pues para esas actividades existe un lenguaje: "Markdown".

Un lenguaje de documentación orientado al programador, ese ser que comprende códigos, sintaxis y símbolos que al ser interpretados resultan en un documento bonito, ordenado y estilizado.



Habiendo dado a conocer este lenguaje, paso a dejar enlaces de herramientas que ayudaran a utilizar Markdown.



Si conocen otros editores de markdown o herramientas que ayudan a su uso pueden dejarlo en los comentarios.