Developer Studies

Moving to Octopress

It has been a long time since my last post. A great mark of one post per year in the last couple years. Since then, I’ve learned a lot a things, and I hope to be able to get back with this blog and start to share my thoughs and learns again.

I’ve procastinated quite a bit to relauch the blog, because it took some time to migrate posts from Wordpress to Octopress. Besides the tool to migrate, I wanted to normalize every post with inline HTML to markdown, and also apply nome highlighted code.

I already have some posts in mind, and hope to get back as soon as possible.

Upgrading NPM 0.2.x to 1.0.x

I’m gonna do quick post about migrating NPM (Node Package Manager) from 0.2 to 1.0.x. Basically, you can check this post for more information.

So, since I started to play with Node.js you basically starts installing NPM, which allows you to install libraries and manage them. So, with some libraries that I test, I usually do:

1
$ npm update

This command updates your installed libraries, but it doesn’t upgrades NPM. To upgrade your installation you require to run this complex command:

1
$ curl http://npmjs.org/install.sh | sh

It will notice you that your current libraries installed will be lost, and is advised you to backup them, so you can reinstall it. And them, you are done. But, why NPM removes my current installed libraries?

NPM 1.0.x was mainly focused on path/managing your Node.js libraries in a better way, so it requires that your libs be installed with these path changes, which can be local or global paths. In resume, you can now install through:

1
2
$ npm install <lib>
$ npm install <lib> -g

The latter installs it globally, and usually installed at /usr/local/lib/node_modules. For development and deployment stuff, you would choose the first, since you will use it as libraries, and require it at your projects. You will need it globally when it has a CLI (Command Line Interpreter). When doing so, you get access to it, for example:

1
2
3
$ npm install ender -g
$ which ender
/usr/local/bin/ender</code>

But, if I wanna both locally and global, do I have to install it twice? The quick answers is, yes. But NPM can do it more intelligent, so you don’t need to upgrade/manage it twice. NPM comes with link command that allows you to symlink global installs to your local installs. So, every time you upgrade it globally you get your local also. So, you should be aware of this, since you don’t get a lib@version install, you will get lib install, so it might broke your code, so use it with this in mind.

1
2
3
4
$ node install express -g
$ npm link express
$ ls -l ~/node_modules/
$ (...) express -> /usr/local/lib/node_modules/express</code>

Doing this steps you can get back to work when upgrading your NPM installation. For more information read Node.js blog, which has some posts related to NPM.

This is my first post published in english, so there might be some english errors.

Homebrew the new package system!

Como mencionei em meus posts anteriores, tenho deixado de usar o MacPorts como package manager. Além de eu já ter passado por alguns problemas com ele ao fazer build existem outros problemas relatados no github do projeto, vale a pena dar uma conferida. Assim, estou deixando de usar o MacPorts (apesar de não desinstalado ainda, já não tenho mais nada instalado via port).

Bom, vou passar os passos que usei para ter o Homebrew funcionando no Mac OSX. Não sou dos mais experiêntes com *nix, ainda me perco em onde colocar cada coisa e desconheço boas práticas sobre isso. Infelizmente, não tive muita sorte em encontrar bons textos sobre isso, por isso fiz do meu jeito, baseando na instalação 3 (Gogolinux).

Para obter a versão do Homebrew eu apenas criei um diretório Cellar no /usr/local

1
sudo mkdir /usr/local/Cellar

Agora baixei a versão do github para este diretório

1
2
cd /usr/local/Cellar
sudo git clone git://github.com/mxcl/homebrew.git

Assim, teremos o projeto em /usr/local/Cellar/homebrew. Se quiser fazer o primeiro teste, basta digitar

1
2
/usr/local/Cellar $ homebrew/bin/brew --prefix
> /usr/local/Cellar/homebrew

Ok, vemos que o brew já está ok, mas tive que digitar homebrew/bin/brew, se digitar o comando brew, tive como resposta

1
2
$ brew
-bash: brew: command not found

Isso por que o comando brew não se encontra no /usr/local/bin

