Gostaria de ajudar?

sexta-feira, 29 de junho de 2012

Programa Shell/Fortran que cria .ctl

Uma vez me deparei com o seguinte problema: Eu tinha um arquivo binário para cada dia/mes/ano/nivel de dados, ou seja, 365/366 arquivos por ano multiplicado pela quantidade de níveis. No meu caso 3068 arquivos, sendo que este arquivos não possuiam arquivos descritores do GrADS os chamados CTL. Para resolver tal problema eu criei um script Shel que cria e compila um arquivo fortran que escreve os arquivos.ctl.

Existe formas de você fazer um programa em linguagem Shell ou Fortran somente com a mesma funcionalidade, escrever os arquivos .ctl, mas decidi colocar os dois juntos pois servirá para outras funções. Segue o exemplo:

#!/bin/sh

for var in uwnd vwnd;do
      for level in 200 500 700 850;do
            for ano in $(seq 1989 2009);do
                  for mes in $(seq -f %02g 1 12);do
                        ultimo_dia=`echo $(cal $mes $ano) | awk '{print $NF}'`;
                        mess=`echo $(cal $mes $ano) | cut -c1-03`
                        for dia in $(seq -f %02g 1 $ultimo_dia);do

cat << EOF > gera_ctl.f90


!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!!! Este script gera os ctl para os arquivos .bin                                             
!!! Desenvolvedor: Cristiano Prestrelo email: prestrelo@model.iag.usp.br  
!!! Data: 27/06/2012                                                                                       
!!! Alterado: 27/06/2012                                                                                 
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

PROGRAM geractl

OPEN (1, FILE='/home/prestrelo/data/merra/$var/$var.$level.$ano$mes$dia.ctl', &STATUS='UNKNOWN')

 WRITE(1,*)'DSET ^$var.$level.$ano$mes$dia.bin'
 WRITE(1,*)'TITLE Vento Zonal $var $level hPa Horario Sinotico Merra'
 WRITE(1,*)'UNDEF -999.'
 WRITE(1,*)'XDEF 540 linear -180 0.5'
 WRITE(1,*)'YDEF 361 linear -90 0.5'
 WRITE(1,*)'ZDEF 1 LINEAR 1 10000'
 WRITE(1,*)'TDEF 4 linear 00Z$dia$mess$ano 360mn'
 WRITE(1,*)'VARS 1'
 WRITE(1,*)'p  1  t,z,y,x  Eastward wind component'
 WRITE(1,*)'ENDVARS'

 CLOSE(1)
END PROGRAM geractl

EOF

ifort -o gera_ctl gera_ctl.f90
./gera_ctl

done
done
done
done
done
exit
#!!!!!!!!!!!!!! fim do programa!!!!!!!!!!!!!!!!!!!!!!!!

Desta forma você terá uma lista de arquivos ctl:

uwnd.200.19890101.ctl
uwnd.200.19890102.ctl
                 .
                 .
                 .
uwnd.850.20091231.ctl
vwnd.200.19890101.ctl
vwnd.200.19890102.ctl
                 .
                 .

                 .

 vwnd.850.20091231.ctl

Lembrando que você precisa mudas as dimensões (lat X lon X tempo X delta) de seus arquivos de dados. 

Boa Sorte e Bom Trabalho a Todos!!

quinta-feira, 28 de junho de 2012

Entendendo o comando cal

No penultimo post nós vimos que podemos retirar informações de data através do comando cal que representa o calendário do Linux. Com o comando cal você pode visualisar (impresso na tela/terminal) o calendário completo de um determinado mês de um determinado ano, sendo o mês representado por (01 a 12) e o ano no formato com 4 algarismos. Aproveite para neste momento ir no seu terminal e digitar cal, você verá algo como:

     Junho 2012      
Do Se Te Qu Qu Se Sá 
                             1  2 
   3   4   5   6   7   8   9 
 10 11 12 13 14 15 16 
 17 18 19 20 21 22 23 
 24 25 26 27 28 29 30

O comando man cal dar acesso ao manual do cal. Segue alguns exemplos de uso do comando cal.

>echo $(cal 06 2012)
você terá como resposta:
Junho 2012 Do Se Te Qu Qu Se Sá 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30


