<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-7404007568594605045</id><updated>2012-02-16T14:05:54.500+01:00</updated><category term='C#'/><category term='Dell Studio'/><category term='xml'/><category term='xsl'/><category term='Firefox'/><category term='rss'/><category term='html'/><category term='.Net'/><category term='70-536'/><category term='Sql Server'/><category term='Seguridad'/><category term='Internet Explorer'/><category term='iconos'/><category term='ASP.Net'/><category term='VB'/><category term='Blogger'/><category term='SSIS'/><title type='text'>Jorge Villabona García - Tecnología .Net</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://jorgevillabonagarcia.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7404007568594605045/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://jorgevillabonagarcia.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Jorge Villabona García</name><uri>http://www.blogger.com/profile/17217719175201600437</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>14</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-7404007568594605045.post-3373099386892320604</id><published>2010-01-23T13:52:00.002+01:00</published><updated>2010-01-23T14:12:39.290+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='70-536'/><category scheme='http://www.blogger.com/atom/ns#' term='Seguridad'/><category scheme='http://www.blogger.com/atom/ns#' term='.Net'/><title type='text'>Seguridad en .NET</title><content type='html'>Uno de los objetivos del  examen 70-536 es conocer y saber utilizar el sistema de seguridad CAS (Code Access Security). CAS nos permite controlar que permisos tiene una aplicación .NET&lt;br /&gt;&lt;br /&gt;A partir de Windows Vista apareció el controvertido Control de Cuentas de Usuario (&lt;span style="font-weight: bold;"&gt;U&lt;/span&gt;ser &lt;span style="font-weight: bold;"&gt;A&lt;/span&gt;ccount &lt;span style="font-weight: bold;"&gt;C&lt;/span&gt;ontrol).Para muchos usuarios esta característica es molesta e inútil pero evidentemente, tiene su razón de ser.&lt;br /&gt;&lt;br /&gt;Cuando accedemos a nuestro equipo personal lo hacemos con una cuenta de administrador. Esto supone que tenemos todos los permisos para hacer lo que queramos.  En versiones anteriores de Windows esto no era muy recomendable, ya que cualquier aplicación que ejecutásemos heredaría todos nuestros permisos y por lo tanto podría hacer lo que quisiera con nuestro equipo.&lt;br /&gt;&lt;br /&gt;Con el UAC activado, si una aplicación intentara acceder a un recurso protegido se nos avisaría y podríamos decidir si continuamos o no. El problema que ha tenido UAC en Windows Vista es que este tipo de alertas se repiten con demasiada frecuencia y llegan a ser molestas. Además entran en la rutina del usuario por lo que no se les presta atención. En Windows 7 parece que el tema ha mejorado (&lt;a href="http://www.genbeta.com/actualidad/el-uac-de-windows-7-sera-menos-intrusivo"&gt;En este artículo&lt;/a&gt; hablan sobre ello)&lt;br /&gt;&lt;br /&gt;En fin, volviendo al tema de la Seguridad .NET: CAS (&lt;span style="font-weight: bold;"&gt;C&lt;/span&gt;ode &lt;span style="font-weight: bold;"&gt;A&lt;/span&gt;ccess &lt;span style="font-weight: bold;"&gt;S&lt;/span&gt;ecurity) es un concepto que complementa a los sistemas de seguridad que ofrece el Sistema Operativo (Permisos de Usuarios, Roles, UAC…) ¿Cómo? CAS nos permite controlar que puede hacer cada aplicación.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Acceso al sistema de ficheros&lt;/li&gt;&lt;li&gt;Acceso al registro&lt;/li&gt;&lt;li&gt;Acceso a Impresoras&lt;/li&gt;&lt;li&gt;Acceso al registro de eventos&lt;/li&gt;&lt;li&gt;Peticiones Web, peticiones DNS…&lt;/li&gt;&lt;li&gt;Etc.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Elementos Principales&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Para entender el funcionamiento de CAS es necesario saber cuáles son sus elementos:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Evidencias (&lt;span style="font-style: italic;"&gt;Evidences&lt;/span&gt;)&lt;/span&gt;: Es información que el sistema obtiene sobre el ensamblado. Con esta información se determina a qué grupo de código pertenece (&lt;span style="font-style: italic;"&gt;code group&lt;/span&gt;) y que conjuntos de permisos tiene (&lt;span style="font-style: italic;"&gt;permission set&lt;/span&gt;).  Hay dos tipos de evidencias &lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;host evidences&lt;/span&gt; (Relacionadas con el origen del ensamblado. Por ejemplo: Directorio de la aplicación, sitio de la descarga…)&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;assembly evidence&lt;/span&gt; (Relacionadas con la identificación del ensamblado. Por ejemplo código hash, strong name, empresa que desarrollado el software…)&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Permiso (&lt;span style="font-style: italic;"&gt;Permission&lt;/span&gt;)&lt;/span&gt;: Un permiso determina si un ensamblado puede acceder (y de qué forma puede acceder) a un recurso en concreto. Por ejemplo el permiso de variables de entono define si el ensamblado puede acceder o no a las variables de entorno. Incluso se podría especificar que sólo pudiera acceder a una determinada variable.&lt;br /&gt;&lt;p&gt;Ejemplos de Permisos: Permiso para peticiones WEB o DNS, acceso al Active Directory Domain Services, permiso para el registro de eventos, para mostrar diálogos de fichero (abrir, guardar como…), para el sistema de archivos, para el acceso a registro…&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Conjunto de Permisos (Permission Set)&lt;/span&gt;: Son varios permisos agrupados. El framework .NET incluye varios conjuntos de permisos por defecto (FullTrust, Execution, LocalIntranet, Internet…) pero es posible agregar nuevos (usando la herramienta .NET Framework Configuration Tool).&lt;p&gt;Por ejemplo, si un ensamblado pertenece a un grupo de código asociado al conjunto de permisos ‘Internet’ tendrá los siguientes permisos: FileDialog, Insolated Storage File, Security, User Interface y Printing.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Cabe destacar que a un ensamblado no se puede asignar un permiso en concreto ni siquiera es posible asignar directamente un conjunto de permisos. El conjunto de permisos se asigna a los grupos de código ¿Pero como se sabe que un ensamblado pertenece a un grupo de código determinado?&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Grupo de código (&lt;span style="font-style: italic;"&gt;Code Group&lt;/span&gt;)&lt;/span&gt;: El concepto es similar a los roles de usuario pero orientado a los ensamblados. El usuario puede ser asignado a un grupo o rol y por tanto tendrá sus mismos permisos.&lt;br /&gt;&lt;p&gt;&lt;br /&gt;Con los ensamblados y grupos de código pasa algo parecido. Cada grupo de código tiene asociado un conjunto de permisos que heredará el ensamblado. La diferencia es que  no se puede indicar que un ensamblado pertenece a un grupo de forma directa.&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;Cuando se configura un grupo de código se especifica que evidencia deben tener los ensamblados para que pertenezcan al grupo y por tanto para que hereden en el conjunto de permisos asociado al grupo.&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;Es posible que un ensamblado pertenezca a varios grupos, ya que un ensamblado puede contener varias evidencias y que algunas  de ellas estén asociadas a diferentes grupos de código.&lt;br /&gt;&lt;br /&gt;En ese caso el ensamblado hereda el conjunto de permisos de ambos grupos.&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;Continuará…&lt;br /&gt;&lt;br /&gt;Mas información: &lt;a href="http://www.code-magazine.com/Article.aspx?quickid=0405031"&gt;http://www.code-magazine.com/Article.aspx?quickid=0405031&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7404007568594605045-3373099386892320604?l=jorgevillabonagarcia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jorgevillabonagarcia.blogspot.com/feeds/3373099386892320604/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7404007568594605045&amp;postID=3373099386892320604' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7404007568594605045/posts/default/3373099386892320604'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7404007568594605045/posts/default/3373099386892320604'/><link rel='alternate' type='text/html' href='http://jorgevillabonagarcia.blogspot.com/2010/01/seguridad-en-net.html' title='Seguridad en .NET'/><author><name>Jorge Villabona García</name><uri>http://www.blogger.com/profile/17217719175201600437</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7404007568594605045.post-1464949153111920941</id><published>2010-01-22T16:19:00.002+01:00</published><updated>2010-01-22T17:04:48.212+01:00</updated><title type='text'>Mi nuevo Ipod Suffle</title><content type='html'>Estas navidades, entre las cosas que me han regalado está el nuevo &lt;a href="http://www.apple.com/es/ipodshuffle/" target="_blank"&gt;Ipod Shuffle&lt;/a&gt; (¡Gracias &lt;a href="http://www.davidbayon.net/" target="_blank"&gt;David&lt;/a&gt;!)&lt;br /&gt;&lt;br /&gt;Tenía yo ganas de volver a tener un Ipod (Mi último Ipod Nano no soportó un accidental lavado). La verdad es que me ha sorprendido mucho este invento. A parte de que es increíblemente pequeño (y fácilmente perdible) y que sobra decir que la calidad de sonido es excepcional, no tiene nada que envidiar a otros reproductores mp3 con pantalla.&lt;br /&gt;&lt;br /&gt;Sólo dispone de un interruptor de tres posiciones (apagado, modo normal y modo aleatorio). Y tres botones en el cable de auricular. Dos para subir y bajar el volumen y un tercero multifunción.&lt;br /&gt;&lt;br /&gt;Con este botón multifunción podemos pausar la canción (pulsando una vez), pasar a la siguiente canción (pulsando dos veces seguidas) y volver a la canción anterior (pulsando tres veces).&lt;br /&gt;&lt;br /&gt;Además si dejamos pulsado una vez nos dirá que canción está sonando (pronunciada en el idioma correcto, por supuesto). Si pulsamos dos veces seguidas y mantenemos sin soltar, avanzará rápidamente. Si pulsamos tres y mantenemos rebobinará.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;VoiceOver&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Una de las funciones más sorprendentes es el hecho de que lea el título de canción que está sonando. Si el nombre está en castellano te lo lee perfectamente en castellano. Para que empiece a funcionar debes instalar en el Itunes el paquete de VoiceOver. Una vez lo tengas instalado, vuelve a sincronizar y tu ipod empezará a "leer".&lt;br /&gt;Si te queda poca batería te dirá "batería baja".&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Lista de reproducción&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;En este modelo ‘shuffle’ se incorpora la funcionalidad de poder cambiar de lista de reproducción.&lt;br /&gt;Para ello deja pulsado el botón central multifunción hasta que oigas un pitido. Entonces leerá todas las listas de reproducción. Cuando llegue a la que quieres escuchar pulsa de nuevo el botón central y listo.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Conclusiones&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Evidentemente no podemos comparar el Ipod Shuffle con ninguno de sus hermanos mayores en funcionalidad pero comparte con ellos la calidad que Apple da a todos sus productos. En este caso, la empresa estadounidense ha diseñado un reproductor muy apropiado para deportistas y personas que sólo buscan escuchar música.   Como desventaja hay que decir que no podemos utilizar otros auriculares que los suministrados a no ser que compremos un adaptador. En fin, nadie es perfecto …&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7404007568594605045-1464949153111920941?l=jorgevillabonagarcia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jorgevillabonagarcia.blogspot.com/feeds/1464949153111920941/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7404007568594605045&amp;postID=1464949153111920941' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7404007568594605045/posts/default/1464949153111920941'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7404007568594605045/posts/default/1464949153111920941'/><link rel='alternate' type='text/html' href='http://jorgevillabonagarcia.blogspot.com/2010/01/mi-nuevo-ipod-suffle.html' title='Mi nuevo Ipod Suffle'/><author><name>Jorge Villabona García</name><uri>http://www.blogger.com/profile/17217719175201600437</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7404007568594605045.post-7513332358571313893</id><published>2008-12-18T13:50:00.003+01:00</published><updated>2008-12-18T13:56:12.143+01:00</updated><title type='text'>Xml Logging para .Net</title><content type='html'>He sacado un poco de tiempo y he publicado la dll que tengo hecha para crear logs en Xml.&lt;br /&gt;&lt;br /&gt;Tanto la librería, como su código fuente y un par de ejemplos pueden descargarse en:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://xmllogging.blogspot.com/"&gt;http://xmllogging.blogspot.com/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span gtbtooltiptext="Haz clic para ver sugerencias" id="gtbmisp_6" style="border: 0pt none ; margin: 0pt; padding: 0pt; background: transparent none repeat scroll 0% 0%; font-style: normal; font-variant: normal; font-weight: bold; line-height: normal; font-size-adjust: none; font-stretch: normal; position: static; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; text-align: left; text-indent: 0pt; text-transform: none; text-decoration: underline; cursor: pointer;font-family:serif;font-size:100%;color:red;"   &gt;&lt;span style="font-family: Georgia,serif;"&gt;&lt;/span&gt;&lt;/span&gt;Próximamente agregaré un pequeño tutorial de uso. Espero tener algo de tiempo en estas navidades.&lt;br /&gt;&lt;br /&gt;Un saludo.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7404007568594605045-7513332358571313893?l=jorgevillabonagarcia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jorgevillabonagarcia.blogspot.com/feeds/7513332358571313893/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7404007568594605045&amp;postID=7513332358571313893' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7404007568594605045/posts/default/7513332358571313893'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7404007568594605045/posts/default/7513332358571313893'/><link rel='alternate' type='text/html' href='http://jorgevillabonagarcia.blogspot.com/2008/12/xml-logging-para-net.html' title='Xml Logging para .Net'/><author><name>Jorge Villabona García</name><uri>http://www.blogger.com/profile/17217719175201600437</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7404007568594605045.post-6737877866599273549</id><published>2008-11-05T08:28:00.009+01:00</published><updated>2008-11-05T08:51:27.734+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='iconos'/><category scheme='http://www.blogger.com/atom/ns#' term='html'/><title type='text'>Iconos a tutiplén</title><content type='html'>En ocasiones necesitamos incorporar en nuestras aplicaciones iconos y no queremos perder demasiado tiempo.&lt;br /&gt;&lt;br /&gt;Podemos recurrir a la colecciones que se encuentran en internet. Yo principalmente utilizo estas tres:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.freeiconsdownload.com/Index.html" target="blank"&gt;http://www.freeiconsdownload.com/Index.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_rIQM7VmDycs/SRFM_Jza6ZI/AAAAAAAAAjI/3LTa0npjW4c/s1600-h/FireShot+capture+%2372+-+%27Free+Icons+Download+-+Icons,Free+Icons,Stock+Icons,Vista+Icons,Desktop+Icons%27+-+www_freeiconsdownload_com_Index_html.png"&gt;&lt;img style="cursor: pointer; width: 320px; height: 197px;" src="http://2.bp.blogspot.com/_rIQM7VmDycs/SRFM_Jza6ZI/AAAAAAAAAjI/3LTa0npjW4c/s320/FireShot+capture+%2372+-+%27Free+Icons+Download+-+Icons,Free+Icons,Stock+Icons,Vista+Icons,Desktop+Icons%27+-+www_freeiconsdownload_com_Index_html.png" alt="" id="BLOGGER_PHOTO_ID_5265074087219882386" border="0" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;a href="http://salmosa.kaist.ac.kr/ICON/BULLET/bullet_image.html" target="blank"&gt;http://salmosa.kaist.ac.kr/ICON/BULLET/bullet_image.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_rIQM7VmDycs/SRFNIZ8vgJI/AAAAAAAAAjQ/Ik4aMOlmdpU/s1600-h/FireShot+capture+%2373+-+%27Bullet%27+-+salmosa_kaist_ac_kr_ICON_BULLET_bullet_image_html.png"&gt;&lt;img style="border: 1px solid black; cursor: pointer; width: 320px; height: 197px;" src="http://4.bp.blogspot.com/_rIQM7VmDycs/SRFNIZ8vgJI/AAAAAAAAAjQ/Ik4aMOlmdpU/s320/FireShot+capture+%2373+-+%27Bullet%27+-+salmosa_kaist_ac_kr_ICON_BULLET_bullet_image_html.png" alt="" id="BLOGGER_PHOTO_ID_5265074246172770450" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;a href="http://commons.wikimedia.org/wiki/Crystal_Clear" target="blank"&gt;http://commons.wikimedia.org/wiki/Crystal_Clear&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_rIQM7VmDycs/SRFMyV8hydI/AAAAAAAAAjA/ITcD9W3R-5U/s1600-h/FireShot+capture+%2374+-+%27Crystal+Clear+-+Wikimedia+Commons%27+-+commons_wikimedia_org_wiki_Crystal_Clear.png"&gt;&lt;img style="cursor: pointer; width: 320px; height: 197px;" src="http://2.bp.blogspot.com/_rIQM7VmDycs/SRFMyV8hydI/AAAAAAAAAjA/ITcD9W3R-5U/s320/FireShot+capture+%2374+-+%27Crystal+Clear+-+Wikimedia+Commons%27+-+commons_wikimedia_org_wiki_Crystal_Clear.png" alt="" id="BLOGGER_PHOTO_ID_5265073867141007826" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: left;"&gt;Espero que sirva de ayuda. ¡Un saludo!&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7404007568594605045-6737877866599273549?l=jorgevillabonagarcia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jorgevillabonagarcia.blogspot.com/feeds/6737877866599273549/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7404007568594605045&amp;postID=6737877866599273549' title='4 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7404007568594605045/posts/default/6737877866599273549'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7404007568594605045/posts/default/6737877866599273549'/><link rel='alternate' type='text/html' href='http://jorgevillabonagarcia.blogspot.com/2008/11/iconos-tutipln.html' title='Iconos a tutiplén'/><author><name>Jorge Villabona García</name><uri>http://www.blogger.com/profile/17217719175201600437</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_rIQM7VmDycs/SRFM_Jza6ZI/AAAAAAAAAjI/3LTa0npjW4c/s72-c/FireShot+capture+%2372+-+%27Free+Icons+Download+-+Icons,Free+Icons,Stock+Icons,Vista+Icons,Desktop+Icons%27+-+www_freeiconsdownload_com_Index_html.png' height='72' width='72'/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7404007568594605045.post-4703272210010154257</id><published>2008-10-13T10:41:00.001+02:00</published><updated>2008-10-13T10:42:49.682+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='xml'/><category scheme='http://www.blogger.com/atom/ns#' term='rss'/><title type='text'>¿Qué es eso del RSS?</title><content type='html'>Últimamente muchas páginas web incluyen funcionalidad RSS. ¿Qué significa esto? Significa que a parte de presentar su contenido en HTML, se presenta también en un formato especial, llamado RSS.&lt;br /&gt;&lt;br /&gt;En general, RSS es un formato basado en XML, que debe incluir una serie de elementos estructurados de una determinada manera.&lt;br /&gt;&lt;br /&gt;Cuando creamos contenido en formato HTML sabemos que nuestro objetivo es llegar a los navegadores web. HTML nos permite incluir cómo se presentará la información (colores, tipos de letra, posición de los diferentes elementos...).&lt;br /&gt;&lt;br /&gt;La estructura de RSS sólo nos permite incluir contenido y nos obliga a seguir unas determinas reglas.  Esto puede parece una desventaja pero si piensa un poco enseguida se ve que es una buena idea.&lt;br /&gt;&lt;br /&gt;Si una aplicación de escritorio quiere obtener la información de un fichero HTML se va a encontrar con dos problemas:&lt;br /&gt;&lt;br /&gt;+El formato incluido en un HTML (colores, fuentes...)  es para un navegador WEB por lo que prácticamente tendrá que desecharlo. Se ha perdido tiempo en descargar, leer y procesar algo a desechar. Ya se sabe que no estamos como para desaprovechar tiempo ni recursos (que estamos en crisis)&lt;br /&gt;&lt;br /&gt; +Cuando lees un HTML te puedes encontrar con cualquier cosa. Aunque últimamente se tiende a escribir en especificaciones de HTML más o menos estrictas es posible que el autor le haya bastado con que se viese bien en Internet Explorer. El procesado de la información podría ser muy complejo si queremos cubrirnos bien las espaldas.&lt;br /&gt;&lt;br /&gt;Cuando una aplicación de cualquier tipo lea un 'feed' (un RSS) se va a encontrar siempre con información relevante y en formato XML. Cualquier entorno de programación incluye lectura de ficheros XML y va a ser muy fácil coger del fichero lo que se quiera mostrar porque ya sabemos que elementos incluye un RSS.&lt;br /&gt;&lt;br /&gt;Esta facilidad para compartir con otras aplicaciones permite que nuestras publicaciones sean accesibles desde otras páginas web y desde otro tipo de sistemas (lectores de feeds..) y que por tanto lleguen a más lectores.&lt;br /&gt;&lt;br /&gt;Enlaces&lt;br /&gt;&lt;br /&gt;Más Info: &lt;a href="http://es.wikipedia.org/wiki/RSS"&gt;http://es.wikipedia.org/wiki/RSS&lt;/a&gt;&lt;br /&gt;Publicar RSS en PHP:&lt;a href="http://www.davidbayon.net/index.php?mostrar=posts&amp;amp;post_id=239"&gt; http://www.davidbayon.net/index.php?mostrar=posts&amp;amp;post_id=239&lt;/a&gt;&lt;br /&gt;¿Cómo crear RSS? &lt;a href="http://es.geocities.com/rss_guia_facil/como_crear_rss.html#3"&gt;http://es.geocities.com/rss_guia_facil/como_crear_rss.html#3&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7404007568594605045-4703272210010154257?l=jorgevillabonagarcia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jorgevillabonagarcia.blogspot.com/feeds/4703272210010154257/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7404007568594605045&amp;postID=4703272210010154257' title='6 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7404007568594605045/posts/default/4703272210010154257'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7404007568594605045/posts/default/4703272210010154257'/><link rel='alternate' type='text/html' href='http://jorgevillabonagarcia.blogspot.com/2008/10/qu-es-eso-del-rss.html' title='¿Qué es eso del RSS?'/><author><name>Jorge Villabona García</name><uri>http://www.blogger.com/profile/17217719175201600437</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7404007568594605045.post-8016838995885991930</id><published>2008-09-30T12:44:00.005+02:00</published><updated>2008-09-30T16:15:03.222+02:00</updated><title type='text'>Windows Vs Linux</title><content type='html'>Este artículo va relacionado un poco con lo que escribió hace unos meses un amigo en su blog: &lt;a href="http://www.davidbayon.net/index.php?mostrar=posts&amp;amp;post_id=143" target="blank"&gt;http://www.davidbayon.net/index.php?mostrar=posts&amp;amp;post_id=143&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;En primer lugar no entiendo ese odio irreconciliable que parece que tienen algunos 'linuxeros' contra Microsoft y todo lo subyacente.&lt;br /&gt;&lt;br /&gt;Perdonadme pero, detrás de la marca comercial está evidentemente el trabajo de mucha gente. En la parte que a mi me concierne, están arquitectos, análistas, programadores, etc.  . Y a lo que quiero llegar es que hacen un trabajo excepcional.&lt;br /&gt;&lt;br /&gt;A pesar de que algunos dicen que Windows Vista es lo peor de lo peor, a mi me parece que se han añadido varias mejoras (visuales y no visuales) que uso a diario y que han mejorado considerablemente mi "calidad de usuario".&lt;br /&gt;&lt;br /&gt;Hace poco probé MS Office 2007. Durante los primeros minutos estaba completamente perdido. Después de un rato trabajando con él descubrí que era una auténtica maravilla.&lt;br /&gt;Yo utilizó (y seguiré utilizando) OpenOffice y versión a versión, el producto ha mejorado espectacularmente pero aún así, pierde mucho comparándolo con su homólogo de Microsoft.&lt;br /&gt;&lt;br /&gt;Pero esto es algo normal y sucede en cualquier sector. Cuando pruebas un Audi y dices 'joer, esto es bastante mejor que mi coche'. Entonces piensas 'Es lo que hay, no me puedo comprar un Audi'. Seguro que nadie arremete contra Audi.&lt;br /&gt;&lt;br /&gt;Si por ejemplo, Dell ha decidido incluir Windows Vista en sus equipos, no seamos ingenuos y pensemos que Microsoft ha chantajeado a Dell para que lo incluya de serie. Dell, aparte de que evidemente habrá sacado 'tajada' , habrá evaluado que Windows Vista funciona correctamente con sus equipos. Y es lógico que Microsoft que se ha gastado una pasta en desarrollar Windows Vista, quiera venderlo, haga ofertas y recorte presupuesto para desarrollar compatibilidades con versiones anteriores.&lt;br /&gt;&lt;br /&gt;Y si a alguien esto le parece mal pues siento decirle que, en este mundo (capitalista), la mayoría de las cosas funcionan así, por lo que tiene mucho de que quejarse.&lt;br /&gt;&lt;br /&gt;A mi me parece lógico que cada uno utilice lo que más le guste (y lo que más se ajuste a su presupuesto).  Es genial que mi Dell haya venido con Windows Vista. Seguro que si hubiera comprado el equipo sin S.O. Preinstalado (no sé si existe la opción) no hubiera podido comprar una Licencia de Windows Vista con la diferencia que me hubiera ahorrado.&lt;br /&gt;&lt;br /&gt;Entiendo también que esto atente contra la libertad de elección de S.O. pero si Dell no te ofrece la opción, habrá otras marcas que si que lo hagan.&lt;br /&gt;&lt;br /&gt;En conclusión,  si te gusta Linux, usa Linux. Si te gusta Windows, usa Windows. Y si te gustan los Mac, cómprate un Mac.&lt;br /&gt;Mi elección es Windows así que, absténgase de acercarse Linuxeros Radicales si se van a dedicar a criticar mi elección. :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7404007568594605045-8016838995885991930?l=jorgevillabonagarcia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jorgevillabonagarcia.blogspot.com/feeds/8016838995885991930/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7404007568594605045&amp;postID=8016838995885991930' title='8 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7404007568594605045/posts/default/8016838995885991930'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7404007568594605045/posts/default/8016838995885991930'/><link rel='alternate' type='text/html' href='http://jorgevillabonagarcia.blogspot.com/2008/09/windows-vs-linux.html' title='Windows Vs Linux'/><author><name>Jorge Villabona García</name><uri>http://www.blogger.com/profile/17217719175201600437</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7404007568594605045.post-3046604685864002374</id><published>2008-09-11T09:05:00.001+02:00</published><updated>2008-09-11T09:08:14.179+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Dell Studio'/><title type='text'>Mi Nuevo Dell Studio 15</title><content type='html'>Hace un par de meses me llegó a casa mi nuevo &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_0"&gt;portátil&lt;/span&gt;: Un &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_1"&gt;Dell&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_2"&gt;Studio&lt;/span&gt; 15&lt;br /&gt;    -&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_3"&gt;Intel&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_4"&gt;Core&lt;/span&gt; 2 &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_5"&gt;Duo&lt;/span&gt; T5750 (2.0GHz,667MHz,2&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_6"&gt;MB&lt;/span&gt;)&lt;br /&gt;    -3&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_7"&gt;Gb&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_8"&gt;Ram&lt;/span&gt;&lt;br /&gt;    -250&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_9"&gt;Gb&lt;/span&gt; Disco Duro&lt;br /&gt;    -Batería de 6 Celdas&lt;br /&gt;    -Tarjeta Gráfica: 256&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_10"&gt;MB&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_11"&gt;ATI&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_12"&gt;Mobility&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_13"&gt;RADEON&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_14"&gt;HD&lt;/span&gt; 3450&lt;br /&gt;    -Precio: 778 Euros (Incluida Extensión de garantía a tres años)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;¿Por qué &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_15"&gt;Dell&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_16"&gt;Studio&lt;/span&gt; 15?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Me decidí por esta marca principalmente porque había oído que el servicio técnico era muy bueno. Llevaba tiempo comparando entre el &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_17"&gt;Dell&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_18"&gt;Inspiron&lt;/span&gt; 1525 y el &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_19"&gt;XPS&lt;/span&gt;. Al primero le faltaba tarjeta gráfica y el segundo me parecía excesivo en características y precio. &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_20"&gt;Dell&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_21"&gt;Studio&lt;/span&gt; se ajustaba perfectamente a mis necesidades (y a mi poder adquisitivo).&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Características del Equipo&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Durante estos dos meses he observado algunas cosas buenas y otras no tan buenas.&lt;br /&gt;&lt;br /&gt;-En condiciones de uso normales es un &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_22"&gt;portátil&lt;/span&gt; muy silencioso y su batería dura unas dos horas. Permite también la activación del modo "Extensión de batería" que reduce algunas características visuales con el que se aumenta sustancialmente la autonomía.&lt;br /&gt;&lt;br /&gt;-Posee un teclado muy cómodo. No me ha costado nada acostumbrarme a la disposición de las teclas, como su tamaño y tacto.&lt;br /&gt;&lt;br /&gt;-Buena recepción &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_23"&gt;wifi&lt;/span&gt;. Tengo colocado el &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_24"&gt;router&lt;/span&gt; en la segunda planta de la casa y puedo navegar sin problemas en cualquier parte. Con el &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_25"&gt;portátil&lt;/span&gt; antiguo era imposible navegar en la planta baja.&lt;br /&gt;&lt;br /&gt;-Los altavoces no son muy buenos. La música a volumen muy alto petardea. Sin embargo con auriculares o altavoces externos la calidad que da la tarjeta de sonido es más que aceptable.&lt;br /&gt;&lt;br /&gt;-Las teclas multimedia deberían estar iluminadas levemente para poder localizar las diferentes funciones cuando no hay mucha luz. Es muy difícil encontrar las teclas de volumen. Buscándolas suele ser común darle a la de extraer &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_26"&gt;cd&lt;/span&gt;.  Otra solución sería habilitar una combinación de teclas que iluminase el panel durante un par de segundos.&lt;br /&gt;&lt;br /&gt;-La pantalla da un buen nivel de brillo. En exterior, a pesar de no ser una pantalla opaca,  puedes trabajar con el equipo perfectamente aumentando el brillo de la pantalla. Con mi anterior &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_27"&gt;portátil&lt;/span&gt; de pantalla opaca no había manera de trabajar en exterior.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Servicio Técnico&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Por desgracia he tenido que comprobar la calidad de servicio. Tuve un problema con la alimentación. Llame por teléfono y al día siguiente tenía en casa un nuevo adaptador de corriente. Al no ser ese el problema en tres días se presentó en mi casa un técnico de &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_28"&gt;Getronics&lt;/span&gt; (Una de las empresas que hace el mantenimiento de &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_29"&gt;Dell&lt;/span&gt;). En media hora cambio la placa base. Tampoco resultó ser ese el problema por lo que me ofrecieron un cambio de equipo. En unos días lo recibiré.&lt;br /&gt;&lt;br /&gt;Recuerdo que el anterior &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_30"&gt;portátil&lt;/span&gt; lo compré en una gran superficie de informática. Tuve dos problemas y me quede dos veces sin &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_31"&gt;portátil&lt;/span&gt;. Tardaron un mes en cada reparación. Está clara la diferencia. ¿Verdad?&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Conclusiones&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;A pesar de los altavoces, las dificultades para encontrar las teclas multimedia o el problema de la alimentación, que puede pasar en equipos de cualquier marca, tengo la sensación de que he acertado con la compra. La características cubren de sobra mis necesidades y estoy muy satisfecho con el servicio técnico ofrecido, que para mi, es de las cosas más importantes.&lt;br /&gt;&lt;br /&gt;Si alguien tiene alguna duda sobre este modelo que no dude en escribirme.&lt;br /&gt;&lt;br /&gt;Un saludo y espero que el artículo sirva de ayuda.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7404007568594605045-3046604685864002374?l=jorgevillabonagarcia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jorgevillabonagarcia.blogspot.com/feeds/3046604685864002374/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7404007568594605045&amp;postID=3046604685864002374' title='24 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7404007568594605045/posts/default/3046604685864002374'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7404007568594605045/posts/default/3046604685864002374'/><link rel='alternate' type='text/html' href='http://jorgevillabonagarcia.blogspot.com/2008/09/mi-nuevo-dell-studio-15.html' title='Mi Nuevo Dell Studio 15'/><author><name>Jorge Villabona García</name><uri>http://www.blogger.com/profile/17217719175201600437</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>24</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7404007568594605045.post-1746278776054074460</id><published>2008-08-29T22:36:00.003+02:00</published><updated>2008-12-18T15:29:29.847+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='xml'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><category scheme='http://www.blogger.com/atom/ns#' term='.Net'/><title type='text'>Escribir log en formato XML para .NET (III)</title><content type='html'>&lt;div style="background-color:lightgray;padding:10px 10px 10px 10px;"&gt;Actualización: Está ya disponible la librería XmlLog y su código fuente en &lt;a href="http://xmllogging.blogspot.com/"&gt;http://xmllogging.blogspot.com/&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;En la &lt;a href="http://jorgevillabonagarcia.blogspot.com/2008/08/escribir-log-en-formato-xml-para-net-ii.html"&gt;parte anterior del artículo&lt;/a&gt; quedó definida la estructura de nuestro fichero XML donde registraremos el funcionamiento de una aplicación. Vimos también la forma en la que escribiremos en el fichero XML en C#.&lt;br /&gt;Sólo queda ya escribir unas pocas lineas de código y ya tendremos nuestro sistema de escritura de log en XML.&lt;br /&gt;&lt;br /&gt;Hay que recordar que para añadir un nuevo registro a un fichero xml no podemos escribir al final del fichero ya que, si lo hacemos, nos cargamos la estructura XML bien formada.&lt;br /&gt;&lt;br /&gt;Creamos una nueva clase llamada XmlLog&lt;br /&gt;&lt;br /&gt;Definimos en código los tres tipos de registros que utilizaremos(de error, informativo y de traza) y los diferentes valores de filtrado que servirán para indicar al objeto XmlLog que tipo de registros debe escribir.&lt;pre class="csharpcode"&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;enum&lt;/span&gt; Tipo&lt;br /&gt;{&lt;br /&gt;ERROR, TRAZA, INFO&lt;br /&gt;}&lt;br /&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;enum&lt;/span&gt; Filtro&lt;br /&gt;{&lt;br /&gt;TODO             &lt;span class="rem"&gt;//Escribir registros informativos, errores y trazas&lt;/span&gt;&lt;br /&gt;,INFORMACION     &lt;span class="rem"&gt;//Escribir registros informativos y de errores&lt;/span&gt;&lt;br /&gt;,SOLO_ERRORES    &lt;span class="rem"&gt;//Escribir solo errores &lt;/span&gt;&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;El constructor tendrá tres parametros.&lt;br /&gt;-Una cadena de texto con la ruta donde se guardarán los ficheros generados.&lt;br /&gt;-El nombre de la aplicación (Se utilizará junto a la fecha para nombrar a los ficheros generados)&lt;br /&gt;-El valor de filtro (Indica que tipo de registros de escribir y cuales ignorar).&lt;pre class="csharpcode"&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;private&lt;/span&gt; String rutaCarpetaDestino;&lt;br /&gt;&lt;span class="kwrd"&gt;private&lt;/span&gt; String nombreAplicacion;&lt;br /&gt;&lt;span class="kwrd"&gt;private&lt;/span&gt; Filtro filtro;&lt;br /&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; XmlLog(String rutaCarpetaDestino, String nombreAplicacion, Filtro filtro)&lt;br /&gt;{&lt;br /&gt; &lt;span class="kwrd"&gt;this&lt;/span&gt;.nombreAplicacion = nombreAplicacion;&lt;br /&gt; &lt;span class="kwrd"&gt;this&lt;/span&gt;.rutaCarpetaDestino = rutaCarpetaDestino;&lt;br /&gt; &lt;span class="kwrd"&gt;this&lt;/span&gt;.filtro = filtro;&lt;br /&gt;}    &lt;/pre&gt;&lt;br /&gt;Para hacer una escribir en el fichero XML se utilizará el siguiente método:&lt;pre class="csharpcode"&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; escribirRegistro(Tipo tipo, &lt;span class="kwrd"&gt;string&lt;/span&gt; text, &lt;span class="kwrd"&gt;string&lt;/span&gt; usuario)&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;&lt;span class="rem"&gt;//Obtener nombre del método que llama al método actual&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;//Es necesario importar System.Diagnostics y System.Reflection&lt;/span&gt;&lt;br /&gt; StackTrace stackTrace = &lt;span class="kwrd"&gt;new&lt;/span&gt; StackTrace();&lt;br /&gt; StackFrame stackFrame = stackTrace.GetFrame(1);&lt;br /&gt; MethodBase methodBase = stackFrame.GetMethod();&lt;br /&gt; String nombreMetodoOrigen = methodBase.DeclaringType + &lt;span class="str"&gt;"."&lt;/span&gt; + methodBase.Name;&lt;br /&gt;&lt;br /&gt;&lt;span class="rem"&gt;//Escribir Registro (Comprobando el valor del filtro con el que se instanció)&lt;/span&gt;&lt;br /&gt; &lt;span class="kwrd"&gt;switch&lt;/span&gt; (tipo)&lt;br /&gt;     {&lt;br /&gt;         &lt;span class="kwrd"&gt;case&lt;/span&gt; Tipo.TRAZA:&lt;br /&gt;             &lt;span class="kwrd"&gt;if&lt;/span&gt; (filtro == Filtro.TODO)&lt;br /&gt;             {&lt;br /&gt;                 appendToXml(Tipo.TRAZA, text, nombreMetodo, usuario);&lt;br /&gt;             }&lt;br /&gt;             &lt;span class="kwrd"&gt;break&lt;/span&gt;;&lt;br /&gt;         &lt;span class="kwrd"&gt;case&lt;/span&gt; Tipo.INFO:&lt;br /&gt;             &lt;span class="kwrd"&gt;if&lt;/span&gt; (filtro != Filtro.SOLO_ERRORES)&lt;br /&gt;             {&lt;br /&gt;                 appendToXml(Tipo.INFO, text, nombreMetodo, usuario);&lt;br /&gt;             }&lt;br /&gt;             &lt;span class="kwrd"&gt;break&lt;/span&gt;;&lt;br /&gt;         &lt;span class="kwrd"&gt;case&lt;/span&gt; Tipo.ERROR:&lt;br /&gt;             appendToXml(Tipo.ERROR, text, nombreMetodo, usuario);&lt;br /&gt;             &lt;span class="kwrd"&gt;break&lt;/span&gt;;&lt;br /&gt;     }&lt;br /&gt;}&lt;/pre&gt;El código anterior hace referencia al método appendToXml. Este método comprueba si existe el fichero de log que se corresponde con el nombre de la aplicación y con la fecha actual.&lt;br /&gt;&lt;br /&gt;En el caso de que no exista se crea y se escribe la cabecera del xml, el elemento raiz y se anida en él el nuevo registro.&lt;br /&gt;&lt;br /&gt;Si el fichero existe, es necesario crear un fichero temporal y copiar la estructura del fichero xml original. Se copiará todo hasta justo antes del cierre del elemento raiz. Ahí es donde se escribirá el nuevo registro. Por supuesto, para terminar habrá que incluir el final del elemento raiz.&lt;br /&gt;&lt;br /&gt;Una terminado el proceso anterior. Se eliminará el fichero original y se renombrará el temporal.&lt;br /&gt;&lt;br /&gt;Éste es el código:&lt;pre class="csharpcode"&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; appendToXml(Tipo tipo, String text, String nombreMetodo, String usuario)&lt;br /&gt;  {&lt;br /&gt;      &lt;span class="rem"&gt;//¿Existe el directorio?&lt;/span&gt;&lt;br /&gt;      &lt;span class="kwrd"&gt;if&lt;/span&gt; (!Directory.Exists(rutaCarpetaDestino)){&lt;span class="kwrd"&gt;return&lt;/span&gt;;}&lt;br /&gt;&lt;br /&gt;      String nombreFichero = rutaCarpetaDestino + &lt;span class="str"&gt;"/"&lt;/span&gt; + nombreAplicacion + &lt;span class="str"&gt;"_log"&lt;/span&gt;+ DateTime.Now.Year + &lt;span class="str"&gt;"_"&lt;/span&gt; + DateTime.Now.Month + &lt;span class="str"&gt;"_"&lt;/span&gt; + DateTime.Now.Day + &lt;span class="str"&gt;".xml"&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;      FileInfo fileInfo = &lt;span class="kwrd"&gt;new&lt;/span&gt; FileInfo(nombreFichero);&lt;br /&gt;      &lt;span class="kwrd"&gt;if&lt;/span&gt; (fileInfo.Exists)&lt;br /&gt;      {&lt;br /&gt;          XmlTextReader xmlReader = &lt;span class="kwrd"&gt;new&lt;/span&gt; XmlTextReader(fileInfo.OpenRead());&lt;br /&gt;          XmlTextWriter xmlWriter = &lt;span class="kwrd"&gt;new&lt;/span&gt; XmlTextWriter(fileInfo.FullName + &lt;span class="str"&gt;"_temp"&lt;/span&gt;, xmlReader.Encoding);&lt;br /&gt;          &lt;span class="kwrd"&gt;try&lt;/span&gt;&lt;br /&gt;          {&lt;br /&gt;              &lt;span class="kwrd"&gt;bool&lt;/span&gt; finalAlcanzado = &lt;span class="kwrd"&gt;false&lt;/span&gt;;&lt;br /&gt;              &lt;span class="kwrd"&gt;string&lt;/span&gt; elementoRaiz = String.Empty;&lt;br /&gt;              xmlWriter.Formatting = Formatting.Indented;&lt;br /&gt;    &lt;br /&gt;      &lt;span class="rem"&gt;//Recorrer la estructura elemento a elemento y copiar cada uno de ellos en el fichero temporal.&lt;/span&gt;&lt;br /&gt;      &lt;span class="rem"&gt;//(Hasta encontrar el cierre del elemento raiz)&lt;/span&gt;&lt;br /&gt;              &lt;span class="kwrd"&gt;while&lt;/span&gt; (!finalAlcanzado)&lt;br /&gt;              {&lt;br /&gt;                  xmlReader.Read();&lt;br /&gt;                  &lt;span class="kwrd"&gt;switch&lt;/span&gt; (xmlReader.NodeType)&lt;br /&gt;                  {&lt;br /&gt;                      &lt;span class="kwrd"&gt;case&lt;/span&gt; XmlNodeType.DocumentType:&lt;br /&gt;                          xmlWriter.WriteDocType(xmlReader.Name, &lt;span class="kwrd"&gt;null&lt;/span&gt;, &lt;span class="kwrd"&gt;null&lt;/span&gt;, &lt;span class="kwrd"&gt;null&lt;/span&gt;);&lt;br /&gt;                          &lt;span class="kwrd"&gt;break&lt;/span&gt;;&lt;br /&gt;                      &lt;span class="kwrd"&gt;case&lt;/span&gt; XmlNodeType.Element:&lt;br /&gt;                          xmlWriter.WriteStartElement(xmlReader.LocalName);&lt;br /&gt;                          &lt;span class="kwrd"&gt;if&lt;/span&gt; (xmlReader.HasAttributes)&lt;br /&gt;                          {&lt;br /&gt;&lt;br /&gt;                              &lt;span class="kwrd"&gt;while&lt;/span&gt; (xmlReader.MoveToNextAttribute())&lt;br /&gt;                              {&lt;br /&gt;                                  xmlWriter.WriteAttributeString(xmlReader.LocalName, xmlReader.Value);&lt;br /&gt;                              }&lt;br /&gt;                              xmlReader.MoveToElement();&lt;br /&gt;                              &lt;span class="kwrd"&gt;break&lt;/span&gt;;&lt;br /&gt;                          }&lt;br /&gt;&lt;br /&gt;                          &lt;span class="kwrd"&gt;if&lt;/span&gt; (xmlReader.IsEmptyElement)&lt;br /&gt;                              xmlWriter.WriteEndElement();&lt;br /&gt;                          &lt;span class="kwrd"&gt;if&lt;/span&gt; (elementoRaiz.Equals(String.Empty))&lt;br /&gt;                              elementoRaiz = xmlReader.LocalName;&lt;br /&gt;                          &lt;span class="kwrd"&gt;break&lt;/span&gt;;&lt;br /&gt;                      &lt;span class="kwrd"&gt;case&lt;/span&gt; XmlNodeType.EndElement:&lt;br /&gt;                          &lt;span class="kwrd"&gt;if&lt;/span&gt; (elementoRaiz == xmlReader.LocalName)&lt;br /&gt;                              finalAlcanzado = &lt;span class="kwrd"&gt;true&lt;/span&gt;;&lt;br /&gt;                          &lt;span class="kwrd"&gt;else&lt;/span&gt;&lt;br /&gt;                              xmlWriter.WriteEndElement();&lt;br /&gt;                          &lt;span class="kwrd"&gt;break&lt;/span&gt;;&lt;br /&gt;                      &lt;span class="kwrd"&gt;case&lt;/span&gt; XmlNodeType.Text:&lt;br /&gt;                          xmlWriter.WriteString(xmlReader.Value);&lt;br /&gt;                          &lt;span class="kwrd"&gt;break&lt;/span&gt;;&lt;br /&gt;                      &lt;span class="kwrd"&gt;case&lt;/span&gt; XmlNodeType.Whitespace:&lt;br /&gt;                          xmlWriter.WriteWhitespace(xmlReader.Value);&lt;br /&gt;                          &lt;span class="kwrd"&gt;break&lt;/span&gt;;&lt;br /&gt;                      &lt;span class="kwrd"&gt;case&lt;/span&gt; XmlNodeType.ProcessingInstruction:&lt;br /&gt;                          xmlWriter.WriteProcessingInstruction(xmlReader.Name, xmlReader.Value);&lt;br /&gt;                          &lt;span class="kwrd"&gt;break&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;                  }&lt;br /&gt;              }&lt;br /&gt;              &lt;span class="rem"&gt;//AÑADIR EL NUEVO ELEMENTO&lt;/span&gt;&lt;br /&gt;              escribirElemento(xmlWriter, tipo, text, nombreMetodo, usuario);&lt;br /&gt;              &lt;span class="rem"&gt;//ESCRIBIR FINAL XML&lt;/span&gt;&lt;br /&gt;              xmlWriter.WriteEndElement();&lt;br /&gt;              xmlWriter.Flush();&lt;br /&gt;              xmlWriter.Close();&lt;br /&gt;              xmlReader.Close();&lt;br /&gt;              fileInfo.Delete();&lt;br /&gt;              File.Move(fileInfo.FullName + &lt;span class="str"&gt;"_temp"&lt;/span&gt;, fileInfo.FullName);&lt;br /&gt;          }&lt;br /&gt;          &lt;span class="kwrd"&gt;catch&lt;/span&gt; (Exception ex)&lt;br /&gt;          {&lt;br /&gt;              xmlWriter.Close();&lt;br /&gt;              xmlReader.Close();&lt;br /&gt;              File.Delete(fileInfo.FullName + &lt;span class="str"&gt;"_temp"&lt;/span&gt;);&lt;br /&gt;          }&lt;br /&gt;      }&lt;br /&gt;      &lt;span class="kwrd"&gt;else&lt;/span&gt;&lt;br /&gt;      {&lt;br /&gt;          XmlTextWriter xmlWriter = &lt;span class="kwrd"&gt;new&lt;/span&gt; XmlTextWriter(nombreFichero, System.Text.Encoding.UTF8);&lt;br /&gt;          &lt;span class="kwrd"&gt;try&lt;/span&gt;&lt;br /&gt;          {&lt;br /&gt;              &lt;span class="rem"&gt;// Write processor information&lt;/span&gt;&lt;br /&gt;              xmlWriter.WriteProcessingInstruction(&lt;span class="str"&gt;"xml-stylesheet"&lt;/span&gt;, &lt;span class="str"&gt;"type='text/xsl' href='log.xsl'"&lt;/span&gt;);&lt;br /&gt;              xmlWriter.WriteStartElement(&lt;span class="str"&gt;"registros"&lt;/span&gt;);&lt;br /&gt;              xmlWriter.Formatting = Formatting.Indented;&lt;br /&gt;&lt;br /&gt;              escribirElemento(xmlWriter, tipo, text, nombreMetodo, usuario);&lt;br /&gt;              xmlWriter.WriteEndElement();&lt;br /&gt;              xmlWriter.Flush();&lt;br /&gt;          }&lt;br /&gt;          &lt;span class="kwrd"&gt;catch&lt;/span&gt; (Exception ex)&lt;br /&gt;          {&lt;br /&gt;          }&lt;br /&gt;          xmlWriter.Close();&lt;br /&gt;      }&lt;br /&gt;  }&lt;/pre&gt;Sólo falta el método escribirElemento que escribirá el registro xml tal y como lo definimos.&lt;pre class="csharpcode"&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; escribirElemento(XmlTextWriter xmlWriter, Tipo tipo, String text, String nombreMetodo, String usuario)&lt;br /&gt;  {&lt;br /&gt;  xmlWriter.WriteStartElement(&lt;span class="str"&gt;"registro"&lt;/span&gt;); &lt;span class="rem"&gt;//Inicio Elemento Registro&lt;/span&gt;&lt;br /&gt;      &lt;span class="kwrd"&gt;switch&lt;/span&gt; (tipo)&lt;br /&gt;      {&lt;br /&gt;          &lt;span class="kwrd"&gt;case&lt;/span&gt; Tipo.ERROR:&lt;br /&gt;              xmlWriter.WriteAttributeString(&lt;span class="str"&gt;"tipo"&lt;/span&gt;, &lt;span class="str"&gt;"error"&lt;/span&gt;);&lt;br /&gt;              &lt;span class="kwrd"&gt;break&lt;/span&gt;;&lt;br /&gt;          &lt;span class="kwrd"&gt;case&lt;/span&gt; Tipo.INFO:&lt;br /&gt;      xmlWriter.WriteAttributeString(&lt;span class="str"&gt;"tipo"&lt;/span&gt;, &lt;span class="str"&gt;"info"&lt;/span&gt;);&lt;br /&gt;              &lt;span class="kwrd"&gt;break&lt;/span&gt;;&lt;br /&gt;          &lt;span class="kwrd"&gt;case&lt;/span&gt; Tipo.TRAZA:&lt;br /&gt;              xmlWriter.WriteAttributeString(&lt;span class="str"&gt;"tipo"&lt;/span&gt;, &lt;span class="str"&gt;"traza"&lt;/span&gt;);&lt;br /&gt;              &lt;span class="kwrd"&gt;break&lt;/span&gt;;&lt;br /&gt;      }&lt;br /&gt;&lt;br /&gt;  xmlWriter.WriteAttributeString(&lt;span class="str"&gt;"fechahora"&lt;/span&gt;, DateTime.Now.ToString());&lt;br /&gt;  xmlWriter.WriteAttributeString(&lt;span class="str"&gt;"metodo"&lt;/span&gt;, nombreMetodo);&lt;br /&gt;  xmlWriter.WriteAttributeString(&lt;span class="str"&gt;"usuario"&lt;/span&gt;, usuario);&lt;br /&gt;  xmlWriter.WriteString(text);&lt;br /&gt;  xmlWriter.WriteEndElement();  &lt;span class="rem"&gt;//Fin elemento Registro&lt;/span&gt;&lt;br /&gt;  }&lt;/pre&gt;Cuando se ha creado el encabezamiento del fichero xml se ha incluido la siguiente instrucción:&lt;br /&gt;&lt;br /&gt;xmlWriter.WriteProcessingInstruction("xml-stylesheet", "type='text/xsl' href='log.xsl'");&lt;br /&gt;&lt;br /&gt;La hoja xsl "log.xsl" será la hoja que crearemos en la última parte del artículo y que nos servirá para dar un formato amigable a fichero xml.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7404007568594605045-1746278776054074460?l=jorgevillabonagarcia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jorgevillabonagarcia.blogspot.com/feeds/1746278776054074460/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7404007568594605045&amp;postID=1746278776054074460' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7404007568594605045/posts/default/1746278776054074460'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7404007568594605045/posts/default/1746278776054074460'/><link rel='alternate' type='text/html' href='http://jorgevillabonagarcia.blogspot.com/2008/08/escribir-log-en-formato-xml-para-net.html' title='Escribir log en formato XML para .NET (III)'/><author><name>Jorge Villabona García</name><uri>http://www.blogger.com/profile/17217719175201600437</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7404007568594605045.post-1893396741273106853</id><published>2008-08-28T09:07:00.000+02:00</published><updated>2008-08-28T09:09:32.726+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Sql Server'/><category scheme='http://www.blogger.com/atom/ns#' term='SSIS'/><category scheme='http://www.blogger.com/atom/ns#' term='.Net'/><title type='text'>Microsoft SQL Server Integration Services (SSIS): Introducción</title><content type='html'>&lt;span style="font-weight: bold;"&gt;¿Qué es SSIS? &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;SSIS es una potente herramienta que nos permite mover información entre un sistema origen (Fichero de texto plano, fichero XML, hoja Excel, una base de datos...) a un sistema destino (Fichero de texto plano, fichero XML, hoja Excel, una base de datos...).  SSIS nos ofrece también la posibilidad de transformar los datos obtenidos del origen antes de que pasen al sistema destino.&lt;br /&gt;&lt;br /&gt;El paquete (Package) es el objeto que implementa la funcionalidad de Integration Services y puede contener:&lt;br /&gt;    -Elementos de flujo de control: Tareas, contenedores y restricciones de precedencia.&lt;br /&gt;    -Elementos de flujo de datos: orígenes, transformaciones y destinos.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Tareas&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Una Tarea (Task) proporciona funcionalidad. Podemos encontrar tareas para ejecutar un conjunto de sentencias SQL (Execute SQL Task), para mandar un correo electrónico (Send Mail Task), para subir un fichero FTP (FTP Task) o para ejecutar fragmentos de Visual Basic .Net (Script Task)&lt;br /&gt;&lt;br /&gt;Una tarea importante es DataFlow Task. Cuando la insertamos estamos creando un flujo de datos en el que especificaremos de donde queremos obtener información , que transformaciones queremos hacer y a donde llegará la información transformada. En un flujo de Control podemos insertar varios flujos de datos.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Relaciones de Precedencia&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Dentro del flujo de control podremos insertar varias tareas. Para saber que tareas se ejecutan y el orden que se debe seguir utilizaremos las Relaciones de Precedencia (Precedence Constraint).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Contenedores&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;A veces será necesario realizar una tarea varias veces o agrupar una serie de tareas. Para ello utilizaremos los contenedores (Containers). Hay contenedores que ejecutan un flujo repetidamente mediante un enumerador (Foreach Loop Container), contenedores pare ejecutar un flujo repetidamente mientras se cumpla una condición (For Loop Container) y para agrupar tareas para que tengan un mismo ámbito de ejecución (Sequence Container) .&lt;br /&gt;&lt;br /&gt;En un contenedor podemos tener otros contenedores anidados.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;¿Como trabajamos con SSIS?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;SQL Server Integration Services está integrado en SQL Server en las versiones Developer o Enterprise.  El entorno de desarrollo se llama SQL Server Business Intelligence Development Studio (BIDS) y éste se integra en Visual Studio .Net.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7404007568594605045-1893396741273106853?l=jorgevillabonagarcia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jorgevillabonagarcia.blogspot.com/feeds/1893396741273106853/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7404007568594605045&amp;postID=1893396741273106853' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7404007568594605045/posts/default/1893396741273106853'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7404007568594605045/posts/default/1893396741273106853'/><link rel='alternate' type='text/html' href='http://jorgevillabonagarcia.blogspot.com/2008/08/microsoft-sql-server-integration.html' title='Microsoft SQL Server Integration Services (SSIS): Introducción'/><author><name>Jorge Villabona García</name><uri>http://www.blogger.com/profile/17217719175201600437</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7404007568594605045.post-8925276472443408081</id><published>2008-08-21T20:52:00.006+02:00</published><updated>2008-12-18T15:30:33.135+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='xml'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><category scheme='http://www.blogger.com/atom/ns#' term='.Net'/><title type='text'>Escribir log en formato XML para .NET (II)</title><content type='html'>&lt;div style="background-color:lightgray;padding:10px 10px 10px 10px;"&gt;Actualización: Está ya disponible la librería XmlLog y su código fuente en &lt;a href="http://xmllogging.blogspot.com/"&gt;http://xmllogging.blogspot.com/&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;En la primera parte de artículo vimos las ventajas que tendría que nuestro sistema de logs escribiese ficheros en formato xml.&lt;br /&gt;&lt;br /&gt;Nos ponemos manos a la obra.&lt;br /&gt;&lt;br /&gt;El primer paso es definir el esquema del xml que escribirá nuestro sistema.&lt;br /&gt;Lo haremos de forma informal, es decir, no vamos a crear un fichero xsd ya que nos extenderíamos demasiado y no es objetivo del artículo.&lt;br /&gt;&lt;br /&gt;Se me ocurre que podemos tener tres tipos de registro:&lt;br /&gt;-Registro de error (Ej: Excepción en abrirFichero()...)&lt;br /&gt;-Registro informativo (Ej: El usuario 1111 ha iniciado sesión...)&lt;br /&gt;-Registro de traza (Ej: Se ha abierto correctamente el fichero)&lt;br /&gt;&lt;br /&gt;En cada registro se informará:&lt;br /&gt;Cuándo: La fecha y hora del evento&lt;br /&gt;Qué: tipo de registro de que se trata (de error, informativo, de traza)&lt;br /&gt;Quién: Usuario responsable de la acción que ha desencadenado el registro.&lt;br /&gt;Dónde: El nombre de la clase y del método origen.&lt;br /&gt;Por qué: Una descripción completa del suceso.&lt;br /&gt;&lt;br /&gt;Vemos un ejemplo de la estructura XML&lt;br /&gt;&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;&lt;br /&gt;&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;registros&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt; &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;registro&lt;/span&gt; &lt;span class="attr"&gt;tipo&lt;/span&gt;&lt;span class="kwrd"&gt;="info"&lt;/span&gt; &lt;span class="attr"&gt;fechahora&lt;/span&gt;&lt;span class="kwrd"&gt;="21/08/2008 20:16"&lt;/span&gt; &lt;span class="attr"&gt;metodo&lt;/span&gt;&lt;span class="kwrd"&gt;="Clase.metodo"&lt;/span&gt; &lt;span class="attr"&gt;usuario&lt;/span&gt;&lt;span class="kwrd"&gt;="jorge"&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;     Iniciada Aplicación&lt;br /&gt; &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;registro&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt; &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;registro&lt;/span&gt; &lt;span class="attr"&gt;tipo&lt;/span&gt;&lt;span class="kwrd"&gt;="traza"&lt;/span&gt; &lt;span class="attr"&gt;fechahora&lt;/span&gt;&lt;span class="kwrd"&gt;="21/08/2008 20:17"&lt;/span&gt; &lt;span class="attr"&gt;metodo&lt;/span&gt;&lt;span class="kwrd"&gt;="Clase.metodo"&lt;/span&gt; &lt;span class="attr"&gt;usuario&lt;/span&gt;&lt;span class="kwrd"&gt;="jorge"&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;     Se va a intentar abrir el fichero.&lt;br /&gt; &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;registro&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt; &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;registro&lt;/span&gt; &lt;span class="attr"&gt;tipo&lt;/span&gt;&lt;span class="kwrd"&gt;="error"&lt;/span&gt; &lt;span class="attr"&gt;fechahora&lt;/span&gt;&lt;span class="kwrd"&gt;="21/08/2008 20:18"&lt;/span&gt; &lt;span class="attr"&gt;metodo&lt;/span&gt;&lt;span class="kwrd"&gt;="Clase.metodo"&lt;/span&gt; &lt;span class="attr"&gt;usuario&lt;/span&gt;&lt;span class="kwrd"&gt;="jorge"&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;     Se ha producido una excepción cuando se intentaba abrir el fichero.&lt;br /&gt; &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;registro&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt; &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;registro&lt;/span&gt; &lt;span class="attr"&gt;tipo&lt;/span&gt;&lt;span class="kwrd"&gt;="info"&lt;/span&gt; &lt;span class="attr"&gt;fechahora&lt;/span&gt;&lt;span class="kwrd"&gt;="21/08/2008 20:19"&lt;/span&gt; &lt;span class="attr"&gt;metodo&lt;/span&gt;&lt;span class="kwrd"&gt;="Clase.metodo"&lt;/span&gt; &lt;span class="attr"&gt;usuario&lt;/span&gt;&lt;span class="kwrd"&gt;="jorge"&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;     Fin de la aplicación con errores.&lt;br /&gt; &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;registro&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;registros&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;¿Como hacemos para escribir lo anterior en fichero XML en C#?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Hay varias formas. Nosotros utilizaremos la clase XmlTextWriter (Dentro de System.Xml)&lt;br /&gt;&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;&lt;br /&gt;&lt;pre class="csharpcode"&gt;&lt;br /&gt;XmlTextWriter xmlWriter = &lt;span class="kwrd"&gt;new&lt;/span&gt; XmlTextWriter(&lt;span class="str"&gt;"log_de_prueba.xml"&lt;/span&gt;, System.Text.Encoding.UTF8);&lt;br /&gt;&lt;br /&gt;xmlWriter.WriteStartElement(&lt;span class="str"&gt;"registros"&lt;/span&gt;); &lt;span class="rem"&gt;//Inicio Elemento Registros&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;xmlWriter.WriteStartElement(&lt;span class="str"&gt;"registro"&lt;/span&gt;); &lt;span class="rem"&gt;//Inicio Elemento Registro&lt;/span&gt;&lt;br /&gt;xmlWriter.WriteAttributeString(&lt;span class="str"&gt;"tipo"&lt;/span&gt;, &lt;span class="str"&gt;"info"&lt;/span&gt;);&lt;br /&gt;xmlWriter.WriteAttributeString(&lt;span class="str"&gt;"fechahora"&lt;/span&gt;, DateTime.Now.ToString());&lt;br /&gt;xmlWriter.WriteAttributeString(&lt;span class="str"&gt;"metodo"&lt;/span&gt;, nombreMetodoOrigen);&lt;br /&gt;xmlWriter.WriteAttributeString(&lt;span class="str"&gt;"usuario"&lt;/span&gt;, usuario);&lt;br /&gt;xmlWriter.WriteString(&lt;span class="str"&gt;"Se va a intentar abrir el fichero."&lt;/span&gt;);&lt;br /&gt;xmlWriter.WriteEndElement();  &lt;span class="rem"&gt;//Fin elemento Registro&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;xmlWriter.WriteStartElement(&lt;span class="str"&gt;"error"&lt;/span&gt;); &lt;span class="rem"&gt;//Inicio Elemento Registro&lt;/span&gt;&lt;br /&gt;xmlWriter.WriteAttributeString(&lt;span class="str"&gt;"tipo"&lt;/span&gt;, &lt;span class="str"&gt;"info"&lt;/span&gt;);&lt;br /&gt;xmlWriter.WriteAttributeString(&lt;span class="str"&gt;"fechahora"&lt;/span&gt;, DateTime.Now.ToString());&lt;br /&gt;xmlWriter.WriteAttributeString(&lt;span class="str"&gt;"metodo"&lt;/span&gt;, nombreMetodoOrigen);&lt;br /&gt;xmlWriter.WriteAttributeString(&lt;span class="str"&gt;"usuario"&lt;/span&gt;, usuario);&lt;br /&gt;xmlWriter.WriteString(&lt;span class="str"&gt;"Se ha producido una excepción cuando se intentaba abrir el fichero."&lt;/span&gt;);&lt;br /&gt;xmlWriter.WriteEndElement(); &lt;span class="rem"&gt;//Fin elemento Registro&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;...&lt;br /&gt;&lt;br /&gt;xmlWriter.WriteEndElement(); //Fin Elemento Registros&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;¿Cómo conseguimos el nombre del método origen del registro?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Diagnostics;&lt;br /&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Reflection;&lt;br /&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; XmlLog{&lt;br /&gt;...&lt;br /&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; escribirRegistro(...){&lt;br /&gt;&lt;br /&gt;&lt;span class="rem"&gt;//Obtener nombre del método que llama al método actual&lt;/span&gt;&lt;br /&gt;StackTrace stackTrace = &lt;span class="kwrd"&gt;new&lt;/span&gt; StackTrace();&lt;br /&gt;StackFrame stackFrame = stackTrace.GetFrame(1);&lt;br /&gt;MethodBase methodBase = stackFrame.GetMethod();&lt;br /&gt;String nombreMetodoOrigen = methodBase.DeclaringType + &lt;span class="str"&gt;"."&lt;/span&gt; + methodBase.Name;&lt;br /&gt;&lt;br /&gt;&lt;span class="rem"&gt;//Escribir Registro&lt;/span&gt;&lt;br /&gt;...&lt;br /&gt;}&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;Si dentro de Clase.metodo hacemos la llamada al método XmlLog.escribirRegistro(...)&lt;br /&gt;&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;&lt;br /&gt;&lt;pre class="csharpcode"&gt;Class Clase{&lt;br /&gt;  &lt;span class="kwrd"&gt;void&lt;/span&gt; metodo(){&lt;br /&gt;      XmlLog.escribirRegistro(..);&lt;br /&gt;  }&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;nombreMetodoOrigen (en XmlLog.escribirRegistro) tomará valor "Clase.metodo"&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Seguiremos dándole forma a nuestro sistema de logs Xml en la parte siguiente del artículo.&lt;br /&gt;&lt;br /&gt;Un saludo.&lt;br /&gt;&lt;br /&gt;Fuentes:&lt;br /&gt;&lt;a href="http://www.codeproject.com/KB/dotnet/MethodName.aspx" target="blank"&gt;http://www.codeproject.com/KB/dotnet/MethodName.aspx&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.codeproject.com/KB/XML/XmlAppending.aspx" target="blank"&gt;http://www.codeproject.com/KB/XML/XmlAppending.aspx&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7404007568594605045-8925276472443408081?l=jorgevillabonagarcia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jorgevillabonagarcia.blogspot.com/feeds/8925276472443408081/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7404007568594605045&amp;postID=8925276472443408081' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7404007568594605045/posts/default/8925276472443408081'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7404007568594605045/posts/default/8925276472443408081'/><link rel='alternate' type='text/html' href='http://jorgevillabonagarcia.blogspot.com/2008/08/escribir-log-en-formato-xml-para-net-ii.html' title='Escribir log en formato XML para .NET (II)'/><author><name>Jorge Villabona García</name><uri>http://www.blogger.com/profile/17217719175201600437</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7404007568594605045.post-7712892477866593263</id><published>2008-08-13T22:15:00.008+02:00</published><updated>2008-12-18T15:31:16.971+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='xml'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><category scheme='http://www.blogger.com/atom/ns#' term='xsl'/><category scheme='http://www.blogger.com/atom/ns#' term='.Net'/><title type='text'>Escribir log en formato XML para .NET (I)</title><content type='html'>&lt;div style="background-color:lightgray;padding:10px 10px 10px 10px;"&gt;Actualización: Está ya disponible la librería XmlLog y su código fuente en &lt;a href="http://xmllogging.blogspot.com/"&gt;http://xmllogging.blogspot.com/&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Cuando se realiza el mantenimiento de una aplicación se recurre muchas veces a la visualización de logs que ésta genera. Los datos que ellos contienen pueden dar pistas sobre las causas de los errores que van surgiendo. Es importante que dispongamos de un buen sistema de escritura de logs en nuestra aplicación.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;Razones por las cuales incorporar un sistema de escritura de logs.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;  En caso de error de la aplicación un buen log &lt;span style="font-weight: bold;"&gt;nos va a informar cuando se produce el error, donde se produce, cuál es la causa y el porqué y quién la produce&lt;/span&gt; (en aplicaciones que den servicio a varios usuarios).&lt;/li&gt;&lt;li&gt;  Hay que veces que &lt;span style="font-weight: bold;"&gt;el error es producido por causas ajenas&lt;/span&gt; (fallo en la conexión con algún servidor...). Si el log nos informa de este hecho sabremos que no hay que tocar nada en la aplicación y &lt;span style="font-weight: bold;"&gt;ahorraremos tiempo&lt;/span&gt;.&lt;/li&gt;&lt;li&gt;  En el caso de que sea necesario podremos configurar el sistema de logs para que &lt;span style="font-weight: bold;"&gt;escriba trazas &lt;/span&gt;para ver cual ha sido el camino lógico escogido por la aplicación antes de un error.&lt;/li&gt;&lt;li&gt;  Un log nos puede ayudar a saber &lt;span style="font-weight: bold;"&gt;quien ha realizado una determinada acción&lt;/span&gt;. En concreto, para ámbitos comerciales un log puede demostrar que una operación de un determinado cliente se ha realizado (o no) en caso de disputa.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;Características de un buen sistema de logs&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;  &lt;span style="font-weight: bold;"&gt;Formato estándar y legible&lt;/span&gt; para el ser humano&lt;/li&gt;&lt;li&gt;  Debe registrar sólo aquellos datos oportunos (&lt;span style="font-weight: bold;"&gt;Qué, Cuándo, Dónde, Por qué, Quién...&lt;/span&gt;). Todo dato superfluo dificultará la lectura.&lt;/li&gt;&lt;li&gt;  &lt;span style="font-weight: bold;"&gt;Debe ser diseñado teniendo en cuenta las limitaciones de disco duro&lt;/span&gt; (En algunos casos habrá que mover o eliminar ficheros antiguos para no comprometer la fiabilidad del sistema)&lt;/li&gt;&lt;li&gt;  Configurable para escribir (o no) diferentes tipos de registros:&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;Registro de error (Ej: Excepción en abrirFichero()...)&lt;/li&gt;&lt;br /&gt; &lt;li&gt;Registro de información (Ej: El usuario 1111 ha iniciado sesión...)&lt;/li&gt;&lt;br /&gt; &lt;li&gt;Registro de traza (Ej: Se ha abierto correctamente el fichero)&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;En mi opinión, escribir un log en XML puede darnos ventajas. Es un formato estándar y se puede organizar la información de tal forma que sea incluso más agradable de leer por el ser humano que un fichero de texto plano. También existe la posibilidad (y esto es lo que más me gusta) de darle el formato que queramos (por ejemplo HTML) usando plantillas XSL. Con un poco de CSS y un poco de Javascript podremos presentar el registro de nuestra aplicación ofreciendo funcionalidades añadidas (filtrado por tipo de registro, por fecha, interfaz intuitiva...)&lt;br /&gt;&lt;br /&gt;Pasar de un log en texto plano a uno en formato XML puede parecer una trivialidad. Pero no lo es tanto. Para escribir un registro en un fichero de texto plano basta con escribir en el inicio del fichero o al final. En un fichero XML si escribimos al final (o al principio) dejaremos de tener un XML bien formado. En un fichero XML debemos incluir el registro como mínimo dentro del nodo principal.&lt;br /&gt;¿Cómo? Hay varios métodos. Esta página explica algunos de ellos para .NET: &lt;a href="http://www.codeproject.com/KB/XML/XmlAppending.aspx" target="blank"&gt;http://www.codeproject.com/KB/XML/XmlAppending.aspx&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;En el próximo artículo sobre este tema nos pondremos manos a la obra. Definiremos una estructura de XML para nuestro sistema de log y lo implementaremos para C# (utilizando uno de los métodos de página anterior). Por último crearemos una hoja XSL que presente el fichero XML con funcionalidades extras.&lt;br /&gt;&lt;br /&gt;¡Hasta pronto!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7404007568594605045-7712892477866593263?l=jorgevillabonagarcia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jorgevillabonagarcia.blogspot.com/feeds/7712892477866593263/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7404007568594605045&amp;postID=7712892477866593263' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7404007568594605045/posts/default/7712892477866593263'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7404007568594605045/posts/default/7712892477866593263'/><link rel='alternate' type='text/html' href='http://jorgevillabonagarcia.blogspot.com/2008/08/escribir-log-en-formato-xml-para-net-i.html' title='Escribir log en formato XML para .NET (I)'/><author><name>Jorge Villabona García</name><uri>http://www.blogger.com/profile/17217719175201600437</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7404007568594605045.post-5220365704859585878</id><published>2008-08-06T12:57:00.006+02:00</published><updated>2008-08-13T22:22:49.456+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><category scheme='http://www.blogger.com/atom/ns#' term='.Net'/><title type='text'>Listas Genéricas .Net: Uso de FindAll(Predicate&lt;&gt;)</title><content type='html'>A continuación voy a mostrar un ejemplo de como usar el método FindAll en una lista genérica de objetos de una clase en concreto.&lt;br /&gt;&lt;br /&gt;Partimos de la siguiente clase:&lt;br /&gt;&lt;br /&gt;&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;class&lt;/span&gt; Persona&lt;br /&gt;{&lt;br /&gt;&lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; nombre;&lt;br /&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; Nombre&lt;br /&gt;{&lt;br /&gt;   get { &lt;span class="kwrd"&gt;return&lt;/span&gt; nombre; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; provincia;&lt;br /&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; Provincia&lt;br /&gt;{&lt;br /&gt;   get { &lt;span class="kwrd"&gt;return&lt;/span&gt; provincia; }&lt;br /&gt;}&lt;br /&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; Persona(&lt;span class="kwrd"&gt;string&lt;/span&gt; nombre, &lt;span class="kwrd"&gt;string&lt;/span&gt; provincia)&lt;br /&gt;{&lt;br /&gt;   &lt;span class="kwrd"&gt;this&lt;/span&gt;.nombre = nombre;&lt;br /&gt;   &lt;span class="kwrd"&gt;this&lt;/span&gt;.provincia = provincia;&lt;br /&gt;}&lt;br /&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;override&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; ToString()&lt;br /&gt;{&lt;br /&gt;   &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="str"&gt;"Nombre:"&lt;/span&gt; + &lt;span class="kwrd"&gt;this&lt;/span&gt;.nombre + &lt;span class="str"&gt;" Provincia:"&lt;/span&gt; + &lt;span class="kwrd"&gt;this&lt;/span&gt;.provincia;&lt;br /&gt;}&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;Queremos introducir en una lista diferentes personas con su datos.&lt;br /&gt;&lt;br /&gt;&lt;pre class="csharpcode"&gt;List&amp;lt;Persona&amp;gt; listaPersonas = &lt;span class="kwrd"&gt;new&lt;/span&gt; List&amp;lt;Persona&amp;gt;();&lt;br /&gt;listaPersonas.Add(&lt;span class="kwrd"&gt;new&lt;/span&gt; Persona(&lt;span class="str"&gt;"Juan"&lt;/span&gt;, &lt;span class="str"&gt;"Navarra"&lt;/span&gt;));&lt;br /&gt;listaPersonas.Add(&lt;span class="kwrd"&gt;new&lt;/span&gt; Persona(&lt;span class="str"&gt;"Pedro"&lt;/span&gt;, &lt;span class="str"&gt;"Zaragoza"&lt;/span&gt;));&lt;br /&gt;listaPersonas.Add(&lt;span class="kwrd"&gt;new&lt;/span&gt; Persona(&lt;span class="str"&gt;"María"&lt;/span&gt;, &lt;span class="str"&gt;"Navarra"&lt;/span&gt;));&lt;/pre&gt;Una vez tenemos la lista con los datos, nos interesaría saber que personas viven en una determinada provincia.&lt;br /&gt;Para ello utilizaremos el método FindAll (dentro de List).&lt;br /&gt;Este método necesita como parámetro un predicado (Predicate).&lt;br /&gt;Un predicado es un método en el cual se definen una serie de criterios y es capaz de determinar si un objeto encaja con esos criterios.&lt;br /&gt;&lt;br /&gt;Ejemplo:&lt;br /&gt;&lt;br /&gt;&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;bool&lt;/span&gt; match(Persona persona)&lt;br /&gt;{&lt;br /&gt;&lt;span class="kwrd"&gt;return&lt;/span&gt; (persona.Provincia.Equals(&lt;span class="str"&gt;"Navarra"&lt;/span&gt;));&lt;br /&gt;}&lt;/pre&gt;Entonces para buscar en nuestra lista ejecutaríamos los siguiente:&lt;br /&gt;&lt;br /&gt;&lt;pre class="csharpcode"&gt;List&amp;lt;Persona&amp;gt; listaPersonasEnNavarra;&lt;br /&gt;listaPersonasEnNavarra = listaPersonas.FindAll(match);&lt;/pre&gt;&lt;br /&gt;El problema es que necesitaríamos un método para cada una de las 50 provincias del territorio español (y dos más para las ciudades autónomas)&lt;br /&gt;&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;&lt;br /&gt;&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;bool&lt;/span&gt; matchBadajoz(Persona persona){&lt;span class="kwrd"&gt;return&lt;/span&gt; (persona.Provincia.Equals(&lt;span class="str"&gt;"Badajoz"&lt;/span&gt;));}&lt;br /&gt;&lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;bool&lt;/span&gt; matchCaceres(Persona persona){&lt;span class="kwrd"&gt;return&lt;/span&gt; (persona.Provincia.Equals(&lt;span class="str"&gt;"Cáceres"&lt;/span&gt;));}&lt;br /&gt;&lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;bool&lt;/span&gt; matchCiudadReal(Persona persona){&lt;span class="kwrd"&gt;return&lt;/span&gt; (persona.Provincia.Equals(&lt;span class="str"&gt;"Ciudad Real"&lt;/span&gt;));}&lt;br /&gt;...&lt;br /&gt;&lt;/pre&gt;Esto no es muy práctico.&lt;br /&gt;&lt;br /&gt;Para solucionarlo lo que haremos es construir una clase nueva:&lt;br /&gt;&lt;br /&gt;&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;class&lt;/span&gt; BusquedaPorProvincia&lt;br /&gt;{&lt;br /&gt;&lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; provinciaABuscar;&lt;br /&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; BusquedaPorProvincia(&lt;span class="kwrd"&gt;string&lt;/span&gt; provinciaABuscar){&lt;br /&gt;    &lt;span class="kwrd"&gt;this&lt;/span&gt;.provinciaABuscar = provinciaABuscar;&lt;br /&gt;}&lt;br /&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; Predicate&amp;lt;Persona&amp;gt; getPredicate()&lt;br /&gt;{&lt;br /&gt;    &lt;span class="kwrd"&gt;return&lt;/span&gt; match;&lt;br /&gt;}&lt;br /&gt;&lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;bool&lt;/span&gt; match(Persona persona)&lt;br /&gt;{&lt;br /&gt;    &lt;span class="kwrd"&gt;return&lt;/span&gt; (persona.Provincia.Equals(provinciaABuscar));&lt;br /&gt;}&lt;br /&gt;}&lt;/pre&gt;Y ahora para obtener las personas de una provincia determinada... :&lt;br /&gt;&lt;br /&gt;&lt;pre class="csharpcode"&gt;BusquedaPorProvincia busquedaPorProvincia = &lt;span class="kwrd"&gt;new&lt;/span&gt; BusquedaPorProvincia(&lt;span class="str"&gt;"Navarra"&lt;/span&gt;);&lt;br /&gt;List&amp;lt;Persona&amp;gt; listaPersonasEnNavarra;&lt;br /&gt;listaPersonasEnNavarra = listaPersonas.FindAll(busquedaPorProvincia.getPredicate());&lt;/pre&gt;Esto puede ser aplicado para los métodos Find, FindLast... de la lista genérica.&lt;br /&gt;&lt;br /&gt;Código fuente del ejemplo: &lt;a href="http://vi6xpa.bay.livefilestore.com/y1ps74sjlxnHnjFCUKH04co6jvGLX1YqL8PAvAE31K7rWOsCVE8lPJhmgleWtQFMfcWikbU5x_TkwAbQEeVJHLfwA/Program.cs?download"&gt;Descargar&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Fuente de información: &lt;a href="http://www.codeproject.com/KB/cs/predicates.aspx"&gt;http://www.codeproject.com/KB/cs/predicates.aspx&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Un saludo.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7404007568594605045-5220365704859585878?l=jorgevillabonagarcia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jorgevillabonagarcia.blogspot.com/feeds/5220365704859585878/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7404007568594605045&amp;postID=5220365704859585878' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7404007568594605045/posts/default/5220365704859585878'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7404007568594605045/posts/default/5220365704859585878'/><link rel='alternate' type='text/html' href='http://jorgevillabonagarcia.blogspot.com/2008/08/listas-genricas-net-uso-de.html' title='Listas Genéricas .Net: Uso de FindAll(Predicate&lt;&gt;)'/><author><name>Jorge Villabona García</name><uri>http://www.blogger.com/profile/17217719175201600437</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7404007568594605045.post-3351787400966788570</id><published>2008-07-25T09:23:00.008+02:00</published><updated>2008-12-10T13:54:43.113+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Internet Explorer'/><category scheme='http://www.blogger.com/atom/ns#' term='Firefox'/><title type='text'>Desarrollo del manual de una aplicación Web</title><content type='html'>Seguramente si te dedicas al desarrollo de aplicaciones web, bien como profesional o bien como estudiante, en algún momento habrás tenido la necesidad de realizar un manual. No es una tarea que guste a todo el mundo ya que normalmente hay que invertir mucho tiempo.&lt;br /&gt;&lt;br /&gt;Fireshot (&lt;a href="http://screenshot-program.com/fireshot/"&gt;http://screenshot-program.com/fireshot/&lt;/a&gt;) es add-on de Firefox (luego veremos como integrarlo también en Internet Explorer) que nos va a facilicitar mucho la vida. Con un clic tendremos la captura de la área visible (o de la página completa) y podremos añadir formas y anotaciones explicativas con el formato que más nos guste. Veamos un ejemplo:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_rIQM7VmDycs/SImFZPn0XLI/AAAAAAAAAVw/jw2y_mcDeNc/s1600-h/google.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_rIQM7VmDycs/SImFZPn0XLI/AAAAAAAAAVw/jw2y_mcDeNc/s400/google.png" alt="" id="BLOGGER_PHOTO_ID_5226855511276936370" border="0" /&gt;&lt;/a&gt;&lt;span style="font-weight: bold;"&gt;Instalación para FireFox&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Para integrarlo Fireshot en nuestro FireFox descargaremos el add-on (&lt;a href="https://addons.mozilla.org/en-US/firefox/addon/5648"&gt;https://addons.mozilla.org/en-US/firefox/addon/5648&lt;/a&gt;) y lo instalaremos.&lt;br /&gt;Una vez reiniciado FireFox aparecerá un icono en la parte superior derecha del explorador:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_rIQM7VmDycs/SImG4IChf4I/AAAAAAAAAV4/CRBjXMoj5g0/s1600-h/fireshot-ff.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_rIQM7VmDycs/SImG4IChf4I/AAAAAAAAAV4/CRBjXMoj5g0/s400/fireshot-ff.jpg" alt="" id="BLOGGER_PHOTO_ID_5226857141329035138" border="0" /&gt;&lt;/a&gt;Ya estamos listos para hacer capturas de nuestra aplicación.&lt;br /&gt;&lt;br /&gt;Accederemos a la página de la cual queremos hacer la captura y pulsaremos sobre el icono. Aparecerá una ventana con la captura y las barras de herramientas necesarias para añadir anotaciones.&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;Nota: En el primer uso Fireshot me ha preguntado si quería integrarlo con Internet Explorer y si quería utilizar la versión "Pro" durante 30 días (está versión es de pago, unos 20$ ). En principio he contestado que no ya que ambas tareas se pueden realizar más adelante.  Además para empezar, la versión básica es suficiente.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_rIQM7VmDycs/SImJq8oCh6I/AAAAAAAAAWA/umZcLfxbu6c/s1600-h/fireshot-ff_2.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_rIQM7VmDycs/SImJq8oCh6I/AAAAAAAAAWA/umZcLfxbu6c/s400/fireshot-ff_2.png" alt="" id="BLOGGER_PHOTO_ID_5226860213461747618" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;La versión básica nos ofrece herramientas de selección, dibujo de formas, inserción de textos, líneas e imágenes. Podemos mover, duplicar o recortar una selección. Su uso es muy sencillo y en poco minutos empezaremos a hacer cosas útiles.&lt;br /&gt;&lt;br /&gt;Una vez terminada la edición podremos guardarlo como archivo, dejarlo en el portapapeles o subirlo a internet.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Instalación para Internet Explorer&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;No es nada raro que nos encontremos con una página que no funciona en FireFox o que simplemente no se ve correctamente. No hay problema. Integraremos Fireshot en el explorador de Microsoft.&lt;br /&gt;&lt;br /&gt;En FireFox, pulsaremos sobre la fecha que hay junto al icono de Fireshot&lt;/span&gt;&lt;span&gt;. En el menú seleccionaremos "Intregate into Internet Explorer". Después de unos pasos tendremos también instalado Fireshot en Internet Explorer.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_rIQM7VmDycs/SImLtOkFTWI/AAAAAAAAAWI/6riVHxh4CO4/s1600-h/fireshot-ie.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_rIQM7VmDycs/SImLtOkFTWI/AAAAAAAAAWI/6riVHxh4CO4/s400/fireshot-ie.png" alt="" id="BLOGGER_PHOTO_ID_5226862451659984226" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Ahora sólo queda practicar.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7404007568594605045-3351787400966788570?l=jorgevillabonagarcia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jorgevillabonagarcia.blogspot.com/feeds/3351787400966788570/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7404007568594605045&amp;postID=3351787400966788570' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7404007568594605045/posts/default/3351787400966788570'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7404007568594605045/posts/default/3351787400966788570'/><link rel='alternate' type='text/html' href='http://jorgevillabonagarcia.blogspot.com/2008/07/desarrollo-del-manual-de-una-aplicacin.html' title='Desarrollo del manual de una aplicación Web'/><author><name>Jorge Villabona García</name><uri>http://www.blogger.com/profile/17217719175201600437</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_rIQM7VmDycs/SImFZPn0XLI/AAAAAAAAAVw/jw2y_mcDeNc/s72-c/google.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7404007568594605045.post-5228243408212444728</id><published>2008-07-24T13:15:00.005+02:00</published><updated>2008-12-10T13:54:44.026+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Blogger'/><category scheme='http://www.blogger.com/atom/ns#' term='VB'/><category scheme='http://www.blogger.com/atom/ns#' term='xml'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><category scheme='http://www.blogger.com/atom/ns#' term='ASP.Net'/><category scheme='http://www.blogger.com/atom/ns#' term='html'/><title type='text'>Blogger: Código fuente formateado</title><content type='html'>Cuando se escriben artículos sobre programación es inevitable tener que incluir fragmentos de código. Formatear esos fragmentos ayudan notablemente a su compresión.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: left;"&gt;En este artículo incluyo una forma de incluir código fuente en una entrada de Blogger. La idea se puede aplicar perfectamente a otros tipos de blog.&lt;br /&gt;&lt;br /&gt;Para ello utilizaremos la siguiente página: &lt;a href="http://manoli.net/csharpformat/format.aspx"&gt;http://manoli.net/csharpformat/format.aspx&lt;/a&gt;. Aquí podemos transformar fragmentos de C#, VB, Html, XML, ASP.Net o SQL en su equivalente en xhtml pero coloreado.&lt;br /&gt;&lt;br /&gt;El código HTML generado en esta página utiliza clases para definir el formato por lo que es necesario incluir el código CSS correspondiente en nuestra plantilla de Blogger.&lt;br /&gt;&lt;br /&gt;Para ello,&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Copiamos el siguiente código (si tenemos ganas podemos incluso modificarlo a nuestro gusto)&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;pre class="csharpcode"&gt;&lt;br /&gt;&lt;span class="rem"&gt;&amp;lt;!-- code formatted by http://manoli.net/csharpformat/ --&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;style&lt;/span&gt; &lt;span class="attr"&gt;type&lt;/span&gt;&lt;span class="kwrd"&gt;="text/css"&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;.csharpcode, .csharpcode pre&lt;br /&gt;{&lt;br /&gt;font-size: small;&lt;br /&gt;color: black;&lt;br /&gt;font-family: Consolas, "Courier New", Courier, Monospace;&lt;br /&gt;background-color: #ffffff;&lt;br /&gt;/*white-space: pre;*/&lt;br /&gt;}&lt;br /&gt;.csharpcode pre { margin: 0em; }&lt;br /&gt;.csharpcode .rem { color: #008000; }&lt;br /&gt;.csharpcode .kwrd { color: #0000ff; }&lt;br /&gt;.csharpcode .str { color: #006080; }&lt;br /&gt;.csharpcode .op { color: #0000c0; }&lt;br /&gt;.csharpcode .preproc { color: #cc6633; }&lt;br /&gt;.csharpcode .asp { background-color: #ffff00; }&lt;br /&gt;.csharpcode .html { color: #800000; }&lt;br /&gt;.csharpcode .attr { color: #ff0000; }&lt;br /&gt;.csharpcode .alt&lt;br /&gt;{&lt;br /&gt;background-color: #f4f4f4;&lt;br /&gt;width: 100%;&lt;br /&gt;margin: 0em;&lt;br /&gt;}&lt;br /&gt;.csharpcode .lnum { color: #606060; }&lt;br /&gt;&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;style&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;span style="font-family:Georgia,serif;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;ul&gt;&lt;li&gt;&lt;span class="kwrd"&gt;&lt;span style="font-family:Georgia,serif;"&gt;Accedemos a la página de personalización los elementos de página de nuestro Blogger (pestaña Diseño) y hacemos clic sobre "Añadir un elemento de página"&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;pre class="csharpcode"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_rIQM7VmDycs/SIiv-vMcCwI/AAAAAAAAAVQ/XI4ft9bQ4XY/s1600-h/blogger_diseno.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_rIQM7VmDycs/SIiv-vMcCwI/AAAAAAAAAVQ/XI4ft9bQ4XY/s400/blogger_diseno.png" alt="" id="BLOGGER_PHOTO_ID_5226620859918846722" border="0" /&gt;&lt;/a&gt;&lt;/pre&gt;&lt;ul&gt;&lt;li&gt;En la ventana emergente hacemos clic sobre "Añadir al BLOG" en el elemento "HTML/Javascript"&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;pre class="csharpcode"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_rIQM7VmDycs/SIiwlOSGobI/AAAAAAAAAVY/j0qPipAVOu0/s1600-h/blogger_diseno2.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_rIQM7VmDycs/SIiwlOSGobI/AAAAAAAAAVY/j0qPipAVOu0/s400/blogger_diseno2.png" alt="" id="BLOGGER_PHOTO_ID_5226621521099137458" border="0" /&gt;&lt;/a&gt;&lt;/pre&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Insertamos en "Contenido" el código CSS copiado anteriormente. El título lo dejamos en blanco. Pulsamos sobre "Guardar"&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;Ya  tenemos todo listo para introducir fragmentos de código coloreados en nuestros artículos.&lt;br /&gt;&lt;br /&gt;Iremos a la página anteriormente citada: &lt;a href="http://manoli.net/csharpformat/format.aspx"&gt;http://manoli.net/csharpformat/format.aspx&lt;/a&gt;&lt;br /&gt;En ella introduciremos el código fuente que queramos incluir en nuestro artículo (1), seleccionaremos el lenguaje en el que está escrito (2) y pulsaremos sobre "format my code" (3).&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_rIQM7VmDycs/SIi2YPfvWMI/AAAAAAAAAVg/tTCPP3kuaD4/s1600-h/csharpformat1.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_rIQM7VmDycs/SIi2YPfvWMI/AAAAAAAAAVg/tTCPP3kuaD4/s400/csharpformat1.png" alt="" id="BLOGGER_PHOTO_ID_5226627895156234434" border="0" /&gt;&lt;/a&gt;Pegaremos el código  HTML obtenido en la nuestra entrada de   Blogger (En la pestaña "Edición de HTML").&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_rIQM7VmDycs/SIi2to248jI/AAAAAAAAAVo/R3dJgnHdbJo/s1600-h/csharpformat2.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_rIQM7VmDycs/SIi2to248jI/AAAAAAAAAVo/R3dJgnHdbJo/s400/csharpformat2.png" alt="" id="BLOGGER_PHOTO_ID_5226628262741471794" border="0" /&gt;&lt;/a&gt;Si accedemos a la vista previa veremos el código con un formato diferente pero sin colorear. No hay problema, en la vista final se verá correctamente.&lt;br /&gt;&lt;br /&gt;En el caso del XML usado en el ejemplo este será el resultado:&lt;br /&gt;&lt;br /&gt;&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;&lt;pre class="csharpcode"&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;xml&lt;/span&gt; &lt;span class="attr"&gt;atributo&lt;/span&gt;&lt;span class="kwrd"&gt;="nombre_del_atributo"&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;item&lt;/span&gt; &lt;span class="attr"&gt;nombre&lt;/span&gt;&lt;span class="kwrd"&gt;="nombre_del_item"&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;contenido&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;item&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;xml&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="text-decoration: underline;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="text-decoration: underline;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7404007568594605045-5228243408212444728?l=jorgevillabonagarcia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jorgevillabonagarcia.blogspot.com/feeds/5228243408212444728/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7404007568594605045&amp;postID=5228243408212444728' title='3 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7404007568594605045/posts/default/5228243408212444728'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7404007568594605045/posts/default/5228243408212444728'/><link rel='alternate' type='text/html' href='http://jorgevillabonagarcia.blogspot.com/2008/07/blogger-cdigo-fuente-formateado.html' title='Blogger: Código fuente formateado'/><author><name>Jorge Villabona García</name><uri>http://www.blogger.com/profile/17217719175201600437</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_rIQM7VmDycs/SIiv-vMcCwI/AAAAAAAAAVQ/XI4ft9bQ4XY/s72-c/blogger_diseno.png' height='72' width='72'/><thr:total>3</thr:total></entry></feed>
