Blog de Abelardo Jara Berrocal: Ubuntu, electronica y software libre

Junio 28, 2009

Tutorial para crear nuestro propio servidor OpenVPN

Archivado en: Linux Ubuntu Administracion — Abelardo Jara @ 11:00 am

OpenVPN COMO

Introducción

Este documento describe cómo configurar OpenVPN en un entorno típico Casa-Oficina. Aunque este COMO presenta en profundidad la configuración con ejemplos, se pueden encontrar unos más sencillos en la sección de ejemplos de la página del manual.

Este COMO también está disponible en otros formatos:

Otros artículos y documentación

Hay muchos otros artículos y COMOs sobre cómo configurar OpenVPN en distintos entornos.

Tipos básicos de túneles

Hay dos tipos básicos de túneles que se pueden crear con OpenVPN:

  • Túnel IP — usado para encaminar tráfico IP punto-a-punto sin broadcast. Bastante más eficiente que un puente ethernet y más faciles de configurar. Este COMO cubre esta clase de túneles.
  • Puente ethernet — se pueden usar para encapsular tanto protocolos IP como no-IP. Este tipo de túnel es apropiado para aplicaciones que se comunican utilizando difusión (broadcast), tales como la red de Windows y juegos de área local (LAN). Son bastante más dificiles de configurar. Mini-COMO para puentes ethernet.

Túnel IP COMO

Dado el elevado número de asuntos relacionados para configurar firewalls, VPNs y NAT se tratará de describir la configuración de un sistema completo en lugar de describir únicamente la configuración de la VPN.

En nuestro ejemplo, tanto las redes privadas de Casa como la del Trabajo se unen a Internet por medio de dos puertas de enlace, cada una de las cuales tienen una dirección IP pública. Cada máquina que actua como puerta de enlace tiene dos interfaces de red, una conectada a la red privada y la otra conectada a Internet. Las puertas de enlace dan soporte a los servicios NAT, firewall y VPN para las máquinas de las redes privadas. Tanto la configuración de Casa como la de la Oficina son casi simétricas exceptuando que la Oficina tiene una dirección IP fija mientras que la de Casa tiene una dirección IP dinámica (DHCP).

Los ficheros de configuración de los siguientes ejemplos estan también disponibles en el paquete de OpenVPN.

Parámetros de configuración para la red de Casa y la Oficina

Casa

Oficina

Subred ethernet local (Dirección privada)

10.0.1.0/24 10.0.0.0/24

Extremo del túnel (Dirección privada)

10.1.0.2 10.1.0.1

Puerta de enlace OpenVPN (Dirección pública)

cliente DHCP, no necesita ser especificada 1.2.3.4

Instalando OpenVPN

Si su sistema no dispone de la biblioteca OpenSSL debe descargarla e instalarla.

Si quiere utilizar la compresión sobre el enlace VPN, o desea instalar OpenVPN como un paquete RPM instale la biblioteca LZO.

Si utiliza un Linux 2.2 o anteror descargue el controlador TUN/TAP. Los usuarios de Linux 2.4.7 o superior deberían tener el controlador TUN/TAP ya incluido en su kernel. Usuarios de Linux 2.4.0 -> 2.4.6 deberían leer la advertencia al final del fichero INSTALL.

Descargue ahora la última release de OpenVPN:

http://prdownloads.sourceforge.net/openvpn/openvpn-1.6.0.tar.gz

Instalar desde paquete tar

Descomprima el paquete:

gzip -dc openvpn-1.6.0.tar.gz | tar xvf -

Compilar OpenVPN:

cd openvpn-1.6.0
./configure
make
make install

Si no se descargó la biblioteca LZO, añada –disable-lzo al comando configure. Se pueden habilitar otras opciones como el soporte para pthread (./configure –enable-pthread) para mejorar la latencia durante los intercambios dinámicos de clave SSL/TLS. El comando

./configure --help

muestra todas las opciones de configuración.

Instalación a partir de paquete RPM

Primero construya el fichero RPM. Ésto requiere que las bibliotecas de OpenSSL, pthread y LZO esten instaladas. Normalmente solo la bibliotecta LZO necesita ser descargada e instalada explícitamente; las otras bibliotecas estan presentes en el sistema por defecto en la mayoría de las distribuciones de Linux.

rpmbuild -tb openvpn-1.6.0.tar.gz

El proceso de construción del RPM generará mucha traza de salida. Si la construcción tiene éxito habrá una nota cerca del fichal de la salida, indicando el nombre del fichero RPM binario generado. Instale el paquete RPM binario con el comando:

rpm -Uvh binary-RPM-file

Configuración del controlador TUN/TAP

Pasos de configuración a realizar una única vez

Si esta usando Linux 2.4.7 o superior, es probable que el controlador TUN/TAP este ya incluido en el kernel. Puede confirmarlo con el comando

locate if_tun.h

esto debe mostrar un fichero como /usr/include/linux/if_tun.h.

Para Linux 2.4.7 o superior, si instaló desde paquete tar, teclee el siguiente comando para crear el nodo del dispositivo TUN/TAP (puede saltarse este paso is ha instalado desde RPM, ya que el instalador de RPM lo realiza automáticamente):

mknod /dev/net/tun c 10 200

Si está usando Linux 2.2 debe descargar la versión 1.1 del modulo del kernel TUN/TAP y seguir las instrucciones de instalación.

Pasos de configuración a realizar cada vez que se arranque

En Linux antes de usar OpenVPN, o cualquier otro programa que utilice dispositivos TUN/TAP, debe cargar el modulo del kernel TUN/TAP:

modprobe tun

y habilitar IP forwarding:

echo 1 > /proc/sys/net/ipv4/ip_forward

Configure el Firewall y NAT

Esta sección supone que esta usando Linux 2.4 con un firewall iptables. Se presenta un ejemplo de configuración para el firewall que realiza NAT para las maquinas de la red privada para permitir el acceso a Internet, estratificar las conexiones de salida y soporte OpenVPN:

sample-config-files/firewall.sh

#!/bin/bash

# Un ejemplo de firewall que tenga en cuenta OpenVPN.

# eth0 está conectado a Internet.
# eth1 está conectado a la subred privada.

# Cambie esta subred para que se corresponda con su subred
# ethernet privada.  Casa usará 10.0.1.0/24 y la
# Oficina usará 10.0.0.0/24.
PRIVATE=10.0.0.0/24

# Direccion de loopback
LOOP=127.0.0.1

# Borrar reglas iptables antiguas
# y temporalmente bloquear el tráfico.
iptables -P OUTPUT DROP
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -F

# Establecer las políticas por defecto
iptables -P OUTPUT ACCEPT
iptables -P INPUT DROP
iptables -P FORWARD DROP

# Evitar que los paquetes externos usen la dirección de loopback
iptables -A INPUT -i eth0 -s $LOOP -j DROP
iptables -A FORWARD -i eth0 -s $LOOP -j DROP
iptables -A INPUT -i eth0 -d $LOOP -j DROP
iptables -A FORWARD -i eth0 -d $LOOP -j DROP

# Cualquer cosa que venga de Internet debería tener una dirección de Internet real
iptables -A FORWARD -i eth0 -s 192.168.0.0/16 -j DROP
iptables -A FORWARD -i eth0 -s 172.16.0.0/12 -j DROP
iptables -A FORWARD -i eth0 -s 10.0.0.0/8 -j DROP
iptables -A INPUT -i eth0 -s 192.168.0.0/16 -j DROP
iptables -A INPUT -i eth0 -s 172.16.0.0/12 -j DROP
iptables -A INPUT -i eth0 -s 10.0.0.0/8 -j DROP

# Bloquear paquetes NetBios salientes (si tiene máquinas windows en
# la subred privada).  Ésto no afecta al tráfico NetBios
# que circula por el túnel VPN, pero detendrá a las maquinas
# windows locales de mandar mensajes de broadcast
# a Internet.
iptables -A FORWARD -p tcp --sport 137:139 -o eth0 -j DROP
iptables -A FORWARD -p udp --sport 137:139 -o eth0 -j DROP
iptables -A OUTPUT -p tcp --sport 137:139 -o eth0 -j DROP
iptables -A OUTPUT -p udp --sport 137:139 -o eth0 -j DROP

# Comprobar la validez de la dirección origen de los paquetes salientes a Internet
iptables -A FORWARD -s ! $PRIVATE -i eth1 -j DROP

# Permitir loopback local
iptables -A INPUT -s $LOOP -j ACCEPT
iptables -A INPUT -d $LOOP -j ACCEPT

# Permitir pings entrantes (pueden desabilitarse)
iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT

# Permitir servicios tales como www y ssh (pueden desabilitarse)
iptables -A INPUT -p tcp --dport http -j ACCEPT
iptables -A INPUT -p tcp --dport ssh -j ACCEPT

# Permitir paquetes entrantes a OpenVPN
# Duplicar la línea inferior por cada
# túnel OpenVPN, cambiando --dport n
# para que encaje con el puerto UDP de OpenVPN.
#
# En OpenVPN, el número de puerto se
# control con la opción --port n.
# Si pone esta opción en el fichero de configuración,
# puede eliminar los caracteres iniciales '--'
#
# Si está usando el firewall con estado
# (consulte el OpenVPN COMO),
# entonces comente la línea de abajo.

iptables -A INPUT -p udp --dport 1194 -j ACCEPT

# Permitir paquete del dispositivo TUN/TAP.
# Cuando OpenVPN está ejecutando en modo seguro,
# autenticará los paquetes previos a
# su llegada en el interfaz
# tun o tap.  Por lo tanto, no es
# necesario añadir ningun filtro aqui,
# a menos que quiera restringir el
# tipo de paquete que puedan circular por
# el túnel.

iptables -A INPUT -i tun+ -j ACCEPT
iptables -A FORWARD -i tun+ -j ACCEPT
iptables -A INPUT -i tap+ -j ACCEPT
iptables -A FORWARD -i tap+ -j ACCEPT

# Permitir paquetes de subredes privadas
iptables -A INPUT -i eth1 -j ACCEPT
iptables -A FORWARD -i eth1 -j ACCEPT

# Mantener el estado de las conexiones locales y las subredes privadas
iptables -A OUTPUT -m state --state NEW -o eth0 -j ACCEPT
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -m state --state NEW -o eth0 -j ACCEPT
iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT

# Enmascarar la subred local
iptables -t nat -A POSTROUTING -s $PRIVATE -o eth0 -j MASQUERADE
OpenVPN ofrece opciones adicionales a la configuración del firewall:

  • Si ambos extremos OpenVPN referencian al contrario con la opción explicita –remote, y los firewalls dependiendes del estado tienen soporte para gestionar conexiones UDP (tales como iptables) existentes entre ambos extremos, es posible ejecutar OpenVPN sin ninguna regla explícita de firewall o si ambos extremos crean pings regularmente al otro extremo para mantener la conexion activa. Para hacer esto, simplemente ejecute OpenVPN con la opción –remote peer, y especifique –ping 15 para asegurar el flujo de paquetes en el túnel al menos una vez cada 15 segundos.
  • La opción anterior es menos conveniente si uno de los extremos cambia su dirección IP frecuentemente, tales como DHCP o un extremo que utiliza un enlace telefónico. Por estos motivos, la configuración del firewall del ejemplo anterior permite a los paquetes entrantes al puerto 1194 UDP (puerto por defecto de OpenVPN) desde cualquier dirección IP. Esto debe considerarse seguro en cualquier de los modos seguros de OpenVPN, ya que todos los paquetes procedentes del túnel deben pasar un test de autenticación o serán descartados.
  • Si elige el abrir completamente el puerto UDP de OpenVPN, como en el ejemplo de configuración del firewall anterior, lo mismo le interesa utilizar la opción –tls-auth para realizar una doble autenticación en el canal de control TLS, usando tanto la clave RSA como la contraseña secreta pre-compartida como una segunda línea de defensa contra DoS o ataques activos. Para más información de la opción –tls-auth, consulte la página man de openvpn.

Construcción de los certificados y claves RSA

OpenVPN tienes dos modos considerados seguros, uno basado en SSL/TLS usando certificados y claves RSA, el otro basado en claves estáticas pre-compartidas. Mientras que SSL/TLS + claves RSA es indiscutiblemente la opción más segura, las claves estáticas tienen la ventaja de la simplicidad. Si desea usar claves RSA, continue leyendo. Para claves estáticas, salte hacia delante a la sección constuir claves estáticas pre-compartidas.Se van a contruir certificados y claves RSA utilizando el comando openssl, incluido en la distribución de la biblioteca OpenSSL.

Los certificados RSA son claves públicas que también tienen otros campos seguros insertados en ellos tales como el Nombre Común o la dirección email del propietario del certificado. OpenVPN provee la posibilidad de escribir scripts para probar estos campos antes de la autenticación. Para más información, consulte la opción –tls-verify en la página del manual de openvpn.

En el ejemplo se seguirá la convención de apache de usar la extensión de fichero .crt para denotar ficheros de certificados y la extensión .key para denotar ficheros de clave privada. Las claves privadas deben mantenerse protegidas siempre. Los ficheros con los certificados pueden publicarse libremente o compartirse.

Elija una máquina como por ejemplo la Oficina para que sea la máquina gestora de claves.

Primero edite el fichero /usr/share/ssl/openssl.cnf (este fichero puede estar en un sitio diferente, así que utilice locate openssl.cnf para encontrarlo).

Quizá quiera realizar cambios en el fichero:

  • Haga un directorio que sirva como espacio de trabajo para las claves y cambie dir para que apunte a él.
  • Considere incrementar default_days para que la VPN no deje de funcionar misteriosamente exactamente después de un año.
  • Establezca certificate y private_key para que apunte al certificado maestro de la Autoridad de Certificación y la clave privada que se va a generar ahora. En los ejemplos de abajo, se asume que el certificado de la Autoridad de Certificación se llama my-ca.crt y la clave privada de la Autoridad de Certificación se llama my-ca.key.
  • Observe los ficheros index.txt y serial. Inicialice index.txt para que esté vacio y serial para conter un número de serie inicial, como por ejemplo el 01.
  • Si usted es un paranóico en el tamaño de las claves, incremente default_bits a 2048. OpenVPN no tendrá problemas en manejar una clave RSA de 2048 bits RSA si ha compilador OpenVPN con soporte pthread, para habilitar el procesamiento en segundo plano de claves RSA. Puede usar claves mayores incluso sin soporte pthread, pero observará cierta degradación de la latencia en el túnel durante la negociación de las claves SSL/TLS. Para consultar un buen artículo sobre qué tamaño de clave RSA escoger, consulte el número de abril de 2002 del diario Crypto-Gram de Bruce Schneier.

Después de que openssl.cnf haya sido modificado, cree su Autoridad de Certificación maestra, un par certificado/clave privada:

openssl req -nodes -new -x509 -keyout my-ca.key -out my-ca.crt -days 3650
Esto creará una Autoridad de Certificación maestra, un par certificado/clave privada, válida por 10 años.

Ahora cree un par certificado/clave privada para Casa y otro para la Oficina:

openssl req -nodes -new -keyout office.key -out office.csr
openssl ca -out office.crt -in office.csr
openssl req -nodes -new -keyout home.key -out home.csr
openssl ca -out home.crt -in home.csr
Ahora copie home.crt, home.key y my-ca.crt a Casa a través de un canal seguro, aunque actualmente solo los ficheros .key deben considerarse no-públicos.

Ahora establezca los parámetros Diffie Hellman en la Oficina con el siguiente comando:

openssl dhparam -out dh1024.pem 1024

Incremente el número de bits de 1024 a 2048 si lo incrementó también en openssl.cnf.

Para el paranóico, considere omitir la opción -nodes en los comandos openssl de arriba. Esto producira que cada clave privada se cifre con un password, haciendo las claves seguras incluso si alguien entra en el servidor y roba los ficheros con la clave privada. La parte negativa de esto es que cada vez que ejecute OpenVPN deberá teclear el password. Para más información consulte la opción –askpass en la página man de openvpn.

Si encuentra la gestión manual de claves RSA confusa, OpenVPN también soporta interoperar con cualquier herramienta de gestión de certificados X509 o servicio incluyendo las CAs comerciales tales como Thawte o Verisign. Pruebe el proyecto OpenCA como un ejemplo de qué se está haciendo para la gestión de certificados/claves en el mundo Open Source.

Además, la distribución de OpenVPN contiene un conjunto pequeño de scripts que pueden usarse para simplificar la gestión de claves y certificados RSA.

Nota importante para el uso de Autoridades de Certificación (CAs) comerciales con OpenVPN

Debe notar que el modo de seguridad de OpenVPN en modo SSL/TLS está orientado hacia usuarios que van a generar sus propios certificados raíz y, por lo tanto, su propia CA. En el modo SSL/TLS, OpenVPN autentica el extremo comprobando que el certificado ofrecido está firmado por la CA especificada en la opción –ca. Como en un servidor web con soporte SSL, la seguridad del modo SSL/TLS de OpenVPN reside en la dificultad de falsificar la firma del certificado raíz.

Este mecanismo de autenticación funciona perfectamente si ha generado su propio certificado raíz, pero presenta un problema si desea usar el certificado raíz de una CA comercial, tal como Thawte. Si, por ejemplo, especifica el certificado raíz de Thawte en la opción–ca, cualquier certificado firmado por Thawte podrá ahora autenticarse con el extremo OpenVPN que seguramente no es lo que desea.

Afortunadamente hay una solucion para este problema en la opción–tls-verify. Esta opción permitirá ejecutar un comando para comprobar el contenido del certificado, para afinar la eleccion de qué certificados se permiten y cuales no. Consulte el script verify-cn en el subdirectorio sample-scripts para ver el ejemplo de cómo hacer esto, y además consulte en la página del manual la opción –tls-verify.

Nota importante para un posible ataque “Man-in-the-Middle” si los clientes no verifican el certificado del servidor al que estan conectandose.

Para evitar un posible ataque “Man-in-the-Middle” donde un cliente autorizado intenta conectarse con otro cliente suplantando la identidad del servidor, asegurese de forzar algún tipo de verificación de certificado por parte de los clientes. Actualmente hay cuatro maneras diferentes de realizar esto, mostradas en orden de preferencia:

  • Cree los certificados del servidor con el script build-key-server (consulte la documentación easy-rsa para más información). Esto marcará el certificado como un certificado sólo-servidor estableciendo nsCertType=server. Ahora añada la siguiente línea a la configuración del cliente:
    ns-cert-type server

    Esto bloqueará a los clientes al conectarse a cualquier servidor que no tenga el atributo nsCertType=server en su certificado, incluso si el certificado ha sido firmado por el fichero de la ca que se ha indicado en la configuración de OpenVPN.

  • Use la directiva tls-remote en el cliente para aceptar/rechazar la conexión del servidor basandose en el el Nombre Común del certificado del servidor.
  • Use el script tls-verify o un plugin para aceptar/rechazar la conexión del servidor basandose en un test a medida del certificado X509 del servidor a partir del contenido del asunto.
  • Firme los certificados de servidor con una CA y los certificados de los clientes con otra CA diferente. La configuración de la directiva ca del cliente debe referenciar el fichero de la CA firmante del servidor, mientras que en la configuración del servidor la directiva ca debe referenciar el fichero de la CA firmante del cliente.

Fichero de configuración usando el modo SSL/TLS y certificados/claves RSA

En el ejemplo, se va a usar un fichero de configuración de OpenVPN. OpenVPN permite pasar opciones en la línea de mandatos o en uno o más ficheros de configuración. Las opciones de los ficheros de configuración pueden omitir los caracteres iniciales “–” necesarios para las opciones de la línea de mandatos.

Modifique los siguientes ficheros de configuración:


sample-config-files/tls-office.conf

#
# Fichero de configuración ejemplo de OpenVPN para
# la Oficina usando el modo SSL/TLS y certificados/claves RSA.
#
# '#' o ';' pueden usarse para delimitar comentarios.

# Usar un dispositivo tun dinámico.
# Para Linux 2.2 o SSOO no-Linux,
# lo mismo desea utilizar un número
# explícitamente como por ejemplo "tun1".
# OpenVPN también soporta dispositivos ethernet
# virtuales "tap".
dev tun

# 10.1.0.1 es nuestro extremo local VPN (Oficina).
# 10.1.0.2 es nuestro extremo remoto VPN (Casa).
ifconfig 10.1.0.1 10.1.0.2

# Script que establecerá las rutas
# una cuando la VPN esté activa.
up ./office.up

# En el intercambio de claves SSL/TLS, la Oficina
# asumira el rol de servidor y Casa
# asumirá el rol de cliente.
tls-server

# Parámetros Diffie-Hellman (sólo para tls-server)
dh dh1024.pem

# Fichero de la Autoridad de Certificación (CA)
ca my-ca.crt

# Nuestro certificado/clave pública
cert office.crt

# Nuestra clave privada
key office.key

# OpenVPN utiliza el puerto 1194 UDP por defecto.
# Cada túnel OpenVPN debe usar
# un número de puerto diferente.
# lport o rport pueden usarse
# para denotar diferentes puertos
# para local y remoto.
; port 1194

# Rebajar UID y GID a
# "nobody" después de la inicialización
# para más seguridad.
; user nobody
; group nobody

# Si compila OpenVPN con
# compresión LZO, descomente
# la siguiente línea.
; comp-lzo

# Enviar un ping UDP al extremo remoto una vez
# cada 15 segundos para mantener
# el estado la conexión en el firewall
# activa.  Descomente esto
# si está usando un firewall con
# estado.
; ping 15

# Descomente ésto para una detección más fiable cuando el sistema
# pierde su conexión.  Por ejemplo, conexiones telefónicas o portátiles que
# se desplazan a otros sitios.
; ping 15
; ping-restart 45
; ping-timer-rem
; persist-tun
; persist-key

# Nivel de información.
# 0 -- callado excepto en errores fatales.
# 1 -- casi callado, pero mostrar errores no-fatales de red.
# 3 -- información media, para funcionar normalmente.
# 9 -- mucha información, útil para resolución de problemas
verb 3

sample-config-files/office.up

#!/bin/bash
route add -net 10.0.1.0 netmask 255.255.255.0 gw $5

sample-config-files/tls-home.conf

#
# Fichero de configuración ejemplo de OpenVPN para
# Casa usando el modo SSL/TLS y certificados/claves RSA.
#
# '#' o ';' pueden usarse para delimitar comentarios.

# Usar un dispositivo tun dinámico.
# Para Linux 2.2 o SSOO no-Linux,
# lo mismo desea utilizar un número
# explícitamente como por ejemplo "tun1".
# OpenVPN también soporta dispositivos ethernet
# virtuales "tap".
dev tun

# Nuestro extremo OpenVPN es la puerta de enlace de la oficina.
remote 1.2.3.4

# 10.1.0.2 es nuestro extremo local VPN (Casa).
# 10.1.0.1 es nuestro extremo remoto VPN (Oficina).
ifconfig 10.1.0.2 10.1.0.1

# Script que establecerá las rutas
# una cuando la VPN esté activa.
up ./home.up

# En el intercambio de claves SSL/TLS, la Oficina
# asumira el rol de servidor y Casa
# asumirá el rol de cliente.
tls-client

# Fichero de la Autoridad de Certificación (CA)
ca my-ca.crt

# Nuestro certificado/clave pública
cert home.crt

# Nuestro certificado/clave pública
key home.key

# OpenVPN utiliza el puerto 1194 UDP por defecto.
# Cada túnel OpenVPN debe usar
# un número de puerto diferente.
# lport o rport pueden usarse
# para denotar diferentes puertos
# para local y remoto.
; port 1194

# Rebajar UID y GID a
# "nobody" después de la inicialización
# para más seguridad.
; user nobody
; group nobody

# Si compila OpenVPN con
# compresión LZO, descomente
# la siguiente línea.
; comp-lzo

# Enviar un ping UDP al extremo remoto una vez
# cada 15 segundos para mantener
# el estado la conexión en el firewall
# activa.  Descomente esto
# si está usando un firewall con
# estado.
; ping 15

# Descomente ésto para una detección mas fiable cuando el sistema
# pierde su conexión.  Por ejemplo, conexiones telefónicas o portátiles que
# se desplazan a otros sitios.
; ping 15
; ping-restart 45
; ping-timer-rem
; persist-tun
; persist-key

# Nivel de información.
# 0 -- callado excepto en errores fatales.
# 1 -- casi callado, pero mostrar errores no-fatales de red.
# 3 -- información media, para funcionar normalmente.
# 9 -- mucha información, útil para resolución de problemas
verb 3

sample-config-files/home.up

#!/bin/bash
route add -net 10.0.0.0 netmask 255.255.255.0 gw $5

Construir una clave estática pre-compartida

En contraste a la gestion de claves RSA, el usar una clave estática pre-compartida tiene el beneficio de ser más simple. La parte negativa de usar claves estáticas es que se pierde la noción de perfecta seguridad en el futuro (perfect forward secrecy), significando que, si un atacante roba la clave estática, cualquier cosa que haya sido cifrada con esa clave estará comprometida.

Genere una clave estática con el siguiente comando:

openvpn --genkey --secret static.key

La clave estática está formateada en ascii y tiene un aspecto como éste:

-----BEGIN OpenVPN Static key V1-----
e5e4d6af39289d53
171ecc237a8f996a
97743d146661405e
c724d5913c550a0c
30a48e52dfbeceb6
e2e7bd4a8357df78
4609fe35bbe99c32
bdf974952ade8fb9
71c204aaf4f256ba
eeda7aed4822ff98
fd66da2efa9bf8c5
e70996353e0f96a9
c94c9f9afb17637b
283da25cc99b37bf
6f7e15b38aedc3e8
e6adb40fca5c5463
-----END OpenVPN Static key V1-----

Un fichero de clave estática OpenVPN contiene suficiente entropía como para almacenar tanto una clave cifradora de 512 bits como una clave HMAC de 512 bits para autenticación.

Copie static.key al otro extremo por medio de un medio seguro tal como scp o copiar-pegar en una conexión ssh.

Fichero de configuración usando una clave estática pre-compartida

En el ejemplo, se va a usar un fichero de configuración de OpenVPN. OpenVPN permite pasar opciones en la línea de comandos o en uno o más ficheros de configuración. Las opciones de los ficheros de configuración pueden omitir los caracteres iniciales “–” necesarios para las opciones de la línea de comandos.

Modifique los siguientes ficheros de configuración:


sample-config-files/static-office.conf

#
# Fichero de configuración ejemplo de OpenVPN para
# la Oficina usando una clave estática pre-compartida.
#
# '#' o ';' pueden usarse para delimitar comentarios.

# Usar un dispositivo tun dinámico.
# Para Linux 2.2 o SSOO no-Linux,
# lo mismo desea utilizar un número
# explícitamente como por ejemplo "tun1".
# OpenVPN también soporta dispositivos ethernet
# virtuales "tap".
dev tun

# 10.1.0.1 es nuestro extremo local VPN (Oficina).
# 10.1.0.2 es nuestro extremo remoto VPN (Casa).
ifconfig 10.1.0.1 10.1.0.2

# Script que establecerá las rutas
# una cuando la VPN esté activa.
up ./office.up

# Nuestra clave estática pre-compartida
secret static.key

# OpenVPN utiliza el puerto 1194 UDP por defecto.
# Cada túnel OpenVPN debe usar
# un número de puerto diferente.
# lport o rport pueden usarse
# para denotar diferentes puertos
# para local y remoto.
; port 1194

# Rebajar UID y GID a
# "nobody" después de la inicialización
# para más seguridad.
; user nobody
; group nobody

# Si compila OpenVPN con
# compresión LZO, descomente
# la siguiente línea.
; comp-lzo

# Enviar un ping UDP al extremo remoto una vez
# cada 15 segundos para mantener
# el estado la conexión en el firewall
# activa.  Descomente esto
# si está usando un firewall con
# estado.
; ping 15

# Descomente ésto para una detección mas fiable cuando el sistema
# pierde su conexión.  Por ejemplo, conexiones telefónicas o portátiles que
# se desplazan a otros sitios.
; ping 15
; ping-restart 45
; ping-timer-rem
; persist-tun
; persist-key

# Nivel de información.
# 0 -- callado excepto en errores fatales.
# 1 -- casi callado, pero mostrar errores no-fatales de red.
# 3 -- información media, para funcionar normalmente.
# 9 -- mucha información, útil para resolución de problemas
verb 3

sample-config-files/office.up

#!/bin/bash
route add -net 10.0.1.0 netmask 255.255.255.0 gw $5

sample-config-files/static-home.conf

#
# Fichero de configuración ejemplo de OpenVPN para
# Casa usando una clave estática pre-compartida.
#
# '#' o ';' pueden usarse para delimitar comentarios.

# Usar un dispositivo tun dinámico.
# Para Linux 2.2 o SSOO no-Linux,
# lo mismo desea utilizar un número
# explícitamente como por ejemplo "tun1".
# OpenVPN también soporta dispositivos ethernet
# virtuales "tap".
dev tun

# Nuestro extremo OpenVPN es la puerta de enlace de la oficina.
remote 1.2.3.4

# 10.1.0.2 es nuestro extremo local VPN (Casa).
# 10.1.0.1 es nuestro extremo remoto VPN (Oficina).
ifconfig 10.1.0.2 10.1.0.1

# Script que establecerá las rutas
# una cuando la VPN esté activa.
up ./home.up

# Nuestra clave estática pre-compartida
secret static.key

# OpenVPN utiliza el puerto 1194 UDP por defecto.
# Cada túnel OpenVPN debe usar
# un número de puerto diferente.
# lport o rport pueden usarse
# para denotar diferentes puertos
# para local y remoto.
; port 1194

# Rebajar UID y GID a
# "nobody" después de la inicialización
# para más seguridad.
; user nobody
; group nobody

# Si compila OpenVPN con
# compresión LZO, descomente
# la siguiente línea.
; comp-lzo

# Enviar un ping UDP al extremo remoto una vez
# cada 15 segundos para mantener
# el estado la conexión en el firewall
# activa.  Descomente esto
# si está usando un firewall con
# estado.
; ping 15

# Descomente ésto para una detección mas fiable cuando el sistema
# pierde su conexión.  Por ejemplo, conexiones telefónicas o portátiles que
# se desplazan a otros sitios.
; ping 15
; ping-restart 45
; ping-timer-rem
; persist-tun
; persist-key

# Nivel de información.
# 0 -- callado excepto en errores fatales.
# 1 -- casi callado, pero mostrar errores no-fatales de red.
# 3 -- información media, para funcionar normalmente.
# 9 -- mucha información, útil para resolución de problemas
verb 3

sample-config-files/home.up

#!/bin/bash
route add -net 10.0.0.0 netmask 255.255.255.0 gw $5

Arrancar la VPN en modo SSL/TLS

En Casa, arranque la VPN con el comando:

openvpn --config tls-home.conf

En la Oficina, arranque la VPN con el comando:

openvpn --config tls-office.conf

