<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-4781511741260972168</id><updated>2011-11-27T15:33:35.027-08:00</updated><category term='Redmine'/><category term='DatabaseCleaner'/><category term='JPA'/><category term='glassfish'/><category term='en-US'/><category term='JME'/><category term='RIA'/><category term='Swing'/><category term='MongoDB'/><category term='EJB'/><category term='JQuery'/><category term='JavaRecord'/><category term='TCC'/><category term='Bean Script Framework'/><category term='RSpec'/><category term='Haml'/><category term='JRuby'/><category term='Backbone'/><category term='bla bla bla'/><category term='Spree'/><category term='JUnit'/><category term='JSON'/><category term='Testes'/><category term='Bespin'/><category term='JasperReports'/><category term='Banco de Dados'/><category term='Rubygems'/><category term='Annotations'/><category term='IReport'/><category term='Ruby On Rails'/><category term='Java'/><category term='ScripEngine'/><category term='pt-br'/><category term='Groovy'/><category term='LDAP'/><category term='CouchDB'/><category term='Foreman'/><category term='Open Source'/><category term='glassfish v3'/><category term='JavaME'/><category term='RESTful'/><category term='Ruby'/><category term='Ubuntu'/><category term='JavaScript'/><category term='Tradução'/><category term='Devise'/><category term='Ioke'/><category term='Monkey Patch'/><category term='Tendencias'/><title type='text'>Rolling With Code</title><subtitle type='html'>Por Rafael Felix</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://blog.rollingwithcode.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4781511741260972168/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://blog.rollingwithcode.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Rafael Felix</name><uri>http://www.blogger.com/profile/15945926043992740682</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/_DivtpeF7_5Y/SSP5tBTaJsI/AAAAAAAAATI/84pO0s0CdY0/S220/felix.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>57</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-4781511741260972168.post-3285187187396480218</id><published>2011-08-31T05:22:00.000-07:00</published><updated>2011-08-31T11:09:35.572-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='en-US'/><category scheme='http://www.blogger.com/atom/ns#' term='Foreman'/><category scheme='http://www.blogger.com/atom/ns#' term='Ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='Rubygems'/><category scheme='http://www.blogger.com/atom/ns#' term='Ruby On Rails'/><title type='text'>Foreman</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-AViQAGOwe-E/Tl4jByRJ4yI/AAAAAAAAAmE/GrmO8E7-bKQ/s1600/Screen+shot+2011-08-31+at+9.02.51+AM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-AViQAGOwe-E/Tl4jByRJ4yI/AAAAAAAAAmE/GrmO8E7-bKQ/s1600/Screen+shot+2011-08-31+at+9.02.51+AM.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;I've watched the &lt;a href="http://railscasts.com/episodes/281-foreman"&gt;RailsCasts #281&lt;/a&gt;, and Ryan Bates is talking about the &lt;a href="https://github.com/ddollar/foreman"&gt;Foreman&lt;/a&gt; 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 &amp;nbsp;guard, and another to run the generators.&lt;br /&gt;After I open all this tabs, Foreman gem cames to my mind. Well, I gave to Foreman a&amp;nbsp;opportunity, and I loved it.&lt;br /&gt;&lt;br /&gt;If you think this scenario is the same of you, take a look at Foreman, and give to it a chance.&lt;br /&gt;You can add the gem to your Gemfile or install it by your own hand. To work foreman only needs a file&amp;nbsp;called&amp;nbsp;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:&lt;br /&gt;&lt;br /&gt;&lt;script src="https://gist.github.com/1183404.js"&gt; &lt;/script&gt;&lt;br /&gt;&lt;br /&gt;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.&lt;br /&gt;&lt;br /&gt;To start all this process type "foreman start", Now I've only one tab running all my development processes.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4781511741260972168-3285187187396480218?l=blog.rollingwithcode.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.rollingwithcode.com/feeds/3285187187396480218/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4781511741260972168&amp;postID=3285187187396480218&amp;isPopup=true' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4781511741260972168/posts/default/3285187187396480218'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4781511741260972168/posts/default/3285187187396480218'/><link rel='alternate' type='text/html' href='http://blog.rollingwithcode.com/2011/08/foreman.html' title='Foreman'/><author><name>Rafael Felix</name><uri>http://www.blogger.com/profile/15945926043992740682</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/_DivtpeF7_5Y/SSP5tBTaJsI/AAAAAAAAATI/84pO0s0CdY0/S220/felix.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-AViQAGOwe-E/Tl4jByRJ4yI/AAAAAAAAAmE/GrmO8E7-bKQ/s72-c/Screen+shot+2011-08-31+at+9.02.51+AM.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4781511741260972168.post-7149016332222568627</id><published>2011-08-29T06:55:00.000-07:00</published><updated>2011-08-29T06:55:55.104-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Backbone'/><category scheme='http://www.blogger.com/atom/ns#' term='Ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='Ruby On Rails'/><title type='text'>A Todo App written in backbone.js</title><content type='html'>Hey Guys,&lt;br /&gt;&lt;br /&gt;I'm back again :) &lt;br /&gt;&lt;br /&gt;I the weekend I write a simple app based on the Backbone.js demo the &lt;a href="http://localtodos.com/"&gt;Todo App&lt;/a&gt;, 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 &lt;a href="http://tadalist.com/"&gt;Tada List&lt;/a&gt;, here you have a main list, and you add your tasks inside this list. But I fail with that, I can't&amp;nbsp;understand&amp;nbsp;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:&amp;nbsp;&lt;a href="https://github.com/fellix/todo-list"&gt;https://github.com/fellix/todo-list&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Well, I forget that app, and I passed to study more about the backbone, I take a look inside the &lt;a href="http://documentcloud.github.com/backbone/#Router"&gt;router&lt;/a&gt;, written the &lt;a href="http://addyosmani.com/resources/backbonegallery/index.php"&gt;backbone-galley&lt;/a&gt;&amp;nbsp;in a &lt;a href="https://github.com/fellix/backbone-rails-gallery"&gt;rails app&lt;/a&gt;, 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.&lt;br /&gt;&lt;br /&gt;After that write the app comes up&amp;nbsp;&lt;a href="http://backbone-todos.heroku.com/"&gt;http://backbone-todos.heroku.com/&lt;/a&gt; and you can checkout the source code at&amp;nbsp;&lt;a href="https://github.com/fellix/backbone-todos"&gt;https://github.com/fellix/backbone-todos&lt;/a&gt;, I'm choice the haml-js for the views, I really love haml :), for the Rails 3.1 I used that gem (&lt;a href="https://github.com/andrewtimberlake/ruby-hamljs"&gt;https://github.com/andrewtimberlake/ruby-hamljs&lt;/a&gt;) for render the haml-js template, and works like magic.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-W9Jrets8GYo/TluZxnDHHfI/AAAAAAAAAmA/QGwlFcQ0r-8/s1600/Screen+shot+2011-08-29+at+10.52.34+AM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="218" src="http://1.bp.blogspot.com/-W9Jrets8GYo/TluZxnDHHfI/AAAAAAAAAmA/QGwlFcQ0r-8/s320/Screen+shot+2011-08-29+at+10.52.34+AM.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Going back to the app, &amp;nbsp;the only view that was served by the rails is the &lt;a href="https://github.com/fellix/backbone-todos/blob/master/app/views/home/index.html.haml"&gt;home/index.html.haml&lt;/a&gt;, wich have only the div wich is used for render the templates, all of you can see is rendered for backbone.&lt;br /&gt;&lt;br /&gt;That's all folks&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4781511741260972168-7149016332222568627?l=blog.rollingwithcode.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.rollingwithcode.com/feeds/7149016332222568627/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4781511741260972168&amp;postID=7149016332222568627&amp;isPopup=true' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4781511741260972168/posts/default/7149016332222568627'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4781511741260972168/posts/default/7149016332222568627'/><link rel='alternate' type='text/html' href='http://blog.rollingwithcode.com/2011/08/todo-app-written-in-backbonejs.html' title='A Todo App written in backbone.js'/><author><name>Rafael Felix</name><uri>http://www.blogger.com/profile/15945926043992740682</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/_DivtpeF7_5Y/SSP5tBTaJsI/AAAAAAAAATI/84pO0s0CdY0/S220/felix.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-W9Jrets8GYo/TluZxnDHHfI/AAAAAAAAAmA/QGwlFcQ0r-8/s72-c/Screen+shot+2011-08-29+at+10.52.34+AM.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4781511741260972168.post-2836074276180466250</id><published>2011-07-19T06:38:00.000-07:00</published><updated>2011-07-19T06:40:17.248-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><category scheme='http://www.blogger.com/atom/ns#' term='Backbone'/><category scheme='http://www.blogger.com/atom/ns#' term='Ruby On Rails'/><title type='text'>Backbone.JS</title><content type='html'>Faz muito tempo que não escrevo aqui no blog.&lt;br /&gt;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.&lt;br /&gt;&lt;br /&gt;Hoje vou falar de um assunto que está me tomando um certo tempo meu. Estou estudando &lt;a href="http://documentcloud.github.com/backbone/" target="_blank"&gt;Backbone.JS&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;WTF?&lt;/h3&gt;&lt;br /&gt;Backbone é um framework JavaScript para criação de Front-end RIA (Rich Internet Application), Novidade? Não.&lt;br /&gt;&lt;br /&gt;O Que mais chamou a atenção no backbone, diante das 1239081238109238 opções que existem?&lt;br /&gt;&lt;br /&gt;1) Suporte a Mobile.&lt;br /&gt;2) Integrado com JQuery&lt;br /&gt;3) Visual Clean&lt;br /&gt;4) Focado em MVC&lt;br /&gt;5) Usa RestFull&lt;br /&gt;&lt;br /&gt;5 itens para ressaltar o por que do Backbone.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Desenvolvendo&lt;/h3&gt;&lt;div&gt;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.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Basicamente o Backbone é composto por Events, Models, Collections, Routers e Views.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Event&lt;/b&gt;: É um modulo que pode ser anexado em outros objetos. Ele é simplesmente composto dos metodos bind, unbind e trigger.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Model&lt;/b&gt;: É 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&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;br /&gt;&lt;script src="https://gist.github.com/1092261.js"&gt; &lt;/script&gt;&lt;/div&gt;&lt;div&gt;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 &lt;a href="http://documentcloud.github.com/backbone/#Model" target="_blank"&gt;documentação&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Collection&lt;/b&gt;: 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.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;script src="https://gist.github.com/1092283.js"&gt; &lt;/script&gt;&lt;/div&gt;&lt;div&gt;Esse é outro objeto simples do backbone :)&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Router&lt;/b&gt;: 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 :)&lt;br /&gt;&lt;script src="https://gist.github.com/1092312.js"&gt; &lt;/script&gt;&lt;br /&gt;PS: Na versão 0.3 do backbone ele era chamado de Controller.&lt;br /&gt;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&amp;nbsp;&lt;span class="Apple-style-span" style="color: #dd1144; font-family: 'Bitstream Vera Sans Mono', Courier, monospace; font-size: 12px; line-height: 19px; white-space: pre;"&gt;#collection/1/album/1 &lt;/span&gt;reparem que substitui os wildcards (&lt;span class="Apple-style-span" style="color: #dd1144; font-family: 'Bitstream Vera Sans Mono', Courier, monospace; font-size: 12px; line-height: 16px; white-space: pre;"&gt;:album_collection_id&amp;nbsp;&lt;/span&gt;e&lt;span class="Apple-style-span" style="color: #dd1144; font-family: 'Bitstream Vera Sans Mono', Courier, monospace; font-size: 12px; line-height: 16px; white-space: pre;"&gt; :id&lt;/span&gt;) 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&amp;nbsp;&lt;span class="Apple-style-span" style="font-family: Monaco, Consolas, 'Lucida Console', monospace; font-size: 12px; line-height: 18px;"&gt;Backbone.history.start()&amp;nbsp;&lt;/span&gt;dessa forma o backbone inicia a leitura das URL.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;View&lt;/b&gt;: 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?&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Exemplos&lt;/h3&gt;&lt;/div&gt;&lt;div&gt;Sem mais o que falar vou por alguns links aqui.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://addyosmani.com/resources/backbonegallery/index.php" target="_blank"&gt;http://addyosmani.com/resources/backbonegallery/index.php&amp;nbsp;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Essa foi a aplicação base para fazer alguns estudos e me ajudou bastante a entender alguns conceitos sobre o backbone.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Reescrevi a mesma aplicação usando o Rails 3.1:&lt;/div&gt;&lt;div&gt;&lt;a href="https://github.com/fellix/backbone-rails-gallery" target="_blank"&gt;https://github.com/fellix/backbone-rails-gallery&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Na wiki do Backbone tem muito mais exemplos não deixem de conferir, existe até um exemplo de Mobile :)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="https://github.com/documentcloud/backbone/wiki/Tutorials%2C-blog-posts-and-example-sites" target="_blank"&gt;https://github.com/documentcloud/backbone/wiki/Tutorials%2C-blog-posts-and-example-sites&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4781511741260972168-2836074276180466250?l=blog.rollingwithcode.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.rollingwithcode.com/feeds/2836074276180466250/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4781511741260972168&amp;postID=2836074276180466250&amp;isPopup=true' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4781511741260972168/posts/default/2836074276180466250'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4781511741260972168/posts/default/2836074276180466250'/><link rel='alternate' type='text/html' href='http://blog.rollingwithcode.com/2011/07/backbonejs.html' title='Backbone.JS'/><author><name>Rafael Felix</name><uri>http://www.blogger.com/profile/15945926043992740682</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/_DivtpeF7_5Y/SSP5tBTaJsI/AAAAAAAAATI/84pO0s0CdY0/S220/felix.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4781511741260972168.post-6178558747793874117</id><published>2011-05-01T17:50:00.000-07:00</published><updated>2011-05-01T17:50:26.936-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='bla bla bla'/><category scheme='http://www.blogger.com/atom/ns#' term='pt-br'/><title type='text'>Nova fase</title><content type='html'>Bah, falei que não ia usar mais o blogger, mas é muito melhor que minha própria ferramenta :P.&lt;br /&gt;&lt;br /&gt;Desculpem ficar tanto tempo sem escrever, porém estava numa correria nos últimos tempos. Após 2 anos e 4 meses trabalhando na &lt;a href="www.serhmatica.com.br" target="_blank"&gt;SeRHmática&lt;/a&gt;, saí para encaram um desafio novo, sempre gostei de trabalhar lá, mas senti que era hora de tentar algo novo diferente.&lt;br /&gt;&lt;br /&gt;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 &lt;a href="www.crafters.com.br" target="_blank"&gt;Crafters&lt;/a&gt;, estou trabalhando já a um mês com eles em um projeto Ruby on Rails.&lt;br /&gt;&lt;br /&gt;Me desejem sorte :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4781511741260972168-6178558747793874117?l=blog.rollingwithcode.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.rollingwithcode.com/feeds/6178558747793874117/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4781511741260972168&amp;postID=6178558747793874117&amp;isPopup=true' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4781511741260972168/posts/default/6178558747793874117'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4781511741260972168/posts/default/6178558747793874117'/><link rel='alternate' type='text/html' href='http://blog.rollingwithcode.com/2011/05/nova-fase.html' title='Nova fase'/><author><name>Rafael Felix</name><uri>http://www.blogger.com/profile/15945926043992740682</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/_DivtpeF7_5Y/SSP5tBTaJsI/AAAAAAAAATI/84pO0s0CdY0/S220/felix.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4781511741260972168.post-7760994930133786529</id><published>2011-02-08T16:27:00.000-08:00</published><updated>2011-02-08T16:27:21.275-08:00</updated><title type='text'>Novo blog</title><content type='html'>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/&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4781511741260972168-7760994930133786529?l=blog.rollingwithcode.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.rollingwithcode.com/feeds/7760994930133786529/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4781511741260972168&amp;postID=7760994930133786529&amp;isPopup=true' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4781511741260972168/posts/default/7760994930133786529'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4781511741260972168/posts/default/7760994930133786529'/><link rel='alternate' type='text/html' href='http://blog.rollingwithcode.com/2011/02/novo-blog.html' title='Novo blog'/><author><name>Rafael Felix</name><uri>http://www.blogger.com/profile/15945926043992740682</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/_DivtpeF7_5Y/SSP5tBTaJsI/AAAAAAAAATI/84pO0s0CdY0/S220/felix.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4781511741260972168.post-6980496511214818865</id><published>2011-01-10T09:38:00.000-08:00</published><updated>2011-01-10T10:13:03.724-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='en-US'/><category scheme='http://www.blogger.com/atom/ns#' term='JPA'/><title type='text'>JPA 2.0 Criteria Sucks</title><content type='html'>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&lt;br /&gt;&lt;br /&gt;&lt;pre class="java" name="code"&gt;ParameterExpression&lt;Integer&gt; age = qb.parameter(Integer.class);&lt;br /&gt;Predicate condition = qb.gt(p.get(Person_.age), age);&lt;br /&gt;c.where(condition);&lt;br /&gt;TypedQuery&lt;Person&gt; q = em.createQuery(c); &lt;br /&gt;List&lt;Person&gt; result = q.setParameter(age, 20).getResultList();&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;is better than this one&lt;br /&gt;&lt;br /&gt;&lt;pre class="java" name="code"&gt;String jpql = "select p from Person p where p.age &amp;gt; :age";&lt;br /&gt;Query query = em.createQuery(jpql).setParameter("age", 20);&lt;br /&gt;List result = query.getResultList();&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;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?&lt;br /&gt;&lt;br /&gt;&lt;pre class="java" name="code"&gt;List cats = sess.createCriteria(Cat.class)&lt;br /&gt;    .add( Restrictions.like("name", "Fritz%") )&lt;br /&gt;    .add( Restrictions.between("weight", minWeight, maxWeight) )&lt;br /&gt;    .list();&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Yes, I copy this codes from &lt;a href="http://www.ibm.com/developerworks/java/library/j-typesafejpa/" target="_blank"&gt;IBM&lt;/a&gt; and Hibernate:).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4781511741260972168-6980496511214818865?l=blog.rollingwithcode.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.rollingwithcode.com/feeds/6980496511214818865/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4781511741260972168&amp;postID=6980496511214818865&amp;isPopup=true' title='2 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4781511741260972168/posts/default/6980496511214818865'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4781511741260972168/posts/default/6980496511214818865'/><link rel='alternate' type='text/html' href='http://blog.rollingwithcode.com/2011/01/jpa-20-criteria-sucks.html' title='JPA 2.0 Criteria Sucks'/><author><name>Rafael Felix</name><uri>http://www.blogger.com/profile/15945926043992740682</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/_DivtpeF7_5Y/SSP5tBTaJsI/AAAAAAAAATI/84pO0s0CdY0/S220/felix.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4781511741260972168.post-6864307173175887853</id><published>2011-01-09T09:32:00.000-08:00</published><updated>2011-01-10T02:06:23.470-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MongoDB'/><category scheme='http://www.blogger.com/atom/ns#' term='en-US'/><category scheme='http://www.blogger.com/atom/ns#' term='RSpec'/><category scheme='http://www.blogger.com/atom/ns#' term='Ruby On Rails'/><category scheme='http://www.blogger.com/atom/ns#' term='DatabaseCleaner'/><title type='text'>RSpec+Mongo+DatabaseCleaner</title><content type='html'>&lt;a href="http://blog.rollingwithcode.com/2011/01/rspecmongodatabasecleaner.html" target="_blank"&gt;Em portugues&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Some times ago, I wrote about &lt;a href="http://blog.rollingwithcode.com/2010/10/rails-3-rspec-2-devise-mongodb.html" target="_blank"&gt;RSpec and MongoDB&lt;/a&gt; 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:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="ruby" name="code"&gt;RSpec.configure do |config|&lt;br /&gt;  config.before(:suite) do&lt;br /&gt;    DatabaseCleaner.orm = :mongoid&lt;br /&gt;    DatabaseCleaner.strategy = :truncation    &lt;br /&gt;    DatabaseCleaner.clean_with(:truncation)&lt;br /&gt;  end  &lt;br /&gt;  config.before(:each) do  &lt;br /&gt;    DatabaseCleaner.start&lt;br /&gt;  end&lt;br /&gt;  config.after(:each) do  &lt;br /&gt;    DatabaseCleaner.clean&lt;br /&gt;  end&lt;br /&gt;end&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Also changed the before option, now it's initialize the Cleaner, and the after option, clean the database&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4781511741260972168-6864307173175887853?l=blog.rollingwithcode.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.rollingwithcode.com/feeds/6864307173175887853/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4781511741260972168&amp;postID=6864307173175887853&amp;isPopup=true' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4781511741260972168/posts/default/6864307173175887853'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4781511741260972168/posts/default/6864307173175887853'/><link rel='alternate' type='text/html' href='http://blog.rollingwithcode.com/2011/01/rspecmongodatabasecleaner_09.html' title='RSpec+Mongo+DatabaseCleaner'/><author><name>Rafael Felix</name><uri>http://www.blogger.com/profile/15945926043992740682</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/_DivtpeF7_5Y/SSP5tBTaJsI/AAAAAAAAATI/84pO0s0CdY0/S220/felix.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4781511741260972168.post-1550186425807557375</id><published>2011-01-09T09:23:00.000-08:00</published><updated>2011-01-09T09:31:20.720-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MongoDB'/><category scheme='http://www.blogger.com/atom/ns#' term='RSpec'/><category scheme='http://www.blogger.com/atom/ns#' term='pt-br'/><category scheme='http://www.blogger.com/atom/ns#' term='Ruby On Rails'/><category scheme='http://www.blogger.com/atom/ns#' term='DatabaseCleaner'/><title type='text'>RSpec+Mongo+DatabaseCleaner</title><content type='html'>A algum tempo atrás escrevi sobre &lt;a href="http://blog.rollingwithcode.com/2010/10/rails-3-rspec-2-devise-mongodb.html" target="_blank"&gt;RSpec e MongoDB&lt;/a&gt; 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&lt;br /&gt;&lt;br /&gt;&lt;pre class="ruby" name="code"&gt;RSpec.configure do |config|&lt;br /&gt;  config.before(:suite) do&lt;br /&gt;    DatabaseCleaner.orm = :mongoid&lt;br /&gt;    DatabaseCleaner.strategy = :truncation    &lt;br /&gt;    DatabaseCleaner.clean_with(:truncation)&lt;br /&gt;  end  &lt;br /&gt;  config.before(:each) do  &lt;br /&gt;    DatabaseCleaner.start&lt;br /&gt;  end&lt;br /&gt;  config.after(:each) do  &lt;br /&gt;    DatabaseCleaner.clean&lt;br /&gt;  end&lt;br /&gt;end&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;também foi alterado para o before, iniciar o Cleaner, e o after para limpar. :D&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4781511741260972168-1550186425807557375?l=blog.rollingwithcode.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.rollingwithcode.com/feeds/1550186425807557375/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4781511741260972168&amp;postID=1550186425807557375&amp;isPopup=true' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4781511741260972168/posts/default/1550186425807557375'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4781511741260972168/posts/default/1550186425807557375'/><link rel='alternate' type='text/html' href='http://blog.rollingwithcode.com/2011/01/rspecmongodatabasecleaner.html' title='RSpec+Mongo+DatabaseCleaner'/><author><name>Rafael Felix</name><uri>http://www.blogger.com/profile/15945926043992740682</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/_DivtpeF7_5Y/SSP5tBTaJsI/AAAAAAAAATI/84pO0s0CdY0/S220/felix.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4781511741260972168.post-2565238034614689919</id><published>2010-12-28T04:47:00.000-08:00</published><updated>2010-12-28T04:47:15.501-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JRuby'/><category scheme='http://www.blogger.com/atom/ns#' term='IReport'/><category scheme='http://www.blogger.com/atom/ns#' term='Redmine'/><category scheme='http://www.blogger.com/atom/ns#' term='Ruby On Rails'/><category scheme='http://www.blogger.com/atom/ns#' term='JasperReports'/><title type='text'>Ruby on Rails + JasperReports (IReport)</title><content type='html'>&lt;div&gt;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 &lt;a href="http://www.redmine.org/" target="_blank"&gt;Redmine&lt;/a&gt;, 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.&lt;/div&gt;&lt;br /&gt;&lt;div&gt;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 &lt;b&gt;FODEU&lt;/b&gt;.&lt;br /&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;Pesquisei na net e cheguei até um &lt;a href="http://mauricioszabo.wordpress.com/2009/10/18/jasper-on-rails/" target="_blank"&gt;blog brazuca&lt;/a&gt;, 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:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;commons-beanutils&lt;/li&gt;&lt;li&gt;commons-collections&lt;/li&gt;&lt;li&gt;commons-digester&lt;/li&gt;&lt;li&gt;commons-logging&lt;/li&gt;&lt;li&gt;commons-logging-api&lt;/li&gt;&lt;li&gt;iText&lt;/li&gt;&lt;li&gt;jasperreports&lt;/li&gt;&lt;li&gt;postgresql&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;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:&lt;br /&gt;&lt;br /&gt;1) Criar no relatorio_controller uma action e mapeei ela no routes.rb&lt;br /&gt;2) Criei a tela com form_tag e adicionei os parametros&lt;br /&gt;3) no retorno da action fiz a busca e mandei pro&amp;nbsp;relatório.&lt;br /&gt;&lt;br /&gt;Eis que vem o primeiro erro, o JasperReports não conseguiu processar o modelo do Ruby.&lt;br /&gt;Matutei uma solução e encontrei, criei um projeto bem simples, coloquei uma classe la dentro, e adicionei os campos, no IReport criei o&amp;nbsp;relatório&amp;nbsp;com base naqueles campos. A classe ficou mais ou menos como a classe abaixo:&lt;br /&gt;&lt;br /&gt;&lt;pre class="java" name="code"&gt;public class Relatorio{&lt;br /&gt;  private Integer issue_id;&lt;br /&gt;  private String issue_subject;&lt;br /&gt;  private String issue_description;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;criei assim mesmo fora do padrão com os underlines (_) para ser mais facil pro ruby reconhecer.&lt;br /&gt;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&lt;br /&gt;&lt;br /&gt;&lt;pre class="ruby" name="code"&gt;@dataSource = JRBeanCollectionDataSource.new(ArrayList.new(dados))&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;editei tbm o metodo to_pdf e ficou assim:&lt;br /&gt;&lt;pre class="ruby" name="code"&gt;def to_pdf&lt;br /&gt;    fill = JasperFillManager.fill_report(@modelo, @params, @dataSource)&lt;br /&gt;    pdf = JasperExportManager.export_report_to_pdf(fill)&lt;br /&gt;    return String.from_java_bytes(pdf)&lt;br /&gt;end&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;e pronto, agora estou com o Redmine rodando no mongrel e gerando relatório em PDF com o JasperReports.&lt;br /&gt;&lt;br /&gt;Em tempo: Criei um jasper.rb na pasta config/initializers, ele carrega as libs ao invés de deixar no model.&lt;br /&gt;&lt;br /&gt;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&lt;br /&gt;&lt;br /&gt;&lt;pre class="ruby" name="code"&gt;class MessageObserver &amp;lt; ActiveRecord::Observer&lt;br /&gt;  def after_create(message)&lt;br /&gt;    t = java.lang.Thread.new do&lt;br /&gt;      Mailer.deliver_message_posted(message) if Setting.notified_events.include&lt;br /&gt;    end&lt;br /&gt;    t.start&lt;br /&gt;  end&lt;br /&gt;end&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Espero que isso seja util pra mais alguém, qualquer dúvida comenta ai que vejo se posso ajudar.&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4781511741260972168-2565238034614689919?l=blog.rollingwithcode.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.rollingwithcode.com/feeds/2565238034614689919/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4781511741260972168&amp;postID=2565238034614689919&amp;isPopup=true' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4781511741260972168/posts/default/2565238034614689919'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4781511741260972168/posts/default/2565238034614689919'/><link rel='alternate' type='text/html' href='http://blog.rollingwithcode.com/2010/12/ruby-on-rails-jasperreports-ireport.html' title='Ruby on Rails + JasperReports (IReport)'/><author><name>Rafael Felix</name><uri>http://www.blogger.com/profile/15945926043992740682</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/_DivtpeF7_5Y/SSP5tBTaJsI/AAAAAAAAATI/84pO0s0CdY0/S220/felix.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4781511741260972168.post-8501317863260341424</id><published>2010-12-15T16:15:00.000-08:00</published><updated>2010-12-15T16:15:24.651-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Monkey Patch'/><category scheme='http://www.blogger.com/atom/ns#' term='en-US'/><category scheme='http://www.blogger.com/atom/ns#' term='Ruby'/><title type='text'>Days of week in ruby</title><content type='html'>&lt;a href="http://blog.rollingwithcode.com/2010/12/dias-da-semana-no-ruby.html"&gt;Em português&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;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.&lt;br /&gt;&lt;br /&gt;You can see some explain about the method here (in Pt-Br): &lt;a href="http://www.arlindo-correia.com/140101.html"&gt;http://www.arlindo-correia.com/140101.html&lt;/a&gt;&lt;br /&gt;But, I converted the javascript code at &lt;a href="http://www.profcardy.com/calculadoras/aplicativos.php?calc=4"&gt;http://www.profcardy.com/calculadoras/aplicativos.php?calc=4&lt;/a&gt; to ruby&lt;br /&gt;&lt;br /&gt;the result is this monkey patch&lt;br /&gt;&lt;br /&gt;&lt;pre class="ruby" name="code"&gt;class Time&lt;br /&gt;  DAYS_OF_WEEK = [&lt;br /&gt;    :saturday, :sunday, :monday, :tuesday, :wednesday, :thursday, :friday&lt;br /&gt;  ]&lt;br /&gt;  def day_of_week&lt;br /&gt;    day = self.day&lt;br /&gt;    month = self.month&lt;br /&gt;    year = self.year&lt;br /&gt;    if month == 1&lt;br /&gt;      month = 13&lt;br /&gt;      year -= 1&lt;br /&gt;    end&lt;br /&gt;    if month == 2&lt;br /&gt;      month = 14&lt;br /&gt;      year -= 1&lt;br /&gt;    end&lt;br /&gt;    phase1 = ((month + 1)*3)/5&lt;br /&gt;    phase2 = (year/4)&lt;br /&gt;    phase3 = (year/100)&lt;br /&gt;    phase4 = (year/400)&lt;br /&gt;    phase5 = day + (month*2)+phase1+year+phase2-phase3+phase4+2&lt;br /&gt;    phase6 = phase5/7&lt;br /&gt;    result = phase5-(phase6*7)&lt;br /&gt;    DAYS_OF_WEEK[result]&lt;br /&gt;  end&lt;br /&gt;end&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;and some result by irb (I've used the rails console)&lt;br /&gt;&lt;pre class="ruby" name="code"&gt;irb(main):001:0&gt; t = Time.now&lt;br /&gt;=&gt; Wed Dec 15 22:05:00 -0200 2010&lt;br /&gt;irb(main):002:0&gt; t.day_of_week&lt;br /&gt;=&gt; :wednesday&lt;br /&gt;irb(main):003:0&gt; t.prev_month.day_of_week&lt;br /&gt;=&gt; :monday&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;If somebody know another way to do it, I'm listening&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4781511741260972168-8501317863260341424?l=blog.rollingwithcode.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.rollingwithcode.com/feeds/8501317863260341424/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4781511741260972168&amp;postID=8501317863260341424&amp;isPopup=true' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4781511741260972168/posts/default/8501317863260341424'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4781511741260972168/posts/default/8501317863260341424'/><link rel='alternate' type='text/html' href='http://blog.rollingwithcode.com/2010/12/days-of-week-in-ruby.html' title='Days of week in ruby'/><author><name>Rafael Felix</name><uri>http://www.blogger.com/profile/15945926043992740682</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/_DivtpeF7_5Y/SSP5tBTaJsI/AAAAAAAAATI/84pO0s0CdY0/S220/felix.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4781511741260972168.post-2192596311955544657</id><published>2010-12-15T16:08:00.000-08:00</published><updated>2010-12-15T16:08:34.821-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Monkey Patch'/><category scheme='http://www.blogger.com/atom/ns#' term='Ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='pt-br'/><title type='text'>Dias da Semana no Ruby</title><content type='html'>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.&lt;br /&gt;&lt;br /&gt;A documentação teorica está aqui: &lt;a href="http://www.arlindo-correia.com/140101.html"&gt;http://www.arlindo-correia.com/140101.html&lt;/a&gt;&lt;br /&gt;Porém pra fazer a conversão, converti o codigo desse site &lt;a href="http://www.profcardy.com/calculadoras/aplicativos.php?calc=4"&gt;http://www.profcardy.com/calculadoras/aplicativos.php?calc=4&lt;/a&gt; do javascript para o ruby&lt;br /&gt;&lt;br /&gt;o resultado foi esse monkey patch&lt;br /&gt;&lt;br /&gt;&lt;pre class="ruby" name="code"&gt;class Time&lt;br /&gt;  DAYS_OF_WEEK = [&lt;br /&gt;    :saturday, :sunday, :monday, :tuesday, :wednesday, :thursday, :friday&lt;br /&gt;  ]&lt;br /&gt;  def day_of_week&lt;br /&gt;    day = self.day&lt;br /&gt;    month = self.month&lt;br /&gt;    year = self.year&lt;br /&gt;    if month == 1&lt;br /&gt;      month = 13&lt;br /&gt;      year -= 1&lt;br /&gt;    end&lt;br /&gt;    if month == 2&lt;br /&gt;      month = 14&lt;br /&gt;      year -= 1&lt;br /&gt;    end&lt;br /&gt;    phase1 = ((month + 1)*3)/5&lt;br /&gt;    phase2 = (year/4)&lt;br /&gt;    phase3 = (year/100)&lt;br /&gt;    phase4 = (year/400)&lt;br /&gt;    phase5 = day + (month*2)+phase1+year+phase2-phase3+phase4+2&lt;br /&gt;    phase6 = phase5/7&lt;br /&gt;    result = phase5-(phase6*7)&lt;br /&gt;    DAYS_OF_WEEK[result]&lt;br /&gt;  end&lt;br /&gt;end&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;E os testes usando irb (na verdade usei o console do rails)&lt;br /&gt;&lt;pre class="ruby" name="code"&gt;irb(main):001:0&gt; t = Time.now&lt;br /&gt;=&gt; Wed Dec 15 22:05:00 -0200 2010&lt;br /&gt;irb(main):002:0&gt; t.day_of_week&lt;br /&gt;=&gt; :wednesday&lt;br /&gt;irb(main):003:0&gt; t.prev_month.day_of_week&lt;br /&gt;=&gt; :monday&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Se alguem souber como recuperar o dia da semana sem o path me avisa ehhee.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4781511741260972168-2192596311955544657?l=blog.rollingwithcode.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.rollingwithcode.com/feeds/2192596311955544657/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4781511741260972168&amp;postID=2192596311955544657&amp;isPopup=true' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4781511741260972168/posts/default/2192596311955544657'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4781511741260972168/posts/default/2192596311955544657'/><link rel='alternate' type='text/html' href='http://blog.rollingwithcode.com/2010/12/dias-da-semana-no-ruby.html' title='Dias da Semana no Ruby'/><author><name>Rafael Felix</name><uri>http://www.blogger.com/profile/15945926043992740682</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/_DivtpeF7_5Y/SSP5tBTaJsI/AAAAAAAAATI/84pO0s0CdY0/S220/felix.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4781511741260972168.post-2093298039990890051</id><published>2010-12-08T14:01:00.000-08:00</published><updated>2010-12-08T14:01:11.982-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='Ruby On Rails'/><title type='text'>Modelos sem tabelas no rails</title><content type='html'>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:&lt;br /&gt;&lt;br /&gt;&lt;pre class="ruby" name="code"&gt;class Person&lt;br /&gt;  attr_accessor :name, :age&lt;br /&gt;end&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;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:&lt;br /&gt;&lt;br /&gt;&lt;pre class="ruby" name="code"&gt;class Person&lt;br /&gt;  include ActiveModel::Validations&lt;br /&gt;  include ActiveModel::Conversion&lt;br /&gt;  extend ActiveModel::Naming&lt;br /&gt;&lt;br /&gt;  attr_accessor :name, :age&lt;br /&gt;  validates :name, :age, :presence =&gt; true&lt;br /&gt;&lt;br /&gt;  def initialize(attributes = {})&lt;br /&gt;    attributes.each do |name, value|&lt;br /&gt;      send("#{name}=", value)&lt;br /&gt;    end&lt;br /&gt;  end  &lt;br /&gt;  &lt;br /&gt;  def persisted?&lt;br /&gt;    false&lt;br /&gt;  end&lt;br /&gt;end&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;vejam só que maravilha, agora vc pode fazer coisas como essas (irb):&lt;br /&gt;&lt;br /&gt;&lt;pre class="ruby" name="code"&gt;p = Person.new&lt;br /&gt;=&gt; #&lt;Person:0x7f4516778848&gt;&lt;br /&gt;p.valid?&lt;br /&gt;=&gt; false&lt;br /&gt;p.errors&lt;br /&gt;=&gt; #&lt;OrderedHash {:age=&gt;["translation missing: br, activemodel, errors, models, person, attributes, age, blank"], :name=&gt;["translation missing: br, activemodel, errors, models, person, attributes, name, blank"]}&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Ooops, falta as traduções, mas isso é dever de casa né ashudahushud.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4781511741260972168-2093298039990890051?l=blog.rollingwithcode.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.rollingwithcode.com/feeds/2093298039990890051/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4781511741260972168&amp;postID=2093298039990890051&amp;isPopup=true' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4781511741260972168/posts/default/2093298039990890051'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4781511741260972168/posts/default/2093298039990890051'/><link rel='alternate' type='text/html' href='http://blog.rollingwithcode.com/2010/12/modelos-sem-tabelas-no-rails.html' title='Modelos sem tabelas no rails'/><author><name>Rafael Felix</name><uri>http://www.blogger.com/profile/15945926043992740682</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/_DivtpeF7_5Y/SSP5tBTaJsI/AAAAAAAAATI/84pO0s0CdY0/S220/felix.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4781511741260972168.post-1445411510003731416</id><published>2010-11-18T02:33:00.000-08:00</published><updated>2010-11-18T02:33:34.413-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Bean Script Framework'/><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='ScripEngine'/><category scheme='http://www.blogger.com/atom/ns#' term='Groovy'/><title type='text'>Formulas Matemáticas Em Java</title><content type='html'>Quem nunca precisou usar alguma formula matemática em Java, para efetuar alguma operação?&lt;br /&gt;&lt;br /&gt;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&amp;nbsp;metodologias&amp;nbsp;ou bibliotecas resolvem o problema, porém você tem que implementar algo, sempre tem algum ajuste. Precisei usar o &lt;a href="http://pt.wikipedia.org/wiki/Tabela_Price" target="_blank"&gt;Metodo Price&lt;/a&gt;&amp;nbsp;em um calculo financeiro, a formula não é complexa, mas como toda a formula matemática, deve se ter cuidado com os&amp;nbsp;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&amp;nbsp;túnel, o &lt;a href="http://groovy.codehaus.org/Bean+Scripting+Framework" target="_blank"&gt;Bean Scripting Framework&lt;/a&gt;. Linguagens de script são mais&amp;nbsp;flexíveis&amp;nbsp;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&amp;nbsp;fácil, se você usa alguma versão mais antiga, por favor faça um upgrade urgente, quem está perdendo é você.&lt;br /&gt;&lt;br /&gt;PS: As bibliotecas são referenciadas via maven, se for usar ANT ou qualquer outra coisa, tem que procurar no Google.&lt;br /&gt;&lt;br /&gt;vamos precisar de duas simples&amp;nbsp;bibliotecas&amp;nbsp;o projeto o Bean Scripting Framework (BSF -&amp;gt; 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&lt;br /&gt;&lt;br /&gt;auhsduhahsduas, chega a ser&amp;nbsp;ridículo, mas depois muda isso ai pra testar (o operador ** no groovy representa&amp;nbsp;potenciação)&lt;br /&gt;&lt;br /&gt;Olha a trabalheira:&lt;br /&gt;&lt;br /&gt;&lt;pre class="java" name="code"&gt;String formula = "x ** 2 + 10";&lt;br /&gt;BSFManager manager = new BSFManager();&lt;br /&gt;manager.declareBean("x", "10", Integer.class);&lt;br /&gt;Double result = (Double) manager.eval("groovy", "myScript.groovy", 0, 0, formula);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Eu fiz um cast pra Double, mas o retorno é um object, pode retornar qualquer coisa.&lt;br /&gt;Mas fácil que isso só dois disso heheh.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4781511741260972168-1445411510003731416?l=blog.rollingwithcode.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.rollingwithcode.com/feeds/1445411510003731416/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4781511741260972168&amp;postID=1445411510003731416&amp;isPopup=true' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4781511741260972168/posts/default/1445411510003731416'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4781511741260972168/posts/default/1445411510003731416'/><link rel='alternate' type='text/html' href='http://blog.rollingwithcode.com/2010/11/formulas-matematicas-em-java.html' title='Formulas Matemáticas Em Java'/><author><name>Rafael Felix</name><uri>http://www.blogger.com/profile/15945926043992740682</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/_DivtpeF7_5Y/SSP5tBTaJsI/AAAAAAAAATI/84pO0s0CdY0/S220/felix.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4781511741260972168.post-8513843667645949999</id><published>2010-11-09T12:41:00.000-08:00</published><updated>2010-11-09T12:41:27.912-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='Rubygems'/><category scheme='http://www.blogger.com/atom/ns#' term='Ruby On Rails'/><category scheme='http://www.blogger.com/atom/ns#' term='Haml'/><title type='text'>Haml+Rails</title><content type='html'>&lt;a href="http://haml-lang.com/" target="_blank"&gt;Haml&lt;/a&gt; é 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 &lt;a href="https://github.com/psynix/rails3_haml_scaffold_generator" target="_blank"&gt;rails3_haml_scaffold_generator&lt;/a&gt; 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.&lt;br /&gt;&lt;br /&gt;Resolvi arregaçar as mangas, e &lt;a href="https://github.com/fellix/haml_rails" target="_blank"&gt;fiz minha primeira gem&lt;/a&gt;, 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.&lt;br /&gt;&lt;br /&gt;O uso dessa gem é bem simples, ela nem tem reação com a gem haml, pois ela consiste somente nos generators. &lt;br /&gt;&lt;br /&gt;Adicione ao seu Gemfile as seguintes linhas&lt;br /&gt;&lt;br /&gt;gem haml&lt;br /&gt;gem haml_rails&lt;br /&gt;&lt;br /&gt;use o bundle install ou uso o gem install para instala-las.&lt;br /&gt;&lt;br /&gt;depois só executar o comando&lt;br /&gt;&lt;br /&gt;rails g haml_rails:install&lt;br /&gt;&lt;br /&gt;ele vai editar seu application.rb e adicionar o haml como seu template engine. vc pode apagar caso prefira usar o ERB.&lt;br /&gt;&lt;br /&gt;Por enquanto é isso..&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4781511741260972168-8513843667645949999?l=blog.rollingwithcode.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.rollingwithcode.com/feeds/8513843667645949999/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4781511741260972168&amp;postID=8513843667645949999&amp;isPopup=true' title='2 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4781511741260972168/posts/default/8513843667645949999'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4781511741260972168/posts/default/8513843667645949999'/><link rel='alternate' type='text/html' href='http://blog.rollingwithcode.com/2010/11/hamlrails.html' title='Haml+Rails'/><author><name>Rafael Felix</name><uri>http://www.blogger.com/profile/15945926043992740682</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/_DivtpeF7_5Y/SSP5tBTaJsI/AAAAAAAAATI/84pO0s0CdY0/S220/felix.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4781511741260972168.post-4904679864600965942</id><published>2010-10-17T11:17:00.000-07:00</published><updated>2010-10-17T11:17:35.870-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MongoDB'/><category scheme='http://www.blogger.com/atom/ns#' term='Ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='RSpec'/><category scheme='http://www.blogger.com/atom/ns#' term='Devise'/><category scheme='http://www.blogger.com/atom/ns#' term='Ruby On Rails'/><title type='text'>Rails 3, RSpec 2, Devise a MongoDB</title><content type='html'>&lt;p&gt;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 &lt;a href="http://github.com/plataformatec/devise" target="_blank"&gt;Devise&lt;/a&gt;, um projeto brasileiro, que se tornou bem famoso pelo mundo Rails. Para ORM gostei do &lt;a href="http://mongoid.org/", target="_blank"&gt;Mongoid&lt;/a&gt;, e ainda mais pelo devise ter suporte ao mongoid ao invez do ActiveRecord.&lt;/p&gt;&lt;h2&gt;Iniciando&lt;/h2&gt;&lt;p&gt;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.&lt;/p&gt;&lt;p&gt;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 &lt;br /&gt;&lt;pre name="code" class="ruby"&gt;RSpec.configure do |config|&lt;br /&gt;  require 'database_cleaner'&lt;br /&gt;  &lt;br /&gt;  config.before(:suite) do&lt;br /&gt;    DatabaseCleaner.strategy = :truncation&lt;br /&gt;    DatabaseCleaner.orm = "mongoid"&lt;br /&gt;  end&lt;br /&gt;&lt;br /&gt;  config.before(:each) do&lt;br /&gt;    DatabaseCleaner.clean&lt;br /&gt;  end&lt;br /&gt;  config.mock_with :rspec&lt;br /&gt;  config.include Devise::TestHelpers, :type =&gt; :controller # Essa linha adiciona os helpers do Devise para o RSpec.&lt;br /&gt;end&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;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.&lt;br /&gt;&lt;/p&gt;&lt;h2&gt;Testando os controllers&lt;/h2&gt;&lt;p&gt;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.&lt;br /&gt;Adicionei também no application_controller.rb um metodo filtro que indica se o usuário é um adminsitrador&lt;br /&gt;&lt;pre name="code" class="ruby"&gt;protected&lt;br /&gt;  def admin_user!    &lt;br /&gt;    if authenticate_user!      &lt;br /&gt;      unless current_user.admin        &lt;br /&gt;        flash[:warning] = "Acesso Negado"&lt;br /&gt;        redirect_to root_url&lt;br /&gt;      end&lt;br /&gt;    end&lt;br /&gt;  end&lt;br /&gt;&lt;/pre&gt;reparem que usei  o filtro authenticated_user! que é do devise pra indicar que o usuário está logado no sistema.&lt;br /&gt;meu controller admin_controller.rb&lt;br /&gt;&lt;pre name="code" class="ruby"&gt;class AdminController &lt; ApplicationController&lt;br /&gt;  before_filter :admin_user!&lt;br /&gt;  &lt;br /&gt;  def index&lt;br /&gt;  end&lt;br /&gt;&lt;br /&gt;end&lt;br /&gt;&lt;/pre&gt;é 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.&lt;pre name="code" class="ruby"&gt;require 'spec_helper'&lt;br /&gt;&lt;br /&gt;describe AdminController do&lt;br /&gt;    &lt;br /&gt;  describe "GET 'index'" do    &lt;br /&gt;    def do_action_with_user(admin)&lt;br /&gt;      @user = User.create!(:name =&gt; "Test", :email =&gt; "test@test.com", &lt;br /&gt;        :password =&gt; "testet",&lt;br /&gt;        :password_confirmation =&gt; "testet",&lt;br /&gt;        :admin =&gt; admin)        &lt;br /&gt;      sign_in @user&lt;br /&gt;      get 'index'&lt;br /&gt;    end&lt;br /&gt;    #1&lt;br /&gt;    it "should not be successful when no user was logged in" do&lt;br /&gt;      get 'index'&lt;br /&gt;      flash[:alert].should_not be_nil&lt;br /&gt;      response.should_not be_success&lt;br /&gt;    end&lt;br /&gt;    #2&lt;br /&gt;    it "should not be successful when no admin user was logged in" do&lt;br /&gt;      do_action_with_user(false)      &lt;br /&gt;      flash[:warning].should_not be_nil      &lt;br /&gt;      response.should_not be_success&lt;br /&gt;    end&lt;br /&gt;    #3&lt;br /&gt;    it "should be successful when admin user was logged in" do&lt;br /&gt;      do_action_with_user(true)&lt;br /&gt;      response.should be_success&lt;br /&gt;    end&lt;br /&gt;  end&lt;br /&gt;&lt;br /&gt;end&lt;br /&gt;&lt;/pre&gt;bem simples, um metodo dry pra fazer o registro do usuario e usar o metodo auxiliar do devise para o login (sign_in): &lt;ul&gt;&lt;li&gt;o teste 1 é um teste para acesso sem login, no caso uma chamada a action index do controller admin sem um usuário logado.&lt;/li&gt;&lt;li&gt;teste 2 teste para um usuário que não é administrador, repare que testo se o flash esta preenchido&lt;/li&gt;&lt;li&gt;teste 3 testa a ação de sucesso, no caso o acesso de um usuário administrador&lt;/li&gt;&lt;/ul&gt;Inicialmente esse teste se fez suficiente para dizer que agora a classe está segura.&lt;/p&gt;&lt;h2&gt;Outras notas&lt;/h2&gt;&lt;p&gt;Tive alguns problemas no começo do uso do RSpec 2 em views, e vou listar aqui alguns deles:&lt;pre name="code" class="ruby"&gt;assign :name, "Teste"&lt;br /&gt;&lt;/pre&gt;ao invez de&lt;pre name="code" class="ruby"&gt;assigns[:name] = "Teste"&lt;br /&gt;&lt;/pre&gt;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:&lt;pre name="code" class="ruby"&gt;#RSpec 3&lt;br /&gt;assert_select('p', "Teste")&lt;br /&gt;#RSpec 2&lt;br /&gt;response.have_tag 'p', "Teste"&lt;br /&gt;&lt;/pre&gt;&lt;/p&gt;&lt;br /&gt;Espero que isso seja util pra mais alguem, pelo menos eu não vou mais esquecer :D&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4781511741260972168-4904679864600965942?l=blog.rollingwithcode.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.rollingwithcode.com/feeds/4904679864600965942/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4781511741260972168&amp;postID=4904679864600965942&amp;isPopup=true' title='1 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4781511741260972168/posts/default/4904679864600965942'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4781511741260972168/posts/default/4904679864600965942'/><link rel='alternate' type='text/html' href='http://blog.rollingwithcode.com/2010/10/rails-3-rspec-2-devise-mongodb.html' title='Rails 3, RSpec 2, Devise a MongoDB'/><author><name>Rafael Felix</name><uri>http://www.blogger.com/profile/15945926043992740682</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/_DivtpeF7_5Y/SSP5tBTaJsI/AAAAAAAAATI/84pO0s0CdY0/S220/felix.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4781511741260972168.post-8071417187106138991</id><published>2010-09-20T07:40:00.000-07:00</published><updated>2010-09-20T07:40:41.704-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='bla bla bla'/><title type='text'>Software é como uma obra de arte</title><content type='html'>Para quem vê, pode ser estranho, bonito, sem sentido, mas para quem é da área tem que ser maravilhoso.&lt;br /&gt;&lt;br /&gt;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.&lt;br /&gt;&lt;br /&gt;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.&lt;br /&gt;&lt;br /&gt;Afinal, somos criadores, e todo o criador precisa fazer alguns ajustes na sua cria, afim de torna-la melhor sempre.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4781511741260972168-8071417187106138991?l=blog.rollingwithcode.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.rollingwithcode.com/feeds/8071417187106138991/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4781511741260972168&amp;postID=8071417187106138991&amp;isPopup=true' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4781511741260972168/posts/default/8071417187106138991'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4781511741260972168/posts/default/8071417187106138991'/><link rel='alternate' type='text/html' href='http://blog.rollingwithcode.com/2010/09/software-e-como-uma-obra-de-arte.html' title='Software é como uma obra de arte'/><author><name>Rafael Felix</name><uri>http://www.blogger.com/profile/15945926043992740682</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/_DivtpeF7_5Y/SSP5tBTaJsI/AAAAAAAAATI/84pO0s0CdY0/S220/felix.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4781511741260972168.post-5079408319486124144</id><published>2010-08-30T12:08:00.000-07:00</published><updated>2010-08-30T12:08:12.532-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='bla bla bla'/><title type='text'>Deu Certo? Deixa! Funcionou? Não Mexa!</title><content type='html'>Essa piadinha aí, muito engraçada as vezes, pode não caber na empresa onde trabalha.&lt;br /&gt;&lt;br /&gt;  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.&lt;br /&gt;&lt;br /&gt;  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.&lt;br /&gt;  &lt;br /&gt;  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.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4781511741260972168-5079408319486124144?l=blog.rollingwithcode.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.rollingwithcode.com/feeds/5079408319486124144/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4781511741260972168&amp;postID=5079408319486124144&amp;isPopup=true' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4781511741260972168/posts/default/5079408319486124144'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4781511741260972168/posts/default/5079408319486124144'/><link rel='alternate' type='text/html' href='http://blog.rollingwithcode.com/2010/08/deu-certo-deixa-funcionou-nao-mexa.html' title='Deu Certo? Deixa! Funcionou? Não Mexa!'/><author><name>Rafael Felix</name><uri>http://www.blogger.com/profile/15945926043992740682</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/_DivtpeF7_5Y/SSP5tBTaJsI/AAAAAAAAATI/84pO0s0CdY0/S220/felix.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4781511741260972168.post-7656567312070882099</id><published>2010-08-30T05:51:00.001-07:00</published><updated>2010-08-30T05:51:50.116-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='Ruby On Rails'/><title type='text'>Rails 3 is out</title><content type='html'>Não deu nem tempo de postar sobre meus testes com o Rails 3 RC e a versão final está disponivel :)&lt;br /&gt;&lt;br /&gt;http://akitaonrails.com/2010/08/29/rails-3-0-final-acaba-de-ser-lancado&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4781511741260972168-7656567312070882099?l=blog.rollingwithcode.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.rollingwithcode.com/feeds/7656567312070882099/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4781511741260972168&amp;postID=7656567312070882099&amp;isPopup=true' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4781511741260972168/posts/default/7656567312070882099'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4781511741260972168/posts/default/7656567312070882099'/><link rel='alternate' type='text/html' href='http://blog.rollingwithcode.com/2010/08/rails-3-is-out.html' title='Rails 3 is out'/><author><name>Rafael Felix</name><uri>http://www.blogger.com/profile/15945926043992740682</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/_DivtpeF7_5Y/SSP5tBTaJsI/AAAAAAAAATI/84pO0s0CdY0/S220/felix.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4781511741260972168.post-6847349385162295057</id><published>2010-08-30T03:46:00.000-07:00</published><updated>2010-08-30T03:46:28.574-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='bla bla bla'/><title type='text'>JavaME, Android e JavaFX</title><content type='html'>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.&lt;br /&gt;  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.&lt;br /&gt;  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...&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;PS: Prometo tentar escrever mais seguido (ou não) =)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4781511741260972168-6847349385162295057?l=blog.rollingwithcode.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.rollingwithcode.com/feeds/6847349385162295057/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4781511741260972168&amp;postID=6847349385162295057&amp;isPopup=true' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4781511741260972168/posts/default/6847349385162295057'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4781511741260972168/posts/default/6847349385162295057'/><link rel='alternate' type='text/html' href='http://blog.rollingwithcode.com/2010/08/javame-android-e-javafx.html' title='JavaME, Android e JavaFX'/><author><name>Rafael Felix</name><uri>http://www.blogger.com/profile/15945926043992740682</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/_DivtpeF7_5Y/SSP5tBTaJsI/AAAAAAAAATI/84pO0s0CdY0/S220/felix.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4781511741260972168.post-3776572305802917527</id><published>2010-07-14T04:03:00.000-07:00</published><updated>2010-07-14T04:03:43.492-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='pt-br'/><title type='text'>Alterar o classpath em tempo de execução</title><content type='html'>Muito comum essa dúvida, porém nem tão pratica :D.&lt;br /&gt;&lt;br /&gt;Para ferramentas baseadas em plugins o ideal é usar OSGi mesmo, que funciona muito bem.&lt;br /&gt;&lt;br /&gt;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.&lt;br /&gt;Existe um metodo bem simples, usando reflection que permite que isso seja feito.&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="java"&gt;File f = new File("ABSOLUTE FILE PATH");&lt;br /&gt;URL url = f.toURI().toURL();&lt;br /&gt;URLClassLoader classLoader = (URLClassLoader) ClassLoader.getSystemClassLoader();&lt;br /&gt;Method method = URLClassLoader.class.getDeclaredMethod("addURL", URL.class);&lt;br /&gt;method.setAccessible(true);&lt;br /&gt;method.invoke(classLoader, url);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;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.&lt;br /&gt;&lt;br /&gt;usando reflection pegamos o metodo protegido "addURL" dentro do URLClassLoader, e simplesmente o invocamos :D&lt;br /&gt;&lt;br /&gt;Bem simples e funcional.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4781511741260972168-3776572305802917527?l=blog.rollingwithcode.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.rollingwithcode.com/feeds/3776572305802917527/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4781511741260972168&amp;postID=3776572305802917527&amp;isPopup=true' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4781511741260972168/posts/default/3776572305802917527'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4781511741260972168/posts/default/3776572305802917527'/><link rel='alternate' type='text/html' href='http://blog.rollingwithcode.com/2010/07/alterar-o-classpath-em-tempo-de.html' title='Alterar o classpath em tempo de execução'/><author><name>Rafael Felix</name><uri>http://www.blogger.com/profile/15945926043992740682</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/_DivtpeF7_5Y/SSP5tBTaJsI/AAAAAAAAATI/84pO0s0CdY0/S220/felix.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4781511741260972168.post-3417363043932530321</id><published>2010-07-12T12:40:00.000-07:00</published><updated>2010-07-13T03:38:37.594-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='bla bla bla'/><category scheme='http://www.blogger.com/atom/ns#' term='pt-br'/><title type='text'>Testes Unitários e Metodologias Agéis</title><content type='html'>Bah, desculpem por não postar nada, sabe como é brasileiro em Copa do Mundo né :). Não pude deixar o fanatismo de lado.&lt;br /&gt;&lt;br /&gt;Ultimamente estive pesquisando e lendo muito sobre testes unitários e metodologias agéis de desenvolvimento e uma parte que eu gosto muito são os testes. Gosto muito de criar testes fazer refactoring dos meus codigos sempre visando melhora-los, pois estamos sempre aprendendo e algumas coisas antigas ficam com brechas ou códigos horriveis. Porém, se existe algo chato, é criar testes, apesar de gostar existem coisas que chegam a ser ridiculas de serem testadas. e em linguagens como Java, o esquema do Antes crie o teste, depois crie o codigo não funciona, pois se o metodo não existir na classe vc nem consegue compilar.&lt;br /&gt;&lt;br /&gt;Mas a minha decepção não é nem com os testes, que sim, são chatos de serem feitos, mas eu acho algo interessante. O que me deixou meio abismado, foi uma certa metodologia agil, o eXtreming Programming (XP). Lendo sobre o XP, parecia tudo muito bonito, muito bacana, mas aí veio um tal de Pair Programming. Puts eu queria saber quem foi o FDP que acha isso legal? Não existe nada mais chato que passar 8 horas do dia assistindo alguem programando, sim concordo nos louros dessa metodologia, é visível que alguem de fora encherga os seus erros de uma maneira mais facil, mas ninguem pensa no coitado que fica sentado ali do lado? Mesmo que haja revezamento no PC, quem não está programando, vai estar bocejando.&lt;br /&gt;&lt;br /&gt;Dai veio o motivo de usar tal metodo...&lt;br /&gt;A pressão do par! Não basta você estar o dia todo na empresa, e não podem nem olhar seus e-mails? Não vai poder se distrair 5 minutos? isso é coisa de &lt;a href="http://www.youtube.com/watch?v=mtaY5cyAzk4" target="_blank"&gt;Gerente Capataz&lt;/a&gt;. Numa profissão maçante como a nossa, acredito que um pouco de descontração (sem esquecer do trabalho é lógico), é fundamental. Acredito que na resolução de um problema, duas cabeças pensam melhor que uma. Mas agora para coisas básicas, acredito que cada um pode se virar, penso no Pair Programming diferente. Acredito que cada uma na sua máquina, em busca do mesmo problema, ou usando papel discutindo o problema, normalmente é mais vantajoso que passar o dia todo assistindo o outro trabalhar.&lt;br /&gt;&lt;br /&gt;Não sou contra o Pair Programming, mas vejo mas como uma solução de problemas, por exemplo: Temos um problema vamos discutir e resolve-lo juntos. Após o problema resolvido cada uma volta as suas tarefas normais. Pelo que entendi, o par deve ficar o tempo todo do lado lendo o que o outro escreve e corrigindo os erros.&lt;br /&gt;&lt;br /&gt;Só um desabafo.&lt;br /&gt;Tem muito gente que não percebe como funciona para empresas como Google, Microsoft. Ainda acham que funcionários são recursos...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4781511741260972168-3417363043932530321?l=blog.rollingwithcode.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.rollingwithcode.com/feeds/3417363043932530321/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4781511741260972168&amp;postID=3417363043932530321&amp;isPopup=true' title='2 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4781511741260972168/posts/default/3417363043932530321'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4781511741260972168/posts/default/3417363043932530321'/><link rel='alternate' type='text/html' href='http://blog.rollingwithcode.com/2010/07/testes-unitarios-e-metodologias-ageis.html' title='Testes Unitários e Metodologias Agéis'/><author><name>Rafael Felix</name><uri>http://www.blogger.com/profile/15945926043992740682</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/_DivtpeF7_5Y/SSP5tBTaJsI/AAAAAAAAATI/84pO0s0CdY0/S220/felix.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4781511741260972168.post-4041375973334219982</id><published>2010-05-31T04:10:00.000-07:00</published><updated>2010-05-31T04:10:03.454-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='bla bla bla'/><category scheme='http://www.blogger.com/atom/ns#' term='pt-br'/><title type='text'>Especialistas dizem que faltam vagas na área de TI</title><content type='html'>Quem nunca ouviu falar disso? Jornais, noticiários, todo mundos gosta de enaltecer o excesso de vagas no mercado de TI, até comentam de empresas que ficam anos com vagas abertas e não conseguem preenche-las.&lt;br /&gt;Existem vários tópicos no GUJ, comentando sobre essas afirmações feitas por profissionais jornalistas, não profissionais da área de TI. Partindo do suposto que estatisticamente a quantidade de vagas em aberto x o número de candidatos e o tempo que elas permanecem em aberto significam que sobram vagas, correto? Bom, não é bem esse o caminho.&lt;br /&gt;Nem sempre quantidade quer dizer qualidade, o pessoal não está ciente de como é difícil achar boas vagas, e ninguém sai em busca de empresas no estilo Google de ser. Muitos só querem trabalhar ter seu dinheiro e aprender coisas novas.&lt;br /&gt;Sua empresa não acha profissionais para contratar? Bom, existem algumas opções que sua empresa deve analisar:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Sua empresa sabe o que precisa, qual cargo pretende contratar?&lt;/li&gt;&lt;li&gt;Sabe a média salarial de profissionais desse cargo e com os conhecimentos pedidos?&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Somente essas duas perguntas podem responder por que você não acha um profissional nem que seja medíocre para contratar. Por quê? Por que na maioria dos casos o que vemos são vagas em busca de mão de obra qualificada, com baixo salário e que de preferência possa ser ninja e fazer tudo o que for pedido. Já cheguei a ver vagas onde os requisitos no mínimo eram pra sênior , mas a vaga era pra um &lt;b&gt;ESTÁGIARIO&lt;/b&gt;, leu bem? Seria a mesma coisa que pedir para um estagiário do escritório de contabilidade saber fazer metade da movimentação contábil das empresas sem ajuda, isso é completamente ridículo, e o salário é claro incompatível com os conhecimentos.&lt;br /&gt;Ai vale a ressalva de que muitas dessas vagas em aberto são exclusivas, e garanto que removendo essa massa de vagas, teríamos ai um mercado equilibrado, sem esse excesso de vagas, que vemos serem veiculados por ai. &lt;br /&gt;É muito simples avaliar que a anos sobram inúmeras vagas em TI, mais ai que os cegos não enxergam, sobram vagas, ou as empresas não sabem contratar profissionais?&lt;br /&gt;&lt;br /&gt;Pensei bem se publicava ou não essa bagaça, mas que sabe, ta ai :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4781511741260972168-4041375973334219982?l=blog.rollingwithcode.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.rollingwithcode.com/feeds/4041375973334219982/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4781511741260972168&amp;postID=4041375973334219982&amp;isPopup=true' title='8 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4781511741260972168/posts/default/4041375973334219982'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4781511741260972168/posts/default/4041375973334219982'/><link rel='alternate' type='text/html' href='http://blog.rollingwithcode.com/2010/05/especialistas-dizem-que-faltam-vagas-na.html' title='Especialistas dizem que faltam vagas na área de TI'/><author><name>Rafael Felix</name><uri>http://www.blogger.com/profile/15945926043992740682</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/_DivtpeF7_5Y/SSP5tBTaJsI/AAAAAAAAATI/84pO0s0CdY0/S220/felix.jpg'/></author><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4781511741260972168.post-9206389147219074060</id><published>2010-05-06T12:58:00.000-07:00</published><updated>2010-05-06T13:29:23.139-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Ubuntu'/><title type='text'>Ubuntu 10.04 e a placa NVIDIA</title><content type='html'>ba, sei que isso não tem a ver com programação, mas isso foi um acontecimento bacana pra postar aqui.&lt;br /&gt;&lt;br /&gt;dia 29 saiu o Ubuntu 10.04, e eu facero, segunda feira fui tentar instalar, ver como ficava o ubuntu, e me assustei com o que vi, a imagem completamente distorcida, era tudo meio nas escura pra selecionar, realmente uma bosta, meu notebok é um HP DV6704nr. E procurava na net não achei uma solução para utilizar, resumindo mantive a versão 9.10, hoje meu colega o Jean (Zize), me deu uma ajuda (leia-se configurou) o ubuntu 10.04 na maquina.&lt;br /&gt;&lt;br /&gt;A instalação ocorre meio na obcuridade, se vc for em experimentar ubuntu, e alterar a resolução você ate consegue ver o sistema direito, em alguns casos aparece uma tela preta e uma janela de aviso, se aparecer isso aperte enter, e uma tela com algumas opções visivel pela metade aparecerá, você vai ate a ultima opção, aperta pra baixo umas 10x, presciona a barra de espaço para selecionar (lembrando que a seleção deve estar no checkbox não na escrita), e de dois tabs e um enter, o sistema iniciara com os drivers genericos sem problema, e vc prossegue com a instalação.&lt;br /&gt;&lt;br /&gt;Após instalado, o sistema deverá apresenta a mesma tela com o aviso, que vc não consegue ler, tem que repetir o procedimento para o sistema iniciar. &lt;br /&gt;Dentro do sistema o primeiro passo e ajustar os repositorios, está com um problema no hash MD5 de alguns que vem previamente instalados, ou seja o sistema não vai identificar os drivers:&lt;br /&gt;&lt;br /&gt;Sistema -&gt; Administração -&gt; Canais de Software&lt;br /&gt;&lt;br /&gt;Desmarque a opção do multiverse e coloque a opção baixar de para o servidor principal. Atualize os indices, volte aos canais de Software, e marque o multiverse e coloque para baixar de Servidor no(a) Brasil. Atualize novamente os indices, e agora vc tem os drivers disponiveis para instalar. Pode ser usado tanto os Drivers de Hardware no menu Administração ou na Central de Programas. Baixando e instalando o driver o Ubuntu vai funcionar tranquilamente.&lt;br /&gt;&lt;br /&gt;Agora fico na duvida, por que que o pessoal do ubuntu fez esse favor para nós?&lt;br /&gt;&lt;br /&gt;To com ubuntu 10.04, e aparentemente ta muito bacana, e o boot ta realmente rapido :), vamo que vamo&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4781511741260972168-9206389147219074060?l=blog.rollingwithcode.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.rollingwithcode.com/feeds/9206389147219074060/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4781511741260972168&amp;postID=9206389147219074060&amp;isPopup=true' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4781511741260972168/posts/default/9206389147219074060'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4781511741260972168/posts/default/9206389147219074060'/><link rel='alternate' type='text/html' href='http://blog.rollingwithcode.com/2010/05/ubuntu-1004-e-placa-nvidia.html' title='Ubuntu 10.04 e a placa NVIDIA'/><author><name>Rafael Felix</name><uri>http://www.blogger.com/profile/15945926043992740682</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/_DivtpeF7_5Y/SSP5tBTaJsI/AAAAAAAAATI/84pO0s0CdY0/S220/felix.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4781511741260972168.post-8706859178688422314</id><published>2010-04-23T03:27:00.000-07:00</published><updated>2010-04-23T03:38:43.892-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='glassfish v3'/><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='Swing'/><category scheme='http://www.blogger.com/atom/ns#' term='glassfish'/><category scheme='http://www.blogger.com/atom/ns#' term='pt-br'/><title type='text'>Glassfish v3 EJB e Standalone Client</title><content type='html'>Não sei se muita gente usa isso, mas eu uso, um client swing, para um modulo EJB, recentemente, saiu a versão V3 do glassfish, e lá fui eu tentar comunicar com o container EJB, até a versão v2 as bibliotecas necessarias eram o JavaEE 5, appserv-rt, appserv-deployment, appserv-admin e o appserver-ext, isso devia tar entorno de uns 20MB de bibliotecas.&lt;br /&gt;&lt;br /&gt;Seguindo ao FAQ do Glassfish eu devia adicionar somente o GF-CLIENT no classpath da applicação, um jarzinho de alguns KB, e adivinha, não funcinou, depois de uma extensiva busca não encontrei solução e cheguei a conclusão que, &lt;b&gt;NÃO ACREDITE NO FAQ DO CLASSFISH&lt;/b&gt;. Além desse tal de gf-client, eles aconselham vc a usar o construtor sem argumentos da classe InitialContext, se vc quiser conectar &lt;b&gt;SOMENTE EM LOCALHOST&lt;/b&gt; use o construtor sem argumetos.&lt;br /&gt;&lt;br /&gt;Criei um projeto, adicionei todos os jars do GLASSFISHV3_HOME/glassfish/modules, a conexão funcionou 100%, agora era ver quais jars iriam manter minha conexão ativa, e fui removendo 1 a 1 os jars e testando, chegando finalmente a 6MB de jars (diminui bastante comparado com as versões anteriores), que devem estar no seu classpath, listados abaixo&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;auto-depends&lt;/li&gt;&lt;br /&gt;&lt;li&gt;common-util&lt;/li&gt;&lt;br /&gt;&lt;li&gt;config-api&lt;/li&gt;&lt;br /&gt;&lt;li&gt;config&lt;/li&gt;&lt;br /&gt;&lt;li&gt;config-types&lt;/li&gt;&lt;br /&gt;&lt;li&gt;dol&lt;/li&gt;&lt;br /&gt;&lt;li&gt;deployment-common&lt;/li&gt;&lt;br /&gt;&lt;li&gt;ejb.security&lt;/li&gt;&lt;br /&gt;&lt;li&gt;ejb-container&lt;/li&gt;&lt;br /&gt;&lt;li&gt;glassfish-naming&lt;/li&gt;&lt;br /&gt;&lt;li&gt;glassfish-api&lt;/li&gt;&lt;br /&gt;&lt;li&gt;glassfish-corba-orb&lt;/li&gt;&lt;br /&gt;&lt;li&gt;glassfish-corba-omgapi&lt;/li&gt;&lt;br /&gt;&lt;li&gt;glassfish-corba-orbgeneric&lt;/li&gt;&lt;br /&gt;&lt;li&gt;glassfish-corba-codegen&lt;/li&gt;&lt;br /&gt;&lt;li&gt;glassfish-corba-newtimer&lt;/li&gt;&lt;br /&gt;&lt;li&gt;glassfish-corba-csiv2-idl&lt;/li&gt;&lt;br /&gt;&lt;li&gt;glassfish-corba-asm&lt;/li&gt;&lt;br /&gt;&lt;li&gt;gmbal&lt;/li&gt;&lt;br /&gt;&lt;li&gt;hk2-core&lt;/li&gt;&lt;br /&gt;&lt;li&gt;internal-api&lt;/li&gt;&lt;br /&gt;&lt;li&gt;javax.resource&lt;/li&gt;&lt;br /&gt;&lt;li&gt;java.ejb&lt;/li&gt;&lt;br /&gt;&lt;li&gt;kernel&lt;/li&gt;&lt;br /&gt;&lt;li&gt;management-api&lt;/li&gt;&lt;br /&gt;&lt;li&gt;orb-connector&lt;/li&gt;&lt;br /&gt;&lt;li&gt;orb-iiop&lt;/li&gt;&lt;br /&gt;&lt;li&gt;security&lt;/li&gt;&lt;br /&gt;&lt;li&gt;tiger-types-osgi&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;E nenhum dos gf-QUALQUER_COISA é necessario, essa aplicação está em produção desse modo. Alguns desses jars são encontrados em repositorios maven como tiger-types-osgi, eu optei por adicionar a maioria no repositorio local e esses mesmo para não ter problema.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4781511741260972168-8706859178688422314?l=blog.rollingwithcode.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.rollingwithcode.com/feeds/8706859178688422314/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4781511741260972168&amp;postID=8706859178688422314&amp;isPopup=true' title='2 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4781511741260972168/posts/default/8706859178688422314'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4781511741260972168/posts/default/8706859178688422314'/><link rel='alternate' type='text/html' href='http://blog.rollingwithcode.com/2010/04/glassfish-v3-ejb-e-standalone-client.html' title='Glassfish v3 EJB e Standalone Client'/><author><name>Rafael Felix</name><uri>http://www.blogger.com/profile/15945926043992740682</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/_DivtpeF7_5Y/SSP5tBTaJsI/AAAAAAAAATI/84pO0s0CdY0/S220/felix.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4781511741260972168.post-5341062658440867414</id><published>2010-03-22T16:31:00.000-07:00</published><updated>2010-03-22T16:47:22.964-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><category scheme='http://www.blogger.com/atom/ns#' term='JQuery'/><category scheme='http://www.blogger.com/atom/ns#' term='Ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='Ruby On Rails'/><title type='text'>RJS X Alert Com quebra de linha</title><content type='html'>Mais uma poderosa batalha a ser travada, ahauhhuauha, estou cá eu com meus botões estudando rails, e resolvo por na mensagem de alert de erro os erros que ocorreram quando o objeto foi salvo meu snipet do rjs é algo semelhante a isso (Rails 2.3.4 e JQuery)&lt;br /&gt;&lt;br /&gt;&lt;i&gt;update.rjs&lt;/i&gt;&lt;br /&gt;&lt;pre name="code" class="ruby"&gt;&lt;br /&gt;if flash[:error]&lt;br /&gt;  page &lt;&lt; "alert('#{flash[:error]}')"&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Quando no controller havia uma única mensagem (Erro ao atualizar dados), esse snipet funcionava muito bem, muitos vão dizer que é mais facil usar so page.alert, sim é mais facil, enfim, o código tava assim e pronto ;)&lt;br /&gt;&lt;br /&gt;Qual a solução encontrata para mostrar os erros? Bom percorrer o array de erros e mostrar cada um em uma linha não é? Coisa facil fui lá eu&lt;br /&gt;&lt;br /&gt;&lt;i&gt;controller.rb&lt;/i&gt;&lt;br /&gt;&lt;pre name="code" class="ruby"&gt;&lt;br /&gt;def update&lt;br /&gt;  #Preenche o objeto&lt;br /&gt;  if @objeto.save&lt;br /&gt;    #Não interessa&lt;br /&gt;  else&lt;br /&gt;   msg = "Erro ao atualizar dados \n"&lt;br /&gt;   @objeto.errors.full_messages.each do |error|&lt;br /&gt;    msg += "#{error.to_s}\n"&lt;br /&gt;   end&lt;br /&gt;   flash[:error] = msg&lt;br /&gt;   respond_to&lt;br /&gt;end&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Muito simples né, e adivinha que me apareceu no alert?&lt;br /&gt;&lt;br /&gt;"Erro ao atualizar dados \n Data não pode ser vazio\n"&lt;br /&gt;&lt;br /&gt;sim os "\n" apareceram no alert se mudar para o &lt;br /&gt; aparece no meio o &lt;br /&gt;, eu tava quase querendo joga pela janela o PC, eis que eu resolvo recorrer ao nosso grande &lt;a href="http://www.google.com" target="_blank"&gt;oraculo&lt;/a&gt; e encontrei um post de &lt;a href="http://house9-code-samples.blogspot.com/2007/10/rails-rjs-and-newline-characters.html" target="_blank"&gt;um caboclo falando a solução&lt;/a&gt;, pois ele passou por esse mesmo problema, e se vcs olharem o post do blog foi la em 2007 :(, só fazem 3 anos ahauuhauhah, resumindo, o que deve ser feito é criar um metodo na classe helper&lt;br /&gt;&lt;br /&gt;&lt;i&gt;helper.rb&lt;/i&gt;&lt;br /&gt;&lt;pre name="code" class="ruby"&gt;&lt;br /&gt;def get_alert_error_message&lt;br /&gt;  msg = "Erro ao atualizar dados \n"&lt;br /&gt;   @objeto.errors.full_messages.each do |error|&lt;br /&gt;    msg += "#{error.to_s}\n"&lt;br /&gt;   end&lt;br /&gt;  return msg&lt;br /&gt;end&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Reparem o código é exatamente igual&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;i&gt;update.rjs&lt;/i&gt;&lt;br /&gt;&lt;pre name="code" class="ruby"&gt;&lt;br /&gt;if @error&lt;br /&gt;  page.alert "#{get_alert_error_message}"&lt;br /&gt;end&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;E acreditem, exatamente o mesmo código, funcionou da forma que eu queria :), pra quem não consegue imaginar, a variavel @error foi criada para indicar quando ocorreu um erro no RJS, para imprimir esse alerta só se ocorreu um erro.&lt;br /&gt;&lt;br /&gt;PS: Esse post além de compartilhar essa informação, é pra eu me lembrar futuramente disso ai.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4781511741260972168-5341062658440867414?l=blog.rollingwithcode.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.rollingwithcode.com/feeds/5341062658440867414/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4781511741260972168&amp;postID=5341062658440867414&amp;isPopup=true' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4781511741260972168/posts/default/5341062658440867414'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4781511741260972168/posts/default/5341062658440867414'/><link rel='alternate' type='text/html' href='http://blog.rollingwithcode.com/2010/03/rjs-x-alert-com-quebra-de-linha.html' title='RJS X Alert Com quebra de linha'/><author><name>Rafael Felix</name><uri>http://www.blogger.com/profile/15945926043992740682</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/_DivtpeF7_5Y/SSP5tBTaJsI/AAAAAAAAATI/84pO0s0CdY0/S220/felix.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4781511741260972168.post-6413762010438802592</id><published>2010-03-15T10:18:00.000-07:00</published><updated>2010-03-15T10:45:20.982-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='IReport'/><title type='text'>IReport 3.7.X - A Saga</title><content type='html'>Num sei vcs, mas tivemos diversos problemas com as versões do ireport pós 3.0, EJBQL Connection não funcionava, e ninguem sabia como resolver, cheguei a cirar 2 threads no Forum do JasperForge e ambas sem resposta, no final, ficamos com o IReport 3.0, a versão funcionava bem, apesar da interface ser meio bugada (algumas janelas eram fechadas e sumiam misteriosamente).&lt;br /&gt;&lt;br /&gt;Sempre gostamos de ter nossas bibliotecas atualizadas, saiu um novo release lá estamos nós atualizando, e resolvemos testar as novas versões do IReport, porém nenhuma delas funcionava com EJB Connection, e existia um maldito EJBCascadingStyle, que a única coisa que pesquisando encontrei, foi referencia errada da versão do Hibernate. E eu atualizando os jar no diretorio ext no IReport e o erro persistia, então navegando encontrei uma solução, aparentemente, era copiar os jars principais do meu projeto no diretorio IREPORT_HOME/plataform9/lib&lt;br /&gt;&lt;br /&gt;Realmente conectou usando EJB Connection, porém uma lesma ganharia na velocidade, o IReport ficou intrabalhavel, não conseguia editar um jasper qualquer quem diria criar um novo. Abandonamos e voltamos para a versão 3.0.&lt;br /&gt;&lt;br /&gt;Buscando agora encontrei um &lt;a href="http://jasperforge.org/plugins/espforum/view.php?group_id=83&amp;forumid=101&amp;topicid=58817" target="_blank"&gt;topico&lt;/a&gt; realmente interessante, e esse sim fez o IReport funcionar. &lt;br /&gt;Resumindo oq vc precisa é ir ao diretorio IREPORT_HOME/ireport/modules/ext&lt;br /&gt;&lt;br /&gt;e &lt;b&gt;REMOVER&lt;/b&gt; as libs ehcache, hibernate3, hibernate-annotations, hibernate-commons-annotations e jpa&lt;br /&gt;&lt;br /&gt;e adicionar esses jar do seu projeto :D, assim funciona, agora encontrei um NullPointer na hora de editar a query, quem sabe até amanha eu consiga usar essa nova versão :P&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4781511741260972168-6413762010438802592?l=blog.rollingwithcode.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.rollingwithcode.com/feeds/6413762010438802592/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4781511741260972168&amp;postID=6413762010438802592&amp;isPopup=true' title='2 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4781511741260972168/posts/default/6413762010438802592'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4781511741260972168/posts/default/6413762010438802592'/><link rel='alternate' type='text/html' href='http://blog.rollingwithcode.com/2010/03/ireport-37x-saga.html' title='IReport 3.7.X - A Saga'/><author><name>Rafael Felix</name><uri>http://www.blogger.com/profile/15945926043992740682</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/_DivtpeF7_5Y/SSP5tBTaJsI/AAAAAAAAATI/84pO0s0CdY0/S220/felix.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4781511741260972168.post-2124207214874762711</id><published>2010-02-09T01:34:00.000-08:00</published><updated>2010-02-09T01:46:08.465-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='EJB'/><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='JPA'/><title type='text'>O conto do merge, persist e do No Transaction</title><content type='html'>Era uma vez...&lt;br /&gt;&lt;br /&gt;Ehehhe, brincadeiras a parte, esses tempos tive um pequeno problema com uma certa demora usando JPA em um modulo EJB.&lt;br /&gt;&lt;br /&gt;Tive de fazer a rotina de leitura de um arquivo texto e importar os registros para o sistema. até ai sem problemas, fiz a rotina e ela rodava em menos de 5s e importava todos os registros. Porém os registros que vinham no arquivo não atendiam a modelagem do sistema, ou seja, teria que inserir nas outras tabelas caso não existisse.&lt;br /&gt;&lt;br /&gt;feita as Querys para encontrar o registro, e caso não existisse criar um novo, do nada ele demorou aproximadamento 6hrs e ao final la pela 1h30min da manhã uma execessão de No Transaction Active foi lançada em um flush no Entity Manager.&lt;br /&gt;&lt;br /&gt;Lá fui eu aplicar algums caches de memoria para diminuir as consultas ao banco e os salvamentos. resolvemos mudar alguns merges para persist pois seguindo o que o pessoal fala, o persist é somente para objetos novos e é muito mais rapido. &lt;br /&gt;&lt;br /&gt;Pois é não foi. Os objetos usando persist se tornaram pesados, e o procedimento ficou pesado, interrompido em 30min de execução tendo percorrido somente 200 registros (o arquivo possuia 30k). Removi o persist e deixei tudo como merge, mais uma vez uma No Transaction lá pelo registro 3mil é lançada. mais por que existe transação até o 2999. Eis que me dizem, põe um clear no começo do loop.&lt;br /&gt;&lt;br /&gt;Galera, nunca vi o treco ir tão rápido ehhehe. Todo o gargalo de processamento se foi e o procedimento rodou em 5min.&lt;br /&gt;&lt;br /&gt;Pra quem já teve esse problema não esqueça, o clear é muito importante :)&lt;br /&gt;&lt;br /&gt;Aproveitando que estou falando sobre JPA e EJB...&lt;br /&gt;Estavamos também com um problema ao salvar (merge) alguns objetos, a performance muito baixa, levava quase 2min para salvar o objeto, isso pos a chamada do em.merge.&lt;br /&gt;&lt;br /&gt;Fiz varios testes, inclusive usando o clear, porém não deu em nada, resolvi arriscar, o problema estava nos objetos que eram atualizados e vinham do cliente, ou seja, estavam foram do contexto do EJB e do entity manager. Não sei se isso é gambiarra ou não, mas a performance melhorou drasticamente caindo para 2s.&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;primeiro passo eu recupero o objeto usando o em.find.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;depois atribuo a esse objeto recuperado o objeto passado como parametro&lt;/li&gt;&lt;br /&gt;&lt;li&gt;dai só fazer o merge&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;Simples e pratico não :)&lt;br /&gt;&lt;br /&gt;Espero que isso seja de ajuda para mais alguém. Até a próxima&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4781511741260972168-2124207214874762711?l=blog.rollingwithcode.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.rollingwithcode.com/feeds/2124207214874762711/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4781511741260972168&amp;postID=2124207214874762711&amp;isPopup=true' title='2 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4781511741260972168/posts/default/2124207214874762711'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4781511741260972168/posts/default/2124207214874762711'/><link rel='alternate' type='text/html' href='http://blog.rollingwithcode.com/2010/02/o-conto-do-merge-persist-e-do-no.html' title='O conto do merge, persist e do No Transaction'/><author><name>Rafael Felix</name><uri>http://www.blogger.com/profile/15945926043992740682</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/_DivtpeF7_5Y/SSP5tBTaJsI/AAAAAAAAATI/84pO0s0CdY0/S220/felix.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4781511741260972168.post-8349036042436065439</id><published>2010-01-26T01:28:00.000-08:00</published><updated>2010-01-26T01:30:22.208-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='bla bla bla'/><title type='text'>Especialista – Sim ou Não?</title><content type='html'>&lt;p&gt;Um especialista é alguém com anos de pratica no seu serviço. Antigamente era algo muito comum, vide o filme Tempos Modernos de Charles Chaplin, ele era um especialista, em apertar parafusos, no final das contas, um especialista nada mais é do que alguém que passou a vida inteira fazendo a mesma coisa e no final não sabe fazer nada alem do que ele é especializado.&lt;/p&gt;  &lt;p&gt;É comum eu ouvir muitas criticas, do tipo, você conhece um pouco de varias linguagens mais não conhece nenhuma muito bem. Na verdade o que eu não quero é ser dependente de uma única linguagem, digamos que sou especialista em Java (o que não é verdade), se um dia o Java morresse? Se um dia não existisse mais? O que eu faria?&lt;/p&gt;  &lt;p&gt;Provavelmente não iria trocar de área, porém ia ter que me sujeitar a um cargo inferior ao meu para trabalhar com uma linguagem mais nova que eu ainda teria que aprender. Quando se tem uma base, é muito mais simples de evoluir na nova linguagem, você tem um conhecimento básico, e na área de T.I. onde existem mudanças frequentemente, você tem que estar apto a elas, e preparado. A especialização pelo menos na nossa área é passado, você não pode se ater a uma tecnologia, pois ele pode morrer amanha. &lt;/p&gt;  &lt;p&gt;Por esses motivos prefiro sempre estar aprendendo, sempre atrás de coisas novas que me tornem um profissional melhor e mais apto.&lt;/p&gt;  &lt;p&gt;Desculpem a demora por um novo post =).&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4781511741260972168-8349036042436065439?l=blog.rollingwithcode.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.rollingwithcode.com/feeds/8349036042436065439/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4781511741260972168&amp;postID=8349036042436065439&amp;isPopup=true' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4781511741260972168/posts/default/8349036042436065439'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4781511741260972168/posts/default/8349036042436065439'/><link rel='alternate' type='text/html' href='http://blog.rollingwithcode.com/2010/01/especialista-sim-ou-nao.html' title='Especialista – Sim ou Não?'/><author><name>Rafael Felix</name><uri>http://www.blogger.com/profile/15945926043992740682</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/_DivtpeF7_5Y/SSP5tBTaJsI/AAAAAAAAATI/84pO0s0CdY0/S220/felix.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4781511741260972168.post-133066824129194103</id><published>2009-11-24T14:10:00.000-08:00</published><updated>2009-11-24T14:26:55.080-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Bespin'/><title type='text'>Uma IDE na Nuvem</title><content type='html'>A algum tempo atrás eu estava imaginando como seria uma IDE (ou editor de texto se preferir) usando cloud computing, fiquei imaginando como isso funcionaria e como seria agregado as empresas. A algum tempo atraz ouvi falar no Heroku Garden, uma IDE para desenvolvimento na nuvem para RoR, porém aparentemente o projeto foi abandonado. Esses dias olhando no forum do RubyOnBr, um cara comenta de um tal de Bespin, e eu resolvi procurar, eis que me surge o &lt;a href="https://mozillalabs.com/bespin/" target="_blank"&gt;Mozilla Bespin&lt;/a&gt;, me registei e começei a brincar, achei o projeto promissor, vc pode criar projetos onde ele lista, vc tem uma linha de comando para utilizar, porém só funciona HTML, tentei usar PHP, Ruby, Java, e infelizmente a IDE ainda está engatinhando, o suporte é bem limitado, mas a interface gráfica é atraente.&lt;br /&gt;&lt;br /&gt;Busquei os fontes do projeto e encontrei dois repositorios Mercurial, um para o server-side e um para o client-side, basicamente o backend do projeto roda em python e Java, e o front-end é uma mistura de JavaScript e JSON usando Prototype (pelo menos é parecido), para gerenciar as informações e enviar para o servidor.&lt;br /&gt;&lt;br /&gt;baixei ambos os fontes, e estou ainda analisando, o servidor roda usando o virtualenv do python, ou seja emula uma maquina para que possa ser usado o servidor, infelizmente o README é precario quando a instalação, eu que sou leigo no virtualenv, apanhei um pouco até descobrir o easy_install para instalar as dependencias do projeto, ainda estou tentando por a IDE rodar na minha máquina. E acredito que valha a pena dar uma olhadinha no Bespin, mesmo que não haja muito o que fazer.&lt;br /&gt;&lt;br /&gt;Parece que temos um projeto interessante saindo do forno.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4781511741260972168-133066824129194103?l=blog.rollingwithcode.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.rollingwithcode.com/feeds/133066824129194103/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4781511741260972168&amp;postID=133066824129194103&amp;isPopup=true' title='2 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4781511741260972168/posts/default/133066824129194103'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4781511741260972168/posts/default/133066824129194103'/><link rel='alternate' type='text/html' href='http://blog.rollingwithcode.com/2009/11/uma-ide-na-nuvem.html' title='Uma IDE na Nuvem'/><author><name>Rafael Felix</name><uri>http://www.blogger.com/profile/15945926043992740682</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/_DivtpeF7_5Y/SSP5tBTaJsI/AAAAAAAAATI/84pO0s0CdY0/S220/felix.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4781511741260972168.post-5942986147690392932</id><published>2009-11-17T15:28:00.001-08:00</published><updated>2009-11-17T15:53:54.117-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='bla bla bla'/><title type='text'>Objetopolis</title><content type='html'>Bem Vindo a Objetopolis.&lt;br /&gt;&lt;br /&gt;Assim começa o segundo capitulo do livro Java! Use a Cabeça (Se não for também não interessa :P), copiei esse termo do livro, simplemente para ressaltar o que quero dizer.&lt;br /&gt;&lt;br /&gt;Existem alguns que dizem que controlar o fluxo da informaçã com IFs é uma quebra ao paradigma orientado a objeto, porém nem todos os casos existe a necessidade de criar uma Interface e/ou ENUM para contornar IFs, salvo em alguns casos. Muitas vezes o excesso de abstrações para forçar/evitar o uso de algumas estruturas de controle ditas não-oo podem tornar o código menos legivel. Eu acredito que a beleza do codigo é grande parte da beleza de um sistema, concerteza um sistema bem escrito será um sistema que conterá a integração continua, e nenhum desenvolvedor que chegar até o sistema vai abandona-lo.&lt;br /&gt;&lt;br /&gt;O que eu defendo quando se escreve um software é, pense em como vc vai ler isso aqui daqui a alguns meses, normalmente 1 mês basta para termos vontade de excluir todos os nossos codigos e reafaze-los aplicando novas tecnicas e funções, isso não é regra, mas como qualquer desenvolvedor que se preze está sempre em constante evolução seu novo conhecimento pode melhorar ou ajudar a escrever o codigo de forma mais elegante.&lt;br /&gt;&lt;br /&gt;Apesar de tudo que eu disse sobre os IFs, eu não gosto de usa-los, acredito que deixa o código "tosco", existem situações em que ele é necessário. Muitos ifs podem ser evitados como por exemplo:&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="java"&gt;&lt;br /&gt;if( c == 0){&lt;br /&gt;   return true;&lt;br /&gt;}else{&lt;br /&gt;   return false;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;esse código é facimelmente convertido em uma linha:&lt;br /&gt;&lt;pre name="code" class="java"&gt;&lt;br /&gt;return c == 0;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Em alguns casos o operador ternário tbm pode ser muito bem empregado, aumentado a legibilidade do código, lembre-se um sistema não é mais definido por linhas de código :D&lt;br /&gt;&lt;br /&gt;Algo que eu gosto muito de fazer e usar um pouco de reflection, atrelado a um HasMap, com simples linhas de código temos um código mais legivel, como por exemplo, no item abaixo, abre-se uma determinada tela de um sistema utilizando esse recuro.&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="java"&gt;&lt;br /&gt;class Controller implements ActionListener{&lt;br /&gt;   private Map&lt;JButton, Class&lt;?&gt;&gt; botoes = new HashMap&lt;JButton, Class&lt;?&gt;&gt;();&lt;br /&gt;&lt;br /&gt;   public void actionPerformed(ActionEvent e){&lt;br /&gt;          Class tela = botoes.get((JButton) e.getSource());&lt;br /&gt;          if(tela != null){&lt;br /&gt;                criaTela(tela);//Cria a tela para ser mostrada&lt;br /&gt;          }else{&lt;br /&gt;               raiseErro("Tela não encontrada!"); //monstra erro na tela&lt;br /&gt;          }&lt;br /&gt;   }&lt;br /&gt;    public void registraBotao(JButton botao, Class&lt;?&gt; tela){&lt;br /&gt;          botoes.put(botao, tela);&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;voila, temos um código limpo e facil de ser explicado, não existe problema em ler esse codigo, ele é completamente intuitivo, um único if, e um pouco de dinamismo, e lhes apresento um Controller desvinculado a uma tela. e se adiconar um botão não existe necessidade de criar um novo actionListener para abrir uma tela. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;PS: esses exemplos foram criados a mão, aqui no blog, as chances disso não compilar são grandes, é meramente ilustrativo&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Por isso que ressalto, muitas vezes para usarmos objetos, sempre que existe uma necessidade, cada objeto deve ter suas funções bem definidas, como li um dia o Sergio Taborda disse, se um objeto é somente para ser um apunhado de atributos com getters e setters que seja, desde que ele tenha sua funcionalidade bem definida. &lt;br /&gt;&lt;br /&gt;Viajei nesse post, começei criticando algo que eu faço pra defenter o uso de objetos sempre hehhe.&lt;br /&gt;&lt;br /&gt;Só mais um detalhe&lt;br /&gt;&lt;b&gt; Esqueçam os tipos primitivos, utilizem os wrappers&lt;/b&gt; A perca de performance é minima, e vc trabalha em um nivel superior aos tipos primitivos.&lt;br /&gt;&lt;br /&gt;isso aí povo até mais.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4781511741260972168-5942986147690392932?l=blog.rollingwithcode.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.rollingwithcode.com/feeds/5942986147690392932/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4781511741260972168&amp;postID=5942986147690392932&amp;isPopup=true' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4781511741260972168/posts/default/5942986147690392932'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4781511741260972168/posts/default/5942986147690392932'/><link rel='alternate' type='text/html' href='http://blog.rollingwithcode.com/2009/11/objetopolis.html' title='Objetopolis'/><author><name>Rafael Felix</name><uri>http://www.blogger.com/profile/15945926043992740682</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/_DivtpeF7_5Y/SSP5tBTaJsI/AAAAAAAAATI/84pO0s0CdY0/S220/felix.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4781511741260972168.post-2702158327801763740</id><published>2009-10-19T15:33:00.000-07:00</published><updated>2009-10-21T02:30:25.769-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='RSpec'/><category scheme='http://www.blogger.com/atom/ns#' term='Ruby On Rails'/><title type='text'>Um poco de RSpec</title><content type='html'>Estou focando um pouco dos meus estudos em RSpec e BDD, e é incrivel como existe pouco material em portugues sobre o RSpec, então, esse é um post rapido explicando como se validar algumas propriedades dos seus modelos no Rails usando RSpec.&lt;br /&gt;&lt;br /&gt;&lt;b&gt; PS: Estou utilizando I18n do Rails para a versão que eu traduzi do rails. seus erros podem estar na versão não traduzida, então o ideal é cuidar, pois seus testes podem não passar. &lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Validação um campo que deve ser informado.&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="ruby"&gt;&lt;br /&gt;#Imagine que User é uma classe de usuário qualquer&lt;br /&gt;describe User do&lt;br /&gt;  it "should be have an login" do&lt;br /&gt;     @user = User.new&lt;br /&gt;     @user.save&lt;br /&gt;     @user.errors.on(:login).should be_eql("não pode ser em branco")#substitua essa string por seu texto customizado ou pela mensagem padrão em inglês&lt;br /&gt;  end&lt;br /&gt;end&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Esse codigo simula a gravação de uma entidade, e verifica se existe o erro. lembrando que você deve adicionar na classe user:&lt;br /&gt;&lt;pre name="code" class="ruby"&gt;&lt;br /&gt;class User &lt; ActiveRecord::Base&lt;br /&gt;  validates_presence_of :login&lt;br /&gt;end&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;validando um número&lt;br /&gt;&lt;pre name="code" class="ruby"&gt;&lt;br /&gt;#classe user.rb&lt;br /&gt;validates_numericality_of :age, :only_integer =&gt; true&lt;br /&gt;#user_spec.rb&lt;br /&gt;it "should be have a valid number for age" do&lt;br /&gt;  @user.age = "a"&lt;br /&gt;  @user.save&lt;br /&gt;  @user.errors.on(:age).should be_eql("não é um número")&lt;br /&gt;end&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Validanto tamanho de um campo&lt;br /&gt;&lt;pre name="code" class="ruby"&gt;&lt;br /&gt;it "should be invalid when the name is greater than 100" do&lt;br /&gt;  @user.name = "a"*101&lt;br /&gt;  @user.save&lt;br /&gt;  @user.errors.on(:name).should be_eql("é muito grande (máximo é 100 caracteres)")&lt;br /&gt;end&lt;br /&gt;#user.rb&lt;br /&gt;validates_length_of :name, :maximum =&gt; 100&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;3 validações básicas para quem ta começando a mexer com o RSpec, não é lá grandes coisas, mas pode ajudar iniciantes em RoR a praticar o BDD.&lt;br /&gt;&lt;br /&gt;[]'s&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4781511741260972168-2702158327801763740?l=blog.rollingwithcode.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.rollingwithcode.com/feeds/2702158327801763740/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4781511741260972168&amp;postID=2702158327801763740&amp;isPopup=true' title='8 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4781511741260972168/posts/default/2702158327801763740'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4781511741260972168/posts/default/2702158327801763740'/><link rel='alternate' type='text/html' href='http://blog.rollingwithcode.com/2009/10/um-poco-de-rspec.html' title='Um poco de RSpec'/><author><name>Rafael Felix</name><uri>http://www.blogger.com/profile/15945926043992740682</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/_DivtpeF7_5Y/SSP5tBTaJsI/AAAAAAAAATI/84pO0s0CdY0/S220/felix.jpg'/></author><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4781511741260972168.post-5360975211312925629</id><published>2009-09-29T14:19:00.000-07:00</published><updated>2009-09-29T14:20:48.182-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='Ruby On Rails'/><title type='text'>Rails - Editando o CSS do seu formário uma unica vez</title><content type='html'>Acredito que todo o desenvolvedor tenha alguns problemas com CSS, ou de esquecer um maldito campo, e ele ficar sem o layout, muitas vezes, todos os campos são renderizados de maneira diferente, de acordo com a definição do designer, ou da equipe.&lt;br /&gt;Normalmente o saco, é por exemplo em rails criar um form da seguinte maneira&lt;br /&gt;&lt;pre name="code" class="ruby"&gt;&lt;br /&gt;- form_for(@foo) do |f|&lt;br /&gt;  %p= f.error_messages&lt;br /&gt;  %table&lt;br /&gt;    %tr&lt;br /&gt;      %td= f.label 'Nome:'&lt;br /&gt;      %td= f.text_field :name, :class =&gt; :atext_field&lt;br /&gt;    %tr&lt;br /&gt;      %td= f.label 'Descrição:'&lt;br /&gt;      %td= f.text_area :description, :class =&gt; :atext_area&lt;br /&gt;    %tr&lt;br /&gt;       %td= f.submit 'Salvar'&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;PS: Esse código foi escrito em HAML. é bem simples modifica-lo para ERB. &lt;br /&gt;O que vemos é que existem dois campos com a tag :class, que indica a classe do componente para o Rails renderizar na tela. Eis que nessa tela imagine mais uns 10 text_field, e outras páginas de cadastro com quantidades semelhantes de campos. Ai o desgraçado do design resolve mudar o layout (não me levem a mal designer, muitas vezes vocês nos dão raiva mesmo, :D), e para mander compatibilidade ele cria outras tags, e la veio no minimo meio dia de serviço para ajustar esses campos ai para o nova classe (por ex: btext_field).&lt;br /&gt;&lt;br /&gt;Mas vamos relembrar um conceito simples do Ruby as classes abertas. Nessa situação é um modulo (module), que gerencia os forms, o querido ActionView::Helpers::FormTagHelper.&lt;br /&gt;Ele é o responsavel por renderizar esses objetos. agora basta simplesmente você alterar esse modulo, veja como fazer (editei no meu environment.rb, como ele não é recarregado tem que para o servidor e iniciar novamente, vocês podem fazer esse código em qualquer lugar)&lt;br /&gt;&lt;pre name="code" class="ruby"&gt;&lt;br /&gt;module ActionView&lt;br /&gt;  module Helpers&lt;br /&gt;    module FormTagHelper&lt;br /&gt;      def text_field(object_name, method, options={})&lt;br /&gt;        super object_name, method, options.merge(:class =&gt; :btext_field)&lt;br /&gt;      end&lt;br /&gt;      def text_area(object_name, method, options={})&lt;br /&gt;        super object_name, method, options.merge(:class =&gt; :btext_area)&lt;br /&gt;      end&lt;br /&gt;      def check_box(object_name, method, options={}, checked_value="1", unchecked_value = "0")&lt;br /&gt;        super object_name, method, options.merge(:class =&gt; :bcheck_box), checked_value, unchecked_value&lt;br /&gt;      end&lt;br /&gt;    end&lt;br /&gt;  end&lt;br /&gt;end&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Caso não conheça o metodo merge dos hash do ruby, seria interessante conhece-lo, dessa maneira, não existe mais a necessidade de definir o atributo :class em cada text_field, essa alteração coloca automáticamente essa informação disponivel. Existem coisa que o ruby faz que surpreendem :D.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4781511741260972168-5360975211312925629?l=blog.rollingwithcode.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.rollingwithcode.com/feeds/5360975211312925629/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4781511741260972168&amp;postID=5360975211312925629&amp;isPopup=true' title='1 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4781511741260972168/posts/default/5360975211312925629'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4781511741260972168/posts/default/5360975211312925629'/><link rel='alternate' type='text/html' href='http://blog.rollingwithcode.com/2009/09/rails-editando-o-css-do-seu-formario.html' title='Rails - Editando o CSS do seu formário uma unica vez'/><author><name>Rafael Felix</name><uri>http://www.blogger.com/profile/15945926043992740682</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/_DivtpeF7_5Y/SSP5tBTaJsI/AAAAAAAAATI/84pO0s0CdY0/S220/felix.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4781511741260972168.post-5008806032168961730</id><published>2009-08-24T10:05:00.000-07:00</published><updated>2009-08-24T10:09:01.419-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><title type='text'>Perf4j - Analise de performance em Java</title><content type='html'>Acredito que a maioria dos desenvolvedores ao menos uma vez mediu o tempo de execução de um método na aplicação. Para quem como eu meche com Java, muitas vezes recorremos ao System.currentTimeMillis():&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="java"&gt;&lt;br /&gt; Long agora = System.currentTimeMillis();&lt;br /&gt; //Algum método demorado&lt;br /&gt; System.out.println((System.currentTimeMillis()-agora)+"ms");&lt;br /&gt;&lt;/pre&gt; &lt;br /&gt;&lt;br /&gt;A saída desse código é o tempo de execução em milisegundos, bem simples, já é algo ilustrativo para medir o desempenho da aplicação, porém muitas vezes isso não tem todas as informações que gostaríamos de ter.&lt;br /&gt;Eis que algum louco inventou um tal de &lt;a href="http://perf4j.codehaus.org/" target="_blank"&gt;perf4j&lt;/a&gt;, uma biblioteca parecida com o log4j, mas voltada para medir a performance da aplicação (O log4j é uma biblioteca de log). Através do perf4j, é possível até gerar gráficos de desempenho, e ele também mostra o tempo médio de execução dos métodos durante a execução.&lt;br /&gt;Vou mostra uma maneira simples de se usar o perf4j mesclado com o Java Logging API, assim podemos salvar os resultados da performance em um arquivo e lê-los quando precisarmos.&lt;br /&gt;O perf4j funciona baseado na classe StopWatch, e apartir dela podemos gerar as nossas estatísticas. Inicialmente o código vai ficar maior porém os dados que podemos conseguir em cima disso são bem maiores.&lt;br /&gt;&lt;br /&gt;OBS: Já tive problemas com essa manipulação de arquivos e locks do Sistema operacional, quando estamos trabalhando com arquivos, o ideal é sincronizar e tornar a leitura do arquivo Thread Safe&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="java"&gt;&lt;br /&gt;String arquivo = "statistics.log";//nome do arquivo que será armazena as estatisticas&lt;br /&gt;Logger logger = Logger.getLogger("com.rollingwithcode");//Qualquer pacote serve.&lt;br /&gt;logger.addHandler(new FileHandler(arquivo));//adiciona ao log o arquivo como handler, a Java Logging API, usa esse arquivo para armazenar o log.&lt;br /&gt;StopWatch stop = new JavaLogStopWatch("Teste", logger);//o primeiro argumento é o nome ilustrativo desse log, cada método deve ter seu próprio nome, assim se torna mais intuitivo e mais especifico quando se lê o arquivo.&lt;br /&gt;//Aqui vem alguma execução que pode ser demorada.&lt;br /&gt;stop.stop();&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Após a execução da ultima linha algo como:&lt;br /&gt;&lt;i&gt;24/08/2009 13:43:32 org.perf4j.javalog.JavaLogStopWatch log&lt;br /&gt;INFO: start[1251132212406] time[406] tag[Teste] &lt;/i&gt;&lt;br /&gt;Deverá ser exibido na console. Essa saída é até menos legível que a do System.currentTimeMillis(), porém o poder do per4j será mostrado a seguir.&lt;br /&gt;&lt;br /&gt;Vamos ler o arquivo de log gerado, seria interessante executar mais alguns métodos para armazenar no log, o per4j trabalha com uma classe chamada LogParser para gerar estatísticas em cima do arquivo de log gerado (statistics.log).&lt;br /&gt;&lt;pre name="code" class="java"&gt;&lt;br /&gt;String arquivo = "statistics.log";&lt;br /&gt;String temp = "lido.log";//Arquivo temporário, os dados são jogados do statistics para esse outro arquivo de log.&lt;br /&gt;LogParser parser = new LogParser(new BufferedReader(new FileReader(arquivo)),&lt;br /&gt;                        new PrintStream(new FileOutputStream(temp), true), null, 30000L, false,&lt;br /&gt;                        new GroupedTimingStatisticsTextFormatter());&lt;br /&gt;parser.parseLog();&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;A criação do &lt;i&gt;LogParser&lt;/i&gt; é simples, primeiro argumento é o arquivo de log que geramos através do &lt;i&gt;StopWatch&lt;/i&gt;, o segundo é o arquivo temporário a ser salvo, o terceiro parâmetro (null) é utilizado para gráficos, os outros dois parametros não vem ao caso agora, o ultimo parâmetro é o formatador do arquivo temporário, define o layout do arquivo.&lt;br /&gt;&lt;br /&gt;O método parseLog faz a leitura do arquivo. Agora basta você ver o arquivo lido.log e termos o arquivo legível trazendo a media de tempo de execução do arquivo (Avg), o tempo mínimo (Min), o tempo máximo (Max), a quantidade de vezes que o método foi chamado (Count). Agora sim as informações são bem maiores não acham?&lt;br /&gt;&lt;br /&gt;Aconselho o uso do perf4j, excelente ferramenta para analise de performance em Java.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4781511741260972168-5008806032168961730?l=blog.rollingwithcode.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.rollingwithcode.com/feeds/5008806032168961730/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4781511741260972168&amp;postID=5008806032168961730&amp;isPopup=true' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4781511741260972168/posts/default/5008806032168961730'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4781511741260972168/posts/default/5008806032168961730'/><link rel='alternate' type='text/html' href='http://blog.rollingwithcode.com/2009/08/perf4j-analise-de-performance-em-java.html' title='Perf4j - Analise de performance em Java'/><author><name>Rafael Felix</name><uri>http://www.blogger.com/profile/15945926043992740682</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/_DivtpeF7_5Y/SSP5tBTaJsI/AAAAAAAAATI/84pO0s0CdY0/S220/felix.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4781511741260972168.post-7052625905711902611</id><published>2009-08-10T09:14:00.000-07:00</published><updated>2009-08-10T09:15:25.080-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='bla bla bla'/><title type='text'>.COM</title><content type='html'>Agora o Blog é .COM :)&lt;br /&gt;&lt;br /&gt;Continua sendo hospedado no blogger, mas para acessar ficou mais facil&lt;br /&gt;&lt;br /&gt;&lt;a href="http://rollingwithcode.com"&gt;RollingWithCode.com&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Esse post é só pra falar isso outra hora posto algo util :)&lt;br /&gt;&lt;br /&gt;[]'s&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4781511741260972168-7052625905711902611?l=blog.rollingwithcode.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.rollingwithcode.com/feeds/7052625905711902611/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4781511741260972168&amp;postID=7052625905711902611&amp;isPopup=true' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4781511741260972168/posts/default/7052625905711902611'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4781511741260972168/posts/default/7052625905711902611'/><link rel='alternate' type='text/html' href='http://blog.rollingwithcode.com/2009/08/com.html' title='.COM'/><author><name>Rafael Felix</name><uri>http://www.blogger.com/profile/15945926043992740682</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/_DivtpeF7_5Y/SSP5tBTaJsI/AAAAAAAAATI/84pO0s0CdY0/S220/felix.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4781511741260972168.post-4982994634413557496</id><published>2009-07-31T03:33:00.000-07:00</published><updated>2009-07-31T03:40:54.703-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JRuby'/><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='ScripEngine'/><category scheme='http://www.blogger.com/atom/ns#' term='Ruby'/><title type='text'>Java ScriptEngine</title><content type='html'>Estava eu pensando esses dias, se posso executar código java via Jruby por que não o contrário? Quais as minhas chances de usar Jruby dentro do Java?&lt;br /&gt;Então la fui eu ao oraculo, e começei a buscar, ouvi falar de um JSR XXX (preencha com o número que quiser, nunca me lembro desses números, que pra mim são irrelevantes), que define o Java ScriptEngine, que nada mais é do que usar scripts dentro do Java, no Java 6, já vem com superte a Rhino (JavaScript), embutido, mas exemplos usando JavaScript tem de monte, vou lhes mostrar como instanciar uma classe via JRuby e chamar alguns metodos dessa classe no java. Não vou dizer que isso vai ficar bom, mas enfim, quem sabe melhorem futuramente essas engines, Mesmo assim você não precisa massacrar seu codigo java para migra-lo para JRuby, pode simplemente adaptar o codigo do JRuby no Java. Vamos ao exemplo, primeiramente vejamos quais nossas engines disponiveis na nossa versão.&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="java"&gt;&lt;br /&gt;import javax.script.ScriptEngineFactory;&lt;br /&gt;import javax.script.ScriptEngineManager;&lt;br /&gt;&lt;br /&gt;public class Main {&lt;br /&gt;&lt;br /&gt;    public static void main(String[] args) throws Exception{&lt;br /&gt;        ScriptEngineManager manager = new ScriptEngineManager();&lt;br /&gt;        for(ScriptEngineFactory factory : manager.getEngineFactories()){&lt;br /&gt;            System.out.println(factory.getEngineName());&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;A saida deve ser Mozilla Rhino, lembre-se java 6, eu não tenho bem certeza, mas acho que o ScriptEngine está disponivel na versão 5, porém sem nenhuma engine disponivel.&lt;br /&gt;E ai tio e agora como que nos faz?&lt;br /&gt;Vamos adicionar o Jruby, no site &lt;a href="https://scripting.dev.java.net/" target="_blank"&gt;do projeto&lt;/a&gt; baixem os script-engines, com isso temos as libs de diversas linguagens suportadas que podemos utilizar, para nos interessa, o que esta dentro da pasta jruby/build, o jruby-engine.jar deve ser adicionado ao seu classpath, ainda existem outro jar a ser adicionado, se você olhar outros tutoriais, ele vai passar diversos jar que não estão mais no $JRUBY_HOME/lib, ignore :), adicione ao classpath do seu projeto somente o jruby.jar, e agora sim. Se executar o programinha de antes deve aparecer agora&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;Mozilla Rhino&lt;br /&gt;Jruby Engine&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Vamos para o nosso querido Hello World (eu sei, eu sei, todos vocês amam o Hello World (: )&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="java"&gt;&lt;br /&gt;import javax.script.ScriptEngine;&lt;br /&gt;import javax.script.ScriptEngineManager;&lt;br /&gt;&lt;br /&gt;public class Main {&lt;br /&gt;&lt;br /&gt;    public static void main(String[] args) throws Exception{&lt;br /&gt;        ScriptEngineManager manager = new ScriptEngineManager();&lt;br /&gt;        ScriptEngine engine = manager.getEngineByName("jruby");//Buscamos a Engine do Jruby&lt;br /&gt;        engine.eval("puts 'Hello World'");//Codigo JRuby&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;ao executar temos a mesma saida do Println, não é magico? Heeheh, um puts executado via java. Sei exatamente o que a maioria pensou, vou ter que por todo o codigo Jruby num String? A reposta é não :), a não ser que você queira fazer isso, mas eu não aconselho.&lt;br /&gt;Existem outros metodos para recuperar as engines, e um deles é por extensão, poderiamos ter usado o metodo getEngineByExtension e passar como parametro o “rb”, e teriamos o Jruby.&lt;br /&gt;Vamos criar então uma classe bem bunito um arquivo .rb&lt;br /&gt;&lt;pre name="code" class="ruby"&gt;&lt;br /&gt;class Teste&lt;br /&gt;  attr_accessor :name, :age&lt;br /&gt;&lt;br /&gt;  def set_name(name)&lt;br /&gt;    self.name = name&lt;br /&gt;  end&lt;br /&gt;&lt;br /&gt;  def set_age(age)&lt;br /&gt;    self.age = age&lt;br /&gt;  end&lt;br /&gt;&lt;br /&gt;  def toString&lt;br /&gt;    self.name+" "+self.age.to_s&lt;br /&gt;  end&lt;br /&gt;end&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Lembrando que o toString sobrescreve o metodo toString do java sem problemas algum, os metodos set_ foram definidos para seguir as convensões do ruby, e isso vai tornar nosso codigo java feio, e não digam que não avisei. Vamos criar uma pequena interface&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="java"&gt;&lt;br /&gt;public interface Teste {&lt;br /&gt;    String name();&lt;br /&gt;    void set_name(String name);&lt;br /&gt;    Integer age();&lt;br /&gt;    void set_age(Integer age);&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;notem o estilo que foi declarado os metodos set_ na interface tbm, deve haver alguma maneira de fazer isso automatico, se alguem souber me avisa :)&lt;br /&gt;&lt;br /&gt;E agora tio? Vamos brincar um pouco de ScriptEngine?&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="java"&gt;&lt;br /&gt;public static void main(String[] args) throws Exception{&lt;br /&gt;        ScriptEngineManager manager = new ScriptEngineManager();&lt;br /&gt;        for(ScriptEngineFactory factory : manager.getEngineFactories()){&lt;br /&gt;            System.out.println(factory.getEngineName());&lt;br /&gt;        }&lt;br /&gt;        ScriptEngine engine = manager.getEngineByName("jruby");&lt;br /&gt;        engine.eval(new FileReader("src/com/rollingwithcode/testejruby/teste.rb"));//arquivo .rb&lt;br /&gt;        Object instance = engine.eval("@teste = Teste.new");//crio a instancia&lt;br /&gt;        Invocable inv = (Invocable) engine;&lt;br /&gt;        Teste teste = inv.getInterface(instance, Teste.class); //converto a classe em uma Interface Java&lt;br /&gt;        teste.set_name("Rafael");&lt;br /&gt;        teste.set_age(21);&lt;br /&gt;        System.out.println(teste.toString());&lt;br /&gt;        System.out.println(teste.name());&lt;br /&gt;    }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;E adivinhem a saida:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;Rafael 21&lt;br /&gt;Rafael&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Tudo isso só pra misturar um pouco de Ruby com java, credo, parece coisa de loco :)&lt;br /&gt;&lt;br /&gt;vou investigar mais algo, e ver se existem maneiras de melhorar isso.&lt;br /&gt;&lt;br /&gt;Abraços até a próxima&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;link type="text/css" rel="stylesheet" href="css/SyntaxHighlighter.css"&gt;&lt;br /&gt;&lt;script language="javascript" src="js/shCore.js"&gt;&lt;/script&gt;&lt;br /&gt;&lt;script language="javascript" src="js/shBrushCSharp.js"&gt;&lt;/script&gt;&lt;br /&gt;&lt;script language="javascript" src="js/shBrushXml.js"&gt;&lt;/script&gt;&lt;br /&gt;&lt;script language="javascript"&gt;&lt;br /&gt;window.onload = function () {&lt;br /&gt;dp.SyntaxHighlighter.ClipboardSwf = '/flash/clipboard.swf';&lt;br /&gt;dp.SyntaxHighlighter.HighlightAll('code');&lt;br /&gt;}&lt;br /&gt;&lt;/script&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4781511741260972168-4982994634413557496?l=blog.rollingwithcode.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.rollingwithcode.com/feeds/4982994634413557496/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4781511741260972168&amp;postID=4982994634413557496&amp;isPopup=true' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4781511741260972168/posts/default/4982994634413557496'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4781511741260972168/posts/default/4982994634413557496'/><link rel='alternate' type='text/html' href='http://blog.rollingwithcode.com/2009/07/java-scriptengine.html' title='Java ScriptEngine'/><author><name>Rafael Felix</name><uri>http://www.blogger.com/profile/15945926043992740682</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/_DivtpeF7_5Y/SSP5tBTaJsI/AAAAAAAAATI/84pO0s0CdY0/S220/felix.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4781511741260972168.post-3488026438623764406</id><published>2009-07-04T05:50:00.000-07:00</published><updated>2009-07-07T05:02:25.349-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='LDAP'/><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><title type='text'>Java e LDAP</title><content type='html'>	É engraçado ver como os servidores LDAP não vem sendo aproveitados. Na verdade são poucas as linguagens onde a comunidade tem algo para usar com servidores LDAP. No caso do Java existe uma biblioteca o JLDAP, distribuida pela Novell que ajuda o trabalho. É uma biblitoeca bem sfemples e mais facil de utilizar que usar JNDI para comunicar com o servidor LDAP.&lt;br /&gt;Porém muita gente tem dificuldade em criar o servidor e efetuar ações dentro de um servidor LDAP, vou utilizar aqui nesse exemplo o Apache Directory Server como servidor LDAP, então as strings de acesso vão depender muito do servidor que você estará utilizando. Existem ferramentas para explorar os servidores então pode não ser tão dificil assim, basta dar uma espiada no senhor da internet (Google) e acharás o que procuras :).&lt;br /&gt;Começando com o JLDAP:&lt;br /&gt;A base de uma conexão com o servidor LDAP é baseada na classe LDAPConnection, e diferente dos banco de dados, não é a conexão que importa e sim o bind dela. Atraves desse bind o servidor disponibiliza os recursos de acordo com as permissoes do usuário que fez o bind. Exemplo:&lt;br /&gt;&lt;pre name="code" class="java"&gt;&lt;br /&gt;LDAPConnection conn = new LDAPConnection();&lt;br /&gt;conn.connect(“localhost”, 37); //Esses dois parametros são servidor (IP ou Nome) e a porta de conexão&lt;br /&gt;conn.bind(LDAPConnection.LDAP_V3, “uid=admin,ou=system”, “secret”.getBytes());&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Percebam o bind, ele é composto por versão do servidor LDAP, o DN do usuário a ser logado, lembrem-se o LDAP não funciona como usuário e senha, e talvez precisem ler mais sobre ele e suas siglas, DN, CN, RDN etc. E o ultimo parametro e a senha em um array de byte.&lt;br /&gt;Após esse código existe uma conexão com o servidor LDAP. E podemos manipula-la.&lt;br /&gt;Vamos criar uma nova entidade dentro do servidor LDAP. Vou utilizar a classe Person (Os servidores LDAP também são divididos em classes, são chamadas de objectClass, e essas classes identificam o tipo do registro no servidor), responsavel por cadastrar usuários no servidor LDAP.&lt;br /&gt;&lt;pre name="code" class="java"&gt;&lt;br /&gt;LDAPAttributeSet attributes = new LDAPAttributeSet();//Um Set de atributos para o servidor, funciona no formato chave =&gt; valor.&lt;br /&gt;attributes.add(new LDAPAttribute("objectClass", "person"));&lt;br /&gt;attributes.add(new LDAPAttribute("cn", "felix"));&lt;br /&gt;attributes.add(new LDAPAttribute("sn", "felix"));&lt;br /&gt;attributes.add(new LDAPAttribute("userpassword", "teste"));&lt;br /&gt;attributes.add(new LDAPAttribute("telephonenumber", "11111111"));&lt;br /&gt;attributes.add(new LDAPAttribute("description", "Eu"));&lt;br /&gt;//Definimos o DN, lembrem-se ele sempre é único e tera uma exception caso não seja único&lt;br /&gt;String dn = "cn=felix,ou=users,ou=system";//Isso pode variar de acordo com o servidor LDAP que você estiver utilizando.&lt;br /&gt;LDAPEntry entry = new LDAPEntry(dn, attributes);&lt;br /&gt;conn.add(entry);//insere a entidade.&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;bacana Não é? E o mais legal, funciona :). Levei algum tempo para conseguir isso, mas assim é mais simples. Lembrando que deve-se ter um conhecimento básico em LDAP. O dn é formado normalmente pelo cn do usuário e o restante compreende a hierarquia de arvore do LDAP. Vendo como um diretorio seria um arquivo chamado felix dentro da pasta users que esta dentro da pasta system, simple não? E ainda por cima vc pode usar esse DN recem inserido para fazer login no servidor LDAP.&lt;br /&gt;Vamos para a segunda parte. Pesquisar registros.&lt;br /&gt;A pesquisa é baseada na classe LDAPSearchResults, e se basea na busca atraves da arvore de diretorios ou de um DN. A pesquisa aqui vai ser baseada na árvore que acabamos de inserir um registro (ou=users,ou=system), e vamos ver todos os usuários do sistema.&lt;br /&gt;&lt;pre name="code" class="java"&gt;&lt;br /&gt;LDAPSearchResults search = conn.search(“ou=users,ou=system”, LDAPConnection.SCOPE_ONE, null, null, false); //não to lembrado do por que desses parametros :P&lt;br /&gt;while(search.hasMore()){//Auto explicativo&lt;br /&gt;	LDAPEntry entry = search.next()://Recuperamos a entidade. Cada uma dessas entidades é um usuário do servidor LDAP.&lt;br /&gt;	//Vamos carregar e imprimir os atributos desse usuário&lt;br /&gt;	LDAPAttributeSet attribute = entry.getAttributeSet();&lt;br /&gt;	Iterator it = attribute.iterator();&lt;br /&gt;	while(it.hasNext()){&lt;br /&gt;		LDAPAttribute att = (LDAPAttribute) it.next();&lt;br /&gt;		System.out.println(att.getName() + “ =&gt; “ + att.getStringValue());&lt;br /&gt;	}&lt;br /&gt;	System.out.println();&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Simples não? E ainda tem gente que acha dificil acessar servidor LDAP via Java :)&lt;br /&gt;&lt;br /&gt;Espero que esse post seja util a quem está buscando algo como acessar servidores LDAP.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;link type="text/css" rel="stylesheet" href="css/SyntaxHighlighter.css"&gt;&lt;br /&gt;&lt;script language="javascript" src="js/shCore.js"&gt;&lt;/script&gt;&lt;br /&gt;&lt;script language="javascript" src="js/shBrushCSharp.js"&gt;&lt;/script&gt;&lt;br /&gt;&lt;script language="javascript" src="js/shBrushXml.js"&gt;&lt;/script&gt;&lt;br /&gt;&lt;script language="javascript"&gt;&lt;br /&gt;window.onload = function () {&lt;br /&gt;dp.SyntaxHighlighter.ClipboardSwf = '/flash/clipboard.swf';&lt;br /&gt;dp.SyntaxHighlighter.HighlightAll('code');&lt;br /&gt;}&lt;br /&gt;&lt;/script&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4781511741260972168-3488026438623764406?l=blog.rollingwithcode.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.rollingwithcode.com/feeds/3488026438623764406/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4781511741260972168&amp;postID=3488026438623764406&amp;isPopup=true' title='3 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4781511741260972168/posts/default/3488026438623764406'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4781511741260972168/posts/default/3488026438623764406'/><link rel='alternate' type='text/html' href='http://blog.rollingwithcode.com/2009/07/java-e-ldap.html' title='Java e LDAP'/><author><name>Rafael Felix</name><uri>http://www.blogger.com/profile/15945926043992740682</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/_DivtpeF7_5Y/SSP5tBTaJsI/AAAAAAAAATI/84pO0s0CdY0/S220/felix.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4781511741260972168.post-5947468853178280092</id><published>2009-06-17T07:09:00.000-07:00</published><updated>2009-06-17T07:24:53.183-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='Testes'/><category scheme='http://www.blogger.com/atom/ns#' term='Swing'/><category scheme='http://www.blogger.com/atom/ns#' term='JUnit'/><title type='text'>Swing e TestUnit (JUnit)</title><content type='html'>Quem já mecheu com Swing conheçe o parto que é testar as telas. Pensar nas mil possibilidades se fazer cagada em uma tela. Impossivel prever o total de coisas que um usuário consegue fazer. Para facilitar esses testes surgiu o JUnit, automatizando os testes. Não vou entrar em detalhes sobre o TDD, existe muita informação por ai.&lt;br /&gt;&lt;br /&gt;Mas algum tempo atrás procurei por algo para automatizar os testes em Interfaces gráficas. Porém nada do que eu achei era o que eu buscava. Não queria ter que abrir a tela e inserir valores. Gostaria de fazer isso via código de forma automatica, como o JUnit, em busca de um resultado esperado. Vi sobre o Maraton, FestSwing, e em todos eu tinha que abrir a droga das telas para testar. Algo que não me agradou nem um pouco.&lt;br /&gt;&lt;br /&gt;Então deixei de lado isso. Porém alguns dias atraz me veio uma ideia meio louca de se fazer isso. Criei uma classe que encapsula o frame. e atraves dela consigo recuperar os compoenentes da tela e simular as ações. Exatemente o que eu queria. Automatizar a porcaria do teste (:&lt;br /&gt;&lt;br /&gt;Image o seguinte JInternalFrame:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_DivtpeF7_5Y/Sjj65xoP3mI/AAAAAAAAAcg/_EhI9vXI-wA/s1600-h/internal.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 73px;" src="http://1.bp.blogspot.com/_DivtpeF7_5Y/Sjj65xoP3mI/AAAAAAAAAcg/_EhI9vXI-wA/s320/internal.JPG" alt="" id="BLOGGER_PHOTO_ID_5348300427984100962" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;A ação do botão se resume a alterar o texto de JInternalFrame para Clicked.&lt;br /&gt;E ai? como fazer para testar esse esquema?&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="java"&gt;&lt;br /&gt;public class TestFrameWithMock {&lt;br /&gt;   private SwingTester mock;&lt;br /&gt;&lt;br /&gt;   public TestFrameWithMock() {&lt;br /&gt;       mock = new SwingTester(new TesteInternal());&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   @Test&lt;br /&gt;   public void shouldChangeTextWhenButtonWasClicked(){&lt;br /&gt;       JButton btn = (JButton) mock.getFieldReflect("jButton1");&lt;br /&gt;       JTextField tf = (JTextField) mock.getFieldReflect("jTextField1");&lt;br /&gt;       assertEquals("JInternalFrame", tf.getText());&lt;br /&gt;       btn.doClick();&lt;br /&gt;       assertEquals("Clicked", tf.getText());&lt;br /&gt;   }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;E ai alguém ai percebeu como é simples o esquema? E nenhuma tela é visivel. A maioria das ferramentes você deveria abrir cada JInternalFrame, um por um e testa-lo. Assim desse modo com a Classe SwingTester ele não é visivel.&lt;br /&gt;&lt;br /&gt;Como podem perceber o TesteInternal (JInternalFrame da imagem) é passado como parametro. E  atraves dele é possivel recuperar os compoenentes da tela atraves do atributo name de cada um ou atraves do nome da variavel via reflection (que foi usado nesse teste acima). E o teste executa sem problemas.&lt;br /&gt;&lt;br /&gt;Foi a abordagem que achei mais legal. Em breve for colocar isso ai no github, se eu lembrar e vcs podem analisar e testar.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;link type="text/css" rel="stylesheet" href="css/SyntaxHighlighter.css"&gt;&lt;br /&gt;&lt;script language="javascript" src="js/shCore.js"&gt;&lt;/script&gt;&lt;br /&gt;&lt;script language="javascript" src="js/shBrushCSharp.js"&gt;&lt;/script&gt;&lt;br /&gt;&lt;script language="javascript" src="js/shBrushXml.js"&gt;&lt;/script&gt;&lt;br /&gt;&lt;script language="javascript"&gt;&lt;br /&gt;window.onload = function () {&lt;br /&gt;dp.SyntaxHighlighter.ClipboardSwf = '/flash/clipboard.swf';&lt;br /&gt;dp.SyntaxHighlighter.HighlightAll('code');&lt;br /&gt;}&lt;br /&gt;&lt;/script&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4781511741260972168-5947468853178280092?l=blog.rollingwithcode.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.rollingwithcode.com/feeds/5947468853178280092/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4781511741260972168&amp;postID=5947468853178280092&amp;isPopup=true' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4781511741260972168/posts/default/5947468853178280092'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4781511741260972168/posts/default/5947468853178280092'/><link rel='alternate' type='text/html' href='http://blog.rollingwithcode.com/2009/06/swing-e-testunit-junit.html' title='Swing e TestUnit (JUnit)'/><author><name>Rafael Felix</name><uri>http://www.blogger.com/profile/15945926043992740682</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/_DivtpeF7_5Y/SSP5tBTaJsI/AAAAAAAAATI/84pO0s0CdY0/S220/felix.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_DivtpeF7_5Y/Sjj65xoP3mI/AAAAAAAAAcg/_EhI9vXI-wA/s72-c/internal.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4781511741260972168.post-4800894549042322324</id><published>2009-06-08T15:35:00.000-07:00</published><updated>2009-06-08T15:48:19.943-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Ioke'/><title type='text'>Ioke - Programação Orientada a Protótipo</title><content type='html'>Eu em alguns devaneios que acredito que todo o programador tenha (Por favor confirmem isso :) ), estava em busca de uma linguagem funcional para aprender, seguindo o conceito de aprender uma linguagem nova por ano, esse ano estava atrasado, ainda não tinha começado a estudar nenhuma linguagem, estão buscando pela linguagem Haskell que havia escutado bem, e também dei uma olhada em Erlang outra linguagem funcional crescendo em uso. Muitos devem se perguntar, por que não Scala? Na verdade cada vez que busco fugir um pouco da filosofia Java, eu melhoro meus códigos em Java, assim como Scala seguem a mesma família, pois sua sintaxe lembra bastante a sintaxe Java.&lt;br /&gt;&lt;br /&gt;Então olhando as duas linguagens entrei em um dilema, qual aprender? e foi a duvida, dei uma olhada básica, não me aprofundei muito em nenhuma das duas. e Algum tempo atras, navegando em alguns blogs, cheguei em um que continha uma entrevista com Ola Bini, que é um dos principais desenvolvedores do JRuby, onde ele afirmava que Java é muito baixo nivel é que é excelente para se criar novas linguagem (seria essa uma afirmação do tipo Java é o novo C?), e na mesma entrevista ele citava &lt;a href="http://ioke.org" target="_blank"&gt;Ioke&lt;/a&gt;, a linguagem de programação que ele havia criado, utilizando Java. E eu resolvi dar uma olhada, e vi que ela é uma linguagem orientada a prototipos, não orientada a objetos. E isso me chamou a atenção, em algumas buscas, encontrei no Groups do Ioke, um brasileiro, que me ajudou a esclarecer algumas dúvidas.&lt;br /&gt;&lt;br /&gt;No site do Ioke possui diversos exemplos de como se utiliza ele.&lt;br /&gt;O Ioke possui suporte nativo a Java, e não utiliza o operador . , tão comum para as linguagens atuais, eis que vendo esse suporte nativo resolvi criar uma Bridge de JDBC com o Ioke, e por incrivel que pareça, e depois de algum sofrimento consegui excecutar uma consulta no banco. Algo realmente bacana para quem está aprendendo uma linguagem nova. Mas muito da API não consegui usar, o que consegui foi instanciar classes dos Drivers diretamente.&lt;br /&gt;&lt;br /&gt;o Ioke ainda possui o iik que é um console iterativo estilo o irb do Ruby, e ainda possui o iSpec baseado no RSpec, ainda não mechi muito nisso, mas estou gostando desse novo aprendizado, aos poucos vou colando alguns códigos do Ioke para vocês verem.&lt;br /&gt;&lt;br /&gt;Só não esperem um hello world por que fazer um "Hello World" println é muito simples não acham?&lt;br /&gt;&lt;br /&gt;O material na web ainda é escasso e a linguagem é lenta, mas acredito que tudo isso pode mudar :).&lt;br /&gt;&lt;br /&gt;Vamos ver como o Ioke se sai com o tempo.&lt;br /&gt;&lt;br /&gt;até a próxima.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4781511741260972168-4800894549042322324?l=blog.rollingwithcode.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.rollingwithcode.com/feeds/4800894549042322324/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4781511741260972168&amp;postID=4800894549042322324&amp;isPopup=true' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4781511741260972168/posts/default/4800894549042322324'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4781511741260972168/posts/default/4800894549042322324'/><link rel='alternate' type='text/html' href='http://blog.rollingwithcode.com/2009/06/ioke-programacao-orientada-prototipo.html' title='Ioke - Programação Orientada a Protótipo'/><author><name>Rafael Felix</name><uri>http://www.blogger.com/profile/15945926043992740682</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/_DivtpeF7_5Y/SSP5tBTaJsI/AAAAAAAAATI/84pO0s0CdY0/S220/felix.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4781511741260972168.post-4393645562655867973</id><published>2009-05-28T15:36:00.000-07:00</published><updated>2009-05-28T15:57:22.354-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='TCC'/><category scheme='http://www.blogger.com/atom/ns#' term='RESTful'/><category scheme='http://www.blogger.com/atom/ns#' term='LDAP'/><category scheme='http://www.blogger.com/atom/ns#' term='JSON'/><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='JavaME'/><title type='text'>Mais um passo</title><content type='html'>Bom terça-feira dia 24/03/2009 foi minha apresentação do meu trabalho de conclusão de curso.&lt;br /&gt;Engraço que tudo isso me fez lembrar do começo da faculdade, desde quando entrei, até agora. E pensar que entrei sem nem ter noção do que era desenvolver um software, e hoje ser um desenvolvedor.&lt;br /&gt;&lt;br /&gt;Na verdade quase me dei mal na apresentação, no nervosismo apresentei em 11 minutos quando deveria ter apresentado em 15, fui mostrar a apresentação utilizando uma digamos assim "gambiarra", para mostrar funcionando a aplicação, mas Murphy é infalivel e a aplicação não funcionou, na hora o branco de não saber como agir me deixou sem muitas escolhas, mas no fim correu tudo bem, mesmo sem mostrar a aplicação. Eu espero ao menos. Ainda me resta entregar o trabalho escrito, mas esse só ajustar a metodologia dele.&lt;br /&gt;&lt;br /&gt;Do que se tratava meu trabalho, basicamente é uma ferramente para alterar usuários em um servidor LDAP atraves do Celular.&lt;br /&gt;Utilizei somente linguagem Java, JSON, RESTful e o Apache Directory Server.&lt;br /&gt;O sistema atraves do emulador executa todo o CRUD sobre um Usuário do servidor LDAP, porém rodando do aparelho existe um problema na edição de usuários. E a aplicação não está tão completa, faltaram validações, e diversas implementações. Algumas coisas faria melhor, mas nem sei se vou continuar com o projeto.&lt;br /&gt;&lt;br /&gt;O projeto na verdade é divido em 4 partes, a API de comunicação com o LDAP, a implementação da API, focada no ApacheDS, os serviços RESTful, e a aplicação cliente. Os fontes são interessantes para quem quer ver como funciona a comunicação com o LDAP partindo do Java, e como utilizar JSON tanto em Java como em JavaME.&lt;br /&gt;&lt;br /&gt;Abaixo minha apresentação:&lt;br /&gt;&lt;br /&gt;&lt;div style="width:425px;text-align:left" id="__ss_1503709"&gt;&lt;a style="font:14px Helvetica,Arial,Sans-serif;display:block;margin:12px 0 3px 0;text-decoration:underline;" href="http://www.slideshare.net/felix.rafael/apresentacao-tcc-rafael-felix?type=presentation" title="Apresentacao TCC - Rafael Felix"&gt;Apresentacao TCC - Rafael Felix&lt;/a&gt;&lt;object style="margin:0px" width="425" height="355"&gt;&lt;param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=apresentacao-090528175024-phpapp01&amp;stripped_title=apresentacao-tcc-rafael-felix" /&gt;&lt;param name="allowFullScreen" value="true"/&gt;&lt;param name="allowScriptAccess" value="always"/&gt;&lt;embed src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=apresentacao-090528175024-phpapp01&amp;stripped_title=apresentacao-tcc-rafael-felix" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div style="font-size:11px;font-family:tahoma,arial;height:26px;padding-top:2px;"&gt;View more &lt;a style="text-decoration:underline;" href="http://www.slideshare.net/"&gt;OpenOffice presentations&lt;/a&gt; from &lt;a style="text-decoration:underline;" href="http://www.slideshare.net/felix.rafael"&gt;felix.rafael&lt;/a&gt;.&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;E os códigos estou disponibilizando via RapidShare:&lt;br /&gt;&lt;a href="http://rapidshare.com/files/238340355/TCC.rar.html" target="_blank"&gt;Aqui&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Façam bom uso nos estudos :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4781511741260972168-4393645562655867973?l=blog.rollingwithcode.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.rollingwithcode.com/feeds/4393645562655867973/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4781511741260972168&amp;postID=4393645562655867973&amp;isPopup=true' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4781511741260972168/posts/default/4393645562655867973'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4781511741260972168/posts/default/4393645562655867973'/><link rel='alternate' type='text/html' href='http://blog.rollingwithcode.com/2009/05/passando-mais-um-marco.html' title='Mais um passo'/><author><name>Rafael Felix</name><uri>http://www.blogger.com/profile/15945926043992740682</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/_DivtpeF7_5Y/SSP5tBTaJsI/AAAAAAAAATI/84pO0s0CdY0/S220/felix.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4781511741260972168.post-9174258066706789783</id><published>2009-04-29T16:05:00.000-07:00</published><updated>2009-04-29T20:01:51.906-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JSON'/><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><title type='text'>Java e JSON</title><content type='html'>O título apesar de estranho, é justamente disso que vou falar JSON com Java (café), andei pesquisando diversos formatos de arquivos para usar no meu TCC, dentre eles o XML, que para quem não sabe é muito custoso para um celular processar esse tipo de arquivo, o YAML (o qual não possui nenhum biblioteca para ser tratado com JME), e o ultimo é o que eu mais me encantei o JSON.&lt;br /&gt;&lt;br /&gt;JSON foi criado baseado em JavaScript. Porém ganhou notaridade, e foi implementada por diversas linguagens, no site oficial se encontra uma biblioteca para ser usado em Java, com o codigo fonte la. Foi esse que usei nesse exemplo, podem baixar nesse link http://www.json.org/java/index.html&lt;br /&gt;&lt;br /&gt;Muito simples trabalhar com JSON e Java. O JSON funciona como um Map, utilizando a combinação chave =&gt; valor, uma chave sempre é uma String, e o valor pode varias, os valores disponiveis para o JSON podem ser vistos no site json.org.&lt;br /&gt;&lt;br /&gt;Após adicionar as classes ao seu projeto vamos a utilização da biblioteca.&lt;br /&gt;Basicamente a biblioteca consiste nos objetos JSONObject, JSONArray e JSONException&lt;br /&gt;Onde JSONObject representa um único objeto no formato JSON e JSONArray representa uma coleção de objetos.&lt;br /&gt;&lt;br /&gt;Usando JSONObject&lt;br /&gt;&lt;pre name="code" class="java"&gt;&lt;br /&gt;JSONObject obj = new JSONObject();&lt;br /&gt;obj.put("nome", "Rafael");&lt;br /&gt;obj.put("idade", 21);&lt;br /&gt;System.out.println(obj);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;a saída sera algo como:&lt;br /&gt;&lt;pre name="code" class="json"&gt;&lt;br /&gt;{ "nome":"Rafael", "idade":21 }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Perfeito não? muito simples. Calma que tem mais&lt;br /&gt;&lt;pre name="code" class="java"&gt;&lt;br /&gt;public class Pessoa{&lt;br /&gt;   private String nome;&lt;br /&gt;   private int idade;&lt;br /&gt;&lt;br /&gt;   //Gets e Sets&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Criamos um objeto para comportar as alterações. e para converte-lo em JSON?&lt;br /&gt;&lt;pre name="code" class="java"&gt;&lt;br /&gt;   Pessoa p = new Pessoa();&lt;br /&gt;   p.setNome("Rafael");&lt;br /&gt;   p.setIdade(21);&lt;br /&gt;   JSONObject obj = new JSONObject(p);&lt;br /&gt;   System.out.println(obj);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;E a saída?&lt;br /&gt;&lt;pre name="code" class="json"&gt;&lt;br /&gt;{ "nome":"Rafael", "idade":21 }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Um JSONArray segue a mesma linha de raciocionio, com a diferença que vc adiciona a ele diversos JSONObject ou Strings no formato JSON. excelente para quem quer trabalhar com esse arquivo em formato leve.&lt;br /&gt;&lt;br /&gt;É isso ai.&lt;br /&gt;&lt;br /&gt;&lt;link type="text/css" rel="stylesheet" href="css/SyntaxHighlighter.css"&gt;&lt;/link&gt;&lt;br /&gt;&lt;script language="javascript" src="js/shCore.js"&gt;&lt;/script&gt;&lt;br /&gt;&lt;script language="javascript" src="js/shBrushCSharp.js"&gt;&lt;/script&gt;&lt;br /&gt;&lt;script language="javascript" src="js/shBrushXml.js"&gt;&lt;/script&gt;&lt;br /&gt;&lt;script language="javascript"&gt;&lt;br /&gt;window.onload = function () {&lt;br /&gt;dp.SyntaxHighlighter.ClipboardSwf = '/flash/clipboard.swf';&lt;br /&gt;dp.SyntaxHighlighter.HighlightAll('code');&lt;br /&gt;}&lt;br /&gt;&lt;/script&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4781511741260972168-9174258066706789783?l=blog.rollingwithcode.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.rollingwithcode.com/feeds/9174258066706789783/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4781511741260972168&amp;postID=9174258066706789783&amp;isPopup=true' title='3 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4781511741260972168/posts/default/9174258066706789783'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4781511741260972168/posts/default/9174258066706789783'/><link rel='alternate' type='text/html' href='http://blog.rollingwithcode.com/2009/04/java-e-json.html' title='Java e JSON'/><author><name>Rafael Felix</name><uri>http://www.blogger.com/profile/15945926043992740682</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/_DivtpeF7_5Y/SSP5tBTaJsI/AAAAAAAAATI/84pO0s0CdY0/S220/felix.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4781511741260972168.post-8345038053104334796</id><published>2009-04-15T15:50:00.000-07:00</published><updated>2009-04-15T16:15:27.057-07:00</updated><title type='text'>Criando seus proprios eventos no Java</title><content type='html'>A maioria do pessoal que já mexeu com Swing no Java (o que acredito que sejam a maioria do pessoal que já mexeu com java), conheçe o estilo do java tratar eventos, usando classes, assim como nossa querida classe chamada ActionListener, que algumas IDEs como o Netbeans escondem a declaração dessa interface, adotando um estilo mais delphi-style.&lt;br /&gt;&lt;br /&gt;E normalmente o pessoal que vem do Delphi, acha estranho declarar um classe e implementar um metodo nela para executar o evento de um botão (Eu também achava isso). Porém os beneficios de adotar esse abordagem, proporciona baixo acoplamento, e seu código pode se tornar mais dinamico e orientado a objetos, não aquele código macarronico que vemos por ai, que muitas pessoas fazem, e eu também faço diversas vezes.&lt;br /&gt;&lt;br /&gt;A vantagem de se fazer isso é que o Java não vai sobrescrever o ActionListener que já foi adicionado ao seu botão, ele vai adicionar mais um, ou seja seu botão vai executar duas ações. ou seja, vc pode separar códigos com mais facilidade, e muito mais simples. Mas bah tche como isso?&lt;br /&gt;&lt;br /&gt;Vou mostrar como criar seus proprios eventos em Java. Imagine o seguinte problema:&lt;br /&gt;&lt;br /&gt;"Como projetar um sistema que modele um telefone e todos os objetos que poderiam estar     interessados quando ele toca?"&lt;br /&gt;&lt;br /&gt;Rá, ai poderiamos usar o Observer, que expliquei no artigo anterior correto? Sim, poderiamos, mas não é isso que eu quero mostrar :-)&lt;br /&gt;&lt;br /&gt;Primeiramente devemos criar o Evento, esse evento será o evento disparado toda a vez que um telefone toca, e vai ficar disponivel para os listeners, é um código realmente simples:&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="java"&gt;&lt;br /&gt;public class TelefoneEvent extends java.util.EventObject {&lt;br /&gt;&lt;br /&gt;    public TelefoneEvent(Telefone source) {&lt;br /&gt;        super(source);&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Simples não, deixemos a herança cuidar disso para nós e o java que cuide de seu EventObject&lt;br /&gt;&lt;br /&gt;Agora vamos criar nossa interface Listener, utilizando listener não impedimos a herança, e deixamos a classe livre para criar quantos listeners quiser, ou  implementar se for melhor para ela, a implementação do listener&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="java"&gt;&lt;br /&gt;public interface TelefoneListener extends java.util.EventListener {&lt;br /&gt;    void telefoneTocou(TelefoneEvent e);&lt;br /&gt;    void telefoneAtendido(TelefoneEvent e);&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Extendendo a interface EventListener, temos um novo evento criado, nosso telefone Listener, possui dois metodos, telefoneTocou e TelefoneAtentido, que devem ser reimplementados, uma solução bacana que o java usa também são os adapters, como KeyAdapter, que possui os metodos de KeyListener implementados sem código ou funcionalidade alguma, vc so sobrescreve os que deseja, os outros são silenciosos (não fazem nada).&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="java"&gt;&lt;br /&gt;public class TelefoneAdapter&lt;br /&gt;    implements TelefoneListener {&lt;br /&gt;&lt;br /&gt;    public void telefoneTocou(TelefoneEvent e) {}&lt;br /&gt;    public void telefoneAtendido(TelefoneEvent e) {}&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Simples não, mas não é só isso, ainda não serve para nada nosso listener.&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="java"&gt;&lt;br /&gt;//imports omitidos&lt;br /&gt;public class Telefone {&lt;br /&gt;    private Collection &lt;TelefoneListener&gt; telefoneListeners = new ArrayList&lt;TelefoneListener&gt;();&lt;br /&gt;&lt;br /&gt;    // método de suporte para testar a solução&lt;br /&gt;    public void tocaFone() {&lt;br /&gt;        disparaTelefoneTocou();&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public void atendeFone() {&lt;br /&gt;        disparaTelefoneAtendido();&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public synchronized void addTelefoneListener(TelefoneListener l) {&lt;br /&gt;        if(!telefoneListeners.contains(l)) {&lt;br /&gt;            telefoneListeners.add(l);&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public synchronized void &lt;br /&gt;            removeTelefoneListener(TelefoneListener l) {&lt;br /&gt;&lt;br /&gt;        telefoneListeners.remove(l);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    private void disparaTelefoneTocou() {&lt;br /&gt;        Collection &lt;TelefoneListener&gt; tl;&lt;br /&gt;        synchronized (this) {&lt;br /&gt;            tl = (Collection)(((ArrayList)telefoneListeners).clone());&lt;br /&gt;        }&lt;br /&gt;        TelefoneEvent evento = new TelefoneEvent(this);                &lt;br /&gt;        for (TelefoneListener t : tl) {&lt;br /&gt;        	t.telefoneTocou(evento);&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;            &lt;br /&gt;    private void disparaTelefoneAtendido() {&lt;br /&gt;        Collection &lt;TelefoneListener&gt; tl;&lt;br /&gt;        synchronized (this) {&lt;br /&gt;            tl = (Collection)(((ArrayList)telefoneListeners).clone());&lt;br /&gt;        }&lt;br /&gt;        TelefoneEvent evento = new TelefoneEvent(this);&lt;br /&gt;        for (TelefoneListener t : tl) {&lt;br /&gt;        	t.telefoneAtendido(evento);&lt;br /&gt;        }        &lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Essa é uma simples classe como outra qualquer, podem ver que ela possui dois metodos addTelefoneListener e removeTelefoneListener, esses metodos são padrões, em listeners vc não pode utilizar getters e setters, utilizando getter e setter perde-se o encapsulamento. Ele cria antes de disparar os eventos de cada um dos seus listeners, simples e prático.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="java"&gt;&lt;br /&gt;public class SecretariaEletronica&lt;br /&gt;    implements TelefoneListener {&lt;br /&gt;&lt;br /&gt;    public void telefoneTocou(TelefoneEvent e) {&lt;br /&gt;        System.out.println("Secretaria escuta o telefone tocando.");&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public void telefoneAtendido(TelefoneEvent e) {&lt;br /&gt;        System.out.println("Secretaria sabe que o telefone foi atendido.");&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;public class Pessoa {&lt;br /&gt;    public void escutaTelefone(Telefone t) {&lt;br /&gt;        t.addTelefoneListener(&lt;br /&gt;            new TelefoneAdapter() {&lt;br /&gt;                public void telefoneTocou(TelefoneEvent e) {&lt;br /&gt;                    System.out.println("Eu pego!");&lt;br /&gt;                    ((Telefone)(e.getSource())).atendeFone();&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;        );&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Duas classes para melhorar a brincadeira, e vc pode criar mais classes, essas somente ajudam a ilustrar o exemplo&lt;br /&gt;&lt;pre name="code" class="java"&gt;&lt;br /&gt;public class ExemploFone {&lt;br /&gt;    public static void main(String[] args) { &lt;br /&gt;        Telefone fone = new Telefone();&lt;br /&gt;        Pessoa fulano = new Pessoa();&lt;br /&gt;        SecretariaEletronica se = new SecretariaEletronica();&lt;br /&gt;&lt;br /&gt;        fone.addTelefoneListener(se);&lt;br /&gt;        fulano.escutaTelefone(fone);&lt;br /&gt;&lt;br /&gt;        fone.tocaFone(); // começa a brincadeira&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;a saida é algo assim&lt;br /&gt;&lt;code&gt;&lt;br /&gt;Secretaria escuta o telefone tocando.&lt;br /&gt;Eu pego!&lt;br /&gt;Secretaria sabe que o telefone foi atendid&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Pode parecer complexo inicialmente, mas isso melhora e agiliza o trabalho, é muito bacana se trabalhar com listeners. Esse exemplo foi encontrado &lt;a href="http://www.dsc.ufcg.edu.br/~jacques/cursos/map/html/arqu/observer.htm" target="_blank"&gt;aqui&lt;/a&gt; e vc pode utiliza-lo, possui mais detalhes.&lt;br /&gt;&lt;br /&gt;Uma leitura bacana, &lt;a href="http://www.nomedojogo.com/2009/04/15/programar-e-dificil/" target="_blank"&gt;veja aqui no blog do Carlos Brando&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;link type="text/css" rel="stylesheet" href="css/SyntaxHighlighter.css"&gt;&lt;/link&gt;&lt;br /&gt;&lt;script language="javascript" src="js/shCore.js"&gt;&lt;/script&gt;&lt;br /&gt;&lt;script language="javascript" src="js/shBrushCSharp.js"&gt;&lt;/script&gt;&lt;br /&gt;&lt;script language="javascript" src="js/shBrushXml.js"&gt;&lt;/script&gt;&lt;br /&gt;&lt;script language="javascript"&gt;&lt;br /&gt;window.onload = function () {&lt;br /&gt;dp.SyntaxHighlighter.ClipboardSwf = '/flash/clipboard.swf';&lt;br /&gt;dp.SyntaxHighlighter.HighlightAll('code');&lt;br /&gt;}&lt;br /&gt;&lt;/script&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4781511741260972168-8345038053104334796?l=blog.rollingwithcode.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.rollingwithcode.com/feeds/8345038053104334796/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4781511741260972168&amp;postID=8345038053104334796&amp;isPopup=true' title='2 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4781511741260972168/posts/default/8345038053104334796'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4781511741260972168/posts/default/8345038053104334796'/><link rel='alternate' type='text/html' href='http://blog.rollingwithcode.com/2009/04/criando-seus-proprios-eventos-no-java.html' title='Criando seus proprios eventos no Java'/><author><name>Rafael Felix</name><uri>http://www.blogger.com/profile/15945926043992740682</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/_DivtpeF7_5Y/SSP5tBTaJsI/AAAAAAAAATI/84pO0s0CdY0/S220/felix.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4781511741260972168.post-7933651261620962234</id><published>2009-03-30T03:35:00.000-07:00</published><updated>2009-03-31T12:04:50.898-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><title type='text'>Implementando Obsever em Java</title><content type='html'>Segundo a &lt;a href="http://en.wikipedia.org/wiki/Observer_pattern"&gt;wikipedia:&lt;/a&gt;&lt;br /&gt;O padrão obsever diz que um objeto (observado) mantem uma lista de outros objetos (observadores), e notifica aos observadores qualquer mudança que ocorro no observado.&lt;br /&gt;&lt;br /&gt;O Java já traz uma implementação do observer padrão, e a utilizamos aqui onde trabalho pra implementar o MVC com Swing, e realmente achei uma abordagem muito interesse, e simples de ser feita.&lt;br /&gt;&lt;br /&gt;é muito simples de se utilizar, e esse post vai ser pequeno sim :).&lt;br /&gt;&lt;br /&gt;primeiramente na nossa classe observada temos que fazela extender a &lt;code&gt;Obervable&lt;/code&gt; e isso já a torna apta para ser observada por outra classe, as classes que vão observala devem implementar a interface &lt;code&gt;Observer&lt;/code&gt; que contem a assinatura de um único metodo &lt;code&gt;update&lt;/code&gt;, a cada notificação do modelo é chamado esse metodo update, ridiculamente simples e facil.&lt;br /&gt;&lt;br /&gt;Vamos a um exemplo prático:&lt;br /&gt;&lt;pre name="code" class="java"&gt;&lt;br /&gt;public class MeuObservado extends Observable{&lt;br /&gt;&lt;br /&gt;  public void hello(){&lt;br /&gt;     setChanged();&lt;br /&gt;     notifyObservers("Hello World!");&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Agora quem vai observar essa classe&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="java"&gt;&lt;br /&gt;public class MeuObservador implements Observer{&lt;br /&gt;    public MeuObservador(){&lt;br /&gt;        MeuObservado obj = new MeuObservado();&lt;br /&gt;        obj.addObserver(this);&lt;br /&gt;        obj.hello();&lt;br /&gt;    }&lt;br /&gt;    public void update(Observer o, Object arg){&lt;br /&gt;        System.out.println(arg);&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;só executar e pronto, um hello world utilizando observer, se vc tiver mais classes que utilizem esse hello world basta adiciona-la ao observer, e ela será notificada também. simples, pratico e facil. Excelente maneira de proporcionar baixo acoplamento entre as classes.&lt;br /&gt;&lt;br /&gt;Outra hora vou postar sobre como criar listener no Swing.&lt;br /&gt;&lt;br /&gt;[]'s&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;link type="text/css" rel="stylesheet" href="css/SyntaxHighlighter.css"&gt;&lt;/link&gt;&lt;br /&gt;&lt;script language="javascript" src="js/shCore.js"&gt;&lt;/script&gt;&lt;br /&gt;&lt;script language="javascript" src="js/shBrushCSharp.js"&gt;&lt;/script&gt;&lt;br /&gt;&lt;script language="javascript" src="js/shBrushXml.js"&gt;&lt;/script&gt;&lt;br /&gt;&lt;script language="javascript"&gt;&lt;br /&gt;window.onload = function () {&lt;br /&gt;dp.SyntaxHighlighter.ClipboardSwf = '/flash/clipboard.swf';&lt;br /&gt;dp.SyntaxHighlighter.HighlightAll('code');&lt;br /&gt;}&lt;br /&gt;&lt;/script&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4781511741260972168-7933651261620962234?l=blog.rollingwithcode.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.rollingwithcode.com/feeds/7933651261620962234/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4781511741260972168&amp;postID=7933651261620962234&amp;isPopup=true' title='3 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4781511741260972168/posts/default/7933651261620962234'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4781511741260972168/posts/default/7933651261620962234'/><link rel='alternate' type='text/html' href='http://blog.rollingwithcode.com/2009/03/implementando-obsever-em-java.html' title='Implementando Obsever em Java'/><author><name>Rafael Felix</name><uri>http://www.blogger.com/profile/15945926043992740682</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/_DivtpeF7_5Y/SSP5tBTaJsI/AAAAAAAAATI/84pO0s0CdY0/S220/felix.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4781511741260972168.post-4915234638126673912</id><published>2009-03-09T15:28:00.000-07:00</published><updated>2009-03-09T15:46:34.847-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='Banco de Dados'/><category scheme='http://www.blogger.com/atom/ns#' term='CouchDB'/><title type='text'>CouchDB-J</title><content type='html'>O CouchDB, é um banco de dados Orientado a documentos, diferente dos banco de dados orientados a tabelas, ele é mais dinamico, e dizem por ai que ele escala, diferente dos banco de dados relacionais. CouchDB é um projeto da apache, e nem na versão 1.0 está ainda, mas já causou enorme alvoroso na comunidade Rails. Existem algumas soluções para usar o CouchDB com Rails, e em java temos somente uma que é o CouchDB4J, mas para mexer com ela é necessário reaprender a mexer.&lt;br /&gt;&lt;br /&gt;Lógico que a estrutura do CouchDB é bem diferente de outros banco de dados, ele funciona a base de requisições RESTful, e troca arquivos no formato JSON, entre cada Requisição, ele é baseado em Requests e Responses HTTP.&lt;br /&gt;&lt;br /&gt;Eis que procurando, até para testar não há nenhuma implementação que tente seguir o padrão JDBC para o CouchDB, então, começei a implementar, e nem é tão complexo assim, secretamente em baixo de cada comando ha uma requisição HTTP no projeto. Vou em breve disponibiliza-lo no meu github, para quem quiser contribuir, a versão já tem algumas informações uteis, já é possivel consultar alguns documentos do servidor atravez de ResultSet e Statment.&lt;br /&gt;&lt;br /&gt;Quem tiver interesse em ajudar, é só falar comigo para começarmos a pensar em como desenvolver melhor esse driver.&lt;br /&gt;&lt;br /&gt;Ficou interessado no CouchDB?&lt;br /&gt;Infelizmente ele ainda não tem uma distribuição em binários, somente código fonte. Podem baixar os fontes, e ver no README do CouchDB como instalar no Ubuntu e no Mac OS, usuários de windows, tentem novamente mais tarde.&lt;br /&gt;&lt;br /&gt;Ele possui uma interface web bem simples e bacana para se aprender a mexer, estou querendo aprender a mexer mais, se alguem quiser compartilhar conhecimentos so falar comigo.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4781511741260972168-4915234638126673912?l=blog.rollingwithcode.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.rollingwithcode.com/feeds/4915234638126673912/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4781511741260972168&amp;postID=4915234638126673912&amp;isPopup=true' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4781511741260972168/posts/default/4915234638126673912'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4781511741260972168/posts/default/4915234638126673912'/><link rel='alternate' type='text/html' href='http://blog.rollingwithcode.com/2009/03/couchdb-j.html' title='CouchDB-J'/><author><name>Rafael Felix</name><uri>http://www.blogger.com/profile/15945926043992740682</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/_DivtpeF7_5Y/SSP5tBTaJsI/AAAAAAAAATI/84pO0s0CdY0/S220/felix.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4781511741260972168.post-744136250806271414</id><published>2009-02-18T02:39:00.001-08:00</published><updated>2009-02-19T16:10:25.861-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Annotations'/><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><title type='text'>@Annotations</title><content type='html'>O que são as annotations?&lt;br /&gt;Na verdade uma annotation não é nada, somente um enfeite para seu código. WTF? então como elas servem para fazer alguma coisa? Como que eu anoto com @Id meu JPA e ele reconheçe isso?&lt;br /&gt;&lt;br /&gt;Na verdade não é a anotação que vai fazer isso, e sim uma outra classe responsavel por ler suas classes e identificar quais possuem a anotação, e você que criou aquela anotação simples, vai ter que escrever essa classe. Calma não se desespere, vou explicar como funciona :).&lt;br /&gt;&lt;br /&gt;Para criar uma Anotação devemos criar uma interface Java, mas com algumas pequenas mudanças vejam a anotação abaixo&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;public @interface Teste{&lt;br /&gt;  String valor();&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;pronto temos uma anotação criada, o campo abaixo é um atributo da anotação algo que a anotação deve obrigatoriamente conter, você pode deixa-la opcional, adicionando a opção "default"&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;public @interface Teste{&lt;br /&gt;  String valor() default "";&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;As anotações são objetos simples, e eles não aceitam valores null. Vc não pode passar um objeto por exemplo seu JPA para uma anotação (infelizmente).&lt;br /&gt;&lt;br /&gt;E agora para usar como q faz?&lt;br /&gt;vamos criar uma classe de ajuda para nós aqui, ela será a classe que irá executar o comando:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;public class Main{&lt;br /&gt; @Teste(valor="teste")&lt;br /&gt; private String teste;&lt;br /&gt;&lt;br /&gt; public static void main(String[] args){&lt;br /&gt;&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Nossa anotação esta funcionando, mas se vc executar o programa vc simplesmente não verá nada. Mas por que? A Anotação é so um enfeite, existe toda uma programação em reflection por traz (gambiarra?), mas não é tão complicado assim, vamos criar uma classe AnnotationResolver, que vai verificar as anotações para nós:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;public class AnnotationResolver{&lt;br /&gt;  private Class classe;&lt;br /&gt;  private Field[] fields;&lt;br /&gt;  public AnnotationResolver(Class classe){&lt;br /&gt;     this.classe = classe;&lt;br /&gt;     //Isso é reflection carregamos todos os campos da classe informada&lt;br /&gt;     //Esses campos são todos os atributos declarados na classe.&lt;br /&gt;     this.fields = classe.getDeclaredFields();&lt;br /&gt;  }&lt;br /&gt;  public void resolve(){&lt;br /&gt;      for(Field f : fields){&lt;br /&gt;          //Eis aqui a magica do reflection&lt;br /&gt;          //Perguntamos se o campo tem uma anotação, e informamos a classe dessa anotação&lt;br /&gt;          if(f.isAnnotationPresent(Teste.class){&lt;br /&gt;               //Podemos pegar a instancia da anotação desse campo dessa maneira, e assim&lt;br /&gt;               //acessar os campos da anotação&lt;br /&gt;               Teste teste f.getAnnotation(Teste.class);&lt;br /&gt;               System.out.println(teste.valor());&lt;br /&gt;          }&lt;br /&gt;      }&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Para testar nossa classe vamo esditar o metodo main da classe Main, o restante do código já informado acima foi omitido&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;//Codigo omitido&lt;br /&gt;public static void main(String[] args){&lt;br /&gt;  new AnnotationResolver(Main.class).resolve();&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Simples assim temos nossa chamada e veremos nossa anotação funcionando, execute o programa. E vamos ao resultado:&lt;br /&gt;&lt;br /&gt;Nada.&lt;br /&gt;&lt;br /&gt;WTF? O Que eu fiz errado? por que isso não funciona?&lt;br /&gt;Bom apanhei muito para isso funcionar, a anotação tem que ter algumas anotações também (rá), primeiro você deve indicar em que momento a anotação deve ser verificada e depois informar qual o objetivo dela, se ela atige Classes, Metodos ou campos. basta editar nossa anotação e adicionar:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&lt;br /&gt;@Retention(RetentionPolicy.RUNTIME)&lt;br /&gt;@Target(ElementType.FIELD)&lt;br /&gt;public @interface Teste{&lt;br /&gt;//Codigo omitido&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Meio estranho fazer isso mais eu sempre uso o @Retention como RUNTIME, pois é normalmente a hora que eu gosto que as anotações sejam conferidas. Agora compile e rode seu programa.&lt;br /&gt;&lt;br /&gt;E veja só não é que funcionou?&lt;br /&gt;Agora sim você tem um enfeite util para seu projeto Java (nem tão util assim no nosso exemplo).&lt;br /&gt;&lt;br /&gt;De uma conferida no docs da sun:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://java.sun.com/j2se/1.5.0/docs/guide/language/annotations.html"&gt;http://java.sun.com/j2se/1.5.0/docs/guide/language/annotations.html&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4781511741260972168-744136250806271414?l=blog.rollingwithcode.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.rollingwithcode.com/feeds/744136250806271414/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4781511741260972168&amp;postID=744136250806271414&amp;isPopup=true' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4781511741260972168/posts/default/744136250806271414'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4781511741260972168/posts/default/744136250806271414'/><link rel='alternate' type='text/html' href='http://blog.rollingwithcode.com/2009/02/annotations.html' title='@Annotations'/><author><name>Rafael Felix</name><uri>http://www.blogger.com/profile/15945926043992740682</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/_DivtpeF7_5Y/SSP5tBTaJsI/AAAAAAAAATI/84pO0s0CdY0/S220/felix.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4781511741260972168.post-1349176867585400352</id><published>2009-02-16T02:01:00.000-08:00</published><updated>2009-02-17T02:37:21.829-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='RESTful'/><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='JME'/><title type='text'>JME com RESTful</title><content type='html'>Esse eu descobri fuçando na net, pois a muito pouco material sobre isso, que seria como usar o metodo PUT utilizando JME. Atualmente estou na 9ª fase do Curso de Ciência da Computação na &lt;a href="http://www.unoescvda.edu.br/"&gt;UNOESC&lt;/a&gt;, a ultima fase do curso, e estou desenvolvendo meu TCC (Trabalho de Conclusão de Curso), meu projeto consiste em prover acesso a um servidor LDAP (O padrão LDAP, não em um serviço especifico), pelo celular, na verdade irei construir somente um prototipo da aplicação aonde seja possivel criar, editar, excluir e listar os usuários do LDAP.&lt;br /&gt;No começo do projeto, minha intenção seria usar Web Services (XML) e consumir os retorno com o JME, porém ao pesquisar as APIs de consumo de XML para JME, elas são mal documentadas, e os exemplos são criados pela comunidade, algumas APIs você nem acha aonde baixar. Sem contar que o consumo de XML no celular é muito custoso para o aparelho que não tem muitos recursos, eis que a nova versão do &lt;a href="http://www.netbeans.org/"&gt;NetBeans&lt;/a&gt; veio com suporte a RESTful, e resolvi fazer alguns testes, inicialmente iria usar o KXML, e transmitir XML usando RESTful, a listagem eu consegui pegar com a ajuda do &lt;a href="http://www.openldap.org/jldap/"&gt;jLDAP&lt;/a&gt;, uma biblioteca do novell para ajudar a comunicar o java com o LDAP, a biblioteca é bem simples de se usar, e achei ela muito interessante.&lt;br /&gt;Bah, eu não tava afim de usar a biblioteca de parser de XML, não funcionava como eu gostaria, e era bem limita, eis que me surge uma idéia de usar &lt;a href="http://json.org"&gt;JSON&lt;/a&gt;, o Java Script Object Notation, que é um formato de arquivo leve parecido com o &lt;a href="http://yaml.org"&gt;YAML&lt;/a&gt;, mais para minha felicidade, havia bibliotecas para Java e JME para JSON. Maravilha, e ainda por cima o RESTful do Java tem suporte a compoartilhar aquivos JSON.&lt;br /&gt;O GET novamente funcionou perfeitamente, mas e o PUT? não havia jeito de funcionar, e o metodo HTTPConnection do JME suporta somente o GET e POST. Como resolver isso?&lt;br /&gt;Pesquisando na net axei o seguinte &lt;a href="http://www.acidum.de/2008/12/29/j2me-rest-client/"&gt;post&lt;/a&gt;, que falava para simular o PUT como o Rails faz, porém não obtive sucesso dessa maneira, o jeito que encontrei foi o de usar um metodo POST, que consome um JSON e produz um text/plain, seguindo as definições do POST ele precisa retornar algo, vejam o código abaixo:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;    @POST&lt;br /&gt;    @Produces("application/json")&lt;br /&gt;    @Consumes("text/plain")&lt;br /&gt;    public String postJson(String content){&lt;br /&gt;        try {&lt;br /&gt;            JSONObject obj = new JSONObject(content);&lt;br /&gt;            Person person = new PersonApacheDs().fromJSON(obj);&lt;br /&gt;            dao.save(person);&lt;br /&gt;        } catch (LDAPException ex) {&lt;br /&gt;            ex.printStackTrace();&lt;br /&gt;            return ex.getMessage();&lt;br /&gt;        } catch (JSONException ex) {&lt;br /&gt;            ex.printStackTrace();&lt;br /&gt;            return ex.getMessage();&lt;br /&gt;        }&lt;br /&gt;        return "OK";&lt;br /&gt;    }&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;existem algumas classes ai que são do meu projeto é não vou explica-las agora :). Desse modo consegui criar um serviço post que funcione para inserir dados, esse não é o metodo certo, o ideal seria usar o PUT, ainda vou fazer alguns testes, ver bem certo como o rails trabalha com o PUT, e depois eu experimento. No exemplo do outro blog, acima, ele mandava passar a data na URL, agora imagine passar um arquivo JSON na URL? Lógico que não foi aceito, por isso resolvi usar o POST. E para se comunicar é simples, primeiramente você usa um OutputStream para transmitir seus dados.&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;HttpConnection con = (HttpConnection) Connector.open(url, Connector.READ_WRITE);&lt;br /&gt;con.setRequestMethod(HttpConnection.POST);&lt;br /&gt;DataOutputStream dos = con.openDataOutputStream();&lt;br /&gt;String json = obj.toString();&lt;br /&gt;byte[] b = json.getBytes();&lt;br /&gt;for (int i = 0; i &lt; json.length(); i++) {&lt;br /&gt;  dos.writeByte(b[i]);&lt;br /&gt;}&lt;br /&gt;dos.flush();&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;obj é um objeto do tipo JSONObject, que cria o objeto no formato JSON, e para ler vc cria um InputStream atravez da conexão, e pronto, você se comunica perfeitamente com um Serviço REST, meu próximo teste é tentar comunicar com o Rails, que pra quem não sabe utiliza o REST por padrão em todas as paginas.&lt;br /&gt;&lt;br /&gt;Isso ai galera, espero que gostem, qualquer dúvida, ou se alguem conseguiu usar o PUT deixem um comentario ou me mandem por e-mail.&lt;br /&gt;&lt;br /&gt;att&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4781511741260972168-1349176867585400352?l=blog.rollingwithcode.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.rollingwithcode.com/feeds/1349176867585400352/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4781511741260972168&amp;postID=1349176867585400352&amp;isPopup=true' title='3 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4781511741260972168/posts/default/1349176867585400352'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4781511741260972168/posts/default/1349176867585400352'/><link rel='alternate' type='text/html' href='http://blog.rollingwithcode.com/2009/02/jme-com-restful.html' title='JME com RESTful'/><author><name>Rafael Felix</name><uri>http://www.blogger.com/profile/15945926043992740682</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/_DivtpeF7_5Y/SSP5tBTaJsI/AAAAAAAAATI/84pO0s0CdY0/S220/felix.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4781511741260972168.post-8496875873194794142</id><published>2009-01-23T09:58:00.000-08:00</published><updated>2009-01-23T10:06:20.489-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='Testes'/><category scheme='http://www.blogger.com/atom/ns#' term='RSpec'/><category scheme='http://www.blogger.com/atom/ns#' term='Ruby On Rails'/><title type='text'>Testando Seu Código Java com Ruby</title><content type='html'>Galera essa foi muito boa, eu procurando sobre usar o &lt;a href="http://en.wikipedia.org/wiki/Behavior_Driven_Development"&gt;BDD&lt;/a&gt; em Java, algo parecido com o &lt;a href="http://rspec.info/"&gt;RSpec&lt;/a&gt;, que gosto tanto, e me familiarizei fácil usando no Rails. Achei um que pareceu interessante o &lt;a href="http://jbehave.org/"&gt;JBehave&lt;/a&gt;, porém parecia mais com os Stories do RSpec, é não com os Spec, que era justamente o que eu queria, também encontrei um tal de &lt;a href="http://www.jdave.org/"&gt;JDave&lt;/a&gt;, mas ainda é um projeto embrionário, e resolvi procurar se havia uma versão do RSpec para Java, eis que caio no &lt;a href="http://ola-bini.blogspot.com/2007/07/rspec-and-rbehave-runs-on-jruby.html"&gt;Blog do Ola Bini&lt;/a&gt;, um dos Team Leaders do &lt;a href="http://jruby.codehaus.org/"&gt;JRuby&lt;/a&gt;, e ele mostra usando o RSpec com Java usando JRuby. Não era bem isso que queria, mas mesmo assim, resolvi experimentar, nunca mexi muito com o JRuby, já brinquei com Java e Ruby separados mas não nessa versão, usando recurso das duas linguagens juntas. Então lá fui eu copiar o exemplo do Ola Bini, e para minha surpresa funcionou muito bem, melhor do que eu esperava. Então pequei um código e comecei a testar para ver se funcionava com minhas entidades, testar um programa escrito em puro Java, em outras palavras  usar as classes do Projeto e as do Ruby juntas.&lt;br /&gt;&lt;br /&gt;Então comecei a luta para o JRuby reconhecer minhas classes, e após algumas tentativas frustradas, que incluíam adicionar o jar do Projeto no classpath, não funcionou. Estava pronto para estudar o JDave ou o JBehave, quando recorri ao senhor supremo da internet, o Google. Encontrei uma wiki sobre JRuby, e lá tinha um código relativamente ridículo, que eles diziam que adicionava a biblioteca ao JRuby. Vejam o código simples:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;require "caminho/para/arquivo.jar"&lt;br /&gt;module Models&lt;br /&gt; include_package "pacote/suppacote"&lt;br /&gt;end&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Um Module em ruby, é quase uma classe, ele é um complemento para uma classe, todo o código de um module incorporado a uma classe pode ser usado, sem restrição (ou talvez haja e eu não sei, não estudei muito essa parte.). Esse module só vai simplificar nosso trabalho, ao invés de fazer a chamada usando o padrão do JRuby que é de:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;pacote.subpacote.Classe&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Chamamos direto pelo estilo Ruby de Models::Classe, pode parecer poca coisa mais se você for seguir as convenções da Sun da um caminho grande até a classe.&lt;br /&gt;&lt;br /&gt;Agora sim podemos criar nossos testes com o JRuby usando projetos Java. Vocês podem ver o exemplo do Ola Bini, e testar suas classe com o RSpec, caso não saiba ainda utilizar o RSpec, é uma chance de aprender. Para você usar na sua classe de Teste, tem que adicionar também no início do arquivo o require do seu module como, por exemplo:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;require "caminho/para/models.rb"&lt;br /&gt;&lt;/code&gt; &lt;br /&gt;&lt;br /&gt;Assim você pode usar qualquer classe do seu Projeto.jar sem problemas e testa-las usando RSpec. Pra que sofrer com JUnit?&lt;br /&gt;&lt;br /&gt;Logo logo sai um artigo sobre MVC em PHP a pedido do meu amigo Renato, aguardem.&lt;br /&gt;&lt;br /&gt;[]'s&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4781511741260972168-8496875873194794142?l=blog.rollingwithcode.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.rollingwithcode.com/feeds/8496875873194794142/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4781511741260972168&amp;postID=8496875873194794142&amp;isPopup=true' title='1 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4781511741260972168/posts/default/8496875873194794142'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4781511741260972168/posts/default/8496875873194794142'/><link rel='alternate' type='text/html' href='http://blog.rollingwithcode.com/2009/01/testando-seu-cdigo-java-com-ruby.html' title='Testando Seu Código Java com Ruby'/><author><name>Rafael Felix</name><uri>http://www.blogger.com/profile/15945926043992740682</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/_DivtpeF7_5Y/SSP5tBTaJsI/AAAAAAAAATI/84pO0s0CdY0/S220/felix.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4781511741260972168.post-1071167285498016375</id><published>2009-01-11T17:31:00.000-08:00</published><updated>2009-01-12T01:48:27.679-08:00</updated><title type='text'>ActsAsPoll – meu primeiro plugin para Rails</title><content type='html'>Galera é com muita felicidade que comunico a todos que acabei de publicar no github, meu primeiro plugin, o &lt;a href="http://github.com/fellix/acts_as_poll/tree/master" target="_blank"&gt;ActsAsPoll&lt;/a&gt;, ele está bem simples, e provavelmente não está bem escrito, por isso ele esta disponivel para quem quiser ajudar no desenvolvimento do mesmo.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;O que ele faz?&lt;/b&gt;&lt;br /&gt;Esse plugin cria enquetes para um site em Rails, contendo a votação, e uma tela de resultado usando AJAX.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Como se usa?&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Para utiliza-lo faça o download do github usando o comando&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;script/plugin install git://github.com/fellix/acts_as_poll.git&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;assim está instalado o plugin na sua aplicação, para utilizado você precisará gerar os arquivos principais utilizando o gerador poll, bem simples de se criar basta utilizar o comando:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;script/generate poll poll&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;o primerio parametro e o generator poll que vem junto com o plugin, e o segundo argumento e o nome que será utilizado por migrações, models, controllers, etc. Executando esse comando serão criados alguns arquivos:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;2 migrações, uma para a classe Poll, e outra para a classe PollOption&lt;/li&gt;&lt;br /&gt;&lt;li&gt;2 models, cada um correspondente a cada migração&lt;/li&gt;&lt;br /&gt;&lt;li&gt;1 controller, que vai gerenciar a votação via AJAX&lt;/li&gt;&lt;br /&gt;&lt;li&gt;2 partials, na pasta shared, que se não existir será criada. Uma delas monta o formulário de votação, e o outro mostra o resultado na tela.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;E por ultimo 1 helper na pasta app/helpers, PollHelper, que conterá um metodo de ajuda que renderizará o partial que monta o formulário de votação.&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;Por enquanto o plugin não contem a parte de administração e cadastro de enquetes, mas está nos planos, caso alguém queira ajudar, essa é a hora :).&lt;br /&gt;Com esse material você já pode usar a enquete, como citei anteriormente ele usa AJAX, certifique-se que no seu application.html.erb possui a tag &lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;javascript_include_tag :defaults&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;e em alguma view que você queira mostrar a enquete pasta chamar o metodo helper poller e passar como parametro o argumento uma variavel do tipo Poll, e ele montará um formulário para votação.&lt;br /&gt;Também é possível utilizar os metodos do ActiveRecord como por exemplo: &lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;poller(Poll.find(1))&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;assim teria montada a enquete com o ID 1 no sua página. Inicialmente está bem simples, pretendo melhorar mais tarde, a ideia principal é deixa-lo simples, ainda há diversas ideias a serem colocadas no projeto, como por exemplo um gerador randomico, que pegaria uma enquete randomica a cada request, essa pode ser para um futuro update.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4781511741260972168-1071167285498016375?l=blog.rollingwithcode.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.rollingwithcode.com/feeds/1071167285498016375/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4781511741260972168&amp;postID=1071167285498016375&amp;isPopup=true' title='1 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4781511741260972168/posts/default/1071167285498016375'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4781511741260972168/posts/default/1071167285498016375'/><link rel='alternate' type='text/html' href='http://blog.rollingwithcode.com/2009/01/actsaspoll-meu-primeiro-plugin-para.html' title='ActsAsPoll – meu primeiro plugin para Rails'/><author><name>Rafael Felix</name><uri>http://www.blogger.com/profile/15945926043992740682</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/_DivtpeF7_5Y/SSP5tBTaJsI/AAAAAAAAATI/84pO0s0CdY0/S220/felix.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4781511741260972168.post-666921598506537476</id><published>2009-01-08T01:19:00.000-08:00</published><updated>2009-01-09T01:31:05.150-08:00</updated><title type='text'>Utilizando restful_authorization e restful_authentication</title><content type='html'>Esse tema estava no &lt;a href="http://groups.google.com/group/rails-br"&gt;rails-br&lt;/a&gt;, e tinha um comentario de que faltavam documentos em português explicando o uso desses dois excelentes plugin para rails.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;O que são e o que fazem?&lt;/b&gt;&lt;br /&gt;o &lt;a href="http://github.com/technoweenie/restful-authentication/tree/master"&gt;restful_authentication&lt;/a&gt; é um plugin que faz o login de um usuário de acordo com o uma tabela no banco.&lt;br /&gt;e o &lt;a href="http://github.com/jbarket/restful-authorization/tree/master"&gt;restful_authorization&lt;/a&gt; é um plugin que funciona com o authentication, ele ministra as regras de authenticação de um usuário, as permissões de acesso.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Instalando&lt;/b&gt;&lt;br /&gt;Você não precisa do authorization caso deseje somente um login.&lt;br /&gt;para instalar vamos instalar apartir do github, faça o dowload do git, para o seu sistema operacional, como uso Ubuntu, para quem usa também basta utilizar&lt;br /&gt;&lt;div id="more"&gt;&lt;br /&gt;&lt;code&gt;sudo apt-get install git-core&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;agora basta criar uma aplicação em rails, levando em consideração que já deve ter o ruby, rails e git instalados.&lt;br /&gt;&lt;br /&gt;&lt;code&gt;rails teste&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;agora vamos instalar nossos plugins, quando se instala um plugin do github, ele cria um repositorio git, onde vc pode atualizar seu plugin sem problemas, vamos ao que insteressa, instalando os plugins&lt;br /&gt;&lt;br /&gt;&lt;code&gt;script/plugin install git://github.com/technoweenie/restful-authentication.git&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;code&gt;script/plugin install git://github.com/jbarket/restful-authorization.git &lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Na pasta teste/vendor/plugins, foram adicionadas duas pastas os nossos queridos plugins.&lt;br /&gt;&lt;br /&gt;Agora a unica coisa que precisamos é chamar os respectivos generators, no restful-atuthorization o README esta com problemas, pois o generator dele esta com nome diferente, apenas um pequeno detalhe.&lt;br /&gt;&lt;br /&gt;vamos criar então nosso model de autenticação&lt;br /&gt;&lt;br /&gt;&lt;code&gt;script/generate authenticated user sessions&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;explicando detalhadamente esse comando, estamos gerando um model chamado user, e um controller chamado sessions, o model user, vai ser nosso modelo em tabela para fazer o login, e o controller sessions, vai ser o responsavel pelos logins e logouts.&lt;br /&gt;&lt;br /&gt;Apos rodar o generator ele adiciona algumas rotas ao seu routes.rb&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;map.logout '/logout', :controller =&gt; 'sessions', :action =&gt; 'destroy'&lt;br /&gt;map.login '/login', :controller =&gt; 'sessions', :action =&gt; 'new'&lt;br /&gt;map.register '/register', :controller =&gt; 'users', :action =&gt; 'create'&lt;br /&gt;map.signup '/signup', :controller =&gt; 'users', :action =&gt; 'new'&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;você pode usar logout_path nos controllers, logout_url nas views etc.&lt;br /&gt;&lt;br /&gt;para utilizar em algum controller as validações vc tem que adicionar um include no seu controller&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt; include AuthenticatedSystem&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Após fazer fazer isso vc pode usar self.current_user que vai lhe retornar o usuário logado atualmente.&lt;br /&gt;&lt;br /&gt;para abrir a tela de registro de usuário utilize localhost:3000/singup e pode se registrar e criar uma conta, e em localhost:3000/login&lt;br /&gt;&lt;br /&gt;tem um metodo que ajuda muito é o logged_in?, pode ser usado para verificar se um usuário está logado. por exemplo em um before_filter em um controler, ou em uma view para verificar se o usuário esta logado.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Utilizando o Restful-Authorization&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;O restful-authorizaiton, esta com um problema no README, pois o generator esta com nome diferente, mas nada que va estragar seu sono.&lt;br /&gt;Para gerar as autorizações precisamos de alguns parametros&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;script/generate authorized role user&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;São dois simples parametros que devemos utilizar, um deles é o novo modelo, o role, que vai manter as regras da aplicação, é um model bem simples. O segundo parametro é o model que pertence ao restful-authentication, que nós criamos acima.&lt;br /&gt;&lt;br /&gt;Após rodar o comando acima, se abrirmos nossa classe user, veremos que alguns detalhes foram adicionados nela&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;  has_and_belongs_to_many :roles&lt;br /&gt;&lt;br /&gt;  &lt;br /&gt;&lt;br /&gt;  # has_role? simply needs to return true or false whether a user has a role or not.  &lt;br /&gt;&lt;br /&gt;  # It may be a good idea to have "admin" roles return true always&lt;br /&gt;&lt;br /&gt;  def has_role?(role_in_question)&lt;br /&gt;&lt;br /&gt;    @roles_list ||= self.roles.collect(&amp;:name).collect(&amp;:downcase)&lt;br /&gt;&lt;br /&gt;    return true if @roles_list.include?("admin")&lt;br /&gt;&lt;br /&gt;    (@roles_list.include?(role_in_question.downcase.to_s))&lt;br /&gt;&lt;br /&gt;  end&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;um novo metodo (has_role?) foi criado na classe e podemos utilizado para os usuário, ele verifica se o usuário possui alguma role, percebem a detalhe, já tem uma validação caso a role seja admin, que por padrão ira permitir tudo ao usuario.&lt;br /&gt;&lt;br /&gt;Em qualquer lugar da apliçao que você possa chamar o self.current_user (veja mais acima), também poderá chamar o metodo has_role?&lt;br /&gt;&lt;br /&gt;Ex:&lt;br /&gt;self.current_user.has_role?("financeiro")&lt;br /&gt;&lt;br /&gt;retornará true se o usuário atual tem a regra financeiro.&lt;br /&gt;&lt;br /&gt;Essa segunda parte, eu nunca testei, mas segundo README no github do restful-authorization você pode deixar ele mesmo filtrar pelas regras adicionando em algum controle o comando:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;authorized_role :financeiro&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;e assim ele vai validar se o usuário possui a role determinada no controller.&lt;br /&gt;&lt;br /&gt;Muito util e simples.&lt;br /&gt;Espero que tenha ajudado&lt;br /&gt;&lt;br /&gt;Até a próxima&lt;br /&gt;&lt;br /&gt;[]'s&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4781511741260972168-666921598506537476?l=blog.rollingwithcode.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.rollingwithcode.com/feeds/666921598506537476/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4781511741260972168&amp;postID=666921598506537476&amp;isPopup=true' title='1 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4781511741260972168/posts/default/666921598506537476'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4781511741260972168/posts/default/666921598506537476'/><link rel='alternate' type='text/html' href='http://blog.rollingwithcode.com/2009/01/utilizando-restfulauthorization-e.html' title='Utilizando restful_authorization e restful_authentication'/><author><name>Rafael Felix</name><uri>http://www.blogger.com/profile/15945926043992740682</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/_DivtpeF7_5Y/SSP5tBTaJsI/AAAAAAAAATI/84pO0s0CdY0/S220/felix.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4781511741260972168.post-6725391484267545431</id><published>2008-12-26T01:55:00.000-08:00</published><updated>2008-12-26T02:03:37.853-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='bla bla bla'/><category scheme='http://www.blogger.com/atom/ns#' term='Ruby On Rails'/><title type='text'>Rails e Merb</title><content type='html'>Essa guerra começou a pouco tempo e já terminou, e pra mim isso não é um bom sinal. Como alguns que participam da comunidade de Ruby, sabem que o Merb é outro framework para desenvolvimento web, eu ainda não tive tempo de brincar com ele, e gostaria de tirar um tempo logo para ver seu funcionamento. Porém ao chegar hoje de manhã, me deparo com a principal noticia da comunidade, o fim da guerra de Rails X Merb, a união das duas equipes para criar um só framework.&lt;br /&gt;&lt;br /&gt;Porém ao meu ver isso não é uma boa coisa, a Guerra fria entre esses dois frameworks poderia trazer muito mais recursos e evolução para a comunidade Ruby, com essa união, finda-se a guerra, e o Rails continua absoluto. Não a concorrentes ou alguem com quem disputar espaço, então pra que correr? Pra que melhorar de forma desenfreada? Acredito que se essa fusão esperasse mais teríamos frameworks bem melhores,e quem sabe uma opção diferente ao Rails. Muita gente pode me criticar por essa opnião, não estou dizendo que a fusão é ruim, mas poderia levar mais algum tempo. A guerra fria entre EUA X URSS, trouxe toda a evolução que temos hoje, foi um grande passo para a humanidade, e acredito que se a guerra do Ruby para Web continuasse quem sabe os frameworks não melhorariam bem mais.&lt;br /&gt;&lt;br /&gt;Detalhes&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://www.akitaonrails.com/2008/12/23/bomba-merb-e-rails-se-fundem" target="_blank"&gt;Akita on Rails&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://www.nomedojogo.com/2008/12/23/o-dia-em-que-o-merb-se-juntou-ao-rails/" target="_blank"&gt;Nome do Jogo&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://yehudakatz.com/2008/12/23/rails-and-merb-merge/" target="_blank"&gt;&lt;br /&gt;Yehuda Katz (Merb Core)&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4781511741260972168-6725391484267545431?l=blog.rollingwithcode.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.rollingwithcode.com/feeds/6725391484267545431/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4781511741260972168&amp;postID=6725391484267545431&amp;isPopup=true' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4781511741260972168/posts/default/6725391484267545431'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4781511741260972168/posts/default/6725391484267545431'/><link rel='alternate' type='text/html' href='http://blog.rollingwithcode.com/2008/12/rails-e-merb.html' title='Rails e Merb'/><author><name>Rafael Felix</name><uri>http://www.blogger.com/profile/15945926043992740682</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/_DivtpeF7_5Y/SSP5tBTaJsI/AAAAAAAAATI/84pO0s0CdY0/S220/felix.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4781511741260972168.post-4272250722686027276</id><published>2008-12-19T09:11:00.000-08:00</published><updated>2008-12-26T09:37:12.687-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Tradução'/><category scheme='http://www.blogger.com/atom/ns#' term='bla bla bla'/><title type='text'>[Tradução] Se Lingagues de Programação Fossem Religiões</title><content type='html'>Achei esse texto muito interessante e resolvi traduzir e posta-lo aqui.&lt;br /&gt;Podem confirir o Original clicando &lt;a href="http://www.aegisub.net/2008/12/if-programming-languages-were-religions.html" target="_blank"&gt;Aqui&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;"Se linguagens de programação fossem religiões"&lt;br /&gt;(Inspirado por "&lt;a href="http://www.cs.caltech.edu/%7Emvanier/hacking/rants/cars.html" target="_blank"&gt;Se linguagens de programação fossem carros&lt;/a&gt;")&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;C&lt;/span&gt; seria o &lt;span style="font-weight: bold;"&gt;Judaismo&lt;/span&gt; - é antiga e restritiva, mas o mundo está familiarizado com suas leis e respeita-os. Você não pode ser converter a ele - ou você começa do inicio, ou você irá achar que é tudo insano. Além disso, quando as coisas dão errado, muitas pessoas estão dispostas a culpar os problemas do mundo por isso.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Java&lt;/span&gt; seria o &lt;span style="font-weight: bold;"&gt;Cristianismo Fundametalista&lt;/span&gt; - É teoricamente baseado no C, mas ele foge de muitas das velhas leis que ele não sente de todo originais. Em vez disso, adiciona suas proprias regras rigidas, assim seus seguidores se sentirão superiores ao original. Não somente estão certos de que essa é a melhor linguagem do mundo, como estão prontos para queimar quem os desagradar.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;PHP&lt;/span&gt; seria como o &lt;span style="font-weight: bold;"&gt;Cristianismo não praticante&lt;/span&gt; - Luta com Java pelo mercado da web. Tem vários conceitos de C e Java, mas apenas aqueles que realmente gosta. Não é coerente como as outras linguagens, mas pelo menos leh deixa muita mais livre e ostensivamente mantém a essencia da idéia. Além disso, todo o conceito do "goto hell" (vai para o inferno) foi abandonado.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;C++&lt;/span&gt; seria como o &lt;span style="font-weight: bold;"&gt;Islamismo&lt;/span&gt; - Pegou C e não só manteve todas as suas leis como adicionou um novo conjunto de leis no topo dessas. É tão versatil que pode ser usado na criação de qualquer coisa, de grandes atrocidades a lindos trabalhos de arte. Seus seguidores estão convictos que essa é a ultima linguagem universal, e ficam irritados com quem discordar deles. Além disso, se você insultar eles ou seu criador, você provavelmente será ameaçado de morte pelos seguidores mais radicais.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;C#&lt;/span&gt; é como os &lt;span style="font-weight: bold;"&gt;Mormons&lt;/span&gt; - A primeira vista, é como o Java, mas ao olhar mais de perto, você verá que é controlada por somente uma corporação ( que muitos seguidores do Java dizem ser malvada), e alguns conceitos teologicos são levemente diferentes. Você suspeitaria que ela provavelmente é legal, se você não fosse discriminado por todos os seguidores de Java por seguir ele.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Lisp&lt;/span&gt; é como o &lt;span style="font-weight: bold;"&gt;Budismo&lt;/span&gt; - Ele não tem sintaxe, não tem centralização de dogmas, e não possuem santos. O universo inteiro está ai ao seu alcançe - só se você estiver esclarecido o suficiente para pega-lo. Alguns dizem que não é uma linguagem, outros dizem que é a unica linguagem que faz sentido.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Haskell&lt;/span&gt; é como o &lt;span style="font-weight: bold;"&gt;Taoismo&lt;/span&gt; - Ele é tão diferente das outras linguagens que muitas pessoas não entendem como alguem produz algo util com isso. Seus seguidores acreditam que esse é o caminho correto para a sabedoria, mas essa sabedoria está além do alcançe da maioria dos mortais.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;Erlang&lt;/span&gt; seria como o &lt;span style="font-weight: bold;"&gt;Hinduismo&lt;/span&gt; - Essa é outra estranha linguagem que quem olha não consegue ve-la ser util, mas diferente da maioria das linguagens modernas, foi construida no conceito de multiplos e simultaneos santos.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Perl&lt;/span&gt; é como o &lt;span style="font-weight: bold;"&gt;Voodoo&lt;/span&gt; - Uma incompreensivel seria de encatamentos de arcanos que envolve sangue de cabras e corrompe sua alma permanentemente. Frequentemente usada quando seu chefe quer uma tarefa urgente para as 21hrs de sexta.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Lua&lt;/span&gt; seria como &lt;span style="font-weight: bold;"&gt;Wicca&lt;/span&gt; - Uma linguagem panteísta que pode facilmente ser adaptada para diferentes culturas ou locais. Seu código é muito liberal, e permite o uso de técnicas que podem ser descritas como mágicas pelas mais tradicionais linguagens. Tem uma estranha ligação com a lua.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Ruby&lt;/span&gt; seria como o &lt;span style="font-weight: bold;"&gt;Novo paganismo&lt;/span&gt; - Uma mistura de diferentes linguagens e ideias que foi socado dentro de algo conhecido como linguagem. Seus adeptos estão crescendo rapidamente, com isso muitas pessoas olham para ele com suspeitas, são normalmente pessoas bem intencionadas sem intenção de prejudicar ninguém.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Python&lt;/span&gt; seria como o &lt;span style="font-weight: bold;"&gt;Humanismo&lt;/span&gt; - Simples, sem restrições, e tudo que você precisa para segui-lo é o senso comum. Muitos dos seguidores afirmam-se livres dos encargos impostos por outras linguagens, e que redescobriram o prazer de programar. Há quem diga que é somente uma forma de pseudo-código.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;COBOL&lt;/span&gt; é como o &lt;span style="font-weight: bold;"&gt;Antigo Paganismo&lt;/span&gt; - Teve um tempo que comandou uma vasta região e foi muito importante, mas nos dias de hoje está praticamente morto, para o bem de todos nós. Emboram muitos ainda estejam marcados por seus rituais, há muitos que insistem em mante-lo vivo.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;APL&lt;/span&gt; seria como &lt;span style="font-weight: bold;"&gt;Cientologia&lt;/span&gt; - Existem muitas pessoas que clamam para segui-lo, mas você sempre suspeitará que é uma grande e elaborada pirraça que irá fugir do seu controle.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;LOLCODE &lt;/span&gt;seria como &lt;span style="font-weight: bold;"&gt;Pastafarianism&lt;/span&gt;(WTF!?!?) - Uma exoterica, nascida na internet e que ninguem leva a serio, ignorando todos os esforços para desenvolve-la e dissemina-la.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;Visual Basic&lt;/span&gt; seria como o &lt;span style="font-weight: bold;"&gt;Satanismo&lt;/span&gt; - Exceto que você realmente não precisa vender sua alma para ser um satanista.&lt;br /&gt;&lt;br /&gt;Desculpem-me pelos erros, se alguma coisa ficou traduzida errada me corrigam.&lt;br /&gt;&lt;br /&gt;[]'s&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4781511741260972168-4272250722686027276?l=blog.rollingwithcode.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.rollingwithcode.com/feeds/4272250722686027276/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4781511741260972168&amp;postID=4272250722686027276&amp;isPopup=true' title='2 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4781511741260972168/posts/default/4272250722686027276'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4781511741260972168/posts/default/4272250722686027276'/><link rel='alternate' type='text/html' href='http://blog.rollingwithcode.com/2008/12/traduo-se-lingagues-de-programao-fossem.html' title='[Tradução] Se Lingagues de Programação Fossem Religiões'/><author><name>Rafael Felix</name><uri>http://www.blogger.com/profile/15945926043992740682</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/_DivtpeF7_5Y/SSP5tBTaJsI/AAAAAAAAATI/84pO0s0CdY0/S220/felix.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4781511741260972168.post-2316448780770877823</id><published>2008-12-16T06:32:00.000-08:00</published><updated>2008-12-16T07:03:25.384-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><category scheme='http://www.blogger.com/atom/ns#' term='RIA'/><category scheme='http://www.blogger.com/atom/ns#' term='Tendencias'/><title type='text'>RIA - O Futuro da Web</title><content type='html'>Estive a um bom tempo pensando em escrever algo sobre isso. O Futuro da Web maketeiramente conhecida como Web 2.0 e o RIA seria algo como a Web 3.0. Mas que droga seria essa? o que exatamente seria esse tal de RIA.&lt;br /&gt;&lt;br /&gt;RIA é uma sigla para Rich Internet Application, é um termo bem visado por muitas empresas e apadrinhado principalmente pelo Google, o GMail é um grande exemplo de uma Aplicação Rica. Na verdade o RIA nada mais é que uma montoeira de coisa velha em uma sigla nova. RIA usa muito do AJAX, JavaScript.&lt;br /&gt;&lt;br /&gt;AJAX, não é o multi uso não,  e tem diversas definições no Google sobre o AJAX, não vou entrar em detalhes aqui. O uso de JavaScript, menosprezado durante muito tempo, agora tudo gira em torno dessa linguagem. Nada mais natural pois todos os desenvolvedores procuram dar mais interatividade entre o cliente e sua página e o JavaScript é suportado por todos os browsers, lógico que alguns trabalham diferente com ele (IE), até o Acrobat Reader suporta JavaScript, nunca testei, mas ouvi dizer.&lt;br /&gt;&lt;br /&gt;O que me levou a escrever sobre isso foi olhando no meu iGoogle algumas noticias e de caro vejo duas que me chamaram a atenção:&lt;br /&gt;&lt;a href="http://meiobit.pop.com.br/meio-bit/web-20/sun-lanca-o-javafx-10-rich-internet-applications-ria-para-o-" title="Sun lança o JavaFX 1.0 - Rich Internet Applications (RIA) para o Java"&gt;Sun lança o JavaFX 1.0 - Rich Internet Applications (RIA) para o Java&lt;/a&gt;&lt;br /&gt;&lt;a href="http://br-linux.org/2008/red-hat-e-google-em-parceria-para-desenvolvimento-de-rias/" rel="bookmark" title="Permanent Link: Red Hat e Google em parceria para desenvolvimento de RIAs"&gt;Red Hat e Google em parceria para desenvolvimento de RIAs&lt;/a&gt;&lt;br /&gt;JavaFX pra quem é da comunidade Java já conhece, é uma promessa do Java, digamos uma versão WPF open source, pra quem não conhece WPF é da Microsoft, trabalha com Silverlight,e server tanto para Desktop quanto para Web, e é voltada para Designers, não para desenvolvedores. JavaFX é a mesma coisa, mas a diferença é que WPF é visual, já JavaFX é uma linguagem de Scripts, muito simples, que eu particularmente, não gostei :P.&lt;br /&gt;&lt;br /&gt;Já parceria da Red Hat com  o Google é para o fortalecimento do GWT, Google Web Toolkit, para um suporte ao JBoss, o GWT eu particularmente gosto muito dele, mas o problema é que assim como eu muita gente tem a opnião errada dele, assim como eu tinha. o GWT é um Framework que converte código Java em JavaScript, você pode adapta-lo para qualquer linguagem pois a saida é html, js e css. O Objetivo do GWT é criar somente a aplicação, o core, a parte principal, o restante do site vc faz na linguagem que quiser. o GWT monta um interface parecida com a do GMail, e é muito divertido brincar com ele.&lt;br /&gt;&lt;br /&gt;Na minha singela opnião RIA é o futuro, acredito que devemos nos dedicar um pouco a essa area que muitas vezes é deixada de lado, mas acredito que quem não apostar em interfaces mais ricas, com maior interatividade com o usuario irá perder espaço, a maioria dos frameworks que estão surgindo ou evoluindo facilitam o AJAX nas paginas, e esse é o caminho (Ruby on Rails é um desses frameworks com o esquema de templates deles você pode criar arquivos .rjs que se transformam em paginas utilizando AJAX, não vou me deter sobre isso não vocês podem achar muito disso e bem explicado por ai), aprender JavaScript pode se tornar fundamental, então? Mãos a obra&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4781511741260972168-2316448780770877823?l=blog.rollingwithcode.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.rollingwithcode.com/feeds/2316448780770877823/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4781511741260972168&amp;postID=2316448780770877823&amp;isPopup=true' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4781511741260972168/posts/default/2316448780770877823'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4781511741260972168/posts/default/2316448780770877823'/><link rel='alternate' type='text/html' href='http://blog.rollingwithcode.com/2008/12/ria-o-futuro-da-web.html' title='RIA - O Futuro da Web'/><author><name>Rafael Felix</name><uri>http://www.blogger.com/profile/15945926043992740682</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/_DivtpeF7_5Y/SSP5tBTaJsI/AAAAAAAAATI/84pO0s0CdY0/S220/felix.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4781511741260972168.post-648575788669736422</id><published>2008-12-11T02:19:00.000-08:00</published><updated>2008-12-11T02:38:09.061-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><title type='text'>Dialog Box em JavaScript</title><content type='html'>Vasculhando pela net procurando um esquema de Dialog Box em JavaScript, para criar alguns efeitos mais iterativos, encontrei nessa página&lt;br /&gt;http://www.leigeber.com/2008/04/custom-javascript-dialog-boxes/&lt;br /&gt;um esquema de Dialog Box bem simples e funcional, testando e aprovado, é bem simples de editar, o código não é dificil de se alterar, pois está bem escrito.&lt;br /&gt;&lt;br /&gt;Ele funciona com um serie de divs que vc pode criar ou deixar ele criar dinamicamente, lógico que quando ele cria dinamicamente as box elas so contem mensagens de texto. Mas você pode editar isso. Basta criar os divs.&lt;br /&gt;&lt;br /&gt;O Arquivo (dialog_box.js) vem escrito por padrão com somente duas opções, ou você deixa ele criar tudo, ou você cria todos os divs, que por padrão devem ter os ids&lt;br /&gt;'dialog', 'dialog-header', 'dialog-title', 'dialog-close', 'dialog-content', 'dialog-mask'.&lt;br /&gt;&lt;br /&gt;Como podem ver são bastantinhos divs a serem criados, e eu como sou meio vadio para essas coisas prefiro so criar um, o 'dialog-content', que é o dialog que contem o conteudo da janela.&lt;br /&gt;&lt;br /&gt;uma simples edição no JavaScript pode resolver isso.&lt;br /&gt;Na função&lt;br /&gt;&lt;span&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;function&lt;/span&gt; showDialog&lt;br /&gt;&lt;br /&gt;deve se procurar pela linha&lt;br /&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;if(!document.getElementById('dialog')) {&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;e aonde procurar dentro deste if uma definição do conteudo&lt;br /&gt;dialogcontent = document.createElement('div');&lt;br /&gt;antes dessa linha basta criar uma condição para ele não criar o elemento e sim utilizar o div que criariamos na pagina, lembrando que o div alem do id=content-dialog deve ter style="visibily: hidden".&lt;br /&gt;Adicionamos então o seguinte código&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;if&lt;/span&gt;(!&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; document.getElementById('div-content')){&lt;br /&gt;//Aqui vai o código que ja tinha no arquivo&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;dialogcontent = docum...&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;}&lt;span style="color: rgb(51, 51, 255);"&gt;else&lt;/span&gt;{&lt;br /&gt;dialogcontent = &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;document.getElementById('div-content');&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;}&lt;br /&gt;&lt;br /&gt;e por ultimo mas não menos importante basta comentar a seguinte linha&lt;br /&gt;dialogcontent.innerHTML = message;&lt;br /&gt;&lt;br /&gt;agora sim, a função showDialog se encontrar um div com o id= div-content, vai pegar esse div e todo seu conteudo e mostrar na janela do tipo que foi escolhido.&lt;br /&gt;&lt;br /&gt;Caso não esteja claro, podem perguntar nos comentarios, qualquer coisa disponibilizo o arquivo editado para download.&lt;br /&gt;&lt;br /&gt;[]'s&lt;br /&gt;até a proxima&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4781511741260972168-648575788669736422?l=blog.rollingwithcode.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.rollingwithcode.com/feeds/648575788669736422/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4781511741260972168&amp;postID=648575788669736422&amp;isPopup=true' title='1 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4781511741260972168/posts/default/648575788669736422'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4781511741260972168/posts/default/648575788669736422'/><link rel='alternate' type='text/html' href='http://blog.rollingwithcode.com/2008/12/dialog-box-em-javascript.html' title='Dialog Box em JavaScript'/><author><name>Rafael Felix</name><uri>http://www.blogger.com/profile/15945926043992740682</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/_DivtpeF7_5Y/SSP5tBTaJsI/AAAAAAAAATI/84pO0s0CdY0/S220/felix.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4781511741260972168.post-4205070231995720320</id><published>2008-12-03T08:59:00.000-08:00</published><updated>2008-12-03T09:03:57.313-08:00</updated><title type='text'>Seguindo Padrões</title><content type='html'>Uma coisa não tão comum no desenvolvimento de software, normalmente de algumas empresas, é a falta de padronização, até por que as maiorias das empresas de desenvolvimento começam do nada com um pequeno software e depois com o aumento de clientes acabam tendo que contratar mais pessoas para trabalhar, e cada um tem seu estilo, muitas vezes não há um padrão a ser seguido, eis que surge o que vou falar agora.&lt;br /&gt;&lt;br /&gt;O que me questiono é que normalmente um código sem padronização acaba saindo estranho, códigos repetitivos sem necessidade, onde tudo poderia ser mais fácil e mais rápido a falta de Padrões de Projeto, Pra que ficar abrindo conexões com o banco sem necessidade? Mas o que mais me surpreende é a falta de Controle de Versão, como se não tivéssemos opções suficientes (&lt;a href="http://git.or.cz/" target="_blank"&gt;Git&lt;/a&gt;, CVS, SVN, Mercurial, etc), muitos desenvolvedores nem saber o que é um Controle de Versão nem pra que serve.&lt;br /&gt;Eu sempre gostei do CVS e quando conheci o Git gostei muito dele, ele foi feito por nada mais nada menos que Linus Torvalds para controlar a versão do kernel do Linux, mas não estou aqui para falar de cada um deles nem de como funcionam vocês podem achar isso no nosso querido amigo Google. A grande vantagem de se usar o versionamento é que você sempre saberá quem fez aquela cagada no código.&lt;br /&gt;&lt;br /&gt;Por exemplo, seu código funciona redondinho e tudo certo, porém alguém da sua equipe atualizou, mas não testou as outras partes, você atualiza a versão original, e logo depois um cliente liga dizendo que tal tela não esta mais funcionando, e ao averiguar você percebe que aquele código a mais estragou outra parte do sistema, e agora como voltar? Dificilmente quem modificou vai lembrar-se de onde modificou, e o que modificou. Com o controle de versão você pode saber exatamente o que foi modificado e aonde foi, assim se torna mais fácil de concertar o problema (gambiarrizar ou não). Só por esse motivo já valeria a pena, sem contar em branches e tags onde pode ser dividida a codificação sem interferir no código principal do projeto, só depois de analisado e testado é feito o merge (mesclar). E garanto, vale muito a pena usar Controle de Versão.&lt;br /&gt;&lt;br /&gt;O que esta esperando? Comece agora!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4781511741260972168-4205070231995720320?l=blog.rollingwithcode.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.rollingwithcode.com/feeds/4205070231995720320/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4781511741260972168&amp;postID=4205070231995720320&amp;isPopup=true' title='1 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4781511741260972168/posts/default/4205070231995720320'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4781511741260972168/posts/default/4205070231995720320'/><link rel='alternate' type='text/html' href='http://blog.rollingwithcode.com/2008/12/seguindo-padres.html' title='Seguindo Padrões'/><author><name>Rafael Felix</name><uri>http://www.blogger.com/profile/15945926043992740682</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/_DivtpeF7_5Y/SSP5tBTaJsI/AAAAAAAAATI/84pO0s0CdY0/S220/felix.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4781511741260972168.post-6524973724523647607</id><published>2008-11-25T04:03:00.001-08:00</published><updated>2008-11-25T04:10:23.185-08:00</updated><title type='text'>Por que Não PHP?</title><content type='html'>&lt;span xmlns=""&gt;&lt;p style="text-align: justify"&gt;Estive conversando com um amigo fã de PHP e resolvi postar aqui o porquê não curto muito PHP, apesar de gostar da linguagem e de saber programar, prefiro outras linguagens como Java e RoR.&lt;br /&gt;&lt;/p&gt;&lt;p style="text-align: justify"&gt;Meu problema com PHP é a salada de frutas que ele faz no código, o uso abusivo de tags no meio de paginas HTML tornando o código muito estranho e de difícil manutenção. Alguém ai já olhou algum projeto Open Source em PHP estilo o PHPMyAdmin ou o oCommon? Chega de assustar a lambança que é feita no código, é muita mistura. Existem frameworks que auxiliam isso como é o caso do Zend Framework e do Symfony, mas normalmente quem usa PHP procura um local de hospedagem gratuita aonde hospedar seus códigos, e dificilmente essas hospedagens suportam esses frameworks.&lt;br /&gt;&lt;/p&gt;&lt;p style="text-align: justify"&gt;Eu procurei um pouco de tudo para tornar meus códigos em PHP melhores, ate tentei utilizar conceitos de OO do Java, porém não obtive sucesso. Foi melhor utilizar o estilo de OO do PHP, agradeço até hoje pela PHP 5, pois ele trouxe muitos conceitos de OO para dentro do PHP. Algumas &lt;span style="color:#7030a0;"&gt;functions &lt;/span&gt;que facilitam o desenvolvimento, como é o caso de métodos &lt;span style="color:#7030a0;"&gt;__construct&lt;/span&gt; utilizado por construtores e os métodos (the Best of), &lt;span style="color:#7030a0;"&gt;__set&lt;/span&gt; e &lt;span style="color:#7030a0;"&gt;__get&lt;/span&gt; , que são usados para criar getters e setters genéricos. Mesmo com essas funções experimente aplicar os padrões Singleton e MVC no php, o singleton e suportado com ajuda de algumas outras ferramentas, mas mesmo assim não é tão simples. Já o MVC é uma luta, realmente dura.&lt;br /&gt;&lt;/p&gt;&lt;p style="text-align: justify"&gt;PHP X MVC&lt;br /&gt;&lt;/p&gt;&lt;p style="text-align: justify"&gt;Uma classe que me facilita um monte o trabalho é a classe do Rael Cunha disponível em &lt;a href="http://www.raelcunha.com/template.php"&gt;http://www.raelcunha.com/template.php&lt;/a&gt;, sei que muita gente gosta do Smarty, mas o Smarty e meio pesado para projetos pequenos. E eu gosto de coisas simples. Mas mesmo assim o código continua horrível, então eu pra simplificar criei uma classe que faz a consulta no banco e me retorna arrays e arrays de arrays, mas mesmo assim o código continua feio. Por mais que você lute parece que cada vez fica pior. Veja por exemplo minha classe de conexão chamada banco:&lt;/p&gt;&lt;div  style="color: white; background-color:black;"&gt;&lt;br /&gt;$con = new Banco();&lt;br /&gt;$con-&gt;conectar();&lt;br /&gt;$array = $con-&gt;find(&lt;span style="color: green"&gt;"SELECT * FROM tabela"&lt;/span&gt;);&lt;br /&gt;&lt;span style="color:blue;"&gt;foreach&lt;/span&gt;($array as $a){&lt;br /&gt;...&lt;br /&gt;}&lt;br /&gt;$con-&gt;fechar();&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;    Bem simples o exemplo acima ele só mostra o simples funcionamento da classe, até pensei em criar um esquema de Models e DAOs que acessam a base direto por SQL, porém não obtive muito sucesso. Pois os códigos estavam se tornando grandes e praticamente inutilizáveis, e achei essa solução ate mais legível inicialmente, porém tenho um pequeno projeto, um jogo web based (&lt;a href="http://www.championti.web44.net/"&gt;www.championti.web44.net&lt;/a&gt;), que está ficando muito grande e como fiquei um bom tempo sem mexer, até em função do meu TCC, e quando fui olhar os códigos já nem sabia mais pra que tanta coisa. Se fosse rever esse código até para utilizar DRY, teria que reescrever tudo de novo, sim eu já reescrevi o código para adicionar os templates, e digo, não foi fácil. Agora com um problema desses vou modificar um sistema inteiro, o de corridas do jogo, porém estou tendo muitas dificuldades em utilizar o código, portanto antes de reescrever tudo novamente em PHP, estou pensando seriamente em reescrever o jogo com RoR, ainda vou fazer alguns testes, mas qualquer coisa eu comunico-os sobre o desenvolvimento do jogo.&lt;/p&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4781511741260972168-6524973724523647607?l=blog.rollingwithcode.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.rollingwithcode.com/feeds/6524973724523647607/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4781511741260972168&amp;postID=6524973724523647607&amp;isPopup=true' title='2 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4781511741260972168/posts/default/6524973724523647607'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4781511741260972168/posts/default/6524973724523647607'/><link rel='alternate' type='text/html' href='http://blog.rollingwithcode.com/2008/11/por-que-no-php.html' title='Por que Não PHP?'/><author><name>Rafael Felix</name><uri>http://www.blogger.com/profile/15945926043992740682</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/_DivtpeF7_5Y/SSP5tBTaJsI/AAAAAAAAATI/84pO0s0CdY0/S220/felix.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4781511741260972168.post-5248314944119481208</id><published>2008-11-21T06:54:00.000-08:00</published><updated>2008-11-21T07:00:45.197-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='JavaRecord'/><category scheme='http://www.blogger.com/atom/ns#' term='Open Source'/><title type='text'>Java Record – um jeito diferente de ORM</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_DivtpeF7_5Y/SSbLth1dCcI/AAAAAAAAAT8/mlVOmkO9Edc/s1600-h/dukewithdb.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 157px; height: 151px;" src="http://4.bp.blogspot.com/_DivtpeF7_5Y/SSbLth1dCcI/AAAAAAAAAT8/mlVOmkO9Edc/s320/dukewithdb.JPG" border="0" alt="" id="BLOGGER_PHOTO_ID_5271124396920867266" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div&gt;&lt;p class="MsoNormal" style="text-align:justify;text-indent:35.45pt"&gt;O Java Record surgiu com uma idéia de evitar as dificuldades de se mapear classe por classe usando Hibernate, seja com os .hbm.xml ou com Annotations, lógico que a segunda alternativa, é a mais rápida, porem eu como um verdadeiro programador a moda antiga, gosta de configurações, prefiro escrever 900 xml do que usar annotations. Lógico que isso não quer dizer não use annotations, eu as usei, e confesso que achei muito eficiente. Mas não era isso que eu queria, dava muito trabalho, eu como costumo seguir as regras da normalização, acabo gerando diversos models para simples cadastros, e era trabalhoso de mais configurar todos os XML.&lt;/p&gt;  &lt;p class="MsoNormal" style="text-align:justify;text-indent:35.45pt"&gt;Eis que me aventuro no mundo do Ruby on Rails, já havia tentado a muito tempo atrás, mas não havia gostado muito, hoje com mais conhecimento, consegui ver vantagens na linguagem, e lógico comecei do jeito certo, pelo Ruby, na outra vez me taquei direto no Rails, que não aconselho a ninguém não foi uma experiência muito agradável, era basicamente CTRL C + CTRL V. E pesquisando mais a fundo sobre o funcionamento do Active Record (O ORM do Rails), percebi que ele era simples pois, perguntava para o banco quais seus atributos, na hora me veio na cabeça ResultSetMetaData, que faz a mesma coisa, retorna as colunas de uma tabela, e pensei que poderia usar isso para facilitar o desenvolvimento dos meus models nas brincadeiras que fazia.&lt;/p&gt;  &lt;p class="MsoNormal" style="text-align:justify;text-indent:35.45pt"&gt;Então comecei a escrever o JavaRecord, meu objetivo era agilizar o trabalho, porém eu precisaria de um arquivo de configuração, para pelo menos me indicar aonde conectar, eis que surgiu o config.yml. Mas por que YAML? YAML é um formato de texto simples e fácil de ser lido, é rápido e facilmente processado pela aplicação, e é muito fácil de ser lido, sem todas aquelas frescuras do XML. Assim comentei com alguns colegas meu da faculdade, e acharam a idéia interessante, resolvi ver o que o pessoal o Java.net achava da minha idéia, e ela foi aprovada no Java.net, então começou um projeto Open Source para Java, atualmente na versão 0.1.1 o projeto é bem fácil de ser utilizado em bancos MySQL, porém um teste com o Oracle me decepcionou, como eu pude esquecer das seqüências? &lt;span style="mso-spacerun:yes"&gt; &lt;/span&gt;Agora estou em um dilema como vou adicionar as seqüências do Oracle? Não quero adicionar mais configurações, e estou até pensando em criar um esquema de dialetos. O próximo passo é criar automaticamente os vínculos com chaves primarias, evitando assim mais uma configuração.&lt;/p&gt;  &lt;p class="MsoNormal" style="text-align:justify;text-indent:35.45pt"&gt;Para quem quiser ver um exemplo funcional clique &lt;a href="https://javarecord.dev.java.net/servlets/ProjectDocumentList?folderID=10215&amp;amp;expandFolder=10215&amp;amp;folderID=0" target="_blank"&gt;aqui &lt;/a&gt;e veja um PDF mostrando o funcionamento do JavaRecord. E para fazer o download do JavaRecord com dependências acesse o &lt;a href="https://sourceforge.net/projects/javarecord/" target="_blank"&gt;sourceforge.net&lt;/a&gt;. &lt;/p&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4781511741260972168-5248314944119481208?l=blog.rollingwithcode.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.rollingwithcode.com/feeds/5248314944119481208/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4781511741260972168&amp;postID=5248314944119481208&amp;isPopup=true' title='1 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4781511741260972168/posts/default/5248314944119481208'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4781511741260972168/posts/default/5248314944119481208'/><link rel='alternate' type='text/html' href='http://blog.rollingwithcode.com/2008/11/java-record-um-jeito-diferente-de-orm.html' title='Java Record – um jeito diferente de ORM'/><author><name>Rafael Felix</name><uri>http://www.blogger.com/profile/15945926043992740682</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/_DivtpeF7_5Y/SSP5tBTaJsI/AAAAAAAAATI/84pO0s0CdY0/S220/felix.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_DivtpeF7_5Y/SSbLth1dCcI/AAAAAAAAAT8/mlVOmkO9Edc/s72-c/dukewithdb.JPG' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4781511741260972168.post-6489510771044673462</id><published>2008-11-20T02:54:00.000-08:00</published><updated>2008-11-20T03:35:24.063-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Spree'/><category scheme='http://www.blogger.com/atom/ns#' term='Ruby On Rails'/><title type='text'>Spree-pagseguro-carrinho-proprio Atualizado</title><content type='html'>Adicionei algumas alterações no spree-pagseguro-carrinho-proprio no Github, lembrando que esse é um projeto para Ruby on Rails, mas precisamente uma extensão a um projeto Open Source o Spree.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;O Spree é um projeto de e-commerce para Ruby on Rails, pode servir como base para qualquer aplicação, porém ele possuia somente vinculos com meios de pagamento internacional, e surgiu a ideia de criar um extension para o Spree utilizando algum meio de pagamento brasileiro, como é o caso dessa, ela utiliza o carrinho do Spree para se vincular com o Pagseguro.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Nesse commit adicionei o RSpec de teste da view que altera para fazer o vinculo, para utilizar você so precisa cadastrar algum e-mail seu no pagseguro e adicionar no codigo fonte da extension, prometo em breve melhorar isso, colocar quem sabe em um YAML, vou pensar sobre isso para facilitar mais, voltando a falar do commit também fiz algumas alteraçõe spara seguir as convensões do Spree de extension.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Para mais detalhes acessem o site do &lt;a href="http://spreehq.org/"&gt;Spree&lt;/a&gt;&lt;/div&gt;&lt;div&gt;E vejam o projeto no meu &lt;a href="https://github.com/fellix/spree-pagseguro-carrinho-proprio/tree"&gt;GitHub&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Se quiserem dar uma olhada, ou sujestões fiquem a vontade&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;-----------------------------------------------------------------------------------------------&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Aproveitando esse post vou falar um pouco sobre minha aventura com o RSpec.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Eu como desenvolvedor Java nunca fui fã de usar testes, em Java debugamos, apesar de existirem ferramentas boas para criar testes, não é muito comum criar suites de testes.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Então começei a participar do Spree, com essa ideia de integração com o Pagseguro, ai fiquei sabendo que teria que criar testes RSpec para o projeto pois um projeto Rails sem testes não é bem visto. Então la fui eu pesquisar sobre o RSpec, e uma coisa me chamou a atenção, o RSpec é muito famoso na comunidade, e muito utilizado, porém ele é muito mal documentado, ou eu que não vi direito, porém você quase não ve exemplos no site.&lt;/div&gt;&lt;div&gt;Ainda bem que existem screencasts, o nofxx tem uma que introduz ao RSpec, que foi muito util, aprendi como funciona o RSpec, pois estava complicado de entender.&lt;/div&gt;&lt;div&gt;Passei a fazer alguns teste, e pronto, já sentia que estava dominando o RSpec, grande ilusão.&lt;/div&gt;&lt;div&gt;Nessa extension para Spree, eu so tenho que testar uma view, uma única view, qual será a diferença. Pois é, me ferrei. E realmente não tava evoluindo os testes, não conseguia rodar, davam erros em objetos da view, e por mais que eu criasse mock eles continuavam, só depois que percebi que faltavam os helpers do Spree, então adicionei os que são utilizados na view, e novamente mas problemas com models, porém dinha um erro que eu tinha concertado, errrr digamos com gambiarra;&lt;/div&gt;&lt;div&gt;A view dava um erro pois o Spree usa o Resource_Controller, e ele dizia que o metodo ou variavel object_url é indefinido, então eu muito esperto escrevi um metodo para solucionar isso, e o erro passou, mas um teste não pode fazer isso não é, então recorri ao Google Groups do rails-br, e lá demorou um pouco mais me falar de um tal de scaffold_resource que gera os testes do RSpec, pra mim dar uma olhada, e realmente foi uma linha de código para solucionar isso:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"   style="border-collapse: collapse; color: rgb(34, 68, 204);   font-family:'Lucida Grande';font-size:14px;"&gt;&lt;table border="0" cellspacing="0" cellpadding="0" class="posts wide" style="border-collapse: collapse; font-family: 'Lucida Grande', Tahoma, Arial, Helvetica, sans-serif; width: 100%; border-bottom-width: 2px; border-bottom-style: solid; border-bottom-color: rgb(238, 238, 238); "&gt;&lt;tbody&gt;&lt;tr class="post hentry"&gt;&lt;td class="body entry-content" valign="top" style="border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; border-top-width: 2px; border-top-style: solid; border-top-color: rgb(238, 238, 238); font-size: 0.9em; padding-top: 10px; padding-right: 20px; padding-bottom: 10px; padding-left: 20px; "&gt;&lt;p style="font-family: 'Lucida Grande', 'Trebuchet MS', Arial, Helvetica, sans-serif; "&gt;&lt;/p&gt;&lt;div class="dp-highlighter"   style="border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(43, 145, 175); border-right-color: rgb(43, 145, 175); border-bottom-color: rgb(43, 145, 175); border-left-color: rgb(43, 145, 175); background-color: rgb(255, 255, 255); width: 100%; overflow-x: auto; overflow-y: auto; margin-top: 10px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; font-family:'Courier New', Courier, mono;font-size:12px;"&gt;&lt;ol start="1" class="dp-rb" style="margin-top: 0px; margin-right: 0px; margin-bottom: 1px; margin-left: 45px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: rgb(43, 145, 175); "&gt;&lt;li class="" style="background-color: rgb(255, 255, 255); padding-left: 10px; line-height: 14px; "&gt;&lt;span class="Apple-style-span" style="color: rgb(0, 0, 0);"&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;template.should_receive(&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 255);"&gt;:object_ur&lt;/span&gt;&lt;span class="Apple-style-span" style="color: rgb(0, 0, 0);"&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 102, 255);"&gt;l&lt;/span&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;)&lt;/span&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;.twice.and_return(order_path(&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 204, 0);"&gt;@order&lt;/span&gt;&lt;span class="Apple-style-span" style="color: rgb(0, 0, 0);"&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;))&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(0, 0, 0); line-height: 14px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;/ol&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;E pronto o erro foi resolvido, depois outro erro, dessa vez recorri ao rubyonbr.org, e o nofxx me respondeu, esse erro era meio estranho&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style=" ;font-family:Arial;"&gt;&lt;a name="posts-18862" id="posts-18862" style="color: rgb(34, 68, 204); "&gt;&lt;table border="0" cellspacing="0" cellpadding="0" class="posts wide" style="border-collapse: collapse; font-family: 'Lucida Grande', Tahoma, Arial, Helvetica, sans-serif; width: 100%; border-bottom-width: 2px; border-bottom-style: solid; border-bottom-color: rgb(238, 238, 238); "&gt;&lt;tbody&gt;&lt;tr class="post hentry"&gt;&lt;td class="body entry-content" valign="top" style="border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; border-top-width: 2px; border-top-style: solid; border-top-color: rgb(238, 238, 238); font-size: 0.9em; padding-top: 10px; padding-right: 20px; padding-bottom: 10px; padding-left: 20px; "&gt;&lt;p style="font-family: 'Lucida Grande', 'Trebuchet MS', Arial, Helvetica, sans-serif; "&gt;&lt;/p&gt;&lt;div class="dp-highlighter"   style="  border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(43, 145, 175); border-right-color: rgb(43, 145, 175); border-bottom-color: rgb(43, 145, 175); border-left-color: rgb(43, 145, 175); background-color: rgb(255, 255, 255); width: 100%; overflow-x: auto; overflow-y: auto; margin-top: 10px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; font-family:'Courier New', Courier, mono;font-size:12px;"&gt;&lt;ol start="1" class="dp-rb" style="margin-top: 0px; margin-right: 0px; margin-bottom: 1px; margin-left: 45px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: rgb(43, 145, 175); "&gt;&lt;li class="" style="background-color: rgb(255, 255, 255); padding-left: 10px; line-height: 14px; "&gt;&lt;span style=" ;color:black;"&gt;expected &lt;span class="symbol" style=""&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 255);"&gt;:line_items&lt;/span&gt;&lt;/span&gt;&lt;span style=" ;color:black;"&gt; with (any args) once, but received it 4 times&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;span class="Apple-style-span" style="color: rgb(0, 0, 0);"&gt;era como se ele dissesse que usei algo a mais, muito estranho. E realmente eu tinha que disponibilizar o :line_item, exactly(4).times, e pronto foi só esse ajuste e o teste funcionou.&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:Arial;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:Arial;"&gt;Mas na verdade o que me deixou assustado foi a falta de aplicações exemplos no site do RSpec, que ajudariam muito quem esta começando, ainda tenho que fazer muitos testes pra pegar bem o RSpec, mas vamos assim como esta.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;[]'s&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4781511741260972168-6489510771044673462?l=blog.rollingwithcode.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.rollingwithcode.com/feeds/6489510771044673462/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4781511741260972168&amp;postID=6489510771044673462&amp;isPopup=true' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4781511741260972168/posts/default/6489510771044673462'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4781511741260972168/posts/default/6489510771044673462'/><link rel='alternate' type='text/html' href='http://blog.rollingwithcode.com/2008/11/spree-pagseguro-carrinho-proprio.html' title='Spree-pagseguro-carrinho-proprio Atualizado'/><author><name>Rafael Felix</name><uri>http://www.blogger.com/profile/15945926043992740682</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/_DivtpeF7_5Y/SSP5tBTaJsI/AAAAAAAAATI/84pO0s0CdY0/S220/felix.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4781511741260972168.post-2151723274558680872</id><published>2008-11-19T03:20:00.000-08:00</published><updated>2008-11-19T03:29:57.414-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='bla bla bla'/><title type='text'>Mais um blog?</title><content type='html'>Realmente esse é mais um blog sobre desenvolvimento por isso esse nome. Deixe eu me apresentar, meu nome é Rafael Guzi Felix da Silva, também conhecido como Felix, estou atualmente na 8ª fase do curso de Ciência da Computação na &lt;a href="http://www.unoescvda.edu.be/" target="_blank"&gt;UNOESC&lt;/a&gt;, e meu real interesse nesse blog é dividir meus conhecimentos com quem assim como é apaixonado por desenvolvimento. Atualmente estou brincando bastante com Ruby on Rails, mas esse blog também vai falar de outras linguages.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Também vou aproveitar para comentar do meu ORM o Java Record, que é baseado no Active Record do Rails, mas para Java, visando a facilidade do desenvolvimento, e a agilidade, sem configurações e sem todos aqueles XML para fazer o relacionamento.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Para mais informações sobre o Java record acesse o &lt;a href="https://javarecord.dev.java.net/" target="_blank"&gt;site&lt;/a&gt; hospedado no java.net, os fontes se encontram no sourceforge.net, mas pelo site (se alguem ai quiser contribuir em construir um site melhor eu ficaria feliz ;) ) da para ter uma noção de como se usa o Java Record, atualmente versão 0.1.1 pois foi adicionado o relacionamento de um para muitos.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Estou ajudando também a criar algumas integrações para o &lt;a href="http://spreehq.org"&gt;Spree&lt;/a&gt; que é um projeto de e-commerce em Ruby on Rails. Alguns projetos que ajudo vocês podem encotrar no &lt;a href="http://github.com/fellix"&gt;GitHub&lt;/a&gt;.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4781511741260972168-2151723274558680872?l=blog.rollingwithcode.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.rollingwithcode.com/feeds/2151723274558680872/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4781511741260972168&amp;postID=2151723274558680872&amp;isPopup=true' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4781511741260972168/posts/default/2151723274558680872'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4781511741260972168/posts/default/2151723274558680872'/><link rel='alternate' type='text/html' href='http://blog.rollingwithcode.com/2008/11/mais-um-blog.html' title='Mais um blog?'/><author><name>Rafael Felix</name><uri>http://www.blogger.com/profile/15945926043992740682</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/_DivtpeF7_5Y/SSP5tBTaJsI/AAAAAAAAATI/84pO0s0CdY0/S220/felix.jpg'/></author><thr:total>0</thr:total></entry></feed>
