HowTo


9
ago 11

War muito grande para fazer deploy no Tomcat7

Eu estou começando a efetuar o deploy de uma aplicação Rails com JRuby e Tomcat 7.

Após usar o Warbler para criar um warfile para deploy, o manager do Tomcat disparou o seguinte erro:

org.apache.tomcat.util.http.fileupload.FileUploadBase$SizeLimitExceededException

Fácil, fácil. É só aumentar o tamanho máximo de upload no servidor. Mas a dúvida é, em qual xml obscuro tenho de mexer?

Como resolver!

  • Procure pelo arquivo web.xml do manager (está em [tomcat7 directory]/webapps/manager/WEB-INF/web.xml)
  • Aumente os valores em max-file-size e max-request-size (o valor padrão é 50MB)

<multipart-config>

<!– 50MB max –>

<max-file-size>52428800</max-file-size>

<max-request-size>52428800</max-request-size>

<file-size-threshold>0</file-size-threshold>

</multipart-config>

  • Reinicie o Tomcat

 


24
jul 11

Fazendo o JRuby usar a sintaxe do Ruby 1.9

Sinceramente, nunca fui fã dos hashes no modelo { :chave => ‘valor’ }. Eu acho esta sintaxe terrívelmente feia, ainda mais quando comparada com a nova, que lembra o jeitão do javascript { chave: ‘valor’ }

Claro que não mudou somente isto. Entre as mudanças mais importantes podemos destacar:

  • Ruby 1.9 agora deixa de ser interpretada para ser bytecode-compiled (usando YARV VM)
  • A classe String foi refeita para agora estar ciente que existe uma coisa chamada encoding
  • Expressões regulares agora rodam na engine Oniguruma, que traz novos recursos
  • A biblioteca enumerator da stdlib foi adicionada ao core e a grande maioria dos métodos em Enumerable agora retornam uma instância de Enumerator quando chamados sem um bloco
  • Symbol#to_proc foi criada
  • Foi criada uma nova sintaxe para os lambdas, -> que permite parâmetros com valores padrão, entre outras novidades

Tem uma apresentação antiga chamada Ruby 1.9: What to expect que fala em mais detalhes o que mudou.

Mas afinal, #comofaz?

A melhor forma é criando uma variável de ambiente JRUB_OPTS e atribuir o valor –1.9 nela.

Você pode passar isso para o jruby como parâmetro, mas algumas operações iriam ainda usar o sintaxe do 1.8.

No MacOS e no Linux:

export JRUBY_OPTS=’–1.9′

No Windows:

SET JRUBY_OPTS=’–1.9′

 


18
jul 11

Acessando o SQL Server em JRuby

Na verdade eu vou acessar o banco via java. Em ruby MRI eu não tenho idéia de como fazer isto.

Let’s do it!

Primeiramente você vai precisar do driver jdbc da Microsoft para o SQL Server.

Descompactando o arquivo, o jar que você está procurando é o sqljdbc4.jar. Ele deve ficar no seu CLASSPATH ou em algum lugar onde você possa dar require.

Caso você, como eu, não tenha a menor idéia de como montar uma string de conexão jdbc, é bom dar uma olhada em Building the Connection URL.

#!/usr/bin/env ruby
# encoding: UTF-8

#
# Gist presenting how to access a SQL Server via JRuby
#

require 'rubygems'
require 'java'
require 'sqljdbc4'

Java::com.microsoft.sqlserver.jdbc.SQLServerDriver

#
# Connection strings are gvpta vidia,... you may find some help here: http://msdn.microsoft.com/en-us/library/ms378428.aspx
#

#
# Just a quick note (this made me lose so much time): If you get an address to a sql server like this 12.0.4.10\INSTANCE,34566
# that 34566 is the port number. Change the , for a :
#

url = 'jdbc:sqlserver://my-server-name-or-ip\my-instance-name-optional:my-port-name;databaseName=my-database-name'
conn = java.sql.DriverManager.get_connection(url, 'user-name', 'p@ssword')
statement = conn.create_statement

q = 'SELECT * FROM People WITH(NOLOCK)'
rs = statement.execute_query(q)

while (rs.next) do
  puts rs.getObject('name')
end

statement.close

16
jul 11

Acessando classes java em jruby

Java and Ruby

Java and Ruby

Integrar é preciso.

Em um ambiente de produção moderno não há muito espaço para a uniformidade tecnológica. É quase certo que você terá de tudo um pouco ao entregar uma solução.

Por uma necessidade destas eu estou precisando integrar umas aplicações em java com ruby. Está sendo pra lá de divertido!

Minha classe java

