Selección de texto en bloques o columnas

Hay varios programas que nos permiten alternar entre el tradicional modo de selección por líneas y el modo de selección por bloques o columnas.

Intentaré ir completando este post con los programas que me parezcan relevante destacar, y la forma que utilizarlo.

Eclipse

Desde la versión 3.5 de Eclipse (Galileo) y en la 3.6 (Helios), 3.7 (Indigo) y posteriores contamos con la posibilidad de cambiar el modo de selección, de líneas a bloques.

Para activarlo, podemos utilizar el botón de modo de selección, o utilizar la combinación de teclas Alt + Shift + A Eclipse.

Eclipse - selección por bloques

Eclipse – selección por bloques

Me resultó curioso que el tipo de letra utilizado cambia cuando habilitamos este modo de selección, pasando a Courier New a pesar que el tipo de letra que estaba utlizando era monoespaciado. En Linux no pasó.

Notepad++

Notepad++ es un editor de texto simple y poderoso. Podemos seleccionar bloques en lugar de líneas apretando la tecla Shift junto al botón izquierdo del mouse. Si estamos utilizando el teclado, apretando juntas las teclas Alt + Shift y las teclas de cursor.

Notepad++ - selección por bloques

Notepad++ – selección por bloques

Otros

Si algún lector sabe de algún editor que valga la pena agregar algún otro editor, ¡que agregue un comentario! 🙂

SSH sin contraseñas (y seguro)

Es posible establecer conexiones SSH a servidores Linux sin necesidad de ingresar una contraseña cada vez. Para esto debemos:

  • Crear nuestro par de claves pública y privada
  • Copiar nuestra clave pública en el servidor SSH
  • Utilizar la clave privada al establecer la conexión SSH

Dependiendo si estamos utilizando Windows o Linux, tendremos varias formas de llevar a cabo estos pasos.

Creación de las llaves

Para comenzar a utilizar claves pública/privadas desde nuestro cliente SSH, debemos generarlas antes.

Yo las creé utilizando el algoritmo RSA en lugar de DSA, principalmente por el tamaño de la clave, a pesar que DSA es el estándar del gobierno federal de los Estados Unidos. Pero de todas formas, ambos son ampliamente aceptados y por lo que leí,
no hay demasiadas ventajas entre uno o el otro. En este link hay un poco de información interesante y actual.

En Linux

En Linux las generamos utilizando el comando ssh-keygen. Utilizaremos la mayoría de las opciones por defecto, pero se puede consultar las páginas man del comando por más información.

Para generar el par de claves RSA utilizamos el comando:

ssh-keygen -t rsa

Nos pide ingresar algunas opciones, que podemos dejar todo por defecto (notar que para conectarse sin ingresar claves, no se debe ingresar passphrase).
La ejecución va a tener una salida similar a la siguiente:

[~]# ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Created directory '/root/.ssh'.
Enter passphrase (empty 
for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX root@CentosVM
The key's randomart image is:
+--[ RSA 2048]----+
|  o....  .       |
|   o..+=Eo.      |
|     .*B=o.      |
|     ****        |
|      ...        |
|       o o       |
|        .        |
|                 |
|                 |
+-----------------+
[~]#

Esto genera 2 archivos en nuestro directorio home: ~/.ssh/id_rsa y ~/.ssh/id_rsa.pub. El primero contiene la clave privada, que debemos mantener segura y no compartir. El segundo archivo contiene la clave pública, que compartiremos con los servidores SSH a los que querramos conectarnos.

En Windows

Para crear el par de claves en Windows se puede utilizar puttygen (se puede descargar aquí: http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html).
Basta con iniciar el programa, seleccionar “SSH-2 RSA“, 2048 bits de largo de clave y clickear Generate. Nos va a pedir mover el puntero del mouse para generar suficiente aleatoriedad en la generación de las claves.



Luego de eso podemos guardar las claves, teniendo en cuenta las mismas precauciones que si la generamos en un Linux: la clave privada no se comparte con nadie, la clave pública si.


Copiar llaves al servidor SSH

Luego de generar las claves debemos compartir nuestra clave pública con el servidor SSH al que queremos conectarnos.

En Linux

[~]# ssh-copy-id -i ~/.ssh/id_rsa.pub usuario@servidor

Nos preguntará la contraseña de usuario en servidor, para luego agregar nuestra clave pública al final del archivo .ssh/authorized_keys del directorio home de usuario en servidor.

En Windows

Parece que no hay un equivalente a ssh-copy-id en Windows (link a ServerFault), por lo que hacemos este proceso a mano.

Con PuTTY o cualquier programa similar debemos agregar el
contenido de nuestra llave pública en el archivo .ssh/authorized_keys del servidor SSH. Debemos copiar nuestra llave pública (sin incluir los comentarios de "---- BEGIN SSH2 PUBLIC KEY ----" y "---- END SSH2 PUBLIC KEY ----") a una nueva línea con el siguiente formato:

ssh-rsa llave_pública [comentario]

El [comentario] es opcional, y sirve simplemente para identificar nuestra clave en el archivo, dado que se muy posible que existan otras claves públicas listadas.

Si no existe el directorio o el archivo se pueden crear, asegurándonos que queden con permisos de lectura y escritura sólo para el dueño (chmod 600 .ssh/authorized_keys).

Conexión utilizando clave pública/privada

En Linux

Luego de la instalación de la clave, si utilizamos los nombres de las claves por defecto la conexión desde Linux al servidor SSH es tan simple como ejecutar:

[~]# ssh -i ~/.ssh/id_rsa usuario@servidor

En Windows

La forma de utilizar nuestro nuevo par de claves generado dependerá del programa que vayamos a utilizar. En PuTTY lo configuramos de la siguiente forma:

Navegamos hasta la sección “Auth” del árbol de opciones e ingresamos la ruta del archivo de nuestra clave privada en “Private key file for authentication

Más información

Error de Oracle ORA-12705 (Cannot access NLS data files or invalid environment specified)

Hay veces que al conectarnos a una base Oracle, nos retorna un error ORA-12705 con el mensaje “ORA-12705:Cannot access NLS data files or invalid environment specified”, o en un ambiente en español “ORA-12705: No se puede acceder a los archivos de datos NLS o se ha especificado un entorno no válido”.

Un stack trace típico de este error en una aplicación Java es algo parecido a esto:

Caused by: java.sql.SQLException: ORA-00604: error occurred at recursive SQL level 1
ORA-12705: Cannot access NLS data files or invalid environment specified
	at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:112)
	at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:331)
	at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:283)
	at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:278)
	at oracle.jdbc.driver.T4CTTIoauthenticate.receiveOauth(T4CTTIoauthenticate.java:785)
	at oracle.jdbc.driver.
