Archivo

Archivo para la categoría ‘Linux’

Hallar la IP de un dispositivo en C

Lunes, 30 de Abril de 2012 Gaspar Fernández 2 comentarios

Puede que se nos haya presentado alguna vez la necesidad de saber la dirección de un dispositivo desde nuestro programa, y no es plan de ponernos a ejecutar ifconfig o algún programa parecido para hallar la dirección.

Podemos hablar con ioctl() una función destinada a definir y obtener información de dispositivos. Hay cientos de llamadas, aquí comentaremos la llamada SIOCGIFADDR cuya función es la que comentábamos, obtener la dirección de un interfaz de red.

Podemos probar el siguiente programa con el que hallaremos la IP del dispositivo eth0:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/ioctl.h>
#include <net/if.h>
#include <string.h>

int main()
{
  int sock;
  struct ifreq ifr;

  sock=socket(AF_INET, SOCK_DGRAM, 0);
  if (sock<0)
    return -1;          /* No puedo crear el socket */

  ifr.ifr_addr.sa_family = AF_INET;
  strcpy(ifr.ifr_name, "eth0");

  if (ioctl(sock, SIOCGIFADDR, &ifr) < 0)
    return -1;          /* No encuentro el dispositivo */
 
  printf("IP de eth0: %s\n", inet_ntoa( (*(struct in_addr *) &ifr.ifr_addr.sa_data[2])));

  close(sock);

  return 0;
}

Primero creamos un socket, luego definimos la familia y el dispositivo que queremos consultar con:

1
2
ifr.ifr_addr.sa_family = AF_INET;
  strcpy(ifr.ifr_name, "eth0");

Para comprender cómo obtenemos la dirección debemos echar un ojo a las estructuras:
(struct ifreq)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
struct ifreq
{
    char            ifr_name[IFNAMSIZ];   /* Nombre de la interfaz */
    union {
                    struct sockaddr       ifr_addr;
                    struct sockaddr       ifr_dstaddr;
                    struct sockaddr       ifr_broadaddr;
                    struct sockaddr       ifr_netmask;
                    struct sockaddr       ifr_hwaddr;
                    short                 ifr_flags;
                    int                   ifr_ifindex;
                    int                   ifr_metric;
                    int                   ifr_mtu;
                    struct ifmap          ifr_map;
                    char                  ifr_slave[IFNAMSIZ];
                    char                  ifr_newname[IFNAMSIZ];
                    char *                ifr_data;
    };
}

(struct sockaddr)

1
2
3
4
5
struct sockaddr
{
   unsigned short sa_family;  /* familia de la dirección */
   char sa_data[14];          /* 14 bytes de la dirección del protocolo */  
};

(struct sockaddr_in)

1
2
3
4
5
6
7
struct sockaddr_in
{
   short int sin_family;        /* Familia de la Dirección              */
   unsigned short int sin_port; /* Puerto                               */
   struct in_addr sin_addr;     /* Dirección de Internet                */
   unsigned char sin_zero[8];   /* Del mismo tamaño que struct sockaddr */
};

(struct in_addr)

1
2
3
4
struct in_addr
{
   unsigned   long s_addr;
};

Bien, en el programa anterior, la línea más conflictiva es:

1
printf("IP de eth0: %s\n", inet_ntoa( (*(struct in_addr *) &ifr.ifr_addr.sa_data[2])));

En ella, sacaremos la dirección en forma de struct in_addr que es el que le gusta a inet_ntoa() (esta función sólo coge la dirección y la pone en forma de char* para que podamos entenderla.
Para llegar al struct in_addr, partimos de la estructura struct ifreq (variable ifr) que nos devuelve ioctl(), ésta tiene un campo llamado ifr_addr de tipo struct sockaddr. El tipo struct sockaddr y struct sockaddr_in podemos compararlos, es decir, podemos ponerlos uno encima de otro y pueden tener la misma información en el mismo byte, por tanto, podemos ver que el campo sa_data de un struct sockaddr coincide con sin_port, sin_addr y sin_zero de un struct sockaddr in; vemos que sin_port es de tipo unsigned short por tanto ocupará 2 bytes y como queremos la información encerrada en sa_data a partir del byte 2, de ahí viene dicho número. Si queremos ponerlo de otra forma, ésta podría ser:

1
2
struct sockaddr_in sain;
  printf("IP de eth0: %s\n", inet_ntoa( (*(struct in_addr *) &ifr.ifr_addr.sa_data[sizeof(sain.sin_port)])));

Redimensionar ventanas con Alt+Botón derecho en GNOME 2

Lunes, 2 de Abril de 2012 Gaspar Fernández Sin comentarios

Aunque GNOME2 ya está algo antiguo, aún lo uso en algún equipo viejo, y una cosa que yo utilizo muy a menudo es la redimensión de ventanas con Alt+Botón derecho del ratón (para mover también es muy rápido Alt+Botón izquierdo), aunque GNOME 2 trae por defecto la redimensión con Alt+Botón central lo que no me resulta muy cómodo a veces (sobre todo en portátiles cuando no hay botón central).

Para ello, aunque se puede hacer de forma gráfica, a veces es mejor un copia y pega de consola:

$ gconftool-2 –set /apps/metacity/general/resize_with_right_button –type=bool True

mayúsculas y minúsculas en BASH (toupper(), tolower()) [copia y pega]

Martes, 13 de Marzo de 2012 Gaspar Fernández Sin comentarios

mayuscula En ocasiones, es muy útil crear scripts en bash, aunque en ocasiones debemos controlar las mayúsculas y minúsculas, por ejemplo renombrando archivos, escribiendo informes o para ajustarse a diferentes convenciones a la hora de hacer un programa. Aquí dejo ejemplos de funciones tipo strtoupper(), strtolower(), por decir un equivalente en PHP.

Hay opciones, la elección de alguna de estas opciones depende del entorno en que nos encontremos, ya sea BASH, algún otro clon, y dispongamos de awk o tr.

La primera de ellas es para poner un texto en mayúsculas:

1
2
3
4
function uppercase()
{
    echo "$1" | awk '{print toupper($0)}'
}

Otra opción puede ser:

1
2
3
4
function uppercase()
{
    echo "$1" | tr 'a-z' 'A-Z'
}

Si usamos la versión 4.0 o superior de BASH, que ya tiene un tiempo, podemos hacer lo siguiente:

1
2
3
4
function uppercase()
{
    echo "${^^*}"
}

La segunda de ellas para poner un texto en minúsculas:

1
2
3
4
function lowercase()
{
    echo "$1" | awk '{print tolowe($0)}'
}

Otra opción puede ser:

1
2
3
4
function lowercase()
{
    echo "$1" | tr 'A-Z' 'a-z'
}

Si usamos bash 4.0 o superior podemos hacerlo mucho más fácil!

1
2
3
4
function lowercase()
{
     echo "${1,,*}"
}

Calmando los ventiladores de netbooks Acer One

Lunes, 5 de Marzo de 2012 Gaspar Fernández 2 comentarios

En ocasiones, el ventilador de los netbook Acer puede llegar a ser algo molesto, y bueno, no es porque sea molesto, sobre todo es porque un ventilador girando a toda pastilla, aunque es bueno que tenga fresco el procesador, es capaz de gastar una batería un 40% más rápido y si estamos fuera de casa o lejos de un enchufe se nos acaba el chollo pronto, eso sí, el portátil estará frío. ¿Tal vez será para vender baterías de 6 celdas?

He visto que el fallo afecta igual a usuarios de Windows o Linux, por lo que no parece que sea problema del sistema operativo. Navegando un poco por Internet encontré un script, acerfand de Rachel Greenham. No enlazo porque su web no funciona, avisadme si encontráis alguna que sí funcione. acerfandtar.

Este script debemos ejecutarlo como root y al iniciar el ordenador para que se encargue de controlar el movimiento del ventilador. Lo primero es dar permisos de ejecución y luego añadirlo a los scripts de arranque, por ejemplo añadiendo la ejecución a /etc/rc.local . Pero para evitar que el script se ejecute varias veces podemos crear otro script: /etc/acerfanloader (he supuesto que acerfand está en /usr/local/bin):

1
2
3
4
5
6
#!/bin/bash
prcs=`ps ax`
if [[ -z `echo $procs | grep acerfand` ]]
then
   /usr/local/bin/acerfand
fi

Luego el script acerfanloader lo podemos llamar desde rc.local y se ejecutará nada más encender el ordenador, para no tener que preocuparnos.

Actualización 20/04/2012 : Corregido el código gracias al comerario de luisgulo

Entrada automática en LMDE con GDM3

Viernes, 24 de Febrero de 2012 Gaspar Fernández Sin comentarios

El paquete gdm para LMDE suele traernos a todos por la calle de la amargura, y es que en ocasiones viene con gdm-setup, y en cuanto se actualiza, ya no trae este pequeño programa.

Aunque la configuración de gdm no es nada del otro mundo, se agradece el entorno gráfico, aunque sólo sea para activar el autologin. Aunque puede ser un riesgo para la seguridad de nuestro ordenador, cuando instalamos un sistema para alguien que no se quiere complicar mucho la vida, es conveniente ofrecerle la opción de entrar automáticamente en su sesión.

Para ello tenemos que editar /etc/gdm3/daemon.conf (como root):

$ sudo nano /etc/gdm3/daemon.conf

Y en la sección [daemon] debemos incluir:

AutomaticLoginEnable=true
AutomaticLogin=usuario

(Control+X, Sí, Intro <- Para salir y guardar cambios en nano)
Donde usuario es el nombre de usuario que queremos que se identifique automáticamente.

Categories: Linux Tags: , , , , , , ,

Navegando a través de un tunel SSH

Miércoles, 22 de Febrero de 2012 Gaspar Fernández 2 comentarios

blogtunel

En ocasiones, si queremos navegar de una forma algo más anónima y privada, en el lugar que nos encontramos no tenemos acceso a determinados servicios, o simplemente queremos usar una conexión diferente a la red, podemos intentar esto.
Podemos navegar desde cualquier ordenador que disponga de un servidor SSH, por ejemplo un servidor que tengamos contratado (Dreamhost ofrece además de hosting SSH. Podéis usar el código DFIFTYHOST para tener casi un 50% de descuento el primer año). Para llevar esto a cabo, basta con ejecutar el siguiente comando en la máquina local (no el servidor):

$ ssh -D 8080 usuario@servidor.ext

Donde 8080 será el puerto al que debemos mandar las peticiones (en realidad es el puerto del proxy), y lo demás son los datos del servidor al que nos conectamos. Con esto sólo podemos hacer el tunel para conexiones locales, es decir, sólo podremos utilizarlo en nuestra máquina.

Imagina ahora que queremos compartir la conexión de ese túnel con otros ordenadores, en caso de encontrarte, por poner un ejemplo absurdo, en la sala de ordenadores de la facultad, y un profesor te mande programar un juego tipo arkanoid, pero la página con la documentación la encuentras en un archivo llamado arkanoid.html; el proxy de la facultad bloquea las páginas con ese nombre y por tanto no se puede leer la documentación (era un caso real, en el que hubiera deseado poder hacer esto). En este momento, al encontrarte con varios amigos en la biblioteca y querer acceder todos al mismo recurso, podemos hacer que uno de ellos haga el túnel y comparta el proxy con los demás. Si por ejemplo la IP dentro de la red local (no con la que se conecta a Internet) es 192.168.1.8 , debería hacer:

$ ssh -D 192.168.1.8:8080 usuario@servidor.ext

Con esto, asociamos el puerto a la IP de la red local y no a localhost.

Luego en el navegador debemos configurar la forma en la que conectamos, debemos elegir configuración manual del proxy, y en la casilla de servidor Socks (versión 5) poner la IP: 192.168.1.8 (o localhost si cogemos la primera opción), y en el puerto 8080. En Firefox encontramos esa opción en Editar (Herramientas en Windows) / Preferencias / Avanzado / Red / Configuración

Por supuesto podemos elegir el número de puerto que queramos, siempre que sea mayor a 1024 (para hacerlo como usuario) y no haya nada corriendo en esos puertos.

Para Windows, podemos usar Putty.

Foto: marru-birra (Flickr) Con licencia CC-by-nc a 22/02/2012.

Creando un menú selector de frecuencia de nuestra CPU

Lunes, 9 de Enero de 2012 Gaspar Fernández 2 comentarios

screenshot-05-01-2012-220103

A mí me gusta tener el control sobre la frecuencia de la CPU, ya sea porque muchas veces no estoy haciendo nada y lo quiero dejar al mínimo de velocidad para que se caliente menos, o porque algunas veces necesito un poco más de potencia, y otras veces lo dejo a su aire para que cambie de frecuencia solo.

El script se basa en llamadas a cpufreq-set de cpufrequtils, aunque la llamada tiene que ser con permisos de root, por lo que conviene ver antes este artículo, de todas formas, todo esto se hará paso a paso.

Requisitos

  • CPU soportada por cpufreq
  • Sudo / Gksudo
  • Cpufrequtils
  • Zenity
  • Xosd

Editando sudoers

Este script lo ejecutaremos desde nuestro usuario, pero la llamada a cpufreq-set necesita permisos especiales, por lo tanto, lo haremos con sudo. Si saltamos este paso, nos preguntará la contraseña para ejecutar los comandos, pero si no queremos que nos pregunte, debemos hacer esto.

Lo primero es ejecutar:

$ sudo visudo

Y en el archivo, debajo de la última línea sin comentario, escribimos:

mi_usuario   ALL= NOPASSWD : /usr/bin/cpufreq-set

Sustituyendo mi_usuario por el usuario que va a ejecutar el script. Si tenéis varios usuarios podéis añadirlos uno por línea, o ver el artículo mencionado antes para más opciones.

El script

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
#!/bin/bash

DIALOG=zenity
CPUFREQSET=`which cpufreq-set`
OSDCAT=`which osd_cat`

XOSD_FONT="-*-luxisans-bold-*-*-*-47-*-*-*-*-*-*-*"
XOSD_OPTIONS="--pos=bottom -o -210 -A center -c green -s 2 -d 2 -f "$XOSD_FONT;
tempfile=`tempfile 2>/dev/null` || tempfile=/tmp/test$$
trap "rm -f $tempfile" 0 1 2 5 15

if [ -z $CPUFREQSET ]
then
    echo "cpufrequtils no está instalado"
    exit
fi

if [ -z $OSDCAT ]
then
    echo "xosd no está instalado"
    exit
fi

if [ -e "/sys/devices/system/cpu/cpu0/cpufreq/scaling_available_frequencies" ]
then
    actual=`cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_freq`
    cnt=0
    for i in `cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_frequencies`
    do
    if [[ $i != $actual ]]; then
        cnt=`expr $cnt + 1`
    fi
    done
else
    echo "CPUfreq no está disponible"
    exit    
fi

simple_math()
{
    echo "scale=2; $1" | bc;
}

saca_freq()
{
    cnt=0
    for i in `cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_frequencies`
      do
      if [[ $cnt == $1 ]]; then
      frq=$i
      break
      fi
      cnt=`expr $cnt + 1`
    done
    echo $frq
}

pone_freqs()
{
    cnt=0
    for j in `cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_frequencies`
      do
      if [[ $j != $actual ]]; then
      frq=$frq":Cpufreq "$cnt":"`simple_math $j/1000000`" Ghz"
      fi
      cnt=`expr $cnt + 1`
    done
    echo $frq
}

pone_governors()
{
    possible_governors=([0]=powersave [1]=conservative [2]=ondemand [3]=performance)
    governor_command=([0]=Powersave [1]=Conservative [2]=Ondemand [3]=Performance)
    governor_text=([0]="Ahorro de energía" [1]="Modo conservador" [2]="Modo Bajo demanda" [3]="Modo rendimiento")
    available_governors=`cpufreq-info -g`

    for (( g=0; g<${#possible_governors[*]}; g++ ))
    do
    # echo $g
    # echo ${possible_governors[$g]}
    gov=${possible_governors[$g]}
    if [ -n "`echo $available_governors | grep $gov`" ]
    then
        frq=$frq":"${governor_command[$g]}":"${governor_text[$g]}
    fi
    done
   
    echo $frq
}

freqs="Exit:No hacer nada"
freqs=$freqs`pone_freqs`
freqs=$freqs`pone_governors`

OLD_IFS=$IFS
IFS=":"


$DIALOG --width=240 --height=250 --title="Selector de frecuencia" --list --column "ID" --column "Frecuencia" --hide-column 1 --text "Elige una opcion" $freqs > $tempfile

retval=$?
IFS="${OLD_IFS}"

choice=`cat $tempfile`

comando=`echo $choice | cut --delimiter " " --fields 1`
modif=`echo $choice | cut --delimiter " " --fields 2`

case $retval in
  0)
    case $comando in
        "Exit")
        echo "Salir" | osd_cat $XOSD_OPTIONS
        ;;
        "Cpufreq")
        freqdef=`saca_freq $modif`
        gksudo "$CPUFREQSET -g userspace"
        gksudo "$CPUFREQSET -f $freqdef"
        echo "Velocidad actual "`simple_math $freqdef/1000000`"Ghz" | $OSDCAT $XOSD_OPTIONS
        ;;
        "Powersave")
        gksudo "/usr/bin/cpufreq-set -g powersave"
        echo "Modo ahorro de energía" | $OSDCAT $XOSD_OPTIONS
        ;;
        "Conservative")
        gksudo "/usr/bin/cpufreq-set -g conservative"
        echo "Modo conservador" | $OSDCAT $XOSD_OPTIONS
        ;;
        "Ondemand")
        gksudo "/usr/bin/cpufreq-set -g ondemand"
        echo "Modo bajo demanda" | $OSDCAT $XOSD_OPTIONS
        ;;
        "Performance")
        gksudo "/usr/bin/cpufreq-set -g performance"
        echo "Modo rendimiento" | $OSDCAT $XOSD_OPTIONS
        ;;     
    esac;;
  1)
    echo "Cancelado";;
  255)
    echo "Escape";;
esac

Notas del script

  • He optado por filtrar el resultado de cpufreq-info -g y cambiar las palabras, me gusta filtrar todos los datos que me llegan.
  • Añadí la primera opción para no hacer nada, porque me resultó más cómoda cuando quiero cancelar el menú
  • zenity nos devuelve dos cosas: El resultado de la ejecución y el valor elegido, por tanto el primer valor lo podemos averiguar del script, el segundo lo devuelve como texto, por eso lo almacenamos en un archivo temporal
  • Para cambiar el tipo de letra, tenemos que ejecutar xfontsel, desde ese programa, elegir el tipo de letra y copiar el texto que nos devuelve a la variable XOSD_FONT
    • Por último…

      Para disfrutar de este script, lo bueno es asociarlo a una tecla, por ejemplo yo lo tengo en Meta+F3 y con ello se puede cambiar la frecuencia rápidamente.

C.I. XVI: Hashtables VS Arrays, Matemáticas de Borges, renombrar archivos masivamente en Linux, Ejemplos de Crontab, Linux 3.2

Sábado, 7 de Enero de 2012 Gaspar Fernández Sin comentarios

Estos días, aunque inactivos, he seleccionado algunos enlaces que me han parecido interesantes:

Ejecutando programas como root sin contraseña (Paso a paso)

Jueves, 5 de Enero de 2012 Gaspar Fernández Sin comentarios

sandwich

Cuando estamos utilizando la terminal y queremos ejecutar comandos con privilegios de superusuario (root), los usuarios de Ubuntu o Mint entre otras estarán acostumbrados a pedir las cosas con sudo.

Cuando estamos delante, es muy cómodo hacerlo, aunque tengamos que introducir la contraseña nada más ejecutar el comando (en muchos sistemas, cuando la has introducido una vez, te deja ejecutar comandos como root durante un rato sin introducir contraseña).

El problema está cuando creamos scripts y automatizamos tareas que requieren en una pequeña parte privilegios de root. Por un lado, podemos ejecutar los scripts como root y olvidarnos, pero es algo muy inseguro, lo suyo es que ejecutemos el comando con sudo y no nos pregunte por contraseña.

Tenemos que tener cuidado con esto, ya que se permitirán algunos comandos de root sin contraseña, y puede que muchos de ellos sean dañinos para el sistema, eso es nuestra responsabilidad.

Un comando, para un sólo usuario

Para los ejemplos, vamos a ejecutar como root el comando service (para arrancar o parar servicios de sistema). De este modo no tendremos que introducir la contraseña cuando queramos hacerlo.

Para ello vamos a editar el archivo sudoers. Y con ese fin debemos ejecutar el comando visudo como root:

$ sudo visudo

Se abrirá un editor (vi, por ejemplo) con el que podremos editar los contenidos de ese fichero de forma segura. Allí debemos añadir la siguiente línea:

1
usuario   ALL= NOPASSWD : /usr/sbin/service

Si os fijáis, es la palabra clave NOPASSWD la que provoca que no se pregunte contraseña cuando se invoca el comando.

Podemos hacerlo al final del fichero. En este caso daremos permiso a usuario para que ejecute:

$ sudo service xxxxx xxxxxx

por ejemplo:

$ sudo service apache restart

las veces que quiera sin pedir contraseña.

Un comando, un grupo

Una opción, es que si el ordenador lo utilizan varios usuarios, es permitir a un grupo entero la ejecución de comandos de esta forma, para ello, primero creamos el grupo (el grupo se llamará administradores)

$ sudo groupadd administradores

Ahora introucimos usuarios en el grupo:

$ sudo gpasswd -a usuario1 administradores
$ sudo gpasswd -a usuario2 administradores
$ sudo gpasswd -a usuario3 administradores

o también

$ sudo gpasswd -M usuario1,usuario2,usuario3 administradores

Ahora introducimos lo siguiente en sudoers (con el comando visudo, como antes):

1
%administradores   ALL= NOPASSWD : /usr/sbin/service

Muchos comandos, muchos usuarios

También puede ser que tengamos muchos comandos para permitir a muchos usuarios y, aunque podemos introducir 200 líneas en sudoers, a lo mejor es algo complicado de administrar en el caso de que queramos quitar un comando, ya que tendremos que modificar varias líneaas, o queramos quitar a un usuario. Para eso utilizaremos los alias de sudoers.

Podemos utilizr comandos especiales dentro de sudoers que nos permitirán crear un Alias donde introducir una enumeración de datos (por ejemplo usuarios y comandos):

  • User_Alias NOMBRE_DE_LA_COLECCION = usuario1, usuario2, usuario3, etc : Configurará una colección de usuarios llamada NOMBRE_DE_LA_COLECCION
  • Cmnd_Alias COLECCION_COMANDOS = comando1, comando2, comando3, etc : Configura una colección de comandos llamada COLECCION_COMANDOS

Luego estos alias podemos utilizarlos en la línea de sudoers que activa la utilización sin contraseña:

1
ADMINISTRADORES   ALL= NOPASSWD : COMANDOS

Algo que me dejé en el tintero

En esta guía no quise introducir el host (es ese ALL) que nos queda colgado, y es que podemos limitar el uso de sudo a un host determinado. Por ejemplo, permitir esa ejecución cuando se ejecuten en modo local o desde un determinado nodo remoto (para que no desde todos lados se pueda hacer). Aquí podemos especificar tanto nombres de host como direcciones IP.

Foto: xkcd

C.I. XIV: Arduino 1.0 disponible, Ubuntu Operation NightLight, gobernadores de CPU, Como funciona el Servicio FTP y más

Domingo, 4 de Diciembre de 2011 Gaspar Fernández 2 comentarios

Estos son los enlaces que he visto interesantes durante la semana:

  • Arduino IDE 1.0 disponible: muchos de los que programamos en esta plataforma lo agradecerán. Sobre todo porque en la librería Ethernet han implementado DHCP, lo cual es muy interesante. Aunque el entorno, como IDE, le siguen faltando muchas opciones.
  • Uno de los actos de presentación del Nokia Lumia (Nuevo Teléfono con Windows Phone) era una presentación sobre el edificio en Londres donde trabaja Canonical. Bueno, estos hicieron un contraataque titulado Ubuntu Operation NightLight, no tan grande como podemos esperar, pero ¡ están ahí !
  • Impresiones de Linux Mint 12: Lisa: Tengo ganas de probarlo, mientras, vamos a ver qué nos depara esta nueva versión.
  • Tipos de gobernadores de las CPUs: Es un tema interesante que muchos lo dejamos tal y como está, pero podemos controlarlo.
  • El captcha de Adafruit: Nada, sólo por el Captcha habrá que darle una oportunidad a la tienda. Muy curioso para los que os guste la electrónica. Lo descubrí gracias a @fransolano.
  • ¿Cómo funciona el servicio FTP?. Buena explicación de cómo funciona (varias partes)
  • Notificaciones de tuenti en Linux: Si eres Linuxero y usas tuenti, te interesa ver esto.

Actualizado a 5 / 12 / 2011 : Añadida la mención a @fransolano en el enlace de Adafruit.

Visita otras webs de la red