<?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>Sumolari.com &#187; trucos</title>
	<atom:link href="http://sumolari.com/tag/trucos/feed/" rel="self" type="application/rss+xml" />
	<link>http://sumolari.com</link>
	<description>Proyectos de un amante de la informática</description>
	<lastBuildDate>Thu, 09 Feb 2012 21:18:44 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Borra archivos de un pendrive en Mac OS X sin vaciar la papelara</title>
		<link>http://sumolari.com/borra-archivos-de-un-pendrive-en-mac-os-x-sin-vaciar-la-papelara/</link>
		<comments>http://sumolari.com/borra-archivos-de-un-pendrive-en-mac-os-x-sin-vaciar-la-papelara/#comments</comments>
		<pubDate>Sat, 20 Aug 2011 10:26:09 +0000</pubDate>
		<dc:creator>Sumolari</dc:creator>
				<category><![CDATA[Mac OS X]]></category>
		<category><![CDATA[Tutoriales]]></category>
		<category><![CDATA[automator]]></category>
		<category><![CDATA[trucos]]></category>

		<guid isPermaLink="false">http://sumolari.com/?p=5423</guid>
		<description><![CDATA[Editado: En la primera versión de esta pequeña aplicación había un error que provocaba que en unidades con nombres que incluyesen espacios o caracteres especiales no se borrasen los archivos de forma definitiva. Se ha resuelto y he actualizado el artículo añadiendo el enlace para descargar la última versión en lugar de la que tenía [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Editado:</strong> En la primera versión de esta pequeña aplicación había un error que provocaba que en unidades con nombres que incluyesen espacios o caracteres especiales no se borrasen los archivos de forma definitiva. Se ha resuelto y he actualizado el artículo añadiendo el enlace para descargar la última versión en lugar de la que tenía el error. ¡Gracias a Jorosa por el aviso!</p>
<div id="attachment_5430" class="wp-caption alignleft" style="width: 240px"><a href="http://sumolari.com/wp-content/uploads/2011/08/Captura-de-pantalla-2011-08-20-a-las-12.00.20.png" rel="lightbox-5423"><img class="size-thumbnail wp-image-5430 " title="Archivos &quot;borrados&quot; del pendrive" src="http://sumolari.com/wp-content/uploads/2011/08/Captura-de-pantalla-2011-08-20-a-las-12.00.20-230x130.png" alt="Archivos &quot;borrados&quot; del pendrive" width="230" height="130" /></a><p class="wp-caption-text">Hay cerca de 800MB de archivos &quot;borrados&quot; en este pendrive</p></div>
<p>Hay veces que uno se sorprende al ver ciertos comportamientos de <a href="http://sumolari.com/category/mac-os-x/">Mac OS X</a>. Uno de los que menos me gustan es la forma de borrar archivos de un dispositivo extraíble (por ejemplo, un pendrive). En lugar de borrar el archivo, como sería de esperar, o moverlo a la papelera del Mac, lo almacena en una carpeta oculta dentro del propio pendrive que usa a modo de papelera. Si nos fijamos en la papelera de nuestro Mac, veremos que los archivos que hemos borrado del pendrive aparecen en ella, aunque no estén almacenados en el Mac.</p>
<p>El problema radica en que además de no borrar realmente los archivos y dejarlos en el pendrive (ocupando parte de su preciada capacidad), no hay forma de borrar los archivos individualmente de la papelera. Si usamos la combinación <em>Función</em> + <em>Retroceso</em> lo que hacemos es devolver el archivo eliminado a su carpeta de origen en lugar de borrarlo. Estamos pues obligados a vaciar la papelera y borrar definitivamente otros archivos que tal vez no queramos perder todavía.</p>
<p>Así que, algo mosqueado porque esto no haya cambiado ni en Snow Leopard ni en Lion (ni tiene pinta de que vaya a cambiar), he creado una simple aplicación en Automator para &#8220;<em>limpiar</em>&#8221; los pendrives de archivos supuestamente eliminados.</p>
<h3>Cómo funciona</h3>
<div id="attachment_5433" class="wp-caption alignright" style="width: 240px"><a href="http://sumolari.com/wp-content/uploads/2011/08/Captura-de-pantalla-2011-08-20-a-las-12.08.27.png" rel="lightbox-5423"><img class="size-thumbnail wp-image-5433" title="La carpeta .Trashes al descubierto" src="http://sumolari.com/wp-content/uploads/2011/08/Captura-de-pantalla-2011-08-20-a-las-12.08.27-230x130.png" alt="La carpeta .Trashes al descubierto" width="230" height="130" /></a><p class="wp-caption-text">Esto lo aclara todo</p></div>
<p>Antes de dar los enlaces para descargar la aplicación, veamos cómo funciona. Como ya he dicho, Mac OS X mueve los archivos &#8220;<em>borrados</em>&#8221; a una carpeta oculta que funciona a modo de papelera. Esta carpeta se llama <em>.Trashes</em> (como de costumbre en OS X, al llevar un punto al principio del nombre, la carpeta es oculta). Si borramos la carpeta<em> .Trashes</em>, borramos todos los archivos que queríamos eliminar pero, ¿cómo la borramos sin pasar por la papelera de nuevo?</p>
<p>Aquí es donde entra en juego el potencial de un sistema basado en Unix. Gracias al comando <strong>rm</strong> (<strong>r</strong>emo<strong>v</strong>e) podemos eliminar archivos o carpetas sin necesidad de pasar por la papelera. Combinando esto con un par de parámetros, concretamente <strong>-R</strong> (borrar de forma recursiva) <strong>-f</strong> (sin pedir confirmación) y <strong>-d</strong> (directorios y archivos) conseguimos vaciar el pendrive de archivos que queríamos borrar.</p>
<p>Obviamente tener que escribir todo esto en la terminal cada vez que queremos limpiar un pendrive de archivos &#8220;<em>borrados</em>&#8221; no es muy cómodo. Para hacer más cómoda la tarea recurriremos a <em>Automator</em>, ese pobre incomprendido que si bien es capaz de hacer maravillas, la mayoría de los usuarios desconoce incluso su existencia.</p>
<p><a href="http://sumolari.com/wp-content/uploads/2011/08/Captura-de-pantalla-2011-08-20-a-las-11.43.22.png" rel="lightbox-5423"><img class="size-thumbnail wp-image-5435 alignleft leftimage" style="border: none;" title="Creamos una nueva aplicación en Automator" src="http://sumolari.com/wp-content/uploads/2011/08/Captura-de-pantalla-2011-08-20-a-las-11.43.22-230x130.png" alt="Creamos una nueva aplicación en Automator" width="230" height="130" /></a><a href="http://sumolari.com/wp-content/uploads/2011/08/Captura-de-pantalla-2011-08-20-a-las-11.53.38.png" rel="lightbox-5423"><img class="alignright size-medium wp-image-5436" title="El flujo resultante" src="http://sumolari.com/wp-content/uploads/2011/08/Captura-de-pantalla-2011-08-20-a-las-11.53.38-300x176.png" alt="El flujo resultante" width="300" height="176" /></a>Para crear la aplicación abrimos <em>Automator </em>y elegimos crear una aplicación. A continuación arrastramos las acciones para formar el flujo que podéis ver en la imagen de la derecha. Básicamente el flujo es el siguiente:</p>
<ol>
<li>Solicitamos una carpeta. El usuario deberá seleccionar un dispositivo extraíble.</li>
<li>Establecemos el valor de una variable con la ruta de la carpeta seleccionada.</li>
<li>Leemos el valor de esta variable y se lo pasamos a un script Shell como parámetro (este paso y el anterior supongo que se pueden omitir y usar el resultado del paso 1 como argumentos para el paso 4, pero por pereza no lo he comprobado &#8211; si alguien se anima que lo comente en los comentarios).</li>
<li>En el script <em>Shell</em> usamos el comando <strong>cd</strong> (<strong>c</strong>hange <strong>d</strong>ir) para ir a la ruta del pendrive.</li>
<li>A continuación, en el mismo <em>Shell</em> y cambiada la ruta a la que nos interesa, borramos la carpeta <em>.Trashes</em> con los parámetros que he expuesto antes.</li>
</ol>
<h3>Descarga</h3>
<p>Seguidos los pasos y entendido el funcionamiento, <a href="http://sumolari.com/?dl_id=7">aquí tenéis a vuestra disposición la aplicación</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://sumolari.com/borra-archivos-de-un-pendrive-en-mac-os-x-sin-vaciar-la-papelara/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Añade las llaves en una nueva línea en Xcode</title>
		<link>http://sumolari.com/anade-las-llaves-en-una-nueva-linea-en-xcode/</link>
		<comments>http://sumolari.com/anade-las-llaves-en-una-nueva-linea-en-xcode/#comments</comments>
		<pubDate>Tue, 17 Aug 2010 11:57:03 +0000</pubDate>
		<dc:creator>Sumolari</dc:creator>
				<category><![CDATA[Mac OS X]]></category>
		<category><![CDATA[Objective-C]]></category>
		<category><![CDATA[software]]></category>
		<category><![CDATA[trucos]]></category>
		<category><![CDATA[xcode]]></category>

		<guid isPermaLink="false">http://sumolari.com/?p=4398</guid>
		<description><![CDATA[Cuando se lleva algún tiempo programando se acaban cogiendo manías y estilos a la hora de escribir el código, una de las más comunes es escribir las llaves ({ y }) en la línea siguiente, en lugar de en la línea en la que acaba la sentencia, manía que además suele considerarse como buena práctica. [...]]]></description>
			<content:encoded><![CDATA[<div id="attachment_4401" class="wp-caption alignleft" style="width: 310px"><a href="http://sumolari.com/wp-content/uploads/2010/08/xcode_antes_despues.png" rel="lightbox-4398"><img class="size-medium wp-image-4401" title="Xcode: Antes y después" src="http://sumolari.com/wp-content/uploads/2010/08/xcode_antes_despues-300x89.png" alt="Xcode: Antes y después" width="300" height="89" /></a><p class="wp-caption-text">Antes (izquierda) y después (derecha)</p></div>
<p>Cuando se lleva algún tiempo programando se acaban cogiendo manías y estilos a la hora de escribir el código, una de las más comunes es escribir las llaves ({ y }) en la línea siguiente, en lugar de en la línea en la que acaba la sentencia, manía que además suele considerarse como buena práctica.</p>
<pre class="brush: objc; title: ; notranslate">
// Con las llaves en la misma línea
- (void)funcionDePrueba {
     if (condicion) {
          [self otraFuncion];
     }
}

// Con las llaves en la línea siguiente
- (void)funcionDePrueba
{
     if (condicion)
     {
          [self otraFuncion];
     }
}
</pre>
<p>La cuestión es que ahora que estoy programando en Objective-C y utilizo Xcode, se me hace muy molesto que el autocompletado de código me añada las llaves en la misma línea que la sentencia, en lugar de la siguiente (cuando programo en PHP, el editor que uso no autocompleta el código). Sin embargo hay una forma sencilla de hacer que añada las llaves en la línea siguiente: tan sólo tenemos que escribir el siguiente código en la terminal y reiniciar Xcode.</p>
<pre class="brush: plain; title: ; notranslate">defaults write com.apple.Xcode XCCodeSenseFormattingOptions '{ &quot;BlockSeparator&quot; = &quot;\n&quot; ; }' </pre>
<p>Esto sólo afecta al autocompletado de código, no a las plantillas que vienen con Xcode.</p>
]]></content:encoded>
			<wfw:commentRss>http://sumolari.com/anade-las-llaves-en-una-nueva-linea-en-xcode/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Detectar el último artículo del loop de WordPress</title>
		<link>http://sumolari.com/detectar-el-ultimo-articulo-del-loop-de-wordpress/</link>
		<comments>http://sumolari.com/detectar-el-ultimo-articulo-del-loop-de-wordpress/#comments</comments>
		<pubDate>Thu, 15 Jul 2010 10:45:25 +0000</pubDate>
		<dc:creator>Sumolari</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Tutoriales]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[trucos]]></category>

		<guid isPermaLink="false">http://sumolari.com/?p=4292</guid>
		<description><![CDATA[A veces nos interesa saber cuándo se está mostrando el primer o el último artículo del blog de WordPress para, por ejemplo, mostrar una línea de división en todos los artículos menos el último o destacar el primer artículo sobre los demás. Hay varias formas de contar los artículos que ya se han mostrado en [...]]]></description>
			<content:encoded><![CDATA[<p>A veces nos interesa saber cuándo se está mostrando el primer o el último artículo del blog de <a href="http://sumolari.com/category/wordpress/">WordPress</a> para, por ejemplo, mostrar una línea de división en todos los artículos menos el último o destacar el primer artículo sobre los demás. Hay varias formas de contar los artículos que ya se han mostrado en el loop de <a href="../category/wordpress/">WordPress</a>, en este artículo me voy a centrar en la forma más sencilla que conozco: mediante <em>$wp_query</em>.</p>
<p><em>$wp_query</em> es un objeto que contiene diversos métodos (funciones) y atributos (variables) acerca de las consultas a la Base de Datos (realmente contiene mucha información). Entre estos atributos hay dos que son los que utilizaremos y que nos facilitan mucho la tarea, se trata de:<em> current_post </em>y <em>post_count</em>. El primero indica cuál es la iteración (repetición) actual del bucle, mientras que el segundo indica el total de artículos que se mostrarán. Es decir, el primero nos dice cuántos artículos se han mostrado ya y el segundo nos indica el total de veces que se ejecutará el bucle.</p>
<p>Con ambos datos tenemos suficiente como para saber cuándo se está mostrando el primer y el último artículo. Lo único que tenemos que tener en cuenta es que <em>current_post</em> comienza en 0, mientras que <em>post_count </em>es el total de artículos que se mostrarán (partiendo de 1). Esto quiere decir que si vamos a mostrar 10 artículos en el bucle, al mostrarse el último artículo el atributo <em>current_post </em>valdrá 9, mientras que el atributo <em>post_count</em> valdrá 10.</p>
<p>A continuación os dejo un bucle de ejemplo para que entendáis mejor lo que quiero decir:</p>
<pre class="brush: php; title: ; notranslate">
if (have_posts()): while (have_posts()): the_post();

if ($wp_query-&gt;current_post == 0)
{
echo 'Este es el primer artículo del bucle';
}

if (($wp_query-&gt;current_post + 1) == $wp_query-&gt;post_count)
{
echo 'Este es el último artículo del bucle';
}

if ($wp_query-&gt;current_post &gt; 0)
{
echo 'Este no es el primer artículo del bucle';
}

if (($wp_query-&gt;current_post + 1)  &lt; $wp_query-&gt;post_count)
{
echo 'Este no es el último artículo del bucle';
}

if (($wp_query-&gt;current_post &gt; 0) &amp;&amp; (($wp_query-&gt;current_post + 1)  &lt; $wp_query-&gt;post_count))
{
echo 'Este no es ni el primer artículo del bucle ni el último';
}

endwhile; endif;
</pre>
<p>Realmente no tiene mucha complicación y facilita bastante el detectar cuándo se muestra el primer o el último artículo.</p>
]]></content:encoded>
			<wfw:commentRss>http://sumolari.com/detectar-el-ultimo-articulo-del-loop-de-wordpress/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Control remoto en Mac OS X y Windows con VNC</title>
		<link>http://sumolari.com/control-remoto-en-mac-os-x-y-windows-con-vnc/</link>
		<comments>http://sumolari.com/control-remoto-en-mac-os-x-y-windows-con-vnc/#comments</comments>
		<pubDate>Mon, 24 May 2010 18:10:04 +0000</pubDate>
		<dc:creator>Sumolari</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Mac OS X]]></category>
		<category><![CDATA[Tutoriales]]></category>
		<category><![CDATA[Windows]]></category>
		<category><![CDATA[descargas]]></category>
		<category><![CDATA[software]]></category>
		<category><![CDATA[trucos]]></category>

		<guid isPermaLink="false">http://sumolari.com/?p=3975</guid>
		<description><![CDATA[Tenemos una red local y carpetas y archivos compartidos entre nuestros equipos. ¿Cuál es el siguiente paso? Controlar un equipo desde el otro. Quizá en principio la utilidad parezca poca (te ahorras levantarte, ir al otro equipo, encender la pantalla y ponerle las pilas al ratón), pero una vez te acostumbras, se hace difícil dejarlo [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://sumolari.com/wp-content/uploads/2010/05/ultravnc_viewer.png" rel="lightbox-3975"><img class="alignright size-large wp-image-3979" title="Controlando Mac OS X desde Windows" src="http://sumolari.com/wp-content/uploads/2010/05/ultravnc_viewer-848x571.png" alt="Controlando Mac OS X desde Windows" width="848" height="571" /></a></p>
<p>Tenemos una red local y carpetas y archivos compartidos entre nuestros equipos. ¿Cuál es el siguiente paso? <strong>Controlar un equipo desde el otro</strong>. Quizá en principio la utilidad parezca poca (te ahorras levantarte, ir al otro equipo, encender la pantalla y ponerle las pilas al ratón), pero una vez te acostumbras, se hace difícil dejarlo de lado, sobretodo cuando se trata de una combinación de sobremesa y portátil.</p>
<p>Veamos ahora cómo controlar de forma remota un ordenador con <a href="http://sumolari.com/category/windows/">Windows</a> y un Mac con <a href="../category/mac-os-x/">Mac OS X</a> mediante el protocolo VNC. Para esto necesitaremos dos aplicaciones diferentes: un <strong>cliente VNC</strong> y un <strong>servidor VNC</strong>. El <strong>servidor VNC habilita el control remoto</strong> del equipo en el que está instalado, mientras que <strong>el cliente VNC permite a un equipo controlar un ordenador</strong> que tenga instalado un servidor VNC.</p>
<p><a href="http://sumolari.com/category/mac-os-x/">Mac OS X</a> <strong>incorpora un cliente y un servidor VNC </strong>(de los que hablaré más adelante), así que tan sólo tendremos que instalar el paquete de cliente y servidor en <a href="../category/windows/">Windows</a>. Hay multitud de paquetes diferentes, pero yo me centraré en <a href="http://www.uvnc.com/">UltraVNC</a>, que es de momento el que mejor que me ha funcionado hasta ahora y que además <strong>es totalmente gratuito</strong> (podéis descargarlo <a href="http://www.uvnc.com/download/1082/1082full.html">aquí</a>). Una vez descargado e instalado, tendremos que ejecutar la aplicación <em>UltraVNC Server</em>, que como su nombre indica, es el <strong>servidor VNC </strong>de <a href="http://www.uvnc.com/">UltraVNC</a>. El <strong>cliente VNC </strong>se llama <em>UltraVNC Viewer</em>.</p>
<div id="attachment_3976" class="wp-caption alignleft" style="width: 240px"><a href="http://sumolari.com/wp-content/uploads/2010/05/ultravnc.png" rel="lightbox-3975"><img class="size-thumbnail wp-image-3976" title="UltraVNC Server" src="http://sumolari.com/wp-content/uploads/2010/05/ultravnc-230x130.png" alt="UltraVNC Server" width="230" height="130" /></a><p class="wp-caption-text">UltraVNC Server</p></div>
<p>Una vez ejecutado el servidor en <a href="../category/windows/">Windows</a>, veremos una ventana como la de la imagen de la izquierda. Hay bastantes opciones que podemos personalizar, aunque la que más nos interesará en principio es la <strong>contraseña</strong> para acceder al equipo: no queremos que cualquiera con un cliente VNC y nuestra IP pueda acceder a nuestro equipo.</p>
<p>Entre otras cosas más o menos útiles, podemos hacer que <strong>el invitado sólo pueda ver la pantalla</strong>, sin poder modificada nada o <strong>eliminar los efectos de Aero</strong> de <a href="../category/windows/">Windows</a> y el fondo de pantalla al conectarse un invitado (para mejorar el rendimiento).</p>
<div id="attachment_3977" class="wp-caption alignright" style="width: 240px"><a href="http://sumolari.com/wp-content/uploads/2010/05/servidorvnc_macosx.png" rel="lightbox-3975"><img class="size-thumbnail wp-image-3977" title="Compartir Pantalla" src="http://sumolari.com/wp-content/uploads/2010/05/servidorvnc_macosx-230x130.png" alt="Compartir Pantalla" width="230" height="130" /></a><p class="wp-caption-text">Compartir Pantalla</p></div>
<p>Habilitar el <strong>servidor VNC</strong> en <a href="../category/mac-os-x/">Mac OS X</a> es muy sencillo. Basta con ir a <em>Preferencias del Sistema</em>, dentro a <em>Compartir</em>. La segunda opción de la lista de la izquierda es <em>Compartir Pantalla</em>, que se traduce en <em>Habilitar Servidor VNC</em>. El servidor VNC incorporado en <a href="../category/mac-os-x/">Mac OS X</a> tiene menos opciones que <a href="http://www.uvnc.com/">UltraVNC</a>, pero para el uso diario nos vale. Podéis ver la pantalla en cuestión en la imagen de la derecha.</p>
<p>Con el servidor VNC ejecutándose en ambos equipos, sólo necesitamos utilizar el cliente VNC para poder controlarlos de forma remota. El <strong>cliente VNC</strong> de <a href="http://www.uvnc.com/">UltraVNC</a>, como he comentado antes, se llama <em>UltraVNC Viewer</em>, así que lo ejecutamos.</p>
<div id="attachment_3978" class="wp-caption alignleft" style="width: 240px"><a href="http://sumolari.com/wp-content/uploads/2010/05/clientevnc_mac.png" rel="lightbox-3975"><img class="size-thumbnail wp-image-3978" title="Controlando Windows desde Mac OS X" src="http://sumolari.com/wp-content/uploads/2010/05/clientevnc_mac-230x130.png" alt="Controlando Windows desde Mac OS X" width="230" height="130" /></a><p class="wp-caption-text">Controlando Windows desde Mac OS X</p></div>
<p>Nos pedirá la IP del ordenador al que nos vamos a conectar (también se puede utilizar el nombre del equipo) y nos permite escoger entre diversas opciones de velocidad de la red (que básicamente reduce la calidad de la imagen que veremos pero a cambio ganaremos rendimiento), acceder en modo &#8220;sólo visión&#8221; (es decir, sin poder interactuar con el equipo, sólo pudiendo ver lo que hace), activar el auto escalado, etc. A continuación nos pedirá la contraseña del servidor (si la hay).</p>
<p>En <a href="../category/mac-os-x/">Mac OS X</a> nos podemos conectar a un servidor VNC desde el <strong>Finder</strong>. Para ello vamos a <em>Ir</em> -&gt; <em>Conectarse al servidor</em> (o pulsamos la combinación de teclas <em>Cmd</em> + <em>K</em>). Se abrirá una ventana pidiéndonos la dirección del servidor, done introduciremos <em>vnc://&lt;IP_DEL_SERVIDOR&gt;</em>. Nos pedirá la contraseña del servidor (si la hay) y a continuación tendremos acceso vía VNC al otro equipo.</p>
<p>También se puede controlar un equipo con una distribución de <a href="http://sumolari.com/category/linux/">Linux</a> desde <a href="../category/windows/">Windows</a> y <a href="../category/mac-os-x/">Mac OS X</a> (y éste puede controlar a los otros) o incluso desde un <strong>iPhone</strong> (basta con instalar alguna aplicación que haga de cliente VNC para poder controlar otros equipos).</p>
]]></content:encoded>
			<wfw:commentRss>http://sumolari.com/control-remoto-en-mac-os-x-y-windows-con-vnc/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Restaurar un Mac desde una copia de seguridad de Time Machine</title>
		<link>http://sumolari.com/restaurar-un-mac-desde-una-copia-de-seguridad-de-time-machine/</link>
		<comments>http://sumolari.com/restaurar-un-mac-desde-una-copia-de-seguridad-de-time-machine/#comments</comments>
		<pubDate>Tue, 18 May 2010 18:14:08 +0000</pubDate>
		<dc:creator>Sumolari</dc:creator>
				<category><![CDATA[Mac OS X]]></category>
		<category><![CDATA[Tutoriales]]></category>
		<category><![CDATA[apple]]></category>
		<category><![CDATA[Mac]]></category>
		<category><![CDATA[Mac OS X Leopard]]></category>
		<category><![CDATA[Mac OS X Snow Leopard]]></category>
		<category><![CDATA[trucos]]></category>

		<guid isPermaLink="false">http://sumolari.com/?p=3945</guid>
		<description><![CDATA[Una de las cosas que más me sorprendieron de Mac OS X fue Time Machine. Se trata de un sistema de copias de seguridad que permite restaurar cualquier archivo de nuestro disco duro a una versión anterior del mismo (o restaurar archivos que borramos de nuestro disco duro). Time Machine guarda copias horarias del disco [...]]]></description>
			<content:encoded><![CDATA[<p>Una de las cosas que más me sorprendieron de <a href="http://sumolari.com/category/mac-os-x/">Mac OS X</a> fue <strong>Time Machine</strong>. Se trata de un sistema de copias de seguridad que permite restaurar cualquier archivo de nuestro disco duro a una versión anterior del mismo (o restaurar archivos que borramos de nuestro disco duro). <strong>Time Machine</strong> guarda copias horarias del disco duro de las últimas 24 horas, copias diarias del último mes y copias semanales de todo lo que tenga más de un mes de antigüedad hasta que se acabe el espacio en el disco duro donde se almacena la copia, en cuyo caso te propondrá borrar las copias anteriores para poder seguir añadiendo archivos.</p>
<p>Lo bueno de <strong>Time Machine</strong> es que no sólo permite restaurar archivos, sino todo el sistema operativo: aplicaciones, preferencias, documentos, cuentas, etc. Pongamos por ejemplo, que cambiamos el disco duro de nuestro Mac y reinstalamos <a href="../category/mac-os-x/">Mac OS X</a>. Pues bien, podemos evitarnos tener que configurar todo el equipo e instalar todas las aplicaciones si tenemos a mano una copia de <strong>Time Machine</strong>. Además, el proceso de restauración es la mar de sencillo.</p>
<p>Lo primero que tenemos que hacer es instalar como de costumbre <a href="../category/mac-os-x/">Mac OS X</a>. Cuando haya finalizado la instalación nos mostrará un vídeo de bienvenida y nos preguntará por el idioma. Disculpad la calidad de las imágenes: estaba restaurando mi MacBook (he cambiado el disco duro por uno de 500GB y tenía que reinstalar <a href="../category/mac-os-x/">Mac OS X</a>) y no he podido sacar mejores fotos.</p>
<p><a href="http://sumolari.com/wp-content/uploads/2010/05/paso1.jpg" rel="lightbox-3945"><img class="alignnone size-large wp-image-3946" title="Pantalla de bienvenida" src="http://sumolari.com/wp-content/uploads/2010/05/paso1-848x636.jpg" alt="Pantalla de bienvenida" width="848" height="636" /></a></p>
<p><a href="http://sumolari.com/wp-content/uploads/2010/05/paso2.jpg" rel="lightbox-3945"><img class="alignnone size-large wp-image-3947" title="Selección de idioma" src="http://sumolari.com/wp-content/uploads/2010/05/paso2-848x636.jpg" alt="Selección de idioma" width="848" height="636" /></a></p>
<p>A continuación nos preguntará acerca de si tenemos una copia de seguridad. Básicamente nos ofrece 4 opciones: La primera es que si tenemos otro Mac, restauremos a partir de él; la segunda es restaurar a partir del contenido de otro disco duro del Mac en el que se está instalando <a href="../category/mac-os-x/">Mac OS X</a> (supongo que también valdrá para particiones); la tercera es restaurar desde una copia de seguridad de<strong> Time Machine</strong> (la que debemos seleccionar) y la cuarta es comenzar de 0 y no restaurar nada.</p>
<p><a href="http://sumolari.com/wp-content/uploads/2010/05/paso2b.jpg" rel="lightbox-3945"><img class="alignnone size-large wp-image-3951" title="Opciones de migración" src="http://sumolari.com/wp-content/uploads/2010/05/paso2b-848x636.jpg" alt="Opciones de migración" width="848" height="636" /></a></p>
<p>Lo siguiente que nos pedirá <a href="../category/mac-os-x/">Mac OS X</a> es el volumen donde está almacenada la copia de <strong>Time Machine</strong>. Dependiendo de si está conectado por cable (sea Ethernet, USB o Firewire) o si se accede de forma inalámbrica (creo que el único método que permite es WiFi, aunque no estoy seguro), habrá más pasos intermedios o no. Yo he realizado la restauración desde una <strong>Time Capsule</strong> conectada por el cable Ethernet, con lo cual el siguiente paso ha sido directamente seleccionar el volumen (Data) y seleccionar el contenido a restaurar (en mi caso todo).</p>
<p><a href="http://sumolari.com/wp-content/uploads/2010/05/paso3.jpg" rel="lightbox-3945"><img class="alignnone size-large wp-image-3948" title="Seleccionamos el volumen donde está el backup" src="http://sumolari.com/wp-content/uploads/2010/05/paso3-848x636.jpg" alt="Seleccionamos el volumen donde está el backup" width="848" height="636" /></a></p>
<p><a href="http://sumolari.com/wp-content/uploads/2010/05/paso4.jpg" rel="lightbox-3945"><img class="alignnone size-large wp-image-3949" title="Seleccionamos el contenido a restaurar" src="http://sumolari.com/wp-content/uploads/2010/05/paso4-848x636.jpg" alt="Seleccionamos el contenido a restaurar" width="848" height="636" /></a></p>
<p>Por último, <a href="../category/mac-os-x/">Mac OS X</a> comenzará la restauración. El proceso es muy lento, en mi caso, para restaurar menos de 120GB, <a href="../category/mac-os-x/">Mac OS X</a> ha necesitado algo más de 2 horas. Aunque las ventajas superan con creces el tiempo necesario, ya que con esto nos evitamos tener que reinstalar todas las aplicaciones, configurar las preferencias y copiar nuestros documentos.</p>
<p>No está nada mal, ¿no creéis?</p>
]]></content:encoded>
			<wfw:commentRss>http://sumolari.com/restaurar-un-mac-desde-una-copia-de-seguridad-de-time-machine/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Modifica la pestaña de ayuda de WordPress</title>
		<link>http://sumolari.com/modifica-la-pestana-de-ayuda-de-wordpress/</link>
		<comments>http://sumolari.com/modifica-la-pestana-de-ayuda-de-wordpress/#comments</comments>
		<pubDate>Mon, 03 May 2010 17:24:32 +0000</pubDate>
		<dc:creator>Sumolari</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Tutoriales]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[trucos]]></category>
		<category><![CDATA[WordPress 2.7]]></category>
		<category><![CDATA[WordPress 2.8]]></category>
		<category><![CDATA[WordPress 2.9]]></category>
		<category><![CDATA[WordPress 3.0]]></category>

		<guid isPermaLink="false">http://sumolari.com/?p=3904</guid>
		<description><![CDATA[En WordPress 2.7 se añadió un nuevo elemento al Panel de Administración: la pestaña de ayuda / ayuda contextual. Esta pestaña ofrece algo de información en las páginas de edición de artículos o en el escritorio, pero no sirve de mucho en las páginas de los plugins. Esto se debe a que para poder dar [...]]]></description>
			<content:encoded><![CDATA[<div id="attachment_3905" class="wp-caption alignleft" style="width: 310px"><a href="http://sumolari.com/wp-content/uploads/2010/05/help_tab.png" rel="lightbox-3904"><img class="size-medium wp-image-3905" title="Ayuda contextual modificada" src="http://sumolari.com/wp-content/uploads/2010/05/help_tab-300x57.png" alt="Ayuda contextual modificada" width="300" height="57" /></a><p class="wp-caption-text">Ayuda contextual modificada</p></div>
<p>En <a href="http://sumolari.com/tag/wordpress-27/">WordPress 2.7</a> se añadió un nuevo elemento al <em>Panel de Administración</em>: la <strong>pestaña de ayuda</strong> /<strong> ayuda contextual</strong>. Esta pestaña ofrece algo de información en las páginas de edición de artículos o en el escritorio, pero no sirve de mucho en las páginas de los plugins. Esto se debe a que para poder dar ayuda sobre nuestro plugin debemos <a href="http://sumolari.com/introduccion-a-los-filtros-y-las-acciones-de-wordpress/">recurrir a los filtros</a>, sin embargo el filtro que afecta a la ayuda contextual no aparece en la documentación.</p>
<p>No obstante, una vez conocemos el nombre del filtro, que por cierto es <em>contextual_help</em>, es realmente fácil modificar el contenido, aunque debemos tener cuidado y prestar atención a las ocasiones en las que añadimos nuestra función al filtro, ya que nos descuidamos podemos hacer que la ayuda de nuestro plugin aparezca en todas las páginas, y esto no es lo que queremos.</p>
<p>Para añadir nuestra función sólo cuando se accede a la página de nuestro plugin debemos recurrir a una acción, llamada <em>load-X</em>, donde <em>X </em>es la página de nuestro plugin (en realidad puede ser cualquier página del<em> Panel de Administración</em>). El valor de <em>X</em> debe ser el que devuelve la función <em>add_submenu_page</em> (o <em>add_N_page</em>) para que se aplique correctamente la función.</p>
<p>Dicha la teoría, pasemos a la práctica:</p>
<pre class="brush: php; title: ; notranslate">
// Añadimos un enlace al menú
$pagina = add_submenu_page('wp-carousel', 'Carousel Z', 'Carousel Z', 'administrator', 'edit-carousel', 'wp_carousel_carousel_options_page');

// Modificamos la pestaña de ayuda
add_action('load-'.$pagina, 'wp_carousel_custom_help_tab'); 

// Esta función añade la segunda función al filtro
function wp_carousel_custom_help_tab() {
// Añadimos al filtro
add_filter('contextual_help', 'wp_carousel_custom_help_tab_filter');
}

// Esta función cambia el contenido que se muestra
function wp_carousel_custom_help_tab_filter($help) {
echo &quot;&lt;h5&gt;&quot;.__('WP Carousel\'s Quick Help', 'wp_carousel').&quot;&lt;/h5&gt;&quot;; // Nuevo contenido
echo &quot;&lt;p&gt;&quot;.__('You can find help here, here and here', 'wp_carousel').&quot;.&lt;/p&gt;&quot;; // Nuevo contenido
printf (&quot;&lt;p&gt;&quot;.__('Please, fill up &lt;a href=&quot;%s&quot;&gt;this survey&lt;/a&gt; in order to improve WP Carousel', 'wp_carousel').&quot;.&lt;/p&gt;&quot;, WP_CAROUSEL_SURVEY); // Nuevo contenido
echo $help; // Imprimos también el contenido que hay por defecto
}
</pre>
<p>Como podéis ver, el funcionamiento es bastante sencillo.</p>
<p><strong>PD:</strong> Sí, este código es parte de <a href="http://sumolari.com/wp-carousel/">WP Carousel 0.5</a>. Hacer uso de la pestaña de ayuda contextual es una de las novedades de la próxima versión, aunque es una de las novedades menos interesantes&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://sumolari.com/modifica-la-pestana-de-ayuda-de-wordpress/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Publica artículos sólo para usuarios registrados en WordPress</title>
		<link>http://sumolari.com/publica-articulos-solo-para-usuarios-registrados-en-wordpress/</link>
		<comments>http://sumolari.com/publica-articulos-solo-para-usuarios-registrados-en-wordpress/#comments</comments>
		<pubDate>Wed, 28 Apr 2010 21:11:50 +0000</pubDate>
		<dc:creator>Sumolari</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Tutoriales]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[trucos]]></category>

		<guid isPermaLink="false">http://sumolari.com/?p=3887</guid>
		<description><![CDATA[Ayer comenté que intentaría mejorar un poco el script que descubrí vía AyudaWordPress. Pues bien, ya está modificado y con él tan sólo es necesario añadir el campo personalizado &#8220;login&#8221; con el valor &#8220;1&#8221; al artículo que se quiera bloquear para permitir el acceso sólo a usuarios registrados. El código es el que tenéis a [...]]]></description>
			<content:encoded><![CDATA[<p>Ayer comenté que intentaría mejorar un poco el script que descubrí vía <a href="http://ayudawordpress.com/forzar-el-acceso-en-ciertas-entradas/">AyudaWordPress</a>. Pues bien, ya está modificado y con él tan sólo es necesario añadir el campo personalizado &#8220;<em>login</em>&#8221; con el valor &#8220;<em>1</em>&#8221; al artículo que se quiera bloquear para permitir el acceso sólo a usuarios registrados. El código es el que tenéis a continuación, y básicamente impide acceder a los artículos que tengan dicho campo personalizado con el valor 1 si el usuario no ha iniciado sesión, sin embargo sí que es visible en el índice del blog o en el archivo (al igual que en el feed).</p>
<p>El código está comentado, explicando qué hace cada cosa, espero que os sirva de ayuda. Para utilizarlo basta con ponerlo en el archivo <em>functions.php </em>de vuestro theme, o podéis descargar <a href="http://sumolari.com/wp-content/uploads/2010/04/post_protector.php_.zip">este archivo</a> y subirlo a la carpeta de plugins y activarlo como un plugin más, tiene el mismo resultado.</p>
<pre class="brush: php; title: ; notranslate">
&lt;?php

	// Nuestra funcion para forzar el inicio de sesion
	function forzar_login()
	{

		if (is_single())
		{

			global $post; // Obtenemos la informacion respecto al articulo actual

			if (get_post_meta($post-&gt;ID, 'login', true) == '1') // Comprobamos el valor del campo personalizado login
			{
				// Para ver este articulo tiene que estar registrado
				if (!is_user_logged_in()) // Comprobamos si el usuario ha iniciado sesion
				{
					// No ha iniciado sesion, redirigimos
					auth_redirect();
				}
				else
				{
					// Ha iniciado sesion, luego puede ver el articulo
				}
			}
			else
			{
				// Puede ver este articulo tranquilamente porque no esta bloqueado
			}

		}
		else
		{
			// Esta viendo el articulo desde una pagina de archivo o el index del blog, se podria ocultar aqui tambien, pero la idea es que el usuario pueda ver el articulo en las listas pero para poder leerlo al completo tenga que iniciar sesion, asi que dejaremos esto tal cual
			return;
		}
	}
	add_action('wp', 'forzar_login'); // Añadimos la funcion a la accion

?&gt;
</pre>
]]></content:encoded>
			<wfw:commentRss>http://sumolari.com/publica-articulos-solo-para-usuarios-registrados-en-wordpress/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Haz que WordPress cargue los frameworks desde servidores externos</title>
		<link>http://sumolari.com/haz-que-wordpress-cargue-los-frameworks-desde-servidores-externos/</link>
		<comments>http://sumolari.com/haz-que-wordpress-cargue-los-frameworks-desde-servidores-externos/#comments</comments>
		<pubDate>Wed, 17 Feb 2010 19:18:29 +0000</pubDate>
		<dc:creator>Sumolari</dc:creator>
				<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Tutoriales]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[prototype]]></category>
		<category><![CDATA[trucos]]></category>

		<guid isPermaLink="false">http://sumolari.com/?p=3530</guid>
		<description><![CDATA[WordPress utiliza varios frameworks Javascript para hacer diversos efectos y mejorar a interfaz, además de que algunos themes se aprovechan de esto para añadir mejoras al diseño utilizando funciones que ofrecen estos frameworks. Recurrir a estos métodos ocasiona un aumento del tiempo de carga de la página y del ancho de banda consumido por el [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://sumolari.com/category/wordpress/">WordPress</a> utiliza varios frameworks <a href="http://sumolari.com/category/javascript">Javascript</a> para hacer diversos efectos y mejorar a interfaz, además de que algunos themes se aprovechan de esto para añadir mejoras al diseño utilizando funciones que ofrecen estos frameworks. Recurrir a estos métodos ocasiona un aumento del tiempo de carga de la página y del ancho de banda consumido por el servidor al enviar los archivos solicitados al usuario, sin embargo, podemos hacer que <a href="../category/wordpress/">WordPress</a> cargue estos archivos desde servidores externos que nos reducen el ancho de banda gastado y que, en algunos casos, son más rápidos que nuestro servidor. Además, usar este método también nos permite cargar automáticamente la versión más actualizada de los diversos frameworks, evitando tener que volver a subir las nuevas versiones a nuestro servidor.</p>
<p>En este artículo me centraré en <a href="http://sumolari.com/tag/jquery/">jQuery</a>, j<a href="http://ui.jquery.com">Query UI</a> y <a href="http://www.prototypejs.org/">Prototype</a>, los frameworks que utiliza actualmente <a href="http://sumolari.com">Sumolari.com</a>, pero antes de hacer que <a href="../category/wordpress/">WordPress</a> cargue los archivos desde servidores externos (usaremos los de Google), veremos primero el método general.</p>
<h3>wp_deregister_script, wp_register_script y wp_enqueue_script</h3>
<p><a href="../category/wordpress/">WordPress</a> tiene varias funciones para gestionar el código <a href="../category/javascript">Javascript</a> que se carga en cada página. Esta funciones permiten, a grandes rasgos, añadir un script con un nombre identificatorio (del cual se definen la URL del archivo, las dependencias, la versión o incluso si se puede cargar en el pie de página o no), eliminarlo o cargarlo.</p>
<p>Para el primero de todos los usos, recurriremos a la función <em>wp_register_script</em>. Esta función tiene 5 parámetros:<em> $handle</em>, <em>$src</em>, <em>$deps</em>, <em>$ver</em> e <em>$in_footer</em>.</p>
<pre class="brush: php; title: ; notranslate">wp_register_script( $handle, $src, $deps, $ver, $in_footer );</pre>
<p>La primera de todas debe contener el nombre identificatorio del script. Yo recomiendo usar nombres coherentes, así evitamos posibles problemas al usar muchos scripts y no distinguir unos de otros por su nombre.</p>
<p>El segundo parámetro de la función indica la URL del archivo a cargar. Tanto el primer parámetro como éste son obligatorios, los otros tres son opcionales y son, por orden de aparición, la matriz que indica las dependencias (estas dependencias se deben indicar usando el nombre identificatorio del script correspondiente), la versión del archivo a cargar (se utiliza para evitar problemas con la caché y demás, pero en muchos casos basta con dejarlo en blanco) y si el script se puede cargar al final de la página o no.</p>
<p>La función <em>wp_deregister_script</em> es la que elimina un script previamente registrado. Esto nos permitirá eliminar los script registrados por <a href="../category/wordpress/">WordPress</a> y añadir los nuestros modificados. El uso sería el siguiente:</p>
<pre class="brush: php; title: ; notranslate">wp_deregister_script( $handle );</pre>
<p>La función <em>wp_enqueue_script</em> es la que le indica a <a href="../category/wordpress/">WordPress</a> que debe cargar cierto script. Admite los mismos parámetros que <em>wp_register_script</em>, sólo que en la primera, a diferencia de la segunda, el nombre identificatorio le indica a la función qué script debe cargar (ya que esta función <strong>no</strong> registra ningún script) y sólo usará los demás parámetros en caso de no existir el script solicitado.</p>
<p>El uso es el siguiente:</p>
<pre class="brush: php; title: ; notranslate">
wp_enqueue_script( $handle ); // Mínimo
wp_enqueue_script( $handle, $src, $deps, $ver, $in_footer ); // Parámetros opcionales
</pre>
<p>Tenéis más información sobre estas funciones en el <a href="http://codex.wordpress.org/Function_Reference/wp_enqueue_script">Codex de WordPress</a>.</p>
<p>Dicho lo cual ya podemos pasar a aplicar lo visto hasta ahora.</p>
<h3>Cargando jQuery, jQuery UI y Prototype desde los servidores de Google</h3>
<p>Una pequeña aclaración antes de comenzar: podemos cargar cualquier script de <a href="../category/wordpress/">WordPress</a> (<a href="http://codex.wordpress.org/Function_Reference/wp_enqueue_script#Default_scripts_included_with_WordPress">lista completa</a>) desde cualquier servidor, de hecho veréis como no es nada complicado hacerlo.</p>
<p>Los scripts están alojados en <a href="http://code.google.com/intl/es/apis/ajaxlibs/">los servidores de Google</a>, que ofrecen una buena velocidad y se actualizan con cada nueva versión. También almacenan versiones antiguas de los frameworks, con lo que podemos optar por cargar una versión actualizada, la última o una más antigua.</p>
<p>El proceso para cargar los scripts es el siguiente:</p>
<ol>
<li>Eliminamos (des-registramos) el script correspondiente a los frameworks <a href="../tag/jquery/">jQuery</a>, j<a href="http://ui.jquery.com/">Query UI</a> y <a href="http://www.prototypejs.org/">Prototype</a><a href="http://www.prototypejs.org/"></a> de <a href="../category/wordpress/">WordPress</a></li>
<li>Registramos de nuevo los tres scripts anteriores, cambiando la URL de los archivos</li>
<li>Cargamos los scripts recién registrados</li>
</ol>
<p>Esto en código quedaría así:</p>
<pre class="brush: php; title: ; notranslate">
// jQuery
		wp_deregister_script('jquery'); // Des-registramos jQuery
		wp_register_script('jquery', (&quot;http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js&quot;), false, ''); // Registramos de nuevo jQuery, con la URL de la última versión del framework alojada en el servidor de Google
		wp_enqueue_script('jquery'); // Cargamos jQuery

		// jQuery-UI
		wp_deregister_script('jquery-ui-core'); // Des-registramos jQuery-UI
		wp_register_script('jquery-ui-core', (&quot;http://ajax.googleapis.com/ajax/libs/jqueryui/1/jquery-ui.min.js&quot;), false, ''); // Registramos de nuevo jQuery-UI, con la URL de la última versión del framework alojada en el servidor de Google
		wp_enqueue_script('jquery-ui-core'); // Cargamos jQuery-UI

		// Prototype
		wp_deregister_script('prototype'); // Des-registramos Prototye
		wp_register_script('prototype', (&quot;http://ajax.googleapis.com/ajax/libs/prototype/1/prototype.js&quot;), false, ''); // Registramos de nuevo Prototype, con la URL de la última versión del framework alojada en el servidor de Google
		wp_enqueue_script('prototype'); // Cargamos Prototype
</pre>
<p>Como veis, no tiene mucho misterio y es muy fácil ampliarlo a otros scripts. Como siempre, cualquier duda o sugerencia la podéis hacer en los comentarios.</p>
<p><strong>Nota: </strong>La versión que carga por defecto <a href="../category/wordpress/">WordPress</a> de <a href="../tag/jquery/">jQuery</a> incluye una llamada a la función  <a href="http://sumolari.com/como-evitar-conflictos-entre-mootools-y-jquery/">jQuery.noConflic</a>t, por lo que en el primer script que utilice <a href="../tag/jquery/">jQuery</a> deberemos hacer una llamada a esta función para asegurar que todos los scripts funcionen correctamente.</p>
]]></content:encoded>
			<wfw:commentRss>http://sumolari.com/haz-que-wordpress-cargue-los-frameworks-desde-servidores-externos/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Ocultando artículos y categorías del loop de WordPress</title>
		<link>http://sumolari.com/ocultando-articulos-y-categorias-del-loop-de-wordpress/</link>
		<comments>http://sumolari.com/ocultando-articulos-y-categorias-del-loop-de-wordpress/#comments</comments>
		<pubDate>Mon, 08 Feb 2010 19:55:16 +0000</pubDate>
		<dc:creator>Sumolari</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Tutoriales]]></category>
		<category><![CDATA[Windows]]></category>
		<category><![CDATA[plugins]]></category>
		<category><![CDATA[trucos]]></category>

		<guid isPermaLink="false">http://sumolari.com/?p=3490</guid>
		<description><![CDATA[Nota: Para entender este tutorial son necesarios unos conocimientos básicos de PHP (sobretodo de matrices) y de WordPress (para saber las IDs del contenido y el lugar donde poner el código). Hay veces en las que queremos ocultar ciertos artículos o categorías del loop de WordPress (el bucle principal que se encarga de mostrar el [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Nota:</strong> Para entender este tutorial son necesarios unos conocimientos básicos de <a href="http://sumolari.com/category/php/">PHP</a> (sobretodo de matrices) y de <a href="http://sumolari.com/category/wordpress/">WordPress</a> (para saber las IDs del contenido y el lugar donde poner el código).</p>
<p>Hay veces en las que queremos ocultar ciertos artículos o categorías del loop de <a href="../category/wordpress/">WordPress</a> (el bucle principal que se encarga de mostrar el contenido de la página). En estos casos podemos recurrir a diversos métodos, como comprobar dentro del propio bucle si el artículo está en cierta categoría o tiene una ID determinada. Sin embargo, estos métodos no se pueden aplicar a plugins porque estos no pueden modificar código del bucle, así que debemos buscar un método diferente.</p>
<div id="attachment_3491" class="wp-caption alignleft" style="width: 240px"><a href="http://sumolari.com/wp-content/uploads/2010/02/wp_query.png" rel="lightbox-3490"><img class="size-thumbnail wp-image-3491" title="Mostrando $wp_query" src="http://sumolari.com/wp-content/uploads/2010/02/wp_query-230x130.png" alt="Mostrando $wp_query" width="230" height="130" /></a><p class="wp-caption-text">Mostrando $wp_query</p></div>
<p>Durante el desarrollo de la versión 0.4 de <a href="http://sumolari.com/plugins-temas/wp-carousel/">WP Carousel</a> me topé con este problema, y decidido a superarlo, tomé la vía probablemente más radical: <strong>modificar la variable <em>$wp_query</em></strong>. Esta variable almacena toda la información referente a las consultas a la <strong>Base de Datos</strong>, incluyendo el contenido consultado, los filtros aplicados, el orden. De hecho, si imprimimos esta variable, obtendremos un resultado enorme, que podéis ver en parte en la imagen de la izquierda.</p>
<p><strong>Alterando el contenido de esta variable se pueden hacer multitud de cosas</strong>, sin embargo nos centraremos en ocultar contenido del bucle.</p>
<p>Si nos fijamos en la variable, veremos que es una matriz. Los índices que nos interesan son los siguientes: <em>category__not_in</em>, <em>tag__not_in </em>y<em> post__not_in</em>. Son unos índices con unos nombres realmente descriptivos, ¿verdad? El primero nos permite eliminar categorías del bucle, el segundo nos permite eliminar etiquetas y el último nos permite eliminar artículos individuales.</p>
<p><strong>El contenido de estos índices debe ser una matriz</strong>, la cual almacenará en todos los casos las IDs del contenido a ocultar. Veamos de forma práctica cómo ocultaríamos las categorías 3, 19 y 62 del bucle:</p>
<pre class="brush: php; title: ; notranslate">

$wp_query-&gt;query_vars['category__not_in'] = array(3, 19, 62);

$wp_query-&gt;query($wp_query-&gt;query_vars);
</pre>
<p>La primera línea está clara, pero, ¿y la segunda? Se trata de una llamada a la función <em>query()</em>, que vuelve a realizar la consulta y elimina el contenido previamente guardado. Antes he comentado que esta variable almacena resultados de las consultas, así que es necesario limpiar la variable de resultados antiguos y rellenarla de nuevos, de otro modo no siempre funcionaría el código.</p>
<p>Este código no funciona en cualquier lugar de <a href="../category/wordpress/">WordPress</a>. Si pensamos con un poco de lógica, llegaremos a la conclusión de que debemos poner el código antes del bucle (porque si lo ponemos después, ya se habrá mostrado el contenido y no habrá nada que filtrar). Pero, ¿en qué lugar añadirlo? Bien, realmente se puede añadir en cualquier lugar antes del bucle. En el archivo <em>functions.php</em> del theme, en un plugin por separado (como ocurre con <a href="http://sumolari.com/plugins-temas/wp-carousel/">WP Carousel</a>) o incluso justo antes del bucle. Eso sí, dependiendo de en qué lugar ponemos el código, la segunda línea (que actualiza los resultados) será necesaria u opcional. Por comodidad, podéis dejarla siempre, aumentará el número de consultas a la <strong>Base de Datos</strong>, pero cómo se hará uso de esta función en determinadas ocasiones, no es demasiado preocupante.</p>
<p>Pasemos a otro ejemplo: ocultemos los artículos con la etiqueta con ID 54.</p>
<pre class="brush: php; title: ; notranslate">

$wp_query-&gt;query_vars['tag__not_in'] = array(54);

$wp_query-&gt;query($wp_query-&gt;query_vars);
</pre>
<p>Otro ejemplo bastante claro. Por último sólo nos quedaría ocultar artículos. Estoy seguro de que ya adivináis cómo se ocultarían los artículos con IDs 1, 7 y 42:</p>
<pre class="brush: php; title: ; notranslate">

$wp_query-&gt;query_vars['post__not_in'] = array(1, 7, 42);

$wp_query-&gt;query($wp_query-&gt;query_vars);
</pre>
<p>Realmente no tiene mucha complicación, pero antes de acabar el tutorial debeís tener en cuenta un par de cosas:</p>
<ol>
<li>La variable <em>$wp_query</em> almacena contenido importante, y es recomendable hacer una copia de la variable para poder restaurarla más adelante, algo como:
<pre class="brush: php; title: ; notranslate">$wp_query_old = $wp_query;</pre>
<p>Así en caso de detectar un error en las modificaciones realizadas a la matriz, el script puede recuperar el contenido original.</li>
<li>Modificar la consulta en ciertas páginas puede dañar el resultado, sobretodo cuando se visualiza una página individual o un artículo en solitario. Es recomendable modificar la matriz sólo cuando estamos en el index del blog (donde nos interesa ocultar o mostrar artículos).</li>
<li>Este método sólo es adecuado para plugins. Si quisiéramos modificar nuestro theme, tenemos a nuestra disposición métodos aún más fáciles y menos intrusivos que éste.</li>
<li>¡No ocultemos contenido sin avisar antes al usuario! Todos estos cambios son invisibles para el usuario medio, y más de uno se llevaría una desagradable sorpresa al ver desaparecer sus artículos misteriosamente del índice de su blog.</li>
</ol>
<p>Dicho esto, ahora es cosa vuestra experimentar. Tenéis más información sobre los índices que podéis modificar en <a href="http://codex.wordpress.org/Function_Reference/get_posts">esta página</a> (aunque habla de una función diferente, muchos de los parámetros son equivalentes a los índices de la matriz).</p>
<p>Si tenéis problemas o dudas, preguntad en los comentarios.</p>
]]></content:encoded>
			<wfw:commentRss>http://sumolari.com/ocultando-articulos-y-categorias-del-loop-de-wordpress/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Programa un apagado o reinicio en Mac OS X</title>
		<link>http://sumolari.com/programa-un-apagado-o-reinicio-en-mac-os-x/</link>
		<comments>http://sumolari.com/programa-un-apagado-o-reinicio-en-mac-os-x/#comments</comments>
		<pubDate>Mon, 28 Dec 2009 20:20:20 +0000</pubDate>
		<dc:creator>Sumolari</dc:creator>
				<category><![CDATA[Mac OS X]]></category>
		<category><![CDATA[Tutoriales]]></category>
		<category><![CDATA[Mac]]></category>
		<category><![CDATA[Mac OS X Leopard]]></category>
		<category><![CDATA[Mac OS X Snow Leopard]]></category>
		<category><![CDATA[trucos]]></category>

		<guid isPermaLink="false">http://sumolari.com/?p=3272</guid>
		<description><![CDATA[Programar el apagado del equipo es algo realmente útil que nunca sabes cuándo vas a utilizar, pero que seguro que te vendrá genial en más de una ocasión. Por ejemplo, cuando quieres dejar el equipo haciendo una copia de seguridad que durará un par de horas y tienes que irte a una reunión a la [...]]]></description>
			<content:encoded><![CDATA[<div id="attachment_3276" class="wp-caption alignleft" style="width: 310px"><a href="http://sumolari.com/wp-content/uploads/2009/12/apagando_el_mac.png" rel="lightbox-3272"><img class="size-medium wp-image-3276" title="El Mac está programado para apagarse en 10 minutos" src="http://sumolari.com/wp-content/uploads/2009/12/apagando_el_mac-300x223.png" alt="El Mac está programado para apagarse en 10 minutos" width="300" height="223" /></a><p class="wp-caption-text">El Mac está programado para apagarse en 10 minutos</p></div>
<p>Programar el apagado del equipo es algo realmente útil que nunca sabes cuándo vas a utilizar, pero que seguro que te vendrá genial en más de una ocasión. Por ejemplo, cuando quieres dejar el equipo haciendo una copia de seguridad que durará un par de horas y tienes que irte a una reunión a la que no puedes faltar o en aquellos casos en los que quieres dejar el equipo conectado un par de horas durante la noche pero no quieres preocuparte por apagarlo al despertarte.</p>
<p>Hace algún tiempo expliqué <a href="http://sumolari.com/programa-un-apagado-de-windows/">cómo programar un apagado en Windows</a>, y hoy explicaré cómo programar un apagado en <a href="http://sumolari.com/category/mac-os-x/">Mac OS X</a> (el cual creo que se programa de forma muy similar en <a href="http://sumolari.com/category/linux/">Linux</a>).</p>
<p>Programar el apagado en <a href="http://sumolari.com/category/mac-os-x/">Mac OS X</a> es algo bastante simple, para lo cual recurriremos a la terminal y a la función shutdown. Esta función acepta bastantes parámetros pero nos centraremos tan sólo en el modo y en el tiempo, y de forma algo superficial (realmetne hay muchas opciones a la hora de programar el apagado, pero en la mayoría de los casos no las usaremos).</p>
<p>La sintaxis de la función es la siguiente: <em>shutdown [-] [-h [-u] | -r | -s | -k] [-o [-n]] time [warning-message ...]</em> (ojo, tenemos que ejecutar la función en modo superusuario, así que añadiremos <em>sudo</em> antes de la función). De todos estos parámetros, nos centraremos en el tiempo y en el modo de apagado y reinicio, simplificando la sintaxis que usaremos a esto: <em>shutdown [-h | -r] time</em>.</p>
<div id="attachment_3277" class="wp-caption alignright" style="width: 310px"><a href="http://sumolari.com/wp-content/uploads/2009/12/cancelando_el_apagado.png" rel="lightbox-3272"><img class="size-medium wp-image-3277" title="El apagado se ha cancelado" src="http://sumolari.com/wp-content/uploads/2009/12/cancelando_el_apagado-300x223.png" alt="El apagado se ha cancelado" width="300" height="223" /></a><p class="wp-caption-text">El apagado se ha cancelado</p></div>
<p>El primer parámetro indica el modo (por llamarlo de alguna forma). Disponemos de muchos modos, pero nos centraremos en el apagado (-h) y en el reinicio (-r). Los demás los dejaremos para otro día.</p>
<p>El segundo parámetro es el tiempo, que podemos indicarlo de dos formas diferentes: o bien indicando el tiempo que pasará, o bien indicando la fecha en la que ocurrirá. La principal diferencia es que el primero lo usaremos en aquellos casos en los que nos interesa que trascurra cierto tiempo hasta el apagado mientras que el segundo lo usaremos en aquellos casos en los que nos interesa que a cierta hora (y fecha) el equipo se apague. El tiempo en el primer caso se indica con un signo <em>+ </em>delante y se indica en minutos. En el segundo caso se especifica usando la siguiente sintaxis: <em>yymmddhhmm</em>. Año, mes, día, hora y minuto. Si queremos apagar el equipo de inmediato, podemos usar la palabra <em>now</em> (ahora) a modo de tiempo.</p>
<p>Dejemos de lado la teoría y pasemos a la práctica, imaginemos que queremos apagar el equipo dentro de 3 horas y media, pues bien, usaremos el siguiente código:</p>
<pre class="brush: plain; title: ; notranslate">
sudo shutdown -h +210
</pre>
<p>Ahora, por ejemplo, supongamos que queremos reiniciar el equipo el día 31 a las 23:59, bien, la función quedaría así:</p>
<pre class="brush: plain; title: ; notranslate">
sudo shutdown -r 0912312359
</pre>
<p>También podemos cancelar un apagado programado cerrando el proceso <em>shutdown</em>, como antes, tenemos que hacerlo en modo de superusuario, quedando así el código:</p>
<pre class="brush: plain; title: ; notranslate">
sudo killall shutdown
</pre>
<p>Como podéis ver, no tiene mucha dificultad y da mucho juego, teniendo en cuenta que hasta podemos determinar la fecha del apagado, lo cual le da más juego.</p>
]]></content:encoded>
			<wfw:commentRss>http://sumolari.com/programa-un-apagado-o-reinicio-en-mac-os-x/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

