Interesante artículo en el blog de Alex Miller (en inglés) describiendo numerosas novedades propuestas (JSR) que se espera sean incorporadas a Java 7 de la mano de Sun. El autor insiste en que, aunque hay algunas propuestas aprobadas, se trata de algo todavía no oficial, por lo que las incorporaciones de Java 7 pueden no corresponderse exactamente con lo propuesto. Al fin y al cabo Java 7 sigue en desarrollo.

A continuación, describiré alguna de estas propuestas, indicando si han sido aprobadas o no (considero algunas no aprobadas muy interesantes) y facilitando enlaces siempre que me sea posible, aunque recomiendo la lectura del artículo original:


JSR 296 Swing Application Framework (JSR, Proyecto) APROBADA

Proporcionar un framework para aplicaciones Swing, definiendo una infraestructura común a la mayoría de aplicaciones de escritorio. El objetivo es que las aplicaciones Swing resulten mas sencillas de crear.


JSR 295 Beans Binding (JSR, Proyecto) NO APROBADA

Proporcionar un API que permita que dos propiedades de dos beans se mantengan sincronizadas, de forma que si cambia una de las propiedades en uno de los beans, automáticamente se refleje en el otro. En JavaFX sí hay algo parecido...


Type Inference (Propuesta) APROBADA

Simplificar la inicialización de algunas clases como listas o mapas. Por ejemplo, donde antes teníamos:

Map<String, List<String>> anagrams = new HashMap<String, List<String>>();

Ahora tendremos:

Map<String, List<String>> anagrams = new HashMap<>();


Language level XML support NO APROBADA

Permitir introducir XML literal embebido en el código, e incluso otros tipos de texto o lenguajes:
elt.appendChild(
    <muppet>
        <name>Kermit</name>
    </muppet>
);


BigDecimal operator support NO APROBADA

Posibilidad de manipular objetos BigDecimal con operadores aritméticos, como se hace con los tipos primitivos y con muchas de las clases que los representan, como Integer, Long, etc.


Strings in switch statements (Propuesta) SIN DETERMINAR

Posibilidad de utilizar la clase String en una sentencia switch:

static boolean booleanFromString(String s) {
    switch(s) {
        case "true":
            return true;
        case "false":
            return false;
    }
    throw new IllegalArgumentException(s);
}


Comparisons for Enums (Propuesta) SIN DETERMINAR

Permitir operadores lógicos en enumerados:

boolean isRoyalty(Rank rank) {
    return rank >= Rank.JACK && rank != Rank.ACE;
}



Chained invocation (Propuesta) NO APROBADA *

Permitir encadenar fácilmente llamadas a métodos, permitiendo que métodos void devuelvan implícitamente this:

class Factory {
    void setSomething(Something something) { ... }
    void setOther(Other other) { ... }
    Thing result() { ... }
}
...
Thing thing = new Factory()
    .setSomething(something)
    .setOther(other)
    .result();



Extension methods (Propuesta) NO APROBADA *

Permitir utilizar métodos de otras clases utilizando el operador static:

import static java.util.Collections.sort;
List<String> list = ...;
list.sort();
/* Parece que se llama a List.sort(), pero en realidad se está llamando a Collections.sort() */



Enhanced null handling (mi preferida) (Propuesta) APROBADA

Permitir encadenar llamadas a métodos, comprobando automáticamente que los valores devueltos no sean null, lo que provocaría una NullPointerException. Por ejemplo, donde antes teníamos:

public String getPostcode(Person person) {
    if (person != null) {
        Address address = person.getAddress();
        if (address != null) {
            return address.getPostcode();
        }
    }
    return null;
}


Ahora bastará con:

public String getPostcode(Person person) {
    return person?.getAddress()?.getPostcode();
}


Esta misma característica (Propuesta)se podrá utilizar con métodos que pueden devolver null:

String str = getStringMayBeNull();
str = (str == null ? "" : str);


Que pasa a ser:

String str = getStringMayBeNull() ?: "";


Improved catch clause (Propuesta) APROBADA

Poder capturar simultáneamente varios tipos de excepciones:

try {
    return klass.newInstance();
} catch (InstantiationException | IllegalAccessException e) {
    throw new AssertionError(e);
}



G1 Garbage Collector (PDF) APROBADA

G1 es un mejorado recolector de basura de Java que divide el espacio en varias regiones determinadas, permitiendo limpiar memoria en un conjunto de dichas regiones, en vez de partir el espacio en partes arbitarias. En el JDK de Sun de Java 7 esté será, en principio, el recolector de basura por defecto.

(*) El estado de aprobación de algunas propuestas aparece en el artículo original con interrogantes. Tal vez, a pesar de no haber sido aprobadas, tienen todavía posibilidades.

A mi me parecen de lo más interesantes (unas más que otras, claro). En el artículo original hay muchas más, pero la entrada se quedaba demasiado larga, tal vez para una próxima... Desconozco las posibilidades que puedan tener muchas de las propuestas no aprobadas de cara al futuro. Habrá que estar pendientes.

Y disculpad si encontrais algún error en las traducciones!

Gracias a C.A. por el apunte :)
Saludos.

Hoy quiero recomendar una serie de excelentes artículos sobre la historia de la informática aplicada en España desde los años 70, contados de primera mano por Mackluskey, alguien que se autodefine como un informático de los tiempos heroicos, que no ha dejado de trabajar en Informática y disfrutar con ella hasta la fecha. Y lo que el cuerpo aguante. Lo de los tiempos heróicos es más que cierto leyendo sus entradas, sobre todo las primeras.

Todavía no he terminado de leerlas todas. Me he quedado a la hora de escribir estas líneas, en la entrada que versa sobre la programación estructurada, la más habitual hasta la llegada de la POO. Sin embargo, ya he leído más que suficiente para decidirme a recomendarlo, especialemente a los informáticos de los últimos años, que no vivimos una época semejante y sobretodo, a los actuales estudiantes de informática.

Si tuviese que elegir una favorita entre las leídas hasta la fecha, aunque difícil, creo que me quedaría con la entrada sobre los mainframes de IBM, curiosamente la que menos se mete en datos antiguos, centrándose más en las máquinas actuales, aunque aclarando luego en los comentarios que, en realidad, se trata de las mismas máquinas elevadas a la enésima potencia. Además, se hace referencia en los comentarios y en entradas posteriores a otra serie de historias dedicadas a dichas máquinas, de la mano de kujaku. Creo que serán mi próxima lectura.

Eso sí, advierto que algunas entradas son muy largas y mucha gente, sobre todo no informáticos, serán incapaces de llegar al final. Aunque hay entradas mas llevaderas que otras.

Totalmente recomendable.

Núcleo de Ferrita

El nombre de este blog centrado en la Informática (aunque de vez en cuando salte a otros temas) viene dado por la imagen y emblema de la profesión. Lo que no había hecho todavía era dedicar una entrada a este viejo elemento de la computación.

En la wikipedia podemos leer:

La memoria de toros o memoria de núcleos magnéticos, fue una forma de memoria principal de los computadores, hasta comienzos de los años 70. La función de esta memoria era similar a la que realiza la memoria RAM en al actualidad: es el espacio de trabajo, para la CPU, donde se graban los resultados inmediatos de las operaciones que se van realizando. A diferencia de la RAM basada en tecnologías DRAM, se basa en las propiedades magnéticas de su componente activo, el núcleo de ferrita y era una memoria no volátil.


Dicho de otro modo, un núcleo de ferrita era capaz de almacenar la unidad mínima de información (un bit) en la memoria de trabajo de estos ordenadores (lo que hoy sería la RAM). Además, era una memoria no volátil, lo que significa que no perdía su valor tras dejar de recibir alimentación eléctrica, por tratarse de un material magnético.

