Trucos WordPress.com

Desde que comencé a emplear el servicio gratuito de WordPress.com me he encontrado con dificultades para conseguir cosas que en otros servidores de blogs se consiguen directamente desde el propio editor de textos enriquecido, sin necesidad de tener que editar el código HTML. Esta es una recopilación de esos trucos que yo he visto necesarios. Primero haré un repaso por los que se emplean durante la edición de texto, para luego enseñar algún otro.

JUSTIFICAR EL TEXTO

Desde el editor nos dan la opción de alinear el texto a la izquierda, a la derecha o centrarlo, pero de este modo, en mi opinión, los textos quedan muy poco estéticos. Para justificar nuestros textos basta con seleccionar los párrafos a los que queramos aplicar el cambio y pulsar la combinación de teclas [alt + shift + j].

INSERTAR CÓDIGO DE PROGRAMACIÓN

Es muy común en el mundo de la informática, tener que introducir trozos de código de programación, como pueden verse en mi entrada sobre La memoria en Java. Se hace directamente desde la edición de texto visual insertando el siguiente código:

[sourcecode language="java"]

Aquí metemos el código

[/sourcecode]

Todo lo que se introduzca entre esas etiquetas será representado literalmente y se resaltará dependiendo del lenguaje de programación que se especifique.

Se ha hablado sobre este truco más a fondo en esta otra entrada en la que se analizan todas las opciones que acepta.

TEXTO FLOTANTE AL PASAR EL RATÓN

No es algo muy común, pero a veces resulta más estético mostrar el significado de un acrónimo al pasar el ratón que hacerlo entre paréntesis, por ejemplo: JVM.

Para ello, se ha de acceder a la pestaña de edición HTML e introducir el siguiente código.

<abbm title="Java Virtual Machine">JMV</abbm>

Antes de comenzar  con trucos que no tienen nada que ver con la presentación de los textos, aclarar que cualquiera que sepa HTML puede realizar muchas más modificaciones desde la pestaña HTML del editor teniendo como única frontera su imaginación.

ESTADÍSTICAS DE VISITAS EXTERNO

En mi opinión, las estadísticas de visita que se muestran por defecto en WordPress.com deja mucho que desear, te indica desde que dominio accede alguien a tu web, pero no te especifica desde donde exactamente, por ejemplo, si tienes un visitante desde un Tweet de Twitter te indica que viene desde Twitter. Tampoco puedes saber desde que lugar del mundo acceden, lo que en muchas ocasiones puede ayudar mucho al escritor a decidir que expresiones emplear.

En mi anterior blog, empleaba el servicio de StatCounter, no es el más completo de todos los que se encuentran por la red, pero a mi me gusta y ya llevo unos años con él.

Todos estos servidores nos facilitan un código HTML que hay que añadir en la web a fin de que ellos puedan hacer el recuento de las visitas. Para realizar esto tendremos que acceder al panel de control de WordPress.com y seguir los siguientes pasos.

[Apariencia] > [Widgets]

Buscamos y añadimos el Widget de Texto al panel lateral derecho que nos aparece, y en el cuerpo del mensaje añadimos el código HTML. Yo en mi caso, he aprovechado el que introduje para poner la licencia a fin de no tener que añadir otro campo de texto más y he empleado un código invisible que no se ve, pero que cumple bien su función.

Insertar Código Fuente en WordPress.com

Si sóis usuarios de una cuenta gratuita en WordPress.com, habréis notado que no se permite editar los CSS, ni otras cosas que puedan ayudarnos a poder hacer más visual parte de nuestras entradas. Como programador, y devido a la temática de este blog, en muchas ocasiones me he visto obligado a introducir código fuente en diferentes lenguajes de programación, por lo que el haber encontrado un modo simple y rápido de introducir este código y que todos puedan verlo correctamente formateado, me alegró mucho.

Esto es a lo que me refiero:

class HolaMundo{

    public static void main(String[] args){

       System.out.println("Hola Mundo");

    }

}

Sus ventajas no son solo el aspecto visual, también que puede copiarse el contenido del mismo y que el escritor no tiene que andar aplicando estilos a cada parte del código para que este se vea con colorines.

El único problema que le veo es que no tabula automáticamente, pero si se copia desde un editor de texto normal, no hay problema con ello.

¿CÓMO SE CONSIGUE?

Es muy simple poner un cuadro como el de arriba, basta con itroducir en la pestaña ‘Visual’ del editor, he dicho la ‘Visual’ no la ‘HTML’, el siguiente código.

[sourcecode language="java"]
class HolaMundo{

public static void main(String[] args){

System.out.println(“Hola Mundo”);

}

}
[/sourcecode]

El parámetro ‘language’ admite multitud de lenguajes, a continuación se encuentra una lista completa.

  • actionscript3
  • bash
  • coldfusion
  • cpp
  • csharp
  • css
  • delphi
  • erlang
  • fsharp
  • diff
  • groovy
  • html
  • javascript
  • java
  • javafx
  • matlab (solo palabras claves)
  • objc
  • perl
  • php
  • text
  • powershell
  • python
  • r
  • ruby
  • scala
  • sql
  • vb
  • xml

Si no introducimos el parámetro ‘language’ se establece por defecto a ‘text’ esto es, texto sin modificaciones.

PARÁMETROS DE CONFIGURACIÓN

Hay multitud de parámetros de configuración aparate del de ‘language’ que ya hemos visto.

  • autolinks (true/false) — Establecer si se resaltan los links automaticamente. Por defecto True.
  • collapse (true/false) — Si está a True, el código aparecerá reducido y requerirá de la interacción de un usuario para expandirse, resulta ideal para código grande. Por defecto está a False.
  • firstline (número) — Si se quiere que la primera línea no sea la 1 puede modificarse, resulta útil cuando se corta código en diferentes diálogos.
  • gutter (true/false) —  Si se encuentra a False, no se mostrarán los números de línea. Por defecto está establecido a True.
  • highlight (número de lineas separados por comas ‘,’) —  Puedes marcar las líneas que quieras que sean marcadas de un modo especial para resaltar, por ejemplo “4,7,19″.
  • htmlscript (true/false) —  Si se encuentra en True, cualquier código HTML/XML que se introduzca será resaltado, es útil para cuando se mezcla código PHP con HTML por ejemplo. Por defecto se encuentra a False.
  • light (true/false) — Si se establece a True, tantos los números de las líneas como la barra de herramientas que aparece al poner el ratón sobre el cuadrado, no se muestran. Por defecto se encuentra a False.
  • padlinenumbers (true/false/integer) — Se emplea para establecer de cuantos dígitos constan los números que representan la linea. Si está a True, se establece en automático, en false no se realiza y si se introduce un valor numérico se establece éste. Por ejemplo al poner paddlinenumbers="3" la línea 1 se representaría como 001.
  • toolbar (true/false) — Si está a False, la barra de herramientas que se muestra al pasar el ratón por el código no se mostrará. Por defecto se encuentra a True.
  • wraplines (true/false) — Si se encuentra a False, las líneas de texto largas no van a ser cortadas provocando la aparición de una barra deslizante horizontal en el recuadro. Por defecto se encuentra a true.

EJEMPLOS

[sourcecode language="java" autolinks="true" wraplines="false" padlinenumbers="2" highlight="1,5"]

class HolaMundo{

    public static void main(String[] args){

       System.out.println("Hola Mundo, nos encontramos en https://ayddup.wordpress.com , visítanos siempre que te apetezca");

    }

}

[sourcecode language="java" autolinks="false" wraplines="true" gutter="false" ]

class HolaMundo{

