Relembrando 2006

Escrevi o texto abaixo no fotolog (sim, eu tive um) em 1 de julho de 2006, logo após o Brasil perder para a França na Copa, e reproduzo-o hoje, dia em que o Brasil perdeu para a Holanda na Copa de 2010. Na verdade, é apenas para contrastar com o fato de que eu, hoje, não me importo mais nem um pouco.

O jogo de hoje devia ficar marcado como jogo da apatia.
Apatia de um time, ou pelo menos um apanhado de jogadores reunidos.
Apatia de jogadores. Desmotivação em defender seu país? Jogadores, os melhores do mundo. Jogadores, estrelas da copa. Jogadores, que não quiseram jogar.
Apatia de um técnico. Sobre isso nem é preciso comentar.

E, sinceramente, tenho pena daqueles que pagaram mais de 500 Euros para assistir a essa tragédia (ou será comédia?).

Pontos altos do jogo? Para mim, não estiveram em campo, mas fora dele. E são dois:
Primeiro, um técnico que, perdendo o jogo, aos 40 minutos do segundo tempo, está calmamente sentado no banco olhando para o relógio… E que cena diferente do jogo anterior, em que o Felipão não parava um minuto no banco, gritava, incentivava.
Segundo, uma torcida, entoando uma frase bastante conhecida no Brasil mas que nunca se pensou em se ouvir durante uma Copa do Mundo: ‘Ei, Parreira, vai tomar no …’.

Parabéns aos franceses, que se comportaram como time. Allez les bleus.
E a prece para que nunca mais precisarmos ter de aturar o Parreira novamente.

E o que muda na vida? Nada, nós continuamos na mesma e eles continuam milionários.

Memórias de viagem – Parte 2

Segunda parte da série das minhas melhores memórias de viagem. Esta é a minha preferida.

Local: fronteira entre Alemanha e Suíça, perto de Basel

Data: 01/02/2008

Pouco depois de voltar de Paris, resolvi dar um pulinho em Amsterdam. Na volta, como sempre, pego um trem de quase 12 horas até Zurich.

Por algum motivo o trem demorou mais que o normal, e já quase 8 da manhã ainda estávamos nesta bendita fronteira.

Como de costume, a polícia de fronteira alemã tem uma atenção especial comigo. Ora, brasileiro, viajando sozinho, voltando de Amsterdam, up to no good, right? Passaporte, por favor… Poderia abrir a mochila, por favor… Nada demais, já estava acostumado com isso.

Não encontrando nada, a oficial continua a pedir o passaporte dos outros passageiros. Reencosto-me no meu assento e volto a pensar na vida. Tudo certo, ok?

Claro que não. Alguns minutos depois, a mesma oficial volta até mim e fala que eu teria que descer do trem e acompanhá-los até o posto policial na estação. Nesse momento eu gelei… e agora, vão me prender na Alemanha? Arbeit macht frei????

Pior, só faltavam 2 dias para eu voltar ao Brasil…

Não sabia exatamente onde eu estava. Os policiais eram de Lörrach, uma cidade alemã, mas não sei se eu já estava em território suíço ou continuava na Alemanha. Não sabia nada, nem tentei ler o nome da estação…

Tudo bem, tento me acalmar, desço do trem e vou até o posto policial. Logo na entrada, sentado numa cadeira, está outro viajante, provavelmente tirado do mesmo trem, que dá um sorriso irônico pra mim – provavelmente pensando o mesmo dos policiais que eu.

Mas tudo bem, vou até o balcão do posto e a oficial me pede para esperar, e levam meu passaporte.

Aí eu me acalmei. Ao menos não me jogaram numa salinha sem janelas e com uma mesa no meio.

Fico observando os policiais olhando meu passaporte. Era interessante. Um olhava e passava ao outro, que olhava e passava ao próximo… Parecia até que era algum dispositivo alienígena e eles estavam tentando entender do que se tratava. Até que aquele que me parecia ser o oficial superior do posto pegou meu passaporte e acessou o computador.

