Google+ Followers

Friday, October 17, 2014

3 Milagres

São necessários 3 milagres para virar santo

Para virar santo você precisa primeiro fazer 3 milagres.
Se você começar numa equipe/empresa nova, lembre-se a não ser que você já seja um autor respeitado você vai precisar conquistar seu espaço/respeito.
Para conquistar seu espaço/respeito você precisa fazer as coisas acontecerem.
Se esforce e faça os milagres acontecerem, depois de 3 você vira santo e dai as pessoas passam a pedir sua benção.

Wednesday, September 10, 2014

Vagrant e você, tudo a ver

Uma das coisas mais legais que aprendi nos últimos meses foi adicionar Vagrant no meu dia-a-dia de desenvolvimento.
Hoje os meus primeiros passos para começar um projeto [green field] são:
mkdir
git init
vagrant init ubuntu/trusty64

 O que é?

Camadas
Vagrant é uma camada que facilita, MUITO, a interação com máquinas virtuais. Ele funciona falando diretamente com o seu gerenciador de máquina virtual (comumente chamados de Hypervisor). Com vagrant você consegue subir uma máquina virtual sem nem abrir o Virtual Box, por exemplo.

Providers

Para o Vagrant o Virtual Box é um provider.
Virtual box é o provider padrão do Vagrant, ou seja, para subir uma VM virtual box com vagrant você não precisa fazer nada. Para subir uma VM VMWare você precisa instalar um plugin.

Requisitos

Como você pode imaginar tem um hypervisor instalado é um dos pré-prequisitos para usar vagrant na sua máquina.

Benefícios

Essa parte é interessante...
Existe uma variedade de tecnologias que eu uso atualmente. A saber:
  • Octave, Python e R para os projetos de Big Data e Machine Learning
  • [Ruby|Python], ImageMagik e [Postgres|MySQL] para projetos [RoR no heroku|django]
  • Java + [Tomcat|JBoss|Jetty] para projetos Java
  • Imagine outra tech stack que possa sugir aqui...
 Eu tenho apenas um computador para desenvolver. Se eu fosse instalar todos os softwares necessários diretamente no meu laptop, tenho certeza que eu teria problemas de compatibilidade, além da lentidão que meu ambiente ia ficar (imagine ter um postgres e mysql rodando na minha maquina o tempo todo).
Com Vagrant o que eu faço é criar uma máquina virtual para cada projeto e nessa máquina instalo os softwares necessários para minha app rodar, mantendo diretamente no meu laptop apenas código fonte e editor.
Por exemplo, para uma aplicação java eu deixo o maven, tomcat e banco de dados rodando dentro da VM enquanto no meu laptop ficaria apenas o eclipse.
Em projetos Ruby on Rails eu instalo Image Magik, editor, RVM e PostgreSQL na VM, deixando apenas o código fonte no meu laptop.

Vagrantfile

A maneira mais simples de iniciar o uso de vagrant em um novo projeto é executar o comando:
vagrant init
Esse comando vai criar um arquivo chamado Vagrantfile no seu diretório atual, é através desse arquivo que você configura como o vagrant deve te prover a máquina virtual.

Como configurar os ambientes

Algo muito legal no Vagrant é que ele já entende as principais ferramentas para provisionamento automático de ambiente. Então se você conhece Puppet, Chef, Ansible ou o recente adicionado Docker, você pode criar receitas/scripts/manifestos com a configuração que você deseja que seja aplicada na sua máquina virtual e o Vagrant vai aplicar a configuração quando ele criar a máquina virtual pela primeira vez (ou quando você quiser que ele re-aplique a configuração de provisionamento). Eu não vou entrar fundo no assunto de provisionamento automático de ambiente nesse post por que esse assunto é extenso mas, se quiser dar uma olhada em algo pode ver esse meu repositório no github que tem monta uma máquina virtual vagrant com OpenERP (algo bem complexo IMHO): https://github.com/rogeralmeida/sample-openerp-vagrant-setup

