以前からSourceForge.JPさんで、ドキュメント執筆者とテスト担当者を募集しているのですが、残念ながら良い人が来なくて、自己顕示欲の強いというか思い込みの激しい人が来て手間ばかりかかって結局ご遠慮頂きましたということでそのレポートを。
こんなことはわざわざ書かなくてもよいかとも思いますが、こちらもドキュメントを書いて欲しいため、チャットまでして説明した手間もありせっかくなのでネタにしたいというのもありますし、また変な人がこられても困るのでその予防線と、一応開発日誌と銘打っているブログなのでこういうマイナスなことも隠さずに書くのも面白いかと思ったので書いてみます。
その方(以下Aさんとします)は、某大手のIT企業に勤めているらしいのですが(わざわざご自身で大手IT企業と言ってしまうところはどうかと思ったのですが)、ご自身でもプログラミング言語を作成しているとのことで互いに勉強にもなるかとも思いました。
何回かメールでのやり取りで、簡単な自己紹介、技術概要、開発方針、ドキュメント作成のポイント等を説明し、チャットでさらに補足説明をしました。
で、ドキュメント作成を行わなければならないのですが、Aさんは片手間にしか参加できないとのことで、レビューをやってもらおうとその旨をお伝えしたところ、Aさんから
『後、気になっているのは(もしもですが)参加者がたくさん増えたときに大藤さんの心構えが実はできているか?です。』
とのコメントを頂きました。私はオープンソースに対する心構ができていないとのことなのですが、そもそも『心構え』ということが理解できなくて、真意を確かめることも含めてまずは今回はご遠慮いただく旨のメールを送りました。そうすると、
『確かにメール受け取りました。想定通りの回答です。』
で始まり、
『僕はオープンソースに上げてみようと思ったときに果たして他の人に触らせたり、色々言わせたりできるだろうかと言う質問を自分にしました。』
と来て、
『話をしていて、大藤さんはまだノーの様な気はしていたんです。』
『色々な人の意見を採り入れたいと言っていたが、まだその時期ではないのではと。』
と結論付けておられました。どう突っ込んだらよいのか困ったのですが、まぁ今回はご遠慮いただいてよかったかと思いました。
Aさんの勘違いを指摘しますと、私はADPをGPLで配布していますが、これは利用者が好き勝手にできることを私が認めたことになります。つまり、
『他の人に触らせること』
については私もライセンス上認めております。AさんはGPLをご存知ないのでしょうか。
また、『色々言われること』についてですが、実際にSkypeでAさんとチャットしているときも『Prologが解らない人向けのドキュメント作りを』と指摘されそりゃもっともだと思ったでのでSourceForgeのチケットにも登録しました。
もちろんですが、人の意見を聞きたいといっても、必然的に他の方の意見を取り入れる面と取り入れない面があります。その取捨選択はアーキテクトである私の仕事だと思っています。
もっともADPはプログラミングの初心者を対象としています。ので初心者の方の意見というは極力尊重したいです。ちなみにですが、PHPのようなお手軽な言語を目指しています。のでご意見どしどし受け付けています。
自分自身の若かりしころの反省も含めてITエンジニアの方にコメントしますと、他人とのコミュニケーションをとる上で相手の内面についての不用意な否定はやめた方がよろしいかと思います。Aさんは私に心構えという単語を使いましたが、根本的にオープンソースのプロジェクトをやろう!、という人間が心構えができていないことは、ほぼないです。
本当に心構えができていなくかつ教育が必要な新人を除いて、このような単語を使うことは相手を怒らせるくらいしかできません。もしくは相手から『こいつはコミュニケーション能力がない』と思われるでしょう。
これは仕事の面でもいえるかと思います。大手のIT企業に勤めていたら、出来の悪い協力会社の担当者に向かって思わず『やる気があるのか?』等、同様のことを言ってしまうこともあるかもしれませんが、そう思ったときはじっとこらえて『なぜ、私はこの人がやる気がないと感じたのか?』とじっくり自問自答しましょう。そのときに根拠となる理由が1つでは足りないですし、またその理由が思い込みではないと、確認する必要があります。
『僕はオープンソースに上げてみようと思ったときに果たして他の人に触らせたり、色々言わせたりできるだろうかと言う質問を自分にしました。』
『話をしていて、大藤さんはまだノーの様な気はしていたんです。』
私の話のどこにそう思ったのか不明ですが、私がソースをオープンにし、GPLでリリースした時点で、ノーということはありえません。このように多角的な検証が必要です。
相手を批判する場合(相手の内面の場合は特に)、思い込みで論理を展開しないで自分の考えを吟味する必要があります。さらに、相手の置かれている立場や考え方も考慮に入れましょう。
私も若かりしころ上司から、『口のきき方が悪い』と怒られたりしたことがありましたが、そのときは何で怒られたかよく解っていませんでしたが、おそらくAさんのように思い込みが激しかったのかもしれません。
最近では、あまりこういう面で他人から指摘を受けることもなくなっていましたが、今度は自分が指摘をする番になったようです。
前回のリリースから1週間ちょっとですが、はやくも0.69のリリースです。
前回からの修正が多かったので、バージョンをちょっと進めて0.70の0.01前で、0.69にしました。
先週のリリースからSourceForge強化週間ということで、
チケットシステムを使ってみました。これを使うとポイントがもらえてそのポイントが増えると活発なプロジェクトということで認定される仕組みです。
これがプロジェクト的にはヒットしまして、結構改修が進みました。
ちなみにマイルストーンも立てることが出来ますので次回のバージョン0.7も立ててます。
少々名称に納得できなかったライブラリですが、今回のリリースでライブラリの名称の整理を行いました。
これで停滞していたライブラリのドキュメントを充実させることが出来ます。
最後に2ヶ月ごしになりましたが
以前からアナウンスしていました、Wordpressの高速ビューアーも
リリースしています。
約2ヶ月ぶりのリリースになります。
今回の修正は、
・sendmail述語の追加(メール送信)
・rkey述語の追加(ランダムなキーを取得する)
・乱数をメルセンヌツイスターを使用するように回収
・set_session_cookie述語の追加(セッションIDクッキーの、ドメイン、パス、有効期限、セキュリティを設定)
・now述語の変更(現在時+a秒の表示を行える)
・remap述語の追加(ハッシュキーの交換)
・keys述語の追加(ハッシュキーの一覧を返す)
・DB周りでエラーが発生し終了した場合、ODBCドライバ内で例外となるバグの修正
・?ポストフィックス(評価がfalseでもバックトラックしない)の追加、last述語(直前の?述語の評価結果を返す)の追加
と盛りだくさんになりました。
いろいろ追加・変更点がありますが、面白いのは、乱数のアルゴリズムを標準Cライブラリのものからメルセンヌツイスタ(MT)と呼ばれるものに変更した点です。
詳しくは
ホームページを見ていただければと思うのですが、かなり強力な乱数生成器のようで、perl や php にも導入されています。
ということで、我がADPでもMTを使用することにしました。
作者の松本先生に許可を取りましたところ快く了解いただきました。この場を借りてお礼を申し上げます。
OpenBlocks600の記事で紹介しましたブログビューアーですが、その後、バグ修正やRSS関係の対応をしてから1週間経ち、apacheのエラーログにもエラーが出ていないので、そろそろリリースしようかなと思いソースを眺めていたのですが、あまり教示的なソースでなく『公開すべきか、せざるべきか・・・』と悩んでおったのですが、こういうときは他人はどうしているのかと、最近のWEBアプリの動向でも探ろうかとネットを検索しましたところ、面白い記事を見つけました。
http://satoshi.blogs.com/life/2009/10/rails_mvc.html Ruby on Railsの「えせMVC」の弊害
http://satoshi.blogs.com/life/2009/10/ormappingmvc.html O/Rマッピング技術の進化が皮肉にも助長している「えせMVC症候群」
ブログ主(Satoshi Nakajimaさん)の主張ですが、要するにモデルとコントローラの役割はきちんと分けようねということで、『ビジネスロジックをコントローラに書くのはNG』とのことのようです。
ちなみに私ですが、ちょい書きのアプリだとまぁコントローラでビジネスロジックどころか、SQLを書いたりします。またブログビューアーの構造も思いっきりMVCモデルから逸脱しているので・・・という訳でブログビューアーを書き直そうかなとか思ったのですが、もう少し調べてみようということで、以下、Rubyの作者のまつもとさんの記事を見つけました。
http://itpro.nikkeibp.co.jp/article/COLUMN/20080610/307218/ まつもと直伝 プログラミングのオキテ 第20回 MVCとRuby on Rails
この記事の
7ページ目の表2にRailsのMVCということで従来のMVCとの比較がありますが、その表から2パラグラフ目の説明を引用しますと
一方,HTTPの性質によってUI部分の複雑さはWebブラウザに任せてしまっているWebアプリケーションでは,相対的にUI層が薄くなります。コントローラ相当はほぼ汎用品で十分ですし,モデルとビューのインタラクションも不要です。ですから,モデルをデータベース層とビジネス・ロジック層に分割して,下層をモデル,上層をコントローラと呼ぶようにしたのでしょう。
ということで、まつもとさんの説によるとビジネス・ロジック層はコントローラに記述することになるようです。
かの有名なRubyの作者のまつもとさんが、このように言っておられるのでこの勝負は『Railsでは、ビジネス・ロジック層はコントローラに記述する』で軍配が上がりそうですが、実は先のブログ主さん(Satoshi Nakajimaさん)も知る日とぞ知る方で、過去にマイクロソフト社に勤務されておりWindows95の開発では、Windows3.1との互換性を保つために尽力されたらしく、そのあたりの話は
こちらで参照できます。また先の主張は、実際に
Ruby on Railsを使ったプロジェクト通して行き着いたようでしてそれなりに説得力があります。
このように著名なエンジニアの見解が異なる場合、どのように解釈すればよいのか悩ましいところですが、実行速度についてとか明確に白黒つく場合のように客観的に測定できる事実が無い場合、
『どちらでも良い』
というのが私の経験から来る見解になります。
この手の議論はエンジニアを引き付けるものがあり、熱くなったりするのですが、議論してもみのりは少なかったりします。
私も過去にこの手の議論に巻き込まれたことがあるのですが、特に個々のエンジニアが持つバックグランドが異なる場合、あまり前向きな議論にならなかったです。
今はインターネットがあるので様々なエンジニアの見解を比較することができるので、このように『他の人はどう考えているか?』というのをわざわざ議論しなくても解るので改めていい時代になったと思います。
というわけで、まぁブログビューアーは作り直さずに公開したいと思います。
以前に、ADPを
OpenBlocks600Dに対応させた話を書きましたが、予告(?)どおり
ADP 0.61のリリースを行います。ブログビューワーの方は後ほどということで・・・必要な方はコメント欄にほしいとリクエストください(気持ち急ぎます)。
OpenBlockS600Dのバイナリ版を実行させる場合は以下のパッケージがインストールされている必要があります。
- libboost-regex1.35.0
- openssl
- unixodbc
場合によっては(ソースからコンパイルされる方は)さらに以下のパッケージが必要です。
- libboost1.35-dev
- libssl-dev
- unixodbc-dev
ちなみにWindows版のバイナリは、特に依存関係はないので、そのまま実行できます。
0.60でパフォーマンスを上げたのですが、バグがぼろぼろ出まして修正しました。だいぶ品質が向上したかと思います。もっとも、もっと本格的なテストプログラムを記述しないとダメだと思いますが・・・そのノウハウの蓄積は今後に期待ですね・・・。
ただ一部の修正(メモリの管理関係)でパフォーマンスが下がったのでこのあたりはまた変更する必要があります。オープンソース&マイナープロジェクトの良いところはバグを恐れずにガシガシ修正できるところですね、お金を頂戴するプロジェクトではここまで冒険はできません・・・。
また、今回のリリースではwol(Wake On Lan)述語(関数)も追加しています。文字通りWOLパケットを送出する述語です。
何でこんな述語を追加したのかと言いますと、
前回の記事のとおり最近モバイル環境を構築したのですが、これに加えてVPNを構築すると外部からイントラ環境にログオンすることができ、そうするとリモートディスクトップで私のマシンにログオンしたくなるのですが、ログオンするためには電源が入っていなければならず、とは言っても何時ログオンするかどうか解らないマシンの電源を入れっぱなしにする訳にもいかない、という訳でWOLで電源を入れることになり述語を追加しました。
WOLを送信するマシンは、LED電球並の消費電力のOpenBlocks600Dにすればよろしいでしょう。外部からはウエブから入るようにします。つまりブログビューアと同様にADPでWEBページをホストします。
というわけで、以下、WOLのコードになります。
wol.awp
#!/bin/adp -
<%;
+keycode("password"); # パスワードを指定
+machines("00-11-22-33-44-55", "machine1"); # MACアドレスとマシン名(適当でよい)を指定
+machines("66-77-88-99-aa-bb", "machine2"); # 複数あるときは同じように複数行にわたって記述する
+baddr("192.168.1.255"); # ブロードキャストアドレスを指定
,query("KEY").keycode, $mac =query("MAC"), wol($mac, =baddr);
%>
<html>
<head>
<meta http-equiv="Content-Language" content="ja">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>ネットワークブート</title>
</head>
<body>
ネットワークブート
<%,query("MAC",$mac),%><%=$mac%>BOOT中<%;%>
<br>
<form action="wol.awp" method="post" OnSubmit="return confirm('起動しますか?')">
キーコード:<input type="text" name="KEY" value=""><br>
起動マシン:
<select name="MAC">
<%,machines($mac, $name) ,%>
<option value="<%=$mac%>"><%=$name%>
<%,next;%>
</select>
<input type="submit" value="boot">
</form>
</body>
</html>
※2012/05/21 Ver 0.81のリリースにあわせて更新
ファイル名はwol.awpとします。form actionの引数を変えればファイル名自体はなんでも構いません(まぁ解らないようにした方がよい)が、拡張子はawpにする必要があります。
awpとは「Adp Web Page」の略で、ADPでWEBページをホストするモード(AWPモード)の拡張子になります。
Ver0.61では、拡張子がawpまたはcgiのみAWPモードになります。
これをApacheでcgiスクリプトとして、ホストすればOKなのですが、その前にスクリプト使い方の説明を、
先頭の3行目から6行目が設定になります。最低限のセキュリティということで、
パスワードの指定(3行目)と起動対象のマシンのMACアドレスと名前(4,5行目)と
起動対象のマシンがあるブロードキャストアドレスを指定(6行目)になります。
スクリプトの動作環境の設定ですが、PerlやPHPのCGIと同様にセットアップして頂けれたよいのですが、以下、apacheでのセットアップを簡単に説明します。
adpの実行ファイルを、/bin に保存します。/binがダメな方は、上記のスクリプトの1行目でadpのパスを指定します。
apacheのconfファイルですが、DirectoryのOptionsにExecCGIを追加し、AddHandlerで .awpを追加します。
以下、サンプルを載せます。
<Directory "/var/www/html">
Options FollowSymLinks ExecCGi +Includes
DirectoryIndex index.html index.php index.awp
AddHandler cgi-script .awp
AddHandler cgi-script .cgi
AllowOverride None
Order allow,deny
Allow from all
</Directory>
Windows+IISでも動作可能です・・・設定方法は・・・まぁがんばってみて下さい。
(ご要望がありましたら設定方法を記載します・・・)