Unix and Me

About unix, web programing and me

Nokogiri Install

Recentemente tive que reconstruir meu ambiente de programação, e como recorrente me deparei com a gem nokogiri.

Para instalar no Ubuntu (no meu caso o 10.10), você precisa das seguintes dependências:

% sudo apt-get install libxslt-dev libxml2-dev

e pronto, basta instalar a gem:

% gem install nokogiri

Fonte:

Site do Nokogiri: http://nokogiri.org/tutorials/installing_nokogiri.html.

Carta à Sociedade e a Meus Amigos

Carta à sociedade e a meus amigos sobre o motivo do meu desaparecimento.

Eu fui roubado

Andei sumido por 2 dias, o motivo: eu fui roubado e decorrente deste assalto, que foi exatamente na frente da minha casa, TUDO que posso dizer que é meu foi levado:

  • Carteira com documentos, cartões e algumas moedas (sério, o dinheiro que tinha na carteira não passava de 1 real);
  • Celular, este já quebrado, até queria me livrar dele mesmo;
  • Minha mochila contendo meu MacBook (isso mesmo: a minha principal ferramenta de trabalho como programador e que me ajudava até a formatar outras máquinas).

O Assalto

Aconteceu exatamente em frente a minha casa. Eu estava na parada de ônibus, esperando para ir para o trabalho, quando o assaltante, que estava sozinho, me abordou e apesar de eu tentar fugir ele me perseguiu e levou os já citados pertences.

Como foi em frente a minha casa eu avisei a minha mãe que por sua vez chamou a polícia, que surpreendemente apareceu em menos de 25 minutos. O que eles fizeram? Subiram e dessaram o morro que eu moro e foram embora.

Depois do Assalto

Cerca de 30 minutos depois fui registrar um Boletim de Ocorrência, o famoso B. O., que eu nunca havia registrado um na minha vida.

Após ajudar o policial com a impressão do meu próprio B. O. e de ajudá-lo também com o modem 3G da polícia eu parti para o banco no qual fica minha principal/única conta corrente e cancelei / bloqueei todos os meus cartões daquele banco.

Após cancelar os cartões do banco, chegando em casa eu fui procurar cancelar outros dois cartões: um de uma conta poupança e outro cartão de crédito.

Ontem [Hoje, 01 de setembro de 2010] eu fui tirar outra via dos meus documentos (fico me perguntando o que um ladrão poderia fazer com os meus documentos).

Já tendo em mãos o R. G. e o título de eleitor (fico tranquilo, pois posso votar em outro ladrão). C. P. F., como os cartões de crédito, já está a caminho.

Hoje [02 de Setembro de 2010] vou solicitar a outra via da minha carteira de habilitação e, caso não lembre de nada mais, tentarei voltar a minha vida normal.

O que posso tirar desse assalto?

Nada, afinal levaram tudo que eu dizia que era meu.

Não andar com muitos documentos, nem com muitos cartões, já que você não os usa todos dias.

Não ficar numa parada de ônibus, que por traz exista um imenso mato contendo um imenso NADA, sozinho, mesmo que fique exatamente em frete a sua casa.

O que eu não perdi

Bom, eu faço backup de boa parte dos meus arquivos diariamente, exceto de arquivos de música, de vídeos e de programas, pelo fato de serem grandes e que podem ser recuperados em algum outro lugar.

O meu diretório chamado ~/Projects executa backup automático a cada uma hora para o Dropbox, então posso dizer com toda certeza que tenho o backup de até 11:00 do dia 31 de Agosto de 2010 dos meus programas.

Só isso, tudo o que um cidadão pode dizer que tem foi tirado de mim, isso inclui minha dignidade, minha esperança na raça humana e todos os meus planos de dominação desse mundo podre.

Daqui para frente

Ainda falta a recuperação de dois ou três documentos.

Nada mais.

O que ainda tenho a dizer?

"Quanto mais conheço as pessoas, mais gosto dos meus cachorros".

Última nota: peço desculpas aos meus amigos por não me comunicar com eles, mas minha agenda estava no celular. Via internet, só posso dizer que agora estou voltando para ver o que ainda tenho, a emocionante velocidade de 10K em modem 3G.

Capistrano

O Capistrano é uma ferramenta de "deploy" de programas, feito inicialmente para rails, mas qualquer outro framework/linguagem pode se aproveitar dele. Neste post vou mostrar a configuração.

Capify a Aplicação

Instale a gem capistrano.

Para fazer deploy com capistrano você precisa do arquivo config/deploy.rb para isso o capistrano coloca um arquivo exemplo para você com o seguinte comando capify, entre no diretório da aplicação e:

dmitry@dmitrys-mac rails-app% capify .
[add] writing './Capfile'
[add] writing './config/deploy.rb'
[done] capified!

Configurando a Aplicação e o Repositório:

Tendo nosso arquivo config/deploy.rb, vamos configurar nossa aplicação para usar o git, a primeira parte do arquivo é algo semelhante a isso:

set :application, "rails-app" # nome da aplicação
set :keep_releases, 5 # a quantidade de versões da aplicação que manter-se-a no servidor

# git
set :scm, :git # o tipo de servidor de código
set :repository,  "git@github.com:dmitrynix/rails-app.git" # repositório que será copiado o código da aplicação
set :branch, 'master' # o braço da aplicação
set :git_enable_submodules, 1 # para habilitar submodules do git, no meu caso eu uso, mas a maioria da aplicações não precisa
set :deploy_via, :remote_cache # mantém um cache do código, isso faz com que não seja feito um git clone "total" toda vez que for fazer um deploy

Credenciais e Servidores

Bom no meu caso eu só utilizo um servidor que é o mesmo para aplicação e para base de dados, veja como ficou meu arquivo:

# credentials
set :user, 'urea' # usuário que fará ssh no servidor
set :deploy_to, "/home/urea/#{application}" # local que será colocado a aplicação, incluindo arquivos temporários, log, e o git clone
set :use_sudo, false # desabilita o sudo, por padrão o capistrano usa o sudo para a maioria das tarefas

# servers
set :servers, 'servidor-da.aplicacao.com' # esse endereço será usado para fazer o ssh

role :app, servers
role :db, servers, :primary => true

default_run_options[:pty] = true

Como iniciar, parar e reiniciar o servidor

Para o meu exemplo uso o passenger, a configuração do nginx/apache do servidor é feita manualmente da mesma forma que a inicialização.

namespace :deploy do
  task :start do ; end # não necessário
  task :stop do ; end # não necessário
  task :restart, :roles => :app, :except => { :no_release => true } do
    run "touch #{current_path}/tmp/restart.txt"
  end
end

Enviar o arquivo config/database.yml para o servidor

Bom, o servidor tem seu próprio arquivo database.yml, do mesmo jeito o meu arquivo database.yml e o arquivo config/deploy.rb não está versionado no github.

namespace :init do
  desc "Create production-only database.yml"
  task :database_yml do
    database_configuration =<<-EOF
production:
  adapter: postgresql
  encoding: utf8
  database: urea
  username: urea
  password: urea
  host: localhost
EOF
    put database_configuration, "#{shared_path}/database.yml"
  end
end

after "deploy:setup", "init:database_yml"

Usando o mesmo arquivo de configuração da base de dados para cada versão

O database.yml obviamente é o mesmo arquivo para todas as versões.

Para usar o mesmo arquivo da base de dados nas "releases" vamos adicionar a tarefa symlink_database ao "namespace" deploy:

  task :symlink_database do
    run "ln -nfs #{deploy_to}/#{shared_dir}/database.yml #{release_path}/config/database.yml"
  end

E por fim adicionar o symlink_database para executar depois de deploy:update_code, no final do arquivo:

after "deploy:update_code", "deploy:symlink_database"

Arquivo exemplo:

Antes de rodar o comando para iniciar e fazer deploy da aplicação vamos conferir o arquivo

set :application, "rails-app" # nome da aplicação
set :keep_releases, 5 # a quantidade de versões da aplicação que manter-se-a no servidor

# git
set :scm, :git # o tipo de servidor de código
set :repository,  "git@github.com:dmitrynix/rails-app.git" # repositório que será copiado o código da aplicação
set :branch, 'master' # o braço da aplicação
set :git_enable_submodules, 1 # para habilitar submodules do git, no meu caso eu uso, mas a maioria da aplicações não precisa
set :deploy_via, :remote_cache # mantém um cache do código, isso faz com que não seja feito um git clone "total" toda vez que for fazer um deploy

# credentials
set :user, 'urea'
set :deploy_to, "/home/urea/#{application}"
set :use_sudo, false

# credentials
set :user, 'urea' # usuário que fará ssh no servidor
set :deploy_to, "/home/urea/#{application}" # local que será colocado a aplicação, incluindo arquivos temporários, log, e o git clone
set :use_sudo, false # desabilita o sudo, por padrão o capistrano usa o sudo para a maioria das tarefas

# servers
set :servers, 'servidor-da.aplicacao.com' # esse endereço será usado para fazer o ssh

role :app, servers
role :db, servers, :primary => true

default_run_options[:pty] = true

namespace :deploy do
  task :start do ; end # não necessário
  task :stop do ; end # não necessário
  task :restart, :roles => :app, :except => { :no_release => true } do
    run "touch #{current_path}/tmp/restart.txt"
  end

  task :symlink_database do
    run "ln -nfs #{deploy_to}/#{shared_dir}/database.yml #{release_path}/config/database.yml"
  end
end

namespace :init do
  desc "Create production-only database.yml"
  task :database_yml do
    database_configuration =<<-EOF
production:
  adapter: postgresql
  encoding: utf8
  database: urea
  username: urea
  password: urea
  host: localhost
EOF
    put database_configuration, "#{shared_path}/database.yml"
  end
end

after "deploy:setup", "init:database_yml"
after "deploy:update_code", "deploy:symlink_database"

Fazendo o deploy

Fazer o deploy com capistrano da sua aplicação não cobre a instalação de gems e nem configuração do nginx/apache/mongrel (pelo menos não neste exemplo), partindo disso:

  • Instale as gems no servidor;
  • configure seu nginx/apache/mongrel, com a raiz apontando para /home/urea/rails-app/current/public/

E rode o comando cap deploy:setup para iniciar o deploy e o comando cap deploy:cold para colocar o código da aplicação no servidor, depois desses comandos basta rodar cap deploy e pronto.

Caso precise rodas as migration use o comando cap deploy:migrations.

Para voltar ao estado anterior use o cap deploy:rollback.

Para outras tarefas do capistrano: cap -T

Instalação do Ruby e Rails

Alguns amigos pediram que eu fizesse um tutorial de como instalar o ruby/rails, então lá vai:

Para este exemplo foi usado Ubuntu 10.04.

Instalar o Ruby

No Ubuntu:

sudo aptitude install ruby irb rdoc ri libopenssl-ruby ruby-dev build-essential

Estes dois últimos pacotes iram instalar ferramentas para compilar alguma gem que seja em C. Os outros são: o pacote do ruby, do rdoc (para gerar documentação), e o irb um shell ruby.

Instalar o RubyGems:

O Synaptic tem o RubyGems, mas como eu já tive muitos problemas com o rubygems provido pelo próprio Ubuntu eu prefiro instalar baixando o pacote tgz do site rubyforge.org, na página do projeto rubygems: http://rubyforge.org/frs/?group_id=126.

Após baixar o tgz do rubygems, execute estes passos:

cd ~/Downloads
tar xfz rubygems-1.3.7.tgz
cd rubygems-1.3.7
sudo ruby setup.rb
sudo ln -s /usr/bin/gem1.8 /usr/bin/gem

Respectivamente:

  • Entrar no diretório que foi baixado o pacote;
  • Extrair o pacote tgz;
  • Entrar no diretório descompactado;
  • Executar o instalador: setup.rb.

Para verificar se está tudo ok:

% gem list

*** LOCAL GEMS ***

Instalar o Rails

Para instalar o Rails:

sudo gem install rails

Se quiser instalar uma versão expecífica do Rails:

sudo gem install rails -v=2.2.3

Instalar o Mongrel

O mongrel é um servidor web, gosto de usá-lo apenas para o desenvolvimento, para instalar use:

sudo gem install mongrel

Ele (ou alguma dependência dele) é compilado, para isso deve-se ter os pacotes debian: build-essential e ruby-dev.

Instalar suporte ao Sqlite3

O Sqlite é um banco de dados que fica salvo em arquivo, ele é muito útil para desenvolver, uma vez que não é extremamente necessário uma super estrutura de banco de dados.

sudo apt-get install libsqlite3-dev

Continue com o rails em outro post: Scaffold Exemplo e a Estrutura no Rails

Branch Remoto - Git

Mostro como criar um branch remoto no git desde o início.

Criar um branch remoto desde o início

Criar o novo branch:

  % git push origin origin:refs/heads/novobranch
  Total 0 (delta 0), reused 0 (delta 0)
  From /var/spool/gitosis/repositories/brancher
   * [new branch]      unstable   -> origin/unstable
  To git@server.localdomain:brancher.git
   * [new branch]      origin/HEAD -> unstable

Então você pode ver que o branch foi criado.

  % git branch -a
    master
  * novobranch
    remotes/origin/HEAD -> origin/master
    remotes/origin/master
    remotes/origin/novobranch

Agora siga o novo branch

  % git checkout -t -b novobranch origin/novobranch
  Branch novobranch set up to track remote branch novobranch from origin.
  Switched to a new branch 'novobranch'

Apagar um Branch Remoto

  % git branch -d -r origin/novobranch
  Deleted remote branch origin/novobranch (was 01e5ee4).

Mudando a Data em Unixs

Os sistemas operacionais unix seguem um padrão de ferramenta, entre elas o date.

Para modificar a data de qualquer unix-like que seguem este padrão, como por exemplo todos os linuxs:

date MMDDhhmm[[CC]YY][.ss]]

Do qual:

  • MM indica o mês;
  • DD o dia;
  • hh a hora;
  • mm o minuto;
  • CC para os primeiros dois algarismos do ano;
  • YY os últimos;
  • .ss o segundo.

O últimos três parâmetros são opcionais.

Para mudarmos para o dia 2 de março de 2010 as 12:45 poderia ser assim:

root@~ # date 030212452010

Removendo Revisões de Post no WordPress

Para desabilitar as revisões dos posts no WordPress, edite o arquivo wp-config.php modificando o seguinte conteúdo:

define('AUTOSAVE_INTERVAL', 300 ); // seconds
define('WP_POST_REVISIONS', false );

Para apagá-las na base de dados, execute o seguinte sql:

DELETE FROM wp_posts WHERE post_type = "revision";

Voltando a Programação Normal

Voltando a programação normal, ou quase.

Bom pessoal gostaria de pedir desculpas por um breve período de inatividade e completo desajuste do site tanto o acesso via direto quanto ao feed.

Qualquer reclamação/sugestão estou sempre aguardando.

:-D