Mutucas, Pneu, Borboleta e Vitamina D

Ontem sai para pedalar com meu pai. Achei bem estranho a gente ter conseguido sair da garagem. Sempre que tento fazer tal coisa chove, o PCC faz um toque de recolher e um grupo alienígena de dinossauros invadem a terra.

Enfim, o plano era irmos até Paranapiacaba, estava indo tudo bem não fosse elas, da ordem dos diptera, as "Mutucas". Você pode dizer "O Carlos é fresco. Tem medo de tudo". Mas dessa vez foi demais, até meu pai estava reclamando, era possível as ver nos perseguindo na sombra.

Teve uma que me atacou de tal forma, que quando estava indo embora, perguntei onde estava o meu suco e meu pão com mortadela. Depois de doar tanto sangue o mínimo era ter um lanche.

Quando já tínhamos pedalado uns 6 km, o pneu da minha bicicleta furou.
Sem problemas! Somos prevenidos. Temos, bomba de ar, remendo e ferramentas. Só não esperávamos que a bomba de ar quebraria na primeira bombeada. Bora voltar pedalando 6 km com o pneu furado.

Enquanto quicava no banco da bicicleta, eis que surge uma borboleta. Voltemos a frase "Tem medo de tudo", só que dessa vez eu tive motivos para ter medo. A borboleta queria ter relações sexuais comigo. Ela entrou na minha bermuda e não queria sair. Sorte que eu não estava de samba canção.

Eu achei estranho, a um nível ridículo, meu pai sair pra pedalar de calça jeans. Segundo ele, ele só se sente bem pedalando assim. Mas depois da aparição da borboleta, eu até o entendo.

Pelo menos eu tenho Vitamina D acumulada para no mínimo uns 5 anos. O sinal dessa minha super-dosagem é a vermelidão que está presente em boa parte do meu corpo.

Moral a história:
Gostava mais quando o grupo alienígena se juntava ao PCC e não deixava eu sair pra andar de bicicleta com meu pai.

Criando quadrados responsivos

No projeto que estou trabalhando atualmente, tive a necessidade de criar quadrados responsivos.
Criar um quadrado é muito fácil, não? Basta setar a altura igual a largura e estamos felizes. Porém, por se tratar de um quadrados responsivo, estamos pensando em porcentagem.

Se eu definir um quadrado com 10% de largura e 10% de altura. Adivinha o que vai acontecer? Você acertou! Não será um quadrado

Exemplo:

10% x 10%

Depois de muito tempo estudando uma maneira de fazer um quadrado responsivo, cheguei a seguinte solução:

O padding é sempre relativo a largura, logo, se você definir a altura do elemento com 0 e o padding-bottom com a porcentagem da altura você terá o resultado esperado. Segue exemplo abaixo:

Guia para Designers: Website Responsivo


Primeiramente gostaria de informar que eu não sou designer. Estou criando esse post para esclarecer as principais dúvidas que os designers costumam ter em relação à websites responsivos.

O que são Frameworks?

Sempre me perguntam o que é esse tal de Framework que eu sempre falo. Framework nada mais é do que um conjunto de elementos pré-definidos que ajudam a nós desenvolvedores não ficarmos reinventando a roda.

Nesse post trabalharei com o Bootstrap do Twitter. Há vários outros, porém a ideia desse post não é ensinar a usar frameworks front-end e sim exemplificar os conceitos de um website responsivo.

Grids

Acredito que esse seja o ponto mais importante quando estamos falando de website responsivo. Os grids são o que mandam na forma que o seu conteúdo irá aparecer.

A primeira coisa a se considerar é qual vai ser a largura do site. Por padrão o Bootstrap trabalha com 1170px de largura no modo responsivo, caso a tela seja menor que 1170px ele passa a assumir 940px, depois 724px, após isso o site fica fluido, ou seja, todos os elementos assumem 100% da página.
Temos 12 tamanhos de colunas diferentes que se encaixam perfeitamente e serão dentro dessas colunas que você colocará o conteúdo do seu site.

Veja um exemplos de colunas aqui: http://maniero.tk/bootstrap/grids.html

Mostrando e ocutando elementos

Uma prática necessária na criação de layouts responsivos é a de mostrar e ocultar elementos na página dependendo do dispositivo que está acessando o site. Um exemplo de utilização dessa prática na criação de Menus. Dificilmente um menu localizado no Header fica bom na navegação mobile, então deve ser criado uma versão para os dispositivos mobile.

Bootstrap em PSD

O Bootstrap possui diversos outros elementos que podem ser aproveitados também no layout, assim como botões icones, navbars, etc. Você pode baixar os elementos do Bootstrap em PSD aqui: http://www.bentdesignstudio.com/v2/2012/03/twitter-bootstrap-2-photoshop-template-psd/

Conclusão

Espero que esse artigo possam ajudar a vocês "amigos designers" (se é que existe amizade entre programadores e designers, hehe) a esclarecer dúvidas básicas de como funciona um website responsivo. Se surgirem dúvidas eu atualizarei essa postagem.

BikeSampa: Experiência

Não, programador não vive só sentado na frente do computador tomando café e digitando na "telinha preta". Tenho hobbies é um deles é pedalar. Adoro a sensação de vento na cara.
Aqui estou eu indo trabalhar de bicicleta.
Assim que vi as bikes do Itaú espalhadas pela cidade, fiquei encantado. Logo procurei fazer meu cadastro.
Nos primeiros dias comecei a ter problemas. A estação 82 (Shopping Santa Cruz) nunca está disponível. Meu trajeto começa no Shopping Santa Cruz e vai até a Dr. Barcelar (Vila Clementino). Porém devido a essa indisponibilidade tenho que andar até a estação Altino Arantes (estação 83).
Fora isso, em um único dia, peguei uma bicicleta com pneu furado. Devolvi e procurei outra, mas estava com o pedivela com problemas. Só em uma terceira tentativa, encontrei uma bike em estado razoável.
Porém, não tive tantos problemas no estado das bicicletas, as boas pelos 10 reais pagos para dois anos de utilização.
Mas hoje confesso que fiquei tremendamente decepcionado com o serviço, já tive problemas em desbloquear uma bicicleta e ela não sair, porém, bastava ligar novamente e desbloquear outra. Hoje foi diferente. Para começar só havia duas bicicletas na estação (isso não é um problema, sei que tem bastante gente usando) e além de mim, havia outra garota, aparentemente com problemas para desbloquear a bicicleta. Era uma bicicleta para cada. A bicicleta na posição 8 se recusou a sair, minha reação natural foi ligar e pedir para que fosse desbloqueada novamente.
A bicicleta não saiu e ainda ficou como "em uso", o que era para ser  um meio alternativo de chegar ao trabalho para poupar tempo, acabou me custando meia hora de atraso.
De qualquer forma, amanhã tentarei usar novamente o serviço, entre pegar um ônibus, ir andandado ou ir de bicicleta, eu ainda prefiro ir de bicicleta, mesmo tendo mais dor de cabeça.
Espero mesmo que o Itaú melhore o serviço, afinal, acho um serviço incrível.

Portifólio

Depois de um longo tempo prometendo criar um portifólio, finalmente está pronto. Fiz no modo pastel com CodeIgniter. Agora só basta ter tempo para alimentá-lo.

Segue o link: http://www.maniero.tk/

Jquery com MTV(MVC) - Jquery MTVe

"Model-view-controller (MVC) é um modelo de desenvolvimento de Software, atualmente considerado uma "arquitetura padrão" utilizada na Engenharia de Software." - Fonte: http://pt.wikipedia.org/wiki/MVC

Nada é mais problemático nos dias de hoje quanto a falta de padronização nos projetos. Após uma procura na internet encontrei alguns frameworks MVC para javascript, mas, nenhum me agradou. Alguns me pareceram bem completos, mas, não me atendiam muito bem.

Achei de bom senso criar um próprio, coloquei algumas ideias no papel e cheguei a uma primeira versão. Ele deveria ser leve, de fácil utilização e o mais simples possível.

Tentei aproximar ao máximo a forma do Framework Django trabalhar, e cheguei a seguinte estrutura:

  • Model
  • Template
  • View
  • events
Surge então o jQuery MTVe, farei uma pequena demostração sobre seu funcionamento.

Primeiramente, entre na página no GitHub do projeto serão necessários os arquivos que estão dentro da pasta src.

Model:

Nosso modelo irá fazer uma requisição na graph api do Facebook. Ela terá dois atributos. Um será chamado "me" ele armazenará o meu username e outro chamado "base" que será utilizado para requisitar dados de perfil de outros usuários.

var model = $.Model({
  me : 'carlos.maniero',
  base : 'http://graph.facebook.com/',
  profile : function() { return this.load('GET', this.base + this.me ); },
  find_profile : function(username) { return this.load('GET', this.base + username ); },
});

O método "profile" retorna os dados do meu perfil e o find_profile retorna os dados de um usuário qualquer.

O método load:
Como você deve ter percebido ambos os métodos do modelo utilizam o método load. Ele é o método responsável em fazer as requisições via Ajax. E possui os seguintes parâmetros:

  • type: GET ou POST
  • url: Endereço da requisição
  • data: Json com dados a serem enviados
  • options: Opções do método jQuery.ajax
O método get:

Para chamar um método ou acessar um atributo, usa-se o método get.
Exemplos:

model.get('me');
model.get('profile')();

 

Template:


O método template usa o jQuery.tmpl, ele ainda não está em faze final, mas, está bem estável. Então esse será o conteúdo do nosso template:
HTML: https://github.com/carlosmaniero/jQuery-MTVe/blob/master/demos/demo1.tmpl


Os arquivos de template podem ser salvos com a extensão tmpl ou escrito em forma de texto, no exemplo salvaremos em um arquivo .tmpl.

Javascript:
var template = $.Template({
  profile : 'demo1.tmpl'
});

Renderizando um template:
Para renderizar um template, basta utilizar o método método get passando como parâmetros o nome do atributo e o objeto que será usado para substituir no template.

Exemplo:
template.get('profile',json);

View (Controlador):

"O controlador (controller) recebe a entrada de dados e inicia a resposta ao utilizador ao invocar objetos do modelo, e por fim uma visão baseada na entrada. Ele também é responsável pela validação e filtragem da entrada de dados." - Fonte: http://pt.wikipedia.org/wiki/MVC

Vamos ao javascript:

var view = $.View({
 profile : function(){
   var data = $.parseJSON(model.get('profile')());
   $("table").append(template.get('profile',data));
 },
 find_profile : function(username){
   var data = $.parseJSON(model.get('find_profile')(username));
   $('table').append(template.get('profile',data));
 }
});

Events:

Nos eventos ficarão todas as função que serão usadas em nossos elementos.

Javascript:

var events = $.Events({
  profile : function(evt){
    evt.preventDefault();
    view.get("profile")();
    $(this).attr('disabled','true');
  },
  find_profile : function(evt){
    evt.preventDefault();
    var username = $("input[name=username]").val();
    view.get("find_profile")(username);
  }
});
$("#button_profile").click(events.get('profile'));
$("#button_find_profile").click(events.get('find_profile'));
Como eu disse anteriormente ele é bem simples, porém, bastante útil.

O exemplo completo você encontra na pasta demos do projeto.

PHP - Long Polling

Long Polling é uma técnica utilizada para se obter dados e informações em "tempo real" sem que haja uma requisição por parte do usuário.

Como isso é possível? 
Existem algumas formas disso ser feito, nesse artigo, abordaremos o Long Polling.

Criaremos nesse artigo um pequeno chat, lembre-se que o intuito do artigo não é ensinar a fazer um chat, e sim, demostrar o funcionamento do Long Polling.

Vamos ao nosso arquivo poll.php, ele será responsável em trazer novas mensagens que foram enviadas pelo chat.

set_time_limit(0);

function poll($cur_line){
 // Lê arquivo
 $data = file_get_contents('chat.txt');
 $lines = explode("\n", $data);
 
 // Verifica se o número de linha é igual a linha atual ou se a linha 0 está vazia
 if(count($lines) == $cur_line || empty($lines[0])){
  // Coloca o script para dormir por 1 segundo
  sleep(1); 
  return poll($cur_line);
 }else{
  $ret = array();
  $ret['lines'] = array();
  // Coloca somente as linhas que não foram lidas no vetor
  for($cur_line;$cur_line < count($lines); $cur_line++){
   $ret['lines'][] = $lines[$cur_line];
  }
  // Adciona a linha atual no vetor
  $ret['cur_line'] = $cur_line;
  // Encoda o vetor em json
  return json_encode($ret);
 }
}
echo poll($_POST['cur_line']);

Entendendo o poll.php

No arquivo poll há uma função que recebe como parâmetro o $cur_line, essa é a linha atual do chat. Cada mensagem estará em uma linha de um arquivo .txt.  
Sem muito segredo, a função poll lê o arquivo chat.txt e verifica se há novas linhas no arquivo, caso negativo, ele coloca o programa para dormir durante 1 segundo, isso é muito importante para amenizar o gargalo de processamento.

Caso haja novas linhas, ele coloca as novas linhas em um vetor que é encodado para json.

Javascript:

var cur_line = 0;
var poll;
function get_messages(){
 poll = $.ajax({
 type: "POST",
 url: "poll.php",
 data: { 'cur_line' : cur_line },
 dataType: "json",
 success: function(json, textStatus, jqXHR) {
  cur_line = json.cur_line;
  
  // Insere linhas na tela 
  for(i=0;i' + json.lines[i] + '');
   $("#chat #chat-content .messages").prepend(line);
  }
  
 },
 complete: function(){ 
  get_messages();
 },
 timeout: 30000
 });
}

A função get_messages envia um post para o arquivo poll.php e imprime em uma lista o resultado(json) retornado e atualiza o número de linhas carregadas, que vem no json retornado.

Eu sempre recomendo que a conexão seja interrompida de tempo em tempo. No meu caso dixei o timeout em 30 segundos. Isso evita que, em caso de erros, o servidor fique com o processo travado.

Quando requisição é completada, eu chamo a função get_messages novamente, fazendo com que sempre haja uma conexão ativa com o servidor.

Com o Long Polling o chat sempre estará trazendo as novas mensagens de forma rápida, sem precisar ficar enviando milhares de requisições para o servidor.

Se quiser o projeto completo, eu subi no github.
Segue o link: https://github.com/carlosmaniero/Php-long-polling
Demonstração: http://www.livrodeoracao.com.br/dev/chat/index.php