T4CConnection.logon(T4CConnection.java:362)
	at oracle.jdbc.driver.PhysicalConnection.<init>(PhysicalConnection.java:414)
	at oracle.jdbc.driver.T4CConnection.<init>(T4CConnection.java:165)
	at oracle.jdbc.driver.T4CDriverExtension.getConnection(T4CDriverExtension.java:35)
	at oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:801)
	at java.sql.DriverManager.getConnection(DriverManager.java:582)
	at java.sql.DriverManager.getConnection(DriverManager.java:185)
	at org.apache.commons.dbcp.DriverManagerConnectionFactory.createConnection(DriverManagerConnectionFactory.java:65)
	at org.apache.commons.dbcp.PoolableConnectionFactory.makeObject(PoolableConnectionFactory.java:294)
	at org.apache.commons.pool.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:840)
	at org.apache.commons.dbcp.PoolingDataSource.getConnection(PoolingDataSource.java:96)
	... 7 more

O algo parecido a esto, en español:

ORA-12705: No se puede acceder a los archivos de datos NLS o se ha especificado un entorno no válido); nested exception is org.apache.commons.dbcp.SQLNestedException: Cannot create PoolableConnectionFactory (ORA-00604: se ha producido un error a nivel 1 de SQL recursivo ORA-12705: No se puede acceder a los archivos de datos NLS o se ha especificado un entorno no válido)

En mi caso, el problema se da cuando tengo el sistema operativo -y el conjunto de caracteres- configurado para Uruguay. Para solucionarlo en las aplicaciones Java, podemos agregar opciones para configurar el locale que queremos que la JVM utilice, de forma que no tome el del sistema operativo. Esto se hace agregando las siguientes opciones al ejecutar el comando java:

-Duser.region=us -Duser.language=en

Con user.region configurada para ‘us’ y user.language para ‘en’ no falla, eso es seguro. La configuración para México (-Duser.region=mx -Duser.language=es) o España (-Duser.region=es -Duser.
language=es) también funciona bien.

Otra opción es setear la variable de entorno NLS_LANG con un valor de tres partes: _.. Ejemplos de NLS_LANG pueden ser “AMERICAN_AMERICA.WE8ISO8859P1” o “AMERICAN_AMERICA.UTF8”. Podemos ver todos los valores válidos para el lenguaje, territorio y conjunto de caracteres en la vista llamada V$NLS_VALID_VALUES, mediante la consulta

SELECT parameter, value FROM V$NLS_VALID_VALUES

Una tercer opción, válida en Windows es cambiar la configuración regional y de idioma para algún país que Oracle soporte (Estados Unidos, España, México, etc.). Hay que tener en cuenta sin embargo que esta configuración nos puede afectar otros programas, especialmente en la configuración de moneda, formato de fecha o de separación de miles.

Los siguientes links tienen buena información al respecto, aunque no muy orientadas a resolver el problema para lenguajes o sets de caractedes “raros” para Oracle:
http://ora-12705.ora-code.com/
http://www.dba-oracle.com/t_nls_lang.htm
http://www.dba-oracle.com/t_ora_12705_error.htm
http://oraclespin.wordpress.com/2008/05/01/setting-nls_lang-for-oracle/

Editar archivos de Office 2007 en versiones anteriores de Office

Según Microsoft,

Al instalar el paquete de compatibilidad junto con Office 2000, Office XP u Office 2003, podrá abrir, editar y guardar archivos con los nuevos formatos de Word 2007, Excel 2007 y PowerPoint 2007. El paquete de compatibilidad puede utilizarse junto con Microsoft Office Word Viewer 2003, Excel Viewer 2003 y PowerPoint Viewer 2003 para ver los archivos guardados con estos formatos.

El paquete de compatibilidad pesa 37.2 MB y se puede descargar en ésta página. Es un instalador llamado FileFormatConverters.exe, y el proceso de instalación es bien simple.

Luego de instalado tendremos la posibilidad de abrir archivos de Office 2007 (.docx, .pptx, .xlsx, etc.), editarlos y guardarlos como si fueran
versiones antiguas. Para crear archivos de Office 2007 tendremos la opción de guardarlos con el formato deseado en la lista de formatos de “Guardar como tipo“:

Referencias:

UnxUtils: ejecutar comandos Linux/UNIX en Windows

UnxUtils es un port para Windows de varias utilidades GNU. Para la gente que está acostumbrada a utilizar sistemas UNIX o Linux, estas utilidades se extrañan bastante en sistemas Windows, especialmente cuando tenemos que crear scripts. Incluye ls, grep, diff, wget, md5sum, tail, head, less, sed, entre otras. Podemos ver la lista entera de comandos en la siguiente imagen:

Para instalarlo, debemos bajar la herramienta desde la página del proyecto en SourceForge.net. Descomprimimos el archivo en el directorio que más nos guste (yo lo tengo en C:\UnxUtils) y agregamos el directorio [dir]\usr\local\wbin a la variable de entorno path, donde [dir] es el directorio elegido para descomprimir el archivo (en mi caso, agregué C:\UnxUtils\usr\local\wbin)

Otra forma, no tan rápida o directa de contar con este tipo de utilidades bajo Windows, pero más completa es instalar Cygwin. Para ello debemos bajar el instalador desde su página, y luego seguir las instrucciones de su guía para el usuario.

To RAID or not to RAID? Instalando un RAID-0 en mi PC

Introducción

