tag:blogger.com,1999:blog-14210333396813165422024-03-19T01:11:47.640-03:00Metalklesk's spaceIngeniería, tecnología y open sourceDaniel Dario Morales Salashttp://www.blogger.com/profile/07642586501018157497noreply@blogger.comBlogger47125tag:blogger.com,1999:blog-1421033339681316542.post-8011415988902411622010-06-06T15:53:00.006-04:002010-06-06T16:08:53.928-04:00Netbeans Platform LifecycleManagerUna 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 ?<br />Si han comenzado a utilizar la Netbeans Platform es posible que se hayan encontrado con este dilema, la solución es MUY simple.<br /><br />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:<br /><blockquote>org.metalklesk.nbservices.impl.MyLifecycleManager<br />#position=1<br />org.netbeans.core.NbTopManager$NbLifecycleManager<br />#position=2</blockquote><br />Con eso estamos indicando que reemplazaremos la implementación por <span style="font-style: italic;">default</span> de Netbeans por la nuestra, así es como se ve:<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg8pMU75WRK3CB1pJraLj9tS0nfy0AZVKh7ByISZCbKzx6R5Pv1hDAo0kiwUDOHVT_gdhy2bcgw2nJC2oCjVEAr_h0CQPS9wXk2bq5Bt7v7hFtiUH6s0U6Z3u_jvUFtFWsWh2eqM75dE6vK/s1600/1.png"><img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 320px; height: 112px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg8pMU75WRK3CB1pJraLj9tS0nfy0AZVKh7ByISZCbKzx6R5Pv1hDAo0kiwUDOHVT_gdhy2bcgw2nJC2oCjVEAr_h0CQPS9wXk2bq5Bt7v7hFtiUH6s0U6Z3u_jvUFtFWsWh2eqM75dE6vK/s320/1.png" alt="" id="BLOGGER_PHOTO_ID_5479753387481188994" border="0" /></a><br />luego simplemente debemos crear nuestra clase, la cual tiene el siguiente contenido:<br /><blockquote>public class MyLifecycleManager extends LifecycleManager {<br /><br /> @Override<br /> public void saveAll() {<br /> }<br /><br /> @Override<br /> public void exit() {<br /> //close all the topcomponent tabs<br /> Set<TopComponent> tcs = TopComponent.getRegistry().getOpened();<br /> Iterator<TopComponent> it = tcs.iterator();<br /> while(it.hasNext()) {<br /> TopComponent tc = it.next();<br /> if(tc instanceof DepartmentEditorTopComponent)<br /> tc.close();<br /> }<br /><br /> Collection c = Lookup.getDefault().lookup (<br /> new Lookup.Template (LifecycleManager.class)).allInstances();<br /><br /> for (Iterator i=c.iterator(); i.hasNext();) {<br /> LifecycleManager lm = (LifecycleManager) i.next();<br /> if (lm != this) {<br /> lm.exit();<br /> }<br /> }<br /> }<br /><br />}</blockquote><br />y así es como se ve:<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjGrkmzpaVv1ZJbvUdtMFQYqUlEUmFoHOPx_7uIOCunKdZwDCzGEoCiGe9mbY0ih-bqlV__uZ0xwzL8KXXlju2YsTJ0AoziPKhmXyLWMh14XDiEQ2qMAJ7jyfVVbSxc6cl2C_luqhyq5GeO/s1600/2.png"><img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 320px; height: 180px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjGrkmzpaVv1ZJbvUdtMFQYqUlEUmFoHOPx_7uIOCunKdZwDCzGEoCiGe9mbY0ih-bqlV__uZ0xwzL8KXXlju2YsTJ0AoziPKhmXyLWMh14XDiEQ2qMAJ7jyfVVbSxc6cl2C_luqhyq5GeO/s320/2.png" alt="" id="BLOGGER_PHOTO_ID_5479753888822492194" border="0" /></a><br />Al extender de la clase <span style="font-weight: bold;">LifecycleManager</span> debemos implementar el método <span style="font-weight: bold;">exit</span> y es en esa implementación donde ingresamos nuestro código. En este caso me preocupo de cerrar unos <span style="font-style: italic;">TopComponent</span> que yo construí.<br />El pedazo de código siguiente debe ir para poder cerrar la aplicación:<br /><blockquote>Collection c = Lookup.getDefault().lookup (<br /> new Lookup.Template (LifecycleManager.class)).allInstances();<br /><br /> for (Iterator i=c.iterator(); i.hasNext();) {<br /> LifecycleManager lm = (LifecycleManager) i.next();<br /> if (lm != this) {<br /> lm.exit();<br /> }<br /> }</blockquote><br />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.<br /><br />Saludos !!!Daniel Dario Morales Salashttp://www.blogger.com/profile/07642586501018157497noreply@blogger.com0tag:blogger.com,1999:blog-1421033339681316542.post-82469562835998823452010-06-01T22:35:00.006-04:002010-06-01T23:06:05.034-04:00Netbeans Platform NotificationsHe estado trabajando en un software para domótica (Home Automation) y para ello estoy utilizando la plataforma Netbeans y su excelente API.<br /><br />Una de las cosas que me ha gustado es el manejo de las notificaciones.<br />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).<br /><br />Para utilizar esa área para notificaciones desde tu aplicación simplemente basta con la siguiente linea de código:<br />StatusDisplayer.getDefault().setStatusText("Hola mundo");<br />así de simple.<br /><br />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!!!<br /><br />Cómo se usa ? simple ... en el siguiente <a href="http://qbeukes.blogspot.com/2009/11/netbeans-platform-notifications.html">blog</a> 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.<br /><br />Las clases con mis modificaciones son las siguientes:<br /><ul><li><a href="http://pastebin.com/0SA6SGGN">MessageType</a></li><li><a href="http://pastebin.com/S5UR7vsP">MessageUtil</a></li><li><a href="http://pastebin.com/2MZYgEcB">NotifyUtil</a></li></ul><br />Con estas 3 clases en tu aplicación basada en Netbeans Platform, puedes usar el globo de la siguiente manera:<br /><blockquote>NotifyUtil.warn("titulo", "mensaje de advertencia", false);</blockquote><br /><blockquote>NotifyUtil.show("titulo", "mensaje informativo", false);</blockquote><br /><blockquote>NotifyUtil.show("titulo", "mensaje informativo", new ActionListener() {<br /> @Override<br /> public void actionPerformed(ActionEvent e) {<br /> //hago algo<br /> }<br /> };, false);</blockquote><br /><blockquote>NotifyUtil.error("titulo", "mensaje de error, false);</blockquote><br /><blockquote>NotifyUtil.error("titulo", "mensaje de error", exception, false);</blockquote><br />El último muestra la excepción en un dialogo informativo.<br /><br />Y por último si queremos mostrar una notificación en un diálogo informativo, en vez de usar un JOptionPane, podemos usar lo siguiente:<br /><blockquote>MessageUtil.showException("mensaje", exception);</blockquote><br /><blockquote>MessageUtil.error("mensaje", exceptionInstance);</blockquote><br /><blockquote>MessageUtil.error("mensaje");</blockquote><br /><blockquote>MessageUtil.info("mensaje");</blockquote><br /><blockquote>MessageUtil.question("mensaje");</blockquote><br /><blockquote>MessageUtil.plain("mensaje");</blockquote><br />Y con eso ya tenemos cubierto el tema de las notificaciones en la plataforma Netbeans.<br /><br />Saludos !!!Daniel Dario Morales Salashttp://www.blogger.com/profile/07642586501018157497noreply@blogger.com2tag:blogger.com,1999:blog-1421033339681316542.post-51095126189734779642009-12-13T17:54:00.013-03:002009-12-13T20:19:17.878-03:00NetBeans 6.8 y Visual Library API, ejemplo completo<div style="text-align: justify;">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 <a href="http://www.netbeans.org/">NetBeans</a> que son muy útiles, las cuales permiten desarrollar una aplicación del tipo "Editor visual", como Microsoft Visio o <a href="http://projects.gnome.org/dia/">Dia</a>, con el cual podemos generar diagramas y agregar acciones.<br /><br />Muchos pequeños ejemplos para trabajar con la Visual Library API se pueden encontrar en <a href="http://netbeans.sourcearchive.com/documentation/6.0.1/files.html">http://netbeans.sourcearchive.com/documentation/6.0.1/files.html</a>.<br /><br />También existe este ejemplo en <a href="http://java.dzone.com/news/how-create-visual-applications">http://java.dzone.com/news/how-create-visual-applications</a> el cual nos indica como agregar un poco de funcionalidad a un widget y este otro ejemplo en <a href="http://java.dzone.com/news/how-add-resize-functionality-v">http://java.dzone.com/news/how-add-resize-functionality-v</a> que nos dice como agregar la funcionalidad de "Resize" de un widget, el cual modifiqué un poco.<br /><br />Otro ejemplo muy bueno es <a href="http://platform.netbeans.org/tutorials/60/nbm-visual_library.html">éste de acá</a>, que nos muestra como añadir la <a href="http://bits.nbextras.org/dev/javadoc/org-netbeans-spi-palette/overview-summary.html">Common Palette</a> a nuestra aplicación, funcionalidad que se utilizó en este ejemplo.<br /><br />Primero que todo quiero agradecer la buena voluntad de <a href="http://blogs.sun.com/geertjan/entry/welcome_to_me">Geertjan Wielenga</a> 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.<br /><br />Lo primero es aclarar que el ejemplo hace uso de la <span style="font-style: italic;">plataforma NetBeans</span>, tanto para su desarrollo como para su ejecución. NetBeans trae la opción de crear una aplicación utilizando un esqueleto llamado <span style="font-weight: bold;">NetBeans Platform Application</span><br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgrAD0zWSe4z436MNiAC30nP_loXrGDH77k2VN8Db8MUaBSlZLmLdGawnUSkJlifNTFT-tHQfimF8YBv5-jFP2R1Eeih6ji_w4R_JpC8dT8fm5dyCAVkL861yHI2x4LlCYZ-L0hNWMq6raH/s1600-h/snapshot1.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 180px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgrAD0zWSe4z436MNiAC30nP_loXrGDH77k2VN8Db8MUaBSlZLmLdGawnUSkJlifNTFT-tHQfimF8YBv5-jFP2R1Eeih6ji_w4R_JpC8dT8fm5dyCAVkL861yHI2x4LlCYZ-L0hNWMq6raH/s320/snapshot1.png" alt="" id="BLOGGER_PHOTO_ID_5414832046542035250" border="0" /></a><br />al cual, en este ejemplo se le dio el nombre de <span style="font-style: italic;">Visual Editor</span>.<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhy7iCd8z8dVYY6Bdv2I0NXJkMkhgoc_6bD-iHO3zn_pP9HocwPJJHAQDT7fw-HqtofKe0HxY1Z5SID0L7qSsB-9V2pGSqrVhqup2isU2TqD2Ie8cG1UMBXkPQ0mKVsQHaF2QNK1zLMc3yH/s1600-h/snapshot2.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 180px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhy7iCd8z8dVYY6Bdv2I0NXJkMkhgoc_6bD-iHO3zn_pP9HocwPJJHAQDT7fw-HqtofKe0HxY1Z5SID0L7qSsB-9V2pGSqrVhqup2isU2TqD2Ie8cG1UMBXkPQ0mKVsQHaF2QNK1zLMc3yH/s320/snapshot2.png" alt="" id="BLOGGER_PHOTO_ID_5414833033765196898" border="0" /></a><br /><br />Sobre este esqueleto se agregan módulos.<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiFVJDH4s1X_hTrU6InX62VXF9EFjqPrW2a34uJJncYEvwAdJ9CgLLPtswiLXVH_jUZt_7POckG4_f2mkyzZ2PrVLd00e8FC8fnjp4x5l2T_Emb3R5wFKRFY7X9KBKC9nDZ5Jc0I3ATyimH/s1600-h/snapshot3.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 180px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiFVJDH4s1X_hTrU6InX62VXF9EFjqPrW2a34uJJncYEvwAdJ9CgLLPtswiLXVH_jUZt_7POckG4_f2mkyzZ2PrVLd00e8FC8fnjp4x5l2T_Emb3R5wFKRFY7X9KBKC9nDZ5Jc0I3ATyimH/s320/snapshot3.png" alt="" id="BLOGGER_PHOTO_ID_5414832511368643618" border="0" /></a><br />y los módulos se pueden crear como aplicaciones <span style="font-style: italic;">standalone</span> (para cargar en NetBeans IDE) o como módulos para una aplicación del tipo <span style="font-style: italic;">NetBeans Platform Application</span>, el cual es nuestro caso.<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjmigQW4Y8HYjZPynbgCkjONHM7YMK7vFZci4ZKRt1tte5UPrR-Kj26cDnYQk2WnQnYq8-J0TITy0eNEqbhmAGL7Qt9FvXHzTE8t_8HIdvqrDL3jBLWGUbaVV9dgTSEHJvymVOU4ITEKhX1/s1600-h/snapshot4.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 180px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjmigQW4Y8HYjZPynbgCkjONHM7YMK7vFZci4ZKRt1tte5UPrR-Kj26cDnYQk2WnQnYq8-J0TITy0eNEqbhmAGL7Qt9FvXHzTE8t_8HIdvqrDL3jBLWGUbaVV9dgTSEHJvymVOU4ITEKhX1/s320/snapshot4.png" alt="" id="BLOGGER_PHOTO_ID_5414833893489396322" border="0" /></a><br />La gracia de crear módulos en NetBeans es que pueden ser exportados como archivos <span style="font-weight: bold;">nbm</span>, los cuales pueden ser cargados dentro de NetBeans o nuestras aplicaciones del tipo NetBeans Platform Application.<br /><br />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).<br /><br />Dejo aquí el <a href="http://netbeans-visual-library-example.googlecode.com/files/VisualEditor-src.zip">enlace de descarga</a> del código fuente del ejemplo, el cual iremos comentando a continuación y <a href="http://netbeans-visual-library-example.googlecode.com/files/visualeditor.zip">acá</a> están los binarios.<br /><br />Para crear una aplicación del tipo editor de diagramas, debemos crear una <span style="font-style: italic;">escena</span>. Una escena es un componente que permite agregar <span style="font-style: italic;">widgets</span> en él y se encarga de manejarlos por nosotros.<br /><br />En el caso de este ejemplo, creamos una clase llamada <span style="font-style: italic;">MyScene</span> que hereda de la clase <span style="font-style: italic;">GraphScene</span>.<br /><blockquote><code><br />public class MyScene extends GraphScene<MyNode, MyEdge> {<br /></code></blockquote><br />En una escena tenemos <span style="font-style: italic;">Nodos</span> y <span style="font-style: italic;">Edges</span>. 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 <span style="font-style: italic;">MyNode</span> y <span style="font-style: italic;">MyEdge</span>.<br /><br />Cuando agregamos un nodo a una escena, utilizamos el método <span style="font-weight: bold;">addNode</span> al cual le pasamos como argumento un objeto de tipo MyNode (ver método <span style="font-weight: bold;">accept</span> de la clase MyScene).<br /><blockquote><code><br />Widget w = MyScene.this.addNode(new MyNode(idGenerator.getNextId(), image, "Object " + (nodeCounter++), point));<br /></code></blockquote><br />cuando se llama el método addNode inmediatamente se dispara una llamada a la implementación del método <span style="font-weight: bold;">attachNodeWidget</span> que es donde recién se agrega el Widget a la escena<br /><blockquote><code><br />protected Widget attachNodeWidget(MyNode node) {<br /><br /> MyWidget widget = new MyWidget(this, mainLayer, interactionLayer, connectionLayer, node);<br /><br /> mainLayer.addChild(widget);<br /><br /> setFocusedWidget (widget);<br /><br /> validate();<br /><br /><br /><br /> return widget;<br /><br />}<br /></code></blockquote><br />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.<br /><br />En la clase MyWidget agregamos la opción de crear conexiones con otros widgets creando una acción en particular en el constructor:<br /><blockquote><code><br />getActions().addAction(ActionFactory.createExtendedConnectAction(connectionLayer, new MyConnectionProvider(scene)));<br /></code></blockquote><br />Esto utiliza un objeto del tipo <span style="font-style: italic;">MyConnectionProvider</span> el cual se encarga de generar un objeto <span style="font-style: italic;">MyEdge</span> y lo agrega utilizando el método <span style="font-weight: bold;">addEdge</span> de la escena. Al llamar al método addEdge se dispara una llamada a la implementación del método <span style="font-weight: bold;">attachEdgeWidget</span> de la escena, el cual se encarga de agregar un widget de conexión.<br /><br />En el caso de este ejemplo se creó una clase para el widget con la imagen (<span style="font-style: italic;">MyWidget</span>) y otra para la conexión (<span style="font-style: italic;">MyConnectionWidget</span>).<br />Ambos tienen la capacidad de modificar un texto en la escena ya que se les agrego la acción de edición usando <span style="font-weight: bold;">createInplaceEditorAction</span>.<br /><br />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 <span style="font-style: italic;">PopupMenuProvider</span> el cual retorna un <span style="font-style: italic;">JPopupMenu</span> el que a su vez puede contener <span style="font-style: italic;">JMenuItems</span> con la funcionalidad que queramos en cada uno, ver la clase MyWidget.<br /><blockquote><code><br />popupMenuProvider = new PopupMenuProvider() {<br /><br /> public JPopupMenu getPopupMenu (final Widget widget, final Point location) {<br /><br /> return popupMenu;<br /><br /> }<br /><br /> };<br /></code></blockquote><br />Nuestro buen amigo <span style="font-style: italic;">Geertjan Wielenga</span> nos dió un tip muy útil para agregar la funcionalidad de <span style="font-style: italic;">Resize</span> de nuestros Widgets, tip que apliqué en este ejemplo y que podemos ver <a href="http://java.dzone.com/news/how-add-resize-functionality-v">acá</a>. El único problema es que es que para que ese tip funcione, se debe modificar la clase <span style="font-style: italic;">ImageWidget</span> del API de la Visual Library, lo cual no es muy cómodo. Lo que hice fue crear una clase llamada <span style="font-style: italic;">MyImageWidget</span> a la cual le apliqué el tip de Geertjan. También generé una clase llamada <span style="font-style: italic;">MyIconNodeWidget</span>, la cual hace uso de la clase MyImageWidget (en vez de la clase <span style="font-style: italic;">ImageWidget</span>). La clase MyWidget extiende de <span style="font-style: italic;">MyIconNodeWidget</span> 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.<br /><br />También se agregó la funcionalidad de poder eliminar un widget (MyWidget o MyConnectionWidget) desde la escena presionando la tecla <span style="font-weight: bold;">DELETE</span>, para lo cual se creó la clase <span style="font-style: italic;">KeyEventLoggerAction</span>, en donde el código para eliminar el widget es el siguiente:<br /><blockquote><code><br />public State keyReleased(Widget widget, WidgetKeyEvent event) {<br /><br /> if (event.getKeyCode() == KeyEvent.VK_DELETE) {<br /><br /> GraphScene s = (GraphScene)widget.getScene();<br /><br /> if(widget instanceof MyWidget) {<br /><br /> s.removeNode(s.findObject(widget));<br /><br /> return State.CONSUMED;<br /><br /> }<br /><br /> else if(widget instanceof MyConnectionWidget){<br /><br /> widget.removeFromParent();<br /><br /> return State.CONSUMED;<br /><br /> }<br /><br /> }<br /><br /><br /><br /> return State.REJECTED;<br /><br />}<br /></code></blockquote><br />Lo importante acá es que para eliminar un objeto MyWidget se debe utilizar el método <span style="font-weight: bold;">removeNode</span> y en el caso de un objeto MyConnectionWidget se debe utilizar <span style="font-weight: bold;">removeFromParent</span>.<br /><br />La acción de eliminar se agrega en las clases MyWidget y MyConnectionWidget.<br /><br />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 <span style="font-weight: bold;">saveWidgetsToXML</span> 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.<br /><blockquote><code><br />public void saveWidgetsToXML() {<br /><br /> JFileChooser chooser = new JFileChooser ();<br /><br /> chooser.setDialogTitle ("Save Scene As XML");<br /><br /> chooser.setDialogType (JFileChooser.SAVE_DIALOG);<br /><br /> chooser.setMultiSelectionEnabled (false);<br /><br /> chooser.setFileSelectionMode (JFileChooser.FILES_ONLY);<br /><br /> chooser.setFileFilter (new FileFilter() {<br /><br /> public boolean accept (File file) {<br /><br /> if (file.isDirectory ())<br /><br /> return true;<br /><br /> return file.getName ().toLowerCase ().endsWith (".xml"); // NOI18N<br /><br /> }<br /><br /> public String getDescription () {<br /><br /> return "Extensible Markup Language (.xml)"; // NOI18N<br /><br /> }<br /><br /> });<br /><br /> if (chooser.showSaveDialog (new JFrame()) != JFileChooser.APPROVE_OPTION)<br /><br /> return;<br /><br /><br /><br /> File file = chooser.getSelectedFile ();<br /><br /> if (! file.getName ().toLowerCase ().endsWith (".xml")) // NOI18N<br /><br /> file = new File (file.getParentFile (), file.getName () + ".xml"); // NOI18N<br /><br /> if (file.exists ()) {<br /><br /> DialogDescriptor descriptor = new DialogDescriptor (<br /><br /> "File (" + file.getAbsolutePath () + ") already exists. Do you want to overwrite it?",<br /><br /> "File Exists", true, DialogDescriptor.YES_NO_OPTION, DialogDescriptor.NO_OPTION, null);<br /><br /> DialogDisplayer.getDefault ().createDialog (descriptor).setVisible (true);<br /><br /> if (descriptor.getValue () != DialogDescriptor.YES_OPTION)<br /><br /> return;<br /><br /> }<br /><br /><br /><br /> WidgetsXML wxml = new WidgetsXML(file);<br /><br /> wxml.prepareToSave();<br /><br /><br /><br /> List<Widget> list = mainLayer.getChildren();<br /><br /> for(int i=0; i<list.size(); i++) {<br /><br /> MyWidget w = (MyWidget)list.get(i);<br /><br /> MyNode n = w.getNode();<br /><br /> n.setLocation(w.getLocation());<br /><br /> wxml.addMyNode(n);<br /><br /> }<br /><br /><br /><br /> List<Widget> listConn = connectionLayer.getChildren();<br /><br /> for(int i=0; i<listConn.size(); i++) {<br /><br /> MyConnectionWidget w = (MyConnectionWidget)listConn.get(i);<br /><br /> MyEdge e = w.getMyEdge();<br /><br /> wxml.addMyEdge(e);<br /><br /> }<br /><br /><br /><br /> wxml.save();<br /><br />}<br /></code></blockquote><br />El archivo XML tiene la forma<br /><blockquote><code><br /><?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?><br /><br /><raiz><br /><br /><my-nodes></my-nodes><br /><br /><my-edges></my-edges><br /><br /></raiz><br /></code></blockquote><br />También se agregó la opción de cargar el XML y reconstruir la escena, para lo que se creó el método loadWidgetsFromXML<br /><blockquote><code><br />public void loadWidgetsFromXML() {<br /><br /> JFileChooser chooser = new JFileChooser ();<br /><br /> chooser.setDialogTitle ("Load Scene From XML");<br /><br /> chooser.setDialogType (JFileChooser.OPEN_DIALOG);<br /><br /> chooser.setMultiSelectionEnabled (false);<br /><br /> chooser.setFileSelectionMode (JFileChooser.FILES_ONLY);<br /><br /> chooser.setFileFilter (new FileFilter() {<br /><br /> public boolean accept (File file) {<br /><br /> if (file.isDirectory ())<br /><br /> return true;<br /><br /> return file.getName ().toLowerCase ().endsWith (".xml"); // NOI18N<br /><br /> }<br /><br /> public String getDescription () {<br /><br /> return "Extensible Markup Language (.xml)"; // NOI18N<br /><br /> }<br /><br /> });<br /><br /> if (chooser.showSaveDialog (new JFrame()) != JFileChooser.APPROVE_OPTION)<br /><br /> return;<br /><br /><br /><br /> File file = chooser.getSelectedFile ();<br /><br /><br /><br /> WidgetsXML wxml = new WidgetsXML(file);<br /><br /> wxml.prepareToLoad();<br /><br /><br /><br /> ArrayList<MyNode> myNodes = wxml.getMyNodes();<br /><br /> for(int i=0; i<myNodes.size(); i++) {<br /><br /> MyNode node = myNodes.get(i);<br /><br /> Widget w = MyScene.this.addNode(node);<br /><br /> getSceneAnimator().animatePreferredLocation(w, w.convertLocalToScene(node.getLocation()));<br /><br /> }<br /><br /><br /><br /> ArrayList<MyEdge> myEdges = wxml.getMyEdges();<br /><br /> MyNode source = null;<br /><br /> MyNode target = null;<br /><br /> for(int i=0; i<myEdges.size(); i++) {<br /><br /> MyEdge edge = myEdges.get(i);<br /><br /><br /><br /> for(int j=0; j<myNodes.size(); j++) {<br /><br /> MyNode n = myNodes.get(j);<br /><br /><br /><br /> if(n.getId().equals(edge.getSource()))<br /><br /> source = n;<br /><br /> if(n.getId().equals(edge.getTarget()))<br /><br /> target = n;<br /><br /> }<br /><br /><br /><br /> addEdge(edge);<br /><br /> setEdgeSource(edge, source);<br /><br /> setEdgeTarget(edge, target);<br /><br /> }<br /><br />}<br /></code></blockquote><br />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.<br /><br />Dejo unas capturas de pantalla para que vean como luce la aplicación.<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgpFE0_yC-OyB95sq6u8o277toDJRo8R5GL7U-pr-m4giO4Zn5aJmtySSdrYwOeScW23zlqlfbJM8xNlEf-d39tPQxyA_RwkGo_koVpYSAzKBCoycZwvWFxL0d6b_muUZU4dQbTM3SJMPHw/s1600-h/imagen.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgpFE0_yC-OyB95sq6u8o277toDJRo8R5GL7U-pr-m4giO4Zn5aJmtySSdrYwOeScW23zlqlfbJM8xNlEf-d39tPQxyA_RwkGo_koVpYSAzKBCoycZwvWFxL0d6b_muUZU4dQbTM3SJMPHw/s320/imagen.png" alt="" id="BLOGGER_PHOTO_ID_5414861713294682194" border="0" /></a><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhhyphenhyphen_m64BgYYBIK4dimx-E1IxXzx0b1WGVQ9XXFvXifK7063vsUjKm9iSStaYQGQft3GZV4gQFt5CmHPbbhYw5RBqrBzVa4Z9Hs6kJjIJ5BS3IxVzZivr7DKJVzaMEHhEZeHKfHdFetR_UE/s1600-h/imagen1.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhhyphenhyphen_m64BgYYBIK4dimx-E1IxXzx0b1WGVQ9XXFvXifK7063vsUjKm9iSStaYQGQft3GZV4gQFt5CmHPbbhYw5RBqrBzVa4Z9Hs6kJjIJ5BS3IxVzZivr7DKJVzaMEHhEZeHKfHdFetR_UE/s320/imagen1.png" alt="" id="BLOGGER_PHOTO_ID_5414862026348338642" border="0" /></a><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjb7E3cBUcZDl33G3WdYe8V5uG_hguZduepMoFmWj3aavWIiVJaMTLTRXkyRr4T8Y8xtkJyiFvJvcV9e1Cwj2sJtn3n9dR4KLLOcXYt3IbC8GVfbXGI-j884upuTPrlZy-ieaSzvkTwutX4/s1600-h/imagen2.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjb7E3cBUcZDl33G3WdYe8V5uG_hguZduepMoFmWj3aavWIiVJaMTLTRXkyRr4T8Y8xtkJyiFvJvcV9e1Cwj2sJtn3n9dR4KLLOcXYt3IbC8GVfbXGI-j884upuTPrlZy-ieaSzvkTwutX4/s320/imagen2.png" alt="" id="BLOGGER_PHOTO_ID_5414862619733868658" border="0" /></a><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjYKCuzqRjpmIwzCE8KbEod3sfxow2yl2r8ciBNjmPfAt0HdxEmBRKbWYNTbUdO0t9YxNkOY7xsBZfD1L1L2zMvZPxADVjEJs4xvK6R9SrIAIsObt-SiTHsSOQoG4e8cZvyaetr9nHCX0Wb/s1600-h/imagen3.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjYKCuzqRjpmIwzCE8KbEod3sfxow2yl2r8ciBNjmPfAt0HdxEmBRKbWYNTbUdO0t9YxNkOY7xsBZfD1L1L2zMvZPxADVjEJs4xvK6R9SrIAIsObt-SiTHsSOQoG4e8cZvyaetr9nHCX0Wb/s320/imagen3.png" alt="" id="BLOGGER_PHOTO_ID_5414862626725647138" border="0" /></a><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhHJrUlTaDY6zlHjev-gf_nMRWaB9VnMsIqqr-mZvyzyWVElYJMXaQw_bdiWXHD9uhQWSgM9UKiqX4BU6zUu1WiYKz43aKMN4_ldxsJ-rLNJ_AsE8b0TOwIu85QHCTwu6FEjNmrEdUCAaw_/s1600-h/imagen4.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhHJrUlTaDY6zlHjev-gf_nMRWaB9VnMsIqqr-mZvyzyWVElYJMXaQw_bdiWXHD9uhQWSgM9UKiqX4BU6zUu1WiYKz43aKMN4_ldxsJ-rLNJ_AsE8b0TOwIu85QHCTwu6FEjNmrEdUCAaw_/s320/imagen4.png" alt="" id="BLOGGER_PHOTO_ID_5414862631581860674" border="0" /></a><br /><br />Saludos !!!<br /></div>Daniel Dario Morales Salashttp://www.blogger.com/profile/07642586501018157497noreply@blogger.com36tag:blogger.com,1999:blog-1421033339681316542.post-89478898789318765242009-11-04T21:27:00.000-03:002009-11-04T21:28:11.293-03:00Mandriva 2010 liberado, actualízate !!!<strong>Mandriva Linux 2010</strong><br /><p>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.<br /><p>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.<br /><blockquote><br />"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"</blockquote>Explica Anne Nicolas-Velu, Directora de Ingeniería de Mandriva.<br /><p>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<br />enfoque personalizado.<br /><p>En pocas palabras, Mandriva Linux 2010 ofrece un sistema completo, de rápida y fácil instalación; y que incluye:<br /><ul><br /><li>Todos los controladores necesarios Compatibilidad con las nuevas plataformas (así cómo con las más antiguas), incluídos los netbooks.</li><br /><li>Una amplia gama aplicaciones que abarcan ofimática, software educativo, multimedia, juegos</li><br /><li>Moblin: El entorno para plataformas móviles</li><br /><li>Herramientas que permiten mantener su sistema seguro de manera fácil</li><br /><li>Las últimas versiones de las principales aplicaciones de Código Abierto:<br /><ul><br /><li>KDE 4.3.2</li><br /><li>GNOME 2.28</li><br /><li>Firefox 3.5.3</li><br /><li>Xorg Server 1.6.5</li><br /></ul><br />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.<br /></ul><br /><p> 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:<br /><ol><br /><li>Powerpack (la edición comercial, que incluye software exclusivo, soporte y servicios)</li><br /><li><a href="http://www.mandriva.com/es/descargas">One</a> (un Cd en vivo que puede ser también instalado permanentemente en el equipo) y</li><br /><li><a href="http://www.mandriva.com/es/descargas">Free</a> (una edición que únicamente incluye Software Libre y de Código Abierto).</li><br /><li><a href="http://www.mandriva.com/es/descargas">Dual Arch</a> (edición para arquitecturas i586 / 32 bits y x86 / 64 bits es la instalacion minima, perfecta para sistemas antiguos).</li><br /></ol><br /><strong>Versiones libres y gratuitas</strong><br /><p>Mandriva Linux, Free, ONE y Dual Arch pueden ser descargadas desde sin cargo alguno:<br /><p><a href="http://www.mandriva.com/es/descargas">http://www.mandriva.com/es/descargas</a><br /><p><a href="http://torrent.mandriva.com/public/2010.0/">http://torrent.mandriva.com/public/2010.0/</a><br /><p>Las versiones FREE y DUAL ARCH <b>solo contienen Software Libre</b> la version ONE trae consigo algunos programas cuya licencia no es libre.<br /><p><strong>Version de pago: Precios y disponibilidad</strong><br /><p>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:<br /><p><a href="http://store.mandriva.com/">http://store.mandriva.com/</a><br /><p>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:<br /><p><a href="http://www.mandriva.com/">http://www.mandriva.com/</a><br /><p>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.<br /><br /><p><b>¿Necesitas ayuda con Mandriva linux?</b><br /><p>Visita la Comunidad y Foro Oficiales de los Usuarios Hispanohablantes de Mandriva Linux:<br /><a href="http=//blogdrake.net">blogdrake.net</a><br /><p><i>Traduccion realizada por el equipo de Traductores de BlogDRAKE "MDK Trans"</i><br /><br /><p>Copia esta noticia en tu sitio web: <a href="http://blogdrake.net/consulta/colabora-con-mandriva-linux-copia-esto-tu-sitio-web">Colabora con Mandriva Linux</a>Daniel Dario Morales Salashttp://www.blogger.com/profile/07642586501018157497noreply@blogger.com1tag:blogger.com,1999:blog-1421033339681316542.post-15323941793920731732009-09-04T10:51:00.029-04:002009-09-05T00:17:07.712-04:00Zenoss - Monitoreo de infraestructura TI<div style="text-align: justify;"><a href="http://www.zenoss.com/">Zenoss</a> es un software opensource que permite realizar monitoreo remoto de equipos como servidores, routers, ups, etc.<br /><br />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.<br /><br />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.<br /><br />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.<br /><br />Zenoss es una solución entre varias como <a href="http://www.nagios.org/">Nagios</a> u <a href="http://www.opennms.org/">openNMS</a> e incluso otras propietarias como <a href="http://www.bmc.com/products">BMC Performance Manager Portal y BMC Proactive Net</a>.<br /><br />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.<br /><br />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.<br /><br />Zenoss permite monitorear utilizando <a href="http://es.wikipedia.org/wiki/Simple_Network_Management_Protocol">SNMP</a>, <a href="http://es.wikipedia.org/wiki/Secure_Shell">SSH</a>, <a href="http://es.wikipedia.org/wiki/Secure_Shell">WMI</a>. 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.<br /><br />Mediante WMI podemos obtener información útil de máquinas Windows como los servicios que están corriendo y el software instalado.<br /><br />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.<br /><br />Zenoss muestra, además, gráficas representativas de la utilización de recursos de CPU y memoria.<br /><br />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.<br /><br />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 <a href="http://sourceforge.net/projects/zenoss/files/">descargar</a> 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).<br /><br />Una característica realmente interesante es la funcionalidad de <a href="http://www.zenoss.com/product/network-management">Thresholds predictivos</a> que lo acerca a su rival BMC Proactive Net, funcionalidad que permite manejar umbrales dinámicos.<br /><br />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.<br /><br />Otra característica importante es el soporte para monitoreo de infraestructura de servidores virtuales VMware ESX 4 (vSphere) ya que está <a href="http://www.zenoss.com/news/archive/zenosspressrelease.2009-08-31.6915744310">acreditado</a> por <a href="http://www.vmware.com/">VMware</a>.<br /><br />También tiene integración con Remedy mediante el cual se pueden generar tickets de soporte.<br /><br />La comunidad alrededor de Zenoss es muy amable, tuve la oportunidad de hacer preguntas y comentarios a los desarrolladores de Zenoss mediante el <a href="http://blog.zenoss.com/2009/09/02/zenoss-irc-session-thursday-september-3/">IRC</a> y no tuvieron ningún problema en responder y aclarar mis dudas. Zenoss tiene a nuestra disposición un <a href="http://blog.zenoss.com/">blog</a>, <a href="http://forums.zenoss.com/">foros</a>, <a href="http://www.zenoss.com/news">noticias</a> y el <a href="http://blog.zenoss.com/2009/09/02/zenoss-irc-session-thursday-september-3/">IRC</a> para hacer preguntas en vivo.<br /><br />La instalación es muy simple de realizar, solo requiere que esté instalado <a href="http://www.mysql.com/">MySQL</a>.<br /><br />Primero hay que descargar el instalador de <a href="http://sourceforge.net/projects/zenoss/files/">acá</a>, está para 32 y 64 bits (solo para linux).<br /><br />Luego le damos permisos al ejecutable<br /><blockquote>chmod +x instalador</blockquote><br />y lo ejecutamos desde consola<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgjUcr5Or9_e5scrVhYt-fgEao1kv8BjOmlmRUooeMZClcGUDfpuipcte1k5i586QrHcLcunDxKMZhBwoYxJPE0wh2QoXTFUectCVeADfWlhh5J3KM1P5yR9ynTmtLhJ50Sc594Q9Pd-p4G/s1600-h/1.jpeg"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgjUcr5Or9_e5scrVhYt-fgEao1kv8BjOmlmRUooeMZClcGUDfpuipcte1k5i586QrHcLcunDxKMZhBwoYxJPE0wh2QoXTFUectCVeADfWlhh5J3KM1P5yR9ynTmtLhJ50Sc594Q9Pd-p4G/s320/1.jpeg" alt="" id="BLOGGER_PHOTO_ID_5377637939678173458" border="0" /></a><br />Presionamos next<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEirr8i7qI9QDmz_QQBeTf9AQp0rNiuuIFf1-RKrHoPLk0SAUByE5u4GAQNEk3oGW8uCM7kF8OZo1294axFu51PuRgrniTqeDqcsWbmqOLoPenLPPxqVRwqfftNHcWi5CTD351zTS4-MkoR9/s1600-h/2.jpeg"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEirr8i7qI9QDmz_QQBeTf9AQp0rNiuuIFf1-RKrHoPLk0SAUByE5u4GAQNEk3oGW8uCM7kF8OZo1294axFu51PuRgrniTqeDqcsWbmqOLoPenLPPxqVRwqfftNHcWi5CTD351zTS4-MkoR9/s320/2.jpeg" alt="" id="BLOGGER_PHOTO_ID_5377638207444001570" border="0" /></a><br />Seleccionamos el lugar de instalación<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEifshpp-WmjPecjVKD63bLXVdqKh7eUyHQ7n_DrbqGTQTT_KUuN6QqZJg70DUWsXDmsBrx7cMy6yFtbokGmYfBC5u100OvWudN4aqURIGR7zFfv5pjbshFcu0GAwzfFNY9Q5tZfgYXmIsEo/s1600-h/3.jpeg"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEifshpp-WmjPecjVKD63bLXVdqKh7eUyHQ7n_DrbqGTQTT_KUuN6QqZJg70DUWsXDmsBrx7cMy6yFtbokGmYfBC5u100OvWudN4aqURIGR7zFfv5pjbshFcu0GAwzfFNY9Q5tZfgYXmIsEo/s320/3.jpeg" alt="" id="BLOGGER_PHOTO_ID_5377638504522379954" border="0" /></a><br />Ingresamos el nombre la contraseña del usuario administrador de MySQL<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhSNMds-gdR_N0t2W1phhSLZvktpo06K2DRaqGU-OPkE7ZseVUjhLAxio445d73onbbo258XEYfxJeijPMAdwJZNFKKmtb9eugZ9oT7Ols1E3ehvROR4if9qHy-KzIksVFIdcAmzPyh03Lh/s1600-h/4.jpeg"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhSNMds-gdR_N0t2W1phhSLZvktpo06K2DRaqGU-OPkE7ZseVUjhLAxio445d73onbbo258XEYfxJeijPMAdwJZNFKKmtb9eugZ9oT7Ols1E3ehvROR4if9qHy-KzIksVFIdcAmzPyh03Lh/s320/4.jpeg" alt="" id="BLOGGER_PHOTO_ID_5377638515623397282" border="0" /></a><br />Presionamos next<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgXJUR-_DiOLS4F-qmHfP9qzMg5-i7JgLoXpCFOFl3JbsMPncUVfzwMWA_juVsxZKpZ2Z_J8OBsmeUOEcV2HSErCNI4Phb1YfykEZ3On6lcnQyF20fwJ-cq5J-ISa5AMc3LHYKIUKJXFybK/s1600-h/5.jpeg"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgXJUR-_DiOLS4F-qmHfP9qzMg5-i7JgLoXpCFOFl3JbsMPncUVfzwMWA_juVsxZKpZ2Z_J8OBsmeUOEcV2HSErCNI4Phb1YfykEZ3On6lcnQyF20fwJ-cq5J-ISa5AMc3LHYKIUKJXFybK/s320/5.jpeg" alt="" id="BLOGGER_PHOTO_ID_5377638519151678690" border="0" /></a><br />Esperamos unos minutos<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgt4hvA_iB4uFtOeYWbL4R1Tv9yy0BDiCjUrsmtbFNBI3uB3cVzzmrMBuKSGHHyEb7ZTls8K8kfiG2Tpz3isVbShSstkZSwIeCzUL2XGnP2hsmVXerJIymFf5ROo2IxBfGDdS5yj1g5KAXb/s1600-h/6.jpeg"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgt4hvA_iB4uFtOeYWbL4R1Tv9yy0BDiCjUrsmtbFNBI3uB3cVzzmrMBuKSGHHyEb7ZTls8K8kfiG2Tpz3isVbShSstkZSwIeCzUL2XGnP2hsmVXerJIymFf5ROo2IxBfGDdS5yj1g5KAXb/s320/6.jpeg" alt="" id="BLOGGER_PHOTO_ID_5377638522516076818" border="0" /></a><br />Y ya tenemos Zenoss listo<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhAyQ1cij7-W10Cj92k6LpGvcU-kKdNCCJpDV1k3b9tlZhw33sx-7_pWppTRShWJLhx6rBLGd6O4ydmRnkNegvJIw3L1W3F15i9ofb-PdjR0ce27AXVoISG3ghvBzTNVpMyIHFE5kW_GB-1/s1600-h/7.jpeg"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhAyQ1cij7-W10Cj92k6LpGvcU-kKdNCCJpDV1k3b9tlZhw33sx-7_pWppTRShWJLhx6rBLGd6O4ydmRnkNegvJIw3L1W3F15i9ofb-PdjR0ce27AXVoISG3ghvBzTNVpMyIHFE5kW_GB-1/s320/7.jpeg" alt="" id="BLOGGER_PHOTO_ID_5377638531661850994" border="0" /></a><br />Con eso ya la instalación está completa.<br /><br />Para ingresar simplemente abrimos un navegador web e ingresamos la siguiente URL:<br /><blockquote><a href="http://localhost:8080/">http://localhost:8080</a></blockquote><br />y se abrirá la pantalla inicial de configuración de Zenoss<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhrLuA8I6FIYKpPCG29Pf6m7s7leG_BXfi5U9f7ChFYObKznHTQDBp_Sy-DxNzLRbtJaYUyFsa_RhwSBzmfbPlDIK6302nEwd9XA6e3Q_8EpdV5hfDHvxr4Ny3WdDQk5RnfK2Uuc6TMqyre/s1600-h/1.jpeg"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhrLuA8I6FIYKpPCG29Pf6m7s7leG_BXfi5U9f7ChFYObKznHTQDBp_Sy-DxNzLRbtJaYUyFsa_RhwSBzmfbPlDIK6302nEwd9XA6e3Q_8EpdV5hfDHvxr4Ny3WdDQk5RnfK2Uuc6TMqyre/s320/1.jpeg" alt="" id="BLOGGER_PHOTO_ID_5377640103575178210" border="0" /></a><br />Pinchamos Step 1 y veremos la siguiente pantalla en donde debemos ingresar la contraseña del usuario <span style="font-style: italic;">"admin"</span> e ingresamos un nuevo usuario de monitoreo<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhkgBDUQe0H6nXbFbVRO8Nt0HyG1hK7hoBEgYl1VG77Z2JPZB-6ImROkHKOA5dvPFVULvozWYF0KH0QvU0LWVBSEQTfx1CXi6ipQqgghh47HWadXCDfVFWl4F7wXmkOK6x9PowOIIvptXe4/s1600-h/2.jpeg"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhkgBDUQe0H6nXbFbVRO8Nt0HyG1hK7hoBEgYl1VG77Z2JPZB-6ImROkHKOA5dvPFVULvozWYF0KH0QvU0LWVBSEQTfx1CXi6ipQqgghh47HWadXCDfVFWl4F7wXmkOK6x9PowOIIvptXe4/s320/2.jpeg" alt="" id="BLOGGER_PHOTO_ID_5377640262930084130" border="0" /></a><br />Ahora podemos agregar máquinas para monitorear<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgj1Ro04edahcnDoOwqUWkYtVvvWG4rX-rLLnYyxj-jaPYDj6kcrCyWgD35ckAoP6l3-80DKCNDVsvkyxqSo3-LDFAg3CbyuC9Zaa4yOC8w8KA-iCXOauTTDrI5koDjG4yn5eXOgoyvk4h3/s1600-h/3.jpeg"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgj1Ro04edahcnDoOwqUWkYtVvvWG4rX-rLLnYyxj-jaPYDj6kcrCyWgD35ckAoP6l3-80DKCNDVsvkyxqSo3-LDFAg3CbyuC9Zaa4yOC8w8KA-iCXOauTTDrI5koDjG4yn5eXOgoyvk4h3/s320/3.jpeg" alt="" id="BLOGGER_PHOTO_ID_5377640266991700130" border="0" /></a><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjHke6aWi84JyypTqkhTiuUH-yTBEHEgcjyVtRWZSIX8L-8vlk7k7QMwASXRX3zu5nwiUmA3LYt5qwpTpAsa_gJr9U5lqXSU71KgwqTPv_yP5eX54VKbgIG0dvq88dGwgIRxoRV99zumQzV/s1600-h/4.jpeg"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjHke6aWi84JyypTqkhTiuUH-yTBEHEgcjyVtRWZSIX8L-8vlk7k7QMwASXRX3zu5nwiUmA3LYt5qwpTpAsa_gJr9U5lqXSU71KgwqTPv_yP5eX54VKbgIG0dvq88dGwgIRxoRV99zumQzV/s320/4.jpeg" alt="" id="BLOGGER_PHOTO_ID_5377640275947195346" border="0" /></a><br />Seleccionamos la opcion <span style="font-style: italic;">Manually find devices</span> e ingresamos el IP de la máquina que queremos, en este caso un Linux por SNMP y luego pinchamos submit<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgPpuCCguu2MiNfOM8gG1bPj-POvQTKBJ5iLg5yk5lv-e8Dkq0RlKg8ZwcXO48sGlQW7mBlZIgN5yc-Vf72CIWSBDhURS8168tF0SbseRsh6NGF4dMa1bV-s67KnSHZi8bpAjvgAY5swCkq/s1600-h/1.jpeg"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgPpuCCguu2MiNfOM8gG1bPj-POvQTKBJ5iLg5yk5lv-e8Dkq0RlKg8ZwcXO48sGlQW7mBlZIgN5yc-Vf72CIWSBDhURS8168tF0SbseRsh6NGF4dMa1bV-s67KnSHZi8bpAjvgAY5swCkq/s320/1.jpeg" alt="" id="BLOGGER_PHOTO_ID_5377644912187061586" border="0" /></a><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiW-rBRkW2mZpVegA02FYzsMT3Xguqfuewt92qLWWs6Q37Loy5f3TdfTefABFgZwvJcN-bJyOLUuZ_xN_xO3z0UvlMAOtu9fARsp6Gn5VwBiMU8EGj_JNsuRSAehQMjRoXGbpddDIBP9OhX/s1600-h/2.jpeg"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiW-rBRkW2mZpVegA02FYzsMT3Xguqfuewt92qLWWs6Q37Loy5f3TdfTefABFgZwvJcN-bJyOLUuZ_xN_xO3z0UvlMAOtu9fARsp6Gn5VwBiMU8EGj_JNsuRSAehQMjRoXGbpddDIBP9OhX/s320/2.jpeg" alt="" id="BLOGGER_PHOTO_ID_5377645398889896738" border="0" /></a><br />Si pinchamos <span style="font-style: italic;">Devices</span> (al lado derecho en la pestaña <span style="font-style: italic;">Classes</span>) podemos ver que en <span style="font-style: italic;">Server</span> aparece un dispositivo agregado con color azul (que significa que se encontró el dispositivo)<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh7KdO8-HoCf8PXVz3FMgFZv9OgzMhw23yn3LL9XnohKxQ8AOWJwMIkXbz4Xduee18v41m3QMJ5yS3dOE6wzGyc9Gp0KD5BGm9UEvp4obFuwLw3Tkt8wCkAxYCuLB_3D3Gv5H7Wjfczc0Jq/s1600-h/3.jpeg"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh7KdO8-HoCf8PXVz3FMgFZv9OgzMhw23yn3LL9XnohKxQ8AOWJwMIkXbz4Xduee18v41m3QMJ5yS3dOE6wzGyc9Gp0KD5BGm9UEvp4obFuwLw3Tkt8wCkAxYCuLB_3D3Gv5H7Wjfczc0Jq/s320/3.jpeg" alt="" id="BLOGGER_PHOTO_ID_5377645943092572018" border="0" /></a><br />Si pinchamos la elipse azul podemos ver el detalle del evento<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg5-QoX3O-YGhneCOaoUkWCVnO-O6E38Tfffi5s9T6I7Y0Cw3hURvB9xT59aPdrpt57CjT0pZCUw9oQ-YyRpNs60hBAGN-Ud5TT7Je8gb1jAW-d_X5Kbv84doDxD05Qb9KAgjb6PQBV7rA1/s1600-h/4.jpeg"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg5-QoX3O-YGhneCOaoUkWCVnO-O6E38Tfffi5s9T6I7Y0Cw3hURvB9xT59aPdrpt57CjT0pZCUw9oQ-YyRpNs60hBAGN-Ud5TT7Je8gb1jAW-d_X5Kbv84doDxD05Qb9KAgjb6PQBV7rA1/s320/4.jpeg" alt="" id="BLOGGER_PHOTO_ID_5377646083255919634" border="0" /></a><br />Si pinchamos el nombre del dispositivo podemos ir a la página de monitoreo del mismo<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgOJ1VzIWhcawBI1BLDvsBjd7RVAZXl9CEHNjx1TsA83vr9eKJCobnZnf7PxOU5hUikaX4OhEDYjMyZAeyYqU5650yDvHJUg-jmboqgHkXNDPAxiF925lZJV4RO0m8No94HcYUSyp20VSEM/s1600-h/5.jpeg"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgOJ1VzIWhcawBI1BLDvsBjd7RVAZXl9CEHNjx1TsA83vr9eKJCobnZnf7PxOU5hUikaX4OhEDYjMyZAeyYqU5650yDvHJUg-jmboqgHkXNDPAxiF925lZJV4RO0m8No94HcYUSyp20VSEM/s320/5.jpeg" alt="" id="BLOGGER_PHOTO_ID_5377646500748454290" border="0" /></a><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhJXUa3BroJqFVKi1Sl85rYLDkPSpF6Ckeh2aGTsYbXjDg4ovkVAUcWkDSj0WxcIITW4YUgJzcLXfr9QPWAdrS6cPMbgD8th2pIzzpvst-lnJe24AZTF4GGYb92udWQvlwldNHUeTa3xyBc/s1600-h/6.jpeg"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhJXUa3BroJqFVKi1Sl85rYLDkPSpF6Ckeh2aGTsYbXjDg4ovkVAUcWkDSj0WxcIITW4YUgJzcLXfr9QPWAdrS6cPMbgD8th2pIzzpvst-lnJe24AZTF4GGYb92udWQvlwldNHUeTa3xyBc/s320/6.jpeg" alt="" id="BLOGGER_PHOTO_ID_5377646826542391938" border="0" /></a><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj07ZjP_71fuqO7vg-dHttCWxg1ybg6mEEq59pcgCLh6GEB2ia10Kjc-vG9lK5WUIXxyeONB_Of8xSapg4FAU48IqxI4O4V_5WadjHuS4Y3OuAbJDPiVeo-s8KF7tFwHx64OdMZVl6jrHR9/s1600-h/7.jpeg"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj07ZjP_71fuqO7vg-dHttCWxg1ybg6mEEq59pcgCLh6GEB2ia10Kjc-vG9lK5WUIXxyeONB_Of8xSapg4FAU48IqxI4O4V_5WadjHuS4Y3OuAbJDPiVeo-s8KF7tFwHx64OdMZVl6jrHR9/s320/7.jpeg" alt="" id="BLOGGER_PHOTO_ID_5377646828362974690" border="0" /></a><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjiLA0puj6OkhrA7QvN5_NHZKWiMri-e0YoswHoBwaV_FqFzA7iTBhKRHnO7k6RpCtgXwds1B9UWno4gGp7chrDQiAvr7dJ6BUJ6xwDyr5MjHeagk7-eb8sJlCDW4K4J2ti3IGak28cptgS/s1600-h/8.jpeg"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjiLA0puj6OkhrA7QvN5_NHZKWiMri-e0YoswHoBwaV_FqFzA7iTBhKRHnO7k6RpCtgXwds1B9UWno4gGp7chrDQiAvr7dJ6BUJ6xwDyr5MjHeagk7-eb8sJlCDW4K4J2ti3IGak28cptgS/s320/8.jpeg" alt="" id="BLOGGER_PHOTO_ID_5377646838808595858" border="0" /></a><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj9tVKeZwK9I7QLrBE5mElHryARbXU6zTtniUc32lQZR3wdR9e2nUdjlgGIMXDY0jwp7FmIYMaegUsxRpF_hpy8-VmranwcfInDL9ZYYJxoPHf4uIWdrviJ541GzoszZwcmli9KxRrBOG6U/s1600-h/9.jpeg"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj9tVKeZwK9I7QLrBE5mElHryARbXU6zTtniUc32lQZR3wdR9e2nUdjlgGIMXDY0jwp7FmIYMaegUsxRpF_hpy8-VmranwcfInDL9ZYYJxoPHf4uIWdrviJ541GzoszZwcmli9KxRrBOG6U/s320/9.jpeg" alt="" id="BLOGGER_PHOTO_ID_5377646842057909378" border="0" /></a><br />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.).<br /><br />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.<br /><br />Saludos !!!<br /></div>Daniel Dario Morales Salashttp://www.blogger.com/profile/07642586501018157497noreply@blogger.com12tag:blogger.com,1999:blog-1421033339681316542.post-5243029611128663232009-08-23T21:21:00.010-04:002009-08-23T22:30:47.348-04:00JKiltro reproductor de audio 1.0.1Hoy he subido la versión 1.0.1 de <a href="http://code.google.com/p/jkiltroaudioplayer/">JKiltro Reproductor de Audio</a>, el cual es un pequeño software desarrollado en Java con el IDE <a href="http://www.netbeans.org/">NetBeans 6.7.1</a>.<br /><div style="text-align: justify;"><br />Este reproductor de audio se basa en varios proyectos open source para reproducir sonido, los cuales son:<br /></div><ul style="text-align: justify;"><li><a href="http://www.javazoom.net/jlgui/api.html">BasicPlayer 3.0</a></li><li><a href="http://www.javazoom.net/javalayer/javalayer.html">JLayer 1.0.1</a></li><li><a href="http://www.javazoom.net/jlgui/jlgui.html">JLGui 3.0</a></li><li><a href="http://www.javazoom.net/mp3spi/mp3spi.html">MP3 SPI 1.9.4</a></li><li><a href="http://www.javazoom.net/vorbisspi/vorbisspi.html">Vorbis SPI 1.0.3</a></li><li>JOgg 0.0.7</li><li><a href="http://www.jcraft.com/jorbis/">JOrbis 0.0.17</a></li><li><a href="http://jflac.sourceforge.net/">JFlac 1.2</a></li><li><a href="http://jmac.sourceforge.net/">JMac</a></li><li><a href="http://www.tritonus.org/plugins.html">Tritonus Share</a></li><li><a href="http://code.google.com/p/libkj-java/">KJ_DSP 1.2</a></li><li><a href="http://entagged.sourceforge.net/">Entagged 0.35</a></li><li><a href="http://www.jthink.net/jaudiotagger/">JAudioTagger 1.0.9</a></li><li><a href="https://substance.dev.java.net/">Substance 5.2</a></li></ul><div style="text-align: justify;"> Mediante el uso de los proyectos antes mencionados, <span style="font-style: italic;">JKiltro Reproductor de Audio</span> puede <span style="font-style: italic;">reproducir archivos</span> en los formatos <span style="font-weight: bold;">aiff, ape, au, mp3, ogg, flac y wav</span>, además permite <span style="font-style: italic;">editar la metadata</span> de los archivos <span style="font-weight: bold;">ape, mp3, ogg y flac</span>.<br /><br /><span style="font-style: italic;">JKiltro Reproductor de Audio</span> mantiene una <span style="font-style: italic;">lista única de reproducción</span> y contiene los controles básicos de reproducción:<br /><blockquote>reproducir, detener, pausa, anterior, siguiente, volumen, panning, saltar posición, agregar a la lista, eliminar de la lista, vaciar lista</blockquote><br />además permite <span style="font-style: italic;">saltarse</span> 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.<br /><br />También tiene la opción de <span style="font-style: italic;">repetir</span> la reproducción desde el inicio con solo marcar un cuadro con un ticket.<br /><br />Otra característica que lo hace interesante es que contiene un pequeño <span style="font-style: italic;">previsualizador</span> 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.<br /><br />Lo mejor de todo este proyecto es que <span style="font-weight: bold;">puede ser utilizado en sus propias aplicaciones</span> ya que pueden agregar el panel principal a su propio contenedor (JFrame, JPanel) con solo crear una instancia:<br /><blockquote>PanelPrincipalReproductorAudio reproductor = new PanelPrincipalReproductorAudio();</blockquote><br />y ya tienen un reproductor de audio (y editor de metadata) empotrado.<br /><br />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.<br /><blockquote>ControladorPanelPrincipalReproductorAudio controlador = new ControladorPanelPrincipalReproductorAudio();</blockquote>Una buena forma de entender el código fuente es partir mirando la clase <span style="font-weight: bold;">PanelPrincipalReproductorAudio.java</span>, 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).<br /><br />El proyecto <span style="font-style: italic;">substance</span> lo usé para permitir elegir un <span style="font-style: italic;">theme</span> 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.<br /><br />Aún quedan cosas por hacer, por ejemplo agregar un equalizador, JLGui trae uno pero falta integrarlo a mi proyecto.<br /><br />Lo he probado en <a href="http://www.mandriva.com/">Mandriva Spring 2009</a> y Windows XP SP3 y funciona bien.<br />En el caso de Linux, si se quiere compartir el recurso de audio con otras aplicaciones se debe usar <a href="http://es.wikipedia.org/wiki/PulseAudio">pulse audio</a> y <a href="http://openjdk.java.net/">OpenJDK</a>, de otra forma la aplicación les tomará el recurso de audio y no permitirá a otras aplicaciones utilizarlo.<br /><br />A continuación les dejo algunas capturas de pantalla:<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgTrz58eLhp_f6txztWPyWcIKgSbpcsN-eiLHHvAGz4AGUjFJZGiiF0zlyk9Sgq8wcBaVGQxVk_OY_v8bPt1n0gqsPj839EpO957ETiilsIGbCZrTxrbgfeNVnW7iMrzYu7zTkpApfwrlcB/s1600-h/1.jpeg"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgTrz58eLhp_f6txztWPyWcIKgSbpcsN-eiLHHvAGz4AGUjFJZGiiF0zlyk9Sgq8wcBaVGQxVk_OY_v8bPt1n0gqsPj839EpO957ETiilsIGbCZrTxrbgfeNVnW7iMrzYu7zTkpApfwrlcB/s320/1.jpeg" alt="" id="BLOGGER_PHOTO_ID_5373350693249147746" border="0" /></a><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhAbx1_1eMm-QctvpKQqPH49mhIg7TYDPk2eJt5bGuaWgncoA0E9x1VI8I2nGLeI40BpHJBHRTyowP_iqeWI05F4jhXyJ46_rgMeK0rshGsxnK6-DR2jmzPr4YrD33m6Ke1ktqLM6Dl8t0f/s1600-h/2.jpeg"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhAbx1_1eMm-QctvpKQqPH49mhIg7TYDPk2eJt5bGuaWgncoA0E9x1VI8I2nGLeI40BpHJBHRTyowP_iqeWI05F4jhXyJ46_rgMeK0rshGsxnK6-DR2jmzPr4YrD33m6Ke1ktqLM6Dl8t0f/s320/2.jpeg" alt="" id="BLOGGER_PHOTO_ID_5373350923063456146" border="0" /></a><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg1pEslStsaaCOh2VqABgbwi7rvIoePppoIBYOz8JYTnlWexPVkJKqMPu1JdWyO1fu4IO4W50CmI-lGp1EIO6JwkLbSMQtEBguJKD6eubIqYpYBHRHoEI8V1WBTleOvCffDGS0QghDAUDaY/s1600-h/3.jpeg"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg1pEslStsaaCOh2VqABgbwi7rvIoePppoIBYOz8JYTnlWexPVkJKqMPu1JdWyO1fu4IO4W50CmI-lGp1EIO6JwkLbSMQtEBguJKD6eubIqYpYBHRHoEI8V1WBTleOvCffDGS0QghDAUDaY/s320/3.jpeg" alt="" id="BLOGGER_PHOTO_ID_5373350923740010050" border="0" /></a><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjrzGAaKHdemMve9l4DZ4D1gznv79r-Xl20hWkMieU9sPfGWRG2L7MwaYckHG62UV6QF-1DCxaQM1gjMLqoGr5ey4ULHw0Gu6xcb5q7pCq3im7YPfDAxCKfzJt7e20LyRwn6OdIjN88GuRv/s1600-h/4.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjrzGAaKHdemMve9l4DZ4D1gznv79r-Xl20hWkMieU9sPfGWRG2L7MwaYckHG62UV6QF-1DCxaQM1gjMLqoGr5ey4ULHw0Gu6xcb5q7pCq3im7YPfDAxCKfzJt7e20LyRwn6OdIjN88GuRv/s320/4.png" alt="" id="BLOGGER_PHOTO_ID_5373350932636496578" border="0" /></a><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgNM8xErxTos8OSEfQIjRGpJLQtlxd01ocdBUSLWeISQVpkBTnhsgfEkFnTNKnSu68GvgnVd7xjovvv1y6OPr4wskLA8QCzggl8gsUY7O0-XR65JJZ7E3vtZSjDywnYCl27X0vchlUpFIWA/s1600-h/5.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgNM8xErxTos8OSEfQIjRGpJLQtlxd01ocdBUSLWeISQVpkBTnhsgfEkFnTNKnSu68GvgnVd7xjovvv1y6OPr4wskLA8QCzggl8gsUY7O0-XR65JJZ7E3vtZSjDywnYCl27X0vchlUpFIWA/s320/5.png" alt="" id="BLOGGER_PHOTO_ID_5373350938368926274" border="0" /></a><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgWPWYQv9T7HdTntABaZEP1JYqxsQ4mozsKM_U21cJgGCKUI04elFkNT2E_OQ9qmikdl9zHUjchupSqc95XY3tBbWfZ7L-_hxlUACdWvgwrzY4Z2kwBjCRfh5pbuwPBhdIWjtzohRLDMgC4/s1600-h/6.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgWPWYQv9T7HdTntABaZEP1JYqxsQ4mozsKM_U21cJgGCKUI04elFkNT2E_OQ9qmikdl9zHUjchupSqc95XY3tBbWfZ7L-_hxlUACdWvgwrzY4Z2kwBjCRfh5pbuwPBhdIWjtzohRLDMgC4/s320/6.png" alt="" id="BLOGGER_PHOTO_ID_5373350940837575298" border="0" /></a><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiyOd_x_YcsebB8BGRF11DfK8r_6OYMEmt1bxij7ZFI7cSlkX_6MYhezLZuH60a1sAROD29dVg51NyBS76w-je7laCzzj_eX61pQBG32Dje-WXiPH-_dSRKXAPHvRTQis24C7eRfkFclKpX/s1600-h/7.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiyOd_x_YcsebB8BGRF11DfK8r_6OYMEmt1bxij7ZFI7cSlkX_6MYhezLZuH60a1sAROD29dVg51NyBS76w-je7laCzzj_eX61pQBG32Dje-WXiPH-_dSRKXAPHvRTQis24C7eRfkFclKpX/s320/7.png" alt="" id="BLOGGER_PHOTO_ID_5373351563766505762" border="0" /></a><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEghlflIVvIWxWSzVfkTy-oHQGdgDfjpOJ3AoHlJ9ItGQWRTZUT0bnom2uAvP8rvkpMCj7NTg1ZerHCDOOFFeb9gzdMwND58FRAxvg5gRbzlzat8yulGye3Ma990_FPhG3gMn7gvHoCmYrb2/s1600-h/8.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEghlflIVvIWxWSzVfkTy-oHQGdgDfjpOJ3AoHlJ9ItGQWRTZUT0bnom2uAvP8rvkpMCj7NTg1ZerHCDOOFFeb9gzdMwND58FRAxvg5gRbzlzat8yulGye3Ma990_FPhG3gMn7gvHoCmYrb2/s320/8.png" alt="" id="BLOGGER_PHOTO_ID_5373351569950830786" border="0" /></a><br />Desde <a href="http://jkiltroaudioplayer.googlecode.com/files/JKiltroReproductorAudio-1.0.1-src.tar.bz">aća</a> pueden descargar el código fuente (proyecto NetBeans 6.7.1) y desde <a href="http://jkiltroaudioplayer.googlecode.com/files/JKiltroReproductorAudio-1.0.1.tar.bz">acá</a> pueden descargar los binarios para usar la aplicación y probarla.<br /><br />Espero les sea de utilidad.<br /><br />Saludos !!!<br /></div>Daniel Dario Morales Salashttp://www.blogger.com/profile/07642586501018157497noreply@blogger.com4tag:blogger.com,1999:blog-1421033339681316542.post-34643405946749978982009-06-29T14:48:00.004-04:002009-06-29T14:57:04.109-04:00Me titulé de Ingeniero Civil en Computación e Informática !!!<div style="text-align: justify;">Estimados lectores de mi blog,<br /><br />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.<br /><br />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í.<br /><br />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.<br /><br />Un saludo a todos.<br /></div>Daniel Dario Morales Salashttp://www.blogger.com/profile/07642586501018157497noreply@blogger.com13tag:blogger.com,1999:blog-1421033339681316542.post-12107712147328555292009-05-24T00:11:00.012-04:002009-05-24T00:56:59.213-04:00Exposición Web Service con NetBeans 6.5.1 y Glassfish 2.1<div style="text-align: justify;"><a href="http://metalklesk.blogspot.com/2007/10/web-service-y-web-service-client-en.html">Tiempo atrás hice un tutorial bastante detallado sobre como crear y consumir web services</a> usando <a href="http://www.netbeans.org/">NetBeans</a> y <a href="https://glassfish.dev.java.net/">Glassfish</a>. Hoy traigo lo mismo pero con un ejemplo mucho mas sencillo y fácil de entender y digerir.<br /><br />Esta entrada trata sobre la exposición de un <a href="http://es.wikipedia.org/wiki/Servicio_Web">Web Service</a>, en otra entrada explicaré cómo consumirlo.<br /><br />El ejemplo expone dos métodos a través de Web Service para validar la existencia de un usuario (<span style="font-style: italic;">getUsuario</span>) y para modificar sus datos (<span style="font-style: italic;">setUsuario</span>).<br /><br />Los datos del usuario están en un archivo <a href="http://es.wikipedia.org/wiki/XML">XML</a> para mantener el ejemplo sencillo y simple. La estructura del XML es la siguiente:<br /></div><br /><blockquote><?xml version="1.0" encoding="UTF-8"?><br /><raiz><br /><usuario id="1" user="metalklesk" passwd="metalklesk" activo="true" /><br /><usuario id="2" user="klesk" passwd="klesk" activo="false" /><br /></raiz></blockquote><br /><div style="text-align: justify;">como se puede ver a continuación:<br /></div><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiqslFzwO2XX_Ge452SiylUTuki5LntO4qRB4ew16lCYbix4Uh1g4uwgnww73vx4V_l62JzJPjRM_Z8eRT6PhtABnQjEP579sH0O6Lp6jnoje-ivzSZVzTEQc2eEwDdrnhEqa3nUsOzyOoc/s1600-h/imagen1.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiqslFzwO2XX_Ge452SiylUTuki5LntO4qRB4ew16lCYbix4Uh1g4uwgnww73vx4V_l62JzJPjRM_Z8eRT6PhtABnQjEP579sH0O6Lp6jnoje-ivzSZVzTEQc2eEwDdrnhEqa3nUsOzyOoc/s320/imagen1.png" alt="" id="BLOGGER_PHOTO_ID_5339240315256325122" border="0" /></a><br /><div style="text-align: justify;">El archivo se llama <span style="font-weight: bold;">usuarios.xml</span> y debe crearse (o copiarse) en el directorio <span style="font-style: italic;">home</span> 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).<br /><br />Una vez listo ya podemos crear el Web Service. Para esta tarea utilizaremos un contenedor <a href="http://en.wikipedia.org/wiki/Enterprise_JavaBean">EJB</a>.<br /><br />Abrimos <span style="font-style: italic;">NetBeans 6.5.1 -> New project -> Java EE -> EJB module</span><br /></div><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhPOLZELMyFQikne2zbZvz6iz4K3RYWEhe36wTqIlxH1RCbHtdDxPwKomzPOgGFzGn9VDDARtyKsthCB0hvGnDADRbMNT5RubQrRK78Np-JPVXz8vThusEXGp9C-7eZyoMPEX_7K90muvwL/s1600-h/imagen2.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhPOLZELMyFQikne2zbZvz6iz4K3RYWEhe36wTqIlxH1RCbHtdDxPwKomzPOgGFzGn9VDDARtyKsthCB0hvGnDADRbMNT5RubQrRK78Np-JPVXz8vThusEXGp9C-7eZyoMPEX_7K90muvwL/s320/imagen2.png" alt="" id="BLOGGER_PHOTO_ID_5339241567558156946" border="0" /></a><br /><div style="text-align: justify;">como nombre ingresamos <span style="font-weight: bold;">EJBModuleWebService</span> y seleccionamos <span style="font-style: italic;">Glassfish </span>como servidor de aplicaciones.<br /><br />Una vez listo creamos una clase java a la cual llamaremos <span style="font-weight: bold;">Usuario</span> y la agregamos al package <span style="font-style: italic;">org.modelo</span> (como no existe, se creará al ingresarlo en la misma pantalla de creación de la clase). La clase Usuario tendrá el siguiente <a href="http://pastebin.com/f390da604">código</a>:<br /></div><br /><blockquote>/*<br />* To change this template, choose Tools | Templates<br />* and open the template in the editor.<br />*/<br /><br />package org.modelo;<br /><br />/**<br />*<br />* @author metalklesk<br />*/<br />public class Usuario {<br /><br />private int id;<br />private String user;<br />private String passwd;<br />private boolean activo;<br /><br />public boolean isActivo() {<br /> return activo;<br />}<br /><br />public void setActivo(boolean activo) {<br /> this.activo = activo;<br />}<br /><br />public int getId() {<br /> return id;<br />}<br /><br />public void setId(int id) {<br /> this.id = id;<br />}<br /><br />public String getPasswd() {<br /> return passwd;<br />}<br /><br />public void setPasswd(String passwd) {<br /> this.passwd = passwd;<br />}<br /><br />public String getUser() {<br /> return user;<br />}<br /><br />public void setUser(String user) {<br /> this.user = user;<br />}<br />}</blockquote><br /><div style="text-align: justify;">Ahora crearemos la clase <span style="font-weight: bold;">AccesoDatos</span> en el mismo package. Esta clase tendrá el siguiente <a href="http://pastebin.com/f360ec600">código</a>:<br /></div><br /><blockquote>/*<br />* To change this template, choose Tools | Templates<br />* and open the template in the editor.<br />*/<br /><br />package org.modelo;<br /><br />import java.io.File;<br />import java.io.FileNotFoundException;<br />import java.io.FileOutputStream;<br />import java.io.IOException;<br />import java.util.logging.Level;<br />import java.util.logging.Logger;<br />import javax.xml.parsers.DocumentBuilderFactory;<br />import javax.xml.parsers.ParserConfigurationException;<br />import javax.xml.transform.Transformer;<br />import javax.xml.transform.TransformerException;<br />import javax.xml.transform.TransformerFactory;<br />import javax.xml.transform.dom.DOMSource;<br />import javax.xml.transform.stream.StreamResult;<br />import org.w3c.dom.Document;<br />import org.w3c.dom.Element;<br />import org.w3c.dom.NodeList;<br />import org.xml.sax.SAXException;<br /><br />/**<br />*<br />* @author metalklesk<br />*/<br />public class AccesoDatos {<br /><br />private Document documento = null;<br />private String archivo = System.getProperty("user.home") + "/usuarios.xml";<br />private static AccesoDatos datos = new AccesoDatos();<br /><br />private AccesoDatos() {<br /> try {<br /> documento = (Document) (((DocumentBuilderFactory.newInstance()).newDocumentBuilder()).parse(new File(archivo)));<br /> } catch (SAXException ex) {<br /> Logger.getLogger(AccesoDatos.class.getName()).log(Level.SEVERE, null, ex);<br /> } catch (IOException ex) {<br /> Logger.getLogger(AccesoDatos.class.getName()).log(Level.SEVERE, null, ex);<br /> } catch (ParserConfigurationException ex) {<br /> Logger.getLogger(AccesoDatos.class.getName()).log(Level.SEVERE, null, ex);<br /> }<br />}<br /><br />public static AccesoDatos getInstance() {<br /> return datos;<br />}<br /><br />public Usuario getUsuario(String user, String passwd) {<br /> Element raiz = (Element) documento.getDocumentElement();<br /> NodeList hijos = raiz.getElementsByTagName("usuario");<br /> Usuario usuario = null;<br /><br /> for(int i=0; i<hijos.getLength(); i++) {<br /> Element elemento = (Element) hijos.item(i);<br /> String x = elemento.getAttribute("user");<br /> String y = elemento.getAttribute("passwd");<br /><br /> if(x.equalsIgnoreCase(user) && y.equalsIgnoreCase(passwd)) {<br /> usuario = new Usuario();<br /> usuario.setId(Integer.parseInt(elemento.getAttribute("id")));<br /> usuario.setUser(x);<br /> usuario.setPasswd(y);<br /> usuario.setActivo(Boolean.parseBoolean(elemento.getAttribute("activo")));<br /><br /> break;<br /> }<br /> }<br /><br /> return usuario;<br />}<br /><br />public boolean setUsuario(Usuario usuario) {<br /> Element raiz = (Element) documento.getDocumentElement();<br /> NodeList hijos = raiz.getElementsByTagName("usuario");<br /> boolean respuesta = false;<br /><br /> for(int i=0; i<hijos.getLength(); i++) {<br /> Element elemento = (Element) hijos.item(i);<br /> int id = Integer.parseInt(elemento.getAttribute("id"));<br /><br /> if(id == usuario.getId()) {<br /> elemento.setAttribute("id", String.valueOf(id));<br /> elemento.setAttribute("user", usuario.getUser());<br /> elemento.setAttribute("passwd", usuario.getPasswd());<br /> elemento.setAttribute("activo", String.valueOf(usuario.isActivo()));<br /><br /> respuesta = actualizarUsuarios();<br /> break;<br /> }<br /> }<br /><br /> return respuesta;<br />}<br /><br />private boolean actualizarUsuarios() {<br /> documento.getDocumentElement().normalize();<br /><br /> try {<br /> DOMSource source = new DOMSource(documento);<br /> StreamResult result = new StreamResult(new FileOutputStream(archivo));<br /><br /> TransformerFactory transFactory = TransformerFactory.newInstance();<br /> Transformer transformer = transFactory.newTransformer();<br /> transformer.transform(source, result);<br /><br /> return true;<br /> } catch (TransformerException ex) {<br /> Logger.getLogger(AccesoDatos.class.getName()).log(Level.SEVERE, null, ex);<br /> return false;<br /> } catch (FileNotFoundException ex) {<br /> Logger.getLogger(AccesoDatos.class.getName()).log(Level.SEVERE, null, ex);<br /> return false;<br /> }<br />}<br />}</blockquote><br /><div style="text-align: justify;">Una vez listo ya podemos crear el Web Service, para eso hacemos c<span style="font-style: italic;">lick derecho en el proyecto -> New -> Web service</span><br /></div><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEglK25jHBxXqROc_HRwP1tErKq676clVghTy6-eTFvcpu6hu7tMWrEYQSa3L-b6gi7CFefESDYB9sdnr9AHydPS-t6ZsfbaqOPaVGv1O96vxXpE3WfbG0mj2JXwvwRFv-L5yVgEYqLT4CZ9/s1600-h/crearWebService.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEglK25jHBxXqROc_HRwP1tErKq676clVghTy6-eTFvcpu6hu7tMWrEYQSa3L-b6gi7CFefESDYB9sdnr9AHydPS-t6ZsfbaqOPaVGv1O96vxXpE3WfbG0mj2JXwvwRFv-L5yVgEYqLT4CZ9/s320/crearWebService.png" alt="" id="BLOGGER_PHOTO_ID_5339244749075077810" border="0" /></a><br /><div style="text-align: justify;">Ingresamos como nombre <span style="font-weight: bold;">UsuarioWebService</span> y lo agregamos al package <span style="font-style: italic;">org.modelo</span>.<br /></div><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjl72gG3Aypvi7KRv2G3Vc4c2spngNG1Gw85jTunSSzOJhoVqbq7xkbQcPi5ZoBoLycbdP94YrawLs7WEv2WaCwXvrvxArUVfC0Dl13zQGXci-ukLvekfJpxEJqcFqd0KxrI4OS-pLUOjE3/s1600-h/crearWebService2.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjl72gG3Aypvi7KRv2G3Vc4c2spngNG1Gw85jTunSSzOJhoVqbq7xkbQcPi5ZoBoLycbdP94YrawLs7WEv2WaCwXvrvxArUVfC0Dl13zQGXci-ukLvekfJpxEJqcFqd0KxrI4OS-pLUOjE3/s320/crearWebService2.png" alt="" id="BLOGGER_PHOTO_ID_5339245062290963890" border="0" /></a><br /><div style="text-align: justify;">Una vez listo, ingresamos el siguiente <a href="http://pastebin.com/f4ab5652a">código</a> con los métodos a exponer en el Web Service:<br /></div><blockquote><br />/*<br />* To change this template, choose Tools | Templates<br />* and open the template in the editor.<br />*/<br /><br />package org.modelo;<br /><br />import javax.jws.WebMethod;<br />import javax.jws.WebParam;<br />import javax.jws.WebService;<br />import javax.ejb.Stateless;<br /><br />/**<br />*<br />* @author metalklesk<br />*/<br />@WebService()<br />@Stateless()<br />public class UsuarioWebService {<br /><br /> /**<br /> * Web service getUsuario<br /> * @param user<br /> * @param passwd<br /> * @return<br /> */<br /> @WebMethod(operationName = "getUsuario")<br /> public Usuario getUsuario(@WebParam(name = "user")<br /> String user, @WebParam(name = "passwd")<br /> String passwd) {<br /> AccesoDatos datos = AccesoDatos.getInstance();<br /><br /> return datos.getUsuario(user, passwd);<br /> }<br /><br /> /**<br /> * Web service getUsuario<br /> * @param usuario<br /> * @return<br /> */<br /> @WebMethod(operationName = "setUsuario")<br /> public Boolean setUsuario(@WebParam(name = "usuario")<br /> Usuario usuario) {<br /> AccesoDatos datos = AccesoDatos.getInstance();<br /><br /> return datos.setUsuario(usuario);<br /> }<br /><br />}</blockquote><br /><div style="text-align: justify;">Ya con eso estamos listos con la exposición del Web Service, ahora para probarlo podemos ejecutar la aplicación haciendo <span style="font-style: italic;">click derecho -> Run</span> y luego expandimos la carpeta <span style="font-style: italic;">Web Services</span>, damos click derecho el web service <span style="font-style: italic;">UsuarioWebService</span> y pinchamos la opción <span style="font-weight: bold;">Test Web service</span>, lo cual abrirá una ventana del navegador web predeterminado en NetBeans.<br /></div><br />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.<br /><br />Saludos !!!Daniel Dario Morales Salashttp://www.blogger.com/profile/07642586501018157497noreply@blogger.com20tag:blogger.com,1999:blog-1421033339681316542.post-22135726565239896282009-05-22T23:49:00.015-04:002009-05-23T00:53:30.938-04:00Gráficos JMaki-Dojo, Servlets y Java Beans<div style="text-align: justify;">Hace unos días estuve "<span style="font-style: italic;">jugando</span>" con Java y JMaki para crear gráficos (charts). Buscando en la red encontré el proyecto <a href="https://jmaki-charting.dev.java.net/">jmaki-charting,</a> el cual permite generar gráficos Dojo de tipo Area, Linea, Barra y Torta.<br /><br />Desgraciadamente, los ejemplos de gráficos Dojo están malos, si entran en la página de <a href="http://jmaki.com/charting/">ejemplos</a> y pinchan un enlace de gráficos Dojo verán lo siguiente:<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiuR_lnyvQ79dG5451N55DrsJNZNw7hR3YAAz_zX-VGEwfi0HyHL0Uk89BP9b6WxNFjfnvNxJYZyV0et1A3DLhfhE1asxkDYTlYl4LAbBf_z5D-phBi1m-1_yWvcgJTbfDz-dJAX7iSYwq4/s1600-h/instant%C3%A1nea7.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiuR_lnyvQ79dG5451N55DrsJNZNw7hR3YAAz_zX-VGEwfi0HyHL0Uk89BP9b6WxNFjfnvNxJYZyV0et1A3DLhfhE1asxkDYTlYl4LAbBf_z5D-phBi1m-1_yWvcgJTbfDz-dJAX7iSYwq4/s320/instant%C3%A1nea7.png" alt="" id="BLOGGER_PHOTO_ID_5338862563864091378" border="0" /></a><br />Asi es que me propuse crear un ejemplo que si funcione y de eso se trata esta entrada.<br /><br />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 "<span style="font-style: italic;">duros</span>" fácilmente se podrían modificar las clases y traer los datos de una base de datos.<br /><br />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.<br /><br />Manos a la obra. Lo primero que necesitamos es <a href="http://www.netbeans.org/downloads/index.html">NetBeans 6.5.1</a> con el <a href="http://java.sun.com/javase/downloads/?intcmp=1281">JDK 1.6 update 13</a> (con ésta versión realicé el ejemplo). Una vez instalado hay que descargar los módulos de JMaki, para eso ir a <span style="font-style: italic;">Tools -> Plugins</span> y seleccionar los dos plugines de JMaki.<br /><br />Una vez reiniciado NetBeans hay que descargar el <a href="https://jmaki-charting.dev.java.net/files/documents/6303/109080/jmaki-charting-widgets-0.9.6.zip">módulo jmaki-charting</a>, abrir NetBeans e ir a <span style="font-style: italic;">Tools -> Palette -> Add jmaki library</span> 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.<br /><br />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.<br /><br />Básicamente se tiene un menú donde puedes elegir el tipo de gráfico. Éste menú es un <span style="font-style: italic;">combobox Dojo</span>, el cual se arrastra desde la paleta al <span style="font-style: italic;">index.jsp</span>. Cuando se arrastra un combobox dojo se genera con valores por <span style="font-style: italic;">default</span>, pero eso no es muy útil, lo mejor es cargar los datos desde un <a href="http://es.wikipedia.org/wiki/JavaBean">Java Bean</a>. El java Bean utilizado es el siguiente:<br /><br /><blockquote>package org.beans;<br /><br />import org.modelo.Parametros;<br /><br />/**<br />*<br />* @author metalklesk<br />*/<br />public class BeanListaCharts {<br /><br />public String getValues() {<br /> StringBuffer buffer = new StringBuffer();<br /><br /> buffer.append("[");<br /> buffer.append("{label:'Area', value:'" + Parametros.AREA + "'},");<br /> buffer.append("{label:'Barra', value:'" + Parametros.BAR + "'},");<br /> buffer.append("{label:'Linea', value:'" + Parametros.LINE + "'},");<br /> buffer.append("{label:'Torta', value:'" + Parametros.PIE + "'}");<br /> buffer.append("]");<br /><br /> return buffer.toString();<br />}<br />}</blockquote><br />Luego hay que ingresar la siguiente línea en el jsp para hacer uso del Bean:<br /><blockquote><br /><jsp:useBean id="BeanListaCharts" class="org.beans.BeanListaCharts"/></blockquote><br />Y luego hay que pasar del siguiente código (que viene por default al arrastrar un combobox Dojo)<br /><br /><blockquote><a:widget name="dojo.combobox"<br />value="[<br /> {label : 'Alabama', value : 'AL'},<br /> {label : 'California', value : 'CA'},<br /> {label : 'New York', value : 'NY', selected : true},<br /> {label : 'Texas', value : 'TX'} <br />]" /></blockquote><br />a la siguiente forma:<br /><br /><blockquote><a:widget name="dojo.combobox" value="${BeanListaCharts.values}" publish="/miCombo" /></blockquote><br />Si se fijan, el <span style="font-style: italic;">value</span> lo rellenamos con el método <span style="font-style: italic;">getValues</span> del Java Bean. Eventualmente esos datos podrían provenir de una base de datos.<br /><br />El <a href="http://en.wikipedia.org/wiki/Publish/subscribe">publish</a> es para publicar un evento asociado al combobox. Lo que sigue es programar el evento a nuestro gusto. Esto se hace en el archivo <span style="font-style: italic;">glue.js</span> utilizando un <a href="http://en.wikipedia.org/wiki/Publish/subscribe">subscribe</a>, en ese archivo agregamos lo siguiente (al final):<br /><br /><blockquote>jmaki.subscribe("/miCombo/onSelect", function(args) {<br />/*<br />*Se debe cargar el grafico desde una pagina (o servlet) externa pero dentro del dominio<br />*e insertarla mediante el injector.<br />**/<br />var url_ = jmaki.webRoot + '/ServletGeneradorCharts?tipoChart=' + args.value;<br />var injector = new jmaki.Injector();<br />injector.inject({url:url_, injectionPoint:"chart"});<br />});</blockquote><br /><br />Aquí utilizamos un <a href="https://ajax.dev.java.net/injector.html">Injector</a> 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 <span style="font-style: italic;">Injector</span> recibe como parámetros la <span style="font-style: italic;">dirección</span> de la página a cargar y el <span style="font-style: italic;">lugar</span> de la página actual en la cual será insertada.<br /><br />En este caso llamamos a un <span style="font-style: italic;">servlet</span> al cual le pasamos como parámetro el valor recogido de la selección en el combobox.<br /><br />El método <span style="font-weight: bold;">processRequest</span> del servlet luce de la siguiente manera:<br /><br /><blockquote>protected void processRequest(HttpServletRequest request, HttpServletResponse response)<br />throws ServletException, IOException {<br /> response.setContentType("text/html;charset=UTF-8");<br /> PrintWriter out = response.getWriter();<br /><br /> String contexto = request.getContextPath();<br /><br /> String seleccion = request.getParameter("tipoChart");<br /> String chart = "No existe ese tipo de gráfico.";<br /><br /> if(seleccion.equalsIgnoreCase(Parametros.PIE)) {<br /> PieChartDojoJMaki pie = new PieChartDojoJMaki();<br /> //si no le pasamos los parámetros requeridos, se genera un pie de ejemplo<br /> //con valores predeterminados.<br /> chart = pie.getValor();<br /><br /> out.println("<script type="text/javascript" src="" + contexto + "/resources/jmaki/charting/resources/base.js"></script>");<br /> out.println("<script type="text/javascript" src="" + contexto + "/resources/jmaki/charting/resources/plotkit/excanvas.js"></script>");<br /> out.println("<script type="text/javascript" src="" + contexto + "/resources/jmaki/charting/resources/plotkit/PlotKit_Packed.js"></script>");<br /> out.println("<link rel="stylesheet" type="text/css" href="" + contexto + "/resources/jmaki/charting/resources/jmaki-charting.css" />");<br /> out.println("<script type="text/javascript" src="" + contexto + "/resources/jmaki/charting/pie/component.js"></script>");<br /> out.println("<script type="text/javascript">jmaki.addWidget({widgetDir:'" + contexto + "/resources/jmaki/charting/pie',name:'jmaki.charting.pie',value:" + chart + ",uuid:'jmaki_charting_pie'});</script>");<br /> out.println("<div id="jmaki_charting_pie" class="jmCPie">");<br /> out.println("<canvas id="jmaki_charting_pie_chart" class="jmCPie"></canvas>");<br /> out.println("</div>");<br /> out.close();<br /> } else if(seleccion.equalsIgnoreCase(Parametros.AREA)) {<br /> AreaChartDojoJMaki area = new AreaChartDojoJMaki();<br /> //si no le pasamos los parámetros requeridos, se genera un pie de ejemplo<br /> //con valores predeterminados.<br /> chart = area.getValor();<br /><br /> out.println("<script type="text/javascript" src="" + contexto + "/resources/jmaki/charting/resources/base.js"></script>");<br /> out.println("<script type="text/javascript" src="" + contexto + "/resources/jmaki/charting/resources/plotkit/excanvas.js"></script>");<br /> out.println("<script type="text/javascript" src="" + contexto + "/resources/jmaki/charting/resources/plotkit/PlotKit_Packed.js"></script>");<br /> out.println("<link rel="stylesheet" type="text/css" href="" + contexto + "/resources/jmaki/charting/resources/jmaki-charting.css" />");<br /> out.println("<script type="text/javascript" src="" + contexto + "/resources/jmaki/charting/area/component.js"></script>");<br /> out.println("<script type="text/javascript">jmaki.addWidget({widgetDir:'" + contexto + "/resources/jmaki/charting/area',name:'jmaki.charting.area',value:" + chart + ",uuid:'jmaki_charting_area2'});</script>");<br /> out.println("<div id="jmaki_charting_area2" class="jmCPie">");<br /> out.println("<canvas id="jmaki_charting_area2_chart" class="jmCPie"></canvas>");<br /> out.println("</div>");<br /> out.close();<br /> } else if(seleccion.equalsIgnoreCase(Parametros.BAR)) {<br /> BarChartDojoJMaki bar = new BarChartDojoJMaki();<br /> //si no le pasamos los parámetros requeridos, se genera un pie de ejemplo<br /> //con valores predeterminados.<br /> chart = bar.getValor();<br /><br /> out.println("<script type="text/javascript" src="" + contexto + "/resources/jmaki/charting/resources/base.js"></script>");<br /> out.println("<script type="text/javascript" src="" + contexto + "/resources/jmaki/charting/resources/plotkit/excanvas.js"></script>");<br /> out.println("<script type="text/javascript" src="" + contexto + "/resources/jmaki/charting/resources/plotkit/PlotKit_Packed.js"></script>");<br /> out.println("<link rel="stylesheet" type="text/css" href="" + contexto + "/resources/jmaki/charting/resources/jmaki-charting.css" />");<br /> out.println("<script type="text/javascript" src="" + contexto + "/resources/jmaki/charting/bar/component.js"></script>");<br /> out.println("<script type="text/javascript">jmaki.addWidget({widgetDir:'" + contexto + "/resources/jmaki/charting/bar',name:'jmaki.charting.bar',value:" + chart + ",uuid:'jmaki_charting_bar'});</script>");<br /> out.println("<div id="jmaki_charting_bar" class="jmCPie">");<br /> out.println("<canvas id="jmaki_charting_bar_chart" class="jmCPie"></canvas>");<br /> out.println("</div>");<br /> out.close();<br /> } else if(seleccion.equalsIgnoreCase(Parametros.LINE)) {<br /> LineChartDojoJMaki line = new LineChartDojoJMaki();<br /> //si no le pasamos los parámetros requeridos, se genera un pie de ejemplo<br /> //con valores predeterminados.<br /> chart = line.getValor();<br /><br /> out.println("<script type="text/javascript" src="" + contexto + "/resources/jmaki/charting/resources/base.js"></script>");<br /> out.println("<script type="text/javascript" src="" + contexto + "/resources/jmaki/charting/resources/plotkit/excanvas.js"></script>");<br /> out.println("<script type="text/javascript" src="" + contexto + "/resources/jmaki/charting/resources/plotkit/PlotKit_Packed.js"></script>");<br /> out.println("<link rel="stylesheet" type="text/css" href="" + contexto + "/resources/jmaki/charting/resources/jmaki-charting.css" />");<br /> out.println("<script type="text/javascript" src="" + contexto + "/resources/jmaki/charting/line/component.js"></script>");<br /> out.println("<script type="text/javascript">jmaki.addWidget({widgetDir:'" + contexto + "/resources/jmaki/charting/line',name:'jmaki.charting.line',value:" + chart + ",uuid:'jmaki_charting_line'});</script>");<br /> out.println("<div id="jmaki_charting_line" class="jmCPie">");<br /> out.println("<canvas id="jmaki_charting_line_chart" class="jmCPie"></canvas>");<br /> out.println("</div>");<br /> out.close();<br /> } else {<br /> //si el tipo de gráfico no corresponde, notifico al usuario.<br /> out.println("<font color="#f00">" + chart + "</font>");<br /> out.close();<br /> }<br />}</blockquote><br />El servlet recibe el parámetro seleccionado por el usuario a través del <span style="font-weight: bold;">request.getParameter</span> y dependiendo del valor construye un gráfico. Para obtener los valores del widget se hace uso de las clases<br /><br /></div><ul style="text-align: justify;"><li>AreaChartDojoJMaki</li><li>BarChartDojoJMaki</li><li>LineChartDojoJMaki</li><li>PieChartDojoJMaki</li></ul><div style="text-align: justify;">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.<br /><br />A continuación se puede ver el código de la clase que define un gráfico de area:<br /><blockquote><br />package org.modelo;<br /><br />import java.util.ArrayList;<br /><br />/**<br />*<br />* @author metalklesk<br />*/<br />public class AreaChartDojoJMaki {<br /><br />private ArrayList<String> xEtiquetas;<br />private ArrayList<String> yEtiquetas;<br />private ArrayList<String> datos;<br /><br />/**<br />* Constructor sin parámetros. Inicia valores predeterminados para construir un<br />* gráfico de ejemplo.<br />*/<br />public AreaChartDojoJMaki() {<br /> xEtiquetas = new ArrayList<String>();<br /> xEtiquetas.add("{label : 'Enero'}, ");<br /> xEtiquetas.add("{label : 'Febrero'}, ");<br /> xEtiquetas.add("{label : 'Marzo'}, ");<br /> xEtiquetas.add("{label : 'Abril'}, ");<br /> xEtiquetas.add("{label : 'Mayo'}, ");<br /> xEtiquetas.add("{label : 'Junio'}, ");<br /> xEtiquetas.add("{label : 'Julio'}, ");<br /> xEtiquetas.add("{label : 'Agosto'}, ");<br /> xEtiquetas.add("{label : 'Septiembre'}, ");<br /> xEtiquetas.add("{label : 'Octubre'}, ");<br /> xEtiquetas.add("{label : 'Noviembre'}, ");<br /> xEtiquetas.add("{label : 'Diciembre'}");<br /><br /> yEtiquetas = new ArrayList<String>();<br /> yEtiquetas.add("{ label : '0', value : 0}");<br /> yEtiquetas.add("{ label : '10s', value : 10}");<br /> yEtiquetas.add("{ label : '20s', value : 20}");<br /> yEtiquetas.add("{ label : '30s', value : 30}");<br /> yEtiquetas.add("{ label : '40s', value : 40}");<br /> yEtiquetas.add("{ label : '50s', value : 50}");<br /><br /> datos = new ArrayList<String>();<br /> datos.add("{id : 'marcador', label : 'Dataset 1', values : [25, 45, 25, 45, 50, 25, 35, 25, 25, 20, 35, 45] }");<br /> datos.add("{label : 'Dataset 2', values : [20, 40, 30, 35, 45, 20, 25, 15, 20, 25, 30, 40] }");<br /> datos.add("{label : 'Dataset 3', values : [15, 35, 15, 40, 30, 15, 20, 10, 15, 20, 30, 35] }");<br /> datos.add("{label : 'Dataset 4', values : [10, 25, 10, 5, 20, 5, 15, 5, 10, 15, 25, 30] }");<br />}<br /><br />/**<br />* Recibe los datos que construyen el gráfico. Se pueden ingresar varios conjuntos de datos (datasets) y la forma<br />* en que se ingresa cada uno es de la siguiente manera:<br />* "{label : '$titulo_dataset', values : [$valor1, $valor2, ..., $valorN]}", sin las comillas.<br />* @param datos<br />*/<br />public void setDatos(ArrayList<String> datos) {<br /> this.datos = datos;<br />}<br /><br />/**<br />* Recibe las etiquetas para la coordenada X. El formato de cada etiqueta debe ser de la siguiente forma:<br />* "{label: '$valor'},", sin las comillas.<br />* @param xEtiquetas<br />*/<br />public void setXEtiquetas(ArrayList<String> xEtiquetas) {<br /> this.xEtiquetas = xEtiquetas;<br />}<br /><br />/**<br />* Recine las etiquetas para la coordenada Y. El formato de cada etiqueta debe ser de la siguiente forma:<br />* "{label : '$titulo', value : $valor}"<br />* @param yEtiquetas<br />*/<br />public void setYEtiquetas(ArrayList<String> yEtiquetas) {<br /> this.yEtiquetas = yEtiquetas;<br />}<br /><br />/**<br />* Retorna el contenido de la etiqueta value del componente jmaki.charting.area.<br />* @return<br />*/<br />public String getValor() {<br /> StringBuffer buffer = new StringBuffer();<br /><br /> buffer.append("{");<br /> //valores de la coordenada x<br /> buffer.append("xAxis : { labels : [ ");<br /> for(int i=0; i< xEtiquetas.size(); i++) {<br /> buffer.append(xEtiquetas.get(i));<br /> }<br /> buffer.append("]},");<br /> //valores de la coordenada y<br /> buffer.append("yAxis : { labels : [");<br /> for(int i=0; i< yEtiquetas.size(); i++) {<br /> buffer.append(yEtiquetas.get(i) + ", ");<br /> }<br /> buffer.append("]},");<br /> //aqui agrego marcadores en algunos puntos.<br /> buffer.append("markers : [{ targetId : 'marcador', label : '{value}', " +<br /> "index : 5}, { targetId : 'marcador', label : '{value}', index : 6}, " +<br /> "{ targetId : 'marcador', label : '{value}', index : 8}],");<br /> //datos que construyen el grafico<br /> buffer.append("data : [ ");<br /> for(int i=0; i<datos.size(); i++) {<br /> buffer.append(datos.get(i) + ", ");<br /> }<br /> buffer.append("]");<br /><br /> buffer.append("}");<br /><br /> return buffer.toString();<br />}<br />}</blockquote><br />Como se pude ver, no es necesario utilizar objetos <a href="http://es.wikipedia.org/wiki/JSON"><span style="font-weight: bold;">JSON</span></a>, un simple <span style="font-style: italic;">String</span> con la estructura adecuada basta para generar un chart o widget JMaki en general.<br /><br />A continuación se pueden ver imágenes del ejemplo funcionando.<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjZc5lWY382VOzOQV-0IvmOTKpfxYhFkDv48hCo1mgUBt4rLZeJdXlqlCVZRydqWcs4pkrLpHuhoqtD8-blaXoemmLDbzpDw46Bdzs16YYG2gLgeMA5LnpZ4z7AjSOHnrsvBosuQNYBDWxZ/s1600-h/instant%C3%A1nea1.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjZc5lWY382VOzOQV-0IvmOTKpfxYhFkDv48hCo1mgUBt4rLZeJdXlqlCVZRydqWcs4pkrLpHuhoqtD8-blaXoemmLDbzpDw46Bdzs16YYG2gLgeMA5LnpZ4z7AjSOHnrsvBosuQNYBDWxZ/s320/instant%C3%A1nea1.png" alt="" id="BLOGGER_PHOTO_ID_5338875084456743346" border="0" /></a><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiF8nTrEnr1nTIGj25qgfk4czmzEbk9WjBw-IggUMkpBfzudFihzh-gkjLYR-ibJmTFUVbCYj27zPZKlnTGKldfzijHRRTlZJAZcnRJX8LL8CbYslF0iyjZ9tgMTUcYEwBYdeoKpybu1baR/s1600-h/instant%C3%A1nea2.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiF8nTrEnr1nTIGj25qgfk4czmzEbk9WjBw-IggUMkpBfzudFihzh-gkjLYR-ibJmTFUVbCYj27zPZKlnTGKldfzijHRRTlZJAZcnRJX8LL8CbYslF0iyjZ9tgMTUcYEwBYdeoKpybu1baR/s320/instant%C3%A1nea2.png" alt="" id="BLOGGER_PHOTO_ID_5338875096888461906" border="0" /></a><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiJGpPq_IVtBw4OMUOD9MKNUpG3WCtP_IkM_juuBzpIyE9CozcktobqtwyosQXthGPR6QLWiZLIYh-5eq6A5hVb5lkU3GFcPIwv0s8AUKC1TP_3-CkNdfwYVUo7i-bucMou-RZYYB4CZZWR/s1600-h/instant%C3%A1nea3.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiJGpPq_IVtBw4OMUOD9MKNUpG3WCtP_IkM_juuBzpIyE9CozcktobqtwyosQXthGPR6QLWiZLIYh-5eq6A5hVb5lkU3GFcPIwv0s8AUKC1TP_3-CkNdfwYVUo7i-bucMou-RZYYB4CZZWR/s320/instant%C3%A1nea3.png" alt="" id="BLOGGER_PHOTO_ID_5338875102880778306" border="0" /></a><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhtod5BYgxD-6DQJR-4Cta8DePkXhXC80v3F0FMrCvxZIpn6eezO5GLUNGV-C1gYr3ZwcHw5nEI2T20e5TmUbtYzY82qt5DPV2xAndaNvy4d27LKmpXHwGNhQYvdpFfm4hlRzPo-ekd_UP7/s1600-h/instant%C3%A1nea4.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhtod5BYgxD-6DQJR-4Cta8DePkXhXC80v3F0FMrCvxZIpn6eezO5GLUNGV-C1gYr3ZwcHw5nEI2T20e5TmUbtYzY82qt5DPV2xAndaNvy4d27LKmpXHwGNhQYvdpFfm4hlRzPo-ekd_UP7/s320/instant%C3%A1nea4.png" alt="" id="BLOGGER_PHOTO_ID_5338875105179195298" border="0" /></a><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgR8mp1UTO49B5zFueslMkZyy2lk0YKGGgRot8yAfond89hZMWG75hFfdM13OytuL6u7ObOPc-aG5Ow4lOcf4_eyrREEXEkkH7qCgbyWg51NdC5SisF1DjbRHSUgEdW3imyx5XI69ntcekN/s1600-h/instant%C3%A1nea5.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgR8mp1UTO49B5zFueslMkZyy2lk0YKGGgRot8yAfond89hZMWG75hFfdM13OytuL6u7ObOPc-aG5Ow4lOcf4_eyrREEXEkkH7qCgbyWg51NdC5SisF1DjbRHSUgEdW3imyx5XI69ntcekN/s320/instant%C3%A1nea5.png" alt="" id="BLOGGER_PHOTO_ID_5338875112822392626" border="0" /></a><br /><br />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.<br /><br />Saludos !!!<br /></div><ul style="text-align: justify;"></ul>Daniel Dario Morales Salashttp://www.blogger.com/profile/07642586501018157497noreply@blogger.com19tag:blogger.com,1999:blog-1421033339681316542.post-28824555506269420142009-05-17T17:00:00.005-04:002009-05-17T20:19:14.553-04:00Convertir datos de latin1 a utf8 en MySQL 5.1<div style="text-align: justify;">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.<br /><br />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 <span style="font-style: italic;">ConsultorÃa</span> en vez de <span style="font-style: italic;">Consultoría</span>.<br /><br />Cuando cargué la base de datos (utilizando PhpMyAdmin) me dí cuenta que las tablas quedaron con el <span style="font-style: italic;">charset latin1</span> en vez de <span style="font-style: italic;">utf8</span>. Averiguando por Internet supe que el problema está en la instalación inicial de MySQL, la cual deja todo el sistema con <span style="font-weight: bold;">latin1_swedish_ci</span> y por lo tanto al exportar la base de datos, se pierden los caracteres especiales.<br /><br />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 ?<br /><br />La receta para solucionar el problema completo es seguir los siguientes pasos (en orden):<br /><br /></div><ol style="text-align: justify;"><li>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.</li><li>Cambiar el charset del campo de latin1 a utf8.</li><li>Cambiar el charset de las tablas de latin1 a utf8.</li><li>Cambiar el charset y el collation de la base de datos de latin1 a utf8.</li></ol><div style="text-align: justify;"><br />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:<br /><br /><blockquote>update tabla set campo = convert( convert(campo using binary) using utf8);</blockquote><br /><br />Para cambiar el charset de la tabla se hace de la siguiente manera:<br /><br /><blockquote>alter table tabla charset = utf8;</blockquote><br /><br />Para cambiar el charset de la base de datos se hace de la siguiente manera:<br /><br /><blockquote>alter database basedatos charset = utf8;</blockquote><br /><br />Y con eso se soluciona el problema.<br /><br />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).<br /><br />Espero les sirva como a mi.<br /><br />Saludos !!!<br /></div>Daniel Dario Morales Salashttp://www.blogger.com/profile/07642586501018157497noreply@blogger.com14tag:blogger.com,1999:blog-1421033339681316542.post-60673354562400777572009-01-27T13:20:00.003-03:002009-01-27T13:28:09.689-03:00KDE 4.2 Final disponible para openSUSE 11.1Hoy 27 de enero sale la versión final oficial de KDE 4.2, un escritorio de lujo, y ya está disponible para los opensuseros !!!!<br /><br />Simplemente se deben agregar lo<span style="text-decoration: underline;"></span>s <a href="http://en.opensuse.org/KDE/Repositories">repositorios</a> e instalar. Si ya lo tienes instalado, entonces un <blockquote>sudo zypper up</blockquote> hará la actualización correspondiente.<br /><br />Aquí pueden ver KDE 4.2 RC 1 actualizandose por zypper:<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh18yklAdgYhakNc1XGtm0IlMoFyDdzbHekur9mXQxtoHFbmQOQIqlQ_iF5uR25M-HV1BF-obg4ryUJ6Ylb0n3bB6klSQa69kfWGZdtFzlx3OIBj3ORiM40m215Wyb4xZ9nugMKnU98ZG0Y/s1600-h/imagen1.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh18yklAdgYhakNc1XGtm0IlMoFyDdzbHekur9mXQxtoHFbmQOQIqlQ_iF5uR25M-HV1BF-obg4ryUJ6Ylb0n3bB6klSQa69kfWGZdtFzlx3OIBj3ORiM40m215Wyb4xZ9nugMKnU98ZG0Y/s320/imagen1.png" alt="" id="BLOGGER_PHOTO_ID_5296010752515105618" border="0" /></a><br /><br />y aquí pueden ver que uso Amarok 2.0.1 en KDE 4.2.0 (versión final estable):<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjLubtxxNEpgDyii-wYJImdtVcnGswcftXnz6nBliBEfZSZ5Q7oxiLa4FZ576l5AxaCNcG1w2MEdb0jQcOFMUY8PCAZlZQoC-AMwO7jG90f6KPixY7DbuAKXXJRzuiwowUJgSyqpdUyvzM7/s1600-h/imagen2.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjLubtxxNEpgDyii-wYJImdtVcnGswcftXnz6nBliBEfZSZ5Q7oxiLa4FZ576l5AxaCNcG1w2MEdb0jQcOFMUY8PCAZlZQoC-AMwO7jG90f6KPixY7DbuAKXXJRzuiwowUJgSyqpdUyvzM7/s320/imagen2.png" alt="" id="BLOGGER_PHOTO_ID_5296010782686071858" border="0" /></a><br />A disfrutar !!!<br /><br />Saludos !!!Daniel Dario Morales Salashttp://www.blogger.com/profile/07642586501018157497noreply@blogger.com4tag:blogger.com,1999:blog-1421033339681316542.post-51770982160215671962009-01-17T00:10:00.005-03:002009-01-17T00:26:13.947-03:00Cursos HTML, XHTML y PHP online<div style="text-align: justify;">Mi buen amigo Eduardo "Jam" Aguila de <a href="http://www.tecnologiaslibres.net/">Tecnologías Libres</a> está haciendo unos cursos online libres para aprender a programar páginas web en <a href="http://es.wikipedia.org/wiki/Html">HTML</a> y <a href="http://es.wikipedia.org/wiki/XHTML">XHTML</a>. Si te interesa aprender sobre estas tecnologías, visita el siguiente enlace <a href="http://www.tecnologiaslibres.net/curso-para-aprender-html-xhtml/">Curso para aprender HTML / XHTML</a>. Además te invito a complementar lo anterior aprendiendo PHP con Loreto "Loretoo" Parra, para ello visita el siguiente <a href="http://loreto.sociallinux.org/">enlace</a>.<br /><br />Si tienes dudas y quieres preguntarles directamente a ellos entonces que esperas, hazlo desde <a href="http://metalklesk.blogspot.com/2008/12/canal-softwarelibre-en-irc.html">irc</a>.<br /><br />Feliz aprendizaje !!!<br /><br />Saludos !!!<br /><br /></div>Daniel Dario Morales Salashttp://www.blogger.com/profile/07642586501018157497noreply@blogger.com2tag:blogger.com,1999:blog-1421033339681316542.post-29930958589339350112008-12-14T16:08:00.003-03:002008-12-14T16:29:41.045-03:00Opensuse 11.1 disponible para descarga<div style="text-align: justify;">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).<br /><br />Gracias a que algunos que lo bajaron subieron el <a href="http://www.bittorrent.com/">torrent</a>, ahora está disponible nuevamente para la descarga, un servicio no oficial pero que permite la descarga de la versión final oficial.<br /><br />Desde ya doy las gracias a la comunidad de <a href="http://www.forosuse.org/forosuse/showthread.php?t=19356">foro suse</a> quienes se han encargado de la búsqueda de mirrors y a todos aquellos involucrados en la provisión de los torrents e isos.<br /><br /><a href="http://www.mininova.org/tor/2087535">Opensuse 11.1 x86 (32 bits) DVD</a><br /><a href="http://www.mininova.org/tor/2086763">Opensuse 11.1 x86 (32 bits) Live CD KDE 4.1.3</a><br /><a href="http://www.mininova.org/tor/2087921">Opensuse 11.1 x86_64 (64 bits) DVD</a><br /><br />Yo ya la estoy disfrutando desde hace dos días, que esperan !!!<br /><br />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 "<span style="font-style: italic;">desmontaba</span>" 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.<br /><br />A continuación algunas screenshots del error:<br /><br />Aquí se ve el home antes de abrir el diálogo de descarga (de firefox)<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiMLWsmAU2yNH4j4EZuuhgga7MtOS_mn0f1Ph9YpXEin0Qqw-RmvOgzcExJWDdPx0droBuLqsDenFJYLL_vhj6LnJyywuPa_8S0x518htTFTFjsRpgkdYNTXxnqjwiKOISnHnUZ2_HIZ_PW/s1600-h/ok1tl6.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiMLWsmAU2yNH4j4EZuuhgga7MtOS_mn0f1Ph9YpXEin0Qqw-RmvOgzcExJWDdPx0droBuLqsDenFJYLL_vhj6LnJyywuPa_8S0x518htTFTFjsRpgkdYNTXxnqjwiKOISnHnUZ2_HIZ_PW/s320/ok1tl6.png" alt="" id="BLOGGER_PHOTO_ID_5279729214740136482" border="0" /></a><br />Aquí se ve el home después de abrir el diálogo de descarga (de firefox)<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEioS-qc3vdsP3AxmpcBlX8cWvMUjbJhqkgznny-CE8C3jG1yBlpmaCCwsgELo4Ap-RIDWgIbQXfWGQuAB6rHLyDM2BfrQFfusIw8SZ4y2uVHcqK9sT0IwqjNELarhnMgZkXIyJkNMOahGBA/s1600-h/error1fq3.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEioS-qc3vdsP3AxmpcBlX8cWvMUjbJhqkgznny-CE8C3jG1yBlpmaCCwsgELo4Ap-RIDWgIbQXfWGQuAB6rHLyDM2BfrQFfusIw8SZ4y2uVHcqK9sT0IwqjNELarhnMgZkXIyJkNMOahGBA/s320/error1fq3.png" alt="" id="BLOGGER_PHOTO_ID_5279729219811565362" border="0" /></a><br />Aquí se ve un sub directorio después de abrir el diálogo de descarga (de firefox)<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgLfuVgJlPbft68yrfy5S-O40VTF7Z_MMhdYUdnfqQejw4yyKRc7PuiEoz622Gv-yHn8va94kvEfeU2jky6-nxLiKPYAKV3D7HWXISmDxk_M1HpCPNB4zc6qfTOruXlqZMHvmWVtYpT0FS2/s1600-h/error2rb2.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgLfuVgJlPbft68yrfy5S-O40VTF7Z_MMhdYUdnfqQejw4yyKRc7PuiEoz622Gv-yHn8va94kvEfeU2jky6-nxLiKPYAKV3D7HWXISmDxk_M1HpCPNB4zc6qfTOruXlqZMHvmWVtYpT0FS2/s320/error2rb2.png" alt="" id="BLOGGER_PHOTO_ID_5279729233921928418" border="0" /></a><br />Haciendo pruebas por aquí por allá llegué a la conclusión de que el culpable es <span style="font-style: italic;">jexec</span>, entonces simplemente se desactiva ese demonio desde <span style="font-style: italic;">YaST -> Sistema -> Servicios del sistema</span>, se reinicia el equipo y ya está.<br /><br />Saludos !!!<br /></div>Daniel Dario Morales Salashttp://www.blogger.com/profile/07642586501018157497noreply@blogger.com0tag:blogger.com,1999:blog-1421033339681316542.post-63198050432146488832008-12-14T03:43:00.005-03:002008-12-14T04:03:46.163-03:00J-Kiltro 4.0 Beta 5 Liberado<div style="text-align: justify;">Hoy he liberado la versión 4.0 Beta 5 de mi software de conversión de archivos de audio multi formato <a href="https://sourceforge.net/projects/j-kiltro/">J-Kiltro</a>.<br />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.<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEipXmk0UY8qCMYslsBQMquJ-GDLkXqj3KM_tcx1aX_kIFqyLR8ELBbKiUeYWa84y-mycFNR5C0ieOqqbRv_Lol73uTvBJ30MPa9rz-ZwSYdayLNPnJrHcyDTwT0WImN00LeertADOo2yaSc/s1600-h/imagen1.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEipXmk0UY8qCMYslsBQMquJ-GDLkXqj3KM_tcx1aX_kIFqyLR8ELBbKiUeYWa84y-mycFNR5C0ieOqqbRv_Lol73uTvBJ30MPa9rz-ZwSYdayLNPnJrHcyDTwT0WImN00LeertADOo2yaSc/s320/imagen1.png" alt="" id="BLOGGER_PHOTO_ID_5279533025129177298" border="0" /></a><br />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.<br /><br />Los formatos de entrada son:<br /><blockquote>aac,aiff,ape,au,flac,m4a,m4b,mp3,mp4,mpc,ogg,ra,wav y wma</blockquote><br />y los formatos de salida son:<br /><blockquote>aac,aiff,ape,au,flac,m4a,m4b,mp3,mp4,mpc,ogg y wav</blockquote><br />Esta aplicación está desarrollada 100% en java utilizando el IDE <a href="http://www.netbeans.org/">NetBeans</a> 6.5.<br /><br />Dentro de las características de ésta versión se encuentran:<br /></div><ul style="text-align: justify;"><li>Interfaz muy simple y amigable.</li><li>Soporta 14 formatos de entrada y 12 de salida.</li><li>Extracción de pistas de audio desde CD (son selección de pistas).</li><li>Tiene previsualizador de audio con un reproductor interno (mp3, ogg, flac, wav, aiff y au).</li><li>Reproductor de audio interno.</li><li>Obtiene metadata desde archivos de audio automáticamente.</li><li>Permite editar la metadata de los archivos de audio.</li><li>Detección automática de dependencias.</li><li>Permite el ingreso de archivos de distintos formatos a la lista y automáticamente sabe como tratarlos para llevarlos al formato de destino.</li><li>Soporta distintos look and feel.</li><li>etc.</li></ul>É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:<br /><ul style="text-align: justify;"><li>Lame</li><li>Vorbis-tools</li><li>Mppdec y Mppenc</li><li>Sox</li><li>Mac<br /></li><li>Flac</li><li>Faac y Faad</li><li>Mplayer</li><li>CD Paranoia</li><li>JRE 1.6 update 10 o superior (openjdk 6 también sirve)<br /></li></ul><div style="text-align: justify;">Todas las dependencias (o la mayoría) están disponibles en los repositorios de las distribuciones Linux, por ejemplo todas están disponibles en <a href="http://www.opensuse.org/">openSUSE 11.0</a>, 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.<br /><br />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.<br /><br />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.<br /><br />Esta versión (beta 5) se diferencia de la beta 4 en varias cosas pequeñas pero importantes.<br /><br />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.<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgLbxM2MXKyF4gc8ZtBOd3DjGqyknxxRSLYDrPZi8-MClDhvDR1sV2lO0jj47d7Z5gqjkE6TULqPCCWRmzxtApi-SrW8Zmv0K_w8aIbkTNEb_FRrRxAynMEOfi38TVltXCmwXWEpHmxt3Ml/s1600-h/imagen2.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgLbxM2MXKyF4gc8ZtBOd3DjGqyknxxRSLYDrPZi8-MClDhvDR1sV2lO0jj47d7Z5gqjkE6TULqPCCWRmzxtApi-SrW8Zmv0K_w8aIbkTNEb_FRrRxAynMEOfi38TVltXCmwXWEpHmxt3Ml/s320/imagen2.png" alt="" id="BLOGGER_PHOTO_ID_5279533031652228018" border="0" /></a><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhe7HM98rpNcKzvFxQs6MImL8waMhAeLgxtNHf8582Z9ee2S1rwJyd5H496a1rUeWXK7BhOclNYQ2lpAHiZ_iNEydGmAJ1IklkxMWb7bd5YNgtVma1eYne6GywPH_jm8j3YeUocuL0Z6lsL/s1600-h/imagen3.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhe7HM98rpNcKzvFxQs6MImL8waMhAeLgxtNHf8582Z9ee2S1rwJyd5H496a1rUeWXK7BhOclNYQ2lpAHiZ_iNEydGmAJ1IklkxMWb7bd5YNgtVma1eYne6GywPH_jm8j3YeUocuL0Z6lsL/s320/imagen3.png" alt="" id="BLOGGER_PHOTO_ID_5279534966885494354" border="0" /></a><br />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.<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhJil7GxGzyoqw2oItMy5489x87nywfyXjYiPB00uT1fKvI1J6wkWvmjFE38PmP8v4ZFY38Jaoh-ErcgNIP6SzNs0UkeFJQjXHjUH1AXAyLwVvRNj49p1pIoba26Ve6ZXGjkryvGMBoB-pC/s1600-h/imagen4.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhJil7GxGzyoqw2oItMy5489x87nywfyXjYiPB00uT1fKvI1J6wkWvmjFE38PmP8v4ZFY38Jaoh-ErcgNIP6SzNs0UkeFJQjXHjUH1AXAyLwVvRNj49p1pIoba26Ve6ZXGjkryvGMBoB-pC/s320/imagen4.png" alt="" id="BLOGGER_PHOTO_ID_5279534972224613826" border="0" /></a><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiNwrHEd8toVtvfRHZ2_MtCH-kP3y1R-7iog7A0HcYH0N6NX6YZwHA7-Phiw6bqYK8M4iR6DcrhqKJefTL4rP-y2Ua_yMeZ_W6UgDEUoLHzcTb2OREf2X2puTsk0uhGHiVIgtttS_vVdHaW/s1600-h/imagen5.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiNwrHEd8toVtvfRHZ2_MtCH-kP3y1R-7iog7A0HcYH0N6NX6YZwHA7-Phiw6bqYK8M4iR6DcrhqKJefTL4rP-y2Ua_yMeZ_W6UgDEUoLHzcTb2OREf2X2puTsk0uhGHiVIgtttS_vVdHaW/s320/imagen5.png" alt="" id="BLOGGER_PHOTO_ID_5279535419127584770" border="0" /></a><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjFU9iA-wS1U2kGb5qEgxTySu1gbBNeOKjs7M0OjREOXJwFfVgjCT4UYjXy65dHsV-2Jhzc2tHLgbmS2MvRNUkFZ5CJ7JD6KP1FFblAi8wkc66b-ZV7XXYefY3RXaQP5jFyfORBSMC125B0/s1600-h/imagen6.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjFU9iA-wS1U2kGb5qEgxTySu1gbBNeOKjs7M0OjREOXJwFfVgjCT4UYjXy65dHsV-2Jhzc2tHLgbmS2MvRNUkFZ5CJ7JD6KP1FFblAi8wkc66b-ZV7XXYefY3RXaQP5jFyfORBSMC125B0/s320/imagen6.png" alt="" id="BLOGGER_PHOTO_ID_5279535418693973314" border="0" /></a><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgqVd-1GHkf2aDb8kAykcjL0XDlzWuHD0vp9wfhozlUuWL-ZWHLofNr2RcTFFFL9jZ8aydHvwXDqlfzvdu11IvYHFTaHlT4TDOgDfODhKsbHCOw10F8fT8uhBCbp3IJaO5ek5r_VMW3NbnT/s1600-h/imagen7.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgqVd-1GHkf2aDb8kAykcjL0XDlzWuHD0vp9wfhozlUuWL-ZWHLofNr2RcTFFFL9jZ8aydHvwXDqlfzvdu11IvYHFTaHlT4TDOgDfODhKsbHCOw10F8fT8uhBCbp3IJaO5ek5r_VMW3NbnT/s320/imagen7.png" alt="" id="BLOGGER_PHOTO_ID_5279535420433184002" border="0" /></a><br />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.<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjjNc-xCCXuPQ0tQeNcmorcCRx0PWUktnxvYCqF6ZIyDN3KhJaV41abMB7m9SiEZnAEqb8Ge9TYvUGA4eV7VO-Cjz1t6ntY1SgH3lfXLgSylXkkvc15S0622nUbcbirh2JQWNxPoF5CSHEV/s1600-h/imagen11.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjjNc-xCCXuPQ0tQeNcmorcCRx0PWUktnxvYCqF6ZIyDN3KhJaV41abMB7m9SiEZnAEqb8Ge9TYvUGA4eV7VO-Cjz1t6ntY1SgH3lfXLgSylXkkvc15S0622nUbcbirh2JQWNxPoF5CSHEV/s320/imagen11.png" alt="" id="BLOGGER_PHOTO_ID_5279536238956959538" border="0" /></a><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjPUNindaSg_fPNatinptfnYqc9l3sja6Q2puWNbDpSULx3WahWleef2BYA9nuWa4YSdCnjgLoL9MwAqQkbwYXeANYBPA3IEd2Tb0nBuIjQoSZF70lUxNtbpiIyf_Cw27K0duumJfFCojlQ/s1600-h/imagen12.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjPUNindaSg_fPNatinptfnYqc9l3sja6Q2puWNbDpSULx3WahWleef2BYA9nuWa4YSdCnjgLoL9MwAqQkbwYXeANYBPA3IEd2Tb0nBuIjQoSZF70lUxNtbpiIyf_Cw27K0duumJfFCojlQ/s320/imagen12.png" alt="" id="BLOGGER_PHOTO_ID_5279536240852700370" border="0" /></a><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh_DZ3kyu9ZBCqqvmcXIugCMjRI8oCZ2Xeju4R8E1atOcP00Jl_PE4jV_aXLDpGqz4otx92Gl-BNCuWQwFoxfbGZjz1qW3DqfLhpHDQuWo8hsZ_Chkg8sJidFPsyc-nhYdN1nfxc_g63k3v/s1600-h/imagen13.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh_DZ3kyu9ZBCqqvmcXIugCMjRI8oCZ2Xeju4R8E1atOcP00Jl_PE4jV_aXLDpGqz4otx92Gl-BNCuWQwFoxfbGZjz1qW3DqfLhpHDQuWo8hsZ_Chkg8sJidFPsyc-nhYdN1nfxc_g63k3v/s320/imagen13.png" alt="" id="BLOGGER_PHOTO_ID_5279536244425083810" border="0" /></a><br />A continuación dejo algunas screenshots extras para que se puedan familiarizar con la aplicación.<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiuK_G24TpjnXocPULZ4quyS5l3ROSmTbOQDVPjltGwPgJP1qSoKRQ7f26oJPcCnp8oKSbhT7YDsELJvuZ8Ooh_ZPihachHCtD_otNLxV50L4DV_IN9S0pEsDJz-3gkbRuRhP5gOyUWYdKq/s1600-h/imagen8.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiuK_G24TpjnXocPULZ4quyS5l3ROSmTbOQDVPjltGwPgJP1qSoKRQ7f26oJPcCnp8oKSbhT7YDsELJvuZ8Ooh_ZPihachHCtD_otNLxV50L4DV_IN9S0pEsDJz-3gkbRuRhP5gOyUWYdKq/s320/imagen8.png" alt="" id="BLOGGER_PHOTO_ID_5279535424837315426" border="0" /></a><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjHo6m-sIsxMuy1q5UKo6Q05Tz0U8E_DlqtZX_9Y8DJK3Vx-yv4aW0ZFcfoveKAstaQ5bJCD2IV5rTm7082uLnv_G6uJXniDzXpV3P1-R_UyUHgj0mi8BANMpKUrNsnsECFqPuMmET9kSv-/s1600-h/imagen9.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjHo6m-sIsxMuy1q5UKo6Q05Tz0U8E_DlqtZX_9Y8DJK3Vx-yv4aW0ZFcfoveKAstaQ5bJCD2IV5rTm7082uLnv_G6uJXniDzXpV3P1-R_UyUHgj0mi8BANMpKUrNsnsECFqPuMmET9kSv-/s320/imagen9.png" alt="" id="BLOGGER_PHOTO_ID_5279535429746481618" border="0" /></a><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh-9JFj41CzzRQRd8C1c442IdV1NYPzRoFflTqBtKxgMQ0ul7cSfpFCPgaT5r9KLT9ETdbYpxxdcM3BV3161pX-L_q3j6NM5vrMqXuTKVVU7glGCokKPsQafYBhXetNqmxKLUcojIiqUD8j/s1600-h/imagen10.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh-9JFj41CzzRQRd8C1c442IdV1NYPzRoFflTqBtKxgMQ0ul7cSfpFCPgaT5r9KLT9ETdbYpxxdcM3BV3161pX-L_q3j6NM5vrMqXuTKVVU7glGCokKPsQafYBhXetNqmxKLUcojIiqUD8j/s320/imagen10.png" alt="" id="BLOGGER_PHOTO_ID_5279536238106043890" border="0" /></a><br />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.<br /><br />Cualquier comentario constructivo será bienvenido.<br /><br />Saludos !!!<br /></div>Daniel Dario Morales Salashttp://www.blogger.com/profile/07642586501018157497noreply@blogger.com1tag:blogger.com,1999:blog-1421033339681316542.post-4115286617619327172008-12-08T02:16:00.003-03:002008-12-08T02:40:00.486-03:00Canal #softwarelibre en IRCHace unos días nuestro amigo Eduardo Aguila <span style="font-style: italic;">alias</span> jam de <a href="http://www.tecnologiaslibres.net/">Tecnologías Libres</a> y <a href="http://forosdesl.com/">Foros de Software Libre</a> nos avisó de la <a href="http://www.tecnologiaslibres.net/2008/12/02/tenemos-char-irc/">apertura de un canal en IRC</a> en donde podemos juntarnos quienes queremos compartir conocimiento y hacernos de amistades mas allá de las fronteras inmediatas.<br /><br />El servidor IRC es<br /><blockquote>irc.cl</blockquote><br />y el canal es<br /><blockquote>#softwarelibre</blockquote><br />NO se requiere de ninguna contraseña, solo ingresan un nombre de usuario y listo.<br /><br />Para entrar pueden usar cualquier cliente IRC como <a href="http://www.xchat.org/">XChat</a>, <a href="http://konversation.kde.org/">Konversation</a>, <a href="http://www.pidgin.im/">Pidgin</a> o <a href="http://www.mirc.com/">mIRC</a> (por nombrar algunos). Un cliente que me recomendó nuestro amigo bloguero Gonzalo Díaz Cruz <span style="font-style: italic;">alias</span> <a href="http://devgon.wordpress.com/">Sir Gon</a> es <a href="http://www.mibbit.com">mibbit</a>, 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 <a href="http://embed.mibbit.com/?server=irc.cl&channel=%23softwarelibre&forcePrompt=true&promptPass=trueyo">éste</a>.<br /><br />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.<br /><br />La invitación es abierta a todos, los esperamos !<br /><br />Saludos !!!Daniel Dario Morales Salashttp://www.blogger.com/profile/07642586501018157497noreply@blogger.com2tag:blogger.com,1999:blog-1421033339681316542.post-40431699740821195632008-11-30T23:40:00.010-03:002009-08-18T22:53:47.059-04:00Chat escalable en Java usando NetBeans 6.5<div style="text-align: justify;"><span style="font-weight: bold;font-size:180%;" >Introducción</span><br />Hace tiempo creé una pequeña aplicación para <a href="http://metalklesk.blogspot.com/2007/12/chat-en-java-usando-sockets-en-netbeans.html">chat</a>, un cliente y un servidor.<br /><br />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.<br /><br />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.<br /><br />Mirando la <a href="http://java.sun.com/j2se/1.4.2/docs/api/java/nio/package-summary.html">API de java NIO</a> (New Input Output) mas algunos <a href="http://www.javafaq.nu/java-example-code-926.html">foros</a>, <a href="http://www.sargue.net/2006/01/javanio.html">blogs</a> y <a href="http://java.sun.com/developer/technicalArticles/releases/nio/">tutoriales</a> 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.<br /><br />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.<br /><br />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.<br /><br />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.<br /><br />Buscando algo que encapsulara y subiera de nivel a NIO llegué a un proyecto open source muy muy muy bueno, se llama <a href="http://xsocket.sourceforge.net/">XSocket</a>. 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.<br /><br />Migré mi código inicial de NIO a XSocket y todo funcionó a la perfección.<br /><br /><span style="font-weight: bold;font-size:180%;" >Características</span><br />La aplicación que desarrollé soporta:<br /></div><ul style="text-align: justify;"><li>Emoticones</li><li>Color del texto cambiable</li><li>Estados</li><li>Mensaje personal</li><li>Avatares</li><li>URL's</li><li>Chat global o general</li><li>Chat privados</li><li>Pestañas</li><li>Multi usuario<br /></li></ul><div style="text-align: justify;">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.<br /><br /><span style="font-weight: bold;font-size:180%;" >Mensajes</span><br />Los mensajes que se transmiten son texto con estructura <a href="http://es.wikipedia.org/wiki/XML">XML</a>, un mensaje podría tener la siguiente estructura:<br /><blockquote><code><br /><?xml version="1.0" encoding="UTF-8" standalone="no"?><br /><br /><raiz><br /><br /><tipo></tipo><br /><br /><remitente>metalklesk</remitente><br /><br /><avatar></avatar><br /><br /><color></color><br /><br /><mensaje><br /><br /><texto>Este es un ejemplo de texto junto a un emoticon</texto><br /><br /><emoticon></emoticon><br /><br /><texto>y al lado hay un link</texto><br /><br /><url>http://metalklesk.blogspot.com</url><br /><br /><texto>que se puede pinchar para abrirlo en un navegador web.</texto><br /><br /></mensaje><br /><br /><destinatario><br /><br /><usuario></usuario><br /><br /><usuario></usuario><br /><br /><usuario></usuario><br /><br /><usuario></usuario><br /><br /></destinatario><br /><br /></raiz><br /></code></blockquote><br /><span style="font-weight: bold;font-size:180%;" >Protocolo de mensajería</span><br />El protocolo de mensajería se basa en etiquetas o tags que definen ciertas características.<br />El tag <span style="font-style: italic;">tipo</span> establece el tipo de mensaje que se transmite. Estos tipos tienen un valor <span style="font-style: italic;">entero</span> y cada valor tiene su <span style="font-style: italic;">significado particular</span>. A continuación se pueden ver los tipos y su significado:<br /><blockquote>-2: conexión aceptada desde el servidor<br />-1: conexión rechazada desde el servidor, nickname ya está en uso<br />1 : aviso/petición de conexión<br />2 : mensaje broadcast (para todos)<br />3 : cliente ha cambiado de estado<br />4 : cliente ha cambiado de avatar<br />5 : cliente ha cambiado su mensaje personal<br />6 : mensaje unicast (solo para uno)</blockquote>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.<br /><br />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.<br /><br />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.<br /><br /><span style="font-weight: bold;font-size:180%;" >Funcionamiento interno</span><br /><span style="font-weight: bold;font-size:130%;" >Formateando el mensaje</span><br />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 <span style="font-style: italic;">FiltroMensajeFormatoXML</span>, 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.<br /><br />El texto a formatear puede ser el siguiente:<br /><blockquote>Hola mundo! [emo]ohaha[/emo], visita mi blog [url]http://metalklesk.blogspot.com[/url]</blockquote>Y la salida pre formateada sería la siguiente<br /><blockquote>[texto]Hola mundo!<br />[emoticon](emoticon en texto)<br />[texto], visita mi blog<br />[url]http://metalklesk.blogspot.com</blockquote><br />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.<br />El mensaje quedaria de ésta forma:<br /><blockquote><code><br /><?xml version="1.0" encoding="UTF-8" standalone="no"?><br /><br /><raiz><br /><br /><tipo>2</tipo><br /><br /><remitente>metalklesk</remitente><br /><br /><avatar>imagen codificada en base 64</avatar><br /><br /><color>representacion del color como entero</color><br /><br /><mensaje><br /><br /><texto>Hola mundo! </texto><br /><br /><emoticon>imagen codificada en base 64</emoticon><br /><br /><texto>, visita mi blog</texto><br /><br /><url>http://metalklesk.blogspot.com</url><br /><br /></mensaje><br /><br /><destinatario><br /><br /></destinatario><br /><br /></raiz><br /></code></blockquote><br /><br />Una vez listo el mensaje está listo para ser enviado.<br /><br /><span style="font-weight: bold;font-size:130%;" >Conexión al servidor</span><br />Para conectarse al servidor del chat se crea una instancia de la clase <span style="font-style: italic;">NonBlockingConnection</span> del API XSocket. Esta clase recibe el <span style="font-weight: bold;">ip</span> o <span style="font-weight: bold;">hostname</span> del servidor, el <span style="font-weight: bold;">puerto</span> y un <span style="font-weight: bold;">manejador de la entrada de datos</span> (una instancia de la clase <span style="font-style: italic;">IDataHandler</span>).<br /><br /><span style="font-weight: bold;font-size:130%;" >Envío y recepción del mensaje</span><br />Para enviar un mensaje simplemente se utiliza la linea:<br /><blockquote>nbc.write(mensaje.getMensajeXML() + "\n", "UTF-8");</blockquote><br />y el mensaje en formato de texto XML es enviado al servidor.<br /><br />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:<br /><blockquote>String res = nbc.readStringByDelimiter("\n", "UTF-8");</blockquote><br />Luego se crea una instancia de la clase <span style="font-style: italic;">ParserMensajeXML</span> que se encarga de crear un documento XML en memoria con el texto y luego se obtiene un objeto <span style="font-style: italic;">MensajeFormatoXML</span> con el mensaje listo para ser leído utilizando los métodos GET definidos.<br /><blockquote><code><br />public boolean onData(INonBlockingConnection nbc) throws IOException, BufferUnderflowException,MaxReadSizeExceededException {<br /><br />//aqui recibo el mensaje entrante<br /><br />String res = nbc.readStringByDelimiter("\n", "UTF-8");<br /><br />//aqui parseo el mensaje<br /><br />ParserMensajeXML xml = new ParserMensajeXML(res);<br /><br />//aqui obtengo el mensaje<br /><br />MensajeFormatoXML mensaje = xml.getMensaje();<br /><br />//aqui lo envio a todos los que están a la escucha del mensaje entrante.<br /><br />RepetidorMensajeEntrante.getInstance().enviarMensaje(mensaje);<br /><br />return true;<br /><br />}<br /></code></blockquote>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.<br /><br /><span style="font-weight: bold;font-size:180%;" >Utilización</span><br />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:<br /><blockquote>java -jar ServidorNIO.jar</blockquote><br />o ejecutar en Linux<br /><blockquote>./run.sh</blockquote><br />o en Windows (se debe renombrar el archivo run.bat.txt a run.bat)<br /><blockquote>./run.bat</blockquote>No olvidar que se debe tener instalada la máquina virtual de java, recomiendo la <a href="http://java.sun.com/javase/downloads/?intcmp=1281">última versión</a> a la fecha.<br /><br /><span style="font-weight: bold;font-size:180%;" >Capturas de pantalla</span><br />Aquí dejo algunas capturas de pantalla mostrando la ejecución de la aplicación<br /><br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjMp0PoqUwIPhayZPoabjfIlzNNzxsyG4ohTRuJ5mJBuzhQji3tTvHzya_F9qmY8Q2jGwN-nH9zrlT0vE_jQ67kELgtABmsEETZWVZMa3qKk3gJ47szpX87cJ68XdhOFunr7rC15BV0mZv6/s1600-h/cliente+nio1.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjMp0PoqUwIPhayZPoabjfIlzNNzxsyG4ohTRuJ5mJBuzhQji3tTvHzya_F9qmY8Q2jGwN-nH9zrlT0vE_jQ67kELgtABmsEETZWVZMa3qKk3gJ47szpX87cJ68XdhOFunr7rC15BV0mZv6/s320/cliente+nio1.png" alt="" id="BLOGGER_PHOTO_ID_5274675918573422498" border="0" /></a><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgasAFJS7RQ-j-iCRg4zdos3pF-Rph4Arrg5rm8kDn3Zj-4f1Xb-1yodmKKO99u86Ia8gZNstgHLIzateNo0SL40HWVEhpbwnb2kJfFY17WcpJ0dZ-Md_Xmu3rJxbn0zV6efJ0_w8Lt1pNr/s1600-h/cliente+nio2.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgasAFJS7RQ-j-iCRg4zdos3pF-Rph4Arrg5rm8kDn3Zj-4f1Xb-1yodmKKO99u86Ia8gZNstgHLIzateNo0SL40HWVEhpbwnb2kJfFY17WcpJ0dZ-Md_Xmu3rJxbn0zV6efJ0_w8Lt1pNr/s320/cliente+nio2.png" alt="" id="BLOGGER_PHOTO_ID_5274675925229458082" border="0" /></a><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgI8uQgMCslKhT0iqJgd0f7yTO_xFPr5KGwcaMsN5olDRu4jX8MwJqlE5Q_t2ngq6H5eBdNiO26innc7ZpnNopTZciVw5D4mvAZrxL73T_R7L5UZlet3Z5Iyqd-IJw_FMRuM_BC-HTCfDUO/s1600-h/cliente+nio3.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgI8uQgMCslKhT0iqJgd0f7yTO_xFPr5KGwcaMsN5olDRu4jX8MwJqlE5Q_t2ngq6H5eBdNiO26innc7ZpnNopTZciVw5D4mvAZrxL73T_R7L5UZlet3Z5Iyqd-IJw_FMRuM_BC-HTCfDUO/s320/cliente+nio3.png" alt="" id="BLOGGER_PHOTO_ID_5274675933388846690" border="0" /></a><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiEeVrGbGMYsL1Opcz5u-vwCFuOjk0ScsTanEWeWxN_qmXwROAgLwLrsLNAjeWgGik-g3OeiAtkAsdi2_55eju5E7MODXB7yFxMIIm06CwVtlIkOn-TnEjotP1Z062BIU206gHAUXAtawrC/s1600-h/cliente+nio4.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiEeVrGbGMYsL1Opcz5u-vwCFuOjk0ScsTanEWeWxN_qmXwROAgLwLrsLNAjeWgGik-g3OeiAtkAsdi2_55eju5E7MODXB7yFxMIIm06CwVtlIkOn-TnEjotP1Z062BIU206gHAUXAtawrC/s320/cliente+nio4.png" alt="" id="BLOGGER_PHOTO_ID_5274675943489792738" border="0" /></a><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgzhyphenhyphenVpzW_pldTqU6i5myV41D0x2fxCYaT9uN9g74UuPoyxLfqqY0oyVpE0TUiP_xTsjaQarSSb6MeToIb40K4XyAL77f33GGFzrgkklKDtTcdg_SUar8ESUi5L2VjLR-1ZHgouddqf8GZ8/s1600-h/cliente+nio5.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgzhyphenhyphenVpzW_pldTqU6i5myV41D0x2fxCYaT9uN9g74UuPoyxLfqqY0oyVpE0TUiP_xTsjaQarSSb6MeToIb40K4XyAL77f33GGFzrgkklKDtTcdg_SUar8ESUi5L2VjLR-1ZHgouddqf8GZ8/s320/cliente+nio5.png" alt="" id="BLOGGER_PHOTO_ID_5274675946581990322" border="0" /></a><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj5Tqvlw1ZFwCFxrboLZxucRqaPlIVbUmM98un2mRQw8_5qte2SOPbZo6XfUAg6cimipQPnlw8H0dBgeRIgJFefxag6ou1wITzFWgyVx7AKKEffv-8I6t_C17OiEJK-oXGT8abTBcPu5KqV/s1600-h/cliente+nio6.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj5Tqvlw1ZFwCFxrboLZxucRqaPlIVbUmM98un2mRQw8_5qte2SOPbZo6XfUAg6cimipQPnlw8H0dBgeRIgJFefxag6ou1wITzFWgyVx7AKKEffv-8I6t_C17OiEJK-oXGT8abTBcPu5KqV/s320/cliente+nio6.png" alt="" id="BLOGGER_PHOTO_ID_5274678209659968674" border="0" /></a><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg8cNg3QoNA09vrgZAynQPTRha7VnnGApZK_DlZ8WIxJL29s8YkEJg6yxjiLfZ3AC1P0URdkG8TjbPj7_x-z7RzbMhfp8QTwzXLuKA0eqWClZ1moBkcBJlJ-pFp0pZ_svv0FiuJC52x6Qyn/s1600-h/cliente+nio7.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg8cNg3QoNA09vrgZAynQPTRha7VnnGApZK_DlZ8WIxJL29s8YkEJg6yxjiLfZ3AC1P0URdkG8TjbPj7_x-z7RzbMhfp8QTwzXLuKA0eqWClZ1moBkcBJlJ-pFp0pZ_svv0FiuJC52x6Qyn/s320/cliente+nio7.png" alt="" id="BLOGGER_PHOTO_ID_5274678220749220434" border="0" /></a><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEie0c2Z2GbSGVd7WPdtK5Zluj3O-LR3plT01Sft4z5sbS5LVN-unL2V-xZyx5JyMDT8GzKGpUuBvNrjRNYadnLM4y8TSGAhpCJkCuq7cZ_wKz7JQQc2Htotxa9QqwAeF7NLWdqw8PcqhFNv/s1600-h/cliente+nio8.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEie0c2Z2GbSGVd7WPdtK5Zluj3O-LR3plT01Sft4z5sbS5LVN-unL2V-xZyx5JyMDT8GzKGpUuBvNrjRNYadnLM4y8TSGAhpCJkCuq7cZ_wKz7JQQc2Htotxa9QqwAeF7NLWdqw8PcqhFNv/s320/cliente+nio8.png" alt="" id="BLOGGER_PHOTO_ID_5274678231570890786" border="0" /></a><br /><br /><span style="font-size:180%;">Descarga !!!</span><br />Todo el código está muy bien comentado, así es que lo pueden leer, entender, aprender y modificar.<br />Esta aplicación, cliente y servidor, está bajo la licencia GPL V3.<br />Para ver el código y modificarlo deben usar <a href="http://www.netbeans.org/">NetBeans 6.5</a>.<br /><a href="http://ifile.it/uz1km4h">Aquí está el cliente</a> y <a href="http://ifile.it/rogluis">aquí está el servidor</a>.<br /><br /><span style="font-size:130%;"><span style="font-weight: bold;">UPDATE 19-12-2008</span></span><br />He subido la versión 2.1 con los siguientes cambios:<br /><br /><ul><li>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 <span style="font-weight: bold;">config.xml</span> en la clase <span style="font-weight: bold;">Configuracion.java</span>. 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 <span style="font-style: italic;">default</span> 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.</li><li>También agregué soporte para los temas (UI, User Interface) del proyecto substance.</li><li>Actualicé XSocket a la versión 2.3.</li><li>Agregué el soporte para enviar zumbidos en los mensajes privados (la ventana tiembla !!!).</li><li>Eliminé código innecesario en el servidor y en el cliente (ahora son menos lineas de código).</li></ul><br />Aquí está el <a href="http://ifile.it/uz4bf20">cliente</a> y aquí está el <a href="http://ifile.it/fyahp8q">servidor</a>.<br /><br />Para descargar de los links anteriores se debe dar un click donde dice <span style="font-weight: bold;">Request Download Ticket</span> y luego <span style="font-weight: bold;">Download (o Descargar)</span>.<br /><br /><span style="font-size:130%;"><span style="font-weight: bold;">UPDATE 26-04-2009</span></span><br />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).<br /><br /><span style="font-size:130%;"><span style="font-weight: bold;">UPDATE 18-08-2009</span></span><br />He creado un proyecto en <a href="http://code.google.com/">Google Code</a> 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.<br />El enlace es el siguiente: <a href="http://code.google.com/p/jtricahuenio/">http://code.google.com/p/jtricahuenio/</a>.<br /><br />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:<br /><br /><ul><li>Actualicé <a href="http://xsocket.sourceforge.net/">xSocket</a> a la versión 2.5.4.</li><li>Agregué el proyecto <a href="https://base64.dev.java.net/">Base64</a> 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 <a href="http://openjdk.java.net/">OpenJDK</a>.</li><li>Actualicé <a href="https://substance.dev.java.net/">substance</a> a la versión 5.2 agregando 3 nuevos themes (Dust, Dust Coffe y Twilight).</li><li>El código fuente viene en un proyecto para <a href="http://www.netbeans.org/">NetBeans</a> 6.7.1.<br /></li></ul><br />Saludos !!!</div>Daniel Dario Morales Salashttp://www.blogger.com/profile/07642586501018157497noreply@blogger.com97tag:blogger.com,1999:blog-1421033339681316542.post-53842529858234406772008-11-26T01:56:00.010-03:002008-11-26T03:21:04.563-03:00Instalación de Openbravo 2.40 en Windows XP (SP3)<div style="text-align: justify;">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.<br /></div><div style="text-align: justify;"><br />Lo primero es lo primero, algunos se preguntarán qué es<a href="http://www.openbravo.com/"> Openbravo</a>, Openbravo es un <a href="http://www.blogger.com/es.wikipedia.org/wiki/Planificaci%C3%83%C2%B3n_de_recursos_empresariales">ERP</a> (Enterprise Resource Planning) opensource diseñado para las <a href="http://es.wikipedia.org/wiki/PYME">MIPyME</a> (micro, pequeña y mediana empresa).<br />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.<br /><br />Esta herramienta de gestión empresarial está disponible para la descarga gratuita desde el sitio <a href="http://www.openbravo.com/">web oficial de Openbravo</a> y NO se requiere el pago de licencias para su uso en ambiente personal ni comercial.<br /><br />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.<br /><br /><span style="font-size:180%;">Requerimientos:</span><br /></div><ul style="text-align: justify;"><li><a href="http://www.openbravo.com/">Openbravo 2.40</a>.</li><li><a href="http://ant.apache.org/">Apache-ant 1.7.1</a>.</li><li><a href="http://tomcat.apache.org/">Apache-tomcat 6.0.18</a>.</li><li><a href="http://java.sun.com/javase/downloads/index.jsp">JDK 1.6 update 10</a>.</li><li><a href="http://www.postgresql.com/">PostgreSQL 8.3.5</a>.</li></ul><div style="text-align: justify;">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 <span style="font-weight: bold;">8.1.4</span> en adelante.<br /><br /><span style="font-size:180%;">Instalación de dependencias:</span><br /><br /><span style="font-weight: bold;font-size:130%;" >PostgreSQL.</span><br />Para descargar PostgreSQL vamos <a href="http://www.postgresql.org/download/windows">acá</a>. Ahí verán dos opciones, la <span style="font-style: italic;">One click installer</span> y <span style="font-style: italic;">pgInstaller</span>.<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEih6m1i75L9m7NUaKbP7cA0e4ahxH8p-zheLKwxTtMtmQtckya4CkJG1QAv8DYyjortsKJkVxz6D7KJYekUNzZxO-sAssmJKluqOFCZAYR9lydebPWIWJ6cGjF6xblYxSCJkutdvCasvGEF/s1600-h/01-descargar-postgresql.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEih6m1i75L9m7NUaKbP7cA0e4ahxH8p-zheLKwxTtMtmQtckya4CkJG1QAv8DYyjortsKJkVxz6D7KJYekUNzZxO-sAssmJKluqOFCZAYR9lydebPWIWJ6cGjF6xblYxSCJkutdvCasvGEF/s320/01-descargar-postgresql.png" alt="" id="BLOGGER_PHOTO_ID_5272829382332126402" border="0" /></a><br />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).<br />Luego seleccionamos la version 8.3.5 para win32 y seleccionamos el archivo que se llama<span style="font-style: italic;"> </span><a href="http://wwwmaster.postgresql.org/download/mirrors-ftp?file=%2Fbinary%2Fv8.3.5%2Fwin32%2Fpostgresql-8.3.5-1.zip">postgresql-8.3.5-1.zip</a> y lo descargamos. Una vez descargado se descomprime, entramos a la carpeta y ejecutamos el instalador (<span style="font-style: italic;">postgresql-8.3.exe</span>).<br /><br />Aparecerá el wizard de instalación, seleccionamos el idioma (English)<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjxUR75uHVHWdFJlyK5VnTrzG8BoUKP7jorHMXKyPX3xPHsnk8r8YJO2zaHXmU5np0V6pruUVcgr8kBXxgsQFuFuGRzJjndaucGrWV5nltKzyYRypSFnYAj9eyKWWFSsFqqULEuluN6UMsW/s1600-h/02-instalar-01-postgresql.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjxUR75uHVHWdFJlyK5VnTrzG8BoUKP7jorHMXKyPX3xPHsnk8r8YJO2zaHXmU5np0V6pruUVcgr8kBXxgsQFuFuGRzJjndaucGrWV5nltKzyYRypSFnYAj9eyKWWFSsFqqULEuluN6UMsW/s320/02-instalar-01-postgresql.png" alt="" id="BLOGGER_PHOTO_ID_5272829386511578098" border="0" /></a><br />seleccionamos las opciones de instalación por default<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgpRlyX543tKRlVylQcS8yxcI2W6afsl59jXdSf9GvjIaYyiOKl3w_zyMVO8_G7i5AM4n8cXhxjkyDFbPOQ1nSAbwwyN283ROWMUwXif0-2mo9tOy_f8YtzkU5CNJ7M2TYIorlN7zkZktPW/s1600-h/02-instalar-02-postgresql.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgpRlyX543tKRlVylQcS8yxcI2W6afsl59jXdSf9GvjIaYyiOKl3w_zyMVO8_G7i5AM4n8cXhxjkyDFbPOQ1nSAbwwyN283ROWMUwXif0-2mo9tOy_f8YtzkU5CNJ7M2TYIorlN7zkZktPW/s320/02-instalar-02-postgresql.png" alt="" id="BLOGGER_PHOTO_ID_5272829388578424482" border="0" /></a><br />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)<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEinR4WG904F8CSv2yh_ZLXb4sNxgu4NHSxfbA1pjHGcrBt_sfdHqR2VDF7e_jdR9EDebiGkn_NSXvgRr3Kcrx7sxmOFCegmXtK6u14xz-aoomxecdh0h29zFKZrhDFu0nNLkSd6gQ0TxSFH/s1600-h/02-instalar-03-postgresql.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEinR4WG904F8CSv2yh_ZLXb4sNxgu4NHSxfbA1pjHGcrBt_sfdHqR2VDF7e_jdR9EDebiGkn_NSXvgRr3Kcrx7sxmOFCegmXtK6u14xz-aoomxecdh0h29zFKZrhDFu0nNLkSd6gQ0TxSFH/s320/02-instalar-03-postgresql.png" alt="" id="BLOGGER_PHOTO_ID_5272829393482905570" border="0" /></a><br />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.<br /><br /><span style="font-weight: bold;font-size:130%;" >Tomcat.</span><br />Ahora vamos a descargar la última versión de <a href="http://tomcat.apache.org/">apache tomcat</a>. Acá descargamos la versión <a href="http://apache.freeby.pctools.cl/tomcat/tomcat-6/v6.0.18/bin/apache-tomcat-6.0.18.zip">6.0.18</a>. Una vez descargado lo descomprimimos y movemos la carpeta a <span style="font-style: italic;">C:\</span>.<br /><br /><span style="font-weight: bold;font-size:130%;" >Ant.</span><br />Ahora vamos a descargar la última versión de <a href="http://ant.apache.org/">apache ant</a>. Acá descargamos la versión <a href="http://apache.freeby.pctools.cl/ant/binaries/apache-ant-1.7.1-bin.zip">1.7.1</a>. Una vez descargado lo descomprimimos y movemos a <span style="font-style: italic;">C:\</span>.<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjGfMwduNHvO-f5Szd_Yq68gmESVX26TT8ASqxYvh9Omyx9XCEyDYHWieXoNQZxjFZMveJwsesp-6_gxR3_ZIhW04IDPU6wbPsW4nSuEoR1MqBQxPdgo5p48uodZkSxp13huL19pxCKxc1K/s1600-h/03-instalar-tomcat-ant.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjGfMwduNHvO-f5Szd_Yq68gmESVX26TT8ASqxYvh9Omyx9XCEyDYHWieXoNQZxjFZMveJwsesp-6_gxR3_ZIhW04IDPU6wbPsW4nSuEoR1MqBQxPdgo5p48uodZkSxp13huL19pxCKxc1K/s320/03-instalar-tomcat-ant.png" alt="" id="BLOGGER_PHOTO_ID_5272832489342036754" border="0" /></a><br /><span style="font-weight: bold;font-size:130%;" >JDK.</span><br />Ahora vamos a descargar la última versión del <a href="http://java.sun.com/javase/downloads/?intcmp=1281">JDK</a>. Acá descargamos la versión <span style="font-style: italic;">Java SE Development Kit (JDK) 6 Update 10</span>. Una vez descargado ejecutamos e instalamos.<br /><br /><span style="font-size:180%;">Configuración del sistema:</span><br />Una vez todo instalado debemos configurar las variables de entorno. Si no las configuramos no podremos instalar Openbravo.<br /><blockquote>Mi PC -> Propiedades -> Opciones Avanzadas -> Variables de Entorno</blockquote><br />en Variables de usuario o sistema, click en Nueva:<br />Nombre de la variable: <span style="font-weight: bold;">ANT_HOME</span> Valor de variable: la dirección completa de donde se encuentra la carpeta del Ant (<span style="font-weight: bold;">C:\apache-ant-1.7.1</span>)<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjtEkSQ6X6s7uydkKlQJV2MMMWie5VPqpmQIgr6ZTU7k8W1ION4-snBTbs1QwbJziRhArvKY_2k7hEpSDeX76kcwSlit6WmOWB65So_0VIBJXHC3COh32wQPQRuOdzMbFkGfh__8wmi3sR0/s1600-h/04-configurar+variables+entorno-01.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjtEkSQ6X6s7uydkKlQJV2MMMWie5VPqpmQIgr6ZTU7k8W1ION4-snBTbs1QwbJziRhArvKY_2k7hEpSDeX76kcwSlit6WmOWB65So_0VIBJXHC3COh32wQPQRuOdzMbFkGfh__8wmi3sR0/s320/04-configurar+variables+entorno-01.png" alt="" id="BLOGGER_PHOTO_ID_5272835551685319442" border="0" /></a><br />en Variables de usuario o sistema, click en Nueva:<br />Nombre de la variable: <span style="font-weight: bold;">CATALINA_HOME</span><br />Valor de variable: la dirección completa de donde se encuentra la carpeta del tomcat (<span style="font-weight: bold;">C:\apache-tomcat-6.0.18</span>)<br /><br />en Variables de usuario o sistema, click en Nueva:<br />Nombre de la variable: <span style="font-weight: bold;">JAVA_HOME</span><br />Valor de variable: la dirección completa de donde se encuentra la carpeta del JDK (<span style="font-weight: bold;">C:\Archivos de programa\Java\jdk1.6.0_10</span>)<br /><br />en Variables de usuario o sistema, click en Nueva:<br />Nombre de la variable: <span style="font-weight: bold;">JRE_HOME</span><br />Valor de variable: la dirección completa de donde se encuentra la carpeta del JRE (<span style="font-weight: bold;">C:\Archivos de programa\Java\jdk1.6.0_10\jre</span>)<br /><br />en Variables de usuario o sistema, click en Nueva:<br />Nombre de la variable: <span style="font-weight: bold;">JDK_HOME</span><br />Valor de variable: la dirección completa de donde se encuentra la carpeta del JDK (<span style="font-weight: bold;">C:\Archivos de programa\Java\jdk1.6.0_10</span>)<br /><br />Luego debemos modificar la variable <span style="font-weight: bold;">PATH</span> e incluir al final del valor lo siguiente:<br /><span style="font-style: italic;">;%ANT_HOME%\bin;%CATALINA_HOME%\bin;%JAVA_HOME%\bin;%JRE_HOME%\bin;%JDK_HOME%\bin</span><br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhe6GPh9pTn274rQa5w1Q-CkKlU40jTYDxKvK3-kLx_CCAwrJlPh8OsbNEnlLllfj_QWDMjDl2mCMfiuSd8On17EvKQfm-aRw8Fo9mHblrCmnP9bOEaAXwG0Q1TZ04hEGRUqNuQra9esIYv/s1600-h/04-configurar+variables+entorno+-+02.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhe6GPh9pTn274rQa5w1Q-CkKlU40jTYDxKvK3-kLx_CCAwrJlPh8OsbNEnlLllfj_QWDMjDl2mCMfiuSd8On17EvKQfm-aRw8Fo9mHblrCmnP9bOEaAXwG0Q1TZ04hEGRUqNuQra9esIYv/s320/04-configurar+variables+entorno+-+02.png" alt="" id="BLOGGER_PHOTO_ID_5272835557149400514" border="0" /></a><br />Guardamos y reiniciamos.<br />Ahora las variables están correctamente configuradas y ya podemos instalar Openbravo.<br /><br /><span style="font-size:180%;">Instalación de Openbravo:</span><br /><br /><span style="font-size:130%;">Lo primero es descargarlo, para esto nos dirigimos <a href="http://www.openbravo.com/downloads/index.php?softwaresel=ERP">acá</a> y seguimos el wizard. Una vez descargado lo ejecutamos.</span><br /><br /><span style="font-size:130%;">Aceptamos la licencia, seleccionamos el directorio de instalación</span><br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi5vFlaHxLC53H-c76MIJMGShzAKloOz9bwzmdMMVdEGAlppWdsJHehn0CgDsu_jOrg4HpkfXMaTsrJaApfbcBuifJkdoldXFTV7WIdU-VWBH-Cr0WJXAcPTC7LYayUgX1uPYHeW2p33hQl/s1600-h/07-directorio-instalacion-ob.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi5vFlaHxLC53H-c76MIJMGShzAKloOz9bwzmdMMVdEGAlppWdsJHehn0CgDsu_jOrg4HpkfXMaTsrJaApfbcBuifJkdoldXFTV7WIdU-VWBH-Cr0WJXAcPTC7LYayUgX1uPYHeW2p33hQl/s320/07-directorio-instalacion-ob.png" alt="" id="BLOGGER_PHOTO_ID_5272837588564566178" border="0" /></a><br /><span style="font-size:130%;">seleccionamos el directorio de los attachments</span><br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiV_icrjeEyfpFuSQNKRoMLBtlMoRpiM1cTuDhWhBBKrMDGL6G9fDZhgSONT0FAcOub9EbKTdp21p3aD1wcTgy4j5NJKHk_WleJT376CmUCaFwfxYIYqgXPtKnmzry2cIIkZO_HBDdIwROP/s1600-h/08-directorio-instalacion-attachments-ob.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiV_icrjeEyfpFuSQNKRoMLBtlMoRpiM1cTuDhWhBBKrMDGL6G9fDZhgSONT0FAcOub9EbKTdp21p3aD1wcTgy4j5NJKHk_WleJT376CmUCaFwfxYIYqgXPtKnmzry2cIIkZO_HBDdIwROP/s320/08-directorio-instalacion-attachments-ob.png" alt="" id="BLOGGER_PHOTO_ID_5272837592168718354" border="0" /></a><br /><span style="font-size:130%;">seleccionamos la instalación completa</span><br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg1MXEiGm8LnD5ijxueqQX6dc6qDhYNXU8ZNUqW9n5q4_CU39XCp0W3VfcYroqbjAQMut_o1dDeS3pIzL8lHmgGIO3fzodpD_LZJSbchqXBgIYU2geVi-NP1qE0S_OxHFnihsHz4l_ws0or/s1600-h/09-instalacion-completa.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg1MXEiGm8LnD5ijxueqQX6dc6qDhYNXU8ZNUqW9n5q4_CU39XCp0W3VfcYroqbjAQMut_o1dDeS3pIzL8lHmgGIO3fzodpD_LZJSbchqXBgIYU2geVi-NP1qE0S_OxHFnihsHz4l_ws0or/s320/09-instalacion-completa.png" alt="" id="BLOGGER_PHOTO_ID_5272837599917104738" border="0" /></a><br /><span style="font-size:130%;">luego la instalación estándar</span><br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgsO2Mjo48eSYrIlgPM8e30Hw5_RngFstQuUfTQFnRmueeSpIcUs0NfvbLwEb1wEt4Euh2-RH5f6b_B_XnMSYbWuC5_3VIxOAvyBIPG6RjlUNZGWRrmLy1bKxD_CBR2Ci4K4J7rAuApN_YD/s1600-h/10-instalacion-estandar.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgsO2Mjo48eSYrIlgPM8e30Hw5_RngFstQuUfTQFnRmueeSpIcUs0NfvbLwEb1wEt4Euh2-RH5f6b_B_XnMSYbWuC5_3VIxOAvyBIPG6RjlUNZGWRrmLy1bKxD_CBR2Ci4K4J7rAuApN_YD/s320/10-instalacion-estandar.png" alt="" id="BLOGGER_PHOTO_ID_5272837603460313442" border="0" /></a><br /><span style="font-size:130%;">luego seleccionamos el directorio con los ejecutables de java</span><br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjLMBnn6WO6iGDTU-I0xJ50n-mMy9qMWHRsI2R9CF58az30-WOQEZb-F9JYTRDc_l3xmomksGoAOPWIjPxLeNrJZ56AILyEBQMKpKsxgBMahQD1htWo7XXf-1qzvY2FE08w95fS_M-RNYbk/s1600-h/11-jdk.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjLMBnn6WO6iGDTU-I0xJ50n-mMy9qMWHRsI2R9CF58az30-WOQEZb-F9JYTRDc_l3xmomksGoAOPWIjPxLeNrJZ56AILyEBQMKpKsxgBMahQD1htWo7XXf-1qzvY2FE08w95fS_M-RNYbk/s320/11-jdk.png" alt="" id="BLOGGER_PHOTO_ID_5272837607441307762" border="0" /></a><br /><span style="font-size:130%;">ant</span><br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhMYvtvQdqIrwxrYBb2HzvW_esqFWRXPYfNb5ImfvZZYWAorvE9TjNR53rXO8336UEKZpY2czm0iAHFnxBkNk2HmamZ_yCNq2xwoBWOUQ7ULAI4NywLQInKEOtfQnbdSIXtu3c5O7uN_aOD/s1600-h/12-ant.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhMYvtvQdqIrwxrYBb2HzvW_esqFWRXPYfNb5ImfvZZYWAorvE9TjNR53rXO8336UEKZpY2czm0iAHFnxBkNk2HmamZ_yCNq2xwoBWOUQ7ULAI4NywLQInKEOtfQnbdSIXtu3c5O7uN_aOD/s320/12-ant.png" alt="" id="BLOGGER_PHOTO_ID_5272839654964975506" border="0" /></a><br /><span style="font-size:130%;">y tomcat.</span><br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjeK5P87Mw7Nlz0Kx3Gf2pl_yG_9sAgyfQf_iY2aL9OKYjiJxFxx-BQTqcIIgsS0MR-b5DLeQGOGNv2VfZdTWfd-fm0mvBIjStDDRKEOgqt8bD9tTvq_bVo4uloXqO_xue-BIW4VDTDl8bJ/s1600-h/13-tomcat.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjeK5P87Mw7Nlz0Kx3Gf2pl_yG_9sAgyfQf_iY2aL9OKYjiJxFxx-BQTqcIIgsS0MR-b5DLeQGOGNv2VfZdTWfd-fm0mvBIjStDDRKEOgqt8bD9tTvq_bVo4uloXqO_xue-BIW4VDTDl8bJ/s320/13-tomcat.png" alt="" id="BLOGGER_PHOTO_ID_5272839662458080066" border="0" /></a><br /><span style="font-size:130%;">Como configuramos las variables aparecerán automáticamente. Luego seleccionamos la base de datos PostgreSQL</span><br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg1dQq64cpoZGftIOIR3cloWg5EpNytw88MlooQPJI80vGbQjJ6vpN94rfLsPTvZamKYllgEA9fjjm3pAVqZSd1lXY7PI4P_Cf5A8C1ZfZPiPCVKI6B2RTxnmLp6f81Q_qzrbmzPgwagDA-/s1600-h/14-postgresql.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg1dQq64cpoZGftIOIR3cloWg5EpNytw88MlooQPJI80vGbQjJ6vpN94rfLsPTvZamKYllgEA9fjjm3pAVqZSd1lXY7PI4P_Cf5A8C1ZfZPiPCVKI6B2RTxnmLp6f81Q_qzrbmzPgwagDA-/s320/14-postgresql.png" alt="" id="BLOGGER_PHOTO_ID_5272839667584710002" border="0" /></a><br /><span style="font-size:130%;">luego aparecerá automáticamente el directorio de los ejecutables de PostgreSQL (al instalarlo se configuraron las variables de entorno de PostgreSQL).</span><br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj8mHGfBDQS-QZu4VvXFwR5j4DWHuOUFc3TLRaOLcvzqQT_bfQAdnxLFrgVsc15oQMchauvuTCDrGEkEmJBPtdxImzUiQOUZn2bnaWGunarx_heIqlxPFcYIp5RS6ShtzfDg7h3Z2dFYrKO/s1600-h/15-postgresql-bin.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj8mHGfBDQS-QZu4VvXFwR5j4DWHuOUFc3TLRaOLcvzqQT_bfQAdnxLFrgVsc15oQMchauvuTCDrGEkEmJBPtdxImzUiQOUZn2bnaWGunarx_heIqlxPFcYIp5RS6ShtzfDg7h3Z2dFYrKO/s320/15-postgresql-bin.png" alt="" id="BLOGGER_PHOTO_ID_5272839673344567346" border="0" /></a><br /><span style="font-size:130%;">Luego ingresamos el host y el puerto de la base de datos</span><br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi3dLrU1kcP_QzG4C_CZgeDXsA8a-Cn54Wbs1vmwo9AjmfUWXnJVR7Kou3zyMmULOlq1kg-tceGm4vAh14OobdBCF_mGrCYcWu5p3eO7DiH6m_3-F2NQQbuDBszhCPHg4A7lJJ1r3VEc8QG/s1600-h/16-parametros-servidor-bd.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi3dLrU1kcP_QzG4C_CZgeDXsA8a-Cn54Wbs1vmwo9AjmfUWXnJVR7Kou3zyMmULOlq1kg-tceGm4vAh14OobdBCF_mGrCYcWu5p3eO7DiH6m_3-F2NQQbuDBszhCPHg4A7lJJ1r3VEc8QG/s320/16-parametros-servidor-bd.png" alt="" id="BLOGGER_PHOTO_ID_5272839685285091394" border="0" /></a><br /><span style="font-size:130%;">luego ingresamos la contraseña del usuario postgres</span><br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjWyoNZ0grmXdjyWox6ZyUfbR4G4USgiM6Er45J0YxlbUNDmr107ynlKbeG-nb7pduoStyaDnTg_dCG6nS3T6sUaN6UlW5r4zdUTLh-H1GpBGJyeUoSdGGRp6c6B7VvVNR9sCAHWgIxHKG-/s1600-h/17-contrasena-postgres.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjWyoNZ0grmXdjyWox6ZyUfbR4G4USgiM6Er45J0YxlbUNDmr107ynlKbeG-nb7pduoStyaDnTg_dCG6nS3T6sUaN6UlW5r4zdUTLh-H1GpBGJyeUoSdGGRp6c6B7VvVNR9sCAHWgIxHKG-/s320/17-contrasena-postgres.png" alt="" id="BLOGGER_PHOTO_ID_5272841161172252754" border="0" /></a><br /><span style="font-size:130%;">luego ingresamos el nombre de la base de datos, el usuario y su contraseña</span><br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEie7eAVDSmugdXKN33zmW2sGED3ekZrl3FfHPUeufTVfg-v-duQVzF7_bd-185SXejPUVy1ir8-uIY3wgVo5vCKOxdvykxkJZuhJ2gFSvbIGgubMvlieEHu5LxbL6S5oTdfG_qNcrQAX3pO/s1600-h/18-parametros-ob.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEie7eAVDSmugdXKN33zmW2sGED3ekZrl3FfHPUeufTVfg-v-duQVzF7_bd-185SXejPUVy1ir8-uIY3wgVo5vCKOxdvykxkJZuhJ2gFSvbIGgubMvlieEHu5LxbL6S5oTdfG_qNcrQAX3pO/s320/18-parametros-ob.png" alt="" id="BLOGGER_PHOTO_ID_5272841171615801682" border="0" /></a><br /><span style="font-size:130%;">Luego ingresamos el nombre del contexto de la aplicación</span><br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh6UmCeHIViHYnqnEZ5xPBDeBY0Bn2Y773vPT20nSddH73R2cDZqYtaFbev9IMKAx68jHHjTep08izQBBukx41NN26Hof_XZ4HBwucUGPyeCpZtKpvWnhTGkGnbCCy1EuHawBKsub7Bpbjf/s1600-h/19-nombre-contexto.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh6UmCeHIViHYnqnEZ5xPBDeBY0Bn2Y773vPT20nSddH73R2cDZqYtaFbev9IMKAx68jHHjTep08izQBBukx41NN26Hof_XZ4HBwucUGPyeCpZtKpvWnhTGkGnbCCy1EuHawBKsub7Bpbjf/s320/19-nombre-contexto.png" alt="" id="BLOGGER_PHOTO_ID_5272841175526230338" border="0" /></a><br /><span style="font-size:130%;">luego seleccionamos el formato de la fecha que queremos usar en el sistema</span><br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj3DzC3XDmS_U5dQq1O6UAQLoijxuPqKd3iGSmxOKOaKBPbGAnbjKessqzCEOSA2Zd0sK28nfpBNj0OFroTwspD5-4vtLz8sgUAtp0isG00cJsOXCcoBGPH4ni6uOBaytd3t01857gxEqc1/s1600-h/20-formato-fecha.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj3DzC3XDmS_U5dQq1O6UAQLoijxuPqKd3iGSmxOKOaKBPbGAnbjKessqzCEOSA2Zd0sK28nfpBNj0OFroTwspD5-4vtLz8sgUAtp0isG00cJsOXCcoBGPH4ni6uOBaytd3t01857gxEqc1/s320/20-formato-fecha.png" alt="" id="BLOGGER_PHOTO_ID_5272841183957180242" border="0" /></a><br /><span style="font-size:130%;">luego seleccionamos si queremos que se llene la base de datos con datos ficticios (la empresa Big Bazar).</span><br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgihGGr1TDtqbbjIb5YctVpyIy9_suvC0MjMD8CEoU6R8NjLBdFysN5yQA63yDPFBKdf2asQmBCzQUs4k6d6lp2DZLhgVxxrGkjd-rRR3CeTgs5P380rpz4bIMNhshybWI2PhDpDXm23avd/s1600-h/21-datos-demo.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgihGGr1TDtqbbjIb5YctVpyIy9_suvC0MjMD8CEoU6R8NjLBdFysN5yQA63yDPFBKdf2asQmBCzQUs4k6d6lp2DZLhgVxxrGkjd-rRR3CeTgs5P380rpz4bIMNhshybWI2PhDpDXm23avd/s320/21-datos-demo.png" alt="" id="BLOGGER_PHOTO_ID_5272841192986145090" border="0" /></a><br /><span style="font-size:130%;">Una vez listo comienza la instalación.</span><br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgviAjoTM9_E_0ZSVC-RUxZpVy_fNSrwFqYbIrkf55sIKfZaXvwXQ5E0YeVDiSMMdE6gvJCXLwqjDO0dxYj8y4tdZN3AFMKjHw270lax2jyUMtuEoabWbaTmGNRr-iC61PQflBLzIrm74wx/s1600-h/22-instalacion.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgviAjoTM9_E_0ZSVC-RUxZpVy_fNSrwFqYbIrkf55sIKfZaXvwXQ5E0YeVDiSMMdE6gvJCXLwqjDO0dxYj8y4tdZN3AFMKjHw270lax2jyUMtuEoabWbaTmGNRr-iC61PQflBLzIrm74wx/s320/22-instalacion.png" alt="" id="BLOGGER_PHOTO_ID_5272842438820317554" border="0" /></a><br />La instalación demora mas o menos una hora, dependiendo del equipo y sus recursos.<br />Una vez finalizado estamos listos.<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEilBxJtgjU6IaAKtozaMuCgnIvQOSanaZL7xNrRfi-d9Ze833U499nKfl-iPdF7Lm6jZ1EwGOuJkuIW4F0rniuz2RqhKi0l5Cmjur8UPPHIk4jLhFPgCdxKtEDUazSrtb1wZQhcwnEIm0w2/s1600-h/23-finalizado.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEilBxJtgjU6IaAKtozaMuCgnIvQOSanaZL7xNrRfi-d9Ze833U499nKfl-iPdF7Lm6jZ1EwGOuJkuIW4F0rniuz2RqhKi0l5Cmjur8UPPHIk4jLhFPgCdxKtEDUazSrtb1wZQhcwnEIm0w2/s320/23-finalizado.png" alt="" id="BLOGGER_PHOTO_ID_5272842442332492418" border="0" /></a><br />Ahora para iniciar openbravo debemos tener iniciado PostgreSQL y Tomcat.<br />Para iniciar postgreSQL vamos a <span style="font-style: italic;">Menú inicio -> Todos los programas -> Postgresql 8.3 -> start service</span><br />Para iniciar Tomcat vamos a <span style="font-style: italic;">C:\apache-tomcat-6.0.18\bin y ejecutamos el archivo startup.bat</span><br /><br />Luego abrimos en nuestro navegador favorito la siguiente URL: <span style="font-style: italic;">http://localhost:8080/openbravo</span><br /><br />Ingresamos el nombre de usuario <span style="font-style: italic;">Openbravo</span> y la contraseña <span style="font-style: italic;">openbravo</span><br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgBEUAwT3f_XDWqetoj_WxFBYXcsPitKajF5ii-u-N51my8E-2t8L4ZRelXj5-_x1-wCqbmOr4-6jpm37pl9lgoxGT7iPa_jcIjx7Pc-blLeoGVqR5p18z_i__Fggla3kWlbCyxT2MxZWDN/s1600-h/24-login.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgBEUAwT3f_XDWqetoj_WxFBYXcsPitKajF5ii-u-N51my8E-2t8L4ZRelXj5-_x1-wCqbmOr4-6jpm37pl9lgoxGT7iPa_jcIjx7Pc-blLeoGVqR5p18z_i__Fggla3kWlbCyxT2MxZWDN/s320/24-login.png" alt="" id="BLOGGER_PHOTO_ID_5272847153290041314" border="0" /></a><br />y ya estamos dentro del sistema.<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh8_OonSvjcb1JwdCQDeUM-9V9DkxWVEQDsWNaMurT2XNUz67IFpttBlwSK3pMkrVgwuaNNyJZdm1fILAKsz6vPIwBw0pit1CDKeULRFhR0roo_XzF3ov12MeBp7mTonrgRBxcAAskeoEPs/s1600-h/25-entrada.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh8_OonSvjcb1JwdCQDeUM-9V9DkxWVEQDsWNaMurT2XNUz67IFpttBlwSK3pMkrVgwuaNNyJZdm1fILAKsz6vPIwBw0pit1CDKeULRFhR0roo_XzF3ov12MeBp7mTonrgRBxcAAskeoEPs/s320/25-entrada.png" alt="" id="BLOGGER_PHOTO_ID_5272847157524622370" border="0" /></a><br />No hay nada mejor que tener tu propio ERP.<br /><br />Espero les haya servido esta humilde guía de instalción.<br /><br />saludos !!!<br /></div>Daniel Dario Morales Salashttp://www.blogger.com/profile/07642586501018157497noreply@blogger.com63tag:blogger.com,1999:blog-1421033339681316542.post-66526384013593250532008-11-19T01:34:00.006-03:002008-11-19T02:22:02.675-03:00No Cache, No Store, Internet Explorer en problemas !!!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).<br /><br />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.<br /><br />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:<br /><blockquote>Internet Explorer cannot download index.jsp from localhost<br />Internet Explorer was not able to open this Internet site. The requested site is either unavailable or cannot be found.<br />Please try again later.</blockquote>Aquí una imagen mostrando la pantalla de error en Windows XP SP3:<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjzYGHtYUMF2dxB0ZfhgpKIzDM78ubVn-cp0N0md-vmxV1WbrihVa73SV-fc7PehfVLiKzM2EPAgElhWXAOK6wAT5xR0hnFRqhWhINFkAcvLHoG34-enGgnBGqHdvpiplyotoYNeA5etVVE/s1600-h/ie-sucks.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjzYGHtYUMF2dxB0ZfhgpKIzDM78ubVn-cp0N0md-vmxV1WbrihVa73SV-fc7PehfVLiKzM2EPAgElhWXAOK6wAT5xR0hnFRqhWhINFkAcvLHoG34-enGgnBGqHdvpiplyotoYNeA5etVVE/s320/ie-sucks.png" alt="" id="BLOGGER_PHOTO_ID_5270232382396225810" border="0" /></a><br />Esto me ha traido dolores de cabeza por bastante tiempo, busqué y busqué en Internet sin respuestas satisfactorias. De pronto llegué a una <a href="http://support.microsoft.com/kb/812935">página de Microsoft</a> 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).<br /><br />Entre las causas del error sale el uso de las cabeceras <span style="font-style: italic;">"no-cache"</span> y <span style="font-style: italic;">"no-store"</span>. 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.<br /><br />Lo mas ridículo de todo lo que sale en esa página de Microsoft es el <span style="font-style: italic;">WORKAROUND</span>:<br /><blockquote>To work around this problem, make sure that <strong class="uiterm">Do Not Save Encrypted Files</strong> check box is not checked and that the server does not send the "Cache-Control: No Store" or the "Cache-Control: No Cache" header.</blockquote><br />Y en español dice:<br /><blockquote>Para solucionar este problema, asegúrese que la opción <span style="font-weight: bold;">No Guardar Archivos Encriptados</span> no esté marcada y que el servidor no envíe la cabecera "Cache-Control: No Store" o la "Cache-Control: No Cache".</blockquote>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 ??<br /><br />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 <html>):<br /><blockquote>response.setHeader("Cache-Control","no-cache");<br />response.setHeader("Cache-Control","no-store");<br />response.setHeader("Cache-Control","must-revalidate");<br />response.setHeader("Pragma","no-cache");<br />response.setDateHeader ("Expires", 0);</blockquote>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í:<br /><blockquote><jsp:directive.include file="../WEB-INF/jspf/NoCache.jspf"></blockquote><br />Ya con eso el problema está solucionado, ahora el sistema funciona en Firefox e Internet Explorer.<br /><br />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.<br /><br />Ya saben, si les ocurre este problema ya tienen una solución.<br /><br />saludos !!!Daniel Dario Morales Salashttp://www.blogger.com/profile/07642586501018157497noreply@blogger.com2tag:blogger.com,1999:blog-1421033339681316542.post-1449101678660304462008-10-30T01:54:00.009-03:002008-10-30T15:55:22.671-03:00Agregar regiones de los países en Openbravo 2.40<div style="text-align: justify;">Ayer en la tarde visité el <a href="https://sourceforge.net/forum/?group_id=162271">foro</a> de Openbravo y me dirigí a <a href="https://sourceforge.net/forum/forum.php?forum_id=744878">Openbravo Chile</a>. Me fijé en un post que decía que al crear una nueva entidad, seleccionar Chile, en el combobox <span style="font-style: italic;">Regiones</span> 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.<br /><br />Esta situación por supuesto es crítica, las regiones de nuestros países deberían estar en el sistema.<br />Mirando los archivos XML de traducción (el mismo que yo traduje) encontré que en el archivo <span style="font-style: italic;">C_COUNTRY_TRL_es_CL(ES, AR, etc)</span> 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 <span style="font-style: italic;">152</span>.<br /><br />Luego de buscar regiones en los XML me di cuenta que no existe ninguna, entonces fui a ver la base de datos utilizando <span style="font-style: italic;">phpPgAdmin</span> y mirando las tablas encontré una que se llama <span style="font-style: italic;">c_region</span> y ahí encontré las regiones ingresadas en el sistema (EEUU, España, otros).<br /><br />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.<br /><br />Entonces ahora les voy a dar la receta mas simple para agregar las regiones de su país en Openbravo.<br /><br /><span style="font-weight: bold;font-size:130%;" >Requisitos</span><br /><ul><li><a href="http://metalklesk.blogspot.com/2008/10/instalacin-de-openbravo-240-en-opensuse.html">Openbravo instalado y funcionando</a>.</li><li><a href="http://metalklesk.blogspot.com/2008/10/traduccin-de-openbravo-240-al-espaol-en.html">Traducción al idioma que les corresponda según su país</a>.</li><li>Instalar phpPgAdmin</li></ul>Para instalar phpPgAdmin simplemente abrimos <span style="font-style: italic;">YaST -> Software -> Instalar/Desinstalar software</span> y en el buscador ingresamos <span style="font-style: italic;">"phpPgAdmin"</span> (sin las comillas), le damos click al botón <span style="font-style: italic;">buscar</span>, seleccionamos el paquete y presionamos finalizar. Automáticamente se seleccionaran las dependencias necesarias.<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEghtZXSBsglM9xIojcP0UytuPjOywROKfDD5UcbhRyemR-FPF7QPbD_Jo134xtOMBv6tiuhLvvoaFYuPHRtSFDoWy-nIMU1G2RCs00v0kVio4IJtQo8_OaJ-jJx8vN2ycJWgZJMpbP4IK0D/s1600-h/imagen1.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEghtZXSBsglM9xIojcP0UytuPjOywROKfDD5UcbhRyemR-FPF7QPbD_Jo134xtOMBv6tiuhLvvoaFYuPHRtSFDoWy-nIMU1G2RCs00v0kVio4IJtQo8_OaJ-jJx8vN2ycJWgZJMpbP4IK0D/s320/imagen1.png" alt="" id="BLOGGER_PHOTO_ID_5262811327051776226" border="0" /></a><br />Una vez listo debemos iniciar la base de datos, para esto simplemente ejecutamos en consola el siguiente comando:<br /><blockquote>service postgresql start</blockquote><br />y luego levantamos el servidor web Apache con el siguiente comando:<br /><blockquote>service apache2 start</blockquote><br />Ahora abrimos un navegador web y escribimos la siguiente dirección:<br /><blockquote>http://localhost/phpPgAdmin</blockquote><br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEghyphenhyphenO7C8GmXJXdhGAHCKvuwxZoD8mcJ1UAokqEUOY3quJjMyS4nyrr64kIZz3qhcasa_Exn2ExpSjtBcVLRmOXMrDZxwpblXgD4mTBXRL-hAN4ZNHsrivZQcWpOdRC1kBo0Angw8mrG2nuD/s1600-h/imagen2.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEghyphenhyphenO7C8GmXJXdhGAHCKvuwxZoD8mcJ1UAokqEUOY3quJjMyS4nyrr64kIZz3qhcasa_Exn2ExpSjtBcVLRmOXMrDZxwpblXgD4mTBXRL-hAN4ZNHsrivZQcWpOdRC1kBo0Angw8mrG2nuD/s320/imagen2.png" alt="" id="BLOGGER_PHOTO_ID_5262813488849448034" border="0" /></a><br />Ingresamos el nombre de usuario y contraseña de administrador de PostgreSQL:<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg2jlPJx_-GS8oUqUZRaVv-kh35FxEbrgxm5FUALctvPGBPDnbXzWwd5pKw7qhC50x2yd0LaBT4qWcPnwGaPUmMkiT_iMBHoE3ZiFk3C5CDbz2T6VX0wXhQArwKsniZQzIZ-XEPv5aH_ahA/s1600-h/imagen3.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg2jlPJx_-GS8oUqUZRaVv-kh35FxEbrgxm5FUALctvPGBPDnbXzWwd5pKw7qhC50x2yd0LaBT4qWcPnwGaPUmMkiT_iMBHoE3ZiFk3C5CDbz2T6VX0wXhQArwKsniZQzIZ-XEPv5aH_ahA/s320/imagen3.png" alt="" id="BLOGGER_PHOTO_ID_5262813491586801378" border="0" /></a><br />Veremos la base de datos Openbravo:<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEggZn0k5wsavv3afpuVK1AwVdl3aCrvQg7pAc6j2tEz6I7755CaeVfZfWSBbO54NhCVP-BQyCnSajzBSyZIIQLCGEFXYoKrf4g-gTGuN9zFup895FVHm_iWY4wZ2ZoKSjtF2KUyNtR4-TZm/s1600-h/imagen4.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEggZn0k5wsavv3afpuVK1AwVdl3aCrvQg7pAc6j2tEz6I7755CaeVfZfWSBbO54NhCVP-BQyCnSajzBSyZIIQLCGEFXYoKrf4g-gTGuN9zFup895FVHm_iWY4wZ2ZoKSjtF2KUyNtR4-TZm/s320/imagen4.png" alt="" id="BLOGGER_PHOTO_ID_5262813495603217474" border="0" /></a><br />Pinchamos la base de datos en el arbol de la izquierda -> Esquemas -> Tablas y buscamos <span style="font-style: italic;">c_region</span><br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj2tBNJyBpILi5Q0k0jbDuJoeXmTLVvt27DZuIRfEZ71zno92EVwAWkirOQvV_0cof-QZFNoILzxY9t6u_sBpdOeeyFc8W8AU5cDN4xE4z9r3hlI1esDreOIuOhO2FbP9EG88Ykoa4r6Wvw/s1600-h/imagen5.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj2tBNJyBpILi5Q0k0jbDuJoeXmTLVvt27DZuIRfEZ71zno92EVwAWkirOQvV_0cof-QZFNoILzxY9t6u_sBpdOeeyFc8W8AU5cDN4xE4z9r3hlI1esDreOIuOhO2FbP9EG88Ykoa4r6Wvw/s320/imagen5.png" alt="" id="BLOGGER_PHOTO_ID_5262813508617502114" border="0" /></a><br />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:<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhdKlMhyphenhyphen_bO1NQIZXnPy8PBqaqEi_ctAZEbiBcPVxnnXlWTQ8wZQli_QOSB-0477cYJ__Zyqo4UrwwASHKktcQtLCQ05T1K_LJulV7Y8owwtiBa31ycKIvi2e7CXOQJ7Tzzw2T9nENFUSqP/s1600-h/imagen6.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhdKlMhyphenhyphen_bO1NQIZXnPy8PBqaqEi_ctAZEbiBcPVxnnXlWTQ8wZQli_QOSB-0477cYJ__Zyqo4UrwwASHKktcQtLCQ05T1K_LJulV7Y8owwtiBa31ycKIvi2e7CXOQJ7Tzzw2T9nENFUSqP/s320/imagen6.png" alt="" id="BLOGGER_PHOTO_ID_5262813509762059042" border="0" /></a><br />Pinchamos <span style="font-style: italic;">Insertar fila</span> 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 <span style="font-weight: bold;">397</span> en adelante. Luego debemos ingresar el valor <span style="font-weight: bold;">0</span> en los siguientes campos:<br /></div><ul style="text-align: justify;"><li>ad_client_id</li><li>ad_org_id</li><li>createdby</li><li>updatedby</li></ul><div style="text-align: justify;">Luego en el campo <span style="font-weight: bold;">name</span> ingresamos el nombre de la región (es el que se verá al seleccionar una región desde Openbravo), en el campo <span style="font-weight: bold;">description</span> ingresamos la descripción, en el campo <span style="font-weight: bold;">c_country_id</span> ingresamos el id del país en cuestión (<span style="font-weight: bold;">152</span> en el caso de Chile), luego marcamos como <span style="font-weight: bold;">nulo</span> los siguientes dos campos:<br /></div><ul style="text-align: justify;"><li>c_nation_id</li><li>value</li></ul><div style="text-align: justify;">Ahora pinchamos <span style="font-style: italic;">Insertar y repite</span>, con eso se insertará la fila y luego podremos insertar otra mas.<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg_Q2Kt60XZvvFLwMjRTUIPILF3_qZmFU1mb09scVbMsrQ2Ftmv5Fq46an2kjeaTAvMxPdRIW9KjkXang7DyVfdq5clZfvx_hk_WiJl2jV89qVPnN0uodeRcle-9P7wY7r4NttBEiYDT-om/s1600-h/imagen7.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg_Q2Kt60XZvvFLwMjRTUIPILF3_qZmFU1mb09scVbMsrQ2Ftmv5Fq46an2kjeaTAvMxPdRIW9KjkXang7DyVfdq5clZfvx_hk_WiJl2jV89qVPnN0uodeRcle-9P7wY7r4NttBEiYDT-om/s320/imagen7.png" alt="" id="BLOGGER_PHOTO_ID_5262816089978409362" border="0" /></a><br />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.<br /><br />Para quienes son de Chile, o quieren agregar las regiones de Chile, pueden hacer un <span style="font-style: italic;">copy paste</span> de los siguientes comandos SQL directamente en phpPgAdmin (basta haber seleccionado la base de datos, no necesariamente la tabla <span style="font-style: italic;">c_region</span>) presionando el botón SQL que aparece en la parte superior de la pantalla:<br /><br /><blockquote>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);<br />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);<br />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);<br />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);<br />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);<br />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);<br />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);<br />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);<br />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);<br />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);<br />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);<br />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);<br />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);<br />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);<br />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);</blockquote><br />O si quieren pueden importar <a href="http://ifile.it/73fk12i">éste script sql</a>.<br /><br />Espero les sea de utilidad.<br /><br />Saludos !!!</div>Daniel Dario Morales Salashttp://www.blogger.com/profile/07642586501018157497noreply@blogger.com3tag:blogger.com,1999:blog-1421033339681316542.post-80801275846621758972008-10-29T01:01:00.012-03:002008-10-29T02:24:34.307-03:00Traducción de Openbravo 2.40 al español en OpenSUSE 11.0<div style="text-align: justify;"><div style="text-align: justify;">Hace unos días comencé la traducción de <a href="http://www.openbravo.org/">Openbravo</a> al español de Chile, mi país.<br />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.<br /></div><br />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).<br /><br />La lista de palabras traducidas es la siguiente:<br /><blockquote><span style="font-weight: bold;">Albarán</span> -> <span style="font-weight: bold;">Guía de despacho</span><br /><span style="font-weight: bold;">albarán</span> -> <span style="font-weight: bold;">guía de despacho</span><br /><span style="font-weight: bold;">Albaranes</span> -> <span style="font-weight: bold;">Guías de despacho</span><br /><span style="font-weight: bold;">albaranes</span> -> <span style="font-weight: bold;">guías de despacho</span><br /><span style="font-weight: bold;">Almacén</span> -> <span style="font-weight: bold;">Bodega</span><br /><span style="font-weight: bold;">almacén</span> -> <span style="font-weight: bold;">bodega</span><br /><span style="font-weight: bold;">Almacenes</span> -> <span style="font-weight: bold;">Bodegas</span><br /><span style="font-weight: bold;">almacenes</span> -> <span style="font-weight: bold;">bodegas</span><br /><span style="font-weight: bold;">Solapa</span> -> <span style="font-weight: bold;">Pestaña</span><br /><span style="font-weight: bold;">solapa</span> -> <span style="font-weight: bold;">pestaña</span><br /><span style="font-weight: bold;">Solapas</span> -> <span style="font-weight: bold;">Pestañas</span><br /><span style="font-weight: bold;">solapas</span> -> <span style="font-weight: bold;">pestañas</span><br /><span style="font-weight: bold;">CIF</span> -> <span style="font-weight: bold;">RUT</span><br /><span style="font-weight: bold;">NIF</span> -> <span style="font-weight: bold;">RUT</span><br /><span style="font-weight: bold;">CIF/NIF</span> -> <span style="font-weight: bold;">RUT</span></blockquote>Tuve que tener especial cuidado en los singulares y plurales, así como el femenino y masculino, por ejemplo:<br /><blockquote>Los albaranes -> Las guías de despacho<br />El almacén -> La bodega<br />los albaranes -> las guías de despacho<br />etc.</blockquote><br />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. <a href="http://ifile.it/t6l2mq5">Acá</a> pueden descargar la traducción al español de Chile (es_CL) y <a href="https://sourceforge.net/project/showfiles.php?group_id=162271&package_id=254938">acá</a> pueden descargar la versión de España (es_ES) y Argentina (es_AR).<br /><br />Ahora comenzaré con la explicación de los pasos para traducir Openbravo al idioma Español.<br /><br /><span style="font-weight: bold;font-size:130%;" >Requisitos:</span><br /></div><ul style="text-align: justify;"><li><a href="http://metalklesk.blogspot.com/2008/10/instalacin-de-openbravo-240-en-opensuse.html">Openbravo instalado y funcionando</a></li></ul><div style="text-align: justify;">Lo primero que debemos hacer es levantar Postgresql, para eso simplemente ejecutamos el siguiente comando en una consola como usuario root:<br /><blockquote>service postgresql start</blockquote>Luego iniciamos Apache Tomcat desde la misma consola:<br /><blockquote>$CATALINA_HOME/bin/startup.sh</blockquote>Luego abrimos nuestro navegador web y escribimos la dirección:<br /><blockquote>http://localhost:8080/openbravo</blockquote>lo cual nos llevará al sistema de ingreso, escribimos el nombre de usuario <span style="font-style: italic;">Openbravo</span> y la contraseña <span style="font-style: italic;">openbravo</span> y ya entramos al sistema.<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjgySVDozb_ETnWdVAuvz090d8Qn9ntVMgH_GLepV4puMoyvsX-lmfslXkM1kjTvB7qMYgiZdSUYmJVKnoMmfUvNBrMXMXBXZ3G4yH2wOXBhGVLW5vUKcK5dDSp9Hb_wC1xSamSHnQIa5-a/s1600-h/imagen1.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjgySVDozb_ETnWdVAuvz090d8Qn9ntVMgH_GLepV4puMoyvsX-lmfslXkM1kjTvB7qMYgiZdSUYmJVKnoMmfUvNBrMXMXBXZ3G4yH2wOXBhGVLW5vUKcK5dDSp9Hb_wC1xSamSHnQIa5-a/s320/imagen1.png" alt="" id="BLOGGER_PHOTO_ID_5262427708827892114" border="0" /></a><br />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 <span style="font-style: italic;">System Administrator</span> y como entidad a <span style="font-style: italic;">System</span>, teniendo eso listo pinchamos <span style="font-style: italic;">ok</span>.<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi0JUAIIYG6l-zfOCilqgXoeA3gZ11M3-0dRusGsEZ31z7c6QHRThx59h5PoDeNxwE_rh9y3Cni-xSeb4HhiAvfeGCbISuDUdy_Bg0wwHPaccZKU6rXsq-s1OwmfiHztM3emVAKqsR8WDX0/s1600-h/imagen2.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi0JUAIIYG6l-zfOCilqgXoeA3gZ11M3-0dRusGsEZ31z7c6QHRThx59h5PoDeNxwE_rh9y3Cni-xSeb4HhiAvfeGCbISuDUdy_Bg0wwHPaccZKU6rXsq-s1OwmfiHztM3emVAKqsR8WDX0/s320/imagen2.png" alt="" id="BLOGGER_PHOTO_ID_5262427712549583746" border="0" /></a><br />Luego fijamos la mirada nuevamente en el menú y pinchamos <span style="font-style: italic;">General Setup -> Application -> Language</span><br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhEi1hX97Wi4fMuAJDLf7-QVMhVDaBNtFArTehOZe1WOQg9IhDUR65DenSlF_jMRwMYlEbxQh6-VMxh4daANWS1DIwUYvHq4ABxhDf13dUvdCo7v2haofoWIdAdyELFW2AI9smrweFJSrHg/s1600-h/imagen3.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhEi1hX97Wi4fMuAJDLf7-QVMhVDaBNtFArTehOZe1WOQg9IhDUR65DenSlF_jMRwMYlEbxQh6-VMxh4daANWS1DIwUYvHq4ABxhDf13dUvdCo7v2haofoWIdAdyELFW2AI9smrweFJSrHg/s320/imagen3.png" alt="" id="BLOGGER_PHOTO_ID_5262427716564840706" border="0" /></a><br />y pinchamos la lupa que aparece arribita (ver imagen anterior). Se abrirá una ventana para ingresar un filtro, ahi ingresamos <span style="font-style: italic;">Spanish%</span> y presionamos <span style="font-style: italic;">ok</span>.<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhiQVplEEQUpcQiUrFjSmXlmr7f8dGagU00buvQAxHNqKt5EW_fDl-5ll7rHCfmplTpxJc7XtrCHKIHNZP59MYAiiGsuw2ioHvX7SRcUBoXK0PEYvdiOH2w37pCtKdzNGr38Ho60hyphenhyphenrp2aD/s1600-h/imagen4.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhiQVplEEQUpcQiUrFjSmXlmr7f8dGagU00buvQAxHNqKt5EW_fDl-5ll7rHCfmplTpxJc7XtrCHKIHNZP59MYAiiGsuw2ioHvX7SRcUBoXK0PEYvdiOH2w37pCtKdzNGr38Ho60hyphenhyphenrp2aD/s320/imagen4.png" alt="" id="BLOGGER_PHOTO_ID_5262427720232978530" border="0" /></a><br />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.<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhqu2pzcz9EJYWFQr2XRo0D6wnkznzUxOZPYrEb3aTAEO515KxDDSP6D62o5W3LVDmWeHRUz366PSVyY2zvylMQ2zLTaA7bFO2t5dt1YVXejqqz8pEyHtMEWqm1OaWH2bkyb9PiMK6pgK-R/s1600-h/imagen5.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhqu2pzcz9EJYWFQr2XRo0D6wnkznzUxOZPYrEb3aTAEO515KxDDSP6D62o5W3LVDmWeHRUz366PSVyY2zvylMQ2zLTaA7bFO2t5dt1YVXejqqz8pEyHtMEWqm1OaWH2bkyb9PiMK6pgK-R/s320/imagen5.png" alt="" id="BLOGGER_PHOTO_ID_5262427725007190898" border="0" /></a><br />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 <span style="font-style: italic;">System language</span> y fijamos la mirada en el icono de un disquete cuyo tip es <span style="font-style: italic;">"Save Record"</span> y lo pinchamos.<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhnv06A-QD6t5w02hBRU9NvhWWLEH_I3gmGQgQdoDKRMfb129V6ypCY2CM1ZQcn1qpW6ptvhNLwaM4p6UBZTwNyPYPIU6RzYs611moQb6KkrTtYV8nsi-OnuZ0E3Q6yjjmbZy0tiamWca_Z/s1600-h/imagen7.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhnv06A-QD6t5w02hBRU9NvhWWLEH_I3gmGQgQdoDKRMfb129V6ypCY2CM1ZQcn1qpW6ptvhNLwaM4p6UBZTwNyPYPIU6RzYs611moQb6KkrTtYV8nsi-OnuZ0E3Q6yjjmbZy0tiamWca_Z/s320/imagen7.png" alt="" id="BLOGGER_PHOTO_ID_5262431456487524354" border="0" /></a><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiTfZnUe-JYdcomKWMfvIdjTbC2Wh5uVdVtcW94KxPR0MWFxYx2vgePKf9EbSxJF5Eh-Zdjj4nRJNocEzLpTU3mReCk9cmn5ZxasJVKsXF0Sp-4I9uchXkbKXfAh-5kapDO6IHvm3talKPS/s1600-h/imagen8.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiTfZnUe-JYdcomKWMfvIdjTbC2Wh5uVdVtcW94KxPR0MWFxYx2vgePKf9EbSxJF5Eh-Zdjj4nRJNocEzLpTU3mReCk9cmn5ZxasJVKsXF0Sp-4I9uchXkbKXfAh-5kapDO6IHvm3talKPS/s320/imagen8.png" alt="" id="BLOGGER_PHOTO_ID_5262431471105602898" border="0" /></a><br />Luego pinchamos el botón <span style="font-style: italic;">Verify Languages</span><br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg1lTHiyiOr-O180V3sdBRCWaizc6OIuO63MlNk1lUBcegsVCewlsaXV56eumHSKvgtd4MKPct01eecZq9unE6a19-ihlaEC_TwFcCZC8y1mcxSPKgx0KsZQHJSmfJcSCQdjJlqLQoqjVKh/s1600-h/imagen9.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg1lTHiyiOr-O180V3sdBRCWaizc6OIuO63MlNk1lUBcegsVCewlsaXV56eumHSKvgtd4MKPct01eecZq9unE6a19-ihlaEC_TwFcCZC8y1mcxSPKgx0KsZQHJSmfJcSCQdjJlqLQoqjVKh/s320/imagen9.png" alt="" id="BLOGGER_PHOTO_ID_5262431469296242242" border="0" /></a><br />y presionamos ok<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiHQbtO1bjp9VpvG-cXy08xD0G-dwP7P_NYa-ixo9u3pQWwBqIY-ceM_MbZlyjb5tgH4OoKcVuik34mUnuNU_Dcba-e7bLejGXFabpnM9KemkX9BIGs2psaP08oSyRTfadHf-l9c0ywHc6N/s1600-h/imagen10.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiHQbtO1bjp9VpvG-cXy08xD0G-dwP7P_NYa-ixo9u3pQWwBqIY-ceM_MbZlyjb5tgH4OoKcVuik34mUnuNU_Dcba-e7bLejGXFabpnM9KemkX9BIGs2psaP08oSyRTfadHf-l9c0ywHc6N/s320/imagen10.png" alt="" id="BLOGGER_PHOTO_ID_5262431480097383938" border="0" /></a><br />esperamos un par de segundos y debemos ver lo siguiente:<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi0bf9zvNOc3nVQvaIh8YIoGNHdDFaBu5tWeASOwmrWvsYueg0F2qcxUp9of-WYodt82gmThQ6RHrtGpy_ZAa8EoLWqHL0RJn2jFTHN55rWwNDoQnpIClBPf4eHIQCwJ-IAD9zaN-BW72z2/s1600-h/imagen11.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi0bf9zvNOc3nVQvaIh8YIoGNHdDFaBu5tWeASOwmrWvsYueg0F2qcxUp9of-WYodt82gmThQ6RHrtGpy_ZAa8EoLWqHL0RJn2jFTHN55rWwNDoQnpIClBPf4eHIQCwJ-IAD9zaN-BW72z2/s320/imagen11.png" alt="" id="BLOGGER_PHOTO_ID_5262431479533886482" border="0" /></a><br />Si no aparece lo anterior entonces debemos volver a presionar el botón <span style="font-style: italic;">Verify Languages.</span><br />Para comprobar que lo anterior fue realizado correctamente, recomiendo comprobar la salida del siguiente comando SQL en la base de datos:<br /><blockquote>select * from ad_workflow_trl where ad_language = 'es_CL';</blockquote><br />El comando anterior lo puedes realizar desde consola o utilizando algún cliente de administración como phpPgAdmin como se ve a continuación:<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhjPR3lv6qS1ilLZCh6VBlEw5kHgbceeETv0xOkTGV8NSIjLuFkplqdNJuFQdpb_R0c5Zn0LJjH27ACHGVK_D1WwiZ7Rq7I436PAX2030FQGTueGUeUXsoR-DyGkVdQ2C0SC2KbwAgclbew/s1600-h/imagen12.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhjPR3lv6qS1ilLZCh6VBlEw5kHgbceeETv0xOkTGV8NSIjLuFkplqdNJuFQdpb_R0c5Zn0LJjH27ACHGVK_D1WwiZ7Rq7I436PAX2030FQGTueGUeUXsoR-DyGkVdQ2C0SC2KbwAgclbew/s320/imagen12.png" alt="" id="BLOGGER_PHOTO_ID_5262433252504725058" border="0" /></a><br />y la salida debe ser la siguiente:<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhXx5oleUQSn9uF1cVf7mAVLT21V-yFn-AlN97QfVMr02vF-4eaXNahK5w6oRIa1yH6ZJ_UXuOSEmSdmm0uiCcBwwRznSPtBIof1Hh9588KDZsVnmsm2iXdZG6lDfujmFAA6jxHbFGKyvGX/s1600-h/imagen13.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhXx5oleUQSn9uF1cVf7mAVLT21V-yFn-AlN97QfVMr02vF-4eaXNahK5w6oRIa1yH6ZJ_UXuOSEmSdmm0uiCcBwwRznSPtBIof1Hh9588KDZsVnmsm2iXdZG6lDfujmFAA6jxHbFGKyvGX/s320/imagen13.png" alt="" id="BLOGGER_PHOTO_ID_5262433254348809794" border="0" /></a><br />Luego debemos crear la carpeta <span style="font-style: italic;">es_CL</span> en <span style="font-style: italic;">/opt/OpenbravoERP/AppsOpenbravo/attachments/lang</span> como se ve a continuación:<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgfF9Ttuz-UN53IqQOYreFvovXu3PJsTTas9BXzlMusBy_L_7kcDdidaMiCxNEelbJikCPlmof3GNWS-bp7-ijxH40h-CRzxP2blE-ZSIFjS45QgqeeSakGY8YJqPCpOqh2pZtDEfCh_QAU/s1600-h/imagen14.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgfF9Ttuz-UN53IqQOYreFvovXu3PJsTTas9BXzlMusBy_L_7kcDdidaMiCxNEelbJikCPlmof3GNWS-bp7-ijxH40h-CRzxP2blE-ZSIFjS45QgqeeSakGY8YJqPCpOqh2pZtDEfCh_QAU/s320/imagen14.png" alt="" id="BLOGGER_PHOTO_ID_5262433257282667826" border="0" /></a><br />luego debemos copiar los <a href="http://ifile.it/t6l2mq5">27 archivos XML de la traducción a español Chile</a> a esa carpeta y debe quedar la estructura de archivos así:<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj7KHCE5yu8V5zuFZ5GOPDcJntDBMkhxMXlJ9v_wPJTyH5cPVdjr3BeyQFyrQDhdD2TBmGREJKWWwmaUw8Ap1oyUWvXAaBtHfe_XcVe9EtjaPiVDWVZ_0VxceXg7S2XtZgaDQmo081ALtla/s1600-h/imagen15.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj7KHCE5yu8V5zuFZ5GOPDcJntDBMkhxMXlJ9v_wPJTyH5cPVdjr3BeyQFyrQDhdD2TBmGREJKWWwmaUw8Ap1oyUWvXAaBtHfe_XcVe9EtjaPiVDWVZ_0VxceXg7S2XtZgaDQmo081ALtla/s320/imagen15.png" alt="" id="BLOGGER_PHOTO_ID_5262433258487077474" border="0" /></a><br />Una vez copiados vamos al navegador web y seleccionamos en el menú <span style="font-style: italic;">General Setup -> Application -> Import/Export Translations</span>, seleccionamos la entidad <span style="font-style: italic;">System</span> y el idioma <span style="font-style: italic;">Spanish (Chile)</span>, luego presionamos import, como se ve a continuación:<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjCV7XAJmTitBJ3zIZGH0KPPhDnluHlAuVhYINhgudaw5nfcp05dzqvPI3tZehuK7f6OX-3DOAuAXhEs4ioe3bY_zQZSUL1ZYU4PSmPLsGjEA52k4sRZvVhAXHW4mRECB1HYuFOblw3iM6u/s1600-h/imagen16.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjCV7XAJmTitBJ3zIZGH0KPPhDnluHlAuVhYINhgudaw5nfcp05dzqvPI3tZehuK7f6OX-3DOAuAXhEs4ioe3bY_zQZSUL1ZYU4PSmPLsGjEA52k4sRZvVhAXHW4mRECB1HYuFOblw3iM6u/s320/imagen16.png" alt="" id="BLOGGER_PHOTO_ID_5262433261035289074" border="0" /></a><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh3CSVxUJBPknt-HX1at3LxJzQqeY21G0bUfrXnEf_OyfTScBfbCfe7Eq_TrMXUeiMYKzvw1Yb8Yd-yPVS_QoNqITQ80VnSiGi9QCeFyUyaVn0RYFXHBdiDCv_-jGORfCzrdg5N143ZFN4l/s1600-h/imagen17.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh3CSVxUJBPknt-HX1at3LxJzQqeY21G0bUfrXnEf_OyfTScBfbCfe7Eq_TrMXUeiMYKzvw1Yb8Yd-yPVS_QoNqITQ80VnSiGi9QCeFyUyaVn0RYFXHBdiDCv_-jGORfCzrdg5N143ZFN4l/s320/imagen17.png" alt="" id="BLOGGER_PHOTO_ID_5262435451390208258" border="0" /></a><br />Para estar seguros de que todo se ha realizado correctamente ejecutamos el siguiente comando SQL (es el mismo comando SQL ejecutado anteriormente):<br /><blockquote>select * from ad_workflow_trl where ad_language = 'es_CL'</blockquote><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhHOkiodMNj_oZq0FRMzPc2F35MRvtAT8rZLsLJnXIPt5EzqZbc7wIL3TNYiHqAmom55OAF8HuVP_XHQj0TE-Cfpq20NedLVDmmdClix0PyGAloVmMkh2Pi-aMbReztNKmzMJlDqEz4y-B-/s1600-h/imagen18.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhHOkiodMNj_oZq0FRMzPc2F35MRvtAT8rZLsLJnXIPt5EzqZbc7wIL3TNYiHqAmom55OAF8HuVP_XHQj0TE-Cfpq20NedLVDmmdClix0PyGAloVmMkh2Pi-aMbReztNKmzMJlDqEz4y-B-/s320/imagen18.png" alt="" id="BLOGGER_PHOTO_ID_5262435455204893842" border="0" /></a><br />y ahora veremos que se han traducido los registros en la base de datos al español:<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg5pMDpsLmuUkVeMd65sqYx10lcfGmtD_zFYiA_Iy4T8zOOt89OQuk_xlFf2XvSgNuNnQJy9G0Pdsadra2fvKXJBNKl_IcRqq00Ah2uRFwrCH3SNtzsp__c925C1gZtaCcn1B8QAnajOmJK/s1600-h/imagen19.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg5pMDpsLmuUkVeMd65sqYx10lcfGmtD_zFYiA_Iy4T8zOOt89OQuk_xlFf2XvSgNuNnQJy9G0Pdsadra2fvKXJBNKl_IcRqq00Ah2uRFwrCH3SNtzsp__c925C1gZtaCcn1B8QAnajOmJK/s320/imagen19.png" alt="" id="BLOGGER_PHOTO_ID_5262435458876831154" border="0" /></a><br />Ahora cerramos el navegador y bajamos el servicio tomcat con el siguiente comando:<br /><blockquote>$CATALINA_HOME/bin/shutdown.sh</blockquote><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhuR2WPy_NygdqSH0z8JlCQ1X8LYeH8KvHHs3wv-xD2ay_1TRXj_aPMFx5JPAJAKiOcVpsv2-mkdaaDyr2NZveKN_DXehN3bIrGE-U0zYiQ03Mn1j_rkhA4B9L2NOgpRUy7y0YxfaQFm1gY/s1600-h/imagen20.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhuR2WPy_NygdqSH0z8JlCQ1X8LYeH8KvHHs3wv-xD2ay_1TRXj_aPMFx5JPAJAKiOcVpsv2-mkdaaDyr2NZveKN_DXehN3bIrGE-U0zYiQ03Mn1j_rkhA4B9L2NOgpRUy7y0YxfaQFm1gY/s320/imagen20.png" alt="" id="BLOGGER_PHOTO_ID_5262435464785401970" border="0" /></a><br />Luego nos movemos a la carpeta /opt/OpenbravoERP/AppsOpenbravo, abrimos una consola y ejecutamos:<br /><blockquote>ant compile.complete<br /><br /></blockquote><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEijA8lmIV8SUkIre-8oHp_pVnaKtp8bImNp4MC28975GGQR_9edmgJOE9Sw1BWj2m5ctoLcy69uIonGYgBNKlPzJ6701hon7WaEda55CLCXiYKq51RDQQ8n1p3T912KyXiP8-Dqz_Oq4mlJ/s1600-h/imagen21.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEijA8lmIV8SUkIre-8oHp_pVnaKtp8bImNp4MC28975GGQR_9edmgJOE9Sw1BWj2m5ctoLcy69uIonGYgBNKlPzJ6701hon7WaEda55CLCXiYKq51RDQQ8n1p3T912KyXiP8-Dqz_Oq4mlJ/s320/imagen21.png" alt="" id="BLOGGER_PHOTO_ID_5262435468052823314" border="0" /></a><br />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:<br /><blockquote>ant war<br /><br /></blockquote><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi7eOBLpS7o2J0qCJsxFihXLZbaGbVFrX43AqhcQX5V2cVxXw0OETM508YzjHMz9Gtz25hJgJ1g_Au3bjPdC99-ZkykW07E1GLj9QHxzE0Qe2NENfPSSC9xLRYI1hsRuiuyDucPniu8x4DY/s1600-h/imagen22.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi7eOBLpS7o2J0qCJsxFihXLZbaGbVFrX43AqhcQX5V2cVxXw0OETM508YzjHMz9Gtz25hJgJ1g_Au3bjPdC99-ZkykW07E1GLj9QHxzE0Qe2NENfPSSC9xLRYI1hsRuiuyDucPniu8x4DY/s320/imagen22.png" alt="" id="BLOGGER_PHOTO_ID_5262437669761563986" border="0" /></a><br />y luego:<br /><blockquote>ant deploy<br /><br /></blockquote><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjxCj8zmm0IbW5o00UdNVXfTplyAwCLusn6CA3GVFjEroFJkpIDjqbNpn4EyhiM-aV64eQSyLyPVtT44Q_NgwswqVM0PUGOiC_pQ3fOUNFjqV7rD2wnORzpOYxApABz5_cm0KSabbu0Cptt/s1600-h/imagen23.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjxCj8zmm0IbW5o00UdNVXfTplyAwCLusn6CA3GVFjEroFJkpIDjqbNpn4EyhiM-aV64eQSyLyPVtT44Q_NgwswqVM0PUGOiC_pQ3fOUNFjqV7rD2wnORzpOYxApABz5_cm0KSabbu0Cptt/s320/imagen23.png" alt="" id="BLOGGER_PHOTO_ID_5262437673947270258" border="0" /></a><br />Al final debemos ver 3 BUILD SUCCESSFUL:<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjCIpCOhtVH2WH22ECJ2qVt1GRxkr54DMIvYwPpruSXIf1yM8OD1VLIz1ANB8i8rblvSRHtZPfDFrThrIA5yXRWKr0ZjtFUGbgpsO70eDzBbwcXhdQ1pVwSFylUiDubHTq_6t3MY0C7Xj1b/s1600-h/imagen23.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjCIpCOhtVH2WH22ECJ2qVt1GRxkr54DMIvYwPpruSXIf1yM8OD1VLIz1ANB8i8rblvSRHtZPfDFrThrIA5yXRWKr0ZjtFUGbgpsO70eDzBbwcXhdQ1pVwSFylUiDubHTq_6t3MY0C7Xj1b/s320/imagen23.png" alt="" id="BLOGGER_PHOTO_ID_5262437681300433746" border="0" /></a><br />Una vez listo debemos borrar la siguiente carpeta: <span style="font-style: italic;">/opt/apache-tomcat-6.0.18/webapps/openbravo</span><br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiNj0o02_OzhgjKJq0YHpbyxSjTU2CPY-CRMeDOFC-VAnOtwC2Slueu33VnGJi5yJ9gRMVAIpzkUBlhUE_Ugt7oFI6bpYo303G3qE1jhvNQ7PzvNUvaZLkP8BNRoc56R8wmzsADmiLJ_Vqn/s1600-h/imagen25.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiNj0o02_OzhgjKJq0YHpbyxSjTU2CPY-CRMeDOFC-VAnOtwC2Slueu33VnGJi5yJ9gRMVAIpzkUBlhUE_Ugt7oFI6bpYo303G3qE1jhvNQ7PzvNUvaZLkP8BNRoc56R8wmzsADmiLJ_Vqn/s320/imagen25.png" alt="" id="BLOGGER_PHOTO_ID_5262437684168104674" border="0" /></a><br />Si no borramos esa carpeta después nos va a aparecer un <span style="font-size:130%;"><span style="font-weight: bold;">error 500</span></span> en Openbravo.<br />Una vez listo iniciamos openbravo:<br /><blockquote>$CATALINA_HOME/bin/startup.sh</blockquote><br />Ingresamos al sistema con el usuario <span style="font-style: italic;">Openbravo</span> y contraseña <span style="font-style: italic;">openbravo</span> y pinchamos donde dice <span style="font-style: italic;">Openbravo</span> sobre el menú al lado del icono de la persona.<br /><br />Ahora seleccionamos el rol <span style="font-style: italic;">System Administrator</span>, la entidad <span style="font-style: italic;">System</span> el idioma <span style="font-style: italic;">Spanish (Chile)</span>, marcamos la opción <span style="font-style: italic;">"Set as default"</span> y presionamos <span style="font-style: italic;">ok</span>:<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjCJAAF0MPXH98hBtiOxu-YSKx4QkQP9gSFwxZ_LSOwMo9JebBzKp-gvGfqfJ90x0_j6E_7IcbMIrKhp-ie1dY7ZNvwelCoPeoOWt3TpvlTdvPSTcz2vyQ-ewYiSVmXbrssF7bDbv7jLfhV/s1600-h/imagen26.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjCJAAF0MPXH98hBtiOxu-YSKx4QkQP9gSFwxZ_LSOwMo9JebBzKp-gvGfqfJ90x0_j6E_7IcbMIrKhp-ie1dY7ZNvwelCoPeoOWt3TpvlTdvPSTcz2vyQ-ewYiSVmXbrssF7bDbv7jLfhV/s320/imagen26.png" alt="" id="BLOGGER_PHOTO_ID_5262437684060257074" border="0" /></a><br />Apenas presionamos ok, Openbravo se traduce automáticamente al español de Chile como podemos ver a continuación:<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgM3_odt8-_l8jGsx1sxozZH7iytaxfrPojDYWtoa4KBguwjQSruK0d99k1GeyX_FqiZRl1Vy6QGeEwJYZlJrTcF_ez1BOc8c6jjYyRyVJ2RTxuxmRxjXz6xfOropv4-8jMvVrnvhMAOcjq/s1600-h/imagen27.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgM3_odt8-_l8jGsx1sxozZH7iytaxfrPojDYWtoa4KBguwjQSruK0d99k1GeyX_FqiZRl1Vy6QGeEwJYZlJrTcF_ez1BOc8c6jjYyRyVJ2RTxuxmRxjXz6xfOropv4-8jMvVrnvhMAOcjq/s320/imagen27.png" alt="" id="BLOGGER_PHOTO_ID_5262439710683113298" border="0" /></a><br />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.<br /><br />Espero les sea de utilidad.<br /><br />Saludos !!!<br /></div>Daniel Dario Morales Salashttp://www.blogger.com/profile/07642586501018157497noreply@blogger.com46tag:blogger.com,1999:blog-1421033339681316542.post-74674004498571542542008-10-25T00:32:00.008-03:002008-10-25T00:54:50.015-03:00J-Kiltro 4.0 Beta 3 Liberado<div style="text-align: justify;">Hoy he liberado la versión 4.0 Beta 3 de mi software de conversión de archivos de audio multi formato <a href="https://sourceforge.net/projects/j-kiltro/">J-Kiltro</a>.<br />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.<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh4o204dObJHDjisVWGu5sZfRYK4fb_dEPwDfaZhCVBk68nzTCL1UE-81pYZypJ512XcSAsjtCgGH94zYY7IK6dIpDpZa8smpidLVl6AFrh3I51u-CC9rbR5DMnRELiRyH2R74cLmV7klTn/s1600-h/imagen1.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh4o204dObJHDjisVWGu5sZfRYK4fb_dEPwDfaZhCVBk68nzTCL1UE-81pYZypJ512XcSAsjtCgGH94zYY7IK6dIpDpZa8smpidLVl6AFrh3I51u-CC9rbR5DMnRELiRyH2R74cLmV7klTn/s320/imagen1.png" alt="" id="BLOGGER_PHOTO_ID_5260931718220465106" border="0" /></a><br /><br />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.<br /><br />Los formatos de entrada son:<br /><blockquote>aac,aiff,ape,au,flac,m4a,m4b,mp3,mp4,mpc,ogg,ra,wav y wma</blockquote>y los formatos de salida son:<br /><blockquote>aac,aiff,ape,au,flac,m4a,m4b,mp3,mp4,mpc,ogg y wav</blockquote>Esta aplicación está desarrollada 100% en java utilizando el IDE <a href="http://www.netbeans.org/">NetBeans</a> 6.5.<br /><br />Dentro de las características de ésta versión se encuentran:<br /></div><ul style="text-align: justify;"><li>Interfaz muy simple y amigable.</li><li>Soporta 14 formatos de entrada y 12 de salida.</li><li>Extracción de pistas de audio desde CD (son selección de pistas).<br /></li><li>Tiene previsualizador de audio con un reproductor interno (mp3, ogg, flac, wav, aiff y au).</li><li>Reproductor de audio interno.<br /></li><li>Obtiene metadata desde archivos de audio automáticamente.</li><li>Permite editar la metadata de los archivos de audio.</li><li>Detección automática de dependencias.<br /></li><li>Permite el ingreso de archivos de distintos formatos a la lista y automáticamente sabe como tratarlos para llevarlos al formato de destino.</li><li>Soporta distintos look and feel.</li><li>etc.</li></ul><div style="text-align: justify;">É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:<br /></div><ul style="text-align: justify;"><li>Lame</li><li>Vorbis-tools</li><li>Mppdec y Mppenc</li><li>Sox</li><li>Mac<br /></li><li>Flac</li><li>Faac y Faad</li><li>Mplayer</li><li>CD Paranoia</li><li>JRE 1.6 update 10<br /></li></ul><div style="text-align: justify;">Todas las dependencias (o la mayoría) están disponibles en los repositorios de las distribuciones Linux, por ejemplo todas están disponibles en <a href="http://www.opensuse.org/">openSUSE 11.0</a>, 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.<br /><br />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.<br /><br />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.<br /><br />Esta versión (beta 3) se diferencia de la beta 2 en varias cosas pequeñas pero importantes.<br /><br />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.<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhUUBQqMLBd_yJAmqYX8Y9Pzy0csaS47nDhZYzYM2igug9vRqqnual91P5S2iIpGhhOnYr3GjVK0S_vGlhT6TB5-XXZxd0xlgSvfgpgnnG0M1eoSmGvA5R8ruYRtz-4JNrB6OWi5DcX9hoP/s1600-h/imagen2.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhUUBQqMLBd_yJAmqYX8Y9Pzy0csaS47nDhZYzYM2igug9vRqqnual91P5S2iIpGhhOnYr3GjVK0S_vGlhT6TB5-XXZxd0xlgSvfgpgnnG0M1eoSmGvA5R8ruYRtz-4JNrB6OWi5DcX9hoP/s320/imagen2.png" alt="" id="BLOGGER_PHOTO_ID_5260931732242099378" border="0" /></a><br /><br />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.<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi6-3anRW8JP8uy8K8HsKYSTmj58WOWnDBmJ2NRCFOZnHxDpF-ODWRGaIVGiiiuBE95En4lFvL5Wr5zp0kiULoXaJhHP86XFa63tAurP1NUZ_S9HIpsvnm2GF0LCzcbw1x7v93S6MRl_6L2/s1600-h/imagen3.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi6-3anRW8JP8uy8K8HsKYSTmj58WOWnDBmJ2NRCFOZnHxDpF-ODWRGaIVGiiiuBE95En4lFvL5Wr5zp0kiULoXaJhHP86XFa63tAurP1NUZ_S9HIpsvnm2GF0LCzcbw1x7v93S6MRl_6L2/s320/imagen3.png" alt="" id="BLOGGER_PHOTO_ID_5260931736549591490" border="0" /></a><br />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).<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi8zEd5xR0WyF0YaSqhPrZk-EiTjgx1QFrXjdHJQCUC6BNZ-FMEQDPF13cAbTPRZkde5j75hCjTQrJTFjV-VwchIlrbW-szw5Ggtv8VI4zpikmILC0Ayq7iqJYxvUQvzDZPLVJAs7PYhoVL/s1600-h/imagen4.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi8zEd5xR0WyF0YaSqhPrZk-EiTjgx1QFrXjdHJQCUC6BNZ-FMEQDPF13cAbTPRZkde5j75hCjTQrJTFjV-VwchIlrbW-szw5Ggtv8VI4zpikmILC0Ayq7iqJYxvUQvzDZPLVJAs7PYhoVL/s320/imagen4.png" alt="" id="BLOGGER_PHOTO_ID_5260931742685036866" border="0" /></a><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiwq3-EC6_L-FyHb0bxwEeZy4QyYAYu4SmF3WgVwv3-rK5qmpY716BqyYHuY3O2zr1RC3W-o74HZQ5FK2PA84yR7E_ZDJ6AgUU9OZQ52xLXxcVPJ_kIX9TPIvRKHZKu_ihUWZ4PAG7I0Zfr/s1600-h/imagen5.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiwq3-EC6_L-FyHb0bxwEeZy4QyYAYu4SmF3WgVwv3-rK5qmpY716BqyYHuY3O2zr1RC3W-o74HZQ5FK2PA84yR7E_ZDJ6AgUU9OZQ52xLXxcVPJ_kIX9TPIvRKHZKu_ihUWZ4PAG7I0Zfr/s320/imagen5.png" alt="" id="BLOGGER_PHOTO_ID_5260931746781179170" border="0" /></a><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgPAWbsCAu_cmlWPt212YvEthJuMXxOCNsapiNzDNVMIs7-WxpSNdvhwqHzhYEo5B5MbjgBIXzwD4rUwM0D0IhLRa5sOfFW1cPSwa0Jpj4u5T4E6KNeSf9s0v9v7d3NItDnn4-Qr0IpLx-v/s1600-h/imagen6.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgPAWbsCAu_cmlWPt212YvEthJuMXxOCNsapiNzDNVMIs7-WxpSNdvhwqHzhYEo5B5MbjgBIXzwD4rUwM0D0IhLRa5sOfFW1cPSwa0Jpj4u5T4E6KNeSf9s0v9v7d3NItDnn4-Qr0IpLx-v/s320/imagen6.png" alt="" id="BLOGGER_PHOTO_ID_5260933474766909762" border="0" /></a><br /><br />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).<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhM8tpJyYUP-O_aX_wws6LHSOYxEsgelgKZWz4B3E4x3NxNLP9XopteK-uowqHDoC_6sxb_1lBJPXE-hpG36zSXgM9hy0bWmjhWcMD5iAh40RoebTWTM-J-y_ol94B7j9mFwg-7mwttNqoW/s1600-h/imagen7.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhM8tpJyYUP-O_aX_wws6LHSOYxEsgelgKZWz4B3E4x3NxNLP9XopteK-uowqHDoC_6sxb_1lBJPXE-hpG36zSXgM9hy0bWmjhWcMD5iAh40RoebTWTM-J-y_ol94B7j9mFwg-7mwttNqoW/s320/imagen7.png" alt="" id="BLOGGER_PHOTO_ID_5260933484830127650" border="0" /></a><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEideNVqYoh-Wz0JlLBZ6sTT-S4OtrlqVJzRoJhkZ_hn7lxxCNqaVYP68apQfY7x4e2c9EycSFsXf7AcnxT-DE_gRH2LwlGN8F1StCrNb2dqQClUswCdYeDmiF9KV4SCreoYKuTaHcbINwNo/s1600-h/imagen8.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEideNVqYoh-Wz0JlLBZ6sTT-S4OtrlqVJzRoJhkZ_hn7lxxCNqaVYP68apQfY7x4e2c9EycSFsXf7AcnxT-DE_gRH2LwlGN8F1StCrNb2dqQClUswCdYeDmiF9KV4SCreoYKuTaHcbINwNo/s320/imagen8.png" alt="" id="BLOGGER_PHOTO_ID_5260933490985347874" border="0" /></a><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjPQkGHaL_NmCBlQlkzEj0nLvKEVmejocwzFt0yYTOM7-2bjKQS0IUg95UZeQYJC_AWsHkO64zMYxdT0PJlXWw0miuErkFUOQfLPexDaT7KpW-69y6_8HxhUK0KDNoggbkjg_9TtWUBjqk9/s1600-h/imagen9.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjPQkGHaL_NmCBlQlkzEj0nLvKEVmejocwzFt0yYTOM7-2bjKQS0IUg95UZeQYJC_AWsHkO64zMYxdT0PJlXWw0miuErkFUOQfLPexDaT7KpW-69y6_8HxhUK0KDNoggbkjg_9TtWUBjqk9/s320/imagen9.png" alt="" id="BLOGGER_PHOTO_ID_5260933494769819330" border="0" /></a><br />Y por último se me habia olvidado mencionar que las pestañas se pueden cambiar de lugar arrastrándolas desde la beta 2<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh0SkwEf_APHHDO0B21mDIaek8ptKSXnqVYwFSJ6lN22rBZSvWmncvnMb4_WqPXw-AXu7rBa89bzu0XF2Am7PpZgVwZE6OSlSXE5IWYx8SG9OmbrGowztbv8H245ClwlMTGUfp7X9jNlhtQ/s1600-h/imagen10.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh0SkwEf_APHHDO0B21mDIaek8ptKSXnqVYwFSJ6lN22rBZSvWmncvnMb4_WqPXw-AXu7rBa89bzu0XF2Am7PpZgVwZE6OSlSXE5IWYx8SG9OmbrGowztbv8H245ClwlMTGUfp7X9jNlhtQ/s320/imagen10.png" alt="" id="BLOGGER_PHOTO_ID_5260933493329153618" border="0" /></a><br /><br />Si alguno de ustedes usa J-Kiltro, les recomiendo pasarse a esta versión que está mejor que la anterior.<br /><br />saludos !!!<br /></div>Daniel Dario Morales Salashttp://www.blogger.com/profile/07642586501018157497noreply@blogger.com14tag:blogger.com,1999:blog-1421033339681316542.post-57477740779623807782008-10-21T19:25:00.017-03:002008-10-21T21:06:43.453-03:00Instalación de Openbravo 2.40 en OpenSUSE 11.0Esta 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 <a href="http://www.opensuse.org/">OpenSUSE 11.0</a><a href="http://www.opensuse.org/">,</a> pero sirve cualquier distro (distribución GNU/Linux) con linux 2.6.x.<br /><br />Lo primero es lo primero, algunos se preguntarán qué es Openbravo, <a style="font-style: italic;" href="http://www.openbravo.com/">Openbravo</a> es un <a style="font-style: italic;" href="http://www.blogger.com/es.wikipedia.org/wiki/Planificaci%C3%83%C2%B3n_de_recursos_empresariales">ERP</a> (Enterprise Resource Planning) opensource diseñado para las <a style="font-style: italic;" href="http://es.wikipedia.org/wiki/PYME">MIPyME</a> (micro, pequeña y mediana empresa).<br />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.<br /><br />Esta herramienta de gestión empresarial está disponible para la descarga gratuita desde el <a style="font-style: italic;" href="http://www.openbravo.com/">sitio web oficial de Openbravo</a> y <span style="font-weight: bold;">NO</span> se requiere el pago de licencias para su uso en ambiente personal ni comercial.<br /><br />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.<br /><br /><span style="font-size:180%;">Requerimientos:</span><br /><ul style="text-align: justify;"><li><a style="font-style: italic;" href="http://www.openbravo.com/">Openbravo</a>.</li><li><a style="font-style: italic;" href="http://ant.apache.org/">Apache-ant 1.7</a>.</li><li><a style="font-style: italic;" href="http://tomcat.apache.org/">Apache-tomcat 6.0</a>.</li><li><a style="font-style: italic;" href="http://java.sun.com/javase/downloads/index.jsp">JDK 1.6</a>.</li><li><a style="font-style: italic;" href="http://www.postgresql.com/">PostgreSQL</a>.</li></ul>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.<br /><br />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.<br /><br />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 <span style="font-style: italic;">default</span> pero que se pueden activar en <span style="font-weight: bold; font-style: italic;">YaST -> Software -> Community Repositories</span>, 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 <a href="http://www.google.com/">google</a> es su amigo en esos casos.<br /><br />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 <span style="font-weight: bold;">BUILD FAILED</span> ??).<br /><br />Para el JDK tienen varias versiones, si su distribución utiliza paquetes RPM entonces descarguen el paquete de nombre <span style="font-weight: bold; font-style: italic;">jdk-6u10-linux-i586.rpm.bin</span> y en caso contrario descarguen <span style="font-weight: bold; font-style: italic;">jdk-6u10-linux-i586.bin</span>. 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 <span style="font-weight: bold; font-style: italic;">/usr/java/jdk1.6.0_10</span> y además queda un enlace simbólico llamado <span style="font-weight: bold; font-style: italic;">/usr/java/latest</span> que apunta al directorio anterior.<br /><br /><span style="font-size:180%;">Instalación de dependencias:</span><br /><br /><span style="font-size:130%;">PostgreSQL.</span><br />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:<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj37Bt7CfKZ8Z-kQDT6N40Z2hdVcrvofjVRV2rZiOp89NO5c5wv9oiyxlO7IZx7hkDMBd0fNPfOisonXZ6PZhk9WBkAaTnvX-U2qdCIaR1Yde1QzurK8rLjxr4pIg84zmaiPxNfOJFXanHr/s1600-h/imagen4.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj37Bt7CfKZ8Z-kQDT6N40Z2hdVcrvofjVRV2rZiOp89NO5c5wv9oiyxlO7IZx7hkDMBd0fNPfOisonXZ6PZhk9WBkAaTnvX-U2qdCIaR1Yde1QzurK8rLjxr4pIg84zmaiPxNfOJFXanHr/s320/imagen4.png" alt="" id="BLOGGER_PHOTO_ID_5259739867245334338" border="0" /></a><span style="font-size:130%;">JDK.</span><br />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 <a href="http://www.kde.org/">KDE</a>, <span style="font-weight: bold; font-style: italic;">menú -> aplicaciones -> sistema -> terminales -> konsole</span>), escribimos <span style="font-weight: bold; font-style: italic;">su</span> e ingresamos la contraseña de administrador del sistema (al escribirla no se ve nada, no hay problema) y presionamos <span style="font-style: italic;"><span style="font-weight: bold;">enter</span>.</span><br /><br />Por <span style="font-style: italic;">default</span> la consola queda posicionada en su <span style="font-weight: bold;">home</span>, por ejemplo <span style="font-style: italic; font-weight: bold;">/home/metalklesk</span> (el cual es mi caso), así que para evitar confusiones tengamos todos los archivos descargados en la raíz de nuestro home.<br /><br />Ahora escribimos:<br /><blockquote>chmod a+x jdk-6u10-linux-i586.rpm.bin<br />./jdk-6u10-linux-i586.rpm.bin</blockquote><br />con eso nos va a salir un texto explicando la licencia, etc. y si no nos interesa leerlo presionamos <span style="font-weight: bold; font-style: italic;">q</span> y <span style="font-weight: bold; font-style: italic;">enter</span>. Ya con eso tenemos el JDK instalado en <span style="font-weight: bold; font-style: italic;">/usr/java/jdk1.6.0_10</span>. Si no usamos RPM hacemos lo mismo con el otro:<br /><blockquote>chmod a+x jdk-6u10-linux-i586.bin<br />./jdk-6u10-linux-i586.bin</blockquote><br />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 <span style="font-weight: bold;">/opt</span>.<br /><blockquote>mv -f jdk1.6.0_10/ /opt</blockquote><br />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.<br /><br /><span style="font-size:130%;">Ant</span>.<br />Para instalar ant simplemente debemos descomprimir el archivo descargado, si usasmos KDE hacemos <span style="font-weight: bold; font-style: italic;">click derecho sobre el archivo -> extraer -> extraer aquí</span>. Luego movemos la carpeta a <span style="font-weight: bold;">/opt</span>.<br /><blockquote>mv -f apache-ant-1.7/ /opt</blockquote><br />y ya lo tenemos instalado.<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjotzr_GhLW0cAe4UMa7lgXLSbAp32vqQEWKE0nnuLEaftfQpSwdCU2MAsGHyX7zuWvSCFyzlgZDj-bHkJ7d8hL_AFnZBAuuQJ4aQ_-RdjSE0tgjdKDoz2fOI-Nu07whA-qJYP6JlVmht2x/s1600-h/imagen2.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjotzr_GhLW0cAe4UMa7lgXLSbAp32vqQEWKE0nnuLEaftfQpSwdCU2MAsGHyX7zuWvSCFyzlgZDj-bHkJ7d8hL_AFnZBAuuQJ4aQ_-RdjSE0tgjdKDoz2fOI-Nu07whA-qJYP6JlVmht2x/s320/imagen2.png" alt="" id="BLOGGER_PHOTO_ID_5259741012266850050" border="0" /></a><br /><span style="font-size:130%;">Tomcat</span>.<br />Para instalar Tomcat simplemente debemos descomprimir el archivo descargado, si usamos KDE hacemos <span style="font-weight: bold; font-style: italic;">click derecho sobre el archivo -> extraer -> extraer aquí</span>. Luego movemos la carpeta a <span style="font-weight: bold;">/opt</span>.<br /><blockquote>mv -f apache-tomcat-6.0.18/ /opt</blockquote><br />y ya lo tenemos instalado.<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjotzr_GhLW0cAe4UMa7lgXLSbAp32vqQEWKE0nnuLEaftfQpSwdCU2MAsGHyX7zuWvSCFyzlgZDj-bHkJ7d8hL_AFnZBAuuQJ4aQ_-RdjSE0tgjdKDoz2fOI-Nu07whA-qJYP6JlVmht2x/s1600-h/imagen2.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjotzr_GhLW0cAe4UMa7lgXLSbAp32vqQEWKE0nnuLEaftfQpSwdCU2MAsGHyX7zuWvSCFyzlgZDj-bHkJ7d8hL_AFnZBAuuQJ4aQ_-RdjSE0tgjdKDoz2fOI-Nu07whA-qJYP6JlVmht2x/s320/imagen2.png" alt="" id="BLOGGER_PHOTO_ID_5259741012266850050" border="0" /></a><br /><span style="font-size:180%;">Configuración del sistema.</span><br />Ahora debemos configurar PostgreSQL y algunas variables del sistema antes de instalar Openbravo.<br /><br /><span style="font-size:130%;">PostgreSQL.</span><br />Lo primero es darle una contraseña al usuario administrador de PostgreSQL, al usuario <span style="font-weight: bold;">postgres</span>, para esto simplemente escribimos en consola:<br /><blockquote>passwd postgres</blockquote><br />y escribimos la contraseña.<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjGrWH2tykT3tB_T2du3ddDGZkNGrrcYh9RV8JyYleX3Hwc-ZxZcQPJQLbHiA4WcVGJ9GdA1uqlKpB4CZu8ZR2Zep0oy4Q2tifw4ILBNOsXgBhxcOaf37NM39ZE8IwjUXUpQX8eOXYUEjBg/s1600-h/imagen5.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjGrWH2tykT3tB_T2du3ddDGZkNGrrcYh9RV8JyYleX3Hwc-ZxZcQPJQLbHiA4WcVGJ9GdA1uqlKpB4CZu8ZR2Zep0oy4Q2tifw4ILBNOsXgBhxcOaf37NM39ZE8IwjUXUpQX8eOXYUEjBg/s320/imagen5.png" alt="" id="BLOGGER_PHOTO_ID_5259741715255033122" border="0" /></a><br /><br />Ahora debemos iniciar y detener PostgreSQL por primera vez para que se creen los archivos de configuración, para esto simplemente escribimos en consola:<br /><blockquote>service postgresql start</blockquote><br />y luego<br /><blockquote>service postgresql stop</blockquote><br />como se puede ver en la siguiente imagen.<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi7ewQ_EqjqDa6sMaPiJFjrQkPHhyphenhyphenRD0ATJpJ7owdlLKqg-4QlLvZmSpyqA6cSgYLrJGvhI5Ogwd5brbvsymir9MM6rcG96dWzUfL37dcoImOh8kmWvRU3crZ0VU_l2a2IEQIDRazB5uHox/s1600-h/imagen6.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi7ewQ_EqjqDa6sMaPiJFjrQkPHhyphenhyphenRD0ATJpJ7owdlLKqg-4QlLvZmSpyqA6cSgYLrJGvhI5Ogwd5brbvsymir9MM6rcG96dWzUfL37dcoImOh8kmWvRU3crZ0VU_l2a2IEQIDRazB5uHox/s320/imagen6.png" alt="" id="BLOGGER_PHOTO_ID_5259742142241388274" border="0" /></a><br />Ahora debemos modificar el archivo <span style="font-weight: bold; font-style: italic;">/var/lib/pgsql/data/pg_hba.conf</span>, vamos al final y donde dice:<br /><blockquote># "local" is for Unix domain socket connections only<br />local all all ident sameuser<br /># IPv4 local connections:<br />host all all 127.0.0.1/32 ident sameuser<br /># IPv6 local connections:<br />host all all ::1/128 ident sameuser</blockquote><br />cambiamos el <span style="font-style: italic;">"ident sameuser"</span> por un <span style="font-style: italic;">"trust"</span>, sin las comillas, y guardamos.<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgedJlHVy8LX5ma81NUBQaLfVp0RS2J2cwBlbTrKRRt_EvWeg2O6DrgDJI1fGO0gpe_wGAtEkKMlpPw5vBNQD2gg0nJTqJA42lcir2YJh-Ri6jXcofh0C8volb5PQ9DXlpaWEuFfFtazFQm/s1600-h/imagen7.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgedJlHVy8LX5ma81NUBQaLfVp0RS2J2cwBlbTrKRRt_EvWeg2O6DrgDJI1fGO0gpe_wGAtEkKMlpPw5vBNQD2gg0nJTqJA42lcir2YJh-Ri6jXcofh0C8volb5PQ9DXlpaWEuFfFtazFQm/s320/imagen7.png" alt="" id="BLOGGER_PHOTO_ID_5259742532283967202" border="0" /></a><br /><div style="text-align: justify;">Con eso ya tenemos lista la configuración de PostgreSQL en el sistema.<br /><br /><span style="font-size:130%;">Variables del sistema.</span><br /><span style="font-size:100%;">Ahora vamos a configurar las variables del sistema, para eso debemos abrir el el archivo <span style="font-weight: bold; font-style: italic;">/etc/profile</span> como usuario root, si usan KDE entonces escriban en la consola, como usuario root:<br /></span><span style="font-size:100%;"><blockquote>kwrite /etc/profile</blockquote><br />bajen hasta el final y agreguen las siguientes lineas:<br /></span></div><span style="font-size:100%;"><blockquote>export JAVA_HOME=/usr/java/latest/<br />export JDK_HOME=/usr/java/latest/<br />export JRE_HOME=/usr/java/latest/jre<br />export ANT_HOME=/opt/apache-ant-1.7.1<br />export CATALINA_HOME=/opt/apache-tomcat-6.0.18<br />export PATH=${JAVA_HOME}/bin:${JDK_HOME}/bin:${JRE_HOME}/bin:${ANT_HOME}/bin:${CATALINA_HOME}/bin:$PATH<br /></blockquote></span><span style="font-size:100%;"><br />como se ve en la siguiente imagen:</span><br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjHWjBYQD8OXtlQv7_DmfNQhkykDe1VGTfC3P9pycpoxq_C4__YprojZ5z5vKmQA-Gvu21HZwHKfLhz7tTVzeM3U2us30UVVH12cdgJqq94jyD1vrv0czoPb15T8DVC36Bw4qOviY4dbyNi/s1600-h/imagen3.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjHWjBYQD8OXtlQv7_DmfNQhkykDe1VGTfC3P9pycpoxq_C4__YprojZ5z5vKmQA-Gvu21HZwHKfLhz7tTVzeM3U2us30UVVH12cdgJqq94jyD1vrv0czoPb15T8DVC36Bw4qOviY4dbyNi/s320/imagen3.png" alt="" id="BLOGGER_PHOTO_ID_5259742982956950018" border="0" /></a><br />guardamos y reiniciamos el equipo.<br /><br />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.<br /><br />Ahora ya estamos en condiciones de instalar Openbravo.<br /><br /><span style="font-size:180%;">Instalación Openbravo.</span><span style="font-size:100%;"><br />Para instalar Openbravo debemos tener arriba a PostgreSQL y a Tomcat, para esto simplemente hay que ingresar en la consola, como root:<br /><blockquote>service postgresql start</blockquote><br />y<br /><blockquote>$CATALINA_HOME/bin/startup.sh</blockquote><br /></span><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhs5kfVum5Bs5HpWMC0k0UpPiOu-L9DHEpPfZmTVCoWDIRbazwCgTS8S2B0UP_iZyKnsa6L9YjIFPPnu8kRTSucd5Qv_BJjDd8jC62nedvAuVbTWftOccZG3WQeZvAl_G5IXGkRbBBhIP0p/s1600-h/imagen8.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhs5kfVum5Bs5HpWMC0k0UpPiOu-L9DHEpPfZmTVCoWDIRbazwCgTS8S2B0UP_iZyKnsa6L9YjIFPPnu8kRTSucd5Qv_BJjDd8jC62nedvAuVbTWftOccZG3WQeZvAl_G5IXGkRbBBhIP0p/s320/imagen8.png" alt="" id="BLOGGER_PHOTO_ID_5259743631246793026" border="0" /></a><br /><span style="font-size:100%;"><br />y después ejecutamos el instalador de Openbravo ...<br /><blockquote>./OpenbravoERP_2.40-linux-installer.bin</blockquote></span><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjloeH6bfg3Gq7uLwG4eXDcdmRTxG8uJyyJmmCTR16mVPrngVK54IhHvGMZPuaPX54-9ojJ7orCXlVNUZxgfiC54sCwxvV4fKsKWYnMoTmJ2i6h5t2pHfDkYuRHNbdFaXBZWEnpq5xDvV6y/s1600-h/imagen9.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjloeH6bfg3Gq7uLwG4eXDcdmRTxG8uJyyJmmCTR16mVPrngVK54IhHvGMZPuaPX54-9ojJ7orCXlVNUZxgfiC54sCwxvV4fKsKWYnMoTmJ2i6h5t2pHfDkYuRHNbdFaXBZWEnpq5xDvV6y/s320/imagen9.png" alt="" id="BLOGGER_PHOTO_ID_5259744578563319026" border="0" /></a><br />luego aceptamos la licencia<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgRByVkH1ltWYs7k-k7TX2fMKnTfo0DnqRcIAXe9Rn_RLDP7iZ9XzMWGjeoKeg0Vw1r5nBq_AXCe-Thb-_mFzvctKkcZmhSCxPQBBR2wstZ3Cg6JbOsI8xMWRHsBdEfjOFvuxfUm4to0N-S/s1600-h/imagen10.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgRByVkH1ltWYs7k-k7TX2fMKnTfo0DnqRcIAXe9Rn_RLDP7iZ9XzMWGjeoKeg0Vw1r5nBq_AXCe-Thb-_mFzvctKkcZmhSCxPQBBR2wstZ3Cg6JbOsI8xMWRHsBdEfjOFvuxfUm4to0N-S/s320/imagen10.png" alt="" id="BLOGGER_PHOTO_ID_5259744586993335026" border="0" /></a><br />luego elegimos el directorio de instalación de Openbravo<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh7EUM1oKZb1DViTZ3boVs7fJo1hdhHQht-Zah31H-gkP5vcvcBpgkg_9Pxh166mU5VdxfhC39_RMbGZEBDoCCI9_4aaFpx0_EJXDn21oHD3Q3uXPU4oaQ8iWsqLYo72iHbsCbAD02uKbN8/s1600-h/imagen11.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh7EUM1oKZb1DViTZ3boVs7fJo1hdhHQht-Zah31H-gkP5vcvcBpgkg_9Pxh166mU5VdxfhC39_RMbGZEBDoCCI9_4aaFpx0_EJXDn21oHD3Q3uXPU4oaQ8iWsqLYo72iHbsCbAD02uKbN8/s320/imagen11.png" alt="" id="BLOGGER_PHOTO_ID_5259744588479535378" border="0" /></a><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjIN_dBNIO5CTTgdiTK0tK-ndjQhbUhKxK5cmuzfCh5ZWapnFvhP7tTFayGtzB1f9KNoynkrgZlVbPH8l5NJusR5tc2IWCZm3SkxHGxPtlHrwWWfmh7kAUe7k228Imd0bbErYJH8Z97ZKES/s1600-h/imagen12.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjIN_dBNIO5CTTgdiTK0tK-ndjQhbUhKxK5cmuzfCh5ZWapnFvhP7tTFayGtzB1f9KNoynkrgZlVbPH8l5NJusR5tc2IWCZm3SkxHGxPtlHrwWWfmh7kAUe7k228Imd0bbErYJH8Z97ZKES/s320/imagen12.png" alt="" id="BLOGGER_PHOTO_ID_5259744593089593682" border="0" /></a><br />luego elegimos la instalación completa (asumiendo que Openbravo estará en el mismo equipo que la base de datos)<br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhGP0OUpOH1-hZ_XeasTDOAIMR6eN92kEsGZ-Gj7iGhB2Up567cqwdqd1K_Qx3EOCGPlSjWQbcsO7T5wkL3zfXSB1ni-ti41oVjHvtKdz3T-oH7535YUWkbLRp4eBWNZwa6YI1n8ZSHjvjf/s1600-h/imagen13.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhGP0OUpOH1-hZ_XeasTDOAIMR6eN92kEsGZ-Gj7iGhB2Up567cqwdqd1K_Qx3EOCGPlSjWQbcsO7T5wkL3zfXSB1ni-ti41oVjHvtKdz3T-oH7535YUWkbLRp4eBWNZwa6YI1n8ZSHjvjf/s320/imagen13.png" alt="" id="BLOGGER_PHOTO_ID_5259744602286852738" border="0" /></a><br />luego la instalación estándar<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjhsriI-Tw4s-11PWxqyN4GJ7_mHWn-JKVSTQYx6ZT-KLkp9ed4GJVMxqixSkhMaIHxbn_xV2N-E2jRKt3rRjz_JKMsFgKtIuKFFy7RCC701iNrc46nBMWIyxUgY7wSVG4qOLPNOZ4lzJbi/s1600-h/imagen14.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjhsriI-Tw4s-11PWxqyN4GJ7_mHWn-JKVSTQYx6ZT-KLkp9ed4GJVMxqixSkhMaIHxbn_xV2N-E2jRKt3rRjz_JKMsFgKtIuKFFy7RCC701iNrc46nBMWIyxUgY7wSVG4qOLPNOZ4lzJbi/s320/imagen14.png" alt="" id="BLOGGER_PHOTO_ID_5259746524292750898" border="0" /></a><br />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<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjNfwlfZlKKOFSjWA5vyD46yVOD4VIIWCUfrjHgrfGnfKeIclIdblEYF92W5M_9z64bwdSxctNBE3qA7RvCNM5bz5RGfqAGNiLiZ6uCvHUceK_W_X0xT8WuGMB-w5xBxF8DTrZN1mS2sehy/s1600-h/imagen15.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjNfwlfZlKKOFSjWA5vyD46yVOD4VIIWCUfrjHgrfGnfKeIclIdblEYF92W5M_9z64bwdSxctNBE3qA7RvCNM5bz5RGfqAGNiLiZ6uCvHUceK_W_X0xT8WuGMB-w5xBxF8DTrZN1mS2sehy/s320/imagen15.png" alt="" id="BLOGGER_PHOTO_ID_5259746532071814418" border="0" /></a><br />lo mismo con ant<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjkud4CX82NhKwe7sZuqcfHgi3s9r_7SfdazB5S9xf1tSc5R6w2UOAK0QSZE3mQTjuifZ1PlcaVSv177gfHb2nFJxhRUeJV7fCfbUgihcL3F61oYkks4gjfUrAQLgDjQOYYQif7qnwTh4_y/s1600-h/imagen16.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjkud4CX82NhKwe7sZuqcfHgi3s9r_7SfdazB5S9xf1tSc5R6w2UOAK0QSZE3mQTjuifZ1PlcaVSv177gfHb2nFJxhRUeJV7fCfbUgihcL3F61oYkks4gjfUrAQLgDjQOYYQif7qnwTh4_y/s320/imagen16.png" alt="" id="BLOGGER_PHOTO_ID_5259746541828332738" border="0" /></a><br />y tomcat<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhKjNnLakiBoDH1ce2nu1yKdix7gVDn0uG_0sTg02UttEKBLMcXvS2M2cP06MLshGZJh-wfIAjsDxe5oa35NK1BJW52_cZx2U6EwklHhaYCjJcBWG_884T3EwTG_gsVFr9psbdwufIoPavm/s1600-h/imagen17.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhKjNnLakiBoDH1ce2nu1yKdix7gVDn0uG_0sTg02UttEKBLMcXvS2M2cP06MLshGZJh-wfIAjsDxe5oa35NK1BJW52_cZx2U6EwklHhaYCjJcBWG_884T3EwTG_gsVFr9psbdwufIoPavm/s320/imagen17.png" alt="" id="BLOGGER_PHOTO_ID_5259746549042863026" border="0" /></a><br />luego seleccionamos la base de datos PostgreSQL<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjUP3m7e8i_AoIzKX8iWcnfcH-ujvcSOIDgx-0XF89TpzMaIkxvq-TjgP9pN_7QIK57EKOVfdzY2mpRVCA6qRx60PuMjkcDgkTkNEEobuvZHi626lRagzKS1MHO40KQP9xikE1c68aD15rp/s1600-h/imagen18.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjUP3m7e8i_AoIzKX8iWcnfcH-ujvcSOIDgx-0XF89TpzMaIkxvq-TjgP9pN_7QIK57EKOVfdzY2mpRVCA6qRx60PuMjkcDgkTkNEEobuvZHi626lRagzKS1MHO40KQP9xikE1c68aD15rp/s320/imagen18.png" alt="" id="BLOGGER_PHOTO_ID_5259746562912474130" border="0" /></a><br />e ingresamos el directorio donde se encuentran los ejecutables (/usr/bin)<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiGN_9TU9b1dwvLt-4S3-aIYccL-0rrt1iiTnx3ljJ89pLy-NsmGVxbBCrZ8mGsF3svI-rpU5LiDc5hlqWrVHzUO8AtN_3t_CtPWwMfI-ARSHp2CxcCvCStEvfzDNX3kHCwZIfTrs0qC6yY/s1600-h/imagen19.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiGN_9TU9b1dwvLt-4S3-aIYccL-0rrt1iiTnx3ljJ89pLy-NsmGVxbBCrZ8mGsF3svI-rpU5LiDc5hlqWrVHzUO8AtN_3t_CtPWwMfI-ARSHp2CxcCvCStEvfzDNX3kHCwZIfTrs0qC6yY/s320/imagen19.png" alt="" id="BLOGGER_PHOTO_ID_5259758153995118050" border="0" /></a><br />luego ingresamos los datos de la base de datos (host y puerto)<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiC1XXhCJI9NF0pQVyuo_SPJMzFTqjj41G9pfkkLbSa7_0KV4-5et3Rpetl7GYDrYpZH5t3zv-LzyXVpUfhLpw3bwYS4s_UCBFik_Zo8_GK-CAV_7DrY492MBO699kG1s5z5g8YmU46G5sX/s1600-h/imagen20.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiC1XXhCJI9NF0pQVyuo_SPJMzFTqjj41G9pfkkLbSa7_0KV4-5et3Rpetl7GYDrYpZH5t3zv-LzyXVpUfhLpw3bwYS4s_UCBFik_Zo8_GK-CAV_7DrY492MBO699kG1s5z5g8YmU46G5sX/s320/imagen20.png" alt="" id="BLOGGER_PHOTO_ID_5259758157161252946" border="0" /></a><br />luego el nombre de usuario y contraseña de administrador de la base de datos<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg0DS010PiVsSgCLyewbDXj9Rps0LtWT0lX4LiytaI_0L1RGq0V7K8ciQ9duPKqHwgY73WyFIYWs0LhmRQpUhMRlfbW00epAMNnLf-_nS1RZlSusy6bFJI3VYk8HLL465bPnov1_pS8z1zD/s1600-h/imagen21.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg0DS010PiVsSgCLyewbDXj9Rps0LtWT0lX4LiytaI_0L1RGq0V7K8ciQ9duPKqHwgY73WyFIYWs0LhmRQpUhMRlfbW00epAMNnLf-_nS1RZlSusy6bFJI3VYk8HLL465bPnov1_pS8z1zD/s320/imagen21.png" alt="" id="BLOGGER_PHOTO_ID_5259758164967293874" border="0" /></a><br />luego los datos de la base de datos de Openbravo<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjs-ZDw9DvnhHo-Y_f31rD8rvF2VpxBiUTnVTvtDnYMD5Obf7OUPZJD80QokXPGp-q4aZiUpvUr1QWfKXmQ6tG81ngNboPxQya3ASuerlUQIc5XPl7vSZyxymmiOaixJAzuj4poX2fFbrC4/s1600-h/imagen22.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjs-ZDw9DvnhHo-Y_f31rD8rvF2VpxBiUTnVTvtDnYMD5Obf7OUPZJD80QokXPGp-q4aZiUpvUr1QWfKXmQ6tG81ngNboPxQya3ASuerlUQIc5XPl7vSZyxymmiOaixJAzuj4poX2fFbrC4/s320/imagen22.png" alt="" id="BLOGGER_PHOTO_ID_5259758173500794242" border="0" /></a><br />luego el nombre de contexto de la aplicación, con la cual se accederá directamente en el navegador web<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi5h7voB9DHMZ9ukxnrAHyhQtE_Jzi3R8g7Kaw4TqyIrhLFu_nkt9DgID0H08kalpcuvmyUrJseTn0iyy3VGpbmfzn7_4wN7TVQuslKFELINfIkg4osmXI1xp749ICKtAkvHpUH4UrgWTcS/s1600-h/imagen23.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi5h7voB9DHMZ9ukxnrAHyhQtE_Jzi3R8g7Kaw4TqyIrhLFu_nkt9DgID0H08kalpcuvmyUrJseTn0iyy3VGpbmfzn7_4wN7TVQuslKFELINfIkg4osmXI1xp749ICKtAkvHpUH4UrgWTcS/s320/imagen23.png" alt="" id="BLOGGER_PHOTO_ID_5259758174910353906" border="0" /></a><br />luego hay que configurar las opciones de fecha que queremos utilizar en Openbravo<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg_sMi2O7m-aR6_6JcMTr22tJVYJghWwLAS6EE50c17yldhbB9vad7TA14SCVm6EdHjcOu9R9Yu9D29x6qsjft549lGpH92z3t9-wiSvO59mmqsAJ3-SzjiCQQOvis-uw8TixCggWWv3bRg/s1600-h/imagen24.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg_sMi2O7m-aR6_6JcMTr22tJVYJghWwLAS6EE50c17yldhbB9vad7TA14SCVm6EdHjcOu9R9Yu9D29x6qsjft549lGpH92z3t9-wiSvO59mmqsAJ3-SzjiCQQOvis-uw8TixCggWWv3bRg/s320/imagen24.png" alt="" id="BLOGGER_PHOTO_ID_5259759782728219570" border="0" /></a><br />luego podemos seleccionar la opción para llenar la base de datos con datos demo<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgPAk_muyYln8SmkkFen19MeUTTaxqpJVEyn3OCeVYYL_wSSeP7ZoAKQJseJx80eg56Vko4uTmhUyCVL5ZWKH3t1F-Qidf2gXqKpC4OhnEDjsVARweGk7FE-3-NIlYkuscwM7iWoD_Nj8oy/s1600-h/imagen25.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgPAk_muyYln8SmkkFen19MeUTTaxqpJVEyn3OCeVYYL_wSSeP7ZoAKQJseJx80eg56Vko4uTmhUyCVL5ZWKH3t1F-Qidf2gXqKpC4OhnEDjsVARweGk7FE-3-NIlYkuscwM7iWoD_Nj8oy/s320/imagen25.png" alt="" id="BLOGGER_PHOTO_ID_5259759788401621938" border="0" /></a><br />y con eso ya podemos instalar Openbravo<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh85NQt1thICF7hvoIJi1ABbEBEa9fS6B9OznnihXJIouRk4auXdC9BmSh6OEm_c1yraHJPsuPnssAE78CmSY8AkQYjNjET9I8whNCTp9_ABn0efbfK3IhTd-WoKoNFbX4cnSkKf7UWJ5pC/s1600-h/imagen26.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh85NQt1thICF7hvoIJi1ABbEBEa9fS6B9OznnihXJIouRk4auXdC9BmSh6OEm_c1yraHJPsuPnssAE78CmSY8AkQYjNjET9I8whNCTp9_ABn0efbfK3IhTd-WoKoNFbX4cnSkKf7UWJ5pC/s320/imagen26.png" alt="" id="BLOGGER_PHOTO_ID_5259759791901330354" border="0" /></a><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiCndm52Zlsld-LJCaivUkafTSHdNXt8kFItXZ3REmS0jxhb7utYCmtuwbaYK3LpQDBGkqGpXyTTctEhbIChfi15ZOJlmIdv3ovVMQcsr-9GIMTev7gashkKpnD4e5GeBF2FVSBDdnTgaMv/s1600-h/imagen27.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiCndm52Zlsld-LJCaivUkafTSHdNXt8kFItXZ3REmS0jxhb7utYCmtuwbaYK3LpQDBGkqGpXyTTctEhbIChfi15ZOJlmIdv3ovVMQcsr-9GIMTev7gashkKpnD4e5GeBF2FVSBDdnTgaMv/s320/imagen27.png" alt="" id="BLOGGER_PHOTO_ID_5259759802135715874" border="0" /></a><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEimJnqXUvC__g3RF_A4RjinDjKajs66U0NLPp1C4xdy4hHlgDoGhilG_PSnxZBjk60ViDn7OU7k362DPL97RnRVGcQMP3PrFBWsvEg3VNVgrjBWqRl_YETla_fUk7m60SomEffTWppVfH4e/s1600-h/imagen28.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEimJnqXUvC__g3RF_A4RjinDjKajs66U0NLPp1C4xdy4hHlgDoGhilG_PSnxZBjk60ViDn7OU7k362DPL97RnRVGcQMP3PrFBWsvEg3VNVgrjBWqRl_YETla_fUk7m60SomEffTWppVfH4e/s320/imagen28.png" alt="" id="BLOGGER_PHOTO_ID_5259759808989452626" border="0" /></a><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgrQ5Tjjp7ikVuzYFR5WGa-3n2XhJDz9SWZddKA8jFfb9nnoIa0ioquDwfyOfAXzV-GwmIGzflSmM6TAprp4L1S2CGpEh1ad44aMST6tT6Cf8r5jVYpgHiF2b6xv2FvjtccLCCRecXOevCC/s1600-h/imagen29.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgrQ5Tjjp7ikVuzYFR5WGa-3n2XhJDz9SWZddKA8jFfb9nnoIa0ioquDwfyOfAXzV-GwmIGzflSmM6TAprp4L1S2CGpEh1ad44aMST6tT6Cf8r5jVYpgHiF2b6xv2FvjtccLCCRecXOevCC/s320/imagen29.png" alt="" id="BLOGGER_PHOTO_ID_5259760919599595330" border="0" /></a><br />Una vez instalado reiniciamos el sistema.<br />Para iniciar Openbravo debemos levantar <span style="font-weight: bold;">PostgreSQL</span> y <span style="font-weight: bold;">Tomcat</span>. Esto lo podemos hacer desde línea de comandos en una consola:<br /><br /><blockquote>service postgresql start<br />$CATALINA_HOME/bin/startup.sh</blockquote><br /><br />luego abrimos el navegador web que queramos y escribimos en la dirección<br /><br /><blockquote>http://localhost/openbravo</blockquote><br /><br />y podrán ver la página de ingreso al sistema<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiIwDfaZBy0vpKLEdW3YP6wfWdUpPoJt0SsKCo8XYe49y1e6XJ3lGJ4eNqe-6Enc5Auk8fKrxBmkB0i38mUgBznTT3t30gDeCIgO5gWjG7fhev7OS42zQ7cUgnDTMkKzx13QudNwuHgs9dd/s1600-h/imagen30.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiIwDfaZBy0vpKLEdW3YP6wfWdUpPoJt0SsKCo8XYe49y1e6XJ3lGJ4eNqe-6Enc5Auk8fKrxBmkB0i38mUgBznTT3t30gDeCIgO5gWjG7fhev7OS42zQ7cUgnDTMkKzx13QudNwuHgs9dd/s320/imagen30.png" alt="" id="BLOGGER_PHOTO_ID_5259760924693626850" border="0" /></a><br />Ingresamos el nombre de usuario <span style="font-weight: bold;">Openbravo</span>, la contraseña <span style="font-weight: bold;">openbravo</span> y presionamos <span style="font-weight: bold;">Login</span>.<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhdYIDzinW6LBJefPm8d9Q9Pp2QYrBmaAZ8bPHwMeNSLeeYxtejdBSZP2jF7Sw4PHlkZ7xLDX8W7FFCZk2sqkwqvhrsHwt3MwFCSNYKjC7EYVSLZP8LcXthGZmWcp3JlFJjKpwWAfNszb7g/s1600-h/imagen31.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhdYIDzinW6LBJefPm8d9Q9Pp2QYrBmaAZ8bPHwMeNSLeeYxtejdBSZP2jF7Sw4PHlkZ7xLDX8W7FFCZk2sqkwqvhrsHwt3MwFCSNYKjC7EYVSLZP8LcXthGZmWcp3JlFJjKpwWAfNszb7g/s320/imagen31.png" alt="" id="BLOGGER_PHOTO_ID_5259760929207647634" border="0" /></a><br /><br />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.<br /><br />saludos !!!Daniel Dario Morales Salashttp://www.blogger.com/profile/07642586501018157497noreply@blogger.com7tag:blogger.com,1999:blog-1421033339681316542.post-81196237264167434142008-10-21T00:15:00.003-03:002008-10-21T00:45:56.838-03:00J-Kiltro 4.0 Beta 2 LiberadoHoy he liberado la versión 4.0 Beta 2 de mi software de conversión de archivos de audio multi formato <a href="https://sourceforge.net/projects/j-kiltro/">J-Kiltro</a>.<br />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.<br /><br />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.<br /><br />Los formatos de entrada son:<br /><blockquote>aac,aiff,ape,au,flac,m4a,m4b,mp3,mp4,mpc,ogg,ra,wav y wma</blockquote>y los formatos de salida son:<br /><blockquote>aac,aiff,ape,au,flac,m4a,m4b,mp3,mp4,mpc,ogg y wav</blockquote>Esta aplicación está desarrollada 100% en java utilizando el IDE <a href="http://www.netbeans.org/">NetBeans</a> 6.1.<br /><br />Dentro de las caracteristicas de ésta versión se encuentran:<br /><ul><li>Interfaz muy simple y amigable.</li><li>Soporta 14 formatos de entrada y 12 de salida.</li><li>Extracción de pistas de audio desde CD (son selección de pistas).<br /></li><li>Tiene previsualizador de audio con un reproductor interno (mp3, ogg, flac, wav, aiff y au).</li><li>Obtiene metadata desde archivos de audio automáticamente.</li><li>Permite editar la metadata de los archivos de audio.</li><li>Detección automática de dependencias.<br /></li><li>Permite el ingreso de archivos de distintos formatos a la lista y automáticamente sabe como tratarlos para llevarlos al formato de destino.</li><li>Soporta distintos look and feel.</li><li>etc.</li></ul>É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:<br /><ul><li>Lame</li><li>Vorbis-tools</li><li>Mppdec y Mppenc</li><li>Sox</li><li>Mac<br /></li><li>Flac</li><li>Faac y Faad</li><li>Mplayer</li><li>CD Paranoia</li><li>JRE 1.6 update 10<br /></li></ul>Todas las dependencias (o la mayoría) están disponibles en los repositorios de las distribuciones Linux, por ejemplo todas están disponibles en <a href="http://www.opensuse.org">openSUSE 11.0</a>, 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.<br /><br />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.<br /><br />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.<br /><br />Dejo algunas imágenes a continuación:<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjuqGxWLSFj9bWmaIJOHO6FHQ-2ppvwFofu775M25tPsBFNQ-jveXz1c6ZUk0QadkN_hZ5zBxst83z68fAItJKYmJm58ue3YlF9Q566Dy1LBtsfTKGnToM5nSIT0Z9LAun9xsHT05XINxXf/s1600-h/imagen1.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjuqGxWLSFj9bWmaIJOHO6FHQ-2ppvwFofu775M25tPsBFNQ-jveXz1c6ZUk0QadkN_hZ5zBxst83z68fAItJKYmJm58ue3YlF9Q566Dy1LBtsfTKGnToM5nSIT0Z9LAun9xsHT05XINxXf/s320/imagen1.png" alt="" id="BLOGGER_PHOTO_ID_5259446422510450674" border="0" /></a><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjiRqsV3DAYvBOh_KfU8i-01tZ12ol9Or0E08MxS8jyFqgrJLI-iMXQDtfuv1k9vNl__qF7JiIKQ7vsYJbsUcA8fDRbAJ4QR9QHJkQgWCB5OzvVGroD9eeOlpfQ_gTzBmAlLA2lP-DvqGeZ/s1600-h/imagen2.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjiRqsV3DAYvBOh_KfU8i-01tZ12ol9Or0E08MxS8jyFqgrJLI-iMXQDtfuv1k9vNl__qF7JiIKQ7vsYJbsUcA8fDRbAJ4QR9QHJkQgWCB5OzvVGroD9eeOlpfQ_gTzBmAlLA2lP-DvqGeZ/s320/imagen2.png" alt="" id="BLOGGER_PHOTO_ID_5259446425265792818" border="0" /></a><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhAFoabAPyMz4MWTcMpIO71f8sya4xxFEtwKIWJVGoXTG_WjsVhfRKWVv6uonlR-XdAc8sicOGnlz7k9ba4mPrJFd95KCBROeq0SLZolkyU8Nw_sySEKq5rEmZnS90f768wbjZzmF3JiuUI/s1600-h/imagen3.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhAFoabAPyMz4MWTcMpIO71f8sya4xxFEtwKIWJVGoXTG_WjsVhfRKWVv6uonlR-XdAc8sicOGnlz7k9ba4mPrJFd95KCBROeq0SLZolkyU8Nw_sySEKq5rEmZnS90f768wbjZzmF3JiuUI/s320/imagen3.png" alt="" id="BLOGGER_PHOTO_ID_5259446435562163810" border="0" /></a><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi9VHvTl2lVwYrCsftxG9lRWlmHeI_lUCbVFK3dEBxDe26tEZu_G2MPrFMgCxB8iv2P7INhUETmDFZpJ0c76xVz2Zr2XdCM1BsDaMujLUiCJHx3i_5x5Bap3Av_FrWrTNsdLsUXdSik4gxQ/s1600-h/imagen4.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi9VHvTl2lVwYrCsftxG9lRWlmHeI_lUCbVFK3dEBxDe26tEZu_G2MPrFMgCxB8iv2P7INhUETmDFZpJ0c76xVz2Zr2XdCM1BsDaMujLUiCJHx3i_5x5Bap3Av_FrWrTNsdLsUXdSik4gxQ/s320/imagen4.png" alt="" id="BLOGGER_PHOTO_ID_5259446437965995394" border="0" /></a><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiLN0-PN5qhQZXhsIc8zuTWH8lPf9fhDkaxGVCLLBP9lzSkDEF0FDHl_cNUNIYzHNRftyql8J2jWGVWqvpMigrMb7jqcuiwqZktJ8bwvhR212U624waBpjLeO5M6v4YM6f33R7IRxkItcCh/s1600-h/imagen5.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiLN0-PN5qhQZXhsIc8zuTWH8lPf9fhDkaxGVCLLBP9lzSkDEF0FDHl_cNUNIYzHNRftyql8J2jWGVWqvpMigrMb7jqcuiwqZktJ8bwvhR212U624waBpjLeO5M6v4YM6f33R7IRxkItcCh/s320/imagen5.png" alt="" id="BLOGGER_PHOTO_ID_5259446436778789554" border="0" /></a><br />Saludos !!!Daniel Dario Morales Salashttp://www.blogger.com/profile/07642586501018157497noreply@blogger.com0tag:blogger.com,1999:blog-1421033339681316542.post-15761556684067111562008-07-13T01:00:00.023-04:002008-07-13T03:10:19.309-04:00VPN segura en openSUSE 11.0 y Windows XP con openVPN<div style="text-align: justify;">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).<br /></div><div style="text-align: justify;"><div style="text-align: justify;"><br />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.<br /><br />Si tienen aportes a la guía con gusto la actualizaré, la idea es que nos sirva a todos.<br /><br />Agradeceré cualquier comentario constructivo.<br /></div><br /><span style="font-size:130%;"><span style="font-weight: bold;">Índice de contenido</span></span><br /><br /><span style=";font-family:verdana;font-size:78%;" >Resumen<br /></span><span style=";font-family:verdana;font-size:78%;" ><span style="font-weight: bold;">1</span> Introducción<br /></span><span style=";font-family:verdana;font-size:78%;" ><span style="font-weight: bold;">1.1</span> Objetivos generales<br /></span><span style=";font-family:verdana;font-size:78%;" ><span style="font-weight: bold;">1.2</span> Objetivos específicos<br /></span><span style=";font-family:verdana;font-size:78%;" ><span style="font-weight: bold;">1.3</span> Conceptos generales<br /></span><span style=";font-family:verdana;font-size:78%;" ><span style="font-weight: bold;">2</span> Requerimientos<br /></span><span style=";font-family:verdana;font-size:78%;" ><span style="font-weight: bold;">3</span> Instalación<br /></span><span style=";font-family:verdana;font-size:78%;" ><span style="font-weight: bold;">4</span> Generación de llave y certificado maestro para unidad certificadora<br /></span><span style=";font-family:verdana;font-size:78%;" ><span style="font-weight: bold;">5</span> Generación de llave y certificado para el servidor<br /></span><span style=";font-family:verdana;font-size:78%;" ><span style="font-weight: bold;">6</span> Generación de llave y certificado para el cliente<br /></span><span style=";font-family:verdana;font-size:78%;" ><span style="font-weight: bold;">7</span> Generación de firma HMAC tls-auth<br /><span style="font-weight: bold;">7.1</span> Servidor<br /><span style="font-weight: bold;">7.2</span> Cliente<br /></span><span style=";font-family:verdana;font-size:78%;" ><span style="font-weight: bold;">8</span> Resumen de archivos creados<br /></span><span style=";font-family:verdana;font-size:78%;" ><span style="font-weight: bold;">9</span> Configuración del servidor y el cliente<br /><span style="font-weight: bold;">9.1</span> Servidor<br /><span style="font-weight: bold;">9.1.1</span> Dando acceso a los clientes a la red local del servidor<br /><span style="font-weight: bold;">9.1.2</span> Subnet a Subnet<br /><span style="font-weight: bold;">9.2</span> Cliente (openSUSE 11.0)<br /><span style="font-weight: bold;">9.2.1</span> Sin control del usuario<br /><span style="font-weight: bold;">9.2.2</span> Con control del usuario<br /><span style="font-weight: bold;">9.3</span> Cliente (Windows XP)<br /><span style="font-weight: bold;">10</span> Revocar certificados<br /><span style="font-weight: bold;">11</span> Conclusiones<br /><span style="font-weight: bold;">12</span> Anexos</span><br /><span style="font-size:100%;"></span><br /><span style="font-weight: bold;font-size:130%;" >Resumen</span><br /><br />Este documento explica paso a paso la instalación y configuración de una VPN segura utilizando el software openVPN.<br /><br />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.<br /><br />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.<br /><br />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.<br /><br />También se mostrará cómo agregar seguridad extra gracias a la firma HMAC tls-auth y revocación de certificados.<br /><br />Este documento es una adaptación de la guía de <span style="font-weight: bold;">Jorge Armando Medina</span> de openVPN para Slackware del 2006-05-03 (<a href="http://tuxjm.net/docs/openvpn-como4slack/index.html">http://tuxjm.net/docs/openvpn-como4slack/index.html</a>) a openSUSE 11.0 (servidor y cliente) y Windows XP (cliente) al 2008-07-13.<br /><br /><span style="font-size:130%;"><span style="font-weight: bold;">1 Introducción</span></span><br /><br />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.<br /><br />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).<br /><br />En este documento se tratarán las VPN seguras utilizando openVPN.<br /><br /><span style="font-size:130%;"><span style="font-weight: bold;">1.1 Objetivos generales</span></span><br /><br />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.<br /><br /><span style="font-size:130%;"><span style="font-weight: bold;">1.2 Objetivos específicos</span></span><br /><br /><ul><li>Montar un servidor openVPN en el sistema operativo openSUSE 11.0.</li></ul>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.<br /><ul><li>Montar un cliente openVPN en el sistema operativo openSUSE 11.0.</li></ul>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.<br /><ul><li>Montar un cliente openVPN en el sistema operativo Windows XP.</li></ul>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.<br /><br /><span style="font-size:130%;"><span style="font-weight: bold;">1.3 Conceptos generales</span></span><br /><br />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.<br /><br />Para generar los certificados y llaves necesitamos una unidad certificadora, denominada CA (<span style="font-weight: bold;">C</span>ertificate <span style="font-weight: bold;">A</span>uthority). Esta CA necesita un certificado y llave maestro para generar los archivos para el servidor y clientes.<br /><br />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.<br /><br />Para generar las llaves privadas se utiliza el protocolo Diffie Hellman (<a href="http://es.wikipedia.org/wiki/Diffie-Hellman">http://es.wikipedia.org/wiki/Diffie-Hellman</a>), 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.<br /><br />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).<br /><br />OpenVPN hace uso de interfaces TUN (<a href="http://en.wikipedia.org/wiki/TUN/TAP">http://en.wikipedia.org/wiki/TUN/TAP</a>) 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.<br /><br />Para poder hacer uso de una interfaz virtual sin que entorpezca a la interfaz real (eth0 por ejemplo) se utiliza un <span style="font-weight: bold;">bridge</span>. 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.<br /><br /><br />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.<br /><br />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.<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjUVWrjNJySwWJ57PqepYzx4RzWsFvbYaC60S7W-kZ-XphZnsxW2QO02lYqhRmImlUcdJ3g7lJBnX9nkPyjObeyfaX3v5HSRrl27hLQZs3yYwMiyhOBflk_Dkaa7Guoo2tpDqbH-BCaydRU/s1600-h/bridge.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjUVWrjNJySwWJ57PqepYzx4RzWsFvbYaC60S7W-kZ-XphZnsxW2QO02lYqhRmImlUcdJ3g7lJBnX9nkPyjObeyfaX3v5HSRrl27hLQZs3yYwMiyhOBflk_Dkaa7Guoo2tpDqbH-BCaydRU/s320/bridge.png" alt="" id="BLOGGER_PHOTO_ID_5222368197755745058" border="0" /></a><br />OpenVPN crea, de fábrica, una subred en el dominio 10.8.0.0/24.<br /><br /><span style="font-size:130%;"><span style="font-weight: bold;">2 Requerimientos</span></span><br /><br />El sistema operativo utilizado es openSUSE 11.0 (<a href="http://www.opensuse.org/">http://www.opensuse.org</a>), otras distribuciones o sistemas operativos también pueden funcionar siempre y cuando openVPN (<a href="http://openvpn.net/">http://openvpn.net</a>) 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.<br /><br />Para el servidor (openSUSE 11.0) se requiere instalar:<br /><ul><li>OpenVPN 2.0.9</li></ul><br />Para el cliente (openSUSE 11.0) se requiere instalar:<br /><ul><li>OpenVPN 2.0.9</li><li>KnetworkManager</li><li>KnetworkManager-openvpn</li></ul><br />Para el cliente (Windows XP) se requiere instalar:<br /><ul><li>OpenVPN 2.0.9</li><li>OpenVPN-gui 1.0.3</li></ul><br />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.<br /><br />Para agregar los repositorios abrimos <span style="font-style: italic;">YaST → Software → Repositorios de software → Añadir → Repositorios de la comunidad</span> y ahí seleccionamos los que consideremos necesarios.<br /><br /><span style="font-size:130%;"> <span style="font-weight: bold;">3 Instalación</span></span><br /><br />En el caso de openSUSE, tanto para el servidor como el cliente hay que utilizar <span style="font-style: italic;">YaST → Software → Instalar/Desinstalar software</span> para instalar <span style="font-weight: bold;">openVPN</span>, el cual viene en el DVD.<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiW7zNdJagfUdCTbkgbVJGoRAArMwPykDnVoobkFy6QyqVO2BWGcOatB0qjG8DwZqKn0PzrjiNPWbhhIL66Tv1VKeH0DVb4We2drYP3BllYqvrijEXeOVQU661WOQpcAL8uSjvn9VFHQlOC/s1600-h/openvpn-opensuse-instalacion"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiW7zNdJagfUdCTbkgbVJGoRAArMwPykDnVoobkFy6QyqVO2BWGcOatB0qjG8DwZqKn0PzrjiNPWbhhIL66Tv1VKeH0DVb4We2drYP3BllYqvrijEXeOVQU661WOQpcAL8uSjvn9VFHQlOC/s320/openvpn-opensuse-instalacion" alt="" id="BLOGGER_PHOTO_ID_5222369071884612066" border="0" /></a><br />En el caso de Windows XP podemos ir a <a href="http://openvpn.se/">http://openvpn.se</a> y descargar <span style="font-weight: bold;">openVPN 2.0.9</span> y <span style="font-weight: bold;">openVPN-gui 1.03</span> en el mismo paquete e instalarlo, si lo queremos en español entonces, además del paquete anterior, descargamos <span style="font-weight: bold;">openvpn-gui-1.0.3-es</span> y lo copiamos al directorio bin de instalación de openVPN (C:\Archivos de programa\OpenVPN\bin).<br /><br /><span style="font-size:130%;"><span style="font-weight: bold;">4 Generación de llave y certificado para la unidad certificadora</span></span><br /><br />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/<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgyilP_cxVc7oI2nfb1o5nE2g1gooD6ifxdOmVFgL6RBfzwRzcz0E1VYqEbfr1GlgBYiSaoOtRVdEAdUpFm_2bdwFMYyb3BenlnwUAOCRV3JI-SKOCo_PU3GX40wCUttayqLdT_ocoD9lyL/s1600-h/scripts-easy-rsa.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgyilP_cxVc7oI2nfb1o5nE2g1gooD6ifxdOmVFgL6RBfzwRzcz0E1VYqEbfr1GlgBYiSaoOtRVdEAdUpFm_2bdwFMYyb3BenlnwUAOCRV3JI-SKOCo_PU3GX40wCUttayqLdT_ocoD9lyL/s320/scripts-easy-rsa.png" alt="" id="BLOGGER_PHOTO_ID_5222371290422845954" border="0" /></a><br />y debemos copiarlos al siguiente directorio <span style="font-weight: bold;">/etc/openvpn/easy-rsa-V2.0/</span> el cual debemos crear previamente, para esto como usuario root escribimos lo siguiente en la consola:<br /><blockquote>#mkdir /etc/openvpn/easy-rsa-V2.0/</blockquote><br />y luego copiamos los scripts al directorio recién creado:<br /><blockquote>#cp /usr/share/openvpn/easy-rsa/2.0/* /etc/openvpn/easy-rsa-V2.0</blockquote><br />luego crearemos el directorio keys dentro del directorio previamente creado:<br /><blockquote>#mkdir -p /etc/openvpn/easy-rsa-V2.0/keys</blockquote><br />y tendremos el directorio listo para configurar como se ve en la siguiente imagen:<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg-4jDyrPGpnGjfmwHwuJH_2ySkaFJj3UL_0jI3OGl6KxsYT5A-pX4Bh2tepIttsAOpFBcJ6-giSd2pZxy8P2IrRwS52QD2zofHtnLiDS192px565aw4qcAYtoqdkYYMmcDbGzFgCWmKQE7/s1600-h/scripts-easy-rsa-final.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg-4jDyrPGpnGjfmwHwuJH_2ySkaFJj3UL_0jI3OGl6KxsYT5A-pX4Bh2tepIttsAOpFBcJ6-giSd2pZxy8P2IrRwS52QD2zofHtnLiDS192px565aw4qcAYtoqdkYYMmcDbGzFgCWmKQE7/s320/scripts-easy-rsa-final.png" alt="" id="BLOGGER_PHOTO_ID_5222372245950636498" border="0" /></a><br />De ahora en adelante trabajaremos con los scripts del directorio <span style="font-weight: bold;">/etc/openvpn/easy-rsa-V2.0/</span>.<br /><br />Con el siguiente comando entramos al directorio de trabajo:<br /><blockquote>#cd /etc/openvpn/easy-rsa-V2.0</blockquote><br />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:<br /><blockquote>#kwrite vars</blockquote><br />y bajamos hasta el bloque final donde se exportan las variables que definen a la CA.<br /><blockquote>KEY_COUNTRY<br />KEY_PROVINCE<br />KEY_CITY<br />KEY_ORG<br />KEY_EMAIL</blockquote><br />Éstas variables deben ser definidas según los datos que correspondan a la organización.<br /><br />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.<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgFhHAiK2hLrcDrSe8PV566fU9DWWCjE9kwVOPQp9HtQ4jPAae0yVVZl9foBSBLqtqsGyG8sIvF2k643NYIZVMyjyfgVotWwkkbiaSx9knRJ-NmY9czOw3IJ6i-YcuZIKTX9SXXAqW8yzqi/s1600-h/vars.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgFhHAiK2hLrcDrSe8PV566fU9DWWCjE9kwVOPQp9HtQ4jPAae0yVVZl9foBSBLqtqsGyG8sIvF2k643NYIZVMyjyfgVotWwkkbiaSx9knRJ-NmY9czOw3IJ6i-YcuZIKTX9SXXAqW8yzqi/s320/vars.png" alt="" id="BLOGGER_PHOTO_ID_5222372711754169282" border="0" /></a><br />Una vez definidas las variables ejecutamos el siguiente comando:<br /><blockquote>#source ./vars</blockquote><br />si todo sale bien deberíamos obtener la siguiente salida:<br /><br /><blockquote>NOTE: If you run ./clean-all, I will be doing a rm -rf on<br />/etc/openvpn/easy-rsa-V2.0/keys</blockquote><br /><br />Ahora generaremos los parámetros <span style="font-style: italic;">Diffie Hellman</span> para lo cual simplemente ejecutamos el archivo build-dh:<br /><blockquote>#./build-dh</blockquote><br />y si todo sale bien deberíamos ver la siguiente salida:<br /><blockquote>Generating DH parameters, 1024 bit long safe prime, generator 2<br />This is going to take a long time<br />......+.+..............+...................................................................<br />....+...........................+................................+.........................<br />...........+.......................................+......................+................<br />............................+................................................................<br />..............................................................+..............................<br />.....................+...........................................+..........................<br />........................+....................................................................<br />+........................+..........................................+......................<br />................................................+....+......................................<br />..............................................................................................<br />....................................+........................................................<br />.................................................+......+...............................+..<br />..............+........................................+....................................<br />+........................+..........++*++*++*</blockquote><br />tal como se ve en la siguiente imagen:<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgCSfBvuta220w5yGPmzJi8AGTrCTCoM_Wd2oisL09Q-AL3wwsP_8mQaHG-vpjT3OndaoQtU6tKifMNejXq1GJjTgZ2JjJfrwoLon94qXfOMuddGHslXJe0vvUia5nRfQxOwrSpxN4heZsL/s1600-h/build-dh.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgCSfBvuta220w5yGPmzJi8AGTrCTCoM_Wd2oisL09Q-AL3wwsP_8mQaHG-vpjT3OndaoQtU6tKifMNejXq1GJjTgZ2JjJfrwoLon94qXfOMuddGHslXJe0vvUia5nRfQxOwrSpxN4heZsL/s320/build-dh.png" alt="" id="BLOGGER_PHOTO_ID_5222373598035786594" border="0" /></a><br />Ahora crearemos el certificado para la CA, para esto escribimos en consola el siguiente comando:<br /><blockquote>#./pkitool --initca</blockquote><br />con lo cual debemos obtener la siguiente salida:<br /><blockquote>Using CA Common Name: Metalklesk's enterprise CA<br />Generating a 1024 bit RSA private key<br />........................................++++++<br />......++++++<br />writing new private key to 'ca.key'<br />-----</blockquote><br />tal como se ve en la siguiente imagen:<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhuQ3GMHg56YCtMDPFl_jKDa3zC0pY5_vXHeJySos5y5tY-DA5xHMNMRPp9gvlMjvZNXzYqEacJvFUbBvvJzJyyD5BtWRqJ-9DxfbLYMH0hvCe9mvt7M0C9nYPdXj1I8zL-osxcp1o7sAf_/s1600-h/initca.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhuQ3GMHg56YCtMDPFl_jKDa3zC0pY5_vXHeJySos5y5tY-DA5xHMNMRPp9gvlMjvZNXzYqEacJvFUbBvvJzJyyD5BtWRqJ-9DxfbLYMH0hvCe9mvt7M0C9nYPdXj1I8zL-osxcp1o7sAf_/s320/initca.png" alt="" id="BLOGGER_PHOTO_ID_5222373948129376082" border="0" /></a><br /><span style="font-size:130%;"><span style="font-weight: bold;">5 Generación de llave y certificado para el servidor</span></span><br /><br />Para esta tarea escribimos el siguiente comando en la consola:<br /><blockquote>#./pkitool --server servidor</blockquote><br />con lo cual obtendremos una salida parecida a la siguiente:<br /><blockquote>Generating a 1024 bit RSA private key<br />............++++++<br />...++++++<br />writing new private key to 'servidor.key'<br />-----<br />Using configuration from /etc/openvpn/easy-rsa-V2.0/openssl.cnf<br />Check that the request matches the signature<br />Signature ok<br />The Subject's Distinguished Name is as follows<br />countryName :PRINTABLE:'CL'<br />stateOrProvinceName :PRINTABLE:'RM'<br />localityName :PRINTABLE:'Santiago'<br />organizationName :PRINTABLE:'Metalklesk's enterprise'<br />commonName :PRINTABLE:'servidor'<br />emailAddress :IA5STRING:'damorales@gmail.com'<br />Certificate is to be certified until Jul 6 01:08:42 2018 GMT (3650 days)<br /><br />Write out database with 1 new entries<br />Data Base Updated</blockquote><br />tal como se ve en la siguiente imagen:<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgLJFhW4Xoc3qiOm_2gSX0bH6T6SfVkPC_hlHXq8Qa0VAVx44-wHr1kSsRU4G-g-B2gWjyocqdFfNgw2_jSrnpE46lslG340Z2XhuFAL1pNZF3-tWFH135UJUgk64xFhGWilEGJpigQgD35/s1600-h/server-cert.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgLJFhW4Xoc3qiOm_2gSX0bH6T6SfVkPC_hlHXq8Qa0VAVx44-wHr1kSsRU4G-g-B2gWjyocqdFfNgw2_jSrnpE46lslG340Z2XhuFAL1pNZF3-tWFH135UJUgk64xFhGWilEGJpigQgD35/s320/server-cert.png" alt="" id="BLOGGER_PHOTO_ID_5222374449462845938" border="0" /></a><br />Con lo anterior tenemos la unidad certificadora CA y el servidor listos (ambos en el mismo equipo).<br /><br /><span style="font-size:130%;"><span style="font-weight: bold;">6 Generación de llave y certificado para el cliente</span></span><br /><br />Para generar el certificado y llave para un cliente escribimos en la consola el siguiente comando:<br /><blockquote>#./pkitool cliente1</blockquote><br />de lo cual obtendremos una salida parecida a la siguiente:<br /><blockquote>Generating a 1024 bit RSA private key<br />...............++++++<br />............................................++++++<br />writing new private key to 'cliente1.key'<br />-----<br />Using configuration from /etc/openvpn/easy-rsa-V2.0/openssl.cnf<br />Check that the request matches the signature<br />Signature ok<br />The Subject's Distinguished Name is as follows<br />countryName :PRINTABLE:'CL'<br />stateOrProvinceName :PRINTABLE:'RM'<br />localityName :PRINTABLE:'Santiago'<br />organizationName :PRINTABLE:'Metalklesk's enterprise'<br />commonName :PRINTABLE:'cliente1'<br />emailAddress :IA5STRING:'damorales@gmail.com'<br />Certificate is to be certified until Jul 6 01:13:40 2018 GMT (3650 days)<br /><br />Write out database with 1 new entries<br />Data Base Updated</blockquote><br />tal como se ve en la siguiente imagen:<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgOfxddyoEtg7kFSAiHUWAg0lG8D8KdczjpYUs1qgbOQMjPagxms3LqKZ9few1Ksfp0EiU3ocw8NvuvVhfIsYtEmb5nTJs4DKbPSxDoXWWf2Le3Ey_EjN88BvW66GxEt4WU-Bjq9Q5_pmNB/s1600-h/client-cert.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgOfxddyoEtg7kFSAiHUWAg0lG8D8KdczjpYUs1qgbOQMjPagxms3LqKZ9few1Ksfp0EiU3ocw8NvuvVhfIsYtEmb5nTJs4DKbPSxDoXWWf2Le3Ey_EjN88BvW66GxEt4WU-Bjq9Q5_pmNB/s320/client-cert.png" alt="" id="BLOGGER_PHOTO_ID_5222375016466448786" border="0" /></a><br />Cada vez que se quiera agregar un nuevo cliente ejecutamos el comando<br /><blockquote>#source ./vars</blockquote><br />y luego<br /><blockquote>#./pkitool clienteN</blockquote><br /><br />No olvidar que antes de agregar un nuevo cliente se debe ejecutar <span style="font-weight: bold;">#source ./vars</span> y luego usar la herramienta <span style="font-weight: bold;">pkitool</span>.<br /><br /><span style="font-weight: bold;">7 Generación de firma HMAC tls-auth</span><br /><br />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:<br /><ul><li>Ataques <span style="font-weight: bold;">DoS</span> (Deny of Service) en el puerto UDP (1194) de openVPN.</li><li>Escaneo de puertos para determinar cual es el puerto UDP del servidor que está a la escucha.</li><li>Vulnerabilidades de desbordamiento de buffer en la implementación SSL/TLS.</li><li>Inicialización de negociaciones SSL/TLS de máquina que no están autorizadas.</li></ul><br />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).<br /><br />Para crear la llave utilizamos el siguiente comando en el lado servidor y como usuario root:<br /><blockquote>#openvpn --genkey --secret ta.key</blockquote><br />La llave creada corresponde a <span style="font-weight: bold;">ta.key</span>. Una vez creada se deben configurar el servidor y los clientes.<br /><br /><span style="font-size:130%;"><span style="font-weight: bold;">7.1 Servidor</span></span><br /><br />En el archivo<span style="font-weight: bold;"> server.conf</span> se debe agregar la siguiente linea:<br /><blockquote>tls-auth ta.key 0</blockquote><br />Si el archivo <span style="font-weight: bold;">ta.key</span> 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).<br /><br /><span style="font-size:130%;"><span style="font-weight: bold;">7.2 Cliente</span></span><br /><br />En el archivo <span style="font-weight: bold;">client.conf</span> (en el caso de openSUSE 11.0) o <span style="font-weight: bold;">client.ovpn</span> (en el caso de Windows XP) se debe agregar la siguiente linea:<br /><blockquote>tls-auth ta.key 1</blockquote><br /><span style="font-size:130%;"><span style="font-weight: bold;">8 Resumen archivos creados</span></span><br /><br />Todos los certificados y llaves que vayamos creando quedarán almacenados en el directorio <span style="font-style: italic;">/etc/openvpn/easy-rsa-V2.0/keys</span>. A continuación podemos ver la lista de archivos creados y visto a lo largo de este documento.<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhkpxcl6rhYQbq8mx3bqqjwf_ughdkZPEHfqmPh3FqjEdgCymenpRedMgzoA6vV4_iyGTUtcBGwFg7eO2PgeJIOJj4eIUfYPhOvA4i9nnVMgzNM5RlWmyer1GPzWjQjQ8JoMIvfioXL6ViD/s1600-h/tabla.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhkpxcl6rhYQbq8mx3bqqjwf_ughdkZPEHfqmPh3FqjEdgCymenpRedMgzoA6vV4_iyGTUtcBGwFg7eO2PgeJIOJj4eIUfYPhOvA4i9nnVMgzNM5RlWmyer1GPzWjQjQ8JoMIvfioXL6ViD/s320/tabla.png" alt="" id="BLOGGER_PHOTO_ID_5222377053662186018" border="0" /></a><br />Nótese que todas las llaves (.key) son privadas mientras que los certificados (.crt) no lo son.<br /><br />Ahora es necesario pasar una copia de los archivos c<span style="font-style: italic;">a.crt, cliente1.crt, cliente1.key y ta.key</span> al <span style="font-weight: bold;">cliente 1</span> a través de algún medio seguro como <span style="font-weight: bold;">ssh</span> u otro mecanismo que estimemos como seguro y conveniente.<br /><br />Podemos crear una carpeta e introducir los archivos anteriormente mencionados y luego darles los permisos correspondientes (<span style="font-weight: bold;">755</span>) para luego entregárselos al cliente.<br /><blockquote>#mkdir ~/cliente1<br />#cd keys/<br />#cp -v ca.crt cliente1.crt cliente1.key ta.key ~/cliente1<br />#chmod -R 755 ~/cliente1</blockquote><br /><span style="font-size:130%;"><span style="font-weight: bold;">9 Configuración del servidor y el cliente</span></span><br /><br />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 <span style="font-style: italic;">/usr/share/doc/packages/openvpn/sample-config-files</span>.<br /><br />De dicho directorio nos interesan los archivos <span style="font-weight: bold;">client.conf</span> y <span style="font-weight: bold;">server.conf</span>. 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 <span style="font-style: italic;">/etc/openvpn</span>.<br /><blockquote>#cd /usr/share/doc/packages/openvpn/sample-config-files<br />#cp server.conf /etc/openvpn</blockquote><br /><span style="font-size:130%;"><span style="font-weight: bold;">9.1 Servidor</span></span><br /><br />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<br /><blockquote>#cd /etc/openvpn<br />#kwrite server.conf</blockquote><br />el cual debe quedar así:<br /><blockquote>ca /etc/openvpn/easy-rsa-V2.0/keys/ca.crt<br />cert /etc/openvpn/easy-rsa-V2.0/keys/servidor.crt<br />key /etc/openvpn/easy-rsa-V2.0/keys/servidor.key<br />dh /etc/openvpn/easy-rsa-V2.0/keys/dh1024.pem</blockquote><br />tal como se ve en la siguiente imagen:<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiTDPDp7KZ23vkkPJlQ34UKoc6NO5FNvFAoQWhZG49PLjt42zsGtmGdosdYlACRG9O5EH5LnztRQUvh1u0YcpFi5bErI__T9P7i-7ydgRR4qP5cIKvxzPb8eTq8Isb2yATQURd1Fwmq5ZSZ/s1600-h/server-conf.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiTDPDp7KZ23vkkPJlQ34UKoc6NO5FNvFAoQWhZG49PLjt42zsGtmGdosdYlACRG9O5EH5LnztRQUvh1u0YcpFi5bErI__T9P7i-7ydgRR4qP5cIKvxzPb8eTq8Isb2yATQURd1Fwmq5ZSZ/s320/server-conf.png" alt="" id="BLOGGER_PHOTO_ID_5222378098936605666" border="0" /></a><br />Una vez configurado el servidor solo resta iniciarlo, para esto escribimos en consola:<br /><blockquote>#service openvpn start</blockquote><br />o lo iniciamos desde YaST (<span style="font-style: italic;">YaST → Sistema → Servicios del sistema → activar servicio openvpn</span>) para que al iniciar el sistema automáticamente se inicie el servidor openVPN.<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjSVFkJIf0RedJdH35DzJxWl_qnPwCRXzAsM7APIhodCzsTopPD99xtsSwotf45jrub1BUjZfMGj_NcjyG5_bWIBV43lm4CrYbBvCxC-iX1GdBpjcrOVm5EZ-LFCfZd6nHA0U6yVfgzVAQs/s1600-h/openvpn-opensuse-servidor"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjSVFkJIf0RedJdH35DzJxWl_qnPwCRXzAsM7APIhodCzsTopPD99xtsSwotf45jrub1BUjZfMGj_NcjyG5_bWIBV43lm4CrYbBvCxC-iX1GdBpjcrOVm5EZ-LFCfZd6nHA0U6yVfgzVAQs/s320/openvpn-opensuse-servidor" alt="" id="BLOGGER_PHOTO_ID_5222378393421564338" border="0" /></a><br />Una vez listo solo resta abrir el puerto <span style="font-weight: bold;">1194</span> en el cortafuegos, para esto utilizamos <span style="font-style: italic;">YaST → Seguridad y usuarios → Cortafuegos → Servicios autorizados → Opciones avanzadas</span> y agregamos el puerto 1194 en la entrada <span style="font-weight: bold;">UDP</span>, guardamos y listo.<br /><br />Si no abrimos el puerto en el cortafuegos los clientes no se podrán conectar al servidor openVPN.<br /><br /><span style="font-size:130%;"><span style="font-weight: bold;">9.1.1 Dando acceso a los clientes a la red local</span></span><br /><br />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 <span style="font-weight: bold;">server.conf</span>:<br /><blockquote>push “route subred-local mascara-subred-local”</blockquote><br />en donde <span style="font-weight: bold;">subred-local</span> podría ser <span style="font-style: italic;">192.168.0.0</span> y la <span style="font-weight: bold;">mascara-subred-local</span> podria ser <span style="font-style: italic;">255.255.0.0 </span>quedando así:<br /><blockquote>push “route 192.168.0.0 255.255.0.0”</blockquote><br />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.<br /><br /><span style="font-size:130%;"><span style="font-weight: bold;">9.1.2 Subnet a Subnet</span></span><br /><br />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.<br /><br />Para este ejemplo, asumiremos que la LAN del cliente esta usando la subred <span style="font-weight: bold;">192.168.15.0/24,</span> y que el cliente VPN esta usando un certificado con el common name de <span style="font-weight: bold;">cliente1</span>.<br /><br />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.<br /><br />Antes de configurarlo, hay unos pre requisitos básicos que deben de seguirse:<br /><br />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.<br />El cliente debe de tener un certificado con un <span style="font-style: italic;">Common Name</span> único (cliente1 en nuestro ejemplo), y la directiva <span style="font-weight: bold;">duplicate-cn</span> no debe de ser usada en el archivo de configuración de el servidor OpenVPN (server.conf).<br /><br />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:<br /><blockquote>client-config-dir ccd</blockquote><br />En la directiva de arriba, <span style="font-weight: bold;">ccd</span> 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 <span style="font-style: italic;">/etc/openvpn/</span>. Crearemos el directorio ccd con lo cual nos quedaria:<br /><blockquote>client-config-dir /etc/openvpn/ccd</blockquote><br />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.<br /><br />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:<br /><blockquote>iroute 192.168.15.0/24 255.255.255.0</blockquote><br />Esto le dirá a el servidor openVPN que la subred <span style="font-style: italic;">192.168.15.0/24</span> debe de ser enrutada al <span style="font-style: italic;">cliente1</span>. Después, agregaremos la siguiente linea a el archivo de configuración principal de el servidor (server.conf ):<br /><blockquote>route 192.168.15.0/24 255.255.255.0</blockquote><br />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):<br /><blockquote>client-to-client<br />push “route 192.168.15.0/24 255.255.255.0”</blockquote><br />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.<br /><br /><span style="font-size:130%;"><span style="font-weight: bold;">9.2 Cliente (openSUSE 11.0)</span></span><br /><br />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.<br /><br /><span style="font-size:130%;"><span style="font-weight: bold;">9.2.1 Sin control del usuario</span></span><br /><br />El archivo <span style="font-weight: bold;">client.conf</span> 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 <span style="font-style: italic;">client.conf</span> como se ve a continuación:<br /><blockquote>ca /etc/openvpn/ca.crt<br />cert /etc/openvpn/cliente1.crt<br />key /etc/openvpn/cliente1.key</blockquote><br />Los archivos deben tener los siguientes permisos:<br /><blockquote>ca.crt → 644<br />cliente1.crt → 644<br />cliente1.key → 600</blockquote><br />para lo cual basta escribir lo siguiente en consola:<br /><blockquote>#chmod 644 ca.crt<br />#chmod 644 cliente1.crt<br />#chmod 600 cliente1.key</blockquote><br />y además se debe modificar la siguiente linea:<br /><blockquote>remote my-server-1 1194</blockquote><br />en donde<span style="font-weight: bold;"> my-server-1</span> 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).<br /><br />Ahora solo resta conectarse al servidor, para esto podemos escribir en la consola lo siguiente:<br /><blockquote>#service openvpn start</blockquote><br />y automáticamente se leerá el archivo de configuración (client.conf) y se realizará la conexión.<br /><br />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.<br /><br />Para saber que IP fue asignado al cliente se puede ejecutar el comando (en la máquina cliente):<br /><blockquote>#ifconfig</blockquote><br />el cual arrojará las interfaces de red, donde <span style="font-weight: bold;">tun0</span> corresponde a la asignada por openVPN, la cual tiene una IP que le corresponde.<br /><br /><span style="font-size:130%;"><span style="font-weight: bold;">9.2.2 Con control del usuario</span></span><br /><br />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).<br /><br />Para ésta guía utilizaremos el segundo.<br /><br />Lo primero es instalar KNetworkManager y el plugin KNetworkManager-openVPN, para esto ir a YaST → Software → Instalar/Desinstalar software, escribimos <span style="font-weight: bold;">knetworkmanager</span> y marcamos los paquetes correspondientes para luego instalarlos.<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhuWUgN9FZywpwwdpMMLV9ck5IWZ44O-cuXF4v90xH_r5ecz1LMMRiqMb8D9WY6f3o25znJPa9oMetVTU1hk6vJd9wMYRK9cDm3RLQeROc5Yyxz5b97r61Sc0GLeh49NhIwiVTL6DXhRuA-/s1600-h/knetworkmanager-instalacion"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhuWUgN9FZywpwwdpMMLV9ck5IWZ44O-cuXF4v90xH_r5ecz1LMMRiqMb8D9WY6f3o25znJPa9oMetVTU1hk6vJd9wMYRK9cDm3RLQeROc5Yyxz5b97r61Sc0GLeh49NhIwiVTL6DXhRuA-/s320/knetworkmanager-instalacion" alt="" id="BLOGGER_PHOTO_ID_5222381239475728434" border="0" /></a><br />Una vez instalados debemos configurar la conexión de red para que use <span style="font-weight: bold;">Network Manager</span> en vez del método tradicional <span style="font-weight: bold;">ifup</span> (que viene de fábrica). Para esto vamos a <span style="font-style: italic;">YaST → Dispositivos de red → Ajustes de la red</span>, luego vamos a las <span style="font-weight: bold;">Opciones globales</span> y seleccionamos el uso de <span style="font-weight: bold;">Network Manager</span>, luego finalizamos.<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjYMYVhxRE_73jVydeAck53Z7xoqhG9y-_kBbIDooLTJpBgvB6boYsg9R75SzcFobBCFAyvNZYvsvIFyTehNYItHgdJhv5C2BMy0BCZPMAqsb5SlN90wpBVnE60tbdiyyY5GyNEZhkfifY0/s1600-h/networkmanager-config"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjYMYVhxRE_73jVydeAck53Z7xoqhG9y-_kBbIDooLTJpBgvB6boYsg9R75SzcFobBCFAyvNZYvsvIFyTehNYItHgdJhv5C2BMy0BCZPMAqsb5SlN90wpBVnE60tbdiyyY5GyNEZhkfifY0/s320/networkmanager-config" alt="" id="BLOGGER_PHOTO_ID_5222381623510599874" border="0" /></a><br />Una vez listo ejecutamos <span style="font-weight: bold;">KnetworkManager</span>, nos aparecerá un icono en la bandeja del sistema. Le damos <span style="font-style: italic;">click derecho → Editar conexiones → Nueva conexión → VPN</span>, en <span style="font-weight: bold;">gateway</span> ponemos la dirección IP del servidor openVPN, el <span style="font-weight: bold;">port</span> corresponde al 1194, luego le pasamos el <span style="font-weight: bold;">CA file</span> (ca.crt), el <span style="font-weight: bold;">certificado del cliente</span> (cliente1.crt) y <span style="font-weight: bold;">la llave del cliente</span> (cliente1.key), luego en la pestaña de <span style="font-weight: bold;">información opcional</span> marcamos <span style="font-weight: bold;">Use LZO compression</span>. Luego presionamos siguiente y le damos un nombre a la conexión.<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj3VTENnci_skv-AI4GGmB6c4rTI8JpDN-F4GV7lieFLgCcENRTk6Ez8j8980520WVPQ-LJMJhnUXJrU_YltvDnDMElw2uSIyoD2kOhgISFcfceFiY85WpC1uVMnZ8sYhz-oypPQNx3InDT/s1600-h/knetworkmanager-config1"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj3VTENnci_skv-AI4GGmB6c4rTI8JpDN-F4GV7lieFLgCcENRTk6Ez8j8980520WVPQ-LJMJhnUXJrU_YltvDnDMElw2uSIyoD2kOhgISFcfceFiY85WpC1uVMnZ8sYhz-oypPQNx3InDT/s320/knetworkmanager-config1" alt="" id="BLOGGER_PHOTO_ID_5222382104949534018" border="0" /></a><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgOEUS6ji-QvmP03Ar4UqwmVxlV4E5QyKkeMoQl3_AgphSsAB2xBzCvyj57er47ilzcS1GoAM4-xAmdlPC0G-hI10f8Zb_naMkfGeYNExj50V1bWQIIuYc0Ha9vzr-CDBibXIzLWiky8sB-/s1600-h/knetworkmanager-config2"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgOEUS6ji-QvmP03Ar4UqwmVxlV4E5QyKkeMoQl3_AgphSsAB2xBzCvyj57er47ilzcS1GoAM4-xAmdlPC0G-hI10f8Zb_naMkfGeYNExj50V1bWQIIuYc0Ha9vzr-CDBibXIzLWiky8sB-/s320/knetworkmanager-config2" alt="" id="BLOGGER_PHOTO_ID_5222382105541530930" border="0" /></a><br />Una vez listo guardamos. Ahora para conectarnos hacemos click derecho en el icono de <span style="font-style: italic;">KnetworkManager → Iniciar conexión VPN</span> y pinchamos el nombre de nuestra conexión, nos pedirá una contraseña, puede ser cualquier cosa y aceptamos.<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiKbg8w-PZRkIlMzL9yHIe0OkFd7GASiiITtADali-9y2_zcW2rv-LEJmzDY2cLuKDkGDbf3cXbPl4-UO0-6oDZ6IPqx5S91yV_QZhHot-sOTamjnNxVTfCVzghWXrM0eRMcEb6PUhpNE5W/s1600-h/knetworkmanager-conectar1"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiKbg8w-PZRkIlMzL9yHIe0OkFd7GASiiITtADali-9y2_zcW2rv-LEJmzDY2cLuKDkGDbf3cXbPl4-UO0-6oDZ6IPqx5S91yV_QZhHot-sOTamjnNxVTfCVzghWXrM0eRMcEb6PUhpNE5W/s320/knetworkmanager-conectar1" alt="" id="BLOGGER_PHOTO_ID_5222382454192467154" border="0" /></a><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjRFb1rX_8iv5A032xTRixmNrxfKUr24FGPX0m-PJersTBRxGvAt5TKyEHVK037oA4O8XVJA0M_0HoubV3z6sWCxPgL70nJRdOnuJEbFpaD4aHrpTssJY7flOfEwI9nfwvUOg-Bb_frZYOF/s1600-h/knetworkmanager-conectar2"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjRFb1rX_8iv5A032xTRixmNrxfKUr24FGPX0m-PJersTBRxGvAt5TKyEHVK037oA4O8XVJA0M_0HoubV3z6sWCxPgL70nJRdOnuJEbFpaD4aHrpTssJY7flOfEwI9nfwvUOg-Bb_frZYOF/s320/knetworkmanager-conectar2" alt="" id="BLOGGER_PHOTO_ID_5222382454882497122" border="0" /></a><br /><br />Ahora para comprobar que nos hemos conectado abrimos una consola y escribimos (como usuario root):<br /><blockquote>#ifconfig</blockquote><br />y veremos que se a agregado la interfaz <span style="font-weight: bold;">tun0</span>.<br /><br />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.<br /><br /><span style="font-size:130%;"><span style="font-weight: bold;">9.3 Cliente (Windows XP)</span></span><br /><br />En el caso de Windows XP se debe instalar openVPN y openVPN-GUI (<a href="http://openvpn.se/">http://openvpn.se</a>). Una vez instalados copiamos los archivos entregados por el servidor (ca.crt, cliente1.crt y cliente1.key) a el directorio que queramos, por ejemplo <span style="font-style: italic;">C:\\keys</span>.<br /><br />Una vez ahí vamos al directorio <span style="font-style: italic;">C:\Archivos de programa\OpenVPN\sample-config</span> y copiamos el archivo <span style="font-weight: bold;">client.ovpn</span> a <span style="font-weight: bold;">C:\Archivos de programa\OpenVPN\config</span>.<br /><br />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í:<br /><blockquote>ca C:\\keys\\ca.crt<br />cert C:\\keys\\cliente1.crt<br />key C:\\keys\\cliente1.key </blockquote><br />luego modificamos la linea que dice:<br /><blockquote>remote my-server-1 1194</blockquote><br />donde cambiamos <span style="font-weight: bold;">my-server-1</span> 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).<br /><br />Una vez listo guardamos el archivo y ejecutamos <span style="font-weight: bold;">openvpn-gui.exe</span> (se encuentra en la carpeta <span style="font-weight: bold;">bin</span> en el directorio de instalación de openVPN).<br /><br />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:<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhv2bE2yOED05Fy_Ri7Z76HZgcniM6eDSlnkKtIsrE48J2Dw63QO6ZWJ-TfsjY0V4OMiqDYQGPAc6hQxpfGKymXpJd3u60Fas0lMCJ-lcxBOoIUL4ds13DXTtiG6CK3qksCGfrC3VtRCGWt/s1600-h/openvpn-win-conectar"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhv2bE2yOED05Fy_Ri7Z76HZgcniM6eDSlnkKtIsrE48J2Dw63QO6ZWJ-TfsjY0V4OMiqDYQGPAc6hQxpfGKymXpJd3u60Fas0lMCJ-lcxBOoIUL4ds13DXTtiG6CK3qksCGfrC3VtRCGWt/s320/openvpn-win-conectar" alt="" id="BLOGGER_PHOTO_ID_5222383374728217010" border="0" /></a><br />al pinchar conectar aparecerá una consola mostrando algunos datos y al finalizar aparecerá un mensaje avisando que la conexión se ha realizado:<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiWTwG9xdCnTOsqqqqs8mENeVeFl4hu1xtnDE11pILfpYqH_Rbjtbqi-i9lJhX1sJuLH7docwPO2_enhCrX_1a0YyifKFpvNUn5TpibpkdUXe1NToHWUt8jabgPXVdptmhILW8FA_D47wzX/s1600-h/openvpn-win-conectado"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiWTwG9xdCnTOsqqqqs8mENeVeFl4hu1xtnDE11pILfpYqH_Rbjtbqi-i9lJhX1sJuLH7docwPO2_enhCrX_1a0YyifKFpvNUn5TpibpkdUXe1NToHWUt8jabgPXVdptmhILW8FA_D47wzX/s320/openvpn-win-conectado" alt="" id="BLOGGER_PHOTO_ID_5222383373675477202" border="0" /></a><br />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.<br /><br /><span style="font-size:130%;"><span style="font-weight: bold;">10 Revocar certificados</span></span><br /><br />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).<br /><br />Las razones típicas para querer remover un certificado incluyen:<br /><br /><ul><li>La llave privada asociada con el certificado esta comprometida o robada.</li><li>El usuario de una llave privada cifrada olvidó la contraseña de la llave.</li><li>Se quiere terminar el acceso a la VPN para un usuario.</li></ul><br />Como un ejemplo, revocaremos el certificado <span style="font-weight: bold;">cliente1</span> (el mismo que creamos anteriormente). En una consola y como usuario root entramos al directorio <span style="font-weight: bold;">easy-rsa-V2.0</span><br /><blockquote>#cd /etc/openvpn/easy-rsa-V2.0</blockquote><br />luego reiniciamos las variables de openVPN:<br /><blockquote>#source ./vars</blockquote><br />y luego escribimos el siguiente comando:<br /><blockquote>#./revoke-full cliente1</blockquote><br />con lo cual deberíamos obtener una salida como ésta:<br /><blockquote>Using configuration from /etc/openvpn/easy-rsa-V2.0/openssl.cnf<br />Revoking Certificate 02.<br />Data Base Updated<br />Using configuration from /etc/openvpn/easy-rsa-V2.0/openssl.cnf<br />cliente1.crt: /C=CL/ST=RM/L=Santiago/O=Metalklesk's enterprise/CN=cliente1/emailAddress=damorales@gmail.com<br />error 23 at 0 depth lookup:certificate revoked</blockquote><br />tal como se puede ver en la siguiente imagen:<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjbeQrVQusP-x0pMo00XgFP2bkwbhcTvZ15cRih5fJ8D5e1rONeJqVT3Z8ouqAyMkYLSRam1AzVzO2v_cb9jxfb2Lzu6RUpwGr5WzzoXIY21rLFr3xmUB9S_1qonnt3hJfds-nxz9dCfVOv/s1600-h/revoke2.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjbeQrVQusP-x0pMo00XgFP2bkwbhcTvZ15cRih5fJ8D5e1rONeJqVT3Z8ouqAyMkYLSRam1AzVzO2v_cb9jxfb2Lzu6RUpwGr5WzzoXIY21rLFr3xmUB9S_1qonnt3hJfds-nxz9dCfVOv/s320/revoke2.png" alt="" id="BLOGGER_PHOTO_ID_5222384233908248002" border="0" /></a><br />Es probable que el último comando anterior no nos resulte y obtengamos la siguiente salida de error:<br /><blockquote>Using configuration from /etc/openvpn/easy-rsa-V2.0/openssl.cnf<br />error on line 282 of config file '/etc/openvpn/easy-rsa-V2.0/openssl.cnf'<br />16431:error:0E065068:configuration file routines:STR_COPY:variable has no value:conf_def.c:629:line 282<br />Using configuration from /etc/openvpn/easy-rsa-V2.0/openssl.cnf<br />error on line 282 of config file '/etc/openvpn/easy-rsa-V2.0/openssl.cnf'<br />16432:error:0E065068:configuration file routines:STR_COPY:variable has no value:conf_def.c:629:line 282<br />cat: crl.pem: No existe el fichero o el directorio<br />cliente1.crt: /C=CL/ST=RM/L=Santiago/O=Metalklesk's enterprise/CN=cliente1/emailAddress=damorales@gmail.com<br />error 3 at 0 depth lookup:unable to get certificate CRL</blockquote><br />tal como vemos en la siguiente imagen:<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjy-d0yR2T6W37rm2O6XpkpOMzgqlBp4Zgkq_SF9Bj_Cr9vqyLLhKlVMj_ibTHrBGTzGi56Un-wF_nb8HXFbNxghJW4X1RydBR99SmD1vYbDh1QWk7sVo3eHDkf-VFs2OwgG-CRmR9Anfsf/s1600-h/revoke2.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjy-d0yR2T6W37rm2O6XpkpOMzgqlBp4Zgkq_SF9Bj_Cr9vqyLLhKlVMj_ibTHrBGTzGi56Un-wF_nb8HXFbNxghJW4X1RydBR99SmD1vYbDh1QWk7sVo3eHDkf-VFs2OwgG-CRmR9Anfsf/s320/revoke2.png" alt="" id="BLOGGER_PHOTO_ID_5222384495664226626" border="0" /></a><br />De ser así debemos abrir el archivo <span style="font-weight: bold;">/etc/openvpn/easy-rsa-V2.0/openssl.cnf</span> (como usuario root) y comentar la ultima sección como se puede ver a continuación:<br /><blockquote>#[ pkcs11_section ]<br />#engine_id = pkcs11<br />#dynamic_path = /usr/lib/engines/engine_pkcs11.so<br />#MODULE_PATH = $ENV::PKCS11_MODULE_PATH<br />#PIN = $ENV::PKCS11_PIN<br />#init = 0</blockquote><br />tal como podemos ver en la siguiente imagen:<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEijbjji4IwsLFu5P4pE-EEJwtuRTUjoyillQQCyMhjKbMyQgeI7mAj989ElQkPrjDxkK5i-lyq6vv3_1_PTkw6beNdTw08nBn9U-r_rLr1L2xqSobnP__XfSvWLldhtArwoBJGzJz8pDmg2/s1600-h/openssl.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEijbjji4IwsLFu5P4pE-EEJwtuRTUjoyillQQCyMhjKbMyQgeI7mAj989ElQkPrjDxkK5i-lyq6vv3_1_PTkw6beNdTw08nBn9U-r_rLr1L2xqSobnP__XfSvWLldhtArwoBJGzJz8pDmg2/s320/openssl.png" alt="" id="BLOGGER_PHOTO_ID_5222384757548060274" border="0" /></a><br />Y luego intentar de nuevo.<br /><br />Al ejecutar el comando <span style="font-weight: bold;">revoke-full</span> se ha creado un archivo <span style="font-weight: bold;">CRL</span> (<span style="font-weight: bold;">C</span>ertificate <span style="font-weight: bold;">R</span>evocation <span style="font-weight: bold;">L</span>ist) llamado <span style="font-weight: bold;">crl.pem</span> en el directorio <span style="font-weight: bold;">keys</span> de openVPN.<br /><br />Este archivo debe ser referenciado en el servidor openVPN en el archivo<span style="font-weight: bold;"> server.conf</span>:<br /><blockquote>crl-verify /etc/openvpn/keys/crl.pem</blockquote><br />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.<br /><br /><span style="font-weight: bold; font-style: italic;">Algunas notas sobre CRL</span>:<br /><br /><ul><li>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.</li><li>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).</li><li>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.</li><li>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.</li><li>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.</li></ul><br /><span style="font-size:130%;"><span style="font-weight: bold;">11 Conclusiones</span></span><br /><br />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.<br /><br />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.<br /><br />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.<br /><br />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.<br /><br />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.<br /><br />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.<br /><br /><span style="font-size:130%;"><span style="font-weight: bold;">12 Anexos</span></span><br /><br /><a href="http://tuxjm.net/docs/openvpn-como4slack/index.html">http://tuxjm.net/docs/openvpn-como4slack/index.html</a><br /><a href="http://openvpn.net/">http://openvpn.net/</a><br /><br /><span style="font-size:180%;"><span style="font-weight: bold;">EXTRA !!!</span></span><br /><br />Este documento lo pueden descargar en formato <a href="http://mihd.net/rqajbnl">ODT</a> y <a href="http://mihd.net/ej6810h">PDF</a> para que lo puedan leer y modificar a gusto. Este documento está bajo licencia <a href="http://www.gnu.org/licenses/gpl-3.0.html">GPL 3</a>.<br /><br />Espero les sea de utilidad.<br /><br />Saludos !!!<br /></div>Daniel Dario Morales Salashttp://www.blogger.com/profile/07642586501018157497noreply@blogger.com19tag:blogger.com,1999:blog-1421033339681316542.post-65501115524987886212008-06-05T01:22:00.012-04:002008-06-12T01:42:25.223-04:00ComboBox en JMaki con NetBeans 6.1, publish and suscribe<div style="text-align: justify;">Ayer un amigo lector de éste blog me envió un correo preguntando como lo podía hacer para obtener el valor de un <a href="https://ajax.dev.java.net/">Widget JMaki ComboBox</a>, ya que él había probado el método que expliqué en <a href="http://metalklesk.blogspot.com/2008/05/demo-sistema-reclamos-ajax-servlet-jsp.html">ésta</a> 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.<br /><br />El método corresponde al siguiente:<br /><br /><code><br />var fecha = jmaki.getWidget('fecha').getValue();<br /></code><br /><br />pero este retorna el label del combobox y no el value.<br /><br />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.<br /><br />El nombre corresponde al label o etiqueta y el código corresponde al value o valor.<br /><br />Entonces me dispuse a leer varios sitios y en el el sitio oficial de jmaki encontré la respuesta (era lo mas lógico verdad ??).<br /><br />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.<br /><br />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.<br /><br />El <span style="font-weight: bold;">Bean</span> (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.<br /><br /><code><br />protected String[] paises= new String[] { "Chile", "Argentina", "España", "Estados Unidos"};<br /><br /><br />protected String[] codigoPaises = new String[] { "CL", "AR", "ES", "US" };<br /></code><br /><br />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 <span style="font-weight: bold;">JSON</span>. Esto lo hacemos de la siguiente forma:<br /><br /><code><br />public String getPaises() throws JSONException {<br /><br /> JSONArray datosPaises = new JSONArray();<br /><br /> JSONObject datosPais = new JSONObject();<br /><br /> for (int loop = 0; loop < paises.length; loop++) {<br /><br /> datosPais.put("label", paises[loop]);<br /><br /> datosPais.put("value", codigoPaises[loop]);<br /><br /> datosPaises.put(datosPais);<br /><br /> datosPais = new JSONObject();<br /><br /> }<br /><br /> return jsonArrayToString(datosPaises, new StringBuffer());<br /><br /> }<br /></code><br /><br />pero debemos definir el método <span>jsonArrayToString</span><br /><br /><code><br />public String jsonArrayToString(JSONArray ja, StringBuffer buff) throws JSONException {<br /><br /> if (buff == null)<br /><br /> buff = new StringBuffer("[");<br /><br /> else<br /><br /> buff.append("[");<br /><br /> <br /><br /> for (int key=0; (ja != null) && key < ja.length(); key++) {<br /><br /> String value = null;<br /><br /> if (ja.optJSONObject(key) != null){<br /><br /> jsonToObjectLibertal(ja.optJSONObject(key), buff);<br /><br /> } else if (ja.optJSONArray(key) != null) {<br /><br /> jsonArrayToString(ja.optJSONArray(key), buff);<br /><br /> } else if (ja.optLong(key, -1) != -1) {<br /><br /> value = ja.get(key) + "";<br /><br /> buff.append(value);<br /><br /> } else if (ja.optDouble(key, -1) != -1) {<br /><br /> value = ja.get(key) + "";<br /><br /> buff.append(value);<br /><br /> } else if (ja.optBoolean(key)) {<br /><br /> value = ja.getBoolean(key) + "";<br /><br /> buff.append(value);<br /><br /> } else if (ja.opt(key) != null) {<br /><br /> Object obj = ja.opt(key);<br /><br /> if (obj instanceof Boolean) {<br /><br /> value = ja.getBoolean(key) + "";<br /><br /> } else {<br /><br /> value = "'" + ja.get(key) + "'";<br /><br /> }<br /><br /> buff.append(value);<br /><br /> }<br /><br /> if (key < ja.length() -1) buff.append(",");<br /><br /> }<br /><br /> buff.append("]");<br /><br /> <br /><br /> return buff.toString();<br /><br /> }<br /></code><br /><br /><br />y necesitamos el método <span>jsonToObjectLibertal</span><br /><br /><code><br />public String jsonToObjectLibertal(JSONObject jo, StringBuffer buff) throws JSONException {<br /><br /> if (buff == null)<br /><br /> buff = new StringBuffer("{");<br /><br /> else<br /><br /> buff.append("{");<br /><br /> <br /><br /> JSONArray names = jo.names();<br /><br /> for (int l=0; (names != null) && l < names.length(); l++) {<br /><br /> String key = names.getString(l);<br /><br /> String value = null;<br /><br /> if (jo.optJSONObject(key) != null){<br /><br /> value = key + ":";<br /><br /> buff.append(value);<br /><br /> jsonToObjectLibertal(jo.optJSONObject(key), buff);<br /><br /> }else if (jo.optJSONArray(key) != null) {<br /><br /> value = key + ":";<br /><br /> buff.append(value);<br /><br /> jsonArrayToString(jo.optJSONArray(key), buff);<br /><br /> } else if (jo.optLong(key, -1) != -1) {<br /><br /> value = key + ":" + jo.get(key) + "";<br /><br /> buff.append(value);<br /><br /> } else if (jo.optDouble(key, -1) != -1) {<br /><br /> value = key + ":" + jo.get(key) + "";<br /><br /> buff.append(value);<br /><br /> } else if (jo.opt(key) != null) {<br /><br /> Object obj = jo.opt(key);<br /><br /> if (obj instanceof Boolean) {<br /><br /> value = key + ":" + jo.getBoolean(key) + "";<br /><br /> } else {<br /><br /> value = key + ":" + "'" + jo.get(key) + "'";<br /><br /> }<br /><br /> buff.append(value);<br /><br /> }<br /><br /> if (l < names.length() -1) buff.append(",");<br /><br /> }<br /><br /> buff.append("}");<br /><br /> <br /><br /> return buff.toString();<br /><br /> }<br /></code><br /><br /><br />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).<br /><br />Ya con eso tenemos listo el Bean que llenará el widget combobox de datos de forma elegante, limpia y sencilla.<br /><br />Ahora toca ir al jsp en donde tenemos el widget combobox. El tag debería lucir así:<br /><br /><code><br /><a:widget name="dojo.combobox" value="${ComboBoxBean.paises}" publish="/micombobox"/><br /></code><br /><br />y al inicio del jsp agregar las siguientes lineas:<br /><br /><code><br /><jsp:useBean id="ComboBoxBean" scope="session" class="org.ComboBoxBean"/><br /><br /><%@ taglib prefix="a" uri="http://jmaki/v1.0/jsp" %><br /></code><br /><br />en donde deben cambiar el nombre del Bean al que corresponda.<br /><br />Antes de continuar explicaré de que se trata el <span style="font-weight: bold;">publish</span> y el <span style="font-weight: bold;">subscribe</span> en JMaki.<br /><br />El <span style="font-weight: bold;">publish</span> 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.<br /><br />El registro de eventos se hace utilizando el <span style="font-weight: bold;">subscribe</span> y se define en el archivo <span style="font-weight: bold;">glue.js</span>.<br /><br />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.<br /><br />Dicho y explicado lo anterior, agregamos al jsp un <span style="font-weight: bold;">div</span> en donde colocaremos el código del país seleccionado de forma dinámica.<br /><br /><code><br /><div id="valorSeleccionado"></div><br /></code><br /><br />Una vez listo abrimos el archivo glue.js y agregamos al final lo siguiente:<br /><br /><code><br />jmaki.subscribe("/micombobox/onSelect", function(args){<br /><br />var value = args.value;<br /><br />var targetDiv = document.getElementById("valorSeleccionado");<br /><br />if(targetDiv)<br /><br /> targetDiv.innerHTML = "El codigo de este pais es: " + value;<br /><br />});<br /></code><br /><br />Si se fijan, el subscribe es específico para el widget de publish <span>"micombobox"</span> y el evento <span>"onSelect"</span>, 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.<br /><br />Con el código anterior obtenemos el código del país seleccionado y lo agregamos al div correspondiente.<br /><br />En esta parte podemos hacer lo que queramos con el dato seleccionado, podríamos enviarlo a un servlet utilizando la función<span style="font-weight: bold;"> jmaki.doAjax</span> y almacenarlo en una sesión o hacer otra cosa.<br /><br />A continuación pueden ver algunas screenshots mostrando la funcionalidad descrita en esta entrada:<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhovfvJ8GkBKFsjGS-KSsKHnHd8uNF-l08-gug78XRIndAfoalXWcsPcRob8Jn7pef4cUF3kV98ZIIJOIXblkq7J9JUDrBSEicGZNsQRxYFoEr7_PXzaL_j1W6hxJOoUzoG9JcFmbkBa2EC/s1600-h/instant%C3%A1nea1.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhovfvJ8GkBKFsjGS-KSsKHnHd8uNF-l08-gug78XRIndAfoalXWcsPcRob8Jn7pef4cUF3kV98ZIIJOIXblkq7J9JUDrBSEicGZNsQRxYFoEr7_PXzaL_j1W6hxJOoUzoG9JcFmbkBa2EC/s320/instant%C3%A1nea1.png" alt="" id="BLOGGER_PHOTO_ID_5208275875032190114" border="0" /></a><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEitS-RBWqZCOz-z3zdCOtayLx6efxrVz7nIjneV9NRUtrgUz7ocUGPL1OZS0DjolHMSCgexwqHr6bSmb-6xupWtiN_OaIGcqgaB8E286AWyC4EH-Pv9NkgjsMV85fxa0HG0ERc5uT4bf965/s1600-h/instant%C3%A1nea2.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEitS-RBWqZCOz-z3zdCOtayLx6efxrVz7nIjneV9NRUtrgUz7ocUGPL1OZS0DjolHMSCgexwqHr6bSmb-6xupWtiN_OaIGcqgaB8E286AWyC4EH-Pv9NkgjsMV85fxa0HG0ERc5uT4bf965/s320/instant%C3%A1nea2.png" alt="" id="BLOGGER_PHOTO_ID_5208275883622124722" border="0" /></a><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi93BSJAMiu2TnezUkNKhVYkFJ-ZXR4kLGKa6vflNo8wr1jRnr8ck12gCqJ4McDCWUXvvX-y5OIB4XT6tS3VtEg7FTRFoIp5s4wvcY3U_XNv8AvN1ofcM08tBb2NnBgnJf5R1Nk5c1bbizn/s1600-h/instant%C3%A1nea3.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi93BSJAMiu2TnezUkNKhVYkFJ-ZXR4kLGKa6vflNo8wr1jRnr8ck12gCqJ4McDCWUXvvX-y5OIB4XT6tS3VtEg7FTRFoIp5s4wvcY3U_XNv8AvN1ofcM08tBb2NnBgnJf5R1Nk5c1bbizn/s320/instant%C3%A1nea3.png" alt="" id="BLOGGER_PHOTO_ID_5208275887917092034" border="0" /></a><br /><br />Como ven, utilizando <span style="font-weight: bold;">Beans</span> y los métodos <span style="font-weight: bold;">publish</span> y <span style="font-weight: bold;">subscribe</span> el llenado de datos y obtención de los mismos mediante un <span style="font-weight: bold;">ComboBox de JMaki</span> es realmente simple.<br /><br />Espero les sea de utilidad.<br /><br />ya saben, si quieren el código me lo piden y se los envío por correo.<br /><br />saludos !!!<br /><br /><br /><span style="font-weight: bold;">EDITADO!!!</span><br /><br />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.<br /><br /><a href="http://usuarios.lycos.es/metalklesk/blog-metalklesk/ComboBoxWidget.tar.gz">Descarga</a><br /><br />saludos !!!!<br /></div>Daniel Dario Morales Salashttp://www.blogger.com/profile/07642586501018157497noreply@blogger.com5