Últimas Entradas

Generación automática de getters, setters y constructores en C#

Una de las características que más me gustan de Netbeans es su posibilidad de generar código repetitivo automáticamente utilizando funciones de generación de código automatizadas presionando alt+insertar en el cuerpo de la clase, tales como la generación de los Inspectores (Getters), Modificadores (Setters) y Constructores, que ahorran tiempo considerablemente y más cuando queremos solo completar la definición de una clase de forma elegante.

1

En C#, sabemos que los getters y setters se pueden declarar rápidamente en una propiedad (es decir, atributo público cuya asignación o lectura no requerirá de un método particular) usando cualquiera de estos métodos:

//Declaración abreviada
public tipo nombre{get; set;}

//Declaración con miembro privado
private tipo micampo;

public tipo acceso_micampo
{
get{ return micampo; }
set{ micampo = value; }
}

Durante mucho tiempo, pensé que Visual Studio no permitía acelerar esta tarea, ya que aunque es bastante corta la manera de declarar dichos métodos, siempre se agradece no tener que estar copiando y pegando algo que se mantendrá constante para todas las propiedades de una clase. Ademas, a la hora de crear diversos constructores, había que escribirlos a mano, lo cual quita del mismo modo, bastante tiempo.

Para simplificar la generación de código de las propiedades, utilizaremos la función Insertar Fragmento de Código, haciendo clic derecho sobre cualquier parte dentro de una clase y seleccionando C# y luego prop, propg o propfull.

2

Notar que basta con escribir estas instrucciones en nuestro código y seguido a ello, presionar tab, lo que llamará a la autocompletación de código en plantilla.

//Escribiendo prop + TAB
public TYPE Type { get; set; }

//Escribiendo propg + TAB
public int I { get; private set; }

//Escribiendo propfull + TAB
private int myVar;

public int MyProperty
{
get { return myVar; }
set { myVar = value; }
}

Para la generación de un Constructor, desgraciadamente, Visual Studio no incluye un generador o plantilla que pueda servirnos, pero si utilizamos un plugin como ReSharper (de pago, a no ser que seas un MVP), su generación es muy simple, basta con ir al menú de ReSharper, seleccionar Edit y finalmente Generate Code.

3

Se abrirá un pequeño menú contextual como el de Netbeans en el cual seleccionamos Constructor y luego, un asistente nos guiará en el resto del proceso.

Captura de pantalla 2014-04-11 06.48.10

Llenar de manera asíncrona un combobox (o DropDownList en Razor) en ASP.NET MVC4 a partir de otro combobox

Captura de pantalla 2013-11-10 01.55.58

Es común que cualquier formulario que utilicemos en un sitio web llene los combos de selectores de datos a partir de información llenada previamente.

Para este ejemplo, agradezco la ayuda de Camilo Ramirez, quien tiene vasta experiencia en MVC4.

Por ejemplo, al seleccionar un país en un combobox (o select o DropDownList, etcétera), lo esperable es que otro combobox llene las ciudades a partir del país seleccionado en el primer combobox.

En MVC4 tenemos dos formas de hacerlo; la forma sincronía es enviar el valor del primer combo a un controlador, que llene una segunda lista y se envíe a la vista dentro del modelo para desplegar los datos. El problema de esta forma, es que recargaremos la página completa, por lo que si no enviamos los datos ya llenados por el usuario, deberemos generar las rutinas para que los valores de todos los campos se llenen de modo automático.

La segunda forma es hacer que el valor sea envíado a una acción del controlador de manera asíncrona, y los valores sean devueltos utilizando AJAX. Veamos como se hace:

En la Vista, consideremos el siguiente bloque que genera un combo primera-lista a partir de la variable primeraLista:

@{
var primeraLista = new List<object> {new {nombre = "primero", id = 1}, new {nombre = "segundo", id = 2}, new {nombre = "tercero", id = 3}};
}

@Html.DropDownList("primera-lista", new SelectList(primeraLista, "id", "nombre"), new { @id = "primera-lista" })
<select id="segunda-lista"></select>

El siguiente código javascript se encarga de “escuchar” cuando el valor de la lista primera-lista sea cambiado, lo que hará que el valor sea enviado utilizando AJAX a una acción del controlador que alterará el código de la página web de manera asíncrona con los valores retornados:

<script src="~/Scripts/jquery-1.8.2.js"></script>
<script type="text/javascript">
    $(document).on("ready", function() {
        $("#primera-lista").change(function() {
            idSelected = $(this).val();
            $.ajax({
                url: '@Url.Action("GetSecondValues")'+"?id=" + idSelected,
                type: "POST",
                success: function (data) {
                    var options = "";
                    $.each(data, function(index, value) {
                        options += '<option value="' + value.id + '">' + value.nombre + '</option>';
                    });
                    $("#segunda-lista").html(options);
                },
                error:function() {
                    alert("error...");
                }
            });
        });
    });
</script>

En el controlador generamos una acción con ActionResult que reciba como retorno un objeto JSON con la lista de elementos a cargar dependiendo del valor enviado desde el combo primera-lista. Notar que la lista se crea en este momento, por lo que podemos invocar un webservice o rutina a una base de datos para llenar esta lista:

 public ActionResult GetSecondValues(int id)
        {
            List<object> devolver;
            switch (id)
            {
                case 1:
                    devolver = new List<object>
                                   {
                                       new {nombre = "hola1.1", id = 1},
                                       new {nombre = "hola1.2", id = 2},
                                       new {nombre = "hola1.3", id = 3}
                                   };
                    break;
                case 2:
                    devolver = new List<object>
                                   {
                                       new {nombre = "hola2.1", id = 1},
                                       new {nombre = "hola2.2", id = 2},
                                       new {nombre = "hola3.3", id = 3}
                                   };
                    break;
                case 3:
                    devolver = new List<object>
                                   {
                                       new {nombre = "hola3.1", id = 1},
                                       new {nombre = "hola3.2", id = 2},
                                       new {nombre = "hola3.3", id = 3}
                                   };
                    break;
                default:
                    devolver = new List<object>
                                   {
                                       new {nombre = "default1", id = 1},
                                       new {nombre = "default2", id = 2},
                                       new {nombre = "default3", id = 3}
                                   };
                    break;
            }
            return Json(devolver);
        }

Insertar la caja de comentarios de Facebook en WordPress

grtgrtgrt

grtgrtgrt

Una integración simple y siempre muy solicitada es la de la caja de comentarios de Facebook en los sitios WordPress, que es el CMS más utilizado a nivel mundial dada su simplicidad de uso y mantención.

Para lograr esta integración, no requerimos de una Application ID de Facebook, ya que, al igual que los botones Like, funciona “en caliente”, sin requerir tokens ni nada.

(más…)

Get the logged in Windows User in ASP.NET C# application

We’ll not discover another Americas, but this is easy:

With the Razor Engine, put this on View:

@{
string luser = User.Identity.Name.Split('\\')[1];
}

You're logged in as @luser

Or use this on Controller:

string luser = User.Identity.Name.Split('\\')[1];

Remember that you must use the Windows Authentication, in other cases, you’ll get an empty string.

Ofrecer Productos o Servicios de Software

En la generación de oportunidades de negocio, se debe establecer claramente que es lo que se ofrecerá finalmente al cliente.

Por un lado, se pueden ofrecer Productos, un desarrollo envasado que se vende “as is” -o “tal cual”-, que es básicamente, el modo más común de vender software a nivel empresarial. Videojuegos, Sistemas Operativos o Suites de Ofimática se venden en esta modalidad y su gran ventaja es la de desarrollar una vez, y luego solo buscar a quienes venderles el producto, asociado a un servicio de soporte que puede incluir asesoría en funcionamiento o en agregar o corregir features a través de parches y actualizaciones de seguridad.

(más…)

Uso de BD embebida en Netbeans usando Derby

Actualmente me encuentro dictando un curso de desarrollo en mi ex Universidad, y esta unidad particularmente nos trajo algunos problemas dadas ciertas configuraciones de Netbeans. Hice un videotutorial que comparto a quien pueda serle útil.

Derby es la base de datos que Netbeans utilizá formalmente como JavaDB, y para esto nos provee un driver de conexión incluido por defecto en el JDK. El ejemplo muestra como habilitar el uso de Derby en caso de que no este habilitado por defecto y un ejemplo simple de como ejecutar consultas de forma gráfica y por medio de código.

Dividir un archivo en Linux y unirlo en Windows

Si por algún motivo tenemos un archivo en Linux que pese demasiado, podemos dividirlo usando el comando Split:


split -b 1024m "archivo.ext" "archivo_part-"

Esto generará n partes de archivo.ext de tamaño 1024 MB con los nombres archivo_part-aa – ab – ac – ad, etcetera.

Para unirlos en Windows usamos el siguiente comando:


Copy /b archivo_part-aa + archivo_part-ab archivo.ext

Ambos comandos vienen por defecto en ambas plataformas.

