おまぬけ活動日誌

最近のツッコまれどころ

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


2018年03月17日(Sat) 島の反対側まで水泳大会に [同日]

[tDiary] どうにかこうにかRubyを2.3.6にできたようだ

自作のGemを混ぜ込むための準備 (ホストの負荷を確認して忙しそうなら後にしてもらう) が終わって幾星霜、やっとこtDiaryをRuby 2.3.6 (このホストの最新版) に移しました。

このホストでは、index.rbから下記のようにtDiaryのindex.rbを起動しているのですが、Rubyだけruby200からruby23に上げるだけでは動きませんでした。

#!/usr/pkg/bin/ruby200
$:.unshift('/home/zunda/local/lib/ruby/site_ruby')
require 'limitload-cgi'
load 'tdiary/index.rb'

limitload-cgiは忙しそうなら諦める部分。

まずは前回のようにBungler関連のパスの準備をします。

require 'bundler/setup'
は要らなかった。

#!/usr/pkg/bin/ruby23
Gem.use_paths('/home/zunda/.gem/ruby/2.3.0', Gem.path)
Gem.use_paths('/www/zunda/d/tdiary/vendor/bundle/ruby/2.3.0', Gem.path)
$:.unshift('/home/zunda/local/lib/ruby/site_ruby')
require 'limitload-cgi'
load 'tdiary/index.rb'

するとGemが足りないと言われるのでtDiaryに必要なものをインストール

$ cd /www/zunda/d/tdiary
$ bundle23 install --path=vendor/bundle

次は下記のようなエラー。ホストのBundlerはちょっと古そうです。

There was an error in your Gemfile, and Bundler cannot continue. (Bundler::GemfileError)

下記でBundlerが1.15.4から1.16.1になり、この日誌が見えるようになりました。

$ gem23 update bundler --user-install
Updating installed gems
Updating bundler
Fetching: bundler-1.16.1.gem (100%)
Successfully installed bundler-1.16.1
Parsing documentation for bundler-1.16.1
Installing ri documentation for bundler-1.16.1

さてさて、次はtDiaryの更新ができるといいな。

(追記) 手元のmasterをcheckoutするだけで

undefined method `without' for #<Bundler::Settings:0x0000738017711640> (NoMethodError)

先は長いなw

あと、下記の行は不要なようだった。

Gem.use_paths('/www/zunda/d/tdiary/vendor/bundle/ruby/2.3.0', Gem.path)

2017年12月09日(Sat) 早起き、晴れ [同日]

ノイズキャンセリングヘッドホンを買った

リモート生活、ビデオ会議の時にラップトップと有線ヘッドホンでつながれるのがつらくなってきました。インナーイヤのブルートゥースヘッドセットも試したのですが、耳の穴が小さすぎたり、頭越しのブルートゥースの接続が安定していないようだったり*1。一念発起して、SonyのWH-1000XM2を買いました。Amazonで$298.00(Thanksgiving直後で値引きされていたのか今みてみたら$349.99)。

これ、すごいっすね。キャリブレーションを済ませると金属どうし接触するような高音以外はまったく聞こえなくなる。人間の感覚というのは定価$350くらいの製品にだまされちゃうものなんだ。だまされちゃうというか、マイクとAD変換器とDSP(なのかな?)ががんばって反位相の音を出してるわけなんだろうけど、$350程度で量産できる技術で実現できるくらいの精度なわけよね。

音楽が鳴っていない時にはホワイトノイズが多少聞こえるのが残念といえば残念だけれど、音楽を聴いている時の音質も申し分ありません。

会議に使うだけじゃなくてまた音楽を聞くようにしようかな。

きっと最新のVRゴーグルは視覚についてもだましてくれるようになってるんだろうな。デジタルたいしたもんだ。

*1 マイクロフォン側だけ切れるので自分ではわからない


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できました。むふふ。

そうそう、NetbsdSysinfoのインストール手順は下記のとおり

$ cd ~/local/src/netbsd_sysinfo
$ rake23 build
  :
netbsd_sysinfo 0.4.0 built to pkg/netbsd_sysinfo-0.4.0-netbsd.gem.
$ gem23 install --user-install pkg/netbsd_sysinfo-0.4.0-netbsd.gem
$ ruby23 -r netbsd_sysinfo -e 'p NetbsdSysinfo.loadavg'

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}"

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


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


zunda <zunda at freeshell.org>