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.

Named params no Code Igniter

Named params são parâmetros enviados numa url, mas sem ordem definida. Na prática são o velho ?var=valor&var2=valor2, mas de um modo mais limpo.

www.seusite.com/controller/método/nome:Felipe/cidade:Teutônia/

Eu venho utilizando CodeIgniter há algum tempo e ele não permite passar variáveis como o PHP normalmente faz e acabei criando algo assim para utilizar. E quando li o artigo do Tulio Faria falando sobre named params, mas no CakePHP, a primeira coisa que pensei é que deveria disponibilizar minha função aqui no blog.

Na verdade é uma estensão da biblioteca URI:

PHP:
  1. class MY_URI extends CI_URI {
  2. function named_param($var) {
  3. $arr = $this->segment_array();
  4. foreach ($arr as $value) {
  5. if ($var == substr($value, 0, strpos($value, ':'))) {
  6. return substr($value, strpos($value, ':')+1);
  7. }
  8. }
  9. return null;
  10. }
  11. }

Para chamar essa função faça da seguinte maneira:

PHP:
  1. $this->uri->named_param('nome'); // Na url de exemplo acima retornaria Felipe
  2. $this->uri->named_param('cidade'); // Na url de exemplo acima retornaria Teutônia

Update:

Conversando o Guilherme Medeiros, chegamos a uma solução diferente da de cima. Nesta versão não se chama uma função que retornará o valor, mas sim os valores já estão na variável named, ficando a classe assim:

PHP:
  1. class MY_URI extends CI_URI {
  2. var $named;
  3.  
  4. function MY_URI() {
  5. parent::CI_URI();
  6.  
  7. $uri = $this->segment_array();
  8. foreach($uri as $val) {
  9. if (strpos($val, ':')) {
  10. $this->named->{substr($val, 0, strpos($val, ':'))} = substr($val, strpos($val, ':')+1);
  11. }
  12. }
  13. }
  14. }

Sendo usado assim:

PHP:
  1. $this->uri->named->nome; // Na url de exemplo acima retornaria Felipe
  2. $this->uri->named->cidade; // Na url de exemplo acima retornaria Teutônia

Vale lembrar que o valor deve ser testado com o isset(), pois pode não existir.

Editor WYSIWYG muito leve

Hoje me deparei com algo que já venho procurando faz um bom tempo[bb]. Um editor WYSIWYG que fosse leve.

A maioria dos editores tem mais de 100KB, chegando alguns a mais de 200KB. O NicEdit por outro lado tem menos 35 KB e, se comprimido menos de 10KB. Obviamente ele é simples, mas quem precisa do word quando quer colocar negrito em uma ou outra palavra? Lembre-se conteúdo é o rei!

No site[bb] tem vários exemplos de como se utiliza ele, além de bastante informação[bb].