Construindo a primeira aplicação no Google App Engine
Julho 2, 2008
Vou fazer uma aplicação “Hello, world!” usando Google App Engine.
A primeira coisa a se fazer é ir para a página: http://code.google.com/intl/pt-BR/appengine/
Você precisa fazer o cadastro e informar o seu número de telefone, depois disso o Google irá enviar uma mensagem para o seu celular com o código de acesso para ativação da conta.
Feito o cadastro é preciso baixar o SDK, o SDK é o ambiente de desenvolvimento do Google App Engine, está disponível para ambientes Windows, MAC OS e Linux.
Eu uso a distribuição Ubuntu do Linux, vou mostrar como rodar no Linux, para baixar o SDK visite: http://code.google.com/intl/pt-BR/appengine/downloads.html ou http://googleappengine.googlecode.com/files/google_appengine_1.1.0.zip
Feito do download descompacte em algum diretório no seu home.
O Google App Engine usa a linguagem de programação Python, desta forma você precisa ter o Python 2.5 instalado em sua distribuição.
Instalando o Python 2.5
No terminal digite:
sudo apt-get install python2.5 python2.5-dbg python2.5-dev python2.5-doc python2.5-examples idle-python2.5 apache2
Feito isso já podemos brincar com o Google App Engine.
No raiz do diretório google_appengine existe dois arquivos em Python:
- appcfg.py - Esse arquivo tem a função de publicar sua aplicação nos servidores do Google.
- dev_appserver.py - Esse arquivo tem a função de testar sua aplicação localmente.
Dentro do diretório google_appengine crie um diretório chamado helloworld.
Dentro do diretório helloworld crie o arquivo chamado helloworld.py com o seguinte conteúdo:
print 'Content-Type: text/plain' print '' print 'Hello, world!'
Esse arquivo apenas define o conteúdo da página como texto e imprime a mensagem “Hello, world!”.
Agora precisamos criar o arquivo de configuração da aplicação.
O Google App Engine usa um arquivo no formato YAML para armazenar as configurações, visto que o formato XML é muito poluído e o YAML é bem mais limpo e leve.
Dentro do diretório helloworld crie o arquivo app.yaml com o seguinte conteúdo:
application: helloworld version: 1 runtime: python api_version: 1 handlers: - url: /.* script: helloworld.py
Esse arquivo define:
- A identificação da aplicação, com o nome helloworld.
- A versão da aplicação, o esquema de versão é importante, pois o Google App Engine permite voltar versões das aplicações depois de publicado.
- Diz que a linguagem é Python, futuramente o Google App Engine irá dar suporte a outras linguagens de programação.
- Define qual a url que responde pela requisição, no caso existe uma expressão regular /.* que diz que é tudo da home.
Testando a aplicação localmente
Agora vem uma mágica legal do Google App Engine, gostei disso.
Para rodar a aplicação você precisa estar dentro do diretório google_appengine e dar o seguinte comando:
python dev_appserver.py helloworld/
Onde helloworld é o nome da aplicação.
Se você visitar o endereço: http://localhost:8080 você poderá testar a aplicação que você acabou de fazer, nesse exemplo simples irá aparecer na tela “Hello, world!”.
Pronto! ![]()
Começando a brincar com Google App Engine
Julho 2, 2008
Hoje eu comecei a brincar com o Google App Engine, fiquei espantado com o pouco que eu vi.
Com poucas linhas de código em Python é possível implementar recursos interessantes, como o esquema de conta de usuários do Google.
O Google App Engine permite o desenvolvimento de aplicações para web da mesma maneira que o Google desenvolve as suas aplicações.
As aplicações ficam hospedadas no Google.
Para mais informações: http://code.google.com/intl/pt-BR/appengine
JavaScript ponto-e-vírgulas opcionais
Maio 25, 2008
Depois de instruções em JavaScript, geralmente há um ponto-e-vírgula(;). O ponto-e-vírgula serve para separar uma instrução de outra.
Você pode omitir o ponto-e-vírgula se cada umas das instruções for colocada em uma linha separada.
Por exemplo:
a = 5; b = 7;
Esse exemplo poderia ser escrito sem ponto-e-vírgula, mas quando formatado da maneira a seguir o primeiro ponto-e-vírgula se torna necessário:
a = 5; b = 7;
Função decodeURI
Maio 14, 2008
Essa função decodifica um texto que contenha caracteres UTF-8. É o contrário da função encondeURI.
Por exemplo:
var result = decodeURI("http://www.teste.com.br/se%C3%A7%C3%A3o/");
document.write(result);
Irá imprimir na tela:
http://www.teste.com.br/seção/
Função encodeURI
Maio 13, 2008
Essa função está presente a partir do JavaScript 1.5.
Ela codifica um texto, substituindo alguns caracteres por caracteres Unicode 8 bits.
Por exemplo:
var result = encodeURI("http://www.teste.com.br/seção de fotos.html");
document.write(result);
Esse exemplo irá produzir o seguinte resultado:
http://www.teste.com.br/se%C3%83%C2%A7%C3%83%C2%A3o%20de%20fotos.html
Executando qualquer tipo de consulta no Doctrine
Maio 7, 2008
Depois de procurar bastante, consegui descobrir como executar qualquer tipo de consulta usando o ORM Doctrine.
Eu precisava usar algumas funções específicas do PostgreSQL, o Doctrine não implementa todas as funções do PostgreSQL, o Doctrine faz isso para manter a compatibilidade entre todos os banco de dados que ele dá suporte. Algumas funções só funcionam em um determinado banco de dados.
O exemplo que eu vou ilustrar abaixo foi construído em cima do framework symfony, mas deve ser muito semelhate se você estiver trabalhando direto com o Doctrine.
O Doctrine foi construído em cima do PDO (http://br.php.net/manual/pt_BR/book.pdo.php), desta forma nós podemos pegar a instância do Doctrine e realizar uma consulta usando o PDO.
Por exemplo:
$manager = Doctrine_Manager::getInstance(); $dbh = $manager->getCurrentConnection(); $sql = "SELECT sua_funcao_do_banco(?)"; $sth = $dbh->prepare($sql); $sth->execute(array(10)); $r = $sth->fetch(PDO::FETCH_ASSOC);
Vamos entender como tudo funciona:
$manager = Doctrine_Manager::getInstance(); $dbh = $manager->getCurrentConnection();
O código acima pega a conexão atual com o banco de dados e usa ela para fazer a consulta.
$sql = "SELECT sua_funcao_do_banco(?)";
O SQL que você quer executar, pode ser qualquer sql que rode no seu banco de dados. Note o “?” esse cara informa que será passado um parâmetro.
$sth = $dbh->prepare($sql); $sth->execute(array(10)); $r = $sth->fetch(PDO::FETCH_ASSOC);
Essas linhas preparam o SQL, executando e substituindo o “?” do SQL pelo valor no array, no caso array(10).
Por fim é executando o fetch para pegar apenas um resultado, se a consulta retorna-se mais que um resultado você poderia fazer um fetchAll.
A linha PDO::FETCH_ASSOC informa como você quer que os dados sejam retornados em array, objeto e outros. Dá uma olhada aqui: http://br.php.net/manual/pt_BR/pdostatement.fetch.php
Pronto! Agora e só usar a variável $r para trabalhar com os dados retornados da consulta.
Eu e a Tábua
Maio 7, 2008
http://www.lastfm.com.br/music/Gabriel+o+Pensador/_/Eu+e+a+T%C3%A1bua
Outro dia eu
Tava em casa me sentindo na prisão
Jogando dardo na televisão
Estressado, cansado dessa vida louca
Olhei pro lado e vi a mulher passando roupa
Minha cueca azul, da cor do mar
Me deu vontade de ir pegar uma onda com a minha tábua de passar
E, pra fugir da rotina
Detonei uma vela pois não tinha parafina
Tudo em cima - “Vai pra onde amor?” Vamos a la playa… -
“Vamos a la playa?! Ô! Cê vai com quem?”
Eu, a tábua, e mais ninguém -
“E a roupa pra passar?”
Ah, deixa pra lá
Hoje eu não vou precisar do terno
Me passa a tábua e me deixa relaxar…
E que tudo mais vá pro inferno
Estou a dois passos do paraíso …
Eu e a tábua de passar
Batalhando no front da guerra do cotidiano
Procuro uma trégua na linha do horizonte
E encontro um oceano
Às vezes me sinto um peixe fora d’água e de repente começo a chorar
Mas agora eu vejo tanta água aqui na minha frente que eu nem sei por onde começar
“Por onde eu vou entrar, pescador?” (-Ah, sei lá!)
Então eu vou no instinto, pego uma tábua e vâmo vê o que que dá
Começo a remar
E no começo eu levo onda na cabeça sem parar
O sufoco é passageiro
Mas eu fico sempre alerta feito um escoteiro
Porque o mar é traiçoeiro
E eu amo o mar, mas odeio esse cheiro
De leptospirose, hepatite, isso é o que não falta
Devia ter vindo com uma roupa de astronauta
Porque se eu caio dessa tábua
Eu tomo um caldo dessa onda e um gole dessa água
Estou a dois passos do paraíso…
Eu e a tábua de passar
Se o mar virar sertão e o sertão virar mar eu vou morar lá no sertão com a minha tábua de passar
Porque isso aqui tá muito bom, isso aqui tá bom demais - “…Atrás!!!!”
Devia ter visto minha cara de emoção: eu e a tábua por dentro do salão
Queria tirar uma foto quando o jato espirrou
Pra mostrar pros meus filhos, que lindo, pô…
Pelo menos em algum lugar eu me sinto em paz
Longe dos problemas banais
Preciso respirar um pouco
Navegar é preciso, senão eu fico louco
A maré não tá pra peixe lá fora do mar
Mas quem tá na água é pra se molhar
E eu vou em frente
Remando contra a corrente
Só pra exercitar
E nos caldos que a vida me dá
A minha tábua de salvação é a minha tábua de passar
“Longe da terra, perto da água, dentro do mar…
Longe da guerra, eu e a tábua, eu e a tábua de passar…”
Dizem que aqui tem tubarão
Mas minha mulher veio me buscar com o ferro quente na mão
Tá me chamando lá na beira
E eu aqui até agora esperando a saideira
Estou a dois passos do paraíso …
Eu e a tábua de passar
Após procurar bastante na internet de como instalar o Firefox, plugins Java e Flash no Debian, eu encontrei a solução.
Vou compartilhar.
adicionando repositórios
Abra um terminal como root e digite:
echo "deb http://ftp.br.debian.org/debian/ etch main contrib non-free" >> /etc/apt/sources.list
troque “etch” pela versão que estiver usando.
atualize o apt:
aptitude update
Instalando o firefox
Por causa de alguns problemas com licenciamento, o projeto Debian mudou o nome do Firefox para Iceweasel. Para proceder com a instalação digite:
aptitude install iceweasel iceweasel-l10n-pt-br
Feito isso, seu navegador iceweasel (em português do Brasil) estará em Aplicações/Internet.
Instalando o Flash Player
aptitude install flashplayer-mozilla
Instalando o plugin JAVA
aptitude install sun-java5-jre sun-java5-fonts sun-java5-bin sun-java5-plugin
Pronto!
Fonte: http://wiki.forumdebian.com.br/index.php/Firefox_com_extens%C3%B5es%2C_plugins_do_Java_e_flash
Timer C#
Abril 30, 2008
Hoje vou mostrar como trabalhar com o componente Timer no C#.
O objetivo desse exemplo é gerar TextBox dinamicamente a cada X segundos. Para isso é usando o componente Timer.
Construa um form como o seguinte:
Você deve construir um form com os componetes exibidos na imagem acima (clique para ampliar a imagem). Os componentes usados nesse form são GroupBox, Label, NumericUpDown e Button. Os nomes em vermelho são a propriedade name que deve ser definida para cada componente.
Quando você clica em cima do componente Timer, ele não aparece dentro do form, fica na parte inferior. Esse tipo de componente não é visível.
A ideia desse form é você informar quantos TextBox deve ser criado e a quantos segundos. Quando você clicar no botão Iniciar começa a criação das TextBox dinamicamente. Quando você clica no botão Parar o Timer será parado e não será mais gerado TextBox. As TextBoxs são criadas dentro do elemento groupBoxTextBox, desta forma implementei o botão limpar para zerar o conteúdo do groupBoxTextBox.
Vamos criar o código para tudo funcionar e depois vemos como a sintaxe funciona.
Dê dois clique no botão Iniciar e digite o seguinte código:
private void buttonIniciar_Click(object sender, EventArgs e)
{
int segundos = System.Convert.ToInt16(numericUpDownSegundos.Value);
timerTextBox.Stop();
timerTextBox.Interval = (int)segundos * 1000;
timerTextBox.Tick += new EventHandler(timerEvent);
timerTextBox.Start();
}
Agora dê dois cliques em cima do botão Parar e digite o código abaixo:
private void buttonParar_Click(object sender, EventArgs e)
{
timerTextBox.Stop();
}
Dê dois clique no botão limpar e adicione o código abaixo:
private void buttonLimpar_Click(object sender, EventArgs e)
{
groupBoxTextBox.Controls.Clear();
}
Crie um novo método chamado timerEvent logo abaixo do método buttonLimpar_Click, o método timerEvent deve ficar da seguinte forma:
private void timerEvent(Object sender, EventArgs e)
{
int criar = System.Convert.ToInt16(numericUpDownTextBox.Value);
for (int i = 0; i < criar; i++)
{
TextBox minhaTextBox = new TextBox();
minhaTextBox.Height = 20;
minhaTextBox.Width = 250;
minhaTextBox.Location = new Point(10, 15 + (minhaTextBox.Height * groupBoxTextBox.Controls.Count));
minhaTextBox.Text = "TextBox #" + groupBoxTextBox.Controls.Count;
groupBoxTextBox.Controls.Add(minhaTextBox);
}
}
Pronto! Agora só pressionar F5 e ver a aplicação funcionado.
Vamos enteder como tudo funciona.
No botão Iniciar temos os seguintes códigos:
int segundos = System.Convert.ToInt16(numericUpDownSegundos.Value);
timerTextBox.Stop();
timerTextBox.Interval = (int)segundos * 1000;
timerTextBox.Tick += new EventHandler(timerEvent);
timerTextBox.Start();
Na ordem, o método System.ConvertToInt16 converte o valor do campo número de segundos para inteiro. Depois executamos timerTextBox.Stop() isso faz que o timerTextBox sempre pare, com o objetivo de parar uma execução atual do Timer. O método Interval define que o Timer deve executar suas funções em tempos em tempos, esse valor é dado em milesegundos. O método Tick chamada uma função a cada intervalo definido, nesse exemplo é chamado o método timerEvent e por fim timerTextBox.Start() coloca o timer para funcionar.
O código do método timerEvent:
int criar = System.Convert.ToInt16(numericUpDownTextBox.Value);
for (int i = 0; i < criar; i++)
{
TextBox minhaTextBox = new TextBox();
minhaTextBox.Height = 20;
minhaTextBox.Width = 250;
minhaTextBox.Location = new Point(10, 15 + (minhaTextBox.Height * groupBoxTextBox.Controls.Count));
minhaTextBox.Text = "TextBox #" + groupBoxTextBox.Controls.Count;
groupBoxTextBox.Controls.Add(minhaTextBox);
}
Esse cara obtém quantos elementos deve ser criados no intervalo de segundos definido, nessa parte criamos um TextBox dinamico e colocamos esse elemento dentro do groupBoxTextBox execuntado a sintaxe:
groupBoxTextBox.Controls.Add(minhaTextBox);
Nesse método é usado:
groupBoxTextBox.Controls.Count
Essa sintaxe retorna apenas a quantidade de elementos que existe atualmente dentro do groupBoxTextBox, é usado para definir a possíção de exibição das TextBoxs criadas.
Entendendo o código dos botões Parar e Limpar:
private void buttonParar_Click(object sender, EventArgs e)
{
timerTextBox.Stop();
}
private void buttonLimpar_Click(object sender, EventArgs e)
{
groupBoxTextBox.Controls.Clear();
}
A sintaxe timerTextBox.Stop(); para o Timer, assim o Timer não executa mais. A sintaxe groupBoxTextBox.Controls.Clear(); remove tudo que existe dentro do groupBoxTextBox.
Legal!
Amanhã é o lançamento da nova versão do Ubuntu a versão 8.04.
Hoje de madrugada já vou deixar o PC atualizando, estou louco para ver as novas novidades.
Eu sou muito grato ao Ubuntu é uma ótima distribuição Linux, eu sou desenvolvedor e esse sistema operacional otimiza e simplifica muito a minha vida.
Essa nova versão do Ubuntu vem com o Gnome 2.22, Kernel 2.6.24, Xorg 7.3, já vem com o Firefox 3 beta 5, cliente de torrent e uma série de coisas bacanas que vou descobrir amanhã… hehehe…
Uhuh…
