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 😉

Licenças de Software Livre e de Código Aberto

Ontem dei uma palestra no Serpro, onde trabalho, na Regional Brasília. sobre o tema Licenças de Software Livre e de Código Aberto. O conteúdo está disponível para download na página aulas e palestras.
UPDATE: pode-se assistir ao vídeo da apresentação e baixar o vídeo aqui.

Software Engineering is Dead

http://www.codinghorror.com/blog/archives/001288.html

Software development is and always will be somewhat experimental. The actual software construction isn’t necessarily experimental, but its conception is.

I can publicly acknowledge what I’ve slowly, gradually realized over the last 5 to 10 years of my career as a software developer: what we do is craftsmanship, not engineering.

control is ultimately illusory on software development projects.

Jeremias the Bêbado Hero

Estava eu navegando na internerd numa boa, quando me deparo com um banner de propaganda de um jogo MMORPG via web (é, tem mais de mil desses). A propaganda dizia que “o sistema de magias é diferente de todos os outros”, “o mais estratégico já visto”, e coisas desse nível. Depois de BOCEJAR, resolvi dar uma olhadinha na lata da coisa. É um tal de Nodiatis. Abri a página, fui indo, e parece que o bichinho é em Java, em 2D mesmo, com gráficos à la jogos de adventure. Não parece ruim, na verdade, embora não tenha olhado muito.
Pra não ter que criar conta, personagem, e essas coisas, mas ainda assim saber qual é a do jogo, achei o wiki do jogo, e fui direto olhar a lista de classes (que melhor forma de sacar rapidamente qual é a de um RPG senão vendo a lista de classes). O bicho tem bem umas 20 classes, dá uma olhada na lista no link abaixo, e presta atenção na antepenúltima:
http://nodiatis.wikia.com/wiki/Classes
“Alcoholic”.
Pois é, meus queridos, agora ALCOOLATRA é classe de RPG. E o bônus de classe? “+33% (up to 99%) resistance to fear”. Claro, né, bêbado não tem medo de nada.
Tu visualiza um bêbado tentando acertar um inimigo com um arco e flecha? É capaz de furar o próprio olho. Vai é segurar a linha e largar o arco.
Vai dar dano crítico em todos os hits – nele mesmo, é claro.
E pode olhar na lista de Skills que não tem nenhuma skill do tipo Bebida Quente, Bebida Gelada, Fermentada ou Destilada; só as skills típicas de um RPG mesmo. O bêbado deve ter, imagino, uma certa dificuldade em aumentar a habilidade dele em machados e espadas. Podiam pelo menos ter colocado uns talentos tipo Drunken Brawl, Cocktail Mixer ou até um Bafo Incendiário (tipo um Yoga Flame) pra dar uma colher de chá (ou cachaça) pra classe.
Bêbado agora é classe de RPG. Massa.

Extraindo o último elemento de uma linha com o awk

awk, o mastigador de linhas de texto

awk, o mastigador de linhas de texto

Hoje surgiu a necessidade de manipular, via script (shell), um arquivo texto e pegar o último elemento de uma linha, que é um código. Como a linha de exemplo abaixo:

DISSE0074I Operation successfully submitted. Distribution ID is 1234567890.123456.

No caso eu preciso pegar o código numérico no fim da linha. Geralmente eu usaria apenas o comando cut, como: cut -d’ ‘ -f8, mas e se a mensagem variar de tamanho (quantidade de palavras)? Como saber o índice do último elemento?
Entra em ação o awk. Usando awk ‘{print $8}’ dá pra imprimir o elemento número 8; e há a variável NF que informa a quantidade de campos. Então dá pra extrair o último campo assim:

cat arquivo.txt | awk ‘{print $NF}’

Perfeito para o que eu queria.

Teste de Nerdeza

Computer Nerd Inside

Computer Nerd Inside

Hoje no Fantástico passou uma matéria sobre nerds, exemplificando os tipos mais básicos (como nerds de tecnologia, de quadrinhos, de filmes, e de animê e cosplay). Foi interessante; não muito profunda mas deu um bom panorama geral do tema. Fizeram até uma retrospectiva sobre o que era considerado ser nerd nos anos 80 e o que é hoje. E no fim deram uma chamada para quem quiser fazer o teste pra saber se você é nerd no site do G1.
Eu, claro, fui lá curioso pra ver o tal teste… mas tinha umas perguntas como por exemplo esta aqui:
Quando chamam para uma caminhada ou para bater aquela pelada no fim de semana:

  • Fico na dúvida, mas acabo cedendo.
  • Dou uma desculpa esfarrapada e fico na internet.
  • Vou sem hesitar. Não há nada melhor do que isso!

Hmmm… a que mais se adequa ao meu caso é a segunda, mas… “desculpa esfarrapada”? Como assim? Eu dizia que não gostava de futebol mesmo e ficava o sábado inteiro no computador (isso já nos tempos do MSX). “Desculpa esfarrapada”? Pra quê?
E depois de olhar para as demais perguntas… honestamente? Parece teste escrito por quem não é nerd. E só conhece o estereótipo do que é ser nerd. O teste é bem palha.
Teste hardcore de nerd, mesmo, é esse aqui, já meio antigo: The Official MIT Nerd Test. O defeito dele é que é muito voltado para nerds de matemática, física e computação (justamente por ser antigo, da época em que o rótulo de nerd só pegava nesses tipos).
Até eu mesmo consegui pensar em algumas perguntas, mais interessantes que as do teste do Fantástico, e que identificam melhor o indivíduo. Taí algumas perguntas, englobando os assuntos principais mostrados na reportagem (pelo menos os que eu conheço melhor). Não é pra ser um teste completo nem nada, são só algumas sugestões. Se tu errar a maioria dessas perguntas aí (e não vale procurar na internet, tem que ser de cabeça), tu não é nerd… pelo menos não um nerd de computação, filmes ou quadrinhos considerados nerd em geral.

  • Qual o nome da nave do Han Solo?
  • Nome da raça do Chewbacca?
  • Qual o nome do tipo de energia que os Transformers usam?
  • Sabe dizer quem são todos estes personagens: Scotty, Sulu, Uhura?
  • Nome da cidade de onde veio Boromir? (dica: Gondor é o nome do reino e não da cidade)
  • Quantos setores do espaço são patrulhados pelos Lanternas Verdes?
  • Como Vandal Savage ficou imortal?
  • Nome do país do Doutor Destino?
  • Quem é Mxyzptlk?
  • Sabe qual é o filme com Kiefer Sutherland e Jennifer Connely que, dizem, serviu de inspiração para a obra-prima dos Irmãos Wachowski? Já o viu?
  • Qual a principal diferença entre o Kingpin do filme do Demolidor e o dos quadrinhos? (não, não estou falando do filme com Sylvester Stallone)
  • Nome do modelo de exterminador do Arnold Schwarznegger, nos filmes d’O Exterminador do Futuro?
  • Frase dita para para o robô Gort no filme O Dia Em Que A Terra Parou?
  • Qual o filme que faz paródia com essa frase e como ela foi alterada?
  • Em que outro filme de nerd essa frase aparece ao fundo, impressa numa faixa em um cubículo de escritório?
  • Já usou um modchip?
  • Usa regularmente algum emulador de um console ou computador antigo?
  • Sabe programar em alguma destas linguagens: C, Lisp, Assembly?
  • Sabe o que é uma distribuição Linux, e como isso é diferente do “Linux” em si?
  • Sabe diferenciar o conceito de memória virtual do arquivo de paginação (swap file)?
  • Nome da nave usada pela equipe do Morpheus no filme Matrix?
  • Sabe de que personagem histórico esse nome foi tirado?
  • Nome do modelo de robô que foi testado antes do Robocop, e que falhou nos testes?
  • Filme em que o Matthew Broderick interpreta um hacker?
  • Quem tinha “12345” como a combinação da fechadura da mala? (dica: é de um filme)
  • Nome do demônio com quem o Spawn fez um pacto?
  • De que obra literária esse nome foi inspirado?
  • Sabe o que é Nethack?
  • Já consegiu vencer Nethack alguma vez?
  • Reconhece o nome Reed Richards?
  • Barry Allen?
  • Lucas Bishop?
  • Helena Bertinelli?
  • Lo Pan? E “Pork Chop Express”?

…só pra citar alguns.
Ah, aqui vai o “disclaimer”: não estou querendo estabelecer que ser nerd é isto ou aquilo, ou dizer que sou mais que ninguém… isso que escrevi aí em cima é só pra diversão.
Update: mais testes de nerd aqui: http://www.nerdtests.com

Carcaju, o Ex-Homem

Snikt.

Snikt.

Uns anos atrás um colega meu assistiu uma cópia pirata semi-legítima do filme X-Men e teve que aguentar uma daquelas legendas porcamente traduzidas. A certa altura do filme, o Ciclope vem e declara ao Wolverine: “I’m an X-man”. Na legenda tava lá: “eu sou um ex-homem”.
Tu, Ciclope, um ex-homem? Eu não desconfiava…
Eu não sei se esses erros são culpa de traduções feitas automaticamente por programas ou o quê, mas eu lembrei dessa história aí por causa de uma coisa parecida que aconteceu esses dias. Estava eu assistindo a cópia pirata alternativa do filme do Wolverine, e o tempo todo, na legenda, o Gambit era chamado de “Gâmbia”. Que raios é gâmbia??
De acordo com a Wikipédia, Gâmbia é um país africano. Nada a ver com o Gambit… vai ver o tal programa tradutor automático se confundiu e achou que a palavra do dicionário em português mais parecida era essa.
O que eu sei é que ficou irritante ter que ler na legenda, o tempo todo, “Gâmbia” isso, “Gâmbia” aquilo. Se é pra ficar traduzindo nome de personagem, porque não traduzem logo o do Wolverine também? Porque wolverine nada mais é que o nome de um animal selvagem, pequeno e musculoso. Notem no artigo da Wikipédia em inglês aí os nomes alternativos do mesmo animal. Porque em português, esse animal é chamado de… carcaju (ou glutão).
Agora imagina só você ir ao cinema ver o filme do Wolverine, e que ao invés do título original “X-Men Origins: Wolverine” estivesse lá no letreiro:

EX-HOMEM ORIGENS: CARCAJU

Análise de Tráfico

Entrei hoje na página do Projeto Tor (http://www.torproject.org/) e dei de cara com este texto:
Análise de "tráfico" de rede...
O Projeto Tor serve para redirecionar os pacotes TCP enviados pelo seu computador, de forma que eles passem por dentro de uma rede espalhada pelo mundo todo antes de atingir seu destino. Um dos vários objetivos disso é proteger você contra a análise de tráfego na rede. Não tem nada a ver com traficantes agindo na internet… :p 😉