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 &

segunda-feira, 20 de janeiro de 2014

Vagrant + (PHP-5.2 + Apache + Firebird)

Essa é triste, mas como eu perdi dias montando o script talvez valha o post!

Antes de qualquer ofensa vou já me justificando que não estou desenvolvendo nada novo usando php 5.2! Meu caso é um caso de “manutenção” e evolução do sistema para versões posteriores.

Desculpas na mesa, vamos ao desenvolvimento do script. Não tenho muito o que dizer sobre o processo de desenvolvimento do script, foi um processo em que fui caminhando sob os problemas um de cada vez.
Meus primeiros testes em compilar o php foram utilizando o mínimo de argumentos. E fui gradualmente adicionando novos argumentos ao ./configure e corrigindo os erros, fazendo downgrade de versão de softwares dependentes, aplicar patch de correção de erro, etc.

Não vou descrever os passos isoladamente pois não me lembro deles, infelizmente. No meio do processo de crianção do script eu entrei de férias e minha memória foi corrompida durante as férias.

Mas estou divulgando o link do repositório com o Vagrant file nos Links. Imagino que possa servir de inspiração para alguém que esteja passando por situação semelhante, rodar algo que ainda estejam com php <= 5.3. A partir da 5.3 já é possível instalar via repositório (ex.: apt-get).

PS: O primeiro link é um post supimpa que achei a informação do patch necessário para corrigir um erro do OpenSSL no Ubuntu.

[]’s

Cheers

Links

quinta-feira, 16 de janeiro de 2014

Chrome Apps - Primeiras Impressões

Hoje tive a oportunidade/necessidade de fazer um teste com as Google Chrome Apps.

Cheguei ao assunto pois precisei perssistir alguns dados localmente a partir de uma web app.
A principio optei por soluções em HTML5 que funcionaram muito bem nos browsers suportados, só que nos browsers não suportados era problema. O Chrome implementa praticamente todos os novos recursos do HTML5, então Chrome App foi um caminho natural. A idéia seria minimizar os problemas com outros browsers obrigando o usuário a usar só o Chrome.

Alem de implementar as APIs do HTML5, o Google oferece a Chrome Platform API para ser consumida dentro da Chrome App. Nessa API existem recursos  para trabalhar com notificações, acesso a dispositivos ligados em alguma porta USB, acesso a dispositivos ligados a portas serial, recursos facilitadores que utilizam APIs do HTML5 e mais uma serie de coisas bacanas. Veja documentação da API para ver todo conteúdo.

Sobre a curva de aprendizagem, não me parece muito longa. Se tiver um pouco de afinidade com html, css e javascript não haverá problemas, sem falar que a documentação é ótima.

A comunidade ainda está meio devagar, mas mesmo assim, eu acredito na popularização das Chrome Apps. Pretendo inclusive utilizar em novos produtos.

Recomendo assistir ao video da apresentação sobre Chrome Apps no Google I/O 2013 e também fazer a first app da documentação oficial.

Finalizo minhas impressões dizendo que  fiquei maravilhado com o resultado final!
Pretendo investir mais tempo na tecnologia e escrever mais alguns posts.

Obrigado por ler até o fim.

[]’s

Cheers

Links: