Archivo

Archivo para Junio, 2010

Curioso e interesante: Google se derrumba, K-Maps, Buenhabit, y más

Jueves, 3 de Junio de 2010 Gaspar Fernández 2 comentarios

Quiero dedicar este post a cosas que me han llamado la atención estos últimos días:

  1. Google se derrumba: Lo descubrí gracias a novatillasku. Es una tontería chulísima, la página principal de Google se cae a pedazos, aunque para verlo tendréis que utilizar un navegador decente. Abstenerse Internet Explorer. Click aqui para verlo.
  2. Mapas de Karnaugh: Via Acerca de Ubuntu veo una serie de programas para resolver mapas de Karnaugh y ser el terror de la electrónica digital :)
  3. Piedra, papel, tijeras, lagarto, Spock: Últimamente estoy viendo la serie The Big Bang Theory, ya estaba tardando en empezarla, y hace poco vi este post. Pocos días antes de llegar hasta el capítulo 2×08 donde ocurre todo :)
  4. Acceder a un Array como un objeto [PHP]: El post ya tiene tiempo. Leído en el blog de Sergi Quiñonero. Nos cuenta cómo haciendo $objeto = (object) $array podemos acceder a cada elemento del array con -> (flechas) como si fuera un objeto.
  5. El sistema Solar en HTML5. Muy currado, demostrando qué es capaz de hacer HTML5, y demasiado cool para IE, aunque está gracioso ver cómo se dibujan en Internet Explorer las órbitas cuadradas :) Ya sé que tampoco son redondas, pero es una demostración sólo…
  6. Dos artículos de un blog muy interesante: Hace mucho tiempo que sigo el blog Buenhabit, y quiero destacar dos de sus últimos posts: Sólo dos cosas a la vez, que habla de una reciente investigación acerca de la limitación humana de la multitarea; y Si gritas no convences, merece la pena leerlo aunque el título lo diga todo.

Hasta aquí una pequeña selección de estos últimos días.

Bucles for en BASH

Martes, 1 de Junio de 2010 Gaspar Fernández 2 comentarios

loooop

No por ser un lenguaje de script enfocado a la línea de comando vamos a dejar de poder hacer un bucle. Es más, si los archivos batch pueden, estos scripts no van a ser menos. Es común ver un bucle for en bash de este modo:

1
2
3
4
for i in $lista;
do
   echo $i;
done

Donde lista puede ser:

lista=”Una serie de cosas separadas por un espacio normalmente. Es un carácter del $IFS

El IFS es el Internal Field Separator (Separador Interno de Campo) y se usa para saber cuándo parar un read; por defecto se usa el espacio/tabulador/nueva línea. En nuestro caso será el separador de los objetos de la lista.

Por ejemplo con este bucle for podemos listar las posibles frecuencias de nuestro procesador (sólo si es compatible con cpufreq y tenemos el módulo del kernel cargado):

1
2
3
4
for j in `cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_frequencies`
do
echo "Frecuencia: "$j" Hz"
done

Es decir, hacemos que nuestra lista sea el resultado de la ejecución de “cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_frequencies

Este método se parece mucho al for each que tienen muchos lenguajes.

Pero, ¿ qué tal el bucle for de toda la vida? ¿ Ése en el que contábamos de un número hasta otro número ? Podemos hacerlo de dos formas:

for i in ….

1
2
3
4
for i in `seq 4 90`
do
   echo $i
done

Donde en seq podemos colocar el número de inicio y el de fin, uno detrás de otro, si ejecutamos seq en el terminal generará una salida con un número en cada línea (aunque se puede cambiar con -s). Aunque también podremos modificar el incremento (2, 3, 4…). Por ejemplo:

$ seq 1 10 1000

que contará de 1 a 1000 de 10 en 10: 1..11..21..31…….991 (hasta 1000 no puede llegar porque se pasa)
Si queremos contar hacia atrás debemos especificar este incremento negativo:

$ seq 10 -1 0

que contará de 10 a 0: 10..9..8..7…….0

El método tradicional

1
2
3
4
for (( i=0; i<1000; i++ ))
do
   echo $i
done

¡ Anda ! Igual que en C, pero con dos paréntesis… además, éste método lo podemos extender un poco más. Lo mismo que podemos hacer:

for (( i=0; i<1000; i=i+5 ))

Para contar de 5 en 5

for ((i=1000; i>0; i=i-5))

Para contar de -5 en -5

podemos hacer lo siguiente:

for (( i=1000; i>0; i=`expr $i / 2`))

Para ir dividiendo el número entre dos, o:

for (( i=1; i<100; i=`expr $i \* 2`))

para ir multiplicando entre dos

En definitiva, cualquier operación que podamos hacer desde la línea de comando, por ejemplo con expr, aunque si se nos queda corto siempre podemos usar bc (haré un algún post sobre bc).

Con expr podemos hacer algunas operaciones matemáticas simples (suma, resta, multiplicación, división, resto, and y or) con los siguientes símbolos respectivamente (+, -, *, /, %, &, |), aunque *, & y | deben ser escapados con una \ (contra barra).
Cada elemento en la expresión debe ir con un espacio, dejo como ejemplo las siguientes expresiones:

$ expr 100 \& 0
0
$ expr 100 \& 1
100
$ expr 0 \& 3
0
$ expr 0 \| 3
3
$ expr 23 \* 45 + 20 - 4 % 3
1054
$ expr 3 % 2
1
$ a=3
$ expr $a + 1
4

Es cierto que expr hace muchas más cosas: podemos poner paréntesis para dar preferencia a algunas operaciones, y hay palabras clave para operar con cadenas de caracteres.

Foto: Spookuygonk (Flickr)

Visita otras webs de la red