Como adoptar un pingüino

BLOG de AZULcasiNEGRO, donde se cuentan básicamente las peripecias durante la migración a Kubuntu/Linux

Aviso Cookies

Categories

Contador

Eres el visitante

Hace poco que probé VirtualBox 2.0, y la verdad me gustó mucho. Trabajo con VMWare Server y tambien me gusta, pero eso de tener que parchearlo para que vaya, y repetir el proceso a cada cambio de kernel, por no decir que no es soft libre, me esta hartando un poco.


Una de los problemas de VirtualBox en un host Ubuntu es el modo bridge, que a diferencia de VMWare, lo tienes que configurar en el sistema a mano.


Un poco de conceptos
¿ Que es un bridge ? Un puente o bridge es un dispositivo de interconexión de redes de ordenadores, haciendo el pasaje de datos de una red hacia otra, con base en la dirección física de destino de cada paquete.
¿ Para que nos sirve con una máquina virtual ? Nos sirve para que la conexión de red de la mv se comporte como si fuera totalmente autónoma, pudiendo configurar cualquier IP y usar cualquier puerto. Para eso necesitaremos hacer un puente(bridge) con una conexión física existente.

Segundo, instalaremos los paquetes necesarios

sudo apt-get install vtun bridge-utils uml-utilities

Tenemos 2 maneras de configurarlo:
1. Creando el bridge en el arranque del ordenador.
2. Activando y desactivando el bridge con scripts.

Crear el bridge en el arranque


Es la manera más cómoda si no nos importan los inconvenientes.
Hay que editar el archivo /etc/network/interfaces

Para IP dinámica
auto lo
iface lo inet loopback

iface eth0 inet dhcp

# Bridge
auto br0
iface br0 inet dhcp
bridge_ports eth0


Para IP fija
auto lo
iface lo inet loopback

iface eth0 inet static

# Bridge
auto br0
iface br0 inet static
address 192.168.0.2 #ip de nuestro ordenador
netmask 255.255.255.0
gateway 192.168.0.1 #ip del router o servidor enrutador
bridge_ports eth0

Sólo nos faltará enlazar el bridge con el VirtualBox de esta manera
sudo VBoxAddIF vbox0 usuario br0

En usuario pondremos el usuario del host que vaya a ejecutar la máquina virtual.

Hay que tener en cuenta alguna cosillas. Con esta configuración, realmente la configuración de br0 es la que estará activa, y no la de eth0. Por ejemplo, si quereis aplicar alguna regla como la de limitación de la conectividad a un usuario debeis hacerlo sobre br0.
Otra limitación del modo bridge es que no podemos usar WOL (wake-on-lan). Es decir, no podremos arrancar remotamente nuestro ordenador a través de la red. Para esto mejor usaremos los scripts.

Crear el bridge con scripts


Tenemos otra manera de crear el bridge sin tener que tocar nuestra actual configuración de red, y es creandolo y destruyendolo con un script.
Pondré por ahora sólo la configuración para IP fija, pero para IP dinámica es aún más sencillo.
Creamos el archivo para crear el bridge como bridge-up.sh, y añadimos:
#!/bin/sh

# creamos el bridge
brctl addbr br0
brctl addif br0 eth0

# configuramos el bridge
ifconfig br0 192.168.0.2 netmask 255.255.255.0 #ip de nuestro ordenador
route add default gw 192.168.0.1 dev br0 #ip del router o servidor enrutador

# iniciamos/reiniciamos las conexiones implicadas
ifconfig eth0 down
ifconfig eth0 up
ifconfig br0 up

# enlazamos con VirtualBox
VBoxAddIF vbox0 usuario br0

Le damos permisos de ejecución.
sudo chmod 770 bridge-up.sh

Y lo ejecutamos como superusuario.
Esto se puede hacer via SSH, pero debeis poner la misma ip en el bridge que en eth0 para que no se corte la conexión. Igualmente, cuando ejecuteis el script tardará unos segundos en quedar la consola operativa. No os asusteis. Es normal. Si hemos iniciado la sesión SSH con modo gráfico (-X) podremos ejecutar nuestra máquinas virtuales normalmente. Sino, podemos acceder a ellas mediante RDP arrancandolas como VBoxHeadless y usando un cliente RDP.

Despues de apagar la máquina virtual, tendremos que ejecutar un script para dejarlo todo como estaba. Lo llamaremos bridge-down.sh
#!/bin/sh

# desenlazamos con VirtualBox
VBoxDeleteIF vbox0

# eliminamos la puerta de enlace del bridge
route del default gw 192.168.0.1 dev br0

# desconectamos el bridge y lo eliminamos
ifconfig br0 down
brctl delif br0 eth0
brctl delbr br0


#deberia ser suficiente con esto
# ifconfig eth0 up
#pero como tambien tenemos instalado el vmware tendremos
#que reiniciar todas las conexiones, al menos a mi me pasa
ifdown -a --force
ifup -a --force

Le damos permisos de ejecución.
sudo chmod 770 bridge-down.sh

Y lo ejecutamos como superusuario.

Conclusión


Podemos enlazar nuestras máquinas virtuales de VirtualBox en modo bridge de varias maneras, cosa que nos permitirá tener nuestro guest como si fuera un ordenador más de nuestra red.
Os recomiendo el primer método para máquinas virtuales que tengan que arrancar solas una vez iniciado el pc. El segundo es mejor para estaciones de trabajo en que habramos las mv en un momento dado.

Actualización (31/12/2008)


A partir de la versión 2.1 esto ya no es necesario. Se puede crear el bridge automáticamente y de manera transparente en la misma ventana de configuración de la máquina virtual. Así la versión de Linux se iguala a la versión Windows en este aspecto. Esperemos que a partir de ahora las mejoras vayan a la par.

Primero de todo. Lo siento. Actualmente no tengo tiempo de preparar artículos con la profundidad que me gustaría, así que a partir de ahora, os iré poniendo trucos que, al menos a mí, resultan útiles. Serán pequeñas soluciones a pequeños problemas que muchas veces nos bloquean un proyecto de más embergadura.
Hoy le toca al ocio.

Problema
Tenemos una repetición guardada de un nivel de juego de Wesnoth. Queremos jugar a partir de turno determinado de ese nivel que ya hemos pasado. ¿ Porqué ? Pues porque en el nivel siguiente necesitamos algo que perdimos o no cogimos en el nivel de la repetición.

Solución (Versión para Linux)

En realidad, la solución es mucho más simple de lo que parece.

1. Cargamos la repetición, y le vamos dando hasta llegar al turno que necesitamos revivir. Cuendo lleguemos, le damos a guardar turno. Lo que conseguimos es tener guardado un nivel en un turno de la repetición. Esto es casi lo que queríamos. Si recuperamos ese turno, no nos deja jugar, claro, porque es de una repetición.

2. Descomprimimos la partida guardada. Salta al paso siguiente si no guardas las partidas comprimidas.
Nos metemos en la carpeta donde se encuentran las partidas guardadas.
$ cd ~/.wesnoth/saves/
Descomprimimos la partida.
$ gunzip -dv TRoW-El_dragón_Turno_repetición_17.gz
Le ponemos un nombre decente.
$ mv TRoW-El_dragón_Turno_repetición_17 TRoW-El_dragón_Turno_17

3. Modificamos el archivo para poder jugar desde ese turno. El editor es lo de menos
$ nano TRoW-El_dragón_Turno_17
Aquí tenemos que modificar la linea que pone
completion="victory"
por
completion="running"
y guardamos. La linea está al principio del archivo.

4. Comprimimos la partida guardada. Salta al paso siguiente si no guardas las partidas comprimidas.
$ gzip TRoW-El_dragón_Turno_17

5. Cargamos normalmente la partida. Por arte de magia nos dejará seguir jugando.

Hasta pronto !!!

