it: 2004年3月アーカイブ

バッドノウハウからバッドラッパーへ - www.textfile.org より。

このようなバッドノウハウを必要とするシステムをバッドシステムと呼ぶことにします。ここではバッドシステムに対するもう一つの解決法としてグッドラッパーの反対のバッドラッパーを提案します。

共感しました。
sendmail に対する postfix なんかも(中身は知らないですが^^;)そういう感覚ではないでしょうか。

互換性は wrapper で確保。いいですねぇ。
まぁ、実際のところは、WindowsNT のようなケースはともかく、オープンソースソフトウェアの場合、新機能/内部的な信頼性などで相当にアピールできる部分がなければ、wrapper により表面のインターフェイスの互換性を保っていますと言っても、「それなら今までのでいいじゃん」となってしまう可能性があるわけですが^^;。バッドノウハウの駆逐にはかくも労力が必要であることよ…。

ちなみに、私ならレガシーな振る舞いと新しい振る舞いの両方が必要になったらさくさくとモジュール化しますね。
とにかく交換可能性を保つために、依存性の限定化が重要ですねぇ。ってそれは wrapper というアプローチとはまた違うか^^;。そう考えれば、インターフェイス部分すら(wrap ではなく)pluggable-module にするというアプローチもありますね。

要求分析」の続きです。
今回カテゴリ分けも出来ないくらいまとまりありません^^;。一応続き記事ということで「格言・思想」に入れますけど。
もうね、こんな方向までネタを持っていくと対象読者がどういう人なんだかわけわかめ状態だな^^;;。それでも一応他業種にも通じる話に持っていこうと努力はしてるつもりですが…。

現在は、ある程度の規模の開発になると分析を行った人がプロジェクトが終るまで在籍していることが少ないですが、これは相当に(それこそ日本中探しても何十人もいない程度に)「仕事」ができる人でなければプロジェクトにとって大きなマイナスであると常々思っています。

顧客から得た要求(そしてその目的)の全てに加え、分析者の知識と経験に基づく判断まで含めてすべてドキュメントとしてまとめるのは不可能です。そして、たとえそれが出来たとしてもその膨大なドキュメントを後の担当者に読ませ、理解させている時間は通常ありません。

ソフトウェア開発においても工業生産と同じような分業&作業の単純化が推進されていた時代がありましたが、もうそろそろそのやり方ではだめだと気付かれつつある…はずなんですが。

未だにソフトウェア技術者を交換可能と考えている組織は多いようです。

プログラマ一人という単位で見ても、職人変われば思想も変わるので、いなくなると元のプログラムの意図はなかなか読み取れないでしょうけれど、もっとひどい場合は、最初に顧客と接して要求を聞き出した人が実装フェーズ(実際にプログラムを書く段階)には誰一人残っていないなんていうプロジェクトもあるようです。

顧客との折衝や質問を行う担当者は前担当者の意思と知識を引き継ぐことはできず、顧客に対して既に何度もされた質問をまた行います。前担当者が残したドキュメントは新担当者のドキュメントと重複が多くなり、且つ微妙に異なっているため、それを読まされる設計/実装担当者は混乱するだけでなく、幾度となく繰り返される徒労に飽き飽きしてますますドキュメントを読まなくなります。

規約で縛ろうとしても無理でしょう。

どうすればよいか?

各自の責任感を最大限に引き出せるプロジェクト体制にすることです
要求を聞いた人は顧客に変わって、或いは顧客も引っ張り出して設計のレビューに参加すべきです。
設計を行った人は(実装担当のスキルによっては)ソースレビューまで参加すべきです。
もっともよいのは、分析/設計/実装を同一人物が行うことです:p。
人数が多いプロジェクトであれば、最高の分析技術者を据えて、その人に最後まで面倒を見てもらうことです。
知識/ノウハウの伝達ができればよいですが、それすら難しいし、なにより能力は伝達できないからです

また、プロジェクトメンバー全員の目的がプロジェクトの終了(完成、もっと言えば成功)であることを実感させることです
「ここに書かれた通りにプログラムを書けばいいんだよ」なんて事をやっていたら手抜きされます。あるいは「そこに書かれたこと」の不備に業を煮やしたプログラマは逃げだします。

ところで、世の中には SE なる職種が存在するそうです。System Engineer だそうで。
私の名刺にも System Engineer って書いてるような気もしますが、うちの場合肩書きに何書いてもいいので「育児担当」でもよかったのです。

世の中的には要求分析から設計あたりまでを担当する人、らしいです。
プログラムを組めないのに SE という職種を目指す人がいたりするそうです。不思議なことに。
本質的にプログラミングというのは一人で最初から最後までできる人間がやることです。

まぁ、逆にプログラマーという職種を作業員と勘違いしている上役(或いはプログラマー本人)もいるようですが-_-。

追伸
コンサルタントという職種も SE と同じ怪しさがありますが、こちらはより「提案」や「人(の配備など)」に重きを置いていたりするので、さすがに要求されるセンスが違います。でも、自分でやってみたら大変かもしれないことを平気で提案してしまうなんちゃってコンサルが多いですね。

