26/1/09

Personalizando Xterm

Xterm es una terminal muy liviana que se ejecuta en X (al igual que aterm y mrxvt ), viene en un tamaño reducido de fuentes y en algunos casos, con un color de fondo blanco (que mata la vista), dispone de un "menú" que pueden acceder presionando ctrl + click der. las fuentes pueden agrandarse presionando shitf + y para achicar shift -
Si miran el man de xterm, van a encontrar que pueden configurar el color, tipo de fuentes, tamaños de fuentes y mucho mas.

Lo primero que deben decidir es la fuente y el tamaño que pondran en xterm. Se pueden ayudar con la herramienta: xfontsel

Esto abrira un X window donde podrán elegir el tipo de fuente y tamaño. Una vez decididos nos dará un resultado como:
-*-fixed-medium-r-*-*-18-*-*-*-*-*-iso8859-*
Podemos probar la nueva configuración escribiendo en la terminal:
xterm -font -*-fixed-medium-r-*-*-18-*-*-*-*-*-iso8859-* -geometry 70x24
Pero esto es muy tedioso hacerlo cada vez que iniciamos xterm. Asi que podemos crear un alias ingresando las siguientes lineas en el .bashrc o en .bash_profile .
alias xterm='xterm -font -*-fixed-medium-r-*-*-18-*-*-*-*-*-iso8859-* -geometry 70x24'
Hay otra forma mejor de hacer esto y es pasando parametros al Xserver para que sepa cómo mostrar xterm cuando lo ejecuta. Creen el archivo (si no existe) '.Xresources' en su home, copien/peguen o escriban las siguientes líneas:
xterm*background: black
xterm*foreground: white
xterm*font: 10x20
xterm*scrollBar: true
xterm*leftScrollBar: true
xterm*saveLines: 20000
xterm*cursorColor: yellow
si quieren algo mas personalizado copien/peguen o escriban:
xterm*font: -*-fixed-medium-r-*-*-18-*-*-*-*-*-iso8859-*
xterm*font1: -*-*-*-*-*-*-2-*-*-*-*-*-*-*
xterm*font2: -misc-fixed-*-r-normal-*-8-*-*-*-*-*-iso8859-*
xterm*font3: -b&h-lucidatypewriter-bold-*-*-*-12-*-*-*-*-*-*-*
xterm*font4: -*-screen-bold-r-normal-*-16-*-*-*-*-*-iso8859-*
xterm*font5: -*-lucidatypewriter-medium-*-*-*-18-*-*-*-*-*-*-*
xterm*font6: -*-lucidatypewriter-medium-*-*-*-20-*-*-*-*-*-*-*
xterm*font7: -dec-terminal-bold-r-normal-*-14-*-*-*-*-*-iso8859-*

XTerm*background: white
XTerm*foreground: black
XTerm*pointerColor: red
XTerm*pointerColorBackground: black
XTerm*cursorColor: navy
XTerm*internalBorder: 3
XTerm*loginShell: true
XTerm*scrollBar: false
XTerm*scrollKey: true
XTerm*saveLines: 1000
XTerm*multiClickTime: 250
Para copiar/pegar en Linux, sombréen el texto en cuestión, luego con el botón izquierdo del ratón, pónganlo donde quieren que empiece, y aprieten la ruedita del medio del ratón para que pegue.

Para activar este cambio en el terminal, como usuario escriban:
xrdb -merge /home/tu_nombre_de_usuario/.Xresources
Cierren el terminal y vuelvan a lanzarlo o pueden ahorrarse todo esto y hacer un logout/login (salir y entrar de las X), en otras palabras, para salir = ctrl + alt + tecla de retroceso (backspace) para entrar= startx o login: nombre de usuario/contraseña

También pueden (pre)setear las fuentes del menú de xterm:
#--[/etc/X11/app-defaults/XTerm]--------
....
*fontMenu.Label: VT Fonts
*fontMenu*menuLabel.font: -adobe-helvetica-bold-r-normal-*-*-80-*-*-*-*-iso8859-*
*fontMenu*font: -adobe-helvetica-medium-r-normal-*-*-80-*-*-*-*-iso8859-*
*fontMenu.menuLabel.foreground: deepskyblue1
*fontMenu*fontdefault*Label: Predefinito
*VT100*font: 7x13euro
*fontMenu*font1*Label: Illeggibile
*VT100*font1: nil2
*IconFont: nil2
*fontMenu*font2*Label: Micro
*VT100*font2: 5x7
*fontMenu*font3*Label: Piccolo
*VT100*font3: 6x12
*fontMenu*font4*Label: Medio
*VT100*font4: fixed
*fontMenu*font5*Label: Grande
*VT100*font5: 8x16
*fontMenu*font6*Label: Esagerato...
*VT100*font6: 9x15
*fontMenu*fontescape*Label: Sequenza Escape
*fontMenu*fontsel*Label: Selezione
!fontescape and fontsel overridden by application
*fontMenu*font-doublesize*Label: Ingrossa caratteri
*fontMenu*font-loadable*Label: VT220 Soft Fonts
....
Bueno, esto se extendió demasiado, nos vemos... o no!

