Filed under etc

Nova versão do meu e-book sobre Zend Framework

Lancei hoje uma versão revisada do Zend Framework na prática. Confiram no site oficial

Chamando o Sublime Text via Terminal

Se você, como eu, é viciado em usar o Terminal, o Sublime tem um comando para você pode abrir um arquivo ou diretório. Para isso precisamos primeiro criar um “atalho” para o executável:

sudo ln -s /Applications/Sublime Text 2.app/Contents/SharedSupport/bin/subl /usr/bin/subl

Agora é só executar:

subl arquivo (ou diretório)

Sublime Text

Eu nunca fui muito fã de IDEs.
Usei por um bom tempo o Eclipse e mais recentemente o Netbeans, ambos para programar em PHP. Apesar de reconhecer a utilidade da maioria dos recursos, como o autocomplete quase milagroso do Netbeans, não gosto muito da abordagem “uma ferramenta integrada para tudo o que você precisar”, principalmente pelo grande consumo de memória e processamento que isso acarreta. Eu me considero mais “Unix style” neste caso, no sentido de usar várias pequenas ferramentas, cada uma específica e que faz o melhor para resolver determinada tarefa. Por isso uso o Cornerstone para gerenciar os repositórios SVN, o cliente do Github, o terminal do Mac para rodar os testes unitários e um bom editor de programação.
Até recentemente meu editor preferido era o Textmate, mas como ele está bem parado no tempo (a versão 2 ainda está longe) eu testei algumas alternativas (Chocolat, Espresso, TextWrangler) e acabei adotando o Sublime Text como meu editor favorito. Alguns dos motivos:

- Rápido. Muito, muito rápido. Abrir arquivos, navegar nas funções, todas as operações são de rápido acesso
- Atalhos para tudo. Adoro atalhos. Eu sou muito mais produtivo usando o teclado do que o mouse. Existem atalhos para quase tudo. Os mais úteis: Command+P para acessar a pesquisa de arquivos no projeto, Command+R para listar e pesquisar os métodos do arquivo, Contrl+G para mover o cursor para a linha digitada, Command+Shift+P para listar os comandos e snippets, entre outros.
- Multiplataforma. Ele tem versões para Mac OS X, Linux e Windows
- Extensível. Possui plugins, snippets, novas teclas de atalho configuráveis, etc.
- Em constante evolução. Estão disponíveis a versão 1 e a versão em desenvolvimento, a 2. Mesmo a versão 2 em beta, que estou usando, é muito estável.
- Syntax highlighting para diversas linguagens de programação
- Outras features legais: edição em 2, 3 ou 4 colunas, podendo colocar vários arquivos lado a lado para comparar; edição de vários pontos de código ao mesmo tempo; organização em projetos; customização de cores de interface; autocomplete.

Neste vídeo é possível ver ele funcionando:



É um aplicativo que realmente vale cada centavo pago. Ele custa 59 dólares, mas a licença permite que você use as versões para todos os sistemas operacionais, para a versão 1 e 2, e para quantas máquinas quiser. Também é possível baixar a versão trial para testes, e até onde testei não tem bloqueio, somente aparecem avisos pedindo que você compre.
Vale o teste e também a compra.

Alguns links com dicas para aprimorar o uso do editor, com plugins e themes:

http://www.rockettheme.com/magazine/1319-using-sublime-text-2-for-development
http://www.designkode.com/blog/sublime-text-icon
http://www.markdotto.com/2011/09/09/coding-with-sublime-text-2/
http://net.tutsplus.com/tutorials/tools-and-tips/sublime-text-2-tips-and-tricks/

Minha alternativa ao Delicious

