1up4developers logo

1up4developers

Nadando contra o Waterfall. tail -f /mind/realworld >> /blog

[QuickTips] Do Wordpress Para Octopress/Jekyll No GitHub Pages

| | Comments


Quando migramos nosso blog do Wordpress para o GitHub Pages, escrevi um email para nossos autores com instruções resumidas para configurar e postar com Octopress/Jekyll. Percebi que dando um tapa nesse email, poderia publicá-lo aqui no blog como um guia rápido e talvez incentivar outros blogueiros a fazer o mesmo.

Por que GitHub Pages?

Corte de custos! Manter o blog no Wordpress requer um hosting, um banco de dados e um domínio. Reduzimos as despesas apenas para o registro de domínio (por enquanto).

Performance! GitHub Pages é estático, e conteúdo estático é servido naturalmente mais rápido.

Desafio! Estavamos “acostumados” ao Wordpress. Aprender Jekyll e a postar “commitando em um projeto” permite que tenhamos novas idéias, ou no pior dos casos, aprendamos novas tecnologias.

Requisitos

Para utilizar o GitHub Pages, crie um repositório com o nome usuariogithub.github.io, incluindo o “github.io”. O GitHub gerencia este repositório e publica o conteúdo estático no endereço http://usuariogithub.github.io

Agora, para gerar o conteúdo estático vamos usar o Octopress.

Instalação

Basta clonar o repositório do Octopress localmente:

1
$ git clone git@github.com:imathis/octopress.git

instalar as gems necessárias e em seguida rodar a rake para configuração:

1
$ rake setup_github_pages

e informar o seu repositório do GitHub Pages:

git@github.com:username/username.github.io.git

Pronto! Os remoting points do projeto serão configurados para seu repositório do GitHub, como segue:

1
2
3
4
5
6
$ git remote -v

octopress git@github.com:imathis/octopress.git (fetch)
octopress git@github.com:imathis/octopress.git (push)
origin     git@github.com:username/username.github.io.git (fetch)
origin     git@github.com:username/username.github.io.git (push)

Postando

Para criar um novo post, basta rodar a rake:

1
$ rake new_post["o titulo do seu post"]

o que vai criar o arquivo source/_posts/2013-09-17-o-titulo-do-seu-post.markdown. Escreva o conteúdo do seu post normalmente em Markdown (recomendo utilizar o Markup Editor) e execute:

1
$ rake generate

para gerar o site estático no diretório _deploy. Caso queira dar um preview no que será publicado, basta rodar:

1
$ rake preview

e acessar no browser http://localhost:4000.

Publicando

Quando terminar seu post, basta rodar:

1
$ rake deploy

para publicar o site no seu repositório do GitHub Pages.

Pronto! Não se esqueça de subir os fontes do site (branch source), commitando suas alterações e executando o classico git push.

Migrando

Caso já tenha um site publicado no Wordpress, você pode seguir este guia para importar todo o conteúdo na estrutura do Jekyll:

How to Migrate from WordPress to Jekyll Running on Github

Referências

Introdução a Linux Control Groups (CGroups)

| | Comments


Em tempos de Metodologias Àgeis, iniciativas como DevOps, adoção de Cloud Computing e derivados (SaaS, IaaS e PaaS), aplicações que demorariam meses, senão anos para estar na www, hoje em questão de dias, e por que não horas, é possível estar disponíveis ao usuário final.

Com a necessidade de ter os aplicativos de forma mais rápida em produção, a adoção e criação de PaaS (Platform as A Service) tem sido a nova “onda do verão” e tecnologias como LXC, Docker e CGroups atuam como o cerne dessa “wave”.

O que são CGroups?

CGroups é uma feature do Kernel que provê mecanismos para organização de Processos em forma de grupos e limita recursos de máquina como Consumo de CPU, memória e I/O para estes.

Curioso pra ver como funciona?

Situação de Exemplo

Para este exemplo teremos duas aplicações Sinatra e nosso objetivo será dedicar um grupo para cada aplicação limitando o consumo de memória para cada uma elas.

Para rodar o exemplo estarei utilizando um Ubuntu 12.04 64 bits.

Pré-Requisitos

Antes de mais nada precisamos instalar algumas dependências:

1
sudo apt-get install cgroup-bin libcgroup1

Com a instalação dos pacotes acima veremos que um novo filesystem foi montado em /sys/fs/cgroup

1
2
3
4
5
6
7
8
9
ls -al /sys/fs/cgroup

drwxr-xr-x 7 root root 140 Aug  6 09:38 .
drwxr-xr-x 6 root root   0 Aug  6 09:37 ..
drwxr-xr-x 6 root root   0 Aug  6 09:38 cpu
drwxr-xr-x 6 root root   0 Aug  6 09:38 cpuacct
drwxr-xr-x 6 root root   0 Aug  6 09:38 devices
drwxr-xr-x 6 root root   0 Aug  6 09:38 freezer
drwxr-xr-x 6 root root   0 Aug  6 09:38 memory

CGroups estão organizados por subsistemas conhecidos também como “resource controllers” responsáveis por gerenciar memória, cpu, dispositivos, entre outras coisas. Na organização acima cada diretório representa um Resource Controller.

CGConfig Service

Para gerenciar CGroups iremos utilizar a utilitário cgconfig instalado como o pacote libcgroup1. É interessante checar se o serviço está rodando antes de continuar :

1
sudo service cgconfig status

Caso não esteja inicie o serviço

1
sudo service cgconfig start

Existem duas formas de configurar CGroups com cgconfig, diretamente no arquivo de configuração /etc/cgconfig.conf’ ou via linha de comando, que será o meio que iremos utilizar.

Criando Grupos

Para criar um grupo, utilizamos o comando cgcreate passando como argumento quais controllers estarão associados a ele.

1
2
sudo cgcreate -g cpu,cpuacct,devices,memory,freezer:/sinatra1
sudo cgcreate -g cpu,cpuacct,devices,memory,freezer:/sinatra2

O argumento /sinatra* indica o caminho relativo do grupo dentro de cada Resource Controller. Ex : /sys/fs/cgroup/<resource_controller>/

Executando programas em um Grupo

Para executar determinado processo em um grupo utilizamos o comando cgexec passando como argumentos quais controllers estarão associados ao processo e o caminho do grupo que ele estará associado.

1
2
sudo cgexec -g *:/sinatra1 sh -c 'cd <path_to_sinatra1> && exec rackup -p 4567 -D'
sudo cgexec -g *:/sinatra2 sh -c 'cd <path_to_sinatra2> && exec rackup -p 4568 -D'

O asterisco (*) acima significa que o processo estará associado a todos os controllers.

Para checar a hierarquia criada:

1
2
3
4
ps xawf -eo pid,cgroup,args | grep ruby
 1476              \_  5:freezer:              \_ grep --color=auto ruby
 1418  5:freezer:/sinatra1?4:memo /usr/bin/ruby1.9.1 /usr/local/bin/rackup -p 4567 -D
 1454  5:freezer:/sinatra2?4:memo /usr/bin/ruby1.9.1 /usr/local/bin/rackup -p 4568 -D

Para setar os valores em determinado controller utilizamos o comando cgset. No caso abaixo estamos limitando o consumo de memória para o grupo sinatra1 em 256MB e para o grupo sinatra2 em 128MB.

1
2
sudo cgset -r memory.limit_in_bytes='256M' sinatra1
sudo cgset -r memory.limit_in_bytes='128M' sinatra2

Para checar a alteração:

1
2
cat /sys/fs/cgroup/memory/sinatra1/memory.limit_in_bytes
cat /sys/fs/cgroup/memory/sinatra2/memory.limit_in_bytes

Conclusão

O intuito deste artigo foi demonstrar um dos possíveis usos de CGroups. Caso a aplicação sinatra1 cair por estouro de memória ou alguma outra falha que não seja a destruição da máquina, a aplicação sinatra2 continuará funcionando.

Há mais a se explorar, poderíamos inserir limitação de I/O, consumo de banda, entre outras coisas. Poderíamos até criar nossa própria implementação de LXC, mas isso é assunto para um próximo encontro.

Os links abaixo exploram mais detalhes sobre o assunto :

Divirtam-se!

Extendendo Ruby Com C - Só Um Aperitivo

| | Comments


Extender Ruby em C não é complicado. É claro, você deve ao menos ter o conhecimento básico da linguagem C.

Vamos criar uma extensão que retorna uma simples String.

Primeiramente criamos o diretório onde estará nossa extensão :

1
$ mkdir <your_path>/1up4dev

Crie um arquivo chamado 1up4dev.c e dentro dele inclua o header “ruby.h”

1
#include <ruby.h>

Tudo em Ruby relaciona-se com o tipo VALUE. Para nosso exemplo, vamos criar um VALUE m1up4dev representando um módulo.

1
VALUE m1up4dev;

E para representar uma classe, abaixo deste módulo, a qual chamaremos de Talker, criaremos uma VALUE cTalker:

1
VALUE cTalker;

Nossa classe Talker precisa fazer algo, vamos adicionar uma simples função que retorna uma String.

1
2
3
4
static VALUE say_yeah(VALUE self){
  const char *sentence= "YEAH YEAH!";
  return rb_str_new2(sentence);
}

Na função say_yeah, VALUE self representa o objeto associado a função, sentence a String de retorno e a função rb_str_new2 converte o *char em uma Ruby String.

Para deixar esse código acessível no mundo Ruby, criaremos uma função chamada ‘Init_1up4dev’. Por convenção estas funções sempre começam com o prefixo ‘Init_’.

1
2
3
4
5
void Init_1up4dev(){
  m1up4dev = rb_define_module("1up4dev");
  cTalker = rb_define_class_under(m1up4dev, "Talker", rb_cObject);
  rb_define_singleton_method(cTalker, "say_yeah", say_yeah, 0);
}

A função ‘rb_define_module’ define um módulo no topo da hierarquia. Algo como:

1
2
module 1up4dev
end

A função ‘rb_define_class_under’ define uma classe abaixo de um módulo ou outra classe. Isso irá gerar:

1
2
3
4
5
module 1up4dev
  class Talker

  end
end

A função ‘rb_define_singleton_method’ é responsável por criar um método singleton em uma classe ou módulo, neste caso ele estará atrelado a class Talker.

Para rodar nosso exemplo, crie um arquivo chamado ‘extconf.rb’ contendo:

1
2
require 'mkmf'
create_makefile('1up4dev')

Executando o script, irá ser gerado um arquivo Makefile para executar o build da extensão.

1
$ ruby extconf.rb

Compile e instale a extensão:

1
$ make && make install

Para ver o código funcionando basta digitar o código abaixo em um ‘irb’ ou algo do gênero :

1
2
3
4
$irb(main):001:0> require '1up4dev'
true
$irb(main):002:0> 1up4dev::Talker.say_yeah
"YEAH YEAH!"

YEAH YEAH!!

Entendendo LISP, Finalmente.

| | Comments


A sintaxe invertida

Ao olhar um código LISP pela primeira vez, você se assusta.

Eu me assustei e não havia ninguém para me ajudar a entender.

Que bom que você está lendo isto para entender bem depressa e perder o medo.

Acredite ou não, o LISP não é invertido: as outras linguagens é que são inconsistentes.

Matematicamente falando, funções são expressas dessa forma:

y = f(x)

Para calcularmos o dobro de um número, teríamos:

y = dobro(21)

Note que estamos usando uma notação diferente: primeiro vem o operador dobro e, em seguida, vem o operando, ou parâmetro, 21. Chamamos isso de notação prefixa.

Já para executar um cálculo matemático, usamos a forma abaixo:

y = 21 * 2

Primeiro temos um operador 21, depois temos um operando responsável pela multiplicação e, finalmente, o segundo operando 2. Chamamos essa forma de notação infixa.

Nota: se você é um desenvolvedor Ruby, ignore essa última expressão. Em Ruby o cálculo acima utiliza internamente a notação prefixa onde 21 é um objeto, * é um método (ou uma mensagem, se preferir) e 2 é um parâmetro.

A coisa fica bagunçada quando misturamos as duas formas:

y = dobro(7 * 3)

Na expressão acima misturamos notação prefixa com infixa. Não há problema algum com isso, mas não é um bom exemplo de consistência.

Quando falamos em LISP, o primeiro item de uma lista é um operador e todos os demais são operandos.

Todo operador é uma função, macro ou forma especial, inclusive os operadores matemáticos. Não se preocupe em entender agora o que são macros ou formas especiais. Todo o resto da lista é considerado um valor, parâmetro ou operando.

Imagine agora que o símbolo + é uma função. Para calcularmos uma soma usaríamos o seguinte código:

+(1, 2)

Movendo os parênteses e removendo as vírgulas, a nossa soma inicial ficaria:

(+ 1 2)

Sabemos que dobro também é uma função. Para calcular dobro, usaríamos:

(dobro 12)

Percebam que agora temos uma regra que se aplica a todos os casos. Repetindo a expressão acima que mistura as notações infixa e prefixa usando as regras do LISP, teríamos:

(dobro (+ 7 3))

Talvez pela sua origem acadêmica e fortemente influenciada pela matemática, as implementações de LISP levam muito a sério a questão da consistência.

Os parênteses

Quando eu estava na quarta série, aprendi uma coisa chamada expressão numérica, que consistia em resolver um cálculo extenso atacando um pedaço por vez, organizadamente.

Cada pedaço desse cálculo ficava dentro de parênteses, colchetes ou chaves, dependendo do quão aninhado estivesse a expressão. Eu nunca mais vi esse tipo de hierarquia, mas era um jeito bacana de manter a organização.

Uma expressão numérica tem essa cara:

x = {1 + [3 * (5 + 7)]}

Resolvemos a expressão de dentro para fora:

x = {1 + [3 * (12)]}

x = {1 + [36]}

x = {37}

x = 37

Simples, não?

Agora vamos extrapolar o que aprendemos na quarta série para uma linguagem de programação, trocando chaves e colchetes por parênteses:

x = (1 + (3 * (5 + 7)))

Vamos substituir a nossa conhecida notação infixa pela prefixa.

x = (+ 1 (* 3 (+ 5 7)))

Pronto. Você tem uma expressão numérica com a cara do LISP, resolvendo da forma como a professora ensinou lá na quarta série: primeiro você resolve os parênteses de dentro, depois os próximos, até terminar.

Qualquer LISP que você encontrar pela frente, incluindo o Clojure, funciona exatamente dessa maneira.

Uma vantagem que isso traz é que você não precisa ficar se preocupando com precedência de operadores.

Imagine que você tem o código abaixo:

x = 3 * 2 + 1

y = 1 + 2 * 3

Os valores de x e y serão iguais? Sim, ambas as variáveis contém o número 7, mas para saber disso você precisou ler em algum outro lugar que o operador de multiplicação tem precedência sobre o operador de adição. É algo que você espera que seja assim e age como se realmente fosse.

E o que aconteceria se você estiver usando uma linguagem em que a adição tem precedência sobre a multiplicação? Ou pior ainda: os operadores são executados da esquerda para a direita conforme forem aparecendo.

No primeiro caso, x e y continuariam sendo igual, mas ambos teriam o valor 9. No segundo caso, x seria igual a 7 e y seria igual a 9.

Seria mais fácil se as expressões fossem escritas assim:

x = (3 * 2) + 1

y = 1 + (2 * 3)

Agora está claro para qualquer pessoa o que vai ser executado primeiro, independente do modo como a expressão seja interpretada pela linguagem. Pois saiba que é exatamente assim que um LISP trabalha. Usando a notação prefixa, as expressões acima ficariam:

x = (+ (* 3 2) 1)

y = (+ 1 (* 3 2))

Primeiro será executada a multiplicação, que está nos parênteses mais internos e, em seguida, será executada a adição. Tudo isso sem se preocupar com regras ocultas ou peculiaridades do compilador.

Qualquer código em qualquer dialeto LISP, mesmo com suas características particulares, fica fácil de entender se você lembrar dessas regrinha.

[QuickTips] Usando Shell Script Como Suite De Teste

| | Comments


Indo na linha do programador pragmático, às vezes, dependendo do time ou linguagem do projeto, é muito mais prático usar shell script para testar. Recentemente resolvi usar esta abordagem, e cheguei no seguinte “template” em shell script para testar uma API Server.

Dependências:

  • bash

  • curl

Foi testado no Ubuntu 13.04.

Obs: Vou embedar este gist, e pode ser que não apareça no seu reader ;D.

Obs2: Este post é uma versão pt-br deste post no coderwall Using Shell Script to test your server.

test.sh
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
  #!/bin/bash

URL=http://localhost:8080

## Unit-Testable Shell Scripts (http://eradman.com/posts/ut-shell-scripts.html)
typeset -i tests_run=0
function try { this="$1"; }
trap 'printf "$0: exit code $? on line $LINENO\nFAIL: $this\n"; exit 1' ERR
function assert {
    let tests_run+=1
    [ "$1" = "$2" ] && { echo -n "."; return; }
    printf "\nFAIL: $this\n'$1' != '$2'\n"; exit 1
}
## end

###############################################################

try "Example of GET and test for 404 status"

out=$(curl -s -w "%{http_code}" $URL)
assert "404" "$out"

try "Example of POST XML"

# Post xml (from hello.xml file) on /hello
out=$(cat test/hello.xml | curl -s -H "Content-Type: text/xml" -d @- \
  -X POST $URL/hello)
assert "Hello World" "$out"

###############################################################
echo
echo "PASS: $tests_run tests run"

Referências:

Unit-Testable Shell Scripts

Aguardo dicas, sugestões, experiências etc.

A Melhor Linguagem De Programação

| | Comments


Eu tenho a felicidade de ter um sogro que trabalha com desenvolvimento de softwares. Ele tem a experiência de já ter sido empresário e de já ter visto de quase tudo nessa área.

Atualmente ele está trabalhando em um projeto para Web e comentou que está dando preferência a uma ferramenta proprietária que eu particularmente não gosto.

Numa conversa que achei muito produtiva, nós concordamos que, independente de gostar ou não, “software é bola na rede”, onde o importante é entregar o produto, atendendo as necessidades do cliente no menor tempo possível.

Eu trabalhei com PHP por dez anos, com Delphi por seis e estou indo para oito com Java, usando diariamente cada uma dessas linguagens. Já tive experiências com C e trabalho há anos com Ruby e JavaScript, atualmente tenho me concentrado em Clojure e, gostando mais de umas e menos de outras, conheço as forças e fraquezas de cada uma delas.

No final das contas, eu gosto da analogia de que o nosso trabalho se assemelha ao de um carpinteiro/marceneiro (desculpe, mas eu não sei muito bem a diferença entre ambos). Esses profissionais usam várias ferramentas para chegar ao produto final e, ao invés de perderem tempo em fóruns e discussões, eles buscam as ferramentas adequadas a cada tipo de tarefa, buscando entregar o melhor produto no menor tempo e menor custo (entenda ‘melhor produto’ como algo totalmente subjetivo).

Linguagens de programação são meras ferramentas, assim como serrotes, limas, martelos e sei lá que outras ferramentas os profissionais da madeira usam.

Assim sendo, o que é melhor? SASS, SCSS, LESS ou CSS puro? HAML ou ERB? A melhor é aquela que trouxer menos dor de cabeça, custo e tempo de desenvolvimento. Avalie com cautela aquilo que “está na moda” ou “que é o padrão de mercado” e escolha o que for melhor para o que você precisa, usando argumentos técnicos e financeiros, e deixando a paixão de lado.

Aprenda a sua linguagem de trabalho a fundo, e procure conhecer alternativas. Ao me tornar um bom desenvolvedor Ruby, eu aprendi a escrever um código Java melhor. Ao entender LISP, eu me tornei mais produtivo em JavaScript.

Quando for escrever ou comentar algo do tipo “Porque PHP fede”, ou perguntar num fórum “O que é melhor: PL/I ou FORTRAN 66?”, procure estudar mais, entender que nem todo mundo vive a mesma realidade que você e mesmo, algumas vezes, nem todo mundo tem o interesse em aprender tanto quanto você.

Às vezes, o que o outro desenvolvedor quer é apenas entregar o trabalho, receber o pagamento e ir para casa.

P.S.: de qualquer maneira, se você quiser e puder, aprenda o máximo de linguagens que conseguir. Eu acho divertido, e profissionalmente é algo que tem me dado bons resultados.

O Que Eu Aprendi Escrevendo

| | Comments


Apesar de ter um livro e um curso publicados, eu ainda estou longe de ser considerado um escritor. Honestamente, nem ao menos sei o que é necessário para que eu, ou outra pessoa, me considere como tal.

Pretendo escrever outro livro ainda esse ano, mas ainda não tenho nada definido. Escrever um curso ou um livro é algo cansativo, mas muito gratificante. Como não dei espaço entre um e outro, acho que seria bom eu tomar um ar antes de me lançar novamente nessa empreitada.

Seguindo os próprios passos que descrevo abaixo, resolvi separar alguns pontos que considero importantes.

Escrever é um processo iterativo e incremental

O texto não nasce pronto. As vezes uma coisa ou outra está pronta na sua cabeça, mas na hora de colocar no papel a coisa muda. Você esquece algumas partes, lembra de outras, muda a ordem.

O importante é que você coloque suas ideias no papel (ou no site), e depois releia com calma. Mostre para outras pessoas, peça opinião. Eu pensei em um texto por mais de dois anos e publiquei aqui antes de adicionar no livro. O feedback dos leitores foi importantíssimo para que a versão final tivesse o mínimo de erros e o máximo de clareza possível.

Defina bem o seu público

Ao escrever sobre programação funcional em JavaScript, eu tinha bem claro quem é o leitor do 1up. Caso você não tenha definido quem será seu público e quais os requisitos necessários para que possam absorver seu conteúdo, você vai correr o risco de escrever um texto em aramaico para crianças de quarta série ou um texto de quarta série para doutores em línguas mortas.

Pior ainda é quando se tenta abraçar a todos. Seus braços são curtos para abraçar o mundo e, no final, alguma coisa vai acabar caindo no chão.

Trace uma linha

Como o Manifesto Ágil profere, responder a mudanças é mais importante do que seguir um plano, o que não quer dizer que você não precisa de um plano.

Eu costumo traçar um plano, seja como uma lista de tópicos, seja como um mindmap, e vou me guiando por ele até pegar o ritmo. Normalmente essa lista não permanece inalterada por mais de dois capítulos, mas ainda assim é importante você ter algo para te manter no caminho, por mais que esse caminho mude constantemente.

Concentre-se

Eu tenho problemas sérios de concentração, mas em algumas ocasiões consigo despejar quilos de texto ou código de uma única vez. Claro que uma revisão posterior é sempre bem vinda e necessária.

O problema são os culpados de sempre: família exigindo atenção (eles têm prioridade, não pense o contrário); Internet oferecendo todo o tipo de entretenimento; GTalk aberto e seus amigos ali, ao alcance dos dedos.

Escrever é um ato solitário. Lide com isso e concentre-se no que está fazendo.

Arranje tempo

“Eu não tenho tempo” é a desculpa preferida do procrastinador e do cara que quer que os outros acreditem que ele é muito ocupado.

Você tem tempo para conversar no GTalk, para acessar o 9gag, para ver os gols do Fantástico, mas nunca temos tempo para brincar com o filho, para conversar com a esposa (ou marido) ou para fazer aquela meia hora de esteira.

Um terço do meu livro foi escrito dentro de viagens em ônibus, táxis e aviões. Acho que produzi muito mais em uma hora de vôo até o Rio do que em uma tarde inteira jogada fora na frente do computador.

Quando você realmente quer fazer algo, o tempo aparece. Não ter tempo é uma outra forma de dizer “isso não é importante o suficiente para mim”.

‘Pronto’ é melhor do que ‘perfeito’

Depois do livro e do curso prontos e entregues, eu percebi coisas que poderia ter adicionado, frases que poderia ter mudado, assuntos que faltaram. Se existe a possibilidade de adicionar ou mudar, faça, mas não caia na armadilha de ficar polindo algo que já deveria estar em produção há tempos.

Pronto é melhor do que perfeito e, não importa o quanto você tente, seu trabalho nunca vai ficar perfeito.

Divirta-se

Principalmente, divirta-se.

Conheci muitas pessoas que sabem muito mais do assunto que estou escrevendo do que eu, pessoas que deram excelentes sugestões, ideias e me ensinaram a escrever melhor. E em tudo isso eu me diverti, aprendi, aproveitei o momento.

Não se leve tão a sério. É apenas um texto, um post, um curso, um livro. A vida é bem mais do que isso.

Abraço

Novos Rumos

| | Comments


Depois de um 2012 movimentado, resolvi tirar minha certificação PMI e, a partir de hoje, trabalho como gerente da fábrica de software de uma conhecida consultoria, líder de mercado.

Pretendo aplicar, de maneira holística, processos definidos e reproduziveis que performem de maneira out of box a sinergia entre o levantamento de requisitos, desenvolvimento no chão de fábrica e posterior envio ao setor de testes, visando a garantia de qualidade do entregável.

=)

Pair Programming Remoto Com Screen E Vim

| | Comments


Limitar a produtividade e colaboração interpessoal ao espaço físico de um escritório parece uma idéia cada vez menos viável no ramo de desenvolvimento de software.

Empresas de TI bem sucedidas como 37signals e Github apostam em times e colaboradores distribuídos pelo mundo trabalhando remotamente em seus projetos.

Usando as ferramentas e práticas certas é possível trabalhar remotamente e até mesmo parear com outro desenvolvedor à distância.

Requisitos

  • ssh

  • screen

  • vim

  • skype

Para compartilhar o mesmo “contexto” remotamente, ambos desenvolvedores deverão ter acesso ao mesmo ambiente de desenvolvimento, via ssh. Estando em modo texto, será necessário utilizar um editor compatível, neste caso o VIM.  E para compartilhar o terminal em tempo real, utilizaremos o Screen. Para comunicação, basta utilizar o Skype. Simples não!?

Instalação

Uma vez escolhido o ambiente de desenvolvimento comum (um servidor de homologação, por exemplo), instale o Screen:

$ sudo apt-get install screen

Em seguida, configure as permissões de execução:

$ chmod u+s /usr/bin/screen
$ chmod 755 /var/run/screen

O Screen roda como um daemon, mantendo um buffer da tela. Sendo assim, o primeiro passo é iniciar a sessão do Screen:

$ screen -S nomedasessao

Isso criará uma sessão com o nome “nomedasessao” e será exibido um shell “limpo”, o que quer dizer que você já está conectado a esta sessão. Para verificar, execute:

$ screen -ls
There is a screen on:
        8095.nomedasessao   (19-03-2013 23:32:54)   (Attached)
1 Socket in /var/run/screen/S-user.

A partir de agora, o buffer desta sessão pode ser compartilhado com outro usuário conectado. Basta que seu par se logue no servidor via ssh e execute:

$ screen -x nomedasessao

Pronto! O que você digitar, seu par vai ver e vice-versa. Assim, basta abrir o VIM e começar a parear remotamente.

Para se desconectar da sessão atual, execute:

# screen -d
[remote detached from 8095.nomedasessao]

Usando o Screen

O Screen é simples e poderoso. É possível criar abas (window), dividir a tela (split), rolar a tela (copy mode), etc.

Todos comandos começam com Ctrl + a, em seguida o comando ou atalho. Seguem alguns comandos e atalhos que serão muito úteis do seu dia-a-dia pareando:

Copy mode (scroll) Inicie o modo de cópia com Ctrl-a + [ (colchete para esquerda) Navegue pela tela com as setas ou pageup/pagedown; Marque o início da seleção do texto com <espaço> e termine com <espaço> para copiar; Cole com Ctrl-a + ] (colchete para direita);

Windows Crie uma janela (ou aba) com Ctrl-a + c Liste as janelas com Ctrl-a + “ (aspas) Altere para a janela com Ctrl-a Feche (ou mate) a janela atual com Ctrl+a k

Split Divida a tela horizontalmente com Ctrl-a + S Divida a tela verticalmente com Ctrl-a + V Mude de split com Ctrl-a + Tab Feche um split com Ctrl-a + X

Para digitar um comando: Ctrl-a + :

Consulte o manual do Screen para a lista completa de atalhos/comandos.

Dicas e considerações

Esta é uma abordagem simplista da utilização do Screen. Deixei vários detalhes de fora do post para tentar ser o mais didático possível. Para informações mais completas como configurações, gerenciamento de sessões e usuários, consulte o manual oficial.

Existem outras alternativas como o tmux, mas o conceito envolvido é o mesmo apresentado aqui.

Se você estiver programando em Rails, provavelmente precisará de 3 contextos: console, server e editor (Vim). Recomendo utilizar cada contexto como “window” na mesma sessão do Screen.

Utilize o Skype (ou outro voip de sua preferência) durante todo o tempo em que estiverem pareando e estabeleça intervalos. Pomodoro pode ser uma boa opção.

Dúvidas, críticas ou sugestões nos comentários. Sucesso!

Referências

http://www.linux.com/learn/tutorials/442418-using-screen-for-remote-interaction http://linux.die.net/man/1/screen http://aperiodic.net/screen/quick_reference

O Ano Em Que Eu Tirei a Bunda Da Cadeira

| | Comments


TL;DR: 2012 foi o ano em que eu publiquei um curso num grande portal de tecnologia, palestrei em eventos relevantes e ministrei um curso em um lugar que eu mal conhecia no mapa.

De alguns anos para cá, passei a escrever uma pequena lista de metas para o ano seguinte e percebi que o simples fato de haver uma lista já era o suficiente para que eu não perdesse totalmente o foco.

A criação de uma lista, pequena, concisa, realista, também traz motivação para cumprir novas metas a cada vez que você completa algum dos itens. É a estratégia de alimentar o cérebro com pequenas recompensas para continuar em frente, como acontece num jogo.

Há pouco mais de dois anos, escrevi aqui um post em que eu dizia que deveríamos parar de chorar e reclamar e começar a correr atrás de nossos objetivos. Escrevi aquele texto especialmente para mim, como se uma parte do cérebro estivesse dando uma bronca na outra parte. Demorou, mas acho que a bronca fez efeito.

Usando a lista de metas, mesmo sem muita disciplina, consegui ir além do que eu previa, sendo que passei a considerar 2012 como o ano em que parei de reclamar, tirei a bunda da cadeira e as coisas começaram a acontecer.

Em 2011, resolvi que queria tentar participar de eventos como palestrante. Sempre tive dificuldade de falar em público e apresentar idéias, e achei que essa seria uma boa forma de corrigir essas limitações.

Em 2012 eu continuei, tanto para apresentar algum tema que eu considero interessante, como também como ferramenta de marketing pessoal. Tanto quanto ser competente e fazer um bom trabalho, é importante ver e ser visto.

Em Maio, apresentei um talk de 30 minutos, no 23º encontro do GURU-SP, demonstrando a simplicidade do LISP usando Clojure.

Em Agosto, para minha total surpresa, fui convidado a apresentar um lightning talk no QCON-SP, onde falei sobre todos os sabores conhecidos de Ruby e dialetos, incluindo o Elixir. Apresentar um tema em cinco minutos é como fazer um show de Punk Rock, e a adrenalina de ambos é sempre bem vinda.

Em Outubro, foi ao ar o meu curso Ruby on Rails do começo ao fim, pelo portal de cursos do iMasters. O curso nasceu como um tutorial que fiz para ajudar algumas pessoas próximas e acabou se tornando algo que me ajudou a conhecer mais pessoas.

Um dos frutos que colhi com esse curso foi o convite para palestrar e ministrar um treinamento durante a IV Semana de Engenharia do Norte do Espírito Santo, no campus do CEUNES/UFES, em São Mateus – ES, que aconteceu em Novembro. Um efeito colateral muito bem vindo dessa minha ida ao Espírito Santo foi a criação do Grupo de Usuários Ruby-ES, um irmão caçula do GURU-SP.

Ainda em Novembro, fui convidado a participar do evento 7masters Java, organizado pelo iMasters, no qual tive a honra de dividir o espaço com pessoas que eu admiro há anos, como Bruno “JavaMan”, Luca Bastos e a dupla dinâmica qmx/abstractj. Lá falei sobre os usos do Clojure no mundo real e compartilhei a experiência que tive em um projeto, utilizando a ferramenta.

Fechando o ano, tive meu livro Dominando JavaScript com jQuery publicado pela Editora Casa do Código. Aliás, a versão impressa do livro foi disponibilizada hoje no site. Agora só me falta plantar uma árvore.

Em breve, pretendo compartilhar minhas experiências ao escrever o curso e o livro.

Que mais realizações venham em 2013, e que os frutos do que plantei continuem nascendo, mesmo que dessa vez eu não tenha feito nenhuma lista de metas a cumprir.