25/1/09

Smart Pointers

En C++, uno de los problemas más frecuentes, son los memory leaks ocasionados por no liberar la memoria dinámica. A diferencia de otros lenguajes de programación (como Java) C++ no tiene un Garbage Collector que se ocupe de liberar las posiciones de memoria no utilizadas. Pero tiene una técnica muy eficiente llamada Smart Pointers, que evita a los programadores la tediosa tarea de liberar la memoria, y por ende mucho tiempo de debugging.

La memoria se encuentra dividida en:
  • El stack (o pila). Que es la memoria asignada por el sistema operativo al programa ni bien se ejecuta. Su tamaño es conocido en tiempo de compilación y es estático, no puede cambiarse en tiempo de ejecución.
  • El heap (o montículo). Que es la memoria asignada dinámicamente al programa por el sistema operativo en tiempo de ejecución. Sirve para almacenar objetos cuya existencia no es conocida en tiempo de compilación. Su tamaño puede variar a medida que el programa solicite/libere memoria.

La memoria del heap (la memoria dinámica) sirve para solicitar memoria en tiempo de ejecución. Y se puede solicitar en C++ a través de los punteros.

Esta memoria, debe ser siempre liberada cuando deja de utilizarse. Es decir, cuando creamos un objeto en el heap, estamos ocupando lugar en la memoria, si después no lo liberamos, se va a provocar un leak de memoria.

Claro que con la potencia de las CPUs hoy en día, un leak de memoria no es muy significativo… Pero si esto ocurre con más objetos y de mayor tamaño, los leaks de memoria van a hacer al programa cada vez más lento hasta terminar abruptamente.

Para solucionar esto, en lenguajes como Java, existe el Garbage Collector, que es un proceso en background que va recorriendo la memoria y buscando posiciones de memoria no asociadas con ninguna variable/constante del programa, para finalmente liberarlas. Obviamente es más ineficiente que liberar la memoria manualmente, ya que tiene que haber un proceso recorriendo la memoria. Y además trae muchas otras complicaciones, porque la memoria no es liberada inmediatamente que un objeto sale de su scope, sino que cuando el Garbage Collector lo decida.

Bueno, en C++, para evitar que los programadores tengan que liberar la memoria solicitada, existen los Smart Pointers (o punteros inteligentes) que son un patrón de diseño que sirve para que los punteros se liberen automáticamente sin que tengamos que hacerlo nosotros.

Los Smart Pointers se basan en el idioma RAII (pueden ver más información sobre RAII en el artículo de RAII). Básicamente se trata de encapsular un puntero en un stack object, actuando este como un “wrapper” para el puntero. Implementando su constructor para que cree el puntero y su destructor para que lo destruya. Además implementa algunos operadores como * y -> para simular un puntero común y corriente.

Como ya sabemos, los stack objects, son objetos que se crean en el stack, y por ende son destruidos automáticamente al salir de su scope (al contrario de los que se crean en el heap que deben ser destruidos por el programador). Bueno, los Smart Pointers se aprovechan de esto, para encapsular un puntero dentro de un stack object. De esta manera cuando el stack object sea eliminado, también va a ser eliminado el puntero que tiene asociado.

Veamos una implementación de Smart Pointers bien sencilla:

  1. template <class T>
  2. class SmartPointer {
  3. private:
  4. T *pointer;
  5. public:
  6. SmartPointer(T *p) {
  7. pointer = p;
  8. }
  9. ~SmartPointer() {
  10. delete pointer;
  11. }
  12. T * operator ->() {
  13. return pointer;
  14. }
  15. T & operator *() {
  16. return *pointer;
  17. }
  18. };

Por otra parte, tenemos la clase Persona:
  1. class Persona {
  2. private:
  3. char nombre[32];
  4. public:
  5. Persona(char *n) {
  6. strcpy(nombre, n);
  7. cout < < "Mi nombre es " <<>
  8. }
  9. void gritar(char *grito) {
  10. cout << class="string">"!!!!!!!!!!!!" <<>
  11. }
  12. ~Persona() {
  13. cout << "Me mueroooooooooooo" <<>
  14. }
  15. };
