おまぬけ活動日誌

最近のツッコまれどころ

この日誌から Google してもらう


2017年09月08日(Fri) 遠方に見えた雨雲は来なかった [同日]

[tDiary] CGIからホームディレクトリにインストールされたGemを使うにはGem.use_paths

CGIからGemに依存するRubyスクリプトを起動するとrequireできないGemがあるのに気づきました。どうもCGI中ではHOME環境変数が設定されていないのが問題のようで、ローカルに起動する場合にも再現できました。

HOME= ./index.rb 
/usr/pkg/lib/ruby/2.3.0/rubygems/core_ext/kernel_require.rb:55:in `require': cannot load such file -- bundler/setup (LoadError)
        from /usr/pkg/lib/ruby/2.3.0/rubygems/core_ext/kernel_require.rb:55:in `require'
        from ./index.rb:3:in `<main>'

rubygems.rbをつらつらと眺めると、Gem.find_homeHOME環境変数からロードパスを作っている部分がありました。このファイルはRubyの起動時に読まれちゃうので後からHOME環境変数を変えることはできない、と思ったら、Gem.use_pathsというメソッドを見つけました。これを使おう。

#!/usr/pkg/bin/ruby23
Gem.use_paths('/home/zunda/.gem/ruby/2.3.0', Gem.path)
require 'bundler/setup'
require 'netbsd_sysinfo'

puts "Content-type: text/plain\n\n"
puts "Load averages: #{NetbsdSysinfo.loadavg}"
puts "Number of processes: #{NetbsdSysinfo.nprocs}"

これでやっとこgem23 install bundle --user-installしたbundler/setuprequireできました。むふふ。


2017年09月06日(Wed) 朝からちゃんとした雨 [同日]

[tDiary] 自作のネイティブRubyライブラリをCGIから使う

このtDiaryはNet BSD上で動いていて、ここのところコードの更新ができていません。更新を妨げている原因のひとつが、ホストに負荷をかけすぎないためにCPU負荷や自ユーザーのプロセス数をプロセスを起動せずにシステムコールだけで取得できるようにした自作のRubyライブラリでした。CGIから起動されるRubyスクリプトはまずこのライブラリを読んでシステムの負荷を測定し、問題がなければtDiaryの処理を始めます。これをなんとかモダンなエコシステムに乗せて更新を簡単にしたい。

というわけで、まずはsetup.rbではなくgemspecからビルドするようにしました。さて。次はCGIから起動されるスクリプトからこれを読めるようにになくちゃ。試行錯誤の結果、下記のようになりました。

Rubyの環境。このホストには、ruby 2.3.4p301/usr/pkg/bin/ruby23としてインストールされています。これを使うようにします。

$ gem23 install bundle --user-install

PATHの最初に$HOME/.gem/ruby/2.3.0/binを追加しました。

Gemfile。ローカルな変更を使ってしまわないよう、GitHubにpushしたものを使うようにします。

gem 'netbsd_sysinfo', :github => 'zunda/netbsd_sysinfo'

このライブラリをローカルから参照できるようにします。

$ bundle install --path=vendor/bundle

CGIスクリプトは下記のような感じ。

#!/usr/pkg/bin/ruby23
require 'rubygems'
require 'bundler/setup'
require 'netbsd_sysinfo'

puts "Load averages: #{NetbsdSysinfo.loadavg}"
puts "Number of processes: #{NetbsdSysinfo.nprocs}"

これをローカルから実行すると、Content-typeレスポンスヘッダと共に端末に結果が表示されます。もうひといき。

Content-type: text/plain

Load averages: [0.466796875, 0.37451171875, 0.34228515625]
Number of processes: 2

さて。Apacheから実行しますよ。

.htaccess

Options +ExecCGI
AddHandler cgi-script .rb
DirectoryIndex index.rb

これがHTTP/1.1 500 Internal Server Errorになるんだな。CGIスクリプトを書き換えてエラーの内容を確認する。

#!/bin/sh

echo Content-type: text/plain
echo

/usr/pkg/bin/ruby23 <<_END 2>&1
require 'rubygems'
require 'bundler/setup'
require 'netbsd_sysinfo'

puts "Content-type: text/plain\n\n"
puts "Load averages: #{NetbsdSysinfo.loadavg}"
puts "Number of processes: #{NetbsdSysinfo.nprocs}"
_END

RubyからのstderrもApacheに渡るようになります。

/usr/pkg/lib/ruby/2.3.0/rubygems/core_ext/kernel_require.rb:55:in `require': can
        from /usr/pkg/lib/ruby/2.3.0/rubygems/core_ext/kernel_require.rb:55:in `
	from -:2:in `<main>'

うーん。bundler/setup~/.gem/ruby/2.3.0/gems/bundler-1.15.4/lib/以下にあるのです。下記ならApacheからでも実行できる。

#!/usr/pkg/bin/ruby23 
$:.unshift("/home/zunda/.gem/ruby/2.3.0/gems/bundler-1.15.4/lib/")
require 'rubygems'
require 'bundler/setup'
require 'netbsd_sysinfo'

puts "Content-type: text/plain\n\n"
puts "Load averages: #{NetbsdSysinfo.loadavg}"
puts "Number of processes: #{NetbsdSysinfo.nprocs}"

どこかで誰かがこのパスを特別扱いしてるんだなあ…


2017年07月28日(Fri) 3日間の出張おしごとおしまい [同日]

今回も初めてお目にかかる同僚にたくさん会えました。顔おぼえられないよ!

YYZ

アメリカ入国の機械に指紋を読んでもらえない。

安心のティムホルトン。

YYZ-ORD B737

温かいぞ。また。

ORD

走ったはしった。くるちー

ORD-LAX B737

となりのおばさん、Androidの電話とiPadとWindows 10のLenovoのラップトップ(画面が裏にぺったりひっくり返るタイプ)を持ってて楽しそうだ。

UnitedWiFiもDNSは通るなあ。

LAX

食べ物とか微妙にがっかりなんだよなあ…

LAX-ITO

Switchでスブラトゥーンやってる子かいたよ。


2017年07月24日(Mon) アメリカ大陸横断 [同日]

LAX

日が変わって到着。

連番のゲートなのにひとつだけ離れていて、乗り換え先のゲートを見つけづらい。

ゲートのおっさんが冗談を言い続けてていいな。「ロスの街も渋滞が多いけどこのゲートの列もなかなかのものよね」

LAX-ORD B737

荷物棚がいっぱいでござる。新しいデザインの機内は棚自体が下に下がるようになっている。フライト駐車場は頭上が広いが荷物を取り出す時に頭をぶつける。

離陸予定10分前にそこらで鳴るGoogle Calendarの警告音。僕もだ、すんません。

仕事するのにネットワークを買おうかと思ったけれどかなりお高いので眠っておくことにする。電源あれば映画だけ観ておく手もあったね。

着陸してから時間がかかりますのう。乗り換え時間が迫ってくる。

ORD

ゲートの真横でピアノ生演奏。良いんだけど搭乗するときの列の妨げになっている。

ORD-YYZ B737

考えてみたら全部737だ。今回は機内エンタメの画面が付いていて上の棚のフタが上に開くタイプ。安全ビデオも流れる。

YYZ

フランス語が聞こえる。

トイレが少ない。

電車のカードを買ってみたよ。


作り手とその取り巻きだけが楽しんでる間は本物じゃない。その中身が理解できない人々の生活を変えてこそ本物だ


zunda <zunda at freeshell.org>