Observe que o comando acima é diferente do comando abaixo:

>cal 06 2012
você terá como resposta:

     Junho 2012      
Do Se Te Qu Qu Se Sá 
                              1  2 
   3   4   5   6   7   8   9 
 10 11 12 13 14 15 16 
 17 18 19 20 21 22 23 
 24 25 26 27 28 29 30

No entanto, o primeiro comando é mais utilisado pois possibilita concatenar com outros comando como cut, awk e etc. E um exemplo do concatenação do comando cal com awk nós vimos no penultimo post.

Um exemplo do uso do comando cal com o comando cut:

>echo $(cal 06 2012) | cut -c1-03
Desta forma você terá como resposta:

Jun

ou seja, cal 06 2012 exibe uma sequência de caracter e eu quero exibir somente o caracter de 1 a 3, isso significa as três primeiras letras do mês em questão (Junho).

Este comando é bastante útil e possibilita retirar diversas informações do sistema, segue mais um exemplo para saber o último dia de cada mês de um determinado ano:

>for mes in $(seq -w 1 12); do echo -n "Ultimo dia do mes $mes/2011 = "; echo $(cal $mes 2011) | awk '{print $NF}'; done
A resposta para este comando é:

Ultimo dia do mes 01/2011 = 31
Ultimo dia do mes 02/2011 = 28
Ultimo dia do mes 03/2011 = 31
Ultimo dia do mes 04/2011 = 30
Ultimo dia do mes 05/2011 = 31
Ultimo dia do mes 06/2011 = 30
Ultimo dia do mes 07/2011 = 31
Ultimo dia do mes 08/2011 = 31
Ultimo dia do mes 09/2011 = 30
Ultimo dia do mes 10/2011 = 31
Ultimo dia do mes 11/2011 = 30
Ultimo dia do mes 12/2011 = 31

Bom pessoal é isso.

Boa Sorte e Bom Trabalho a Todos.




segunda-feira, 25 de junho de 2012

Google Wind Map

Dois funcionarios/artistas do google desenvolveram uma mapa de velocidade de ventos em tempo real chamado de "Wind Map". No mapa é possível observar o comportamento dos ventos, sua velocidade e como percorrem o território dos Estados Unidos. Um mapa com fundo escuro com linhas brancas (que mais parecem cabelo) de velocidade do vento (1 - 30km/h) quanto maior a velocidade mais densa as linhas brancas. No site do projeto ao clicar sobre a imagem você consegue dar zoom na imagem assim como no google maps. Os dados que geram o mapa é obtido através do National Digital Forecast Database com uma taxa de atualização de uma hora. O interessante é que a NASA já tinha lançado algo do gênero sendo que voltado as correntes oceânicas e com dados dos últimos dois anos (NASA_1, NASA_2) a animação observada no link NASA_2 é simplesmente fantastica. A idéia do mapa de ventos era atingir todo o globo, assim como tudo relacionado ao google, no entanto, dificuldades relacionados a liberação dos dados é que dificultam a abrangencia do projeto, já que a maioria dos dados de ventos estão de posse dos governos.


Boa Sorte e Bom Trabalho a Todos!!

quinta-feira, 14 de junho de 2012

Boas Vindas!!

Olá Pessoal, como vocês estão? tudo bem?

Bom, já à algum tempo eu estou querendo mudar um pouco a "cara" do meu site/blog para que a navegação fique mais fácil e o visual mais convidativo, me falta tempo para investir mais em algo assim, mas aos poucos irei tentar melhorar. Esta nova página esta em fase de teste caso venha a dar certo irei criar um link na página anterior que ligue a esta, desta forma quem pesquisar pela página antiga conseguirá chegar até esta.

Este tópico irá ficar no topo da minha "Home" até tudo ficar pronto, para que vocês entendam o que esta se passando. Algumas mudanças já podem ser observadas como por exemplo uma lista de contatos (twitter, facebook, linkedin, g+ e etc) na parte superior direita para que vocês possam entrar em contato comigo, seguir, enviar perguntas e etc, mas se possível comente aqui mesmo no site/blog. A estrutura mudou um pouco, no site anterior os post estavam divididos em menus, agora os post teram uma estrutura de "time line", posts mais antigos irão para o final da página, no entanto uma lista no canto direito será gerado a partir de marcadores que irão separar os posts por "grupos", tais como, Apostilas, Linux, Programas, Instalação, Bibliotecas e etc facilitando encontrar o que deseja, esta estrutura já é bem conhecida de todos. Uma caixa de busca no canto superior/direito também ajudará na busca do que vocês desejam/procuram.

Por enquanto é isso em breve trarei novidades.

Abraço e Bom Trabalho a Todos!!

Cristiano Prestrelo

Desvendando o comando chmod, chgrp, chown e etc

Todo usuário Linux experiente ou iniciante alguma vez na vida se perguntou como funciona o gerenciamento de permissões do sistema Linux? Como devemos usar comandos como o chmod, chgrp, chown e etc? Como atribuir permissão root para determinados diretórios ou arquivos? Ou o inverso, como atribuir permissão de usuário comum a arquivos/diretorios root?

O que significa cada letrinha que acompanha o nome do arquivos quando executamos um ls -la da vida?

>ls -la

-rw-rw-r--  1 grupo usuario   253 2012-06-14 00:47 script.f90

Para responder todas essas perguntas eu aconselho vocês darem uma lida em um artigo desenvolvido pelo Armando Martins de Souza na comunidade VivaoLinux.com.br, o artigo é extremamente didático e explicador.

Segue os Links:



Bom espero que vocês aproveitem.

Boa Sorte e Bom Trabalho a Todos

sexta-feira, 8 de junho de 2012

Shell Script loop na data Dia/Mes/Ano

Estes dias eu estava querendo fazer o "loop" em um script shell que possibilitasse variar o mês e o dia com doi algarismos, ou seja, 01, 02, 03, 04 sempre que eu tentava o loop variava 1, 2, 3, 4 e etc. Deve exister algumas outras formas de fazer isto, mas essa foi a que conseguir fazer, espero que ajude.

OBS: Meu amigo Alex Pessoa, fez uma sugestão para melhorar este script, segue!!

#/bin/sh

for ano in $(seq 2000 2004);do
      for mes in $(seq -f %02g 1 12);do
            ultimo_dia=`echo $(cal $mes $ano) | awk '{print $NF}'`; #-> linha nova
            for dia in $(seq -f %02g 1 $ultimo_dia);do #-> modificado
#         for dia in $(seq -f %02g 1 31);do #desta forma todos os meses vão até 31
                  echo "$ano$mes$dia"
            done
      done
done


o resultado deste script é:

20000101
20000102
   .      .   .
   .      .   . 
   .      .   .  
20041231

è isso ae.

Boa Sorte e Bom Trabalho a Todos!!

quinta-feira, 7 de junho de 2012

Utilizando o Cron (Crontab)

O "cron" é um software do sistema Unix (linux) que é responsável por efetuar tarefas agendadas pelo usuário, este sistema vem instalado em todas as distribuições Linux e é ativado logo no boot do sistema. Sua utilização é apropriada para quem deseja que alguma atividade/tarefa seja executada automaticamente pelo sistema no minuto/hora/dia/dia da semana/mês desejado pelo usuário. Você poderá por exemplo agendar a limpeza dos arquivos temporários para toda segunda feira, por exemplo, o o "cron" faz uma verificação a cada minuto para identificar alguma tarefa agendada e desta forma ele executa tal tarefa sempre no período determinado.

Para usar o "cron" você pode usar editores como vi, vim ou simplesmente digitar no terminal crontab -e e editar como se estivesse no vi, por exemplo. O crontab tem a seguinte estrutura de execução:

MM HH DD mm SS US tarefa
  |      |    |      |     |    |      |
  |      |    |      |     |    |      |___tarefa
  |      |    |      |     |    |______usuário
  |      |    |      |     |_________dia da semana
  |      |    |      |____________mês
  |      |    |_______________dia do mês
  |      |__________________hora
  |______________________minuto

A sintaxe é a seguinte:

MM: digite aqui minuto (0-59);
HH: digite aqui hora (0-23);
DD: digite aqui dia do mês (0-31);
mm: digite aqui mês (1-12);
SS: digite aqui dia da semana (0-7) vê Obs 1;
US: digite aqui o usuário responsável pela execução (não coloque nada caso o executor seja o usuário que esta criando a lista no crontab);
tarefa: digite aqui a tarefa a ser executada (script).

Obs 1: Em dia_da_Semana, 0 refere-se a domingo; e 6, ao sábado.
       No caso de dia da semana funciona também as três primeiras letras
       (em inglês) do dia da semana (SUN,MON,TUE,WED,THU,FRI,SAT)
Obs 2: Em qualquer posição pode-se usar o * (asterisco) quando não se
       importar com o campo em questão.
Obs 3: Pode-se utilizar intervalos nesses campos. O caracter para intervalo
       é o - (hifen).
Obs 4: Pode-se utilizar lista de valores nesses campos. O caracter para a
       lista é a , (vírgula).
Obs 5: Qualquer texto colocado após o programa que será executado será
       considerado comentário e não será interpretado pelo cron


Três comandos importantes de edição do crontab vocês precisam saber:

crontab -e usado para editar;
crontab -l usado para listar tarefas agendadas;
crontab -r usado para remover o arquivo ou lista existente no crontab.

Segue alguns exemplos de estrutura do crontab:

0       12      *       *       * /home/usuario/tarefa.sh

O exemplo acima significa que em qualquer mês, dia da semana, dia do mês sempre as 4 horas em ponto o programa tarefa.sh será executado.

Quando você quer que a tarefa seja executada sempre, por exemplo, todos os dias, você digita "*" no local reservado para que dia do mÊs e desta forma todos os dias do mês a tarefa será executada. Isto serve para todas as outras  condições.

Exemplo:

*          *          *          *           * /home/usuario/tarefa.sh

O exemplo acima significa que em qaulquer dia do mês ou da semana, qualquer mês, qualquer hora e minuto o programa tarefa.sh será executado, ou seja, a cada minuto que se passa o programa será executado.

Exemplo:

0       12      *       *       * /home/usuario/tarefa1.sh
0        4      15      *       * /home/usuario/tarefa2.sh 

Observe que no exemplo acima existem duas tarefas agendadas e é desta forma que tem que ser feito uma tarefa logo abaixo da outra, sendo que cada uma com sua configuração temporal especifica, obviamente que as duas tarefas poderiam ser executadas no mesmo momento.

Boa Sorte e Bom Trabalho a Todos!!

quarta-feira, 6 de junho de 2012

Compactando/Descompactando arquivos

Sempre fica a dúvida de qual comando usar para compactar e descompactar arquivos, para usuários Linux o que não falta são extensões de arquivos compactados, .zip, .rar, .tar.gz, .bz2, .tar.bz2 entre outros. Segue uma pequena lista de como compactar e descompactar seus arquivos ou diretorios:

Compactando e Descompactando arquivos .tar:

Este tipo de compactação merece um pequeno resumo sobre sua estrutura.

tar -(parâmetro) arquivo.extensão nome-do-arquivos(s)-a-serem-compactados

Estes parâmetros não usados aleatoriamente eles tem um significado:

-c - cria um novo arquivo tar;
-t - exibe o conteúdo de um arquivo tar;
-p - mantém as permissões originais do(s) arquivo(s);
-r - adiciona arquivos a um arquivo tar existente;
-f - permite especificar o arquivo tar a ser utilizado;
-v - exibe detalhes da operação;
-w - pede confirmação antes de cada ação no comando;
-x - extrai arquivos de um arquivo tar existente;
-z - comprime o arquivo tar resultante com o gzip (visto mais à frente);
-C - especifica o diretório dos arquivos a serem armazenados (note que, neste caso, a letra é maiúscula).



Com este mesmo compactador (tar) é possivél compactar como .tar, .tar.gz, .tar.bz2, para isso sua-se:

Compactando .tar

>tar -cvf arquivo.tar arquivo_1 arquivo_2 arquivo_n ou diretorio

Compactando .tar.gz

>tar -zcvf arquivo.tar.gz arquivo_1 arquivo_2 arquivo_n ou diretorio

Compactando .tar.bz2

