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].

Pegando o conteúdo de um iframe

Hoje tive um daqueles problemas[bb] que você pensa, pensa, pensa, e não consegue resolver.

Meu problema era enviar um arquivo via AJAX[bb]. Como isso não é possível, temos que usar uma velha técnica na qual cria-se um iframe e se dá o submit do form para este. Tudo certo. Mas temos que pegar o valor do iframevia javascript para saber se correu tudo bem e o que aconteu.

Fiz alguns testes e nao estava conseguindo pegar o valor do iframe. O motivo? Levei 3 horas para descobrir. Não se consegue pegar o valor se o iframe não estiver no mesmo domínio que a página atual.

Ou seja, nos testes eu estava usando tudo menos o domínio atual. Que serviço.

Para pegar o valor, existem 2 métodos:

1) Mais fácil com a jQuery:

JavaScript:
  1. $('iframe').contents().find('body').html()

2) Um pouco maior, mas apenas javascript:

JavaScript:
  1. var io = document.getElementsByTagName('iframe')[0];
  2. if(io.contentWindow) {
  3. return io.contentWindow.document.body.innerHTML;
  4. } else if(io.contentDocument){
  5. return io.contentDocument.document.body.innerHTML;
  6. }

Mas não esqueçam. Tem que ser do mesmo domínio.

Obrigado ao Israel Cefrin por me dar a dica que tinha que funcionar e me fazer descobrir isso.

O Framework CodeIgniter

O que um framework tem que fazer? Sério, copiar o Rails?

Tudo bem que seja um om espelho, mas não pode ser feito com fé cega, acreditando que o que o rails faz é o que há de melhor pra se fazer. Não que RoR seja ruim, muito pelo contrário, mas existem vários frameworks imitando-o sem pensar um pouco.

Eu programo em PHP para viver, poderia mudar já que sou eu quem define isso, mas ainda só estou testando outras linguagens para a web. Recentemente resolvi que iria usar um framework para desenvolver, pleos motivos que todo mundo sabe: utilização de MVC, programação mais rápida, etc.

Cheguei a testar o CakePHP, mas não gostei dele pois ele te faz trabalhar como ele quer, não como o programador quer. Bati cabeça com mais alguns e resolvi que montaria meu próprio framework. Programa, programa, programa... Ainda falta muito pela frente...

Logo do CodeIgniterAté que parei e conheci o CodeIgniter. Achei muito bom, é um framework legal e que me dava a liberdade que eu não tinha com o Cake.

Este framework, apesar de ter sido baseado no Rails, não o segue cegamente e dá um liberdade muito grande pra trabalhar do jeito que o programador quiser. Claro que ele tem uma padronização, mas a liberdade vem em você usar as ferramentas que são fornecidas muito facilmente.

Se você quer saber mais sobre o CodeIgniter, sugiro que veja os screencasts do Elliot Haughin, que foi o que me fez ver o que o CodeIgniter podia fazer; leia o blog do Derek Allard, que é um dos desenvolvedores do Framework; e LEIA O MANUAL. Em português, a comunidade ainda está se formando, mas já existe o site codeigniter.com.br, lá se encontra o manual traduzido, um fórum (que atualmente está fora do ar) e a lista de discussão.

Aguardem alguns artigos aqui sobre esse tema.

Utilizando ferramentas e não muletas

Você já se viu sem martelo[bb] quando precisava pregar algo? E teve que usar uma chave de fenda ao contrário pra fazer isso? Funciona, mas é mais demorado e não é tão simples quanto usar o martelo.

MuletaDigo isso, pois freqüentemente nas listas que participo acontecem discussões inflamadas sobre usar ou não usar algo, como IDEs, frameworks[bb], etc. Claro que por um lado isso é bom, pois toda unanimidade é burra, porém essa discussão sempre acaba no "usa o teu e te ferra que eu uso o meu e fico na boa". E a outra pessoa responde a mesma coisa.

O problema é que hoje temos que ser agis e ao mesmo tempo fazer um serviço de qualidade. E isso as vezes parece não ser levado em contra por aqueles que querem usar as ferramentas mais simples. E aí se encaixa a história do martelo lá de cima.

Você pode programar um site[bb] grande usando o Vi, mas renderá mais usando uma IDE que te auxilie.

Mas aí entra o grande detalhe: Você tem que saber se virar sem a IDE, pois um belo dia o site pode estar fora do ar e você não poder usar sua magnífica IDE para resolver o problema. E nessa hora você tem que se virar com o que tem. Nem que seja com notepad.

Outro exemplo é javascript, existem várias bibliotecas que facilitam a vida, mas na hora que algo tem que ser feito sem ela, você tem que saber usar javascript "nativo".

O importante é que as ferramentas[bb] nos ajudem a fazer o serviço bem feito e rápido. E não que sirvam como muletas, e que sem elas não consigamos sair do lugar.

Crédito da Foto: Daquela manera

No Globo Repórter desta noite

Ontem a noite passou uma edição do Globo Repórter que falva sobre Finanças Pessoais. Mostraram casos de pessoas que construíram uma casa arrumando unha (1 milhão de unhas diga-se de passagem), de crianças que poupam suas moedas e conseguem comprar bens relativamente caros, mostraram 2 amigas, uma que é gastadora e outra que controla melhor seu dinheiro.

Mas apesar de tudo isso, em nenhum momento falaram sobre como controlar melhor gastos ou qual a melhor forma de ensinar as crianças a controlar seu dinheiro. E desse mal o Globo Repórter já vem sofrendo faz um bom tempo.

Matérias sem profundidade nenhuma, apenas uma hora de "matação" tem se tornado comum na Rede Globo[bb]. Veja o Fantástico, que consegue passar 3 horas filosofando sobre o nada.

BrigaNa outra mão corre a Rede Record[bb], que tanto no Repórter Record (concorrente do Globo Repórter), quanto no Domingo Espetacular (concorrente do Fantástico) tem mostrado matérias aprofundadas e com mais conteúdo. Claro que sempre tem aquela mania de ficar anunciando o programa todo uma reportagem que só aparecerá no fim, mas nada é perfeito.

Tem sido interessante essa busca do Bispo Edir Macedo[bb] em se tornar líder de audiência. Inclusive eles prentedem ser os líderes de audiência até 2012. Parece pouca coisa, mas aqui no Brasil[bb] a TV sempre foi Globo, desde que a Globo foi criada em 1965. Isso mesmo, 42 anos de liderança.

Nenhum dos dois é santo, mas espero que essa briga ajude a ter menos decepções como a que tive ontem, quando ao terminar o programa, virei pra minha mulher e perguntei: "Tá, e aí? O programa passou e não ajudou em nada!"

Crédito da Foto: Julian Robinson.