Y ahora, vamos a crear el Smart Pointer para la clase Persona:
  1. int main() {
  2. SmartPointer persona(new Persona("pepe"));
  3. persona->gritar("aggghhhhhhhhhhh");
  4. return 0;
  5. }
Como podrán ver, creamos un objeto Persona en el heap (un puntero) y después utilizamos uno de sus métodos. Pero en ningún momento liberamos el objeto con delete. Sin embargo, si ejecutan el código, verán que el objeto se destruye sólo gracias al Smart Pointer:
Esto se debe a que, como dijimos antes, utilizamos a un stack object (SmartPointer) como “wrapper” para el puntero Persona. De esta manera, cuando el stack object salga de su scope y se destruya, va a destruir también al puntero que tiene asociado.

En la STD viene incluido un template para Smart Pointers llamado auto_ptr. Por otro lado, en Boost, hay otras implementaciones más poderosas. Que se dividen en tres tipos:

Scoped Pointers: Prácticamente lo mismo que auto_ptr de la STD, pero implementa la clase noncopyable para que el objeto no pueda ser copiado.

Shared Pointers: Pueden ser copiados, y tienen un contador del número de copias que tienen. Se destruyen sólo cuando el contador llega a cero (no queda ninguna copia).

Intrusive Pointers: Parecido a los Shared Pointers, sólo que el contador lo tiene el objeto que encapsula, y no el Smart Pointer.

Los Smart Pointers son muy poderosos, y pueden ser tan útiles como peligrosos si no se utilizan correctamente. Es recomendable utilizar las implementaciones de Boost, que están bien implementadas y son thread-safe. Aunque también hay muchas implementaciones libres por ahí sueltas muy buenas también.

Extraído de http://sherekan.com.ar

24/1/09

Ejecuta aplicaciones Linux en Windows de forma remota

SSH es una herramienta poderosa, si dispones de una conexión SSH a un ordenador remoto, puedes hacer casi todo. SSH funciona muy bien en situaciones en las que el ancho de banda disponible es escaso, como en conexiones vía modem o cuando la red (o el servidor remoto) está muy saturado. Tambien ofrece la posibilidad de administrar un sitio remoto de forma gráfica. Xming (es un free X Window server para Windows) es un proyecto de FreeDesktop que permite conectarnos a un servidor Linux de forma gráfica desde una máquina Windows. En particular, Xming instalará en Windows un servidor X, sin necesidad de Cygwin/X. Cuando nos conectemos al servidor Linux, éste enviará a nuestro X server (en Windows) las instrucciones necesarias para renderizar los gráficos necesarios y mostrar las aplicaciones gráficas que hayamos solicitado. Es decir, no se enviarán bitmaps (como en VNC) sino las instrucciones necesarias para dibujar en local (en Windows) esos bitmaps.
Bueno qui los pasos:
  1. Descarga Xming de esta URL o de esta otra por supuesto para windows (selecciona la versión mas reciente)
  2. Instalarlo (yo lo instale full, el que no quiera seleccione su opción)
  3. Ya instalado, vamos a inicio -> progrmas -> Xming -> Xlaunch (y seleccionamos las opciones de acuerdo a nuestra necesidades) o Xming (para lanzarlo sin elegir opciones)
  4. Ejecutamos un cliente PUTTY con las opciones siguientes: vamos a connection -> SSH -> X11 -> habilitar la opción que dice: Enable X11 forwarding
  5. Completar el campo con la ip de nuestro servidor linux
  6. Ingresar al sistema
  7. Ejecutar alguna aplicación como firefox o xeyes...
En caso de estar desde un cliente linux corriendo ya un X Server no tendriamos que instalar nada solo tipear en la consola:
ssh -v -X -C xxx.xxx.xxx.xxx (-X para X11 forwarding, -C para compresion y -v es verbose)
OBS: en caso de que no funcione revisar si esta habilitado X11Forwarding en la PC servidor, esto lo podemos ver haciendo
sudo vim /etc/ssh/sshd_config
Aca dejo un screenshot:

Cualquier duda consulten!!!

22/1/09

Colorear el Prompt en Bash

Bueno veamos, la configuración del prompt de bash se guarda en dos variables del entorno:
  1. $PS1 --> acá se guarda el primer prompt (en gral. usuario@host:$)
  2. $PS2 --> acá se guarda la configuracion del segundo prompt (en gral > y se "activa" poniendo \) 
Para ver su contenido podemos escribir en la consola:
echo "Bash PS1 variable:" $PS1
obteniendo algo similar a:
Bash PS1 variable: ${debian_chroot:+($debian_chroot)}\u@\h:\w\$
Para ver el segundo prompt igualmente hacemos:
echo "Bash PS2 variable:" $PS2
obteniendo algo similar a:
Bash PS2 variable: >
Ahora los significados que obtuvimos en la primer salida (PS1) son estos:

Bash special characterBash special character explanationBash special characterBash special character explanation
\aan ASCII bell character (07) \dthe date in "Weekday Month Date" format (e.g., "Tue May 26")
\]end a sequence of non-printing characters \ean ASCII escape character (033)
\hthe hostname up to the first `.' \Hthe hostname
\jthe number of jobs currently managed by the shell \lthe basename of the shell's terminal device name
\nnewline \rcarriage return
\sthe name of the shell, the basename of $0 (the portion following the final slash) \tthe current time in 24-hour HH:MM:SS format
\Tthe current time in 12-hour HH:MM:SS format \@the current time in 12-hour am/pm format
\Athe current time in 24-hour HH:MM format \uthe username of the current user
\vthe version of bash (e.g., 2.00) \Vthe release of bash, version + patchelvel (e.g., 2.00.0)
\wthe current working directory \Wthe basename of the current working directory
\!the history number of this command \#the command number of this command
\$if the effective UID is 0, a #, otherwise a $ \nnnthe character corresponding to the octal number nnn
\\a backslash \[begin a sequence of non-printing characters, which could be used to embed a terminal control sequence into the prompt
\D{format}the format is passed to strftime(3) and the result is inserted into the prompt string; an empty format results in a locale-specific time representation. The braces are required

Luego de que el usuario ingresa en el sistema sus variables de entorno son inicializadas desde varios archivo:
global system files /etc/profile or /etc/bashrc
user files ~/.bash_profile , ~/.bash_login , ~/.profile , ~/.bashrc or ~/.bash_logout.
Es importante saber que todas las variables de entorno del usuario tiene un tiempo de vida igual al de la sesion. Cuando la sesion es cerrada, las variables definidas durante la sesión, son eliminadas y deben ser redefinidas al iniciar sesion nuevamente.

Luego de esta breve introducción, veamos como colorear: la sintaxis para cambiar los colores en bash es la siguiente:
\033[ -> Indica el comienzo del color en el texto
x;yzm - Indica el código del color
\033[00m - Indica el final del color en el texto
Los códigos de los colores pueden encontrarlos en el articulo: Colorear texto al hacer printf o cout

Para comenzar probando podemos tipear:
export PS1="\033[01;31mBASH IN RED\033[00m: "
y ver el resultado, aqui otro ejemplo:
export PS1="\u@\h [\$(ls | wc -l)]:\$ "
Una vez que experimentamos lo suficiente, y decidimos nuestro esquema, por ejemplo:
export PS1='${debian_chroot:+($debian_chroot)}\[\033[01;36m\]\u@\h\[\033[00m\]:\[\033[00;35m\]\w\[\033[00m\]\$ '
debemos hacer que los cambios sean permanentes: lo que hacemos es agregar la linea anterior al final del .bashrc

Pueden ver mas info aqui.

21/1/09

Edicion del Registro de Windows

Hace algunos dias, tuve que reparar una PC infectada con windows, ejem!, digo con virus! y me encontre que este, habia deshabilitado dos herramientas fundamentales para su eliminacion:
  1. El editor de registro
  2. El administrador de tareas
Para habilitar el editor de registro, creamos un archivo de nombre algo.reg (en realidad el nombre puede ser cualquiera, lo que importa es la extension) y copiar el siguiente contenido dentro del archivo:

Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\System]
"DisableRegistryTools"=dword:00000000

[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\System]
"**.del.DisableRegistryTools"=-

[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Group Policy Objects\LocalUser\Software\Microsoft\Windows\CurrentVersion\Policies\System]
"DisableRegistryTools"=dword:00000000

[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Group Policy Objects\LocalUser\Software\Microsoft\Windows\CurrentVersion\Policies\System]
"**del.DisableRegistryTools"=-

[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer]
"NoSaveSettings"=dword:00000000
Guardamos los cambios del archivo, y lo añadimos al registro (con un doble click)

Para habilitar el administrador de tareas, de forma similar a lo que hicimos anteriormente pero cambiamos el contenido del archivo por el siguiente:

Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\System]
"DisableTaskMgr"=dword:00000000

Eso es todo!