Para mi cumpleaños me regalé un disco igual al que tiene mi computadora de escritorio, para dejarlos en configuración RAID-0, y de esta forma poder mejorar la performance de la computadora, atacando el que considero el cuello de botella más significativo en esta PC.

Antes de instalar todo y comprobar si la PC mejoró su rendimiento, me interesé en hacer algunas mediciones para no quedarme sólo con una sensación y poder comparar en cifras la performance del disco que ya tenía, la del que compré estos últimos días y la de ambos funcionando juntos. Además, me interesaba conocer la diferencia de rendimiento del RAID controlados por software (con Windows XP) y por hardware.

¿Qué es RAID?

RAID es un acrónimo en inglés que significa Redundant Array of Independent Disks; hace referencia a un sistema de almacenamiento que usa múltiples discos duros entre los que distribuye o replica los datos. Dependiendo de su
configuración (llamados niveles), los beneficios de un RAID respecto a un único disco son uno o varios de los siguientes: mayor integridad, mayor tolerancia a fallos, mayor throughput (rendimiento) y mayor capacidad.

Se necesita un controlador RAID para manejar la forma de guardar la información que se lee y escribe en cada disco. Este controlador puede ser un dispositivo de hardware (ya sea como parte integral del chipset del motherboard o como un dispositivo físico dedicado a dicha función) o puede estar implementado por software, como parte del sistema operativo.

¿Qué es RAID-0?

El RAID de nivel 0 es también conocido como data striping, y no tiene nada de redundant. La idea es dividir los datos de forma homogénea en cada uno de los volúmenes. Como consecuencia de esta división de los datos, se mejora el rendimiento tanto de escritura como de lectura, dado que los pedidos que se realizan a los dispositivos se pueden paralelizar y atender simultáneamente. En
el mejor de los casos, la performance crecerá de forma lineal a la cantidad de discos del RAID.

(Fuente: Wikipedia)

Esta configuración no es redundante ni tolerante a fallos, ya que los datos no están replicados entre los discos, ni se utilizan algoritmos de corrección o detección de errores. Esto quiere decir que una falla del RAID nivel cero ocurrirá cuando cualquiera de los discos duros falle (y la probabilidad de que esto suceda será mayor cuanto más discos tenga el RAID). Esta medida en horas se llama MTBF, mean time between failures.

La capacidad total del RAID-0 será la capacidad del disco menor,
multiplicado por la cantidad de discos. Si los discos son de tamaños diferentes, quedará espacio inutilizado los discos más grandes.

¿Qué es RAID-1?

El RAID de nivel 1 es también conocido como data mirroring. En esta configuración, cada disco actúa como una copia exacta (espejo) de los datos. El rendimiento de lectura se ve incrementado porque, como cada disco tiene una copia de los datos, la lectura se puede paralelizar. Sin embargo, la escritura será tan lenta como el más lento de los discos (esto es así porque se necesita tener toda la información replicada en cada uno de ellos).

(Fuente: Wikipedia)

La probabilidad de falla
de esta configuración disminuye cuanto más discos se tengan. Para que se pierda la información, deberán fallar todos y cada uno de los discos.

La capacidad total del RAID será igual a la capacidad del menor de los discos. Al igual que con un RAID-0, si los discos son de tamaños diferentes, quedará espacio sin utilizar en los discos de mayor tamaño.

Otros tipos de RAID

Hice una descripción más detallada de RAID-0 y RAID-1 porque son las opciones que estoy considerando para mi computadora. Sin embargo, configuraciones como RAID-5, RAID-6 o RAID-10 son mucho más utilizadas en servidores. Existe mucha información en Internet sobre estos y otros tipos de RAID, pero de todas formas repasemos algunas de sus características:

RAID-5

RAID-5 necesita por lo menos 3 discos para funcionar. En lugar de espejar todos los datos como hace RAID-1, RAID-5 trabaja con bloques (stripes) de datos, dividiendo la información entre N-1 discos, y utilizando el último disco para guardar información de
paridad del stripe. Esta información de paridad puede ser utilizada si se ocasiona un error de lectura, siendo posible reconstruir la información del bloque que sufrió el fallo. La infomación de paridad no se guarda en un único disco, sino que se alterna para cada bloque. Esto es debido a que en cada escritura, es necesario recalcular y escribir la información de paridad. Si esta información estuviera concentrada en sólo un disco para todos los bloques, sería necesario escribir en el mismo cada vez que se escribe un bloque, ocasionando un cuello de botella.

(Fuente: Wikipedia)

Una configuración de RAID-5 puede funcionar con un disco
fallido. Si fallan 2 o más, se pierden datos.

La capacidad de un RAID-5 es (N-1)xT, en donde N es la cantidad discos, y T es el tamaño del menor de los discos.

El rendimiento de lectura es similar a un RAID-0 para (N-1) discos. El rendimiento de escritura es pobre, especialmente si son escrituras no secuenciales y de tamaños menores que un stripe, ya que para cada escritura es necesario recalcular y escribir la infomación de paridad.

RAID-6

RAID-6 es similar a RAID-5, con la diferencia que usa dos discos para almacenar la información de paridad de cada stripe.

(Fuente: Wikipedia)

RAID-6 puede operar con fallas en 2 discos.

Otra ventaja con
respecto a RAID-5 es que el sistema no queda tan vulnerabla ante la falla de un segundo disco. Con discos duros cada vez más grandes, el tiempo de rearmado de un RAID que falló es también cada vez mayor, y por ende, también se agranda la ventana de tiempo en la cual al sistema tiene un punto único de falla.

El rendimiento de un RAID-6 puede ser similar a un RAID-5, dependiendo mucho de la implementación del cálculo de paridad de los stripes.

La capacidad de un RAID-6 es (N-2)xT, en donde N es la cantidad discos, y T es el tamaño del menor de los discos.

RAID-10 (llamado también RAID 1+0)

Un RAID-10 es RAID-0 de varios RAID-1. Es decir, se implementan varios RAID-1, y se utilizan funcionando como RAID-0.

(Fuente: Wikipedia)

Un RAID-10 podría seguir funcionando siempre y cuando al menos un disco de cada RAID-1 funcione.

