From Fedora Project Wiki

< FWN‎ | Beats

No edit summary
No edit summary
 
(12 intermediate revisions by the same user not shown)
Line 1: Line 1:
=== Ruby Capítulo 1: El primer contacto ===
{{Anchor|LATAM}}


"Yo quería un lenguaje de programación más poderoso que Perl y más orientado a objetos que Python. Entonces me acordé de mi viejo sueño y decidí diseñar mi propio lenguaje. Al principio estuve jugando con él en el trabajo. Gradualmente creció lo suficiente como para remplazar a Perl. Lo llamé Ruby en honor a esa piedra preciosa roja y lo liberé al público en 1995."
== LATAM Fedora! ==


Yukihiro Matsumoto, a.k.a. ``Matz''
LATAM Fedora is a regular column of Spanish language contributions around open source software. It is our first expansion into incorporating foreign language content into FWN.
Japan, October 2000


==== Aprovechando el espacio ====
This week's contribution is from [[User:gomix|Guillermo Gómez]], a review of the dwm window manager.  Enjoy!


Para comenzar en Fedora con Ruby vamos instalar lo mínimo necesario y sin perder mucho espacio dando vueltas con teoría y opiniones, directo al grano. Abra una sesión de emulación de terminal preferida y siga las siguientes instrucciones para instalar. En la medida que desarrollemos esta columna dedicada a Ruby, entonces iremos descubriendo el poder y flexibilidad de Ruby.
=== dwm ===


<code>
<code>
$ su -
# yum install dwm
<contraseña de root>
# yum install ruby ruby-rdoc ruby-ri
</code>
</code>


Para el editor, hay muchas opciones, mi editor de preferencia es Vim , pero puede usar el de su preferencia, intente usar alguno que pueda resaltar sintaxis Ruby como mínimo. Puede escoger desde entornos tan complejos y completos como Eclipse, hasta editores de escritorio GUI como Gedit, o simples en consola como nano o complejos y sofisticados como Vim y Emacs.
Cuando se intenta organizar ventanas en otros entornos de escritorio, la mayoría son una pesadilla, pruebe dwm, hiperligero, sólo para geeks. dwm consiste de un único binario de 54k (el distribuido por Fedora) que sólo se puede personalizar recompilando los fuentes. Ya veremos más adelante que en Fedora esto se puede hacer fácilmente.


==== Los "Hola mundo" ====
Al comenzar ni sabrá cómo arrancar su primera aplicación, la documentación (man dwm) dice Mod4-Shift-Return para arrancar uxterm, eso se traduce usualmente a:


La primera forma interactiva simple de ejecutar comandos Ruby es simplemente usar el intérprete, simplemente ejecute el intérprete, ingrese los comandos y termine presionando Ctrl-D para indicarle al intérprete que la entrada de comandos ha finalizado:
TeclaWin+Shift+Enter
 
    uxterm es un envoltorio para xterm, un emulador de terminal para X, ambos provistos por el paquete xterm.
 
A partir de ahí puede arrancar sus aplicaciones, si, desde un terminal, no olvide agregar el & para dejarla en el fondo, por ejemplo.


<code>
<code>
$ ruby
$ totem &
puts "Hola Mundo"
<Ctrl-D>
Hola Mundo
</code>
</code>
dwm-user¶


La segunda forma interactiva es con irb. irb es el acrónimo para Interactive Ruby. irb es un shell Ruby, es decir, es un espacio donde puede evaluar su código al instante. En próximas ediciones iremos desarrollando más el tema de irb, por ahora simplemente invoque a irb e intente:
dwm-user incluye los fuentes de dwm y el guión de arranque dwm-start.


<code>
<code>
$ irb
# yum install dwm-user
irb(main):001:0> puts "Hola Mundo"
Hola Mundo
=> nil
irb(main):002:0>exit
$
</code>
</code>


Si lo que quiere es crear un programa Ruby que nos imprima "Hola Mundo" en la salida del monitor, lance su editor e incluya el siguiente código fuente en un archivo denominado holamundo.rb., guarde y salga de su editor.
==== Login ====


===== holamundo.rb =====
El paquete dwm provee una entrada /usr/share/xsessions/dwm.desktop y el paquete dwm-user incluye /usr/share/xsessions/dwm-user.desktop. La única diferencia es el modo de arranque.


1 puts "Hola Mundo"
===== dwm.desktop =====


Para ejecutar simplemente pásale al intérprete Ruby el archivo como argumento.
[Desktop Entry]
Type=Application
Encoding=UTF-8
Name=dwm
GenericName=Window Manager
Comment=Dynamic window manager for X
Exec=dwm
Terminal=false
TryExec=dwm


<code>
[Window Manager]
[gomix@fricky capitulo_1]$ ruby holamundo.rb
SessionManaged=true
Hola Mundo
</code>


También puede usar el método "shebang" y convertir el archivo fuente Ruby en ejecutable del sistema, edite su holamundo.rb para que luzca como se muestra en el listado a continuación.
===== dwm-user.desktop ======


===== holamundo.rb =====
[Desktop Entry]
Type=Application
Encoding=UTF-8
Name=dwm-user
GenericName=Window Manager
Comment=Dynamic window manager for X (user configuration)
Exec=dwm-start
Terminal=false
TryExec=dwm-start


<code>
[Window Manager]
1 #!/usr/bin/ruby
SessionManaged=true
2
3 puts "Hola Mundo"
</code>
</code>


<code>
dwm-start es el método de arranque preferido para DWM en Fedora ya que entonces podrá personalizar su entorno, esto significa compilar su versión de DWM con su versión de las cabeceras en su directorio personal sin intervención manual, ¡cool!.
[gomix@fricky capitulo_1]$ chmod +x holamundo.rb
 
[gomix@fricky capitulo_1]$ ./holamundo.rb
=== Keybindings ===
Hola Mundo
</code>


Existe la forma de pasarle directamente código Ruby al intérprete sin apoyo de archivos o programas adicionales y sin entrar en modo interactivo.
==== Layouts ====


<code>
* Mod4-t Poner la disposición tiled (cuadros).
$ ruby -e 'puts "Hola Mundo"'
Hola Mundo
</code>


==== Ruby es un lenguaje de programación orientado a objetos ====
* Mod4-f Poner la disposición a floating (flotante).


Todo lo que usted manipula en Ruby es un objeto, y los resultados de dichas manipulaciones a su vez, también son objetos. Cuando usted escribe código orientado a objetos normalmente está modelando conceptos del mundo real en su código. Típicamente durante este proceso de modelado usted descubrirá categorías de cosas que necesitan ser representadas en código. En un reproductor de música el concepto de "canción" puede ser una de esas categorías. En Ruby usted define una clase para representar cada una de esas entidades. Una clase es una combinación de estado, por ejemplo el nombre de la canción, y métodos que usan dicho estado, por ejemplo para reproducir la canción.
* Mod4-m Poner la disposición a monocle (monóxulo).


Una vez que tiene dichas clases usted creará instancias de dicha clase. Para el reproductor de música que contiene la clase Cancion usted terminará teniendo instancias separadas independientes para canciones populares como "Todo o nada", "Canción para un amigo", "Amanecer llanero", y por el estilo. La palabra objeto e instancia son intercambiables. En Ruby para crear dichas instancias u objetos, se debe llamar a un método constructor de la clase, el método constructor estandar se llama new.
* Mod4-Shift-space Conmuta la disposición de estado de la ventana enfocada entre tiled y flotante.


<code>
==== Navegar entre ventanas ====
1 cancion1 = Cancion.new("Amanecer llanero")
2 cancion2 = Cancion.new("Todo o nada")
</code>


Estas instancias son derivadas de la misma clase pero tienen características únicas. Primero, cada objeto tiene un object_id único. Segundo, usted puede definir variables de instancia, variables con valor que son únicos para cada instancia. Estas variables de instancia mantienen el estado del objeto. Igualmente puede definir métodos de instancia para acceder y/o alterar el estado del objeto, es decir, acceder y/o alterar las variables de instancia. Rápidamente definamos nuestra clase Cancion. Ruby se puede leer fácilmente.
* Mod4-j Cambiar/enfocar la próxima ventana.


<code>
* Mod4-k Cambiar/enfocar la ventana previa.
1 class Cancion
2  def titulo
3    @titulo
4  end
5
6  def titulo=(titulo_de_la_cancion)
7    @titulo = titulo_de_la_cancion.to_s
8  end
9 end
</code>


Claramente podemos ver y leer que hemos definido la clase de nombre Cancion con dos métodos de instancia, titulo y titulo=. La variable de instancia se representa en @titulo , con la notación de nombre de variable en minúscula precedida del símbolo @ .
* Mod4-Tab Cambia a los tags previamente seleccionados.