Para poder mostrar como fazer, vamos antes criar uma classe bem simples em java para ser consumida em jruby.

package e7r;

/**
* Simple calculator class to be used inside jruby
*/
public class Calculator {

  /**
* Adds two integer numbers
* @param a First value
* @param b Second value
* @return The sum of two values
*/
  public int sum(int a, int b) {
    return a + b;
  }

}

É uma calculadora muito simples. Na verdade ela somente adiciona dois valores.

Para compilar e gerar o jar basta seguir os passos abaixo:

# two steps to create a jar manually

javac Calculator.java
jar cvf SmallestJar.jar Calculator.class

Eu não tinha nem idéia de como criar um jar até ler o post Creating an executable jar file.

Mais fácil impossível!

Preparando o script jruby

Basicamente você pode consumir uma classe java de três formas:

  • Diretamente (nomes completos de pacotes a cada uso)
  • Incluindo a classe no object
  • Incluindo um pacote dentro de um módulo ruby

Ganhando “super-poderes”

Existe um passo comum a todas elas para permitir o acesso às classes java no ruby:
require ‘java’
Ao efetuar este require você terá uma série de métodos auxiliares que deixarão a sua vida muito mais simples para efetuar a integração.

Chamando um jar

OK! Efetuamos o require do java, e temos tudo o que precisamos para consumir uma classe, agora precisamos indicar o jar onde nossa classe está.

Isto é feito pelo comando require. Você não precisa colocar a extensão .jar, ele automáticamente procurará tanto arquivos .rb quanto .jar, sendo que o seu jar deve ou estar no CLASSPATH ou na árvore de diretórios do consumidor.

Logo, requires como  ‘lib/SimplestJar’ ou ‘../../SimplestJar’ são válidos.

Importante, você somente precisa dar require nos jars que contém classes que você consome diretamente. As dependências serão automaticamente carregadas!

Consumindo a classe

Diretamente (nomes completos de pacotes a cada uso)

É a forma favorita dos masoquistas de plantão.

Para acessar uma classe java, você precisa iniciar a chamada com o módulo Java:: seguido do caminho completo nos pacotes até a classe.

Como desenvolvedores java tem punhos de aço (principalmente os da ASF) você pode se preparar para usar namespaces muuuito longos.

Incluindo a classe no object

Mesmo quando no irb, estamos em um contexto de uma classe. (É só digitar self.class para descobrir de quem).

Assim, você pode uma única vez fazer esta inclusão e em diante a classe estará disponível diretamente pelo nome dela.

Para fazer a inclusão utilize o comando include_class usando o Java:: seguido do caminho completo até a classe.

Incluindo o pacote em um módulo ruby

Sempre é bom poder organizar as coisas.

Neste projeto que estou fazendo, eu quero simplificar os trezentos mil pacotes em uns quatro ou cinco módulos. Não há razão alguma justificável para termos mais.

Para isso dentro do módulo você pode usar o método import_package para vincular as classes java ao seu módulo ruby.

O fonte completo

#
# First you must require java to gain some special powers
# Remember that this works only with jruby!
#
require 'java'

#
# Then require your jar file. Note that you can't do something like
# import SmallestJar.*. You must require each jar by yourself.
#
require 'SmallestJar'

# Some ways of consuming java classes inside jruby

#
# 1. Let's do it the hard way: using full package name every time
# - remember to always start with a Java:: and then the package namespace
# - some namespaces like org, com, etc. are mapped directly
#

calculator = Java::e7r.Calculator.new
puts calculator.sum(10, 20)

#
# 2. Let's do it the messy way: including the package in the current context
#

include_class Java::e7r.Calculator
calculator = Calculator.new # look mama, no namespaces
puts calculator.sum 10, 20

#
# 3. The man's way: Create a module to put the classes (via include_package)
#

module E7R
  include_package 'e7r'
end

calculator = E7R::Calculator.new
puts calculator.sum 10, 20

# EOF
view raw calculator.rb This Gist brought to you by GitHub.

Conclusão

Poder consumir classes java dentro do jruby somente fazem crescer as possibilidade de ter a um lado uma linguagem moderna, flexível e produtiva com toda a estabilidade e escalabilidade do java.

Preciso fazer uns testes destes usando ironruby.


16
jul 11

Executando um script ruby no contexto de uma app rails

Eu estou desenvolvendo uma aplicação que precisa executar um processo de atualização de dados diariamente.

Este processo será disparado via cron, e para tanto eu preciso que ele rode no contexto da minha aplicação em rails para consumir os models dela.

Como diz a canção de Vinícius de Moraes, …aos sábados em casa tomo um porre e sonho soluções fenomenais!... :)