Antigamente eu armazenava todos os meus bookmarks em uma conta do Delicious. Quando o Yahoo divulgou a sua venda para outra empresa eu (e meio mundo) iniciei uma procura por alternativas.
Acabei encontrando uma bem simples, mas útil. Criei uma conta no Gmail para armazenar todos os meus bookmarks. Para facilitar o envio das páginas para a conta estou usando o serviço cc:to me. Você cadastra a conta de e-mail para onde os links devem ser enviados e instala um pequeno bookmarklet no seu navegador preferido. Assim, sempre que acessar alguma página interessante basta clicar no bookmarklet, colocar algum comentário e enviar para o e-mail definido na configuração.
Também estou usando essa solução como substituto de serviços como o Read It Later e similares. Sempre que estou lendo alguma notícia no Google Reader (uso o aplicativo Reeder no Mac e no iPad) e desejo ler mais tarde, com tempo, eu simplesmente envio para esse e-mail.
Outro detalhe é que posso usar filtros e labels do Gmail para organizar e pesquisar os meus bookmarks com todo o poder que o Google fornece. Claro que perdi a funcionalidade “social” do Delicious, que era poder compartilhar um bookmark com outras pessoas, mas continuo fazendo isso simplesmente dando forward do e-mail para quem eu quero.
Pode não ser a melhor solução do mundo, mas é simples e está funcionando muito bem pra mim nos últimos meses.

10 dicas profissionais do mundo PHP

10 programadores PHP “das antigas”, compartilhando suas experiências de carreira. O que é isso? Um artigo que estamos publicando no iMasters (a primeira parte já está no ar) e que gerou uma palestra e muita polêmica (nos comentários do artigo).
Vai ficar de fora? Dê sua opinião e compartilhe suas dicas. Só tome cuidado com os Trolls :)

Slim Framework

Alguns dias atrás estava preparando o material de um curso que vou ministrar no PHPConference 2011. O assunto do curso já é bem “denso”: Gearman, Memcached e Sphinx, então não queria aumentar a complexidade incluindo algum Framework, até porque o requisito do curso era apenas “conhecimentos em PHP”.
Então iniciei o desenvolvimento do material usando somente o PHP e me deparei com a situação: “eu não consigo mais trabalhar sem frameworks!!”. Parti então para a busca de um dos novos micro frameworks que surgiram nos últimos meses. Fiz uma pequena (micro?) pesquisa e encontrei algumas opções legais como o Silex, DooPHP, Recess e Slim.
Após uma pequena análise acabei optando pelo Slim. O Silex é muito legal, pois é baseado no Symfony, mas não gostei de ter que usar o Twig para a parte de views, pois isso aumenta a complexidade. O DooPHP me pareceu faltar documentação. O Recess eu gostei bastante, mas vai ficar para um próximo estudo, principalmente a parte de REST, que achei interessante. O Slim me pareceu bem simples e a parte de views é feita por scripts PHP normais, sem precisar de um sistema de templates como o Twig ou Smarty (apesar de ser fácil integrá-los caso desejado).
Usando o exemplo básico do site é possível ver a simplicidade do Slim:

<?php
require 'Slim/Slim.php';
$app = new Slim();
$app->get('/hello/:name', function ($name) {
    echo "Hello, $name!";
});
$app->run();
?>

A idéia dele é fornecer apenas a parte de rotas e views simplificadas, sem se preocupar com a parte de modelos e coisas mais complexas.

Organizando o projeto

Com um pouco de esforço é possível fazer um projeto pequeno mas bem organizado usando-se o Slim. Abaixo a minha “receita” de projeto.

Estrutura de diretórios

config
controllers
docs
public
	images
	scripts
	styles
index.php
vendors
	Slim
views

Conteúdos dos arquivos

.htaccess

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule !\.(js|ico|gif|jpg|png|css|htm|html)$ index.php

index.php

<?php
require 'vendors/Slim/Slim.php';
define('CONTROLLERS_PATH', './controllers/');
define('VIEWS_PATH', './views/');

$app = new Slim(array(
    'templates.path' => VIEWS_PATH
));
$controllerDir = opendir(CONTROLLERS_PATH); 
while ($controller = readdir($controllerDir)) {
	if($controller != '.' && $controller != '..')
		require CONTROLLERS_PATH . $controller;
}
$app->run();

Desta forma basta adicionar arquivos no diretório controllers e views. Um exemplo de controller e view

config/db.php

<?php
$dsn = 'mysql:host=localhost;port=3306;dbname=gallery';
$usuario = 'root';
$senha = '';
?>

controllers/Gallery.php
<?php
$app->get('/', function() use ($app) {
	require 'config/db.php';
	$pdo = new PDO($dsn, $usuario, $senha);
	$stmt = $pdo->query('SELECT * FROM gallery');
	$data = $stmt->fetchAll();
	$app->render('index.phtml', array('data' => $data));	
});