En la mayoría de los casos, la performance de un RAID-10 es la más rápida de todas, siendo superada solamente por un RAID-0. Es la configuración elegida para escenarios de alta concurrencia de acceso a los discos como ser bases de datos, servidores de mail, etc.

Configuración, pruebas y resultados

Vamos a la práctica. La idea, como comentaba al principio, es hacer unas pruebas antes y después de configurar un RAID en mi computadora personal.

Configuración

Para configurar el RAID por hardware en mi computadora fue necesario hacer unos cambios en el BIOS. Más concretamente, cambié el parámetro Onboard SATA Type de “SATA disk” a “RAID controller“. En mi BIOS, está ubicado en Onboard device configuration ? South Onchip PCI device ? Onboard SATA Type.

nLuego de este cambio, al iniciar la PC y antes de bootear desde la lista de dispositivos configurados (CD, USB, discos duros, etc.) se presenta por un instante la posibilidad de apretar las teclas Ctrl+F, y acceder a FastBuild, un aplicativo para configurar distintos tipos de RAID, asignarle discos físicos, etc.

FastBuild

Por supuesto que esto será diferente para cada marca y modelo de motherboard, por lo que esto es simplemente una referencia.

Plan de pruebas

Hay infinidad de sitios que hacen pruebas de performance mucho más profesionales que éstas (por ejemplo Tom’s Hardware, PC perspective, Anantech, entre otros). De todas formas, me interesaba ejecutar las siguientes pruebas:

  • duplicar un archivo grande
  • duplicar un directorio con muchos archivos pequeños
  • descomprimir un archivo grande
  • ejecutar el benchmark de h2benchw
  • ejecutar el benchmark de IOMeter

Las especificaciones de mi PC relevantes a este post son las siguientes:

En este post detallaré los resultados de un RAID-0 por hardware, utilizando el chipset de mi motherboard en lugar del sistema operativo. Quizá más adelante pruebe con otras configuraciones de RAID por software o con otros niveles, en cuyo caso, complementaré la información con otro post.

Repetí las pruebas por lo menos 2 veces cada una para asegurarme que los resultados obtenidos estuvieran bien tomados (no fueran outliers).

Resultados

Para medir los tiempos de copia utilicé el programa TeraCopy, un sustituto a la copia de Windows muy recomendable.

Para la prueba de descomprimir un archivo utilicé el programa 7-Zip, también recomendable por tener la posiblidad de utilizar el excelente formato de compresión 7z, pero con la usabilidad un poco recortada si lo comparamos con WinRAR o WinZip.

Duplicar un archivo grande

Para esta prueba utilizamos un ISO de Ubuntu (más específicamente ubuntu-9.04-desktop-i386.iso, con MD5=66FA77789C7B8FF63130E5D5A272D67B) que pesa 698Mb.

Los resultados fueron los siguientes:

Duplicar un archivo grande - disco viejo

Duplicar un archivo grande - disco nuevo

Duplicar un archivo grande - RAID-0

El disco nuevo fue muy bueno duplicando el archivo grande, igual de bueno que el RAID-0. La diferencia con respecto al disco viejo es muy apreciable.

Duplicar un directorio con muchos archivos pequeños

Para esta prueba utilicé un directorio con más de 35.000 archivos, unos 1.500 directorios y una distribución de tamaños como se detalla en la siguiente figura:

Distribución
de tamaño de archivos

La duplicación del directorio terminó en 6’47” en el disco viejo, en 4’39” en el disco nuevo y en 4’15” en el RAID-0:

Duplicar muchos archivos pequeños - disco viejo

Duplicar muchos archivos pequeños - disco nuevo

Duplicar muchos archivos pequeños - RAID-0

Al igual que para el test anterior, el disco nuevo se comportó muy bien, sólo un poco más lento que la configuración en RAID. El disco viejo nuevamente quedó atrás.

Descompresión de un archivo comprimido

El archivo comprimido que utilicé contiene los más de 35.000 archivos y los 1.500 directorios utilizados en la prueba
anterior. El archivo ocupa 18.9Mb, y se expande a 319Mb luego de descomprimido.

Los resultados intermedios del proceso de descrompresión fueron los siguientes:

Descompresión de un archivo comprimido - disco viejo

Descompresión de un archivo comprimido - disco nuevo

Descompresión de un archivo comprimido - RAID-0

h2benchw

Para esta prueba ejecuté h2benchw con los siguientes parámetros:

h2benchw -english -s -p [0|1]

En donde:

  • -english: configura el idioma
  • -s: activa la medición de tiemops de acceso (seek time)
  • -p: activa la medición de perfiles de aplicación (swapping, installing, Word, Photoshop, copying y F-Prot)
  • 0 o 1: es el disco que quiero testear. En el caso del RAID-0, Windows ve un único volumen.

A continuación están los resultados para de cada volumen.

Disco viejo

Capacity: 
312576705 sectors=152625 MByte, CHS=(19457/255/63)
Checking timer for 10 seconds (Win32) ............. Ok.
timer resolution: 0.000 µs, 2399.960 MHz
timer statistics: 27237051 calls, min 0.15 µs, average 0.15 µs, max 70.00 µs
Reading some sectors to warm up... done.
Measuring random access time (whole disk):
reading... 13.78 ms  (min. 4.43 ms, max. 38.71 ms)
random access time in lower 504 MByte
reading... 7.30 ms  (min. 0.10 ms, max. 12.67 ms)
Running application profile `swapping' ...13158.4 KByte/s
Running application profile `installing' ...15769.4 KByte/s
Running application profile `Word' ...22180.3 KByte/s
Running application profile `Photoshop' ...18933.4 KByte/s
Running application profile `copying' ...28393.2 KByte/s
Running application profile `F-Prot' ...10606.0 KByte/s
Result: application index = 16.8
!!! WARNING: application profiles 
inaccurate since measured read-only

Disco nuevo