Acesso a máquina virtual

Tendo uma máquina virtual configurada, você pode acessá-la facilmente via ssh (com o comando vagrant ssh). Se você tiver a máquina virtual rodando, após executar o comando vagrant ssh você cairá no prompt da máquina virtual.
Além disso você pode configurar, para o vagrant fazer ssh port forward entre sua máquina virtual e seu host. Com isso você pode, por exemplo, subir uma aplicação na porta 3000 dentro da VM e acessar essa mesma aplicação pelo brownser do seu laptop através do endereço http://localhost:3000.
Você pode também mapear uma porta da VM para uma porta diferente no seu laptop. Ex: 3000->666

Enviando dados para a máquina virtual

O pulo do gato é, assim que você sobe uma máquina virtual vagrant, se você acessá-la via ssh e mudar para o diretório /vagrant você ira ver os arquivos que estavam no seu diretório do projeto no seu laptop.
Vagrant possui um conceito de pasta compartilhada, ou seja, pastas que existem no seu host que devem ser compartilhadas com sua máquina virtual.
Esse é o truque para conseguir desenvolver aplicações com linguagem script como Ruby e Python, no mundo java esse é o segredo para compartilhar o .m2/, por exemplo.

Considerações finais

Já tem um tempo que eu virei fan de Vagrant, e acho que todo desenvolvedor do Brasil deveria pelo menos brincar um pouco com Vagrant.
Tem várias outras coisas legai de vagrant, como por exemplo rodar direto na AWS ou subir um cluster de máquinas virtuais diretamente no seu laptop.
Se quiser ver algo de alguém que manja muito disso, dá uma olhada no post do bruninho sobre vagrant+puppet.

Thursday, September 4, 2014

Como é trabalhar na ThoughtWorks

Uma pergunta recorrente que me fazem é:
- E ai, como é trabalhar na ThoughtWorks?

Bom, vou tentar responder isso...

Pra começar é muito diferente de tudo que já vi aqui no Brasil. Nenhuma das empresas pelas quais passei, ou empresas que ouvi amigos próximos falando sobre o dia-a-dia se aproximam do que eu vejo aqui na ThoughtWorks. Isso tanto para bom, quanto para "não tão bom".

A ThoughtWorks te contrata para a Thoughtworks não para um projeto

Isso pra mim é algo muito bom, a maioria das empresas de consultoria no Brasil quando querem te contratar falam algo do tipo: "Temos um projeto em Alphaville com duração de 6 meses e possibilidade de prorrogação..."
Nesse cenário se tem projeto essas empresas contratam como loucas, e quando chega final do ano e os clientes tem um freezee elas demitem! Para em fevereiro do outro ano começarem a contratar de novo. Isso nunca fez sentido para mim.
Na ThoughtWorks, quando você é contratado você vira um ThoughtWorker. Basicamente o que acontece é que a empresa te considera alguém que pode agregar a empresa e te valoriza por isso. Quando você entra na empresa você fica um tempo na praia.

Praia

Quando você entra na ThoughtWorks você passa um tempo apontando hora num projeto chamado Beach (Praia). Praia não é billable. É um tempo para você se adequar a realidade da empresa. Entender como a empresa funciona e ver como as equipes trabalham no dia-a-dia.
Quando acaba um projeto, você volta para a praia. Geralmente tentamos fazer com que ninguém saia de um projeto e já comece em outro sem ter tempo de praia. Na praia você pode fazer tudo aquilo que você tinha vontade de fazer mas não podia por que estava em projeto. Aprender uma linguagem/lib/ferramenta/whatever nova. Contribuir com um projeto open-source. Fazer um curso online. Ou mesmo trabalhar com voluntário em uma ONG parceira.
Só para compartilhar, eu estou na praia atualmente e fiz um curso de estrutura de dados de Berkeley e estudei Docker.

Não tem gente ruim

