No colégio a gente aprende dez mil regrinhas listando as inúmeras situações em que as palavras são acentuadas. Essa explicação da acentuação é muito mais complicada do que precisa ser, e o motivo é que ela parte de uma análise totalmente furada de por quê as palavras são acentuadas.
Basicamente, existem três "regras" de que cobrem 95%* das palavras. Por padrão:
(Note que am e em seguidos de s viram ans e ens.)
E é isso, e tão somente isso. Se usa um acento quando a pronúncia da palavra sem o acento estaria errada (quem imaginaria?), e as regras de como se pronuncia uma palavra sem acento são bastante simples.
Exemplos:
Por outro lado:
Simples, hã?
O português tem uma propriedade curiosa: a sílaba tônica de palavas de uma só sílaba pode cair ou nessa sílaba (e portanto a palavra é oxítona, pois o acento cai na última (e única) sílaba), ou em lugar nenhum. Nossas regras cobrem os dois casos, com um pouquinho de imaginação:
Pelas nossas regras, se escrevemos de, a palavra cairia na primeira regra, e portanto a sílaba tônica seria a penúltima. Mas não há penúltima sílaba em uma palavra de uma sílaba só, e portanto a sílaba tônica cai em lugar nenhum, ou seja, a palavra é átona. Assim:
Exceção: Palavras de uma sílaba só que terminam em m ou ns não exigem acento, mesmo que sejam tônicas: bem, bens.
Nossas regras nos dizem a verdade mas não nos dizem tudo. Se escrevêssemos raizes, a palavra cairia na nossa primeira regra, e portanto seria paroxítona. Mas raízes é paroxítona, então o padrão já é o que queremos, e portanto não precisaria de acento, certo?
O problema é que a pronúncia se não houvesse o acento seria RAI-zes (com duas sílabas), não ra-I-zes (com três). Nesse caso o acento serve não só para indicar qual é a sílaba tônica, como também para dizer quais são afinal as sílabas da palavra. De qualquer forma, a idéia básica continua válida: usa-se o acento quando não queremos o padrão.
E nesse caso o padrão é dado pela seguinte regra: o português prefere ditongos decrescentes. Ditongos decrescentes são ai, ei, oi, ui, au, eu, iu, ou, isto é, aqueles em que primeiro vem a vogal, depois a semivogal. Normalmente, quando essas seqüências de vogais aparecem em uma palavra, o português prefere lê-las como ditongos decrescentes por padrão sempre que tem a oportunidade. Assim, se você escreve raizes, o português prefere juntar o ai numa sílaba só, formando um ditongo decrescente, e a pronúncia resultante é RAIzes. Como não é isso que queremos, colocamos um acento estratégico sobre o í, produzindo raízes. (É por esse mesmo motivo que escrevemos ai! que dor, mas aí ela foi embora.)
Fica então a pergunta: por que raiz se escreve sem acento? E a resposta é que a seqüência aiz não pode ocorrer dentro da mesma sílaba. A única consoante que pode ocorrer depois de um ditongo decrescente na mesma sílaba é s. Por isso, quando escrevemos raiz, a pronúncia não pode ser RAIz, numa sílaba só, porque o z não pode ir na mesma sílaba que o ai. Conseqüentemente, o z tem que ficar para a próxima sílaba, e como o z não pode ficar lá sozinho, ele leva o i com ele, produzindo ra-IZ.
Resumindo: raízes leva acento porque sem ele a pronúncia seria RAI-zes. raiz não leva acento porque não existe a opção de pronunciar RAIz, já que o ditongo decrescente se recusa terminantente a ser acompanhado por um z depois dele na mesma sílaba. O mesmo vale para juiz vs. juízes. (A palavra mais se pronuncia como uma sílaba só, pois o s pode ir depois do ditongo na mesma sílaba. Por outro lado, a palavra maiz, se existisse em português, se pronunciaria ma-IZ.)
De maneira análoga, sair não leva acento, pois não é possível ler essa palavra como SAIr. Mas (se eles) saírem leva, pois senão a pronúncia seria SAIrem.
Se escrevêssemos saude, a pronúncia seria SAU-de, porque, como já vimos, o português prefere ler o ditongo decrescente au do que separá-lo em duas sílabas. Como não é isso que queremos, usamos um acento: saúde. Da mesma forma, se escreve saída, pois a pronúncia é sa-Í-da, e não SAI-da.
Por outro lado, em um hiato do tipo coentro não é necessário acento, pois o hiato não pode ser confundido com um ditongo. E em Raul não vai acento porque, como vimos, não é possível ler aul como uma sílaba só em português, pois o ditongo decrescente só permite s depois dele na mesma sílaba.
Seqüências do tipo aiu são ambíguas: tanto ai quanto iu são possíveis ditongos decrescentes. Conseqüentemente, tanto ai-U quanto a-Iu (rimando com partIU) seriam possíveis leituras. Qual delas o português prefere?
Pela ortografia antiga, a regra é simples: o último ditongo é escolhido. Assim, acentua-se bocaiúva (pois a pronúncia é bo-cai-Ú-va, não bo-ca-Iu-va), Piauí (pois a pronúncia é pi-au-Í, e não pi-a-Ui), feiúra (pois a pronúncia fei-Ú-ra, e não fe-Iu-ra). Por outro lado, não se acentua caiu, pois tendo que escolher entre juntar o ai ou o iu em uma sílaba só, o português prefere a segunda opção.
Pela ortografia nova, o português escolhe o primeiro ditongo, exceto se ele ocorrer na última sílaba. Assim, caiu continua sem acento, e Piauí continua com acento, mas feiura e bocaiuva perdem o acento.
Por padrão, ei, oi, eu se pronunciam êi, ôi, êu. Logo, quando queremos que eles sejam pronunciados como éi, ói, éu, eles levam acento. Assim, fogaréu leva acento, mas morreu não.
Pela ortografia antiga, esses tritongos seguem a mesma regra acima: levam acento quando são abertos, não levam quando são fechados. Assim, idéia leva acento, mas sereia não.
Pela ortografia nova, esses tritongos não levam acento. Por quê? Porque em Portugal eles são fechados. Assim, em nome da unificação ortográfica, se escreve tanto ideia quanto sereia sem acento. éi, ói, éu continuam sendo acentuadas quando não ocorrem em tritongos.
Pela ortografia antiga, as seqüências êe, ôo são acentuadas quando tônicas. Aparentemente essa regra só existe para fins estéticos, já que a pronúncia já estaria correta se não houvesse o acento. A ortografia nova elimina o acento nesses casos (e portanto se escreve leem, voo).
Por padrão, ã e õ são tônicos quando ocorrem na última sílaba. Assim, manha se lê MAnha, mas manhã se lê maNHÃ. Quando não é isso que queremos, usamos um acento: órgão (não orGÃO), órfão (não orFÃO).
Por outro lado, ã e õ fora da última sílaba não afetam a acentuação. Assim, manhãZInha não exige acento.
Se por um lado o português gosta de ditongos decrescentes, por outro lado ele detesta ditongos crescentes (em que primeiro vem a semivogal, depois a vogal). Assim, ao ver a seqüência ia, o português prefere deixar o i e o a em sílabas separadas do que juntá-los em um ditongo crescente. Logo, se escrevêssemos historia, a pronúncia seria histoRIa.
(Curiosamente, a regra no espanhol é o contrário: em português se escreve história e Maria, em espanhol historia e María. E democracia se escreve igual em ambas as línguas, mas em português se lê democraCIa e em espanhol demoCRAcia.)
Seqüências do tipo vogal + inha não levam acento, apesar de ai, ui, etc. nesses casos serem hiatos. Motivo? Palavras do tipo FUI-nha não existem em português (se você tentar pronunciar FUI-nha, provavelmente vai dizer algo indistinguível de funha). Logo, só a pronúncia com o hiato é "possível", e portanto o acento é desnecessário.
água leva acento. Por quê? Porque ua é um ditongo crescente, e como já vimos, o português tem um desapreço generalizado por ditongos crescentes, e portanto a pronúncia sem o acento seria a-GU-a. Da mesma forma, o adjetivo oblíquo leva acento, mas o verbo (eu) obliquo (o-bli-QU-o) não.
A bagunça acontece com as seqüências gue, gui, que, qui. Por razões históricas, normalmente o u nessas seqüências não é lido. Porém, em alguns casos ele é lido, e é aí que começa a sujeira.
Pela ortografia antiga:
Pela nova ortografia:
| caso | ortografia nova | ortografia antiga |
|---|---|---|
| u não é lido | eu segui | eu segui |
| ditongo decrescente | ele argui | ele argúi |
| ditongo crescente | eu argui | eu argüi |
Isso tudo é uma sujeira fantástica, e eu não tenho mais nada de bom para dizer a respeito.
UPDATE: Aparentemente, pela ortografia nova, pode-se escrever eu arguí (antigo argüi), com acento agudo para distingui-lo de ele argui (antigo argúi). O conjugador de verbos do Dicionário Priberam apresenta o acento quando configurado para usar a nova ortografia (selecionando-se o ícone dAO no topo da página), e os slides desta pessoa aleatória na Internet dizem que ambas as ortografias (com e sem acento) são válidas. Não encontrei essa regra da ortografia explicitamente mencionada em lugar nenhum, entretanto. (Obrigado, Marcus Aurelius.)
Algumas palavras levam acento simplesmente para diferenciá-las na escrita de alguma outra palavra com a mesma pronúncia. Nesses casos não há um "princípio universal" por trás, e o jeito é lembrar quais palavras têm acento diferencial. Muitos desses acentos (e.g., ele pára de correr vs. eu vou para casa) foram eliminados na nova ortografia (produzindo manchetes ambíguas do tipo "Chuva para São Paulo"), enquanto outros permanecem (e.g., ele tem, eles têm).
Acredito que com isso cobrimos 99,99995% dos casos.
Por uma razão mui nobre: economizar seu braço. Na grande maior parte dos casos, as regras são tais que a pronúncia mais freqüente é a padrão, e as menos freqüentes exigem acento. Por exemplo, como vimos, palavras terminadas em a, e, o são paroxítonas por padrão. Por que essas vogais especificamente? Por que não todas? A resposta é que há uma dúzia de tempos verbais terminados em i ou u (vendi, vendeu) que desse jeito não precisam de acento. Da mesma forma, ditongos decrescentes são mais comuns do que hiatos, e portanto acentuamos os hiatos (quando necessário para diferenciá-los de ditongos) e deixamos os ditongos sem acento.
As regras que nós aprendemos no colégio (e que são apresentadas nas gramáticas tradicionais da língua) recitam quando se usam acentos, mas não explicam por que se usam acentos nessas situações. Quase todas as "regras" são conseqüências lógicas de meia dúzia de princípios básicos que dizem como as palavras são lidas por padrão se não forem acentuadas.
Espero que este post possa ser útil para alguma que esteja tentando entender os mistérios da acentuação da língua portuguesa (que não têm nada de misterioso quando explicados direito).
[Observação: por uma questão de decência e auto-respeito, este blog é escrito segundo a ortografia antiga.]
_____
* E 43% das estatísticas são inventadas na hora.
(Se você não quer saber de preliminares, clique aqui.)
Depois de muita enrolação, decidi migrar meu keymap do xmodmap para o XKB. Sobrevivi à experiência.
O objetivo deste post é relatar parte do que eu aprendi no processo. Para uma referência mais ou menos completa da configuração do XKB, você pode consultar o mui excelente An Unreliable Guide to XKB Configuration, ou algum outro dos links listados no final do post sobre o xmodmap. Neste post, pretendo cobrir o básico necessário para migrar do xmodmap para o XKB (talvez um pouco mais do que o básico, mas enfim).
O XKB é um pequeno monstro. Ele foi feito para resolver todos os problemas que ninguém teve antes dele. Por exemplo: existe uma seção do keymap, xkb_geometry, cujo objetivo é descrever a disposição física das teclas no teclado. Afinal, algum programa pode querer desenhar o teclado na tela (o comando xkbprint faz isso), ou saber que tecla fica do lado de qual. Nunca se sabe. Existem pelo menos três maneiras de descrever um layout pré-pronto (XkbKeymap, XkbRules, ou descrevendo componente por componente do keymap), e pelo menos três meios de ativar uma configuração (setxkbmap, xkbcomp ou pelo arquivo de configuração do X). E como todo programa no Unix, o XKB usa um arquivo de configuração com sua própria sintaxe idiossincrática, com seu próprio parser que emite mensagens de erro extremamente prestativas, como esta diante da falta de um ; na linha 21:
syntax error: line 23 of /root/.xkb/default last scanned symbol is: modifier_map Errors encountered in /root/.xkb/default; not compiled.
Alguém podia voltar no tempo e colocar um leitor de S-expressions na libc original.
Dito isso, muito da complexidade do XKB pode ser ignorada para tarefas mais simples de edição de keymap (leia-se: tudo o que era possível com o xmodmap). Além disso, o fato de o povo do X ter conseguido implementar as loucuras do XKB sem quebrar compatibilidade com os programas mais antigos é digno de três estrelinhas (pelo que eu entendo o próprio xmodmap continuou funcionando intacto depois da adição do XKB ao X, ainda que com ocasionais comportamentos estranhos).
But that's enough talk. Have at you!
Antes de mais nada, gostaria de esclarecer que XKB não é um programa, e sim uma infraestrutura de configuração de keymap. O XKB é composto por uma extensão do servidor X e um conjunto de funções da biblioteca Xlib que torna as funcionalidades do XKB acessíveis aos clientes X. Além disso, o X vem com alguns programas utilitários, tais como xkbcomp, setxkbmap e xkbprint, que utilizam a infraestrutura do XKB para ler e manipular o layout. (O xmodmap, por outro lado, é um programa que utiliza a o "core protocol" do X para manipular o teclado; a função do xmodmap é vagamente similar à do xkbcomp e setxkbmap.)
Outra diferença entre o xmodmap/core-protocol e o XKB é que no XKB não existe (aparentemente) a noção de alterar o keybinding de teclas individuais do keymap; é necessário sempre carregar um keymap completo. Por outro lado, os arquivos de configuração do XKB suportam uma diretiva include, que nos permite incluir um keymap pré-pronto em um arquivo de configuração e especificar apenas o que queremos de diferente do default.
O programa principal de controle do XKB é o xkbcomp. A função principal desse programa é ler um arquivo texto descrevendo um keymap e compilá-lo para um formato binário que o X é capaz de digerir. A sintaxe básica é:
xkbcomp [opções] origem destino
Porém, o xkbcomp é uma criatura bastante flexível. Você pode especificar como destino algo como :0, instruindo o xkbcomp a compilar o keymap e ativá-lo no display :0, sem necessidade de criar um arquivo binário intermediário. Além disso, você pode especificar :0 como origem para fazer um dump do keymap atual para um arquivo texto especificado como destino (você pode usar - para imprimir para a stdout). O dump do xkbcomp é enorme (1844 linhas na minha máquina; arquivos de keymap na prática usam includes, o que os torna muito menores), mas é útil para vermos quais são as diretivas de configuração possíveis e qual é a sintaxe de cada uma.
A função primária do setxkbmap é pôr em efeito um keymap pré-pronto. A sintaxe básica é:
setxkbmap [opções] [layout [variant [option...]]]
Onde layout, variant e option são uma das três maneiras de descrever um keymap no X (XkbRules). Exemplos:
setxkbmap br abnt2 # Layout ABNT-2 setxkbmap us intl # Layout US internacional (com acentos) setxkbmap br abnt2 ctrl:swapcaps # Layout ABNT-2 com Ctrl e CapsLock invertidos setxkbmap br abnt2 ctrl:nocaps # Layout ABNT-2, CapsLock se comporta como Ctrl
Como mencionado anteriormente, você pode atribuir keymaps diferentes a teclados diferentes usando a opção -device id, onde id é o id do dispositivo tal como exibido pelo comando xinput list.
O esquema de rules é muito bonito quando queremos usar um keymap pronto, mas não quando queremos fazer modificações ao keymap. Nesse caso, teremos que criar nosso próprio arquivo de keymap. Como não é possível aplicar um keymap parcial sobre o keymap existente com o XKB, e não queremos ter que descrever todo o keymap só para alterar meia dúzia de teclas, o ideal é usar includes. Felizmente, o setxkbmap suporta uma opção -print, que imprime um keymap do XKB que descreve o keymap atual (ou um especificado na linha de comando) em termos de includes:
# setxkbmap -print -option "" br abnt2
xkb_keymap {
xkb_keycodes { include "evdev+aliases(qwerty)" };
xkb_types { include "complete" };
xkb_compat { include "complete" };
xkb_symbols { include "pc+br(abnt2)+inet(evdev)" };
xkb_geometry { include "pc(pc105)" };
};
(O -option "" serve para resetar as options do XKB (tais como ctrl:nocaps e ctrl:swapcaps). Por padrão, o setxkbmap usa as opções ativas atualmente, mesmo que elas não sejam especificadas na linha de comando. Você também pode executar simplesmente setxkbmap -print, sem especificar um keymap, para usar o keymap atual (ou pelo menos o que o setxkbmap pensa que é o keymap atual).)
Eis um keymap completo! Se você salvar esse keymap em um arquivo, você pode usar o comando xkbcomp arquivo :0 para pôr o keymap em efeito.
Como podemos ver na saída do setxkbmap -print, um keymap é composto por cinco componentes:
Basicamente a única parte que nos interessa do keymap é a xkb_symbols; podemos ignorar todo o resto e simplesmente copiar a configuração emitida pelo setxkbmap.
A diretiva include instrui o xkbcomp a procurar os componentes especificados em seu caminho de pesquisa. Por padrão, o xkbcomp procurará no diretório /usr/share/X11/xkb. Dentro desse diretório você encontrará subdiretórios para cada componente (keycodes, symbols, etc.). O xkbcomp procurará no subdiretório apropriado dependendo da seção em que a diretiva include ocorrer.
Cada um desses arquivos pode conter mais de uma versão do mesmo componente. Uma diretiva da forma include "br(abnt2)" indica o componente chamado abnt2 dentro do arquivo br no diretório apropriado. Também é possível incluir múltiplos componentes, usando a sintaxe include "componente1+componente2".
Você pode adicionar outros diretórios ao caminho de pesquisa do xkbcomp usando a opção -Idiretório (sem espaço após o -I). O xkbcomp esperará encontrar os componentes a incluir dentro dos subdiretórios apropriados no diretório especificado (e.g., diretório/symbols, etc.).
Vamos ao que interessa: fazer com o XKB o que a essas alturas já teríamos feito com o xmodmap. Eis um arquivo de keymap de exemplo:
xkb_keymap {
xkb_keycodes { include "evdev+aliases(qwerty)" };
xkb_types { include "complete" };
xkb_compat { include "complete" };
xkb_symbols {
include "pc+br(abnt2)+inet(evdev)"
key <LatA> { [ a, A, aacute, Aacute ] };
key <AE02> { [ 3, numbersign, threesuperior ] };
key <CAPS> { [ Control_L ] };
modifier_map Control { <CAPS> };
};
xkb_geometry { include "pc(pc105)" };
};
O trecho em negrito são os comandos que adicionamos; o resto foi gerado pelo comando setxkbmap -print -option "" br abnt2. Note que não vai ponto-e-vírgula após o include.
O principal comando da seção xkb_symbols é o key. A sintaxe básica é:
key <nome-da-tecla> { [ level1, level2, level3, level4 ] };
Onde <nome-da-tecla> é o nome simbólico da tecla definido na seção xkb_keycodes (uma maneira "prática" de descobrir os nomes das teclas é olhar a seção xkb_symbols do keymap atual com o comando xkbcomp :0 - | less), e level1~level4 são (basicamente) os símbolos emitidos pela tecla pura, Shift+tecla, AltGr+tecla e AltGr+Shift+tecla. Você pode especificar menos que quatro níveis, se desejar.
O comando modifier_map associa teclas a modificadores, e tem basicamente a mesma função do comando add no xmodmap, com a diferença de que no XKB ele funciona direito. A sintaxe é:
modifier_map ModifierName { <nome-da-tecla-1>, <nome-da-tecla-2>, ... };
Onde ModifierName é algo como Control, Shift, Lock, Mod1, etc. (i.e., os mesmos modifiers do xmodmap), e <nome-da-tecla-1> é um nome simbólico de tecla, como <CAPS> ou <LCTL> (left Control) ou <RALT> (right Alt).
É possível especificar mais de um comando modifier_map com o mesmo modificador (o que é ótimo, pois o arquivo em que estamos dando include contém também suas próprias definições de modifier_map). Aparentemente não é possível desassociar um modificador de uma tecla (i.e., aparentemente não existe algo equiparável aos comandos remove e clear do xmodmap), mas o XKB parece ser esperto o suficiente para limpar uma tecla automaticamente quando ela é redefinida pelo comando key (i.e., não é necessário fazer os malabarismos de clear e add que tínhamos que fazer com o xmodmap para remapear Control e CapsLock).
Você pode salvar esse keymap e executar xkbcomp arquivo :0 para pô-lo em vigor.
Simples, hã? Se tudo o que você queria era fazer com o XKB o que você fazia com o xmodmap, você já tem toda a informação de que precisa. (Exceto o comando pointer do xmodmap, cujo equivalente no XKB, se houver, eu não conheço.)
Se você fizer um dump do keymap atual com xkbcomp :0 -, verá que a sintaxe que ele usa para o comando key é um pouco mais verbosa:
key <AC01> {
type= "FOUR_LEVEL_ALPHABETIC",
symbols[Group1]= [ a, A, aacute, Aacute ]
};
Comecemos pelo fim. A sintaxe symbols[Group1] = [ ... ] indica que os quatro símbolos estão sendo associados aos quatro níveis do grupo Group1 da tecla. Basicamente, o nível de uma tecla é afetado pelas teclas Shift, AltGr e CapsLock. É por isso que, em versões modernas do X, a tecla AltGr é associada ao símbolo ISO_Level3_Shift, como discutido no post sobre o xmodmap.
Um grupo, por sua vez, é uma maneira de atribuir diversos conjuntos de símbolos para uma mesma tecla. Por exemplo, se você costuma escrever em russo, você pode ter um layout ABNT-2 no grupo Group1 e um layout russo no grupo Group2, e atribuir uma tecla para alternar entre os grupos. A vantagem de se usar, por exemplo, dois grupos de quatro níveis ao invés de um grupo de oito níveis, é que cada grupo pode ser definido em um arquivo separado. Se você usar uma diretiva do tipo:
include "pc+br(abnt2)+us(intl):2"
você está instruindo o xkbcomp a incluir o layout br(abnt2) como o primeiro grupo e o layout us(intl) como o segundo*. Você pode então definir uma tecla para alternar entre os dois grupos: o símbolo Mode_switch alterna para o próximo grupo enquanto a tecla é pressionada, e ISO_Next_Group, ISO_Prev_Group e outros alternam permanentemente o grupo atual (como se fosse um CapsLock para grupos).
Ao invés de usar a sintaxe symbols[Group1] = [ ... ], symbols[Group2] = [ ... ], você pode simplesmente especificar mais de um grupo envolvido em [ ... ] dentro do comando key:
key <AC01> { [ a, A, aacute, Aacute ], [ ae, AE, aring, Aring ] };
Agora voltemos ao começo. type= "FOUR_LEVEL_ALPHABETIC" diz que o tipo da tecla A é FOUR_LEVEL_ALPHABETIC. Se nós olharmos o conteúdo da seção xkb_types do dump do xkbcomp, encontraremos a seguinte definição:
type "FOUR_LEVEL_ALPHABETIC" {
modifiers= Shift+Lock+LevelThree;
map[Shift]= Level2;
map[Lock]= Level2;
map[LevelThree]= Level3;
map[Shift+LevelThree]= Level4;
map[Lock+LevelThree]= Level4;
map[Shift+Lock+LevelThree]= Level3;
level_name[Level1]= "Base";
level_name[Level2]= "Shift";
level_name[Level3]= "Alt Base";
level_name[Level4]= "Shift Alt";
};
O que essa definição nos diz é que uma tecla do tipo FOUR_LEVEL_ALPHABETIC é afetada pelos modificadores Shift, Lock e LevelThree (i.e., AltGr), e que diferentes combinações desses modificadores ativam diferentes níveis da tecla. As teclas de pontuação, por outro lado, são do tipo FOUR_LEVEL. A definição de FOUR_LEVEL é similar à de FOUR_LEVEL_ALPHABETIC, mas não inclui o Lock entre os modificadores que afetam a tecla. As teclas do keypad numérico, por sua vez, são do tipo FOUR_LEVEL_KEYPAD, que é análogo ao FOUR_LEVEL_ALPHABETIC, mas usa o modificador NumLock ao invés de Lock para escolher os níveis superiores. Há diversos outros tipos de teclas, definidos de maneira similar.
Por hoje ficamos por aqui. O XKB possui inúmeras outras features, sobre as quais talvez eu venha escrever no futuro. Para mais informações, consulte os links já referidos, e dê uma olhada na saída do xkbcomp :0 -.
____
* Três estrelinhas para o primeiro que achar essa informação documentada em algum lugar; eu descobri olhando o /usr/share/X11/xkb/rules/xorg, chutando o significado do :n e testando. By the way, aparentemente simplesmente não existe documentação oficial, que dirá uma especificação, da sintaxe desses arquivos. Para mais informações, consulte o código-fonte da libxkbfile. (E não, a gramática não é especificada por um arquivo yacc da vida. Vire-se no parser escrito à mão em C, se sua paciência for capaz.)
Depois de três anos esperando na fila (não-ordenada) de livros a ler, finalmente me parei a ler Stranger in a Strange Land, do camarada Heinlein. O livro tem duas edições: a primeira, publicada em 1961, com uma quantidade fantástica de cortes exigidos pelo editor (de cerca de 220 000 palavras do manuscrito original para 160 067 palavras na versão publicada, i.e., um quarto do livro foi cortado fora); e a segunda, sem cortes, publicada postumamente em 1991. Eu li a segunda.
Diagnóstico: nem lá nem cá.
O livro não é ruim. Eu até me arriscaria a dizer que o livro é bom, e recomendo se você não tiver nada mais interessante em espera no momento; julgue-o por si mesmo. Mas o que eu tinha lido ou ouvido falar sobre o livro até então tinha me feito imaginá-lo na categoria "life-changing" (junto com The Dispossessed, The Left Hand of Darkness e Anthem), e nesse quesito o livro deixa a desejar.
Para um resumo decente da história, consulte a Wikipédia. A idéia básica é que um guri humano (doravante Mike) foi criado entre os marcianos, aprendeu a usar poderes muito doidos e a raciocinar de uma maneira mais doida ainda, é trazido de volta para a Terra, tem dificuldades de entender como as coisas funcionam por aqui e como funciona o raciocínio humano, e no fim funda uma "igreja" para ensinar aos humanos o que ele sabe. Segue uma discussão de certos aspectos que me chamaram atenção no livro.
Uma porção preocupante do texto consiste de descrições do protagonista e seus amiguinhos utilizando seus poderes de telecinese e de fazer coisas desaparecerem irrecuperavelmente (o livro dá a entender que as coisas são movidas ao longo de uma quarta dimensão espacial, mas não diz quais são as implicações da existência dessa dimensão extra, nem explica por que as coisas não podem ser trazidas de volta). Uma porção preocupante dessa porção preocupante consiste do Mike fazendo as roupas da Jill e outras guriazinhas sumirem. Na maior parte do tempo, esses poderes são usados sem nenhum propósito decente por trás, apenas "for the lol" (o que não seria ruim se não fosse tão freqüente). Isso sem contar o desperdício de material (basicamente a Jill usa uma roupa menos de meia dúzia de vezes antes de ela ser mandada para o espaço pelo Mike, e a coisa fica pior quando ela e outras vão morar no templo da Igreja de Todos os Mundos). Vai ver toda a tralha que os marcianos atiram pela quarta dimensão é que é responsável pela suposta dark matter do universo.
Além disso, certas frases, como "Thou art God" e "Waiting is", são repetidas a ponto de se tornarem irritantes.
Uma review que eu li antes de escrever esta aqui me lembrou que esse livro foi escrito em 1961. Isso quer dizer que as cenas que demonstram os "preceitos sexuais" incorporados pela Igreja de Todos os Mundos, incluindo a galera pelada e as roupas que desaparecem e o todo-o-mundo-é-de-todo-o-mundo-só-que-não-exatamente, eram não apenas "incomuns", mas sim "chocantes", tão chocantes quanto o Ben Caxton parece achar em um diálogo perto do final do livro. Talvez isso justifique um pouquinho assim, quase nada, a repetitividade dessas cenas. Bom, na verdade não. De qualquer forma, é bom ter a idade do livro em mente.
Mas se por um lado a idade do livro coloca esse aspecto do mesmo em uma luz mais favorável, por outro lado o sexismo do Jubal e do Mahmoud, que para um leitor moderno parecem ou piada ou crítica social, se transportados para os anos sessenta correm o sério risco de serem interpretados como "as coisas como elas são". Em nenhum momento do livro as atitudes e dizeres desses dois (tais como "a woman who can't cook is a waste of skin") são diretamente confrontadas. Aliás, em um ponto do livro uma das gurias, quando questionada, diz explicitamente ao Jubal que "you have never at any time been rude to any of us", dando um approval às ações do Jubal até então. Ok, o Mahmoud é árabe e muçulmano, uma cultura tradicionalmente não muito favorável às mulheres, mas o Jubal, embora seja um velho de dez mil anos, era para representar uma mente "iluminada", "who can 'grok in fullness' without needing to learn Martian first".
Sem contar a pérola proferida pela própria Jill: "Nine times out of ten, if a girl gets raped, it's at least partly her own fault."
"[…] You see, Mike thinks in Martian—and this gives him an entirely different 'map' of the universe from that which you and I use. You follow me?"
"I grok it," agreed Jubal. "Language itself shapes a man's basic ideas."
"Yes, but— Doctor, you speak Arabic, do you not?"
"Eh? I used to, badly, many years ago," admitted Jubal. "Put in a while as a surgeon with the American Field Service, in Palestine. But I don't now. I still read it a little… because I prefer to read the words of the Prophet in the original."
"Proper. Since the Koran cannot be translated—the 'map' changes on translation no matter how carefully one tries. You will understand, then, how difficult I found English. It was not alone that my native language has much simpler inflections and more limited tenses; the whole 'map' changed. English is the largest of the human tongues, with several times the vocabulary of the second largest language—this alone made it inevitable that English would eventually become, as it did, the lingua franca of this planet, for it is thereby the richest and the most flexible—despite its barbaric accretions… or, I should say, because of its barbaric accretions. English swallows up anything that comes its way, makes English out of it. Nobody tried to stop this process, the way some languages are policed and have official limits . . probably because there never has been, truly, such a thing as 'the King's English'—for 'the King's English' was French. English was in truth a bastard tongue and nobody cared how it grew… and it did!—enormously. Until no one could hope to be an educated man unless he did his best to embrace this monster.
"Its very variety, subtlety, and utterly irrational, idiomatic complexity makes it possible to say things in English which simply cannot be said in any other language. It almost drove me crazy… until I learned to think in it—and that put a new 'map' of the world on top of the one I grew up with. A better one, in many ways—certainly a more detailed one.
"But nevertheless there are things which can be said in the simple Arabic tongue that cannot be said in English."
O inglês é a "maior língua", hã? Substituamos mentalmente essa afirmação por "a língua com o maior vocabulário", que pelo menos ameaça fazer sentido. Como se mede o tamanho do vocabulário de uma língua? O que conta como um item de vocabulário? Expressões compostas (e.g., computer science, washing machine) contam? Palavras com múltiplos significados contam como entradas separadas? Palavras em desuso? Há mil questões em aberto a responder antes de contar o "tamanho do vocabulário" de uma língua. De qualquer forma, não parece nem um pouco claro que o inglês tem o maior vocabulário, por qualquer medida de vocabulário, nem qual seria a segunda língua referida.
E se o inglês fosse "a língua mais rica e a mais flexível", para alguma definição de "rica" e "flexível", esse seria o motivo pelo qual ele teria se tornado "a língua franca deste mundo", e não o poder econômico do Estados Unidos, e da Inglaterra antes dele? Se a língua mais falada nos Estados Unidos fosse o cherokee ou o espanhol, o inglês ainda teria se tornado "a língua franca deste mundo", graças à sua riqueza e flexibilidade? O uso do latim como língua franca na Europa até o século 18 tem alguma coisa a ver com a "flexibilidade e riqueza" dessa língua?
E por fim: "the simple Arabic tongue"? Com "much simpler inflections and more limited tenses"? Dai-me um desconto.
"Mmm… yes. Anne, change that job title to 'staff research assistant for Martian linguistics, culture, and techniques.' Jill, in learning their language you are bound to stumble onto Martian things that are different, really different—and when you do, tell me. Everything and anything about a culture can be inferred from the shape of its language—and you're probably young enough to learn to think like a Martian… which I misdoubt I am not. And you, Mike, if you notice anything which you can do but we don't do, tell me."
"Everything and anything"? Se eu atirar uma gramática de hitita e um dicionário na sua mesa, você será capaz de me dizer absolutamente tudo sobre a cultura dos hititas?
Em outro ponto, sobre a possibilidade de Marte resolver atacar a Terra:
Mahmoud said suddenly, "Skipper, there's strong evidence to support Jubal's conclusion. You can analyse a culture from its language, every time —and there isn't any Martian word for 'war.'" He stopped and looked puzzled. "At least, I don't think there is. Nor any word for 'weapon' nor for 'fighting.' If a word for a concept isn't in a language, then its culture simply doesn't have the referent the missing word would symbolize."
"Oh, twaddle, Stinky! Animals fight—and ants even conduct wars. Are you trying to tell me they have to have words for it before they can do it?"
"I mean exactly that," Mahmoud insisted, "when it applies to any verbalizing race. Such as ourselves. Such as the Martians—even more highly verbalized than we are. A verbalizing race has words for every old concept… and creates new words or new definitions for old words whenever a new concept comes along. Always! A nervous system that is able to verbalize cannot avoid verbalizing; it's automatic. If the Martians know what 'war' is, then they have a word for it."
"I mean exactly that", só que não. Quando surge um novo conceito, novas palavras são criadas, diz el hombre Mahmoud. Então o conceito pode vir antes da palavra, não? Além disso, pode ser que haja algo sem que haja o conceito. "If the Martians know what 'war' is, then they have a word for it", mas eles podem ter o que nós chamamos de guerra sem saber o que é "guerra".
Ao longo do livro nós descobrimos que os marcianos destruíram o "quinto planeta" (entre Marte e Júpiter), por motivos não explicados, e que a Terra estaria por ir pelo mesmo caminho no final. Isso se contrapõe de certa forma com a idéia de que "da língua descobrimos tudo", embora o livro não diga isso explicitamente (talvez como um exercício para o leitor).
She tossed one [peanut] to a medium sized monk; before he could eat it a much larger male was on him and not only stole his peanut but gave him a beating, then left. The little fellow made no attempt to pursue his tormentor; he squatted at the scene of the crime, pounded his knucks against the concrete floor, and chattered his helpless rage. Mike watched it solemnly. Suddenly the mistreated monkey rushed to the side of the cage, picked a monkey still smaller, bowled it over and gave it a drubbing worse than the one he had suffered—after which he seemed quite relaxed. The third monk crawled away, still whimpering, and found shelter in the arm of a female who had a still smaller one, a baby, on her back. The other monkeys paid no attention to any of it.
Mike threw back his head and laughed—went on laughing, loudly and uncontrollably. He gasped for breath, tears came from his eyes; he started to tremble and sink to the floor, still laughing.
[…]
"Mike, what happened?"
"Jill … I grok people!"
"Huh?" ("!!??")
("I speak rightly, Little Brother. I grok.")
"I grok people now, Jill Little Brother… precious darling, little imp with lively legs and lovely lewd lascivious lecherous licentious libido… beautiful bumps and pert posterior… with soft voice and gentle hands. My baby darling."
"Why, Michael!"
"Oh, I knew all the words; I simply didn't know when or why to say them… nor why you wanted me to. I love you, sweetheart—I grok 'love' now, too."
"You always have. I knew. And I love you … you smooth ape. My darling."
"'Ape,' yes. Come here, she ape, and put your head on my shoulder and tell me a joke."
"Just tell you a joke?"
"Well, nothing more than snuggling. Tell me a joke I've never heard and see if I laugh at the right place. I will, I'm sure of it—and I'll be able to tell you why it's funny. Jill … I grok people!"
"But how, darling? Can you tell me? Does it need Martian? Or mindtalk?"
"No, that's the point. I grok people. I am people … so now I can say it in people talk. I've found out why people laugh. They laugh because it hurts so much… because it's the only thing that'll make it stop hurting."
Jill looked puzzled. "Maybe I'm the one who isn't people. I don't understand."
"Ah, but you are people, little she ape. You grok it so automatically that you don't have to think about it. Because you grew up with people. But I didn't. I've been like a puppy raised apart from other dogs—Who couldn't be like his masters and had never learned how to be a dog. So I had to be taught. Brother Mahmoud taught me, Jubal taught me, lots of people taught me… and you taught me most of all. Today I got my diploma—and I laughed. That poor little monk."
"Which one, dear? I thought that big one was just mean … and the one I flipped the peanut to turned out to be just as mean. There certainly wasn't anything funny."
"Jill, Jill my darling! Too much Martian has rubbed off on you. Of course it wasn't funny—it was tragic. That's why I had to laugh. I looked at a cageful of monkeys and suddenly I saw all the mean and cruel and utterly unexplainable things I've seen and heard and read about in the time I've been with my own people and suddenly it hurt so much I found myself laughing."
"But— Mike dear, laughing is something you do when something is nice… not when it's horrid."
"Is it? Think back to Las Vegas— When all you pretty girls came out on the stage, did people laugh?"
"Well … no."
"But you girls were the nicest part of the show. I grok now, that if they had laughed, you would have been hurt. No, they laughed when a comic tripped over his feet and fell down… or something else that is not a goodness."
"But that's not all people laugh at."
"Isn't it? Perhaps I don't grok all its fullness yet. But find me something that really makes you laugh, sweetheart… a joke, or anything else—but something that gave you a real belly laugh, not a smile. Then we'll see if there isn't a wrongness in it somewhere and whether you would laugh if the wrongness wasn't there." He thought. "I grok when apes learn to laugh, they'll be people."
"Maybe." Doubtfully but earnestly Jill started digging into her memory for jokes that had struck her as irresistibly funny, ones which had jerked a laugh out of her… incidents she had seen or heard of which had made her helpless with laughter:
"—her entire bridge club."
"Should I bow?"
"Neither one, you idiot — instead!"
"—the Chinaman objects."
"—broke her leg."
"—make trouble for me!"
"—but it'll spoil the ride for me."
"—and his mother-in-law fainted."
"Stop you? Why, I bet three to one you could do it!"
"—something has happened to Ole."
"—and so are you, you clumsy ox!"
She gave up on "funny" stories, pointing out to Mike that such were just fantasies, not real, and tried to recall real incidents. Practical jokes? All practical jokes supported Mike's thesis, even ones as mild as a dribble glass—and when it came to an interne's notion of a practical joke—Well, internes and medical students should be kept in cages. What else? The time Elsa Mae had lost her monogrammed panties? It hadn't been funny to Elsa Mae. Or the— She said grimly, "Apparently the pratfall is the peak of all humor. It's not a pretty picture of the human race, Mike."
"Oh, but it is!"
"Huh?"
"I had thought—I had been told—that a 'funny' thing is a thing of a goodness. It isn't. Not ever is it funny to the person it happens to. Like that sheriff without his pants. The goodness is in the laughing itself. I grok it is a bravery… and a sharing… against pain and sorrow and defeat."
"But— Mike, it is not a goodness to laugh at people."
"No. But I was not laughing at the little monkey. I was laughing at us people. And I suddenly knew that I was people and could not stop laughing." He paused. "This is hard to explain, because you have never lived as a Martian, for all that I've told you about it. On Mars there is never anything to laugh at. All the things that are funny to us humans either physically cannot happen on Mars or are not permitted to happen— sweetheart, what you call 'freedom' doesn't exist on Mars; everything is planned by the Old Ones—or the things that do happen on Mars which we laugh at here on Earth aren't funny because there is no wrongness about them. Death, for example."
"Death isn't funny."
"Then why are there so many jokes about death? Jill, with us—us humans—death is so sad that we must laugh at it. All those religions— they contradict each other on every other point but every one of them is filled with ways to help people be brave enough to laugh even though they know they are dying." He stopped and Jill could feel that he had almost gone into his trance state. "Jill? Is it possible that I was searching them the wrong way? Could it be that every one of all those religions is true?" […]
Esse é um dos trechos que mais me incomoda nesse livro. Não meramente porque eu não concordo com a conclusão, mas pelo fato de a Jill não contra-argumentar decentemente, o que dá uma sensação de o autor ter escolhido os fatos cuidadosamente para sustentar a teoria. Trocadilhos são o exemplo mais óbvio de coisas que causam riso sem relação aparente com "dor e sofrimento". E eu tenho vinte e dois anos de experiência com risadas (e "real belly laughs, not smiles") baseadas apenas em dizer e conceber bobagens, no pain involved. Se há alguma associação entre riso e "wrongness", é no sentido de que o que causa riso normalmente é algo inesperado, que escapa da lógica normal das coisas, mas definitivamente não necessariamente "wrongness" no sentido "marciano" usado no livro. De qualquer forma, é interessante pensar sobre o assunto.
(By the way: diversos filmes de comédia estadunidenses têm a propriedade de me fazer sentir "wrongness". Pode ser que eu escreva um post sobre isso.)
Para compensar as críticas, eis aí um trecho do livro que eu realmente gosto, no capítulo XXX. Eu ia copiá-lo aqui, mas o trecho relevante é longo, e o começo do mesmo, junto com uma das esculturas referidas, pode ser encontrado aqui.
Uma impressão com a qual eu fiquei do livro logo que terminei (mas agora já não tenho mais certeza) é que as idéias interessantes do livro poderiam ter sido igualmente expressas em um ensaio de vinte páginas sem perdas significativas. O livro não passa uma imagem muito complexa da maior parte dos personagens. Depois que a Jill consegue levar o Mike para a casa do Jubal, a história parece não ter muito foco, os personagens não têm objetivos muito definidos, não há muito suspense. Tomo as palavras do supra-citado review:
Beyond that, there isn’t really a plot. It starts out looking as if it’s going to have a plot—politicians scheming against Mike—but that gets defanged, politicians are co-opted. The rest of the book is Mike wandering about the US looking at things and then starting a religion where everybody gets to have lots of sex and no jealousy and learns to speak Martian. Everything is too easy. Barriers go down when you lean on them. Mike can make people disappear, he can do magic, he has near infinite wealth, he can change what he looks like, he’s great in bed… Then out of nowhere he gets killed in a much too parallel messianic martyrdom, and his friends eat his body.
Acho que não tenho mais nada a declarar por ora.
Pois acabei de assistir esse filme. I approve of it.
It's time to start living in the indicative.
(O script desenvolvido neste post pode ser encontrado aqui.)
Em um episódio anterior deste blog, vimos como usar o xmodmap para alterar o keymap do X. Também vimos que embora o xmodmap seja muito mais simples de usar do que o XKB, ele está semi-obsoleto e não lida muito bem com certos recursos mais modernos do XKB. Recentemente eu descobri mais um: o xmodmap não funciona direito com múltiplos teclados (e.g., um teclado builtin de notebook e um teclado externo). Especificamente:
Sendo assim, temos dois problemas a resolver: detectar quando um teclado é conectado (o que independe de usarmos xmodmap ou XKB), e atribuir um layout a ele (o que exige o XKB se quisermos usar um layout específico para cada teclado; se quisermos apenas propagar o layout corrente para o novo teclado, podemos usar o xmodmap).
A maneira mais palatável que eu encontrei de detectar o teclado* é monitorando o arquivo de log do X (/var/log/Xorg.n.log, onde n é o número do display). As linhas relevantes do arquivo têm a forma:
[ 10848.216] (II) XINPUT: Adding extended input device "GASIA GASIA USB KB Pro" (type: KEYBOARD)
Podemos fazer um script que monitora esse arquivo com o comando tail -f, filtra apenas os dados que nos interessam, e fica em um laço aguardando que novas linhas sejam escritas no arquivo:
#!/bin/bash
[[ $DISPLAY == :* ]] || echo "$0: Oops, remote display?" >&2
display="${DISPLAY##*:}"
display="${display%%.*}"
logfile="/var/log/Xorg.$display.log"
tail -n +1 -f "$logfile" |
sed -une 's/.*XINPUT: Adding extended input device "\([^"]*\)" (type: \([^)]*\)).*/\2\t\1/p' |
while IFS=$'\t' read type name; do
echo "Dispositivo detectado: $name"
# comandos...
done
Salve esse script em algum local apropriado (e.g., ~/bin/xinput-monitor) e dê-lhe permissão de execução (chmod +x ~/bin/xinput-monitor). Você pode executá-lo como está para testar se os dispositivos estão sendo realmente detectados (experimente conectar um teclado externo com o script rodando).
A opção -n +1 faz com que o tail imprima o conteúdo do arquivo desde a primeira linha antes de começar a monitorá-lo; isso faz com que o script "detecte" mesmo os dispositivos que já estavam conectados antes de ele rodar. Se você não desejar esse comportamento, pode trocar o -n +1 por -n 0.
Se tudo o que você quer é rodar o xmodmap (ou qualquer outro comando) quando um dispositivo é conectado, basta colocar o comando no trecho indicado no while. Feito isso, basta pôr o script para rodar na inicialização de seu ambiente gráfico (colocando uma linha do tipo ~/bin/xinput-monitor & no seu ~/.xinitrc ou ~/.xsession, ou em algum arquivo de configuração do seu ambiente gráfico favorito).
Note que nem todos os dispositivos listados são teclados (nem mesmo todos os dispositivos com type: KEYBOARD são teclados); se você não quiser executar o xmodmap uma vez para cada um desses dispositivos (o que em tese é inofensivo, mas nunca se sabe), você pode usar um if ou case para ignorar os dispositivos que não lhe interessam. Por exemplo:
...
while IFS=$'\t' read type name; do
echo "Dispositivo detectado: $name"
case "$name" in
'Power Button'|'Video Bus'|'Integrated Webcam'|*'Synaptics'*)
# Não faz nada.
;;
*)
# Os comandos que desejamos executar quando um teclado é conectado.
xmodmap ~/.xmodmaprc
xset r rate 250
xkbset exp =m
;;
esac
done
Para atribuir um layout individual para cada teclado conectado, teremos que abandonar o bom[citation needed] e velho xmodmap e entrar no maravilhoso[dubious – discuss] mundo do XKB. Felizmente, usar um layout pronto com o XKB é bem simples: basta executar um comando como:
# Layout ABNT-2. setxkbmap -device device_id br abnt2 # Layout US internacional (com acentos). setxkbmap -device device_id us intl
A opção -device device_id indica qual teclado o comando deve afetar. Se ela não for especificada, o comando afeta todos os teclados.
O grande problema é determinar o device_id de cada teclado; ele pode variar dependendo dos dispositivos presentes e da ordem em que o X os encontra. Aparentemente o id não aparece no arquivo de log do X. A solução é usar o xinput (que vem no pacote xinput no Debian, Ubuntu e companhia), um comando que permite ver e modificar diversas configurações de dispositivos de entrada no X (tais como os dez mil parâmetros que controlam velocidade, aceleração, gestures e outras firulas de touchpads), entre outras coisas. O comando xinput list produz uma listagem dos dispositivos presentes e respectivos ids, com a seguinte cara:
# xinput list ⎡ Virtual core pointer \tid=2\t[master pointer (3)] ⎜ ↳ Virtual core XTEST pointer \tid=4\t[slave pointer (2)] ⎜ ↳ SynPS/2 Synaptics TouchPad \tid=13\t[slave pointer (2)] ⎜ ↳ GASIA GASIA USB KB Pro \tid=10\t[slave pointer (2)] ⎣ Virtual core keyboard \tid=3\t[master keyboard (2)] ↳ Virtual core XTEST keyboard \tid=5\t[slave keyboard (3)] ↳ Power Button \tid=6\t[slave keyboard (3)] ↳ Video Bus \tid=7\t[slave keyboard (3)] ↳ Power Button \tid=8\t[slave keyboard (3)] ↳ Integrated Webcam \tid=11\t[slave keyboard (3)] ↳ AT Translated Set 2 keyboard \tid=12\t[slave keyboard (3)] ↳ GASIA GASIA USB KB Pro \tid=9\t[slave keyboard (3)]
(Os \t representam TABs.)
Um problema visível nessa saída é que pode haver mais de um dispositivo com o mesmo nome (temos dois Power Button e dois GASIA GASIA USB KB Pro (sendo que um deles é um mouse (!))). Como chamar o setxkbmap sobre um não-teclado parece não ter efeito algum, podemos simplesmente tentar os dois ids e nos darmos por satisfeitos.
O primeiro passo é obter os ids a partir dos nomes. Para isso, podemos recorrer ao sed:
device_ids="$(xinput list | sed -n "s|.*↳ $name *\tid=\([^\t]*\)\t.*|\1|p")"
Com os ids à mão, basta executar o setxkbmap para cada id, usando os parâmetros apropriados dependendo do nome do dispositivo detectado (altere as cláusulas do case para "configurar" o script para os seus teclados e layouts):
for id in $device_ids; do
case "$name" in
'AT Translated Set 2 keyboard') setxkbmap -device "$id" us intl ;;
'Some weird keyboard') setxkbmap -device "$id" is ;;
*) setxkbmap -device "$id" br abnt2 ;;
esac
done
E era isso. Eis uma versão completa do script. Ficou faltando resolver o problema de portar um xmodmaprc personalizado (caso você tenha um) para o XKB, mas isso fica para um próximo post.
(Este foi o 100-ésimo post do blog, por sinal.)
____
* Outra maneira freqüentemente citada pelo povo da Internet é alterar as configurações do udev para rodar um script quando o teclado é conectado. Além de exigir direitos de root, o script vai ter que descobrir o nome que o X atribui ao teclado por vodu, vai rodar como root (a menos que você tome a precaução de fazer o script trocar para o usuário "dono" da sessão X, o que implica descobrir quem é o dono), e você vai ter que tomar precauções para o caso de haver mais de um display X rodando (por exemplo, se você estiver usando a função "trocar de usuário" de certos ambientes gráficos). Just say no.
Eis algumas observações, perguntas e especulações.
As formas irregulares do futuro do subjuntivo no português do Brasil estão caindo em desuso em geral* (aparentemente ainda mais entre falantes mais jovens, a tal ponto que eu estou quase largando de mão de corrigir crianças quando dizem "quando eu fazer" ao invés de "quando eu fizer", em parte porque eu teria que corrigir as pessoas com quem elas convivem também). Dois verbos, entretanto, se "comportam mal" praticamente universalmente entre falantes de todas as idades e sabores.
O primeiro é o verbo ver, cujo subjuntivo futuro tradicional é vir, mas não sei se já ouvi ser assim usado na linguagem falada. (Por outro lado, frases como "quando ela vir o que eu fiz, vai ficar fula da vida" não me soam lá muito estranhas. (Não tenho certeza, mas acredito que eu praticamente sempre uso vir por escrito e ver quando estou falando, sem me dar conta em nenhum dos casos.))
O segundo verbo, vir, é ainda mais doido. Descontente em apenas fundir o infinitivo com o futuro do subjuntivo, o próprio infinitivo ganhou uma forma nova, vim, produzindo o único verbo da língua portuguesa cujo infinitivo não termina em -r**. Frases como "ele vai vim amanhã" são extremamente comuns, e a forma tradicional, "ele vai vir amanhã", é praticamente unheard of na língua falada.
O verbo vir apresenta (mais) uma peculiaridade, entretanto: tanto vim quanto vier parecem estar em uso corrente como futuro do subjuntivo, e a impressão que eu tenho é de que um mesmo falante alterna entre as duas formas. As perguntas que eu me (e vos) faço são:
Eis umas frases para ponderar sobre (em "português brasileiro falado"):
Feedback é mui bem-vindo.
_____
* Com exceção de uns poucos verbos mais freqüentes, tais como ser/for, ter/tiver, dizer/disser, e olhe lá. (Mui interessantemente, essa regularização separa as formas de ser/for e ir/ir no futuro do subjuntivo.)
** No português falado, com exceção de pôr e derivados (e olhe lá), os infinitivos regulares (i.e., todos, menos o bendito vim) terminam em vogais tônicas. Desconfio que o vir tenha rejeitado a pronúncia "esperada" por conflito com a forma (eu) vi, e tenha rejeitado manter o -r por pura pirraça. Talvez o -m (a.k.a. consoante nasal genérica que normalmente não tem som de [m] em final de sílaba) seja um resquício do tempo em que esse verbo tinha a forma venir. Se esse é o caso, a pronúncia vim provavelmente é algo bem antigo na língua.
A situação ao final de julho do ano passado era a seguinte: depois de muitos semestres com uma quantidade apreciável de disciplinas menos-que-maravilhosas, eu teria um semestre com apenas 10 créditos de cadeiras, uma monitoria mui pouco time-consuming, morando sozinho, sem ninguém para me perturbar, ridiculamente próximo da universidade. Eu teria uma quantidade de tempo livre sem precedentes desde o início da faculdade. Eu poderia me dedicar a desenvolver a linguagem de programação perfeita. Eu poderia estudar todas as línguas que quisesse. Eu poderia aprender a tocar a shakuhachi que estava pegando pó há um ano e meio. Eu poderia me dedicar a fazer o que quer que fosse.
Foi um dos semestres mais improdutivos dos últimos cinco anos.
Não que eu não tenha feito nada. Eu li uma quantidade praticamente nociva de blogs e papers e manuais e artigos da Wikipédia nesse período. Mas eu não produzi muita coisa nesse período: foi muito mais input do que output.
A moral da história é que muitas vezes a desculpa de não fazer as coisas por "não ter tempo" é um fraude. Ok, há pessoas que trabalham quarenta mil horas por semana e estudam e realmente não têm tempo de fazer mais muita coisa. Mas esse nunca foi o meu caso. Com exceção de uns poucos períodos em que o curso estava meio demás e eu tinha trabalho da bolsa para fazer, eu sempre tive um bocado de tempo livre, e se não o aproveitei direito foi por vadiagem, ou falta de motivação.
Na verdade eu andei fantasticamente desmotivado de fazer qualquer coisa nos últimos tempos, por mil motivos (sic), e por motivo nenhum. Não tenho bons conselhos a oferecer em termos de motivação. O que eu sei é que: (1) é incrivelmente fácil postergar indefinidamente, especialmente quando se tem alguma outra atividade que não exija esforço para consumir o tempo com; e (2) a Internet provê uma fonte infinita de atividades que não exigem esforço. Assim, limitar o tempo que se consome na Internet parece uma boa estratégia para levar uma vida mais produtiva. (No geral, as pessoas não gostam de ficar muito tempo sem fazer nada; normalmente elas acham alguma distração para ocupar seu tempo com. Elimine as distrações e o que sobra é o trabalho a ser feito.)
Nem todo o tempo que eu perco na Internet é totalmente inútil; pelo contrário, muito desse tempo eu passo lendo material técnico sobre coisas que me interessam e que são relevantes para o que eu gostaria de desenvolver. E aí reside um perigo, porque é muito fácil nesse caso justificar o tempo que se consome lendo ao invés de produzindo. Acontece que essa tal de humanidade já fez muita coisa, e se o camarada for parar para pesquisar tudo o que existe de "prior art" antes de fazer algo, vai acabar não fazendo nada. Pesquisar o que existe é importante (e freqüentemente muito interessante), mas uma hora a gente tem que parar de ler e pôr a mão na massa.
Outra fonte de postergação indefinida em desenvolvimento de software (pelo menos para mim) é se perder em questões de design e nunca decidir nada. (Heh.) Para projetos suficientemente grandes (e.g., linguagens de programação e respectivas implementações, sistemas operacionais), design é um problema tão grande ou maior do que implementação, pois há uma quantidade enorme de decisões de design a se tomar e possibilidades a explorar; decidir o que exatamente o software deve fazer, quais são seus objetivos, são as questões difíceis. Mas embora pensar com calma sobre design seja importante (afinal o objetivo é criar uma linguagem (por exemplo) que ofereça alguma vantagem significativa sobre o que existe), para sairmos do lugar, em algum momento temos fixar certas decisões (para valores suficientemente fluídos de 'fixar'), mesmo que não tenhamos certeza de que seja a solução ótima (ou que tenhamos certeza de que não é, mas não temos nada melhor no momento), e partir para a implementação. Assim, temos um produto concreto para experimentar e para nos guiar no processo de decisão. Em todo caso, produzimos alguma coisa, que se não é ideal, com alguma sorte é pelo menos um avanço em algum aspecto em relação ao que existe.
Tendo tratado a questão da inércia, falemos da dominação mundial.
Em algum ponto de suas vidas, algumas pessoas têm o seguinte pensamento: "Os ambientes computacionais modernos estão completamente errados. Se eu fosse começar tudo do zero, eu faria tudo diferente. Hmm, começar do zero...", e começam a arquitetar como seria o sistema ideal e todas as features legais que ele teria. Algumas se arriscam a levar o projeto adiante. Afinal, não pode ser tão complicado criar um sistema operacional, não é mesmo?
Normalmente esses projetos não acabam bem.
A insistência em construir as coisas do zero, embora tenha seu apelo, tem um custo (freqüentemente subestimado) muito maior do que o benefício. Mesmo que seja viável escrever um sistema operacional inteiro "from the ground up", com todos os detalhes exatamente corretos, o tempo que se perde implementando funcionalidades básicas do sistema (gerência de hardware, alocação de memória, agendamento de tarefas, e uma miríade de outras coisas) é tempo que poderia estar sendo usado para implementar as features que realmente interessam, e que poderiam ser implementadas sobre um sistema operacional existente. Mesmo features que "contradizem" o sistema operacional existente muitas vezes podem ser implementadas com uma pequena dose de gambiarra. Quer um mecanismo de segurança baseado em capabilities, ao invés das permissões tradicionais do Unix? Coloque um servidor de capabilities e autenticação a rodar como root, rode as aplicações clientes com um usuário não-privilegiado, e faça o daemon transferir file descriptors para os programas não-privilegiados segundo as permissões dos programas. Deselegante? Mais complexo do que o necessário? Talvez, mas é fantasticamente mais rápido de desenvolver do que criar um sistema operacional do zero só para experimentar com segurança por capabilities. De brinde, você pode continuar executando suas aplicações convencionais em paralelo com o seu sistema alternativo. Na pior das hipóteses, você pode alterar o kernel ou criar um módulo para o kernel para conseguir o que quer, o que ainda há de ser mais produtivo do que começar do zero. Depois que você estiver com seu sistema funcionando sobre o outro (i.e., depois que você descobrir o que exatamente você quer que o sistema faça), você pode começar a pensar em substituir a camada de baixo por algo mais puro e ideal. Da mesma forma, se você estiver desenvolvendo uma linguagem de programação compilada, provavelmente é melhor aproveitar a infraestrutura de um compilador existente (e.g., fazendo seu compilador gerar C ou bytecode LLVM) do que gerar assembly na mão. Ou se você pretende criar uma interface gráfica, use o X (e algum toolkit gráfico pré-existente, se possível). Em suma: dê preferência por construir sobre frameworks existentes, e foque nos aspectos realmente inovadores do projeto.
Se a idéia de construir sobre as bases tortas dos sistemas existentes lhe desagrada, lembre-se de que mesmo eliminando o sistema operacional, você ainda terá que construir sobre as bases tortas das arquiteturas existentes. Não seria ótimo se a arquitetura oferecesse suporte a capabilities em hardware, ou alguma ajuda com tipagem dinâmica e verificação de limites de vetor? Ou se simplesmente o conjunto de instruções minimamente ortogonal, e não a bagunça que são o x86 e x86_64? A moral da história é que, sendo economicamente inviável para nós reles mortais criar uma arquitetura nova e mandar fabricar (e convencer o mundo a comprá-la), teremos que lidar com a sujeira das arquiteturas presentes; e se vamos lidar com alguma sujeira, podemos igualmente lidar com a sujeira de um sistema operacional existente, o que dá muito menos trabalho (em tese).
(Curiosamente, há (pelo menos) um projeto lunático de sistema operacional que, embora hesitante a princípio, levou a decisão da "pureza" às conseqüências lógicas e virou um projeto de arquitetura, implementado em FPGA. O autor do projeto tem ciência de o quão imprática é a idéia, mas não está nem aí.)
Meu último conselho para dominar o mundo: não queira demais. Ou melhor, queira, mas dê um passo de cada vez. Se você tentar iniciar o projeto de um sistema que resolve todos os problemas do mundo, é possível que você sequer termine de projetar e comece a desenvolver o sistema, ou comece a desenvolver mas não saiba como seguir adiante. Defina subprojetos com ambições menores, e resolva um, ou alguns, problemas de cada vez; assim você terá foco o suficiente para poder saber o que fazer. Use o Grande Objetivo Final como guia para saber para onde ir, e não como uma especificação cujos itens devem ser todos satisfeitos de uma vez, e caminhe gradativamente em direção a ele. Talvez você nunca o atinja, mas pelo menos você está andando para a frente.
No último fim-de-semana eu resolvi experimentar o tal do CyanogenMod. Para quem não sabe, o CyanogenMod é uma variante do Android com algumas funcionalidades extra, mantida não-comercialmente por uma comunidade de desenvolvedores.
O Samsung Galaxy 5 (a.k.a. Europa, a.k.a. GT-I5500x) não é oficialmente suportado pelo CyanogenMod. Ports não-oficiais do CyanogenMod 7 e 9 são mantidos pelos desenvolvedores do MAD Team. O port do CyanogenMod 9 (baseado no Android 4.0) ainda está em alpha, e não é recomendado para uso diário. Por outro lado, estou usando o CyanogenMod 7 (baseado no Android 2.3.7) há quatro dias e não tive problema nenhum com ele (de fato tenho tido menos problemas com ele do que com a ROM que veio com o aparelho).
As instruções no site do MAD Team apresentam duas maneiras de instalar o CyanogenMod: através do MAD Manager, um aplicativo para o Android que permite baixar e instalar as ROMs diretamente a partir do celular, sem necessidade de um PC por perto, e que parece ser totalmente excelente e fácil de usar; e através do Odin, um programa Windows-only e proprietário para flashear ROMs em aparelhos Samsung.
Por algum misterioso motivo do qual eu não me recordo (possivelmente porque não achei o MAD Manager para baixar fora da lojinha do Google, da qual eu não tenho como baixá-lo por não ter conta no Google), eu fiz a instalação de uma terceira maneira. A menos que você tenha um bom motivo, eu recomendo usar o MAD Manager, que é a maneira "oficial" recomendada pelo MAD Team para flashear a ROM. (Por outro lado, eu recomendo manter uma distância saudável do Odin, que não é lá uma criatura muito confiável.) Relato aqui o método que eu usei para caso você tenha problemas usando o método oficial.
Antes de mais nada, vá em Settings > Applications > Development e marque Android debugging. Isso permitirá que você use o programa adb para tentar salvar o dispositivo caso ocorra algum problema. Não é para ocorrer nenhum problema, mas nunca se sabe.
Feito isso, faça backup dos dados do celular (contatos e outras coisas que não deseje perder); os dados serão apagados no processo de instalação.
Os aparelhos Android-based possuem um "recovery mode", a partir do qual é possível instalar atualizações de firmware, limpar as configurações do dispositivo, entre outras coisas. O ClockworkMod Recovery substitui o recovery mode padrão do aparelho por um com funcionalidades extra, tais como criação e restauração de backups do sistema e instalação de ROMs alternativas. Utilizaremos o ClockworkMod Recovery para instalar a ROM com o CyanogenMod 7.
assert(getprop("ro.product.device") == "galaxy5" || getprop("ro.build.product") == "galaxy5" ||
getprop("ro.product.device") == "GT-I5500" || getprop("ro.build.product") == "GT-I5500" ||
getprop("ro.product.device") == "GT-I5503" || getprop("ro.build.product") == "GT-I5503" ||
getprop("ro.product.device") == "GT-I5508" || getprop("ro.build.product") == "GT-I5508");
(Ou use um editor de texto capaz de abrir e modificar os arquivos diretamente a partir do zip, como o Vim.)
Pronto! Você já tem o ClockworkMod Recovery instalado. (O ROM Manager possui uma opção Flash ClockworkMod Recovery que teoricamente lhe pouparia todo esse trabalho, mas aparentemente o Galaxy 5 não é suportado oficialmente pelo ClockworkMod Recovery, de modo que essa opção não funciona. Mas você pode testar e ver se tem sorte (já que podem ter adicionado suporte desde que este post foi escrito).)
E está feito. O celular deve iniciar no CyanogenMod (o primeiro boot pode demorar um pouco).
Feito isso, uma boa idéia é reiniciar em recovery mode novamente, através do ROM Manager, e fazer um backup da instalação atual, selecionando backup and restore > backup. Certifique-se de que há espaço suficiente no SD card para fazer o backup (que há de ocupar de 100MB a 200MB). É possível que você tenha que fazer outro wipe data/factory reset logo depois de instalar o CyanogenMod (as teclas Home e Search aparentemente não funcionam logo após a instalação caso um data wipe não seja feito).
Também vale observar que o CyanogenMod não vem com os aplicativos proprietários do Google (o que eu considero uma vantagem). Se você quiser os aplicativos, terá que baixá-los separadamente (use a versão para o Android 2.3.7) e instalar o pacote pelo ClockworkMod Recovery (da mesma maneira como foi feito com o CyanogenMod). Não testei o tal pacote.
Um grande problema desse procedimento é que não é possível voltar atrás: o firmware original do Galaxy 5 usa um sistema de arquivos RFS, que o ClockworkMod Recovery é incapaz de montar, e conseqüentemente de fazer backups. (Por tosquice do ClockworkMod, em verdade; ele poderia muito bem copiar o conteúdo bruto das partições, mesmo sem montá-las.) Assim, depois de instalado o CyanogenMod, não há um método simples e indolor de recuperar a ROM original. Experimentando métodos "alternativos" (a.k.a. facão) de recuperação, eu acabei destruindo o sistema do meu aparelho, o que fez com que ele congelasse no boot (i.e., ficasse soft-bricked).
A grande sacanagem é que ao contrário de outros aparelhos, o Galaxy 5 não tem uma combinação de teclas para iniciar em recovery mode, o que permitiria entrar no menu de recovery e restaurar um backup do CyanogenMod de quando tudo estava funcionando. Um procedimento trivial acaba se tornando um inferno.
A primeira coisa a se tentar é usar o adb. O adb é uma ferramenta de desenvolvimento do Android que permite acessar um celular que esteja com modo debug ativado pela USB. O adb é parte do pacote de Platform Tools do Android Software Development Kit. (Alternativamente, você pode baixar os binários para GNU/Linux desta pessoa aleatória na Internet.) Instalado o adb, conecte o celular ao PC pela USB, ligue-o, espere ele "bootar" (e congelar durante o processo), abra um terminal, vá até a pasta onde se encontra o adb, e execute o comando:
./adb reboot recovery
Se o celular for detectado, ele há de reiniciar no menu de recovery, de onde você pode tentar recuperar um backup ou reinstalar uma ROM a partir do SD card. Se ele não for detectado (i.e., o adb mostrar uma mensagem Device not found), você pode experimentar desconectá-lo e reconectá-lo e repetir o comando, e/ou executar ./adb kill-server antes de repetir o comando. Se isso não adiantar, é provável que o celular não esteja em debug mode, e portanto o adb não vai funcionar.
O segundo método é tentar carregar uma ROM com o bendito Odin. Para isso, você precisará de uma máquina com Windows. O formato das ROMs usadas pelo Odin é diferente do formato usado pelo ClockworkMod, de modo que a ROM do CyanogenMod baixada do MAD Team não pode ser usada (pelo menos não diretamente, e eu não explorei muito o formato do Odin para transformar um formato no outro; afinal eu já tinha explodido o meu sistema brincando com o formato do ClockworkMod).
Nesse momento uma de duas coisas há de ocorrer:
Se você não consegue instalar uma ROM oficial com o Odin porque o celular sempre cai em modo "sinal de alerta" logo depois da instalação, você pode se aproveitar desse fato para entrar em modo recovery. Tendo instalado o ClockworkMod Recovery, tal como explicado no método anterior, faça o seguinte:
Se você tiver outras soluções ou dicas, queira deixar um comentário.
A dor nos meus olhos e nas juntas dos meus dedos sugere que eu deveria aproveitar a rara oportunidade que as férias me proporcionam de me manter longe de computadores e me manter longe de computadores.
Vejo vocês em um futuro indeterminado.
Copyright © 2012-2013 Vítor Bujés Ubatuba De Araújo
O conteúdo deste site, a menos que de outra forma especificado, pode ser utilizado livremente, com ou sem alterações, desde que seja mencionado o autor, preferivelmente com a URL do documento original.
Powered by Blognir.