¿ Y que pasa cuando Windows "enferma" ? ¿ Que debo hacer ? ¿ Como lo curo ?
Lo primero apagar el ordenador, si es que hemos logrado arrancarlo. La idea es no arrancar un sistema infectado, y menos conectado a una red. Así que nada de : me bajo un antivirus de internet, lo instalo y arreglado. Precisamente eso es lo que no hay que hacer porque no tendremos la seguridad de que el mismo virus no infecte el antivirus y empeorar el problema.

Entonces, que hago ? Lo que necesitamos es un arranque en CD (cdlive) que contenga un antivirus actualizado que podamos usar en el disco duro. Si tubiera que resolver esto antes de conocer Linux lo haría con BartPE , el cual permite arrancar un Windows XP "básico" y correr pequeñas utilidades, como gestores de archivos, navegadores, antivirus, etc. Pero hoy ya no sería esa mi respuesta, porque BartPE parece un proyecto abandonado, y que en muchas utilidades que se son interesantes de usar requieren licencia, por ejemplo norton ghost, mcafee virusscan, etc.

Y la respuesta sería, tachaaaaaaaaaaan !!! LINUX (como siempre). En concreto mi querido SystemRescueCd, que como ya hemos hablado es un sistema Gnu/linux arrancable desde cdrom que sirve para reparar tu sistema y recuperar tus datos despues de un fallo, ademas de otras utilidades. Pues en este caso usaremos el antivirus que lleva incorporado, que es ClamAV. Pues allá vamos :