OK! Nada disto necessário, na verdade logo após as soluções fenomenais eu achei a mais simples e que funciona bem:

Dentro do diretório do projeto você pode executar o comando rails runner.

rails my-directory/my-ruby-script.rb

 


8
jul 11

Usando o afconvert para converter arquivos CAF em MP3

Como sou bem noob em Mac, ao ver essa extensão CAF, o que é isso??? Eu preciso compartilhar o áudio da reunião com uma colega e acredito que MP3 é uma escolha melhor.

Após dar uma googlada para ver se tem como fazer isto sem usar outras ferramentas, eu descobri que existe o afconvert que faz o trabalho.

Eu achei este post que mostra como converter CAF para AIF. Bacana, boa parte do caminho já estava andado. Contudo ele converte para AIF.

Mais uma googlada e encontrei neste outro post os formatos para criar um MP3.

#!/bin/sh

# now convert the CAF file to an MP3 file
afconvert -f mp4f -d aac "$0" "$1"
view raw to-mp3.sh This Gist brought to you by GitHub.

Eu aproveitei e alterei o outro script que faz estas conversões em lote para trocar de AIF para MP3.

#!/bin/sh

#
# a script to convert every CAF sound file in the current
# directory to a corresponding AIF sound file.
#
# author: alvin alexander, devdaily.com
#
# This work is licensed under the Creative Commons Attribution-Share Alike 3.0
# United States License: http://creativecommons.org/licenses/by-sa/3.0/us/
#

# I've modified this script originally written in:
# http://www.devdaily.com/mac-os-x/convert-caf-sound-file-aif-aiff-mp3-format

IFS=$'\n'

# list all CAF files in the current directory.
# (the -1 character in this line is a "one", not an "el")
for INFILE in $(ls -1 *.caf)
do

  # get the base filename by stripping off the ".caf" part
  baseFilename=`basename "${INFILE}" .caf`

  # determine the preliminary output filename
  outfile="${baseFilename}.mp3"

  # convert all spaces to hyphens
  outfile=`echo $outfile | tr -s " " "-"`
  echo "Converting \"$INFILE\" to \"$outfile\" ..."

  # now convert the CAF file to an AIF file
  afconvert -f mp4f -d aac "$INFILE" "$outfile"

done
view raw all-to-mp3.sh This Gist brought to you by GitHub.

Rápido e prático! :)


3
jul 11

LoadError: no such file to load — spec_helper

Eu estou trabalhando em uma aplicação bem simples, e precisava utilizar o RSpec para os testes já que ele é padrão na gem que estou usando.

Bem, tenho de admitir que Test::Unit e minitest eu já usei bastante, mas o RSpec ainda é um ilustre desconhecido.

O problema

Eu estou trabalhando em um projeto que utiliza algumas tecnologias diferentes, e que por sua vez ainda estão com a documentação meio ausente. Ao tentar rodar os specs eu recebi o seguinte erro:

Onde está spec_helper.rb?

A resposta para ele é mais do que simples:

é só criar o arquivo spec_helper.rb!

Ok, mas e como que é esse arquivo?

A instalação do RSpec

A instalação dele foi bem tranquila. Você somente tem de instalar as gems no seu ruby.

Depois eu adicionei as dependências necessárias no arquivo Gemfile

O que eu não tinha visto na documentação era que eu precisava no meu projeto em Rails instalar o RSpec.

Na instalação ele gerou os arquivos necessários, e então o RSpec funcionou sem problemas.

RSpec working :)

O log da sessão

Se interessar, o log completo da sessão está nos meus gists no github.

 


30
jun 11

Personalizando o bash

Há dias eu ando criando coragem para modificar o prompt de comando do meu terminal.

O terminal, para quem não sabe, é aquela tela preta intimidadora, praticamente uma entidade do mundo antigo que faz piscar um cursor, aguardando por verbos arcanos. Sabendo conjuras apropriadas ele é dócil e prestativo.

Você poderá achar informações mais detalhadas no Bash Reference Manual e no Prompt HOW-TO.

As variáveis do prompt

O prompt de comando possui quatro variáveis, uma para cada finalidade. São elas:

  • PS1 é o prompt principal e tem como valor padrão ‘\s-\v\$ ‘
  • PS2 é o prompt utilizado nos comandos multi-linha, e tem como valor padrão ‘> ‘
  • PS3 é o prompt para o comando select, e tem como valor padrão ‘#? ‘
  • PS4 é o prompt utilizado quando executando com a opção -x (debug). Ele será repetido várias vezes para indicar os níveis de identação do código em execução. Tem como padrão o valor ‘+’
  • PROMPT_COMMAND é interpretado como comando antes de cada exibição do seu prompt primário (sabe, o $PS1)

