sexta-feira, 23 de março de 2012

Doces que eu comia na infância e não como mais...

Vamos falar do passado (de novo)?

Só que agora, vamos relembrar os doces de antigamente (afinal, amargo basta o jiló). :)

Alguém se lembra de um pirulito mastigável chamado Zorro?


Pois é, ele era feito aqui em Campinas na atual fábrica da Arcor que fica perto de Barão Geraldo (a título de curiosidade).

E das balas Chita? (sim, é a bala da macaca do Tarzan :P )


Poxa, agora lembrei que, na hora do recreio na escola, comia bastante aquele arroz em flocos doce (era puro áçucar, mas era bom pra caramba...)


E eu também comprava, na cantina desta mesma, aqueles saquinhos de doce-de-leite que a gente chupada (sem sacanagem, pessoal :P )...


Alguns chamavam de chup-chup, era doce pra diabo, mas era baratinho (na época, acho que custava uns Cr$ 1000,00 -- para quem não sabe, esta é a abreviação de Cruzeiro, antiga moeda do Brasil). :)

E tinha os lanches Mirabel que, de vez em quando, a gente trazia na lancheira...



Claro que tinha mais coisas como Dip'n Lik, pirulito no formato de chupeta, pipocas Nhac, chocolates Pan (guarda-chuva, moeda, cigarro), mas estes acima marcaram mais a minha infância. :)

Até mais!

quinta-feira, 22 de março de 2012

Criando aplicações iPhone no MS-Windows com MobiOne

A coisa que mais complica um programador que queria criar aplicações iOS, é o fato de que, para desenvolver estas, é preciso ter o XCode instalado em um MacOSX (não há versões desta ferramenta para MS-Windows ou GNU/Linux ...)

Mas pensando nestas pessoas, a Genuitec criou um framework de desenvolvimento chamado MobiOne Studio.

Ele é uma ferramenta completa, com componentes visuais, interface drag n'drop e um emulador de iPhone embutido.

Para mais informações, entre no site:
http://www.genuitec.com/mobile/index.html

Parece que, basicamente, ele usa a mesma estratégia do PhoneGap (HTML 5, CSS e Javascript)

Obs.: Ele é uma ferramenta paga, mas dá para testar usando a versão trial por 15 dias.

Até mais!

quarta-feira, 21 de março de 2012

Dicas de Programação: Como instanciar uma variável dentro de uma função em C?

Não sei se isso ajuda muita gente... Mas, para instanciar uma variável em uma função de C, pode-se fazer assim:

#include <stdio.h>
#include <stdlib.h>
//Tipo "registro": estrutura que possui uma variavel id do tipo inteiro
typedef struct registro
{
int id;
} registro;

//Função que recebe um ponteiro de um ponteiro da estrutura "registro"
void iniciarRegistro(registro** reg)
{
       //Aloco memória para a estrutura "registro"
      *reg = (registro*) malloc(sizeof(registro));
      //Seto o id como 10
      (*reg)->id = 10;
}

//Função principal
int main(int num_args, char** arg)
{
     //Objeto r do tipo "registro", sem instância (NULL)
      registro* r = NULL;
     //Chamo a função para instanciar r (passo r como paramêtro)
      iniciarRegistro(&r);
     //Escrevo o valor na tela (10)
      printf("Registro ID: %d\n", r->id);
     //Libero memória
      free(r);
     //Termino a aplicações com status OK
      return 0;
}

E não é que funciona mesmo? :P

Até mais!

terça-feira, 20 de março de 2012

Alguém já jogou Aquaplay?


Me lembro que, antigamente, o video-game era coisa de rico, e que alguns poucos possuiam... (era como o telefone fixo que, na época, custava quase um carro novo!!!)

Por isso, para maior parte das crianças (incluindo eu :P ), o que dava para jogar eram os jogos de tabuleiros e um brinquedo chamado Aquaplay.

O Aquaplay era um tipo de jogo onde o jogador (ou jogadores, dependendo do Aquaplay), através de um botão, tentava mexer certos objetos que estavam submersos na água, tendo como objetivo coloca-los ou atravessa-los em um determinado lugar da "tela"...

