2017-02-22

LibreOffice Calcのキーボードショートカットの扱いの違い

dynabook SS SX/15AにNetBSD/i386を入れて、従来Windows Vistaでおこなってきたのと同等の環境を構築しようとしています。これまでもLibreOfficeを使っていたので、NetBSDに切り替えても問題は無いだろうと見込んでいました。

試験的にNetBSDのLibreOffice Calcを使って、これまでWindowsのLibreOfficeでおこなってきた作業をやってみました。メッセージが日本語になっていないとか、バージョンが若干違う(Windowsはバージョン5.2.5.1ですが、NetBSDのpkgsrcから入れたLinuxバイナリ版ではバージョン5.1.0.3)などの相違があるものの、ほぼ問題なく作業を行えました。

ただしキーボードショートカットの動作がWindowsの場合とNetBSDとでは大きく異なりました。具体的には「Ctrl+Shift+;」において「現在時刻の挿入」であるべきところが「Insert Cells」になってしまうのです。

メニューから[Tools]-[Customize ...]を選択し、開いたウィンドウのタブKeyboardを確認したところ「Ctrl+Shift+;」は「Insert Current Time」に割り当てられていました。これはWindowsと同じなので、それであれば現在時刻が挿入されるはずです。

ところが「Ctrl++」には「Insert Cells」が割り当てられています。dynabook SS SX/15Aのキーボードは日本語配列なので「;」の刻印のあるキーは、シフトすれば「+」になります。ということは「Ctrl+Shift+;」というショートカットのつもりなのに「Shift+;」が「+」と扱われてしまうため、結局「Ctrl++」になってしまっているようです。

このような理屈は分からないでもないのですが、それならば何故Windowsでは問題にならなかったのでしょう。Windowsでも日本語配列のキーボードを使っているのです。

キーボードショートカットだけの問題であれば定義を変えてしまえば解決することです。どうやらWindowsとNetBSDの各OS上で動作するアプリケーションにおけるキーボード入力の扱い方の相違という根本的な問題がありそうです。

2017-02-21

春の訪れ

春一番が吹いたとき
梅の花が咲き始めるとき
初夏の陽気の直後に真冬に逆戻りしたとしても次第に冷え込みは和らいでいくとき
いつの間にか日の入りの時刻が伸びていたとき

そして庭の雑草が伸びてきたのに気づいたとき

春の訪れを感じます

2017-02-19

XML構造化をおこなうための「思想」はどこで学べるのか

O'REILLYの『入門XML 第2版』を読んでいます。技術的側面は何とでもなると思いますが、思想的側面を学ぶにはどうしたよいのだろうかと考えています。例えば、次のようなことです。

「3章 情報のモデル化」において「例3-1 小切手帳の文書例」から一部を抜粋します。
<支出 分類="消耗品">
  <金額> 10.58</金額> 
  <日付><年>2002</年><月>1</月><日>10</日></日付> 
  <支払い先> Exxon Saugus</支払い先> 
  <明細>ガソリン</明細>
</支出>
これは「XMLとはこういうもの」を示す例にすぎないので、この妥当性を議論するのはお門違いかと思いますが、ちょっと考えてみます。

「支出」というものの中に「金額」、「日付」、「支払い先」、「明細」があります。しかし「分類」は「支出」の一属性として扱われています。何故でしょう。「分類」も「金額」などと同じ副項目に落としてはいけないのでしょうか。また逆に「金額」などを「支出」の属性としてはいけないのでしょうか。

これは何かの方針に基づく決め事なのではないかと想像しています。その方針(または思想)に応じて決めれば良いのでしょう。何かが絶対的に正しく、何かがそうではないというわけではないのだと思います。

ひとつの類推として、RDBにおける正規化の理論が思いつきます。理論的に正規化すべきではあるけれど、実装などの都合で正規化をくずすことも無いわけではないようです。これはRDBの知識に欠けた担当者が、やみくもに実現するという情けない理由ではなく、それなりの判断の結果として、そういうこともあるということです。

XMLの文書化にも同様の理論的背景があるんじゃないと思っています。もっと抽象的に言えば、XMLという具体的な技術に拘らず、もっと一般的に情報をまとめ上げるときに、どうすべきなのかという指針と言ってもよいのです。

いろいろあるよ、一言では語れないよ、というなら勿論それでも良いのです。こういう大きな問題を一言で語るのは難しいでしょう。その「いろいろある」というのを、具体的に知りたいのです。大きな問題を細かく分割していくことで扱いやすくなっていくはずだからです。

FAQって本当に「よくある」質問なのか

FAQ(Frequently Asked Questions)とは「よくある(あるいはあると想定される)質問とその回答」とウィキペディアで説明されています。冗談でFAQのAはAskedじゃなくてAnswered(Frequently Answered Questions、要するに「よく答えている質問」)だと言ったりすることもあります。

しかし実際のところ、FAQと称される質問がくるのでしょうか。

『Subversion によるバージョン管理』(Ben Collins-Sussman, Brian W. Fitzpatrick, C. Michael Pilato)では「まえがき」で次のように書いています。
だめな「よくある質問集(FAQ)」には実際にユーザが聞きたいことではなく、著者がユーザに聞いて欲しいことが書いてあります。おそらく経験があるでしょう:
 Q: チームの生産性を最大にするにはどうやってGlorbo ソフト社のXYZ を使えばよいのでしょう?
 A: 顧客の多くは私たちの特許であるオフィスグループウェアテクノロジを通じた生産性の向上の方法について知りたいと考えています。答えは簡単: まず「ファイル」メニューをクリックし、「生産性向上」メニューを選択しましょう、それから…
このようなFAQ の問題点は、文字通りFAQ でも何でもないというところです。技術サポートに電話をして「どうやったら生産性が最大になるのでしょうか?」などと聞く人は一人もいないのです。
この文章は、本気半分、冗談半分というところかもしれません。でも組織にしろ個人にしろ、質問や問い合わせを受けて回答するような行為を生業としている場合、「本当に」よくある質問というのが現実にあるはずですが、「おそらく尋ねられる筈だと想定している」よくある質問に置き換えて鸚鵡返しで対応しているんじゃないだろうか、と思うことがあります。

質問者の問いかけは「アナログ」的で想定外の振れ幅で投げかけられると思いますが、回答者が受け止めるのは想定している「FAQ」で量子化した結果の応答でしかないでしょう。両者の認識範囲(常識レベルと言ってもいいです)が近ければ、この方法でも概ね問題にはならないとおもいます。しかしその前提が崩れれば、かみ合わない応答になるでしょう。

究極には異文化交流にはこのような側面があると思います。自分の常識が決して相手にも常識とは限らないのです。かみ合わない応答に時間を費やすのは苦しい体験です。同じ常識が通じる範囲に閉じこもりたくなります。しかし内向きになればなるほど、常識範囲は狭くなっていくでしょう。

無理をしてでも外の世界に出ていかなければならないと感じるところです。

野良猫のフンと立ちションの相違点

自宅でふと庭に目を移すと野良猫が歩いてくるのが見えました。突如立ち止まると前脚で地面を掘りはじめるかと思いや、どうもフンをしているようです。自宅の庭では、もう何年も野良猫のフン害に悩まされています。対策しても他の場所にされてしまうし、おさまったかと思えば、いつの間にか再び始まったりして、根本的に解決できずにいます。

ところが今回は様子をうかがっていると、場所を変えて何か所でも同じ行為を繰り返しています。これは要するに「マーキング行為」というものではないかと思います。便意をもよおしたのではなくて(そういう意図も多少はあるかもしれませんが)、自分の縄張りを主張しているのでしょう。

話は変わり、近所を歩いていたら堤防下の物陰で年配の男性が立ちションをしていました。これは流石に「マーキング行為」ではなく、たんに尿意をもよおしただけでしょう。

人間だって、何億年も前の人類の進化の途上では「マーキング行為」をしていたんじゃないかと思いますが(違うのかな?)、縄張り主張の意図は消えて、ただの排泄校異に変化しています。尾籠な話ではありますが、マーキング行為を必要としなくなった人類進化の要因とは何だったのか、ちょっと気になりました。

2017-02-17

NetBSDのログイン環境の初期設定に関わるファイル群

dynabook SS SX/15AにNetBSD/i386をインストールして環境を構築してきましたが、ログインの仕方の違いや、ログインするユーザの違いによって、環境が微妙に異なっているので困っていました。具体的には、次のようになっています。
  1. アカウントは、rootと、2つの非特権ユーザがあり、合計で3つのアカウントがある。
  2. シェルには、rootはshだが、非特権ユーザはtcsh(場合によってはcsh)を使う。
  3.  各アカウントには、xdm経由でログインする場合と、TeratermやSSHなどの端末経由でログインする場合がある。
  4.  xdmでログインした場合、twmを利用するアカウントと、MATEを利用するアカウントがある。
このような組み合わせを考えると、闇雲にファイルを変えていくと、どのファイルで何の環境が変わるのか、だんだん分からなくなってきます。こういう場合の対処方法として一般的に行われるのは、組みあわせの数を減らすことです。例えば使おうとするシェルが3つ(sh、csh、tcsh)もあるので、何か1つ(例えばtcsh)に限定したりして、組みあわせの複雑さを低減させることです。

