0

2013年Rubyの話題を一挙に振り返るまとめ

俺のスライドや記事が4つ紹介されてた

2013年Rubyの話題を一挙に振り返るまとめ | Engine Yard Blog JP

「作りました!」と「チュートリアル、Ruby, Railsを始める」に1つ、
「Tips! コーディング」に2つ

0

Windows用のSyslog Clientを作った

既存のwindows用のsyslogクライアントはオープンソースじゃなかったり、有料だったり、windowsのEventLogを全部転送してくれるんだけどEventLogへの書き込みに管理者権限が必要だったりで手軽に使えるものが無かったので作った。
syslogにちょっと書き込みたいだけなのに色んなツール組み合わせないとならないのがおかしい。

Syslog Client for Windows


https://github.com/shokai/syslog-client-for-windows

不具合などは@shokaigithubのissueにお願いします

使い方


syslog-client.exeをダウンロードして適当にPATHの通っている場所(C:¥windows¥system32¥とか?)に置いてから

% syslog-client -help
% syslog-client -host syslog.example.com hello world
% syslog-client -host syslog.example.com hello world -tag WARN -pid 100

このようにsyslogに書き込んでくれる。syslog-ngにちゃんと書き込めてたし、その出力をfluentd経由でMongoDBに読み込ませたりもやってる。


例:ログイン・ログアウトした時にユーザー名を送信する


こういう login.bat を作って
syslog-client -host syslog.example.com -tag INFO "%username% login at %COMPUTERNAME%"

Windowsスタートメニューの「ファイル名を指定して実行」から、「gpedit.msc」を起動。
ユーザーの構成→Windowsの設定→スクリプト(ログオン/ログオフ)に、bat追加すると実行してくれる

引数つけて実行するだけでsyslog飛ばせるので便利万歳だと思う。


実装

Rubyで書いてocraでexeに固めた。

ocraはrubyスクリプトをインタプリタごと1つのexeに固めてくれるソフトで、gemで提供されている。
% gem install ocra
% ocra myapp.rb
するとmyapp.exeができる。ファイルサイズはだいたい2MBぐらいになる。

WinXPでビルドして、Windows7と8でも動いた。よく出来てる。

Rubyで書いたので、exeに固める前のライブラリ部分をTravis CIでテストできるのも精神的衛生上良かった。


windows8ってsystem32に置けないの?

C:¥windows¥system32¥に置くと
Fatal error: Failed to open executable ~~
というようなエラーがでて起動しないんだけど、どこに置くのが作法なのかよくわからない。他の場所に置いてフルパスで実行すればちゃんと動く。

0

1分で実現できる有用な技術 Advent Calendar 2013の17日目を書いた

先週だけど1分で実現できる有用な技術 Advent Calendar 2013 – Qiita [キータ]に投稿した

1分でアニメgifを活用する – Qiita [キータ]

書いてから気づいたけど最近githubのissueのコメント欄に、cmd+vするとクリップボードの画像をそのまま貼り付けれるようになってた。


アドベントカレンダーってやったことなくて、やってみたんだけど普段から作ったものどんどん書いてるからあまり意味なかった気がする。むしろアドベントカレンダー用に出し惜しみしてしまってリズムが狂ったかも

0

あいまいテキスト検索 AsearchをNodeに移植した

asearchという文字列が似ているかどうか判定するrubygemがある。
増井先生が作ったもので、gyazzのページ名サジェストなどに使われている。

それをnodeに移植した。
https://npmjs.org/package/asearch
https://github.com/shokai/node-asearch


特徴

  • はやい
  • byte列を比較しているだけ
  • 結果はtrue/falseで返ってくる
  • あいまい度は指定できる(0〜3まで)
  • 他のライブラリに依存していない、pure javascript
たぶんブラウザでも動くのであとで試してみる。


インストール


npm install asearch


使い方

Asearch = require 'asearch'

a = new Asearch 'abcde'