Isso é diferente de tudo que eu já vi. Geralmente as empresas eram formadas por gente muito boa, gente mais ou menos e gente ruim. Na ThoughtWorks, na minha humilde opinião, não tem gente ruim. Tem gente que ainda não é efetivamente muito boa em alguma coisa, a maioria por falta de experiência, mas vai ser um dia com certeza.
Quando eu entrei na Thoughtworks eu já tinha 8 pra 9 anos de experiência e eu conheci gente com 2 anos de experiência que me colocavam (e colocam eu acredito) no chinelo!!!
Isso faz muita diferença, por que você está sempre aprendendo algo fantástico com seus colegas de trabalho.
Tem um lado não tão bom que é a desconstrução do seu ego. A maioria dos ThoughtWorkers estava acostumado a ser tratado como Rock Star nas outras empresas e quando entra na TW não recebe os mesmos "privilégios" e leva um tempo para se adequar a essa nova realidade.

Modelo horizontal com poucos níveis de Hierarquia

A TW não tem uma hierarquia enorme como as empresas geralmente tem. Entre eu e o Diretor da TW no Brasil deve ter 1 ou 2 níveis.
Algo tipo assim:
Eu(Dev) > Gerente do escritório de São Paulo > Diretor Geral do Brasil.
Na verdade eu tenho até dúvidas se o Gerente do escritório de São Paulo está no meio do caminho :S
Aqui, gerente, é um papel necessário para desenvolver um projeto. Do mesmo modo que precisamos de DEVs, BAs e QAs precisamos de Gerentes também, e os gerentes estão no mesmo nível dos DEVs, BAs, QAs, IMs, etc.
Existem papeis que cuidam de níveis maiores, por exemplo, existe um líder de demanda, existe uma líder de tecnologia. Mas a hierarquia é muito fraca ou quase nula no dia-a-dia.
É muito comum um líder colocar uma opinião em uma lista de discussão interna e alguém discordar na mesma thread.

Todos tem voz

Sim, você pode discordar de algo publicamente sem se preocupar se vai perder
o emprego. Na verdade, discordância ocorre a toda hora. O difícil é achar consenso. Mas tudo é feito no intuito de agregar. Isso é muito bom.

A lista de DEV

Esse ponto é particular para quem for dev. Imagine você ter uma lista de Dev com Paul Hammant, Martin Fowler, Danilo Sato, CV, Jim Highsmith, Badri  e mais um monte de gente no mesmo nível deles. Um ponto interessante é que a lista está sempre olhando o futuro, basta ver o que está rolando na lista que daqui a uns 6 meses muitas daquelas coisas vão ficar famosas.

Justiça Econômica e Social

A TW é baseda em 3 pilares.
O Terceiro Pilar, é o que me faz pensar que a TW pode ser a última empresa da minha vida. Nós não trabalhamos todo dia para um cara ficar rico e ficar andando de Ferrari no final-de-semana. Nos fazemos vários projetos legais ao redor do mundo ajudando a tornar o mundo um lugar melhor. Confesso que quando eu conheci a TW eu quis entrar por causa do lance de excelência técnica, mas foi a Justiça Econômica e Social que me fez querer ficar realmente.

 

Estamos contratando

Bom, agora vem a última parte... estamos contratando.
Atualmente temos vagas para todos os escritórios, mas São Paulo, onde estou atualmente e Belo Horizonte, nosso próximo escritório no Brasil estão bombando. O processo de recrutamento da TW é algo muito enriquecedor, eu considero uma boa participar do processo por que você pode ganhar vários feedbacks legais na pior das hipótese e na melhor pode vir ficar maravilhado como eu estou aqui dentro.

Thursday, May 15, 2014

Internet Explorer não respeita IE=8; IE=9;

