quarta-feira, 31 de agosto de 2011

Foreman

0



I've watched the RailsCasts #281, and Ryan Bates is talking about the Foreman gem. At the first time I did not mind for the project, this is interesting, but I don't see how it's can be useful for me. Then I go back to the project when I'm working. I open my iTerm, an tab for mongod, and tab for spork, and a tab for  guard, and another to run the generators.
After I open all this tabs, Foreman gem cames to my mind. Well, I gave to Foreman a opportunity, and I loved it.

If you think this scenario is the same of you, take a look at Foreman, and give to it a chance.
You can add the gem to your Gemfile or install it by your own hand. To work foreman only needs a file called Procfile. in this manifest file, you name your process and tell to foreman what command they should use, and above a simple Procfile for the scenario:



Very simple file, I've a process called mond, wich executes "sudo mongod" and starts the mongodb database, You'll see in the console, something like that "mongod.1 | started with pid XXX", every log from mongod will appear in the console.

To start all this process type "foreman start", Now I've only one tab running all my development processes.

Read more

segunda-feira, 29 de agosto de 2011

A Todo App written in backbone.js

0

Hey Guys,

I'm back again :)

I the weekend I write a simple app based on the Backbone.js demo the Todo App, this app is very simple, and has only one model. In my first studies I'm tried to make this todo model related to an todo list, such as the 37Signals' application Tada List, here you have a main list, and you add your tasks inside this list. But I fail with that, I can't understand Backbone itself, and I'm trying to do JQuery things and Rails Things on the backbone, and the app is not what I'm trying to do. You can checkout the source code of this fail (but working) app here: https://github.com/fellix/todo-list

Well, I forget that app, and I passed to study more about the backbone, I take a look inside the router, written the backbone-galley in a rails app, and that give me more details about the backbone. With that visions I tried to write the todo-list app again, but for now, I using Rails 3.1.rc5 and coffeescript, I have no problems with coffeescript insted of JavaScript, and I don't know why many people hates coffeescript.

After that write the app comes up http://backbone-todos.heroku.com/ and you can checkout the source code at https://github.com/fellix/backbone-todos, I'm choice the haml-js for the views, I really love haml :), for the Rails 3.1 I used that gem (https://github.com/andrewtimberlake/ruby-hamljs) for render the haml-js template, and works like magic.



Going back to the app,  the only view that was served by the rails is the home/index.html.haml, wich have only the div wich is used for render the templates, all of you can see is rendered for backbone.

That's all folks

Read more

terça-feira, 19 de julho de 2011

Backbone.JS

0

Faz muito tempo que não escrevo aqui no blog.
Ultimamente estou bem atarefado e tenho muitas coisas a escrever e publicar, porém me falta tempo para organizar as idéias e as por no blog.

Hoje vou falar de um assunto que está me tomando um certo tempo meu. Estou estudando Backbone.JS

WTF?


Backbone é um framework JavaScript para criação de Front-end RIA (Rich Internet Application), Novidade? Não.

O Que mais chamou a atenção no backbone, diante das 1239081238109238 opções que existem?

1) Suporte a Mobile.
2) Integrado com JQuery
3) Visual Clean
4) Focado em MVC
5) Usa RestFull

5 itens para ressaltar o por que do Backbone.

Desenvolvendo

O mais legal do Backbone é que ele é puro JavaScript, não existem tags geradas durante a execução, e seu CSS pode ser usado sem nenhum problema. E o principal o código gerado é o codigo escrito, usando tanto Inspect Element quanto um View Source não vão mostrar um código absurdo que somente seu navegador consegue ler. Nunca fui muito fã de aplicações RIA, justamente por que elas dificultam essa parte de inspeção dos elementos e foi justamente isso que me chamou a atenção no backbone.

Basicamente o Backbone é composto por Events, Models, Collections, Routers e Views. 

Event: É um modulo que pode ser anexado em outros objetos. Ele é simplesmente composto dos metodos bind, unbind e trigger.

Model: É o núcleo da sua aplicação com Backbone, é nele que ficam as lógicas de persistencia, validação, e algum trabalho com a tela. Um model pode ser qualquer coisa, assim como no Rails seu model não precisa, necessariamente estar ligado a um base de dados. Um exemplo de um Model


