<?xml version="1.0" encoding="ISO-8859-1"?><!-- generator="FeedCreator 1.7.2-ppt (info@mypapit.net)" --><rss version="2.0">    <channel>        <title>Espacio Virtual</title>        <description><![CDATA[Publicaci&oacute;n de temas muy espec&iacute;ficos relacionados con el desarrollo de software y la inform&aacute;tica en general, de los cuales he encontrado poca o ninguna documentaci&oacute;n online. El resto corre por cuenta de Google ;)]]></description>        <link>http://espaciovirtual.blogcindario.com/</link>        <lastBuildDate>Fri, 06 Jan 2012 16:38:04 +0100</lastBuildDate>        <generator>FeedCreator 1.7.2-ppt (info@mypapit.net)</generator>        <item>            <title>Swing VS SWT - Un Test de Rendimiento</title>            <link>http://espaciovirtual.blogcindario.com/2011/09/00018-swing-vs-swt-un-test-de-rendimiento.html</link>            <description><![CDATA[<p class="MsoNormal"><span lang="ES-MX">Hace unos meses atr&aacute;s estaba por comenzar un proyecto, el cual requerir&iacute;a un uso intensivo de procesamiento y manipulaci&oacute;n de gr&aacute;ficos 2D. Luego de meditar un poco, decid&iacute; darle una oportunidad a SWT. Supuse que al su premisa de aprovechar los recursos nativos de cada sistema operativo repercutir&iacute;a favorablemente en la performance. Busqu&eacute; en la web evidencias que respaldaran mis suposiciones, haciendo especial hincapi&eacute; en el uso de aceleraci&oacute;n por hardware pero no encontr&eacute; nada determinante. Tampoco pude encontrar comparativas de performance entre SWT y Java 2D.</span></p><p class="MsoNormal"><span lang="ES-MX">As&iacute; las cosas, comenc&eacute; el desarrollo con SWT bas&aacute;ndome solo en supuestos. Todo anduvo bien hasta que lleg&oacute; la hora de programar la funcionalidad de zoom. Una vez finalizada, mientras testeaba dicha funcionalidad, realic&eacute; la siguiente prueba: primero gener&eacute; un nuevo documento, que consist&iacute;a en una matriz cuadrada de 200 casilleros de lado. Cada casillero es a su vez un cuadrado compuesto por 40 p&iacute;xeles de lado. Navegu&eacute; por la ventana, configurando la vista a diferentes niveles de zoom y usando las barras de desplazamiento. A medida que alejaba la vista y m&aacute;s celdas se visualizaban simult&aacute;neamente, comenz&oacute; a hacerse evidente una ralentizaci&oacute;n en la performance.</span></p><p class="MsoNormal"><span lang="ES-MX">En el nivel m&aacute;s bajo de zoom, casi lograba visualizar la totalidad de las 40.000 celdas que compon&iacute;an el modelo completo. Con ese factor de zoom activo la aplicaci&oacute;n tardaba alrededor de 7 segundos en terminar de renderizar todas las celdas, corriendo en un hardware de t&eacute;rmino medio. Eso era demasiado a mi criterio.</span></p><p class="MsoNormal"><span lang="ES-MX">Entonces decid&iacute; hacer lo que en realidad deber&iacute;a haber hecho desde un principio: desarroll&eacute; una prueba relativamente sencilla de performance comparando SWT por un lado y Java 2D por otro. El API Java 2D es un componente est&aacute;ndar de la plataforma Java SE, por lo cual no es necesario referenciar a ninguna librer&iacute;a adicional para poder utilizarlo.</span></p><p class="MsoNormal"><span lang="ES-MX">La prueba solo abarca el caso puntual al que hago referencia. De ninguna manera pretende comparar todas y cada una de las caracter&iacute;sticas gr&aacute;ficas disponibles en ambas librer&iacute;as. En s&iacute;ntesis lo que hace es copiar una misma imagen una determinada cantidad de veces, llenando la superficie de otra imagen. La imagen original es escalada de forma tal de que todas las copias quepan en el destino, una al lado de la otra. Este proceso se repite una cantidad predefinida de veces y por &uacute;ltimo se muestra la imagen final en pantalla.</span></p><p class="MsoNormal"><span lang="ES-MX">Para la ejecuci&oacute;n de los test se copi&oacute; una imagen cuadrada de 40 p&iacute;xeles de lado en una grilla tambi&eacute;n cuadrada de 100 x 100 posiciones. Con esto ya tenemos 10.000 copias. Adem&aacute;s, la misma prueba se ejecuta 20 veces seguidas. Por &uacute;ltimo, el test completo se repite 5 veces para obtener datos m&aacute;s generales. Todas las mediciones est&aacute;n expresadas en milisegundos.</span></p><p class="MsoNormal"><span lang="ES-MX">Los resultados de las mediciones de tiempo realmente me sorprendieron. Java 2D result&oacute; entre 3 y 12 veces m&aacute;s r&aacute;pido que SWT, dependiendo en entorno de tiempo de ejecuci&oacute;n. Mi hip&oacute;tesis es que SWT no est&aacute; utilizando la aceleraci&oacute;n por hardware o bien no hace un uso muy eficiente de la misma. No se me ocurre otra explicaci&oacute;n.</span></p><p class="MsoNormal"></p><table border="1" cellpadding="0" cellspacing="0" style="width: 100%; border-collapse: collapse;"><colgroup><col style="width: 82pt;" width="109" /><col style="width: 244pt;" width="326" /></colgroup><tbody><tr style="height: 14.4pt;"><td class="xl63" style="background-color: #ccffff; width: 274px; height: 14.4pt; font-weight: bold;">Procesador:</td><td style="width: 1482px;">AMD Athlon 64 x2 Dual Core Processor 5200+ 2.7 GHz</td></tr><tr style="height: 14.4pt;"><td class="xl63" height="19" style="background-color: #ccffff; width: 274px; height: 14.4pt; font-weight: bold;">RAM:</td><td style="width: 1482px;">2 GB</td></tr><tr style="height: 14.4pt;"><td class="xl63" height="19" style="background-color: #ccffff; width: 274px; height: 14.4pt; font-weight: bold;">SO:</td><td style="width: 1482px;">Windows 7 Ultimate 64 bits</td></tr><tr style="height: 14.4pt;"><td class="xl63" height="19" style="background-color: #ccffff; width: 274px; height: 14.4pt; font-weight: bold;">Tarjeta Gr&aacute;fica:</td><td style="width: 1482px;">Nvidia GeForce 9500 GT</td></tr></tbody></table><p class="MsoNormal"></p><table border="1" cellpadding="0" cellspacing="0" style="width: 100%; border-collapse: collapse;"><colgroup><col span="span" style="width: 61pt;" width="82" /></colgroup><tbody><tr style="height: 14.4pt;"><td class="xl65" height="19" style="background-color: #ccffff; width: 61pt; height: 14.4pt; font-weight: bold;" width="82">API</td><td class="xl65" style="background-color: #ccffff; width: 61pt; font-weight: bold;" width="82">Prueba 1</td><td class="xl65" style="background-color: #ccffff; width: 61pt; font-weight: bold;" width="82">Prueba 2</td><td class="xl65" style="background-color: #ccffff; width: 61pt; font-weight: bold;" width="82">Prueba 3</td><td class="xl65" style="background-color: #ccffff; width: 61pt; font-weight: bold;" width="82">Prueba 4</td><td class="xl65" style="background-color: #ccffff; width: 61pt; font-weight: bold;" width="82">Prueba 5</td><td class="xl65" style="background-color: #ccffff; width: 61pt; font-weight: bold;" width="82">Promedio</td><td class="xl67" style="background-color: #ccffff; width: 61pt; font-weight: bold;">%</td></tr><tr style="height: 14.4pt;"><td height="19" style="height: 14.4pt;">Swing</td><td align="right" class="xl66">2569,5336</td><td align="right" class="xl66">2470,6687</td><td align="right" class="xl66">2478,4443</td><td align="right" class="xl66">2408,5469</td><td align="right" class="xl66">2405,3501</td><td align="right" class="xl66">2466,5087</td><td align="right" class="xl66">100,0000</td></tr><tr style="height: 14.4pt;"><td height="19" style="height: 14.4pt;">SWT</td><td align="right" class="xl66">8453,1913</td><td align="right" class="xl66">8413,8632</td><td align="right" class="xl66">8385,8336</td><td align="right" class="xl66">8373,8671</td><td align="right" class="xl66">8363,8666</td><td align="right" class="xl66">8398,1243</td><td align="right" class="xl66">340,4863</td></tr></tbody></table><p class="MsoNormal"><img alt="" src="http://superhelper.webcindario.com/blog/gui_benchmark/athlon.png" style="width: 445px; height: 405px;" /></p><p class="MsoNormal"></p><hr style="width: 100%; height: 2px;" /><p></p><table border="1" cellpadding="0" cellspacing="0" style="width: 100%; border-collapse: collapse;"><colgroup><col style="width: 79pt;" width="106" /><col style="width: 151pt;" width="202" /></colgroup><tbody><tr style="height: 14.4pt;"><td class="xl65" height="19" style="background-color: #ccffff; width: 246px; height: 14.4pt; font-weight: bold;">Procesador:</td><td style="width: 1510px;">Intel Core i5 CPU 650 3.19 GHz</td></tr><tr style="height: 14.4pt;"><td class="xl65" height="19" style="background-color: #ccffff; width: 246px; height: 14.4pt; font-weight: bold;">RAM:</td><td style="width: 1510px;">3.42 GB</td></tr><tr style="height: 14.4pt;"><td class="xl65" height="19" style="background-color: #ccffff; width: 246px; height: 14.4pt; font-weight: bold;">SO:</td><td style="width: 1510px;">Windows XP Professional SP 3</td></tr><tr style="height: 14.4pt;"><td class="xl65" height="19" style="background-color: #ccffff; width: 246px; height: 14.4pt; font-weight: bold;">Tarjeta Gr&aacute;fica:</td><td style="width: 1510px;">Intel HD Graphics</td></tr></tbody></table><p class="MsoNormal"></p><table border="1" cellpadding="0" cellspacing="0" style="width: 100%; border-collapse: collapse;"><colgroup><col span="span" style="width: 68pt;" width="90" /><col style="width: 48pt;" width="64" /></colgroup><tbody><tr style="height: 14.4pt;"><td class="xl65" height="19" style="background-color: #ccffff; width: 68pt; height: 14.4pt; font-weight: bold;" width="90">API</td><td class="xl65" style="background-color: #ccffff; width: 68pt; font-weight: bold;" width="90">Prueba 1</td><td class="xl65" style="background-color: #ccffff; width: 68pt; font-weight: bold;" width="90">Prueba 2</td><td class="xl65" style="background-color: #ccffff; width: 68pt; font-weight: bold;">Prueba 3</td><td class="xl65" style="background-color: #ccffff; width: 68pt; font-weight: bold;" width="90">Prueba 4</td><td class="xl65" style="background-color: #ccffff; width: 68pt; font-weight: bold;" width="90">Prueba 5</td><td class="xl65" style="background-color: #ccffff; width: 68pt; font-weight: bold;" width="90">Promedio</td><td class="xl65" style="background-color: #ccffff; width: 48pt; font-weight: bold;" width="64">%</td></tr><tr style="height: 14.4pt;"><td height="19" style="height: 14.4pt;">Swing</td><td align="right" class="xl66">436,5035</td><td align="right" class="xl66">429,3734</td><td align="right" class="xl66">434,1542</td><td align="right" class="xl66">426,4047</td><td align="right" class="xl66">428,2210</td><td align="right" class="xl66">430,9313</td><td align="right" class="xl66">100,0000</td></tr><tr style="height: 14.4pt;"><td height="19" style="height: 14.4pt;">SWT</td><td align="right" class="xl66">5303,2498</td><td align="right" class="xl66">5321,3481</td><td align="right" class="xl66">5315,9264</td><td align="right" class="xl66">5379,6594</td><td align="right" class="xl66">5486,6777</td><td align="right" class="xl66">5361,3723</td><td align="right">1244,136</td></tr></tbody></table><p class="MsoNormal"><span lang="ES-MX"><img alt="" src="http://superhelper.webcindario.com/blog/gui_benchmark/intel.png" style="width: 456px; height: 395px;" /></span></p><p class="MsoNormal"></p><hr style="width: 100%; height: 2px;" /><p class="MsoNormal"></p><table border="1" cellpadding="0" cellspacing="0" style="width: 100%; border-collapse: collapse;"><colgroup><col style="width: 74pt;" width="99" /><col style="width: 200pt;" width="267" /></colgroup><tbody><tr style="height: 14.4pt;"><td class="xl65" style="background-color: #ccffff; width: 250px; height: 14.4pt; font-weight: bold;">Procesador:</td><td style="width: 1510px;">AMD Phenom II X2 560 Procesor 3.30 GHz</td></tr><tr style="height: 14.4pt;"><td class="xl65" height="19" style="background-color: #ccffff; width: 250px; height: 14.4pt; font-weight: bold;">RAM:</td><td style="width: 1510px;">3.84 GB</td></tr><tr style="height: 14.4pt;"><td class="xl65" height="19" style="background-color: #ccffff; width: 250px; height: 14.4pt; font-weight: bold;">SO:</td><td style="width: 1510px;">Windows 7 Ultimate 64 bits</td></tr><tr style="height: 14.4pt;"><td class="xl65" height="19" style="background-color: #ccffff; width: 250px; height: 14.4pt; font-weight: bold;">Tarjeta Gr&aacute;fica:</td><td style="width: 1510px;">NVIDIA GeForce 7025 / NVIDIA nForce 630a</td></tr></tbody></table><p class="MsoNormal"></p><table border="1" cellpadding="0" cellspacing="0" style="width: 100%; border-collapse: collapse;"><colgroup><col span="span" style="width: 66pt;" width="88" /></colgroup><tbody><tr style="height: 14.4pt;"><td class="xl65" height="19" style="background-color: #ccffff; width: 66pt; height: 14.4pt; font-weight: bold;" width="88">API</td><td class="xl65" style="background-color: #ccffff; width: 66pt; font-weight: bold;" width="88">Prueba 1</td><td class="xl65" style="background-color: #ccffff; width: 66pt; font-weight: bold;" width="88">Prueba 2</td><td class="xl65" style="background-color: #ccffff; width: 66pt; font-weight: bold;" width="88">Prueba 3</td><td class="xl65" style="background-color: #ccffff; width: 66pt; font-weight: bold;" width="88">Prueba 4</td><td class="xl65" style="background-color: #ccffff; width: 66pt; font-weight: bold;" width="88">Prueba 5</td><td class="xl65" style="background-color: #ccffff; width: 66pt; font-weight: bold;" width="88">Promedio</td><td class="xl67" style="background-color: #ccffff; width: 66pt; font-weight: bold;" width="88">%</td></tr><tr style="height: 14.4pt;"><td style="height: 14.4pt;">Swing</td><td align="right" class="xl66">824,8710</td><td align="right" class="xl66">848,3823</td><td align="right" class="xl66">750,9158</td><td align="right" class="xl66">740,2490</td><td align="right" class="xl66">759,8117</td><td align="right" class="xl66">784,8459</td><td align="right" class="xl66">100,0000</td></tr><tr style="height: 14.4pt;"><td height="19" style="height: 14.4pt;">SWT</td><td align="right" class="xl66">5002,7821</td><td align="right" class="xl66">5021,4454</td><td align="right" class="xl66">4893,1208</td><td align="right" class="xl66">4939,1533</td><td align="right" class="xl66">4930,0343</td><td align="right" class="xl66">4957,3072</td><td align="right" class="xl66">631,6281</td></tr></tbody></table><p class="MsoNormal"><span lang="ES-MX"><img alt="" src="http://superhelper.webcindario.com/blog/gui_benchmark/phenom.png" style="width: 451px; height: 397px;" /></span></p><p class="MsoNormal"></p><hr style="width: 100%; height: 2px;" /><h3><span lang="ES-MX"></span><span lang="ES-MX">Recursos</span></h3><h2></h2><p>C<span lang="ES-MX">&oacute;digo fuente de ambos test. Tambi&eacute;n se incluye la imagen de prueba y los archivos de proyecto espec&iacute;ficos para Eclipse: <a href="http://superhelper.webcindario.com/blog/gui_benchmark/benchmarks.zip">Descargar</a></span></p>]]></description>            <pubDate>Mon, 05 Sep 2011 08:54:05 +0100</pubDate>        </item>        <item>            <title>SWT: Ejemplo de Sash usando GridLayout</title>            <link>http://espaciovirtual.blogcindario.com/2011/05/00017-swt-ejemplo-de-sash-usando-gridlayout.html</link>            <description><![CDATA[<p>SWT cuenta con dos clases con las que es posible armar un splitter: <a href="http://help.eclipse.org/helios/topic/org.eclipse.platform.doc.isv/reference/api/org/eclipse/swt/custom/SashForm.html" target="_blank">SashForm</a> y <a href="http://help.eclipse.org/helios/topic/org.eclipse.platform.doc.isv/reference/api/org/eclipse/swt/widgets/Sash.html" target="_blank">Sash</a>. SashForm es de más alto nivel y actúa como un contenedor ya que es una especialización de <a href="http://help.eclipse.org/helios/topic/org.eclipse.platform.doc.isv/reference/api/org/eclipse/swt/widgets/Composite.html" target="_blank">Composite</a>. Sin embargo, posee algunas limitaciones como ser que no es posible dejar una de las partes del splitter fija cuando se ejecuta un resize. Por lo tanto, si queremos más control sobre el splitter será necesario utilizar el widget Sash. Este último es mucho más básico. Solo proporciona el aspecto del widget en sí mismo, la lógica del drag &amp; drop y el correspondiente evento.  <br />Existen varios ejemplos que muestran cómo utilizar Sash, como el <a href="http://dev.eclipse.org/viewcvs/viewvc.cgi/org.eclipse.swt.snippets/src/org/eclipse/swt/snippets/Snippet107.java?view=co" target="_blank">snipped</a> proporcionado en el site de Eclipse. Sin embargo, por alguna extraña razón todos estos ejemplos utilizan FormLayout como organizador para el contenido de los Composites. En lo personal prefiero utilizar GridLayout, por lo que me vi en la obligación de tener que armar la lógica para el splitter desde cero. Realmente no es muy complicado, pero no está de más un post para publicar el resultado.  <br />  <br />Lo que queremos lograr es algo parecido a lo que sigue:  <br />  <br /><img src="http://superhelper.webcindario.com/blog/swt_sash/layout.png" style="width: 552px; height: 399px;" />  <br />  <br />Hay solo dos formas de redimensionar los componentes de la ventana de ejemplo: cambiando la posición del splitter o redimensionando la ventana completa.  <br />Cuando un usuario cambia el tamaño de la ventana, la idea es que el panel de la izquierda se contraiga o expanda, permaneciendo el de la derecha con su ancho inalterable. La única forma de modificar el ancho del panel derecho es utilizando el splitter, el cual se muestra en la imagen en color azul.  <br />Al final del post pueden acceder al link para descargar el archivo con el código del ejemplo completo, pero una de las partes en las que vale la pena detenerse es en la programación del evento "widgetSelected". Este es el evento que se dispara cuando el Sash es arrastrado y posteriormente soltado:  <br />  <br /></p><div align="left" class="java">   <table bgcolor="#ffffea" border="2" cellpadding="3" cellspacing="0"><tbody><tr><!-- start source code --><td align="left" nowrap="nowrap" valign="top"><code><span style="color: #808080;">01</span> <span style="color: #ffffea;">    </span><span style="color: #7f0055;"><strong>protected </strong></span><span style="color: #7f0055;"><strong>void </strong></span><span style="color: #000000;">mobjSplitter_widgetSelected</span><span style="color: #ff0000;">(</span><span style="color: #000000;">SelectionEvent e</span><span style="color: #ff0000;">) {</span>              <br /><span style="color: #808080;">02</span> <span style="color: #ffffea;">        </span><span style="color: #000000;">Rectangle rctSplitter;</span>              <br /><span style="color: #808080;">03</span> <span style="color: #ffffea;">        </span><span style="color: #7f0055;"><strong>int </strong></span><span style="color: #000000;">intNewVerticalPosition;</span>              <br /><span style="color: #808080;">04</span> <span style="color: #ffffea;">        </span><span style="color: #7f0055;"><strong>int </strong></span><span style="color: #000000;">intChange;</span>              <br /><span style="color: #808080;">05</span> <span style="color: #ffffea;">        </span><span style="color: #000000;">GridData datCanvas;</span>              <br /><span style="color: #808080;">06</span>  <br /><span style="color: #808080;">07</span> <span style="color: #ffffea;">        </span><span style="color: #000000;">rctSplitter = mobjSplitter.getBounds</span><span style="color: #ff0000;">()</span><span style="color: #000000;">;</span>              <br /><span style="color: #808080;">08</span> <span style="color: #ffffea;">        </span><span style="color: #000000;">intNewVerticalPosition = e.x;</span>              <br /><span style="color: #808080;">09</span>  <br /><span style="color: #808080;">10</span> <span style="color: #ffffea;">        </span><span style="color: #000000;">intChange = rctSplitter.x - intNewVerticalPosition;</span>              <br /><span style="color: #808080;">11</span> <span style="color: #ffffea;">        </span><span style="color: #000000;">datCanvas = </span><span style="color: #ff0000;">(</span><span style="color: #000000;">GridData</span><span style="color: #ff0000;">) </span><span style="color: #000000;">mcmpRight.getLayoutData</span><span style="color: #ff0000;">()</span><span style="color: #000000;">;</span>              <br /><span style="color: #808080;">12</span> <span style="color: #ffffea;">        </span><span style="color: #000000;">datCanvas.widthHint += intChange;</span>              <br /><span style="color: #808080;">13</span>  <br /><span style="color: #808080;">14</span> <span style="color: #ffffea;">        </span><span style="color: #7f0055;"><strong>this</strong></span><span style="color: #000000;">.layout</span><span style="color: #ff0000;">()</span><span style="color: #000000;">;</span>              <br /><span style="color: #808080;">15</span> <span style="color: #ffffea;">    </span><span style="color: #ff0000;">}</span></code> </td><!-- end source code --></tr></tbody></table></div><p>  <br />Cabe aclarar que cuando el evento es ejecutado, el Sash todavía permanece en la misma posición en la que estaba antes, y seguirá allí a menos que hagamos algo para cambiarlo. La posición en donde se soltó (la que determina la nueva distribución horizontal deseada para ambos paneles) es proporcionada a través del objeto "SelectionEvent", pasado como parámetro al evento. En la línea 08 podemos apreciar su asignación a una variable local. En la línea 10 se calcula la magnitud del cambio y en la 11 y 12 se cambia el ancho del panel derecho. Por último, en la línea 14 se invoca al método "layout" del contenedor inmediatamente superior a los elementos que están siendo reordenados. En este caso se trata del objeto "Shell" que representa la ventana. Mediante esta invocación se logra que el panel derecho y el mismo Sash se adapten al nuevo ancho del panel izquierdo.  <br />  <br /></p><h2>Recursos</h2><p> Código fuente de ejemplo: <a href="http://superhelper.webcindario.com/blog/swt_sash/FrmSashSample.java">Descargar</a></p>]]></description>            <pubDate>Thu, 19 May 2011 06:54:42 +0100</pubDate>        </item>        <item>            <title>Ejemplos y ayuda Javadoc para SWT</title>            <link>http://espaciovirtual.blogcindario.com/2011/04/00016-ejemplos-y-ayuda-javadoc-para-swt.html</link>            <description><![CDATA[<h2>Documentación JavaDoc</h2> <a href="http://www.eclipse.org/swt/" target="_blank">SWT</a> es una buena alternativa a Swing, sobre todo para aplicaciones que hacen uso exhaustivo de la interfaz gráfica de usuario y necesitan lograr buenos tiempos de respuesta utilizando la menor cantidad de recursos posible.  <br />Hace un tiempo comencé a desarrollar un proyecto utilizando SWT, y me sorprendí un poco al darme cuenta de que no había forma de obtener la ayuda Javadoc para poder usarla en modo <span style="font-style: italic">offline</span>. Como no pude encontrarla ni en la web oficial ni en ningún otro lado, me vi en la obligación de utilizar métodos un poco menos ortodoxos. En primer lugar tuve que bajar la práctica aplicación <a href="http://www.httrack.com/" target="_blank">HTTrack</a>. Hay disponible una versión instalable y otra de tipo portable. Incluso también hay versiones para Linux. Con HTTrack es posible bajar al disco local sitios de Internet completos o solo parte de ellos. Finalmente, capturé parte del sitio de ayuda Javadoc para SWT. Si lo desean, puede acceder al mismo desde <a href="http://www.eclipse.org/swt/javadoc.php" target="_blank">aquí</a>. El resultado final no es perfecto, pero al menos me permite consultar la API de SWT incluso si estoy en un equipo sin acceso a Internet (si, a veces todavía puede darse esta horrible situación).  <br />  <h3 style="color: rgb(204,0,0)">Actualización</h3> Recientemente tuve que enlazar el código fuente de SWT a mi librería de usuario en Eclipse para mejorar la depuración de errores. Entonces se me ocurrió utilizar el compilador de <a href="http://www.mcs.csueastbay.edu/%7Ebillard/se/cs3340/ex7/javadoctutorial.html" target="_blank">JavaDoc</a> para generar mi propia versión. Con este segundo intento, el resultado fue tan bueno que incluso lo pude agregar en mi librería SWT en Eclipse, con lo cual ahora puedo ver las descripciones de métodos y clases apareciendo en tooltips al pasar el puntero del mouse sobre ellos.  <br />  <br />Descarga: <big><big><a href="http://superhelper.webcindario.com/blog/swt_downloads/swt_3_6_javadoc_v2.zip">Ayuda API para SWT 3.6 en formato Javadoc Versión 2</a>.</big></big>  <br />  <br />  <h2>Ejemplos</h2> Otra cosa que me extrañó fue lo <a href="http://www.eclipse.org/swt/examples.php" target="_blank">complicado</a> que resulta poder acceder a las aplicaciones de ejemplo que hacen uso de esta librería, que por cierto son unas cuantas y brindan una gran ayuda a la hora de aprender cómo funcionan ciertos componentes. Yo deseaba bajar un simple Zip con el código fuente en sus correspondientes subdirectorios y ya. Luego de darle varias vueltas al asunto, pude descargar un plugin con los ejemplos en formato Jar. En su interior encontré un directorio <span style="font-style: italic">src</span> con los fuentes de todos los ejemplos. Entonces se me ocurrió que tal vez fuera útil publicar una versión Zip con todos ellos.  <br />  <br />Descarga: <big><big><a href="http://superhelper.webcindario.com/blog/swt_downloads/ejemplos_SWT.zip">Ejemplos para SWT</a></big></big>.  <br />  <br />Espero que sirva.  ]]></description>            <pubDate>Sat, 23 Apr 2011 21:06:51 +0100</pubDate>        </item>        <item>            <title>Extensiones útiles a la clase Vector</title>            <link>http://espaciovirtual.blogcindario.com/2011/03/00015-extensiones-utiles-a-la-clase-vector.html</link>            <description><![CDATA[<p class="MsoNormal"><span lang="ES-MX">La clase <em>Vector</em> en Java nos permite manipular un array de objetos  cuya cantidad de elementos puede aumentar o disminuir  dinámicamente. A continuación se presentan un par de extensiones  realizadas a esta clase, poniendo foco especialmente en el  desarrollo para la plataforma Java Microedition  (Java ME).</span></p><h2><em><span lang="ES-MX">ClsVector</span></em></h2><p class="MsoNormal" style="text-align: left;"><em><span lang="ES-MX">ClsVector</span></em> <span lang="ES-MX">agrega un conjunto de métodos simples que se  pueden utilizar para acceder a los elementos del vector  obteniendo un tipo de dato específico. Esto nos evita tener que  estar casteando constantemente los valores retornados.</span></p><h3><span lang="ES-MX">Ejemplo de uso:</span></h3><div align="left" class="java">    <table bgcolor="#FFFFDD" border="2" cellpadding="3" cellspacing="0"><tbody><tr><!-- start source code --><td align="left" nowrap="nowrap" valign="top">          <code><span style="color: #808080;">01</span> <span style="color: #ffffdd;">    </span><span style="color: #008000;">/**</span><br />          <span style="color: #808080;">02</span> <span style="color: #ffffdd;">     </span><span style="color: #008000;">* ClsVector example</span><br />          <span style="color: #808080;">03</span> <span style="color: #ffffdd;">     </span><span style="color: #008000;">*/</span><br />          <span style="color: #808080;">04</span> <span style="color: #ffffdd;">    </span><span style="color: #7f0055;"><strong>private static </strong></span><span style="color: #7f0055;"><strong>void </strong></span><span style="color: #000000;">typedGetter</span><span style="color: #000000;">() {</span><br />          <span style="color: #808080;">05</span> <span style="color: #ffffdd;">        </span><span style="color: #000000;">ClsVector arrOrderedVector;</span><br />          <span style="color: #808080;">06</span> <span style="color: #ffffdd;">        </span><span style="color: #000000;">String strValue;</span><br />          <span style="color: #808080;">07</span> <br />          <span style="color: #808080;">08</span> <span style="color: #ffffdd;">        </span><span style="color: #000000;">System.out.println</span><span style="color: #000000;">(</span><span style="color: #2a00ff;">"ClsVector example"</span><span style="color: #000000;">)</span><span style="color: #000000;">;</span><br />          <span style="color: #808080;">09</span> <span style="color: #ffffdd;">        </span><span style="color: #000000;">System.out.println</span><span style="color: #000000;">()</span><span style="color: #000000;">;</span><br />          <span style="color: #808080;">10</span> <br />          <span style="color: #808080;">11</span> <span style="color: #ffffdd;">        </span><span style="color: #000000;">arrOrderedVector = </span><span style="color: #7f0055;"><strong>new </strong></span><span style="color: #000000;">ClsVector</span><span style="color: #000000;">()</span><span style="color: #000000;">;</span><br />          <span style="color: #808080;">12</span> <span style="color: #ffffdd;">        </span><span style="color: #000000;">arrOrderedVector.add</span><span style="color: #000000;">(</span><span style="color: #2a00ff;">"First"</span><span style="color: #000000;">)</span><span style="color: #000000;">;</span><br />          <span style="color: #808080;">13</span> <span style="color: #ffffdd;">        </span><span style="color: #000000;">arrOrderedVector.add</span><span style="color: #000000;">(</span><span style="color: #2a00ff;">"Second"</span><span style="color: #000000;">)</span><span style="color: #000000;">;</span><br />          <span style="color: #808080;">14</span> <span style="color: #ffffdd;">        </span><span style="color: #000000;">arrOrderedVector.add</span><span style="color: #000000;">(</span><span style="color: #2a00ff;">"Third"</span><span style="color: #000000;">)</span><span style="color: #000000;">;</span><br />          <span style="color: #808080;">15</span> <br />          <span style="color: #808080;">16</span> <span style="color: #ffffdd;">        </span><span style="color: #3f7f5f;">// Casting</span><br />          <span style="color: #808080;">17</span> <span style="color: #ffffdd;">        </span><span style="color: #000000;">strValue = </span><span style="color: #000000;">(</span><span style="color: #000000;">String</span><span style="color: #000000;">) </span><span style="color: #000000;">arrOrderedVector.get</span><span style="color: #000000;">(</span><span style="color: #990000;">1</span><span style="color: #000000;">)</span><span style="color: #000000;">;</span><br />          <span style="color: #808080;">18</span> <span style="color: #ffffdd;">        </span><span style="color: #000000;">System.out.println</span><span style="color: #000000;">(</span><span style="color: #000000;">strValue</span><span style="color: #000000;">)</span><span style="color: #000000;">;</span><br />          <span style="color: #808080;">19</span> <br />          <span style="color: #808080;">20</span> <span style="color: #ffffdd;">        </span><span style="color: #3f7f5f;">// Using a typed getter</span><br />          <span style="color: #808080;">21</span> <span style="color: #ffffdd;">        </span><span style="color: #000000;">strValue = arrOrderedVector.strGet</span><span style="color: #000000;">(</span><span style="color: #990000;">1</span><span style="color: #000000;">)</span><span style="color: #000000;">;</span><br />          <span style="color: #808080;">22</span> <span style="color: #ffffdd;">        </span><span style="color: #000000;">System.out.println</span><span style="color: #000000;">(</span><span style="color: #000000;">strValue</span><span style="color: #000000;">)</span><span style="color: #000000;">;</span><br />          <span style="color: #808080;">23</span> <span style="color: #ffffdd;">    </span><span style="color: #000000;">}</span></code></td><!-- end source code -->        </tr></tbody></table></div><p> </p><p class="MsoNormal"><span lang="ES-MX">Estos métodos  <em>get</em> tipificados son muy prácticos en el entorno  Java ME, en donde no existe la posibilidad de utilizar programación  genérica (generics).</span></p><h2><em><span lang="ES-MX">ClsOrderedVector</span></em></h2><p class="MsoNormal"><span lang="ES-MX">En Java ME es  imposible ordenar datos utilizando SQL y bases de datos  relacionales, con lo cual un simple ordenamiento ascendente se  puede tornar en todo un desafío.</span></p><p class="MsoNormal"><span lang="ES-MX">La segunda extensión de  la que se ocupa este artículo, llamada <em>ClsOrderedVector</em>, es una especialización derivada de la  anterior, <em>ClsVector</em>. En ella se agrega todo el  código necesario para poder ordenar los elementos alojados dentro  del vector. Para poder hacerlo de una forma genérica, se  construyó la interface <em>IntComparator</em>. El  mecanismo de ordenamiento solo funcionará correctamente si todos  los elementos son de un mismo tipo o al menos comparables entre  sí. El algoritmo de ordenamiento utilizado es una implementación  de QuickSort en lenguaje Java desarrollada por Sun Microsystems  hace ya algunos años.</span></p><h3><span lang="ES-MX">Ejemplo de uso:</span></h3><p class="MsoNormal"><span lang="ES-MX">Este segundo  ejemplo va a ser un poco más sofisticado. Para el mismo se creó  una nueva clase <em>ClsPerson</em>, cuyas instancias serán  ordenadas dentro del vector. También se creó <em>ClsPerson_Name_Comp</em> que implementa la interface <em>IntComparator.</em></span></p><p><span lang="ES-MX">Nótese la existencia de una relación muy estrecha entre  la clase <em>ClsPerson</em> y el comparador <em>ClsPerson_Name_Comp</em>. Es por este motivo que el nombre  elegido para el comparador comienza justamente con el nombre de  la clase a la cual debe comparar. Por convención, la segunda  parte del nombre indica la propiedad que se utiliza para la  comparación (ordenamiento), y la última parte siempre es  <em>Comp</em> para denotar que se trata de un  comparador.<br />  <br />  <a href="http://superhelper.webcindario.com/blog/vector_extensions/modelo_ejemplo.jpg">  <img src="http://superhelper.webcindario.com/blog/vector_extensions/modelo_ejemplo_prv.jpg" style="border: 0px solid; width: 500px; height: 535px;" />  </a><br /></span><span lang="EN-US"><br />  Código:</span><br />  <br /></p><div align="left" class="java">    <table bgcolor="#FFFFDD" border="2" cellpadding="3" cellspacing="0"><tbody><tr><!-- start source code --><td align="left" nowrap="nowrap" valign="top">          <code><span style="color: #808080;">01</span> <span style="color: #ffffdd;">    </span><span style="color: #008000;">/**</span><br />          <span style="color: #808080;">02</span> <span style="color: #ffffdd;">     </span><span style="color: #008000;">* ClsOrderedVector example</span><br />          <span style="color: #808080;">03</span> <span style="color: #ffffdd;">     </span><span style="color: #008000;">*/</span><br />          <span style="color: #808080;">04</span> <span style="color: #ffffdd;">    </span><span style="color: #7f0055;"><strong>private static </strong></span><span style="color: #7f0055;"><strong>void </strong></span><span style="color: #000000;">sorting</span><span style="color: #000000;">() {</span><br />          <span style="color: #808080;">05</span> <span style="color: #ffffdd;">        </span><span style="color: #000000;">ClsPerson objPerson;</span><br />          <span style="color: #808080;">06</span> <span style="color: #ffffdd;">        </span><span style="color: #000000;">ClsPerson_Name_Comp objPerson_Name_Comp;</span><br />          <span style="color: #808080;">07</span> <span style="color: #ffffdd;">        </span><span style="color: #000000;">ClsOrderedVector arrOrderedVector = </span><span style="color: #7f0055;"><strong>new </strong></span><span style="color: #000000;">ClsOrderedVector</span><span style="color: #000000;">()</span><span style="color: #000000;">;</span><br />          <span style="color: #808080;">08</span> <br />          <span style="color: #808080;">09</span> <span style="color: #ffffdd;">        </span><span style="color: #000000;">System.out.println</span><span style="color: #000000;">(</span><span style="color: #2a00ff;">"ClsOrderedVector example"</span><span style="color: #000000;">)</span><span style="color: #000000;">;</span><br />          <span style="color: #808080;">10</span> <span style="color: #ffffdd;">        </span><span style="color: #000000;">System.out.println</span><span style="color: #000000;">()</span><span style="color: #000000;">;</span><br />          <span style="color: #808080;">11</span> <br />          <span style="color: #808080;">12</span> <span style="color: #ffffdd;">        </span><span style="color: #3f7f5f;">// Create the vector elements</span><br />          <span style="color: #808080;">13</span> <span style="color: #ffffdd;">        </span><span style="color: #000000;">objPerson = </span><span style="color: #7f0055;"><strong>new </strong></span><span style="color: #000000;">ClsPerson</span><span style="color: #000000;">()</span><span style="color: #000000;">;</span><br />          <span style="color: #808080;">14</span> <span style="color: #ffffdd;">        </span><span style="color: #000000;">objPerson.setMstrName</span><span style="color: #000000;">(</span><span style="color: #2a00ff;">"Andrés"</span><span style="color: #000000;">)</span><span style="color: #000000;">;</span><br />          <span style="color: #808080;">15</span> <span style="color: #ffffdd;">        </span><span style="color: #000000;">arrOrderedVector.add</span><span style="color: #000000;">(</span><span style="color: #000000;">objPerson</span><span style="color: #000000;">)</span><span style="color: #000000;">;</span><br />          <span style="color: #808080;">16</span> <br />          <span style="color: #808080;">17</span> <span style="color: #ffffdd;">        </span><span style="color: #000000;">objPerson = </span><span style="color: #7f0055;"><strong>new </strong></span><span style="color: #000000;">ClsPerson</span><span style="color: #000000;">()</span><span style="color: #000000;">;</span><br />          <span style="color: #808080;">18</span> <span style="color: #ffffdd;">        </span><span style="color: #000000;">objPerson.setMstrName</span><span style="color: #000000;">(</span><span style="color: #2a00ff;">"Vanesa"</span><span style="color: #000000;">)</span><span style="color: #000000;">;</span><br />          <span style="color: #808080;">19</span> <span style="color: #ffffdd;">        </span><span style="color: #000000;">arrOrderedVector.add</span><span style="color: #000000;">(</span><span style="color: #000000;">objPerson</span><span style="color: #000000;">)</span><span style="color: #000000;">;</span><br />          <span style="color: #808080;">20</span> <br />          <span style="color: #808080;">21</span> <span style="color: #ffffdd;">        </span><span style="color: #000000;">objPerson = </span><span style="color: #7f0055;"><strong>new </strong></span><span style="color: #000000;">ClsPerson</span><span style="color: #000000;">()</span><span style="color: #000000;">;</span><br />          <span style="color: #808080;">22</span> <span style="color: #ffffdd;">        </span><span style="color: #000000;">objPerson.setMstrName</span><span style="color: #000000;">(</span><span style="color: #2a00ff;">"Emiliano"</span><span style="color: #000000;">)</span><span style="color: #000000;">;</span><br />          <span style="color: #808080;">23</span> <span style="color: #ffffdd;">        </span><span style="color: #000000;">arrOrderedVector.add</span><span style="color: #000000;">(</span><span style="color: #000000;">objPerson</span><span style="color: #000000;">)</span><span style="color: #000000;">;</span><br />          <span style="color: #808080;">24</span> <br />          <span style="color: #808080;">25</span> <span style="color: #ffffdd;">        </span><span style="color: #000000;">objPerson = </span><span style="color: #7f0055;"><strong>new </strong></span><span style="color: #000000;">ClsPerson</span><span style="color: #000000;">()</span><span style="color: #000000;">;</span><br />          <span style="color: #808080;">26</span> <span style="color: #ffffdd;">        </span><span style="color: #000000;">objPerson.setMstrName</span><span style="color: #000000;">(</span><span style="color: #2a00ff;">"Carolina"</span><span style="color: #000000;">)</span><span style="color: #000000;">;</span><br />          <span style="color: #808080;">27</span> <span style="color: #ffffdd;">        </span><span style="color: #000000;">arrOrderedVector.add</span><span style="color: #000000;">(</span><span style="color: #000000;">objPerson</span><span style="color: #000000;">)</span><span style="color: #000000;">;</span><br />          <span style="color: #808080;">28</span> <br />          <span style="color: #808080;">29</span> <span style="color: #ffffdd;">        </span><span style="color: #3f7f5f;">// Create and set the comparator</span><br />          <span style="color: #808080;">30</span> <span style="color: #ffffdd;">        </span><span style="color: #000000;">objPerson_Name_Comp = </span><span style="color: #7f0055;"><strong>new </strong></span><span style="color: #000000;">ClsPerson_Name_Comp</span><span style="color: #000000;">()</span><span style="color: #000000;">;</span><br />          <span style="color: #808080;">31</span> <span style="color: #ffffdd;">        </span><span style="color: #000000;">arrOrderedVector.setMobjComparator</span><span style="color: #000000;">(</span><span style="color: #000000;">objPerson_Name_Comp</span><span style="color: #000000;">)</span><span style="color: #000000;">;</span><br />          <span style="color: #808080;">32</span> <br />          <span style="color: #808080;">33</span> <span style="color: #ffffdd;">        </span><span style="color: #3f7f5f;">// Sort the elements</span><br />          <span style="color: #808080;">34</span> <span style="color: #ffffdd;">        </span><span style="color: #000000;">arrOrderedVector.sort</span><span style="color: #000000;">()</span><span style="color: #000000;">;</span><br />          <span style="color: #808080;">35</span> <br />          <span style="color: #808080;">36</span> <span style="color: #ffffdd;">        </span><span style="color: #3f7f5f;">// Show the sorted elements</span><br />          <span style="color: #808080;">37</span> <span style="color: #ffffdd;">        </span><span style="color: #7f0055;"><strong>for </strong></span><span style="color: #000000;">(</span><span style="color: #7f0055;"><strong>int </strong></span><span style="color: #000000;">i = </span><span style="color: #990000;">0</span><span style="color: #000000;">; i &lt; arrOrderedVector.size</span><span style="color: #000000;">()</span><span style="color: #000000;">; i++</span><span style="color: #000000;">) {</span><br />          <span style="color: #808080;">38</span> <span style="color: #ffffdd;">            </span><span style="color: #000000;">objPerson = </span><span style="color: #000000;">(</span><span style="color: #000000;">ClsPerson</span><span style="color: #000000;">) </span><span style="color: #000000;">arrOrderedVector.get</span><span style="color: #000000;">(</span><span style="color: #000000;">i</span><span style="color: #000000;">)</span><span style="color: #000000;">;</span><br />          <span style="color: #808080;">39</span> <span style="color: #ffffdd;">            </span><span style="color: #000000;">System.out.println</span><span style="color: #000000;">(</span><span style="color: #000000;">objPerson.getMstrName</span><span style="color: #000000;">())</span><span style="color: #000000;">;</span><br />          <span style="color: #808080;">40</span> <span style="color: #ffffdd;">        </span><span style="color: #000000;">}</span><br />          <span style="color: #808080;">41</span> <span style="color: #ffffdd;">    </span><span style="color: #000000;">}</span></code></td><!-- end source code -->        </tr></tbody></table></div><p> </p><p class="MsoNormal"><span lang="ES-MX">Se podrían crear  más comparadores para <em>ClsPerson</em> si la clase  tuviera otras propiedades por las cuales fuera necesario ordenar,  o si se deseara realizar un ordenamiento descendente además de  del ascendente mostrado en este ejemplo. El comparador asignado a  un <em>ClsOrderedVector</em> puede cambiarse tantas veces  como sea necesario llamando al método</span> <span lang="ES-MX" style="font-family: &quot;Courier New&quot;;">ClsOrderedVector.setMobjComparator()</span><span lang="ES-MX">, pero hay que tener en cuenta que para que el  ordenamiento realmente se ejecute es necesario llamar al  método</span> <span lang="ES-MX" style="font-family: &quot;Courier New&quot;;">ClsOrderedVector.sort()</span> <span lang="ES-MX">que es el que realmente realiza el trabajo de ordenar el  contenido del vector.</span></p><p class="MsoNormal"><span lang="ES-MX">Una forma  alternativa de mantener los datos ordenados dentro de un vector  en principio vacío es primero setear el comparador  adecuando<span> </span> para luego ir insertando  los elementos con el método</span> <span class="CdigoCar"><span lang="ES-MX">ClsOrderedVector</span></span><span lang="ES-MX" style="font-family: &quot;Courier New&quot;;">.orderedInsert<span class="CdigoCar">()</span></span><span style="font-size: 12pt; line-height: 115%; font-family: &quot;Courier New&quot;; color: black;">.</span></p><h2><span lang="ES-MX">Recursos</span></h2><p class="MsoNoSpacing"><span lang="ES-MX">Este Zip  incluye las clases analizadas, el código de ejemplo que las  implementa, la documentación JavaDoc, y el proyecto para importar  desde Eclipse:<br />  <a href="http://superhelper.webcindario.com/blog/vector_extensions/VectorExtensions.zip">  Descargar</a><br /></span></p><p class="MsoNoSpacing"><span lang="ES-MX">Implementación del agoritmo <em>QuickSort</em>  realizada por Sun Microsystems:<br /></span><span lang="ES-MX" style="font-size: 11pt; line-height: 115%; font-family: &quot;Calibri&quot;,&quot;sans-serif&quot;;"><a href="http://java.sun.com/applets/jdk/1.4/demo/applets/SortDemo/QSortAlgorithm.java">http://java.sun.com/applets/jdk/1.4/demo/applets/SortDemo/QSortAlgorithm.java</a></span></p><p> </p><hr style="width: 100%; height: 2px;" />]]></description>            <pubDate>Mon, 28 Mar 2011 10:30:22 +0100</pubDate>        </item>        <item>            <title>Sutiles efectos visuales en KDE</title>            <link>http://espaciovirtual.blogcindario.com/2008/03/00013-sutiles-efectos-visuales-en-kde.html</link>            <description><![CDATA[Recientemente todos nos hemos asombrado con los incre&iacute;blesefectos 3D que se renderizaban en los escritorios Linux gracias aproyectos como <a href="http://compiz.org/">Compiz</a> y <a href="http://www.beryl-project.org/">Beryl</a>, y m&aacute;s recientemente con la uni&oacute;n de ambos en <a href="http://www.compiz-fusion.org/">Compiz Fusion</a>.Sin embargo, para algunos todo ese despliegue gr&aacute;fico puedellegar a resultar excesivo. Otros tal vez consideren que este tipo deinterfase debe madurar un poco para integrarse mejor con todo elsoftware existente.<br />Pero existe una alternativa m&aacute;s austera y mejor integrada dentrode los entornos KDE.&nbsp; En la versi&oacute;n 3.5.6 de KDE, el soportepara efectos de sombras y transparencias se encuentra en un estado demadurez tal que hace que valga la pena el intentar utilizarlo, por lo menosmientras esperamos que los exuberantes proyectos de efectos 3D seestabilizen un poco m&aacute;s.<br /><h3>Configuraci&oacute;n de la placa de v&iacute;deo</h3>Para habilitar las transparencias en KDE, lo primero que tenemos que hacer es editar el archivo <em>xorg.conf</em>.Como recomendaci&oacute;n, antes de editar este archivo siempre esconveniente realizar una copia de seguridad dentro de ese mismodirectorio. La raz&oacute;n de esto es que, si cometemos un error enlos valores ingresados aqu&iacute;, cuando reiniciemos corremos elriesgo de que se generen errores en el sistema gr&aacute;fico de Linux (<em>xorg</em>) y por lo tanto la interfase gr&aacute;fica no se cargue. En ese caso, cuando estemos solos con nuestro <em>promp</em> en modo texto, siempre tendremos la posibilidad de renombrar el antiguo archivo de backup (logueados como <em>root</em>) y reiniciar nuevamente en modo gr&aacute;fico.<br />Al menos en Ubuntu / Kubuntu,&nbsp;el path absoluto para este archivoes /etc/X11/xorg.conf. Para editarlo, tenemos que hacerlo conprivilegios de <em>root</em>. Para instrucciones m&aacute;s detalladas sobre como editar archivos restringidos, consultar&nbsp;<a href="http://espaciovirtual.blogcindario.com/2008/02/00012-edicion-de-archivos-restringidos-con-krusader.html">Edici&oacute;n de archivos restringidos con Krusader</a>. Al final del archivo de configuraci&oacute;n, hay que agregar la siguiente secci&oacute;n:<br /><br /><tt><span style="font-size: xx-small;">Section "Extensions"<br />&nbsp; Option "Composite" "Enable"<br />EndSection</span><br /></tt><br />Si tenemos una placa de v&iacute;deo NVidia, entonces tambi&eacute;n conviene a&ntilde;adir en la secci&oacute;n <em>Device</em> las siguientes l&iacute;neas:<br /><br /><tt><span style="font-size: xx-small;">Option "RenderAccel" "true"<br />Option "AllowGLXWithComposite" "true"</span><br /></tt><br />Esto nos permitir&aacute; obtener una mejor performance mediante laaceleraci&oacute;n por hardware. Un ejemplo de c&oacute;moquedar&iacute;a esta secci&oacute;n completa ser&iacute;a el siguiente:<br /><br /><span style="font-size: xx-small;"><tt>Section "Device"<br />&nbsp;&nbsp;&nbsp; Identifier&nbsp;&nbsp;&nbsp; "NVIDIA Corporation NV18 [GeForce4 MX 4000 AGP 8x]"<br />&nbsp;&nbsp;&nbsp; Driver&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; "nvidia"<br />&nbsp;&nbsp;&nbsp; BusID &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; "PCI:1:0:0"<br />&nbsp;&nbsp;&nbsp; <span style="color: #ff0000;">Option &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"RenderAccel" &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; "true"</span><br />&nbsp;&nbsp;&nbsp; Option &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; "NvAgp"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"1"&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; # para que funcione lahibernaci&oacute;n<br />&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; # Para efectos 3D<br />&nbsp;&nbsp;&nbsp; Option "TripleBuffer" "True"<br />&nbsp;&nbsp;&nbsp; Option "AddARGBGLXVisuals"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; # para quefuncionen los efectos 3D en Beryl / Compiz<br />&nbsp;&nbsp;&nbsp; <span style="color: #ff0000;">Option "AllowGLXWithComposite" "true"</span><br /><br />&nbsp;&nbsp;&nbsp; # Para clonar la salida a la TV<br />&nbsp;&nbsp;&nbsp; Option&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; "TwinView" "true"<br />&nbsp;&nbsp;&nbsp; Option&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; "SecondMonitorHorizSync" "30-50"<br />&nbsp;&nbsp;&nbsp; Option&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; "SecondMonitorVertRefresh" "60"<br />&nbsp;&nbsp;&nbsp; Option&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; "TwinViewOrientation" "Clone"<br />&nbsp;&nbsp;&nbsp; Option&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; "TVOutFormat" "SVIDEO"<br />&nbsp;&nbsp;&nbsp; Option&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; "ConnectedMonitor" "CRT,TV"<br />&nbsp;&nbsp;&nbsp; Option&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; "TVStandard" "PAL-NC"<br />EndSection<br /></tt></span><br />En rojo aparecen las l&iacute;neas relevantes para este instructivo.<br />Una vez grabado el archivo de configuraci&oacute;n de xorg solo resta reiniciar el sistema.<br /><h3>Configuraci&oacute;n de KDE</h3>Ya tenemos el sistema preparado para utilizar transparencias. Ahora hayque indicar a KDE que utilice esta caracter&iacute;stica.<br /><br /><ol><li>Ir a <em>Configuraci&oacute;n del Sistema</em></li><li>Solapa <em>General</em> &gt;&gt; &iacute;cono <em>Comportamiento de las Ventanas</em></li><li>Secci&oacute;n <em>Comportamiento de las Ventanas</em> &gt;&gt; solapa <em>Translucidez</em></li><li>Chequear <em>Usar translucidez/sombras</em></li><li>Aparece un mensaje de advertencia diciendo que el soporte detranslucidez es nuevo y puede causar problemas. En realidad ya no estan nuevo, y personalmente nunca he tenido problemas. Acepte eldi&aacute;logo con el mensaje si le gusta la aventura.<br />  </li><li>Al activar esta opci&oacute;n, se habilitan tres solapasadicionales en donde se pueden configurar los efectos a gusto de cadauno. Solo a modo de gu&iacute;a, adjunto pantallas con miconfiguraci&oacute;n actual.</li></ol><div align="center"><a href="http://espaciovirtual.blogcindario.com/ficheros/2008_03_01/opacidad.jpg"><img border="0" height="225" src="http://espaciovirtual.blogcindario.com/ficheros/2008_03_01/opacidad_preview.jpg" width="300" /></a><br />Solapa <em>Opacidad<br /><br /></em><a href="http://espaciovirtual.blogcindario.com/ficheros/2008_03_01/sombras.jpg"><img border="0" height="225" src="http://espaciovirtual.blogcindario.com/ficheros/2008_03_01/sombras_preview.jpg" width="300" /></a><br />Solapa <em>Sombras<br /><br /></em><a href="http://espaciovirtual.blogcindario.com/ficheros/2008_03_01/efectos.jpg"><img border="0" height="225" src="http://espaciovirtual.blogcindario.com/ficheros/2008_03_01/efectos_preview.jpg" width="300" /></a><br />Solapa <em>Efectos</em><br /><br /><div align="left">Finalmente, unas pantallas de ejemplo mostrando el resultado final de todas estas configuraciones:<br /><br /><div align="center"><a href="http://espaciovirtual.blogcindario.com/ficheros/2008_03_01/ejemplo1.jpg"><img border="0" height="225" src="http://espaciovirtual.blogcindario.com/ficheros/2008_03_01/ejemplo1_preview.jpg" width="300" /></a><br /><br /><a href="http://espaciovirtual.blogcindario.com/ficheros/2008_03_01/moviendo_ventana.jpg"><img border="0" height="225" src="http://espaciovirtual.blogcindario.com/ficheros/2008_03_01/moviendo_ventana_preview.jpg" width="300" /></a><br />Esta transparencia solo se activa al mover la ventana<br /><br /><a href="http://espaciovirtual.blogcindario.com/ficheros/2008_03_01/ejemplo2.jpg"><img border="0" height="225" src="http://espaciovirtual.blogcindario.com/ficheros/2008_03_01/ejemplo2_preview.jpg" width="300" /></a><br /><br /><a href="http://espaciovirtual.blogcindario.com/ficheros/2008_03_01/ejemplo3.jpg"><img border="0" height="225" src="http://espaciovirtual.blogcindario.com/ficheros/2008_03_01/ejemplo3_preview.jpg" width="300" /></a></div></div></div>]]></description>            <pubDate>Sat, 01 Mar 2008 08:02:38 +0100</pubDate>        </item>        <item>            <title>Edición de archivos restringidos con Krusader</title>            <link>http://espaciovirtual.blogcindario.com/2008/02/00012-edicion-de-archivos-restringidos-con-krusader.html</link>            <description><![CDATA[El sistema operativo Linux posee un esquema de seguridad avanzado,en el cual normalmente un usuario no tiene acceso a todos los rinconesdel disco r&iacute;gido, sino que por el contrario tiene el dominiode solo unasecci&oacute;n menor conocida como su <em>home</em> endonde s&iacute; tiene derechos de escritura.<br />Esto tiene sus ventajas y desventajas, como casi todo en esta vida. Unaventaja es que si, por ejemplo, un virus logra ingresar al sistemamientras un usuario normal se encuentra en medio de unasesi&oacute;nde trabajo, dicho virus solo podr&aacute; da&ntilde;ar todoaquello alo que ese usuario tenga acceso. De hecho, ya es dif&iacute;cil queunvirus pueda colarse si el usuario no tiene acceso a los directorios delsistema operativo. Como contrapartida, cuando necesitemos configuraralg&uacute;n aspecto cr&iacute;tico del sistema, nos veremosobligados a editar archivos de configuraci&oacute;n para los cualesnotenemos permisos de escritura de manera predeterminada.<br />Con el administrador de archivos <a href="http://www.krusader.org/">Krusader</a>esta tarea puede volverse algo trivial, siempre y cuando conozcamoscual es la clave del usuario <em>root</em>.<br /><br />Una vez ejecutado Krusader, se deben seguir los siguientes pasos:<br /><br /><ol><li>Navegar en alguno de los dos paneles hasta el archivo quese desea editar (ej. /etc/fstab)<br />    <br /><div align="center"><a href="http://espaciovirtual.blogcindario.com/ficheros/edicion_archivos_restringidos/krusader.jpg"><img border="0" height="224" src="http://espaciovirtual.blogcindario.com/ficheros/edicion_archivos_restringidos/krusader_preview.jpg" width="300" /><br />    <br />    </a></div></li><li>Invocar el men&uacute; contextual del archivo</li><li>Ir al &iacute;tem de men&uacute; Acciones deUsuario &gt;&gt; Edit as Root</li><li>Se nos presentar&aacute; el di&aacute;logo en elcual debemos introducir la contrase&ntilde;a del <em>root<br />    <br />    </em><div align="center"><em><img height="202" src="http://espaciovirtual.blogcindario.com/ficheros/edicion_archivos_restringidos/password.jpg" width="391" /><br />    <br />    </em></div></li><li>Al aceptar el di&aacute;logo de contrase&ntilde;a,si todo est&aacute; correcto se nos abrir&aacute; el editor detexto<em> KWrite</em> ejecut&aacute;ndose concredenciales de <em>root</em>, con lo cual podremosmodificar y grabar el contenido del archivo sin inconvenientes.<br />    <br /><div align="center"><a href="http://espaciovirtual.blogcindario.com/ficheros/edicion_archivos_restringidos/kwrite.jpg"><img border="0" height="211" src="http://espaciovirtual.blogcindario.com/ficheros/edicion_archivos_restringidos/kwrite_preview.jpg" width="300" /></a></div></li></ol>Una alternativa al men&uacute; contextual es utilizar el atajo deteclado<em> Ctrl+E.</em>]]></description>            <pubDate>Fri, 22 Feb 2008 06:45:11 +0100</pubDate>        </item>        <item>            <title>Invocando al objeto wxApp</title>            <link>http://espaciovirtual.blogcindario.com/2008/02/00011-invocando-al-objeto-wxapp.html</link>            <description><![CDATA[La clase <em>wxApp</em> es una de las m&aacute;simportantes dentro de una aplicaci&oacute;n desarrollada con lalibrer&iacute;a <em>wxWidgets.</em> Siempre debemoscrear una clase derivada de &eacute;sta como punto de partida paraun nuevo desarrollo. Es de tipo <em>singleton,&nbsp;</em>porlo que solo existir&aacute; un objeto perteneciente a esta clase.Sobreescribiendo la funci&oacute;n <em>OnInit()</em> seda comienzo a la ejecuci&oacute;n de nuestro programa, como si setratara de la funci&oacute;n<em> main()</em> de C o C++tradicional.<br />A lo largo del desarrollo, habr&aacute; ocasiones en las cualesvamos a necesitar invocar a alguna funci&oacute;n de la clase <em>wxApp</em>est&aacute;ndar o de la derivada que hayamos creado nosotros. Paraestoexisten dos mecanismos diferentes dentro de&nbsp; wxWidgets:<br /><br /><h3>Mediante wxTheApp</h3>Esta es una variable global que contiene un puntero de tipo <em>wxApp*</em>,pero en realidad apunta a nuestra clase derivada. El problema es que siqueremos invocar a una funci&oacute;n creada en nuestra clasederivada,primero tendremos que <em>castizar</em> el puntero a nuestrotipo espec&iacute;fico.<br /><br /><h3>Mediante wxGetApp()</h3>Este m&eacute;todo es un poco m&aacute;s sofisticado, yrequiere tener en cuenta un paso adicional para poder utilizarlo. <em>wxGetApp()</em>es una funci&oacute;n global que nos devuelve un puntero del tipoespec&iacute;fico que nosotros estamos utilizando para desarrollarnuestro software. Por ejemplo, si nuestra clase se llama <em>clsApplication</em>,entonces <em>wxGetApp()</em> nos devolver&aacute; unpuntero de tipo <em>clsApplication*.</em><br />La condici&oacute;n para que esto funcione es agregar una macrosimilar a esta: <em>DECLARE_APP( clsApplication )<br /></em>Un ejemplo un poco m&aacute;s completo del archivo decabecera <em>clsApplication.h</em> podr&iacute;a versede esta manera:<br /><pre><code><span style="color: #000000;"><br /><span style="color: #7f0055;"><strong>#ifndef ClsApplication_H</strong></span><br /><span style="color: #7f0055;"><strong>#define ClsApplication_H</strong></span><br /><br /><span style="color: #7f0055;"><strong>#include &lt;wx/app.h&gt;</strong></span><br /><br /><span style="color: #7f0055;">class</span> clsApplication <span style="color: #ff0000;">:</span> <span style="color: #7f0055;">public</span> wxApp<br /><span style="color: #ff0000;">{</span><br />    DECLARE_CLASS<span style="color: #ff0000;">(</span> clsApplication <span style="color: #ff0000;">)</span><br />    DECLARE_EVENT_TABLE<span style="color: #ff0000;">()</span><br /><br /><span style="color: #7f0055;">public</span><span style="color: #ff0000;">:</span><br />    clsApplication<span style="color: #ff0000;">();</span><br />    <span style="color: #7f0055;">virtual</span> <span style="color: #ff0000;">~</span>clsApplication<span style="color: #ff0000;">();</span><br /><span style="color: #ff0000;">};</span><br /><br />DECLARE_APP<span style="color: #ff0000;">(</span> clsApplication <span style="color: #ff0000;">)</span><br /><br /><span style="color: #7f0055;"><strong>#endif</strong></span> <span style="color: #008000;">// ClsApplication_H</span></span></code></pre>Para m&aacute;s informaci&oacute;n acerca de la clase <em>wxApp</em>, consultar <a href="http://www.wxwidgets.org/manuals/stable/wx_wxapp.html#wxapp">http://www.wxwidgets.org/manuals/stable/wx_wxapp.html#wxapp</a>]]></description>            <pubDate>Tue, 19 Feb 2008 07:49:31 +0100</pubDate>        </item>    </channel></rss>