Arrancar la VPN en modo clave estática

En Casa, arranque la VPN con el comando:

openvpn --config static-home.conf

En la Oficina, arranque la VPN con el comando:

openvpn --config static-office.conf

Pruebe la VPN

En Casa, compruebe la VPN realizando un ping a la Oficina a traves del túnel:

ping 10.1.0.1

En la Oficina, compruebe la VPN realizando un ping a Casa a traves del túnel:

ping 10.1.0.2

Si estas pruebas fallan, puede re-editar los ficheros de configuración y poner el nivel de información a 8, lo cual producirá información de depuración mucho más detallada. También consulte la FAQ para más información y resolución de problemas.

Si estas pruebas tienen éxito, ahora intente realizar un ping a traves del túnel usando máquinas en la red privada que no sean las puerdas de enlace, para probar el rutado de paquetes. Basicamente cualquier máquina en la subred 10.0.1.0/24 debería poder acceder a cualquier máquina en la subred 10.0.0.0/24 y viceversa.

Si eso funciona, ¡ enhorabuena ! Si no, lo mismo desea buscar los archivos de la lista de correo de OpenVPN para ver si alguien más tiene un problema similar. Si no encuentra una solución a su problema ahí considere escribir a la lista openvpn-users.

Proporcionar soporte para DHCP en la VPN

Si recuerda, en nuestro ejemplo de configuración de red, Casa tiene una dirección IP que puede cambiar sin avisar. Si esta usando dhcpcd como su demonio cliente, es facil hacer un script que se ejecute cuando la dirección IP del cliente cambie. Este script se llamará por ejemplo /etc/dhcpc/dhcpcd-eth0.exe.

Basicamente, debe añadir una línea al script que mande una señal SIGUSR1 o SIGHUP al demonio OpenVPN:

killall -HUP openvpn

Cuando OpenVPN reciba esta señal cerrará y reabrirá la conexión de red con su extremo, usando la nueva dirección IP asignada por DHCP.

También puede usar la opción –float si esta conectando con un extremo que puede cambiar su dirección IP debido a una reasignación DHCP.

Es también posible manejar reasignaciones DHCP con la señal SIGUSR1 que es como SIGHUP excepto porque ofrece un control más detallado sobre qué subsistemas OpenVPN se recargan. Una señal SIGUSR1 puede ser también generada internamente basada en –ping y –ping-restart. La opción –persist-tun permite recargar sin cerrar y reabrir el interfaz TUN (que permite simular conectivad a traves del túnel con reasignaciones DHCP). La opción –persist-remote-ip permite preservar la dirección IP remota en reasignaciones DHCP. Esto permite a ambos extremos OpenVPN ser clientes DHCP. La opción –persist-key no vuelve a leer los ficheros con las claves al reiniciar (lo cual permite al demonio OpenVPN ser rearrancado incluso si sus privilegios fueron rebajados con –user o –group).

Para más información sobre como usar OpenVPN en un contexto de direcciones IP dinámicas, consulte la FAQ.

OpenVPN puede también ser usado en casos donde ambos extremos de la conexión son dinámicos.

Arrancar la VPN automáticamente al reiniciar

Primero cree un directorio para almacenar las claves y los ficheros de configuración de OpenVPN como por ejemplo /etc/openvpn.

Decida si desea usar el modo TLS o una clave estática y copie los ficheros apropiados .conf, .up, .key, .pem y .crt a /etc/openvpn.

Proteja sus ficheros .key:

chmod go-rwx /etc/openvpn/*.key

Si está usando iptables en Linux, edite el fichero de configuración del firewall firewall.sh, realizando los cambios apropiados y copielo en /etc/openvpn.

Haga un script de arranque similar a este:


sample-config-files/openvpn-startup.sh

#!/bin/bash

# Ejemplo de script de inicio para OpenVPN
# para Linux.

# directorio de openvpn para los ficheros de configuración
dir=/etc/openvpn

# cargar el firewall
$dir/firewall.sh

# cargar el modulo del kernel TUN/TAP
modprobe tun

# habilitar IP forwarding
echo 1 > /proc/sys/net/ipv4/ip_forward

# Invocar openvpn para cada túnel VPN
# en modo demonio.  También,
# puede elimiar "--daemon" de
# la línea de comandos y añadir "daemon"
# al fichero de configuración.
#
# Cada túnel debe ejecutarse en un puerto
# UDP distinto.  Use la opción "port"
# para controlar ésto.  Como todas las
# opciones de OpenVPN, puede especificar
# "--port 8000" en la línea de comandos
# o "port 8000" en el fichero de
# configuración.

openvpn --cd $dir --daemon --config vpn1.conf
openvpn --cd $dir --daemon --config vpn2.conf
openvpn --cd $dir --daemon --config vpn2.conf

Y haga un script de finalización similar a este:


sample-config-files/openvpn-shutdown.sh

#!/bin/bash

# parar todos los procesos openvpn

killall -TERM openvpn
Finalmente, añada llamadas a openvpn-startup.sh y openvpn-shutdown.sh en los scripts de arranque y parada del sistema en el directorio /etc/init.d.

Gestionar el arranque y la parada de multiples túneles OpenVPN

Se presenta un script de ejemplo /etc/init.d que creará automáticamente un túnel OpenVPN por cada fichero   .conf que esté en /etc/openvpn.

Este script se instala por defecto si instala OpenVPN desde un paquete RPM.


sample-scripts/openvpn.init

#!/bin/sh
#
# openvpn       Este shell script controla el arranque y el apagado de
#               openvpn en RedHat u otros sistemas basados en chkconfig.
#
# chkconfig: 345 24 76
#
# description: OpenVPN es una aplicación para hacer túneles robusta y flexible que
#              hace uso de las características de cifrado, autenticación y certificados
#              de la biblioteca OpenSSL para asegurar redes de túneles IP utilizando
#              un puerto UDP.
#

# Contribuido al proyecto OpenVPN por
# Douglas Keller <doug@voidstar.dyndns.org>
# 2002.05.15

# Para instalarlo:
#   copie este fichero a /etc/rc.d/init.d/openvpn
#   shell> chkconfig --add openvpn
#   shell> mkdir /etc/openvpn
#   cree los ficheros .conf o .sh in /etc/openvpn (consultar más abajo)

# Para desinstalarlo:
#   ejecute: chkconfig --del openvpn

# Notas del autor:
#
# He creado un script de inicio /etc/init.d y mejorado openvpn.spec para
# registrar automáticamente el script de incicio.  Una vez que el RPM se instale
# puede arrancar o parar OpenVPN con "service openvpn start" y "service
# openvpn stop".
#
# El script de inicio hace lo siguiente:
#
# - Arranca un proceso openvpn por cada fichero .conf que encuentra en
#   /etc/openvpn.
#
# - Si /etc/openvpn/xxx.sh existe para un fichero xxx.conf entonces lo ejecuta
#   antes de arrancar openvpn (útil para hacer openvpn --mktun...).
#
# - Además para arrancar/parar puede hacer:
#
#   service openvpn reload - SIGHUP
#   service openvpn reopen - SIGUSR1
#   service openvpn status - SIGUSR2

# Modificaciones 2003.05.02
#   * Cambiado == a = por compatiblidad con sh (Bishop Clark).
#   * Si condrestart|reload|reopen|status, comprobar que ya estabamos
#     previamente ejecutando (James Yonan).
#   * Añadidas las variables lock, piddir y work (James Yonan).
#   * Si start se ejecuta dos veces, sin un stop intercalado, o
#     si se intenta start cuando el anterior start no se finalizó
#     correctamente, entonces matar cualquier proceso arrancado previamente,
#     antes de comentar la nueva operación de arranque (James Yonan).
#   * Realizar un mejor control de errores al arrancar y devolver
#     correctamente éxito o fallo al programa llamante (James Yonan).

# Ubicación del binario openvpn
openvpn=""
openvpn_locations="/usr/sbin/openvpn /usr/local/sbin/openvpn"
for location in $openvpn_locations
do
  if [ -f "$location" ]
  then
    openvpn=$location
  fi
done

# Fichero de cerrojo (lock)
lock="/var/lock/subsys/openvpn"

# Directorio de PID
piddir="/var/run/openvpn"

# Directorio de trabajo
work=/etc/openvpn

# Añadir funciones de librería.
. /etc/rc.d/init.d/functions

# Añadir configuración de red.
. /etc/sysconfig/network

# Comprobar si la red está activa.
if [ ${NETWORKING} = "no" ]
then
  echo "Networking is down"
  exit 0
fi

# Comprobar si existe el ejecutable
if ! [ -f  $openvpn ]
then
  echo "openvpn binary not found"
  exit 0
fi

# Comprobar cómo nos han llamado.
case "$1" in
  start)
	echo -n $"Starting openvpn: "

	/sbin/modprobe tun >/dev/null 2>&1

	# Desde el punto de vista de la seguridad, creo que tiene
	# sentido eliminar esto, y obligar a los usuarios que lo
	# necesiten a habilitarlo explícitamente en su scripts de arranque o
	# en la configuración del firewall.

	#echo 1 > /proc/sys/net/ipv4/ip_forward

	if [ ! -d  $piddir ]; then
	    mkdir $piddir
	fi

	if [ -f $lock ]; then
	    # no nos pararon correctamente
	    for pidf in `/bin/ls $piddir/*.pid 2>/dev/null`; do
	      if [ -s $pidf ]; then
		kill `cat $pidf` >/dev/null 2>&1
	      fi
	      rm -f $pidf
	    done
	    rm -f $lock
	    sleep 2
	fi

	rm -f $piddir/*.pid
	cd $work

	# Arrancar cada .conf en $work y ejecutar .sh si existe
	errors=0
	successes=0
	for c in `/bin/ls *.conf 2>/dev/null`; do
	    bn=${c%%.conf}
	    if [ -f "$bn.sh" ]; then
		. $bn.sh
	    fi
	    rm -f $piddir/$bn.pid
	    $openvpn --daemon --writepid $piddir/$bn.pid --config $c --cd $work
	    if [ $? = 0 ]; then
		successes=1
	    else
		errors=1
	    fi
	done

	if [ $errors = 1 ]; then
	    failure; echo
	else
	    success; echo
	fi

	if [ $successes = 1 ]; then
	    touch $lock
	fi
	;;
  stop)
	echo -n $"Shutting down openvpn: "
	for pidf in `/bin/ls $piddir/*.pid 2>/dev/null`; do
	  if [ -s $pidf ]; then
	    kill `cat $pidf` >/dev/null 2>&1
	  fi
	  rm -f $pidf
	done
	success; echo
	rm -f $lock
	;;
  restart)
	$0 stop
	sleep 2
	$0 start
	;;
  reload)
	if [ -f $lock ]; then
	    for pidf in `/bin/ls $piddir/*.pid 2>/dev/null`; do
		if [ -s $pidf ]; then
		    kill -HUP `cat $pidf` >/dev/null 2>&1
		fi
	    done
	else
	    echo "openvpn: service not started"
	    exit 1
	fi
	;;
  reopen)
	if [ -f $lock ]; then
	    for pidf in `/bin/ls $piddir/*.pid 2>/dev/null`; do
		if [ -s $pidf ]; then
		    kill -USR1 `cat $pidf` >/dev/null 2>&1
		fi
	    done
	else
	    echo "openvpn: service not started"
	    exit 1
	fi
	;;
  condrestart)
	if [ -f $lock ]; then
	    $0 stop
	    # evitar condiciones de carrera
	    sleep 2
	    $0 start
	fi
	;;
  status)
	if [ -f $lock ]; then
	    for pidf in `/bin/ls $piddir/*.pid 2>/dev/null`; do
		if [ -s $pidf ]; then
		    kill -USR2 `cat $pidf` >/dev/null 2>&1
		fi
	    done
	    echo "Status written to /var/log/messages"
	else
	    echo "openvpn: service not started"
	    exit 1
	fi
        ;;
  *)
	echo "Usage: openvpn {start|stop|restart|condrestart|reload|reopen|status}"
	exit 1
	;;
esac
exit 0

Instanciar un demonio OpenVPN usando inetd o xinetd

El servicio xinetd puede usarse para instanciar automáticamente un demonio OpenVPN al recibir un datagrama inicial de un extremo remoto.

La configuración de xinetd hará que xinetd escuche en el puerto UDP 1194. El primer datagrama de una sesión OpenVPN (usando una clave pre-compartida), instanciará automáticamente un demonio OpenVPN para gestionar la sesión. Nótese que el uso del parámetro de configuración –inactive provocará que el demonio OpenVPN dé por concluidas conexiones después de 10 minutos sin actividad. Después de que el demonio de OpenVPN termine por cualquier razón, el servicio xinetd volverá a escuchar en el puerto, y volverá a instanciar al demonio OpenVPN para manerar nuevas conexiones entrantes. También tenga en cuenta que xinetd instanciará inicialmente el demonio OpenVPN con privilegios de root, pero OpenVPN seguidamente (después de leer el fichero protegido con la clave) rebajará sus privilegios a nobody.

El fichero de claves puede ser generado con el siguiente comando:

openvpn --genkey --secret key

Tenga en cuenta que cada túnel OpenVPN necesita ejecutarse en un número de puerto distinto, y necesita su propio fichero de configuración de xinetd. Esto es porque OpenVPN necesita información específica sobre cada potencial conexión entrante, incluyendo ficheros de claves, dispositivos TUN/TAP, extremos de túnel, e información de enrutado. En este momento del desarrollo de OpenVPN, no es posible manejar ningún tipo de plantilla de conexiones entrantes que permita un fichero de configuración simple para describir un amplio abanico de potenciales conexiones clientes. Como OpenVPN está implementado como un servidor UDP, no puede beneficiarse de la infraestructura disponible para crear hijos en servidores TCP que escuchan en un puerto fijo, creando un nuevo demonio dinámicamente por cada sesión cliente. No obstante, las plantillas para las conexiones entrantes estan en la lista de peticiones y pueden implementarse si hay suficiente interés y soporte por parte del desarrollador y de la comunidad de usuarios.


sample-config-files/xinetd-server-config

# Un fichero de configuración de xinetd para OpenVPN.
#
# Este fichero debe ser renombrado a openvpn o algo apropiado
# y copiado al directorio /etc/xinetd.d
# xinetd puede procesar este fichero reiniciándose
# o mandandole la señal SIGHUP.
#
# Para cada cliente potencial, cree una versión separada
# de este fichero de configuración en un número de puerto único.  También tenga
# en cuenta que el tamaño de la clave y el extremo ifconfig deben ser únicos para
# cada cliente.  Esta configuración asume que el ejecutable OpenVPN
# y la clave están en /root/openvpn.  Cámbielo para ajustarlo
# a su entorno.

service openvpn_1
{
        type            = UNLISTED
        port            = 1194
        socket_type     = dgram
        protocol        = udp
        wait            = yes
        user            = root
        server          = /root/openvpn/openvpn
        server_args     = --inetd --dev tun --ifconfig 10.4.0.2 10.4.0.1 --secret /root/openvpn/key --inactive 600 --user nobody
}

sample-config-files/xinetd-client-config

# Este fichero de configuración de OpenVPN
# es la parte cliente contrario
# de xinetd-server-config

dev tun
ifconfig 10.4.0.1 10.4.0.2
remote my-server
port 1194
user nobody
secret /root/openvpn/key
inactive 600

Copyright (C) 2002-2004 por James Yonan <jim@yonan.net>. Este documento se distribuye bajo la GNU Free Documentation License versión 1.2. Traducido por Ramón Pons Vivanco <rpons@rinu.org>.

Mayo 1, 2009

Optimizar OSS4 en Ubuntu o Fedora

Archivado en: Linux Ubuntu Administracion, Linux Ubuntu Basico — Abelardo Jara @ 4:28 pm

Hace poco me he cambiado de Pulseaudio que solo me causaba dolores de cabeza con el audio a OSS4 que sinceramente funciona de maravilla. Pero tenia un problema de que consumia 6% en Rhythmbox, buscando en Google (fuente infinita del saber humano, encontre esta solucion:)

Use gconf-editor to change system/gstreamer/0.10/default *audiosink to speexresample ! audio/x-raw-float,rate=48000 ! audioconvert ! oss4sink (speexresample uses 6% cpu, same as Pulseaudio (as it uses speex as well)

Listo, ahora funciona con solo 2% de consumo de CPU, y sin los problemas de Pulseaudio sea de paso :)

Abril 19, 2009

Tucan: Administrador de descargas automatico para Rapidshare y Megaupload en Ubuntu

Archivado en: Linux Ubuntu Administracion, Linux Ubuntu Basico — Abelardo Jara @ 12:46 am

Tucan es un administrador de cuentas premiun de cuentas Rapidshare y Megaupload, pero tambien lo es para cuentas gratuitas, tiene la capacidad de:

1. Hacer reconocimiento de caracteres y leer y responder la preguntas de seguridad de Rapidshare y Megaupload

2. Ademas espera el tiempo necesario para comenzar la descarga (incluso nos permite anhadir varios links de rapidshare a la vez, el programa se hara cargo de hacer la descarga por si solo

Para instalarlo tienes que tener los repositorios de Getdeb

Agregar Getdeb en nuestros repositorios de Ubuntu Hardy

Y basta con hacer:

$ sudo apt-get install tucan

tucan

Abril 9, 2009

Simulador Modelsim 6.2 SE NATIVO para Ubuntu Linux 32 y 64

Modelsim 6.2 SE para Linux

Modelsim 6.2 SE para Linux

NOTA IMPORTANTE: Las nuevas versiones de Modelsim para Linux las pueden descargar de aqui (funcionan tambien) esta hasta version 6.5, solo deben registrarse y les dan un link de descarga.

http://www.model.com/downloads/default.asp

Hola amigos, aqui les traigo instruccions para instalar Modelsim 6.2 en tu Ubuntu Linux (gracias a Alvaro que lo ha subido a Mediafire). Modelsim SE (Standard Edition) es la version mas potente de simulador VHDL de Mentor Graphics, esta version es mejor que la XE, o AE (que son especificias para Xilinx y Altera) y que tienen limitaciones en el tamanho de disenho VHDL. Los links de descarga son:

Los archivos necesarios estan aqui:
http://www.mediafire.com/?sharekey=e290b748dd2172eb8c9e7c56ba37815f08d0e788b1bf39ad

O los puedes encontrar en un solo archivo Modelsim_linux6.2.rar (tiene todos los archivos incluidos, pero falta generador de licencia, lo puedes descargar del primer link):
http://www.gigasize.com/get.php?d=7n0qmkj4v4b

Bueno, primero crea una carpeta dentro de tu directorio HOME y descarga los archivos alli, en mi caso era /home/abelardo/tempo

Abre un terminal y entramos a esa carpeta:

$ cd tempo

$ unrar x modelsim_linux6.2.rar (este paso solo necesario si descargaste el RAR en lugar de varios archivos)

$ chmod +x

$ chmod +x modelsim-linux.exe

$ ./modelsim-linux.exe (Esto ejecutara el instalador, sigue los pasos normalmente)

$ tar xzvf modelsim-base.tar.gz

$ tar xzvf modelsim-gcc-4.0.2-rhe21.tar.gz

$ tar xzvf modelsim-docs.tar.gz

Estos pasos descomprimen el Modelsim en un carpeta llamado “modeltech”. Ahora moveremos esta carpeta a /opt (es el mejor directorio para tener aplicaciones que no son parte del sistema operativo. Una recomendacion es tener /opt en una particion separada, de modo que si reinstalamos el SO, mantenemos nuestras aplicaciones en /opt

$ sudo mv modeltech /opt

$ cd ~

$ gedit .bashrc

Busca alguna linea que diga export $PATH y debajo anhades:

export PATH=$PATH:.:/opt/modeltech/bin:/opt/modeltech/linux

export LM_LICENSE_FILE=/home/[TU NOMBRE DE USUARIO]/flexlm/license.dat

Graba y sal. Listo, pero ahora falta el license. Para ello abre una nueva terminal (no cierres la primera) y tipeas:

$ lmhostid

lmhostid – Copyright (c) 1989-2006 Macrovision Europe Ltd. and/or Macrovision Corporation. All Rights Reserved.
The FLEXlm host ID of this machine is “[AQUI TE SALDRA UN CODIGO]

Copia el codigo y regresa al primer terminal y tipeas:

$ wine keygenmodelsimlinux.exe

Te pedira un codigo, introduce el codigo generado antes por lmhostid. Este paso generara un archivo license.dat en el mismo directorio.

Ahora tipea:

$ mkdir ~/flexlm

$ mv license.dat ~/flexlm

Listo, cierra los terminales. Ahora para ejecutar el programa, abre un nuevo terminal y tipea:

$ vsim

Un screenshot del programa:

Ventana que reporta que make finalizó exitosamente

Nota: Modelsim tambien se puede ejecutar en linea de comandos con:

Para compilar nuestros archivos VHDL, nos vamos dentro del directorio donde estan los archivos VHDL de nuestro proyecto y creamos primero una librerìa work donde compilaremos nuestro diseño:

>>vlib work

>>vmap work work

Para ver si trabaja bien, llamamos al compilador del Modelsim VCOM

>>vcom -93 -work work top.vhd (Habra que ir compilando los archivos VHDL uno por uno)

Para simular, necesitas crear archivos VHDL tipo Testbench y compilarlos tambien. Usaremos VSIM, pero en modo consola:

>>vsim -c work.[testbench_top] -do “run -all; exit;”

testbench_top es el nombre de nuestro archivo testbench_top.vhd que debe también haber sido compilado previamente con VCOM y dentro de nuestra librerìa WORK.

Abril 7, 2009

Un truco para aumentar la performance de tarjeta de video Intel en Ubuntu, y un truco para Openoffice 3

Archivado en: Linux Ubuntu Administracion, Linux Ubuntu Basico — Abelardo Jara @ 11:55 am

Aqui amigos les paso un buen tip para aumentar su performance de la tarjeta de video Intel en Ubuntun (En mi caso soy un . En mi caso soy un “orgulloso” poseedor de una X3100) elevo mi FPS (frames per second) de 1141 a mas de 1500 :D

Bueno, vamos a los pasos:

1. Edita tu archivo /etc/environment

sudo gedit /etc/environment

Y anhade al final esta linea:

INTEL_BATCH=”1″

Graba y sal.

2. Ahora edita tu archivo de configuracion del sistema de configuracion de tarjeta grafica de tu Ubuntu:

$ sudo gedit /etc/X11/xorg.conf

Y busca la linea que dice:

Section “Screen”
Identifier    “Default Screen”
Monitor        “Configured Monitor”
Device        “Configured Video Device”
DefaultColorDepth 24
EndSection

Y cambia el 24 por un 16. Graba y sal, listo! Ahora reinicia tu PC y cuando inicias sesion de nuevo, puedes medir tu nuevo FPS, abriendo un terminal y escribiendo

$ glxgears

Midiendo FPS con glxgears

Midiendo FPS con glxgears

Truco para OpenOffice 3:

Bueno este tema no esta relacionado con el anterior, pero para los que les gusta los temas oscuros, Openoffice no se ve muy bien. Por eso les recomiendo seguir estos pasos:

$ sudo apt-get remove openoffice.org-gtk

Y luego instalar

$ sudo apt-get install openoffice.org-kde

Listo esto hara que tu OpenOffice se vea mucho mejor :D . Estoy usando el tema Carbonfibre (fibra de carbon) de Gnome

Carbonfibre

Openoffice con look KDE

Openoffice con look KDE

Instalar fuentes de Office 2007 en Ubuntu

Archivado en: Linux Ubuntu Administracion, Linux Ubuntu Basico — Abelardo Jara @ 11:30 am

Windows Vista y Microsoft Office 2007 tienen un nuevo tipo de fuentes: Calibri, Cambria, Candara, Consolas, Constantia, y Corbel. Ellas reemplazan los clasicos Times New Roman, Arial, Courier New, etc.

El problema es cuando queremos abrir documentos de OpenXML (Office 2007) en OpenOffice y estas fuentes no estan disponibles. Veamos como instalarlas:

The Office 2007 / Windows Vista shown in OpenOffice.org 2.3.1 on Linux

Cuestiones de licencia:

En el instalador de Powerpoint Viewer dice:

You may use the fonts that accompany the PowerPoint Viewer only to display and print content from a device running a Microsoft Windows operating system.

Lo que indica que solo puede usarse si usan Microsoft Windows. Esperemos que Ubuntu o Redhat saquen un juego de fuentes equivalentes para Linux.

Pasos a seguir:

Luego instalas cabextract, abres una consola y tipea:

  1. sudo apt-get install cabextract
  2. Download PowerPoint Viewer 2007. No te pide Windows Genuine Advantage validation.
  3. Extract the .exe: cabextract -F ppviewer.cab PowerPointViewer.exe
  4. Prepara el directorio de destino de tus fuentessudo mkdir /usr/share/fonts/vista
  5. Extrae las fuentes: sudo cabextract -F '*.TT?' -d /usr/share/fonts/vista ppviewer.cab
  6. Actualiza el cache de fuentes: fc-cache -fv

Listo, con esto ya tendras las fuentes de Office 2007 instaladas en tu Ubuntu.

Fuente: http://www.oooninja.com/2008/01/calibri-linux-vista-fonts-download.html

Abril 5, 2009

Configurar EMACS con atajos de Windows (MODO CUA) y varios trucos utiles adicionales (plugins CEDET y SEMANTIC)

Archivado en: Linux Ubuntu Administracion, Linux Ubuntu Basico, Linux en general — Abelardo Jara @ 3:35 pm

Archivo:Emacs-screenshot.png

En los entornos UNIX, tenemos el famoso editor de textos EMACS. Realmente es sumamente potente y tiene una cantidad enorme de scripts que se le pueden instalar y que lo hacen muy potente.

Nota previa:

a. En EMACS se le llama tecla “Meta” a la tecla “Alt”

b. EMACS trabaja con el concepto de “frames” (marcos) y “windows” (ventanas). Los frames vienen a ser como PAGINAS, en cada pagina puedes tener varias ventanas abiertas.

Aqui te daremos un script para navegar rapidamente entre tus FRAMES (MARCOS) y tus WINDOWS (VENTANAS)

Primero vamos a instalarlo: (MUY IMPORTANTE)

$ sudo apt-get install emacs-snapshot-gtk semantic cedet*

Ojo muy importante: No instalen el paquete normal emacs, porque tiene problemas con las fuentes y no se ve bien. Les recomiendo mucho mas este paquete emacs-snapshot-gtk que se integra muy bien con Ubuntu.

Aqui comentare varios trucos que utilizo y que (al menos a mi punto de ver) lo hacen mucho mas comodo de utilizar:

1. Usar las teclas de atajo de los editores de Windows

Con esto nos referimos a usar Shift+<flechas de direccion> para seleccionar texto y Ctrl-C para copiar, Ctrl-V para pegar y Ctrl-X para cortar.

Bueno en las ultimas versiones de EMACS existe un modo de edicion llamado Cua-Mode, el cual utiliza las teclas rapidas de los editores de Windows dentro de EMACS. Los puristas diran que horror, jajaja, pero realmente se hace mucho mas comodo. Ademas no afecta las otras combinaciones de teclas de EMACS que empiezan con Ctrl-C o Ctrl-X porque Cua-Mode solo se activa cuando has seleccionado un texto. Para activar CUA mode, debes anhadir estas lineas a tu archivo .emacs

$ gedit .emacs (y anhade alli estas lineas)

;; Activate Cua mode, makes shortkeys to behave as windows

(cua-mode t)

(transient-mark-mode 1) ;; No region when it is not highlighted

(setq cua-keep-region-after-copy t) ;; Standard Windows behaviour

Ahora lo mas interesante es que este modo CUA te permite editar varias lineas de tu codigo (y todas a la vez :O)

Les presento este video:

Emacs Column Editing from Mark Mansour on Vimeo.

2. Problemas con la fuentes de Emacs

Ahora otro problema que es molesto en Emacs para Ubuntu, son las fuentes, para cambiarla debes crear en tu carpeta de usuario un archivo llamado .Xdefaults

Lo puedes hacer, entra a terminal y tipea:

$ gedit .Xdefaults

Y puedes tipear lo siguiente:

Emacs.font: Monospace-16

Emacs.FontBackend: xft

Como fuente puedes utilizar cualquiera de las que tienes instalada en tu Ubuntu

3. Hacerlo correr en consola:

Si lo deseas ejecutar en consola puedes anhadir este linea a tu archivo .bashrc. Inicias una terminal y tipeas

$ gedit .bashrc

Y busca las lineas donde esten definidos los “alias”. Anhade esta linea:

alias emacs=’emacs-snapshot-gtk’

Si quieres ejecutar en modo consola tipeas: (remueve -nw si lo quieres ejecutar normal en ventana)

$ emacs -nw myprograma.cpp (-nw es para indicar que se ejecute dentro del terminal, es muy util porque tiene un background oscuro, para descansar la vista para gente que programa mucho).

4. Mi archivo .emacs recopilado

Finalmente les dejo todo mi archivo .emacs. Ya tiene activado el modo CUA (asi que pueden copiar, pegar, cortar con las teclas de atajo de Windows), pero le he puesto varios trucos mas

CTRL+BARRA ESPACIADORA=> Empezar a marcar una seccion de texto (el mismo efecto que Shift mas flechas de cursor, el problema es que Shift+flechas no funciona en terminal puro, es decir si vas a Ctrl+Alt+F1) y este atajo si funcionara alli, los demas atajos de CUA mode si funcionan directos.

CTRL+L=> Ir a una linea especifica de tu programa, muy util para programadores

CTRL+G => Cancela el comando que estas haciendo (semejante a hacer un Esc en un editor Windows)

CTRL+F => Buscar una cadena de texto hacia adelante

CTRL+R => Busca texto para reemplazar

ALT+F => Buscar una cadena de texto hacia atras

CTRL+O => Abre un archivo

CTRL+S => Graba el archivo

CTRL+Q => Salir

CTRL+Z => Deshacer un cambio (undo)

ALT+<FLECHA ARRIBA> => Hace que la ventana que estas se haga una linea mas grande (es util para cuando estas compilando un programa y tienes tu programa en la ventana de arriba y la salida del compilador en la ventana de abajo)

ALT+<FLECHA ABAJO> => Igual que el anterior pero hace la ventana mas chica.

ALT+<PageDown> => Salta a la siguiente ventana, util para el caso que comentamos, tienes tu codigo en una ventana y la salida del compilador en la otra

ALT+<PageUp> => Igual que el anterior

F2 => Activa la ventana del administrador de archivos, muy util si estas trabajando en un directorio que contiene varios (multiples) archivos de codigo

F3 => Te creara un nuevo marco (FRAME) o pagina donde abrir ventanas, por defecto el marco se abre cargando el archivo inicial cargado en el primer marco.

Escape y despues presiona F3 => Cierra todos los marcos, excepto en el que estas

Control + Alt + <PageUp o PageDown> => Navega entre todos tus marcos (frames) que tienes abiertos. Puedes saber en que marco (frame) estas mirando a la izquierda en la barra de estado, dice la letra “Fx” donde x es el numero del marco.

F4 => Divide tu marco en 2 ventanas o mas VERTICALMENTE (util para editar 2 codigos a la vez).

Alt+<flecha a la derecha o flecha a la izquierda> => Navega entre las ventanas de tu marco actual

Escape y despues presiona F4 => Cierra todas las ventanas excepto en la que estas

F5 => Compilar tu programa, por defecto esta configurado como “make -f”, si tienes un Makefile pero si solo tienes un archivo de codigo, lo puedes reemplazar por “gcc miprograma.cpp -o miprograma”.

F7 => Establacer un bookmark (etiqueta). Establece etiquetas que seran usadas por la tecla anterior (F9), basta con poner el nombre de la etiqueta que se grabara en el archivo ~/.emacs.bmk.

F9 => Saltar a bookmark (etiqueta). Esta es una opcion muy util porque permite ponerle “etiquetas” a nuestro codigo que se salvan en el archivo ~/.emacs.bmk.

F12 => LLAMA A CORRECTOR ORTOGRAFICO, MUY UTIL

Ctrl+x 1 => Cierra todas tus ventanas excepto la que tienes actualmente activada editando.

Ctrl+x 2 => Divide la ventana en que estas trabajando en 2 ventanas separadas horizontalmente

Ctrl+x 3 => Divide la ventana en que estas trabajando en 2 ventanas separadas verticalmente

Y tienes otros scripts muy utiles ya listos:

Ctrl-C y luego Ctrl-B => “Beautify”, embellece tu codigo y arregla las tabulacions (muy estetico para programadores)

Alt-X y tipea “unix2dos” => remueve el caracter \n para que tu codigo quede en formato Linux/UNIX

Alt-X y tipea “dos2unix” => Anhade de vuelta el caracter \n  para que tu codigo quede en formato Windows

Alt-X es un atajo al modo “ejecutar”, aqui puedes ejecutar los scripts que tienes instalados en tu EMACS, para hacerlo tipeas “Alt-x” y luego tipeas el comando que quieres ejecutar, lo util es que tiene autocompletado, asi que tipeas una parte del comando y puedes presionar Tab para autocompletarlo.

Ademas estoy incluyendo el codigo para iniciar los plugins CEDET y SEMANTIC, que son para autocompletado de codigo y busqueda de la sintaxis de una funcion que estas tipeando en C/C++:

Para utilizar Semantic y CEDET te colocas sobre una palabra que su nombre es parte del nombre de una funcion y presionas estas teclas:

SHIFT+TAB => AUTOCOMPLETA LA PALABRA QUE ESTAS TIPEANDO, SUPER UTIL CUANDO PROGRAMAS PORQUE TAMBIEN TE EXPANDE LA FUNCION EN QUE ESTAS TRABAJANDO

Ctrl+c y luego presionas ? => busca la definicion de la funcion en todos los archivos de cabecera .h especificados en directorios de busqueda

Para anhadir esto edita tu archivo .emacs y puedes copiar el contenido del que uso:

;; -*- mode: emacs-lisp -*-
(add-to-list 'load-path "~/.emacs.d")

;; Set paper size
(if (or (string-match "XEmacs" emacs-version)
(string-match "20." emacs-version))
(setq ps-paper-type 'a4)
(setq ps-paper-type 'ps-a4))

;; Make ?, ? and such work
(set-language-environment 'spanish)
(set-terminal-coding-system 'iso-latin-1)

;; Inhibit startup window, very annoying
(setq inhibit-startup-message t)

;; Makes final line always be a return
(setq require-final-newline t)

;; Activate Cua mode, makes shortkeys to behave as windows
(cua-mode t)
(setq cua-keep-region-after-copy t) ;; Standard Windows behaviour
(global-set-key [(control o)] 'find-file)              ; use Ctrl-o to open a (new) file
(global-set-key [(control n)] 'find-file-other-frame)  ; open a file in a new window with Ctrl-n
(global-set-key [(control s)] 'save-buffer)            ; save with Ctrl-s
(global-set-key [(meta s)]    'write-file)             ; 'save file as...' with Alt-s ('meta' is
; just another name for the 'Alt' key)
(global-set-key [(control q)] 'save-buffers-kill-emacs); exit XEmacs with Ctrl-q
(global-set-key [(meta q)]    'kill-this-buffer)       ; delete changes (don't save) with Alt-q

(global-set-key [(control t)] 'ispell-buffer)          ; spell-check with Ctrl-t
(global-set-key [(control r)] 'replace-string)         ; search and replace with Ctrl-r

; A first attempt to make "control z" work as undo.
(global-set-key [(control z)] 'undo)

; The above does not work on newer versions of XEmacs. Then, highjack
; Xemacs's zap-up-to-char function itself and force it to work as "undo".
(defun zap-up-to-char ()
(interactive)
(undo)
)

; search forward with Ctrl-f
(global-set-key [(control f)] 'isearch-forward)
(define-key isearch-mode-map [(control f)] (lookup-key isearch-mode-map "\C-s"))
(define-key minibuffer-local-isearch-map [(control f)]
(lookup-key minibuffer-local-isearch-map "\C-s"))

; search backward with Alt-f
(global-set-key [(meta f)] 'isearch-backward)
(define-key isearch-mode-map [(meta f)] (lookup-key isearch-mode-map "\C-r"))
(define-key minibuffer-local-isearch-map [(meta f)]
(lookup-key minibuffer-local-isearch-map "\C-r"))

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;; Activate colors for syntax highlighting
(cond ((fboundp 'global-font-lock-mode)
;; Turn on font-lock in all modes that support it
(global-font-lock-mode t)
;; Maximum colors
(setq font-lock-maximum-decoration t)))

;; Highlight region between the point and the mark
(transient-mark-mode t)

;; Brackets matching script
(global-set-key "%" 'match-paren)
(defun match-paren (arg)
"Go to the matching paren if on a paren; otherwise insert %."
(interactive "p")
(cond ((looking-at "\\s\(") (forward-list 1) (backward-char 1))
((looking-at "\\s\)") (forward-char 1) (backward-list 1))
(t (self-insert-command (or arg 1)))))

;; To allow to type y instead of "yes"
(fset 'yes-or-no-p 'y-or-n-p)

; Moving cursor down at bottom scrolls only a single line, not half page
(setq scroll-step 1)
(setq scroll-conservatively 5)

;; Save space
;(menu-bar-mode nil)

;; Activate highlight in search and replace
(setq search-highlight t)
(setq query-replace-highlight t)

;; we want fontification in all modes
(global-font-lock-mode t t)

;; maximum possible fontification
(setq font-lock-maximum-decoration t)

;; Provide templates for new files
(auto-insert-mode t)

;; Abbrevs
; Use C-xaig to correct common typos
(setq abbrev-file-name "~/.emacs.d/abbrev_defs")
(if (file-exists-p abbrev-file-name)
(quietly-read-abbrev-file))

;; Activate template autocompletion
(set-default 'abbrev-mode t)

;; Bell instead of annoying beep
(setq visible-bell t)

;; Turn off the bell http://www.emacswiki.org/cgi-bin/wiki?AlarmBell
(setq ring-bell-function 'ignore)

;; Do not add empty lines at the end of our file if we press down key
(setq next-line-add-newlines nil)

;; When in text (or related mode) break the lines at 80 chars
(setq fill-column 77)

;; Highlight matching parentheses. Very useful for coding.
(show-paren-mode 1)

;; Automatically reload files after they've been modified
;; (typically in Visual C++)
(global-auto-revert-mode 1)

;; Helper for compilation. Close the compilation window if
;; there was no error at all.
(defun compilation-exit-autoclose (status code msg)
;; If M-x compile exists with a 0
(when (and (eq status 'exit) (zerop code))
;; then bury the *compilation* buffer, so that C-x b doesn't go there
(bury-buffer)
;; and delete the *compilation* window
(delete-window (get-buffer-window (get-buffer "*compilation*"))))
;; Always return the anticipated result of compilation-exit-message-function
(cons msg code))
;; Specify my function (maybe I should have done a lambda function)
(setq compilation-exit-message-function 'compilation-exit-autoclose)

;; ===== Set the highlight current line minor mode =====

;; In every buffer, the line which contains the cursor will be fully
;; highlighted

(global-hl-line-mode 1)

;; ===== Set standard indent to 2 rather that 4 =======

(setq standard-indent 2)
; No sangra si estamos en literales
;(setq c-tab-always-indent "other")
; Espacios en vez de tabuladores
(setq-default indent-tabs-mode nil)

;; ========== Line by line scrolling ==================

;; This makes the buffer scroll by only a single line when the up or
;; down cursor keys push the cursor (tool-bar-mode) outside the
;; buffer. The standard emacs behaviour is to reposition the cursor in
;; the center of the screen, but this can make the scrolling confusing

(setq scroll-step 1)

;; ========== Support Wheel Mouse Scrolling ==========

(mouse-wheel-mode t)

;; ========== Prevent Emacs from making backup files ==========

(setq make-backup-files nil)
;disable backup
(setq backup-inhibited t)
;change prefix of auto-save files
(setq auto-save-list-file-prefix "~/.emacs-saves/.saves-")
;disable auto save
(setq auto-save-default nil)

;; ========== Enable Line and Column Numbering ==========

;; Show line-number in the mode line
(line-number-mode 1)

;; Show column-number in the mode line
(column-number-mode 1)

;; ===== Function to delete a line =====

;; First define a variable which will store the previous column position
(defvar previous-column nil "Save the column position")

;; Define the nuke-line function. The line is killed, then the newline
;; character is deleted. The column which the cursor was positioned at is then
;; restored. Because the kill-line function is used, the contents deleted can
;; be later restored by usibackward-delete-char-untabifyng the yank commands.
(defun nuke-line()
"Kill an entire line, including the trailing newline character"
(interactive)

;; Store the current column position, so it can later be restored for a more
;; natural feel to the deletion
(setq previous-column (current-column))

;; Now move to the end of the current line
(end-of-line)

;; Test the length of the line. If it is 0, there is no need for a
;; kill-line. All that happens in this case is that the new-line character
;; is deleted.
(if (= (current-column) 0)
(delete-char 1)

;; This is the 'else' clause. The current line being deleted is not zero
;; in length. First remove the line by moving to its start and then
;; killing, followed by deletion of the newline character, and then
;; finally restoration of the column position.
(progn
(beginning-of-line)
(kill-line)
(delete-char 1)
(move-to-column previous-column))))

;;=============================================================================
;; * Set Variables & Rebind keys
;;=============================================================================
;; Commands to make my programming environment nice
(global-set-key "\C-l" 'goto-line) ; [Ctrl]-[L]

(global-set-key [f1] 'help-command)
;;(global-set-key [f2] 'undo)
(global-set-key [f2] 'speedbar-get-focus)
(global-set-key [f3] 'make-frame)
(define-key esc-map [f3]     'delete-other-frames)
(global-set-key [f4] 'split-window-horizontally)
(define-key esc-map [f4]     'delete-other-windows)
(global-set-key [f5] 'compile)
(global-set-key [f6] 'next-error)

(setq bookmark-save-flag 1)
(global-set-key [f7] 'bookmark-set)
(global-set-key [f8] 'bookmark-jump)
;(global-set-key [f12] 'nuke-line)
(global-set-key [f12] 'ispell-buffer)

(global-set-key [kp-prior] 'scroll-down)      ; [PgUp]
(global-set-key [prior]    'scroll-down)      ; [PgUp]
(global-set-key [kp-next]  'scroll-up)        ; [PgDn]
(global-set-key [next]     'scroll-up)        ; [PgDn]
(global-set-key "\M-g" 'goto-line)

;; home and end - needed for emacs
(global-set-key [home] 'beginning-of-line)
(global-set-key [end] 'end-of-line)

(global-set-key [delete] 'delete-char)
(global-set-key [(meta delete)] '(lambda () (interactive) (backward-or-forward-kill-word -1)))
(global-set-key [(alt delete)] '(lambda () (interactive) (backward-or-forward-kill-word -1)))

(global-set-key [M-prior]     'other-window)
(global-set-key [M-next]      'other-window)

(global-set-key [(control meta prior)]     'other-frame)
(global-set-key [(control meta next)]      'other-frame)

(global-set-key [M-up] 'enlarge-window)
(global-set-key [M-down] 'shrink-window)
;; to get the scroll wheel work

(global-set-key [(button5)] '(lambda () (interactive) (scroll-up 3)))
(global-set-key [(button4)] '(lambda () (interactive) (scroll-down 3)))
(global-set-key [(shift button5)] '(lambda () (interactive) (scroll-up-command)))
(global-set-key [(shift button4)] '(lambda () (interactive) (scroll-down-command)))
(global-set-key [(control button5)] '(lambda () (interactive) (scroll-up-command)))
(global-set-key [(control button4)] '(lambda () (interactive) (scroll-down-command)))

(global-set-key [(mouse-5)] '(lambda () (interactive) (scroll-up 3)))
(global-set-key [(mouse-4)] '(lambda () (interactive) (scroll-down 3)))
(global-set-key [(shift mouse-5)] '(lambda () (interactive) (scroll-up)))
(global-set-key [(shift mouse-4)] '(lambda () (interactive) (scroll-down)))
(global-set-key [(control mouse-5)] '(lambda () (interactive) (scroll-up)))
(global-set-key [(control mouse-4)] '(lambda () (interactive) (scroll-down)))

;;;=============================================
;; Smart Tab
;; =============================================
(defvar smart-tab-using-hippie-expand nil
"turn this on if you want to use hippie-expand completion.")
(define-key function-key-map [S-tab] [backtab])
(global-set-key [(backtab)] 'smart-tab)
(defun smart-tab (prefix)
"Needs `transient-mark-mode' to be on. This smart tab is
minibuffer compliant: it acts as usual in the minibuffer.

In all other buffers: if PREFIX is \\[universal-argument], calls
`smart-indent'. Else if point is at the end of a symbol,
expands it. Else calls `smart-indent'."
(interactive "P")
(if (minibufferp)
(minibuffer-complete)
(if (smart-tab-must-expand prefix)
(if smart-tab-using-hippie-expand
(hippie-expand nil)
(dabbrev-expand nil))
(smart-indent))))

(defun smart-indent ()
"Indents region if mark is active, or current line otherwise."
(interactive)
(if mark-active
(indent-region (region-beginning)
(region-end))
(indent-for-tab-command)))

(defun smart-tab-must-expand (&optional prefix)
"If PREFIX is \\[universal-argument], answers no.
Otherwise, analyses point position and answers."
(unless (or (consp prefix)
mark-active)
(looking-at "\\_>")))

;==========Now we add color themes support===============
(setq my-color-themes (list 'color-theme-emacs-21
'color-theme-arjen 'color-theme-bharadwaj-slate
'color-theme-billw 'color-theme-blue-mood
'color-theme-blue-sea 'color-theme-calm-forest
'color-theme-charcoal-black 'color-theme-clarity
'color-theme-classic 'color-theme-comidia
'color-theme-dark-blue 'color-theme-dark-blue2
'color-theme-dark-erc 'color-theme-dark-laptop
'color-theme-deep-blue 'color-theme-digital-ofs1
'color-theme-emacs-nw 'color-theme-euphoria
'color-theme-feng-shui 'color-theme-fischmeister
'color-theme-gnome 'color-theme-gnome2
'color-theme-goldenrod 'color-theme-gray1
'color-theme-gray30 'color-theme-greiner
'color-theme-hober 'color-theme-infodoc
'color-theme-lawrence 'color-theme-ld-dark
'color-theme-montz 'color-theme-oswald
'color-theme-pok-wob 'color-theme-tty-dark
'color-theme-xp))

(when window-system
(require 'color-theme)
;;(load-file "~/.emacs.d/color-theme-blue.el")
(color-theme-euphoria)
)

;; ======================Modes for EMACs=========================

;; make text-mode default
(setq default-major-mode 'text-mode)

;; Enter changes lines and auto-indents the new line
(add-hook 'c-mode-hook
'(lambda ()
(define-key c-mode-map "\C-m" 'newline-and-indent)))

(add-hook 'c++-mode-hook
'(lambda ()
(define-key c++-mode-map "\C-m" 'newline-and-indent)))

(add-hook 'vhdl-mode-hook
'(lambda ()
(define-key vhdl-mode-map "\C-m" 'newline-and-indent)))

(add-hook 'c++-mode-hook 'turn-on-auto-fill)
(add-hook 'c-mode-hook 'turn-on-auto-fill)
(add-hook 'vhdl-mode 'turn-on-auto-fill)

;;make a #define be left-aligned
(setq c-electric-pound-behavior (quote (alignleft)))

;; Establece el indexado para el modo .c
;; indexado 0 al abrir una llave
(c-set-offset 'substatement-open 0)

;; Beautify (poner bonito) tabulaciones en nuestro pograma en C/C++
(defun beautify-region (beg end)
(interactive "r")
(setq end (save-excursion (goto-char end) (point-marker)))
(indent-region beg end nil))
(defun beautify-buffer ()
"Beautify buffer by applying indentation, whitespace fixup, alignment, and
case fixing to entire buffer. Calls `vhdl-beautify-region' for the entire
buffer."
(interactive)
(beautify-region (point-min) (point-max))
(when noninteractive (save-buffer)))

(global-unset-key "\C-b")
(global-set-key "\C-b" 'beautify-buffer)

;;;VHDL-Mode
;   this variable is buffer local, you can set it for every vhdl-file
;   seperately by putting the following as first line in the vhdl-file:
;   -- -*- mode: vhdl; vhdl-compiler-options: \"-93 -work ../work -quiet\" -*-
(defvar vhdl-compiler-options   "-work work")

(autoload 'vhdl-mode "vhdl-mode" "VHDL Editing Mode" t);
(setq auto-mode-alist (append '(("\\.vhd$"  . vhdl-mode)) auto-mode-alist))
(setq auto-mode-alist (append '(("\\.vhdl$" . vhdl-mode)) auto-mode-alist))

(defvar vhdl-standard '(93 nil))
(defvar vhdl-clock-name "clk")
(defvar vhdl-reset-name "rst")

(defvar vhdl-file-header "\
-------------------------------------------------------------------------------
-- Title      : <title string>
-- Project    : <project>
-------------------------------------------------------------------------------
-- File       : <filename>
-- Author     : <author>
-- Company    : <company>
-- Created    : <date>
-- Last update: <date>
-- Platform   : <platform>
<projectdesc>-------------------------------------------------------------------------------
-- Description: <cursor>
<copyright>-------------------------------------------------------------------------------
-- Revisions  :
-- Date        Version  Author    Description
-- <date>  1.0      <login>  Created
-------------------------------------------------------------------------------

")

(add-hook 'vhdl-mode-hook
'(lambda ()
;;vhdl-electric enables templates
(setq vhdl-electric-mode t)
(setq vhdl-compiler 'v-system)
(setq vhdl-stutter-mode t)
(setq vhdl-intelligent-tab t)
(setq vhdl-indent-tabs-mode nil)
(setq-default vhdl-end-comment-column 120)
(setq-default vhdl-standard '(93 nil))
(setq vhdl-standard '(93 nil))
(setq-default vhdl-underscore-is-part-of-word t)
(setq vhdl-self-insert-comments nil)
(setq vhdl-actual-port-name '("\"\\(.*\\)$\"" . "s\\1"))
(setq vhdl-argument-list-indent nil)
(setq vhdl-insert-empty-lines 'none)
(setq vhdl-instance-name '(".*" . "\\&_inst_%d"))
))

;;turn on VHDL automatic templates
(add-hook 'vhdl-mode-hook (function (lambda () (abbrev-mode t))))

;; =======Enable CEDET and semantic plugins=========
(require 'cedet)

;; smart completion
(require 'semantic-ia)
(require 'semantic-sb)
(require 'semanticdb)
(global-ede-mode t)

;; Enable semantic cache, search functions only first time
(global-semanticdb-minor-mode 1)

(defun semanticdb-cache-directory-p(directory)
(cond
((search "/ArraySaver/" directory) nil)
((search "@@" directory) t)
(t nil)))

(add-hook 'semanticdb-project-predicate-functions 'semanticdb-cache-directory-p)

;; * This enables the database and idle reparse engines
(semantic-load-enable-minimum-features)

;; * This enables some tools useful for coding, such as summary mode
;;   imenu support, and the semantic navigator
(semantic-load-enable-code-helpers)

(global-semantic-idle-scheduler-mode 1)
(global-semantic-idle-completions-mode 1)
(global-semantic-idle-summary-mode 1)
(global-semantic-show-unmatched-syntax-mode -1)

(setq semanticdb-default-save-directory "~/.emacs.d/semantic")

;; customisation of modes
(defun my-cedet-hook ()
;;(local-set-key "\C-c/" 'semantic-ia-complete-symbol)
(local-set-key [backtab] 'semantic-ia-complete-symbol)
(local-set-key "\C-c?" 'semantic-ia-complete-symbol-menu)
(local-set-key "\C-c>" 'semantic-complete-analyze-inline)
(local-set-key "\C-c=" 'semantic-decoration-include-visit)
(local-set-key "\C-cj" 'semantic-ia-fast-jump)
(local-set-key "\C-cq" 'semantic-ia-show-doc)
(local-set-key "\C-cs" 'semantic-ia-show-summary)
(local-set-key "\C-cp" 'semantic-analyze-proto-impl-toggle)
)

(add-hook 'c-mode-common-hook 'my-cedet-hook)
(add-hook 'c++-mode-common-hook 'my-cedet-hook)

(setq-mode-local c-mode semanticdb-find-default-throttle
'(project unloaded system recursive))
(setq-mode-local c++-mode semanticdb-find-default-throttle
'(project unloaded system recursive))

(semantic-add-system-include "/usr/include" 'c-mode)
(semantic-add-system-include "/usr/include" 'c++-mode)
(semantic-add-system-include "/usr/include/c++/4.2" 'c++-mode)
(semantic-add-system-include "/usr/local/include" 'c-mode)
(semantic-add-system-include "/usr/local/include" 'c++-mode)
(semantic-add-system-include "." 'c-mode)
(semantic-add-system-include "." 'c++-mode)

;;====Adding C/C++ templates hooked into C/C++ mode================================
;; This is a way to hook tempo into cc-mode
(defvar c-tempo-tags nil
"Tempo tags for C mode")
(defvar c++-tempo-tags nil
"Tempo tags for C++ mode")

;;; C-Mode Templates and C++-Mode Templates (uses C-Mode Templates also)
(require 'tempo)
(setq tempo-interactive t)

(add-hook 'c-mode-hook '(lambda ()
(local-set-key [f11] 'tempo-complete-tag)))
(add-hook 'c-mode-hook '(lambda ()
(tempo-use-tag-list 'c-tempo-tags)
))
(add-hook 'c++-mode-hook '(lambda ()
(tempo-use-tag-list 'c-tempo-tags)
(tempo-use-tag-list 'c++-tempo-tags)
))

;;; Preprocessor Templates (appended to c-tempo-tags)

(tempo-define-template "c-include"
'("include <" r ".h>" > n
)
"include"
"Insert a #include <> statement"
'c-tempo-tags)

(tempo-define-template "c-ifdef"
'("ifdef " (p "ifdef-clause: " clause) > n> p n
"#else /* !(" (s clause) ") */" n> p n
"#endif /* " (s clause)" */" n>
)
"ifdef"
"Insert a #ifdef #else #endif statement"
'c-tempo-tags)