rootのシェルをCSH系にするというのも一案ではありますが、伝統的にrootはSH(1)を使ってきた(BASHですらなく)という経緯があるので、シェルを統一してしまうのは気が引けます。アカウントやログイン経路なども、何かに限定するわけにもいきません。

ここは覚悟を決めて、統一した環境を作ることを考えてみます。SH(1)にしろCSH(1)にしろ、初期設定を行うファイルは、全部使うかどうかは別にして、次のようになっています。これらを組み合わせて計4種類のファイルがあります
  1. /etcに置かれるシステム全体のものと、ホームディレクトリに置かれるユーザ固有のもの
  2. ログインシェルの場合に呼び出されるものと、サブシェルでも呼び出されるもの
SH(1)では伝統的にはホームディレクトに.profileというファイルを置くだけでしたが、POSIXの拡張か何かで、環境変数ENVが定義されているとサブシェル実行時に指定されているファイルを読み込むようになっています。ファイル名は何でも良いわけですが、NetBSDでは.shrcになっています。

環境を設定するための基本方針を次のように定めました。
  1. 基本的に/etcにあるファイルで設定をおこなう。
  2. ユーザ固有の設定がある場合のみホームディレクトリのファイルで設定する。従ってユーザ固有の設定がなければ、ファイルは空のままになる。
  3. 環境変数PATHやLANGのような情報はログインシェルの場合に読み込まれるファイルで設定し、シェル変数やコマンド・エイリアスなどはサブシェルでも読み込まれるファイルで設定する。
これで端末経由でログインする場合は問題ありませんが、XDM経由でログインする場合の対処が必要です。XDM経由でログインすると「ログインシェル」というものが無いのでPATHやLANGのような環境変数が設定されなくなってしまいます。xtermを起動するときに「-ls」というオプションを指定すればログインシェルとして扱われるようになりますが、それはオプションを指定したxtermだけであって、ウィンドウマネージャから直接起動したアプリケーションは対象になりません。

XDMはホームディレクトリにある.xsessionというファイルを使って初期設定をおこないます。このファイルは実行ビットが立っていてもいなくても構わないのですが、実行ビットが落ちている場合にはSH(1)のスクリプトとして扱われます。そうなるとユーザがCSH系のシェルに切り替えている場合、環境変数などをSH系としてもCSH系としても定義しておくことになり、重複して環境をメンテナンスするのは間違いのもとです。

この問題を解決するためにホームディレクトリにある.xsessionはユーザで使っているシェルにあわせることにしました。CSH系を利用するのであれば、このファイルもCSHのスクリプトとして書いておきます。さらに実行ビットを立てておかないと、shを介して実行されてしまいますから、忘れずにchmodしておきます。そして~/.xsessionの最初の方で/etcやホームディレクトリにあるシェル用の環境設定ファイルを読み込むようにしておきます。

以上のようにしておけば、環境を設定するための情報をあちこちに書かずにすむようになると思います。

上述した環境を整えている段階で/etc/login.confという設定ファイルがあるのも気にかかっていました。このファイルでも環境変数などを設定できるので、ここで設定しておいた方が良いのだろうかと悩みました。結局このファイルは使わない決断をしましたが、その理由はXDM経由でログインした場合の扱いが不明だったことです。XDMやLightDMなどを利用した場合に/etc/login.confで設定してはずの内容が使われないのであれば無駄になると思ったのです。

そもそも/etc/login.confが存在する歴史的経緯や、どのような利用方法を想定しているのかが分からないので、今回は使わないこととしました。

NetBSDのSH(1)内蔵コマンドcdにおける拡張機能

NetBSDのSH(1)のマニュアルをみていると内蔵コマンドcdが拡張されていることに気が付きました。マニュアルでは次のような構文になっています。
cd [-P] [directory [replace]]
replaceという部分が拡張されたところです。マニュアルでは「If replace is specified, then the new directory name is generated by replacing the first occurrence of directory in the current directory name with replace.」と説明されていますが、具体的にどういうことなのか、よくわかりません。

いろいろと試行錯誤してみたところ、次のようなことができるようです。例えば/usr/pkgsrcのように同一階層のディレクトリに多くのサブディレクトリが並んでいる場合を考えます。もしカレントディレクトリが/usr/pkgsrc/mailだったとすると、次のようなコマンドを打つことで/usr/pkgsrc/netに移ることができるようです。
cd mail net
この機能はFreeBSDのSH(1)やGNU BASHなどには無いようですが、ZSHには似たような機能があるそうです。

このような機能があれば便利な状況もあると思いますが、他のOSでは使えないため手が覚えてしまうと困ったことになりそうです。ただしNetBSDを利用するのであれば、覚えておいても良いでしょう。