<?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-1421033339681316542</id><updated>2012-02-02T14:04:39.679-03:00</updated><category term='Tomcat'/><category term='Opensource'/><category term='Java'/><category term='Ant'/><category term='Openbravo'/><category term='OpenSUSE'/><title type='text'>Metalklesk's space</title><subtitle type='html'>Ingeniería, tecnología y open source</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://metalklesk.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1421033339681316542/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://metalklesk.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Daniel Dario Morales Salas</name><uri>http://www.blogger.com/profile/07642586501018157497</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='28' src='http://3.bp.blogspot.com/_TGgpRudXV3w/SfP_sc5YZ3I/AAAAAAAABSs/APK4YFwjVn4/S220/yoft3.png'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>47</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-1421033339681316542.post-801141598890241162</id><published>2010-06-06T15:53:00.006-04:00</published><updated>2010-06-06T16:08:53.928-04:00</updated><title type='text'>Netbeans Platform LifecycleManager</title><content type='html'>Una de las cosas que necesitamos cuando desarrollamos una aplicación es el control cuando cerramos la aplicación. Que debería hacer nuestra aplicación si presionamos el botón salir ? debemos guardar nuestro trabajo ? deberíamos confirmar la salida ? o simplemente debemos cerrar la aplicación y perder todo ?&lt;br /&gt;Si han comenzado a utilizar la Netbeans Platform es posible que se hayan encontrado con este dilema, la solución es MUY simple.&lt;br /&gt;&lt;br /&gt;Lo primero que debemos hacer es crear la carpeta META-INF/services en la raíz de la carpeta src de nuestro proyecto Netbeans. Dentro de esa carpeta creamos el archivo "org.openide.LifecycleManager", el cual es un simple archivo de texto (sin extensión txt ni nada), luego abrimos el archivio desde Netbeans y agregamos las siguientes líneas:&lt;br /&gt;&lt;blockquote&gt;org.metalklesk.nbservices.impl.MyLifecycleManager&lt;br /&gt;#position=1&lt;br /&gt;org.netbeans.core.NbTopManager$NbLifecycleManager&lt;br /&gt;#position=2&lt;/blockquote&gt;&lt;br /&gt;Con eso estamos indicando que reemplazaremos la implementación por &lt;span style="font-style: italic;"&gt;default&lt;/span&gt; de Netbeans por la nuestra, así es como se ve:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_TGgpRudXV3w/TAv-rEWPSoI/AAAAAAAABlw/fv7dD2NeN4w/s1600/1.png"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 320px; height: 112px;" src="http://1.bp.blogspot.com/_TGgpRudXV3w/TAv-rEWPSoI/AAAAAAAABlw/fv7dD2NeN4w/s320/1.png" alt="" id="BLOGGER_PHOTO_ID_5479753387481188994" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;luego simplemente debemos crear nuestra clase, la cual tiene el siguiente contenido:&lt;br /&gt;&lt;blockquote&gt;public class MyLifecycleManager extends LifecycleManager {&lt;br /&gt;&lt;br /&gt;  @Override&lt;br /&gt;  public void saveAll() {&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  @Override&lt;br /&gt;  public void exit() {&lt;br /&gt;      //close all the topcomponent tabs&lt;br /&gt;      Set&amp;lt;TopComponent&amp;gt; tcs = TopComponent.getRegistry().getOpened();&lt;br /&gt;      Iterator&amp;lt;TopComponent&amp;gt; it = tcs.iterator();&lt;br /&gt;      while(it.hasNext()) {&lt;br /&gt;          TopComponent tc = it.next();&lt;br /&gt;          if(tc instanceof DepartmentEditorTopComponent)&lt;br /&gt;              tc.close();&lt;br /&gt;      }&lt;br /&gt;&lt;br /&gt;      Collection c = Lookup.getDefault().lookup (&lt;br /&gt;              new Lookup.Template (LifecycleManager.class)).allInstances();&lt;br /&gt;&lt;br /&gt;      for (Iterator i=c.iterator(); i.hasNext();) {&lt;br /&gt;          LifecycleManager lm = (LifecycleManager) i.next();&lt;br /&gt;          if (lm != this) {&lt;br /&gt;              lm.exit();&lt;br /&gt;          }&lt;br /&gt;      }&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;}&lt;/blockquote&gt;&lt;br /&gt;y así es como se ve:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_TGgpRudXV3w/TAv_IP_UfCI/AAAAAAAABl4/QE61CdiaNjA/s1600/2.png"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 320px; height: 180px;" src="http://2.bp.blogspot.com/_TGgpRudXV3w/TAv_IP_UfCI/AAAAAAAABl4/QE61CdiaNjA/s320/2.png" alt="" id="BLOGGER_PHOTO_ID_5479753888822492194" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Al extender de la clase &lt;span style="font-weight: bold;"&gt;LifecycleManager&lt;/span&gt; debemos implementar el método &lt;span style="font-weight: bold;"&gt;exit&lt;/span&gt; y es en esa implementación donde ingresamos nuestro código. En este caso me preocupo de cerrar unos &lt;span style="font-style: italic;"&gt;TopComponent&lt;/span&gt; que yo construí.&lt;br /&gt;El pedazo de código siguiente debe ir para poder cerrar la aplicación:&lt;br /&gt;&lt;blockquote&gt;Collection c = Lookup.getDefault().lookup (&lt;br /&gt;                new Lookup.Template (LifecycleManager.class)).allInstances();&lt;br /&gt;&lt;br /&gt;        for (Iterator i=c.iterator(); i.hasNext();) {&lt;br /&gt;            LifecycleManager lm = (LifecycleManager) i.next();&lt;br /&gt;            if (lm != this) {&lt;br /&gt;                lm.exit();&lt;br /&gt;            }&lt;br /&gt;        }&lt;/blockquote&gt;&lt;br /&gt;Con eso ya tienen su propia implementación de la clase LifecycleManager y se pueden preocupar de realizar lo que sea necesario antes de cerrar la aplicación.&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/1421033339681316542-801141598890241162?l=metalklesk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://metalklesk.blogspot.com/feeds/801141598890241162/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://metalklesk.blogspot.com/2010/06/netbeans-platform-lifecyclemanager.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1421033339681316542/posts/default/801141598890241162'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1421033339681316542/posts/default/801141598890241162'/><link rel='alternate' type='text/html' href='http://metalklesk.blogspot.com/2010/06/netbeans-platform-lifecyclemanager.html' title='Netbeans Platform LifecycleManager'/><author><name>Daniel Dario Morales Salas</name><uri>http://www.blogger.com/profile/07642586501018157497</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='28' src='http://3.bp.blogspot.com/_TGgpRudXV3w/SfP_sc5YZ3I/AAAAAAAABSs/APK4YFwjVn4/S220/yoft3.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_TGgpRudXV3w/TAv-rEWPSoI/AAAAAAAABlw/fv7dD2NeN4w/s72-c/1.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1421033339681316542.post-8246956283599882345</id><published>2010-06-01T22:35:00.006-04:00</published><updated>2010-06-01T23:06:05.034-04:00</updated><title type='text'>Netbeans Platform Notifications</title><content type='html'>He estado trabajando en un software para domótica (Home Automation) y para ello estoy utilizando la plataforma Netbeans y su excelente API.&lt;br /&gt;&lt;br /&gt;Una de las cosas que me ha gustado es el manejo de las notificaciones.&lt;br /&gt;Si han usado el IDE Netbeans, se habrán dado cuenta que cuando cargas algo, aparece un texto en el área de estado que está abajo a la izquierda (Status Area).&lt;br /&gt;&lt;br /&gt;Para utilizar esa área para notificaciones desde tu aplicación simplemente basta con la siguiente linea de código:&lt;br /&gt;StatusDisplayer.getDefault().setStatusText("Hola mundo");&lt;br /&gt;así de simple.&lt;br /&gt;&lt;br /&gt;También existe un globo, el cual muchos ya habrán visto cuando Netbeans encuentra actualizaciones. Ese globo también está disponible para tu aplicación!!!&lt;br /&gt;&lt;br /&gt;Cómo se usa ? simple ... en el siguiente &lt;a href="http://qbeukes.blogspot.com/2009/11/netbeans-platform-notifications.html"&gt;blog&lt;/a&gt; aparecen unas clases que amablemente su autor dispuso para todos en la red, las cuales yo estoy usando en mi aplicación con unas pequeñas modificaciones.&lt;br /&gt;&lt;br /&gt;Las clases con mis modificaciones son las siguientes:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://pastebin.com/0SA6SGGN"&gt;MessageType&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://pastebin.com/S5UR7vsP"&gt;MessageUtil&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://pastebin.com/2MZYgEcB"&gt;NotifyUtil&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Con estas 3 clases en tu aplicación basada en Netbeans Platform, puedes usar el globo de la siguiente manera:&lt;br /&gt;&lt;blockquote&gt;NotifyUtil.warn("titulo", "mensaje de advertencia", false);&lt;/blockquote&gt;&lt;br /&gt;&lt;blockquote&gt;NotifyUtil.show("titulo", "mensaje informativo", false);&lt;/blockquote&gt;&lt;br /&gt;&lt;blockquote&gt;NotifyUtil.show("titulo", "mensaje informativo", new ActionListener() {&lt;br /&gt;            @Override&lt;br /&gt;            public void actionPerformed(ActionEvent e) {&lt;br /&gt;                //hago algo&lt;br /&gt;            }&lt;br /&gt;        };, false);&lt;/blockquote&gt;&lt;br /&gt;&lt;blockquote&gt;NotifyUtil.error("titulo", "mensaje de error, false);&lt;/blockquote&gt;&lt;br /&gt;&lt;blockquote&gt;NotifyUtil.error("titulo", "mensaje de error", exception, false);&lt;/blockquote&gt;&lt;br /&gt;El último muestra la excepción en un dialogo informativo.&lt;br /&gt;&lt;br /&gt;Y por último si queremos mostrar una notificación en un diálogo informativo, en vez de usar un JOptionPane, podemos usar lo siguiente:&lt;br /&gt;&lt;blockquote&gt;MessageUtil.showException("mensaje", exception);&lt;/blockquote&gt;&lt;br /&gt;&lt;blockquote&gt;MessageUtil.error("mensaje", exceptionInstance);&lt;/blockquote&gt;&lt;br /&gt;&lt;blockquote&gt;MessageUtil.error("mensaje");&lt;/blockquote&gt;&lt;br /&gt;&lt;blockquote&gt;MessageUtil.info("mensaje");&lt;/blockquote&gt;&lt;br /&gt;&lt;blockquote&gt;MessageUtil.question("mensaje");&lt;/blockquote&gt;&lt;br /&gt;&lt;blockquote&gt;MessageUtil.plain("mensaje");&lt;/blockquote&gt;&lt;br /&gt;Y con eso ya tenemos cubierto el tema de las notificaciones en la plataforma Netbeans.&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/1421033339681316542-8246956283599882345?l=metalklesk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://metalklesk.blogspot.com/feeds/8246956283599882345/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://metalklesk.blogspot.com/2010/06/netbeans-platform-notifications.html#comment-form' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1421033339681316542/posts/default/8246956283599882345'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1421033339681316542/posts/default/8246956283599882345'/><link rel='alternate' type='text/html' href='http://metalklesk.blogspot.com/2010/06/netbeans-platform-notifications.html' title='Netbeans Platform Notifications'/><author><name>Daniel Dario Morales Salas</name><uri>http://www.blogger.com/profile/07642586501018157497</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='28' src='http://3.bp.blogspot.com/_TGgpRudXV3w/SfP_sc5YZ3I/AAAAAAAABSs/APK4YFwjVn4/S220/yoft3.png'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1421033339681316542.post-5109512618973477964</id><published>2009-12-13T17:54:00.013-03:00</published><updated>2009-12-13T20:19:17.878-03:00</updated><title type='text'>NetBeans 6.8 y Visual Library API, ejemplo completo</title><content type='html'>&lt;div style="text-align: justify;"&gt;Hace unos días me vi enfrentado en la necesidad de desarrollar una aplicación que permitiera crear diagramas arrastrando iconos desde una paleta. Para esto existen varias bibliotecas de la API de &lt;a href="http://www.netbeans.org/"&gt;NetBeans&lt;/a&gt; que son muy útiles, las cuales permiten desarrollar una aplicación del tipo "Editor visual", como Microsoft Visio o &lt;a href="http://projects.gnome.org/dia/"&gt;Dia&lt;/a&gt;, con el cual podemos generar diagramas y agregar acciones.&lt;br /&gt;&lt;br /&gt;Muchos pequeños ejemplos para trabajar con la Visual Library API se pueden encontrar en &lt;a href="http://netbeans.sourcearchive.com/documentation/6.0.1/files.html"&gt;http://netbeans.sourcearchive.com/documentation/6.0.1/files.html&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;También existe este ejemplo en &lt;a href="http://java.dzone.com/news/how-create-visual-applications"&gt;http://java.dzone.com/news/how-create-visual-applications&lt;/a&gt; el cual nos indica como agregar un poco de funcionalidad a un widget y este otro ejemplo en &lt;a href="http://java.dzone.com/news/how-add-resize-functionality-v"&gt;http://java.dzone.com/news/how-add-resize-functionality-v&lt;/a&gt; que nos dice como agregar la funcionalidad de "Resize" de un widget, el cual modifiqué un poco.&lt;br /&gt;&lt;br /&gt;Otro ejemplo muy bueno es &lt;a href="http://platform.netbeans.org/tutorials/60/nbm-visual_library.html"&gt;éste de acá&lt;/a&gt;, que nos muestra como añadir la &lt;a href="http://bits.nbextras.org/dev/javadoc/org-netbeans-spi-palette/overview-summary.html"&gt;Common Palette&lt;/a&gt; a nuestra aplicación, funcionalidad que se utilizó en este ejemplo.&lt;br /&gt;&lt;br /&gt;Primero que todo quiero agradecer la buena voluntad de &lt;a href="http://blogs.sun.com/geertjan/entry/welcome_to_me"&gt;Geertjan Wielenga&lt;/a&gt; y David Kaspar, quienes muy amablemente me ayudaron a entender como funcionan algunas API de NetBeans y con lo cual pude desarrollar un ejemplo que quiero compartir con ustedes.&lt;br /&gt;&lt;br /&gt;Lo primero es aclarar que el ejemplo hace uso de la &lt;span style="font-style: italic;"&gt;plataforma NetBeans&lt;/span&gt;, tanto para su desarrollo como para su ejecución. NetBeans trae la opción de crear una aplicación utilizando un esqueleto llamado &lt;span style="font-weight: bold;"&gt;NetBeans Platform Application&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_TGgpRudXV3w/SyVZDqyKGTI/AAAAAAAABik/igt3lKTHkdA/s1600-h/snapshot1.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 180px;" src="http://4.bp.blogspot.com/_TGgpRudXV3w/SyVZDqyKGTI/AAAAAAAABik/igt3lKTHkdA/s320/snapshot1.png" alt="" id="BLOGGER_PHOTO_ID_5414832046542035250" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;al cual, en este ejemplo se le dio el nombre de &lt;span style="font-style: italic;"&gt;Visual Editor&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_TGgpRudXV3w/SyVZ9IegFGI/AAAAAAAABi0/U9i2eI0xw80/s1600-h/snapshot2.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 180px;" src="http://4.bp.blogspot.com/_TGgpRudXV3w/SyVZ9IegFGI/AAAAAAAABi0/U9i2eI0xw80/s320/snapshot2.png" alt="" id="BLOGGER_PHOTO_ID_5414833033765196898" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Sobre este esqueleto se agregan módulos.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_TGgpRudXV3w/SyVZeuZdRCI/AAAAAAAABis/uuP2K9lnbG0/s1600-h/snapshot3.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 180px;" src="http://3.bp.blogspot.com/_TGgpRudXV3w/SyVZeuZdRCI/AAAAAAAABis/uuP2K9lnbG0/s320/snapshot3.png" alt="" id="BLOGGER_PHOTO_ID_5414832511368643618" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;y los módulos se pueden crear como aplicaciones &lt;span style="font-style: italic;"&gt;standalone&lt;/span&gt; (para cargar en NetBeans IDE) o como módulos para una aplicación del tipo &lt;span style="font-style: italic;"&gt;NetBeans Platform Application&lt;/span&gt;, el cual es nuestro caso.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_TGgpRudXV3w/SyVavLMuSmI/AAAAAAAABi8/QhxCZMnDW8I/s1600-h/snapshot4.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 180px;" src="http://2.bp.blogspot.com/_TGgpRudXV3w/SyVavLMuSmI/AAAAAAAABi8/QhxCZMnDW8I/s320/snapshot4.png" alt="" id="BLOGGER_PHOTO_ID_5414833893489396322" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;La gracia de crear módulos en NetBeans es que pueden ser exportados como archivos &lt;span style="font-weight: bold;"&gt;nbm&lt;/span&gt;, los cuales pueden ser cargados dentro de NetBeans o nuestras aplicaciones del tipo NetBeans Platform Application.&lt;br /&gt;&lt;br /&gt;Al crear una aplicación del tipo NetBeans Platform Application, le podemos cargar todos los módulos que queramos lo cual nos permite crear una aplicación extensible y además nos permite exportar la aplicación con binarios listos para su ejecución (script en linux, exe en windows).&lt;br /&gt;&lt;br /&gt;Dejo aquí el &lt;a href="http://netbeans-visual-library-example.googlecode.com/files/VisualEditor-src.zip"&gt;enlace de descarga&lt;/a&gt; del código fuente del ejemplo, el cual iremos comentando a continuación y &lt;a href="http://netbeans-visual-library-example.googlecode.com/files/visualeditor.zip"&gt;acá&lt;/a&gt; están los binarios.&lt;br /&gt;&lt;br /&gt;Para crear una aplicación del tipo editor de diagramas, debemos crear una &lt;span style="font-style: italic;"&gt;escena&lt;/span&gt;. Una escena es un componente que permite agregar &lt;span style="font-style: italic;"&gt;widgets&lt;/span&gt; en él y se encarga de manejarlos por nosotros.&lt;br /&gt;&lt;br /&gt;En el caso de este ejemplo, creamos una clase llamada &lt;span style="font-style: italic;"&gt;MyScene&lt;/span&gt; que hereda de la clase &lt;span style="font-style: italic;"&gt;GraphScene&lt;/span&gt;.&lt;br /&gt;&lt;blockquote&gt;&lt;code&gt;&lt;br /&gt;public class MyScene extends GraphScene&amp;lt;MyNode, MyEdge&amp;gt; {&lt;br /&gt;&lt;/code&gt;&lt;/blockquote&gt;&lt;br /&gt;En una escena tenemos &lt;span style="font-style: italic;"&gt;Nodos&lt;/span&gt; y &lt;span style="font-style: italic;"&gt;Edges&lt;/span&gt;. Ambos son widgets pero la diferencia es que los Nodos los utilizamos para los iconos representativos que agregamos a la escena y los Edges los utilizamos para crear conexiones entre los nodos, es por eso que creamos las clases &lt;span style="font-style: italic;"&gt;MyNode&lt;/span&gt; y &lt;span style="font-style: italic;"&gt;MyEdge&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Cuando agregamos un nodo a una escena, utilizamos el método &lt;span style="font-weight: bold;"&gt;addNode&lt;/span&gt; al cual le pasamos como argumento un objeto de tipo MyNode (ver método &lt;span style="font-weight: bold;"&gt;accept&lt;/span&gt; de la clase MyScene).&lt;br /&gt;&lt;blockquote&gt;&lt;code&gt;&lt;br /&gt;Widget w = MyScene.this.addNode(new MyNode(idGenerator.getNextId(), image, "Object " + (nodeCounter++), point));&lt;br /&gt;&lt;/code&gt;&lt;/blockquote&gt;&lt;br /&gt;cuando se llama el método addNode inmediatamente se dispara una llamada a la implementación del método &lt;span style="font-weight: bold;"&gt;attachNodeWidget&lt;/span&gt; que es donde recién se agrega el Widget a la escena&lt;br /&gt;&lt;blockquote&gt;&lt;code&gt;&lt;br /&gt;protected Widget attachNodeWidget(MyNode node) {&lt;br /&gt;&lt;br /&gt; MyWidget widget = new MyWidget(this, mainLayer, interactionLayer, connectionLayer, node);&lt;br /&gt;&lt;br /&gt; mainLayer.addChild(widget);&lt;br /&gt;&lt;br /&gt; setFocusedWidget (widget);&lt;br /&gt;&lt;br /&gt; validate();&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt; return widget;&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/blockquote&gt;&lt;br /&gt;La gracia de usar un objeto MyNode es que podemos almacenar y obtener los datos propios del Widget, los cuales podemos utilizar luego para almacenarlos en un archivo xml, con lo cual le agregamos la función de importar y exportar la escena.&lt;br /&gt;&lt;br /&gt;En la clase MyWidget agregamos la opción de crear conexiones con otros widgets creando una acción en particular en el constructor:&lt;br /&gt;&lt;blockquote&gt;&lt;code&gt;&lt;br /&gt;getActions().addAction(ActionFactory.createExtendedConnectAction(connectionLayer, new MyConnectionProvider(scene)));&lt;br /&gt;&lt;/code&gt;&lt;/blockquote&gt;&lt;br /&gt;Esto utiliza un objeto del tipo &lt;span style="font-style: italic;"&gt;MyConnectionProvider&lt;/span&gt; el cual se encarga de generar un objeto &lt;span style="font-style: italic;"&gt;MyEdge&lt;/span&gt; y lo agrega utilizando el método &lt;span style="font-weight: bold;"&gt;addEdge&lt;/span&gt; de la escena. Al llamar al método addEdge se dispara una llamada a la implementación del método &lt;span style="font-weight: bold;"&gt;attachEdgeWidget&lt;/span&gt; de la escena, el cual se encarga de agregar un widget de conexión.&lt;br /&gt;&lt;br /&gt;En el caso de este ejemplo se creó una clase para el widget con la imagen (&lt;span style="font-style: italic;"&gt;MyWidget&lt;/span&gt;) y otra para la conexión (&lt;span style="font-style: italic;"&gt;MyConnectionWidget&lt;/span&gt;).&lt;br /&gt;Ambos tienen la capacidad de modificar un texto en la escena ya que se les agrego la acción de edición usando &lt;span style="font-weight: bold;"&gt;createInplaceEditorAction&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Es interesante el poder agregar un menú a un Widget, lo cual nos da la posibilidad de añadir funcionalidad a los widgets. Para esto se utiliza un &lt;span style="font-style: italic;"&gt;PopupMenuProvider&lt;/span&gt; el cual retorna un &lt;span style="font-style: italic;"&gt;JPopupMenu&lt;/span&gt; el que a su vez puede contener &lt;span style="font-style: italic;"&gt;JMenuItems&lt;/span&gt; con la funcionalidad que queramos en cada uno, ver la clase MyWidget.&lt;br /&gt;&lt;blockquote&gt;&lt;code&gt;&lt;br /&gt;popupMenuProvider = new PopupMenuProvider() {&lt;br /&gt;&lt;br /&gt;     public JPopupMenu getPopupMenu (final Widget widget, final Point location) {&lt;br /&gt;&lt;br /&gt;         return popupMenu;&lt;br /&gt;&lt;br /&gt;     }&lt;br /&gt;&lt;br /&gt; };&lt;br /&gt;&lt;/code&gt;&lt;/blockquote&gt;&lt;br /&gt;Nuestro buen amigo &lt;span style="font-style: italic;"&gt;Geertjan Wielenga&lt;/span&gt; nos dió un tip muy útil para agregar la funcionalidad de &lt;span style="font-style: italic;"&gt;Resize&lt;/span&gt; de nuestros Widgets, tip que apliqué en este ejemplo y que podemos ver &lt;a href="http://java.dzone.com/news/how-add-resize-functionality-v"&gt;acá&lt;/a&gt;. El único problema es que es que para que ese tip funcione, se debe modificar la clase &lt;span style="font-style: italic;"&gt;ImageWidget&lt;/span&gt; del API de la Visual Library, lo cual no es muy cómodo. Lo que hice fue crear una clase llamada &lt;span style="font-style: italic;"&gt;MyImageWidget&lt;/span&gt; a la cual le apliqué el tip de Geertjan. También generé una clase llamada &lt;span style="font-style: italic;"&gt;MyIconNodeWidget&lt;/span&gt;, la cual hace uso de la clase MyImageWidget (en vez de la clase &lt;span style="font-style: italic;"&gt;ImageWidget&lt;/span&gt;). La clase MyWidget extiende de &lt;span style="font-style: italic;"&gt;MyIconNodeWidget&lt;/span&gt; en vez de IconNodeWidget por lo que de esa forma se tiene la funcionalidad de Resize sin necesidad de cargar el código fuente de la API de la Visual Library.&lt;br /&gt;&lt;br /&gt;También se agregó la funcionalidad de poder eliminar un widget (MyWidget o MyConnectionWidget) desde la escena presionando la tecla &lt;span style="font-weight: bold;"&gt;DELETE&lt;/span&gt;, para lo cual se creó la clase &lt;span style="font-style: italic;"&gt;KeyEventLoggerAction&lt;/span&gt;, en donde el código para eliminar el widget es el siguiente:&lt;br /&gt;&lt;blockquote&gt;&lt;code&gt;&lt;br /&gt;public State keyReleased(Widget widget, WidgetKeyEvent event) {&lt;br /&gt;&lt;br /&gt; if (event.getKeyCode() == KeyEvent.VK_DELETE) {&lt;br /&gt;&lt;br /&gt;     GraphScene s = (GraphScene)widget.getScene();&lt;br /&gt;&lt;br /&gt;     if(widget instanceof MyWidget) {&lt;br /&gt;&lt;br /&gt;         s.removeNode(s.findObject(widget));&lt;br /&gt;&lt;br /&gt;         return State.CONSUMED;&lt;br /&gt;&lt;br /&gt;     }&lt;br /&gt;&lt;br /&gt;     else if(widget instanceof MyConnectionWidget){&lt;br /&gt;&lt;br /&gt;         widget.removeFromParent();&lt;br /&gt;&lt;br /&gt;         return State.CONSUMED;&lt;br /&gt;&lt;br /&gt;     }&lt;br /&gt;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt; return State.REJECTED;&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/blockquote&gt;&lt;br /&gt;Lo importante acá es que para eliminar un objeto MyWidget se debe utilizar el método &lt;span style="font-weight: bold;"&gt;removeNode&lt;/span&gt; y en el caso de un objeto MyConnectionWidget se debe utilizar &lt;span style="font-weight: bold;"&gt;removeFromParent&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;La acción de eliminar se agrega en las clases MyWidget y MyConnectionWidget.&lt;br /&gt;&lt;br /&gt;Una opción muy útil, y que no he visto en Internet, es la capacidad de guardar la escena para que la podamos cargar en otro momento (importar/exportar). Para esto creé el método &lt;span style="font-weight: bold;"&gt;saveWidgetsToXML&lt;/span&gt; en la clase MyScene y lo que hace es tomar cada uno de los objetos MyWidget, toma la clase MyNode de cada uno y lo pasa a un XML, almacenando sus atributos como texto (incluyendo la imagen, usando Base64).  También toma los objetos MyConnectionWidget, de cada uno toma el objeto MyEdge y los almacena en el mismo XML, guardando la relación entre Widgets.&lt;br /&gt;&lt;blockquote&gt;&lt;code&gt;&lt;br /&gt;public void saveWidgetsToXML() {&lt;br /&gt;&lt;br /&gt; JFileChooser chooser = new JFileChooser ();&lt;br /&gt;&lt;br /&gt; chooser.setDialogTitle ("Save Scene As XML");&lt;br /&gt;&lt;br /&gt; chooser.setDialogType (JFileChooser.SAVE_DIALOG);&lt;br /&gt;&lt;br /&gt; chooser.setMultiSelectionEnabled (false);&lt;br /&gt;&lt;br /&gt; chooser.setFileSelectionMode (JFileChooser.FILES_ONLY);&lt;br /&gt;&lt;br /&gt; chooser.setFileFilter (new FileFilter() {&lt;br /&gt;&lt;br /&gt;     public boolean accept (File file) {&lt;br /&gt;&lt;br /&gt;         if (file.isDirectory ())&lt;br /&gt;&lt;br /&gt;         return true;&lt;br /&gt;&lt;br /&gt;         return file.getName ().toLowerCase ().endsWith (".xml"); // NOI18N&lt;br /&gt;&lt;br /&gt;     }&lt;br /&gt;&lt;br /&gt;     public String getDescription () {&lt;br /&gt;&lt;br /&gt;         return "Extensible Markup Language (.xml)"; // NOI18N&lt;br /&gt;&lt;br /&gt;     }&lt;br /&gt;&lt;br /&gt; });&lt;br /&gt;&lt;br /&gt; if (chooser.showSaveDialog (new JFrame()) != JFileChooser.APPROVE_OPTION)&lt;br /&gt;&lt;br /&gt;     return;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt; File file = chooser.getSelectedFile ();&lt;br /&gt;&lt;br /&gt; if (! file.getName ().toLowerCase ().endsWith (".xml")) // NOI18N&lt;br /&gt;&lt;br /&gt;     file = new File (file.getParentFile (), file.getName () + ".xml"); // NOI18N&lt;br /&gt;&lt;br /&gt; if (file.exists ()) {&lt;br /&gt;&lt;br /&gt;     DialogDescriptor descriptor = new DialogDescriptor (&lt;br /&gt;&lt;br /&gt;             "File (" + file.getAbsolutePath () + ") already exists. Do you want to overwrite it?",&lt;br /&gt;&lt;br /&gt;             "File Exists", true, DialogDescriptor.YES_NO_OPTION, DialogDescriptor.NO_OPTION, null);&lt;br /&gt;&lt;br /&gt;     DialogDisplayer.getDefault ().createDialog (descriptor).setVisible (true);&lt;br /&gt;&lt;br /&gt;     if (descriptor.getValue () != DialogDescriptor.YES_OPTION)&lt;br /&gt;&lt;br /&gt;         return;&lt;br /&gt;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt; WidgetsXML wxml = new WidgetsXML(file);&lt;br /&gt;&lt;br /&gt; wxml.prepareToSave();&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt; List&amp;lt;Widget&amp;gt; list = mainLayer.getChildren();&lt;br /&gt;&lt;br /&gt; for(int i=0; i&amp;lt;list.size(); i++) {&lt;br /&gt;&lt;br /&gt;     MyWidget w = (MyWidget)list.get(i);&lt;br /&gt;&lt;br /&gt;     MyNode n = w.getNode();&lt;br /&gt;&lt;br /&gt;     n.setLocation(w.getLocation());&lt;br /&gt;&lt;br /&gt;     wxml.addMyNode(n);&lt;br /&gt;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt; List&amp;lt;Widget&amp;gt; listConn = connectionLayer.getChildren();&lt;br /&gt;&lt;br /&gt; for(int i=0; i&amp;lt;listConn.size(); i++) {&lt;br /&gt;&lt;br /&gt;     MyConnectionWidget w = (MyConnectionWidget)listConn.get(i);&lt;br /&gt;&lt;br /&gt;     MyEdge e = w.getMyEdge();&lt;br /&gt;&lt;br /&gt;     wxml.addMyEdge(e);&lt;br /&gt;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt; wxml.save();&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/blockquote&gt;&lt;br /&gt;El archivo XML tiene la forma&lt;br /&gt;&lt;blockquote&gt;&lt;code&gt;&lt;br /&gt;&amp;lt;?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;raiz&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;my-nodes&amp;gt;&amp;lt;/my-nodes&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;my-edges&amp;gt;&amp;lt;/my-edges&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/raiz&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;/blockquote&gt;&lt;br /&gt;También se agregó la opción de cargar el XML y reconstruir la escena, para lo que se creó el método loadWidgetsFromXML&lt;br /&gt;&lt;blockquote&gt;&lt;code&gt;&lt;br /&gt;public void loadWidgetsFromXML() {&lt;br /&gt;&lt;br /&gt; JFileChooser chooser = new JFileChooser ();&lt;br /&gt;&lt;br /&gt; chooser.setDialogTitle ("Load Scene From XML");&lt;br /&gt;&lt;br /&gt; chooser.setDialogType (JFileChooser.OPEN_DIALOG);&lt;br /&gt;&lt;br /&gt; chooser.setMultiSelectionEnabled (false);&lt;br /&gt;&lt;br /&gt; chooser.setFileSelectionMode (JFileChooser.FILES_ONLY);&lt;br /&gt;&lt;br /&gt; chooser.setFileFilter (new FileFilter() {&lt;br /&gt;&lt;br /&gt;     public boolean accept (File file) {&lt;br /&gt;&lt;br /&gt;         if (file.isDirectory ())&lt;br /&gt;&lt;br /&gt;         return true;&lt;br /&gt;&lt;br /&gt;         return file.getName ().toLowerCase ().endsWith (".xml"); // NOI18N&lt;br /&gt;&lt;br /&gt;     }&lt;br /&gt;&lt;br /&gt;     public String getDescription () {&lt;br /&gt;&lt;br /&gt;         return "Extensible Markup Language (.xml)"; // NOI18N&lt;br /&gt;&lt;br /&gt;     }&lt;br /&gt;&lt;br /&gt; });&lt;br /&gt;&lt;br /&gt; if (chooser.showSaveDialog (new JFrame()) != JFileChooser.APPROVE_OPTION)&lt;br /&gt;&lt;br /&gt;     return;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt; File file = chooser.getSelectedFile ();&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt; WidgetsXML wxml = new WidgetsXML(file);&lt;br /&gt;&lt;br /&gt; wxml.prepareToLoad();&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt; ArrayList&amp;lt;MyNode&amp;gt; myNodes = wxml.getMyNodes();&lt;br /&gt;&lt;br /&gt; for(int i=0; i&amp;lt;myNodes.size(); i++) {&lt;br /&gt;&lt;br /&gt;     MyNode node = myNodes.get(i);&lt;br /&gt;&lt;br /&gt;     Widget w = MyScene.this.addNode(node);&lt;br /&gt;&lt;br /&gt;     getSceneAnimator().animatePreferredLocation(w, w.convertLocalToScene(node.getLocation()));&lt;br /&gt;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt; ArrayList&amp;lt;MyEdge&amp;gt; myEdges = wxml.getMyEdges();&lt;br /&gt;&lt;br /&gt; MyNode source = null;&lt;br /&gt;&lt;br /&gt; MyNode target = null;&lt;br /&gt;&lt;br /&gt; for(int i=0; i&amp;lt;myEdges.size(); i++) {&lt;br /&gt;&lt;br /&gt;     MyEdge edge = myEdges.get(i);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     for(int j=0; j&amp;lt;myNodes.size(); j++) {&lt;br /&gt;&lt;br /&gt;         MyNode n = myNodes.get(j);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;         if(n.getId().equals(edge.getSource()))&lt;br /&gt;&lt;br /&gt;             source = n;&lt;br /&gt;&lt;br /&gt;         if(n.getId().equals(edge.getTarget()))&lt;br /&gt;&lt;br /&gt;             target = n;&lt;br /&gt;&lt;br /&gt;     }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     addEdge(edge);&lt;br /&gt;&lt;br /&gt;     setEdgeSource(edge, source);&lt;br /&gt;&lt;br /&gt;     setEdgeTarget(edge, target);&lt;br /&gt;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/blockquote&gt;&lt;br /&gt;El detalle de la funcionalidad de los Widgets lo pueden ver leyendo el código fuente de este ejemplo. El código es muy limpio y simple, por lo que no creo que tengan problemas en entenderlo. Si hay dudas, comenten en el blog.&lt;br /&gt;&lt;br /&gt;Dejo unas capturas de pantalla para que vean como luce la aplicación.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_TGgpRudXV3w/SyV0CgDK6FI/AAAAAAAABjE/TRWkczpYgTc/s1600-h/imagen.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="http://4.bp.blogspot.com/_TGgpRudXV3w/SyV0CgDK6FI/AAAAAAAABjE/TRWkczpYgTc/s320/imagen.png" alt="" id="BLOGGER_PHOTO_ID_5414861713294682194" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_TGgpRudXV3w/SyV0UuQ-ndI/AAAAAAAABjM/cRn8Vf2_aSU/s1600-h/imagen1.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="http://4.bp.blogspot.com/_TGgpRudXV3w/SyV0UuQ-ndI/AAAAAAAABjM/cRn8Vf2_aSU/s320/imagen1.png" alt="" id="BLOGGER_PHOTO_ID_5414862026348338642" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_TGgpRudXV3w/SyV03QzHQHI/AAAAAAAABjU/n0ad8v3YB8s/s1600-h/imagen2.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="http://4.bp.blogspot.com/_TGgpRudXV3w/SyV03QzHQHI/AAAAAAAABjU/n0ad8v3YB8s/s320/imagen2.png" alt="" id="BLOGGER_PHOTO_ID_5414862619733868658" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_TGgpRudXV3w/SyV03q2FUyI/AAAAAAAABjc/CocP17bwZZE/s1600-h/imagen3.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="http://3.bp.blogspot.com/_TGgpRudXV3w/SyV03q2FUyI/AAAAAAAABjc/CocP17bwZZE/s320/imagen3.png" alt="" id="BLOGGER_PHOTO_ID_5414862626725647138" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_TGgpRudXV3w/SyV03875Q0I/AAAAAAAABjk/lZa3RHO0rK8/s1600-h/imagen4.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="http://4.bp.blogspot.com/_TGgpRudXV3w/SyV03875Q0I/AAAAAAAABjk/lZa3RHO0rK8/s320/imagen4.png" alt="" id="BLOGGER_PHOTO_ID_5414862631581860674" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Saludos !!!&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1421033339681316542-5109512618973477964?l=metalklesk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://metalklesk.blogspot.com/feeds/5109512618973477964/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://metalklesk.blogspot.com/2009/12/netbeans-68-y-visual-library-api.html#comment-form' title='35 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1421033339681316542/posts/default/5109512618973477964'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1421033339681316542/posts/default/5109512618973477964'/><link rel='alternate' type='text/html' href='http://metalklesk.blogspot.com/2009/12/netbeans-68-y-visual-library-api.html' title='NetBeans 6.8 y Visual Library API, ejemplo completo'/><author><name>Daniel Dario Morales Salas</name><uri>http://www.blogger.com/profile/07642586501018157497</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='28' src='http://3.bp.blogspot.com/_TGgpRudXV3w/SfP_sc5YZ3I/AAAAAAAABSs/APK4YFwjVn4/S220/yoft3.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_TGgpRudXV3w/SyVZDqyKGTI/AAAAAAAABik/igt3lKTHkdA/s72-c/snapshot1.png' height='72' width='72'/><thr:total>35</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1421033339681316542.post-8947889878931876524</id><published>2009-11-04T21:27:00.000-03:00</published><updated>2009-11-04T21:28:11.293-03:00</updated><title type='text'>Mandriva 2010 liberado, actualízate !!!</title><content type='html'>&lt;strong&gt;Mandriva Linux 2010&lt;/strong&gt;&lt;br /&gt;&lt;p&gt;Mandriva, el editor europeo líder en soluciones Linux, anuncio el 3 de Noviembre de 2009 el lanzamiento de Mandriva Linux 2010. Más rápida, fácil y segura que nunca, Mandriva Linux ofrece nuevas funcionalidades que revolucionarán el entorno de escritorio. Mandriva Linux 2010 es el sistema operativo Linux más avanzado hasta la fecha, una genuina concentración de tecnologías e innovaciones. Incluye soporte para un amplio número de configuraciones de hardware, lo que lo convierte en base sólida y estable para los usuarios.&lt;br /&gt;&lt;p&gt;Mandriva Linux 2010 combina simplicidad y cordialidad en un entorno intuitivo y de alto rendimiento. Es la distribución ideal para toda clase de usuarios, desde los más nuevos hasta los avanzados. Diseñada para satisfacer las necesidades reales de los usuarios, en cuanto a seguridad, rendimiento y ergonomía, Mandriva Linux 2010 es todo lo que Usted siempre ha esperado de un sistema operativo.&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;"En la búsqueda incesante para ofrecer la mejor experiencia de uso posible, nunca dejamos de lado nuestro objetivo: diseñar uno de los más avanzados sistemas del mundo"&lt;/blockquote&gt;Explica Anne Nicolas-Velu, Directora de Ingeniería de Mandriva.&lt;br /&gt;&lt;p&gt;Mandriva Linux 2010 ofrece un sistema operativo Linux que no solo es el más avanzado y fácil de usar del mercado, sino también que integra la lista de los softwares más completos. El corazón de las innovaciones de Mandriva 2010 es el "Escritorio inteligente", una tecnología única que ofrece acceso dinámico a todos los archivos mediante su etiquetado; clasificación de fotos, documentos, correos electrónicos y videos salvaguardando los datos personales a través de un&lt;br /&gt;enfoque personalizado.&lt;br /&gt;&lt;p&gt;En pocas palabras, Mandriva Linux 2010 ofrece un sistema completo, de rápida y fácil instalación; y que incluye:&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;Todos los controladores necesarios Compatibilidad con las nuevas plataformas (así cómo con las más antiguas), incluídos los netbooks.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Una amplia gama aplicaciones que abarcan ofimática, software educativo, multimedia, juegos&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Moblin: El entorno para plataformas móviles&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Herramientas que permiten mantener su sistema seguro de manera fácil&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Las últimas versiones de las principales aplicaciones de Código Abierto:&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;KDE 4.3.2&lt;/li&gt;&lt;br /&gt;&lt;li&gt;GNOME 2.28&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Firefox 3.5.3&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Xorg Server 1.6.5&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;Un amplio rango de aplicaciones complementarias en la versión Powerpack: Códecs de video y audio, virtualización a través de VMware, aplicaciones de Adobe. Etc.&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;p&gt; Mandriva Linux es un sistema operativo de uso diario que se adapta a su ordenador y dispositivos. Satisfará todas sus necesidades y le permitirá compartir la experiencia con sus amigos. Mandriva Linux 2010 está disponible en tres ediciones:&lt;br /&gt;&lt;ol&gt;&lt;br /&gt;&lt;li&gt;Powerpack (la edición comercial, que incluye software exclusivo, soporte y servicios)&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://www.mandriva.com/es/descargas"&gt;One&lt;/a&gt; (un Cd en vivo que puede ser también instalado permanentemente en el equipo) y&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://www.mandriva.com/es/descargas"&gt;Free&lt;/a&gt; (una edición que únicamente incluye Software Libre y de Código Abierto).&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://www.mandriva.com/es/descargas"&gt;Dual Arch&lt;/a&gt; (edición para arquitecturas i586 / 32 bits y x86 / 64 bits es la instalacion minima, perfecta para sistemas antiguos).&lt;/li&gt;&lt;br /&gt;&lt;/ol&gt;&lt;br /&gt;&lt;strong&gt;Versiones libres y gratuitas&lt;/strong&gt;&lt;br /&gt;&lt;p&gt;Mandriva Linux, Free, ONE y Dual Arch pueden ser descargadas desde sin cargo alguno:&lt;br /&gt;&lt;p&gt;&lt;a href="http://www.mandriva.com/es/descargas"&gt;http://www.mandriva.com/es/descargas&lt;/a&gt;&lt;br /&gt;&lt;p&gt;&lt;a href="http://torrent.mandriva.com/public/2010.0/"&gt;http://torrent.mandriva.com/public/2010.0/&lt;/a&gt;&lt;br /&gt;&lt;p&gt;Las versiones FREE y DUAL ARCH &lt;b&gt;solo contienen Software Libre&lt;/b&gt; la version ONE trae consigo algunos programas cuya licencia no es libre.&lt;br /&gt;&lt;p&gt;&lt;strong&gt;Version de pago: Precios y disponibilidad&lt;/strong&gt;&lt;br /&gt;&lt;p&gt;Todas las ediciones de Mandriva Linux 2010 estarán disponibles para su descarga desde el 3 de Noviembre de 2009. Puede obtener la edición de descarga de Mandriva Linux 2010 Powerpack desde Mandriva Store:&lt;br /&gt;&lt;p&gt;&lt;a href="http://store.mandriva.com/"&gt;http://store.mandriva.com/&lt;/a&gt;&lt;br /&gt;&lt;p&gt;o puede comprar una suscripción Powerpack y descargar Mandriva Linux 2010 Powerpack hoy. Mandriva Linux 2010 Free y One pueden descargarse desde el sitio de Mandriva:&lt;br /&gt;&lt;p&gt;&lt;a href="http://www.mandriva.com/"&gt;http://www.mandriva.com/&lt;/a&gt;&lt;br /&gt;&lt;p&gt;La edición en caja de Mandriva Linux 2010 Powerpack esta disponible por 69 euros, o US$79. La edición "Slim" (liviana) (solo contiene el DVD sin documentación) está disponible por 64 euros, o US$74. La suscripción Powerpack le permite obtener la edición de descarga de Powerpack durante doce meses (por lo que cubre 2 versiones Mandriva Linux), disponible por 69 euros, o US$79.&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;b&gt;¿Necesitas ayuda con Mandriva linux?&lt;/b&gt;&lt;br /&gt;&lt;p&gt;Visita la Comunidad y Foro Oficiales de los Usuarios Hispanohablantes de Mandriva Linux:&lt;br /&gt;&lt;a href="http=//blogdrake.net"&gt;blogdrake.net&lt;/a&gt;&lt;br /&gt;&lt;p&gt;&lt;i&gt;Traduccion realizada por el equipo de Traductores de BlogDRAKE "MDK Trans"&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Copia esta noticia en tu sitio web: &lt;a href="http://blogdrake.net/consulta/colabora-con-mandriva-linux-copia-esto-tu-sitio-web"&gt;Colabora con Mandriva Linux&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1421033339681316542-8947889878931876524?l=metalklesk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://metalklesk.blogspot.com/feeds/8947889878931876524/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://metalklesk.blogspot.com/2009/11/mandriva-2010-liberado-actualizate.html#comment-form' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1421033339681316542/posts/default/8947889878931876524'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1421033339681316542/posts/default/8947889878931876524'/><link rel='alternate' type='text/html' href='http://metalklesk.blogspot.com/2009/11/mandriva-2010-liberado-actualizate.html' title='Mandriva 2010 liberado, actualízate !!!'/><author><name>Daniel Dario Morales Salas</name><uri>http://www.blogger.com/profile/07642586501018157497</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='28' src='http://3.bp.blogspot.com/_TGgpRudXV3w/SfP_sc5YZ3I/AAAAAAAABSs/APK4YFwjVn4/S220/yoft3.png'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1421033339681316542.post-1532394179392073173</id><published>2009-09-04T10:51:00.029-04:00</published><updated>2009-09-05T00:17:07.712-04:00</updated><title type='text'>Zenoss - Monitoreo de infraestructura TI</title><content type='html'>&lt;div style="text-align: justify;"&gt;&lt;a href="http://www.zenoss.com/"&gt;Zenoss&lt;/a&gt; es un software opensource que permite realizar monitoreo remoto de equipos como servidores, routers, ups, etc.&lt;br /&gt;&lt;br /&gt;El monitoreo permite saber si un equipo está andando (up) o no (down), permite saber los filesystem que tiene (discos duros, unidades externas, opticos, RAM, memoria caché, etc.) y la utilización (total, usado, libre), permite saber qué procesos y servicios están corriendo y además saber que aplicaciones están instaladas en el equipo.&lt;br /&gt;&lt;br /&gt;Y para que quiero saber esto de forma remota ? simple e importante, hoy en día toda infraestructura TI es crítica para el negocio ya que sin ésta es muy dificil que el negocio funcione, la infraestructura TI es la base de los negocios de hoy y el mañana y es importante tener un control respecto a los equipos y los servicios que corren y que soportan a nuestro equipo de trabajo y el de nuestros clientes.&lt;br /&gt;&lt;br /&gt;El monitoreo permite adelantarse a los problemas y generar directivas preventivas y correctivas de manera tal de asegurar la prestación y calidad de nuestros servicios.&lt;br /&gt;&lt;br /&gt;Zenoss es una solución entre varias como &lt;a href="http://www.nagios.org/"&gt;Nagios&lt;/a&gt; u &lt;a href="http://www.opennms.org/"&gt;openNMS&lt;/a&gt; e incluso otras propietarias como &lt;a href="http://www.bmc.com/products"&gt;BMC Performance Manager Portal y BMC Proactive Net&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;La gracia de Zenoss es que es simple de usar y configurar, es mas escalable que Nagios y puede utilizar plugines de éste último. A modo personal puedo decir que se parece a BMC Performance Manager Portal y BMC Proactive Net en su forma de funcionar y los servicios y opciones que provee.&lt;br /&gt;&lt;br /&gt;Zenoss permite manejar eventos provenientes de los equipos monitoreados y generar notificaciones de alertas según lo configure el administrador, por ejemplo, si el servicio SSH se cae o no se ha levantado, es un error crítico desde el punto de vista del servicio como tal, pero tal vez no impacte mi infraestructura de forma grave por lo que se puede configurar una notificación con una criticidad baja.&lt;br /&gt;&lt;br /&gt;Zenoss permite monitorear utilizando &lt;a href="http://es.wikipedia.org/wiki/Simple_Network_Management_Protocol"&gt;SNMP&lt;/a&gt;, &lt;a href="http://es.wikipedia.org/wiki/Secure_Shell"&gt;SSH&lt;/a&gt;, &lt;a href="http://es.wikipedia.org/wiki/Secure_Shell"&gt;WMI&lt;/a&gt;. Actualmente SSH es el más débil de los 3 ya que su implementación aún no está completa, sin embargo ya existen packs que permiten obtener bastante información útil desde máquinas con Ubuntu, Fedora y openSUSE. Hay que mantenerse informado y actualizado ya que las posibilidades mediante SSH son muchas porque se pueden ejecutar comandos que nos pueden traer cualquier métrica que necesitemos.&lt;br /&gt;&lt;br /&gt;Mediante WMI podemos obtener información útil de máquinas Windows como los servicios que están corriendo y el software instalado.&lt;br /&gt;&lt;br /&gt;La información que viene desde SNMP es bastante y por lo general suficiente para saber que procesos corren o el % de utización de los recursos físicos.&lt;br /&gt;&lt;br /&gt;Zenoss muestra, además, gráficas representativas de la utilización de recursos de CPU y memoria.&lt;br /&gt;&lt;br /&gt;Al ser un software opensource, existe una comunidad que aporta con packs de monitoreo, llamados ZenPacks, que extienden la aplicación agregando soporte para más dispositivos, características nuevas o mejoras en performance a dispositivos ya soportados.&lt;br /&gt;&lt;br /&gt;El negocio de Zenoss está en el soporte, como todo negocio basado en modelo opensource. Mantienen dos versiones del software, Zenoss Core y Zenoss Enterprise. La primera es la versión libre y gratis que se puede &lt;a href="http://sourceforge.net/projects/zenoss/files/"&gt;descargar&lt;/a&gt; y utilizar, la segunda es la versión pagada con soporte profesional. Ambas son capaces de lo mismo, solo que a la primera se le deben integrar los ZenPacks necesarios (viene listo para SNMP y SSH básico, se debe instalar el soporte para monitoreo WMI, lo cual es muy fácil de hacer).&lt;br /&gt;&lt;br /&gt;Una característica realmente interesante es la funcionalidad de &lt;a href="http://www.zenoss.com/product/network-management"&gt;Thresholds predictivos&lt;/a&gt; que lo acerca a su rival BMC Proactive Net, funcionalidad que permite manejar umbrales dinámicos.&lt;br /&gt;&lt;br /&gt;Un umbral dinámico permite manejar valores distintos de acuerdo a la realidad de nuestra organización, por ejemplo para un banco el día 30 sus servidores reciben una mayor carga pero eso es un comportamiento normal por lo que no es necesario alertar, pero si el mismo comportamiento ocurre un día 10 entonces si estamos frente a un problema. Esto no lo permite hacer BMC Performance Manager Portal ni Nagios, punto a favor a Zenoss.&lt;br /&gt;&lt;br /&gt;Otra característica importante es el soporte para monitoreo de infraestructura de servidores virtuales VMware ESX 4 (vSphere) ya que está &lt;a href="http://www.zenoss.com/news/archive/zenosspressrelease.2009-08-31.6915744310"&gt;acreditado&lt;/a&gt; por &lt;a href="http://www.vmware.com/"&gt;VMware&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;También tiene integración con Remedy mediante el cual se pueden generar tickets de soporte.&lt;br /&gt;&lt;br /&gt;La comunidad alrededor de Zenoss es muy amable, tuve la oportunidad de hacer preguntas y comentarios a los desarrolladores de Zenoss mediante el &lt;a href="http://blog.zenoss.com/2009/09/02/zenoss-irc-session-thursday-september-3/"&gt;IRC&lt;/a&gt; y no tuvieron ningún problema en responder y aclarar mis dudas. Zenoss tiene a nuestra disposición un &lt;a href="http://blog.zenoss.com/"&gt;blog&lt;/a&gt;, &lt;a href="http://forums.zenoss.com/"&gt;foros&lt;/a&gt;, &lt;a href="http://www.zenoss.com/news"&gt;noticias&lt;/a&gt; y el &lt;a href="http://blog.zenoss.com/2009/09/02/zenoss-irc-session-thursday-september-3/"&gt;IRC&lt;/a&gt; para hacer preguntas en vivo.&lt;br /&gt;&lt;br /&gt;La instalación es muy simple de realizar, solo requiere que esté instalado &lt;a href="http://www.mysql.com/"&gt;MySQL&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Primero hay que descargar el instalador de &lt;a href="http://sourceforge.net/projects/zenoss/files/"&gt;acá&lt;/a&gt;, está para 32 y 64 bits (solo para linux).&lt;br /&gt;&lt;br /&gt;Luego le damos permisos al ejecutable&lt;br /&gt;&lt;blockquote&gt;chmod +x instalador&lt;/blockquote&gt;&lt;br /&gt;y lo ejecutamos desde consola&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_TGgpRudXV3w/SqE1NtUuWRI/AAAAAAAABfk/ZsAJdOqLNJw/s1600-h/1.jpeg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="http://4.bp.blogspot.com/_TGgpRudXV3w/SqE1NtUuWRI/AAAAAAAABfk/ZsAJdOqLNJw/s320/1.jpeg" alt="" id="BLOGGER_PHOTO_ID_5377637939678173458" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Presionamos next&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_TGgpRudXV3w/SqE1dS1EoyI/AAAAAAAABfs/rOl3sMyZ-hc/s1600-h/2.jpeg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="http://1.bp.blogspot.com/_TGgpRudXV3w/SqE1dS1EoyI/AAAAAAAABfs/rOl3sMyZ-hc/s320/2.jpeg" alt="" id="BLOGGER_PHOTO_ID_5377638207444001570" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Seleccionamos el lugar de instalación&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_TGgpRudXV3w/SqE1uliE8rI/AAAAAAAABf0/0KdFdv4vC7E/s1600-h/3.jpeg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="http://2.bp.blogspot.com/_TGgpRudXV3w/SqE1uliE8rI/AAAAAAAABf0/0KdFdv4vC7E/s320/3.jpeg" alt="" id="BLOGGER_PHOTO_ID_5377638504522379954" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Ingresamos el nombre la contraseña del usuario administrador de MySQL&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_TGgpRudXV3w/SqE1vO4xB6I/AAAAAAAABf8/vjIp6ly-BGw/s1600-h/4.jpeg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="http://1.bp.blogspot.com/_TGgpRudXV3w/SqE1vO4xB6I/AAAAAAAABf8/vjIp6ly-BGw/s320/4.jpeg" alt="" id="BLOGGER_PHOTO_ID_5377638515623397282" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Presionamos next&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_TGgpRudXV3w/SqE1vcB-VOI/AAAAAAAABgE/ZHyw3SPWkt0/s1600-h/5.jpeg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="http://3.bp.blogspot.com/_TGgpRudXV3w/SqE1vcB-VOI/AAAAAAAABgE/ZHyw3SPWkt0/s320/5.jpeg" alt="" id="BLOGGER_PHOTO_ID_5377638519151678690" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Esperamos unos minutos&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_TGgpRudXV3w/SqE1vokG-RI/AAAAAAAABgM/GiSawrH8928/s1600-h/6.jpeg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="http://4.bp.blogspot.com/_TGgpRudXV3w/SqE1vokG-RI/AAAAAAAABgM/GiSawrH8928/s320/6.jpeg" alt="" id="BLOGGER_PHOTO_ID_5377638522516076818" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Y ya tenemos Zenoss listo&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_TGgpRudXV3w/SqE1wKooaXI/AAAAAAAABgU/BUA_jzIWoHI/s1600-h/7.jpeg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="http://4.bp.blogspot.com/_TGgpRudXV3w/SqE1wKooaXI/AAAAAAAABgU/BUA_jzIWoHI/s320/7.jpeg" alt="" id="BLOGGER_PHOTO_ID_5377638531661850994" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Con eso ya la instalación está completa.&lt;br /&gt;&lt;br /&gt;Para ingresar simplemente abrimos un navegador web e ingresamos la siguiente URL:&lt;br /&gt;&lt;blockquote&gt;&lt;a href="http://localhost:8080/"&gt;http://localhost:8080&lt;/a&gt;&lt;/blockquote&gt;&lt;br /&gt;y se abrirá la pantalla inicial de configuración de Zenoss&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_TGgpRudXV3w/SqE3Lqd-S-I/AAAAAAAABgc/FYXWu91b1fs/s1600-h/1.jpeg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="http://4.bp.blogspot.com/_TGgpRudXV3w/SqE3Lqd-S-I/AAAAAAAABgc/FYXWu91b1fs/s320/1.jpeg" alt="" id="BLOGGER_PHOTO_ID_5377640103575178210" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Pinchamos Step 1 y veremos la siguiente pantalla en donde debemos ingresar la contraseña del usuario &lt;span style="font-style: italic;"&gt;"admin"&lt;/span&gt; e ingresamos un nuevo usuario de monitoreo&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_TGgpRudXV3w/SqE3U8HJMSI/AAAAAAAABgk/BDmqzI74tpk/s1600-h/2.jpeg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="http://4.bp.blogspot.com/_TGgpRudXV3w/SqE3U8HJMSI/AAAAAAAABgk/BDmqzI74tpk/s320/2.jpeg" alt="" id="BLOGGER_PHOTO_ID_5377640262930084130" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Ahora podemos agregar máquinas para monitorear&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_TGgpRudXV3w/SqE3VLPgiKI/AAAAAAAABgs/X_hd25S0gzc/s1600-h/3.jpeg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="http://4.bp.blogspot.com/_TGgpRudXV3w/SqE3VLPgiKI/AAAAAAAABgs/X_hd25S0gzc/s320/3.jpeg" alt="" id="BLOGGER_PHOTO_ID_5377640266991700130" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_TGgpRudXV3w/SqE3Vsmqi9I/AAAAAAAABg0/ROnSbG4jmho/s1600-h/4.jpeg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="http://4.bp.blogspot.com/_TGgpRudXV3w/SqE3Vsmqi9I/AAAAAAAABg0/ROnSbG4jmho/s320/4.jpeg" alt="" id="BLOGGER_PHOTO_ID_5377640275947195346" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Seleccionamos la opcion &lt;span style="font-style: italic;"&gt;Manually find devices&lt;/span&gt; e ingresamos el IP de la máquina que queremos, en este caso un Linux por SNMP y luego pinchamos submit&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_TGgpRudXV3w/SqE7jj8YtVI/AAAAAAAABg8/roEYbTjxCog/s1600-h/1.jpeg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="http://2.bp.blogspot.com/_TGgpRudXV3w/SqE7jj8YtVI/AAAAAAAABg8/roEYbTjxCog/s320/1.jpeg" alt="" id="BLOGGER_PHOTO_ID_5377644912187061586" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_TGgpRudXV3w/SqE7_5DYmyI/AAAAAAAABhE/3m_FdkprPd4/s1600-h/2.jpeg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="http://3.bp.blogspot.com/_TGgpRudXV3w/SqE7_5DYmyI/AAAAAAAABhE/3m_FdkprPd4/s320/2.jpeg" alt="" id="BLOGGER_PHOTO_ID_5377645398889896738" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Si pinchamos &lt;span style="font-style: italic;"&gt;Devices&lt;/span&gt; (al lado derecho en la pestaña &lt;span style="font-style: italic;"&gt;Classes&lt;/span&gt;) podemos ver que en &lt;span style="font-style: italic;"&gt;Server&lt;/span&gt; aparece un dispositivo agregado con color azul (que significa que se encontró el dispositivo)&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_TGgpRudXV3w/SqE8fkXab3I/AAAAAAAABhM/Yex_fXLtXuo/s1600-h/3.jpeg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="http://4.bp.blogspot.com/_TGgpRudXV3w/SqE8fkXab3I/AAAAAAAABhM/Yex_fXLtXuo/s320/3.jpeg" alt="" id="BLOGGER_PHOTO_ID_5377645943092572018" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Si pinchamos la elipse azul podemos ver el detalle del evento&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_TGgpRudXV3w/SqE8nug9ZBI/AAAAAAAABhU/jRJJZkgiZ6M/s1600-h/4.jpeg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="http://3.bp.blogspot.com/_TGgpRudXV3w/SqE8nug9ZBI/AAAAAAAABhU/jRJJZkgiZ6M/s320/4.jpeg" alt="" id="BLOGGER_PHOTO_ID_5377646083255919634" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Si pinchamos el nombre del dispositivo podemos ir a la página de monitoreo del mismo&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_TGgpRudXV3w/SqE9ABy76ZI/AAAAAAAABhc/s7Xn4fFlH_A/s1600-h/5.jpeg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="http://3.bp.blogspot.com/_TGgpRudXV3w/SqE9ABy76ZI/AAAAAAAABhc/s7Xn4fFlH_A/s320/5.jpeg" alt="" id="BLOGGER_PHOTO_ID_5377646500748454290" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_TGgpRudXV3w/SqE9S_eQ4oI/AAAAAAAABhk/Ecjq7L1HYig/s1600-h/6.jpeg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="http://3.bp.blogspot.com/_TGgpRudXV3w/SqE9S_eQ4oI/AAAAAAAABhk/Ecjq7L1HYig/s320/6.jpeg" alt="" id="BLOGGER_PHOTO_ID_5377646826542391938" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_TGgpRudXV3w/SqE9TGQUxeI/AAAAAAAABhs/xnYtz_yRZJo/s1600-h/7.jpeg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="http://4.bp.blogspot.com/_TGgpRudXV3w/SqE9TGQUxeI/AAAAAAAABhs/xnYtz_yRZJo/s320/7.jpeg" alt="" id="BLOGGER_PHOTO_ID_5377646828362974690" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_TGgpRudXV3w/SqE9TtKwTZI/AAAAAAAABh0/diIUxan18VM/s1600-h/8.jpeg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="http://2.bp.blogspot.com/_TGgpRudXV3w/SqE9TtKwTZI/AAAAAAAABh0/diIUxan18VM/s320/8.jpeg" alt="" id="BLOGGER_PHOTO_ID_5377646838808595858" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_TGgpRudXV3w/SqE9T5Rc5II/AAAAAAAABh8/oFdYa0SR23s/s1600-h/9.jpeg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="http://3.bp.blogspot.com/_TGgpRudXV3w/SqE9T5Rc5II/AAAAAAAABh8/oFdYa0SR23s/s320/9.jpeg" alt="" id="BLOGGER_PHOTO_ID_5377646842057909378" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Como ven, instalar y agregar un elemento al monitoreo es muy simple de realizar y solo se requiere que el servicio SNMP esté activo en el dispositivo a monitorear (Windows, Linux, *NIX, etc.).&lt;br /&gt;&lt;br /&gt;Los invito a darle una oportunidad y probar Zenoss, realmente es muy muy muy bueno, una excelente alternativa para monitorear infraestructura que no tiene nada que envidiarle a sus rivales directos. Mas adelante iré agregando tips para usar este super software de monitoreo.&lt;br /&gt;&lt;br /&gt;Saludos !!!&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1421033339681316542-1532394179392073173?l=metalklesk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://metalklesk.blogspot.com/feeds/1532394179392073173/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://metalklesk.blogspot.com/2009/09/zenoss-monitoreo-de-infraestructura-ti.html#comment-form' title='10 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1421033339681316542/posts/default/1532394179392073173'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1421033339681316542/posts/default/1532394179392073173'/><link rel='alternate' type='text/html' href='http://metalklesk.blogspot.com/2009/09/zenoss-monitoreo-de-infraestructura-ti.html' title='Zenoss - Monitoreo de infraestructura TI'/><author><name>Daniel Dario Morales Salas</name><uri>http://www.blogger.com/profile/07642586501018157497</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='28' src='http://3.bp.blogspot.com/_TGgpRudXV3w/SfP_sc5YZ3I/AAAAAAAABSs/APK4YFwjVn4/S220/yoft3.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_TGgpRudXV3w/SqE1NtUuWRI/AAAAAAAABfk/ZsAJdOqLNJw/s72-c/1.jpeg' height='72' width='72'/><thr:total>10</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1421033339681316542.post-524302961112866323</id><published>2009-08-23T21:21:00.010-04:00</published><updated>2009-08-23T22:30:47.348-04:00</updated><title type='text'>JKiltro reproductor de audio 1.0.1</title><content type='html'>Hoy he subido la versión 1.0.1 de &lt;a href="http://code.google.com/p/jkiltroaudioplayer/"&gt;JKiltro Reproductor de Audio&lt;/a&gt;, el cual es un pequeño software desarrollado en Java con el IDE &lt;a href="http://www.netbeans.org/"&gt;NetBeans 6.7.1&lt;/a&gt;.&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;Este reproductor de audio se basa en varios proyectos open source para reproducir sonido, los cuales son:&lt;br /&gt;&lt;/div&gt;&lt;ul style="text-align: justify;"&gt;&lt;li&gt;&lt;a href="http://www.javazoom.net/jlgui/api.html"&gt;BasicPlayer 3.0&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.javazoom.net/javalayer/javalayer.html"&gt;JLayer 1.0.1&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.javazoom.net/jlgui/jlgui.html"&gt;JLGui 3.0&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.javazoom.net/mp3spi/mp3spi.html"&gt;MP3 SPI 1.9.4&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.javazoom.net/vorbisspi/vorbisspi.html"&gt;Vorbis SPI 1.0.3&lt;/a&gt;&lt;/li&gt;&lt;li&gt;JOgg 0.0.7&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.jcraft.com/jorbis/"&gt;JOrbis 0.0.17&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://jflac.sourceforge.net/"&gt;JFlac 1.2&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://jmac.sourceforge.net/"&gt;JMac&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.tritonus.org/plugins.html"&gt;Tritonus Share&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://code.google.com/p/libkj-java/"&gt;KJ_DSP 1.2&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://entagged.sourceforge.net/"&gt;Entagged 0.35&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.jthink.net/jaudiotagger/"&gt;JAudioTagger 1.0.9&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="https://substance.dev.java.net/"&gt;Substance 5.2&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div style="text-align: justify;"&gt;   Mediante el uso de los proyectos antes mencionados, &lt;span style="font-style: italic;"&gt;JKiltro Reproductor de Audio&lt;/span&gt; puede &lt;span style="font-style: italic;"&gt;reproducir archivos&lt;/span&gt; en los formatos &lt;span style="font-weight: bold;"&gt;aiff, ape, au, mp3, ogg, flac y wav&lt;/span&gt;, además permite &lt;span style="font-style: italic;"&gt;editar la metadata&lt;/span&gt; de los archivos &lt;span style="font-weight: bold;"&gt;ape, mp3, ogg y flac&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;JKiltro Reproductor de Audio&lt;/span&gt; mantiene una &lt;span style="font-style: italic;"&gt;lista única de reproducción&lt;/span&gt; y contiene los controles básicos de reproducción:&lt;br /&gt;&lt;blockquote&gt;reproducir, detener, pausa, anterior, siguiente, volumen, panning, saltar posición, agregar a la lista, eliminar de la lista, vaciar lista&lt;/blockquote&gt;&lt;br /&gt;además permite &lt;span style="font-style: italic;"&gt;saltarse&lt;/span&gt; la reproducción a cualquier pista de la lista simplemente presionando doble click o la tecla espacio sobre la canción que se quiere escuchar.&lt;br /&gt;&lt;br /&gt;También tiene la opción de &lt;span style="font-style: italic;"&gt;repetir&lt;/span&gt; la reproducción desde el inicio con solo marcar un cuadro con un ticket.&lt;br /&gt;&lt;br /&gt;Otra característica que lo hace interesante es que contiene un pequeño &lt;span style="font-style: italic;"&gt;previsualizador&lt;/span&gt; al momento de elegir la carpeta o archivos justo antes de seleccionarlos y agregarlos a la lista de reproducción, de manera que se puede escuchar y así estar seguros de agregarlos o no a la lista.&lt;br /&gt;&lt;br /&gt;Lo mejor de todo  este proyecto es que &lt;span style="font-weight: bold;"&gt;puede ser utilizado en sus propias aplicaciones&lt;/span&gt; ya que pueden agregar el panel principal a su propio contenedor (JFrame, JPanel) con solo crear una instancia:&lt;br /&gt;&lt;blockquote&gt;PanelPrincipalReproductorAudio reproductor = new PanelPrincipalReproductorAudio();&lt;/blockquote&gt;&lt;br /&gt;y ya tienen un reproductor de audio (y editor de metadata) empotrado.&lt;br /&gt;&lt;br /&gt;Si no les gusta la interfaz gráfica entonces pueden crearse una propia sin preocuparse por la lógica que maneja la reproducción y edición de los archivos de audio gracias al diseño MVC, simplemente utilizan una instancia del controlador del panel principal en su propio panel con la GUI.&lt;br /&gt;&lt;blockquote&gt;ControladorPanelPrincipalReproductorAudio controlador = new ControladorPanelPrincipalReproductorAudio();&lt;/blockquote&gt;Una buena forma de entender el código fuente es partir mirando la clase &lt;span style="font-weight: bold;"&gt;PanelPrincipalReproductorAudio.java&lt;/span&gt;, leer y tracear los métodos asociados a los eventos de cada botón, lo cual es muy útil al crearse una interfaz gráfica propia y hacer uso del controlador (que ya es capaz de encargarse de toda la lógica importante de la reproducción y edición).&lt;br /&gt;&lt;br /&gt;El proyecto &lt;span style="font-style: italic;"&gt;substance&lt;/span&gt; lo usé para permitir elegir un &lt;span style="font-style: italic;"&gt;theme&lt;/span&gt; para la aplicación pero eso no tiene nada que ver con la reproducción de audio, sin embargo es un proyecto muy interesante que le da belleza a las aplicaciones java.&lt;br /&gt;&lt;br /&gt;Aún quedan cosas por hacer, por ejemplo agregar un equalizador, JLGui trae uno pero falta integrarlo a mi proyecto.&lt;br /&gt;&lt;br /&gt;Lo he probado en &lt;a href="http://www.mandriva.com/"&gt;Mandriva Spring 2009&lt;/a&gt; y Windows XP SP3 y funciona bien.&lt;br /&gt;En el caso de Linux, si se quiere compartir el recurso de audio con otras aplicaciones se debe usar &lt;a href="http://es.wikipedia.org/wiki/PulseAudio"&gt;pulse audio&lt;/a&gt; y &lt;a href="http://openjdk.java.net/"&gt;OpenJDK&lt;/a&gt;, de otra forma la aplicación les tomará el recurso de audio y no permitirá a otras aplicaciones utilizarlo.&lt;br /&gt;&lt;br /&gt;A continuación les dejo algunas capturas de pantalla:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_TGgpRudXV3w/SpH5_Hy242I/AAAAAAAABek/En_1TFJPyLM/s1600-h/1.jpeg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="http://2.bp.blogspot.com/_TGgpRudXV3w/SpH5_Hy242I/AAAAAAAABek/En_1TFJPyLM/s320/1.jpeg" alt="" id="BLOGGER_PHOTO_ID_5373350693249147746" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_TGgpRudXV3w/SpH6Mf628ZI/AAAAAAAABes/wLuYeoHipx4/s1600-h/2.jpeg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="http://3.bp.blogspot.com/_TGgpRudXV3w/SpH6Mf628ZI/AAAAAAAABes/wLuYeoHipx4/s320/2.jpeg" alt="" id="BLOGGER_PHOTO_ID_5373350923063456146" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_TGgpRudXV3w/SpH6MicKVkI/AAAAAAAABe0/YDnQSmtfdfA/s1600-h/3.jpeg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="http://4.bp.blogspot.com/_TGgpRudXV3w/SpH6MicKVkI/AAAAAAAABe0/YDnQSmtfdfA/s320/3.jpeg" alt="" id="BLOGGER_PHOTO_ID_5373350923740010050" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_TGgpRudXV3w/SpH6NDlP8sI/AAAAAAAABe8/gYGYM7R3AQQ/s1600-h/4.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="http://3.bp.blogspot.com/_TGgpRudXV3w/SpH6NDlP8sI/AAAAAAAABe8/gYGYM7R3AQQ/s320/4.png" alt="" id="BLOGGER_PHOTO_ID_5373350932636496578" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_TGgpRudXV3w/SpH6NY794kI/AAAAAAAABfE/YXThY2PzX-c/s1600-h/5.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="http://2.bp.blogspot.com/_TGgpRudXV3w/SpH6NY794kI/AAAAAAAABfE/YXThY2PzX-c/s320/5.png" alt="" id="BLOGGER_PHOTO_ID_5373350938368926274" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_TGgpRudXV3w/SpH6NiIieoI/AAAAAAAABfM/ynfE6xy8A4M/s1600-h/6.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="http://4.bp.blogspot.com/_TGgpRudXV3w/SpH6NiIieoI/AAAAAAAABfM/ynfE6xy8A4M/s320/6.png" alt="" id="BLOGGER_PHOTO_ID_5373350940837575298" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_TGgpRudXV3w/SpH6xyuXoSI/AAAAAAAABfU/6nt9HyuOAhg/s1600-h/7.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="http://2.bp.blogspot.com/_TGgpRudXV3w/SpH6xyuXoSI/AAAAAAAABfU/6nt9HyuOAhg/s320/7.png" alt="" id="BLOGGER_PHOTO_ID_5373351563766505762" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_TGgpRudXV3w/SpH6yJw08MI/AAAAAAAABfc/kAElyrxyjU0/s1600-h/8.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="http://4.bp.blogspot.com/_TGgpRudXV3w/SpH6yJw08MI/AAAAAAAABfc/kAElyrxyjU0/s320/8.png" alt="" id="BLOGGER_PHOTO_ID_5373351569950830786" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Desde &lt;a href="http://jkiltroaudioplayer.googlecode.com/files/JKiltroReproductorAudio-1.0.1-src.tar.bz"&gt;aća&lt;/a&gt; pueden descargar el código fuente (proyecto NetBeans 6.7.1) y desde &lt;a href="http://jkiltroaudioplayer.googlecode.com/files/JKiltroReproductorAudio-1.0.1.tar.bz"&gt;acá&lt;/a&gt; pueden descargar los binarios para usar la aplicación y probarla.&lt;br /&gt;&lt;br /&gt;Espero les sea de utilidad.&lt;br /&gt;&lt;br /&gt;Saludos !!!&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1421033339681316542-524302961112866323?l=metalklesk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://metalklesk.blogspot.com/feeds/524302961112866323/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://metalklesk.blogspot.com/2009/08/jkiltro-reproductor-de-audio-101.html#comment-form' title='4 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1421033339681316542/posts/default/524302961112866323'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1421033339681316542/posts/default/524302961112866323'/><link rel='alternate' type='text/html' href='http://metalklesk.blogspot.com/2009/08/jkiltro-reproductor-de-audio-101.html' title='JKiltro reproductor de audio 1.0.1'/><author><name>Daniel Dario Morales Salas</name><uri>http://www.blogger.com/profile/07642586501018157497</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='28' src='http://3.bp.blogspot.com/_TGgpRudXV3w/SfP_sc5YZ3I/AAAAAAAABSs/APK4YFwjVn4/S220/yoft3.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_TGgpRudXV3w/SpH5_Hy242I/AAAAAAAABek/En_1TFJPyLM/s72-c/1.jpeg' height='72' width='72'/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1421033339681316542.post-3464340594674997898</id><published>2009-06-29T14:48:00.004-04:00</published><updated>2009-06-29T14:57:04.109-04:00</updated><title type='text'>Me titulé de Ingeniero Civil en Computación e Informática !!!</title><content type='html'>&lt;div style="text-align: justify;"&gt;Estimados lectores de mi blog,&lt;br /&gt;&lt;br /&gt;Hace tiempo que no levantaba una entrada en mi blog ya que me he visto muy ocupado con varios temas (trabajo, universidad, familia, etc), pero me comprometo a seguir manteniendo el blog con mas entradas y aportes.&lt;br /&gt;&lt;br /&gt;Hoy quiero compartir mi alegría con ustedes y contarles que he obtenido mi título de Ingeniero Civil en Computación e Informática, después de 6 años de sacrificio tanto propio como de mi familia y amigos que estuvieron acompañandome por este camino que elegí.&lt;br /&gt;&lt;br /&gt;Quiero decirle a quienes están estudiando que sigan adelante, que se puede lograr, se puede llegar a la meta !!!, sigan estudiando, aprendiendo, aplicando y compartiendo conocimiento, que gracias a estos principios es que cada día crecemos mas como personas y profesionales.&lt;br /&gt;&lt;br /&gt;Un saludo a todos.&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1421033339681316542-3464340594674997898?l=metalklesk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://metalklesk.blogspot.com/feeds/3464340594674997898/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://metalklesk.blogspot.com/2009/06/me-titule-de-ingeniero-civil-en.html#comment-form' title='13 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1421033339681316542/posts/default/3464340594674997898'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1421033339681316542/posts/default/3464340594674997898'/><link rel='alternate' type='text/html' href='http://metalklesk.blogspot.com/2009/06/me-titule-de-ingeniero-civil-en.html' title='Me titulé de Ingeniero Civil en Computación e Informática !!!'/><author><name>Daniel Dario Morales Salas</name><uri>http://www.blogger.com/profile/07642586501018157497</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='28' src='http://3.bp.blogspot.com/_TGgpRudXV3w/SfP_sc5YZ3I/AAAAAAAABSs/APK4YFwjVn4/S220/yoft3.png'/></author><thr:total>13</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1421033339681316542.post-1210771214732855529</id><published>2009-05-24T00:11:00.012-04:00</published><updated>2009-05-24T00:56:59.213-04:00</updated><title type='text'>Exposición Web Service con NetBeans 6.5.1 y Glassfish 2.1</title><content type='html'>&lt;div style="text-align: justify;"&gt;&lt;a href="http://metalklesk.blogspot.com/2007/10/web-service-y-web-service-client-en.html"&gt;Tiempo atrás hice un tutorial bastante detallado sobre como crear y consumir web services&lt;/a&gt; usando &lt;a href="http://www.netbeans.org/"&gt;NetBeans&lt;/a&gt; y &lt;a href="https://glassfish.dev.java.net/"&gt;Glassfish&lt;/a&gt;. Hoy traigo lo mismo pero con un ejemplo mucho mas sencillo y fácil de entender y digerir.&lt;br /&gt;&lt;br /&gt;Esta entrada trata sobre la exposición de un &lt;a href="http://es.wikipedia.org/wiki/Servicio_Web"&gt;Web Service&lt;/a&gt;, en otra entrada explicaré cómo consumirlo.&lt;br /&gt;&lt;br /&gt;El ejemplo expone dos métodos a través de Web Service para validar la existencia de un usuario (&lt;span style="font-style: italic;"&gt;getUsuario&lt;/span&gt;) y para modificar sus datos (&lt;span style="font-style: italic;"&gt;setUsuario&lt;/span&gt;).&lt;br /&gt;&lt;br /&gt;Los datos del usuario están en un archivo &lt;a href="http://es.wikipedia.org/wiki/XML"&gt;XML&lt;/a&gt; para mantener el ejemplo sencillo y simple. La estructura del XML es la siguiente:&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;blockquote&gt;&amp;lt;?xml version="1.0" encoding="UTF-8"?&amp;gt;&lt;br /&gt;&amp;lt;raiz&amp;gt;&lt;br /&gt;&amp;lt;usuario id="1" user="metalklesk" passwd="metalklesk" activo="true" /&amp;gt;&lt;br /&gt;&amp;lt;usuario id="2" user="klesk" passwd="klesk" activo="false" /&amp;gt;&lt;br /&gt;&amp;lt;/raiz&amp;gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;como se puede ver a continuación:&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_TGgpRudXV3w/ShjKxzlMRAI/AAAAAAAABWM/ZnH6M83jz6Y/s1600-h/imagen1.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="http://2.bp.blogspot.com/_TGgpRudXV3w/ShjKxzlMRAI/AAAAAAAABWM/ZnH6M83jz6Y/s320/imagen1.png" alt="" id="BLOGGER_PHOTO_ID_5339240315256325122" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;El archivo se llama &lt;span style="font-weight: bold;"&gt;usuarios.xml&lt;/span&gt; y debe crearse (o copiarse) en el directorio &lt;span style="font-style: italic;"&gt;home&lt;/span&gt; del usuario (en el caso de Windows creo que es el directorio del usuario dentro de Mis Documentos, corríjanme si me equivoco y en el caso de Linux es /home/usuario).&lt;br /&gt;&lt;br /&gt;Una vez listo ya podemos crear el Web Service. Para esta tarea utilizaremos un contenedor &lt;a href="http://en.wikipedia.org/wiki/Enterprise_JavaBean"&gt;EJB&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Abrimos &lt;span style="font-style: italic;"&gt;NetBeans 6.5.1 -&gt; New project -&gt; Java EE -&gt; EJB module&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_TGgpRudXV3w/ShjL6sxNwpI/AAAAAAAABWU/mjsxITgGFgs/s1600-h/imagen2.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="http://2.bp.blogspot.com/_TGgpRudXV3w/ShjL6sxNwpI/AAAAAAAABWU/mjsxITgGFgs/s320/imagen2.png" alt="" id="BLOGGER_PHOTO_ID_5339241567558156946" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;como nombre ingresamos &lt;span style="font-weight: bold;"&gt;EJBModuleWebService&lt;/span&gt; y seleccionamos &lt;span style="font-style: italic;"&gt;Glassfish &lt;/span&gt;como servidor de aplicaciones.&lt;br /&gt;&lt;br /&gt;Una vez listo creamos una clase java a la cual llamaremos &lt;span style="font-weight: bold;"&gt;Usuario&lt;/span&gt; y la agregamos al package &lt;span style="font-style: italic;"&gt;org.modelo&lt;/span&gt; (como no existe, se creará al ingresarlo en la misma pantalla de creación de la clase). La clase Usuario tendrá el siguiente &lt;a href="http://pastebin.com/f390da604"&gt;código&lt;/a&gt;:&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;blockquote&gt;/*&lt;br /&gt;* To change this template, choose Tools | Templates&lt;br /&gt;* and open the template in the editor.&lt;br /&gt;*/&lt;br /&gt;&lt;br /&gt;package org.modelo;&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt;*&lt;br /&gt;* @author metalklesk&lt;br /&gt;*/&lt;br /&gt;public class Usuario {&lt;br /&gt;&lt;br /&gt;private int id;&lt;br /&gt;private String user;&lt;br /&gt;private String passwd;&lt;br /&gt;private boolean activo;&lt;br /&gt;&lt;br /&gt;public boolean isActivo() {&lt;br /&gt;    return activo;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public void setActivo(boolean activo) {&lt;br /&gt;    this.activo = activo;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public int getId() {&lt;br /&gt;    return id;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public void setId(int id) {&lt;br /&gt;    this.id = id;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public String getPasswd() {&lt;br /&gt;    return passwd;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public void setPasswd(String passwd) {&lt;br /&gt;    this.passwd = passwd;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public String getUser() {&lt;br /&gt;    return user;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public void setUser(String user) {&lt;br /&gt;    this.user = user;&lt;br /&gt;}&lt;br /&gt;}&lt;/blockquote&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Ahora crearemos la clase &lt;span style="font-weight: bold;"&gt;AccesoDatos&lt;/span&gt; en el mismo package. Esta clase tendrá el siguiente &lt;a href="http://pastebin.com/f360ec600"&gt;código&lt;/a&gt;:&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;blockquote&gt;/*&lt;br /&gt;* To change this template, choose Tools | Templates&lt;br /&gt;* and open the template in the editor.&lt;br /&gt;*/&lt;br /&gt;&lt;br /&gt;package org.modelo;&lt;br /&gt;&lt;br /&gt;import java.io.File;&lt;br /&gt;import java.io.FileNotFoundException;&lt;br /&gt;import java.io.FileOutputStream;&lt;br /&gt;import java.io.IOException;&lt;br /&gt;import java.util.logging.Level;&lt;br /&gt;import java.util.logging.Logger;&lt;br /&gt;import javax.xml.parsers.DocumentBuilderFactory;&lt;br /&gt;import javax.xml.parsers.ParserConfigurationException;&lt;br /&gt;import javax.xml.transform.Transformer;&lt;br /&gt;import javax.xml.transform.TransformerException;&lt;br /&gt;import javax.xml.transform.TransformerFactory;&lt;br /&gt;import javax.xml.transform.dom.DOMSource;&lt;br /&gt;import javax.xml.transform.stream.StreamResult;&lt;br /&gt;import org.w3c.dom.Document;&lt;br /&gt;import org.w3c.dom.Element;&lt;br /&gt;import org.w3c.dom.NodeList;&lt;br /&gt;import org.xml.sax.SAXException;&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt;*&lt;br /&gt;* @author metalklesk&lt;br /&gt;*/&lt;br /&gt;public class AccesoDatos {&lt;br /&gt;&lt;br /&gt;private Document documento = null;&lt;br /&gt;private String archivo = System.getProperty("user.home") + "/usuarios.xml";&lt;br /&gt;private static AccesoDatos datos = new AccesoDatos();&lt;br /&gt;&lt;br /&gt;private AccesoDatos() {&lt;br /&gt;    try {&lt;br /&gt;        documento = (Document) (((DocumentBuilderFactory.newInstance()).newDocumentBuilder()).parse(new File(archivo)));&lt;br /&gt;    } catch (SAXException ex) {&lt;br /&gt;        Logger.getLogger(AccesoDatos.class.getName()).log(Level.SEVERE, null, ex);&lt;br /&gt;    } catch (IOException ex) {&lt;br /&gt;        Logger.getLogger(AccesoDatos.class.getName()).log(Level.SEVERE, null, ex);&lt;br /&gt;    } catch (ParserConfigurationException ex) {&lt;br /&gt;        Logger.getLogger(AccesoDatos.class.getName()).log(Level.SEVERE, null, ex);&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public static AccesoDatos getInstance() {&lt;br /&gt;    return datos;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public Usuario getUsuario(String user, String passwd) {&lt;br /&gt;    Element raiz = (Element) documento.getDocumentElement();&lt;br /&gt;    NodeList hijos = raiz.getElementsByTagName("usuario");&lt;br /&gt;    Usuario usuario = null;&lt;br /&gt;&lt;br /&gt;    for(int i=0; i&amp;lt;hijos.getLength(); i++) {&lt;br /&gt;        Element elemento = (Element) hijos.item(i);&lt;br /&gt;        String x = elemento.getAttribute("user");&lt;br /&gt;        String y = elemento.getAttribute("passwd");&lt;br /&gt;&lt;br /&gt;        if(x.equalsIgnoreCase(user) &amp;amp;&amp;amp; y.equalsIgnoreCase(passwd)) {&lt;br /&gt;            usuario = new Usuario();&lt;br /&gt;            usuario.setId(Integer.parseInt(elemento.getAttribute("id")));&lt;br /&gt;            usuario.setUser(x);&lt;br /&gt;            usuario.setPasswd(y);&lt;br /&gt;            usuario.setActivo(Boolean.parseBoolean(elemento.getAttribute("activo")));&lt;br /&gt;&lt;br /&gt;            break;&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    return usuario;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public boolean setUsuario(Usuario usuario) {&lt;br /&gt;    Element raiz = (Element) documento.getDocumentElement();&lt;br /&gt;    NodeList hijos = raiz.getElementsByTagName("usuario");&lt;br /&gt;    boolean respuesta = false;&lt;br /&gt;&lt;br /&gt;    for(int i=0; i&amp;lt;hijos.getLength(); i++) {&lt;br /&gt;        Element elemento = (Element) hijos.item(i);&lt;br /&gt;        int id = Integer.parseInt(elemento.getAttribute("id"));&lt;br /&gt;&lt;br /&gt;        if(id == usuario.getId()) {&lt;br /&gt;            elemento.setAttribute("id", String.valueOf(id));&lt;br /&gt;            elemento.setAttribute("user", usuario.getUser());&lt;br /&gt;            elemento.setAttribute("passwd", usuario.getPasswd());&lt;br /&gt;            elemento.setAttribute("activo", String.valueOf(usuario.isActivo()));&lt;br /&gt;&lt;br /&gt;            respuesta = actualizarUsuarios();&lt;br /&gt;            break;&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    return respuesta;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;private boolean actualizarUsuarios() {&lt;br /&gt;    documento.getDocumentElement().normalize();&lt;br /&gt;&lt;br /&gt;    try {&lt;br /&gt;        DOMSource source = new DOMSource(documento);&lt;br /&gt;        StreamResult result = new StreamResult(new FileOutputStream(archivo));&lt;br /&gt;&lt;br /&gt;        TransformerFactory transFactory = TransformerFactory.newInstance();&lt;br /&gt;        Transformer transformer = transFactory.newTransformer();&lt;br /&gt;        transformer.transform(source, result);&lt;br /&gt;&lt;br /&gt;        return true;&lt;br /&gt;    } catch (TransformerException ex) {&lt;br /&gt;        Logger.getLogger(AccesoDatos.class.getName()).log(Level.SEVERE, null, ex);&lt;br /&gt;        return false;&lt;br /&gt;    } catch (FileNotFoundException ex) {&lt;br /&gt;        Logger.getLogger(AccesoDatos.class.getName()).log(Level.SEVERE, null, ex);&lt;br /&gt;        return false;&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;}&lt;/blockquote&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Una vez listo ya podemos crear el Web Service, para eso hacemos c&lt;span style="font-style: italic;"&gt;lick derecho en el proyecto -&gt; New -&gt; Web service&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_TGgpRudXV3w/ShjOz419WrI/AAAAAAAABWc/Nox-D4zpuRU/s1600-h/crearWebService.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="http://3.bp.blogspot.com/_TGgpRudXV3w/ShjOz419WrI/AAAAAAAABWc/Nox-D4zpuRU/s320/crearWebService.png" alt="" id="BLOGGER_PHOTO_ID_5339244749075077810" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Ingresamos como nombre &lt;span style="font-weight: bold;"&gt;UsuarioWebService&lt;/span&gt; y lo agregamos al package &lt;span style="font-style: italic;"&gt;org.modelo&lt;/span&gt;.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_TGgpRudXV3w/ShjPGHqcfbI/AAAAAAAABWk/98n_sw9BESA/s1600-h/crearWebService2.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="http://3.bp.blogspot.com/_TGgpRudXV3w/ShjPGHqcfbI/AAAAAAAABWk/98n_sw9BESA/s320/crearWebService2.png" alt="" id="BLOGGER_PHOTO_ID_5339245062290963890" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Una vez listo, ingresamos el siguiente &lt;a href="http://pastebin.com/f4ab5652a"&gt;código&lt;/a&gt; con los métodos a exponer en el Web Service:&lt;br /&gt;&lt;/div&gt;&lt;blockquote&gt;&lt;br /&gt;/*&lt;br /&gt;* To change this template, choose Tools | Templates&lt;br /&gt;* and open the template in the editor.&lt;br /&gt;*/&lt;br /&gt;&lt;br /&gt;package org.modelo;&lt;br /&gt;&lt;br /&gt;import javax.jws.WebMethod;&lt;br /&gt;import javax.jws.WebParam;&lt;br /&gt;import javax.jws.WebService;&lt;br /&gt;import javax.ejb.Stateless;&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt;*&lt;br /&gt;* @author metalklesk&lt;br /&gt;*/&lt;br /&gt;@WebService()&lt;br /&gt;@Stateless()&lt;br /&gt;public class UsuarioWebService {&lt;br /&gt;&lt;br /&gt;  /**&lt;br /&gt;   * Web service getUsuario&lt;br /&gt;   * @param user&lt;br /&gt;   * @param passwd&lt;br /&gt;   * @return&lt;br /&gt;   */&lt;br /&gt;  @WebMethod(operationName = "getUsuario")&lt;br /&gt;  public Usuario getUsuario(@WebParam(name = "user")&lt;br /&gt;  String user, @WebParam(name = "passwd")&lt;br /&gt;  String passwd) {&lt;br /&gt;      AccesoDatos datos = AccesoDatos.getInstance();&lt;br /&gt;&lt;br /&gt;      return datos.getUsuario(user, passwd);&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  /**&lt;br /&gt;   * Web service getUsuario&lt;br /&gt;   * @param usuario&lt;br /&gt;   * @return&lt;br /&gt;   */&lt;br /&gt;  @WebMethod(operationName = "setUsuario")&lt;br /&gt;  public Boolean setUsuario(@WebParam(name = "usuario")&lt;br /&gt;  Usuario usuario) {&lt;br /&gt;      AccesoDatos datos = AccesoDatos.getInstance();&lt;br /&gt;&lt;br /&gt;      return datos.setUsuario(usuario);&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;}&lt;/blockquote&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Ya con eso estamos listos con la exposición del Web Service, ahora para probarlo podemos ejecutar la aplicación haciendo &lt;span style="font-style: italic;"&gt;click derecho -&gt; Run&lt;/span&gt; y luego expandimos la carpeta &lt;span style="font-style: italic;"&gt;Web Services&lt;/span&gt;, damos click derecho el web service &lt;span style="font-style: italic;"&gt;UsuarioWebService&lt;/span&gt; y pinchamos la opción &lt;span style="font-weight: bold;"&gt;Test Web service&lt;/span&gt;, lo cual abrirá una ventana del navegador web predeterminado en NetBeans.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Espero les sea de utilidad y como siempre me pueden dejar un comentario con su dirección de correo y les reboto el proyecto NetBeans comprimido.&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/1421033339681316542-1210771214732855529?l=metalklesk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://metalklesk.blogspot.com/feeds/1210771214732855529/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://metalklesk.blogspot.com/2009/05/exposicion-web-service-con-netbeans-651.html#comment-form' title='18 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1421033339681316542/posts/default/1210771214732855529'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1421033339681316542/posts/default/1210771214732855529'/><link rel='alternate' type='text/html' href='http://metalklesk.blogspot.com/2009/05/exposicion-web-service-con-netbeans-651.html' title='Exposición Web Service con NetBeans 6.5.1 y Glassfish 2.1'/><author><name>Daniel Dario Morales Salas</name><uri>http://www.blogger.com/profile/07642586501018157497</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='28' src='http://3.bp.blogspot.com/_TGgpRudXV3w/SfP_sc5YZ3I/AAAAAAAABSs/APK4YFwjVn4/S220/yoft3.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_TGgpRudXV3w/ShjKxzlMRAI/AAAAAAAABWM/ZnH6M83jz6Y/s72-c/imagen1.png' height='72' width='72'/><thr:total>18</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1421033339681316542.post-2213572656523989628</id><published>2009-05-22T23:49:00.015-04:00</published><updated>2009-05-23T00:53:30.938-04:00</updated><title type='text'>Gráficos JMaki-Dojo, Servlets y Java Beans</title><content type='html'>&lt;div style="text-align: justify;"&gt;Hace unos días estuve "&lt;span style="font-style: italic;"&gt;jugando&lt;/span&gt;" con Java y JMaki para crear gráficos (charts). Buscando en la red encontré el proyecto &lt;a href="https://jmaki-charting.dev.java.net/"&gt;jmaki-charting,&lt;/a&gt; el cual permite generar gráficos Dojo de tipo Area, Linea, Barra y Torta.&lt;br /&gt;&lt;br /&gt;Desgraciadamente, los ejemplos de gráficos Dojo están malos, si entran en la página de &lt;a href="http://jmaki.com/charting/"&gt;ejemplos&lt;/a&gt; y pinchan un enlace de gráficos Dojo verán lo siguiente:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_TGgpRudXV3w/ShdzNx_AGvI/AAAAAAAABVc/Zv3fTRk32j4/s1600-h/instant%C3%A1nea7.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="http://1.bp.blogspot.com/_TGgpRudXV3w/ShdzNx_AGvI/AAAAAAAABVc/Zv3fTRk32j4/s320/instant%C3%A1nea7.png" alt="" id="BLOGGER_PHOTO_ID_5338862563864091378" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Asi es que me propuse crear un ejemplo que si funcione y de eso se trata esta entrada.&lt;br /&gt;&lt;br /&gt;La gracia del ejemplo que explicaré a continuación es que se hace uso de clases java para la creación de los gráficos. De ésta manera se pueden crear gráficos a partir de datos obtenidos dinámicamente de una base de datos o cualquier fuente que se quiera. Si bien el ejemplo usa datos "&lt;span style="font-style: italic;"&gt;duros&lt;/span&gt;" fácilmente se podrían modificar las clases y traer los datos de una base de datos.&lt;br /&gt;&lt;br /&gt;También se muestra en el ejemplo la carga de los gráficos sin la necesidad de cargar una página jsp nueva, simplemente se refresca el área correspondiente y lo demás sigue igual lo que impacta positivamente en la velocidad de carga y experiencia del usuario.&lt;br /&gt;&lt;br /&gt;Manos a la obra. Lo primero que necesitamos es &lt;a href="http://www.netbeans.org/downloads/index.html"&gt;NetBeans 6.5.1&lt;/a&gt; con el &lt;a href="http://java.sun.com/javase/downloads/?intcmp=1281"&gt;JDK 1.6 update 13&lt;/a&gt; (con ésta versión realicé el ejemplo). Una vez instalado hay que descargar los módulos de JMaki, para eso ir a &lt;span style="font-style: italic;"&gt;Tools -&gt; Plugins&lt;/span&gt; y seleccionar los dos plugines de JMaki.&lt;br /&gt;&lt;br /&gt;Una vez reiniciado NetBeans hay que descargar el &lt;a href="https://jmaki-charting.dev.java.net/files/documents/6303/109080/jmaki-charting-widgets-0.9.6.zip"&gt;módulo jmaki-charting&lt;/a&gt;, abrir NetBeans e ir a &lt;span style="font-style: italic;"&gt;Tools -&gt; Palette -&gt; Add jmaki library&lt;/span&gt; y seleccionar el módulo previamente descargado. Una vez listo ya se pueden utilizar los gráficos Dojo en NetBeans a través de la paleta.&lt;br /&gt;&lt;br /&gt;La aplicación es web y explicaré la lógica que hay detrás de todo. Lo primero es entender como funciona la aplicación.&lt;br /&gt;&lt;br /&gt;Básicamente se tiene un menú donde puedes elegir el tipo de gráfico. Éste menú es un &lt;span style="font-style: italic;"&gt;combobox Dojo&lt;/span&gt;, el cual se arrastra desde la paleta al &lt;span style="font-style: italic;"&gt;index.jsp&lt;/span&gt;. Cuando se arrastra un combobox dojo se genera con valores por &lt;span style="font-style: italic;"&gt;default&lt;/span&gt;, pero eso no es muy útil, lo mejor es cargar los datos desde un &lt;a href="http://es.wikipedia.org/wiki/JavaBean"&gt;Java Bean&lt;/a&gt;. El java Bean utilizado es el siguiente:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;package org.beans;&lt;br /&gt;&lt;br /&gt;import org.modelo.Parametros;&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt;*&lt;br /&gt;* @author metalklesk&lt;br /&gt;*/&lt;br /&gt;public class BeanListaCharts {&lt;br /&gt;&lt;br /&gt;public String getValues() {&lt;br /&gt;  StringBuffer buffer = new StringBuffer();&lt;br /&gt;&lt;br /&gt;  buffer.append("[");&lt;br /&gt;  buffer.append("{label:'Area', value:'" + Parametros.AREA + "'},");&lt;br /&gt;  buffer.append("{label:'Barra', value:'" + Parametros.BAR + "'},");&lt;br /&gt;  buffer.append("{label:'Linea', value:'" + Parametros.LINE + "'},");&lt;br /&gt;  buffer.append("{label:'Torta', value:'" + Parametros.PIE + "'}");&lt;br /&gt;  buffer.append("]");&lt;br /&gt;&lt;br /&gt;  return buffer.toString();&lt;br /&gt;}&lt;br /&gt;}&lt;/blockquote&gt;&lt;br /&gt;Luego hay que ingresar la siguiente línea en el jsp para hacer uso del Bean:&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;&amp;lt;jsp:useBean id="BeanListaCharts" class="org.beans.BeanListaCharts"/&amp;gt;&lt;/blockquote&gt;&lt;br /&gt;Y luego hay que pasar del siguiente código (que viene por default al arrastrar un combobox Dojo)&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&amp;lt;a:widget name="dojo.combobox"&lt;br /&gt;value="[&lt;br /&gt; {label : 'Alabama', value : 'AL'},&lt;br /&gt; {label : 'California', value : 'CA'},&lt;br /&gt; {label : 'New York', value : 'NY', selected : true},&lt;br /&gt; {label : 'Texas', value : 'TX'}        &lt;br /&gt;]" /&amp;gt;&lt;/blockquote&gt;&lt;br /&gt;a la siguiente forma:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&amp;lt;a:widget name="dojo.combobox" value="${BeanListaCharts.values}" publish="/miCombo" /&amp;gt;&lt;/blockquote&gt;&lt;br /&gt;Si se fijan, el &lt;span style="font-style: italic;"&gt;value&lt;/span&gt; lo rellenamos con el método &lt;span style="font-style: italic;"&gt;getValues&lt;/span&gt; del Java Bean. Eventualmente esos datos podrían provenir de una base de datos.&lt;br /&gt;&lt;br /&gt;El &lt;a href="http://en.wikipedia.org/wiki/Publish/subscribe"&gt;publish&lt;/a&gt; es para publicar un evento asociado al combobox. Lo que sigue es programar el evento a nuestro gusto. Esto se hace en el archivo &lt;span style="font-style: italic;"&gt;glue.js&lt;/span&gt; utilizando un &lt;a href="http://en.wikipedia.org/wiki/Publish/subscribe"&gt;subscribe&lt;/a&gt;, en ese archivo agregamos lo siguiente (al final):&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;jmaki.subscribe("/miCombo/onSelect", function(args) {&lt;br /&gt;/*&lt;br /&gt;*Se debe cargar el grafico desde una pagina (o servlet) externa pero dentro del dominio&lt;br /&gt;*e insertarla mediante el injector.&lt;br /&gt;**/&lt;br /&gt;var url_ = jmaki.webRoot + '/ServletGeneradorCharts?tipoChart=' + args.value;&lt;br /&gt;var injector = new jmaki.Injector();&lt;br /&gt;injector.inject({url:url_, injectionPoint:"chart"});&lt;br /&gt;});&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Aquí utilizamos un &lt;a href="https://ajax.dev.java.net/injector.html"&gt;Injector&lt;/a&gt; para agregar código html dinámico en una parte específica de la página, sin tener que recargar todo de nuevo en una página nueva. El &lt;span style="font-style: italic;"&gt;Injector&lt;/span&gt; recibe como parámetros la &lt;span style="font-style: italic;"&gt;dirección&lt;/span&gt; de la página a cargar y el &lt;span style="font-style: italic;"&gt;lugar&lt;/span&gt; de la página actual en la cual será insertada.&lt;br /&gt;&lt;br /&gt;En este caso llamamos a un &lt;span style="font-style: italic;"&gt;servlet&lt;/span&gt; al cual le pasamos como parámetro el valor recogido de la selección en el combobox.&lt;br /&gt;&lt;br /&gt;El método &lt;span style="font-weight: bold;"&gt;processRequest&lt;/span&gt; del servlet luce de la siguiente manera:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;protected void processRequest(HttpServletRequest request, HttpServletResponse response)&lt;br /&gt;throws ServletException, IOException {&lt;br /&gt;  response.setContentType("text/html;charset=UTF-8");&lt;br /&gt;  PrintWriter out = response.getWriter();&lt;br /&gt;&lt;br /&gt;  String contexto = request.getContextPath();&lt;br /&gt;&lt;br /&gt;  String seleccion = request.getParameter("tipoChart");&lt;br /&gt;  String chart = "No existe ese tipo de gráfico.";&lt;br /&gt;&lt;br /&gt;  if(seleccion.equalsIgnoreCase(Parametros.PIE)) {&lt;br /&gt;      PieChartDojoJMaki pie = new PieChartDojoJMaki();&lt;br /&gt;      //si no le pasamos los parámetros requeridos, se genera un pie de ejemplo&lt;br /&gt;      //con valores predeterminados.&lt;br /&gt;      chart = pie.getValor();&lt;br /&gt;&lt;br /&gt;      out.println("&amp;lt;script type="text/javascript" src="" + contexto + "/resources/jmaki/charting/resources/base.js"&amp;gt;&amp;lt;/script&amp;gt;");&lt;br /&gt;      out.println("&amp;lt;script type="text/javascript" src="" + contexto + "/resources/jmaki/charting/resources/plotkit/excanvas.js"&amp;gt;&amp;lt;/script&amp;gt;");&lt;br /&gt;      out.println("&amp;lt;script type="text/javascript" src="" + contexto + "/resources/jmaki/charting/resources/plotkit/PlotKit_Packed.js"&amp;gt;&amp;lt;/script&amp;gt;");&lt;br /&gt;      out.println("&amp;lt;link rel="stylesheet" type="text/css" href="" + contexto + "/resources/jmaki/charting/resources/jmaki-charting.css" /&amp;gt;");&lt;br /&gt;      out.println("&amp;lt;script type="text/javascript" src="" + contexto + "/resources/jmaki/charting/pie/component.js"&amp;gt;&amp;lt;/script&amp;gt;");&lt;br /&gt;      out.println("&amp;lt;script type="text/javascript"&amp;gt;jmaki.addWidget({widgetDir:'" + contexto + "/resources/jmaki/charting/pie',name:'jmaki.charting.pie',value:" + chart + ",uuid:'jmaki_charting_pie'});&amp;lt;/script&amp;gt;");&lt;br /&gt;      out.println("&amp;lt;div id="jmaki_charting_pie" class="jmCPie"&amp;gt;");&lt;br /&gt;      out.println("&amp;lt;canvas id="jmaki_charting_pie_chart" class="jmCPie"&amp;gt;&amp;lt;/canvas&amp;gt;");&lt;br /&gt;      out.println("&amp;lt;/div&amp;gt;");&lt;br /&gt;      out.close();&lt;br /&gt;  } else if(seleccion.equalsIgnoreCase(Parametros.AREA)) {&lt;br /&gt;      AreaChartDojoJMaki area = new AreaChartDojoJMaki();&lt;br /&gt;      //si no le pasamos los parámetros requeridos, se genera un pie de ejemplo&lt;br /&gt;      //con valores predeterminados.&lt;br /&gt;      chart = area.getValor();&lt;br /&gt;&lt;br /&gt;      out.println("&amp;lt;script type="text/javascript" src="" + contexto + "/resources/jmaki/charting/resources/base.js"&amp;gt;&amp;lt;/script&amp;gt;");&lt;br /&gt;      out.println("&amp;lt;script type="text/javascript" src="" + contexto + "/resources/jmaki/charting/resources/plotkit/excanvas.js"&amp;gt;&amp;lt;/script&amp;gt;");&lt;br /&gt;      out.println("&amp;lt;script type="text/javascript" src="" + contexto + "/resources/jmaki/charting/resources/plotkit/PlotKit_Packed.js"&amp;gt;&amp;lt;/script&amp;gt;");&lt;br /&gt;      out.println("&amp;lt;link rel="stylesheet" type="text/css" href="" + contexto + "/resources/jmaki/charting/resources/jmaki-charting.css" /&amp;gt;");&lt;br /&gt;      out.println("&amp;lt;script type="text/javascript" src="" + contexto + "/resources/jmaki/charting/area/component.js"&amp;gt;&amp;lt;/script&amp;gt;");&lt;br /&gt;      out.println("&amp;lt;script type="text/javascript"&amp;gt;jmaki.addWidget({widgetDir:'" + contexto + "/resources/jmaki/charting/area',name:'jmaki.charting.area',value:" + chart + ",uuid:'jmaki_charting_area2'});&amp;lt;/script&amp;gt;");&lt;br /&gt;      out.println("&amp;lt;div id="jmaki_charting_area2" class="jmCPie"&amp;gt;");&lt;br /&gt;      out.println("&amp;lt;canvas id="jmaki_charting_area2_chart" class="jmCPie"&amp;gt;&amp;lt;/canvas&amp;gt;");&lt;br /&gt;      out.println("&amp;lt;/div&amp;gt;");&lt;br /&gt;      out.close();&lt;br /&gt;  } else if(seleccion.equalsIgnoreCase(Parametros.BAR)) {&lt;br /&gt;      BarChartDojoJMaki bar = new BarChartDojoJMaki();&lt;br /&gt;      //si no le pasamos los parámetros requeridos, se genera un pie de ejemplo&lt;br /&gt;      //con valores predeterminados.&lt;br /&gt;      chart = bar.getValor();&lt;br /&gt;&lt;br /&gt;      out.println("&amp;lt;script type="text/javascript" src="" + contexto + "/resources/jmaki/charting/resources/base.js"&amp;gt;&amp;lt;/script&amp;gt;");&lt;br /&gt;      out.println("&amp;lt;script type="text/javascript" src="" + contexto + "/resources/jmaki/charting/resources/plotkit/excanvas.js"&amp;gt;&amp;lt;/script&amp;gt;");&lt;br /&gt;      out.println("&amp;lt;script type="text/javascript" src="" + contexto + "/resources/jmaki/charting/resources/plotkit/PlotKit_Packed.js"&amp;gt;&amp;lt;/script&amp;gt;");&lt;br /&gt;      out.println("&amp;lt;link rel="stylesheet" type="text/css" href="" + contexto + "/resources/jmaki/charting/resources/jmaki-charting.css" /&amp;gt;");&lt;br /&gt;      out.println("&amp;lt;script type="text/javascript" src="" + contexto + "/resources/jmaki/charting/bar/component.js"&amp;gt;&amp;lt;/script&amp;gt;");&lt;br /&gt;      out.println("&amp;lt;script type="text/javascript"&amp;gt;jmaki.addWidget({widgetDir:'" + contexto + "/resources/jmaki/charting/bar',name:'jmaki.charting.bar',value:" + chart + ",uuid:'jmaki_charting_bar'});&amp;lt;/script&amp;gt;");&lt;br /&gt;      out.println("&amp;lt;div id="jmaki_charting_bar" class="jmCPie"&amp;gt;");&lt;br /&gt;      out.println("&amp;lt;canvas id="jmaki_charting_bar_chart" class="jmCPie"&amp;gt;&amp;lt;/canvas&amp;gt;");&lt;br /&gt;      out.println("&amp;lt;/div&amp;gt;");&lt;br /&gt;      out.close();&lt;br /&gt;  } else if(seleccion.equalsIgnoreCase(Parametros.LINE)) {&lt;br /&gt;      LineChartDojoJMaki line = new LineChartDojoJMaki();&lt;br /&gt;      //si no le pasamos los parámetros requeridos, se genera un pie de ejemplo&lt;br /&gt;      //con valores predeterminados.&lt;br /&gt;      chart = line.getValor();&lt;br /&gt;&lt;br /&gt;      out.println("&amp;lt;script type="text/javascript" src="" + contexto + "/resources/jmaki/charting/resources/base.js"&amp;gt;&amp;lt;/script&amp;gt;");&lt;br /&gt;      out.println("&amp;lt;script type="text/javascript" src="" + contexto + "/resources/jmaki/charting/resources/plotkit/excanvas.js"&amp;gt;&amp;lt;/script&amp;gt;");&lt;br /&gt;      out.println("&amp;lt;script type="text/javascript" src="" + contexto + "/resources/jmaki/charting/resources/plotkit/PlotKit_Packed.js"&amp;gt;&amp;lt;/script&amp;gt;");&lt;br /&gt;      out.println("&amp;lt;link rel="stylesheet" type="text/css" href="" + contexto + "/resources/jmaki/charting/resources/jmaki-charting.css" /&amp;gt;");&lt;br /&gt;      out.println("&amp;lt;script type="text/javascript" src="" + contexto + "/resources/jmaki/charting/line/component.js"&amp;gt;&amp;lt;/script&amp;gt;");&lt;br /&gt;      out.println("&amp;lt;script type="text/javascript"&amp;gt;jmaki.addWidget({widgetDir:'" + contexto + "/resources/jmaki/charting/line',name:'jmaki.charting.line',value:" + chart + ",uuid:'jmaki_charting_line'});&amp;lt;/script&amp;gt;");&lt;br /&gt;      out.println("&amp;lt;div id="jmaki_charting_line" class="jmCPie"&amp;gt;");&lt;br /&gt;      out.println("&amp;lt;canvas id="jmaki_charting_line_chart" class="jmCPie"&amp;gt;&amp;lt;/canvas&amp;gt;");&lt;br /&gt;      out.println("&amp;lt;/div&amp;gt;");&lt;br /&gt;      out.close();&lt;br /&gt;  } else {&lt;br /&gt;      //si el tipo de gráfico no corresponde, notifico al usuario.&lt;br /&gt;      out.println("&amp;lt;font color="#f00"&amp;gt;" + chart + "&amp;lt;/font&amp;gt;");&lt;br /&gt;      out.close();&lt;br /&gt;  }&lt;br /&gt;}&lt;/blockquote&gt;&lt;br /&gt;El servlet recibe el parámetro seleccionado por el usuario a través del &lt;span style="font-weight: bold;"&gt;request.getParameter&lt;/span&gt; y dependiendo del valor construye un gráfico. Para obtener los valores del widget se hace uso de las clases&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;ul style="text-align: justify;"&gt;&lt;li&gt;AreaChartDojoJMaki&lt;/li&gt;&lt;li&gt;BarChartDojoJMaki&lt;/li&gt;&lt;li&gt;LineChartDojoJMaki&lt;/li&gt;&lt;li&gt;PieChartDojoJMaki&lt;/li&gt;&lt;/ul&gt;&lt;div style="text-align: justify;"&gt;Cada una de éstas clases se especializa en construir un gráfico en particular, utilizando la notación definida por JMaki (Dojo en este caso). En el ejemplo se utilizan datos duros, pero al igual que el caso del combobox, fácilmente se pueden adaptar para hacer uso de una base de datos.&lt;br /&gt;&lt;br /&gt;A continuación se puede ver el código de la clase que define un gráfico de area:&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;package org.modelo;&lt;br /&gt;&lt;br /&gt;import java.util.ArrayList;&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt;*&lt;br /&gt;* @author metalklesk&lt;br /&gt;*/&lt;br /&gt;public class AreaChartDojoJMaki {&lt;br /&gt;&lt;br /&gt;private ArrayList&amp;lt;String&amp;gt; xEtiquetas;&lt;br /&gt;private ArrayList&amp;lt;String&amp;gt; yEtiquetas;&lt;br /&gt;private ArrayList&amp;lt;String&amp;gt; datos;&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt;* Constructor sin parámetros. Inicia valores predeterminados para construir un&lt;br /&gt;* gráfico de ejemplo.&lt;br /&gt;*/&lt;br /&gt;public AreaChartDojoJMaki() {&lt;br /&gt;  xEtiquetas = new ArrayList&amp;lt;String&amp;gt;();&lt;br /&gt;  xEtiquetas.add("{label : 'Enero'}, ");&lt;br /&gt;  xEtiquetas.add("{label : 'Febrero'}, ");&lt;br /&gt;  xEtiquetas.add("{label : 'Marzo'}, ");&lt;br /&gt;  xEtiquetas.add("{label : 'Abril'}, ");&lt;br /&gt;  xEtiquetas.add("{label : 'Mayo'}, ");&lt;br /&gt;  xEtiquetas.add("{label : 'Junio'}, ");&lt;br /&gt;  xEtiquetas.add("{label : 'Julio'}, ");&lt;br /&gt;  xEtiquetas.add("{label : 'Agosto'}, ");&lt;br /&gt;  xEtiquetas.add("{label : 'Septiembre'}, ");&lt;br /&gt;  xEtiquetas.add("{label : 'Octubre'}, ");&lt;br /&gt;  xEtiquetas.add("{label : 'Noviembre'}, ");&lt;br /&gt;  xEtiquetas.add("{label : 'Diciembre'}");&lt;br /&gt;&lt;br /&gt;  yEtiquetas = new ArrayList&amp;lt;String&amp;gt;();&lt;br /&gt;  yEtiquetas.add("{ label : '0', value : 0}");&lt;br /&gt;  yEtiquetas.add("{ label : '10s', value : 10}");&lt;br /&gt;  yEtiquetas.add("{ label : '20s', value : 20}");&lt;br /&gt;  yEtiquetas.add("{ label : '30s', value : 30}");&lt;br /&gt;  yEtiquetas.add("{ label : '40s', value : 40}");&lt;br /&gt;  yEtiquetas.add("{ label : '50s', value : 50}");&lt;br /&gt;&lt;br /&gt;  datos = new ArrayList&amp;lt;String&amp;gt;();&lt;br /&gt;  datos.add("{id : 'marcador', label : 'Dataset 1', values : [25, 45, 25, 45, 50, 25, 35, 25, 25, 20, 35, 45] }");&lt;br /&gt;  datos.add("{label : 'Dataset 2', values : [20, 40, 30, 35, 45, 20, 25, 15, 20, 25, 30, 40] }");&lt;br /&gt;  datos.add("{label : 'Dataset 3', values : [15, 35, 15, 40, 30, 15, 20, 10, 15, 20, 30, 35] }");&lt;br /&gt;  datos.add("{label : 'Dataset 4',  values : [10, 25, 10,  5, 20,  5, 15,  5, 10, 15, 25, 30] }");&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt;* Recibe los datos que construyen el gráfico. Se pueden ingresar varios conjuntos de datos (datasets) y la forma&lt;br /&gt;* en que se ingresa cada uno es de la siguiente manera:&lt;br /&gt;* "{label : '$titulo_dataset', values : [$valor1, $valor2, ..., $valorN]}", sin las comillas.&lt;br /&gt;* @param datos&lt;br /&gt;*/&lt;br /&gt;public void setDatos(ArrayList&amp;lt;String&amp;gt; datos) {&lt;br /&gt;  this.datos = datos;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt;* Recibe las etiquetas para la coordenada X. El formato de cada etiqueta debe ser de la siguiente forma:&lt;br /&gt;* "{label: '$valor'},", sin las comillas.&lt;br /&gt;* @param xEtiquetas&lt;br /&gt;*/&lt;br /&gt;public void setXEtiquetas(ArrayList&amp;lt;String&amp;gt; xEtiquetas) {&lt;br /&gt;  this.xEtiquetas = xEtiquetas;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt;* Recine las etiquetas para la coordenada Y. El formato de cada etiqueta debe ser de la siguiente forma:&lt;br /&gt;* "{label : '$titulo', value : $valor}"&lt;br /&gt;* @param yEtiquetas&lt;br /&gt;*/&lt;br /&gt;public void setYEtiquetas(ArrayList&amp;lt;String&amp;gt; yEtiquetas) {&lt;br /&gt;  this.yEtiquetas = yEtiquetas;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt;* Retorna el contenido de la etiqueta value del componente jmaki.charting.area.&lt;br /&gt;* @return&lt;br /&gt;*/&lt;br /&gt;public String getValor() {&lt;br /&gt;  StringBuffer buffer = new StringBuffer();&lt;br /&gt;&lt;br /&gt;  buffer.append("{");&lt;br /&gt;  //valores de la coordenada x&lt;br /&gt;  buffer.append("xAxis : { labels : [ ");&lt;br /&gt;  for(int i=0; i&amp;lt; xEtiquetas.size(); i++) {&lt;br /&gt;      buffer.append(xEtiquetas.get(i));&lt;br /&gt;  }&lt;br /&gt;  buffer.append("]},");&lt;br /&gt;  //valores de la coordenada y&lt;br /&gt;  buffer.append("yAxis : { labels : [");&lt;br /&gt;  for(int i=0; i&amp;lt; yEtiquetas.size(); i++) {&lt;br /&gt;      buffer.append(yEtiquetas.get(i) + ", ");&lt;br /&gt;  }&lt;br /&gt;  buffer.append("]},");&lt;br /&gt;  //aqui agrego marcadores en algunos puntos.&lt;br /&gt;  buffer.append("markers : [{ targetId : 'marcador', label : '{value}', " +&lt;br /&gt;          "index : 5}, { targetId : 'marcador', label : '{value}', index : 6}, " +&lt;br /&gt;          "{ targetId : 'marcador', label : '{value}', index : 8}],");&lt;br /&gt;  //datos que construyen el grafico&lt;br /&gt;  buffer.append("data : [ ");&lt;br /&gt;  for(int i=0; i&amp;lt;datos.size(); i++) {&lt;br /&gt;      buffer.append(datos.get(i) + ", ");&lt;br /&gt;  }&lt;br /&gt;  buffer.append("]");&lt;br /&gt;&lt;br /&gt;  buffer.append("}");&lt;br /&gt;&lt;br /&gt;  return buffer.toString();&lt;br /&gt;}&lt;br /&gt;}&lt;/blockquote&gt;&lt;br /&gt;Como se pude ver, no es necesario utilizar objetos &lt;a href="http://es.wikipedia.org/wiki/JSON"&gt;&lt;span style="font-weight: bold;"&gt;JSON&lt;/span&gt;&lt;/a&gt;, un simple &lt;span style="font-style: italic;"&gt;String&lt;/span&gt; con la estructura adecuada basta para generar un chart o widget JMaki en general.&lt;br /&gt;&lt;br /&gt;A continuación se pueden ver imágenes del ejemplo funcionando.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_TGgpRudXV3w/Shd-mk06UbI/AAAAAAAABVk/njwbTV6ouX8/s1600-h/instant%C3%A1nea1.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="http://2.bp.blogspot.com/_TGgpRudXV3w/Shd-mk06UbI/AAAAAAAABVk/njwbTV6ouX8/s320/instant%C3%A1nea1.png" alt="" id="BLOGGER_PHOTO_ID_5338875084456743346" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_TGgpRudXV3w/Shd-nTI3SlI/AAAAAAAABVs/vb2D4DEPQRM/s1600-h/instant%C3%A1nea2.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="http://2.bp.blogspot.com/_TGgpRudXV3w/Shd-nTI3SlI/AAAAAAAABVs/vb2D4DEPQRM/s320/instant%C3%A1nea2.png" alt="" id="BLOGGER_PHOTO_ID_5338875096888461906" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_TGgpRudXV3w/Shd-npdiyEI/AAAAAAAABV0/t5k6C1vRo74/s1600-h/instant%C3%A1nea3.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="http://2.bp.blogspot.com/_TGgpRudXV3w/Shd-npdiyEI/AAAAAAAABV0/t5k6C1vRo74/s320/instant%C3%A1nea3.png" alt="" id="BLOGGER_PHOTO_ID_5338875102880778306" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_TGgpRudXV3w/Shd-nyBh16I/AAAAAAAABV8/j8MNMR8wuwE/s1600-h/instant%C3%A1nea4.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="http://2.bp.blogspot.com/_TGgpRudXV3w/Shd-nyBh16I/AAAAAAAABV8/j8MNMR8wuwE/s320/instant%C3%A1nea4.png" alt="" id="BLOGGER_PHOTO_ID_5338875105179195298" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_TGgpRudXV3w/Shd-oOfzxzI/AAAAAAAABWE/g3NyZbSujZk/s1600-h/instant%C3%A1nea5.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="http://1.bp.blogspot.com/_TGgpRudXV3w/Shd-oOfzxzI/AAAAAAAABWE/g3NyZbSujZk/s320/instant%C3%A1nea5.png" alt="" id="BLOGGER_PHOTO_ID_5338875112822392626" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Como siempre pueden dejar un comentario con su dirección de correo y les envío el ejemplo completo (proyecto en NetBeans 6.5.1 comprimido) para que lo corran y vean en sus equipos.&lt;br /&gt;&lt;br /&gt;Saludos !!!&lt;br /&gt;&lt;/div&gt;&lt;ul style="text-align: justify;"&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1421033339681316542-2213572656523989628?l=metalklesk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://metalklesk.blogspot.com/feeds/2213572656523989628/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://metalklesk.blogspot.com/2009/05/graficos-jmaki-dojo-servlets-y-java.html#comment-form' title='19 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1421033339681316542/posts/default/2213572656523989628'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1421033339681316542/posts/default/2213572656523989628'/><link rel='alternate' type='text/html' href='http://metalklesk.blogspot.com/2009/05/graficos-jmaki-dojo-servlets-y-java.html' title='Gráficos JMaki-Dojo, Servlets y Java Beans'/><author><name>Daniel Dario Morales Salas</name><uri>http://www.blogger.com/profile/07642586501018157497</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='28' src='http://3.bp.blogspot.com/_TGgpRudXV3w/SfP_sc5YZ3I/AAAAAAAABSs/APK4YFwjVn4/S220/yoft3.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_TGgpRudXV3w/ShdzNx_AGvI/AAAAAAAABVc/Zv3fTRk32j4/s72-c/instant%C3%A1nea7.png' height='72' width='72'/><thr:total>19</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1421033339681316542.post-2882455550626942014</id><published>2009-05-17T17:00:00.005-04:00</published><updated>2009-05-17T20:19:14.553-04:00</updated><title type='text'>Convertir datos de latin1 a utf8 en MySQL 5.1</title><content type='html'>&lt;div style="text-align: justify;"&gt;Hace poco tuve que migrar el sitio web de la empresa en la cual trabajo a otro servidor para lo cual fue necesario pedir, al proveedor del servicio de hosting, el respaldo del sitio junto a la base de datos.&lt;br /&gt;&lt;br /&gt;El problema apareció cuando los datos de la base de datos perdieron la codificación utf8, los acentos (tíldes), las ñ's y otros caracteres fueron reemplazados por caracteres extraños, por ejemplo &lt;span style="font-style: italic;"&gt;ConsultorÃ­a&lt;/span&gt; en vez de &lt;span style="font-style: italic;"&gt;Consultoría&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Cuando cargué la base de datos (utilizando PhpMyAdmin) me dí cuenta que las tablas quedaron con el &lt;span style="font-style: italic;"&gt;charset latin1&lt;/span&gt; en vez de &lt;span style="font-style: italic;"&gt;utf8&lt;/span&gt;. Averiguando por Internet supe que el problema está en la instalación inicial de MySQL, la cual deja todo el sistema con &lt;span style="font-weight: bold;"&gt;latin1_swedish_ci&lt;/span&gt; y por lo tanto al exportar la base de datos, se pierden los caracteres especiales.&lt;br /&gt;&lt;br /&gt;En Internet abundan pequeñas guías que solo solucionan parcialmente el problema pero no del todo. En la mayoría de las páginas encontré que se debía cambiar el charset de la base de datos, tablas y campos (varchar y text), pero eso solo sirve para los datos nuevos, pero que pasa con los que ya están ingresados y que presentan el problema ?&lt;br /&gt;&lt;br /&gt;La receta para solucionar el problema completo es seguir los siguientes pasos (en orden):&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;ol style="text-align: justify;"&gt;&lt;li&gt;Convertir los datos de latin1 a binario y de binario a utf8 para cada campo de tipo varchar y text de cada tabla de la base de datos.&lt;/li&gt;&lt;li&gt;Cambiar el charset del campo de latin1 a utf8.&lt;/li&gt;&lt;li&gt;Cambiar el charset de las tablas de latin1 a utf8.&lt;/li&gt;&lt;li&gt;Cambiar el charset y el collation de la base de datos de latin1 a utf8.&lt;/li&gt;&lt;/ol&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;Para convertir los datos de un charset a otro se utiliza la función convert de MySQL, la cual se usa de la siguiente manera:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;update tabla set campo = convert( convert(campo using binary) using utf8);&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Para cambiar el charset de la tabla se hace de la siguiente manera:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;alter table tabla charset = utf8;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Para cambiar el charset de la base de datos se hace de la siguiente manera:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;alter database basedatos charset = utf8;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Y con eso se soluciona el problema.&lt;br /&gt;&lt;br /&gt;Para evitar que vuelva a suceder el problema en el futuro, recomiendo que sean precavidos al crear una base de datos y siempre seleccionen el charset y collation a utf8 (_unicode_ci).&lt;br /&gt;&lt;br /&gt;Espero les sirva como a mi.&lt;br /&gt;&lt;br /&gt;Saludos !!!&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1421033339681316542-2882455550626942014?l=metalklesk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://metalklesk.blogspot.com/feeds/2882455550626942014/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://metalklesk.blogspot.com/2009/05/convertir-datos-de-latin1-utf8-en-mysql.html#comment-form' title='10 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1421033339681316542/posts/default/2882455550626942014'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1421033339681316542/posts/default/2882455550626942014'/><link rel='alternate' type='text/html' href='http://metalklesk.blogspot.com/2009/05/convertir-datos-de-latin1-utf8-en-mysql.html' title='Convertir datos de latin1 a utf8 en MySQL 5.1'/><author><name>Daniel Dario Morales Salas</name><uri>http://www.blogger.com/profile/07642586501018157497</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='28' src='http://3.bp.blogspot.com/_TGgpRudXV3w/SfP_sc5YZ3I/AAAAAAAABSs/APK4YFwjVn4/S220/yoft3.png'/></author><thr:total>10</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1421033339681316542.post-6067335456240077757</id><published>2009-01-27T13:20:00.003-03:00</published><updated>2009-01-27T13:28:09.689-03:00</updated><title type='text'>KDE 4.2 Final disponible para openSUSE 11.1</title><content type='html'>Hoy 27 de enero sale la versión final oficial de KDE 4.2, un escritorio de lujo, y ya está disponible para los opensuseros !!!!&lt;br /&gt;&lt;br /&gt;Simplemente se deben agregar lo&lt;span style="text-decoration: underline;"&gt;&lt;/span&gt;s &lt;a href="http://en.opensuse.org/KDE/Repositories"&gt;repositorios&lt;/a&gt; e instalar. Si ya lo tienes instalado, entonces un &lt;blockquote&gt;sudo zypper up&lt;/blockquote&gt; hará la actualización correspondiente.&lt;br /&gt;&lt;br /&gt;Aquí pueden ver KDE 4.2 RC 1 actualizandose por zypper:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_TGgpRudXV3w/SX81uE5P41I/AAAAAAAABRg/rECzvyUs_jQ/s1600-h/imagen1.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="http://1.bp.blogspot.com/_TGgpRudXV3w/SX81uE5P41I/AAAAAAAABRg/rECzvyUs_jQ/s320/imagen1.png" alt="" id="BLOGGER_PHOTO_ID_5296010752515105618" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;y aquí pueden ver que uso Amarok 2.0.1 en KDE 4.2.0 (versión final estable):&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_TGgpRudXV3w/SX81v1SkTDI/AAAAAAAABRo/h1WWK0lUMSY/s1600-h/imagen2.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="http://1.bp.blogspot.com/_TGgpRudXV3w/SX81v1SkTDI/AAAAAAAABRo/h1WWK0lUMSY/s320/imagen2.png" alt="" id="BLOGGER_PHOTO_ID_5296010782686071858" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;A disfrutar !!!&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/1421033339681316542-6067335456240077757?l=metalklesk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://metalklesk.blogspot.com/feeds/6067335456240077757/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://metalklesk.blogspot.com/2009/01/kde-42-final-disponible-para-opensuse.html#comment-form' title='4 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1421033339681316542/posts/default/6067335456240077757'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1421033339681316542/posts/default/6067335456240077757'/><link rel='alternate' type='text/html' href='http://metalklesk.blogspot.com/2009/01/kde-42-final-disponible-para-opensuse.html' title='KDE 4.2 Final disponible para openSUSE 11.1'/><author><name>Daniel Dario Morales Salas</name><uri>http://www.blogger.com/profile/07642586501018157497</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='28' src='http://3.bp.blogspot.com/_TGgpRudXV3w/SfP_sc5YZ3I/AAAAAAAABSs/APK4YFwjVn4/S220/yoft3.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_TGgpRudXV3w/SX81uE5P41I/AAAAAAAABRg/rECzvyUs_jQ/s72-c/imagen1.png' height='72' width='72'/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1421033339681316542.post-5177098216021567196</id><published>2009-01-17T00:10:00.005-03:00</published><updated>2009-01-17T00:26:13.947-03:00</updated><title type='text'>Cursos HTML, XHTML  y PHP online</title><content type='html'>&lt;div style="text-align: justify;"&gt;Mi buen amigo Eduardo "Jam" Aguila de &lt;a href="http://www.tecnologiaslibres.net/"&gt;Tecnologías Libres&lt;/a&gt; está haciendo unos cursos online libres para aprender a programar páginas web en &lt;a href="http://es.wikipedia.org/wiki/Html"&gt;HTML&lt;/a&gt; y &lt;a href="http://es.wikipedia.org/wiki/XHTML"&gt;XHTML&lt;/a&gt;. Si te interesa aprender sobre estas tecnologías, visita el siguiente enlace &lt;a href="http://www.tecnologiaslibres.net/curso-para-aprender-html-xhtml/"&gt;Curso para aprender HTML / XHTML&lt;/a&gt;. Además te invito a complementar lo anterior aprendiendo PHP con Loreto "Loretoo" Parra, para ello visita el siguiente &lt;a href="http://loreto.sociallinux.org/"&gt;enlace&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Si tienes dudas y quieres preguntarles directamente a ellos entonces que esperas, hazlo desde &lt;a href="http://metalklesk.blogspot.com/2008/12/canal-softwarelibre-en-irc.html"&gt;irc&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Feliz aprendizaje !!!&lt;br /&gt;&lt;br /&gt;Saludos !!!&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1421033339681316542-5177098216021567196?l=metalklesk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://metalklesk.blogspot.com/feeds/5177098216021567196/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://metalklesk.blogspot.com/2009/01/cursos-html-xhtml-y-php-online.html#comment-form' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1421033339681316542/posts/default/5177098216021567196'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1421033339681316542/posts/default/5177098216021567196'/><link rel='alternate' type='text/html' href='http://metalklesk.blogspot.com/2009/01/cursos-html-xhtml-y-php-online.html' title='Cursos HTML, XHTML  y PHP online'/><author><name>Daniel Dario Morales Salas</name><uri>http://www.blogger.com/profile/07642586501018157497</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='28' src='http://3.bp.blogspot.com/_TGgpRudXV3w/SfP_sc5YZ3I/AAAAAAAABSs/APK4YFwjVn4/S220/yoft3.png'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1421033339681316542.post-2993095858933935011</id><published>2008-12-14T16:08:00.003-03:00</published><updated>2008-12-14T16:29:41.045-03:00</updated><title type='text'>Opensuse 11.1 disponible para descarga</title><content type='html'>&lt;div style="text-align: justify;"&gt;Hace unos días atrás comenzó la cruzada por encontrar mirrors desprotegidos para descargar la versión final de opensuse 11.1. Algunos logramos descargar una o mas isos antes de que los sitios fueran protegidos y por ende nadie mas pudiera descargar (otros con menos suerte llegaron a descargar el 90% y nada mas).&lt;br /&gt;&lt;br /&gt;Gracias a que algunos que lo bajaron subieron el &lt;a href="http://www.bittorrent.com/"&gt;torrent&lt;/a&gt;, ahora está disponible nuevamente para la descarga, un servicio no oficial pero que permite la descarga de la versión final oficial.&lt;br /&gt;&lt;br /&gt;Desde ya doy las gracias a la comunidad de &lt;a href="http://www.forosuse.org/forosuse/showthread.php?t=19356"&gt;foro suse&lt;/a&gt; quienes se han encargado de la búsqueda de mirrors y a todos aquellos involucrados en la provisión de los torrents e isos.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.mininova.org/tor/2087535"&gt;Opensuse 11.1 x86 (32 bits) DVD&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.mininova.org/tor/2086763"&gt;Opensuse 11.1 x86 (32 bits) Live CD KDE 4.1.3&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.mininova.org/tor/2087921"&gt;Opensuse 11.1 x86_64 (64 bits) DVD&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Yo ya la estoy disfrutando desde hace dos días, que esperan !!!&lt;br /&gt;&lt;br /&gt;Durante estos dos dias de uso como sistema principal y único en mi equipo me he encontrado con un bug bastante desagradable. Cada vez que abria en un programa un diálogo de descarga o de guardado de algun archivo a alguna parte del disco duro (firefox y ktorrent, no probé otros), el home se "&lt;span style="font-style: italic;"&gt;desmontaba&lt;/span&gt;" y no quedaba otra que reiniciar el equipo. Al volver a hacer lo mismo volvia a "desmontarse" y el home queda inutilizable desde interfaz gráfica (desde consola no hay problema), sin embargo los sub directorios no tienen problemas.&lt;br /&gt;&lt;br /&gt;A continuación algunas screenshots del error:&lt;br /&gt;&lt;br /&gt;Aquí se ve el home antes de abrir el diálogo de descarga (de firefox)&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_TGgpRudXV3w/SUVdv2LWgiI/AAAAAAAABPc/i0aqS8BeWeY/s1600-h/ok1tl6.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="http://1.bp.blogspot.com/_TGgpRudXV3w/SUVdv2LWgiI/AAAAAAAABPc/i0aqS8BeWeY/s320/ok1tl6.png" alt="" id="BLOGGER_PHOTO_ID_5279729214740136482" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Aquí se ve el home después de abrir el diálogo de descarga (de firefox)&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_TGgpRudXV3w/SUVdwJEeXzI/AAAAAAAABPk/BKoaXdchHEg/s1600-h/error1fq3.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="http://2.bp.blogspot.com/_TGgpRudXV3w/SUVdwJEeXzI/AAAAAAAABPk/BKoaXdchHEg/s320/error1fq3.png" alt="" id="BLOGGER_PHOTO_ID_5279729219811565362" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Aquí se ve un sub directorio después de abrir el diálogo de descarga (de firefox)&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_TGgpRudXV3w/SUVdw9opbOI/AAAAAAAABPs/wjg8Zwcuuvs/s1600-h/error2rb2.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="http://4.bp.blogspot.com/_TGgpRudXV3w/SUVdw9opbOI/AAAAAAAABPs/wjg8Zwcuuvs/s320/error2rb2.png" alt="" id="BLOGGER_PHOTO_ID_5279729233921928418" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Haciendo pruebas por aquí por allá llegué a la conclusión de que el culpable es &lt;span style="font-style: italic;"&gt;jexec&lt;/span&gt;, entonces simplemente se desactiva ese demonio desde &lt;span style="font-style: italic;"&gt;YaST -&gt; Sistema -&gt; Servicios del sistema&lt;/span&gt;, se reinicia el equipo y ya está.&lt;br /&gt;&lt;br /&gt;Saludos !!!&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1421033339681316542-2993095858933935011?l=metalklesk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://metalklesk.blogspot.com/feeds/2993095858933935011/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://metalklesk.blogspot.com/2008/12/opensuse-111-disponible-para-descarga.html#comment-form' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1421033339681316542/posts/default/2993095858933935011'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1421033339681316542/posts/default/2993095858933935011'/><link rel='alternate' type='text/html' href='http://metalklesk.blogspot.com/2008/12/opensuse-111-disponible-para-descarga.html' title='Opensuse 11.1 disponible para descarga'/><author><name>Daniel Dario Morales Salas</name><uri>http://www.blogger.com/profile/07642586501018157497</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='28' src='http://3.bp.blogspot.com/_TGgpRudXV3w/SfP_sc5YZ3I/AAAAAAAABSs/APK4YFwjVn4/S220/yoft3.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_TGgpRudXV3w/SUVdv2LWgiI/AAAAAAAABPc/i0aqS8BeWeY/s72-c/ok1tl6.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1421033339681316542.post-6319805043214648883</id><published>2008-12-14T03:43:00.005-03:00</published><updated>2008-12-14T04:03:46.163-03:00</updated><title type='text'>J-Kiltro 4.0 Beta 5 Liberado</title><content type='html'>&lt;div style="text-align: justify;"&gt;Hoy he liberado la versión 4.0 Beta 5 de mi software de conversión de archivos de audio multi formato &lt;a href="https://sourceforge.net/projects/j-kiltro/"&gt;J-Kiltro&lt;/a&gt;.&lt;br /&gt;Si bien es beta, funciona a full. Aún me falta revisarlo a detalle y agregarle algunas características mas, por eso está en esta etapa.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_TGgpRudXV3w/SUSrUG7EoNI/AAAAAAAABN0/nDHi64b-0KU/s1600-h/imagen1.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="http://3.bp.blogspot.com/_TGgpRudXV3w/SUSrUG7EoNI/AAAAAAAABN0/nDHi64b-0KU/s320/imagen1.png" alt="" id="BLOGGER_PHOTO_ID_5279533025129177298" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Para quienes no saben de qué hablo, J-Kiltro es un software que sirve para convertir un archivo de audio de un formato a otro, por ejemplo mp3 a ogg, wma a mpc. Soporta 14 formatos de entrada y 12 de salida.&lt;br /&gt;&lt;br /&gt;Los formatos de entrada son:&lt;br /&gt;&lt;blockquote&gt;aac,aiff,ape,au,flac,m4a,m4b,mp3,mp4,mpc,ogg,ra,wav y wma&lt;/blockquote&gt;&lt;br /&gt;y los formatos de salida son:&lt;br /&gt;&lt;blockquote&gt;aac,aiff,ape,au,flac,m4a,m4b,mp3,mp4,mpc,ogg y wav&lt;/blockquote&gt;&lt;br /&gt;Esta aplicación está desarrollada 100% en java utilizando el IDE &lt;a href="http://www.netbeans.org/"&gt;NetBeans&lt;/a&gt; 6.5.&lt;br /&gt;&lt;br /&gt;Dentro de las características de ésta versión se encuentran:&lt;br /&gt;&lt;/div&gt;&lt;ul style="text-align: justify;"&gt;&lt;li&gt;Interfaz muy simple y amigable.&lt;/li&gt;&lt;li&gt;Soporta 14 formatos de entrada y 12 de salida.&lt;/li&gt;&lt;li&gt;Extracción de pistas de audio desde CD (son selección de pistas).&lt;/li&gt;&lt;li&gt;Tiene previsualizador de audio con un reproductor interno (mp3, ogg, flac, wav, aiff y au).&lt;/li&gt;&lt;li&gt;Reproductor de audio interno.&lt;/li&gt;&lt;li&gt;Obtiene metadata desde archivos de audio automáticamente.&lt;/li&gt;&lt;li&gt;Permite editar la metadata de los archivos de audio.&lt;/li&gt;&lt;li&gt;Detección automática de dependencias.&lt;/li&gt;&lt;li&gt;Permite el ingreso de archivos de distintos formatos a la lista y automáticamente sabe como tratarlos para llevarlos al formato de destino.&lt;/li&gt;&lt;li&gt;Soporta distintos look and feel.&lt;/li&gt;&lt;li&gt;etc.&lt;/li&gt;&lt;/ul&gt;Ésta aplicación solo funciona en distribuciones Linux ya que requiere de algunas aplicaciones de linea de comandos para hacer las conversiones. Las dependencias son:&lt;br /&gt;&lt;ul style="text-align: justify;"&gt;&lt;li&gt;Lame&lt;/li&gt;&lt;li&gt;Vorbis-tools&lt;/li&gt;&lt;li&gt;Mppdec y Mppenc&lt;/li&gt;&lt;li&gt;Sox&lt;/li&gt;&lt;li&gt;Mac&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Flac&lt;/li&gt;&lt;li&gt;Faac y Faad&lt;/li&gt;&lt;li&gt;Mplayer&lt;/li&gt;&lt;li&gt;CD Paranoia&lt;/li&gt;&lt;li&gt;JRE 1.6 update 10 o superior (openjdk 6 también sirve)&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div style="text-align: justify;"&gt;Todas las dependencias (o la mayoría) están disponibles en los repositorios de las distribuciones Linux, por ejemplo todas están disponibles en &lt;a href="http://www.opensuse.org/"&gt;openSUSE 11.0&lt;/a&gt;, por lo que antes de pensar en compilarlas tu mismo, mejor descárgalas usando el gestor de paquetes de tu distro (YaST, apt-get, yum, etc.), es más simple.&lt;br /&gt;&lt;br /&gt;La razón de que no corre en Windows es simple, no le he dado soporte. Si bien está desarrollado en Java, la detección de dependencias es solo para distribuciones Linux y los comandos de conversión no son los mismos en una distro Linux y en Windows. De todas formas estos dos aspectos son simples de modificar para portar la aplicación a Windows.&lt;br /&gt;&lt;br /&gt;Si alguien está interesado en dar el soporte para que esta aplicación corra en otros SO bienvenido sea, el código está bajo la licencia GPL 3.&lt;br /&gt;&lt;br /&gt;Esta versión (beta 5) se diferencia de la beta 4 en varias cosas pequeñas pero importantes.&lt;br /&gt;&lt;br /&gt;Se han corregido algunos errores en la reproducción de sonido en el previsualizador interno y se le han agregado algunos detalles como mostrar el % de sonido reproducido (en el avance), el nombre del archivo que se esta leyendo y su duración en minutos y segundos.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_TGgpRudXV3w/SUSrUfOSe7I/AAAAAAAABN8/ehqxxG20zyM/s1600-h/imagen2.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="http://2.bp.blogspot.com/_TGgpRudXV3w/SUSrUfOSe7I/AAAAAAAABN8/ehqxxG20zyM/s320/imagen2.png" alt="" id="BLOGGER_PHOTO_ID_5279533031652228018" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_TGgpRudXV3w/SUStFIh2rlI/AAAAAAAABOE/pOykYGr-t-g/s1600-h/imagen3.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="http://1.bp.blogspot.com/_TGgpRudXV3w/SUStFIh2rlI/AAAAAAAABOE/pOykYGr-t-g/s320/imagen3.png" alt="" id="BLOGGER_PHOTO_ID_5279534966885494354" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Se ha agregado una lista de reproduccion con opcion de agregar y quitar archivos así como editar su metadata (mp3, ogg y flac por el momento) directamente sin necesidad de hacer una conversión.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_TGgpRudXV3w/SUStFcazLcI/AAAAAAAABOM/7Y_ooFajv_0/s1600-h/imagen4.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="http://3.bp.blogspot.com/_TGgpRudXV3w/SUStFcazLcI/AAAAAAAABOM/7Y_ooFajv_0/s320/imagen4.png" alt="" id="BLOGGER_PHOTO_ID_5279534972224613826" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_TGgpRudXV3w/SUStfdQxWAI/AAAAAAAABOU/51Bv23OxyU8/s1600-h/imagen5.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="http://1.bp.blogspot.com/_TGgpRudXV3w/SUStfdQxWAI/AAAAAAAABOU/51Bv23OxyU8/s320/imagen5.png" alt="" id="BLOGGER_PHOTO_ID_5279535419127584770" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_TGgpRudXV3w/SUStfbpY9UI/AAAAAAAABOc/GEpqVVAqOIs/s1600-h/imagen6.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="http://4.bp.blogspot.com/_TGgpRudXV3w/SUStfbpY9UI/AAAAAAAABOc/GEpqVVAqOIs/s320/imagen6.png" alt="" id="BLOGGER_PHOTO_ID_5279535418693973314" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_TGgpRudXV3w/SUStfiIDNQI/AAAAAAAABOk/OYcSB7aooTY/s1600-h/imagen7.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="http://4.bp.blogspot.com/_TGgpRudXV3w/SUStfiIDNQI/AAAAAAAABOk/OYcSB7aooTY/s320/imagen7.png" alt="" id="BLOGGER_PHOTO_ID_5279535420433184002" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;También se ha agregado la opción de agregar los archivos convertidos a la lista de reproducción de audio principal de la aplicación.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_TGgpRudXV3w/SUSuPLXU1zI/AAAAAAAABPE/SHlCYeS3aRs/s1600-h/imagen11.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="http://3.bp.blogspot.com/_TGgpRudXV3w/SUSuPLXU1zI/AAAAAAAABPE/SHlCYeS3aRs/s320/imagen11.png" alt="" id="BLOGGER_PHOTO_ID_5279536238956959538" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_TGgpRudXV3w/SUSuPSbTjNI/AAAAAAAABPM/O0jaVCk-GZk/s1600-h/imagen12.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="http://3.bp.blogspot.com/_TGgpRudXV3w/SUSuPSbTjNI/AAAAAAAABPM/O0jaVCk-GZk/s320/imagen12.png" alt="" id="BLOGGER_PHOTO_ID_5279536240852700370" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_TGgpRudXV3w/SUSuPfvBy6I/AAAAAAAABPU/91t4VpYMIsQ/s1600-h/imagen13.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="http://1.bp.blogspot.com/_TGgpRudXV3w/SUSuPfvBy6I/AAAAAAAABPU/91t4VpYMIsQ/s320/imagen13.png" alt="" id="BLOGGER_PHOTO_ID_5279536244425083810" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;A continuación dejo algunas screenshots extras para que se puedan familiarizar con la aplicación.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_TGgpRudXV3w/SUStfyiE62I/AAAAAAAABOs/-WdNjI5x7Rg/s1600-h/imagen8.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="http://2.bp.blogspot.com/_TGgpRudXV3w/SUStfyiE62I/AAAAAAAABOs/-WdNjI5x7Rg/s320/imagen8.png" alt="" id="BLOGGER_PHOTO_ID_5279535424837315426" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_TGgpRudXV3w/SUStgE0g2dI/AAAAAAAABO0/4AirzduWTSU/s1600-h/imagen9.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="http://3.bp.blogspot.com/_TGgpRudXV3w/SUStgE0g2dI/AAAAAAAABO0/4AirzduWTSU/s320/imagen9.png" alt="" id="BLOGGER_PHOTO_ID_5279535429746481618" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_TGgpRudXV3w/SUSuPIMc5fI/AAAAAAAABO8/QcPZdJWpi8I/s1600-h/imagen10.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="http://3.bp.blogspot.com/_TGgpRudXV3w/SUSuPIMc5fI/AAAAAAAABO8/QcPZdJWpi8I/s320/imagen10.png" alt="" id="BLOGGER_PHOTO_ID_5279536238106043890" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;El problema que tiene es inherente a java y es que la reproducción de audio no se puede hacer a menos que no exista ningún otro programa reproduciendo audio (firefox en youtube, amarok corriento, etc.) ya que java toma control absoluto y directo de la tarjeta de sonido. Aún no conozco alguna solución a esto pero seguiré buscando.&lt;br /&gt;&lt;br /&gt;Cualquier comentario constructivo será bienvenido.&lt;br /&gt;&lt;br /&gt;Saludos !!!&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1421033339681316542-6319805043214648883?l=metalklesk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://metalklesk.blogspot.com/feeds/6319805043214648883/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://metalklesk.blogspot.com/2008/12/j-kiltro-40-beta-5-liberado.html#comment-form' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1421033339681316542/posts/default/6319805043214648883'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1421033339681316542/posts/default/6319805043214648883'/><link rel='alternate' type='text/html' href='http://metalklesk.blogspot.com/2008/12/j-kiltro-40-beta-5-liberado.html' title='J-Kiltro 4.0 Beta 5 Liberado'/><author><name>Daniel Dario Morales Salas</name><uri>http://www.blogger.com/profile/07642586501018157497</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='28' src='http://3.bp.blogspot.com/_TGgpRudXV3w/SfP_sc5YZ3I/AAAAAAAABSs/APK4YFwjVn4/S220/yoft3.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_TGgpRudXV3w/SUSrUG7EoNI/AAAAAAAABN0/nDHi64b-0KU/s72-c/imagen1.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1421033339681316542.post-411528661761932717</id><published>2008-12-08T02:16:00.003-03:00</published><updated>2008-12-08T02:40:00.486-03:00</updated><title type='text'>Canal #softwarelibre en IRC</title><content type='html'>Hace unos días nuestro amigo Eduardo Aguila &lt;span style="font-style: italic;"&gt;alias&lt;/span&gt; jam de &lt;a href="http://www.tecnologiaslibres.net/"&gt;Tecnologías Libres&lt;/a&gt; y &lt;a href="http://forosdesl.com/"&gt;Foros de Software Libre&lt;/a&gt; nos avisó de la &lt;a href="http://www.tecnologiaslibres.net/2008/12/02/tenemos-char-irc/"&gt;apertura de un canal en IRC&lt;/a&gt; en donde podemos juntarnos quienes queremos compartir conocimiento y hacernos de amistades mas allá de las fronteras inmediatas.&lt;br /&gt;&lt;br /&gt;El servidor IRC es&lt;br /&gt;&lt;blockquote&gt;irc.cl&lt;/blockquote&gt;&lt;br /&gt;y el canal es&lt;br /&gt;&lt;blockquote&gt;#softwarelibre&lt;/blockquote&gt;&lt;br /&gt;NO se requiere de ninguna contraseña, solo ingresan un nombre de usuario y listo.&lt;br /&gt;&lt;br /&gt;Para entrar pueden usar cualquier cliente IRC como &lt;a href="http://www.xchat.org/"&gt;XChat&lt;/a&gt;, &lt;a href="http://konversation.kde.org/"&gt;Konversation&lt;/a&gt;, &lt;a href="http://www.pidgin.im/"&gt;Pidgin&lt;/a&gt; o &lt;a href="http://www.mirc.com/"&gt;mIRC&lt;/a&gt; (por nombrar algunos). Un cliente que me recomendó nuestro amigo bloguero Gonzalo Díaz Cruz &lt;span style="font-style: italic;"&gt;alias&lt;/span&gt; &lt;a href="http://devgon.wordpress.com/"&gt;Sir Gon&lt;/a&gt; es &lt;a href="http://www.mibbit.com"&gt;mibbit&lt;/a&gt;, un cliente IRC hecho en ajax y funciona sobre un navegador web, ideal para conectarse desde redes restrictivas como en las Universidades. Un link directo para entrar a este canal es &lt;a href="http://embed.mibbit.com/?server=irc.cl&amp;amp;channel=%23softwarelibre&amp;amp;forcePrompt=true&amp;amp;promptPass=trueyo"&gt;éste&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;La verdad, desde que se abrió este canal me conecto bastante, es una buena vía de comunicación y difusión de información.&lt;br /&gt;&lt;br /&gt;La invitación es abierta a todos, los esperamos !&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/1421033339681316542-411528661761932717?l=metalklesk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://metalklesk.blogspot.com/feeds/411528661761932717/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://metalklesk.blogspot.com/2008/12/canal-softwarelibre-en-irc.html#comment-form' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1421033339681316542/posts/default/411528661761932717'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1421033339681316542/posts/default/411528661761932717'/><link rel='alternate' type='text/html' href='http://metalklesk.blogspot.com/2008/12/canal-softwarelibre-en-irc.html' title='Canal #softwarelibre en IRC'/><author><name>Daniel Dario Morales Salas</name><uri>http://www.blogger.com/profile/07642586501018157497</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='28' src='http://3.bp.blogspot.com/_TGgpRudXV3w/SfP_sc5YZ3I/AAAAAAAABSs/APK4YFwjVn4/S220/yoft3.png'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1421033339681316542.post-4043169974082119563</id><published>2008-11-30T23:40:00.010-03:00</published><updated>2009-08-18T22:53:47.059-04:00</updated><title type='text'>Chat escalable en Java usando NetBeans 6.5</title><content type='html'>&lt;div style="text-align: justify;"&gt;&lt;span style="font-weight: bold;font-size:180%;" &gt;Introducción&lt;/span&gt;&lt;br /&gt;Hace tiempo creé una pequeña aplicación para &lt;a href="http://metalklesk.blogspot.com/2007/12/chat-en-java-usando-sockets-en-netbeans.html"&gt;chat&lt;/a&gt;, un cliente y un servidor.&lt;br /&gt;&lt;br /&gt;Si bien ese chat funciona bien, no es escalable. Cada vez que se conecta un cliente, el servidor crea un hilo para gestionarlo. Si se conectan mil personas, se crean mil hilos. Como ya se darán cuenta, mediante esa forma de trabajar el consumo de CPU y memoria RAM se elevan mucho a medida que se conectan mas y mas personas.&lt;br /&gt;&lt;br /&gt;Los hilos sirven, permiten hacer varias cosas a la vez sin que se bloquee al usuario, pero la verdad, para una aplicación chat no es recomendable.&lt;br /&gt;&lt;br /&gt;Mirando la &lt;a href="http://java.sun.com/j2se/1.4.2/docs/api/java/nio/package-summary.html"&gt;API de java NIO&lt;/a&gt; (New Input Output) mas algunos &lt;a href="http://www.javafaq.nu/java-example-code-926.html"&gt;foros&lt;/a&gt;, &lt;a href="http://www.sargue.net/2006/01/javanio.html"&gt;blogs&lt;/a&gt; y &lt;a href="http://java.sun.com/developer/technicalArticles/releases/nio/"&gt;tutoriales&lt;/a&gt; se puede ver que ésta permite hacer aplicaciones escalables con flujos de datos (Sockets, archivos, etc.). Esta API tiene una clase llamada Selector, la cual se encarga de manejar Sockets no bloqueantes que no son mas que canales para transmisión de flujos de datos.&lt;br /&gt;&lt;br /&gt;NIO es una solución para aplicaciones escalables en java, no es necesario crear hilos para cada cliente y literalmente puede manejar miles de clientes con un bajo consumo de recursos.&lt;br /&gt;&lt;br /&gt;El problema con NIO es que es de muy bajo nivel, lo único que puede viajar por la red son objetos de tipo ByteBuffer, pero que pasa cuando los datos que se quieren transmitir son de diferentes largos ? que pasa si me paso en el tamaño establecido por el buffer ? o si me sobra ? al ser de bajo nivel hay que gestionar demasiados casos, demasiados parámetros, como mencionaba es de bajo nivel. Y justamente este problema lo tuve al desarrollar un nuevo chat usando NIO. Cuando enviaba muchos emoticones el mensaje se perdía por el tema del buffer.&lt;br /&gt;&lt;br /&gt;Los ejemplos en Internet abundan, pero los ejemplos decentes .... no encontré ni uno solo, solo se encuentran cosas como para enviar un par de palabras, nada que permita a un usuario hacer algo mas grande o mas normal como enviar texto mezclado con imágenes o url's.&lt;br /&gt;&lt;br /&gt;Buscando algo que encapsulara y subiera de nivel a NIO llegué a un proyecto open source muy muy muy bueno, se llama &lt;a href="http://xsocket.sourceforge.net/"&gt;XSocket&lt;/a&gt;. Esta es una API que encapsula a NIO encargándose de todo lo que es de bajo nivel permitiendo al desarrollador preocuparse por la implementación de lo que es importante (la lógica de la comunidad java) y no de los detalles (importantes) de bajo nivel.&lt;br /&gt;&lt;br /&gt;Migré mi código inicial de NIO a XSocket y todo funcionó a la perfección.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:180%;" &gt;Características&lt;/span&gt;&lt;br /&gt;La aplicación que desarrollé soporta:&lt;br /&gt;&lt;/div&gt;&lt;ul style="text-align: justify;"&gt;&lt;li&gt;Emoticones&lt;/li&gt;&lt;li&gt;Color del texto cambiable&lt;/li&gt;&lt;li&gt;Estados&lt;/li&gt;&lt;li&gt;Mensaje personal&lt;/li&gt;&lt;li&gt;Avatares&lt;/li&gt;&lt;li&gt;URL's&lt;/li&gt;&lt;li&gt;Chat global o general&lt;/li&gt;&lt;li&gt;Chat privados&lt;/li&gt;&lt;li&gt;Pestañas&lt;/li&gt;&lt;li&gt;Multi usuario&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div style="text-align: justify;"&gt;Lo que no soporta este chat es envío de archivos, tal vez alguno de ustedes lo puede hacer y compartir con los demás, así hacemos un chat mas poderoso.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:180%;" &gt;Mensajes&lt;/span&gt;&lt;br /&gt;Los mensajes que se transmiten son texto con estructura &lt;a href="http://es.wikipedia.org/wiki/XML"&gt;XML&lt;/a&gt;, un mensaje podría tener la siguiente estructura:&lt;br /&gt;&lt;blockquote&gt;&lt;code&gt;&lt;br /&gt;&amp;lt;?xml version="1.0" encoding="UTF-8" standalone="no"?&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;raiz&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;tipo&amp;gt;&amp;lt;/tipo&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;remitente&amp;gt;metalklesk&amp;lt;/remitente&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;avatar&amp;gt;&amp;lt;/avatar&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;color&amp;gt;&amp;lt;/color&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;mensaje&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;texto&amp;gt;Este es un ejemplo de texto junto a un emoticon&amp;lt;/texto&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;emoticon&amp;gt;&amp;lt;/emoticon&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;texto&amp;gt;y al lado hay un link&amp;lt;/texto&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;url&amp;gt;http://metalklesk.blogspot.com&amp;lt;/url&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;texto&amp;gt;que se puede pinchar para abrirlo en un navegador web.&amp;lt;/texto&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/mensaje&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;destinatario&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;usuario&amp;gt;&amp;lt;/usuario&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;usuario&amp;gt;&amp;lt;/usuario&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;usuario&amp;gt;&amp;lt;/usuario&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;usuario&amp;gt;&amp;lt;/usuario&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/destinatario&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/raiz&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:180%;" &gt;Protocolo de mensajería&lt;/span&gt;&lt;br /&gt;El protocolo de mensajería se basa en etiquetas o tags que definen ciertas características.&lt;br /&gt;El tag &lt;span style="font-style: italic;"&gt;tipo&lt;/span&gt; establece el tipo de mensaje que se transmite. Estos tipos tienen un valor &lt;span style="font-style: italic;"&gt;entero&lt;/span&gt; y cada valor tiene su &lt;span style="font-style: italic;"&gt;significado particular&lt;/span&gt;. A continuación se pueden ver los tipos y su significado:&lt;br /&gt;&lt;blockquote&gt;-2: conexión aceptada desde el servidor&lt;br /&gt;-1: conexión rechazada desde el servidor, nickname ya está en uso&lt;br /&gt;1 : aviso/petición de conexión&lt;br /&gt;2 : mensaje broadcast (para todos)&lt;br /&gt;3 : cliente ha cambiado de estado&lt;br /&gt;4 : cliente ha cambiado de avatar&lt;br /&gt;5 : cliente ha cambiado su mensaje personal&lt;br /&gt;6 : mensaje unicast (solo para uno)&lt;/blockquote&gt;Mediante el establecimiento de tipos de mensajes, la gestión de los mismos se torna muy fácil, simplemente se lee el tipo de mensaje y se gestiona según corresponda.&lt;br /&gt;&lt;br /&gt;El uso de una estructura XML permite crear un mensaje ordenado, donde cada parte esta bien definida y además se pueden agregar más sin cambiar o modificar lo ya hecho.&lt;br /&gt;&lt;br /&gt;Mediante este esquema se pueden enviar mensajes con texto, emoticones y URL's, en cualquier orden y todo lo que se quiera. Se pueden enviar mensajes broadcast o unicast (multicast no está implementado pero el protocolo lo permite), se pueden usar nicknames, estados, mensajes personales, etc.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:180%;" &gt;Funcionamiento interno&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;Formateando el mensaje&lt;/span&gt;&lt;br /&gt;Para el funcionamiento interno se debe construir un mensaje con estructura XML a partir del texto que el usuario escriba en el chat. Para esto escribí una clase que se llama &lt;span style="font-style: italic;"&gt;FiltroMensajeFormatoXML&lt;/span&gt;, el cual hace un parseo de la linea de texto y separa en texto, emoticones y URL's retornando un ArrayList con el contenido del mensaje pre-formateado. Los emoticones son imágenes, éstas imágenes son transformadas a texto codificándolas en Base64.&lt;br /&gt;&lt;br /&gt;El texto a formatear puede ser el siguiente:&lt;br /&gt;&lt;blockquote&gt;Hola mundo! [emo]ohaha[/emo], visita mi blog [url]http://metalklesk.blogspot.com[/url]&lt;/blockquote&gt;Y la salida pre formateada sería la siguiente&lt;br /&gt;&lt;blockquote&gt;[texto]Hola mundo!&lt;br /&gt;[emoticon](emoticon en texto)&lt;br /&gt;[texto], visita mi blog&lt;br /&gt;[url]http://metalklesk.blogspot.com&lt;/blockquote&gt;&lt;br /&gt;Una ves pre-formateado se crea un objeto de la clase MensajeFormatoXML, al cual se le pasa el contenido del mensaje, el tipo de mensaje y todos los datos que correspondan según el tipo de mensaje. Ésta clase tiene un método que crea un documento XML con toda la información ingresada al objeto y retorna un String con el mensaje construido y formateado.&lt;br /&gt;El mensaje quedaria de ésta forma:&lt;br /&gt;&lt;blockquote&gt;&lt;code&gt;&lt;br /&gt;&amp;lt;?xml version="1.0" encoding="UTF-8" standalone="no"?&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;raiz&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;tipo&amp;gt;2&amp;lt;/tipo&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;remitente&amp;gt;metalklesk&amp;lt;/remitente&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;avatar&amp;gt;imagen codificada en base 64&amp;lt;/avatar&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;color&amp;gt;representacion del color como entero&amp;lt;/color&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;mensaje&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;texto&amp;gt;Hola mundo! &amp;lt;/texto&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;emoticon&amp;gt;imagen codificada en base 64&amp;lt;/emoticon&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;texto&amp;gt;, visita mi blog&amp;lt;/texto&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;url&amp;gt;http://metalklesk.blogspot.com&amp;lt;/url&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/mensaje&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;destinatario&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/destinatario&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/raiz&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Una vez listo el mensaje está listo para ser enviado.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;Conexión al servidor&lt;/span&gt;&lt;br /&gt;Para conectarse al servidor del chat se crea una instancia de la clase &lt;span style="font-style: italic;"&gt;NonBlockingConnection&lt;/span&gt; del API XSocket. Esta clase recibe el &lt;span style="font-weight: bold;"&gt;ip&lt;/span&gt; o &lt;span style="font-weight: bold;"&gt;hostname&lt;/span&gt; del servidor, el &lt;span style="font-weight: bold;"&gt;puerto&lt;/span&gt; y un &lt;span style="font-weight: bold;"&gt;manejador de la entrada de datos&lt;/span&gt; (una instancia de la clase &lt;span style="font-style: italic;"&gt;IDataHandler&lt;/span&gt;).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;Envío y recepción del mensaje&lt;/span&gt;&lt;br /&gt;Para enviar un mensaje simplemente se utiliza la linea:&lt;br /&gt;&lt;blockquote&gt;nbc.write(mensaje.getMensajeXML() + "\n", "UTF-8");&lt;/blockquote&gt;&lt;br /&gt;y el mensaje en formato de texto XML es enviado al servidor.&lt;br /&gt;&lt;br /&gt;Cuando el servidor envía una respuesta, ésta es capturada en el objeto IDataHandler mediante el método onData, y se utiliza la siguiente línea para obtener el texto:&lt;br /&gt;&lt;blockquote&gt;String res = nbc.readStringByDelimiter("\n", "UTF-8");&lt;/blockquote&gt;&lt;br /&gt;Luego se crea una instancia de la clase &lt;span style="font-style: italic;"&gt;ParserMensajeXML&lt;/span&gt; que se encarga de crear un documento XML en memoria con el texto y luego se obtiene un objeto &lt;span style="font-style: italic;"&gt;MensajeFormatoXML&lt;/span&gt; con el mensaje listo para ser leído utilizando los métodos GET definidos.&lt;br /&gt;&lt;blockquote&gt;&lt;code&gt;&lt;br /&gt;public boolean onData(INonBlockingConnection nbc) throws IOException, BufferUnderflowException,MaxReadSizeExceededException {&lt;br /&gt;&lt;br /&gt;//aqui recibo el mensaje entrante&lt;br /&gt;&lt;br /&gt;String res = nbc.readStringByDelimiter("\n", "UTF-8");&lt;br /&gt;&lt;br /&gt;//aqui parseo el mensaje&lt;br /&gt;&lt;br /&gt;ParserMensajeXML xml = new ParserMensajeXML(res);&lt;br /&gt;&lt;br /&gt;//aqui obtengo el mensaje&lt;br /&gt;&lt;br /&gt;MensajeFormatoXML mensaje = xml.getMensaje();&lt;br /&gt;&lt;br /&gt;//aqui lo envio a todos los que están a la escucha del mensaje entrante.&lt;br /&gt;&lt;br /&gt;RepetidorMensajeEntrante.getInstance().enviarMensaje(mensaje);&lt;br /&gt;&lt;br /&gt;return true;&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/blockquote&gt;Lo demás del chat cliente es solo el manejo de la presentación del mensaje, eventos y algunas cosas entretenidas que no tienen nada que ver con la transmisión de datos por la red.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:180%;" &gt;Utilización&lt;/span&gt;&lt;br /&gt;Para utilizar el chat primero se debe ejecutar el servidor. Para esto simplemente se debe ejecutar en consola en cualquier Sistema Operativo que soporte Java:&lt;br /&gt;&lt;blockquote&gt;java -jar ServidorNIO.jar&lt;/blockquote&gt;&lt;br /&gt;o ejecutar en Linux&lt;br /&gt;&lt;blockquote&gt;./run.sh&lt;/blockquote&gt;&lt;br /&gt;o en Windows (se debe renombrar el archivo run.bat.txt a run.bat)&lt;br /&gt;&lt;blockquote&gt;./run.bat&lt;/blockquote&gt;No olvidar que se debe tener instalada la máquina virtual de java, recomiendo la &lt;a href="http://java.sun.com/javase/downloads/?intcmp=1281"&gt;última versión&lt;/a&gt; a la fecha.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:180%;" &gt;Capturas de pantalla&lt;/span&gt;&lt;br /&gt;Aquí dejo algunas capturas de pantalla mostrando la ejecución de la aplicación&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_TGgpRudXV3w/STNpzS_gR6I/AAAAAAAABMs/1KxUISXPtkY/s1600-h/cliente+nio1.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="http://3.bp.blogspot.com/_TGgpRudXV3w/STNpzS_gR6I/AAAAAAAABMs/1KxUISXPtkY/s320/cliente+nio1.png" alt="" id="BLOGGER_PHOTO_ID_5274675918573422498" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_TGgpRudXV3w/STNpzrybUqI/AAAAAAAABM0/-yVrBDhQ7FM/s1600-h/cliente+nio2.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="http://3.bp.blogspot.com/_TGgpRudXV3w/STNpzrybUqI/AAAAAAAABM0/-yVrBDhQ7FM/s320/cliente+nio2.png" alt="" id="BLOGGER_PHOTO_ID_5274675925229458082" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_TGgpRudXV3w/STNp0KLxtmI/AAAAAAAABM8/CEuXywLiCYQ/s1600-h/cliente+nio3.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="http://3.bp.blogspot.com/_TGgpRudXV3w/STNp0KLxtmI/AAAAAAAABM8/CEuXywLiCYQ/s320/cliente+nio3.png" alt="" id="BLOGGER_PHOTO_ID_5274675933388846690" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_TGgpRudXV3w/STNp0v0B6uI/AAAAAAAABNE/kfuCM14cTzc/s1600-h/cliente+nio4.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="http://1.bp.blogspot.com/_TGgpRudXV3w/STNp0v0B6uI/AAAAAAAABNE/kfuCM14cTzc/s320/cliente+nio4.png" alt="" id="BLOGGER_PHOTO_ID_5274675943489792738" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_TGgpRudXV3w/STNp07VRG7I/AAAAAAAABNM/cgOFrTH6Bxo/s1600-h/cliente+nio5.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="http://2.bp.blogspot.com/_TGgpRudXV3w/STNp07VRG7I/AAAAAAAABNM/cgOFrTH6Bxo/s320/cliente+nio5.png" alt="" id="BLOGGER_PHOTO_ID_5274675946581990322" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_TGgpRudXV3w/STNr4p9GnKI/AAAAAAAABNc/EndpoPAhJp4/s1600-h/cliente+nio6.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="http://2.bp.blogspot.com/_TGgpRudXV3w/STNr4p9GnKI/AAAAAAAABNc/EndpoPAhJp4/s320/cliente+nio6.png" alt="" id="BLOGGER_PHOTO_ID_5274678209659968674" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_TGgpRudXV3w/STNr5TQ_KlI/AAAAAAAABNk/3RM-Ach4bw8/s1600-h/cliente+nio7.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="http://2.bp.blogspot.com/_TGgpRudXV3w/STNr5TQ_KlI/AAAAAAAABNk/3RM-Ach4bw8/s320/cliente+nio7.png" alt="" id="BLOGGER_PHOTO_ID_5274678220749220434" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_TGgpRudXV3w/STNr57lEwCI/AAAAAAAABNs/wsRwBVZuMIo/s1600-h/cliente+nio8.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="http://1.bp.blogspot.com/_TGgpRudXV3w/STNr57lEwCI/AAAAAAAABNs/wsRwBVZuMIo/s320/cliente+nio8.png" alt="" id="BLOGGER_PHOTO_ID_5274678231570890786" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:180%;"&gt;Descarga !!!&lt;/span&gt;&lt;br /&gt;Todo el código está muy bien comentado, así es que lo pueden leer, entender, aprender y modificar.&lt;br /&gt;Esta aplicación, cliente y servidor, está bajo la licencia GPL V3.&lt;br /&gt;Para ver el código y modificarlo deben usar &lt;a href="http://www.netbeans.org/"&gt;NetBeans 6.5&lt;/a&gt;.&lt;br /&gt;&lt;a href="http://ifile.it/uz1km4h"&gt;Aquí está el cliente&lt;/a&gt; y &lt;a href="http://ifile.it/rogluis"&gt;aquí está el servidor&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;UPDATE 19-12-2008&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;He subido la versión 2.1 con los siguientes cambios:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Se corrige un error que unos amigos lectores avisaron mediante sus comentarios. El error se refiere a la creación (escritura) y lectura del archivo de configuración &lt;span style="font-weight: bold;"&gt;config.xml&lt;/span&gt; en la clase &lt;span style="font-weight: bold;"&gt;Configuracion.java&lt;/span&gt;. El error ocurre porque cuando se crea el archivo XML, la máquina virtual de java lo crea utilizando la codificación de caracteres por &lt;span style="font-style: italic;"&gt;default&lt;/span&gt; del sistema operativo en el cual se ejecuta y al leer el archivo XML le especifiqué que el archivo estaba en UTF-8, lo cual no es cierto en el caso de Windows (en Linux ningún problema). La solución fue simplemente forzar la escritura del archivo en UTF-8.&lt;/li&gt;&lt;li&gt;También agregué soporte para los temas (UI, User Interface) del proyecto substance.&lt;/li&gt;&lt;li&gt;Actualicé XSocket a la versión 2.3.&lt;/li&gt;&lt;li&gt;Agregué el soporte para enviar zumbidos en los mensajes privados (la ventana tiembla !!!).&lt;/li&gt;&lt;li&gt;Eliminé código innecesario en el servidor y en el cliente (ahora son menos lineas de código).&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Aquí está el &lt;a href="http://ifile.it/uz4bf20"&gt;cliente&lt;/a&gt; y aquí está el &lt;a href="http://ifile.it/fyahp8q"&gt;servidor&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Para descargar de los links anteriores se debe dar un click donde dice &lt;span style="font-weight: bold;"&gt;Request Download Ticket&lt;/span&gt; y luego &lt;span style="font-weight: bold;"&gt;Download (o Descargar)&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;UPDATE 26-04-2009&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;Hasta que consiga un repositorio que no me de problemas para compartir archivos,  por favor dejarme sus correos en un comentario y les reboto el cliente y el servidor por esa vía. Blogger me avisa cuando me hacen comentarios y mi correo lo estoy viendo todo el día, por lo que no me demoraré mucho en responderles (probablemente dentro del mismo día les conteste).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;UPDATE 18-08-2009&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;He creado un proyecto en &lt;a href="http://code.google.com/"&gt;Google Code&lt;/a&gt; así es que ahora pueden descargar el chat desde ahí sin tener que pedírmelo por correo o por el blog. Aún así agradeceré los comentarios que me puedan dejar en el blog.&lt;br /&gt;El enlace es el siguiente: &lt;a href="http://code.google.com/p/jtricahuenio/"&gt;http://code.google.com/p/jtricahuenio/&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;He realizado unos pequeños cambios desde la versión 2.1,la versión para descargar desde el enlace anterior es la 2.1.1:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Actualicé &lt;a href="http://xsocket.sourceforge.net/"&gt;xSocket&lt;/a&gt; a la versión 2.5.4.&lt;/li&gt;&lt;li&gt;Agregué el proyecto &lt;a href="https://base64.dev.java.net/"&gt;Base64&lt;/a&gt; para reemplazar la implementación de Sun para la codificación y decodificación de las imágenes (avatares y emoticones) en el chat, ahora funciona impecable con &lt;a href="http://openjdk.java.net/"&gt;OpenJDK&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;Actualicé &lt;a href="https://substance.dev.java.net/"&gt;substance&lt;/a&gt; a la versión 5.2 agregando 3 nuevos themes (Dust, Dust Coffe y Twilight).&lt;/li&gt;&lt;li&gt;El código fuente viene en un proyecto para &lt;a href="http://www.netbeans.org/"&gt;NetBeans&lt;/a&gt; 6.7.1.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Saludos !!!&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1421033339681316542-4043169974082119563?l=metalklesk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://metalklesk.blogspot.com/feeds/4043169974082119563/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://metalklesk.blogspot.com/2008/11/chat-escalable-en-java-usando-netbeans.html#comment-form' title='88 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1421033339681316542/posts/default/4043169974082119563'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1421033339681316542/posts/default/4043169974082119563'/><link rel='alternate' type='text/html' href='http://metalklesk.blogspot.com/2008/11/chat-escalable-en-java-usando-netbeans.html' title='Chat escalable en Java usando NetBeans 6.5'/><author><name>Daniel Dario Morales Salas</name><uri>http://www.blogger.com/profile/07642586501018157497</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='28' src='http://3.bp.blogspot.com/_TGgpRudXV3w/SfP_sc5YZ3I/AAAAAAAABSs/APK4YFwjVn4/S220/yoft3.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_TGgpRudXV3w/STNpzS_gR6I/AAAAAAAABMs/1KxUISXPtkY/s72-c/cliente+nio1.png' height='72' width='72'/><thr:total>88</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1421033339681316542.post-5384252985823440677</id><published>2008-11-26T01:56:00.010-03:00</published><updated>2008-11-26T03:21:04.563-03:00</updated><title type='text'>Instalación de Openbravo 2.40 en Windows XP (SP3)</title><content type='html'>&lt;div style="text-align: justify;"&gt;Me han pedido una guía de instalación sobre Windows XP de Openbravo 2.40. Y aunque no uso ese sistema operativo, lo instalé en una máquina virtual solo para hacer esta entrada.&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;Lo primero es lo primero, algunos se preguntarán qué es&lt;a href="http://www.openbravo.com/"&gt; Openbravo&lt;/a&gt;, Openbravo es un &lt;a href="http://www.blogger.com/es.wikipedia.org/wiki/Planificaci%C3%83%C2%B3n_de_recursos_empresariales"&gt;ERP&lt;/a&gt; (Enterprise Resource Planning) opensource diseñado para las &lt;a href="http://es.wikipedia.org/wiki/PYME"&gt;MIPyME&lt;/a&gt; (micro, pequeña y mediana empresa).&lt;br /&gt;Con esta herramienta de gestión los empresarios pueden controlar los diferentes aspectos de su negocio a través de los módulos que provee.&lt;br /&gt;&lt;br /&gt;Esta herramienta de gestión empresarial está disponible para la descarga gratuita desde el sitio &lt;a href="http://www.openbravo.com/"&gt;web oficial de Openbravo&lt;/a&gt; y NO se requiere el pago de licencias para su uso en ambiente personal ni comercial.&lt;br /&gt;&lt;br /&gt;Openbravo no es un software que se descargue e instale en un par de clicks ... bueno en realidad si pero requiere de algunas dependencias previas y una pequeña configuración del sistema para su instalación y ejecución.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:180%;"&gt;Requerimientos:&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;ul style="text-align: justify;"&gt;&lt;li&gt;&lt;a href="http://www.openbravo.com/"&gt;Openbravo 2.40&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;a href="http://ant.apache.org/"&gt;Apache-ant 1.7.1&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;a href="http://tomcat.apache.org/"&gt;Apache-tomcat 6.0.18&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;a href="http://java.sun.com/javase/downloads/index.jsp"&gt;JDK 1.6 update 10&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.postgresql.com/"&gt;PostgreSQL 8.3.5&lt;/a&gt;.&lt;/li&gt;&lt;/ul&gt;&lt;div style="text-align: justify;"&gt;Bien, para la realización de esta guía se utilizaron la última versión de Openbravo (2.40), Ant (1.7.1), Tomcat (6.0.18) y JDK (1.6.0_10). La versión de PostgreSQL que utilizé es la 8.3.5. Hay que tener en cuenta que Openbravo funciona con PostgreSQL desde la versión &lt;span style="font-weight: bold;"&gt;8.1.4&lt;/span&gt; en adelante.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:180%;"&gt;Instalación de dependencias:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;PostgreSQL.&lt;/span&gt;&lt;br /&gt;Para descargar PostgreSQL vamos &lt;a href="http://www.postgresql.org/download/windows"&gt;acá&lt;/a&gt;. Ahí verán dos opciones, la &lt;span style="font-style: italic;"&gt;One click installer&lt;/span&gt; y &lt;span style="font-style: italic;"&gt;pgInstaller&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_TGgpRudXV3w/SSzaYvcmFMI/AAAAAAAABJc/Lw5Sv5UeV1A/s1600-h/01-descargar-postgresql.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="http://3.bp.blogspot.com/_TGgpRudXV3w/SSzaYvcmFMI/AAAAAAAABJc/Lw5Sv5UeV1A/s320/01-descargar-postgresql.png" alt="" id="BLOGGER_PHOTO_ID_5272829382332126402" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;La primera parece ser la mejor opción, pero no lo es. Al final de la instalación sale un error que no permite iniciar la base de datos así es que recomiendo descargar la segunda opción (pgInstaller).&lt;br /&gt;Luego seleccionamos la version 8.3.5 para win32 y seleccionamos el archivo que se llama&lt;span style="font-style: italic;"&gt; &lt;/span&gt;&lt;a href="http://wwwmaster.postgresql.org/download/mirrors-ftp?file=%2Fbinary%2Fv8.3.5%2Fwin32%2Fpostgresql-8.3.5-1.zip"&gt;postgresql-8.3.5-1.zip&lt;/a&gt; y lo descargamos. Una vez descargado se descomprime, entramos a la carpeta y ejecutamos el instalador (&lt;span style="font-style: italic;"&gt;postgresql-8.3.exe&lt;/span&gt;).&lt;br /&gt;&lt;br /&gt;Aparecerá el wizard de instalación, seleccionamos el idioma (English)&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_TGgpRudXV3w/SSzaY_BDc_I/AAAAAAAABJk/1gMSxstMIMM/s1600-h/02-instalar-01-postgresql.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="http://1.bp.blogspot.com/_TGgpRudXV3w/SSzaY_BDc_I/AAAAAAAABJk/1gMSxstMIMM/s320/02-instalar-01-postgresql.png" alt="" id="BLOGGER_PHOTO_ID_5272829386511578098" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;seleccionamos las opciones de instalación por default&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_TGgpRudXV3w/SSzaZGt1BqI/AAAAAAAABJs/u-iUFN8CW5c/s1600-h/02-instalar-02-postgresql.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="http://4.bp.blogspot.com/_TGgpRudXV3w/SSzaZGt1BqI/AAAAAAAABJs/u-iUFN8CW5c/s320/02-instalar-02-postgresql.png" alt="" id="BLOGGER_PHOTO_ID_5272829388578424482" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;luego ingresamos la contraseña de la cuenta de servicio, luego seleccionamos la localización y DEBEMOS seleccionar UTF8 para el encoding del servidor y el cliente, luego ingresamos la contraseña de administrador del usuario postgres (debe ser distinta a la contraseña de la cuenta servicio)&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_TGgpRudXV3w/SSzaZY_Jd-I/AAAAAAAABJ0/uxwZnHKSLlE/s1600-h/02-instalar-03-postgresql.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="http://1.bp.blogspot.com/_TGgpRudXV3w/SSzaZY_Jd-I/AAAAAAAABJ0/uxwZnHKSLlE/s320/02-instalar-03-postgresql.png" alt="" id="BLOGGER_PHOTO_ID_5272829393482905570" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;y luego hacemos click siguiente siguiente siguiente para terminar con la configuración y la instalación comenzará. Al final desmarcamos la opción de instalar el Stack Builder y finalizamos.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;Tomcat.&lt;/span&gt;&lt;br /&gt;Ahora vamos a descargar la última versión de &lt;a href="http://tomcat.apache.org/"&gt;apache tomcat&lt;/a&gt;. Acá descargamos la versión &lt;a href="http://apache.freeby.pctools.cl/tomcat/tomcat-6/v6.0.18/bin/apache-tomcat-6.0.18.zip"&gt;6.0.18&lt;/a&gt;. Una vez descargado lo descomprimimos y movemos la carpeta a &lt;span style="font-style: italic;"&gt;C:\&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;Ant.&lt;/span&gt;&lt;br /&gt;Ahora vamos a descargar la última versión de &lt;a href="http://ant.apache.org/"&gt;apache ant&lt;/a&gt;. Acá descargamos la versión &lt;a href="http://apache.freeby.pctools.cl/ant/binaries/apache-ant-1.7.1-bin.zip"&gt;1.7.1&lt;/a&gt;. Una vez descargado lo descomprimimos y movemos a &lt;span style="font-style: italic;"&gt;C:\&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_TGgpRudXV3w/SSzdNl9e6xI/AAAAAAAABJ8/hbY0mhgbaYM/s1600-h/03-instalar-tomcat-ant.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="http://3.bp.blogspot.com/_TGgpRudXV3w/SSzdNl9e6xI/AAAAAAAABJ8/hbY0mhgbaYM/s320/03-instalar-tomcat-ant.png" alt="" id="BLOGGER_PHOTO_ID_5272832489342036754" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;JDK.&lt;/span&gt;&lt;br /&gt;Ahora vamos a descargar la última versión del &lt;a href="http://java.sun.com/javase/downloads/?intcmp=1281"&gt;JDK&lt;/a&gt;. Acá descargamos la versión &lt;span style="font-style: italic;"&gt;Java SE Development Kit (JDK) 6 Update 10&lt;/span&gt;. Una vez descargado ejecutamos e instalamos.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:180%;"&gt;Configuración del sistema:&lt;/span&gt;&lt;br /&gt;Una vez todo instalado debemos configurar las variables de entorno. Si no las configuramos no podremos instalar Openbravo.&lt;br /&gt;&lt;blockquote&gt;Mi PC -&gt; Propiedades -&gt; Opciones Avanzadas -&gt; Variables de Entorno&lt;/blockquote&gt;&lt;br /&gt;en Variables de usuario o sistema, click en Nueva:&lt;br /&gt;Nombre de la variable: &lt;span style="font-weight: bold;"&gt;ANT_HOME&lt;/span&gt; Valor de variable: la dirección completa de donde se encuentra la carpeta del Ant (&lt;span style="font-weight: bold;"&gt;C:\apache-ant-1.7.1&lt;/span&gt;)&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_TGgpRudXV3w/SSzf_2FBGxI/AAAAAAAABKE/i2JjbWVYlXA/s1600-h/04-configurar+variables+entorno-01.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="http://3.bp.blogspot.com/_TGgpRudXV3w/SSzf_2FBGxI/AAAAAAAABKE/i2JjbWVYlXA/s320/04-configurar+variables+entorno-01.png" alt="" id="BLOGGER_PHOTO_ID_5272835551685319442" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;en Variables de usuario o sistema, click en Nueva:&lt;br /&gt;Nombre de la variable: &lt;span style="font-weight: bold;"&gt;CATALINA_HOME&lt;/span&gt;&lt;br /&gt;Valor de variable: la dirección completa de donde se encuentra la carpeta del tomcat (&lt;span style="font-weight: bold;"&gt;C:\apache-tomcat-6.0.18&lt;/span&gt;)&lt;br /&gt;&lt;br /&gt;en Variables de usuario o sistema, click en Nueva:&lt;br /&gt;Nombre de la variable: &lt;span style="font-weight: bold;"&gt;JAVA_HOME&lt;/span&gt;&lt;br /&gt;Valor de variable: la dirección completa de donde se encuentra la carpeta del JDK (&lt;span style="font-weight: bold;"&gt;C:\Archivos de programa\Java\jdk1.6.0_10&lt;/span&gt;)&lt;br /&gt;&lt;br /&gt;en Variables de usuario o sistema, click en Nueva:&lt;br /&gt;Nombre de la variable: &lt;span style="font-weight: bold;"&gt;JRE_HOME&lt;/span&gt;&lt;br /&gt;Valor de variable: la dirección completa de donde se encuentra la carpeta del JRE (&lt;span style="font-weight: bold;"&gt;C:\Archivos de programa\Java\jdk1.6.0_10\jre&lt;/span&gt;)&lt;br /&gt;&lt;br /&gt;en Variables de usuario o sistema, click en Nueva:&lt;br /&gt;Nombre de la variable: &lt;span style="font-weight: bold;"&gt;JDK_HOME&lt;/span&gt;&lt;br /&gt;Valor de variable: la dirección completa de donde se encuentra la carpeta del JDK (&lt;span style="font-weight: bold;"&gt;C:\Archivos de programa\Java\jdk1.6.0_10&lt;/span&gt;)&lt;br /&gt;&lt;br /&gt;Luego debemos modificar la variable &lt;span style="font-weight: bold;"&gt;PATH&lt;/span&gt; e incluir al final del valor lo siguiente:&lt;br /&gt;&lt;span style="font-style: italic;"&gt;;%ANT_HOME%\bin;%CATALINA_HOME%\bin;%JAVA_HOME%\bin;%JRE_HOME%\bin;%JDK_HOME%\bin&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_TGgpRudXV3w/SSzgAKbwXcI/AAAAAAAABKM/ctUVw6IsyPw/s1600-h/04-configurar+variables+entorno+-+02.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="http://3.bp.blogspot.com/_TGgpRudXV3w/SSzgAKbwXcI/AAAAAAAABKM/ctUVw6IsyPw/s320/04-configurar+variables+entorno+-+02.png" alt="" id="BLOGGER_PHOTO_ID_5272835557149400514" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Guardamos y reiniciamos.&lt;br /&gt;Ahora las variables están correctamente configuradas y ya podemos instalar Openbravo.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:180%;"&gt;Instalación de Openbravo:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Lo primero es descargarlo, para esto nos dirigimos &lt;a href="http://www.openbravo.com/downloads/index.php?softwaresel=ERP"&gt;acá&lt;/a&gt; y seguimos el wizard. Una vez descargado lo ejecutamos.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Aceptamos la licencia, seleccionamos el directorio de instalación&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_TGgpRudXV3w/SSzh2aC34KI/AAAAAAAABKU/Wwh0JK-R8sY/s1600-h/07-directorio-instalacion-ob.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="http://3.bp.blogspot.com/_TGgpRudXV3w/SSzh2aC34KI/AAAAAAAABKU/Wwh0JK-R8sY/s320/07-directorio-instalacion-ob.png" alt="" id="BLOGGER_PHOTO_ID_5272837588564566178" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;seleccionamos el directorio de los attachments&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_TGgpRudXV3w/SSzh2neK4BI/AAAAAAAABKc/ZJE7SV4-OQg/s1600-h/08-directorio-instalacion-attachments-ob.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="http://3.bp.blogspot.com/_TGgpRudXV3w/SSzh2neK4BI/AAAAAAAABKc/ZJE7SV4-OQg/s320/08-directorio-instalacion-attachments-ob.png" alt="" id="BLOGGER_PHOTO_ID_5272837592168718354" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;seleccionamos la instalación completa&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_TGgpRudXV3w/SSzh3EVh3mI/AAAAAAAABKk/X72L7zD2VgU/s1600-h/09-instalacion-completa.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="http://4.bp.blogspot.com/_TGgpRudXV3w/SSzh3EVh3mI/AAAAAAAABKk/X72L7zD2VgU/s320/09-instalacion-completa.png" alt="" id="BLOGGER_PHOTO_ID_5272837599917104738" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;luego la instalación estándar&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_TGgpRudXV3w/SSzh3RiS8WI/AAAAAAAABKs/XDA75MrYbCo/s1600-h/10-instalacion-estandar.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="http://2.bp.blogspot.com/_TGgpRudXV3w/SSzh3RiS8WI/AAAAAAAABKs/XDA75MrYbCo/s320/10-instalacion-estandar.png" alt="" id="BLOGGER_PHOTO_ID_5272837603460313442" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;luego seleccionamos el directorio con los ejecutables de java&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_TGgpRudXV3w/SSzh3gXcGHI/AAAAAAAABK0/vwFGv35F-cc/s1600-h/11-jdk.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="http://1.bp.blogspot.com/_TGgpRudXV3w/SSzh3gXcGHI/AAAAAAAABK0/vwFGv35F-cc/s320/11-jdk.png" alt="" id="BLOGGER_PHOTO_ID_5272837607441307762" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;ant&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_TGgpRudXV3w/SSzjur_H15I/AAAAAAAABK8/0yVr-kXLnss/s1600-h/12-ant.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="http://4.bp.blogspot.com/_TGgpRudXV3w/SSzjur_H15I/AAAAAAAABK8/0yVr-kXLnss/s320/12-ant.png" alt="" id="BLOGGER_PHOTO_ID_5272839654964975506" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;y tomcat.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_TGgpRudXV3w/SSzjvH5ni0I/AAAAAAAABLE/A7RJWwbwtVs/s1600-h/13-tomcat.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="http://2.bp.blogspot.com/_TGgpRudXV3w/SSzjvH5ni0I/AAAAAAAABLE/A7RJWwbwtVs/s320/13-tomcat.png" alt="" id="BLOGGER_PHOTO_ID_5272839662458080066" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Como configuramos las variables aparecerán automáticamente. Luego seleccionamos la base de datos PostgreSQL&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_TGgpRudXV3w/SSzjva_5tXI/AAAAAAAABLM/404y8FV5hlw/s1600-h/14-postgresql.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="http://1.bp.blogspot.com/_TGgpRudXV3w/SSzjva_5tXI/AAAAAAAABLM/404y8FV5hlw/s320/14-postgresql.png" alt="" id="BLOGGER_PHOTO_ID_5272839667584710002" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;luego aparecerá automáticamente el directorio de los ejecutables de PostgreSQL (al instalarlo se configuraron las variables de entorno de PostgreSQL).&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_TGgpRudXV3w/SSzjvwdKKDI/AAAAAAAABLU/ueoTBnsq9LQ/s1600-h/15-postgresql-bin.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="http://4.bp.blogspot.com/_TGgpRudXV3w/SSzjvwdKKDI/AAAAAAAABLU/ueoTBnsq9LQ/s320/15-postgresql-bin.png" alt="" id="BLOGGER_PHOTO_ID_5272839673344567346" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Luego ingresamos el host y el puerto de la base de datos&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_TGgpRudXV3w/SSzjwc8AGEI/AAAAAAAABLc/FrrILkwWugg/s1600-h/16-parametros-servidor-bd.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="http://4.bp.blogspot.com/_TGgpRudXV3w/SSzjwc8AGEI/AAAAAAAABLc/FrrILkwWugg/s320/16-parametros-servidor-bd.png" alt="" id="BLOGGER_PHOTO_ID_5272839685285091394" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;luego ingresamos la contraseña del usuario postgres&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_TGgpRudXV3w/SSzlGXC6-FI/AAAAAAAABLk/I029aD9bOXw/s1600-h/17-contrasena-postgres.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="http://2.bp.blogspot.com/_TGgpRudXV3w/SSzlGXC6-FI/AAAAAAAABLk/I029aD9bOXw/s320/17-contrasena-postgres.png" alt="" id="BLOGGER_PHOTO_ID_5272841161172252754" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;luego ingresamos el nombre de la base de datos, el usuario y su contraseña&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_TGgpRudXV3w/SSzlG9824VI/AAAAAAAABLs/JN1TT1bpL4U/s1600-h/18-parametros-ob.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="http://4.bp.blogspot.com/_TGgpRudXV3w/SSzlG9824VI/AAAAAAAABLs/JN1TT1bpL4U/s320/18-parametros-ob.png" alt="" id="BLOGGER_PHOTO_ID_5272841171615801682" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Luego ingresamos el nombre del contexto de la aplicación&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_TGgpRudXV3w/SSzlHMhLSUI/AAAAAAAABL0/68S705Hlczw/s1600-h/19-nombre-contexto.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="http://2.bp.blogspot.com/_TGgpRudXV3w/SSzlHMhLSUI/AAAAAAAABL0/68S705Hlczw/s320/19-nombre-contexto.png" alt="" id="BLOGGER_PHOTO_ID_5272841175526230338" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;luego seleccionamos el formato de la fecha que queremos usar en el sistema&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_TGgpRudXV3w/SSzlHr7RX1I/AAAAAAAABL8/3pufPCLzvXg/s1600-h/20-formato-fecha.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="http://2.bp.blogspot.com/_TGgpRudXV3w/SSzlHr7RX1I/AAAAAAAABL8/3pufPCLzvXg/s320/20-formato-fecha.png" alt="" id="BLOGGER_PHOTO_ID_5272841183957180242" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;luego seleccionamos si queremos que se llene la base de datos con datos ficticios (la empresa Big Bazar).&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_TGgpRudXV3w/SSzlINj8cUI/AAAAAAAABME/ABz7W1hFfB8/s1600-h/21-datos-demo.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="http://3.bp.blogspot.com/_TGgpRudXV3w/SSzlINj8cUI/AAAAAAAABME/ABz7W1hFfB8/s320/21-datos-demo.png" alt="" id="BLOGGER_PHOTO_ID_5272841192986145090" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Una vez listo comienza la instalación.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_TGgpRudXV3w/SSzmQup9SXI/AAAAAAAABMM/jsgl4_FrKEE/s1600-h/22-instalacion.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="http://2.bp.blogspot.com/_TGgpRudXV3w/SSzmQup9SXI/AAAAAAAABMM/jsgl4_FrKEE/s320/22-instalacion.png" alt="" id="BLOGGER_PHOTO_ID_5272842438820317554" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;La instalación demora mas o menos una hora, dependiendo del equipo y sus recursos.&lt;br /&gt;Una vez finalizado estamos listos.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_TGgpRudXV3w/SSzmQ7vU0oI/AAAAAAAABMU/h7YqFiL6XMg/s1600-h/23-finalizado.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="http://2.bp.blogspot.com/_TGgpRudXV3w/SSzmQ7vU0oI/AAAAAAAABMU/h7YqFiL6XMg/s320/23-finalizado.png" alt="" id="BLOGGER_PHOTO_ID_5272842442332492418" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Ahora para iniciar openbravo debemos tener iniciado PostgreSQL y Tomcat.&lt;br /&gt;Para iniciar postgreSQL vamos a &lt;span style="font-style: italic;"&gt;Menú inicio -&gt; Todos los programas -&gt; Postgresql 8.3 -&gt; start service&lt;/span&gt;&lt;br /&gt;Para iniciar Tomcat vamos a &lt;span style="font-style: italic;"&gt;C:\apache-tomcat-6.0.18\bin y ejecutamos el archivo startup.bat&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Luego abrimos en nuestro navegador favorito la siguiente URL: &lt;span style="font-style: italic;"&gt;http://localhost:8080/openbravo&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Ingresamos el nombre de usuario &lt;span style="font-style: italic;"&gt;Openbravo&lt;/span&gt; y la contraseña &lt;span style="font-style: italic;"&gt;openbravo&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_TGgpRudXV3w/SSzqjJbIV-I/AAAAAAAABMc/EQxWjtc4Vqs/s1600-h/24-login.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="http://3.bp.blogspot.com/_TGgpRudXV3w/SSzqjJbIV-I/AAAAAAAABMc/EQxWjtc4Vqs/s320/24-login.png" alt="" id="BLOGGER_PHOTO_ID_5272847153290041314" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;y ya estamos dentro del sistema.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_TGgpRudXV3w/SSzqjZMu7CI/AAAAAAAABMk/KcTV5lXcS4c/s1600-h/25-entrada.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="http://2.bp.blogspot.com/_TGgpRudXV3w/SSzqjZMu7CI/AAAAAAAABMk/KcTV5lXcS4c/s320/25-entrada.png" alt="" id="BLOGGER_PHOTO_ID_5272847157524622370" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;No hay nada mejor que tener tu propio ERP.&lt;br /&gt;&lt;br /&gt;Espero les haya servido esta humilde guía de instalción.&lt;br /&gt;&lt;br /&gt;saludos !!!&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1421033339681316542-5384252985823440677?l=metalklesk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://metalklesk.blogspot.com/feeds/5384252985823440677/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://metalklesk.blogspot.com/2008/11/instalacin-de-openbravo-240-en-windows.html#comment-form' title='61 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1421033339681316542/posts/default/5384252985823440677'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1421033339681316542/posts/default/5384252985823440677'/><link rel='alternate' type='text/html' href='http://metalklesk.blogspot.com/2008/11/instalacin-de-openbravo-240-en-windows.html' title='Instalación de Openbravo 2.40 en Windows XP (SP3)'/><author><name>Daniel Dario Morales Salas</name><uri>http://www.blogger.com/profile/07642586501018157497</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='28' src='http://3.bp.blogspot.com/_TGgpRudXV3w/SfP_sc5YZ3I/AAAAAAAABSs/APK4YFwjVn4/S220/yoft3.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_TGgpRudXV3w/SSzaYvcmFMI/AAAAAAAABJc/Lw5Sv5UeV1A/s72-c/01-descargar-postgresql.png' height='72' width='72'/><thr:total>61</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1421033339681316542.post-6652638401359325053</id><published>2008-11-19T01:34:00.006-03:00</published><updated>2008-11-19T02:22:02.675-03:00</updated><title type='text'>No Cache, No Store, Internet Explorer en problemas !!!</title><content type='html'>Hace meses estoy desarrollando un sistema de administración de prácticas profesionales para la Escuela de Ingeniería Civil de la Universidad Andrés Bello (en Chile).&lt;br /&gt;&lt;br /&gt;Resulta que lo estoy desarrollando en Java utilizando el IDE NetBeans 6.5 (partí usando el 6.0, luego el 6.1), uso JSP, Servlets, AJAX (con JMAKI), CSS2, una biblioteca para PDF llamada iText, para el almacenamiento de datos utilizo MySQL (5.0.67) y el servidor de aplicaciones es, por supuesto, Glassfish V2 UR2.&lt;br /&gt;&lt;br /&gt;El sistema funciona correctamente corriendo en Windows o Linux. Yo utilizo Firefox y firebug no me ha encontrado ningún error en ninguna parte del sistema. El problema lo tuve al querer acceder al sistema utilizando el "navegador web" Internet Explorer (6.0, 7.0, 8.0Beta2, sobre Windows XP SP1, SP2 y SP3). Siempre que quería acceder me salia el siguiente error:&lt;br /&gt;&lt;blockquote&gt;Internet Explorer cannot download index.jsp from localhost&lt;br /&gt;Internet Explorer was not able to open this Internet site. The requested site is either unavailable or cannot be found.&lt;br /&gt;Please try again later.&lt;/blockquote&gt;Aquí una imagen mostrando la pantalla de error en Windows XP SP3:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_TGgpRudXV3w/SSOgbcx82RI/AAAAAAAABJU/XPHiGaw4hGs/s1600-h/ie-sucks.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="http://3.bp.blogspot.com/_TGgpRudXV3w/SSOgbcx82RI/AAAAAAAABJU/XPHiGaw4hGs/s320/ie-sucks.png" alt="" id="BLOGGER_PHOTO_ID_5270232382396225810" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Esto me ha traido dolores de cabeza por bastante tiempo, busqué y busqué en Internet sin respuestas satisfactorias. De pronto llegué a una &lt;a href="http://support.microsoft.com/kb/812935"&gt;página de Microsoft&lt;/a&gt; donde sale el problema de "Internet explorer cannot download". Ahí sale que ese error ocurre cuando la URL es segura (HTTPS) (NO es mi caso).&lt;br /&gt;&lt;br /&gt;Entre las causas del error sale el uso de las cabeceras &lt;span style="font-style: italic;"&gt;"no-cache"&lt;/span&gt; y &lt;span style="font-style: italic;"&gt;"no-store"&lt;/span&gt;. Precisamente en mi sistema utilizo esas cabeceras en todos los JSP por seguridad y consistencia. En esa misma página se reconoce que el problema es de los productos Microsoft (para variar ...... ¬¬), en Internet Explorer 6.0 SP1. Aprovecho para comunicar a la gente de Microsoft que aún no solucionan el problema en todas las versiones posteriores a la 6.0 SP1.&lt;br /&gt;&lt;br /&gt;Lo mas ridículo de todo lo que sale en esa página de Microsoft es el &lt;span style="font-style: italic;"&gt;WORKAROUND&lt;/span&gt;:&lt;br /&gt;&lt;blockquote&gt;To work around this problem, make sure that &lt;strong class="uiterm"&gt;Do Not Save Encrypted Files&lt;/strong&gt; check box is not checked and that the server does not send the "Cache-Control: No Store" or the "Cache-Control: No Cache" header.&lt;/blockquote&gt;&lt;br /&gt;Y en español dice:&lt;br /&gt;&lt;blockquote&gt;Para solucionar este problema, asegúrese que la opción &lt;span style="font-weight: bold;"&gt;No Guardar Archivos Encriptados&lt;/span&gt; no esté marcada y que el servidor no envíe la cabecera "Cache-Control: No Store" o la "Cache-Control: No Cache".&lt;/blockquote&gt;Inteligente la solución ¬¬, si usted es un usuario, como puede hacer que el servidor no envíe esas cabeceras ?? si usted es desarrollador de software y realmente necesita que no se almacenen los datos en el cache del navegador, va a permitir que Microsoft le de una respuesta tan absurda ??&lt;br /&gt;&lt;br /&gt;Bueno, ese es el problema. La solución no era tan complicada, tediosa si. Se debe agregar a TODOS los JSP las siguientes líneas (se agregan al principio, fuera de la etiqueta &amp;lt;html&amp;gt;):&lt;br /&gt;&lt;blockquote&gt;response.setHeader("Cache-Control","no-cache");&lt;br /&gt;response.setHeader("Cache-Control","no-store");&lt;br /&gt;response.setHeader("Cache-Control","must-revalidate");&lt;br /&gt;response.setHeader("Pragma","no-cache");&lt;br /&gt;response.setDateHeader ("Expires", 0);&lt;/blockquote&gt;Para que la solución quede mas elegante se puede crear un fragmento de JSP, un archivo JSPF e insertar esas lineas ahí y luego en los JSP agregar un include que apunte al fragmento, así:&lt;br /&gt;&lt;blockquote&gt;&amp;lt;jsp:directive.include file="../WEB-INF/jspf/NoCache.jspf"&amp;gt;&lt;/blockquote&gt;&lt;br /&gt;Ya con eso el problema está solucionado, ahora el sistema funciona en Firefox e Internet Explorer.&lt;br /&gt;&lt;br /&gt;Desgraciadamente aún hay que hacer excepciones para el navegador mas usado, pues no sigue estándares y lo que hace lo hace casi siempre mal, esta es solo una de las cosas que tuve que realizar para que el sistema funcionara con Internet Explorer, también tuve que hacerlo al crear archivos PDF para que el IE los pudiera descargar, entre otras cosas.&lt;br /&gt;&lt;br /&gt;Ya saben, si les ocurre este problema ya tienen una solución.&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/1421033339681316542-6652638401359325053?l=metalklesk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://metalklesk.blogspot.com/feeds/6652638401359325053/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://metalklesk.blogspot.com/2008/11/no-cache-no-store-internet-explorer-en.html#comment-form' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1421033339681316542/posts/default/6652638401359325053'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1421033339681316542/posts/default/6652638401359325053'/><link rel='alternate' type='text/html' href='http://metalklesk.blogspot.com/2008/11/no-cache-no-store-internet-explorer-en.html' title='No Cache, No Store, Internet Explorer en problemas !!!'/><author><name>Daniel Dario Morales Salas</name><uri>http://www.blogger.com/profile/07642586501018157497</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='28' src='http://3.bp.blogspot.com/_TGgpRudXV3w/SfP_sc5YZ3I/AAAAAAAABSs/APK4YFwjVn4/S220/yoft3.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_TGgpRudXV3w/SSOgbcx82RI/AAAAAAAABJU/XPHiGaw4hGs/s72-c/ie-sucks.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1421033339681316542.post-144910167866030446</id><published>2008-10-30T01:54:00.009-03:00</published><updated>2008-10-30T15:55:22.671-03:00</updated><title type='text'>Agregar regiones de los países en Openbravo 2.40</title><content type='html'>&lt;div style="text-align: justify;"&gt;Ayer en la tarde visité el &lt;a href="https://sourceforge.net/forum/?group_id=162271"&gt;foro&lt;/a&gt; de Openbravo y me dirigí a &lt;a href="https://sourceforge.net/forum/forum.php?forum_id=744878"&gt;Openbravo Chile&lt;/a&gt;. Me fijé en un post que decía que al crear una nueva entidad, seleccionar Chile, en el combobox &lt;span style="font-style: italic;"&gt;Regiones&lt;/span&gt; no aparece ninguna región. Esto me hizo ir a ver de inmediato para corroborar dicha información y efectivamente es así. Averiguando un poco, las regiones ingresadas solo corresponden a Estados Unidos de Norteamérica, España y otros.&lt;br /&gt;&lt;br /&gt;Esta situación por supuesto es crítica, las regiones de nuestros países deberían estar en el sistema.&lt;br /&gt;Mirando los archivos XML de traducción (el mismo que yo traduje) encontré que en el archivo &lt;span style="font-style: italic;"&gt;C_COUNTRY_TRL_es_CL(ES, AR, etc)&lt;/span&gt; existe la lista de países ingresados en el sistema y cada país tiene una identificación asociada (un id). En el caso de Chile corresponde al número &lt;span style="font-style: italic;"&gt;152&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Luego de buscar regiones en los XML me di cuenta que no existe ninguna, entonces fui a ver la base de datos utilizando &lt;span style="font-style: italic;"&gt;phpPgAdmin&lt;/span&gt; y mirando las tablas encontré una que se llama &lt;span style="font-style: italic;"&gt;c_region&lt;/span&gt; y ahí encontré las regiones ingresadas en el sistema (EEUU, España, otros).&lt;br /&gt;&lt;br /&gt;Entonces la solución mas clara era ingresar las regiones una a una directamente en la base de datos, lo hice, luego fuí a crear una nueva entidad en Openbravo y al seleccionar Chile ahora si aparecen las regiones correctamente.&lt;br /&gt;&lt;br /&gt;Entonces ahora les voy a dar la receta mas simple para agregar las regiones de su país en Openbravo.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;Requisitos&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://metalklesk.blogspot.com/2008/10/instalacin-de-openbravo-240-en-opensuse.html"&gt;Openbravo instalado y funcionando&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;a href="http://metalklesk.blogspot.com/2008/10/traduccin-de-openbravo-240-al-espaol-en.html"&gt;Traducción al idioma  que les corresponda según su país&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;Instalar phpPgAdmin&lt;/li&gt;&lt;/ul&gt;Para instalar phpPgAdmin simplemente abrimos &lt;span style="font-style: italic;"&gt;YaST -&gt; Software -&gt; Instalar/Desinstalar software&lt;/span&gt; y en el buscador ingresamos &lt;span style="font-style: italic;"&gt;"phpPgAdmin"&lt;/span&gt; (sin las comillas), le damos click al botón &lt;span style="font-style: italic;"&gt;buscar&lt;/span&gt;, seleccionamos el paquete y presionamos finalizar. Automáticamente se seleccionaran las dependencias necesarias.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_TGgpRudXV3w/SQlDBLTSwOI/AAAAAAAAA08/fAsURvSUc4A/s1600-h/imagen1.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="http://2.bp.blogspot.com/_TGgpRudXV3w/SQlDBLTSwOI/AAAAAAAAA08/fAsURvSUc4A/s320/imagen1.png" alt="" id="BLOGGER_PHOTO_ID_5262811327051776226" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Una vez listo debemos iniciar la base de datos, para esto simplemente ejecutamos en consola el siguiente comando:&lt;br /&gt;&lt;blockquote&gt;service postgresql start&lt;/blockquote&gt;&lt;br /&gt;y luego levantamos el servidor web Apache con el siguiente comando:&lt;br /&gt;&lt;blockquote&gt;service apache2 start&lt;/blockquote&gt;&lt;br /&gt;Ahora abrimos un navegador web y escribimos la siguiente dirección:&lt;br /&gt;&lt;blockquote&gt;http://localhost/phpPgAdmin&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_TGgpRudXV3w/SQlE_AoBbGI/AAAAAAAAA1E/5uAgUap7RWs/s1600-h/imagen2.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="http://1.bp.blogspot.com/_TGgpRudXV3w/SQlE_AoBbGI/AAAAAAAAA1E/5uAgUap7RWs/s320/imagen2.png" alt="" id="BLOGGER_PHOTO_ID_5262813488849448034" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Ingresamos el nombre de usuario y contraseña de administrador de PostgreSQL:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_TGgpRudXV3w/SQlE_K0qHuI/AAAAAAAAA1M/OhCT_VIlqkI/s1600-h/imagen3.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="http://2.bp.blogspot.com/_TGgpRudXV3w/SQlE_K0qHuI/AAAAAAAAA1M/OhCT_VIlqkI/s320/imagen3.png" alt="" id="BLOGGER_PHOTO_ID_5262813491586801378" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Veremos la base de datos Openbravo:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_TGgpRudXV3w/SQlE_ZyPxEI/AAAAAAAAA1U/B8MqBSbZbxo/s1600-h/imagen4.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="http://4.bp.blogspot.com/_TGgpRudXV3w/SQlE_ZyPxEI/AAAAAAAAA1U/B8MqBSbZbxo/s320/imagen4.png" alt="" id="BLOGGER_PHOTO_ID_5262813495603217474" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Pinchamos la base de datos en el arbol de la izquierda -&gt; Esquemas -&gt; Tablas y buscamos &lt;span style="font-style: italic;"&gt;c_region&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_TGgpRudXV3w/SQlFAKRF_aI/AAAAAAAAA1c/UhndFfYerqU/s1600-h/imagen5.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="http://1.bp.blogspot.com/_TGgpRudXV3w/SQlFAKRF_aI/AAAAAAAAA1c/UhndFfYerqU/s320/imagen5.png" alt="" id="BLOGGER_PHOTO_ID_5262813508617502114" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;pinchamos la tabla y podremos ver los campos que contiene. Abajo veremos varios botones con acciones sobre la tabla, una de ellas es Insertar fila:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_TGgpRudXV3w/SQlFAOh-iyI/AAAAAAAAA1k/XWZogxK4jM8/s1600-h/imagen6.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="http://2.bp.blogspot.com/_TGgpRudXV3w/SQlFAOh-iyI/AAAAAAAAA1k/XWZogxK4jM8/s320/imagen6.png" alt="" id="BLOGGER_PHOTO_ID_5262813509762059042" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Pinchamos &lt;span style="font-style: italic;"&gt;Insertar fila&lt;/span&gt; y podrémos ingresar la región. Lo primero que debemos ingresar es el id de la fila (c_region_id). Si no hemos ingresado regiones mas que las que vienen por default entonces podemos comenzar desde el valor &lt;span style="font-weight: bold;"&gt;397&lt;/span&gt; en adelante. Luego debemos ingresar el valor &lt;span style="font-weight: bold;"&gt;0&lt;/span&gt; en los siguientes campos:&lt;br /&gt;&lt;/div&gt;&lt;ul style="text-align: justify;"&gt;&lt;li&gt;ad_client_id&lt;/li&gt;&lt;li&gt;ad_org_id&lt;/li&gt;&lt;li&gt;createdby&lt;/li&gt;&lt;li&gt;updatedby&lt;/li&gt;&lt;/ul&gt;&lt;div style="text-align: justify;"&gt;Luego en el campo &lt;span style="font-weight: bold;"&gt;name&lt;/span&gt; ingresamos el nombre de la región (es el que se verá al seleccionar una región desde Openbravo), en el campo &lt;span style="font-weight: bold;"&gt;description&lt;/span&gt; ingresamos la descripción, en el campo &lt;span style="font-weight: bold;"&gt;c_country_id&lt;/span&gt; ingresamos el id del país en cuestión (&lt;span style="font-weight: bold;"&gt;152&lt;/span&gt; en el caso de Chile), luego marcamos como &lt;span style="font-weight: bold;"&gt;nulo&lt;/span&gt; los siguientes dos campos:&lt;br /&gt;&lt;/div&gt;&lt;ul style="text-align: justify;"&gt;&lt;li&gt;c_nation_id&lt;/li&gt;&lt;li&gt;value&lt;/li&gt;&lt;/ul&gt;&lt;div style="text-align: justify;"&gt;Ahora pinchamos &lt;span style="font-style: italic;"&gt;Insertar y repite&lt;/span&gt;, con eso se insertará la fila y luego podremos insertar otra mas.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_TGgpRudXV3w/SQlHWalfkZI/AAAAAAAAA1s/AG87OFVVfAA/s1600-h/imagen7.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="http://4.bp.blogspot.com/_TGgpRudXV3w/SQlHWalfkZI/AAAAAAAAA1s/AG87OFVVfAA/s320/imagen7.png" alt="" id="BLOGGER_PHOTO_ID_5262816089978409362" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Ya con eso las regiones que faltaban estarán disponibles en Openbravo. Al crear una entidad lo podrán corroborar seleccionando el país en cuestión y verán como aparecen las regiones ingresadas en el combobox Regiones automágicamente.&lt;br /&gt;&lt;br /&gt;Para quienes son de Chile, o quieren agregar las regiones de Chile, pueden hacer un &lt;span style="font-style: italic;"&gt;copy paste&lt;/span&gt; de los siguientes comandos SQL directamente en phpPgAdmin (basta haber seleccionado la base de datos, no necesariamente la tabla &lt;span style="font-style: italic;"&gt;c_region&lt;/span&gt;) presionando el botón SQL que aparece en la parte superior de la pantalla:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;INSERT INTO c_region VALUES (397, 0, 0, 'Y', '2008-10-29 16:00:33.481254', 0, '2008-10-29 16:00:33.481254', 0, 'I - Región de Tarapacá', 'Primera región de tarapacá', 152, 'N', NULL, NULL);&lt;br /&gt;INSERT INTO c_region VALUES (398, 0, 0, 'Y', '2008-10-29 16:05:51.213678', 0, '2008-10-29 16:05:51.213678', 0, 'II - Región de Antofagasta', 'Segunda Región de Antofagasta', 152, 'N', NULL, NULL);&lt;br /&gt;INSERT INTO c_region VALUES (399, 0, 0, 'Y', '2008-10-29 16:06:42.300665', 0, '2008-10-29 16:06:42.300665', 0, 'III - Región de Atacama', 'Tercera región de Atacama', 152, 'N', NULL, NULL);&lt;br /&gt;INSERT INTO c_region VALUES (400, 0, 0, 'Y', '2008-10-29 16:07:26.192938', 0, '2008-10-29 16:07:26.192938', 0, 'IV - Región de Coquimbo', 'Cuarta región de Coquimbo', 152, 'N', NULL, NULL);&lt;br /&gt;INSERT INTO c_region VALUES (401, 0, 0, 'Y', '2008-10-29 16:08:26.366667', 0, '2008-10-29 16:08:26.366667', 0, 'V - Región de Valparaiso', 'Quinta región de Valparaiso', 152, 'N', NULL, NULL);&lt;br /&gt;INSERT INTO c_region VALUES (402, 0, 0, 'Y', '2008-10-29 16:09:26.98355', 0, '2008-10-29 16:09:26.98355', 0, 'VI - Región del Libertador Bernardo O''Higgins', 'Sexta región del Libertador Bernardo O''Higgins', 150, 'N', NULL, NULL);&lt;br /&gt;INSERT INTO c_region VALUES (403, 0, 0, 'Y', '2008-10-29 16:10:12.678488', 0, '2008-10-29 16:10:12.678488', 0, 'VII - Región del Maule', 'Séptima región del Maule', 152, 'N', NULL, NULL);&lt;br /&gt;INSERT INTO c_region VALUES (404, 0, 0, 'Y', '2008-10-29 16:11:13.189255', 0, '2008-10-29 16:11:13.189255', 0, 'VIII - Región del Bío Bío', 'Octava región del Bío Bío', 152, 'N', NULL, NULL);&lt;br /&gt;INSERT INTO c_region VALUES (405, 0, 0, 'Y', '2008-10-29 16:11:48.480753', 0, '2008-10-29 16:11:48.480753', 0, 'IX - Región de la Araucanía', 'Novena región de la Araucanía', 152, 'N', NULL, NULL);&lt;br /&gt;INSERT INTO c_region VALUES (406, 0, 0, 'Y', '2008-10-29 16:12:29.5917', 0, '2008-10-29 16:12:29.5917', 0, 'X - Región de los Lagos', 'Décima región de los Lagos', 152, 'N', NULL, NULL);&lt;br /&gt;INSERT INTO c_region VALUES (407, 0, 0, 'Y', '2008-10-29 16:13:51.964043', 0, '2008-10-29 16:13:51.964043', 0, 'XI - Región de Aysén del General Carlos Ibañez del Campo', 'Undécima región de Aysén del General Carlos Ibañez del Campo', 152, 'N', NULL, NULL);&lt;br /&gt;INSERT INTO c_region VALUES (408, 0, 0, 'Y', '2008-10-29 16:15:16.75494', 0, '2008-10-29 16:15:16.75494', 0, 'XII - Región de Magallanes y la Antártica Chilena', 'Duodécima región de Magallanes y la Antártica Chilena', 152, 'N', NULL, NULL);&lt;br /&gt;INSERT INTO c_region VALUES (409, 0, 0, 'Y', '2008-10-29 16:16:20.543819', 0, '2008-10-29 16:16:20.543819', 0, 'Región Metropolitana', 'Región Metropolitana', 152, 'N', NULL, NULL);&lt;br /&gt;INSERT INTO c_region VALUES (410, 0, 0, 'Y', '2008-10-29 16:17:08.731486', 0, '2008-10-29 16:17:08.731486', 0, 'XIV - Región de los Ríos', 'Décimo cuarta región de los Ríos', 152, 'N', NULL, NULL);&lt;br /&gt;INSERT INTO c_region VALUES (411, 0, 0, 'Y', '2008-10-29 16:18:04.28971', 0, '2008-10-29 16:18:04.28971', 0, 'XV - Región de Arica y Parinacota', 'Décimo quinta región de Arica y Parinacota', 152, 'N', NULL, NULL);&lt;/blockquote&gt;&lt;br /&gt;O si quieren pueden importar &lt;a href="http://ifile.it/73fk12i"&gt;éste script sql&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Espero les sea de utilidad.&lt;br /&gt;&lt;br /&gt;Saludos !!!&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1421033339681316542-144910167866030446?l=metalklesk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://metalklesk.blogspot.com/feeds/144910167866030446/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://metalklesk.blogspot.com/2008/10/agregar-regiones-de-los-pases-en.html#comment-form' title='3 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1421033339681316542/posts/default/144910167866030446'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1421033339681316542/posts/default/144910167866030446'/><link rel='alternate' type='text/html' href='http://metalklesk.blogspot.com/2008/10/agregar-regiones-de-los-pases-en.html' title='Agregar regiones de los países en Openbravo 2.40'/><author><name>Daniel Dario Morales Salas</name><uri>http://www.blogger.com/profile/07642586501018157497</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='28' src='http://3.bp.blogspot.com/_TGgpRudXV3w/SfP_sc5YZ3I/AAAAAAAABSs/APK4YFwjVn4/S220/yoft3.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_TGgpRudXV3w/SQlDBLTSwOI/AAAAAAAAA08/fAsURvSUc4A/s72-c/imagen1.png' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1421033339681316542.post-8080127584662175897</id><published>2008-10-29T01:01:00.012-03:00</published><updated>2008-10-29T02:24:34.307-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Opensource'/><category scheme='http://www.blogger.com/atom/ns#' term='Ant'/><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='OpenSUSE'/><category scheme='http://www.blogger.com/atom/ns#' term='Openbravo'/><category scheme='http://www.blogger.com/atom/ns#' term='Tomcat'/><title type='text'>Traducción de Openbravo 2.40 al español en OpenSUSE 11.0</title><content type='html'>&lt;div style="text-align: justify;"&gt;&lt;div style="text-align: justify;"&gt;Hace unos días comencé la traducción de &lt;a href="http://www.openbravo.org/"&gt;Openbravo&lt;/a&gt; al español de Chile, mi país.&lt;br /&gt;Me basé en la traducción de España, de la cual solo nos diferenciamos en algunas palabras mas que en conceptos. Sin embargo me encontré con un montón de faltas ortográficas y traducciones mal hechas (desde el inglés), así es que por eso me tomó mas tiempo el lograr la versión Chilena.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Es probable que se me hayan pasado algunos errores ortográficos de la versión española, pero me fijé lo mas que pude (son miles y miles de líneas de texto en 27 archivos XML, 8.5 MB de puro texto, si, es bastante texto por revisar).&lt;br /&gt;&lt;br /&gt;La lista de palabras traducidas es la siguiente:&lt;br /&gt;&lt;blockquote&gt;&lt;span style="font-weight: bold;"&gt;Albarán&lt;/span&gt; -&gt; &lt;span style="font-weight: bold;"&gt;Guía de despacho&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;albarán&lt;/span&gt; -&gt; &lt;span style="font-weight: bold;"&gt;guía de despacho&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Albaranes&lt;/span&gt; -&gt; &lt;span style="font-weight: bold;"&gt;Guías de despacho&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;albaranes&lt;/span&gt; -&gt; &lt;span style="font-weight: bold;"&gt;guías de despacho&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Almacén&lt;/span&gt; -&gt; &lt;span style="font-weight: bold;"&gt;Bodega&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;almacén&lt;/span&gt; -&gt; &lt;span style="font-weight: bold;"&gt;bodega&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Almacenes&lt;/span&gt; -&gt; &lt;span style="font-weight: bold;"&gt;Bodegas&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;almacenes&lt;/span&gt; -&gt; &lt;span style="font-weight: bold;"&gt;bodegas&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Solapa&lt;/span&gt; -&gt; &lt;span style="font-weight: bold;"&gt;Pestaña&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;solapa&lt;/span&gt; -&gt; &lt;span style="font-weight: bold;"&gt;pestaña&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Solapas&lt;/span&gt; -&gt; &lt;span style="font-weight: bold;"&gt;Pestañas&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;solapas&lt;/span&gt; -&gt; &lt;span style="font-weight: bold;"&gt;pestañas&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;CIF&lt;/span&gt; -&gt; &lt;span style="font-weight: bold;"&gt;RUT&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;NIF&lt;/span&gt; -&gt; &lt;span style="font-weight: bold;"&gt;RUT&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;CIF/NIF&lt;/span&gt; -&gt; &lt;span style="font-weight: bold;"&gt;RUT&lt;/span&gt;&lt;/blockquote&gt;Tuve que tener especial cuidado en los singulares y plurales, así como el femenino y masculino, por ejemplo:&lt;br /&gt;&lt;blockquote&gt;Los albaranes -&gt; Las guías de despacho&lt;br /&gt;El almacén -&gt; La bodega&lt;br /&gt;los albaranes -&gt; las guías de despacho&lt;br /&gt;etc.&lt;/blockquote&gt;&lt;br /&gt;En el sitio de Openbravo, en la wiki, dice que como recomendación era mejor usar solapa en vez de pestaña, pero en Chile no usamos esa palabra, usamos pestaña, es por eso que en la traducción utilicé esta última. Las demás palabras son las mismas que usamos en Chile. &lt;a href="http://ifile.it/t6l2mq5"&gt;Acá&lt;/a&gt; pueden descargar la traducción al español de Chile (es_CL) y &lt;a href="https://sourceforge.net/project/showfiles.php?group_id=162271&amp;amp;package_id=254938"&gt;acá&lt;/a&gt; pueden descargar la versión de España (es_ES) y Argentina (es_AR).&lt;br /&gt;&lt;br /&gt;Ahora comenzaré con la explicación de los pasos para traducir Openbravo al idioma Español.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;Requisitos:&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;ul style="text-align: justify;"&gt;&lt;li&gt;&lt;a href="http://metalklesk.blogspot.com/2008/10/instalacin-de-openbravo-240-en-opensuse.html"&gt;Openbravo instalado y funcionando&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div style="text-align: justify;"&gt;Lo primero que debemos hacer es levantar Postgresql, para eso simplemente ejecutamos el siguiente comando en una consola como usuario root:&lt;br /&gt;&lt;blockquote&gt;service postgresql start&lt;/blockquote&gt;Luego iniciamos Apache Tomcat desde la misma consola:&lt;br /&gt;&lt;blockquote&gt;$CATALINA_HOME/bin/startup.sh&lt;/blockquote&gt;Luego abrimos nuestro navegador web y escribimos la dirección:&lt;br /&gt;&lt;blockquote&gt;http://localhost:8080/openbravo&lt;/blockquote&gt;lo cual nos llevará al sistema de ingreso, escribimos el nombre de usuario &lt;span style="font-style: italic;"&gt;Openbravo&lt;/span&gt; y la contraseña &lt;span style="font-style: italic;"&gt;openbravo&lt;/span&gt; y ya entramos al sistema.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_TGgpRudXV3w/SQfmHqDb-ZI/AAAAAAAAAxs/UgH1NFT9sVg/s1600-h/imagen1.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="http://3.bp.blogspot.com/_TGgpRudXV3w/SQfmHqDb-ZI/AAAAAAAAAxs/UgH1NFT9sVg/s320/imagen1.png" alt="" id="BLOGGER_PHOTO_ID_5262427708827892114" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Una vez dentro fijamos nuestra mirada sobre el menú donde dice Openbravo (donde sale un icono de una persona) y pinchamos ahí (no pinchar la X o cruz que es para cerrar sesión). Se abrirá una ventana con las opciones del usuario Openbravo. Debemos fijarnos de tener seleccionado el rol de &lt;span style="font-style: italic;"&gt;System Administrator&lt;/span&gt; y como entidad a &lt;span style="font-style: italic;"&gt;System&lt;/span&gt;, teniendo eso listo pinchamos &lt;span style="font-style: italic;"&gt;ok&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_TGgpRudXV3w/SQfmH36we4I/AAAAAAAAAx0/EL8WDym8PaQ/s1600-h/imagen2.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="http://1.bp.blogspot.com/_TGgpRudXV3w/SQfmH36we4I/AAAAAAAAAx0/EL8WDym8PaQ/s320/imagen2.png" alt="" id="BLOGGER_PHOTO_ID_5262427712549583746" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Luego fijamos la mirada nuevamente en el menú y pinchamos &lt;span style="font-style: italic;"&gt;General Setup -&gt; Application -&gt; Language&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_TGgpRudXV3w/SQfmIG4EcQI/AAAAAAAAAx8/ekiG-WqD-Eg/s1600-h/imagen3.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="http://2.bp.blogspot.com/_TGgpRudXV3w/SQfmIG4EcQI/AAAAAAAAAx8/ekiG-WqD-Eg/s320/imagen3.png" alt="" id="BLOGGER_PHOTO_ID_5262427716564840706" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;y pinchamos la lupa que aparece arribita (ver imagen anterior). Se abrirá una ventana para ingresar un filtro, ahi ingresamos &lt;span style="font-style: italic;"&gt;Spanish%&lt;/span&gt; y presionamos &lt;span style="font-style: italic;"&gt;ok&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_TGgpRudXV3w/SQfmIUinyGI/AAAAAAAAAyE/JWnIrjalbIc/s1600-h/imagen4.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="http://2.bp.blogspot.com/_TGgpRudXV3w/SQfmIUinyGI/AAAAAAAAAyE/JWnIrjalbIc/s320/imagen4.png" alt="" id="BLOGGER_PHOTO_ID_5262427720232978530" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Lo anterior nos cambiará la selección de idioma a español Argentina. Pinchamos el icono de una tabla (con varias filas y 2 columnas) que aparece a la derecha del menú e izquierda del panel de selección de idioma. Al pinchar nos aparecerá un panel con varias filas de países con idioma español, seleccionamos Chile.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_TGgpRudXV3w/SQfmImU4e3I/AAAAAAAAAyM/iua_Oe9-BOQ/s1600-h/imagen5.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="http://4.bp.blogspot.com/_TGgpRudXV3w/SQfmImU4e3I/AAAAAAAAAyM/iua_Oe9-BOQ/s320/imagen5.png" alt="" id="BLOGGER_PHOTO_ID_5262427725007190898" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Luego pinchamos el icono del lápiz (sobre el icono de la tabla) y veremos que ya no aparece Argentina seleccionado, sino Chile, marcamos la opción &lt;span style="font-style: italic;"&gt;System language&lt;/span&gt; y fijamos la mirada en el icono de un disquete cuyo tip es &lt;span style="font-style: italic;"&gt;"Save Record"&lt;/span&gt; y lo pinchamos.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_TGgpRudXV3w/SQfphzLHyAI/AAAAAAAAAyU/YQh_k7FgUcs/s1600-h/imagen7.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="http://4.bp.blogspot.com/_TGgpRudXV3w/SQfphzLHyAI/AAAAAAAAAyU/YQh_k7FgUcs/s320/imagen7.png" alt="" id="BLOGGER_PHOTO_ID_5262431456487524354" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_TGgpRudXV3w/SQfpipoV9VI/AAAAAAAAAyc/6xC8IiLjS4s/s1600-h/imagen8.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="http://1.bp.blogspot.com/_TGgpRudXV3w/SQfpipoV9VI/AAAAAAAAAyc/6xC8IiLjS4s/s320/imagen8.png" alt="" id="BLOGGER_PHOTO_ID_5262431471105602898" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Luego pinchamos el botón &lt;span style="font-style: italic;"&gt;Verify Languages&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_TGgpRudXV3w/SQfpii49TkI/AAAAAAAAAyk/va8aapKOw6g/s1600-h/imagen9.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="http://1.bp.blogspot.com/_TGgpRudXV3w/SQfpii49TkI/AAAAAAAAAyk/va8aapKOw6g/s320/imagen9.png" alt="" id="BLOGGER_PHOTO_ID_5262431469296242242" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;y presionamos ok&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_TGgpRudXV3w/SQfpjLIJpgI/AAAAAAAAAys/PLBMWs5LSgQ/s1600-h/imagen10.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="http://3.bp.blogspot.com/_TGgpRudXV3w/SQfpjLIJpgI/AAAAAAAAAys/PLBMWs5LSgQ/s320/imagen10.png" alt="" id="BLOGGER_PHOTO_ID_5262431480097383938" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;esperamos un par de segundos y debemos ver lo siguiente:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_TGgpRudXV3w/SQfpjJBzXBI/AAAAAAAAAy0/8Pn27aR-l_E/s1600-h/imagen11.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="http://1.bp.blogspot.com/_TGgpRudXV3w/SQfpjJBzXBI/AAAAAAAAAy0/8Pn27aR-l_E/s320/imagen11.png" alt="" id="BLOGGER_PHOTO_ID_5262431479533886482" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Si no aparece lo anterior entonces debemos volver a presionar el botón &lt;span style="font-style: italic;"&gt;Verify Languages.&lt;/span&gt;&lt;br /&gt;Para comprobar que lo anterior fue realizado correctamente, recomiendo comprobar la salida del siguiente comando SQL en la base de datos:&lt;br /&gt;&lt;blockquote&gt;select * from ad_workflow_trl where ad_language = 'es_CL';&lt;/blockquote&gt;&lt;br /&gt;El comando anterior lo puedes realizar desde consola o utilizando algún cliente de administración como phpPgAdmin como se ve a continuación:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_TGgpRudXV3w/SQfrKV2_ZkI/AAAAAAAAAy8/Qg568awhCgs/s1600-h/imagen12.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="http://2.bp.blogspot.com/_TGgpRudXV3w/SQfrKV2_ZkI/AAAAAAAAAy8/Qg568awhCgs/s320/imagen12.png" alt="" id="BLOGGER_PHOTO_ID_5262433252504725058" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;y la salida debe ser la siguiente:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_TGgpRudXV3w/SQfrKcup5kI/AAAAAAAAAzE/g3BWI9Zz-Ok/s1600-h/imagen13.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="http://4.bp.blogspot.com/_TGgpRudXV3w/SQfrKcup5kI/AAAAAAAAAzE/g3BWI9Zz-Ok/s320/imagen13.png" alt="" id="BLOGGER_PHOTO_ID_5262433254348809794" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Luego debemos crear la carpeta &lt;span style="font-style: italic;"&gt;es_CL&lt;/span&gt; en &lt;span style="font-style: italic;"&gt;/opt/OpenbravoERP/AppsOpenbravo/attachments/lang&lt;/span&gt; como se ve a continuación:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_TGgpRudXV3w/SQfrKnqJBTI/AAAAAAAAAzM/F_BEKUkJWCY/s1600-h/imagen14.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="http://1.bp.blogspot.com/_TGgpRudXV3w/SQfrKnqJBTI/AAAAAAAAAzM/F_BEKUkJWCY/s320/imagen14.png" alt="" id="BLOGGER_PHOTO_ID_5262433257282667826" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;luego debemos copiar los &lt;a href="http://ifile.it/t6l2mq5"&gt;27 archivos XML de la traducción a español Chile&lt;/a&gt; a esa carpeta y debe quedar la estructura de archivos así:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_TGgpRudXV3w/SQfrKsJS2mI/AAAAAAAAAzU/xUO4181kEiI/s1600-h/imagen15.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="http://2.bp.blogspot.com/_TGgpRudXV3w/SQfrKsJS2mI/AAAAAAAAAzU/xUO4181kEiI/s320/imagen15.png" alt="" id="BLOGGER_PHOTO_ID_5262433258487077474" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Una vez copiados vamos al navegador web y seleccionamos en el menú &lt;span style="font-style: italic;"&gt;General Setup -&gt; Application -&gt; Import/Export Translations&lt;/span&gt;, seleccionamos la entidad &lt;span style="font-style: italic;"&gt;System&lt;/span&gt; y el idioma &lt;span style="font-style: italic;"&gt;Spanish (Chile)&lt;/span&gt;, luego presionamos import, como se ve a continuación:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_TGgpRudXV3w/SQfrK1o1efI/AAAAAAAAAzc/GgxbknSdUpI/s1600-h/imagen16.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="http://2.bp.blogspot.com/_TGgpRudXV3w/SQfrK1o1efI/AAAAAAAAAzc/GgxbknSdUpI/s320/imagen16.png" alt="" id="BLOGGER_PHOTO_ID_5262433261035289074" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_TGgpRudXV3w/SQftKVWJKQI/AAAAAAAAAzk/6LhYJvflMJQ/s1600-h/imagen17.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="http://4.bp.blogspot.com/_TGgpRudXV3w/SQftKVWJKQI/AAAAAAAAAzk/6LhYJvflMJQ/s320/imagen17.png" alt="" id="BLOGGER_PHOTO_ID_5262435451390208258" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Para estar seguros de que todo se ha realizado correctamente ejecutamos el siguiente comando SQL (es el mismo comando SQL ejecutado anteriormente):&lt;br /&gt;&lt;blockquote&gt;select * from ad_workflow_trl where ad_language = 'es_CL'&lt;/blockquote&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_TGgpRudXV3w/SQftKjjopJI/AAAAAAAAAzs/JiTHBvBaRW0/s1600-h/imagen18.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="http://4.bp.blogspot.com/_TGgpRudXV3w/SQftKjjopJI/AAAAAAAAAzs/JiTHBvBaRW0/s320/imagen18.png" alt="" id="BLOGGER_PHOTO_ID_5262435455204893842" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;y ahora veremos que se han traducido los registros en la base de datos al español:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_TGgpRudXV3w/SQftKxPF9bI/AAAAAAAAAz0/8L0nOs8oEDE/s1600-h/imagen19.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="http://2.bp.blogspot.com/_TGgpRudXV3w/SQftKxPF9bI/AAAAAAAAAz0/8L0nOs8oEDE/s320/imagen19.png" alt="" id="BLOGGER_PHOTO_ID_5262435458876831154" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Ahora cerramos el navegador y bajamos el servicio tomcat con el siguiente comando:&lt;br /&gt;&lt;blockquote&gt;$CATALINA_HOME/bin/shutdown.sh&lt;/blockquote&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_TGgpRudXV3w/SQftLHPzmHI/AAAAAAAAAz8/leZ3NF7SP3M/s1600-h/imagen20.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="http://1.bp.blogspot.com/_TGgpRudXV3w/SQftLHPzmHI/AAAAAAAAAz8/leZ3NF7SP3M/s320/imagen20.png" alt="" id="BLOGGER_PHOTO_ID_5262435464785401970" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Luego nos movemos a la carpeta /opt/OpenbravoERP/AppsOpenbravo, abrimos una consola y ejecutamos:&lt;br /&gt;&lt;blockquote&gt;ant compile.complete&lt;br /&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_TGgpRudXV3w/SQftLTa0fRI/AAAAAAAAA0E/QurIOtPtVnA/s1600-h/imagen21.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="http://3.bp.blogspot.com/_TGgpRudXV3w/SQftLTa0fRI/AAAAAAAAA0E/QurIOtPtVnA/s320/imagen21.png" alt="" id="BLOGGER_PHOTO_ID_5262435468052823314" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Este comando recompilará Openbravo con soporte de idioma español Chile (es_CL). El proceso se demora como 40 minutos mas o menos, dependiendo del equipo. Una vez finalizado ejecutamos:&lt;br /&gt;&lt;blockquote&gt;ant war&lt;br /&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_TGgpRudXV3w/SQfvLdbFvVI/AAAAAAAAA0M/5d0SDiHeTLY/s1600-h/imagen22.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="http://4.bp.blogspot.com/_TGgpRudXV3w/SQfvLdbFvVI/AAAAAAAAA0M/5d0SDiHeTLY/s320/imagen22.png" alt="" id="BLOGGER_PHOTO_ID_5262437669761563986" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;y luego:&lt;br /&gt;&lt;blockquote&gt;ant deploy&lt;br /&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_TGgpRudXV3w/SQfvLtBCjHI/AAAAAAAAA0U/-qMgPx3zcsk/s1600-h/imagen23.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="http://2.bp.blogspot.com/_TGgpRudXV3w/SQfvLtBCjHI/AAAAAAAAA0U/-qMgPx3zcsk/s320/imagen23.png" alt="" id="BLOGGER_PHOTO_ID_5262437673947270258" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Al final debemos ver 3 BUILD SUCCESSFUL:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_TGgpRudXV3w/SQfvMIaK61I/AAAAAAAAA0c/1J9QBFPPSPg/s1600-h/imagen23.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="http://4.bp.blogspot.com/_TGgpRudXV3w/SQfvMIaK61I/AAAAAAAAA0c/1J9QBFPPSPg/s320/imagen23.png" alt="" id="BLOGGER_PHOTO_ID_5262437681300433746" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Una vez listo debemos borrar la siguiente carpeta: &lt;span style="font-style: italic;"&gt;/opt/apache-tomcat-6.0.18/webapps/openbravo&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_TGgpRudXV3w/SQfvMTF4GuI/AAAAAAAAA0k/8Df36x8g41c/s1600-h/imagen25.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="http://3.bp.blogspot.com/_TGgpRudXV3w/SQfvMTF4GuI/AAAAAAAAA0k/8Df36x8g41c/s320/imagen25.png" alt="" id="BLOGGER_PHOTO_ID_5262437684168104674" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Si no borramos esa carpeta después nos va a aparecer un &lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;error 500&lt;/span&gt;&lt;/span&gt; en Openbravo.&lt;br /&gt;Una vez listo iniciamos openbravo:&lt;br /&gt;&lt;blockquote&gt;$CATALINA_HOME/bin/startup.sh&lt;/blockquote&gt;&lt;br /&gt;Ingresamos al sistema con el usuario &lt;span style="font-style: italic;"&gt;Openbravo&lt;/span&gt; y contraseña &lt;span style="font-style: italic;"&gt;openbravo&lt;/span&gt; y pinchamos donde dice &lt;span style="font-style: italic;"&gt;Openbravo&lt;/span&gt; sobre el menú al lado del icono de la persona.&lt;br /&gt;&lt;br /&gt;Ahora seleccionamos el rol &lt;span style="font-style: italic;"&gt;System Administrator&lt;/span&gt;, la entidad &lt;span style="font-style: italic;"&gt;System&lt;/span&gt; el idioma &lt;span style="font-style: italic;"&gt;Spanish (Chile)&lt;/span&gt;, marcamos la opción &lt;span style="font-style: italic;"&gt;"Set as default"&lt;/span&gt; y presionamos &lt;span style="font-style: italic;"&gt;ok&lt;/span&gt;:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_TGgpRudXV3w/SQfvMSsKezI/AAAAAAAAA0s/6GWxQabes4Q/s1600-h/imagen26.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="http://1.bp.blogspot.com/_TGgpRudXV3w/SQfvMSsKezI/AAAAAAAAA0s/6GWxQabes4Q/s320/imagen26.png" alt="" id="BLOGGER_PHOTO_ID_5262437684060257074" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Apenas presionamos ok, Openbravo se traduce automáticamente al español de Chile como podemos ver a continuación:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_TGgpRudXV3w/SQfxCQctJ1I/AAAAAAAAA00/TPheZH_fJSw/s1600-h/imagen27.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="http://4.bp.blogspot.com/_TGgpRudXV3w/SQfxCQctJ1I/AAAAAAAAA00/TPheZH_fJSw/s320/imagen27.png" alt="" id="BLOGGER_PHOTO_ID_5262439710683113298" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Son varios pasos los que hay que seguir para tener Openbravo en nuestro idioma, no es difícil pero debemos respetar los pasos sin saltarnos ninguno. Si siguen esta guía paso a paso no pueden equivocarse.&lt;br /&gt;&lt;br /&gt;Espero les sea de utilidad.&lt;br /&gt;&lt;br /&gt;Saludos !!!&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1421033339681316542-8080127584662175897?l=metalklesk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://metalklesk.blogspot.com/feeds/8080127584662175897/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://metalklesk.blogspot.com/2008/10/traduccin-de-openbravo-240-al-espaol-en.html#comment-form' title='45 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1421033339681316542/posts/default/8080127584662175897'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1421033339681316542/posts/default/8080127584662175897'/><link rel='alternate' type='text/html' href='http://metalklesk.blogspot.com/2008/10/traduccin-de-openbravo-240-al-espaol-en.html' title='Traducción de Openbravo 2.40 al español en OpenSUSE 11.0'/><author><name>Daniel Dario Morales Salas</name><uri>http://www.blogger.com/profile/07642586501018157497</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='28' src='http://3.bp.blogspot.com/_TGgpRudXV3w/SfP_sc5YZ3I/AAAAAAAABSs/APK4YFwjVn4/S220/yoft3.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_TGgpRudXV3w/SQfmHqDb-ZI/AAAAAAAAAxs/UgH1NFT9sVg/s72-c/imagen1.png' height='72' width='72'/><thr:total>45</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1421033339681316542.post-7467400449857154254</id><published>2008-10-25T00:32:00.008-03:00</published><updated>2008-10-25T00:54:50.015-03:00</updated><title type='text'>J-Kiltro 4.0 Beta 3 Liberado</title><content type='html'>&lt;div style="text-align: justify;"&gt;Hoy he liberado la versión 4.0 Beta 3 de mi software de conversión de archivos de audio multi formato &lt;a href="https://sourceforge.net/projects/j-kiltro/"&gt;J-Kiltro&lt;/a&gt;.&lt;br /&gt;Si bien es beta, funciona a full. Aún me falta revisarlo a detalle y agregarle algunas características mas, por eso está en esa fase.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_TGgpRudXV3w/SQKVhiwdw9I/AAAAAAAAAwc/p_7b4u_2U0w/s1600-h/imagen1.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="http://4.bp.blogspot.com/_TGgpRudXV3w/SQKVhiwdw9I/AAAAAAAAAwc/p_7b4u_2U0w/s320/imagen1.png" alt="" id="BLOGGER_PHOTO_ID_5260931718220465106" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Para quienes no saben de qué hablo, J-Kiltro es un software que sirve para convertir un archivo de audio de un formato a otro, por ejemplo mp3 a ogg, wma a mpc. Soporta 14 formatos de entrada y 12 de salida.&lt;br /&gt;&lt;br /&gt;Los formatos de entrada son:&lt;br /&gt;&lt;blockquote&gt;aac,aiff,ape,au,flac,m4a,m4b,mp3,mp4,mpc,ogg,ra,wav y wma&lt;/blockquote&gt;y los formatos de salida son:&lt;br /&gt;&lt;blockquote&gt;aac,aiff,ape,au,flac,m4a,m4b,mp3,mp4,mpc,ogg y wav&lt;/blockquote&gt;Esta aplicación está desarrollada 100% en java utilizando el IDE &lt;a href="http://www.netbeans.org/"&gt;NetBeans&lt;/a&gt; 6.5.&lt;br /&gt;&lt;br /&gt;Dentro de las características de ésta versión se encuentran:&lt;br /&gt;&lt;/div&gt;&lt;ul style="text-align: justify;"&gt;&lt;li&gt;Interfaz muy simple y amigable.&lt;/li&gt;&lt;li&gt;Soporta 14 formatos de entrada y 12 de salida.&lt;/li&gt;&lt;li&gt;Extracción de pistas de audio desde CD (son selección de pistas).&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Tiene previsualizador de audio con un reproductor interno (mp3, ogg, flac, wav, aiff y au).&lt;/li&gt;&lt;li&gt;Reproductor de audio interno.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Obtiene metadata desde archivos de audio automáticamente.&lt;/li&gt;&lt;li&gt;Permite editar la metadata de los archivos de audio.&lt;/li&gt;&lt;li&gt;Detección automática de dependencias.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Permite el ingreso de archivos de distintos formatos a la lista y automáticamente sabe como tratarlos para llevarlos al formato de destino.&lt;/li&gt;&lt;li&gt;Soporta distintos look and feel.&lt;/li&gt;&lt;li&gt;etc.&lt;/li&gt;&lt;/ul&gt;&lt;div style="text-align: justify;"&gt;Ésta aplicación solo funciona en distribuciones Linux ya que requiere de algunas aplicaciones de linea de comandos para hacer las conversiones. Las dependencias son:&lt;br /&gt;&lt;/div&gt;&lt;ul style="text-align: justify;"&gt;&lt;li&gt;Lame&lt;/li&gt;&lt;li&gt;Vorbis-tools&lt;/li&gt;&lt;li&gt;Mppdec y Mppenc&lt;/li&gt;&lt;li&gt;Sox&lt;/li&gt;&lt;li&gt;Mac&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Flac&lt;/li&gt;&lt;li&gt;Faac y Faad&lt;/li&gt;&lt;li&gt;Mplayer&lt;/li&gt;&lt;li&gt;CD Paranoia&lt;/li&gt;&lt;li&gt;JRE 1.6 update 10&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div style="text-align: justify;"&gt;Todas las dependencias (o la mayoría) están disponibles en los repositorios de las distribuciones Linux, por ejemplo todas están disponibles en &lt;a href="http://www.opensuse.org/"&gt;openSUSE 11.0&lt;/a&gt;, por lo que antes de pensar en compilarlas tu mismo, mejor descargalas usando el gestor de paquetes de tu distro (YaST, apt-get, yum, etc.), es mucho mas simple.&lt;br /&gt;&lt;br /&gt;La razón de que no corre en Windows es simple, no le he dado soporte. Si bien está desarrollado en Java, la detección de dependencias es solo para distribuciones Linux y los comandos de conversión no son los mismos en una distro Linux y en Windows. De todas formas estos dos aspectos son simples de modificar para portar la aplicación a Windows.&lt;br /&gt;&lt;br /&gt;Si alguien está interesado en dar el soporte para que esta aplicación corra en otros SO bienvenido sea, el código está bajo la licencia GPL 3.&lt;br /&gt;&lt;br /&gt;Esta versión (beta 3) se diferencia de la beta 2 en varias cosas pequeñas pero importantes.&lt;br /&gt;&lt;br /&gt;Se han corregido algunos errores en la reproducción de sonido en el previsualizador interno y se le han agregado algunos detalles como mostrar el % de sonido reproducido (en el avance), el nombre del archivo que se esta leyendo y su duración en segundos.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_TGgpRudXV3w/SQKViW_e7LI/AAAAAAAAAwk/SPr8z2wsFIA/s1600-h/imagen2.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="http://4.bp.blogspot.com/_TGgpRudXV3w/SQKViW_e7LI/AAAAAAAAAwk/SPr8z2wsFIA/s320/imagen2.png" alt="" id="BLOGGER_PHOTO_ID_5260931732242099378" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;También se ha agregado un reproductor interno principal (distinto pero parecido al previsualizador) el cual puede ser utilizado para reproducir música mientras se convierten archivos.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_TGgpRudXV3w/SQKVinCeCcI/AAAAAAAAAws/HnrjlZgX9FY/s1600-h/imagen3.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="http://1.bp.blogspot.com/_TGgpRudXV3w/SQKVinCeCcI/AAAAAAAAAws/HnrjlZgX9FY/s320/imagen3.png" alt="" id="BLOGGER_PHOTO_ID_5260931736549591490" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Y se agregó un botón para enviar la lista de archivos a convertir a la lista de reproducción de audio (solo se pueden reproducir mp3, ogg, wav, au, aiff y flac).&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_TGgpRudXV3w/SQKVi95RgUI/AAAAAAAAAw0/gD0cb4dO02c/s1600-h/imagen4.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="http://1.bp.blogspot.com/_TGgpRudXV3w/SQKVi95RgUI/AAAAAAAAAw0/gD0cb4dO02c/s320/imagen4.png" alt="" id="BLOGGER_PHOTO_ID_5260931742685036866" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_TGgpRudXV3w/SQKVjNJ3rSI/AAAAAAAAAw8/BV7nVJY5pEw/s1600-h/imagen5.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="http://4.bp.blogspot.com/_TGgpRudXV3w/SQKVjNJ3rSI/AAAAAAAAAw8/BV7nVJY5pEw/s320/imagen5.png" alt="" id="BLOGGER_PHOTO_ID_5260931746781179170" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_TGgpRudXV3w/SQKXHyZxcUI/AAAAAAAAAxE/vlgtudInSNE/s1600-h/imagen6.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="http://1.bp.blogspot.com/_TGgpRudXV3w/SQKXHyZxcUI/AAAAAAAAAxE/vlgtudInSNE/s320/imagen6.png" alt="" id="BLOGGER_PHOTO_ID_5260933474766909762" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Se cambió la forma de presentación de datos en la consola de la aplicación ya que antes utilizaba muchos recursos pues se escribía en él cada vez que el proceso devolvía texto, ahora se usa la consola como visualizador de log solo al final de cada proceso (se salva un mucho uso de CPU).&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_TGgpRudXV3w/SQKXIX5B9iI/AAAAAAAAAxM/yBEsY0Q0V_I/s1600-h/imagen7.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="http://3.bp.blogspot.com/_TGgpRudXV3w/SQKXIX5B9iI/AAAAAAAAAxM/yBEsY0Q0V_I/s320/imagen7.png" alt="" id="BLOGGER_PHOTO_ID_5260933484830127650" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_TGgpRudXV3w/SQKXIu0jKyI/AAAAAAAAAxU/HvFYtpLlp70/s1600-h/imagen8.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="http://2.bp.blogspot.com/_TGgpRudXV3w/SQKXIu0jKyI/AAAAAAAAAxU/HvFYtpLlp70/s320/imagen8.png" alt="" id="BLOGGER_PHOTO_ID_5260933490985347874" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_TGgpRudXV3w/SQKXI861nsI/AAAAAAAAAxc/82eZhByL4yQ/s1600-h/imagen9.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="http://1.bp.blogspot.com/_TGgpRudXV3w/SQKXI861nsI/AAAAAAAAAxc/82eZhByL4yQ/s320/imagen9.png" alt="" id="BLOGGER_PHOTO_ID_5260933494769819330" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Y por último se me habia olvidado mencionar que las pestañas se pueden cambiar de lugar arrastrándolas desde la beta 2&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_TGgpRudXV3w/SQKXI3jWzlI/AAAAAAAAAxk/OjTo21qCOG4/s1600-h/imagen10.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="http://2.bp.blogspot.com/_TGgpRudXV3w/SQKXI3jWzlI/AAAAAAAAAxk/OjTo21qCOG4/s320/imagen10.png" alt="" id="BLOGGER_PHOTO_ID_5260933493329153618" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Si alguno de ustedes usa J-Kiltro, les recomiendo pasarse a esta versión que está mejor que la anterior.&lt;br /&gt;&lt;br /&gt;saludos !!!&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1421033339681316542-7467400449857154254?l=metalklesk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://metalklesk.blogspot.com/feeds/7467400449857154254/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://metalklesk.blogspot.com/2008/10/j-kiltro-40-beta-3-liberado.html#comment-form' title='14 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1421033339681316542/posts/default/7467400449857154254'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1421033339681316542/posts/default/7467400449857154254'/><link rel='alternate' type='text/html' href='http://metalklesk.blogspot.com/2008/10/j-kiltro-40-beta-3-liberado.html' title='J-Kiltro 4.0 Beta 3 Liberado'/><author><name>Daniel Dario Morales Salas</name><uri>http://www.blogger.com/profile/07642586501018157497</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='28' src='http://3.bp.blogspot.com/_TGgpRudXV3w/SfP_sc5YZ3I/AAAAAAAABSs/APK4YFwjVn4/S220/yoft3.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_TGgpRudXV3w/SQKVhiwdw9I/AAAAAAAAAwc/p_7b4u_2U0w/s72-c/imagen1.png' height='72' width='72'/><thr:total>14</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1421033339681316542.post-5747774077962380778</id><published>2008-10-21T19:25:00.017-03:00</published><updated>2008-10-21T21:06:43.453-03:00</updated><title type='text'>Instalación de Openbravo 2.40 en OpenSUSE 11.0</title><content type='html'>Esta vez vengo con una actualización de la guía para instalar Openbravo en Linux. La versión es la última a la fecha, la 2.40. Si siguen la guía al pie de la letra no deberían tener problemas. Yo lo instalé como explicaré mas adelante y no tuve NINGÚN percance. El sistema operativo que utilizé es &lt;a href="http://www.opensuse.org/"&gt;OpenSUSE 11.0&lt;/a&gt;&lt;a href="http://www.opensuse.org/"&gt;,&lt;/a&gt; pero sirve cualquier distro (distribución GNU/Linux) con linux 2.6.x.&lt;br /&gt;&lt;br /&gt;Lo primero es lo primero, algunos se preguntarán qué es Openbravo, &lt;a style="font-style: italic;" href="http://www.openbravo.com/"&gt;Openbravo&lt;/a&gt; es un &lt;a style="font-style: italic;" href="http://www.blogger.com/es.wikipedia.org/wiki/Planificaci%C3%83%C2%B3n_de_recursos_empresariales"&gt;ERP&lt;/a&gt; (Enterprise Resource Planning) opensource diseñado para las &lt;a style="font-style: italic;" href="http://es.wikipedia.org/wiki/PYME"&gt;MIPyME&lt;/a&gt; (micro, pequeña y mediana empresa).&lt;br /&gt;Con esta herramienta de gestión los empresarios pueden controlar los diferentes aspectos de su negocio a través de los módulos que provee.&lt;br /&gt;&lt;br /&gt;Esta herramienta de gestión empresarial está disponible para la descarga gratuita desde el &lt;a style="font-style: italic;" href="http://www.openbravo.com/"&gt;sitio web oficial de Openbravo&lt;/a&gt; y &lt;span style="font-weight: bold;"&gt;NO&lt;/span&gt; se requiere el pago de licencias para su uso en ambiente personal ni comercial.&lt;br /&gt;&lt;br /&gt;Openbravo no es un software que se descargue e instale en un par de clicks ... bueno en realidad si pero requiere de algunas dependencias previas y una pequeña configuración del sistema para su instalación y ejecución.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:180%;"&gt;Requerimientos:&lt;/span&gt;&lt;br /&gt;&lt;ul style="text-align: justify;"&gt;&lt;li&gt;&lt;a style="font-style: italic;" href="http://www.openbravo.com/"&gt;Openbravo&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;a style="font-style: italic;" href="http://ant.apache.org/"&gt;Apache-ant 1.7&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;a style="font-style: italic;" href="http://tomcat.apache.org/"&gt;Apache-tomcat 6.0&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;a style="font-style: italic;" href="http://java.sun.com/javase/downloads/index.jsp"&gt;JDK 1.6&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;a style="font-style: italic;" href="http://www.postgresql.com/"&gt;PostgreSQL&lt;/a&gt;.&lt;/li&gt;&lt;/ul&gt;Bien, para la realización de esta guía se utilizaron la última versión de Openbravo (2.40), Ant (1.7.1), Tomcat (6.0.18) y JDK (1.6.0_10). La versión de PostgreSQL que utilizé es la 8.3.1.&lt;br /&gt;&lt;br /&gt;Los primeros 4 deben descargarlos de la página oficial de cada uno, el último va a depender de que distribución de linux estén usando y si tienen o no configurados los repositorios de Internet.&lt;br /&gt;&lt;br /&gt;Para los recién iniciados en linux y sus múltiples distribuciones, un repositorio es un lugar en donde existen paquetes de software disponible para la descarga e instalación, automática o manual. Por ejemplo openSUSE 11.0 trae un apartado con repositorios, que vienen desactivados por &lt;span style="font-style: italic;"&gt;default&lt;/span&gt; pero que se pueden activar en &lt;span style="font-weight: bold; font-style: italic;"&gt;YaST -&gt; Software -&gt; Community Repositories&lt;/span&gt;, en el caso de PCLinuxOS 2008 los repositorios ya vienen listos. En el caso de otra distribución como Ubuntu, Fedora, etc desconozco ya que no los uso, pero &lt;a href="http://www.google.com/"&gt;google&lt;/a&gt; es su amigo en esos casos.&lt;br /&gt;&lt;br /&gt;Recomiendo tremendamente que antes de instalar cualquier cosa, tengan sus repositorios configurados y actualizados antes de seguir con la guía, si no lo hacen así acuérdense de mi, tendrán problemas mas adelante (les suena un &lt;span style="font-weight: bold;"&gt;BUILD FAILED&lt;/span&gt; ??).&lt;br /&gt;&lt;br /&gt;Para el JDK tienen varias versiones, si su distribución utiliza paquetes RPM entonces descarguen el paquete de nombre &lt;span style="font-weight: bold; font-style: italic;"&gt;jdk-6u10-linux-i586.rpm.bin&lt;/span&gt; y en caso contrario descarguen &lt;span style="font-weight: bold; font-style: italic;"&gt;jdk-6u10-linux-i586.bin&lt;/span&gt;. Algunas distribuciones traen el JDK en sus repositorios, pueden instalarlo desde ahí también, pero fíjense después en qué directorio quedará instalado, en el caso del RPM queda en &lt;span style="font-weight: bold; font-style: italic;"&gt;/usr/java/jdk1.6.0_10&lt;/span&gt; y además queda un enlace simbólico llamado &lt;span style="font-weight: bold; font-style: italic;"&gt;/usr/java/latest&lt;/span&gt; que apunta al directorio anterior.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:180%;"&gt;Instalación de dependencias:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;PostgreSQL.&lt;/span&gt;&lt;br /&gt;Entonces ya tenemos descargados Openbravo, Ant, Tomcat y JDK. Ahora utilizaremos el gestor de paquetes que corresponda (YAST, Synaptic, Smart, etc), escribiremos PostgreSQL y lo instalamos como se ve a continuación:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_TGgpRudXV3w/SP5Zir4eT0I/AAAAAAAAAss/NlVALLAY180/s1600-h/imagen4.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_TGgpRudXV3w/SP5Zir4eT0I/AAAAAAAAAss/NlVALLAY180/s320/imagen4.png" alt="" id="BLOGGER_PHOTO_ID_5259739867245334338" border="0" /&gt;&lt;/a&gt;&lt;span style="font-size:130%;"&gt;JDK.&lt;/span&gt;&lt;br /&gt;Una vez instalado seguimos con el JDK. Lo primero es dar permisos de ejecución al instalador, para esto abrimos una consola (en el caso de utilizar el escritorio &lt;a href="http://www.kde.org/"&gt;KDE&lt;/a&gt;, &lt;span style="font-weight: bold; font-style: italic;"&gt;menú -&gt; aplicaciones -&gt; sistema -&gt; terminales -&gt; konsole&lt;/span&gt;), escribimos &lt;span style="font-weight: bold; font-style: italic;"&gt;su&lt;/span&gt; e ingresamos la contraseña de administrador del sistema (al escribirla no se ve nada, no hay problema) y presionamos &lt;span style="font-style: italic;"&gt;&lt;span style="font-weight: bold;"&gt;enter&lt;/span&gt;.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Por &lt;span style="font-style: italic;"&gt;default&lt;/span&gt; la consola queda posicionada en su &lt;span style="font-weight: bold;"&gt;home&lt;/span&gt;, por ejemplo &lt;span style="font-style: italic; font-weight: bold;"&gt;/home/metalklesk&lt;/span&gt; (el cual es mi caso), así que para evitar confusiones tengamos todos los archivos descargados en la raíz de nuestro home.&lt;br /&gt;&lt;br /&gt;Ahora escribimos:&lt;br /&gt;&lt;blockquote&gt;chmod a+x jdk-6u10-linux-i586.rpm.bin&lt;br /&gt;./jdk-6u10-linux-i586.rpm.bin&lt;/blockquote&gt;&lt;br /&gt;con eso nos va a salir un texto explicando la licencia, etc. y si no nos interesa leerlo presionamos &lt;span style="font-weight: bold; font-style: italic;"&gt;q&lt;/span&gt; y &lt;span style="font-weight: bold; font-style: italic;"&gt;enter&lt;/span&gt;. Ya con eso tenemos el JDK instalado en &lt;span style="font-weight: bold; font-style: italic;"&gt;/usr/java/jdk1.6.0_10&lt;/span&gt;. Si no usamos RPM hacemos lo mismo con el otro:&lt;br /&gt;&lt;blockquote&gt;chmod a+x jdk-6u10-linux-i586.bin&lt;br /&gt;./jdk-6u10-linux-i586.bin&lt;/blockquote&gt;&lt;br /&gt;pero no quedará en el mismo directorio, si no que quedará en nuestro home, lo podemos mover a cualquier parte donde tengamos permisos de escritura, por ejemplo, como usuario root lo podemos mover a &lt;span style="font-weight: bold;"&gt;/opt&lt;/span&gt;.&lt;br /&gt;&lt;blockquote&gt;mv -f jdk1.6.0_10/ /opt&lt;/blockquote&gt;&lt;br /&gt;y listo. Si utilizaron el gestor de paquetes de su distribución para instalar JDK no hay problemas, pero deben saber en que directorio se encuentra, esa información la necesitaremos mas adelante.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Ant&lt;/span&gt;.&lt;br /&gt;Para instalar ant simplemente debemos descomprimir el archivo descargado, si usasmos KDE hacemos &lt;span style="font-weight: bold; font-style: italic;"&gt;click derecho sobre el archivo -&gt; extraer -&gt; extraer aquí&lt;/span&gt;. Luego movemos la carpeta a &lt;span style="font-weight: bold;"&gt;/opt&lt;/span&gt;.&lt;br /&gt;&lt;blockquote&gt;mv -f apache-ant-1.7/ /opt&lt;/blockquote&gt;&lt;br /&gt;y ya lo tenemos instalado.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_TGgpRudXV3w/SP5alVa4FwI/AAAAAAAAAs0/ZqC5kOOGNdU/s1600-h/imagen2.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_TGgpRudXV3w/SP5alVa4FwI/AAAAAAAAAs0/ZqC5kOOGNdU/s320/imagen2.png" alt="" id="BLOGGER_PHOTO_ID_5259741012266850050" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Tomcat&lt;/span&gt;.&lt;br /&gt;Para instalar Tomcat simplemente debemos descomprimir el archivo descargado, si usamos KDE hacemos &lt;span style="font-weight: bold; font-style: italic;"&gt;click derecho sobre el archivo -&gt; extraer -&gt; extraer aquí&lt;/span&gt;. Luego movemos la carpeta a &lt;span style="font-weight: bold;"&gt;/opt&lt;/span&gt;.&lt;br /&gt;&lt;blockquote&gt;mv -f apache-tomcat-6.0.18/ /opt&lt;/blockquote&gt;&lt;br /&gt;y ya lo tenemos instalado.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_TGgpRudXV3w/SP5alVa4FwI/AAAAAAAAAs0/ZqC5kOOGNdU/s1600-h/imagen2.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_TGgpRudXV3w/SP5alVa4FwI/AAAAAAAAAs0/ZqC5kOOGNdU/s320/imagen2.png" alt="" id="BLOGGER_PHOTO_ID_5259741012266850050" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-size:180%;"&gt;Configuración del sistema.&lt;/span&gt;&lt;br /&gt;Ahora debemos configurar PostgreSQL y algunas variables del sistema antes de instalar Openbravo.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;PostgreSQL.&lt;/span&gt;&lt;br /&gt;Lo primero es darle una contraseña al usuario administrador de PostgreSQL, al usuario &lt;span style="font-weight: bold;"&gt;postgres&lt;/span&gt;, para esto simplemente escribimos en consola:&lt;br /&gt;&lt;blockquote&gt;passwd postgres&lt;/blockquote&gt;&lt;br /&gt;y escribimos la contraseña.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_TGgpRudXV3w/SP5bOQQUfSI/AAAAAAAAAs8/FdftUlEwrdY/s1600-h/imagen5.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_TGgpRudXV3w/SP5bOQQUfSI/AAAAAAAAAs8/FdftUlEwrdY/s320/imagen5.png" alt="" id="BLOGGER_PHOTO_ID_5259741715255033122" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Ahora debemos iniciar y detener PostgreSQL por primera vez para que se creen los archivos de configuración, para esto simplemente escribimos en consola:&lt;br /&gt;&lt;blockquote&gt;service postgresql start&lt;/blockquote&gt;&lt;br /&gt;y luego&lt;br /&gt;&lt;blockquote&gt;service postgresql stop&lt;/blockquote&gt;&lt;br /&gt;como se puede ver en la siguiente imagen.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_TGgpRudXV3w/SP5bnG5zNvI/AAAAAAAAAtE/N3_S6m7tHcw/s1600-h/imagen6.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_TGgpRudXV3w/SP5bnG5zNvI/AAAAAAAAAtE/N3_S6m7tHcw/s320/imagen6.png" alt="" id="BLOGGER_PHOTO_ID_5259742142241388274" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Ahora debemos modificar el archivo &lt;span style="font-weight: bold; font-style: italic;"&gt;/var/lib/pgsql/data/pg_hba.conf&lt;/span&gt;, vamos al final y donde dice:&lt;br /&gt;&lt;blockquote&gt;# "local" is for Unix domain socket connections only&lt;br /&gt;local   all         all                               ident sameuser&lt;br /&gt;# IPv4 local connections:&lt;br /&gt;host    all         all         127.0.0.1/32          ident sameuser&lt;br /&gt;# IPv6 local connections:&lt;br /&gt;host all all ::1/128 ident sameuser&lt;/blockquote&gt;&lt;br /&gt;cambiamos el &lt;span style="font-style: italic;"&gt;"ident sameuser"&lt;/span&gt; por un &lt;span style="font-style: italic;"&gt;"trust"&lt;/span&gt;, sin las comillas, y guardamos.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_TGgpRudXV3w/SP5b9z7MpuI/AAAAAAAAAtM/PjN3x5Yy1kU/s1600-h/imagen7.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_TGgpRudXV3w/SP5b9z7MpuI/AAAAAAAAAtM/PjN3x5Yy1kU/s320/imagen7.png" alt="" id="BLOGGER_PHOTO_ID_5259742532283967202" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Con eso ya tenemos lista la configuración de PostgreSQL en el sistema.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Variables del sistema.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:100%;"&gt;Ahora vamos a configurar las variables del sistema, para eso debemos abrir el el archivo &lt;span style="font-weight: bold; font-style: italic;"&gt;/etc/profile&lt;/span&gt; como usuario root, si usan KDE entonces escriban en la consola, como usuario root:&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;blockquote&gt;kwrite /etc/profile&lt;/blockquote&gt;&lt;br /&gt;bajen hasta el final y agreguen las siguientes lineas:&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;span style="font-size:100%;"&gt;&lt;blockquote&gt;export JAVA_HOME=/usr/java/latest/&lt;br /&gt;export JDK_HOME=/usr/java/latest/&lt;br /&gt;export JRE_HOME=/usr/java/latest/jre&lt;br /&gt;export ANT_HOME=/opt/apache-ant-1.7.1&lt;br /&gt;export CATALINA_HOME=/opt/apache-tomcat-6.0.18&lt;br /&gt;export PATH=${JAVA_HOME}/bin:${JDK_HOME}/bin:${JRE_HOME}/bin:${ANT_HOME}/bin:${CATALINA_HOME}/bin:$PATH&lt;br /&gt;&lt;/blockquote&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;como se ve en la siguiente imagen:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_TGgpRudXV3w/SP5cYC0AogI/AAAAAAAAAtU/3OdoEPS8RzI/s1600-h/imagen3.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_TGgpRudXV3w/SP5cYC0AogI/AAAAAAAAAtU/3OdoEPS8RzI/s320/imagen3.png" alt="" id="BLOGGER_PHOTO_ID_5259742982956950018" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;guardamos y reiniciamos el equipo.&lt;br /&gt;&lt;br /&gt;Una vez que reiniciamos el equipo, las variables estarán presentes. Fíjense bien en las rutas que ahí aparecen en los export, puede que varíe un poco si han colocado algo en otro lugar que no sea lo que se ve en la imagen.&lt;br /&gt;&lt;br /&gt;Ahora ya estamos en condiciones de instalar Openbravo.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:180%;"&gt;Instalación Openbravo.&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;Para instalar Openbravo debemos tener arriba a PostgreSQL y a Tomcat, para esto simplemente hay que ingresar en la consola, como root:&lt;br /&gt;&lt;blockquote&gt;service postgresql start&lt;/blockquote&gt;&lt;br /&gt;y&lt;br /&gt;&lt;blockquote&gt;$CATALINA_HOME/bin/startup.sh&lt;/blockquote&gt;&lt;br /&gt;&lt;/span&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_TGgpRudXV3w/SP5c9x4WmUI/AAAAAAAAAtc/F2KATkL-Fc0/s1600-h/imagen8.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_TGgpRudXV3w/SP5c9x4WmUI/AAAAAAAAAtc/F2KATkL-Fc0/s320/imagen8.png" alt="" id="BLOGGER_PHOTO_ID_5259743631246793026" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;y después ejecutamos el instalador de Openbravo ...&lt;br /&gt;&lt;blockquote&gt;./OpenbravoERP_2.40-linux-installer.bin&lt;/blockquote&gt;&lt;/span&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_TGgpRudXV3w/SP5d066NpPI/AAAAAAAAAtk/iJKI-y1sqpw/s1600-h/imagen9.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_TGgpRudXV3w/SP5d066NpPI/AAAAAAAAAtk/iJKI-y1sqpw/s320/imagen9.png" alt="" id="BLOGGER_PHOTO_ID_5259744578563319026" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;luego aceptamos la licencia&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_TGgpRudXV3w/SP5d1aUFevI/AAAAAAAAAts/VW1M7bFdBtI/s1600-h/imagen10.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://3.bp.blogspot.com/_TGgpRudXV3w/SP5d1aUFevI/AAAAAAAAAts/VW1M7bFdBtI/s320/imagen10.png" alt="" id="BLOGGER_PHOTO_ID_5259744586993335026" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;luego elegimos el directorio de instalación de Openbravo&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_TGgpRudXV3w/SP5d1f2bGRI/AAAAAAAAAt0/EgmuYdgydVk/s1600-h/imagen11.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_TGgpRudXV3w/SP5d1f2bGRI/AAAAAAAAAt0/EgmuYdgydVk/s320/imagen11.png" alt="" id="BLOGGER_PHOTO_ID_5259744588479535378" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_TGgpRudXV3w/SP5d1xBjAVI/AAAAAAAAAt8/PIAyqMpH7lw/s1600-h/imagen12.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://3.bp.blogspot.com/_TGgpRudXV3w/SP5d1xBjAVI/AAAAAAAAAt8/PIAyqMpH7lw/s320/imagen12.png" alt="" id="BLOGGER_PHOTO_ID_5259744593089593682" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;luego elegimos la instalación completa (asumiendo que Openbravo estará en el mismo equipo que la base de datos)&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_TGgpRudXV3w/SP5d2TSWCoI/AAAAAAAAAuE/4EbdahJTLl0/s1600-h/imagen13.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_TGgpRudXV3w/SP5d2TSWCoI/AAAAAAAAAuE/4EbdahJTLl0/s320/imagen13.png" alt="" id="BLOGGER_PHOTO_ID_5259744602286852738" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;luego la instalación estándar&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_TGgpRudXV3w/SP5fmLUQnjI/AAAAAAAAAuM/Ue21v1M4dw0/s1600-h/imagen14.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_TGgpRudXV3w/SP5fmLUQnjI/AAAAAAAAAuM/Ue21v1M4dw0/s320/imagen14.png" alt="" id="BLOGGER_PHOTO_ID_5259746524292750898" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;luego hay que colocar la ruta de JAVA_HOME, pero como ya ingresamos la variable al sistema, debería detectar la rutas automáticamente como se ve en la siguiente imagen&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_TGgpRudXV3w/SP5fmoS7tRI/AAAAAAAAAuU/K9l_nn6gntk/s1600-h/imagen15.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_TGgpRudXV3w/SP5fmoS7tRI/AAAAAAAAAuU/K9l_nn6gntk/s320/imagen15.png" alt="" id="BLOGGER_PHOTO_ID_5259746532071814418" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;lo mismo con ant&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_TGgpRudXV3w/SP5fnMpEXMI/AAAAAAAAAuc/SCtraaCVbp0/s1600-h/imagen16.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_TGgpRudXV3w/SP5fnMpEXMI/AAAAAAAAAuc/SCtraaCVbp0/s320/imagen16.png" alt="" id="BLOGGER_PHOTO_ID_5259746541828332738" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;y tomcat&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_TGgpRudXV3w/SP5fnnhJW7I/AAAAAAAAAuk/AWNzkWsuRpQ/s1600-h/imagen17.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_TGgpRudXV3w/SP5fnnhJW7I/AAAAAAAAAuk/AWNzkWsuRpQ/s320/imagen17.png" alt="" id="BLOGGER_PHOTO_ID_5259746549042863026" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;luego seleccionamos la base de datos PostgreSQL&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_TGgpRudXV3w/SP5fobL61BI/AAAAAAAAAus/r8DY-UtB2OM/s1600-h/imagen18.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_TGgpRudXV3w/SP5fobL61BI/AAAAAAAAAus/r8DY-UtB2OM/s320/imagen18.png" alt="" id="BLOGGER_PHOTO_ID_5259746562912474130" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;e ingresamos el directorio donde se encuentran los ejecutables (/usr/bin)&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_TGgpRudXV3w/SP5qLHVX5eI/AAAAAAAAAu0/ykmAUfGfr_A/s1600-h/imagen19.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_TGgpRudXV3w/SP5qLHVX5eI/AAAAAAAAAu0/ykmAUfGfr_A/s320/imagen19.png" alt="" id="BLOGGER_PHOTO_ID_5259758153995118050" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;luego ingresamos los datos de la base de datos (host y puerto)&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_TGgpRudXV3w/SP5qLTIPSFI/AAAAAAAAAu8/oEPEVyLu4bI/s1600-h/imagen20.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_TGgpRudXV3w/SP5qLTIPSFI/AAAAAAAAAu8/oEPEVyLu4bI/s320/imagen20.png" alt="" id="BLOGGER_PHOTO_ID_5259758157161252946" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;luego el nombre de usuario y contraseña de administrador de la base de datos&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_TGgpRudXV3w/SP5qLwNWA7I/AAAAAAAAAvE/fO6WCgmjtRg/s1600-h/imagen21.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_TGgpRudXV3w/SP5qLwNWA7I/AAAAAAAAAvE/fO6WCgmjtRg/s320/imagen21.png" alt="" id="BLOGGER_PHOTO_ID_5259758164967293874" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;luego los datos de la base de datos de Openbravo&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_TGgpRudXV3w/SP5qMP_45YI/AAAAAAAAAvM/UYUmumOpBxI/s1600-h/imagen22.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_TGgpRudXV3w/SP5qMP_45YI/AAAAAAAAAvM/UYUmumOpBxI/s320/imagen22.png" alt="" id="BLOGGER_PHOTO_ID_5259758173500794242" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;luego el nombre de contexto de la aplicación, con la cual se accederá directamente en el navegador web&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_TGgpRudXV3w/SP5qMVP9EfI/AAAAAAAAAvU/8bRfCBpZjYw/s1600-h/imagen23.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://3.bp.blogspot.com/_TGgpRudXV3w/SP5qMVP9EfI/AAAAAAAAAvU/8bRfCBpZjYw/s320/imagen23.png" alt="" id="BLOGGER_PHOTO_ID_5259758174910353906" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;luego hay que configurar las opciones de fecha que queremos utilizar en Openbravo&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_TGgpRudXV3w/SP5rp61mu7I/AAAAAAAAAvc/DboFxQP_y7U/s1600-h/imagen24.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_TGgpRudXV3w/SP5rp61mu7I/AAAAAAAAAvc/DboFxQP_y7U/s320/imagen24.png" alt="" id="BLOGGER_PHOTO_ID_5259759782728219570" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;luego podemos seleccionar la opción para llenar la base de datos con datos demo&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_TGgpRudXV3w/SP5rqP-P-7I/AAAAAAAAAvk/EgLYqx8NmA4/s1600-h/imagen25.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_TGgpRudXV3w/SP5rqP-P-7I/AAAAAAAAAvk/EgLYqx8NmA4/s320/imagen25.png" alt="" id="BLOGGER_PHOTO_ID_5259759788401621938" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;y con eso ya podemos instalar Openbravo&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_TGgpRudXV3w/SP5rqdApS7I/AAAAAAAAAvs/8Ds2uBVIIYs/s1600-h/imagen26.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://3.bp.blogspot.com/_TGgpRudXV3w/SP5rqdApS7I/AAAAAAAAAvs/8Ds2uBVIIYs/s320/imagen26.png" alt="" id="BLOGGER_PHOTO_ID_5259759791901330354" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_TGgpRudXV3w/SP5rrDItoCI/AAAAAAAAAv0/NXaF7YAko9w/s1600-h/imagen27.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_TGgpRudXV3w/SP5rrDItoCI/AAAAAAAAAv0/NXaF7YAko9w/s320/imagen27.png" alt="" id="BLOGGER_PHOTO_ID_5259759802135715874" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_TGgpRudXV3w/SP5rrcqxWVI/AAAAAAAAAv8/gKzu05Ea094/s1600-h/imagen28.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://3.bp.blogspot.com/_TGgpRudXV3w/SP5rrcqxWVI/AAAAAAAAAv8/gKzu05Ea094/s320/imagen28.png" alt="" id="BLOGGER_PHOTO_ID_5259759808989452626" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_TGgpRudXV3w/SP5ssGA3P0I/AAAAAAAAAwE/LLR1e3PXC88/s1600-h/imagen29.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_TGgpRudXV3w/SP5ssGA3P0I/AAAAAAAAAwE/LLR1e3PXC88/s320/imagen29.png" alt="" id="BLOGGER_PHOTO_ID_5259760919599595330" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Una vez instalado reiniciamos el sistema.&lt;br /&gt;Para iniciar Openbravo debemos levantar &lt;span style="font-weight: bold;"&gt;PostgreSQL&lt;/span&gt; y &lt;span style="font-weight: bold;"&gt;Tomcat&lt;/span&gt;. Esto lo podemos hacer desde línea de comandos en una consola:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;service postgresql start&lt;br /&gt;$CATALINA_HOME/bin/startup.sh&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;luego abrimos el navegador web que queramos y escribimos en la dirección&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;http://localhost/openbravo&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;y podrán ver la página de ingreso al sistema&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_TGgpRudXV3w/SP5ssY_X_-I/AAAAAAAAAwM/xpzXvcPkYms/s1600-h/imagen30.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_TGgpRudXV3w/SP5ssY_X_-I/AAAAAAAAAwM/xpzXvcPkYms/s320/imagen30.png" alt="" id="BLOGGER_PHOTO_ID_5259760924693626850" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Ingresamos el nombre de usuario &lt;span style="font-weight: bold;"&gt;Openbravo&lt;/span&gt;, la contraseña &lt;span style="font-weight: bold;"&gt;openbravo&lt;/span&gt; y presionamos &lt;span style="font-weight: bold;"&gt;Login&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_TGgpRudXV3w/SP5sspzmfZI/AAAAAAAAAwU/QM3tJT5B2KQ/s1600-h/imagen31.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_TGgpRudXV3w/SP5sspzmfZI/AAAAAAAAAwU/QM3tJT5B2KQ/s320/imagen31.png" alt="" id="BLOGGER_PHOTO_ID_5259760929207647634" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Espero les sea de utilidad esta guía de instalación. Mas adelante agregaré una entrada con la forma de traducción al español.&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/1421033339681316542-5747774077962380778?l=metalklesk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://metalklesk.blogspot.com/feeds/5747774077962380778/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://metalklesk.blogspot.com/2008/10/instalacin-de-openbravo-240-en-opensuse.html#comment-form' title='7 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1421033339681316542/posts/default/5747774077962380778'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1421033339681316542/posts/default/5747774077962380778'/><link rel='alternate' type='text/html' href='http://metalklesk.blogspot.com/2008/10/instalacin-de-openbravo-240-en-opensuse.html' title='Instalación de Openbravo 2.40 en OpenSUSE 11.0'/><author><name>Daniel Dario Morales Salas</name><uri>http://www.blogger.com/profile/07642586501018157497</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='28' src='http://3.bp.blogspot.com/_TGgpRudXV3w/SfP_sc5YZ3I/AAAAAAAABSs/APK4YFwjVn4/S220/yoft3.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_TGgpRudXV3w/SP5Zir4eT0I/AAAAAAAAAss/NlVALLAY180/s72-c/imagen4.png' height='72' width='72'/><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1421033339681316542.post-8119623726416743414</id><published>2008-10-21T00:15:00.003-03:00</published><updated>2008-10-21T00:45:56.838-03:00</updated><title type='text'>J-Kiltro 4.0 Beta 2 Liberado</title><content type='html'>Hoy he liberado la versión 4.0 Beta 2 de mi software de conversión de archivos de audio multi formato &lt;a href="https://sourceforge.net/projects/j-kiltro/"&gt;J-Kiltro&lt;/a&gt;.&lt;br /&gt;Si bien es beta, funciona a full. Aún me falta revisarlo a detalle y agregarle algunas características mas, por eso está en esa fase.&lt;br /&gt;&lt;br /&gt;Para quienes no saben de qué hablo, J-Kiltro es un software que sirve para convertir un archivo de audio de un formato a otro, por ejemplo mp3 a ogg, wma a mpc. Soporta 14 formatos de entrada y 12 de salida.&lt;br /&gt;&lt;br /&gt;Los formatos de entrada son:&lt;br /&gt;&lt;blockquote&gt;aac,aiff,ape,au,flac,m4a,m4b,mp3,mp4,mpc,ogg,ra,wav y wma&lt;/blockquote&gt;y los formatos de salida son:&lt;br /&gt;&lt;blockquote&gt;aac,aiff,ape,au,flac,m4a,m4b,mp3,mp4,mpc,ogg y wav&lt;/blockquote&gt;Esta aplicación está desarrollada 100% en java utilizando el IDE &lt;a href="http://www.netbeans.org/"&gt;NetBeans&lt;/a&gt; 6.1.&lt;br /&gt;&lt;br /&gt;Dentro de las caracteristicas de ésta versión se encuentran:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Interfaz muy simple y amigable.&lt;/li&gt;&lt;li&gt;Soporta 14 formatos de entrada y 12 de salida.&lt;/li&gt;&lt;li&gt;Extracción de pistas de audio desde CD (son selección de pistas).&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Tiene previsualizador de audio con un reproductor interno (mp3, ogg, flac, wav, aiff y au).&lt;/li&gt;&lt;li&gt;Obtiene metadata desde archivos de audio automáticamente.&lt;/li&gt;&lt;li&gt;Permite editar la metadata de los archivos de audio.&lt;/li&gt;&lt;li&gt;Detección automática de dependencias.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Permite el ingreso de archivos de distintos formatos a la lista y automáticamente sabe como tratarlos para llevarlos al formato de destino.&lt;/li&gt;&lt;li&gt;Soporta distintos look and feel.&lt;/li&gt;&lt;li&gt;etc.&lt;/li&gt;&lt;/ul&gt;Ésta aplicación solo funciona en distribuciones Linux ya que requiere de algunas aplicaciones de linea de comandos para hacer las conversiones. Las dependencias son:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Lame&lt;/li&gt;&lt;li&gt;Vorbis-tools&lt;/li&gt;&lt;li&gt;Mppdec y Mppenc&lt;/li&gt;&lt;li&gt;Sox&lt;/li&gt;&lt;li&gt;Mac&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Flac&lt;/li&gt;&lt;li&gt;Faac y Faad&lt;/li&gt;&lt;li&gt;Mplayer&lt;/li&gt;&lt;li&gt;CD Paranoia&lt;/li&gt;&lt;li&gt;JRE 1.6 update 10&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;Todas las dependencias (o la mayoría) están disponibles en los repositorios de las distribuciones Linux, por ejemplo todas están disponibles en &lt;a href="http://www.opensuse.org"&gt;openSUSE 11.0&lt;/a&gt;, por lo que antes de pensar en compilarlas tu mismo, mejor descargalas usando el gestor de paquetes de tu distro (YaST, apt-get, yum, etc.), es mucho mas simple.&lt;br /&gt;&lt;br /&gt;La razón de que no corre en Windows es simple, no le he dado soporte. Si bien está desarrollado en Java, la detección de dependencias es solo para distribuciones Linux y los comandos de conversión no son los mismos en una distro Linux y en Windows. De todas formas estos dos aspectos son simples de modificar para portar la aplicación a Windows.&lt;br /&gt;&lt;br /&gt;Si alguien está interesado en dar el soporte para que esta aplicación corra en otros SO bienvenido sea, el código está bajo la licencia GPL 3.&lt;br /&gt;&lt;br /&gt;Dejo algunas imágenes a continuación:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_TGgpRudXV3w/SP1Op9DvN_I/AAAAAAAAAsE/ClfXiVpS_qQ/s1600-h/imagen1.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_TGgpRudXV3w/SP1Op9DvN_I/AAAAAAAAAsE/ClfXiVpS_qQ/s320/imagen1.png" alt="" id="BLOGGER_PHOTO_ID_5259446422510450674" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_TGgpRudXV3w/SP1OqHUqZzI/AAAAAAAAAsM/DT2bI9yNyxQ/s1600-h/imagen2.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_TGgpRudXV3w/SP1OqHUqZzI/AAAAAAAAAsM/DT2bI9yNyxQ/s320/imagen2.png" alt="" id="BLOGGER_PHOTO_ID_5259446425265792818" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_TGgpRudXV3w/SP1OqtrgjmI/AAAAAAAAAsU/N-2k6yB_6h0/s1600-h/imagen3.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_TGgpRudXV3w/SP1OqtrgjmI/AAAAAAAAAsU/N-2k6yB_6h0/s320/imagen3.png" alt="" id="BLOGGER_PHOTO_ID_5259446435562163810" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_TGgpRudXV3w/SP1Oq2ooHYI/AAAAAAAAAsc/HRg-TKfjrHg/s1600-h/imagen4.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://3.bp.blogspot.com/_TGgpRudXV3w/SP1Oq2ooHYI/AAAAAAAAAsc/HRg-TKfjrHg/s320/imagen4.png" alt="" id="BLOGGER_PHOTO_ID_5259446437965995394" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_TGgpRudXV3w/SP1OqyNkyrI/AAAAAAAAAsk/aoBoomJQrEw/s1600-h/imagen5.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://3.bp.blogspot.com/_TGgpRudXV3w/SP1OqyNkyrI/AAAAAAAAAsk/aoBoomJQrEw/s320/imagen5.png" alt="" id="BLOGGER_PHOTO_ID_5259446436778789554" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Saludos !!!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1421033339681316542-8119623726416743414?l=metalklesk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://metalklesk.blogspot.com/feeds/8119623726416743414/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://metalklesk.blogspot.com/2008/10/j-kiltro-40-beta-2-liberado.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1421033339681316542/posts/default/8119623726416743414'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1421033339681316542/posts/default/8119623726416743414'/><link rel='alternate' type='text/html' href='http://metalklesk.blogspot.com/2008/10/j-kiltro-40-beta-2-liberado.html' title='J-Kiltro 4.0 Beta 2 Liberado'/><author><name>Daniel Dario Morales Salas</name><uri>http://www.blogger.com/profile/07642586501018157497</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='28' src='http://3.bp.blogspot.com/_TGgpRudXV3w/SfP_sc5YZ3I/AAAAAAAABSs/APK4YFwjVn4/S220/yoft3.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_TGgpRudXV3w/SP1Op9DvN_I/AAAAAAAAAsE/ClfXiVpS_qQ/s72-c/imagen1.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1421033339681316542.post-1576155668406711156</id><published>2008-07-13T01:00:00.023-04:00</published><updated>2008-07-13T03:10:19.309-04:00</updated><title type='text'>VPN segura en openSUSE 11.0 y Windows XP con openVPN</title><content type='html'>&lt;div style="text-align: justify;"&gt;Hoy traigo una guía de instalación y configuración de una VPN segura utilizando el software openVPN sobre un servidor openSUSE 11.0 y clientes openSUSE 11.0 y Windows XP (SP3).&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;Me tomó un par de días hacerla ya que tuve que solucionar algunos problemas que sucedieron en el camino cuyas soluciones ahora son parte de la guía misma.&lt;br /&gt;&lt;br /&gt;Si tienen aportes a la guía con gusto la actualizaré, la idea es que nos sirva a todos.&lt;br /&gt;&lt;br /&gt;Agradeceré cualquier comentario constructivo.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;Índice de contenido&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=";font-family:verdana;font-size:78%;"  &gt;Resumen&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:verdana;font-size:78%;"  &gt;&lt;span style="font-weight: bold;"&gt;1&lt;/span&gt; Introducción&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:verdana;font-size:78%;"  &gt;&lt;span style="font-weight: bold;"&gt;1.1&lt;/span&gt; Objetivos generales&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:verdana;font-size:78%;"  &gt;&lt;span style="font-weight: bold;"&gt;1.2&lt;/span&gt; Objetivos específicos&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:verdana;font-size:78%;"  &gt;&lt;span style="font-weight: bold;"&gt;1.3&lt;/span&gt; Conceptos generales&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:verdana;font-size:78%;"  &gt;&lt;span style="font-weight: bold;"&gt;2&lt;/span&gt; Requerimientos&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:verdana;font-size:78%;"  &gt;&lt;span style="font-weight: bold;"&gt;3&lt;/span&gt; Instalación&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:verdana;font-size:78%;"  &gt;&lt;span style="font-weight: bold;"&gt;4&lt;/span&gt; Generación de llave y certificado maestro para unidad certificadora&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:verdana;font-size:78%;"  &gt;&lt;span style="font-weight: bold;"&gt;5&lt;/span&gt; Generación de llave y certificado para el servidor&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:verdana;font-size:78%;"  &gt;&lt;span style="font-weight: bold;"&gt;6&lt;/span&gt; Generación de llave y certificado para el cliente&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:verdana;font-size:78%;"  &gt;&lt;span style="font-weight: bold;"&gt;7&lt;/span&gt; Generación de firma HMAC tls-auth&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;7.1&lt;/span&gt; Servidor&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;7.2&lt;/span&gt; Cliente&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:verdana;font-size:78%;"  &gt;&lt;span style="font-weight: bold;"&gt;8&lt;/span&gt; Resumen de archivos creados&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:verdana;font-size:78%;"  &gt;&lt;span style="font-weight: bold;"&gt;9&lt;/span&gt; Configuración del servidor y el cliente&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;9.1&lt;/span&gt; Servidor&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;9.1.1&lt;/span&gt; Dando acceso a los clientes a la red local del servidor&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;9.1.2&lt;/span&gt; Subnet a Subnet&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;9.2&lt;/span&gt; Cliente (openSUSE 11.0)&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;9.2.1&lt;/span&gt; Sin control del usuario&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;9.2.2&lt;/span&gt; Con control del usuario&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;9.3&lt;/span&gt; Cliente (Windows XP)&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;10&lt;/span&gt; Revocar certificados&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;11&lt;/span&gt; Conclusiones&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;12&lt;/span&gt; Anexos&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:100%;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;Resumen&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Este documento explica paso a paso la instalación y configuración de una VPN segura utilizando el software openVPN.&lt;br /&gt;&lt;br /&gt;Una VPN (Virtual Private Network) es una red virtual privada que está compuesta por equipos (computadores, ordenadores) en una red. Se utilizan para crear redes seguras y privadas, mediante las cuales se puede hacer traspaso de información o utilización de recursos como carpetas (directorios) compartidas e impresoras.&lt;br /&gt;&lt;br /&gt;En este documento encontrará información detallada útil para montar un servidor sobre el sistema operativo openSUSE 11.0 y clientes openSUSE 11.0 y Windows XP.&lt;br /&gt;&lt;br /&gt;Para montar un servidor, múltiples clientes y manejar la seguridad se utilizarán certificados digitales y llaves privadas (tanto para el servidor como para el cliente), para lo cual se creará una unidad certificadora (CA) quien se encargará de emitir y gestionar los certificados digitales y llaves privadas.&lt;br /&gt;&lt;br /&gt;También se mostrará cómo agregar seguridad extra gracias a la firma HMAC tls-auth y revocación de certificados.&lt;br /&gt;&lt;br /&gt;Este documento es una adaptación de la guía de &lt;span style="font-weight: bold;"&gt;Jorge Armando Medina&lt;/span&gt; de openVPN para Slackware del 2006-05-03 (&lt;a href="http://tuxjm.net/docs/openvpn-como4slack/index.html"&gt;http://tuxjm.net/docs/openvpn-como4slack/index.html&lt;/a&gt;) a openSUSE 11.0 (servidor y cliente) y Windows XP (cliente) al 2008-07-13.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;1 Introducción&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Como se mencionó en el resumen de el presente documento, una VPN se utiliza para crear redes virtuales privadas, mediante las cuales podemos transferir información por un canal inseguro como es Internet de forma mas segura.&lt;br /&gt;&lt;br /&gt;Se utilizan, por ejemplo, para integrar a nuestra red local equipos o redes externas. Una aplicación posible es, por ejemplo, unir sucursales de una empresa de manera que puedan compartir recursos (directorios e impresoras, etc.), o conectar un equipo de nuestro hogar a la red local de la organización para obtener documentos de forma remota y segura (algo que seguramente a un gerente de la organización le gustaría).&lt;br /&gt;&lt;br /&gt;En este documento se tratarán las VPN seguras utilizando openVPN.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;1.1 Objetivos generales&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Con este documento se pretende dar una guía detallada para montar un servidor openVPN sobre el sistema operativo openSUSE 11.0, así como clientes openVPN montados sobre sistemas operativos openSUSE 11.0 y Windows XP.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;1.2 Objetivos específicos&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Montar un servidor openVPN en el sistema operativo openSUSE 11.0.&lt;/li&gt;&lt;/ul&gt;Para montar el servidor se mostrarán los pasos para la instalación de openVPN utilizando imágenes como apoyo, junto a la configuración del mismo detallando los comandos a utilizar así como imágenes ilustrativas.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Montar un cliente openVPN en el sistema operativo openSUSE 11.0.&lt;/li&gt;&lt;/ul&gt;Para montar el cliente se mostrarán los pasos para la instalación de openVPN utilizando imágenes como apoyo, junto a la configuración del mismo detallando los comandos a utilizar así como imágenes ilustrativas del proceso.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Montar un cliente openVPN en el sistema operativo Windows XP.&lt;/li&gt;&lt;/ul&gt;Para montar el cliente se mostrarán los pasos para la instalación de openVPN utilizando imágenes como apoyo, junto a la configuración del mismo utilizando imágenes ilustrativas del proceso.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;1.3 Conceptos generales&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Como se mencionó en la introducción, para crear una VPN utilizaremos openVPN. Un punto muy importante es la seguridad de nuestros datos, con openVPN podemos manejar esto utilizando certificados digitales X.509 y llaves privadas, tanto para el servidor como para los clientes.&lt;br /&gt;&lt;br /&gt;Para generar los certificados y llaves necesitamos una unidad certificadora, denominada CA (&lt;span style="font-weight: bold;"&gt;C&lt;/span&gt;ertificate &lt;span style="font-weight: bold;"&gt;A&lt;/span&gt;uthority). Esta CA necesita un certificado y llave maestro para generar los archivos para el servidor y clientes.&lt;br /&gt;&lt;br /&gt;En este documento mantendremos la CA y el servidor openVPN en la misma máquina, pero también se pueden tener separados en máquinas distintas.&lt;br /&gt;&lt;br /&gt;Para generar las llaves privadas se utiliza el protocolo Diffie Hellman (&lt;a href="http://es.wikipedia.org/wiki/Diffie-Hellman"&gt;http://es.wikipedia.org/wiki/Diffie-Hellman&lt;/a&gt;), el cual se usa para generar claves simétricas. Mediante éste mecanismo podemos crear una comunicación entre el cliente y el servidor, en donde se hace un intercambio de llave secreta de forma segura ya que utiliza encriptación de datos, de fábrica se utiliza un cifrado de 1024 bits, pero es parametrizable.&lt;br /&gt;&lt;br /&gt;Una vez que se tiene la CA configurada se procede a crear un certificado y una llave privada para el servidor y los clientes (cada certificado y llave privada es distinta para cada cliente y servidor).&lt;br /&gt;&lt;br /&gt;OpenVPN hace uso de interfaces TUN (&lt;a href="http://en.wikipedia.org/wiki/TUN/TAP"&gt;http://en.wikipedia.org/wiki/TUN/TAP&lt;/a&gt;) para crear una subred en la cual existirá comunicación entre el cliente y el servidor. Una interfaz TUN provee a la máquina cliente de una interfaz virtual de red mediante la cual podrá asignarse una IP de la subred desde el servidor.&lt;br /&gt;&lt;br /&gt;Para poder hacer uso de una interfaz virtual sin que entorpezca a la interfaz real (eth0 por ejemplo) se utiliza un &lt;span style="font-weight: bold;"&gt;bridge&lt;/span&gt;. En este bridge o puente es donde se “cuelgan” las interfaces de red “virtuales” y “reales” y hace de puente para la entrada o salida hacia y desde Internet o nuestra red local.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;De esta manera podemos tener un IP de red local 192.168.0.3 y una de la VPN como 10.8.0.6 al mismo tiempo, teniendo acceso a Internet sin problemas.&lt;br /&gt;&lt;br /&gt;Un bridge es muy útil cuando se utilizan máquinas virtuales ya que mediante interfaces virtuales (TUN/TAP) se les pueden asignar su propio IP estando en la misma máquina y todos pueden acceder a Internet o a la red sin problemas.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp2.blogger.com/_TGgpRudXV3w/SHmUNOGHMyI/AAAAAAAAAmo/QRB58FmXUvk/s1600-h/bridge.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp2.blogger.com/_TGgpRudXV3w/SHmUNOGHMyI/AAAAAAAAAmo/QRB58FmXUvk/s320/bridge.png" alt="" id="BLOGGER_PHOTO_ID_5222368197755745058" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;OpenVPN crea, de fábrica, una subred en el dominio 10.8.0.0/24.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;2 Requerimientos&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;El sistema operativo utilizado es openSUSE 11.0 (&lt;a href="http://www.opensuse.org/"&gt;http://www.opensuse.org&lt;/a&gt;), otras distribuciones o sistemas operativos también pueden funcionar siempre y cuando openVPN (&lt;a href="http://openvpn.net/"&gt;http://openvpn.net&lt;/a&gt;) pueda correr sobre ellos, pero no se da ninguna garantía de que funcione al pie de la letra, es posible que el directorio de instalación, la forma de configurar el cortafuegos, archivos, etc. sea distinto.&lt;br /&gt;&lt;br /&gt;Para el servidor (openSUSE 11.0) se requiere instalar:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;OpenVPN 2.0.9&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Para el cliente (openSUSE 11.0) se requiere instalar:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;OpenVPN 2.0.9&lt;/li&gt;&lt;li&gt;KnetworkManager&lt;/li&gt;&lt;li&gt;KnetworkManager-openvpn&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Para el cliente (Windows XP) se requiere instalar:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;OpenVPN 2.0.9&lt;/li&gt;&lt;li&gt;OpenVPN-gui 1.0.3&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;En el caso de el cliente y servidor openSUSE 11.0 se recomienda configurar los repositorios de software antes de instalar cualquier cosa, siempre es bueno tener el software actualizado.&lt;br /&gt;&lt;br /&gt;Para agregar los repositorios abrimos &lt;span style="font-style: italic;"&gt;YaST → Software → Repositorios de software → Añadir → Repositorios de la comunidad&lt;/span&gt; y ahí seleccionamos los que consideremos necesarios.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt; &lt;span style="font-weight: bold;"&gt;3 Instalación&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;En el caso de openSUSE, tanto para el servidor como el cliente hay que utilizar &lt;span style="font-style: italic;"&gt;YaST → Software → Instalar/Desinstalar software&lt;/span&gt; para instalar &lt;span style="font-weight: bold;"&gt;openVPN&lt;/span&gt;, el cual viene en el DVD.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp2.blogger.com/_TGgpRudXV3w/SHmVAGerMeI/AAAAAAAAAmw/5mBD7tK4E74/s1600-h/openvpn-opensuse-instalacion"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp2.blogger.com/_TGgpRudXV3w/SHmVAGerMeI/AAAAAAAAAmw/5mBD7tK4E74/s320/openvpn-opensuse-instalacion" alt="" id="BLOGGER_PHOTO_ID_5222369071884612066" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;En el caso de Windows XP podemos ir a &lt;a href="http://openvpn.se/"&gt;http://openvpn.se&lt;/a&gt; y descargar &lt;span style="font-weight: bold;"&gt;openVPN 2.0.9&lt;/span&gt; y &lt;span style="font-weight: bold;"&gt;openVPN-gui 1.03&lt;/span&gt; en el mismo paquete e instalarlo, si lo queremos en español entonces, además del paquete anterior, descargamos &lt;span style="font-weight: bold;"&gt;openvpn-gui-1.0.3-es&lt;/span&gt; y lo copiamos al directorio bin de instalación de openVPN (C:\Archivos de programa\OpenVPN\bin).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;4 Generación de llave y certificado para la unidad certificadora&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Lo primero es generar  los certificados y llaves necesarios para la unidad certificadora (CA). Para tal tarea utilizaremos unos scripts que vienen hechos en openVPN, específicamente la versión 2.0. Estos scripts están en el directorio /usr/share/openvpn/easy-rsa/2.0/&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp1.blogger.com/_TGgpRudXV3w/SHmXBPLaIgI/AAAAAAAAAm4/W1gx8ixRCN0/s1600-h/scripts-easy-rsa.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp1.blogger.com/_TGgpRudXV3w/SHmXBPLaIgI/AAAAAAAAAm4/W1gx8ixRCN0/s320/scripts-easy-rsa.png" alt="" id="BLOGGER_PHOTO_ID_5222371290422845954" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;y debemos copiarlos al siguiente directorio &lt;span style="font-weight: bold;"&gt;/etc/openvpn/easy-rsa-V2.0/&lt;/span&gt; el cual debemos crear previamente, para esto como usuario root escribimos lo siguiente en la consola:&lt;br /&gt;&lt;blockquote&gt;#mkdir /etc/openvpn/easy-rsa-V2.0/&lt;/blockquote&gt;&lt;br /&gt;y luego copiamos los scripts al directorio recién creado:&lt;br /&gt;&lt;blockquote&gt;#cp /usr/share/openvpn/easy-rsa/2.0/* /etc/openvpn/easy-rsa-V2.0&lt;/blockquote&gt;&lt;br /&gt;luego crearemos el directorio keys dentro del directorio previamente creado:&lt;br /&gt;&lt;blockquote&gt;#mkdir -p /etc/openvpn/easy-rsa-V2.0/keys&lt;/blockquote&gt;&lt;br /&gt;y tendremos el directorio listo para configurar como se ve en la siguiente imagen:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp1.blogger.com/_TGgpRudXV3w/SHmX42y_IdI/AAAAAAAAAnA/dauj_o6QOio/s1600-h/scripts-easy-rsa-final.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp1.blogger.com/_TGgpRudXV3w/SHmX42y_IdI/AAAAAAAAAnA/dauj_o6QOio/s320/scripts-easy-rsa-final.png" alt="" id="BLOGGER_PHOTO_ID_5222372245950636498" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;De ahora en adelante trabajaremos con los scripts del directorio &lt;span style="font-weight: bold;"&gt;/etc/openvpn/easy-rsa-V2.0/&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Con el siguiente comando entramos al directorio de trabajo:&lt;br /&gt;&lt;blockquote&gt;#cd /etc/openvpn/easy-rsa-V2.0&lt;/blockquote&gt;&lt;br /&gt;El siguiente paso corresponde a la configuración de algunos parámetros en el archivo vars. Para esto abrimos dicho archivo con kwrite u otro editor de texto:&lt;br /&gt;&lt;blockquote&gt;#kwrite vars&lt;/blockquote&gt;&lt;br /&gt;y bajamos hasta el bloque final donde se exportan las variables que definen a la CA.&lt;br /&gt;&lt;blockquote&gt;KEY_COUNTRY&lt;br /&gt;KEY_PROVINCE&lt;br /&gt;KEY_CITY&lt;br /&gt;KEY_ORG&lt;br /&gt;KEY_EMAIL&lt;/blockquote&gt;&lt;br /&gt;Éstas variables deben ser definidas según los datos que correspondan a la organización.&lt;br /&gt;&lt;br /&gt;Además podemos cambiar el tamaño de la llave, que de fábrica viene con el valor de 1024 bits, mientras mas alto sea el valor, mas seguro será el sistema pero la validación se hará mas lenta. 1024 es un valor razonable, pero como dice el archivo de configuración, si somos paranoicos lo subimos a 2048 bits.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp2.blogger.com/_TGgpRudXV3w/SHmYT-DM-8I/AAAAAAAAAnI/zLfWKIcsRl4/s1600-h/vars.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp2.blogger.com/_TGgpRudXV3w/SHmYT-DM-8I/AAAAAAAAAnI/zLfWKIcsRl4/s320/vars.png" alt="" id="BLOGGER_PHOTO_ID_5222372711754169282" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Una vez definidas las variables ejecutamos el siguiente comando:&lt;br /&gt;&lt;blockquote&gt;#source ./vars&lt;/blockquote&gt;&lt;br /&gt;si todo sale bien deberíamos obtener la siguiente salida:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;NOTE: If you run ./clean-all, I will be doing a rm -rf on&lt;br /&gt;/etc/openvpn/easy-rsa-V2.0/keys&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Ahora generaremos los parámetros &lt;span style="font-style: italic;"&gt;Diffie Hellman&lt;/span&gt; para lo cual simplemente ejecutamos el archivo build-dh:&lt;br /&gt;&lt;blockquote&gt;#./build-dh&lt;/blockquote&gt;&lt;br /&gt;y si todo sale bien deberíamos ver la siguiente salida:&lt;br /&gt;&lt;blockquote&gt;Generating DH parameters, 1024 bit long safe prime, generator 2&lt;br /&gt;This is going to take a long time&lt;br /&gt;......+.+..............+...................................................................&lt;br /&gt;....+...........................+................................+.........................&lt;br /&gt;...........+.......................................+......................+................&lt;br /&gt;............................+................................................................&lt;br /&gt;..............................................................+..............................&lt;br /&gt;.....................+...........................................+..........................&lt;br /&gt;........................+....................................................................&lt;br /&gt;+........................+..........................................+......................&lt;br /&gt;................................................+....+......................................&lt;br /&gt;..............................................................................................&lt;br /&gt;....................................+........................................................&lt;br /&gt;.................................................+......+...............................+..&lt;br /&gt;..............+........................................+....................................&lt;br /&gt;+........................+..........++*++*++*&lt;/blockquote&gt;&lt;br /&gt;tal como se ve en la siguiente imagen:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp2.blogger.com/_TGgpRudXV3w/SHmZHjtNO2I/AAAAAAAAAnQ/0d3vrm3Czsk/s1600-h/build-dh.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp2.blogger.com/_TGgpRudXV3w/SHmZHjtNO2I/AAAAAAAAAnQ/0d3vrm3Czsk/s320/build-dh.png" alt="" id="BLOGGER_PHOTO_ID_5222373598035786594" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Ahora crearemos el certificado para la CA, para esto escribimos en consola el siguiente comando:&lt;br /&gt;&lt;blockquote&gt;#./pkitool --initca&lt;/blockquote&gt;&lt;br /&gt;con lo cual debemos obtener la siguiente salida:&lt;br /&gt;&lt;blockquote&gt;Using CA Common Name: Metalklesk's enterprise CA&lt;br /&gt;Generating a 1024 bit RSA private key&lt;br /&gt;........................................++++++&lt;br /&gt;......++++++&lt;br /&gt;writing new private key to 'ca.key'&lt;br /&gt;-----&lt;/blockquote&gt;&lt;br /&gt;tal como se ve en la siguiente imagen:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp3.blogger.com/_TGgpRudXV3w/SHmZb76Bd1I/AAAAAAAAAnY/Qa_KPSbMazg/s1600-h/initca.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp3.blogger.com/_TGgpRudXV3w/SHmZb76Bd1I/AAAAAAAAAnY/Qa_KPSbMazg/s320/initca.png" alt="" id="BLOGGER_PHOTO_ID_5222373948129376082" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;5 Generación de llave y certificado para el servidor&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Para esta tarea escribimos el siguiente comando en la consola:&lt;br /&gt;&lt;blockquote&gt;#./pkitool --server servidor&lt;/blockquote&gt;&lt;br /&gt;con lo cual obtendremos una salida parecida a la siguiente:&lt;br /&gt;&lt;blockquote&gt;Generating a 1024 bit RSA private key&lt;br /&gt;............++++++&lt;br /&gt;...++++++&lt;br /&gt;writing new private key to 'servidor.key'&lt;br /&gt;-----&lt;br /&gt;Using configuration from /etc/openvpn/easy-rsa-V2.0/openssl.cnf&lt;br /&gt;Check that the request matches the signature&lt;br /&gt;Signature ok&lt;br /&gt;The Subject's Distinguished Name is as follows&lt;br /&gt;countryName           :PRINTABLE:'CL'&lt;br /&gt;stateOrProvinceName   :PRINTABLE:'RM'&lt;br /&gt;localityName          :PRINTABLE:'Santiago'&lt;br /&gt;organizationName      :PRINTABLE:'Metalklesk's enterprise'&lt;br /&gt;commonName            :PRINTABLE:'servidor'&lt;br /&gt;emailAddress          :IA5STRING:'damorales@gmail.com'&lt;br /&gt;Certificate is to be certified until Jul  6 01:08:42 2018 GMT (3650 days)&lt;br /&gt;&lt;br /&gt;Write out database with 1 new entries&lt;br /&gt;Data Base Updated&lt;/blockquote&gt;&lt;br /&gt;tal como se ve en la siguiente imagen:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp2.blogger.com/_TGgpRudXV3w/SHmZ5HhPIfI/AAAAAAAAAng/M1po9wkgz5o/s1600-h/server-cert.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp2.blogger.com/_TGgpRudXV3w/SHmZ5HhPIfI/AAAAAAAAAng/M1po9wkgz5o/s320/server-cert.png" alt="" id="BLOGGER_PHOTO_ID_5222374449462845938" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Con lo anterior tenemos la unidad certificadora CA y el servidor listos (ambos en el mismo equipo).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;6 Generación de llave y certificado para el cliente&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Para generar el certificado y llave para un cliente escribimos en la consola el siguiente comando:&lt;br /&gt;&lt;blockquote&gt;#./pkitool cliente1&lt;/blockquote&gt;&lt;br /&gt;de lo cual obtendremos una salida parecida a la siguiente:&lt;br /&gt;&lt;blockquote&gt;Generating a 1024 bit RSA private key&lt;br /&gt;...............++++++&lt;br /&gt;............................................++++++&lt;br /&gt;writing new private key to 'cliente1.key'&lt;br /&gt;-----&lt;br /&gt;Using configuration from /etc/openvpn/easy-rsa-V2.0/openssl.cnf&lt;br /&gt;Check that the request matches the signature&lt;br /&gt;Signature ok&lt;br /&gt;The Subject's Distinguished Name is as follows&lt;br /&gt;countryName           :PRINTABLE:'CL'&lt;br /&gt;stateOrProvinceName   :PRINTABLE:'RM'&lt;br /&gt;localityName          :PRINTABLE:'Santiago'&lt;br /&gt;organizationName      :PRINTABLE:'Metalklesk's enterprise'&lt;br /&gt;commonName            :PRINTABLE:'cliente1'&lt;br /&gt;emailAddress          :IA5STRING:'damorales@gmail.com'&lt;br /&gt;Certificate is to be certified until Jul  6 01:13:40 2018 GMT (3650 days)&lt;br /&gt;&lt;br /&gt;Write out database with 1 new entries&lt;br /&gt;Data Base Updated&lt;/blockquote&gt;&lt;br /&gt;tal como se ve en la siguiente imagen:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp2.blogger.com/_TGgpRudXV3w/SHmaaHxbgZI/AAAAAAAAAno/CgUG92XL93Y/s1600-h/client-cert.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp2.blogger.com/_TGgpRudXV3w/SHmaaHxbgZI/AAAAAAAAAno/CgUG92XL93Y/s320/client-cert.png" alt="" id="BLOGGER_PHOTO_ID_5222375016466448786" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Cada vez que se quiera agregar un nuevo cliente ejecutamos el comando&lt;br /&gt;&lt;blockquote&gt;#source ./vars&lt;/blockquote&gt;&lt;br /&gt;y luego&lt;br /&gt;&lt;blockquote&gt;#./pkitool clienteN&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;No olvidar que antes de agregar un nuevo cliente se debe ejecutar &lt;span style="font-weight: bold;"&gt;#source ./vars&lt;/span&gt; y luego usar la herramienta &lt;span style="font-weight: bold;"&gt;pkitool&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;7 Generación de firma HMAC tls-auth&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;La firma HMAC tls-auth provee un nivel de seguridad adicional al SSL/TLS, ya que cualquier paquete que no contenga la firma será bloqueado automáticamente. Este nivel extra de seguridad permite proteger contra:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Ataques &lt;span style="font-weight: bold;"&gt;DoS&lt;/span&gt; (Deny of Service) en el puerto UDP (1194) de openVPN.&lt;/li&gt;&lt;li&gt;Escaneo de puertos para determinar cual es el puerto UDP del servidor que está a la escucha.&lt;/li&gt;&lt;li&gt;Vulnerabilidades de desbordamiento de buffer en la implementación SSL/TLS.&lt;/li&gt;&lt;li&gt;Inicialización de negociaciones SSL/TLS de máquina que no están autorizadas.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Para utilizar este nivel extra de seguridad (lo cual es extremadamente recomendable, pero no obligatorio) se debe crear una llave secreta compartida, la cual utilizarán el servidor y los clientes. Dicha llave debe ser pasada al cliente por un canal seguro como ssh u otro. Se puede guardar en el mismo directorio que los otros archivos (ca.crt, cliente1.crt, cliente1.key).&lt;br /&gt;&lt;br /&gt;Para crear la llave utilizamos el siguiente comando en el lado servidor y como usuario root:&lt;br /&gt;&lt;blockquote&gt;#openvpn --genkey --secret ta.key&lt;/blockquote&gt;&lt;br /&gt;La llave creada corresponde a &lt;span style="font-weight: bold;"&gt;ta.key&lt;/span&gt;. Una vez creada se deben configurar el servidor y los clientes.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;7.1 Servidor&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;En el archivo&lt;span style="font-weight: bold;"&gt; server.conf&lt;/span&gt; se debe agregar la siguiente linea:&lt;br /&gt;&lt;blockquote&gt;tls-auth ta.key 0&lt;/blockquote&gt;&lt;br /&gt;Si el archivo &lt;span style="font-weight: bold;"&gt;ta.key&lt;/span&gt; está en un directorio distinto a donde está el archivo server.conf, entonces se debe dar la ruta completa (por ejemplo /etc/openvpn/directorio/ta.key).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;7.2 Cliente&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;En el archivo &lt;span style="font-weight: bold;"&gt;client.conf&lt;/span&gt; (en el caso de openSUSE 11.0) o &lt;span style="font-weight: bold;"&gt;client.ovpn&lt;/span&gt; (en el caso de Windows XP) se debe agregar la siguiente linea:&lt;br /&gt;&lt;blockquote&gt;tls-auth ta.key 1&lt;/blockquote&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;8 Resumen archivos creados&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Todos los certificados y llaves que vayamos creando quedarán almacenados en el directorio &lt;span style="font-style: italic;"&gt;/etc/openvpn/easy-rsa-V2.0/keys&lt;/span&gt;. A continuación podemos ver la lista de archivos creados y visto a lo largo de este documento.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp0.blogger.com/_TGgpRudXV3w/SHmcQs6viiI/AAAAAAAAAnw/Ui7KtGtpSMs/s1600-h/tabla.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp0.blogger.com/_TGgpRudXV3w/SHmcQs6viiI/AAAAAAAAAnw/Ui7KtGtpSMs/s320/tabla.png" alt="" id="BLOGGER_PHOTO_ID_5222377053662186018" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Nótese que todas las llaves (.key) son privadas mientras que los certificados (.crt) no lo son.&lt;br /&gt;&lt;br /&gt;Ahora es necesario pasar una copia de los archivos c&lt;span style="font-style: italic;"&gt;a.crt, cliente1.crt, cliente1.key y ta.key&lt;/span&gt; al &lt;span style="font-weight: bold;"&gt;cliente 1&lt;/span&gt; a través de algún medio seguro como &lt;span style="font-weight: bold;"&gt;ssh&lt;/span&gt; u otro mecanismo que estimemos como seguro y conveniente.&lt;br /&gt;&lt;br /&gt;Podemos crear una carpeta e introducir los archivos anteriormente mencionados y luego darles los permisos correspondientes (&lt;span style="font-weight: bold;"&gt;755&lt;/span&gt;) para luego entregárselos al cliente.&lt;br /&gt;&lt;blockquote&gt;#mkdir ~/cliente1&lt;br /&gt;#cd keys/&lt;br /&gt;#cp -v ca.crt cliente1.crt cliente1.key ta.key ~/cliente1&lt;br /&gt;#chmod -R 755 ~/cliente1&lt;/blockquote&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;9 Configuración del servidor y el cliente&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;OpenVPN trae archivos de configuración de ejemplo que pueden ser utilizados como base para nuestra propia configuración, los cuales se encuentran en el directorio &lt;span style="font-style: italic;"&gt;/usr/share/doc/packages/openvpn/sample-config-files&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;De dicho directorio nos interesan los archivos &lt;span style="font-weight: bold;"&gt;client.conf&lt;/span&gt; y &lt;span style="font-weight: bold;"&gt;server.conf&lt;/span&gt;. El archivo server.conf va en la máquina servidor de openVPN, mientras que el archivo client.conf va en la máquina cliente. El archivo server.conf lo copiaremos al directorio &lt;span style="font-style: italic;"&gt;/etc/openvpn&lt;/span&gt;.&lt;br /&gt;&lt;blockquote&gt;#cd /usr/share/doc/packages/openvpn/sample-config-files&lt;br /&gt;#cp server.conf /etc/openvpn&lt;/blockquote&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;9.1 Servidor&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Ahora debemos configurar el archivo server.conf de manera que se apunte a los archivos creados anteriormente, los cuales están en el directorio /etc/openvpn/easy-rsa-V2.0/keys. Para ésto abrimos el archivo server.conf&lt;br /&gt;&lt;blockquote&gt;#cd /etc/openvpn&lt;br /&gt;#kwrite server.conf&lt;/blockquote&gt;&lt;br /&gt;el cual debe quedar así:&lt;br /&gt;&lt;blockquote&gt;ca /etc/openvpn/easy-rsa-V2.0/keys/ca.crt&lt;br /&gt;cert /etc/openvpn/easy-rsa-V2.0/keys/servidor.crt&lt;br /&gt;key /etc/openvpn/easy-rsa-V2.0/keys/servidor.key&lt;br /&gt;dh /etc/openvpn/easy-rsa-V2.0/keys/dh1024.pem&lt;/blockquote&gt;&lt;br /&gt;tal como se ve en la siguiente imagen:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp2.blogger.com/_TGgpRudXV3w/SHmdNi3la-I/AAAAAAAAAn4/CBjLm-P2gyk/s1600-h/server-conf.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp2.blogger.com/_TGgpRudXV3w/SHmdNi3la-I/AAAAAAAAAn4/CBjLm-P2gyk/s320/server-conf.png" alt="" id="BLOGGER_PHOTO_ID_5222378098936605666" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Una vez configurado el servidor solo resta iniciarlo, para esto escribimos en consola:&lt;br /&gt;&lt;blockquote&gt;#service openvpn start&lt;/blockquote&gt;&lt;br /&gt;o lo iniciamos desde YaST (&lt;span style="font-style: italic;"&gt;YaST → Sistema → Servicios del sistema → activar servicio openvpn&lt;/span&gt;) para que al iniciar el sistema automáticamente se inicie el servidor openVPN.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp2.blogger.com/_TGgpRudXV3w/SHmder6RSbI/AAAAAAAAAoA/8-Rra5Akj0g/s1600-h/openvpn-opensuse-servidor"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp2.blogger.com/_TGgpRudXV3w/SHmder6RSbI/AAAAAAAAAoA/8-Rra5Akj0g/s320/openvpn-opensuse-servidor" alt="" id="BLOGGER_PHOTO_ID_5222378393421564338" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Una vez listo solo resta abrir el puerto &lt;span style="font-weight: bold;"&gt;1194&lt;/span&gt; en el cortafuegos, para esto utilizamos &lt;span style="font-style: italic;"&gt;YaST → Seguridad y usuarios → Cortafuegos → Servicios autorizados → Opciones avanzadas&lt;/span&gt; y agregamos el puerto 1194 en la entrada &lt;span style="font-weight: bold;"&gt;UDP&lt;/span&gt;, guardamos y listo.&lt;br /&gt;&lt;br /&gt;Si no abrimos el puerto en el cortafuegos los clientes no se podrán conectar al servidor openVPN.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;9.1.1 Dando acceso a los clientes a la red local&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Hasta ahora tenemos una comunicación punto a punto entre el cliente y el servidor, pero puede darse el caso en que se requiera que el cliente (que está externo a la red) pueda ver a otros equipos en la red del servidor, para esto debemos agregar la siguiente linea en el archivo &lt;span style="font-weight: bold;"&gt;server.conf&lt;/span&gt;:&lt;br /&gt;&lt;blockquote&gt;push “route subred-local mascara-subred-local”&lt;/blockquote&gt;&lt;br /&gt;en donde &lt;span style="font-weight: bold;"&gt;subred-local&lt;/span&gt; podría ser &lt;span style="font-style: italic;"&gt;192.168.0.0&lt;/span&gt; y la &lt;span style="font-weight: bold;"&gt;mascara-subred-local&lt;/span&gt; podria ser &lt;span style="font-style: italic;"&gt;255.255.0.0 &lt;/span&gt;quedando así:&lt;br /&gt;&lt;blockquote&gt;push “route 192.168.0.0 255.255.0.0”&lt;/blockquote&gt;&lt;br /&gt;En el caso de que el servidor openVPN y el gateway estén en máquinas distintas, será necesario configurar la ruta en el gateway de la LAN en el lado servidor para enrutar la subred del cliente VPN (10.8.0.0/24) hacia el servidor openVPN.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;9.1.2 Subnet a Subnet&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Hasta ahora hemos asumido que la máquina cliente se conecta a la VPN como una sola máquina, pero supongamos que la máquina cliente es un gateway para una LAN local (como la oficina de casa u otra red de una sucursal de nuestra organización), y quisiéramos que cada máquina en la LAN de el cliente sea ruteada a través de la VPN.&lt;br /&gt;&lt;br /&gt;Para este ejemplo, asumiremos que la LAN del cliente esta usando la subred &lt;span style="font-weight: bold;"&gt;192.168.15.0/24,&lt;/span&gt; y que el cliente VPN esta usando un certificado con el common name de &lt;span style="font-weight: bold;"&gt;cliente1&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Nuestra meta es configurar la VPN de manera que cualquier máquina en la LAN de el cliente se pueda comunicar con cualquier máquina en la LAN de el servidor a través de la VPN.&lt;br /&gt;&lt;br /&gt;Antes de configurarlo, hay unos pre requisitos básicos que deben de seguirse:&lt;br /&gt;&lt;br /&gt;La LAN de el cliente (192.168.15.0/24 en nuestro ejemplo) no debe de ser exportada a la VPN por el servidor o algún cliente que este usando la misma subred. Cada subred que sea unida a la VPN vía enrutamiento debe de ser única.&lt;br /&gt;El cliente debe de tener un certificado con un &lt;span style="font-style: italic;"&gt;Common Name&lt;/span&gt; único (cliente1 en nuestro ejemplo), y la directiva &lt;span style="font-weight: bold;"&gt;duplicate-cn&lt;/span&gt; no debe de ser usada en el archivo de configuración de el servidor OpenVPN (server.conf).&lt;br /&gt;&lt;br /&gt;Ahora trataremos con los cambios de configuración necesarios en el lado de el servidor. Si el archivo de configuración de el servidor actualmente no hace ninguna referencia a el directorio de configuraciones de clientes, agreguemos una ahora:&lt;br /&gt;&lt;blockquote&gt;client-config-dir ccd&lt;/blockquote&gt;&lt;br /&gt;En la directiva de arriba, &lt;span style="font-weight: bold;"&gt;ccd&lt;/span&gt; debe de ser el nombre de un directorio el cual ha sido pre-creado en el directorio predeterminado donde el demonio de el servidor openVPN corre, en este documento estamos usando &lt;span style="font-style: italic;"&gt;/etc/openvpn/&lt;/span&gt;. Crearemos el directorio ccd con lo cual nos quedaria:&lt;br /&gt;&lt;blockquote&gt;client-config-dir /etc/openvpn/ccd&lt;/blockquote&gt;&lt;br /&gt;Cuando un nuevo cliente se conecta al servidor OpenVPN, el demonio revisará este directorio en busca de algún archivo que concuerde con el common name de el certificado de el cliente que se conecta. Si un archivo concuerda, sera leído y procesado para aplicar directivas adicionales a dicho cliente.&lt;br /&gt;&lt;br /&gt;El siguiente paso es crear un archivo de texto llamado cliente1 en el directorio ccd (si, sin extensión). Este archivo debe contener la siguiente linea:&lt;br /&gt;&lt;blockquote&gt;iroute 192.168.15.0/24 255.255.255.0&lt;/blockquote&gt;&lt;br /&gt;Esto le dirá a el servidor openVPN que la subred &lt;span style="font-style: italic;"&gt;192.168.15.0/24&lt;/span&gt; debe de ser enrutada al &lt;span style="font-style: italic;"&gt;cliente1&lt;/span&gt;. Después, agregaremos la siguiente linea a el archivo de configuración principal de el servidor (server.conf ):&lt;br /&gt;&lt;blockquote&gt;route 192.168.15.0/24 255.255.255.0&lt;/blockquote&gt;&lt;br /&gt;Ahora, si queremos que otros clientes de la VPN puedan tener tráfico de red con el cliente1 (comunicación de cliente a cliente) entonces debemos agregar las siguientes lineas al archivo de configuración del servidor (server.conf):&lt;br /&gt;&lt;blockquote&gt;client-to-client&lt;br /&gt;push “route 192.168.15.0/24 255.255.255.0”&lt;/blockquote&gt;&lt;br /&gt;Con lo anterior el servidor openVPN anunciará  la subred cliente1 a los otros clientes que se conecten de manera tal que puedan llegar a dicha subred.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;9.2 Cliente (openSUSE 11.0)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Existen varias formas de conectar un cliente openSUSE 11.0 a un servidor openVPN. Una es configurando todo a mano y corriéndolo en el background del sistema, sin control del usuario y otra es utilizando alguna aplicación que le de control al usuario.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;9.2.1 Sin control del usuario&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;El archivo &lt;span style="font-weight: bold;"&gt;client.conf&lt;/span&gt; debe ir en la raíz de la carpeta de openVPN (/etc/openvpn en el caso de openSUSE 11.0) en la máquina del cliente y se debe editar de manera tal que se apunte a los archivos recibidos desde el servidor (ca.crt, cliente1.crt y cliente1.key). Estos archivos podemos copiarlos donde queramos, por ejemplo en /etc/openvpn. Una vez ahí configuramos el archivo &lt;span style="font-style: italic;"&gt;client.conf&lt;/span&gt; como se ve a continuación:&lt;br /&gt;&lt;blockquote&gt;ca /etc/openvpn/ca.crt&lt;br /&gt;cert /etc/openvpn/cliente1.crt&lt;br /&gt;key /etc/openvpn/cliente1.key&lt;/blockquote&gt;&lt;br /&gt;Los archivos deben tener los siguientes permisos:&lt;br /&gt;&lt;blockquote&gt;ca.crt → 644&lt;br /&gt;cliente1.crt → 644&lt;br /&gt;cliente1.key → 600&lt;/blockquote&gt;&lt;br /&gt;para lo cual basta escribir lo siguiente en consola:&lt;br /&gt;&lt;blockquote&gt;#chmod 644 ca.crt&lt;br /&gt;#chmod 644 cliente1.crt&lt;br /&gt;#chmod 600 cliente1.key&lt;/blockquote&gt;&lt;br /&gt;y además se debe modificar la siguiente linea:&lt;br /&gt;&lt;blockquote&gt;remote my-server-1 1194&lt;/blockquote&gt;&lt;br /&gt;en donde&lt;span style="font-weight: bold;"&gt; my-server-1&lt;/span&gt; corresponde al IP o host-name del servidor openVPN seguido del puerto por el cual se esta prestando el servicio (si hemos seguido la guía al pie de la letra, el puerto no se cambia).&lt;br /&gt;&lt;br /&gt;Ahora solo resta conectarse al servidor, para esto podemos escribir en la consola lo siguiente:&lt;br /&gt;&lt;blockquote&gt;#service openvpn start&lt;/blockquote&gt;&lt;br /&gt;y automáticamente se leerá el archivo de configuración (client.conf) y se realizará la conexión.&lt;br /&gt;&lt;br /&gt;Ahora para probar, desde el servidor podemos hacer un ping al IP asignado al cliente y se podrá comprobar que se puede realizar sin problema.&lt;br /&gt;&lt;br /&gt;Para saber que IP fue asignado al cliente se puede ejecutar el comando (en la máquina cliente):&lt;br /&gt;&lt;blockquote&gt;#ifconfig&lt;/blockquote&gt;&lt;br /&gt;el cual arrojará las interfaces de red, donde &lt;span style="font-weight: bold;"&gt;tun0&lt;/span&gt; corresponde a la asignada por openVPN, la cual tiene una IP que le corresponde.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;9.2.2 Con control del usuario&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Para dar control al usuario podemos utilizar herramientas gráficas existentes para conectarnos a la VPN. Existen varias, dos de ellas son KVPNC y KNetworkManager (con el plugin de openVPN).&lt;br /&gt;&lt;br /&gt;Para ésta guía utilizaremos el segundo.&lt;br /&gt;&lt;br /&gt;Lo primero es instalar KNetworkManager y el plugin KNetworkManager-openVPN, para esto ir a YaST → Software → Instalar/Desinstalar software, escribimos &lt;span style="font-weight: bold;"&gt;knetworkmanager&lt;/span&gt; y marcamos los paquetes correspondientes para luego instalarlos.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp1.blogger.com/_TGgpRudXV3w/SHmgEWSdcDI/AAAAAAAAAoI/QSD1V7EzPdA/s1600-h/knetworkmanager-instalacion"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp1.blogger.com/_TGgpRudXV3w/SHmgEWSdcDI/AAAAAAAAAoI/QSD1V7EzPdA/s320/knetworkmanager-instalacion" alt="" id="BLOGGER_PHOTO_ID_5222381239475728434" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Una vez instalados debemos configurar la conexión de red para que use &lt;span style="font-weight: bold;"&gt;Network Manager&lt;/span&gt; en vez del método tradicional &lt;span style="font-weight: bold;"&gt;ifup&lt;/span&gt; (que viene de fábrica). Para esto vamos a &lt;span style="font-style: italic;"&gt;YaST → Dispositivos de red → Ajustes de la red&lt;/span&gt;, luego vamos a las &lt;span style="font-weight: bold;"&gt;Opciones globales&lt;/span&gt; y seleccionamos el uso de &lt;span style="font-weight: bold;"&gt;Network Manager&lt;/span&gt;, luego finalizamos.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp1.blogger.com/_TGgpRudXV3w/SHmgas7giMI/AAAAAAAAAoQ/h-Nu6Edx-y4/s1600-h/networkmanager-config"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp1.blogger.com/_TGgpRudXV3w/SHmgas7giMI/AAAAAAAAAoQ/h-Nu6Edx-y4/s320/networkmanager-config" alt="" id="BLOGGER_PHOTO_ID_5222381623510599874" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Una vez listo ejecutamos &lt;span style="font-weight: bold;"&gt;KnetworkManager&lt;/span&gt;, nos aparecerá un icono en la bandeja del sistema. Le damos &lt;span style="font-style: italic;"&gt;click derecho → Editar conexiones → Nueva conexión → VPN&lt;/span&gt;, en &lt;span style="font-weight: bold;"&gt;gateway&lt;/span&gt; ponemos la dirección IP del servidor openVPN, el &lt;span style="font-weight: bold;"&gt;port&lt;/span&gt; corresponde al 1194, luego le pasamos el &lt;span style="font-weight: bold;"&gt;CA file&lt;/span&gt; (ca.crt), el &lt;span style="font-weight: bold;"&gt;certificado del cliente&lt;/span&gt; (cliente1.crt) y &lt;span style="font-weight: bold;"&gt;la llave del cliente&lt;/span&gt; (cliente1.key), luego en la pestaña de &lt;span style="font-weight: bold;"&gt;información opcional&lt;/span&gt; marcamos &lt;span style="font-weight: bold;"&gt;Use LZO compression&lt;/span&gt;. Luego presionamos siguiente y le damos un nombre a la conexión.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp0.blogger.com/_TGgpRudXV3w/SHmg2ubfrUI/AAAAAAAAAoY/DTaMNqgAyPQ/s1600-h/knetworkmanager-config1"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp0.blogger.com/_TGgpRudXV3w/SHmg2ubfrUI/AAAAAAAAAoY/DTaMNqgAyPQ/s320/knetworkmanager-config1" alt="" id="BLOGGER_PHOTO_ID_5222382104949534018" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp2.blogger.com/_TGgpRudXV3w/SHmg2woo1TI/AAAAAAAAAog/AGuOb5sB_To/s1600-h/knetworkmanager-config2"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp2.blogger.com/_TGgpRudXV3w/SHmg2woo1TI/AAAAAAAAAog/AGuOb5sB_To/s320/knetworkmanager-config2" alt="" id="BLOGGER_PHOTO_ID_5222382105541530930" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Una vez listo guardamos. Ahora para conectarnos hacemos click derecho en el icono de &lt;span style="font-style: italic;"&gt;KnetworkManager → Iniciar conexión VPN&lt;/span&gt; y pinchamos el nombre de nuestra conexión, nos pedirá una contraseña, puede ser cualquier cosa y aceptamos.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp2.blogger.com/_TGgpRudXV3w/SHmhLDdf7NI/AAAAAAAAAoo/K5e5EGulLvQ/s1600-h/knetworkmanager-conectar1"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp2.blogger.com/_TGgpRudXV3w/SHmhLDdf7NI/AAAAAAAAAoo/K5e5EGulLvQ/s320/knetworkmanager-conectar1" alt="" id="BLOGGER_PHOTO_ID_5222382454192467154" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp3.blogger.com/_TGgpRudXV3w/SHmhLGCA8mI/AAAAAAAAAow/FMdxU5V7hwg/s1600-h/knetworkmanager-conectar2"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp3.blogger.com/_TGgpRudXV3w/SHmhLGCA8mI/AAAAAAAAAow/FMdxU5V7hwg/s320/knetworkmanager-conectar2" alt="" id="BLOGGER_PHOTO_ID_5222382454882497122" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Ahora para comprobar que nos hemos conectado abrimos una consola y escribimos (como usuario root):&lt;br /&gt;&lt;blockquote&gt;#ifconfig&lt;/blockquote&gt;&lt;br /&gt;y veremos que se a agregado la interfaz &lt;span style="font-weight: bold;"&gt;tun0&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Si hacemos desde, el servidor, un ping al IP de esa interfaz del cliente veremos que se realiza sin problemas ya que la VPN se ha establecido correctamente.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;9.3 Cliente (Windows XP)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;En el caso de Windows XP se debe instalar openVPN y openVPN-GUI (&lt;a href="http://openvpn.se/"&gt;http://openvpn.se&lt;/a&gt;). Una vez instalados copiamos los archivos entregados por el servidor (ca.crt, cliente1.crt y cliente1.key) a el directorio que queramos, por ejemplo &lt;span style="font-style: italic;"&gt;C:\\keys&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Una vez ahí vamos al directorio &lt;span style="font-style: italic;"&gt;C:\Archivos de programa\OpenVPN\sample-config&lt;/span&gt; y copiamos el archivo &lt;span style="font-weight: bold;"&gt;client.ovpn&lt;/span&gt; a &lt;span style="font-weight: bold;"&gt;C:\Archivos de programa\OpenVPN\config&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Una vez ahí lo abrimos con un editor de texto (notepad sirve) y apuntamos la configuración a la dirección en donde pusimos los certificados y la llave privada, de manera que quede así:&lt;br /&gt;&lt;blockquote&gt;ca C:\\keys\\ca.crt&lt;br /&gt;cert C:\\keys\\cliente1.crt&lt;br /&gt;key C:\\keys\\cliente1.key &lt;/blockquote&gt;&lt;br /&gt;luego modificamos la linea que dice:&lt;br /&gt;&lt;blockquote&gt;remote my-server-1 1194&lt;/blockquote&gt;&lt;br /&gt;donde cambiamos &lt;span style="font-weight: bold;"&gt;my-server-1&lt;/span&gt; por la dirección IP de servidor y el puerto que corresponda (si hemos seguido esta guía al pie de la letra, el puerto queda igual).&lt;br /&gt;&lt;br /&gt;Una vez listo guardamos el archivo y ejecutamos &lt;span style="font-weight: bold;"&gt;openvpn-gui.exe&lt;/span&gt; (se encuentra en la carpeta &lt;span style="font-weight: bold;"&gt;bin&lt;/span&gt; en el directorio de instalación de openVPN).&lt;br /&gt;&lt;br /&gt;Al abrirlo veremos un icono de dos computadores rojos en la bandeja del sistema, si hacemos click derecho veremos un menú en donde la primera opción es conectar:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp1.blogger.com/_TGgpRudXV3w/SHmiAouUwbI/AAAAAAAAAo4/yzkCq3BZk4k/s1600-h/openvpn-win-conectar"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp1.blogger.com/_TGgpRudXV3w/SHmiAouUwbI/AAAAAAAAAo4/yzkCq3BZk4k/s320/openvpn-win-conectar" alt="" id="BLOGGER_PHOTO_ID_5222383374728217010" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;al pinchar conectar aparecerá una consola mostrando algunos datos y al finalizar aparecerá un mensaje avisando que la conexión se ha realizado:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp2.blogger.com/_TGgpRudXV3w/SHmiAkzVONI/AAAAAAAAApA/FWVEMT2OwH0/s1600-h/openvpn-win-conectado"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp2.blogger.com/_TGgpRudXV3w/SHmiAkzVONI/AAAAAAAAApA/FWVEMT2OwH0/s320/openvpn-win-conectado" alt="" id="BLOGGER_PHOTO_ID_5222383373675477202" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Ahora para probar, desde el servidor podemos hacer un ping al IP asignado al cliente y se podrá comprobar que se puede realizar sin problema.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;10 Revocar certificados&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Revocar un certificado es invalidar uno previamente firmado para que ya no pueda ser usado para propósitos de autenticación (y en consecuencia, conexión a la VPN).&lt;br /&gt;&lt;br /&gt;Las razones típicas para querer remover un certificado incluyen:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;La llave privada asociada con el certificado esta comprometida o robada.&lt;/li&gt;&lt;li&gt;El usuario de una llave privada cifrada olvidó la contraseña de la llave.&lt;/li&gt;&lt;li&gt;Se quiere terminar el acceso a la VPN para un usuario.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Como un ejemplo, revocaremos el certificado &lt;span style="font-weight: bold;"&gt;cliente1&lt;/span&gt; (el mismo que creamos anteriormente). En una consola y como usuario root entramos al directorio &lt;span style="font-weight: bold;"&gt;easy-rsa-V2.0&lt;/span&gt;&lt;br /&gt;&lt;blockquote&gt;#cd /etc/openvpn/easy-rsa-V2.0&lt;/blockquote&gt;&lt;br /&gt;luego reiniciamos las variables de openVPN:&lt;br /&gt;&lt;blockquote&gt;#source ./vars&lt;/blockquote&gt;&lt;br /&gt;y luego escribimos el siguiente comando:&lt;br /&gt;&lt;blockquote&gt;#./revoke-full cliente1&lt;/blockquote&gt;&lt;br /&gt;con lo cual deberíamos obtener una salida como ésta:&lt;br /&gt;&lt;blockquote&gt;Using configuration from /etc/openvpn/easy-rsa-V2.0/openssl.cnf&lt;br /&gt;Revoking Certificate 02.&lt;br /&gt;Data Base Updated&lt;br /&gt;Using configuration from /etc/openvpn/easy-rsa-V2.0/openssl.cnf&lt;br /&gt;cliente1.crt: /C=CL/ST=RM/L=Santiago/O=Metalklesk's enterprise/CN=cliente1/emailAddress=damorales@gmail.com&lt;br /&gt;error 23 at 0 depth lookup:certificate revoked&lt;/blockquote&gt;&lt;br /&gt;tal como se puede ver en la siguiente imagen:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp0.blogger.com/_TGgpRudXV3w/SHmiypazncI/AAAAAAAAApI/kCG9Eq9SAR8/s1600-h/revoke2.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp0.blogger.com/_TGgpRudXV3w/SHmiypazncI/AAAAAAAAApI/kCG9Eq9SAR8/s320/revoke2.png" alt="" id="BLOGGER_PHOTO_ID_5222384233908248002" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Es probable que el último comando anterior no nos resulte y obtengamos la siguiente salida de error:&lt;br /&gt;&lt;blockquote&gt;Using configuration from /etc/openvpn/easy-rsa-V2.0/openssl.cnf&lt;br /&gt;error on line 282 of config file '/etc/openvpn/easy-rsa-V2.0/openssl.cnf'&lt;br /&gt;16431:error:0E065068:configuration file routines:STR_COPY:variable has no value:conf_def.c:629:line 282&lt;br /&gt;Using configuration from /etc/openvpn/easy-rsa-V2.0/openssl.cnf&lt;br /&gt;error on line 282 of config file '/etc/openvpn/easy-rsa-V2.0/openssl.cnf'&lt;br /&gt;16432:error:0E065068:configuration file routines:STR_COPY:variable has no value:conf_def.c:629:line 282&lt;br /&gt;cat: crl.pem: No existe el fichero o el directorio&lt;br /&gt;cliente1.crt: /C=CL/ST=RM/L=Santiago/O=Metalklesk's enterprise/CN=cliente1/emailAddress=damorales@gmail.com&lt;br /&gt;error 3 at 0 depth lookup:unable to get certificate CRL&lt;/blockquote&gt;&lt;br /&gt;tal como vemos en la siguiente imagen:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp0.blogger.com/_TGgpRudXV3w/SHmjB4iS4UI/AAAAAAAAApQ/2hlNp-jBxO8/s1600-h/revoke2.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp0.blogger.com/_TGgpRudXV3w/SHmjB4iS4UI/AAAAAAAAApQ/2hlNp-jBxO8/s320/revoke2.png" alt="" id="BLOGGER_PHOTO_ID_5222384495664226626" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;De ser así debemos abrir el archivo &lt;span style="font-weight: bold;"&gt;/etc/openvpn/easy-rsa-V2.0/openssl.cnf&lt;/span&gt; (como usuario root) y comentar la ultima sección como se puede ver a continuación:&lt;br /&gt;&lt;blockquote&gt;#[ pkcs11_section ]&lt;br /&gt;#engine_id = pkcs11&lt;br /&gt;#dynamic_path = /usr/lib/engines/engine_pkcs11.so&lt;br /&gt;#MODULE_PATH = $ENV::PKCS11_MODULE_PATH&lt;br /&gt;#PIN = $ENV::PKCS11_PIN&lt;br /&gt;#init = 0&lt;/blockquote&gt;&lt;br /&gt;tal como podemos ver en la siguiente imagen:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp0.blogger.com/_TGgpRudXV3w/SHmjRIIRDnI/AAAAAAAAApY/wzbAZcR5SSQ/s1600-h/openssl.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp0.blogger.com/_TGgpRudXV3w/SHmjRIIRDnI/AAAAAAAAApY/wzbAZcR5SSQ/s320/openssl.png" alt="" id="BLOGGER_PHOTO_ID_5222384757548060274" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Y luego intentar de nuevo.&lt;br /&gt;&lt;br /&gt;Al ejecutar el comando &lt;span style="font-weight: bold;"&gt;revoke-full&lt;/span&gt; se ha creado un archivo &lt;span style="font-weight: bold;"&gt;CRL&lt;/span&gt; (&lt;span style="font-weight: bold;"&gt;C&lt;/span&gt;ertificate &lt;span style="font-weight: bold;"&gt;R&lt;/span&gt;evocation &lt;span style="font-weight: bold;"&gt;L&lt;/span&gt;ist) llamado &lt;span style="font-weight: bold;"&gt;crl.pem&lt;/span&gt; en el directorio &lt;span style="font-weight: bold;"&gt;keys&lt;/span&gt; de openVPN.&lt;br /&gt;&lt;br /&gt;Este archivo debe ser referenciado en el servidor openVPN en el archivo&lt;span style="font-weight: bold;"&gt; server.conf&lt;/span&gt;:&lt;br /&gt;&lt;blockquote&gt;crl-verify /etc/openvpn/keys/crl.pem&lt;/blockquote&gt;&lt;br /&gt;de manera tal que cada vez que un cliente se conecte, la verificación se haga contra ese archivo para saber si se ha revocado o no su certificado de acceso a la VPN.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;Algunas notas sobre CRL&lt;/span&gt;:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Cuando la opción crl-verify es usada en openVPN, el archivo CRL sera re-leído cada vez que un nuevo cliente se conecta o un cliente existente re negocia la conexión SSL/TLS (de manera predeterminada una vez por hora). Esto significa que podemos actualizar el archivo CRL mientras el demonio de el servidor openVPN este corriendo, y que el nuevo CRL tenga efecto inmediato para los nuevos clientes que se conecten. Si el cliente para el que estamos revocando su certificado esta actualmente conectado, podemos reiniciar el servidor a través de la señal (SIGUSR1 o SIGHUP) y "flushear" todos los clientes, o podemos hacer telnet a el puerto de la interfaz de administración y explícitamente matar la instancia de el cliente en el servidor sin molestar a los otros clientes.&lt;/li&gt;&lt;li&gt;Puesto que la directiva crl-verify puede ser usada en ambos, el servidor openVPN y el cliente, esto es generalmente innecesario para distribuir el archivo CRL a los clientes a menos que el certificado de el servidor ha sido revocado. Los clientes no necesitan saber acerca de los certificados de otros clientes que han sido revocados porque los clientes no deberían de aceptar conexiones directas de otros clientes en primer lugar (a no ser que queramos conexiones del tipo cliente-cliente).&lt;/li&gt;&lt;li&gt;El archivo CRL no es secreto, y debería ser legible por todos para que el demonio openVPN pueda leerlo después de que los privilegios de root han sido tirados.&lt;/li&gt;&lt;li&gt;Si estamos usando la directiva chroot, debemos asegurarnos de poner una copia de el archivo CRL en el directorio chroot, puesto que a diferencia de la mayoría de los archivos que openVPN lee, el archivo CRL sera leído después de que el chroot es ejecutado, no antes.&lt;/li&gt;&lt;li&gt;Una razón común para que un certificado necesite ser revocado es que el usuario cifra su llave privada con una contraseña, y luego la olvida. Al revocar el certificado original, es posible re-generar un nuevo par de llave/certificado con el common name original de el usuario.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;11 Conclusiones&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Mediante openVPN podemos crear redes virtuales privadas seguras y a muy bajo costo, de hecho, el software usado es gratis y además open source, por lo que no pagamos por concepto de licencias de software, además de ser multi plataforma.&lt;br /&gt;&lt;br /&gt;Gracias a la encriptación usada para el traspaso de la información disminuimos bastante el riesgo de captura y decodificación de nuestros datos, ya que utilizamos certificados digitales y llaves de 1024 o 2048 bits, con lo cual aseguramos que solo quienes tengan certificado se puedan conectar a la VPN y que nuestros datos no puedan ser leídos por terceros.&lt;br /&gt;&lt;br /&gt;El uso de los mecanismos de seguridad que se proveen permiten estar preparados frente a ataques del tipo DoS o escaneo de puertos en busca de vulnerabilidades, lo cual deja nuestra red bastante mas segura.&lt;br /&gt;&lt;br /&gt;Además openVPN nos provee de un mecanismo muy simple tanto para generar pares de llave/certificado para clientes así como la revocación de los mismos, todo con un par de simples comandos, lo cual ayuda bastante a la administración de la VPN.&lt;br /&gt;&lt;br /&gt;Con openVPN podemos generar varios tipos de configuraciones que pueden amoldarse según nuestras necesidades, como tener una VPN uno a uno, uno a muchos o muchos a muchos.&lt;br /&gt;&lt;br /&gt;El uso de una VPN nos permite compartir recursos de una red con equipos o redes externas, una combinación especialmente útil es openVPN con SAMBA, ya que con openVPN creamos la red y con SAMBA compartimos los recursos.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;12 Anexos&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://tuxjm.net/docs/openvpn-como4slack/index.html"&gt;http://tuxjm.net/docs/openvpn-como4slack/index.html&lt;/a&gt;&lt;br /&gt;&lt;a href="http://openvpn.net/"&gt;http://openvpn.net/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:180%;"&gt;&lt;span style="font-weight: bold;"&gt;EXTRA !!!&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Este documento lo pueden descargar en formato &lt;a href="http://mihd.net/rqajbnl"&gt;ODT&lt;/a&gt; y &lt;a href="http://mihd.net/ej6810h"&gt;PDF&lt;/a&gt; para que lo puedan leer y modificar a gusto. Este documento está bajo licencia &lt;a href="http://www.gnu.org/licenses/gpl-3.0.html"&gt;GPL 3&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Espero les sea de utilidad.&lt;br /&gt;&lt;br /&gt;Saludos !!!&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1421033339681316542-1576155668406711156?l=metalklesk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://metalklesk.blogspot.com/feeds/1576155668406711156/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://metalklesk.blogspot.com/2008/07/vpn-segura-en-opensuse-110-y-windows-xp.html#comment-form' title='13 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1421033339681316542/posts/default/1576155668406711156'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1421033339681316542/posts/default/1576155668406711156'/><link rel='alternate' type='text/html' href='http://metalklesk.blogspot.com/2008/07/vpn-segura-en-opensuse-110-y-windows-xp.html' title='VPN segura en openSUSE 11.0 y Windows XP con openVPN'/><author><name>Daniel Dario Morales Salas</name><uri>http://www.blogger.com/profile/07642586501018157497</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='28' src='http://3.bp.blogspot.com/_TGgpRudXV3w/SfP_sc5YZ3I/AAAAAAAABSs/APK4YFwjVn4/S220/yoft3.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp2.blogger.com/_TGgpRudXV3w/SHmUNOGHMyI/AAAAAAAAAmo/QRB58FmXUvk/s72-c/bridge.png' height='72' width='72'/><thr:total>13</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1421033339681316542.post-6550111552498788621</id><published>2008-06-05T01:22:00.012-04:00</published><updated>2008-06-12T01:42:25.223-04:00</updated><title type='text'>ComboBox en JMaki con NetBeans 6.1, publish and suscribe</title><content type='html'>&lt;div style="text-align: justify;"&gt;Ayer un amigo lector de éste blog me envió un correo preguntando como lo podía hacer para obtener el valor de un &lt;a href="https://ajax.dev.java.net/"&gt;Widget JMaki ComboBox&lt;/a&gt;, ya que él había probado el método que expliqué en &lt;a href="http://metalklesk.blogspot.com/2008/05/demo-sistema-reclamos-ajax-servlet-jsp.html"&gt;ésta&lt;/a&gt; entrada pero no servía. En efecto, el método explicado ahí solo retorna el nombre de la etiqueta y no el valor que se requiere.&lt;br /&gt;&lt;br /&gt;El método corresponde al siguiente:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;var fecha = jmaki.getWidget('fecha').getValue();&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;pero este retorna el label del combobox y no el value.&lt;br /&gt;&lt;br /&gt;Me explico, cuando uno usa un ComboBox, generalmente muestra un nombre al usuario y por debajo quiere manejar un código, entonces el usuario al seleccionar un nombre específico de la lista quiere obtener el código que le corresponde y hacer algo con éste.&lt;br /&gt;&lt;br /&gt;El nombre corresponde al label o etiqueta y el código corresponde al value o valor.&lt;br /&gt;&lt;br /&gt;Entonces me dispuse a leer varios sitios y en el el sitio oficial de jmaki encontré la respuesta (era lo mas lógico verdad ??).&lt;br /&gt;&lt;br /&gt;Es bastante simple la verdad. Debemos crear nuestra página jsp como queramos y agregamos un widget combobox de la biblioteca dojo, hasta aquí es bastante simple ya que solo arrastramos el widget desde el panel de la derecha a la página jsp.&lt;br /&gt;&lt;br /&gt;Lo nuevo que haremos será crear un Bean que utilizaremos para cargar los datos en el widget en vez de hacerlo directamente en el jsp. Esto es mas elegante, útil y seguro. Lo mas probable es que los datos provengan de una base de datos, de seguro que ninguno querrá obtener los datos  de la base de datos directamente desde el jsp.&lt;br /&gt;&lt;br /&gt;El &lt;span style="font-weight: bold;"&gt;Bean&lt;/span&gt; (ComboBoxBean) es bastante sencillo para éste ejemplo, simplemente contendrá un arreglo de Strings con un par de países y un arreglo de Strings con códigos de los países.&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;protected String[] paises= new String[] { "Chile", "Argentina", "España", "Estados Unidos"};&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;protected String[] codigoPaises = new String[] { "CL", "AR", "ES", "US" };&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Lo que tenemos que tener en cuenta es que para retornar los datos no basta con hacer un simple método get y retornar el arreglo String, debemos transformar los datos a un form &lt;span style="font-weight: bold;"&gt;JSON&lt;/span&gt;. Esto lo hacemos de la siguiente forma:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;public String getPaises() throws JSONException {&lt;br /&gt;&lt;br /&gt;        JSONArray datosPaises = new JSONArray();&lt;br /&gt;&lt;br /&gt;        JSONObject datosPais = new JSONObject();&lt;br /&gt;&lt;br /&gt;        for (int loop = 0; loop &amp;lt; paises.length; loop++) {&lt;br /&gt;&lt;br /&gt;            datosPais.put("label", paises[loop]);&lt;br /&gt;&lt;br /&gt;            datosPais.put("value", codigoPaises[loop]);&lt;br /&gt;&lt;br /&gt;            datosPaises.put(datosPais);&lt;br /&gt;&lt;br /&gt;            datosPais = new JSONObject();&lt;br /&gt;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        return jsonArrayToString(datosPaises, new StringBuffer());&lt;br /&gt;&lt;br /&gt;    }&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;pero debemos definir el método &lt;span&gt;jsonArrayToString&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;public String jsonArrayToString(JSONArray ja, StringBuffer buff)  throws JSONException {&lt;br /&gt;&lt;br /&gt;        if (buff == null)&lt;br /&gt;&lt;br /&gt;            buff = new StringBuffer("[");&lt;br /&gt;&lt;br /&gt;        else&lt;br /&gt;&lt;br /&gt;            buff.append("[");&lt;br /&gt;&lt;br /&gt;       &lt;br /&gt;&lt;br /&gt;        for (int key=0; (ja != null) &amp;amp;&amp;amp; key &amp;lt; ja.length(); key++) {&lt;br /&gt;&lt;br /&gt;            String value = null;&lt;br /&gt;&lt;br /&gt;            if (ja.optJSONObject(key) != null){&lt;br /&gt;&lt;br /&gt;                jsonToObjectLibertal(ja.optJSONObject(key), buff);&lt;br /&gt;&lt;br /&gt;            } else if (ja.optJSONArray(key) != null) {&lt;br /&gt;&lt;br /&gt;                jsonArrayToString(ja.optJSONArray(key), buff);&lt;br /&gt;&lt;br /&gt;            } else if (ja.optLong(key, -1) != -1) {&lt;br /&gt;&lt;br /&gt;                value = ja.get(key) + "";&lt;br /&gt;&lt;br /&gt;                buff.append(value);&lt;br /&gt;&lt;br /&gt;            } else if (ja.optDouble(key, -1) != -1) {&lt;br /&gt;&lt;br /&gt;                value = ja.get(key) + "";&lt;br /&gt;&lt;br /&gt;                buff.append(value);&lt;br /&gt;&lt;br /&gt;            } else if (ja.optBoolean(key)) {&lt;br /&gt;&lt;br /&gt;                value = ja.getBoolean(key) + "";&lt;br /&gt;&lt;br /&gt;                buff.append(value);&lt;br /&gt;&lt;br /&gt;            } else if (ja.opt(key) != null) {&lt;br /&gt;&lt;br /&gt;                Object obj = ja.opt(key);&lt;br /&gt;&lt;br /&gt;                if (obj instanceof Boolean) {&lt;br /&gt;&lt;br /&gt;                    value = ja.getBoolean(key) + "";&lt;br /&gt;&lt;br /&gt;                } else {&lt;br /&gt;&lt;br /&gt;                    value = "'" + ja.get(key) + "'";&lt;br /&gt;&lt;br /&gt;                }&lt;br /&gt;&lt;br /&gt;                buff.append(value);&lt;br /&gt;&lt;br /&gt;            }&lt;br /&gt;&lt;br /&gt;            if (key &amp;lt; ja.length() -1) buff.append(",");&lt;br /&gt;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        buff.append("]");&lt;br /&gt;&lt;br /&gt;       &lt;br /&gt;&lt;br /&gt;        return buff.toString();&lt;br /&gt;&lt;br /&gt;    }&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;y necesitamos el método &lt;span&gt;jsonToObjectLibertal&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;public String jsonToObjectLibertal(JSONObject jo, StringBuffer buff)  throws JSONException {&lt;br /&gt;&lt;br /&gt;        if (buff == null)&lt;br /&gt;&lt;br /&gt;            buff = new StringBuffer("{");&lt;br /&gt;&lt;br /&gt;        else&lt;br /&gt;&lt;br /&gt;            buff.append("{");&lt;br /&gt;&lt;br /&gt;       &lt;br /&gt;&lt;br /&gt;        JSONArray names = jo.names();&lt;br /&gt;&lt;br /&gt;        for (int l=0; (names != null) &amp;amp;&amp;amp; l &amp;lt; names.length(); l++) {&lt;br /&gt;&lt;br /&gt;            String key = names.getString(l);&lt;br /&gt;&lt;br /&gt;            String value = null;&lt;br /&gt;&lt;br /&gt;            if (jo.optJSONObject(key) != null){&lt;br /&gt;&lt;br /&gt;                value = key + ":";&lt;br /&gt;&lt;br /&gt;                buff.append(value);&lt;br /&gt;&lt;br /&gt;                jsonToObjectLibertal(jo.optJSONObject(key), buff);&lt;br /&gt;&lt;br /&gt;            }else if (jo.optJSONArray(key) != null) {&lt;br /&gt;&lt;br /&gt;                value = key + ":";&lt;br /&gt;&lt;br /&gt;                buff.append(value);&lt;br /&gt;&lt;br /&gt;                jsonArrayToString(jo.optJSONArray(key), buff);&lt;br /&gt;&lt;br /&gt;            } else if (jo.optLong(key, -1) != -1) {&lt;br /&gt;&lt;br /&gt;                value = key + ":" + jo.get(key) + "";&lt;br /&gt;&lt;br /&gt;                buff.append(value);&lt;br /&gt;&lt;br /&gt;            } else if (jo.optDouble(key, -1) != -1) {&lt;br /&gt;&lt;br /&gt;                value = key + ":" + jo.get(key) + "";&lt;br /&gt;&lt;br /&gt;                buff.append(value);&lt;br /&gt;&lt;br /&gt;            } else if (jo.opt(key) != null) {&lt;br /&gt;&lt;br /&gt;                Object obj = jo.opt(key);&lt;br /&gt;&lt;br /&gt;                if (obj instanceof Boolean) {&lt;br /&gt;&lt;br /&gt;                    value = key + ":" + jo.getBoolean(key) + "";&lt;br /&gt;&lt;br /&gt;                } else {&lt;br /&gt;&lt;br /&gt;                    value = key + ":" + "'" + jo.get(key) + "'";&lt;br /&gt;&lt;br /&gt;                }&lt;br /&gt;&lt;br /&gt;                buff.append(value);&lt;br /&gt;&lt;br /&gt;            }&lt;br /&gt;&lt;br /&gt;            if (l &amp;lt; names.length() -1) buff.append(",");&lt;br /&gt;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        buff.append("}");&lt;br /&gt;&lt;br /&gt;       &lt;br /&gt;&lt;br /&gt;        return buff.toString();&lt;br /&gt;&lt;br /&gt;    }&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Estos 3 métodos no los hize yo, solo modifiqué una ínfima parte para adaptarlos al ejemplo, el código lo saqué de uno de los tutoriales de JMaki (apenas lo encuentre pongo la URL).&lt;br /&gt;&lt;br /&gt;Ya con eso tenemos listo el Bean que llenará el widget combobox de datos de forma elegante, limpia y sencilla.&lt;br /&gt;&lt;br /&gt;Ahora toca ir al jsp en donde tenemos el widget combobox. El tag debería lucir así:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&amp;lt;a:widget name="dojo.combobox" value="${ComboBoxBean.paises}" publish="/micombobox"/&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;y al inicio del jsp agregar las siguientes lineas:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&amp;lt;jsp:useBean id="ComboBoxBean" scope="session" class="org.ComboBoxBean"/&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;%@ taglib prefix="a" uri="http://jmaki/v1.0/jsp" %&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;en donde deben cambiar el nombre del Bean al que corresponda.&lt;br /&gt;&lt;br /&gt;Antes de continuar explicaré de que se trata el &lt;span style="font-weight: bold;"&gt;publish&lt;/span&gt; y el &lt;span style="font-weight: bold;"&gt;subscribe&lt;/span&gt; en JMaki.&lt;br /&gt;&lt;br /&gt;El &lt;span style="font-weight: bold;"&gt;publish&lt;/span&gt; se utiliza para definir un nombre específico a un widget específico (com un ID), con el cual se diferenciará de otros al momento de registrar eventos. El publish se define como un argumento en el widget.&lt;br /&gt;&lt;br /&gt;El registro de eventos se hace utilizando el &lt;span style="font-weight: bold;"&gt;subscribe&lt;/span&gt; y se define en el archivo &lt;span style="font-weight: bold;"&gt;glue.js&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Utilizando publish y subscribe se manejan de forma limpia los eventos asociados a widgets. Cada widget puede tener varios eventos asociados y cada evento se le puede asociar a muchos widgets, una relación de muchos a muchos, en donde cada widget define lo que hace independientemente de los demás, a través de la configuración del subscribe correspondiente en el archivo glue.js.&lt;br /&gt;&lt;br /&gt;Dicho y explicado lo anterior, agregamos al jsp un &lt;span style="font-weight: bold;"&gt;div&lt;/span&gt; en donde colocaremos el código del país seleccionado de forma dinámica.&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&amp;lt;div id="valorSeleccionado"&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Una vez listo abrimos el archivo glue.js y agregamos al final lo siguiente:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;jmaki.subscribe("/micombobox/onSelect", function(args){&lt;br /&gt;&lt;br /&gt;var value = args.value;&lt;br /&gt;&lt;br /&gt;var targetDiv = document.getElementById("valorSeleccionado");&lt;br /&gt;&lt;br /&gt;if(targetDiv)&lt;br /&gt;&lt;br /&gt;          targetDiv.innerHTML = "El codigo de este pais es: " + value;&lt;br /&gt;&lt;br /&gt;});&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Si se fijan, el subscribe es específico para el widget de publish &lt;span&gt;"micombobox"&lt;/span&gt; y el evento &lt;span&gt;"onSelect"&lt;/span&gt;, pudiendo subscribir el mismo evento a otros widgets u otros eventos al mismo widget (muchos a muchos), donde para cada widget se define un evento de forma personalizada.&lt;br /&gt;&lt;br /&gt;Con el código anterior obtenemos el código del país seleccionado y lo agregamos al div correspondiente.&lt;br /&gt;&lt;br /&gt;En esta parte podemos hacer lo que queramos con el dato seleccionado, podríamos enviarlo a un servlet utilizando la función&lt;span style="font-weight: bold;"&gt; jmaki.doAjax&lt;/span&gt; y almacenarlo en una sesión o hacer otra cosa.&lt;br /&gt;&lt;br /&gt;A continuación pueden ver algunas screenshots mostrando la funcionalidad descrita en esta entrada:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp0.blogger.com/_TGgpRudXV3w/SEeDUE-HzKI/AAAAAAAAAic/X03Jlx3NeZo/s1600-h/instant%C3%A1nea1.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp0.blogger.com/_TGgpRudXV3w/SEeDUE-HzKI/AAAAAAAAAic/X03Jlx3NeZo/s320/instant%C3%A1nea1.png" alt="" id="BLOGGER_PHOTO_ID_5208275875032190114" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp2.blogger.com/_TGgpRudXV3w/SEeDUk-HzLI/AAAAAAAAAik/rnAvq_dhgpE/s1600-h/instant%C3%A1nea2.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp2.blogger.com/_TGgpRudXV3w/SEeDUk-HzLI/AAAAAAAAAik/rnAvq_dhgpE/s320/instant%C3%A1nea2.png" alt="" id="BLOGGER_PHOTO_ID_5208275883622124722" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp3.blogger.com/_TGgpRudXV3w/SEeDU0-HzMI/AAAAAAAAAis/rWtynnXxfl4/s1600-h/instant%C3%A1nea3.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp3.blogger.com/_TGgpRudXV3w/SEeDU0-HzMI/AAAAAAAAAis/rWtynnXxfl4/s320/instant%C3%A1nea3.png" alt="" id="BLOGGER_PHOTO_ID_5208275887917092034" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Como ven, utilizando &lt;span style="font-weight: bold;"&gt;Beans&lt;/span&gt; y los métodos &lt;span style="font-weight: bold;"&gt;publish&lt;/span&gt; y &lt;span style="font-weight: bold;"&gt;subscribe&lt;/span&gt; el llenado de datos y obtención de los mismos mediante un &lt;span style="font-weight: bold;"&gt;ComboBox de JMaki&lt;/span&gt; es realmente simple.&lt;br /&gt;&lt;br /&gt;Espero les sea de utilidad.&lt;br /&gt;&lt;br /&gt;ya saben, si quieren el código me lo piden y se los envío por correo.&lt;br /&gt;&lt;br /&gt;saludos !!!&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;EDITADO!!!&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Subí el código a un servidor para que puedan hacer la descarga sin necesidad de enviarme sus correos (así no tienen que esperar a que yo lea el correo para rebotarlo a ustedes), si tienen problemas para la descarga seguimos con el método tradicional del correo electrónico.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://usuarios.lycos.es/metalklesk/blog-metalklesk/ComboBoxWidget.tar.gz"&gt;Descarga&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;saludos !!!!&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1421033339681316542-6550111552498788621?l=metalklesk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://metalklesk.blogspot.com/feeds/6550111552498788621/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://metalklesk.blogspot.com/2008/06/combobox-en-jmaki-con-netbeans-61.html#comment-form' title='4 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1421033339681316542/posts/default/6550111552498788621'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1421033339681316542/posts/default/6550111552498788621'/><link rel='alternate' type='text/html' href='http://metalklesk.blogspot.com/2008/06/combobox-en-jmaki-con-netbeans-61.html' title='ComboBox en JMaki con NetBeans 6.1, publish and suscribe'/><author><name>Daniel Dario Morales Salas</name><uri>http://www.blogger.com/profile/07642586501018157497</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='28' src='http://3.bp.blogspot.com/_TGgpRudXV3w/SfP_sc5YZ3I/AAAAAAAABSs/APK4YFwjVn4/S220/yoft3.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp0.blogger.com/_TGgpRudXV3w/SEeDUE-HzKI/AAAAAAAAAic/X03Jlx3NeZo/s72-c/instant%C3%A1nea1.png' height='72' width='72'/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1421033339681316542.post-7288765180662340993</id><published>2008-06-04T19:45:00.003-04:00</published><updated>2008-06-04T21:02:20.451-04:00</updated><title type='text'>La ética en la empresa</title><content type='html'>&lt;div style="text-align: justify; font-family: arial;"&gt;Una &lt;a href="http://es.wikipedia.org/wiki/Empresa"&gt;empresa&lt;/a&gt; está constituida y existe para crear bienes y/o servicios útiles para la sociedad, y a partir de esta creación o desarrollo (etc.) obtener beneficios de manera tal que la empresa obtenga un lugar en el mercado y surja dentro de éste, haciéndose de un buen nombre que sea reconocido en la mayor cantidad de lugares posibles.&lt;br /&gt;&lt;br /&gt;Y basados en la definición principal de empresa, qué significa útil para la sociedad ??. Muchas veces he escuchado frases como "una empresa existe para ganar dinero" o "una empresa debe centrarse en el desarrollo interno, el bien comercial", etc., pero y qué pasa con el cliente ??&lt;br /&gt;&lt;br /&gt;Útil para la sociedad significa proveer productos y/o servicios que satisfagan las necesidades de los consumidores (clientes y usuarios) sin desmedro de éstos ni otros directa o indirectamente.&lt;br /&gt;&lt;br /&gt;Existe un problema, que muchos conocen, y es que muchas empresas solo se concentran en el beneficio propio y olvidan lo fundamental que es el cliente. Así surgen sitios como &lt;a href="http://www.reclamos.cl/"&gt;www.reclamos.cl&lt;/a&gt; en donde pueden ver la inmensa cantidad de reclamos, denuncias y demandas que los usuarios hacen en contra de distintas empresas de diversos mercados, qué esta pasando ??&lt;br /&gt;&lt;br /&gt;Centrémonos en el caso de las empresas IT, como los proveedores de servicios de acceso a Internet (ISP).&lt;br /&gt;&lt;br /&gt;Durante años, en nuestro país, hemos visto como las empresas hacen fusiones, las cuales sabemos se utilizan para reducir costos y aumentar beneficios. Pero para quién son las mejoras ??, para el cliente definitivamente no.&lt;br /&gt;&lt;br /&gt;Estas fusiones, como la de la antigua Metrópolis y VTR solo han ocasionado problemas a sus clientes.&lt;span style="font-weight: bold;"&gt;&lt;span style="font-style: italic;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;Caso personal:&lt;/span&gt; Yo era cliente de Metrópolis y después por fuerza bruta de VTR. El servicio fue pésimo, el trato indigno, y llegué al extremo de perder mi línea telefónica por los problemas que me ocasionaron y los tuve que demandar al &lt;a href="http://www.sernac.cl/"&gt;sernac&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Estas fusiones ocurren sin el conocimiento ni menos la participación del cliente, a cuantos clientes se les consultó sobre si estaban de acuerdo con la fusión de las dos empresas ? a cuantos siquiera se les notificó las repercusiones que éstos hechos tendría ?&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Algunos dirán:&lt;/span&gt; Bueno, esas son decisiones de empresa, el cliente no trabaja ahí no tiene nada que ver. &lt;span style="font-weight: bold;"&gt;Y yo les digo:&lt;/span&gt; Lean la definición de empresa y entiendan que una empresa existe por y para el cliente.&lt;br /&gt;&lt;br /&gt;El tema que surge aquí es la toma de decisiones por parte de la empresa sin consultar ni notificar al cliente. No involucran al cliente en ninguna etapa mas que en el cobro de la cuenta.&lt;br /&gt;&lt;br /&gt;Todos sabemos que una toma de decisiones afecta a todos los niveles de una empresa en mayor o menor medida, pero muy pocas veces se habla de las repercusiones al cliente, simplemente se toman y el cliente debe acatar ... por qué ? si como cliente soy el que pago las cuentas ? y si yo soy el que pago por que otros deben tomar las decisiones que me corresponden ? y mi derecho como ciudadano y cliente ?&lt;br /&gt;&lt;br /&gt;Actualmente tengo contrato de acceso a Internet con Telefónica Chile, en el contrato está especificado que no hay un bloqueo de puertos para uso de software &lt;a href="http://es.wikipedia.org/wiki/P2p"&gt;p2p&lt;/a&gt; que al parecer se respeta (personalmente no he tenido problemas con las descargas), pero si tengo un problema con permitir el acceso a otras personas hacia mi equipo. Telefónica se niega a darme la clave del router &lt;span style="font-weight: bold;"&gt;Zyxel P-660HW-T1 v2&lt;/span&gt; y no puedo configurar los puertos correspondientes a mi equipo.&lt;br /&gt;&lt;br /&gt;La respuesta ante este problema fue:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;Debe llamar a atención comercial para solicitar desbloqueo de puertos y re direccionamiento remoto de los mismos. Usted no puede hacer eso desde el router, nosotros lo hacemos de forma remota. Es por su seguridad.&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;A raíz de lo anterior surgen algunas preguntas básicas:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;y quién les pidió que se preocupen por mi seguridad ?&lt;/li&gt;&lt;li&gt;y no se supone que no bloquean puertos ? (está en el contrato)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;y por qué tengo que solicitar que me abran los puertos de forma remota ?&lt;/li&gt;&lt;li&gt;por qué no lo puedo hacer yo desde el router ?&lt;/li&gt;&lt;li&gt;debo llamar y solicitar permiso cada vez que quiera abrir o cerrar un puerto en mi equipo ?&lt;/li&gt;&lt;li&gt;debo pedirles permiso por utilizar mi equipo ?&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Otro problema típico con empresas como Telefónica Chile es no atender al cliente si éste no utiliza un sistema operativo Windows. En una ocasión tuve problemas con mi conexión y llamé a soporte técnico, le expliqué que había un problema de planta y empezó con el típico: vaya inicio, cmd ... etc. Le dije que no usaba Windows y me dijo que no me podía dar soporte y me cortó la llamada.&lt;br /&gt;&lt;br /&gt;Como ven algunas empresas toman decisiones por nosotros que nos afectan directamente, haciéndonos perder el tiempo y en algunos casos dinero y recursos (todas las anteriores en mi caso).&lt;br /&gt;&lt;br /&gt;Donde está la &lt;a href="http://es.wikipedia.org/wiki/%C3%89tica"&gt;ética&lt;/a&gt; en la empresa moderna ?? se preocupan de reducir costos, aumentar beneficios, mejorar procesos internos, aplicar ingeniería de vanguardia en la cadena de producción, pero y por qué se toman las atribuciones para tomar una decisión tan personal como la configuración de puertos de mi equipo ?? por qué debo pedir permiso al ISP para dar acceso a mis amigos a mi equipo ??&lt;br /&gt;&lt;br /&gt;Como mencioné al principio, las empresas están olvidando para quién trabajan, están mordiendo la mano de quien les da de comer y si siguen así se van a ir llenando de demandas (ya demandé a VTR y gané, tal vez sea el turno de Telefónica Chile).&lt;br /&gt;&lt;br /&gt;Nosotros como profesionales IT tenemos el deber de velar por la seguridad de nuestros usuarios y clientes, pero jamás tomarnos las atribuciones de tomar una decisión personal de ellos y por ellos.&lt;br /&gt;&lt;br /&gt;La ética no le corresponde solo a los médicos y a los abogados (por ejemplo el caso de la confidencialidad de información), nos corresponde a todos y si trabajamos con y para personas no debemos olvidar darles el lugar que les corresponde.&lt;br /&gt;&lt;br /&gt;Está mal que las empresas se tomen atribuciones personales de los clientes y si usted lector tiene su propia empresa mas vale que tome este tema en cuenta, ya que la relación que tenga con sus clientes marcará la diferencia entre si obtiene beneficios o se va a pérdida por demandas o por que sus clientes lo abandonan.&lt;br /&gt;&lt;br /&gt;Y ustedes estimados lectores, qué opinan sobre la toma de decisiones por ustedes ?? existe la ética en la empresa moderna ?? están de acuerdo en pedir permiso a una empresa para utilizar sus equipos como les plazca ??&lt;br /&gt;&lt;br /&gt;saludos !!!&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1421033339681316542-7288765180662340993?l=metalklesk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://metalklesk.blogspot.com/feeds/7288765180662340993/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://metalklesk.blogspot.com/2008/06/la-tica-en-la-empresa.html#comment-form' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1421033339681316542/posts/default/7288765180662340993'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1421033339681316542/posts/default/7288765180662340993'/><link rel='alternate' type='text/html' href='http://metalklesk.blogspot.com/2008/06/la-tica-en-la-empresa.html' title='La ética en la empresa'/><author><name>Daniel Dario Morales Salas</name><uri>http://www.blogger.com/profile/07642586501018157497</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='28' src='http://3.bp.blogspot.com/_TGgpRudXV3w/SfP_sc5YZ3I/AAAAAAAABSs/APK4YFwjVn4/S220/yoft3.png'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1421033339681316542.post-4886927046704652888</id><published>2008-05-17T02:03:00.026-04:00</published><updated>2008-06-12T01:44:57.799-04:00</updated><title type='text'>Demo sistema reclamos Ajax + Servlet + JSP en NetBeans 6.1</title><content type='html'>&lt;span style=";font-family:arial;font-size:100%;"  &gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;Demo sistema de reclamos&lt;/span&gt; &lt;span style="font-weight: bold; font-style: italic;"&gt;Ajax – Servlet - JSP&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;Contenido&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;1 Introducción&lt;br /&gt;2 Overview&lt;br /&gt;3 Requerimientos&lt;br /&gt;4 Manos a la obra&lt;br /&gt;4.1 index.jsp&lt;br /&gt;4.2 misFunciones.js&lt;br /&gt;4.2.1 Función enviarDatosAjaxServlet&lt;br /&gt;4.2.2 Función procesarRespuesta&lt;br /&gt;4.2.3 Función valorXml&lt;br /&gt;4.2.4 Función cargarContenidoDinamico&lt;br /&gt;4.3 Servlet MiServlet.java&lt;br /&gt;5 resultado.jsp&lt;br /&gt;6 Conclusiones&lt;br /&gt;7 Anexos&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;1 Introducción&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Durante el desarrollo de un sistema web para mi tesis tuve algunos problemas asociados a Ajax y Java.&lt;br /&gt;&lt;br /&gt;El problema general era que no sabía como comunicar dos tecnologías distintas, obtener datos con ajax y enviarlos al backend de la aplicación y desde ésta enviar una respuesta a ajax y desplegar lo que corresponda.&lt;br /&gt;&lt;br /&gt;En Internet abundan los ejemplos, que hay que utilizar miAjax.responseText, miAjax.responseXML, etc. pero ningún ejemplo concreto y funcional, todo queda en teoría y poco de práctica.&lt;br /&gt;&lt;br /&gt;Tampoco se habla mucho del tema de la codificación de datos, una cosa es enviar datos así como Dios los trajo al mundo y otra distinta es enviarlos y recibirlos tal cual, hablo específicamente de los caracteres especiales (ñ, tíldes, etc.), caracteres que son parte de nuestro lenguaje español (y que al parecer los gringos omiten en sus ejemplos, lo cual trae un par de dolores de cabeza a los de habla hispana).&lt;br /&gt;&lt;br /&gt;Bueno, la verdad es que después de mucho averiguar, leer, probar y tomar un par de pastillas para el dolor de cabeza he logrado hacerlo y debo decir que es muy fácil, pero hay varios detalles que se deben tener en cuenta.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;2 Overview&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;El ejemplo que veremos se trata de un demo de un sistema de reclamos. La idea es ingresar el nombre de la persona que reclama, el detalle del reclamo y la fecha de ingreso del reclamo.&lt;br /&gt;&lt;br /&gt;Los primeros dos datos se harán simplemente utilizando un input y un textarea de html, mientras que para la fecha se utilizará un widget ajax.&lt;br /&gt;&lt;br /&gt;Estos datos se enviarán a un servlet que los validará, de estar correctos los almacenará en una sesión y retornará una respuesta a la función ajax.&lt;br /&gt;&lt;br /&gt;Una vez que se tenga la respuesta se procederá a realizar la acción correspondiente.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;3 Requerimientos&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;ul  style="font-family:arial;"&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;NetBeans 6.1&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;Jmaki 1.7.3 (plugin de NetBeans 6.1)&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style=";font-family:arial;font-size:100%;"  &gt;&lt;br /&gt;NetBeans 6.1 se puede descargar gratis desde el sitio oficial en http://www.netbeans.org para Windows o Linux. Requiere instalado previamente el kit de desarrollo de java JDK, para la realización de este tutorial se utilizó la versión 1.6.0 update 6 y se puede descargar desde http://java.sun.com/javase/downloads/?intcmp=1281&lt;br /&gt;&lt;br /&gt;Jmaki se puede descargar desde el administrador de plugines de NetBeans.&lt;br /&gt;&lt;br /&gt;También se utilizó el servidor de aplicaciones GlassFish V2 UR2 que viene incluido en NetBeans 6.1.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;4 Manos a la obra&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Lo primero es crear un proyecto web en NetBeans 6.1, para esto se pincha el botón new project → Web → Web Application, le damos por nombre AjaxServlet u otro, presionamos next y luego cargamos el módulo Jmaki.&lt;br /&gt;&lt;br /&gt;Debemos crear los siguientes recursos en el proyecto.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;ul  style="font-family:arial;"&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;index.jsp (viene por default).&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;resultado.jsp&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;MiServlet.java&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;misFunciones.js&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;span style=";font-family:arial;font-size:100%;"  &gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;4.1 index.jsp&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Una vez listo aparecerá una página index con un par de cosas. Eliminamos todo lo que esta entre los tags y agregamos lo siguiente:&lt;br /&gt;&lt;blockquote&gt;&lt;span style="font-size:100%;"&gt;&lt;code&gt;&lt;br /&gt;&lt;span style="font-size:100%;"&gt;&amp;lt;h1&amp;gt;Ingresar reclamo&amp;lt;/h1&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;div id="error" style="color: red;"&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;form onsubmit="enviarDatosAjaxServlet(); return false;" &amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;table&amp;gt;&lt;br /&gt;&lt;br /&gt;       &amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;&amp;lt;b&amp;gt;* Nombre:&amp;lt;/b&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;input id="nombre" name="nombre" size="20" maxlength="20" &amp;gt;&amp;lt;a:widget name="yahoo.tooltip" args="{context:['nombre']}" value="Ingrese su nombre aquí."  /&amp;gt;&amp;lt;/input&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;&amp;lt;b&amp;gt;* Comentario:&amp;lt;/b&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;a:widget name="yahoo.tooltip" args="{context:['comentario']}" value="Ingrese el detalle del reclamo aquí."  /&amp;gt;&amp;lt;textarea id="comentario" name="comentario" rows="4" cols="25"&amp;gt;&amp;lt;/textarea&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;&amp;lt;b&amp;gt;* Fecha:&amp;lt;/b&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;a:widget id="fecha" name="dojo.dropdowndatepicker" /&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;input type="submit" value="Enviar"/&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;input type="hidden" value="submit" /&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/table&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/form&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/code&gt;&lt;/span&gt;&lt;/blockquote&gt;&lt;br /&gt;Vamos a ver cada una de las partes:&lt;br /&gt;&lt;blockquote&gt;&lt;span style="font-size:100%;"&gt;&lt;code&gt;&lt;br /&gt;&amp;lt;div id="error" style="color: red;"&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;/span&gt;&lt;/blockquote&gt;&lt;br /&gt;Aquí creamos un DIV de id error para agregar los errores de forma dinámica, esto es para no usar otra página web para desplegar el error. Esto es ideal para mostrar los errores al ingresar datos en un formulario o al querer loguearse a un sistema ya que no es necesario cargar toda una nueva página, es mucho mas rápido y mejora la usabilidad del sistema.&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&lt;/code&gt;&lt;blockquote&gt;&lt;span style="font-size:100%;"&gt;&amp;lt;form onsubmit="enviarDatosAjaxServlet(); return false;" &amp;gt;&lt;/span&gt;&lt;/blockquote&gt;&lt;br /&gt;Aquí comenzamos el form, donde tenemos el formulario de ingreso de datos. En vez de llamar directamente una página JSP o un Servlet, hacemos el llamado de una función javascript llamada enviarDatosAjaxServlet(), la cual veremos mas adelante.&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&lt;/code&gt;&lt;blockquote&gt;&lt;span style="font-size:100%;"&gt;&amp;lt;a:widget name="yahoo.tooltip" args="{context:['nombre']}" value="Ingrese su nombre aquí."&amp;gt;&lt;/span&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Aquí tenemos un input de id nombre en el cual ingresamos el nombre de la persona que reclama. Si se fijan existe un tag extraño:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&lt;/code&gt;&lt;blockquote&gt;&lt;span style="font-size:100%;"&gt;&amp;lt;a:widget name="yahoo.tooltip" args="{context:['nombre']}" value="Ingrese su nombre aquí."&amp;gt;&lt;/span&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Ese tag corresponde a un widget de la bibliteca de Jmaki, específicamente a un tooltip Ajax de yahoo. Este tooltip lo encuentran en la paleta de Jmaki que pueden ver a la derecha del editor de NetBeans 6.1, simplemente lo arrastran y cambian el valor de context por el id del campo de datos, en este caso nombre.&lt;br /&gt;&lt;br /&gt;El caso del textarea de comentario es igual al anterior, se arrastra el widget tootltip de yahoo y se cambia el valor de context a comentario.&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&lt;/code&gt;&lt;blockquote&gt;&lt;span style="font-size:100%;"&gt;&amp;lt;b&amp;gt;* Fecha:&amp;lt;/b&amp;gt;&amp;lt;a:widget id="fecha" name="dojo.dropdowndatepicker"&amp;gt;&lt;/span&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;En el caso de la fecha utilizaremos un widget de Dojo llamado DropDownDatePicker el cual permite seleccionar la fecha desde un widget muy amistoso y bonito. Lo encuentran en la paleta de Jmaki y basta con arrastrar y soltar.&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&lt;/code&gt;&lt;blockquote&gt;&lt;span style="font-size:100%;"&gt;&amp;lt;input value="Enviar" type="submit"&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;input value="submit" type="hidden"&amp;gt;&lt;/span&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Aquí simplemente agregamos el botón enviar y además la posibilidad de enviar los datos con solo presionar un Enter.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:arial;font-size:100%;"  &gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp1.blogger.com/_TGgpRudXV3w/SC54hKbVdbI/AAAAAAAAAhU/t1b6qa_-HRk/s1600-h/instant%C3%A1nea1.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp1.blogger.com/_TGgpRudXV3w/SC54hKbVdbI/AAAAAAAAAhU/t1b6qa_-HRk/s320/instant%C3%A1nea1.png" alt="" id="BLOGGER_PHOTO_ID_5201227130789524914" border="0" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=";font-family:arial;font-size:100%;"  &gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;4.2 misFunciones.js&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Hasta aquí todo va bien y muy fácil.&lt;br /&gt;&lt;br /&gt;El tema ahora es obtener los datos del formulario y enviarlos al servidor para ser procesados. Este es el punto que más me costó. Primero fue difícil por que no sabia cómo obtener la fecha desde el DropDownDatePicker y segundo cómo obtener los caractéres especiales (ñs, tíldes, etc.). No den por sentado con que basta obtenerlos y enviarlos, si hacen eso verán que al otro lado los espacios aparecerán como %20 y cosas así.&lt;br /&gt;&lt;br /&gt;A continuación veremos el código de la función enviarDatosAjaxServlet (el cual debe estar en el archivo misFunciones.js):&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:100%;" &gt;4.2.1 Función enviarDatosAjaxServlet&lt;/span&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&lt;/code&gt;&lt;blockquote&gt;&lt;span style="font-size:100%;"&gt;&lt;code&gt;function enviarDatosAjaxServlet() {&lt;br /&gt;&lt;br /&gt;//aqui cargo los valores seleccionados en los drop down date picker&lt;br /&gt;&lt;br /&gt;var fecha = jmaki.getWidget('fecha').getValue();&lt;br /&gt;&lt;br /&gt;//aqui obtengo el valor del comentario ingresado&lt;br /&gt;&lt;br /&gt;var comentario = encodeURIComponent(document.getElementById("comentario").value);&lt;br /&gt;&lt;br /&gt;//aqui obtengo el valor del nombre ingresado&lt;br /&gt;&lt;br /&gt;var nombre = encodeURIComponent(document.getElementById("nombre").value);&lt;br /&gt;&lt;br /&gt;//aqui envio la fecha, el comentario y el nombre al servlet MiServlet&lt;br /&gt;&lt;br /&gt;//para almacenarlos en una sesion&lt;br /&gt;&lt;br /&gt;jmaki.doAjax({ url : "MiServlet",&lt;br /&gt;&lt;br /&gt;           method : 'POST',&lt;br /&gt;&lt;br /&gt;           content : { 'nombre' : nombre,&lt;br /&gt;&lt;br /&gt;                       'comentario' : comentario,&lt;br /&gt;&lt;br /&gt;                       'fecha' : fecha&lt;br /&gt;&lt;br /&gt;                     },&lt;br /&gt;&lt;br /&gt;           callback : function(req) {&lt;br /&gt;&lt;br /&gt;              procesarRespuesta(req);&lt;br /&gt;&lt;br /&gt;           }&lt;br /&gt;&lt;br /&gt;});&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/span&gt;&lt;/blockquote&gt;&lt;br /&gt;El obtener la fecha en realidad es bastante simple, se utiliza la función jmaki.getWidget('fecha').getValue(); la cual retorna un String con la fecha seleccionada.&lt;br /&gt;&lt;br /&gt;Para obtener los otros dos datos es necesario recurrir a document.getElementById("comentario").value (en el caso de obtener el comentario) y  document.getElementById("nombre").value (en el caso de obtener el nombre). Lo segundo que hay que aplicar al resultado de esas “consultas” es la codificación de los caracteres, para esto utilizamos encodeURIComponent. De ésta manera aseguramos que al otro lado (en el servidor) los caracteres especiales lleguen como tales, pero se debe tener en cuenta que se debe hacer el proceso inverso (mas adelante lo veremos).&lt;br /&gt;Para enviar los datos al servlet utilizamos una función de Jmaki llamada doAjax, la cual recibe como parámetros la url a la cual enviamos los datos, en este caso el servlet MiServlet, el tipo de método GET o POST, los datos que enviamos y el callback que se utiliza para obtener la respuesta del servlet.&lt;br /&gt;&lt;br /&gt;En el lado del servidor obtendremos los datos a través del objeto request del servlet.&lt;br /&gt;&lt;br /&gt;La función en callback llama a otra función llamada procesarRespuesta, la cual recibe como parámetro el request ajax (que viene con la respuesta del servlet).&lt;br /&gt;&lt;br /&gt;La respuesta del servlet viene en formato XML, por lo que utilizaremos un responseXML para obtener la respuesta en vez de un responseText.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:arial;font-size:100%;"  &gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp0.blogger.com/_TGgpRudXV3w/SC54h6bVdeI/AAAAAAAAAhs/exG5MBxQM88/s1600-h/instant%C3%A1nea4.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp0.blogger.com/_TGgpRudXV3w/SC54h6bVdeI/AAAAAAAAAhs/exG5MBxQM88/s320/instant%C3%A1nea4.png" alt="" id="BLOGGER_PHOTO_ID_5201227143674426850" border="0" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=";font-family:arial;font-size:100%;"  &gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:100%;" &gt;4.2.2 Función procesarRespuesta&lt;/span&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&lt;/code&gt;&lt;blockquote&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;blockquote&gt;&lt;span style="font-size:100%;"&gt;function procesarRespuesta(respuesta) {&lt;br /&gt;&lt;br /&gt;//aqui obtengo el archivo XML en una variable que envio el&lt;br /&gt;&lt;br /&gt;//servlet como respuesta&lt;br /&gt;&lt;br /&gt;var xml = respuesta.responseXML;&lt;br /&gt;&lt;br /&gt;//aqui obtengo el valor del tag respuesta que esta en el xml&lt;br /&gt;&lt;br /&gt;var res = valorXml(xml,'respuesta', 0);&lt;br /&gt;&lt;br /&gt;//si la respuesta es ok significa que no hay errores&lt;br /&gt;&lt;br /&gt;if(res == 'ok'){&lt;br /&gt;&lt;br /&gt;window.location.href="resultado.jsp";&lt;br /&gt;&lt;br /&gt;} else {&lt;br /&gt;&lt;br /&gt;//si hay errores entonces muestro un mensaje&lt;br /&gt;&lt;br /&gt;cargarContenidoDinamico('error', "Ocurrió un problema al enviar los datos, tal vez omitió el ingreso de alguno. Intente nuevamente.");&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;}&lt;/span&gt;&lt;/blockquote&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Lo primero es obtener el objeto xml desde el respuesta.responseXML.&lt;br /&gt;Luego debemos obtener el valor de la respuesta que está entre los tag &lt;respuesta&gt;valor&lt;/respuesta&gt; del xml y para tal tarea nos apoyamos en otra función llamada valorXML, que recibe como parámetro el objeto xml, el nombre del tag y el índice en el cual se encuentra el valor dentro del tag.&lt;br /&gt;&lt;br /&gt;El valor se almacena en una variable llamada res (que corresponde a un String o cadena de caracteres) y se verifica si hay o no errores. Si no hay errores se redirige el navegador a la página resultado.jsp, en caso contrario se carga el error en el DIV “error” sin cambiar de página utilizando la función cargarContenidoDinamico.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:100%;" &gt;4.2.3 Función valorXml&lt;/span&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&lt;/code&gt;&lt;blockquote&gt;&lt;span style="font-size:100%;"&gt;function valorXml(xml, tagName, index) {&lt;br /&gt;&lt;br /&gt;//si el tag no existe retorno null, en caso contrario retorno el valor del tag&lt;br /&gt;&lt;br /&gt;if(xml.getElementsByTagName(tagName).length == 0)&lt;br /&gt;&lt;br /&gt;return null;&lt;br /&gt;&lt;br /&gt;return xml.getElementsByTagName(tagName)[index].childNodes[0].nodeValue;&lt;/span&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;La función valorXml busca el valor correspondiente al indice index en el tag tagName. Si no lo encuentra retorna null, en caso contrario retorna el valor.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:100%;" &gt;4.2.4 Función cargarContenidoDinamico&lt;/span&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&lt;/code&gt;&lt;blockquote&gt;&lt;span style="font-size:100%;"&gt;function cargarContenidoDinamico(contenedor, texto) {&lt;br /&gt;&lt;br /&gt;//aqui agrego el texto al div contenedor&lt;br /&gt;&lt;br /&gt;document.getElementById(contenedor).innerHTML = texto;&lt;br /&gt;&lt;br /&gt;}&lt;/span&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;La función cargarContenidoDinamico carga el valor obtenido desde el xml en el DIV error para desplegar el mensaje de error sin cambiar de página.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:arial;font-size:100%;"  &gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp1.blogger.com/_TGgpRudXV3w/SC54iKbVdfI/AAAAAAAAAh0/r7HFyALP6qI/s1600-h/instant%C3%A1nea5.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp1.blogger.com/_TGgpRudXV3w/SC54iKbVdfI/AAAAAAAAAh0/r7HFyALP6qI/s320/instant%C3%A1nea5.png" alt="" id="BLOGGER_PHOTO_ID_5201227147969394162" border="0" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=";font-family:arial;font-size:100%;"  &gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;4.3 Servlet MiServlet.java&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;El servlet, por default viene con tres métodos, doGet, doPost y processRequest. Es en este último donde codificaremos (los otros dos quedan intactos).&lt;br /&gt;&lt;blockquote&gt;&lt;span style="font-size:100%;"&gt;protected void processRequest(HttpServletRequest request, HttpServletResponse response)&lt;br /&gt;throws ServletException, IOException {&lt;br /&gt;response.setContentType("text/xml charset=UTF-8");&lt;br /&gt;response.setHeader("Cache-Control", "no-cache");&lt;br /&gt;&lt;br /&gt;PrintWriter out = response.getWriter();&lt;br /&gt;&lt;br /&gt;HttpSession sesion = request.getSession();&lt;br /&gt;boolean error = false;&lt;br /&gt;&lt;br /&gt;String fecha = request.getParameter("fecha");&lt;br /&gt;if(fecha == null){&lt;br /&gt;  error = true;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;String n = request.getParameter("nombre");&lt;br /&gt;String nombre = null;&lt;br /&gt;try{&lt;br /&gt;  nombre = URLDecoder.decode(n,"UTF-8");&lt;br /&gt;  if (nombre.equals(""))&lt;br /&gt;      error = true;&lt;br /&gt;} catch (NullPointerException ex){&lt;br /&gt;  error = true;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;String c = request.getParameter("comentario");&lt;br /&gt;String comentario = null;&lt;br /&gt;try{&lt;br /&gt;  comentario = URLDecoder.decode(c,"UTF-8");&lt;br /&gt;  if (comentario.equals(""))&lt;br /&gt;      error = true;&lt;br /&gt;} catch (NullPointerException ex){&lt;br /&gt;  error = true;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;if(error == false){&lt;br /&gt;  sesion.setAttribute("fecha", fecha);&lt;br /&gt;  sesion.setAttribute("nombre", nombre);&lt;br /&gt;  sesion.setAttribute("comentario", comentario);&lt;br /&gt;&lt;br /&gt;  out.println("&lt;respuesta&gt;ok&lt;/respuesta&gt;");&lt;br /&gt;} else{&lt;br /&gt;  out.println("&lt;respuesta&gt;error&lt;/respuesta&gt;");&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;out.close();&lt;br /&gt;}&lt;/span&gt;&lt;/blockquote&gt;&lt;br /&gt;Lo primero es fijarse que el contentType debe ser text/xml para indicar que devolveremos un xml.&lt;br /&gt;&lt;br /&gt;En éste método creamos una sesión (que no tiene porque estar ligada a un user y password) para almacenar los datos ingresados previamente.&lt;br /&gt;&lt;br /&gt;Como se dijo anteriormente, a través del request obtenemos los datos y los almacenamos en variables de tipo String.&lt;br /&gt;&lt;br /&gt;El punto importante aquí es decodificar los datos codificados anteriormente para recuperar los caracteres especiales. Para ésto utilizamos el método estático URLDecoder.decode(n,"UTF-8"); el cual recibe como parámetro el String obtenido del request y el tipo de codificación. Será necesario importar la siguiente biblioteca: import java.net.URLDecoder;&lt;br /&gt;&lt;br /&gt;La razón de almacenar los datos en una sesión es que ésta la utilizaremos en la página respuesta.jsp para desplegarlos en pantalla.&lt;br /&gt;&lt;br /&gt;En el caso que no se tengan errores al obtener los datos, éstos se almacenan en la sesión y se envía la respuesta en xml simplemente agregando la linea out.println("&lt;respuesta&gt;ok&lt;/respuesta&gt;");, y en caso contrario agregando out.println("&lt;respuesta&gt;error&lt;/respuesta&gt;");.&lt;br /&gt;&lt;br /&gt;De ésta forma enviamos la respuesta al callback de la función doAjax de Jmaki.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:arial;font-size:100%;"  &gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp2.blogger.com/_TGgpRudXV3w/SC54habVdcI/AAAAAAAAAhc/rhDZKcETdAA/s1600-h/instant%C3%A1nea2.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp2.blogger.com/_TGgpRudXV3w/SC54habVdcI/AAAAAAAAAhc/rhDZKcETdAA/s320/instant%C3%A1nea2.png" alt="" id="BLOGGER_PHOTO_ID_5201227135084492226" border="0" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=";font-family:arial;font-size:100%;"  &gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;5 resultado.jsp&lt;/span&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&lt;/code&gt;&lt;blockquote&gt;&lt;span style="font-size:100%;"&gt;&amp;lt;%@ page contentType="text/html; charset=UTF-8"%&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;%@ page pageEncoding="UTF-8"%&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;%@ page language="java" session="true"%&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;%&lt;br /&gt;&lt;br /&gt;response.setHeader("Cache-Control","no-store");&lt;br /&gt;&lt;br /&gt;response.setHeader("Pragma","no-cache");&lt;br /&gt;&lt;br /&gt;response.setDateHeader("Expires",0);&lt;br /&gt;&lt;br /&gt;HttpSession sesion = request.getSession();&lt;br /&gt;&lt;br /&gt;String comentario = (String) sesion.getAttribute("comentario");&lt;br /&gt;&lt;br /&gt;String nombre = (String) sesion.getAttribute("nombre");&lt;br /&gt;&lt;br /&gt;String fecha = (String) sesion.getAttribute("fecha");&lt;br /&gt;&lt;br /&gt;sesion.invalidate();&lt;br /&gt;&lt;br /&gt;%&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"&lt;br /&gt;&lt;br /&gt;"http://www.w3.org/TR/html4/loose.dtd"&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;html&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;head&amp;gt;&lt;br /&gt;&lt;br /&gt;  &amp;lt;title&amp;gt;Resultado&amp;lt;/title&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/head&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;body&amp;gt;&lt;br /&gt;&lt;br /&gt;  &amp;lt;h1&amp;gt;Resultado&amp;lt;/h1&amp;gt;&lt;br /&gt;&lt;br /&gt;  &amp;lt;table&amp;gt;&lt;br /&gt;&lt;br /&gt;      &amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;&amp;lt;b&amp;gt;El nombre ingresado es:&amp;lt;/b&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;%=nombre%&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;&lt;br /&gt;      &amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;&amp;lt;b&amp;gt;El comentario ingresado es:&amp;lt;/b&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;%=comentario%&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;&lt;br /&gt;      &amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;&amp;lt;b&amp;gt;La fecha de ingreso del comentario es:&amp;lt;/b&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;%=fecha%&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;&lt;br /&gt;  &amp;lt;/table&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/body&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/html&amp;gt;&lt;/span&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Lo primero que hacemos aquí es definir la utilización de la sesión agregando el tag &lt;code&gt;&lt;br /&gt;&lt;/code&gt;&lt;blockquote&gt;&lt;span style="font-size:100%;"&gt;&amp;lt;%@page language=”java” session=”true”%&amp;gt;&lt;/span&gt;&lt;/blockquote&gt;&lt;br /&gt;Luego obtenemos la sesión desde el request y obtenemos los datos, después invalidamos la sesión eliminando los datos de ésta.&lt;br /&gt;&lt;br /&gt;Después simplemente mostramos los datos agregandolos con el tag &lt;%=valor%&gt;.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:arial;font-size:100%;"  &gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp3.blogger.com/_TGgpRudXV3w/SC54hqbVddI/AAAAAAAAAhk/bAcxqVk-r6Q/s1600-h/instant%C3%A1nea3.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp3.blogger.com/_TGgpRudXV3w/SC54hqbVddI/AAAAAAAAAhk/bAcxqVk-r6Q/s320/instant%C3%A1nea3.png" alt="" id="BLOGGER_PHOTO_ID_5201227139379459538" border="0" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=";font-family:arial;font-size:100%;"  &gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;6 Conclusiones&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Con ajax podemos crear una presentación mas decente de los datos y a la vez mas eficiente si nos preocupamos de que las funciones que carguemos sean livianas y de poco texto.&lt;br /&gt;&lt;br /&gt;Gracias a las funciones expuestas en este simple demo, podemos cargar datos de forma dinámica para la muestra de errores sin necesidad de cargar una nueva página, lo que es mas rápido y eficiente.&lt;br /&gt;&lt;br /&gt;También vimos que gracias a las funciones de la biblioteca de Jmaki podemos agregar widgets bonitos y que mejoran la usabilidad del sistema.&lt;br /&gt;&lt;br /&gt;Y por último aprendimos a comunicar tecnologías distintas como son java con javascript (Ajax), manejando caracteres especiales, etc.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;7 Anexos&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;a style="font-family: arial;" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp2.blogger.com/_TGgpRudXV3w/SC6HEabVdgI/AAAAAAAAAh8/7_j6gsVxIag/s1600-h/instant%C3%A1nea6.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp2.blogger.com/_TGgpRudXV3w/SC6HEabVdgI/AAAAAAAAAh8/7_j6gsVxIag/s320/instant%C3%A1nea6.png" alt="" id="BLOGGER_PHOTO_ID_5201243129542702594" border="0" /&gt;&lt;/a&gt;&lt;a style="font-family: arial;" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp0.blogger.com/_TGgpRudXV3w/SC6HE6bVdhI/AAAAAAAAAiE/Bg6CUqwOe5E/s1600-h/instant%C3%A1nea7.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp0.blogger.com/_TGgpRudXV3w/SC6HE6bVdhI/AAAAAAAAAiE/Bg6CUqwOe5E/s320/instant%C3%A1nea7.png" alt="" id="BLOGGER_PHOTO_ID_5201243138132637202" border="0" /&gt;&lt;/a&gt;&lt;a style="font-family: arial;" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp0.blogger.com/_TGgpRudXV3w/SC6HE6bVdiI/AAAAAAAAAiM/efyKtB_OB30/s1600-h/instant%C3%A1nea8.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp0.blogger.com/_TGgpRudXV3w/SC6HE6bVdiI/AAAAAAAAAiM/efyKtB_OB30/s320/instant%C3%A1nea8.png" alt="" id="BLOGGER_PHOTO_ID_5201243138132637218" border="0" /&gt;&lt;/a&gt;&lt;a style="font-family: arial;" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp1.blogger.com/_TGgpRudXV3w/SC6HFKbVdjI/AAAAAAAAAiU/gmlUfgJPFtk/s1600-h/instant%C3%A1nea9.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp1.blogger.com/_TGgpRudXV3w/SC6HFKbVdjI/AAAAAAAAAiU/gmlUfgJPFtk/s320/instant%C3%A1nea9.png" alt="" id="BLOGGER_PHOTO_ID_5201243142427604530" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;Espero les sea de utilidad.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;El código me lo piden dejando su correo en el blog y se los enviaré a la brevedad.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;También tengo esta entrada del blog en un documento &lt;span style="font-style: italic;"&gt;ODT&lt;/span&gt; y &lt;span style="font-style: italic;"&gt;PDF&lt;/span&gt; (no me pidan formato &lt;span style="font-style: italic;"&gt;DOC&lt;/span&gt;), se los reboto junto al código.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;saludos !!!&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;EDITADO!!!&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Subí el código a un servidor para que puedan hacer la descarga sin necesidad de enviarme sus correos (así no tienen que esperar a que yo lea el correo para rebotarlo a ustedes), si tienen problemas para la descarga seguimos con el método tradicional del correo electrónico.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://usuarios.lycos.es/metalklesk/blog-metalklesk/Demo.SistemaReclamos.AjaxServletJSP.tar.gz"&gt;Descarga&lt;/a&gt;&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/1421033339681316542-4886927046704652888?l=metalklesk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://metalklesk.blogspot.com/feeds/4886927046704652888/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://metalklesk.blogspot.com/2008/05/demo-sistema-reclamos-ajax-servlet-jsp.html#comment-form' title='37 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1421033339681316542/posts/default/4886927046704652888'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1421033339681316542/posts/default/4886927046704652888'/><link rel='alternate' type='text/html' href='http://metalklesk.blogspot.com/2008/05/demo-sistema-reclamos-ajax-servlet-jsp.html' title='Demo sistema reclamos Ajax + Servlet + JSP en NetBeans 6.1'/><author><name>Daniel Dario Morales Salas</name><uri>http://www.blogger.com/profile/07642586501018157497</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='28' src='http://3.bp.blogspot.com/_TGgpRudXV3w/SfP_sc5YZ3I/AAAAAAAABSs/APK4YFwjVn4/S220/yoft3.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp1.blogger.com/_TGgpRudXV3w/SC54hKbVdbI/AAAAAAAAAhU/t1b6qa_-HRk/s72-c/instant%C3%A1nea1.png' height='72' width='72'/><thr:total>37</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1421033339681316542.post-7388247625301463505</id><published>2008-03-11T22:20:00.033-03:00</published><updated>2008-03-14T16:32:35.127-03:00</updated><title type='text'>Instalación Openbravo 2.35 MP1 en Linux</title><content type='html'>&lt;div style="text-align: justify;"&gt;Esta vez vengo con una actualización de la guía para instalar Openbravo en Linux. La versión es la última a la fecha, la 2.35 MP1. Si siguen la guía al pie de la letra no deberían tener problemas. Yo lo instalé como explicaré mas adelante y no tuve NINGUN percance. El sistema operativo que utilizé es &lt;a href="http://www.pclinuxos.com/index.php?option=com_smf&amp;amp;Itemid=26&amp;amp;topic=38573.0"&gt;PCLinuxOS 2008&lt;/a&gt;, pero sirve cualquier distro (distribución GNU/Linux) con linux 2.6.x.&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;Lo primero es lo primero, algunos se preguntarán qué es Openbravo, &lt;a style="font-style: italic;" href="http://www.openbravo.com/"&gt;Openbravo&lt;/a&gt; es un &lt;a style="font-style: italic;" href="http://www.blogger.com/es.wikipedia.org/wiki/Planificaci%C3%83%C2%B3n_de_recursos_empresariales"&gt;ERP&lt;/a&gt; (Enterprise Resource Planning) opensource diseñado para las &lt;a style="font-style: italic;" href="http://es.wikipedia.org/wiki/PYME"&gt;MIPyME&lt;/a&gt; (micro, pequeña y mediana empresa).&lt;br /&gt;Con esta herramienta de gestión los empresarios pueden controlar los diferentes aspectos de su negocio a través de los módulos que provee.&lt;br /&gt;&lt;br /&gt;Esta herramienta de gestión empresarial está disponible para la descarga gratuita desde el &lt;a style="font-style: italic;" href="http://www.openbravo.com/"&gt;sitio web oficial de Openbravo&lt;/a&gt; y &lt;span style="font-weight: bold;"&gt;NO&lt;/span&gt; se requiere el pago de licencias para su uso en ambiente personal ni comercial.&lt;br /&gt;&lt;br /&gt;Openbravo no es un software que se descargue e instale en un par de clicks ... bueno en realidad si pero requiere de algunas dependencias previas y una pequeña configuración del sistema para su instalación y ejecución.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:180%;"&gt;Requerimientos:&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;ul style="text-align: justify;"&gt;&lt;li&gt;&lt;a style="font-style: italic;" href="http://www.openbravo.com/"&gt;Openbravo&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;a style="font-style: italic;" href="http://ant.apache.org/"&gt;Apache-ant 1.7&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;a style="font-style: italic;" href="http://tomcat.apache.org/"&gt;Apache-tomcat 6.0&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;a style="font-style: italic;" href="http://java.sun.com/javase/downloads/index.jsp"&gt;JDK 1.6&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;a style="font-style: italic;" href="http://www.postgresql.com/"&gt;PostgreSQL&lt;/a&gt;.&lt;/li&gt;&lt;/ul&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;Bien, para la realización de esta guía se utilizaron la última version de Openbravo (2.35 MP1), Ant (1.7), Tomcat (6.0.14) y JDK (1.6.0_05). La versión de PostgreSQL que utilizé es la 8.1.11. En uno de los comentarios que se hicieron en la guía de la versión 2.33 se dijo que Openbravo &lt;span style="font-weight: bold;"&gt;NO&lt;/span&gt; funcionaba con la version &lt;span style="font-weight: bold;"&gt;8.3&lt;/span&gt; de PostgreSQL, asi es que por si acaso mejor que no la usen, a no ser que el comentario esté errado, si quieren lo prueban y despues nos cuentan, pero yo no doy garantías de que si funcione. Además hay que tener en cuenta que Openbravo funciona con PostgreSQL desde la versión &lt;span style="font-weight: bold;"&gt;8.1.4&lt;/span&gt; en adelante.&lt;br /&gt;&lt;br /&gt;Los primeros 4 deben descargarlos de la página oficial de cada uno, el último va a depender de que distribución de linux estén usando y si tienen o no configurados los repositorios de Internet.&lt;br /&gt;&lt;br /&gt;Para los recién iniciados en linux y sus múltiples distribuciones, un repositorio es un lugar en donde existen paquetes de software disponible para la descarga e instalación, automática o manual. Por ejemplo openSUSE 10.3 trae un apartado con repositorios, que vienen desactivados por &lt;span style="font-style: italic;"&gt;default&lt;/span&gt; pero que se pueden activar en &lt;span style="font-weight: bold; font-style: italic;"&gt;yast -&gt; software -&gt; community repositories&lt;/span&gt;, en el caso de PCLinuxOS 2008 los repositorios ya vienen listos. En el caso de otra distribución como ubuntu, fedora, etc desconozco ya que no los uso, pero &lt;a href="http://www.google.com/"&gt;google&lt;/a&gt; es su amigo en esos casos.&lt;br /&gt;&lt;br /&gt;Recomiendo tremendamente que antes de instalar cualquier cosa, tengan sus repositorios configurados y actualizados antes de seguir con la guía, si no lo hacen así acuerdense de mi, tendrán problemas mas adelante (les suena un &lt;span style="font-weight: bold;"&gt;BUILD FAILED&lt;/span&gt; ??).&lt;br /&gt;&lt;br /&gt;Para el JDK tienen varias versiones, si su distribución utiliza paquetes RPM entonces descarguen el paquete de nombre &lt;span style="font-weight: bold; font-style: italic;"&gt;jdk-6u5-linux-i586.rpm.bin&lt;/span&gt; y en caso contrario descarguen &lt;span style="font-weight: bold; font-style: italic;"&gt;jdk-6u2-linux-i586.bin&lt;/span&gt;. Algunas distribuciones traen el JDK en sus repositorios, pueden instalarlo desde ahí tambien, pero fijense después en qué directorio quedará instalado, en el caso del RPM queda en &lt;span style="font-weight: bold; font-style: italic;"&gt;/usr/java/jdk1.6.0_05&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:180%;"&gt;Instalación de dependencias:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;PostgreSQL.&lt;/span&gt;&lt;br /&gt;Entonces ya tenemos descargados Openbravo, Ant, Tomcat y JDK. Ahora utilizaremos el gestor de paquetes que corresponda (YAST, Synaptic, Smart, etc) y escribiremos PostgreSQL y lo instalamos como se ve a continuación:&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp0.blogger.com/_TGgpRudXV3w/R9c-vxJgghI/AAAAAAAAAdE/gnSClbMuoaQ/s1600-h/instalar-postgresql.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp0.blogger.com/_TGgpRudXV3w/R9c-vxJgghI/AAAAAAAAAdE/gnSClbMuoaQ/s320/instalar-postgresql.jpg" alt="" id="BLOGGER_PHOTO_ID_5176675287053664786" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size:130%;"&gt;JDK.&lt;/span&gt;&lt;br /&gt;Una vez instalado seguimos con el JDK. Lo primero es dar permisos de ejecución al instalador, para esto abrimos una consola (en el caso de utilizar el escritorio &lt;a href="http://www.kde.org/"&gt;KDE&lt;/a&gt;, &lt;span style="font-weight: bold; font-style: italic;"&gt;menú -&gt; aplicaciones -&gt; sistema -&gt; terminales -&gt; konsole&lt;/span&gt;), escribimos &lt;span style="font-weight: bold; font-style: italic;"&gt;su&lt;/span&gt; e ingresamos la contraseña de administrador del sistema (al escribirla no se ve nada, no hay problema) y presionamos &lt;span style="font-style: italic;"&gt;&lt;span style="font-weight: bold;"&gt;enter&lt;/span&gt;.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Por &lt;span style="font-style: italic;"&gt;default&lt;/span&gt; la consola queda posicionada en su &lt;span style="font-weight: bold;"&gt;home&lt;/span&gt;, por ejemplo &lt;span style="font-style: italic; font-weight: bold;"&gt;/home/metalklesk&lt;/span&gt; (el cual es mi caso), asi que para evitar confusiones tengamos todos los archivos descargados en la raíz de nuestro home.&lt;br /&gt;&lt;br /&gt;Ahora escribimos:&lt;br /&gt;&lt;blockquote&gt;chmod a+x jdk-6u5-linux-i586.rpm.bin&lt;br /&gt;./jdk-6u5-linux-i586.rpm.bin&lt;/blockquote&gt;&lt;br /&gt;con eso nos va a salir un texto explicando la licencia, etc. y si no nos interesa leerlo presionamos &lt;span style="font-weight: bold; font-style: italic;"&gt;q&lt;/span&gt; y &lt;span style="font-weight: bold; font-style: italic;"&gt;enter&lt;/span&gt;. Ya con eso tenemos el JDK instalado en &lt;span style="font-weight: bold; font-style: italic;"&gt;/usr/java/jdk1.6.0_05&lt;/span&gt;. Si no usamos RPM hacemos lo mismo con el otro:&lt;br /&gt;&lt;blockquote&gt;chmod a+x jdk-6u5-linux-i586.bin&lt;br /&gt;./jdk-6u5-linux-i586.bin&lt;/blockquote&gt;&lt;br /&gt;pero no quedará en el mismo directorio, si no que quedará en nuestro home, lo podemos mover a cualquier parte donde tengamos permisos de escritura, por ejemplo, como usuario root lo podemos mover a &lt;span style="font-weight: bold;"&gt;/opt&lt;/span&gt;.&lt;br /&gt;&lt;blockquote&gt;mv -f jdk1.6.0_05/ /opt&lt;/blockquote&gt;&lt;br /&gt;y listo. Si utilizaron el gestor de paquetes de su distribución para instalar JDK no hay problemas, pero deben saber en que directorio se encuentra, esa información la necesitaremos mas adelante.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Ant&lt;/span&gt;.&lt;br /&gt;Para instalar ant simplemente debemos descomprimir el archivo descargado, si usasmos KDE hacemos &lt;span style="font-weight: bold; font-style: italic;"&gt;click derecho sobre el archivo -&gt; extraer -&gt; extraer aquí&lt;/span&gt;. Luego movemos la carpeta a &lt;span style="font-weight: bold;"&gt;/opt&lt;/span&gt;.&lt;br /&gt;&lt;blockquote&gt;mv -f apache-ant-1.7/ /opt&lt;/blockquote&gt;&lt;br /&gt;y ya lo tenemos instalado.&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp0.blogger.com/_TGgpRudXV3w/R9dJDxJgglI/AAAAAAAAAdk/a6NZyisbFi0/s1600-h/instalar-apache.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp0.blogger.com/_TGgpRudXV3w/R9dJDxJgglI/AAAAAAAAAdk/a6NZyisbFi0/s320/instalar-apache.jpg" alt="" id="BLOGGER_PHOTO_ID_5176686625767326290" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Si mal no recuerdo, los archivos de ejecución de ant no traen permiso de ejecución, para dárselos simplemente aplicamos como root lo siguiente:&lt;br /&gt;&lt;blockquote&gt;chmod +x /opt/apache-ant-1.7/bin/*&lt;/blockquote&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;br /&gt;Tomcat&lt;/span&gt;.&lt;br /&gt;Para instalar Tomcat simplemente debemos descomprimir el archivo descargado, si usamos KDE hacemos &lt;span style="font-weight: bold; font-style: italic;"&gt;click derecho sobre el archivo -&gt; extraer -&gt; extraer aquí&lt;/span&gt;. Luego movemos la carpeta a &lt;span style="font-weight: bold;"&gt;/opt&lt;/span&gt;.&lt;br /&gt;&lt;blockquote&gt;mv -f apache-tomcat-6.0.14/ /opt&lt;/blockquote&gt;&lt;br /&gt;y ya lo tenemos instalado.&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp0.blogger.com/_TGgpRudXV3w/R9dJDxJgglI/AAAAAAAAAdk/a6NZyisbFi0/s1600-h/instalar-apache.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp0.blogger.com/_TGgpRudXV3w/R9dJDxJgglI/AAAAAAAAAdk/a6NZyisbFi0/s320/instalar-apache.jpg" alt="" id="BLOGGER_PHOTO_ID_5176686625767326290" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Si mal no recuerdo, los archivos de ejecución de tomcat no traen permiso de ejecución, para dárselos simplemente aplicamos como root lo siguiente:&lt;br /&gt;&lt;blockquote&gt;chmod +x /opt/apache-tomcat-6.0.14/bin/*&lt;/blockquote&gt;&lt;br /&gt;&lt;span style="font-size:180%;"&gt;&lt;br /&gt;Configuración del sistema.&lt;/span&gt;&lt;br /&gt;Ahora debemos configurar PostgreSQL y algunas variables del sistema antes de instalar Openbravo.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;PostgreSQL.&lt;/span&gt;&lt;br /&gt;Lo primero es darle una contraseña al usuario administrador de PostgreSQL, al usuario &lt;span style="font-weight: bold;"&gt;postgres&lt;/span&gt;, para esto simplemente escribimos en consola:&lt;br /&gt;&lt;blockquote&gt;passwd postgres&lt;/blockquote&gt;&lt;br /&gt;y escribimos la contraseña. Ahora debemos iniciar y detener PostgreSQL por primera vez, para que se creen los archivos de configuración, para esto simplemente escribimos en consola:&lt;br /&gt;&lt;blockquote&gt;service postgresql start&lt;/blockquote&gt;&lt;br /&gt;y luego&lt;br /&gt;&lt;blockquote&gt;service postgresql stop&lt;/blockquote&gt;&lt;br /&gt;como se puede ver en la siguiente imagen.&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp2.blogger.com/_TGgpRudXV3w/R9dGtRJggiI/AAAAAAAAAdM/MXfuVpxru_8/s1600-h/configurar-postgreslq-1.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp2.blogger.com/_TGgpRudXV3w/R9dGtRJggiI/AAAAAAAAAdM/MXfuVpxru_8/s320/configurar-postgreslq-1.jpg" alt="" id="BLOGGER_PHOTO_ID_5176684040197014050" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Ahora debemos modificar el archivo &lt;span style="font-weight: bold; font-style: italic;"&gt;/var/lib/pgsql/data/pg_hba.conf&lt;/span&gt;, vamos al final y donde dice:&lt;br /&gt;&lt;blockquote&gt;# "local" is for Unix domain socket connections only&lt;br /&gt;local   all         all                               ident sameuser&lt;br /&gt;# IPv4 local connections:&lt;br /&gt;host    all         all         127.0.0.1/32          ident sameuser&lt;br /&gt;# IPv6 local connections:&lt;br /&gt;host all all ::1/128 ident sameuser&lt;/blockquote&gt;&lt;br /&gt;cambiamos el &lt;span style="font-style: italic;"&gt;"ident sameuser"&lt;/span&gt; por un &lt;span style="font-style: italic;"&gt;"trust"&lt;/span&gt;, sin las comillas, y guardamos.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp1.blogger.com/_TGgpRudXV3w/R9dGuBJggjI/AAAAAAAAAdU/qw04sKTF1Rw/s1600-h/configurar-postgreslq-2.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp1.blogger.com/_TGgpRudXV3w/R9dGuBJggjI/AAAAAAAAAdU/qw04sKTF1Rw/s320/configurar-postgreslq-2.jpg" alt="" id="BLOGGER_PHOTO_ID_5176684053081915954" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Con eso ya tenemos lista la configuración de PostgreSQL en el sistema.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Variables del sistema.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:100%;"&gt;Ahora vamos a configurar las variables del sistema, para eso debemos abrir el el archivo &lt;span style="font-weight: bold; font-style: italic;"&gt;/etc/profile&lt;/span&gt; como usuario root, si usan KDE entonces escriban en la consola, como usuario root:&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;blockquote&gt;kwrite /etc/profile&lt;/blockquote&gt;&lt;br /&gt;bajen hasta el final y agreguen las siguientes lineas:&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;span style="font-size:100%;"&gt;&lt;blockquote&gt;export JAVA_HOME=/usr/java/latest/&lt;br /&gt;export JDK_HOME=/usr/java/latest/&lt;br /&gt;export JRE_HOME=/usr/java/latest/jre&lt;br /&gt;export ANT_HOME=/opt/apache-ant-1.7.0&lt;br /&gt;export CATALINA_HOME=/opt/apache-tomcat-6.0.14&lt;br /&gt;export PATH=${JAVA_HOME}/bin:${JDK_HOME}/bin:${JRE_HOME}/bin:${ANT_HOME}/bin:${CATALINA_HOME}/bin:$PATH&lt;br /&gt;&lt;/blockquote&gt;&lt;/span&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;como se ve en la siguiente imagen:&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp0.blogger.com/_TGgpRudXV3w/R9dIVxJggkI/AAAAAAAAAdc/FhFzTMyEVrI/s1600-h/variables-sistema.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp0.blogger.com/_TGgpRudXV3w/R9dIVxJggkI/AAAAAAAAAdc/FhFzTMyEVrI/s320/variables-sistema.jpg" alt="" id="BLOGGER_PHOTO_ID_5176685835493343810" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;guardamos y reiniciamos el equipo.&lt;br /&gt;&lt;br /&gt;Una vez que reiniciamos el equipo las variables estarán presentes. Fijense bien en las rutas que ahí aparecen en los export, puede que varie un poco si han colocado algo en otro lugar que no sea lo que se ve en la imagen.&lt;br /&gt;&lt;br /&gt;Ahora ya estamos en condiciones de instalar Openbravo.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:180%;"&gt;Instalación Openbravo.&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;Para instalar Openbravo debemos tener arriba a PostgreSQL y a Tomcat, para esto simplemente hay que ingresar en la consola, como root:&lt;br /&gt;&lt;blockquote&gt;service postgresql start&lt;/blockquote&gt;&lt;br /&gt;y&lt;br /&gt;&lt;blockquote&gt;$CATALINA_HOME/bin/startup.sh&lt;/blockquote&gt;&lt;br /&gt;y despues ejecutamos el instalador de Openbravo ...&lt;br /&gt;&lt;blockquote&gt;./OpenbravoERP-2.35-MP1-linux-installer.bin&lt;/blockquote&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;span style="font-size:180%;"&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp1.blogger.com/_TGgpRudXV3w/R9dLVBJggmI/AAAAAAAAAds/gHbWheM5KmY/s1600-h/instalacion-ob-1.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp1.blogger.com/_TGgpRudXV3w/R9dLVBJggmI/AAAAAAAAAds/gHbWheM5KmY/s320/instalacion-ob-1.jpg" alt="" id="BLOGGER_PHOTO_ID_5176689121143325282" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;luego aceptamos la licencia&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp3.blogger.com/_TGgpRudXV3w/R9dLVhJggnI/AAAAAAAAAd0/vijdE82Oie0/s1600-h/instalacion-ob-2.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp3.blogger.com/_TGgpRudXV3w/R9dLVhJggnI/AAAAAAAAAd0/vijdE82Oie0/s320/instalacion-ob-2.jpg" alt="" id="BLOGGER_PHOTO_ID_5176689129733259890" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp2.blogger.com/_TGgpRudXV3w/R9dOGRJggsI/AAAAAAAAAec/T3n0ffNbcE4/s1600-h/instalacion-ob-4.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp2.blogger.com/_TGgpRudXV3w/R9dOGRJggsI/AAAAAAAAAec/T3n0ffNbcE4/s320/instalacion-ob-4.jpg" alt="" id="BLOGGER_PHOTO_ID_5176692166275138242" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;luego escojemos instalación full&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp2.blogger.com/_TGgpRudXV3w/R9rGbhJggtI/AAAAAAAAAek/zNKTFDK3RLw/s1600-h/instalacion-ob-5.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp2.blogger.com/_TGgpRudXV3w/R9rGbhJggtI/AAAAAAAAAek/zNKTFDK3RLw/s320/instalacion-ob-5.jpg" alt="" id="BLOGGER_PHOTO_ID_5177668897672823506" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp2.blogger.com/_TGgpRudXV3w/R9rGchJgguI/AAAAAAAAAes/1AFscXeNY-g/s1600-h/instalacion-ob-6.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp2.blogger.com/_TGgpRudXV3w/R9rGchJgguI/AAAAAAAAAes/1AFscXeNY-g/s320/instalacion-ob-6.jpg" alt="" id="BLOGGER_PHOTO_ID_5177668914852692706" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;después escojemos como base de datos a PostgreSQL&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp2.blogger.com/_TGgpRudXV3w/R9rG2hJggvI/AAAAAAAAAe0/QS3wilfIjgk/s1600-h/instalacion-ob-7.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp2.blogger.com/_TGgpRudXV3w/R9rG2hJggvI/AAAAAAAAAe0/QS3wilfIjgk/s320/instalacion-ob-7.jpg" alt="" id="BLOGGER_PHOTO_ID_5177669361529291506" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;luego hay que colocar la ruta de JAVA_HOME, pero como ya ingresamos la variable al sistema, debería detectar la rutas automáticamente como se ve en la siguiente imagen&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp2.blogger.com/_TGgpRudXV3w/R9rIChJggwI/AAAAAAAAAe8/AzVzuJbAJmY/s1600-h/instalacion-ob-8.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp2.blogger.com/_TGgpRudXV3w/R9rIChJggwI/AAAAAAAAAe8/AzVzuJbAJmY/s320/instalacion-ob-8.jpg" alt="" id="BLOGGER_PHOTO_ID_5177670667199349506" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;lo mismo con Ant&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp0.blogger.com/_TGgpRudXV3w/R9rIDBJggxI/AAAAAAAAAfE/NyCUM5ozLAw/s1600-h/instalacion-ob-9.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp0.blogger.com/_TGgpRudXV3w/R9rIDBJggxI/AAAAAAAAAfE/NyCUM5ozLAw/s320/instalacion-ob-9.jpg" alt="" id="BLOGGER_PHOTO_ID_5177670675789284114" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;y con Tomcat.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp1.blogger.com/_TGgpRudXV3w/R9rIDRJggyI/AAAAAAAAAfM/mPcdrbkWMJQ/s1600-h/instalacion-ob-10.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp1.blogger.com/_TGgpRudXV3w/R9rIDRJggyI/AAAAAAAAAfM/mPcdrbkWMJQ/s320/instalacion-ob-10.jpg" alt="" id="BLOGGER_PHOTO_ID_5177670680084251426" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Ahora debemos ingresar los datos de configuración de Tomcat como se ve en la siguiente imagen, si no han cambiado nada en la configuración de Tomcat, no deberiamos cambiar nada en este punto, dejarlo tal como está, si tienen tomcat corriendo en otro puerto distinto del 8080, es acá donde deben especificar eso&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp0.blogger.com/_TGgpRudXV3w/R9rI4BJggzI/AAAAAAAAAfU/BpWj32VYrgg/s1600-h/instalacion-ob-11.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp0.blogger.com/_TGgpRudXV3w/R9rI4BJggzI/AAAAAAAAAfU/BpWj32VYrgg/s320/instalacion-ob-11.jpg" alt="" id="BLOGGER_PHOTO_ID_5177671586322350898" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;luego deben ingresar el directorio en el cual se encuentran los archivos ejecutables de PostgreSQL, en el caso de PCLinuxOS 2008 y openSUSE 10.2/10.3 corresponde a &lt;span style="font-weight: bold; font-style: italic;"&gt;/usr/bin&lt;/span&gt;, si usan otra distro deben saber cual directorio corresponde&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp3.blogger.com/_TGgpRudXV3w/R9rJYxJgg0I/AAAAAAAAAfc/LDJ_XVaSoF4/s1600-h/instalacion-ob-12.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp3.blogger.com/_TGgpRudXV3w/R9rJYxJgg0I/AAAAAAAAAfc/LDJ_XVaSoF4/s320/instalacion-ob-12.jpg" alt="" id="BLOGGER_PHOTO_ID_5177672148963066690" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;luego les saldrá un mensaje sobre la versión de PostgreSQL, nada de que preocuparse a menos que estén utilizando la versión 8.3 (según uno de los usuarios que hizo un comentario al respecto, aun no he probado) o una menor a la 8.1.4&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp1.blogger.com/_TGgpRudXV3w/R9rJ4RJgg1I/AAAAAAAAAfk/z2sYIVhtDBU/s1600-h/instalacion-ob-13.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp1.blogger.com/_TGgpRudXV3w/R9rJ4RJgg1I/AAAAAAAAAfk/z2sYIVhtDBU/s320/instalacion-ob-13.jpg" alt="" id="BLOGGER_PHOTO_ID_5177672690128946002" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;luego debemos ingresar los parámetros de la base de datos, como el puerto, el nombre de la base de datos, etc. Si no hemos cambiado nada (como el puerto por default, o la ubicación de la base de datos) entonces dejamos todo tal cual está.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp0.blogger.com/_TGgpRudXV3w/R9rKdBJgg2I/AAAAAAAAAfs/EGgx3LKzFRA/s1600-h/instalacion-ob-14.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp0.blogger.com/_TGgpRudXV3w/R9rKdBJgg2I/AAAAAAAAAfs/EGgx3LKzFRA/s320/instalacion-ob-14.jpg" alt="" id="BLOGGER_PHOTO_ID_5177673321489138530" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;luego se ingresa la contraseña del usuario postgres (administrador de PostgreSQL)&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp2.blogger.com/_TGgpRudXV3w/R9rK3hJgg3I/AAAAAAAAAf0/U3F1HtzEXZg/s1600-h/instalacion-ob-15.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp2.blogger.com/_TGgpRudXV3w/R9rK3hJgg3I/AAAAAAAAAf0/U3F1HtzEXZg/s320/instalacion-ob-15.jpg" alt="" id="BLOGGER_PHOTO_ID_5177673776755671922" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;después se crea un usuario y contraseña para la base de datos de openbravo&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp1.blogger.com/_TGgpRudXV3w/R9rLNRJgg4I/AAAAAAAAAf8/8emrBHzXdzk/s1600-h/instalacion-ob-16.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp1.blogger.com/_TGgpRudXV3w/R9rLNRJgg4I/AAAAAAAAAf8/8emrBHzXdzk/s320/instalacion-ob-16.jpg" alt="" id="BLOGGER_PHOTO_ID_5177674150417826690" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;y luego estamos listos para instalar&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp2.blogger.com/_TGgpRudXV3w/R9rMXhJgg7I/AAAAAAAAAgU/lvHpx1NSq1w/s1600-h/instalacion-ob-17.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp2.blogger.com/_TGgpRudXV3w/R9rMXhJgg7I/AAAAAAAAAgU/lvHpx1NSq1w/s320/instalacion-ob-17.jpg" alt="" id="BLOGGER_PHOTO_ID_5177675426023113650" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;luego solo debemos esperar a que termine de compilar e instalar, lo cual demora un poco mas de una hora, dependiendo del equipo que tengamos (puede ser menos tiempo).&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp2.blogger.com/_TGgpRudXV3w/R9rLwhJgg5I/AAAAAAAAAgE/bc9NLoYFXiM/s1600-h/instalacion-ob-18.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp2.blogger.com/_TGgpRudXV3w/R9rLwhJgg5I/AAAAAAAAAgE/bc9NLoYFXiM/s320/instalacion-ob-18.jpg" alt="" id="BLOGGER_PHOTO_ID_5177674756008215442" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Una vez listo abrimos nuestro navegador favorito (firefox :p) y escribimos &lt;span style="font-weight: bold; font-style: italic;"&gt;http://localhost:8080/openbravo&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp0.blogger.com/_TGgpRudXV3w/R9rLxBJgg6I/AAAAAAAAAgM/Fo-5Kt2PwgQ/s1600-h/instalacion-ob-19.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp0.blogger.com/_TGgpRudXV3w/R9rLxBJgg6I/AAAAAAAAAgM/Fo-5Kt2PwgQ/s320/instalacion-ob-19.jpg" alt="" id="BLOGGER_PHOTO_ID_5177674764598150050" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;el nombre de usuario es &lt;span style="font-weight: bold;"&gt;Openbravo&lt;/span&gt; y la contraseña es &lt;span style="font-weight: bold;"&gt;openbravo&lt;/span&gt;. Ya tenemos nuestro flamante ERP instalado en nuestro sistema, pero por &lt;span style="font-style: italic;"&gt;default&lt;/span&gt; está en inglés&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp3.blogger.com/_TGgpRudXV3w/R9rOBxJgg8I/AAAAAAAAAgc/6fOdyoxByc8/s1600-h/instalacion-ob-20.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp3.blogger.com/_TGgpRudXV3w/R9rOBxJgg8I/AAAAAAAAAgc/6fOdyoxByc8/s320/instalacion-ob-20.jpg" alt="" id="BLOGGER_PHOTO_ID_5177677251384214466" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;en el panel de la izquierda en la parte de arriba dice Openbravo (junto a un ícono de una persona), si pinchamos ahí se abrirá la siguiente ventana&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp0.blogger.com/_TGgpRudXV3w/R9rOCBJgg9I/AAAAAAAAAgk/w5qH-t_8Jts/s1600-h/instalacion-ob-21.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp0.blogger.com/_TGgpRudXV3w/R9rOCBJgg9I/AAAAAAAAAgk/w5qH-t_8Jts/s320/instalacion-ob-21.jpg" alt="" id="BLOGGER_PHOTO_ID_5177677255679181778" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;ahí en la sección &lt;span style="font-weight: bold;"&gt;Language&lt;/span&gt; cambiamos &lt;span style="font-weight: bold;"&gt;English&lt;/span&gt; por &lt;span style="font-weight: bold;"&gt;Spanish&lt;/span&gt; y guardamos presionando &lt;span style="font-weight: bold;"&gt;Ok&lt;/span&gt; y ya tenemos Openbravo en español.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp2.blogger.com/_TGgpRudXV3w/R9rOChJgg-I/AAAAAAAAAgs/GNHzkqMV3Ts/s1600-h/instalacion-ob-22.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp2.blogger.com/_TGgpRudXV3w/R9rOChJgg-I/AAAAAAAAAgs/GNHzkqMV3Ts/s320/instalacion-ob-22.jpg" alt="" id="BLOGGER_PHOTO_ID_5177677264269116386" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Espero les sirva esta guía, la hice con un poco mas de detalle que la anterior para ayudar a los recién iniciados en linux. Mas adelante haré la misma guía de instalación pero sobre Windows XP.&lt;br /&gt;&lt;br /&gt;saludos !!!&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/1421033339681316542-7388247625301463505?l=metalklesk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://metalklesk.blogspot.com/feeds/7388247625301463505/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://metalklesk.blogspot.com/2008/03/instalacin-openbravo-235-mp1-en-linux.html#comment-form' title='11 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1421033339681316542/posts/default/7388247625301463505'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1421033339681316542/posts/default/7388247625301463505'/><link rel='alternate' type='text/html' href='http://metalklesk.blogspot.com/2008/03/instalacin-openbravo-235-mp1-en-linux.html' title='Instalación Openbravo 2.35 MP1 en Linux'/><author><name>Daniel Dario Morales Salas</name><uri>http://www.blogger.com/profile/07642586501018157497</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='28' src='http://3.bp.blogspot.com/_TGgpRudXV3w/SfP_sc5YZ3I/AAAAAAAABSs/APK4YFwjVn4/S220/yoft3.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp0.blogger.com/_TGgpRudXV3w/R9c-vxJgghI/AAAAAAAAAdE/gnSClbMuoaQ/s72-c/instalar-postgresql.jpg' height='72' width='72'/><thr:total>11</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1421033339681316542.post-3532090268736403219</id><published>2008-03-08T20:21:00.007-03:00</published><updated>2008-03-10T20:58:39.902-03:00</updated><title type='text'>Creación de LiveUSB con PCLinuxOS</title><content type='html'>&lt;div style="text-align: justify;"&gt;Hola, como algunos sabían yo usaba openSUSE 10.3 como sistema operativo, pero casi todos los dias pasaba en la Universidad y usaba mi live cd de PCLinuxOS, al final resultó que me acostumbré mas a ésta distro linux por lo que decidí eliminar de mi máquina a openSUSE y dejar a PCLinuxOS.&lt;br /&gt;&lt;br /&gt;Además resulta que estoy desarrollando un software para mi tesis y en la misma Universidad prácticamente no se puede trabajar ya que por una parte tienen instalado Windows XP sp2 en TODOS los computadores y por otra están TODOS infectados, por lo que no arriesgaría desarrollar mi tesis en esos computadores, aunque tengan antivirus, no sirve de nada, un problema que todos los usuarios de Windows, por muy maestros que sean, conocen.&lt;br /&gt;&lt;br /&gt;Lo que se puede hacer y lo que vengo haciendo desde hace 2 años es usar un live cd, que es una distribución de linux que bootea desde el cd o dvd y no toca el disco duro, a no ser que queramos claro. Esta solución sirve, pero resulta muy lento, es mas rápido que trabajar en los Windows instalados, por el estado en el que están, pero aun asi es lento. Entonces busqué la opcion de instalar linux en un pendrive y encontré que si se puede.&lt;br /&gt;&lt;br /&gt;Para instalar linux en un pendrive hay varias formas (&lt;a href="http://www.google.com/"&gt;google&lt;/a&gt; es tu amigo), pero definitivamente la mas fácil es usando PCLinuxOS.&lt;br /&gt;&lt;br /&gt;Requerimientos:&lt;br /&gt;&lt;/div&gt;&lt;ul style="text-align: justify;"&gt;&lt;li&gt;&lt;a href="http://www.pclinuxos.com/index.php?option=com_smf&amp;amp;Itemid=26&amp;amp;topic=38573.0"&gt;PCLinuxOS minime 2008&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;Pendrive de 1gb o mas (yo uso uno de 4 gb).&lt;/li&gt;&lt;li&gt;Conexion a Internet.&lt;/li&gt;&lt;/ul&gt;&lt;div style="text-align: justify;"&gt;La iso de PCLinuxOS minime 2008 pesa solo 296 mb y trae el escritorio KDE 3.5.8 con drivers para tarjetas de red y lo mas básico. La idea de esa versión es que un usuario la pueda remasterizar, es decir, personalizar a gusto y crear su propia versión con el software que hay disponible, con sus propias configuraciones de escritorio, etc.&lt;br /&gt;&lt;br /&gt;Una vez descargada hay que grabarla a un cd o dvd y ya puedes bootear el pc desde el cdrom o dvdrom. Luego de iniciar el sistema puedes instalarlo (en el escritorio encontraras un icono y solo debes seguir las instrucciones.). Si no quieren instalarlo en el computador de base, pueden usar una máquina virtual como &lt;a href="http://www.virtualbox.org/"&gt;virtualbox&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Una vez instalado ya es cosa de instalar/desinstalar/configurar/personalizar la distro a gusto, para eso necesitarán una conexion a internet para poder descargar los programas que quieran instalar a través de synaptic (o a mano si quieren).&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp0.blogger.com/_TGgpRudXV3w/R9NSLxJggbI/AAAAAAAAAcU/hwDRKLPC9Ps/s1600-h/liveusb0.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp0.blogger.com/_TGgpRudXV3w/R9NSLxJggbI/AAAAAAAAAcU/hwDRKLPC9Ps/s320/liveusb0.jpg" alt="" id="BLOGGER_PHOTO_ID_5175570758904086962" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Para conectarse a Internet pueden utilizar el panel de control de pclinuxos, el cual lo encuentran en &lt;span style="font-style: italic; font-weight: bold;"&gt;menú -&gt; aplicaciones -&gt; sistema -&gt; configuracion -&gt; configure your system&lt;/span&gt;. Especificamente para internet entran a la opción que dice &lt;span style="font-style: italic; font-weight: bold;"&gt;redes e internet&lt;/span&gt; y luego &lt;span style="font-style: italic; font-weight: bold;"&gt;configurar una nueva interfaz de red&lt;/span&gt; y siguen las instrucciones.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp3.blogger.com/_TGgpRudXV3w/R9XJABJgggI/AAAAAAAAAc8/da1mgnyJV8I/s1600-h/centro-control.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp3.blogger.com/_TGgpRudXV3w/R9XJABJgggI/AAAAAAAAAc8/da1mgnyJV8I/s320/centro-control.jpg" alt="" id="BLOGGER_PHOTO_ID_5176264348877750786" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Una vez listo lo que hay que hacer es abrir una consola (menú -&gt; aplicaciones -&gt; sistema -&gt; terminales), loguearse como usuario root (escribir &lt;span style="font-style: italic; font-weight: bold;"&gt;su&lt;/span&gt; y presionar enter, ingresar la contraseña y presionar enter) y escribir "&lt;span style="font-style: italic; font-weight: bold;"&gt;remasterme&lt;/span&gt;" sin las comillas, eso creará una iso de nombre &lt;span style="font-style: italic; font-weight: bold;"&gt;livecd.iso&lt;/span&gt;, la cual si gustan la pueden grabar a un cd/dvd y ya tienen un livecd/dvd personalizado.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp0.blogger.com/_TGgpRudXV3w/R9NSMxJggcI/AAAAAAAAAcc/z3a6DqTNCWE/s1600-h/liveusb1.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp0.blogger.com/_TGgpRudXV3w/R9NSMxJggcI/AAAAAAAAAcc/z3a6DqTNCWE/s320/liveusb1.jpg" alt="" id="BLOGGER_PHOTO_ID_5175570776083956162" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Una vez que ya tienen la iso personalizada a gusto, en la misma consola, como usuario root escriben "&lt;span style="font-style: italic; font-weight: bold;"&gt;liveusb&lt;/span&gt;". Al escribir eso aparecerá un wizard muy sencillo que tienen que seguir. Basicamente les sale un mensaje que les advierte que deben ingresar el pendrive, que debe estar en formato fat16, etc. Luego les pedirá que seleccionen el pendrive y que le pasen la iso creada anteriormente. Una vez pasada la iso comenzará el proceso de creación del liveusb. Al finalizar ya esta listo, pueden reiniciar el computador y ya están listos para bootear desde el pendrive, que es bastante mas rápido que desde un cd o dvd.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp3.blogger.com/_TGgpRudXV3w/R9NSPhJggdI/AAAAAAAAAck/EJfMYyXpuRk/s1600-h/liveusb2.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp3.blogger.com/_TGgpRudXV3w/R9NSPhJggdI/AAAAAAAAAck/EJfMYyXpuRk/s320/liveusb2.jpg" alt="" id="BLOGGER_PHOTO_ID_5175570823328596434" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp3.blogger.com/_TGgpRudXV3w/R9NSRhJggfI/AAAAAAAAAc0/R3gA69hlHDU/s1600-h/liveusb4.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp3.blogger.com/_TGgpRudXV3w/R9NSRhJggfI/AAAAAAAAAc0/R3gA69hlHDU/s320/liveusb4.jpg" alt="" id="BLOGGER_PHOTO_ID_5175570857688334834" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Espero les sirva, por lo menos a mi si me ha servido para trabjar tranquilamente en mi tesis.&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;Saludos !!!&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1421033339681316542-3532090268736403219?l=metalklesk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://metalklesk.blogspot.com/feeds/3532090268736403219/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://metalklesk.blogspot.com/2008/03/creacin-de-liveusb-con-pclinuxos.html#comment-form' title='7 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1421033339681316542/posts/default/3532090268736403219'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1421033339681316542/posts/default/3532090268736403219'/><link rel='alternate' type='text/html' href='http://metalklesk.blogspot.com/2008/03/creacin-de-liveusb-con-pclinuxos.html' title='Creación de LiveUSB con PCLinuxOS'/><author><name>Daniel Dario Morales Salas</name><uri>http://www.blogger.com/profile/07642586501018157497</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='28' src='http://3.bp.blogspot.com/_TGgpRudXV3w/SfP_sc5YZ3I/AAAAAAAABSs/APK4YFwjVn4/S220/yoft3.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp0.blogger.com/_TGgpRudXV3w/R9NSLxJggbI/AAAAAAAAAcU/hwDRKLPC9Ps/s72-c/liveusb0.jpg' height='72' width='72'/><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1421033339681316542.post-8593812486807282768</id><published>2007-12-31T02:31:00.000-03:00</published><updated>2007-12-31T05:21:15.237-03:00</updated><title type='text'>OpenVPN y Samba sobre openSUSE 10.3</title><content type='html'>&lt;div style="text-align: justify;"&gt;Este fin de semana estuve "&lt;span style="font-weight: bold;"&gt;jugando&lt;/span&gt;" con unos softwares bien potentes, &lt;a href="http://openvpn.net/"&gt;OpenVPN&lt;/a&gt; y &lt;a href="http://us3.samba.org/samba/"&gt;Samba&lt;/a&gt;. OpenVPN sirve para crear redes virtuales privadas entre equipos que fisicamente estan separados (no estan en la misma red ni en el mismo dominio). De esta manera se pueden conectar equipos o redes enteras unas con otras, por ejemplo para unir sucursales de una misma organización y compartir información por un canal seguro, o comunicar empresas con proveedores, etc.&lt;br /&gt;&lt;br /&gt;OpenVPN utiliza &lt;a href="http://openssl.org/"&gt;OpenSSL&lt;/a&gt; para agregar la capa de seguridad al sistema a través de la encriptación, haciendo uso de llaves simétricas o a través de emisión de certificados digitales y llaves asimétricas (el segundo método es lejos mejor).&lt;br /&gt;&lt;br /&gt;A través de OpenVPN podemos conectar equipos con distintos sistemas operativos, ya que tiene versiones para varios (linux, windows, etc.) y corre tanto en modo servidor como en modo cliente (se pueden ejecutar los dos modos al mismo tiempo en el mismo equipo en procesos distintos).&lt;br /&gt;&lt;br /&gt;Samba es un software que sirve para compartir recursos en una red, autenticar usuarios, controlar acceso a recursos, tiene compatibilidad con &lt;span style="font-style: italic;"&gt;active directory&lt;/span&gt; y un laaaargo etc. Mediante Samba podemos compartir recursos en equipos que corren distintos sistemas operativos, por ejemplo podemos compartir una carpeta en linux y desde windows lo podriamos ver sin problemas, o al revés, desde windows podríamos compartir una carpeta (a traves de samba o de windows) y desde linux lo podríamos ver también.&lt;br /&gt;&lt;br /&gt;La unión de estos dos sistemas lo encuentro especialmente poderoso, por un lado creamos una red con equipos distantes y por otro lado aprovechamos los recursos compartiendo  y manejando, de forma transparente, la seguridad de los datos en la red.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.opensuse.org/"&gt;OpenSUSE 10.3&lt;/a&gt; y &lt;a href="http://www.mandriva.com/"&gt;Mandriva 2008&lt;/a&gt; (los que probé en estos dias) traen todo lo necesario para armar un servidor/cliente OpenVPN y Samba.&lt;br /&gt;&lt;br /&gt;En internet se pueden encontrar varias guías para ayudar a configurar OpenVPN y Samba, en mi caso particular me gustó mucho &lt;a href="http://tuxjm.net/docs/openvpn-como4slack/index.html"&gt;ésta&lt;/a&gt; guía para OpenVPN que seguí paso a paso, solo cambie cosas muy particulares para que funcionara en openSUSE 10.3. Debo recalcar que es muy buena y no tiene caso volver a redactar algo como lo que sale ahí en mi blog, está para seguir paso a paso y es casi imposible equivocarse.&lt;br /&gt;&lt;br /&gt;Sobre Samba, leí muchas guías en Internet, ninguna me sirvió. Lo fácil es levantar el servidor usando YAST, pues en &lt;span style="font-style: italic;"&gt;YAST -&gt; Servicios de red -&gt; Servidor Samba&lt;/span&gt; le damos siguiente siguiente a todo y ya está.&lt;br /&gt;Incluso te da la opción de abrir el puerto en el cortafuegos (genial, todo automático y a puros clicks).&lt;br /&gt;&lt;br /&gt;El problema que tuve fue al tratar de compartir recursos, &lt;span style="font-style: italic;"&gt;YAST&lt;/span&gt; te da la opción, pero cuando quería acceder a las carpetas compartidas no podía, ingresaba &lt;span style="font-style: italic;"&gt;smb:/&lt;/span&gt; en konqueror y la red aparecía, las carpetas también pero al acceder salen errores como "&lt;span style="font-weight: bold; font-style: italic;"&gt;el recurso o carpeta no existe&lt;/span&gt;", siendo que tenía definido que la carpeta estaba para compartir con todos sin pedir password ni nada. Probé desde el módulo de Samba en KDE, lo mismo, los mismos errores. Perdí muchas horas tratando, conclusión, las herramientas que vienen con openSUSE no lo hacen del todo bien o a mi me faltó marcar/desmarcar alguna opción.&lt;br /&gt;&lt;br /&gt;Al final lo solucioné a mano (como en la vieja escuela). Samba lee un archivo de configuración que se llama &lt;span style="font-style: italic;"&gt;smb.conf&lt;/span&gt; que está en &lt;span style="font-style: italic;"&gt;/etc/samba&lt;/span&gt;. Este archivo define una configuración global a base de directivas del tipo &lt;span style="font-style: italic;"&gt;variable = valor&lt;/span&gt;. La parte global YAST la maneja a la perfección, pero por experiencia propia recomiendo agregar los recursos de red a compartir a mano.&lt;br /&gt;&lt;br /&gt;En este caso particular de OpenVPN y Samba, hay una cosa que hay que tener en cuenta, si configuran Samba (suponiendo que los recursos estan disponibles en la red, todo correcto) y OpenVPN, desde el cliente OpenVPN &lt;span style="font-weight: bold;"&gt;NO&lt;/span&gt; tendrán acceso a los recursos Samba.&lt;br /&gt;&lt;br /&gt;Lo anterior es porque OpenVPN crea una sub red definida en &lt;span style="font-style: italic;"&gt;10.8.0.0/24&lt;/span&gt; desde la cual asigna una ip a cada máquina dentro de ese rango y Samba solo permite compartir recursos en la sub red del servidor (en mi caso &lt;span style="font-style: italic;"&gt;192.168.0.0/24&lt;/span&gt;), por lo tanto aunque las máquinas estén en red, no podrán acceder a los recursos.&lt;br /&gt;&lt;br /&gt;Para solucionar esto solo hay que agregar una linea de texto a la configuración global de samba (smb.conf):&lt;br /&gt;&lt;/div&gt;&lt;blockquote&gt;hosts allow = 192.168.0.0/24 10.8.0.0/24 127.0.0.1&lt;/blockquote&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;y en el caso de que el servidor Samba y el servidor OpenVPN estén corriendo en la misma máquina se agrega la siguiente linea:&lt;br /&gt;&lt;/div&gt;&lt;blockquote&gt;interfaces = 192.168.0.0/24 10.8.0.0/24&lt;/blockquote&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Luego se reinicia el servidor Samba (&lt;span style="font-style: italic;"&gt;#service smb restart&lt;/span&gt;) y los clientes de la VPN podrán acceder a los recursos sin problema.&lt;br /&gt;&lt;br /&gt;Ahora, cómo agregamos recursos a Samba ? pues la verdad es muy simple y les mostraré 3 ejemplos, en los cuales compartiremos 3 carpetas pero usando distintas directivas para definir permisos, control de acceso ,etc.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;blockquote&gt;[compartido]&lt;br /&gt;comment = Directorio de acceso general&lt;br /&gt;path = /home/metalklesk/Documents/Compartido/General&lt;br /&gt;read only = No&lt;br /&gt;guest ok = yes&lt;br /&gt;browseable = yes&lt;/blockquote&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;Con esa configuración, el recurso está disponible para cualquiera y tiene permisos de escritura y lectura.&lt;br /&gt;&lt;/div&gt;&lt;ol&gt;&lt;li&gt;La primera linea define el nombre del recurso, con éste nombre se identifica en la red.&lt;/li&gt;&lt;li&gt;Lo segundo es solo un comentario y puede ser omitido.&lt;/li&gt;&lt;li&gt;El &lt;span style="font-style: italic;"&gt;path&lt;/span&gt; define el directorio del recurso que se quiere compartir.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-style: italic;"&gt;Read only = no&lt;/span&gt; significa que estamos dando permisos de lectura y escritura al recurso.&lt;/li&gt;&lt;li&gt;&lt;span style="font-style: italic;"&gt;guest ok = yes&lt;/span&gt; significa que permitimos que cualqueira entre y vea el recurso.&lt;/li&gt;&lt;li&gt;&lt;span style="font-style: italic;"&gt;browseable = yes&lt;/span&gt; significa que el recurso se puede ver por cualquiera y está disponible.&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;blockquote&gt;[restringido]&lt;br /&gt;comment = Directorio de acceso restringido&lt;br /&gt;path = /home/metalklesk/Documents/Compartido/Restringido&lt;br /&gt;read only = No&lt;br /&gt;browseable = yes&lt;br /&gt;security = shared&lt;br /&gt;valid users = klesk metalklesk&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Con esta configuración el recurso solo estará disponible para los usuarios &lt;span style="font-style: italic;"&gt;klesk&lt;/span&gt; y &lt;span style="font-style: italic;"&gt;metalklesk&lt;/span&gt;, para cualquier otro usuario el acceso al recurso será denegado. Esto se define a través de la directiva &lt;span style="font-style: italic;"&gt;valid users = klesk metalklesk&lt;/span&gt;.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;blockquote&gt;[restringido2]&lt;br /&gt;comment = Directorio de acceso restringido&lt;br /&gt;path = /home/metalklesk/Documents/Compartido/Restringido2&lt;br /&gt;read only = No&lt;br /&gt;browseable = yes&lt;br /&gt;security = shared&lt;br /&gt;invalid users = metalklesk&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Esta configuración permite el acceso al recurso a todos los usuarios de la red excepto al usuario metalklesk mediante la directiva &lt;span style="font-style: italic;"&gt;invalid users = metalklesk&lt;/span&gt;.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Bueno, pero y como se agregan usuarios a Samba ? pues muy fácil, se utiliza el comando:&lt;br /&gt;&lt;blockquote&gt;smbpasswd -a usuario&lt;/blockquote&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;y se le ingresa una contraseña y listo.&lt;br /&gt;&lt;br /&gt;Ya con esto podrán compartir carpetas o recursos especificando algunas reglas para cada uno de ellos. Existem muchas mas combinaciones y mas directivas, se pueden remitir al manual de Samba para conocerlas todas y lo recomiendo.&lt;br /&gt;&lt;br /&gt;A continuación les dejo mi archivo smb.conf completo por si les sirve.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;blockquote&gt;# smb.conf is the main Samba configuration file. You find a full commented&lt;br /&gt;# version at /usr/share/doc/packages/samba/examples/smb.conf.SUSE if the&lt;br /&gt;# samba-doc package is installed.&lt;br /&gt;# Date: 2007-09-22&lt;br /&gt;[global]&lt;br /&gt;printing = cups&lt;br /&gt;printcap name = cups&lt;br /&gt;cups options = raw&lt;br /&gt;map to guest = Bad User&lt;br /&gt;include = /etc/samba/dhcp.conf&lt;br /&gt;logon path = \\%L\profiles\.msprofile&lt;br /&gt;logon home = \\%L\%U\.9xprofile&lt;br /&gt;logon drive = P:&lt;br /&gt;usershare allow guests = Yes&lt;br /&gt;usershare max shares = 100&lt;br /&gt;security = share&lt;br /&gt;restrict anonymous = no&lt;br /&gt;domain master = no&lt;br /&gt;preferred master = no&lt;br /&gt;max protocol = NT&lt;br /&gt;acl compatibility = win2k&lt;br /&gt;ldap ssl = No&lt;br /&gt;server signing = Auto&lt;br /&gt;SO_RCVBUF=8192 SO_SNDBUF=8192&lt;br /&gt;socket options = TCP_NODELAY&lt;br /&gt;hosts allow = 192.168.0.0/24 10.8.0.0/24 127.0.0.1&lt;br /&gt;interfaces = 192.168.0.0/24 10.8.0.0/24&lt;br /&gt;&lt;br /&gt;[homes]&lt;br /&gt;comment = Home Directories&lt;br /&gt;valid users = %S, %D%w%S&lt;br /&gt;browseable = No&lt;br /&gt;read only = No&lt;br /&gt;inherit acls = Yes&lt;br /&gt;&lt;br /&gt;[users]&lt;br /&gt;comment = All users&lt;br /&gt;path = /home&lt;br /&gt;read only = No&lt;br /&gt;inherit acls = Yes&lt;br /&gt;veto files = /aquota.user/groups/shares/&lt;br /&gt;browseable = yes&lt;br /&gt;public = yes&lt;br /&gt;&lt;br /&gt;[groups]&lt;br /&gt;comment = All groups&lt;br /&gt;path = /home/groups&lt;br /&gt;read only = No&lt;br /&gt;inherit acls = Yes&lt;br /&gt;&lt;br /&gt;[printers]&lt;br /&gt;comment = All Printers&lt;br /&gt;path = /var/tmp&lt;br /&gt;printable = Yes&lt;br /&gt;create mask = 0600&lt;br /&gt;browseable = No&lt;br /&gt;&lt;br /&gt;[print$]&lt;br /&gt;comment = Printer Drivers&lt;br /&gt;path = /var/lib/samba/drivers&lt;br /&gt;write list = @ntadmin root&lt;br /&gt;force group = ntadmin&lt;br /&gt;create mask = 0664&lt;br /&gt;directory mask = 0775&lt;br /&gt;&lt;br /&gt;[compartido]&lt;br /&gt;comment = Directorio de acceso general&lt;br /&gt;path = /home/metalklesk/Documents/Compartido/General&lt;br /&gt;read only = No&lt;br /&gt;guest ok = yes&lt;br /&gt;browseable = yes&lt;br /&gt;&lt;br /&gt;[restringido]&lt;br /&gt;comment = Directorio de acceso restringido&lt;br /&gt;path = /home/metalklesk/Documents/Compartido/Restringido&lt;br /&gt;read only = No&lt;br /&gt;browseable = yes&lt;br /&gt;security = shared&lt;br /&gt;valid users = klesk metalklesk&lt;br /&gt;&lt;br /&gt;[restringido2]&lt;br /&gt;comment = Directorio de acceso restringido&lt;br /&gt;path = /home/metalklesk/Documents/Compartido/Restringido2&lt;br /&gt;read only = No&lt;br /&gt;browseable = yes&lt;br /&gt;security = shared&lt;br /&gt;invalid users = metalklesk&lt;/blockquote&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;Es muy probable que les suceda que no puedan acceder a los recursos desde un cliente (windows o linux), deben fijarse en los permisos de usuario de las carpetas o directorios que estén compartiendo. Por ejemplo la carpeta &lt;span style="font-style: italic;"&gt;Documents&lt;/span&gt; en openSUSE no puede ser accedida por otro usuario que no sea el dueño y el root, por lo tanto aunque configuren todo bien en Samba, no podrá ser accesado por un cliente. O modifican los permisos de la carpeta o escojen otra.&lt;br /&gt;&lt;br /&gt;Y como siempre unas capturas de pantalla. La primera muestra a openSUSE 10.3 corriendo un servidor Samba y OpenVPN y mandriva como cliente de ambos.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp0.blogger.com/_TGgpRudXV3w/R3iYqKZ6UtI/AAAAAAAAAbs/v7klaLzCeIM/s1600-h/imagen1.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp0.blogger.com/_TGgpRudXV3w/R3iYqKZ6UtI/AAAAAAAAAbs/v7klaLzCeIM/s320/imagen1.jpg" alt="" id="BLOGGER_PHOTO_ID_5150034024013124306" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;La siguiente muestra el diálogo de autenticación que sale al intentar entrar a la carpeta restringida&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp1.blogger.com/_TGgpRudXV3w/R3iYqaZ6UuI/AAAAAAAAAb0/ZMQafbS9FlU/s1600-h/imagen2.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp1.blogger.com/_TGgpRudXV3w/R3iYqaZ6UuI/AAAAAAAAAb0/ZMQafbS9FlU/s320/imagen2.jpg" alt="" id="BLOGGER_PHOTO_ID_5150034028308091618" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;La siguiente muestra que efectivamente las máquinas están conectadas en red, mediante un simple ping a la ip del cliente (ip asignada por el servidor OpenVPN)&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp2.blogger.com/_TGgpRudXV3w/R3iYqqZ6UvI/AAAAAAAAAb8/8V1w7m4hl8Q/s1600-h/imagen3.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp2.blogger.com/_TGgpRudXV3w/R3iYqqZ6UvI/AAAAAAAAAb8/8V1w7m4hl8Q/s320/imagen3.jpg" alt="" id="BLOGGER_PHOTO_ID_5150034032603058930" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;La siguiente muestra un cliente Windows conectado a la VPN&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp2.blogger.com/_TGgpRudXV3w/R3iYqqZ6UwI/AAAAAAAAAcE/qjgB7Exl2ek/s1600-h/imagen4.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp2.blogger.com/_TGgpRudXV3w/R3iYqqZ6UwI/AAAAAAAAAcE/qjgB7Exl2ek/s320/imagen4.jpg" alt="" id="BLOGGER_PHOTO_ID_5150034032603058946" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;La siguiente muestra como Windows puede ver los recursos compartidos en openSUSE 10.3 mediante samba&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp2.blogger.com/_TGgpRudXV3w/R3iYqqZ6UxI/AAAAAAAAAcM/u-0KpT2l5QU/s1600-h/imagen5.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp2.blogger.com/_TGgpRudXV3w/R3iYqqZ6UxI/AAAAAAAAAcM/u-0KpT2l5QU/s320/imagen5.jpg" alt="" id="BLOGGER_PHOTO_ID_5150034032603058962" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;En las imágenes anteriores se ve que las pruebas fueron realizadas con máquinas virtuales, esto no es ninguna trampa, efectivamente están en red a través de OpenVPN. Además probé con el equipo de un amigo y también funcionó.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Espero les sirva.&lt;br /&gt;&lt;br /&gt;saludos !!!&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1421033339681316542-8593812486807282768?l=metalklesk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://metalklesk.blogspot.com/feeds/8593812486807282768/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://metalklesk.blogspot.com/2007/12/openvpn-y-samba-sobre-opensuse-103.html#comment-form' title='8 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1421033339681316542/posts/default/8593812486807282768'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1421033339681316542/posts/default/8593812486807282768'/><link rel='alternate' type='text/html' href='http://metalklesk.blogspot.com/2007/12/openvpn-y-samba-sobre-opensuse-103.html' title='OpenVPN y Samba sobre openSUSE 10.3'/><author><name>Daniel Dario Morales Salas</name><uri>http://www.blogger.com/profile/07642586501018157497</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='28' src='http://3.bp.blogspot.com/_TGgpRudXV3w/SfP_sc5YZ3I/AAAAAAAABSs/APK4YFwjVn4/S220/yoft3.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp0.blogger.com/_TGgpRudXV3w/R3iYqKZ6UtI/AAAAAAAAAbs/v7klaLzCeIM/s72-c/imagen1.jpg' height='72' width='72'/><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1421033339681316542.post-9103332961397888634</id><published>2007-12-29T02:41:00.000-03:00</published><updated>2007-12-29T03:35:41.517-03:00</updated><title type='text'>Pebble, un blog desarrollado en java sobre Glassfish V2 en openSUSE 10.3</title><content type='html'>&lt;div style="text-align: justify;"&gt;Pebble es un sistema blog liviano que soporta multi usuarios, muti blogs, cada uno puede tener uno o mas blogs. Maneja roles de usuario como administrador, dueño de un blog, etc.&lt;br /&gt;&lt;br /&gt;Trae varias caracteristicas bien interesantes, como por ejemplo:&lt;br /&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;Permite subir archivos de cualquier tipo para compartir con los lectores.&lt;/li&gt;&lt;li&gt;Tiene un editor de texto increible, es sumamente configurable.&lt;/li&gt;&lt;li&gt;Trae soporte para varios idiomas.&lt;/li&gt;&lt;li&gt;Puedes cambiar el theme por usuario.&lt;/li&gt;&lt;li&gt;No requiere de una base de datos.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;etc.&lt;/li&gt;&lt;/ul&gt;&lt;div style="text-align: justify;"&gt;Pueden ver todas sus características en el &lt;a href="http://pebble.sourceforge.net/"&gt;sitio web oficial&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Existen muchos sistemas de blog públicos como &lt;a href="http://www.blogger.com/"&gt;Blogger&lt;/a&gt; o &lt;a href="http://wordpress.com/"&gt;Wordpress&lt;/a&gt;, entonces para que interesarse en otro mas ? que puede aportar pebble a nuestra vida personal y/o profesional ?&lt;br /&gt;&lt;br /&gt;Pues puede aportar mucho, es open source asi es que de licencias no hay que preocuparse, se puede adecuar a nuestras necesidades pues se tiene el código fuente.&lt;br /&gt;&lt;br /&gt;Es muy útil para crear blogs al interior de una organización (empresa, universidades, colegios, cooperativas, etc.) como apoyo al desarrollo de proyectos y/o tareas o actividades, por ejemplo:&lt;br /&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;Compartir información útil.&lt;/li&gt;&lt;li&gt;Dar avisos importantes de eventos al interior de la organización.&lt;/li&gt;&lt;li&gt;Apoyar el desarrollo de memorias de título ya que se pueden ir subiendo los informes de avances, etc., pudiendo comentar y aportar positivamente.&lt;/li&gt;&lt;li&gt;etc.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Pebble es muy liviano y viene listo para su uso, no es necesario recompilar para configurarlo. Funciona sobre cualquier servidor de aplicaciones que soporte JSP 2.0/Servlet 2.4, como por ejemplo Tomcat 5.5.x o Glassfish, entre otros.&lt;br /&gt;&lt;br /&gt;Lo primero que hay que hacer es &lt;a href="http://pebble.sourceforge.net/"&gt;descargarlo&lt;/a&gt;, yo descargo siempre la última versión mas actual para ir probando, quizas ustedes prefieran la última versión estable.&lt;br /&gt;&lt;br /&gt;Una vez descargado simplemente hay que descomprimir el zip como se ve en la imagen a continuación:&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp0.blogger.com/_TGgpRudXV3w/R3Xh56Z6UkI/AAAAAAAAAak/MT8u7CDZXlI/s1600-h/imagen1.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp0.blogger.com/_TGgpRudXV3w/R3Xh56Z6UkI/AAAAAAAAAak/MT8u7CDZXlI/s320/imagen1.jpg" alt="" id="BLOGGER_PHOTO_ID_5149270134014759490" border="0" /&gt;&lt;/a&gt;Dentro de la carpeta de Pebble se puede encontrar el código fuente y un archivo llamado &lt;span style="font-style: italic;"&gt;pebble.war&lt;/span&gt;, el cual no es mas que un archivo zip con el proyecto precompilado. Si no quieren cambiar nada pueden dejarlo tal cual, en mi caso quize cambiar la configuración de pebble para que soporte &lt;span style="font-style: italic;"&gt;multi blogs&lt;/span&gt;, para eso sacamos una copia del archivo &lt;span style="font-style: italic;"&gt;pebble.war&lt;/span&gt; y lo renombramos a &lt;span style="font-style: italic;"&gt;pebble.zip&lt;/span&gt;, luego descomprimimos el zip y entramos a la carpeta &lt;span style="font-style: italic;"&gt;WEB-INF&lt;/span&gt; y abrimos con un editor de texto el archivo llamado &lt;span style="font-style: italic;"&gt;pebble.properties&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Dentro de ese archivo se pueden configurar un par de cosas, como por ejemplo el tamaño máximo para archivos que se quieran subir para compartir con los lectores del blog o dar/quitar soporte multi blog.&lt;br /&gt;En este caso interesa modificar lo segundo (criterio mio, si quieren cambiar algo mas pueden hacerlo). Si se fijan, hay una variable que se llama &lt;span style="font-style: italic;"&gt;multiblog&lt;/span&gt; y está con valor &lt;span style="font-style: italic;"&gt;false&lt;/span&gt;, hay que cambiarlo a &lt;span style="font-style: italic;"&gt;true&lt;/span&gt;.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp3.blogger.com/_TGgpRudXV3w/R3XjwqZ6UlI/AAAAAAAAAas/IB-v8vEk9FE/s1600-h/imagen2.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp3.blogger.com/_TGgpRudXV3w/R3XjwqZ6UlI/AAAAAAAAAas/IB-v8vEk9FE/s320/imagen2.jpg" alt="" id="BLOGGER_PHOTO_ID_5149272174124225106" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp0.blogger.com/_TGgpRudXV3w/R3Xjw6Z6UmI/AAAAAAAAAa0/83VRS5jgTJk/s1600-h/imagen3.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp0.blogger.com/_TGgpRudXV3w/R3Xjw6Z6UmI/AAAAAAAAAa0/83VRS5jgTJk/s320/imagen3.jpg" alt="" id="BLOGGER_PHOTO_ID_5149272178419192418" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Una vez listo guardamos y cerramos. Ahora hay que reconstruir el archivo war, para esto simplemente seleccionamos todo y creamos un archivo zip como ven a continuacion:&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp3.blogger.com/_TGgpRudXV3w/R3XkLqZ6UnI/AAAAAAAAAa8/Jg41SRoK0Wo/s1600-h/imagen4.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp3.blogger.com/_TGgpRudXV3w/R3XkLqZ6UnI/AAAAAAAAAa8/Jg41SRoK0Wo/s320/imagen4.jpg" alt="" id="BLOGGER_PHOTO_ID_5149272637980693106" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;y renombramos el zip a war.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp3.blogger.com/_TGgpRudXV3w/R3XllqZ6UoI/AAAAAAAAAbE/Wi74b4A3dBc/s1600-h/imagen5.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp3.blogger.com/_TGgpRudXV3w/R3XllqZ6UoI/AAAAAAAAAbE/Wi74b4A3dBc/s320/imagen5.jpg" alt="" id="BLOGGER_PHOTO_ID_5149274184168919682" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Ya tenemos Pebble listo, ahora hay que moverlo a un servidor de aplicaciones. En este caso utilizaremos Glassfish.&lt;br /&gt;&lt;br /&gt;Si aún no tienes Glassfish instalado y/o configurado entonces date una vuelta por &lt;a href="http://metalklesk.blogspot.com/2007/12/instalacin-de-glassfish-v2-en-opensuse.html"&gt;ésta entrada&lt;/a&gt; donde explico paso a paso como tener Glassfish correctamente configurado.&lt;br /&gt;&lt;br /&gt;Hay que mover el archivo &lt;span style="font-style: italic;"&gt;pebble.war&lt;/span&gt; a la carpeta &lt;span style="font-style: italic;"&gt;&lt;glassfish_home&gt;&lt;/glassfish_home&gt;&lt;/span&gt;&lt;glassfish_home&gt;&lt;span style="font-style: italic;"&gt;/domains/domain1/autodeploy&lt;/span&gt; y levantamos el servicio (si estaba arriba entonces no hay que hacer nada mas), al tener el servicio levantado, Glassfish creará un archivo que se llamará &lt;span style="font-style: italic;"&gt;pebble.war_deployed&lt;/span&gt;.&lt;/glassfish_home&gt;&lt;br /&gt;&lt;glassfish_home&gt;&lt;/glassfish_home&gt;&lt;/div&gt;&lt;glassfish_home&gt;&lt;br /&gt;&lt;/glassfish_home&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp3.blogger.com/_TGgpRudXV3w/R3Xl5qZ6UpI/AAAAAAAAAbM/CdiLGbD3zgw/s1600-h/imagen6.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp3.blogger.com/_TGgpRudXV3w/R3Xl5qZ6UpI/AAAAAAAAAbM/CdiLGbD3zgw/s320/imagen6.jpg" alt="" id="BLOGGER_PHOTO_ID_5149274527766303378" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Una vez copiado el archivo war al servidor de aplicaciones podemos comenzar a utilizarlo, en un navegador escriban&lt;br /&gt;&lt;/div&gt;&lt;blockquote&gt;http://localhost:8080/pebble/&lt;/blockquote&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;y podrán utilizarlo.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp0.blogger.com/_TGgpRudXV3w/R3Xm16Z6UqI/AAAAAAAAAbU/qtz5FdeUsoQ/s1600-h/imagen7.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp0.blogger.com/_TGgpRudXV3w/R3Xm16Z6UqI/AAAAAAAAAbU/qtz5FdeUsoQ/s320/imagen7.jpg" alt="" id="BLOGGER_PHOTO_ID_5149275562853421730" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Lo primero que deben hacer es entrar como &lt;span style="font-style: italic;"&gt;administrador&lt;/span&gt;, por &lt;span style="font-style: italic;"&gt;default&lt;/span&gt; el nombre de usuario es &lt;span style="font-style: italic;"&gt;username&lt;/span&gt; y la contraseña es &lt;span style="font-style: italic;"&gt;password&lt;/span&gt; (se puede cambiar).&lt;br /&gt;&lt;br /&gt;Una vez logueado como administrador ya pueden crear usuarios, asignar roles, crear blogs y asignárselos a usuarios.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp1.blogger.com/_TGgpRudXV3w/R3XngKZ6UrI/AAAAAAAAAbc/NGrATexY8rs/s1600-h/imagen8.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp1.blogger.com/_TGgpRudXV3w/R3XngKZ6UrI/AAAAAAAAAbc/NGrATexY8rs/s320/imagen8.jpg" alt="" id="BLOGGER_PHOTO_ID_5149276288702894770" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp1.blogger.com/_TGgpRudXV3w/R3XngKZ6UsI/AAAAAAAAAbk/Ntw1lggWZv0/s1600-h/imagen9.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp1.blogger.com/_TGgpRudXV3w/R3XngKZ6UsI/AAAAAAAAAbk/Ntw1lggWZv0/s320/imagen9.jpg" alt="" id="BLOGGER_PHOTO_ID_5149276288702894786" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Espero les sea de utilidad como a mi.&lt;br /&gt;&lt;br /&gt;saludos !!!&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1421033339681316542-9103332961397888634?l=metalklesk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://metalklesk.blogspot.com/feeds/9103332961397888634/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://metalklesk.blogspot.com/2007/12/pebble-un-blog-desarrollado-en-java.html#comment-form' title='3 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1421033339681316542/posts/default/9103332961397888634'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1421033339681316542/posts/default/9103332961397888634'/><link rel='alternate' type='text/html' href='http://metalklesk.blogspot.com/2007/12/pebble-un-blog-desarrollado-en-java.html' title='Pebble, un blog desarrollado en java sobre Glassfish V2 en openSUSE 10.3'/><author><name>Daniel Dario Morales Salas</name><uri>http://www.blogger.com/profile/07642586501018157497</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='28' src='http://3.bp.blogspot.com/_TGgpRudXV3w/SfP_sc5YZ3I/AAAAAAAABSs/APK4YFwjVn4/S220/yoft3.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp0.blogger.com/_TGgpRudXV3w/R3Xh56Z6UkI/AAAAAAAAAak/MT8u7CDZXlI/s72-c/imagen1.jpg' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1421033339681316542.post-8415661660425335183</id><published>2007-12-28T18:03:00.000-03:00</published><updated>2007-12-28T18:49:40.767-03:00</updated><title type='text'>Instalación de Glassfish V2 en openSUSE 10.3</title><content type='html'>&lt;div style="text-align: justify;"&gt;En mi blog, varias veces he hablado de &lt;a href="https://glassfish.dev.java.net//"&gt;Glassfish&lt;/a&gt;, lo he utilizado en uno de los ejemplos, pero siempre bajo &lt;a href="http://www.netbeans.org/"&gt;NetBeans 6.0&lt;/a&gt;. En un ambiente de producción no tiene sentido utilizar un IDE de desarrollo, de hecho el servidor no deberia tener mas que el SO, un par de programas, un entorno grafico simple (incluso algunos prefieren que el servidor  NO tenga entorno gráfico, por seguridad), etc., lo minimo posible.&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;Instalar glassfish es bastante sencillo, lo primero es descargarlo &lt;a href="https://glassfish.dev.java.net//public/downloadsindex.html"&gt;acá&lt;/a&gt;, (necesitan tener java instalado y configurado previamente) luego ejecutar en consola (no es necesario ser ROOT para esto) lo siguiente:&lt;br /&gt;&lt;/div&gt;&lt;blockquote&gt;java -Xmx256M -jar glassfish-installer-v2-b58g-ml.jar&lt;/blockquote&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;les aparecerá una ventana con la licencia, presionan &lt;span style="font-style: italic;"&gt;accept&lt;/span&gt; y con eso comenzará la instalación la cual finalizará dejando una carpeta llamada &lt;span style="font-style: italic;"&gt;glassfish/&lt;/span&gt; en el directorio en el cual ejecutaron el comando anterior.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp3.blogger.com/_TGgpRudXV3w/R3Vm4qZ6UdI/AAAAAAAAAZs/bGgPfaXyU7E/s1600-h/imagen1.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp3.blogger.com/_TGgpRudXV3w/R3Vm4qZ6UdI/AAAAAAAAAZs/bGgPfaXyU7E/s320/imagen1.jpg" alt="" id="BLOGGER_PHOTO_ID_5149134872609706450" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp0.blogger.com/_TGgpRudXV3w/R3Vm46Z6UeI/AAAAAAAAAZ0/BWQNqPV6L9E/s1600-h/imagen2.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp0.blogger.com/_TGgpRudXV3w/R3Vm46Z6UeI/AAAAAAAAAZ0/BWQNqPV6L9E/s320/imagen2.jpg" alt="" id="BLOGGER_PHOTO_ID_5149134876904673762" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Luego hay que dar permisos de ejecución al &lt;span style="font-style: italic;"&gt;ant&lt;/span&gt; que viene embedido en glassfish, para esto ejecutamos en consola lo siguiente (ojo con el directorio en el que tengan glassfish):&lt;br /&gt;&lt;/div&gt;&lt;blockquote&gt;chmod -R +x bin/glassfish/lib/ant/bin/&lt;/blockquote&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;luego entren al directorio de glassfish (a la raiz de éste):&lt;br /&gt;&lt;/div&gt;&lt;blockquote&gt;cd bin/glassfish&lt;/blockquote&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;y escriben lo siguiente:&lt;br /&gt;&lt;/div&gt;&lt;blockquote&gt;./lib/ant/bin/ant -f setup.xml&lt;/blockquote&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Con el comando anterior se va a configurar el servidor de aplicaciones. Dentro de &lt;span style="font-style: italic;"&gt;setup.xml&lt;/span&gt; están los puertos que se utilizarán (ademas de otras cosas como el nombre de usuario del administrador y su contraseña), por ejemplo el 4848 que es para entrar a la consola del administrador, 8080 para las aplicaciones web, 8181 para las aplicaciones web seguras, etc. Si quieren cambiar la configuracion que viene por &lt;span style="font-style: italic;"&gt;default&lt;/span&gt; pueden editar ese archivo.&lt;br /&gt;&lt;br /&gt;Una vez ejecutado el comando anterior ya estamos listos para levantar el servidor de aplicaciones.&lt;br /&gt;&lt;br /&gt;Para levantar el servidor de aplicaciones glassfish crearemos un simple script, cuyo contenido será el siguiente:&lt;br /&gt;&lt;/div&gt;&lt;blockquote&gt;#!/bin/bash&lt;br /&gt;&lt;br /&gt;#ingrese el directorio donde se encuentra el servidor de aplicaciones glassfish&lt;br /&gt;GLASSFISH_HOME=/home/metalklesk/bin/glassfish&lt;br /&gt;&lt;br /&gt;#ingrese el nombre de usuario del administrador del servidor de aplicaciones glassfish&lt;br /&gt;AS_ADMIN_USER=admin&lt;br /&gt;&lt;br /&gt;export AS_ADMIN_USER&lt;br /&gt;export PATH=${GLASSFISH_HOME}/bin:$PATH&lt;br /&gt;&lt;br /&gt;asadmin start-domain domain1&lt;/blockquote&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;Deben modificar el valor de la variable GLASSFISH_HOME al que corresponda, deben colocar el directorio donde se encuentra glassfish en su equipo y lo mismo con la variable AS_ADMIN_USER, si modificaron el nombre de usuario del administrador en el archivo setup.xml, debe reflejarse en el script.&lt;br /&gt;&lt;br /&gt;Al script pueden darle el nombre que quieran, y al final permisos de ejecución:&lt;br /&gt;&lt;/div&gt;&lt;blockquote&gt;chmod +x iniciar-glassfish.sh&lt;/blockquote&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;Para levantar el servidor de aplicaciones simplemente ejecutamos el script previamente creado y listo.&lt;br /&gt;&lt;/div&gt;&lt;blockquote&gt;./iniciar-glassfish.sh&lt;/blockquote&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;Ahora para comprobar que el servidor esta corriendo, abrimos un navegador y colocamos en el buscador:&lt;br /&gt;&lt;/div&gt;&lt;blockquote&gt;http://localhost:4848&lt;/blockquote&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;y con eso se abrirá la consola del administrador, ingresamos el nombre de usuario y contraseña y ya está.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp1.blogger.com/_TGgpRudXV3w/R3VsiKZ6UfI/AAAAAAAAAZ8/SUtEmW5aRDc/s1600-h/imagen3.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp1.blogger.com/_TGgpRudXV3w/R3VsiKZ6UfI/AAAAAAAAAZ8/SUtEmW5aRDc/s320/imagen3.jpg" alt="" id="BLOGGER_PHOTO_ID_5149141083132416498" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp2.blogger.com/_TGgpRudXV3w/R3VsiaZ6UgI/AAAAAAAAAaE/h5T7oYtQBfQ/s1600-h/imagen4.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp2.blogger.com/_TGgpRudXV3w/R3VsiaZ6UgI/AAAAAAAAAaE/h5T7oYtQBfQ/s320/imagen4.jpg" alt="" id="BLOGGER_PHOTO_ID_5149141087427383810" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Glassfish trae un ejemplo para probar el funcionamiento del servidor de aplicaciones, se encuentra en el directorio &lt;glassfish_home&gt;/samples/quickstart y el archivo se llama hello.war, ese hay que copiarlo en el directorio  &lt;glassfish_home&gt;/domains/domain1/autodeploy y listo, con eso la aplicación se va a auto configurar, pueden ver en la consola de administrador que esa aplicación (hello.war) ya esta corriendo.&lt;/glassfish_home&gt;&lt;/glassfish_home&gt;&lt;br /&gt;&lt;glassfish_home&gt;&lt;glassfish_home&gt;&lt;/glassfish_home&gt;&lt;/glassfish_home&gt;&lt;/div&gt;&lt;glassfish_home&gt;&lt;glassfish_home&gt;&lt;br /&gt;&lt;/glassfish_home&gt;&lt;/glassfish_home&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp2.blogger.com/_TGgpRudXV3w/R3VuIaZ6UhI/AAAAAAAAAaM/bbdFfExqa-s/s1600-h/imagen5.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp2.blogger.com/_TGgpRudXV3w/R3VuIaZ6UhI/AAAAAAAAAaM/bbdFfExqa-s/s320/imagen5.jpg" alt="" id="BLOGGER_PHOTO_ID_5149142839774040594" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp2.blogger.com/_TGgpRudXV3w/R3VuIaZ6UiI/AAAAAAAAAaU/N7gmzM9uv5E/s1600-h/imagen6.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp2.blogger.com/_TGgpRudXV3w/R3VuIaZ6UiI/AAAAAAAAAaU/N7gmzM9uv5E/s320/imagen6.jpg" alt="" id="BLOGGER_PHOTO_ID_5149142839774040610" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp3.blogger.com/_TGgpRudXV3w/R3VuIqZ6UjI/AAAAAAAAAac/w_AFR5LL2ww/s1600-h/imagen7.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp3.blogger.com/_TGgpRudXV3w/R3VuIqZ6UjI/AAAAAAAAAac/w_AFR5LL2ww/s320/imagen7.jpg" alt="" id="BLOGGER_PHOTO_ID_5149142844069007922" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Como ven la instalación y configuración de glassfish es muy facil de hacer. Una caracteristica que me gusta es que puedes hacer &lt;span style="font-style: italic;"&gt;hot deploy&lt;/span&gt;, es decir, mientras el servidor de aplicaciones está corriendo puedes hacer deploy sin necesidad de bajarlo antes, no afecta en nada a las otras aplicaciones que puedan estar corriendo sobre glassfish.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Espero les sirva esta simple guía.&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/1421033339681316542-8415661660425335183?l=metalklesk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://metalklesk.blogspot.com/feeds/8415661660425335183/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://metalklesk.blogspot.com/2007/12/instalacin-de-glassfish-v2-en-opensuse.html#comment-form' title='11 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1421033339681316542/posts/default/8415661660425335183'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1421033339681316542/posts/default/8415661660425335183'/><link rel='alternate' type='text/html' href='http://metalklesk.blogspot.com/2007/12/instalacin-de-glassfish-v2-en-opensuse.html' title='Instalación de Glassfish V2 en openSUSE 10.3'/><author><name>Daniel Dario Morales Salas</name><uri>http://www.blogger.com/profile/07642586501018157497</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='28' src='http://3.bp.blogspot.com/_TGgpRudXV3w/SfP_sc5YZ3I/AAAAAAAABSs/APK4YFwjVn4/S220/yoft3.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp3.blogger.com/_TGgpRudXV3w/R3Vm4qZ6UdI/AAAAAAAAAZs/bGgPfaXyU7E/s72-c/imagen1.jpg' height='72' width='72'/><thr:total>11</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1421033339681316542.post-4677933739192658512</id><published>2007-12-24T18:13:00.000-03:00</published><updated>2008-02-03T16:48:56.273-03:00</updated><title type='text'>Asignar ip a máquina virtual con VirtualBox OSE 1.5.2 en openSUSE 10.3</title><content type='html'>&lt;div style="text-align: justify;"&gt;Ayer me preguntaron en &lt;a href="http://metalklesk.blogspot.com/2007/11/virtualbox-en-opensuse-103.html"&gt;esta&lt;/a&gt; entrada sobre como crear una red entre un host y una o mas máquinas virtuales, pero asignándoles a cada una un ip diferente de manera tal que pudiéramos crear servidores pero en máquinas virtuales. Esto suena mas simple de lo que parece.&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;Con &lt;a href="http://www.virtualbox.org/wiki/Downloads"&gt;&lt;span style="font-style: italic;"&gt;VirtualBox&lt;/span&gt;&lt;/a&gt; se puede hacer pero el problema principal radica en que éste viene en dos versiones, una &lt;span style="font-style: italic;"&gt;GPL&lt;/span&gt; y la otra no. La que NO es &lt;span style="font-style: italic;"&gt;GPL&lt;/span&gt; viene full pero solo para uso personal o testing pero no se puede usar en ambiente comercial debido a las restricciones de su licencia. Sin embargo la versión &lt;span style="font-style: italic;"&gt;OSE&lt;/span&gt; (&lt;span style="font-style: italic;"&gt;Open Source Edition&lt;/span&gt;) esta bajo la &lt;span style="font-style: italic;"&gt;GPL&lt;/span&gt; por lo que podemos hacer lo que queramos con ella.&lt;br /&gt;&lt;br /&gt;Con la versión &lt;span style="font-style: italic;"&gt;OSE&lt;/span&gt; se puede hacer lo mismo que con la otra pero es mas complicado y por ende difícil, pero no imposible.&lt;br /&gt;&lt;br /&gt;Despues de leer por la red (googlear no le hace mal a nadie jejejeej) logré hacerlo funcionar, es más, hice un script que hace casi todo automáticamente. Lo hice utilizando &lt;span style="font-style: italic;"&gt;VirtualBox OSE 1.5.2&lt;/span&gt; asi es que no se si funcione con versiones anteriores. La descargué de los repositorios de &lt;a href="http://software.opensuse.org/"&gt;&lt;span style="font-style: italic;"&gt;openSUSE 10.3&lt;/span&gt;&lt;/a&gt; (se configura en &lt;span style="font-style: italic;"&gt;Yast -&gt; Community Repositories&lt;/span&gt;, simplemente se marca la casilla que indica software para virtualizar sistemas)&lt;br /&gt;&lt;br /&gt;Antes de mostrar el script explicaré a grandes rasgos de que se trata este cuento.&lt;br /&gt;&lt;br /&gt;Lo primero que se debe hacer para crear una red entre el &lt;span style="font-style: italic;"&gt;host&lt;/span&gt; y &lt;span style="font-style: italic;"&gt;máquinas virtuales&lt;/span&gt; es crear un &lt;span style="font-style: italic;"&gt;bridge (puente)&lt;/span&gt;, el cual se llamará &lt;span style="font-style: italic;"&gt;br0&lt;/span&gt;. Este puente se utiliza para acceder a Internet y a él se registran las interfaces de red tanto de la máquina real (&lt;span style="font-style: italic;"&gt;host&lt;/span&gt;) como de las virtuales (&lt;span style="font-style: italic;"&gt;guests&lt;/span&gt;). Normalmente (cuando no hay bridge entremedio) la máquina real se conecta a Internet mediante la interface de red, generalmente &lt;span style="font-style: italic;"&gt;eth0&lt;/span&gt; (esa es en mi caso), pero para lograr la creación de la red todas las máquinas se conectaran a través del bridge.&lt;br /&gt;&lt;br /&gt;Una vez que se crea el bridge se deben crear tantas interfaces de red como máquinas virtuales deseemos, una para cada una, las cuales se denominarán &lt;span style="font-style: italic;"&gt;tap0, tap1, ... tapN&lt;/span&gt;. Estas interfaces son similares a la eth0, la diferencia es que son virtuales. Una vez que se crean se deben registrar al bridge (br0), incluyendo la eth0. Luego se le debe quitar la ip a la eth0, ya que se debe asignar a br0.&lt;br /&gt;&lt;br /&gt;Lo anterior es una explicación a groso modo para que entiendan lo que viene a continuación (de todas maneras está comentado). Para que el script funcione correctamente son necesarios dos paquetes fundamentales:&lt;br /&gt;&lt;/div&gt;&lt;ul style="text-align: justify;"&gt;&lt;li&gt;bridge-utils&lt;/li&gt;&lt;li&gt;uml-utilities&lt;/li&gt;&lt;/ul&gt;&lt;div style="text-align: justify;"&gt;Ambos vienen en el dvd de openSUSE 10.3 (no se si en los anteriores).&lt;br /&gt;Deben configurar las variables definidas en el script para que concuerden con su sistema.&lt;br /&gt;Una vez instalados ejecutan el siguiente script, como usuario root.&lt;br /&gt;&lt;/div&gt;&lt;blockquote&gt;&lt;br /&gt;#!/bin/bash&lt;br /&gt;&lt;br /&gt;#INICIALIZACION DE VARIABLES&lt;br /&gt;#Deben cambiar los valores segun corresponda a su realidad&lt;br /&gt;#seteamos el usuario&lt;br /&gt;USUARIO="metalklesk"&lt;br /&gt;&lt;br /&gt;#seteamos la cantidad de maquinas virtuales (guests) que deseamos tener en el host&lt;br /&gt;CANTIDAD_VM=2&lt;br /&gt;&lt;br /&gt;#seteamos la interface de red real&lt;br /&gt;INTERFACE_RED_REAL="eth0"&lt;br /&gt;&lt;br /&gt;#seteamos el ip del host&lt;br /&gt;IP_HOST="192.168.0.144"&lt;br /&gt;&lt;br /&gt;#seteamos la pasarela (gateway)&lt;br /&gt;PASARELA="192.168.0.1"&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;#CONFIGURACION&lt;br /&gt;#creamos el puente (bridge)&lt;br /&gt;brctl addbr br0&lt;br /&gt;&lt;br /&gt;#seteamos la interface de red real para que sea promiscua&lt;br /&gt;ifconfig $INTERFACE_RED_REAL 0.0.0.0 promisc&lt;br /&gt;&lt;br /&gt;#insertamos la interface de red real al puente br0&lt;br /&gt;brctl addif br0 $INTERFACE_RED_REAL&lt;br /&gt;&lt;br /&gt;#creamos una interface tap para cada guest (maquina virtual),&lt;br /&gt;#los insertamos en el puente y los subimos&lt;br /&gt;CONTADOR=0&lt;br /&gt;while [ $CONTADOR -lt $CANTIDAD_VM ]&lt;br /&gt;do&lt;br /&gt; tunctl -t tap$CONTADOR -u $USUARIO&lt;br /&gt; brctl addif br0 tap$CONTADOR&lt;br /&gt; ifconfig tap$CONTADOR up&lt;br /&gt; let CONTADOR=$CONTADOR+1&lt;br /&gt;done&lt;br /&gt;&lt;br /&gt;#asignamos una ip al puente br0 mediante dhcp&lt;br /&gt;#dhclient br0&lt;br /&gt;&lt;br /&gt;#asignamos la ip del host al puente br0 de forma manual&lt;br /&gt;ifconfig br0 $IP_HOST&lt;br /&gt;&lt;br /&gt;#asignamos la pasarela al puente br0&lt;br /&gt;route add default gw $PASARELA br0&lt;br /&gt;&lt;br /&gt;#cambiamos los permisos de /dev/net/tun&lt;br /&gt;chmod 0666 /dev/net/tun&lt;br /&gt;&lt;br /&gt;#NOTAS.&lt;br /&gt;#&lt;br /&gt;# Un Bridge es contrario a un firewall, por lo tanto si el firewall esta arriba es posible que por default&lt;br /&gt;# este bloqueando la interfaz br0 (u otra). La solucion mas simple es deshabilitar el firewall, pero no es&lt;br /&gt;# recomendable ya que eso resta seguridad. Entonces lo que hay que hacer es configurar el firewall para que&lt;br /&gt;# permita, a la interfaz br0, salir al exterior (y ser vista desde el exterior y dentro de la red). En el caso&lt;br /&gt;# de openSUSE 10.3 es muy simple de hacer, simplemente hay que abrir con un editor de texto (como root) el&lt;br /&gt;# archivo de configuracion del firewall:&lt;br /&gt;&lt;br /&gt;#    /etc/sysconfig/SuSEfirewall2&lt;br /&gt;&lt;br /&gt;# bajar al final y buscar la lin