Capacity: 312576705 sectors=152625 MByte, CHS=(19457/255/63)
Checking timer for 10 seconds (Win32) ............. Ok.
timer resolution: 0.000 µs, 2399.960 MHz
timer statistics: 27513991 calls, min 0.14 µs, average 0.15 µs, max 148.74 µs
Reading some sectors to warm up... done.
Measuring random access time (whole disk):
reading... 13.17 ms  (min. 3.02 ms, max. 27.00 ms)
random access time in lower 504 MByte
reading... 6.72 ms  (min. -0.96 ms, max. 20.66 ms)
Running application profile `swapping' ...14424.6 KByte/s
Running application profile `installing' ...16695.8 KByte/s
Running application profile `Word' ...25281.3 KByte/s
Running application profile `Photoshop' ...23506.0 KByte/s
Running application profile `copying' ...35727.1 KByte/s
Running application profile `F-Prot' ...11728.3 KByte/s
Result: application index = 19.3

RAID-0

Capacity: 621088965 sectors=303266 MByte, CHS=(38661/255/63)
Checking timer for 10 seconds (Win32) ............. Ok.
timer resolution: 0.279 µs, 3.580 MHz
timer statistics: 3472778 calls, min 1.12 µs, average 1.40 µs, max 87.16 µs
Reading some sectors to warm up... done.
Measuring random access time (whole disk):
reading... 13.26 ms  (min. 3.22 ms, max. 33.53 ms)
random access time in lower 504 MByte
reading... 6.62 ms  (min. 0.12 ms, max. 15.13 ms)
Running application profile `swapping' ...14135.7 KByte/s
Running application profile `installing' ...16908.4 KByte/s
Running application profile `Word' ...29537.2 KByte/s
Running application profile `Photoshop' ...26825.3 KByte/s
Running application profile `copying' ...35556.3 KByte/s
Running application profile `F-Prot' ...
10469.2 KByte/s
Result: application index = 19.8

Al igual que en los tests anteriores, la configuración en RAID es la mejor de todas las opciones, siendo seguida de cerca por el disco nuevo.

IOMeter

IOMeter es  una herramienta para medición de performance de systemas de I/O (discos, red, etc.). Funciona ejecutando un profile predefinido, que determina el tipo de acceso al disco (escrituras, lecturas, secuenciales o aleatorias). El perfil utilizado está disponible para descargar haciendo click aquí. Esta prueba se ejecuta haciendo un 67% de pedidos de lectura, 33% de pedidos de escritura, repartidas de forma aleatoria en todo el espacio del disco duro. Además, cada pedido de lectura o de escritura es de a bloques de 4Kbytes. Se hacen 4 ejecuciones de 5 minutos cada una, con 1, 2, 4 y 8 pedidos de I/O en la cola de
invocaciones (outstanding queue depth) respectivamente.

Datos de la ejecución del benchmark en el disco viejo:

Queue depthRead IO/sWrite IO/s% CPUMBpsRead MBpsWrite MBps
166,532,50,310,380,260,13
266,832,10,380,390,260,13
467,733,70,310,400,260,13
874,636,70,470,430,290,14

Datos de la ejecución del benchmark en el disco nuevo:

Queue depthRead IO/sWrite IO/s% CPUMBpsRead MBpsWrite MBps
179,438,90,550,460,310,15
279,138,50,420,460,310,15
480,240,10,460,470,310,16
888,142,50,430,510,340,17

Datos de la ejecución del benchmark en el RAID-0:

Queue depthRead IO/sWrite IO/s% CPUMBpsRead MBpsWrite MBps
1248,8123,71,421,450,970,48
2290,8142,22,441,691,140,56
4306,2151,21,461,791,200,59
8308,8153,11,541,801,210,60

Mejoras del RAID-0 con respecto a los discos separados:

Disco viejoDisco nuevoRAID-0 vs viejoRAID-0 vs nuevo
Read IO/s100%119%419%353%
Write IO/s100%119%423%356%
% CPU100%127%468%370%
MBps100%119%421%354%
Read MBps100%119%421%353%
Write MBps100%119%423%356%

Los resultados obtenidos fueron un poco extraños, ya que el RAID-0 dio resultados mucho mejores (3 o 4 veces mejores) que cada uno de los discos por separado. No tengo claro si esto es normal y está bien, o las medidas individuales de cada disco estuvieron mal tomadas.

Conclusiones

Si bien tenía muy claro que agregarle otro disco a mi PC y ponerlos en RAID-0 no iba a ser la panacea, esperaba que el cambio se sintiera más en el uso práctico de la PC. Por supuesto que el sistema se nota bastante más ágil para responder, pero no se cuánto se lo puedo atribuir al RAID, y cuánto al tener una instalación limpia del sistema operativo. Al tratar con archivos grandes (de más de un megabyte) las velocidades son mejores, pero el uso que yo le doy a la PC está más asociado a leer y escribir cantidad de archivos chicos.

Las comparaciones entre los dos discos individuales fueron bastante contundentes: el disco nuevo, a pesar de ser de la misma
marca y de la misma capacidad, es bastante mejor que el disco viejo. Esto se puede deber a mejoras del hardware en sí, o quizá tenga que ver el contenido de ambos discos: estaban ambos bien desfragmentados, pero el viejo contenía la instalación del sistema operativo. Lo más correcto debería haber hecho cada conjunto de pruebas partiendo de una instalación limpia del sistema operativo, pero no podía darme el lujo de gastar todo el tiempo que esa tarea iba a insumir.

Sería interesante además, que las pruebas hubiesen sido realizadas utilizando dos discos del mismo modelo. De esta forma podríamos descartar diferencias de hardware, y focalizarnos en la diferencia entre tener un disco o un RAID de varios discos. Lamentablemente, no encontré en el mercado un modelo idéntico al disco que ya tenía.

Es notorio que este tipo de configuraciones e instalaciones no son normales para un usuario común. Llego a esta conclusión basándome en la dificultad para encontrar buena documentación práctica de configuración.

nDe todas formas, el contar con 160GB más de espacio es un avance, y si bien el precio del GB de disco es cada vez más barato, estas pruebas valieron mucho la pena, especialmente por lo aprendido durante el proceso.

Empiezo la colecta para un disco SSD, todo sea por seguir aprendiendo 🙂

Referencias

http://es.wikipedia.org/wiki/RAID

http://en.wikipedia.org/wiki/RAID

http://en.wikipedia.org/wiki/Standard_RAID_levels

http://en.wikipedia.org/wiki/Nested_RAID_levels

TeraCopy

7-Zip

Información sobre el formato de compresión 7z

IOMeter

h2benchw

Ejecutar aplicaciones gráficas de X11 (Linux y Unix) en Windows

Introducción

A veces necesitamos ejecutar aplicaciones de un servidor Linux -o Unix- remoto estando conectados a través de SSH, pero estas aplicaciones tienen una interfaz gráfica. Una solución para este problema puede ser iniciar una sesión de VNC (un escritorio remoto de Linux) y ejecutar desde este ambiente nuestra aplicacion. Otra opción que veremos en este post es utilizando X11 tunneling en nuestra sesión SSH, con la ventaja de que agregamos encriptación sobre el canal de comunicaciones.

¿Qué es X11?

X11 es un software creado en los años 80 por el MIT (Massachusetts Institute of Technology) con el propósito de ser una interfaz gráfica para los sistemas Unix de la época.

Tiene una arquitectura cliente-servidor, proveyendo servicios para acceder a la pantalla y los dispositivos de interacción con el ususario, y permitiendo independizar lo que se quiere mostrar (servidor) de la forma de cómo mostrarlo (cliente). Esto permite
también que el cliente de ventanas no esté corriendo en la misma computadora que el servidor, siendo posible ejecutar aplicaciones gráficas de forma remota.

La comunicación entre el cliente y el servidor se realiza utilizando un protocolo determinado (Xprotocol). El hecho de tener tanto un estándar como un protocolo bien definidos tiene como consecuencia una gran portabilidad del código que utiliza X11.

Wikipedia, como ya es de cosumbre tiene información más detallada y bastante clara sobre el sistema de ventanas X, están los links en las referencias.

Sistema de ventanas X en Windows

El tener una definición estándar del manejo de ventanas X permite implementar clientes para Windows. Uno de estos clientes es XMing, una alternativa gratis que funciona muy bien junto a clientes SSH como PuTTY.

Para poder utilizarlo debemos descargar, instalarlo y ejecutarlo. Aparecerá un ícono con una X en el tray, como se ve en la imagen:
n

Luego, al abrir una sesión SSH, debemos activar la opción para poder hacer tunnelling de X11 a través de esa conexión SSH. En PuTTY, esa opcion está en Connection -> SSH -> X11 -> Enable X11 forwarding:

Luego de tener activado el forwarding, siempre que ejecutemos un comando que necesite un ambiente gráfico en esa sesión SSH, se visualizará en nuestro Windows, como si fuera un proceso local.

En mi caso, el X11 forwarding
sirvió para poder utilizar el IBM Webshphere MQ Explorer (comando strmqcfg). Estoy seguro que lo voy a utilizar en alguna otra oportunidad, espero que a ustedes también les sirva.

Referencias

X11

XMing

Matar procesos en Windows (taskkill)

Introducción

La forma más común para matar procesos en Windows seguramente sea utilizando el administrador de tareas, en la pestaña de “Procesos”, haciendo click derecho en el proceso que queremos cerrar por la fuerza:

Administrador de tareas

Si utilizamos Windows XP Professional (o Windows Vista), podemos utilizar el comando taskkill para terminar (de forma forzada si así lo necesitamos) un proceso por su id, su nombre o por filtros menos selectivos. Inclusive se puede utilizar para matar procesos de sistemas remotos. Entre las opciones para seleccionar el proceso a terminar, tenemos las más simples como ser por PID (process id) o nombre de imagen. También tenemos la posibilidad de utilizar un sistema de filtros, para los cuales el comando nos ofrece algunos nombres de variables y una lista de operadores para poder hacer comparaciones (por ejemplo, para terminar todos los procesos de un usuario, o para terminar los procesos que exceden cierto límite de uso de memoria RAM).

Ejemplos de uso

Veamos algunos ejemplos de uso:

  • TASKKILL /PID 1230 /PID 1241 /PID 1253: termina los procesos con PID 1230, 1241 y 1253.
  • TASKKILL /F /IM notepad.exe /IM mspaint.exe: termina de manera forzada los procesos con nombre de imagen “notepad.exe” o “mspaint.exe”.
  • TASKKILL /S otra-pc /F /IM notepad.exe: termina los bloc de notas en la PC de la red llamada “otra-pc”.
  • TASKKILL /F /FI “PID ge 1000” /FI “WINDOWTITLE ne untitle*”: termina de manera forzada los procesos que tengan un PID mayor o igual a 1000, y además el título de la ventana no empiece con “untitle”. Notar que se puede utilizar un caracter de comodín (*) en los filtros, lo que facilita el uso de filtros menos selectivos. También se pueden utilizar varios filtros, para que el comando haga la intersección de los filtros.
  • TASKKILL /F /FI “USERNAME eq NT AUTHORITYSYSTEM” /IM notepad.exe: termina de manera forzada los procesos con nombre de imagen “notepad.exe” que fueron iniciados por el usuario “NT AUTHORITYSYSTEM”.
  • TASKKILL /S otra-pc /U dominiousuario /FI “USERNAME ne NT*” /IM *: Utilizando el usuario “dominiousuario”, termina de forma remota todos los procesos de los usuarios que su nombre no empiece con “NT” en la PC de la red llamada “otra-pc”. Si es necesario, pedirá que se ingrese la contraseña del usuario.
  • TASKKILL /S otra-pc /U nombreusuario /P contraseña”: Si no se ingresan filtros al invocar taskkill para un sistema remoto, el comando apaga la computadora remota (siempre y cuando el usuario tenga permisos para hacerlo)

La salida del comando es un listado de los procesos terminados en caso de que alguno cumpliera con el filtro:

C:\> TASKKILL /F /FI "PID ge 3599" /FI "IMAGENAME eq fdm.exe*"
Correcto: se terminó el proceso con PID 3600.

O un aviso si ningún proceso cumplió el filtro especificado:

C:\> TASKKILL /F /FI "PID ge 3599" /FI "IMAGENAME eq FOXIT*"
INFORMACIÓN: no hay tareas ejecutándose con los criterios especificados.

