1 09
05
2011

Cómo integrar WSE 3.0 en Visual Studio 2008

Fecha de publicación: 9 mayo 2011 a las 23:33 por admin

Recientemente en el trabajo, estamos desarrollando un proyecto en el que interactuar con un web services con WSE 3.0 integrada.

Por lo tanto, el primer paso fue instalar Web Service Enhancements (WSE) 3.0 for Microsoft .NET descargando el instalable desde esta dirección Web Service Enhancements (WSE) 3.0 for Microsoft .NET.

Una vez finalizada la instalación, no dispondremos todavía de esta herramienta integrada dentro de Visual Studio 2008. Para incorporar WSE 3.0 a nuestro entorno de trabajo Visual Studio 2008, podemos realizar los siguientes pasos:

1. Acudimos al directorio de instalación, en mi caso por ejemplo C:\Documents and Settings\All Users\Datos de programa\Microsoft\MSEnvShared\Addins

2. Editamos con el notepad (o similar) el archivo WSESettingsVS3.Addin (veréis que tiene formato xml)

3. Buscamos y sustituimos <Version>8.0</Version> por <Version>9.0</Version>, y finalmente guardamos los cambios.

4. Para terminar, abrimos Visual Studio 2008 y accedemos a: Tools (Herramientas) > Options (Opciones) > Add-in/Macros Security (Seguridad de Macros/Complementos)

5. Y añadimos nuestro directorio de instalación indicado en el punto 1 tal y como muestra la siguiente imagen.

Integrar WSE 3.0 en Visual Studio 2008

Integrar WSE 3.0 en Visual Studio 2008

No olvides “reiniciar” Visual Studio para contemplar los cambios realizados.

Ya podemos trabajar con WSE 3.0 integrado en Visual Studio 2008.

Integrar WSE 3.0 en Visual Studio 2008 - WSE 3.0 Settings

Integrar WSE 3.0 en Visual Studio 2008 - WSE 3.0 Settings

1 08
05
2011

Comprobar si existe un elemento con jQuery

Fecha de publicación: 8 mayo 2011 a las 15:29 por admin

Comprobar si existe un elemento con jQuery es muy sencillo.

Simplemente tenemos que ejecutar el siguiente código indicando en el selector de jQuery el identificador, clase o condición del elemento que estamos buscando para conocer si existe.


// Comprueba si existe algún elemento con el identificador "identifier"

if ($('#identifier').length) {

// Do something

}


// Comprueba si existe algún elemento con la clase css "mycssclass" asociado

if ($('.mycssclass').length) {

// Do something

}


// Comprueba si existe algún elemento de tipo radio-button

if ($(':radio').length) {

// Do something

}

 

9 01
05
2011

Obtener el valor de un radio button con Javascript (con y sin jQuery)

Fecha de publicación: 1 mayo 2011 a las 1:45 por admin

Siempre se me olvida, no sé cómo lo hago pero cuando estoy programando y necesito recoger el valor del radio button seleccionado… me surge siempre la misma pregunta: ¿y esto cómo se hacía?

jQuery

jQuery

Así que comparto con vosotros y me lo anoto para mí mismo la forma de recoger el valor del radiobutton seleccionado con la ayuda de jQuery.

Disponemos del siguiente grupo de radio-buttons dentro de un formulario para indicar el género o sexo de un usuario, y deseamos conocer el valor del botón de tipo radio seleccionado:

</p>
<p><label><input type="radio" id="gender-male" name="gender" value="male"/> Hombre</label><br />
<label><input type="radio" id="gender-female" name="gender" value="female"/> Mujer</label></p>
<p>

Mediante jquery podemos obtener el valor actual del radio con cualquiera de las siguientes líneas:

</p>
<p>var gender = $("input:radio[name='gender']:checked'").val();<br />
var gender = $("input[@name='gender']:checked").val();</p>
<p>

Y para los nostálgicos, cómo recoger el valor del radiobutton con javascript, sin ayuda de la librería jQuery (ayns… que recuerdos me trae esta función…):

</p>
<p>function getValueRadio(nombreFormulario,nombreCampo){<br />
  var longitud = eval("document."+nombreFormulario+"."+nombreCampo+".length")<br />
  for (var l=0; l<longitud; l++){<br />
    if (eval("document."+nombreFormulario+"."+nombreCampo+"["+l+"].checked"))<br />
        return eval("document."+nombreFormulario+"."+nombreCampo+"["+l+"].value");<br />
  }<br />
  return null;<br />
}//getValueRadio<br />
11 29
04
2011

ERROR 500: 1and1 hosting

Fecha de publicación: 29 abril 2011 a las 20:13 por admin

Cuál es mi sorpresa cuando al acceder a este blog en el día de ayer, y me encuentro con una bonita pantalla que dice:

ERROR 500: ERROR INTERNO DEL SERVIDOR

Ha surgido un problema inesperado que impide que el servidor pueda llevar a cabo la solicitud.

Ante tal mensaje de error, accedo inmediatamente a otro de mis blogs: sinnoticiasdelmundo.com, y me encuentro con otro error, esta vez mostrando un error de un plugin que tenía activado.

Ambos blogs personales, funcionando bajo wordpress, tanto v3rgu1.com como sinnoticiasdelmundo.com, se encuentran alojados en el hosting 1and1, del cual, hasta el día de hoy, he de reconocer que nunca había tenido ninguna queja ni problema.

Cuando había tenido alguna duda, había contactado con su soporte vía correo electrónico, resolviendo las dudas en un plazo razonable de tiempo. Sin embargo este no ha sido el caso. Dado que recientemente no había actualizado ninguna versión de wordpress ni de plug-ins, el primer pensamiento fue pensar en algún problema del hosting 1and1,  por lo que les notifiqué la incidencia inmediatamente, si bien aún seguimos esperando respuesta.

Por suerte, existe gente dispuesta a compartir sus conocimientos y soluciones, y buscando un poco por internet, hemos podido encontrar compañeros que se encontraban en situación similar a la nuestra, con su blog funcionando bajo wordpress alojado en 1and1 y con los mismos problemas, que aportaban soluciones, que efectivamente han funcionado.

Parece ser que el problema se debe a algún cambio realizado en 1and1 hosting, que provoca que la versión de php por defecto no sea php5, y por lo tanto, dejen de funcionar las páginas realizadas en php 5.x.

Esto se puede solucionar fácilmente accediendo al archivo .htaccess de tu instalación aplicación, e incluyendo las siguientes líneas:


AddType x-mapp-php5 .php .php4
AddHandler x-mapp-php5 .php .php4

De esta forma, le indicamos a apache el orden de versión de php por el que queremos que procese nuestros scripts.

Espero que esta solución al ERROR 500: Error interno del servidor en 1and1, os sea tan útil como me ha sido a mí gracias a la comunidad que entre todos formamos en internet.

0 21
04
2011

Character decoding failed

Fecha de publicación: 21 abril 2011 a las 21:35 por admin

Hace algunos días, programando unos scripts en los que enviaba una petición a un servlet de Java a través de AJAX, me encontré con el siguiente mensaje de error en la consola, en mi caso, de Apache Tomcat:

02-abr-2011 23:50:29 org.apache.tomcat.util.http.Parameters processParameters
ADVERTENCIA: Parameters: Character decoding failed.
Parameter skipped.{id=[Ljava.lang.String;@137c90d, id=[Ljava.lang.String;@1709902, nbsp; <span class=[Ljava.lang.String;@14d626e}java.io.CharConversionException: EOF

Lo que en un primer momento tenía pinta de ser uno de tantos problemas que te vuelven loco buscando soluciones por internet, pero sin embargo la solución era mucho más sencilla de lo esperado.

Dentro de la colección de parámetros que construía para enviar hacia el servlet de Java, podían existir en ocasiones caracteres especiales tales como ‘%’, ‘$’, etc, que generaban el error mencionado: Character decoding failed.

La solución a este problema pasaba simplemente por codificar la cadena a enviar por AJAX en formato unicode, y para ello utilizaremos la función de javascript escape.

El código quedaría parecido a estas líneas:

    var params = "id=" + textAreaName + "&value=" + escape(text);
    $.ajax({
        url: "/MyApp/ajax/http/edit?id=" + id,
        type: 'GET',
        data: params,
        success: function(){ // your code }
    });
0 30
01
2011

Internacionalización y localización en Java

Fecha de publicación: 30 enero 2011 a las 13:12 por admin

Hoy vamos a comprobar cómo conocer la cultura en la que se está ejecutando tu programa Java.

Pero, ¿qué es esto de la cultura?

El poder conocer la cultura en la que se está ejecutando un programa, nos permitirá acercarnos a construir un programa más agradable para el usuario final.

Además de las diferencias evidentes de idiomas, la cultura nos permitirá mostrar otros datos como fechas y números en los formatos correctos según la cultura y/o localización del cliente.

Un europeo, entenderá perfectamente la fecha 30/03/1983 como 30 de Marzo de 1983, mientras que un norte-americano esperaría 3/30/1983.

Nos permitirá la cultura por lo tanto internacionalizar nuestras aplicaciones de una forma más sencilla y elegante.

Para ello vamos a utilizar la clase Locale de java dentro del paquete java.util.

Según la propia definición de la clase Locale en la página de Sun… digo de Oracle: un objeto Locale representa una región geográfica, política y cultural específica.

Probemos con el siguiente código Java que utiliza la clase Locale de Java:

        Locale myLocale = Locale.getDefault();
        System.out.println("My country (ISO): " + myLocale.getCountry());
        System.out.println("My country name: " + myLocale.getDisplayCountry());

        System.out.println("My language (code): " + myLocale.getLanguage());
        System.out.println("My language (name): " + myLocale.getDisplayLanguage());

        System.out.println(myLocale.getDisplayName());

Este sencillo código nos permite conocer la cultura/localización de nuestra aplicación Java. Adicionalmente, estamos mostrando por pantalla algunas características del mismo como el país o el lenguaje actual.

La salida será la siguiente:

My country (ISO): ES
My country name: España
My language (code): es
My language (name): español
español (España)
My country (ISO): GB
My country name: United Kingdom
My language (code): en
My language (name): English
English (United Kingdom)

En futuros artículos veremos cómo seguir internacionalizando nuestras aplicaciones en Java.

2 24
12
2010

Feliz Navidad 2010

Fecha de publicación: 24 diciembre 2010 a las 13:00 por admin

Desde v3rgu1.com queremos desearos a todos felices fiestas, y agradeceros la aceptación del blog en este primer año de vida.

¡FELIZ NAVIDAD A TODOS!


0 08
12
2010

Google presenta su sistema operativo basado en la web y la nube

Fecha de publicación: 8 diciembre 2010 a las 3:48 por admin

Durante la tarde de hoy (mejor dicho, una vez echado un vistazo al reloj, durante la tarde de ayer), ha tenido lugar la Conferencia de Prensa de Google desde San Franciso, en la que han anunciado algunas de sus últimas novedades.

Sin lugar a duda, el proyecto más esperado por todos era el anuncio del sistema operativo de Google: Chrome OS.

Se trata de un sistema operativo inicialmente basado en Linux, pero orientado en su totalidad a la web y a trabajar en la nube. Al estar basado en la nube, la configuración de Google Chrome OS es rápida y sencilla: arrancamos, nos conectamos con nuestro usuario, y aparecerá el navegador web Google Chrome, que realizará las funciones de interfaz de usuario en el sistema. El sistema no cuenta con ningún escritorio ni nada que se le parezca.

Pero ¿por qué Google ha tomado este camino?

En realidad la respuesta es muy sencilla. Google sabe que el usuario clásico/normal permanece la mayor parte del tiempo en un navegador web, ya sea navegando, leyendo el correo, o explorando sus redes sociales. Si esto es así, para qué complicarse con pesadas y lentas aplicaciones de escritorio que posiblemente ni utilicemos en el mayor de los casos pero que sí afectarán negativamente al rendimiento de nuestro ordenador durante el paso del tiempo.

Buscando la sencillez del sistema, seguramente uno de los puntos más valorados de Google Chrome OS en el futuro será su rapidez. Y es que, a diferencia de los sistemas operativos tradiciones, con Google Chrome OS en pocos segundos tendremos un sistema totalmente cargado y listo para funcionar.

Otro punto a favor de Google Chrome OS, es que apunta a que al estar basado en un navegador, el sistema no se verá afectado negativamente en cuanto a rendimiento y velocidad a medida que pasa el tiempo e incorporamos nuevas aplicaciones; aplicaciones que por cierto, podremos descargar desde la nueva Google Web Store (anunciada también en el día de hoy y abierta en EEUU).

Al estar basado en la nube, todos nuestros datos se encontrarán sincronizados, en este caso a través de nuestra cuenta de Google. Esto significa en la práctica, que podremos acceder con nuestro perfil de usuario a diferentes ordenadores con Google Chrome OS instalado. Y por supuesto, todas aquellas aplicaciones de Google Web Store que hayamos instalado, estarán disponibles en cualquier otro ordenador al que accedamos con nuestra cuenta.

Para aquellos que quieran probar Chrome OS lo antes posible, Google ha lanzado el Chrome OS Pilot Program (disponible para USA), con el que los usuarios podrán probar Chrome OS en un portátil de 12 pulgadas llamado CR-48, el cual no dispone de ninguna marca ni pegatina en él, carece de disco duro y está libre para que incluso podamos instalarle otros sistemas operativos.

Mucho queda por descubrir de este nuevo sistema operativo Google Chrome OS, pero siempre es digno de admirar conseguir ver la rueda desde otro punto de vista.

0 28
11
2010

Reflexión: la gran desconocida en la programación

Fecha de publicación: 28 noviembre 2010 a las 2:33 por admin

“En informática, reflexión (o reflexión computacional) es la capacidad que tiene un programa de ordenador para observar y opcionalmente modificar su estructura de alto nivel.”

Esta es la definición que aparece en wikipedia en referencia al concepto de reflexión en el mundo de la informática y la programación.

Es una definición un tanto abstracta, pero que nos permite intuir en qué consiste todo esto de la reflexión.

Siendo más concretos y prácticos, el uso de la reflexión a nivel de programación, nos permitirá, entre muchas otras cosas, crear instancias u objetos de dinámicamente de tipos concretos a partir del nombre de su clase. Podremos además, acceder a la información de los objetos, conociendo y/o ejecutando sus atributos y métodos públicos; y todo ello en tiempo de ejecución.

Vamos a plantear un pequeño ejemplo práctico de introducción al uso de reflexión en el lenguaje de programación Java.

Imaginemos la siguiente estructura de clases definida en el diagrama UML que se muestra a continuación.

Diagrama UML Reflexión

Reflexión en Java

Definiremos en primer lugar una clase abstracta denominada Vehicle. Esta clase padre define 2 métodos abstractos (acelerar/speedUp y frenar/brake) que deberán ser implementados por todas aquellas clases hijas que deseen heredar de Vehicle.

Clase (padre) Vehicle

package es.v3.test.reflection;

/**
 * Clase abstracta padre
 * @author v3rgu1.com
 */
public abstract class Vehicle {

    public String name;

    public abstract void speedUp();

    public abstract void brake();

}//Vehicle

A continuación crearemos 2 clases hijas que implementarán la clase abstracta padre Vehicle

Clase (hija) Car


package es.v3.test.reflection;

/**
 * Clase hija que hereda de Vehicle y representa un vehículo de tipo coche.
 * @author v3rgu1.com
 */
public class Car extends Vehicle {

    @Override
    public void speedUp() {
        System.out.println("Me llamo " + this.name + " y soy un coche que está acelerando");
    }

    @Override
    public void brake() {
        System.out.println("Me llamo " + this.name + " y soy un coche que está frenando");
    }

}//Car

Clase (hija) Motorcycle


package es.v3.test.reflection;

/**
 * Clase hija que hereda de Vehicle y representa un vehículo de tipo motocicleta.
 * @author v3rgu1.com
 */
public class Motorcycle extends Vehicle {

    @Override
    public void speedUp() {
        System.out.println("Me llamo " + this.name + " y soy una moto que está acelerando");
    }

    @Override
    public void brake() {
        System.out.println("Me llamo " + this.name + " y soy una moto que está frenando");
    }

}//Motorcycle

Una vez creadas estas 3 clases con las que llevaremos a cabo nuestros próximos ejemplos relacionados con la reflexión en programación, vamos a crear una clase ejecutable (main) con la que crearemos instancias en tiempo de ejecución de las clases hijas definidas anteriormente. Recuperaremos además la información de cada una de ellas y ejecutaremos sus métodos públicos sin previo conocimiento de ellos.

Pasaremos 2 argumentos a nuestra clase ejecutable por línea de comandos: el nombre de la clase a instanciar (“Car” o “Motorcycle”) y el nombre de nuestro vehículo.
Vamos a crear una instancia en tiempo de ejecución del tipo indicado en el primer argumento, para utilizar después sus métodos implementados speedUp & brake.

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {

        String nameClass = args[0];
        String nameVehicle = args[1];
        try {
            Class vehicleClass = Class.forName("es.v3.test.reflection." + nameClass);
            Field[] fields = vehicleClass.getFields();
            Method[] methods = vehicleClass.getDeclaredMethods();
            try {
                Vehicle vehicle = (Vehicle) vehicleClass.newInstance();
                vehicle.name = nameVehicle;
                vehicle.speedUp();
                vehicle.speedUp();
                vehicle.brake();
                for (int i=0; i<fields.length; i++) {
                    Field field = fields[i];
                    System.out.println("Campo '" + field.getName() + "': " + field.get(vehicle));
                }//for i
                for (int i=0; i<methods.length; i++) {
                    Method method = methods[i];
                    System.out.println("Voy ejecutar el método: '" + method.getName() + "'");
                    method.invoke(vehicle);
                }//for i
            } catch (IllegalArgumentException ex) {
                Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
            } catch (InvocationTargetException ex) {
                Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
            } catch (InstantiationException ex) {
                Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
            } catch (IllegalAccessException ex) {
                Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
            }
        } catch (ClassNotFoundException ex) {
            Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
        }

    }//main

Con la ayuda del API reflect de Java, hemos instanciado una clase sin conocer a priori el tipo de la misma y únicamente a partir de su nombre, pero veamos más en detalle las funciones utilizadas en el ejemplo.

java.lang.Class forName(String className) javadoc
Devuelve el objeto Class asociado a la clase o interface indicada en el nombre que recibe por parámetro.

java.lang.Object newInstance() javadoc
Crea una nueva instancia del objeto representado por la clase actual.

java.lang.reflect.Field[] getFields() javadoc
Retorna un array con todos los atributos con acceso público de la clase o interfaz representada.

java.lang.reflect.Method[] getMethods() javadoc
Devuelve un array que contiene todos los métodos públicos de la clase o interfaz representada.

java.lang.reflect.Method[] getDeclaredMethods() javadoc
Devuelve un array que contiene todos los métodos declarados en la clase o interfaz representada.

En próximo artículos, veremos cómo realizar este mismo ejemplo de reflexión en otros lenguajes de programación, así como el uso técnicas de reflexión más avanzadas.

0 24
11
2010

Incrementar el número de conexiones sobre IIS

Fecha de publicación: 24 noviembre 2010 a las 19:54 por admin

A medida que desarrollas tus aplicaciones en .NET sobre el servidor IIS (Internet Information Server) seguramente te habrás encontrado en alguna ocasión con el siguiente error:

“403.9: Access Forbidden: Too many users are connected

Esto ocurre porque por defecto el número máximo de conexiones concurrentes permitidas se limita a 10 conexiones.

A mí personalmente me ha ocurrido cuando he querido realizar alguna batería de pruebas con un número ligeramente más alto a lo normal.

Pues bien, un pequeño truco para aumentar el número máximo de conexiones concurrentes permitidas sobre IIS es ejecutar el script adsutil.vbs, que normalmente se encuentra en el directorio inetpub, desde la ventana de comandos

>
>cscript c:\inetpub\adminscripts\adsutil.vbs set w3svc/MaxConnections 40
>

De esta forma hemos incrementado el número máximo de conexiones sobre Internet Information Server a 40, recibiendo en nuestro terminal un resultado como el de la siguiente imagen.

adsutil - aumentar número de conexiones sobre Internet Information Server

Sólo nos queda ahora reiniciar el servidor IIS.

>
>iisreset
>