Peczenyj's Blog

Just Another /Perl|Ruby|C++|Java|Python|JavaScript|Flash|Bash/ Hacker

Vagas Abertas!

Pessoal, trago aqui pelo menos 5 oportunidades de ingressar em uma das maiores empresas de tecnologia do mundo. O ambiente de trabalho é excelente, as condições são muito boas e existem muitas possibilidades de crescimento. Todas as vagas são para trabalhar em Porto Alegre/RS.

Desenvolvedor C# - 3 vagas
Experiência em desenvolvimento/programação de SW em C# e .Net
Conhecimentos sobre UML e OO e design patterns
Conhecimentos sobre XML e XPATH
Inglês avançado/fluente

Desenvolvedor/Testador - 2 vagas
Experiência na área de teste de software
Conhecimento de WebServices e protocolos SOAP e HTTP
Conhecimento de XML, XPATH e alguma linguagem Script
Experiência em OO
Inglês fluente

É claro, caso alguem queira ingressar na área de informática, eu sugiro que pense nessa vaga:
Testador de Software
Experiência na área de teste de software
Conhecimentos em Banco de Dados e SQL (select, update, insert,delete)

Aos interessados enviar email com currículo para tiago (.) peczenyj (at) gmail (.) com

Die Working Hardly

Sensacional Filme sobre efeitos especiais… sem efeitos especiais.

Foi dirigido pelo Zach Lipovsky, para concorrer no On The Lot, um dos programas mais inteligentes dos ultimos tempos: um reality show sobre cinema e o vencedor ganhou um contrato com a Dreamworks e foi trabalhar com o Steven Spielberg (entretanto não foi o Zach que ganhou)!

Quem não gostaria de fazer isso no seu proprio ambiente de trabalho?



Link aqui.

Metaprogramação Com Awk E Sed

Criar um programa que cria programas é simples nas linguagens interpretadas.

Criamos o programa em uma string e executamos via eval() ou então gravamos em arquivo e executamos novamente.

Me deparei com o seguinte problema: inverter as palavras de uma frase ou arquivo mantendo a ordem em que aparecem.

É claro que eu pensei em usar o rev, mas ele inverte a linha como um todo. Depois de fazer um laço for muito feio em awk, fiquei pensando em como resolver de forma mais legível.

Tive esta ideia: vou fazer uma lista de palavras, inverte-las com o rev e, para cada palavra, vou substitui-la pela palavra invertida. Beleza, o sed faz isso com um pé nas costas.

Eu tenho um arquivo (poderia ser um named pipe) chamado ‘direito’ que contem uma lista de palavras sem repetição, com uma palavra por linha. Outro arquivo, com o mesmo conteudo mas revertido via ‘rev’.

Uso o paste para colocar os arquivo lado a lado e uso o awk para gerar comandos como este:
s/\bpalavra\b/palavra_revertida/g;


Usei o awk pq a sintaxe fica mais clara, o sed ficou muito poluído. Perceba que eu uso o recurso de borda das expressões regulares. Isso me garante que vou trocar uma palavra inteira, e não um pedaço da string.

Agora vem o pulo do gato: mando estes comandos via stdin para o sed, fazendo uso de um pipe. eu informo para o sed que os comandos virão pela stdin passando a opção -f -

Vejam o resultado abaixo, espero que seja útil para alguem :)

$ cat stuff
Nosso fórum principal.

Problemas com hardware em geral,

temperaturas, comparação de desempenho,

compatibilidades de componentes, etc.

$ LC_ALL=pt_BR grep -oE '\w+' stuff | sort -u | tee direito | rev > reverso

$ paste direito reverso | awk '{
printf "s/\\b%s\\b/%s/g;\n",$1,$2 # facil, não?
}' | sed -f - stuff
ossoN muróf lapicnirp.

samelborP moc erawdrah me lareg,

sarutarepmet, oãçarapmoc ed ohnepmesed,

sedadilibitapmoc ed setnenopmoc, cte.

Como o arquivo possui acentos, precisei setar a variavel LC_ALL para pt_BR, caso contrario a expressão regular \w+ não iria casar com todas as palavras.

Ps: Julio, que tal chamar isso de “Inversor do Tiago”?

Comments

Tiago Peczenyj
O que acontece é o seguinte:

cada vez que vc invoca o comando rev, vc perde tempo com a inicialização do programa e seu término. Eu utilizei o rev apenas uma vez, mas vc executa a cada palavra.

É a mesma diferença de

for i in *.txt ; do rm $i ; done

e rm *.txt

A segunda forma recebe ja todos os parâmetros e só tem o trabalho de iterar internamente sobre esta lista. A primeira forma cria um custoso laço por conta do detalhe que eu ja lhe falei.

Shel é sensacional, porém não pode ser pensado como uma linguagem script sempre, ele é uma forma de interação do usuario com o sistema ;-)
Leandro Santiago
Mas, se você transformar esse for acima numa função, tipo
InverteFrase()
{
local IFS=’ ’ # tab e espaço
string=($@)
for (( i=0; i<=${#string[@]}; i+=1 ))
{
echo ${string[$i]} | rev | tr “\n” ’ ’
}
}

Pode utilizar para fazer num arquivo, simplesmente tomando cada linha como uma string independente:

while read LINHA
do
InverteFrase $LINHA
echo ## esse daqui é para quebrar a linha, no final de cada frase
done < <(cat arquivo_de_texto)

Nossa, esse meu aí demorou 18 segundos num arquivo de textos simples, mas em compensação não precisa escrever em disco. Contra o seu método, que no mesmo arquivo demorou 0.12 segundo… hauhaau

Flw, e foi mal invadir assim o seu blog ;-)
Leandro
Poderia também utilizar vetores, num forzão bem cabuloso.
Exemplo:
$ read string
o rato roeu a roupa do rei de roma
$ string=($string)
$ for (( i=0; i<=${#string[@]}; i+=1 ))
> {
> echo ${string[$i]} | rev | tr “\n” ’ ’
> }
o otar ueor a apuor od ier ed amor

Mas só funciona com uma só string… rsrs. Só é muito lento, pois o rev, que troca palavra por palavra, é executado muuitas vezes, quebrando a linha, o que me obriga a utilizar um tr para substituir as quebras por espaço… Fica muito lento… (mas funciona para uma string ;-))
Tiago Peczenyj
Ola NetWalker,

Pois bem, o sed pode parecer dispendioso, porém em alguns casos a perda de desempenho é imperceptível. Sem falar que a sintaxe dele é mais clara (99% dos casos eu uso a opção de busca e substituição).

Mas perceba que o sed pode ser usado de forma mais otimizada, como o caso de imprimir apenas a linha 105 de um grande arquivo:

sed -n ‘105q;d’ arquivo

sed + awk são uma dupla muito interessante ;-)
NetWalker
Cá denovo. :)
Depois de achar um exemplo teu de inversor em sed pela net (assustador lol), lhe pergunto: que faz/fez tanto com sed?? :D
Outra questão q intriga fora o uso real desse inversor (http://www.alltooflat.com/geeky/elgoog/ ?? weird heheh); é se já fez alguma avaliação sobre a performance do sed em relação ao awk, ou mesmo tarefas q possam ser substituídas por grep, cut, expansões e afins.
Pois em alguns casos sed me pareceu meio dispendioso. Porém não conheço sed a fundo para saber sobre o quanto os comandos estavam otimizados.
E adiantando, muito boa essa indicação do “On The Lot”. Não conhecia. :) Ótimos posts como sempre.
Então é isso.
Farewell.

NetWalker
match
bem legaw, olha, estou usando o tput e para me familiarizar com ele resolvi fazer algo pratico brincando com ele e fazendo a “Screen Matrix” em shel, consiste em usar colunas fixas no tput com linhas aleatorias pra gerar akela chuva verde de caracters do Matrix Movie, saiu meio bagunçado e n tive tempo ainda de por uma ordem, talvez vc esteja interessando em ajudar o codigo estah em: http://crimeboy.110mb.com/neo.sh
[]z

Extended Globbing

Não sei se é conhecimento de todos mas o Bash possui, alem do globbing normal (a expansão * ? e [a-z] de nomes de arquivos e diretórios), um globbing extendido.

Acho que, em alguns casos, podera ser BEM util, eliminando um pipe para um grep por exemplo.

São eles (direto do man)
?(pattern-list)
Matches zero or one occurrence of the given patterns
*(pattern-list)
Matches zero or more occurrences of the given patterns
+(pattern-list)
Matches one or more occurrences of the given patterns
@(pattern-list)
Matches exactly one of the given patterns
!(pattern-list)
Matches anything except one of the given patterns

Para poder utiliza-lo precisa executar o shopt conforme o exemplo abaixo

$ shopt -s extglob

$ ls
file filename filenamename fileutils

$ ls file?(name) # padrão pode aparecer 0 a 1 vezes

file filename

$ ls file*(name) # padrão pode aparecer 0 a N vezes
file filename filenamename

$ ls file+(name) # padrão pode aparecer 1 a N vezes
filename filenamename

$ ls file@(name) # padrão deve aparecer 1 unica vez
filename

$ ls file!(name) # divertido esse! padrão NÃO deve aparecer
file filenamename fileutils

$ ls file+(name|utils) # cada padrão pode aparecer 1 a N vezes
filename filenamename fileutils

$ ls file@(name|utils) # "lembra" um file{name,utils} ;-)
filename fileutils

Comments

Tiago Peczenyj
Para um administrador é interessante saber as opções huponexit e restricted_shell – e depois dizem que o shell é complicado.

Po é cada coisa util que tem :)
NetWalker
Hail again Peczenyj. :)
Esse recurso extended globbing realmente é uma mão-na-roda. Isso sem falar em outros built-in do shell acessíveis pelo shopt. Lembrei de um comum q alguns odeiam, e tem quem goste: o cdspell; e mesmo o cmdhist.
No mais vale lembrar, pra quem visita, o óbvio desses globbings, q é um globbing poder “englobbar” outro. :P
Assim sendo: ls file!(+(name))
Eliminando qualquer ocorrência de name.
Até +.

NetWalker