Não paro de me surpreender com o vi(m)/ex. Essa semana descobri que posso enviar uma parte do texto para um comando externo e usar a saída desse comando para substituir o texto enviado. Suponha o seguinte arquivo de texto:
01 1 - Alunas:
02 Bruna
03 Emília
04 Fernanda
05 Cláudia
06 Ana
07 Daniele
08
09 2 - Funcionários:
10 ...
Caso eu queira ordenar a lista de nomes, basta usar o seguinte:
:2,7!sort
Note que um sort no arquivo todo iria bagunçar tudo.
2008-05-09
Root no Ubuntu
Lendo o planet do Ubuntu, me deparei com um post do Christer Edwards sobre como usar um shell root corretamente. Existem situações onde um simples sudo não resolve, como em:
sudo echo “modulo” > /etc/modules
Nesse caso, embora o comando echo rode como root, quem tenta escrever o arquivo é o bash, que continua rodando como usuário normal. Em um caso desses é possível usar o tee para contornar o problema, mas nessas situações eu prefiro logar como root.
Para isso eu estava usando sudo su, ou sudo su -, o que, realmente, não é muito elegante. No post citado, sugere-se o seguinte:
sudo -i
Essa opção (simulate initial login) irá invocar o shell especificado no passwd para a conta root, inicializando o ambiente como em um login inicial (você vai para a pasta ~). Não sei exatamente como isso difere do sudo su -. Se alguém souber, por favor me diga.
Outra opção, equivalente a um sudo su, que não faz o login completo é essa:
sudo -s
Que irá simplesmente rodar, como root, o shell especificado pela variável de ambiente SHELL, preservando o ambiente atual.
sudo echo “modulo” > /etc/modules
Nesse caso, embora o comando echo rode como root, quem tenta escrever o arquivo é o bash, que continua rodando como usuário normal. Em um caso desses é possível usar o tee para contornar o problema, mas nessas situações eu prefiro logar como root.
Para isso eu estava usando sudo su, ou sudo su -, o que, realmente, não é muito elegante. No post citado, sugere-se o seguinte:
sudo -i
Essa opção (simulate initial login) irá invocar o shell especificado no passwd para a conta root, inicializando o ambiente como em um login inicial (você vai para a pasta ~). Não sei exatamente como isso difere do sudo su -. Se alguém souber, por favor me diga.
Outra opção, equivalente a um sudo su, que não faz o login completo é essa:
sudo -s
Que irá simplesmente rodar, como root, o shell especificado pela variável de ambiente SHELL, preservando o ambiente atual.
2008-05-08
O ex por trás do vi
Nesses últimos dias estou tentando melhorar meu relacionamento com o vi(m) e esse esforço tem rendido algumas descobertas interessantes.
A primeira delas é que o vi é, na verdade, uma interface visual (Visual Interface) do editor ex (EXtended), um editor de linha, por sua vez descendente do ed. Esclarecidas as questões hierarquicas e genealógicas, cabe perguntar: o que vem a ser um editor de linha?
Diz a lenda que, nos tempos idos da informática, os teletipos (TeleTYpewriter, TeleTYpe ou TTY - qualquer semelhança com seu console não é mera coincidência) eram a única interface de saída para o usuário. Agora imagine, da frente do seu monitor de LCD de um zilhão de pixeis e cores, como era complicado editar texto usando somente um teclado e uma impressora! Sem a possibilidade de movimentar um cursor pelo papel, a edição era feita linha a linha, com comandos para imprimir, incluir, alterar e apagar linhas.
Ainda hoje, alguns dos comandos que usamos no vi, aqueles iniciados com ":", são, na verdade, comando do ex. Uma vez no modo de comando do vi (ESC), pode-se acessar o prompt do ex usando a telca Q (maiúsculo). Para voltar ao vi, basta digitar vi no prompt do ex.
O ex dispõe de muitos recursos avançados, um deles é a possibilidade de especificar intervalos de linhas para restringir comandos. Por exemplo, para mostrarmos na tela as linha de 1 até 5 usamos:
:1,5p
Onde 1,5 é o intervalo e p é o comando imprimir. Os dois pontos são o prompt do ex. Também podemos usar $ para denotar a última linha e % para todas as linhas.
Um dos comandos realmente úteis do ex é o s, para procura e substituição. Suponhamos que eu esteja editando um arquivo HTML e deseje colocar todas as ocorrências da palavra linux em itálico, posso usar o seguinte:
:%s/linux/<i>&<\/i>/g
Onde % significa que o comando seguinte irá atuar em todas as linhas do arquivo aberto, s é o comando de substituição, e as barras separam os argumentos desse comando. O primeiro argumento, linux, é o que deve ser encontrado; o segundo argumento especifica pelo que o primeiro deve ser substituído (mais detalhes abaixo); e o terceiro argumento, g, é uma opção que diz para realizar uma substituição global, ou seja, substituir todos as ocorrências encontradas no intervalo especificado, não só a primeira.
O segundo argumento pode parecer complicado, mas não há nada de mais. O símbolo & significa o texto encontrado, no caso linux, e a sequência \/ serve apenas para que a barra do tag não seja interpretada como separador de argumentos.
Um dia eu ainda tento usar o emacs...
A primeira delas é que o vi é, na verdade, uma interface visual (Visual Interface) do editor ex (EXtended), um editor de linha, por sua vez descendente do ed. Esclarecidas as questões hierarquicas e genealógicas, cabe perguntar: o que vem a ser um editor de linha?
Diz a lenda que, nos tempos idos da informática, os teletipos (TeleTYpewriter, TeleTYpe ou TTY - qualquer semelhança com seu console não é mera coincidência) eram a única interface de saída para o usuário. Agora imagine, da frente do seu monitor de LCD de um zilhão de pixeis e cores, como era complicado editar texto usando somente um teclado e uma impressora! Sem a possibilidade de movimentar um cursor pelo papel, a edição era feita linha a linha, com comandos para imprimir, incluir, alterar e apagar linhas.
Ainda hoje, alguns dos comandos que usamos no vi, aqueles iniciados com ":", são, na verdade, comando do ex. Uma vez no modo de comando do vi (ESC), pode-se acessar o prompt do ex usando a telca Q (maiúsculo). Para voltar ao vi, basta digitar vi no prompt do ex.
O ex dispõe de muitos recursos avançados, um deles é a possibilidade de especificar intervalos de linhas para restringir comandos. Por exemplo, para mostrarmos na tela as linha de 1 até 5 usamos:
:1,5p
Onde 1,5 é o intervalo e p é o comando imprimir. Os dois pontos são o prompt do ex. Também podemos usar $ para denotar a última linha e % para todas as linhas.
Um dos comandos realmente úteis do ex é o s, para procura e substituição. Suponhamos que eu esteja editando um arquivo HTML e deseje colocar todas as ocorrências da palavra linux em itálico, posso usar o seguinte:
:%s/linux/<i>&<\/i>/g
Onde % significa que o comando seguinte irá atuar em todas as linhas do arquivo aberto, s é o comando de substituição, e as barras separam os argumentos desse comando. O primeiro argumento, linux, é o que deve ser encontrado; o segundo argumento especifica pelo que o primeiro deve ser substituído (mais detalhes abaixo); e o terceiro argumento, g, é uma opção que diz para realizar uma substituição global, ou seja, substituir todos as ocorrências encontradas no intervalo especificado, não só a primeira.
O segundo argumento pode parecer complicado, mas não há nada de mais. O símbolo & significa o texto encontrado, no caso linux, e a sequência \/ serve apenas para que a barra do tag não seja interpretada como separador de argumentos.
Um dia eu ainda tento usar o emacs...
2008-05-07
Cache DNS no Windows XP com ICS BIND
Em um post anterior tratei da instalação e configuração do BIND no Gentoo Linux para atuar como cache de DNS. Hoje vou detalhar o procedimento para o Windows XP. Este já não é tão simples quanto aquele.
Primeiro faça o download do BIND para windows, no endereço:
Primeiro faça o download do BIND para windows, no endereço:
http://www.isc.org/index.pl?/sw/bind/
Extraia o conteúdo do arquivo zipado em uma pasta temporária qualquer. Em seguida execute o programa BINDInstall.exe. No diálogo que surgir, especifique a senha da conta (named) que será criada para rodar o BIND (Service Account Password) e clique no botão Install e depois em Exit. Por padrão o BIND será instalado na pasta C:\WINDOWS\system32\dns.
Um problema que tive tentando rodar o BIND no Windows foi que ele não conseguia, rodando como o usuário named, criar o arquivo named.pid (que indica o número do processo do servidor) no diretório de instalação, uma vez que o referido usuário não tem permissão suficiente. Para sanar isso precisei alterar a localização desse arquivo para a pasta Documentos compartilhados (se você souber de uma solução melhor, por favor me avise).
Vamos agora às configurações. Primeiro vamos criar o arquivo named.conf, na pasta C:\WINDOWS\system32\dns\etc. Seu conteúdo deve ser o seguinte:
// Opções globais do servidor
options {
// Especifica a pasta base dos arquivos
directory "C:\WINDOWS\system32\dns";
// Especifica o arquivo de processo
// Não escutar em nenhuma interface ipv6
listen-on-v6 { none; };
// Escutar no seguinte endereço
};
// Desabilita o controle externo
controls { };
// Zona raíz
zone "." IN {
type hint;
file "named.root";
};
Se quiser que seu servidor atenda à outras máquinas de sua rede local, modifique o parâmetro allow-query de acrodo. Ex:
Um problema que tive tentando rodar o BIND no Windows foi que ele não conseguia, rodando como o usuário named, criar o arquivo named.pid (que indica o número do processo do servidor) no diretório de instalação, uma vez que o referido usuário não tem permissão suficiente. Para sanar isso precisei alterar a localização desse arquivo para a pasta Documentos compartilhados (se você souber de uma solução melhor, por favor me avise).
Vamos agora às configurações. Primeiro vamos criar o arquivo named.conf, na pasta C:\WINDOWS\system32\dns\etc. Seu conteúdo deve ser o seguinte:
// Opções globais do servidor
options {
// Especifica a pasta base dos arquivos
directory "C:\WINDOWS\system32\dns";
// Especifica o arquivo de processo
pid-file "C:\Documents and Settings\All Users.WINDOWS\Documentos\named.pid";
// Não escutar em nenhuma interface ipv6
listen-on-v6 { none; };
// Escutar no seguinte endereço
listen-on { 127.0.0.1; }; // Clientes autorizados a consultar este servidor
allow-query { 127.0.0.1; };};
// Desabilita o controle externo
controls { };
// Zona raíz
zone "." IN {
type hint;
file "named.root";
};
Se quiser que seu servidor atenda à outras máquinas de sua rede local, modifique o parâmetro allow-query de acrodo. Ex:
allow-query {
192.168/16;
127.0.0.1;
};
A zona raíz define a lista de servidores de DNS raíz (de a.root-servers.net até m.root-servers.net) que serão consultados caso o pedido não se enquadre em uma zona definida localmente. Essa lista deve ficar no arquvio named.root, na pasta base: C:\WINDOWS\system32\dns. O referido arquivo pode ser baixado do ftp do Internic: ftp://ftp.internic.net./domain/.
Feito isso, basta iniciar o servidor. Vá em: Painel de controle > Desempenho e manutenção > Ferramentas administrativas > Serviços. Procure por ISC BIND na lista e clique no link Iniciar o serviço. Para que o serviço seja iniciado sempre que o computador for ligado, defina o Tipo de inicialização como Automático na janela Propriedades, que pode ser aberta com um clique duplo em ISC BIND (na lista).
Se ocorrer algum erro na inicialização, os logs podem ser verificados indo em: Painel de controle > Desempenho e manutenção > Ferramentas administrativas > Visualisar eventos.
Pronto, já é possível resolver nomes usando o servidor. Basta para isso especificar como servidor de DNS a própria máquina (127.0.0.1). Isso pode ser feito nas propriedades do Protocolo TCP/IP, nas propriedade de uma conexão de rede.
Se ocorrer algum erro na inicialização, os logs podem ser verificados indo em: Painel de controle > Desempenho e manutenção > Ferramentas administrativas > Visualisar eventos.
Pronto, já é possível resolver nomes usando o servidor. Basta para isso especificar como servidor de DNS a própria máquina (127.0.0.1). Isso pode ser feito nas propriedades do Protocolo TCP/IP, nas propriedade de uma conexão de rede.
2008-05-06
Otimizando velhos hábitos - vi
Vez ou outra preciso escrever algum programa pequeno, de um único arquivo, e em seguida testá-lo, seja compilando-o ou executando-o. Confesso que a forma como eu normalmente realizava essas operações era bastante tosca.
Como não gosto de ter vários terminais abertos, o que eu normalmente fazia era: abrir um terminal; iniciar o vim; escrever o programa; salvar e fechar o vim; tentar compilar ou executar o programa; ver que digitei algo errado; iniciar o vim novamente; etc.
Somente recentemente me dei conta de que poderia salvar o arquivo, suspender o vim (Ctrl+Z), tentar compilar ou executar o programa, e retornar ao vim usando fg. Vale dizer que eu já sabia usar os comandos para controle de processos.
É incrível como, as vezes, simplesmente não associamos as coisas.
Como não gosto de ter vários terminais abertos, o que eu normalmente fazia era: abrir um terminal; iniciar o vim; escrever o programa; salvar e fechar o vim; tentar compilar ou executar o programa; ver que digitei algo errado; iniciar o vim novamente; etc.
Somente recentemente me dei conta de que poderia salvar o arquivo, suspender o vim (Ctrl+Z), tentar compilar ou executar o programa, e retornar ao vim usando fg. Vale dizer que eu já sabia usar os comandos para controle de processos.
É incrível como, as vezes, simplesmente não associamos as coisas.
2005-09-21
Cedilha: trocando ć por ç
Toda vez que recompilo o xorg tenho problemas com o cedilha. Como meu sistema está em inglês e meu teclado é americano, a combinação de ' + c resulta em ć. Para arrumar, tenho que substituir as ocorrências de ć e Ć por ç e Ç no arquivo /usr/X11R6/lib/X11/locale/en_US.UTF-8/Compose.
2005-09-09
Instabilidade em minha máquina Gentoo
Minha máquina estava travando ao rodar aplicativos java, principalmente quando eu estava atualizando o sistema (o que consome muitos recursos, visto que tudo é compilado). A princípio achei que poderia ser algum problema no java, mas depois notei que isso também ocorria com outros aplicativos que consumiam bastante memória. Olhando o monitor do sistema, percebi que os programas travavam quando a toda a memória era utilizada. Fui conferir o swap:
# swapon -s
#
Nada de swap! Embora meu fstab estava correto:
/dev/hda5 none swap sw 0 0
Tentei:
# swapon /dev/hda5
swapon: /dev/hda5: Invalid argument
Após algumas buscas sem sucesso no google, resolvi tentar:
# mkswap /dev/hda5
Setting up swapspace version 1, size = 518156 kB
# swapon /dev/hda5
# swapon -s
Filename Type Size Used Priority
/dev/hda5 partition 506008 0 -2
Por algum motivo que eu nunca vou descobrir, a partição de swap estava corrompida... Mas enfim, problema resolvido.
2005-09-08
Exportando apresentação para arquivos .jpg
A idéia: exportar cada slide de uma apresentação do OpenOffice Impress para um arquivo .jpg, para posteriormente gravar em um CD e apresentar em uma TV, via aparelho de DVD.
O problema: o Impress só exporta um slide de cada vez, o que torna a idéia inviável para apresentações com grande número de slides.
O problema: o Impress só exporta um slide de cada vez, o que torna a idéia inviável para apresentações com grande número de slides.
A solução, uma simples macro:
sub exportarTudo
'Objetos
documento = thisComponent
controlador = documento.currentController
paginaAnterior = controlador.currentPage
'Diálogo para escolher diretório
dialogoDiretorio = CreateUnoService("com.sun.star.ui.dialogs.FolderPicker")
dialogoDiretorio.title = "Salvar"
dialogoDiretorio.execute()
diretorio = dialogoDiretorio.directory
'Propriedade/Valor indicando qual filtro usar
propriedade = createUnoStruct("com.sun.star.beans.PropertyValue")
propriedade.name = "FilterName"
propriedade.value = "impress_jpg_Export"
'Numero de casas para numerar os arquivos
casas = len(trim(str(documento.drawPages.count)))
'Para cada slide
for i = 1 to documento.drawPages.count
slide=documento.drawPages(i - 1)
controlador.currentPage = slide
url = diretorio + right("00000" + i, casas) + ".jpg"
documento.storeToUrl(url, array(propriedade))
next
'Volta à página em que o usuário estava
controlador.currentPage = paginaAnterior
end sub
Reiniciando um modem Alcatel STP
Para quem precisa reiniciar seu modem Alcatel Speed Touch Pro da linha de comando, segue um pequeno script bash:
#!/bin/bash
# Reinicia o modem alcatel
modem="10.0.0.138"
user="guest"
password="keycode&senh@01"
(sleep 0.5; echo -ne "${user}\r"; sleep 0.5; echo -ne "${password}\r"; echo -ne "system reboot\r"; sleep 1) | telnet $modem &> /dev/null
#!/bin/bash
# Reinicia o modem alcatel
modem="10.0.0.138"
user="guest"
password="keycode&senh@01"
(sleep 0.5; echo -ne "${user}\r"; sleep 0.5; echo -ne "${password}\r"; echo -ne "system reboot\r"; sleep 1) | telnet $modem &> /dev/null
2005-08-04
Assinar:
Comentários (Atom)