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

<channel>
	<title>Programación &#8211; MarcosBL</title>
	<atom:link href="https://blog.marcosbl.com/area/informatica/programacion/feed/" rel="self" type="application/rss+xml" />
	<link>https://blog.marcosbl.com</link>
	<description>Maestro de nada</description>
	<lastBuildDate>Thu, 17 Sep 2015 04:33:24 +0000</lastBuildDate>
	<language>es</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	

<image>
	<url>https://blog.marcosbl.com/assets/cropped-avatar-32x32.png</url>
	<title>Programación &#8211; MarcosBL</title>
	<link>https://blog.marcosbl.com</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Laravel email with multiple server configurations</title>
		<link>https://blog.marcosbl.com/laravel-email-with-multiple-server-configurations/2389/</link>
		
		<dc:creator><![CDATA[MarcosBL]]></dc:creator>
		<pubDate>Tue, 15 Sep 2015 16:14:12 +0000</pubDate>
				<category><![CDATA[Desarrollo Web]]></category>
		<category><![CDATA[Programación]]></category>
		<guid isPermaLink="false">http://marcosbl.com/blog/?p=2389</guid>

					<description><![CDATA[<p class="lead">Change email configuration on the fly.</p><p class="more-link-p"><a class="btn btn-danger" href="https://blog.marcosbl.com/laravel-email-with-multiple-server-configurations/2389/">Leer más &#8594;</a></p>]]></description>
										<content:encoded><![CDATA[<p>Change email configuration on the fly.</p>
<pre class='prettyprint lang-default-markup'>
use \Swift_Mailer;
use \Swift_SmtpTransport as SmtpTransport;

// Setup a new SmtpTransport instance for Gmail
$transport = SmtpTransport::newInstance('smtp.gmail.com', 465, 'ssl');
$transport-&gt;setUsername('you@gmail.com');
$transport-&gt;setPassword('yourpassword123');

// Assign a new SmtpTransport to SwiftMailer
$gmail = new Swift_Mailer($transport);

// Assign it to the Laravel Mailer
Mail::setSwiftMailer($gmail);

// Send your message
Mail::send('emails.folder.template', ['data' => $data], function($message) use($extradata) {
    $message->from([$extradata["MailFromEmail"] => $extradata["MailFromName"]]);
    $message->to($extradata["MailToEmail"], $extradata["MailToEmail"])->subject('Subject');
});
</pre>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Awesome Awesomeness</title>
		<link>https://blog.marcosbl.com/awesome-awesomeness/2373/</link>
		
		<dc:creator><![CDATA[MarcosBL]]></dc:creator>
		<pubDate>Sun, 05 Apr 2015 20:04:01 +0000</pubDate>
				<category><![CDATA[Programación]]></category>
		<guid isPermaLink="false">http://marcosbl.com/blog/?p=2373</guid>

					<description><![CDATA[<p class="lead">En el principio fue Awesome PHP, donde sincronizados alrededor de un repositorio github, un montón de freaks se dedicaron a recopilar los mejores recursos para PHP, en forma de librerías, enlaces, libros, tutoriales, etc&#8230; No tardaron en seguirlo, sin ningún orden concreto, Awesome Python, Awesome Java, Awesome Ruby, Awesome Go, Awesome NodeJS, Awesome Javascript, Awesome Scala, Awesome Sysadmin, Awesome Shell&#8230;&#8230;</p><p class="more-link-p"><a class="btn btn-danger" href="https://blog.marcosbl.com/awesome-awesomeness/2373/">Leer más &#8594;</a></p>]]></description>
										<content:encoded><![CDATA[<p><a href="http://blog.marcosbl.com/assets/Sin-título.jpg"><img decoding="async" src="https://blog.marcosbl.com/assets/Sin-título.jpg" alt="Awesome" width="250" height="180" class="alignright size-full wp-image-2374" /></a>En el principio fue <a href="https://github.com/ziadoz/awesome-php">Awesome PHP</a>, donde sincronizados alrededor de un repositorio github, un montón de freaks se dedicaron a recopilar los mejores recursos para PHP, en forma de librerías, enlaces, libros, tutoriales, etc&#8230;</p>
<p>No tardaron en seguirlo, sin ningún orden concreto, <a href="https://github.com/vinta/awesome-python">Awesome Python</a>, <a href="https://github.com/akullpp/awesome-java">Awesome Java</a>, <a href="https://github.com/markets/awesome-ruby">Awesome Ruby</a>, <a href="https://github.com/avelino/awesome-go">Awesome Go</a>, <a href="https://github.com/vndmtrx/awesome-nodejs">Awesome NodeJS</a>, <a href="https://github.com/sorrycc/awesome-javascript">Awesome Javascript</a>, <a href="https://github.com/lauris/awesome-scala">Awesome Scala</a>, <a href="https://github.com/kahun/awesome-sysadmin">Awesome Sysadmin</a>, <a href="https://github.com/alebcay/awesome-shell">Awesome Shell</a>&#8230; y otra docena de clones.</p>
<p>Ahora, decidido a poner orden a este caos, tenemos a un nuevo superhérore que recopila en un único lugar todos estos listados dispersos: <a href="https://github.com/bayandin/awesome-awesomeness"><strong>Awesome Awesomeness</strong></a>.</p>
<p style="text-align: center;"><span style="font-size: 9em;">Awesome!</span></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>DomoPi &#8211; Sistema de Domótica Low Cost con Raspberry Pi</title>
		<link>https://blog.marcosbl.com/domopi-sistema-de-domotica-low-cost-con-raspberry-pi/2282/</link>
		
		<dc:creator><![CDATA[MarcosBL]]></dc:creator>
		<pubDate>Mon, 14 Jul 2014 22:50:00 +0000</pubDate>
				<category><![CDATA[Hardware]]></category>
		<category><![CDATA[Informática]]></category>
		<category><![CDATA[Programación]]></category>
		<guid isPermaLink="false">http://marcosbl.com/blog/?p=2282</guid>

					<description><![CDATA[<p class="lead">Proyecto de fin de Grado de mi sobrina Raquel Sedó. Un daemon python corre en la Raspberry monitorizando una BD MySQL que indica el estado de diferentes leds (dispositivos, luces, etc&#8230;) de un hogar. El sistema se controla desde una interface web responsive adaptada a todo tipo de dispositivos, programada a su vez con PHP contra MySQL sobre Apache. La&#8230;</p><p class="more-link-p"><a class="btn btn-danger" href="https://blog.marcosbl.com/domopi-sistema-de-domotica-low-cost-con-raspberry-pi/2282/">Leer más &#8594;</a></p>]]></description>
										<content:encoded><![CDATA[<p>Proyecto de fin de Grado de mi sobrina Raquel Sedó. Un daemon python corre en la Raspberry monitorizando una BD MySQL que indica el estado de diferentes leds (dispositivos, luces, etc&#8230;) de un hogar. El sistema se controla desde una interface web responsive adaptada a todo tipo de dispositivos, programada a su vez con PHP contra MySQL sobre Apache.</p>
<p>La creadora, un mes antes de la realización de este proyecto, no había programado nunca con Pyhton o PHP, no conocía HTML5, CSS ni Bootstrap, ni mucho menos lo que era AJAX. Casi nada :)</p>
<p><iframe width="1170" height="878" src="https://www.youtube.com/embed/Kzu9M-36Oak?feature=oembed" frameborder="0" allowfullscreen></iframe></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Compresión y gestión de JS/CSS con Grunt</title>
		<link>https://blog.marcosbl.com/compresion-y-gestion-de-js-css-con-grunt/2276/</link>
					<comments>https://blog.marcosbl.com/compresion-y-gestion-de-js-css-con-grunt/2276/#comments</comments>
		
		<dc:creator><![CDATA[MarcosBL]]></dc:creator>
		<pubDate>Thu, 26 Jun 2014 02:50:17 +0000</pubDate>
				<category><![CDATA[Desarrollo Web]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[Sistemas]]></category>
		<guid isPermaLink="false">http://marcosbl.com/blog/?p=2276</guid>

					<description><![CDATA[<p class="lead">A la hora de desarrollar un sitio web, podemos encontrarnos con la necesidad de ir probando de forma rápida diferentes librerías o plugins Javascript/CSS. Una forma habitual suele ser el descargarlas en local, editar el html enlazándolas, y a base de ensayo y error, ir dejándolas como definitivas en nuestro código o eliminándolas según corresponda. Vamos a ver como realizar&#8230;</p><p class="more-link-p"><a class="btn btn-danger" href="https://blog.marcosbl.com/compresion-y-gestion-de-js-css-con-grunt/2276/">Leer más &#8594;</a></p>]]></description>
										<content:encoded><![CDATA[<p><img fetchpriority="high" decoding="async" src="https://blog.marcosbl.com/assets/grunt.png.png" alt="" width="242" height="287" class="alignright size-full wp-image-2277" />A la hora de desarrollar un sitio web, podemos encontrarnos con la necesidad de ir probando de forma rápida diferentes librerías o plugins Javascript/CSS. Una forma habitual suele ser el descargarlas en local, editar el html enlazándolas, y a base de ensayo y error, ir dejándolas como definitivas en nuestro código o eliminándolas según corresponda.</p>
<p>Vamos a ver como realizar esto de forma cómoda y sencilla mediante tareas <a href="http://gruntjs.com/" target="_blank">Grunt</a>, manteniendo al mismo tiempo la limpieza y optimización de nuestros assets CSS/JS. <a href="http://gruntjs.com/" target="_blank">Grunt.js</a> es una librería JavaScript que nos permite configurar tareas automáticas y así ahorrarnos tiempo en nuestro desarrollo y despliegue.</p>
<p>Antes que os asuste la extensión del post, indicar que el código está duplicado, primero completo, y luego explicado paso a paso, y que me ha llevado escribir este post unas 20 veces más que implementar todo el sistema.</p>
<hr />
<h2>1.- Planteamiento</h2>
<p>En nuestro caso de ejemplo vamos a suponer que nos interesa disponer de:</p>
<ul>
<li>Algunos contenidos CSS y Javascript desde <a href="http://es.wikipedia.org/wiki/Red_de_entrega_de_contenidos" target="_blank">CDNs</a>, con una URL genérica de última versión</li>
<li>Cargamos otros con versiones concretas también desde CDNs</li>
<li>Por último, cargamos otros más desde disco, sean propios o de terceros</li>
</ul>
<p>La estructura de carpeta de estos estáticos será tal que:<br />
<pre class='prettyprint lang-default-markup'>
/s
  /vendor
    /librerias.css
    /librerias.js
  /css
    /mi.css
    /todo.css
  /js
    /mi.js
    /todo.js
</pre></p>
<hr />
<h2>2.- Dependencias</h2>
<p>Dando por supuesto que disponemos de <code><a href="http://nodejs.org/" target="_blank">NodeJS</a></code>, y tras instalar grunt utilizando <a href="https://www.npmjs.org/" target="_blank">npm</a> con un simple <code>sudo npm install -g grunt-cli</code>, empezaremos por definir los módulos de NodeJS que nos interesa importar creando en el root de nuestro proyecto un fichero <code>package.json</code> similar a este:</p>
<pre class='prettyprint lang-json'>
{
    "name" : "PuerLugoMin",
    "title" : "PuerLugoMin",
    "version" : "1.0.0",
    "devDependencies": {
        "grunt": "0.4.5",
        "grunt-contrib-concat": "0.4.0",
        "grunt-contrib-cssmin" : "0.10.0",
        "grunt-contrib-watch" : "0.6.1",
        "grunt-contrib-uglify" : "0.5.0",
        "grunt-curl" : "2.0.2"
    }
}
</pre>
<p>Una vez hecho esto, instalaremos estas dependencias con el comando</p>
<pre class='prettyprint lang-bsh'>
npm install
</pre>
<hr />
<h2>3.- La Tarea Grunt</h2>
<p>Solucionadas las dependencias, definiremos una tarea Grunt de ejemplo <code>Gruntfile.js</code> también en el root de nuestro proyecto:</p>
<pre class='prettyprint lang-js'>
module.exports = function(grunt) {
    grunt.initConfig({
        pkg: grunt.file.readJSON('package.json'),
        "curl-dir": {
            's/vendor/': [
            "http://cdn.jsdelivr.net/g/jquery,bootstrap",
            "http://cdnjs.cloudflare.com/ajax/libs/bootbox.js/4.2.0/bootbox.min.js",
            "http://cdn.jsdelivr.net/bootstrap/3.1.1/css/bootstrap.min.css",
            "http://cdn.jsdelivr.net/bootstrap/3.1.1/css/bootstrap-theme.min.css",
            ]
        },
        concat: {
            options: {
                separator: '\n',
            },
            css: {
                src: ['s/vendor/bootstrap.min.css', 's/vendor/bootstrap-theme.min.css', 's/css/mi.css'],
                dest: 's/css/todo.css'
            },
            js : {
                src : ['s/vendor/jquery,bootstrap', 's/vendor/bootbox.min.js', 's/js/mi.js'],
                dest : 's/js/todo.js'
            }
        },
        cssmin : {
            css:{
                src: 's/css/todo.css',
                dest: 's/css/todo.css'
            }
        },
        uglify : {
            js: {
                files: { 's/js/todo.js' : [ 's/js/todo.js' ] }
            }
        },
        watch: {
            files: ['s/css/mi.css', 's/js/mi.js'],
            tasks: ['default']
        }
    });
    grunt.loadNpmTasks('grunt-curl');
    grunt.loadNpmTasks('grunt-contrib-concat');
    grunt.loadNpmTasks('grunt-contrib-uglify');
    grunt.loadNpmTasks('grunt-contrib-watch');
    grunt.loadNpmTasks('grunt-contrib-cssmin');
    grunt.registerTask('default', ['concat:css', 'cssmin:css', 'concat:js', 'uglify:js']);
    grunt.registerTask('update', ['curl-dir', 'concat:css', 'cssmin:css', 'concat:js', 'uglify:js']);
};
</pre>
<hr />
<h2>4.- La Tarea Grunt paso a paso</h2>
<p>Vamos a ver este fichero por partes; para empezar, <code>curl-dir</code> (entrecomillado debido al -), define una función que descarga archivos de <a href="http://es.wikipedia.org/wiki/Red_de_entrega_de_contenidos" target="_blank">CDN</a> en una carpeta de nuestra elección, en este caso lo configuro para descargar varias librerías populares en la carpeta relativa <code>s/vendor</code>, la primera con las últimas versiones de Javascript de <a href="http://jquery.com/" target="_blank">jQuery</a> y <a href="http://getbootstrap.com/" target="_blank">Twitter Bootstrap</a> en un único archivo gracias a <a href="http://www.jsdelivr.com/" target="_blank">JSDelivr</a>, y las demás con versiones concretas de otras librerías, indicando tanto las dependencias JS como CSS.</p>
<pre class='prettyprint lang-js'>
"curl-dir": {
	's/vendor/': [
	"http://cdn.jsdelivr.net/g/jquery,bootstrap",
	"http://cdnjs.cloudflare.com/ajax/libs/bootbox.js/4.2.0/bootbox.min.js",
	"http://cdn.jsdelivr.net/bootstrap/3.1.1/css/bootstrap.min.css",
	"http://cdn.jsdelivr.net/bootstrap/3.1.1/css/bootstrap-theme.min.css",
	]
},

</pre>
<p>Por su parte, <code>concat</code> define una función que concatena dichos archivos, utilizando el separador «\n» (salto de línea), para evitar conflictos con los finales de linea de cada archivo a unir. Tanto para el CSS como para el JS, definimos los archivos fuente como una colección en <code>src</code>, y el fichero destino en <code>dest</code>.</p>
<p>En mi caso llamo a los archivos finales <code>dest</code>: <code>todo.css</code> y <code>todo.js</code> respectivamente, y le paso a la función los nombres finales que tienen los archivos previamente descargados en disco en <code>src</code>; Aquí es donde viene parte de la gracia de este sistema, ya que no tengo que limitarme a los archivos descargados, si no que puedo indicarle archivos en disco que yo haya creado, o que haya descargado manualmente antes. Basta con indicar el orden de las dependencias de forma correcta para evitar problemas. En mi caso, <code>mi.css</code> y <code>mi.js</code> son los archivos sobre los que trabajo y escribo mi propio código, extendiendo el Javascript y CSS de las librerías previas, con lo que simplemente, lo añado al final de cada lista para que sobreescriban cualquier estilo o función definido por estas.</p>
<p>Una vez llamemos a esta función, los archivos serán concatenados en el orden especificado en el mencionado <code>src</code> y guardados en <code>dest</code>. Como adelanto, estos nombres de archivo <code>todo.css</code> y <code>todo.js</code> serán los que luego enlazaré desde mi HTML.</p>
<pre class='prettyprint lang-js'>
concat: {
    options: {
        separator: '\n',
    },
    css: {
        src: ['s/vendor/bootstrap.min.css', 's/vendor/bootstrap-theme.min.css', 's/css/mi.css'],
        dest: 's/css/todo.css'
    },
    js : {
        src : ['s/vendor/jquery,bootstrap', 's/vendor/bootbox.min.js', 's/js/mi.js'],
        dest : 's/js/todo.js'
    }
},
</pre>
<p>Una vez hemos descargado los archivos que nos interesan, procedemos a su Minificado, reducción de peso por el método de ofuscación o eliminación de elementos innecesarios, tales como saltos de línea, comentarios, etc&#8230; Para ello basta con indicar una función <code>cssmin</code> a la que indicaremos el fichero fuente con <code>src</code> y el destino con <code>dest</code>. En mi caso la elección es obvia, indico la ruta de mi fichero previamente concatenado en ambas variables, para que realice la compresión del mismo y lo sobreescriba.</p>
<pre class='prettyprint lang-js'>
cssmin : {
    css:{
        src: 's/css/todo.css',
        dest: 's/css/todo.css'
    }
},
</pre>
<p><code>Uglify</code> es al Javascript lo que <code>cssmin</code> al CSS, asi que procedemos exactamente de la misma manera, utilizando su propia sintaxis para obtener un resultado más compacto:</p>
<pre class='prettyprint lang-js'>
uglify : {
    js: {
        files: { 's/js/todo.js' : [ 's/js/todo.js' ] }
    }
},
</pre>
<p>El módulo <code>watch</code> merece mención aparte: se encarga de quedarse en espera controlando cambios en disco sobre archivos que le indiquemos, y en caso de detectar alguno, realiza la tarea que a su vez le especifiquemos. Esto es muy cómodo si queremos vigilar, por ejemplo, los fichero <code>mi.css</code> y <code>mi.js</code> (los únicos que modificaré regularmente) y en caso de cambios, lanzar automáticamente la concatenación y minificado de los mismos. De esta forma, nada más guardar cambios en nuestro editor, <code>watch</code> salta de forma automática y actualiza nuestros ficheros finales <code>todo.css</code> y <code>todo.js</code> con los últimos cambios.</p>
<p>Para ello, deberemos definir una tarea, a la que llamaré <code>default</code> y que definiremos más tarde, que es la que le indica qué debe hacer al detectar cambios.</p>
<pre class='prettyprint lang-js'>
watch: {
    files: ['s/css/mi.css', 's/js/mi.js'],
    tasks: ['default']
}
</pre>
<p>Una vez definidas todas las funciones que necesitamos, debemos indicar a Grunt con qué paquete de NodeJS debe ejecutar cada una, así que incluimos los paquetes definidos al principio en <code>packages.json</code></p>
<pre class='prettyprint lang-js'>
grunt.loadNpmTasks('grunt-curl');
grunt.loadNpmTasks('grunt-contrib-concat');
grunt.loadNpmTasks('grunt-contrib-uglify');
grunt.loadNpmTasks('grunt-contrib-watch');
grunt.loadNpmTasks('grunt-contrib-cssmin');
</pre>
<p>Dependencias instaladas, funciones creadas, dependencias cargadas, es el momento de decirle a <code>Grunt</code> qué comandos debe aceptar desde <code>consola</code>, o desde <code>watch</code>, y los definiremos registrando dos tareas, una para que <code>watch</code> regenere los ficheros locales ante cualquier cambio, y otra que refresque versiones de librerías de cuando en cuando, para mantenernos actualizados. Recordemos que a <code>watch</code> le indicamos que cuando hubiese cambios en <code>mi.css</code> o <code>mi.js</code>, llamase a la tarea <code>default</code>, asi que esa será la primera que crearemos:</p>
<pre class='prettyprint lang-js'>
grunt.registerTask('default', [ 'concat:css', 'cssmin:css', 'concat:js', 'uglify:js' ]);
</pre>
<p>Sencillo y eficiente, indicamos el nombre <code>default</code>, e indicamos qué acciones debe realizar según las funciones que creamos previamente:</p>
<ol>
<li>Concatenar los CSS -&gt; Genera un todo.css temporal</li>
<li>Minificar los CSS -&gt; Genera el <code>todo.css final</code></li>
<li>Concatenar los JS -&gt; Genera un todo.js temporal</li>
<li>Minificar los JS -&gt; Genera el <code>todo.js final</code></li>
</ol>
<p>El nombre de función <code>default</code> no ha sido definido al azar: si llamamos a <code>grunt</code> sin parámetros desde la consola, esa será la función que ejecute por defecto, salvo que se le indique otra.</p>
<p>Y ahora veremos como indicar otra tarea diferente, la que llamaremos <code>update</code> y que se encargará de descargar las últimas versiones de las librerías:</p>
<pre class='prettyprint lang-js'>
grunt.registerTask('update', [ 'curl-dir', 'concat:css', 'cssmin:css', 'concat:js', 'uglify:js' ]);
</pre>
<p>Como veis, es exactamente igual a la anterior, solo que antes de todo el proceso de concatenación y minificado, descarga las últimas versiones utilizando la función <code>curl-dir</code> que especificamos al principio.</p>
<hr />
<h2>5.- Utilizando nuestro automatismo Grunt</h2>
<p style="text-align: center;"><strong>¡ Ya estamos listos para empezar a trabajar con Grunt !</strong></p>
<p>Tenemos dos formas de hacerlo, la estrictamente manual, muy flexible, donde podemos invocar a Grunt de múltiples formas desde consola:</p>
<ul>
<li><code>grunt update</code>: ejecutará descarga, concatenación y minificados a través de la función «update»</li>
<li><code>grunt default</code>: lo mismo, pero sin descarga</li>
<li><code>grunt</code>: sin parámetros, ejecutará lo mismo que indicando <code>default</code></li>
<li><code>grunt cssmin:css</code>: si queremos invocar una de las funciones directamente, también podemos</li>
<li><code>grunt curl-dir</code>: otro ejemplo de lo anterior</li>
</ul>
<p style="text-align: center;"><strong>¡ También en modo automático !</strong></p>
<p>Por otra parte, para utilizar la modalidad de actualización directa basada en <code>watch</code>, bastará con ejecutar <code>grunt watch</code> para obtener algo como esto:</p>
<pre class='prettyprint lang-default-markup'>
marcos@nabovalley:~/test$ sudo grunt watch
Running "watch" task
Waiting...
</pre>
<p>En este momento dejamos esa consola abierta, y comenzamos nuestro desarrollo. Cada vez que editemos el fichero <code>mi.css</code> o <code>mi.js</code> de nuestro proyecto, <code>watch</code> lanzará la tarea <code>default</code> especificada, que realizará la concatenación y minificado, entregando los ficheros finales <code>todo.css</code> y <code>todo.js</code>. Como estos ficheros son los que enlazo desde mi HTML, basta con guardar en el editor y recargar la web para apreciar los cambios, con todo el CSS y JS listos para pasar directamente a producción si es necesario.</p>
<p>Además, <code>watch</code> es capaz de hacer <code>livereload</code>, una configuración especial que levanta un servidor propio, y es capaz de recargar el navegador por nosotros en el mismo instante que hagamos cambios a uno de los archivos monitorizados. Para ello, basta con configurarlo:</p>
<pre class='prettyprint lang-json'>
options: {
  livereload: true,
},
</pre>
<p>Y añadir a nuestro HTML la etiqueta <code>&lt;script src="//localhost:35729/livereload.js">&lt;/script></code> que es la que se encargará de recargar cuando sea necesario.</p>
<hr />
<h2>6.- Tips adicionales</h2>
<p>No olvidemos proteger nuestros archivos de dependencias y grunt añadiendo a nuestro <code>.htaccess</code> de Apache o similar las líneas:<br />
<pre class='prettyprint lang-bsh'>
RedirectMatch 404 /Gruntfile\\.js(/|$)
RedirectMatch 404 /package\\.json(/|$)
</pre></p>
<p>Y del mismo modo, si utilizamos un sistema de control de versiones, excluyamos la carpeta <code>node_modules</code> del mismo, por ejemplo mediante <code>.hgignore</code></p>
<pre class='prettyprint lang-bsh'>
node_modules/
</pre>
<hr />
<h2>Conclusión</h2>
<p>Hasta aquí este ladrillo, Grunt es una herramienta de automatización fantástica, con multitud de posibilidades, y de la que apenas hemos arañado la superficie. No dejes de dar un buen vistazo al enorme <a href="http://gruntjs.com/plugins" target="_blank">listado oficial de plugins para Grunt</a>, seguro que se te ocurren nuevas e imaginativas formas de ponerlo a trabajar a tu servicio. No en vano, no hay ser más vago sobre la tierra que un programador.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.marcosbl.com/compresion-y-gestion-de-js-css-con-grunt/2276/feed/</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
			</item>
		<item>
		<title>Crypo.com &#8211; Servicios de criptografía gratuitos online</title>
		<link>https://blog.marcosbl.com/crypo-com-servicios-de-criptografia-gratuitos-online/1301/</link>
		
		<dc:creator><![CDATA[MarcosBL]]></dc:creator>
		<pubDate>Sun, 09 Aug 2009 10:13:48 +0000</pubDate>
				<category><![CDATA[Programación]]></category>
		<guid isPermaLink="false">http://www.propiedadprivada.com/?p=1301</guid>

					<description><![CDATA[<p class="lead">Encriptación / Desencriptación de código fuente Javascript, Ocultar URs e emails via Unicode/ASCII, Generadores Hash, Generadores de pasada única, encriptación multi-byte&#8230; para todas tus necesidades de encriptación, o si simplemente sientes curiosidad por la criptografía, Crypo.com es un recurso imprescindible.</p><p class="more-link-p"><a class="btn btn-danger" href="https://blog.marcosbl.com/crypo-com-servicios-de-criptografia-gratuitos-online/1301/">Leer más &#8594;</a></p>]]></description>
										<content:encoded><![CDATA[<p>Encriptación / Desencriptación de código fuente Javascript, Ocultar URs e emails via Unicode/ASCII, Generadores Hash, Generadores de pasada única, encriptación multi-byte&#8230; para todas tus necesidades de encriptación, o si simplemente sientes curiosidad por la criptografía, <strong><a href="http://www.crypo.com/">Crypo.com</a></strong> es un recurso imprescindible.</p>
<div class="aligncenter"><a href="http://www.crypo.com/"><img loading="lazy" decoding="async" src="/blog/assets/910x3501.jpg" alt="Crypo" title="Crypo" width="400" height="153" class="alignnone size-medium wp-image-1302" srcset="https://blog.marcosbl.com/assets/910x3501.jpg 910w, https://blog.marcosbl.com/assets/910x3501-300x115.jpg 300w" sizes="auto, (max-width: 400px) 100vw, 400px" /></a></div>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>P.O.R.K. &#8211; Disfruta del PHP como cerdo en una charca</title>
		<link>https://blog.marcosbl.com/pork-disfruta-del-php-como-un-cerdo-en-una-charca/1168/</link>
					<comments>https://blog.marcosbl.com/pork-disfruta-del-php-como-un-cerdo-en-una-charca/1168/#comments</comments>
		
		<dc:creator><![CDATA[MarcosBL]]></dc:creator>
		<pubDate>Fri, 29 May 2009 15:25:44 +0000</pubDate>
				<category><![CDATA[Desarrollo Web]]></category>
		<category><![CDATA[Programación]]></category>
		<guid isPermaLink="false">http://www.propiedadprivada.com/?p=1168</guid>

					<description><![CDATA[<p class="lead">PHP on Rails (Kinda) es un framework de desarrollo de mapeado Obejtos-Relaciones muy en la linea Rails, pero para PHP 5. Tras definir la relación de campos, el solito te genera el código y clases necesarias para producir una administración de tablas rápida, o un completo sitio web, además de gráficas con las relaciones de forma visual. Puedes incluso probar&#8230;</p><p class="more-link-p"><a class="btn btn-danger" href="https://blog.marcosbl.com/pork-disfruta-del-php-como-un-cerdo-en-una-charca/1168/">Leer más &#8594;</a></p>]]></description>
										<content:encoded><![CDATA[<p><strong>PHP on Rails (Kinda)</strong> es un framework de desarrollo de mapeado Obejtos-Relaciones muy en la linea Rails, pero para PHP 5. Tras definir la relación de campos, el solito te genera el código y clases necesarias para producir una administración de tablas rápida, o un completo sitio web, además de gráficas con las relaciones de forma visual. Puedes incluso probar un <strong><a href="http://www.schizofreend.nl/demogenerator/">acceso a la demo</a></strong> con unas tablas precargadas.</p>
<p>Quizá conozcan a su autor de otros proyectos como <strong><a href="http://www.schizofreend.nl/Pork.dbObject/">Pork.dbObject</a></strong> o <strong><a href="http://www.schizofreend.nl/Pork.Iframe/">Pork.Iframe</a></strong> y <strong><a href="http://www.schizofreend.nl/Pork.Generator">Pork.Generator</a></strong>.</p>
<h2>El logotipo no tiene desperdicio</h2>
<div class="ac"><img loading="lazy" decoding="async" src="https://blog.marcosbl.com/assets/pork-logo.jpg" alt="pork-logo" title="pork-logo" width="268" height="161" class="alignnone size-full wp-image-1171" /></div>
<h2>Generando código PHP automáticamente</h2>
<div class="ac"><img loading="lazy" decoding="async" src="https://blog.marcosbl.com/assets/pork.jpg" alt="pork" title="pork" width="550" height="393" class="alignnone size-full wp-image-1169" srcset="https://blog.marcosbl.com/assets/pork.jpg 550w, https://blog.marcosbl.com/assets/pork-300x214.jpg 300w" sizes="auto, (max-width: 550px) 100vw, 550px" /></div>
<h2>Relaciones visuales</h2>
<div class="ac"><img loading="lazy" decoding="async" src="https://blog.marcosbl.com/assets/pork-visual.jpg" alt="pork-visual" title="pork-visual" width="550" height="393" class="alignnone size-full wp-image-1170" srcset="https://blog.marcosbl.com/assets/pork-visual.jpg 550w, https://blog.marcosbl.com/assets/pork-visual-300x214.jpg 300w" sizes="auto, (max-width: 550px) 100vw, 550px" /></div>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.marcosbl.com/pork-disfruta-del-php-como-un-cerdo-en-una-charca/1168/feed/</wfw:commentRss>
			<slash:comments>5</slash:comments>
		
		
			</item>
		<item>
		<title>Los servidores de Google</title>
		<link>https://blog.marcosbl.com/los-servidores-de-google/1080/</link>
					<comments>https://blog.marcosbl.com/los-servidores-de-google/1080/#comments</comments>
		
		<dc:creator><![CDATA[MarcosBL]]></dc:creator>
		<pubDate>Thu, 16 Apr 2009 15:18:22 +0000</pubDate>
				<category><![CDATA[Desarrollo Web]]></category>
		<category><![CDATA[Informática]]></category>
		<category><![CDATA[Programación]]></category>
		<guid isPermaLink="false">http://www.propiedadprivada.com/?p=1080</guid>

					<description><![CDATA[<p class="lead">Google ha salido al paso a contrarrestar las acusaciones vertidas acerca de su supuesta falta de conciencia ecológica y su despreocupación por desarrollar tecnologías que supongan un ahorro energético, mostrando un par de videos sobre sus servidores y sus datacenters, ambos «secretos de la corona» hasta el momento. Cuanto menos interesante para los que siempre hemos tenido curiosidad al respecto.&#8230;</p><p class="more-link-p"><a class="btn btn-danger" href="https://blog.marcosbl.com/los-servidores-de-google/1080/">Leer más &#8594;</a></p>]]></description>
										<content:encoded><![CDATA[<p>Google ha salido al paso a contrarrestar las acusaciones vertidas acerca de su supuesta falta de conciencia ecológica y su despreocupación por desarrollar tecnologías que supongan un ahorro energético, mostrando un par de videos sobre sus servidores y sus datacenters, ambos «secretos de la corona» hasta el momento. Cuanto menos interesante para los que siempre hemos tenido curiosidad al respecto.</p>
<h2>Servidores de Google</h2>
<div class="ac"><object width="425" height="344"><param name="movie" value="https://www.youtube.com/v/xgRWURIxgbU&#038;rel=0&#038;color1=0xb1b1b1&#038;color2=0xcfcfcf&#038;hl=es&#038;feature=player_embedded&#038;fs=1"></param><param name="allowFullScreen" value="true"></param><embed src="https://www.youtube.com/v/xgRWURIxgbU&#038;rel=0&#038;color1=0xb1b1b1&#038;color2=0xcfcfcf&#038;hl=es&#038;feature=player_embedded&#038;fs=1" type="application/x-shockwave-flash" allowfullscreen="true" width="425" height="344"></embed></object></div>
<h2>Datacenters de Google</h2>
<div class="ac"><object width="425" height="344"><param name="movie" value="https://www.youtube.com/v/bs3Et540-_s&#038;rel=0&#038;color1=0xb1b1b1&#038;color2=0xcfcfcf&#038;hl=es&#038;feature=player_embedded&#038;fs=1"></param><param name="allowFullScreen" value="true"></param><embed src="https://www.youtube.com/v/bs3Et540-_s&#038;rel=0&#038;color1=0xb1b1b1&#038;color2=0xcfcfcf&#038;hl=es&#038;feature=player_embedded&#038;fs=1" type="application/x-shockwave-flash" allowfullscreen="true" width="425" height="344"></embed></object></div>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.marcosbl.com/los-servidores-de-google/1080/feed/</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
			</item>
		<item>
		<title>Google Update es ahora Open Source</title>
		<link>https://blog.marcosbl.com/google-update-es-ahora-open-source/1069/</link>
		
		<dc:creator><![CDATA[MarcosBL]]></dc:creator>
		<pubDate>Wed, 15 Apr 2009 18:32:04 +0000</pubDate>
				<category><![CDATA[Programación]]></category>
		<guid isPermaLink="false">http://www.propiedadprivada.com/?p=1069</guid>

					<description><![CDATA[<p class="lead">Google Update, el software de Google que se encarga de mantener actualizados automáticamente las aplicaciones de Google, tales como Chrome o Google Earth, es ahora Open Source, y con el codename Omaha, está ya disponible en Google Code. Via el propio Blog de Google OpenSource</p><p class="more-link-p"><a class="btn btn-danger" href="https://blog.marcosbl.com/google-update-es-ahora-open-source/1069/">Leer más &#8594;</a></p>]]></description>
										<content:encoded><![CDATA[<p>Google Update, el software de Google que se encarga de mantener actualizados automáticamente las aplicaciones de Google, tales como Chrome o Google Earth, es ahora Open Source, y con el <em>codename </em> <strong><a href="http://code.google.com/p/omaha/">Omaha</a></strong>, está ya disponible en <a href="http://code.google.com/">Google Code</a>.</p>
<p>Via el propio <strong><a href="http://google-opensource.blogspot.com/2009/04/google-update-goes-open-source.html">Blog de Google OpenSource</a></strong></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>CADT &#8211; El estilo de desarrollo de la Web 2.0</title>
		<link>https://blog.marcosbl.com/cadt-el-estilo-de-desarrollo-de-la-web-20/965/</link>
					<comments>https://blog.marcosbl.com/cadt-el-estilo-de-desarrollo-de-la-web-20/965/#comments</comments>
		
		<dc:creator><![CDATA[MarcosBL]]></dc:creator>
		<pubDate>Thu, 12 Mar 2009 16:41:46 +0000</pubDate>
				<category><![CDATA[Programación]]></category>
		<guid isPermaLink="false">http://www.propiedadprivada.com/?p=965</guid>

					<description><![CDATA[<p class="lead">Avalancha de Adolescentes con Déficit de Atención En 2003, Jamie Zawinski de la Organización Mozilla (y antes uno de los desarrolladores de Netscape Navigator) escribió un pequeño artículo acerca de una nueva tendencia a la hora de programar y diseñar software que denominó Modelo CADT ( Cascade of Attention-Deficit Teenagers &#8211; Avalancha de Adolescentes con Déficit de Atención ) Innova&#8230;</p><p class="more-link-p"><a class="btn btn-danger" href="https://blog.marcosbl.com/cadt-el-estilo-de-desarrollo-de-la-web-20/965/">Leer más &#8594;</a></p>]]></description>
										<content:encoded><![CDATA[<h2>Avalancha de Adolescentes con Déficit de Atención</h2>
<p><img loading="lazy" decoding="async" class="ar" src="/blog/assets/teenager.jpg" alt="teenager" title="teenager" width="80" height="55" class="alignnone size-full wp-image-975" />En 2003, Jamie Zawinski de la Organización Mozilla (y antes uno de los desarrolladores de Netscape Navigator) escribió un pequeño artículo acerca de una nueva tendencia a la hora de programar y diseñar software que denominó <strong></strong><strong><a href="http://www.jwz.org/doc/cadt.html">Modelo CADT</a></strong> ( Cascade of Attention-Deficit Teenagers &#8211; Avalancha de Adolescentes con Déficit de Atención )</p>
<h2>Innova como puedas 33 1/3</h2>
<p><img loading="lazy" decoding="async" class="ar" src="/blog/assets/cadt.jpg" alt="cadt" title="cadt" width="200" height="257" class="alignnone size-full wp-image-973" />El meollo del asunto es la manía de obviar totalmente el pulido de detalle y la solución de bugs en aras de una fiebre de lanzamiento de versiones y novedades sin control; Cuando una de las funcionalidades ha recibido bastantes avisos de bugs, simplemente escribes de nuevo toda la funcionalidad y cierras todos los bugs de golpe. Esto se debe, obviamente, a que arreglar bugs o programar paginados es aburrido.. mientras que probar nuevas tecnologías o formas de trabajo, no sólo es divertido, sino que siempre estamos seguros (al 100%) de que esta vez (que si, en serio) vamos a hacerlo «<strong>como debe hacerse</strong>«.</p>
<p>Esto último es en sí mismo una falacia, por poner un ejemplo, cuando descubras que <a href="http://dev.mysql.com/doc/refman/5.0/es/string-comparison-functions.html"><strong>LIKE</strong></a> no es la forma de buscar textos en MySQL y comiences a reprogramar todo utilizando <strong><a href="http://dev.mysql.com/doc/refman/5.0/es/fulltext-search.html">MySQL Full Text Search</a></strong>, entonces descubrirás <strong><a href="http://www.sphinxsearch.com/">Sphinx</a></strong> y el ciclo comenzará de nuevo. En el desarrollo de software, como en el hardware, es dificil «estar siempre a la última», pero encuentro mejor orientados los esfuerzos a mejorar velocidad/estabilidad/fiabilidad utilizando los nuevos recursos disponibles, que a poner bordes redondeados y tonos pastel a todo contenedor que nos caiga en las manos; de ahí la relación con la <strong>Web 2.0</strong> del título, entendida cómicamente, sin ánimo de ofender.</p>
<h2>El perfeccionista de mierda</h2>
<p>Personalmente, aunque soy un defensor del «Release fast, release often» del <a href="http://es.wikipedia.org/wiki/Programación_Extrema"><strong>Extreme Programming</strong></a>, reconozco en mí mismo, y en mi entorno, estas manías, y me ha hecho especial e hilarante gracia la definición de Jamie, y para intentar evitar caer en esto, hago titánicos esfuerzos por seguir la cultura del «<strong>perfeccionista de mierda</strong>«, en la cual todo error o falta de usabilidad es subsanado con prioridad UNO antes de programar nuevas características.</p>
<p>Este post va dedicado con cariño al amigo <a href="http://blog.e-shell.org"><strong>Borja</strong></a>, al que he «<em>pillado</em>» sin paginar los resultados de una búsqueda que admite la palabra «con» :D</p>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.marcosbl.com/cadt-el-estilo-de-desarrollo-de-la-web-20/965/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
			</item>
		<item>
		<title>Componentes gratuítos para desarrollo en la plataforma .NET</title>
		<link>https://blog.marcosbl.com/componentes-gratuitos-para-desarrollo-en-la-plataforma-net/936/</link>
		
		<dc:creator><![CDATA[MarcosBL]]></dc:creator>
		<pubDate>Thu, 12 Feb 2009 05:21:31 +0000</pubDate>
				<category><![CDATA[Programación]]></category>
		<category><![CDATA[Tips & Tweets]]></category>
		<guid isPermaLink="false">http://www.propiedadprivada.com/?p=936</guid>

					<description><![CDATA[<p class="lead">Completo listado de componentes gratuítos para desarrollo en la plataforma .NET. Algunos interesantes, aunque hay que separar bastante paja.</p><p class="more-link-p"><a class="btn btn-danger" href="https://blog.marcosbl.com/componentes-gratuitos-para-desarrollo-en-la-plataforma-net/936/">Leer más &#8594;</a></p>]]></description>
										<content:encoded><![CDATA[<p>Completo listado de <strong><a href="http://www.blocks4.net/FreeProducts/FreeProducts0.aspx">componentes gratuítos para desarrollo en la plataforma .NET</a></strong>. Algunos interesantes, aunque hay que separar bastante paja.</p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
