sexta-feira, 25 de maio de 2012

Instalando OpenNI no Ubuntu 12.04

O OpenNI é um framework para Interface Natural com o Usuário. É como você interagir com o sistema sem a utilização de comandos ou outros periféricos, como teclado ou mouse. Você basicamente utiliza o próprio corpo para interagir (fazendo gestos ou comandos de voz).

Meu objetivo é instalá-lo para utilizar o kinect no Ubuntu. Então vamos começar a instalação:

Baixe o código fonte do OpenNI no github:

sauron@mordor:$ git clone https://github.com/OpenNI/OpenNI


Se você ainda não tiver o JDK instalado, é necessário instalar. Você pode seguir este link para instalar:

http://www.devsniper.com/ubuntu-12-04-install-sun-jdk-6-7/

Se ficar dando erro de jar: comando não encontrado, instale o openjdk-7-jdk:

sauron@mordor:$ sudo apt-get install openjdk-7-jdk


Agora precisamos instalar as dependencias:

sauron@mordor:$ sudo apt-get install g++ python libusb-1.0-0-dev freeglut3-dev


Os pacotes seguintes são necessário para gerar a documentação (são opicionais):

sauron@mordor:$ sudo apt-get install doxygen graphviz

Depois vá para o diretório OpenNI/Platform/Linux/CreateRedist e rode o executável RedistMaker como root:

sauron@mordor:$ sudo ./RedistMaker


Agorá vá para o diretório OpenNI/Plataform/Linux/Redist/OpenNI-Bin-Dev-Linux-x64-v1.5.2.23 (este diretório pode ser diferente de acordo com a sua versão do linux e do OpenNi) e rode o executável install.sh como root:

sauron@mordor:$ sudo ./install.sh


Você pode testar se está funcionando indo no diretório OpenNI/Plataform/Linux/Bin/x64-Release e executando um dos exemplos:

sauron@mordor:$ ./Sample-NiUserTracker


Lembre-se de conectar a porta USB do kinect e ligá-lo na tomada.

Se ocorrer o seguinte erro:

Open failed: Failed to set USB interface!


Rode este comando:

sauron@mordor:$ sudo rmmod gspca_kinect


Não sei porque acontece este erro.
Agora é só usar o kinect.



quarta-feira, 23 de maio de 2012

Mudar wallpaper automaticamente no ubuntu/gnome

Existe um script que você pode utilizar para mudar automaticamente o wallpaper no Ubuntu, usando Gnome 3.

Você pode colocá-lo para executar a intervalos de tempo, para que sempre tenha um novo papel de parede.

Coloque todos os seus wallpapers num mesmo diretório:

sauron@mordor:$ ls Imagens/wallpapers
wallpaper1.jpg
wallpaper2.jpg
wallpaper3.jpg


Crie um arquivo chamado script.sh neste mesmo diretório e dê permissão de execução a ele:

sauron@mordor:$ touch script.sh
sauron@mordor:$ chmod +x script.sh


Colo o seguinte código neste arquivo (script.sh):


#!/bin/bash

# Diretório que contem os wallpapers
DIR="/home/sauron/Imagens/wallpaper"

