Mostrando postagens com marcador Programação. Mostrar todas as postagens
Mostrando postagens com marcador Programação. Mostrar todas as postagens

3 de fevereiro de 2012

Sed


O que é?
O Sed é um editor de textos não interativo.
Ele pode editar automaticamente, sem interação do usuário, vários arquivos seguindo um conjunto de regras especificadas.


O que significa a palavra Sed
Vem do inglês "Stream EDitor", ou seja, editor de fluxos (de texto).


Como saber se devo usar o Sed
Sendo um editor de textos não interativo, o Sed é excelente para desempenhar algumas tarefas, mas em outras seu uso não é aconselhado.


Quando usar o Sed
A característica principal do Sed é poder editar arquivos automaticamente.

Então sempre que você precisar fazer alterações sistemáticas em vários arquivos, o Sed é uma solução eficaz.

Por exemplo, você tem um diretório cheio de relatórios de vendas, e descobriu que por um erro na geração, todas as datas saíram erradas, com o ano de 1999 onde era para ser 2000. Num editor de textos normal, você tem que abrir os relatórios um por um e alterar o ano em todas as ocorrências.

Certo, isso não é tão complexo se o editor de textos possuir uma ferramenta de procura e troca, também chamado de substituição.

Mas então suponhamos que o erro da data não seja o ano, e sim o formato, tendo saído como mm/dd/aaaa quando deveria ser dd/mm/aaaa. Aqui não é uma substituição e sim uma troca de lugares, e uma ferramenta simples de procura e troca não poderá ajudar.

Esse é um caso típico onde o Sed mostra seu poder: alterações complexas em vários arquivos.

Utilizando o Sed, a solução para este problema (que veremos adiante) é até simples, bastando definir uma série de regras de procura e troca, e o programa se encarregará de executá-las e arrumar os relatórios.


Quando não usar o Sed
Nenhuma ferramenta é ideal para todas as tarefas, e o Sed não é uma exceção à regra.

Edição genérica de textos
Ele não é prático para ser utilizado como editor de textos de uso genérico.

Para escrever textos, ou alterar coisas simples, é mais rápido e fácil abrir um editor de textos interativo como o vi ou o emacs e fazer a alteração "na mão".

Programação avançada
O Sed não é uma linguagem de programação completa, pois não possui variáveis, funções matemáticas, interação com o sistema operacional, entre outras limitações. Mas bem, ele é um manipulador de texto e não uma linguagem de uso geral.

Algumas estruturas complexas podem ser simuladas com alguma técnica, mas se o seu programa em Sed começou a inchar muito, é aconselhável reescrevê-lo numa linguagem com mais recursos, como o perl.


Como ele funciona
O Sed funciona como um filtro, por onde você passa um texto X e ele joga na saída um texto Y.

O texto X virou Y seguindo algumas regrinhas que você determinou.

Pense no Sed como um processador de alimentos, dependendo da lâmina utilizada, a batata sai cortada de uma maneira diferente :)

o Sed funciona como um filtro, ou conversor.

o Sed é orientado a linha, de cima para baixo, da esquerda para a direita.

o Sed lê uma linha da entrada padrão (STDIN) ou de um arquivo especificado, aplica os comandos de edição e mostra o resultado na saída padrão (STDOUT). vai para a próxima linha e repete o processo.

o Sed aceita endereços para os comandos.

o Sed aplica os comandos para todas as linhas caso um endereço não seja especificado.

o Sed faz uso intensivo de expressões regulares.


Sua sintaxe
A sintaxe genérica de um comando Sed é:

sed [opções] regras [arquivo]

Sendo que regras tem a forma genérica de:

[endereço1 [, endereço2]] comando [argumento]

Exemplo
Como notação tradicional, o que está [entre colchetes] é opcional, então a sintaxe Sed mais simples que existe é sed regra como em:

prompt$ cat texto.txt | sed p

Ou seja, o Sed lendo da entrada padrão o conteúdo do arquivo texto.txt via duto |, aplica o comando p para todas as linhas do arquivo, ou seja, as duplica.

0.2.2. Outros exemplos
Um outro exemplo do Sed com opções e recebendo um arquivo como parâmetro seria:

prompt$ sed -n p texto.txt

E ainda, agora especificando um endereço para o comando p:

prompt$ sed -n 5p texto.txt

Ou seja, este comando imprime apenas a linha 5 do texto.txt



Tornando arquivos Sed executáveis
O interpretador de comandos mais utilizado (bash) sempre procura na primeira linha de um arquivo instruções para executá-lo.

Se um arquivo é um programinha em shell, basta colocar

#!/bin/sh

Na primeira linha para que o bash saiba que deve executá-lo com o comando /bin/sh. O mesmo funciona para qualquer outro interpretador, como o Sed. então para tornar um arquivos de comandos Sed executável basta colocar como primeira linha:

#!/bin/sed -f

E é claro, torná-lo executável:

prompt$ chmod +x programa.sed

E na linha de comando, chame-o normalmente:

prompt$ ./programa.sed texto.txt
prompt$ cat texto.txt | ./programa.sed



Descrição de todos os comandos
prompt$ man sed
prompt$ pinfo sed

Ou num resumo rápido:

Legenda:

[ARQUIVO] arquivo ou fluxo de texto (via pipe) original a ser modificado
[TEXTO] trecho de texto. pode ser uma palavra, uma linha,
várias separadas por \n, ou mesmo um vazio.
[PADRÃO] [TEXTO] contido no ESPAÇO PADRÃO


= imprime o número da linha atual do [ARQUIVO]
# inicia um comentário
! inverte a lógica do comando
; separador de comandos
, separador de faixas de endereço
{ início de bloco de comandos
} fim de bloco de comandos

s substitui um trecho de texto por outro
y traduz um caractere por outro

i insere um texto antes da linha atual
c troca a linha atual por um texto
a anexa um texto após a linha atual

g restaura o [TEXTO] contido no ESPAÇO RESERVA (sobrescrevendo)
G restaura o [TEXTO] contido no ESPAÇO RESERVA (anexando)
h guarda o [PADRÃO] no ESPAÇO RESERVA (sobrescrevendo)
H guarda o [PADRÃO] no ESPAÇO RESERVA (anexando)
x troca os conteúdos dos ESPAÇO PADRÃO e RESERVA

p imprime o [PADRÃO]
P imprime a primeira linha do [PADRÃO]
l imprime o [PADRÃO] mostrando caracteres brancos

r inclui conteúdo de um arquivo antes da linha atual
w grava o [PADRÃO] num arquivo

: define uma marcação
b pula até uma marcação
t pula até uma marcação, se o último s/// funcionou (condicional)

d apaga o [PADRÃO]
D apaga a primeira linha do [PADRÃO]
n vai para a próxima linha
N anexa a próxima linha no [PADRÃO]
q finaliza o Sed imediatamente



Lista de todos os comandos por categoria
informações =
marcadores :
comentários #
comandos de edição s i c a y
comandos de registradores g G h H x
comandos de impressão p P l
comandos de arquivo r w
modificadores g i !
separadores ; -e \n
controle de fluxo b t d D n N q
endereço // ,
limitadores {} \(\)
registradores dinâmicos \1 \2 ... \9





