sexta-feira, 21 de novembro de 2014

Ruby - Estendendo objetos

Ruby é uma linguagem impressionante pelo dinamismo e nova forma de olhar o mundo.
Adoro a maneira Ruby de se resolver problemas, e na minha busca em escrever código cada vez mais idiomático não poderia deixar de estudar sobre módulos.

Módulo Exemplo


Abstratamente um módulo é uma forma de agrupar métodos e classes sob um namespace.
No exemplo estou criando o módulo ExemploModulo e o método custom_inject.

Tendo o módulo podemos disponibilizar o método como sendo de instância ou como sendo de classe.

Abaixo disponibilizando método de instância:

Include


Abaixo disponibilizando método de classe:

Extend



Em outras linguagens como PHP ou Java a maneira de se estender objetos não difere muito entre si, ficando dentro dos limites impostos pelo conceito de herança. Esses também presentes no Ruby, mas com aquela pitada rubista.

Isso é tudo!

quinta-feira, 13 de novembro de 2014

Assets Pipeline WEBrick em Produção

Lembrete

Para carregar assets corretamente no WEBrick em Produção não esquecer de mudar configuração em config/environments/production.rb:
 config.serve_static_assets = true  

E isso é tudo!

segunda-feira, 10 de novembro de 2014

Iniciando Loja Spree 2.4-stable

A finalidade do post se justifica ao fato de que o Getting Started recomenda instalar a gem spree em escopo global, e depois executar a task install.
Fazendo assim o instalador usa o spree 2.3, e não o 2.4 que seria última versão estável.

Para usar o 2.4 não é preciso instalar a gem globalmente.
No github já é possível encontrar informações sobre como usar a versão 2.4

Mas básicamente é preciso adicionar ao Gemfile:

 gem 'spree', github: 'spree/spree', branch: '2-4-stable'  
 gem 'spree_auth_devise', github: 'spree/spree_auth_devise', branch: '2-4-stable'  

Mandar um:

 bundle install  

E depois executar a task install:

 rails g spree:install  

E isso é tudo!

sexta-feira, 31 de outubro de 2014

Alterar Rails 4 models para readonly

Pequena receita de bolo para alterar ActiveRecord::Base models para readonly:

module ActiveRecord  
  class Base
    validate :validate_readonly

    def readonly?
      true
    end

    def validate_readonly
      errors.add(:base, 'Erro readonly') if readonly?
    end
  end  
end

Sem o validate o código lança uma exceção do tipo ActiveRecord::ReadOnlyRecord.

sexta-feira, 18 de julho de 2014

PHP empty function

Hoje comecei a me questionar se a função empty do php é realmente útil. Depois de perder um tempo para perceber que 0 é empty na opinião do php, decidi que vou abolir o uso desta.

Não acho que tenha sido um mistério essa descoberta, pois na documentação do empty é explicito que essas situações são consideradas empty:
  • "" (an empty string) 
  • 0 (0 as an integer)
  • 0.0 (0 as a float)
  • "0" (0 as a string)
  • NULL
  • FALSE
  • array() (an empty array)
  • $var; (a variable declared, but without a value)
Eu só não concordo com a terceira. Zero sem sobra de dúvidas é um valor!

Como alternativa faço a seguinte sugestão:

Cheers!

quinta-feira, 17 de julho de 2014

Custom find types no CakePHP

Minha primeira opinião sobre o recurso não foi positiva, achei desnecessário, mais fácil fazer um método qualquer do que criar um tipo de busca.

Até que um pouco mais tarde encontrei utilidade com o PaginateComponent. Esse monta a busca dinamicamente e nesse processo passa os parâmetros recebidos para ORM do cake, nesse caso não havia outra forma de customizar a busca se não fosse com custom find types.

Nota: Usar os hooks mais genéricos, afterFind e beforeFind, não eram uma boa saída para o meu caso, mas o funcionaria com o PaginateComponent.

Sem mais delongas a receita:

Model

Adicionar atributo
public $findMethods = array('nameCustomType' =>  true);
Criar método
protected function _findNameCustomType($state, $query, $results = array()) {
        if ($state === 'before') {
            $query['conditions']['Article.published'] = true;
            return $query;
        }
        return $results;
    }
O cake chama esse método duas vezes, alternando a variável state. Quando ele passa no state before temos que retornar a query, caso contrario retornar results.

No model isso é o bastante.

Já no paginate a manha está em usar um índice no mesmo nível que fields ou conditions no array de configurações especificando o tipo de busca. Ex.:

 $this->paginate = array(  
   'ModelName' => array(  
     'findType' => 'nameCustomType'  
   )  
 );  
 $this->paginate('ModelName',$filter);  

Com isso o paginate vai executar o hook criado.

Eu achei a interação muito boa, em total harmonia com o PaginateComponent, vale a pena usar.

Cheers!

terça-feira, 24 de junho de 2014

nohup

Dica nohup Executa comandos demorados no linux, a saída do comando vai para nohup.out, esse por sua vez fica no diretório em que o comando está sendo executado.

Exemplo de utilização

nohup ./comando &