>tar  -jcvf arquivo.tar.bz2 arquivo_1 arquivo_2 arquivo_n ou diretorio

Compactando .zip

>zip -r arquivo.zip arquivo_1 arquivo_2 arquivo_n ou diretorio 

Compactando .rar

>rar arquivo.rar arquivo_1 arquivo_2 arquivo_n ou diretorio



Descompactando .tar:

>tar -xvf arquivo.tar (pode inserir o diretorio onde quer descompactar)

Descompactando .tar.gz:

>tar -zxvf arquivo.tar.gz (pode inserir o diretorio onde quer descompactar)

Descompactando .tar.bz2:

>tar -jxvf arquivo.tar.bz2 (pode inserir o diretorio onde quer descompactar)

Descompactando .zip

>gunzip arquivo.zip (pode inserir o diretorio onde quer descompactar)

Descompactando .rar

>unrar arquivo.rar



Site indicado compactando e descompactando.

Boa Sorte e Bom Trabalho a Todos.

terça-feira, 5 de junho de 2012

Comando "date" Linux

Durante o desenvolvimento de alguns programas eu precisei criar uma data formatada, as vezes para baixar dados, gerar título de figuras ou nome de imagens e etc você precisa de uma data formatada para inserir no teu programa/script e etc. Difícil de entender? Eu explico. Imagina que você criou um script .sh que executa um script GrADS para gerar algumas imagens de precpitação por exemplo e você quer que cada imagem seja salva com a seguinte estrutura (prec_anomesdia.gif) sendo que neste caso especifico o parâmetro dia vamos dizer assim seja variável, uma forma de conseguir esta data é utilizando o comando "date" do linux.

Com o comando "date" é possível Exibir e Alterar a data/hora do Sistema, Exibir a data/hora Formatada e Efetuar cálculos com Data e Hora.

A utilização deste comando é fácil basta utilizar alguns parâmetros disponiveis:

%%   um % literal
%a    nome abreviado do dia da semana do idioma (ex.: Dom)
%A    nome completo do dia de semana na localidade (por exemplo, Sábado)
%b
    nome abreviado do mês na localidade (por exemplo, Jan)
%B    nome completo do mês na localidade (por exemplo, Janeiro)
%c    data e hora na localidade (por exemplo, Sáb 08 Mar 2008 18:34:17 BRT)
%C   século; como %Y, exceto a omissão dos dois últimos dígitos (ex.: 20)
%d   dia do mês (ex.: 01)
%D   data; o mesmo que %m/%d/%y
%e   dia do mês, preenchido por espaço; o mesmo que %_d
%F   data completa; o mesmo que %Y-%m-%d
%g   os últimos dois dígitos do ano do número ISO da semana (veja %G)
%G   ano do número ISO da semana ISO (veja %V); normalmente útil só com %V
%h   o mesmo que %b
%H   hora (00..23)
%I    hora (01..12)
%j    dia do ano (001..366)
%k   hora ( 0..23)
%l    hora ( 1..12)
%m   mês (01..12)
%M   minuto (00..59)
%n    um caractere de nova-linha
%N   nanosegundos (000000000..999999999)
%p   o equivalente na localidade para AM ou PM; em branco se desconhecido
%P   como %p, mas em minúsculas
%r    a hora no relógio de 12 horas na localidade (por exemplo, 11:11:04 PM)
%R   hora e minuto no estilo 24 horas; o mesmo que %H:%M
%s    segundos desde 1970-01-01 00:00:00 UTC
%S   segundo (00..60)
%t    uma tabulação
%T   as horas; o mesmo que %H:%M:%S
%u   dia da semana (1..7); 1 é segunda-feira
%U   número da semana no ano, sendo domingo o início da semana (00..53)
%V   número ISO da semana, sendo segunda-feira o início da semana (01..53)
%w   dia da semana (0..6); 0 é domingo
%W   número da semana no ano, sendo segunda-feira o início da semana (00..53)
%x    representação da data na localidade (por exemplo, 31/12/99)
%X    representação da hora na localidade (por exemplo, 23:13:48)
%y    os últimos dois dígitos do ano (00..99)
%Y    ano quatro digitos (por exemplo 2012)
%z    fuso horário numérico +hhmm (por exemplo, -0300)
%:z   fuso horário numérico +hh:mm (por exemplo, -03:00)
%::z  fuso horário numérico +hh:mm:ss (por exemplo, -03:00:00)
%:::z  fuso horário numérico com : para a precisão necessária (por exemplo, -04, +05:30)
%Z   abreviação alfabética do fuso horário (por exemplo, BRT)

