Archive for September, 2008
September 21, 2008 at 13:29 · Filed under OpenSolaris, Redes
Ayer tarde instalé OpenSolaris 2008.05 virtualizado sobre VMware Server en la Debian que uso habitualmente. El acceso a red lo configuré en VMware como NAT.
No hubo problemas que ahora mismo recuerde, excepto el uso de servidores DNS.
pablo@lynen:~$ ping 172.16.62.128
hacia mi ip (la averigüé con ifconfig -a) no hay problemas
172.16.62.128 is alive
pablo@lynen:~$ ping 172.16.62.1
hacia mi router (anfitrión/VMware) tampoco
172.16.62.1 is alive
pablo@lynen:~$ ping 172.16.62.2
hacia mi dirección para el anfitrión (VMware)
172.16.62.2 is alive
pablo@lynen:~$ ping 192.168.1.1
hacia el router de la LAN
192.168.1.1 is alive
pablo@lynen:~$ host google.es
Algo así como
no nameservers were reachable
Por defecto al instalar no había fichero
/etc/resolv.conf
, que en Solaris, al igual que en Linux, también sirve para definir qué servidor(es) de nombres se utilizarán. Creé uno:
pablo@lynen:~$ pfexec cat > /etc/resolv.conf
domain .
nameserver 192.168.10.1
nameserver 83.xx.xx.xx
El
pfexec
es como el
sudo
de Linux, más o menos, salvo que aquí nunca me pide mi password (supongo que será cuestión de la configuración por defecto).
Por lo demás se definen dos servidores de nombres: uno en mi red local (de la máquina anfitriona, sobre la que se está virtualizando), y otro en el exterior, en Internet.
Hasta aquí parecía resuelto:
pablo@lynen:~$ host google.es
google.es has address 66.249.93.104
[...]
Sin embargo al hacer
ping google.es
(p.ej.) no era capaz de resolver el nombre.
En Linux con añadir un
/etc/resolv.conf
correcto suele bastar, pero eso es porque la configuración por defecto de la mayoría de las distribuciones dice que al resolver un nombre de dominio, primero se debe mirar en el fichero
/etc/hosts
y luego ya resolver el nombre de dominio si ahí no se encuentra.
Esa configuración viene definida en
/etc/nsswitch.conf
(tanto en Linux como en OpenSolaris):
pablo@lynen:~$ cat /etc/nsswitch.conf
# CDDL HEADER START
[...]
group: files
hosts: files dns mdns
ipnodes: files dns mdns
networks: files
[...]
En esas dos líneas (
hosts
e
ipnodes
) originalmente sólo ponía “
hosts: files
” e “
ipnodes: files
“, por lo que tan sólo se buscaban en
/etc/hosts
las direcciones a resolver. Ahora se buscan primero ahí, y si no se encuentran se tratan de resolver por DNS, y si no lo consigue trata por último de usar mDNS.
No fue necesario en mi caso reiniciar ningún demonio ni nada más que modficiar esos dos ficheros. Con esos cambios pude navegar sin problemas desde Firefox y actualizar el IPS (
pkg refresh
).
September 19, 2008 at 21:18 · Filed under Revistas divulgación
Stacktrace es una revista italiana de informática, escrita desde la perspectiva más práctica y aplicada.
Hasta donde he visto es completamente gratuita y sólo se distribuye por Internet, de hecho el número de artículos es variable según el mes así que claramente no es una publicación formal.
Los artículos son muy variados y cubren muchas áreas de la informática, aunque no todas. Los temas que se tratan dejan el nivel de la revista en buen lugar –para mi gusto–, y más o menos se pueden entender bien los artículos a pesar de no saber italiano.
Toca bastante el Python, y la programación funcional más de lo que se suele ver en otras publicaciones.
No sólo contiene artículos estáticos, sino que cubre también algo de actualidad, comentando sucesos que se van dando en la industria y el mundo de la informática.
Y además del propio contenido técnico de la revista, creo que también sirve para tomarle el pulso a la scene italiana (de informática en general, grupos de usuarios, etc.).
En alguna conversación con algún erasmus italiano que ha ido a clase conmigo este año he podido comprobar que tienen un buen respaldo a nivel social, con gran número de eventos (Linux Day, Italian Agile Day, etc.) y bastante movimiento de base (que no sé si es mayor que el español, o simplemente diferente).
September 19, 2008 at 15:05 · Filed under Python, Sistemas de ficheros
Ya me picaba el gusanillo tras tanto examen y tanta gaita, así que esta vez ha tocado hacer una función que recorra los ficheros del directorio actual y de todos sus subdirectorios. Se basa en una función que mediante las funciones
os.stat()
para saber el tipo de fichero,
os.listdir()
para sacar el contenido de un directorio y una cola para guardar los ficheros que quedan por analizar.
Importamos las funciones necesarias de sus respectivos módulos:
from os import stat,listdir
from os.path import join
from stat import S_ISDIR,S_ISCHR,S_ISBLK,S_ISREG,S_ISFIFO,S_ISLNK,S_ISSOCK
Todas las
stat.S_ISxx()
se pueden sacar también de
os.stat.isXX()
, según la documentación del módulo stat –donde se puede encontrar una función similar a la implementada, pero con recursividad en vez de usar una cola.
Ahora la función (siento que la identación esté hecha con ___, pero es que el editor de WordPress no está hecho para meter código):
def walktree(origen):
____ficheros=[(None,origen),]
cargar la ruta inicial. El primer elemento de la tupla no sería necesario, no habría por qué usar una tupla. La estoy usando para un uso posterior que le quiero dar a esta función de recorrido de directorios.
____while ficheros:
mientras queden ficheros
____ ____ (parent,file)=ficheros.pop()
sacamos el siguiente fichero de la lista (ignorad
parent
)
____ ____print “Fichero: %s”%(file)
____ ____tipo=stat(file).st_mode
obtenemos mediante
os.stat()
el modo del fichero (lo que incluye los permisos, pero también el tipo). Según de qué tipo sea imprimiremos una cosa u otra en pantalla:
____ ____ if S_ISDIR(tipo):
Es un directorio: además de decir que es un directorio…
____ ____ ____ print “Directory”
____ ____ ____ for nuevo_fichero in listdir(file):
…debemos leer sus contenidos con
os.listdir()
e incluirlos en la lista ficheros. Nótese que
listdir()
no devuelve ni el directorio
‘.’
, ni
‘..’
, lo que nos evita ciclos que harían que el algoritmo no acabara nunca hasta agotar la memoria
____ ____ ____ ____ ficheros.insert(0,
____ ____ ____ ____ ____ (None,join(file,nuevo_fichero)))
____ ____ elif S_ISCHR(tipo):
y vamos comprobando otros tipos
____ ____ ____ print “Char. device”
____ ____ elif S_ISBLK(tipo):
____ ____ ____ print “Block device”
____ ____ elif S_ISREG(tipo):
____ ____ ____ print “Regular file”
____ ____ elif S_ISFIFO(tipo):
____ ____ ____ print “Named pipe”
____ ____ elif S_ISLNK(tipo):
____ ____ ____ print “Soft link”
____ ____ elif S_ISSOCK(tipo):
____ ____ ____ print “Socket”
if __name__==’__main__’:
____ walktree(‘.’)