Era muito divertido, principalmente quando a gente jogava em dois, pois cada um apertada um botão em um mesmo aparelho (era como se existisse um mesmo "joystick" para os dois jogadores...).

Poxa, acho que quebrei uns dois Aquaplay de tanto apertar o botão... :P

Até mais!

segunda-feira, 19 de março de 2012

TotalCross: Java para iOS?

Alguém se lembra de um framework de Java para Palm chamado SuperWaba?
Sim? Então você é um programador tão antigo quanto eu... :)

Pois é, o tempo passou e as coisas evoluiram: o Palm já era, o iPaq também... E, hoje em dia, a moda é iPhone e Android...

Mas o SuperWaba também evoluiu... Agora ele chama TotalCross e funciona para iPhone e Android:
http://www.superwaba.com.br/pt/tc_overview.asp

Esta ferramenta possui uma VM (Virtual Machine ou Máquina Virtual) própria que interpreta código compilado Java e roda em diversas plataformas (cada uma com sua VM, lógico... :P )

Interessante, porém parece que a ferramenta não é oficializada pela Apple (no caso do iOS...).

Mas não custa experimentar... :)

Até mais!

sábado, 17 de março de 2012

Dicas de Programação: Como programar em Objective-C sem um Mac?

Fácil, usando o compilador GCC com o Objective-C ativo.

Para saber mais, você pode ir ao site da GNU:
http://gcc.gnu.org/
Como este compilador geralmente vem em sistemas Like-Unix não é preciso baixa-lo (talvez, baixar o "modulo" para Objective-C, mas acho que dá para fazer via apt-get ou outro "gerenciador"...)

Agora, para o MS-Windows, você pode obter a ferramenta baixando deste site:
http://www.mingw.org/
O MinGW é um conjunto de ferramentas de desenvolvimento da GNU para o sistema MS-Windows (que inclui o gcc).

Não tem mais desculpa de aprender esta linguagem...

Agora, se dá para criar aplicativos para iOS em outro sistema operacional que não for o da Apple, isso é outra história...

Pelo menos, é meio caminho andado. :)

Até mais!

sexta-feira, 16 de março de 2012

Spring for Android

Muito se fala do Spring para desenvolvimento web, mas você sabia que existe um Spring feito especialmente para Android?

Pois é, ele existe e esta disponível no site oficial do framework:
http://www.springsource.org/spring-android

Obs.: Agora, quem esta acostumado em trabalhar com o Spring no servidor não tem mais do que reclamar... :P

Até mais!

quinta-feira, 15 de março de 2012

Dicas de Programação: Como fazer uma animação com Javascript?

Pois é, vou fazer um animação com Javascript, mas no HTML 4 e CSS 2... (ainda preciso me atualizar...)

Vamos aos passos:

Primeiramente, vamos obter uma imagem com sprites que serão trocadas para obter o efeito de "movimento" do objeto:

©D-Grafix 2006

Depois, vamos criar o html da seguinte maneira:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<title>Walker</title>
</head>
<body>
<div id="walker"></div>
</body>
</html>


Agora, vamos criar o estilo para exibir a imagem acima (que possui o tamanho original de 750 pixels por 366 pixels) no div com id igual ao "walker" e definir o tamanho deste div para 150 pixels por 183 pixels (que é o tamanho de um sprite):

...
<head>
<style>
div#walker {
    background-image: url("walk_side.jpg");
    background-repeat: no-repeat;
    background-position: 0px 0px;
    width: 150px;
    height: 183px;
    position: absolute;
    left: 0px;
    top: 0px;
}
</style>

...


Com isso, a primeira parte da figura deve ter aparecido...
Para executar o efeito, vamos criar uma função que muda a posição da imagem para exibir cada sprite:

...
<script>
//Posições iniciais
var x = 0;
var y = 0;