Sed e shell
Com o Sed sendo invocado na linha de comando, deve-se ter alguns cuidados para evitar transtornos. O interpretador de comandos (shell), interpreta a linha de comando antes de processá-la, então alguns caracteres especiais como $, \ e !, são interpretados pelo shell antes de chegarem ao Sed, modificando o comportamento esperado.

Para evitar isso coloque os comandos Sed sempre entre aspas simples:

prompt$ sed 's/isso/aquilo/' texto.txt

Salvo quando no meio do comando Sed, existir algo que deva ser interpretado, como uma variável por exemplo. Neste caso coloque os comandos entre aspas duplas:

prompt$ sed "s/$HOME/aquilo/" texto.txt

Ou ainda, para evitar completamente a interpretação do shell, sem se preocupar com aspas, coloque os comandos Sed num arquivo. Veja o tópico Colocando comandos Sed num arquivo.



Usando outros delimitadores
No comando s
É comum ao fazer um comando de substituição s/// conter uma / num dos dois lados do comando, como quando querendo substituir /usr/local/bin por /usr/bin.

Sendo a barra o delimitador do comando s as outras barras comuns devem ser escapadas com a barra invertida \, para não serem confundidas com os delimitadores normais, ficando o monstro a seguir:

prompt$ sed 's/\/usr\/local\/bin/\/usr\/bin/' texto.txt

Para evitar ter que ficar se escapando todas estas barras, basta lembrar que o comando s aceita qualquer delimitador, sendo a barra apenas um padrão de referências históricas. Então, neste caso, poderíamos escolher outro delimitador como por exemplo a vírgula:

prompt$ sed 's,/usr/local/bin,/usr/bin,' texto.txt

Evitando-se de ter que ficar escapando as barras. A mesma dica vale para o comando y.


E se precisássemos apagar as linhas que contém o /usr/local/bin? Teríamos que colocar o nome do diretório no endereço do comando d, voltando com a festa dos escapes:

prompt$ sed '/\/usr\/local\/bin/d' texto.txt

Para usarmos outro delimitador no endereço, basta escaparmos o primeiro, que no caso abaixo é a vírgula:

prompt$ sed '\,/usr/local/bin,d' texto.txt

Confusão de delimitadores com o texto a ser procurado é muito comum de acontecer, então se algo não está funcionando como deveria, olhe com cuidado para ver se não há conflitos entre eles.


Gravando o resultado no mesmo arquivo
Problema inicial
O procedimento comum quando se quer gravar num arquivo o resultado de um comando Sed, é o redirecionamento:

prompt$ sed 'comando' texto.txt > texto-alterado.txt

Mas é muito comum, ao alterarmos um arquivo, queremos gravar estas alterações no próprio arquivo original. A tentativa intuitiva seria:

prompt$ sed 'comando' texto.txt > texto.txt

Mas é só fazer para ver. Além de não dar certo, você ainda perderá todo o conteúdo do arquivo.

Isso acontece porque ao fazer o redirecionamento >, o shell abre imediatamente o arquivo referenciado, antes mesmo de começar a executar o comando Sed. E como este é um redirecionamento destrutivo > e não incremental >>, se o arquivo já existir, ele será truncado, e seu conteúdo perdido. A essa altura, o Sed começará seu processamento já lendo um arquivo texto.txt vazio, e aplicados qualquer comandos Sed num arquivo vazio, o resultado será o próprio arquivo vazio.


Solução genérica
Para evitar isso, voltamos a primeira tática de gravar o resultado num outro arquivo, e depois o mais natural é mover o arquivo novo sobre o original:

prompt$ sed 'comando' texto.txt > texto-alterado.txt
prompt$ mv texto-alterado.txt texto.txt

Para a grande maioria dos casos, isso é suficiente, mas convém aqui lembrar que caso o arquivo 'texto.txt' possua atributos especiais, grupo diferente do padrão do usuário, ou referências (links, simbólicos ou não) para outros arquivos, tudo isso será perdido. Ao mover o arquivo recém-criado, com os atributos padrão do sistema, sobre o original, este perderá seus atributos e ficará com os padrões do sistema, herdado do arquivo novo.


Solução segura
Para evitar isso, a abordagem mais ortodoxa e segura seria aplicar o comando Sed numa cópia e gravar o resultado no arquivo original via redirecionamento:

prompt$ cp -a texto.txt texto-tmp.txt
prompt$ sed 'comando' texto-tmp.txt > texto.txt
prompt$ rm texto-tmp.txt

Novamente, isso só é necessário com arquivos especiais, senão a solução com o mv pode ser usada. Mas é importante ter em mente esta outra maneira e principalmente saber o porque de utilizá-la, sendo este conhecimento aplicável a qualquer outro comando do sistema que leia e grave arquivos.



Como substituir alguma coisa por uma quebra de linha
No Sed da GNU, a partir da versão 3.02.80(*), foi adicionado o \n como escape válido dos dois lados do comando s///. Com isso a tarefa de colocar cada palavra numa linha isolada, ou seja, trocar espaços em branco por quebras de linha, fica trivial:

prompt$ sed 's/ /\n/g' texto.txt

Mas com outras versões do Sed que não entendem este escape, a quebra de linha deve ser inserida literalmente e deve ser escapada:

prompt$ sed 's/ /\
prompt$ /g' texto.txt

Como curiosidade, a operação inversa, de colocar todas as linhas de um arquivo numa linha só, já é mais trabalhosa e utiliza o conceito de laço:

prompt$ sed ':a;$!N;s/\n/ /g;ta'

(*) veja o tópico Nota sobre os adicionais GNU


Apagando linhas específicas
O comando para apagar linhas é o d.

O único detalhe nesta tarefa é especificar quais linhas você vai querer apagar. Isso está completamente coberto no tópico O endereço.


Como ignorar maiúsculas e minúsculas
O jeito padrão do Sed ser "ignore-case", é dizendo literalmente todas as possibilidades, como em:

prompt$ sed '/[Rr][Oo][Oo][Tt]/d' texto.txt

Para apagar todas as linhas que contêm a palavra root, ROOT, RooT etc.

No Sed da GNU, a partir da versão 3.01-beta1(*), foi adicionado o modificador I no endereço e no comando s///, fazendo com que o comando acima fique mais simples:

prompt$ sed '/root/Id' texto.txt

Ou ainda:

prompt$ sed 's/root/administrador/Ig' texto.txt

(*) veja o tópico Nota sobre os adicionais GNU



Lendo e gravando em arquivos externos
0.4.1. Lendo arquivos
Uma tarefa comum é incluir cabeçalho e rodapé num arquivo qualquer. O Sed possui um comando específico para ler arquivos, o r, então basta(*):

prompt$ sed -e '1r cabecalho.txt' -e '$r rodape.txt' texto.txt

Para incluir o cabeçalho após a linha 1 e incluir o rodapé após a última linha.

(*) a explicação do porquê das opções -e está no tópico Aplicando vários comandos de uma vez.



Gravando arquivos
O comando w grava num arquivo a linha atual, ou melhor, o conteúdo do espaço padrão. Por exemplo, você quer gravar num arquivo o resultado de uma busca por linhas que contêm a palavra estorvo. A solução não-Sed seria:

prompt$ grep 'estorvo' texto.txt > estorvos.txt

Nosso similar em Sed seria:

prompt$ sed '/estorvo/w estorvos.txt' texto.txt

Gravar dados num arquivo também pode servir de espaço auxiliar caso o espaço reserva não seja suficiente. Mas esta é uma opção drástica, não tão flexível. Mais informações sobre o espaço reserva no tópico Conhecendo os registradores internos.


Trocando um trecho de texto por outro
Uma tarefa que parece simples mas confunde, é trocar um trecho de texto, como um parágrafo inteiro por exemplo, por outro trecho, independente do número de linhas de ambos.


Trocar várias linhas por uma
Essa é simples, basta usar o comando c, que "Coloca" um texto no lugar da linha atual. A única complicação é definir o endereço, para aplicar o comando apenas nas linhas desejadas. Por exemplo, vamos colocar uma frase no lugar de uma área de texto pré-formatado num documento HTML. Esta área é delimitada pelos identificadores <pre> e </pre>:

prompt$ sed '/<pre>/,/<\/pre>/c \
prompt$ aqui tinha texto pré-formatado' texto.html

Note que o comando c (assim como o a e o i) exige que o texto que ele recebe como parâmetro esteja na linha seguinte, estando a quebra de linha escapada com a barra invertida \

No Sed da GNU, a partir da versão 3.02a(*), é permitido que se coloque o texto na mesma linha:

prompt$ sed '/<pre>/,/<\/pre>/c aqui tinha texto pré-formatado' texto.html

(*) veja o tópico Nota sobre os adicionais GNU


Trocar várias linhas por outras
Similarmente a trocar por apenas uma linha, pode-se usar o comando c e passar várias linhas para ele. O único detalhe é que todas as linhas devem ser escapadas no final, menos a última:

prompt$ sed '/<pre>/,/<\/pre>/c \
prompt$ aqui tinha texto pré-formatado,\
prompt$ mas eu resolvi tirar.\
prompt$ porque?\
prompt$ porque sim' texto.html

É claro, quando o comando começa a ficar grande desse jeito, é melhor colocá-lo num arquivo. Saiba mais detalhes sobre isso no tópico Colocando comandos sed num arquivo.

Mas melhor ainda é separar o comando Sed do texto, colocando-o num arquivo separado. Assim, quando se precisar alterar este texto, basta editá-lo, sem mudar o comando Sed, e sem precisar ficar colocando \ no final de cada linha.

Supondo que nosso texto explicativo do porquê da retirada do texto pré-formatado foi gravado no arquivo desculpa.txt, utilizaremos o comando r para lê-lo e o comando d para apagar o texto antigo:

prompt$ sed -e '/<\/pre>/r desculpa.txt' -e '/<pre>/,/<\/pre>/d' texto.html

Então acompanhe o que acontece: o primeiro comando será executado apenas na linha </pre> que é o fechamento do trecho, então vamos esquecer dele por enquanto. O segundo comando diz para apagar o trecho desde <pre> até </pre>, então assim que começar o trecho, ele vai apagando, linha por linha.

Ao chegar na linha que contém o </pre>, o primeiro comando Sed entra em ação e lê o arquivo desculpa.txt, colocando seu conteúdo imediatamente após a linha atual. Em seguida, o segundo comando apaga a linha </pre>, completando a tarefa.

Esta segunda solução é mais difícil de entender e implementar, mas é muito mais prática caso a alteração do texto a ser colocado seja freqüente, além destas alterações poderem ser feitas por alguém que nem saiba o que é Sed, pois será apenas um texto normal.

Note que sempre que o </pre> foi referenciado nos endereços, a barra foi escapada, ficando <\/pre>. A explicação desse escape está em Usando outros delimitadores.

obs.: talvez o <pre></pre> não seja um exemplo dos mais didáticos, mas não me veio algo mais comum à mente...


Emulando outros comandos
Aqui vão alguns exemplos de emulações de outros comandos usando-se o Sed:
comando
emulação
cat
sed :
head
sed 10q
grep
sed /padrão/!d
grep -v
sed /padrão/d
tac
sed 1!G;h;$!d
tail -1
sed $!d
tr A-Z a-z
sed y/ABCDEF...UVWXYZ/abcdef...uvwxyz/
wc -l
sed -n $=

26 de janeiro de 2012

Fedora Post Install

Com o tempo todos nós nos tornamos um pouco menos pacientes em certos processos da vida com os quais convivemos sempre.

Você ama formatar máquina. OK. Cinco anos fazendo isso, e você começa a se cansar do processo em sí ou pelo menos não o faz com tanto vigor se comparado ao desempenho anterior.

Conheço muitos assim e eu particularmente não tenho paciência em ficar executando anti-vírus, realizando varreduras intermináveis ou algo do escopo.


Migrei pro Linux há um razoável tempo, e sempre me senti bem com o tempo que eu economizava não formatando máquinas para voltar à performance inicial de fábrica - como todos fazem com Windows.

Mas, de um tempo para cá veio percebendo que mesmo não formatando a máquina todo semestre, sempre que eu preciso fazer algo do tipo, como por exemplo, mexer em particionamento, instalar um outro SO, etc, -  eu preciso definir tudo de novo: Java, Office, Browser e suas definições e configurações, meu cliente de email, Terminal, sensores de temperatura e clock, etc..etc

Por esta razão, desenvolvi um script para automizar processos de pós instalação do meu Fedora 16, o Umbreon.

O script ainda não está finalizado. Pretendo incluir configurações de aparência de janelas, atalhos de teclado, etc.


De qualquer forma, se quiserem, realizem o download, modifiquem ao seu gosto e o utilizem o quanto quiserem, entretanto sigam as especificações de compartilhamento e liberdade da GPLv2.


DOWNLOAD: http://www.4shared.com/file/DTOTXD-j/kstar.html


15 de dezembro de 2011

Otimizando seu browser

Abra o seu browser e digite about:config na barra de endereço.

Nos passos seguintes, caso não encontre o que estiver sendo solicitado, deve-se criar uma entrada clicando com o botão direito do mouse no espaço em branco. Para false e true deve-se escolher boolean e para números deve-se escolher Inteiro.


Internet Rápida ou DSL ou Banda Larga = > 2 Mbps
Internet Lenta ou 3G horários bons ou DSL PNBL = De 500 kbps até 2 Mbps 
Internet Muito Lenta ou 3G razoável = De 100 kbps até 500 kbps
Internet Dial-up ou 3G em pico = Até 100 kbps








CONFIGURAÇÃO PARA TODOS
Encontre network.http.pipelining e mude para true
Encontre network.http.proxy.pipelining mude para true
Encontre network.http.pipelining.maxrequests mude para true
Encontre content.notify.backoffcount mude para 5
Encontre plugin.expose_full_path mude para true
Encontre ui.submenuDelay mude para 0





