Jan 23

Google maps dentro do siteHá algum tempo eu li no Client Side elogios a um framework de javascript chamado Jquery. Então quando fui iniciar um novo projeto, resolvi testá-lo. É realmente impressionante o que se consegue fazer com ele. Mostra que programar pode ser divertido e simples.

Há, ainda, a possibilidade de usar plugins para complementar as funcionalidades dele. O que é ótimo, o limite do que você consegue fazer é a sua imaginação.

Infelizmente um problema em boa parte dos plugins é a documentação escassa. Tenho penado lendo comentários deixados dentro do código, e muitas vezes tendo que descobrir como usá-lo lendo o fonte. Talvez seja só azar, justamente nos plugins que usei isso acontece. O próprio JQuery é bem documentado, por exemplo. Saberei melhor no futuro.

No intuito de colaborar com os desenvolvedores e os interessados, eis um tutorial de como inserir um mapa do Google Maps no seu site (é o primeiro tutorial que faço, então o feedback será muito bem vindo. Com o tempo eu pego o jeito ;) ):

O efeito final é esse.

  1. Antes de começar é preciso criar uma chave para a API do Google Maps. Não é necessário cadastro, basta colocar a url do site no qual ela será usada nessa página. Ela serve para todo o domínio, inclusive subpastas. Se você tentar usar uma chave que não foi feita para o seu domínio ela não funcionará.
  2. Scripts necessários: são dois, o JQuery e o JMap2.
  3. O html: é necessário que o navegador esteja com o javascript habilitado para que o Google Maps funcione, então o html do exemplo é apenas a tag body:
    <!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Strict//EN” “http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd”>
    <html xmlns=“http://www.w3.org/1999/xhtml”>
    <head>
    <meta http-equiv=“content-type” content=“text/html; charset=UTF-8″ />
    <meta name=“author” content=“Leandro Facchinetti” />
    <script type=“text/javascript” src=“jquery-1.2.2.min.js”></script>
    <script type=“text/javascript” src=“http://maps.google.com/maps?file=api&v=2&key=sua_chave”></script>
    <script type=“text/javascript” src=“jquery.jmap2.js”></script>

    <script type=“text/javascript”>
    <!–
    //o código virá aqui
    –>
    </script>
    <title>Exemplo de colocação de mapas dentro do site com JQuery e JMap2</title>
    </head>
    <body>
    </body>
    </html>

    Atente para as importações de scripts. São três, o JQuery, a API do Google Maps e o JMap2. Lembre-se de mudar para a sua chave da API, onde diz “sua_chave” no código.
  4. Na parte onde está escrito “//o código virá aqui” é que escreveremos nosso código. Logicamente é preferível que você faça isso num documento externo e o importe, estou fazendo assim para simplificar.
  5. O código a ser inserido é este, veja os comentários para entendê-lo:
    $(function (){//sintaxe do JQuery para a função ser executada quando o DOM estiver pronto
    $("body").append("<a href=\"\">Clique aqui para ver no mapa</a>").children("a").click(function (){//aqui é colocado o link, não faria sentido colocá-lo no html porque quem não tivesse javascript ficaria com um link vazio. Após a colocação do link é associada uma função a ser executada quando ele é clicado
    $(this).slideUp("slow").after("<div id=\"mapa\" style=\"width:450px; height:320px; display:none; background-color:#e5e3df; \"").parent().children("div#mapa").slideDown("slow", function (){//é inserida uma div na qual irá o mapa. Atente para a colocação de atributos width e height, o mapa será do tamanho que você setar aqui. Depois da colocação vem a função do efeito que faz a div aparecer deslizando. Lógico que isso é opcional, fiz assim porque é mais estético
    $(this).jmap({//aqui é acolocação do mapa em si, dentro dessa função vai um objeto com as opções, não listarei todas, só as que julgo serem mais importantes
    mapCenter: [-27.608000, -48.53770],//as coordenadas da onde o mapa será aberto. Para descobrí-las entre no Google Maps, ache a região que lhe interessa e clique em "Criar link para esta página", observe a url gerada, procure por duas sequência de número logo no início, são elas que você deve colocar aqui
    mapZoom: 17,//nível de zoom do mapa quando aberto
    mapShowOverview: false,//mostrar pequeno mapa da região no canto inferior direito
    mapShowType: false//mostrar o tipo de mapa: mapa, satélite, terreno
    }).addMarker({//adicionar aquele marcador vermelho
    pointLat: -27.608450,//as coordenadas de onde o marcador deve ser criado
    pointLng: -48.53770,
    pointHTML: "<h3>Paralelo 22</h3><p>Praça Abdon Batista<br />Saco dos Limões - Florianópolis - SC</p>",//html a ser exibido no balão do marcador, é possível manipular a formatação desse html pelo css da página. Incrível, não? openHTMLEvent: "mouseover"//evento que dispara a abertura do marcador
    })
    })
    return false;//impedir a ação padrão do link
    })
    })
  6. Pronto, não é fantástico o que pode ser feito com tão pouco código?

