“Doritos” na URL de logout do Google

Há algum tempo atrás pensei estar vendo coisas. Uma dessas coisas me pareceu ser a palavra "doritos" na URL de logout do Google. Mas o logout acontece tão rápido que nunca consegui tirar um print pra confirmar. E outra, não é sempre que aparece. Hoje pela manhã consegui! Veja na imagem abaixo:

FINALMENTE CAPTUREI O PRINT!

Repito: não é sempre que aparece.

Segundo o Bruno Bemfica (@ubuntroll), é  porque o Google não gosta de cookies e prefere usar Doritos em suas páginas.

Abraço e bom final de ano!

HTTPRequest, classe PHP para retornar conteúdo remoto em servidores sem cURL

Ataquei de freelancer recentemente, tendo que desenvolver um site. O cliente já havia contratado um popular provedor de acesso à internet da região para hospedar o site. Nada além do apocalipse poderia acontecer. Vou explicar. Os provedores da região na qual resido deveriam se preocupar um pouco mais em oferecer acesso de qualidade e deixar o ramo de hospedagem de aplicações web para quem realmente entende. O maldito servidor estava simplesmente "pelado", extensões importantes faltando e metade dos recursos úteis desabilitados.

Aonde já se viu um servidor sem cURL? Pois é, ainda fiz uma última tentativa para obter conteúdo remoto (previsão do tempo, infelizmente ainda é uma triste realidade por aqui o cliente exigir isso no site) usando file_get_contents(), mas adivinhem: allow_url_fopen desabilitado.

Felizmente existem os sockets! Dei uma fuçada na net, juntei alguns snippets e criei uma classe para facilitar o serviço. Podem conferir o código e outras informações no meu Github.

Grande abraço!

Meu ambiente de trabalho em 7 itens

Eis que temos mais um meme: Meu ambiente de trabalho em 7 itens. Recebi 2 convites hoje para descrever o meu, do @edipofederle e do @fr_prado. Uso 2 ambientes, um no trabalho e um no notebook pessoal. Vamos lá:

1) Sistema Operacional

No trabalho uso Windows 7, pois preciso programar com o auxílio do framework Adobe Flex. Na verdade eu poderia escrever o código em um editor de texto e compilar no compilador disponível para Linux, mas preciso de desenvolvimento ágil, além de otras cositas mas. Em casa uso o Ubuntu, sempre atualizado a cada nova versão. Atualmente tenho formatado minha máquina a cada novo release, pois sempre acabo enchendo-a de lixo. No próximo release irei atualizar a instalação, sem formatar.

2) IDE

Em casa, minha IDE é o Gedit. Com alguns plugins, ele se torna minha IDE preferida, extremamente leve e eficiente. Para gerenciamento do banco PostgreSQL utilizo o terminal do Linux, através do psql. No trabalho, no Windows, utilizo Eclipse com alguns plugins como o Hibernate Tools e o Flex Builder, Notepad++ para PHP e EMS SQL Manager para o banco de dados.

3) Controle de Versão

Para os meus projetos uso e recomendo o git. No trabalho, uso o TortoiseSVN.

4) Utilitários

Uso o Filezilla como cliente de FTP nos dois ambientes, na maioria das vezes para ajustes rápidos em páginas. Sempre que posso, faço o uso do SSH e SCP no Linux e do PuTTY e WinSCP no Windows.

5) Navegador/e-mail

Sou fã de carteirinha do Firefox, uso nos dois ambientes. No trabalho, também tenho instalados: Google Chrome, Opera e Internet Explorer (bleargh!) para testes nos sites. No Firefox, uso bastante os plugins Firebug (debug) e ColorZilla (captura de cores na páginas). Uso o Thunderbird para cliente de e-mail.

6) Entretenimento

Não disponho de entretenimento no trabalho. Em casa, o player de vídeos padrão do Ubuntu, o Totem, me serve muito bem. Para áudio, também uso o player padrão, o Rhythmbox, com alguns plugins bacanas. Tentei usar o Banshee, mas o mesmo trava com a minha imensa biblioteca de músicas, então voltei para o Rhythmbox. Tenho uma estranha mania de remover a voz das músicas, só para ouvir o instrumental. Para isso uso o Audacity. BTW, segue um tutorial rápido de como fazer isso sem precisar de plugins.

- Abra a música no Audacity
- Na barra de título da faixa da música, que fica no meio do programa, existe um menu suspenso. Clique e selecione a opção "Faixa Estéreo para Mono". Isso irá dividir a faixa em 2 pistas mono.
- Por último, selecione a pista de baixo e clique em Efeitos/Inverter Verticalmente. Feito!

7) Comunicação

No trabalho, tento me concentrar o máximo possível, dando uma escapada no Twitter de vez em quando. Para isso, uso o Twhirl. Em casa, também uso o mesmo cliente, além do Emesene para MSN/GTalk e do Skype. Adicionem lá: MSN: msn@fonini.net; GTalk: jonnasfonini@gmail.com; Skype: jonnas.fonini

Convido agora os amigos @jandersonfc, @mpbonatti, @emersonbroga, @lshenr e @felipeborges para compartilhar um pouco de seus ambientes.

Abraço e até a próxima!

Retornando os dias da semana atual em ActionScript 3 / Flex

Final de ano, projetos da empresa indo a milhão, últimas provas do semestre...é, não tá fácil, a correria tá desgraçada. Passei aqui pra remover as teias de aranha do blog e compartilhar esta função que pode ser útil para alguém. Infelizmente perdi a fonte de onde encontrei esta função, mas lembro que ela tinha um erro no retorno (já corrigido por mim). A função original só retornava os dias úteis da semana, mas o que eu precisava era dos dias da semana inteira, começando no domingo. Com algumas modificações, aí está o resultado.
Essa função é bastante útil para se colocar num helper (que sabe numa dessas crio um e publico o código).

public function getCurrentWeekDays():Array{
	var output:Array = new Array();
	var formattedDate:String;
	var date:Date = new Date();

	date.setDate(date.getDate() - date.getDay() - 1);

	for (var i:int = 0; i < 7; i++) {
		date.setDate(date.getDate() + 1);

		formattedDate = (date.getDate() < 10) ? "0" +
date.getDate().toString() : date.getDate().toString();
		formattedDate += "/";
		formattedDate += (date.getMonth() + 1 < 10) ? "0" +
(date.getMonth() + 1).toString() : (date.getMonth() + 1).toString();

		output[i] = formattedDate;
	}
	return output;
}

E para usar:

var diasSemana:Array = getCurrentWeekDays();

Os dias serão retornados no seguinte formato: 05/11, 06/11, 07/11. A função pode ser facilmente adaptada para também retornar o ano ou retornar a data em outro formato.

É isso aí pessoal, esse é o último post do ano. Ano que vem prometo posts mais freqüentes.
Um Feliz Natal para todos e um Ano Novo repleto de realizações, muito café, código e eterno aprendizado.

Grande abraço a todos!

Desenvolvendo um módulo de contato no Symfony 1.4

Olá pessoal, o tutorial de hoje mostra como fazer um módulo com formulário de contato e envio dos dados por email usando o framework Symfony. Você já deve possuir um projeto criado para poder proseeguir.

Primeiro, crie o módulo vazio com o comando abaixo:

fonini@valhalla:$ ./symfony generate:module frontend contato

O comando acima cria um módulo vazio, localizado em apps/frontend/modules/contato. O próximo passo é criar a classe do formulário. Esta classe irá conter todos os widgets (entenda por inputs, textareas, selects) que irão compor o formulário.
Crie um arquivo chamado ContatoForm.class.php em lib/form, com o conteúdo abaixo:

// lib/form/ContatoForm.class.php
class ContactForm extends BaseForm
{
  public function configure()
  {
    $this->setWidgets(array(
      'nome'    => new sfWidgetFormInputText(),
      'email'   => new sfWidgetFormInputText(),
      'assunto' => new sfWidgetFormInputText(),
      'mensagem' => new sfWidgetFormTextarea(),
    ));

    $this->widgetSchema->setLabels(array(
      'nome'    => 'Nome',
      'email'   => 'Email',
      'assunto' => 'Assunto',
      'mensagem' => 'Mensagem'
    ));

    $this->setValidators(array(
      'nome'    => new sfValidatorString(array('required' => true)),
      'email'   => new sfValidatorEmail(),
      'assunto' => new sfValidatorString(array('required' => true)),
      'mensagem' => new sfValidatorString(array('min_length' => 10)),
    ));

    // se esta opção não for setada, serão geradas tabelas no HTML
    $this->widgetSchema->setFormFormatterName('list');

    $this->widgetSchema->setNameFormat('contato[%s]');
  }
}

Com a classe do formulário pronta, basta passar uma instância dela para o template. Edite o arquivo apps/frontend/modules/contato/actions/actions.class.php e adapte-o para o código que segue:

// apps/frontend/modules/contato/actions/actions.class.php
class contatoActions extends sfActions
{
  public function executeIndex(sfWebRequest $request)
  {
    $this->form = new ContatoForm();

    if ($request->isMethod('post'))
    {
      $this->form->bind($request->getParameter('contato'));

      if ($this->form->isValid())
      {
        $this->redirect('contato/enviar?'.http_build_query($this->form->getValues()));
      }
    }
  }
}

Agora definiremos o template que irá receber a instância da classe ContatoForm, gerando os campos do formulário. Edite o arquivo apps/frontend/modules/contato/templates/indexSucess.php. Faço um parentêses aqui. Para cada action que você definir (no arquivo de actions, obviamente), você pode criar um arquivo nomedaactionSuccess.php. O conteúdo desse arquivo será exibido ao executar a action (a menos que ela redirecione para outra action). Exemplo: uma action enviaemail deve possuir um template enviaemailSuccess.php.

// apps/frontend/modules/contato/templates/indexSuccess.php

<form action="<?php echo url_for('contato/index') ?>" method="post">
	<ul>
                <?php echo $form; ?>
		<li>
			<input type="submit" value="Enviar" />
                </li>
	</ul>
</form>

Você deve ter percebido que a action do formulário está apontando para contato/enviar. Ou seja, ao ser submetido, o método enviar da classe contatoActions será invocado, logo teremos que criá-lo. Volte para o arquivo apps/frontend/modules/contato/actions/actions.class.php e adicione os métodos abaixo, o método que enviará o email e o método que será chamado se o envio for bem sucedido. Mude as configurações para seu servidor de envio. Outros parâmetros na documentação da Swift Mailer.

// apps/frontend/modules/contato/actions/actions.class.php

public function executeEnviar(sfWebRequest $request)
{
  $transport = Swift_SmtpTransport::newInstance('smtp.seudominio.com', 25)
    ->setUsername('seuemail@dominio.com')
    ->setPassword('senha');

  $mailer = Swift_Mailer::newInstance($transport);

  $message = Swift_Message::newInstance()
    ->setSubject( $request->getParameter('assunto') )
    ->setFrom(array( $request->getParameter('email')  => $request->getParameter('nome') ))
    ->setTo(array('email_contato@seudominio.com.br'))
    ->setReplyTo( $request->;getParameter('email') )
    ->setBody( $request->getParameter('mensagem') );

  if ($mailer->send($message)){
    $this->redirect('contato/feito');
  }
}

public function executeFeito()
{
}

Agora basta criar um template para o método executeFeito, mostrando uma mensagem de envio bem sucedido.

<!-- apps/frontend/modules/contato/templates/feitoSuccess.php -->
<span style="font-weight: bold; font-size: 14px;">Contato enviado com sucesso. Obrigado!</span>

Tudo pronto! Teste seu módulo agora: http://localhost/seuprojeto/index.php/contato.

Download

Caso algo tenha dado errado, baixe os arquivos utilizados e coloque-os em suas devidas pastas. Melhor ainda que substituir os arquivos é tentar encontrar a causa do problema e quem sabe melhorar o módulo, que está bem básico.

Download dos arquivos

Grande abraço e até a próxima!

Google