CONFIGURAÇÕES ESPECÍFICAS
COMPUTADOR RÁPIDO E INTERNET RÁPIDA
Encontre content.interrupt.parsing mude para true
Encontre content.max.tokenizing.time mude para 2250000
Encontre content.notify.interval mude para 750000
Encontre content.notify.ontime mude para true
Encontre content.switch.threshold mude para 750000
Encontre nglayout.initialpaint.delay mude para 0
Encontre network.http.max-connections mude para 48
Encontre network.http.max-connections-per-server mude para 16
Encontre network.http.max-persistent-connections-per-proxy mude para 16
Encontre network.http.max-persistent-connections-per-server mude para 8
Encontre browser.cache.memory.capacity mude para 65536


COMPUTADOR RÁPIDO E INTERNET LENTA

Encontre content.max.tokenizing.time mude para 2250000
Encontre content.notify.interval mude para 750000
Encontre content.notify.ontimer mude para true
Encontre content.switch.threshold mude para 750000
Encontre network.http.max-connections mude para 48
Encontre network.http.max-connections-per-server mude para 16
Encontre network.http.max-persistent-connections-per-proxy mude para 16
Encontre network.http.max-persistent-connections-per-server mude para 8
Encontre nglayout.initialpaint.delay mude para 0
Encontre browser.cache.memory.capacity mude para 65536


COMPUTADOR RÁPIDO E INTERNET MUITO LENTA

Encontre browser.xul.error_pages.enabled mude para true
Encontre content.interrupt.parsing mude para true
Encontre content.max.tokenizing.time mude para 3000000
Encontre content.notify.interval mude para 750000
Encontre content.notify.ontimer mude para true
Encontre content.switch.threshold mude para 750000
Encontre network.http.max-connections mude para 32
Encontre network.http.max-connections-per-server mude para 8
Encontre network.http.max-persistent-connections-per-proxy mude para 8
Encontre network.http.max-persistent-connections-per-server mude para 4
Encontre nglayout.initialpaint.delay mude para 0
Encontre browser.cache.memory.capacity mude para 65536


COMPUTADOR LENTO E INTERNET RÁPIDA
Encontre content.max.tokenizing.time mude para 3000000
Encontre content.notify.backoffcount mude para 5
Encontre content.notify.interval mude para 1000000
Encontre content.notify.ontimer mude para true
Encontre content.switch.threshold mude para 1000000
Encontre content.maxtextrun mude para 4095
Encontre nglayout.initialpaint.delay mude para 1000
Encontre network.http.max-connections mude para 48
Encontre network.http.max-connections-per-server mude para 16
Encontre network.http.max-persistent-connections-per-proxy mude para 16
Encontre network.http.max-persistent-connections-per-server mude para 8
Encontre dom.disable_window_status_change mude para true


DIAL-UP OU 3G EM PICO
Encontre content.max.tokenizing.time mude para 2250000
Encontre content.notify.interval mude para 750000
Encontre content.notify.ontimer mude para true
Encontre content.switch.threshold mude para 750000
Encontre nglayout.initialpaint.delay mude para 750
Encontre network.http.max-connections mude para 32
Encontre network.http.max-connections-per-server mude para 8
Encontre network.http.max-persistent-connections-per-proxy mude para 8
Encontre network.http.max-persistent-connections-per-server mude para 4
Encontre dom.disable_window_status_change mude para true

Após terminar as configurações, reinicie navegador e sinta a diferença!


Referência: Guia Ubuntu

3 de setembro de 2011

Cálculo Vetorial - Pascal

{
* Autor: Levi Gomes de Oliveira
* E-mail: levigomes1@hotmail.com
* Em caso de dúvidas, críticas, sugestões e/ou correções, favor encaminhar
* ao e-mail acima.
* Esse algoritmo foi escrito, compilado e testado sobre o Slackware 13.1
* 32 bits, utilizando o fpc 2.4.4.
* Ele tem por objetivo resolver problemas básicos de cálculo vetorial.
* Escrevi para me auxiliar em meus estudos na faculdade.
* A precisão dos resultados impressos em tela podem ser alteradas a gosto
* do usuário, adotei com padrão quatro casas decimais, que para minhas
* necessidades atuais são suficientes.
* Aproveitem!!!
* }

program vetor;
uses crt;
var
i: integer;
opc:char;

{ Soma de Vetores }

procedure soma;
var
va,vb,vc: array[1..3] of real;

begin
clrscr;
writeln('OS DOIS VETORES DEVEM SER DA FORMA (A1,A2,A3) E (B1,B2,B3)');
writeln('PRESSIONE UMA TECLA PARA CONTINUAR');
readkey;
clrscr;
writeln('SOMA DE VETORES');
for i:=1 to 3 do
begin
writeln;
writeln('INSIRA O COEFICIENTE A',i);
read(va[i]); {A VARIAVEL VA[I] RECEBE OS COEFICIENTES DO VETEOR A INFORMADOS PELO USUARIO}
end; {AQUI E NECESSARIO INFORMAR QUE O COEFICIENTE DE I SEMPRE E SALVO NA POSICAO 1 DO VETOR EM OPERACAO, O DE J EM 2 E O DE K EM 3}
writeln('O VETOR INFORMADO EH:');
writeln('(',va[1]:4:4,', ',va[2]:4:4,', ',va[3]:4:4,')');
for i:=1 to 3 do
begin
writeln;
writeln('INSIRA O COEFICIENTE B',i);
read(vb[i]);{ESSE VETOR RECEBE OS COEFICIENTES DO VETOR B}
end;
writeln('O VETOR INFORMADO EH:');
writeln('(',vb[1]:4:4,', ',vb[2]:4:4,', ',vb[3]:4:4,')');
for i:=1 to 3 do
begin
vc[i]:= (va[i]+vb[i]); {NESSA LINHA EFETUA-SE O PROCESSAMENTO, O VETOR VC[I] RECEBE O RESULTADO DA SOMA DOS VETORES A E B}
end;
writeln;
writeln('O VETOR SOMA EH:');
writeln('(',vc[1]:4:4,', ',vc[2]:4:4,', ',vc[3]:4:4,')');
readkey;
end;

{ Multiplicação por Escalar }

procedure multiplicacao;
var
k: real;
va: array[1..3] of real;

begin
clrscr;
writeln('O VETOR DEVE SER DA FORMA (A1,A2,A3)');
writeln('PRESSIONE UMA TECLA PARA CONTINUAR');
readkey;
clrscr;
writeln('MULTIPLICACAO DE VETOR POR ESCALAR');
for i:=1 to 3 do
begin
writeln;
writeln('INFORME O COEFICIENTE A',i);
read(va[i]); {LEITURA DOS COEFICIENTES DE A}
end;
writeln('INSIRA O ESCALAR');
read(k); {A VARIAVEL K REPRESENTA O ESCALAR}
writeln('O VETOR EH INFORMADO EH:');
writeln('(',va[1]:4:4,', ',va[2]:4:4,', ',va[3]:4:4,')');
writeln;
writeln('O ESCALAR EH:', k:4:1);
writeln;
writeln('O VETOR RESULTANTE EH:');
writeln;
writeln('(',k*va[1]:4:4,', ',k*va[2]:4:4,', ',k*va[3]:4:4,')');
readkey;
end;

{ Produto Interno }

procedure interno;
var
va, vb, prod: array[1..3] of real;
soma:real;