    public static void main(String[] args){

       System.out.println("Hola Mundo, nos encontramos en https://ayddup.wordpress.com , visítanos siempre que te apetezca");

    }

}

Toda la información ha sido obtenida de la página de soporte de WordPress.com [ENG]

Obsolescencia programada

Nuestros padres y abuelos siempre nos lo han dicho, en su época las cosas se hacían para durar, ahora las cosas se hacen pensando en consumir. Lo más probable es que cuando adquiramos un producto, éste ya tenga una fecha determinada para morir, alguna de sus piezas han sido manipuladas para que esto suceda así. Teniendo en cuenta el tema, no puedo dejar hacer referencia a un documental emitido por RTVE hace un tiempo “Comprar Usar Comprar“. Dejo el enlace a Youtube ya que han quitado el vide de la web de RTVE.

En la época de consumismo en la que vivimos, es posible que no nos demos cuenta de esta realidad, pues antes de que a un producto le llegue su hora lo habremos sustituido por una nueva versión mejorada con unas prestaciones que posiblemente no precisemos pero que nos han hecho creer que son las que en ese momento determinado precisamos. Sin ir más lejos yo abandoné mi antiguo SmartPhone, un HTC Magic por mi actual Nexus One, y puede que no sea el mejor ejemplo, pero como yo muchos otros realizan esta práctica. Pero para todos aquellos que no crean que sus viejos aparatos tienen un mejor sustituto, se ha diseñado la Obsolescencia Programada, esto es, se programa cuando un producto tiene que dejar de funcionar.

Al igual que en el documental antes mencionado, voy a empezar hablando de un producto que conocemos todos, las impresoras. En el video nos muestran como la impresora de un chico deja de funcionar y tras investigar, contacta con un señor que le indica que la impresora tiene un chip que cuenta las páginas impresas y que alcanzado un número determinado se bloquea. La solución es reiniciar los datos de ese chip. Puede que esto no nos suceda a muchos, pero con otro componente del mismo aparato nos hemos peleado más de uno, la tinta.

En las impresoras convencionales la tinta suele venir divididas en 2 cartuchos diferentes, uno Negro y otro Tricolor, cian, amarillo y magenta. Mediante la combinación de estos se obtienen toda la gama de colores que vemos depositada en la bandeja de impresión. Por experiencia personal creo que hay unos momentos claves en la historia que han ido cambiando el modo en el que se consumía la tinta en nuestros hogares.

Al principio se adquirían los cartuchos originales pues no había más remedio, al cabo de los años, algunas marcas se arriesgaron a sacar cartuchos compatibles a un precio muchísimo más bajo, y luego pasamos a recargar la tinta. La industria, muy inteligentemente, se ha ido adaptando a los cambios del usuario. Una de sus primeras estrategias fue que si uno de los colores del cartucho tricolor se vaciaba, te informaba de que ese cartucho no tenía tinta. Uno podía dedicarse a imprimir folios en amarillo, y tras un rato no le dejaría imprimir uno magenta, peso a ne haber empleado ese color hasta el momento. Cuando los usuarios al ver esto empezaron a inyectar tinta a los cartuchos en casa a fin de mostrar a la impresora que todo estaba normal, los fabricantes limitaron el uso de impresiones de cada cartucho, si se decía que el cartucho negro podía imprimir 100 páginas, una vez llegadas esas páginas, ese cartucho era inservible, pues contenía un chip que le indicaba estar vacío pese a contener aún vida para unas cuantas páginas más.

Otro caso muy curioso en la historia es el de las bombillas, hubo un tiempo en el que las bombillas garantizaban una duración de 2.500 horas útiles, y de la noche a la mañana todos los fabricantes empezaron a garantizar que sus mejores bombillas solo duraban 1.000 horas. De este modo obligaban a los usuarios a adquirir nuevas bombillas en un menor tiempo mientras ellos no podían meter las manos en los bolsillos a cuenta de los billetes.

Dejando estos curiosos datos a un lado, y saliéndonos un poco de la temática del blog, vemos como ahora en todos los medios nos incitan a reciclar los productos que empleemos, papel, vidrio, embases, … Yo creo que esto es correcto, pero curiosamente parece ser que las mismas personas que nos lo dicen han olvidado que tal y como decía un antiguo profesor mío, en la vida de todo producto tendrían que haber 3Rs. Reducir, Reutilizar y Reciclar. Nos incitan a la última pero no nos piden reducir el consumo disparatado que llevamos, ni nos incitan a reutilizar las cosas. ¿Alguno tiene por casa una pluma estilográfica de su padre que se recarga con botes de tinta cuyo precio es muy inferior al de un bolígrafo desechable actual?

Espero haber dado a más de uno algo en que pensar, y si os interesa el tema ver el documental que he enlazado al principio de la entrada.

Un saludo

La memoria en Java, Garbage Collector y el método finalize()

A quien haya programado en lenguajes de programación tales como C, C++, o cualquier otro que permita un acceso real a la memoria, cuando se ha pasado a Java se habrá extrañado al no tener que ocuparse de la gestión de los recursos. Los conocidos métodos de C ‘malloc’ y ‘calloc’ pasan al olvido cuando programamos en este nuevo lenguaje, lo cual puede resultar cómodo, pero también puede generar ciertas dudas sobre quién y de que modo toma las decisiones de como se han de administrar los recursos de la memoria.

Antes de comenzar vamos a aclarar unos pequeños conceptos. La memoria está dividida en tres secciones diferentes, la Zona de Datos, Stack y Heap.

ZONA DE DATOS

Es donde se almacenan las instrucciones del programa, las clases con sus métodos y constantes (menos los finals). Esta zona de memoria es fija, y no se puede modificar durante el tiempo de ejecución.

STACK

El tamaño del Stack se define durante el tiempo de compilación y es estático durante su ejecución, por lo que puede llegar un momento en el que lo llenásemos y obtuviésemos un bonito StackOverflow que en java se representa mediante un ‘OutOfMemoryException’ . Es raro que nos encontremos con ello, pero si ejecutamos un método recursivo mal formado, es uno de los errores más comunes.

Los datos que se almacenan aquí son las referencias a objetos (instancias de objetos) y los datos primitivos como int, float o char. Cuando ejecutamos un método con variables locales, estas se cargan en el Stack y se eliminan una vez se finaliza el método.

El siguiente código generaría un StackOverflow, se trata de un ‘for’ infinito en modo recursivo.


public void meLlamoYoMismo(){

    meLlamoYoMismo();

}

HEAP

El Heap es la zona de memoria dinámica, almacena los objetos que se crean, en un principio tiene un tamaño fijo asignado por la JVM (Java Virtual Machine), pero según es necesario se va añadiendo más espacio.

STACK Y HEAP

Por lo que puede deducirse de las definiciones, el Stack y el Heap están estrechamente relacionados, ya que los objetos a los que apuntan las referencias almacenadas en el Stack se habrán creado en el Heap.


class MiClase{

    public static void main(String[] args){

        MiClase miObjeto;
        miObjeto = new MiClase();

    }

}

En la quinta linea se crea la referencia ‘miObjeto’ en el Stack y en la sexta se crea el objeto ‘new MiClase’ en el Heap y se enlaza ‘miObjeto’  a ella. Si la referencia ‘miObjeto’ apunta a otro objeto que se asigne en otro momento, el enlace anterior quedará roto y el objeto que se encuentra en el Heap no será enlazado por nadie ( Está consumiendo espacio en la memoria y no se hace uso de él).

Tiene que quedar claro que la relación referencia-objeto es de n-1, lo que quiere decir que un objeto puede ser apuntado por muchas referencias, pero que una referencia apunta a un solo objeto.

Otro ejemplo un poco más complejo que ilustra lo mismo que el anterior.