# Comando para selecionar uma imagem jpg aleatória
# Remova o *.jpg para selecionar qualquer tipo de arquivo, mas certifique-se que só tenha imagens
PIC=$(ls $DIR/*.jpg | shuf -n1)

# Comando para mudar o wallpaper
/usr/bin/gsettings set org.gnome.desktop.background picture-uri file://$PIC


Teste o script para ver se está tudo ok:

sauron@mordor:$ /home/sauron/Imagens/wallpaper/script.sh


Agora para ficar mudando automaticamente, devemos colocar este script como um cronjob no crontab. Por algum motivo que ainda não descobri, se colocar o script no crontab da forma convencional não funciona:

* * * * * /home/sauron/Imagens/wallpaper/script.sh


Provavelmente pela falta de alguma variável de ambiente. Mas existe um jeito de fazê-lo funcionar.

Instale o aplicativo gnome-schedule, que serve como uma interface gráfica para o crontab:

sauron@mordor:$ sudo apt-get install gnome-schedule


Execute o aplicativo:

sauron@mordor:$ gnome-schedule


Para criar uma nova tarefa vá em Novo > Tarefa recorrente, no popup que abrir digite uma descrição para a tarefa:

"Mudar wallpaper"


No campo para digitar o comando coloque o caminho para o script.sh:

/home/sauron/Imagens/wallpaper/script.sh


No select box que tem logo abaixo do campo de comando, e que está selecionado Default behaviour, mude e selecione X application (este é o detalhe que faz funcionar aqui e não diretamente no crontab).

Então basta escolher o intervalo de tempo, como toda hora ou todo minuto.

Clique em adicionar e pronto, seu papel de parede vai mudar automaticamente.

quarta-feira, 9 de maio de 2012

Gerando DER no Rails

Para gerar uma imagem do DER da aplicação no Rails, podemos usar a gem Railroady.

Coloque a seguinte linha no seu Gemfile:

gem 'railroady'


Depois rode o bundle:

sauron@mordor:$ bundle


Depois que a gem estiver instalada, para gerar o arquivo com o DER rode o seguinte comando:

sauron@mordor:$ railroady -M | neato -Tpng > doc/models.png

terça-feira, 8 de maio de 2012

Rails: Seed de acordo com o ambiente

No Rails, você pode configurar as seeds para executarem de forma diferente de acordo com o ambiente de desenvolvimento (development, test ou production). Para isso você precisa criar arquivos separados para cada ambiente.

Primeiro crie uma pasta seeds dentro da pasta db de seu projeto:

sauron@mordor:$ mkdir db/seeds


Depois crie um arquivo de seed para cada ambiente:

sauron@mordor:$ touch db/seeds/development.rb
sauron@mordor:$ touch db/seeds/production.rb


Em cada arquivo você vai configurar a seed de acordo com as necessidades do ambiente. No ambiente de desenvolvimento você pode criar várias instâncias de um determinado model para fazer testes, enquanto em produção você queira apenas criar alguns usuário padrão da aplicação. Vai depender de suas necessidades.

Por último precisamos configurar o rake para ler esses arquivos de seed. Cole isso no final do arquivo Rakefile:

namespace :db do
  task :seed => :environment do
    env_seed_file = File.join(Rails.root, 'db', 'seeds', "#{Rails.env}.rb")
    load(env_seed_file) if File.exist?(env_seed_file)
  end
end

segunda-feira, 7 de maio de 2012

Deploy multistage com Capistrano

Com a gem capistrano podemos configurar um abiente de deploy multistage. Assim podemos ter uma área do site só para testes, separada da área de produção.

Adicione as seguintes gems ao seu projeto Rails:

gem 'capistrano'
gem 'capistrano-ext'


Caso você ainda não tenha um arquivo de deploy, gere-o com o comando (Execute o comando na raiz do projeto):

sauron@mordor:$ capify .


No arquivo de deploy (config/deploy.rb), adicione as seguintes linhas no ínicio do arquivo:


require "bundler/capistrano"

set :stages, %w(staging production)
set :default_stage, 'staging'
require 'capistrano/ext/multistage'


Neste caso estou configurando dois ambientes: staging e production. Também defino o ambiente staging como o padrão.

Para fazer o deploy, execute o comando desta forma:

sauron@mordor:$ cap staging deploy


ou

sauron@mordor:$ cap production deploy


Se você não especificar o ambiente no comando de deploy, vai ser utilizado o ambiente padrão (default_stage):

sauron@mordor:$ cap deploy
// Vai fazer deploy no ambiente staging, porque ele está definido como padrão


Agora que temos os dois ambientes configurados (staging e production), precisamos alterar a configuração do staging para que seja criado uma área específica para testes, separada da área de produção.

Crie um diretório deploy dentro do diretório config do seu projeto:


sauron@mordor:$ mkdir config/deploy


Dentro deste diretório crie dois arquivos, production.rb e staging.rb:

sauron@mordor:$ touch config/deploy/production.rb
sauron@mordor:$ touch config/deploy/staging.rb


A configuração de deploy do ambiente de produção (production) vai ser a mesma que está no arquivo de deploy original (config/deploy.rb), então deixaremos o arquivo production.rb em branco.

Nas configurações do ambiente de testes (staging), faremos as alterações necessárias:

set :application, 'teste.exemplo.com'
set :database, 'teste_exemplo'
set :rails_env, 'staging'

set :user, 'ubuntu'
set :use_sudo, false

set :scm, :git
set :repository,  "git://github.com/projeto/exemplo.git"
set :branch, 'teste'
set :deploy_via, :remote_cache
set :deploy_to, "/home/#{user}/www/#{application}"
set :shared_path, "/home/#{user}/www/#{application}/shared"
set :git_enable_submodules, true
set :keep_releases, 10


Essas são as alterações que eu faço para diferenciar o ambiente de testes do ambiente de produção, sendo as principais mudar o nome da aplicação (para que o deploy seja feito em outro diretório e não sobrescreva o deploy de produção), mudar o banco, o rails_env e o branch do git.

sexta-feira, 4 de maio de 2012

Conectando banco de dados mysql com node.js


Para o Node.js se comunicar com o mysql  existe o pacote 'mysql':

suaron@mordor$ sudo npm install mysql -g


No arquivo em node.js (o código está em coffeescript):

mysql = require('mysql').createClient();
mysql.host = 'localhost';
mysql.user = 'usuario';
mysql.password = 'senha';
mysql.database = 'nome_do_banco';


mysql.query "SELECT * FROM users WHERE id = '#{user_id}'", (error, results) ->
        if error
                sys.puts "Mysql Error: #{error.message}"
                        return
        else
                sys.puts results if results.length > 0
# mysql.query

Coffeescript: convertendo String em Date

O formato Date do javascript (e, por consequência, do coffeescript), só aceita alguns formatos da data no seu construtor. E entre esses formatos não está incluído o que usamos aqui no Brasil, que é dd/mm/yyyy.

Para instanciar uma nova data tendo uma string nesse formato utilizamos expressões regulares para fazer a conversão necessária:


date_from_string = (string) ->
date = string.match /// (\d{2})/(\d{2})/(\d{4}) ///
new Date("#{date[2]}/#{date[1]}/#{date[3]}")
# format_date


Exemplo de uso:

string = '04/05/2012' # 04 de Maio de 2012
date = date_from_string string

quinta-feira, 3 de maio de 2012

POST com curl

Para fazer uma requisição do tipo POST com a curl é muito simples, basta executar:

sauron@mordor$ curl -d "param1=value1&param2=value2" http://example.com/path

Enviando mensagens socket.io com ruby

Para comunicar o ruby com um servidor socket.io e enviar uma mensagem podemos utilizar a gem socketio-client

sauron@mordor$ gem install socketio-client

Exemplo de código do cliente (ruby):


require 'SocketIO'

client = SocketIO.connect 'http://localhost:8888' do
after_start do
emit 'event', {id: '5'}
end
end


Exemplo de código do servidor (coffeescript):


sys = require 'sys'
io = require('socket.io').listen 8888

sys.puts 'Starting node server...'

io.sockets.on 'connection', (client) ->
client.on 'event', (data) ->
                sys.puts data

node: cannot find module

Se o node não está conseguindo achar os módulos (cannot find module ...), pode ser que o path (caminho onde ele procura pelos módulos) não esteja configurado corretamente.
Para configurá-lo, coloque esta linha no final do arquivo ~/.bashrc (arquivo que é executado toda vez que você iniciar o sistema).

NODE_PATH=/usr/local/lib/node_modules/

Caso seus módulos estejam instalado em outro diretório que não seja /usr/local/lib/node_modules, faça as alterações necessárias.

Para recarregar o arquivo .bashrc execute:

sauron@mordor$ source ~/.bashrc

ORM CarrierWave do MongoDB

Para usar a gem carrierwave com mongodb, é necessário configurar o orm (orm/mongomapper).
Você pode encontrar esse orm aqui.
Baixe o arquivo (mongomapper.rb) e copie para o diretório orm do carrierwave.
A localização do diretório vai depender da versão do carrierwave e de onde estão instaladas as suas gems.

No meu caso, o diretório esté em:
~/.rvm/gems/ruby-1.9.2-p318/gems/carrierwave-0.5.8/lib/carrierwave/orm
e
~/.rvm/gems/ruby-1.9.3-p125/gems/carrierwave-0.6.1/lib/carrierwave/orm

Você deve colocar o orm no diretório que você está utilizando, fique atento à versão da gem (como no meu caso eu tenho as versões 0.5.8 e 0.6.1, e tive que colocar o arquivo nos dois diretórios).

Neste diretório também tem o orm para o activerecord, que é utilizado quando você usa um banco padrão (como o mysql ou sqlite).


sauron@mordor: $ pwd
/home/ricardo/.rvm/gems/ruby-1.9.3-p125/gems/carrierwave-0.6.1/lib/carrierwave/orm
sauron@mordor: $ ls
activerecord.rb  mongomapper.rb