Se você estiver usando a seguinte tag nas suas páginas imaginando que seu site não será exibido no IE 7:
<meta http-equiv="X-UA-Compatible" content="IE=9; IE=8" > Você está enganado!!!
Para sites da zona 'intranet' o Internet Explorer 9 irá trabalhar em modo de compatibilidade. Para resolver esse problema você pode fazer duas coisas:
  1. Acessar o menu Ferramentas> Opções de modo de compatibilidade e desmarcar a opção de exibir sites da intranet como modo de compatibilidade.
  2. Alterar a tag das suas páginas para <meta http-equiv="X-UA-Compatible" content="IE=Edge"> e ela deve aparecer antes de qualquer import de CSS.
Ou seja, se tem de funcionar no IE... o preço muda.

Monday, April 16, 2012

Thunderbird with Microsoft OWA in Ubuntu 11.10

So, you as I are tired of Evolution's problems in Ubuntu 11.10?
Move on to Thunderbird...
To have it working with Microsoft OWA following the these steps:

Install DavMail


Download and install DavMail. It will act as a proxy between Thunderbird and your Microsoft webmail.

Configure DavMail


Some tips: 


  • Exchange 2003: https://mail.company.com/exchange/
  • Exchange 2007 Webdav mode: https://mail.company.com/owa/
  • Exchange 2007 EWS mode: https://mail.company.com/owa/
  • Exchange 2010 EWS mode: https://mail.company.com/owa/
  • Exchange 2010 EWS mode with unsupported authentication form e.g. Windows Live login:https://mail.company.com/ews/exchange.asmx

In my case as I'm behind a proxy I had to mark the option "Use system proxy settings" in the Proxy tab:



Click save then you should see a message in your system tray, saying that DavMail is correctly configured.

Configuring Thunderbird

In Thunderbird main window click menu File > New> Existing Mail Account.

Fill the next windows with your credentials:

Click "Continue", 



then manual config and change the properties to:
  • Incoming:
    • Server hostname: localhost
    • Port: 1143 (if you didn't change this value in DavMail)
    • SSL: None
    • Authentication: Normal Password
  • Outgoing:
    • Server hostname: localhost
    • Port: 1025 (if you didn't change this value in DavMail)
    • SSL: None
    • Authentication: Normal Password



Re-test and Create Account and be happy.




Wednesday, March 21, 2012

SOLUTION: Evolution stop working with OWA

Out of the blue my Evolution stopped working today.
After browsing some forums with no success... I finally found a light:

 sudo apt-get remove evolution
 mv .local/share/evolution .local/share/evolution_bkp
 sudo apt-get install evolution

and... Voila!

I don't know yet all the implications of this, but for now I'm so happy that I can see my messages again, and I don't have to use windows that I decided to post it here. If I find anything new I will update this post.

Cheers...

PS: Ubuntu 11.10


Sunday, January 8, 2012

Page Object Pattern + WebDriver + Spring

During the last week I had start creating a test suite for a existing web-application which my team is currently working on. So now is good time to share some experience:


The application
A normal old java web application: Java 1.4, Struts 1.1, EJB 2.1, JDBC to persist the data and the anemic design (VO+BO+DAO) but I will talk about in another post...


Page Object Pattern
To map the web page's components inside the test code I used the page object pattern.
This patterns helped me to eliminate duplicated code to access web-page's components.

Basically it consists of classes that maps web-pages, so that if you want to fill a login form from your test classes instead of doing this:

  @Test  
  public void someTest() throws Exception {  
      WebElement userNameField = driver.findElement(By.name("j_username"));  
      userNameField.sendKeys(username);  
      WebElement passwordField = driver.findElement(By.name("j_password"));  
      passwordField.sendKeys(password);  
      WebElement logonButon = driver.findElement(By.xpath("/html/body/center/table/tbody/tr[2]/td/form/input"));  
      //asserts  
  }

You do this:

  
  @Test  
  public void someTest()throws Exception {  
      loginPage.open();  
      loginPage.logon(properties.getUsername(), properties.getPassword());  
      //asserts  
  }  

And inside your LoginPage you have:

   public void logon(String username, String password){   
     String username = readUsernameFromFixture();  
     String password = readpasswordFromFixture();  
     WebElement userNameField = driver.findElement(By.name("j_username"));   
     userNameField.sendKeys(username);   
     WebElement passwordField = driver.findElement(By.name("j_password"));   
     passwordField.sendKeys(password);   
     WebElement logonButon = driver.findElement(By.xpath("/html/body/center/table/tbody/tr[2]/td/form/input"));   
     logonButon.click();   
   }   

One thing that I would like to mention here: Keep your assertions in the test class. The idea of the PageObject class is to keep the maps to the web-page's components and to have some helper methods like the example above, not to have assertions.

Wire things togheter.

So now you will have your test class depending on many of the PageObjects, and each PageObject classes also depends on WebDriver:

IMHO is really boring to wire the classes manually, so there comes in Spring.
Spring is very helpful for tests, it is worthy to check the spring documentation about tests.
With simple annotations and just one piece of XML you can wire the pieces together. Check how will be the annotated sample test class:

package br.com.bright.halfprehalfpospaidapplication.test.online;  
...  
imports...  
...  
@ContextConfiguration(locations = "/applicationContext.xml")  
@RunWith(SpringJUnit4ClassRunner.class)  
public class ExpireNoUsedCreditsFunctionalTest {  
    @Autowired  
    private LoginPage loginPage;  
    @Autowired  
    private HomePage homePage;  
    @Autowired  
    private ViewMobilePage viewMobilePage;  
    @Autowired  
    private ViewMobileResultPage viewMobileResultPage;  
    @Autowired  
    private AuxiliaryClassToCheckDataBase akaDaoOrRepository;  
    @Autowired  
    private MenuPage menuPage;  
    @Autowired  
    private Properties properties;  
    private Integer statusBeforeTest;  
    private Integer codeUnderTest;  
    @Before  
    public void setUp() {  
        statusBeforeTest = null;  
        codeUnderTest = null;  
    }  
    @After  
    public void tearDown() {  
        if (statusBeforeTest != null) {  
            akaDaoOrRepository.updateStatusByCode(statusBeforeTest,  
                    codeUnderTest);  
        }  
        menuPage.Logoff();  
    }  
    @Test  
    public void noCreditsToRevert() throws Exception {  
...  

Yes my friends, you can inject dependencies inside private attributes! :O
Your PageObject classes have to be Spring Bean as well, so that Spring will be able to inject them in your test class:

package br.com.bright.thesameapplication.test.online.page;  
import org.openqa.selenium.By;  
import org.openqa.selenium.WebDriver;  
import org.openqa.selenium.WebElement;  
import org.springframework.beans.factory.annotation.Autowired;  
import org.springframework.stereotype.Component;  
@Component  
public class LoginPage extends PageBase{  
    @Autowired  
     public LoginPage(WebDriver webDriver) {  
         super(webDriver);  
     }  
     public void logon(String username, String password){  
         WebElement userNameField = driver.findElement(By.name("j_username"));  
         userNameField.sendKeys(username);  
         WebElement passwordField = driver.findElement(By.name("j_password"));  
         passwordField.sendKeys(password);  
         WebElement logonButon = driver.findElement(By.xpath("/html/body/center/table/tbody/tr[2]/td/form/input"));  
         logonButon.click();  
     }  
}  
And in order to inject the WebDriver in the constructor as a dependency we need it to be a Spring Bean as well, but you cannot annotated it as we just downloaded the WebDriver's jar. To solve that we will use the xml piece. Check this out:


 
 
 
  
  
  
  
 

 
  
  
  
  
 
 
 
  
  
  
  
 
 
 



Next Steps...
Normally when we are coding a test suite for a application we end up with a DSL for the application. Probably I will end up with a parent class with some useful method to interact with the application.
Also as I write this post I found a useful information about a page factory built-in WebDriver's support library. It seens to be very helpful.
See you later.