Ok, basta fazermos um link simbólico:

1
2
cd /usr/local/bin
/usr/local/bin $ sudo ln -s /usr/local/Cellar/homebrew/bin/brew brew

Assim, teremos um link simbólico para o brew. Note que é como o atalho do Windows, se eu mudar o brew ele irá refletir no brew do bin. Digo isto por que no *nix podemos criar hard links que aponta para o arquivo físico, o que é diferente de link.

Agora podemos testar digitando apensa:

1
2
$ brew --prefix
> /usr/local

Bom, eu no momento me sinto confortável em usar sudo para instalar, mas no site do projeto é sugerido em alterar os donos do diretório /usr/local de root para o seu usuário, eliminando completamente a necessidade de digitar sudo. Talvez faça isto no futuro.

Bom, teste simples

1
2
3
4
5
6
7
8
9
10
11
12
13
$ sudo brew install wget

Warning: It appears you have Macports or Fink installed
Although, unlikely, this can break builds or cause obscure runtime issues.
If you experience problems try uninstalling these tools.
==> Downloading http://ftp.gnu.org/gnu/wget/wget-1.12.tar.bz2
######################################################################## 100.0%
==> ./configure --disable-debug --prefix=/usr/local/Cellar/wget/1.12
==> make install
/usr/local/Cellar/wget/1.12: 9 files, 784K, built in 31 seconds

$ which wget
> /usr/local/bin/wget

Agora para vermos onde ele está instalado:

1
2
3
4
5
6
$ brew list wget

/usr/local/Cellar/wget/1.12/bin/wget
/usr/local/Cellar/wget/1.12/etc/wgetrc
/usr/local/Cellar/wget/1.12/share/info/ (2 files)
/usr/local/Cellar/wget/1.12/share/man/man1/wget.1

Podemos ver que o wget foi instalado no /usr/local/Cellar como queríamos. Quando precisarmos remover qualquer coisa instalada, basta removermos tudo que há no Cellar e os links simbólicos gerados automaticamente pelo brew (i.e. /usr/local/bin/wget)

Qualquer sugestão ou correção me envie nos comentários.

Ruby gems no Snow Leopard

Infelizmente, depois de fazer o upgrade para o Snow Leopard algumas gems pararam de funcionar, como por exemplo o Rails não consegui subir o servidor. Pesquisando pela internet, não consegui achar informações relevantes para o meu problema.

Minha solução foi remover todas as gems que instalei desde que comecei com o Leopard, mas antes faça um backup da sua lista

1
gem list > gems_list_backup.txt

Assim, você sabera todas as gems que tinha e versões.

Agora é so fazer:

1
sudo gem clean

Isso irá remover todas as gems que você instalou. Se você der um gem list, verá que existem algumas gems ainda instaladas. Estas gems são as versões que vem pré-instaladas com o Leopard. Você pode remover, mas eu optei por deixá-las. As gems pré-instaladas podem ser vistas usando o comando:

1
gem list -d

Agora vá instalando uma a uma as gems e pronto, e tudo funcionará normalmente.

Snow Leopard para Desenvolvedores (Ruby)

A primeira coisa para qualquer desenvolvedor fazer é instalar a nova versão do Xcode do Mac que vem junto ao DVD como Extras. Diferente de distros Linux como Ubuntu em que você usa o apt-get como package manager para instalar todas as libraries. Só que no Xcode ele instala várias libraries (atualizações) no Mac de uma vez. (Faça os Software Updates, sempre há)

Quando comecei a usar o Mac OSX posso dizer que minha experiência com ambientes *nix era quase zero. Instalar libraries? src path? e etc é algo que o Windows nos protege. Esta ignorância acaba sendo uma porrada grande nos primeiros dias de uso de ambientes linux. O importante é que, para desenvolvedores o Terminal é seu amigo então aprenda! Posso dizer que não vivo mais sem ele.

O gerenciador de pacotes mais comum é o Mac Ports, a primeira coisa que você tem que fazer é atualizá-lo. Só que, eu tive alguns problemas com ele para atualizar algumas gems. Primeiro, algumas libs tem de ser recompiladas para a nova arquitetura, que antes era apenas x86 e passaram a ser x86_64.