(tempo-define-template "c-ifndef"
'("ifndef " (p "ifndef-clause: " clause) > n
"#define " (s clause) n> p n
"#endif /* " (s clause)" */" n>
)
"ifndef"
"Insert a #ifndef #define #endif statement"
'c-tempo-tags)

;;; C-Mode Templates

(tempo-define-template "c-if"
'(> "if (" (p "if-clause: " clause) ")" n>
"{" > n>
> r n
"}" > n>
)
"if"
"Insert a C if statement"
'c-tempo-tags)

(tempo-define-template "c-else"
'(> "else" n>
"{" > n>
> r n
"}" > n>
)
"else"
"Insert a C else statement"
'c-tempo-tags)

(tempo-define-template "c-if-else"
'(> "if (" (p "if-clause: " clause) ")"  n>
"{" > n
> r n
"}" > n
"else" > n
"{" > n>
> r n
"}" > n>
)
"ifelse"
"Insert a C if else statement"
'c-tempo-tags)

(tempo-define-template "c-while"
'(> "while (" (p "while-clause: " clause) ")" >  n>
"{" > n
> r n
"}" > n>
)
"while"
"Insert a C while statement"
'c-tempo-tags)

(tempo-define-template "c-for"
'(> "for (" (p "for-clause: " clause) ")" >  n>
"{" > n
> r n
"}" > n>
)
"for"
"Insert a C for statement"
'c-tempo-tags)

(tempo-define-template "c-for-i"
'(> "for (" (p "variable: " var) " = 0; " (s var)
" < "(p "upper bound: " ub)"; " (s var) "++)" >  n>
"{" > n
> r n
"}" > n>
)
"fori"
"Insert a C for loop: for(x = 0; x < ..; x++)"
'c-tempo-tags)

(tempo-define-template "c-main"
'(> "int main(int argc, char *argv[])" >  n>
"{" > n>
> r n
> "return 0 ;" n>
> "}" > n>
)
"main"
"Insert a C main statement"
'c-tempo-tags)

(tempo-define-template "c-if-malloc"
'(> (p "variable: " var) " = ("
(p "type: " type) " *) malloc (sizeof(" (s type)
") * " (p "nitems: " nitems) ") ;" n>
> "if (" (s var) " == NULL)" n>
> "error_exit (\"" (buffer-name) ": " r ": Failed to malloc() " (s var) " \") ;" n>
)
"ifmalloc"
"Insert a C if (malloc...) statement"
'c-tempo-tags)

(tempo-define-template "c-if-calloc"
'(> (p "variable: " var) " = ("
(p "type: " type) " *) calloc (sizeof(" (s type)
"), " (p "nitems: " nitems) ") ;" n>
> "if (" (s var) " == NULL)" n>
> "error_exit (\"" (buffer-name) ": " r ": Failed to calloc() " (s var) " \") ;" n>
)
"ifcalloc"
"Insert a C if (calloc...) statement"
'c-tempo-tags)

(tempo-define-template "c-switch"
'(> "switch (" (p "switch-condition: " clause) ")" n>
"{" >  n>
"case " (p "first value: ") ":" > n> p n
"break;" > n> p n
"default:" > n> p n
"break;" > n
"}" > n>
)
"switch"
"Insert a C switch statement"
'c-tempo-tags)

(tempo-define-template "c-case"
'(n "case " (p "value: ") ":" > n> p n
"break;" > n> p
)
"case"
"Insert a C case statement"
'c-tempo-tags)

;;;C++-Mode Templates

(tempo-define-template "c++-class"
'("class " (p "classname: " class) p n "{" n "public:" n>

(s class) "();"
(indent-for-comment) "the default constructor" n>

(s class)
"(const " (s class) "&rhs);"
(indent-for-comment) "the copy constructor" n>

(s class)
"& operator=(const " (s class) "&rhs);"
(indent-for-comment) "the assignment operator" n>

n> "// the default address-of operators" n>
"// "(s class)
"* operator&()             { return this; };" n>
"// const "(s class)
"* operator&() const { return this; };" n

n > "~" (s class) "();"
(indent-for-comment) "the destructor" n n>
p n
"protected:" n> p n
"private:" n> p n
"};\t// end of class " (s class) n>
)
"class"
"Insert a class skeleton"
'c++-tempo-tags)
;; =====================================================================
;; Latex improvements
(setq auto-mode-alist (cons '("\\.tex$" . latex-mode) auto-mode-alist))

(setq tex-mode-hook
'(lambda ()
(auto-fill-mode 1)
))

(setq latex-mode-hook
'(lambda ()
(auto-fill-mode 1)
))

(autoload 'reftex-mode    "reftex" "RefTeX Minor Mode" t)
(autoload 'turn-on-reftex "reftex" "RefTeX Minor Mode" t)

(add-hook 'LaTeX-mode-hook 'turn-on-reftex) ; with AUCTeX LaTeX mode
;  (add-hook 'latex-mode-hook 'turn-on-reftex)) ; with Emacs latex mode

(setq reftex-enable-partial-scans t)
(setq reftex-save-parse-info t)
(setq reftex-use-multiple-selection-buffers t)

;; To integrate with AUCTeX, use
(setq reftex-plug-into-AUCTeX t)
(setq LaTeX-mode-hook 'allman-latex-hook)

;;===================== Functions defined by user =============================
;;Convert DOS cr-lf to UNIX newline
(defun dos2unix () (interactive) (goto-char (point-min))
(while (search-forward "\r" nil t) (replace-match "")))
;;Convert UNIX newline to DOS cr-lf
(defun unix2dos () (interactive) (goto-char (point-min))
(while (search-forward "\n" nil t) (replace-match "\r\n")))

Abril 2, 2009

Tema de KDE 4 para Gnome

Archivado en: Linux Ubuntu Basico — Abelardo Jara @ 12:52 pm

Con frecuencia me gusta visitar la pagina de Gnome-Look

Alli nos podemos descargar temas para nuestro escritorio de Ubuntu. Generalmente nos descargamos el tema como un archivo de extension .TAR.GZ y lo instalmos en System->Preference->Appearance y luego presionamos el boton de Install…

Encontre que han publicado un tema para que Gnome luzca como KDE 4. Lo he probado y realmente me ha gustado mucho. Es de tonos grises y muy facil para quienes gustan de un escritorio sobrio y elegante.

Oxygen (KDE 4.2) for GNOME

Despues de instalarlo hacen Click en el boton Customize… (la misma ventana de Apariencia) y en la pestanha Appearance lo pueden buscar como kde4-oxygen.

El tema queda asi:

Combinado con un bonito de tema iconos y de borde de ventana RazorFX (Metacity) queda muy bien :)

RazrFX GNOME-Look.org

Tema de GTK con motivo KDE 4

Tema de GTK con motivo KDE 4

Varicad 2009 (parecido a AutoCAD) para Ubuntu Linux

Archivado en: Linux Ubuntu Basico — Abelardo Jara @ 9:31 am

VARICAD es un sistema de CAD profesional para ingeniería mecanica. El sistema está equipado con los recursos básicos necesarios para los constructores y diseñadores de maquinas.

Incluye funciones de modelado 2D y 3D, transformaciones, trabajar con objetos definidos por el usuario, capacidades de agrupación, etc. Todo el sistema es muy personalizable y la arquitectura es muy abierta. Incluye módulos que se pueden adaptar a las necesidades específicas de cada usuario.

VARICAD incluye herramientas para torneado numerico de piezas en metal, librerias de piezas mecanicas estandard (ANSI, DIN) y simbolos, herramientas de calculo y lista de materiales “bill of materials” (BOM).

Puede leer y escribir archivos STEP, STL, IGES, DWG y archivos DXF (estos 2 ultimos de AutoCAD).

Lo pueden descargar de (en paquete DEB para Ubuntu):

Descargar para Ubuntu 64 bits

Descargar para Ubuntu 32 bits

Nota: Arriba esta un screenshot de la version libre, pero los links son version completa.

Abril 1, 2009

Comprobar infeccion de Conficker C en una red Windows usando NMAP en Ubuntu

Archivado en: Linux Ubuntu Administracion, Linux Ubuntu Basico — Abelardo Jara @ 11:29 am

La ultima version of nmap (http://pintucoperu.wordpress.com/2008/07/04/usando-nmap-para-monitorizar-los-puertos-de-nuestro-sistema/) puede escanear nuestra red for actividad de malware en maquinas Windows. Personalmente no estoy a favor de usar Windows, sin embargo, si uno tiene una red con maquinas Windows y desea verificar si alguna esta infectada, estas instrucciones son de utilidad. Incluso ahora con el temido worm Conficker C.

Este virus solo afecta a maquinas Windows, no afecta a Linux (ni Ubuntu).  Este gusano (worm) tiene nombre C que ha registrado una alta tasa de propagación en los últimos días a través del puerto 445 y explotando una vulnerabilidad solucionada por Microsoft el pasado 23 de octubre. A continuación se puede ver el aumento de tráfico en el puerto mencionado, a través informes de ISC SANS.

Trafico de puerto 445 en final Marzo 2009

Trafico de puerto 445 en final Marzo 2009

Nmap puede detectar algunos falsos positivos de maquinas infectadas con Conficker C pero de todas formas nos ayuda a rapidamente saber que maquinas pueden tener instalado este worm. Bueno, aqui tratare de presentar los pasos:

Primero, descargen la ultima version de NMAP de aqui:  http://nmap.org/dist/nmap-4.85BETA6.tgz

Descargarlo en algun directorio como tu directorio HOME y descomprimelo:

$ tar xzvf nmap-4.85BETA6.tgz

Tipea los siguientes comandos:
$ cd nmap-4.85BETA6

$ ./configure
$ make

$ sudo checkinstall

Si te da algun error de dependencias, necesitas instalar las librerias faltantes.

Ahora puedes ejecutar este comando para escanear tu red, toma nota que debes cambiar los argumentos para tu red especifica:

$ nmap -PN -d -p445 –script=smb-check-vulns –script-args=safe=1 192.168.5.0/24

En el reporte que te presenta debes buscar por:

smb-check-vulns:
MS08-067: FIXED
Conficker: Likely INFECTED
regsvc DoS: VULNERABLE

Esto te indicara que maquinas tuvieran el problema de este worm y que debes instalar Windows updates o reinstalarlas. Recuerda verificar que no es una falsa alarma, o una opcion mas segura, usar MacOSX o Ubuntu.

Ademas si les interesa, el antivirus NOD32 actualizado puede eliminarlo. Si usan Windows mantener su sistema actualizado a su ultimo Service Pack.

Fuente (acerca del uso de Nmap ultima version): http://beginlinux.wordpress.com/2009/04/01/scanning-for-the-conficker-worm/

Marzo 31, 2009

Instalar RazorSQL 4.5.2 en Ubuntu Linux

Archivado en: Linux Ubuntu Administracion, Linux Ubuntu Basico — Abelardo Jara @ 10:58 pm

http://www.razorsql.com/images/razorsql/main45.jpg

Un programa que es muy bueno para bases de datos SQL es RazorSQL, entre sus funciones estan:

Soporte automatico de busqueda de funciones y metodos, recuperacion automatica de columnas, llaves, plantillas por usuario.

Tiene un editor de consultas SQL para MySQL, PostgreSQL, Oracle, SQL Server, Access, SQLite todo en Ubuntu, nos permite tambien importar y exportar datos visualmente entre estas bases de datos.

Le pueden encontrar aqui:

Servidor Rapidshare

Para instalarlo, solo descomprimen (tiene instrucciones), pero si lo desean tener mas comodo para usarlo, copien la carpeta razorsql a /opt

$ mv razorsql /opt (Esto lo deben hacer en el directorio donde lo descargaron y descomprimieron)

$ sudo gedit /opt/razorsql/razorsql.sh

Editen el contenido del archivo para que quede de esta forma:

  1. !/bin/sh

#./jre/bin/java -Xms64M -Xmx384M -client -jar razorsql.jar
java -Xms64M -Xmx384M -client -jar /opt/razorsql/razorsql.jar
RC=$?
if [ ${RC} != 0 ]; then
echo “Error returned code found. Retrying . . .”
#./jre/bin/java -Xms64M -Xmx384M -client -jar razorsql.jar
java -Xms64M -Xmx384M -client -jar /opt/razorsql/razorsql.jar
fi

Graben y salen:

$ cd ~

$ gedit .bashrc

Y editen su variable de PATH para que quede asi:

export PATH=$PATH:.:/opt/razorsql

(puede ser que tengan mas directorios anhadidos a su variable de PATH, solo necesitamos anhadirla al final)

Cierren y vuelvan a empezar su terminal.

Para ejecutar el programa tipean: $razorsql.sh

:) Espero que les sea util.

Marzo 29, 2009

Como empezar a programar microcontroladores PIC en Ubuntu Hardy

Archivado en: Temas Ingenieria de Computadoras y Electronica — Abelardo Jara @ 10:11 am

Primero, se supone que tienes Ubuntu Hardy o posterior, aunque seguro que funciona con versiones anteriores, también debes tener un programador de los habitualmente utilizados.

Solo tienes que instalar los siguientes paquetes disponibles en los repositorios:

Para programar solo en ASM: gputils, gpsim, piklab
Para programar en C, además de los anteriores: sdcc (Piklab también se integra con otros compiladores C )

Esto lo puedes hacer desde synaptic o mucho más rápido desde una terminal:
_____________________________________________

$ sudo apt-get install gputils gpsim sdcc
_____________________________________________
Ahora tambien necesitas Piklab, el cual puedes descargar el paquete DEB de: http://pikdev.free.fr/

O tambien de: pikdev_1.1.0-1_i386.deb

Descargan el DEB y lo instalan con $ sudo dpkg -i pikdev_1.1.0-1_i386.deb (en caso que usen Ubuntu 64 tambien esta el codigo fuente como .tar.gz pero deberan compilarlo separadamente)

Para programar en BASIC no hay ninguna herramiente opensource (actualizado 23/01/09: ver GCBASIC), pero se puede utilzar el software de SourceBoost, que tiene una versión gratuita, completamente funcional aunque con algunas limitaciones de memoria utilizada y las versiones de pago tienen precios razonables.
BoostBasic corre bajo windows, pero funciona perfectamente integrado en Piklab con Wine:

1- Instalar los paquetes anteriormente mencionados.
2- Instalar wine desde repositorios.
3- descargar y ejecutar el instalador de SourceBoost: SourceBost V 6.90 (También trae un compilador C, otro C++ y Novo, un Rtos para PIC).

Una vez instalado todo lo necesario busca Piklab en el menú “Aplicaciones” y lo lanzas.
Ahora puedes actuar de dos maneras:

- Crear un proyecto (RECOMENDADO) donde indicas el compilador y PIC a utilizar y añadir los archivos utilizados. Una vez que los archivos estan listos, en el menú “construir (Build)” seleccionar “Construir proyecto”…. vuestro archivo .hex ya está listo para ser grabado al pic.

- Compilar un archivo suelto (algunos compiladores requieren abrir un proyecto), entonces no creas ningún proyecto sino que directamente abres el archivo a compilar, tienes que seleccionar el compilador que quieres en el menú abajo a la derecha; luego en el menú “construir (Build)” seleccionar “Compilar archivo” …. vuestro archivo .hex ya está listo para ser grabado al pic.

Ahora tienes que seleccionar el programador que estés usando en el menú de abajo, a la izquierda de los compiladores; entonces darle al icono que se vé un chip con la flechita hacia adentro o hacerlo desde el menú: “Programador – programar”.

Si en vez de seleccionar un programador seleccionas “GPSim” (en el menú de abajo donde los programadores) entras en modo simulación, se activan los iconos de comenzar simulación, avanzar un paso, etc. En la ventana de izquierda, al lado de “proyecto” hay una pestaña donde puedes seleccionar los registros que quieres seguir.
Gpsim también se puede lanzar independientemente de Piklab, ofreciendo más posiblidades.

Un amigo hizo un video de como hacer estos pasos:

Si conocen alguna otra herramienta o prueban estas, por favor, no duden en comentar.
Fuente: http://pic-linux.foroactivo.net/linux-f15/como-empezar-a-programar-pics-en-ubuntu-en-10-minutos-asm-c-basic-t41.htm

Instalar MARS: ensamblador y simulador del procesador MIPS para cursos de Arquitectura de Computadoras en Ubuntu

Archivado en: Linux Ubuntu Basico, Temas Ingenieria de Computadoras y Electronica — Abelardo Jara @ 9:57 am

MARS es un entorno de desarrollo integrado (IDE) liviano para programar con el ensamblador del procesador MIPS y su proposito es para cursos de Arquitectura de Computadora que usen el libro de Patterson y Hennessy’s Computer Organization and Design. Actualmente acaba de salir la version 3.6.

Lista de caracteristicas en esta version

  • Interface grafica con “point-and-click” e IDE integrado

  • Poder editar facilmente valores de registros y de memoria, parecido a una hoja de calculo

  • Muestra valores en decimal o hexadecimal

  • Linea de comandos para el profesor para que pueda evaluar facilmente el programa hecho por el alumno
  • Registros de punto flotante, coprocessor1 y coprocessor2.

  • Ejecucion paso-a-paso con velocidad variable

  • Utilidad para analisis de performance de cache (screenshot).

  • Retroceso (solo un paso)

Para instalarlo en Ubuntu tienes que asegurarte que tienes los repositorios de Getdeb:

Agregar Getdeb en nuestros repositorios de Ubuntu Hardy

Si los tienes, tipea:

$ sudo apt-get update

$ sudo apt-get install mars

Lo ejecutas simple con $ mars, y aqui tienes el resultado:

http://www.getdeb.net/media.php?id=612&type=screens

Bruce Perens propone reducir numero de licencias en software libre

Archivado en: Linux en general — Abelardo Jara @ 9:31 am

Fuente:

Bruce Perens: “Con 4 licencias libres es suficiente”

Bruce Perens, una de las figuras más importantes dentro del movimiento Open Source, publicó recientemente un artículo titulado “How Many Open Source Licenses Do You Need?” en el que expone que sólo necesitamos de 4 licencias diferentes para todo el software de código abierto (open source).

Según el autor, la gran variedad de licencias se debe a que cada empresa adapta alguna de las ya existentes a su caso particular, diversificando, y por tanto haciendo más complejo el mundo de las licencias libres.

Los cuatro tipos de licencias Open Source a las que se refiere el autor del artículo son las siguientes:

- Licencia regalo: Permite reutilizar el código en cualquier caso, ya sea en proyectos abiertos o privativos. Por ejemplo la Licencia Apache.

- Licencia que obliga a compartir: Permite utilizar el código a cualquiera, pero siempre y cuando comparta el resultado de su uso. Por ejemplo la GPL.

- Licencia intermedia: Es un caso intermedio entre los dos tipos anteriores, de forma que puede usarse con software propietario. Un ejemplo sería la licencia LGPL.

- Licencias que tienen en cuenta el “Software as a Service”: Este tipo de licencias protegen el código open source de empresas que no venden el software, pero sacan partido del mismo como servicio. Un ejemplo de este tipo de actuaciones, imaginemos, sería una empresa como Google, que cogiese cierto software de código abierto, lo modificase a sus necesidades y luego ofreciera el resultado en forma de servicio web, obteniendo un beneficio de este software, de forma indirecta, sin necesidad de venderlo. Una licencia ejemplo para este caso sería la Affero GPL.

Por tanto, según Bruce Perens nos bastaría con las siguientes licencias: Apache License 2.0, GNU GPL 3.0, GNU LGPL 3.0 y GNU AGPL 3.0.

Moderniza el look de Firefox en Ubuntu con Stratax Human Theme

Archivado en: Linux Ubuntu Basico — Abelardo Jara @ 9:26 am

Fuente:

Moderniza el look de Firefox 3 en Ubuntu con el Strata Human Theme

El Firefox 3 en Ubuntu trae un tema que no es muy llamativo. Si comparamos el Firefox 3 en Vista, OS X y Linux notaremos que la barra es algo diferente.

Pero hay un theme que podemos añadir al Firefox para que cambie su aspecto y se vea algo mas moderno. Se llama Strata Human 1.0. Para que vean el cambio les dejo las siguientes imágenes:

Firefox 3 por defecto en Ubuntu:

Luego de aplicar el Strata Human Theme:

Puedes descargar el tema apretando el siguiente enlace: Strata Human 1.0.

Marzo 28, 2009

Usando el compilador de Microsoft Visual C++ 2005/2008 en Ubuntu Linux

Archivado en: Programacion C++ en Linux, Programacion C++ en Windows — Abelardo Jara @ 7:51 pm

En Ubuntu Linux ya tenemos GCC 4.2 para programar en C++ pero hay ocasiones en que queremos asegurarnos que nuestro codigo compila tanto en Linux como en Windows. Sin embargo lamentablemente Wine aun no puede ejecutar Microsoft Visual C++ 2005.

Sin embargo, un amigo hizo un truco para poder ejecutar solo el compilador y el enlazador del Visual C++ 2005 bajo Wine y con excelentes resultados, es posible compilar y crear ejecutables desde Linux usando el compilador del Visual C++ 2005.

Su reporte esta aqui:

WineHQ – Visual C++ 8.0 (2005)

Primero lo que necesitamos tener es una instalacion valida de Microsoft Visual C++ 2005 en algun Windows. Necesitaras copiar a tu directorio de Wine los siguientes directorios

  • c:/Program Files/Microsoft Visual Studio 8/VC/include
  • c:/Program Files/Microsoft Visual Studio 8/VC/lib
  • c:/Program Files/Microsoft Visual Studio 8/VC/bin
  • c:/Program Files/Microsoft Visual Studio 8/Platform SDK/Include
  • c:/Program Files/Microsoft Visual Studio 8/Platform SDK/Lib

PASO 0: Verifica que tienes instalado wine

$ sudo apt-get install wine

$ winecfg —-> Elige como version Windows XP y acepta

PASO 1: Primero crea las carpetas de destino dentro de tu instalacion de Wine:

mkdir -p $HOME/.wine/drive_c/Program\ Files/Microsoft\ Visual\ Studio\ 8/VC
mkdir -p $HOME/.wine/drive_c/Program\ Files/Microsoft\ Platform\ SDK\ for\ Windows\ Server\ 2003\ R2/

Debes haber instalado antes Wine y haberlo ejecutado una vez al menos.

PASO 2: Ahora, necesitaras las librerias para ejecutar Visual C++ 2005. Eso lo arreglamos usando Winetricks (ES UN SCRIPT PARA RECUPERAR DLLs de Windows):

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

Le damos permisos de ejecucion:

$ chmod +x ./winetricks

Y si quisieramos ya instalar una determinada libreria, podriamos hacerlo directamente. Por ejemplo:

$ sh winetricks corefonts vcrun6 vcrun2005sp1

PASO 3: Listo, ahora copia el archivo (de la otra maquina o de la particion de Windows):

C:\Program Files\Microsoft Visual Studio 8\CommoN7\IDE\mspdb80.dll —-> a esta carpeta —–> $HOME/.wine/drive_c/windows/system32

PASO 4: Copia las carpetas bin, lib e include que estan dentro de:

c:/Program Files/Microsoft Visual Studio 8/VC/ —–> a esta carpeta ———–>

$HOME/.wine/drive_c/Program\ Files/Microsoft\ Visual\ Studio\ 8/VC

PASO 5: Copia las carpetas Include y Lib que estan dentro de:

c:/Program Files/Microsoft Visual Studio 8/Platform SDK/ ——> a esta carpeta ———–>

$HOME/.wine/drive_c/Program\ Files/Microsoft\ Platform\ SDK\ for\ Windows\ Server\ 2003\ R2/

PASO 6: Marca como ejecutables el compilador y el enlazador de Visual C++ 2005:

chmod +x “/home/[tu nombre de usuario]/.wine/drive_c/Program Files/Microsoft Visual Studio 8/VC/bin/link.exe”

chmod +x “/home/[tu nombre de usuario]/.wine/drive_c/Program Files/Microsoft Visual Studio 8/VC/bin/cl.exe”

PASO 7: Anhade variables necesarias de entorno para Visual C++:

En mi caso anhadi estas lineas a mi .bashrc (tienes que ponerlas cerca de las lineas donde esta definidos PATH, IMPORTANTE: no es anhadirlas al final).

gedit ~/.bashrc y copia y pega esto:

#This is for Visual C++ 2005
export MSVC=”c:/Program Files/Microsoft Visual Studio 8/VC/”
export MSSDK=”c:/Program Files/Microsoft Platform SDK for Windows Server 2003 R2/”
export INCLUDE=”c:/Program Files/Microsoft Visual Studio 8/VC/include:c:/Program Files/Microsoft\Platform SDK for Windows Server 2003 R2/Include”
export PATH=$PATH:”/home/[tu usuario]/.wine/drive_c/Program Files/Microsoft Visual Studio 8/VC/bin”
export LIB=”c:/Program Files/Microsoft Visual Studio 8/VC/lib” #:c:/Program Files/Microsoft Platform SDK for Windows Server 2003 R2/Lib”

alias clc=’cl.exe /c /I”c:/Program Files/Microsoft Visual Studio 8/VC/include” /I”c:/Program Files/Microsoft\Platform SDK for Windows Server 2003 R2/Include” /EHsc ‘

alias cll=’cl.exe /I”c:/Program Files/Microsoft Visual Studio 8/VC/include” /I”c:/Program Files/Microsoft\Platform SDK for Windows Server 2003 R2/Include” /EHsc ‘

Listo graba y sale. Cierra la consola y iniciala de nuevo.

Listo, ahora cuando quieras compilar un programa tipeas

$ cll myprograma.cpp /omyprograma.exe

Espero que les sea muy util.

Y aqui tienen el resultado de un programa compilando en Ubuntu Hardy :)

