Ulzurrun de Asanza i Sàez

Tag: trucos

Borra archivos de un pendrive en Mac OS X sin vaciar la papelara

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 el error. ¡Gracias a Jorosa por el aviso!

Archivos "borrados" del pendrive
Hay cerca de 800MB de archivos "borrados" en este pendrive

Hay veces que uno se sorprende al ver ciertos comportamientos de Mac OS X. 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.

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 Función + Retroceso 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.

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 “limpiar” los pendrives de archivos supuestamente eliminados.

Cómo funciona

La carpeta .Trashes al descubierto
Esto lo aclara todo

Antes de dar los enlaces para descargar la aplicación, veamos cómo funciona. Como ya he dicho, Mac OS X mueve los archivos “borrados” a una carpeta oculta que funciona a modo de papelera. Esta carpeta se llama .Trashes (como de costumbre en OS X, al llevar un punto al principio del nombre, la carpeta es oculta). Si borramos la carpeta .Trashes, borramos todos los archivos que queríamos eliminar pero, ¿cómo la borramos sin pasar por la papelera de nuevo?

Aquí es donde entra en juego el potencial de un sistema basado en Unix. Gracias al comando rm (remove) podemos eliminar archivos o carpetas sin necesidad de pasar por la papelera. Combinando esto con un par de parámetros, concretamente -R (borrar de forma recursiva) -f (sin pedir confirmación) y -d (directorios y archivos) conseguimos vaciar el pendrive de archivos que queríamos borrar.

Obviamente tener que escribir todo esto en la terminal cada vez que queremos limpiar un pendrive de archivos “borrados” no es muy cómodo. Para hacer más cómoda la tarea recurriremos a Automator, ese pobre incomprendido que si bien es capaz de hacer maravillas, la mayoría de los usuarios desconoce incluso su existencia.

Creamos una nueva aplicación en AutomatorEl flujo resultantePara crear la aplicación abrimos Automator 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:

  1. Solicitamos una carpeta. El usuario deberá seleccionar un dispositivo extraíble.
  2. Establecemos el valor de una variable con la ruta de la carpeta seleccionada.
  3. 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 – si alguien se anima que lo comente en los comentarios).
  4. En el script Shell usamos el comando cd (change dir) para ir a la ruta del pendrive.
  5. A continuación, en el mismo Shell y cambiada la ruta a la que nos interesa, borramos la carpeta .Trashes con los parámetros que he expuesto antes.

Descarga

Seguidos los pasos y entendido el funcionamiento, aquí tenéis a vuestra disposición la aplicación.


Añade las llaves en una nueva línea en Xcode

Xcode: Antes y después
Antes (izquierda) y después (derecha)

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.

[objc]
// 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];
}
}
[/objc]

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.

[code]defaults write com.apple.Xcode XCCodeSenseFormattingOptions ‘{ "BlockSeparator" = "n" ; }’ [/code]

Esto sólo afecta al autocompletado de código, no a las plantillas que vienen con Xcode.


Detectar el último artículo del loop de WordPress

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 el loop de WordPress, en este artículo me voy a centrar en la forma más sencilla que conozco: mediante $wp_query.

$wp_query 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: current_post y post_count. 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.

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 current_post comienza en 0, mientras que post_count 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 current_post valdrá 9, mientras que el atributo post_count valdrá 10.

A continuación os dejo un bucle de ejemplo para que entendáis mejor lo que quiero decir:

[php]
if (have_posts()): while (have_posts()): the_post();

if ($wp_query->current_post == 0)
{
echo ‘Este es el primer artículo del bucle’;
}

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

if ($wp_query->current_post > 0)
{
echo ‘Este no es el primer artículo del bucle’;
}

if (($wp_query->current_post + 1) < $wp_query->post_count)
{
echo ‘Este no es el último artículo del bucle’;
}

if (($wp_query->current_post > 0) && (($wp_query->current_post + 1) < $wp_query->post_count))
{
echo ‘Este no es ni el primer artículo del bucle ni el último’;
}

endwhile; endif;
[/php]

Realmente no tiene mucha complicación y facilita bastante el detectar cuándo se muestra el primer o el último artículo.


Control remoto en Mac OS X y Windows con VNC

Controlando Mac OS X desde Windows

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 de lado, sobretodo cuando se trata de una combinación de sobremesa y portátil.

Veamos ahora cómo controlar de forma remota un ordenador con Windows y un Mac con Mac OS X mediante el protocolo VNC. Para esto necesitaremos dos aplicaciones diferentes: un cliente VNC y un servidor VNC. El servidor VNC habilita el control remoto del equipo en el que está instalado, mientras que el cliente VNC permite a un equipo controlar un ordenador que tenga instalado un servidor VNC.

Mac OS X incorpora un cliente y un servidor VNC (de los que hablaré más adelante), así que tan sólo tendremos que instalar el paquete de cliente y servidor en Windows. Hay multitud de paquetes diferentes, pero yo me centraré en UltraVNC, que es de momento el que mejor que me ha funcionado hasta ahora y que además es totalmente gratuito (podéis descargarlo aquí). Una vez descargado e instalado, tendremos que ejecutar la aplicación UltraVNC Server, que como su nombre indica, es el servidor VNC de UltraVNC. El cliente VNC se llama UltraVNC Viewer.

UltraVNC Server
UltraVNC Server

Una vez ejecutado el servidor en Windows, 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 contraseña para acceder al equipo: no queremos que cualquiera con un cliente VNC y nuestra IP pueda acceder a nuestro equipo.

Entre otras cosas más o menos útiles, podemos hacer que el invitado sólo pueda ver la pantalla, sin poder modificada nada o eliminar los efectos de Aero de Windows y el fondo de pantalla al conectarse un invitado (para mejorar el rendimiento).

Compartir Pantalla
Compartir Pantalla

Habilitar el servidor VNC en Mac OS X es muy sencillo. Basta con ir a Preferencias del Sistema, dentro a Compartir. La segunda opción de la lista de la izquierda es Compartir Pantalla, que se traduce en Habilitar Servidor VNC. El servidor VNC incorporado en Mac OS X tiene menos opciones que UltraVNC, pero para el uso diario nos vale. Podéis ver la pantalla en cuestión en la imagen de la derecha.

Con el servidor VNC ejecutándose en ambos equipos, sólo necesitamos utilizar el cliente VNC para poder controlarlos de forma remota. El cliente VNC de UltraVNC, como he comentado antes, se llama UltraVNC Viewer, así que lo ejecutamos.

Controlando Windows desde Mac OS X
Controlando Windows desde Mac OS X

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 “sólo visión” (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).

En Mac OS X nos podemos conectar a un servidor VNC desde el Finder. Para ello vamos a Ir -> Conectarse al servidor (o pulsamos la combinación de teclas Cmd + K). Se abrirá una ventana pidiéndonos la dirección del servidor, done introduciremos vnc://<IP_DEL_SERVIDOR>. Nos pedirá la contraseña del servidor (si la hay) y a continuación tendremos acceso vía VNC al otro equipo.

También se puede controlar un equipo con una distribución de Linux desde Windows y Mac OS X (y éste puede controlar a los otros) o incluso desde un iPhone (basta con instalar alguna aplicación que haga de cliente VNC para poder controlar otros equipos).


Restaurar un Mac desde una copia de seguridad de Time Machine

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 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.

Lo bueno de Time Machine 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 Mac OS X. Pues bien, podemos evitarnos tener que configurar todo el equipo e instalar todas las aplicaciones si tenemos a mano una copia de Time Machine. Además, el proceso de restauración es la mar de sencillo.

Lo primero que tenemos que hacer es instalar como de costumbre Mac OS X. 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 Mac OS X) y no he podido sacar mejores fotos.

Pantalla de bienvenida

Selección de idioma

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 Mac OS X (supongo que también valdrá para particiones); la tercera es restaurar desde una copia de seguridad de Time Machine (la que debemos seleccionar) y la cuarta es comenzar de 0 y no restaurar nada.

Opciones de migración

Lo siguiente que nos pedirá Mac OS X es el volumen donde está almacenada la copia de Time Machine. 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 Time Capsule 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).

Seleccionamos el volumen donde está el backup

Seleccionamos el contenido a restaurar

Por último, Mac OS X comenzará la restauración. El proceso es muy lento, en mi caso, para restaurar menos de 120GB, Mac OS X 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.

No está nada mal, ¿no creéis?


Modifica la pestaña de ayuda de WordPress

Ayuda contextual modificada
Ayuda contextual modificada

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 ayuda sobre nuestro plugin debemos recurrir a los filtros, sin embargo el filtro que afecta a la ayuda contextual no aparece en la documentación.

No obstante, una vez conocemos el nombre del filtro, que por cierto es contextual_help, 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.

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 load-X, donde X es la página de nuestro plugin (en realidad puede ser cualquier página del Panel de Administración). El valor de X debe ser el que devuelve la función add_submenu_page (o add_N_page) para que se aplique correctamente la función.

Dicha la teoría, pasemos a la práctica:

[php]
// 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 "<h5>".__(‘WP Carousel’s Quick Help’, ‘wp_carousel’)."</h5>"; // Nuevo contenido
echo "<p>".__(‘You can find help here, here and here’, ‘wp_carousel’).".</p>"; // Nuevo contenido
printf ("<p>".__(‘Please, fill up <a href="%s">this survey</a> in order to improve WP Carousel’, ‘wp_carousel’).".</p>", WP_CAROUSEL_SURVEY); // Nuevo contenido
echo $help; // Imprimos también el contenido que hay por defecto
}

[/php]

Como podéis ver, el funcionamiento es bastante sencillo.

PD: Sí, este código es parte de WP Carousel 0.5. 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…


Aplicar propiedades de CSS3 en Internet Explorer

Hoy han publicado en Smashing Magazine métodos para aplicar algunas propiedades de CSS3 como opacidad, esquinas redondeadas, sombras y demás en Internet Explorer. El método hace que el código CSS deje de ser válido y cumplir con los estándares, pero al menos se consigue un buen resultado.

A ver si en IE9 se ponen las pilas y nos evitan tener que recurrir a estos trucos.

Publica artículos sólo para usuarios registrados en WordPress

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 “login” con el valor “1” 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).

El código está comentado, explicando qué hace cada cosa, espero que os sirva de ayuda. Para utilizarlo basta con ponerlo en el archivo functions.php de vuestro theme, o podéis descargar este archivo y subirlo a la carpeta de plugins y activarlo como un plugin más, tiene el mismo resultado.

[php]
<?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->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

?>
[/php]


Artículos sólo para usuarios registrados en WordPress

Vía AyudaWordPress descubro un método para crear artículos que sólo puedan ser vistos por usuarios que han iniciado sesión. El método es fácil de usar, pero requiere modificar el código para añadir nuevos artículos a la lista de permitidos.

A ver si mañana tengo un rato libre y lo modifico para que funcione con campos personalizados y no sea necesario modificar el código para hacer que otros artículos requieran iniciar sesión.

Aprende a utilizar los grupos inteligentes de la agenda de Mac OS X

Icono de la agenda de Mac OS XHoy han publicado en Applesfera un interesante artículo explicando qué son los grupos inteligentes de la agenda de Mac OS X y cómo se utilizan. Realmente útil para algunos (como yo) la posibilidad de crear un grupo con contactos cuyo aniversario es en los próximos días, aunque el poder crear un grupo de contactos sin email o sin número de teléfono tampoco viene mal.