Arquivo da categoria: Computadores

DHCP Windows

Problema: o servidor Windows de uma rede deu problema, atrapalhando estações que estavam sendo ligadas durante o período.
Solução que chegou a ser cogitada: montar um CLUSTER Windows para o servidor DHCP, para garantir que outro servidor entrasse no ar caso o primeiro apresentasse problema algum dia.

Lendo Gmail com Gnus & Emacs

"Mãe! Esse cara usa EMACS!"


Estou seguindo o tutorial em http://www.emacswiki.org/emacs/GnusGmail mas já encontrei várias dificuldades. Primeiro, ao usar este trecho indicado no tutorial:

(add-to-list ‘gnus-secondary-select-methods ‘(nnimap “gmail”
(nnimap-address “imap.gmail.com”)
(nnimap-server-port 993)
(nnimap-stream ssl)))

Tive que colocar assim:

(setq gnus-secondary-select-methods ‘(nnimap “gmail”
(nnimap-address “imap.gmail.com”)
(nnimap-server-port 993)
(nnimap-stream ssl)))

Segundo, o emacs reclamava do parâmetro nnimap. Resolvi isso lendo esta mensagem: http://lists.debian.org/debian-user/2001/12/msg00597.html
Basicamente, o trecho acima teve que ser mudado também para:

(setq gnus-secondary-select-methods ‘((nnml “”) (nnimap “gmail”
(nnimap-address “imap.gmail.com”)
(nnimap-server-port 993)
(nnimap-stream ssl))))

Agora aparentemente funciona, mas não aparece um “grupo” de news no gnus referente ao Gmail, só os newsgroups normais que acesso do servidor de news. Continuando a pesquisar…

CACTI plugin architecture in Debian

Instalando o CACTI plugin architecture no Debian (usando a versão do testing do CACTI, 0.8.7e neste momento). O plugin architecture não faz parte do pacote Debian e precisa ser instalado manualmente, com algumas adaptações à instalação do Debian.
Ao aplicar o patch no diretório do CACTI (/usr/share/cacti/site), seguindo estas instruções, dá erro ao patchear o arquivo include/global.php. Então este arquivo foi copiado manualmente dos arquivos que vêm junto com o patch para /usr/share/cacti/site/include.
Mais algumas alterações são necessárias, conforme eu descobri nesta thread. O que eu fiz:

  • Editei o arquivo /usr/share/cacti/site/include/global.php (na linha 22, nesta versão), trocando
    $config['url_path'] = '/';
    por
    $config['url_path'] = '/cacti/';
  • Ainda no arquivo global.php, (na linha 202, nesta versão) troquei
    include($config["library_path"] ."/adodb/adodb.inc.php");
    por
    include("/usr/share/php/adodb/adodb.inc.php");

Por enquanto foi só isso. Depois vou instalar alguns plugins e ver se está tudo funcionando.
Installing CACTI plugin architecture in Debian (using the testing version, CACTI 0.8.7e at this moment). The plugin architecture don’t come installed in the Debian package, needing to be installed manually, with some adjustments as described below.
I applied the patch in CACTI directory (/usr/share/cacti/site), following these instructions, and got an error when patching file include/global.php. So this file was manually copied from the patch files to /usr/share/cacti/site/include.
Some more adjustments were needed, as I learned in this thread. This is what I did:

  • Edited the file /usr/share/cacti/site/include/global.php (line 22, in this version), replaced
    $config['url_path'] = '/';
    with
    $config['url_path'] = '/cacti/';
  • Still in global.php, (line 202, in this version) replaced
    include($config["library_path"] ."/adodb/adodb.inc.php");
    with
    include("/usr/share/php/adodb/adodb.inc.php");

That’s it. Now I will try adding some plugins and see if it all works well.

Histórias de Usuários