O uso do window é usado somente para definir esse objeto como global para poder usar por exemplo new Album. Essa é uma das maiores classes do Backbone, vale a pena dar uma olhada na documentação

Collection: Não são nada mais do que uma coleção de modelos. Para definir é necessário passar o model que representa essa collection e também um URL que será usada para buscar e preencher a listagem.


Esse é outro objeto simples do backbone :)

Router: Router é responsavel por gerenciar as urls do backbone. e saber para qual callback redirecionar. as urls do backbone começam com um # ex: (#users/felix). Nem toda a aplicação precisa de um Router, mas se sua aplicação precisar de uma complexidade maior vai precisar sim :)

PS: Na versão 0.3 do backbone ele era chamado de Controller.
Reparem que na definição da rota eu não preciso definir o # antes da url, mas para executa-la nas views o link deve ser #collection/1/album/1 reparem que substitui os wildcards (:album_collection_id e :id) pelos ids que vou trabalhar, esse link com o # dispara o router do backbone que já deve ser previamente inicializado (new), e deve existir uma (uma e somente uma),chamada ao metodo Backbone.history.start() dessa forma o backbone inicia a leitura das URL.

View: Uma view para o backbone é algo renderizado na tela, baseado em tags, vc pode renderizar suas telas usando JavaScript, cada view é responsavel por gerenciar seus eventos. Existem um atributo chamado events, onde os eventos podem ser definidos como por exemplo para submter o form da propria view você teria uma sintaxe parecida com essa "submit form": "save", onde submit é o evento, form é selector do JQuery, e save é o callback que será executado quando o form for submetido. Simples não?

Exemplos

Sem mais o que falar vou por alguns links aqui.


Essa foi a aplicação base para fazer alguns estudos e me ajudou bastante a entender alguns conceitos sobre o backbone.

Reescrevi a mesma aplicação usando o Rails 3.1:

Na wiki do Backbone tem muito mais exemplos não deixem de conferir, existe até um exemplo de Mobile :)

Read more

domingo, 1 de maio de 2011

Nova fase

0

Bah, falei que não ia usar mais o blogger, mas é muito melhor que minha própria ferramenta :P.

Desculpem ficar tanto tempo sem escrever, porém estava numa correria nos últimos tempos. Após 2 anos e 4 meses trabalhando na SeRHmática, saí para encaram um desafio novo, sempre gostei de trabalhar lá, mas senti que era hora de tentar algo novo diferente.

Sempre trabalhei como CLT, mas agora vou trabalhar como PJ e em Home Office, meu medo é de não me acostumar :P, amanhã (02/05/2011) é meu primeiro dia full time na Crafters, estou trabalhando já a um mês com eles em um projeto Ruby on Rails.

Me desejem sorte :)

Read more

terça-feira, 8 de fevereiro de 2011

Novo blog

0

Galera escrevi meu proprio blog, e vou abadonar o blogger :), aos poucos claro, mas posts futuros somente no novo (temporário) endereço http://rollingwithcode.heroku.com/

Read more

segunda-feira, 10 de janeiro de 2011

JPA 2.0 Criteria Sucks

2

I sometimes need to use the Criteria in JPA, I don't know why, but the create query method not accept order with asc and desc in the same query, the Criteria support it, but damn, it's very hard, I don't know who think this code

ParameterExpression age = qb.parameter(Integer.class);
Predicate condition = qb.gt(p.get(Person_.age), age);
c.where(condition);
TypedQuery q = em.createQuery(c); 
List result = q.setParameter(age, 20).getResultList();

is better than this one

String jpql = "select p from Person p where p.age > :age";
Query query = em.createQuery(jpql).setParameter("age", 20);
List result = query.getResultList();

I don't need to map my class into another object called metamodel, one change in a model results into two changes, the model and the metamodel. Go to hell with de metamodel, we don't want, and don't need it, I write my queries using JPQL and don't want to use the Criteria API. Why they don't use the hibernate style? The code below isn't better?