$app->get('/gallery/:id', function($id) use ($app) {
	require 'config/db.php';
	$pdo = new PDO($dsn, $usuario, $senha);
	$stmt = $pdo->query("SELECT * FROM gallery where id = $id");
	$gallery = $stmt->fetchAll();
	$stmt = $pdo->query("SELECT * FROM image where gallery_id = $id");
	$images = $stmt->fetchAll();
	$app->render('gallery.phtml', array('gallery' => $gallery, 'images' => $images));
});
?>

views/index.phtml
<h2>Galerias</h2>
<div id="gallery">
<?php if(isset($data)): ?>
	<?php foreach($data as $d): ?>
		<p><a href="/gallery/<?php echo $d['id'];?>"><?php echo $d['name'];?></a></p>
	<?php endforeach;?>
<?php endif;?>
</div>

views/gallery.phtml
<h2> <?php echo $gallery[0]['name']?></h2>
<h3><?php echo $gallery[0]['description']?></h3>
<?php foreach($images as $i): ?>
	
	<a href="/images/<?php echo $i['gallery_id'];?>/<?php echo $i['filename'];?>"  target="_blank">
		<img src="/images/<?php echo $i['gallery_id'];?>/<?php echo $i['filename'];?>200.png">
	</a>
<?php endforeach;?>
<p><a href="/">Voltar</a></p>

Claro que o Slim não substitui um framework completo como o Zend Framework ou o Symfony, mas para projetos pequenos, provas de conceito ou coisas mais simples ele é uma boa opção.

Slides da minha apresentação no PHPSCConf 2011

No último sábado aconteceu o PHPSCConf 2011 em Itajaí.
O evento foi um sucesso, com ótimas palestras e boas discussões nos intervalos.
Os slide da minha apresentação “10 dicas de carreira” estão no Speaker Deck

Usando o libnotify-bin para gerar notificações no Ubuntu

O amigo Marcos Garcia fez um post no seu blog complementando o meu texto sobre o growlnotify. Vale a leitura.

Dropbox como substituto do iDisk

Com o lançamento do iCloud a Apple já avisou que em alguns meses vai descontinuar um dos serviços do MobileMe que eu mais usava, o iDisk. Então fiz uma pesquisa para achar um substituto e o escolhido foi o já amado por todos, o Dropbox. Mas tive dois pequenos problemas para resolver: como eu já uso o Dropbox para armazenar os dados da Coderockr precisava ter duas contas ativas no meu Mac. E o segundo problema é que o iDisk fornece uma pasta pública para acesso via web, útil para compartilhar coisas temporárias e o Dropbox não permite isso.
Para resolver o primeiro problema eu segui os passos deste site
Para solucionar o segundo problema eu configurei o Dropbox para Linux em um servidor que eu controlo, uma instância das mais simples no EC2 da Amazon. Eu segui os passos deste site, mas resumindo:

wget -O dropbox.tar.gz "http://www.dropbox.com/download/?plat=lnx.x86"
tar -xvzf dropbox.tar.gz
~/.dropbox-dist/dropboxd &

A primeira vez que você executar ele vai mostrar uma mensagem com um link para você acessar no navegador. Ele vai fazer com que a máquina Linux seja vinculada a sua conta do Dropbox. Após isso será criado um diretório Dropbox no seu home.
Agora basta configurar o seu Apache para ter acesso a este diretório. No meu caso eu criei um domínio virtual:

DocumentRoot "/home/eminetto/Dropbox/Public"
ServerName public.eminetto.me

Options Indexes MultiViews FollowSymLinks
AllowOverride All
Order allow,deny
Allow from all


Lembre-se de dar permissão de leitura nos diretórios para o usuário do Apache ter acesso:

chmod 755 /home/eminetto
chmod 755 /home/eminetto/Dropbox
chmod 755 /home/eminetto/Dropbox/Public

Outra opção é usar algo como http://seuserver.com.br/~eminetto/Dropbox/Public, se o Apache tiver essa opção configurada.
Se o seu Apache estiver configurado para listar os arquivos do diretório você já pode ver os seus arquivos ao acessar via web. Caso não esteja, é possível usar um script python que lê o diretório e cria um index.html com o conteúdo. Depois de instalado você pode executar o comando:
/usr/bin/dropbox-index -R /home/eminetto/Dropbox/Public/
Se tudo der certo, sempre que você alterar/adicionar arquivos no Dropbox do seu desktop (no meu Mac no caso, mas o Windows e o Linux deve funcionar na mesma forma) é sincronizado com o linux e estão visíveis na internet. Lembre-se de que o comando
~/.dropbox-dist/dropboxd &
Deve estar sempre executando no Linux, pois é o responsável por fazer a sincronização entre a pasta local e o Dropbox.
Com algumas configurações adicionais no Apache você pode colocar autenticação e coisas mais complexas para incrementar a solução.
E que venha o iCloud. Agora o iDisk não vai me fazer mais falta

News feed usando nodeJS, Pubsub.io e jQuery

Um dos projetos que estamos desenvolvendo na Coderockr é uma rede social, da qual vamos dar mais detalhes no futuro, e um dos componentes é um news feed, algo parecido com o “mural do Facebook” onde são mostrados os eventos mais atuais aos usuários (novas notícias, novos pedidos de amizade, novos conteúdos, etc).
Estamos estudando algumas tecnologias para melhor solucionar esta necessidade, e uma das soluções é algo bem novo para nós, o uso quase que total de Javascript: nodeJS, Pubsub.io e nossa velha amiga jQuery.
O nodeJS é uma das tecnologias mais interessantes que surgiu nos últimos tempos. O mago do Javascript @jaydson escreveu alguns posts muito legais fazendo uma introdução e mostrando os primeiros passos na ferramenta. Recomendo a leitura.
O Pubsub.io é construído sobre o nodeJS e é um “query based message hub”, trabalhando com o conceito de publishers (programas que publicam conteúdo) e consumers (os que consumem as mensagens), e adicionando a possibilidade de usar uma query language baseada na usada pelo banco NoSQL MongoDB para filtrar os resultados.
A solução que estamos testando funciona da seguinte forma: sempre que um evento acontece (uma nova foto é salva, por exemplo) o componente que executou o evento (um model ou um controller de uma aplicação Zend Framework, por exemplo) faz uma requisição http para uma url servida pelo nodeJS e este publica uma mensagem no Pubsub.io. Na aplicação client, no navegador web, usando a biblioteca JS do Pubsub.io e o jQuery mostramos as mensagens na tela. Vamos tentar explicar com códigos :)
Após instalar o nodeJS e o npm (node packet manager) é preciso instalar o Pubsub.io, usando o comando abaixo, no mesmo diretório onde ficará o script server.js (script nodeJS mostrado abaixo):
npm install pubsub.io
Agora é preciso instalar e executar o servidor do Pubsub.io:

git clone git@github.com:pubsubio/pubsub-hub.git
./pubsub-hub/lib/server.js

Ele ficará ouvindo na porta 9999
O próximo passo é escrever o código do aplicativo do nodeJS e executá-lo com o comando:
node server.js
Como o nodeJS fica executando na porta 8080 podemos publicar novos eventos usando algo simples como um comando curl, via linha de comando:
curl -d "title=new photo&detail=http://localhost/photo/id/1&user=eminetto" http://127.0.0.1:8888
O -d indica que estamos usando o comando POST para enviar.
Podemos também usar o curl no PHP:

$url = 'http://127.0.0.1:8888';
$postvars = 'title=new image&detail=http://localhost/image/id/1&user=eminetto';
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_POST ,1);
curl_setopt($ch, CURLOPT_POSTFIELDS ,$postvars);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION ,1);
curl_setopt($ch, CURLOPT_HEADER ,0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER ,1);
$Rec_Data = curl_exec($ch);

Na parte client vamos usar a biblioteca Javascript do Pubsub.io e jQuery para mostrar ao usuário a notificação: ver código

No site do Pubsub.io é possível ver outras features importantes como a possibilidade de usar autenticação para garantir a segurança, queries avançadas e a possibilidade de usar o MongoDB para armazenar as mensagens.
Gostei muito da solução. Ainda falta testar coisas como performance, escalabilidade mas me parece ter um bom futuro.

Seguir

Obtenha todo post novo entregue na sua caixa de entrada.

Join 1.472 other followers