Nov 29, 2006
Deixando o Gnome mais Hacker Friendly
Em geral eu prefiro usar gerenciadores de janela bem simples como o fvwm ou ion. Recentemente eu tentei usar o wmii no lugar do Ion. O problema é que, apesar de ser muito bom, o wmii ainda está meio verde, especialmente para alguns aplicativos como o ardour e snd. O último snd definitivamente não roda dentro do último ion :-( O que fazer? Eu ainda não decidi. Provavelmente vou voltar para o fvwm.
Eu descobri que, independente do gerenciador de janela, o mais importante para mim são as seguintes coisas:
- ter uma tecla de atalho para executar aplicativos, com complementação (claro!). No ion é só digitar F3 que ele pede um comando a ser executado. Eu nunca uso menus no ion justamente devido a esse recurso. Por exemplo, é só digitar F3 ema TAB e a complementação faz o resto.
- ter uma tecla de atalho para um terminal. Ao contrário de outros hackers, eu só deixo um terminal aberto, graças ao screen (o aplicativo mais útil em todos os tempos). Eu poderia abrir o terminal usando o comando descrito no item acima, mas já que eu sempre uso terminais, gosto de ter uma tecla de atalho para eles.
- abrir os programas, ou ao menos alguns deles, de modo que ocupem a tela toda, ou seja, abram maximizados. Eu só gosto de usar um programa por área de trabalho.
- abrir alguns programas-chave em lugares específicos. Por exemplo, no Ion quando eu mando abrir o emacs ele sempre aparece na primeira área de trabalho, o terminal na segunda, e o firefox na terceira. Com isso tenho uma organização básica para os programas que uso diariamente.
- uma barra de status simples. Eu não preciso de muita frescura, algo que mostre a hora, o status da bateria, a frequência da CPU já é suficiente.
Basicamente é isso. Quando eu estou trabalhando em outros programas específicos por períodos de tempo maior (por exemplo, xsane) eu crio alguma configuração ad hoc.
Eu estou preparando uma palestra onde vou precisar demonstrar programas que não estão rodando bem no Ion. Geralmente eu uso o Gnome para dar palestras, para não assustar o pessoal não-geek ("linux é isso!?"). Então resolvi ver se consigo configurar o gnome para atender aos pontos acima.
O gnome tinha um excelente applet para executar aplicativos que sumiu do mapa. A versão que tenho aqui tem uma "barra de ação unificada" que é horrível. Eu estou usando o applet "executar uma aplicação". Eu configurei ele para a tecla F3. Ele não tem uma complementação boa, mas por enquanto dá para o gasto.
O gnome permite que eu atribua uma tecla de atalho ao terminal, mas ele usa o gnome-terminal por padrão. Eu prefiro o xterm. Por enquanto deixei o gnome-terminal com F2, depois descubro como mudar para o xterm.
Procurando como fazer para o Gnome abrir as janelas ocupando a tela inteira eu achei esse howto sobre o Devil's Pie. Ele é um utilitário para detectar janelas e casa-la com uma série de regras, desse modo, por exemplo, pode-se configurar um programa para abrir em determinada área de trabalho. No howto ele mostra a (horrível) configuração usando XML que o Devil's Pie usa. Mas descobri que seus desenvolvedores viram a luz e incluiram uma sintaxe usando expressões-s (ou expressões simbólicas) como em Lisp. Graças a Deus! Depois de criar algumas configurações no ~/.devilspie/ o emacs, terminal, e firefox abrem nas áreas desejadas e com tela cheia. Esse é um exemplo de configuração:
(if
(is (application_name) "emacs")
(begin
(set_workspace 1)
(maximize)))
Eu configurei apenas uma barra de ferramentas do gnome, com hora, frequência da CPU, e outras coisas mais. Além disso eu removi o irritante notificador de autalizações.
Agora só faltam algumas configurações de teclado. Em geral eu uso o xmodmap, mas vamos ver o que o Gnome pode fazer por mim. Eu modifico as seguintes teclas:
- a tecla de "windows" vira Meta (útil para o emacs)
- a tecla CAPS LOCK vira CTRL
- eu troco as teclas de colchete e parênteses, isso é, os parênteses ficam na tecla dos colchetes e vice-versa. Como eu programo muito em Lisp, é fundamental ter acesso aos parênteses em uma tecla sem SHIFT
Para minha surpresa, eu posso fazer as duas primeiras opções acima usando a opção de "preferências do teclado" do Gnome, na seção "opções de layout". Mas a troca entre parênteses e colchete não é possível no gnome, então adaptei o mapa de teclado que usava anteriormente:
keycode 0x12 = 9 bracketleft bracketright keycode 0x13 = 0 bracketright braceright keycode 0x23 = parenleft braceleft keycode 0x33 = parenright braceright
Eu consegui configurar um ambiente gnome mais usável (para mim) que o padrão. Os programas principais que uso funcionam mais ou menos como no Ion, mas eu ainda tenho a possibilidade de usar os programas que não estão funcionando bem no Ion ou wmii. A desvantagem é que o modo como o gnome lida com janelas faz com que muito do trabalho de gerenciar janelas fique na mão do usuário. Vamos ver quantos dias eu sobrevivo com essa configuração ;-)
Atualização: Eu não consegui suportar o gnome-terminal e o comando de rodar aplicativos padrão do gnome por muito tempo. Como alternativa achei o ótimo gmrun. Agora só precisava de algo para atribuir ele e o xterm a teclas de atalho. Acabei usando o hotkeys mesmo. Com a seguinte configuração para tirar o splash screen e a frescurinha do OSD:
hotkeys -t custom -o off -Z
Posted at 23:26
Nov 18, 2006
Google talks
O google videos tem mais de 200 palestras técnicas: Tem palestras sobre creative commons, Ruby, vários sobre Python (aqui, aqui, e aqui), pacotes debian, Mercurial, Lisp , e muitas outras. Um vídeo muito bom que acabei de assistir é o The Science and Art of User Experience at Google. Ainda não assisti o Predicting bugs in code changes using SCM information mas parece ser interessante.Posted at 15:00
Nov 16, 2006
Python 2.5 acrescenta a sentença with
Eu vi recentemente que a versão 2.5 de python acrescenta a sentença with. A idéia é que with define um bloco e uma variável e algum código de 'limpeza" é executado depois. O exemplo clássico desse tipo de coisa é para acessar arquivos, onde o arquivo é automaticamente fechado no final da execução do bloco with. Esse é um exemplo desse uso:
with open("/etc/passwd", "r") as f:
for line in f:
print line
Claro que Lisp tem esse tipo de coisa. Por exemplo, a
função with-open-file em Lisp faz exatamente isso para
arquivos, abre um arquivo, executa o código no corpo da expressão e
automaticamente fecha o arquivo quando a expressão é terminada.
(with-open-file (stream "/etc/passwd")
(when stream
(loop for line = (read-line stream nil)
while line do (print line))))
Ainda que nada impeça a criação de algo geral como with em
Lisp, a prática tem sido de usar funções específicas com o prefixo
with- como with-slots, with-accessors, with-open-stream,
with-simple-restart e assim por diante.
Observe que meu intuito aqui não é falar mau de Python ou de qualquer outra linguagem, aliás eu acho Python uma linguagem muito legal. Eu quero falar sobre a possibilidade de poder extender uma linguagem de programação sem precisar da benção de ditadores benevolentes. Como eu falei em outro post, uma das grandes coisas em Lisp é a possibilidade de extender a sintaxe da linguagem usando macros (lembre que macros em Lisp não tem nada a ver com macros em C).
Macros em Lisp permitem que abstraiamos idiomas comuns que não podem ser abstraidos por funções. Por exemplo, um idioma comum é o de entrar em um diretório para executar um comando e voltar ao diretório anterior. Uma função para verificar se os arquivos de um diretório sob controle de versão foram modificados seria algo como o seguinte em Bash:
function status {
old=$(pwd)
cd $1
svn up
cd $old
}
status "/home/kroger/foo/bar"
Ao invés de repetir esse idioma em funções toda vez que vamos executar algum comando em um diretório, podemos capturar essa abstração básica em uma macro em Lisp:
(defmacro with-directory (directory &body body)
`(let ((dir (default-directory)))
(setf (default-directory) ,directory)
,@body
(setf (default-directory) dir)))
Esse código é uma versão praticamente linha por linha da versão em Bash, a diferença é que o corpo do código a ser executado vai entrar em ,@body. Um exemplo simples de uso seria algo como:
(with-directory "/home/kroger/foo/bar/"
(ext:run-program "svn" "("up")))
O mais legal é que with-directory aceita qualquer expressão válida em Lisp como corpo, não apenas uma única expressão. Isso permite uma grande flexibilidade e elimina códigos redundantes, aumentando a legibilidade.
O programador atento vai notar que eu poderia fazer algo assim em Bash (e qualquer outra linguagem que tenha eval:
function status {
old=$(pwd)
cd $1
eval $2
cd $old
}
status "/home/kroger/bin/" "git status"
O problema é que, não só eval tende a ser lento, como o que for executado tem que estar entre strings, e de uma maneira limitada, enquanto que macros em Lisp são integradas no resto da linguagem, por exemplo:
(with-directory "/home/kroger/foo/bar/"
(dotimes (x 10)
(ext:run-program "svn" "("up"))))
A questão básica aqui é que a diferença entre Lisp e outras linguagens é que enquanto os usuários de outras linguagens esperam que recursos sejam implementados na linguagem pelas companhias que as dominam ou por aqueles que as mantêm, hackers de Lisp modificam a linguagem o tempo todo, aumentando-a de modo a facilitar seu trabalho.
Posted at 15:00
Nov 03, 2006
Microsoft ferra com programadores
Eu me deparei com esse artigo sobre o encerramento do visual basic pela Microsoft. Aparentemente todo o suporte e desenvolvimento futuro do visual basic foi parado e agora a Microsoft vai investir no Visual Basic.Net que é incompatível com o visual basic 'classic'. Eu não tenho nenhum interesse no visual basic e na plataforma .net, e o que me surpreendeu no artigo foi sua conclusão:Programmers aren't embracing VB.net as Microsoft expected and will probably continue using Visual Basic classic until it breaks. But what then? Open source might be the answer. Since then, most programmers have learned their lesson: DON'T rely on a proprietary programming language.Além de isso ser uma lição aos programadores que usam linguagens proprietárias, serve para lembrar o valor de uma linguagem ter um padrão definido como C, C++, e Common Lisp.
Posted at 15:00
Nov 01, 2006
Bye Bye Ion, welcome wmii
Eu usei o Ion como gerenciador de janelas por um bom tempo (eu não me lembro mais deve ter ao menos uns 3 anos). Antes disso eu usava o venerável fvwm. Depois de se acostumar com um gerenciador como o ion é difícil usar outra coisa. O ion é tão produtivo! Eu confesso que não tenho problemas maiores com ele, mas recentemente tive problemas em usar o snd com o ion. O snd é o emacs dos editores de áudio e uma ferramenta essencial no meu cinto de utilidades. O desenvolvedor principal do Ion clama que o problema deve ser no gtk, o que não seria a primeira vez que isso ocorre. Eu tentei rastrear o bug, mas é dificil achar um bug desse tipo que pode ocorrer em 3 camadas (no ion, gtk, e snd). Eu testei o snd com o wmii para ver se o bug acontecia e funcionou perfeitamente. Decidi que o wmii será meu novo gerenciador de janelas. O wmii segue a mesma filosofia de gerenciadores de janela para quem não gosta de mouse como o ion e ratpoison. O wmii tem algumas diferenças em relação ao ion que eu preferi logo de cara:- usa tags no lugar de workspaces. Muito mais flexível.
- procura organizar os programas automaticamente, seja lado a lado, um no topo do outro, ou ocupando a tela inteira
- pode usar qualquer linguagem de programação como linguagem de extensão, enquanto o ion usa Lua (que eu não gosto).
Posted at 15:00