Hoje, organizando uns arquivos velhos que tinha guardado, achei um texto com alguns relatos meus de dez anos atrás, quando comecei a trabalhar na área de informática e a maior parte do tempo eu fazia atendimento a usuários. Isso no tempo dos Windows 95 e 98, e com usuários que não tinham recebido nenhum treinamento de informática.
Os relatos são do final dos anos 90, quando eu trabalhei como administrador de rede em um certo lugar que contava com várias unidades em outras cidades, e por causa disso, a maioria dos atendimentos de suporte a usuário eram feitos via telefone mesmo.
Caso 1
Telefonou uma pessoa dizendo que estava imprimindo, mas na impressora HP só saía “sujeira”. Geralmente isso acontecia porque alguns computadores tinham um chaveador de impressora, e o que devia ir para uma impressora matricial foi para uma jato de tinta. Também haviam computadores com duas portas paralelas (de impressora), então podia ser configuração errada: o driver de HP imprimindo para a LPT2 ao invés da LPT1 ou vice-versa.
Por isso, perguntamos logo de cara se aquele micro tinha chaveador de impressora; “não” foi a resposta. Aí perguntamos: “Tem duas impressoras instaladas nesse micro?”
A usuária pediu um momento, afastou a boca do telefone e gritou:
“Ô fulana, tem duas impressoras nesse micro que eu estou usando?”
Caso 2
Uma usuária estava tomando um curso de um sistema para Windows 95. Só que as máquinas do curso estavam configuradas para trabalhar em rede, portanto ao ligar aparecia a tela de logon, pedindo nome de usuário e senha. Como a usuária nunca tinha visto essa tela (só tinha usado máquinas fora da rede), ela chamou o professor dizendo que tinha uma tela estranha… pedindo uma senha…
O professor, já sabendo o que era, disse: “Tecle ESC pra sair dessa tela”.
A usuária: “Aqui só tem OK e CANCELAR”.
Caso 3
Usava-se o Lotus Notes como sistema de correio eletrônico. De tempos em tempos, os usuários recebiam uma mensagem sobre “renovação do certificado Notes” e que existe uma data limite para a renovação. Geralmente eles ligavam para perguntar o que é isso, e daí o administrador Notes explicava o que fazer.
Acontece que, quando expira a data limite e o usuário não solicitou a renovação do certificado, ele não consegue acessar mais seu correio… e o adm. Notes tem de deletar o usuário e recriá-lo, mas precisa saber da senha do usuário (ou assim me explicaram os administradores do Notes, na época). Uma coisa chata de se perguntar ao usuário, mas enfim… só se chegava a essa situação porque o próprio usuário passou meses recebendo a mensagem sobre o certificado e não o renovou.
Depois de muita conversa o pobre administrador do Notes descobriu que o usuário estava fazendo o seguinte: todas as vezes que via a mensagem do certificado, ele alterava a senha. (existia uma mensagem semelhante, que pede para o usuário trocar a senha dele em um certo prazo — mas isso não tem nada a ver com o certificado).
Finalmente, o usuário foi dizer pro adm. Notes qual era a senha dele, explicando assim pelo telefone: “Fulano, minha senha é o seguinte… zero-nove-zero-nove-zero-nove, mas primeiro eu vou pra esquerda, depois eu vou pra direita”.
Tradução (obtida depois de mais vários minutos de conversa): Sabe qual era finalmente a senha do cara? o90909 (“ó”-nove-zero-nove-zero-nove). Ele chamou a tecla O (“ó”) de zero. E o caso de direita-esquerda era o seguinte: ele digitava a tecla O no lado esquerdo do teclado (parte alfanumérica), depois ia para a parte direita do teclado e digitava o 90909 restantes.
No meio da conversa toda, o usuário tentou explicar assim, para o já confuso administrador Notes: “Esse zero aqui, onde tem no teclado, i-zero-pê…”
Caso 4
Ao perguntar para um funcionária porque os formulários dela eram preenchidos todos à máquina de escrever, ao invés de com o computador, recebi a resposta:
“Minha impressora não tem Word nem Excel.”
Atualização: relendo este caso 4 agora, eu me lembrei porque a usuária deu esta resposta: é que a impressora dela era matricial, ainda muito comum naquela época, e portanto não imprimia documentos feitos em programas para Windows. Ou seja, ela não podia imprimir nada feito em Word ou Excel naquela impressora.

HTML hates Regexp

English version below.

This probably should get HTML tags out of a string...

This probably should get HTML tags out of a string...

Visto no http://www.codinghorror.com/:

You can’t parse [X]HTML with regex. Because HTML can’t be parsed by regex. Regex is not a tool that can be used to correctly parse HTML. As I have answered in HTML-and-regex questions here so many times before, the use of regex will not allow you to consume HTML.
Regular expressions are a tool that is insufficiently sophisticated to understand the constructs employed by HTML. HTML is not a regular language and hence cannot be parsed by regular expressions. Regex queries are not equipped to break down HTML into its meaningful parts. so many times but it is not getting to me. Even enhanced irregular regular expressions as used by Perl are not up to the task of parsing HTML. You will never make me crack. HTML is a language of sufficient complexity that it cannot be parsed by regular expressions.
Even Jon Skeet cannot parse HTML using regular expressions. Every time you attempt to parse HTML with regular expressions, the unholy child weeps the blood of virgins, and Russian hackers pwn your webapp. Parsing HTML with regex summons tainted souls into the realm of the living. HTML and regex go together like love, marriage, and ritual infanticide. The <center> cannot hold it is too late. The force of regex and HTML together in the same conceptual space will destroy your mind like so much watery putty. If you parse HTML with regex you are giving in to Them and their blasphemous ways which doom us all to inhuman toil for the One whose Name cannot be expressed in the Basic Multilingual Plane, he comes.

Artigo completo: http://www.codinghorror.com/blog/archives/001311.html
Nunca cheguei a fazer nenhum parsing sério de HTML com expressões regulares, mas pelo visto não é uma boa idéia. A menos que você queira apenas checar algumas tags simples.
Este comentário no artigo esclarece um pouco mais:

For the brave of heart: Write a regular language to recognize all strings of balanced parens.
Actually, don’t, because this is provably impossible.
Why? Because regular expressions recognize *regular languages*, a specific, well-defined class of languages. HTML, like the balanced parens problem above, doesn’t conform to this pattern.
Every once in a while, I’m reminded of why studying bona fide computer science in college was the right idea. It won’t necessarily make you a better programmer, but it has saved me from doing really stupid things from time to time, like trying to parse html with a regex.
David R. Albrecht on November 16, 2009 10:23 AM

Realmente, regexps não podem ser usadas para nada além de checar tags simples, e nunca para um texto HTML inteiro: (http://www.perlmonks.org/?node_id=8624)

you cannot write a regexp that will match any level of nested balanced parentheses. You can always write one to match a specific number of balanced ones, but not one that can match a non- fixed number of these. I think there is an explaination in the Friedl book.

Um comentário retirado do Regular Expression HOWTO que resume bem a situação:

(Note that parsing HTML or XML with regular expressions is painful. Quick-and-dirty patterns will handle common cases, but HTML and XML have special cases that will break the obvious regular expression; by the time you’ve written a regular expression that handles all of the possible cases, the patterns will be very complicated. Use an HTML or XML parser module for such tasks.)

Portanto… não faça isto.


This probably should get HTML tags out of a string...

This probably should get HTML tags out of a string...

Visto noSeen at http://www.codinghorror.com/:

You can’t parse [X]HTML with regex. Because HTML can’t be parsed by regex. Regex is not a tool that can be used to correctly parse HTML. As I have answered in HTML-and-regex questions here so many times before, the use of regex will not allow you to consume HTML.
Regular expressions are a tool that is insufficiently sophisticated to understand the constructs employed by HTML. HTML is not a regular language and hence cannot be parsed by regular expressions. Regex queries are not equipped to break down HTML into its meaningful parts. so many times but it is not getting to me. Even enhanced irregular regular expressions as used by Perl are not up to the task of parsing HTML. You will never make me crack. HTML is a language of sufficient complexity that it cannot be parsed by regular expressions.
Even Jon Skeet cannot parse HTML using regular expressions. Every time you attempt to parse HTML with regular expressions, the unholy child weeps the blood of virgins, and Russian hackers pwn your webapp. Parsing HTML with regex summons tainted souls into the realm of the living. HTML and regex go together like love, marriage, and ritual infanticide. The <center> cannot hold it is too late. The force of regex and HTML together in the same conceptual space will destroy your mind like so much watery putty. If you parse HTML with regex you are giving in to Them and their blasphemous ways which doom us all to inhuman toil for the One whose Name cannot be expressed in the Basic Multilingual Plane, he comes.

Full article: http://www.codinghorror.com/blog/archives/001311.html
I never used regular expressions to do any serious HTML parsing, but thinking about it it doesn’t looks a good idea. Unless you just want to check some simple tags.
This comment in the article is interesting:

For the brave of heart: Write a regular language to recognize all strings of balanced parens.
Actually, don’t, because this is provably impossible.
Why? Because regular expressions recognize *regular languages*, a specific, well-defined class of languages. HTML, like the balanced parens problem above, doesn’t conform to this pattern.
Every once in a while, I’m reminded of why studying bona fide computer science in college was the right idea. It won’t necessarily make you a better programmer, but it has saved me from doing really stupid things from time to time, like trying to parse html with a regex.
David R. Albrecht on November 16, 2009 10:23 AM

Indeed, regexps cannot be used to anything else beyond checking simple tags, and never for a full HTML text: (http://www.perlmonks.org/?node_id=8624)

you cannot write a regexp that will match any level of nested balanced parentheses. You can always write one to match a specific number of balanced ones, but not one that can match a non- fixed number of these. I think there is an explaination in the Friedl book.

A comment taken from the Regular Expression HOWTO that sums it up well:

(Note that parsing HTML or XML with regular expressions is painful. Quick-and-dirty patterns will handle common cases, but HTML and XML have special cases that will break the obvious regular expression; by the time you’ve written a regular expression that handles all of the possible cases, the patterns will be very complicated. Use an HTML or XML parser module for such tasks.)

So… don’t do this.

Shell script e cacls

O problema: um colega de trabalho queria checar as permissões de acesso de uma grande árvore de pastas em um servidor Windows. Muitos níveis de subpastas e permissões diferentes em cada uma. Por grande árvore de pastas, entenda por volta de umas 43000 pastas.
Eu não sei dizer se tem ferramenta mais fácil pra fazer o que ele queria, ou se um script VBS poderia resolver; eu até sugeri VBS, mas nenhum de nós dois conhecíamos o suficiente e aprender para resolver o problema iria tomar algum tempo. Então, ele e eu tomamos rotas usando ferramentas já conhecidas. Ele queria gerar uma saída de texto de cada pasta, usando o comando cacls do Windows, que permite listar e alterar as permissões via linha de comando. A saída desse comando é similar a isto:

Os nomes foram trocados para preservar os personagens.

Os nomes foram trocados para preservar os personagens.


Ou seja: o nome completo da pasta em questão, seguido das permissões. Havendo mais de uma permissão, elas aparecerão nas linhas seguintes, identadas com espaços para ficarem na mesma coluna que a primeira permissão listada (cuja coluna dependerá do tamanho do nome da pasta/arquivo listado).
Meu colega me perguntou se tinha alguma forma de rodar estas saídas em um script de forma a acrescentar o nome de pasta a cada uma das permissões subsequentes, de forma a facilitar a verificação; por exemplo, a listagem acima ficaria assim (usando : para separar nomes de pasta, de usuário/grupos e permissões):
\\stgreceita1\rfoc$\compartilhamentos\OC\DIESP\DIJUT\18 Controle de PL:BUILTIN\Administradores:(OI)(CI)F
\\stgreceita1\rfoc$\compartilhamentos\OC\DIESP\DIJUT\18 Controle de PL:RFOC\Domain Admins:(OI)(CI)R
\\stgreceita1\rfoc$\compartilhamentos\OC\DIESP\DIJUT\18 Controle de PL:RFOC\LS_COMP_DIESP_R:(OI)(CI)R
\\stgreceita1\rfoc$\compartilhamentos\OC\DIESP\DIJUT\18 Controle de PL:AUTORIDADE NT\SYSTEM:(OI)(CI)F

Solução: tentei fazer de cara com o sed, tentando descobrir uma forma de pegar tudo o que aparecia na linha antes do último espaço e repetir nas demais linhas, substituindo os espaços da linha; mas acabei ficando com este two-liner que deu conta do recado:
caminho=$(cat arq.txt | awk '(NR==1) { printf $1; for(i=2; i<nf ; i++) { printf " "; printf $i } }' | tr '\\' '/')
cat arq.txt | sed 's/acesso especial/acesso_especial/' | awk "{ print \"$caminho\:\"\$NF }" | tr '/' '\\' >> saida.txt

Sendo arq.txt o arquivo que contém a saída do cacls para uma pasta, e saida.txt o arquivo de saída. Depois bastou criar um loop para executar esses dois comandos para cada arquivo de entrada e pronto.
O primeiro comando pega o caminho da pasta, lendo apenas a primeira linha do arquivo e capturando tudo até o último espaço; depois esse caminho é acrescentado pelo segundo comando no começo de cada linha, retirando os espaços de identação. O sed da segunda linha está lá apenas para tratar o caso do texto “acesso especial”, que contém um espaço e atrapalhava o funcionamento do awk seguinte.
Como disse, pode ser que uma linguagem de script já própria do Windows como VBS ou Powershell resolvesse o problema de forma mais simples, mas como meu colega queria uma solução rápida resolvemos desta forma. Conhecer um pouco de shell e ter um cygwin instalado na máquina Windows ajudou bastante 😉