Dica: Listando as rotas no console

O Carlos Brando publicou hoje um artigo sobre como testar rotas no console. Achei legal e decidi compartilhar um código que uso freqüentemente, mas que serve para listar todas as rotas nomeadas existentes. Faça o seguinte no terminal:

RUBY:
  1. $ ./script/console
  2. >> app.methods.grep /_path$/

Este comando, pega todos os métodos da aplicação e filtra utilizando uma expressão regular.

Para melhorar a visualização, você pode adicionar o "y" na frente, para que ele converta o array de retorno em yaml:

RUBY:
  1. >> y app.methods.grep /_path$/

E para ficar ainda melhor, adicione o "sort", para ficar em ordem alfabética:

RUBY:
  1. >> y app.methods.sort.grep /_path$/

O problema é que existem muitas rotas, numa aplicação bem pequena que tenho aqui chega a 500. Para contornar isso você pode utilizar o poder das expressões regulares. O código abaixo, lista apenas as que começam com 's':

RUBY:
  1. >> y app.methods.sort.grep /^s.*_path$/

Se você não conhece Expressões Regulares, dê uma lida na Web, tem muito material. Caso prefira livros, dê uma conferida no "livro do piazinho", do Aurélio.

E o curso de Rails já acabou…

Conforme falei no artigo anterior, fiz o curso de Ruby On Rails da e-Genial, que infelizmente se encerrou na quinta, dia 23. Foram 21 aulas, com direito a lista de discussão, material de estudo de primeira e um instrutor, o Júlio Monteiro muito bom. De quebra ainda conheci muita gente legal e que com certeza manterei contato.

Foi muito interessante a proposta do pessoal da e-Genial de fazer um desafio: montar um software de gestão escolar, com cadastro de alunos, instrutores, cursos, turmas, aulas e ainda lista de chamada! Os melhores ganhariam livros.

A maioria do pessoal do curso não fez, ou não conseguiu terminar, mas eu recomendo muito que se lhe for proposto algo assim, deixe um fim de semana de lado e se dedique a isso. Não tanto pelo livro, que é um incentivo legal, mas pelo aprendizado que algo assim proporciona. Eu fiz e aprendi muita coisa nesse sistema, pois as dúvidas só aparecem quando você mete a mão na massa.

E o ganhador? Bom, não que eu queira me gabar nem nada, mas eu ganhei! :D O prêmio foi um livro muito bom, o Rails Way, do Obie Fernandez. Estou agora a espera do livro, que está vindo pelo correio, já que o curso foi online, para mergulhar de cabeça em mais material sobre Rails. Se você quiser ver meu projeto, é só acessar no github ou fazer o download do tarball.

Gostaria ainda de elogiar o TreinaTom, que eu insisto em chamar de Teletom (vai ver o Carlos Eduardo é amigo do Sílvio Santos). O ambiente é muito legal, com a interação entre professor e aluno acontecendo na hora. Pior coisa de curso online são aqueles em que só há apostilas e fórum e este não foi assim, teve vídeo, screensharing e muito bate-papo.

O Júlio também foi sensacional, muito prestativo e paciente com nossas dúvidas beirando o ridículo. Ontem ele disse que nossa turma foi a melhor que ele já trabalhou até hoje e que éramos muito interessados. Mas eu sei que ele diz isso pra todas turmas. :)

Bom, se você chegou até aqui, é por que já deve estar interessado no curso. E pra não dizer que foi tudo elogios, faltou falar um pouco mais sobre Testes, que é algo muito importante e que não consegui entender o fluxo de trabalho, mas tenho certeza que vai estar melhor nos próximos cursos. Esse problema vou resolver com um screencast do Peepcode.

Ruby On Rails, aqui vou eu

Ruby On RailsTenho andado com os meu queixo dolorido nos últimos dias. Há um mês estou fazendo o curso de Ruby On Rails da e-Genial e estou embasbacado com o framework. Tenho estudado Rails por conta já faz um ano, mas nunca saindo do básico (com o Django fiz a mesma coisa). Claro que isso parece ser chover no molhado, mas o Rails é realmente impressionante.

Pelo que vi até agora o grande diferencial dele é o Active Record. Eu trabalho o CodeIgniter recentemente, mas ele não tem ORM e isso faz uma falta enorme, já que no Rails os Models tem a função de configurar a tabela do banco de dados e deixando todo o resto pro Active Record, enquanto no CI, é um repositório de funções relacionados ao BD; fazendo o desenvolvimento ser muito mais rápido no Rails.

Outra qualidade que percebi nesse meu "namoro" com Rails, foi a Comunidade, que é muito ativa, trazendo novidades e material quase que diariamente. Tanto a comunidade internacional (dá pra chamar assim?), quanto a brasileira são legais. Isso contou muito na hora que optei pelo Ruby/Rails (em detrimento do Python/Django).

RubyOutra grande vantagem do Rails, é o Ruby. Isso mesmo, a linguagem utilizada no framework é muito boa. É legível, padronizada e muito poderosa. Eu trabalho com PHP fazem 4 anos e não quero cuspir no prato que comi (e ainda como), mas PHP é muito desorganizada.

Me chamou a atenção no Ruby o modo literal com que as coisas são programadas (3.times { print "Hi!" }, quer algo mais claro que isso?) e o fato de ser totalmente orientada a objeto. Isso mesmo até as operações básicas, com a soma, são objetos! :D

Claro que essas opiniões aqui escritas são percepções minhas, e estão longe de ser verdades absolutas, já que como disse Nelson Rodrigues, "toda unanimidade é burra". Mas eu não estou sozinho.

Ajude a sustentar a Wikipédia e outros projetos, sem colocar a mão no bolso, e concorra a um Eee PC!

Wikipedia…e também a pen drives, card drives, camisetas geeks, livros e mais! O BR-Linux e o Efetividade lançaram uma campanha para ajudar a Wikimedia Foundation e outros mantenedores de projetos que usamos no dia-a-dia on-line. Se você puder doar diretamente, ou contribuir de outra forma, são sempre melhores opções. Mas se não puder, veja as regras da promoção e participe - quanto mais divulgação, maior será a doação do BR-Linux e do Efetividade, e você ainda concorre a diversos brindes!

SSH mais simples ainda

Eu estava brigando a com o rsync para enviar um arquivo para um servidor em que a posta ssh não era a 22 (padrão) e descobri algo muito mais interessante, que com certeza é útil para muita gente.

Você pode criar aliases para suas conexões ssh. O rsync roda utilizando o ssh, então também funciona. Com isso, você pode logar via ssh da seguinte forma: ssh servidor.

Para que isso funcione, altere (ou crie se necessário) o arquivo ~/.ssh/config da seguinte forma:

CODE:
  1. Host servidor
  2.   hostname enredeco.do.host.com
  3.   user nome.do.usuario
  4.   port 22

A porta só especifique se não for o padrão.

Fácil não?

E não esqueça de dar uma olhada no meu artigo sobre como logar sem senha, para facilitar ainda mais sua vida! :D

Utilizando layouts no CodeIgniter

Na grande maioria dos sites e sistemas web é apenas modificado o miolo da aplicação, enquanto que o cabeçalho, rodapé, menu, etc. permanecem iguais. E utilizando o modelo MVC, normalmente para cada action do controller temos uma view correspondente, sendo que geralmente um controller: Main com uma action: index, terá a view main/index.php.

No Code Igniter teríamos que fazer tudo manualmente, já que não há como definir um layout que será carregado em cada view, nem esse carregamento automático.

Pelo menos não havia... :D

Criei um pequeno hook que faz esse serviço. Crie seu controller como abaixo:

PHP:
  1. class Main extends Controller {
  2.  
  3.   function Main()
  4.   {
  5.     parent::Controller();
  6.   }
  7.  
  8.   function index()
  9.   {
  10.     $this->data->foo = $this->db->get('main_table');
  11.   }
  12.  
  13.   function show()
  14.   {
  15.     $this->data->foo = $this->db->get('another_table');
  16.     // Você pode definir manualmente a view e o layout da seguinte forma:
  17.     $this->view = 'main/index';
  18.     $this->layout = 'popup';
  19.   }
  20. }

E ao acessar as duas actions a view main/index.php será chamada com os valores definidos na variável $this->data. Também será carregado o layout application/views/layouts/default.php na função index e application/views/layouts/popup.php na função show.

Download

Faça o download da hook ou de uma aplicação de exemplo (CI 1.6.2).

Instalação

Para utilizar este hook, copie o arquivo Layout.php dentro da pasta application/hooks/, defina a opção $config['hooks'] com true no config e adicione o seguinte no arquivo application/config/hook.php:

PHP:
  1. $hook['post_controller'][] = array(
  2.   'class'    => 'Layout',
  3.   'function' => 'view',
  4.   'filename' => 'Layout.php',
  5.   'filepath' => 'hooks',
  6.   'params'   => array()
  7. );

Espero que goste tanto de utilizar isto quanto eu. Me salva algumas linhas de código.

Cortando e redimensionando imagens com o CodeIgniter

Eu sei que não tenho aparecido muito por aqui, mas o desenvolvimento da nova versão do SiGA está tomando todo tempo imaginável e tive que priorizar aquilo, pois o prazo já está estourando. Mas não é sobre isso que quero escrever.

Recentemente precisei de imagens quadradas num projeto e esse mesmo procedimento se repetiria várias vezes, então criei esta extensão da Biblioteca Image_lib que já vem com o CodeIgniter. Na verdade o código serve não só para imagens quadradas, já que o tamanho tem que ser definido literalmente.

Cole o código abaixo na pasta application/library com o nome MY_Image_lib.php:

PHP:
  1. class MY_Image_lib extends CI_Image_lib {
  2. /**
  3. * Crop and resize a image
  4. *
  5. * @return bool
  6. */
  7.     function crop_and_resize() {
  8.         $width = $this->width;
  9.         $height = $this->height;
  10.         $size = getimagesize($this->source_folder . $this->source_image);
  11.        
  12.         if ($size[0]> $size[1]) {
  13.             $this->width$width / $height * $size[1];
  14.             $this->height = $size[1];           
  15.         } else {
  16.             $this->width = $size[0];
  17.             $this->height$height / $width * $size[0];           
  18.         }
  19.         $this->x_axis = ($size[0] - $this->width) / 2;
  20.         $this->y_axis = ($size[1] - $this->height) / 2;
  21.        
  22.         if ( ! $this->crop() ) {
  23.             return false;
  24.         }
  25.        
  26.         $this->width = $width;
  27.         $this->height = $height;
  28.                
  29.         if ( ! $this->resize()) {
  30.             return false;
  31.         }
  32.         return true;
  33.     }
  34. }

Pra usar é muito fácil:

PHP:
  1. $config = array(
  2. 'source_image' => '/path/para/a/imagem.jpg',
  3. 'maintain_ratio' => false,
  4. 'width' => 48,
  5. 'height' => 48);
  6.  
  7. $this->load->library('image_lib', $config);
  8. $this->image_lib->crop_and_resize();

E temos uma imagem como a mostrada abaixo:

Escritório de Verdade

GroovesharkTenho acompanhado o blog Office Snapshots e o recomendo sem pestanejar, mas algo que eu achava estranho era que todos os escritórios sempre eram arrumados de mais, sem extensões e cabos de rede pelo chão e tudo muito padronizado.

Pelo que vi não fui só eu que estranhei isso, pois foram publicadas fotos do escritório da Grrovershark.

Não que eu ache melhor os escritórios serem bagunçados, mas o custo de se montar um escritório todo personalizado é muito alto. Porém acho que vale a pena conferir todos, por que sempre podemos pegar uma ou outra idéia para melhorar o ambiente onde trabalhamos.

Tema novo

Finalmente, depois de um ano e pouco e várias tentivas de temas fiz um que acabei e gostei. O tema ainda está bem cru, pois já são 2 horas e comecei ontem as 17h (total de 9 horas). Isso que ainda dei um tempo no meio. :D

Deixei o tema mais limpo, com layout líquido e removi todos os restos de AdSense. Deve estar com vários furos, se achar algum, por favor me avise. O que achou?

CodeIgniter em PHP5 ou PHP4?

Recentemente tem havido bastante discussão[bb] sobre o por que de o CodeIgniter não partir apenas para o PHP5, mas não entendo isso, já que um dos grandes motivos que me levou a ter interesse por esse framework[bb] foi por ele suportar o PHP4. Entendo e concordo que o PHP5 é muito superior, poder trabalhar apenas com OO é muito melhor, mas existem dois grandes problemas que travam a adoção ao PHP5.

Quem nunca teve que fazer um site pra hospedar num servidor com PHP4 e MySQL 3.23? (E olha que uma das maiores empresas de hospedagem[bb] do Brasil tem uma configuração parecida com essa! Qual é a sua?) Por mais que os desenvolvedores do PHP[bb] façam campanha de adoção do PHP5, que o PHPmyAdmin prometa que as próximas versões apenas serão pra PHP5, isso NÃO vai mudar. As hospedagens ainda são PHP4 e adoção ao PHP5 é lenta (cerca de 1% ao mês).

Outro fator é que infelizmente a maioria dos desenvolvedores são medíocres. Não estão nem um pouco preocupados com MVC, OO, padrões web[bb] e tudo mais. E isso acaba influenciando as hospedagens, que tem medo de quebrar os códigos de seus clientes. Não que eu me considere um grande programador, mas isso é o que todos tinham que ter como base (ou pelo menos vontade de aprender).

Voltando ao CodeIgniter, o Derek Allard, um dos desenvolvedores do CodeIgniter, já disse que o PHP4 será suportado por bastante tempo ainda, justamente por isso. Não adianta querermos impor algo, quando não temos meios para forçar.

Não quero de maneira nenhuma defender os hosts que não fazem upgrades, muito menos a "sobrinhada", mas acho que as vezes esquecemos que vivemos em mundo que não é perfeito, que por mais que queiramos que as coisas sejam ótimas, elas apenas podem ser tão boas quanto possível.