読者です 読者をやめる 読者になる 読者になる

久しぶりにArduinoを触って文字列処理でハマった。

  • sprintfで%fの書式は使えない。そのまんま".2f"とか出てくるから泣ける。
  • .c_str()の戻り値を変数に入れると文字化け。これも意味がわからなくて泣いた。

もう泣かなくて良いようにメモっとくよ。
(しかし書いたことを忘れてまた泣くのかも)

IRuby notebook を Macに入れようとしてハマった。(入りました)

基本的にIRubyのREADMEに書いてあるとおりでいいのだけど、rubyのバージョンや依存するツールなどでハマった。
とりあえず以下の手順で上手く行った。IRuby notebookとは何かとか、使い方とかはまだよくわからないので触れない。*1 iruby 0.2.8を入れた時の話です。
github.com

1. Anacondaを入れる

AnacondaはPythonの実行環境の一つ。科学計算向けのPythonライブラリやJupyter notebookが一緒に入ってくれる。
これがないとIRuby noteboookも動かないので入れる。
普通にインストーラを使って入れればOK。インストーラGUI版とコマンド版があるけどどっちでも良い。Pyhton3のものを入れること。*2

2. rubyは2.1.5 (ruby 2.2.2だとrbczmqのインストールでエラー。)
$ ruby -v
ruby 2.1.5p273 (2014-11-13 revision 48405) [x86_64-darwin14.0]
3. 以下のコマンドで依存ツールや依存ライブラリを入れる
#ここをやらないと rbczmq のインストールでエラー。
$ brew install libtool autoconf automake autogen 

$ gem install rbczmq
$ gem install iruby

gem install rbczmq の代わりに brew install zeromq して gem install ffi-rzmq すればOKという情報もあったけど上手く動かなかった。(インストールは成功するものの、起動後にKernel Rebootを繰り返す)

4. rbenvを使っていたので rehashしてirubyコマンドにパスを通す
$ rbenv rehash
5.起動
$ iruby notebook

これでJupyter notebookの画面がブラウザで開く。右上の「new」のメニューから「Ruby 2.1.5」を選ぶとノートブックが開き、rubyのコードを編集・実行できるようになる。

6.終了

iruby notebook コマンドを実行したコンソール(いろいろログが出ていると思う)でCtrl+Cを押すと

Shutdown this notebook server (y/[n])?

と出るので、yを押すと終了する。ブラウザは普通に閉じれば良い。


ググってもインストールでハマった情報がなかったので苦労した。つらい。インストール方法は割としょっちゅう変わっている模様。
同じようにつらい思いをした人は参考にしてね。

*1:上手く行った話はググればいくらでも出てくるしね

*2:余談だがAnacondaを入れるとconda というパッケージ管理コマンドが入るのだけど、これがrbenvとBundlerを合わせたような感じでなかなか便利そうだなと思った。Python使わないので利用する機会は多分ないけど。

さくらのレンタルサーバで自分から届いたメールを.Sentディレクトリに自動的に移動する

メールを送信するときに自分宛てにBccして送信したメールを保存しておく、ということはよくやるけれども、自分からのメールはやっぱり別フォルダに分けておきたい。IMAPを使えばサーバ上で自動的にフォルダを分けて送信済みメールは専用フォルダに行くようにしてくれそうなものだけども、iPhoneの「メール」はIMAPでもそういう気の利いてくれたことをしてくれないようだ。*1
また、メールの送信サーバと受信サーバが違う場合もうまくいかない(と思う)。
そこでサーバの設定を触って自分用にBccされたメールが自動的に送信済みフォルダに移動されるようにしてみた。

さくらのレンタルサーバではメールは /home/(サーバのアカウント)/MailBox/(メールアカウント)/maildir/ (以下、maildirディレクトリと呼ぶ) というディレクトリの中に保存され、送信済みフォルダはその下の .Sent/ (以下、.Sentディレクトリと呼ぶ)というディレクトリに相当する。
また、maildropというツールが導入されており、サーバ上でメールの振り分けが可能だ。
maildropに関してはさくらのレンタルサーバー非公式FAQの「メール」という項目に情報があった。
faq.sakuratan.com

maildropのための振り分け設定は上述した maildir ディレクトリが存在するのと同じ階層の、/home/(サーバのアカウント)/MailBox/(メールアカウント)/ にある .mailfilter というファイルに書く。以下のようにした。

シェルスクリプトのように色々コマンドを書いたり、変数を使ったりできるようだ。
メール受信時に .mailfilter が実行されるとき、カレントディレクトリは /home/(サーバのアカウント)/MailBox/(メールアカウント)/ になるので、pwdコマンドを実行した結果の文字列から自分のメールアドレスの@より前を取得できる。他のメールユーザに展開したい場合もファイルコピーだけで対応できる。(でも他の振り分け設定を上書きしないよう注意が必要)

*1:後で調べてみたら、なんか設定すればいいらしい

2重起動したくない時のための起動スクリプト

1時間に1度起動するスクリプトが実行し終わるまでに1時間以上かかってしまうかもしれないとしたら?
前の処理が終わる前に新しい処理が始まってしまうと処理しているデータの整合性が失われて困ったことになるかもしれない。
なので、ロックファイルを使って処理が2重に起動しないようにする起動スクリプトを書いてみた。
イデアは大したことないけれど、ちゃんと動かすためには意外と色々気をつけないといけない。

追記:
pgrepを使うやり方のほうがシンプルで良いね。

強制終了した時に上記をpgrepを使って書き直すとこんな感じか。

MWSのRuby向けサンプルコードをオブジェクト指向っぽくしてみた。

AmazonマーケットプレイスWebサービスというのを触る機会があり、以下のページを参考に勉強しているのだけどサンプルコードが全部ベターっと書かれていて再利用しにくいなあと思った。
※ベターっとのニュアンスがわからない方は以下リンク参照aws.typepad.com

そこで再利用しやすいようにオブジェクト指向で書きなおしてみた。
難しいところはサンプルそのままコピペ。
私がやったのは全体をクラス化して、MWSへの固定の引数⇒定数、リクエストごとに変化する引数⇒メソッドの引数という具合に分離することと、米国サイトと日本サイトを別々のクラスとして定義することくらい。

サンプルに書かれているListMatchingProductsにしか対応していないけれども、こうしておけば他の操作をやりたい時もメソッドを追加するだけで楽にできるんではないかなと思う。*1

*1:誰かがMWSのgemを作ってくれるのが一番楽なんだけども。MWSは大口出品者のアカウントがないといけないのでユーザが少ないのかも。

mod_rewriteで条件分岐

URLがある条件にマッチした場合にはURLを書き換えたくない場合がある。
そういうときは [S] (Skip) フラグを使用する。
このフラグを使うとURLが条件にマッチした場合にはn行下までの条件をスキップすることができ、擬似的にIF文のような条件分岐を実現できる。このとき、RewriteRuleは以下の様な構文になる。

RewriteRule <condition> - [S=n]
#URLが<condition>にマッチした場合はn行下までの条件をスキップする


Apache公式ドキュメントに書かれていた例が分かりやすかった。

# Does the file exist?
RewriteCond "%{REQUEST_FILENAME}" "!-f"
RewriteCond "%{REQUEST_FILENAME}" "!-d"
# Create an if-then-else construct by skipping 3 lines if we meant to go to the "else" stanza.
RewriteRule ".?" "-" [S=3]

# IF the file exists, then:
    RewriteRule "(.*\.gif)" "images.php?$1"
    RewriteRule "(.*\.html)" "docs.php?$1"
    # Skip past the "else" stanza.
    RewriteRule ".?" "-" [S=1]
# ELSE...
    RewriteRule "(.*)" "404.php?file=$1"
# END
https://httpd.apache.org/docs/2.4/rewrite/flags.html#flag_s

Raspberry Pi買ったのでシェルからLチカ

f:id:koki-h:20150913143726j:plain
何年も前から欲しい欲しいと言って買ってなかったRaspberry Piをとうとう購入した。
日経BPのラズパイマガジンとケースのセットで8000円位だったか。
とりあえずOS入れて無線LANの設定やらなんやらを済ませ、SSHでログインしてLチカを試した。
Pythonのライブラリを使えば簡単そうなのだけどなんとなく嫌で以下のサイトを参考にシェルからGPIOを制御する方法を試してみた。tool-lab.com

簡単にまとめると

  • GPIOの各ピンは /sys/class/gpio/ 配下の /sys/class/gpio/gpio*/value (*はピン番号)という仮想ファイルに0または1の値を書き込むことによってOFF(0)、ON(1)を切り替えることができる
  • 上記のファイルは最初は存在していないので以下の方法で作成する必要がある。(OSをシャットダウンすると消えてしまうのでOSを起動するたびに毎回作る。)
$ echo 18 > /sys/class/gpio/export #18番ピン用の仮想ファイルが作成される
  • ファイルを作成するだけでは使用可能にならないので次に入出力を設定する必要がある。(こちらもOSをシャットダウンすると消えてしまうのでOSを起動するたびに毎回設定する。)
$ echo out > /sys/class/gpio/gpio18/direction #18番ピンが出力に設定される
  • あとはechoコマンドを使うなどして0/1を書き込めばOK
$ echo 1 > /sys/class/gpio/gpio18/value #ON
$ echo 0 > /sys/class/gpio/gpio18/value #OFF

上記を応用してrubyでLチカをした

10.times do
  `echo 0 > /sys/class/gpio/gpio18/value`
  sleep 0.5
  `echo 1 > /sys/class/gpio/gpio18/value`
  sleep 0.5
 end

上記をもっと簡単にできるようにしたWiringPiというツールもあるらしいが、また今度調べる。

ちなみにRaspberry PiのGPIOから線を引き出す際には以下の様な延長基板が便利。

私はスイッチサイエンスのキットを購入したがハンダ付けを間違えてブレッドボード側のピンを裏表逆にしてしまった。
私のようなおっちょこちょいの人は完成品の方を購入したほうがいいかもしれない。