Note la indentación que hemos implementado para representar la estructura, dos espacios es cómun entre los Rubyeros (me gusta llamarlos así).
==== Area maestra ====


Es evidente que la plabra clave class establece el inicio de un bloque que se cierra con end para definir una clase con nombre, en este ejemplo Cancion. Dentro de dicha estructura también podemos identificar claramente la palabra clave def que igualmente define bloques que se cierran también con la palabra clave end. def define dos métodos de instancia en este ejemplo. Hablaremos más de def de forma recurrente en muchas ediciones de esta columna.
* Mod4-h Decrementa el tamaño del área maestra.


Podemos probar nuestra clase en irb fácilmente, por ahora tipee con cuidado para no equivocarse, luego le ofreceré más técnicas irb.
* Mod4-l Incrementa el tamaño del área maestra.


<code>
* Mod4-Return Cicla/aumenta la ventana enfocada desde/hacia el área maestra (sólo en disposición de cuadros).
1 $ irb
2 >> class Cancion
3 >> def titulo
4 >> @titulo
5 >> end
6 >> def titulo=(titulo_de_la_cancion)
7 >> @titulo = titulo_de_la_cancion.to_s
8 >> end
9 >> end
10 => nil
11 >> cancion1 = Cancion.new
12 => #<Cancion:0xb76e25c8>
13 >> cancion1.titulo="Alma llanera"
14 => "Alma llanera"
15 >> cancion1.titulo
16 => "Alma llanera"
</code>


==== Pero no necesito clases ====


También se puede usar Ruby del modo procedimental, funcional, sin necesidad de crear (explícitamente) clases y objetos.
==== Salir/cerrar ====


<code>
* Mod4-Shift-c  Cerrar la ventana enfocada.
1 $ irb
2 >> 2 + 2
3 => 4
</code>


Pero igual note que estamos trabajando con objetos de alguna clase, en nuestro ejemplo Fixnum.
* Mod4-Shift-q  Salir de dwm.


<code>
==== Poniendo los tags a las ventanas ====
1 >> 2.class
2 => Fixnum
</code>


Puede definir métodos y llamarlos:
* Mod4-Shift-[1..n] Aplica el tag n a la ventana enfocada.


<code>
* Mod4-Button1-tagicon Aplica el tag n a la ventana enfocada (haga clic en la barra con botón izquierdo)
1 >> def saludo
2 >> puts "Hola Mundo"
3 >> end
4 => nil
5 >> saludo
6 Hola Mundo
7 => nil
</code>


==== Clases base ====
* Mod4-Button2-tagicon Agrega el tag n a la ventana enfocada (haga clic en la barra con botón derecho)


Ya que "todo" son objetos de alguna clase, más vale que comencemos por aprender las más fundamentales del lenguaje, Fixnum, Bignum, Float, String, Array y Hash.
* Mod4-Shift-0 Aplica todos los tags a la ventana enfocada.


Números... Fixnum, Bignum, Float
==== Dos pantallas ====


Enteros, dejemos que nuestro código Ruby hable.
* Para enviar una app de una pantalla a otra tiene las siguientes tres opciones:
  * En modo flotante, se puede simplemente arrastrar la ventana de una pantalla a otra.
  * Mod4-Shift-, envía la ventana con el foco a la pantalla previa, si hay alguna.
  * Mod4-Shift-. envía la ventana con el foco a la próxima pantalla, si hay alguna.


<code>
==== dmenu: lanzador de aplicaciones ====
1 >> num = 8
2 => 8
3 >> 7.times do
4 ?> print num.class, " ", num, "\n"
5 >> num *= num
6 >> end
7 Fixnum 8
8 Fixnum 64
9 Fixnum 4096
10 Fixnum 16777216
11 Bignum 281474976710656
12 Bignum 79228162514264337593543950336
13 Bignum 6277101735386680763835789423207666416102355444464034512896
14 => 7
15 >> num = 3.14
16 => 3.14
17 >> 8.times do
18 ?> print num.class, " ", num, "\n"
19 >> num *= num
20 >> end
21 Float 3.14
22 Float 9.8596
23 Float 97.21171216
24 Float 9450.11698107869
25 Float 89304710.9560719
26 Float 7.97533139894754e+15
27 Float 6.36059109230385e+31
28 Float 4.04571190434951e+63
</code>


===== Cadenas de caracteres, String =====
dmenu es un menú dinámico para X (lanzador de aplicaciones).


<code>
<code>
1 >> "Hola Mundo".class
# yum install dmenu
2 => String
3 >> "987".class
4 => String
<
</code>
</code>


===== Arreglos, Array =====
Para usarlo en dwm Fedora presione:


<code>
TeclaWin+p
1 >> arreglo = ["a",1,"b",2]
2 => ["a", 1, "b", 2]
3 >> arreglo.class
4 => Array
5 >> arreglo[0]
6 => "a"
7 >> arreglo[1]
8 => 1
<
</code>


===== Arreglos indexados arbitrariamente, Hash =====
Aparecerá un menú en la parte superior, en la medida que tipee se reducirán las opciones, termina tu selección, o navega con las teclas flecha, presiona enter y listo, su aplicación será iniciada, incluso puede utilizar tab para autocompletar.


<code>
==== Hacks ====
1 >> hash = { "color" => "rojo", "temperatura" => 75, 1 => "hoy"}
2 => {1=>"hoy", "temperatura"=>75, "color"=>"rojo"}
3 >> hash.class
4 => Hash
5 >> hash["color"]
6 => "rojo"
7 >> hash["temperatura"]
8 => 75
9 >> hash[1]
10 => "hoy"
</code>


===== Recapitulación rápida, los objetos y sus métodos, ¿documentación? =====
===== stalonetray systray =====


Teniendo cualquier objeto de cualquier clase a la mano, para acceder a su métodos podemos usar la sintaxis objeto.método. En el ejemplo abajo llamamos al popular método to_s que nos ofrece una representación en String del objeto en cuestión.
stalonetray es un systray simple, punto.


<code>
<code>
1 >> hash.to_s
~/.dwm/config.h
2 => "1hoytemperatura75colorrojo"
3 >> arreglo.to_s
4 => "a1b2"
5 >> 8.to_s
6 => "8"
</code>


Ahora bien, ¿dónde consigo la documentación de dichas clases y métodos? Demos la bienvenida a ri para ayuda local en línea de comandos, y por supuesto, en la web a http://www.ruby-doc.org/ . Francamente, en nuestros días la primera fuente de información es la Web, y en segundo lugar, nuestros recursos locales como ri. Entonces, y para efectos de esta serie de artículos, vamos a usar inicialmente Ruby 1.8.7.
static Rule rules[] = {
 
/* class instance title tags mask isfloating */
* http://www.ruby-doc.org/core-1.8.7/
{ "stalonetray", NULL, "stalonetray", ~0, False },
* http://www.ruby-doc.org/stdlib-1.8.7/
};
 
Ejemplo de salida ri (extracto).
 
<code>
$ ri Fixnum
------------------------------------------------ Class: Fixnum < Integer
    A +Fixnum+ holds +Integer+ values that can be represented in a
    native machine word (minus 1 bit). If any operation on a +Fixnum+
    exceeds this range, the value is automatically converted to a
    +Bignum+.
...
Instance methods:
-----------------
    %, &, *, **, +, -, -@, /, <, <<, <=, <=>, ==, >, >=, >>, [], ^,
    __serialize__, abs, dclone, div, divmod, html_safe?, id2name,
    modulo, power!, quo, rdiv, rpower, size, to_f, to_s, to_sym, xchr,
    zero?, |, ~
</code>
</code>


==== Ruby es dinámico ¿ 2 + 2 = 4 ? ====
Esto asegura que stalonetray sea visible a lo largo de todos los tags.


Uno de los aspectos notables de Ruby es su dinamismo, una forma de visualizarlo es hacer uso del hecho que todas las clases están "abiertas" y es posible redefinir sus métodos, por ejemplo:
===== terminator en vez de uxterm =====


===== fixnum_mod.rb =====
Mod4-Shift-Return de caja arranca uxterm, deseo cambiar eso a terminator


<code>
<code>
#!/usr/bin/ruby
~/.dwm/config.h
#
class Fixnum
  def +(otro)
    100
  end
end
 
puts (2+2).to_s
 
Y ahora ejecutamos nuestro programa:


$ ruby fixnum_mod.rb
1 /*static const char *termcmd[]  = { "uxterm", NULL };*/
100
2 static const char *termcmd[]  = { "terminator", NULL };
</code>
</code>


Horror, hemos echado a perder el método sumar de Fixnum, por ello algunos consideran peligroso los lenguajes dinámicos, sin embargo existe la forma de protegernos de este tipo de modificaciones en el caso de que ello no sea deseable. El ejemplo sin embargo demuestra que toda clase puede redefinir cualquiera de sus métodos en tiempo de ejecución, en cualquier momento, este dinamismo le da gran poder a Ruby, piense en una clase u objeto que evoluciona y gana funcionalidad en el tiempo de existencia del programa, o que la pierde, su funcionalidad puede mutar, cambiar. No puede devolver el cambio, no sin que le enseñe cómo preservar el código sobrescrito, probablemente en la próxima edición de esta columna.
===== tags con nombres =====
Estructuras de control¶


Por supuesto que ningún lenguaje está completo si no tiene la capacidad de ejecución de código condicionada, es decir, evaluar alguna condición o estado, y proceder en consecuencia de distintas maneras. Abajo le resumimos las estructuras más comunes.
Tener los tags simplemente numerados es conveniente, pero tal vez sienta la necesidad de ponerles un nombre.


<code>
<code>
1 # Evaluacion máxima 20
~/.dwm/config.h
2 if evaluacion < 10
3  puts "Usted reprobó la asignatura."
4 elsif evaluacion > 16
5  puts "Usted obtuvo un grado sobresaliente."
6 else
7  puts "Usted aprobó la materia."
8 end


1 unless unaCancion.duracion > 180 then
/* tagging */
2  costo = .25
static const char *tags[] = { "term", "web", "email", "chat", "fm", "mmx", "7", "8", "9" };
3 else
4  costo = .35
5 end
 
1 case forma
2  when Cuadrado, Rectangulo
3    # ...
4  when Circulo
5    # ...
6  when Triangulo
7     # ...
8   else
9     # ...
10 end
</code>
</code>


==== Lazos e iteradores ====
==== Foco sigue al ratón, deshabilitar ====


Un iterador en Ruby es simplemente un método que puede invocar un bloque de código. Note como se pasa la referencia del bloque de código y este a su vez ejecutado por medio de la llamada yield.
No me gusta la idea de que el movimiento del ratón defina el foco de las ventanas, suele provocarme problemas por la sensibilidad de los touchpad y de los ratones ópticos que "se mueven solos" entonces cambian el foco de la ventana a una ventana que nada que ver con lo que estoy trabajando. En este caso debe comentar una declaración en el código fuente.
Ruby Salida


<code>
<code>
1 def tres_veces
/usr/src/dwm-user-5.8.2-9.fc15/dwm.c
2   yield
3  yield
4  yield
5 end
6
7 tres_veces { puts "Hola Mundo" }
 


Hola Mundo
1      [DestroyNotify] = destroynotify,
Hola Mundo
2 /*      [EnterNotify] = enternotify, */
Hola Mundo
3      [Expose] = expose,
</code>
</code>


Algunos iteradores son muy comunes en muchas clases Ruby para representar colecciones, por ejemplo each en un arreglo simple. Note que each además de iterar por cada uno de los elementos del arreglo, pasa un argumento al bloque de código ha ser ejecutado, en este caso pasa el contenido correspondiente en el arreglo.
Y forzar una compilación, yo resolví ajustando ficticiamente por ejemplo un nombre de un tag y luego devolviendo el cambio (no estoy seguro que el sistema de construcción de dwm en Fedora note mis cambios en dwm.c).
<code>
Ruby Salida


1 [1,3,5,7,9].each { |i| puts i }
==== Dos monitores al vuelo ====


Si iniciamos sesión DWM con los dos monitores encendidos en Fedora no hay problemas todo funciona al pelo, sin embargo, puede que necesite conectar y encender el segundo monitor una vez ya iniciada la sesión, por supuesto no queremos reiniciar nuestra sesión DWM. Casualmente me tropecé con esta circunstancia y reusé un pequeño script xrandr, la sorpresa es que no tuve que hacer nada con DWM, simplemente apareció el segundo monitor con sus nueve tags listo para trabajar. En resumidas, sólo debe configurar para detectar el segundo monitor, el script abajo es la forma que usé en mi laptop:
 
1
3
5
7
9
</code>
 
Lazos con while y until.


<code>
<code>
Ruby Salida
~/xrandr


1 peso = 5
xrandr --output VGA1 --mode 1280x1024
2 while peso < 100
xrandr --output LVDS1 --mode 1280x800
3  peso = peso * 2
xrandr --output VGA1 --left-of LVDS1
4  puts peso
5 end


~/xrandr-alreves


10
xrandr --output VGA1 --mode 1024x768
20
xrandr --output LVDS1 --mode 1280x800
40
xrandr --output VGA1 --right-of LVDS1
80
160
</code>
</code>


<code>
La primera forma es para que el segundo monitor quede al lado izquierdo del primero, la segunda, al revés.
Ruby Salida


1 peso = 5
==== Aplicaciones systray ====
2 until peso > 100
3  peso = peso * 2
4  puts peso
5 end


Ya sea con stalonetray o cualquier otro panel que incorpore un systray para el sistema, seguro deseará usar algunas de las siguientes aplicaciones:


10
* nm-applet : applet para systray de Network Manager, le facilitará conectarse a redes.
20
* PNMixer : mezclador de audio para el systray, le permitirá ajustar el volumen.
40
* Empathy , cliente chat.
80
* Pidgin , cliente chat.
160
* batti, monitor de batería, suspender, hibernar.
</code>


Lazo con for y loop:
==== Mi configuración feliz ====


<code>
Esta sección es para poner "mi configuración", mis ajustes, mis aplicaciones preferidas que se ajustan a mi manera de trabajar en dwm.
Ruby Salida


1 for i in 1..8 do
* fbpanel configurado a lo mínimo, no toma foco y se esconde solo, lo veo cuando quiero :).
2    puts i
* dmenu como lanzador de aplicaciones.
3 end
* terminator como emulador de terminales.
* tmux multiplexor de terminales.
* pidgin cliente multiprotocolo para chat (irc, gtalk, identica, twitter, fb ).
* pcmanfm es mi gestor de archivos gui preferido, seguido de nautilus.
* totem y/o xine para ver películas y videos en general.
* listen como reproductor de audio.
* radiotray como reproductor de radio.
* nm-applet para conectarme a redes.
* batti para vigilar la batería de mi laptop, suspender e hibernar.


* Pendiente bloqueo de pantalla.


1
Un pantallazo, por supuesto.
2
3
4
5
6
7
8


Ruby Salida
==== Referencias ====


1 num = 0
* http://en.gentoo-wiki.com/wiki/Dwm
2 loop do
* http://www.linuxjournal.com/content/going-fast-dwm
3  puts "En el lazo por #{num} vez"
* http://www.linuxgoodies.com/review_dwm.html
4  num += 1
5  break unless num < 5
6 end


==== Pendientes ====


En el lazo por 0 vez
* Al usar tint2 este es sujeto de foco de ventana, quiero evitar ello ya que no deseo pasar por tint2 para llegar a otra aplicación, es en realidad el primer punto fastidioso para mi en el uso de dwm. Si tint2 aparece en todos los tags (algo deseable), entonces es sujeto de tener el foco, es una "ventana más flotante" (stalonetray sufre igual).
En el lazo por 1 vez
En el lazo por 2 vez
En el lazo por 3 vez
En el lazo por 4 vez
</code>


De salida, por supuesto hay mucho más acerca de Ruby y su mundo, usted podrá hacer desde pequeños guiones (scripts) hasta poderosas aplicaciones de escritorio o su último desarrollo web, no se detenga aquí y espero que nos leamos en la próxima entrega de esta publicación, envíeme sus comentarios a <gomix@fedoraproject.org>.
* Con dos pantallas, en mi Fedora funciona perfecto, incluso mover las apps de una pantalla a otra, BUT, cómo etiqueto una app para que esté en la "otra" pantalla. En las dos pantallas tengo el panel con los 9 tags individuales del 1 al 9.


Nuestro trabajo es resolver problemas concretos, no alimentar al compilador con cucharilla, nos gustan los lenguajes dinámicos que se adapten a nosotros sin reglas rígidas que seguir.
* dmenu no se muestra correctamente, en mi laptop cuando arranco con dos monitores, dmenu no se muestra correctamente, el reconectar físicamente el segundo monitor repara la falla, es algo con el X o el propio dwm.


Gomix_
Gomix"

Latest revision as of 01:48, 18 August 2011

LATAM Fedora!

LATAM Fedora is a regular column of Spanish language contributions around open source software. It is our first expansion into incorporating foreign language content into FWN.

This week's contribution is from Guillermo Gómez, a review of the dwm window manager. Enjoy!

dwm

  1. yum install dwm

Cuando se intenta organizar ventanas en otros entornos de escritorio, la mayoría son una pesadilla, pruebe dwm, hiperligero, sólo para geeks. dwm consiste de un único binario de 54k (el distribuido por Fedora) que sólo se puede personalizar recompilando los fuentes. Ya veremos más adelante que en Fedora esto se puede hacer fácilmente.

Al comenzar ni sabrá cómo arrancar su primera aplicación, la documentación (man dwm) dice Mod4-Shift-Return para arrancar uxterm, eso se traduce usualmente a:

TeclaWin+Shift+Enter

   uxterm es un envoltorio para xterm, un emulador de terminal para X, ambos provistos por el paquete xterm.

A partir de ahí puede arrancar sus aplicaciones, si, desde un terminal, no olvide agregar el & para dejarla en el fondo, por ejemplo.

$ totem & dwm-user¶

dwm-user incluye los fuentes de dwm y el guión de arranque dwm-start.

  1. yum install dwm-user

Login

El paquete dwm provee una entrada /usr/share/xsessions/dwm.desktop y el paquete dwm-user incluye /usr/share/xsessions/dwm-user.desktop. La única diferencia es el modo de arranque.

dwm.desktop

[Desktop Entry] Type=Application Encoding=UTF-8 Name=dwm GenericName=Window Manager Comment=Dynamic window manager for X Exec=dwm Terminal=false TryExec=dwm

[Window Manager] SessionManaged=true

dwm-user.desktop =

[Desktop Entry] Type=Application Encoding=UTF-8 Name=dwm-user GenericName=Window Manager Comment=Dynamic window manager for X (user configuration) Exec=dwm-start Terminal=false TryExec=dwm-start

[Window Manager] SessionManaged=true

dwm-start es el método de arranque preferido para DWM en Fedora ya que entonces podrá personalizar su entorno, esto significa compilar su versión de DWM con su versión de las cabeceras en su directorio personal sin intervención manual, ¡cool!.

Keybindings

Layouts

  • Mod4-t Poner la disposición tiled (cuadros).
  • Mod4-f Poner la disposición a floating (flotante).
  • Mod4-m Poner la disposición a monocle (monóxulo).
  • Mod4-Shift-space Conmuta la disposición de estado de la ventana enfocada entre tiled y flotante.

Navegar entre ventanas

  • Mod4-j Cambiar/enfocar la próxima ventana.
  • Mod4-k Cambiar/enfocar la ventana previa.
  • Mod4-Tab Cambia a los tags previamente seleccionados.

Area maestra

  • Mod4-h Decrementa el tamaño del área maestra.
  • Mod4-l Incrementa el tamaño del área maestra.
  • Mod4-Return Cicla/aumenta la ventana enfocada desde/hacia el área maestra (sólo en disposición de cuadros).


Salir/cerrar

  • Mod4-Shift-c Cerrar la ventana enfocada.
  • Mod4-Shift-q Salir de dwm.

Poniendo los tags a las ventanas

  • Mod4-Shift-[1..n] Aplica el tag n a la ventana enfocada.
  • Mod4-Button1-tagicon Aplica el tag n a la ventana enfocada (haga clic en la barra con botón izquierdo)
  • Mod4-Button2-tagicon Agrega el tag n a la ventana enfocada (haga clic en la barra con botón derecho)
  • Mod4-Shift-0 Aplica todos los tags a la ventana enfocada.

Dos pantallas

  • Para enviar una app de una pantalla a otra tiene las siguientes tres opciones:
  * En modo flotante, se puede simplemente arrastrar la ventana de una pantalla a otra.
  * Mod4-Shift-, envía la ventana con el foco a la pantalla previa, si hay alguna.
  * Mod4-Shift-. envía la ventana con el foco a la próxima pantalla, si hay alguna.

dmenu: lanzador de aplicaciones

dmenu es un menú dinámico para X (lanzador de aplicaciones).

  1. yum install dmenu

Para usarlo en dwm Fedora presione:

TeclaWin+p

Aparecerá un menú en la parte superior, en la medida que tipee se reducirán las opciones, termina tu selección, o navega con las teclas flecha, presiona enter y listo, su aplicación será iniciada, incluso puede utilizar tab para autocompletar.

Hacks

stalonetray systray

stalonetray es un systray simple, punto.

~/.dwm/config.h

static Rule rules[] = { /* class instance title tags mask isfloating */ { "stalonetray", NULL, "stalonetray", ~0, False }, };

Esto asegura que stalonetray sea visible a lo largo de todos los tags.

terminator en vez de uxterm

Mod4-Shift-Return de caja arranca uxterm, deseo cambiar eso a terminator

~/.dwm/config.h

1 /*static const char *termcmd[] = { "uxterm", NULL };*/ 2 static const char *termcmd[] = { "terminator", NULL };

tags con nombres

Tener los tags simplemente numerados es conveniente, pero tal vez sienta la necesidad de ponerles un nombre.

~/.dwm/config.h

/* tagging */ static const char *tags[] = { "term", "web", "email", "chat", "fm", "mmx", "7", "8", "9" };

Foco sigue al ratón, deshabilitar

No me gusta la idea de que el movimiento del ratón defina el foco de las ventanas, suele provocarme problemas por la sensibilidad de los touchpad y de los ratones ópticos que "se mueven solos" entonces cambian el foco de la ventana a una ventana que nada que ver con lo que estoy trabajando. En este caso debe comentar una declaración en el código fuente.

/usr/src/dwm-user-5.8.2-9.fc15/dwm.c

1 [DestroyNotify] = destroynotify, 2 /* [EnterNotify] = enternotify, */ 3 [Expose] = expose,

Y forzar una compilación, yo resolví ajustando ficticiamente por ejemplo un nombre de un tag y luego devolviendo el cambio (no estoy seguro que el sistema de construcción de dwm en Fedora note mis cambios en dwm.c).

Dos monitores al vuelo

Si iniciamos sesión DWM con los dos monitores encendidos en Fedora no hay problemas todo funciona al pelo, sin embargo, puede que necesite conectar y encender el segundo monitor una vez ya iniciada la sesión, por supuesto no queremos reiniciar nuestra sesión DWM. Casualmente me tropecé con esta circunstancia y reusé un pequeño script xrandr, la sorpresa es que no tuve que hacer nada con DWM, simplemente apareció el segundo monitor con sus nueve tags listo para trabajar. En resumidas, sólo debe configurar para detectar el segundo monitor, el script abajo es la forma que usé en mi laptop:

~/xrandr

xrandr --output VGA1 --mode 1280x1024 xrandr --output LVDS1 --mode 1280x800 xrandr --output VGA1 --left-of LVDS1

~/xrandr-alreves

xrandr --output VGA1 --mode 1024x768 xrandr --output LVDS1 --mode 1280x800 xrandr --output VGA1 --right-of LVDS1

La primera forma es para que el segundo monitor quede al lado izquierdo del primero, la segunda, al revés.

Aplicaciones systray

Ya sea con stalonetray o cualquier otro panel que incorpore un systray para el sistema, seguro deseará usar algunas de las siguientes aplicaciones:

  • nm-applet : applet para systray de Network Manager, le facilitará conectarse a redes.
  • PNMixer : mezclador de audio para el systray, le permitirá ajustar el volumen.
  • Empathy , cliente chat.
  • Pidgin , cliente chat.
  • batti, monitor de batería, suspender, hibernar.

Mi configuración feliz

Esta sección es para poner "mi configuración", mis ajustes, mis aplicaciones preferidas que se ajustan a mi manera de trabajar en dwm.

  • fbpanel configurado a lo mínimo, no toma foco y se esconde solo, lo veo cuando quiero :).
  • dmenu como lanzador de aplicaciones.
  • terminator como emulador de terminales.
  • tmux multiplexor de terminales.
  • pidgin cliente multiprotocolo para chat (irc, gtalk, identica, twitter, fb ).
  • pcmanfm es mi gestor de archivos gui preferido, seguido de nautilus.
  • totem y/o xine para ver películas y videos en general.
  • listen como reproductor de audio.
  • radiotray como reproductor de radio.
  • nm-applet para conectarme a redes.
  • batti para vigilar la batería de mi laptop, suspender e hibernar.
  • Pendiente bloqueo de pantalla.

Un pantallazo, por supuesto.

Referencias

Pendientes

  • Al usar tint2 este es sujeto de foco de ventana, quiero evitar ello ya que no deseo pasar por tint2 para llegar a otra aplicación, es en realidad el primer punto fastidioso para mi en el uso de dwm. Si tint2 aparece en todos los tags (algo deseable), entonces es sujeto de tener el foco, es una "ventana más flotante" (stalonetray sufre igual).
  • Con dos pantallas, en mi Fedora funciona perfecto, incluso mover las apps de una pantalla a otra, BUT, cómo etiqueto una app para que esté en la "otra" pantalla. En las dos pantallas tengo el panel con los 9 tags individuales del 1 al 9.
  • dmenu no se muestra correctamente, en mi laptop cuando arranco con dos monitores, dmenu no se muestra correctamente, el reconectar físicamente el segundo monitor repara la falla, es algo con el X o el propio dwm.

Gomix"