Novo endereço do blog / New blog location

Migrei o blog para um hospedado nos meus próprios servidores, ao invés deste que é hospedado no WordPress.com.

O novo endereço é: http://fbatista.com.br/blog/

Deixe um comentário

Ruby, MySQL and Oracle on MacOS X Lion

One of the drawbacks on being an early adopter is the amount of work needed to make all the pieces fit.

I’ve upgraded to MacOS X Lion on the day one, and, since then, accessing Oracle Databases has been a pain. The reason is that the Oracle Instant Client is broken on Lion, and Oracle has yet to release a fix (or even acknowledge the issue).

Fortunately, some good souls found that the 32-bit version of the Instant Client still worked, and so my journey begins. So I’m writing this small guide, mainly to remember myself of all the work I had to do.

Step 1: Get a 32-bit Ruby

This is one of the easiest parts, since it’s well documented on the RVM page: http://beginrescueend.com/support/troubleshooting/#i386. I personally chose to get a clean RVM environment before doing this, so I ran a rvm implode and then reinstalled it.

Once RVM was back and clean, I installed REE, my Ruby of choice, using the documented flags to force a 32-bit build:

export CC=/usr/bin/gcc-4.2
rvm_archflags="-arch i386" CFLAGS='-m32' CXXFLAGS='-m32' LDFLAGS='-m32' rvm install ree
rvm use ree --default

Step 2: Install the oci-8 gem using the 32-bit Oracle Instant Client

Get the 32-bit version of the Instant Client and its SDK on the following address: http://www.oracle.com/technetwork/database/features/instant-client/intel-macsoft-096467.html.

I usually extract the files to /usr/local/oracle. Once extracted, export it to the DYLD_LIBRARY_PATH and install the gem, using the same flags as before:

export DYLD_LIBRARY_PATH=/usr/local/oracle/instantclient_10_2
rvm_archflags="-arch i386" CFLAGS='-m32' CXXFLAGS='-m32' LDFLAGS='-m32' gem install ruby-oci8

Step 3: Damage Control – check your other gems

It turns out that, once my Ruby is running on 32-bit, several other would also need to be compiled for that architecture. The specific problem I experienced was with the MySQL gem: my MySQL installation was a 64-bit one, and, while the gem installed without errors, it could not be loaded by the Ruby interpreter, since they would be running on different architectures.

So I had to download a 32-bit MySQL distribution and extract it to my Mac. I didn’t, however, installed it: I just extracted its files, then pointed the gem to those 32-bit libraries while compiling.

The command ended up pretty complicated, but worked fine:

gem install mysql2 -v 0.2.11 -- --with-mysql-config=/usr/local/mysql-5.5.15-osx10.6-x86/bin/mysql_config

If you are running a 32-bit installation of MySQL, you might not need to use this command, just install the MySQL gem as usual.

Step 4: Point to the right libraries

Add the new library paths to your ~/.profile:

# Oracle and MySQL 32-bit
export DYLD_LIBRARY_PATH=$DYLD_LIBRARY_PATH:/usr/local/mysql-5.5.15-osx10.6-x86/lib:/usr/local/oracle/instantclient_10_2

 

And that’s it. Hope this information helps someone.

, , , , ,

Deixe um comentário

Bolsa presídio?

Esse post não tem diretamente a ver com programação, mas com uma mania muito chata que não consigo perder: pegar correntes, abaixos assinato, revoltas e etc, e ir a fundo, para descobrir se apóio ou não. Neste caso, trata-se do auxílio-reclusão, apelidado por alguns desinformados como “Bolsa Presídio”.

A mensagem que circula pela rede é: “Salário mínimo: R$545,00 pra sustentar a familia por um mês, Bolsa presídio: R$752,12, por filho. Vale a pena ser honesto?” Bom, vamos aos fatos:

O link que explica a lei em questão fica no endereço: http://www.previdenciasocial.gov.br/conteudoDinamico.php?id=922

Lendo com calma, já vemos que o benefício não é para qualquer um: a regra mais básica é que ele é válido pra quem for contribuinte do INSS (ou seja, trabalhar com carteira assinada), ganhar até 798,30 mensais (ou seja, menos de 2 salários mínimos), e for para a cadeia enquanto estiver na situação de contribuinte (ou seja, preso enquanto trabalha com a carteira assinada).

Pra mim está mais como uma maneira de proteger os dependentes do pobre preso injustamente, do que “incentivo a criminalidade”. Aliás, é justamente o contrário do questionamento do texto… Alguns textos criticando essa lei perguntam, “pra que estudar e ter uma profissão?”. Bom, é justamente pra isso, pra que, se vc for preso durante o exercício da sua profissão, teus filhos não fiquem desamparados… Diferente de quem é preso vagabundeando, sem profissão, esse não tem direito a nada, segundo essa lei.