begin
clrscr;
writeln('OS VETORES DEVEM SER DA FORMA: (A1,A2,A3) E (B1,B2,B3)');
writeln;
writeln('PRESSIONE UMA TECLA PARA CONTINUAR');
readkey;
clrscr;
writeln('PRODUTO INTERNO');
for i:=1 to 3 do
begin
writeln;
writeln('INSIRA O COEFICIENTE A',i);
read(va[i]); {LEITURA DOS COEFICIENTES DE A}
end;
for i:=1 to 3 do
begin
writeln;
writeln('INSIRA O COEFICIENTE B',i);
read(vb[i]); {LEITURA DOS COEFICIENTES DE B}
end;
writeln;
writeln('O VETOR A EH:');
writeln('(',va[1]:4:4,', ',va[2]:4:4,', ',va[3]:4:4,')');
writeln;
writeln('O VETOR B EH:');
writeln('(',vb[1]:4:4,', ',vb[2]:4:4,', ',vb[3]:4:4,')');
for i:=1 to 3 do
begin
prod[i]:=va[i]*vb[i];
end;
soma:=0;
for i:=1 to 3 do
begin
soma:= soma + prod[i];
end;
writeln;
writeln('O PRODUTO INTERNO ENTRE OS DOIS VETORES INFORMADOS EH:', soma:4:4); {A VARIAVEL INT RECEBE O RESULTADO DA OPERACAO}
readkey;
end;

{ Produto Vetorial }

procedure vetorial;
var
va,vb,vc: array[1..3] of real;

begin
clrscr;
writeln('OS VETORES DEVEM SER DA FORMA (A1,A2,A3) E (B1,B2,B3)');
writeln;
writeln('PRESSIONE UMA TECLA PARA CONTINUAR');
readkey;
clrscr;
writeln('PRODUTO VETORIAL');
writeln;
for i:=1 to 3 do
begin
writeln;
writeln('INSIRA O COEFICIENTE A',i);
read(va[i]); {LEITURA DOS COEFICIENTES DE A}
end;
writeln;
for i:=1 to 3 do
begin
writeln;
writeln('INSIRA O COEFICIENTE B',i);
read(vb[i]); {LEITURA DOS COEFICIENTES DE B}
end;
writeln('O VETOR A EH:');
writeln('(',va[1]:4:4,', ',va[2]:4:4,', ',va[3]:4:4,')');
writeln;
writeln('O VETOR B EH:');
writeln('(',vb[1]:4:4,', ',vb[2]:4:4,', ',vb[3]:4:4,')');
vc[1]:= (va[2]*vb[3] - vb[2]*va[3]); {O VETOR C RECEBE  O VETOR RESULTANTE DA OPERACAO}
vc[2]:= (va[3]*vb[1] - vb[3]*va[1]);
vc[3]:= (va[1]*vb[2] - vb[1]*va[2]);
writeln;
writeln('O PRODUTOR VETORIAL ENTRE A E B EH:');
writeln('(',vc[1]:4:4,', ',vc[2]:4:4,', ',vc[3]:4:4,')');
readkey;
end;

{ Produto Misto }

procedure misto;
var
va,vb,vc,vx,prod: array[1..3] of real;
soma: real;

begin
clrscr;
writeln('OS VETORES DEVEM SER DA FORMA (A1,A2,A3), (B1,B2,B3), (C1,C2,C3)');
writeln;
writeln('VALE RESSALTAR QUE PRIMEIRO SE CALCULA O PRODUTO VETORIAL DEPOIS O INTERNO');
writeln;
writeln('PRESSIONE UMA TECLA PARA CONTINUAR');
readkey;
clrscr;
writeln('PRODUTO MISTO');
for i:=1 to 3 do
begin
writeln;
writeln('INSIRA O COEFICIENTE A',i);
read(va[i]); {LEITURA DOS COEFICIENTES DE A}
end;
for i:=1 to 3 do
begin
writeln;
writeln('INSIRA O COEFICIENTE B',i);
read(vb[i]); {LEITURA DOS COEFICIENTES DE B}
end;
for i:=1 to 3 do
begin
writeln;
writeln('INSIRA O COEFICIENTE C',i);
read(vc[i]); {LEITURA DOS COEFICIENTES DE C}
end;
vx[1]:= (va[2]*vb[3] - vb[2]*va[3]); {PRODUTO VETORIAL}
vx[2]:= (va[3]*vb[1] - vb[3]*va[1]); {VX[I] RECEBE O RESULTADO DO PRODUTO VETORIAL}
vx[3]:= (va[1]*vb[2] - vb[1]*va[2]);
for i:=1 to 3 do
begin
prod[i]:=vx[i]*vc[i];
end;
soma:=0;
for i:=1 to 3 do
begin
soma:= soma + prod[i];
end;
writeln('O VETOR A EH:');                                        {RESULTADO DA OPERACAO}
writeln('(',va[1]:4:4,', ',va[2]:4:4,', ',va[3]:4:4,')');
writeln('O VETOR B EH:');
writeln('(',vb[1]:4:4,', ',vb[2]:4:4,', ',vb[3]:4:4,')');
writeln('O VETOR C EH:');
writeln('(',vc[1]:4:4,', ',vc[2]:4:4,', ',vc[3]:4:4,')');
writeln;
writeln('O PRODUTO MISTO ENTRE OS VETORES A,B E C EH:', soma:4:4);
readkey;
end;

{ Módulo de um Vetor }

procedure modulo;
var
va, vb: array[1..3] of real;
soma, modulo: real;

begin
clrscr;
writeln(' MODULO DE UM VETOR ');
writeln;
writeln(' O VETOR DEVE SER DA FORMA (a1,a2,a3) ');
for i:=1 to 3 do
begin
writeln;
writeln('INSIRA O COEFICIENTE A',i);
read(va[i]); {LEITURA DOS COEFICIENTES DE A}
end;
for i:=1 to 3 do
begin
vb[i]:=va[i]*va[i];
end;
soma:=0;
for i:=1 to 3 do
begin
soma:= soma + vb[i];
end;
modulo:= sqrt(soma);
writeln(' O MODULO DO VETOR INFORMADO E ', modulo:4:4);
readkey;
end;

{ Procedimento para Sair do Programa}

procedure sair;
begin
writeln;
writeln(' FINALIZANDO APLICATIVO ... ');
writeln;
end;

{ Programa Principal }

begin
repeat
clrscr;
writeln(' PARA UTILIZAR ESSE SOFTWARE, ESCOLHA A OPCAO DESEJADA, DIGITE O NUMERO CORRESPONDENTE E TECLE ENTER ');
writeln(' [1] SOMA DE DOIS VETORES ');
writeln(' [2] MULTIPLICACAO DE VETOR POR ESCALAR ');
writeln(' [3] PRODUTO INTERNO ENTRE DOIS VETORES ');
writeln(' [4] PRODUTO VETORIAL ');
writeln(' [5] PRODUTO MISTO ');
writeln(' [6] MODULO DE UM VETOR ');
writeln(' [7] SAIR ');
writeln(' OPCAO: ');
gotoxy(9,10);
read(opc);
case opc of
    '1': soma;
    '2': multiplicacao;
    '3': interno;
    '4': vetorial;
    '5': misto;
    '6': modulo;
    '7': sair;