El emblema es el que desde hoy puede verse a la derecha en este blog. Para ver una descripción de cómo funciona y de qué significa cada una de las "barras" que lo recorren atraviesan (en realidad son cables), nada mejor que la magnífica explicación que Manuel Rovayo García, hace paso a paso en su artículo: Diálogo sobre las memorias de anillos de ferrita.

Si os interesa el tema, que lo disfrutéis :)

En http://www.livecdlist.com/ podemos encontrar innumerables enlaces a Sistemas Operativos LiveCD, orientados a propósitos concretos, la mayoría de ellos basados en distribuciones GNU/Linux.

Al abrir la página aparecerá un listado con todas las distribuciones disponibles, aunque se puede seleccionar en el combo de la parte superior cualquiera de las categorías que se prefiera: escritorio (con distros tan conocidas como Suse, Knoppix o Ubuntu, entre muchas otras), antivirus para windows, astronomía, clustering, desarrollo, diagnóstico, educación, firewall/router, rescate y un largo etcétera.

Gracias a D.F! por el apunte :)

Antes de nada, decir que esta entrada está íntegramente dedicada a mis compañeros de trabajo, en concreto al equipo de desarrollo de nuestro proyecto, por lo que si no eres uno de ellos, probablemente no te interesará lo más mínimo. Aún así he querido tomarme la libertad de este pequeño homenaje. Si alguien se siente molesto u ofendido por supuesto no tiene más que decirlo y lo retiraré inmediatamente.

