2023-11-09

mopdの実装を調査するためにmopd/mopd.cを読んでみました。オリジナルのmopd-2.5.3が各OSの実装で変更されており、似たような変更を加えていますが、統一化が図られている訳ではないようです。 

  • mopd.cを見ると、MOPD(8)では説明されていないオプションが実装されています。ただしOpenBSD版のMOPD(8)では、そのオプションの説明が加えられています。またNetBSD版では、-sという新しいオプションが追加されています。
  • オリジナル版では、大域変数Programを用いて、argv[0]からプログラム名を得ています。ところが他の実装では、関数getprogname()や変数__prognameを利用するように変更が加えられています。
  • デーモンとして動作させるため、オリジナル版ではfork()を呼び出したりしていますが、他の実装ではdaemon()を利用するように変更が加えられています。

 

オリジナル版も他の実装にも、以下のような処理があります。このロジックならば、ForegroundFlagが指定されておらず、DebugFlagが指定されている場合に、このメッセージが出力されるという事です。しかしメッセージの「not running as daemon」と、ForegroudFlagが指定されていないという状態とが、整合していない気がします。

if ((!ForegroundFlag) && DebugFlag) {
    fprintf(stdout, "%s: not running as daemon, -d given.\n", Program);
}


MOPD(8)では、SEE ALSOにbpf(4)が記載されています。BPFというのはBerkeley Packet Filterの事だという事しか知らないので、勉強しておこうと思います。

2023-11-07

mopd/process.hのバリエーション

mopdの実装を学ぶため、mopdに置いてあるファイルを一つずつ見ていくことにしました。おそらく、ソースを読むために必要となる派生的な技術に手を出す必要が出てくると思いますが、それもこれも勉強だと思います。短期間に全力疾走して解析を終えることにはならないでしょうから、長期に亘ることを意識して、TW5で情報を整理しながら進めていこうと思います。


まず最初にmopd/process.hから見ていきます。このファイルは、コメントを除けば、10数行しかありません。

#ifndef _PROCESS_H_
#define _PROCESS_H_

#ifdef NO__P
void    mopProcessDL (/* FILE *, struct if_info *, u_char *, int *,
                         u_char *, u_char *, int, u_short */);
void    mopProcessRC (/* FILE *, struct if_info *, u_char *, int *,
                         u_char *, u_char *, int, u_short */);
#else
__BEGIN_DECLS
void    mopProcessDL __P((FILE *, struct if_info *, u_char *, int *,
                          u_char *, u_char *, int, u_short));
void    mopProcessRC __P((FILE *, struct if_info *, u_char *, int *,
                          u_char *, u_char *, int, u_short));
__END_DECLS
#endif

#endif _PROCESS_H_

ここで「__BEGIN_DECLS」と「__END_DECLS」のペア、「__P()」というマクロらしきもの、「NO__P」という定義が利用されています。これらが何かを調べるところから始めていきたいと思います。


まず「__BEGIN_DECLS」と「__END_DECLS」は、Web上にある記事「C言語系 / NetBSD1.6における setjmp(), longjmp() の実装(2) (v1)」で説明されていました。同様の説明は他にも見つかったので、それ自体は難しいことは何もありません。ただし調べても不明だったのは、なぜ「extern "C"」を直に記述しないで、これらを使うのかという事です。しかも「8.1 Writing C header files」では、「BEGIN_C_DECLS」と「END_C_DECLS」を使うことにしています。何か歴史的な事情があったのではないかと思うのですが、その経緯がわかりませんでした。


次に「__P()」というマクロは、初期のC言語とANSI Cとのプロトタイプ宣言の違いを吸収するために使うようです。mopd-2.5.3が何時から開発されていたのか、ChangeLogなどがないので、不明ですが、その当時はK&R CとANSI Cの違いを気にする必要があったのでしょう。しかし2023年の今となっては、あまり気にしなくても良さそうです。

 

最後に「NO__P」という定義は、otherOS/Makefileの中で定義されているのを見つけました。rs6000-aix3、sun3-sunos4、sun4-sunos5などの環境下では定義されるようです。多分それらでは「__P()」が存在しないのでしょう。


このファイルがどのように変更されているかを確認してみました。

  • NetBSDでは、「NO__P」の定義を確認している箇所が無くなっていますし、「__P()」も使っていません。
  • OpenBSDでは、NetBSDと同様の対応に加えて、「__BEGIN_DECLS」と「__END_DECLS」も消えています。
  • FreeBSDでは、portsのパッチが増え過ぎないようにしたかったのか、何の変更も加えられていません。
  • Linux版は、NetBSDの変更を取り込んでいるようですが、「NO__P」の定義を確認している箇所が無くなっているものの、「__P()」は残っています。

2023-11-04

mopd-2.5.3の派生

VAXstationなどDEC製品はネットワーク上に存在するマシンから情報を貰ってブートさせることが出来て、これをMOP(Maintenance Operation Protocol)と呼びます。OpenVMSなどDEC製OSであれば当然MOPサーバになれるのですが、NetBSDやLinuxであってもmopdを動かしておけば、MOPサーバとして機能させることが可能です。

 

調べてみると、以下のOSでmopdが動くようです。

 

これらは全て「mopd-2.5.3.tar.gz」という実装から派生していますが、現時点での実装は各々異なっているようです。

  1. NetBSDとOpenBSDは、OSのusr.sbinとして取り込まれており、OSのポリシーに合わせた変更が行われているように見えます。
  2. FreeBSDは、portsとして提供されているので、必要最小限の変更だけで済まされている印象です。
  3. Linuxは、READMEにも書かれていますが、NetBSD版を取り込み、OpenBSD版などの変更を参考にしているようです。
  4. 各OS版とも、オリジナルの「mopd-2.5.3」と構成がほぼ同じになっています。しかしNetBSD版は、mopa.outというコマンドが消えており、mopcopyというコマンドが追加されています。


手持ちのDEC製ワークステーションを生かすために、mopdを準備しようと思っています。どれを使っても構わないとは思いますが、MOPの理解を深めるために、それぞれの変更箇所を詳しく調べてみようと思います。

2023-10-29

北海道新幹線札幌延伸と並行在来線

北海道新幹線の札幌延伸は、令和17年度(2035年)開業の予定を5年前倒しし、令和12年度(2030年)を目指すことが平成27年1月に決定していたとのことです。開業時期が前倒しされても当初予定どおりであっても、並行在来線の扱いは議論されることになります。結局は2022年夏には長万部小樽間がバス転換されることが合意されました。


北海道新幹線札幌延伸が前倒しされた背景には、2030年の冬季五輪を札幌市が招致していたためと言われています。しか2023年10月に招致を断念することになり、併せて札幌延伸の開業時期も不透明になっています。さらに全国各地で運転手不足によるバスの減便や路線廃止が多発してきています。その中で、函館本線山線のバス転換も暗雲が立ち込めているようです。鉄道を廃止してバスに転換しても、そのバス路線が次第に消えていくという結果を招いているようです。

 

 バス転換されずに鉄路として残っても、JRから切り離されて第三セクターに転換されてしまうと、青春18きっぷのように、鉄道に乗車すること自体が目的のような旅は不便になります。乗客が少ないからという理由で路線廃止を繰り返していると、函館本線の函館長万部間のように、JR貨物の輸送に差し障るというような問題すら出てきてしまいます。

 

JRは地域ごとに分割されていますが、都市部が儲かっていて、それ以外が赤字になっているという構造だと思います。これは国鉄時代も同様だったでしょう。儲かっているところだけ残れば、それ以外は廃止しても構わないとなると、公共交通とは言い難い気がします。

2023-10-27

Leciono dek kvar 「講演が始まります」

先日からPodcastで「ゆる言語学ラジオ」を聴いています。第268回「緻密に設計された人工言語の文法は、あまりにも美しい【エスペラントの文法】」では、白水社から出版されている『ニューエクスプレスプラス エスペラント語』に収録されているダイアログが紹介されていました。


ある大学のキャンパスで、女性が通りかかった男性に「すみませんが、7番教室はどこにあるか教えて頂けませんか?」と声をかけるところからダイアログが始まります。こういうのは、他の言語の入門書でも良く登場する状況ですが、この入門書では、ブラックジョークとも言える展開を示します。

 

楽しくエスペラント語を学べるようにしたいという編集側の意図があるのかもしれません。しかし、このような展開のダイアログでなくても、「楽しく学べる」エスペラント語のダイアログは、いくらでも考えられるのではないかと思わなくもありません。

2023-10-19

Tidyverseのggplot2による複数系列の折れ線グラフ

以前よりRを利用してデータのグラフ化を行っていました。僕はMicrosoftのOffice製品を持っていないので、Excelがあれば簡単に作れてしまうようなグラフでも、何か他の方法で行わなければなりません。Microsoft Officeは持っていませんが、LibreOfficeなら利用しているので、Calcを使えばExcelと同様なグラフは描けそうです。しかしExcelやCalcのようなWYSIWYG的アプローチは、ちょっと試してみる程度なら簡単で便利ですが、定期的に同じような作業を繰り返す場合には、かえって手間がかかると思っています。

 

そこで、Rを利用してCSVからグラフを生成することにしています。ただしRの利用に慣れていないので、Webで事例を探しつつ手探りでスクリプトを組んでいるので、ロジックの見通しが悪いし、簡単に出来ることを、わざわざ複雑に処理しているようか感覚が抜けきれませんでした。一昨年に放送大学で「Rで学ぶ確率統計('21)」を受講しました。そこで「Tidyverse」というものの存在を知り、従来のRとは違いがあり、便利そうではあるものの、完璧に理解するには至りませんでした。

 

最近になって再びCSVからグラフを描く必要がでてきました。従来から慣れている方法でもグラフは描けそうですが、これを機会に改めてTidyverseを理解してみることにしました。特に、ggplot2を使えば、従来の方法よりもグラフが統一的な方法で描けそうです。


まずは、単純な折れ線グラフを描く練習をしてみて、Tidyverseやggplot2の使い方に慣れてみました。よく理解できたとは言えませんが、グラフを描くのに最低限必要な点は理解したと思います。


次に、同一グラフ内に複数の折れ線グラフを描く場合、ggplot2では如何に処理するのか調べました。ggplot2を使えば、同一グラフに折れ線グラフを追加していく事はできるようです。試してみたら、確かに出来ました。しかし折れ線グラフを追加するたびに関数「geom_line()」が増えていくので、ロジックがスッキリしません。しかも折れ線グラフを数本追加するくらいなら、力業でなんとかできるかもしれませんが、何十本も追加するとしたら(やれば出来るかもしれませんが)やっていられません。


僕が悩んでいるような事柄はFAQだろうと思ったのですが、Webを検索しても解決策が見つかりません。もしかすると検索キーワードが悪いのかもしれませんが、適切な検索キーワードが与えられるということは、ほぼ正解を知っているという事なので、何もわからない場合は検索キーワードすら思いつかないのです。そうこうしているうちに、次のようなWeb記事に辿りつきました。

 

ここで後者の記事の中に以下のような事が書かれていました。サラッと書いてありますが、これが僕の求めていた情報でした。

今のwide形式のデータだとグラフを作りづらいので、long形式に変換したいと思います。「tidyr」という便利パッケージの「gather」関数を使ってみました。

 

ここで言及されている関数「gather()」は、答えを求めて闇雲にWebで検索を繰り返していた際にも見かけたような気がしますが、その際には関係ないと思って、読み飛ばしていました。

 

試行錯誤を繰り返しましたが、これでCSVから複数系列の折れ線グラフを描くことが出来そうです。

2023-10-01

SMS認証の着信メールを振り分けたい

先月突然電源が入らなくなったスマホを、急遽機種変更し、利用環境を復旧してきました。壊れた機種と全く同じ環境ではありませんが、設定の見直しも含めて、ほぼ落ち着いてきました。もし何か方法があるなら、なんとかしたいと思っているのが、SMS認証の着信メールを振り分けることです。

 

新しいスマホではプラスメッセージでメールを受信することにしました。SMS認証のメールもこれで受けます。それは「受信フォルダ」に入ります。もし移動したいなら、手動で移動されることは可能ですが、自動的に移動させる方法はないのでしょうか。Googleの「連絡帳」にSMS認証の送り元を登録して、振り分けルールを設定するということになるのかもしれません。

 

もうちょっと簡単な方法があれば助かるのですが、なさそうな気もします。