枚のこと 4月11日, 2021


from_prcm.jp

「禰豆子」なる女の子が口に竹の切れ端を銜えている図は頻繁に見かけるので,「鬼滅の刃」についての知識や関心がほとんどゼロの者でも見知っていた。

この画像を最初に見た時,自然と思い出したのは「枚」。「ばい」と読む。<昔,夜討ちなどのとき,声を立てぬように兵士の口にくわえさせ,ひもでくびに結びつけた,箸のような木。馬にも用いた。>(漢語林,枚)

兵書や歴史の文章でよく見かける物だと思う。

項梁再破秦軍,有驕色。宋義諫,不聽。秦益章邯兵,夜銜枚擊項梁,大破之定陶,項梁死。

『史記』高祖本紀 秦二世二年(『新釈漢文体系』史記二ではp.521)の例。「項梁は,再度秦軍を破ったので思い上がる気配であった。宋義が諫めても聞きいれない。秦は章邯の軍勢を増員し,夜間に兵に枚を銜えさせ(夜襲して)項梁軍を定陶で撃破した。項梁は死んだ。」

「バイ」はこの字の漢音。我々にとっては「1枚,2枚」の「マイ」(呉音)が普通の読みだけど,「枚乗(バイジョウ)」の例もある。<前漢の文学者。賦にすぐれ,「七発」は,その代表作。>(漢語林)

Pyftp 1月31日, 2021


mycat_daopi
daopi

1 REMOTE_PATHは,リモートのルート(例えば'public_html/')
2 LOCAL_PATHは,ローカルのルート(例えば'/Users/_NAME_/sites/_HP_/')
3 PWの扱いには更に工夫が必要

FTPする時,遥か昔は初期の"Cyberduck"が好みだった。でもその有料版が併存し初めた頃からはNcFTPに乗り換え,便利に使用してきた。そして,去年,思いたってPythonのスクリプトで省力化した。

省力化の背景は,ホームページのデータはwebbyというRubyのプログラムを使用して組み上げていることにある。MacBook Proに用意したポスト記事を,メニューや画像とともにページに仕立ててサーバーに転送する。転送先がsshに対応していれば,転送までwebbyがやってくれるので造作もないが,そうでない場合は,webbyが更新したファイルのリストを吐くので,そのファイルをNcFTPに指定して手動で送る。この更新ファイルリストを読み取って,サーバーに転送する手順は自動化がそう難しくないと思ったのだ。

スクリプトでは,一応,転送先がより古いことを確認した上で更新ファイルを送っていて,ファイルが存在しない場合はそのまま転送する。実に速い。不要になるファイルがある場合に削除するのは,従来通りNcFTPによる。つまり手動。スクリプトにこの処理も加えることはできそうだけど,それならファイル更新というより,「フォルダーの同期」として広げた方がよいか。簡単そうだし,そのうち考えてみよう。それにそこまでやれば,ssh以外の手段としてwebbyに組み込むこともできそうに思える。

葉書に宛名書き 1月8日, 2021


1 連絡先.appから書き出したvcfファイルや,所定フォーマットのcsvファイルを指定すると,
2 必要なデータをリストに組み立てて,
3 郵便番号は枠位置に合わせ,住所・氏名は横書きで,指定したプリンターに印刷する。

「葉書AB」が使えなくなってからは,あれこれ色々な方法で葉書の宛名を印刷してきた。でもどうもこれという決定版に出会えずにいた。自分用の宛名印字ソフトがないだろうか。住所・氏名の縦書きには全く拘りが無いので,なんとか気にいった宛名ソフトをみつけたい。できたらpythonでプリントする方法をみつけたい,と工夫してみた。やはり横書きが楽。

条件は,

  • ▶郵便番号は番号枠に納めたい
  • ▶全てをpythonでまとめたい
  • ▶入力はvcfでもcsvでもよい
  • ▶vcfはBig Surの連絡先.appの出力によっている
  • ▶csvのカラムは,姓・名・郵便番号・住所・連名の5つがこの順で並ぶこと
  • ▶住所・氏名は横書きする
  • ▶連名を1名許容する
  • ▶出力先のプリンターは使い慣れたカラーのもの

使用フォントは源真ゴシック。他のものでも勿論OKで,スクリプト冒頭にそのパス(PATH_TO_FONTS)を具体的に指定する。また,作業用ディレクトリを指定することでデバッグし易くなるので,それ(PATH_TO_WORK)も便利な場所を指定する。

全体の流れはスクリプトを見れば明瞭だが,一応要約しておくと,指定されたvcfファイル,csvファイルの中身を順にリストに書き出す(readvcf(), readcsv())。その1件をReportLabモジュールで葉書サイズのPDFページに配置し(mk1PDF()),それを繰り返して複数ページをまとめ(combine()),プリンターに出力する。過程で使用したファイルは見栄えよく,消去している。

工夫した点は,郵便番号枠に合わせるために,textobject.setCharSpace()の数値を0.2mm間隔で広げてみて適当そうな値を探したことだろうか。我が環境では,ピッタリ納まる。使用した葉書のフォーマットにより,もしズレるようなら,setTextOriginの数値などを変えて試してみることかな。ここではKOKUYO-KJ-A2630で設定している。数値は左下隅が原点。

なお,連絡先.appに登録する際,長くなりそうな住所には,改行したい場所1箇所に半角スペースを挿入しておく。出力例では「半蔵門マンション」の前にその処置がしてある。2箇所で改行するのは一応許されない仕様となっている(修整は簡単)。住所の改行箇所に自信が無い場合,スクリプトが「Printer 準備 OK?」と聞いてきた時に停止させればよい。PATH_TO_WORKに指定した場所に "combined.pdf" が出力されているので,それを確認する。ちょっと手工業的だけど充分役に立つ。

また,使用するプリンターは当然こことは異なるだろう。その場合,’lpstat -s’で表示される登録済みプリンターのリストを勘案して工夫すれば,多分うまくいくはず。

Alexa!次の電車は? 11月25日, 2020


1 <speak><say-as interpret-as="time">2分??秒</say-as></speak>
2 <speak><say-as interpret-as="time">0 分??秒</say-as></speak>

このところAlexa-Skillで遊んでいる。最寄り駅の次の電車の発車時刻を応えるスキルを登録したのだけど,困ったことが2つ。

時刻表データを配列に用意して,近い時間の発車時刻を応えるだけの単純なpythonスクリプト。スピーチのタイプを"PlainText"にしたのだけど,これでは,"2分,5分,9分"のような1桁の時刻(分)を「にぶ,ごぶ,きゅうぶ」と読んでしまう。次の電車の発車時刻自体はまあわかるのだけど,ちょっと無念。修正には改めてawsの豊富な説明書きを読まねばならなかった。でも読めば収穫あり。"SSML"についてまとめられているのを読んで報われた。これで解決できた。"SSML"とは,"Speech Synthesis Markup Language"で,読み上げの細かな部分を調整する方法のようだ。その"<say-as>"に"time"というオプションがあり,これでOK。

<speak>次の電車は<say-as interpret-as="time">2分??秒</say-as>です</speak>
これで「次の電車はニフンです」と読まれる。"??秒"は読まれない。読まれないが,"time"のフォーマットの関係からだろう,秒の指定が欠かせない。

<speak>次の電車は<say-as interpret-as="time">0 分??秒</say-as>です</speak>
次に困ったのは,「レイフン」。時刻にあるのを「レイフン」と読んで欲しいがそのように読まれず,ただ「レイ」だけで終ってしまう。この挙動の理由は推測できるが,これは乗り越えるには相当難しい壁だった。何の掴み所もない。詳細な筈の説明書きにも触れられていない。Amazonだけではたりず,Microsoft・Googleその他にかなりの文書がある。"<say-as>"の源流の一つらしき"W3C"まで辿ってしまったが何も行き当たらず。こんな時はUSAの質問サイトをあさればヒントに行き当たるのが普通だけど,全くダメ。もう「試行錯誤」しかない。それで発見したのが,上記方法。わかりにくいかもしれないが,ゼロの後ろにスペースを挿入する方法だ。読み上げる文を変数で用意しているのだけど,"0分"にはこの処理を加える。これで期待通りに読まれる。

「Alexa,○○駅の次の電車は?」のように聞くと,「今日は休日なので,次の電車は○○です」のように応えてくれる。結構楽しめる。休日判断は「jpholydayモジュール」を組み込んでいる。

LilyPondのセグメンテーション・フォールト 8月1日, 2020


64bit用LilyPondがセグメンテーション・フォールトを吐くなら、libguile関連ライブラリーを入れ替えてみる

楽譜はSibeliusで清書している。ただ、ちょっと数小節必要な場合、簡単に印字してくれるLilyPondも大変好きだ。テキストファイルを用意すれば、TeXのように画像を生成する不思議さに引かれてもいた。そう、Catalinaになる前はね。そうです、64bit障壁ができてからは動かなくなって久しいわけです。

残念でしょうがなくて、あの膨大な依存ファイルを数日かけて集めてmakeしてみたこともあって、今でもmacには他で用いることがありそうもないあれこれの小さなプログラムやライブラリを貯めこんでいる。でも、次から次へと更なる依存関係を言われることに根負けしてコンパイルをあきらめ、もうこの際Homebrewだか、MacPortsだかを頼るよりしょうがないかなと思い始めていた。macOSに既存のファイルまで重ねてinstallして自分の環境を作るパッケージは好みではなく、また元来があれこれ試してconfigureやmakeなどで無事に動くプログラムが組み上がっていくプロセスが好きなことから、それらパッケージのお世話にはなっていないのだ。

さて、それで今日発見した。Marnenという人物がdarwin-64bit用バイナリーを公表していたのだ。本当に今頃になって発見した。しかもLilyPondの本家にリンクがあるのに気づかずにいたわけだ。 macOS 10.15用の非公式の64ビット アプリケーション バンドル

しかし残念にも、入手して立ち上げるとわが環境では「Segmentation fault」で止まってしまう。

$ lilypond --verbose desktop/test.ly

表示されるエラーを確認した。これで"Segmentation fault"が出てくる起動ログの一部が見える

解決方法を探して数時間、NetでのMarnenの発言を発見しそれを追うと、彼が他のユーザーのエラー状況を確認する言葉の中で、lib/guile18について述べているのを読んだ。 LilyPond.app/.../lib/guile18 の不具合の可能性を考えているように見えた。それに吐いているエラーからすると、ライブラリーコンパイルの問題にも思えると、勝手で根拠ない推測をし、試しに「大事そうなlibguile*(供給ファイルには18個ある)」を、自分でguile-1.8.8をコンパイルした時にできていた '/usr/local/lib/libguile*(24個あった)' に入れ替えてみた。

ライブラリの場所は、 LilyPond.app/contents/Resources/lib/libguile*
lib/guile18が関連するわけではないようだ。事情は不分明で、libguile18.dylibは、lib/guile18には置かれずlib/libguile18.dylibとなっている。とにかく単純なことに上記でOKだった。

desktop$ lilypond test.ly

test.pdfが無事に作成されたし、以前作成したファイルで試しても無事に出力される。OKだった。Marnenさんどうもありがとう。私と類似環境でこのエラーを経験している方は、試してみる価値があると思う。ご自分の責任で。

新版:連絡先.appのデータをとりだす 7月5日, 2020


昔、当時の「アドレスブック.app」のデータをExcelに読み込むためのスクリプトを利用していた。いや、必要があれば今でも使うのだけど。今回、csvファイルをvCardファイルを経由して「連絡先.app」に収納するpythonで遊んだ余勢をかって、逆にvCardからcsvファイルを作成するプログラムも書いてみた。ただし、初心者のことでもあり、macOSでの使用しか考えていないこともあって、汎用性はほとんどないし、かなり無骨で、エレガントな所など全くないものだ。

「連絡先.app」から"書き出す>vCardを書き出す…"でvcfファイルを用意する。プログラムを起動すると、vcfファイル読み取り用のダイアログが開くので用意したファイルを指定する。続けて変換したcsvファイル保存のダイアログが開くので保存先を指定する。

出力されるcsvファイルのカラム構成は、
[姓, 名, 敬称, 姓の読み, 電話, Email, 郵便番号, 住所[都道府県, 市区, 町村, 番地], 連名]
となっている。他の項目が必要な場合は工夫を要する。

■制約事項
・名の読みは移せない
・電話, email, 住所, 連名は各1件のみ
・保存先のcsvファイルは新規ファイルを指定のこと。既存ファイルを指定するとみっともなくエラー。

この制約の3点目のasksaveasfilenameの不具合にからむ問題は、例外処理ではない解決方法を見つけたいと思っている(が難しそう)。Linuxの場合なら stackoverflow にあるようにfiledialog.pyに手を入れることで乗り切れるらしいことを見つけたが、コメントが付いているようにmacOSでは解決しない。確かにfiledialog.pyの修正は無効だった。

【追記】asksaveasfilename 1月15日, 2021 ふと気づいた。Big Surに上げたからか,何かのupdateが効いてくれたのか,asksaveasfilenameのダイアログが普通に動作するようになっていた。vcf2csv,csv2vcf,ともに同じファイル名を指定してもきちんと動作する。よかった。

CSVからvCardを作成して連絡先.appに読みこむ 6月14日, 2020


必要があって受け取ったExcelファイルの宛名を官製ハガキに印刷しなければならなくなった。Catalinaになってから「葉書AB」は使えなくなった。64bitでビルドし直さなければならないのでね。それで、この手の作業は現在は「おまかせ宛名はがき」に頼りきり。そのためには、まず「連絡先.app」に読み込ませなければならない。直接読み込ませることができる筈だけど、どうもご機嫌斜め。何か約束があるようで、csvファイルを受け付けてくれない。この手の「無言の約束事」が結構の曲者なのだ。

試行錯誤の末になんとか読んではくれたのだけど、これってよくありそうな作業だ。私はあまりやらないけど。元来、vCard3が単純なフォーマットであるのを知っているので、目下中心に遊んでいるPythonでスクリプトを組んでみた。ただし、例によって我が環境でしか無事には動かないものだろうし、あれこれのチェック作業を省いているので、単なる自分の作業メモかもしれないのだけど。

csvファイルを用意する。その構造は、{姓、名、姓読み、名読み、携帯電話番号、自宅電話番号、自宅メールアドレス、自宅住所[ 郵便番号、都道府県名、市区町村以下 ]}となっているものとした。

住所については、もっと詳細に「連絡先.app」の欄に対応づけることもできるだろうが、葉書に印刷するという目的からすれば、これで充分。

起動すると、csvファイル読み取り用のダイアログが開くので、ソースを指定する。変換後にvcfファイルを保存するためのダイアログが開くので保存先を指定する。「連絡先.app」から、"ファイル>読み込む…"でこのvcfファイルを指定する。以上で終了。※csvソース2行目の「平将門」さんは、「姓読み」を省略しているため、「すべての連絡先」末尾の「読みなしグループ」になる例です。

csvソースの例:
服部, 半蔵, はっとり,, 011-1111-1111, 01-1111-1111, aaa@bbb.cc, 111-1111, , 大江戸区城内西1-1
平, 将門, , まさかど, 022-2222-2222, 02-2222-2222, ddd@eee.ff, 222-2222, , 大江戸区城内東2-2

出力されたvcfとカード@連絡先アプリ

【追記】tkinterのmac対応 7月4日, 2020 このpythonスクリプトでは,tkinterパッケージを利用している。しかしこのパッケージは私が思うにmacOSとの相性は最低だ。色々な箇所に実用上の不具合がある。たとえば、(ここでは関係ないが)ウィジェットに漢字を入力する場合、確定させるリータンキーを入力するまで文字が表示されないような例もある。上記でもasksaveasfilenameに支障があることに気づいた。それは、vcfファイルの保存先を指定するダイアログで、既存ファイルを指定するとエラーとなるのだ。これは、macOSでは(多分Windowsでも)filedialog.pyを使用せず、システムのファイルダイアログを用いることに起因するものらしく、解決方法を知らない。本来なら例外処理が必要だが、ここでは省いている。ちょっと格好悪い。

【追記】asksaveasfilename 1月15日, 2021 ふと気づいた。Big Surに上げたからか,何かのupdateが効いてくれたのか,asksaveasfilenameのダイアログが普通に動作するようになっていた。vcf2csv,csv2vcf,ともに同じファイル名を指定してもきちんと動作する。よかった。

Xcode-11.5とXVim2 6月1日, 2020


Xcode-11.5に上げてからVim起動時にエラーが出るようになった。表示は長いので省略するが、要するに「プラグインXVim2.xcpluginのロードエラー」などで、

$ xcodebuild -list> /dev/null

これでも同じエラーが表示される。対処方法がわからず、コールドブートの度に、つまり私の場合は毎朝、この何行ものエラー表示が繰り返され、わずらわしかった。これまで類似のエラーは、GithubのXVimProjectにある手順に従えば解決したように思うが、今回はNG。

調べてみてEugeneの これ を発見。2020-03-01の記事だけど、大変ありがたい。Thanks a lot. 要するに「xcodebuildも再署名しなさい」ということ。再署名することでTeamIdentifierが’not set’になる。これで前手順で’not set’にしてしまったXcodeのTeamIdentifierと連携をとるということだろうか。このあたりの事情を説明するものをまだ見てはいないのだけど。とにかく、これで悩まされていたエラー表示は出なくなる。

$ sudo codesign -v -s XCodesigner -f --timestamp=none /Applications/Xcode.app/ \ Contents/Developer/usr/bin/xcodebuild

この処理は、XVimProjectのREADMEに加えるべきだと思う。

アンドラーシュ・シフの「皇帝」 11月6日, 2019


コンサートが終わって上野から山手線に乗車すると, 1両に数人。でも, しばらくして見上げると東京駅も過ぎたようで, 向かいの席の老若男女7人全員が携帯の画面に目を伏せているほどには混んでいた。いつもの様子だ。

しかし, あの演奏会は何だったのだろう。「皇帝」が終わった時, なぜか不思議にも涙が流れ, なぜかちょっと恥ずかしかった。こんな感動始めてだ。わけがわからない。


サー・アンドラーシュ・シフ & カペラ・アンドレア・バルカ
 Sir  András  Schiff & Cappella Andrea Barca

J. S. バッハ・・・『音楽の捧げ物』BWV.1079より 6声のリチェルカーレ
モーツァルト・・・ 交響曲第41番 ハ長調K.551「ジュピター」
ベートーヴェン・・・ ピアノ協奏曲第5番 変ホ長調Op.73「皇帝」

楽員はステージに集まり, 席に立ったまま指揮者を待つ。ああいうスタイルも指揮者とひとつの思いで繋がっているようで,なかなか格好いい。他のオーケストラのコンサートでこういう始まりを見た覚えがない。忘れているだけかな。

1曲目のリチェルカーレは, 高校生の頃, NHK-FM「現代の音楽」のテーマだった。ヴェーベルン/A.Webern編曲で冒頭のホルンが今思い出しても泣ける。あの頃をきっかけに, 音楽を聞くようになったし, ヴェーベルンの全集まで買ったんだったっけ。もう黴だらけになっているかもしれない, 随分針を落としていないから。今回の演奏では弦に割り当て, 上手に位置した2nd.Vnから始めていた。1st.Vnは4プルト半。コントラバスは2人が左右に一人ずつ位置していた。シフは曲が始まったらじっと聞くふうで, 手は動いていない。でもなぜか奏者と繋がっているという後ろ姿だった。

2曲目のジュピターにはアタッカではいった。確かにバッハからの繋がりでこの形は深い。左コントラバスの白鬚美しいクラウス・ストールが印象的。本当に楽しそうに楽器を弾いているのが, 見ても聞いてもステキだ。

休憩後の始まりでは, 集まった楽員は座って待ち, シフに促されて立ちあがっていた。こういう始まりなんだね。「皇帝」は, 冒頭の頑強に胸をはった様な音楽も素敵だけど, やはり2楽章がなんといっても好きだ。宇宙の彼方から光がキラキラ自分に降りそそいでくるよう。このキラキラ度が昨晩は特別に高く感じられ, そこから爆発するような3楽章へのアタッカ。ワクワクする。ドラマチックな演奏だった。

曲が終わり満場の拍手。よく演奏会で思うのだけど, 確かにステキではあるけど「普通の演奏」に, 腕が折れそうな拍手をしたり, 果ては「ブラボーーー!!!」と叫ぶ人までいる。でも, 今回は自分でも掌が痛くなるほど。正真正銘の拍手に感じられ, 純粋に意志の貫徹した演奏に感動した。拍手に応えてベートーヴェンのピアノ協奏曲第1番の第2楽章。ちょっと長く10分ほど, 演奏家たちの心がこめられたアンコールだと感じた。アンコールはやはりこういう曲が良い。素敵な演奏で気持ちを満たして帰宅したいものだ。まれに, 騒然とした雑踏に踏みつけられるような音楽で終わる演奏会がある。「やめてくれよ」と思うことも。昨夜のコンサートはそれとは違った選曲で, いくらでも聞きたかった。でも, それ以上せがむのは失礼と, 満足したままで会場を出た。外は満月の夜だった。

心拍の光学式センサーと胸センサーの返す値を比較する 8月29日, 2019


普段,光学式センサーで心拍を計測している。今日は以前から気になっていた事を実測してみた。それは,「手首で測る光学式センサーが示す値は,胸ベルト式のセンサーと同じだろうか」ということ。

ちょっとみっともないかもしれないが,時計を両腕につけ,一方は手首で測り(Garmin-ForeAthlete225j),もう一方は胸で測って(Polar-M200)80分ほど走ってみた。ゆるい上り下りのある周回コースを4周ほどしている。

Garminの計測間隔は不定なので,1秒毎の計測値が残るPolarと対照させる工夫が必要となる。図の左下のような表で, Garminの計測秒数によりPolarのデータを串刺しにしている。まあ,Garmin計測値の表にPolarの計測値を抜き出して加えている,といったところか。

一応の結論は「両者に差はない」としておこう。青線が手首, 緑線が胸。赤線は"青マイナス緑"。差の平均は0.56となり, 全般的に見れば差はないとしてもよいだろう。グラフの中央付近などに不自然な谷はあるが(最大の差は,光学式:116bpm,胸ベルト式:154bpm),理由は不明。また,今回の計測では全体的に光学式の数値が不安定に思えるが,その理由も不明だ。今後,繰り返して測ってみれば,もっと具体的な差異がわかってくるかもしれない。

心拍数ドリフトのこと 8月13日, 2019


運動を続けると, 体温の上昇とともに心拍数が徐々に上がっていく。たとえ自覚的運動強度が同じであっても, 心拍数は自然に上昇していく。Cardiovascular drift(CV drift)と呼ぶのだそうだ。その様子を確かめてみたいと思い, Garmin connectのデータを表示してみた。ここではある日のジョギングデータをtcxファイルにエクスポートし, 簡単なperlスクリプトで処理している。同じペースで軽く80分間ほど走ったグラフだ。

シェルからGeekletをリフレッシュする 3月19日, 2019


GeekToolでデスクトップを飾って遊んでいる。ちょっと必要があって, bashのスクリプトからGeekletをリフレッシュしたくなった。設定する秒数を指定する方法ではなく, 自分の思うタイミングで励起したいのだ。

まず思いつく単純なやり方として情報が多いのは, AppleScriptを利用してリフレッシュするものだ。

tell application “GeekTool Helper”
  tell geeklet id “vvvvvvvv-wwww-xxxx-yyyy-zzzzzzzzzzzz”
    refresh
  end tell
end tell

こんなAppleScriptを用意して,それをスクリプトから呼ぶわけだ。しかし, 考慮中のものは,Launchctlに起動されたbashスクリプトからGeekletを呼んでデスクトップに表示するものだ。単純化すれば,

■よくありそうな手順
・Launchctlからbashスクリプトを起動する
      ↓
・スクリプト内でGeekletをリフレッシュするために, "AppleScriptファイルを呼ぶ"
   /usr/bin/osascript  /Users/me/Library/Scripts/sample.scpt
      ↓
・AppleScriptがGeekletをリフレッシュする

このようにAppleScriptを介するのがちょっと不愉快に思ったのだ。それで「bashからGeekletを直接リフレッシュする」方法があるだろうと思って調べたが,簡単にはヒットしなかった。ここに書き留めておく意味もあるかもしれない。結論は簡単なことで, AppleScriptのファイルは不要。"Geekletを直接リフレッシュする"。

例えばこんな風に,
$ /usr/bin/osascript -e ‘tell application “GeekTool Helper”
    to refresh geeklet id “vvvvvvvv-wwww-xxxx-yyyy-zzzzzzzzzzzz”’

単純なことだった。この効用は, ターミナルから入力すれば確認できる。まあ, ファイルは不要とは言え, AppleScriptを用いることには変わらないのだけど。

【追記】icalBuddyのCatalinaへの対応 10月23日, 2019 GeekTool自身は問題なく動くのだが, 併用しているicalBuddyがNGとなった。不安定。「これは困った」と思っていたら早速対応してくれた方があった。 ここ のicalBuddy64.gitを使わせてもらう。 THANKS!

気温の日変化 1月12日, 2019


"ほぼ日課"で昼前に5km走っているけど(去年は こんな風), このところ寒いので服装を迷う。半袖Tシャツの上にフリースのジャケットを着るか, ウインドブレーカーを着るか。一応, MacBookProのデスクトップにGeekToolで表示している外気温を参考に上着を決めることにしている。

それでふと思ったのだけど, アメダスのデータって簡単に記録することができるかな? 観測データをファイルするのって面倒だろうか?

やってみた。

■機能
・東京の気温データ(北の丸公園)を毎時読み取ってログする。
■実行は
・Geektoolの表示を夜間もログしようと思ったことが発端だが, MacBookProで動かしたのではやはり不便。止めることもあるし, スリープさせないのも面倒。読み取りスクリプトは, Debianのサーバー上に置いて, cronで起動することにした。
・読み取りの頻度は60分おきで十分。でも暇なサーバーだし,15分毎に起動して遊んでみることにした。
■利用例
・動かした結果をNumbersで開いてみると, 下記のようなグラフを書くこともできる。
・ここでは時間変化を確かめてみたが, 毎日午前6時のデータを1ケ月貯めてみるのも面白いかもしれない。

ウェーバーのファゴット協奏曲 9月9日, 2017


元来、ピアノ弾きではシフが圧倒的に好き。この前ラジオで聞こえてきたベートーヴェンの魔笛の主題による変奏曲の伴奏に聞き惚れ、即座にCDを注文してしまった。聞きなおしてまったく別の発見あり。1番のチェロソナタinFもCDに含まれるのだけど、その第2楽章冒頭の主題が、そのままウェーバーのFgコンのテーマになっていたのだ。なんでこれまで気づかずにいたのだろう。「人には常識なのに自分は気づかないまま年老いる」そんなことがよくあるけど…。オリジナルのベートーヴェンのフレーズが素敵なこともある。でも、それを活かしたセンスの良さがあって、この場合、ウェーバーがとりわけナイスに思える。

SeilとSierra 1月7日, 2017


AquaSKKを便利に使用して随分になる。読み入力に入るためのシフトキーをスペースバーに割り当てることで,親指シフトキーボードのようにできるのも実に具合が良い。当然ながら,スペースバーを単独で押した場合にはスペースを出力するようにする。これも含めたキー置換をSeilとkarabinerに頼ってきた。ところが,年末にSierraにあげ,この置換が不可能になってしまった。keyhacを使う方法もあるようだが,どうも勝手がよくない。

そこで,当面, wwwjfy を頼ってだましだましだった。ところが,Version-0.90.73で大きな変更があった。「standalone_keysに指定できるのは交換されていないキーに限る」となったのだ。どう設定したよいか。目標は,「spacebarを,修飾キーとしてはシフトキーとし,単独キーとしてはスペースキーとする」こと。

やってみたら単純だった(下記に示しているのは該当行のみ)。

$ vi ~/.config/karabiner/karabiner.json

  "simple_modifications": {
    "caps_lock": "left_control",
    "spacebar": "right_shift"
  },
  "standalone_keys": {
    "spacebar": "spacebar",
    "caps_lock": "escape"
  }

irbの日本語(再) 12月14日, 2016


Xcodeのバージョンがあがった。readline-7.0も出ていたし,久しぶりにlibeditをlibreadlineに入れ替えることにしよう。作業の時に参照している メモ が古くなり,不適切な箇所も気になっていたので,まとめ直すことにする。(El Capitan/10.11.6)

■まず、readlineを再compile。

$ curl -O http://www.ring.gr.jp/pub/GNU/readline/readline-7.0.tar.gz
$ tar xzvf readline-7.0.tar.gz; cd readline-7.0
$ ./configure; make; sudo make install

■ライブラリの指定を確認する

$ cd /System/Library/Frameworks/Ruby.framework/Versions/2.0\
    /usr/lib/ruby/2.0.0/universal-darwin15/
$ otool -L readline.bundle | grep libedit
    /usr/lib/libedit.3.dylib (compatibility version 2.0.0, current version 3.0.0)

このlibedit.3.dylibを/usr/local/lib/libreadline.dylibに入れ替えればよい。

■ライブラリの指定を入れ替える

$ sudo cp -p readline.bundle readline.bundle.BK
$ sudo install_name_tool -change \
    /usr/lib/libedit.3.dylib /usr/local/lib/libreadline.dylib \
    readline.bundle

■結果を確認する

$ otool -L readline.bundle | grep libreadline
    /usr/local/lib/libreadline.dylib (compatibility version 2.0.0, current version 3.0.0)
$ irb
irb(main):001:0> name="あ"
=> "あ"
irb(main):002:0> 

よし、OK//

【追記】irbのCatalinaへの対応 10月23日, 2019

irbが使えなくなった。「…Catalinaへの対応」というより「既存irbの放棄」だね。システムのRubyはWebby用に限定し, 遊びで使用するのは最新安定版(ruby-2.6.5)にすることにした。ソースをもらってきてコンパイル。ただし, このサイトを組み上げるのに使用しているWebbyは古いものなのでruby-1.8が必要。これまでOSのバージョンアップがあってもそのために古いrubyを温存してきている。ページの維持管理にはそちらを使用する。ちょっと面倒だけど, 自分でWebbyをupdateするよりは楽だろう。

readlineについてはreadline-8.0が"/usr/local"にいれてあるので, configureに指定することでirbの日本語の扱いには問題がなくなり, 上記のreadline.bundle関連のあれこれは不要になる。これで"alias irb=/usr/local/bin/irb"とでもしておけば普通にirbが使える。

ruby-2.6.5$ ./configure --with-readline-dir=/usr/local

ガーミンのデータを抜き出す 8月13日, 2016


GarminのEdge500とForeAthlete225Jを使用してきている。暑くなって、ゆったりジョギングでの心拍がやはり20bpmは上がったなと思いつつ、ひらめいた。Garmin connectに貯めているデータをまとめてダウンロードできないかな。

確かめると、Garmin connectでは、個々のアクティビティーのデータを得ることはできるが全データを一括して得る方法は無さそうだ。今更GarminのSDKにあたるのも何だし…。ただ、古いアプリケーションのGarmin Training Center(GTC)からであれば、「すべてのデータをエクスポート」する機能がある。

試しにForeAthleteをGTCに同期し、データをXMLでエクスポートしてみた。「すべてのTraining Centerデータ.tcx」というファイルができる。中身を見ると単純なXMLファイルの構造が読みとれる。そこで簡単なperlのスクリプトを書いてみた。

■機能
Lap毎のデータから、ID・時間(秒数)・距離(メートル)・平均心拍数(bpm)・平均ペース(分:秒/km)・平均ステップ(spm)をSTDOUTにCSVデータとして書き出すこと。
IDは、例えば、"2016-03-20T00:18:31Z"のように、スタート日時をUTCで示す文字列にした(日本のローカルタイムでは2016-03-20T09:18:31)。
■実行するには
スクリプト名称をtcx2csv.pl、データファイル名称をData.tcxとすると、
$ tcx2csv.pl Data.tcx | sort > RunningData.csv
■利用例
得られたCSVファイルをNumbersで開くと、例えばこのようなグラフを書くことができる(勿論、Execelに読み込むことも可能)。アクティビティの平均心拍数と平均ステップ数を表示してみたもの。

[追記 2020-03-10] Garmin Training Centerは古いものなので、現在では入手することができない。それにもうCatalinaでは動かないでしょう。

『幕末史』人名索引 3月20日, 2014


『幕末史』半藤一利著 (新潮文庫、2012)の人名とその読みをRuby/SQLite3に入力した。「薩長・官軍の側から見た"維新史"」とは違う「幕末」の姿が目新しかった。それと、詩だけでしか知らなかった西郷南州という人物がこの時代に占めた重さの幾分かも理解できた気がする。同じ著者の『それからの海舟』も面白かったしね。

いつも本を読む時のメモは、文献カードの延長で"MacJournal"に入力している。昔のカードでの作業とは違って簡単に全文検索ができるからだ。ただ、この本は、登場人物も多く、特に公家さんたちの名前の読みがとても難しい。読みなど無視して先へ急ぐこともあるのだけど、既知の事柄も整理しながら楽しむにはやはり全て読みたい。著者・編集者は個々の人名の読みも詳細に確認したのだろうしね。それで、読み進めながら人名と読みを逐次入力し、読めない人名に出会ったら引いてみる、といった使い方をしようと思い人名索引を作ってみた。Ruby/MySQLで作成した「所蔵DVDリスト検索DB」を母型に、Mac既存のRuby/SQLite3で手を加えたものだ。"読み"は、この文庫本で振られているものに限り、随意に読んでしまったものはない。わずらわしい程頻繁に振られている人名についても全て入れた(つもり)。"備考"は、本文の前後を斟酌して適当にメモした自分用で、原文を参照しないと意味がとれないものばかりだ。個人用に作成した道具を何もわざわざここに載せることはないのは重々承知だが、どうせ入力したのでついでに置いておこうと思っただけで、ひょっとしたら便利だと思ってくださる方もあるやもしれず。

データ入力の発端が人名の読みを確認したいことにあったので、基本的には名前を検索するようになっているが、データ量がたいしたことないので、"別名"や"備考"も検索範囲に含め、効率を無視して前方一致・後方一致でしらみつぶしに探している。DB操作がお好みなら、手入れして自分用の読書メモを作ることもできるでしょう。また、清書用の書き出しフォームを工夫することでも遊べるでしょう(そこまでやらなかったけど)。

■解凍
zipファイルには、"bakumatsushiフォルダー(html,css,png)"と"cgi-bin-bakumatsushiフォルダー(Rubyスクリプト,SQLite3DB)"が含まれている。
■ファイルの移動
$ cd bakumatsushi
$ sudo mv cgi-bin-bakumatsushi  /Library/WebServer/
$ sudo mv bakumatsushi  /Library/WebServer/Documents/
■接続
http://localhost/bakumatsushi/index.htmlをブラウザで開く。

■参考: apache設定との関連で
OS Xでは、apacheの設定ファイルは "/etc/apache2/httpd.conf" で、そこにDocumentRootが設定されている。ここでは、それが "/Library/WebServer/Documents" となっていて、その直上のcgi-bin-bakumatsushiにcgiが許されていることを前提にしている。これ以外の設定となっている場合はそれに合わせるわけだが、その設定方法についてはNet上に記事も多く詳細は省略。

幕末史人名索引Zip

irbの日本語 2月17日, 2014


Mavericksになって、久しぶりにirbを起動してみたら日本語文字列が使用できない。これはirbが使用するlibeditが日本語を理解できないためらしい。解消する手順はネット上にも記事が多くさまざまな方法があるようで、要するにlibeditをGNUreadlineに入れ替えればよいということのよう。HomebrewやMacPortsを好まないのは少数派のようだな。以下は特にユニークな内容ではない自分用メモ。

■まず、日本語を理解してくれるGNUreadlineをcompile

$ mkdir work; cd work
$ curl -O http://www.ring.gr.jp/pub/GNU/readline/readline-6.2.tar.gz
$ tar xzvf readline-6.2.tar.gz; cd readline-6.2
$ ./configure CFLAGS="-arch i386 -arch x86_64" LDFLAGS="-arch i386 -arch x86_64"
$ sed -i "" -e 's|-dynamic|-dynamiclib|' -e 's|-arch_only `/usr/bin/arch`||' shlib/Makefile
$ make; sudo make install
$ ls -F /usr/local/lib/libreadline*
/usr/local/lib/libreadline.6.2.dylib*
/usr/local/lib/libreadline.6.dylib@
/usr/local/lib/libreadline.dylib@
/usr/local/lib/libreadline.a

■次に、libedit.3.dylibをつないでいるreadline.bundleを探す

$ find / -type f -name readline.bundle -print 2>/dev/null
/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/
    universal-darwin13.0/readline.bundle
/System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/ruby/2.0.0/
    universal-darwin13/readline.bundle

この’1.8’の下は以前のバージョンのものなので、’2.0’の下が問題のもののはず。

■ライブラリの指定を確認する

$ cd /System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/ruby/2.0.0/
     universal-darwin13/
$ otool -L readline.bundle
readline.bundle:
    /System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/libruby
        .2.0.0.dylib (compatibility version 2.0.0, current version 2.0.0)
    /usr/lib/libedit.3.dylib (compatibility version 2.0.0, current version 3.0.0)
    /usr/lib/libncurses.5.4.dylib (compatibility version 5.4.0, current version 5.4.0)
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1197.1.1)
    /usr/lib/libobjc.A.dylib (compatibility version 1.0.0, current version 228.0.0)

この/usr/lib/libedit.3.dylilbを/usr/local/lib/libreadline.6.dylibに変更すればよいはず。

■ライブラリの指定を入れ替える

$ sudo cp -p readline.bundle readline.bundle.BK
$ sudo install_name_tool -change \
    /usr/lib/libedit.3.dylib /usr/local/lib/libreadline.6.dylib \
    readline.bundle

■結果を確認する

$ otool -L readline.bundle
readline.bundle:
    /System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/libruby.2.0.0.dylib
      (compatibility version 2.0.0, current version 2.0.0)
    /usr/local/lib/libreadline.6.dylib (compatibility version 2.0.0, current version 3.0.0)
    /usr/lib/libncurses.5.4.dylib (compatibility version 5.4.0, current version 5.4.0)
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1197.1.1)
    /usr/lib/libobjc.A.dylib (compatibility version 1.0.0, current version 228.0.0)

■irbの動作確認

$ irb
irb(main):001:0> name="あ"
=> "あ"
irb(main):002:0> 

よし、OK//

連絡先.appのデータをExcelに読み込む 12月21日, 2013


Mavericksの連絡先.app-8.0(1365)になって、vCard書き出しの書式がわかりにくくなった。以前のスクリプトにちょっとした変更を加えて、自分にとってはまあ支障ない動作にした。場当たり的だけどね。ただし、配偶者(1名、当然か)以外に兄弟・知人が登録されている場合には、手を加えなければ想定通りに動かないのは以前と同様だ。

以前の記事 ;

gprolog-1.4.4 11月28日, 2013


Mavericks, Xcode5でgprolog-1.4.4にupdate。

$ curl -OR "http://gprolog.univ-paris1.fr/gprolog-1.4.4.tar.gz"

compileしてみたが、コンパイラが変ったことで以前のスイッチ類は効かない。また、それらを省いてただconfigureしても"Fatal Error"となる。

Fatal Error: Segmentation Violation (bad address: 0x0)
compilation failed
make[1]: *** [fd2c.o] Error 1
make: *** [all] Error 1

これはちょっと手こずるぞ。情報を探すうち、作者のDaniel Diazの「修正したソースをGitに置いた」という発言を発見。[ Source作者のGitの情報 ]

$ mkdir work;cd work
$ git clone git://git.code.sf.net/p/gprolog/code
$ cd code/src;
$ ./configure;make;make check
$ sudo make install

得られるソースに含まれていないconfigureと一部のdocは配布パッケージからcpした。"All tests succeeded"で、これにてOKとなった。

野狐禅を散らす 11月11日, 2013


まだ文章の持つ力も言葉の魅力も知らなかったころの事、「野狐禅を散らす」という表現に出会った。何となく分かるものの、どうもわかった気がしない。前後の文脈を追ってみても読み取れない。家にある辞典をすべてひっくり返しても意味がわからない。わからない分だけ何としてもその語句の意味を知らずにはおけなくなった。
 当時高校生だった私は、自分が暮らしていた町の図書館は遠くて大変不便だったので、自転車で隣町の図書館に行ってみた。そこは、今は移転してなくなってしまったのだが、前庭に機関車が展示してあるようなありふれた場所で、とても自分の「荘厳な勉強」の役には立ちそうもないように思えたのを覚えている。不思議なことに、通っていた学校で先生にこの語句の意味を尋ねた記憶がない。聞かないまでも、言葉の意味を調べる際の基本的なやり方は知っていたろうに、手に余る難しい語に出くわして逆上し、自分独りで手当たり次第に調べてやろうなどと不逞にも考えたのかもしれない。
 ところが、その図書館の辞典の棚の前に立ち、最初に見当をつけた辞典を繰ると、事は意外にも解決されてしまった。それまでの何日もの疑問が全て説明されている。例示されていたのも、驚いたことに今知りたいと思っていたまさにその詩人の詩句だった。これは、誰にでもある辞典、辞書との出会いであろうが、自分自身に起こった場合は常に新鮮である。覚えている限りでは、これが人生初めての「調べ物」だったかと思う。

私自身は、そのままこのような趣味の延長で、それこそ不謹慎とも言えそうな動機なのだが、漢字を読むこと、古典についてその魅力を話すことを仕事とするようになった。その後、ごくわずかな関わりではあるが、その疑問を氷解させてくれた当の辞典の増補作業に加わることもでき、持ってはいてもほとんど開いたこともなかった『全唐詩』などの大部の詩集を、一ページ一ページ読む機会を得ることもできた。
 改めて考えてみると、古典を相手にしてきたからというわけではあるまいが、既知の事柄では理解できないものを本で調べることが単純に好きだ。そんな自分にとっての古典は、自分の内部での作業以前に常にまず他者が必要となるものである。つまり、本や人に聞かなければ自分でいくら考えてもわからないのだ。
 今、国語科に対する時代の要請は、受動的な鑑賞型から、より能動的な表現型に向いている。そして、自分の考えや感情を表現するには、その前作業として「調べる」行為が不可欠であり、辞典類を調べる大切さが一段と増している、と言える。

高校生たちがよく口にし、また、世の中で繰り返されている陳腐な駄洒落でもあるが、「漢文はチンプンカンプン」だ。しかし、物事を知るということは、漢文に限らず、そう簡単なことではない。現代の高校生世代にとって、漢文は以前にも増して難しいようだが、わからないという前に少し自分で調べる努力をしてみなければ。調べてみて得られた結果は単純なものかも知れないが、結果以上の収穫が思わず得られる場合もある。そのように教え続けていくことができればと思っている。

さて、発端の言葉の意味であるが、「野狐禅」とは、

真実に参禅もしないで、悟つた風をよそほひ、他を欺き誑かすを以て、野狐に喩へてかくいふ。(『大漢和辞典』)

と、今では自分の机の脇に並べてあるその辞典は解説している。

Mavericksの不体裁:Login画面の入力メニュー 10月28日, 2013


OSのメジャーアップデートは、しばらく様子見することが多いのだが、"無料"にひかれて即座にOSを上げた。[Finder環境設定]>[タグ]の文字列"サイドバーに表示すタグ:"のような不体裁が残っていて、ローカライズのこととは言え、製品の最終点検確認の手順がどうなっているのかな。アマチュアが作ったみたいだ。

ログインウインドウで名前とパスワードを入力する設定にしているが、["ユーザーとグループ"環境設定]で、[ログインオプション]の"ログインウインドウに入力メニューを表示"のチェックボックスが機能しなくなった。チェックを外しても、"ことえり"の「英字・ひらがな・カタカナ」の入力メニューが表示される。(以下削除)

[追記 2014-02-28]: 誤った内容を削除した。ログインオプションの設定通りに起動しない場合、’/Library/Preferences/com.apple.HIToolbox.plist’が不適切なのだから、それを単純に削除すればいいことに気づいた。

Login画面&Webby再設定 3月1日, 2013


OSをあげて、あれこれ雑事で遊ぶ。その中からメモ2項目。

Login画面を’名前’と’パスワード’の入力にしているのだが、Mountain LionでIDを入力しようとするとFEPが動くようになった。「’ことえり’は切っているのに変だ。単純に英数字を入力したい。どこで設定しているのだろう」としばらく悩む。Netでもそれらしい記事を発見できず、そのうち、Appleの説明を読んでいて気づいた。方法は以下。

ログインオプションで’ログインウインドウに入力メニューを表示’を選んだ上でログアウト。表示された入力メニューで’このリソースを削除’する。

単純なことだった。でも、なんでこんな動作をdefaultにしたのだろう。「さまざまなユーザーの便宜を考慮して」かな。余計な手間に思える。

それと、クリーンインストールしたのを機会に、Webbyを再度インストールし直してみた。あれこれのゴミもたまっているのでね。ソースは ここ からもらう。このところの更新はやはりない。でも目下はOK、まだ動く。これがNGになったらサイトの構築手順をどうするか悩みそうだが当面はよしとしよう。

DBD-mysql-4.022のupdate 2月1日, 2013


ここにあるのは自分自身のメモです。MacPortsやHomebrewを好まず、むしろ手数がかかるのを楽しんでいます。基本は「今目の前で動けばよい」ということ。MacBook Proで遊んでいます。

Lion既存のものとは別に、最新版のDBIを/usr/localにインストールしたメモ。

OS X 10.7.5
Xcode 4.6(Command Line Tools)
PATH=/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/Applications/Xcode.app/
    Contents/Developer/usr/bin:/usr/local/mysql/bin
DYLD_LIBRARY_PATH=/usr/local/mysql/lib:/usr/local/lib

DBI-1.623
$ perl Makefile.PL; make; make test; sudo make install

DBD-mysql-4.022
$ perl Makefile.PL; make; make test;
t/80procs.tをfail。

t/80procs.t ................. 1/29 DBD::mysql::db do failed: Cannot load
from mysql.proc. The table is probably corrupted at t/80procs.t line 41.

テストスクリプトを見ると、"drop procedure if exist"の箇所だ。手で繋いでみると、DBのtestは空だし失敗などするはずがないのだけど…。あっ、最近MySQLを5.5.29にupdateしたけど、長いことテーブルをupgradeをしていなかった。 参照

$ sudo mysql_upgrade -p

これで再度"80procs.t"も含めて全テストにパス。OK。

MySQL-5.5.29をソースからコンパイル 1月31日, 2013


MySQL-5.1.44が古くなったのでupdate。バイナリーをインストールしてみたが、"Server characterset"が latin1でコンパイルされている。この先文字コードの扱いが面倒になりそうなので、ソースから。

Mysql-5.5.29.tar.gz(64bit版)を ここ からもらって展開すると…あれconfigureが無い。これは cmake なる道具を使うようになったためとのこと。バイナリーがあるので、それをインストール。

全データベースをダンプし、/usr/local/mysql-5.1.44/dataも一応バックアップして

$ cmake . -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_unicode_ci
$ make
$ make test
$ sudo make install

testもすべてok。

[追記 2013-03-03]: Mountain LionでMySQL-5.6.10に上げたところ、上記はNG。’Segmentation fault’を吐いて止まってしまう。環境が問題なのかもしれないがよくわからず面倒でもあり、バイナリーを入れた上で、my.cnfに’character-set-server=utf8’を加えることでよしとした。

単純な構造のXMLからエレメントを抜き出す 4月27日, 2012


GPXデータのtrkpt要素を抜き出し、time要素を読み取って処理することで遊ぶうち、その一部は幾分かでも汎用的なものにしておいて後日に備えようという気になった。XMLのうち、ごくシンプルな構造のものであればそれほど手もかからないという読みだ。

エレメントの名称と対象のXMLファイルを指定すると、そのエレメントの内容を表示する単純なperlのスクリプトだ。XMLでは、ツリー構造の各レベルに同一名称のエレメントが存在している場合がある。ここではそのレベルの違いを無視し、名称で全てを抜き出してくる。特徴は、XMLモジュールを用いず、正規表現でマッチさせている点にあるだろう。ただし、私の関心は身の回りにある ごく単純な構造のXMLファイル にあるので、それなりに複雑でサイズも大きい純然たるXMLには対応できないだろうと思う。また、XML宣言部分や全角のタグ名称についてはここでは考慮していない。

スクリプトでは、複数行マッチをさせる関係から予め全てを文字列に読み込んでしまう。サブルーチンでそこから該当エレメントを配列に抜き出させ、その配列を表示している。この表示部分を加工すれば、後日何かに適応できるのではないかという目算だ。でも何ができるかわからないけどね。サブルーチンで、マッチングをとるのにちょっと格好悪い’or’があるのは、<tag…/>を処理するためのもの。そこでは属性にデータがあり終了タグが省かれている。どうも私はXMLを充分に理解していないなあ。とにかくそれに対応している。見るからに効率も悪そうだしエレガントではないのだが、わが要求からすれば充分に機能を果たしてくれる(はず)。

$ ./extract_element.pl ElementName From.xml

ElementNameが抜き出すエレメント名、From.xmlが対象のXMLファイル名。

[追記 2014-02-13]: タイポが残っていた。訂正。まじめに動作確認もしなかったようだ。それと、’plist’をこれでいじっていたら、単純な構造であっても同名のエレメントが内部に存在すると処理できないこと、awkなら同名エレメント以外簡単に処理することに気づいた。

$ awk '/<ElementName>/,/\/ElementName>/ {print}' From.xml

今更だね。GPXのデータを見ている時、なぜこんな簡単なことに気づかなかったのだろう。執着すると離れて考えられなくなる典型だな。

GPXデータをスリムにする 4月23日, 2012


GPSロガーないしは、サイコンの話です。gpxデータのポイント数が多い場合、例えばルートラボなどにインポートしようとすると8,000ポイントの制限を越えてしまって、保存することができませんよね。以下は、それを削ることに関して、自分ではこうするということを簡単にまとめたものです。Lionのシステム既存のrubyで処理しています。環境が変ればこのままではうまくいかないかもしれません。例によって、自分の目の前で必要な処理ができればよい、というスタンスで考えたものですが、同じような環境の方なら多分同じ動きをするはずです。

今、試しにgpxのファイルをエディターで開いてみると、それが単純なXMLファイルであることがわかります。各ポイントデータは<trkpt>と</trkpt>のタグで囲まれ、その下位の<time>タグにUTCで表現された時間データが記録されています。試しにのぞいたものは、4秒毎にデータを取得していて毎分15ポイント。走行時間が10時間の遠出ではデータが9,000ポイントにもなります。ここはひとつ思い切って毎分1ポイントにスリム化してしまいましょう。

スクリプトではREXMLライブラリを使用して、分毎の重複するエレメントを削除しています。ごく短い純朴なもので、かなり遅いのですが、ちゃんと処理してくれます。手元のデータをスリム化した例では、10,000ポイントを少し越えるものを1,000ポイント以下まで削ってくれました。ここまで削る必要はありませんが、まあ今時スリムにこしたことはないでしょう。遅さは驚く程です。3〜4分はかかるのを覚悟して動かします。そう頻繁に使うものではないし、短時間で簡単に書けるスクリプトの方がありがたいといういつもの発想です。

point_reducer.rbのfile_nameに編集対象ファイル名を指定した上で、
$ ./point_reducer.rb | sed '/^ *$/d' > OUT.gpx

delete_elementした結果の空白行をsedを通して削っています。簡単なのがなにより。結果はOUT.gpxにリダイレクトしています。

上記をまとめたあと、思いたってperlでも挑戦してみた。XMLモジュールは用いずに、高校生のように素朴にパターンマッチで処理した。別にperlに慣れているわけでもないのでね。上記と同様に毎分1ポイントにスリム化し、Rubyの動作確認に使用したのと同一の10,000ポイントを越えるデータを処理してみたところ、処理に要した時間は驚きのもの。timeコマンドの出力で0m0.093s。あまりに速いので、気づかない手抜かりでもしているのではないかと心配で、Rubyでやったものと比較してみると、Byte数・行数は同一。これで安心と思いつつも、念押しのdiff。無論同一となるとの予想に反し行数と同じくらいの数のズレを指摘された。いやあ、ミスしたかなとソースと目で比べてみると意外や意外。RubyのREXMLライブラリーを使用したものは、属性の配列順序がソースと異なるのだ。何か指定しなければいけなかったかなあ、ライブラリー内部ではハッシュが返す値を用いて再構成しているのかな、複雑なことをやっているのだろうなあなどと思いつつ、中心としていたtrkpt要素については全く影響がないことなのでいいことにした。今後はperlの方を使おう。

$ ./reduce_point.pl GPX.gpx > REDUCED.gpx

GPX.gpxがソースファイル名、REDUCED.gpxが出力先ファイル名。

[追記 2012-08-14]: 上記perlスクリプトについて、timeタグのフォーマットが異なるロガーがあることに気づいたので、16行目の正規表現に手を加えた。

Xcode-4.3.2のCommand Line Tools 4月19日, 2012


Xcodeをupdateして4.3.2となった。gemに必要なので、Command Line ToolsをXcodeのPreferences>Downloads>Componentsからインストールしようとしても、Checksum Errorで失敗する。これは僕の環境で起こるだけなのだろうか。ここで得るファイルにミスがあるせいではないのか。このエラーは、discussionsjapan.apple.comには何の情報も無いが、discussions.apple.comにはかなりの情報があるのだけど。とにかくそれに従って上の方法を捨て、直接Developer ConnectionからLate March 2012を手動でダウンロード。このファイルはOKだった。いったいどういうことなのだろうか。不思議だ。

FlushとSafari 4月17日, 2012


Lion になって起動できなくなったClassic・PowerPCのアプリケーションやフレームワークなどを一掃した。これまでのメジャーアップデートの時、まっさらインストールをしてこなかったのでね。それもあり、動作確認のためにConsole.appを動かし"すべてのメッセージ"をながめることが多くなって気づいた点を2つ。

最も気になる点は、Flush Playerプラグインに関連してkernelが吐くエラー。

kernel [0] : IOSurface: buffer allocation size is zero

このプラグインを外せば出なくなることで因果関係は確かめられるが、かなりログを消費している。この件は ここ に最新のまとめがある。Safariと同じくWebkitを使用するChromeでも同様の警告が出るが、GeckoのFirefoxでは出ない。どうやらWebkitとFlushとの連動にそもそもの原因があるようだ。これを開発に当たっている人たちは充分承知しているだろうに、なぜ解決しないのだろうか、不思議だ。対処方法は、プラグインを外す以外にない(だろう、多分)。

実は、さらにログを浪費しているのは、32bitアプリケーションが動く際に出る警告。試しにConsole.appを32bitモードで起動すると、

Console: Warning – conversion from 64 bit to 32 bit integral value requested within NSPortCoder, but the 64 bit value 9223372036854775807 cannot be represented by a 32 bit value

これはわがMacBookProが初期のもので(MA609J/A)、64bitのcpuを載せていながら、EFIが32bitであるため中途半端な状態で動いているためかもしれない。しかし、愛用のCotEditorなど、毎秒20行以上もこれが出力されたりするのだからひどい。syslogのレベルを変更して出力を押さえたりもしてはいるものの、警告を発して無駄に動いていること自身はどうしようもなく気分が良くない。元々が速くはないマシンなので、何とかならないものか。困った。こちらの対処方法は、見なかったことにして無視するか、グチを言う以外に無い。

[追記 2012-04-19]: CotEditorやMacJournalなどの常用アプリケーションでconversionの警告が大量に出る原因を勘違いしていた。このwarningの原因は、AquaSKKにあるようだ。性に合うので気に入って長らく使ってきていて、他のwindowsなマシンやことえりなMacに向かった時でも、反射的にスペースキーやqキーを押してしまうほど。Lionに上げた後も、これが無事に動くので喜んでいたのも束の間、警告の固まりとなってしまった。途方に暮れてしまうよ。

Finderのプレビュー欄の日本語文字列 4月12日, 2012


遅まきながら Lion にした。ほとんどの主要なアプリケーションに問題はなかったが、楽譜清書の Sibelius4 はやはり古かった。Updateせずに満足して使っていたのに Lion には非対応。結構な出費と相当なダウンロード時間で(サウンドデータが30GB以上もある)、何とか Sibelius7 に生まれ変わった。よしよし。

あれこれいじっている中で気づいたことを1点だけ。それは、ファインダー/ Finder をカラム表示にした時のプレビュー欄に関して。ファイルを選択すると、ファイルの名前・種類・サイズ・作成日・その他の情報とともにアイコンが表示されるのだけど、 Lion では、テキストファイルについては内容そのものが読み易いサイズのフォントで、しかもスクロールバー付きで表示されるようになった。内容を手軽に見ることができ、クイックルック/ QuickLook する必要もない。ちょっと大きなファイルでは表示可能量に制限があるようだが、必要なら"ちょん"とスペースキーを押せばテキストの全体が表示されるのだし問題ない。

Desktop にメモを散らしているので、それらをざっと見渡す場合などにとても便利。ただ、必要があって ruby のソースを開こうとして気づいた。ファイルに書き込んである日本語文字列が化ける。

スクリプトの多くには、作成時の意図や使用法の要点などをメモしているのでこれが読めれば更に便利なのに。UTI(Uniform Type Identifier)のpublic.plain-text(Text.qlgenerator)ではOKなのに、その下位のpublic.source-codeで文字が化けるわけだから、SourceCode.qlgeneratorが使用するEncodingに関連するように思える。解決にはちょと時間が必要かな。当面の逃げは単純にソースコードの表示加工を止めてしまえばいいか。

/Developer/Applications/Xcode.app/Contents/Library/
     QuickLook/SourceCode.qlgenerator の名前を変更し、
$ qlmanage -r

〜SourceCode.qlgeneratorBK にしておく。プログラム用のソースコードに相応したカラーリングが行なわれなくなるし、logにエラーが残るが、得られるものの方が大きい。カラーリングだけならQLColorCode.qlgeneratorもあるのだけれど…。まあ当面これで充分としよう。Xcodeなどで色を付けたくなったら上の " BK "を削るだけだし。

なお、日本語表示に使用されるフォントの種類やサイズを変更する簡単な方法については、 こちら に説明されています(別サイトに飛びます)。

[追記 2012-04-16]: syslogに次のエラーが数多く記録されるようになる。

quicklookd:
Can’t get plugin bundle info at file://localhost/Developer/Applications/Xcode.app/Contents/
Library/QuickLook/SourceCode.qlgenerator

これが気になる場合は、

/System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/ LaunchServices.framework/Versions/A/Support/lsregister -f /Developer/ Applications/Xcode.app

まるでおまじないだね( Source )。

カンパニョーロFDの調整 12月27日, 2011


カンパニョーロ(Campagnolo)のフロント・ディレイラー(FD)の調整を、2011テクニカルマニュアル(英文版、 参照 )記載の方法でやってみました。以下は、その方法が何となく直感的なやり方と違う気がしたため、自分用に後日のメモとしてまとめたものです。FDのフレームへの取り付けやワイヤ張りについては触れていません。それらの作業が適切に行なわれたものとして、その後の調整についてのみです。既にマニュアルをご覧の方には特に参考になる事項は無いと思いますが、ご存知でない方は手間がかかって結構楽しめますよ。

■まず、インナー側のクリアランス調整です。
・ワイヤはかけません。
・インナー・ローにします。
・上側の調整ボルト(Internal travel limit screw)で、チェーンとガイトプレートのケージ内側左側面との隙間を隙間ゲージなどで0.5mmに調整します。

■ワイヤを留めます。
・ワイヤのアジャスターは、後の調整で締める方向(ガイドプレートを外に押し出す方向です)にまわすため、テンションが一番緩い状態にしておきます。
・たるまないようにワイヤを引っぱり、ボルトの左下にある突起の左側を通して留めます。

※ボルトを締める力を"5 Nm(44 in.lbs)"でとマニュアルには記載されていますが、普通に手で強めに締めました。ワイヤを引く力は、私にとっては"強め"程度がgoodでした。ペンチなどであまり強く引いてしまうと、以下の手順が実行できません。マニュアルには、"Set the cable by pulling the cable moderately."と表現されています。この"moderately"が職人風です。また、このワイヤを留める作業を繰り返す可能性がありますので、"ワイヤを大切に"。傷がついてしまう可能性があります。

■アウター側のクリアランス調整です。
・インナー・ローのままです。
・シフトレバーを3クリックします(なんともユニーク)。
・アジャスターでワイヤのテンションを調整し、チェーンがガイドプレートのケージ内側左側面をスレスレにかすめるように調整します(最大0.5mm)。
・下側の調節ボルト(External travel limit screw)をまわして調整します。

※この部分は、この通りにはとてもいきそうもありません。マニュアルは、

4.3.2 UPPER POSITION
1) Leaving the chain on the biggest sprocket of the cassette, shift operating the shift lever FOR 3 CLICKS.
2) Adjust the tension of the cable with the adjuster so that the inside face of the derailleur cage just skims the chain(0.5mm max).
3) Adjust the external travel limit screw to bring it flush.
*図版参照の注は省略しました。

と表現しているのですけどね。この"2)"がくせものです。

私の手順では、
・インナー・ローから、シフトレバーをゆっくり3クリックします。
・下側の調節ボルト(External travel limit screw)をまわして、アウターにチェーンがかかる位置までガイドプレートが移動する位置を探します。

  • - OKなら、ボルトはその位置で、シフトレバーを戻し、3クリック。
  • - NGなら、やり直しです。たぶん最初は、チェーンにかかる距離まで移動しないのではないでしょうか。その場合、ワイヤのテンションが弱すぎました。シフトレバーを完全に戻し、上記「ワイヤを留めます」に戻り(アジャスターを戻すのを忘れずに)、引く力を前より強くして留めた上、再度3クリックし、下調節ボルト調整の手順です。また、もし下調節ボルトをまわしてもガイドプレートが動かないようなら、ワイヤのテンションが強すぎました。弱めて再度「ワイヤを留めます」からやり直しです。

・チェーンがアウターにかかりましたね。チェーンとガイドプレートのケージ内側左側面をスレスレにかすめる(最大0.5mm)ように、アジャスターでワイヤのテンションを調節しつつ、下調節ボルトを微調整します。テンションについては、ガチガチ当たるようなら強めますし、0.5mm以上の隙間があるようなら弱めます。

■完成
この手順で調整してみた所、インナー・トップ付近ではごく軽くあたるのですが、タスキですし、マニュアルにも次のようにあるので、良いことにしました。

ATTENTION!
Check that the operation of all the speeds is perfect. When riding the bike do not use the sprocket/chainring combinations at the opposite extremes as they could cause excessive noise, wear and the breakage of the components themselves.

Ritchie氏の訃報を聞いて 10月14日, 2011


"カーニハン&リッチ"のリッチ氏が数日前に亡くなったとのこと。Source

新聞やTVのニュースで、どこかでは伝えているのかもしれないが、少くとも私の見ている時間には全く触れないのが大変意外に思える。最近の活躍ぶりについては門外漢ではあるが、今使っているMacもUNIXで動いているし、世界中のコンピュータのどれくらいがその恩恵を受けたのだろうか。私自身も本でもCそのものでも、大変楽しませてもらった。少々大袈裟かもしれないが、わが人生を豊かにしてくれたと思う。ご冥福をお祈りする。

Cyberduck-402不可視ファイルの表示 6月6日, 2011


環境設定や表示メニューの設定で、不可視ファイル(ドットファイル, dotfile)を表示するように設定しても見えない場合の対処を以前まとめましたが、その後のupdateに伴ないプロパティー名が変更されたようなので再々度書きます。

ターミナルから

$defaults write ch.sudo.cyberduck ftp.command.stat false
$defaults write ch.sudo.cyberduck ftp.command.mlsd false

と入力する。私が使用しているサーバーの中には、相性がよくないためかCyberduckのデフォルトの状態ではうまく機能しないものが混じっています。上記は、Cyberduckがサーバーからファイルリストを得るのに発行するコマンドの順序(STAT→MLSD→LIST -a→LIST)を修正して、"LIST -a"に固定するものです。 Source

「並轡」は何を並べるのか 3月11日, 2011


以前、名大出版会『平生釟三郎自伝』について書かれた文章を読んでいて気になる記述に出会ったことを思い出した。自伝原文は、「今や、我国は、世界的舞台に出で、欧米に於ても富強国と轡を連べて馳騁するの境涯に立てり。」となっていて、「轡」に「タヅナ」とルビが附いているそうだ。筆者は、このルビを「クツワ」とすべきで、「くつわは馬の口にかませるもので、それをならべるから、馬がせりあいつつ前進する意になるのだ」と述べていた。この方は中国文学者で、私も秘かにファンの一人なので意外だった。

何が意外だったかというと、確かにこの字の訓は「クツワ」が普通であろう。『和名抄』にも、「轡 兼名苑云轡音秘、訓久豆和、都良俗云久都和」とあり、『日本国語大辞典』でも、「1 くつわ。(馬の)口の中に入れる嚙(はみ)と面懸(おもがい)にとりつける立聞(たちぎき)につづく鏡(かがみ)、手綱をつける承鞚(みずつき)から成り、鉄または銅でつくられる。鏡の形状により、…などの種類がある。2 おもがい。3 手綱。4 紋所の名。…」とあることにも表れている。(4の紋所は、鏡の意匠によるもの。)

しかし、「轡」は必ずしも「馬の口にかませるもの」を意味するわけではない。『礼記』曲礼上には、「執策分轡…」(<着衣のゴミをはたき落とした上で、馬車の右側から身をかがめて御者席に着き>鞭を手にとり、手綱を左右の手に整えて持ち…)と御者の作法を説明する表現があり、「轡」は「手綱」を意味している。『史記』『漢書』には、「按轡」「結轡」「執轡」「攬轡」「奉轡」などが見える。「並轡」は無い。『文選』にも「並轡」は無いが、「轡」は53例見え、ほとんど全てが明らかに「手綱」の意味である。「轡」は「手綱」。これが典型に思える。『大漢和辞典』がこの字を「一 馬の銜にとりつけて馬を制馭するつな。二 くつわ。」と説明しているのも、第一義が「手綱」であることを反映しているものに思える。つまり、「轡」は、漢文脈で用いられる場合は、むしろ「手綱」を意味するものが多いはずだ。冒頭の「轡を連べて」に附けられたルビは間違いとは言えないように思える。

また、「並轡」という表現を探すと、『人物志』・杜甫詩(「酒酣並轡金鞭垂」)に1例ずつあるものの、宋代以降に用例の多い語彙のようで、『佩文韻府』は、『人物志』・『事文類聚』・杜甫詩・蘇軾詩・楊万里詩・范成大詩を挙げている。他にも『唐詩紀事』や『旧唐書』、『三国志演義』などに例が拾える。それらは、「手綱を並べる」意味であることを明瞭に示しているとは言いがたいが、「轡」の第一義が「手綱」であり、馬の口中に噛ませるものを特定して言う場合には「銜」とすることが多いことを考慮すると、「手綱を並べる」ことから「並んで馬などを進める」意味を生んでいると考えるのが自然であろう。

上記の『事文類聚』・『唐詩紀事』の用例は、「遂に轡を並べて詩を論ず」という句で、「推敲」故事中のよく知られた表現。

賈島赴挙至京、騎驢賦詩、得「僧推月下門」之句。欲改推作敲。引手作推敲之勢未決。 不覚衝大尹韓愈。乃具言。愈曰、「敲字佳矣。」遂並轡論詩久之。(『唐詩紀事』)

最後の句は「そのまま並んで進み、しばらく詩作をめぐって意見を交換した」となる。高等学校の漢文教科書では、誤解を避けようと、「轡」字に読み仮名を「ひ」と附け、語注に「手綱」と記している表現だ。(追記2012-03-26:賈島の故事では、韓愈の乗った馬車と賈島のまたがった驢馬とを並べて進んだものと推測されます。そのことを考慮すると、「並んで馬を進め」としていた表現が不適当であることに気づいたので、表現を修正しました。)

意味にズレがある字といえば、「楓」を思い出しますね。「月落烏啼霜満天 江楓漁火対愁眠」や「停車坐愛楓林晩 霜葉紅於二月花」などの句で知られる「楓」はフウであって、サンカクバフウ(タイワンフウ)・モミジバフウ(アメリカフウ)などをいい、「カエデ」とは異なる植物。しかし、訓は「カエデ」が通用している。フウは葉が互生(互い違いに1節に1枚の葉)し、カエデは対生(1節に2枚の葉)する。街路樹に多く、東京なら駒沢通りの街路樹がフウで、バスからでも確認できる。日本と中国古典で意味にズレがある漢字はこの他にも多い。

[追記 2015-09-03]: フウとカエデの相違点を誤解していたことに気づいたので、末尾部分を修正した。

中国古典で出現頻度の高い文字 2月9日, 2011


漢文で最もよく使われる漢字は何でしょう。漢文語彙中の頻出語となると難しそうですが、よく現れる「文字」なら簡単に確かめられそうです。

少し事柄を絞って、史伝の文章の代表である『史記』を例にとってみます。紀元前1世紀の前漢・武帝の時代に書かれたこの本は、それ以前の文章から借りた文が多いとは言っても、かなりの部分が司馬談・司馬遷の目と手を通過した文字で埋まっています。そこには、総字数を「52万6千5百字」と記しているわけですが、そのように記した詳細な事情は知りません。また、どのようにしてこの数字を数えたのかも知りません。竹簡の枚数から積算したのでしょうか。とにかく、まずは手始めにこの約53万字の中で、出現頻度が最も高い文字を数えてみました。

テキストは色々ありますが、グーテンベルク(Gutenberg)のものが便利。「表」のテキストは省略されていますが、50万字を越えるものなのですから、大勢にそう大きな差異はないでしょう。簡単に サイト からもらえます。案外なことに、筆者が精魂傾けた本文は、ファイルサイズで言えば2MBほど。ごく小さな容量の外部メモリーにでも入ります。私は、普段利用するわけでもないのですが、iPod touchにお守りのように入れています。大幅縮刷の会注考証本史記でもポケットやカバンになどとても入らないことを考えると、ちょっと感無量です。

数える際に除外したのは、冒頭と末尾の半角英数字(改行文字も)、全角の句読点・括弧類・スペース・その他記号類です。延べ文字数(総文字数)は、512,724字ありました。異なり文字数では、4,779字あります。(追記2011-12-21:この数字はグーテンベルクのテキストをそのまま数えたもので、以下もそれに従っています。ただ、少なくとも『史記』について見る限り、「呂不韋列伝」が二重に入力されていること、「刺客列伝」が落ちていることに気づきました。そのため、この数字はあくまで参考程度にすべきであって正確なものではありません。以下に扱う他のテキストについても同様で、あくまでグーテンベルクのものを数えたにすぎないことにご注意ください。)

この数字が『史記』中に挙げられる文字数より少ないことは無視することにして、さて、出現頻度が高い文字は…。

「之」:13,446回(2.62%)、「王」:8,255回(1.61%)、「不」:7,907回(1.54%)、
「以」: 7,473回(1.46%)、「為」:7,377回(1.44%)、「子」:6,566回(1.28%)、…

でした。括弧中のパーセントで示す数字は、出現率を示します(頻度を総字数で割りました)。上位100字の出現率合計は46.7%で、数字の上では、『史記』の半分近くは100字からなっているとも言えそうです。
同じくGutenbergの『漢書』(713,882字、異なり字数は4,923字)もやってみると、

「之」:15,889回(2.23%)、「以」:10,679回(1.50%)、「為」:10,423回(1.46%)、
「不」: 9,924回(1.39%)、「王」: 6,721回(0.94%)、…

でした(上位100字の出現率合計は、41.7%)。

中国の歴史の文章を考えた時、最も頻度が高いのは「之」で間違いないようです。『左伝』でも180,494字中7,287回(4.04%)、『国語』でも3,275(4.65%)です。史伝以外も試してみると、例えば『論語』では「子・曰」が多いのは予想の通りとしても、それらに次いだ3番目が「之」で、16,001字中の613回(3.83%)となっています(他は省略しますが、この情況は変わらないようです)。また、実詞では下表の第6位以降も含めると「王」の頻度が高く、「子」「其」「人」「天」などが目立ちます(ある種予想通りでした)。国名の出現率等からは、時代背景が読み取れるのですが、当然の結果とも言えますので詳細は省略します。自然言語処理からはほど遠い、中国古典によく現れる文字の「観光旅行」めいたものとなってしまいましたが、中国古典の風景の一端はまあ窺えます。「趣味の中国古典散策」としては、まずまず遊べました。

使用したスクリプトは、ありきたりのものです。 countK.pl は延べ文字数・異なり文字数を表示します。 freq.pl は、頻度31以上の文字を表示します。エンコーディング処理などあれこれ不徹底ですので、Macでないと私の期待するようには動かないでしょう。例によって、自分の目の前で自分用に動けばよい、というのがモットーですので(追記2011-12-21:スクリプトに入力ミスがあるのに気づき訂正しました)。Gutenbergを使えばかなり遊べることは確か。大プロジェクトですね。

Chromeとiframe & window.open with Hash(#) 1月22日, 2011


Safariを使っているので気づかなかったけど、Google Chromeを使うと起こる不思議な違いに出くわした。inline frame中からポップアップwindowを開くのに、

function test_open(url) {
  window.open(url, "popup", "width=300, height=30");  
}
-----
<a href="testData1.html#flg" target="popup"
 onclick="test_open(this);return false;">吾輩は猫であるN</a>

こんな形で呼ぶ時、Chromeでは、flg=flg1が普通に成功するように見えるのに、それ以外は探し損なう。これはSafariの動作とは異なる。

なぜだろう。理解できるまでは当面下記でしのぐか、2度開くのはちょっと無様だけど。

function test_open(url, position) {
  var win = window.open(url, "popup", "width=300, height=30");
  url += position;
  win.open(url, "popup");
}

[追記 2012-12-30]: 以前のバージョンでは2度開きでしのげていたので気づかずにいたが、久しぶりにチェックしたところ、Chrome-23.0.1271.101ではこの逃げもきかないようになっていた。同期に関連する問題だろう。Chromeは使っていないからいいことにしようと思いつつ、一応の手当はしておこう。親でハッシュタグをグローバル変数(下記ではshowme)に置いて、子からwindow.onloadで読むことにした。動作が不安定なのでsetTimeoutしている。

function init() {
    location.hash = ''; //何故か不可欠のこともあり不安定
    location.hash = opener.showme;
}
// window.onload = init; //何故かNGのこともあり不安定
window.onload = setTimeout(init, 100);

不安定だが、これが本来の手順に近いだろうししょうがない、ということでこんな風…

[再度追記 2013-01-05]: 「しょうがない」という中途半端な上の方法は止めた。ちょっと大きなページを読み込むと、ハッシュタグを探すのに成功したり失敗したりと動作が不安定になる。もうこの方法はあきらめ、タグ位置からの表示したいIDブロックを切り抜いてbodyと入れ替えよう。自分の環境では、Chromeへの対応としては、ポップアップを無くさない限りこれが最善のようだ。呼ばれる側で下記のように自分のbodyを書き換える。sliceしているのは、’#’がついてくる状況なので削っているもの。Safari, Chrome, Firefox, Operaで動作OKを確認した。

function init(){
      document.body.innerHTML =
           document.getElementById(opener.showme.slice(1)).innerHTML;
}
window.onload = init;



ページを再構成 1月12日, 2011


移設しました。この機会に再構成。中身が同じなので、それ程変った感じはしませんが、でもWebbyの活用度からすると、雲泥です。

それと、JavaScriptも少し追加したので、止めていらっしゃると私の想定した画面にはなりません。残念です。チェックをかけるところかもしれませんが、まあ文字そのものは出るし、支障が無いとも言えますので。

MTのデフォルト日付書式の変更 01月03日, 2011


このところ必要があって久しぶりにMovable Typeをいじらなければならなくなって困りました。以前のバージョンでは、システムの日付書式を設定する箇所があったように覚えているのですが、違ったかなあ。システムをアップデートしたら、ポスト日付等のフォーマットが使用言語によって自動で設定され、それが"2011年1月1日"のような形式となっていて、この書式はどうもNGなのです。変更するには個別のシステム・テンプレートを一つひとつ変更しなければならないようで、エレガントではないなあ。

バージョンは5.04です。探してみると、lib/MT/Util.pmに

line:1512-
"%Y年%b月%e日 %H:%M",
"%Y年%b月%e日",
"%Y年%b月",
"%b月%e日",

とあります。これを変えればいいのだ。

"%Y/%m/%d %H%M",
"%Y/%m/%d",
"%Y年%m月",
"%m月%d日",

これならまあよいか。再構築してみたところ、これでOKでした。ただ、今後のバージョンアップでは要注意かと。

オーボエマスタークラス 11月16日, 2010


昨日の夕方、 小雨が降っていてやや気を削がれつつ、フランク・ローゼンワイン(Frank Rosenwein,クリーブランドPhil.首席)のマスタークラスを聴講にでかけた。主眼は、"アンサンブル・フロッグス"(ネムさんたちアメリカンなオーボエ3人グループ)を聞きに行くことだった。何で “Frogs” なんだ? リードを銜えた口の周りが “蛙” なのか? きっとそうだな。とにかく、ちょっと遅れて入ったマスタークラスがなかなか面白かった。Kb.菊池さんとも会場で一緖になり、オーボエの公開レッスンにフルート学習者かいといったちょっと自虐的場違い感もかなり薄れた。感想の一つは、プロ音楽家のたまごたちでも、示された直すべき目標がその場ですぐ修正できるわけではないようなのに改めてホッとしたこと。聞いているだけの人間が、そんなことを言うのは失礼かな。

〔収穫いくつか〕

  1. 常に、音がどこに向かうのか、どの音に帰結させるのかを意識すること
  2. 一つ一つの音符は、表現に関わるもの装飾に関わるものなど、その性格が異なること
  3. 音符には延び縮みがあること
  4. たとえ p と書いてあっても、音楽の本質は 表現する ことなのだから、その中には自然な cresdecres があって当然であること

どれも音楽の基本だよと、自分を棚に上げて偉そうに思い出す自分に気づき、でもできないんだよなあと再確認。それに、表現は違うけどどれも菅原先生が普段教えてくださっていることと同じだな。生徒の演奏の欠点を強調して吹いてみせた上で、目標とすべき演奏を聞かせるのを目の当たりにし、再度"楽器を演奏すること"についてじかに感じることはできたように思う。(やはり、頭ではわかっても実際にはできないのだけどね。)

次の日曜が、我が先生のレッスン生たちの発表会。Damaseを吹くのだけど、相変わらずできずにいる箇所sはともかく、できるはずの音符は思うように吹けたらいいなあ。と、願うだけではだめか。さあ、練習、練習。

MySQLとrubyでログブック 04月20日, 2010


HyperCardで作成していたLogBookのデータを、MySQL, Rubyに乗せ換えることにしました。HyperScriptは直感的に使えて大変好きだったのですが、今は部屋の隅に積み重ねてある古いiBookでしか動きません。SuperCardという選択肢もあるのですが、どうもねえ。画面は、これも以前見た目が気にいっていた"MyPDB"から借用することにしました。ただ、原著作者を知りません。本来なら表示すべきでしょうが、Netを探しても別物のMyPDBしか見当たらず、今は明記していません。PHPからMySQLにアクセスするしゃれたプログラムですが、PHPは構造が見えにくいように感じていて、どうも好みではなかったので、見た目は好きだと思いつつあまり活用せずに持っていたものです。今回、webby,rubyで全体を再構成しました。

MySQLのインストールが事前に必要ですが、その記事はNetにあふれていますし、設定済みの方も多いと思いますので省きます。また、create databaseなどの手動によるセットアップが必要です。前提としている環境は、Macのみで、具体的には次の通りです。他の環境では試していません。
・MySQL-5.1.44(インストールが必要)
・ruby-1.8.7(システム既存)
・Safari-4.0.5

ファイルアーカイブはWebby用のソースとrubyのcgiスクリプトです。再構成するにはWebbyが必要です。しかし、このままの形で、outputディレクトリのファイルとcgiスクリプトをhttpd.confに合わせて置けばWebby無しでも起動できます。(Apacheの設定は、他に情報が多いことでもあり詳細を省略します。) MySQLへのアカウントは"_mydef.ini"に設定します。

MySQLのDB名は"logbook"、TABLE名は"list"としていて、その構成は次の通りです。

相手コールサイン 名前 QSO日付 交信周波数 交信モード QSL送付日 QSL受領日 備考
call_sign name qso_date frq mode send_qsl rcvd_qsl notes
mysql> create database logbook default charset utf8;
mysql> use logbook;
mysql> create table list (
    code int unsigned not null auto_increment primary key,
    call_sign varchar(20),
    name varchar(20),
    qso_date date,
    frq char(3),
    mode char(3),
    send_qsl date, 
    rcvd_qsl date,
    notes tinytext
    ) default charset utf8;

HyperCardから書き出したタブ区切りテキストを、
mysql> load data infile "LogData.txt" into table list (call_sign,name,qso_date,frq,mode,send_qsl,rcvd_qsl,notes);
などでデータベースに読みこみ、Safariからhttp://localhost/logbookなどとして開きます。(このURLは、httpd.confの設定により変わります。)

logbookアーカイブ

魔方陣の枝刈りのこと 04月13日, 2010


ダン・ブラウン「ロスト・シンボル」に4x4の魔方陣の話がでてきます。まだ読んでいない方もあるでしょうが、謎解きに関わる事柄とは違うので、ネタバレでもないでしょうからかまわず書きますと、デューラーの版画に見えている魔方陣なのです。縱、横、ななめ、四隅、各隅4桝、中央4桝の合計が一致する魔方陣です。「不可能とも思える」魔方陣に驚嘆し興奮するラングドンとキャサリンの様子を読んだ時、これはそれほど難しい魔方陣なのだろうか、と思ったことが発端です。

別解を探してみることにしました。rubyやperlでも組めるでしょうが、こんな場合は、LISPのカッコだらけの記述は、どうも好みではないので、やはりprologに味があります。適当に述語を並べた時にパッと動き出す爽快感は、力技で多重ループをやっと抜け出すのとは全然違います。

最初は、permutationで探索するありふれた方法を試したのですが、残念なことに終了しません。チェックする枝が多すぎて、私のMacBookでは力が足りないのです。単純に計算すれば、20兆もあるので、力不足を嘆いても無理というもの。そこでNet上ではあまり見かけない枝刈りを工夫してみました。prologは、GNUのprolog-1.3.2を用い、ローカルな述語はほとんどありませんが、解を数えるのにglobal変数を利用しています。リスト中のsequentialは、自然数の並びを得る(1,2,3…)もので、16個の数字入力をさぼっただけです。deletesは、deleteを利用してリスト中の要素を別リストから削除します。これが枝刈りの根幹部分でしょう。permutationの代わりにcombinationで4桁ずつ題意に合うリストを発生させています。さて、「ロスト・シンボル」の主旨に従って下段の中2桝を(15,14)と指定した上で解を得ると、29秒後に解答は16個もあり、本に登場するのは12番目の解でした。以外に多い。満足、満足。

deletes(X, [], X).
deletes(L, [H|Ls], X) :-
    delete(L, H, X1),
    deletes(X1, Ls, X).

combination(0, _, []).
combination(N, [X | Xs], [X | Zs]) :-
    N > 0, N1 is N - 1, combination(N1, Xs, Zs).
combination(N, [_ | Xs], Zs) :- N > 0, combination(N, Xs, Zs).

sequential(I, N, []):- I > N.
sequential(I, N, [I|L1]):-
    I =< N, I1 is I + 1,
    sequential(I1, N, L1).

dan.pl

gprolog-1.3.2のconfigure 04月10日, 2010


Prologとしては、昔のProlog KABAが懐しく、MacBookにはB-Prologを入れていました。
ルービック・キューブの変形の2×3のキューブを解こうと思いたって、いじり始めて、GNUのprologがあることを知り、gprolog-1.3.1をconfigureしてみたのですが、foreign.wamでアセンブラからのエラーが止められません。

Netでこのエラーがソースのバグによるもので、2009年11月20日の開発途中バージョンでは修正されているとのコメントを読み(Source)、2010年3月の最新不安定版1.3.2をconfigureしました。OKでした。

$ wget http://gprolog.univ-paris1.fr/unstable/gprolog-20100322.tgz
$ CFLAGS="-arch i386 -DHAVE_CONFIG_H" \
    LDFLAGS="-dynamic -L/usr/lib -lm" ./configure
$ make; make check; sudo make install

tree.rb 03月25日, 2010


懐しのtree.cをRubyで組んでみたのですが、ちょっと長いなあ。ディレクトリツリーだけでは面白くないので、ディレクトリサイズ・ファイルサイズも表示し、サイズは`ls -l`の出力にならってバイト単位にしました。もっと短かくできるかと思ったのですが、長いスクリプトになってしまいました。ファイルのタイムスタンプやモードを表示したり、オプションスイッチも指定できるようにしたり、まだまだ遊ぶ余地はたくさんありますが、保留のまま。’- d’とすればディレクトリだけを表示するのもいいなあ。

$ tree contrib/
/Users/manontanto/contrib
|---   3681:---
|---   1586:htaccess
|---   1568:smokey.sample.conf
|---    425:README
|---    102:packaging
      |---     136:---
      |---     136:Quadra
            |---    6503:---
            |---    6276:xyzQdcba.spec
            |---     227:xyzQdcba.conf

こんな表示です。"3681:—-“など”—-"が続く数字は、ディレクトリ内ファイルサイズの合計です。

tree.rb

パッケージのuninstall 03月22日, 2010


パッケージがインストールしたファイルを全て削除したくなった時、あなたならどうします?
uninstallerが含まれていれば苦労も無いのですが。/usr/local/binから除くのはいいとしても、関連するライブラリやmanを中心としたドキュメント、フレームワーク等散っているあれこれをきれいに削除したい場合は途方にくれてしまいます。こんな場合のことを、ネットを探して見つけました。まず、再度インストーラ・パッケージを入手した上で、

$ xar -xf PACKAGE名.pkg
$ lsbom PACKAGE名.pkg/Bom > FILE_LIST

とすると、ファイルの一覧を得られます。後は手作業で削除していくなり、スクリプトを組んでザッと消すなりきれいさっぱり。爽やかな気分になれます。 Source
追記: スクリプトを組むまでもないのに気づきました。 "for x in `cat FILE_LIST`; do [ -f $x ] && rm $x;done" でいけますかね。手短かにパイプでも処理できますが、削除なのでね。また、sudoが必要な場合が多いでしょうから、直前にsudo lsとかしておいてsudo rmするかな。

MySQL-5.1.44のmysql_client_testにfailure 03月08日, 2010


しばらくMySQLを上げていなかったので、久しぶりにupdateしました。

CC=gcc CFLAGS="-O3 -fno-omit-frame-pointer"  \
CXX=gcc CXXFLAGS="-O3 -fno-omit-frame-pointer -felide-constructors \
   -fno-exceptions-fno-rtti" \
   ./configure --prefix=/usr/local/mysql-5.1.44 --with-charset=utf8 \
   --with-collation=utf8_general_ci --enable-thread-safe-client \
   --with-client-ldflags=-all-static --with-mysqld-ldflags=-all-static \
   --localstatedir=/usr/local/mysql-5.1.44/data --enable-local-infile \
   --with-readline

ところが、 make test するとすぐに mysql_client_test でfailureになります。前回のコンパイル(5.0.51a)では難無く通過した所です。どうやら with-charset=utf8 がいけないようで with-extra-charsets=complex と入れ替えることで長時間(30分くらい)のtestすべてを無事通過しました。やれやれ。
Source

Webbyでページを組み立て直しました 02月11日, 2010


Textile, RedClothの記法が便利。発端は、 MacRuby » Home に寄った時に、そのページのできに感心したからです。installしてみると、見た目以上に魅力的な要素がたくさんありそうで、しばらくこれで遊べそうです。

AquaSKK-4.0の変換後文字列末尾の削除 09月27日, 2009


AquaSKKを大変便利に利用させてもらっています。単漢字を入力する機会が多く、例えば「苟」字が必要だと、「▽いやしくも」から「▼苟も」を得て「Ctrl+H」するような使い方をしてきたのですが、最近のversion upでこのControl+Hの挙動が変更になり、末尾1文字の削除ができなくなってしまいました。しばらくは「Fun Input Toy」で単漢字入力してしのいできたのですが、モードの移動がやや面倒。AquaSKKの新しい設定ファイルを見ているうちに、以下の方法で可能なことに気がつきました。

~/Library/Application\ Support/AquaSKK/keymap.conf を以下のように修正します。

-SKK_ENTER group::hex::0×03,0×0a,0×0dllctrl::m
-SKK_BACKSPACE hex::0×08llctrl::h
-PseudoHandled ctrl::lllhex::0×1b
+SKK_ENTER group::hex::0×03,0×0a,0×0dllgroup::ctrl::m,h
+SKK_BACKSPACE hex::0×08
+PseudoHandled group::ctrl::l,hllhex::0×1b

これは、「候補文字列を確定するキー」と「未処理としてアプリケーションに渡すキー」に「Ctrl+H」を追加し、「入力文字列に戻るキー」から「Ctrl+H」を除くものです。最善の方法とは思えませんが、一応これで以前とほぼ同じように使えます。以前の「skk-delete-implies-kakutei」のconfigへの設定に当る方法がわかればそちらがよりよいように思えるのですが、結びつく情報が見当たりません。

Cyberduck-3.3.b2 不可視ファイルの表示 09月22日, 2009


環境設定や表示メニューの設定で、不可視ファイル(ドットファイル, dotfile)を表示するように設定しても見えない場合の対処を以前まとめましたが、その後のupdateに伴なう変更について再度書きます。

ターミナルから

$defaults write ch.sudo.cyberduck ftp.sendStatListCommand false
$defaults write ch.sudo.cyberduck ftp.sendExtendedListCommand true
$defaults write ch.sudo.cyberduck ftp.sendMlsdCommand false

と入力する。どうも私の使用しているサーバーは、Cyberduckと相性がよくないようで、Cyberduckデフォルトの状態ではうまく機能しません。上記は、強制的にそのロジックを修正するものです。

追記:

Cyberduck-3.3.b4 が出ましたね。無事動いています。
Cyberduck-4.0.2 の動作については 別記 があります。

全角文字混在の正規表現を使った検索 05月12日, 2009


下に挙げた検索スクリプトで全角文字列を検索する場合、コマンド行からのargumentに全角文字混在の正規表現を指定したらどうなるかを試して遊んだところ、asciiが可能なのは当然としても、全角でもどうということなくパターンマッチしてくれることに感動。結構便利です。少し大き目の標準テキストの文書を検索する時など、エディターを起動せずに済みますし、正規表現で絞れる分快適です。ちょうどegrep -r の表示カスタマイズ版のようなものとして動きます。

検索語は、シェルの解釈がじゃまになるので、シングルクオートでくくります。結構おもしろい世界なので、さらに置換にも進めて遊ぼうかと思いつつ、マッチ部分の赤字処理と表示の桁数cut処理で泥まみれになりそうな予感がして未着手です。

$ myfind public/予定表/ '^\s+.*?\d月\d\d日'

ホームページ上の文字列検索・置換 05月03日, 2009


Net上には、Linuxの類似の記事やperlをめぐる一般論をよく見かけますし、魅力的なページも数多く、大変参考になります。しかし、OS X上に限定した記事は多くはないように思え、いざ何かで実際に利用しようとすると、他のOSの暗黙の前提となっている事項が理解できずに無駄に時間を過ごしてしまいます。ここでは、Leopardの perl-5.8.8 をターミナル.appから使う環境でスクリプトと遊んでいる身として、自分用メモの意味合いを中心にポツポツと書きとめていこうと思っています。

私は、ページのタグを手で素朴に入力しているので、メニューの表現変更などで全ページにわたって同一文字列を変更しなければならない際はかなり神経を使います。
$find ./ -type f -name \*.html -exec perl -ne ' if(/$word/) {$d="$ARGV$.\n$_";print $d}' {} \;
などで修正箇所を確認した上で、
$find ./ -type f -name \*.html -exec perl -i -pe 's/$SearchWord/$ReplaceWord/' {} \;
のようにして置換することが多いのですが、毎回この長いコマンドを手入力をしなくて済むように、しかも対話型で置換のスクリプトを用意しておきたいと思いたち、perlで遊んだものが下記です。File::Findを使って、findの場合と類似の処理をしています。バッファを使用して対話の中で元ファイルを書き直すことくらいは工夫したのですが、どうもperlらしくなく、Cのプログラムのようになってしまったのが幾分残念。でもまあ当面は使えそうです。

スクリプトには [検索開始ディレクトリ( default:./ )] 検索語、置換語を argumentに与えます。マッチ箇所を赤字で表示した後、置換の選択に入り、個々の候補について置換するか次に進むかを選びます。しばらくは、起動前にデータをbackupしておいた方が安心ですね。エンコードに関わる処置が万全ではないので、私の環境でないと動かないものと思われますが、Leopardでターミナル.appから呼ぶのならこのままで普通に動作するでしょう。

ついでに検索のみのものも挙げておきます。「原型」ではマッチ行が長い場合に不便なので、「別案」は表示をちょっとだけ工夫し、検索語直前の40カラム分(全角のみなら20文字)と直後40カラム分を切り取って表示するものです。ただ、検索語に正規表現を用いた場合でマッチ部分が長い場合や、そもそも検索語自身が長い場合については切り詰められずそのままが出力されます。要するに、マッチ部前方文字列($`)と後方文字列($’)を全角・半角を判断して左へ、あるいは右へ切り詰めているだけで、マッチ部そのもの($&)は操作していないためです。これを詰めると不便でしょう、たぶん。

Cyberduck-3.1.2 不可視ファイルの表示 04月22日, 2009


環境設定や表示メニューの設定で、不可視ファイル(ドットファイル,dotfile)を表示するようにしても見えない場合の対処です。

ターミナルから

$defaults write ch.sudo.cyberduck ftp.sendStatListCommand false

と入力する。

Cyberduckは、サーバーからファイルリストを得るのに[STAT | LIST -a | LIST]のコマンドをこの順で発行するのですが、サーバーによってはうまく機能しない場合があるようです。そこで、強制的にこのロジックを修正する方法の一つが上記のものです。 Source

追記 06月01日, 2009 :Cyberduck-3.2になって、上記sourceにある動作の優先順位が変更されたようですね。changelogに、"Support for directory listings using MLSD"とあるのを「使えるようになった」だけだと誤解していました。MLSDが最優先になったのですね。私の環境では、このままではNGなので、
"defaults write ch.sudo.cyberduck ftp.sendMlsdListCommand false" と止めてしまいました。

追記 :Cyberduck-4.0.2の動作については 別記 があります。

VMWare Fusionのデーモンを止める 04月22日, 2009


普段使わないのにVMWareのデーモンが、Macを起動する度に6個も起動されるのがいやで、調べました。psで見ると、このデーモンは単純にlaunchdが起動しているようです。そのplistをいじればよさそう。

/Library/LaunchDaemons/com.vmware.launchd.vmware.plistの"RunAtLoad" keyを “true” から “false” に変更する。

ただ、この方法では、VMWareを起動したい時には、このplistを再設定した上でOSを再起動しなければなりません。私自身はめったに使わないので、これで特に不自由はないのですが、ここを修正してあることを忘れてしまいそうで、「なぜVMWareが起動しないのだろう? 壊れたかな?」と悩みそうです。ここに書きとめておけば、多分忘れることはないでしょう。

アドレスブックのデータをExcelに読み込む 11月03日, 2008


アドレスブックがエクスポートできる形式は vCardに限られています。そのため、Windowsな仲間に住所をExcelの表にして渡したいことがあると、従来は、vCard2.0に書き出して宛名職人(ver.14以前)に渡し、そこからcsvでエクスポートしたものを読み込んでいました。しかし、宛名職人がver.15となり、これまでの手順では、メモ欄や配偶者欄が捨てられてしまいます。

また、Numbersには、アドレスブックから簡単に表を作る機能があるのですが、配偶者データを読み込みません。(名前、郵便番号、住所、メモその他多くの欄は実に簡単に読み込んでくれるのですが。)

そこで、アドレスブックから書き出したvCard.vcf(ver.3.0)ファイルからメモ欄・配偶者欄も含めて必要な欄をExcelに読み込むために簡単なperlスクリプトを組んでみました。

スクリプトは、vCard.vcfの姓よみ・姓・名・姓名・自宅郵便番号・自宅住所・配偶者・メモを切り出し、stdoutに書くだけの単純なものです。(vCardの書式が変更されれば手直しが必要となりますし、当然必要と思われるさまざまな確認やエラー処理などは省略されていて、今自分の目の前で動けばよいとしているものです。)

手順:
・アドレスブックからグループのデータをvCard(vCard.vcf)に書き出す。
・スクリプトをvCardのフォルダーに置き、ターミナルから $./vcf2csv.pl | nkf -s >out.csv とする。
・Excelからこのファイルをインポートする。

nkfを使用しない場合は ShiftJisしか読まないExcelに合わせるため、 miTextBatchConv , MultiTextConverter などを使います。住所は自宅住所を見ています。勤務先住所を見るには、スクリプトの"HOME"を"WORK"に直します。両方を見るようにすることもできますね。 スクリプトは骨格のみのごく純朴なものです。もっとも、自分ではこれで実行していますが。

[追記 2013-11-20]: 連絡先.app-8.0(1365)を使い始めて、書き出しの書式が変更されたようで、スクリプトにちょっと変更を加えました。

陶淵明の「商音」について 03月25日, 2007




■はじめに

陶淵明に「荆軻を詠ず」という詩がある。

燕丹 善く士を養ひ 志は強嬴に報ゆるに在り
百夫の良を招集し 歳暮に荆卿を得たり
君子は己を知るものに死すと 剣を提げて燕京を出づ
素驥 広陌に鳴き 慷慨して我が行を送る

30句からなる五言の古体詩である。題材を『史記』刺客列伝に描かれる荆軻にもとめ、「惜しいかな剣術疎なり 奇功遂に成らず 其の人 已に没すと雖も 千載余情有り」と結ばれる。続く部分をさらに引用しよう。

雄髪 危冠を指し 猛気 長纓を衝く
飲餞す 易水の上 四座 群英を列ぬ
漸離 悲筑を撃ち 宋意 高声に唱ふ
蕭蕭として哀風逝き 淡淡として寒波生ず
商音には更流涕し 羽奏には壮士驚く
心に知る 去きて帰らざるも 且つは後世に名有らんと

知られた「易水送別」の場面である。「刺客列伝」の該当箇所も引用しておこう。

高漸離 筑を撃ち、荆軻 和して歌ひ、変徴の声を為す。士皆涙を垂れて涕泣す。又前みて歌を為りて曰はく、
「風蕭蕭として易水寒し 壮士一たび去りて復た還らず。」
と。復た羽声を為して忼慨す。士皆目を瞋らし、髪尽く上がりて冠を指す。是に於いて荆軻 車に就きて去り、終に已に顧みず。

宋意については見えないものの、「荆軻を詠ず」が刺客列伝の描写に基づいて筆が進められていることがわかる[注1]。ここで、詩中の「商音には更流涕し 羽奏には壮士驚く」は、「変徴の声を為す」、「復た羽声を為して忼慨す」に拠ったものである。五音と総称される宮・商・角・徴・羽で、「商」と「徴」は、本来別の音であるのに(「変徴」は「徴」より半音ほど低い音)、陶淵明は、なぜ「商音」と言って「変徴」と言わないのであろうか。

■「商」の用例

陶淵明の作品には五音の音名の出現は稀で、ほとんど例が無い。その中で「商」だけは上記以外に五例見られる。

  1. 「閑情賦」「悲商 林を叩ち 白雲 山に依る」
  2. 「貧士を詠ず」其三「原生は決履に納れ 清歌して商音を暢ぶ」
  3. 「辛丑の歳七月、赴仮して江陵に還らんとし、夜 塗口を行く」「商歌は吾が事に非ず 依依たるは耕に在り」
  4. 「擬古」其二「君に問ふ 今 何ぞ行くやと 商に非ず 復た戎に非ず」(戦争にでかけるわけでもなく)商ーあきないーに行くのでもない。「商」は、商売。)
  5. 「子に命ず」「御龍 夏に勤め 豕韋 商を翼く」(「商」は、「殷王朝」。)

【悲商は秋風】

1の「悲商」は、『礼記』月令、孟秋(7月)の「其の音は商、律は夷則に中たる」に依拠したものと思われる。「悲しい秋風」といったほどの意味であろう。「商」が秋の西風との関連で用いられる類似の例は、潘岳「悼亡詩」其二「清商 秋に応じて至り」、張載「七哀詩」其二「秋風 商気を吐き」などにも見られ、王逸の「楚辞」注にも、「商風は西風なり。秋気起これば則ち西風急疾なり」とある。この場合、楽音に由来するとは言え、五行思想で商が金に属し、西・秋に関わるものとの意識が強いことの表れととらえるのがよかろう。

六朝期までの「悲商」の語の一般的な使用状況を知りたいと思うが、『佩文韻府』が挙げるのは「閑情賦」のみであり、『文選』にも用例が無いため考えが及んでいない。あるいはこの語は、陶淵明が創出した語と言えるのかもしれない。

【商音は商頌】

2の「商音」は、今問題としている語であり、特に重要である。この語は、『韓詩外伝』巻1、『新序』節士篇などに残る、孔子の弟子原憲が「商頌」を歌った故事に典拠が求められる。[注2]

孔子の死後、清貧に甘んじた故事で知られる原憲を、兄弟弟子で裕福な子貢が訪ね、言った。「ああ、あなたのような立派な方が、どうしてこのように貧を病んでいらっしゃるのか」。原憲は、空を仰ぎ見て答えた。「私は聞いています、財産の無いのが貧、学問を積みながら実行できないのが病であると。私は貧しいが病んではいない」。子貢は、たじろいで恥じいり、挨拶もせず立ち去った。「原憲 乃ち徐に歩き杖を曳き、商頌を歌ふ。」(『韓氏外伝』)

この「商頌」は、『詩経』の「商頌の詩」を意味するものと考えられている。しかし、状況を考えるとどうもふさわしくない。「商頌」と言いながら『詩経』を意味しない場合があるのではないか。『韓詩外伝』、『新序』が原憲の故事の後に挙げているのが、邶風「柏舟」の詩の一部であることも、「商頌」を『詩経』商頌とはとらえていない可能性を示すものであるように思える。

「商頌」が『詩経』のそれを意味するわけではないとすると、「商頌」、「商音」はどのような意味なのか。断定できるだけの材料は無いのだが、これは「胸中の悲しみを表した歌」を意味するものと考えている。「清歌」は、「高い声で歌った」のであろうから(注3)、陶淵明のこの句は、「悲しげに甲高く声を引いて歌った」と理解するのがよいと思う。『文選』には「商音」、「商頌」の用例は無い。

【商歌は悲しい調子の歌】

3の「商歌」は、春秋時代の衛人甯戚が、斉の桓公に認めてもらいたいと考えて歌った故事を踏まえた語で、彼は企図のとおりに異能を見込まれ、その重臣となるのである。『蒙求』の「甯戚扣角」でも知られるこの故事は諸書に言及がある。本文が歌に触れているものに限っても、『蒙求』以外に、『呂氏春秋』挙難、『淮南子』道応、『新序』雑事などが挙げられ、注釈がこの歌を引くものも数えると『史記』、『文選』等々多書にわたる。参考までに、故事の要旨を『淮南子』道応に拠り挙げておこう。

甯戚は、 斉の桓公に仕官したかったが、貧しかったため伝-つて-を求めることもできず、行商して斉国にでかけ日暮れに城門の外に野宿していた。その日、桓公は郊外に客人を出迎えて城に戻ってきた。甯戚は、牛の世話をしながら車の脇に居たが、桓公がやってくるのを望み見ると、悲しげに牛の角を叩きながら早口に「商歌」した。桓公は、それを聞いて異能を認め、大夫とした。

陶淵明は、この故事を承けて「自分を売りこむための商歌は吾が関心事ではない」と表現したわけだ。ここで、「商歌」とはどのような歌を言うのだろう。『史記』鄒陽伝の索隠には、

(甯戚の)事は呂氏春秋に見ゆ。(集解に言う)商歌は、商声を為して歌ふを謂ふなり。或いは云ふ、商旅の人の歌なりと。二説並通す。

とある。「商声を為して歌ふ」というのは、荆軻の「変徴の声を為す」と同様に、「商調(商調式)」で歌うことである。また、或説の「商旅の人の歌」とは、行商の物売りの歌のことであろう。俗謡にかこつけて、自らを認めて欲しい気持ちを歌うというのは、『史記』馮驩の「長鋏の歌」を思わせる。しかし、甯戚の故事の「商歌」は、これらの説明では十分に思えない。

『呂氏春秋』挙難は、原文を「撃牛角疾歌」に作っていて、「商歌」とはしていないため幾分事情が異なるかもしれないが、高誘注に、「歌は碩鼠なり」として、『詩経』碩鼠を引いている(『後漢書』馬融伝注引『説苑』も同様で、「撃車輻而歌碩鼠」として碩鼠を歌ったとしている)。この詩は、重い税を課する君主を大きな鼠に喩えて非難する詩であり、悲嘆の歌とも言える。また、『史記』鄒陽伝集解に「応劭曰はく」として次の歌が引かれる。

南山〓[石+干」たり 白石爛たり 生まれて堯と舜との禅りに遭はず 短布単衣 適に骭に至る 昏より牛に飯して夜半に薄る 長夜曼曼として何れの時にか旦けん

これも牛飼いとしての辛い境遇を嘆く歌と言えよう。類似の歌が『文選』の成公綏「嘯賦」李善注などにも引かれている。これらの引用されている歌を通して考えると、「商歌」は、「商音」と同じく、何かの歌を悲しげに歌ったと考えるのがふさわしいのではないだろうか。『後漢書』蔡邕伝所載の「釈誨」では、「甯子清商の歌」としていて、「商歌」が「清商」と言い換えられているのもその証としてよいものと考えている。

『文選』には、陶淵明以外の「商歌」が2例あるが、共に甯戚の故事による句であり「商歌」の語義を考えるための糸口にはなりにくい。

  • 曹植「七啓」「此れ甯子 商歌の秋。」
  • 王褒「四子講徳論」「昔、甯戚 商歌し以て斉桓に干む。」

■商音と変徴

陶淵明が荆軻の「変徴の声」を「商音」として引いた理由を考えるためにその「商」の用例を見てきた。以上を要するに、

陶淵明の「商音」、「商歌」という語において、「商」は、「悲しみを帯びたもの」を抽象的なイメージとして表すもので、五音の商や「商調の音楽」を表すものではない。また、「変徴調」の悲壮な音調を、「商音」と表現したわけで、対句の「羽奏」が『史記』の具体的な表現を襲って「羽調の音楽」を表すのとは違う発想で書かれていることになる。その背景には、五行思想で「商」が秋に配当されていることに表れているように、「悲」が「商」の属性と意識されていたことにあるものと思われる。

触れることができなかった商調(商調式)がどのような音列であるかという点や、変徴調から羽調への転調がどのようなものかという点については、また別の機会にまとめたいと考えている。[注4]

◎文献

  1. 『靖節先生集』中華書局,1973年
  2. 『中国古代音楽史稿』楊蔭瀏 人民音楽出版社,1981年
  3. 『淮南子』 上海古籍出版社(諸子百家叢書),1989年
  4. 『呂氏春秋』 上海古籍出版社(諸子百家叢書),1989年
  5. 『韓詩外伝』,『新序』 漢魏叢書本

◎注

  1. 宋意という人物については、『淮南子』泰族に「高漸離、宋意、為に筑を撃ちて易水の上に歌ふ」とある。また、『文選』雑歌で荆軻の歌として「荆軻歌ひ、宋如意 之に和して曰はく、…」とあるのも同じ人物を言うものと思われる。
  2. 『新序』は「杖を曳き、履を拖きて商頌を行歌す」としていて、表現を少し異にしている。
  3. 声の「清濁」をめぐっては、音色の清澄さで語られることが通例であろうが、これらの語の意味の中心は「高低」にあると思われる場合が多い。例えば、『宋書』楽志に「歌声濁者、用長笛長律、歌声清者、用短笛短律」と説明されることや、漢代の「相和歌」の清調は、平調に対して全音高い調子であること等が挙げられる。(この「清調」は、南北朝期に「清商調」と呼ばれるもので、平調の商を主音として、オクターブ上の商、つまり清商までの音階を用いるものである。)
  4. この事柄については、以前、簡単にまとめたことがある。「漢文教室」第184号 大修館書店 「『変徴の声』とはどんな音楽か」,1998年5月

孟嘗君という呼び名 04月23日, 2000


中国の文章での人物の呼び方の多彩さについては今さら言うまでもないだろう。ある時は姓や名で呼び、またある時は字や地位・役職・諡・号・爵位・排行・愛称で呼ぶ。実に様々な場合が見られ読解を難しくしている。
 ここでは、「鶏鳴狗盗」の故事等で広く知られる戦国時代の斉の王族田文(?—前279?)につき、その「孟嘗君」という呼び名の由来をたどり、更に幾人かの呼称についてまとめてみたい。

1 孟嘗君

田文の呼び名に関連して『史記』(巻75孟嘗君列伝)には、

A 孟嘗君、名は文、姓は田氏。
B 嬰卒し、諡して靖郭君と為す。而して文果たして代はりて薛に立つ。是を孟嘗君と為す。
C 文卒し、諡して孟嘗君と為す。

とある。ここで「嬰」(エイ)とは、孟嘗君の父親、田嬰のことである。また、「諡」は、「おくりなして」と読んでおくが、「号」と同義として読むべき所かも知れない。(呂不韋列伝の「諡為帝太后」に付された唐代の注釈である「索隠」に「蓋し号せしのみ」とある。)Cについて「索隠」は次のように説明する。

按ずるに、孟嘗君 父を襲ひて薛に封じられ、号して孟嘗君と曰ふ。此に諡と云ふは、非なり。孟は字なり。嘗は邑名なり。『詩』に云ふ、「常と許に居り」と。『鄭箋』に、「常、或ひは嘗に作る。嘗邑は薛の旁に在り」と云ふは、是れなり。
(孟嘗君は、父の封邑であった薛を継ぎ、孟嘗君と号した。その為、ここで「諡」と言うのは正しくない。孟嘗の孟は字–あざな–であり、嘗は領地の名である。『詩経』魯頌の閟宮に「常と許に居り」とあるが、後漢・鄭玄の注に「常は、嘗とも書き、嘗邑は薛付近の地である」と言うのがそれである。)

田文は、父の跡を継いで一家を立て孟嘗君と号したのであり、死去に際し、諡として与えられたのではないというのだ。また、閟宮の詩は、魯の僖公が国の始祖である周公旦の廟を修理して先祖の祭祀を継いだことを祝い、魯国の安泰を誇ったもの。その本文に「(僖公は)常と許に居り、周公の宇を復す」とあり、鄭玄の注は、右の引用の後に、

『春秋』魯荘公三十一年(前663)「台を薛に築く」とは是れなるか。周公 嘗邑を有するは、由る所未だ聞かざるなり。六国の時、斉に孟嘗君有り。薛を食邑とす。

と続く。つまり、「索隠」は孟嘗君という呼び方について、

  1. 家を継ぐ時に称したもので、死後付けられたものではない。
  2. 孟はあざ名である。
  3. 嘗は領地の名で、薛付近にあった常のことである。

と言っている。この「孟嘗君」という呼び名は、『通典』の言い方を借りれば、「封爵の外に在り別に美号を加え」たもので、君号と呼ばれる。戦国時代の君号は、公子が家を立てる際に名乗ったもので、実際の領地とは別の、名目上の領地によったものである。「戦国の四君」と呼ばれ孟嘗君と併称されることもある趙・平原君趙勝、魏・信陵君魏無忌、楚・春申君黄歇などの例や、秦の涇陽君、高陵君など多くの例が挙げられる。ちょうど我が国の宮家の「宮号」と似たもののようだ。君号は、後には功績ある臣を称揚する為に名目上の土地に因り与えられるようになり、更には、秦の公孫鞅が於・商と付近の15箇所の領地に封じられて商君の号を与えられたように、実際の封邑を冠する例も現れてくる。

孟嘗君の実際の封邑は薛(山東省滕県の東南)だが、名目上の領地である孟嘗の地についての詳細は不明である。「史記会注考証」(以下「考証」)は、中井積徳を引き次のように言う。

孟嘗は、蓋し封邑の名なり。其の地獲ざれば、記載伝はらざるのみ。田嬰、四十余子。而して文は賤妾の子なり。蓋し叔・季に在りて、孟を字とするの理無し。
(孟嘗は多分封邑の名であろうが、その場所が不明であるため記載されていないのだ。田嬰には四十数人の男子があり、田文は賤妾の子であり、兄弟の中で年若かったはずだ。およそ子の中で年下のものが、「初め」「大きい」意の「孟」が字である理はない。)

薛は、春秋時代の侯爵の国で、黄帝の子孫の奚仲が封じられたことに始まり、戦国時代には斉に含まれていた。その墟は薛陵とも呼ばれる。(『資治通鑑』周・烈王六年胡三省の注)また、「常」については、『史記』越王句践世家「常・郯之境」の「索隠」に、「常は邑名。蓋し田文の封ぜられし所の邑なり。郯は…。二邑は皆に斉の南の地なり」とあり、鄭玄の言う地と同一のようである。もともと、嘗の字が常と書かれる例は古文に散見するので、(常が嘗となっている例はあまり見かけないという事情はあるが)、孟嘗という呼び名は、薛付近のこの地に由来するものと一応考えてよかろう。しかし、他に材料が無いこともあって、孟の文字が添えられている理由については、今は保留とせざるを得ない。あるいは、憶測に過ぎないが未知の孟嘗という土地が存在していたのかも知れない。寧ろそのように考える方が他の例を見ると当然のように思える。

2 靖郭君

さて、以上の事情は、靖郭君田嬰についても同様である。 『史記』は、先に挙げたように(前掲B)田嬰の死を記している。しかし、この「諡して靖郭君と為す」に関しても、死後に付けられたものではなく、生前からの号と考えられる。実際の封邑である薛以外に靖郭という土地を名目上の封邑として与えられていたのである。靖郭が地名であることについては、「索隠」が「靖郭、或いは封邑の号」と言った上で、前漢・文帝が駟鈞を靖郭侯に任命している例証を挙げている。(ただし、『史記』孝文本紀のテキストでは「清郭侯」となっている。『漢書』は「靖郭侯」。)この場合も、その地がどこであったかについては不明である。

3 平原君

趙・恵文王の弟の趙勝については、その封邑は東武城(武城とも言う)であったが、孟嘗君と同様な状況で平原君という呼び名が知られている。この平原は、秦漢の平原県・平原郡にあたると思われる。(曹相国世家に付された唐代の注釈の「正義」は『括地志』を引き、「平原故城は徳州平原県の東南十里」と言う。)今の山東省徳州市の南に平原県があり、その付近の土地である。

4 信陵君

魏・昭王の公子の魏無忌は、昭王の死後、異母弟の安釐王が即位した時に、信陵君に封じられている。「索隠」には、

『地理志』を按ずるに信陵無し。或いは是れ郷邑の名なり。

とある。また、「正義」には「信陵は地名」とあって、「考証」は洪頤煊を引き、『水経注』に言う寧陵県の西の葛がその地であるとしている。しかし、夷門の門番の侯生や肉屋の朱亥との逸話を見ても、信陵君は魏の都の大梁で暮らしていたようであり、信陵に実際の領地があったわけではない。この信陵君については、名目上の領地がどのように扱われたかを示す事件が残っている。

趙の平原君の夫人となっていた信陵君の姉は、魏の安釐王の20年(前257)に秦が趙の都邯鄲を包囲した時、救援を求める知らせを魏王と信陵君に寄せていた。しかし、秦の制裁を恐れた魏王は救援に消極的であった。将軍の晋鄙に救援軍を率いて出発させながら、征路の中途で駐留を命じ趨勢を見極めようとしていた。信陵君は、王命と偽って司令官を交代させようとしたが、晋鄙は疑念を持って役目を譲ろうとしない。そこで彼を撲殺してしまい、奪い取った8万人の兵を率いて邯鄲を救ったのである。魏軍を帰国させた後も、王に責められることを恐れて自らは趙に残っていた。また、趙王は救ってくれたことに感謝して城を与えると、魏でも信陵を領地として奉じたというのである(魏公子列伝)。

この末尾部分は、原文では「趙王〓[高+阝]を以て公子の湯沐邑(その税収を沐浴・化粧の費用にあてる地)と為す。魏も亦た復た信陵を以て公子に奉ず」となっている。魏王の側でも宥免を示そうとしたのだろう、信陵を再度奉じている。名目上の地であったものを実質的な封邑として認定したことを言っているのである。

5 春申君

魏の黄歇はこれまでの人々とは異なり、王族ではなかった。魏の頃襄王に仕え、博識で弁が立つことから秦への使者となり、得意の弁説で楚への攻撃を止めさせ、逆に同盟を結ばせた人物である。その同盟の為の人質として太子時代の孝烈王と共に秦に行き、命がけで太子の危急を救った功績から、即位した孝烈王により宰相に任命され春申君に封じられたのである。領地は淮水の北の十二県を賜った。「正義」、「考証」は言う。

正義 四君の封邑は、検するに皆獲ず。唯だ平原のみ地有り。
考証 中井積徳曰はく、「四君皆封号にして諡に非ず。『呉志』に云う、建興二年、鳥春申に見はると。春申の地名たること決まれり。」と。

領地として春申を与えられたというのである。『三国志』呉書巻48、建興2年(253)11月に「大鳥五 春申に見はる」との記事があり、それを瑞祥として翌年五鳳に改元している。

6 蘇秦・張儀

合従連衡で知られる蘇秦と張儀についても本稿に関連する事柄がある。蘇秦が六国の合従を定めて趙に戻ると、粛侯は彼を武安君に封じた。この武安は、邯鄲の西の地。蘇秦がその地を実際に治めた記録はない。名目上の封邑と思われる。(秦の武将白起も功績により昭王より武安君に封じられているのだが、同様にそこを統治した形跡はない。)また、連衡をまとめた張儀は、秦・恵王から五つの領地に封じられ、武信君と号したというが、これも名目上のことである。この武信が地名であることは、項羽の季父の項梁が、自ら武信君と号した事にも表われている。

7 最後に

以上、孟嘗君を中心として戦国の君号が名目上の領地を冠して称されたこと、多くの場合にその地は何らかの理由で選定されるものであるようだが事情が判然としないこと、その地の所在は不明のものが多いことを見た。まとめると次のようになる。

  1. 公子が名目上の土地を冠して与えられる美号である。
  2. 勲功ある家臣がある種の爵位として、名目的な領地により与えられる。
  3. 功臣が実際の封邑により与えられる。

これ以外に、君号が与えられた場合としては、王昭君や卓文君のような女性の例が数多くあるがここでは触れない。

変徴の声 04月12日, 1998



「易水送別」で、荆軻が出発に際して「変徴の声を為す」箇所は有名です。

太子及び賓客の其の事を知る者、皆白衣冠して以て之を送る。易水の上に至り、既に祖して道を取る。高漸離筑を撃ち、荆軻和して歌ひ、変徴の声を為す。士皆涙を垂れて涕泣す。(『史記』刺客列伝)

「変徴」は伝統的に「ヘンチ」と読まれています。この「変徴の声」とは、具体的にはどのような音楽なのでしょうか。
知られている通り「変徴」とは、
・階名で、「徴」よりも半音程低い(変)高さの音。(「宮」を「ド」とすれば、ほぼ「ファ#」に当たる)
・その音を主音とした調子(旋法)。
です。また「声」という語はここでは「楽音の響き」の意味でしょうから[注1]、上の文の後半部は、

「荆軻は、高漸離の筑に合わせて歌った。その筑の音も歌声も変徴調の旋法による悲壮な響きのもので、見送りの者達も皆共に涙を流すのであった。」

という表現にあたると考えるのが良いようです[注2] 。以下、先秦時期の変徴調の旋法について考えることを中心として、関連する事柄として「五声」、「七声」、「十二律」について整理してみます。

■五声、七声は階名

昔の中国の音楽は、五音の音階で構成されていました。その五つの音(宮、商、角、徴、羽)は「五声」とか「五音」と呼ばれます。各音の高さは、「宮」音から考え始めると、その弦を「三分の一長くする」と完全四度低い「徴」音が得られ、更にその(「徴」の)弦を「三分の一短くする」と完全五度高い「商」音が得られます。同様に、三分の一長くして「羽」、また三分の一短くして「角」を得るというように説明されます。(『管子』地員)、このやり方は「三分損益法」と呼ばれますが、今参考までに示せば、仮に「宮」の弦長を81とすると(計算の便宜からこの数を選んでいます。勿論、他の数でもかまわないわけです)表1のような関係になります。このようにしてでき上がる音階は、五度音程を重ねることによる「ピュタゴラス音階」と呼ばれるものと同じものになります。

宮を「ドレミ」のドとすると、徴は完全四度低いのですからソとなり、ソより完全五度高い商はレ、以下羽はラ、角はミということになります。この五声がどのような経緯でそのように命名されたものか正確な事は分かりませんが、その用例は戦国の諸書に散見されます。『春秋左氏伝』、『礼記』、『呂氏春秋』、『管子』等です。

この五声に、ファ#にあたる「変徴」、シにあたる「変宮」を加えて七声と(七音とも)呼ばれます。(表1では省略しておりますが、角から更に続けるとシ、ファ#……となります。)表2で分かる通り、七声の音階は西洋音階に近いものです。ただし、ドレミで表されている階名は、平均律とは微妙にずれています。表中には音程差として上下の音高差をセントで示してあります。この数値は平均律の半音を百とするものです。中国での平均律に類似した音階の登場は、南朝宋の何承天を待たねばなりません[注3]。平均律とは幾分のずれはありますが、中国の古代音階が西洋の音階(ドレミの音階)と比較した時に、まるで異なるものではなく、共通する基盤を持つのは何か不思議な感じがしてしまいます。しかし、これも考えてみれば音楽の本質は一つという純粋な原理に帰結すると思います。

さてこの七声の語ですが、『春秋左氏伝』が初出とされています。また、この頃の遺物からも変音、七声の存在が確認されています。しかし、当時の文献には七声音階に関する具体的議論は見られないため、春秋戦国期には七声音階が広まってきてはいたものの、一般的状況としては五声音階が音楽の中心だったようです[注4]。

■五声(七声)の各名は旋法の名でもある

また、音階の各音は、音階の中の単音を意味すると同時に、その音を主音とする調子も意味します。旋法と言っても良いかと思います。各旋法は、宮を主音とするものは「宮調」というように、その階名に基づいて呼ばれます。五声の各旋法を表3に、七声の旋法の一部を表4に挙げます。(王光祈の表記法による)

五声音階の場合、宮と商、商と角、徴と羽の音程は狭く、角と徴、羽と宮の音程は広くなります。七声音階の場合は、変徴と徴、変宮と宮の音程は他より狭く、ほぼ西洋音楽での半音です。この二つの音程の配置が、その旋法の響きを決めるわけです。また、七声音階の「角調」をみますと、これは西洋の古典音楽での短調と音程の配置が似ていますし、「徴調」は長調に似ています。これまで調子とか旋法とかと呼んできているものは、我々が長音階と短音階とを耳にして感じるように各々違った個性を持っているものなのです。。中国ではそれが五種類、七種類あったということです。(例えば「君が代」を例にとりますと、そのメロディーは、「レドレミソミレ」で始まり、「ドレラソラソミレ」と終わりますが、これは、ここで言う五音音階の商調のものと言うことができます。また、沖縄の古歌などを聞くと平生耳にするものとは異なるメロディーであることが我々にもわかるでしょう。これは、ここで言う「旋法」の持つ音の世界が、自分の熟知の世界と異なることを感じたために起こるものです。これらが「旋法」の違いが我々に与える具体的な音のイメージと言えるでしょう。)

さて、問題の「変徴調」の旋法ですが、表4の通りで「「ファ#ソラシドレミファ#」の音でその響きをある程度確認することができます。勿論、このような音の並びではあっても、荆軻がどのようなメロディーを歌ったかが全く不分明なわけですから、易水のほとりで居並ぶ者達を男泣きにさせた音楽を、この音階から想像することはできませんが。(我々が短調の音階練習を耳にしても、例えばブラームスの交響曲を頭の中で鳴らすことは不可能であることのようなものですね。)ただ、この旋法の性格として想像できることとしては、変音を主音としたもので当時まだ耳新しい響きであったろうと思われること。『戦国策』に後世の注釈家が「(変徴)蓋し悲音」(燕三 鮑注)とこの時の音楽の響きを想像していることから、悲哀を帯びた悲しげな音調であったろうと思われること。そして、五声の音楽についての印象を語っているものなので間接的な判断材料としかなりませんが、『礼記』楽記の「徴乱れれば則ち哀し」も変徴調の響きを耳にした場合に通じるものがあるかも知れません。

以上の五声音階、七声音階の五つ乃至七つの旋法が高さを変えて様々な(西洋音楽流に言えば)調性をもたらすわけです。この状況は、長調の音階に対して、主音のドの高さが変わることによりハ長調がト長調へと変わったり、短調の音階に対して主音のラの高さが変わることにより、イ短調がホ短調となることに類似しています。その際、主音の絶対的な高さを決めていくものとして「律」があります。

■十二律

中国の音律制定の淵源は、太古の黄帝の時代に遡るという伝説があります。律管を作るために楽師を中央アジアの遥か遠方まで竹を取りに行かせ、その節の間を用いて三寸九分の管を作り「黄鐘の宮」としたというのです。(『呂氏春秋』古楽)三寸九分とは随分短い管ですが[注5]、『史記』の律書には「黄鐘律」の宮音は「九寸」の管から発するとでていますので、ほぼ二十センチほどの管から発せられるわけです。

ここで「黄鐘律」と言うのは「十二律」の一つです。それは音名にあたり、我々にとっての音楽の世界での「ハニホヘトイロ」です。これは、音階を表わすものではなく、一つ一つの音の絶対的な高さについた名前です。その十二種は、古くから知られていて(文献での初出は『国語』周語下とされます)、各律の名称は表2に挙げてあります。まず基準となる「黄鐘律」の絶対音高を定め、各律の高さは「三分損益法」により求めます。黄鐘律を宮とした場合(「黄鐘宮」)の七声と十二律との対応は表2の通りです。この十二律と五声・七声が組み合わされて色々な響きを作るという考え方はこの時代には既にあったようですが[注6]、それを系統だてて84の調性で説明する動きは南北朝以降のこととなります[注7]。

高漸離と荆軻の歌が拠った律については明らかではありませんが黄鐘律だったのでしょうか。歌と筑での音楽ですので、鐘や磬のように音高の固定された楽器とのアンサンブルよりは柔軟だったでしょう。

■最後に

以上「変徴の声」がどのような響きであったかを見ながら、先秦時代の五声、七声、十二律について見てきました。同様に考えますと、先に挙げた刺客列伝に続けて出てくる「羽声を為す」という表現も理解し易くなると思います。

(荆軻)又前みて歌を為りて曰はく、風蕭蕭として易水寒し 壮士一たび去りて復た還らず。復た羽声を為して忼慨す。

この表現も、3度高く転調し、「羽調」の旋法(表4参照)に転じて興奮した調子で歌ったと理解できるわけです[注8]。
このような、中国古代の音楽に関連する表現は、広く知られるものに限ってもたくさんあります。伯牙の琴の見事な演奏がどのような響きだったのか、『論語』の「鄭声」がどのような曲だったのか、「四面楚歌」では、楚歌がどのようなメロディーであったのか、項羽や虞美人が歌ったのがどのような歌だったろうか、「古詩十九首」の「新声 妙として神に入る」(其四)や「清商 風に随ひて発す」(其五)「戸に当たりて清曲を理む」(其十二)で聞こえていたのはどのような響きの曲か、等々まだまだ数多いと思います。しかし、それも音楽が時間の中で消えていってしまうという本質の前ではどうしようもない。せめて分かることだけでも確かめていきたいものだと思います。

◎参考文献

  1. 中国の音楽世界 孫玄齢著 田畑佐和子訳 岩波書店,1990年(岩波新書115)
  2. 王光祈音楽論著選集上册 馮文慈 兪玉滋選注 人民音楽出版社,1993年
  3. 中国古代音楽史簡編 夏野 上海音楽出版社,1989年
  4. 先秦音楽史 李純一 人民音楽出版社,1994年

◎注

  1. 『礼記』楽記「物に感じて動く。故に声に形る。」(人の心の活動は、外界の事物によってひき起こされ)感情を動かされ、それが音楽の響きとなる。
  2. 「変音(本来の音より低い音)を使った歌い方であった」とする考えもある。文献3 27ページ「在歌唱中使用了変音。」
  3. 文献3 79ページ。
  4. 七声音階に関するこの部分の記述は、文献4 189ページによる。そこには、曾侯乙墓(湖北省随県)出土の編鐘の銘文と測音結果から考えて、五声・七声の音階が演奏可能だったことも述べられている。
  5. 『太平御覧』565では「九寸」に作る。
  6. 『礼記』礼運「五声、六律、十二管、旋相為宮也。」『淮南子』天文訓「一律而生五音、十二律生六十音」
  7. 文献3 79ページ。
  8. 『戦国策』の当該箇所につき、文献3 29ページ「『復為羽声慷概』則明確指出了荆軻最后唱的是一首羽調式歌曲。」、 文献4 153ページでは「変徴調から羽調へと転調した」としている。また、『戦国策』燕三 鮑注「羽声其の声怒る。」