Posso dizer que os melhores passos que fiz foi o deste wiki do ports para reinstalar as dependências. Acontece que eu sugiro que você remova completamente todas e esqueça do Mac Ports. Lendo em alguns posts da internet, é comum ver os problemas que o Mac Ports tem, como duplicação de bibliotecas entre outros. Quando tinha o Mac Ports ele não conseguia recompilar algumas gems do ruby, como curb, após remover todas, ele passou a usar o do Mac, que vem com o Xcode, e foi uma beleza.

Acho que depois que passei a usar apenas as libs do Xcode não tive problemas algunas para instalar native build gems como nokogiri e entre outros.

Uma outra opção que tem ganhado espaço é o Homebrew que é uma ferramenta para gerar scripts de instalação de libraries, ainda não tive tempo de explorar ele, mas muitos desenvolvedores tem começado a usá-lo por resolver alguns problemas do Mac Ports.

Moving to Snow Leopard

Após 1 ano de experiência com Mac OSX Leopard estou migrando para o Snow Leopard.

Como um usuário de anos de uso do Windows, meu velho costume é o de sempre fazer um fresh/clean install do sistema operacional. Normalmente, no Windows o motivo de fazer um clean install é para conseguir de volta o desempenho do sistema operacional depois de inúmeros programas, de certo modo, inúteis, e como muitos sabem o uninstall não faz um uninstall completo. Por este motivo formatação para mim tem sido sempre a melhor opção.

Já no Mac não tive muito este problema de queda no desempenho. Claro que com o tempo você começa a instalar inúmeros aplicativos existem vários serviços para serem subidos no sistema operacional e isso reduz um pouco o desempenho do boot. Então resolvi fazer o upgrade do Leopard para o Snow Leopard e ver no que dá.

Tudo que fiz foi dar uma pesquisada na internet sobre quais os melhores procedimentos para se realizar o upgrade. Como a maioria dos sites, as recomendações foram:

  • Backup dos dados com Time Machine + DVD: neste caso eu só optei pelo Time Machine para um HD externo

  • Limpeza: uma das partes mais demoradas (“chatas”) do trabalho de instalação do sistema operacional. É uma ótima oportunidade para remover todo aquele “lixo” que você nem sabia que existia, principalmente do Downloads, cheguei a remover +5Gb só neste diretório

  • Remoção de aplicativos: Aproveitei para remover algums Apps trials que instalei, utilizando junto o AppSweeper do Hazel que notifica arquivos não removidos da remoção do App.

  • Limpeza do Sistema Operacional: recomendo o Onyx principalmente por que ele faz uma verificação do “estado” do seu HD, e vendo se não existe nenhum problema que poderia prejudicar o upgrade. Outra opção é o Cocktail que é pago.

Feito estas etapas, foi somente colocar o DVD de instalação do Snow Leopard e esperar por volta de 1h e BOOM, Snow Leopard instalado.

Infelizmente, existem alguns efeitos colaterais do upgrade, mas que para mim não foram muito significativos. Um deles foi apenas que uma conta de usuário (para desenvolvimento) sumiu. Como esta conta não tinha nada, para mim foi indiferente, mas de uma buscada na internet se para você isto for importante.

Bom, depois da instalação não tive muitos problemas, os principais aplicativos continuaram funcionando. Todos os apps com suporte a 64-bits já começaram a aparecer no Activity Monitor. Nós próximos posts estarei reportando alguns problemas e soluções que apliquei após a atualização.

Só posso dizer que até o momento não sinto problema em não ter feito um clean install, mas posso dizer que sinto falta deste trabalho após longos anos de experiência do Windows…

Configuração NAT em VMs no VMWare Fusion e Workstation

Recentemente tenho trabalhado com muitas aplicações e não dá para ter tudo instalado na mesma máquina por que vários serviços podem conflitar entre si, seja por versões ou duplicidade de instâncias, por exemplo versões de banco de dados de diferentes verões na mesma máquina.

O que fazer? Configurar VMs (Virtual Machines)!

Se você tem um PC relativamente novo já deve ter experimentado utilizar máquinas virtuais para emular algum sistema, por exemplo linux ou versões de sistemas betas e etc. Digamos que você queira ter um servidor *NIX rodando na sua máquina com um servidor web para desenvolvimento, seja Java/PHP/Python o que for, uma vez que em grande parte esses sistemas são colocados em produção nesses tipos de sistemas e não no Windows.

Estou usando o VMWare 2.0 para isso, agora estou de Mac e portanto estou usando a versão Fusion que é a única disponível dos produtos da VMWare. No caso do mundo Windows, temos Player, Workstation e Server. Usei também a versão Workstation 6.5.x.

Um pouco de teoria…

Acontece que a configuração padrão de rede é NAT que é um tradutor de endereços de rede. Veja a imagem abaixo para ilustrar a configuração NAT:

VM NAT

Como pode ver na figura acima, você tem uma máquina virtual rodando no seu computador e utiliza a interface de rede dele para acessar sua rede local. Veja que o recurso de rede é compartilhado, de modo que sua VM não fica exposta na rede externa, onde o seu computador atua como um “firewall”.

Digamos que eu queira expor meu servidor web para o resto da rede, neste caso na VM estou com a porta 80 aberta, porém o IP virtual que é configurado na VM não é visto pela rede. Entenda isso como o analogo a sua configuração de rede que provavelmente deve ter um roteador que interfaceia sua rede local com o seu provedor de acesso a internet. Ou seja, o pessoal de fora não vê seu PC e sim o roteador. Se desejarmos expor precisamos “traduzir” as requisições para que sejam enviadas ao destino correto, em nosso caso seu PC-Roteador ou VM-Computador.

Para entendermos melhor, precisamos entender como uma comunicação é feita, não vou entrar em muitos detalhes.

Para que você se conecte a uma máquina precisamos do endereço IP e a porta de comunicação. Digamos que vá acessar uma página na Web pelo seu navegador predileto. Você digita www.fabioyamate.com este endereço será traduzido para um endereço IP por servidores DNS e a requisição será enviada para a porta 80 (default), que é padronizada para servidores Web. Neste caso não explicitamos a porta, pois o navegador já estabelece isso por padrão. Se precisássemos de outra porta, digamos 8080, precisaríamos requisitar www.fabioyamate.com:8080.

Ok, agora que sabemos disso, como expomos a porta 80 da minha máquina virtual? Se você não entendeu o problema, veja que a porta 80 da sua máquina não é a mesma da máquina virtual. Precisamos ensinar que as requições que cheguem na porta 80 do meu computador vão para a porta 80 da minha máquina virtual, essa etapa é que chamamos de tradução.

Assim, queremos relacionar vm:80 <-> comp:80, poderíamos associar a portas diferentes, digamos: vm:80 <-> comp:12345. Então faríamos requisições para a porta 12345 para acessarmos o serviço rodando na máquina virtual.

Colocando em Prática

Agora que entendemos o conceito do funcionamento, precisamos saber como configurar isso na VM. No VMWare, novas interfaces de redes são adicionadas, que neste caso são virtuais. No VMWare Fusion, a tabela de tradução de endereços encontra-se no diretório:

1
/Library/Application Support/VMWare Fusion/vmnet8/nat.conf

Uma boa prática é sempre mantermos uma cópia da verão em funcionamento para caso realizemos uma besteira podemos restaurar.

1
2
sudo cp nat.conf nat.conf.backup
sudo vi nat.conf

Agora basta adicionarmos a tradução da seguinte forma:

1
porta_local_maquina = endereco_vm:porta_vm

Exemplo:

1
2
# Servidor Web
8080 = 172.16.250.130:80

Basta salvar o arquivo usando :wq! (pois o arquivo é readonly) no vi, se sentir dificuldade de uma navegada na internet, ou use outro editor a sua escolha.

Agora precisamos reconfigurar a interface virtual para que as alterações tenham efeito.

No diretório /Library/Application Support/VMWare Fusion temos um script boot.sh, assim digite:

1
sudo ./boot.sh --restart

Isso irá reconfigurar. Pode ser que necessite desligar a máquina virtual, mas normalmente não é necessário.

Com isso você já pode acessar de fora a máquina virtual configurada.

No Windows o processo é igual, mas é feito por interface gráfica, se não me engando Network Editor ou algo do gênero.

Note que se você usa algum firewall você deve liberar as portas da máquina virtual para que o serviço seja realmente exposto.

Um utilitário muito bom é o nmap que tem tanto para todas as plataformas. Basta usar o comando:

1
nmap -p <PORTA> <ENDERECO_IP>

ou

1
nmap -p <PORTA_INICIAL>-<PORTA_FINAL> <ENDERECO_IP>

Caso ping esteja restrito no firewall, use -PN.

Espero que este texto seja de ajuda.

Java Development

Nos meus últimos 2 anos tenho dedicado a maior parte da minha evolução técnica no mundo .NET. Primeiramente, comecei a trabalhar com essa tecnologia, ao invés de java e, isto, de certa forma me influênciou, mas com o tempo acabei me apaixonando pela linguagem C#. A realidade é que prefiro muito mais C# do que Java, porém não se pode ignorar a comunidade Java que existem muito mais soluções em nível Enterprise.

A plataforma .NET é muito fechada as decisões da Microsoft. O ASP.NET é uma das plataformas das quais não me sinto vontade de trabalhar, ela fica extremamente difícil de aplicar padrões. De uns dois ou três anos para cá é que isso tem modificado com o surgimento de frameworks opensource, como Castle Project, NHibernate, IoC e muitos outros. Contudo, todos são originários de frentes vindas do Java.

A linguagem Java, em si, nem é o aspecto mais importante para mim, e sim, as tecnologias que envolvem para se desenvolver uma aplicação.

Por este motivo, estou pensando em começar a trabalhar com Java, novamente, mas como uma visão de soluções corporativas.

Vou começar a estudar alguns frameworks web, principalmente pelo aspecto de arquitetura, que é uma área a qual tenho um grande interesse em me aprofundar.

Não vou deixar o mundo .NET, mas tentarei escrever algumas coisas sobre Java contando minhas experiências.

Não me esqueci dos posts sobre ASP.NET MVC não.

Até a próxima!

Batch Download Legendas.TV (Greasemonkey)

Semana passada precisava baixar algumas legendas antigas do site Legendas.TV, e nunca achei prático baixar legendas por que tem popups. Com isso, acabei fazendo meu primeiro script para o greasemonkey+jquery. Foi bem simples. Quem quiser baixar é só ir na páginas de projetos ou clicando aqui.

ASP.NET MVC 1.0

Ei, o ASP.NET MVC RTM 1.0 foi lançado!

Ok ok… todo mundo já deve estar sabendo, não estou querendo fazer anúncio.

Bom, nas últimas semanas tenho trabalho com ele para fazer um projeto de um sistema de matrículas, não entrarei em detalhes pois não é o interesse aqui.

Meu primeiro contato, real, com MVC foi pelo Castle Project MonoRails. Até então não conhecia exatamente como funcionava, e sabe o que aconteceu? Adorei. Meus primeiros passos não foram programando em C. Comecei realmente por PHP. Ok, tive meus primeiros passos com QBasic no colégio, por conta própria, mas deixo essas histórias para um outro dia.

Nos próximos dias, talvez meses, tentarei falar um pouco das minhas experiências com ele, incluindo diversos outros frameworks que estou começando a ver como NHibernate, IoC e etc.

Espero conseguir realizar este projeto, e tornar o blog mais ativo.

Ainda estou atras de um bom editor de blogs, estou agora usando Mac, e infelizmente acabei perdendo o Live Writer da Microsoft nesta migração. Veremos o que farei com relação a isso, até lá irei de Wordpress.

Abraços