<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss'><id>tag:blogger.com,1999:blog-18551162</id><updated>2009-12-29T01:34:08.658-08:00</updated><title type='text'>Delphi - Blog de Carlos G</title><subtitle type='html'>Conjuros para el hackerismo y otras deidades...

Blog sobre lenguajes de programación, Bases de Datos, Programación Gráfica, Delphi, Firebird, OpenGL, y tecnología en general</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://cgarcia.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18551162/posts/default?orderby=updated'/><link rel='alternate' type='text/html' href='http://cgarcia.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/18551162/posts/default?start-index=26&amp;max-results=25&amp;orderby=updated'/><author><name>Carlos G</name><uri>http://www.blogger.com/profile/09121978431155592667</uri><email>noreply@blogger.com</email></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>56</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-18551162.post-3343797184352225784</id><published>2009-10-20T00:42:00.000-07:00</published><updated>2009-10-30T00:26:33.751-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Rollos mios'/><title type='text'>Holly shit, soy un nerd!</title><content type='html'>&lt;div style="float: left; margin: 5px;"&gt;&lt;a href="http://www.nerdtests.com/ft_nq.php"&gt;&lt;br /&gt;&lt;img src="http://www.nerdtests.com/images/ft/nq/30ad9f68f8.gif" alt="I am nerdier than 94% of all people. Are you a nerd? Click here to take the Nerd Test, get geeky images and jokes, and talk on the nerd forum!" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;p&gt;Ahora que no tenía mucho que hacer, bagabundeando por ahí llegué a esta encuesta que evalua que tan Nerd eres; y santos héroes del fobaproa Batman!! saqué &lt;b&gt;94%&lt;/b&gt; !!! &lt;/p&gt;&lt;p&gt;Ya tenia yo conciencia de tener cierto nivel de frikismo, ¿pero tanto??, si llega a ser preocupante. Esta calificación me pone como un &lt;i&gt;kaiosama &lt;/i&gt;de los nerds.&lt;/p&gt;&lt;p&gt;Ahora que en una introspectiva exhaustiva, debo confesar que si soy fan de algunas series de anime, he coleccionado algunos comics alguna vez en mi vida, me gustan mucho los juegos de video,  paso muchas horas al día pegado a la computadora, soy super fan del universo de star wars (no asi de star trek), y tengo varias figuras de acción de superheroes en la casa, puedo pasarme toda una tarde viendo documentales en el animal planet, y en el &lt;i&gt;toilet &lt;/i&gt;hay una pila de libros de diferentes temáticas que van desde algoritmos genéticos hasta de modelos estocásticos. Solo puedo alegar en mi defensa que nada de esto me enajena y que en realidad prefiero mil veces pasar una buena noche bohemia con vino y guitarras que una &lt;i&gt;noche de halo multiplayer online&lt;/i&gt;. Aunque, si lleva su buena tajada de razón la susodicha encuesta.&lt;/p&gt;&lt;p&gt;Por cierto, ¿conocen ya la nueva forma de jugar &lt;i&gt;piedra, papel o tijera&lt;/i&gt; al estilo nerd?, en la serie "&lt;i&gt;The big bang theory&lt;/i&gt;" proponen que se agreguen 2 elementos nuevos al juego, de modo que el juego quedaría en "&lt;i&gt;&lt;b&gt;piedra, papel, tijeras, lagarto, spock&lt;/b&gt;&lt;/i&gt;", y las reglas pues son muy simples:&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Las tijeras cortan el papel&lt;/li&gt;&lt;li&gt;El papel cubre a la piedra&lt;/li&gt;&lt;li&gt;La piedra aplasta al lagarto&lt;/li&gt;&lt;li&gt;El lagarto envenena a Spock&lt;/li&gt;&lt;li&gt;Spock destroza las tijeras&lt;/li&gt;&lt;li&gt;Las tijeras decapitan al lagarto&lt;/li&gt;&lt;li&gt;El lagarto se come el papel&lt;/li&gt;&lt;li&gt;El papel refuta a Spock&lt;/li&gt;&lt;li&gt;Spock vaporiza la piedra&lt;/li&gt;&lt;li&gt;y, como siempre ha sido... La piedra aplasta las tijeras&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;un diagrama lo ejemplifica mejor:&lt;/div&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_93mjA9u4pb0/St3vTSrBwxI/AAAAAAAAAMY/rNU_WKGrwaA/s1600-h/piedra.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 400px; height: 388px;" src="http://2.bp.blogspot.com/_93mjA9u4pb0/St3vTSrBwxI/AAAAAAAAAMY/rNU_WKGrwaA/s400/piedra.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5394731043368583954" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div&gt;&lt;p&gt;Esto con el fin de minimizar el riesgo de empates en el juego... claro que es preferente que esta versión se juegue en el idioma &lt;i&gt;klingon&lt;/i&gt;, sino, pues es igual pero pierde parte del encanto =:-)&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;i&gt;Que tengan una larga y prospera vida..&lt;/i&gt;.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;http://cgarcia.blogspot.com&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18551162-3343797184352225784?l=cgarcia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cgarcia.blogspot.com/feeds/3343797184352225784/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://cgarcia.blogspot.com/2009/10/holly-shit-soy-un-nerd.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18551162/posts/default/3343797184352225784'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18551162/posts/default/3343797184352225784'/><link rel='alternate' type='text/html' href='http://cgarcia.blogspot.com/2009/10/holly-shit-soy-un-nerd.html' title='Holly shit, soy un nerd!'/><author><name>Carlos G</name><uri>http://www.blogger.com/profile/09121978431155592667</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='09946141534570844750'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_93mjA9u4pb0/St3vTSrBwxI/AAAAAAAAAMY/rNU_WKGrwaA/s72-c/piedra.png' height='72' width='72'/><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18551162.post-113790358901156166</id><published>2006-01-21T20:19:00.000-08:00</published><updated>2009-10-23T11:25:23.019-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Delphi'/><title type='text'>Mi visor volumétrico de imágenes médicas</title><content type='html'>&lt;a href="http://static.flickr.com/36/89510815_44dc453833_o_d.jpg" target="_blank"&gt;&lt;img align="left" border="0" hspace="0" src="http://static.flickr.com/36/89510815_44dc453833_m.jpg" title="" vspace="0" /&gt;&lt;/a&gt;Este proyecto es un visor volumétrico de imágenes médicas, realmente a este proyecto no se le ha dedicado el tiempo que se debiera porque han habido otros proyectos que han ido surgiendo y han hecho que este se vea pospuesto y tambien el tiempo de desarrollo hasta ahora ha sido muy corto (Solo me llevó alrededor de un mes y medio desarrollarlo). De lo que se trata es de que recibe como entrada una serie de imágenes DICOM de un estudio de algun paciente y este programa construye un modelo 3D de lo que esas imágenes y ese estudio representan. Originalmente fué desarrollado sobre Delphi 6, pero ahora compila sin problemas sobre Delphi 2006, usa como motor gráfico a OpenGL y como motor de BD a Firebird.&lt;br /&gt;&lt;br /&gt;Esta dividido en dos partes, la parte de analisis bidimensional de las imágenes, en donde se puede de una manera muy simple y práctica adecuar los niveles de brillo y contraste en los colores de la imágen, efectuar mediciones milimétricas dentro de la imagen al tamaño real del objeto del que fue tomada, cambiar los tonos y los niveles, efectuar acercamientos a ciertas areas (Zoom), etc...&lt;br /&gt;&lt;br /&gt;Y la parte de vision volumétrica, la cual es la que permite hacer la exploración 3D de los cuerpos que se representan en dichas imágenes médicas, pudiendose aplicar, planos de corte,  transparencias, eliminacion de cuerpos basado en la densidad mostrada en las imágenes, rotaciones, traslaciones, etc...&lt;br /&gt;&lt;br /&gt;Aquí algunos screenshots de la aplicación. Pueden dar click en las imágenes para verlas en tamaño completo.&lt;br /&gt;&lt;table border="0" style="width: 400px;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://static.flickr.com/19/89510819_5a4d1e258f_o_d.jpg" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;" target="_blank"&gt;&lt;img border="0" hspace="0" src="http://static.flickr.com/19/89510819_5a4d1e258f_m.jpg" title="" vspace="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;La vista 2D permite efectuar mediciones milimétricas sobre el modelo&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href="http://static.flickr.com/11/89510817_eb2f442463_o_d.jpg" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;" target="_blank"&gt;&lt;img border="0" hspace="0" src="http://static.flickr.com/11/89510817_eb2f442463_m_d.jpg" title="" vspace="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;La vista 3D del estudio anterior; es una resonancia magnetica de una cabeza humana, aqui la vemos de perfil, pero puede ser rotada en tiempo real en cualquier sentido.&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href="http://static.flickr.com/27/89510818_233b82c532_o_d.jpg" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;" target="_blank"&gt;&lt;img border="0" hspace="0" src="http://static.flickr.com/27/89510818_233b82c532_m_d.jpg" title="" vspace="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;El mismo modelo anterior aplicandole 2 cortes en 2 ejes; aqui se puede ver el interior del craneo, los cortes se aplican dinamicamente a gusto del usuario.&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href="http://static.flickr.com/13/89510820_297a48f548_o_d.jpg" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;" target="_blank"&gt;&lt;img border="0" hspace="0" src="http://static.flickr.com/13/89510820_297a48f548_m_d.jpg" title="" vspace="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Un pie humano con un factor de transparencia alta, lo cual permite ver los huesos a travez de la piel del sujeto.&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href="http://static.flickr.com/25/89510821_6aa54ca598_o_d.jpg" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;" target="_blank"&gt;&lt;img border="0" hspace="0" src="http://static.flickr.com/25/89510821_6aa54ca598_m_d.jpg" title="" vspace="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;El mismo pie variando los niveles del umbral visible con lo cual se permite descartar la piel del modelo y mostrar solo los huesos. Este proceso actualmente trabaja sobre las densidades de los objetos, permitiendo hacer la descartación en el modelo final basandose solo en que tan denso aparece el objeto en la imágen, este proceso se piensa modificar para hacerlo mucho mas selectivo y significativo.&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;DICOM es un estandar en la medicina en cuanto a la forma en como se almacenan y tratan las imágenes médicas, y practicamente todos los equipos modernos de radiografía, tomografía, ultrasonido o resonancia magnética trabajan con imágenes en formato DICOM, por lo que ahora es muy común que al paciente se le entregue ademas o en vez de las tradicionales placas de sus estudios, un CD con las imágenes en formato DICOM, con lo cual este programa puede construir todo el modelo tridimensional sin problema alguno y mostrarselo al paciente en el propio consultorio del médico.&lt;br /&gt;&lt;br /&gt;Generalmente esto es posible solo con equipos y software muy caro y el ambito esta restringido a los radiologos que cuentan con este equipo, pero ahora con esta aplicación, la idea es que cualquier médico en su consultorio pueda obtener la imágen volumetrica de los analisis que reciben sus pacientes. y asi incluso mostrarle al paciente el modelo real en 3D de su propio cuerpo en el mismo consultorio, tal vez para mostrar la evolución de alguna fractura o algún otro padecimiento.&lt;br /&gt;&lt;br /&gt;Otra aplicación que se me ocurrió es en el ámbito académico, con esta aplicación los alumnos podrán obtener una mejor idea de lo que significan las imágenes médicas así como poder hacer exploraciones mas a detalle de sus estudios pues las posibilidades son infinitas cuando se tiene una vision tridimensional de las cosas a verse forzado a hacer un análisis puramente en 2D.&lt;br /&gt;&lt;br /&gt;En este momento nos encontramos al final de la etapa de desarrollo de este producto, pero aún tenemos espectativas que se pueden contemplar para este, tales como el reconocimiento de organos automático dentro del volumen para poder hacer discriminaciones basadas no solo en la densidad de lo que se ve sino en las texturas de los tejidos, etc... asi como la construccion biplanar de modelos para simplificar y abaratar aun mas el proceso para un radiologo de obtener el estudio.&lt;br /&gt;&lt;br /&gt;En fin, esas son solo algunas cosas que se me  han ocurrido, espero que a partir de esto se me ocurran mas. Y estoy ávido tambien de que quienes lean esto me puedan dar más ideas de todo tipo, de programación, estilo, cientificas, comerciales, etc. Así que pueden sentirse con entera libertad de publicar sus comentarios al respecto.&lt;div class="blogger-post-footer"&gt;http://cgarcia.blogspot.com&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18551162-113790358901156166?l=cgarcia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cgarcia.blogspot.com/feeds/113790358901156166/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://cgarcia.blogspot.com/2006/01/mi-visor-volumtrico-de-imgenes-mdicas.html#comment-form' title='9 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18551162/posts/default/113790358901156166'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18551162/posts/default/113790358901156166'/><link rel='alternate' type='text/html' href='http://cgarcia.blogspot.com/2006/01/mi-visor-volumtrico-de-imgenes-mdicas.html' title='Mi visor volumétrico de imágenes médicas'/><author><name>Carlos G</name><uri>http://www.blogger.com/profile/09121978431155592667</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='09946141534570844750'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>9</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18551162.post-4902359309256237575</id><published>2009-10-21T17:58:00.000-07:00</published><updated>2009-10-21T20:40:09.344-07:00</updated><title type='text'>Richard Stallman en Xalapa este 26 de Nov 2009</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://infoaleph.files.wordpress.com/2008/09/richard_stallman_2005_chrys.jpg?w=333&amp;amp;h=365"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 303px; height: 335px;" src="http://infoaleph.files.wordpress.com/2008/09/richard_stallman_2005_chrys.jpg?w=333&amp;amp;h=365" border="0" alt="" /&gt;&lt;/a&gt;El próximo 26 de noviembre del 2009 Richard Stallman, fundador del movimiento GNU, estará en Xalapa -la capital del estado de Veracruz- para impartir una conferencia como parte del Tour GULEV de Software Libre 2009.&lt;br /&gt;&lt;br /&gt;El Tour será un evento de 3 días en 3 ciudades: el 26 en Xalapa, Veracruz; el 27 en Puebla, Puebla; y el 28 en Guanajuato, Guanajuato.&lt;br /&gt;&lt;br /&gt;En Xalapa, el evento será en el Museo del Transporte. Para más información visite la &lt;a href="http://go2.wordpress.com/?id=725X1342&amp;amp;site=infoaleph.wordpress.com&amp;amp;url=http%3A%2F%2Fgulev.org.mx%2Feventos%2Ftour2009%2F"&gt;página del evento&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;http://cgarcia.blogspot.com&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18551162-4902359309256237575?l=cgarcia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cgarcia.blogspot.com/feeds/4902359309256237575/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://cgarcia.blogspot.com/2009/10/richard-stallman-en-xalapa-este-26-de.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18551162/posts/default/4902359309256237575'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18551162/posts/default/4902359309256237575'/><link rel='alternate' type='text/html' href='http://cgarcia.blogspot.com/2009/10/richard-stallman-en-xalapa-este-26-de.html' title='Richard Stallman en Xalapa este 26 de Nov 2009'/><author><name>Carlos G</name><uri>http://www.blogger.com/profile/09121978431155592667</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='09946141534570844750'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18551162.post-6910925980839298473</id><published>2009-10-04T00:02:00.000-07:00</published><updated>2009-10-07T11:54:17.675-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Reflexiones de programación'/><title type='text'>Esquema de colores para PsPad</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_93mjA9u4pb0/SshMdRim-UI/AAAAAAAAAMQ/D5fHJhsCsVk/s1600-h/pspad.PNG"&gt;&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;width: 400px; height: 361px;" src="http://2.bp.blogspot.com/_93mjA9u4pb0/SshMdRim-UI/AAAAAAAAAMQ/D5fHJhsCsVk/s400/pspad.PNG" border="0" alt="" id="BLOGGER_PHOTO_ID_5388641019957279042" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.pspad.com/es/"&gt;PsPad &lt;/a&gt;es un editor de texto gratuito para programadores que por lo menos para mi se ha convertido en herramenta indispensable para el trabajo día a día.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Ahora les quiero compartir un esquema de colores que he hecho para este editor, los colores están inspirados en el de el editor para mac TextMate.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;El esquema se puede descargar de &lt;a href="http://cgarcia.isgreat.org/CGT.INI"&gt;aquí&lt;/a&gt;, espero lo disfruten tanto como yo =:-)&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="height:2em;padding:1em 0 1em 0;text-align:center;background-color:#FFFFC9;"&gt;You can download it &lt;a href="http://cgarcia.isgreat.org/CGT.INI"&gt;here&lt;/a&gt;, enjoy =:-)&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;http://cgarcia.blogspot.com&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18551162-6910925980839298473?l=cgarcia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cgarcia.blogspot.com/feeds/6910925980839298473/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://cgarcia.blogspot.com/2009/10/esquema-de-colores-para-pspad.html#comment-form' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18551162/posts/default/6910925980839298473'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18551162/posts/default/6910925980839298473'/><link rel='alternate' type='text/html' href='http://cgarcia.blogspot.com/2009/10/esquema-de-colores-para-pspad.html' title='Esquema de colores para PsPad'/><author><name>Carlos G</name><uri>http://www.blogger.com/profile/09121978431155592667</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='09946141534570844750'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_93mjA9u4pb0/SshMdRim-UI/AAAAAAAAAMQ/D5fHJhsCsVk/s72-c/pspad.PNG' height='72' width='72'/><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18551162.post-8873166249959840405</id><published>2008-05-26T01:06:00.001-07:00</published><updated>2009-07-01T14:50:56.739-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Reflexiones de programación'/><title type='text'>¿Buscas un buen hosting gratuito que soporte PHP/MySQL?</title><content type='html'>&lt;p&gt;Dale una oportunidad a &lt;a title="http://www.000webhost.com/" href="http://www.000webhost.com/"&gt;http://www.000webhost.com/&lt;/a&gt; es &lt;strong&gt;gratis&lt;/strong&gt;, sin publicidad, servidor FTP, transferencia de hasta 100GB,  con los servicios de un &lt;strong&gt;hosting&lt;/strong&gt; profesional y un desempeño bastante aceptable.&lt;/p&gt;  &lt;p&gt;Si el HTML no es tu fuerte, o no se te da muy bien el PHP, este sitio cuenta con un instalador automático de una gran variedad de sistemas manejadores de contenidos (&lt;strong&gt;CMS&lt;/strong&gt;) como &lt;strong&gt;Joomla&lt;/strong&gt;, &lt;strong&gt;Drupal&lt;/strong&gt;, &lt;strong&gt;PHPNuke&lt;/strong&gt;, etc; o si quieres montar tu propio foro puedes hacerlo con &lt;strong&gt;PHPBB&lt;/strong&gt; con un solo click, o montar tu propio Blog o &lt;strong&gt;Tienda en línea&lt;/strong&gt;, lo que se te ocurra.&lt;/p&gt;  &lt;p&gt;Lo he estado probando &lt;strike&gt;y me ha parecido muy bueno&lt;/strike&gt;, y ahora lo comparto con ustedes. Que lo disfruten y aprovechen al máximo!&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="color:#FF0000;"&gt;Update:&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;Me han borrado mi cuenta de &lt;span class="Apple-style-span"  style="color:#FF0000;"&gt;000webhost &lt;/span&gt;sin decir agua va, y no tengo ni idea de porque haya sido, el caso es que se perdieron los sitios de prueba que tenía alojados ahí y no tengo modo de recuperar ni un solo bit de información. Lo bueno es que solo eran algunas cosillas de poca importancia que solo usaba para probar como funcionaban en linea, pero eso da una buena idea de que no se deben usar estos hostings gratuitos para cosas serias, sino que hay que tomarlos mas bien a la ligera.&lt;/p&gt;&lt;p&gt;Para mi hosteo en serio estoy usando el servicio del cloud de &lt;a href="http://www.rackspacecloud.com/cloud_hosting_products/sites"&gt;RackSpace&lt;/a&gt;, con este servicio te olvidas de cualquier inconveniente con la escalabilidad de tu página o servicio en linea, lo puedo recomendar porque me ha funcionado excelentemente bien con aplicaciones verdaderamente grandes, si te interesa te puedo ofrecer una opción para que el primer mes solo pagues la mitad, solo preguntame como, y te hago llegar un cupon de descuento especial.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;http://cgarcia.blogspot.com&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18551162-8873166249959840405?l=cgarcia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cgarcia.blogspot.com/feeds/8873166249959840405/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://cgarcia.blogspot.com/2008/05/buscas-un-buen-hosting-gratuito-que.html#comment-form' title='9 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18551162/posts/default/8873166249959840405'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18551162/posts/default/8873166249959840405'/><link rel='alternate' type='text/html' href='http://cgarcia.blogspot.com/2008/05/buscas-un-buen-hosting-gratuito-que.html' title='¿Buscas un buen hosting gratuito que soporte PHP/MySQL?'/><author><name>Carlos G</name><uri>http://www.blogger.com/profile/09121978431155592667</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='09946141534570844750'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>9</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18551162.post-967256735683667141</id><published>2009-06-20T00:38:00.000-07:00</published><updated>2009-06-20T01:22:31.019-07:00</updated><title type='text'>¿es que se acabó el encanto?</title><content type='html'>Hace ya mucho tiempo que no publico algo en este blog acerca de la programación con Delphi y Firebird; tal vez algunos se pregunten si es que me he desencantado de su magia y he abandonado el sendero de la luz; pero no,  no es así de hecho todos los dias trabajo con Delphi y Firebird, dandole mantenimiento a algunos programas que se han comercializado.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Algo de trabajo me ha dado migrar algunas bases de datos desde Firebird 1.5 a Firebird 2.1, pero la verdad es que el cambio ha valido la pena y con creces, las nuevas características de la versión 2.1 son invaluables, y transportan a los servidores a un nuevo nivel. Y los clientes felices, ¿como sabes que un cliente es feliz? porque no te llama para quejarse... es muy raro que llamen para aplaudir un acierto, pero si hay algún problema puedes estar seguro que llamará :)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;No he probado la versión de Delphi 2009 así que poco puedo decir al respecto, la verdad creo que en mi caso pasará un rato para que llegue a dedicarle algo de tiempo a esta versión, pues algunas de las librerías que uso en mis proyectos, o no hay versión compatible con las nuevas reglas Unicode, o me sale en un billete actualizarlas solo para tener esta funcionalidad, lo cual no creo necesitar todavía. Tal vez mas adelante pero por ahora no está en mis planes.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;img src="http://tbn3.google.com/images?q=tbn:LS2_h1Hrn5Fd0M:http://eloisaozonas.files.wordpress.com/2008/12/nube.jpg" style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 124px; height: 93px;" border="0" alt="" /&gt;&lt;div&gt;Por lo pronto otros paisajes han llamado mi atención, el desarrollo web me sonrió y me mostró un cúmulo de posibilidades que antes no me eran ajenas pero que ahora puedo ver más claramente. Y es aquí donde he volcado mis atenciones en los últimos meses, he aprendido mucho en este aspecto, y es que el desarrollo de este tipo de aplicaciones es algo muy especial y en donde la cantidad de conceptos que debe uno manejar ha crecido exponencialmente en los últimos años; pero también he podido apreciar que el impacto social que se puede conseguir con esta clase de aplicaciones es bastante grande. Ya iré contando mis andanzas en el desarrollo web en futuros posts, y cual es mi nueva perspectiva de la web y el futuro de las aplicaciones &lt;i&gt;en las nubes&lt;/i&gt;.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;http://cgarcia.blogspot.com&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18551162-967256735683667141?l=cgarcia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cgarcia.blogspot.com/feeds/967256735683667141/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://cgarcia.blogspot.com/2009/06/es-que-se-acabo-el-encanto.html#comment-form' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18551162/posts/default/967256735683667141'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18551162/posts/default/967256735683667141'/><link rel='alternate' type='text/html' href='http://cgarcia.blogspot.com/2009/06/es-que-se-acabo-el-encanto.html' title='¿es que se acabó el encanto?'/><author><name>Carlos G</name><uri>http://www.blogger.com/profile/09121978431155592667</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='09946141534570844750'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18551162.post-4818304270509134914</id><published>2009-06-02T17:36:00.000-07:00</published><updated>2009-06-03T09:11:16.008-07:00</updated><title type='text'>El proyecto NATAL</title><content type='html'>En el último E3 una de las novedades que ha llamado más la atención es este proyecto presentado por el mismísimo &lt;span style="font-weight:bold;"&gt;Peter Moulineux&lt;/span&gt;, y que ha dejado boquiabierto a mas de cuatro:&lt;br /&gt;&lt;br /&gt;&lt;object width="425" height="344"&gt;&lt;param name="movie" value="http://www.youtube.com/v/dWnZOseA3Lw&amp;color1=0xb1b1b1&amp;color2=0xcfcfcf&amp;feature=player_embedded&amp;fs=1"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/dWnZOseA3Lw&amp;color1=0xb1b1b1&amp;color2=0xcfcfcf&amp;feature=player_embedded&amp;fs=1" type="application/x-shockwave-flash" allowfullscreen="true" width="425" height="344"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;¡Simplemente impresionante!&lt;br /&gt;&lt;br /&gt;Aunque al parecer todavía tendremos que esperar un par de años para poder probar esta maravilla en nuestros hogares; sin duda el nivel de interactividad en las consolas y en la computación en general está tomando nuevos y relucientes senderos.&lt;br /&gt;&lt;br /&gt;*Pueden ver la presentación en alta definición &lt;a href="http://www.youtube.com/watch?v=yDvHlwNvXaM"&gt;aquí&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;http://cgarcia.blogspot.com&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18551162-4818304270509134914?l=cgarcia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cgarcia.blogspot.com/feeds/4818304270509134914/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://cgarcia.blogspot.com/2009/06/el-proyecto-natal.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18551162/posts/default/4818304270509134914'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18551162/posts/default/4818304270509134914'/><link rel='alternate' type='text/html' href='http://cgarcia.blogspot.com/2009/06/el-proyecto-natal.html' title='El proyecto NATAL'/><author><name>Carlos G</name><uri>http://www.blogger.com/profile/09121978431155592667</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='09946141534570844750'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18551162.post-2196175728820312773</id><published>2007-02-24T14:05:00.000-08:00</published><updated>2008-11-28T19:04:18.573-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Rollos mios'/><title type='text'>El Dragón Trovero</title><content type='html'>Ya es muy conocida en el ambiente la historia de los &lt;a href="http://rebotacion.blogspot.com/2006/03/programadores-matando-un-dragn.html"&gt;programadores matando un dragón&lt;/a&gt; y todas las estrategias que sigue cada uno de los diferentes tipos de programadores, bien aqui esta el punto de vista "&lt;span style="font-style:italic;"&gt;trovero&lt;/span&gt;" de la misma historia, (recordarán que soy un fan de la música de trova, y en general de la poesía y me pareció curioso este hallazgo) Rodrigo Solis nos narra su poesía "El Dragón"... disfrutenla&lt;br /&gt;&lt;br /&gt;&lt;table border="0" cellpadding="4" cellspacing="0" style="  background-color: #FFFFFF   ;border-color: #cccccc; color:#FF8000 ; font-family:Arial, Helvetica, sans-serif; font-size:11px; padding:0px; border-width:1px; border-style:solid"&gt;&lt;tr&gt;&lt;td align="center"&gt;&lt;embed quality="high" pluginspage="http://www.macromedia.com/go/getflashplayer" type="application/x-shockwave-flash" bgcolor="#FFFFFF" width="200" height="140" src="http://fb.esnips.com//escentral/images/widgets/flash/note_player.swf" flashvars="autoPlay=no&amp;amp;theFile=http://fb.esnips.com//nsdoc/96461cb0-d558-4414-8cda-6036daa9baa5&amp;amp;theName=Rodrigo Solis - El Dragon&amp;amp;thePlayerURL=http://fb.esnips.com//escentral/images/widgets/flash/mp3WidgetPlayer.swf"&gt;&lt;/embed&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="font-size:11px" valign="bottom" align="center"&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;div class="blogger-post-footer"&gt;http://cgarcia.blogspot.com&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18551162-2196175728820312773?l=cgarcia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cgarcia.blogspot.com/feeds/2196175728820312773/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://cgarcia.blogspot.com/2007/02/ya-es-muy-conocida-en-el-ambiente-la.html#comment-form' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18551162/posts/default/2196175728820312773'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18551162/posts/default/2196175728820312773'/><link rel='alternate' type='text/html' href='http://cgarcia.blogspot.com/2007/02/ya-es-muy-conocida-en-el-ambiente-la.html' title='El Dragón Trovero'/><author><name>Carlos G</name><uri>http://www.blogger.com/profile/09121978431155592667</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='09946141534570844750'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18551162.post-1802962713926707421</id><published>2008-07-31T01:51:00.001-07:00</published><updated>2008-07-31T23:43:19.465-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Delphi'/><category scheme='http://www.blogger.com/atom/ns#' term='Reflexiones de programación'/><title type='text'>¿Sabes lo que es un hashmap?</title><content type='html'>&lt;p&gt;Para los programadores de &lt;strong&gt;Java&lt;/strong&gt; este concepto tal vez no sea tan extra&amp;#241;o pues el uso de hashmaps es com&amp;#250;n, pero para los programadores de &lt;strong&gt;Delphi&lt;/strong&gt; puede sonarles a nuevo.&lt;/p&gt;  &lt;p&gt;Un &lt;strong&gt;hashmap&lt;/strong&gt; es una estructura de datos que permite crear un mapa en memoria para la r&amp;#225;pida identificaci&amp;#243;n de elementos a partir de un dato usado como llave. Puedes decir: &lt;em&gt;ok si conozco muchas estructuras de datos que permiten hacer eso, &amp;#191;cual es la diferencia con los hashmaps?;&lt;/em&gt; bien, la principal es que &lt;strong&gt;los hashmaps son verdaderamente r&amp;#225;pidos&lt;/strong&gt;.&lt;/p&gt;  &lt;p&gt;La librer&amp;#237;a JCL incluye varias clases para la implementaci&amp;#243;n de diferentes tipos de hashmaps, aqu&amp;#237; mostrar&amp;#233; una de estas para poder encontrar una cadena a partir de el valor de otra:&lt;/p&gt;  &lt;pre class="delphi" name="code"&gt;var&lt;br /&gt;  Map: IJclStrStrMap;&lt;br /&gt;&lt;br /&gt;procedure TForm2.Button2Click (Sender: TObject);&lt;br /&gt;var&lt;br /&gt;  i: integer;&lt;br /&gt;begin&lt;br /&gt;  Map := TJclStrStrHashMap.Create;&lt;br /&gt;  //llenamos el hashmap con 20000 relaciones&lt;br /&gt;  for i := 1 to 20000 do&lt;br /&gt;  begin&lt;br /&gt;    Map.PutValue (Format ('Llave%d', [i]), Format ('Cadena%d', [i]));&lt;br /&gt;  end;&lt;br /&gt;end;  &lt;/pre&gt;&lt;br /&gt;Y una vez hecho esto, encontrar una aguja dentro de ese gran pajar se reduce a una simple instrucci&amp;#243;n: &lt;br /&gt;&lt;br /&gt;&lt;pre class="delphi" name="code"&gt;    ShowMessage (Map.GetValue ('Llave5670'));&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;En este caso hemos ejemplificado usando cadenas (que incluso usando hashmaps se gana mucha velocidad respecto a utilizar los cl&amp;#225;sicos derivados de TStrings, TStringList), pero las posibilidades se multiplican si te das cuenta de que puedes mapear &lt;strong&gt;grandes cantidades de objetos&lt;/strong&gt; usando esta t&amp;#233;cnica. Estos peque&amp;#241;os grandes tips hacen la diferencia entre lo que puede parecer un lento cacharro, o un veloz jet a la hora de trabajar con cantidades de datos muy considerables. &lt;/p&gt;&lt;div class="blogger-post-footer"&gt;http://cgarcia.blogspot.com&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18551162-1802962713926707421?l=cgarcia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cgarcia.blogspot.com/feeds/1802962713926707421/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://cgarcia.blogspot.com/2008/07/sabes-lo-que-es-un-hashmap.html#comment-form' title='8 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18551162/posts/default/1802962713926707421'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18551162/posts/default/1802962713926707421'/><link rel='alternate' type='text/html' href='http://cgarcia.blogspot.com/2008/07/sabes-lo-que-es-un-hashmap.html' title='¿Sabes lo que es un hashmap?'/><author><name>Carlos G</name><uri>http://www.blogger.com/profile/09121978431155592667</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='09946141534570844750'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18551162.post-114680217773356417</id><published>2006-05-04T21:09:00.000-07:00</published><updated>2008-07-23T22:17:30.420-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Delphi'/><title type='text'>Extendiendo la VCL sin usar herencia ni registrando componentes nuevos</title><content type='html'>Es com&amp;uacute;n que de repente estemos tentados a instalar fulano componente porque hace X moner&amp;iacute;a, el problema con eso es que si nos viciamos en esa practica, llevar los fuentes de nuestro proyecto a otra m&amp;aacute;quina tiene el inconveniente de que hay que instalar todos estos componentes antes de poder compilar la primera l&amp;iacute;nea de c&amp;oacute;digo.&lt;br /&gt;&lt;br /&gt;Existen algunas practicas que permiten variar el comportamiento de los componentes que trae Delphi por defecto sin hacer derivaciones de las clases registradas, lo cual permite que sin instalar nada en el IDE tengamos el resultado que deseamos. Una de esas t&amp;eacute;cnicas la describo un poco en el art&amp;iacute;culo &lt;a href="http://cgarcia.blogspot.com/2006/03/alternativas-los-skins.html" target="_blank"&gt;Alternativas a los Skins&lt;/a&gt; y es la t&amp;eacute;cnica de las clases sobrepuestas, pero en Delphi 2006 esta no es la &amp;uacute;nica opci&amp;oacute;n... existe una t&amp;eacute;cnica mas estilizada y que se apega m&amp;aacute;s a las buenas costumbres orientadas a objetos.&lt;br /&gt;&lt;br /&gt;En BDS 2006 y desde Delphi 8 existe una extensi&amp;oacute;n del lenguaje de Object Pascal llamada &lt;b&gt;Class Helpers&lt;/b&gt; esta nueva caracter&amp;iacute;stica nos permite definir nuevos comportamientos para alguna clase previamente definida de manera natural y su pr&amp;aacute;ctica nos ofrece muchos beneficios. Vamos a un ejemplo:&lt;br /&gt;&lt;br /&gt;Muchos de nosotros usamos la funcion &lt;b&gt;Trim() &lt;/b&gt;de Delphi que elimina los espacios en blanco al principio y al final de una cadena, y solemos usarla en controles como el caso del &lt;b&gt;TEdit &lt;/b&gt;con c&amp;oacute;digo como este:&lt;br /&gt;&lt;pre name="code" class="delphi"&gt;&lt;br /&gt;Edit1.Text := Trim(Edit1.Text);&lt;/pre&gt;&lt;br /&gt;Pero, &amp;iquest;no ser&amp;iacute;a mas claro y elegante que el control Edit1 tuviera un m&amp;eacute;todo &lt;b&gt;Ajustar()&lt;/b&gt; que hicera eso directamente sobre el control?, veamos como implementariamos eso, primero definimos la clase que servira como &lt;i&gt;ayudante &lt;/i&gt;de la clase &lt;b&gt;TEdit&lt;/b&gt;.&lt;br /&gt;&lt;pre name="code" class="delphi"&gt;&lt;br /&gt;TMiEdit = class helper for TEdit&lt;br /&gt;   public&lt;br /&gt;      procedure Ajusta;&lt;br /&gt;  end;&lt;/pre&gt;&lt;br /&gt;He llamado a la clase auxiliar &lt;b&gt;TMiEdit &lt;/b&gt;ya que en esta t&amp;eacute;cnica la clase &lt;i&gt;auxiliar &lt;/i&gt;no tiene que llevar el mismo nombre de la clase a la que estamos &lt;i&gt;ayudando&lt;/i&gt;, y ahora definimos el m&amp;eacute;todo nuevo:&lt;br /&gt;&lt;pre name="code" class="delphi"&gt;&lt;br /&gt;procedure TMiEdit.Ajusta;&lt;br /&gt;begin&lt;br /&gt;  Text := Trim(Text);&lt;br /&gt;end;&lt;/pre&gt;&lt;br /&gt;Observen que como esta clase es una ayudante de TEdit puedo acceder a las propiedades de la misma clase &lt;b&gt;TEdit&lt;/b&gt;, en este caso la propiedad &lt;b&gt;Text&lt;/b&gt;, ahora para hacer uso del nuevo m&amp;eacute;todo no tengo que crear nuevas instancias solo usar un objeto com&amp;uacute;n de la clase &lt;b&gt;TEdit &lt;/b&gt;de este modo:&lt;br /&gt;&lt;pre name="code" class="delphi"&gt;&lt;br /&gt;procedure TForm2.Button1Click(Sender: TObject);&lt;br /&gt;begin&lt;br /&gt;  Edit1.Ajusta;&lt;br /&gt;end;&lt;/pre&gt;&lt;br /&gt;Pero tambien se pueden modificar m&amp;eacute;todos de la clase afectada, por ejemplo si quisieramos hacer que al llamar al m&amp;eacute;todo &lt;b&gt;Clear &lt;/b&gt;del &lt;b&gt;TEdit &lt;/b&gt;este en vez de poner una cadena nula pusiera por defecto un cero, hariamos algo como esto:&lt;br /&gt;&lt;pre name="code" class="delphi"&gt;&lt;br /&gt;TMiEdit = class helper for TEdit&lt;br /&gt;   public&lt;br /&gt;      procedure Clear; overload;&lt;br /&gt;  end;&lt;br /&gt;  &lt;br /&gt;procedure TMiEdit.Clear;&lt;br /&gt;begin&lt;br /&gt;  Text := '0';&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;begin&lt;br /&gt;  Edit1.Clear;&lt;br /&gt;end;&lt;/pre&gt;&lt;br /&gt;En este caso estamos sobrecargando el m&amp;eacute;todo &lt;b&gt;Clear &lt;/b&gt;pero al ser este un m&amp;eacute;todo re-definido en la clase ayudante se toma este &amp;uacute;ltimo por defecto.&lt;br /&gt;&lt;br /&gt;Esto suele sernos &amp;uacute;til en casos donde por ejemplo tenemos que ajustar controles como el &lt;b&gt;TDBGrid &lt;/b&gt;para que soporte la ruedita del rat&amp;oacute;n, o para que cambie de casilla con la tecla Enter, o para Editar campos Memo en las celdas, etc... usando el control &lt;b&gt;TDBGrid &lt;/b&gt;de toda la vida.&lt;br /&gt;&lt;br /&gt;Las limitaciones que tiene esta t&amp;eacute;cnica son que desde las &lt;i&gt;clases ayudantes&lt;/i&gt; no se puede tener acceso a propiedades o m&amp;eacute;todos declarados como estrictamente privados o estrictamente protegidos, asi como tampoco permite la definici&amp;oacute;n de datos adicionales, es decir que no se pueden declarar variables de campos en estas&lt;i&gt; clases auxiliares&lt;/i&gt;; lo &amp;uacute;nico que se permite es que se p&amp;uacute;eden definir &lt;b&gt;variables de clase&lt;/b&gt; (una nueva caracter&amp;iacute;stica tambien), es decir variables que ser&amp;aacute;n comunes a todas las instancias de la clase ayudada, esto es &amp;uacute;til para por ejemplo poder llevar la cuenta de cuantas instancias de &lt;i&gt;X &lt;/i&gt;clase se han creado y de alguna manera implementar variantes del patr&amp;oacute;n de dise&amp;ntilde;o &lt;b&gt;singleton &lt;/b&gt;sobrecargando el constructor de la clase.&lt;div class="blogger-post-footer"&gt;http://cgarcia.blogspot.com&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18551162-114680217773356417?l=cgarcia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cgarcia.blogspot.com/feeds/114680217773356417/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://cgarcia.blogspot.com/2006/05/extendiendo-la-vcl-sin-usar-herencia.html#comment-form' title='3 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18551162/posts/default/114680217773356417'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18551162/posts/default/114680217773356417'/><link rel='alternate' type='text/html' href='http://cgarcia.blogspot.com/2006/05/extendiendo-la-vcl-sin-usar-herencia.html' title='Extendiendo la VCL sin usar herencia ni registrando componentes nuevos'/><author><name>Carlos G</name><uri>http://www.blogger.com/profile/09121978431155592667</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='09946141534570844750'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18551162.post-114178861768317705</id><published>2006-03-07T19:30:00.000-08:00</published><updated>2008-07-23T22:12:19.043-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Delphi'/><title type='text'>Alternativas a los skins</title><content type='html'>Existen muchos y muy variadas herramientas en el mercado que permiten hacer cosas bastante llamativas con las interfaces de los programas, VCLSkin, SuiSkin, entre otros con sus ventajas y desventajas entre ellos&lt;br /&gt;&lt;br /&gt;Algunos usan sus propios componentes, es decir su propio TEditSkineado, TPanelEskineado, etc, el problema con eso es que obviamente cuando los usas te obligas a reescribir tu aplicacion o al menos pasarle un experto que cambie los nombres de las clases de los controles que ahora ser&amp;aacute;n del nuevo tipo; y tambien con eso ya te estas &lt;strike&gt;jodiendo&lt;/strike&gt; comprometiendo de alguna manera con ese proveedor de la herramienta, pues algunas caracter&amp;iacute;sticas que ofrezcan estos componentes no se encontrar&amp;aacute;n en las clases gen&amp;eacute;ricas.&lt;br /&gt;&lt;br /&gt;Otros como VCLSkin son mas flexibles, con solo poner un simple componente en tu formulario principal te cambia la apariencia de la aplicaci&amp;oacute;n por completo, abarcando incluso cuadros de dialogo y dem&amp;aacute;s chunches propios de windows&lt;br /&gt;&lt;br /&gt;Aqui vamos a discutir una alternativa al uso de estas herramientas que son de pago (aunque algunas realmente valen lo que cuestan si la apariencia es tan importante para ti), y lo haremos usando una t&amp;eacute;cnica ancestral que nos provee Delphi y a la que se le llama "&lt;b&gt;Clases Sobrepuestas&lt;/b&gt;". Es increible cuanto mejora la apariencia de una ventana tan solo usando colores agradables y redondeando las esquinas de los componentes contenedores, aqui va el ejemplo vamos a estudiar como hacer que esto en dise&amp;ntilde;o:&lt;br /&gt;&lt;img src="http://static.flickr.com/41/109717585_8a65979557.jpg" title="" border="0" hspace="0" vspace="0"&gt;&lt;br /&gt;se vea en ejecuci&amp;oacute;n como esto:&lt;br /&gt;&lt;img src="http://static.flickr.com/53/109717588_722228606b.jpg" title="" border="0" hspace="0" vspace="0"&gt;&lt;br /&gt;&lt;b&gt;Sin usar componentes de terceros&lt;/b&gt; y sin tener que cambiar los componentes que ahora estas usando en tu aplicaci&amp;oacute;n com&amp;uacute;n y corriente de Delphi.&lt;br /&gt;&lt;br /&gt;La idea es muy simple, vamos a hacer una unidad que ser&amp;aacute; la que pongas al final de la secci&amp;oacute;n uses de tu forma en la parte de la interfase; ahora, esto es importante, la unidad que contenga las clases sobrepuestas &lt;b&gt;debe ser la &amp;uacute;ltima en la lista del uses&lt;/b&gt;, sino podria no funcionar el truco, por lo menos no para las clases que esten contenidas en las unidades que se encuentren despues de la nuestra.&lt;br /&gt;&lt;br /&gt;Primero creamos una nueva unidad llamada &lt;b&gt;GTPaneles.pas&lt;/b&gt;, y  definamos algunos par&amp;aacute;metros configurables al gusto de cada quien...&lt;br /&gt;&lt;pre name="code" class="delphi"&gt;&lt;br /&gt;const&lt;br /&gt;  CnstArco = 35;&lt;br /&gt;  CnstBotonNormal = clMoneyGreen;&lt;br /&gt;  CnstBotonPress = clGray;&lt;br /&gt;  CnstTagDisable = 99;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;la constante CnstArco definir&amp;aacute; que tan pronunciados queremos que sean los arcos de las esquinas redondeadas, las siguientes dos constantes definen los colores que tendr&amp;aacute;n los botones en los estados normal y cuando estan presionados, y por &amp;uacute;ltimo definimos un valor para diferenciar a aquellos componentes a los que no quisieramos que se les aplique el proceso de "&lt;i&gt;embellecimiento&lt;/i&gt;", esta t&amp;eacute;cnica la usa VCLSkin, donde si a algun panel no quisieras que se le aplique el Skin solo basta con poner el valor 99 en la propiedad Tag de dicho componente. &lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;Yo suelo utilizar la propiedad Tag de los componentes para algunos trucos al nivel de la interface de las aplicaciones, si ese es tu caso tambien tendr&amp;iacute;as que hacer algunos malabares para que esto no te ocasione problemas&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Para ejemplificar el trabajo lo haremos con la clase TPanel, y mostraremos la parte mas simple del asunto, aqui hacemos la sobreposici&amp;oacute;n de la clase:&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="delphi"&gt;&lt;br /&gt;TPanel = class(ExtCtrls.TPanel)&lt;br /&gt;  protected&lt;br /&gt;    procedure Paint; override;&lt;br /&gt;  end;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Definamos un par de procedimientos gen&amp;eacute;ricos que usaremos despues en la implementacion de los m&amp;eacute;todos de las clases sobrepuestas:&lt;br /&gt;&lt;br /&gt;Este procedimiento borra el fondo donde se ha de dibujar el control y prepara el terreno para dibujar nuestra obra de arte.&lt;br /&gt;&lt;pre name="code" class="delphi"&gt;&lt;br /&gt;procedure QuitarFondo(Control: TControl; Dest: TCanvas);&lt;br /&gt;var&lt;br /&gt;  SaveIndex: Integer;&lt;br /&gt;  DC: HDC;&lt;br /&gt;  Position: TPoint;&lt;br /&gt;begin&lt;br /&gt;  with Control do&lt;br /&gt;  begin&lt;br /&gt;    if Parent = nil then&lt;br /&gt;      Exit;&lt;br /&gt;    DC := Dest.Handle;&lt;br /&gt;    SaveIndex := SaveDC(DC);&lt;br /&gt;{$IFDEF PDJ_2}&lt;br /&gt;    GetViewportOrgEx(DC, @Position);&lt;br /&gt;{$ELSE}&lt;br /&gt;    GetViewportOrgEx(DC, Position);&lt;br /&gt;{$ENDIF}&lt;br /&gt;    SetViewportOrgEx(DC, Position.X - Left, &lt;br /&gt;                           Position.Y - Top, nil);&lt;br /&gt;    IntersectClipRect(DC, 0, 0, Parent.ClientWidth, &lt;br /&gt;                       Parent.ClientHeight);&lt;br /&gt;    Parent.Perform(WM_ERASEBKGND, Integer(DC), Integer(0));&lt;br /&gt;    Parent.Perform(WM_PAINT, Integer(DC), Integer(0));&lt;br /&gt;    RestoreDC(DC, SaveIndex);&lt;br /&gt;  end;&lt;br /&gt;end;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Este otro dibuja ya formalmente los rectangulos redondeados de modo que de la perspectiva 3D.&lt;br /&gt;&lt;pre name="code" class="delphi"&gt;&lt;br /&gt;procedure DibujaRedondeado(const C: TCanvas; R1: &lt;br /&gt;                      TRect; Color: TColor);&lt;br /&gt;var R2: TRect;&lt;br /&gt;begin&lt;br /&gt;  //Guardamos el Rectangulo original&lt;br /&gt;  R2 := R1;&lt;br /&gt;  with C do&lt;br /&gt;  begin&lt;br /&gt;    Pen.Width := 1;&lt;br /&gt;    //Dibujamos la sombra&lt;br /&gt;    inc(R1.left, Pen.Width);&lt;br /&gt;    inc(R1.top, Pen.Width);&lt;br /&gt;    pen.Color := clbtnhighlight;&lt;br /&gt;    Brush.Style := bsSolid;&lt;br /&gt;    Brush.Color := Color;&lt;br /&gt;    RoundRect(R1.Left, r1.top, r1.Right, r1.Bottom, &lt;br /&gt;                                    CnstArco, CnstArco);&lt;br /&gt;&lt;br /&gt;    pen.Color := color;&lt;br /&gt;    Brush.Style := bsclear;&lt;br /&gt;    inc(R1.left, Pen.Width);&lt;br /&gt;    inc(R1.top, Pen.Width);&lt;br /&gt;    RoundRect(R1.Left, r1.top, r1.Right, r1.Bottom, &lt;br /&gt;                                       CnstArco, CnstArco);&lt;br /&gt;&lt;br /&gt;    //Dibujamos la base...&lt;br /&gt;    pen.Color := clBlack;&lt;br /&gt;    Brush.Style := bsclear;&lt;br /&gt;    r1 := R2; //Recuperamos el rectangulo original...&lt;br /&gt;    RoundRect(R1.Left, r1.top, r1.Right, r1.Bottom, &lt;br /&gt;                                       CnstArco, CnstArco);&lt;br /&gt;    Brush.Style := bsSolid;&lt;br /&gt;  end;&lt;br /&gt;end;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Despues de eso solo basta con codificar la nueva versi&amp;oacute;n del m&amp;eacute;todo Paint del componente mandando a llamar a los dos m&amp;eacute;todos que ya vimos:&lt;br /&gt;&lt;pre name="code" class="delphi"&gt;&lt;br /&gt;procedure TPanel.Paint;&lt;br /&gt;begin&lt;br /&gt;  if (Tag &lt;&gt; CnstTagDisable) then&lt;br /&gt;  begin&lt;br /&gt;  QuitarFondo(Self, Canvas);&lt;br /&gt;  DibujaRedondeado(Canvas, GetClientRect, Color);&lt;br /&gt;  end else inherited;&lt;br /&gt;end;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Para el caso de los botones y los TGroupBoxes el procedimiento es similar con la variante de desplegar el texto o el caption del componente en cuesti&amp;oacute;n, e incluso se puede hacer una variante que dibuje tambien los Glyphs de los botones, pero yo por lo menos mi versi&amp;oacute;n la he dejado hasta ahi; si alguien continua con este desarrollo hagamelo saber. Tambi&amp;eacute;n sobre BDS 2006 se pueden hacer uso de los nuevos eventos OnMouseEnter y OnMouseLeave para dar m&amp;aacute;s efectos a los componentes.&lt;br /&gt;&lt;br /&gt;En la &lt;a href="http://www.esnips.com/web/cgarciablog/" target="_blank"&gt;secci&amp;oacute;n de archivos de este blog&lt;/a&gt; esta disponible para descargar un demo completo de lo aqui explicado, seguro que con un poco mas de dedicaci&amp;oacute;n se puede ampliar la unidad para que soporte mas clases y con mejor apariencia.&lt;div class="blogger-post-footer"&gt;http://cgarcia.blogspot.com&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18551162-114178861768317705?l=cgarcia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cgarcia.blogspot.com/feeds/114178861768317705/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://cgarcia.blogspot.com/2006/03/alternativas-los-skins.html#comment-form' title='4 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18551162/posts/default/114178861768317705'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18551162/posts/default/114178861768317705'/><link rel='alternate' type='text/html' href='http://cgarcia.blogspot.com/2006/03/alternativas-los-skins.html' title='Alternativas a los skins'/><author><name>Carlos G</name><uri>http://www.blogger.com/profile/09121978431155592667</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='09946141534570844750'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18551162.post-113530615635136948</id><published>2005-12-22T18:49:00.000-08:00</published><updated>2008-07-23T21:41:43.622-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Delphi'/><title type='text'>Escribir en el Canvas de un componente</title><content type='html'>&lt;a href="http://www.enekoalonso.com/main/" target="_blank"&gt;Eneko alonso&lt;/a&gt; es un joven programador de Delphi que en su p&amp;aacute;gina web nos comparte esta muy &amp;uacute;til funcion que permite escribir sobre el Canvas de algun componente en nuestras aplicaciones, pero les dejo que sean sus propias palabras quienes les expliquen el truco:&lt;br /&gt;&lt;blockquote&gt;Para escribir texto transparente sobre el canvas de cualquier componente visual en Delphi, hay que usar la funci&amp;oacute;n SetBkMode de la API de Windows.&lt;/blockquote&gt;&lt;br /&gt;&lt;pre name="code" class="delphi"&gt;procedure TForm1.Button1Click(Sender: TObject);&lt;br /&gt;var&lt;br /&gt;  AnteriorBkMode: integer;&lt;br /&gt;begin&lt;br /&gt; with Form1.Canvas do begin&lt;br /&gt;  Brush.Color := clRed;&lt;br /&gt;  TextOut(100, 80, 'Texto Opaco');&lt;br /&gt;  AnteriorBkMode := SetBkMode(Handle, TRANSPARENT);&lt;br /&gt;  TextOut(100, 100, 'Texto Transparente');&lt;br /&gt;  SetBkMode(Handle, AnteriorBkMode);&lt;br /&gt; end;&lt;br /&gt;end;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;http://cgarcia.blogspot.com&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18551162-113530615635136948?l=cgarcia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cgarcia.blogspot.com/feeds/113530615635136948/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://cgarcia.blogspot.com/2005/12/escribir-en-el-canvas-de-un-componente.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18551162/posts/default/113530615635136948'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18551162/posts/default/113530615635136948'/><link rel='alternate' type='text/html' href='http://cgarcia.blogspot.com/2005/12/escribir-en-el-canvas-de-un-componente.html' title='Escribir en el Canvas de un componente'/><author><name>Carlos G</name><uri>http://www.blogger.com/profile/09121978431155592667</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='09946141534570844750'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18551162.post-116296612518820009</id><published>2006-11-07T22:08:00.000-08:00</published><updated>2008-07-23T21:36:40.777-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Delphi'/><title type='text'>Distribuciones Estadísticas</title><content type='html'>&lt;img src="http://static.flickr.com/103/291937441_0bc1131a76_o.gif" title="Distribuciones Estadisticas" border="0" hspace="2" vspace="2"&gt; &lt;br /&gt;En &lt;a href="http://www.esnips.com//r/td/doc/924d4a02-c350-4fcb-80c5-e2eb44c71e65/GTDistrib.pas" target="_blank"&gt;esta unidad&lt;/a&gt; de Delphi se encuentra la implementaci&amp;oacute;n como una jerarquia de clases para el manejo de una buena cantidad de distribuciones estad&amp;iacute;sticas.&lt;br /&gt;&lt;br /&gt;El hecho de que sea una jerarquia de clases le agrega una gran versatilidad a lo que ya de por s&amp;iacute; es una herramienta estad&amp;iacute;stica muy poderosa, ya que se pueden extender sus funcionalidades tan solo agregando nuevas clases a la jerarquia o bien sobreescribiendo algunos m&amp;eacute;todos que aparecen en las clases ancestras como m&amp;eacute;todos virtuales.&lt;br /&gt;&lt;br /&gt;Una distribuci&amp;oacute;n muy com&amp;uacute;n es la &lt;b&gt;Chi Cuadrada&lt;/b&gt;, &amp;oacute; &lt;b&gt;Ji Cuadrada&lt;/b&gt;, muy &amp;uacute;til para hacer pruebas de hip&amp;oacute;tesis, analisis de dependencias, correlaciones, entre otras cosas. El siguiente ejemplo muestra lo sencillo que es hacer c&amp;aacute;lculos sobre la distribuci&amp;oacute;n usando esta herramienta:&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="delphi"&gt;var C: TChi_square_distribution;&lt;br /&gt;  P: Single;&lt;br /&gt;begin&lt;br /&gt;  // Creamos la instancia&lt;br /&gt;  // en este caso con 4 grados de libertad&lt;br /&gt;  C := TChi_square_distribution.create(4);&lt;br /&gt;  // Obtenemos la probabilidad acumulada al valor 5&lt;br /&gt;  P := C.prob_between(0, 5);&lt;br /&gt;  // Probabilidad X &gt;= 5&lt;br /&gt;  P := 1 - C.prob_between(0, 5);&lt;br /&gt;  // El valor de la función de densidad en 10&lt;br /&gt;  D := C.density(10);&lt;br /&gt;  C.Free;&lt;br /&gt;end;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Pero esta es solo una de las muchas distribuciones disponibles, entre las &lt;b&gt;distribuciones continuas&lt;/b&gt; se encuentran la Normal, Gamma, Beta, F, T de Student, Exponencial, y muchas otras, y adem&amp;aacute;s tambien ofrece &lt;b&gt;distribuciones discretas&lt;/b&gt; como la hipergeom&amp;eacute;trica, Binomial, Poisson, etc.&lt;br /&gt;&lt;br /&gt;Las posibilidades que ofrece esta herramienta son muchisimas, pues las distribuciones estad&amp;iacute;sticas tienen muchos usos en cuestiones de &lt;b&gt;predictibilidad&lt;/b&gt;, analisis de &lt;b&gt;relaciones &lt;/b&gt;y &lt;b&gt;dependencias &lt;/b&gt;entre diferentes datos, definitivamente estar familiarizado con conceptos estad&amp;iacute;sticos te puede dar una gran ventaja sobre otros programadores pues puedes ofrecer productos que brinden mucha m&amp;aacute;s informaci&amp;oacute;n &lt;b&gt;&amp;uacute;til &lt;/b&gt;a tus clientes y con esto tener un &lt;b&gt;excelente valor agregado&lt;/b&gt; en tus programas.&lt;div class="blogger-post-footer"&gt;http://cgarcia.blogspot.com&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18551162-116296612518820009?l=cgarcia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cgarcia.blogspot.com/feeds/116296612518820009/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://cgarcia.blogspot.com/2006/11/distribuciones-estadsticas.html#comment-form' title='3 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18551162/posts/default/116296612518820009'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18551162/posts/default/116296612518820009'/><link rel='alternate' type='text/html' href='http://cgarcia.blogspot.com/2006/11/distribuciones-estadsticas.html' title='Distribuciones Estad&amp;iacute;sticas'/><author><name>Carlos G</name><uri>http://www.blogger.com/profile/09121978431155592667</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='09946141534570844750'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18551162.post-113639607148761130</id><published>2006-01-04T09:34:00.000-08:00</published><updated>2008-07-23T19:25:07.653-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Delphi'/><title type='text'>Por fin sobrecarga de operadores en Delphi</title><content type='html'>Dandole unos cuantos teclazos al &lt;b&gt;BDS 2006&lt;/b&gt; estuve probando la caracter&amp;iacute;stica de la que tanto se presumia antes de liberarse que era la inclusi&amp;oacute;n de sobrecarga de operadores. Aunque yo esperaba que fuera a nivel de clases parece que nos tendremos que conformar por ahora con su implementaci&amp;oacute;n en estructuras de tipo &lt;b&gt;record&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;Por ejemplo, para implementar como una estructura el manejo de n&amp;uacute;meros fraccionarios usabamos algo como esto:&lt;br /&gt;&lt;pre name="code" class="delphi"&gt; TFraccionario = record&lt;br /&gt;    numerador, denominador: integer;&lt;br /&gt; end;&lt;/pre&gt;&lt;br /&gt;Ahora tenemos la posibilidad de agregar operadores que se encarguen de la transferencia de informaci&amp;oacute;n asi como de las operaciones entre las estructuras, por ejemplo agregando el operador &lt;b&gt;implicit &lt;/b&gt;:&lt;br /&gt;&lt;pre name="code" class="delphi"&gt; TFraccionario = record&lt;br /&gt;  numerador, denominador: integer;&lt;br /&gt;  class operator implicit( Value: TFraccionario): string;&lt;br /&gt;end;&lt;/pre&gt;&lt;br /&gt;y su implementaci&amp;oacute;n:&lt;br /&gt;&lt;pre name="code" class="delphi"&gt; class operator TFraccionario.implicit(Value: &lt;br /&gt;                                   TFraccionario): string;&lt;br /&gt;begin&lt;br /&gt;   Result := IntToStr(Value.Numerador) + '/'+ &lt;br /&gt;             IntToStr(Value.Denominador);&lt;br /&gt;end;&lt;/pre&gt;&lt;br /&gt;Ahora podemos asignar una variable de tipo &lt;b&gt;TFraccionario &lt;/b&gt;a una simple y sencilla cadena asi:&lt;br /&gt;&lt;pre name="code" class="delphi"&gt;var&lt;br /&gt;  R1 : TFraccionario;&lt;br /&gt;  S: string;&lt;br /&gt;begin&lt;br /&gt;  R1.Numerador := 2;&lt;br /&gt;  R1.Denominador := 6;&lt;br /&gt;  S := R1; //Aqui S valdria literalmente "2/6"&lt;/pre&gt;&lt;br /&gt;Y tambi&amp;eacute;n a la inversa, podemos definir un comportamiento de operador para cuando queremos asignar una cadena a una variable de tipo &lt;b&gt;TFraccionario&lt;/b&gt;&lt;br /&gt;&lt;pre name="code" class="delphi"&gt; class operator implicit( Value: string) : TFraccionario;&lt;/pre&gt;&lt;br /&gt;Y lo implementamos haciendo un parseo muy simple para la cadena,  al fin de cuentas nadamas estamos ilustrando un ejemplo, no es la idea poner un parser completo sino mostrar el funcionamiento de los operadores&lt;br /&gt;&lt;pre name="code" class="delphi"&gt;class operator TFraccionario.implicit(Value: string): &lt;br /&gt;                                             TFraccionario;&lt;br /&gt;var p : integer;&lt;br /&gt;begin&lt;br /&gt;  Result.numerador := 0;&lt;br /&gt;  Result.denominador := 0;&lt;br /&gt;  p := Pos('/',Value);&lt;br /&gt;  if P = 0 then exit;&lt;br /&gt;  Result.numerador := StrToIntDef(Copy(Value,1,P-1),0);&lt;br /&gt;  Result.denominador := StrToIntDef(Copy(Value,P+1,&lt;br /&gt;                                     Length(Value)),0);&lt;br /&gt;end;&lt;/pre&gt;&lt;br /&gt;Y una vez hecho esto ya podemos asignar cadenas a variables de tipo &lt;b&gt;TFraccionario&lt;/b&gt;, de esta manera:&lt;br /&gt;&lt;pre name="code" class="delphi"&gt; var&lt;br /&gt;  R1 : TFraccionario;&lt;br /&gt;begin&lt;br /&gt;  R1 := '2/6';&lt;/pre&gt;&lt;br /&gt;Pero, &amp;iquest;como sumariamos 2 n&amp;uacute;meros fraccionarios usando directamente el operador &lt;b&gt;+&lt;/b&gt;?, pues bien para eso pondr&amp;iacute;amos una definici&amp;oacute;n de operador llamada add dentro de la misma estructura del registro, ahora la declaraci&amp;oacute;n del tipo completo ser&amp;iacute;a:&lt;br /&gt;&lt;pre name="code" class="delphi"&gt; TFraccionario = record&lt;br /&gt;  numerador, denominador: integer;&lt;br /&gt;  class operator implicit( Value: TFraccionario): string;&lt;br /&gt;  class operator implicit( Value: string) : TFraccionario;&lt;br /&gt;  class operator add( v1, v2 : TFraccionario): TFraccionario;&lt;br /&gt;end;&lt;/pre&gt;&lt;br /&gt;Y la implementaci&amp;oacute;n del operador (si mis maestros de la primaria no me enga&amp;ntilde;aron) ser&amp;iacute;a algo como esto:&lt;br /&gt;&lt;pre name="code" class="delphi"&gt;class operator TFraccionario.add(v1, v2: TFraccionario): &lt;br /&gt;                                             TFraccionario;&lt;br /&gt;begin&lt;br /&gt;   if (V1.denominador = V2.denominador) then&lt;br /&gt;   begin&lt;br /&gt;     Result.denominador := V1.denominador;&lt;br /&gt;     Result.numerador := V1.numerador + V2.numerador;&lt;br /&gt;   end&lt;br /&gt;   else&lt;br /&gt;   begin&lt;br /&gt;     Result.numerador := (V1.numerador * V2.denominador) +&lt;br /&gt;                         (V1.denominador * V2.numerador );&lt;br /&gt;     Result.denominador := V1.denominador * V2.denominador;&lt;br /&gt;   end;&lt;br /&gt;end;&lt;/pre&gt;&lt;br /&gt;Si, si, ya se que tambien se podr&amp;iacute;a simplificar el n&amp;uacute;mero a su m&amp;iacute;nima expresi&amp;oacute;n una vez efectuada la suma, pero prefiero dejarlo as&amp;iacute; por ahora para que no se complique en demas&amp;iacute;a el algoritmo y podamos admirar el trabajo con los operadores en vez de eso.&lt;br /&gt;&lt;br /&gt;Ahora a poner a prueba el trabajo que hicimos, y a hacer tambi&amp;eacute;n porque no algunos experimentos, primero veamos como podemos inicializar dos n&amp;uacute;meros fraccionarios a partir de un par de cadenas y sumemos ambos n&amp;uacute;meros y mostremos el resultado de la operaci&amp;oacute;n tambi&amp;eacute;n en una cadena, para hacer uso de todos los operadores que hicimos, para eso ponemos un &lt;b&gt;TButton &lt;/b&gt;en el formulario y le codificamos esto en el evento &lt;b&gt;OnClick&lt;/b&gt;:&lt;br /&gt;&lt;pre name="code" class="delphi"&gt;procedure TForm2.Button1Click(Sender: TObject);&lt;br /&gt;var&lt;br /&gt;  R1,R2 : TFraccionario;&lt;br /&gt;begin&lt;br /&gt;  R1 := '2/6';&lt;br /&gt;  R2 := '3/6';&lt;br /&gt;  Caption := R1 + R2;  //Esto devuelve "5/6" en el caption&lt;br /&gt;end;&lt;/pre&gt;&lt;br /&gt;&amp;iexcl;Bastante pr&amp;aacute;ctico!, &amp;iquest;no es cierto?... &amp;iquest;pero ahora si en vez de que se aplicara la operaci&amp;oacute;n entre ambos n&amp;uacute;meros fraccionarios lo que nos interesara fuera obtener la concatenaci&amp;oacute;n de sus representaciones como cadenas???, bien en ese caso lo que hay que hacer es tratar a ambas variables como cadenas para que el operador que nosotros definimos pierda su efecto y en vez de esto se aplique el operador predeterminado para el trabajo con cadenas, en este caso la concatenaci&amp;oacute;n:&lt;br /&gt;&lt;pre name="code" class="delphi"&gt;Caption := string(R1) + string(R2); //Esto devuelve "2/63/6"&lt;/pre&gt;&lt;br /&gt;&amp;iexcl;Fant&amp;aacute;stico!, y &amp;iquest;podr&amp;iacute;amos hacer combinaciones?? es decir,&amp;iquest; aplicar el operador con secuencias de operandos de diferentes tipos??... Si, claro y tambi&amp;eacute;n esto ofrece un gran poder, solo hay que ver esto:&lt;br /&gt;&lt;pre name="code" class="delphi"&gt;Caption := R1 + R2 + '1/6'; //Esto devuelve "6/6" !!!&lt;/pre&gt;&lt;br /&gt;&amp;iexcl;Estupendo!!...de la misma manera podriamos definir muchos mas operadores para el trabajo con n&amp;uacute;meros fraccionarios, por ejemplo:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Add +&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Substract -&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Multiply *&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Divide /&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Negative -&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Equal =&lt;/li&gt;&lt;br /&gt;&lt;li&gt;NotEqual &lt;&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;LessThan &lt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;LessThanOrEqual &lt;=&lt;/li&gt;&lt;br /&gt;&lt;li&gt;GreaterThan &gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;GreaterThanOrEqual &gt;=&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Con lo que hemos visto hasta ahora es f&amp;aacute;cil imaginarse como ser&amp;iacute;a la implementaci&amp;oacute;n del resto de los operadores, suerte y a practicar esta nueva funcionalidad.&lt;div class="blogger-post-footer"&gt;http://cgarcia.blogspot.com&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18551162-113639607148761130?l=cgarcia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cgarcia.blogspot.com/feeds/113639607148761130/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://cgarcia.blogspot.com/2006/01/por-fin-sobrecarga-de-operadores-en.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18551162/posts/default/113639607148761130'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18551162/posts/default/113639607148761130'/><link rel='alternate' type='text/html' href='http://cgarcia.blogspot.com/2006/01/por-fin-sobrecarga-de-operadores-en.html' title='Por fin sobrecarga de operadores en Delphi'/><author><name>Carlos G</name><uri>http://www.blogger.com/profile/09121978431155592667</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='09946141534570844750'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18551162.post-113581788487539549</id><published>2005-12-28T16:58:00.000-08:00</published><updated>2008-07-23T19:15:18.389-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Firebird'/><title type='text'>Nulos e Integridad Referencial</title><content type='html'>Trabajando en un proyecto reciente me encontr&amp;eacute; con este detalle que parece tener Firebird (al menos en las versiones 1.5.2 y hasta el 1.5.3 RC3 que es la que tengo en mi laptop). Result&amp;oacute; ser ese tipo de cosas que te encuentras y que te pueden tomar muchas horas en dilucidar en donde es que radica el problema y resulta ser algo risorio y que se le ha escapado a alguien en el desarrollo de Firebird.&lt;br /&gt;&lt;br /&gt;Para empezar he de explicar el escenario donde me ocurri&amp;oacute; esto, tengo una tabla llamada &lt;b&gt;GESTORES &lt;/b&gt;donde a cada gestor se le puede o no asociar un usuario del sistema, entonces hay registros que tienen un valor en este campo y otros en los que simplemente se queda en nulo. Dado esto, en teor&amp;iacute;a esta consulta me deber&amp;iacute;a dar todos los usuarios que &lt;b&gt;no&lt;/b&gt; estan asociados a alg&amp;uacute;n gestor:&lt;br /&gt;&lt;pre name="code" class="sql"&gt; SELECT (GEN_USUARIOS.USU_ID)&lt;br /&gt;FROM GEN_USUARIOS&lt;br /&gt;WHERE &lt;br /&gt;   (usu_id not in (SELECT distinct GES_USUARIO&lt;br /&gt;                   FROM AFI_GESTORES&lt;br /&gt;                   ))&lt;/pre&gt;&lt;br /&gt;Sin embargo, no fu&amp;eacute; as&amp;iacute;, esta consulta no me devolv&amp;iacute;a ni un solo valor aunque yo sab&amp;iacute;a que si habian por lo menos 15 usuarios que no estaban asociados a alg&amp;uacute;n gestor.&lt;br /&gt;&lt;br /&gt;De repente algun Dios olimpico ilumin&amp;oacute; mi mente y me llego la idea de que tal vez el hecho de que hubiera valores nulos en la tabla de gestores influir&amp;iacute;a, as&amp;iacute; que le agregu&amp;eacute; una peque&amp;ntilde;a condici&amp;oacute;n para ignorar los valores nulos de la relaci&amp;oacute;n:&lt;br /&gt;&lt;pre name="code" class="sql"&gt; SELECT (GEN_USUARIOS.USU_ID)&lt;br /&gt;FROM GEN_USUARIOS&lt;br /&gt;WHERE &lt;br /&gt;   (usu_id not in (SELECT distinct GES_USUARIO&lt;br /&gt;                   FROM AFI_GESTORES&lt;br /&gt;                   WHERE GES_USUARIO IS NOT NULL&lt;br /&gt;                   ))&lt;/pre&gt;&lt;br /&gt;Con esto ya funcion&amp;oacute; sin ning&amp;uacute;n problema el programa, ahora si me devolv&amp;iacute;a los 15 registros de los usuarios que no estaban asociados a gestores.&lt;br /&gt;&lt;br /&gt;Pero la duda me aquejaba acerca de si esto era una constante en las relaciones&lt;b&gt; WHERE NOT IN&lt;/b&gt; asi que me le&amp;iacute; el magn&amp;iacute;fico art&amp;iacute;culo de &lt;a href="http://www.firebirdsql.org/pdfmanual/Firebird-Null-Guide.pdf" target="_blank"&gt;Firebird Nulls Guide&lt;/a&gt; del sitio de Firebird, en el cual se explica mucho acerca del comportamiento de los valores nulos en las comparaciones y operaciones con Firebird, pero nada que me diera un Norte sobre porque mi consulta especificamente tenia un comportamiento tan err&amp;aacute;tico. Prob&amp;eacute; con otras tablas de la misma base de datos y solo con estas dos me devolvia un conjunto vac&amp;iacute;o. Al rebuscar m&amp;aacute;s meticulosamente cai en la cuenta de que la diferencia radicaba en que no hab&amp;iacute;a definido una regla de integridad referencial entre los campos de ambas relaciones, asi que raudo y veloz proced&amp;iacute; a crearla:&lt;br /&gt;&lt;pre name="code" class="sql"&gt; alter table AFI_GESTORES&lt;br /&gt;add constraint FK_GES_USUARIO&lt;br /&gt;foreign key (GES_USUARIO)&lt;br /&gt;references GEN_USUARIOS(USU_ID)&lt;br /&gt;on delete SET NULL&lt;br /&gt;on update CASCADE&lt;/pre&gt;&lt;br /&gt;Y una vez hecho esto ya la primer consulta funciona perfectamente. Osea que al final de cuentas el problema es que la combinaci&amp;oacute;n de comparaci&amp;oacute;n del tipo &lt;b&gt;WHERE [NOT] IN SELECT&lt;/b&gt; falla cuando en el subselect existen valores nulos y no hay una relaci&amp;oacute;n de integridad entre ambas relaciones, esto pareciera trivial, pero cuando en un sistema tratas de explotar al m&amp;aacute;ximo los datos que tienes las consultas de este tipo suelen ser muy comunes y si tienes un sistema de consultas din&amp;aacute;micas o algun experto programado que haga estas consultas puede caer muy f&amp;aacute;cilmente en estos casos y no ser validado.&lt;br /&gt;&lt;br /&gt;Entonces como conclusi&amp;oacute;n de todo esto podemos emitir la siguiente sentencia:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&amp;iexcl;Cuidado con Firebird! porque la combinaci&amp;oacute;n de comparaci&amp;oacute;n del tipo &lt;b&gt;WHERE [NOT] IN SELECT&lt;/b&gt; falla cuando en el subselect existen valores nulos y no hay una relaci&amp;oacute;n de integridad entre ambas relaciones.&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Pueden hacer sus pruebas en sus propias configuraciones y ver que otras implicaciones tiene este detalle, esperemos que esto se arregle pronto.&lt;div class="blogger-post-footer"&gt;http://cgarcia.blogspot.com&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18551162-113581788487539549?l=cgarcia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cgarcia.blogspot.com/feeds/113581788487539549/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://cgarcia.blogspot.com/2005/12/nulos-e-integridad-referencial.html#comment-form' title='8 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18551162/posts/default/113581788487539549'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18551162/posts/default/113581788487539549'/><link rel='alternate' type='text/html' href='http://cgarcia.blogspot.com/2005/12/nulos-e-integridad-referencial.html' title='Nulos e Integridad Referencial'/><author><name>Carlos G</name><uri>http://www.blogger.com/profile/09121978431155592667</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='09946141534570844750'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18551162.post-113461616592675301</id><published>2005-12-14T19:09:00.000-08:00</published><updated>2008-07-23T15:07:27.358-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Delphi'/><title type='text'>Una cadena = Un número único</title><content type='html'>Esta funci&amp;oacute;n me pareci&amp;oacute; tres cosas: &amp;uacute;til, interesante y sencilla&lt;br /&gt;&lt;pre name="code" class="delphi"&gt;&lt;br /&gt;type &lt;br /&gt;  UInt64 = 0..9223372036854775807;&lt;br /&gt;&lt;br /&gt;function Unc(s: string): UInt64;&lt;br /&gt;var&lt;br /&gt;  x: Integer;&lt;br /&gt;begin&lt;br /&gt;  Result := 0;&lt;br /&gt;  for x := 1 to Length(s) do &lt;br /&gt;            Result := Result + ((Ord(s[x])) &lt;br /&gt;                         shl ((x - 1) * 8));&lt;br /&gt;end;&lt;/pre&gt;&lt;br /&gt;La l&amp;oacute;gica detr&amp;aacute;s de la funci&amp;oacute;n no es complicada, si bien si muy pr&amp;aacute;ctica y &amp;uacute;til en varios casos cuando al manejar elementos en memoria interesa obtener identificadores &amp;uacute;nicos por alguna serie de textos ( me he encontrado con casos as&amp;iacute; al trabajar con sistemas de redes o &amp;aacute;rboles). Un inconveniente es que los n&amp;uacute;meros que se obtienen por esta funci&amp;oacute;n son muchas veces n&amp;uacute;meros muy grandes (de hasta 64 bits) por lo que la aplicaci&amp;oacute;n en una BD como Firebird por ejemplo resulta un tanto complicada; pero bueno no es tan f&amp;aacute;cil tenerlo todo siempre.&lt;div class="blogger-post-footer"&gt;http://cgarcia.blogspot.com&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18551162-113461616592675301?l=cgarcia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cgarcia.blogspot.com/feeds/113461616592675301/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://cgarcia.blogspot.com/2005/12/una-cadena-un-nnico.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18551162/posts/default/113461616592675301'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18551162/posts/default/113461616592675301'/><link rel='alternate' type='text/html' href='http://cgarcia.blogspot.com/2005/12/una-cadena-un-nnico.html' title='Una cadena = Un n&amp;uacute;mero &amp;uacute;nico'/><author><name>Carlos G</name><uri>http://www.blogger.com/profile/09121978431155592667</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='09946141534570844750'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18551162.post-554446604031703264</id><published>2008-07-11T00:40:00.001-07:00</published><updated>2008-07-11T11:04:22.832-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Rollos mios'/><category scheme='http://www.blogger.com/atom/ns#' term='Reflexiones de programación'/><title type='text'>¿Y tu que tan Espartano eres?</title><content type='html'>&lt;p&gt;&lt;img src="http://img215.imagevenue.com/loc371/th_60550_ist2_3114399_spartan_warrior1_122_371lo.jpg" align="left" /&gt; No, no se trata de un concurso para ver quien grita mas fuerte &amp;quot;&lt;strong&gt;This is Spartaaa!&lt;/strong&gt;&amp;quot;,&amp;#160; Se trata de un &lt;a href="http://ssdl-wiki.cs.technion.ac.il/wiki/index.php/Spartan_programming" target="_blank"&gt;estilo de programaci&amp;#243;n&lt;/a&gt; de hecho. Me he enterado hace poco de este estilo, y como ven en el enlace tiene que ver con la austeridad en todos los sentidos. &lt;/p&gt;  &lt;p&gt;Particularmente yo no soy tan espartano, me gusta anteponer la reutilizaci&amp;#243;n de c&amp;#243;digo y la mantenibilidad por encima de la austeridad, por ejemplo siempre prefiero llamar a una variable: &lt;strong&gt;MediaAritmeticadelaMuestra&lt;/strong&gt;, que simplemente &lt;strong&gt;M&lt;/strong&gt;, lo mismo para las funciones y procedimientos. Aunque si dedico muy buena parte de mi tiempo de trabajo a optimizar y simplificar procesos ya hechos; no me preocupa demasiado el aprovechar hasta el m&amp;#225;s infimo bit de memoria; prefiero aprovechar las jerarqu&amp;#237;as de la VCL, y usar patrones de dise&amp;#241;o a diestra y siniestra.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://img130.imagevenue.com/img.php?image=61824_DSC01203_122_874lo.jpg" target="_blank"&gt;&lt;img src="http://img130.imagevenue.com/loc874/th_61824_DSC01203_122_874lo.jpg" align="right" border="0" /&gt;&lt;/a&gt;&amp;#191;A cuantos aqu&amp;#237; el estilo de programaci&amp;#243;n se les parecer&amp;#237;a a esto si fuera uno de los 300?:&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;http://cgarcia.blogspot.com&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18551162-554446604031703264?l=cgarcia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cgarcia.blogspot.com/feeds/554446604031703264/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://cgarcia.blogspot.com/2008/07/y-tu-que-tan-espartano-eres.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18551162/posts/default/554446604031703264'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18551162/posts/default/554446604031703264'/><link rel='alternate' type='text/html' href='http://cgarcia.blogspot.com/2008/07/y-tu-que-tan-espartano-eres.html' title='¿Y tu que tan Espartano eres?'/><author><name>Carlos G</name><uri>http://www.blogger.com/profile/09121978431155592667</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='09946141534570844750'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18551162.post-695550519427957323</id><published>2008-06-29T19:27:00.001-07:00</published><updated>2008-07-03T11:46:18.549-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Delphi'/><title type='text'>Instalar Zeos 6.6.2 rc en Delphi 2007</title><content type='html'>&lt;p&gt;&lt;img src="http://img224.imagevenue.com/loc73/th_92902_ZeosLogo_122_73lo.jpg" align="left" /&gt; Hay algunos &lt;em&gt;detallitos&lt;/em&gt; para instalar este paquete de componentes particularmente en Delphi 2007 pero te comparto como puedes instalarlos sin problemas ajustando solo una l&amp;#237;nea de c&amp;#243;digo.&lt;/p&gt;  &lt;p&gt;En primera se debe abrir el archivo ZeosDbo.groupproj de la carpeta &lt;strong&gt;Delphi11&lt;/strong&gt; que se encuentra en la carpeta &lt;strong&gt;packages&lt;/strong&gt; y compilar uno a uno los paquetes que aparecen en el &lt;strong&gt;Project Manager&lt;/strong&gt;.&lt;/p&gt;  &lt;p&gt;De estos, el paquete a instalar es el que se llama ZComponentDesign.dproj, pero al instalarlo as&amp;#237; nada mas solo da el mensaje de que el paquete ha instalado pero no registra ning&amp;#250;n componente, para corregir esto solo hay que editar el c&amp;#243;digo fuente del paquete, esto es dar click con el bot&amp;#243;n derecho del rat&amp;#243;n sobre este paquete y seleccionar la opci&amp;#243;n &lt;strong&gt;View Source&lt;/strong&gt; desde el &lt;strong&gt;Project Manager&lt;/strong&gt;, y agregar la siguiente l&amp;#237;nea de c&amp;#243;digo justo antes del &lt;strong&gt;end.&lt;/strong&gt; final:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;strong&gt;contains&lt;/strong&gt;      &lt;br /&gt;&amp;#160; ZComponentReg in '..\..\src\component\ZComponentReg.pas';&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Una vez hecho esto es solo Guardar los cambios y volver a seleccionar &lt;strong&gt;Install&lt;/strong&gt; y esta vez si estar&amp;#225;n todos los componentes registrados.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;http://cgarcia.blogspot.com&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18551162-695550519427957323?l=cgarcia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cgarcia.blogspot.com/feeds/695550519427957323/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://cgarcia.blogspot.com/2008/06/instalar-zeos-662-rc-en-delphi-2007.html#comment-form' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18551162/posts/default/695550519427957323'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18551162/posts/default/695550519427957323'/><link rel='alternate' type='text/html' href='http://cgarcia.blogspot.com/2008/06/instalar-zeos-662-rc-en-delphi-2007.html' title='Instalar Zeos 6.6.2 rc en Delphi 2007'/><author><name>Carlos G</name><uri>http://www.blogger.com/profile/09121978431155592667</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='09946141534570844750'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18551162.post-9057385119077987234</id><published>2008-06-02T00:19:00.001-07:00</published><updated>2008-06-02T00:20:01.618-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Rollos mios'/><title type='text'>Fable 2 para finales de año</title><content type='html'>&lt;p&gt;Me gustan los RPG's, (bueno, no tanto los de combates por turnos) existen 2 t&amp;#237;tulos que me han gustado bastante, el primero es el &amp;quot;&lt;strong&gt;Ocarina of Time&lt;/strong&gt;&amp;quot; de la serie de &lt;strong&gt;Zelda (&lt;/strong&gt;un cl&amp;#225;sico de cl&amp;#225;sicos), creaci&amp;#243;n del gran &lt;strong&gt;Shigeru Miyamoto&lt;/strong&gt;, y el segundo fu&amp;#233; &lt;strong&gt;Fable The Lost Chapters&lt;/strong&gt; de &lt;strong&gt;LionHead&lt;/strong&gt;, creado por &lt;strong&gt;Peter Moulineaux&lt;/strong&gt;.&lt;/p&gt;  &lt;p&gt; Este &amp;#250;ltimo me gust&amp;#243; mucho por la ambientaci&amp;#243;n y lo bien cuidado de ciertos detalles, como la excelente m&amp;#250;sica, hasta donde lleg&amp;#243; incluso el talento de el gran &lt;strong&gt;Danny Elfman&lt;/strong&gt;.&lt;/p&gt;  &lt;p&gt;Consecuentemente me encuentro entre los miles de fans que esperan el lanzamiento de la secuela &lt;strong&gt;Fable 2&lt;/strong&gt;, que ya ha sido anunciado para el oto&amp;#241;o de este a&amp;#241;o 2008. Para que vean mas o menos de que va el asunto vean este avance del juego:&lt;/p&gt;  &lt;div class="wlWriterSmartContent" id="scid:5737277B-5D6D-4f48-ABFC-DD9C333F4C5D:805710e7-f6db-41d2-87d9-9e0d01a7dd34" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; width: 394px; padding-top: 0px"&gt;&lt;div&gt;&lt;object width="394" height="323"&gt;&lt;param name="movie" value="http://www.youtube.com/v/CqliHpn7FWI"&gt;&lt;/param&gt;&lt;param name="wmode" value="transparent"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/CqliHpn7FWI" type="application/x-shockwave-flash" wmode="transparent" width="394" height="323"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;&lt;/div&gt;&amp;#160;&amp;#160; &lt;p&gt;&amp;#191;&amp;#191;Que tal?? &amp;#191;&amp;#191;se ve bueno no??, hay muchos detalles muy interesantes , el se&amp;#241;or Moulineaux es muy buen dise&amp;#241;ador de &lt;strong&gt;video juegos&lt;/strong&gt; y ha prometido una serie de caracter&amp;#237;sticas que destacar&amp;#225;n a este juego de entre los dem&amp;#225;s de su tipo; una de estas muchas cosas que per-se ya es una gran mejora, es la utilizaci&amp;#243;n del motor f&amp;#237;sico de &lt;a href="http://www.havok.com" target="_blank"&gt;Havok&lt;/a&gt;, que es uno de los mejores y muy utilizado en otras recientes publicaciones de mucho &amp;#233;xito.&lt;/p&gt;  &lt;p&gt;El encanto que ha caracterizado las creaciones de Peter Moulineaux es el involucramiento de las emociones y la moral del jugador en la trama de la historia, el poder jugar y llegar a sentirte bien o mal por haber tomado cierta decisi&amp;#243;n, la sensaci&amp;#243;n de tristeza por la perdida de un compa&amp;#241;ero, o la humillaci&amp;#243;n que otros personajes hacen al protagonista por la derrota sufrida y que terminan por tocar el animo mismo del que juega el rol. Esto amigos es un todo un arte y existen muchos libros y art&amp;#237;culos que hablan al respecto, de hecho tengo un libro electr&amp;#243;nico muy bueno, que aborda este tema desde diferentes perspectivas y es estupendo, si a alguien le interesa este tema le puedo enviar una copia, solo tiene que solicitarlo. &lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;http://cgarcia.blogspot.com&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18551162-9057385119077987234?l=cgarcia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cgarcia.blogspot.com/feeds/9057385119077987234/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://cgarcia.blogspot.com/2008/06/fable-2-para-finales-de-ao.html#comment-form' title='3 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18551162/posts/default/9057385119077987234'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18551162/posts/default/9057385119077987234'/><link rel='alternate' type='text/html' href='http://cgarcia.blogspot.com/2008/06/fable-2-para-finales-de-ao.html' title='Fable 2 para finales de año'/><author><name>Carlos G</name><uri>http://www.blogger.com/profile/09121978431155592667</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='09946141534570844750'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18551162.post-3702080895575670051</id><published>2008-05-29T17:41:00.001-07:00</published><updated>2008-05-30T00:44:02.165-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Delphi'/><title type='text'>¿Porque Delphi 2007?</title><content type='html'>&lt;p&gt;Cuando me preguntan si he cambiado a &lt;strong&gt;Delphi 2007&lt;/strong&gt; solo por seguir la moda &lt;strong&gt;geek&lt;/strong&gt; o cuales son mis razones para haber dejado Delphi 6, les contesto: &lt;/p&gt;  &lt;p&gt;Bueno!!... son tantas cosas, que es dif&amp;#237;cil enumerarlas en orden de importancia, pero para muestra unos cuantos &lt;strong&gt;ejemplos&lt;/strong&gt;:&lt;/p&gt;  &lt;div class="wlWriterSmartContent" id="scid:5737277B-5D6D-4f48-ABFC-DD9C333F4C5D:734e666c-65bd-44f4-bf5d-9fd0ecf70645" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; width: 410px; padding-top: 0px"&gt;&lt;div&gt;&lt;object width="410" height="337"&gt;&lt;param name="movie" value="http://www.youtube.com/v/ky90Io32hLQ"&gt;&lt;/param&gt;&lt;param name="wmode" value="transparent"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/ky90Io32hLQ" type="application/x-shockwave-flash" wmode="transparent" width="410" height="337"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;&lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;http://cgarcia.blogspot.com&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18551162-3702080895575670051?l=cgarcia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cgarcia.blogspot.com/feeds/3702080895575670051/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://cgarcia.blogspot.com/2008/05/porque-delphi-2007.html#comment-form' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18551162/posts/default/3702080895575670051'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18551162/posts/default/3702080895575670051'/><link rel='alternate' type='text/html' href='http://cgarcia.blogspot.com/2008/05/porque-delphi-2007.html' title='¿Porque Delphi 2007?'/><author><name>Carlos G</name><uri>http://www.blogger.com/profile/09121978431155592667</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='09946141534570844750'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18551162.post-2470651170315668659</id><published>2008-05-27T00:23:00.001-07:00</published><updated>2008-05-28T20:47:29.258-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Delphi'/><title type='text'>Delphi Latino BlogRoll</title><content type='html'>&lt;p&gt;Seguramente muchos aqu&amp;#237; conocen el sitio &lt;a href="http://www.delphifeeds.com"&gt;www.delphifeeds.com&lt;/a&gt;, un estupendo compendio de bit&amp;#225;coras acerca de Delphi y los productos de CodeGear, donde la comunidad angloparlante comparte muy interesantes art&amp;#237;culos con el mundo.&lt;/p&gt;  &lt;p&gt;A decir verdad en espa&amp;#241;ol tambi&amp;#233;n hay una buena cantidad de sitios de bit&amp;#225;coras que ofrecen estupendos art&amp;#237;culos, y la cantidad de estas crece d&amp;#237;a con d&amp;#237;a; y la gran mayor&amp;#237;a realmente merece que se le haga una rese&amp;#241;a completa.&lt;/p&gt;  &lt;p&gt;Por esta raz&amp;#243;n he incluido en mi &lt;a href="http://cgarcia.blogspot.com/" target="_blank"&gt;Blog&lt;/a&gt; una secci&amp;#243;n de las llamadas BlogRoll, donde aparecen autom&amp;#225;ticamente los &amp;#250;ltimos art&amp;#237;culos de las Bit&amp;#225;coras que leo sobre Delphi en Espa&amp;#241;ol, para que todos aquellos que me hacen el honor de visitarme puedan tambi&amp;#233;n visitar alguna de estas fabulosas p&amp;#225;ginas, y as&amp;#237; potenciarlas. Y tambi&amp;#233;n esto es con el af&amp;#225;n de incentivar a los brillantes autores a seguirnos deleitando con contenido de gran calidad como nos tienen acostumbrados.&lt;/p&gt;  &lt;p&gt;Hasta el momento est&amp;#225;n incluidas en este BlogRoll bit&amp;#225;coras de renombrados programadores como: Ian Marteens, Nico Aragon, Al Gonzalez, Juan Antonio Castillo, Salvador Jover, Jose Castillo, Jhonny Suarez, y muchos, muchos mas.&lt;/p&gt;  &lt;p&gt;Si tienes una p&amp;#225;gina sobre Delphi con sindicaci&amp;#243;n y deseas ser agregado a esta lista solo tienes que pedirlo y con gusto te agregamos. As&amp;#237; que si tienes algo que decirnos o ense&amp;#241;arnos, adelante! Seguro que entre todos podemos convertir el &lt;em&gt;Embarcadero&lt;/em&gt; en un &lt;strong&gt;Majestuoso Puerto&lt;/strong&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;http://cgarcia.blogspot.com&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18551162-2470651170315668659?l=cgarcia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cgarcia.blogspot.com/feeds/2470651170315668659/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://cgarcia.blogspot.com/2008/05/delphi-latino-blogroll.html#comment-form' title='8 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18551162/posts/default/2470651170315668659'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18551162/posts/default/2470651170315668659'/><link rel='alternate' type='text/html' href='http://cgarcia.blogspot.com/2008/05/delphi-latino-blogroll.html' title='Delphi Latino BlogRoll'/><author><name>Carlos G</name><uri>http://www.blogger.com/profile/09121978431155592667</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='09946141534570844750'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18551162.post-2313227511193509470</id><published>2008-05-14T16:22:00.001-07:00</published><updated>2008-05-14T16:26:12.743-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Firebird'/><title type='text'>Respaldos remotos con Firebird</title><content type='html'>&lt;p&gt;IBExpert (un &lt;strong&gt;gratuito&lt;/strong&gt; gerenciador de Bases de Datos de Firebird) al estar conectado a una base de datos remota y entrar en la pantalla de Servicios y seleccionar la opci&amp;#243;n &amp;quot;&lt;strong&gt;Backup Database&lt;/strong&gt;&amp;quot; nos dice el mensaje: &amp;quot;Take into account: Backup Files will be created in the server side!&amp;quot;&lt;/p&gt;  &lt;p&gt;Esto al querer seleccionar el nombre de archivo con el que queremos que haga el respaldo; pero, &amp;#191;que pasa si lo que yo quiero es que el respaldo lo haga en mi propia computadora, no en el servidor?&lt;/p&gt;  &lt;p&gt;Bien, en ese caso lo que puedo hacer es usar la linea de comandos y escribir esto:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;gbak -b -z SERVIDOR:BASEDEDATOS &amp;quot;C:\localbackup.fbk&amp;quot; -verbose -user SYSDBA -password masterkey&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Eso nos genera el respaldo en la m&amp;#225;quina cliente, sin mayor problema. Solo hay que acotar que se necesita que en la m&amp;#225;quina cliente se encuentre instalado &lt;strong&gt;Firebird&lt;/strong&gt; o en su caso el servicio de GBAK para que esta magia funcione.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;http://cgarcia.blogspot.com&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18551162-2313227511193509470?l=cgarcia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cgarcia.blogspot.com/feeds/2313227511193509470/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://cgarcia.blogspot.com/2008/05/respaldos-remotos-con-firebird.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18551162/posts/default/2313227511193509470'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18551162/posts/default/2313227511193509470'/><link rel='alternate' type='text/html' href='http://cgarcia.blogspot.com/2008/05/respaldos-remotos-con-firebird.html' title='Respaldos remotos con Firebird'/><author><name>Carlos G</name><uri>http://www.blogger.com/profile/09121978431155592667</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='09946141534570844750'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18551162.post-2565985676803731365</id><published>2008-05-07T01:21:00.001-07:00</published><updated>2008-05-07T08:12:51.873-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Rollos mios'/><title type='text'>XBOX MEDIA CENTER un estupendo programa gratis y Open Source para tu consola</title><content type='html'>&lt;p&gt;Hace algunos meses, compr&amp;#233; una vieja consola de &lt;strong&gt;XBOX&lt;/strong&gt; de 20 gigas en disco duro (si, de las negras),esto con el af&amp;#225;n &lt;img alt="XBOX MEDIA CENTER LOGO" src="http://farm4.static.flickr.com/3215/2473249546_3dbd794b5d_o.png" align="right" /&gt;de poder jugar algunos viejos juegos que nunca tuve oportunidad de jugar en su momento; en realidad nunca hab&amp;#237;a tenido una consola de v&amp;#237;deo juegos propia, pero esta vez quer&amp;#237;a sacarle jugo a la televisi&amp;#243;n de 53 pulgadas que acababa de comprar. Todo iba bien, hasta que me enter&amp;#233; que pod&amp;#237;a conectar ese &lt;strong&gt;XBOX&lt;/strong&gt; a mi laptop v&amp;#237;a &lt;strong&gt;FTP&lt;/strong&gt; y transferirle archivos a su disco duro; pero lo mejor fue cuando conoc&amp;#237; el programa &lt;a href="http://xbmc.org/" target="_blank"&gt;XBOX MEDIA CENTER&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;El &lt;strong&gt;XBOX MEDIA CENTER&lt;/strong&gt; (&amp;#243; &lt;strong&gt;XBMC&lt;/strong&gt;) convierte tu consola de v&amp;#237;deo juegos en&amp;#160; un completo centro de entretenimiento digital, de opciones muy variadas, es un reproductor multimedia completo, sus bondades son muchas, pero les enumerar&amp;#233; las que yo mas utilizo:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Puedo ver las &lt;strong&gt;fotograf&amp;#237;as&lt;/strong&gt; que saco con mi c&amp;#225;mara digital, a lo grande en mi televisi&amp;#243;n, puedes rotar en autom&amp;#225;tico las &lt;strong&gt;fotos&lt;/strong&gt; o hacer zoom en la visualizaci&amp;#243;n de la &lt;strong&gt;foto&lt;/strong&gt;, todo de una manera muy pr&amp;#225;ctica con los controles del mando de la &lt;strong&gt;XBOX&lt;/strong&gt;. Y aqui podemos repasar una y otra vez las fotos de las vacaciones, o las salidas a alg&amp;#250;n lugar interesante.&lt;/li&gt;    &lt;li&gt;Reproduce perfectamente archivos de audio de todos los formatos que conozco, incluso reconoce autom&amp;#225;ticamente los archivos &lt;strong&gt;CDG&lt;/strong&gt; + &lt;strong&gt;MP3&lt;/strong&gt;, lo que convierte a la consola en un fant&amp;#225;stico &lt;strong&gt;Karaoke&lt;/strong&gt;, as&amp;#237; que ahora en la casa &amp;#161;todos los d&amp;#237;as hay fiesta!, y nos la pasamos bailando y cantando todo tipo de &lt;strong&gt;m&amp;#250;sica&lt;/strong&gt;, le he ido tomando gusto a todos los g&amp;#233;neros musicales gracias a esta estupenda caracter&amp;#237;stica.&lt;/li&gt;    &lt;li&gt;Con los &lt;strong&gt;videos&lt;/strong&gt; no se queda atr&amp;#225;s, tiene integrados una enorme cantidad de CODECS con lo que pr&amp;#225;cticamente cualquier &lt;strong&gt;video&lt;/strong&gt; descargado de la red puede visualizarse sin problemas, (incluido el formato &lt;a href="http://es.wikipedia.org/wiki/RMVB" target="_blank"&gt;rmvb&lt;/a&gt; que est&amp;#225; tomando mucho auge por su alta calidad y el alto factor de compresi&amp;#243;n que utiliza); adem&amp;#225;s el &lt;strong&gt;XBMC&lt;/strong&gt; carga autom&amp;#225;ticamente archivos de &lt;strong&gt;subt&amp;#237;tulos&lt;/strong&gt; para las &lt;strong&gt;pel&amp;#237;culas&lt;/strong&gt;, lo que permite ver muy c&amp;#243;modamente &lt;strong&gt;series&lt;/strong&gt;, &lt;strong&gt;pel&amp;#237;culas&lt;/strong&gt;, &lt;strong&gt;documentales&lt;/strong&gt;, o los videos graciosos de YouTube, as&amp;#237; que tambi&amp;#233;n tengo un cine personal en la sala de mi casa.&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Aparte de todo esto tiene soporte Zip/Rar, un interprete de scripts del lenguaje Python, visualizaciones de fondo impresionantes para la m&amp;#250;sica, su propio servidor FTP, conexi&amp;#243;n en linea con YouTube y otros sistemas para ver los trailers de las nuevas pel&amp;#237;culas... ufff, en fin que es un gran estuche de moner&amp;#237;as y no me alcanza todo este post para enumerar todo lo bueno que tiene, pero en la p&amp;#225;gina del proyecto se enteran mejor.&lt;/p&gt;  &lt;p&gt;El programa lo pueden conseguir principalmente en redes P2P y en algunos trackers de BitTorrent, es absolutamente &lt;strong&gt;gratis&lt;/strong&gt; y est&amp;#225; disponible el c&amp;#243;digo fuente, definitivamente votar&amp;#233; por este proyecto en las futuras encuestas de SourceForge.&lt;/p&gt;  &lt;p&gt;Es incre&amp;#237;ble todo en lo que puede convertirse una vieja consola de menos de 100 d&amp;#243;lares.&lt;/p&gt;  &lt;p&gt;&lt;img height="156" alt="XBOX MEDIA CENTER EN LA PARED" src="http://xbmc.org/gfx/teaser.jpg" width="407" /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;http://cgarcia.blogspot.com&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18551162-2565985676803731365?l=cgarcia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cgarcia.blogspot.com/feeds/2565985676803731365/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://cgarcia.blogspot.com/2008/05/xbox-media-center-un-estupendo-programa.html#comment-form' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18551162/posts/default/2565985676803731365'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18551162/posts/default/2565985676803731365'/><link rel='alternate' type='text/html' href='http://cgarcia.blogspot.com/2008/05/xbox-media-center-un-estupendo-programa.html' title='XBOX MEDIA CENTER un estupendo programa gratis y Open Source para tu consola'/><author><name>Carlos G</name><uri>http://www.blogger.com/profile/09121978431155592667</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='09946141534570844750'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18551162.post-5358836810685535885</id><published>2008-04-30T09:36:00.001-07:00</published><updated>2008-04-30T09:48:36.832-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Delphi'/><category scheme='http://www.blogger.com/atom/ns#' term='GLScene'/><title type='text'>Ventana Virtual 3D con Delphi</title><content type='html'>&lt;p&gt;&amp;#191;Alguna vez pensaste en hacer una aplicaci&amp;#243;n con Delphi a la que pudieras controlar de manera inal&amp;#225;mbrica a distancia como la Wii o que la interfaz se ajustara autom&amp;#225;ticamente y en tiempo real a la posici&amp;#243;n de tu cuerpo con respecto a la pantalla?&lt;/p&gt;  &lt;p&gt;El se&amp;#241;or &lt;a href="http://vandinther.googlepages.com/home" target="_blank"&gt;Paul van Dinther&lt;/a&gt; nos muestra que es bastante posible en el siguiente video usando Delphi y GLScene&lt;/p&gt;  &lt;div class="wlWriterSmartContent" id="scid:5737277B-5D6D-4f48-ABFC-DD9C333F4C5D:473cd990-f515-4a9b-998a-0e3fe81e6c4c" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; width: 410px; padding-top: 0px"&gt;&lt;div&gt;&lt;object width="410" height="337"&gt;&lt;param name="movie" value="http://www.youtube.com/v/X8PevTuEWlg"&gt;&lt;/param&gt;&lt;param name="wmode" value="transparent"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/X8PevTuEWlg" type="application/x-shockwave-flash" wmode="transparent" width="410" height="337"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;&lt;/div&gt;  &lt;blockquote&gt;   &lt;p&gt;This is a demonstration of a virtual window using OpenGL in GLScene (&lt;a href="http://www.glscene.org)"&gt;http://www.glscene.org)&lt;/a&gt; and Track IR (&lt;a href="http://www.naturalpoint.com)"&gt;http://www.naturalpoint.com)&lt;/a&gt;&lt;/p&gt;    &lt;p&gt;This technology is being developed by Dinther Product Design to be applied to a range of simulator systems we build. The idea is to allow drivers to lean in order to look around obstacles as we do in a car all the time to cover blind spots.&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Cool... &amp;#191;no?, &lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;http://cgarcia.blogspot.com&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18551162-5358836810685535885?l=cgarcia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cgarcia.blogspot.com/feeds/5358836810685535885/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://cgarcia.blogspot.com/2008/04/ventana-virtual-3d-con-delphi.html#comment-form' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18551162/posts/default/5358836810685535885'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18551162/posts/default/5358836810685535885'/><link rel='alternate' type='text/html' href='http://cgarcia.blogspot.com/2008/04/ventana-virtual-3d-con-delphi.html' title='Ventana Virtual 3D con Delphi'/><author><name>Carlos G</name><uri>http://www.blogger.com/profile/09121978431155592667</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='09946141534570844750'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18551162.post-6275450067687967844</id><published>2008-04-30T08:49:00.001-07:00</published><updated>2008-04-30T08:49:26.999-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Firebird'/><title type='text'>Firebird SQL 2.1 ya está listo</title><content type='html'>&lt;p&gt;La versi&amp;#243;n 2.1 del afamado motor de base de &lt;img style="margin: 0px 5px 5px 0px" src="http://img140.imagevenue.com/loc1006/th_69981_firebird_122_1006lo.JPG" align="left" /&gt;datos, se esperaba desde finales del a&amp;#241;o pasado, y por fin ha visto la luz; &lt;a href="http://jachguate.wordpress.com/2008/04/18/liberado-firebird-21/" target="_blank"&gt;Juan Antonio Castillo&lt;/a&gt; en su bit&amp;#225;cora nos habla de las novedades que presenta esta versi&amp;#243;n, que no son pocas. Hay muchas mejoras que en general han sido aplaudidas por la comunidad de desarrolladores.&lt;/p&gt;  &lt;p&gt;Yo he probado solo la versi&amp;#243;n &lt;strong&gt;embedded&lt;/strong&gt;&amp;#160; hasta ahora, y en primera instancia si se nota una ganancia en velocidad en la resoluci&amp;#243;n de las consultas (con respecto a la versi&amp;#243;n 1.5 que es la que utilizo), las nuevas caracter&amp;#237;sticas a&amp;#241;adidas al SQL del motor permiten hacer cosas espectaculares con una sola consulta; lo que a&amp;#250;n no he probado por usar la versi&amp;#243;n embedded es el desempe&amp;#241;o del nuevo protocolo de red; se promet&amp;#237;a que las mejoras ser&amp;#237;an de un 50% aproximadamente, y hay que poner a prueba esa afirmaci&amp;#243;n.&lt;/p&gt;  &lt;p&gt;Si alguien ha hecho pruebas en este sentido sientase con libertad de compartirnos sus resultados.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;http://cgarcia.blogspot.com&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18551162-6275450067687967844?l=cgarcia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cgarcia.blogspot.com/feeds/6275450067687967844/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://cgarcia.blogspot.com/2008/04/firebird-sql-21-ya-est-listo.html#comment-form' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18551162/posts/default/6275450067687967844'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18551162/posts/default/6275450067687967844'/><link rel='alternate' type='text/html' href='http://cgarcia.blogspot.com/2008/04/firebird-sql-21-ya-est-listo.html' title='Firebird SQL 2.1 ya está listo'/><author><name>Carlos G</name><uri>http://www.blogger.com/profile/09121978431155592667</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='09946141534570844750'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>1</thr:total></entry></feed>