¿Por qué es divertido programar?

¿Por qué es divertido programar?. ¿Qué beneficios esperan obtener los programadores?

Primero, por el placer de construir cosas. Al construir cosas, los adultos experimentan el mismo placer que los niños al jugar con el barro, especialmente si construyen cosas que ellos mismos han diseñado.
Segundo, por el placer de hacer cosas que puedan resultar útiles a otras personas. En realidad lo que persiguen es que otros usen su trabajo y lo encuentren útil.
Tercero, por la fascinación de ver trabajar sistemas complejos, que asemejan rompecabezas en los que se integran diferentes piezas y partes móviles, que interactúan entre sí para llevar a cabo las funciones que inicialmente se han previsto.
Cuarto, por el placer de estar siempre aprendiendo al trabajar cada vez en proyectos de características diferentes.
Y por último, por el placer de construir con un material tan maleable y tan etéreo. El trabajo del programador, como el del poeta, se construye de forma sutil desde la materia pura de su pensamiento. Puede construir castillos en el aire, sólo con el esfuerzo de su imaginación. Pocos medios de creación son tan flexibles, tan limpios y fáciles de remodelar, para desarrollar complejas estructuras conceptuales.

Frederick P. Brooks. The Mythical Man-Month

How access file upload in controller action

Despues de tratar muchas cosas, como por ejemplo Request.Files, HttpContext.Request.Files, encontre la forma de obtener o mejor dicho accesar por completo un file upload en un action de un controller.

Supongamos que el codigo html es el siguiente

html form:
 <form name="" method="post" enctype="mulitipart/form-data">
     <input type="file" name="file" />
 </form>

La manera mas simple de manejar un file en el action de un controller es usando HttpPostedFileBase type:

public ActionResult ImporFile(HttpPostedFileBase file)
{
    // Do things with the file here like
    /*
       var fullPathFile = file.FileName;
       var sr = new StreamReader(file.InputStream,Encoding.UTF8);
       var filas = 0;
       while (sr.ReadLine() != null) { ++filas; }
       sr.Close();
    */
    return View();
}

Ahora si en base al codigo html te preguntas ¿Cómo debo hacer para añadir enctype=”multipart/form-data” a un form que es generado usando <%Html.BeginForm();%>?
La respuesta es: como parte de los htmlAttributes,Ej.

Html.BeginForm(action,controller, FormMethod.Post, new { enctype="multipart/form-data"})

Replace con Javascript y jQuery

Hoy compartiré unas funciones bastante útiles (dependiendo del contexto en que se usen) que mezclan html+javascript+jQuery.

El ejemplo es bastante simple y su objetivo es el siguiente:

  • Para una cadena ingresado se deben reemplazar todos los caracteres [X] con el caracter [Y]
  • Para un archivo indicado se deben eliminar todos los “.” (puntos) que existan en el nombre del archivo.

En javascript se puede utilizar la funcion replace para reemplazar una cadena ingresada por otra:

Sintaxis
stringObject.replace(findstring,newstring)

Esta funcion reemplaza el primer match de findstring con newstring en stringObject. Pero ¿como reemplazar todos los caracteres que conocuerden con findstring?, para ello se pueden utilizar 2 parametros de la función replace:

  • g utizado para encontrar todos los match de findstring en stringObject
  • i utilizado para que sea una busqueda “icasesensitive”

Otra forma de reemplazar todos los caracteres que conocuerden con findstring es mediante un ciclo iterativo el cual verán en el código.

Código de función que obtiene el nombre del archivo

function GetFileName() {
        var fullFileName = $("#file").val();
        var fileName = fullFileName.substr(fullFileName.lastIndexOf("\\") + 1, fullFileName.length);
        return fileName;
    }

Código de función que obtiene la extensióndel archivo

function GetExtension() {
        var fileName = GetFileName();
        var fileEx = fileName.substr(fileName.lastIndexOf("."), fileName.length);
        return fileEx;
    }

Código que realiza el Replace

$(document).ready(function() {
		$("#btnReplace").click(function () {
			var txtData = $("#txtData").val();
			var txtRemp = $("#txtRemp").val();
			var txtCaracter = $("#txtCaracter").val();
			var fileName = GetFileName();
			var fileEx = GetExtension();

			//replace "." en fileName
			fileName = fileName.replace(fileEx, '').replace(/\x2E/g, '') + fileEx;

			//replace txtRemp con txtCaracter en txtData
			/*
			solucion para todos los navegadores excepto iexplorer :P
			txtData = txtData.replace(txtRemp,txtCaracter,'gi');
			*/
			//solucion para todos los navegadores incluido iexplorer
			var intIndexOfMatch = txtData.indexOf(txtRemp);
			while (intIndexOfMatch != -1){
				txtData = txtData.replace(txtRemp,txtCaracter)
				intIndexOfMatch = txtData.indexOf(txtRemp);
			}

			$("#replace1").html(txtData);
			$("#replace2").html(fileName);
		});
	});

