tag:blogger.com,1999:blog-20974783849816892212023-11-15T07:53:00.576-06:00Mamá, no soy un vagalesAl tiempo que vago también codeo, y no con el codo, sino para con el código.Alvaro Cabrera Duránhttp://www.blogger.com/profile/13514507430432167930noreply@blogger.comBlogger10125tag:blogger.com,1999:blog-2097478384981689221.post-78286011456750701872011-10-13T01:16:00.001-05:002011-10-13T01:38:25.620-05:00Blocks, closures y objetosCuando ando de paseo por el mundo <b>Ruby</b> (especialmente RoR) me suelo encontrar con bastantes <code>do</code> y <code>end</code> (ciertamente me recuerdan PASCAL), o en una sola linea <code>{</code> y <code>}</code>, esto es lo que llamamos convencionalmente bloques (de instrucciones).<br />
<br />
<pre class="prettyprint lang-ruby"># método de configuración
config :scope, do |bag|
bag.set :key, 'value'
end</pre>
<br />
Nada nuevo, tampoco para aburrirse, lo bonito de este lenguaje es la manera en que maneja estos conceptos de bloques. Pero también tiene una sintaxis poderosa, breve y bastante agradable de leer y escribir.<br/>
¿Hago mal en preferir un lenguaje también por su estética?<br />
<br />
Tampoco voy a dar una clase de <a href="http://www.raulparolari.com/Ruby2/lambda_Proc">bloques en ruby</a>, pero me interesa en concreto el concepto de <code>lambda</code> y su utilización como <i>callback</i> en algunos escenarios cotidianos en los lenguajes de programación de alto nivel como lo es también <b>PHP</b>.<br />
<blockquote>
Y no hay que buscar demasiado, la versión mas reciente del pre-procesador de hipertexto ya venía con torta bajo el brazo, pues ofrece bastante potencial en la orientación a objetos así como con este bonito concepto que es un <i>closure</i>. De hecho, en php un <i>closure</i> por si mismo es un objeto, una clase.</blockquote>
<pre class="prettyprint lang-php">// método de configuración
config('scope', function ($bag) {
$bag->set('key', 'value');
});</pre>
<br />
Finalmente me parece que su funcionalidad es la misma,
contener un grupo de instrucciones en un contexto aislado, sin importar
si devuelve un resultado o no.<br />
<br />
Así como el ejemplo de un método de configuración cualquiera se pueden dar otras alternativas mas flexibles, aquí otra definición:<br />
<br />
<pre class="prettyprint lang-php">// agregamos un nuevo libro en alguna colección
function add_book_to($user, Closure $describe) {
$book = $user->books->build();
$describe($book);
$book->save();
}
// seleccionamos a un usuario
$me = user::first_by_name('Alvaro');
// agregamos el libro
add_book_to($me, function ($book) {
$book->title = 'Fake title';
$book->description = 'Fake description';
}); </pre>
<br />
Y la verdad es que una función anónima implementada en php tiene
bastantes desventajas a comparación de otros lenguajes, pero tampoco es
inútil. Se pueden conseguir <i>features</i> interesantes en cuanto a flexibilidad en php. <br />
<br />
<i>Chiro-liro</i>Alvaro Cabrera Duránhttp://www.blogger.com/profile/13514507430432167930noreply@blogger.com0tag:blogger.com,1999:blog-2097478384981689221.post-65480184348775059862011-09-07T10:28:00.005-05:002011-09-07T11:16:29.871-05:00¿Pachequés o flexo?<p>Disculpen el título. <em>Nel</em>, ni se que dije.</p>
<p>Bueno... aquí traigo otra de las cosas locas -y divertidas- que me laten de <strong>PHP</strong>, ya me dirán.<br>
Trabajando un poco en un proyecto que tengo alojado en mi cuenta de <strong>GitHub</strong> quise darle la vuelta a un problema especifico: diseñar una <strong>API</strong> que fuese amigable y divertida a la vez, desde luego me refiero al lenguaje mismo y no más.</p>
<p>Así pues descubrí que dos conceptos pueden existir bajo el mismo nombre, y hablo en serio:</p>
<pre class="prettyprint lang-php">function foo()
{
}
class foo
{
}</pre>
<p>¿Y que chingados con eso?</p>
<p>Pues eso, de alguna extraña forma php permite nombrar de la misma manera una función y/o clase. Esto evidentemente nos brinda la posibilidad de escribir una serie scripts de diversa índole bajo el mismo "<em>namespace</em>" o algo parecido.</p>
<p>Vamos a imaginar una librería para manejar sesiones:</p>
<pre class="prettyprint lang-php">session_start();
class session
{
public static function fetch($item)
{
return $_SESSION[$item];
}
public static function assign($item, $value)
{
$_SESSION[$item] = $value;
}
public static function remove($item)
{
unset($_SESSION[$item]);
}
}
function session($item, $value = NULL)
{
if (func_num_args() === 1)
{
return session::fetch($item);
}
elseif (is_null($value))
{
session::remove($item);
}
else
{
session::assign($item, $value);
}
}</pre>
<p>En mi experiencia esto facilita las cosas de una forma sumamente agradable y consistente, si no me creen hagan la prueba.</p>
<p>¡Diviertanse!</p>Alvaro Cabrera Duránhttp://www.blogger.com/profile/13514507430432167930noreply@blogger.com2tag:blogger.com,1999:blog-2097478384981689221.post-49244885144461145512011-09-03T21:27:00.010-05:002011-09-03T23:00:11.179-05:00Classy patch<p>Ahora que lo pienso no se si existe algo parecido a esto.</p>
<p><a href="https://github.com/pateketrueke">Diviertiendome</a> pensé que sería divertido jugar con alguna otra cualidad de <strong>PHP</strong>. Hice un podo de <em>research</em> y no hallé al respecto así que me dedique a diseñar algo así.</p>
<pre class="prettyprint lang-php">// registramos el buen autoloader
spl_autoload_register(function($class)
{
rescue($class);
});
// registramos filtros
function resolve(Closure $with = NULL)
{
static $patch = array();
if (func_num_args() === 0)
{
return $patch;
}
$patch []= $with;
}
// y los ejectuamos
function rescue($class)
{
foreach (resolve() as $callback)
{
$callback($class);
}
}</pre>
<p>Si, es un sistema de <em>autoload</em>, sin embargo no es una convencional. Y tiene varias ventajas mas.</p>
<p><em>Pa'</em> sonreír, ¿no?</p>Alvaro Cabrera Duránhttp://www.blogger.com/profile/13514507430432167930noreply@blogger.com0tag:blogger.com,1999:blog-2097478384981689221.post-69968280866542759682011-08-31T08:52:00.004-05:002011-08-31T09:09:59.199-05:00Radical, un pensamiento natural<p>Lo que me fascina de los lenguajes es el potencial que tienen para mejorar nuestra concepción del pensamiento mismo. Cada día me sorprendo mas.</p>
<p>Pero hablemos al chile (y no hablo del país), yo no soy fanático ni mucho menos obsesivo con ningún lenguaje. Solo trato de ser justo y humano, al final todo es cuestión de gusto.</p>
<blockquote><p>Aquí es donde entra el radicalismo, no me gusta la forma tradicional de programar ni 100% objetos, ni 100% funcional. Creo que una buena combinación de ambos es perfecta para mi: <strong>PHP</strong></p></blockquote>
<p>Cuando observamos <strong>Javascript</strong> no parece que todo fuera un objeto, pero así lo es. Así mismo pasa con <strong>Ruby</strong>, y así cualquiera se acostumbra. Ni hablar de JAVA. No lo uso ni de <em>keyword</em>...</p>
<p>Ando tratando de llevar todo lo que he aprendido al limite, explotando todos los medios para desarrollar algo loco, la verdad solo busco mas aprendizaje y no más. Si gustan revisen mi <a href="https://github.com/pateketrueke/">Github</a></p>
<p>Después de todo soy <em>scripter</em>, ya lo verán.</p>Alvaro Cabrera Duránhttp://www.blogger.com/profile/13514507430432167930noreply@blogger.com0tag:blogger.com,1999:blog-2097478384981689221.post-74031678191850655302011-08-18T13:59:00.005-05:002011-08-18T14:38:58.026-05:00Nel pastel<p>Recién vagando por mi <em>TL</em> y en algún tema de <strong>@forosdelweb</strong> mo topé con <a href="http://wiki.python.org/moin/PythonVsPhp">éste</a> enlace.<br>
He visto cosas muy locas entre lenguajes, y una de las cosas que me gustan es la "negación infinita", si, ya se que suena raro pero así es.</p>
<pre class="prettyprint lang-php">$foo = TRUE;
if ( !!!!!!!!!!!!!!!!!!!!!!!! $foo)
{
echo 'Damn.';
}</pre>
<p>¿Saben lo que significa?<br>
Como cuando te dicen "no digas nada", yo lo entiendo como un "not(say(null))" osea que me quedo igual, "dí algo", true.</p>
<pre class="prettyprint lang-php">function not($is)
{
return !!! $is;
}
function say($something)
{
return $something;
}
echo not(say(null)) ? 'algo' : 'nada';</pre>
<p>La neta la primera vez que torcí un <var>!!</var> no entendía ni madres, sin embargo un poco de reflexión <em>pachequera</em> me aclaro las cosas, casi como leí en un tema acerca de lo <a href="http://stackoverflow.com/questions/1485841/python-behaviour-of-increment-and-decrement-operators">siguiente</a> (que en <strong>PHP</strong>, obviamente no es posible).</p>
<pre class="prettyprint lang-php">$a = 5;
$b = $a ++ 5; // Parse error: syntax error, unexpected T_LNUMBER in...</pre>
<blockquote><p>Lo que si, esto que dicen está <em>chingón</em>:</p> <cite>on PHP you can do this: if($a == $b) { echo "true"; } else { echo "false"; } : try to do that whith Python</cite></blockquote>
<p>No más <a href="http://hyperpolyglot.org/scripting">chequen</a>.</p>Alvaro Cabrera Duránhttp://www.blogger.com/profile/13514507430432167930noreply@blogger.com0tag:blogger.com,1999:blog-2097478384981689221.post-22291721351487324552011-08-10T09:22:00.008-05:002011-08-10T10:19:55.252-05:00¿Donde quedó la bolita?<p>Una de las cosas <em>chidas</em> que aprendí de <strong>jQuery</strong> es la forma en que maneja los argumentos, de forma casi <em>predictiva</em>. A lo que me refiero es la manera en que permite que los argumentos de la derecha se puedan emplear hacía la izquierda y así sucesivamente.</p>
<p>jQuery.post( url, [data,] [success(data, textStatus, jqXHR),] [dataType] )</p>
<pre class="prettyprint lang-js">jQuery.post('url.php', { foo: bar }, function(){}, 'json');
jQuery.post('url.php', function(){}, 'json');</pre>
<p>O algo así, la onda es que me late hacer lo mismo con <strong>PHP</strong>.</p>
<pre class="prettyprint lang-php">function foo($bar = '', $candy = 0, $does = array(), $nothing = NULL, $else = FALSE)
{
if (is_integer($bar))
{
$candy = $bar;
$bar = '';
}
if (is_array($candy))
{
$does = $candy;
$candy = 0;
}
if (is_callable($does))
{
$nothing = $does;
$does = array();
}
if (is_bool($nothing))
{
$else = $nothing;
$nothing = NULL;
}
}</pre>
<p>Aquí la clave está en conocer bien el tipo de argumentos que necesita nuestra función, y en base a ello omitir o redefinir los argumentos. En el ejemplo se hace de forma muy abusiva, confusa y complicada.</p>
<p>Si una función espera mas de 4 argumentos entonces lo que yo hago es agrupar las opciones mas triviales y restantes en un solo último argumento a modo de arreglo asociativo. Así los primeros tres argumentos -<em>los mas relevantes</em>- son mas fáciles de comparar <em>predictivamente</em>, suponiendo que alguno de ellos es igualmente un arreglo asociativo para combinarlo con las últimas opciones.</p>
<pre class="prettyprint lang-php">function request($url, $method = 'GET', array $params = array())
{
static $defaults = array(
'url' => '',
'vars' => array(),
'method' => 'GET',
'headers' => array(),
'status' => 200,
'timeout' => 30,
'callback' => 'print',
);
if (is_array($url))
{
$params += $url;
}
if (is_array($method))
{
$params += $method;
}
$params = array_merge($defaults, $params);
extract($params);
}</pre>
<blockquote><p>Aquí hay otro tip: el <em>type-hinting</em> de php es realmente útil en estos casos, neta. Esto cambia radicalmente nuestra forma de emplear una función, método o como se llame.</p></blockquote>
<p>Así mismo la idea es trabajar directamente con la variable de opciones, o bien, usar <code class="prettyprint lang-php">extract()</code> para abreviar.</p>
<p>Yo le llamo patrón de predicción.</p>Alvaro Cabrera Duránhttp://www.blogger.com/profile/13514507430432167930noreply@blogger.com0tag:blogger.com,1999:blog-2097478384981689221.post-28543975009381288282011-08-07T21:55:00.004-05:002011-08-07T22:36:51.807-05:00Consola carajo<p>No se de donde saque la idea pero creo que sí. Solo que no se si es legal poner una imagen en el post, me da igual. Mejor no pongo la <a rel="nofollow nocache" href="https://lh4.googleusercontent.com/-umr6Yi_CgbM/Tj4LMaTcqdI/AAAAAAAAJGI/I3bkukMdG68/w402/geek-war-1.jpeg">imagen</a>.</p>
<p>Bueno, la neta nunca había usado la consola de php.</p>
<p>Como fanático <em>xubuntero</em> que soy pues me late usar cualquier terminal de consola, y eventualmente cuando desarrollo ando usándola. Casi siempre.<br/>
Con <strong>PHP</strong> no me refiero a programar <em>scripts</em> para la consola, sino usarla para ejecutar código interactivamente.</p>
<blockquote><p>A chinga, me dije. He pecado de pe#$&\!.</p></blockquote>
<p>Pues ya, la primer consola interactiva que emplee fue <kbd>irb</kbd> de <strong>Ruby</strong> o alguna de <strong>Javascript</strong>, no me acuerdo.</p>
<p>En corto, primero un <kbd>$ php --help | grep shell</kbd></p>
<pre> -a Run as interactive shell</pre>
<p><em>¡Papas!</em></p>Alvaro Cabrera Duránhttp://www.blogger.com/profile/13514507430432167930noreply@blogger.com0tag:blogger.com,1999:blog-2097478384981689221.post-78614441312668926192011-08-06T04:47:00.007-05:002011-08-06T05:41:58.112-05:00¿Tengo problemas?<p>Me he estado preguntando últimamente si tengo problemas para programar, que igual tiene que ver con la razón de que estoy loco o algo así.</p>
<p>No soy tan adicto de la programación orientada a objetos al puro estilo de <strong>JAVA</strong>, y si comparamos con <strong>Ruby</strong> o <strong>Javascript</strong> pues definitivamente no hay comparación. Menos aún con <strong>PHP</strong>.<br/>
Pero debo confesar que también pase por la obsesión de programar 100% objetos desde que conocí <strong>CodeIgniter</strong>, era algo bizarra su implementación <strong>OOP</strong> aún con <strong>PHP4</strong>. Desde ahí se me zafaron los tornillos, <em>chale</em>.</p>
<blockquote><p>Pero igual con el paso del tiempo he ido tomando mis propias decisiones con respecto a determinado patrones, honestamente yo comencé como <em>scripter</em> empleando funciones y toda la cosa. Es más, antes de leerme un buen libro de Javascript pensaba que <code class="prettyprint lang-js">alert()</code> era una función. Errado he.</p></blockquote>
<p>En fin, no se ustedes pero al menos yo si me divierto programando cosas fuera de lo común, como implementar -<em>seudos</em>- <em>singleton</em> con funciones, <em>factory</em>, <em>registry</em> o incluso <em>prototype</em> con clases estáticas.</p>
<h3>Singleton</h3>
<pre class="prettyprint lang-php">function instance($class)
{
static $set = array();
if (empty($set[$class]))
{
$set[$class] = new $class;
}
return $set[$class];
}
// ejemplo
$foo = instance('stdClass');
$foo->bar = 'buzz';
echo instance('stdClass')->bar; // => buzz</pre>
<h3>Factory</h3>
<pre class="prettyprint lang-php">function load($class)
{
return new $class;
}
// ejemplo
$foo = load('stdClass');
$foo->bar = 'buzz';
echo load('stdClass')->bar; // error</pre>
<h3>Registry</h3>
<pre class="prettyprint lang-php">function bag()
{
static $set = NULL;
if (is_null($set))
{
$set = new stdClass;
}
return $set;
}
function get($key, $value)
{
bag()->$key = $value;
}
function set()
{
return bag()->$key;
}
// ejemplo
$obj = new stdClass;
$obj->bar = 'buzz';
set('foo', $obj);
echo get('foo')->bar; // => buzz
get('foo')->bar = strtoupper($obj->bar);
echo get('foo')->bar; // => BUZZ
unset($obj->bar);
echo get('foo')->bar; // error</pre>
<h3>Prototype</h3>
<pre class="prettyprint lang-php">class prototype
{
private static $stack = array();
public static function method($name, $callback)
{
self::$stack[$name] = $callback;
}
public static __callStatic($name, $args)
{
return call_user_func_array(self::$stack[$name], $args);
}
}
// ejemplo
prototype::method('bye', function()
{
echo 'Adios pinchi mundo!';
});
prototype::bye(); // => Adios pinchi mundo!</pre>
<p>Me queda claro que puede no ser correcto, pero concluyo que es completamente valido. Además estoy seguro que no todo se puede conseguir sin objetos, de ser necesario uso objetos.<br/>
No soy religioso con respecto a ello.</p>
<p><em>Et voilà.</em></p>Alvaro Cabrera Duránhttp://www.blogger.com/profile/13514507430432167930noreply@blogger.com0tag:blogger.com,1999:blog-2097478384981689221.post-13718781598993903452011-08-03T19:44:00.018-05:002011-08-06T05:00:56.046-05:00Chido One<p>Así fue mi carnal, de una <a href="http://lmgtfy.com?q=blogger+prettyprint">búsqueda</a> que me llevó menos de 5 segundos de mi estúpida vida copie y pegué los códigos necesarios para jalar al <em>blog</em> el <em>chingón</em> script que usa <strong>GoogleCode</strong>, el famoso con ganas google-code-prettify (<em>aka <strong>PrettyPrint</strong></em>).</p>
<blockquote><p>No le pienso dar crédito al primer resultado que me salio hasta ver por mi mismo que funciona y todo, ¿verdad?</p>
<h3>PHP</h3>
<pre class="prettyprint lang-php"><?= 'Hola pinche mundo!'; ?></pre>
<h3>Javascript</h3>
<pre class="prettyprint lang-js">(function(){
console.log('esta es una prueba');
})();</pre>
<h3>HTML</h3>
<pre class="prettyprint lang-html">para <strong>resaltar</strong> el código</pre>
<h3>CSS</h3>
<pre class="prettyprint lang-css">/* que mas a menudo */
strong {
text-shadow: 2px 2px 2px #000;
content: "utilizo.";
}</pre>
<p><a href="http://lmgtfy.com?q=FTW">FTW</a>, ¿no?</p></blockquote>
<p>Pues eso era todo, no más queriendo comprobar su efectividad.</p>Alvaro Cabrera Duránhttp://www.blogger.com/profile/13514507430432167930noreply@blogger.com0tag:blogger.com,1999:blog-2097478384981689221.post-63080635568115043772011-08-03T18:22:00.010-05:002011-08-10T11:06:37.983-05:00WTF!<p>¿Que que pedo?<br/>
<em>Okey</em>, esta bien. Soy ese mero, un <em>scripter</em> común y corriente.
<br/><br/>
¿De que se trata todo eso?<br/>
Ni puta idea. Pero como me late la <em>programeada</em> voy a escribir de eso, sin censura.
<br/><br/>
Wey, ¿y si te atoran?
No pus yo que, la neta <em>chido</em> el que me entienda, yo solo escribo porque que me <em>pachequea</em>.</p>
<blockquote><p>Y mientras escribo esto fijo una regla semántica: aquellos términos que mi corrector de idioma en uso marque como mal escritos, dejaré como con énfasis.</p></blockquote>
<p>Aquí el <em>core</em>, cosas que vengo escuchando mas a menudo, es <em>scriptear</em> un rato.<br/>
Si unos lo pueden hacer de forma profesional y casi dogmática, ¿por que no hacerlo al contrario pregunto me yo?</p>
<p>No más no se fijen de como escribo y parloteo, si se escribir bien, no mas me da hueva.</p>Alvaro Cabrera Duránhttp://www.blogger.com/profile/13514507430432167930noreply@blogger.com1