2009年4月アーカイブ



オチなし危険!!


最近順次OSをFreeBSD 7.1に置き換えているようで、各所で問題が起きている様子。恐ろしいなあ。


と思っていたら自分のところにも災禍が。Tracにアクセスしてもまったくレスポンスが返ってこない。同サーバ内で動かしている別のCGIは動作していたので、ネットワーク周りに問題があるわけではなさそう(余談ながら、この問題のためTracにアクセスを繰り返していたところ「CPU時間食いすぎ!」とさくらからCGIの実行制限をかけられてしまって、そのことが問題の切り分けを難しくしていた)。


問題の解明


レスポンス返ってこないのでは何ともし難いので、とりあえずシェルからtrac.cgiを実行してみることに。確かTracはPython製だった気がするのでpythonで動かすと、



$ python trac.cgi
File "trac.cgi", line 2
LD_LIBRARY_PATH=/home/USER/local/lib;export LD_LIBRARY_PATH
^
SyntaxError: invalid syntax

げ、そんな根本的なことかよ、というか何で今までそれで動いてたの?と思ったら、さくらでTracを動かすに当ってtrac.cgiはシェルスクリプトとして作成していたことを思い出す。中を覗いてみると、



$ less trac.cgi
#!/bin/sh
LD_LIBRARY_PATH=/home/USER/local/lib;export LD_LIBRARY_PATH
TRAC_ENV=/home/USER/var/trac/repo;export TRAC_ENV
PYTHONPATH=/home/USER/local/lib/python:/home/USER/local/lib/python/site-packages;export PYTHONPATH
/usr/local/bin/python /home/USER/www/trac/trac_.cgi

だったので、shで動かす。



$ sh ~/www/trac/trac.cgi
/home/USER/local/lib/python/site-packages/pysqlite2/dbapi2.py:27: RuntimeWarning: Python C API version mismatch for module pysqlite2._sqlite: This Python has API version 1013, module pysqlite2._sqlite has version 1012.
from pysqlite2._sqlite import *
pthread_cond_wait: Unknown error: 0

とのこと。調べてみると、



OSバージョンアップによる主な変更点:


(略)


Python Python 2.4.5 → 2.5.2


http://www.python.org/download/releases/2.5.2/NEWS.txt


お知らせ|「さくらのレンタルサーバ」OSバージョンアップならびに新機能提供開始に伴うメンテナンスのお知らせ | さくらインターネット

というわけなので、まあそういうことなのでしょう;)


(12:14追記)pysqlite2.5.5入れてみてもダメだった


Pythonとpysqliteのバージョンがあってないのかなーと考え、とりあえず最新版らしい2.5.5を入れてみる。次のサイトを参考にしてみた。


錯綜するさくらインターネットでのpysqliteインストール - 常山日記



$ python setup.py clean
$ python setup.py build
$ python setup.py install --home=$HOME/local

そしたらセグフォするようになった\(^0^)/


(28日 16:00追記)symlink python->python2.4をpython->python2.5に変更してセグフォしなくなる



  • id:hktechnoたんに相談してみた。

  • ~/local/lib/pythonから~/local/lib/python2.4へのシンボリックリンクがあったのでこれを削除

  • 改めてpython2.5に向けて張る。

  • shで実行してみる。


まとめると以下のとおり。



$ cd ~/local/lib
$ rm python
$ ln -s python2.5 python
$ sh ~/www/trac/trac.cgi
No module named trac.web
Traceback (most recent call last):
File "/home/emp-cyas/www/trac/trac_.cgi", line 19, in <module>
from trac.web import cgi_frontend
ImportError: No module named trac.web
Status: 500 Internal Server Error
Content-Type: text/plain

Oops...

Trac detected an internal error: No module named trac.web

Traceback (most recent call last):
File "/home/emp-cyas/www/trac/trac_.cgi", line 19, in <module>
from trac.web import cgi_frontend
ImportError: No module named trac.web

セグフォしなくなった!ちゃんとエラーメッセ-ジを返してくれるようになったので対処しようがある。


id:hktechnoたんありがとう!!!!!!!!!!!!


(28日 22:17追記)諦めました


どう考えても再インストールしたほうが早いと判断して修復を諦めました\(^0^)/


次回は確実に動作報告のあるバージョンの組み合わせでインストールしようと思います。というかそういう情報をまとめたサイトってないのかなー。今は色んな人の部ログから断片的な情報を集めることしかできない。





フォーマット0


1本のトラックに全チャンネルの情報を押し込める形式。 トラックが1つしかないため、対応プレーヤの制作が容易。 またプレーヤ・シーケンサ間の互換性も保ち易くなるため、 市販のSMFデータは大抵がこの形式。


フォーマット1


同期演奏される複数のトラックで構成される。 大抵はシーケンサのいちトラックに対して SMFデータのいちトラックが対応するようになる。 つまり、一般的に「トラック」 と呼ばれるものが順番にバイナリ化されて並べられたフォーマットと考えればよい。 そのため、 トラック構成を保存しつつSMF化したい場合はこの形式が用いられる。 通常はこのフォーマット1を用いればよいと思う。


フォーマット2


複数トラックで構成される。パターン情報を保存し、 パターンを切り替えつつ演奏させるなんて場合に用いる。 フォーマット1がトラックを垂直に並べ、 それぞれを同期させて演奏させるフォーマットであるとするなら、 フォーマット2はパターン情報を水平に並べ、 順番に演奏させるようなものといえるだろう。ただし筆者はフォーマット2に対応したシーケンサソフトを知らない。 通常フォーマット0か1だけを扱っていても特に問題となることはない (・・・と、思う)。


about Standard MIDI format