//Função que troca a posição da figura e mostra um determinado sprite
function trocaSprite() {
   //Obtenho o valor atual da posição da imagem de fundo
   var position = document.getElementById('walker').style.backgroundPosition;
   //Se ela existir...
   if (position) {
       //Obtenho os novos valores x e y através de uma string (os valores estão separados por espaço)
       var pos = position.split(' ');
       //Garanto que existem dois valores (x e y)
       if (pos.length == 2) {
          //Calculo nova posição x (-150 pixels, que é a largura de cada sprite na imagem)
          x = parseInt(pos[0]) - 150;
          //Se ela for menor ou igual que -750 pixels é que a imagem acabou (tamanho máximo)
          if (x <= -750) {
               //Então reinicio a posição x
               x = 0;
              //Se a posição y for 0 pixel, troco o valor para -183 pixels (que é a parte debaixo da imagem), se for -183 pixels, volto a posição y para 0 pixel
               y = (y == 0 ? -183 : 0);
           }
       }
   }
   //Altero o valor da posição da imagem de fundo
  document.getElementById('walker').style.backgroundPosition = x + 'px ' + y + 'px';
}
</script>
...

Fora desta função, colocamos ela para ser executada a cada 100 milisegundos através da função setInterval:

...
<script>
setInterval(trocaSprite, 100);
</script>
...

Legal! Agora, se quiser que ele "ande" para frente, é só mudar a posição do div com a propriedade left  e colocar esta instrução abaixo do backgroundPosition:

...
   //Altero o valor da posição da imagem de fundo
  document.getElementById('walker').style.backgroundPosition = x + 'px ' + y + 'px';
 //Mudo a posição do div "walker" de 10 em 10 pixels
  document.getElementById('walker').style.left =
   (parseInt(document.getElementById('walker').offsetLeft) + 10) + 'px';
...

Ufa, deu trabalho mas foi... :)

Até mais!

quarta-feira, 14 de março de 2012

Dicas de Programação: Como executar um javascript no iOS?

Para executar um javascript no iOS, basta criar uma instância/objeto da classe UIWebView e chamar o método stringByEvaluatingJavaScriptFromString.
Vamos ao exemplo:

//Reescrevendo o método viewDidAppear da classe UIViewController (controle da tela)
- (void) viewDidAppear:(BOOL)animated
{
    //Chamando o método da classe herdada (pai)
    [super viewDidAppear: animated];
    //"Aloca memória" - Instância o objeto
    UIWebView* webView = [[UIWebView alloc] init];
    //Abre uma caixa de prompt (javascript)
    NSString* address = [webView stringByEvaluatingJavaScriptFromString: @"prompt('Entre com um IP:')"];
    //Loga o valor da variável address
    NSLog(@"%@", address);
    //"Desaloca memória"
    [webView release];
}

Simples não? O mais legal é que dá para carregar uma página e percorrer ela pelas funções DOM:

...
@synthesize  webView;
...
- (void) viewDidLoad
{
     //Chamando o método da classe herdada (pai)
     [super viewDidLoad];
     //Instância para o objeto webView
     webView = [[UIWebView alloc] init];
     //Objeto instanciado url
     NSURL* url = [NSURL URLWithString: @"http://blogdotakemura.blogspot.com"];
     //Objeto instanciado request
     NSURLRequest* request = [NSURLRequest requestWithURL: url];
     //Setando o objeto que implementa o protocolo UIWebViewDelegate
    self.webView.delegate = self;
    //Carregando a página da URL
    [self.webView loadRequest: request];
}
...
//Método implementado do protocolo UIWebViewDelegate
- (void) webViewDidFinishLoad: (UIWebView*) wv
{
    NSString* titulo  = [self.webView stringByEvaluatingJavaScriptFromString: @"document.getElementsByTagName('h1')[0].innerHTML"];
    NSLog(@"%@", titulo);
}
...
- (void)viewDidUnload
{
       [super viewDidUnload];
       self.webView = nil;
}
...

Até mais!

terça-feira, 13 de março de 2012

A galinha, o porco e o boi

Um dia, a galinha, sem fazer nada, ficou pensando:
"Quem será o animal mais útil para o homem?"
Ficou pensando, pensando e pensando... E como não concluiu nada, resolveu perguntar ao porco:
"Porco" -- indagou a galinha -- "quem você acha que é o animal mais útil ao homem?"
"Claro que sou eu!" -- falou o porco com orgulho e convicçāo.
"Por que?" -- perguntou a galinha, meio indignada.
"Por causa que sirvo para muitas coisas ao homem... Sou muito usado para pesquisas cientificas e minha carne é saborosa! O bacon que o homem tanto gosta, vem de mim!" -- respondeu o porco, com certo ar de arrogância.
"Hum...  É verdade..." -- falou a galinha, já acreditando na conversa do porco.
Por fim, a galinha se convenceu que o porco realmente era o animal mais útil...
Porém, meses depois, ela viu o porco, chorando e suplicando ajuda, sendo levado ao abatedouro por um homem.
Depois disso, nunca mais se teve alguma notícia do porco...
E então, a galinha pensou:
"Se ele fosse tão útil ao homem, ele seria mais respeitado..."
E voltou aquela pergunta na pequena cabeça dela... Então, viu o boi, com toda a imponência que todo grande animal tem, e resolveu indagar a mesma pergunta que fez ao porco:
"Boi, quem você acha que é o animal mais útil ao homem?"
"Sou eu!" -- respondeu o boi, com aquela voz imponente -- "Sou forte, sou usado para puxar carroças e existem restaurantes especializados em minha carne, chamados 'churrascarias'".
Vendo um bicho imponente como aquele, a galinha não teve mais nenhuma dúvida que o boi era o animal mais útil para o ser humano!
Mas, no dia seguinte, viu o mesmo boi "imponente", desesperado e pedindo clemência, indo para o mesmo abatedouro onde o porco foi...
E nunca mais se viu o boi...
A galinha concluiu que se o boi fosse importante para o homem, ele também seria respeitado...
E em sua caminhada, viu o cachorro que abanava seu rabo e acompanhava o homem...
Porém, em vez de fazer a mesma pergunta que fez aos outros dois animais, ela se questionou:
"O cachorro só dorme, come, brinca e acompanha o homem em suas caminhadas... Não parece um animal importante..."
E assim, logo após esse pensamento, conclui que ela era o animal mais importante ao homem!
"Minhas penas fazem colchões, eu acordo o homem de manhã para trabalhar, minha carne é de baixa caloria, meus ovos tem alta quantidade de proteínas... Então, só pode ser eu mesma, o animal mais importante ao homem!"
Com muito orgulho, a galinha andava, agora, com a cabeça erguida e 'se achando...'
Contudo, um dia, um homem chegou ao galinheiro, pegou a galinha com força e a estava levando ao mesmo abatedouro onde o boi e o porco nunca mais foram vistos...
Ela, desesperada, esperneou e começou a bicar o homem...
Ele se zangou muito com a galinha e, antes mesmo de chegar lá, o homem havia quebrado o seu pescoço...
E o cachorro, que acompanhava o homem, lambia sua mão e pulava de lá para cá...

segunda-feira, 12 de março de 2012

Alguém se lembra do Super Trunfo?


Antes do famoso card game "Magic: The Gathering", existia (e existe ainda :P) um outro jogo de cartas que a molecada da minha época (hoje, estas pessoas devem ter seus 35/36 anos...) jogada incessantemente, chamado "Super Trunfo".

O jogo consistia num baralho (dã..., jogo de cartas :P) em que eram distribuídas as cartas (viradas para baixo, para não exibir os valores dos atributos) para os jogadores. Depois da distribuição, o jogador da vez escolhia um atributo da primeira carta virada para cima, e comparava-se este atributo com as demais cartas dos outros jogadores. Ganhava a rodada, o jogador com o maior valor do atributo escolhido (no caso, ele recebia as cartas dos adversários -- pelo que me lembre... :P).

O jogo terminava quando sobrava um único jogador com todas as cartas.

Me lembro que tinha uma carta especial chamada "Super Trunfo" (daí o nome do jogo) que, eu acho, quando o jogador da vez estiver com ela no topo de seu baralho, ele pode apenas dizer "Super Trunfo" e rapelar as cartas da rodada (não tenho certeza desta regra...).

Mas o importante é que o jogo, depois de anos, ainda esta disponível.

Mais informações no Wikipédia:
http://pt.wikipedia.org/wiki/Super_Trunfo

E no site da Grow:
http://www.grow.com.br/

Até mais!

domingo, 11 de março de 2012

Relembrando o passado: Músicas dos anos 80!


Para muita gente que não sabe, eu nasci há 4 décadas atrás (sim, eu sou da década de 70, e sim, eu assisti o Bozo na TVS, canal 18, UHF em uma TV Phillips 20 polegadas em Preto e Branco...).

E como bom saudosista que sou (sabe, com o tempo, as pessoas como eu sempre relembram do passado e sempre acham que aquele tempo as coisas eram melhores -- o que raramente é verdade, pois a gente tende a só se lembrar das coisas boas que aconteceram... :P) me lembrei de algumas coisas hoje.

Me lembrei dos tempos de escola, quando a turma se reunia para fazer pesquisa/trabalho na biblioteca (acredite, existe uma Biblioteca Municipal em Campinas e ela fica atrás da Prefeitura).

Me lembrei das Olimpíadas Escolares e dos times Azul, Amarelo e Verde.

E me lembrei das músicas que tocavam na minha adolescência. :)

Assim, um dia desses, meio sem querer, achei uma coletânea que me deixou mais saudosista...

A coletânea dos Anos 80, publicada pela Som Livre.

Muito bom, matei a saudades de um monte de músicas! :)

Só faltou Technotronic, Paula Abdul e Loco Mía (esta certo, não são as melhores coisas daquele tempo, mas era "modinha" e eu era adolescente...).

As músicas dos 4 discos do primeiro volume:
  • Take On Me – A-ha
  • Don't You ( Forget About Me ) – Simple Minds
  • Who Can It Be Now – Men at Work
  • Owner of a Lonely Heart – Yes
  • Total Eclipse of the Heart – Bonnie Tyler
  • Everybody Wants to Rule the World – Tears for Fears
  • Boys Don't Cry – The Cure
  • Footloose – Kenny Loggins
  • 99 Red Balloons – Nena
  • Save a Prayer – Duran Duran
  • Time After Time – Cyndi Lauper
  • Everybody Have Fun Tonight – Wang Chung
  • Don't Get Me Wrong – The Pretenders
  • Tainted Love – Soft Cell
  • The Boy with the Thorn in His Side – The Smiths
  • Legal Tender – The B-52's
  • Let's Dance – David Bowie
  • Eyes without a Face – Billy Idol
  • Bette Davis Eyes – Kim Carnes
  • Wake Me Up Before You Go Go – Wham!
  • The Power of Love – Huey Lewis and the News
  • Head Over Heels – Go-go's
  • Walk Like an Egyptian – Bangles
  • Stay – Oingo Boingo
  • Broken Wings – Mr. Mister
  • New Sensation – Inxs
  • Bizarre Love Triangle – New Order
  • U Can't Touch This – Mc Hammer
  • Let's Stay Together – Tina Turner
  • Ride Like the Wind – Christopher Cross
  • Gloria – Laura Branigan
  • Eye of the Tiger – Survivor
  • I Can Dream About You – Dan Hartman
  • Never Gonna Give You Up – Rick Astley
  • Breakout – Swing Out Sister
  • All Night Long ( All Night ) – Lionel Richie
  • Do You Really Want to Hurt Me – Culture Club
  • Nothing Compares 2 U – Sinead O'connor
  • Wishing Well – Terence Trent D'arby
  • What's On Your Mind – Information Society
  • Da da da – Trio
  • Love Missile F1-11 – Sigue Sigue Sputnik
  • Don't Worry Be Happy – Bobby Mcferrin
  • Somebody Else's Guy – Jocelyn Brown
  • I Like Chopin – Gazebo
  • Maria Magdalena – Sandra
  • Safety Dance – Men without Hats
  • Der Kommissar – Falco
  • New York New York – Nina Hagen
  • Still Loving You – Scorpions
  • The Lady in Red – Chris de Burgh
  • Holding Back the Years – Simply Red
  • Oh L'amour – Erasure
  • Listen to Your Heart – Sonia
  • The Power – Snap
  • Get Ready for This – 2 Unlimited

E as músicas do segundo volume:
  • Girls Just Want to Have Fun – Cindy Lauper
  • Centerfold – J. Geils Band
  • Here Comes the Rain Again – Eurythmics
  • Sowing the Seeds of Love – Tears for Fears
  • Africa – Toto
  • What's Love Got to do with It – Tina Turner
  • Hold Me Now – Thompson Twins
  • Don't Stop Believin' – Journey
  • We Builty This City – Starship
  • Come On Eillen – Dexy's Midnight Runners
  • She Drives Me Crazy – Fine Young Cannibals
  • One On One – Daryl Hall & John Oates
  • Bad Boy – Miami Sound Machine
  • Right Between the Eyes – Wax
  • Dancing with Myself – Billy Idol
  • Modern Love – David Bowie
  • The Reflex – Duran Duran
  • You're the Voice – John Farnham
  • Kayleigh – Marillion
  • Karma Chameleon – Culture Club
  • Wild Wild Life – Talking Heads
  • Too Shy – Kajagoogoo
  • Blue Monday – New Order
  • A Little Respect – Erasure
  • We Got the Beat – The Go-go’s
  • Bigmouth Strikes Again – The Smiths
  • Chamber of Hellos – Wire Train
  • Major Tom – Peter Schilling
  • The Way It Is – Bruce Hornsby & the Range
  • True – Spandau Ballet
  • Talking in Your Sleep – The Romantics
  • Winning – Santana
  • Overkill – Men at Work
  • When All's Well – Everything But the Girl
  • Walking On Sunshine – Katrina & the Waves
  • Maniac – Michael Sembello
  • 9 to 5 – Dolly Parton
  • Live Is Live – Opus
  • Puttin' On the Ritz – Taco
  • She Blinded Me with Science – Thomas Dolby
  • Always Something There to Remind Me – Naked Eyes
  • Axel F – Harold Faltermeyer
  • Steppin' Out – Joe Jackson
  • While You See a Chance – Steve Winwood
  • Heat of the Moment – Asia
  • Inbetween Days – The Cure
  • It's My Life – Talk Talk
  • Jeopardy – Greg Kihn Band
  • Heart and Soul – Huey Lewis and the News
  • Caribbean Queen – Billy Ocean
  • Sexual Healing – Marvin Gaye
  • Up Where We Belong – Joe Cocker – Jennifer Warnes
  • The Tide Is High – Blondie
  • Sunshine Reggae – Laid Back
  • Smalltown Boy – Bronski Beat
  • Don't Go – Yazoo

Valeu Som Livre, pelas coletâneas (comprei as duas)! :D

Se ainda vendem? Não sei, mas qualquer coisa, dêem uma passada no site da empresa:
http://www.somlivre.com/

Obs.: Não, a Som Livre não me pagou nada e eu não ganho nada com esta divulgação...

Até mais!

sábado, 10 de março de 2012

Application Craft: Desenvolvendo aplicações nas nuvens!


Muito se fala em Cloud Computing, em HTML5 e em Mobile, todas tecnologias "novas" onde a maioria das empresas desta área estão começando a se interessar...

Pensando nisso, surgiram algumas ferramentas de desenvolvimento Web nas nuvens, e dentre elas esta o Application Craft.

 O Application Craft é uma ambiente de desenvolvimento nas nuvens, ou seja, você programa literalmente em um navegador, para criar aplicações web para diversos dispositivos e/ou sistemas operacionais.

A idéia parece muito legal e o mais interessante é que parece que ela usa o conceito de Responsive Web Design (RWD), onde a responsabilidade de "renderização" da aplicação é do ambiente na qual o sistema esta sendo usado (tipo de navegador, tamanho da janela, sistema operacional, etc).

Quer saber mais? Clique no link abaixo:
http://www.applicationcraft.com/

Até mais!

quinta-feira, 8 de março de 2012

Crie aplicativos móveis "sem programar" com Smartface

Pois é, mais um framework para criação de aplicativos móveis "multiplataforma"... :P

O interessante desta ferramenta é que o desenvolvimento de uma aplicação ocorre de maneira inteiramente visual, sem a necessidade prévia de conhecer uma linguagem de programação.

Mas como toda ferramenta visual, os recursos são restritos, porém acho que dá para fazer algumas coisas interessantes com ela... :)

Para mais informações e download da ferramenta, acesse o endereço abaixo: http://developer.smartface.biz/

A versão disponível tem suporte ao Android e J2ME (iOS esta previsto na próxima versão, a 3.0).

Obs.: Ainda não cheguei a testar, mas quando der um tempo, vou dar uma olhada...

Até mais!

quarta-feira, 7 de março de 2012

Dicas de Programação: Como executar um Javascript dentro de um Javascript?

O título ficou meio estranho, mas acho que deu para entender... :P

Penso que todo programador, com alguns anos de prática, já sentiu a necessidade de fazer o seguinte comando:

var script = "<script> alert('Erro: Número inválido'); </script>";
document.write(script);

O problema é que isso não funciona na maioria dos navegadores, por causa das políticas de segurança. (alguém já ouviu falar de code injection? :P)

Mas para isso, sempre existe um jeitinho... (não que isso seja o certo, mas funciona :) )

O  problema do código acima, é que a tag <script> é inválida dentro das instruções javascript...
Mas se eu fizer esta instrução assim:

document.write("<scr" + "ipt> alert('Erro: Número inválido'); </scr" + "ipt>");

Ela vai funcionar!

O que acontece é que o javascript é uma linguagem interpretada, e como a tag "script" esta dividida em duas "strings" ("scr" + "ipt"), este não consegue identificar e com isso, a instrução passa sem nenhum bloqueio!

Obs.: Não sei até quando esta "facilitação" (para não falar de gambiarra...) vai existir, mas pelo que testei, ainda esta valendo. :)

Até mais!

terça-feira, 6 de março de 2012

Detonando jogos antigos

Sinto saudades daqueles jogos antigos com vidas limitadas, de controles com no máximo 6 botões e com dificuldade moderada... (para que já jogou Donkey Kong Country, estou parecendo aquele velho gorila do jogo Donkey Kong -- eu acho que ele se chama Krang...)

E quando vi um "detonado" do Castle of Illusion, do Mega Drive, no Youtube fiquei emocionado... :P

Um grupo que se auto-denomina "Elite Clássicos" está fazendo um grande trabalho de "let's play" de jogos antigos.

Muito bom, principalmente para caras como eu que, de vez em quando, sente saudades deste tipo de jogo.

Aos mais novos, que leêm este blog, recomendo ver só para saber como nós, os tiozões, jogavamos naquela época. :)

O link para o canal:
http://www.youtube.com/user/EliteClassicos

Obs.: As mesmas coisas de sempre: não começo o pessoal e não faço a mínima idéia de quem são.

Até mais!

segunda-feira, 5 de março de 2012

Dicas de Programação: Como fazer um serviço web em Java com socket?

Não, não vou implementar a especificação do J2EE em um "post" não (mesmo se eu tivesse tempo, acho que a explicação ficaria grande demais para isso...). :P

Mas você, implementador Java, já se perguntou como um servidor de páginas é feito?

Eu já, e por isso tentei implementar um pequeno "serviço" web em J2SE sem um servidor padrão (seja o Tomcat, o JBoss ou outro).

Vamos ao passos:

Primeiramente, eu pensei: preciso usar um ServerSocket para abrir conexão na rede na porta 8070 (por padrão, a porta do protocolo http é 80, mas preferi usar uma outra porta para evitar conflitos...).

public class Exemplo {
private ServerSocket server;

//Construtor da classe
public Exemplo() throws Exception {
       server = new ServerSocket(8070);
}
...
//"Destrutor da classe"
protected void finalize() {
      try {
           if (server != null) {
                server.close();
           }
     } catch (Exception e) {
           e.printStackTrace();
     }
}
}

Beleza! Depois disso, precisava que meu "servidor" sempre aceita-se a requisição de um cliente (por exemplo, um navegador) para esta porta e que minha aplicação "escreve-se" uma resposta para este... Como exemplo, fiz a resposta "padrão" para uma requisição do protocolo http de uma página web:

...
public void acceptAndResponse() throws Exception {
Socket client = server.accept();
String header = "HTTP/1.1 200 OK\n" +
        "Date: {0}\n" +
        "Server: Socket\n" +
        "Last-Modified: {0}\n" +
        "Accept-Ranges: bytes\n" +
        "Content-Length: {1}\n" +
        "Connection: close\n" +
        "Content-Type: text/html\n" +
        "\n"+
        "{2}";
Locale.setDefault(Locale.ENGLISH);
String now = new SimpleDateFormat("EEE, d MMM yyyy HH:mm:ss z").format(new Date());
String html = "\n" +
  "<html>\n"+
  "<head><title>Hello World!</title></head>\n" +
  "<body><h1>Hello World!</h1></body>\n" +
  "</html>\n";
String message = MessageFormat.format(header, now, String.valueOf(html.length()), html);
client.getOutputStream().write(message.getBytes());
client.close();
}
...

Mas, como eu teria que rodar isso continuamente, criei uma Thread para ficar eternamente executando a função acima...:

public class Exemplo implements Runnable {
...
public Exemplo() throws Exception {
       server = new ServerSocket(8070);
       Thread thread = new Thread(this);
       thread.start();

}
...
public void run() {   
       do {
            try {
                    this.acceptAndResponse();
            } catch (Exception e) {
                   e.printStackTrace();
            }
      } while (true);
}
...

E, no final, criei a função principal que chama tudo isso (está bem..., é o construtor que cria tudo, mas como era um teste, nem fiz questão de fazer um código "bonito"... :P ):
...
public static void main(String[] args) throws Exception {
       Exemplo e = new Exemplo();
}
...

Rodando a aplicação, eu fui ao navegador testar (endereço: http://localhost:8070) e, por incrivel que pareça, funcionou!

Legal, não?

Agora, quem reclamar da lentidão do Tomcat pode tentar fazer o seu servidor web. :)

Até mais!

quinta-feira, 1 de março de 2012

Um ano de blog e estou ficando velho... (continuação)

Percebi que se ficar falando de cada comentário, eu vou escrever um livro... :P

Portanto, agora, vou só citar as pessoas que é mais fácil... :)

Obrigado:

Aos anônimos, um que me deu um puxão de orelha no português e outro pelo dia do estagiário. :)
Ao Richardson, sobre os CMSs (valeu, estou precisando dar uma olhada :) )
Ao Elton, por me corrigir que um erro bobo de javascript.
Ao DizaumBR, é muito legal você comentar meu post, principalmente de uma coisa que você é que merece os parabéns!
Ao Black Wolf, que acho que é spam :P
Ao Cesar e sua família (sei que esta muito atrasado, mas parabéns pelo filhinho :) ).
Ao graU, a cerveja vou ficar devendo... (ainda não ganhei um dólar do ads...).
Denilson, valeu! Sou muito saudosista...
Nardão, o RPGMaker é clássico! :)
Renato, ainda não fiz um jogo decente...
Daniel, poxa... valeu cara!
[GM] Eduardo, preciso de um tempo para jogar... mas quem sabe um dia! :)

E aos outros que postaram e recomendaram este blog, meu muito obrigado!

Valeu pessoal!

Até mais! (e tomara que este ano dê mais tempo para postar mais coisas :P).