Compilando un programa con Visual C++ 2005 en Ubuntu Linux

Compilando un programa con Visual C++ 2005 en Ubuntu Linux

Y podemos ejecutar el programa directamente de la linea de comandos con: $wine miprograma.exe

La salida por ejemplo se ve aqui:

Ejecutando el programa con Wine y compilado con Visual C++ 2005

Ejecutando el programa con Wine y compilado con Visual C++ 2005

Si les interesa saber mas de las opciones de linea de cl.exe (el compilador) y link.exe (el enlazador) del Visual C++ 2005, aqui les dejo una tabla:

Para cl.exe:

     /Od
     /D "WIN32"
     /D "_DEBUG"
     /D "_WINDOWS"
     /D "_USE_MATH_DEFINES"
     /D "_CRT_SECURE_NO_DEPRECATE"
     /FD
     /MT
     /Fo"Debug\\"
     /Fd"Debug\vc80.pdb"
     /W2 /nologo
     /c
     /TP
     /errorReport:prompt

Para link.exe:

     /VERBOSE
     /OUT:"Debug\pipmak .exe"
     /INCREMENTAL
     /NOLOGO
     /LIBPATH:"D:\Projects\Lib"
     /LIBPATH:"D:\Projects\Microsoft Platform SDK\Lib"
     /MANIFEST
     /MANIFESTFILE:"Debug\pipmak .exe.intermediate.manifest"
     /NODEFAULTLIB
     /DEBUG
     /ASSEMBLYDEBUG
     /PDB:"d:\Projects\pipmak-SVN\Debug\pipmak .pdb"
     /SUBSYSTEM:WINDOWS
     /MACHINE:X86
     /ERRORREPORT:PROMPT
      vorbisfile_static_d.lib vorbis_static_d.lib ogg_static_d.lib zlib.lib
      physfs.lib opengl32.lib glu32.lib OpenAL32.lib
      SDL_ttf.lib SDL.lib SDLmain.lib SDL_image.lib
      oldnames.lib msvcrtd.lib libcmtd.lib lua50.lib
      kernel32.lib user32.lib gdi32.lib winspool.lib
      comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib

Espero que les sea util :)

Marzo 27, 2009

Extraer el contenido de un archivo RPM sin instalar en Ubuntu

Archivado en: Linux Ubuntu Administracion — Abelardo Jara @ 6:56 pm

Muchas veces necesitamos extraer el contenido de un paquete de instalación de Linux llamados .rpm (de Redhat), en este caso es sufuciente aplicar un comando y podremos extraer todo el contenido del rpm sin necesidad de instalarlo en el sistema operativo.

El comando a utilizar es rpm2cpio que convierte los archivos .rpm en una salida simple de archivos.

Por ejemplo si tenemos ejemplo.rpm y aplicamos el comando:

rpm2cpio ejemplo.rpm | cpio -idmv

Nos extraera todo el contenido de ejemplo.rpm en el directorio en el cual se encuentre.

Notas:  Las opciones del comando rpm2cpio son:
i: Restaura el archivo.
d: Crea los directorios principales si fuese necesario.
m: Mantiene los archivos en el caso que los mismos ya existan.
v: Muestra el progreso.

Instalar LabView 8.5 en Ubuntu Hardy y posteriores

Archivado en: Temas Ingenieria de Computadoras y Electronica — Abelardo Jara @ 8:22 am

Labview proporciona un excelente ambiente grafico de programacion ademas de ser muy poderoso.

Por 20 años los cientificos han estado usando National Instruments LABVIEW,un poderoso ambiente de desarrollo gráfico, para la adquisición de señal, análisis de medición, y la presentación de los datos. LabVIEW también le proporciona la flexibilidad de un lenguaje de programación sin la complejidad de las herramientas de desarrollo tradicionales.

NI LabVIEW es un entorno abierto diseñado para hacer interfaz con cualquier hardware de medición simple. Con los asistentes interactivos, generación de código, y la conectividad a miles de dispositivos, LabVIEW hace que la recopilación de datos lo más simple posible.

Para muchos de nosotros este programa es una herramienta muy importante, pero que tal dejar a un lado windows y usarla en linux . En Linux Ubuntu funciona  a la perfeccion, (no se necesita serial ni licencia)

Labview 8.5 Para Linux

http://cid-db6787a7550c72af.skydrive.live.com/browse.aspx/Programas/LabView%20Linux%208.5
http://rapidshare.com/files/197035561/LV86LINUX.part2.rar

Se le puede encontrar tambien aqui: http://thepiratebay.org/torrent/4410831/LabVIEW_8.5_for_Linux

Labview 8.6 Para Linux

http://cid-db6787a7550c72af.skydrive.live.com/browse.aspx/Programas/LabView%20Linux%208.6

Ademas esta ultima version, incluyo mas paquetes para el desarrollo de sistemas de control como lo son los sistemas PID
Son 3 partes y los links estan aqui:
http://cid-db6787a7550c72af.skydrive.live.com/browse.aspx/Programas/LabView%20Linux%208.6/Control%20Desing%20and%20Simulation%20Module

Tambien esta disponible en Rapidshare:

Aqui estan los links:
http://rapidshare.com/files/197028153/LV86LINUX.part1.rar
http://rapidshare.com/files/197035561/LV86LINUX.part2.rar
http://rapidshare.com/files/197399537/LV86LINUX.part3.rar
http://rapidshare.com/files/197411128/LV86LINUX.part4.rar
http://rapidshare.com/files/197432644/LV86LINUX.part5.rar
http://rapidshare.com/files/197771359/LV86LINUX.part6.rar
http://rapidshare.com/files/197782647/LV86LINUX.part7.rar
http://rapidshare.com/files/197789684/LV86LINUX.part8.rar

Instalacion en Ubuntu Linux (Incluye soporte para AMD64):

Cuando se descarga los paquetes y descomprime generara varios archivos con extension .rpm (para Redhat).

Para poder instalarlo usaremos el siguiente comando:

$ su —-> con esta cambiamos a usuario root

$ rpm2cpio <paquete>.rpm | cpio -idvm

Esto debemos hacerlo paquete por paquete (uno por uno). Al final generara un directorio llamado /usr/local (esto dentro del directorio donde ejecutamos el comando anterior).

Ahora para tener buen orden copiaremos parte de este directorio a un directorio dentro de /opt (/opt es un buen directorio para instalar programas que no son parte del SO, es recomendable que /opt fuera incluso una particion separada, pero esto se debe haber hecho desde cuando se instalo el SO al comienzo).

$ mkdir /opt/labview

$ mv usr/local/natinst /opt/labview

$ mv usr/local/lib /opt/labview

$ exit (regresamos a nuestro usuario normal)

Ahora debemos anhadir Labview a nuestra variable de PATH.

$ cd ~

$ gedit .bashrc

Y modifica las variables PATH y LD_LIBRARY_PATH (anhade estas lineas cerca de donde esten declaradas)

Para LD_LIBRARY_PATH:

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/opt/labview/lib:/opt/labview/lib/LabVIEW-8.5

Para PATH:

export PATH=$PATH:/opt/labview/natinst/LabVIEW-8.5

Graba y sal. Luego cierra el terminal y empieza otro nuevo, puedes ahora tipear:

$ labview

Espero que les sea util. Muchos saludos.

Uso de los paquetes .diff.gz para compilar aplicaciones en Linux/Ubuntu

Archivado en: Programacion C++ en Linux — Abelardo Jara @ 1:07 am

Fuente:

Uso de los ficheros *.diff.gz a la hora de compilar aplicaciones en GNU/Linux

Cuando nos disponemos a descargar paquetes de código fuente de alguna aplicación de los repositorios de Debian, nos percatamos de que nos ofrecen 3 tipos de ficheros distintos:

Paquete.orig.tar.gz -> Es el paquete de fuentes original (Como el autor lo creo, sin modificaciones).
Paquete.diff.gz -> Contiene las modificaciones realizadas por los mantenedores de Debian.
Paquete.dsc -> Fichero de información (Versión, Md5, Firma PGP,…).

No solo en Debian nos encontrarnos con este tipo de ficheros diff.gz, cuando queremos compilar algún software de otras distros podemos encontrarnos con ellos como vemos en la imagen, es algo muy común. Estos ficheros diff.gz añaden, modifican o eliminan cierto código en el paquete de fuentes, ya sea para permitir una compilación sin errores, tapar algún bug, aumentar la seguridad del código fuente, etc..

Esto de retocar los paquetes por parte del equipo Debian, es algo muy común, lo hacen otras distros también, en principio siempre se trata de mejoras, sobre todo en lo relativo a la seguridad, pero a veces no todo sale como se esperaba y en vez de mejorarlos se crean problemas de seguridad. Los paquetes .deb que instalamos al hacer uso de Apt / Aptitude vienen ya previamente parcheados.

Vamos a ver como se aplican estos parches diff.gz a los tarballs que necesitamos parchear, mostraremos un método, pero realmente se puede hacer de muchas y distintas maneras, supongamos que tenemos estos dos ficheros: paquete_0.2.1-2.diff.gz y paquete_0.2.1.orig.tar.gz, el parche lo podríamos aplicar así.

$ tar -zxvf ccze_0.2.1.orig.tar.gz
$ cd ccze-0.2.1/
$ zcat ../ccze_0.2.1-2.diff.gz | patch -p1

En pantalla se nos mostraran frases con “patching file XXXX”. Una vez parcheado podemos proceder a la compilación.

Marzo 26, 2009

Optimizar el uso de bateria en Ubuntu

Archivado en: Linux Ubuntu Administracion, Linux Ubuntu Basico — Abelardo Jara @ 12:02 pm

Fuente: http://onoametal.wordpress.com/2009/01/20/maximiza-el-consumo-de-energia-en-ubuntu/

Siempre ví como desventaja (por lo menos en mi caso) que cuando usaba mi portatil con Windows (gracias a Dios no lo volví a hacer) la batería me duraba alrededor de 2 horas, pero con Ubuntu escasamente llegaba a la hora y media. Pero existen varias herramientas que combinadas me dieron algo mas de dos horas de batería en Ubuntu, a continuación:

- Powertop

Es una herramienta que diagnostica y te da soluciones sobre esas cosas que hacen que tu equipo consuma mucha energía. Lo instalas con un sencillo

sudo apt-get install powertop

Lo ejecutas con

sudo powertop

Y llegarás a una ventana como esta, solo sigue las recomendaciones en pantalla

- Reducir el swap

Podemos reducir la cantidad de memoria swap que usa nuestro Ubuntu, siguiendo estos pasos:

Consultamos el valor inicial de swap

sudo cat /proc/sys/vm/swappiness

Si nos muestra 60, lo debemos cambiar a 10. Si ya dice 10, deja así…

sudo sysctl -w vm.swappiness=10

Lo probamos a ver que tal va, y si nos parece bien hacemos que el cambio sea definitivo abriendo el archivo

sudo gedit /etc/sysctl.conf

Y agregando esta línea al final

vm.swappiness=10

- Ubuntu Tweak

Este ya lo había explicado en otro post. Incluye herramientas de gestión de energía. Puede ser útil…

- Kpowersave

Es una herramienta de consumo de energía diseñada para entornos KDE (personalmente no recomiendo usarla en Ubuntu, pero si, en caso uses Kubuntu)

sudo apt-get install kpowersave

Y una vez hecho esto podemos configurar la gestión de energía según el portatil  este o no conectado a la corriente (por ejemplo, y entre muchas opciones)

NOTA IMPORTANTE (Por Abelardo): Hay un problema entre el script powertop de Intel y los scripts de administracion de bateria de Ubuntu (pm-utils).

Por defecto pm-utils sobreescribe los valores que powertop escribe. En particular tenemos el problema con que Powertop sugiere incrementar dirty writeback centisecs:

Suggestion: increase the VM dirty writeback time from 5.00 to 15 seconds with:
echo 1500 > /proc/sys/
vm/dirty_writeback_centisecs
This wakes the disk up less frequenty for background VM activity

Q – Quit R – Refresh W – Increase Writeback time

El problema es que aunque lo activamos, cuando reiniciamos Ubuntu vuelve a estar el valor anterior, para hacer permanente esta recomendacion, editamos:

$  sudo gedit /usr/lib/pm-utils/power.d/laptop-tools

Buscamos esta seccion:

echo “**SetLowPower OFF”
DISK_IDLE_SECS=0
DIRTY_WRITEBACK=500
DIRTY_EXPIRE=3000
DIRTY_RATIO=40
DIRTY_BACKGROUND_RATIO=10
setlowpowermode

Y cambiamos DIRTY_WRITEBACK=500 a DIRTY_WRITEBACK=1500

Grabamos y salimos. Listo, esto resuelve el problema.

Entradas más antiguas »

Blog de WordPress.com.