Translate

martes, 21 de julio de 2009

POO = Herencia

Cuando pensamos en POO siempre caemos en que cuanto más usemos herencia más orientado objeto esta. Y claramente no es así. Es decir si tenemos este pensamiento estamos comenzando con el pie izquierdo; estamos pensando en "programación orientada a clases". Claro estamos generalizando de ante mano.

Lo ideal (que no quiere decir que en el día a día lo haga) es imaginar el problema con solo objetos. Una representación del problema; como una simulación. Sin interesarnos en clases, datos, etc.

Luego que ya entendimos el problema; pensamos como se comportan los objetos. Hay objetos que se comportan similar y los podemos generalizar entonces tenemos nuestra clase!!!

Hora tenemos un conjunto de clases y vemos que algunas tienen el mismo comportamiento, entonces podemos generalizar en una clase padre.

Claro esta que esto en teoría es muy fácil, el problema es la práctica. Veamos un problema aparentemente fácil, una academia donde tenemos alumnos y profesores. Fácil no? Una clase persona de la cual heredan la clase Alumno y Profesor. Muy fácil !!!

Momento ... y si un alumno también es profesor. Mmm... NO era tan fácil.

Con el modelo presentado hacemos agua, donde estuvo el error el primer paso, NO ENTENDIMOS EL PROBLEMA!!!

Lo escrito no es un descubrimiento filosófico ni un pensamiento que va a cambiar tu vida profesional. Simplemente una reflexión y recordatorio, antes de pensar en herencia y clases; pensemos: ¿entiendo el problema?



Liks de Web services

Mis próximas lecturas sobre web services van a ser las siguientes:

Primero infoq (hace bastante) saco una comparativa sobre web services open source en java este es el link:

http://www.infoq.com/articles/os-ws-stacks-background

Comparativa entre cxf, axis 2, Metro, Spring WS; ventajas y desventajas de cada uno de los frameworks.

Segundo; cortito y al pie una lista de buenas prácticas a la hora de desarrollar web services; dejo el link:

http://jcesarperez.blogspot.com/2009/06/buenas-practicas-para-desarrollar.html

Muy buena info a la hora de desarrollar web services.



viernes, 17 de julio de 2009

Platon sera programador ??

Platon creía que antes de reencarnarse todas las almas beben agua del río Ameles olvidando de este modo su vida anterior, y reinician el proceso de purificación hasta su retorno al mundo de las Ideas. De esta forma nosotros traíamos conocimiento a este mundo pero olvidado. Por lo tanto el proceso de aprendizaje era recordar lo que sabíamos.

Aristoteles lejos de coincidir con Platon creía que el conocimiento era enteramente construido en este mundo. Es decir que adquiríamos todo el conocimiento.

Piaget nació unos cuantos siglos después y puso luz al asunto diciendo que hay conocimiento que aprendemos y otras habilidades la traemos con nosotros y a medida que la usamos, las pulimos, las intensificamos.

Sin duda la teoría de Piaget es la que creo más cerca de la verdad. Y la vivo que es peor ya que por más que lo intente no creo tener habilidad para ciertos deportes (casi todos).

¿Que piensan la capacidad de resolver un problema computacional es adquirido? ¿Todos tenemos la habilidad de programar en java, php, u otro lenguaje? ¿Programador se nace o hace?
Les dejo estas dudas existenciales.

Blogs Amigos

Esta entrada es para invitarlos a mirar, leer y aportar a dos blogs:

El primero a presentar es el de un compañero y amigo Diego Graf es lo mas abarcativo posible para despertar el interés de todos y que el blog sea material de consulta y de lectura de temas de actualidad. http://diegograf.blogspot.com/

El otro es un blog social de otro compañero Marino Testaseca (espero haber escrito bien el apellido), Blog de cultura, reflexión y pensamientos (que no todo es tecnología). http://muchosmundosenuno.blogspot.com/

Muy buenos blogs!!!

Además los voy a agregar como blogs amigos.



jueves, 16 de julio de 2009

IOKE

Ioke es un lenguaje que mezcla la programación funcional con la orientada a objeto (similar a scala)
Pero Ioke es un desconocido, no se bien porque. Pero esta muy bueno el lenguaje y lo mejor de todo corre sobre jvm de java.

Les dejo la url de la wiki : http://ioke.org/wiki/index.php/Guide

Libros

Gente encontre este link con libros muy bueno!!!

ECMAScript for XML (E4X)

Bueno, Me encontraba leyendo un manual de actionscript y decía que implementa E4X, si , si , soy informático y me encantan las siglas pero que es E4X? Leyendo http://en.wikipedia.org/wiki/ECMAScript_for_XML supe que es un lenguaje que permite que un archivo xml sea soportado como un tipo más del lenguaje.

ActionScript implementa este lenguaje y permite hacer cosas como estas:

Crear un xml:

var empleado:XML = <empleado> </empleado>;
empleado.nombre = "Pedro";
empleado.apellido = "Godoy";
empleado.@id = 234;

var otroEmpleado:XML = <empleado> </empleado>;
otroEmpleado.nombre = "Andres";
otroEmpleado.apellido = "Godoy";
otroEmpleado.@id = 224;

var empleados:XML = <empleados> </empleados>;;
empleados.appendChild(empleado);
empleados.appendChild(otroEmpleado);

ejemploText.text = empleados.toXMLString();

Y la salida va a ser esto:

<empleados>
<empleado id="234">
<nombre>Pedro</nombre>
<apellido>Godoy</apellido>
</empleado>
<empleado id="224">
<nombre>Andres</nombre>
<apellido>Godoy</apellido>
</empleado>
</empleados>

Para recorrer un xml se podria hacer algo así:

var orden:XML =
<order>
<item id='1'>
<menuName>burger</menuName>
<price>3.95</price>
</item>
<item id='2'>
<menuName>fries</menuName>
<price>1.45</price>
</item>
</order>;
ejemploText.text = "Imprime el precio del item 1 \n";
ejemploText.text += orden.item.(@id == 1).price;
ejemploText.text += " \n \n ";
ejemploText.text += "Imprime los items id < 3 \n"; ejemploText.text += orden.item.(@id < 3).toXMLString();

Como ven el @ permite acceder a los atributos de un tag y con el . puedo acceder a elementos del xml.

Que Grande E4X !!!!!!

miércoles, 15 de julio de 2009

Apache Camel

Encontre estos tutoriales de apache camel: http://www.tecsisa.com/index.igw?item=1631

Muy bueno!!!


Apache Camel es una implementación de los patrones para integración empresarial descritos en el libro Enterprise Integration Patterns de Gregor Hohpe y Bobby Woolf hecha en Spring.
Estos patrones de diseño permiten integrar sistemas heterogéneos usando sistemas de Mensajería. Actualmente Apache Camel soporta un gran número de transportes de mensajería, como JMS, ActiveMQ, CXF Bus, JBI e incluso HTTP simple.

Anuncios Google

Gente Linda, me dieron una cuenta de AdSense, así que si presionan sobre los link de publicidad google va a compartir conmigo su riqueza. Por lo tanto no voy a tener que trabajar tanto y entonces voy a tener más Tiempo; y voy a poder agregar más entradas al Blog.

Además agrege un boton para donar plata, dolares o cualquier cosa que quieran donar.

Quiero expresar mi agradecimiento a todos los que me ayudaron en el Blog.


lunes, 13 de julio de 2009

Que es ORM ?

Mapeo Objeto Relacional (ORM) ,en otras palabras persistir los objetos Java en una base de datos relacional ha tenido su mayor cambio recientemente, gracias, en parte a la proliferación de métodos
avanzados que intentan hacer esta tarea mas fácil .
Entre estas tecnologías están los Entity Beans 2.x , TopLink , Hibernate , JDO , y también JDBC con DAO. Con muchas alternativas incompatibles , el grupo Java EE experto toma inspiración de estos frameworks
populares y creo el api de persistencia de Java (JPA) , el cual se puede usar desde aplicaciones Java EE o SE.
En pocas palabras JPA , usa el modelo de programación POJO para la persistencia. A pesar de que este modelo esta incluido en la especificación EJB 3 , JPA puede ser usado fuera de un contenedor
EJB , y esta es la forma que será usada en este articulo . “Plain Old Java Objects” ( POJO ) ejecutándose en una aplicación Java SE.

Como trabaja JPA ?
Inspirado en los frameworks como Hibernate , JPA usa anotaciones para mapear objetos a la base de datos relacional. Estos objetos , usualmente llamados entidades, no tienen nada en común con los Entity Beans 2.x . Las entidades JPA son clases
POJOs, no extienden de ninguna clase y no implementan ninguna interface.
Usted no necesita archivos descriptores XML para hacer los mapeos . Si uno se fija en el API ( java doc ) uno observara que esta compuesto de pocas clases e interfaces.
La mayoría del contenido de el paquete javax.persitence son anotaciones. Con esto explicado , veremos el siguiente ejemplo de código:

@Entity
public class Customer {
@Id
private Long id;
private String firstname;
private String lastname;
private String telephone;
private String email;
private Integer age;
// constuctors, getters,
setters
}

35 sitios para descargar plantillas css

El web master publico un articulo en el que muestra 35 sitios para

descargar.

A disfrutar!!!

http://www.elwebmaster.com/articulos/35-sitios-destacados-para-descargar-plantillas-css-gratuitas

jueves, 9 de julio de 2009