console.log a.match 'abcde' # => true
console.log a.match 'AbCdE' # => true
console.log a.match 'abcd' # => false
console.log a.match 'abcd', 1 # => true
console.log a.match 'ab de', 1 # => true
console.log a.match 'abe', 1 # => false
console.log a.match 'abe', 2 # => true

typoを判定
a = new Asearch 'cheese burger'

console.log a.match 'cheese burger' # => true
console.log a.match 'chess burger', 2 # => true
console.log a.match 'chess', 2 # => false


2バイト文字もok
a = new Asearch '漢字文字列'

console.log a.match '漢字文字列' # => true
console.log a.match '漢字文字烈' # => false
console.log a.match '漢字文字烈', 2 # => true

このように手っ取り早く2つの文字列が似ているかどうか判定できて便利。


Nodeでビット演算

RubyからJavaScriptへ移植するにあたってビット演算がちょっと違った。

右シフト >> はjavascriptでは符号なし右シフト >>> にしないと符号が反転してしまう事がある。10分ぐらい気付かなかった。
|= とか >>>= とかも使える。
coffee-scriptだとさらに0b1010のような2進数記法も使えて便利。

RubyのString#unpackはNodeにもjspackという実装があるが、2byte文字に対応していなかったので自前実装した。

0

Raspberry PiのGPIOを使う

Raspberry Piの基板上のIC(BC2835)から出ているGPIOを使ってみた。
とりあえず3Vを出してLEDを光らせたり、スイッチをつないでon/offを検出したりした。
がんばればPWMやI2Cもできる。

回路

まずGPIOをオスメスのジャンパワイヤでブレッドボードに引き出す。
23,24番とGNDを引き出してLEDをつないだ。
18番とVCCの間にタクトスイッチを入れて、100Ωのプルダウン抵抗もつけた。

ピン配置は
RPi Low-level peripherals – eLinux.org
に書いてある。


デバイスファイルからGPIOを操作

Raspbianの場合、/sys/class/gpio/以下のデバイスファイルに標準入力するとGPIOが使える。
sudo su
echo 24 > /sys/class/gpio/export
echo out > /sys/class/gpio/gpio24/direction
echo 1 > /sys/class/gpio/gpio24/value ## LED点灯
echo 0 > /sys/class/gpio/gpio24/value ## LED消灯
rootじゃないと書き込めないのだが、sudoでpipeの右辺にroot権限を持たせる方法がよくわからなかったので事前にsudo suした。


pi_piper gemを使う

WiringPiが先存在してて有名なようだが、試したら動かなかった(エラーも出ない)のでpi_piperを使う。
WiringPiはC拡張だが、pi_piperはFFIとEventMachineを使ってGPIOを使っている。
・・・のだけど、ソースを読んだ感じたぶんFFIを使っているのはBC2835のI2C機能などを使う部分だけで、単純なdigital read/writeの操作はデバイスファイルごしにFile.openでやっている。
入力ピン状態変化イベントが遅く感じるのも、eventmachine使ってるのにThreadやsleep使ったりしているせいだと思う。ちょっと手を入れるとすごく速くなりそうなのであとでやる。


インストール
sudo gem install pi_piper
ネイティブコードをコンパイルするので少し時間がかかる。


pi_piperでLEDの点滅

GPIO 23,24番を1秒ごとに点灯消灯した。
非常にオブジェクト指向で良いと思う。

blink.rb
require 'pi_piper'

pin_a = PiPiper::Pin.new :pin => 24, :direction => :out
pin_b = PiPiper::Pin.new :pin => 23, :direction => :out

loop do
pin_a.on
pin_b.off
sleep 1
pin_a.off
pin_b.on
sleep 1
end
これも実行にはroot権限が必要
sudo ruby blink.rb


pi_piperでスイッチの押下判定

18番スイッチのon/off変化をイベントで取得した。
require 'pi_piper'

PiPiper.watch :pin => 18 do
puts "#{last_value} -> #{value}"
end

PiPiper.wait

ボタンを押したり離したりする毎にprintされる。