Escrito por Leandro Facchinetti e publicado Quarta-feira, dia 23 de Janeiro de 2008.
tags: , , , ,

Jan 20

http://flickr.com/photos/marie-g/1223410820/A piada é perfeita, porque a maior parte não entende. E quem entende acha sem graça. É uma ótima oportunidade para rir sozinho e acrescentar um pouco de entropia no universo.

História real, algum tempo no passado:

- Vamos naquela montanha russa que tem dois loopings?

- Um while e um for?

Todos olham com cara de interrogação para o Leandro, que se mata de rir.

Escrito por Leandro Facchinetti e publicado Domingo, dia 20 de Janeiro de 2008.
tags: , ,

Jan 16

Retirado do Flickr: http://flickr.com/photos/monkey_pushover_tree/302618006/Estava programando no Flash, quando me vi com o seguinte problema: um objeto pai não passava o evento de botão para o filho. Isto é, um movie clip que tem associado um onRollOver, onRollOut ou onRelease captura todas as ações do mouse, dessa forma os botões que estão dentro dele não funcionam.

Minha primeira abordagem foi criar um movie clip por cima que mapeasse os botões, dessa forma ao clicar o mouse ele pegaria o evento. Mas esse movie clip tampa o objeto principal e estraga o evento onRollOver a ele associado.

Então, recorri à Deus. E Ele veio a mim. Encontrei esse site que explica o problema e sugere um par de soluções. Vou me ater a segunda porque é mais simples de implementar.

Para começar, porque o Flash age assim?

Quando é disparado um evento de botão, o Flash segue de objeto em objeto, tentando entregá-lo ao primeiro que puder lidar com ele. Ele segue a ordem de fora para dentro dos movie clips aninhados. Portanto o evento jamais chegará ao filho se o pai estiver associado a ele.

Não há maneira de alterar esse comportamento padrão com ActionScript 2. Não sei se existe jeito com AS3, porque como quero publicar o arquivo para versões antigas do Flash Player, nem fui atrás.

Então, o que fazer?

A solução proposta é usar, no lugar, os eventos onMouseDown, onMouseUp e onMouseMove para recriar o comportamento de um botão. Diferente dos eventos de botão, eles são passado a todos os objetos da cena. Assim, é necessário apenas checar se o mouse está sobre o botão quando clicado para disparar a ação, isso pode ser feito com um simples hitTest:

mc_pai.onRollOver = function (){
//comportamento do pai
}
mc_pai.mc_filho.onMouseUp = function (){
if (this.hitTest(_root._xmouse, _root._ymouse)){
//comportamento do filho
}
}

Limpo e eficiente, está superada a limitação do Flash em gerenciar esses eventos.

Escrito por Leandro Facchinetti e publicado Quarta-feira, dia 16 de Janeiro de 2008.
tags: , , ,

Jan 15

Retirado do Flickr: http://flickr.com/photos/lwr/1378672867/Quando você vir um relógio parado comente:

- Um relógio parado é melhor que um funcionando. É impossível acertar perfeitamente um relógio que funciona, assim ele nunca marca a hora certa. Já um relógio parado marca a hora certa duas vezes por dia.

Diga como se tivesse acabado de chegar a essa conclusão. Você vai soar como alguém inteligente e espirituoso. Alguns podem até achar que você é uma pessoa profunda, se não repararem que apenas disse uma grande besteira.

Escrito por Leandro Facchinetti e publicado Terça-feira, dia 15 de Janeiro de 2008.
tags: , ,

Jan 13

