0

Twitter Stream APIで授業チャット作った

Twitterにfilter APIという単語で検索してstreamを受信できるAPIがあるので、授業のハッシュタグでfilterしてチャットを作った。
プログラムと起動方法は https://github.com/shokai/twitter-stream-api にある。

 

まず先週は、Terminalで動くバージョンを作って文字をデカくして全画面表示で教室の前に表示させて使ってた。
mitukiiiさんのuserstreamというgemのAPI参照先をfilter APIに変更したらすぐできた。@username の部分はrainbow で色を付けた。
twitterのログもテキストファイルで生成される。

 

次に今週はHTMLで表示させるようにした。Stream APIをem-websocketでwebsocketにして、文字をデカくした全画面表示SafariにWebSocketで表示させている。
表示用のHTMLとWebSocketサーバー起動方法は githubのtwitter-stream-api/viewer にある。

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