¿Y para Windows NT o 2000?

Para sistemas basados en Windows NT y 2000 vale la pena ver PsKill (link), una utilidad similar a taskkill.

Acceso directo para “limpiar” procesos que no responden

Una idea muy interesante es crear un acceso directo para matar de forma forzada todos los procesos que hayan dejado de responder. Esto es bastante simple, lo hacemos poniendo como comando del acceso directo lo siguiente:

taskkill.exe /f /fi "status eq not responding"

Sintaxis completa

La ayuda completa del comando taskkill es la siguiente:

C:\> taskkill /?

TASKKILL [/S sistema] [/U usuario [/P contraseña]]
         { [/FI filtro] [/PID IdProceso | /IM NombreImagen] } [/F] [/T]

Descripción:
    Esta herramienta de la línea de comandos puede usarse en uno o más procesos.
    Los procesos pueden terminarse a través del Id. o del nombre de imagen.

Lista de parámetros:
    /S    sistema               Especifica el sistema remoto al que conectarse.
    /U    [dominio]usuario    Especifica el contexto de usuario en el que se que el comando debe ejecutarse.
    /P     contraseña           Especifica la contraseña para el contexto de usuario dado. Pide la entrada si se omite.
    /F                          Especifica la terminación forzada de proceso(s).
    /FI     filtro              Especifica un conjunto de tarea que coinciden con el criterio especificado en el filtro.
    /PID    Id. de proceso      Especifica el ID. de proceso que se debe terminar.
    /IM     nombre de imagen    Especifica el nombre de imagen del proceso que debe terminar. El carácter comodín "*" puede usarse para especificar todos los nombres de imagen.
    /T                          Terminar árbol: termina el proceso especificado y todos los procesos secundarios iniciados por él.
    /?                          Muestra el uso de la ayuda.

Filtro(s):
    Nombre filtro   Operadores válidos         Valores válidos
    -------------   ------------------         ---------------
    STATUS          eq, ne                     RUNNING | NOT RESPONDING
    IMAGENAME       eq, ne                     Nombre de imagen.
    PID             eq, ne, gt, lt, ge, le     Valor de PID.
    SESSION         eq, ne, gt, lt, ge, le     Número de sesión
    CPUTIME         eq, ne, gt, lt, ge, le     Tiempo válido en el formato
                                               hh:mm:ss.
                                               hh - horas,
                                               mm - minutos, ss - segundos
    MEMUSAGE        eq, ne, gt, lt, ge, le     Uso de memoria en KB.
    USERNAME        eq, ne                     Nombre de usuario en formato
                                               [dominio]usuario.
    MODULES         eq, ne                     Nombre de DLL
    SERVICES        eq, ne                     Nombre de servicio.
    WINDOWTITLE     eq, ne                     Título de ventana.

Nota: el carácter comodín "*" del modificador /IM se acepta solamente
      con filtros.

Nota: los procesos remotos siempre se terminarán de manera forzada
      sin tener en cuenta si la opción /F se ha especificado o no.

64GB de RAM en un sistema operativo de 32 bits

Varias veces dije (¡ups!) y escuchado decir que por las limitaciones de un sistema operativo de 32 bits, no es posible utilizar más de 3GB o 3,5GB de RAM. Esto no es del todo cierto, y -desde la época de los Pentium Pro- ni siquiera es una limitación de hardware, sino que es una limitación impuesta en algunos sistemas operativos de Microsoft.

En este post veremos cómo aprovechar los megabytes de RAM por arriba de los 3GB utilizando PAE, una característica de la mayoría de los procesadores modernos, sin necesidad de instalar un sistema operativo de 64 bits. Veremos también algunas consideraciones a tener en cuenta a la hora de poner en la balanza desperdiciar la memoria RAM por encima de los 3GB, habilitar PAE en un sistema operativo de 32 bits, o de utilizar un sistema de 64 bits.

PAE

PAE (Physical Address Extension, Extensión de dirección física) es una característica de la mayoría de los procesadores x86 y x86-64, que
permite que sistemas de 32 bits puedan utilizar hasta 64GB de RAM. Esto es posible ampliando la cantidad de bits utilizados para direccionar memoria de 32 a 36 bits y por esto, la cantidad de memoria direccionable máxima pasa de 4GB (2^32) a 64GB (2^36).

PAE en Windows

Lo más importante a destacar si de Windows hablamos, es que el uso de PAE para extender el espacio de direccionamiento de memoria no está habilitado en ninguna versión “consumer” de Windows, por lo que hay que recurrir a una versión de servidor (NT, 2003, etc.). En realidad, en Windows XP SP1 se permitió habilitar PAE, pero en SP2 se restringió nuevamente, siendo la principal causa de esta restricción los problemas de compatibilidad e inestabilidad de los drivers de los dispositivos. Estos problemas se daban porque en la programación de dichos drivers se asumen cosas que al direccionar la memoria utilizando PAE dejan de ser ciertas (ver la parte de More information de éste artículo).

En la siguiente tabla se muestran los máximos de memoria RAM física soportados por cada versión de Windows:

Sistema operativo – Memoria máxima soportada con PAE
Windows 2000 Advanced Server – 8 GB de RAM física
Windows 2000 Datacenter Server – 32 GB de RAM física
Windows XP (todas las versiones) – 4 GB de RAM física*
Windows Server 2003 (y SP1), Standard Edition – 4 GB de RAM física*
Windows Server 2003, Enterprise Edition – 32 GB de RAM física
Windows Server 2003, Datacenter Edition – 64 GB de RAM física
Windows Server 2003 SP1, Enterprise Edition – 64 GB de RAM física
Windows Server 2003 SP1, Datacenter Edition – 128 GB de RAM física

* El espacio físico de memoria está limitado a 4 GB en estas versiones de Windows.

PAE en Linux

La historia con Linux es diferente, ya que contando con un kernel 2.6+ que tenga habilitado el soporte para PAE, se abre la posibilidad de usar hasta 64GB de RAM en sistemas de 32 bits. Los kernels 2.4
soportan hasta 4GB de memoria RAM física.

Veamos algunos ejemplos de configuración:

Habilitar PAE en Ubuntu

Para habilitar PAE en Ubuntu basta con instalar algunos paquetes que reemplazan el kernel genérico por uno con soporte para PAE. Estoy en un sistema con 4GB de RAM, con el kernel por defecto, y Ubuntu versión 9.04 para x86 (32 bits). La memoria RAM disponible anda en los 3GB:

jarrarte@nb-jarrarte:~$ free -m
total       used       free     shared    buffers     cached
Mem:          3023        428       2594          0         26        176
-/+ buffers/cache:        225       2797
Swap:         1906          0       1906

Mi kernel:

jarrarte@nb-jarrarte:~$ uname -a
Linux nb-jarrarte 2.6.28-15-generic #49-Ubuntu SMP Tue Aug 18 18:40:08 UTC 2009 i686 GNU/Linux

Para instalar el soporte para PAE (este punto también se puede hacer desde el gestor de paquetes gráfico):

jarrarte@nb-
jarrarte:~$ sudo sudo apt-get install linux-headers-server linux-image-server linux-server

Luego de reinciar con el nuevo kernel, vemos que la actualización surgió efecto:

jarrarte@nb-jarrarte:~$ free -m
total       used       free     shared    buffers     cached
Mem:          4021        389       3631          0         26        166
-/+ buffers/cache:        196       3824
Swap:         1906          0       1906
jarrarte@nb-jarrarte:~$ uname -a
Linux nb-jarrarte 2.6.28-15-server #49-Ubuntu SMP Tue Aug 18 19:30:06 UTC 2009 i686 GNU/Linux

Habilitar PAE en Gentoo

Para habilitar el soporte para PAE en Gentoo, debemos recompilar el kernel con la opción de “High memory support” activada. Para ello, ejecutamos

server ~ # cd /usr/src/linux
server linux # make menuconfig

Encontraremos esta configuración bajo Processor type and features —> High Memory
Support
:

Processor type and features  --->
 High Memory Support  --->
  ( ) off
  ( ) 4GB
  (X) 64GB

La opción de 64GB activa el soporte para PAE. Luego de seleccionada, debemos recompilar el kernel, y reiniciar el sistema utilizando este nuevo kernel.

Habilitar PAE en CentOS, Fedora y similares

En estos sabores de Linux podemos habilitar el soporte para PAE instalando “kernel-PAE” utilizando el comando yum:

# yum install kernel-PAE

Luego de instalado, debemos reiniciar el sistema utilizando este nuevo kernel.

¿PAE o sistema operativo de 64 bits?

Creo que la desición de utilizar un sistema operativo de 32 bits con PAE habilitado o de utilizar uno de 64 bits va un poco más allá de la dificultad o facilidad técnica de utilizar uno u otro; como generalmente pasa, “depende” será la mejor respuesta a la hora de hacernos esa pregunta:

  • Como primer punto, dependerá del tipo de
    aplicaciones que se vayan a correr, teniendo en cuenta especialmente si existen versiones optimizadas para CPUs de 64 bits. Si nos estamos planteando este cambio en un servidor de base de datos o de procesamiento multimedia, es muy posible que veamos incrementos de performance con un sistema operativo de 64 bits, ya sea porque aprovechan los registros más grandes, los registros adicionales, las nuevas instrucciones de 64 bits o los espacios de direccionamiento de memoria para los procesos mucho más grandes (pasan de 4GB a 1TB).
  • Por otro lado, también hay que poner en la balanza que una aplicación compilada para 64 bits va a ocupar más espacio en disco y más memoria, por tener que manejar variables y punteros del doble de tamaño. Este incremento en el tamaño repercute en un incremento en el ancho de banda ocupado entre el CPU y la memoria, que a su vez puede repercutir en una degradación de performance si no es bien aprovechado.
  • El no tener drivers de 64 bits para los dispositivos de
    nuestro sistema puede ser una razón de peso bastante importante para no poder pasarnos de arquitectura de 64 bits. También puede pasar que los drivers de 32 bits no funcionen bien con PAE habilitado.
  • Si tenemos un sistema Linux de 32 bits corriendo hace tiempo, aplicaciones instaladas, configuraciones personalizadas, etc. hay que ver si vale la pena reinstalar todo de cero para pasarnos a un sistema de 64 bits y aprovechar un poco más de RAM (si tenemos 4GB instalados, pasarmos a ver unos 800MB adicionales, menos el incremento de uso de memoria de las aplicaciones que vimos 2 puntos más arriba). En mi caso, cambiar el kernel de Ubuntu para aprovechar los 4GB completos implicó unos minutos bajando e instalando el paquete, y una reiniciada al sistema. Hasta ahora no he tenido problemas utilizando 32 bits con PAE.
  • Como último punto, el no poder pasar a sistemas de 64 bits por política organizacional también puede ser una respuesta válida a la pregunta. Si tenemos licencias de algunas
    aplicaciones que puedan tener problemas o directamente no corran en un servidor de 64 bits, la desición está tomada antes de plantearla (especialmente si estamos hablando de costos elevados o de aplicaciones críticas para el negocio de la organización).

Referencias

No hay perfiles. Elija el ícono ‘Correo y fax’ del panel de control para crear un nuevo perfil

Uso Mozilla Thunderbird como cliente de correo, y cada cierto tiempo al intentar adjuntar un archivo a un nuevo correo haciendo hacer click derecho en un archivo, “Enviar a”, “Destinatario de correo” (o al intentar comprimir y enviar como adjunto) Windows me presenta el siguiente diálogo de error:

error-al-enviar-a-destinatario-de-correo

No tengo claro cuándo pasa, pero el tema es que Microsoft Outlook reemplaza a Thunderbird como cliente por defecto. Para solucionar este problema, vamos al Panel de Control, Agregar o quitar programas, seleccionamos Configurar acceso y programas predeterminados y en la parte de configuración personalizada, seleccionamos Mozilla Thunderbird como programa de correo electrónico
determinado:

agregar-o-quitar-programas

Luego de ese cambio, Windows debería volver a comportarse como se supone al enviar archivos a un correo electrónico.