Los comentarios sobre Gnome 3 me causaron un poco de ‘inquietud’.

Gnome 3 ha llegado a Debian Testing. Ya había leído comentarios llenos de emociones a favor o en contra de este nuevo entorno de escritorio, desde que salieron los previews. Lo primero que leí me hizo pensar que no gustaba. Luego busqué información positiva para ver a quienes si les gustaba y noté que hay quienes lo aman.

Esto me causó un poco de inquietud en el sentido de que me puso alerta sobre si este nuevo Gnome 3 me haría más o menos productivo. Recuerdo que cuando salió KDE 4 mucha gente escribió que no les gustaba, pero yo lo probé desde las versiones de desarrollo y debo decir que siempre me gustó. Supongo que este cambio es igual que aquel de KDE 4, algunos no lo quisieron, otros lo amaron.

El Gnome lo probé con un live CD que salió hace un tiempo como preview, y también me gustó. Me pareció que la interfaz mejoró: la metáfora es más simple. Ahora lo estoy usando en producción desde hace dos días y voy a darle unas semanas antes de decidir si me quedo con él, si vuelvo con KDE 4.x o me voy por el super fabuloso y simple LXDE (que lo tengo instalado desde que dejé KDE 4.x). Por ahora lo veo bien.

Dos recomendaciones por ahora:

1. Para pasar a la vista de actividades, sirve pulsar la tecla que tiene el logo de Windows en el teclado.
2. Para poder apagar la computadora, pulsar sobre el nombre de usuario en la esquina superior derecha y luego pulsar la tecla Alt del teclado, mira bien que ahora si apareció la opción de apagar.
3. En la esquina inferior derecha se ocultan los iconos que antes se ponían en el Tray, como el de wi-cd.

Me gusta Epiphany, es suficientemente rápido, bonito y muestra todo (menos flash, por ahora). Voy a dejar, en principio, toda la configuración básica que trajo Gnome 3 en Debian Testing, menos el network-manager que ya lo quité y prefiero wi-cd. Luego de unas semanas escribo a ver que tal siento que me ha ido y si he puesto algún complemento que me haya ayudado.

Mañana es el día Debian en Caracas

Mañana sábado 20 de Agosto de 2011:

Dirección: Av. Principal de la Floresta cruce con Av. Francisco de Miranda Urb. La Floresta, Edificio Sucre. a una cuadra de la estación de metro “Altamira”, frente a Centro Plaza. Chacao Estado Miranda.

Desde las 8:30 am hasta las 5:30 pm.


http://www.ciudadccs.info/?p=202601

http://www.diadebian.org.ve/

Demostraciones, talleres, charlas, instalaciones y mas…

RTL8191SEvB Wireless LAN Controller con kernel 3 en VIT M2400

Hace un tiempo compré una computadora VIT M2400 para reemplazar una Toshiba A215. Antes que nada, debo decir que la computadora VIT es muchísimo mejor que la Toshiba, por lo que recomiendo VIT. Además que se tiene la garantía en el propio país y se apoya la industria nacional de ensamblaje de computadoras.

El punto es que hoy se me actualizó el Kernel de Linux a la versión 3.0.0. Esto implica que el wireless deja de funcionar ya que se necesitan unos firmwares privativos para funcionar, pero al menos se puede uno descargar el driver libre desde Realtek que incluye el firmware.

uname -a
Linux cubagua 3.0.0-1-amd64 #1 SMP Sun Jul 24 02:24:44 UTC 2011 x86_64 GNU/Linux

lspci
02:00.0 Network controller: Realtek Semiconductor Co., Ltd. RTL8191SEvB Wireless LAN Controller (rev 10)

Driver a descargar:

http://152.104.125.41/downloads/downloadsView.aspx?Langid=1&PNid=48&PFid=48&Level=5&Conn=4&DownTypeID=3&GetDown=false&Downloads=true#2302

Seleccionar el driver que indica ‘Linux driver for kernel 2.6.35 (and later)’, ya que el driver anterior no compila con este nuevo kernel. Yo tenía antes el driver anterior que lo venía compilando para los kernels 2.6, pero con el kernel 3 falló y fui a descargarlo de nuevo.

El driver tiene un error porque hubo una variable que cambiaron en el kernel a partir del 2.6.39. Todo esto lo explican en está página:

http://www.linuxquestions.org/questions/slackware-14/make-error-wireless-realtek-driver-883400/

Entonces hay que hacer un comando para cambiar el nombre de variable:

sed -i 's|RX_FLAG_TSFT|RX_FLAG_MACTIME_MPDU|g' base.c rtl8192{ce,se,de}/trx.c

verificar que se tengan instalados los linux-headers del kernel:

sudo aptitude install linux-headers-3.0.0-1-all-amd64

Luego si se puede compilar con los comandos que indica el archivo readme:

sudo su
make
make install
reboot

Debian-ve se solidariza con Ubuntu-ve

El trabajo por tener mejor software libre se realiza en varios frentes. Es muy importante contar con Ubuntu, porque genera una distribución de GNU/Linux que incluye software libre en su inmensa mayoría, y que además resulta adecuada para las personas que se inician con GNU/Linux y personas básicos conocimientos técnicos de computación o informática.

Es por eso que la comunidad de Debian-ve está buscando dar apoyo a la comunidad de Ubuntu-ve.

Yo inicié en GNU/Linux y el software libre con Ubuntu, como muchos otros en la actualidad. Actualmente soy usuario de Debian y pienso que el apoyo es necesario entre las distintas comunidades de GNU/Linux y organizaciones que apoyen de alguna manera al software libre.

Mañana será el 2do Festival de Software Libre del SAPI

Mañana será el II Festival de Software Libre 2011 organizado por el SAPI.

Lugar y hora:
UNIVERSIDAD NACIONAL EXPERIMENTAL POLITECNICA DE LAS FUERZAS
ARMADAS (UNEFA)
Jueves 17 de Marzo 2011
Entre la Av: la estancia y Av. Caracas , Con Calle Holanda
Frente al Edificio Banvenes (Cubo negro)
Chuao-Caracas.

Recuerde registrarse en la página web del SAPI: http://sapi.gob.ve/

Este es el cronograma del evento. Hay muchísimas charlas (guao) y algunas como las de la sala 4 son bastante avanzadas:

Programa II FSL

Evento de Software Libre del SAPI este jueves en la UNEFA de Caracas

Este próximo Jueves 17/03/2011 se realizará el II Festival Software Libre 2011, evento organizado por el Servicio Autónomo de Propiedad Intelectual (SAPI).

Este evento se realizará en la sede de la UNEFA en Chuao, Caracas, a partir de las 8:30 AM.

Habrá feria de instalación de Software Libre. Lleva tu computadora para que te instalen una distro. Habrá charlas básicas y avanzadas, incluyendo charlas de Bases de datos Postgres y probablemente Python. Habrá stands con demostraciones de las distintas tecnologías.

Lo más importante la entrada es libre y gratis. Se pueden registrar para recibir su certificado de asistencia.

II Festival Software Libre 2011 - SAPI
II Festival Software Libre 2011 - SAPI

Sosftware para linux con tu BB. Linberry.

Todas aquellas personas que poseen o utilizan teléfonos Blackberry al parecer tienen que utilizar el sistema operativo Windows para poder conectarse desde su computadora al teléfono Blackberry.

Ahora existe un programa para conectar tu Blackberry que corre en Debian y Ubuntu (aunque según su autor debería correr en otras distribuciones de Linux).

Israel Marrero ha diseñado y escrito Linberry (http://linberry.webcindario.com/), y ha hecho una petición a los bloggers venezolanos para que le ayuden a promocionar su software. No es software libre ni tampoco de código abierto, no me quedó claro cuál es la licencia con la cual distribuye el programa, pero en mensajes intercambiados con el autor del programa me aclaró que es código cerrado.

Linberry está en estado Alpha, lo que significa que no está suficiente maduro, probado y le faltan algunas características para que pueda pasar a ser considerado estable. El mismo autor advierte sobre esto en su página e indica que no se hace responsable por el uso que cada quien haga del programa, y menos si pierde datos o daña su computadora, o explota, o cualquier cosa mala que pase.

No he usado este programa y no lo voy a usar, por varias razones (sin pedantería, por favor :):

  1. No tengo Blackberry ni voy a comprar o usar uno en el futuro que puedo vislumbrar.
  2. La descarga es para arquitectura i386, y yo poseo es arquitectura AMD64.
  3. Puede ser un troyano, pero ¿cómo saberlo?.

Atrapando las arrastradoras que pescan ilegalmente en las costas Venezolanas.

La pesca de arrastre es ilegal.

Aunque se practicó durante casi 5 décadas, la pesca de arrastre era uno de los sistemas más dañinos para la explotación pesquera. Actualmente es ilegal, por lo que muchos ecologistas y amantes de la naturaleza tienen un triunfo que celebrar.

Recordar este evento.

Para recordar este evento y que no las futuras generaciones no crean que todo siempre fue así como es hoy, creé un juego de computadora. Bueno, lo medio-creé, porque no lo he terminado.

El año pasado se hizo un concurso por parte del Ministerio de Educación para generar contenidos educativos. Me inscribí en el concurso, pero como el juego estaba realmente muy crudo, no lo presenté. Me hubiera gustado avanzar más en la programación del juego, pero realmente con el trabajo y los tigres que tengo que matar no tuve tiempo suficiente. Me dio pena ir a presentar eso incompleto.

Atrapa la arrastradora.

Ese es el nombre del juego. Está hecho con Python y PyGame. No había tenido tiempo ni siquiera de publicarlo en algún lugar. Hoy por fin lo puse en Gitorious:

http://gitorious.org/atrapa-la-arrastradora/

Aún le falta mucho, pero si alguien lo prueba y cree que la idea es buena, acepto sugerencias.

Intro del juego.

Por las fechas que comencé a hacer el juego me compré una tableta digitalizadora (de esas que tienen un lápiz) para hacer los dibujos del juego. Es divertido. Lástima no tener más tiempo (y lástima que la bendita tableta no tenga drivers libres).

El juego está con licencia GPLv3. El contenido va con licencia Creative Commons BY-NC-SA. Solo falta completarlo.

=-=-=-=-=
Powered by Blogilo

Pasar Datos del Header SOAP al Service Class de Axis2.

0. Introducción
En este artículo se explica como pasar datos que vienen en el HEADER de un mensaje SOAP hacia la clase que implementa el servicio con Axis2.

El problema es que se quieren enviar algunos datos en el encabezado SOAP, y esos datos podrían ser usados por la clase que implementa el servicio (en Axis2 esta clase se llama Service Class). Estos son los datos que se quieren enviar en el mensaje SOAP:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ws="http://www.example.org/ws/">
   <soapenv:Header>
     <a:Channel xmlns:a="asdf">Canal</a:Channel>
     <a:Username xmlns:a="asdf">username</a:Username>
     <a:messageID xmlns:a="asdf">mesageid</a:messageID>
   </soapenv:Header>
   <soapenv:Body>
      <ws:CatalogLookup>
         <CategoryCode>123</CategoryCode>
         <SearchTerm></SearchTerm>
         <MaximunPrizePoints>54</MaximunPrizePoints>
         <Channel>Canal</Channel>
         <Status>Active</Status>
      </ws:CatalogLookup>
   </soapenv:Body>
</soapenv:Envelope>

Básicamente son: Channel, Username y messageID. Ahora, esos datos deben ser pasados a la clase que implementa el servicio. En nuestro caso son varios los servicios que hay que hacer que deben obtener este encabezado, entonces estamos usando Eclipse 3.5 con los plugins de desarrollo web, primero generamos el WSDL con la herramienta de Eclipse.

1. Crear el servicio usando Axis2 con Eclipse.
Este excelente artículo Creando un servicio web a partir de su interfaz WSDL por Javier Cámara (http://www.adictosaltrabajo.com/tutoriales/tutoriales.php?pagina=WSDL2Java) tiene todas las instrucciones de como hacerlo.

2. Crear un cliente de pruebas.
Aquí hay un tutorial muy bueno Desarrollar un cliente webservice desde WSDL en Axis2 por Julio César Pérez Arques (http://jcesarperez.blogsome.com/2007/08/26/desarrollar-un-cliente-webservice-desde-wsdl-en-axis2/) que explica como crear el cliente. En nuestro caso solo nos interesan los clientes síncronos.

Luego de crear el cliente nos genera una clase Stub. Creamos una clase que contenga un método main() de Java y allí metemos nuestra prueba, incluyendo los encabezados:

package cliente;

import java.rmi.RemoteException;
import javax.xml.namespace.QName;
import org.apache.axis2.client.ServiceClient;
import cliente.WsStub.CatalogLookupResponse;
import cliente.WsStub.ItemType;

public class Prueba {
	public static void main(String[] args) throws RemoteException {
		// Se le indica el url donde se desplegó el servicio web
		WsStub ws = new WsStub("http://localhost:8080/PruebaWsdl4/services/ws?wsdl");
		
		// aquí pone los encabezados.
		ServiceClient sc = ws._getServiceClient();
		sc.addStringHeader(new QName("http://digitel.com.ve/", "Channel"), "mega");
		sc.addStringHeader(new QName("http://digitel.com.ve/", "Username"), "camilo");
		sc.addStringHeader(new QName("http://digitel.com.ve/", "messageID"), "msg23443");
		
		// aquí pone unos valores en el cuerpo del mensaje (los parámetros)
		WsStub.CatalogLookup cl = new WsStub.CatalogLookup();
		cl.setChannel("as");
		cl.setStatus(WsStub.Status_type1.Active);
		
		// hace la llamada al WS
		CatalogLookupResponse r = ws.CatalogLookup(cl);
		
		// nuestro WS retorna un arreglo de objetos, pero obtenemos
		// el primero y lo mostramos
		ItemType i = r.localItem[0];
		System.out.println(i.localChannel);
		System.out.println(i.localDisabled.getValue());
	}

}

Observe que poner los encabezados en el cliente es muy fácil, no así en el servidor. Hay otras formas de agregar encabezados al cliente como puedes ver en el artículo: Working with Custom SOAP Headers por Deepal Jayasingha (http://wso2.org/library/3156)

3. Crear el handler de Axis2 que leerá los encabezados en el Servicio.
Hay que crear un handler de Axis2 para poder leer los encabezados del servicio y pasarlos a la clase que implementa el servicio. En nuestro caso estamos implementando los servicios con el Skeleton que genera Axis2 mediante el plugin de Eclipse. Entonces creamos una clase dentro del proyecto web del servicio así:

package ve.com.ws.handler;

import java.util.Iterator;

import org.apache.axiom.om.OMElement;
import org.apache.axis2.AxisFault;
import org.apache.axis2.context.MessageContext;
import org.apache.axis2.handlers.AbstractHandler;
import org.apache.log4j.Logger;

public class HeaderHandler extends AbstractHandler {
	public static final Logger log = Logger.getLogger(HeaderHandler.class);

	@Override
	public InvocationResponse invoke(MessageContext mc) throws AxisFault {
		String headerName = null;
		String headerValue = null;
		
		Iterator it = mc.getEnvelope().getHeader().getChildElements();
		while (it.hasNext()) {
			OMElement o = it.next();
			headerName = o.getQName().getLocalPart();
			headerValue = o.getText();
			if (log.isDebugEnabled())
				log.debug("SOAP Message Header: " + headerName + "=" + headerValue);
			mc.setProperty(headerName, headerValue);
		}
		return InvocationResponse.CONTINUE;
	}

}

Observe que los valores se guardan en el MessageContext de Axis2. Luego la clase del servicio los tomará de allí.

4. Agregar el handler al axis2.xml para que sea invocado.
Para que el handler pueda correr hay que agregarlo al archivo WebContent/WEB-INF/conf/axis2.xml dentro del proyecto web. Busque la sección phaseOrder type=”InFlow” y agregue este trozo de XML:

        <phase name="HeaderPhase">
            <handler name="HeaderHandler"
                     class="ve.com.ws.handler.HeaderHandler">
                <order phase="HeaderPhase"/>
            </handler>
        </phase>

Para que quede de la siguiente forma:

    <phaseOrder type="InFlow">
        <!--  System predefined phases       -->
        <phase name="Transport">
            <handler name="RequestURIBasedDispatcher"
                     class="org.apache.axis2.dispatchers.RequestURIBasedDispatcher">
                <order phase="Transport"/>
            </handler>
            <handler name="SOAPActionBasedDispatcher"
                     class="org.apache.axis2.dispatchers.SOAPActionBasedDispatcher">
                <order phase="Transport"/>
            </handler>
        </phase>
        <phase name="Addressing">
             <handler name="AddressingBasedDispatcher"
                     class="org.apache.axis2.dispatchers.AddressingBasedDispatcher">
                 <order phase="Addressing"/>
            </handler>
        </phase>
        <phase name="Security"/>
        <phase name="PreDispatch"/>
        <phase name="Dispatch" class="org.apache.axis2.engine.DispatchPhase">
            <handler name="RequestURIBasedDispatcher"
                     class="org.apache.axis2.dispatchers.RequestURIBasedDispatcher"/>
            <handler name="SOAPActionBasedDispatcher"
                     class="org.apache.axis2.dispatchers.SOAPActionBasedDispatcher"/>
            <handler name="RequestURIOperationDispatcher"
                     class="org.apache.axis2.dispatchers.RequestURIOperationDispatcher"/>
            <handler name="SOAPMessageBodyBasedDispatcher"
                     class="org.apache.axis2.dispatchers.SOAPMessageBodyBasedDispatcher"/>
            <handler name="HTTPLocationBasedDispatcher"
                     class="org.apache.axis2.dispatchers.HTTPLocationBasedDispatcher"/>
            <handler name="GenericProviderDispatcher"
                     class="org.apache.axis2.jaxws.dispatchers.GenericProviderDispatcher"/>
            <handler name="MustUnderstandValidationDispatcher"
                     class="org.apache.axis2.jaxws.dispatchers.MustUnderstandValidationDispatcher"/>
        </phase>
        <phase name="RMPhase"/>
        <!--  System predefined phases       -->
        <!--   After Postdispatch phase module author or service author can add any phase he want      -->
        <phase name="OperationInPhase">
            <handler name="MustUnderstandChecker"
                     class="org.apache.axis2.jaxws.dispatchers.MustUnderstandChecker">
                <order phase="OperationInPhase"/>
            </handler>
        </phase>
        <phase name="soapmonitorPhase"/>
        <phase name="HeaderPhase">
            <handler name="HeaderHandler"
                     class="ve.com.ws.handler.HeaderHandler">
                <order phase="HeaderPhase"/>
            </handler>
        </phase>
    </phaseOrder>

Este artículo Handler and Phase in Apache Axis2 por Deepal Jayasinghe (http://www.packtpub.com/article/handler-and-phase-in-apache-axis) explica como es los de las fases (phase) y handlers de Axis2.

5. Modificar el esqueleto del servicio para que lea los encabezados.
Finalmente podemos leer los encabezados en el servicio. Edite la clase Skeleton que generó Eclipse para obtener los encabezados desde el MessageContext:

package org.example.www.ws;

import org.apache.axis2.context.MessageContext;

public class WsSkeleton {
	public org.example.www.ws.CatalogLookupResponse CatalogLookup(
			org.example.www.ws.CatalogLookup cl) {
		// lee los encabezados
		MessageContext mc = MessageContext.getCurrentMessageContext();
		String channel = (String) mc.getProperty("Channel");
		String username = (String) mc.getProperty("Username");
		String messageId = (String) mc.getProperty("messageID");
		System.out.println("Canal del encabezado: " + channel);
		System.out.println("Username del encabezado: " + username);
		System.out.println("messageId del encabezado: " + messageId);
		
		// imprime los valores que normalmente vienen en el cuerpo
		// es decir los parámetros normales
		System.out.println(cl.getChannel());
		System.out.println(cl.getStatus().getValue());
		
		// Crea una respuesta y la envía al cliente
		CatalogLookupResponse clr = new CatalogLookupResponse();
		ItemType[] items = new ItemType[1];
		ItemType i = new ItemType();
		i.setBackgroundImage("as");
		i.setCategoryCode(34);
		i.setCategoryName("asd");
		i.setCategorySubSystem("asdf");
		i.setChannel("cha");
		i.setDisabled(Disabled_type1.value2);
		i.setExternalSystemId("extsis");
		i.setImage("img");
		i.setPrizePoints(1234);
		i.setProductCode(43);
		i.setShortDescription("short!");
		i.setType("typ");
		items[0] = i;
		clr.setItem(items);
		return clr;
	}

}

Este método para pasar los parámetros lo aprendí gracias a la respuesta de Nelson Minar a la pregunta How do I pass data from Handler to the service? que hizo Konstantinos Margaritis (http://www.mail-archive.com/axis-user@xml.apache.org/msg20035.html) en la lista axis-user http://ws.apache.org/axis/mail.html.

6. Conclusión
Es enredado leer los encabezados en Axis2 cuando usamos el esqueleto que genera la herramienta WSDL2Java o el Eclipse. Esto es así porque esa herramienta pretende ocultar las complicaciones de SOAP al programador que la utilice. Pero una vez configurado el handler podemos leero todos los encabezados y pasarlos a la clase que implementa el servicio.