Material necesario

  • Un cd-rom con SystemRescueCd. Como nuestro sistema está infectado, nos lo descargamos en casa del vecino.
  • Para tener actualizado el antivirus, internet y/o una memoria USB
  • Preparar el entorno

    Arrancamos con el cd, hasta la consola linux. Acordaros de poner 13 a mitad del arranque para configurar el teclado en Español.

    Creamos un par de directorios temporales
    mkdir /virdefs /mnt/infectado
    Para que un antivirus sirva de algo debemos tenerlo actualizado.

    Aquí tenemos 2 opciones :
    1. Actualizarnos cada vez conectándonos a internet mediante
    freshclam --datadir /virdefs
    2. Grabar los 2 archivos que necesitamos desde la página de ClamAV y los copiamos en una memoria USB, para pasarlos luego a la carpeta /virdefs. Esto es útil si queremos evitar bajarnos de internet las 20 MB (aprox.) que ocupan la definición de virus.

    Para ver las particiones que tenemos y como la identifica el sistema ponemos
    fdisk -l
    En mi caso, el disco duro tiene 3 particiones ntfs en /dev/sda2, /dev/sda5 y /dev/sda6, y la de la memoria USB directamente como /dev/sdb.


    Siguiendo con el segundo plan, descargo los archivos main.cvd y daily.cvd, y los copio en la carpeta /virdefs de mi memoria USB. Lo más sencillo es descargarlos desde otro ordenador, pero también podemos hacerlo directamente en la carpeta que queramos con
    wget http://db.local.clamav.net/main.cvd
    wget http://db.local.clamav.net/daily.cvd
    Recordad que para activar la red desde SystemRescueCD es con
    net-setup eth0
    Montamos la memoria USB
    mount /dev/sdb /mnt/custom
    Copiamos las definiciones
    cp /mnt/custom/virdefs/* /virdefs
    Montamos la partición infectada, pero ojo!, con escritura para ntfs.
    ntfs-3g /dev/sda6 /mnt/infectado

    Antivirus, al ataquerrrrrr !!!

    Yo uso el antivirus así
    clamscan -d /virdefs -r -i --remove -l /virdefs/clamav.log /mnt/infectado
    Clamscan tiene un montón parámetros opcionales.
    Os explico los que me parecen más interesantes




    -d Donde tenemos los archivos de definición de los virus
    -rEscanea recursivamente (las subcarpetas pa los de Windows)
    -iSolo muestra los archivos infectados. Osea que se puede tirar un buen rato sin sacar nada por pantalla.
    --removeElimina el archivo infectado. Hay que tener cuidado con esta opción porque nos puede borrar documentos importantes. Otra opción puede ser usar --move
    --move=Mueve los archivos infectados.
    --l Guarda el informe del escaneo

    Para ver más opciones mirad el manual
    man clamscan
    Para desmontar haremos
    umount /mnt/infectado

    RECOMENDACIONES NO OPCIONALES :P

    Debeis escanear todas las unidades del disco duro a las que vuestro Windows tiene acceso.
    Lo primero que debeis hacer al arrancar Windows es instalaros un antivirus y actualizarlo. Arrancar a Modo prueba de fallos (opción que sale al arrancar Windows con F8) y pasar el antivirus a todas las particiones.

    Conclusión

    En Linux no solo no hay estos problemas, sino que a demás nos ayuda con los problemas de seguridad Windows.

    Moraleja, usa Linux.

    Enlace relacionado http://www.sysresccd.org/Sysresccd-manual-es_Software_del_Sistema

    Hoy he migrado el blog aquí.
    Los motivos son básicamente técnicos : el intento de crear blogs a partir de dokuwiki consumía demasiado tiempo, tiempo del que actualmente no dispongo.
    Así que una vez más he depositado mi confianza en Google, que por ahora me a dado muchísimas más alegrias que tristezas.

    ¿ Por cierto que os parece la nueva estética ?

    Esta semana estoy actualizando diferentes máquinas de 7.10 a 8.04. Ya se que es un poco tarde, pero no me gustaba la idea de actualizar a un usuario normal a un Firefox beta.

    Al hacerlo me he encontrado con un par de problemas con firestarter. Y como no me voy a acordar, y alguien más tambien le puede servir, pues ala, soluciones al canto.

    No encuentra conexión

    Esto de debe a que el sistema por defecto es en ingles, y nosotros, pobres mortales, en español.
    Para solucionarlo :
    1. Editar el script

    sudo kate /etc/firestarter/firestarter.sh

    2. Cambiar Mas por Más en esta linea (a principio de archivo)

    MASK=`/sbin/ifconfig $IF | grep Mas | cut -d : -f 4`

    así

    MASK=`/sbin/ifconfig $IF | grep Más | cut -d : -f 4`

    3. Cambiar Mas por Más en esta otra linea (a principio de archivo)

    INMASK=`/sbin/ifconfig $INIF | grep Mas | cut -d : -f 4`

    así

    INMASK=`/sbin/ifconfig $INIF | grep Más | cut -d : -f 4`

    4. Guardar e iniciar el servicio

    sudo /etc/init.d/firestarter start

    ATENCION La solución antes citada, aunque funciona cuando arrancas el firestarter manualmente o al empezar la sesión, no funciona si la arrancamos como servicio porque los sercivios se arrancan en inglés. Entonces, es una mala solución configurar el script para español. Lo mejor es configurar para que funcione en inglés tal y como explican en el Launchpad. Entonces lo que hay que hacer es añadir esto a principio del archivo /etc/firestarter/firestarter.sh para que ejecute el script en el lenguaje base (inglés) :

    # Load base lenguage
    export LC_ALL=C

    En realidad sería más correcto decir cortar toda comunicación a un usuario.
    El motivo de esto es simple : un niño de 5 añitos no esta preparado a tener acceso a internet, incluidos chats y páginas de todo tipo.

    Para realizar el bloqueo editamos el archivo /etc/network/interfaces y añadimos junto debajo de la conexión que queramos esta linea :

    pre-up iptables -A OUTPUT -p tcp -m owner --uid-owner usuario -j DROP

    Hay que sustituir usuario por el nombre de usuario que queramos y reiniciar el servicio de red con /etc/init.d/networking restart
    El resultado final podría ser este

    auto eth0
    iface eth0 inet dhcp
    pre-up iptables -A OUTPUT -p tcp -m owner --uid-owner joan -j DROP

    Os recuerdo que debeis quitarle derechos de administrador al usuario que queremos limitar. Sino él mismo podrá desbloquear la conexión.

    ACTUALIZACION Poco después de añadir este post me surgió un nuevo problema.
    ¿ Y no que queremos que tenga acceso a internet pero si a la red interna ? Es que los juegos en red son los más guais, eso me lo teneis q reconocer.
    Bueno, manos a la obra. Sería bloquear todo lo q este fuera de nuestro rango, en este caso 192.168.0.0/24, y quedaría así

    pre-up iptables -A OUTPUT -p tcp -d ! 192.168.0.0/24 -m owner --uid-owner joan -j DROP

    Con -d le marcamos el destino a bloquear, y con ! que no sea. Por tanto

    -d ! 192.168.0.0/24

    Y a jugar !!!

    Visto el interés de algunos por saber más del tema, os cuento la jugada.

    Introducción

    Como ya sabreis, se puede hacer correr código c# nativamente con mono, pero sólo ejecuta c#. Es decir, si el código que tenemos llama en algún momento a algo que no sea .NET 100%, mono da un error de ejecución. :-(

    Problema

    ¿ Que problema tenemos el trabajo ? usamos el paquete de controles que, aunque se anunciaban como 100% .NET, en realidad hacen llamadas a la API de windows. :-?
    Así que sobre Linux no funcionarán.

    Solución

    Si Mahoma no va a la montaña, la montaña va a Mahoma.
    En vez de intentar ejecutar de forma nativa con mono, lo ejecutamos como windows pero sobre linux con el emulador/traductor Wine.
    Hasta hace poco esto no era posible, pero ahora la gente de Wine han conseguido hacer correr Framework 2.0.

    Vamos a ver como. Para instalar seguimos los siguientes pasos :

    1. Instalamos wine v1.0. La versión de repositorio de Ubuntu/Kubuntu 8.04 ya nos sirve. 2. Descargamos la última versión de winetricks

    wget http://www.kegel.com/wine/winetricks

    3. Instalamos MS Installer 2.0

    sh winetricks msi2

    4. Instalamos Framework 2.0 ( OJO, la versión SP1 no funciona )

    sh winetricks win2k
    sh winetricks corefonts dotnet20
    sh winetricks winxp

    5. Copiamos los archivos necesarios a Linux. Las dll, exe y el resto de archivos (configuración, imagenes, etc) si los hay.
    6. Nos vamos a la carpeta y ejecutamos

    wine nuestra_aplicación.exe 

    Sencillo, no ?

    Conclusión

    Si nuestra única limitación era la de llamadas a la API de Windows desde nuestro programa realizado con Framework 2.0, ya podemos correr nuestras aplicaciones sobre linux+wine sin problemas.
    No hacen falta máquinas virtuales ni sesiones remotas. Sólo Linux. (El tema de las licencias es otra historia).

    Para los que usais bases de datos, os recomiendo usar alguna que funcione bajo linux y tenga controlador para .NET 2.0.
    En concreto yo uso Firebird 2.1 para Linux, y no tengo ningún problema.

    Espero que este hallazgo os de tantas alegrías como a mí. (O más :-D )

    Justo estaba mirando esta mañana los blogs amigos, cuando me encuentro con este comentario. He pensado : esto no me lo pierdo.
    Pero ups … Al cargar la página ha salido la típica ficha de juego de construcción gris indicando que no tenía el plugin. Como mucho sabeis, uso kubuntu y para navegar firefox (actualmente 3.0). Pues nada, ajo y agua. O ... buscar una solución.

    Y, jejeje, claro que la hay. Se trata de instalar el paquete mozilla-mplayer del repositorio multiverse. Nos instalará plugins para DivX, RealPlayer, QuickTime y Windows Media, y algunos más que ya nos reproducía mplayer.
    Sólo nos quedará configurarlo. Para ello haremos click con la derecha encima del plugin. (A mí me sale sólo un cuadrado en gris la primera vez que cargo la página). Le damos a configurar, y asignamos :

    • salida de video : gl
    • salida de audio : alsa

    Si no se pone ha reproducir automáticamente (esperando a que llene cache, claro), podemos darle con el botón de la derecha … y a disfrutar.

    Hoy, configurando clientes para usar con apt-cacher, me he dado cuenta que a veces nos complicamos demasiado la vida.
    En el trabajo, cuando viene una máquina configurada con este sistema, o simplemente instalando una nueva, nos toca estar retocando las lineas que apuntan al servicio apt-cacher cuando en realidad, si lo hacemos con las opciones que nos da apt, podemos hacerlo de una manera más sencilla.
    El método está explicado en la wiki como método 2.
    Consiste simplemente en no tocar nada de los archivos que indican los repositorios, e indicar a apt que use un proxy.
    Así de simple. :-D

    Mi primer artículo sobre programación.
    Es algo relativamente simple, pero que hay que hacerlo. El código propuesto implementa los colores de la paleta del proyecto Tango.
    Esto es muy útil si usais iconos Tango, o del mismo estilo, y necesitáis colorear zonas con sólidos o degradados desde código.

    Código


    using System;
    using System.Drawing;

    namespace CC.Drawing
    {
    ///
    /// Paleta de colores propuestos en http://tango.freedesktop.org/Tango_Desktop_Project
    ///
    public struct Tango
    {
    public static Color FromKnown(KnownTango color)
    {
    switch (color)
    {
    case KnownTango.Butter1: return Butter1;
    case KnownTango.Butter2: return Butter2;
    case KnownTango.Butter3: return Butter3;
    case KnownTango.Chameleon1: return Chameleon1;
    case KnownTango.Chameleon2: return Chameleon2;
    case KnownTango.Chameleon3: return Chameleon3;
    case KnownTango.Orange1: return Orange1;
    case KnownTango.Orange2: return Orange2;
    case KnownTango.Orange3: return Orange3;
    case KnownTango.SkyBlue1: return SkyBlue1;
    case KnownTango.SkyBlue2: return SkyBlue2;
    case KnownTango.SkyBlue3: return SkyBlue3;
    case KnownTango.Plum1: return Plum1;
    case KnownTango.Plum2: return Plum2;
    case KnownTango.Plum3: return Plum3;
    case KnownTango.Chocolate1: return Chocolate1;
    case KnownTango.Chocolate2: return Chocolate2;
    case KnownTango.Chocolate3: return Chocolate3;
    case KnownTango.ScarletRed1: return ScarletRed1;
    case KnownTango.ScarletRed2: return ScarletRed2;
    case KnownTango.ScarletRed3: return ScarletRed3;
    case KnownTango.Aluminium1: return Aluminium1;
    case KnownTango.Aluminium2: return Aluminium2;
    case KnownTango.Aluminium3: return Aluminium3;
    case KnownTango.Aluminium4: return Aluminium4;
    case KnownTango.Aluminium5: return Aluminium5;
    case KnownTango.Aluminium6: return Aluminium6;
    default: return Color.Empty;
    }
    }

    public static Color Butter1 { get { return Color.FromArgb(252, 233, 79); } }
    public static Color Butter2 { get { return Color.FromArgb(237, 212, 0); } }
    public static Color Butter3 { get { return Color.FromArgb(196, 160, 0); } }
    public static Color Chameleon1 { get { return Color.FromArgb(138, 226, 52); } }
    public static Color Chameleon2 { get { return Color.FromArgb(115, 210, 22); } }
    public static Color Chameleon3 { get { return Color.FromArgb(78, 154, 6); } }
    public static Color Orange1 { get { return Color.FromArgb(252, 175, 62); } }
    public static Color Orange2 { get { return Color.FromArgb(245, 121, 0); } }
    public static Color Orange3 { get { return Color.FromArgb(206, 92, 0); } }
    public static Color SkyBlue1 { get { return Color.FromArgb(114, 159, 207); } }
    public static Color SkyBlue2 { get { return Color.FromArgb(52, 101, 164); } }
    public static Color SkyBlue3 { get { return Color.FromArgb(32, 74, 135 ); } }
    public static Color Plum1 { get { return Color.FromArgb(173, 127, 168); } }
    public static Color Plum2 { get { return Color.FromArgb(117, 80, 123); } }
    public static Color Plum3 { get { return Color.FromArgb(92, 53, 102); } }
    public static Color Chocolate1 { get { return Color.FromArgb(233, 185, 110); } }
    public static Color Chocolate2 { get { return Color.FromArgb(193, 125, 17); } }
    public static Color Chocolate3 { get { return Color.FromArgb(143, 89, 2); } }
    public static Color ScarletRed1 { get { return Color.FromArgb(239, 41, 41); } }
    public static Color ScarletRed2 { get { return Color.FromArgb(204, 0, 0); } }
    public static Color ScarletRed3 { get { return Color.FromArgb(164, 0, 0); } }
    public static Color Aluminium1 { get { return Color.FromArgb(238, 238, 236); } }
    public static Color Aluminium2 { get { return Color.FromArgb(211, 215, 207); } }
    public static Color Aluminium3 { get { return Color.FromArgb(186, 189, 182); } }
    public static Color Aluminium4 { get { return Color.FromArgb(136, 138, 133); } }
    public static Color Aluminium5 { get { return Color.FromArgb(85, 87, 83); } }
    public static Color Aluminium6 { get { return Color.FromArgb(46, 52, 54); } }
    }

    public enum KnownTango
    {
    Butter1, Butter2, Butter3,
    Chameleon1, Chameleon2, Chameleon3,
    Orange1, Orange2, Orange3,
    SkyBlue1, SkyBlue2, SkyBlue3,
    Plum1, Plum2, Plum3,
    Chocolate1, Chocolate2, Chocolate3,
    ScarletRed1, ScarletRed2, ScarletRed3,
    Aluminium1, Aluminium2, Aluminium3, Aluminium4, Aluminium5, Aluminium6
    }
    }

    Buscando información sobre otro tema, he encontrado algo muy curioso. El alfabeto fonético aeronáutico para deletrear. Yo uso normalmente provincias y paises, pero siempre me quedo pensativo en alguna letra. Como casi siempre, es mejor estandarizar la comunicación para que todos podamos entendernos mejor. Al menos lo intentaré ;-)

    Tabla

    Carácter Palabra Pronunciación en inglés Pronunciación en castellano
    A Alfa Alfah Alfa
    B Bravo Bravoh Bravo
    C Charlie Charlee Charli
    D Delta Delltah Delta
    E Echo Eckoh Eco
    F Foxtrot Fokstrot foxtrot
    G Golf Golf Golf
    H Hotel Hohtell Hotel
    I India Indee ah India
    J Juliett Jewli ett Yuliet
    K Kilo Keyloh Kilo
    L Lima Leemah Lima
    M Mike Mike Maik
    N November November no-vem-ber
    O Oscar Osscah Oscar
    P Papa Pahpah Papa
    Q Quebec Kebeck Quebec
    R Romeo Rowmwe-oh Romeo
    S Sierra Seeairah Sierra
    T Tango Tanggo Tango
    U Uniform Yuonee form Yuniform
    V Victor Viktah Victor
    W Whiskey Wisskey Whiskey
    X X-ray Ex-ray Ex-rei
    Y Yankee Yangkey Yanqui
    Z Zulu Zooloo Zulú
    1 One Ooahn Uán
    2 Two Too Tu
    3 Three Three Zri
    4 Four For For
    5 Five Fif Faif
    6 Six Seaks Siks
    7 Seven Seven Seven
    8 Eight Ait Eit
    9 Nine Naih ner Nain
    0 Zero Zeeroh Sirou

    Cuenta atrás

    Nuestros derechos

    Recent Posts

    Recent Comments