class MiClase{

    public static void main(String[] args){

        MiClase miObjeto;
        MiClase miOtroObjeto;
        miObjeto = new MiClase();
        miOtroObjeto = miObjeto;

        miOtroObjeto = new MiClase();

        miObjeto = null;
        miOtroObjeto= null;

    }

}

En las líneas cinco y seis se crean dos referencias de tipo ‘MiClase’ con los nombre ‘miObjeto’ y ‘miOtroObjeto’, en la siguiente se crea un objeto y se le asigna a la referencia ‘miObjeto’. En la línea ocho, tenemos ya dos referencias a ‘new MiClase()’, esto es, dos referencias a una misma instancia de objeto.

En la décima creamos otra nuevo objeto al que hace referencia ‘miOtroObjeto’, por lo que ya tenemos dos referencias a dos objetos diferentes. Las dos últimas lineas rompen esos enlaces al ser asignadas ambas referencias a null.

GARBAGE COLLECTOR

El Garbage Collector es un proceso de baja prioridad que se ejecuta en la JVM y es el encargado de liberar la memoria que no se emplea. El ser de baja prioridad supone que no pueda estar todo el rato trabajando, y que solo se le asigne su tarea cuando el procesador no tiene un trabajo con mayor prioridad en ejecución.

¿Cómo sabe el Garbage Collector lo que puede borrar y lo que no?  Es algo muy simple, si un objeto no tiene referencias desde el Stack tiene que ser eliminado.

La magia de este recolector de basura deja asombrados a los programadores que odian tener que gestionar la memoria ellos mismos, y es que es algo muy útil, pero se trata de un arma de doble filo. Entre sus contras tenemos que al tratarse de un proceso de prioridad baja, es poco probable que se ejecute cuando se esté haciendo un uso intensivo de la CPU. Esto se puede solucionar si se solicita una pasada del Garbage Collector desde el propio código. No se tiene que abusar de ello, pero puede resultar interesante tras una serie de operaciones que se sepa a ciencia cierta que puede dejar objetos sin referencias. El método de solicitar esta pasada se muestra en las siguientes lineas.

public void pasarGarbageCollector(){

    Runtime garbage = Runtime.getRuntime();
    garbage.gc();

}

El código que se muestra a continuación es un método de probar que esto efectivamente ayuda a liberar la memoria. Se realiza un bucle en el que se generan referencias y se eliminan las mismas y al terminar se solicita a la JVM que elimine todo objeto no referenciado. También se muestran por consola la memoria libre que se tenía antes y después de la petición.

class TestRecolector{

    public static void main(String[] args){

        TestRecolector test = new TestRecolector();
        test.testear();

    }
    public void testear(){
        Date fecha = null;
        for (int i = 0; i&lt;99999999;i++){
            fecha = new Date(2011,8,7);
            fecha = null;
        }

        this.pasarGarbageCollector();
    }
    public void pasarGarbageCollector(){

        Runtime garbage = Runtime.getRuntime();
        System.out.println(&quot;Memoria libre antes de limpieza: &quot;+ garbage.freememory());

        garbage.gc();

        System.out.println(&quot;Memoria libre tras la limpieza: &quot;+ garbage.freememory());
    }
}

Antes de continuar, mientras tenemos todo esto aun fresco, un consejo para programadores. En muchas ocasiones, al hacer operaciones, especialmente al trabajar con ‘ArrayList’ u otras listas, acostumbramos a emplear una variable temporal que solo resulta útil durante el tiempo de ejecución de esa operación. Cuando estas operaciones se hacen en un método externo al hilo principal no hay problema, pues sus “residuos” serán limpiados al salir del método, pero si por alguna razón se realizan en el hilo principal, o en un método que reúna múltiples operaciones (y que está largo rato ejecutándose), sería una buena idea que al terminar con el bucle se le asignara el valor ‘null’ a esas variables para dejar claro al Garbage Collector que ya no nos interesa mantenerla en memoria.

EL MÉTODO finalize()

El otro problema que supone el paso automático o descontrolado del Garbage Collector es que puede eliminar un objetos con información que queríamos guardar y que igual se ha quedado sin referencia por culpa nuestra. Por suerte, todas las clases heredan de ‘Object’ y con ello el método ‘finalize()’. Antes de que la JVM decida eliminar un objeto perdido, ejecuta este método. Gracias a ello podemos por ejemplo trabajar con una serie de elementos, eliminar la referencia a los mismos y no preocuparnos de guardar los datos esenciales en una base de datos (siempre que se reimplemente finalize() en ese objeto).

Dejo un método ilustrativo muy simple que muestra el funcionamiento de finalize();


public class Finalizando{

    String nombre;

    Finalizando (String pNombre){

        this.nombre = pNombre;

    }

    protected void finalize(){
        System.out.println(this.nombre);
    }
    public void pasarGarbageCollector(){

        Runtime garbage = Runtime.getRuntime();
        garbage.gc();
    }
    public static void main (String[] args){

        Finalizando persona = new Finalizando(&quot;Marta&quot;);
        persona = null;
        this.pasarGarbageCollector();

    }
}

El resultado de esto sería imprimir por consola “Marta”.
El ejemplo es algo banal, pero imaginemos que tenemos un ‘ArrayList<Persona>’ y que queremos recorrerlo mediante un while empleando un ‘miArray.remove(0)’ a fin de no tener que manejar un contador y sabiendo que no se emplearán de nuevo esos objetos una vez sus datos han sido almacenados en una base de datos. Para ello, pese a que no lo recomiende, puede implementarse el método ‘finalize()’ y despreocuparse uno de ello a posteriori.  Una cosa a tener en cuenta si se decide hacer esto, es que que nosotros dejemos sin referencia antes a un objeto que a otro, no implica que el Garbage Collector ejecute antes el ‘finalize()’ de ese objeto.

Espero que con esto tengáis más claro como se realiza la gestión de memoria en un entorno Java.

Un saludo y hasta pronto.

Mac OS X Lion

Se que puede resultar un tema un poco recurrente, pues es de lo que se habla en todos los blogs desde hace un par de semanas, que si el rey león por aquí que si OSX por allá,… Yo no tengo intención de hablar sobre que consisten las nuevas funcionalidades del sistema operativo, ni sobre configuraciones recomendadas para que sea más cómodo; todo eso está en otros blogs a los cuales haré referencia a lo largo de la entrada.

Mi principal intención es dar mis impresiones personal sobre esta actualización, por si alguien confía en mi criterio.

Lo que más me ha llamado la atención ha sido el modelo de instalación, te descargas un paquete de la App Store y ya se instala, sin necesidad de ir a una tienda a por una copia, ni grabar un CD de la torre que se esconde tras esa capa de polvo de mi estantería. A algunas personas no les ha gustado este modelo, yo por mi parte estoy muy satisfecho. Cierto es que se requiere un ancho de banda considerable para hacerse con la copia de más de 3GB, pero eso mismo haces quienes deciden hacerse con una copia de seguridad que alguien ha colgado en la red.

ENCENDIENDO EL EQUIPO

La primera impresión al encender el ordenador fue la LENTITUD, me da la impresión que desde que toco la tecla de encendido hasta que aparece la ventana de inicio de sesión pasa una eternidad en comparación con la anterior versión. Algo parecido, pero menos notorio, sucede una vez ingresamos los datos y accedemos a nuestra escritorio.

Este tiempo de espera no vuelve a aparecer, mientras se usa el equipo todo funciona muy fluido y las aplicaciones se abren en un tiempo record.

MISSION CONTROL

Missión Control, para quien no lo conozca, es una especie de unión entre los Spaces (diferentes escritorios) y Exposé.

Cuando lo vi en vídeos no me acababa de convencer, no creía que fuese a ser algo que usase con asiduidad, pues en todos los sitios, te lo muestran como que aparecen las aplicaciones a pantalla completa que ocupan todo un escritorio para ellas y se pierde la opción de tener múltiples ventanas abiertas en diferentes escritorios que no sean el principal.

No uso mucho la opción de aplicaciones en pantalla completa, pero sin embargo si uso continuamente la vista de Mission Control para moverme entre aplicaciones y organizarlas en los diferentes escritorios, pues resulta muy útil y rápida. Si le tengo que poner un pero sería que cuando selecciono una aplicación con múltiples instancias, agradecería que en lugar de mostrarse la ventana activa de la misma, se mostrasen todas las ventanas a fin de que yo seleccione cual quiero que pase a primer plano, lo que viene a ser que se activase el Exposé con esa aplicación.

El Exposé (arrastrar tres dedos hacia abajo) no solo muestra las ventanas de la aplicación activa. Si se trata de un editor como el OpenOffice, se muestran los archivos recientes editados con el mismo, lo cual ayuda a ponerse a trabajar mucho más rápido, lo mismo sucede con los visores y editores de imágenes.

GESTOS

Apple ha decidido que empleemos muchos gestos nuevos en esta nueva versión, lo cual a mi personalmente me parece un acierto, pero comprendo que para muchos usuarios puede resultar tedioso aprenderse todos.

Lo único que me ha molestado es que desde hace tiempo uso Better Touch Tool, una herramienta para gestos personalizados, y Lion me suplantaba alguno de los míos. Nada que no se pueda solucionar con un poco de tiempo.

Entre todos los gestos que nos ofrecen por defecto, solo hay dos que yo soy incapaz de lanzar, y son el que muestra el escritorio, y su contrario, el que abre el Launchpad, una aplicación que reúne los programas al más puro estilo iPhone o iPad.

Para mostrar el escritorio se tienen que poner 4 dedos juntos sobre el Trakpad y separarlos. Para mostrar el Launchpad es el gesto contrario, se juntan los dedos. Son muy simples, pero el sistema no capta bien tanto dedo junto y acaba lanzando Mission Control o Exposé según le viene en gana.

Me resulta curioso  que con tanto gesto que han implementado, se cargasen el gesto que hace zoom en Finder, éste funciona en otras herramientas, pero no permite que agrandemos nuestros archivos en el navegador de ficheros.

LAUNCHPAD

Launchpad es un visor de aplicaciones al estilo iPhone o iPad al que no le encuentro mucho sentido pues estoy acostumbrado a abrir las aplicaciones mediante Spotlight (Cmd + espacio), pero comprendo que a los usuarios noveles les pueda resultar muy cómodo.

¿MERECE LA PENA COMPRARLO?

Como seguramente habréis visto en otros lugares, no puede considerarse una actualización completa del sistema, son una unión de mejoras que hacen la vida más cómoda al usuario. Algunos dicen que tendría que ser gratuito ya que lo comparan con los SP de Windows, pero no tiene nada que ver con esos paquetes de actualizaciones de seguridad que nos ofrece Microsoft.

Yo no me arrepiento de los 24€ que he pagado por ello, es lo que menos de lo que me dejo cualquier mes en cervezas. La cantidad que se paga está acorde con las funcionalidades que se añaden al sistema. Muchos dicen que les parece caro, se nota que no desarrollan software y que no saben lo que cuesta. En mi opinión es un precio justo por lo que aporta pese a tratarse de una actualización mínima.

COSAS EN EL TINTERO

Se que dejo muchas cosas sin comentar como las versiones de documentos, el modo de copia de seguridad automático que se ha implementado. Tampoco he hablado ni hablare sobre el nuevo aspecto visual y un largo etcétera de novedades del sistema.