というわけで、改修いたしました。

version 0.2 のダウンロード(新しいバージョンがある場合はトラックバックにて辿れます)

概要は
人気ページ一覧/リンク元一覧表示機能公開
なんですが、今回は README を真面目に書いたのでここでは変更点のみ。

2004-03-03 version 0.2

* オーナーによるアクセスをカウントしない設定を可能にした
* リンク元リストの出力形態を選択可能にした
* フィルタリング設定を変えた場合に、古いログに現在のフィルタを適用できるようにした
* マイナーバグ修正


ふぅ。これでしばらく弄ることも無いかなっと。後はフィルタ調整程度だからリリースするまでもないし。

(追記)
おっとそういえばログが肥大化した時に備えて差分集計はできるようにしとかないとだった。
ま、しばらくは大丈夫だな^^;。

(追記)
結局この後結構いじくった…。くそぅ perl めっ変数関連の仕様が気持ち悪過ぎなんだよっ…-_-。

改名しました^^;
現在このサイトに設置しているような、「人気ページ一覧/リンク元一覧」を任意のサイトに適用できるソフトウェアの version 0.1 を公開します。

Version 0.1 のダウンロード(新しいバージョンがある場合はトラックバックにて辿れます)
注意:ココログ以外に CGI を設置できる web スペースが必要です。

特徴

現状の特徴は、以下です。

  1. ページ側への埋めこみが楽。
  2. カウントから除外するコードを簡単に追加可能。
  3. 同一視するページを指定可能。
    • 例えば、http://shin.txt-nifty.com/ と http://shin.txt-nifty.com/philosophical/ を同一視。
    • URL への "index.html" の有無などについても同一視が可能。
  4. リンク元ランキングについては一つのスクリプトでリアルタイム反映。
  5. リンク元ランキングを任意の箇所に埋めこみ可能。記事に埋めこめば、トップページの各記事毎に「この記事へのリンク元」を設置可能。
  6. サイト内アクセスランキングについては記録/集計を分けている。ランキング表示は軽い。
  7. リスティングする最大件数の指定が可能。
  8. 集計は密かに web からキック可能^^;。


まぁ、自分の欲しい機能が優先されているので、検索キーワードの表示などは対応していませんが(リンク元にリスティングされた検索エンジンからの URL をクリックすれば見れるし)、逆に、検索以外からの訪問者、つまり「読者」や、他のサイトからのご紹介などのカウントが見えるようになっています。


アーカイブ内容

ダウンロードして展開すると、以下の構造になります。

ディレクトリ属性用途
cgi
+-data777ログ置き場(ディレクトリ)
+-ref.pl644設定と実処理
+-refer_s.cgi755記録処理(兼リンク元一覧の表示)
+-show_referrer.cgi755このページへのリンク元一覧の表示(テスト/iframe 用)
+-show_referrer_s.cgi755このページへのリンク元一覧の表示(JavaScript 版)
+-show_statistics.cgi755人気ページ一覧の表示(テスト/iframe 用)
+-show_statistics_s.cgi755人気ページ一覧の表示(JavaScript 版)
+-update_statistics.cgi755人気ページ一覧の更新
README_sjis.txtたいしたことは書いてません:p
refer.js記録処理呼び出し用ヘルパー


設置方法

1. 設定の編集

ref.pl を編集します。テキストエディッタで開いて、以下の部分をご自身のサイトに合わせて修正してください。
以下はこのサイト用の修正例です。

# 集計対象とする URL
# この URL 配下から送られたデータしか処理しません。
my $my_url = "http://shin.txt-nifty.com/";

# 同一視する URL のリスト
# 左の URL へのリクエストは右の URL へのものとみなします。
# 完全マッチなので補正しそこねることもあるかもしれません。
my %equals = (
'http://shin.txt-nifty.com/', 'http://shin.txt-nifty.com/philosophical/',
);


2. CGI のアップロード

cgi ディレクトリ配下を丸ごと Web サーバの CGI 実行可能なディレクトリにアップロードしてください。
そして、各ファイルの属性を上記に示したように変更してください。

