<?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-7770063199684332236</id><updated>2011-12-10T10:22:53.872+01:00</updated><title type='text'>JavaNullPointerException y otros petardazos.</title><subtitle type='html'>Blog de JF Jara que tratará de las aficiones que tengo, sobre todo dedicado a la programación e informática.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://javanullpointerexception.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7770063199684332236/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://javanullpointerexception.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Juan Francisco Jara</name><uri>http://www.blogger.com/profile/16237726399085307174</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>6</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-7770063199684332236.post-589329139813177480</id><published>2010-08-01T13:26:00.000+02:00</published><updated>2010-08-01T13:42:26.765+02:00</updated><title type='text'>Configuración de TileCache en Windows</title><content type='html'>Una de las cosas en la que estoy dedicando mi tiempo laboral, es a trabajar con servidores de mapas y visores en Javascript, como OpenLayers y Google Maps, enfocados como no, al desarrollo web con J2EE.&lt;br /&gt;&lt;br /&gt;Para poder usar nuestras propias capas, pues estoy usando MapServer, y para mejorar el rendimiento, he decidido usar TileCache. El problema de usar TileCache, es que, básicamente, es un cristo poder configurarlo (sobre todo con google maps).&lt;br /&gt;&lt;br /&gt;Instalarlo es poco intuitivo (según la documentación de su página web). Tras muchos cabezazos, he dado con la tecla. Voy a describir uno a uno los pasos a seguir:&lt;br /&gt;&lt;br /&gt;1 - Debemos descomprimir TileCache en una carpeta accesible via web. Yo he optado de instalarlo en la carpeta htdocs del Apache que incorpora mi MapServer (C:\ms4w\Apache\htdocs\tilecache)&lt;br /&gt;&lt;br /&gt;2 - Instalar Python en el equipo. Yo he instalado la versión 2.7&lt;br /&gt;&lt;br /&gt;3 - Abrimos y editamos el fichero httpd.conf de Apache (C:\ms4w\Apache\conf) y añadimos lo siguiente:&lt;br /&gt;&lt;br /&gt;&lt;meta content="text/html; charset=utf-8" equiv="Content-Type"&gt;&lt;meta content="Word.Document" name="ProgId"&gt;&lt;meta content="Microsoft Word 11" name="Generator"&gt;&lt;meta content="Microsoft Word 11" name="Originator"&gt;&lt;link href="file:///C:%5CDOCUME%7E1%5Cviavansi%5CCONFIG%7E1%5CTemp%5Cmsohtml1%5C01%5Cclip_filelist.xml" rel="File-List"&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";}@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:"Tabla 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;div class="MsoNormal"&gt;&lt;span lang="EN-GB"&gt;Directory "C:/ms4w/Apache/htdocs/tilecache/"&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;span lang="EN-GB"&gt;&lt;span&gt;     &lt;/span&gt;AddHandler cgi-script .cgi&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;span lang="EN-GB"&gt;&lt;span&gt;     &lt;/span&gt;Options +ExecCGI&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;span lang="EN-GB"&gt;/Directory &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="MsoNormal"&gt;&lt;span lang="EN-GB"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;span lang="EN-GB"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;span lang="EN-GB"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;span lang="EN-GB"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;span lang="EN-GB"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;div class="MsoNormal"&gt;&lt;span lang="EN-GB"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;span lang="EN-GB"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;span lang="EN-GB"&gt;&lt;o:p&gt;Esto significa que permitirá la ejecución CGI en la carpeta que le indicamos.&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;span lang="EN-GB"&gt;&lt;o:p&gt;&lt;br /&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;span lang="EN-GB"&gt;&lt;o:p&gt;4 - Abrimos y editamos el fichero tilecache.cfg (C:\ms4w\Apache\htdocs\tilecache). Modificamos la opción de caché:&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;span lang="EN-GB"&gt;&lt;o:p&gt;&lt;br /&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;meta content="text/html; charset=utf-8" equiv="Content-Type"&gt;&lt;meta content="Word.Document" name="ProgId"&gt;&lt;meta content="Microsoft Word 11" name="Generator"&gt;&lt;meta content="Microsoft Word 11" name="Originator"&gt;&lt;link href="file:///C:%5CDOCUME%7E1%5Cviavansi%5CCONFIG%7E1%5CTemp%5Cmsohtml1%5C01%5Cclip_filelist.xml" rel="File-List"&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";}@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;/div&gt;&lt;div class="MsoNormal"&gt;[cache]&lt;/div&gt;&lt;div class="MsoNormal"&gt;type=Disk&lt;/div&gt;&lt;div class="MsoNormal"&gt;base=c:/tmp/tilecache&lt;/div&gt;&lt;span lang="EN-GB"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;div class="MsoNormal"&gt;&lt;span lang="EN-GB"&gt;&lt;o:p&gt;&lt;br /&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;span lang="EN-GB"&gt;&lt;o:p&gt;Esto apunta donde estará la caché de imágenes.&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;span lang="EN-GB"&gt;&lt;o:p&gt;&lt;br /&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;span lang="EN-GB"&gt;&lt;o:p&gt;5 - Abrimos y editamos la primera linea del fichero tilecache.cgi. &lt;/o:p&gt;&lt;/span&gt;&lt;span lang="EN-GB"&gt;(C:\ms4w\Apache\htdocs\tilecache)&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;meta content="text/html; charset=utf-8" equiv="Content-Type"&gt;&lt;meta content="Word.Document" name="ProgId"&gt;&lt;meta content="Microsoft Word 11" name="Generator"&gt;&lt;meta content="Microsoft Word 11" name="Originator"&gt;&lt;link href="file:///C:%5CDOCUME%7E1%5Cviavansi%5CCONFIG%7E1%5CTemp%5Cmsohtml1%5C01%5Cclip_filelist.xml" rel="File-List"&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";}@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;/div&gt;&lt;div class="MsoNormal"&gt;#!C:/Python27/python.exe –u&lt;/div&gt;   &lt;span lang="EN-GB"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Lo que hacemos es indicar la ruta de ejecución de Python. Yo también he añadido al path de Windows dicha ruta (C:\Python27\ ). Es muy importante sustituir esta línea por la que viene, si se añade sin eliminar la que viene, no funcionará.&lt;br /&gt;&lt;br /&gt;Con esto, ya tenemos configurado TileCache con WMS. Podemos hacer una pequeña prueba para ver si funciona. Abrimos un navegador, y en la barra de dirección escribimos:&lt;br /&gt;&lt;br /&gt;&lt;meta content="text/html; charset=utf-8" equiv="Content-Type"&gt;&lt;meta content="Word.Document" name="ProgId"&gt;&lt;meta content="Microsoft Word 11" name="Generator"&gt;&lt;meta content="Microsoft Word 11" name="Originator"&gt;&lt;link href="file:///C:%5CDOCUME%7E1%5Cviavansi%5CCONFIG%7E1%5CTemp%5Cmsohtml1%5C01%5Cclip_filelist.xml" rel="File-List"&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";}@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;br /&gt;&lt;div class="MsoNormal"&gt;http://localhost/tilecache/tilecache.cgi?LAYERS=basic&amp;amp;SERVICE=WMS%20&amp;amp;VERSION=1.1.1&amp;amp;REQUEST=GetMap&amp;amp;SRS=EPSG:4326&amp;amp;BBOX=-180,-90,0,90%20&amp;amp;WIDTH=256&amp;amp;HEIGHT=256&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Y debería aparecer una imagén de América. Si vamos a C:\tmp\tilecache, podremos observar que se genera una estructura de carpetas, y dentro de ellas podremos encontrar las imágenes que se descargan.&lt;br /&gt;&lt;br /&gt;Ahora, solo nos queda configurar el tilecache.cfg con nuestras propias capas. Ahora estoy investigando esto, así que cuando tenga conclusiones claras ya escribiré otro post que os pueda servir.&lt;br /&gt;&lt;br /&gt;Saludos!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7770063199684332236-589329139813177480?l=javanullpointerexception.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javanullpointerexception.blogspot.com/feeds/589329139813177480/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://javanullpointerexception.blogspot.com/2010/08/configuracion-de-tilecache-en-windows.html#comment-form' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7770063199684332236/posts/default/589329139813177480'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7770063199684332236/posts/default/589329139813177480'/><link rel='alternate' type='text/html' href='http://javanullpointerexception.blogspot.com/2010/08/configuracion-de-tilecache-en-windows.html' title='Configuración de TileCache en Windows'/><author><name>Juan Francisco Jara</name><uri>http://www.blogger.com/profile/16237726399085307174</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-7770063199684332236.post-6804583614759551587</id><published>2010-01-30T00:54:00.000+01:00</published><updated>2010-01-30T00:54:51.701+01:00</updated><title type='text'>Capítulo 2: Metemos el listener del ratón para dibujar</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;br /&gt;Vamos a añadir a nuestra ventana principal un listener para controlar las acciones del mouse.&lt;br /&gt;&lt;br /&gt;Primero, añadimos a nuestra ventana principal un componenteque nos ervirá para pintar sobre él. Yo he optado por usar un JLabel, pero podríamos usar otro o incluso crearnos nosotros uno propio.&lt;br /&gt;&lt;br /&gt;Una vez añadido en nuestra ventana principal dicho componente, vamos a crear una instancia de un listener que controle las acciones del mouse.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_WuA6BoinZyc/S2NydrNeysI/AAAAAAAAACQ/8PLcun9xvAg/s1600-h/declaracion.PNG" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="20" src="http://2.bp.blogspot.com/_WuA6BoinZyc/S2NydrNeysI/AAAAAAAAACQ/8PLcun9xvAg/s400/declaracion.PNG" width="400" /&gt;&lt;/a&gt;&amp;nbsp;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;Al declarar dicha instancia, deben de aparecer los métodos a implementar (al tratarse de una interfaz, se deben de implementar los métodos declarados en dicha interfaz). De momento nos vamos a centrar solo en uno, en el &lt;b&gt;mouseDragged&lt;/b&gt; . Dicho método sirve para detectar cuando tenemos el botón izquierdo del mouse pulsado y movemos el ratón. Con él, podremos implementar nuestra primera versión del "lápiz" de nuestro paint.&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_WuA6BoinZyc/S2Nzri0q02I/AAAAAAAAACY/6Tj220lMi3M/s1600-h/metodo.PNG" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="82" src="http://2.bp.blogspot.com/_WuA6BoinZyc/S2Nzri0q02I/AAAAAAAAACY/6Tj220lMi3M/s320/metodo.PNG" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Una vez implementado dicho método, solo nos queda añadirle la instancia del listener a nuestro componente JLabel (en mi caso). Para ello, en el constructor de la ventana principal, se hace lo siguiente:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_WuA6BoinZyc/S2N0ojPxKnI/AAAAAAAAACg/adH0QI-JIvM/s1600-h/inicio.PNG" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_WuA6BoinZyc/S2N0ojPxKnI/AAAAAAAAACg/adH0QI-JIvM/s320/inicio.PNG" /&gt;&lt;/a&gt;&amp;nbsp;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;Hecho esto, ya podremos pintar dentro de nuestro componente al estilo paint. Eso sí, de momento, solo pintaremos pixel a pixel, por lo que a simple vista parecerá que pintamos puntitos pequeños. En el próximo capítulo mostraré como pintar al estilo puro del Paint de Windows y también la herramienta borrador.&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt; &lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;Saludos!&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7770063199684332236-6804583614759551587?l=javanullpointerexception.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javanullpointerexception.blogspot.com/feeds/6804583614759551587/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://javanullpointerexception.blogspot.com/2010/01/capitulo-2-metemos-el-listener-del.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7770063199684332236/posts/default/6804583614759551587'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7770063199684332236/posts/default/6804583614759551587'/><link rel='alternate' type='text/html' href='http://javanullpointerexception.blogspot.com/2010/01/capitulo-2-metemos-el-listener-del.html' title='Capítulo 2: Metemos el listener del ratón para dibujar'/><author><name>Juan Francisco Jara</name><uri>http://www.blogger.com/profile/16237726399085307174</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/_WuA6BoinZyc/S2NydrNeysI/AAAAAAAAACQ/8PLcun9xvAg/s72-c/declaracion.PNG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7770063199684332236.post-7573364160072674762</id><published>2010-01-08T12:12:00.001+01:00</published><updated>2010-01-08T12:12:52.286+01:00</updated><title type='text'>Capítulo 1: crear una aplicación en SWING</title><content type='html'>&lt;div class="entry"&gt;            &lt;div class="snap_preview"&gt;Buenas,&amp;nbsp; vamos a ir aplicando conceptos y vamos a realizar una aplicación en Java (J2SE con SWING). Vamos a comenzar desde 0, paso a paso.&lt;br /&gt;Yo voy a usar NETBEANS versión 6.5, están ya disponibles otras versiones más recientes en la web de NETBEANS, por si os interesa otra versión.&lt;br /&gt;Bien, comencemos.&lt;br /&gt;Primero, debemos crear un nuevo proyecto. Pulsamos en el menú File-&amp;gt;New Proyect. Elegimos la carpeta de proyectos JAVA y el tipo de proyecto JAVA APLICATION.&lt;br /&gt;&lt;a href="http://musicaparasordos.files.wordpress.com/2010/01/crearproyecto.png"&gt;&lt;img alt="" class="aligncenter size-full wp-image-50" height="156" src="http://musicaparasordos.files.wordpress.com/2010/01/crearproyecto.png?w=500&amp;amp;h=156" title="crearProyecto" width="500" /&gt;&lt;/a&gt;&lt;br /&gt;Mi idea de este pequeño tutorial es de hacer un paint, pero con menos funcionalidades que el de Windows (en principio). Vamos a llamar al proyecto JavaPaint. También indicamos que nos cree una clase &lt;em&gt;main&lt;/em&gt; en nuestro proyecto.&lt;br /&gt;&lt;a href="http://musicaparasordos.files.wordpress.com/2010/01/crearproyecto2.png"&gt;&lt;img alt="" class="aligncenter size-full wp-image-51" height="234" src="http://musicaparasordos.files.wordpress.com/2010/01/crearproyecto2.png?w=499&amp;amp;h=234" title="crearProyecto2" width="499" /&gt;&lt;/a&gt;&lt;br /&gt;Una vez hecho esto, tenemos nuestro proyecto creado. En principio, la carpeta de proyecto se situa en la carpeta predeterminada de Netbeans, que se encuentra en “Mis documentos”.&lt;br /&gt;Vamos a crearnos unos cuantos de paquetes en el proyecto, así tendremos nuestras clases y paneles ordenados (el orden en la programación es imprescindible). Me he creado un par de ellos, a uno le he llamado &lt;em&gt;beans &lt;/em&gt;(que contendrá las clases) y al otro &lt;em&gt;paneles &lt;/em&gt;(contendrá la parte visual del programa).&lt;br /&gt;Lo siguiente, será crearnos nuestra ventana principal de la aplicación. Para ello, sobre el paquete paneles, pulsamos el botón derecho del ratón y seleccionamos la opción New-&amp;gt;Other. Ahora, seleccionamos la carpeta Swing GUI Forms y seleccionamos el tipo de fichero JFrame Form. Yo he optado por el nombre de PantallaPrincipal para el frame principal de la aplicación.&lt;br /&gt;&lt;a href="http://musicaparasordos.files.wordpress.com/2010/01/pantallaprincipal.png"&gt;&lt;img alt="" class="aligncenter size-full wp-image-54" height="180" src="http://musicaparasordos.files.wordpress.com/2010/01/pantallaprincipal.png?w=242&amp;amp;h=180" title="pantallaprincipal" width="242" /&gt;&lt;/a&gt;&lt;br /&gt;Ya tenemos la ventana principal del programa, ahora, vamos a implementar en el main que se lance al arrancar la aplicación. De momento, no tendrá funcionalidad alguna, pero vamos a ir poco a poco.&lt;br /&gt;&lt;a href="http://musicaparasordos.files.wordpress.com/2010/01/main.png"&gt;&lt;img alt="" class="aligncenter size-full wp-image-55" height="89" src="http://musicaparasordos.files.wordpress.com/2010/01/main.png?w=500&amp;amp;h=89" title="main" width="500" /&gt;&lt;/a&gt;&lt;br /&gt;Pulsando ejecutar (Run Main Proyect) observamos que nuestra ventana principal aparece ya ejecutandose.&lt;br /&gt;En el próximo capítulo añadiremos una barra de menú, una barra de herramientas y la ventana de selección de carga de ficheros de imágenes.&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/7770063199684332236-7573364160072674762?l=javanullpointerexception.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javanullpointerexception.blogspot.com/feeds/7573364160072674762/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://javanullpointerexception.blogspot.com/2010/01/capitulo-1-crear-una-aplicacion-en.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7770063199684332236/posts/default/7573364160072674762'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7770063199684332236/posts/default/7573364160072674762'/><link rel='alternate' type='text/html' href='http://javanullpointerexception.blogspot.com/2010/01/capitulo-1-crear-una-aplicacion-en.html' title='Capítulo 1: crear una aplicación en SWING'/><author><name>Juan Francisco Jara</name><uri>http://www.blogger.com/profile/16237726399085307174</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-7770063199684332236.post-3716260715975418642</id><published>2010-01-07T14:18:00.001+01:00</published><updated>2010-01-07T14:18:48.895+01:00</updated><title type='text'>Interfaces en JAVA</title><content type='html'>&lt;div class="entry"&gt;            &lt;div class="snap_preview"&gt;Seguimos con el mini-curso de programación: hoy veremos un patrón de diseño nuevo, en este caso se trata de las interfaces.&lt;br /&gt;Una interfaz en Java es una colección de declaraciones de métodos y contanstes. Así de sencillo y explicado a grosso modo. Nuestras interfaces no tendrán implementaciones ni nada, solo declararciones. Veamos un ejemplo:&lt;br /&gt;&lt;a href="http://musicaparasordos.files.wordpress.com/2010/01/interface.png"&gt;&lt;img alt="" class="aligncenter size-full wp-image-46" height="130" src="http://musicaparasordos.files.wordpress.com/2010/01/interface.png?w=293&amp;amp;h=130" title="interface" width="293" /&gt;&lt;/a&gt;&lt;br /&gt;Como se ve, se declaran los métodos sin implementarlos. Ahora, cada clase que deseemos que implemente esa interfaz, tenemos que indicarlo en la declaración de clase:&lt;br /&gt;&lt;a href="http://musicaparasordos.files.wordpress.com/2010/01/21.png"&gt;&lt;img alt="" class="aligncenter size-full wp-image-47" height="201" src="http://musicaparasordos.files.wordpress.com/2010/01/21.png?w=410&amp;amp;h=201" title="Implementacion de interfaz" width="410" /&gt;&lt;/a&gt;&lt;br /&gt;Como se observa, para implementar una interfaz basta con añadir a la declaración el término &lt;em&gt;implements &lt;/em&gt;seguido de la clase interfaz y todos los métodos que ésta tiene e implementarlos (o no, según lo que el programador busque), pero deben de aparecer al menos en la declaración de la clase.&lt;br /&gt;Las interfaces son muy útiles para funcionalidades comunes en distintas clases, por ejemplo, en la declaración de beans, la interfaz de acceso a datos con nuestra base de datos.&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/7770063199684332236-3716260715975418642?l=javanullpointerexception.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javanullpointerexception.blogspot.com/feeds/3716260715975418642/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://javanullpointerexception.blogspot.com/2010/01/interfaces-en-java.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7770063199684332236/posts/default/3716260715975418642'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7770063199684332236/posts/default/3716260715975418642'/><link rel='alternate' type='text/html' href='http://javanullpointerexception.blogspot.com/2010/01/interfaces-en-java.html' title='Interfaces en JAVA'/><author><name>Juan Francisco Jara</name><uri>http://www.blogger.com/profile/16237726399085307174</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-7770063199684332236.post-7839403914107321228</id><published>2010-01-05T11:55:00.000+01:00</published><updated>2010-01-05T11:56:26.661+01:00</updated><title type='text'>Clases heredadas.... con ejemplos de animalitos!</title><content type='html'>&lt;div class="entry" style="font-family: Arial,Helvetica,sans-serif;"&gt;&lt;div class="snap_preview"&gt;Título más rocambolesco no podría ser. Aprovechando lo bien que esta diseñado el lenguaje JAVA, voy a dar una mini-clase de eso que se suele enseñar en asignaturas claves de programación de las titulaciones universitarias, las cuales muchos alumnos dicen que &lt;i&gt;no sirven pa ná&lt;/i&gt;….&lt;br /&gt;&lt;br /&gt;Como todos sabréis, JAVA es un lenguaje enfocado a la &lt;i&gt;POO&lt;/i&gt; (un teletubbie, pero para nosotroso será la programación orientada a objetos, y a partir de ahora, POO, que lo otro es más largo) por lo que me va a ser muy útil para dar las explicaciones sobre los temas que vamos a abarcar con este lenguaje. Se podría hacer también con C++, pero este&amp;nbsp; me lo reservo para cuando comienze el curso avanzado y os muestre algo de QT &lt;img alt=":lol:" class="wp-smiley" src="http://s.wordpress.com/wp-includes/images/smilies/icon_lol.gif" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Voy a obviar un poco la teoría, y partiré de la base de que ustedes ya sabeis los principios básicos sobre la POO, el concepto de clase y objeto, atributos o miembros, etc etc. Vamos entonces con la &lt;b&gt;HERENCIA&lt;/b&gt; (si voy rápido paradme xD).&lt;br /&gt;&lt;br /&gt;Con la explicación burra y sencilla, se podría decir que yo soy un humano (aún por demostrar). Al ser un humano, esto me engloba dentro del grupo de los animales (aquí ya es más demostrable), y más concretamente, dentro de los mamíferos. ¿Qué queremos demostrar? pués que dentro del grupo de los animales, están los mamíferos, y dentro de los mamíferos, los seres humanos. Los animales, no existen en la realidad como entidad, o sea, no son instanciables, por lo que diremos que son una &lt;b&gt;clase abstracta&lt;/b&gt;. Los animales también podemos deducir que tienen características y propiedades comunes a todos los animales, por lo que se define la clase animales como una de las clases a heredar a las demás subclases de animales (en este caso, mamíferos). Funcionalidades como comer, descansar, desplazarse, etc las tendran todos los animales, pero cada animal lo hace a su manera. Esto nos dice que cada funcionalidad será propia de cada animal.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a href="http://musicaparasordos.files.wordpress.com/2010/01/1.png"&gt;&lt;img alt="" class="size-full wp-image-39 aligncenter" height="162" src="http://musicaparasordos.files.wordpress.com/2010/01/1.png?w=395&amp;amp;h=162" title="1" width="395" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Sigámos profundizando. Siguiendo la cadena, tenemos que los seres humanos somos mamíferos… nuestra siguiente clase será esa misma: mamíferos.&lt;br /&gt;Mamíferos hereda directamente de&amp;nbsp; la clase &lt;b&gt;animal&lt;/b&gt;, así que contendrá las mismas propiedades que dicha clase. Como los mamíferos tampoco son instanciables (en la realidad no existen mamíferos como tales), también lo definiremos como clase abstracta:&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://musicaparasordos.files.wordpress.com/2010/01/2.png" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img alt="" class="aligncenter size-full wp-image-40" height="144" src="http://musicaparasordos.files.wordpress.com/2010/01/2.png?w=384&amp;amp;h=144" title="Mamifero" width="384" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Las propiedades de &lt;i&gt;animal&lt;/i&gt;, aunque no sean visibles en la clase &lt;i&gt;mamífero&lt;/i&gt;, están ahí.&lt;br /&gt;La última clase a implementar , sería la de ser humano. Le llamaremos clase &lt;b&gt;Persona&lt;/b&gt;. Como una persona si es instanciable (por ejemplo, Manuel Sillín Ventanuco -nombre para evitar casualidades con personas reales- ) es una persona física, existe como tal. Decímos que Manuel Sillín Ventanuco (clase persona) es una instancia de la clase Persona. Implementando quedaría algo así:&lt;br /&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;a href="http://musicaparasordos.files.wordpress.com/2010/01/3.png"&gt;&lt;img alt="" class="aligncenter size-full wp-image-41" height="402" src="http://musicaparasordos.files.wordpress.com/2010/01/3.png?w=333&amp;amp;h=402" title="Persona" width="333" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Vemos que Persona hereda de la clase Mamiferos, y esta hereda de la clase Animal. La conclusión que se obtiene es que Persona tiene todas las caracteristicas de la clase Animal y Mamifero. Como Persona es una clase final, también podemos decir que Persona debe implementar todos los &lt;b&gt;métodos abstractos&lt;/b&gt; de las clases superiores. Los métodos heredados de las clases superiores se denotan con el @Override delante de cada función. Notar que no podemos acceder a los atributos como numeroPelos de la clase Mamifero o edad de la clase Animal. Se debe a que hemos definido los atributos como privados. Si quisieramos acceder a dichos atributos desde persona se recomienda que se declaren como protected en vez de privados, o dejarlos privados e implementar métodos no abstractos en las clases padres para acceder a dicho atributo desde Persona.&lt;br /&gt;Se puede observar que Persona implementa los métodos de las clases padre y también implementa los suyos propios.&lt;br /&gt;Veamos en código un pequeño ejemplo con todo esto que se ha explicado:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://musicaparasordos.files.wordpress.com/2010/01/4.png"&gt;&lt;img alt="" class="aligncenter size-full wp-image-37" height="201" src="http://musicaparasordos.files.wordpress.com/2010/01/4.png?w=500&amp;amp;h=284" title="Ejemplo" width="352" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Muy bien, pues esta ha sido la lección rápida pero efectiva sobre la herencia de clases, el próximo post seguramente lo haga sobre interfaces de clases, que molan mucho y además son también muy útiles. Cuidense!&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/7770063199684332236-7839403914107321228?l=javanullpointerexception.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javanullpointerexception.blogspot.com/feeds/7839403914107321228/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://javanullpointerexception.blogspot.com/2010/01/titulo-mas-rocambolesco-no-podria-ser.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7770063199684332236/posts/default/7839403914107321228'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7770063199684332236/posts/default/7839403914107321228'/><link rel='alternate' type='text/html' href='http://javanullpointerexception.blogspot.com/2010/01/titulo-mas-rocambolesco-no-podria-ser.html' title='Clases heredadas.... con ejemplos de animalitos!'/><author><name>Juan Francisco Jara</name><uri>http://www.blogger.com/profile/16237726399085307174</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-7770063199684332236.post-485360361569129855</id><published>2010-01-05T11:52:00.000+01:00</published><updated>2010-01-05T11:52:49.556+01:00</updated><title type='text'>Patrón de diseño: SINGLETON</title><content type='html'>Muy buenas,&lt;br /&gt;&lt;br /&gt;volvemos al blog, y vamos bien, a post por año….  hoy voy a comentar un patrón de diseño bastante eficaz: singleton.&lt;br /&gt;&lt;br /&gt;El patrón de diseño singleton (o para los de aquí, instancia única) trata de mantener un acceso único a un objeto que solo tendrá una instancia, es decir, es un objeto global y único en nuestra aplicación.&lt;br /&gt;&lt;br /&gt;¿Pará que es útil este patrón de diseño? Pués tiene muchas utilidades… por ejemplo, para el acceso a recursos únicos o para tener “a mano” unos datos o funcionalidades para todos los objetos. Para ello, se debe garantizar que el construcctor de nuestra clase singleton sea privada, de esa forma nos aseguramos que solo pueda haber una instancia de la clase:&lt;br /&gt;&lt;br /&gt;&lt;b&gt;public class Singleton {&lt;/b&gt;&lt;br /&gt;&lt;b&gt;private static Singleton miObjeto = null;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;private Singleton() {&lt;/b&gt;&lt;br /&gt;&lt;b&gt;}&lt;/b&gt;&lt;br /&gt;&lt;b&gt;}&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Ahora, solo nos queda el acceso restringido a nuestro objeto. Para ello, solo añadir a la clase un método de recogida de la instancia:&lt;br /&gt;&lt;br /&gt;&lt;b&gt;public class Singleton {&lt;br /&gt;private static Singleton miObjeto = null;&lt;br /&gt;private Singleton() {&lt;br /&gt;}&lt;br /&gt;public static Singleton getInstancia() {&lt;br /&gt;if (miObjeto == null) {&lt;br /&gt;miObjeto = new Singleton();&lt;br /&gt;}&lt;br /&gt;return miObjeto;&lt;br /&gt;}&lt;br /&gt;}&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Con esto ya tenemos el patrón implementado con lo básico, ahora, solo añadir los métodos que se quieran para hacerlo totalmente funcional.&lt;br /&gt;&lt;br /&gt;Para llamar desde nuestro código:&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Singleton objetoSingleton = Singleton.getInstancia();&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Veamos un pequeño ejemplo. Vamos a tener una clase que se encarga de tener almacenana la conexión con una base de datos MySQL. Para ello, usaremos el patrón Singleton para el acceso a dicha conexión.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;public class ConexionSingleton {&lt;/b&gt;&lt;br /&gt;&lt;b&gt;private static ConexionSingleton instancia = null;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;private java.sql.Connection conexion = null;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;private ConexionSingleton() {&lt;/b&gt;&lt;br /&gt;&lt;b&gt;}&lt;/b&gt;&lt;br /&gt;&lt;b&gt;public static ConexionSingleton getInstancia() {&lt;/b&gt;&lt;br /&gt;&lt;b&gt;if (instancia == null) {&lt;/b&gt;&lt;br /&gt;&lt;b&gt;instancia = new ConexionSingleton();&lt;/b&gt;&lt;br /&gt;&lt;b&gt;}&lt;/b&gt;&lt;br /&gt;&lt;b&gt;return instancia;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;}&lt;/b&gt;&lt;br /&gt;&lt;b&gt;/* devuelve true si se ha creado correctamente */&lt;/b&gt;&lt;br /&gt;&lt;b&gt;public boolean crearConexion() {&lt;/b&gt;&lt;br /&gt;&lt;b&gt;try {&lt;/b&gt;&lt;br /&gt;&lt;b&gt;Class.forName(“com.mysql.jdbc.Driver”);&lt;/b&gt;&lt;br /&gt;&lt;b&gt;conexion = DriverManager.getConnection(“urlBaseDatos”, “usuarioBaseDatos”, “passwordBaseDatos”);&lt;/b&gt;&lt;br /&gt;&lt;b&gt;} catch (Exception e) {&lt;/b&gt;&lt;br /&gt;&lt;b&gt;return false;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;}&lt;/b&gt;&lt;br /&gt;&lt;b&gt;return true;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;}&lt;/b&gt;&lt;br /&gt;&lt;b&gt;public java.sql.Connection getConexion() {&lt;/b&gt;&lt;br /&gt;&lt;b&gt;if (conexion == null) {&lt;/b&gt;&lt;br /&gt;&lt;b&gt;crearConexion();&lt;/b&gt;&lt;br /&gt;&lt;b&gt;}&lt;/b&gt;&lt;br /&gt;&lt;b&gt;return conexion;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;}&lt;/b&gt;&lt;br /&gt;&lt;b&gt;}&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Llamando desde nuestro código principal:&lt;br /&gt;&lt;br /&gt;&lt;b&gt;ConexionSingleton.getInstancia().crearConexion();&lt;/b&gt;&lt;br /&gt;&lt;b&gt;java.sql.Connection conexion = ConexionSingleton.getInstancia().getConexion();&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Espero que os sea útil. Saludos!&lt;br /&gt;&lt;br /&gt;PD: a ver si aprendo a manejar mejor el blog, así no me sale el código tan feote como me ha salido :mrgreen:&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7770063199684332236-485360361569129855?l=javanullpointerexception.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javanullpointerexception.blogspot.com/feeds/485360361569129855/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://javanullpointerexception.blogspot.com/2010/01/patron-de-diseno-singleton.html#comment-form' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7770063199684332236/posts/default/485360361569129855'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7770063199684332236/posts/default/485360361569129855'/><link rel='alternate' type='text/html' href='http://javanullpointerexception.blogspot.com/2010/01/patron-de-diseno-singleton.html' title='Patrón de diseño: SINGLETON'/><author><name>Juan Francisco Jara</name><uri>http://www.blogger.com/profile/16237726399085307174</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></feed>
