yamicha.com's Blog - Presented by yamicha.com
Blog yamicha.com's Blog - 2017/11 の記事
[1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11] [12] [13] [14] [15] [16] [17] [18] [19] [20] [21] [22] [23] [24] [25] [26] [27] [28] [29] [30]

yamicha.com's Blog
 諸事情により、現在更新休止中。ご了承ください。もし今後ブログを再開することがあるとすれば、その際にはこのブログスクリプトではなく、新しく開発したものによるかもしれません。
 当ブログ管理者についてはこちらをご参照。
開発魔法(737)
社会問題(733)
お知らせ(11)
質問・バトン回答(15)
ゲスト出演(8)
経済・知的財産(150)
ゲーム開発(182)
[Ada] 勝手に補足
- Note
- 金配りの次の一手


- Endless Ultimate Diary
- 銃世界

漢字バトン
- うるる雑記帳
- 漢字接力棒

ツキアイゲノムバトン
- ブログ@うにうに画像倉庫
- あぶ内閣

縺イ縺セ縺、縺カ縺励ヰ繝医Φ
- 月夜のボヤキ
- 騎士サーラバトン
パスワードを使う
名無し (2012/02/27)


開発者解放裁判
yamicha.com (2010/03/14)
Winnyに関しては、私も「純白」とまでは考えておりませんし、使用し..

開発者解放裁判
通りすがり (2010/03/08)
winnyに関しては「ダウンロードソフト板」なんてところを拠点に開発..

新型インフルエンザの恐怖
いげ太 (2009/11/03)
> C#などの「int Some(int , int)」は、F#では「(int * int) ->..

時効に関する思考
yamicha.com (2009/08/31)
>いげ太さんコメントありがとうございます。手元にドキュメントが少..
Homepage
Blog Top
Normal View
List View
Search
Calendar
Comment List
Trackback List
Blog RSS
Send Trackback
Phone Mode
Administrator
yamicha.com
Blog
るううるる。
Source
法令データ提供システム
FindLaw
Development
Java2 Platform SE 6
Java EE 6 API
MySQL Developer Zone
PHP Reference
MSDN Library
Ada Reference Manual
Objective Caml
Python Documentation
Erlang
Prolog Documents
真の独裁支配者
2006/12/31(Sun)00:29:28
 2006年中最後のブログです。最後なのですが。どうして今年最後のブログ、しかもほどなく2007年というのにこのようなことを書かなければならないのか、とガッカリさせられますが、毎日新聞が「私たちはインターネットに依存するあまり、いつの間にか支配されているのではないか」と言い出したことについて分析しておきます。しかし、2000年ごろにこれが言われていたなら分かりますが、2007年にもなってどうしてこのような時代遅れなことを言い出すのか。日本の技術後進国さを憂う私としては少々ショックです。
 まず「インターネットに支配されている」という言葉ですが、混乱を招かないために一応述べておけば、これは当然ながら比ゆです。インターネットは意識も実体もない概念だけの存在であり、人間が実際にこれに支配されることはありません。単にサーバーをひたすらリンクし、DNSなどの仕組みを整えた機構を、我々が「インターネット」と呼んでいるだけです。
 こうした比ゆ自体はさほど珍しいものではありません。それどころか「戦記」自体が比ゆです。技術と戦う場合にしても、実際に武器を持ってドンパチやっているわけではなく、また技術も私に抵抗しているわけではなく、私がその技術を手に入れようと奮闘しているだけです。習得できなければ「敗北」と便宜上表記したりしますが、これも実際に負けたわけではありません。「Java EEに遊ばれた」と表記しても、実際にJava EEが「よし、ここの管理者と遊んでやろう」と考えたわけではなく、単に私が難しさに翻弄されただけのことです。
 ところで、我々は言語や文字に依存し、人によっては(私はしていませんが)新聞にも依存しています。新聞はともかく、前の2つがなければ日常生活を送るのも極めて困難です。しかし、新聞社の人間は「我々は言語、文字、新聞に依存している。いつの間にか支配されているのではないか」とは言いません。ダブルスタンダードの極みです。
 やはり、どうせマスコミはインターネットを批判したいだけ、と言いたいところですが、ここではグッとこらえることにしましょう。毎日新聞によれば、この特集の取材班は20〜30代が中心になっており、特集は彼らの問題意識を反映しているとのこと。論説委員のような無責任で不勉強、技術というものを知らない年寄りがネット批判をするのなら分かりますが、比較的若い層が「まず批判ありき」でネットを批判することは考えられません。今回ばかりは「マスコミはつくづくネットを〜」で片付けず、もう少し分析が必要でしょう。
 ここで考えたのが、「支配」されるとはどういうことか、です。上記の通りこれは比ゆなのですが、では「支配」という比ゆはどのような場合に使うのか。私の場合、自分のスキルに比べて技術があまりに困難で、今の自分では習得しきれなければ「敗北」、技術の困難さに振り回されれば「弄ばれる」と表記したりします。こうした場合、わざわざ説明をするよりも、比ゆを使った方が的確に意味を相手(読み手)に伝えられます。
 「支配」なる物々しい言葉も同じようなものなのでしょうが、毎日新聞の称する「我々はネットに依存するあまり、支配されている」の文言を見ての通り、ここでいう「支配」には「依存」と異なるニュアンスを含むようです。「依存」だけでいえば、我々は言語、文字、数字・算術、知識など様々なものに依存しており、これらが1つでも消えれば大変困ります。では、この「依存」と「支配」は一体何が違うのでしょうか。
 この差はおそらく、「(ネットに)使われている」「弄ばれている」といったものを意図していると考えられます(正確に表現するのは難しいですが)。要するに、彼らは文字や言語には依存しているものの、それらを使ってはいても使われてはおらず、支配はされていない。しかし、彼らはネットには逆に使われていて、支配されている、ということです。しかしながら、言語も文字もネットもすべて「概念」「知識」であり、根底は変わりません。なぜ文字には支配されず、ネットには支配されるのでしょうか。
 なぜそうなるのか色々と考えましたが、おそらく「要求キャパシティ量」の違いであると考えられます。これはいわば「技術・知識の許容量」とでもいいましょうか。言うまでもないですが、インターネットはかなり難しい技術です。実際は文字や言語、算術も難しいのですが、こうしたものは幼少時から習得していたり、何か取っ掛かり(例えば英語を覚える場合、日本人は大抵アルファベットを知っており、また英語を目にする機会も多い)があったりして、インターネットのような「未知の技術」とはみなされません。
 すなわち、文字や言語はインターネットに比べて要求キャパシティが低く、多くの人が自在に使いこなせます(実際はこれ、本当に自在に使おうとするとなかなか難しいのですが)。こうしたものは、「支配」を言い出した記者も含めて大抵の人が(実用上問題のないレベルまでは)完全に使いこなせるため、間違っても「支配」されることはありません。
 ではインターネットはどうでしょうか。人間、これに限らず難しい技術にはどうしても支配されがちです。私も困難な技術には「敗北」したり「弄ばれ」たりします。それでもこうした困難な技術を使うことを余儀なくされれば、自分がその技術を使っているというより、その技術に遊ばれている、いわば「支配」されているのではないか、と感じるのも無理もないことです。
 それで、結局何が言いたいのか。仮にインターネットの要求キャパシティ量が100であるとしましょう。キャパシティを10や20しか持たない人がインターネットを使っても使い物になりませんし、50や60なら必死になれば何とか一部を使用でき、100ギリギリなら使えるには使えるものの、使うだけで手一杯、という状態になります。ですから、私が技術を覚えようとして「敗北」するのは10や20の場合で、「弄ばれ」るのは50や60の場合、ということです。
 そして、記者がこれに支配されていると感じるのは、彼らの技術キャパシティ量がインターネットを十分に使えるだけのそれを下回っているためと考えられます。つまり、50や60、せいぜい120や130といったキャパシティでインターネットを使っているものと考えられます。これではギリギリの状態であり、支配されている気がするのも無理はありません。これが1000や2000であれば、何をまかり間違ってもインターネットに支配されているなどとは考えないはずです。
 当然、技術後進国の日本においてはキャパシティが高い人などそうそう多くは存在しません。人類皆開発者、というわけではないのですから、「自分はインターネットに振り回されている」と感じる人も少なくないことでしょう。もし日本が技術先進国であり、インターネットの普及と平行して国民のキャパシティも上がっていたようなら、「インターネットに支配される」などといったひずみが生じることもなかったのでしょうが、そこは日本ですから仕方ありません。国民の多くが受け入れるだけのキャパシティを持たない中で、技術だけが先行してしまったのです。
 しかも、今回これを提起したのは若手記者とのこと。記者の中にもキャパシティ量の高い人はいるのでしょうが、そうした人はキャパシティ相応の技能を欲するはずであり、自分が記者であることに満足できるわけがありません。ですから、もうすでに記者に見切りをつけているか、あるいは社外に自己実現の方法を見つけるか、いつも何か言い表せない物足りなさを抱えており、社内では「目立たない人」や「変な人」で通るなどして強い発言力を持たないはずです。当然ながら、社内でまとまる意見は、インターネットのキャパシティ要求量を満たすだけで手一杯な人々のそれになります。
 結果として「我々はインターネットに支配されてはいないだろうか」という言葉が出てくることになります。で、日本は国民のキャパシティを省みず、上げようともせずに新しい技術だけを流し込んでしまいましたから、記者と似たような状態の人も少なからずいると考えられ、同調者もそれなりに増えることになるでしょう。
 が、結局のところ原因は「インターネットの魔力」や「社会の問題」などではなく「インターネットを十分に使えるだけのキャパシティがなかった」というだけのことです(「日本政府などのいい加減な連中が、自国の技術後進国さも省みず、新しい技術だけを奔放に導入したのが原因である」と定義するなら、社会問題といえなくもありませんが)。
 もちろん努力次第でキャパシティは上げられます(無論、人によっては限界はあるでしょうが)。私がたびたび「技術に敗北を喫した後、他の技術をさまよって逆襲をかけたところ、意外とすんなり習得できた」のような戦闘を演じているのは、以前に挑戦した時に比べてキャパシティが上がっており、その技術を習得するに足る状態になっていたことによります。
 私などヒョッコですから、キャパシティ量もたかが知れていますが、本当の開発者は私の何十倍、何百倍というキャパシティを持っていることでしょう。ただ、私もヒョッコなれど一応は開発者、インターネットに支配されない程度のキャパシティは持っていなければ、さすがに開発など夢のまた夢です。サーバーサイド言語などはインターネットの概念を利用したものであり、インターネットに支配されているようでは絶対に書けません。
 ところで、この「技術キャパシティ」なのですが、どうやら用途は機械技術に限らないようです。「開発者はなぜかやたら色々知っていて頭がキレる」(私は未熟ゆえに全く当てはまりませんが、成熟した開発者は大体そうです)であったり、「ある分野で難しいことをしている人は、なぜか他の分野にも結構詳しい」といったことが起こるのは、キャパシティ量の大きさゆえでしょう。
 さて、この毎日新聞の特集は「インターネットに支配されるような人間のキャパシティの低さをインターネットの負の点に置き換えた、時代錯誤で勘違いも甚だしいものだ」と一笑に付すべきか、「日本政府などの無能者が、日本国民のキャパシティに配慮せず、それを上げようともせずにむやみに技術を持ち込んだのが原因で、社会全体の問題だ」と考えるべきか。このブログのスタンスはどちらでいきましょうか。
 確かに「インターネットの操作」は簡単になりましたが、「インターネット」自体は昔から何も変わっておらず、何ら簡単になってはいないのです。それを考えると後者ですが、それを「我々はインターネットに支配されているのでは」と責任転嫁しているのは記者の側ですから、この点では前者の方が当てはまるでしょう。そして何より、インターネットをあまり理解できていない人々がこの記事を読んで、インターネットについて誤った知識を持つのが怖いです。使いこなしさえすれば、強力な技術なのですから。

 さて、今年最後の技術習得は何にしましょうか。ではまずJAXPとやらに挑戦してみましょうか。挑戦といっても、具体的に何をすれば良いのかは良く分かりませんが、そこら中で見かけるキーワードですから、さすがにこれ以上理解を先延ばしするのはまずいでしょう。で、お約束ながらGoogleで検索してみました。

「JAXPはXML関連のAPIであり、DOM、XSLT、SAXなどを含みます」

 何ですと。私が1年前に習得したあの技術がJAXPだというのですか。全く、なぜこうややこしい名前をつけますかね。気を取り直して次に参りましょう。やはり最近良く目にする「JMX」、これを理解しないのもまずそうです。何とか習得しておきたいところです。一体どういうものかは知りませんが、検索あるのみ。

「JMXを使うと、起動中のアプリケーションを制御することができます」

 なるほど、なかなかすごそうな技術です。私で習得できるかは分かりませんが。

「JMXを使用するには、インタフェースを作成し、それに@MBeanアノテーションをつけるか、インタフェースをMBeanで終わるよう命名します」

 何ですと。この前やったMXBeanの技術ではありませんか。英単語を並べ立てて略語を作れば良いというものではないでしょう。全く、ややこしいことこの上ありません。WikipediaのJavaの項目から関連するAPIを探してみたところ、Javaの汎用の技術でこれまでに未使用のものはほとんどないようです。強いてあげればswingですか。これは以前にほんの少し使ったことがありましたが、もっぱらコントロールはアプレットで使うので、最近はVM 1.1に互換性のあるawtを使っているという事情がありまして。
 結局のところ、JDBC、JNDI、JNI、JMX、JAXP、SOAPなどという全くどれがどれだか分からない技術の数々は習得していることになりますし、RMIとCORBAはEJBで使われていますので、これもまた知らないうちに使っていたことになります。しかし、とっさに「JMX」とか「JAXP」と言われても 、理解する自信がないのですが。
 では昨日に引き続きjavax.scriptです。これは色々な言語をサポートして大きくなりそうです。その際はまた意味不明な略語を当てられるのでしょうか。カンベンしてください。
 さて、昨日はJavaScript上の関数を呼び出したりしましたが、今の時代グローバルな関数や変数は嫌われる傾向にあります。確かに、Javaにグローバルはありませんし、Perlでは99%の変数にmyをつけますし、PHPではあのいまいましいGLOBALSの元凶ですし、グローバルな関数・変数はできるだけ避けたいと考えるものです。
 しかしながら、困ったことに昨日の方法ではグローバル以外の関数を使いようもありませんし、そもそもJavaScriptはプロトタイプ指向の言語です。グローバル以外の関数といえば(グローバル関数自体、グローバル名の変数内に登録された関数ですが)、変数に登録されている関数しかないのです。どうしようもありません。
 ここはもう「どうせevalで実行するだけであって、JavaScriptで何かものすごいものを書くわけでもあるまいし」ということであきらめるとしましょう。わざわざJavaScriptの関数の宣言程度でこだわっていても仕方ありません。

 では先日の続き、「Invocable」のAPIドキュメントを読んでみます。昨日使ったのは「Object invokeFunction(String name , Object... args)」なのですが、似たようなのがもう1つあります。宣言は「Object invokeMethod(Object thiz , String name , Object... args)」だそうです。nameとargsは同じとして、thizとは一体何なのでしょう。
 リファレンス曰く

手続きがスクリプト内で定義されたクラスのメンバーであり、thiz が以前の実行または呼び出しによって返されたクラスのインスタンスである場合は、そのインスタンスを使用して名前付きメソッドが呼び出されます。

 一体何が言いたいのでしょうか。で、似たようなメソッドに「<T>T getInterface(Object thiz , Class<T> clasz)」なるものがあり、こちらのthizの説明は

インタフェースのメソッドを実装するために使用されるメンバー関数を持つスクリプトオブジェクト

 このドキュメントの日本語がおかしいのか、私の日本語理解能力が足りないのか、自信がなくなってきました。
 このような場合は挑戦あるのみ、とばかりに色々なものを渡してみました。ScriptEngine、ファクトリ、putしたオブジェクトなど。が、どれもこれも弾かれてしまいます。これは一体何なのでしょうか。どうしたものか、と考えていたのですが、ここでひらめきました。ひらめいたからには実装あるのみ。
// script.jsp
ScriptEngineManager sem = new ScriptEngineManager();
ScriptEngine se = sem.getEngineByName("rhino");
ScriptContext context = se.getContext();
context.setWriter(out);

InputStream is = new FileInputStream("...\\script.js");
Reader r = new InputStreamReader(is);

se.eval(r);

Invocable invoke = (Invocable)se;
Object obj = invoke.invokeFunction("getObject");

out.println("商品名 : " + invoke.invokeMethod(obj , "getProductName"));
out.println("価格 : " + invoke.invokeMethod(obj , "getPrice"));
out.println("製造者 : " + invoke.invokeMethod(obj , "getMaker"));
out.println("製造国 : " + invoke.invokeMethod(obj , "getMadeIn"));
out.println(invoke.invokeMethod(obj , "getDescription"));

r.close();
is.close();

// script.js
function getObject(){
	var obj = new Object();
	obj.getProductName = function(){
		return "騎士サーラ スチールストラップ";
	};
	obj.getPrice = function(){
		return "1750";
	};
	obj.getMaker = function(){
		return "イリスエンターテイメント株式会社";
	};
	obj.getMadeIn = function(){
		return "国産";
	};
	obj.getDescription = function(){
		return "鎧の質感にもこだわった、騎士サーラのストラップです。";
	};
	return obj;
}
 すなわち、引数thizはJavaScriptのオブジェクトなのです。JavaScriptはプロトタイプ指向言語ですから、変数に対して関数を登録することができます。そして実際、このサンプルでは関数を登録した変数を返し、それを使っています。ですから、この方法を用いることでグローバル問題を避けることもできるのです。
 しかもこのスクリプトの機能、それだけには留まりません。何とJavaScriptでインタフェースまで実装できてしまうとのことです。APIドキュメントの受け売りですから意味は分かりませんが、とにかくインタフェースが何とか。
 実際に実験してみましょうか。まさか動くわけはありませんが。
// 宣言
interface Character{
	String getName();
	String getSpell();
	String getClasses();
	String getClassesSpell();
	String getPackage();
	String getPrefix();
	int getCharacterID();
}

// 実装
ScriptEngineManager sem = new ScriptEngineManager();
ScriptEngine se = sem.getEngineByName("rhino");
ScriptContext context = se.getContext();
context.setWriter(out);

InputStream is = new FileInputStream("...\\script.js");
Reader r = new InputStreamReader(is);

se.eval(r);

Invocable invoke = (Invocable)se;
Character chara = invoke.getInterface(Character.class);

out.println(chara.getPackage());
out.println("class " + chara.getSpell());
out.println("implements " + chara.getClassesSpell());
out.println(chara.getPrefix() + chara.getName());
out.println("Number : " + chara.getCharacterID());

r.close();
is.close();

// script.js
function getName(){
	return "サーラ";
}
function getSpell(){
	return "Sara";
}
function getClasses(){
	return "デュアルナイト";
}
function getClassesSpell(){
	return "DualKnight";
}
function getPackage(){
	return "com.yamicha.classes";
}
function getPrefix(){
	return "騎士";
}
function getCharacterID(){
	return 1;
}
 恐ろしいことに、なぜか動いてしまいました。結果は次の通り。
com.yamicha.classes
class Sara
implements DualKnight
騎士サーラ
Number : 1
 何と、JavaScriptでインタフェースをインプリメントできてしまうのです。恐ろしいことこの上ありません。もはや何でもできるのではありませんか。
 これの問題点としては、インタフェース以外ではこの方法を用いることができない点でしょうか。例えば次のようなクラスでさえ弾かれてしまいます。
abstract class Character{
	abstract String getName();
	abstract String getSpell();
	abstract String getClasses();
	abstract String getClassesSpell();
	abstract String getPackage();
	abstract String getPrefix();
	abstract int getCharacterID();
}
 ここは何とかして欲しかったところですが、「インタフェースの実装をスクリプト側で提供する」というのがこの機能なのでしょうから、これはやむを得ません。
 なお、導入部分で述べた通り、インタフェースには「<T>T getInterface(Object thiz , Class<T> clasz)」メソッドも提供されているわけですが、こちらを使えばグローバル関数を使うことなく実装を提供することができます。
 それにしても、プロトタイプ指向言語をオブジェクト指向内で実現するとはすごいといいましょうか。で、少し気になったのですが、「prototype」は使えるのでしょうか。JavaScriptにおいては、関数は一旦prototypeに登録しておいて、後でそのインスタンスを作った後で他の関数の実装を代入する、という方法を用いることができるのですが。
// script.jsp
ScriptEngineManager sem = new ScriptEngineManager();
ScriptEngine se = sem.getEngineByName("rhino");
ScriptContext context = se.getContext();
context.setWriter(out);

InputStream is = new FileInputStream("...\\script.js");
Reader r = new InputStreamReader(is);

se.eval(r);

Invocable invoke = (Invocable)se;
Object obj = invoke.invokeFunction("getObject");
Character chara = invoke.getInterface(obj , Character.class);

out.println(chara.getPackage());
out.println("class " + chara.getSpell());
out.println("implements " + chara.getClassesSpell());
out.println(chara.getPrefix() + chara.getName());
out.println("Number : " + chara.getCharacterID());

r.close();
is.close();

script.js
function getObject(){
	function LocalObject(){
	}
	var obj = new LocalObject();

	// prototype に登録
	LocalObject.prototype.getName = function(){
		return "イリアス";
	};
	LocalObject.prototype.getSpell = function(){
		return "Ilias";
	};
	LocalObject.prototype.getClasses = function(){
		return "革命魔道士";
	};
	LocalObject.prototype.getClassesSpell = function(){
		return "RevolutionWitch";
	};
	LocalObject.prototype.getPackage = function(){
		return "com.yamicha.classes";
	};
	LocalObject.prototype.getPrefix = function(){
		return "魔道士";
	};
	LocalObject.prototype.getCharacterID = function(){
		return 0;
	};

	// プロトタイプを上書き
	obj.getName = function(){
		return "シェイン";
	};
	obj.getSpell = function(){
		return "Shein";
	};
	obj.getClasses = function(){
		return "アークパラディン";
	};
	obj.getClassesSpell = function(){
		return "ArcParadin";
	};
	obj.getPrefix = function(){
		return "聖騎士";
	};

	return obj;
}
 結果は次の通り。
com.yamicha.classes
class Shein
implements ArcParadin
聖騎士シェイン
Number : 0
 少々回りくどいですが、これで動作させることができます。しかし、普通のJavaScriptでは関数の中に関数は定義できなかったような。Javaで使う分には良い、ということでしょうか。実際のところこの関数をグローバルに定義すれば済む話なのではありますが。とにかくprototypeは使えてしまいます。
 しかし、PHP-Java Bridgeといい、最近は他の言語を呼び出すのが主流なのでしょうか。最終的にはどの言語でもどの言語をも使用できるようになるのでは。そうなると、言語の区別など何の意味も持たないではありませんか。
カテゴリ [開発魔法][社会問題] [トラックバック 0][コメント 2]
<- 前の記事を参照 次の記事を参照 ->

Comments(2)
yamicha.com - 2007/01/02(Tue)16:12:13
確かに、そうかもしれません。いかなるOSでも動くJavaにしても、結局はJavaがインタプリタとして動作しているだけで、そのインタプリタはプラットフォーム依存であるわけで。
しかし、まさしくあれなのです。H.Mさんが以前におっしゃっていた「iostream.hのライブラリはCっぽくなくて嫌い」。「cout << "Hello" <<endl;」の書き方です。
JavaでPHPやPerlまで動かせるようになると、型がなかったり多重継承であったりするプログラムも平然と書けることになり、「Javaっぽくない」のです。
しかし、そう考えると、
@Annotation("value") public class ClassName<T>
などというものは、昔からJavaを使っている人にとっては全くJavaっぽくないことになりますが、ここはひとつ「機能の進化」として納得しておくべきでしょうか。
・・・つまり、「開発者は今後ともよりいっそう様々な言語を習得しなければならない」ということですか。JavaもPHPもJavaScriptも。この進化は喜ぶべきか、悲しむべきか。

H.M - 2007/01/01(Mon)21:17:04
コンピュータ上でどんな高級言語を用いようとも最終的には2進数の数字の羅列で作られたマシン語だからなぁ…
ReverseEngineeringの延長と考えれば丸く収まる物ではないかと…

- Blog by yamicha.com -