Se você for agora (05/06/2012 16:42) e digitar date em seu terminal o sistema te retornará:

>date
>Ter Jun  5 16:42:49 BRT 2012

Existem algumas formas de você combinar os parâmetros listados acima e ter como resultado uma data na estrutura/ordem que você deseja, segue alguns exemplos:

>date +%d%m%Y
>05062012

Caso você queira separar com uma"/" cada informação é só inserir uma barra antes de cada simbolo de "%":

>date +%d/%m/%Y
>05/06/2012 

Para o ano apenas com dois dígitos:

>date +%d/%m/%y
>05/06/12 

É possível manipular apenas a horas: (observe que precisamos inserir ":" para separar horas, minutos e segundos)

>date +%H:%M:%S
>16:42:49

Se você desejar inserir o nome do mês e não o número também é possível: (observe que este comando é preciso esta entre aspas "" e existe um espaço entre um parâmetro e outro caso contrario a informação virá junta).

>date "+%d %B %Y"
>05 Junho 2012

Uma outra informação referente a estrutura anterior é que você pode inserir o "de" em sua data, para isso digite:

>date "+%d "de" %B "de" %Y"
>05 de junho de 2012

Caso precise inserir o dia da semana o comando seria o seguinte:

>date "+%d "de" %B "de" %Y, %A"
>05 de junho de 2012, terça

Este comando é sensacional, se soubermos utilizá-lo bem tiramos bastante proveito dele, para quem trabalha operacionalmente ou quem costuma baixar dados diariamente, fazer imagens/figuras diariamente ou executar um determinado script operacionalmente vai fazer bom proveito dele.

Com o comando date também é possível conseguir datas anteriores ou posteriores. Exemplos:

Em meu script eu preciso de uma data de cinco dias atrás e cinco dias para frente, para isso:

>date +%d/%m/%Y -d "5 days ago"
>31/05/2012

>date +%d/%m/%Y -d "5 days"
>10/06/2012

Também é possivel por exemplo saber a data um mês e dois dias atrás, uma semana e um dia, ou que dia nós teremos caso adicionarssemos 49 horas a nossa data atual?

Um mês e dois dias atrás:

>date -d "1 month ago 2 day ago"
>Qui Mai  3 16:42:49 BRT 2012

Um mês e dois dias a frente:

>date -d "1 month 2 day"
>Sab Jul  7 16:42:49 BRT 2012

Uma semana e um dia atrás:

>date -d "1 week ago 1 day ago"
> Seg Mai 28 16:42:49 BRT 2012

Que dia teremos se adicionarmos 49 horas na data atual?

>date --date "49 hours"
>Qui Jun 7 17:42:49 BRT 2012

Existe uma serie de combinações possíveis, segue alguns exemplos:

Se usarmos o comando:
>date
ou
>date --date=now
ou
>date --date=today
o resultado é o mesmo

>date --date='10 minutes'
>Ter Jun 5 16:52:49 BRT 2012


>date --date='10 seconds ago'
>Ter Jun 5 16:42:39 BRT 2012

>date --date='10 hours'
>Ter Jun 5 02:42:39 BRT 2012

>date --date='tomorrow'
>Qua Jun 6 16:42:49 BRT 2012

>date --date='10 day'
>Sex Jun 15 16:42:49 BRT 2012

>date --date='yesterday'
>Seg Jun 4 16:42:49 BRT 2012

>date --date='1 fortnight'
>Ter Jun 19 16:42:49 BRT 2012

>date --date='1 year'
>Ter Jun 5 16:42:49 BRT 2013

Bom galera é isso, depois eu irei inserir aqui um script que manipula essas datas. Tem um post em um forum de altoria do Rafael Brianezi da Silva no qual eu tomei base para escrever este, segue.

Boa Sorte e Bom Trabalho a Todos!!