Ubuntu 12.04 Oracle JDK is NOT installed – Error Code 1

When tried to install the Oracle JDK in Ubuntu 12.04, i get this error:

Oracle JDK 7 is NOT installed.
dpkg: error processing oracle-java7-installer (--configure):
subprocess installed post-installation script returned error exit status 1
Errors were encountered while processing:
oracle-java7-installer
E: Sub-process /usr/bin/dpkg returned an error code (1)

To solve it, this works for me:

sudo rm /var/lib/dpkg/info/oracle-java7-installer*
sudo apt-get purge oracle-java7-installer*
sudo rm /etc/apt/sources.list.d/*java*
sudo apt-get update
sudo add-apt-repository ppa:webupd8team/java
sudo apt-get update
sudo apt-get install oracle-java7-installer

Then, u can see the Java and Java Compiler versions using:

java -version
javac -version

Diccionario Español en Kindle 3 (Keyboard) con version 3.4

Kindle 3

Kindle 3A todos los dueños de un Kindle 3, hace algunos meses nos sorprendió que Amazon sacara una nueva actualización de software, por lo que, probablemente, todos corrimos a descargarla e instalarla.

El problema es que el diccionario español que la mayoría usa desgraciadamente dejo de funcionar (si, el Larousse típico), indicándonos al marcar una palabra que el diccionario seleccionado no servia y que usáramos otro (que están en ingles, así que no sirven).

Después de buscar en varios lugares, di con la solución,  que es básicamente  modificar los metadatos del diccionario para que siempre considerara la configuración es-es (es decir, lenguaje español, distribución española) para todas las búsquedas.

El resultado de este proceso lo pueden bajar aquí.

Para instalarlo,

1. Descomprimir el contenido en la carpeta documents del Kindle.

2. En el dispositivo, en la pantalla principal, presionar la tecla Menu, e ir a la opción Settings.

3. Presionar una vez mas la tecla Menu, y luego ir a la opción Changue Primary Dictionary.

4. Seleccionar Larousse.

Eliminar posiciones vacías de un string[] en C#

Si al utilizar un split en una cadena de texto, nos quedan elementos vacíos, split no hace de manera inteligente la eliminación de los elementos que quedaron en blanco.

Para limpiar esos elementos, una forma bastante simple es utilizar una pequeña cadena hecha en linq que realiza a la perfección esta funcion:

string[] items = cadena.Split("|||".ToCharArray());
items = items.Where(x => !string.IsNullOrEmpty(x)).ToArray();

Iconos de Windows Phone 7/8

Si eres un desarrollador de aplicaciones para Windows Phone 7 u 8, probablemente habras necesitado encontrar algunos iconos para las ApplicationBar que no se incluyen con los propios SDK.

A continuación, adjunto una colección de iconos que utilizo para mis aplicaciones y que son bastante metro-style.

Iconos WP7 y WP8

Redirección de Apache a la carpeta de los Usuarios sin el “~”

Es común que al crear nuevos usuarios en Linux para darles acceso a un espacio web (tipicamente a través de una carpeta public_html en la carpeta de sus perfiles), es que la ruta hacia esas paginas web sean del tipo:

http://sitioweb.com/~usuario/

Ese caracter “~”, puede ser difícil de encontrar en tablets y teléfonos y ademas, “estéticamente”, se ve bastante feo, así que para que el acceso al espacio de los usuarios quede en la forma:

http://sitioweb.com/usuario/

Debemos editar el archivo httpd.conf ubicado comúnmente en /etc/apache2/ y agregar el siguiente script perl.

<perl>
opendir H, '/home/';
my @dir = readdir(H);
closedir H;
foreach my $u (@dir) {
    next if $u =~ m/^\./;
    if (-e "/home/$u/public_html")
    {
        push @Alias, ["/$u", "/home/$u/public_html/"];
    }
}
</perl>

Debemos procurar tener instalado y habilitado el modulo de perl para Apache, si no lo tenemos o no estamos seguros, ejecutamos:

sudo apt-get install libapache2-mod-perl2

Finalmente, reiniciamos el servidor Apache.

sudo service apache2 restart

WordPress muestra el mensaje: “No disponible por Mantenimiento Programado. Vuelve a comprobar el sitio en unos minutos.”

Simple, para solucionar este problema, hay que eliminar el archivo .maitenance ubicado en la raíz del sitio WordPress.

Un problema trivial, pero muy molesto, ya que puede activarse y no revertirse al, por ejemplo, fallar la instalación de un plugin base de WordPress, como Jetpack, y al ser un archivo oculto, cuesta pillarlo.