List cats = sess.createCriteria(Cat.class)
    .add( Restrictions.like("name", "Fritz%") )
    .add( Restrictions.between("weight", minWeight, maxWeight) )
    .list();

Yes, I copy this codes from IBM and Hibernate:).

Read more

domingo, 9 de janeiro de 2011

RSpec+Mongo+DatabaseCleaner

0

Em portugues

Some times ago, I wrote about RSpec and MongoDB I was used the DatabaseCleaner 0.5.2, the version 0.6.0 was released some times ago, and I not tested it before, the changes are simple, the main change is the orm options need to be before the stategy option, see below the spec_helper.rb:


RSpec.configure do |config|
  config.before(:suite) do
    DatabaseCleaner.orm = :mongoid
    DatabaseCleaner.strategy = :truncation    
    DatabaseCleaner.clean_with(:truncation)
  end  
  config.before(:each) do  
    DatabaseCleaner.start
  end
  config.after(:each) do  
    DatabaseCleaner.clean
  end
end

Also changed the before option, now it's initialize the Cleaner, and the after option, clean the database

Read more

RSpec+Mongo+DatabaseCleaner

0

A algum tempo atrás escrevi sobre RSpec e MongoDB a versão que usei o database cleaner na época era a 0.5.2, a algum tempo atraz saiu a versão 0.6.0, e eu ainda não havia testado, bom as alterações são simples, a principal é que o orm deve vir primeiro, veja abaixo como ficaria o spec_helper.rb

RSpec.configure do |config|
  config.before(:suite) do
    DatabaseCleaner.orm = :mongoid
    DatabaseCleaner.strategy = :truncation    
    DatabaseCleaner.clean_with(:truncation)
  end  
  config.before(:each) do  
    DatabaseCleaner.start
  end
  config.after(:each) do  
    DatabaseCleaner.clean
  end
end

também foi alterado para o before, iniciar o Cleaner, e o after para limpar. :D

Read more

terça-feira, 28 de dezembro de 2010

Ruby on Rails + JasperReports (IReport)

0

Atualmente aqui na Serhmática, usávamos um sistema interno, uma aplicação "Cobaia" feita em Swing para gerencia de projetos, estávamos a algum tempo estudando o desenvolvimento de uma nova ferramenta WEB, onde nossos clientes pudessem acessar, diminuindo o fluxo de email, e tornando o contato com o cliente mais transparente. Como estamos com muito tempo de sobra, não conseguimos progredir com a aplicação, e procuramos uma solução que pudesse nos atender, eis que encontramos o Redmine, uma aplicação escrita em Ruby on Rails, nossa intenção inicial, era rodar no Glassfish que já tinhamos configurado, porém houve inconsistências, BUGS não explicados pela internet, e partimos a rodar via Mongrel mesmo.

Testamos e gostamos da ferramenta, ainda não está pública para os clientes, mas aos poucos vamos liberando, surgiu um outro problema, precisávamos de alguns relatórios no nosso estilo, que pudesse ser encaminhado aos clientes, a primeira coisa que pensei foi FODEU.


Pesquisei na net e cheguei até um blog brazuca, que tinha um projeto parecido com o que eu queria, testei os códigos desse cara, infelizmente ele não lista os jars que vc precisa, mas vou listar aqui:

  • commons-beanutils
  • commons-collections
  • commons-digester
  • commons-logging
  • commons-logging-api
  • iText
  • jasperreports
  • postgresql


 e tive o primeiro sucesso, e veio o primeiro problema, precisava parametrizar as buscas, não como no modelo do cara, dai resolvi fazer diferente:

1) Criar no relatorio_controller uma action e mapeei ela no routes.rb
2) Criei a tela com form_tag e adicionei os parametros
3) no retorno da action fiz a busca e mandei pro relatório.

Eis que vem o primeiro erro, o JasperReports não conseguiu processar o modelo do Ruby.
Matutei uma solução e encontrei, criei um projeto bem simples, coloquei uma classe la dentro, e adicionei os campos, no IReport criei o relatório com base naqueles campos. A classe ficou mais ou menos como a classe abaixo:

public class Relatorio{
  private Integer issue_id;
  private String issue_subject;
  private String issue_description;
}
criei assim mesmo fora do padrão com os underlines (_) para ser mais facil pro ruby reconhecer.
depois da busca efetuada, percorri o resultado e fui criando novos objetos desse relatorio, passei esse objeto para o model Relatorio e no final converti o Ruby Array em um ArrayList e depois em um JRBeanCollection

@dataSource = JRBeanCollectionDataSource.new(ArrayList.new(dados))

editei tbm o metodo to_pdf e ficou assim:
def to_pdf
    fill = JasperFillManager.fill_report(@modelo, @params, @dataSource)
    pdf = JasperExportManager.export_report_to_pdf(fill)
    return String.from_java_bytes(pdf)
end

e pronto, agora estou com o Redmine rodando no mongrel e gerando relatório em PDF com o JasperReports.

Em tempo: Criei um jasper.rb na pasta config/initializers, ele carrega as libs ao invés de deixar no model.

Tbm alterei os observers e os fiz rodar em um Thread a demora do servidor de email pra responder causava lentidão no sistema, por exemplo o MessageOberver

class MessageObserver < ActiveRecord::Observer
  def after_create(message)
    t = java.lang.Thread.new do
      Mailer.deliver_message_posted(message) if Setting.notified_events.include
    end
    t.start
  end
end

Espero que isso seja util pra mais alguém, qualquer dúvida comenta ai que vejo se posso ajudar.

Read more

quarta-feira, 15 de dezembro de 2010

Days of week in ruby

0

Em português

I don't know why, nobody need it, I searched at the web, and I'm not found a solution for this, by the way, I implement my own solution.

You can see some explain about the method here (in Pt-Br): http://www.arlindo-correia.com/140101.html
But, I converted the javascript code at http://www.profcardy.com/calculadoras/aplicativos.php?calc=4 to ruby

the result is this monkey patch

class Time
  DAYS_OF_WEEK = [
    :saturday, :sunday, :monday, :tuesday, :wednesday, :thursday, :friday
  ]
  def day_of_week
    day = self.day
    month = self.month
    year = self.year
    if month == 1
      month = 13
      year -= 1
    end
    if month == 2
      month = 14
      year -= 1
    end
    phase1 = ((month + 1)*3)/5
    phase2 = (year/4)
    phase3 = (year/100)
    phase4 = (year/400)
    phase5 = day + (month*2)+phase1+year+phase2-phase3+phase4+2
    phase6 = phase5/7
    result = phase5-(phase6*7)
    DAYS_OF_WEEK[result]
  end
end