Os parâmetros do prompt

Podemos colocar no prompt de comando uma série de valores para serem exibidos.

São eles:

  • \a aquele barulho irritante do terminal (quem usa meu Deus???) o caractere ASCII 7
  • \d a data no formato “dia da semana, mês e dia”, algo como “Tue May 26
  • \D{format} a data formatada no formato indicado (conforme strftime(3)). Caso não seja passado nada usa as configurações locais. Ambos { e } são obrigatórios
  • \e o caractere de escape ASCII (033)
  • \h o nome do host (até o primeiro .)
  • \H o nome completo do host
  • \j o número atual de tarefas sendo gerenciadas por este terminal
  • \l o nome do dispositivo do terminal do shell
  • \n nova linha
  • \r retorno de carro
  • \s o nome deste shell (o nome base em $0)
  • \t a hora atual no formato 24-hour HH:MM:SS
  • \T a hora atual no formato12-hour HH:MM:SS
  • \@ a hora atual no formato12-hour am/pm
  • \A a hora atual no formato24-hour HH:MM
  • \u o nome do usuário atual
  • \v a versão do bash
  • \V o release do bash, incluindo a versão e o patch level
  • \w o diretório atualmente selecionado, com o $HOME abreviado com um ~
  • \W o nome base do diretório atualmente selecionado, com o $HOME abreviado com um ~
  • \! o número deste comando no histórico de comandos (a.k.a. .bash_history)
  • \# o número de comando deste comando
  • \$ se o valor do UID é zero, um #, senão um $
  • \nnn o caractere respresentado pelo número octal nnn
  • \\ a própria ‘\’
  • \[ inicia uma seqüência de caracteres não imprimíveis (como cores e outros controles de terminal)
  • \] encerra uma seqüência de caracteres não imprimíveis

Ser monocromático é chique (bem, foi, nos anos 50)

Para adicionar cores você precisa adicionar seqüências escapadas no seu prompt.

Para começar você deve iniciar com o marcador de início, que é \e[ ou \[\033[, seguido pelo código da cor e encerrado com o caractere m.

Os códigos de cores são compostos por dois números. O primeiro indica se a cor será clara (0) ou escura (1) e o segundo é propriamente o código da cor.

São elas:

  • Sem cor 00m
  • Black 0;30
  • Dark Gray 1;30
  • Blue 0;34
  • Light Blue 1;34
  • Green 0;32
  • Light Green 1;32
  • Cyan 0;36
  • Light Cyan 1;36
  • Red 0;31
  • Light Red 1;31
  • Purple 0;35
  • Light Purple 1;35
  • Brown 0;33
  • Yellow 1;33
  • Light Gray 0;37
  • White 1;37

Para montar um código de cor é só fazer a composição. Digamos que estamos querendo o texto em verde escuro, a seqüência é \e[0;32m.

Para remover a configuração de cor lembre-se de usar \e[00m

Como testar o meu prompt até achar o ideal?

Antes de mais nada, para você ver o código do seu prompt atual é só digitar echo $PS1

Para ir testando o seu prompt é só digitar export PS1='my prompt escape codes here'

O lado bom é que se você realmente estragar com ele, ele voltará ao normal quando você abrir um novo terminal.

Quando você encontrar o prompt dos seus sonhos, edite (ou crie) o arquivo ~/.bash_profile e adicione a linha acima dentro do arquivo.

O meu terminal

Eu gosto de ter sempre à mão o caminho completo de onde estou no file system, com uma generosa linha para digitar meus comandos.

Para obter este efeito aqui ...

Meu Terminal

... eu uso este prompt aqui ...

export PS1='\n\[\033[0;36m\]\u@\h\[\033[00m\] :: \[\033[0;32m\]\w \[\033[01;33m\]\[\033[00m\]\n\$’

Uma última coisa

Eu também uso git de monte, e é bom saber em qual branch e se ele tem alterações pendentes ou não.

Mas isto mostro em outro post.


5
jan 11

Installing APE on Ubuntu Server 10.10


This small tutorial was made based on the ape-project install documentation.

It summarizes things to help people get APE running on Ubunto ASAP.

Hope it helps someone who needs a good comet server up and running for yesterday :)

The environment I have choosed to install APE was a virtual machine with this configuration:


14
dez 10

Screencast: Como instalar o git no Windows

Eu há alguns meses atrás escrevi o post como instalar o git no windows. Mas vamos e venhamos, há momentos que assistir é muito melhor do que ficar lendo.


Instalando o git no Windows from Adilson Carvalho on Vimeo.