<?xml version="1.0" encoding="UTF-8" standalone="no"?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:blogger="http://schemas.google.com/blogger/2008" xmlns:gd="http://schemas.google.com/g/2005" xmlns:georss="http://www.georss.org/georss" xmlns:openSearch="http://a9.com/-/spec/opensearchrss/1.0/" xmlns:thr="http://purl.org/syndication/thread/1.0"><id>tag:blogger.com,1999:blog-6716238501579208177</id><updated>2024-08-28T12:31:52.015+02:00</updated><category term="Java"/><category term="PFC"/><category term="Ruby"/><category term="EII"/><category term="EUITIO"/><category term="Log4J"/><category term="Metodologías"/><category term="Navidad"/><category term="Scrum"/><category term="Twitter"/><title type="text">Diario de un Proyectante</title><subtitle type="html">Curiosidades que se encuentra un estudiante mientras hace su PFC</subtitle><link href="http://diariodeunproyectante.blogspot.com/feeds/posts/default" rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml"/><link href="http://www.blogger.com/feeds/6716238501579208177/posts/default?redirect=false" rel="self" type="application/atom+xml"/><link href="http://diariodeunproyectante.blogspot.com/" rel="alternate" type="text/html"/><link href="http://pubsubhubbub.appspot.com/" rel="hub"/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/10453934652458334861</uri><email>noreply@blogger.com</email><gd:image height="16" rel="http://schemas.google.com/g/2005#thumbnail" src="https://img1.blogblog.com/img/b16-rounded.gif" width="16"/></author><generator uri="http://www.blogger.com" version="7.00">Blogger</generator><openSearch:totalResults>6</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><xhtml:meta content="noindex" name="robots" xmlns:xhtml="http://www.w3.org/1999/xhtml"/><entry><id>tag:blogger.com,1999:blog-6716238501579208177.post-9039905651735928084</id><published>2012-01-25T23:19:00.001+01:00</published><updated>2012-01-25T23:34:26.452+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="PFC"/><category scheme="http://www.blogger.com/atom/ns#" term="Twitter"/><title type="text">Diseccionando un Tweet</title><content type="html">&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://3.bp.blogspot.com/-etau40PVBe8/TyCCeQsnb_I/AAAAAAAAANA/a2Kud3zb0vo/s1600/twitter_logo_top_bar.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="37" src="http://3.bp.blogspot.com/-etau40PVBe8/TyCCeQsnb_I/AAAAAAAAANA/a2Kud3zb0vo/s200/twitter_logo_top_bar.png" width="200" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
Volvemos a la carga después de un mes de descanso navideño con el que entre vacaciones y exámenes me ha sido imposible actualizar. El de hoy es un artículo que espero que llegue a más gente de la habitual puesto que se trata algo de carácter más general y que usan millones de personas.&lt;br /&gt;
&lt;br /&gt;
Aprovechando un estudio que he tenido que hacer para mi PFC, he tenido que investigar qué campos se envían en un &lt;b&gt;tweet&lt;/b&gt;. Es fácil pensar que apenas viajará información en esa cajita que nos presenta &lt;a href="http://www.twitter.com/"&gt;Twitter&lt;/a&gt; para escribir nuestros pensamientos o &lt;i&gt;Lo que está pasando &lt;/i&gt;pero nada más lejos de la realidad, un tweet es una cantidad bestial de &lt;b&gt;información&lt;/b&gt; donde casi lo que menos importa es lo que estás poniendo en la cajita.&lt;br /&gt;
&lt;br /&gt;
La información está separada por 2 partes, por un lado las partes que están documentadas por &lt;b&gt;Twitter&lt;/b&gt; y por otro las que se han tenido que investigar.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Información de un Tweet documentada&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;
{"id"=&amp;gt;id del tweet,&lt;br /&gt;
"text"=&amp;gt;texto del tweet,&lt;br /&gt;
"created_at"=&amp;gt;fecha de creación del tweet,&lt;br /&gt;
"in_reply_to_user_id"=&amp;gt;id del usuario al que le hace reply,&lt;br /&gt;
"in_reply_to_screen_name"=&amp;gt;nombre del usuario al que le hace reply,&lt;br /&gt;
"in_reply_to_status_id"=&amp;gt;id del tweet al que se le hace reply,&lt;br /&gt;
"favorited"=&amp;gt;favorito,&lt;br /&gt;
"truncated"=&amp;gt;si está cortado el texto por exceder los 140 caracteres,&lt;br /&gt;
"user"=&amp;gt;&lt;br /&gt;
{"id"=&amp;gt;id del usuario,&lt;br /&gt;
"screen_name"=&amp;gt;alias,&lt;br /&gt;
"name"=&amp;gt;nombre,&lt;br /&gt;
"description"=&amp;gt; bio,&lt;br /&gt;
"url"=&amp;gt;página personal,&lt;br /&gt;
"location"=&amp;gt;localización,&lt;br /&gt;
"profile_background_color"=&amp;gt;color del fondo del perfil,&lt;br /&gt;
"profile_background_image_url"=&amp;gt;url de la imagen del fondo de perfil,&lt;br /&gt;
"profile_background_tile"=&amp;gt;si tiene o no definido un tile,&lt;br /&gt;
"profile_image_url"=&amp;gt;url de la imagen de perfil,&lt;br /&gt;
"profile_link_color"=&amp;gt;color del link del perfil,&lt;br /&gt;
"profile_sidebar_border_color"=&amp;gt;color del borde de la barra lateral del perfil,&lt;br /&gt;
"profile_sidebar_fill_color"=&amp;gt;color de relleno de la barra lateral del perfil,&lt;br /&gt;
"profile_text_color"=&amp;gt;color del texto del perfil,&lt;br /&gt;
"created_at"=&amp;gt;fecha de creación de la cuenta,&lt;br /&gt;
"contributors_enabled"=&amp;gt;si permite colaboradores en la cuenta,&lt;br /&gt;
"favourites_count"=&amp;gt;tweets favoritos,&lt;br /&gt;
"statuses_count"=&amp;gt;tweets enviados,&lt;br /&gt;
"friends_count"=&amp;gt;following,&lt;br /&gt;
"time_zone"=&amp;gt;zona horaria,&lt;br /&gt;
"utc_offset"=&amp;gt;desfase horario,&lt;br /&gt;
"lang"=&amp;gt;idioma,&lt;br /&gt;
"protected"=&amp;gt;si tiene la cuenta protegida,&lt;br /&gt;
"followers_count"=&amp;gt;followers,&lt;br /&gt;
"geo_enabled"=&amp;gt;si está la geolocalización activada,&lt;br /&gt;
"notifications"=&amp;gt;si tiene notificaciones activadas,&lt;br /&gt;
"following"=&amp;gt;DEPRECATED/DESACTUALIZADO,&lt;br /&gt;
"verified"=&amp;gt;si es cuenta verificada},&lt;br /&gt;
"contributors"=&amp;gt;id de los colaboradores,&lt;br /&gt;
"geo"=&amp;gt;DEPRECATED/DESACTUALIZADO,&lt;br /&gt;
"coordinates"=&amp;gt;coordenadas de la localización,&lt;br /&gt;
"place"=&amp;gt;&lt;br /&gt;
{"id"=&amp;gt;id del lugar,&lt;br /&gt;
"url"=&amp;gt;url que almacena metainformación adicional,&lt;br /&gt;
"name"=&amp;gt;nombre del lugar,&lt;br /&gt;
"full_name"=&amp;gt;nombre completo,&lt;br /&gt;
"place_type"=&amp;gt;tipo de lugar,&lt;br /&gt;
"country_code"=&amp;gt;código del país,&lt;br /&gt;
"country"=&amp;gt;país,&lt;br /&gt;
"bounding_box"=&amp;gt;&lt;br /&gt;
{"coordinates"=&amp;gt;coordenadas del lugar,&lt;br /&gt;
"type"=&amp;gt;tipo de forma que representan las coordenadas}},&lt;br /&gt;
"source"=&amp;gt;fuente de publicación}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Información de un Tweet que se ha tenido que investigar&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
{“annotations”=&amp;gt; ampliación de futuro, todavía no implementado,&lt;br /&gt;
“contributors”=&amp;gt;&lt;br /&gt;
{“id_str”=&amp;gt;id en string del colaborador,&lt;br /&gt;
“screen_name”=&amp;gt;nombre del colaborador},&lt;br /&gt;
“entities”=&amp;gt;&lt;br /&gt;
{“hashtags”=&amp;gt;&lt;br /&gt;
{“indices”=&amp;gt;dónde se encuentra el hashtag (inicio,fin),&lt;br /&gt;
“text”=&amp;gt;hashtag},&lt;br /&gt;
“urls”=&amp;gt;&lt;br /&gt;
{“indices”=&amp;gt;dónde se encuentra la url en el tweet,&lt;br /&gt;
“url”=&amp;gt;url mostrada en el tweet,&lt;br /&gt;
“display_url”=&amp;gt;url intermedia,&lt;br /&gt;
“expanded_url”=&amp;gt;url expandida},&lt;br /&gt;
“media”=&amp;gt;&lt;br /&gt;
{“type”=&amp;gt;tipo de contenido,&lt;br /&gt;
“sizes”=&amp;gt;&lt;br /&gt;
{“thumb”=&amp;gt;información del thumb,&lt;br /&gt;
“size”=&amp;gt;&lt;br /&gt;
{“h”=&amp;gt;altura,&lt;br /&gt;
“resize”=&amp;gt;tipo de cambio de tamaño,&lt;br /&gt;
“w”=&amp;gt;ancho},&lt;br /&gt;
“large”=&amp;gt;información de la versión larga,&lt;br /&gt;
“medium”=&amp;gt;información de la versión normal,&lt;br /&gt;
“small”=&amp;gt;información de la versión normal},&lt;br /&gt;
“índices”=&amp;gt;dónde se encuentra la url,&lt;br /&gt;
“url”=&amp;gt;url del contenido mostrada al cliente,&lt;br /&gt;
“media_url”=&amp;gt;url que apunta directamente al contenido,&lt;br /&gt;
“display_url”=&amp;gt;url mostrada,&lt;br /&gt;
“expanded_url”=&amp;gt;url completa,&lt;br /&gt;
“id”=&amp;gt;id del contenido,&lt;br /&gt;
“id_str”=&amp;gt;id en string del contenido,&lt;br /&gt;
“media_url_https”=&amp;gt;url https del contenido},&lt;br /&gt;
“user_mentions”=&amp;gt;&lt;br /&gt;
{“id=&amp;gt;id del usuario mencionado,&lt;br /&gt;
“id_str”=&amp;gt;id del usuario mencionado en string,&lt;br /&gt;
“índices”=&amp;gt;índices entre los cuales se encuentra la mención,&lt;br /&gt;
“name”=&amp;gt;nombre del usuario mencionado,&lt;br /&gt;
“screen_name”=&amp;gt;versión screen del nombre del usuario mencionado},&lt;br /&gt;
},&lt;br /&gt;
“id_str”=&amp;gt;id del tweet en string,&lt;br /&gt;
“in_reply_to_status_id_str”=&amp;gt;id en string del usuario al que le hace el reply,&lt;br /&gt;
“retweet_count”=&amp;gt;número de veces que se ha retwiteado,&lt;br /&gt;
“retweeted”=&amp;gt;si es un retwiteo,&lt;br /&gt;
“user”=&amp;gt;&lt;br /&gt;
{“id_str”=&amp;gt;id en string del usuario,&lt;br /&gt;
“default_profile”=&amp;gt;perfil por defecto,&lt;br /&gt;
“default_profile_image”=&amp;gt;imagen por defecto del perfil,&lt;br /&gt;
“follow_request_sent”=&amp;gt;petición de follow enviada,&lt;br /&gt;
“is_translator”=&amp;gt;esta traducido,&lt;br /&gt;
“listed_count”=&amp;gt;listas que posee,&lt;br /&gt;
“profile_background_image_url_https”=&amp;gt;url https de la imagen del fondo de perfil,&lt;br /&gt;
“profile_image_url_https”=&amp;gt;url https de la imagen de perfil,&lt;br /&gt;
“profile_use_background_image”=&amp;gt;si usa una imagen de fondo de perfil,&lt;br /&gt;
“show_all_inline_media”=&amp;gt;si muestra todo el contenido multimedia,},&lt;br /&gt;
}&lt;br /&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Pues "solo" esto es lo que viaja en cada tweet que sale enviado cada vez que le dais al botón de publicar. Además esto es algo público y que puede tener acceso cualquier persona puesto que acceder al Streaming de Twitter es excesivamente sencillo (desde el punto de vista del desarrollador) y se ha optado por utilizar el formato en el que Twitter te proporciona la información (JSON).&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Por otro lado, con el tema de las limitaciones de los servidores de descarga directa, he solucionado el problema que había al descargar el proyecto de &lt;a href="http://diariodeunproyectante.blogspot.com/2011/12/log4j-aprendiendo-hacer-trazas.html"&gt;Log4J&lt;/a&gt; que estaba subido en fileserve, ya está operativo el enlace otra vez.&lt;br /&gt;
&lt;br /&gt;
Fuente de la imagen: &lt;a href="http://www.twitter.com/"&gt;Twitter&lt;/a&gt;&lt;/div&gt;</content><link href="http://diariodeunproyectante.blogspot.com/feeds/9039905651735928084/comments/default" rel="replies" title="Enviar comentarios" type="application/atom+xml"/><link href="http://diariodeunproyectante.blogspot.com/2012/01/diseccionando-un-tweet.html#comment-form" rel="replies" title="0 comentarios" type="text/html"/><link href="http://www.blogger.com/feeds/6716238501579208177/posts/default/9039905651735928084" rel="edit" type="application/atom+xml"/><link href="http://www.blogger.com/feeds/6716238501579208177/posts/default/9039905651735928084" rel="self" type="application/atom+xml"/><link href="http://diariodeunproyectante.blogspot.com/2012/01/diseccionando-un-tweet.html" rel="alternate" title="Diseccionando un Tweet" type="text/html"/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/10453934652458334861</uri><email>noreply@blogger.com</email><gd:image height="16" rel="http://schemas.google.com/g/2005#thumbnail" src="https://img1.blogblog.com/img/b16-rounded.gif" width="16"/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="http://3.bp.blogspot.com/-etau40PVBe8/TyCCeQsnb_I/AAAAAAAAANA/a2Kud3zb0vo/s72-c/twitter_logo_top_bar.png" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6716238501579208177.post-5570568678774644476</id><published>2011-12-24T12:59:00.000+01:00</published><updated>2011-12-24T12:59:52.242+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Metodologías"/><category scheme="http://www.blogger.com/atom/ns#" term="Scrum"/><title type="text">Metodologías Ágiles: Adaptando Scrum</title><content type="html">Una cosa que encontré curiosa en el desarrollo de mi PFC es que no quisimos seguir una metodología tan encorsetada y 'obsoleta' como es el caso de &lt;a href="http://administracionelectronica.gob.es/?_nfpb=true&amp;amp;_pageLabel=P60085901274201580632&amp;amp;langPae=es"&gt;métrica V3&lt;/a&gt;, en este caso nos apeteció añadir un poco de variedad a la amplia gama de proyectos que hay presentados en esta metodología (y que por ende cuando revisas las documentaciones terminan siendo todos iguales), por ello mi co-director (&lt;a href="https://twitter.com/#!/brenes"&gt;@brenes&lt;/a&gt;) decidió que podría ser bueno una especie de 'revisión' de una metodología ágil como puede ser &lt;a href="http://es.wikipedia.org/wiki/Scrum"&gt;Scrum&lt;/a&gt;. Vamos a ver a grandes rasgos que es lo que hicimos:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;Icebox&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
Para comenzar con el análisis, lo primero que hicimos fue realizar una "lista a los reyes magos", que no dejan de ser los requisitos que queremos que vaya a cumplir (por descabellados que sean) el proyecto que se va a desarrollar.&lt;br /&gt;
&lt;br /&gt;
Esta lista se hace definiendo una serie de roles (actores) al estilo:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;Usuario: &lt;/b&gt;Usuario de la aplicación.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Desarrollador: &lt;/b&gt;Programador que realizará el código de la aplicación.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Cliente: &lt;/b&gt;Aplicación que puede conectarse a mi proyecto.&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;
Una vez tenemos los actores definidos, pasamos a realizar la lista de requisitos de esta forma:&lt;br /&gt;
&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;&amp;nbsp;Como usuario&lt;/b&gt;, quiero poder subir mis propias producciones.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Como desarrollador&lt;/b&gt;, quiero que mi aplicación pueda repartir la carga de trabajo como si fuera una botnet.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Como cliente&lt;/b&gt;, me gustaría poder tener una API para extender funcionalidad.&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Como he dicho, esto son unos ejemplos de cómo podría ser una lista de requisitos &lt;b&gt;Icebox&lt;/b&gt;. También se puede enfocar como una tormenta de ideas en la cual se vayan añadiendo lo que se ocurra que puede encajar (más adelante se hará una criba).&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Lo ideal de los requisitos que aparezcan aquí es que se puedan realizar en un &lt;b&gt;Sprint&lt;/b&gt;, de tal forma que si los hay que sean más duraderos, habrá que desmenuzarlos en requisitos más pequeños para que encajen.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;b&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;Sprint&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
&lt;b&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Un &lt;b&gt;Sprint &lt;/b&gt;es un ciclo de trabajo incremental (una especie de desarrollo por hitos), de tal forma que siempre se tiene una versión funcional para el cliente en caso de que solicite verla. Aquí viene una de las modificaciones que adaptamos, normalmente un &lt;b&gt;Sprint&lt;/b&gt; debe ser de corta duración pero como se está realizando el proyecto a la vez que se realiza el tercer curso de la carrera, no hay más remedio que alargarlo a casi un mes por &lt;b&gt;Sprint&lt;/b&gt;.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;b&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;Backlog&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
&lt;b&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
&lt;b&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span"&gt;Una vez realizada la &lt;b&gt;Icebox &lt;/b&gt;con nuestras más alocadas ideas, toca el turno de hacer una especie de lista definitiva de requisitos a implementar (que se puede ajustar después de cada &lt;b&gt;Sprint&lt;/b&gt;), aquí lo que se hace es cribar la lista anterior (llegar a un acuerdo con el cliente) para ver qué requisitos finalmente se implementan y además, se les dará una puntuación de 1-10 entre los expertos de la materia (lenguaje) a cada uno para valorar qué debe entrar en cada &lt;b&gt;Sprint&lt;/b&gt;. De esta forma, a lo mejor es viable incluir 2 o más requisitos en un &lt;b&gt;Sprint&lt;/b&gt;, dejar uno sólo por ser excesivamente denso, aprovechar para redesmenuzar los requisitos, etc.&amp;nbsp;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span"&gt;Aquí viene otra de nuestras adaptaciones. Para valorar estos requisitos, hace falta ser un experto en la materia y poder ponderarlos en función del tiempo que va a llevar desarrollarlos (también sería idóneo que los desarrolladores fueran expertos) puesto que una mala planificación hace que el proyecto comience de forma mal y ya se sabe:&amp;nbsp;&lt;i&gt;lo que mal comienza, mal acaba&lt;/i&gt;.&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span"&gt;Una vez hecho el &lt;b&gt;Backlog&lt;/b&gt;, ya solo queda organizar los requisitos en &lt;b&gt;Sprints&lt;/b&gt;&amp;nbsp;y realizar reuniones por cada uno de los &lt;b&gt;Sprints&lt;/b&gt;&amp;nbsp;para ver cómo evoluciona el trabajo y poder mostrar ese desarrollo incremental.&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span"&gt;Hasta aquí este post navideño que espero sirva también para el &lt;a href="http://devtechproject.org/"&gt;"DevTech Project"&lt;/a&gt;.&lt;/span&gt;&lt;/div&gt;</content><link href="http://diariodeunproyectante.blogspot.com/feeds/5570568678774644476/comments/default" rel="replies" title="Enviar comentarios" type="application/atom+xml"/><link href="http://diariodeunproyectante.blogspot.com/2011/12/metodologias-agiles-adaptando-scrum.html#comment-form" rel="replies" title="0 comentarios" type="text/html"/><link href="http://www.blogger.com/feeds/6716238501579208177/posts/default/5570568678774644476" rel="edit" type="application/atom+xml"/><link href="http://www.blogger.com/feeds/6716238501579208177/posts/default/5570568678774644476" rel="self" type="application/atom+xml"/><link href="http://diariodeunproyectante.blogspot.com/2011/12/metodologias-agiles-adaptando-scrum.html" rel="alternate" title="Metodologías Ágiles: Adaptando Scrum" type="text/html"/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/10453934652458334861</uri><email>noreply@blogger.com</email><gd:image height="16" rel="http://schemas.google.com/g/2005#thumbnail" src="https://img1.blogblog.com/img/b16-rounded.gif" width="16"/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6716238501579208177.post-8423284151353767215</id><published>2011-12-21T16:52:00.000+01:00</published><updated>2011-12-21T23:44:36.464+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Navidad"/><title type="text">¡Feliz Navidad!</title><content type="html">&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhRhSByYl7KTINoo9IRmQKJBdZejXqgeD1j73zB3-hJtkYoV34AOkDXwAumanrBdxSw3ppAZwN9B62g0-1XXoBl40vl4KFBCqvWvi2KzkT2WODQH_vL-gCGpUvMVBQXhztmiFVQaFGC_D_b/s1600/20111221_Felices_Fiestas.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="185" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhRhSByYl7KTINoo9IRmQKJBdZejXqgeD1j73zB3-hJtkYoV34AOkDXwAumanrBdxSw3ppAZwN9B62g0-1XXoBl40vl4KFBCqvWvi2KzkT2WODQH_vL-gCGpUvMVBQXhztmiFVQaFGC_D_b/s400/20111221_Felices_Fiestas.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
Desde &lt;b&gt;Diario de un Proyectante&lt;/b&gt; quiero desearles a todos los lectores una feliz navidad, unas felices fiestas y que disfruten de las fiestas que tienen por venir estos días pero ¡ojo! con cuidado que no quiero perder a ningún lector por algún exceso :)</content><link href="http://diariodeunproyectante.blogspot.com/feeds/8423284151353767215/comments/default" rel="replies" title="Enviar comentarios" type="application/atom+xml"/><link href="http://diariodeunproyectante.blogspot.com/2011/12/feliz-navidad.html#comment-form" rel="replies" title="0 comentarios" type="text/html"/><link href="http://www.blogger.com/feeds/6716238501579208177/posts/default/8423284151353767215" rel="edit" type="application/atom+xml"/><link href="http://www.blogger.com/feeds/6716238501579208177/posts/default/8423284151353767215" rel="self" type="application/atom+xml"/><link href="http://diariodeunproyectante.blogspot.com/2011/12/feliz-navidad.html" rel="alternate" title="¡Feliz Navidad!" type="text/html"/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/10453934652458334861</uri><email>noreply@blogger.com</email><gd:image height="16" rel="http://schemas.google.com/g/2005#thumbnail" src="https://img1.blogblog.com/img/b16-rounded.gif" width="16"/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhRhSByYl7KTINoo9IRmQKJBdZejXqgeD1j73zB3-hJtkYoV34AOkDXwAumanrBdxSw3ppAZwN9B62g0-1XXoBl40vl4KFBCqvWvi2KzkT2WODQH_vL-gCGpUvMVBQXhztmiFVQaFGC_D_b/s72-c/20111221_Felices_Fiestas.jpg" width="72"/><thr:total>0</thr:total><georss:featurename>Oviedo, España</georss:featurename><georss:point>43.3602994 -5.844781</georss:point><georss:box>43.2679429 -6.0027095 43.4526559 -5.6868525000000005</georss:box></entry><entry><id>tag:blogger.com,1999:blog-6716238501579208177.post-3580105943160618701</id><published>2011-12-20T20:45:00.002+01:00</published><updated>2011-12-20T23:27:02.439+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Java"/><category scheme="http://www.blogger.com/atom/ns#" term="Ruby"/><title type="text">Haciendo aplicaciones parametrizables (Properties+YAML)</title><content type="html">Tras casi una semana sin publicar nada, toca hacer un post interlinguístico que va a tocar los palos de Java y de Ruby, es más, vamos a ver como podemos hacer aplicaciones configurables en ambos lenguajes.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;span style="font-size: large;"&gt;¿Por qué tener aplicaciones configurables?&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Es bastante común tener aplicaciones configurables que nos permitan modificar parámetros de la misma 'en caliente/on the fly' sin tener que recompilar todo el código. No es de recibo tener que recompilar toda una aplicación y parar todo un sistema en producción única y exclusivamente por el hecho de modificar un valor, como puede ser por ejemplo el IVA que se aplica actualmente o la base de datos que estamos usando (ahí habría que preveer otras cosas pero podría hacerse en caliente también).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;span style="font-size: large;"&gt;Properties&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
A ver si os gusta la solución que os propongo. Introducir todos estos parámetros hard-coded (que están grabados a fuego en la aplicación) y sacarlos para un fichero que más o menos podemos considerar estándar y del que los recogeremos y podremos modificarlos a nuestro antojo.&lt;br /&gt;
Para hacer esto, existen en Java unos ficheros que se llaman properties y que el propio lenguaje tiene unas funciones para recoger esta información de ellos y utilizarla.&lt;br /&gt;
Éstos ficheros lo único que contienen dentro es una línea por cada campo en forma de pares clave,valor. En el post referido a &lt;a href="http://diariodeunproyectante.blogspot.com/2011/12/log4j-aprendiendo-hacer-trazas.html"&gt;Log4J&lt;/a&gt; definimos un archivo Properties para la configuración de los loggers.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Definición de un archivo Properties:&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;i&gt;config.properties&lt;/i&gt;&lt;br /&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;span style="color: #6aa84f;"&gt;#iva aplicable&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;span style="color: #3d85c6;"&gt;IVA&lt;/span&gt;=&lt;span style="color: #e69138;"&gt;18&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;span style="color: #6aa84f;"&gt;#descuento del producto&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;span style="color: #3d85c6;"&gt;descuento.producto&lt;/span&gt;=&lt;span style="color: #e69138;"&gt;2&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Uso del archivo:&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;
He creado una aplicación en Eclipse muy sencilla que usa un properties para almacenar el descuento de un producto y el iva que hay en el momento.&lt;br /&gt;
&lt;br /&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;a href="http://www.fileserve.com/file/6wmMYx4/[Blog]EjemploProperties.zip"&gt;Proyecto de Eclipse&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Como podemos comprobar en el ejemplo, podríamos cambiar los valores del properties mientras se está ejecutando la aplicación puesto que se carga el fichero cada vez que hacemos una llamada al &lt;i&gt;Helper&lt;/i&gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;span style="font-size: large;"&gt;YAML&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
En el caso de Ruby, existe algo parecido a estos properties, es el lenguaje &lt;a href="http://es.wikipedia.org/wiki/YAML"&gt;YAML&lt;/a&gt; (YAML Ain't Another Markup Language) y los ficheros .yml donde también definiremos estos pares clave,valor pero además nos permitirán añadir jerarquías que de cara a organizar información que nos vendrá de lujo debido a la facilidad que tienen estos ficheros para crecer.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Definición de un archivo YAML:&lt;/b&gt;&lt;br /&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;i&gt;config.yml&lt;/i&gt;&lt;br /&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;span style="color: #6aa84f;"&gt;#iva aplicable&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;span style="color: #3d85c6;"&gt;producto:&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: #3d85c6;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;iva:&lt;/span&gt; &lt;span style="color: #e69138;"&gt;18&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;span style="color: #6aa84f;"&gt;#descuento del producto&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;span style="color: #3d85c6;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style="color: #3d85c6;"&gt;descuento:&lt;/span&gt; &lt;span style="color: #e69138;"&gt;2&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Uso del archivo:&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Para usar el archivo yml, he hecho una mini aplicación (igual que la de Java) donde se ve el uso del yml.&lt;br /&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;a href="http://www.fileserve.com/file/ZVeCnXG/[Blog]PruebaYAML.zip"&gt;Proyecto en Ruby&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Podría ser interesante para aquél que no sepa nada de Ruby, para perderle el miedo que mirara un poco el código y viera que es bastante sencillo.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;span style="font-size: large;"&gt;Otros usos&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Como viene siendo habitual en el blog, los ejemplos que se presentan intentan ser lo más sencillos posible para que todo el mundo pueda entenderlo y hacer que le pique el gusanillo a cada uno. En una aplicación un poco más seria, el uso de estos properties estaría relegado a definir en ellos las bases de datos (ip del servidor, usuario, contraseña, base de datos, consultas, ...) , configuración de un servidor jboss, el espacio de nombres de Java &lt;a href="http://es.wikipedia.org/wiki/JNDI"&gt;JNDI&lt;/a&gt;&amp;nbsp;...&lt;br /&gt;
&lt;br /&gt;
Con esto finaliza el artículo relativo a parametrizar aplicaciones, cabe destacar que YAML no sólo se utiliza para parametrizar aplicaciones (en Ruby mayormente sí) y es multilenguaje. En la próxima entrega espero poder hablar sobre pruebas unitarias y concretamente de JUnit y el módulo Test de Ruby.</content><link href="http://diariodeunproyectante.blogspot.com/feeds/3580105943160618701/comments/default" rel="replies" title="Enviar comentarios" type="application/atom+xml"/><link href="http://diariodeunproyectante.blogspot.com/2011/12/haciendo-aplicaciones-parametrizables.html#comment-form" rel="replies" title="0 comentarios" type="text/html"/><link href="http://www.blogger.com/feeds/6716238501579208177/posts/default/3580105943160618701" rel="edit" type="application/atom+xml"/><link href="http://www.blogger.com/feeds/6716238501579208177/posts/default/3580105943160618701" rel="self" type="application/atom+xml"/><link href="http://diariodeunproyectante.blogspot.com/2011/12/haciendo-aplicaciones-parametrizables.html" rel="alternate" title="Haciendo aplicaciones parametrizables (Properties+YAML)" type="text/html"/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/10453934652458334861</uri><email>noreply@blogger.com</email><gd:image height="16" rel="http://schemas.google.com/g/2005#thumbnail" src="https://img1.blogblog.com/img/b16-rounded.gif" width="16"/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6716238501579208177.post-4922735888023872046</id><published>2011-12-12T22:32:00.001+01:00</published><updated>2012-01-25T22:35:15.749+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Java"/><category scheme="http://www.blogger.com/atom/ns#" term="Log4J"/><title type="text">Log4J, aprendiendo a hacer trazas</title><content type="html">&lt;div&gt;
Comenzamos esta andadura 2.0 con Java, para calentar motores aprenderemos a utilizar una herramienta muy útil que dará un valor añadido a nuestras aplicaciones. Log4J (Apache, Log for Java,&amp;nbsp;&lt;a href="http://logging.apache.org/log4j/1.2/"&gt;http://logging.apache.org/log4j/1.2/&lt;/a&gt;) es una forma fácil de tener un sistema de logging que nos permitirá "controlar" y monitorizar nuestras aplicaciones de forma transparente al usuario y sobretodo de una forma mucho más elegante que los típicos System.out.println de marras que son muy sencillos de insertar pero siempre podemos caer en el error de que se nos quede alguno sin borrar de nuestro código y eso da bastante mala imagen de cara a por ejemplo entregar una práctica (los mensajes aparecerán por consola) o presentar un trabajo más profesional.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Para todo lo relacionado con Java que aparezca en este post siempre se utilizará Eclipse como IDE debido a que es el más utilizado y gratuito, el proceso para utilizar otros (NetBeans por ejemplo) debería de ser análogo.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
&lt;b&gt;Obteniendo el JAR&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;
&lt;div&gt;
Antes de nada debemos de ir a este enlace y descargarnos el siguiente zip que contiene el jar:&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;a href="http://www.apache.org/dyn/closer.cgi/logging/log4j/1.2.16/apache-log4j-1.2.16.zip"&gt;http://apache.rediris.es//logging/log4j/1.2.16/apache-log4j-1.2.16.zip&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
en este enlace, pulsaremos sobre la versión HTTP y se nos descargará. Una vez lo tengamos en&amp;nbsp;nuestro&amp;nbsp;poder, descomprimiremos únicamente el archivo&amp;nbsp;&lt;i&gt;log4j-1.2.16.jar &lt;/i&gt;que es el que tiene la funcionalidad de Log4J.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
&lt;b&gt;Configurando el proyecto&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Ahora abriremos Eclipse, y crearemos un nuevo proyecto (File-&amp;gt;New..-&amp;gt;Java Proyect) , para este caso le llamaremos PruebaLog4J (por ejemplo). Una vez tengamos creado nuestro proyecto, añadiremos una carpeta "lib"(New-&amp;gt;Folder) que dependerá del proyecto y en la cual pegaremos (o descomprimiremos) el jar antes mencionado. Con el jar ya descomprimido en la carpeta "lib", haremos click derecho sobre el propio jar y en el ítem "Build Path" presionaremos sobre "Add to Build Path". Automáticamente se añadirá a nuestro path y podremos utilizarlo en nuestras clases.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjRQGRO9XHH7zBSyKUplAgHY8xTIm5UAz4SzMSuXtQhqAll5MZdDHS1Cj-kPk8CtsiuSVPDiq2tuCmVhbcx1_P5K3ojild-L0cuUrdypO66W2568xwtj1oc5FkVwptNJm75GsWGYxRcEOnP/s1600/estructura.JPG" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjRQGRO9XHH7zBSyKUplAgHY8xTIm5UAz4SzMSuXtQhqAll5MZdDHS1Cj-kPk8CtsiuSVPDiq2tuCmVhbcx1_P5K3ojild-L0cuUrdypO66W2568xwtj1oc5FkVwptNJm75GsWGYxRcEOnP/s1600/estructura.JPG" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Estructura final del proyecto&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;b&gt;Creando nuestra clase con Log4J&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
En este punto vamos a crear una clase donde probaremos los diferentes niveles de log que nos proporciona Log4J. Comenzaremos creando un paquete "test" (nunca utilizar default package) donde introduciremos una clase de prueba, por ejemplo PruebaLog4J y seleccionamos que nos genere el main también para ahorrarnos un poco en código.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Ya tenemos la clase sobre la cual hacer logging, para utilizar Log4J necesitaremos crear una instancia en todas las clases donde vayamos a usarla de la siguiente forma:&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgzaiF_XO-Q7mTZhoyGN3d95vbYiWRRU5ERAIgmfHyLP8L8chCLHB6pfeinVOYeOZu65reS5JHyCw0jZj3mVPTVEvLEjN7hyXNjyh79ASJKeRGFR-vCu8pkjNv5khJe0HgALW212P-SmfSt/s1600/logger.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgzaiF_XO-Q7mTZhoyGN3d95vbYiWRRU5ERAIgmfHyLP8L8chCLHB6pfeinVOYeOZu65reS5JHyCw0jZj3mVPTVEvLEjN7hyXNjyh79ASJKeRGFR-vCu8pkjNv5khJe0HgALW212P-SmfSt/s1600/logger.JPG" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/div&gt;
&lt;div&gt;
&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/div&gt;
&lt;div&gt;
Log4J por defecto utilizará una especie de &lt;a href="http://es.wikipedia.org/wiki/Singleton"&gt;Singleton&lt;/a&gt; (algún día escribiré sobre patrones) que se creará solo una vez y te dará la instancia cuando se necesite. Al método getLogger, le pasaremos siempre el nombre de la clase en la que estemos .class para que nos "personalice" los mensajes de log que nos mostrará.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Poseemos una variable logger, ¡usémosla!&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Vamos a comenzar con lo básico, dentro del método main introduzcamos esto:&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgDqfLN3hNOUx7b89wUxCn6-7U7mp-po8fEF-ocuzJX8QGHdRBwIvjLe880eDNsUHxdY8NZRROyPq-7wuoaoXVUY07WD3xDs8Vxa-cRJMStCNmObpBCP8lLIueU0PlOuA6jH79krmI8bV6M/s1600/logINFO.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgDqfLN3hNOUx7b89wUxCn6-7U7mp-po8fEF-ocuzJX8QGHdRBwIvjLe880eDNsUHxdY8NZRROyPq-7wuoaoXVUY07WD3xDs8Vxa-cRJMStCNmObpBCP8lLIueU0PlOuA6jH79krmI8bV6M/s1600/logINFO.JPG" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/div&gt;
&lt;div&gt;
&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/div&gt;
&lt;div&gt;
Con la sentencia de encima, conseguimos meter ese mensaje entrecomillado en nuestro log.&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Ahora toca hacerlo funcionar...&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Si intentamos ejecutar lo que hemos hecho hasta ahora, nos mostrará un error porque falta configurar cómo queremos que Log4J nos grabe los logs.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;b&gt;Configurando Log4J&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
Hay 2 formas de configurarlo, una más básica y que no quiero ver aquí porque nos interesa más entrar en cómo hacer una configuración más a medida y que cada uno la prepare a su gusto.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Para configurarlo, tenemos que crear un archivo log4j.properties (New-&amp;gt;File) dentro de "src" para que la biblioteca lo reconozca por defecto y dentro introduciremos el siguiente texto:&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span" style="background-color: white; color: #6aa84f;"&gt;# Niveles de Log&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span" style="background-color: white;"&gt;&lt;span class="Apple-style-span" style="color: #3d85c6;"&gt;log4j.rootLogger&lt;/span&gt;=&lt;span class="Apple-style-span" style="color: orange;"&gt;trace, stdout, R&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span" style="background-color: #cccccc;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span" style="background-color: white; color: #6aa84f;"&gt;# Configuracion del Appender de la consola&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span" style="background-color: white;"&gt;&lt;span class="Apple-style-span" style="color: #3d85c6;"&gt;log4j.appender.stdout&lt;/span&gt;=&lt;span class="Apple-style-span" style="color: orange;"&gt;org.apache.log4j.ConsoleAppender&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span" style="background-color: white; color: #6aa84f;"&gt;# Pattern to output the caller's file name and line number.&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span" style="background-color: white;"&gt;&lt;span class="Apple-style-span" style="color: #3d85c6;"&gt;log4j.appender.stdout.layout&lt;/span&gt;=&lt;span class="Apple-style-span" style="color: orange;"&gt;org.apache.log4j.PatternLayout&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span" style="background-color: white;"&gt;&lt;span class="Apple-style-span" style="color: #3d85c6;"&gt;log4j.appender.stdout.layout.ConversionPattern&lt;/span&gt;=&lt;span class="Apple-style-span" style="color: orange;"&gt;%5p [%t] (%F:%L) - %m%n&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span" style="background-color: white;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span" style="background-color: white; color: #6aa84f;"&gt;# Appender del fichero&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span" style="background-color: white;"&gt;&lt;span class="Apple-style-span" style="color: #3d85c6;"&gt;log4j.appender.R&lt;/span&gt;=&lt;span class="Apple-style-span" style="color: orange;"&gt;org.apache.log4j.RollingFileAppender&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span" style="background-color: white; color: #6aa84f;"&gt;# Path and file name to store the log file.&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span" style="background-color: white;"&gt;&lt;span class="Apple-style-span" style="color: #3d85c6;"&gt;log4j.appender.R.File&lt;/span&gt;=&lt;span class="Apple-style-span" style="color: orange;"&gt;./logs/testlog4j.log&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span" style="background-color: white;"&gt;&lt;span class="Apple-style-span" style="color: #3d85c6;"&gt;log4j.appender.R.MaxFileSize&lt;/span&gt;=&lt;span class="Apple-style-span" style="color: orange;"&gt;500KB&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span" style="background-color: white; color: #6aa84f;"&gt;# Manten solo un fichero&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span" style="background-color: white;"&gt;&lt;span class="Apple-style-span" style="color: #3d85c6;"&gt;log4j.appender.R.MaxBackupIndex&lt;/span&gt;=&lt;span class="Apple-style-span" style="color: orange;"&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span" style="background-color: white; color: #6aa84f;"&gt;# Plantilla del fichero&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span" style="background-color: white;"&gt;&lt;span class="Apple-style-span" style="color: #3d85c6;"&gt;log4j.appender.R.layout&lt;/span&gt;=&lt;span class="Apple-style-span" style="color: orange;"&gt;org.apache.log4j.PatternLayout&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span" style="background-color: white;"&gt;&lt;span class="Apple-style-span" style="color: #3d85c6;"&gt;log4j.appender.R.layout.ConversionPattern&lt;/span&gt;=&lt;span class="Apple-style-span" style="color: orange;"&gt;%d - %c - %p - %m%n&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span" style="background-color: #cccccc;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span" style="background-color: white;"&gt;&lt;i&gt;Lo seguido de # son comentarios.&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span" style="background-color: white;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span" style="background-color: white;"&gt;Vamos a intentar entender un poco qué definimos en estas líneas.&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
A grosso modo, un fichero .properties es un fichero de configuración que se basa en definir líneas de tipo clave=valor.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
La primera línea útil que nos encontramos es la siguiente:&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span" style="background-color: white;"&gt;&lt;span class="Apple-style-span" style="color: #3d85c6;"&gt;log4j.rootLogger&lt;/span&gt;=&lt;span class="Apple-style-span" style="color: orange;"&gt;trace, stdout, R&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span" style="background-color: #cccccc;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span" style="background-color: white;"&gt;Aquí estamos definiendo el log "maestro", que hará logging sobre todas las clases, le estamos indicando el nivel traza, por salida estándar y que lo llamaremos R.&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
Cada vez que veamos la R en el fichero, estamos haciendo referencia a este log que hemos definido aquí.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span" style="background-color: white;"&gt;&lt;span class="Apple-style-span" style="color: #3d85c6;"&gt;log4j.appender.stdout&lt;/span&gt;=&lt;span class="Apple-style-span" style="color: orange;"&gt;org.apache.log4j.ConsoleAppender&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span" style="background-color: #cccccc;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
Definimos un appender para la consola.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;br /&gt;
&lt;div&gt;
&lt;span class="Apple-style-span" style="background-color: white;"&gt;&lt;span class="Apple-style-span" style="color: #3d85c6;"&gt;log4j.appender.stdout.layout&lt;/span&gt;=&lt;span class="Apple-style-span" style="color: orange;"&gt;org.apache.log4j.PatternLayout&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span" style="background-color: white;"&gt;&lt;span class="Apple-style-span" style="color: #3d85c6;"&gt;log4j.appender.stdout.layout.ConversionPattern&lt;/span&gt;=&lt;span class="Apple-style-span" style="color: orange;"&gt;%5p [%t] (%F:%L) - %m%n&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span" style="background-color: #cccccc;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
Definimos que layout (estilo) llevará nuestro log y debajo definiremos el patrón que queramos que siga.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span" style="background-color: white;"&gt;&lt;span class="Apple-style-span" style="color: #3d85c6;"&gt;log4j.appender.R&lt;/span&gt;=&lt;span class="Apple-style-span" style="color: orange;"&gt;org.apache.log4j.RollingFileAppender&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span" style="background-color: #cccccc;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span" style="background-color: white;"&gt;Definimos otro appender con nuestro ROOT, queremos que sea un RollingFileAppender, eso quiere decir que queremos que nos cree un fichero de texto con el log (opción fundamental de un log).&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span" style="background-color: white;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;br /&gt;
&lt;div&gt;
&lt;span class="Apple-style-span" style="background-color: white;"&gt;&lt;span class="Apple-style-span" style="color: #3d85c6;"&gt;log4j.appender.R.File&lt;/span&gt;=&lt;span class="Apple-style-span" style="color: orange;"&gt;./logs/testlog4j.log&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span" style="background-color: white;"&gt;&lt;span class="Apple-style-span" style="color: #3d85c6;"&gt;log4j.appender.R.MaxFileSize&lt;/span&gt;=&lt;span class="Apple-style-span" style="color: orange;"&gt;500KB&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span" style="background-color: white;"&gt;&lt;span class="Apple-style-span" style="color: #3d85c6;"&gt;log4j.appender.R.MaxBackupIndex&lt;/span&gt;=&lt;span class="Apple-style-span" style="color: orange;"&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span" style="background-color: white;"&gt;&lt;span class="Apple-style-span" style="color: #3d85c6;"&gt;log4j.appender.R.layout&lt;/span&gt;=&lt;span class="Apple-style-span" style="color: orange;"&gt;org.apache.log4j.PatternLayout&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span" style="background-color: white;"&gt;&lt;span class="Apple-style-span" style="color: #3d85c6;"&gt;log4j.appender.R.layout.ConversionPattern&lt;/span&gt;=&lt;span class="Apple-style-span" style="color: orange;"&gt;%d - %c - %p - %m%n&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span" style="background-color: #cccccc;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span" style="background-color: white;"&gt;Aquí definimos lo relacionado con el log que hemos definido como ROOT, la ruta que tendrá el archivo (lo ideal es mantener esta estructura), el tamaño máximo que tendrá el archivo, los backups que quieres tener del fichero, qué layout seguirá y qué patrón seguirá.&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span" style="background-color: white;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span" style="background-color: white;"&gt;Podemos añadir tantos appenders como queramos y para que salgan por diferentes archivos (esto sería lo ideal para tener un control total de nuestro programa, pero no es realmente necesario).&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span" style="background-color: white;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
Con todo el fichero properties definido (y espero que más o menos entendido), ya podemos ejecutar nuestra aplicación, y así podemos ver los resultados.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Veremos&amp;nbsp;por consola un mensaje del tipo:&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgwdMDZeI8mFE6q0cFEBpJK4_Ro3pcKHtG4ORYGcT8bndM1XGoTv0SjGQ0AGwZdWl1oEfPa9ImnwAqTfskU1EbUrBX6Yj6QFq3-FFEHbL9_2qc6jZ9IyN5AelDAjU9l8kY30-booLXUE7c0/s1600/salida_consola.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgwdMDZeI8mFE6q0cFEBpJK4_Ro3pcKHtG4ORYGcT8bndM1XGoTv0SjGQ0AGwZdWl1oEfPa9ImnwAqTfskU1EbUrBX6Yj6QFq3-FFEHbL9_2qc6jZ9IyN5AelDAjU9l8kY30-booLXUE7c0/s1600/salida_consola.JPG" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/div&gt;
&lt;div&gt;
y en la carpeta logs aparecerá el fichero &lt;i&gt;pruebalog4j.log &lt;/i&gt;:&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjN6JyJsXR8XMRSFmBmJj_EQ3_IgYX0h0vQpkQCCSWUFUFf9ojsMhF8n6NIiUD8QZooOzFLWU5hBlovGHjxZfaj6DFBzLhr8mt-PvV20Uqi3ceSEORnFJthiELnZmf6mdKeMrvjeWWn-Ex9/s1600/pruebalog4j.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjN6JyJsXR8XMRSFmBmJj_EQ3_IgYX0h0vQpkQCCSWUFUFf9ojsMhF8n6NIiUD8QZooOzFLWU5hBlovGHjxZfaj6DFBzLhr8mt-PvV20Uqi3ceSEORnFJthiELnZmf6mdKeMrvjeWWn-Ex9/s1600/pruebalog4j.JPG" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/div&gt;
&lt;div&gt;
&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/div&gt;
&lt;div&gt;
&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/div&gt;
&lt;div&gt;
Ya tenemos nuestro log funcionando. Cada mensaje que queramos poner en nuestra aplicación, tendremos que hacer una sentencia como la anterior del tipo:&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style="background-color: white;"&gt;&lt;i&gt;logger.info("Otro mensaje para el log");&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/div&gt;
&lt;div&gt;
&lt;b&gt;&lt;i&gt;Recuerden que en cada clase hay que obtener el logger para usarlo.&lt;/i&gt;&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
&lt;b&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
&lt;b&gt;Niveles de Log&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
Ahora que ya sabemos como hacer nuestros logs, pasemos a ver qué es esto de los niveles de logging.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Existen 5 niveles en la jerarquía de logging que son de menor a mayor dureza: DEBUG, INFO, WARN, ERROR y FATAL.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
DEBUG: Usaremos este nivel cuando queramos ver por dónde va la traza, así tendremos un control exhaustivo de nuestros desarrollos.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
INFO: Aquí podemos definir información que puede ser útil del funcionamiento del programa, como por ejemplo decir que se están tomando correctamente unos parámetros.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
WARN: Utilizaremos este nivel para mostrar un&amp;nbsp;funcionamiento&amp;nbsp;anómalo de nuestra aplicación pero que no afectará al funcionamiento de la misma.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
ERROR: Utilizaremos este para decir que ha ocurrido un error.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
FATAL: Este es el nivel superior de la jerarquía y con él definiremos un error fatal de la aplicación que llevará a la finalización inmediata de la misma.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Que estos niveles siguen una jerarquía quiere decir que si definimos un log con nivel DEBUG se mostrarán todos los mensajes que definamos, desde los logger.debug("loquesea"); hasta los logger.fatal("estovamal");&lt;/div&gt;
&lt;div&gt;
Si por el contrario definimos un nivel FATAL, solo aparecerán los logger.fatal("estorompió");&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Así mismo, esto que acabo de escribir sirve para orientarse de cómo escribir diferentes niveles de log en nuestra aplicación.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;b&gt;Finalizando&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Ya hemos terminado, sólo queda que cada uno mire los patrones de cómo configurar los layouts y esa no es tarea fácil pero seguro que será muy reconfortante una vez se tiene definido como uno quiere puesto que hay infinidad de opciones. &lt;a href="http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/PatternLayout.html"&gt;Aquí &lt;/a&gt;estan todas.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Al principio comenté que a diferencia de los System.out.println el log podía quitarse para no dejar rastro en la ejecución, aquí entra otra vez el fichero properties y los niveles de la jerarquía. Lo ideal es poner un nivel INFO cuando se pasa a producción y tan sólo en el fichero, quitaríamos el appender de la consola. El código permanecerá en nuestros ficheros que una vez haya que mantener ese código, solo tendremos que reestablecer el nivel DEBUG.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Pues hasta aquí el primer post-tutorial de cómo conseguir definir nuestro propio sistema de Logging, espero que os haya servido de ayuda y ojalá alguien me comente sus experiencias y qué patrones ha seguido en sus configuraciones. Para ello, tenéis a vuestra disposición mi cuenta de Twitter &lt;a href="https://twitter.com/#!/minikisto"&gt;@Minikisto&lt;/a&gt;&amp;nbsp;y los comentarios de este mismo post. En la próxima entrega, probablemente nos centremos en JUnit y unas nociones básicas de estructuración de la información de un proyecto.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;b&gt;&lt;a href="http://db.tt/hlomcags"&gt;Proyecto de Eclipse&lt;/a&gt;&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Fuentes del artículo:&amp;nbsp;&lt;a href="http://logging.apache.org/log4j/1.2/manual.html"&gt;http://logging.apache.org/log4j/1.2/manual.html&lt;/a&gt;&lt;/div&gt;</content><link href="http://diariodeunproyectante.blogspot.com/feeds/4922735888023872046/comments/default" rel="replies" title="Enviar comentarios" type="application/atom+xml"/><link href="http://diariodeunproyectante.blogspot.com/2011/12/log4j-aprendiendo-hacer-trazas.html#comment-form" rel="replies" title="4 comentarios" type="text/html"/><link href="http://www.blogger.com/feeds/6716238501579208177/posts/default/4922735888023872046" rel="edit" type="application/atom+xml"/><link href="http://www.blogger.com/feeds/6716238501579208177/posts/default/4922735888023872046" rel="self" type="application/atom+xml"/><link href="http://diariodeunproyectante.blogspot.com/2011/12/log4j-aprendiendo-hacer-trazas.html" rel="alternate" title="Log4J, aprendiendo a hacer trazas" type="text/html"/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/10453934652458334861</uri><email>noreply@blogger.com</email><gd:image height="16" rel="http://schemas.google.com/g/2005#thumbnail" src="https://img1.blogblog.com/img/b16-rounded.gif" width="16"/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjRQGRO9XHH7zBSyKUplAgHY8xTIm5UAz4SzMSuXtQhqAll5MZdDHS1Cj-kPk8CtsiuSVPDiq2tuCmVhbcx1_P5K3ojild-L0cuUrdypO66W2568xwtj1oc5FkVwptNJm75GsWGYxRcEOnP/s72-c/estructura.JPG" width="72"/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6716238501579208177.post-6680922179221409105</id><published>2011-12-10T13:55:00.001+01:00</published><updated>2011-12-10T13:56:24.014+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="EII"/><category scheme="http://www.blogger.com/atom/ns#" term="EUITIO"/><category scheme="http://www.blogger.com/atom/ns#" term="Java"/><category scheme="http://www.blogger.com/atom/ns#" term="PFC"/><category scheme="http://www.blogger.com/atom/ns#" term="Ruby"/><title type="text">Presentación</title><content type="html">&lt;br /&gt;
&lt;br /&gt;
¡Hola! primero&amp;nbsp;déjenme&amp;nbsp;presentarme. Soy Daniel Machado Fernández y estoy cursando tercero en la Ingeniería Técnica en Informática en la Universidad de Oviedo a la par que estoy realizando el Proyecto Fin de Carrera (PFC).&lt;br /&gt;
&lt;br /&gt;
Bueno, ya me conocen, déjenme presentarles ahora el blog. Diario de un Proyectante pretende ser un cajón de sastre donde intentaré comentarles qué problemas me voy encontrando a lo largo de la realización de mi PFC, pero no solo eso, también me gustaría escribir sobre buenas prácticas a la hora de desarrollar software (sobretodo a utilizar las herramientas adecuadas). No quiero limitarlo a estos 2 puntos (que ya sería bastante), me gustaría poder escribir sobre lo que me apeteciera, sobretodo cosas que fueran útiles, que no se enseñan en la carrera de informática o al menos que no se enseñan en ninguna asignatura obligatoria/troncal y que si se quieren aprender se tienen que hacer por cuenta propia.&lt;br /&gt;
&lt;br /&gt;
Quiero que quede claro que en este blog se va a hablar sobre Ruby y Java dado que este último es el lenguaje base que se utiliza en mi Universidad y Ruby es el lenguaje que he escogido para realizar mi PFC por lo que son los lenguajes de los que más puedo hablar.&lt;br /&gt;
&lt;br /&gt;
No quiero que piensen que soy un experto Java ni mucho menos, ya he dicho que soy estudiante por lo que probablemente todo lo que les cuente ya lo conozcan pero eso no quiere decir que estas cosas no haya tenido que buscarlas en algún momento de la carrera, que me han sido útiles y que suelo utilizar en mi día a día.&lt;br /&gt;
&lt;br /&gt;
Por último para los que tengan curiosidad, voy a dejarles en este mismo post unos enlaces a tutoriales que he hecho en algún momento de mi vida sobre Java y Ruby que me han sido realmente útiles.&lt;br /&gt;
&lt;br /&gt;
Java:&amp;nbsp;&lt;a href="http://www.google.es/url?sa=t&amp;amp;rct=j&amp;amp;q=aprenda%20java%20como%20si%20estuvieras%20en%20primero&amp;amp;source=web&amp;amp;cd=1&amp;amp;sqi=2&amp;amp;ved=0CCUQFjAA&amp;amp;url=http%3A%2F%2Fwww.tecnun.es%2Fasignaturas%2FInformat1%2FAyudaInf%2Faprendainf%2FJava%2FJava2.pdf&amp;amp;ei=ukXjToz9K8bz-gbUtajpBQ&amp;amp;usg=AFQjCNH8gTeEWk9MtbH7WyA6joMp-fN1aA&amp;amp;sig2=YfbaDmp_XQaNGwCze-jVsg"&gt;Aprende Java como si estuvieras en Primero, de Tecnum&lt;/a&gt;&lt;br /&gt;
Ruby:&amp;nbsp;&lt;a href="http://www.rubyinside.com/media/poignant-guide.pdf"&gt;Why's (poignant) Guide to Ruby&lt;/a&gt;&amp;nbsp;(Inglés)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;a href="http://rubykoans.com/"&gt;Learn Ruby&lt;/a&gt;&amp;nbsp;(Inglés)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;a href="http://www.google.com/url?sa=t&amp;amp;rct=j&amp;amp;q=&amp;amp;esrc=s&amp;amp;source=web&amp;amp;cd=1&amp;amp;ved=0CCAQFjAA&amp;amp;url=http%3A%2F%2Fes.tldp.org%2FManuales-LuCAS%2Fdoc-guia-usuario-ruby%2Fguia-usuario-ruby.pdf&amp;amp;ei=GEfjTsy_CIue-Qagk7ywBQ&amp;amp;usg=AFQjCNG_rpdTQi6bymCwcQitvcwtcWHBAw&amp;amp;sig2=ts6q-K-F1JeL72HjuXnfbQ"&gt;Guía del usuario de Ruby&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Si quieren contactarme, pueden hacerlo en&amp;nbsp;&lt;a href="http://www.twitter.com/minikisto"&gt;Twitter&lt;/a&gt;&amp;nbsp;.</content><link href="http://diariodeunproyectante.blogspot.com/feeds/6680922179221409105/comments/default" rel="replies" title="Enviar comentarios" type="application/atom+xml"/><link href="http://diariodeunproyectante.blogspot.com/2011/12/presentacion.html#comment-form" rel="replies" title="0 comentarios" type="text/html"/><link href="http://www.blogger.com/feeds/6716238501579208177/posts/default/6680922179221409105" rel="edit" type="application/atom+xml"/><link href="http://www.blogger.com/feeds/6716238501579208177/posts/default/6680922179221409105" rel="self" type="application/atom+xml"/><link href="http://diariodeunproyectante.blogspot.com/2011/12/presentacion.html" rel="alternate" title="Presentación" type="text/html"/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/10453934652458334861</uri><email>noreply@blogger.com</email><gd:image height="16" rel="http://schemas.google.com/g/2005#thumbnail" src="https://img1.blogblog.com/img/b16-rounded.gif" width="16"/></author><thr:total>0</thr:total></entry></feed>