¿ Como Configurar virtual host con Tomcat ?

Para configurar virtual host en Tomcat es muy fácil tenemos que seguir
los siguientes pasos:


Ir a el archivo server.xml ($CATALINA_HOME/conf/ ) y agregar los host
(en el ejemplo vamos a configurar prueba1.com y prueba2.com)










server.xml
original



Nuevo
server.xml



<Host
name="localhost" appBase="webapps"


unpackWARs="true"
autoDeploy="true"


xmlValidation="false"
xmlNamespaceAware

="false">








</Host>



<Host
name="prueba1.com" appBase="webapps"


unpackWARs="true"
autoDeploy="true"


xmlValidation="false"
xmlNamespaceAware="false">


</Host>





<Host
name="prueba2.com" appBase="otroWebapps"


unpackWARs="true"
autoDeploy="true"


xmlValidation="false"
xmlNamespaceAware

="false">


</Host>



Podemos ver que en prueba1.com se van a encontrar las aplicaciones
desplegadas en webapps y en prueba2.com las de otroWebapps.


Para poder probar su correcto funcionamiento agregamos la siguiente
entrada a /etc/host





127.0.0.1 localhost
prueba1.com prueba2.com

Para que tome las url, luego reinicie el servidor.





./etc/init.d/tomcat6
restart


Al ingresar a http://prueba1.com:8080 vera las aplicaciones deplogeadas en webapps y al ir http://prueba2.com:8080 las de otroWebapps.



¿ Como Configuración de Realms ?


En Apache Tomcat no existe el concepto htaccess como se entiende en Apache. Para obtener este comportamiento se deben configurar realms.

Un realm es una “base de datos” de usuarios y passwords que nos sirve para implementar un mecanismo de autenticación para
aplicaciones Web. Se puede pensar en roles similar a
grupos
de unix/linux, y se puede dar permisos de acceso a un recurso a un grupo.

En muchos casos es deseable que se autentique con mecanismos ya implementados dentro de una aplicación. Para esto Apache tomcat define una serie interfaces java que se encuentran en el paquete

org.apache.catalina.Realm; se puede implementar “plug in” para establecer esta conexión.
Tomcat provee 5 formas estándares para autenticación:


JDBCRealm:
Autenticación contra una base de datos relacional usando driver jdbc.





<Realm className="org.apache.catalina.realm.JDBCRealm" 
debug="99"
driverName="org.gjt.mm.mysql.Driver"
connectionURL="jdbc:mysql://localhost/authority? user=dbuser&amp;password=dbpass"
userTable="users"
userNameCol="user_name"
userCredCol="user_pass"
userRoleTable="user_roles" roleNameCol="role_name"/>

Para el ejemplo se debe tener las siguientes tablas en la base de datos:




create table users (
user_name varchar(15) not null primary key,
user_pass varchar(15) not null
);

create table user_roles (
user_name varchar(15) not null,
role_name varchar(15) not null,
primary key (user_name, role_name)
);


DataSourceRealm:
Autenticación contra una base de datos relacional, accedida vía un
nombre JNDI JDBC DataSource.





<Realm className="org.apache.catalina.realm.DataSourceRealm" 
debug="99"
dataSourceName="jdbc/authority"
userTable="users"
userNameCol="user_name"
userCredCol="user_pass"
userRoleTable="user_roles" roleNameCol="role_name"/>

Para el ejemplo se debe tener las siguientes tablas en la base de datos:


create table users (
user_name varchar(15) not null primary key,
user_pass varchar(15) not null
);

create table user_roles (
user_name varchar(15) not null,
role_name varchar(15) not null,
primary key (user_name, role_name)
);

JNDIRealm:
Autenticación contra una base de datos LDAP, accedida vía un nombre JNDI provider.



<Realm className="org.apache.catalina.realm.JNDIRealm" debug="99"
connectionURL="ldap://localhost:389"
userPattern="uid={0},ou=people,dc=mycompany,dc=com"
roleBase="ou=groups,dc=mycompany,dc=com"
roleName="cn"
roleSearch="(uniqueMember={0})"
/>


Para el ejemplo se debe tener las siguientes estructura en el ldap:




# Define top-level entry
dn: dc=mycompany,dc=com
objectClass: dcObject
dc:mycompany

# Define an entry to contain people
# searches for users are based on this entry
dn: ou=people,dc=mycompany,dc=com
objectClass: organizationalUnit
ou: people

# Define a user entry for Janet Jones
dn: uid=jjones,ou=people,dc=mycompany,dc=com
objectClass: inetOrgPerson
uid: jjones
sn: jones
cn: janet jones
mail: j.jones@mycompany.com
userPassword: janet