and some result by irb (I've used the rails console)
irb(main):001:0> t = Time.now
=> Wed Dec 15 22:05:00 -0200 2010
irb(main):002:0> t.day_of_week
=> :wednesday
irb(main):003:0> t.prev_month.day_of_week
=> :monday

If somebody know another way to do it, I'm listening

Read more

Dias da Semana no Ruby

0

Não sei por que ninguem nunca precisou isso no ruby, sei la, procurei na net e não encontrei nada resolvi implementar minha propria solução.

A documentação teorica está aqui: http://www.arlindo-correia.com/140101.html
Porém pra fazer a conversão, converti o codigo desse site http://www.profcardy.com/calculadoras/aplicativos.php?calc=4 do javascript para o ruby

o resultado foi esse monkey patch

class Time
  DAYS_OF_WEEK = [
    :saturday, :sunday, :monday, :tuesday, :wednesday, :thursday, :friday
  ]
  def day_of_week
    day = self.day
    month = self.month
    year = self.year
    if month == 1
      month = 13
      year -= 1
    end
    if month == 2
      month = 14
      year -= 1
    end
    phase1 = ((month + 1)*3)/5
    phase2 = (year/4)
    phase3 = (year/100)
    phase4 = (year/400)
    phase5 = day + (month*2)+phase1+year+phase2-phase3+phase4+2
    phase6 = phase5/7
    result = phase5-(phase6*7)
    DAYS_OF_WEEK[result]
  end
end

E os testes usando irb (na verdade usei o console do rails)
irb(main):001:0> t = Time.now
=> Wed Dec 15 22:05:00 -0200 2010
irb(main):002:0> t.day_of_week
=> :wednesday
irb(main):003:0> t.prev_month.day_of_week
=> :monday

Se alguem souber como recuperar o dia da semana sem o path me avisa ehhee.

Read more

quarta-feira, 8 de dezembro de 2010

Modelos sem tabelas no rails

0

Bah, esse me surgiu esses tempos, e resolvi fazer alguns testes, eu armazeno um objeto em uma sessão com o rails, mas eu não tinha intenção de armazenar essa bagaça na base, somente em memória. sem ideias fui eu pela internet buscar como fazer isso. O Rails 3 modularizou boa parte do rails, um refactoring grande, mas que facilitou muita coisa, como o teste abaixo, por exemplo:

class Person
  attr_accessor :name, :age
end

Ta tio, e se quiser usar as validações e outras coisas do rails? vou ter que fazer tudo no braço? Bom é claro que não né, que puta perca de tempo isso. Veja a adaptação abaixo:

class Person
  include ActiveModel::Validations
  include ActiveModel::Conversion
  extend ActiveModel::Naming

  attr_accessor :name, :age
  validates :name, :age, :presence => true

  def initialize(attributes = {})
    attributes.each do |name, value|
      send("#{name}=", value)
    end
  end  
  
  def persisted?
    false
  end
end

vejam só que maravilha, agora vc pode fazer coisas como essas (irb):

p = Person.new
=> #
p.valid?
=> false
p.errors
=> #["translation missing: br, activemodel, errors, models, person, attributes, age, blank"], :name=>["translation missing: br, activemodel, errors, models, person, attributes, name, blank"]}>

Ooops, falta as traduções, mas isso é dever de casa né ashudahushud.

Read more

quinta-feira, 18 de novembro de 2010

Formulas Matemáticas Em Java

0

Quem nunca precisou usar alguma formula matemática em Java, para efetuar alguma operação?

Existem alguns casos que o usuário quer definir a formula do calculo. Muitas vezes isso é uma comodidade para ele, e um PARTO para os desenvolvedores, algumas metodologias ou bibliotecas resolvem o problema, porém você tem que implementar algo, sempre tem algum ajuste. Precisei usar o Metodo Price em um calculo financeiro, a formula não é complexa, mas como toda a formula matemática, deve se ter cuidado com os parênteses. Eu pensei em fazer algo mais braçal, mas como um bom preguiçoso, resolvi gastar um certo tempo pesquisando algumas maneiras de fazer isso, eis que me surge uma luz no fim do túnel, o Bean Scripting Framework. Linguagens de script são mais flexíveis nesse aspecto que em Java, muitas vezes temos que fazer em alguns casos contornos maiores, como usamos Java 6 para desenvolver, que tem suporte ao ScriptEngine, tudo flui mais fácil, se você usa alguma versão mais antiga, por favor faça um upgrade urgente, quem está perdendo é você.

PS: As bibliotecas são referenciadas via maven, se for usar ANT ou qualquer outra coisa, tem que procurar no Google.

vamos precisar de duas simples bibliotecas o projeto o Bean Scripting Framework (BSF -> bsf:bsf) e o groovy (org.codehaus.groovy:groovy) (você pode usar Jython, JRuby, e qualquer outra coisa que queira), vou usar uma formula simples inventada por mim: x ** 2 + 10

auhsduhahsduas, chega a ser ridículo, mas depois muda isso ai pra testar (o operador ** no groovy representa potenciação)

Olha a trabalheira:

String formula = "x ** 2 + 10";
BSFManager manager = new BSFManager();
manager.declareBean("x", "10", Integer.class);
Double result = (Double) manager.eval("groovy", "myScript.groovy", 0, 0, formula);

Eu fiz um cast pra Double, mas o retorno é um object, pode retornar qualquer coisa.
Mas fácil que isso só dois disso heheh.

Read more

terça-feira, 9 de novembro de 2010

Haml+Rails

2

Haml é uma linguagem de marcação, para renderizar templates HTML, baseada em tags e identação. Sempre gostei muito de usar o HAML nas minhas aplicações Rails 2, pela simplicidade e facilidade na criação. Você se acostuma a identar ao invés de procurar aonde a tag deve ser fechada. O Rails 3 foi modularizado para facilitar a customização. Porém a gem haml, responsável por renderizar os arquivos HAML, não possui generators embutidos para o Rails, procurando na internet encontrei o projeto rails3_haml_scaffold_generator que faz exatamente isso, mas vc precisa executar alguns passos, e eu odeio coisas repetitivas, a primeira coisa que pensei foi procurar se havia alguma gem parecida, e não encontrei.

Resolvi arregaçar as mangas, e fiz minha primeira gem, no caso eu simplesmente movi para o diretório os arquivos como se fossem um gem, e ajustei os diretórios com a ajuda do Jeweller.

O uso dessa gem é bem simples, ela nem tem reação com a gem haml, pois ela consiste somente nos generators.

Adicione ao seu Gemfile as seguintes linhas

gem haml
gem haml_rails

use o bundle install ou uso o gem install para instala-las.

depois só executar o comando

rails g haml_rails:install

ele vai editar seu application.rb e adicionar o haml como seu template engine. vc pode apagar caso prefira usar o ERB.

Por enquanto é isso..

Read more

domingo, 17 de outubro de 2010

Rails 3, RSpec 2, Devise a MongoDB

1

Estive estudando o Rails 3 (Atualmente 3.0.1 para o rails), e também estudando um pouco de NoSQL, com o MongoDB, ainda pretendo me dedicar um pouco para aprender sobre o Redis, mas por enquanto estou vendo o Rails. Gosto de usar para autenticação o Devise, um projeto brasileiro, que se tornou bem famoso pelo mundo Rails. Para ORM gostei do Mongoid, e ainda mais pelo devise ter suporte ao mongoid ao invez do ActiveRecord.

Iniciando

Sobre o mongoid não há muito o que falar, a documentação presente no site é completa, e funciona muito bem, vale lembrar que arquitetura de um banco relacional é bem diferente de um NoSQL, e algumas definições já padrão na nossa cabeça devem ser desfeitas.

O RSpec-Rails vem configurado para rodar sobre o ActiveRecord e quando vc executar um rails g rspec:install ira gerar toda a estrutura padrão do rspec, incluindo a pasta spec que contem os testes. Primeiramente vamos editar o arquivo spec/spec_helper.rb

RSpec.configure do |config|
  require 'database_cleaner'
  
  config.before(:suite) do
    DatabaseCleaner.strategy = :truncation
    DatabaseCleaner.orm = "mongoid"
  end

  config.before(:each) do
    DatabaseCleaner.clean
  end
  config.mock_with :rspec
  config.include Devise::TestHelpers, :type => :controller # Essa linha adiciona os helpers do Devise para o RSpec.
end

A adição da gem DatabaseCleaner (que deve estar declarada no Gemfile), serve para limpar os resultados dos testes apos a execução, como podem reparar o uso de fixtures é desabilidado para o Mongo, somente para o ActiveRecord, sem o uso de fixtures os testes são mantidos na base, o que não é interessante.

Testando os controllers

Criei um modelo simples com o devise, apesar da documentação do devise indicar a criação de um modelo Admin para esses casos, preferia adotar o uso de um flag para poder indicar se o usuário é um administrador, acho isso um tanto mais simples.
Adicionei também no application_controller.rb um metodo filtro que indica se o usuário é um adminsitrador

protected
  def admin_user!    
    if authenticate_user!      
      unless current_user.admin        
        flash[:warning] = "Acesso Negado"
        redirect_to root_url
      end
    end
  end
reparem que usei o filtro authenticated_user! que é do devise pra indicar que o usuário está logado no sistema.
meu controller admin_controller.rb
class AdminController < ApplicationController
  before_filter :admin_user!
  
  def index
  end

end
é um controller bem simples, mas para garantirmos a segurança do aplicativo, e se algum dia nosso filtro precisar ser ajustado precisamos garantir que o acesso a esse controller seja restrito sempre, e quem alterar deve ter noção da quebra do teste. Em alguns dos meus testes, normalmente em fixtures, eu pego um hash que representa o codigo BCrypt da senha (padrão do Devise), mas como aqui no mongo não tem fixutes, parti pra outro ponto.
require 'spec_helper'

describe AdminController do
    
  describe "GET 'index'" do    
    def do_action_with_user(admin)
      @user = User.create!(:name => "Test", :email => "test@test.com", 
        :password => "testet",
        :password_confirmation => "testet",
        :admin => admin)        
      sign_in @user
      get 'index'
    end
    #1
    it "should not be successful when no user was logged in" do
      get 'index'
      flash[:alert].should_not be_nil
      response.should_not be_success
    end
    #2
    it "should not be successful when no admin user was logged in" do
      do_action_with_user(false)      
      flash[:warning].should_not be_nil      
      response.should_not be_success
    end
    #3
    it "should be successful when admin user was logged in" do
      do_action_with_user(true)
      response.should be_success
    end
  end

end
bem simples, um metodo dry pra fazer o registro do usuario e usar o metodo auxiliar do devise para o login (sign_in):
  • o teste 1 é um teste para acesso sem login, no caso uma chamada a action index do controller admin sem um usuário logado.
  • teste 2 teste para um usuário que não é administrador, repare que testo se o flash esta preenchido
  • teste 3 testa a ação de sucesso, no caso o acesso de um usuário administrador
Inicialmente esse teste se fez suficiente para dizer que agora a classe está segura.

Outras notas

Tive alguns problemas no começo do uso do RSpec 2 em views, e vou listar aqui alguns deles:

assign :name, "Teste"
ao invez de
assigns[:name] = "Teste"
Outra mudança é que em views você não deve mais usar o response, mas usar o rendered. Também deixou de existir o metodo have_tag, para verificar o conteudo de uma tag, veja abaixo:
#RSpec 3
assert_select('p', "Teste")
#RSpec 2
response.have_tag 'p', "Teste"


Espero que isso seja util pra mais alguem, pelo menos eu não vou mais esquecer :D

Read more

segunda-feira, 20 de setembro de 2010

Software é como uma obra de arte

0

Para quem vê, pode ser estranho, bonito, sem sentido, mas para quem é da área tem que ser maravilhoso.

O Software em si, deve ter as funcionalidades certas, ser bem definido, para o usuário também acha-lo bonito e prático. Mas meu foco aqui não é o cliente e sim os desenvolvedores. Seu software deve ser referencia, considerado uma obra de arte para outros desenvolvedores, deve ser prazeroso olha-lo e não um martirio, a manutenção deve ser facil, e os retoques simples.

Muitas vezes uma decisão errada no começo pode levar a um design de código feio, ou a alguma dificildade em adicionar novas funcionalidades, ao ver isso, não devemos usar o algoritmo do avestruz, e sim, gastarmos algum tempo para corrigir isso, melhor esse treco de codigo que pode ser uma futura pedra no seu caminho. Costumo em alguns dias revisar códigos antigos, feitos no inicio de um projeto afim de aperfeiçoá-lo e torná-lo melhor, mais bonito e mais prático, e algo que as vezes leva algum tempo, mas normalmente são alterações de minutos, e que podem resultar em um ganho grande de leitura de codigo em revisões futuras.

Afinal, somos criadores, e todo o criador precisa fazer alguns ajustes na sua cria, afim de torna-la melhor sempre.

Read more

segunda-feira, 30 de agosto de 2010

Deu Certo? Deixa! Funcionou? Não Mexa!

0

Essa piadinha aí, muito engraçada as vezes, pode não caber na empresa onde trabalha.

Algumas vezes em alguns projetos os prazos apertados nos forçam a escrever certos franksteins, que não são bonitos mas funcionam, "tampam o buraco", na maioria das vezes, o que acontece é que esse frankstein se torna uma mumia de tantos remendos e concertos. Quando seu código chegou ao ponto do titulo, onde cada alteração é muito perigosa, ligue o sinal vermelho, chegou a hora de parar o que está fazendo e rever essa bagaça.

O tempo de análise do código não deve ser maior que a implementação da alteração. Se você leva mais tempo para entender o que seus metodos fazem, é sinal que seu código está pouco legivel, e precisa ser revisto, muitas vezes é melhor perder certo tempo, algumas vezes diversas horas para refazer esse código, a melhoria para o cliente não é visivel, ele sequer vai saber que você mecheu nisso, deve funcionar igual, porém mais facil de ser avaliado e analisado, consequentemente mais facil de altera-lo.

Acreditar que o sistema será imutavel e dar um tiro no proprio pé, ou no pé dos companheiros, tenha em mente que a flexibilidade e legibilidade devem ser a base do sistema, e deve ser facil para todos alterar cada parte, esteja ciente que nem sempre será você quem vai alterar esse trecho.

Read more

Rails 3 is out

0

Não deu nem tempo de postar sobre meus testes com o Rails 3 RC e a versão final está disponivel :)

http://akitaonrails.com/2010/08/29/rails-3-0-final-acaba-de-ser-lancado

Read more

JavaME, Android e JavaFX

0

A dois anos atrás, JavaME era uninimidade no desenvolvimento para celular, além de rodar na maioria dos dispositivos era simples e facil de desenvolver usando ele. Android apenas engatinhava, e a cada nova versão, devia se reaprender a desenvolver, pois muita coisa mudava. Os fãs de JavaME diziam que Android não seria ameaça ao JavaME, pois ainda faltava anos de estrada para se aprimorar, além de ser um sistema operacional, seria necessário reinstalar o novo sistema no celular.
Nesses dois anos, JavaME não mudou NADA, continuou a mesma coisa, ficou estagnado no tempo, sem melhorias, ou algo que acompanhasse a evolução do Java, normalmente era aquela mensagem: "Muitas fabricantes usam, como vamos pedir pra eles reimplementarem Java para seus dispositivos?", a resposta, seria algo como um, use a versão que quiser. Enfim, enquanto o JavaME ficava la assistindo TV, o Android cresceu, sai dos dispositivos moveis, chegou aos netbooks, e hoje, tem muito mais desenvolvimento e melhorias frequentes que o JavaME, a diferença, é que surgiram celulares diferentes da epoca da criação do JavaME, como o iPhone, que possui seu proprio SDK para desenvolvimento.
Aí vem a pergunta dos mais fanaticos por Java (Aqueles que acham que tudo em Java é melhor que o resto =D), e o JavaFX? Pra mim JavaFX é um tiro no proprio pé, foi no da Sun, e será no da Oracle. Existem tecnologias melhores, e não estão estagnadas como o JavaME do caso assim, como o Flex e o Silverligth, o JavaFX tem que evoluir muito para competir com essas tecnologias. Ainda há quem diga, que o Swing, JavaME e JSF vão ser substituidos pelo JavaFX, mas eu não creio que o JavaFX viverá para tanto. JavaFX apenas engatinha enquanto seus concorrentes voam...


PS: Prometo tentar escrever mais seguido (ou não) =)

Read more

quarta-feira, 14 de julho de 2010

Alterar o classpath em tempo de execução

0

Muito comum essa dúvida, porém nem tão pratica :D.

Para ferramentas baseadas em plugins o ideal é usar OSGi mesmo, que funciona muito bem.

Mas existem casos em que precisamos de um determinado jar que não está no classpath da aplicação seja adicionado de acordo com as vontades do usuário.
Existe um metodo bem simples, usando reflection que permite que isso seja feito.

File f = new File("ABSOLUTE FILE PATH");
URL url = f.toURI().toURL();
URLClassLoader classLoader = (URLClassLoader) ClassLoader.getSystemClassLoader();
Method method = URLClassLoader.class.getDeclaredMethod("addURL", URL.class);
method.setAccessible(true);
method.invoke(classLoader, url);

o metodo toURL dentro da classe file está deprecated, então usamos o toURI e depois toURL, lembrando que para criar o arquivo é necessário o caminho completo do Jar.

usando reflection pegamos o metodo protegido "addURL" dentro do URLClassLoader, e simplesmente o invocamos :D

Bem simples e funcional.

Read more

 
Design by ThemeShift | Bloggerized by Lasantha - Free Blogger Templates | Best Web Hosting