Es increíble cómo por casualidad, puedes descubrir en uno de tus contactos de msn un avatar personalizado con la forma clásica de los personajes de South Park (gracias Patri xD) y tras buscar un poco en google y terminar encontrando el sitio (http://www.sp-studio.de/) acabar totalmente entretenido creando muñequitos como un niño pequeño :)

Así que me puse manos a la obra con el que será por ahora el nuevo avatar de este blog:



Creo que no he conseguido un parecido demasiado exagerado, pero al menos es un comienzo. El caso es que luego uno no puede parar, y continúa caricaturizando a su responsable técnico y su jefe de proyecto:











Y al final terminas por caricaturizar a todos tus compañeros:




















Reconozco que algunas están un poco pilladas por los pelos (¡que complicado D.F!), pero bueno, espero que todo el mundo se "medio-reconozca" xD Y como traca final, los Pancho Villa's Band en acción:



Nos vemos el lunes! Y que me perdonen los chicos de soporte por no añadirlos, ya no me quedaban ideas :( Tal vez como grouppies... xD

La guerra de dos mundos

Os habréis fijado que a la derecha, tengo un pequeño apartado dedicado a otros blogs recomendados. Normalmente no hago reseña de ninguna de sus entradas, pues todas suelen ser como mínimo interesantes, y por eso figuran ahí. Sin embargo, el artículo que he leído hoy en historias de la ciencia me ha llamado la atención especialmente: la guerra de dos mundos.

Si os gusta escrutar las películas de ciencia ficción en busca de patadas a las leyes de la física (¿quién no ha comentado alguna vez que las explosiones de La Guerra de las Galaxias no deberían oírse?) seguramente el libro que se comenta en el artículo será de vuestro interés, muy al estilo de otro de los blogs que recomiendo: malaciencia. Por lo pronto el resumen de omalaled sirve para abrir boca.

Totalmente recomendable.

¡Hola! sí, sigo vivo. Hoy ha sido festivo y he tenido tiempo para trastear un poco. Hace cosa de un mes me instalé una ubuntu con la que estoy bastante contento (ya había usado antes otras distros GNU/Linux, pero hace tiempo). El caso es que, visitando Linux Zone, me encontré un artículo sobre conky, un software de monitorización del sistema de lo más ligero. En definitiva, uno de esos programas que había visto funcionando en multitud de pantallazos de escritorio, pero con los que nunca me había metido.

Hasta hoy estaba utilizando gDesklets, que permite añadir muchísimos widgets para infinidad de tareas, desde visualizar la temperatura y el clima de una ciudad, hasta monitorizar la carga de tu interfaz de red, por poner dos ejemplos. El problema es que el portátil con el que trabajo ya tiene sus años y resultaba algo pesado. Por ello, como decía, he dado el paso y he desinstalado tanto gDeskelts como AWN. Éste último lo he substituído por Gnome Do con su apariencia de docky, pero esa ya es otra historia.

Para instalarlo no hay que hacer nada especial, ya que viene por defecto en los repositorios de ubuntu:
$ sudo aptitude install conky

Una vez instalado, podemos ejecutarlo directamente con la orden conky. El aspecto inicial es el mostrado en el artículo de Linux Zone mencionado:



Para editar tanto la apariencia como las opciones que aparecen, disponemos de una completa colección de ejemplos y documentación en la web oficial del proyecto. Especialmente útil el apartado de variables disponibles, ya que son fundamentales para la configuración de conky.

Cuando se ejecuta el programa, se busca por defecto un script en $HOME/.conkyrc. Si el script no existe, se muestra el aspecto que ya hemos visto. Para configurar la apariencia de conky debemos editar o crear dicho fichero con el script que deseemos, aunque podemos hacer funcionar conky con cualquier otro script utilizando el parámetro -c:
$ conky -c myscript

Tras algunos problemas, como el hecho de que me hiciese desaparecer los iconos del escritorio, o que no me funcionasen las variables del audacious, conseguí dar con la configuración necesaria para adaptarlo a mi gusto, a partir eso sí, de uno de los ejemplos de la web, cuyo script podemos descargar aquí.

Este es el resultado final, a ver qué os parece (clic para ampliar):



Y aquí el script que lo genera:

# copy at $HOME/ with filename .conkyrc or execute conky -c filename
# conky configuration
# edited by darcon@gmail.com

# reedited by jfmillan@gmail.com:
# changed some colours, texts, intervals..
# added wireless data
# added audacious data if running

# set to yes if you want Conky to be forked in the background
background yes

# X font when Xft is disabled, you can pick one with program xfontsel
#font 5x7
#font 6x10
#font 7x13
#font 8x13
#font 9x15
#font *mintsmild.se*
#font -*-*-*-*-*-*-34-*-*-*-*-*-*-*


# Use Xft?
use_xft yes

# Xft font when Xft is enabled
#xftfont Bitstream Vera Sans Mono:size=8
#xftfont Terminus:size=8
xftfont Monospace:size=8

# Text alpha when using Xft
xftalpha 0.8

# Print everything to console?
# out_to_console no

# mail spool
# mail_spool $MAIL

# Update interval in seconds
update_interval 3.0

# This is the number of times Conky will update before quitting.
# Set to zero to run forever.
total_run_times 0

# Create own window instead of using desktop (required in nautilus)
own_window yes
own_window_type override

# Use double buffering (reduces flicker, may not work for everyone)
double_buffer yes

# Minimum size of text area
minimum_size 10 5

# Draw shades?
draw_shades yes

# Draw outlines?
draw_outline no

# Draw borders around text
draw_borders no

# Stippled borders?
stippled_borders 0

# border margins
border_margin 4

# border width
border_width 1

# Default colors and also border colors
default_color white
default_shade_color black
default_outline_color white

# Text alignment, other possible values are commented
alignment top_left
#alignment top_right
#alignment bottom_left
#alignment bottom_right

# Gap between borders of screen and text
# same thing as passing -x at command line
gap_x 5
gap_y 1

# Subtract file system buffers from used memory?
no_buffers yes

# set to yes if you want all text to be in uppercase
uppercase no

# number of cpu samples to average
# set to 1 to disable averaging
cpu_avg_samples 1

# number of net samples to average
# set to 1 to disable averaging
net_avg_samples 1

# Force UTF8? note that UTF8 support required XFT
override_utf8_locale no


# Add spaces to keep things from moving about? This only affects certain objects.
use_spacer yes
#Note: doesn't work in conky 1.2 =(

# mldonkey_hostname Hostname for mldonkey stuff, defaults to localhost
# mldonkey_port Mldonkey port, 4001 default
# mldonkey_login Mldonkey login, default none
# mldonkey_password Mldonkey password, default none

# stuff after 'TEXT' will be formatted on screen

TEXT







${offset 12}${color slate grey}Date..: ${color}${time %a, }${time %e %B %G}
${offset 12}${color slate grey}Time..: ${color}${time %Z, }${time %H:%M:%S}
${offset 12}${color slate grey}UpTime: ${color}$uptime
${offset 12}${color slate grey}Kernel: ${color}$kernel
${offset 12}${color slate grey}CPU...: ${color}$machine $freq MHz
${offset 12}${color slate grey}Load..: ${color}$cpu% ${acpitemp}C
${offset 12}${color slate grey}Proc..: ${color}$running_processes / $processes
${offset 12}${cpugraph 20,155 ffff00 ddaa00}

${offset 12}${color slate grey}Processor:
${offset 12}${color #ddaa00} ${top name 1}${top_mem cpu 1}
${offset 12}${color lightgrey} ${top name 2}${top cpu 2}
${offset 12}${color lightgrey} ${top name 3}${top cpu 3}
${offset 12}${color lightgrey} ${top name 4}${top cpu 4}

${offset 12}${color slate grey}Memory:
${offset 12}${color #ddaa00} ${top_mem name 1}${top_mem mem 1}
${offset 12}${color lightgrey} ${top_mem name 2}${top_mem mem 2}
${offset 12}${color lightgrey} ${top_mem name 3}${top_mem mem 3}
${offset 12}${color lightgrey} ${top_mem name 4}${top_mem mem 4}

${offset 12}${color slate grey}RAM.: ${color}$memperc% $mem / $memmax
${offset 13}${membar 3,155}
${offset 12}${color slate grey}SWAP: ${color}$swapperc% $swap/ $swapmax
${offset 13}${swapbar 3,155}
${offset 12}${color slate grey}DiSK: ${color}${fs_free /}/ ${fs_size /}
${offset 13}${fs_bar 3,155 /}

${offset 12}${color slate grey}Wireless: ${color}${wireless_essid eth1}
${offset 12}${color #ddaa00} IP....: ${color}${addr eth1}
${offset 12}${color #ddaa00} Device: ${color}eth1
${offset 12}${color #ddaa00} Signal: ${color}${wireless_link_qual_perc eth1}%

${offset 12}${color}Up: ${color}${upspeed eth1} k/s
${offset 12}${upspeedgraph eth1 20,155 ffff00 ddaa00}
${offset 12}${color}Down: ${color}${downspeed eth1} k/s${color}
${offset 12}${downspeedgraph eth1 20,155 ffff00 ddaa00}

${if_running audacious}
${offset 12}${color slate grey}${exec audtool version}: ${color}
${offset 12}${color #ddaa00} Artist: ${color}${execi 3 audtool current-song | cut -d "-" -f1}
${offset 12}${color #ddaa00} Title.:${color}${execi 3 audtool current-song | cut -d "-" -f2}
${offset 12}${color #ddaa00} Time..: ${color}${execi 3 audtool current-song-output-length} / ${execi 3 audtool current-song-length} (${execi 3 audtool playback-status})
${offset 12}${color #ddaa00} Song..: ${color}${execi 3 audtool playlist-position} / ${execi 3 audtool playlist-length} ${color #ddaa00}Vol: ${color}${execi 21 audtool get-volume}%
${endif}


Como se puede observar, el código de monitorización de audacious está incluida en un if_running. Sólo se muestra cuando dicha aplicación está funcionando.

Hasta pronto, espero.