yumでrpm版ProFTPDをインストールする際の注意点メモ

2012 年 2 月 16 日
ProFTPDというサーバアプリケーションがあります。
CentOS標準のvsftpdがセキュリティ・安定性などを重要視している(CentOSの方向性に沿っているとも言えますが)のに対してProFTPDは、
ProFTPD grew out of the desire to have a secure and configurable FTP server, and out of a significant admiration of the Apache web server.
http://www.proftpd.org/goals.html
と書かれているように、モジュールと設定によって機能が拡張できるよう作られています。
モジュールで他サービスと連携して動かすためにあえてvsftpdを使わずにProFTPDを使うわけです。

さて、以前こんなことなどを書いている通り、rpmとyumを愛用しています。インストールやアップデートの際の依存性トラップに引っかかるのを避けるためです。ProFTPDのように公式に存在しなければ、epel・rpmforge・remiレポジトリからのyum installを日常的に利用しています。

ということでProFTPDをいつも通りインストールします。
yum install proftpd
しかし設定してサービスを起動させようしましたが立ち上がりません。ログを見ると、どうやらモジュールの読み込みエラーが出ています。
前回入れて動作したバージョンは1.3.3g、今回は1.3.4a(1.3.4aのaはalphaということではないらしい)ということで、はて1.3.4では何か大きな変更でもあったのか?とRelease Notesを見てみますが、特にそのような記載は見当たりません。

そこで、いくつかの旧バージョンを比較してみたところ、サイズがやけにバラバラであることに気付きました。
proftpd-1.3.3c-1.el6.rf.i686.rpm ... 1.9MB proftpd-1.3.3g-1.el6.i686.rpm ... 3.4MB proftpd-1.3.4a-1.el6.rf.i686.rpm ... 2.1MB
1.3.3gだけ大きい。ちなみにソースファイルでは
proftpd-1.3.4a.tar.gz ... 7.3MB
です。
rpm -qlpで各rpmの中身を比較してみると、どうやら含まれているモジュールの数がだいぶ異なるようです。
バージョンでモジュールの数が大幅に増えたり減ったりするというのはちょっと考えづらいので、その他の違いを見てみます。
proftpd-1.3.3c-1.el6.rf.i686.rpm ... rpmforge proftpd-1.3.3g-1.el6.i686.rpm ... epel proftpd-1.3.4a-1.el6.rf.i686.rpm ... rpmforge
(remiにはproftpdが無い模様)

つまり、rpmforgeのrpmとepelのrpmでは、インストールしても使用できるモジュールが異なる、ということです。configureオプションの--with-modulesに指定されているモジュールの数が違うということになるかと思います。
rpmforge・epel・remiレポジトリを使用可能にした状態でyum install proftpdとしてしまうと、これら3個所の中で単純にバージョンナンバーが最新のパッケージが入ってしまいます。

epelはそもそも、fedora用に作ったパッケージをRHEL系のOSで使えるようにする、というプロジェクトです。 ということは…と思ってfedoraのproftpd-1.3.4-0.15.rc3.fc16.i686.rpmを見てみたところ、やはりproftpd-1.3.3g-1.el6.i686.rpmと同じ内容(いわゆる全部入り)になっています。

本家proftpd.orgがrpmを出していない以上、それぞれのrpmレポジトリが独自にrpmを作成しているわけで、それぞれのレポジトリの考え方によって内容が異なる、特に今回のような場合、具体的にパッケージに含まれる範囲が異なる、というようなことを改めて認識した次第です。

今回の教訓としては…
CentOS公式ではないrpmでは、インストールの前に、configureオプションやインストールされる内容を確認した方が良い
ということになるかと思います。


細かい話をすると、rpmforge版にはDSOモジュールが
mod_quotatab mod_quotatab_file mod_sql
しか入っていません。
epel版は
mod_ban mod_ctrls_admin mod_exec mod_facl mod_geoip mod_ifsession mod_load mod_quotatab mod_quotatab_file mod_quotatab_radius mod_quotatab_sql mod_radius mod_ratio mod_rewrite mod_sftp mod_sftp_pam mod_sftp_sql mod_shaper mod_site_misc mod_sql mod_sql_passwd mod_tls_shmcache mod_wrap mod_wrap2 mod_wrap2_file mod_wrap2_sql
となっています。

立場と義務

2012 年 1 月 8 日

我々の社会には法律があります。当たり前です。
自分が知らない法律によって逮捕された場合に、知らなかったことを理由にそれを拒否することができるでしょうか?
もちろん、逮捕の不当性を後から争うことはできます。が、それにしても「知らなかった」という主張は通るはずがありません。「法の周知が怠られていた」とでも主張しない限り。
もしくは、罰則の無い法律だった場合に、行政指導等が出され、ニュースで取り上げられるなどして実質的なペナルティを受ける場合もあります。
これらは全て、我々の社会で日々起きている当たり前の出来事です。

一方で、我々が知らない法律も多々あります。
通常、自分が直接関係していない業(おもに商売)に関わる法律は、ほとんど知ることがありません。
たとえば、飲食店を経営している人は食品衛生法について知っているでしょうが、私は飲食店で働いたことがないので、その中身をほとんど知りません。
そして、私がお店の人にならない限り、知っている必要はありません。

