Blog que trata sobre novas tendências em meteorologia, bem como uma visão humorada do cotidiano carioca.
Previsão do Tempo no orkut
- Widgets de Previsão do Tempo para Blogs e Sites
- Gadgets de Previsão do Tempo para iGoogle
- Complemento de Firefox para Previsão do Tempo
- Opensocial e Previsão do Tempo
Finalmente começam a aparecer os primeiros aplicativos sociais de meteorologia no orkut.
Na realidade até agora só foi a público um aplicativo: o Tempo Amigo, da Tempo Agora (Somar).
A idéia do aplicativo é muito boa. Na descrição do aplicativo: "Localize seus amigos pelo mapa, veja onde eles moram, e tambem confira a previsão do tempo para a sua cidade, e para as cidades dos seus amigos com as informações do TempoAgora."
O aplicativo é essencialmente um mapa com a sua foto de orkut e a de seus amigos num mapa e na lateral uma previsão simples para o próprio dia e para o dia seguinte.
A minha opinião faltou um pouco mais de cuidado ao desenvolver esse aplicativo, por vários detalhes.
Primeiro que ao iniciar o aplicativo a foto de orkut sempre aparece num lugar diferente. Nas duas imagens (aqui em cima e aqui embaixo) a minha foto apareceu primeiro na favela do Borel e depois boiando na Baia de Guanabara! Ué? Não poderiam pegar o CEP do perfil de orkut e colocar a minha foto na minha rua? Ou mesmo usar o esquema do aplicativo Vizinhança, que pergunta para você seu endereço e tem até balões com informações e Google Earth embutido.
Segundo que o aplicativo explora muito pouco a interatividade do orkut e também a interface do mapa do google maps. Têm infinitas possibilidades de coisas para fazer e a unica coisa que fazem é um mapa e uma previsao estática fora do mapa?
Entenderia algo assim no Orkut Sandbox, em fase de testes, mas para algo lançado oficialmente e até com hotsite no Tempo Agora, achei muito pobre.
Bem, já é pelo menos um começo. É esperar para ver se vão lançar aplicativos melhores no futuro!
Veja Também:
- Widgets de Previsão do Tempo para Blogs e Sites
- Gadgets de Previsão do Tempo para iGoogle
- Complemento de Firefox para Previsão do Tempo
- Opensocial e Previsão do Tempo
Exemplo de consultas para MySQL
PARA VER MAIS DICAS, ASSUNTOS E COMANDOS
BUSQUE NA BARRA ACIMA, À ESQUERDA
Eu coloquei abaixo alguns exemplos de consultas para bancos de dados MySQL em meteorologia...
CONSULTAS SIMPLES DA TABELA WRF
select * from WRF;
select Tempo_Início, Tempo_Previsão, Localidade, T2M from WRF;
select T2M from WRF where Localidade="Palmas" and
Tempo_Previsão="1993-05-02 03:00:00";
select T2M from WRF where (Localidade="Palmas" or
Localidade="Abreulandia") and
Tempo_Previsão<"1993-05-02 03:00:00";
USANDO GROUP
select Localidade,max(PREC_CONV)-min(PREC_CONV) from WRF
where Tempo_Inicio="2007-03-20 00:00:00" and
(Tempo_Previsao>="2007-03-21 09:00:00" and
Tempo_Previsao<="2007-03-22 15:00:00") and
(Localidade="Itaperuna" or
Localidade="Rio de Janeiro") group by Localidade;
CONTAGEM
select count(*) from WRF
where Tempo_Início="2007-03-13 00:00:00" and
Localidade="Paraty";
UPDATE
update WRF set PREC_CONV=PREC_CONV*10;
DELETE
delete from WRF
where Localidade!="Rio de Janeiro" and
Localidade!="Palmas";
MULTIPLAS TABELAS
select Localidade from WRF9km,Localidade
where Tempo_Inicio='2007-05-14 00:00:00' and
Tempo_Inicio=Tempo_Previsao and
Localidade=Localidade.Nome limit 20;
PREC DIARIA USANDO CALCULO DE DATAS E GROUP BY
Pega so as 24h apesar de consultar tudo, 24 em 24h
select * from
(select Tempo_Inicio as t0,
(1+floor((Tempo_Previsao-Tempo_Inicio-30000)/1000000))*24 as dia,
max(Tempo_Previsao) as t1,max((PREC_CONV+PREC_NCONV)*1) as p
from MM5
where Localidade='Rio de Janeiro' and
Tempo_Inicio>='2003-05-02 00:00:00' and
Tempo_Inicio<='2003-05-05 00:00:00' and
Tempo_Previsao>='2003-05-02 03:00:00' and
Tempo_Previsao<'2003-05-10 03:00:00'
group by 2,1 order by 1,2) as a where a.dia=24;
Junta a precipitação de uma tabela com a lat lon em outra
SELECT description,lat,lon,Prec FROM GeorioDia
INNER JOIN GeorioLatLon ON
GeorioLatLon.description = GeorioDia.Localidade
where GeorioDia.Data = '2007-09-09 00:00:00'
order by description asc;
PEGA WRF EM ALGUMAS CIDADES SO AS PRIMEIRAS 48 HORAS
SELECT Localidade,Tempo_Inicio,Tempo_Previsao,
FORMAT((UNIX_TIMESTAMP(Tempo_Previsao)-
UNIX_TIMESTAMP(Tempo_Inicio))/(60*60),0) as hprev,
U10M, V10M FROM `WRF`
WHERE (Localidade='Itaperuna' or
Localidade='Campos dos Goytacazes' or
Localidade='Resende' or
Localidade='Arraial do Cabo' or
Localidade='Macae' or
Localidade='Niteroi' or
Localidade='Parati' or
Localidade='Petropolis' or
Localidade='Teresopolis' or
Localidade='Duque de Caxias' or
Localidade='Mage')
and
((UNIX_TIMESTAMP(Tempo_Previsao)-
UNIX_TIMESTAMP(Tempo_Inicio))/(60*60)) <= 48 and
Tempo_Inicio>='2006-01-01 00:00:00' and
Tempo_Inicio<'2007-01-01 00:00:00';
PARA VER MAIS DICAS, ASSUNTOS E COMANDOS
BUSQUE NA BARRA ACIMA, À ESQUERDA
Tabelas de exemplo para MySQL
TABELA DE MODELO - PREVISÕES EM SUPERFÍCIE
use modelos ;
CREATE TABLE `WRF` (
`Tempo_Início` datetime NOT NULL default '0000-00-00 00:00:00',
`Tempo_Previsão` datetime NOT NULL default '0000-00-00 00:00:00',
`Localidade` varchar(50) NOT NULL default '',
`PNMM` float NOT NULL default '0',
`PSUP` float NOT NULL default '0',
`T2M` float NOT NULL default '0',
`Q2M` float NOT NULL default '0',
`NEBB` float NOT NULL default '0',
`NEBM` float NOT NULL default '0',
`NEBA` float NOT NULL default '0',
`U10M` float NOT NULL default '0',
`V10M` float NOT NULL default '0',
`PREC_CONV` float NOT NULL default '0',
`PREC_NCONV` float NOT NULL default '0',
PRIMARY KEY (`Tempo_Início`,`Tempo_Previsão
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
show tables;
ou
CREATE TABLE `WRFClima` (
`Tempo` datetime NOT NULL default '0000-00-00 00:00:00',
`Lat` float NOT NULL default '0',
`Lon` float NOT NULL default '0',
`PNMM` float NOT NULL default '0',
`PSUP` float NOT NULL default '0',
`T2M` float NOT NULL default '0',
`Q2M` float NOT NULL default '0',
`NEBB` float NOT NULL default '0',
`NEBM` float NOT NULL default '0',
`NEBA` float NOT NULL default '0',
`U10M` float NOT NULL default '0',
`V10M` float NOT NULL default '0',
`PREC_CONV` float NOT NULL default '0',
`PREC_NCONV` float NOT NULL default '0',
PRIMARY KEY (`Tempo`,`Lat`,`Lon`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
TABELA DE MODELO - PREVISÕES EM ALTITUDE
use modelos ;
CREATE TABLE `MM5alt` (
`Tempo_Inicio` datetime NOT NULL default '0000-00-00 00:00:00',
`Tempo_Previsao` datetime NOT NULL default '0000-00-00 00:00:00',
`Localidade` varchar(50) NOT NULL default '',
`P` float NOT NULL default '0',
`T` float NOT NULL default '0',
`Td` float NOT NULL default '0',
`U` float NOT NULL default '0',
`V` float NOT NULL default '0',
PRIMARY KEY (`Tempo_Inicio`,`Tempo_Previsao`,`Localidade`,`P`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
show tables;
TABELA DE MODELO - LOCALIDADES
use modelos ;
CREATE TABLE `Localidade` (
`Nome` varchar(50) NOT NULL default '',
`NomeOK` varchar(50) NOT NULL default '',
`Indice` float NOT NULL default '0',
`lat` float NOT NULL default '0',
`lon` float NOT NULL default '0',
PRIMARY KEY (`Nome`,`Indice`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
show tables;
Dicas para KSH
PARA VER MAIS DICAS, ASSUNTOS E COMANDOS
BUSQUE NA BARRA ACIMA, À ESQUERDA
FOREACH (que na realidade é for heheh) NUM LS COM HIDE
for item in `ls -lrt --hide=*ksh | head -3 | awk '{print $9}'`
do
echo $item
head -2 $item
head -2 $item | awk '{print "'$item' "$1" "$5"\n'$item' "$9}'
done
IDEM USANDO SUBSTRING E TABULAÇÃO
head -2 $item | awk '{print "'$item'\t
"substr($1,7,4)"-"substr($1,1,2)"-"substr($1,4,2)" 00:00:00\t
"$2" "$3" "$4" "$5}'
PASSAR VARIAVEL SHELL PARA O AWK
awk -v dd="20$ano $mes $dia 00 " '{print dd $1}' dados.txt
CRIA UM VETOR
set -A prev td t2m t rh pslv nt nm nb na k dvpt chuva w
OBTEM DATAS DO SISTEMA
d=`date +'%d'`
m=`date +'%m'`
y=`date +'%Y'`
LOOP DE HORÁRIOS E VARIÁVEIS PEGANDO O TAMANHO DO VETOR
i=0
while (( $i < 170 )) do
ii=0
while (( $ii < ${#prev[*]} )) do
if ((i<10)) then
echo "Gerando ${prev[$ii]}0${i}.png"
else
echo "Gerando ${prev[$ii]}${i}.png"
fi
let ii=$ii+1
done
let i=$i+3
done
VENDO O TAMANHO DO TERCEIRO ARGUMENTO (E SE EXISTE)
if (( "${#3}"!="1")) then
echo "Terceiro argumento existe e so tem um caracter"
fi
- Vários tipos de IF
IF BEM SIMPLES
if (($1>=24)) then
echo "oi"
else
echo "tchau"
fi
IF ESTILO NUMÉRICO
if [ $count -lt 10 ] ; then
echo "oi"
else
echo "tchau"
fi
IF ESTILO CARACTER
if [ "$answer" != "y" ] ; then
echo "oi"
else
echo "tchau"
fi
IF DIRETÓRIO EXISTE
if [ -d RCS ] ; then
echo "oi"
else
echo "tchau"
fi
IF ARQUIVO EXISTE
if [ -f ${datfile}ctl ] ; then
echo "oi"
else
echo "tchau"
fi
PARA VER MAIS DICAS, ASSUNTOS E COMANDOS
BUSQUE NA BARRA ACIMA, À ESQUERDA
Dicas para administrar um MySQL
PARA VER MAIS DICAS, ASSUNTOS E COMANDOS
BUSQUE NA BARRA ACIMA, À ESQUERDA
- Na linha de comando do linux:
ENTRANDO NO MySQL
mysql --user=USUARIO --password=SENHA
HABILITANDO O SERVIÇO AUTOMATICAMENTE
ntsysv
CHECANDO SE O MYSQLD ESTÁ RODANDO
service mysqld status
INICIANDO NA MÃO O MYSQLD
/etc/init.d/mysqld restart
EDITAR CONFIG, REINICIAR O DAEMON E DEFINIR AS SENHAS DE ROOT
vi /etc/my.cnf
/etc/init.d/mysqld restart
/usr/bin/mysqladmin -u root password 'SENHA'
/usr/bin/mysqladmin -u root -h MAQUINA.DOMINIO.BR password 'SENHA'
mysql -v --user=root --password=SENHA
- Na linha de comando do MySQL:
CRIANDO UMA BD
create database if not exists modelos ;
create database `ciclones` DEFAULT CHARACTER SET latin1 COLLATE latin1_swedish_ci;
CRIA UM USUÁRIO
create user 'USUARIO'@'localhost'
TROCAR SENHAS (INCLUSIVE ROOT)
update user set password=PASSWORD("NEWPASSWORD") where User='USER';
flush privileges;
VENDO AS DBs DISPONÍVEIS
show databases;
DESCREVENDO UMA TABELA
desc WRF;
EVITAR REGISTROS DUPLICADOS
ALTER IGNORE TABLE dupTest ADD UNIQUE INDEX(a,b);
MUDAR O NOME DE UMA TABELA
RENAME TABLE first TO second;
MANUTENÇÃO
OPTIMIZE TABLE `WRFClima`
ANALYZE TABLE `WRFClima`
CHECK TABLE `WRFClima`
ACESSAR SERVIDOR ATRAVÉS DE CLIENTE
- no SERVIDOR:
GRANT ALL PRIVILEGES ON *.* TO USER_CLIENTE@IP_CLIENTE IDENTIFIED BY "PWD_CLIENTE";
FLUSH PRIVILEGES;
(garantir que a porta 3306 no IPTABLES está aberta!)
- no CLIENTE:
mysql --host=IP_SERVIDOR --port=3306 --user=USER_CLIENTE--password=PWD_CLIENTE modelos
(para testar, dar um telnet -l root IP_SERVIDOR 3306 e ver se a porta ta aberta!)
OBS.: USER_CLIENTE e PWD_CLIENTE podem ser quaisquer, contanto q estejam tanto na consulta do cliente quanto nos privilégios do servidor!
- Procedimentos para backup
* Backup de todos os bancos existentes com conteúdo e estrutura
mysqldump -u usuario --password=senha --A > arquivo_saida
* Backup só das estruturas de todos os bancos
mysqldump -u usuario --password=senha -A -d > arquivo_saida
* Backup só dos dados de todos os bancos
mysqldump -u usuario --password=senha -c -t -e -A > arquivo_saida
* Backup só dos dados da BD modelos e clima
mysqldump -u usuario --password=senha -c -t -e --databases modelos clima > arquivo_saida
* Backup só dos dados da BD modelos, tabela WRF, criando tabelas se necessário
mysqldump -u usuario --password=senha -c -e modelos WRF > arquivo_saida
PARA VER MAIS DICAS, ASSUNTOS E COMANDOS
BUSQUE NA BARRA ACIMA, À ESQUERDA
Dicas para CVS
PARA VER MAIS DICAS, ASSUNTOS E COMANDOS
BUSQUE NA BARRA ACIMA, À ESQUERDA
Raiz do CVS
$ echo $CVSROOT
/usr/local/cvs-rep
Inicia um repositorio AQUI (sem variavel ambiente)
cvs -d $CVSROOT co -l .
Adiciona um diretório ao repositorio
cvs add DIR
Incluir um diretório todo e prepará-lo
cd lpm_op
cvs import -m "Operacional do LPM" lpm_op lpm_op start
cd ..
mv lpm_op lpm_op.orig
cvs checkout lpm_op
diff -r lpm_op.orig lpm_op
rm -r lpm_op.orig
Criando .keepme (útil para cvs)
find DIRWORK -type d -ls | awk '{print "touch "$11"/.keepme"}' > criakeepme.exe
chmod u+x criakeepme.exe
PARA VER MAIS DICAS, ASSUNTOS E COMANDOS
BUSQUE NA BARRA ACIMA, À ESQUERDA
Administrando o Fedora
PARA VER MAIS DICAS, ASSUNTOS E COMANDOS
BUSQUE NA BARRA ACIMA, À ESQUERDA
Reiniciar o servidor web apache
/etc/rc.d/init.d/httpd restart
PARA VER MAIS DICAS, ASSUNTOS E COMANDOS
BUSQUE NA BARRA ACIMA, À ESQUERDA
Dicas rápidas para R
PARA VER MAIS DICAS, ASSUNTOS E COMANDOS
BUSQUE NA BARRA ACIMA, À ESQUERDA
O ambiente de software estatístico R é muito difundido em várias áreas de ciêncie, indo de biologia até geofísica. A linguagem a princípio é bem dificil de se lidar por ser basicamente toda vetorial, mas eu gosto sempre de ter uma "colinha" para me ajudar.
Coloquei abaixo algumas dessas dicas, algumas bobas e outras que vivo esquecendo...
EXECUTAR UM SCRIPT NO PROMPT DO R
source(paste(dir,"/batchGRADE.R",sep=""))
QUEBRA UM VETOR CHARACTER EM VARIAS COMPONENTES
strsplit("ola tudo bem"," ")
resultado: um vetor de 3 posições: "ola", "tudo" e "bem"
PARA ACESSAR APENAS UMA PARTE DE UM MAPA E REESCREVER O SHP
shape0=c("0.shp")
library(maps)
library(maptools)
mapa0=readShapeLines(shape0)
writeLinesShape(mapa0[mapa0[[3]]=="RJ",],"testeRJ")
#MOSTRA APENAS AS RODOVIAS DO SHAPE
plot(mapa2[mapa2[[1]]=="Rodovia",])
#MOSTRA APENAS UM SUB-OBJETO DO SHAPE
plot((mapa2[1,]@lines[[1]])@Lines[[1]]@coords,type="l")
PARA RODAR UM SCRIPT NO R (tabajara version)
#!/bin/ksh
/usr/bin/time R --no-save --no-restore --no-site-file --no-init-file --no-environ --no-readline < script.R
# Usando o X Virtual Frame Buffer como servidor X para rodar o R em crontab
/usr/bin/Xvfb :7 -screen 0 1152x900x24&
export DISPLAY=":7.0"
GREP TABAJARA EM R
as.real(read.table("model.ctl",skip=5,nrows=1)[2])
(o exemplo pega o valor de tdef num ctl)
APAGA TODOS OS OBJETOS
rm(list = ls())
TAMANHO DO OBJETO NA MEMÓRIA
object.size(temp)
MEMÓRIA
memory.size()
gc()
EXEMPLO DE IF VETORIAL
sqrt(ifelse(x > 0, x, NA))
SEQUÊNCIAS E CLASSIFICAÇÃO
b1=rep(a1,length(a2))
b2=rep(a2,length(a1))
b2=sort(b2)
lon=seq(-45,,length.out=5)
llon=length(lon)
lon=rep(lon,llon)
dim(lon)=c(llon,llon)
lon=t(lon)
VIEWPORTS E ARROWS
plot.new()
plot(lon, lat, type="n",xlab="latitude", ylab="longitude",main="China
Sea Wind Speed/Direction and Temperature")
vps <- baseViewports()
par(new=TRUE)
pushViewport(vps$inner, vps$figure, vps$plot)
length <- 0.5 # "cm"
x1 <- unit(lon, "native") - unit(0.5*length*bu, "cm")
y1 <- unit(lat, "native") - unit(0.5*length*bv, "cm")
x2 <- unit(lon, "native") + unit(0.5*length*bu, "cm")
y2 <- unit(lat, "native") + unit(0.5*length*bv, "cm")
grid.arrows(grob=grid.segments(x1, y1, x2, y2),length=unit(1.5, "mm"),gp=gpar(col="red"))
popViewport(3)
plot(mapa_estado,lwd=2,xlim=c(a2[1],a2[5]),ylim=c(a1[1],a1[8]))
#plot(mapa_estado,lwd=2,xlim=c(-25,-18),ylim=c(-45,-41))
PARA VER MAIS DICAS, ASSUNTOS E COMANDOS
BUSQUE NA BARRA ACIMA, À ESQUERDA
Dicas para PHP
PARA VER MAIS DICAS, ASSUNTOS E COMANDOS
BUSQUE NA BARRA ACIMA, À ESQUERDA
PHP é uma linguagem de programação que utiliza scripts e foi muito difundida em desenvolvimento de sistemas web. Hoje, mesmo com novos recursos na internet, o PHP ainda sobre vive bem devido à sua flexibilidade e rapidez em se adaptar.
Esse post contém algumas coisas bem básicas da estrutura do PHP, seja para refrescar a memória ou tirar alguma dúvida boba.
APRESENTAÇÃO BÁSICA
#!/usr/bin/php (se for usar em linha de comando)
<\?php (sem a barra...)
echo $var;
?>
DEFINIÇÃO DE FUNÇÕES
function InsTxt ($img,$text,$size,$cor,$x1,$y1,$fonte,$align) {
global $vermescuro;
...
echo $resposta;
}
IF ELSE
if ($pos === false) { ... }
else { ... }
SWITCH CASE
switch ($align) {
case "center":
...
break;
case "left":
...
break;
}
ARGUMENTOS VIA LINHA DE COMANDO
$var = $argv[1];
(o "0" do vetor é o nome do comando)
ARGUMENTOS VIA BROWSER (FORMULÁRIO HTML) E QUEBRA DE STRING
$Tdata = $_REQUEST["Tdata"]; // a data vem de um formulário HTML com um objeto de nome "Tdata"
$TdataY = substr($Tdata, 0, 4);
$TdataM = substr($Tdata, 5, 2);
$TdataD = substr($Tdata, 8, 2);
GERANDO DATAS
if ($varJ=="0024") { $Tok=mktime(0,0,0,$TdataM,$TdataD,$TdataY)+(24*60*60); $prev = date("H\Z d/m/Y", $Tok); }
if ($varJ=="2448") { $Tok=mktime(0,0,0,$TdataM,$TdataD,$TdataY)+(48*60*60); $prev = date("H\Z d/m/Y", $Tok); }
JUNTANDO / AGREGANDO / CONCATENANDO VARIÁVEIS
$Tinteg = $Tdata.' 00:00:00';
LOOP DE FOR
for ( $tempo = 0; $tempo <= sizeof($prev); $tempo += 1) { $e=6.112*exp(17.67*($temp[$tempo])); $ee=log($q1[$tempo]/0.622); $eee=sqrt(pow($u10[$tempo],2)); }
PARA VER MAIS DICAS, ASSUNTOS E COMANDOS
BUSQUE NA BARRA ACIMA, À ESQUERDA
Dicas para usar MySQL em PHP
PARA VER MAIS DICAS, ASSUNTOS E COMANDOS
BUSQUE NA BARRA ACIMA, À ESQUERDA
Quem mexe com grande volume de dados (como o profissional de Meteorologia) tem que aprender a mexer com banco de dados. O banco de dados que tenho mais contato atualmente é o MySQL e costumo usar aplicações em PHP para acessar e manipular esses dados.
Coloquei abaixo algumas dicas para facilitar essa comunicação.
ABRINDO A CONEXÃO
$db = mysql_connect("SERVIDOR", "USUARIO","SENHA") or die ("Erro1");
CONECTANDO NO BANCO DE DADOS
mysql_select_db("BANCODEDADOS") or die ("Erro2");
ESCREVENDO A CONSULTA
$consulta1 = "select VAR1,VAR2 from TABELA where Localidade='".$cidade."' AND Tempo_Inicio='".$Tinteg."' ";
EXECUTANDO A CONSULTA
$consulta = mysql_query($consulta1,$db) or die ("Erro3");
OBTENDO DADOS DA CONSULTA
if ($myrow=mysql_fetch_array($consulta)) {
do {
$var1[] = $myrow["VAR2"];
$var2[] = $myrow["VAR2"];
}while ($myrow=mysql_fetch_array($consulta));
}
PARA VER MAIS DICAS, ASSUNTOS E COMANDOS
BUSQUE NA BARRA ACIMA, À ESQUERDA
Usando máscaras em GrADS
O problema não é bem da função MASKOUT do GrADS, mas da fusão (quase sempre necessária) entre as funções MASKOUT e CONST. O ideal é ler os exemplos abaixo com o manual de cada uma das duas funções (manual do MASKOUT e manual do CONST).
Só para lembrar: maskout(#1,#2) plota #1 quando #2 é positivo e undef quando #2 é negativo
Mask simples
d maskout(maskout(var,var-50),-var+60)
(mostra a var entre 50 e 60)
Mask confuso com MASKOUT e CONST
d maskout(maskout(maskout(1, ( const(maskout(maskout(var1*10,var1*10-3.9),-var1*10+5.1),6)-6 ) ), ( const(maskout(maskout(var2,var2-50),-var2+70),9)-9 ) ), ( const(maskout(maskout(var2,var2-50),-var2+70),9)-9 ) )
(mostra o valor 1 onde var1 esta entre 4 e 5 e var2entre 50 e 70. o restante mostra undef)
Confuso, né? Mas bem útil!
Dicas rápidas para GrADS
PARA VER MAIS DICAS, ASSUNTOS E COMANDOS
BUSQUE NA BARRA ACIMA, À ESQUERDA
Apesar de mexer em meteorologia quase 100% do tempo do meu trabalho, mexo em tantas linguagens de programação que é sempre bom manter um lembrete de algumas estruturas e pedaços de código.
Usa um LS para pegar parâmetros e usar em variáveis (versão DUMB)
'!ls -l u_niveis1000_*dat | tail -1 | awk "{print substr(\$9,14,12)}" > prefixo.txt'
prefixo=read('./prefixo.txt')
prefixo=sublin(prefixo,2)
say prefixo
Pega argumentos direto da linha de comando (versão SMART)
no começo do script
function main(args)
dentro do script
cidade=subwrd(args,1)
say cidade
uso
gradsc -lc "script.gs Rio_de_Janeiro"
PARA VER MAIS DICAS, ASSUNTOS E COMANDOS
BUSQUE NA BARRA ACIMA, À ESQUERDA
Dicas para administrar o R
PARA VER MAIS DICAS, ASSUNTOS E COMANDOS
BUSQUE NA BARRA ACIMA, À ESQUERDA
O ambiente de software estatístico R é muito difundido em várias áreas de ciêncie, indo de biologia até geofísica. A linguagem a princípio é bem dificil de se lidar por ser basicamente toda vetorial, mas eu gosto sempre de ter uma "colinha" para me ajudar.
Coloquei abaixo algumas dessas colas, voltadas para a administração do ambiente, como por exemplo a instalação e manutenção de pacotes e a comunicação entre R e banco de dados MySQL.
INSTALAÇÃO DO R + MySQL NUM FEDORA
yum install R.x86_64
yum install mysql-devel.x86_64 mysqlclient14*_64
INSTALAÇÃO DE PACOTES ÚTEIS
install.packages(c("sp","maps","maptools","gridBase","pixmap","RadioSonde"))
ATUALIZAÇÃO DOS PACOTES
update.packages()
chooseCRANmirror() [bem útil no terminal]
INSTALAÇÃO DO PACOTE RMySQL NUM FEDORA
export PKG_LIBS='-L/usr/lib64/mysql -lmysqlclient'
export PKG_CPPFLAGS='-I/usr/include/mysql'
install.packages (c("DBI","RMySQL")
PARA VER MAIS DICAS, ASSUNTOS E COMANDOS
BUSQUE NA BARRA ACIMA, À ESQUERDA
Transformações de variáveis meteorológicas
PARA VER MAIS DICAS, ASSUNTOS E COMANDOS
BUSQUE NA BARRA ACIMA, À ESQUERDA
Uma das coisas sempre presentes em Meteorologia é a transformação de variáveis meteorológicas. Às vezes temos umidade específica mas queríamos umidade relativa, outras vezes temos a variável certa, mas na unidade errada...
Vou colar aqui alguns códigos de programação em PHP e GrADS com as transformações que eu mais uso.
* UMIDADE ESPECÍFICA (q) PARA UMIDADE RELATIVA (UR) E TEMPERATURA DO PONTO DE ORVALHO (Td) - PHP
*dados originais:
vetores de 169 posições (7 dias horários)
* código:
for ( $tempo = 0; $tempo <= 168; $tempo += 1) {
$e1=( $q1[$tempo]*$pressao[$tempo])/($q1[$tempo]+0.622);
$es1=6.112*exp(17.67*($temp[$tempo])/($temp[$tempo]+243.5));
$e2=log($q1[$tempo]/0.622*$pressao[$tempo]/(1.0+$q1[$tempo]/0.622));
$tempd[$tempo]=(243.5*( $e2 )-440.8)/(19.48-( $e2 ) );
$ur[$tempo]=($e1/$es1)*100;
}
PARA VER MAIS DICAS, ASSUNTOS E COMANDOS
BUSQUE NA BARRA ACIMA, À ESQUERDA
Plotando vento como no meteograma
Vou colar aqui embaixo um código comentado para isso:
* abre o arquivo, prepara a tela e da as coordenadas do ponto
'open arquivo.ctl'
'set display color white'
'clear'
lat=-22
lon=-42
'set lat 'lat
'set lon 'lon
* prepara o ambiente do GrADS
'set z 1'
'set dfile 1'
'set t 1 169'
'set parea .4 8.25 .2 1.9'
* busca o maximo e o intervalo dos dados
* (o minimo e o maximo de sinal trocado)
'set gxout stat'
'd mag(u,v)'
rec=sublin(result,9)
say "rec "rec
maximo=subwrd(rec,6)
say "maximo "maximo
intervalo=subwrd(rec,7)
say "intervalo "intervalo
intervalo=intervalo*2
*configuracoes da magnitude do vento
'set gxout line'
'set vrange 0 ' maximo
'set cmark 0'
'set cthick 10'
'set cstyle 1'
'set ccolor 1'
'set ylint 'intervalo
*da display da magnitude do vento
'set grads off'
'd mag(u,v)'
* aqui que eh importante! detalhe no set lev abaixo.
* com este set lev variando em torno de 1, o GrADS
* acha que existem 3 pontos: o lev .99, 1 e 1.01. com
* esses tres pontos ja e possivel plotar vetores para
* cima e para baixo na tela.
'set lev .99 1.01'
* o exemplo acima esta em coordenadas de massa (WRF,
* por exemplo). se fosse em coordenada de pressão,
* ficaria algo como 'set lev 950 1050',
* deixando 1000hPa no centro
*configuracoes do vetor
'set cthick 10'
'set ylab off'
'set xlab off'
'set frame off'
'set gxout vector'
'set ccolor 12'
'set arrlab off'
*display do vetor
'set grads off'
'd u;v'
*processos finais e geracao de um arquivo PNG
'set ylab on'
'set xlab on'
'set frame on'
'printim meteo.png'
'quit'
Atenção, pois sem o set lev variando, o GrADS entende o problema como unidimensional e não plota o vetor.
Dicas para SED e AWK
PARA VER MAIS DICAS, ASSUNTOS E COMANDOS
BUSQUE NA BARRA ACIMA, À ESQUERDA
Manipular bem arquivos e linhas de texto é muito importante, especialmente ao lidar com dados brutos.
ATENÇÃO: dependendo da versão de linux os comandos abaixo podem variar. Foram testados em um FEDORA 7 em diante.
SED mudando a ultima virgula de cada linha mas limitado a ultima linha ($)
sed '$ s:,$:;:g' arquivo.txt
o que era:
4 5 6 7 8 9 1 2 5,
5 8 7 4 5 6 9 5 4,
7 5 8 4 1 2 3 6 8,
vira:
4 5 6 7 8 9 1 2 5,
5 8 7 4 5 6 9 5 4,
7 5 8 4 1 2 3 6 8;
Criando arquivos .keepme (útil para cvs) usando AWK
find DIRWORK -type d -ls | awk '{print "touch "$11"/.keepme"}' > criakeepme.exe
Usando LS e AWK para pegar parametros externos e escrever no GrADS
'!ls -l u_niveis1000_*dat | tail -1 | awk "{print substr(\$9,14,12)}" > prefixo.txt'
prefixo=read('./prefixo.txt')
prefixo=sublin(prefixo,2)
say prefixo
(existem formas melhores, mas dependendo do tipo e tamanho do parâmetro isto é bem útil)
Usando HEAD e AWK para formatar um arquivo usando tabulações (\t), pedaços de strings (substr) e quebras de linha (\n)
head -2 arquivo.txt | awk '{print "X\t"substr($1,7,4)"-"substr($1,1,2)"-"substr($1,4,2)" 00:00:00\n"$2" "$3" "$4" "$5}'
Forma fácil de passar variáveis shell para o AWK
Passando $ano, $mes e $dia
awk -v datafull="20$ano $mes $dia 00 " '{print datafull $1" "$2" "$3" "$4}' arquivo.txt
Somando colunas usando AWK
awk '{for (i=1; i<=NF; i++) { sum[i]+= $i } } END { for (i=1; i<=NF; i++ ) { print "Col[", i, "] =", sum[i] } }'
passa de:
32 0para...
6 0
21 11
Col[ 1 ] = 59
Col[ 2 ] = 11
awk '{ sum1+=$1; sum2+=$2; } END { print sum1" "sum2 }'
passa de:
32 0para...
6 0
21 11
59 11
PARA VER MAIS DICAS, ASSUNTOS E COMANDOS
BUSQUE NA BARRA ACIMA, À ESQUERDA
Dicas para usar bem o ImageMagick
PARA VER MAIS DICAS, ASSUNTOS E COMANDOS
BUSQUE NA BARRA ACIMA, À ESQUERDA
Tem momentos em que nós que nós temos muitos arquivos de imagem que precisam ser tratados e formas que apenas um bom programa gráfico faz, mas estamos na linha de comando...
Para isso existe o pacote de comandos gráficos ImageMagick e o comando mais útil para mim é o convert.
Gerando thumbnails com o convert
convert -quality 40 -depth 8 -resize 100x75 entrada.png saida.jpg
PARA VER MAIS DICAS, ASSUNTOS E COMANDOS
BUSQUE NA BARRA ACIMA, À ESQUERDA
Dicas para lidar com datas no linux
PARA VER MAIS DICAS, ASSUNTOS E COMANDOS
BUSQUE NA BARRA ACIMA, À ESQUERDA
Em meteorologia nós temos sempre que ter o cuidado de pegar o dado certo, no local certo, do tempo certo.
Lidar com as datas é fundamental pois no caso de previsão de tempo e clima, temos duas datas em jogo: de onde a previsão parte (data de integração ou data inicial) e para qual data ela é válida.
Para organizar grandes discos também é imporatnte saber lidar com datas e horas.
Andando no tempo com o comando de linux date
date +%Y%m%d%h -d "12:12:12 2005-08-20 7 days"
Apagando os últimos dois arquivos de uma data (USANDO RM)
rm -f `ls -lrt ${htmlpath}s*$((${e}-3)).png | tail -2 | awk '{print $9}'`
Apagando por data (USANDO FIND)
find -mtime +40 -exec rm -Rf {} \;
Listando por data (USANDO FIND)
find -mtime +40 -exec ls -o {} \;
PARA VER MAIS DICAS, ASSUNTOS E COMANDOS
BUSQUE NA BARRA ACIMA, À ESQUERDA
Dicas para o comando FIND do linux
PARA VER MAIS DICAS, ASSUNTOS E COMANDOS
BUSQUE NA BARRA ACIMA, À ESQUERDA
Essas dicas eu peguei na época que eu era funcionário lá do CPTEC e guardei até hoje!
Busca simples usando find
find . -name libjasper.so
Somatória de tamanhos de arquivos usando find
find dataout/T213L42 -name "???????????200503151*.gif" -ls | awk '{s=s+$7}END{print s}'
Criando .keepme (útil para cvs)
find DIRWORK -type d -ls | awk '{print "touch "$11"/.keepme"}' > criakeepme.exe
chmod u+x criakeepme.exe
Apagando por data usando find
find -mtime +40 -exec rm -Rf {} \;
Listando por data usando find
find -mtime +40 -exec ls -o {} \;
PARA VER MAIS DICAS, ASSUNTOS E COMANDOS
BUSQUE NA BARRA ACIMA, À ESQUERDA
Dicas para SSH e SCP
PARA VER MAIS DICAS, ASSUNTOS E COMANDOS
BUSQUE NA BARRA ACIMA, À ESQUERDA
LINHA DE COMANDO DE LINUX
Cópia de TUDO ACIMA usando SCP
scp -r * CONTA@MAQUINA:PATH
(ex.: scp -r * fulano@server1.blabla.br:/home/beltrano)
Cópia de UM ARQUIVO usando SCP e especificando a porta
scp FILE -oPort=PORTA CONTA@MAQUINA:PATH
(ex.: scp arquivi.txt -oPort=1111 fulano@server1.blabla.br:/home/beltrano)
Especificar a porta ao entrar em uma máquina usando SSH
ssh -p PORTA CONTA@MAQUINA
(ex.: ssh -p 1111 fulano@server1.blabla.br)
Gerando uma chave para SCP e SSH
cd .ssh
ssh-keygen -t dsa
scp -p id_dsa.pub CONTA@MAQUINA:PATHDOHOME/.ssh
(ex.: scp -p id_dsa.pub fulano@server1:/home/fulano/.ssh)
cd .ssh
cat id_dsa.pub >> authorized_keys
PROGRAMAS PARA WINDOWS
Para instalar em Windows eu recomendo o Secure Shell Client, da SSH Comunications Security. Ele já vem com SSH e SCP em janelas à lá explorer.
Para quem trabalha usando vários computadores e/ou não pode instalar programas no Windows do trabalho ou da faculdade, uma ótima solução é usar os aplicativos portáteis PuTTY Portable (cliente SSH) e WinSCP (cliente SCP). Os dois são instalados direto no seu pendrive e carregam consigo todas as informações de login e sessões antigas. Há a possibilidade também de salvar senhas, apesar de ser meio perigoso no caso de perda do pendrive!
Eu fiz um post aqui no blog ensinando a instalar o WinSCP, confira: Usando o WinSCP a partir do pendrive
PARA VER MAIS DICAS, ASSUNTOS E COMANDOS
BUSQUE NA BARRA ACIMA, À ESQUERDA