# Define a user entry for Fred Bloggs
dn: uid=fbloggs,ou=people,dc=mycompany,dc=com
objectClass: inetOrgPerson
uid: fbloggs
sn: bloggs
cn: fred bloggs
mail: f.bloggs@mycompany.com
userPassword: fred

# Define an entry to contain LDAP groups
# searches for roles are based on this entry
dn: ou=groups,dc=mycompany,dc=com
objectClass: organizationalUnit
ou: groups

# Define an entry for the "tomcat" role
dn: cn=tomcat,ou=groups,dc=mycompany,dc=com
objectClass: groupOfUniqueNames
cn: tomcat
uniqueMember: uid=jjones,ou=people,dc=mycompany,dc=com
uniqueMember: uid=fbloggs,ou=people,dc=mycompany,dc=com

# Define an entry for the "role1" role
dn: cn=role1,ou=groups,dc=mycompany,dc=com
objectClass: groupOfUniqueNames
cn: role1
uniqueMember: uid=fbloggs,ou=people,dc=mycompany,dc=com

MemoryRealm:

Autenticación contra una colección de objetos user que se
encuentran en memoria estos usuarios se cargan al iniciar el servidor del archivo conf/tomcat-users.xml




<Realm className="org.apache.catalina.realm.MemoryRealm"
pathname="$CATALINA_HOME/conf/tomcat-users.xml"
/>


Para el ejemplo se debe agregar los usuarios a $CATALINA_HOME/conf/tomcat-users.xml




<tomcat-users>
<user name="tomcat" password="tomcat" roles="tomcat" />
<user name="role1" password="tomcat" roles="role1" />
<user name="both" password="tomcat" roles="tomcat,role1" />
</tomcat-users>

JAASRealm:
Autenticación usando Java Authentication & Authorization
Service (JAAS) framework.






<Realm className="org.apache.catalina.realm.JAASRealm"                 
appName="MyFooRealm"
userClassNames="org.foobar.realm.FooUser"
roleClassNames="org.foobar.realm.FooRole"
debug="99" />


Pero también es posible escribir nuestras propias implementaciones y integrarlas con tomcat, para esto necesitaremos:

  • Implementar org.apache.catalina.Realm.


  • Agregar el jar en $CATALINA_HOME/lib


  • Declarar el realm.


  • Declarar el realm en el Mbeans Descriptor.


Luego
de entender como el funcionamiento de los Reamls vamos a explicar como se configuran:


Se debe agregar el tag Realm





<Realm
className="... clase que implementa
org.apache.catalina.Realm"


...
otros atributos.../>



El elemento Realm puede estar contenido en los siguientes elementos:

  • Dentro de un elemento <Engine>:
    Este elemento es compartido por todos los virtual host
    y
    todas las aplicaciones web. Se puede pisar con los realms
    configurados en
    <Host>
    o
    <Context>.


  • Dentro de un elemento <Host>:
    Este elemento es por virtual host y todas las aplicaciones web que se encuentran en el mismo. Se puede pisar con los realms configurados en
    <Context>.


  • Dentro de un elemento <Context>:
    Este elemento es por aplicación web.




¿ Como desplegar aplicaciones web en Tomcat ?

Para

desplegar aplicación web en Tomcat solo se debe parar el servidor:


Para
distribuciones debian en las que se instalo tomcat:







invoke-rc.d
tomcat6 stop



Para cualquier distribución que se allá instalado tomcat:





./etc/init.d/tomcat6
stop



Paraversiones descomprimidas:







./$CATALINA_HOME/bin/shudown.sh







Mover
la aplicación al directorio configurado en context que se usara para el despliegue. Por ejemplo se desplegara una aplicación llamada myaplicacion al directorio webapps





mv myaplicacion.war $CATALINA_HOME/webapps


Donde $CATALINA_HOME contiene el path donde se instalo el tomcat.

Levantar tomcat:


Para distribuciones debian en las que se instalo tomcat:





invoke-rc.d
tomcat6 start

Para cualquier distribución que se allá instalado tomcat:




./etc/init.d/tomcat6
start





Para versiones descomprimidas:




./$CATALINA_HOME/bin/start.sh


De esta forma la url donde se desplegara la aplicación sera

http://localhost:8080/myaplicacion/


Muchas veces deseamos desplegar aplicaciones de forma que la URL para acceder sea http://host para esto lo
primero que hay que hacer es configurar el tomcat para que escuche el puerto 80. Cambiando el atributo port a 80 del tag Connector del archivo server.xml.




<Connector
port=”80” ...


Luego desplegar la aplicación pero cambiando el nombre del war a ROOT.war



mv myaplicacion.war $CATALINA_HOME/webapps/ROOT.war


Si se encuentra la carpeta ROOT cambiarle el nombre o borrarlo. En el ejemplo cambiamos el nombre.






mv ROOT ROOT_


Levantar el tomcat y listo!