Além disso, o texto peca pela falta de informação em outros aspectos: quando cita, por exemplo, que cada dependente do preso irá receber aquele valor. Essa informação é falsa, o valor do benefício é um só, e dividido entre todos os dependentes. Lendo a seção “perguntas e respostas” do site da Previdência, fica tudo muito mais claro.

Destaco:

Perguntas e respostas frequentes

O que é o auxílio-reclusão?
É um benefício legalmente devido aos dependentes de trabalhadores que contribuem para a Previdência Social. Ele é pago enquanto o segurado estiver preso sob regime fechado ou semi-aberto e não receba qualquer remuneração da empresa para a qual trabalha, nem auxílio doença, aposentadoria ou abono de permanência em serviço. Dependentes do segurado que estiver em livramento condicional ou em regime aberto perdem o direito de receber o benefício.

Esse benefício é pago ao preso?
O segurado preso não recebe qualquer benefício. Ele é pago a seus dependentes legais. O objetivo é garantir a sobrevivência do núcleo familiar, diante da ausência temporária do provedor.

O auxílio-reclusão é proporcional à quantidade de dependentes?
Não. O valor do benefício é dividido entre todos os dependentes legais do segurado. É como se fosse o cálculo de uma pensão. Não aumenta de acordo com a quantidade de filhos que o preso tenha. O que importa é o valor da contribuição que o segurado fez. O benefício é calculado de acordo com a média dos valores de salário de contribuição.

Que princípios norteiam a criação do auxílio?
O princípio é o da proteção à família: se o segurado está preso, impedido de trabalhar, a família tem o direito de receber o benefício para o qual ele contribuiu, pois está dentre a relação de benefícios oferecidos pela Previdência no ato da sua inscrição no sistema. Portanto, o benefício é regido pelo direito que a família tem sobre as contribuições do segurado feitas ao Regime Geral da Previdência Social.

Desde quando ele existe?
O auxílio foi instituído há 50 anos, pelo extinto Instituto de Aposentadoria e Pensões dos Marítimos (IAPM) e posteriormente pelo também extinto Instituto de Aposentadoria e Pensões dos Bancários (IAPB), e depois incluído na Lei Orgânica da Previdência Social – LOPS (Lei nº 3.807, de 26 de agosto de 1960). Esse benefício para dependentes de presos de baixa renda foi mantido na Constituição Federal de 1988.

A família do preso pode perder o direito de receber o auxílio?
Sim, desde que o segurado obtenha sua liberdade, fuja ou sua pena progrida para o regime semi-aberto. Pela legislação, os dependentes têm que apresentar a cada três meses, na Agência da Previdência Social, a declaração do sistema penitenciário atestando a condição de preso do segurado.

Ou seja, é muito mais uma lei pra ajudar os pobres, incentivar a permanência na cadeia durante a pena (sem fugas) e incentivar o emprego justo (trabalhar com carteira assinada). É mais ou menos como aquela conversa, “melhor fazer faculdade pra, se for preso, ir pra cela especial”… Mesma lógica: “melhor arranjar um emprego formal, com carteira assinada, pra, se for preso e a empresa me demitir, meus filhos pelo menos receberem o sustento”.

Antes de espalhar revolta, vamos pensar um pouco. O problema do Brasil é o Brasileiro, temos que começar consertando por aí.

3 Comentários

Deixando definitivamente de usar senhas no SSH

Faz um bom tempo que não utilizo mais senhas para acesso SSH aos servidores que necessito, uso apenas pares de chaves. Porém, alguns servidores possuem uma política de alteração de senha a cada X dias, e isso acabava incomodando um pouco – pelo menos a cada 30 dias, eu tinha que inventar uma nova que, na prática, não ia ser utilizada pra nada.

Bom, hoje resolvi dar um basta na situação, perguntei ao Google e em 2min estava com o problema resolvido:

 sudo passwd -d fabiob
 sudo chage -I -1 -m 0 -M 99999 -E -1 fabiob
 

O artigo original: http://www.cyberciti.biz/tips/setting-off-password-aging-expiration.html

Espero que ajude outros colegas envolvidos com mil chaves e servidores pra gerenciar… Em tempos de Cloud, todo auxílio é pouco!

Deixe um comentário

Interpretando numeração de colunas à là Excel

Pois bem, hoje precisei converter índices comuns de um vetor (0, 1, 2…) em uma visualização à là Excel (A, B, C…). No início, fui pra solução mais simples:

def to_excel_col(n)
  ('A'..'Z").to_a[n]
end

Serviu pro basicão, mas e quando a planilha tiver mais de 26 colunas? Tive que aumentar o algoritmo:

def to_excel_col(n)
  unless defined? @serie
    az = ('A'..'Z').to_a
    @serie = az + az.map {|x| az.map {|y| x+y } }.flatten
  end
  @serie[n]
end

Resolveu pra até 702 colunas, mas e se for mais? E todo esse espaço de memória ocupado? Estava uma solução muito lazy, que tal usar um pouco de matemática?

def to_excel_col(n)
  @@az ||= ('A'..'Z').to_a
  (n >= 26 ? to_excel_col((n / 26) - 1) : '') + @@az[n % 26]
end

Divertido… Que tal fazer o inverso também? E que tal embutir nas classes adequadas, pra usarmos coisas legais como i.to_excel_col?

class Fixnum
  # Função recursiva para gerar numeração de colunas no formato Excel
  # (0 = A, 1 = B, 2 = C, ... 26 = AA, 27 = AB, 28 = AC)
  def to_excel_col
    @@az ||= ('A'..'Z').to_a
    (self >= 26 ? ((self / 26) - 1).to_excel_col : '') + @@az[self % 26]
  end

class String
  # Função recursiva para traduzir uma numeração de colunas no formato Excel para inteiro
  # (A = 0, B = 1, C = 2, ... AA = 26, AB = 27, AC = 28)
  def excel_col_to_i
    u = upcase
    return nil if u =~ /[^A-Z]/
    u.each_char.map{|c| c[0] - ?A}.reduce(nil) {|v,i| (v.nil? ? 0 : (v+1)*26) + i}
  end
end

Legal… E o algoritmo anterior ainda serve de Testcase!

test "works with up to 3 letters" do
  az = ('A'..'Z').to_a
  serie = az +
      az.map {|x| az.map {|y| x+y } }.flatten +
      az.map {|x| az.map {|y| az.map {|z| x+y+z } } }.flatten

  letras = az.count
  combinacoes = letras.power!(3) + letras.power!(2) + letras.power!(1)

  letras.should == 26 # teste de sanidade, são realmente 26 letras?
  0.upto(combinacoes-1).each do |n|
    # testa todas as combinações
    v = n.to_excel_col # converte o valor para "excel col"
    i = v.excel_col_to_i # converte de volta em inteiro
    v.should == serie[n]
    i.should == n
  end
end

3 Comentários

Ativando log do “rails console”

Quem programa em Ruby há algum tempo, não consegue mais largar a excelente ferramenta que é o rails console. Carregar objetos e chamar regras de negócio por linha de comando, não tem coisa mais prática quando queremos algum resultado rápido.

Hoje, precisei chamar uma regra de negócio para um caso rápido, porém eu queria ver o que ela estava escrevendo no log, no momento. A solução foi relativamente simples, compartilho aqui:

ActiveRecord::Base.logger = Logger.new(STDOUT)

O resultado foi até melhor do que eu esperava… Pude ver, com detalhes, até as consultas SQL que meu código estava chamando!

Veja que legal:

[fabio@fabio-macbook projeto-x]$ rails console
Loading development environment (Rails 3.0.3)
ree-1.8.7-2010.02 :001 > ActiveRecord::Base.logger = Logger.new(STDOUT)
 => #<Logger:0x104122bb8 @formatter=nil, @progname=nil, ... @level=0> 

ree-1.8.7-2010.02 :002 > u = Portal::Usuario.find(24426)
  Portal::Usuario Load (21.1ms)  SELECT "USUARIO".* FROM "USUARIO" WHERE ("USUARIO"."ID" = 24426) AND ROWNUM <= 1
 => #<Portal::Usuario id: 24426, area: nil, ... tipousuario_id: 3> 

ree-1.8.7-2010.02 :003 > u.revalida_alguma_coisa!
Blabla meu log personalizado etc.

Deixe um comentário

Ruby on Rails and legacy databases

I’ve been working with Rails and legacy databases for a while, but today I’ve hit an error that I could not solve right away:

NoMethodError: undefined method `gteq' for nil:NilClass

All the tests were passing, so it had to be something related to the legacy schema. After googling a lot and not finding anything similar, I delved into Rails source code (thanks RubyMine for making this a lot easier) and finally found the failure: my primary key has a name different than the usual ‘id’. Fixing was damn simple:

class MyRecord < ActiveRecord::Base
  set_primary_key 'myid'
end

Now, back to work!

Deixe um comentário

Seguir

Obtenha todo post novo entregue na sua caixa de entrada.

%d blogueiros gostam disto: