<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-8262702061329066701</id><updated>2012-02-16T20:37:22.190-03:00</updated><category term='linux'/><category term='javafx'/><category term='Lean'/><category term='encuesta'/><category term='procesos'/><category term='jna'/><category term='administracion'/><category term='Arquitectura'/><category term='perceptron'/><category term='ingeniería'/><category term='junit'/><category term='chatbots'/><category term='hudson'/><category term='netbeans 6.5'/><category term='Java'/><category term='calidad'/><category term='eliza'/><category term='lenguajes'/><category term='netbeans'/><category term='c'/><category term='Swing'/><category term='test'/><category term='Drop'/><category term='job'/><category term='acceso nativo'/><category term='instalacion'/><category term='Drag'/><category term='scrum'/><category term='python'/><category term='metologia'/><category term='software'/><category term='red neuronal'/><category term='mac'/><category term='sun'/><category term='windows'/><category term='inteligencia artificial'/><category term='tdd'/><category term='integracion continua'/><category term='metricas'/><category term='c++'/><category term='metología'/><category term='Fest'/><category term='svn'/><category term='subversion'/><category term='agil'/><category term='google'/><category term='FileDrop'/><title type='text'>Ale Vouilloz</title><subtitle type='html'>Blog sobre tecnología y programación.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://alevouilloz.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8262702061329066701/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://alevouilloz.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Ale Vouilloz</name><uri>http://www.blogger.com/profile/11465620039351753180</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>22</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-8262702061329066701.post-2951113288389976958</id><published>2011-08-01T15:31:00.020-03:00</published><updated>2011-08-02T11:33:13.980-03:00</updated><title type='text'>Modelando la Capa de Acceso a Datos</title><content type='html'>La finalidad de este pequeño tutorial es mostrar con un pequeño ejemplo, el uso de distintas tecnologías para modelar e implementar una Capa de Acceso a Datos en la plataforma Java. Los frameworks usados serán los siguientes:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;- Spring (IoC):&lt;/span&gt; Usaremos la Inversión de Control de éste framework general para configurar por inyección de dependencias las clases a utilizar ganando así flexibidad. También usaremos de él, algunas clases de apoyo útiles para los test de JUnit.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;- JPA (Java Persistence Api):&lt;/span&gt; Estándar para la persistencia de objetos en Java.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;- EclipseLink:&lt;/span&gt; Motor ORM que usaremos como proveedor JPA. Gracias a Spring podemos reemplazar EclipseLink por otro ORM como Hibernate o OpenJPA fácilmente.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;- JUnit:&lt;/span&gt; Framework para crear test unitarios.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;- DBUnit:&lt;/span&gt; Librería de utilidades para escribir test con Base de Datos.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;- HSQL-DB:&lt;/span&gt; Motor de Base de Datos en memoria, muy útil para los test.&lt;br /&gt;&lt;br /&gt;&lt;a href="https://sites.google.com/site/alevouilloz/Home/EjemploAccesoDatos.zip?attredirects=0&amp;d=1"&gt;El código fuente&lt;/a&gt; se encuentra en un proyecto de Netbeans pero es muy sencillo copiar todas nuestras clases y agregar todas las librerías dependientes del directorio lib en tu IDE favorito.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;El Domino&lt;/span&gt;&lt;br /&gt;Como modelaremos sólo la capa de acceso a datos no es necesario conocer demasiado del negocio, sólo necesitamos saber que clases del domino serán las persistentes como muestra el siguiente diagrama de clases. Un empleado trabaja para un departamento y puede tener asignadas algunas tareas.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/-wg7qqGXy3U8/Tjb9X9i3wMI/AAAAAAAAAHE/38l7bsS7U_U/s1600/Class%2BDiagram1.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 316px; height: 236px;" src="http://3.bp.blogspot.com/-wg7qqGXy3U8/Tjb9X9i3wMI/AAAAAAAAAHE/38l7bsS7U_U/s320/Class%2BDiagram1.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5635970571800395970" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;De esta forma tendremos un modelo de datos con cuatro tablas. La tabla EMPLEADO, DEPARTAMENTO, TAREA y EMPLEADO_TAREA para la relación muchos a muchos entre Empleado y Tarea.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/-6DoSVghqcYk/Tjb-2HzAgyI/AAAAAAAAAHM/8x2xj70Al_M/s1600/er.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 292px; height: 320px;" src="http://1.bp.blogspot.com/-6DoSVghqcYk/Tjb-2HzAgyI/AAAAAAAAAHM/8x2xj70Al_M/s320/er.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5635972189460136738" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;La clase Departamento:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush:java"&gt;@Entity&lt;br /&gt;public class Departamento implements Serializable {&lt;br /&gt;&lt;br /&gt; @Id @GeneratedValue(strategy=GenerationType.IDENTITY)&lt;br /&gt; private long id;&lt;br /&gt;&lt;br /&gt; private String nombre;&lt;br /&gt;&lt;br /&gt; public long getId() {&lt;br /&gt;     return id;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; public void setId(long id) {&lt;br /&gt;     this.id = id;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; public String getNombre() {&lt;br /&gt;     return nombre;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; public void setNombre(String nombre) {&lt;br /&gt;     this.nombre = nombre;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; @Override&lt;br /&gt; public String toString() {&lt;br /&gt;     return "Departamento{" + "nombre=" + nombre + '}';&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;En éste caso el mapeo del nombre de la clase a la tabla se produce de forma implícita porque tienen el mismo nombre (no es case sensitive). Si la clase se llamaria con un nombre distinto al de la tabla, sería necesario hacer el mapeo del nombre explicito con la anotación @Table(name=”nombreTabla”).&lt;br /&gt;&lt;br /&gt;Tambien podemos observar que la anotación @Id seguida de @GeneratedValue, especifica que el campo sera la clave primaria y el valor sera autogenerado por la base de datos con la estrategia IDENTITY.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;La clase Tarea:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush:java"&gt;@Entity&lt;br /&gt;public class Tarea implements Serializable {&lt;br /&gt;    &lt;br /&gt;    @Id @GeneratedValue(strategy=GenerationType.IDENTITY)&lt;br /&gt;    private long id;&lt;br /&gt;    &lt;br /&gt;    private String descripcion;&lt;br /&gt;&lt;br /&gt;    public String getDescripcion() {&lt;br /&gt;        return descripcion;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public void setDescripcion(String descripcion) {&lt;br /&gt;        this.descripcion = descripcion;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public long getId() {&lt;br /&gt;        return id;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public void setId(long id) {&lt;br /&gt;        this.id = id;&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;La clase Empleado:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush:java"&gt;&lt;br /&gt;@Entity&lt;br /&gt;public class Empleado implements Serializable {&lt;br /&gt;    &lt;br /&gt;    @Id @GeneratedValue(strategy=GenerationType.IDENTITY)&lt;br /&gt;    private long id;&lt;br /&gt;    &lt;br /&gt;    private String nombre;&lt;br /&gt;    &lt;br /&gt;    private String apellido;&lt;br /&gt;    &lt;br /&gt;    @Temporal(javax.persistence.TemporalType.DATE)&lt;br /&gt;    private Date fechaNac;&lt;br /&gt;    &lt;br /&gt;    private float sueldo;&lt;br /&gt;    &lt;br /&gt;    @ManyToMany&lt;br /&gt;    @JoinTable(name="EMPLEADO_TAREA",&lt;br /&gt;            joinColumns=@JoinColumn(name="EMPLEADO_ID"),&lt;br /&gt;            inverseJoinColumns=@JoinColumn(name="TAREA_ID"))&lt;br /&gt;    private Collection&lt;Tarea&gt; tareas;&lt;br /&gt;    &lt;br /&gt;    @ManyToOne&lt;br /&gt;    @JoinColumn(name="DEPARTAMENTO_ID")&lt;br /&gt;    private Departamento departamento;&lt;br /&gt;&lt;br /&gt;    public String getApellido() {&lt;br /&gt;        return apellido;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public void setApellido(String apellido) {&lt;br /&gt;        this.apellido = apellido;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public Departamento getDepartamento() {&lt;br /&gt;        return departamento;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public void setDepartamento(Departamento departamento) {&lt;br /&gt;        this.departamento = departamento;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public Date getFechaNac() {&lt;br /&gt;        return fechaNac;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public void setFechaNac(Date fechaNac) {&lt;br /&gt;        this.fechaNac = fechaNac;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public long getId() {&lt;br /&gt;        return id;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public void setId(long id) {&lt;br /&gt;        this.id = id;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public String getNombre() {&lt;br /&gt;        return nombre;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public void setNombre(String nombre) {&lt;br /&gt;        this.nombre = nombre;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public float getSueldo() {&lt;br /&gt;        return sueldo;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public void setSueldo(float sueldo) {&lt;br /&gt;        this.sueldo = sueldo;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public Collection&lt;Tarea&gt; getTareas() {&lt;br /&gt;        return tareas;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public void setTareas(Collection&lt;Tarea&gt; tareas) {&lt;br /&gt;        this.tareas = tareas;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    @Override&lt;br /&gt;    public String toString() {&lt;br /&gt;        return "Empleado{" + "id=" + id + ", nombre=" + nombre + ", apellido="&lt;br /&gt;                + apellido + ", departamento=" + departamento + '}';&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Nótese el mapeo de las colecciones, en especial la colección tareas que representa la relación muchos a muchos con la tabla TAREA mapeada con la tabla intermedia EMPLEADO_TAREA gracias a la anotación @ManyToMany y la anotación @JoinTable&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Clases DAO&lt;/span&gt;&lt;br /&gt;Este patrón de diseño es usado como Objeto de Acceso a Datos. En nuestro ejemplo definimos su interface para acceder a los datos de la entidad Empleado:&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush:java"&gt;&lt;br /&gt;public interface EmpleadoDao {&lt;br /&gt;    &lt;br /&gt;    public Empleado buscarPorId(long id);&lt;br /&gt;    &lt;br /&gt;    public void guardar(Empleado empleado);&lt;br /&gt;    &lt;br /&gt;    public void borrar(Empleado empleado);&lt;br /&gt;    &lt;br /&gt;    public Empleado buscarPorNombre(String nombre);&lt;br /&gt;    &lt;br /&gt;    public Collection&lt;Empleado&gt; listarTodos();&lt;br /&gt;    &lt;br /&gt;    public Collection&lt;Empleado&gt; listarPorDepartamento(Departamento departamento);&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Y su implementación para JPA:&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush:java"&gt;&lt;br /&gt;@Repository&lt;br /&gt;@Transactional&lt;br /&gt;public class EmpleadoDaoJPA implements EmpleadoDao {&lt;br /&gt;    &lt;br /&gt;    @PersistenceContext&lt;br /&gt;    private EntityManager em;&lt;br /&gt;&lt;br /&gt;    @Override&lt;br /&gt;    public Empleado buscarPorId(long id) {&lt;br /&gt;        return em.find(Empleado.class, id);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    @Override&lt;br /&gt;    public void guardar(Empleado empleado) {&lt;br /&gt;        em.persist(empleado);&lt;br /&gt;        em.flush();&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    @Override&lt;br /&gt;    public void borrar(Empleado empleado) {&lt;br /&gt;        em.remove(empleado);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    @Override&lt;br /&gt;    public Empleado buscarPorNombre(String nombre) {&lt;br /&gt;        Query query = em.createQuery(&lt;br /&gt;                "SELECT e FROM Empleado e WHERE e.nombre=:nom")&lt;br /&gt;                .setParameter("nom", nombre);&lt;br /&gt;        &lt;br /&gt;        return (Empleado) query.getSingleResult();&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    @Override&lt;br /&gt;    public Collection&lt;Empleado&gt; listarTodos() {&lt;br /&gt;        Query query = em.createQuery("SELECT e FROM Empleado e");&lt;br /&gt;        &lt;br /&gt;        return query.getResultList();&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    @Override&lt;br /&gt;    public Collection&lt;Empleado&gt; listarPorDepartamento(Departamento departamento) {&lt;br /&gt;        Query query = em.createQuery(&lt;br /&gt;                "SELECT e FROM Empleado e WHERE e.departamento=:dpto")&lt;br /&gt;                .setParameter("dpto", departamento);&lt;br /&gt;        &lt;br /&gt;        return query.getResultList();&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;La anotación @Repository es una anotación Spring que indica que es una clase que deberá ser instanciada automáticamente como un Singleton.&lt;br /&gt;&lt;br /&gt;La anotación @Transactional le indica a Spring que las operaciónes de datos realizadas por JPA en esa clase serán transaccionales.&lt;br /&gt;&lt;br /&gt;La anotación @PersistenceContext inyecta un EntityManager a la variable de clase em para poder acceder a las operaciones que nos expone JPA en su api.&lt;br /&gt;&lt;br /&gt;Obsérvese además, las querys creadas en el lenguaje de consultas de JPA JPQL que nos permite consultar manteniendo las características de la orientación a objeto, tales como la herencia.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;El archivo persistence.xml&lt;/span&gt;&lt;br /&gt;&lt;pre class="brush:xml"&gt;&lt;br /&gt;&lt;?xml version="1.0" encoding="UTF-8"?&gt;&lt;br /&gt;&lt;persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"&gt;&lt;br /&gt;  &lt;persistence-unit name="IdRepositoryPU" transaction-type="RESOURCE_LOCAL"&gt;&lt;br /&gt;    &lt;provider&gt;org.eclipse.persistence.jpa.PersistenceProvider&lt;/provider&gt;&lt;br /&gt;    &lt;class&gt;alevouilloz.entity.Empleado&lt;/class&gt;&lt;br /&gt;    &lt;class&gt;alevouilloz.entity.Departamento&lt;/class&gt;&lt;br /&gt;    &lt;class&gt;alevouilloz.entity.Tarea&lt;/class&gt;&lt;br /&gt;  &lt;/persistence-unit&gt;&lt;br /&gt;&lt;/persistence&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Si buscamos dentro del paquete META-INF nos encontraremos con el archivo persistence.xml. Este archivo es la unidad de persistencia que configura JPA. Como podemos apreciar se indica el proveedor de persistencia que se usará, en nuestro caso EclipseLink. Además se enumeran las clases que deben ser mapeadas por el motor ORM. También es posible configurar aquí la fuente de conexión JDBC que se usará, pero en nuestro ejemplo lo haremos en el contexto de aplicación de Spring.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Importante:&lt;/span&gt; Al iniciarse la aplicación, la JVM por defecto buscará éste archivo dentro del paquete META-INF. &lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;El archivo applicationContext.xml:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush:xml"&gt;&lt;br /&gt;&lt;?xml version="1.0" encoding="UTF-8"?&gt;&lt;br /&gt;&lt;beans xmlns="http://www.springframework.org/schema/beans"&lt;br /&gt;       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"&lt;br /&gt;       xmlns:tx="http://www.springframework.org/schema/tx"&lt;br /&gt;       xmlns:context="http://www.springframework.org/schema/context"&lt;br /&gt;       xsi:schemaLocation="http://www.springframework.org/schema/beans&lt;br /&gt;       http://www.springframework.org/schema/beans/spring-beans-3.0.xsd&lt;br /&gt;       http://www.springframework.org/schema/tx&lt;br /&gt;       http://www.springframework.org/schema/tx/spring-tx-3.0.xsd&lt;br /&gt;       http://www.springframework.org/schema/context&lt;br /&gt;       http://www.springframework.org/schema/context/spring-context-3.0.xsd"&gt;&lt;br /&gt;        &lt;br /&gt;    &lt;!-- Le indica a Spring que scanee e instancie todos las clases anotadas como @Repository, @Component y @Service --&gt;&lt;br /&gt;    &lt;context:component-scan base-package="alevouilloz"/&gt;&lt;br /&gt;    &lt;br /&gt;    &lt;!-- Le indicamos a Spring el bean donde definimos que Administrador de Transacciones se usará--&gt;&lt;br /&gt;    &lt;tx:annotation-driven transaction-manager="transactionManager"/&gt;&lt;br /&gt;&lt;br /&gt;    &lt;!-- Fuente de datos que usaremos, en éste caso usamos la base de datos en memoria HSQL-DB --&gt;&lt;br /&gt;    &lt;bean id="HSQLDataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"&gt;&lt;br /&gt;        &lt;property name="driverClassName" value="org.hsqldb.jdbcDriver" /&gt;&lt;br /&gt;        &lt;property name="url" value="jdbc:hsqldb:mem:ejemplo" /&gt;&lt;br /&gt;        &lt;property name="username" value="sa" /&gt;&lt;br /&gt;        &lt;property name="password" value="" /&gt;&lt;br /&gt;    &lt;/bean&gt;&lt;br /&gt;     &lt;br /&gt;    &lt;!-- Configuración de JPA para conectarse a la base de datos --&gt;&lt;br /&gt;    &lt;bean id="emf" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"&gt;&lt;br /&gt;        &lt;property name="persistenceUnitName" value="IdRepositoryPU"/&gt;&lt;br /&gt;        &lt;property name="dataSource" ref="HSQLDataSource" /&gt;&lt;br /&gt;        &lt;property name="jpaDialect"&gt;&lt;br /&gt;            &lt;bean class="org.springframework.orm.jpa.vendor.EclipseLinkJpaDialect" /&gt;&lt;br /&gt;        &lt;/property&gt;&lt;br /&gt;        &lt;property name="jpaProperties"&gt;&lt;br /&gt;            &lt;bean id="jpaProperties"&lt;br /&gt;             class="org.springframework.beans.factory.config.PropertiesFactoryBean"&gt;&lt;br /&gt;                &lt;property name="properties"&gt;&lt;br /&gt;                    &lt;props&gt;&lt;br /&gt;                        &lt;prop key="eclipselink.weaving"&gt;false&lt;/prop&gt;&lt;br /&gt;                    &lt;/props&gt;&lt;br /&gt;                &lt;/property&gt;&lt;br /&gt;            &lt;/bean&gt;&lt;br /&gt;        &lt;/property&gt;&lt;br /&gt;    &lt;/bean&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;!-- Definimos un bean indicando que Administrador de Transacciones se usará--&gt;&lt;br /&gt;    &lt;bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"&gt;&lt;br /&gt;        &lt;property name="entityManagerFactory" ref="emf"/&gt;&lt;br /&gt;        &lt;property name="dataSource" ref="HSQLDataSource" /&gt;&lt;br /&gt;        &lt;property name="jpaDialect"&gt;&lt;br /&gt;            &lt;bean class="org.springframework.orm.jpa.vendor.EclipseLinkJpaDialect"/&gt;&lt;br /&gt;        &lt;/property&gt;&lt;br /&gt;    &lt;/bean&gt;&lt;br /&gt;&lt;br /&gt;&lt;!-- Definimos el DAO que se usará para acceder a la entidad Empleado --&gt;&lt;br /&gt;    &lt;bean id="empleadoDao" class="alevouilloz.dao.EmpleadoDaoJPA"&gt;&lt;/bean&gt;&lt;br /&gt;    &lt;br /&gt;&lt;/beans&gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;En el paquete resource del directorio test, se encuentra el archivo applicationContext.xml. Este archivo es el contexto de aplicación del framework Spring. En él indicaremos entre otras cosas, la fuente de conexión JDBC con la base de datos y las clases DAO que usaremos.&lt;br /&gt;&lt;br /&gt;En nuestro ejemplo, el bean definido con id empleadoDao no es necesario, ya que como vimos anteriormente, nuestra implementación EmpleadoDaoJPA está anotada como @Repository y gracias al component-scan de Spring, ésta es cargada automáticamente y luego es inyectada cuando una clase necesita una instancia de su interface usando la anotación @Autowired. En el caso que la Interface EmpleadoDao tenga varias implementaciones, es útil definir el bean con un id en el contexto para que luego pueda indicarse que implementación DAO será la inyectada.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Preparando la Base de Datos para el Test&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Por medio del script ddl.sql del paquete resource que ejecutamos, definimos la creacion de las tablas necesarias. &lt;br /&gt;&lt;br /&gt;&lt;pre class="brush:sql"&gt;&lt;br /&gt;DROP TABLE EMPLEADO if exists;&lt;br /&gt;DROP TABLE DEPARTAMENTO if exists;&lt;br /&gt;DROP TABLE TAREA if exists;&lt;br /&gt;DROP TABLE EMPLEADO_TAREA if exists;&lt;br /&gt;&lt;br /&gt;CREATE TABLE EMPLEADO (&lt;br /&gt;    id integer NOT NULL IDENTITY,&lt;br /&gt;    nombre varchar(255) NOT NULL,&lt;br /&gt;    apellido varchar(255),&lt;br /&gt;    sueldo float,&lt;br /&gt;    fechaNac Date,&lt;br /&gt;    departamento_id integer &lt;br /&gt;);&lt;br /&gt;&lt;br /&gt;CREATE TABLE DEPARTAMENTO (&lt;br /&gt;    id integer NOT NULL IDENTITY,&lt;br /&gt;    nombre varchar(255) NOT NULL&lt;br /&gt;);&lt;br /&gt;&lt;br /&gt;CREATE TABLE TAREA (&lt;br /&gt;    id integer NOT NULL IDENTITY,&lt;br /&gt;    descripcion varchar(255) NOT NULL&lt;br /&gt;);&lt;br /&gt;&lt;br /&gt;CREATE TABLE EMPLEADO_TAREA (&lt;br /&gt;    id_empleado integer NOT NULL,&lt;br /&gt;    id_tarea integer NOT NULL,&lt;br /&gt;);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;En el archivo initDataSet.xml definimos el DataSet para que el framework DBUnit cargue algunos datos de prueba en las tablas de la base de datos.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Escribiendo el Test para el DAO: EmpleadoDaoJPA&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush:java"&gt;&lt;br /&gt;@ContextConfiguration(locations = {"classpath:resources/applicationContext.xml"})&lt;br /&gt;@RunWith(SpringJUnit4ClassRunner.class)&lt;br /&gt;@TransactionConfiguration(transactionManager = "transactionManager")&lt;br /&gt;@Transactional&lt;br /&gt;public class EmpleadoDaoJPATest {&lt;br /&gt;    &lt;br /&gt;    @Autowired&lt;br /&gt;    private EmpleadoDao empleadoDao;&lt;br /&gt;    &lt;br /&gt;    @Autowired&lt;br /&gt;    @Qualifier(value = "HSQLDataSource")&lt;br /&gt;    private DataSource datasource;&lt;br /&gt;    &lt;br /&gt;    @Before&lt;br /&gt;    public void setUp() throws Exception {&lt;br /&gt;        //Creamos las tablas necesarias para el test antes de cargar los datos&lt;br /&gt;        SimpleJdbcTemplate temp = new SimpleJdbcTemplate(datasource);&lt;br /&gt;        SimpleJdbcTestUtils.executeSqlScript(&lt;br /&gt;                temp, new ClassPathResource("resources/ddl.sql"), false);          &lt;br /&gt;            &lt;br /&gt;        //Cargamos la BD con los datos iniciales&lt;br /&gt;        Connection conn = datasource.getConnection();&lt;br /&gt;        IDatabaseConnection dbUnitCon = new DatabaseConnection(conn);&lt;br /&gt;        FlatXmlDataSetBuilder dsBuilder = new FlatXmlDataSetBuilder();&lt;br /&gt;        IDataSet dataSet = dsBuilder.build(new File("./test/resources/initDataSet.xml"));&lt;br /&gt;        try {&lt;br /&gt;            DatabaseOperation.CLEAN_INSERT.execute(dbUnitCon, dataSet);&lt;br /&gt;        } finally {&lt;br /&gt;            DataSourceUtils.releaseConnection(conn, datasource);&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    @Test&lt;br /&gt;    public void testBuscarPorId() {&lt;br /&gt;        Empleado result = empleadoDao.buscarPorId(1L);&lt;br /&gt;        assertNotNull(result);&lt;br /&gt;        &lt;br /&gt;        System.out.println("Empleado encontrado: " + result);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;...&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Es posible cargar el archivo de contexto de Spring por medio de la API, pero en el ejemplo lo hacemos por medio de la anotación @ContextConfiguration donde le indicamos además su ubicación. Si no se indica la ubicación Spring asume que el archivo contexto de aplicación se encuentra en el mismo paquete de la clase de inicio y su nombre es el de la clase concatenando “-config.xml”.&lt;br /&gt;&lt;br /&gt;La anotación @RunWith(SpringJUnit4ClassRunner.class) nos da soporte de Spring para JUnit 4.&lt;br /&gt;&lt;br /&gt;Podemos ver que la variable de clase empleadoDao al estar anotada como @Autowired será inyectada con la implementación de EmpleadoDao que sea encontrada en el contexto.&lt;br /&gt;&lt;br /&gt;De forma similar también será inyectado el DataSource declarado en la variable datasource, pero esta vez indicamos explícitamente con la anotación @Qualifier que sea con el bean llamado “HSQLDataSource”. En el caso de que existan varios beans del mismo tipo y si no usamos @Qualifier, Spring no sabrá que implementación inyectar y nos arrojará una excepción informando éste inconveniente. En nuestro ejemplo no es necesario especificar el  DataSource a inyectar ya que en el contexto existe un solo bean declarado, pero queda a modo ilustrativo.&lt;br /&gt;&lt;br /&gt;El método setUp() anotado con @Before de JUnit4 se ejecuta al comienzo de cada test y prepara la Base de Datos con la ayuda de algunas clases de utilidades de DBUnit, cargando el dataset con los datos iniciales para las pruebas.&lt;br /&gt;&lt;br /&gt;Esto es todo. Espero que les haya sido útil, y ya saben: cualquier duda, comenten.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8262702061329066701-2951113288389976958?l=alevouilloz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://alevouilloz.blogspot.com/feeds/2951113288389976958/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://alevouilloz.blogspot.com/2011/08/modelando-la-capa-de-acceso-datos_01.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8262702061329066701/posts/default/2951113288389976958'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8262702061329066701/posts/default/2951113288389976958'/><link rel='alternate' type='text/html' href='http://alevouilloz.blogspot.com/2011/08/modelando-la-capa-de-acceso-datos_01.html' title='Modelando la Capa de Acceso a Datos'/><author><name>Ale Vouilloz</name><uri>http://www.blogger.com/profile/11465620039351753180</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-wg7qqGXy3U8/Tjb9X9i3wMI/AAAAAAAAAHE/38l7bsS7U_U/s72-c/Class%2BDiagram1.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8262702061329066701.post-768964812752652831</id><published>2011-05-10T11:36:00.019-03:00</published><updated>2011-05-10T13:53:23.517-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='Arquitectura'/><title type='text'>Las 10 webs de lectura imprescindibles para el Arquitecto de Software</title><content type='html'>Hacia tiempo que tenía ganas de redactar una entrada con las &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;webs&lt;/span&gt; que me vienen ayudando en el día a día laboral. De esta forma, confeccioné un &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_1"&gt;ranking&lt;/span&gt; con lo que para mi son los 10 sitios &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_2"&gt;webs&lt;/span&gt; imprescindibles para un Arquitecto de Software.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: left;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.infoq.com/"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 180px; height: 40px;" src="http://cdn1.infoq.com/styles/i/logo.gif" alt="" border="0" /&gt;&lt;/a&gt;InfoQ es el más completo sitio con artículos y conferencias del mundo del software, dividido en comunidades: Java, .NET, SOA, Arquitecturas, Agile.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: left;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://refcardz.dzone.com/"&gt;&lt;img style="float: left; margin: 0pt 10px 10px 0pt; cursor: pointer; width: 180px; height: 40px;" src="http://refcardz.dzone.com/sites/all/themes/dzone/images/mh_logo_refcardz.gif" alt="" border="0" /&gt;&lt;/a&gt;Subscripción para recibir tarjetas-artículos sobre nuevas tecnologías de software.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.theserverside.com/"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 180px; height: 40px;" src="http://blogs.oracle.com/theaquarium/resource/TSS_Logo-180_40px.jpg" alt="" border="0" /&gt;&lt;/a&gt;Comunidad con artículos de la plataforma JEE.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: left;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.javaworld.com/"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 180px; height: 40px;" src="http://www.cs.utexas.edu/%7Ecannata/cs345/Class%20Notes/02%20JavaWorld%20javacc_files/javaworld-logo-wht-bg.gif" alt="" border="0" /&gt;&lt;/a&gt;Extensa recopilación de articulos sobre la plataforma Java continuamente actualizada.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: left;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.dosideas.com/"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 180px; height: 40px;" src="http://www.panshop.cl/wp-content/uploads/2009/10/logo.png" alt="" border="0" /&gt;&lt;/a&gt;Web con artículos sobre metodologías ágiles y liderazgo de proyectos.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: left;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.javahispano.org/"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 180px; height: 40px;" src="http://javacup.javahispano.org/images/logoJavaHispano.png" alt="" border="0" /&gt;&lt;/a&gt;El clásico de clásicos de Java en el lenguaje de Cervantes con noticias y una gran comunidad comprometida a brindar ayuda en los foros.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: left;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.linuxhispano.net/"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 180px; height: 40px;" src="http://www.linuxhispano.net/wp-content/themes/twentyten/images/linuxhispano.png" alt="" border="0" /&gt;&lt;/a&gt;Comunidad de Linux en español con novedades sobre tecnologías de desarrollo para éste sistema operativo.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: left;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://sourcemaking.com/"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 180px; height: 40px;" src="http://gabrielrodriguez.net/wp-content/uploads/2011/04/sourcemaking-logo.png" alt="" border="0" /&gt;&lt;/a&gt;Excelente web con todo los patrones de diseño, anti-patrones y técnicas de refactoring explicados gráficamente y con ejemplos en los lenguajes más usados.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: left;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://java.dzone.com/"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 180px; height: 40px;" src="http://java.dzone.com/sites/all/themes/dzone/images/mh_logo_java.gif" alt="" border="0" /&gt;&lt;/a&gt;Se autodefine como: "El corazón de la comunidad de desarrolladores Java".&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: left;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://home.java.net/"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 180px; height: 40px;" src="http://home.java.net/sites/all/themes/java_adaptive/images/logo.png" alt="" border="0" /&gt;&lt;/a&gt;Sitio principal sobre el desarrollo de las apis de Java, implementaciones de JSRs y librerias en incubación.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8262702061329066701-768964812752652831?l=alevouilloz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://alevouilloz.blogspot.com/feeds/768964812752652831/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://alevouilloz.blogspot.com/2011/05/las-10-web-de-lectura-imprescindibles.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8262702061329066701/posts/default/768964812752652831'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8262702061329066701/posts/default/768964812752652831'/><link rel='alternate' type='text/html' href='http://alevouilloz.blogspot.com/2011/05/las-10-web-de-lectura-imprescindibles.html' title='Las 10 webs de lectura imprescindibles para el Arquitecto de Software'/><author><name>Ale Vouilloz</name><uri>http://www.blogger.com/profile/11465620039351753180</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8262702061329066701.post-8409862444092528978</id><published>2010-08-13T11:48:00.006-03:00</published><updated>2011-04-07T23:27:43.509-03:00</updated><title type='text'>Scala - Parte 1: Introducción</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://files.blog-city.com/files/aa/1263/p/f/scala.png"&gt;&lt;img style="float: right; margin: 0pt 0pt 10px 10px; cursor: pointer; width: 325px; height: 91px;" src="http://files.blog-city.com/files/aa/1263/p/f/scala.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Luego de mucho tiempo de no escribir una entrada nueva al blog, me comprometo a redactar  una serie de entradas para introducirlos en este lenguaje que me tiene fascinado: Scala&lt;br /&gt;&lt;br /&gt;Existen dos motivos que me llevó a tomar ésta desición: 1-No existen muchos artículos en castellano sobre el tema. 2-Lo escribo más para mi que para los lectores a modo de repaso de lo estudiado.&lt;br /&gt;&lt;br /&gt;Bien, comencemos.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;¿Por donde empezar?&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;Lo primero que debemos hacer es visitar el &lt;a href="http://www.scala-lang.org/"&gt;sitio oficial de Scala&lt;/a&gt; y bajarnos su &lt;a href="http://www.scala-lang.org/downloads"&gt;última versión&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;Mientras descargamos les cuento que Scala es un lenguaje multiparadigma que convina la Orientación a Objetos con la Programación Funcional. Si bien se lo puede catalogar como de tipado fuerte, permite la inferencia de tipos. Como lenguaje Orientado a Objetos es tan puro como lo es Smalltalk. Es decir, todo en Scala es un objeto, no existen los tipos nativos. Si escibimos un valor literal como podría ser un entero veremos que éste tiene métodos.&lt;br /&gt;Scala compila a bytecode para la JVM. Aunque existe una versión para .NET. Los astutos ya se habrán imaginado que entonces es requisito tener instalado un JRE para ejecutar una aplicación Scala.&lt;br /&gt;Además de ésto tenemos el potencial de poder reutilizar todas las Apis y librerias de Java importandolas en nuestro código Scala de manera muy sencilla. Importante es aclarar que el paquete java.lang esta implícitamente importado en el lenguaje.&lt;br /&gt;&lt;br /&gt;Existen plugins tanto para los ide's &lt;a href="http://wiki.netbeans.org/Scala"&gt;Netbeans &lt;/a&gt;como para &lt;a href="http://www.assembla.com/wiki/show/scala-ide"&gt;Eclipse &lt;/a&gt;con caracteristicas poderosas que van más allá del simple coloreado de sintaxis. Como si fuera poco la distribución de Scala nos trae una propia herramienta &lt;a href="http://en.wikipedia.org/wiki/REPL"&gt;REPL&lt;/a&gt; que no es otra cosa que un iterprete Scala. Para invocarla y tirar nuestro primer "hola mundo" sólo hace falta ejecutar la orden scala desde el shell de nuestra terminal del S.O. Previamente y una vez descargada la distribución deberemos descomprimirla en algun directorio y establecer el directorio /bin de Scala para que sea accedido desde cualquier path. Para ésto desde Windows editamos la variable de entorno path agregando el directorio /bin de nuestra instalación Scala. Los linuxeros ya sabrán como hacerlo, ni me gasto :P&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Hola Mundo Scala!&lt;/span&gt;&lt;br /&gt;Para nuestro primer hola mundo accedemos al interprete de scala ejecutando scala.bat desde el directorio /bin de la instalación o simplemente ejecutando scala si tenemos configurado el path en la variable de entorno.&lt;br /&gt;&lt;pre class="indent"&gt;scala&amp;gt; println("Hola Mundo Scala!")&lt;br /&gt;Hola Mundo Scala!&lt;/pre&gt;&lt;span style="font-weight: bold;"&gt;Declarando variables&lt;/span&gt;&lt;br /&gt;Si declaramos las variables con la palabra reservada val, la variable puede ser asignada con un valor una sola vez, similar a cuando declaramos con el modificador final de Java.&lt;br /&gt;&lt;pre class="indent"&gt;scala&amp;gt; val msg = "Hola Mundo Scala!"&lt;br /&gt;msg: java.lang.String = Hola Mundo Scala!&lt;br /&gt;scala&amp;gt; println(msg)&lt;br /&gt;&lt;/pre&gt;Cuando queramos asignarle un nuevo valor el error producido es el siguiente:&lt;br /&gt;&lt;pre class="indent"&gt;scala&amp;gt; msg = "Hola de nuevo"&lt;br /&gt;&lt;console&gt;:5 error: assignment to non-variable&lt;br /&gt;val unnamed4 = {msg = "Hola de nuevo";msg}&lt;br /&gt;&lt;/console&gt;&lt;/pre&gt; Por el contrario si declaramos la variable con la palabra reservada var, ésta podrá reasignarsele valores todas las veces que queramos.&lt;br /&gt;&lt;pre class="indent"&gt;scala&amp;gt; val msg2 = "Hola cambiante"&lt;br /&gt;msg2: java.lang.String = Hola cambiante&lt;br /&gt;scala&amp;gt; msg2 = "Hola de nuevo"&lt;br /&gt;msg2: java.lang.String = Hola de nuevo&lt;br /&gt;scala&amp;gt; println(msg2)&lt;br /&gt;Hola de nuevo&lt;br /&gt;&lt;/pre&gt; &lt;span style="font-weight: bold;"&gt;Definiendo métodos&lt;/span&gt;&lt;br /&gt;Ahora veamos algunas definiciones de métodos en Scala:&lt;br /&gt;&lt;pre class="indent"&gt;scala&amp;gt; def max(x: Int, y: Int): Int = if (x &amp;lt; y) y else x max: (Int,Int)Int &lt;/pre&gt;Éste método calcula el máximo de los dos valores enteros argumentados. En la definición está indicado explícitamente el tipo de retorno del método. Algunas veces el compilador requiere que especifiquemos el tipo. Si el método es recursivo, por ejemplo, es necesario explicitar el tipo del resultado del método. Pero en el ejemplo anterior es posible obviar el tipo del retorno en la definición porque el compilador es capaz de darse cuenta por inferencia:&lt;br /&gt;&lt;pre class="indent"&gt;scala&amp;gt; def max2(x: Int, y: Int)= if (x &amp;lt; y) y else x max2: (Int,Int)Int&lt;/pre&gt;Podemos observar como Scala sabe por inferencia que el retorno es un objeto Int.&lt;br /&gt;&lt;br /&gt;En los ejemplos anteriores el cuerpo del método está definido en una sola sentencia. Pero si el método fuera más complejo el cuerpo debería estar enmarcado dentro de un bloque. Al igual que Java y C, Scala usa las llaves { } para limitar los bloques de código:&lt;br /&gt;&lt;pre class="indent"&gt;scala&amp;gt; def max3(x: Int, y: Int) = { if (x &amp;lt; y) y else x } max3: (Int,Int)Int &lt;/pre&gt;Podemos comprobar el resultado del método con:&lt;br /&gt;&lt;pre class="indent"&gt;scala&amp;gt; println(max(5,2))&lt;br /&gt;5&lt;/pre&gt; Cuando el método no necesita argumentos es posible definirlo de la siguiente manera:&lt;br /&gt;&lt;pre class="indent"&gt;scala&amp;gt; def saludo = println("Hola, soy un metodo sin argumentos")&lt;br /&gt;saludo: Unit&lt;br /&gt;&lt;/pre&gt;Además podemos notar que ahora el retorno del compilador indica que el método saludo no tiene parametros y que retorna un Unit. Un Unit viene a representar lo que es un void en Java. Para usarlo podemos escribir:&lt;br /&gt;&lt;pre class="indent"&gt;scala&amp;gt; saludo&lt;br /&gt;Hola, soy un metodo sin argumentos&lt;br /&gt;&lt;/pre&gt; Bueno, por ahora dejo sólo esto pero espero volver con más en un par de días. Mientras vale seguir experimentando, sobre todo para los que vienen de Java. No sean flojos! :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8262702061329066701-8409862444092528978?l=alevouilloz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://alevouilloz.blogspot.com/feeds/8409862444092528978/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://alevouilloz.blogspot.com/2010/08/scala-parte-1-introduccion.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8262702061329066701/posts/default/8409862444092528978'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8262702061329066701/posts/default/8409862444092528978'/><link rel='alternate' type='text/html' href='http://alevouilloz.blogspot.com/2010/08/scala-parte-1-introduccion.html' title='Scala - Parte 1: Introducción'/><author><name>Ale Vouilloz</name><uri>http://www.blogger.com/profile/11465620039351753180</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8262702061329066701.post-553362441234206882</id><published>2009-06-05T13:45:00.008-03:00</published><updated>2010-08-13T15:35:07.669-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='agil'/><category scheme='http://www.blogger.com/atom/ns#' term='metología'/><category scheme='http://www.blogger.com/atom/ns#' term='scrum'/><title type='text'>LiveCD de Ágil</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_GVFVJq105Ic/SilNaF0KqfI/AAAAAAAAAFw/mj5EjBQqLCM/s1600-h/kanban.jpg"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 400px; height: 258px;" src="http://2.bp.blogspot.com/_GVFVJq105Ic/SilNaF0KqfI/AAAAAAAAAFw/mj5EjBQqLCM/s400/kanban.jpg" alt="" id="BLOGGER_PHOTO_ID_5343887543484721650" border="0" /&gt;&lt;/a&gt;&lt;span style="color: rgb(0, 0, 0);font-size:100%;" &gt;&lt;br /&gt;&lt;w:alwaysshowplaceholdertext style="font-family: georgia;"&gt;&lt;/w:alwaysshowplaceholdertext&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);font-family:arial;font-size:100%;"  &gt;Un alto porcentaje de la gente que crítica a Ágil no conoce de que va el tema y se resisten a comprender sus ventajas por una multitud de motivos sin sentido y presentando excusas tontas como: “ahh, pero en mis proyectos no se podría aplicar, mis proyectos son especiales”. Pfff…Ahora somos todos especiales!! Otros reconocen ciertas ventajas pero no se animan al cambio debido a que algunas prácticas propuestas exigen cierta destreza.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;w:compatibility&gt;&lt;w:breakwrappedtables&gt;&lt;w:snaptogridincell&gt;&lt;span style="color: rgb(0, 0, 0);font-size:100%;" &gt;&lt;w:wraptextwithpunct style="font-family: georgia;"&gt;&lt;w:useasianbreakrules&gt;&lt;w:browserlevel&gt;&lt;/w:browserlevel&gt; &lt;/w:useasianbreakrules&gt;&lt;/w:wraptextwithpunct&gt;&lt;/span&gt;&lt;!--[endif]--&gt;&lt;!--[if gte mso 9]&gt;&lt;xml&gt;  &lt;w:latentstyles deflockedstate="false" latentstylecount="156"&gt;  &lt;/w:LatentStyles&gt; &lt;/xml&gt;&lt;![endif]--&gt;&lt;style&gt; &lt;!--  /* Font Definitions */  @font-face  {font-family:Wingdings;  panose-1:5 0 0 0 0 0 0 0 0 0;  mso-font-charset:2;  mso-generic-font-family:auto;  mso-font-pitch:variable;  mso-font-signature:0 268435456 0 0 -2147483648 0;}  /* Style Definitions */  p.MsoNormal, li.MsoNormal, div.MsoNormal  {mso-style-parent:"";  margin:0cm;  margin-bottom:.0001pt;  mso-pagination:widow-orphan;  font-size:12.0pt;  font-family:"Times New Roman";  mso-fareast-font-family:"Times New Roman";  mso-ansi-language:ES-AR;  mso-fareast-language:EN-US;} a:link, span.MsoHyperlink  {color:blue;  text-decoration:underline;  text-underline:single;} a:visited, span.MsoHyperlinkFollowed  {color:purple;  text-decoration:underline;  text-underline:single;} p  {mso-margin-top-alt:auto;  margin-right:0cm;  mso-margin-bottom-alt:auto;  margin-left:0cm;  mso-pagination:widow-orphan;  font-size:12.0pt;  font-family:"Times New Roman";  mso-fareast-font-family:"Times New Roman";} span.EmailStyle16  {mso-style-type:personal;  mso-style-noshow:yes;  mso-ansi-font-size:10.0pt;  mso-bidi-font-size:10.0pt;  font-family:Arial;  mso-ascii-font-family:Arial;  mso-hansi-font-family:Arial;  mso-bidi-font-family:Arial;  color:windowtext;} @page Section1  {size:612.0pt 792.0pt;  margin:70.85pt 3.0cm 70.85pt 3.0cm;  mso-header-margin:36.0pt;  mso-footer-margin:36.0pt;  mso-paper-source:0;} div.Section1  {page:Section1;}  /* List Definitions */  @list l0  {mso-list-id:1362902237;  mso-list-template-ids:1159888020;} ol  {margin-bottom:0cm;} ul  {margin-bottom:0cm;} --&gt; &lt;/style&gt;&lt;!--[if gte mso 10]&gt; &lt;style&gt;  /* Style Definitions */  table.MsoNormalTable  {mso-style-name:"Table Normal";  mso-tstyle-rowband-size:0;  mso-tstyle-colband-size:0;  mso-style-noshow:yes;  mso-style-parent:"";  mso-padding-alt:0cm 5.4pt 0cm 5.4pt;  mso-para-margin:0cm;  mso-para-margin-bottom:.0001pt;  mso-pagination:widow-orphan;  font-size:10.0pt;  font-family:"Times New Roman";  mso-ansi-language:#0400;  mso-fareast-language:#0400;  mso-bidi-language:#0400;} &lt;/style&gt; &lt;![endif]--&gt;    &lt;p  style="color: rgb(0, 0, 0);font-family:georgia;"&gt;&lt;span style="font-size:100%;"&gt;Sin embargo, podemos realizar pequeños pasos para introducirnos en ágil y asomarnos levemente a ver más o menos de que se trata.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p  style="color: rgb(0, 0, 0);font-family:georgia;"&gt;&lt;span style="color: rgb(0, 0, 0);font-size:100%;" &gt;Una forma de asomarse al agilismo puede llegar a ser éste desafío que lo tomé prestado de&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);font-size:100%;" &gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);font-size:100%;" &gt;&lt;a href="http://www.chileagil.cl/desafio-kanban-primer-paso-hacia-la-agilidad/"&gt;ésta web chilena&lt;/a&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);font-size:100%;" &gt; &lt;/span&gt;&lt;span style="color: rgb(255, 255, 204);font-size:100%;" &gt;&lt;span style="color: rgb(0, 0, 0);"&gt;y&lt;/span&gt; &lt;span style="color: rgb(0, 0, 0);"&gt;permite que los conservadores y cautelosos puedan experimentar sin “dañar nada de su sistema”, similar a un liveCD :)&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);font-size:100%;" &gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="color: rgb(255, 255, 204);"&gt; &lt;span style="color: rgb(0, 0, 0);"&gt;como se calcula la velocidad de un equipo de desarrollo usando Kanban o mejor dicho algo de Kanban&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"  style="margin-left: 36pt; text-indent: -18pt; color: rgb(0, 0, 102);font-family:georgia;"&gt;&lt;!--[if !supportLists]--&gt;&lt;span style="color: rgb(255, 255, 204);font-size:100%;"  lang="ES-AR"&gt;&lt;span style=""&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;1.&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;     &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;!--[endif]--&gt;&lt;span  lang="ES-AR" style="font-size:100%;"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;Listar en post-its las tareas de cada uno para las próximas dos semanas&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"  style="margin-left: 36pt; text-indent: -18pt; color: rgb(0, 0, 102);font-family:georgia;"&gt;&lt;!--[if !supportLists]--&gt;&lt;span style="color: rgb(255, 255, 204);font-size:100%;"  lang="ES-AR"&gt;&lt;span style=""&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;2&lt;/span&gt;.&lt;span style=""&gt; &lt;span style="color: rgb(0, 0, 0);"&gt;    &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;!--[endif]--&gt;&lt;span  lang="ES-AR" style="font-size:100%;"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;Escribir en cada post-it el tiempo que demoraría en hacerse en condiciones óptimas (sin interrupciones)&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"  style="margin-left: 36pt; text-indent: -18pt; color: rgb(0, 0, 102);font-family:georgia;"&gt;&lt;!--[if !supportLists]--&gt;&lt;span style="color: rgb(255, 255, 204);font-size:100%;"  lang="ES-AR"&gt;&lt;span style=""&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;3.&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;     &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;!--[endif]--&gt;&lt;span  lang="ES-AR" style="font-size:100%;"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;Frente al escritorio de trabajo, crear un panel (que llamaremos &lt;/span&gt;&lt;strong style="color: rgb(0, 0, 0);"&gt;Panel Kanban&lt;/strong&gt;&lt;span style="color: rgb(255, 255, 204);"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;) con 3 columnas:  Ítemes que no han partido, ítemes comenzados e Ítemes finalizados&lt;/span&gt;&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"  style="margin-left: 36pt; text-indent: -18pt; color: rgb(0, 0, 102);font-family:georgia;"&gt;&lt;!--[if !supportLists]--&gt;&lt;span style="color: rgb(255, 255, 204);font-size:100%;"  lang="ES-AR"&gt;&lt;span style=""&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;4.&lt;/span&gt;&lt;span style=""&gt;     &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;!--[endif]--&gt;&lt;span  lang="ES-AR" style="font-size:100%;"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;En las dos s&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;emanas, mover los post-its de una columna a otra a medida que se progresa&lt;/span&gt;&lt;o:p style="color: rgb(255, 255, 204);"&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"  style="margin-left: 36pt; text-indent: -18pt; color: rgb(0, 0, 102);font-family:georgia;"&gt;&lt;!--[if !supportLists]--&gt;&lt;span style="color: rgb(255, 255, 204);font-size:100%;"  lang="ES-AR"&gt;&lt;span style=""&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;5&lt;/span&gt;.&lt;span style="color: rgb(0, 0, 0);"&gt;     &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;!--[endif]--&gt;&lt;span  lang="ES-AR" style="font-size:100%;"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;Al final de las 2&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="color: rgb(255, 255, 204);"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;semanas, sumar los numeros de aquellas tareas que estén en la columna “finalizados&lt;/span&gt;”&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"  style="margin-left: 36pt; text-indent: -18pt;font-family:georgia;"&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-size:100%;color:purple;"   lang="ES-AR"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p  style="color: rgb(0, 0, 0);font-family:georgia;" class="MsoNormal"&gt;&lt;span  lang="ES-AR" style="font-size:100%;"&gt;Al dividir la suma de horas “ideales” logradas sobre el total de horas de trabajo de las 2 semanas, habrán medido su &lt;strong&gt;velocidad&lt;/strong&gt;. Ahora tienen una medida de cuanto son capaces de realizar cada 2 semanas, y por ende tienen una guía cerca de cuanto pueden comprometerse para la próxima.&lt;/span&gt;&lt;/p&gt;&lt;p  style="color: rgb(0, 0, 0);font-family:georgia;" class="MsoNormal"&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span  lang="ES-AR" style="font-size:100%;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p  style="color: rgb(0, 0, 0);font-family:georgia;" class="MsoNormal"&gt;&lt;span  lang="ES-AR" style="font-size:100%;"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;color:navy;"   lang="ES-AR"&gt;&lt;span style="color: rgb(0, 0, 0);font-family:georgia;font-size:100%;"  &gt;¿Que les parece esta experiencia?&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;/w:snaptogridincell&gt;&lt;/w:breakwrappedtables&gt;&lt;/w:compatibility&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8262702061329066701-553362441234206882?l=alevouilloz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://alevouilloz.blogspot.com/feeds/553362441234206882/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://alevouilloz.blogspot.com/2009/06/livecd-de-agil.html#comment-form' title='6 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8262702061329066701/posts/default/553362441234206882'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8262702061329066701/posts/default/553362441234206882'/><link rel='alternate' type='text/html' href='http://alevouilloz.blogspot.com/2009/06/livecd-de-agil.html' title='LiveCD de Ágil'/><author><name>Ale Vouilloz</name><uri>http://www.blogger.com/profile/11465620039351753180</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_GVFVJq105Ic/SilNaF0KqfI/AAAAAAAAAFw/mj5EjBQqLCM/s72-c/kanban.jpg' height='72' width='72'/><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8262702061329066701.post-7218435931057816267</id><published>2009-04-30T01:23:00.002-03:00</published><updated>2009-04-30T01:31:53.815-03:00</updated><title type='text'>Resultado de la encuesta sobre RIA's</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_GVFVJq105Ic/SfkpmHdAqlI/AAAAAAAAAFY/ZLTNp0IMXCs/s1600-h/encu.jpeg"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 400px; height: 174px;" src="http://4.bp.blogspot.com/_GVFVJq105Ic/SfkpmHdAqlI/AAAAAAAAAFY/ZLTNp0IMXCs/s400/encu.jpeg" alt="" id="BLOGGER_PHOTO_ID_5330337368782187090" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Otra vez una encuesta con tan pocos votantes no es indicador de mucho.&lt;br /&gt;Pero  creyendo en una tendencia de 29 votos se destacan las herramientas Flash/Flex, Ajax con librerias Javascript y GWT sobre JavaFX, Silverlight y OpenLaszlo.&lt;br /&gt;No hay mucho para decir. Es lo que esperaba.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8262702061329066701-7218435931057816267?l=alevouilloz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://alevouilloz.blogspot.com/feeds/7218435931057816267/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://alevouilloz.blogspot.com/2009/04/resultado-de-la-encuesta-sobre-rias.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8262702061329066701/posts/default/7218435931057816267'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8262702061329066701/posts/default/7218435931057816267'/><link rel='alternate' type='text/html' href='http://alevouilloz.blogspot.com/2009/04/resultado-de-la-encuesta-sobre-rias.html' title='Resultado de la encuesta sobre RIA&apos;s'/><author><name>Ale Vouilloz</name><uri>http://www.blogger.com/profile/11465620039351753180</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_GVFVJq105Ic/SfkpmHdAqlI/AAAAAAAAAFY/ZLTNp0IMXCs/s72-c/encu.jpeg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8262702061329066701.post-5667710932887470114</id><published>2009-03-27T12:39:00.005-03:00</published><updated>2009-03-27T15:34:54.544-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='agil'/><category scheme='http://www.blogger.com/atom/ns#' term='ingeniería'/><category scheme='http://www.blogger.com/atom/ns#' term='procesos'/><category scheme='http://www.blogger.com/atom/ns#' term='Lean'/><category scheme='http://www.blogger.com/atom/ns#' term='software'/><category scheme='http://www.blogger.com/atom/ns#' term='metología'/><title type='text'>Lean en la producción de Software</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_GVFVJq105Ic/Sc0D61ki8eI/AAAAAAAAAFQ/e7ToT6A3Iyk/s1600-h/prod.jpg"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 300px; height: 300px;" src="http://1.bp.blogspot.com/_GVFVJq105Ic/Sc0D61ki8eI/AAAAAAAAAFQ/e7ToT6A3Iyk/s400/prod.jpg" alt="" id="BLOGGER_PHOTO_ID_5317911044342084066" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Considerado por los expertos como el sistema de fabricación del siglo XXI, &lt;span style="font-weight: bold;"&gt;Lean Manufacturing &lt;/span&gt;es un sistema de gestion de proceso de producción impulsado por Toyota. Su objetivo primordial es implantar la eficacia en todos los procesos del negocio, eliminando las actividades que no aportan valor añadido (denominadas&lt;span style="font-style: italic;"&gt; &lt;span style="font-weight: bold;"&gt;waste&lt;/span&gt;&lt;/span&gt;), con el fin de generar beneficios tangibles para el cliente final.&lt;br /&gt;&lt;br /&gt;Veamos los cinco principios del Lean:&lt;ol&gt;&lt;li&gt;&lt;strong&gt;"Understanding Consumer Value" &lt;/strong&gt; o comprensión de lo que es valor para el cliente; el foco se externaliza desplazándose hasta el consumidor final, que es quien decide lo que es importante y le aporta valor.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;"Value Stream Analysis" &lt;/strong&gt; o estudio de todas las fases del proceso de producción, para determinar las que añaden valor y las que se deben cambiar o eliminar. &lt;/li&gt;&lt;li&gt;&lt;strong&gt;"Flow" &lt;/strong&gt; o unificación de las fases de trabajo en un espacio único.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;"Pull"&lt;/strong&gt; o fase final, en la que el producto no se termina hasta que los clientes no hacen el pedido. &lt;/li&gt;&lt;li&gt;&lt;strong&gt;"Perfection" &lt;/strong&gt; u objetivo final. En la medida en que se eliminan los pasos innecesarios y los flujos de trabajo se adaptan a los pedidos de los clientes, se comprueban las reducciones de costes, esfuerzo y tiempos de trabajo en todas las áreas de la empresa. continuas.&lt;/li&gt;&lt;/ol&gt; &lt;p&gt;&lt;span style="font-weight: bold;"&gt;Mejoras Continuas.&lt;/span&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;El soporte a los principios del Lean Manufacturing, se realiza en tres áreas funcionales básicas: gestión, planificación y ejecución, y reducción de actividades sin valor añadido.&lt;/p&gt;&lt;p&gt;En el área de gestión, esta metodología analiza todos los procesos y prácticas respecto a una serie de indicadores clave, y establece unos criterios fundamentales que sirven de punto de partida para medir las mejoras y progresos durante el proceso de implementación del Lean Manufacturing.&lt;/p&gt;&lt;p&gt;En el área de planificación y ejecución, la fabricación comienza cuando el cliente hace el pedido. Mediante el sistema Kanban de planificación y ejecución, se establece un flujo ordenado y automático de materiales, tanto en lo que se refiere a peticiones y aprovisionamientos como a cantidades, proveedores y lugares de destino, basándose en la demanda actual. &lt;/p&gt;&lt;p&gt;Los proveedores también pueden formar parte del sistema gracias al desarrollo de portales web en los que pueden verificar los niveles de existencias y reponer ellos mismos el material en función de los niveles acordados.&lt;/p&gt;&lt;p&gt;La posibilidad de replicar actividades repetitivas sin necesidad de emitir órdenes de trabajo para cada una de ellas o de establecer líneas de producción independientes para cada trabajo, son otras de las ventajas de este sistema que reduce los tiempos muertos entre cada etapa.&lt;/p&gt;&lt;p&gt;Por último, el sistema Lean incide con especial interés en la reducción de actividades que no aportan valor añadido ”waste”. Básicamente, esta metodología identifica siete tipos de waste:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Exceso de producción o producción temprana&lt;/strong&gt;: producir más de lo que el cliente demanda o hacerlo antes de tiempo. Ocupa trabajo y recursos valiosos que se podrían utilizar en responder a la demanda del cliente.  &lt;/li&gt;&lt;li&gt;&lt;strong&gt;Retrasos&lt;/strong&gt;: por falta de planificación, de comunicación o de tardanza en el suministro de materiales, herramientas, información…  &lt;/li&gt;&lt;li&gt;&lt;strong&gt;Transportes desde o hacia el lugar del proceso&lt;/strong&gt;: los materiales se deberían entregar y almacenar en el punto de fabricación, para evitar traslados innecesarios.  &lt;/li&gt;&lt;li&gt;&lt;strong&gt;Inventarios&lt;/strong&gt;: se deben reducir al mínimo ya que suponen un coste financiero y de almacenamiento.   &lt;/li&gt;&lt;li&gt;&lt;strong&gt;Procesos&lt;/strong&gt;: dedicar más esfuerzos de los necesarios en revisiones y actualizaciones; la calidad se debe insertar en todas las fases del proceso de forma que cada una de ellas sea correcta desde el principio.  &lt;/li&gt;&lt;li&gt;&lt;strong&gt;Defectos&lt;/strong&gt;: multiplican los costes y el tiempo de trabajo y consumen una parte importante de los recursos para su solución.  &lt;/li&gt;&lt;li&gt;&lt;strong&gt;Desplazamientos&lt;/strong&gt;: los empleados deben tener a su disposición todas las herramientas y recursos que vayan a necesitar para evitar desplazamientos innecesarios.&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight: bold;"&gt;Mejoras Operativas&lt;/span&gt;&lt;br /&gt;                &lt;a name="tcm:552-28477"&gt;&lt;/a&gt; &lt;p&gt;90% reducción de tiempos en el ciclo de trabajo&lt;/p&gt;&lt;p&gt;50% incremento de la productividad&lt;/p&gt;&lt;p&gt;80% reducción del inventario&lt;/p&gt;&lt;p&gt;80% mejora de la calidad final&lt;/p&gt;&lt;p&gt;75% reducción del espacio utilizado&lt;/p&gt;&lt;p&gt;Para eliminar o reducir el waste, existen una serie de técnicas que abarcan todas las áreas funcionales como: análisis de producción de la empresa, análisis de las actividades de valor, sistema de gestión de calidad total, mantenimiento totalmente productivo, análisis Kaizen de costes y fijación de precios, ingeniería y gestión del cambio y gestión de la documentación.&lt;/p&gt;&lt;p&gt;Como se ha visto, la implantación de la metodología Lean implica el compromiso de toda las áreas funcionales de la empresa y supone un cambio de mentalidad basado en la calidad total. Además ayuda a generar una dinámica propia de mejora, por lo que la adaptación a las caracteristicas de cada caso es indispensable. Por todo ello las ideas centrales del pensamiento Lean no incluyen explicitamente una implementación. &lt;/p&gt;&lt;p&gt;Fuente: &lt;a href="http://www.ifsworld.com/es/news_events/what_others_say/lean.asp"&gt;Principios Lean para una fabricación eficaz. de IFS España&lt;/a&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Ahora bien, En el caso puntual de la industria del software la respuesta rápida al cambio es un requisito indispensable. Cuantas veces hemos oido la frase: "¿Pero como, ahora es tan dificil agregar un botón en el formulario?" Haciendo una analogía apresurada con la ingeniería de puentes, ¿cuántos habitantes de una región(clientes) han pedido modificar el puente ya construido para que en vez de que sea de tipo colgante sea en arco. El cliente ve un proyecto de software como algo blando, fácilmente modificable, y sabemos que no siempre es asi. Pero entonces, ¿qué hacemos? Tratamos de persuadir al cliente que la Ingeniería del Software es tan rígida como la Ingenería Civil o buscamos adaptarnos a la flexibidad requerida.&lt;/p&gt;&lt;p&gt;Teniendo en cuenta lo anterior, la industria del software es el contexto ideal para implementar Lean. Toyota y muchas empresas ajenas a la industria del software tuvieron éxito y mejoraron su productivad con su implementación. Si el software se identifica tanto con los principios del Lean, ¿porqué no implementarlo?&lt;br /&gt;&lt;/p&gt;&lt;p&gt; El mismo RUP propone cierta flexibidad al cambio. Eso si, exige abundante documentación para poder llevarla a cabo. En un ciclo productivo Lean se analizaria que documentación es útil en la producción y que documentación es pérdida de tiempo y recursos. Aquí es donde entran las metologías ágiles. Si, es verdad, al igual que las religiones, todas se parecen. Pero cada una busca su implementación de la filosofía Lean para maximizar la producción. Noten que ahora hice referencia a Lean como una filosofía y no como una metología. Si se quiere se puede ver a Lean como una especificación de principios y a cada metodología agil como una implementación de Lean que intenta conducir un proyecto por el camino del éxito.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Sin dejar la objetividad de un ideal de fábrica de software productiva y metodológica, quiero abrir el debate y leer sus opiniones.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8262702061329066701-5667710932887470114?l=alevouilloz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://alevouilloz.blogspot.com/feeds/5667710932887470114/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://alevouilloz.blogspot.com/2009/03/lean-en-la-produccion-de-software.html#comment-form' title='3 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8262702061329066701/posts/default/5667710932887470114'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8262702061329066701/posts/default/5667710932887470114'/><link rel='alternate' type='text/html' href='http://alevouilloz.blogspot.com/2009/03/lean-en-la-produccion-de-software.html' title='Lean en la producción de Software'/><author><name>Ale Vouilloz</name><uri>http://www.blogger.com/profile/11465620039351753180</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_GVFVJq105Ic/Sc0D61ki8eI/AAAAAAAAAFQ/e7ToT6A3Iyk/s72-c/prod.jpg' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8262702061329066701.post-2466153427490098111</id><published>2009-03-19T12:25:00.022-03:00</published><updated>2009-03-20T14:14:58.920-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Drag'/><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='FileDrop'/><category scheme='http://www.blogger.com/atom/ns#' term='Swing'/><category scheme='http://www.blogger.com/atom/ns#' term='Drop'/><title type='text'>FileDrop: Drag &amp; Drop de archivos fácil en Java</title><content type='html'>Así es como se presenta &lt;a href="http://iharder.sourceforge.net/current/java/filedrop/"&gt;éste api&lt;/a&gt;, sencillo, de dominio público y muy, pero muy útil.&lt;br /&gt;&lt;br /&gt;FileDrop no tiene licencia, es de dominio público y tal como se aclara en su web, podemos hacer lo que se nos antoje con el. &lt;a href="http://prdownloads.sourceforge.net/iharder/filedrop-1.1.zip"&gt;El zip&lt;/a&gt; de descarga contiene además del jar,  el archivo FileDrop.java con toda la funcionalidad embebida para que podamos incluírlo en la ruta de paquetes de alguna aplicación propia sin tener dependencias de jar externos.&lt;br /&gt;&lt;br /&gt;Para ver cuan fácil es usar el Drag &amp;amp; Drop de archivos en Java con FileDrop, vamos a ir más alla del ejemplo de su web y vamos a hacer un componente que muestre imágenes y acepte archivos de imagenes "dragueados" desde el sistema. Algo similiar se podría hacer con visores PDF, reproductores multimedia, o cualquier funcionalidad relacionada al drag &amp;amp; drop de archivos integrada a una aplicación Java standalone. En &lt;a href="http://sites.google.com/site/alevouilloz/Home/Ejemplo_FileDrop.zip?attredirects=0"&gt;éste link&lt;/a&gt; puse el código fuente del ejemplo.&lt;br /&gt;&lt;br /&gt;Primero implementmos el visor de imágenes como un componente. También es posible implementar el visor de imagenes extendiendo de JPanel, Canvas o un JLabel en lugar de un JComponent.&lt;br /&gt;Luego es necesario definir una clase que maneje la transferencia del objeto a draguear. Para nuestro propositito sólo se soportará transferencia de objetos java.awt.Image.&lt;br /&gt;&lt;meta equiv="Content-Type" content="text/html; charset=utf-8"&gt;&lt;meta name="ProgId" content="Word.Document"&gt;&lt;meta name="Generator" content="Microsoft Word 11"&gt;&lt;meta name="Originator" content="Microsoft Word 11"&gt;&lt;link rel="File-List" href="file:///C:%5CDOCUME%7E1%5CAVouiloz%5CCONFIG%7E1%5CTemp%5Cmsohtml1%5C01%5Cclip_filelist.xml"&gt;&lt;!--[if gte mso 9]&gt;&lt;xml&gt;  &lt;w:worddocument&gt;   &lt;w:view&gt;Normal&lt;/w:View&gt;   &lt;w:zoom&gt;0&lt;/w:Zoom&gt;   &lt;w:hyphenationzone&gt;21&lt;/w:HyphenationZone&gt;   &lt;w:punctuationkerning/&gt;   &lt;w:validateagainstschemas/&gt;   &lt;w:saveifxmlinvalid&gt;false&lt;/w:SaveIfXMLInvalid&gt;   &lt;w:ignoremixedcontent&gt;false&lt;/w:IgnoreMixedContent&gt;   &lt;w:alwaysshowplaceholdertext&gt;false&lt;/w:AlwaysShowPlaceholderText&gt;   &lt;w:compatibility&gt;    &lt;w:breakwrappedtables/&gt;    &lt;w:snaptogridincell/&gt;    &lt;w:wraptextwithpunct/&gt;    &lt;w:useasianbreakrules/&gt;    &lt;w:dontgrowautofit/&gt;   &lt;/w:Compatibility&gt;   &lt;w:browserlevel&gt;MicrosoftInternetExplorer4&lt;/w:BrowserLevel&gt;  &lt;/w:WordDocument&gt; &lt;/xml&gt;&lt;![endif]--&gt;&lt;!--[if gte mso 9]&gt;&lt;xml&gt;  &lt;w:latentstyles deflockedstate="false" latentstylecount="156"&gt;  &lt;/w:LatentStyles&gt; &lt;/xml&gt;&lt;![endif]--&gt;&lt;style&gt; &lt;!--  /* Style Definitions */  p.MsoNormal, li.MsoNormal, div.MsoNormal 	{mso-style-parent:""; 	margin:0cm; 	margin-bottom:.0001pt; 	mso-pagination:widow-orphan; 	font-size:12.0pt; 	font-family:"Times New Roman"; 	mso-fareast-font-family:"Times New Roman"; 	mso-ansi-language:ES-AR; 	mso-fareast-language:EN-US;} @page Section1 	{size:595.3pt 841.9pt; 	margin:70.85pt 3.0cm 70.85pt 3.0cm; 	mso-header-margin:35.4pt; 	mso-footer-margin:35.4pt; 	mso-paper-source:0;} div.Section1 	{page:Section1;} -&lt;/style&gt;&lt;br /&gt;&lt;meta equiv="Content-Type" content="text/html; charset=utf-8"&gt;&lt;meta name="ProgId" content="Word.Document"&gt;&lt;meta name="Generator" content="Microsoft Word 11"&gt;&lt;meta name="Originator" content="Microsoft Word 11"&gt;&lt;!--[if gte mso 9]&gt;&lt;xml&gt;  &lt;w:worddocument&gt;   &lt;w:view&gt;Normal&lt;/w:View&gt;   &lt;w:zoom&gt;0&lt;/w:Zoom&gt;   &lt;w:hyphenationzone&gt;21&lt;/w:HyphenationZone&gt;   &lt;w:punctuationkerning/&gt;   &lt;w:validateagainstschemas/&gt;   &lt;w:saveifxmlinvalid&gt;false&lt;/w:SaveIfXMLInvalid&gt;   &lt;w:ignoremixedcontent&gt;false&lt;/w:IgnoreMixedContent&gt;   &lt;w:alwaysshowplaceholdertext&gt;false&lt;/w:AlwaysShowPlaceholderText&gt;   &lt;w:compatibility&gt;    &lt;w:breakwrappedtables/&gt;    &lt;w:snaptogridincell/&gt;    &lt;w:wraptextwithpunct/&gt;    &lt;w:useasianbreakrules/&gt;    &lt;w:dontgrowautofit/&gt;   &lt;/w:Compatibility&gt;   &lt;w:browserlevel&gt;MicrosoftInternetExplorer4&lt;/w:BrowserLevel&gt;  &lt;/w:WordDocument&gt; &lt;/xml&gt;&lt;![endif]--&gt;&lt;!--[if gte mso 9]&gt;&lt;xml&gt;  &lt;w:latentstyles deflockedstate="false" latentstylecount="156"&gt;  &lt;/w:LatentStyles&gt; &lt;/xml&gt;&lt;![endif]--&gt;&lt;style&gt; &lt;!--  /* Style Definitions */  p.MsoNormal, li.MsoNormal, div.MsoNormal 	{mso-style-parent:""; 	margin:0cm; 	margin-bottom:.0001pt; 	mso-pagination:widow-orphan; 	font-size:12.0pt; 	font-family:"Times New Roman"; 	mso-fareast-font-family:"Times New Roman"; 	mso-ansi-language:ES-AR; 	mso-fareast-language:EN-US;} @page Section1 	{size:595.3pt 841.9pt; 	margin:70.85pt 3.0cm 70.85pt 3.0cm; 	mso-header-margin:35.4pt; 	mso-footer-margin:35.4pt; 	mso-paper-source:0;} div.Section1 	{page:Sectio&lt;/style&gt;Y Finalmente, hacemos uso de FileDrop en el método que instancia nuestro visor de imágenes.&lt;br /&gt;&lt;meta equiv="Content-Type" content="text/html; charset=utf-8"&gt;&lt;meta name="ProgId" content="Word.Document"&gt;&lt;meta name="Generator" content="Microsoft Word 11"&gt;&lt;meta name="Originator" content="Microsoft Word 11"&gt;&lt;link rel="File-List" href="file:///C:%5CDOCUME%7E1%5CAVouiloz%5CCONFIG%7E1%5CTemp%5Cmsohtml1%5C01%5Cclip_filelist.xml"&gt;&lt;!--[if gte mso 9]&gt;&lt;xml&gt;  &lt;w:worddocument&gt;   &lt;w:view&gt;Normal&lt;/w:View&gt;   &lt;w:zoom&gt;0&lt;/w:Zoom&gt;   &lt;w:hyphenationzone&gt;21&lt;/w:HyphenationZone&gt;   &lt;w:punctuationkerning/&gt;   &lt;w:validateagainstschemas/&gt;   &lt;w:saveifxmlinvalid&gt;false&lt;/w:SaveIfXMLInvalid&gt;   &lt;w:ignoremixedcontent&gt;false&lt;/w:IgnoreMixedContent&gt;   &lt;w:alwaysshowplaceholdertext&gt;false&lt;/w:AlwaysShowPlaceholderText&gt;   &lt;w:compatibility&gt;    &lt;w:breakwrappedtables/&gt;    &lt;w:snaptogridincell/&gt;    &lt;w:wraptextwithpunct/&gt;    &lt;w:useasianbreakrules/&gt;    &lt;w:dontgrowautofit/&gt;   &lt;/w:Compatibility&gt;   &lt;w:browserlevel&gt;MicrosoftInternetExplorer4&lt;/w:BrowserLevel&gt;  &lt;/w:WordDocument&gt; &lt;/xml&gt;&lt;![endif]--&gt;&lt;!--[if gte mso 9]&gt;&lt;xml&gt;  &lt;w:latentstyles deflockedstate="false" latentstylecount="156"&gt;  &lt;/w:LatentStyles&gt; &lt;/xml&gt;&lt;![endif]--&gt;&lt;style&gt; &lt;!--  /* Style Definitions */  p.MsoNormal, li.MsoNormal, div.MsoNormal 	{mso-style-parent:""; 	margin:0cm; 	margin-bottom:.0001pt; 	mso-pagination:widow-orphan; 	font-size:12.0pt; 	font-family:"Times New Roman"; 	mso-fareast-font-family:"Times New Roman"; 	mso-ansi-language:ES-AR; 	mso-fareast-language:EN-US;} @page Section1 	{size:612.0pt 792.0pt; 	margin:70.85pt 3.0cm 70.85pt 3.0cm; 	mso-header-margin:36.0pt; 	mso-footer-margin:36.0pt; 	mso-paper-source:0;} div.Section1 	{page:Section1;} --&gt; &lt;/style&gt;&lt;!--[if gte mso 10]&gt; &lt;style&gt;  /* Style Definitions */  table.MsoNormalTable 	{mso-style-name:"Table Normal"; 	mso-tstyle-rowband-size:0; 	mso-tstyle-colband-size:0; 	mso-style-noshow:yes; 	mso-style-parent:""; 	mso-padding-alt:0cm 5.4pt 0cm 5.4pt; 	mso-para-margin:0cm; 	mso-para-margin-bottom:.0001pt; 	mso-pagination:widow-orphan; 	font-size:10.0pt; 	font-family:"Times New Roman"; 	mso-ansi-language:#0400; 	mso-fareast-language:#0400; 	mso-bidi-language:#0400;} &lt;/style&gt; &lt;![endif]--&gt;&lt;br /&gt;&lt;meta equiv="Content-Type" content="text/html; charset=utf-8"&gt;&lt;meta name="ProgId" content="Word.Document"&gt;&lt;meta name="Generator" content="Microsoft Word 11"&gt;&lt;meta name="Originator" content="Microsoft Word 11"&gt;&lt;!--[if gte mso 9]&gt;&lt;xml&gt;  &lt;w:worddocument&gt;   &lt;w:view&gt;Normal&lt;/w:View&gt;   &lt;w:zoom&gt;0&lt;/w:Zoom&gt;   &lt;w:hyphenationzone&gt;21&lt;/w:HyphenationZone&gt;   &lt;w:punctuationkerning/&gt;   &lt;w:validateagainstschemas/&gt;   &lt;w:saveifxmlinvalid&gt;false&lt;/w:SaveIfXMLInvalid&gt;   &lt;w:ignoremixedcontent&gt;false&lt;/w:IgnoreMixedContent&gt;   &lt;w:alwaysshowplaceholdertext&gt;false&lt;/w:AlwaysShowPlaceholderText&gt;   &lt;w:compatibility&gt;    &lt;w:breakwrappedtables/&gt;    &lt;w:snaptogridincell/&gt;    &lt;w:wraptextwithpunct/&gt;    &lt;w:useasianbreakrules/&gt;    &lt;w:dontgrowautofit/&gt;   &lt;/w:Compatibility&gt;   &lt;w:browserlevel&gt;MicrosoftInternetExplorer4&lt;/w:BrowserLevel&gt;  &lt;/w:WordDocument&gt; &lt;/xml&gt;&lt;![endif]--&gt;&lt;!--[if gte mso 9]&gt;&lt;xml&gt;  &lt;w:latentstyles deflockedstate="false" latentstylecount="156"&gt;  &lt;/w:LatentStyles&gt; &lt;/xml&gt;&lt;![endif]--&gt;&lt;style&gt; &lt;!--  /* Style Definitions */  p.MsoNormal, li.MsoNormal, div.MsoNormal 	{mso-style-parent:""; 	margin:0cm; 	margin-bottom:.0001pt; 	mso-pagination:widow-orphan; 	font-size:12.0pt; 	font-family:"Times New Roman"; 	mso-fareast-font-family:"Times New Roman"; 	mso-ansi-language:ES-AR; 	mso-fareast-language:EN-US;} @page Section1 	{size:595.3pt 841.9pt; 	margin:70.85pt 3.0cm 70.85pt 3.0cm; 	mso-header-margin:35.4pt; 	mso-footer-margin:35.4pt; 	mso-paper-source:0;} div.Section1 	{page:Section1;} --&gt; &lt;/style&gt;Como se aprecia en el ejemplo, en el método FileDroped del listener se espera un array de objetos File, ésto permite manejar múltiples "dropeos" de archivos. Una aplicación útil podría ser la típica lista de reproducción que al dropear múltiples archivos .mp3 en el contenedor Swing reproduzca el elemento [0] y encole el resto en la lista.&lt;br /&gt;&lt;br /&gt;Espero que les sirva y cualquier duda, comenten.&lt;br /&gt;&lt;code&gt;&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8262702061329066701-2466153427490098111?l=alevouilloz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://alevouilloz.blogspot.com/feeds/2466153427490098111/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://alevouilloz.blogspot.com/2009/03/filedrop-drag-drop-de-archivos-facil-en.html#comment-form' title='8 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8262702061329066701/posts/default/2466153427490098111'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8262702061329066701/posts/default/2466153427490098111'/><link rel='alternate' type='text/html' href='http://alevouilloz.blogspot.com/2009/03/filedrop-drag-drop-de-archivos-facil-en.html' title='FileDrop: Drag &amp; Drop de archivos fácil en Java'/><author><name>Ale Vouilloz</name><uri>http://www.blogger.com/profile/11465620039351753180</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8262702061329066701.post-3991558851596505847</id><published>2009-03-13T16:13:00.009-02:00</published><updated>2009-03-19T16:05:30.179-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Fest'/><category scheme='http://www.blogger.com/atom/ns#' term='Swing'/><category scheme='http://www.blogger.com/atom/ns#' term='test'/><category scheme='http://www.blogger.com/atom/ns#' term='junit'/><title type='text'>FEST Swing: Testing de GUIs</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_GVFVJq105Ic/SbqszZk7_eI/AAAAAAAAAFA/pCmvA7pJTaA/s1600-h/ui-test.jpg"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 400px; height: 220px;" src="http://1.bp.blogspot.com/_GVFVJq105Ic/SbqszZk7_eI/AAAAAAAAAFA/pCmvA7pJTaA/s400/ui-test.jpg" alt="" id="BLOGGER_PHOTO_ID_5312748709476040162" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://fest.easytesting.org/swing/wiki/pmwiki.php"&gt;FEST Swing&lt;/a&gt; no es un festival sobre el estilo musical que hace mover las caderas :D&lt;br /&gt;&lt;br /&gt;FEST es el acrónimo de &lt;span style="font-weight: bold;"&gt;F&lt;/span&gt;ixtures for &lt;span style="font-weight: bold;"&gt;E&lt;/span&gt;asy &lt;span style="font-weight: bold;"&gt;S&lt;/span&gt;&lt;span&gt;oftware &lt;/span&gt;&lt;span style="font-weight: bold;"&gt;T&lt;/span&gt;esting y esta compuesto por cuatro módulos, uno de éstos modulos se llama FEST-Swing y su función es la de proporcionar una ayuda para la dificil y tediosa tarea de escribir test para las interfaces gráficas de usuario programadas con el api de java Swing.&lt;br /&gt;&lt;br /&gt;FEST Swing se integra perfectamente con TestNG y con JUnit. Además desde una tarea ant es posible generar screenshots de las pantallas que fallaron, util para reportar.&lt;br /&gt;&lt;br /&gt;Sin más parafernalia veamos un ejemplo:&lt;br /&gt;&lt;pre&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;dialog&lt;/span&gt;.&lt;span class="fnc"&gt;comboBox&lt;/span&gt;(&lt;span class="str"&gt;"&lt;span style="color: rgb(0, 153, 0);"&gt;domain&lt;/span&gt;"&lt;/span&gt;).&lt;span class="fnc"&gt;select&lt;/span&gt;(&lt;span class="str"&gt;"&lt;span style="color: rgb(0, 153, 0);"&gt;Users&lt;/span&gt;"&lt;/span&gt;);&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;dialog&lt;/span&gt;.&lt;span class="fnc"&gt;textBox&lt;/span&gt;(&lt;span class="str"&gt;"&lt;span style="color: rgb(0, 153, 0);"&gt;username&lt;/span&gt;"&lt;/span&gt;).&lt;span class="fnc"&gt;enterText&lt;/span&gt;(&lt;span class="str"&gt;"&lt;span style="color: rgb(0, 153, 0);"&gt;leia.organa&lt;/span&gt;"&lt;/span&gt;);&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;dialog&lt;/span&gt;.&lt;span class="fnc"&gt;button&lt;/span&gt;(&lt;span class="str"&gt;"&lt;span style="color: rgb(0, 153, 0);"&gt;login&lt;/span&gt;"&lt;/span&gt;).&lt;span class="fnc"&gt;click&lt;/span&gt;();&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;dialog&lt;/span&gt;.&lt;span class="fnc"&gt;optionPane&lt;/span&gt;().&lt;span class="fnc"&gt;requireErrorMessage&lt;/span&gt;()&lt;br /&gt;            .&lt;span class="fnc"&gt;requireMessage&lt;/span&gt;(&lt;span class="str"&gt;"&lt;span style="color: rgb(0, 153, 0);"&gt;Please enter your password&lt;/span&gt;"&lt;/span&gt;);&lt;br /&gt;&lt;/pre&gt;El ejemplo ilustra como testear un dialogo de login y la validación cuando el usuario olvida llenar el campo de texto password.&lt;br /&gt;&lt;br /&gt;Aunque su sintaxis es muy intuitiva, en su &lt;a href="http://docs.codehaus.org/display/FEST/FEST-Swing"&gt;wiki&lt;/a&gt; podrán encontrar una completa documentación de uso.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8262702061329066701-3991558851596505847?l=alevouilloz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://alevouilloz.blogspot.com/feeds/3991558851596505847/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://alevouilloz.blogspot.com/2009/03/testeando-nuestras-uis-swing.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8262702061329066701/posts/default/3991558851596505847'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8262702061329066701/posts/default/3991558851596505847'/><link rel='alternate' type='text/html' href='http://alevouilloz.blogspot.com/2009/03/testeando-nuestras-uis-swing.html' title='FEST Swing: Testing de GUIs'/><author><name>Ale Vouilloz</name><uri>http://www.blogger.com/profile/11465620039351753180</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_GVFVJq105Ic/SbqszZk7_eI/AAAAAAAAAFA/pCmvA7pJTaA/s72-c/ui-test.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8262702061329066701.post-2123002899017230943</id><published>2009-03-11T11:58:00.005-02:00</published><updated>2009-03-19T16:06:13.884-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='calidad'/><category scheme='http://www.blogger.com/atom/ns#' term='integracion continua'/><category scheme='http://www.blogger.com/atom/ns#' term='hudson'/><category scheme='http://www.blogger.com/atom/ns#' term='metricas'/><title type='text'>Exprimiendo a Hudson - Parte 4 (Métricas de calidad)</title><content type='html'>Me he encontrado con la grata sopresa de que una persona no sólo comparte el mismo ambiente de desarrollo e integración que el mio, si no que también ha decidido escribir sobre Integración Continua en su blog.&lt;br /&gt;&lt;br /&gt;Iván, ya ha explicado en su &lt;a href="http://ivanator.wordpress.com/"&gt;blog &lt;/a&gt;como &lt;a href="http://ivanator.wordpress.com/2009/01/12/montando-un-entorno-integracion-continua-hudson-ant-svn-netbeans/"&gt;montar un ambiente de desarrollo para TDD con Netbeans, Ant, SVN y Hudson&lt;/a&gt;. Ambiente idéntico al que vengo describiendo en una serie de post.&lt;br /&gt;Dejo la continuación de los temas que tenía pensado escribir, en éste par de artículos redactados de manera excelente:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://ivanator.wordpress.com/2009/03/05/metricas-de-calidad-con-netbeans-y-hudson/"&gt;Métricas de calidad con NetBeans y Hudson&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://ivanator.wordpress.com/2009/02/07/cobertura-con-netbeans-y-hudson/"&gt;Cobertura con NetBeans y Hudson&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8262702061329066701-2123002899017230943?l=alevouilloz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://alevouilloz.blogspot.com/feeds/2123002899017230943/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://alevouilloz.blogspot.com/2009/03/exprimiendo-hudson-parte-4-metricas-de.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8262702061329066701/posts/default/2123002899017230943'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8262702061329066701/posts/default/2123002899017230943'/><link rel='alternate' type='text/html' href='http://alevouilloz.blogspot.com/2009/03/exprimiendo-hudson-parte-4-metricas-de.html' title='Exprimiendo a Hudson - Parte 4 (Métricas de calidad)'/><author><name>Ale Vouilloz</name><uri>http://www.blogger.com/profile/11465620039351753180</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8262702061329066701.post-3518932592597635226</id><published>2009-03-03T11:29:00.005-02:00</published><updated>2009-03-19T16:06:42.965-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='agil'/><category scheme='http://www.blogger.com/atom/ns#' term='tdd'/><category scheme='http://www.blogger.com/atom/ns#' term='test'/><category scheme='http://www.blogger.com/atom/ns#' term='metologia'/><title type='text'>TDD mejora la calidad sin perder productividad</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_GVFVJq105Ic/SbZqceUwsmI/AAAAAAAAAE4/_LrVQ1AzqBQ/s1600-h/tdd.jpg"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 208px; height: 400px;" src="http://2.bp.blogspot.com/_GVFVJq105Ic/SbZqceUwsmI/AAAAAAAAAE4/_LrVQ1AzqBQ/s400/tdd.jpg" alt="" id="BLOGGER_PHOTO_ID_5311549847939101282" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Un estudio publicado por  &lt;a href="http://www.springer.com/computer/programming/journal/10664"&gt;Empirical Software Engineering&lt;/a&gt; demuestra que TDD mejora la calidad del software producido sin decrementar la productividad.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.springerlink.com/content/q91566748q234325/?p=7fd98b01480f49e2925f36393c999a72&amp;amp;pi=3"&gt;Este estudio&lt;/a&gt; se basó en observar el desarrollo de un proyecto de IBM y tres de Microsoft. Cada uno de estos casos de estudio comparan dos proyectos que trabajan en el mismo producto, usando los mismos lenguajes de programación y tecnologías, bajo la misma gerencia y dirección, y sólo uno de los equipos usaba &lt;a href="http://www.dosideas.com/wiki/Test_Driven_Development"&gt;Test-Driven Development&lt;/a&gt; (TDD). Ningún equipo sabía que estaba siendo parte de un estudio. El caso de estudio de IBM siguió a un equipo que desarrollaba un controlador de dispositivos. Los casos de Microsoft siguieron a equipos que trabajaron en Windows, MSN y Visual Studio.&lt;br /&gt;&lt;br /&gt;Los resultados arrojados mostraron que la densidad de defectos en las pre-entregas de los cuatro productos, medida como defectos cada mil líneas de código, disminuyó entre un 40% y un 90% relativo a los proyectos que no usaron TDD. Las gerencias de los equipos informaron un incremento subjetivo del 15-35% en el tiempo de desarrollo inicial para los equipos que usaron TDD, pero todos estuvieron de acuerdo que esto se cubría por los menores costos de mantenimiento.&lt;br /&gt;&lt;br /&gt;Fuente: &lt;a href="http://www.dosideas.com/metodologias/445-esta-demostrado-tdd-mejora-la-calidad-del-software.html"&gt;http://www.dosideas.com/metodologias/445-esta-demostrado-tdd-mejora-la-calidad-del-software.html&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8262702061329066701-3518932592597635226?l=alevouilloz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://alevouilloz.blogspot.com/feeds/3518932592597635226/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://alevouilloz.blogspot.com/2009/03/tdd-mejora-la-calidad-sin-perder.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8262702061329066701/posts/default/3518932592597635226'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8262702061329066701/posts/default/3518932592597635226'/><link rel='alternate' type='text/html' href='http://alevouilloz.blogspot.com/2009/03/tdd-mejora-la-calidad-sin-perder.html' title='TDD mejora la calidad sin perder productividad'/><author><name>Ale Vouilloz</name><uri>http://www.blogger.com/profile/11465620039351753180</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_GVFVJq105Ic/SbZqceUwsmI/AAAAAAAAAE4/_LrVQ1AzqBQ/s72-c/tdd.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8262702061329066701.post-4848068568443386121</id><published>2009-02-20T11:41:00.004-02:00</published><updated>2009-03-19T16:07:03.997-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='sun'/><category scheme='http://www.blogger.com/atom/ns#' term='javafx'/><title type='text'>JavaFX alcanzo los 100 millones de descargas</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_GVFVJq105Ic/SZ6zfhTGjfI/AAAAAAAAAEI/vkR9pa1L-9M/s1600-h/javaFx.jpg"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 300px; height: 161px;" src="http://1.bp.blogspot.com/_GVFVJq105Ic/SZ6zfhTGjfI/AAAAAAAAAEI/vkR9pa1L-9M/s400/javaFx.jpg" alt="" id="BLOGGER_PHOTO_ID_5304874765184830962" border="0" /&gt;&lt;/a&gt;Continuando con las noticias, ésta vez relacionadas a Java, el CEO de Sun &lt;strong&gt;Jonathan Schwartz&lt;/strong&gt; anunció que JavaFX ha llegado a los 100 millones de descargas. En su blog alaba las características de éste recién nacido lenguaje multiplataformas y augura un futuro muy prometedor.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Jonathan Schwartz&lt;/strong&gt; fue la persona de Sun que más ha promocionado Java y colaborado para liberar la plataforma completamente, convirtiendo a la compañía en un icono más del Open Source.&lt;br /&gt;&lt;br /&gt;¿Que opinas de JavaFX?&lt;br /&gt;&lt;br /&gt;Links:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;a href="http://www.atomicsub.net/2009/02/sun-ceo-praises-javafx-platform/"&gt;Fuente de la noticia&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://74.125.67.132/translate_c?hl=es&amp;amp;sl=en&amp;amp;tl=es&amp;amp;u=http://www.javafx.com/&amp;amp;prev=_t&amp;amp;usg=ALkJrhhBZiiRWeNXG3ZTIoPCx8cUCZC37w"&gt;JavaFX site&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8262702061329066701-4848068568443386121?l=alevouilloz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://alevouilloz.blogspot.com/feeds/4848068568443386121/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://alevouilloz.blogspot.com/2009/02/javafx-alcanzo-los-100-millones-de.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8262702061329066701/posts/default/4848068568443386121'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8262702061329066701/posts/default/4848068568443386121'/><link rel='alternate' type='text/html' href='http://alevouilloz.blogspot.com/2009/02/javafx-alcanzo-los-100-millones-de.html' title='JavaFX alcanzo los 100 millones de descargas'/><author><name>Ale Vouilloz</name><uri>http://www.blogger.com/profile/11465620039351753180</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_GVFVJq105Ic/SZ6zfhTGjfI/AAAAAAAAAEI/vkR9pa1L-9M/s72-c/javaFx.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8262702061329066701.post-1525028374053533720</id><published>2009-02-10T15:56:00.007-02:00</published><updated>2009-03-19T16:07:28.627-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='encuesta'/><category scheme='http://www.blogger.com/atom/ns#' term='windows'/><category scheme='http://www.blogger.com/atom/ns#' term='mac'/><title type='text'>Encuesta: ¿Que S.O. prefieres para desarrollar en Java?</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_GVFVJq105Ic/SZHGfGbXxaI/AAAAAAAAADw/x5b-FJdE_fI/s1600-h/hudson_admin.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 379px; height: 128px;" src="http://3.bp.blogspot.com/_GVFVJq105Ic/SZHGfGbXxaI/AAAAAAAAADw/x5b-FJdE_fI/s400/hudson_admin.jpg" alt="" id="BLOGGER_PHOTO_ID_5301236473995445666" border="0" /&gt;&lt;/a&gt;Finalizada la encuesta, podemos observar que de un total de 26 votos gana Linux con 13 votos, siendo Ubuntu la distro preferida. Le sigue Windows con 11 y bueno...  Solaris y MacOs con un solo voto.&lt;br /&gt;&lt;br /&gt;Si bien la muestra de 26 votos es muy chica, me alcanza para confirmar lo siguiente:&lt;br /&gt;&lt;br /&gt;Con las facilidades de usabilidad que alcanzaron al día de hoy las distribuciones Linux como Ubuntu, los desarrolladores Java que desean ser productivos y no liarse con asuntos exclusivamentes del sistema operativo ya no lo ven de forma negativa. Más aún están comenzando a notar ventajas sobre Windows en cuando a estabilidad, seguridad y usabilidad.&lt;br /&gt;&lt;br /&gt;Desde que migre mi ambiente de desarrollo desde Windows a Ubuntu no me canso de recomendar y enumerar las ventajas que vengo obteniendo.&lt;br /&gt;&lt;br /&gt;Personalmente opino que muchos de los que aún siguen prefiriendo Windows a Linux, toman su desición debido a prejuicios basados en conceptos fantasmas y relacionados a la falsa creencia de la dificultad de configuración y usabilidad. En fin, quiero recomendar a todos ellos que prueben el live-cd de ubuntu y despues me cuentan.&lt;br /&gt;&lt;br /&gt;Escucho sus opiniones.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8262702061329066701-1525028374053533720?l=alevouilloz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://alevouilloz.blogspot.com/feeds/1525028374053533720/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://alevouilloz.blogspot.com/2009/02/encuesta-que-so-prefieres-para.html#comment-form' title='4 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8262702061329066701/posts/default/1525028374053533720'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8262702061329066701/posts/default/1525028374053533720'/><link rel='alternate' type='text/html' href='http://alevouilloz.blogspot.com/2009/02/encuesta-que-so-prefieres-para.html' title='Encuesta: ¿Que S.O. prefieres para desarrollar en Java?'/><author><name>Ale Vouilloz</name><uri>http://www.blogger.com/profile/11465620039351753180</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_GVFVJq105Ic/SZHGfGbXxaI/AAAAAAAAADw/x5b-FJdE_fI/s72-c/hudson_admin.jpg' height='72' width='72'/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8262702061329066701.post-5318997602708197641</id><published>2009-02-09T13:02:00.032-02:00</published><updated>2009-03-19T16:07:53.671-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='job'/><category scheme='http://www.blogger.com/atom/ns#' term='integracion continua'/><category scheme='http://www.blogger.com/atom/ns#' term='hudson'/><title type='text'>Exprimiendo a Hudson - Parte 3 (Creando un Job)</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_GVFVJq105Ic/SZBGsP_SaKI/AAAAAAAAACw/zPXHLg2vwfY/s1600-h/hudson_admin.jpg"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 320px; height: 109px;" src="http://1.bp.blogspot.com/_GVFVJq105Ic/SZBGsP_SaKI/AAAAAAAAACw/zPXHLg2vwfY/s320/hudson_admin.jpg" alt="" id="BLOGGER_PHOTO_ID_5300814487435241634" border="0" /&gt;&lt;/a&gt;Por fin vamos a crear nuestro primer&lt;span style="font-weight: bold;"&gt; &lt;/span&gt;job. En ésta ocasión vamos a suponer que contamos en nuestra Software Factory con un proyecto Java que se construye (compila, distribuye, genera javadoc, etc) desde un script ant. Si usamos un IDE como NetBeans este script es generado automáticamente segun las propiedades del proyecto, no es la finalidad de este tutorial explicar como modificar estos script desde Netbeans, solo comentar que podemos modificar/agregar task ant facilmente sin tocar lo generado por el ide en el archivo build.xml del directorio raiz del proyecto. &lt;a href="http://lefunes.wordpress.com/2008/11/06/agregando-tareas-al-script-de-ant-en-un-proyecto-de-netbeans/"&gt;Aquí &lt;/a&gt;un pequeño tutorial que explica como hacer esto.&lt;br /&gt;&lt;br /&gt;Retornando a Hudson, podemos definir un &lt;span style="font-weight: bold;"&gt;Job &lt;/span&gt;como una tarea con acciones y triggers a realizar sobre un proyecto de software. Normalmente tendremos definido un job por cada proyecto que tengamos que integrar, pero no hay un límite sobre la cantidad de jobs que podamos definir sobre un proyecto particular, todo depende de las acciones que quisieramos ejecutar en el job.&lt;br /&gt;&lt;br /&gt;Para crear un job nuevo hacemos click sobre &lt;span style="font-style: italic;"&gt;New Job&lt;/span&gt;. Como dijimos que la construcción del proyecto esta basada en un script ant, entonces de las distintas posibilidad que disponemos, seleccionamos la opción &lt;span style="font-style: italic;"&gt;Build a free-style software project &lt;/span&gt;y dejamos la opción de maven2 para otra ocación.  Ya que estamos aquí&lt;span style="font-style: italic;"&gt;, Copy existing job &lt;/span&gt;será muy útil para copiar una configuración de un job ya existente al job nuevo ( que deducción! XD ) y ahorrarnos trabajo repetitivo. Le asignamos un nombre al job y le damos al ok.&lt;br /&gt;&lt;br /&gt;La configuración del job se divide en 5 secciones donde Hudson nos pide lo siguiente:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Dame información básica.&lt;/li&gt;&lt;li&gt;¿De donde obtengo el proyecto?&lt;/li&gt;&lt;li&gt;¿En que momento construyo el proyecto?&lt;/li&gt;&lt;li&gt;Dame una herramienta para la construya.&lt;/li&gt;&lt;li&gt;¿Que quieres que haga después de construir el proyecto?&lt;/li&gt;&lt;/ol&gt;Vamos a repasar cada una de las secciones:&lt;br /&gt;&lt;br /&gt;Si nos concentramos en la sección superior, observamos que podemos llenar un campo de comentario con una descripción de la finalidad del job. Tambien existe un checkbox para indicar si queremos que los builds antiguos se vayan &lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_GVFVJq105Ic/SZBxf2HttcI/AAAAAAAAAC4/mt56HkF4roY/s1600-h/hudson_admin.jpg"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 320px; height: 94px;" src="http://3.bp.blogspot.com/_GVFVJq105Ic/SZBxf2HttcI/AAAAAAAAAC4/mt56HkF4roY/s320/hudson_admin.jpg" alt="" id="BLOGGER_PHOTO_ID_5300861553332827586" border="0" /&gt;&lt;/a&gt;descartando, podemos definir esto por cantidad de días y/o por cantidad de builds. Esta última opción es la que siempre uso, manteniendo los últimos 10 builds. También disponemos de otro checkbox que deshabilita la ejecucion del job.&lt;br /&gt;&lt;br /&gt;En la próxima sección &lt;span style="font-weight: bold;"&gt;Source Code Management&lt;/span&gt;, básicamente debemos elegir el sistema gestor de código fuente que posee nuestro repositorio de proyectos y definir la &lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_GVFVJq105Ic/SZCImNlRK3I/AAAAAAAAADA/z-sWZe4xfIE/s1600-h/hudson_admin.jpg"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 320px; height: 86px;" src="http://4.bp.blogspot.com/_GVFVJq105Ic/SZCImNlRK3I/AAAAAAAAADA/z-sWZe4xfIE/s320/hudson_admin.jpg" alt="" id="BLOGGER_PHOTO_ID_5300886951477455730" border="0" /&gt;&lt;/a&gt;conexión al servidor. En principio solamente veremos las opciones CVS y Subversion ya que Hudson por defecto trae instalado y listo para usar plugins para conexión a estos dos servidores. Aunque además disponemos de plugins para Mercurial entre otros.&lt;br /&gt;&lt;br /&gt;En la sección &lt;span style="font-weight: bold;"&gt;Build Triggers&lt;/span&gt; debemos definir el momento en que Hudson realizará el build. Por defecto existen tres formas distintas de realizar hasta acción (cuatro si incluimos el &lt;span style="font-style: italic;"&gt;build now&lt;/span&gt; manual)&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_GVFVJq105Ic/SZGjUikCISI/AAAAAAAAADI/v-f81hMnLVg/s1600-h/hudson_admin.jpg"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 320px; height: 62px;" src="http://4.bp.blogspot.com/_GVFVJq105Ic/SZGjUikCISI/AAAAAAAAADI/v-f81hMnLVg/s320/hudson_admin.jpg" alt="" id="BLOGGER_PHOTO_ID_5301197809662435618" border="0" /&gt;&lt;/a&gt;.&lt;br /&gt;Una de las posibilidades es definir que se haga luego de finalizar otros build de proyectos, indicando el nombre de estos. Esto es muy útil si estamos definiendo un job para correr una completa bateria de tests pero siempre despues de que otro job complete la construcción de todo el proyecto. La segunda forma es encuestar el repositorio definido en la sección anterior cada cierto intervalo de tiempo, si se detectan cambios, se realizará el build. Por último se puede indicar que el build se haga periodicamente.&lt;br /&gt;Para las últimas dos opciones la forma de indicar el tiempo es mediante cinco valores separados por espacios, siendo estos valores en orden: minuto, hora, dia del mes, mes, dia de la semana. Podemos usar el caracter comodín &lt;span style="font-family:courier new;"&gt;*&lt;/span&gt; para indicar "todos". Por ejemplo si queremos realizar builds nocturnos pasada media hora de la media noche todos los dias del mes, los valores a llenar en el campo &lt;span style="font-style: italic;"&gt;Schedule &lt;/span&gt;podrían ser &lt;span style="font-family:courier new;"&gt;29 23 * * *&lt;/span&gt; (los valores para minutos y dias, etc comienzan de 0).&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_GVFVJq105Ic/SZGtWsN1AhI/AAAAAAAAADQ/-SSgoBLgc0s/s1600-h/hudson_admin.jpg"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 320px; height: 72px;" src="http://3.bp.blogspot.com/_GVFVJq105Ic/SZGtWsN1AhI/AAAAAAAAADQ/-SSgoBLgc0s/s320/hudson_admin.jpg" alt="" id="BLOGGER_PHOTO_ID_5301208841729671698" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Continuando con la próxima sección &lt;span style="font-weight: bold;"&gt;build&lt;/span&gt;, es aquí donde definimos la herramienta de construcción, en nuestro caso Ant. Especificando el target que queremos que corra o dejando el campo vacío para que corra el target por defecto. Además tenemos la potencia de ejecutar ordenes de un shell script o de batch script de Windows. Por eje&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_GVFVJq105Ic/SZG1B0iB6FI/AAAAAAAAADY/I0gQr9jBbP4/s1600-h/hudson_admin.jpg"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 320px; height: 143px;" src="http://4.bp.blogspot.com/_GVFVJq105Ic/SZG1B0iB6FI/AAAAAAAAADY/I0gQr9jBbP4/s320/hudson_admin.jpg" alt="" id="BLOGGER_PHOTO_ID_5301217279277656146" border="0" /&gt;&lt;/a&gt;mplo, podríamos invocar por shell script a la orden &lt;span style="font-family:courier new;"&gt;make makefile&lt;/span&gt; para construir un proyecto c/c+.&lt;br /&gt;&lt;br /&gt;En la última sección podemos pedirle a Hudson que realize varias acciones luego de que finalize el build. Como muestra la imagen es posible retener artefactos indicando cuales son. Como por ejemplo archivos .exe .war . jar .zip o lo que fuese resultado del build. Además podemos hacer que se publique el javadoc  (obviamente si es un proyecto Java) indicandole también donde se encuentra. Si lo deseamos, Hudson nos generará un reporte con el resultado de los test JUnit. Todas estas últimas acciones estan basadas en resultados ya generados en la etapa de build, en nuestro ejemplo con el script ant. Otra acción pos-build sencilla de activar es la de notificación por e-mail. Para esta sección disponemos de varios plugins extras sobre todo para reportes.&lt;br /&gt;&lt;br /&gt;Con lo visto hasta aquí ya podemos hacer uso de Hudson de forma básica. En el próximo post comenzaremos a exprimir a Hudson. Ya saben... espero sus comentarios.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8262702061329066701-5318997602708197641?l=alevouilloz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://alevouilloz.blogspot.com/feeds/5318997602708197641/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://alevouilloz.blogspot.com/2009/02/exprimiendo-hudson-parte-3-new-job.html#comment-form' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8262702061329066701/posts/default/5318997602708197641'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8262702061329066701/posts/default/5318997602708197641'/><link rel='alternate' type='text/html' href='http://alevouilloz.blogspot.com/2009/02/exprimiendo-hudson-parte-3-new-job.html' title='Exprimiendo a Hudson - Parte 3 (Creando un Job)'/><author><name>Ale Vouilloz</name><uri>http://www.blogger.com/profile/11465620039351753180</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_GVFVJq105Ic/SZBGsP_SaKI/AAAAAAAAACw/zPXHLg2vwfY/s72-c/hudson_admin.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8262702061329066701.post-6988697310438620167</id><published>2009-02-03T17:57:00.016-02:00</published><updated>2009-03-19T16:08:15.476-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='integracion continua'/><category scheme='http://www.blogger.com/atom/ns#' term='hudson'/><category scheme='http://www.blogger.com/atom/ns#' term='administracion'/><title type='text'>Exprimiendo a Hudson  - Parte 2 (Administración)</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_GVFVJq105Ic/SYikIsH-l8I/AAAAAAAAACY/Qod9Iw-hO0U/s1600-h/hudson_manage.jpg"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 320px; height: 180px;" src="http://3.bp.blogspot.com/_GVFVJq105Ic/SYikIsH-l8I/AAAAAAAAACY/Qod9Iw-hO0U/s320/hudson_manage.jpg" alt="" id="BLOGGER_PHOTO_ID_5298665430791919554" border="0" /&gt;&lt;/a&gt;De retorno de mis vacaciones donde procure no interactuar con ningun tipo de tecnología más que la de una piedra/martillo para poder clavar las estacas de una carpa, intentare continuar con Hudson.&lt;br /&gt;&lt;br /&gt;Ya hice publicidad de las bondades de Hudson a la hora de administrar y configurar el servidor, asi que este post será muy sencillo. Como si no fuera suficientemente fácil, veremos que la UI de Hudson nos proporciona ayuda continuamente.&lt;br /&gt;&lt;br /&gt;Vemos que en la pantalla de administración entre otras operaciones se nos permite configurar el servidor y manejar los plugins de extenciones. Veamos como configurar el servidor:&lt;br /&gt;&lt;br /&gt;Hudson permite la ejecución concurrente de builds. Se denomina &lt;span style="font-style: italic;"&gt;"executor"&lt;/span&gt; a un hilo del servidor que puede realizar builds. Por eso se nos recomienda llenar el campo &lt;span style="font-weight: bold;"&gt;# of executors&lt;/span&gt; con la cantidad de procesadores que cuenta el equipo donde se esta corriendo Hudson.&lt;br /&gt;&lt;br /&gt;Tenemos la posibilidad de marcar un checkbox para habilitar la seguridad. Esto permitira configurar o correr un nuevo build sólo a los que se logueen con un usuario con rol "admin". Si Hudson esta desplegado sobre Tomcat, los usuarios y roles estan definidos en el archivo &lt;tt&gt;$TOMCAT_HOME/conf/tomcat-users.xml&lt;/tt&gt; . Podemos ver como editar éste archivo en la &lt;a href="http://alevouilloz.blogspot.com/2009/01/exprimiendo-hudson-parte-1-instalacin.html"&gt;parte 1 de este tutorial&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Además de la concurrencia, tenemos la posibilidad de definir agentes "esclavos" del master. Esto nos permitira la ejecución de los builds de forma distribu&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_GVFVJq105Ic/SYimiEd4TWI/AAAAAAAAACg/7KETfU6yh-o/s1600-h/hudson_admin.jpg"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 320px; height: 99px;" src="http://3.bp.blogspot.com/_GVFVJq105Ic/SYimiEd4TWI/AAAAAAAAACg/7KETfU6yh-o/s320/hudson_admin.jpg" alt="" id="BLOGGER_PHOTO_ID_5298668065846218082" border="0" /&gt;&lt;/a&gt;ida.&lt;br /&gt;&lt;br /&gt;&lt;span style="" onmouseover="_tipon(this)" onmouseout="_tipoff()"&gt;Cuando un esclavo se registra al master, el master comienza la distribución de las cargas a los esclavos.&lt;/span&gt; &lt;span onmouseover="_tipon(this)" onmouseout="_tipoff()"&gt;&lt;span class="google-src-text" style="direction: ltr; text-align: left;"&gt;La carga será balanceada dependiendo de la configuración particular de cada Job&lt;/span&gt;.&lt;/span&gt; &lt;span onmouseover="_tipon(this)" onmouseout="_tipoff()"&gt;Algunos proyectos pueden &lt;/span&gt;&lt;span onmouseover="_tipon(this)" onmouseout="_tipoff()"&gt;optar a "pegarse" a una máquina en particular para hacer el build, mientras que otros podrán optar por balancear su carga libremente entre los esclavos definidos.&lt;/span&gt; &lt;span style="" onmouseover="_tipon(this)" onmouseout="_tipoff()"&gt;En algún futuro post publicaré como configurar Hudson para realizar builds de forma distribuida, por ahora, &lt;a href="http://hudson.gotdns.com/wiki/display/HUDSON/Distributed+builds"&gt;aqui&lt;/a&gt; un tutorial para ir aprendendiendo esta técnica&lt;/span&gt;&lt;span onmouseover="_tipon(this)" onmouseout="_tipoff()"&gt;.&lt;/span&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_GVFVJq105Ic/SYishLy-LrI/AAAAAAAAACo/dMemf8cs7X0/s1600-h/hudson_admin.jpg"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 320px; height: 184px;" src="http://1.bp.blogspot.com/_GVFVJq105Ic/SYishLy-LrI/AAAAAAAAACo/dMemf8cs7X0/s320/hudson_admin.jpg" alt="" id="BLOGGER_PHOTO_ID_5298674647703629490" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Tambien podemos definir los path y conexiones a distintas herramientas que Hudson eventualmente pueda utilizar. Los campos a llenar son  las instalaciones del JDK, Ant, Maven,  y definir las conexiones a un servidor CVS y a un servidor SMTP para notificaciones por e-mail.&lt;br /&gt;&lt;br /&gt;Obviamente si usamos Subversion como repositorio de código fuente, no llenaremos los campos de CVS. De forma similar, si no nos gusta Maven y solo usamos Ant para programar nuestros script de builds, no es necesario definir una instalación de Maven.&lt;br /&gt;&lt;br /&gt;Como vemos completar una configuración estándar del servidor es totalmente visual y sencilla.&lt;br /&gt;&lt;br /&gt;Para la próxima aprenderemos a crear Jobs para realizar buids de proyectos. A no desesperar, el tunning avanzado para exprimir Hudson vendrá más adelante, cuando ya dominemos "de taquito una integración continua base con Hudson.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8262702061329066701-6988697310438620167?l=alevouilloz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://alevouilloz.blogspot.com/feeds/6988697310438620167/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://alevouilloz.blogspot.com/2009/02/exprimiendo-hudson-parte-2.html#comment-form' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8262702061329066701/posts/default/6988697310438620167'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8262702061329066701/posts/default/6988697310438620167'/><link rel='alternate' type='text/html' href='http://alevouilloz.blogspot.com/2009/02/exprimiendo-hudson-parte-2.html' title='Exprimiendo a Hudson  - Parte 2 (Administración)'/><author><name>Ale Vouilloz</name><uri>http://www.blogger.com/profile/11465620039351753180</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_GVFVJq105Ic/SYikIsH-l8I/AAAAAAAAACY/Qod9Iw-hO0U/s72-c/hudson_manage.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8262702061329066701.post-8342850782049079190</id><published>2009-01-23T20:21:00.024-02:00</published><updated>2009-03-19T16:08:35.309-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='instalacion'/><category scheme='http://www.blogger.com/atom/ns#' term='integracion continua'/><category scheme='http://www.blogger.com/atom/ns#' term='hudson'/><title type='text'>Exprimiendo a Hudson - Parte 1 (Instalación)</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_GVFVJq105Ic/SXph4ypmeGI/AAAAAAAAACQ/lPu1FpS0tYE/s1600-h/ci.png"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 320px; height: 170px;" src="http://2.bp.blogspot.com/_GVFVJq105Ic/SXph4ypmeGI/AAAAAAAAACQ/lPu1FpS0tYE/s320/ci.png" alt="" id="BLOGGER_PHOTO_ID_5294651940224268386" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="https://hudson.dev.java.net/"&gt;Hudson&lt;/a&gt; es un CI Server o servidor de &lt;a href="http://es.wikipedia.org/wiki/Continuous_integration"&gt;integración continua&lt;/a&gt; open source. Existen varios productos similares tales como &lt;a href="http://es.wikipedia.org/wiki/CruiseControl"&gt;Cruise Control&lt;/a&gt; o &lt;a href="http://maven.apache.org/continuum/"&gt;Continuum&lt;/a&gt; de Apache.&lt;br /&gt;&lt;span style="font-size:100%;"&gt;Lo que diferencia a Hudson del resto es su potencia mediante la extension por plugins y su facilidad de instalación, configuración y mantenimiento. &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;En esta primera entrega de una serie voy a explicar como desplegar Hudson &lt;span style="font-size:100%;"&gt; en un Servidor Tomcat instalado en Ubuntu Intrepid Ibex, de todas formas en cualquier otra distro de Linux u otro S.O esto no debería ser muy diferente. E&lt;/span&gt;n las próximas entradas veremos como integrar varias herramientas con los plugins de hudson para reporte de test, cobertura y análisis de código estático para métricas de QA.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-size:130%;"&gt;Instalación:&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Paso 1:&lt;/span&gt; Descargamos hudson.war desde el sitio oficial o desde &lt;a href="http://hudson.gotdns.com/latest/hudson.war"&gt;este link&lt;/a&gt;. Podemos probar hudson iniciándolo con el servidor embebido que trae simplemente con la orden &lt;span style="font-family:courier new;"&gt;java -jar hudson.war&lt;/span&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Paso 2: &lt;/span&gt;Para poder hacer uso de Hudson de forma profesional necesitamos desplegar el war en un contenedor de servlets/jsp como &lt;a href="http://tomcat.apache.org/"&gt;Tomcat&lt;/a&gt;. Necesitamos descargar los paquetes &lt;span style="font-style: italic;"&gt;tomcat6&lt;/span&gt; y &lt;span style="font-style: italic;"&gt;tomcat6-admin&lt;/span&gt;. Esto podemos hacerlo desde el gestor de paquetes &lt;a href="http://es.wikipedia.org/wiki/Synaptic"&gt;Synaptic &lt;/a&gt;o escribiendo en una terminal:&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-family:courier new;"&gt;    sudo apt-get install tomcat6 tomcat6-admin&lt;br /&gt;&lt;/span&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Paso 3: &lt;/span&gt;Probamos si tomcat esta funcionando escribiendo en un browser: &lt;span style="font-family:courier new;"&gt;http://localhost:8080 &lt;/span&gt;. Si todo anda bien deberemos crear un usuario administrador con un rol. Para eso editamos el archivo tomcat-users.xml y luego reiniciamos el servidor:&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-family:courier new;"&gt;sudo nano /var/lib/tomcat6/conf/tomcat-users.xml&lt;/span&gt;&lt;code&gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;!--&lt;br /&gt;&amp;lt;role rolename="tomcat"/&amp;gt;&lt;br /&gt;&amp;lt;role rolename="role1"/&amp;gt;&lt;br /&gt;&amp;lt;user username="tomcat" password="tomcat" roles="tomcat"/&amp;gt;&lt;br /&gt;&amp;lt;user username="both" password="tomcat" roles="tomcat,role1"/&amp;gt;&lt;br /&gt;&amp;lt;user username="role1" password="tomcat" roles="role1"/&amp;gt;&lt;br /&gt;--&amp;gt;&lt;br /&gt;&amp;lt;role rolename="manager"/&amp;gt;&lt;br /&gt;&amp;lt;role rolename="admin"/&amp;gt;&lt;br /&gt;&amp;lt;user username="user" password="secreto" roles="manager"/&amp;gt;&lt;br /&gt;&amp;lt;user username="hudson-admin" password="secreto" roles="admin"/&amp;gt;&lt;br /&gt;&amp;lt;/tomcat-users&amp;gt;&lt;/code&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Paso 4: &lt;/span&gt;Abrimos el administrador de Tomcat, aquí nos pedira el usuario y contraseña que recien agregamos en &lt;span style="font-style: italic;"&gt;tomcat-users.xml&lt;/span&gt;. Para esto escribimos la siguiente direccion en el browser: http://localhost:8080/manager/html. En la sección apropiada agregamos el archivo hudson.war para poder desplegarlo en el contenedor.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Paso 5: &lt;/span&gt;Creamos el directorio de trabajo de Hudson y le otorgamos permisos:&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-family:courier new;"&gt;sudo mkdir /home/hudson&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;sudo chmod 777 /home/hudson&lt;/span&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Paso 6: &lt;/span&gt;En el archivo /etc/init.d/tomcat6 agregamos a la variable &lt;span style="font-family:courier new;"&gt;JAVA_OPTS&lt;/span&gt; la variable -DHUDSON_HOME con el valor del directorio de trabajo de hudson que definimos en el paso 5.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-family:courier new;"&gt;sudo gedit /etc/init.d/tomcat6&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;JAVA_OPTS="$JAVA_OPTS -Djava.endorsed.dirs=$CATALINA_HOME/endorsed -Dcatalina.base=$CATALINA_BASE -Dcatalina.home=$CATALINA_HOME -Djava.io.tmpdir=$CATALINA_BASE/temp -DHUDSON_HOME=/home/hudson"&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Bueno...ahora el ultimo paso es probar si hudson esta andando escribiendo en el browser la dirección: http://localhost:8080/hudson&lt;br /&gt;&lt;br /&gt;Espero que les sirva y ante algún problemita ya saben, escribanme preguntando que por ahí a mi ya me paso. Hasta la próxima entrega.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8262702061329066701-8342850782049079190?l=alevouilloz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://alevouilloz.blogspot.com/feeds/8342850782049079190/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://alevouilloz.blogspot.com/2009/01/exprimiendo-hudson-parte-1-instalacin.html#comment-form' title='6 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8262702061329066701/posts/default/8342850782049079190'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8262702061329066701/posts/default/8342850782049079190'/><link rel='alternate' type='text/html' href='http://alevouilloz.blogspot.com/2009/01/exprimiendo-hudson-parte-1-instalacin.html' title='Exprimiendo a Hudson - Parte 1 (Instalación)'/><author><name>Ale Vouilloz</name><uri>http://www.blogger.com/profile/11465620039351753180</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_GVFVJq105Ic/SXph4ypmeGI/AAAAAAAAACQ/lPu1FpS0tYE/s72-c/ci.png' height='72' width='72'/><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8262702061329066701.post-3829430224830592847</id><published>2009-01-21T04:51:00.006-02:00</published><updated>2009-03-19T16:08:54.472-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='subversion'/><category scheme='http://www.blogger.com/atom/ns#' term='svn'/><title type='text'>Subversion en Linux</title><content type='html'>Para poder mantener controladas las versiones de los proyectos que estamos desarrollando existen los servidores de &lt;a href="http://es.wikipedia.org/wiki/Control_de_versiones"&gt;control de versiones&lt;/a&gt;. Uno de los mas populares es &lt;a href="http://es.wikipedia.org/wiki/Subversion"&gt;Subversion&lt;/a&gt; o svn.&lt;br /&gt;&lt;br /&gt;Voy a explicar paso a paso como consumi un par de horas de mis vacaciones para instalar svn en mi Ubuntu 8.10. Abrimos una terminal y...&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Instalamos los paquetes de subversion:&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-family:courier new;"&gt;sudo apt-get install subversion subversion-tools&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;code&gt;&lt;br /&gt;&lt;/code&gt;&lt;/span&gt;&lt;ul&gt;&lt;li&gt;Si queremos "browsear" el repositorio necesitamos tener instalado y configurado un servidor Apache con el modulo dav y dav_svn, si no lo tenemos:&lt;/li&gt;&lt;/ul&gt; &lt;span style=";font-family:courier new;font-size:100%;"  &gt;&lt;code&gt;&lt;/code&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-family:courier new;"&gt;sudo apt-get install apache2 libapache_svn&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Para poder otorgar permisos creamos un grupo llamado subversion:&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-family:courier new;"&gt;sudo groupadd subversion&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;ul&gt;&lt;li&gt;Agregamos un usuario:&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-family:courier new;"&gt;sudo usermod -Gsubversion nombreusuario&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;ul&gt;&lt;li&gt;Creamos un archivo con el usuario, luego nos pedira una contraseña&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-family:courier new;"&gt;sudo htpasswd -c /etc/apache2/dav_svn.passwd nombreusuario&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;ul&gt;&lt;li&gt; Creamos un directorio, indicamos el repositorio, y otorgamos permisos de grupo y de escritura:&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-family:courier new;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-family:courier new;"&gt;sudo mkdir /home/svn/&lt;br /&gt;sudo svnadmin create /home/svn/&lt;br /&gt;sudo chown -R www-data:subversion /home/svn/&lt;br /&gt;sudo chmod -R 770 /home/svn/&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;ul&gt;&lt;li&gt;Editamos el archivo de configuración de Apache para svn:&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-family:courier new;"&gt;sudo nano /etc/apache2/mods-available&lt;/span&gt;&lt;/span&gt;/dav_svn.conf&lt;br /&gt;&lt;br /&gt;&lt;code&gt;##&lt;br /&gt;# SVN&lt;br /&gt;#&lt;br /&gt;&lt;location&gt;&lt;br /&gt;DAV svn&lt;br /&gt;SVNPath /home/svn&lt;br /&gt;AuthType Basic&lt;br /&gt;AuthName “Repositorio Subversion del proyecto”&lt;br /&gt;AuthUserFile /etc/apache2/dav_svn.passwd&lt;br /&gt;&lt;limitexcept&gt;&lt;br /&gt;Require valid-user&lt;/limitexcept&gt;&lt;/location&gt;&lt;/code&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Ahora solo nos queda reiniciar al sevidor Apache y verificar en un browser la dirección http://localhost/svn&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-family:courier new;"&gt;sudo /etc/init.d/apache2 restart&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;Espero que este mini-tutorial les sea útil. Cualquier duda escriban comentarios.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-family:courier new;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8262702061329066701-3829430224830592847?l=alevouilloz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://alevouilloz.blogspot.com/feeds/3829430224830592847/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://alevouilloz.blogspot.com/2009/01/subversion-en-linux.html#comment-form' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8262702061329066701/posts/default/3829430224830592847'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8262702061329066701/posts/default/3829430224830592847'/><link rel='alternate' type='text/html' href='http://alevouilloz.blogspot.com/2009/01/subversion-en-linux.html' title='Subversion en Linux'/><author><name>Ale Vouilloz</name><uri>http://www.blogger.com/profile/11465620039351753180</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8262702061329066701.post-2653829863531707319</id><published>2009-01-14T15:33:00.008-02:00</published><updated>2009-03-19T16:09:29.067-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='eliza'/><category scheme='http://www.blogger.com/atom/ns#' term='inteligencia artificial'/><category scheme='http://www.blogger.com/atom/ns#' term='chatbots'/><title type='text'>Chatbots</title><content type='html'>Continuando con la linea de IA retro me puse a investigar sobre la vida y logros de &lt;a href="http://es.wikipedia.org/wiki/Joseph_Weizenbaum"&gt;Joseph Weizenbaum&lt;/a&gt;, considerado el padre de la cibernetica. En 1966 Joseph Weizenbaum creo en el MIT un programita simple que lo llamo ELIZA, este programa intentaba mantener una conversación de texto coherente con un usuario. El usuario realizaba preguntas y ELIZA en rol de psicologa contestaba.&lt;br /&gt;&lt;br /&gt;Luego ELIZA fue repudiado por su autor aclarando que sólo se trataba de una simulación de IA.&lt;br /&gt;&lt;br /&gt;Pasemos al diván de ELIZA con &lt;a href="http://www.wedesoft.demon.co.uk/eliza/"&gt;este applet&lt;/a&gt; y dejemos que ella nos analize:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;Eliza: Hi. I'm Eliza. Tell me your problems!&lt;br /&gt;You  : I am afraid&lt;br /&gt;Eliza: How long are you afraid?&lt;br /&gt;You  : since last year&lt;br /&gt;Eliza: Perhaps you would like to talk about a problem?&lt;br /&gt;You  : are you stupid?&lt;br /&gt;Eliza: Why are you so interested wether I am stupid or not?&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;You  : you are mother fucker&lt;br /&gt;Eliza: Why do you think that I am mother fucker?&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;You  : Fuck you!&lt;br /&gt;Eliza: What does this mean for you, saying " Fuck me "?&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;El paciente se enojo por la corriente rogeriana de ELIZA :D y la mando a lavar los platos. Más alla de las palabras agresivas del paciente, podemos ver que cuando ELIZA encuentra una palabra en su diccionario responde con una pregunta preparada para esa palabra, como por ejemplo la tupla (&lt;span style="font-family:courier new;"&gt;afraid&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;, &lt;/span&gt;&lt;span style="font-family:courier new;"&gt;How long are you afraid?)&lt;/span&gt;. Cuando no encuentra alguna palabra clave, sólo responde con una pregunta lo suficientemente ambigua (a veces irritante) como para esconder su desconocimiento, concatenando además la frase del paciente.&lt;br /&gt;&lt;br /&gt;Si te gusta Python &lt;a href="http://www.jezuk.co.uk/cgi-bin/view/eliza"&gt;aquí &lt;/a&gt;tienes otra implementación de ELIZA en éste lenguaje.&lt;br /&gt;&lt;br /&gt;Aunque ELIZA no posee IA, dio inicio a una revolución en este campo. Les dejo algunos chatbots más modernos para que se diviertan un rato, algunos de ellos preparados para intentar pasar el Test de Turing:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.pandorabots.com/pandora/talk?botid=f5d922d97e345aa1"&gt;Alice by Dr. Richard Wallace&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.motbot.de/motbot.php?english=1"&gt;MotBot&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.athena.blueinfos.com/"&gt;Athena&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.personalityforge.com/dynachat.php?BotID=24007&amp;amp;MID=23957"&gt;Bildgesmythe&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8262702061329066701-2653829863531707319?l=alevouilloz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://alevouilloz.blogspot.com/feeds/2653829863531707319/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://alevouilloz.blogspot.com/2009/01/chatbots.html#comment-form' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8262702061329066701/posts/default/2653829863531707319'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8262702061329066701/posts/default/2653829863531707319'/><link rel='alternate' type='text/html' href='http://alevouilloz.blogspot.com/2009/01/chatbots.html' title='Chatbots'/><author><name>Ale Vouilloz</name><uri>http://www.blogger.com/profile/11465620039351753180</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8262702061329066701.post-7730408592308870029</id><published>2009-01-13T21:51:00.011-02:00</published><updated>2009-03-19T16:10:07.873-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='inteligencia artificial'/><category scheme='http://www.blogger.com/atom/ns#' term='perceptron'/><category scheme='http://www.blogger.com/atom/ns#' term='google'/><category scheme='http://www.blogger.com/atom/ns#' term='red neuronal'/><title type='text'>Google y su Inteligencia Artificial</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_GVFVJq105Ic/SW1u7b_i2oI/AAAAAAAAACA/-LtGg03MDk4/s1600-h/terminator4.jpg"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 241px; height: 180px;" src="http://3.bp.blogspot.com/_GVFVJq105Ic/SW1u7b_i2oI/AAAAAAAAACA/-LtGg03MDk4/s320/terminator4.jpg" alt="" id="BLOGGER_PHOTO_ID_5291007104635820674" border="0" /&gt;&lt;/a&gt;&lt;a href="http://es.wikipedia.org/wiki/Alan_Turing"&gt;Alan Turing&lt;/a&gt; en 1950 confecciono un test para medir la inteligencia de una máquina. La prueba consistía en que un jurado debía interactuar con una máquina y una persona, ambos ubicados en habitaciones distintas a la del juez. En la comunicación la máquina podía valerse de "trucos" para persuadir al juez que era una persona respondiendo preguntas. Si el juez no descubría quien era la persona y quien la máquina, la máquina superaba el test y se la podía considerar inteligente, hasta el momento ninguna ha podido superar este test con el rigor científico que Turing exigía.&lt;br /&gt;&lt;br /&gt;Ahora bien. ¿Es suficiente definir la inteligencia artificial simplemente cuando esta no se diferencia de la Inteligencia humana?&lt;br /&gt;&lt;br /&gt;Google indexa sus exabytes de información para sus búsquedas en base a mucha retroalimentación de los usuarios. Esta bien, además posee unos cuantos algoritmos. Pero lo que hace poderoso al superbuscador es esa enorme cantidad de información que entrena a lo que imagino seran perceptrones multicapa.&lt;br /&gt;&lt;br /&gt;Consideremos lo siguiente: Si fuera posible anular el factor cansancio en un humano, este podría indexar toda esta información de forma similar a como lo hace Google sin mucha diferencia en el resultado final.&lt;br /&gt;&lt;br /&gt;Entonces, un usuario del buscador no podría diferenciar si su búsqueda fue ordenada previamente por un ser humano o una máquina ¿Google pasaría el test de Turing? ¿El sistema de ordenado y disposición de la información de google es inteligente? Imagino que Turing diria que si.&lt;br /&gt;&lt;br /&gt;PD: Si lo se, la imagen del Terminator es de lo mas amarillo :D&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8262702061329066701-7730408592308870029?l=alevouilloz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://alevouilloz.blogspot.com/feeds/7730408592308870029/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://alevouilloz.blogspot.com/2009/01/google-y-su-intelegencia-artificial.html#comment-form' title='4 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8262702061329066701/posts/default/7730408592308870029'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8262702061329066701/posts/default/7730408592308870029'/><link rel='alternate' type='text/html' href='http://alevouilloz.blogspot.com/2009/01/google-y-su-intelegencia-artificial.html' title='Google y su Inteligencia Artificial'/><author><name>Ale Vouilloz</name><uri>http://www.blogger.com/profile/11465620039351753180</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_GVFVJq105Ic/SW1u7b_i2oI/AAAAAAAAACA/-LtGg03MDk4/s72-c/terminator4.jpg' height='72' width='72'/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8262702061329066701.post-4954044203008950698</id><published>2009-01-12T23:49:00.015-02:00</published><updated>2009-03-19T16:10:41.807-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='jna'/><category scheme='http://www.blogger.com/atom/ns#' term='acceso nativo'/><category scheme='http://www.blogger.com/atom/ns#' term='c'/><title type='text'>JNA: Invocando código nativo desde Java</title><content type='html'>Para los que no lo conozcan, &lt;a href="https://jna.dev.java.net/"&gt;JNA (Java Native Access)&lt;/a&gt; es un proyecto del &lt;a href="https://jdk-incubator.dev.java.net/"&gt;JDK-Incubator&lt;/a&gt; que nos proporciona un api para poder acceder a código nativo desde java. JNA Nos facilita y acelera el desarrollo al poder invocar funciones de librerías compartidas (.dll en Windows y .so en Linux) sin tener que usar JNI, ya que solamente debemos codificar en java implementando las interfaces y reglas que la api nos expone. La licencia de JNA es LGPL.&lt;br /&gt;&lt;br /&gt;Veamos un ejemplo &lt;span style="font-style: italic;"&gt;hola mundo&lt;/span&gt; escrito en consola por la función &lt;span style="font-weight: bold;font-family:courier new;" &gt;printf&lt;/span&gt; de la librería &lt;span style="font-weight: bold;font-family:courier new;" &gt;msvcrt&lt;/span&gt; si la plataforma es windows o la librería &lt;span style="font-weight: bold;font-family:courier new;" &gt;c&lt;/span&gt; en caso contrario:&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;br /&gt;import com.sun.jna.Library;&lt;br /&gt;import com.sun.jna.Native;&lt;br /&gt;import com.sun.jna.Platform;&lt;br /&gt;&lt;br /&gt;public class HelloWorld {&lt;br /&gt;&lt;br /&gt;   public interface CLibrary extends Library {&lt;br /&gt;       CLibrary INSTANCE = (CLibrary)Native.loadLibrary(&lt;br /&gt;          (Platform.isWindows() ? "msvcrt" : "c"), &lt;br /&gt;          CLibrary.class);&lt;br /&gt;  &lt;br /&gt;       void printf(String format, Object... args);&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   public static void main(String[] args) {&lt;br /&gt;       CLibrary.INSTANCE.printf("Hola mundo!\n");&lt;br /&gt;       for (int i=0;i &lt; args.length;i++) {&lt;br /&gt;           CLibrary.INSTANCE.printf(&lt;br /&gt;              "Argumento %d: %s\n", i, args[i]);&lt;br /&gt;       }     &lt;br /&gt;   } &lt;br /&gt;} &lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;span style=";font-family:georgia;font-size:100%;"  &gt;Pueden apreciar la simpleza con la que se "wrappea" la funcion printf de c. Noten que además de imprimir el clásico "hola mundo" se imprimen todos los argumentos pasados al metodo main utilizando el formateo que nos ofrece la funcion printf de c.&lt;br /&gt;&lt;br /&gt;Esto es solo un ejemplo ilustrativo de uso, pero imaginen el potencial de facilidad que nos permite JNA al utilizar funciones de c en java comparando con el arduo trabajo que nos llevaría con JNI.&lt;br /&gt;&lt;br /&gt;Llevo un tiempo utilizando JNA  y aunque me he encontrado con un par de inconvenientes, pude dar resolución feliz a todo lo que quise "wrappear" a java desde librerías nativas. Hablo de invocar funciones pasando como parametros estructuras complejas, y parámetros por referencia para poder obtener retornos. Hasta ahora todo lo pude hacer y de forma simple. :)&lt;br /&gt;&lt;br /&gt;Para finalizar, algunos proyectos que utilizan JNA:&lt;br /&gt;&lt;/span&gt;&lt;ul  style="font-family:georgia;"&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;&lt;a href="http://jruby.codehaus.org/"&gt;JRuby&lt;/a&gt; (Charles Nutter)  &lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;&lt;a href="http://rococoa.dev.java.net/"&gt;Rococoa&lt;/a&gt; Java bindings to the Mac OS X Cocoa framework.  &lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;&lt;a href="http://fmj.sf.net/"&gt;Freedom for Media in Java (FMJ)&lt;/a&gt; (Ken Larson/Dieter Krachtus)  &lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;&lt;a href="http://code.google.com/p/gstreamer-java"&gt;gstreamer for Java&lt;/a&gt; (Wayne Meissner)  &lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;&lt;a href="http://trac.videolan.org/jvlc/"&gt;Videolan&lt;/a&gt; JVLC Java Multimedia Library  &lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;&lt;a href="http://svnkit.com/"&gt;SVNKit&lt;/a&gt; pure Java Subversion client library.  &lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;&lt;a href="http://omegat.sf.net/"&gt;OmegaT Computer-Aided Translation&lt;/a&gt;, which makes use of the &lt;a href="http://hunspell.sf.net/"&gt;hunspell spell checker&lt;/a&gt;.  &lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;&lt;a href="http://jetbrains.com/"&gt;IntelliJ IDEA&lt;/a&gt; (JetBrains)  &lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;&lt;a href="http://netbeans.org/"&gt;NetBeans IDE&lt;/a&gt;&lt;/span&gt;  &lt;/li&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;&lt;a href="http://epirsch.blogspot.com/2008/02/jna-love-nxt.html"&gt;Drive Lego Mindstorm NXT&lt;/a&gt; (Emmanuel Pirsch)  &lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;&lt;a href="https://jna.dev.java.net/source/browse/jna/trunk/jnalib/contrib"&gt;Miscellaneous contributed mappings and utilities&lt;/a&gt; (including Windows NT Service, Registry, and User Account libraries).  &lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;&lt;a href="http://sellmic.com/blog/2007/05/22/javafx-clock-update-now-with-transparency"&gt;A JavaFX Clock&lt;/a&gt; (Augusto Sellhorn)  &lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;&lt;a href="http://ochafik.free.fr/blog/?p=98"&gt;Detect User Inactivity&lt;/a&gt; (Olivier Chafik)  &lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;&lt;a href="http://www.athenabackup.com/"&gt;Athena Backup&lt;/a&gt; (Doug Patriarche)  &lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;&lt;a href="https://launchpad.net/libusb4j"&gt;USB for Java&lt;/a&gt;  (Mario Boikov)  &lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8262702061329066701-4954044203008950698?l=alevouilloz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://alevouilloz.blogspot.com/feeds/4954044203008950698/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://alevouilloz.blogspot.com/2009/01/jna-ejecutando-cdigo-nativo-desde-java.html#comment-form' title='35 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8262702061329066701/posts/default/4954044203008950698'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8262702061329066701/posts/default/4954044203008950698'/><link rel='alternate' type='text/html' href='http://alevouilloz.blogspot.com/2009/01/jna-ejecutando-cdigo-nativo-desde-java.html' title='JNA: Invocando código nativo desde Java'/><author><name>Ale Vouilloz</name><uri>http://www.blogger.com/profile/11465620039351753180</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>35</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8262702061329066701.post-6154171562097242903</id><published>2009-01-12T01:43:00.012-02:00</published><updated>2009-03-19T16:11:17.037-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='netbeans 6.5'/><category scheme='http://www.blogger.com/atom/ns#' term='c++'/><category scheme='http://www.blogger.com/atom/ns#' term='netbeans'/><category scheme='http://www.blogger.com/atom/ns#' term='c'/><title type='text'>Soporte mejorado de C/C++ en Netbeans 6.5</title><content type='html'>&lt;!--[if gte mso 9]&gt;&lt;xml&gt;  &lt;w:worddocument&gt;   &lt;w:view&gt;Normal&lt;/w:View&gt;   &lt;w:zoom&gt;0&lt;/w:Zoom&gt;   &lt;w:hyphenationzone&gt;21&lt;/w:HyphenationZone&gt;   &lt;w:punctuationkerning/&gt;   &lt;w:validateagainstschemas/&gt;   &lt;w:saveifxmlinvalid&gt;false&lt;/w:SaveIfXMLInvalid&gt;   &lt;w:ignoremixedcontent&gt;false&lt;/w:IgnoreMixedContent&gt;   &lt;w:alwaysshowplaceholdertext&gt;false&lt;/w:AlwaysShowPlaceholderText&gt;   &lt;w:compatibility&gt;    &lt;w:breakwrappedtables/&gt;    &lt;w:snaptogridincell/&gt;    &lt;w:wraptextwithpunct/&gt;    &lt;w:useasianbreakrules/&gt;    &lt;w:dontgrowautofit/&gt;   &lt;/w:Compatibility&gt;   &lt;w:browserlevel&gt;MicrosoftInternetExplorer4&lt;/w:BrowserLevel&gt;  &lt;/w:WordDocument&gt; &lt;/xml&gt;&lt;![endif]--&gt;&lt;!--[if gte mso 9]&gt;&lt;xml&gt;  &lt;w:latentstyles deflockedstate="false" latentstylecount="156"&gt;  &lt;/w:LatentStyles&gt; &lt;/xml&gt;&lt;![endif]--&gt; &lt;!--  /* Font Definitions */  @font-face  {font-family:Wingdings;  panose-1:5 0 0 0 0 0 0 0 0 0;  mso-font-charset:2;  mso-generic-font-family:auto;  mso-font-pitch:variable;  mso-font-signature:0 268435456 0 0 -2147483648 0;}  /* Style Definitions */  p.MsoNormal, li.MsoNormal, div.MsoNormal  {mso-style-parent:"";  margin:0cm;  margin-bottom:.0001pt;  mso-pagination:widow-orphan;  font-size:12.0pt;  font-family:"Times New Roman";  mso-fareast-font-family:"Times New Roman";  mso-ansi-language:ES-AR;  mso-fareast-language:EN-US;} span.EmailStyle15  {mso-style-type:personal;  mso-style-noshow:yes;  mso-ansi-font-size:10.0pt;  mso-bidi-font-size:10.0pt;  font-family:Arial;  mso-ascii-font-family:Arial;  mso-hansi-font-family:Arial;  mso-bidi-font-family:Arial;  color:windowtext;} @page Section1  {size:595.3pt 841.9pt;  margin:70.85pt 3.0cm 70.85pt 3.0cm;  mso-header-margin:35.4pt;  mso-footer-margin:35.4pt;  mso-paper-source:0;} div.Section1  {page:Section1;}  /* List Definitions */  @list l0  {mso-list-id:1524903398;  mso-list-type:hybrid;  mso-list-template-ids:33174874 1752091444 201981955 201981957 201981953 201981955 201981957 201981953 201981955 201981957;} @list l0:level1  {mso-level-start-at:0;  mso-level-number-format:bullet;  mso-level-text:-;  mso-level-tab-stop:53.25pt;  mso-level-number-position:left;  margin-left:53.25pt;  text-indent:-18.0pt;  font-family:"Times New Roman";  mso-fareast-font-family:"Times New Roman";} ol  {margin-bottom:0cm;} ul  {margin-bottom:0cm;} --&lt;/style&gt;&lt;span lang="ES-AR"  style="font-size:100%;"&gt;Vengo utilizando el módulo o plugin de C/C++ para Netbeans desde la versión 6.0. En la versión 6.5 este soporte ha mejorado bastante, veamos cuales son estas mejoras:&lt;/span&gt;&lt;p class="MsoNormal"&gt;&lt;br /&gt;&lt;span lang="ES-AR"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span lang="ES-AR"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 53.25pt; text-indent: -18pt; text-align: left;"&gt;&lt;!--[if !supportLists]--&gt;&lt;span  lang="ES-AR" style="font-size:100%;"&gt;&lt;span style=""&gt;-&lt;span style=";font-family:&amp;quot;;" &gt;          &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;!--[endif]--&gt;&lt;span style="font-size:100%;"&gt;&lt;b style=""&gt;&lt;span lang="ES-AR"&gt;Mejoras del editor de código: &lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span  lang="ES-AR" style="font-size:100%;"&gt;Esto es lo mejorcito. Mejora el autocomplementado, mejora el resaltado de semántica y errores, identación y formateo automático, búsqueda de uso de variables locales y globales, funciones, clases, directivas de #includes, etc, &lt;span style=""&gt; &lt;/span&gt;refactoring de renombrado de variables y funciones.&lt;/span&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_GVFVJq105Ic/SWtVnsrmqbI/AAAAAAAAABY/Y1EP4VYixOA/s1600-h/code-editor.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 364px; height: 178px;" src="http://2.bp.blogspot.com/_GVFVJq105Ic/SWtVnsrmqbI/AAAAAAAAABY/Y1EP4VYixOA/s320/code-editor.jpg" alt="" id="BLOGGER_PHOTO_ID_5290416327774087602" border="0" /&gt;&lt;/a&gt;&lt;p&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 53.25pt; text-indent: -18pt;"&gt;&lt;!--[if !supportLists]--&gt;&lt;span  lang="ES-AR" style="font-size:100%;"&gt;&lt;span style=""&gt;-&lt;span style=";font-family:&amp;quot;;" &gt;          &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;!--[endif]--&gt;&lt;span style="font-size:100%;"&gt;&lt;b style=""&gt;&lt;span lang="ES-AR"&gt;Mejor soporte a nivel de proyecto: &lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span  lang="ES-AR" style="font-size:100%;"&gt;Unos pocos cambios en las propiedades y configuración del proyecto, para linkear librerías dinámicas y estáticas.&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 53.25pt; text-indent: -18pt;"&gt;&lt;!--[if !supportLists]--&gt;&lt;span style="font-size:100%;"&gt;-&lt;b style=""&gt;&lt;span lang="ES-AR"&gt;   Grafo de llamados de funciones: &lt;/span&gt;&lt;/b&gt;&lt;span lang="ES-AR"&gt;Nos muestra una ventana con todas las llamadas a la función seleccionada.&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="margin-left: 53.25pt; text-indent: -18pt;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_GVFVJq105Ic/SWtYJSUvmUI/AAAAAAAAABw/0yhNn4WDE94/s1600-h/cpp-reverse-call-graph.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 200px; height: 175px;" src="http://2.bp.blogspot.com/_GVFVJq105Ic/SWtYJSUvmUI/AAAAAAAAABw/0yhNn4WDE94/s320/cpp-reverse-call-graph.png" alt="" id="BLOGGER_PHOTO_ID_5290419103837690178" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 53.25pt; text-indent: -18pt;"&gt;&lt;!--[if !supportLists]--&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="margin-left: 53.25pt; text-indent: -18pt;"&gt;&lt;span  lang="ES-AR" style="font-size:100%;"&gt;-&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;b style=""&gt;&lt;span lang="ES-AR"&gt;   Ventana de Memoria: &lt;/span&gt;&lt;/b&gt;&lt;span lang="ES-AR"&gt;Nos muestra el contenido de las direcciones que están actualmente en uso.&lt;/span&gt;&lt;b style=""&gt;&lt;span  lang="ES-AR" style="font-family:Arial;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 53.25pt; text-indent: -18pt;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_GVFVJq105Ic/SWtYXWqvR-I/AAAAAAAAAB4/_dPhCAncNhY/s1600-h/cpp-memory-window.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 200px; height: 158px;" src="http://2.bp.blogspot.com/_GVFVJq105Ic/SWtYXWqvR-I/AAAAAAAAAB4/_dPhCAncNhY/s320/cpp-memory-window.png" alt="" id="BLOGGER_PHOTO_ID_5290419345521854434" border="0" /&gt;&lt;/a&gt;&lt;!--[if !supportLists]--&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="margin-left: 53.25pt; text-indent: -18pt;"&gt;&lt;span  lang="ES-AR" style="font-size:100%;"&gt;- &lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;b style=""&gt;&lt;span lang="ES-AR"&gt;  Desarrollo remoto: &lt;/span&gt;&lt;/b&gt;&lt;span lang="ES-AR"&gt;Esto no le he probado aún, pero promete definir host remotos y y poder &lt;/span&gt;&lt;span lang="ES-AR"&gt;realizar builds o correr proyectos desde el cliente.&lt;/span&gt;&lt;b style=""&gt;&lt;span lang="ES-AR"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 53.25pt; text-indent: -18pt;"&gt;&lt;span  lang="ES-AR" style="font-size:100%;"&gt;-&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;b style=""&gt;&lt;span lang="ES-AR"&gt;Empaquetado : &lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span  lang="ES-AR" style="font-size:100%;"&gt;Nos permite empaquetar las aplicaciones para distribuirlas en archivos tar, archivos zip, o paquetes SVR4.&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:100%;"   lang="ES-AR"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span lang="ES-AR"&gt;&lt;span style="font-size:100%;"&gt;Bueno, éstas son sólo las novedades en la versión 6.5, faltaron enunciar los features que se mantienen de las versiones anteriores.&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span lang="ES-AR"&gt;&lt;span style="font-size:100%;"&gt;Para la próxima entrada relacionada a C, estoy preparando un pequeño tutorial para explicar como preparar y configurar un ambiente de desarrollo de C/C++ con Netbeans y las tools GNU sobre Windows.&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8262702061329066701-6154171562097242903?l=alevouilloz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://alevouilloz.blogspot.com/feeds/6154171562097242903/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://alevouilloz.blogspot.com/2009/01/soporte-mejorado-de-cc-en-netbeans-65.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8262702061329066701/posts/default/6154171562097242903'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8262702061329066701/posts/default/6154171562097242903'/><link rel='alternate' type='text/html' href='http://alevouilloz.blogspot.com/2009/01/soporte-mejorado-de-cc-en-netbeans-65.html' title='Soporte mejorado de C/C++ en Netbeans 6.5'/><author><name>Ale Vouilloz</name><uri>http://www.blogger.com/profile/11465620039351753180</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_GVFVJq105Ic/SWtVnsrmqbI/AAAAAAAAABY/Y1EP4VYixOA/s72-c/code-editor.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8262702061329066701.post-807668471526454419</id><published>2009-01-09T20:46:00.011-02:00</published><updated>2009-03-19T16:11:42.705-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='lenguajes'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>Python para todos!</title><content type='html'>Estoy comenzando con Python y tengo que decirles que es el lenguaje de programación más parecido al lenguaje natural que he visto. Un código escrito en python es muy fácil de leer ya que se asemeja bastante al pseudocódigo. Además es muy entretenido y ameno aprenderlo. Como ejemplo de esto miren el siguiente código python:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;edad = 0&lt;br /&gt;while edad &lt; 18&lt;br /&gt;&lt;div style="text-align: left;"&gt;&lt;span style="margin-left: 0.3in;font-family:courier new;" &gt;print "Tienes " + edad + " años."&lt;/span&gt;&lt;br /&gt;&lt;span style="margin-left: 0.3in;font-family:courier new;" &gt;edad = edad + 1&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;span style="font-family:courier new;"&gt;print "Ya eres mayor de edad." &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:georgia;"&gt;Podemos además apreciar que los bloques estan limitados por la identación y no por las llaves { } como en C o Java o por palabras reservadas como &lt;span style="font-weight: bold;"&gt;begin end &lt;/span&gt;de Pascal.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:georgia;"&gt;Quiero recomendarles el siguiente libro pdf en castellano: &lt;/span&gt;&lt;a style="font-family: georgia;" href="http://edge.launchpad.net/improve-python-spanish-doc/0.4/0.4.0/+download/Python%20para%20todos.pdf"&gt;Python para todos&lt;/a&gt;&lt;span style="font-family:georgia;"&gt;.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:georgia;"&gt;Para escribir los ejemplos estoy utilizando el interprete Jython y el plugin para netbeans 6.5 que pueden bajar del mismo Ide en Tool-&gt;Plugins. Aunque todavia este plugin es beta (al parecer tendra una liberación final junto con NB 7.0) alcanza para poder aprender y ejecutar ejemplos.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:georgia;"&gt;Cuando tenga mas novedades y aprenda más cosas sobre Python escribire una entrada con más recomendaciones.&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8262702061329066701-807668471526454419?l=alevouilloz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://alevouilloz.blogspot.com/feeds/807668471526454419/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://alevouilloz.blogspot.com/2009/01/python-para-todos.html#comment-form' title='5 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8262702061329066701/posts/default/807668471526454419'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8262702061329066701/posts/default/807668471526454419'/><link rel='alternate' type='text/html' href='http://alevouilloz.blogspot.com/2009/01/python-para-todos.html' title='Python para todos!'/><author><name>Ale Vouilloz</name><uri>http://www.blogger.com/profile/11465620039351753180</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8262702061329066701.post-8579645598507608180</id><published>2009-01-09T13:36:00.004-02:00</published><updated>2009-01-09T21:00:21.573-02:00</updated><title type='text'>Apertura del blog</title><content type='html'>Antes que nada, bienvenidos a mi blog!&lt;br /&gt;&lt;br /&gt;En este lugar encontraran información sobre tecnologia y programación&lt;span style="font-weight: bold;"&gt;. &lt;/span&gt;Publicare experiencias vividas en mi carrera que espero sirvan de ayuda a los demás.&lt;br /&gt;&lt;br /&gt;Este blog va ser una forma de devolver el conocimiento de todo lo que he aprendido.&lt;br /&gt;&lt;br /&gt;Espero que les sea grato y nuevamente bienvenidos!!!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8262702061329066701-8579645598507608180?l=alevouilloz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://alevouilloz.blogspot.com/feeds/8579645598507608180/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://alevouilloz.blogspot.com/2009/01/apertura-del-blog.html#comment-form' title='6 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8262702061329066701/posts/default/8579645598507608180'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8262702061329066701/posts/default/8579645598507608180'/><link rel='alternate' type='text/html' href='http://alevouilloz.blogspot.com/2009/01/apertura-del-blog.html' title='Apertura del blog'/><author><name>Ale Vouilloz</name><uri>http://www.blogger.com/profile/11465620039351753180</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>6</thr:total></entry></feed>