Un par de consideraciones:

  • Cuando reemplazo el punto uso una expresion regular con el valor hexadecimal del caracter “.” seguido con el parametro g para reemplazarlo en todo el nombre del archivo.
  • La sintaxis stringObject.replace(findstring,newstring,parameters) no es reconocida en IExplorer

Los fuentes del ejemplo los dejo en este Enlace

Saludos!!

Menu Recursivo

Hace mucho rato que no trabajaba con un menu recursivo, desde que trabaje en Tajamar/Travel Security que no veia uno :P , pero en un proyecto reciente tuve que volver a generar un menu recursivamente y aqui dejo respaldo de la logica base usada.
En resumen se trata de generar una lista recursiva de items con una estructura como la siguiente:

  • Modulo 1
    • Opcion 1
    • Opcion 2
  • Modulo 2
    • SubModulo 2
      • Opcion 3
      • Opcion 4
    • Opcion 5
  • Modulo 3
    • Opcion 6
    • Opcion 7

Para lo anterior tengo dos clases, una con la estructura de la tabla de la base de datos que maneja la info de los objetos del menu del sistema, y otra clase que usare solo para generar la lista recursiva anteriormente mencionada.

public class SecObjeto
{
	public Int32 IdObjeto { get; set; }
	public Int32 IdPadre { get; set; }
	public String Controller { get; set; }
	public String Action { get; set; }
	public String NombreModulo { get; set; }

	public SecObjeto(){ }

	public SecObjeto(int idobjeto, int idpadre, string controller, string action, string nombremodulo)
	{
		IdObjeto = idobjeto;
		IdPadre = idpadre;
		Controller = controller;
		Action = action;
		NombreModulo = nombremodulo;
	}
}

public class MenuList
{
	public String UrlView { get; set; }
	public String Name { get; set; }
	public List<MenuList> SubMenu { get; set; }

	public MenuList(string urlview,string name,List<MenuList> submenu)
	{
		UrlView = urlview;
		Name = name;
		SubMenu = submenu;
	}
}

public static List<MenuList> GenerarMenu(List<SecObjeto> secObjetos)
{
	var menuList = new List<MenuList>();
	foreach (var sObj in secObjetos)
	{
		//0 indica que se trata de un nodo padre
		if (sObj.IdPadre == 0)
		{
			//uri para accesar una view bajo el patron mvc
			var urlAction = sObj.Controller + "/" + sObj.Action;
			menuList.Add(new MenuList(urlAction, sObj.NombreModulo, GenerarSubMenu(secObjetos, sObj)));
		}
	}
	return menuList;
}

public static List<MenuList> GenerarSubMenu(List<SecObjeto> secObjetos, SecObjeto sObj)
{
	var menuList = new List<MenuList>();
	foreach (var objeto in secObjetos)
	{
		//la igualdad indica que objeto es hijo de sObj
		if (objeto.IdPadre == sObj.IdObjeto)
		{
			var urlAction = objeto.Controller + "/" + objeto.Action;
			menuList.Add(new MenuList(urlAction, objeto.Descripcion, GenerarSubMenu(secObjetos, objeto)));
		}
	}
	return menuList;
}

Con esto ya tengo una lista recursiva (List) con todo lo necesario para generar mi menu con html,jquery y css por ejemplo ;) .

Gravity by Embrace

Song

Lyrics

Honey, It’s been a long time coming
And I can’t stop now
Such a long time running
And I can’t stop now
Do you hear my heart beating
Can you hear that sound
Cause I can’t help thinking
And I don’t look down

And then I looked up at the sun and I could see
Oh the way that gravity turns for you and me
And then I looked up at the sky and saw the sun
And the way that gravity pulls on everyone, on everyone

Baby, It’s been a long time waiting
Such a long, long time
And I can’t stop smiling
No I can’t stop now
And do you hear my heart beating
And can you hear that sound
Cause I can’t help crying
And I won’t look down

And then I looked up at the sun and I could see
Oh the way that gravity turns on you and me
And then I looked up at the sun and saw the sky
And the way that gravity pulls on you and I, on you and I

Can you hear my heart beating
Can you hear that sound
Cause I can’t help crying
And I wont look down