<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><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/" version="2.0">

<channel>
	<title>Mostofreddy</title>
	
	<link>http://www.mostofreddy.com.ar</link>
	<description />
	<lastBuildDate>Fri, 16 Dec 2011 14:56:19 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/mostofreddy" /><feedburner:info xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" uri="mostofreddy" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item>
		<title>Parábola de los seis sabios ciegos y el elefante</title>
		<link>http://www.mostofreddy.com.ar/parabola-de-los-seis-sabios-ciegos-y-el-elefante-9100.html</link>
		<comments>http://www.mostofreddy.com.ar/parabola-de-los-seis-sabios-ciegos-y-el-elefante-9100.html#comments</comments>
		<pubDate>Fri, 16 Dec 2011 14:56:19 +0000</pubDate>
		<dc:creator>mostofreddy</dc:creator>
				<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://www.mostofreddy.com.ar/?p=9100</guid>
		<description><![CDATA[{lang: 'es-419'} Chusmeando linkedin encontre esta excelente parabola de Muhammed Jalal al-Din Rumi, sufí persa del siglo XIII, es para refleccionar y analizar. “Seis hindúes sabios, inclinados al estudio, quisieron saber qué era un elefante. Como eran ciegos, decidieron hacerlo mediante el sentido del tacto. El primero en llegar junto al elefante, chocó con el [...]]]></description>
			<content:encoded><![CDATA[<!-- Start Shareaholic LikeButtonSetTop Automatic --><!-- End Shareaholic LikeButtonSetTop Automatic --><div name="googleone_share_1" style="position:relative;z-index:5;margin-left: 10px;"><g:plusone size="medium" count="" href="http://www.mostofreddy.com.ar/parabola-de-los-seis-sabios-ciegos-y-el-elefante-9100.html">{lang: 'es-419'}</g:plusone></div><p><a href="http://www.mostofreddy.com.ar/parabola-de-los-seis-sabios-ciegos-y-el-elefante-9100.html/ciegos" rel="attachment wp-att-9101"><img class="aligncenter size-medium wp-image-9101" title="Parábola de los seis sabios ciegos y el elefante " src="http://www.mostofreddy.com.ar/wp-content/uploads/2011/12/ciegos-300x192.jpg" alt="" width="300" height="192" /></a></p>
<p>Chusmeando linkedin encontre esta excelente parabola de Muhammed Jalal al-Din Rumi, sufí persa del siglo XIII, es para refleccionar y analizar.</p>
<p><cite>“Seis hindúes sabios, inclinados al estudio, quisieron saber qué era un elefante. Como eran ciegos, decidieron hacerlo mediante el sentido del tacto. El primero en llegar junto al elefante, chocó con el mismo. Lo notó ancho y duro y dijo:<br />
- Es como una pared.<br />
El segundo palpó el colmillo y gritó:<br />
- ¡Es agudo, redondo y liso! El elefante es como una lanza.<br />
El tercero tocó la trompa y agregó:<br />
- ¡El elefante es como una serpiente!<br />
El cuarto extendió su mano hasta la rodilla del animal:<br />
- Está claro que el elefante es como una columna.<br />
El quinto que casualmente tocó una oreja añadió:<br />
- Pero si es como un abanico.<br />
El último quien tocó la cola acotó:<br />
- El elefante es lo más parecido a una soga.<br />
Así los sabios discutieron por horas, cada uno manteniéndose en su opinión. Todos estaban parcialmente en lo cierto, pero cada uno estaba equivocado”.<br />
¿Cuantas veces nos enceguecemos queriendo tener la razón y no prestando atención a los punto de vista de los demás? ¿Cuánto mas productiva sería la existencia del ser humano si aprendiera a respetar otros puntos de vista? ¿Cuán rica sería nuestra vida si en lugar de discutir con el otro, lo escucháramos y aprendiéramos de sus conocimientos? Bueno les dejo la posta, aportemos herramientas para que todos podamos crecer, respetando los puntos de vista de los demás.</cite></p>
<div class="shr-publisher-9100"></div><!-- Start Shareaholic LikeButtonSetBottom Automatic --><!-- End Shareaholic LikeButtonSetBottom Automatic -->]]></content:encoded>
			<wfw:commentRss>http://www.mostofreddy.com.ar/parabola-de-los-seis-sabios-ciegos-y-el-elefante-9100.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Codigos QR: Que son y para que se usan</title>
		<link>http://www.mostofreddy.com.ar/codigos-qr-que-son-y-para-que-se-usan-9079.html</link>
		<comments>http://www.mostofreddy.com.ar/codigos-qr-que-son-y-para-que-se-usan-9079.html#comments</comments>
		<pubDate>Fri, 18 Nov 2011 13:06:34 +0000</pubDate>
		<dc:creator>mostofreddy</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.mostofreddy.com.ar/?p=9079</guid>
		<description><![CDATA[{lang: 'es-419'}Gracias a la cantidad de smartphones existentes en el mercado, los códigos QR poco a poco se van incorporando a nuestras vidas casi sin darnos cuenta, pero ¿que son?, según la wikipedia &#8220;un código QR (Quick Response Barcode) es un sistema para almacenar información en una matriz de puntos o un código de barras [...]]]></description>
			<content:encoded><![CDATA[<!-- Start Shareaholic LikeButtonSetTop Automatic --><!-- End Shareaholic LikeButtonSetTop Automatic --><div name="googleone_share_1" style="position:relative;z-index:5;margin-left: 10px;"><g:plusone size="medium" count="" href="http://www.mostofreddy.com.ar/codigos-qr-que-son-y-para-que-se-usan-9079.html">{lang: 'es-419'}</g:plusone></div><div id="attachment_9089" class="wp-caption aligncenter" style="width: 310px"><a href="http://www.mostofreddy.com.ar/codigos-qr-que-son-y-para-que-se-usan-9079.html/out" rel="attachment wp-att-9089"><img class="size-medium wp-image-9089 " title="QR werb www.mostofreddy.com.ar" src="http://www.mostofreddy.com.ar/wp-content/uploads/2011/11/out-300x300.png" alt="QR werb www.mostofreddy.com.ar" width="300" height="300" /></a><p class="wp-caption-text">QR de www.mostofreddy.com.ar</p></div>
<p>Gracias a la cantidad de smartphones existentes en el mercado, los códigos QR poco a poco se van incorporando a nuestras vidas casi sin darnos cuenta, pero ¿que son?, según la wikipedia</p>
<p>&#8220;un código QR (Quick Response Barcode) es un sistema para almacenar información en una matriz de puntos o un código de barras bidimensional creado por la compañía japonesa Denso-Wave en 1994; se caracterizan por los tres cuadrados que se encuentran en las esquinas y que permiten detectar la posición del código al lector. La sigla «QR» se derivó de la frase inglesa &#8220;Quick Response&#8221; pues los creadores «Euge Damm y Joaco Retes» aspiraban a que el código permitiera que su contenido se leyera a alta velocidad.&#8221;</p>
<p>Básicamente es una imágen cuadrada dividida en una serie de celdas claras y oscuras y sirven para codificar diversa información, tienen la capacidad de almacenar, con un nivel de redundancia bajo y en un cuadrado de 57 X 57 celdas, hasta 395 caracteres alfanuméricos. En el caso de utilizar un nivel de redundancia alto el número baja a 174 caracteres alfanuméricos.<br />
Aumentando el tamaño de celdas, hasta un cuadrado de 177 X 177, se puede llegar a un máximo de 4.296 caracteres alfanuméricos. El tamaño mínimo es de 21 X 21 celdas, el cual permite con un nivel de redundancia baja codificar hasta 25 caracteres alfanuméricos.</p>
<p>El sistema de redundancia protege el QR code, el cual puede ser restaurado inclusive perdiendo un 30% de la imagen, en caso de generar el QR code con un alto nivel de redundancia. Con un nivel bajo de redundancia se puede restaurar solo un 7%.</p>
<p>Puede ser leído en cualquier sentido, debido a sus puntos de detección.</p>
<p>Sus usos en la vida real son&#8230; ufffff practicamente ilimitados, les dejo un par de videos de ejemplo</p>
<p><strong>Descuentos</strong></p>
<p><a href="http://www.mostofreddy.com.ar/codigos-qr-que-son-y-para-que-se-usan-9079.html"><em>Click here to view the embedded video.</em></a></p>
<p><strong>Educación</strong></p>
<p><a href="http://www.mostofreddy.com.ar/codigos-qr-que-son-y-para-que-se-usan-9079.html"><em>Click here to view the embedded video.</em></a></p>
<p><strong>Compras en supermercados</strong></p>
<p><a href="http://www.mostofreddy.com.ar/codigos-qr-que-son-y-para-que-se-usan-9079.html"><em>Click here to view the embedded video.</em></a></p>
<p><strong>Google Place</strong></p>
<p><a href="http://www.mostofreddy.com.ar/codigos-qr-que-son-y-para-que-se-usan-9079.html"><em>Click here to view the embedded video.</em></a></p>
<p><strong>Blackberry Messenger</strong></p>
<p><a href="http://www.mostofreddy.com.ar/codigos-qr-que-son-y-para-que-se-usan-9079.html"><em>Click here to view the embedded video.</em></a></p>
<p>Y miles y miles mas de usos.</p>
<p>Fuente: <a title="Los QR code" href="http://www.fedaro.info/2010/04/19/los-qr-code/">Fedaro</a> <a title="Codigo QR" href="http://www.codigos-qr.com">Codigo-qr</a></p>
<div class="shr-publisher-9079"></div><!-- Start Shareaholic LikeButtonSetBottom Automatic --><!-- End Shareaholic LikeButtonSetBottom Automatic -->]]></content:encoded>
			<wfw:commentRss>http://www.mostofreddy.com.ar/codigos-qr-que-son-y-para-que-se-usan-9079.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Temple: Sistema de Templates para PHP</title>
		<link>http://www.mostofreddy.com.ar/temple-sistema-de-templates-para-php-9061.html</link>
		<comments>http://www.mostofreddy.com.ar/temple-sistema-de-templates-para-php-9061.html#comments</comments>
		<pubDate>Fri, 02 Sep 2011 08:00:11 +0000</pubDate>
		<dc:creator>mostofreddy</dc:creator>
				<category><![CDATA[Programacion]]></category>
		<category><![CDATA[FlyLabs]]></category>
		<category><![CDATA[FlyPHP]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[templates]]></category>

		<guid isPermaLink="false">http://www.mostofreddy.com.ar/?p=9061</guid>
		<description><![CDATA[{lang: 'es-419'} Este último tiempo estuve comenzando varios proyectitos, uno de ellos es Temple, un Sistema de Templates para PHP. Por el momento no posee mucha funcionalidad, ni esta documentado pero avanza todas las semanas . La idea Temple es muy sencilla, a partir de un html con claves al estilo {{value}} generar un archivo con [...]]]></description>
			<content:encoded><![CDATA[<!-- Start Shareaholic LikeButtonSetTop Automatic --><!-- End Shareaholic LikeButtonSetTop Automatic --><div name="googleone_share_1" style="position:relative;z-index:5;margin-left: 10px;"><g:plusone size="medium" count="" href="http://www.mostofreddy.com.ar/temple-sistema-de-templates-para-php-9061.html">{lang: 'es-419'}</g:plusone></div><p style="text-align: center;"><a class="aligncenter" rel="attachment wp-att-9068" href="http://www.mostofreddy.com.ar/temple-sistema-de-templates-para-php-9061.html/temple"><img class="aligncenter size-full wp-image-9068" title="temple sistema de templates para php" src="http://www.mostofreddy.com.ar/wp-content/uploads/2011/09/temple.png" alt="temple sistema de templates para php" width="565" height="166" /></a></p>
<p>Este último tiempo estuve comenzando varios proyectitos, uno de ellos es <a title="Temple: Sistema de templates para PHP" href="http://github.com/mostofreddy/Temple">Temple</a>, un <strong>Sistema de Templates</strong> para <strong>PHP</strong>. Por el momento no posee mucha funcionalidad, ni esta documentado pero avanza todas las semanas <img src='http://www.mostofreddy.com.ar/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> .</p>
<p>La idea Temple es muy sencilla, a partir de un html con claves al estilo {{value}} generar un archivo con codigo PHP para que luego estas claves sean reemplazadas por valores.</p>
<p>Veamos un pequeño ejemplo de su uso:</p>
<p>Tenemos un archivo template: test.html</p>
<pre class="brush: xml; title: ; notranslate">
Buen dia: {{nombre}}
</pre>
<p>Luego por otro lado tenemos: index.php que es el encargado de instanciar Temple y parsear el html</p>
<pre class="brush: php; title: ; notranslate">
&lt;?php
include_once 'Temple.php';
include_once 'Parser.php';
include_once 'Cache.php';
$temple = new \Temple\Temple();
$params = array('nombre' =&gt; 'Mostofreddy');
$temple-&gt;loadView(__DIR__.'/test', $params);
</pre>
<p>Esto imprimira en pantalla:</p>
<pre class="brush: php; title: ; notranslate">
Buen dia: Mostofreddy
</pre>
<p>Como podemos ver su uso es realmente sencillo y facil de integrar en otros sistemas ya realizados.</p>
<p>Existe una serie de configuraciones:</p>
<p>- <strong>cache</strong>: indica en que carpeta se almacenaran los files procesados<br />
- <strong>useCache</strong> [true|false]: Indica si se usa el archivo anteriomente procesado o en cada peticion se debe procesar nuevamente<br />
- <strong>force</strong>: obligatoriamente se procesa el archivo</p>
<p>Lo pueden descargar desde <a title="Temple: Sistema de templates para PHP" href="https://github.com/mostofreddy/Temple">Github</a></p>
<div class="shr-publisher-9061"></div><!-- Start Shareaholic LikeButtonSetBottom Automatic --><!-- End Shareaholic LikeButtonSetBottom Automatic -->]]></content:encoded>
			<wfw:commentRss>http://www.mostofreddy.com.ar/temple-sistema-de-templates-para-php-9061.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>lightDI – Light Injection Dependency Framework</title>
		<link>http://www.mostofreddy.com.ar/lightdi-light-injection-dependency-framework-9053.html</link>
		<comments>http://www.mostofreddy.com.ar/lightdi-light-injection-dependency-framework-9053.html#comments</comments>
		<pubDate>Thu, 09 Jun 2011 07:49:01 +0000</pubDate>
		<dc:creator>mostofreddy</dc:creator>
				<category><![CDATA[Programacion]]></category>
		<category><![CDATA[lightdi]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://www.mostofreddy.com.ar/?p=9053</guid>
		<description><![CDATA[{lang: 'es-419'}Muuuucho tiempo sin postear, hoy vuelvo con un proyectito que estoy realizando y que ya forma parte de FlyPHP LightDI es un pequeño framework de Inyección de Dependencias realizado en PHP 5.3+ que permite ser integrado en cualquier proyecto (o framework como por ejemplo Zend) de forma rápida y sencilla. ¿Injection Dependency? En forma [...]]]></description>
			<content:encoded><![CDATA[<!-- Start Shareaholic LikeButtonSetTop Automatic --><!-- End Shareaholic LikeButtonSetTop Automatic --><div name="googleone_share_1" style="position:relative;z-index:5;margin-left: 10px;"><g:plusone size="medium" count="" href="http://www.mostofreddy.com.ar/lightdi-light-injection-dependency-framework-9053.html">{lang: 'es-419'}</g:plusone></div><p>Muuuucho tiempo sin postear, hoy vuelvo con un proyectito que estoy realizando y que ya forma parte de <a title="Flyphp flyCore" href="https://github.com/mostofreddy/FlyCore">FlyPHP</a></p>
<p><a title="LightDI" href="https://github.com/mostofreddy/LightDI"><strong>LightDI</strong></a> es un pequeño framework de Inyección de Dependencias realizado en PHP 5.3+ que permite ser integrado en cualquier proyecto (o framework como por ejemplo Zend) de forma rápida y sencilla.</p>
<h2>¿Injection Dependency?</h2>
<p>En forma resumida (porque en <a title="Injection dependency en google" href="http://www.google.com/webhp?hl=en#hl=en&amp;sugexp=ldymls&amp;xhr=t&amp;q=injection+dependency&amp;cp=20&amp;qe=aW5qZWN0aW9uIGRlcGVuZGVuY3k&amp;qesig=abWcuL2swl2wvDQpdD6mkA&amp;pkc=AFgZ2tnwmLOUaxFKkU1HNxk0fI9QBQf0szmFuqcNXlygxLwRcBxKNS4B6SjpTxjL-S9aeHuYrv6W4XagICiSAN2wXl5D0PaF9A&amp;pf=p&amp;sclient=psy&amp;site=webhp&amp;source=hp&amp;aq=0&amp;aqi=&amp;aql=&amp;oq=injection+dependency&amp;pbx=1&amp;fp=77fbd61c592833a0&amp;biw=1280&amp;bih=657">google</a> encontramos miles de artículos que explican muy bien) la Inyección de Dependencia (en inglés Dependency Injection, DI) es un patrón de diseño orientado a objetos, en el que se inyectan objetos a una clase en lugar de ser la propia clase quien cree el objeto.<br />
Existen 3 tipos de inyeccion de dependencias</p>
<ul>
<li> por constructor</li>
<li> por setter</li>
<li> por interfaz</li>
</ul>
<h2>lightDI al rescate =)</h2>
<p>LightDI permite realizar inyección de clases por constructor y por setter mediante los metodos &#8220;any&#8221; o &#8220;factory&#8221;. El primero funciona al estilo Singleton, o sea, la primera invocación a un objecto lo instancia y guarda su referencia para las posteriores invocaciones no tener que instanciarlo nuevamente. El segundo devuelve siempre una instancia nueva del objeto pedido.</p>
<p>El metodo &#8220;any&#8221; es de mucha utilidad para controlar el ciclo de vida de los objetos y la cantidad de instancias de objetos de base de datos, de web service, de sessiones, etc.</p>
<p>Ahora bien, para que estos metodos sepan como construir cada objeto y sus dependencias hay que crear una serie de metodos &#8220;factories&#8221; con la lógica necesaria para su instanciación. Veamos un ejemplo:</p>
<pre class="brush: php; title: ; notranslate">
$inj = \LightDI\Injector::getInstance();
/**
 * Factory para la clase ClaseDemo2
 */
$inj-&gt;claseDemo2 = function () {
    $obj = new ClaseDemo2();
    $obj-&gt;dato = 'm2';
    return $obj;
};
/**
 * Factory para la clase ClaseDemo1
 */
$inj-&gt;claseDemo1Factory = function ($inj) {
    //primero creamos la dependencia y se la pasamos al constructor
    $objDemo2 = $inj-&gt;any('ClaseDemo2');
    $obj = new ClaseDemo1($objDemo2);
    return $obj;
};
</pre>
<p>Como vemos en el ejemplo, la logica para la instanciación de cada clase se define mediante funciones lambdas. Luego para invocarlas</p>
<pre class="brush: php; title: ; notranslate">
$objTest = $inj-&gt;any('claseDemo1Factory');
var_dump($objTest);
</pre>
<p>En posteriores post ire profundizando un poco mas sobre este framework. Espero que les sea útil.</p>
<div class="shr-publisher-9053"></div><!-- Start Shareaholic LikeButtonSetBottom Automatic --><!-- End Shareaholic LikeButtonSetBottom Automatic -->]]></content:encoded>
			<wfw:commentRss>http://www.mostofreddy.com.ar/lightdi-light-injection-dependency-framework-9053.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Tutorial Erlang III: Integers, floats, booleans, atoms</title>
		<link>http://www.mostofreddy.com.ar/tutorial-erlang-iii-integers-floats-booleans-9036.html</link>
		<comments>http://www.mostofreddy.com.ar/tutorial-erlang-iii-integers-floats-booleans-9036.html#comments</comments>
		<pubDate>Fri, 27 May 2011 05:10:45 +0000</pubDate>
		<dc:creator>mostofreddy</dc:creator>
				<category><![CDATA[Programacion]]></category>
		<category><![CDATA[Erlang]]></category>

		<guid isPermaLink="false">http://www.mostofreddy.com.ar/?p=9036</guid>
		<description><![CDATA[{lang: 'es-419'}Retomando el tutorial de Erlang hoy trataré de explicar algunos tipos de datos de este lenguaje, veremos como Erlang maneja los enteros, floats y booleanos. Manos a la obra! Integers Este tipo de dato se utiliza para todo el conjunto de numeros enteros sin importar su tamaño. Pueden ser negativos o positivos y estar [...]]]></description>
			<content:encoded><![CDATA[<!-- Start Shareaholic LikeButtonSetTop Automatic --><!-- End Shareaholic LikeButtonSetTop Automatic --><div name="googleone_share_1" style="position:relative;z-index:5;margin-left: 10px;"><g:plusone size="medium" count="" href="http://www.mostofreddy.com.ar/tutorial-erlang-iii-integers-floats-booleans-9036.html">{lang: 'es-419'}</g:plusone></div><p>Retomando el tutorial de Erlang hoy trataré de explicar algunos tipos de datos de este lenguaje, veremos como Erlang maneja los enteros, floats y booleanos. Manos a la obra!</p>
<h2>Integers</h2>
<p>Este tipo de dato se utiliza para todo el conjunto de numeros enteros sin importar su tamaño. Pueden ser negativos o positivos y estar expresados en distintas bases.</p>
<p>No posee una cantida de bits fija ni un rango específico de valores como en otros lenguajes, por lo tanto, podemos escribir números con la cantidad de cifras que querramos y operar entre ellas <strong>sin provocar overflow</strong>.</p>
<p>Esto se debe a que Erlang internamente, cuando un entero no se puede representar en una palabra, utiliza lo que se conoce como <strong>bignums</strong>, representando al entero en un número  arbitrario de palabras haciendo su representación un poco menos eficiente. El único límite para el largo de los integers depende de la maquina.</p>
<p><strong>Ejemplos</strong></p>
<pre class="brush: erlang; title: ; notranslate">
-4560
0
666
999999999999999
</pre>
<p><strong>Ejemplos 2 con números en otra base</strong></p>
<pre class="brush: erlang; title: ; notranslate">
&gt; 2#1011.
&gt; 11
&gt; 16#A
&gt;10
</pre>
<h2>Floats</h2>
<p>Los tipos de datos Floats son usados para representar números Reales.</p>
<p><strong>Ejemplos</strong></p>
<pre class="brush: erlang; title: ; notranslate">
&gt; 1.02.
1.02
&gt; 5698.12.
5698.12
</pre>
<h2>Atoms</h2>
<p>Los datos del tipo atoms son usados para representar valores constantes no-numéricos. En Erlang todos los Atoms son globales, comienzan con letra en minúsculas seguidos por una secuenca de carácteres alfanumericos, caracter underscore (_) o arrobas (@). Por ejemplo: junio, true, taza, mimail@dominio.com, etc.</p>
<p>Los Atoms también pueden estar delimitados por comillas simples cuando contienen caracteres no validos como espacios o que comiencen con mayúsculas. Por ejemplo &#8216;Diciembre&#8217;, &#8216;hoy es un lindo dia&#8217;, etc.</p>
<p>Algo a tener en cuenta es que las únicas operaciones que se pueden realizar con los Atoms en Erlang son las comparaciones.</p>
<h2>Booleans</h2>
<p>En Erlang no existen en si los tipos de datos booleanos, sino que son representados mediente los Atoms <em><strong>true</strong></em> y <em><strong>false</strong></em>. Estos son los valores que devuelven por ejemplo las comparaciones</p>
<pre class="brush: erlang; title: ; notranslate">
1&gt; 2 == 1 .
false
2&gt; a &gt; z .
false
3&gt; less &gt; more .
false
4&gt; is_boolean(true) .
true
</pre>
<p>Existen otros tipos de datos como las tuplas, listas o strings pero lo veremos en más detalle en otro post.</p>
<div class="shr-publisher-9036"></div><!-- Start Shareaholic LikeButtonSetBottom Automatic --><!-- End Shareaholic LikeButtonSetBottom Automatic -->]]></content:encoded>
			<wfw:commentRss>http://www.mostofreddy.com.ar/tutorial-erlang-iii-integers-floats-booleans-9036.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Crear extensiones de PHP (I)</title>
		<link>http://www.mostofreddy.com.ar/crear-extensiones-de-php-i-9007.html</link>
		<comments>http://www.mostofreddy.com.ar/crear-extensiones-de-php-i-9007.html#comments</comments>
		<pubDate>Wed, 04 May 2011 11:00:31 +0000</pubDate>
		<dc:creator>mostofreddy</dc:creator>
				<category><![CDATA[Programacion]]></category>
		<category><![CDATA[Performance]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://www.mostofreddy.com.ar/?p=9007</guid>
		<description><![CDATA[{lang: 'es-419'}Luego de estar un tiempo sin postear en el blog, vuelvo con una serie de post relacionados con la creación de extensiones para PHP. Crear extensiones de PHP no es un tema muy popular entre los desarrolladores web, siempre usamos extensiones creadas por los demás pero ¿a nadie le pico el bichito de saber [...]]]></description>
			<content:encoded><![CDATA[<!-- Start Shareaholic LikeButtonSetTop Automatic --><!-- End Shareaholic LikeButtonSetTop Automatic --><div name="googleone_share_1" style="position:relative;z-index:5;margin-left: 10px;"><g:plusone size="medium" count="" href="http://www.mostofreddy.com.ar/crear-extensiones-de-php-i-9007.html">{lang: 'es-419'}</g:plusone></div><p>Luego de estar un tiempo sin postear en el blog, vuelvo con una serie de post relacionados con la creación de extensiones para PHP.</p>
<p><strong>Crear extensiones de PHP</strong> no es un tema muy popular entre los desarrolladores web, siempre usamos extensiones creadas por los demás pero ¿a nadie le pico el bichito de saber como crear una propia?</p>
<p>¡A mi! y la verdad que no es nada complicado hacer una.</p>
<h2><strong>Que ventaja brinda una extensión</strong></h2>
<p>Principalmente rapidez, al estar escrita en C y correr en el núcleo de PHP su rendiemiento es mucho mayor.</p>
<p>Existen dos timpos de extensiones:  <strong>extensiones PHP</strong> y <strong>extensiones Zend</strong>. Las primeras agregan funcionalidad al lenguaje (por ejemplo Mysqli) y las segundas son extensiones de bajo nivel que modifican el núcleo del lenguaje (por ejemplo xdebug, APC).</p>
<h2><strong>Lo que necesitamos<br />
</strong></h2>
<p>Primero debemos instalar las herramientas para trabajar con C (bueno, también podemos escribir la extension en C++ pero ese será otro post) y alguna otra más:</p>
<pre class="brush: bash; title: ; notranslate">
sudo apt-get install libc6-dev
sudo apt-get install gcc
sudo apt-get install autoconf
sudo apt-get install automake
sudo apt-get install libtool
sudo apt-get install bison
sudo apt-get install flex
sudo apt-get install re2x
</pre>
<p>Obviamente que tambien debes tener instalado una versión de PHP (5.2+).</p>
<h2><strong>Como la creamos</strong></h2>
<p>Cada extensión posee al menos los siguientes archivos</p>
<p>- config.m4 es el archivo de configuración para la compilación, indica que archivos se deben compilar y que librerías externas se necesitan</p>
<p>- php_miLibreria.h y miLibreria.c son los archivos de código/funcionalidad de la extensión.</p>
<h2><strong>Veamos un ejemplo</strong></h2>
<p>Como ejemplo crearemos una extensión &#8220;<strong>fredddy</strong>&#8221; que provea una función llamada <strong>freddy_hola</strong> a PHP y que imprime un simple saludo<strong><br />
</strong></p>
<p><strong>config.m4</strong></p>
<pre class="brush: php; title: ; notranslate">

PHP_ARG_ENABLE(freddy,
[Whether to enable the &quot;freddy&quot; extension],
[  --enable-freddy       Enable &quot;freddy&quot; extension support])

if test $PHP_FREDDY != &quot;no&quot;; then
PHP_SUBST(FREDDY_SHARED_LIBADD)
PHP_NEW_EXTENSION(freddy, freddy.c, $ext_shared)
fi
</pre>
<p>Lo anterior es la mínima configuración necesaria que necesita la extensión, veamos de que trata:</p>
<ul>
<li>El primer parámetro de PHP_ARG_ENABLE setea en ./configure una opción llamada -enable-freddy</li>
<li>El segundo parámetro de PHP_ARG_ENABLE se mostrara durante el proceso de configuración, indicando que se habilito la extensión</li>
<li>El tercer parámetro de PHP_ARG_ENABLE se mostrara si se visualiza la ayuda de ./configure (./configure -help)</li>
<li>Para la compilación se deben seguir 3 pasos: phpize, ./configure -enable-freddy, make</li>
<li>Cuando se invoca a ./configure -enable-freddy se crea una variable  local llamada PHP_FREDDY y se setea en &#8216;yes&#8217;</li>
<li>PHP_SUBST es un macro similar a AC_SUBST() de C y es necesaria para crear la extensión</li>
<li>PHP_NEW_EXTENSION declara el módulo y el archivo fuente para la compilacion. $ext_shared es similar a PHP_SUBST y es necesaria para crear la extensión como modulo</li>
</ul>
<p>Si la extensión contara con mas de un archivo fuente para la compilación se deben definir todos en PHP_NEW_EXTENSION separados por un espacio  (por ejempo: PHP_NEW_EXTENSION(freddy2, file1.c file2.c file3.c, $ext_sared)</p>
<p><strong>php_freddy.h</strong></p>
<p>Este archivo es el header del archivo .c que crearemos luego</p>
<pre class="brush: cpp; title: ; notranslate">

#ifndef PHP_FREDDY_H
/* Prevenimos la doble inclucion */
#define PHP_FREDDY_H

/* Definimos las propiedades de la extension */
#define PHP_FREDDY_EXTNAME &quot;freddy&quot;
#define PHP_FREDDY_EXTVER &quot;0.1&quot;

/* Import configure options
 * when building outside of the
 * PHP source tree */
#ifdef HAVE_CONFIG_H
#include &quot;config.h&quot;
#endif

/* Incluimos el header estandard de PHP */
#include &quot;php.h&quot;
/*
 * define the entry point symbole
 * Zend will use when loading this module
 */
extern zend_module_entry freddy_module_entry;
#define phpext_freddy_ptr &amp;freddy_module_entry

#endif /* PHP_FREDDY_H */
</pre>
<ul>
<li>config.h es incluido cuando se compila con phpize</li>
<li>Se incluye php.h que provee funcionalidades para usar en nuestra extension</li>
<li>zend_module_entry defina una estructura usada por Zend engine</li>
</ul>
<p><strong>freddy.c</strong></p>
<pre class="brush: cpp; title: ; notranslate">

#include &quot;php_freddy.h&quot;

PHP_FUNCTION(freddy_hola)
{
php_printf(&quot;Hola FreddY!!&quot;);
}

static function_entry php_freddy_functions[] = {
PHP_FE(freddy_hola, NULL)
{ NULL, NULL, NULL }
};

zend_module_entry freddy_module_entry = {
#if ZEND_MODULE_API_NO &gt;= 20010901
STANDARD_MODULE_HEADER,
#endif
PHP_FREDDY_EXTNAME,
php_freddy_functions, /* Functions */
NULL, /* MINIT */
NULL, /* MSHUTDOWN */
NULL, /* RINIT */
NULL, /* RSHUTDOWN */
NULL, /* MINFO */
#if ZEND_MODULE_API_NO &gt;= 20010901
    PHP_FREDDY_EXTVER,
#endif
    STANDARD_MODULE_PROPERTIES
};

#ifdef COMPILE_DL_FREDDY
    ZEND_GET_MODULE(freddy)
#endif
</pre>
<h2><strong>Compilación</strong></h2>
<p>Ya tenemos todo listo para compilar nuestra primera extensión de PHP, para ello debemos hacer lo siguiente</p>
<pre class="brush: bash; title: ; notranslate">

phpize

./configure -enable-freddy

make
</pre>
<p>Se abra creado una carpeta llamada modules con el archivo freddy.so, este es el archivo de nuestra extensión y el que debemos cargar en PHP</p>
<pre class="brush: bash; title: ; notranslate">

touch /etc/php5/apache2/conf.d/freddy.ini

vim /etc/php5/apache2/conf.d/freddy.ini
</pre>
<p>Agregamos el siguiente código y reiniciamos apache</p>
<pre class="brush: bash; title: ; notranslate">

[freddy]
extension=/var/www/extensiones/freddy/modules/freddy.so
</pre>
<h2><strong>Listo!</strong></h2>
<p>Podemos crear un archivo php para ver como funciona el ejemplo</p>
<pre class="brush: php; title: ; notranslate">

&lt;?php
echo freddy_hola();
</pre>
<p>De a poco seguire subiendo más post y agregando nuevos conceptos de como crear extensiones para PHP.</p>
<p>Espero que les sea de utilidad.</p>
<div class="shr-publisher-9007"></div><!-- Start Shareaholic LikeButtonSetBottom Automatic --><!-- End Shareaholic LikeButtonSetBottom Automatic -->]]></content:encoded>
			<wfw:commentRss>http://www.mostofreddy.com.ar/crear-extensiones-de-php-i-9007.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Instalar y configurar memcached</title>
		<link>http://www.mostofreddy.com.ar/instalar-y-configurar-memcached-8993.html</link>
		<comments>http://www.mostofreddy.com.ar/instalar-y-configurar-memcached-8993.html#comments</comments>
		<pubDate>Wed, 13 Apr 2011 18:47:13 +0000</pubDate>
		<dc:creator>mostofreddy</dc:creator>
				<category><![CDATA[Programacion]]></category>
		<category><![CDATA[cache]]></category>
		<category><![CDATA[Memcache]]></category>
		<category><![CDATA[Optimizacion]]></category>

		<guid isPermaLink="false">http://www.mostofreddy.com.ar/?p=8993</guid>
		<description><![CDATA[{lang: 'es-419'} Memcache, un sistema de cache distribuido, que se aloja en memoria y es de proposito general. La idea es almacenar en memoria cadenas de bytes (strings) que ya fueron procesados para no procesarlos nuevamente. Por ejemplo, cachear resultados de queries, compartir datos entre servidores, utilizarlo como almacenamiento de sessiones, etc. Hay que tener [...]]]></description>
			<content:encoded><![CDATA[<!-- Start Shareaholic LikeButtonSetTop Automatic --><!-- End Shareaholic LikeButtonSetTop Automatic --><div name="googleone_share_1" style="position:relative;z-index:5;margin-left: 10px;"><g:plusone size="medium" count="" href="http://www.mostofreddy.com.ar/instalar-y-configurar-memcached-8993.html">{lang: 'es-419'}</g:plusone></div><p style="text-align: center;"><a class="aligncenter" rel="attachment wp-att-8996" href="http://www.mostofreddy.com.ar/instalar-y-configurar-memcached-8993.html/memcache"><img class="aligncenter size-full wp-image-8996" title="memcache" src="http://www.mostofreddy.com.ar/wp-content/uploads/2011/04/memcache.jpg" alt="memcache" width="574" height="106" /></a></p>
<p><a title="Memcached" href="http://memcached.org/">Memcache</a>, un sistema de cache distribuido, que se aloja en memoria y es de proposito general. La idea es almacenar en memoria cadenas de bytes (strings) que ya fueron procesados para no procesarlos nuevamente.</p>
<p>Por ejemplo, cachear resultados de queries, compartir datos entre servidores, utilizarlo como almacenamiento de sessiones, etc.</p>
<p>Hay que tener en cuenta que estos datos son <strong>almacenados en memoria RAM</strong>, la cual es <strong>volátil</strong> y si apagamos el servidor o el deamon de memcached estos datos se <strong>perderan</strong>! (siempre hay que tener un plan de contingencia para levantar rápidamente los datos a memcache una vez reiniciado el server)</p>
<p>Su funcionamiento es sencillo, a cada item que se desea cachear se almacenan en una tabla hash, al cual se le asigna una clave para su posterior recuperacion. Todos estos datos se almacenan donde su estructura llamada slabs. Los slab tienen tamaño variable para optimizar el espacio en memoria, pero su tamaño mayor es de 1mb, por lo cual, este es el tamaño mas grande que se puede almacenar.</p>
<p>Tambien para cada item almacenado, memcached permite controlar su tiempo de vida (es independiente para cada item), una vez finalizado memcache lo elimina.</p>
<p>Otra de las caracteristicas de memcache es la escalabilidad, podemos contar con un pool de servidores en distintas (o no) maquinas para soportar una cantidad elevada de peticiones concurrentes.</p>
<p><strong>Instalación</strong></p>
<p>Para instalar en ubuntu basta con</p>
<pre class="brush: bash; title: ; notranslate">
sudo apt-get install memcached
</pre>
<p><strong>Configuración</strong></p>
<p>Si usamos apt-get para instalar memcache encontraremos en la carpeta /usr/share/memcached un archivo llamado memcached.conf.default con un ejemplo de archivo de configuracion. El archivo real se encuentra en /etc/memcached.conf.</p>
<p>Los parametros que se pueden configurar son los siguientes:</p>
<p><strong>-m</strong> indica a memcache cuanta memoria utilizar para almacenar los items (default 64mb)<br />
<strong> -d </strong>indica a memcache que se ejecute como deamon<br />
<strong> -v </strong>el clasico verbose<br />
<strong> -vv</strong> verbose mas completo<br />
<strong> -vvv</strong> verbose muuuuuucho mas completo<br />
<strong> -p</strong> puerto por el cual memcache escucha (default 11211)<br />
<strong>-l</strong> ip por el cual se comunica memecache (default 127.0.0.1)<br />
<strong> -c</strong> cantidad maxima de conexiones simultaneas (default 1024)<br />
<strong> -u</strong> indica con que usuario correra memcache (default root)<br />
<strong> logfile</strong> path para el archivo log</p>
<div class="shr-publisher-8993"></div><!-- Start Shareaholic LikeButtonSetBottom Automatic --><!-- End Shareaholic LikeButtonSetBottom Automatic -->]]></content:encoded>
			<wfw:commentRss>http://www.mostofreddy.com.ar/instalar-y-configurar-memcached-8993.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Clip – trabajando desde linea de comando con PHP</title>
		<link>http://www.mostofreddy.com.ar/clip-trabajando-desde-linea-de-comando-con-php-8986.html</link>
		<comments>http://www.mostofreddy.com.ar/clip-trabajando-desde-linea-de-comando-con-php-8986.html#comments</comments>
		<pubDate>Fri, 08 Apr 2011 05:32:07 +0000</pubDate>
		<dc:creator>mostofreddy</dc:creator>
				<category><![CDATA[Programacion]]></category>
		<category><![CDATA[Clip]]></category>
		<category><![CDATA[FlyLabs]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://www.mostofreddy.com.ar/?p=8986</guid>
		<description><![CDATA[{lang: 'es-419'}Clip es un nuevo proyecto que estoy comenzando que facilita la creación de script PHP para correrlos desde la shell o línea de comando. La funcionalidad que esta implementada hasta ahora es la siguiente: - Recupera los parámetros de entrada del script. - Identifica el SO que se utiliza y usa los comandos adecuados [...]]]></description>
			<content:encoded><![CDATA[<!-- Start Shareaholic LikeButtonSetTop Automatic --><!-- End Shareaholic LikeButtonSetTop Automatic --><div name="googleone_share_1" style="position:relative;z-index:5;margin-left: 10px;"><g:plusone size="medium" count="" href="http://www.mostofreddy.com.ar/clip-trabajando-desde-linea-de-comando-con-php-8986.html">{lang: 'es-419'}</g:plusone></div><p><a title="Project Clip GitHub" href="https://github.com/mostofreddy/Clip">Clip</a> es un nuevo proyecto que estoy comenzando que facilita la creación de script <a title="PHP" href="http://www.php.net">PHP</a> para correrlos desde la shell o línea de comando.</p>
<p>La funcionalidad que esta implementada hasta ahora es la siguiente:</p>
<p>- Recupera los parámetros de entrada del script.<br />
- Identifica el SO que se utiliza y usa los comandos adecuados para cada SO.<br />
- Funcionalidad para imprimir y recuperar datos desde la consola.<br />
- Permite cambiar de color y fondo a los datos que se imprimen en la consola.<br />
- Validación automatica de los parametros de entrada.<br />
- Invocación al método help cuando se usa -h o —help como parámetro.<br />
- Invocación al método version cuando se usa —version como parámetro.</p>
<p><strong>Veamos unos ejemplos de su uso: </strong>(el ejemplo completo se puede ver en <a title="Clip - demo" href="https://github.com/mostofreddy/Clip/blob/master/demo/test.php">github</a>)<strong><br />
</strong></p>
<p><strong>1) Imprimir la típica ayuda de los scripts de shell cuando ponemos -h o &#8211;help</strong></p>
<p>Para esto debemos crear una clase que extienda de \Clip (sisi, usa namespaces de PHP 5.3+)</p>
<pre class="brush: php; title: ; notranslate">
#!/usr/bin/php
&lt;?php
class Test extends \Clip\Clip
{
    protected $name = '';

    protected function help()
    {
        $this-&gt;writer()-&gt;write('Esta es la ayuda');
    }
}
$test = new Test();
</pre>
<p>Luego abrimos una consola y ponemos</p>
<pre class="brush: bash; title: ; notranslate">
&gt; ./test.php -h
&gt; Esta es la ayuda
</pre>
<p><strong>2) Mostrar la versión de nuestro script</strong></p>
<pre class="brush: php; title: ; notranslate">
    protected function version()
    {
        $this-&gt;writer()-&gt;write('Esta es la version');
    }
</pre>
<pre class="brush: bash; title: ; notranslate">
&gt; ./test.php -version
&gt; Esta es la version
</pre>
<p><strong>3) Perdir datos al usuario</strong></p>
<pre class="brush: php; title: ; notranslate">
    public function getName()
    {
        $this-&gt;name = $this-&gt;writer()-&gt;prompt('Escribi tu nombre por favor', null, null, true);
        $this-&gt;writer()-&gt;newLine();
    }
</pre>
<p><strong>4) Validar los datos de entrada</strong></p>
<p>Para validar los datos de entrada hay que crear un método que se llame <strong><em>validate</em></strong> que recibe como parametro un objeto del tipo <em><strong>\Clip\ClipOpts</strong></em>. Este objeto tiene 3 atributos:</p>
<p>- <em>short</em>: son las opciones que constan de una sola letra.<br />
- <em>long</em>: son los parámetros del tipo &#8211;key o &#8211;key=valor.<br />
- <em>input</em>: son los demás parámetros.</p>
<p>Por ejemplo:</p>
<pre class="brush: php; title: ; notranslate">
    protected function validate(\Clip\ClipOpts $opts)
    {
        if (!in_array('v', $opts-&gt;short)) {
            return &quot;Error: Debe agregar la opcion 'v'&quot;;
        }
        return true;
    }
</pre>
<p>Para ver el mensaje de error, usamos el script así</p>
<pre class="brush: bash; title: ; notranslate">
./test.php -t --clave=valor /home/Bart
&gt; Error: Debe agregar la opcion 'v'
</pre>
<p>En cambio si se invoca de alguna de las siguientes nameras no mostrará el error</p>
<pre class="brush: bash; title: ; notranslate">
./test.php -v --clave=valor /home/Bart
./test.php -vt --clave=valor /home/Bart
</pre>
<p>Espero que les sea de utilidad!</p>
<div class="shr-publisher-8986"></div><!-- Start Shareaholic LikeButtonSetBottom Automatic --><!-- End Shareaholic LikeButtonSetBottom Automatic -->]]></content:encoded>
			<wfw:commentRss>http://www.mostofreddy.com.ar/clip-trabajando-desde-linea-de-comando-con-php-8986.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Instalar Firefox 4.0 en Ubuntu</title>
		<link>http://www.mostofreddy.com.ar/instalar-firefox-4-0-en-ubuntu-7905.html</link>
		<comments>http://www.mostofreddy.com.ar/instalar-firefox-4-0-en-ubuntu-7905.html#comments</comments>
		<pubDate>Fri, 25 Mar 2011 13:10:26 +0000</pubDate>
		<dc:creator>mostofreddy</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Firefox]]></category>
		<category><![CDATA[Ubuntu]]></category>

		<guid isPermaLink="false">http://www.mostofreddy.com.ar/?p=7905</guid>
		<description><![CDATA[{lang: 'es-419'} Update 25/03/2011 La gente de Firefox lanzó hace unos días la version estable de Firefox 4. Instalarla en Ubuntu es muy fácil. He decidido a probar la nueva versión de Firefox (firefox 4.0) y la verdad que me lleve unas agradables sorpresas. La primera es que no desinstalo la version que tenía previamente instalada (en mi [...]]]></description>
			<content:encoded><![CDATA[<!-- Start Shareaholic LikeButtonSetTop Automatic --><!-- End Shareaholic LikeButtonSetTop Automatic --><div name="googleone_share_1" style="position:relative;z-index:5;margin-left: 10px;"><g:plusone size="medium" count="" href="http://www.mostofreddy.com.ar/instalar-firefox-4-0-en-ubuntu-7905.html">{lang: 'es-419'}</g:plusone></div><p style="text-align: center;"><a class="aligncenter" rel="attachment wp-att-8973" href="http://www.mostofreddy.com.ar/instalar-firefox-4-0-en-ubuntu-7905.html/firefox4"><img class="aligncenter size-full wp-image-8973" title="firefox4" src="http://www.mostofreddy.com.ar/wp-content/uploads/2010/09/firefox41.jpg" alt="" width="599" height="217" /></a></p>
<p style="text-align: left;"><strong>Update</strong> 25/03/2011</p>
<p style="text-align: left;">La gente de <a title="Mozilla Firefox 4" href="http://www.mozilla.com/es-ES/firefox/">Firefox</a> lanzó hace unos días la version estable de <a title="Mozilla Firefox 4" href="http://www.mozilla.com/es-ES/firefox/">Firefox 4</a>. Instalarla en Ubuntu es muy fácil.<span style="font-family: Consolas, Monaco, 'Courier New', Courier, monospace; line-height: 18px; white-space: pre;"> </span></p>
<pre class="brush: bash; title: ; notranslate">

sudo add-apt-repository ppa:mozillateam/firefox-stable
sudo apt-get update
sudo apt-get install firefox
</pre>
<p style="text-align: center;">
<p>He decidido a probar la nueva versión de <strong><a title="Mozilla Firefox" href="http://www.getfirefox.com">Firefox</a></strong> (<strong>firefox 4.0</strong>) y la verdad que me lleve unas agradables sorpresas.</p>
<p>La primera es que <strong>no desinstalo</strong> la version que tenía previamente instalada (en mi caso Firefox 3.6) permitiendo que ambas convivan sin inconvenientes, lo cual es grandioso si se produce algun fallo, la segunda sorpresa es su <strong>velocidad</strong>, realmente se nota la diferencia de velocidad entre versiones (la gente de Mozilla esta trabajando muy bien <img src='http://www.mostofreddy.com.ar/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> ),  otra sorpresa es que tomo por defecto los plugins de flash y java (por suerte!) y por ultimo es que se puede instalar desde los <strong>repositorios</strong> de mozilla agregando su ppa.</p>
<p>La única contra es su interfaz, aún no esta lo suficientemente pulida, esperemos que la versión final este mejor.</p>
<p>En cuanto a los plugins, lamentablemente muchos no funcionaron, supongo que sera cuestion de tiempo para que se vayan integrando a esta nueva versión.</p>
<p>Si sos desarrollador web y usas Firebug tendrás que descargar la versión <a title="Firebug 1.7a2 " href="http://blog.getfirebug.com/2010/09/10/firebug-1-7a2/">1.7a2</a>, es un alfa aun pero funciona correctamente en Firefox 4</p>
<pre class="brush: bash; title: ; notranslate">
sudo add-apt-repository ppa:ubuntu-mozilla-daily/ppa
sudo apt-get update
sudo apt-get install firefox-4.0
</pre>
<p style="text-align: left;">Les dejo un video de algunos features de Firefox 4</p>
<p style="text-align: center;"><p><a href="http://www.mostofreddy.com.ar/instalar-firefox-4-0-en-ubuntu-7905.html"><em>Click here to view the embedded video.</em></a></p></p>
<div class="shr-publisher-7905"></div><!-- Start Shareaholic LikeButtonSetBottom Automatic --><!-- End Shareaholic LikeButtonSetBottom Automatic -->]]></content:encoded>
			<wfw:commentRss>http://www.mostofreddy.com.ar/instalar-firefox-4-0-en-ubuntu-7905.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Calidad de software en PHP (III) – PHP CodeSniffer</title>
		<link>http://www.mostofreddy.com.ar/calidad-de-software-en-php-iii-%e2%80%93-php-codesniffer-859.html</link>
		<comments>http://www.mostofreddy.com.ar/calidad-de-software-en-php-iii-%e2%80%93-php-codesniffer-859.html#comments</comments>
		<pubDate>Thu, 24 Mar 2011 00:00:54 +0000</pubDate>
		<dc:creator>mostofreddy</dc:creator>
				<category><![CDATA[Programacion]]></category>
		<category><![CDATA[Optimizacion]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[php codesniffer]]></category>

		<guid isPermaLink="false">http://www.mostofreddy.com.ar/?p=859</guid>
		<description><![CDATA[{lang: 'es-419'}Update: 23/03/2011 Fue lanzada la version 1.3.0 con soporte para closures, namespaces, __invoke, etc (ver changelog) PHP CodeSniffer es un script realmente práctico y fundamental para estandarizar la codificación de una empresa o en nuestra casa. El script valida la sintaxis de nuestro código PHP contra un estandar definido, este puede ser el de [...]]]></description>
			<content:encoded><![CDATA[<!-- Start Shareaholic LikeButtonSetTop Automatic --><!-- End Shareaholic LikeButtonSetTop Automatic --><div name="googleone_share_1" style="position:relative;z-index:5;margin-left: 10px;"><g:plusone size="medium" count="" href="http://www.mostofreddy.com.ar/calidad-de-software-en-php-iii-%e2%80%93-php-codesniffer-859.html">{lang: 'es-419'}</g:plusone></div><p><strong>Update:</strong> 23/03/2011</p>
<p>Fue lanzada la version 1.3.0 con soporte para closures, namespaces, __invoke, etc (<a title="PHP Code Sniffer 1.3.0" href="http://pear.php.net/package/PHP_CodeSniffer/download/">ver changelog</a>)</p>
<p><a title="PHP CodeSniffer" href="http://pear.php.net/package/PHP_CodeSniffer/redirected">PHP CodeSniffer</a> es un script realmente práctico y fundamental para estandarizar la codificación de una empresa o en nuestra casa. El script valida la sintaxis de nuestro código PHP contra un estandar definido, este puede ser el de Zend, Pear o alguno propio que definamos.</p>
<p>Para su instalación debemos tener instalado Pear.</p>
<pre class="brush: bash; title: ; notranslate">

sudo pear install PHP_CodeSniffer
</pre>
<p>Para verificar que la instalación fue correcta podemos hacer lo siguiente</p>
<pre class="brush: bash; title: ; notranslate">

phpcs --version
</pre>
<p>Para ver todos los parametros y configuración podemos ver la ayuda</p>
<pre class="brush: bash; title: ; notranslate">

phpcs --help
</pre>
<p>Para saber cuales son los estándares instalados</p>
<pre class="brush: bash; title: ; notranslate">

phpcs -i
</pre>
<p>Para definir el estandar por defecto que se utilizara</p>
<pre class="brush: bash; title: ; notranslate">
phpcs --config-set default_standard Zend
</pre>
<div class="shr-publisher-859"></div><!-- Start Shareaholic LikeButtonSetBottom Automatic --><!-- End Shareaholic LikeButtonSetBottom Automatic -->]]></content:encoded>
			<wfw:commentRss>http://www.mostofreddy.com.ar/calidad-de-software-en-php-iii-%e2%80%93-php-codesniffer-859.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