では飲食店の店員さんが全員、食品衛生法を知っている必要はあるでしょうか?
もちろん、「必ずしも必要ない」ということになります。
・許可/資格を得た人間がいること
・その人間が食品衛生法を知っていること
・設備やその他の従業員に対して食品衛生法に基づいて適切な指導を行なうこと
という前提によって、事業所と従業員全体が合法となるためです。
つまり、誰かが知っており、その人間の影響下にある者は全て「知っていてやっている」状態である、というのが前提になっているわけです。

さて、ようやくここでタイトルのデザイン・プログラムについての話題になります。
Webデザイナーは、自分や自分のプロダクトが影響を受ける法律を知っているでしょうか?

例を挙げると、どのようなデザインであれ「日本赤十字もしくはその許可を得た者」を表す以外の目的で、「白地に赤十字のマーク」を使用できません。
病院や薬局、「ヘルプ」を表すアイコンなどとして使用することはできないわけです。
これは「赤十字使用法(赤十字の標章及び名称等の使用の制限に関する法律)」に定められており、ジュネーブ条約に基づいています。
日本赤十字社もたびたび違法であることを呼びかけています。

経験上、この問いかけに対するレスポンスはだいたい次のようものに分かれます。

1)「知らなかった」「俺そういうのわからない」「俺は判断できない」
冒頭でも挙げましたが、その言い訳は通用しません。
「ある立場にはそれに応じた義務が付随する」という、非常に一般的な話だからです。
その立場に居続けたいのであれば義務を果たす、嫌であれば辞める、どちらかしかありません。

2)「これはこういう意図の広告表現なので違法とかそういうのとは違う」
広告業界団体のガイドラインにも「関連法規を遵守しなくてはならない」ということは当たり前のように書かれています。なぜ書かれているかを説明する必要はないでしょう。
意図が最重要なのは意図する人の頭の中だけであって、世に出る場合には世の中の優先順位に組み込まれるのが当たり前です。

3)「お客さんがこれにしろと譲らないので〜」
「赤十字使用法」にせよ業界団体ガイドラインにせよ、罰則はありません。
最終的には、違法なプロダクトをリリースすることをOKした人の責任です。その責任を負うのがその立場にある人の義務です。
もちろん、ほとんどの場合には、そのような判断がされることは無いでしょう。
が、実際には「なんか下っ端がうるせえことを言ってるんだけど黙ってさっさと作らせろよ」ということを言う人もいるので、「知っていながら世に出る」ということもあります。

3’)「お金をもらってる側だからしょうがない」
実際には、この件が問題になった場合、高確率で「作った側」が責任を問われます。
なぜならば、このような関係では多くの場合、「作った側」がその違法性を伝えた証拠が無いためです。

4)「そういうことはお客さんに言いづらいので〜」
意識する/せざるにかかわらず、「何かあった場合には自分が全ての責任を負う」のを認めることとイコールになるのです。それは言ってしまえば「自分の社会的立場を賭けて違法行為の責任を負う」ということです。負えますかね?

5)「人命にかかわることでもなし、そこまでやらなくても〜」
だからこそ、あえて「赤十字使用法」を例に出したわけです。

だからこそ我々は、言うべきこと・残すべき記録・決まらないと先へ進ませないということをウザがられながらもやるわけです。
もちろん、責任問題はお金の問題だというのもあります。
「日本は訴訟社会じゃないから〜」という人も多くて驚きますが、平成22年の簡易裁判所での民事訴訟件数は130万件強あります。1年間の出生数(100万人強)より多い数です。
これもまた「知らない」だけで、実際には日本でも訴訟はポピュラーな出来事です。

最後に個人的な思いですが、誰もが「知らない」「わからない」「俺じゃない」「言えない」と言いながらそれぞれの立場に居ようとする、そんな社会は、めぐりめぐって自分の命にもかかわりかねません。
これはモラルの問題ではないのです。理想を語っているのでもありません。
2011年に我々が見たものは、そういうものではありませんでしたか?

CodeIgniterで動的にModelを読み込む方法

2011 年 12 月 29 日
CodeIgniterでは、Controller内で
$this->load->model('Sample');
とすると、application/models/sample.phpに記述した"Sample"クラスが読み込まれます。 Sampleクラス内のメソッドをController内で実行させる場合、
$this->Sample->function();
と記述します。

通常はこれだけで問題がないわけですが、では例えば次のような条件を全て満たす仕組みはどのようにして実現するのでしょうか?
  • Controller内のパラメータで読み込むModelを切り替える
  • Controller内にはModel名をハードコードしない
  • Modelはapplication/modelsディレクトリ内に設置したファイルにのみ記述する

対象のModel名が動的に切り替わるということは、上記例のように"Sample"を静的に記述できないということになります。Modelの呼び出しについては
$modelname='Hogehoge'; $this->load->model($modelname);
とすることができます。
しかし、このままではメソッドの呼び出しができません。

このような場合に、非常に単純な解決策があります。
ユーザーガイドの「Models」>「Loading a Model」に、このような例が紹介されています。
http://codeigniter.com/user_guide/general/models.html
$this->load->model('Model_name', 'fubar'); $this->fubar->function();

第2引数を渡すと、その文字列をモデル名として使用できるのでした。
この例だけ見るとモデルをリネームする機能のようにしか見えないわけですが、この方法を先ほどの例とミックスさせると、第1引数を動的に渡しても第2引数のクラス名で固定できるのです。
$modelname='Hogehoge'; $this->load->model($modelname, 'fubar'); $this->fubar->function();

と、この方法で、Modelは動的に(ファイルごと)切り替えることが可能となります。