<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>sgoliver.net blog &#187; Noticias</title>
	<atom:link href="http://www.sgoliver.net/blog/index.php?feed=rss2&#038;cat=13" rel="self" type="application/rss+xml" />
	<link>http://www.sgoliver.net/blog</link>
	<description>Pensamientos varios sobre programación, Android, .NET y Java</description>
	<lastBuildDate>Thu, 18 Apr 2013 10:03:10 +0000</lastBuildDate>
	<language>es-ES</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.5.1</generator>
		<item>
		<title>Mapas en Android (Google Maps Android API v2) – II</title>
		<link>http://www.sgoliver.net/blog/?p=3271&#038;utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=mapas-en-android-google-maps-android-api-v2-ii</link>
		<comments>http://www.sgoliver.net/blog/?p=3271#comments</comments>
		<pubDate>Sun, 09 Dec 2012 12:47:01 +0000</pubDate>
		<dc:creator>sgoliver</dc:creator>
				<category><![CDATA[Noticias]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[animateCamera]]></category>
		<category><![CDATA[api]]></category>
		<category><![CDATA[CameraPosition]]></category>
		<category><![CDATA[CameraUpdate]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[GoogleMap]]></category>
		<category><![CDATA[LatLng]]></category>
		<category><![CDATA[mapas]]></category>
		<category><![CDATA[MapFragment]]></category>
		<category><![CDATA[maps]]></category>
		<category><![CDATA[moveCamera]]></category>
		<category><![CDATA[v2]]></category>

		<guid isPermaLink="false">http://www.sgoliver.net/blog/?p=3271</guid>
		<description><![CDATA[En el artículo anterior del curso vimos cómo realizar todos los preparativos necesarios para comenzar a utilizar la nueva versión de Google Maps para Android (Google Maps Android API v2): descargar las librerías necesarias, obtener la API Key y configurar un nuevo proyecto en Eclipse. En esta segunda entrega vamos a hacer un repaso de las opciones [...]]]></description>
				<content:encoded><![CDATA[<p>En el <a title="Google Maps Android API v2 - Preparativos" href="http://www.sgoliver.net/blog/?p=3244">artículo anterior</a> del <a title="Curso de Programación Android" href="http://www.sgoliver.net/blog/?page_id=2935">curso</a> vimos cómo realizar todos los preparativos necesarios para comenzar a utilizar la nueva versión de Google Maps para Android (<a title="Web oficial Google Maps Android API v2" href="https://developers.google.com/maps/documentation/android/"><em>Google Maps Android API v2</em></a>): descargar las librerías necesarias, obtener la <em>API Key</em> y configurar un nuevo proyecto en Eclipse.</p>
<p>En esta segunda entrega vamos a hacer un repaso de las opciones básicas de los nuevos mapas:  elegir el tipo de mapa a mostrar, movernos por él de forma programática, y obtener los datos de la posición actual. Como aplicación de ejemplo (que podéis descargar al final de este artículo), tomaremos como base la ya creada en el artículo anterior, a la que añadiremos varias opciones de menú para demostrar el funcionamiento de algunas funciones del mapa.</p>
<p>Si hacemos un poco de memoria, recordaremos cómo en la antigua versión de la API de Google Maps era bastante poco homogéneo el acceso y modificación de determinados datos del mapa. Por ejemplo, la consulta de la posición actual o la configuración del tipo de mapa se hacían directamente sobre el control <span style="font-family: 'courier new', courier;">MapView</span>, mientras que la manipulación de la posición y el zoom se hacían a través del <em>controlador</em> asociado al mapa (<span style="font-family: 'courier new', courier;">MapController</span>). Además, el tratamiento de las coordenadas y las unidades utilizadas eran algo peculiares, teniendo estar continuamente convirtiendo de grados a microgrados y de estos a objetos <span style="font-family: 'courier new', courier;">GeoPoint</span>, etc.</p>
<p>Con la nueva API, todas las operaciones se realizarán directamente sobre un objeto <span style="font-family: 'courier new', courier;">GoogleMap</span>, el componente base de la API. Accederemos a este componente llamando al método <span style="font-family: 'courier new', courier;">getMap()</span> del fragmento <span style="font-family: 'courier new', courier;">MapFragment</span> que contenga nuestro mapa. Podríamos hacerlo de la siguiente forma:</p>
<pre class="brush: java; title: ; notranslate">
import com.google.android.gms.maps.GoogleMap;
...
GoogleMap mapa = ((SupportMapFragment) getSupportFragmentManager()
                          .findFragmentById(R.id.map)).getMap();
</pre>
<p>Una vez obtenida esta referencia a nuestro objeto <span style="font-family: 'courier new', courier;">GoogleMap</span> podremos realizar sobre él la mayoría de las acciones básicas del mapa.</p>
<p>Así, por ejemplo, para modificar el tipo de mapa mostrado podremos utilizar una llamada a su método <span style="font-family: 'courier new', courier;">setMapType()</span>, pasando como parámetro el tipo de mapa:</p>
<ul>
<li><span style="font-family: 'courier new', courier;">MAP_TYPE_NORMAL</span></li>
<li><span style="font-family: 'courier new', courier;">MAP_TYPE_HYBRID</span></li>
<li><span style="font-family: 'courier new', courier;">MAP_TYPE_SATELLITE</span></li>
<li><span style="font-family: 'courier new', courier;">MAP_TYPE_TERRAIN</span></li>
</ul>
<p>Para nuestro ejemplo voy a utilizar una variable que almacene el tipo de mapa actual (del 0 al 3) y habilitaremos una opción de menú para ir alternando entre las distintas opciones. Quedaría de la siguiente forma:</p>
<pre class="brush: java; title: ; notranslate">
private void alternarVista()
{
	vista = (vista + 1) % 4;

	switch(vista)
	{
		case 0:
			mapa.setMapType(GoogleMap.MAP_TYPE_NORMAL);
			break;
		case 1:
			mapa.setMapType(GoogleMap.MAP_TYPE_HYBRID);
			break;
		case 2:
			mapa.setMapType(GoogleMap.MAP_TYPE_SATELLITE);
			break;
		case 3:
			mapa.setMapType(GoogleMap.MAP_TYPE_TERRAIN);
			break;
	}
}
</pre>
<p>En cuanto al movimiento sobre el mapa, con esta nueva versión de la API vamos a tener mucha más libertad que con la anterior versión, ya que podremos mover libremente nuestro punto de vista (o cámara, como lo han llamado los chicos de Android) por un espacio 3D. De esta forma, ya no sólo podremos hablar de latitud-longitud (<em>target</em>) y zoom, sino también de orientación (<em>bearing</em>) y ángulo de visión (<em>tilt</em>). La manipulación de los 2 últimos parámetros unida a posibilidad actual de ver edificios en 3D de muchas ciudades nos abren un mundo de posibilidades.</p>
<p>El movimiento de la cámara se va a realizar siempre mediante la construcción de un objeto <span style="font-family: 'courier new', courier;">CameraUpdate</span> con los parámetros necesarios. Para los movimientos más básicos como la actualización de la latitud y longitud o el nivel de zoom podremos utilizar la clase <span style="font-family: 'courier new', courier;">CameraUpdateFactory</span> y sus métodos estáticos que nos facilitará un poco el trabajo.</p>
<p>Así por ejemplo, para cambiar sólo el nivel de zoom podremos utilizar los siguientes métodos para crear nuestro <span style="font-family: 'courier new', courier;">CameraUpdate</span>:</p>
<ul>
<li><span style="font-family: 'courier new', courier;">CameraUpdateFactory.zoomIn()</span>. Aumenta en 1 el nivel de zoom.</li>
<li><span style="font-family: 'courier new', courier;">CameraUpdateFactory.zoomOut()</span>. Disminuye en 1 el nivel de zoom.</li>
<li><span style="font-family: 'courier new', courier;">CameraUpdateFactory.zoomTo(nivel_de_zoom)</span>. Establece el nivel de zoom.</li>
</ul>
<p>Por su parte, para actualizar sólo la latitud-longitud de la cámara podremos utilizar:</p>
<ul>
<li><span style="font-family: 'courier new', courier;">CameraUpdateFactory.newLatLng(lat, long)</span>. Establece la lat-lng expresadas en grados.</li>
</ul>
<p>Si queremos modificar los dos parámetros anteriores de forma conjunta, también tendremos disponible el método siguiente:</p>
<ul>
<li><span style="font-family: 'courier new', courier;">CameraUpdateFactory.newLatLngZoom(lat, long, zoom)</span>. Establece la lat-lng y el zoom.</li>
</ul>
<p>Para movernos lateralmente por el mapa (<em>panning</em>) podríamos utilizar los métodos de scroll:</p>
<ul>
<li><span style="font-family: 'courier new', courier;">CameraUpdateFactory.scrollBy(scrollHorizontal, scrollVertical)</span>. Scroll expresado en píxeles.</li>
</ul>
<p>Tras construir el objeto <span style="font-family: 'courier new', courier;">CameraUpdate</span> con los parámetros de posición tendremos que llamar a los métodos <span style="font-family: 'courier new', courier;">moveCamera()</span> o <span style="font-family: 'courier new', courier;">animateCamera()</span> de nuestro objeto <span style="font-family: 'courier new', courier;">GoogleMap</span>, dependiendo de si queremos que la actualización de la vista se muestre directamente o de forma animada.</p>
<p>Con esto en cuenta, si quisiéramos por ejemplo centrar la vista en España con un zoom de 5 podríamos hacer lo siguiente:</p>
<pre class="brush: java; title: ; notranslate">
CameraUpdate camUpd1 =
	CameraUpdateFactory.newLatLng(new LatLng(40.41, -3.69));

mapa.moveCamera(camUpd1);
</pre>
<p>Además de los movimientos básicos que hemos comentado, si queremos modificar los demás parámetros de la cámara o varios de ellos simultaneamente tendremos disponible el método más general <span style="font-family: 'courier new', courier;">CameraUpdateFactory.newCameraPosition()</span> que recibe como parámetro un objeto de tipo <span style="font-family: 'courier new', courier;">CameraPosition</span>. Este objeto los construiremos indicando todos los parámetros de la posición de la cámara a través de su método <span style="font-family: 'courier new', courier;">Builder()</span> de la siguiente forma:</p>
<pre class="brush: java; title: ; notranslate">
LatLng madrid = new LatLng(40.417325, -3.683081);
CameraPosition camPos = new CameraPosition.Builder()
	    .target(madrid)   //Centramos el mapa en Madrid
	    .zoom(19)         //Establecemos el zoom en 19
	    .bearing(45)      //Establecemos la orientación con el noreste arriba
	    .tilt(70)         //Bajamos el punto de vista de la cámara 70 grados
	    .build();

CameraUpdate camUpd3 =
	CameraUpdateFactory.newCameraPosition(camPos);

mapa.animateCamera(camUpd3);
</pre>
<p>Como podemos comprobar, mediante este mecanismo podemos modificar todos los parámetros de posición de la cámara (o sólo algunos de ellos) al mismo tiempo. En nuestro caso de ejemplo hemos centrado la vista del mapa sobre el parque de El Retiro de Madrid, con un nivel de zoom de 19, una orientación de 45 grados para que el noreste esté hacia arriba y un ángulo de visión de 70 grados de forma que veamos en 3D el monumento a Alfonso XII en la vista de mapa NORMAL. En la siguiente imagen vemos el resultado:</p>
<p><a href="http://www.sgoliver.net/blog/wp-content/uploads/2012/12/captura-cameraposition.png"><img class="alignnone size-medium wp-image-3276" title="captura-cameraposition" alt="captura-cameraposition" src="http://www.sgoliver.net/blog/wp-content/uploads/2012/12/captura-cameraposition-180x300.png" width="180" height="300" /></a></p>
<p>Como podéis ver, en esta nueva versión de la API se facilita bastante el posicionamiento dentro del mapa, y el uso de las clases <span style="font-family: 'courier new', courier;">CameraUpdate</span> y <span style="font-family: 'courier new', courier;">CameraPosition</span> resulta bastante intuitivo.</p>
<p>Bien, pues ya hemos hablado de cómo modificar nuestro punto de vista sobre el mapa, pero si el usuario se mueve de forma manual por él, ¿cómo podemos conocer en un momento dado la posición de la cámara?</p>
<p>Pues igual de fácil, mediante el método <span style="font-family: 'courier new', courier;">getCameraPosition()</span>, que nos devuelve un objeto <span style="font-family: 'courier new', courier;">CameraPosition</span> como el que ya conocíamos. Accediendo a los distintos métodos y propiedades de este objeto podemos conocer con exactitud la posición de la cámara, la orientación y el nivel de zoom.</p>
<pre class="brush: java; title: ; notranslate">
CameraPosition camPos = mapa.getCameraPosition();

LatLng coordenadas = camPos.target;
double latitud = coordenadas.latitude;
double longitud = coordenadas.longitude;

float zoom = camPos.zoom;
float orientacion = camPos.bearing;
float angulo = camPos.titl;
</pre>
<p>En nuestra aplicación de ejemplo, que podéis descargar al final del artículo, he añadido una nueva opción de menú que muestra en un mensaje <em>toast</em> la latitud y longitud actual de la vista de mapa.</p>
<p><a href="http://www.sgoliver.net/blog/wp-content/uploads/2012/12/captura-posicion.png"><img class="alignnone size-medium wp-image-3277" title="captura-posicion" alt="captura-posicion" src="http://www.sgoliver.net/blog/wp-content/uploads/2012/12/captura-posicion-180x300.png" width="180" height="300" /></a></p>
<p>Y con esto habríamos terminado de describir las acciones básicas de configuración y movimiento sobre el mapa. En los próximos artículos veremos más opciones, como la forma de añadir marcadores o dibujar sobre el mapa.</p>
<p>Puedes consultar y/o descargar el código completo de los ejemplos desarrollados en este artículo accediendo a la pagina del <a title="Mapas Android API v2 - Android en GitHub" href="https://github.com/sgolivernet/curso-android-src/tree/master/android-mapas-api2-p2" target="_blank">curso en GitHub</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.sgoliver.net/blog/?feed=rss2&#038;p=3271</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Cuenta atrás para la segunda parte del curso&#8230;</title>
		<link>http://www.sgoliver.net/blog/?p=2214&#038;utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=cuenta-atras-para-la-segunda-parte-del-curso</link>
		<comments>http://www.sgoliver.net/blog/?p=2214#comments</comments>
		<pubDate>Mon, 07 Nov 2011 13:35:00 +0000</pubDate>
		<dc:creator>sgoliver</dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[Noticias]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[curso]]></category>
		<category><![CDATA[documento]]></category>
		<category><![CDATA[manual]]></category>
		<category><![CDATA[pdf]]></category>
		<category><![CDATA[segunda parte]]></category>

		<guid isPermaLink="false">http://www.sgoliver.net/blog/?p=2214</guid>
		<description><![CDATA[Finalmente, y aunque en un principio tenía previsto un artículo adicional sobre geolocalización, doy por finalizada la segunda parte del Curso de Programación Android. El motivo no es otro que el tema que pensaba tratar (geolocalización inversa) no va muy fino en determinadas versiones del SDK y emulador de Android, y no me gustaría incluir [...]]]></description>
				<content:encoded><![CDATA[<p>Finalmente, y aunque en un principio tenía previsto un artículo adicional sobre geolocalización, doy por finalizada la segunda parte del <a title="Curso Programación Android" href="http://www.sgoliver.net/blog/?p=1313"><strong>Curso de Programación Android</strong></a>. El motivo no es otro que el tema que pensaba tratar (geolocalización inversa) no va muy fino en determinadas versiones del SDK y emulador de Android, y no me gustaría incluir en el documento ningún tema que no pueda ser probado por todos fácilmente. De cualquier forma, prometo para más adelante un artículo en el blog que cubra este tema. Son por tanto los artículos que aparecen a día de hoy (11/11/2011) en el <a title="Curso de Programación Android" href="http://www.sgoliver.net/blog/?p=1313">índice del curso</a> los que formarán parte del nuevo documento.</p>
<p>Comienza entonces la cuenta atrás para publicar la segunda parte del curso en formato PDF. Aunque pensaba publicar este segundo volumen como un documento independiente, suplementario al que ya había publicado, finalmente he decidido aunar todo el contenido en un solo documento. Aprovechando esta segunda recopilación he remaquetado todo el contenido para intentar dar al curso una forma mucho más homogénea y parecida a un libro técnico, y así alejarlo un poco de la simple recopilación de artículos que suponía la primera parte publicada. Adicionalmente, he modificado un poco el aspecto visual, he corregido algunas erratas que me habéis ido comunicando, y he sustituido todas las imágenes por su versión a tamaño completo para mejorar su visualización y facilitar la lectura. Espero que todos estos cambios hagan de este documento un recurso de más valor para todos.</p>
<p>El sistema de donaciones para su adquisición se mantiene a través de PayPal, siento no haber podido habilitar finalmente el mecanismo de transferencia bancaria. La donación mínima pasará a ser de <strong>1,50 euros</strong>. Espero entendáis y disculpéis este pequeño incremento, pero el libro tiene muchísimo trabajo detrás y creo sinceramente que os merecerá la pena disponer de esta versión completa y revisada del curso, en vez de contar con dos documentos independientes.</p>
<p>Estoy en pleno proceso de revisión del documento, en unos días publicaré un fragmento de muestra para que podáis comprobar su nuevo aspecto, y en algo menos de 2 semanas estará disponible el documento final.</p>
<p>En definitiva, siento la larga espera para ver publicada esta segunda parte del curso, pero espero que el resultado final compense toda vuestra paciencia.</p>
<p>Saludos.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.sgoliver.net/blog/?feed=rss2&#038;p=2214</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>Novedades del nuevo foro</title>
		<link>http://www.sgoliver.net/blog/?p=2218&#038;utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=novedades-del-nuevo-foro</link>
		<comments>http://www.sgoliver.net/blog/?p=2218#comments</comments>
		<pubDate>Thu, 03 Nov 2011 17:12:08 +0000</pubDate>
		<dc:creator>sgoliver</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[Noticias]]></category>
		<category><![CDATA[Recursos]]></category>
		<category><![CDATA[foro]]></category>
		<category><![CDATA[novedades]]></category>
		<category><![CDATA[tapatalk]]></category>
		<category><![CDATA[web]]></category>

		<guid isPermaLink="false">http://www.sgoliver.net/blog/?p=2218</guid>
		<description><![CDATA[Para celebrar que hemos traspasado la asombrosa barrera de los 25 usuarios :) os informo de algunas novedades del nuevo foro. En primer lugar, como ya habréis notados, he creado tres secciones nuevas: Presentaciones. Para presentarte a la comunidad. Off-topic. Para hablar de cualquier cosa que no quepa en el resto de categorías. Tutoriales de [...]]]></description>
				<content:encoded><![CDATA[<p>Para celebrar que hemos traspasado la asombrosa barrera de los 25 usuarios :) os informo de algunas novedades del nuevo foro.</p>
<p>En primer lugar, como ya habréis notados, he creado tres secciones nuevas:</p>
<ul>
<li><strong>Presentaciones</strong>. Para presentarte a la comunidad.</li>
<li><strong>Off-topic</strong>. Para hablar de cualquier cosa que no quepa en el resto de categorías.</li>
<li><strong>Tutoriales de la Comunidad</strong>. Para que podáis colaborar escribiendo vuestros propios tutoriales y trucos sobre desarrollo en Android.</li>
</ul>
<p>El último punto me parece muy interesante porque os permite participar en la web de una forma que hasta ahora no se podía: creando vuestros propios contenidos. Ya sabéis, si queréis escribir algún pequeño tutorial, conocéis algún truco interesante, o simplemente queréis dar unas indicaciones de cómo realizar alguna tarea de desarrollo, éste es vuestro foro.</p>
<p>En segundo lugar una novedad que puede interesar a algunos lectores del blog. Dado que estamos tratando temas de Android y que la mayoría somos usuarios de este tipo de moviles/tablets, no podía faltarnos algún mecanismo para poder acceder al foro desde nuestros dispositivos de una forma algo más cómoda que a través del explorador. Para ello, he habilitado el acceso a través de <a title="Android Market - Tapatalk" href="https://market.android.com/details?id=com.quoord.tapatalkpro.activity&amp;hl=es" target="_blank">Tapatalk</a> (enlace al market), la aplicación de Android más popular para leer y participar en foros. Es una aplicación de pago (2.99 euros) y creo que no existe versión de prueba gratuita, pero al menos por mi experiencia os puedo decir que funciona bastante bien (probado en HTC Desire con Android 2.2) y hace lo que promete. En fin, otra forma más de acceder al foro, para quien pueda interesar.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.sgoliver.net/blog/?feed=rss2&#038;p=2218</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Mi blog desde dispositivos móviles</title>
		<link>http://www.sgoliver.net/blog/?p=1774&#038;utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=mi-blog-desde-dispositivos-moviles</link>
		<comments>http://www.sgoliver.net/blog/?p=1774#comments</comments>
		<pubDate>Mon, 21 Mar 2011 15:26:42 +0000</pubDate>
		<dc:creator>sgoliver</dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[General]]></category>
		<category><![CDATA[Noticias]]></category>
		<category><![CDATA[blog]]></category>
		<category><![CDATA[movil]]></category>
		<category><![CDATA[tema]]></category>
		<category><![CDATA[wordpress]]></category>

		<guid isPermaLink="false">http://www.sgoliver.net/blog/?p=1774</guid>
		<description><![CDATA[Aunque mucho he hablado ya sobre la plataforma Android, aún no tenía activado ningún tema visual en el blog para dispositivos móviles, lo que hacía algo complicado su lectura desde este tipo de dispositivos. Sin embargo, desde hoy mismo, si accedes al blog desde tu movil te encontrarás con un nuevo tema visual que espero [...]]]></description>
				<content:encoded><![CDATA[<p>Aunque mucho he hablado ya sobre la plataforma Android, aún no tenía activado ningún tema visual en el blog para dispositivos móviles, lo que hacía algo complicado su lectura desde este tipo de dispositivos.</p>
<p>Sin embargo, desde hoy mismo, si accedes al blog desde tu movil te encontrarás con un nuevo tema visual que espero facilite enormemente la lectura de su contenido.</p>
<p>Si encontráis algún error o no podéis acceder correctamente a la información rogaría que me avisárais para poder corregirlo lo antes posible.</p>
<p>Muchas gracias.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.sgoliver.net/blog/?feed=rss2&#038;p=1774</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Neutralidad en la Red</title>
		<link>http://www.sgoliver.net/blog/?p=1498&#038;utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=neutralidad-en-la-red</link>
		<comments>http://www.sgoliver.net/blog/?p=1498#comments</comments>
		<pubDate>Tue, 23 Nov 2010 09:16:10 +0000</pubDate>
		<dc:creator>sgoliver</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[Noticias]]></category>
		<category><![CDATA[neutralidad en la red]]></category>

		<guid isPermaLink="false">http://www.sgoliver.net/blog/?p=1498</guid>
		<description><![CDATA[A mí también me apetecía escribir sobre el tema de la Neutralidad en la Red, pero me parece que el resumen que han hecho en Blogoff es más que interesante y completo. Os dejo un enlace al artículo. Sin duda se avecinan malos tiempos para internet. Una verdadera pena&#8230; y una nueva mala noticia para [...]]]></description>
				<content:encoded><![CDATA[<p>A mí también me apetecía escribir sobre el tema de la <strong>Neutralidad en la Red</strong>, pero me parece que el resumen que han hecho en Blogoff es más que interesante y completo. Os dejo un <a title="Artículo Nutralidad en la Red" href="http://www.blogoff.es/2010/11/22/enmienda-que-algo-queda/" target="_blank">enlace al artículo</a>.</p>
<p>Sin duda se avecinan malos tiempos para internet. Una verdadera pena&#8230; y una nueva mala noticia para este pais que va de mal en peor, para este pais que en vez de invertir esfuerzos en mantener las puertas lo más abiertas posible al conocimiento y al desarrollo de las personas, algo completamente necesario para salir del pozo, se empeñan en dar cada día un nuevo paso atrás. Y esto no es culpa del PSOE ni del PP, sino de la ignorancia de muchos supuestos gurús y de los intereses incorrectos para estos tiempos que corren.</p>
<p>Así nos va&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.sgoliver.net/blog/?feed=rss2&#038;p=1498</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Liberados Mono 2.6 y MonoDevelop 2.2</title>
		<link>http://www.sgoliver.net/blog/?p=1200&#038;utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=liberados-mono-2-6-y-monodevelop-2-2</link>
		<comments>http://www.sgoliver.net/blog/?p=1200#comments</comments>
		<pubDate>Tue, 15 Dec 2009 22:40:27 +0000</pubDate>
		<dc:creator>sgoliver</dc:creator>
				<category><![CDATA[Noticias]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[.NET]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Mac OS]]></category>
		<category><![CDATA[Mono]]></category>
		<category><![CDATA[MonoDevelop]]></category>

		<guid isPermaLink="false">http://www.sgoliver.net/blog/?p=1200</guid>
		<description><![CDATA[Nueve meses después de la aparición de las anteriores versiones hoy se estrenan Mono 2.6 y MonoDevelop 2.2, herramientas clave para el desarrollo de aplicaciones .NET sobre Linux y Mac OS (además de Windows, por supuesto). Entre las novedades más destacadas de la plataforma Mono 2.6 se encuentran la implementación de WCF, el soporte para [...]]]></description>
				<content:encoded><![CDATA[<p>Nueve meses después de la aparición de las anteriores versiones hoy se estrenan <a title="Mono" href="http://mono-project.com/" target="_blank">Mono</a> 2.6 y <a title="MonoDevelop" href="http://monodevelop.com/" target="_blank">MonoDevelop</a> 2.2, herramientas clave para el desarrollo de aplicaciones .NET sobre Linux y Mac OS (además de Windows, por supuesto).</p>
<p>Entre las <a title="Novedades Mono 2.6" href="http://www.mono-project.com/Release_Notes_Mono_2.6" target="_blank">novedades más destacadas de la plataforma Mono 2.6</a> se encuentran la implementación de WCF, el soporte para LINQ to SQL, el nuevo Soft Debugger, la integración de los frameworks ASP.NET MVC, ASP.NET AJAX y Microsoft Dynamic Language Runtime, y la inclusión preliminar de algunas características de C# 4.0 como los parámetros con nombre y los parámetros opcionales.</p>
<p><a title="Novedades MonoDevelop 2.2" href="http://monodevelop.com/Download/What%27s_new_in_MonoDevelop_2.2" target="_blank">MonoDevelop 2.2 también se presenta con muchas novedades</a>, entre las que destacan el soporte oficial para Windows y Mac OS, el soporte para múltiples runtimes .NET (multi-targeting), las muchas novedades en cuanto a edición de código (plantillas de código, formateo y generación de código, selección de bloques, &#8230;), la enorme ampliación de las opciones de refactorización, y las extensiones para el desarrollo con ASP.NET MVC, Moonlight, IPhone (MonoTouch) y Python.</p>
<p>En definitiva, una buena noticia para el mundo del desarrollo bajo la plataforma .NET en cualquier sistema operativo.</p>
<p>Os animo a probar estas herramientas.</p>
<div id="_mcePaste" style="overflow: hidden; position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px;">http://www.mono-project.com/Release_Notes_Mono_2.6</div>
]]></content:encoded>
			<wfw:commentRss>http://www.sgoliver.net/blog/?feed=rss2&#038;p=1200</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Google prueba un nuevo algoritmo de búsqueda</title>
		<link>http://www.sgoliver.net/blog/?p=1055&#038;utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=google-prueba-un-nuevo-algoritmo-de-busqueda</link>
		<comments>http://www.sgoliver.net/blog/?p=1055#comments</comments>
		<pubDate>Tue, 11 Aug 2009 07:32:28 +0000</pubDate>
		<dc:creator>sgoliver</dc:creator>
				<category><![CDATA[Noticias]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[infraestructura]]></category>
		<category><![CDATA[nueva]]></category>

		<guid isPermaLink="false">http://www.sgoliver.net/blog/?p=1055</guid>
		<description><![CDATA[Y no sólo su algoritmo de búsqueda, sino toda la infraestructura sobre la que se apoya su buscador, en busca de mejoras considerables en cuanto a su velocidad de indexado y precisión de los resultados, entre otros muchos aspectos. Todo nos lo cuentan en este noticia. Y para que probemos las novedades han habilitado un [...]]]></description>
				<content:encoded><![CDATA[<p>Y no sólo su algoritmo de búsqueda, sino toda la infraestructura sobre la que se apoya su buscador, en busca de mejoras considerables en cuanto a su velocidad de indexado y precisión de los resultados, entre otros muchos aspectos. Todo nos lo cuentan en <a title="Google Next-Generation Infrastructure" href="http://googlewebmastercentral.blogspot.com/2009/08/help-test-some-next-generation.html" target="_blank">este noticia</a>.</p>
<p>Y para que probemos las novedades han habilitado un enlace independiente al tradicional: <a href="http://www2.sandbox.google.com/">http://www2.sandbox.google.com/</a></p>
<p>Tal como nos cuentan, un usuario de a pié como somos la mayoría no debería notar grandes diferencias al realizar una búsqueda con este nuevo motor, a excepción de algunas diferencias en el orden de los resultados que nos instan a que les comuniquemos a través de los mecanismos de <em>feedback </em>que proporcionan en la nueva web.</p>
<p>Y ahora una reflexión, ¿no os parece un tanto arriesgada esta maniobra? Está claro que la mejora continua y la innovación deben llegar por caminos de este tipo, pero parece extraño que un <em>producto </em>consolidado a un nivel tan alto como el buscador web de Google intente <em>cambiar </em>a estas alturas.</p>
<p>Los conspiranoicos ya hablan de la presión que está ejerciendo el renovado buscador de Microsoft <a title="Bing.com" href="http://www.bing.com/" target="_blank">Bing</a> y la reciente noticia de que <a title="Yahoo + Bing" href="http://ciberadictos.net/web/microsoft-confirma-acuerdo-con-yahoo-bing-a-ocuparse-de-yahoo-search/" target="_blank">Yahoo lo utilizará</a> también como su motor de búsqueda. Aunque Matt Cutts, uno de los grandes de Google, <a title="Noticia Matt Cutts" href="http://www.mattcutts.com/blog/caffeine-update/" target="_blank">intenta dejar claro</a> que la competencia nada tiene que ver con este tema:</p>
<blockquote><p><em>Q: Is this Caffeine Update because of Company X or Y is doing Z?</em></p>
<p><em>A: Nope. I love competition in search and want lots of it, but this change has been in the works for months. I think the best way for Google to do well in search is to continue what we’ve done for the last decade or so: focus relentlessly on pushing our search quality forward. Nobody cares more about search than Google, and I don’t think we’ll ever stop trying to improve.</em></p></blockquote>
<p>En fin, veremos como acaba este experimento, y sobre todo esperemos que Google no mate a la gallina de los huevos de oro que tantos éxitos le ha dado en los últimos años. Y no por Google, sino por el bien de los usuarios y de las búsquedas en internet.<em><br />
</em></p>
]]></content:encoded>
			<wfw:commentRss>http://www.sgoliver.net/blog/?feed=rss2&#038;p=1055</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>[lang_es]Publicado NRtfTree 0.3 Final[/lang_es][lang_en]NRtfTree 0.3 Final released[/lang_en]</title>
		<link>http://www.sgoliver.net/blog/?p=976&#038;utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=publicado-nrtftree-0-3-final</link>
		<comments>http://www.sgoliver.net/blog/?p=976#comments</comments>
		<pubDate>Wed, 05 Aug 2009 17:37:29 +0000</pubDate>
		<dc:creator>sgoliver</dc:creator>
				<category><![CDATA[Noticias]]></category>
		<category><![CDATA[Proyectos]]></category>
		<category><![CDATA[new]]></category>
		<category><![CDATA[NRtfTree]]></category>
		<category><![CDATA[nueva]]></category>
		<category><![CDATA[version]]></category>

		<guid isPermaLink="false">http://www.sgoliver.net/blog/?p=976</guid>
		<description><![CDATA[[lang_es] Tres semanas después de la publicación de la última beta, y tras corregir algunos errores y terminar de pulir algunos detalles de la implementación, hoy publicamos por fin la versión final de la librería NRtfTree 0.3. Además de los cambios ya comentados en la entrada anterior, en esta versión final se incluyen las siguientes [...]]]></description>
				<content:encoded><![CDATA[<p>[lang_es]</p>
<p>Tres semanas después de la publicación de la última beta, y tras corregir algunos errores y terminar de pulir algunos detalles de la implementación, hoy publicamos por fin la versión final de la librería <a title="Librería NRtfTree" href="http://www.sgoliver.net/blog/?page_id=57" target="_self">NRtfTree 0.3</a>.</p>
<p>Además de los cambios ya comentados en la <a title="Hacia la versión final de NRtfTree 0.3.0" href="http://www.sgoliver.net/blog/?p=969" target="_self">entrada anterior</a>, en esta versión final se incluyen las siguientes actualizaciones:</p>
<ul>
<li>Se ha eliminado un fragmento de código redundante en la clase <span style="font-family: courier new,courier;">RtfLex </span>que debe ayudar a <a title="Rendimiento NRtfTree 0.3" href="http://www.sgoliver.net/blog/?p=825" target="_self">mejorar aún más el rendimiento</a> de la librería al cargar un documento RTF.</li>
<li>Se ha corregido un error en las propiedades <span style="font-family: courier new,courier;">ScaleX </span>y <span style="font-family: courier new,courier;">ScaleY </span>de la clase <span style="font-family: courier new,courier;">ImageNode </span>que hacía que los valores devueltos no fueran correctos.</li>
<li>La propiedad <span style="font-family: courier new,courier;">Rtf </span>de la clase <span style="font-family: courier new,courier;">RtfTreeNode </span>insertaba bajo ciertas circunstancias espacios en blanco incorrectos cuando la propiedad <span style="font-family: courier new,courier;">MergeSpecialCharacters </span>se encontraba activada.</li>
<li>Se han sustituido los diferentes proyectos de ejemplo por sólo uno en modo consola llamado <span style="font-family: courier new,courier;">SimpleDemo</span>.</li>
<li>Se modifica el <a title="Nuevo formato versiones NRtfTree" href="http://www.sgoliver.net/blog/?p=980" target="_self">formato de los números de versión</a> de la librería a &#8220;major.minor.build.revision&#8221;.</li>
<li>Se incluye un nuevo proyecto de test (utilizando <a title="Web Oficial NUnit" href="http://www.nunit.org/index.php" target="_blank">NUnit</a>) con <a title="Pruebas Automatizadas NRtfTree" href="http://www.sgoliver.net/blog/?p=988" target="_self">pruebas automatizadas de la librería</a>.</li>
</ul>
<p>Para más infomación sobre los cambios introducidos por las últimas versiones de NRtfTree se puede consultar el <a title="Historial de versiones de NRtfTree" href="http://www.sgoliver.net/blog/?page_id=811" target="_self">historial de versiones</a> del proyecto.</p>
<p>Para descargar la librería puedes acceder la la página de <a title="Descargar NRtfTree" href="http://www.sgoliver.net/blog/?page_id=81" target="_self">descargas de NRtfTree</a>.</p>
<p>[/lang_es]</p>
<p>[lang_en]</p>
<p>Three weeks ago we released the second beta of <a title="NRtfTree Library" href="http://www.sgoliver.net/blog/?page_id=57&amp;lang_view=en" target="_self">NRtfTree 0.3</a>. Since then, we have fixed some bugs you reported and we have been preparing the final release of the library. Today we release <strong>NRtfTree 0.3 Final</strong> with the following changes since last beta:</p>
<ul>
<li>Added a new test project (NUnit).</li>
<li>Version numbering scheme updated to “major.minor.build.revision”.</li>
<li>SimpleDemo project updated to console application.</li>
<li>Removed redundant code in RtfLex.</li>
<li>ImageNode ScaleX and ScaleY properties returned incorrect values.</li>
<li>RtfTreeNode.Rtf property inserted incorrect blank spaces when MergeSpecialCharacters property is true.</li>
<li>RtfTree.Text property returned non-document-text characters in images, objects and field nodes.</li>
<li>New method RtfTreeNode.SelectSingleChildGroup().</li>
</ul>
<p>You can get complete information about NRtfTree versions in <a title="NRtfTree ChangeLog" href="http://www.sgoliver.net/blog/?page_id=811&amp;lang_view=en" target="_self">NRtfTree Changelog</a>.</p>
<p><a title="Download NRtfTree" href="http://www.sgoliver.net/blog/?page_id=81" target="_self">Download</a> NRtfTree 0.3 now!</p>
<p>[/lang_en]</p>
]]></content:encoded>
			<wfw:commentRss>http://www.sgoliver.net/blog/?feed=rss2&#038;p=976</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>[lang_es]Publicado NRtfTree 0.3.0 beta 2[/lang_es][lang_en]NRtfTree 0.3.0 beta 2 released[/lang_en]</title>
		<link>http://www.sgoliver.net/blog/?p=954&#038;utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=publicado-nrtftree-0-3-0-beta-2</link>
		<comments>http://www.sgoliver.net/blog/?p=954#comments</comments>
		<pubDate>Sun, 12 Jul 2009 14:35:11 +0000</pubDate>
		<dc:creator>sgoliver</dc:creator>
				<category><![CDATA[Noticias]]></category>
		<category><![CDATA[Proyectos]]></category>
		<category><![CDATA[new]]></category>
		<category><![CDATA[NRtfTree]]></category>
		<category><![CDATA[nueva]]></category>
		<category><![CDATA[version]]></category>

		<guid isPermaLink="false">http://www.sgoliver.net/blog/?p=954</guid>
		<description><![CDATA[[lang_es] Un poco antes de lo esperado, acabo de publicar la segunda beta de NRtfTree 0.3.0. Espero cumplir con esto las expectativas de todos los que habéis pedido insistentemente la actualización de la librería. Para conocer las novedades que trae esta nueva versión os remito a la entrada que escribí hace ya unos días, donde [...]]]></description>
				<content:encoded><![CDATA[<p>[lang_es]</p>
<p>Un poco antes de lo esperado, acabo de publicar la segunda beta de <a title="Librería NRtfTree" href="http://www.sgoliver.net/blog/?page_id=57" target="_self">NRtfTree</a> 0.3.0. Espero cumplir con esto las expectativas de todos los que habéis pedido insistentemente la actualización de la librería.</p>
<p>Para conocer las novedades que trae esta nueva versión os remito a <a title="Post Novedades NRtfTree 0.3.0 beta 2" href="http://www.sgoliver.net/blog/?p=813" target="_self">la entrada</a> que escribí hace ya unos días, donde se detallaban todas las nuevas características y los cambios introducidos desde la aparición de NRtfTree 0.3.0. Además, también podéis consultar el nuevo <a title="Historial de actualizaciones NRtfTree" href="http://www.sgoliver.net/blog/?page_id=811" target="_self">historial de actualizaciones de NRtfTree</a>.</p>
<p>En cuanto a una de las novedades más importantes, la mejora sustancial de rendimiento, también podéis consultar los datos concretos en este <a title="Post Mejoras Rendimiento NRtfTree" href="http://www.sgoliver.net/blog/?p=825" target="_self">otro artículo</a> del blog.</p>
<p>Para aquellos que no conocíais NRtfTree, también he estrenado una nueva sección de <a title="Preguntas Frecuentes FAQ NRtfTree" href="http://www.sgoliver.net/blog/?page_id=905" target="_self">preguntas frecuentes (FAQ)</a> donde ire colocando las consultas que más me suelen llegar por correo electrónico, y una nueva <a title="Ejemplos NRtfTree" href="http://www.sgoliver.net/blog/?page_id=445" target="_self">sección de ejemplos</a> que espero ir actualizando con pequeños fragmentos de código con los casos de uso más comunes de la librería.</p>
<p>Por último, y como siempre, para descargar esta nueva versión podéis acceder a la sección de <a title="Descargar NRtfTree" href="http://www.sgoliver.net/blog/?page_id=81" target="_self">descargas de NRtfTree</a> en este mismo blog.</p>
<p>[/lang_es]</p>
<p>[lang_en]</p>
<p>I&#8217;ve just published the second beta of <a title="NRtfTree Library" href="http://www.sgoliver.net/blog/?page_id=57&amp;lang_view=en" target="_self">NRtfTree</a> 0.3.0.</p>
<p>You can review all the new features and changes of this new version at <a title="NRtfTree 0.3.0 beta 2 New features" href="http://www.sgoliver.net/blog/?p=813&amp;lang_view=en" target="_self">this post</a>, or you can visit the new <a title="Changelog NRtfTree" href="http://www.sgoliver.net/blog/?page_id=811&amp;lang_view=en" target="_self">changelog section</a> of NRtfTree.</p>
<p>One of the most important features of NRtfTree 0.3.0 beta 2 is a great performance improvement. You can read about this new feature at <a title="NRtfTree Performance" href="http://www.sgoliver.net/blog/?p=825&amp;lang_view=en" target="_self">this post</a> I wrote some days ago.</p>
<p>If you are new to NRtfTree you can also read the new <a title="FAQ NRtfTree" href="http://www.sgoliver.net/blog/?page_id=905&amp;lang_view=en" target="_self">FAQ</a> and <a title="NRtfTree Examples" href="http://www.sgoliver.net/blog/?page_id=445&amp;lang_view=en" target="_self">Examples</a> sections.</p>
<p><a title="Download NRtfTree" href="http://www.sgoliver.net/blog/?page_id=81&amp;lang_view=en" target="_self">Download</a> now the new version of NRtfTree!</p>
<p>[/lang_en]</p>
]]></content:encoded>
			<wfw:commentRss>http://www.sgoliver.net/blog/?feed=rss2&#038;p=954</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>[lang_es]Rendimiento NRtfTree 0.3.0 beta2[/lang_es][lang_en]NRtfTree 0.3.0 beta2 Performance[/lang_en]</title>
		<link>http://www.sgoliver.net/blog/?p=825&#038;utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=rendimiento-nrtftree-0-3-0-beta2</link>
		<comments>http://www.sgoliver.net/blog/?p=825#comments</comments>
		<pubDate>Fri, 10 Jul 2009 15:20:33 +0000</pubDate>
		<dc:creator>sgoliver</dc:creator>
				<category><![CDATA[Noticias]]></category>
		<category><![CDATA[Proyectos]]></category>
		<category><![CDATA[NRtfTree]]></category>
		<category><![CDATA[performance]]></category>
		<category><![CDATA[rendimiento]]></category>

		<guid isPermaLink="false">http://www.sgoliver.net/blog/?p=825</guid>
		<description><![CDATA[[lang_es] Una asignatura que tenía pendiente desde hace bastante tiempo era revisar el rendimiento de NRtfTree. Hasta ahora, este aspecto había quedado en un segundo plano por dos motivos principales: El tamaño de los documentos procesados no suele ser excesivo, lo que hace que el desempeño de la librería no tenga demasiada influencia. En las [...]]]></description>
				<content:encoded><![CDATA[<p>[lang_es]</p>
<p>Una asignatura que tenía pendiente desde hace bastante tiempo era revisar el rendimiento de <a title="Librería NRtfTree" href="http://www.sgoliver.net/blog/?page_id=57" target="_self">NRtfTree</a>. Hasta ahora, este aspecto había quedado en un segundo plano por dos motivos principales:</p>
<ol>
<li>El tamaño de los documentos procesados no suele ser excesivo, lo que hace que el desempeño de la librería no tenga demasiada influencia.</li>
<li>En las primeras versiones de la librería resultaba más interesante mejorar en primer lugar las características de la misma, aumentando las funciones disponibles y corrigiendo los errores detectados.</li>
</ol>
<p>Sin embargo, mi intención con NRtfTree 0.3.0 es que por fin la librería consiga un nivel de madurez por encima de lo mínimamente aceptable, y para ello el rendimiento se convierte, esta vez sí, en un factor clave.</p>
<p>En cuanto a la <strong>velocidad de proceso</strong> de NRtfTree, el cuello de botella principal se encontraba sin duda en el <em>lexer</em> (clase <span style="font-family: courier new,courier;">RtfLex</span>), un módulo que práctimente no se había tocado desde la primera versión de NRtfTee, allá por el año 2005. Analizando las posibles optimizaciones se han detectado dos problemas principales:</p>
<ol>
<li>Cada token generado definía e inicializaba sus propios objetos <span style="font-family: courier new,courier;">StringBuilder</span> para el almacenamiento de los datos (palabras clave, parámetros y texto).</li>
<li>El analizador consultaba (<span style="font-family: courier new,courier;">Peek</span>) y leía (<span style="font-family: courier new,courier;">Read</span>) repetidamente los mismos caracteres a la hora de procesar el fichero de entrada.</li>
</ol>
<p>Ambos problemas se han solucionado fácilmente, definiendo un único <span style="font-family: courier new,courier;">StringBuilder </span>a nivel de clase y reescribiendo el analizador de forma que tan sólo lea una vez cada caracter.</p>
<p>Para comprobar el grado de mejora provocado por estos cambios se utilizó un documento RTF sencillo (sólo texto) de 1.3 mb, obteniendo estos resultados respecto al tiempo de carga [ejecución del método <span style="font-family: courier new,courier;">RtfTree.LoadRtfFile()</span>]:</p>
<p><img class=" alignnone" title="Tiempo de Carga de Documentos" src="http://chart.apis.google.com/chart?chxt=y&amp;chxl=0:|Beta%201|Beta%202&amp;chs=350x70&amp;cht=bhs&amp;chds=0,34&amp;chd=t:0.2452,23.659&amp;chco=0000FF&amp;chm=N*f3*%20seg,000000,0,-1,11" alt="Tiempo de Carga de Documentos" width="350" height="70" /></p>
<p>No, no hay ningún error, el gráfico anterior es correcto. Dos sencillos cambios en el analizador léxico han conseguido reducir en un factor de aproximadamente 96 veces el tiempo de carga de un documento, consiguiéndose un rendimiento realmente espectacular. Como información adicional, otras pruebas con documentos más complejos (texto+imágenes) de aproximadamente 3, 6 y 11 mb arrojan los siguientes resultados:</p>
<table style="width: 284px; height: 102px;" border="1" cellspacing="0">
<tbody>
<tr style="background-color: #999999;" align="center">
<td><strong>Documento</strong></td>
<td><strong>Tiempo de Carga </strong></td>
</tr>
<tr style="text-align: center;" align="center">
<td>3 mb</td>
<td>1.9646 seg</td>
</tr>
<tr align="center">
<td style="text-align: center;">6 mb</td>
<td style="text-align: center;">4.5241 seg</td>
</tr>
<tr align="center">
<td style="text-align: center;">11 mb</td>
<td style="text-align: center;">9.1274 seg</td>
</tr>
</tbody>
</table>
<p>Como era de esperar, la relación entre el tamaño del fichero y su tiempo de carga es prácticamente lineal con el nuevo analizador léxico:</p>
<p><img class="alignnone" title="Rendimiento nuevo Lexer" src="http://chart.apis.google.com/chart?cht=lxy&amp;chs=250x150&amp;chds=2,12,0,10&amp;chd=t:3,6,11|1.9646,4.5241,9.1274&amp;chco=3072F3&amp;chls=1,1,0&amp;chm=v,BBCCED,0,-1,1.0|s,FF0000,0,-1,5&amp;chxt=x,y&amp;chxr=0,2,12|1,0,10&amp;chxp=0,3,6,11|1,2,4,6,8,10" alt="" width="250" height="150" /></p>
<p>Los datos detallados de todas estas pruebas se pueden consultar en este enlace: <a title="Pruebas Rendimiento NRtfTree Beta1/Beta2" href="http://spreadsheets.google.com/pub?key=rOMkrX7x3quNm5Xwk9o2lqg&amp;output=html" target="_blank">pruebas rendiento NRtfTree beta1/beta2</a> [los datos corresponden a un programa sencillo que realiza 5 cargas consecutivas del mismo documento, previa ejecución forzada del recolector de memoria].</p>
<p>En cuanto al <strong>consumo de memoria</strong> de NRtfTree también se ha conseguido alguna mejora. Hasta la versión 0.3.0 beta1 cada nodo RTF inicializaba siempre su lista de nodos hijos, aunque no los tuviera. A partir de la beta2 esto dejará de ser así, y únicamente los nodos de tipo Grupo incializarán su lista de hijos, a menos que esto se haga de forma manual sobre un nodo de otro tipo. Tras algunas pruebas de carga de documentos, las diferencias entre la beta1 y la beta2 son las siguientes [tomando como ejemplo el documento anterior de 1.3 mb]:</p>
<table style="width: 560px; height: 98px;" border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr style="background-color: #999999;">
<td><strong>Tipo de Objeto</strong></td>
<td style="text-align: center;"><strong>Creados Beta1</strong></td>
<td style="text-align: center;"><strong>Tamaño Beta1</strong></td>
<td style="text-align: center;"><strong>Creados Beta2</strong></td>
<td style="text-align: center;"><strong>Tamaño Beta2</strong></td>
</tr>
<tr>
<td>RtfTreeNode</td>
<td style="text-align: center;">23353</td>
<td style="text-align: center;">934120</td>
<td style="text-align: center;">23353</td>
<td style="text-align: center;">934120</td>
</tr>
<tr>
<td>RtfNodeCollection</td>
<td style="text-align: center;">23353</td>
<td style="text-align: center;"><span style="color: #ff0000;"> 280236</span></td>
<td style="text-align: center;">2460</td>
<td style="text-align: center;"><span style="color: #ff0000;">29520</span></td>
</tr>
<tr>
<td>RtfToken</td>
<td style="text-align: center;">25812</td>
<td style="text-align: center;">0</td>
<td style="text-align: center;">25812</td>
<td style="text-align: center;">0</td>
</tr>
<tr>
<td>RtfLex</td>
<td style="text-align: center;">1</td>
<td style="text-align: center;">12</td>
<td style="text-align: center;">1</td>
<td style="text-align: center;">12</td>
</tr>
<tr>
<td>RtfTree</td>
<td style="text-align: center;">1</td>
<td style="text-align: center;">32</td>
<td style="text-align: center;">1</td>
<td style="text-align: center;">32</td>
</tr>
</tbody>
</table>
<p>La diferencia se encuentran en los datos marcados en rojo. Mientras que en la beta 1 se utilizan 280236 bytes para almacenar todas las listas de hijos, en la beta2 tan sólo se ocupan 29520 bytes. En total, tras la carga del documento, la beta1 utiliza 1214388 bytes para almacenar el árbol RTF, mientras que la beta2 usa 963672 bytes, lo que supone una <strong>reducción de más del 20%</strong> para este documento, una ganancia importante tratándose de un documento relativamente pequeño.</p>
<p>En resúmen, con la llegada de la versión de NRtfTree 0.3.0 beta2, hemos conseguido no sólo nuevas funcionalidades y la consolidación de otras funciones antiguas, sino que también se ha mejorado considerablemente el rendiento de la librería, consiguiendo así una versión realmente interesante.</p>
<p>[/lang_es]</p>
<p>[lang_en]</p>
<p>Since first public version, the objective of every new release of <a title="NRtfTree Library" href="http://www.sgoliver.net/blog/?page_id=57&amp;lang_view=en" target="_self">NRtfTree</a> was to add new funtionality to the library. In NRtfTree 0.3.0 we also want to improve performance.</p>
<p>The main bottleneck in NRtfTree was the RTF lexer component (RtfLex class). While analyzing source code we dicovered two main problems:</p>
<ol>
<li>Each token define and initialize its own StringBuilder object to load keywords, parameters and text.</li>
<li>The lexer Peek and Read the same characters repeatedly.</li>
</ol>
<p>Both problems has been fixed in versión 0.3.0 beta2. RtfLex now define StringBuilder objects at class level and initialize them setting its lengh to 0 every time it starts a new token, and some methods has been rewriten to read characters only once.</p>
<p>This two simple changes result in a great performace improvement. In our tests, the load time of a simple RTF document (1.3mb, text only) was significantly reduced:</p>
<div class="wp-caption alignnone" style="width: 360px"><img title="Load Time" src="http://chart.apis.google.com/chart?chxt=y&amp;chxl=0:|Beta%201|Beta%202&amp;chs=350x70&amp;cht=bhs&amp;chds=0,34&amp;chd=t:0.2452,23.659&amp;chco=0000FF&amp;chm=N*f3*%20seg,000000,0,-1,11" alt="Load Time" width="350" height="70" /><p class="wp-caption-text">Document Load Time</p></div>
<p>Yes, the chart is correct. <strong>Load time is now over 100 times faster</strong>.</p>
<p>Memory allocation has been improved too. In previous versions, each RTF tree node initialized its child node list, even if it had no children at all. In NRtfTree 0.3.0 beta2, only group nodes creates its children list (if node type is not GROUP, ChildNodes property is set to null).</p>
<p>In our tests, memory allocated by a simple RTF document tree (1.3mb, text only) was <strong>reduced in about 20%</strong>:</p>
<table style="width: 560px; height: 98px;" border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr style="background-color: #999999;">
<td><strong>Object</strong></td>
<td style="text-align: center;"><strong>Created Beta1</strong></td>
<td style="text-align: center;"><strong>Memory Beta1</strong></td>
<td style="text-align: center;"><strong>Created Beta2</strong></td>
<td style="text-align: center;"><strong>Memory Beta2</strong></td>
</tr>
<tr>
<td>RtfTreeNode</td>
<td style="text-align: center;">23353</td>
<td style="text-align: center;">934120</td>
<td style="text-align: center;">23353</td>
<td style="text-align: center;">934120</td>
</tr>
<tr>
<td>RtfNodeCollection</td>
<td style="text-align: center;">23353</td>
<td style="text-align: center;"><span style="color: #ff0000;"> 280236</span></td>
<td style="text-align: center;">2460</td>
<td style="text-align: center;"><span style="color: #ff0000;">29520</span></td>
</tr>
<tr>
<td>RtfToken</td>
<td style="text-align: center;">25812</td>
<td style="text-align: center;">0</td>
<td style="text-align: center;">25812</td>
<td style="text-align: center;">0</td>
</tr>
<tr>
<td>RtfLex</td>
<td style="text-align: center;">1</td>
<td style="text-align: center;">12</td>
<td style="text-align: center;">1</td>
<td style="text-align: center;">12</td>
</tr>
<tr>
<td>RtfTree</td>
<td style="text-align: center;">1</td>
<td style="text-align: center;">32</td>
<td style="text-align: center;">1</td>
<td style="text-align: center;">32</td>
</tr>
</tbody>
</table>
<p>[/lang_en]</p>
]]></content:encoded>
			<wfw:commentRss>http://www.sgoliver.net/blog/?feed=rss2&#038;p=825</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
