Previsão do Tempo no orkut

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


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

POST EM CONSTANTE ATUALIZAÇÃO
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';



POST EM CONSTANTE ATUALIZAÇÃO
PARA VER MAIS DICAS, ASSUNTOS E COMANDOS
BUSQUE NA BARRA ACIMA, À ESQUERDA

Tabelas de exemplo para MySQL

Esses são exemplos de como criar tabelas em MySQL para determinadas aplicações em Meteorologia

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
`,`Localidade`)
) 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

POST EM CONSTANTE ATUALIZAÇÃO
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


POST EM CONSTANTE ATUALIZAÇÃO
PARA VER MAIS DICAS, ASSUNTOS E COMANDOS
BUSQUE NA BARRA ACIMA, À ESQUERDA

Dicas para administrar um MySQL

POST EM CONSTANTE ATUALIZAÇÃO
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


POST EM CONSTANTE ATUALIZAÇÃO
PARA VER MAIS DICAS, ASSUNTOS E COMANDOS
BUSQUE NA BARRA ACIMA, À ESQUERDA

Dicas para CVS

POST EM CONSTANTE ATUALIZAÇÃO
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


POST EM CONSTANTE ATUALIZAÇÃO
PARA VER MAIS DICAS, ASSUNTOS E COMANDOS
BUSQUE NA BARRA ACIMA, À ESQUERDA

Administrando o Fedora

POST EM CONSTANTE ATUALIZAÇÃO
PARA VER MAIS DICAS, ASSUNTOS E COMANDOS
BUSQUE NA BARRA ACIMA, À ESQUERDA

Reiniciar o servidor web apache
/etc/rc.d/init.d/httpd restart


POST EM CONSTANTE ATUALIZAÇÃO
PARA VER MAIS DICAS, ASSUNTOS E COMANDOS
BUSQUE NA BARRA ACIMA, À ESQUERDA

Dicas rápidas para R

POST EM CONSTANTE ATUALIZAÇÃO
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))



POST EM CONSTANTE ATUALIZAÇÃO
PARA VER MAIS DICAS, ASSUNTOS E COMANDOS
BUSQUE NA BARRA ACIMA, À ESQUERDA

Dicas para PHP

POST EM CONSTANTE ATUALIZAÇÃO
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)); }



POST EM CONSTANTE ATUALIZAÇÃO
PARA VER MAIS DICAS, ASSUNTOS E COMANDOS
BUSQUE NA BARRA ACIMA, À ESQUERDA

Dicas para usar MySQL em PHP

POST EM CONSTANTE ATUALIZAÇÃO
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));
}


POST EM CONSTANTE ATUALIZAÇÃO
PARA VER MAIS DICAS, ASSUNTOS E COMANDOS
BUSQUE NA BARRA ACIMA, À ESQUERDA

Usando máscaras em GrADS

Usar máscaras em GrADS é algo que enrola muita gente. Já vi muita gente boa não saber usar, ou pior: nem entender como funciona.

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

POST EM CONSTANTE ATUALIZAÇÃO
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"


POST EM CONSTANTE ATUALIZAÇÃO
PARA VER MAIS DICAS, ASSUNTOS E COMANDOS
BUSQUE NA BARRA ACIMA, À ESQUERDA

Dicas para administrar o R

POST EM CONSTANTE ATUALIZAÇÃO
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")


POST EM CONSTANTE ATUALIZAÇÃO
PARA VER MAIS DICAS, ASSUNTOS E COMANDOS
BUSQUE NA BARRA ACIMA, À ESQUERDA

Transformações de variáveis meteorológicas

POST EM CONSTANTE ATUALIZAÇÃO
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;
}


POST EM CONSTANTE ATUALIZAÇÃO
PARA VER MAIS DICAS, ASSUNTOS E COMANDOS
BUSQUE NA BARRA ACIMA, À ESQUERDA

Plotando vento como no meteograma

Muita gente não sabe dar display do vento para ficar como nos meteogramas (como nos meteogramas do ETA20 do CPTEC).

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

POST EM CONSTANTE ATUALIZAÇÃO
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 0
6 0
21 11
para...
Col[ 1 ] = 59
Col[ 2 ] = 11



awk '{ sum1+=$1; sum2+=$2; } END { print sum1" "sum2 }'

passa de:
32 0
6 0
21 11
para...
59 11




POST EM CONSTANTE ATUALIZAÇÃO
PARA VER MAIS DICAS, ASSUNTOS E COMANDOS
BUSQUE NA BARRA ACIMA, À ESQUERDA

Dicas para usar bem o ImageMagick

POST EM CONSTANTE ATUALIZAÇÃO
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


POST EM CONSTANTE ATUALIZAÇÃO
PARA VER MAIS DICAS, ASSUNTOS E COMANDOS
BUSQUE NA BARRA ACIMA, À ESQUERDA

Dicas para lidar com datas no linux

POST EM CONSTANTE ATUALIZAÇÃO
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 {} \;


POST EM CONSTANTE ATUALIZAÇÃO
PARA VER MAIS DICAS, ASSUNTOS E COMANDOS
BUSQUE NA BARRA ACIMA, À ESQUERDA

Dicas para o comando FIND do linux

POST EM CONSTANTE ATUALIZAÇÃO
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 {} \;


POST EM CONSTANTE ATUALIZAÇÃO
PARA VER MAIS DICAS, ASSUNTOS E COMANDOS
BUSQUE NA BARRA ACIMA, À ESQUERDA

Dicas para SSH e SCP

POST EM CONSTANTE ATUALIZAÇÃO
PARA VER MAIS DICAS, ASSUNTOS E COMANDOS
BUSQUE NA BARRA ACIMA, À ESQUERDA

SSH e SCP significa "secure shell" e "secure copy" e os comandos abaixo servem para praticamente todos os sistemas linux que usei.


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



POST EM CONSTANTE ATUALIZAÇÃO
PARA VER MAIS DICAS, ASSUNTOS E COMANDOS
BUSQUE NA BARRA ACIMA, À ESQUERDA