Retirado do Flickr: http://flickr.com/photos/toniblay/52445415/No verão passado eu me interessei por um cubo de Rubik (também conhecido por cubo mágico), que estava jogado no armário há muito tempo. Talvez você não imagine, mas há muita matemática e lógica por trás desse brinquedo. Existem, inclusive, cubos diferentes do modelo 3X3, com o qual estamos acostumados. São os de 2X2, 5X5, em pirâmide, esférico(!), enfim, para todos os gostos.

Como eu não vejo graça em ficar na tentativa e erro até acertar, fui estudar os métodos de resolução. Há uma grande variedade deles, uns são feitos visando velocidade, outros para quem não quer decorar nenhuma seqüência de movimentos, e ainda aqueles voltados aos iniciantes, que não se encomodam em simplesmente seguir um algoritmo escrito por outra pessoa. Como toda geekisse tem limite, escolhi o método da cruz, ele é muito simples, qualquer um com um pouco de paciência é capaz de resolver o cubo em poucas horas, seguindo-o.

Se você é realmente preguiçoso e está a fim de montar aquele cubo que você embaralhou e nunca mais conseguiu voltar, mas não está a fim de entender algoritmo nenhum, entre nesse site e replique o estado do seu brinquedo, ele gera um passo a passo da solução. Caso nem assim você consiga, desista e jogue o cubo fora, você nunca irá montá-lo. :D

Voltando à história, depois de uns dias brincando, conseguia fechar um jogo em cerca de dez minutos. Não é muito impressionante, eu sei, mas não me dediquei muito. Ao contrário desse pessoal que encontrei no You Tube, eles levam o cubo de Rubik à sério, uns resolvem rápido, outros com uma mão só, com os olhos vendados, com os ohos vendados, mas um cubo de 5X5 (esse cara é um herói), fazendo sexo (sem link para esse, estou blefando), existe até vídeo de resolução feita por robô e por uma criança de três anos. Reparou que a maior parte é japonês? Não sei o porquê disso.

Enfim, quando lançaram, ano passado, um brinquedo novo baseado no cubo de Rubik eu fui atrás de conhecer. Estou falando do Rubik’s Revolution:

Rubik’s Revolution

Se o cubo de Rubik original já era legal, sua revolução deveria ser melhor ainda, certo? Errado. Esse brinquedo é um trambolho eletrônico e luminoso, não gira, como o original, com seis jogos, para jogar sozinho ou acompanhado. O problema é que os jogos são muito fracos.

Um deles é apertar o mais rápido possível o botão no centro da face que ficar acesa, um outro é descobrir uma seqüência certa de faces, na base da tentativa e erro. O jogo coletivo é apertar o botão na face iluminada e passar o cubo adiante, até ele apitar, então a pessoa que está com ele na mão nesse momento sai do jogo. Sim, isso mesmo, uma versão piorada de batata quente.

Sendo assim eu não posso deixar de pensar que estamos perdidos. Se a revolução de uma brincadeira inteligente e instigante é esse cubinho insosso estamos fadados à emburrecer. Luzes coloridas e sons robóticos só nos aproxima da idiocracia. Assim, daqui a pouco estaremos todos com Q.I. de um dígito.

Pode parecer exagero da minha parte, mas esse produto é sintomático. Tudo parece estar evoluindo para que os usuários precisem raciocinar cada vez menos. Uma coisa é deixar que uma agenda eletrônica decore números de telefone para você, outra é anestesiar o cérebro do consumidor para ele pense que não é mais preciso pensar.

Os efeitos disso são a horda de miguxos que invade a internet, as letras das músicas populares, as notas cadas vez mais baixas nos testes básicos de matemática e leitura e compreensão de texto, não faltam exemplos. Muitas vezes a culpada não é a falta de recursos, mas a preguiça, que é incentivada por iniciativas como a do Rubik’s Revolution. Até porque, convenhamos, um miserável não compra um brinquedo de cem reais, provavelmente ele está mais entretido procurando um jeito de não morrer de fome.

Ou será que eu interpretei a relação causa e efeito no sentido inverso? Nesse caso, qual a razão da população estar cada vez mais ignorante?

Escrito por Leandro Facchinetti e publicado Domingo, dia 13 de Janeiro de 2008.
tags: , ,