end;
until ((opc='1000') or (opc='7'));
end.

DOWNLOAD: Clique aqui

27 de agosto de 2011

Algoritmo - Gases Ideais

Nunca mais eu calculo essa cousa chata. A partir de hoje eu só executarei o script:


#include stdio.h
#include stdlib.h

float P, V, n, R, T;

float PressaoGas(float n, float R, float T, float V) {
  P = ((n*R*T)/V);
  return(P);

}

float MolsGas(float P, float R, float T, float V) {
  n = ((P*V)/(R*T));
  return(n);

}

float TemperaturaGas(float P, float V, float n, float R) {
  T = ((P*V)/(n*R));
  return(T);

}

float ConstanteGas(float P, float V, float n, float T) {
  R = ((P*V)/(n*T));
  return(R);

}

float VolumeGas(float P, float n, float R, float T) {
  V = ((n*R*T)/P);
  return(V);

}

main() {
  int op, rep;
  rep = 1;

  while(rep == 1) {
    printf("\n\t\t\tEQUACAO DOS GASES IDEAIS\n");
    printf("\n\tMenu:\n\t=====\n");
    printf("\t1- P\n");
    printf("\t2- V\n");
    printf("\t3- n\n");
    printf("\t4- R\n");
    printf("\t5- T\n");
    printf("\n\tOpcao.: ");
    scanf("%d", &op);
    printf("\n\t================================================================\n");

    switch(op) {
      case 1:
        printf("\n\tDigite o volume.........: ");
        scanf("%f", &V);
        printf("\tDigite o numero de mols.: ");
        scanf("%f", &n);
        printf("\tDigite a constante R....: ");
        scanf("%f", &R);
        printf("\tDigite a temperatura....: ");
        scanf("%f", &T);
        printf("\n\tA pressao = %f\n", PressaoGas(V, n, R, T));
        break;

      case 2:
        printf("\n\tDigite a pressao........: ");
        scanf("%f", &P);
        printf("\tDigite o numero de mols.: ");
        scanf("%f", &n);
        printf("\tDigite a constante R....: ");
        scanf("%f", &R);
        printf("\tDigite a temperatura....: ");
        scanf("%f", &T);
        printf("\n\tO volume = %f\n", VolumeGas(P, n, R, T));
        break;

      case 3:
        printf("\n\tDigite a pressao........: ");
        scanf("%f", &P);
        printf("\tDigite o volume.........: ");
        scanf("%f", &V);
        printf("\tDigite a constante R....: ");
        scanf("%f", &R);
        printf("\tDigite a temperatura....: ");
        scanf("%f", &T);
        printf("\n\tO numero de mols = %f\n", MolsGas(P, V, R, T));
        break;

      case 4:
        printf("\n\tDigite a pressao........: ");
        scanf("%f", &P);
        printf("\tDigite o volume.........: ");
        scanf("%f", &V);
        printf("\tDigite o numero de mols.: ");
        scanf("%f", &n);
        printf("\tDigite a temperatura....: ");
        scanf("%f", &T);
        printf("\n\tA constante R = %f\n", ConstanteGas(P, V, n, T));
        break;

      case 5:
        printf("\n\tDigite a pressao........: ");
        scanf("%f", &P);
        printf("\tDigite o volume.........: ");
        scanf("%f", &V);
        printf("\tDigite o numero de mols.: ");
        scanf("%f", &n);
        printf("\tDigite a constante R....: ");
        scanf("%f", &R);
        printf("\n\tA temperatura = %f\n", TemperaturaGas(P, V, n, R));
        break;

      default:
        printf("\n\tOpcao inexistente!\n");
        break;

    }


    printf("\n\t================================================================\n");
    printf("\n\tContinuar usando o programa?\n\n\t1-Sim      2-Nao\n\n\tOpcao.: ");
    scanf("%d", &rep);
    system("clear");

  }

  return(0);

}





DOWNLOAD: Clique aqui

24 de agosto de 2011

Procurando strings em todos os arquivos

Há várias situações nas quais você precisa saber onde uma determinada palavra ou frase aparece em diversos arquivos.

O comando grep é muito útil nessas horas. Ele serve para fazer uma espécie de varredura em todas as linhas dos arquivos e retornar apenas aquelas que contém a palavra ou frase desejada.

Suponhamos, por exemplo, que você precise achar a expressão “Módulo principal” que você sabe que está em algum arquivo que está dentro de alguma pasta que está dentro da pasta /var/www.

O comando a ser usado seria:
grep 'resolutionMódulo principal'   /etc/ -r

A sintaxe aí é seguinte: grep “palavra a ser pesquisada”   pasta/a/pesquisar  opções

A opção -r serve para tornar a busca recursiva, ou seja, o programa vai buscar em todos os arquivos que estão em todas as pastas que estão na pasta raiz, entrando em cada pasta que encontrar no processo.

Se a busca retornar resultados demais, você pode usar o próprio comando grep novamente para refinar o filtro. Assim, digamos, por exemplo, que eu saiba que na mesma linha que exista também a seguinte string: “

grep 'Módulo principalresolution'   /var/www/* -r | grep '800'

21 de agosto de 2011

Xmodmap - Desabilitando botões do mouse

Depois de muito tempo quebrando a cabeça consegui desativar o botão direito do mouse.

Execute o comando:

# xmodmap -e "pointer = 1"


Assim retornará um erro dizendo a quantidade de botões do mouse, pode ser mostrado 3, 5, 7, 9, dependendo do mouse a ser usado.

Essa é a configuração normal de um mouse de 9 botões, geralmente o mouse padrão óptico.

# xmodmap -e "pointer = 1 2 3 4 5 6 7 8 9"
 
Para desativar o botão direito trocaremos o 3 pelo 11, dessa maneira:

# xmodmap -e "pointer = 1 2 11 4 5 6 7 8 9"
 
Mudando o mouse de destro para canhoto, teremos que alterar os números 1 e 3:

# xmodmap -e "pointer = 3 2 1 4 5 6 7 8 9"

 
Assim por diante. Descubra cada número referente a função desejada e assim poderá configurá-lo da maneira que quiser.

Obs.: Caso seu mouse seja algum com funções especiais e tenha mais de 9 funções e já esteja usando o número 11, coloque no lugar do 11 um número maior que não esteja sendo usado.

8 de julho de 2011

Shell Script idiota da Faculdade

#!/bin/bash

EXEC="0"
while [ $EXEC -le "10" ]; do
    echo "Qual peso"
    read peso
    peso_t=`expr $peso_t + $peso`
        if [ $peso -gt "100" ]; then
            peso_pesado=`expr $peso_pesado + $peso`
            qtd_pesados=`expr $qtd_pesados + 1`
        fi   
    echo "Qual idade"
    read idade
    idade_t=`expr $idade_t + $idade`



EXEC=`expr $EXEC + 1`


done

echo "A idade total é $idade_t"
sleep 2s
echo "Peso total $peso_t"
sleep 2s
echo "Quantidade dos a cima do peso $qtd_pesados"
sleep 2s
echo "Peso total dos pesados $peso_pesado"

22 de junho de 2011

Sequência de Fibonaci

Segue o algoritmo da sequência de fibonaci. Está somente em português estruturado. Não está em shell.



http://www.4shared.com/document/8QX9G3xU/fib.html

15 de junho de 2011

Algoritmo de Soma

Estou ajudando um ser humano com a parte da contabilidade de sua empresa. E uma das primeiras coisas que eu fiz, foi esse algoritmo besta para eu somar alguns valores reais. Convenhamos que será bem mais rápido se compararmos com uma calculadora de mão.




#!/bin/bash

LOOPING () {
        read num
        T=`echo $T + $num | bc` # Números Reais
        #T=`expr $T + $num` # Números Inteiros
        clear
        echo $T

    EXEC=`expr $EXEC + 1`

            while [ $EXEC -ge "1" ]; do
            LOOPING
            done
}

#<========================================================================================>
N_VEZES () {
        read num

    T=`echo $T + $num | bc` # Números Reais
    #T=`expr $T + $num` # Números Inteiros
    clear
    echo $T

    EXEC=`expr $EXEC + 1`

            while [ "${EXEC}" -ne "${N}" ]; do
            N_VEZES
            done
}

#<===============================================================>
REPEAT () {
echo "Deseja executar quantas vezes?"
read N
}

#<================================================================>
INFO () {
echo "Deseja somar em looping ou vezes determinadas? (L|N)"
read LN
case $LN in
L|l) LOOPING;;
N|n) REPEAT && N_VEZES;;
esac
}

#<===================================================================>

T="0"
INFO


Quem quiser baixar o código direto é só clicar aqui

29 de maio de 2011

Escalas físicas? NUNCA MAIS!

Cansou de ficar fazendo aquela droga de conversão de Celsius para fahrenheit?

O Shell faz pra vc!



for F in `seq 0 1 15000 `
do
C_n=`expr $F - 32`
C=`echo $C_n/1.8 | bc`
echo "$F Fahrenheit corresponde a $C Celsius"
done

23 de maio de 2011

Algoritmo - Qual o maior e menor número?

#!/bin/bash

# INFO
Info () {
clear
echo "Script feito por Sabino para ver qual número é maior." && sleep 2s
echo " " && echo "Informação sobre o script: Para parar o script digite stop a qualquer momento." && sleep 3s
echo "Dê ENTER para continuar..."
read
clear
}



####### Main Function #########
#### LOOPING ####
Main () {
while [ "$resp" = "exec" ]; do


### Num 1 ###
echo "Qual é o primeiro número?"
read num1

    if [ $num1 == "stop" ]; then
    exit
    fi


### Num 2 ###
echo "Qual é o segundo número?"
read num2
    if [ $num2 == "stop" ]; then
    exit
    fi



### Comparison between Num 1 and Num 2 ###

            if [ $num1 -gt $num2 ]; then
                    maior=`echo $num1`
                    menor=`echo $num2`

            elif [ $num2 -gt $num1 ]; then
                    maior=`echo $num2`
                    menor=`echo $num1`
        else   
            exit
            fi


### Num 3 ###
echo "Digite mais um número por favor"
read num3
    if [ $num3 == "stop" ]; then
    exit
    fi
   
        if [ $num3 -gt $maior ]; then
            maior=`echo $num3`

        elif [ $num3 -lt $menor ]; then
            menor=`echo $num3`

        else
            exit

        fi

#### Show final numbers ####
clear
echo $maior
echo $menor
done
}


#### User Function ####
User () {
echo "Deseja executar ou parar o script?(exec|stop)"
read resp
case $resp in
exec) Main;;
*) exit;;
esac
}


##### Function Calling
Info
User

21 de maio de 2011

Medalhas

#!/bin/bash
clear
echo "Qual é o número de medalhas de ouro de cada país?"

    echo "Brasil"
    read mo_bra

    echo "Argentina"
    read mo_arg

    echo "EUA"
    read mo_eua



echo "Qual é o número de medalhas de prata de cada país?"
   
    echo "Brasil"
    read mp_bra

    echo "Argentina"
    read mp_arg

    echo "EUA"
    read mp_eua


echo "Qual é o número de medalhas de bronze de cada país?"


    echo "Brasil"
    read mb_bra

    echo "Argentina"
    read mb_arg

    echo "EUA"
    read mb_eua



TBRA=`echo $mo_bra*3 + $mp_bra*2 + $mb_bra | bc`
TARG=`echo $mo_arg*3 + $mp_arg*2 + $mb_arg | bc`
TEUA=`echo $mo_eua*3 + $mp_eua*2 + $mb_eua | bc`

sleep 1s && clear && echo "Calculando as mils possibilidades. Espere eu calcular ou faz você mesmo, usuário burro" && sleep 3s



if [ $TBRA -gt $TARG -a $TBRA -gt $TEUA -a $TARG -gt $TEUA ]; then
    echo "1° Brasil - 2° Argentina - 3° EUA"

    elif [ $TBRA -gt $TARG -a $TBRA -gt $TEUA -a $TEUA -gt $TARG ]; then
    echo "1° Brasil - 2° EUA - 3° Argentina"

    elif [ $TARG -gt $TBRA -a $TARG -gt $TEUA -a $TBRA -gt $TEUA ]; then
    echo "1° Argentina - 2° Brasil - 3° EUA"

    elif [ $TARG -gt $TBRA -a $TARG -gt $TEUA -a $TEUA -gt $TBRA ]; then
    echo "1° Argentina - 2° EUA - 3° Brasil"

    elif [ $TEUA -gt $TARG -a $TEUA -gt $TBRA -a $TARG -gt $TBRA ]; then
    echo "1° EUA - 2° Argentina - 3° Brasil"

    elif [ $EUA -gt $ARG -a $EUA -gt $BRA -a $BRA -gt $ARG ]; then
    echo "1° EUA - 2° Brasil - 3° Argentina"
   
    else
    echo "ERROR!!!!" && exit
fi

19 de maio de 2011

Check Disk

#!/bin/bash

DISK=$(df -h | head -n2 | tail -n1 | awk {'print $5'} | rev | cut -d% -f2- | rev)
DISK2=$(df -h | head -n2 | tail -n1 | awk  {'print $5'} | cut -c1,2)

if [ $DISK -ge 90 ]; then
echo "Seu disco encheu"
else
echo "Fica sussa"
fi

9 de dezembro de 2010

Novo Gerenciador de Download

Comprei um livro especializado em Shell script e estou aderindo a novas políticas. Meu último script foi um gerenciador de downloads. Depois que comecei a estudar pelo livro, verifiquei  que meu último script era falho. Nem sempre funcionava como deveria. Então o refiz. Não mudou... muita coisa. Mas, algumas coisas mudaram.




#!/bin/bash
#<-------------------------------------------------------------------------------------------------------------->
# Verify Root id
clear
if [ "$(id -u)" != "0" ]; then
        echo "You must execute this script as root user! " && exit
fi

# Environment Variables
        echo "Tell me the path file? Ex: /root/firefox.tar.bz2"
        read FILE
        FILESIZE_partial=$(/usr/bin/du -h $FILE | /usr/bin/cut -f1)
        PID_FIREFOX=$(/bin/pidof firefox-bin)
        clear


#<------------------------------------------------------------------------------------------------------------->
# Verify size file
echo "What is size file that you are downloading? Ex: 161.7M"
read FILESIZE_total
clear

# Comparison with if and case + Kill firefox process + Shutdown
if [ "$FILESIZE_partial" != "$FILESIZE_total" ]; then
        echo "The chosen file is being downloaded yet. So do not do anything."
else
        echo "Download was finished successfull. Wait, I going to kill the firefox..."
        sleep 2s
        kill -9 $PID_FIREFOX
        clear
        echo "Would you like turn off your machine? (Y/N)"
                read turnoff
                case $turnoff in
                        Y|y) /sbin/shutdown -h now;;
                        *)   echo "OK." && exit;;
                esac

fi



Bom, é isso pessoal! Qualquer dúvida... só gritar... lssabino@hotmail.com



OBS: Irei tirar umas "férias". Por isso, não irei escreverei aos meus leitores por uns 40 dias. Só volto a escrever lá pro final de janeiro. Obrigado pessoal! FUI!

7 de dezembro de 2010

Shell Script: $? e outros ensinamentos

Cada comando executado em shell tem um codigo de retorno, útil em script para conferir se falhou ou foi executado com sucesso, este resultado fica armazenado na variavel $?, ele muda a cada comando, tanto faz se foi na linha de comando ou dentro do script, atualizado a cada comando, echo $? exibe o resultado do ultimo comando, retornando:

 
   0 (zero) significa que o comando anterior foi executado com sucesso.
   1 (um) e qualquer valor diferente de zero ( != 0) indica que ocorreu algum erro.
   2  erro nos comandos do script, geralmete erro de sintaxe, digitação,
   127 = command not found, quando digita comando não existente.


cat /tmp/testar
  #!/bin/bash
  mkdir /tmp/teste
  if [ $? -eq 0 ];then
    echo $?
    echo "comando executado com sucesso!"
    else
    echo $?
    echo "falha na execução do comando."
    exit
  fi


<-------------------------------------------------------------------------------------------------->
Test
 
Agora, vamos falar de alguns parâmetros legais do comando test - muito utilizado em shell script.

test ­-r  Testa se tem permissão de leitura
test ­-w Testa se tem permissão de escrita
test ­-x Testa se tem permissão de execução
test ­-f  Testa se é um arquivo regular
test ­-d Testa se é um diretório
test ­-u Testa se seu SUID está ativado
test ­-g Testa se seu SGID está ativado
test ­-s Testa se seu tamanho é maior que zero


#!/bin/bash
  MEUMAC=`/sbin/ifconfig eth0 | grep HWaddr | awk '{print $5}'`
  if [ $MEUMAC = "00:08:54:2C:DD:FD" ]; then
    echo "estou na maquina que deve rodar o script"
    #seus comandos aqui
    else
    echo "MAC não confere, maquina diferente, altere o MAC no script"
  fi

# OU

  meumac=`ifconfig | grep "00:08:54:2C:DD:FD"`
  if [ -n "$meumac" ]; then
    echo "estou na maquina que deve rodar o script"
    #seus comandos aqui
  fi

Isso serve pra vc fazer alguma coisa amarrando ao mac address.

Vivo 3G no Ubuntu Karmic com o Huawei E1756

Saiba como fazer o 3G da vivo Huawei E1756 funcionar no Ubuntu 9.10 (karmic coala).

O grande problema é que o Karmic não reconhece o Huawei E1756 como modem 3G. Então temos que falar pro Ubuntu pra ele fazer isso. Como? nsswitch e udev.


Baixei como fazer: http://www.4shared.com/document/2C0Rj6WB/vivozap_karmic.html

Gerenciador de Download em Shell Script

Ontem antes de dormir estava baixando máquinas virtuais ubuntu e fedora pra ver o que eles mudaram nas suas versões mais recentes. Meu link doméstico não é gigantesco. Somente 1MB. Então tenho um down de 120 KB/s. O download completo dava uns 3,1 GB. Umas 5 horas de down. Comecei o download 0:30h. Eu às 2h da madruga tava ficando com sono. E o medo de dar alguma merda no download e eu não ter como reverter.  era grande. Então, fiz um gerenciador de downloads simples e no meu caso eficiente.
Segue abaixo:


#!/bin/bash
<------------------------------------------------------------------------------------------------------------------->
# Verify Root id
sleep 2s
if [ "$(id -u)" != "0" ]; then
    echo
    clear && echo "You must execute this script as root user! " && exit
    else
    clear && echo "You are root. For that reason, I going to continue executing this one"
fi

# Environment Variables
    rest=sleep 2s
    clear && echo "Which is the file format?"
    read EXTENSAO
    $rest && clear

    FILE=`ls | grep *.$EXTENSAO`
    FILESIZE_parcial=`/usr/bin/du -m $FILE | /usr/bin/cut -f1`
    PID_FIREFOX=`ps aux | grep firefox-bin | awk {'print $2'} | tail -n2 | head -n1`
    #PIDOF_FIREFOX=`/bin/pidof firefox-bin`


<-------------------------------------------------------------------------------------------------------------------->
# Locate the file
echo "Where is the file?"
read directory
$rest && clear

# Verify size file
echo "What is size file that you are downloading?"
read FILESIZE_total
$rest && echo "Locating the file." && $rest

# Go to directory of file
cd $directory

# Comparison with if and case + Kill firefox process + Shutdown
if [ $FILESIZE_parcial != $FILESIZE_total ]; then
    echo "The chosen file is being downloaded yet. So do not do anything"
    else
    sleep 2s && clear && echo "Download was finished successfull"
    /bin/kill -9 $PID_FIREFOX
    echo "Killing Firefox process." && sleep 2s && echo "Firefox process is dead" && clear && sleep 2s && echo "Would you like to turn off the machine now?"
    read answer
        case $answer in

        Y|y) clear && echo "Turn off activated. If you do not want it, stop this script now. You have 20 seconds for do it." && sleep 20s && /sbin/shutdown -h +5
;;

        *) sleep 2s && clear && echo "OK. If you do not want turn off the machine, fine. Thank you. See you later";;
        esac
fi




Quem quiser pode baixar o script em arquivo no endereço: http://www.4shared.com/file/xUnaebMk/kill.html

24 de novembro de 2010

Verificação de ID - Root

Bom dia galerê! Tudo bem?

Vou postar uma coisa hoje idiota, mas que pode ajudar ou esclarecer coisinhas pra muita gente. Me digam uma coisa, vcs já executaram um shell script e ele diz assim: "Você não é root, não pode executar este comando". Ou algo assim. Vocês já pensaram como ele consegue descobrir essa informação?

É o seguinte. Todo usuário tem um id, e o root não é diferente. Então, o script corre atrás desse id e verifica o valor dele. Se não for o valor de id padrão de root, então não é root, então exit.

Entenderam? Como conseguir esse id? Se várias formas: com o comando id, vendo no /etc/passwd, no /proc tbm tem essa informação. Enfim, mils maneiras. Trocando 3 páragrafos por 5 linhas em script:



#!/bin/bash
if [ "$(id -u)" != "0" ]; then
echo
echo "Voce deve executar este script como root! "
else
echo "Voce é root!"
fi