Daí um tempo, a mesma oficial que tinha me revistado no trem vem falar comigo. Ela me pergunta o que era “Mercosul”. Sabe quando aparece aquela interrogação na sua cabeça? Bom, fui explicar o que era, e pergunto se estava tudo certo, e digo que, se quisessem, podiam ligar para minha tia ou o marido dela… Mas ela fala que estava tudo bem, e que eu poderia ir em alguns minutos.

Eu comecei a digerir aquilo tudo, ainda sem entender bem. Aí lembrei que na capa do novo passaporte brasileiro, está escrito “MERCOSUL”, logo no topo. Eu pensei: “será que é isso?”.

Lembrei também que o passaporte de um primo meu, que foi tirado em 2006, ainda era o antigo… o meu, tirado em meados de 2007, já era o novo.

A explicação mais lógica a que eu cheguei foi que ainda não conheciam aquele passaporte. Mas porque me tiraram do trem, eu não sei.

A oficial pediu meu bilhete do trem, perguntou para onde eu iria e anotou alguma coisa na parte de trás do bilhete. Falou para eu esperar que outro trem passaria em alguns minutos, e eu devia mostrar isso ao pessoal do trem.

Tudo não deve ter demorado mais de meia hora. Mas novamente eu fiquei tão tenso que pareceu uma eternidade.

Eu deveria chegar em Rapperswil em torno das 8 ou 9 da manhã. Devo ter chegado meio dia. Todos preocupados comigo.

E eu nunca quis saber o que estava escrito atrás do bilhete – ao menos não era uma estrela branca:
P1000296

Memórias de viagem – Parte 1

Ontem vimos uma ameaça de bomba no aeroporto de Guarulhos, e isto me fez lembrar de dois dos meus melhores momentos de viagem, então vou fazer essa série, em duas partes, para recordar.

Local: Paris

Data: 22/01/2008

Era meu último dia na Cidade Luz e eu tinha acabado de visitar a Tour Montparnasse, então o maior prédio de Paris, mas ainda assim menor  que a Torre Eiffel. É um destino interessante, já que se pode subir ao terraço do prédio, com uma vista incrível da cidade. Como, na época, não estavam permitindo subir até o observatório superior da Eiffel, era a melhor vista. Existem alguns projetos em La Défense para construção de prédios maiores, mas como essa área é mais afastada, a Tour Montparnasse ainda é um dos melhores pontos a se visitar.

Logo após descer do prédio, comecei a andar um pouco. Podia ter ido à Galerie Lafayette que fica logo abaixo, mas não é minha praia. Comecei a andar um pouco pelas ruas, passei por uma pequena lanchonete de döner kebab, mas por algum motivo resolvi não comer. Para quem não sabe, é uma espécie de churrasco grego (que tem uma má fama incrível aqui no Brasil, mas os que eu comi pela Europa eram ótimos) dentro de um pão árabe com vários condimentos – recomendado.

Então, resolvi pegar o metrô. Não lembro ao certo, mas acho que era a Linha 4, em direção a Cité.

Alguns minutos depois de subir no metrô, ele pára em alguma estação. Até aí, tudo bem. Pessoas sobem, pessoas descem. As portas se fecham. Mas o carro não anda. E permanece lá uns minutos. Depois de algum tempo, uma voz no alto-falantes diz qualquer coisa. Meu parco francês não é suficiente para entender bulhufas.

As pessoas continuam sentadas e o tempo continua passando.

Depois de uma eternidade, novamente a voz do além nos alto-falantes aparece, as portas se abrem e todos começam a sair. O que diabos acontecia?

Pior, parecia que todo mundo estava saindo da estação, até mesmo as pessoas que esperavam outras linhas.

De volta à superfície, eu tentando ao menos compreender o que acontecia, vi que todos se dirigiam a um ponto de ônibus, que ficou superlotado.

Lá, vejo uma senhora que estava no mesmo carro que eu e falava em inglês ao celular. Quando ela desligou, resolvi me aproximar e perguntar o que tinha acontecido, e eis que ela me responde que alguém disse a ela que encontraram uma bolsa ou mala perdida dentro do metrô e que tinham evacuado para o caso de ser uma bomba.

Até hoje eu não sei se ela estava zoando comigo, se zoaram com ela, ou se corri o risco de explodir num metrô.

Chances são de que o carro teve um problema técnico, mas…

Momento cultural

É, eu ando compulsivo… ao menos, por algo útil. Ando comprando mais livros do que eu posso ler. Muito mais.

Mal terminei de Excalibur, último livro da ótima série Crônicas de Artur, do escritor inglês Bernard Cornwell, já comprei os 5 livros publicados da série Crônicas Saxônicas, do mesmo autor.

São livros razoavelmente simples, de fácil leitura, apesar de serem bem descritivos. Não tanto a ponto de afastar um leitor preguiçoso como eu. Lembro bem quando li Senhora, de José de Alencar. O livro é tão denso e a narrativa tão cheia de detalhes que me davam sono só de ler meia página. Eu prefiro livros mais dinâmicos, com narrativa mais rápida. Talvez por isso eu leia tantos best sellers.

Anyway, por algum motivo, ao invés de começar a ler as Crônicas Saxônicas, resolvi reler o Hobbit. Com tantos livros novos e ainda não lidos, eu vou justamente para algo que eu já li tantas vezes que até perdi a conta? Pois é, Tolkien tem este efeito.

E sim, eu não sei exatamente o real motivo deste post.

A Copa, a memória e dois pesos, duas medidas

Eu tenho um problema: sempre sou o do contra.

Hoje tivemos mais um jogo do Brasil na Copa do Mundo. Até aí, nada demais, e pra mim nada de grande importância. O Brasil ganhou… ok, legal, divertido, mas quando termina, continuo minha vidinha, move on. O que me deixou realmente impressionado foi a reação no Twitter logo depois do jogo, quando me deparo com um certo Juiz Ladrão nos trending topics.

Certo, estão chamando de ladrão aquele mesmo árbitro que deixou o Luiz Fabiano tocar duas vezes com o braço antes de fazer o gol.

Até aí, nada de mais, imbecilidade comum em torcedores de futebol: o meu é melhor que o seu; pro meu time o juiz nunca rouba, e por aí vai. Briga pra ver quem tem o pinto maior, sabe? Estamos acostumados com isso no futebol nacional.

O que realmente me impressionou é que esses mesmos torcedores fanáticos que exaltam a, como direi, esperteza do Luiz Fabiano execraram o Thierry Henry naquele lance pelas eliminatórias contra a Irlanda. Falaram que a França não merecia estar na copa, falaram que o Henry deveria queimar na fogueira.

Qual a diferença? Agora, que é do nosso lado, nada aconteceu. Pior, foi um golaço do Luiz Fabiano, e ninguém mais lembra do detalhe dos dois toques no braço.

É, se é assim, eu prefiro ser do contra a ser mais um torcedor imbecil. Ou hipócrita.

5 hours of Titanium

I always wanted to develop Mac apps, but as I never had the time to learn Objective-C, I started searching for other available options that used easier to learn programming languages or those ones I already use.

After testing a some of them, like MacRuby, a few months ago I came across an excellent software called Titanium, which enables you to build desktop AND mobile applications using your good old HTML + Javascript.

Truth be told, by then I didn’t quite get how it worked, mostly fault of their messy and not so extensive documentation and my lack of time to magically discover everything. In fact, I installed it just because it was necessary to run bowline.

Two days ago I was browsing my Applications folder and happened to see it was still installed, so I though about giving it a second chance.

And I’m glad I did.

In about 5 hours, I created my first (at least my first useful) Mac app.
cotacoescotacoes2

One might say that spending 5 hours developing a simple, 2-window app is a hell of a noobie job. Yes, it may be.

But the fact is that I spent 5 hours developing while learning how it worked AND trying to make it look nice. So, 5 hours from scratch to complete.

Damn it, the first time I tried doing a Hello World on Objective-C, I spent 5 minutes building the interface on XCode and at least 2 hours (not that long, I’m just trying to prove my point) looking at the API just to find out how to connect to a database and another while to populate a grid list.

And the best thing is that you can use Ruby, Python and PHP code.

No, I’m sorry. The best thing is that you can package it as a Mac, Windows or Linux application.

It’s almost perfect.

About the app

Whenever I’m learning a new programming language, I like to create a complete app that monitors stock prices (like a price ticker). It stores your favorite stocks and retrieves up-to-date prices.

So, first of all, I need a database to store which stocks I need to monitor, and I need to load a web page or webservice (usually I use Yahoo) that returns me the information I need.

I like this method for learning purposes because it’s a simple app that enables me to dive deeper into the language/programming environment than most examples people use.

On the first window it lists my favorite stocks, and it has a button to update their prices. I plan on automatizing it soon. The other screen lists all available stocks, a checkbutton to mark it as monitored and a search field.

Simple as that.

Everything is build using HTML, Javascript and CSS. In fact, it’s just a web page rendered by WebKit engine.

In this app, I used a small Ruby code to use open-uri and ping libraries, so I could check internet connection and open Yahoo Finance’s download quote feature.

The design was inspired (ok, almost copy/paste inspired) by Tweetie. I hope they don’t mind.

What I think Titanium needs improving

As a new user, I really missed a good documentation. At Titanium API you find, just that, the API. There isn’t much more than that.

For example, I couldn’t find anywhere where the database is stored. At first I though it was inside your application resources, but it isn’t. After a good while looking for it, I found the it’s at ~/Library/Application Support/Titanium/appdata/your.app.context/your.app.context_0/

Another simple thing that took me a while to figure out is that, when you install your application, it creates an empty database. As it was when you package it. So, every time your application runs, you have to find out if the database is created or not, and run an database installation script. In my case:

var db = Titanium.Database.open('Databases');
 
try {
    var test = db.execute("select count(1) from papeis;");
} catch(e) {
    // Create tables and inserts rows
    // Yeah, inside the catch block. It's awful, I know.
}

Ok, not a big deal, but some warning about that wouldn’t hurt.
Another thing is that I couldn’t find a way to run background process. Every time I click on the update stock button, the application freezes a few seconds as it opens Yahoo page. I tried using Titanium.Worker.createWorker, Titanium.Process.createProcess and even tried using a lot of setTimeout calls, but none worked.

I’m still skeptical about it’s performance. My app runs smoothly here, but can’t tell how it works with bigger apps.

Still, I’m very, very satisfied.

Bowline + ActiveRecord

A few days ago, maccman released Bowline, which, in his words “lets you build cross platform desktop applications with Ruby, HTML and JavaScript”.
I’ve been playing around with at for the last couple of days, and although it has a lot yet to improve, it’s the most friendly desktop application framework I’ve seen.

Anyway, it has been discussed a lot about the framework itself. I just posted here to help a few of those who couldn’t get ActiveRecord models to work properly.
At least at my Mac, ActiveSupport raises an error when I created ActiveRecord models, as shown bellow:

[19:37:48:497] [Titanium.Ruby] [Error] An error occured while parsing Ruby on the page: /Library/Ruby/Gems/1.8/gems/activesupport-2.3.2/lib/active_support/dependencies.rb:443:in `load_missing_constant': uninitialized constant ActiveRecord

Which means that ActiveRecord wasn’t loaded. I don’t know why and, at least for now, won’t dig up the answer.

To work this around, I just created an initializer, at config/initializers called activerecord.rb

require 'activerecord'
require 'yaml'
 
config = YAML.load_file("#{APP_ROOT}/config/database.yml")
ActiveRecord::Base.establish_connection :adapter => 'sqlite3', :database => "#{APP_ROOT}/#{config['database']}"

And, voilà, you can now create Mac applications using our beloved ActiveRecord.

Update
Alex just gave me the fix for this, just by adding this line to environment.rb:

config.frameworks << :active_record

Probably too obvious for me to see. ;)

Testing relationships in Rails

Ler este artigo em português

I’ve been looking for an elegant way to test relationships using Rais, and think it’s interesting how so few people really care about it. Most simply say that it’s up to the framework to test it’s own functions. Yeah, right, has_many and belongs_to have been tested before, but you should be aware that it’s up to you to check out the code you right. So, you have to make sure that a simple has_many :comments is really where it should be, so you should test it. Anyway, I listed some approaches I’ve found:

1 – Using fixtures:

At first, I thought about using fixtures, writing the relationships inside it (Rails 2.0). It’s a simple solution, but it has a downside. When we declare dependencies on the fixtures, and the relationship isn’t on the model, it’ll raise an error instead of a test failing. e.g.:

# post.rb
 
class Post &lt; ActiveRecord::Base
 
end# comment.rb
 
class Comment &lt; ActiveRecord::Base
 
end
 
# posts.yml
 
testing_relationships:
 
  title: Hello World
 
  body: Hello...
 
# comments.yml
 
commenting_relationships:
 
  body: I disagree!
 
  author: Filipe Coimbra
 
  post:  testing_relationships

As I haven’t said that Comment belongs_to :post, when a test that calls comments.yml is called, an error will be raised. Besides, the other dependency, Post has_many :comments won’t be tested.
Besides, it’s not a cool thing to use fixtures as if they were tests. Besides, they’re not automatically documented.

2 – Again using fixtures:

After a while, I found this arcticle, which also uses fixtures, but with a different approach (a little bit Rails 1.2-ish) just defining the relation through the foreign key. That way, no error will happen.
It works, although you just have to test your own code, the rest is up to ActiveRecord. But, you may won’t like using fixtures because they may broke when you change your table structure.

3 – The wrong option that works:

Finally, I ended up using the most logical solution, that is writing ruby code, based on this post by Err The Blog.

# post_spec.rb
 
describe Post do
 
  before(:each) do
 
    @post = Post.new
 
  end   it "should be related to comments" do
 
    comment = Comment.new(:body =&gt; "Testing relationships")
 
    @post.comments &lt;&lt; comment
 
    @post.comments.should include(comment)
 
  end
 
end
 
# comment_spec.rb
 
describe Comment do
 
  before(:each) do
 
    @comment = Comment.new
 
  end
 
  it "should be related to a post" do
 
    post = Post.new
 
    @comment.post = post
 
    <span style="text-decoration: line-through;">@comment.should equal(post)</span>
 
    @comment.post.should equal(post)
 
  end
 
end

It’s simple and easy, but… why is it wrong? When I write “@post.comments << comment”, I’m calling a method comments on the object @post. As I didn’t declare that Post has_many :comments, this will be a missing method. Fortunately it works because rSpec won’t raise any errors, and just will tell us that the spec fails.
Even so, I still prefer this approach as I won’t be dealing with fixtures.

Tags: ,

Testando relacionamentos no Rails

Read this acticle in English

Estive procurando por uma maneira elegante de testar relacionamentos utilizando Rails, e achei interessante como pouca gente está preocupada com isso. Na maioria das vezes, dizem simplesmente que isto é função do próprio framework. Tudo bem, o has_many e belongs_to (esqueça que existe o HBTM) já foram devidamente testados, mas é importante saber que o que cabe a você testar o que você escreve no seu código. Portanto, se você quer ter certeza que a linha has_many :comments realmente existe, você deve escrever um teste para ela. Então, resolvi listar algumas abordagens:

1 – Utilizando fixtures:

No começo, pensei em utilizar as fixtures, mas usando relacionamentos dentro delas. É uma solução simples, porém traz um revés. Quando utilizamos um relacionamento dentro das fixtures, e este relacionamento não está explicitado nos models, será retornado um erro, ao invés de uma falha. Por exemplo:

# post.rb

class Post < ActiveRecord::Base

end# comment.rb

class Comment < ActiveRecord::Base

end

# posts.yml

testing_relationships:

  title: Hello World

  body: Hello...

# comments.yml

commenting_relationships:

  body: I disagree!

  author: Filipe Coimbra

  post:  testing_relationships

Como não foi explicitamente dito que Comment belongs_to :post, ao se executar a fixture comments.yml será retornado um erro. Além disso, o relacionamento contrário, Post has_many :comments não será testado.

2 – Novamente utilizando fixtures:

Depois, encontrei este artigo, que também utiliza fixtures com uma abordagem diferente (e mais Rails 1.x) que é definir apenas a chave estrangeira na fixture. Assim, não seria retornado erro.
É funcional, mas eu quero apenas testar se as linhas de relacionamento estão definidas nos models. O resto, fica por conta do ActiveRecord. Além disso, não quero usar fixtures como se fossem testes, já que, primeiro, não são documentadas automaticamente (como no caso dos métodos de teste) e porque, caso você mude a estrutura da sua tabela, poderá ter seus testes quebrados por causa das fixtures que não refletem as mudanças.

3 – A opção errada que funciona:

Acabei utilizando a solução mais lógica, e baseada neste post do Err The Blog.

# post_spec.rb

describe Post do

  before(:each) do

    @post = Post.new

  end  it "should be related to comments" do

comment = Comment.new(:body => "Testing relationships")

    @post.comments << comment

    @post.comments.should include(comment)

  end

end

# comment_spec.rb

describe Comment do

  before(:each) do

    @comment = Comment.new

  end

it "should be related to a post"

    post = Post.new

    @comment.post = post

    @comment.should equal(post)

    @comment.post.should equal(post)

  end

end

É simples, mas… por que é errada? Quando fazemos “@post.comments << comment”, estamos chamando o método comments do objeto @post. Como não foi declarado que Post has_many :comments, este método não existirá. Ela funciona porque o rSpec não acusará o erro, e apenas retornará uma falha no teste.
Ainda assim, prefiro essa solução porque eu não precisarei lidar com fixtures.

Tags: ,

Notas sobre o NetBeans 6

Foi lançada a versão final do NetBeans 6, com a promessa de ser a melhor IDE de desenvolvimento para Ruby/Ruby on Rails. E, realmente, para uma IDE, ele parece estar no caminho certo. Apesar de um ou outro bug que aparecem de quando em quando (versão para linux, rodando no Ubuntu 7.10), o funcionamento está razoável. Quando se cria um projeto em RoR, a separação das áreas (Controllers, Models, Views, Helpers) está mais lógica que a separação de pastas padrão do Rails. O Code Completion, que tantos adoram, é bastante interessante, inclusive completando os atributos de um Model através dos campos existentes no banco de dados. Toda a ajuda referente a métodose classes do Code Completion parece ter sido retirada das APIs oficiais do Ruby on Rails e do Ruby.

O NetBeans também possui acesso direto aos comandos do /script/ e do rake através da sua interface, integração com CSV e Subversion, debugger (caso o Fast Debugger esteja instalado – o que pode ser feito através da própria IDE), controle de Plugins do RoR, dentre outras features.

Enfim, não fui muito a fundo, por enquanto, mas, para mim, um bom editor de textos, o shell do Linux e o railsapi.org em conjunto podem ser tão produtivos quanto o NetBeans, além de bem mais leves. Para quem gosta de IDEs, pode realmente valer a pena. Talvez, caso a pessoa utilize Windows (que tem um shell bem chatinho para se usar com o RoR), a experiência seja bem melhor.

Tags: