<?xml version="1.0" encoding="UTF-8"?>
<rss 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/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>Error: Segmentation Fault!</title>
	
	<link>http://www.segmentationfault.es</link>
	<description>La formulación de un problema es más importante que su solución.</description>
	<lastBuildDate>Sat, 06 Mar 2010 14:56:41 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>es</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/ErrorSegmentationFault" /><feedburner:info uri="errorsegmentationfault" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item>
		<title>Implement decisions based on truth tables</title>
		<link>http://feedproxy.google.com/~r/ErrorSegmentationFault/~3/CEx0PB4fvF0/</link>
		<comments>http://www.segmentationfault.es/2010/03/decisions-based-on-truth-tables/#comments</comments>
		<pubDate>Sat, 06 Mar 2010 14:56:41 +0000</pubDate>
		<dc:creator>Christopher Vallés</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Truth Tables]]></category>

		<guid isPermaLink="false">http://www.segmentationfault.es/?p=1432</guid>
		<description><![CDATA[The other day in my work I find myself in a situation that I had to implement some decisions based on a truth table. Thinking about how it's the best approach to solve the problem I found the following solutions. Which do you think it's the best approach?]]></description>
			<content:encoded><![CDATA[<p>The other day in my work I find myself in a situation that I had to implement some decisions based on a truth table. After simplify the table I finish with a 2&#215;4 table like the below:</p>
<pre style="text-align: center;">+----+----+--------+
| CS | LF | Locale |
+----+----+--------+
| 0  | 0  | DL_DC  |
| 0  | 1  | LF_DC  |
| 1  | 0  | DL_CS  |
| 1  | 1  | LF_CS  |
+----+----+--------+
</pre>
<p><strong>Lengend</strong></p>
<ul>
<li><strong>CS</strong> = Country Supported in the System</li>
<li><strong>LF</strong> = Language Forced in the URL</li>
<li><strong>DL_DC</strong> = Locale for the default country with the default language configured on the DB</li>
<li><strong>LF_DC</strong> = Locale for the default country but with the language forced in the URL</li>
<li><strong>DL_CS</strong> = Locale for the country detected with the default language configured on the DB</li>
<li><strong>LF_CS</strong> = Locale for the country detected with the language forced in the URL</li>
</ul>
<p>Thinking about how it&#8217;s the best approach to solve the problem I found the following solutions.</p>
<p><script src='http://pastie.org/857090.js'></script></p>
<p>Which do you think it&#8217;s the best approach?</p>

<p><a href="http://feedads.g.doubleclick.net/~a/1-1dLig7tqr1GyDaZ7Oa79gLZbo/0/da"><img src="http://feedads.g.doubleclick.net/~a/1-1dLig7tqr1GyDaZ7Oa79gLZbo/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/1-1dLig7tqr1GyDaZ7Oa79gLZbo/1/da"><img src="http://feedads.g.doubleclick.net/~a/1-1dLig7tqr1GyDaZ7Oa79gLZbo/1/di" border="0" ismap="true"></img></a></p><img src="http://feeds.feedburner.com/~r/ErrorSegmentationFault/~4/CEx0PB4fvF0" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.segmentationfault.es/2010/03/decisions-based-on-truth-tables/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.segmentationfault.es/2010/03/decisions-based-on-truth-tables/</feedburner:origLink></item>
		<item>
		<title>CSS: the ‘opacity’ property</title>
		<link>http://feedproxy.google.com/~r/ErrorSegmentationFault/~3/dZyh0Mxcbfo/</link>
		<comments>http://www.segmentationfault.es/2010/02/css-opacity/#comments</comments>
		<pubDate>Sun, 28 Feb 2010 13:01:38 +0000</pubDate>
		<dc:creator>Noemí Losada</dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[efectos visuales]]></category>
		<category><![CDATA[web]]></category>

		<guid isPermaLink="false">http://www.segmentationfault.es/?p=1361</guid>
		<description><![CDATA[Today we will talk about the property 'opacity' in CSS and how it works on IE and Firefox at the same time.]]></description>
			<content:encoded><![CDATA[<p>Today we will talk about the &#8216;opacity&#8217; property in CSS and how it works on IE and Firefox at the same time.</p>
<p>We will try to get the same effect as the image below:</p>
<style type="text/css">
.background{ background-image: url(wp-content/2010/02/caracol.png); width: 300px; height: 208px; margin-right: auto; margin-left: auto; border: 1px solid #000000; } .white{ background-color: #ffffff; width: 250px; height: 158px; border: solid 1px #000000; margin: 25px 25px; opacity: 0.6; filter:alpha(opacity=60); }</style>
<div class="background">
<div class="white">This is an exemple with the property opacity of CSS</div>
</div>
<p>To create this effect you have to add the following lines on the html file:</p>
<pre class="brush: xml;">
﻿&lt;div class=&quot;background&quot;&gt;
   &lt;div class=&quot;white&quot;&gt;This is an exemple with the CSS opacity property&lt;/div&gt;
&lt;/div&gt;
</pre>
<p>The first div have the class &#8220;background&#8221; to put a standard background and the second div is inside the first div to put another background called &#8220;white&#8221; over the first background.</p>
<p>Now you can customize the classes with the following attributes and values on your css file:</p>
<pre class="brush: css;">
.background{
 background-image: url(caracol.png);
 width: 300px;
 height: 208px;
 border: 1px solid #000000;
}

.white{
 background-color: #ffffff;
 width: 250px;
 height: 158px;
 border: solid 1px #000000;
 margin: 25px 25px;
 opacity: 0.6;
 filter:alpha(opacity=60);
}
</pre>
<p>The class &#8220;background&#8221; contains an image background, the class &#8220;white&#8221; contains a background color with the opacity property to obtain the transparent effect. The attribute &#8220;opacity: 0.6;&#8221; is for Firefox and the values can go from 1.0 to 0.0, to be able to show this effect in IE you have to use the following code  &#8220;filter:alpha(opacity=60);&#8221; and the possible values can go from 100 to 0.</p>
<p>Remember to put the Doctype declaration on your HTML file to avoid the problems with the diferents bowsers and also write a stardard code.</p>
<p>I hope you enjoy it and do not hesitate if you have any doubt. <img src='http://www.segmentationfault.es/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>

<p><a href="http://feedads.g.doubleclick.net/~a/_V7F8v0MTt8TPXPhW8x0WKFJ92M/0/da"><img src="http://feedads.g.doubleclick.net/~a/_V7F8v0MTt8TPXPhW8x0WKFJ92M/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/_V7F8v0MTt8TPXPhW8x0WKFJ92M/1/da"><img src="http://feedads.g.doubleclick.net/~a/_V7F8v0MTt8TPXPhW8x0WKFJ92M/1/di" border="0" ismap="true"></img></a></p><img src="http://feeds.feedburner.com/~r/ErrorSegmentationFault/~4/dZyh0Mxcbfo" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.segmentationfault.es/2010/02/css-opacity/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.segmentationfault.es/2010/02/css-opacity/</feedburner:origLink></item>
		<item>
		<title>From the Array to the Object</title>
		<link>http://feedproxy.google.com/~r/ErrorSegmentationFault/~3/mshjHiX3kA0/</link>
		<comments>http://www.segmentationfault.es/2010/02/from-the-array-to-the-object/#comments</comments>
		<pubDate>Sun, 28 Feb 2010 12:04:20 +0000</pubDate>
		<dc:creator>Christopher Vallés</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[array]]></category>
		<category><![CDATA[object]]></category>
		<category><![CDATA[recursivity]]></category>
		<category><![CDATA[stdClass]]></category>

		<guid isPermaLink="false">http://www.segmentationfault.es/?p=1411</guid>
		<description><![CDATA[The other day working late with my colleague Tudor we found that in one point of our application we had to use an object but we had an Array. At this point we found two possible solutions, the first rewrite our code to use the Array instead the object or the second and more sophisticated solution convert the Array to an Object.]]></description>
			<content:encoded><![CDATA[<p>The other day working late with my colleague Tudor, who also have a blog at <a href="http://blog.motane.lu" target="_blank">blog.motane.lu</a>, we found that in one point of our application we had to use an object but we had an Array. At this point we found two possible solutions, the first rewrite our code to use the Array instead the object or the second and more sophisticated solution convert the Array to an Object.</p>
<p>The tricky point was that the Array could contain more Arrays so we had to write a recursive function to accomplish our objective.</p>
<p>Tudor, at the end, gave the following method to be able to do the conversion.</p>
<pre class="brush: php;">
/**
 * Recursively converts an array to a stdClass object
 *
 * @param array $array
 * @return stdClass
 */
 protected function _convertToStdObject(array $array){
   $obj = new stdClass();
   foreach($array as $key =&gt; $value) {
     if(!is_array($value)) {
       $obj-&gt;{$key} = $value;
     }else{
       $obj-&gt;{$key} = $this-&gt;_convertToStdObject($value);
     }
   }

   return $obj;
 }
</pre>
<p>Maybe, in the next interviews we will do to our PHP Developers candidates, we will ask about this and see how they solve the problem <img src='http://www.segmentationfault.es/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>

<p><a href="http://feedads.g.doubleclick.net/~a/Sw7Inlr52yq5yupqLZRozeS0Zso/0/da"><img src="http://feedads.g.doubleclick.net/~a/Sw7Inlr52yq5yupqLZRozeS0Zso/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/Sw7Inlr52yq5yupqLZRozeS0Zso/1/da"><img src="http://feedads.g.doubleclick.net/~a/Sw7Inlr52yq5yupqLZRozeS0Zso/1/di" border="0" ismap="true"></img></a></p><img src="http://feeds.feedburner.com/~r/ErrorSegmentationFault/~4/mshjHiX3kA0" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.segmentationfault.es/2010/02/from-the-array-to-the-object/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://www.segmentationfault.es/2010/02/from-the-array-to-the-object/</feedburner:origLink></item>
		<item>
		<title>Mejorando la búsqueda usando la Web 2.0</title>
		<link>http://feedproxy.google.com/~r/ErrorSegmentationFault/~3/yIOnicimoLA/</link>
		<comments>http://www.segmentationfault.es/2010/02/mejorando-busqueda-web/#comments</comments>
		<pubDate>Sat, 06 Feb 2010 10:35:50 +0000</pubDate>
		<dc:creator>Gabi García</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[recuperación de información]]></category>
		<category><![CDATA[web 2.0]]></category>

		<guid isPermaLink="false">http://www.segmentationfault.es/?p=1352</guid>
		<description><![CDATA[Hace unos días asistí a una conferencia de Ricardo Baeza titulada "Mejorando la búsqueda usando la Web 2.0". A pesar de que en el Blog acostumbramos a postear entradas de carácter más práctico que divulgativo, he decidido postear un pequeño ensayo sobre dicha conferencia ya que me resultó interesante y motivo de alguna que otra reflexión.]]></description>
			<content:encoded><![CDATA[<p>En la actualidad, Internet nos ofrece una cantidad ingente de datos de todo tipo (texto, imágenes, vídeos…) y sobre cualquier temática posible. De hecho, el volumen de datos actual ha provocado que una de las grandes problemáticas de la Web sea la necesidad de buscar y filtrar toda esa información para que resulte útil.</p>
<p>Para ello, debemos discernir, en primera instancia, entre los datos que conforman el contenido propiamente dicho (normalmente documentos jerarquizados que siguen una estructura) y los llamados metadatos. ¿Y qué son los metadatos? Entendemos por metadatos, los datos que contienen información sobre los propios datos (etiquetas, enlaces, <em>reviews</em>, <em>pageviews</em>, etc.).</p>
<p>Otro aspecto muy a tener en cuenta en el proceso de clasificación de los datos es la privacidad de éstos. Los buscadores utilizan la información para devolver resultados cada vez más adecuados a los usuarios, y parte de ella (como las <em>querys</em> o los <em>clicks</em>) pueden revelar algunos datos personales.</p>
<p>Llegados a este punto se nos formulan algunas preguntas nada despreciables: ¿Cómo podemos utilizar estos datos? ¿Con qué criterio los organizamos? ¿Cuán fiables son los datos que poseemos?</p>
<p>En lo que respecta a la fiabilidad de los datos, podemos hacer una reflexión desde el punto de vista estadístico. Teniendo en cuenta que el conjunto de búsquedas/visitas es muy elevado, y curiosamente la mayoría de ellas son sobre un conjunto de temas comunes (la llamada “<em>long tale</em>” en la representación gráfica), la distribución tenderá a ser una distribución normal o <em>gaussiana</em>. La media de todos los datos será, por lo tanto, un resultado sorprendentemente bueno.</p>
<p>Así, podemos aprovechar que el conocimiento colectivo supera, en la mayor parte de los casos, al conocimiento individual. Toda esta teoría está detallada en profundidad en el libro <em>The Wisdom of Crowds: Why the Many Are Smarter Than the Few and How Collective Wisdom Shapes Business, Economies, Societies and Nations </em>de <em>James Surowiecki</em>.</p>
<p>Aún disponiendo de datos fiables, debemos establecer una organización y clasificación para que resulten realmente útiles al usuario final. Esto requiere determinar unos criterios sobre el conjunto de información (texto, enlaces, etiquetas, <em>queries</em>, etc.) para medir la calidad de cada recurso.</p>
<p>La clasificación por excelencia de la Web 1.0 (<em>PageRank</em>) basa la calidad de los documentos en función de los enlaces que “apuntan” a cada uno de ellos. Este ingenioso modelo funcionaba a la perfección cuando los únicos usuarios que realizaban los enlaces en la red de redes eran los administradores. Hoy por hoy cualquiera tiene la posibilidad de crear enlaces y este sistema para clasificar los contenidos está perdiendo fuerza en la Web 2.0.</p>
<p>Un modelo alternativo que tiene un buen desempeño en la actualidad es el etiquetado, en inglés <em>tagging</em>, de los documentos. El usuario que añade una información en Internet se encarga también de definir un conjunto de etiquetas o palabras claves que ayuden a clasificar dicha información.</p>
<p>El etiquetado tiene aplicaciones muy diversas e interesantes. Una de ellas consiste en la selección de contenido teniendo en cuenta la diversidad de términos (<em>topical diversity</em>). Un ejemplo claro es la consulta “Jaguar”, que puede hacer referencia al animal o a la marca de automóviles.</p>
<p>También son útiles los <em>tags</em> para segregar y descartar algunas imágenes en <em>querys</em> determinadas. Por ejemplo, si un usuario busca “Honda Civic” probablemente no querrá encontrar como resultado un conjunto de imágenes del coche con el mismo ángulo. Un resultado óptimo devolvería imágenes desde todos los ángulos posibles. Es lo que se designa con el término <em>visual diversity</em>.</p>
<p>El <em>tagging</em> en imágenes tiene más aplicaciones útiles, como la navegación a partir de las etiquetas (como en <em>Yahoo! TagExplorer</em>) o las anotaciones visuales (<em>use visual annotations</em>), en las que una etiqueta es representada mediante un rectángulo que encuadra un objeto particular. Sistemas de este tipo se utilizan actualmente en portales como <em>Flickr</em> o <em>Facebook</em>.</p>
<p>Pese a todo, el gran inconveniente de este sistema es la necesidad de que el usuario defina los <em>tags</em>, con lo que ello respecta (errores ortográficos, errores tipográficos, subjetividad, heterogeneidad…). Inmediatamente se nos ocurre la idea de implementar un sistema para sugerir etiquetas, pero la experiencia nos dice que el usuario es propenso a hacer uso de la “ley del mínimo esfuerzo”. Es decir, que en la mayoría de los casos el usuario se limitaría a introducir una única etiqueta y seleccionar el resto de ellas del conjunto propuesto por el algoritmo de sugerencia.</p>
<p>Otro modelo que cabe destacar es el basado en la correlación entre los recursos. El principio de funcionamiento de este método es buscar el conjunto de elementos relacionados con la consulta introducida por el usuario (otros nombres, lugares, eventos, imágenes, etc.). Estas interrelaciones entre las entidades se suelen representar como grafos, y se aplican los algoritmos y técnicas de teoría de grafos para su implementación.</p>
<p>Relacionado con lo anterior está el uso de las consultas como etiquetas implícitas (<em>querys as implicit tags</em>). Esta técnica aprovecha las decisiones que toma el usuario para detectar las relaciones entre las búsquedas y etiquetar los recursos. Un ejemplo podría ser dos usuarios que realizan las consultas “Roma” e “Imperio romano” respectivamente y, no obstante, hacen <em>click</em> en el mismo enlace de todos los presentes en los resultados. El sistema detectaría estos casos y haría patente esa relación mediante nuevas transiciones en el <em>click graph</em>.</p>
<p>Un sistema complementario para mejorar las búsquedas en la Web 2.0 es el uso del conocimiento implícito (<em>implicit knowledge</em>). La mejor manera de entender el funcionamiento de esta técnica es con un caso práctico. Supongamos que un usuario introduce la <em>query</em> “tfcu”. Usando el conocimiento implícito debe obtener todos los documentos relacionados con la <em>teachers federal credit union,</em> dado que tfcu es el acrónimo de ésta. Del mismo modo, el sistema debe guardar una relación entre CEE, UE, Comunidad Económica Europea y Unión Europea.</p>
<p>El objetivo principal de la recuperación de información (<em>information retrieval</em>) es devolver el conjunto óptimo de recursos relacionados con lo que el usuario está buscando, en el menor tiempo posible. Todos los modelos mencionados, y muchos otros que se han quedado en el tintero, sirven para acercarse más al objetivo, y el uso combinado de todos ellos produce mejores resultados.</p>
<p>La Web crece en volumen de información y evoluciona a la par que los usuarios requieren disponer de la información más relevante de la forma más rápida posible. ¿Pero, en qué dirección evoluciona la Web? La tendencia marca el progresivo adiós a las búsquedas, dando paso a portales que ofrecerán al usuario justo aquello que desean obtener sin necesidad de que éste lo pida. Dicho así puede sonar bastante utópico. Sin embargo, ¿quién imaginaba hace 20 años que se podría obtener todo tipo de información escribiendo algunas palabras en una caja de texto? ¿Llegará un día en el que abriendo nuestro navegar obtendremos la información que necesitamos sin hacer nada para llegar a ella? Sólo el futuro de la Web tiene la respuesta.</p>
<p><span style="text-decoration: underline;"><strong>Fuente</strong></span></p>
<p>Ricardo Baeza &#8211; http://www.dcc.uchile.cl/~rbaeza/spanish.html</p>

<p><a href="http://feedads.g.doubleclick.net/~a/wpyq40Dt0JlOQyIM11ixh6WzJek/0/da"><img src="http://feedads.g.doubleclick.net/~a/wpyq40Dt0JlOQyIM11ixh6WzJek/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/wpyq40Dt0JlOQyIM11ixh6WzJek/1/da"><img src="http://feedads.g.doubleclick.net/~a/wpyq40Dt0JlOQyIM11ixh6WzJek/1/di" border="0" ismap="true"></img></a></p><img src="http://feeds.feedburner.com/~r/ErrorSegmentationFault/~4/yIOnicimoLA" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.segmentationfault.es/2010/02/mejorando-busqueda-web/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://www.segmentationfault.es/2010/02/mejorando-busqueda-web/</feedburner:origLink></item>
		<item>
		<title>Debugging PHP en MacOS X</title>
		<link>http://feedproxy.google.com/~r/ErrorSegmentationFault/~3/RP4xc44_eXw/</link>
		<comments>http://www.segmentationfault.es/2010/01/debugging-php-macos/#comments</comments>
		<pubDate>Mon, 04 Jan 2010 12:21:21 +0000</pubDate>
		<dc:creator>Gabi García</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[debug]]></category>
		<category><![CDATA[MacGDBp]]></category>
		<category><![CDATA[MAMP]]></category>
		<category><![CDATA[XDebug]]></category>

		<guid isPermaLink="false">http://www.segmentationfault.es/?p=1334</guid>
		<description><![CDATA[En este breve post os explico los pasos que he seguido para configurar XDebug para PHP 5.2 usando MAMP Pro bajo MacOS X Snow Leopard. Espero que os resulte útil a todos los que utilizáis el lenguaje de programación PHP. ¡Se acabaron los quebraderos de cabeza por no poder debuggar vuestro código PHP! ]]></description>
			<content:encoded><![CDATA[<p>Hace unos días me decidí a poner a punto de nuevo mi MacBook y una de las cosas que he tenido que hacer es volver a configurar el debugger para PHP, concretamente XDebug. Me ha llevado mi tiempo y algunas búsquedas en Google así que he decidido compartir los pasos con todos vosotros. ¡Dispongámonos a ello!</p>
<p>Antes de nada debo decir que estos son los pasos que he seguido para instalar XDebug para PHP 5.2 usando MAMP Pro 1.8.4 bajo MacOS X Snow Leopard. Es posible que, si tenéis una configuración distinta, los pasos puedan variar un poco.</p>
<p>En primer lugar debemos descargarnos los binarios de XDebug en esta URL: <a href="http://aspn.activestate.com/ASPN/Downloads/Komodo/RemoteDebugging" target="_blank">http://aspn.activestate.com/ASPN/Downloads/Komodo/RemoteDebugging</a>.</p>
<p>Descomprimimos el archivo .tgz que nos acabamos de descargar y veremos que hay una estructura de directorios que representa las diferentes versiones de PHP. Yo actualmente estoy utilizando PHP 5.2 (la que en estos momentos incluye por defecto MAMP y MAMP Pro) así que copiaré el fichero <strong>xdebug.so</strong> que hay dentro de esta carpeta.</p>
<p>Este archivo<strong> xdebug.so</strong> deberemos copiarlo en el directorio de extensiones de PHP, en MAMP es <em>/Applications/MAMP/bin/php5/lib/php/extensions/no-debug-non-zts-20050922/</em>.</p>
<p>Ahora deberemos añadir algunas líneas a nuestro <em>php.ini</em> para activar y configurar la extensión. La localización habitual del fichero <em>php.ini </em>en MAMP es<em> /Applications/MAMP/conf/php5/php.ini</em> pero (<strong>¡OJO!</strong>) si utilizáis MAMP Pro las modificaciones en este fichero serán en vano. Esto es debido a que MAMP Pro carga su propia copia del php.ini que se localiza en <em>/Applications/MAMP PRO x.x.x/MAMP PRO.app/Contents/Resources/php5.ini</em> (accediendo haciendo clic con botón derecho sobre la app de MAMP Pro y &#8220;<em>Mostrar contenido del paquete</em>&#8220;).</p>
<p>Una vez localizado el php.ini adecuado, debemos añadir la siguiente línea:</p>
<pre class="brush: bash; toolbar: true;">
[xdebug]
zend_extension=&quot;/Applications/MAMP/bin/php5/lib/php/extensions/no-debug-non-zts-20060613/xdebug.so&quot;
</pre>
<p>Si utilizáis el editor TextMate para programar, añadid también esta línea a continuación para que el debugger muestre los errores como enlaces a TextMate en la línea correcta:</p>
<pre class="brush: bash; toolbar: true;">
xdebug.file_link_format = &quot;txmt://open?url=file://%f&amp;line=%l&quot;
</pre>
<p>Si además váis a utilizar <a href="http://www.bluestatic.org/software/macgdbp/" target="_blank">MacGDBp</a> para <em>debuggar</em> y queréis que se ejecute el <em>debugger</em> por defecto (si lo tenéis abierto) podéis añadir también (sino deberéis añadir <code>?XDEBUG_SESSION_START=macgdbp</code> a vuestra URL cada vez para iniciar el <em>debugger</em>):</p>
<pre class="brush: bash; toolbar: true;">
xdebug.remote_enable = On
xdebug.remote_autostart = 1
</pre>
<p>Para que funcione todo correctamente posiblemente deberemos desactivar el <em>Zend Optimizer</em>, que viene activado por defecto en MAMP.  Para ello, comentamos las siguientes líneas:</p>
<pre class="brush: bash; toolbar: true;">
;zend_optimizer.optimization_level=15
;zend_extension_manager.optimizer=/Applications/MAMP/bin/php5/zend/lib/Optimizer-3.3.3
;zend_optimizer.version=3.3.3
</pre>
<p>Ahora debéis reiniciar el servidor Apache y ya podréis comenzar a <em>debuggar</em> vuestras aplicaciones en PHP. Si ha funcionado ya os daréis cuenta de que los errores se muestran en una tabla muy colorida y hay una mejora muy sustancial a la hora de mostrar los resultados de var_dump.</p>
<p>Espero que os sea de utilidad y si tenéis problemas acudid a los comentarios para intentar resolverlos entre todos. ¡Salu2!</p>
<p><span style="text-decoration: underline;"><strong>Fuentes</strong></span></p>
<p>debuggable.com &#8211; <a href="http://debuggable.com/posts/setting-up-xdebug-on-mac-os-x-or-win32-linux:480f4dd6-0240-4a90-8fa1-4e41cbdd56cb" target="_blank">http://debuggable.com/posts/setting-up-xdebug-on-mac-os-x-or-win32-linux:480f4dd6-0240-4a90-8fa1-4e41cbdd56cb</a></p>
<p>Techno Sophos &#8211; <a href="http://technosophos.com/content/debugging-your-php-code-xdebug-mamp-textmate-and-macgdbp-support" target="_blank">http://technosophos.com/content/debugging-your-php-code-xdebug-mamp-textmate-and-macgdbp-support</a></p>

<p><a href="http://feedads.g.doubleclick.net/~a/625JZuYqxq9VngnXykhy2tCubmQ/0/da"><img src="http://feedads.g.doubleclick.net/~a/625JZuYqxq9VngnXykhy2tCubmQ/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/625JZuYqxq9VngnXykhy2tCubmQ/1/da"><img src="http://feedads.g.doubleclick.net/~a/625JZuYqxq9VngnXykhy2tCubmQ/1/di" border="0" ismap="true"></img></a></p><img src="http://feeds.feedburner.com/~r/ErrorSegmentationFault/~4/RP4xc44_eXw" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.segmentationfault.es/2010/01/debugging-php-macos/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://www.segmentationfault.es/2010/01/debugging-php-macos/</feedburner:origLink></item>
		<item>
		<title>Parsear ficheros CSV en PHP</title>
		<link>http://feedproxy.google.com/~r/ErrorSegmentationFault/~3/LQUhdRA1PfE/</link>
		<comments>http://www.segmentationfault.es/2010/01/parsear-csv-en-php/#comments</comments>
		<pubDate>Mon, 04 Jan 2010 00:20:37 +0000</pubDate>
		<dc:creator>Christopher Vallés</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[CSV]]></category>

		<guid isPermaLink="false">http://www.segmentationfault.es/?p=1340</guid>
		<description><![CDATA[¿Cómo parsearías un fichero CSV? la respuesta mas común a esta pregunta suele ser con expresiones regulares pero en este post voy a tratar de explicar la manera más sencilla y a la vez potente de parsear este tipo de ficheros.]]></description>
			<content:encoded><![CDATA[<p>Desde que en Agosto cambié de empresa me he encontrado muchas veces con la necesidad de parsear ficheros CSV. Hace un tiempo que empecé a evaluar a nuevos candidatos y a todos les hacía la misma pregunta: ¿Cómo parsearías un fichero CSV? La respuesta más común a esta pregunta suele ser &#8220;con expresiones regulares&#8221; pero en este post voy a tratar de explicar la manera más sencilla, y a la vez potente, de parsear este tipo de ficheros.</p>
<p>Desde la versión 4 de PHP existen dos funciones muy útiles para estos menesteres, <strong>fgetcsv </strong>y  <strong>fputcsv</strong>.</p>
<p>Según la documentación PHP la firma de esta función es la siguiente:</p>
<pre class="brush: php;">
array fgetcsv (resource $handle [,int $length [,string $delimiter = ',' [,string $enclosure = '&quot;' [,string $escape = '\\']]]])
</pre>
<p>Como podemos ver, el primer parámetro a proporcionar es el puntero al fichero que queremos leer y después toda una serie de parámetros opcionales como la dimensión de la cadena a leer, el delimitador de campos, el carácter de envoltorio de campos y el carácter para escapar símbolos poco comunes. Esta función, al ser llamada con los parámetros correctos, devolverá la línea que ha leído en formato de array, donde cada campo será una nueva entrada en el array.</p>
<p>Bien, en este punto y antes de mostrar un trozo de código tengo que hacer mención a un detalle, esta función puede ocasionar algunos problemas dependiendo del sistema operativo en el que estemos corriendo PHP. En mi caso, utilizando Mac OS X Snow Leopard, me he encontrado que la función no detecta bien el final de la línea con lo cuál, y para ahorrarnos problemas, vamos a utilizar también la siguiente instrucción:</p>
<pre class="brush: php;">
ini_set('auto_detect_line_endings', TRUE);
</pre>
<p>Esta línea lo que hace es forzar a detectar el final de línea, lo que resuelve el problema en dichas plataformas.</p>
<p>Dicho todo esto, voy a mostrar un trozo de código que lo que hace es recorrer el fichero y generar una array de arrays con todo el fichero parseado.</p>
<pre class="brush: php;">
&lt;?php

//Prepare the auto detect line endings for some OS's
ini_set('auto_detect_line_endings', TRUE);

//Save the path to the file we want to open
$file = dirname(__FILE__) . 'test.csv';

//Create a file pointer to de file in read mode
$fp = fopen($file, 'r');

//Setup the result var
$parsedCSV = array();

/* Get the headers of the csv and store it in a special key in the array. Setting the max length to 0 strip the length constrain */
$parsedCSV['headers'] = fgetcsv($fp, 0, ',');

/* Loop to read the entire file, take a look at the comparison and remember that if fgetcsv arrives at the end of the file a FALSE will be returned. We use this to detect the EOF */
while(($line = fgetcsv($fp, 0, ',')) !== FALSE){
    $parsedCSV[] = $line;
}

//Print out the array
die(var_dump($parsedCSV));
</pre>
<p>Para detectar el final de fichero en este script estamos usando la comparación <em>($line = fgetcsv($fp, 0, &#8216;,&#8217;)) !== FALSE</em> ya que fgetcsv devuelve FALSE en caso de error o EOF (End Of File).</p>
<p>Espero que este post os sea de ayuda y recordad que podéis preguntarnos mediante el sistema de comentarios.</p>

<p><a href="http://feedads.g.doubleclick.net/~a/lGekRiG-XKG0GWQl9zXR7ixkq1w/0/da"><img src="http://feedads.g.doubleclick.net/~a/lGekRiG-XKG0GWQl9zXR7ixkq1w/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/lGekRiG-XKG0GWQl9zXR7ixkq1w/1/da"><img src="http://feedads.g.doubleclick.net/~a/lGekRiG-XKG0GWQl9zXR7ixkq1w/1/di" border="0" ismap="true"></img></a></p><img src="http://feeds.feedburner.com/~r/ErrorSegmentationFault/~4/LQUhdRA1PfE" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.segmentationfault.es/2010/01/parsear-csv-en-php/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://www.segmentationfault.es/2010/01/parsear-csv-en-php/</feedburner:origLink></item>
		<item>
		<title>Persistencia de objetos en Python</title>
		<link>http://feedproxy.google.com/~r/ErrorSegmentationFault/~3/PkERXmcfjIQ/</link>
		<comments>http://www.segmentationfault.es/2009/11/persistencia-python/#comments</comments>
		<pubDate>Sun, 29 Nov 2009 23:35:29 +0000</pubDate>
		<dc:creator>Gabi García</dc:creator>
				<category><![CDATA[Programación]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[cPickle]]></category>
		<category><![CDATA[Pickle]]></category>
		<category><![CDATA[Serialización]]></category>

		<guid isPermaLink="false">http://www.segmentationfault.es/?p=1327</guid>
		<description><![CDATA[Cuando estamos creando un programa muchas veces queremos que los datos y los resultados de la ejecución de nuestro programa no se pierdan. Es posible que el objetivo de nuestro programa sea trabajar sobre un conjunto de datos concreto que debe "mejorar" o "modificar" en cada ejecución. En este post os pretendo mostrar una forma de hacerlo posible en Python gracias a Pickle.]]></description>
			<content:encoded><![CDATA[<p>Cuando estamos creando un programa muchas veces queremos que los datos y los resultados de la ejecución de nuestro programa no se pierdan. Es posible que el objetivo de nuestro programa sea trabajar sobre un conjunto de datos concreto que debe &#8220;mejorar&#8221; o &#8220;modificar&#8221; en cada ejecución. Por lo tanto, necesitamos guardar la información en cada ejecución para poder cargarla en otra posterior ejecución.</p>
<p>Si nuestra aplicación sigue el paradigma de la orientación a objetos debemos almacenar el estado del objeto para recuperarlo a posteriori. Un posible enfoque sería almacenar toda esa información en una base de datos y trabajar así con un sistema gestor de base de datos (SGBD) como <em>MySQL</em>. Pero existe un inconveniente en este caso, que la mayoría de SGBD son relacionales y nuestro programa sigue el modelo de la orientación a objetos (OOP) y la conversión entre modelos muchas veces no es obvia.</p>
<p>La alternativa que pretendo explicaros en este post es la serialización de los objetos para que sean almacenados en ficheros de texto, dándo así persistencia a nuestras aplicaciones. Me he decidido a realizar la explicación en <em>Python</em> su excelente mecanismo para la serialización de objetos, <a href="http://en.wikipedia.org/wiki/Pickle_%28Python%29" target="_blank"><em>Pickle</em></a>.</p>
<p>Para el post he creado una sencilla clase llamada SFSaludador que se encarga de saludar al usuario imprimiendo un &#8220;Hola!&#8221; por pantalla. El objeto guardará el total de saludos y esa información se hará persistente en un fichero llamaso &#8220;sfsaludador.txt&#8221; serializanso mediante <em>Pickle</em>. Os dejo el código a continuación:</p>
<pre class="brush: python;">
import os
import pickle

class SFSaludador(object):
	&quot;&quot;&quot;Clase SFSludador&quot;&quot;&quot;

	def __init__(self, totalSaludos):
		super(SFSaludador, self).__init__()
		self.__totalSaludos = totalSaludos

	def saluda(self):
		&quot;&quot;&quot;Saluda&quot;&quot;&quot;
		print &quot;Hola!&quot;
		self.__totalSaludos += 1

	def getTotalSaludos(self):
		&quot;&quot;&quot;Devuelve el total de saludos&quot;&quot;&quot;
		print &quot;He saludado &quot; + str(self.__totalSaludos) + &quot; veces.&quot;

	def load(self):
		&quot;&quot;&quot;Obtiene la informacion del archivo&quot;&quot;&quot;
		dataFile = open('sfsaludador.txt','r')
		self.__totalSaludos = pickle.load(dataFile)
		dataFile.close()

	def write(self):
		&quot;&quot;&quot;Graba los datos en el fichero&quot;&quot;&quot;
		dataFile = open('sfsaludador.txt','w')
		pickle.dump( self.__totalSaludos, dataFile)
		dataFile.close()

def main():
	&quot;&quot;&quot;Main function&quot;&quot;&quot;

	miSaludador = SFSaludador(0)

	if (os.path.exists('sfsaludador.txt')):
		print(&quot;Archivos encontrados. Cargando...&quot;)
		miSaludador.load()
	else:
		print(&quot;Archivos no encontrados...&quot;)

	miSaludador.getTotalSaludos()
	miSaludador.saluda()
	miSaludador.getTotalSaludos()

	miSaludador.write()

if __name__ == '__main__':
	main()
</pre>
<p>Para ejecutar el programa utilizaremos el intérprete de Python por consola de la siguiente forma (en entornos UNIX):</p>
<pre class="brush: bash;">
python SFSaludador.py
</pre>
<p>Dónde SFSaluadador.py es el fichero con el código de nuestro programa de ejemplo.</p>
<p>La primera vez que ejecutamos el programa no encontrará ningún fichero (así nos lo comunicará nuestra aplicación) y será al final de esta ejecución cuando creará el fichero con el estado del objeto para cargarlo en siguiente ejecuciones. Si volvemos a ejecutarlo vemos como esta vez si encuentra el fichero y el total de saludos tiene en cuenta los saludos de ejecuciones anteriores.</p>
<p>A veces <em>Pickle</em> puede llegar a ser un poco lento si necesitamos serializar muchos ficheros. Para solucionar esto existe una implentación de la librería realizada en el lenguaje de programación C, llamada <em>cPickle</em>. Si queremos hacer uso de ella sin tener que realizar modificaciones en nuestro código solo debemos sustituir el import de la librería por:</p>
<pre class="brush: bash;">
import cPickle as pickle
</pre>
<p>Espero que con este breve post haya podido haceros llegar la idea de la persistencia de datos en ficheros y su implementación en el potente lenguaje <em>Python</em>. Como siempre, ¡os espero en los comentarios!</p>

<p><a href="http://feedads.g.doubleclick.net/~a/WJyPA5159NJchqxGAsW9mSrdLxY/0/da"><img src="http://feedads.g.doubleclick.net/~a/WJyPA5159NJchqxGAsW9mSrdLxY/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/WJyPA5159NJchqxGAsW9mSrdLxY/1/da"><img src="http://feedads.g.doubleclick.net/~a/WJyPA5159NJchqxGAsW9mSrdLxY/1/di" border="0" ismap="true"></img></a></p><img src="http://feeds.feedburner.com/~r/ErrorSegmentationFault/~4/PkERXmcfjIQ" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.segmentationfault.es/2009/11/persistencia-python/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://www.segmentationfault.es/2009/11/persistencia-python/</feedburner:origLink></item>
		<item>
		<title>Instalar Subversion Server en Ubuntu</title>
		<link>http://feedproxy.google.com/~r/ErrorSegmentationFault/~3/vHqrlbyMht8/</link>
		<comments>http://www.segmentationfault.es/2009/11/subversion-server-ubuntu/#comments</comments>
		<pubDate>Wed, 18 Nov 2009 15:07:23 +0000</pubDate>
		<dc:creator>Christopher Vallés</dc:creator>
				<category><![CDATA[Sistemas Operativos]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[comando]]></category>
		<category><![CDATA[subversion]]></category>
		<category><![CDATA[Terminal]]></category>
		<category><![CDATA[ubuntu]]></category>

		<guid isPermaLink="false">http://www.segmentationfault.es/?p=1325</guid>
		<description><![CDATA[Subversion es un sistema de control de versiones ideado para reemplazar al popular CVS. Subversion nos permite entre muchas otras cosas mantener versiones antiguas de ficheros y poder trabajar de manera colaborativa sin pisar el trabajo de otros.

En este tutorial vamos a ver como instalar el servidor de subversion en una maquina ubuntu.]]></description>
			<content:encoded><![CDATA[<p>Subversion es un sistema de control de versiones ideado para reemplazar al popular CVS. Subversion nos permite entre muchas otras cosas mantener versiones antiguas de ficheros y poder trabajar de manera colaborativa sin pisar el trabajo de otros.</p>
<p>En este tutorial vamos a ver como instalar el servidor de subversion en una maquina ubuntu.</p>
<p>Para ello el primer paso es instalar los paquetes necesarios</p>
<pre class="brush: bash;">
sudo apt-get install subversion libapache2-svn subversion-tools
</pre>
<p>Creamos la carpeta para guardar los ficheros</p>
<pre class="brush: bash;">
sudo mkdir /home/&lt;user&gt;/svn
</pre>
<p>Editamos el fichero de configuración</p>
<pre class="brush: bash;">
sudo nano /etc/apache2/mods-enabled/dav_svn.conf
</pre>
<p>Hay que modificar el archivo hasta que se parezca a esto</p>
<pre class="brush: bash;">
# dav_svn.conf - Example Subversion/Apache configuration
#
# For details and further options see the Apache user manual and
# the Subversion book.# &lt;location URL&gt; ... &lt;/location&gt;
# URL controls how the repository appears to the outside world.
# In this example clients access the repository as http://hostname/svn/
&lt;location /svn&gt;
# Uncomment this to enable the repository,
DAV svn
# Set this to the path to your repository
SVNParentPath /home/&lt;user&gt;/svn

# The following allows for basic http authentication.  Basic authentication
# should not be considered secure for any particularly rigorous definition of
# secure.
# to create a passwd file
# # rm -f /etc/apache2/dav_svn.passwd
# # htpasswd2 -c /etc/apache2/dav_svn.passwd dwhedon
# New password:
# Re-type new password:
# Adding password for user dwhedon
# #
# Uncomment the following 3 lines to enable Basic Authentication
 AuthType Basic
 AuthName &quot;Subversion Repository Access&quot;
 AuthUserFile /etc/apache2/dav_svn.passwd
 Require valid-user
# Uncomment the following line to enable Authz Authentication
# AuthzSVNAccessFile /etc/apache2/dav_svn.authz
# The following three lines allow anonymous read, but make
# committers authenticate themselves.
#&lt;limitexcept GET PROPFIND OPTIONS REPORT&gt;
#Require valid-user
#&lt;/limitexcept&gt;
&lt;/location&gt;
</pre>
<p>Creamos el fichero de usuarios y claves</p>
<pre class="brush: bash;">
sudo htpasswd -cm /etc/apache2/dav_svn.passwd &lt;username&gt;
</pre>
<p>Usamos este comando si queremos añadir mas usuarios</p>
<pre class="brush: bash;">
sudo htpasswd /etc/apache2/dav_svn.passwd &lt;another username&gt;
</pre>
<p>Reiniciamos apache</p>
<pre class="brush: bash;">
sudo /etc/init.d/apache2 restart
</pre>
<p>Creamos la carpeta que contendrá el proyecto</p>
<pre class="brush: bash;">
sudo mkdir -p /home/&lt;user&gt;/svn/&lt;project&gt;
</pre>
<p>Creamos el repositorio</p>
<pre class="brush: bash;">
sudo svnadmin create /home/&lt;user&gt;/svn/&lt;project&gt;
</pre>
<p>Conectamos al subversion localmente y creamos las carpetas Trunk, Tags y Branches</p>
<pre class="brush: bash;">
sudo svn mkdir file:///home/&lt;user&gt;/svn/&lt;project&gt;/trunk -m &quot;Trunk&quot;
sudo svn mkdir file:///home/&lt;user&gt;/svn/&lt;project&gt;/tags -m &quot;Tags&quot;
sudo svn mkdir file:///home/&lt;user&gt;/svn/&lt;project&gt;/branches -m &quot;Branches&quot;
</pre>
<p>Otorgamos permisos a apache</p>
<pre class="brush: bash;">
sudo chown -R www-data.www-data /home/&lt;user&gt;/svn
</pre>
<p>Navegamos a la carpeta /etc/init.d, creamos un fichero llamado init-svnserve y lo abrimos con nano para editarlo</p>
<pre class="brush: bash;">
cd /etc/init.d/
sudo touch init-svnserve
sudo nano init-svnserve
</pre>
<p>En el fichero añadimos esta linea</p>
<pre class="brush: bash;">
svnserve -d -r /home/&lt;user&gt;/svn
</pre>
<p>Damos permisos de ejecución al fichero</p>
<pre class="brush: bash;">
sudo chmod +x init-svnserve
</pre>
<p>Actualizamos el arranque del sistema para que detecte el nuevo fichero</p>
<pre class="brush: bash;">
sudo update-rc.d init-svnserve defaults
</pre>
<p>Reiniciamos el servidor y todo funcionando!</p>
<pre class="brush: bash;">
sudo shutdown -r now
</pre>

<p><a href="http://feedads.g.doubleclick.net/~a/99GMms7fM4_Y5_t7RBDSW7YmTvM/0/da"><img src="http://feedads.g.doubleclick.net/~a/99GMms7fM4_Y5_t7RBDSW7YmTvM/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/99GMms7fM4_Y5_t7RBDSW7YmTvM/1/da"><img src="http://feedads.g.doubleclick.net/~a/99GMms7fM4_Y5_t7RBDSW7YmTvM/1/di" border="0" ismap="true"></img></a></p><img src="http://feeds.feedburner.com/~r/ErrorSegmentationFault/~4/vHqrlbyMht8" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.segmentationfault.es/2009/11/subversion-server-ubuntu/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://www.segmentationfault.es/2009/11/subversion-server-ubuntu/</feedburner:origLink></item>
		<item>
		<title>Ubuntu 9.10 (Karmic Koala)</title>
		<link>http://feedproxy.google.com/~r/ErrorSegmentationFault/~3/ZvZg5rgiMCI/</link>
		<comments>http://www.segmentationfault.es/2009/10/ubuntu-9-10-karmi-koala/#comments</comments>
		<pubDate>Thu, 29 Oct 2009 14:55:54 +0000</pubDate>
		<dc:creator>Noemí Losada</dc:creator>
				<category><![CDATA[Sistemas Operativos]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[software libre]]></category>
		<category><![CDATA[ubuntu]]></category>

		<guid isPermaLink="false">http://www.segmentationfault.es/?p=1292</guid>
		<description><![CDATA[Ya está aquí el nuevo Ubuntu Karmic Koala y trae consigo novedades tan interesantes como las que destacamos aquí:
Podemos obtener Ubuntu desde: http://www.ubuntu.com/getubuntu]]></description>
			<content:encoded><![CDATA[<p>Ya está aquí el nuevo <a href="http://www.ubuntu.com/" target="_blank">Ubuntu</a> Karmic Koala y trae consigo novedades tan interesantes como las que destacamos aquí:</p>
<p><a href="http://www.segmentationfault.es/wp-content/2009/10/logo-Ubuntu1.png" rel="shadowbox[post-1292];player=img;"><img class="aligncenter size-full wp-image-1316" title="logo-Ubuntu" src="http://www.segmentationfault.es/wp-content/2009/10/logo-Ubuntu1.png" alt="logo-Ubuntu" width="373" height="97" /></a></p>
<ul>
<li><strong>Ubuntu Software Center</strong> →Substituye a la aplicación &#8220;Agregar y quitar&#8221; del menú Aplicaciones.</li>
<li><strong>Gnome 2.28</strong> → Nueva versión del entorno de escritorio.</li>
<li><strong>Empathy</strong> → El cliente de mensajería Empathy substituye a Pidgin.</li>
<li><strong>Quickly</strong> → Permite a los desarrolladores más facilidades para la creación de aplicaciones en Ubuntu y compartir los archivos a través de paquetes .deb entre otros.</li>
<li><strong>Kernel</strong> → 2.6.31-14.48 <a href="http://kernel.org/">kernel</a> basado en 2.6.31.1.</li>
<li><strong>Grub 2 </strong>→ El gestor de arranque substituye a Grub Legacy. Sólo podremos hacer uso de él desde Karmic Koala y no podremos actualizar desde otras versiones al tratarse de una operación arriesgada.</li>
<li><strong>Ubuntu One → </strong>2Gb de almacenamiento gratuito online y la facilidad de compartir archivos ya sea con ordenadores propios o con los de otros. Por un precio a bajo costo podemos ampliar esta capacidad.</li>
</ul>
<p>Para más información acerca del Ubuntu 9.10 ir a: <a href="http://www.ubuntu.com/products/whatisubuntu/910features" target="_blank">http://www.ubuntu.com/products/whatisubuntu/910features</a></p>
<p>Podemos obtener Ubuntu desde: <a href="http://www.ubuntu.com/getubuntu" target="_blank">http://www.ubuntu.com/getubuntu</a></p>
<p><script src="http://www.ubuntu.com/files/countdown/display.js" type="text/javascript"></script></p>

<p><a href="http://feedads.g.doubleclick.net/~a/d4NiEj5t_-jSs6pQsjjvqizGD0o/0/da"><img src="http://feedads.g.doubleclick.net/~a/d4NiEj5t_-jSs6pQsjjvqizGD0o/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/d4NiEj5t_-jSs6pQsjjvqizGD0o/1/da"><img src="http://feedads.g.doubleclick.net/~a/d4NiEj5t_-jSs6pQsjjvqizGD0o/1/di" border="0" ismap="true"></img></a></p><img src="http://feeds.feedburner.com/~r/ErrorSegmentationFault/~4/ZvZg5rgiMCI" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.segmentationfault.es/2009/10/ubuntu-9-10-karmi-koala/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://www.segmentationfault.es/2009/10/ubuntu-9-10-karmi-koala/</feedburner:origLink></item>
		<item>
		<title>jQuery UI: Efecto acordeón</title>
		<link>http://feedproxy.google.com/~r/ErrorSegmentationFault/~3/i_rh_Eh82bA/</link>
		<comments>http://www.segmentationfault.es/2009/10/jquery-ui-acordeon/#comments</comments>
		<pubDate>Sat, 17 Oct 2009 21:27:11 +0000</pubDate>
		<dc:creator>Noemí Losada</dc:creator>
				<category><![CDATA[Programación]]></category>
		<category><![CDATA[jQuery UI]]></category>
		<category><![CDATA[Curiosidades]]></category>
		<category><![CDATA[efectos visuales]]></category>
		<category><![CDATA[framework]]></category>
		<category><![CDATA[internet]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[librerías]]></category>
		<category><![CDATA[web]]></category>

		<guid isPermaLink="false">http://www.segmentationfault.es/?p=1209</guid>
		<description><![CDATA[Para los que no lo sepáis, jQuery UI es una librería que añade widgets y efectos visuales al framework <a href="http://es.wikipedia.org/wiki/JQuery" target="_blank">jQuery</a>.

Uno de esos widgets es el <strong>acordeón</strong>. Al clicar en los títulos se extienden mostrando el contenido de estos.

Para realizar este efecto nos basaremos en el ejemplo de la propia web de <a href="http://jqueryui.com/" target="_blank">jQuery UI</a> dónde podréis comprobar otros efectos muy interesantes.]]></description>
			<content:encoded><![CDATA[<p>Para los que no lo sepáis, jQuery UI es una librería que añade widgets y efectos visuales al framework <a href="http://es.wikipedia.org/wiki/JQuery" target="_blank">jQuery</a>.</p>
<p>Uno de esos widgets es el <strong>acordeón</strong>. Al clicar en los títulos se extienden mostrando el contenido de estos.</p>
<p>Para realizar este efecto nos basaremos en el ejemplo de la propia web de <a href="http://jqueryui.com/" target="_blank">jQuery UI</a> dónde podréis comprobar otros efectos muy interesantes.</p>
<p>En primer lugar crearemos un documento html en el que añadiremos las diferentes secciones con sus correspondientes títulos y contenidos, nosotros en este ejemplo utilizaremos 3 secciones:</p>
<pre class="brush: xml; toolbar: true;">
&lt;div id=&quot;accordion&quot;&gt;
 &lt;h3&gt;&lt;a href=&quot;#&quot;&gt;Section 1&lt;/a&gt;&lt;/h3&gt;
 &lt;div&gt;
 &lt;p&gt;
 Content
 &lt;/p&gt;
 &lt;/div&gt;
 &lt;h3&gt;&lt;a href=&quot;#&quot;&gt;Section 2&lt;/a&gt;&lt;/h3&gt;
 &lt;div&gt;
 &lt;p&gt;
 Content
 &lt;/p&gt;
 &lt;/div&gt;
 &lt;h3&gt;&lt;a href=&quot;#&quot;&gt;Section 3&lt;/a&gt;&lt;/h3&gt;
 &lt;div&gt;
 &lt;p&gt;
 Content
 &lt;/p&gt;
 &lt;/div&gt;
&lt;/div&gt;
</pre>
<p>Hemos asignado la id &#8220;accordion&#8221; al div principal porque será el que le diremos a JQuery UI que utilice para montar el acordeón. </p>
<p>Para poder hacer uso de las librerías de jQuery el procedimiento es como el que utilizamos en otro post para incluir <a href="http://www.segmentationfault.es/2009/08/listas-ordenadas-scriptaculous/" target="_blank">Prototype y Scriptaculous</a>, la primera es descargarnos las librerías desde la web y llamarlas desde nuestro html y la segunda es incluirlas directamente desde la web oficial.  Nosotros las incluiremos directamente desde la web oficial. </p>
<p>Para ello hay que añadir las siguientes líneas de código:</p>
<pre class="brush: xml; toolbar: true;">
&lt;link rel=&quot;stylesheet&quot; href=&quot;http://ajax.googleapis.com/ajax/libs/jqueryui/1.7.2/themes/redmond/jquery-ui.css&quot; type=&quot;text/css&quot; media=&quot;all&quot; /&gt;
&lt;script type=&quot;text/javascript&quot; charset=&quot;utf-8&quot; src=&quot;http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js&quot;&gt;&lt;/script&gt;
&lt;script type=&quot;text/javascript&quot; charset=&quot;utf-8&quot; src=&quot;http://ajax.googleapis.com/ajax/libs/jqueryui/1.7.2/jquery-ui.min.js&quot;&gt;&lt;/script&gt;
</pre>
<p>La primera línea incluye el estilo visual. En este caso hemos utilizado el estilo &#8220;Redmond&#8221; pero ya veréis que en la web de jQuery UI tenéis mucha variedad y con la posibilidad de modificarlos desde la misma web con una interfaz gráfica.</p>
<p>Por último añadimos el script que coge el div &#8220;<em>accordion</em>&#8221; y llama al método <em>accordion()</em> que es el que monta el acordeón propiamente dicho:</p>
<pre class="brush: xml; toolbar: true;">
&lt;script type=&quot;text/javascript&quot;&gt;
$(function() {
$(&quot;#accordion&quot;).accordion();
});
&lt;/script&gt;
</pre>
<p>Y este es un ejemplo del resultado final:</p>
<link rel="stylesheet" href="http://ajax.googleapis.com/ajax/libs/jqueryui/1.7.2/themes/redmond/jquery-ui.css" type="text/css" media="all" />
<script type="text/javascript" charset="utf-8" src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"></script><br />
<script type="text/javascript" charset="utf-8" src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.7.2/jquery-ui.min.js"></script></p>
<p><script type="text/javascript">
	$(function() {
		$("#accordion").accordion();
	});
	</script></p>
<div id="accordion">
<h3><a href="#">Section 1</a></h3>
<div>
<p>
			Mauris mauris ante, blandit et, ultrices a, suscipit eget, quam. Integer<br />
			ut neque. Vivamus nisi metus, molestie vel, gravida in, condimentum sit<br />
			amet, nunc. Nam a nibh. Donec suscipit eros. Nam mi. Proin viverra leo ut<br />
			odio. Curabitur malesuada. Vestibulum a velit eu ante scelerisque vulputate.
			</p>
</p></div>
<h3><a href="#">Section 2</a></h3>
<div>
<p>
			Sed non urna. Donec et ante. Phasellus eu ligula. Vestibulum sit amet<br />
			purus. Vivamus hendrerit, dolor at aliquet laoreet, mauris turpis porttitor<br />
			velit, faucibus interdum tellus libero ac justo. Vivamus non quam. In<br />
			suscipit faucibus urna.
			</p>
</p></div>
<h3><a href="#">Section 3</a></h3>
<div>
<p>
			Nam enim risus, molestie et, porta ac, aliquam ac, risus. Quisque lobortis.<br />
			Phasellus pellentesque purus in massa. Aenean in pede. Phasellus ac libero<br />
			ac tellus pellentesque semper. Sed ac felis. Sed commodo, magna quis<br />
			lacinia ornare, quam ante aliquam nisi, eu iaculis leo purus venenatis dui.
			</p>
<ul id="lista">
<li style="position:relative;">Lorem</li>
<li style="position:relative;">ipsum</li>
<li style="position:relative;">dolor</li>
<li style="position:relative;">sit</li>
<li style="position:relative;">amet</li>
<li style="position:relative;">consectetur</li>
<li style="position:relative;">adipisci</li>
<li style="position:relative;">velit</li>
</ul></div>
</p></div>

<p><a href="http://feedads.g.doubleclick.net/~a/p2MRHfzm7lpqppOFIM9ZzdG4v0o/0/da"><img src="http://feedads.g.doubleclick.net/~a/p2MRHfzm7lpqppOFIM9ZzdG4v0o/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/p2MRHfzm7lpqppOFIM9ZzdG4v0o/1/da"><img src="http://feedads.g.doubleclick.net/~a/p2MRHfzm7lpqppOFIM9ZzdG4v0o/1/di" border="0" ismap="true"></img></a></p><img src="http://feeds.feedburner.com/~r/ErrorSegmentationFault/~4/i_rh_Eh82bA" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.segmentationfault.es/2009/10/jquery-ui-acordeon/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.segmentationfault.es/2009/10/jquery-ui-acordeon/</feedburner:origLink></item>
	</channel>
</rss><!-- Dynamic page generated in 0.290 seconds. --><!-- Cached page generated by WP-Super-Cache on 2010-03-08 23:05:18 -->
