martes, 1 de octubre de 2013

[bash] Test if port 22 is open

With this script you can check if a remote machine is listening on port 22, which is the default SSH port.
#!/bin/bash

port=22
timeout=5

if (( "$#" != 1 )); then
   echo "usage: $(basename $0) HOST"
fi

host=$1

if nc -w $timeout -z $host $port; then
   echo "Yes"
else
   echo "No"
fi

jueves, 19 de septiembre de 2013

R read dataset

Usually, I store my datasets in an ASCII/CSV file where the first column is the output or response and the subsequent columns are the input variable, with on row per pattern/observation. In order to load those datasets in R, I'll often find myself separating the input from the output into two variables to feed them into some algorithm. Therefore I created the following function, that can be added to the .Rprofile
read.dataset <- function(file, response=1, ...) {

   data <- read.table(file, ...)

   x <- as.matrix(data[,-response])
   y <- data[,response]

   dataset <- list(x=x, y=y)
   return(dataset)
}
With the previous function I can read the dataset in one line, and access separatly the input variables and the output
train <- read.dataset("somedata.train")

fit <- lm(train$y ~ train$x)
The function also works if the output is not in the first column, changing the optional parameter response. Optional parameters are also passed along to R function read.table, for instance if the columns are delimited by commas instead of spaces.

miércoles, 4 de septiembre de 2013

VIM reemplazar palabras completas

Expresión regular de vim para reemplazar palabras completas. En este ejemplo se reemplazarán todos los foo por bar, pero no se reemplazarán si está contenido en otra palabra (fooxyz no se cambia por barxyz)

%s/\<foo\>/bar/g 

Fuente

martes, 18 de septiembre de 2012

awk: crear matriz de confusión

En machine learning una forma muy común de mostrar los resultados de un modelo aplicado a un problema de clasificación es a través de una matriz de confusión. El siguiente script de awk crea una matriz de confusión a partir de un fichero donde la primera columna es la salida del modelo (binaria, 0 ó 1) y la segunda columna es la variable de salida real (también binaria, 0 ó 1):
BEGIN{tp=0;tn=0;fp=0;fn=0}
{
   if($1==0)
      $2==0? tn++ : fn++
   else if ($1==1)
      $2==1? tp++ : fp++
}
END{
   printf("\nConfusion matrix:\n")
   printf("+-----+------------+\n")
   printf("| A\\P |   0     1  |\n")
   printf("+-----+------------+\n")
   printf("|  0  | %4d  %4d |\n",tn,fp)
   printf("|  1  | %4d  %4d |\n",fn,tp)
   printf("+-----+------------+\n")
   printf("\nA=Actual, P=Predicted\n\n")
   tpr = tp/(tp+fn)
   tnr = tn/(fp+tn)
   printf("Sensitivity = %g%\n", tpr*100)
   printf("Specificity = %g%\n", tnr*100)
   printf("Accuracy (balanced) = %g%\n", (tpr+tnr)/2*100)
}
Un uso bastante común de este script es cuando tenemos un fichero con datos de test (data.test) donde cada columna representa una variable, separadas por comas. Una de esas columnas es la variable de salida (clase 0 ó clase 1). Para este ejemplo, vamos a suponer que dicha variable de salida se encuentra en la primera columna. Además, en un fichero aparte (modelo.output) tendríamos una única columna con la salida de nuestro modelo de clasificación aplicado en ese mismo fichero de test. En este caso, el script anterior se usa de la siguiente manera:
cut -d"," -f1 data.test | paste -d" " modelo.output - | awk -f conf_matrix.awk 
La salida del comando anterior (suponiendo que el script de awk se encuentra en el fichero conf_matrix.awk) sería algo del estilo:
Accuracy = 71.4286% (220/308) (classification)

Confusion matrix:
+-----+------------+
| A\P |   0     1  |
+-----+------------+
|  0  |  194    74 |
|  1  |   14    26 |
+-----+------------+

A=Actual, P=Predicted

Sensitivity = 65%
Specificity = 72.3881%
Accuracy (balanced) = 68.694%

Thunderbird: responder encima del texto citado

Por defecto (al menos en mi instalación), Thunderbird responde a los mensajes debajo del texto citado. En mi opinión, esto es bastante molesto ya que si estás contestando a un email bastante largo mucha gente no se molesta en hacer scroll y piensa que has contestado con un mensaje vacio. Para cambiar esto y responder encima del texto citado hay que seguir los pasos:

Edit > Account settings > Composition and addressing > start my reply above quote

(Fuente)

martes, 11 de septiembre de 2012

Firefox: registrar nuevo protocolo

En Firefox 3.5 o superiores, para registrar realizamos lo siguiente:
  • Escribir about:config en la barra de direcciones
  • Segundo botón -> Nuevo -> Boolean -> Nombre: network.protocol-handler.expose.foo -> Valor -> false, donde "foo" es el nombre del protocolo que queremos registrar
Como ejemplo, para asignar una aplicación Bittorrent a los archivos magnet, basta con reemplazar "foo" por "magnet" y listo.

(Fuente)

martes, 12 de junio de 2012

Bash: Mover o eliminar ficheros vacios de un directorio

Mover todos los ficheros vacios de un directorio al subdirectorio empty
ls -la | awk '{if ($5==0) print $9}' | xargs mv -t ./empty/
Para eliminarlos basta con
ls -la | awk '{if ($5==0) print $9}' | xargs rm