refer.js は、ココログ上でも別の Web サーバ上でも構いませんので、URL で参照可能な場所にアップロードしてください。
アップロードせずに、ここに設置したものの URL(=http://shin.txt-nifty.com/philosophical/refer.js) をそのまま参照しても構わないかと思います。


3. サイト側の設定

3-1. Web ページへ記録処理の設置

ココログの方は 3-4 へ進んでください。
以下のような行を任意の箇所に追加します。

<script type="text/javascript" src="http://shin.txt-nifty.com/philosophical/refer.js"></script>
<script type="text/javascript">refer("{CGIを設置したサイト}/cgi-bin/refer_s.cgi");</script>

サイト内のあらゆるページで表示される箇所(サイドバーなど)、あるいは、集計対象としたい各ページ上に記述を追加します。
リンク元ランキングを表示しますが、記録を兼ねているので同一ページ上に複数回この記述が現れないようにご注意ください。


3-2. 人気ページ一覧の表示処理

とりあえずは、飛ばしても構いません。
「人気ページ一覧」を表示するなら、サイト内のあらゆるページで表示される箇所(サイドバーなど)、あるいは、表示対象としたい各ページ上に以下の記述を追加します。

<script type="text/javascript" src="{CGIを設置したサイト}/cgi-bin/show_statistics_s.cgi"></script>

注意:UTF-8 以外の Web サイトへの設置に関して
上記の script による人気ページ一覧表示では、Web サイトが UTF-8 なページでなければ正常に動作しません。
UTF-8 以外のページに「人気ページ一覧」を表示したい場合は代わりに以下のような iframe の指定を追加してください。

<iframe frameborder="no" width="100%" height="120" src="{CGIを設置したサイト}/cgi-bin/show_statistics.cgi"></iframe>


3-3. リンク元一覧の表示処理の追加

飛ばしても構いません。
もし、一ページ中に複数のリンク元一覧を表示したい場合(blog 記事本文に埋めこみたい場合など)は、blog 記事中に以下の記述を追加してください。

<script type="text/javascript" src="{CGIを設置したサイト}/cgi-bin/show_referrer_s.cgi?リンク元を表示したいページのURL"></script>

blog の場合、記録処理をサイドバーに記述して、記事中にここに書いた記述を行うことで、トップページやバックナンバー表示時に記事毎にリンク元一覧を表示することができます。この記事でも実験的に埋めこんでいます。


3-4. ココログの場合の設置方法

上記の記録処理/一覧表示処理をココログに設置する場合の具体例です。

まず、タイプが「リンク」であるマイリストの作成を行います。
マイリストの設定で、「メモの表示」を「テキスト表示」に設定します。
ダミーの URL を記述して新しいリンクを作成し、「メモ」欄に以下のような記述を追加します。

<h2>人気ページ一覧</h2>
<script type="text/javascript" src="{CGIを設置したサイト}/cgi-bin/show_statistics_s.cgi"></script>
<h2>このページへのリンク元</h2>
<script type="text/javascript" src="http://shin.txt-nifty.com/philosophical/refer.js"></script>
<script type="text/javascript">refer("{CGIを設置したサイト}/cgi-bin/refer_s.cgi");</script>

マイリストをサイドバーに表示するように設定します。


4. 「人気ページ一覧」の更新

「人気ページ一覧」を表示しない人には無関係です。
「人気ページ一覧」はアクセスログを定期的に集計して生成しています。
「人気ページ一覧」の更新は、update_statistics.cgi を起動することで実行できます。
cron を設定するのがよいです。

私は以下のような crontab ファイルを作成して、

1,31 * * * * cd /path/to/cgi/dir;./update_statistics.cgi

crontab ファイル名

で登録しています。上記は30分おきに実行という意味です。

また、ブラウザから http://サーバ/cgi-bin/update_statistics.cgi?dummy
のようにダミーパラメタを付加した URL を叩くと手動更新ができます。


以上で設置は完了です。以下はおまけです。


スタイルの調整

リンク元一覧には class="referrer-list" が指定されています。
人気ページ一覧には id="statistics" が指定されています。
内部の A 要素のスタイルの方が優先されてしまいますが、これを元に多少の調整が可能です。
この辺は後のバージョンで改修するかもしれませんけど。


除外するアクセスなどのカスタマイズ

ref.pl の最後の方に、
need_recording_access
need_recording_ref
normalize
といった関数があります。これらを修正すると、人気ページ一覧/リンク元一覧にリスティングする URL を調整できます。
今はかなり説明不足な気もしますが、わかりにくい点がありましたらご質問くださいませ_o_。


注意点/問題点

JavaScript がオフになっているクライアントのアクセスは集計されません。
そのクライアントには表示もされません。
SSI などが利用できない環境に導入できることを優先しているため、SSI 版は今のところ対応予定はありません。


将来

とりあえず、集計から除外すべき物をブラッシュアップします。自分によるアクセスを完全に除外するようにしようかと。
その後は一つのシステムで複数サイトの面倒を見れるようにしようかな…。


謝辞

JavaScript での UTF-8 エンコードには、JavaScriptにおけるURLエンコードの処理のコードを使わせていただきました_o_。


その他

perl なんて嫌いなんですが、配布(特にココログユーザ)を念頭に置くと perl で書くしかなかったので perl です。
perl なコードは怪しい所があるかもしれませんです。変数のスコープもよく知らないで書いてるし^^;。
というわけで perl 慣れしていないコードです。ツッコミありましたらよろしくお願いいたします_o_。
設定を一ヶ所にまとめたかったから、ref.pl にほぼ全ての処理を突っ込むことになってしまった…。require した先の変数も取り込めるんでしょうか?>識者
はっ!!…設定取得関数化すれば間違いなくうまくいくか…でも無駄に長くなるな…。

このアーカイブについて

このページには、2004年3月以降に書かれたブログ記事のうちitカテゴリに属しているものが含まれています。

前のアーカイブはit: 2004年2月です。

次のアーカイブはit: 2004年5月です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。