2016-11-07

「報告型の課題」となるレポートを書くときの心構え

放送大学(学部でも大学院でも)では学期の途中で通信指導という名の中間レポートの提出が義務付けられています。マークシート形式の場合もありますが、せっかく学んでいるのですから記述式(字数は1,000字前後)に挑戦したいものです。

厄介なのは、どんな課題であっても何かを調べてから書き始めることになるわけですが、調べれば調べるほど深みに嵌まる気持ちに追い込まれることです。何も調べずにレポートを書くのは学問を舐めていると思いますが、そうかと言って際限なく調べればよいというものでもないと思います。何かリミッターのようなものがないと、全精力を通信指導に注ぎ込んでしまうはめになります(現実性を無視した観念論的発想としては悪くないのかもしれませんが、日常生活では他にもやることがあるのです)。

論文の書き方について語った書籍は数多くありますが、僕が気に入っているのはNHKブックス [954]として2002年に出た『論文の教室 レポートから卒論まで』(戸田山和久)です。新版が出ているそうですが、そちらは読んだことがありません。

本書の文体は独特で、四角四面な畏まった記述を期待していると、腹立たしさを感じるかもしれません。しかし僕自身はとても参考になる本だと思っています。いろいろと参考になるところが多いのですが、今回のテーマにに関わるのは以下の箇所です(110ページから引用)。
ところで、学生から提出された報告型のレポートを読んで気づくのは、キミたちが「いろいろ調べてわかったことを書くのが報告型の課題だ」と 思っているのではないかということだ。えっ。違うんですか、という声が聞こえてくる。違うだなこれが。
あまり長々と引用してもしかたないので、続きは書籍を読んでもらいたい。何の方向性もないままに資料を集めまくって、何を書いたらよいのか分からなくなり、まとまりのない報告が出来上がると語られています。

これは非常に大切な指摘だと思います。インターネットで検索をかければ、真理も法螺も含めて山のような情報にアクセスできます。なんて幸せなんだろうと思えるのは一瞬だけで、その後には苦痛が待っています。

レポートに何を書くのか何のアイディアも浮かんでいない時点では、制約を設けずに大量の情報を集めるのも悪くないでしょう。しかしインターネット上には個人が1,000年生きても読み切れないほどの情報が溢れています。闇雲に情報を収集しても行き詰まるだけです。

情報を集めてみてレポートを書く種となりそうだなと(一瞬でも) 思った事柄が出てきたら、それを育ててみるべきでしょう。もしかすると執筆途中で何度も障害に行く手を阻まれそうになるかもしれません。しかしそれを乗り越えた先に、自分のオリジナルの着想で仕上げたレポートが待っているはずです。

lightdm-1.20.0の自前pkgsrc化は後回し

LightDM 1.20.0がビルドできたので、次は自前のpkgsrc化を図るつもりでしたが、考え直して後回しにしようと思います。LightDMを使おうとしている目的は「Windows Vistaがサポート終了となるのでdynabook SS SX/15AのOSをNetBSD/i386に入れ換えること」です。現状ではMATEが動きそうだという感触をつかんだだけで、Vistaの代替環境を構築するという最終目的はまだまだ先にあります。それなのに横道にそれてpkgsrcを作ることに意識を向けてしまうのは本末転倒でしかありません。lightdmはWIPにあるので、いずれlightdm-1.20.0に追いついてくれるかもしれないし、代替環境の構築が済んで時間的な余裕ができたらpkgsrc化に着手できるかもしれません。

lightdm-1.20.0のビルドは出来たものの、気になっていることがあります。ビルド中に「ld: warning: libintl.so.1, needed by /usr/pkg/lib/libgio-2.0.so, may conflict with libintl.so.8」という警告メッセージが出ていましたが、なぜかlibintl.soが重複しているのです。
/usr/local/sbin/lightdm:
    -lgio-2.0.0 => /usr/pkg/lib/libgio-2.0.so.0
    -lgobject-2.0.0 => /usr/pkg/lib/libgobject-2.0.so.0
    -lglib-2.0.0 => /usr/pkg/lib/libglib-2.0.so.0
    -lpcre.1 => /usr/pkg/lib/libpcre.so.1
    -lgcc_s.1 => /usr/lib/libgcc_s.so.1
    -lc.12 => /usr/lib/libc.so.12
    -lintl.1 => /usr/lib/libintl.so.1
    -lpthread.1 => /usr/lib/libpthread.so.1
    -lffi.6 => /usr/pkg/lib/libffi.so.6
    -lgmodule-2.0.0 => /usr/pkg/lib/libgmodule-2.0.so.0
    -lz.1 => /usr/lib/libz.so.1
    -lXdmcp.7 => /usr/X11R7/lib/libXdmcp.so.7
    -lxcb.2 => /usr/X11R7/lib/libxcb.so.2
    -lXau.7 => /usr/X11R7/lib/libXau.so.7
    -lgcrypt.20 => /usr/pkg/lib/libgcrypt.so.20
    -lgpg-error.0 => /usr/pkg/lib/libgpg-error.so.0
    -lintl.8 => /usr/pkg/lib/libintl.so.8
    -lpam.4 => /usr/lib/libpam.so.4
/usr/libにあるlibintl.so.1の他に/usr/pkg/libにあるlibintl.so.8があり、どちらも参照されています。どうしてこのようなことになるのでしょうか。

気持ち悪いので対処しておこうと思いましたが、同様のバイナリが他にもあるのを確認しました。例えば/usr/pkg/bin/mate-sessionもそうです。警告メッセージが出るくらいですから望ましい状態ではないのでしょうが、もしかすると実害はないのかもしれません。これも将来的に解決する課題ということにして、当面は放置します。

昔々は(2000年以前頃)Makefileなどを変更してビルドしたものですが、今はautoconfautomakelibtoolなどが整備されconfigureを利用するのが一般的です。さらに(つい最近知ったのですが)stowというのがあるそうです。これはconfigureを用いて/usr/local以下などにインストールされたパッケージを管理できるそうです。lightdm-1.20.0に使ってみようと考えています。

2016-11-04

LightDM 1.20.0を暫定的にビルド&インストール成功

LightDM 1.20.0のビルドが出来るように暫定的な対処を続けた結果、最後までビルドできるようになり、/usr/local以下にインストールできました。細かいところは省きますが、次のような問題がありました。
  1. Shared object "libXi.so.7" not found」というエラーが出る。 
  2. No rule to make target 'liblightdm-gobject-1.deps', needed by 'all-am'. Stop.」というエラーが出る。
  3. libsystem.c:29:21: fatal error: xcb/xcb.h: No such file or directory」というエラーが出る。
  4. libsystem.c:138:1: error: conflicting types for 'setgroups'」というエラーが出る。
1番目の問題は昨日から出ているものです。GNU libtoolを使っているようなのですが、「libtool --config」で確認すると「shlibpath_var=LD_LIBRARY_PATH」になっていました。shlibpath_varはマニュアルでは「The environment variable that tells the dynamic linker where to find shared libraries. 」と説明されています。要するに環境変数LD_LIBRARY_PATHを設定しておかなければならないという事なのでしょうか。この環境変数でパスを指定したらうまくいったので、正式な対処方法は不明ですが、暫定的にこの方法で対応します。

2番目の問題はLightDMが提供するビルド方法の問題ではないかと思います。提供されるtarballにはこのファイルが含まれているのですが「make distclean」をしたときに消されてしまうのですが、消してはいけないファイルなのではないでしょうか。当面は「make distclean」した後にtarballから復活させることにします。

3番目の問題はconfigureに関わる問題のようです。このファイルは/usr/X11R7/includeにあるのですが検索対象になっていないようです。非標準ディレクトリと見做されているのでしょうか。configure実行時に指定する環境変数CPPFLAGSに追加しておくことにします。

4番目の問題はGNU拡張とNetBSD標準との差異が原因と思われます。LightDMはLINUX上で開発されたと思われますが、NetBSDなどとの移植性に注意を払っていない印象を受けます。移植性を確保するというのは難しい課題であることは認めます。ややもすると自分の開発環境で問題なければ、それで良しとしてしまいがちです。この問題に対処するため「__NetBSD__」が定義されている否かで条件コンパイルするようにして暫定的な対処をおこないました。

以上の問題を解決し、以下のコマンドでビルドが成功し、/usr/local以下へのインストールにも成功しました。次はWIPを参考にして自前のpkgsrcを作ってみようと思います。
# cd lightdm-1.20.0
# env CPPFLAGS='-I/usr/pkg/include -I/usr/X11R7/include' ./configure
# end LD_LIBRARY_PATH='/usr/pkg/lib:/usr/X11R7/lib:/usr/lib' gmake
# gmake install

2016-11-03

LightDM 1.20.0をビルドしてみる

まず最初にLightDM 1.20.0を単独でビルドできるか試してみます。これが上手くいってからpkgsrc化をおこなおうと思っています。ビルドするためにはconfigureしてからmake && make installするわけですが、この場合のインストール対象は/usr/local以下になります。いろいろな問題が発生して、ビルドヲ正常終了するところまで辿りつけません。

いきなり次のような問題が発生しました。
  1. configure: error: libgcrypt not found」というエラーが出ました。
  2. NetBSD標準の/usr/bin/makeではビルドできませんでした。
  3. liblightdm-gobject/language.cでコンパイルエラーになりました。
  4. ビルド中に「ld: warning: libintl.so.1, needed by /usr/pkg/lib/libgio-2.0.so, may conflict with libintl.so.8」という警告が出ました。
  5. Shared object "libXi.so.7" not found」というエラーが出てビルドが止まりました。

1番目の問題は、pkgsrcでインストールされるディレクトリが/usr/pkg以下になっていることが原因だと思います。見つからないと訴えているファイルは/usr/pkg/libにあるのですが検索対象になっていないのでしょう。以下のようにしてconfigureを実行することで対処しました。
 # env CPPFLAGS='-I/usr/pkg/include' ./configure

2番目の問題はconfigureで生成されたGNU make 4.1を利用することで対処しました。これはMATEをビルドする時にインストールされたものです。

3番目の問題はWIPにあるパッチを参考にして対処しました。setlocale()の引数にLC_IDENTIFICATIOが使われていますが、これはGNU拡張なのでNetBSDには入っていません。WIPのパッチではコンパイル対象から外しているだけですが、当面はこれで凌ぐとしても、きちんと直すにはどうすれば良いのでしょうか。2012年10月30日付のバグ報告「lightdm-1.4.0 fails to build on uclibc due to LC_IDENTIFICATION undeclared」(Bug #1073080)がありました。問題は把握しているようですが、何の進展もありません。
--- liblightdm-gobject/language.c.org    2016-11-03 13:12:38.000000000 +0900
+++ liblightdm-gobject/language.c    2016-11-03 13:22:49.000000000 +0900
@@ -227,10 +227,16 @@
         if (locale)
         {
             gchar *current = setlocale (LC_ALL, NULL);
+#ifdef LC_IDENTIFICATION
             setlocale (LC_IDENTIFICATION, locale);
+#endif
             setlocale (LC_MESSAGES, "");

+#ifdef _NL_IDENTIFICATION_LANGUAGE
             gchar *language_en = nl_langinfo (_NL_IDENTIFICATION_LANGUAGE);
+#else
+            gchar *language_en = NULL;
+#endif
             if (language_en && strlen (language_en) > 0)
                 priv->name = g_strdup (dgettext ("iso_639_3", language_en));

@@ -270,10 +276,16 @@
         if (locale)
         {
             gchar *current = setlocale (LC_ALL, NULL);
+#ifdef LC_IDENTIFICATION
             setlocale (LC_IDENTIFICATION, locale);
+#endif
             setlocale (LC_MESSAGES, "");

+#ifdef _NL_IDENTIFICATION_TERRITORY
             gchar *country_en = nl_langinfo (_NL_IDENTIFICATION_TERRITORY);
+#else
+            gchar *country_en = NULL;
+#endif
             if (country_en && strlen (country_en) > 0 && g_strcmp0 (country_en, "ISO") != 0)
                 priv->territory = g_strdup (dgettext ("iso_3166", country_en));

4番目の問題は何をした時に出てきたメッセージなのかを突き止めなければなりません。確かに/usr/lib/libintl.so.1/usr/pkg/lib/libintl.so.8があります。しかし何をした時に出るのかが分からないと対処のしようもありません。

5番目の問題は本来出てはいけないメッセージのような気がします。問題となっているファイルは/usr/X11R7/lib/libXi.so.7として存在しているので、特別に何も設定しなくても参照できなくてはいけない筈です。ダイナミックライブラリが見つからない時には、環境変数LD_LIBRARY_PATHを設定するとか、ファイル/etc/ld.so.confを使うというのが常套手段ですが、それは非標準ライブラリを利用したい場合の話であってlibXi.soは違うのではないでしょうか。想像するに、configureで生成されたファイルの何処かでダイナミックライブラリの検索パスを壊しているような気がします。

Xディスプレイマネージャを利用するか否か

dynabook SS SX/15AのWindows VistaをNetBSD/i386に移行するためにMATEを使うつもりです。まだ日本語環境は整っていませんが、MATE自体は動くようなので今後の見通しは悪くありません。今は試験的に利用しているだけなのでコンソールでログインしてからstartxでMATEを起動しています。問題は今後もこれでいくかどうかです。

キャラクタベースでログインしてからウィンドウ環境に移行するのでは、まるでDOS+Windows 3.1の時代を彷彿させます。個人的に使うだけなのでこれでも構わないのですが、今風のLinuxではグラフィカルにログインするので、今のMicrosoft Windowsもそうですし、同じ環境を準備しておくことにします。もし使いにくければ、外すのはすぐに出来ることです。

さてディスプレイマネージャとして何を使うことにしましょうか。NetBSD/i386のインストールでXを入れたのであればxdmが入っているはずです。これは昔からありますが、最近は使っているのを聞いたことがありません。できれば当世風のディスプレイマネージャを利用したいと思います。

Webを検索すると言及されることが多いのがSLiMとLightDMです。しかし残念ながらNetBSDのpkgsrcには見当たりません。どちらもWIPにはありますが、何時になったら正式にpkgsrcに取り込まれるか見当もつきません。

試しにLightDMをビルドしてみましたが、問題ありませんでした。しかし環境を整えるための設定方法が分からず、いろいろと自前で設定しておく必要がありそうです。また使われているのが2012年8月30日リリースの1.3.3版というのも気になります。最新は2016年10月15日リリースの1.20.0版なので、かなり更新されているし、バグも取れているのではないかと思います。

一方でSLiMは問題がありそうです。そもそもビルドできませんでした。WIPで使われているのは2008年9月25日リリースの1.3.1版で相当旧いし、SLiM自体が2013年10月2日リリースの1.3.6版を最後に更新が止まっているようです。問題がないからメンテナンスしないのかもしれませんが、事情がよく分からないので今後の利用には不安があります。

当面はLightDM 1.20.0を自前でpkgsrc化してみようと思います。そしてマシン起動後にLightDMでログインできるようにして、ユーザ環境はMATEが使えるようにしてみるつもりです。そこまで出来ればWindowsの代替に近づくでしょう。そして日本語入力環境をインストールし、FirefoxやLibreOfficeなどの主要なアプリケーションが入れば実際に使える環境に近づきます。

2016-11-01

LightDMをpkgsrc/wipからインストール

ディスプレイマネージャとしてLightDMを入れておきます。これはまだWIPなのでpkgsrc本体には取り込まれていません。現状のファイルを別途入手してpkgsrc/wip/lightdmに展開しておく必要があります。

ビルドするために依存関係にあるパッケージが幾つかあるようですが、MATEをビルドしたばかりなので追加でビルドしなければならないパッケージはありませんでした。そのためあっという間にLightDMのビルドが完了しました。

ただしwipの制約なのかPKG_PATHが設定されているとビルドが異常終了してしまいます。これは環境変数を消しておけば問題ありません。

とりあえずlightdm-1.3.3nb1がインストールされたのですが、MATEと同じく、次に何をすればよいのか見当がつきません。

MATEのスクリーンショット

pkgsrcからMATEをインストールしましたが次に何をすればよいのか分かりません。よく分からないながらも~/.xinitrcの最後にexec mate-sessionを入れれば良いみたいです。

とりあえず無事に動いてくれました。

Webで検索した記事を読んでいるとDbusとかHALが必要だと出てくるのですが、まだ設定していません。それでも構わないのか、何か設定しなければならないのか、どちらなのでしょうか。謎です。

今はキャラクタベースでログインしてからウィンドウ環境に移行していますが、Microsoft Windowsのようにウィンドウベースでログインする環境にしてみようと考えています。それが使いやすいか否かは追々考えることにして、そのような環境を準備してみようと思います。