俺のスライドや記事が4つ紹介されてた
2013年Rubyの話題を一挙に振り返るまとめ | Engine Yard Blog JP
「作りました!」と「チュートリアル、Ruby, Railsを始める」に1つ、
「Tips! コーディング」に2つ
12月302013
0
12月262013
既存のwindows用のsyslogクライアントはオープンソースじゃなかったり、有料だったり、windowsのEventLogを全部転送してくれるんだけどEventLogへの書き込みに管理者権限が必要だったりで手軽に使えるものが無かったので作った。
syslogにちょっと書き込みたいだけなのに色んなツール組み合わせないとならないのがおかしい。
Syslog Client for Windows
https://github.com/shokai/syslog-client-for-windows
不具合などは@shokaiかgithubの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するとmyapp.exeができる。ファイルサイズはだいたい2MBぐらいになる。
% ocra myapp.rb
WinXPでビルドして、Windows7と8でも動いた。よく出来てる。
Rubyで書いたので、exeに固める前のライブラリ部分をTravis CIでテストできるのも精神的衛生上良かった。
windows8ってsystem32に置けないの?
C:¥windows¥system32¥に置くとFatal error: Failed to open executable ~~というようなエラーがでて起動しないんだけど、どこに置くのが作法なのかよくわからない。他の場所に置いてフルパスで実行すればちゃんと動く。
12月252013
先週だけど1分で実現できる有用な技術 Advent Calendar 2013 – Qiita [キータ]に投稿した
→ 1分でアニメgifを活用する – Qiita [キータ]
書いてから気づいたけど最近githubのissueのコメント欄に、cmd+vするとクリップボードの画像をそのまま貼り付けれるようになってた。
アドベントカレンダーってやったことなくて、やってみたんだけど普段から作ったものどんどん書いてるからあまり意味なかった気がする。むしろアドベントカレンダー用に出し惜しみしてしまってリズムが狂ったかも
12月132013
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文字に対応していなかったので自前実装した。
12月102013
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 surootじゃないと書き込めないのだが、sudoでpipeの右辺にroot権限を持たせる方法がよくわからなかったので事前に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消灯
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'これも実行にはroot権限が必要
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
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される。