0

rvmのJRuby1.6.7でnailgunを使わない設定と、起動速度を2倍にする方法

最近のバージョンから勝手にnailgunが起動するようになってた。

~/.rvm/hooks/after_use_jruby でnailgun起動してJRUBY_OPTSに-ng追加してるのをコメントアウトで止めたら解決した。

#!/usr/bin/env bash

. "${rvm_path}/scripts/functions/hooks/jruby"

if [[ "${rvm_ruby_string}" =~ "jruby" ]]
then
# jruby_ngserver_start
# jruby_options_append "--ng" "${PROJECT_JRUBY_OPTS[@]}"
else
# jruby_options_remove "--ng" "${PROJECT_JRUBY_OPTS[@]}"
jruby_clean_project_options
fi
 

JVMの起動が遅いので、起動済みJVMを使いまわすnailgunというのがある。
jruby –ng-server で起動して、 jruby –ng foo.rb でnailgun上でfoo.rbを実行できる。

スクリプト実行するまでの起動時間がめちゃくちゃ速くなってほぼゼロになる、なぜなら起動しっぱなしだから
というシステムなのだが開発中のウマくないプログラムがnailgunごと死んでしまうので、面倒だから止めたかったのだった。



nailgun無しだとMacbookAirの場合JRubyの起動毎に5秒以上かかるのだが、
export 'JRUBY_OPTS=-X-C'
export 'JAVA_OPTS=-d32'
しておくと2秒になる。
Macはふだん64bit server版のJVMを使っているが-d32を指定すると32bit client版が起動して速くなる。

1

62進数の変換 Rubyで

tiqavのpermalinkの62進数ID(http://tiqav.com/2iTとかhttp://tiqav.com/1UNとか)が短くてかっこ良かったので作ってみた。
数字を0-9a-zA-Zに変換するのと、逆に数字に戻す事ができる。

#!/usr/bin/env ruby

class AlphaNum

def self.table
@@table ||= '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'.split('')
end

def self.encode(num)
num > 61 ? self.encode(num/62)+self.table[num%62] : self.table[num%62]
end

def self.decode(str)
arr = str.split('').map{|i| self.table.index i }
for i in 0...arr.size do
return arr[i] if i == arr.size-1
arr[i+1] += arr[i]*62
end
end
end

(0...100).each do |i|
enc = AlphaNum.encode i
dec = AlphaNum.decode enc
puts "#{i} => #{enc} => #{dec}"
end
実行結果
0 => 0 => 0
1 => 1 => 1
2 => 2 => 2
3 => 3 => 3
4 => 4 => 4
5 => 5 => 5
6 => 6 => 6
7 => 7 => 7
8 => 8 => 8
9 => 9 => 9
10 => a => 10
11 => b => 11
12 => c => 12
13 => d => 13
14 => e => 14
(略)
87 => 1p => 87
88 => 1q => 88
89 => 1r => 89
90 => 1s => 90
91 => 1t => 91
92 => 1u => 92
93 => 1v => 93
94 => 1w => 94
95 => 1x => 95
96 => 1y => 96
97 => 1z => 97
98 => 1A => 98
99 => 1B => 99

0

クリップボードのテキストをHTMLエスケープするアプリ clip2htmlescape作った

blogにソースコードを貼り付ける時、>や&のような記号は>とか&と書かなければHTMLタグになってしまったりするので、それらを一発変換するソフトを作った。Mac用。

起動すると、クリップボードの中身を書き換えて即終了する。AlfredやQuick Silver等のランチャーに登録して使うと良い。

■実装方法
Platypusを使った。

こうするとRuby Scriptを内蔵させたMac用アプリが作れる。

 

■コード
これだけ。これもclip2htmlescapeで変換して貼り付けた。
#!/usr/bin/env ruby
require 'tempfile'

clip = `pbpaste`

[{
'&' => '&'
},
{
'<' => '&lt;',
'>' => '&gt;' ,
'"' => '&quot;'
}
].each do |h|
h.each do |k,v|
clip.gsub!(k,v)
end
end

f = Tempfile.new('clip2htmlescape')
f.write clip
f.close

system "cat #{f.path} | pbcopy"

0

RubyでPhidgets Servoを動かす

Macに最初から入ってるRubyで、サーボモーターが簡単に動かせるってすごい(^q^)

前:RubyでPhidgets InterfaceKitのセンサーを使う

サーボモーターが接続されていたら1.5秒毎にランダムな角度に回す。
回すとon_position_changeイベントが起こるので、そこでサーボの角度を取得して表示してみている。

ffi-servo.rb

#!/usr/bin/env ruby
require 'rubygems'
require 'phidgets-ffi'

servo = Phidgets::Servo.new

servo.on_attach do |device, obj|
puts "#{device.device_class} attached"
device.servos[0].engaged = true
device.servos[0].type = Phidgets::FFI::ServoType[:default]
end

servo.on_position_change do |device, motor, position|
puts "servo[#{motor.index}] => #{position}"
end

sleep 5
if servo.attached?
loop do
servo.servos[0].position = rand(servo.servos[0].position_max)
sleep 1.5
end
else
puts 'device not found'
end
 

結果
servo attached
servo[0] => 50.031
servo[0] => 131.969
servo[0] => 23.969
servo[0] => 86.969
servo[0] => 28.0
servo[0] => 98.969
servo[0] => 86.031
servo[0] => 193.0
servo[0] => 26.969
servo[0] => 211.0
servo[0] => 101.031
servo[0] => 206.031
servo[0] => 34.0
servo[0] => 116.031
servo[0] => 170.031
servo[0] => 80.969

0

RubyでPhidgets InterfaceKitのセンサーを使う

前に書いたphidgets-ffiを使う。ボリュームとスライダーと明るさとタッチセンサーを使ってみた。
Mac+Ruby+Phidgets簡単すぎてヤバイ。多少高いが、金をうならせれば誰でも電子工作的なものとWeb的なものを合体できる。箱から出して接続してすぐ使えるってすごいなー

 

■インストール

Phidget21をインストールしてからgemをいれる

gem install ffi phidgets-ffi
 

■プログラムを書く

ffi-ifkit.rb
#!/usr/bin/env ruby
require 'rubygems'
require 'phidgets-ffi'

ik = Phidgets::InterfaceKit.new

ik.on_attach do |device, obj|
puts "#{device.device_class} attached"
end

ik.on_sensor_change do |device, input, value, obj|
puts "sensor[#{input.index}] => #{value}"
end

sleep 5
if ik.attached?
loop do end
else
puts 'device not found'
end
 

■動かす

Phidgets InterfaceKitにセンサーつないでいじるとon_sensor_changeイベントが起こる
interface_kit attached
sensor[0] => 508
sensor[1] => 0
sensor[2] => 488
sensor[3] => 986
sensor[4] => 0
sensor[5] => 0
sensor[6] => 0
sensor[7] => 0
sensor[3] => 998
sensor[2] => 473
sensor[2] => 489
sensor[2] => 479
sensor[2] => 469
sensor[2] => 486
ちなみにon_sensor_changeイベントを使わなくても自分でPhidgets::InterfaceKit#sensorsを参照すれば読める。
raw_valueは12bitADコンバータの値で、0〜4095の値を返すようだ。to_iすると0〜999が得られる。
puts ik.sensors[0].raw_value
puts ik.sensors[0].to_i