最近のやつ

As usual, a lot of interesting things are going  in The Internet, here are some that caught my attention:

1) Mozilla Persona

A better way to sign in.

It can be used to implement SSO (Single-Sign-On), in someway it is similar to OpenID.
The identity provider is not notified, which is very good for privacy.
It is focused on the browser (built on the BrowserID protocol)
Take a look https://persona.org/

_________________________

2) IDEs in the Cloud

Many things are moving to the Cloud, and IDEs are not the exception.
Cloud9 the IDE (not the restaurant with tasty food) is a popular one.

This link lists more options.
http://www.hongkiat.com/blog/cloud-ide-developers/

_________________________

3) Visual Regular Expressions

Chances are that you know the saying

Some people, when confronted with a problem, think “I know, I’ll use regular expressions.” Now they have two problems.
Attributed to jwz.

Well, that is less true with Debuggex, a pretty cool tool to visualize JavaScipt, PCRE and Python regular expressions. Debuggex eases the problem of using regular expressions. It integrates Mozilla’s Persona and embedding in StackOverflow.

RegexPlanet is another good option but isn’t possible to visualize regex…

One thing I would like to see:   Debuggex is  open-source instead of  Debuggex is not open-source

http://www.debuggex.com/libraries

Check it out
http://www.debuggex.com/

_________________________

4) FreeBSD in the PlayStation 4

Seems like the PlayStation 4 will be running Orbis OS, a modified version of FreeBSD.

http://www.phoronix.com/scan.php?page=news_item&px=MTM5NDI

_________________________

5) Synchronization via procrastination

The article Structured Deferral: Synchronization via Procrastination overviews how to maintain data synchronized using a lazy approach.
It compares reference counting, hazard pointers…


http://queue.acm.org/detail.cfm?id=2488549

Recommended article

_________________________

6) On Java garbage collection

Article explaining the G1 Garbage Collector.
http://www.infoq.com/articles/G1-One-Garbage-Collector-To-Rule-Them-All

_________________________

7) Serval Project

Serval Project brings Open telecommunications using mesh networking.

These are the features that make it interesting:
1) Opertaes in normal phones (there is an app for Android)
2) The nodes keep the phone number
3) All calls are end-to-end encrypted

This has wide range of use cases, e.g., using cell phones in over-crowded places, communicating during disaster, freely communication during civil resistance, communicating with friends without using carrier’s networks…

An article in MIT Technology Review

A related TED’s talk video

The project page in indiegogo

Open Garden is a similar project that is worth looking

http://www.servalproject.org/

_________________________

8) The Process of Innovation

A software guy named James Gosling (not a Senior Consultant, not a Principal Engineer, not a Dr, just a plain Software Guy) talks in Standford’s Computers Systems Colloquium about the process of innovation. Among other interesting facts and anecdotes he talks about:

  • The cost of risk. For a company, going into a research project is a risk because, research project takes time (time is money, and researchers are not cheap), and there are big chances that the research couldn’t be capitalized.
    So, from the risk point of view, it is safer/better to acquire a company that has already developed a product as result of a research project. This is also better from the accounting point of view, even if the price to pay is high, the company’s is not exactly spending money but just changing the form of an asset, as opposed to literally spend money in a research project until it becomes profitable, if someday turns out to become profitable. For companies is better to buy instead of develop. Around 20′
  • He compares the ‘success rate of R&D projects’ in IBM with 1%-5% considering more than 3% highly productive, and Sun with 10% – 20%. The fact that Sun’s outperformed IBM might be due to the fact that almost every manager at Sun had a technical/engineering background. Around 30′
  • How to do technology transfer? Create something new, killing the old…or transform the old into something new

http://www.youtube.com/watch?v=rN3FZKTgdR0

_________________________

9) A different approach to schedule public transportation

Self-Organization Leads to Supraoptimal Performance in Public Transportation Systems

This interesting and not conventional paper, argues that self-scheduling public transportation is more efficient than the typical approach where vehicles come at regular intervals.

Take a look
http://www.plosone.org/article/info%3Adoi%2F10.1371%2Fjournal.pone.0021469

Advertisements

Object Oriented Concepts

Object Oriented Concepts
-Inheritance
-Encapsulation
-Polymorphism
-Open recursion
-Messages
-Aggregation (has), composition (is part of)
-Low coupling, high cohesion
-Component: Class, module…

Object Oriented Design Principles
-Single Responsibility
-Open-Closed
-Liskov substitution
-Inversion of Control

API Design

Exception handling

_

 

Cliente EJB 3.0 con Spring

1. Configuramos el proyecto, pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.wordpress.modprobe</groupId>
  <artifactId>hello-client</artifactId>
  <version>1.0-SNAPSHOT</version>
  <name>hello-client</name>
  <description>Hello client, hello world using spring and ejb 3.0</description>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>

  <dependencies>
  	<dependency>
	   <groupId>org.springframework</groupId>
	   <artifactId>spring</artifactId>
	   <version>2.5.6</version>
	</dependency>	
	<dependency>
	   	<groupId>org.apache.openejb</groupId>
	   	<artifactId>openejb-client</artifactId>
	   	<version>3.0</version>	   	
	</dependency> 
	<dependency>
		 <groupId>com.wordpress.modprobe</groupId>
		 <artifactId>hello-ejb</artifactId>
		 <version>0.0.1-SNAPSHOT</version>
	</dependency>

  </dependencies>

  <build>
    <plugins>
      <plugin>
        <groupId>org.codehaus.mojo</groupId>
        <artifactId>exec-maven-plugin</artifactId>
        <executions>
          <execution>
            <goals>
              <goal>java</goal>
            </goals>
          </execution>
        </executions>
        <configuration>
          <mainClass>com.wordpress.modprobe.Main</mainClass>
        </configuration>
      </plugin>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>2.3.2</version>
        <configuration>
          <source>1.6</source>
          <target>1.6</target>
          <encoding>UTF-8</encoding>
        </configuration>
      </plugin>

      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-jar-plugin</artifactId>
        <configuration>
          <archive>
            <manifest>
              <addClasspath>true</addClasspath>
              <mainClass>com.wordpress.modprobe.Main</mainClass>
            </manifest>
          </archive>
        </configuration>
      </plugin>

    </plugins>

  </build>

</project>

 

2. Escribimos el cliente

package com.wordpress.modprobe.client;

import com.wordpress.modprobe.ejb.HelloService;

public class HelloSpringClient {

	public HelloSpringClient(){}

	private HelloService service;

	public void setService(HelloService service) {
		this.service = service;
	}

	public String sayHello(String name){
		String retVal = service.hello(name);
		return retVal;
	}

}

3. Creamos el archivo de configuración para Spring

<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:jee="http://www.springframework.org/schema/jee"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
         http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
         http://www.springframework.org/schema/jee
         http://www.springframework.org/schema/jee/spring-jee-2.5.xsd">

    <jee:jndi-lookup id="helloService" jndi-name="HelloServiceBeanRemote">
         <jee:environment>
             java.naming.factory.initial=org.apache.openejb.client.RemoteInitialContextFactory
             java.naming.provider.url=ejbd://localhost:4201
         </jee:environment>
    </jee:jndi-lookup>

    <bean id="client" class="com.wordpress.modprobe.client.HelloSpringClient" scope="singleton">
    	<property name="service" ref="helloService" />        		
    </bean>

</beans>

4. Crear la clase main

package com.wordpress.modprobe;

import java.io.Console;

import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.core.io.ClassPathResource;

import com.wordpress.modprobe.client.HelloSpringClient;

public class Main {

	public static void main(String[] args){										
		BeanFactory springFactory = new XmlBeanFactory(new ClassPathResource("application-Context.xml"));
		HelloSpringClient client = (HelloSpringClient)springFactory.getBean("client");

		System.out.println();
		System.out.print("Pon tu nombre: ");
		Console console = System.console();
		String readLine = console.readLine();

		String response = client.sayHello(readLine);

		System.out.println("EJB dice: "+response);

	}

}

5. Correr el ejecutable mvn exec:java
https://modprobe.files.wordpress.com/2010/11/hello_ejb3-0_spring_openrjb-zip.docx

Hello – world EJB 3.0

Ejemplo muy sencillo de EJB 3.0 usando un bean de sesión stateless

 1. Bajamos OpenEJB 3.0 

 2. Escribimos la interfaz remota.

package info.modprobe.ejb;

import javax.ejb.Remote;

@Remote
public interface HelloService{

	String hello(String arg);
}

 3. Escibimos el bean

package info.modprobe.ejb;

import javax.ejb.Stateless;

@Stateless
public class HelloServiceBean implements HelloService {

	public String hello(String arg) {
		return "hola "+arg;
	}

}

 4. Creamos un jar, bueno, que lo haga maven…mvn package….veamos el pom.xml

  4.0.0

  info.modprobe
  hello-ejb
  0.0.1-SNAPSHOT
  ejb

  hello-ejb JEE5 EJB
  http://modprobe.info/2010/11/28/hello-world-ejb-3-0

      javaee
      javaee-api
      5
      provided

      junit
      junit
      3.8.1
      test

     <!-- for javaee:javaee-api -->
      java.net
      java.net
      http://download.java.net/maven/2/

        org.apache.maven.plugins
        maven-compiler-plugin
        2.0.2

          1.5
          1.5

        org.apache.maven.plugins
        maven-ejb-plugin
        2.1

          3.0

    hello-ejb

 5. Deployamos el jar, agregando lo siguiente casi al final del archivo openejb.xml

/home/fal/Desktop/openejb/workspace/hello-ejb/target/hello-ejb.jar

 6.Verificamos el log…….se deb ver algo como en openejb.log

2010-01-14 19:05:15,249 - INFO  - Deployed Application(path=/home/fal/Desktop/openejb/workspace/hello-ejb/target/hello-ejb.jar)



https://modprobe.files.wordpress.com/2010/11/hello_ejb3-0_spring_openrjb-zip.docx

Clustering WebLogic 9.x


Increase your Java EE app’s robustness using apache httpd and weblogic 9.x

1. Clone the server you want to cluster

2. Create the cluster

Choose round-robbin as algorithm

Session replication NONE

3. Add DS and stuff to recently created cluster, the same stuff that had the original server

4. Modify weblogic.conf
e.g.

WebLogicHost localhost WebLogicPort 7001
for
WeblogicCluster localhost:7011,localhost:7012

AMQP y JMS

AMQP son las siglas para Advanced Message Queuing Protocol.

Este es un protocolo de la capa de aplicación. Osea de nivel 7 en el modelo de referencia OSI, está al nivel de HTTP, DHCP, SSH, etc.

Considero que realmente hacia falta un protocolo para esto, ya que hasta el momento cada cual le hacía como le daba la gana, sin tener ningún estándar, lo que amarra a las aplicaciones que usan servicios de mensajería en la capa de middleware. Es cierto, es cierto, ya existía JMS pero JMS aunque sí es una especificación, es más bien una especificación de una API más que de un protocolo.

¿Qué tiene de malo que los sistemas estén casados con cierta implementación de servicios de mensajería?

Que esos sistemas carecen de interoperabilidad, no podría interactuar con otros sistemas (al menos no sería para nada sencillo).

La gran ventaja de AMQP es que permite interoperabilidad entre diferentes sistemas, cada vez es más necesario, y me sorprende que antes no haya existido un estándar para los servicios de mensajería. Qué güeva si para navegar en sitios web hosteados en Apache sólo pudiera hacerlo desde Firefox, y para los hostados en IIS fuera de fuerzas IE, para los hosteados en Cherokee sólo se pudiera con Opera, y así…Pues esto es más o menos lo que sucedía o mejor dicho sucede con el middleware.

Hay que tener claro que JMS y AMQP son cosas diferentes, sin embargo se puede usar AMQP mediante JMS.

JMS es unicamente para Java, AMQP es independiente del lenguaje, y de la implementación (al menos debería de serlo).

¿Qué especifica AMQP?

Los mensajes, las colas, el ruteo de los mensajes, y la seguridad.

¿Cúales son los principales elementos de AMQP?

  • Broker: El servidor.
  • Colas: Lugares para poner y de donde consumir mensajes.
  • Clientes: Entes que producen y/o consumen mensajes.
  • Exchanges: Espacios. Una analogía con discos duros: las colas serían el disco duro y los exchanges particiones.
    • Directo: Un productor pone mensajes, un consumidor los consume.
    • Tema: Los consumidores y/o productores están suscritos a temas.
    • Fanout: Permite relaciones uno a muchos.

¿Qué opciones hay?

Varias, las que he usado son: Qpid y RabbitMQ.

Ambas son buenas.

Qpid: Al principo se esperaba que ActiveMQ soportara AMQP, ahora es independiente, lo bueno es que tiene soporte muy completo para JMS.

RabbitMQ: Aunque tiene API para clientes en Java no me agrada, el soporte para JMS no luce completo; lo bueno: el broker implementado en erlang, fácil administración, buena arquitectura. Si el soporte para JMS no es muy importante recomiendo esta opción. Recientemente comprada por Spring.

HornetQ: Implementación de JBoss, soporta JMS como AMQP. Estará incluida como JMS broker por default en JBoss AS.

¿Cómo empezar con AMQP?

Levantar un broker, usar clientes.

Así nada más. Después de levantar el broker no empezaba con los clientes porque buscaba configurar las colas, exchanges, etc en el broker, busacaba y buscaba pero no encontraba archivos de configuración. Y es que no son necesarios, las colas y los exchanges se crean programaticamente, es decir son creados por los clientes.

¿Si las colas y exchanges son creados por los clientes que pasa si algo le sucede al broker?

Está definido por AMQP, hay diferentes escenarios, esto se define al momento que se crean. Pueden o no persistir a reinicios del broker.

Algunos links que pueden ser de utilidad:

http://www.amqp.org

http://en.wikipedia.org/wiki/Advanced_Message_Queuing_Protocol

http://crad.tumblr.com/post/196979154/the-attention-deficit-disorder-guide-to-rabbitmq