PMMLは会津大学の西村先生が作ったMML拡張とそのコンパイラの実装。LinuxでMMLコンパイラといえばSPICE(電気回路シミュレータにあらず)が有名(っぽい)が、なんとなく適当にインストールしたらあっさりは動かなかったので、こんなん(NOTE:PDF)見つけてPMMLへの手がかりを得る。


入手とインストール


丸井綜研


会大のPMMLの公式サイトはアクセスできない状態らしいのだが、FTPサーバからPMML自体は入手できる様子。


URL: ftp://ftp.u-aizu.ac.jp/u-aizu/pmml/pmml-0.2p1.tar.gz


これをダウンロードして展開すると、INSTALLには「適宜Makefile書き直せ」とか初心者を蹴り殺すようなことが書いてあるがスルーしてビルドする。


とダメなので上記のサイトの「重複した宣言文」なるセクションの処理を施す。で、今度こそビルド。



$ wget ftp://ftp.u-aizu.ac.jp/u-aizu/pmml/pmml-0.2p1.tar.gz
$ tar xvzf pmml-0.2p1.tar.gz
$ cd pmml-0.2p1
$ make && make install

と、大コケした。make時だかinstall時だかわからないが、次のようなエラーが。



TLS definition in /usr/bin/ld: errno: TLS definition in /lib/libc.so.6 section .tbss mismatches non-TLS reference in input.o



libc.so.6とか絡んでるしぶっちゃけもう読む気にならないような感じだがとりあえず検索。


すると何か結構良くあるトラブルらしい:



/usr/bin/ld: errno: TLS definition in /lib/libc.so.6 section .tbss mismatches non-TLS reference in envdir.o


↑というエラーが出る場合 errno の扱いに問題があるらしい 以下のいずれか もしくは組み合わせの対処法で



  1. ソースプログラム.c の extern int errno; をコメントアウト

  2. #include がなければ 追加

  3. #include を追加してみる

  4. gccのオプションに –include /usr/include/errno.hを指定


errno.h は glibc 提供のヘッダファイルです djbdns qmail 関連 ucspi-tcp のビルドのときに問題がでやすいようです


UNIXとプログラムとゲーム » Blog Archive » errno: TLS definition in /lib/libc.so.6 section .tbss mismatches non-TLS reference in envdir.o

(整形はtnzkによるが文章は原文ママ)


cat comp/*.c |grep include すると、errno.hはインクルードされているようだったので、4番だけを試す(あと、2と3の違いがわからないんだが、どういうことなんだろ?)。


Makefileを開くと、



CCOPTS = -O



という行がある(tnzkの場合は17行目だった)ので、これを以下のように書き換える。



CCOPTS = -O2 --include /usr/include/errno.h



2つ補足。



  • 先ほど引用したページはミスかどうかで「-include /usr/include/errno.h」となっているが、正しくは「--include /usr/include/errno.h」

  • 最適化オプションが-O2に変更されているが、自分がなぜこうしたのかイマイチ覚えていないしどちらでもあまり影響はないんじゃないかと思う


この変更を加えてからmake && make installすると通る。


使ってみる


試しにとりあえずpmmlを呼んでみたらUTF8の端末では化けたのでnkfを噛ませる:



$ pmml -h | nkf -w
PMML Compiler Release 0.2 (Compiler version 0.67)
Copyright (C) 1997,1998 Satoshi Nishimura
This program comes with ABSOLUTELY NO WARRANTY.

使用法: pmml [オプション] ファイル名
オプション:
-0 format 0 の標準MIDIファイルを生成する
-1 format 1 の標準MIDIファイルを生成する
-2 format 2 の標準MIDIファイルを生成する
-c ch,ch-ch,...
指定されたMIDIチャネルだけを出力する
-d 空のトラックを削除する
-e PMMLソース文字列
PMMLソース文字列を評価する
-f {小節数[:ティック], /マーカ, /マーカ/{+,-}小節数[:ティック]}
指定された位置から演奏を開始する
-h ヘルプメッセージを出力する
-i file 初期化ファイルの名前を変更する
-l file 標準MIDIファイルをロードする (-e 'load("file")' に同じ)
-n ノート衝突時におけるノートイベントの修正を行わない
-o file 出力標準MIDIファイルの名前を変更する
-p 優先度によるイベントのソートを行わない
-q 初期化ファイルを読み込まない
-r N 出力分解能を N に設定する (省略時: 480)
-t {小節数[:ティック], /マーカ, /マーカ/{+,-}小節数[:ティック]}
指定された位置で演奏を中止する
-w 警告出力を抑制する
-F file PMMLソースファイルを読み込む (-e 'include("file")' に同じ)
-I dir dir をソースファイル検索パスの先頭に追加する
-R ランニング・ステータス・ルールを適用しない
-T track,track-track,/trackname/,...
指定されたトラックだけを出力する

普通に使える感じ。


サンプルをコンパイルしてみる。



$ cd examples
$ pmml menuet1.pml
$ cp menuet1.mid ~/public_html/

で、http://example.com/~tnzk/menuet1.midにアクセスする。ちゃんとメヌエットが聞こえたらおっけー!




以前8.4だかを入れたときはデフォルトで有効だったのでちょっと戸惑ったけども、/etc/network/interfacesを修正したら解決。


内容は以下。



auto eth0


iface eth0 inet dhcp



再起動。



$ sudo service networking restart

# ちなみにid:yaakaitoくんの家の周りには野良無線LANがあふれかえっていたので別に解決する必要がなかったかもしれないというのは内緒の話だ!


このアーカイブについて

このページには、2009年4月に書かれたブログ記事が新しい順に公開されています。

前のアーカイブは2009年3月です。

次のアーカイブは2009年5月です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

ウェブページ

Powered by Movable Type 4.32-ja