つ■
※Amazon.co.jpからのおことわり:これまで漫画のタイトルにつき除外しておりました『マンガ嫌韓流』と『マンガ中国入門 やっかいな隣人の研究』を今回よりランキングに含めております。
※ランキングの対象書籍にコミックは含まれていません。
- 隊長
なんだってー?!!
- 勅使河原
っっ!…いつのまに?!
- 勅使河原
3
- 隊長
2
- 勅使河原
1
- 隊長
どかーん
- 勅使河原
わーい
- 隊長
週刊オブジェクト~。始まるよ~。
- 勅使河原
(スパーン)
- 隊長
あいたっ…何をするんだい勅使ウサギ君。
- 勅使河原
勅使ウサギは置いとくとして、週刊オブイェクトのパクリか貴様?!
- 隊長
ははは、パクリとは酷いなあ。週間オブジェクトなら既出なのでそういわれても仕方がないのだが。
- 勅使河原
そっちは二重に間違えてます……orz
- 隊長
それはともかく、勅使ウサギ君。本番中だということを留意するように。ではデザインパターンの勉強をしようじゃないか。
- 勅使河原
でざいんぱたーん?
- 隊長
うむ。プログラム設計時にありがちな問題に対してどう解決したらいいかというアリガチパターンをまとめたものだと思っておけばいいね。再利用しやすかったり、メンテナンスしやすくなってとてもいいものなのだよ。
- 勅使河原
へー、それはすごいやー
- 隊長
勅使ウサギ君はなにやら投槍風味だな。今日のお題は Iterator パターン としよう。
- 勅使河原
Iterator パターン?なにがなんだかわからないやー。なにしろぼくうさぎだしー。
- 隊長
うむ、その無表情な悲哀ぶりが着ぐるみとマッチして良い演技である。
Iterator パターンというのは、とある『物の集合』に含まれている『物』に繰り返しアクセスして何かの処理を行う時に使うんだ。『集合に順番にアクセスする』部分を切り離しておくんだ。
そうすると、例えば単なる順番じゃなく、アイウエオ順にしたいとか、大きい順にしたいとかの希望があっても『集合に順番にアクセスする』部分を入れ替えればいくらでも対応できるんだ。
それに、『物の集合』自体に変更があっても『物の集合』を使っているのは『集合に順番にアクセスする』部分だけだから、そこだけ直せばいいんだよ。- 勅使河原
うわー、たいちょーさん、それはべんりだねー。
- 隊長
それじゃあ、例を見てみようか。
- 勅使河原
はーい。
- 隊長
さてさて、勅使河原君。ネット上の議論とは暇人のものだろうか?
「有害ゲーム」規制の関係では、松沢知事がブログのコメント欄に付けられたコメントに「誠実に回答」したところでコメンテータの方々が納得することはないでしょうし、また、知事もまたそれらのコメントを見た上でなおもその見解を維持しているのですから、今後いくら同じようなコメントをそのブログにぶつけられたとしても、考えを変えることは先ず期待できないでしょう。
そういう意味で、「これ以上議論を続けていても、お互いに相手を説得できないことが明らかになる」ということは世の中にはよくあることです。一応意見を一本化しなければならない場合には、ある程度のところで議論を打ち切って所定のルールに従って採決したりするわけです(そのような採決ルールに従うことを論争当事者間に強要できない場合は、その問題について意見が一本化されていることを前提とするものは諦めることになります。)。
いずれにせよ、議論の相手方が反論しなくなるまで延々と議論を続けるということは、ごく例外的な場合を除けば、一般社会ではほとんど行われていないのが実情です。
他方、ネット上での「論破」というのは、社会一般における「論破」という言葉の意味とは異なり、「議論の相手方から議論を継続する意思を奪うこと」程度の意味で用いられることが多いようです。
そのような意味における「論破」を目指す「議論」においては、匿名性の陰に隠れることによって羞恥心を麻痺させることができ、かつ、議論の相手方よりもネットでの「論争」に費やすことができる時間(複数人で共同して特定の相手方と「議論」をしている場合は当該複数人がネットでの「論争」に費やすことができる時間の総計)が相手方のそれを圧倒しているととても有利です。
- 勅使河原
でもだいたいネット上の議論なんてそんなもんなんじゃないですかね?この小倉エントリコメント欄そのものが踊ってるじゃないですか。トニオ氏が『証明してみろ』といって、JSF氏が『閉鎖前にコメントは減っている』と証言した回答が、『おまえらのやり方が不快だ』なんて、議論も何もなってない単なる感情論が踊る始末。
- 隊長
そこは確かにそうだが、勅使河原君も小倉君も一部の声の大きい議論だけ見すぎだ。確かに『モメている』ところばかりめだつのだから仕方がないが、もっと見識を広めたまえ。
例えば、私が数十人規模のコミュニティの運営側の一角を担っていた頃、運営方針について何度か議論を戦わせるという局面があったが、「延々と議論を続ける」とか「議論を継続する意思を奪う」とか「時間があるほうが勝つ」等ということはなかったものだが……何故だと思うかね?- 勅使河原
小倉弁護士は『ネットは匿名だから恥ずかしげもなく本音で語ることが原因』と述べていますけど……隊長のコミュニティが実名主義だった、とか。
- 隊長
ま、確かにオフ会だのなんだので実際にあって顔も知る機会はあったが……ハンドルネームで認識しあっていたのでドロンと逃げたら終わりなのは変わらんよ?
むしろ私はだな。匿名ネットVS実名一般社会で議論の内容が変わるという小倉君の考えがおかしいと思っているのだが。良く見てみたまえ、小倉君もこういっているだろう?
「有害ゲーム」規制の関係では、松沢知事がブログのコメント欄に付けられたコメントに「誠実に回答」したところでコメンテータの方々が納得することはないでしょうし、また、知事もまたそれらのコメントを見た上でなおもその見解を維持しているのですから、今後いくら同じようなコメントをそのブログにぶつけられたとしても、考えを変えることは先ず期待できないでしょう。
松沢知事もまともに話を聞きやしない。「コメンターが納得しない」というのは所詮小倉君の想像にすぎないから証拠には出来ないが、それでも実際に有害ゲーム規制に対する反論に「回答しない」時点で議論にしてない。別にそれが悪いとは言わないがね。
よいかね?前提がおかしいのだよ。
小倉君の言うところの「一般社会」においては時間制限がある。会議室の利用時間制限でもいいし、夜になれば帰らなければならないとかもあるだろうな。対して「ネット」には時間制限がないから終わりもない。区切りもない。
- 勅使河原
まあ、ネットで議論してて終電逃すことはないですな。
- 隊長
「議論」というモノの定義というか「議論」と聞いて想定する状況にもよるが、他にもいろいろあるぞ。
小倉君の言う「議論」が若隠居氏のブログの状況を指しているのでそれを想定するとだな。参加制限が少ないことも言えるだろうな。全世界何処からでも確認できて、見たらすぐ乗り込める。「一般社会」とやらにそんなモノが頻繁に存在するかね?- 勅使河原
んー、流石にテレビでやってる議論に乗り込むなんて出来ませんしね……
- 隊長
一概に議論が踊るといっても様様な要因があるものだよ。「一部の匿名のアホウが騒いで収拾がつかない」というのは確かにあるのだが、それは「一般社会」でもあることだしな。ほれ、集団で出版社取り囲んで業務妨
- 勅使河原
――?!隊長それ以上は言ってはいかんー!!!
- 隊長
まあ、それはさておき。別に確実に「意見を一本化しなければならない」という義務が発生している訳でもない、明確な審判や管理人やルールも存在しない、誰でも参加可能で誰でも逃亡可能で、「それ」で何かを決定するわけでもない意見のぶつけ合いが存在していたのなら、そんなもん『匿名ネットじゃなければ収拾つく』と考えるほうが間違いだ。
- 勅使河原
……言われてみれば小倉弁護士本人も「一般社会の議論」の説明において
(そのような採決ルールに従うことを論争当事者間に強要できない場合は、その問題について意見が一本化されていることを前提とするものは諦めることになります。)
って言ってますね。最初の時点で実名とか匿名とか関係ないとorz- 隊長
結論としては、小倉君の言う「ネット上では匿名性が保障されているから」という理由は間違い。むしろ「ルールがないこと」こそが問題だろうね。これも小倉君の言っていることだが。
- 勅使河原
……てことは、そもそもネット上でまともな議論は出来ないって言うことでは。そんなルール敷いてる議論なんて見たことない。
- 隊長
だからそれは運営次第であろ。先の私の例だと、「サイト管理人」が最終決定者になっていたし、「議論参加者」は運営メンバーに限られていた。……というような「議論」は『表立たない』から知らないのかもしれないが。
そもそも小倉君のように「意見を一本化しなければならない義務が発生する議論」と「意見をぶつけ合うことが目的でまとめる義務がない議論」を並べて考えるほうがおかしかろ?やってることが違うのだから「ネット上で一般社会と同じような議論は出来ません」ってあたりまえだ。
- 勅使河原
まぁ、「匿名の卑怯者せい」を結論に持ってくるには「前提」に違いがありすぎですね……せめてもう少し条件絞らないとなんともかんとも。
- 隊長
だいたいだね?「一般社会は実名だからタテマエ。ネットは匿名だから本音。故に一般社会とネットの意見は乖離し、ネットの意見は現実社会では受け入れられがたい」って、どういうアホウな意見かね勅使河原君。
- 勅使河原
私にキレないでくださいよ?!
- 隊長
本音が出るほうがマトモにきまっとろうが。そもそも、「一般社会」とやらでどれほど「意見を議論として戦わせる」という場があるのかね。ニュースや新聞見て終わるほうがよっぽど多かろう。「出す」チャンスがほとんどなくメディアの情報を受け入れるだけの環境と、受け入れた後発信可能――というか実際に発信している環境を比較して「世論が乖離しています」なんてジョークがよく言えたものだよ。
- 勅使河原
ジョークとまで……あんた味方じゃなかったのか?!
- 隊長
みっ、味方だとも?!味方だからこうして真面目に添削をだな?!
こほん。ともかくこれは違うんだよ。小倉君の言う「本音」は「本音」の中でも、「特に理論武装も出来ない感情論」のことだろう?だから本来取り上げるべき「本音」ではなく建前を――「感情論が恥ずかしくていえないから言わないでいるタテマエ」を持ち上げているのだろうがね。感情論ばかり取り上げてあげつらって、まともな意見を黙殺しているからこんな意見になるのだよ。
ネット上でまともな議論をしたいなら逆だ逆。正論だけ取り上げて、アホウな感情論は黙殺。玉石混淆からタマをとってこなきゃいけないのに、石を拾い上げて駄目だ駄目だなんて単に使い方が下手なだけだよ。例えば、他人の真理の誤りも指摘できないで、「コメンツスクラーム!」なんてネタ部分取り上げて駄目出しし- 勅使河原
おわあストーップ!?あんた今日は口滑らせネタか?!……ったく。
しかしそれも理想論。普通の人がそこまでガチンコでやれますかね?いい加減嫌になって閉鎖とかよくある話ですし、なんだか初心者お断りな雰囲気が。- 隊長
意見を言う権利を行使するなら、相手の意見を言う権利を許す義務も発生するのだと思うのだがね。
どうしてもい意見を言いたいが、反論は聞きたくないというなら、コメント欄や掲示板の閉鎖を推奨したいのだが。なんにせよ、自分の意見に責任を持つというのは誰でもやるべきことだと思われるが。
ただ……責任なんかなくても感情論や良くわからん理由で叩かれたり煽られたり荒らされたりする例もあるわけで……どうしたものやらね?例えば他所のブログのコメント欄に「あなたそれは匿名の卑怯者の擁護- 勅使河原
だからもう今日はもう例えばの話禁止ー?!
ボタンを押したときに、そのボタンが disable になります。この方法を使うとボタンが押されて次の処理に入ろうとしているというのが直感的に分かるのと、二重送信防止にもなるということでユーザビリティが改善できます。
先のエントリーの関数を onsubmit に、今回のコードを onlick にといちいちするために HTML のテンプレートを書き換えたりするのがめんどくさい、という場合はハンドラへの登録も JavaScript で自動化してしまえばよくて、
- body の onload ハンドラで document.forms によりページ内の form をすべて取得
- それぞれの form の中に含まれるボタンな要素の onclick プロパティに上記のにメソッドを代入
- form の onsubmit プロパティにボタンを disable にするメソッドを代入
と順番に下っていく形でやっていくとうまくいくと思います。
上記記事を見て勉強がてら作ってみることに。
最近 JSAN なんてものを見つけて JavaScript 熱が再燃したのはいいのだけれど、Netscape が 3とか4とかの時期にちょっとかじったくらいなのでさっぱりわからない。何時からこんな便利くさい関数(いや、メソッドか?)が?かろうじて読めるけど、全然書けませんよ?
私の知っているJavaScriptと言ったらアレですよ?むやみにステータスバーに文字が踊ったりとかですね?
というかなんだかこのリファレンスなんの役にもたたないーっ?!
・
・
・
出直してきます……orz
というわけでコピペコピペでなんとか形に。 HTML 上で JSAN.js と bar.js を script 要素で指定したらそれでおしまいということにしてみました。ついでに、form target 属性で別窓開く場合は無効にしています。無駄に。
あと、JSANで、Prototypeと、それが使用するファイルとってこないと動きません。実に無駄なことに。
<script type="text/javascript" src="/static/js/lib/JSAN.js"></script> <script type="text/javascript" src="/static/js/bar.js"></script> ... <form action="foo.cgi" method="get"> <input class="button" name="baz" type="submit" value="baz送信" /> </form>
var jsan = new JSAN('/js/lib', 'lib'); jsan.use('DSS'); var dss = new DSS(); window.onload = function() { dss.setDisableSubmitButtons(); };
if ( ! jsan ) jsan = new JSAN(); jsan.use('prototype'); var DSS = Class.create(); DSS.prototype = { initialize : function(){ }, setDisableSubmitButtons : function(){ var forms = document.forms; var form = null; var obj = this; for (var i = 0; i < forms.length; i++) { form = forms[i]; if (form.target.length == 0 || form.target == "_self"){ if (!form.onsubmit) { var elements = form.elements; var element = null; for (var i = 0; i < elements.length; i++) { element = elements[i]; if ((element.type || "").toLowerCase() == "submit") { element.onclick = function() { obj.setHiddenValue(this); }; } } form.onsubmit = function() { obj.disableSubmitButtons(this); }; } } } }, disableSubmitButtons : function(form) { form = $(form); var elements = form.elements; var element = null; for (var i = 0; i < elements.length; i++) { element = elements[i]; if ((element.type || "").toLowerCase() == "submit") { this.disableElement(element); } } }, disableElement : function() { var element = null; for (var i = 0; i < arguments.length; i++) { element = $(arguments[i]); if (element) { element.disabled = true; } } }, setHiddenValue : function(button) { if (button.name) { var q = document.createElement('input'); q.type = 'hidden'; q.name = button.name; q.value = button.value; button.form.appendChild(q); } } };
今度リファレンス買いなおしてこよう……orz