yamicha.com's Blog - Presented by yamicha.com
Blog yamicha.com's Blog - 2018/10 の記事
[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] [31]

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/09/29(Fri)22:22:19
 安倍氏、横文字乱発。小泉その他の首相と比べても、やたら横文字を使いたがる傾向にあるようです。
 大抵の人は経験がおありでしょうが、とりあえず横文字を乱発すれば中身カラッポでもそれらしく見せることができます。無論、最初から横文字である英語では全く通用しない戦術ですし、話の内容自体も意味不明になります。つまり、「中身はどうでもいいがそれっぽく見せてごまかしたい」場合には外来語を乱発することが有効です。
 これも小泉継承らしい戦術です。要するに、話の内容を理解できない人間(竹中氏の言う低IQ層)に対しては、それっぽく見せれば通用するのですから。ただ、国際的な演説であったり、話の内容をしっかり見る人間にとっては、恥さらしにしかなりません。誰にでも理解しやすい「ユーザーフレンドリー」(これも横文字ですか)な演説をしないという意味では独善的ですらあります。この性質は即刻直すべきです
 例えばライブドアマーケティングの社名は「メディアイノベーション」、「Media Innovation」とは「メディアの革新」の意味です。それっぽく見えますが、これがライブドアマーケティングの後継であることは知っておかなければなりません。とすれば、MySQLでおなじみの「Innobase」(イノベース)や「InnoDB」はこれが語源なのでしょうか。なかなか考えたものです。
 とにかく、安倍氏は意識して外来語を避けるべきです。はっきり言ってバカに見えます。人間はミエをはる生き物ですから、外来語の部分について「意味が分からない」とはなかなか言えないものですが、こうした演説のカタカナ語はもはや「最近できた日本語」です。知らないことは一切恥ではなく、乱用する人間の方がおかしいのですから、意味不明なものは意味不明としてとらえましょう。
 これはあらゆる演説・文書などにも当てはまります。外来語の乱用がやむを得ない例としては、外来語などが用いられた言葉を引用する場合、地名など固有名詞の場合、「テロ」「ステープル」「エアコン」など日本語化が困難あるいは適切でない場合、「インフォームド・コンセント」のように日本語化すると適切でないほど意味が変わりかねない場合(「納得診療」とは何ですか。納豆でもあるまいし)、「ハザードマップ」のように外来語の方が定着して連想しやすい場合、コンピュータなど専門用語全般を用いる場合がありますが、せいぜいその程度です。
 「シナジー」とか称する人間は、数十年後に爺さんになって毎日シナソバでも食らっていれば良いのです。シナジー効果というのは、要するにシナソバと調味料を混ぜた時の美味増強の効果です。「メディアイノベーション」は「メディアアカンベーション」とでも置き換えましょう。安倍氏は気取って「カントリー・アイデンティティー」などと称しているようですが、つまりこれは「日本にはカリントウというお菓子がある。カリントウを世界に誇りましょう」という意味です。
 つまりは「頭の悪い人間は、知ったばかりの知識や難しい単語をひたすら乱発したがる」。昔からの法則です。日本にカタカナ語が出てきたのは歴史的にはつい最近で、しかも聞いた限りでは難しい言葉ですから、安倍氏も乱発したがっているだけでしょう。もっとも、頭が悪いかどうかについては、今後の演説でカタカナ語を使うか使わないかが判断材料になるでしょうが。今後は使わないようなら分かりやすい演説を追求しているということですし、使うようなら頭が悪いと考えて差し支えありません。

 さて、どうしても取り上げておかなければならないNHK。「最後通告」を通達する段階まで来たそうです。この通告後、民事訴訟にて受信料をぶんどられる危険があるというわけです。安倍氏などが番組を改変して政見放送化しているというのに(番組改変は疑う余地なき事実です。慰安婦問題はたまたま表に出ただけであり、おそらく日常茶飯事的になされています。安倍氏も山ほどかかわっていることでしょうが、それを言い出すと安倍氏以外にも相当かかわっている人間がいると考えられますから、安倍氏だけを責めることはできません)、恫喝して裁判でふんだくろうとはいい根性しています。
 これは余談ですが、NHKを「左翼の手先」などと称する人間については気をつけた方が良いでしょう。拉致問題によって、大半は能もないくせにタカ派政治家が台頭してきました。能のないタカは爪を隠しません。ということで、NHKの番組も牛耳られているわけですが、するとNHKは当然右傾化します。これを「左翼」などと称する人間は、要するに自分がNHKよりもさらに右傾化している上、自分ではそれが意識できていないわけであり、自分を省みることができない人間と考えられます。振り回されないように付き合いはほどほどに。
 それでは私からも最後通告、最終警告をさせていただきます。現在NHKに加入して、抗議の不払いを続けているあなた、今すぐ解約しましょう。一旦解約しておけば、とりあえず今回の裁判の対象とはなりません。その後に「未契約者に契約させる」裁判を行うかもしれませんが、デジタル放送の辺りまで逃げ切ればスクランブル化も現実味を持ってきますし、いざその段階になったらテレビを破棄すれば良いのであり、時間稼ぎができます。
 何やら小手先のセコい戦術のような気もしますが、相手のやっていることはこちらの都合と無関係にツボを送りつけ、裁判で代金を請求しようとする振り込め詐欺と何ら変わりません。頼みもしないのに電波を送る方が間違っていることは論を待ちません。それが恫喝によって金品を巻き上げようとしているのなら、それなりの手段で応じるのみです。
 この動きが広がれば、お役所NHKといえども「督促状は逆効果だから撤回して謝罪しなければ」ということになり、世論の圧力に裏打ちされた本当の意味での改革が期待できます。逆にひとたび裁判所から督促が来れば、裁判を回避して相手の言い値を全額払うか、さもなくば「みなさまの受信料」を源泉としたマンモスと裁判で戦わなければなりません。どのような手段が最も効率的かは言うまでもありません
 ここで解約しなければ、いよいよ後がありません。ツボを使わないならツボを買う必要がないのと同じく、NHKが不要ならNHKの電波を買う必要は全くありません。日本から振り込め詐欺を撲滅しましょう。
 ちなみにNHKの言い分は「全部のテレビから受信料が回収できなければ、NHKの機構はストップし、情報弱者が情報を得られない」とのこと。しかし、テレビを持つことで受信料を取られる(しかも督促までされる)なら、一応受信料には減免制度があるとはいえ、弱者ほど受信料負担が重くなり、情報弱者が困り果てるのは見えています。もしまかり間違って、デジタル化後にNHK受信料なくして全部の放送が見られないようになったら、もう情報弱者の鬼門といいましょうか。このような弱者殺しを許してはいけません。
 NHK受信料については一応根拠法があるのですが、これはNHKしか放送のなかった当時ではやむを得ませんでした。しかし、もはやこんなものは時代遅れの悪しき伝統です。ましてや、この根拠法を盾に情報弱者をいたぶる行為は許せませんし、その恫喝に負けて裁判資金を貢ぎ、それに加担するのは倫理上問題があります。裁判が趣味の方以外は悪の芽を今のうちに摘んでおくことを強くおすすめします。

 クラスローダの法則。いい加減これで最後にしたいのですが、使えば使うほど謎が出てくるものでして。まずクラスローダは(こちらで作る時は)必ず親を持ちます。親のないクラスローダは作れません。コンストラクタで親ローダを渡すか、またはシステムクラスローダを自動的に親に使って構築することができます。
 では大本の親は誰かといえば、おそらくシステム固有のネイティブメソッドでしょう。これがJava VMの基本原則です。大本をネイティブに構築し、そこでOS依存をなくすことで、あらゆるOSにて同じように動くことが保証されます。しかし上位バージョン互換ではないため、「だから何だ」という印象は拭えないのが痛いところです。
 クラスローダの基本としては、とあるクラス内のメソッドでクラスを生成すると、そのクラスは自分のクラスを生成したクラスローダにクラスの解決を依頼します。あるいは、Class.forName(String , boolean , ClassLoader)などのメソッドにより、好きなクラスローダを使ってクラスを解決することができます。
 ちなみに、クラスが解決されるのは最初にそのクラスが出てきた時のようです。言い換えれば、new ClassName()やClass.forName("ClassName")にてクラスを呼び出した際にクラスが読み込まれる模様です。ソースがインターネット上にあったりすると、クラスを読むたびに接続の必要性が発生します。JAR化しておきましょう。
 例外がある可能性はありますが、ひとたびクラスが解決されると(そのクラスローダ上では)もはや同じクラスについての解決は行われません。つまり、クラスを参照するたびにクラスの内容が更新されていないかをチェックし、更新されていたら読み込むというのは、クラスローダをそのたびに作り直さなければ困難であると考えられます。
 同時にこれもまた厄介な点なのですが、クラスローダはクラスの解決を必要とするとloadClassメソッドを呼び出します。この際、loadClassをオーバーライドしていないと、クラスローダは勝手に親クラスローダに処理を委託します。すなわち、Class.forName("ClassName" , true/false , OriginalClassLoader)のようにクラスを読み込んだとしても、そのクラスローダでloadClassをオーバーライドしていない場合においては、勝手に親クラスローダがクラスを解決してしまいます。当然、そのクラスのローダは親クラスローダのそれとなり、そのクラス内でオリジナルのローダを使うことを前提にしていると後々面倒です。
 また、クラスローダの解決にはloadClassでなくfindClassのオーバーライドが推奨されていますが、(実際には試していませんが)マニュアルによればfindClassはloadClassで親に解決を委託した際、解決できなかった場合のみコールされます。これを信じるなら、ローダの動作を変更するためにfindClassをオーバーライドしても全く無効です。
 resolveClassについては、単にこのクラスで当該クラスを使用できるようにするためのもので、クラス自体が自分の所属になるわけではありません。ということで、そのクラスは使えこそしますが、そのクラス内でインスタンスを生成すると、もともとのクラスローダによって生成が行われてしまいます(親クラスローダから子クラスローダを作り、親クラスローダで解決したクラスを子クラスローダでresolveClassした場合のみ確認。兄弟やいとこの関係は知りません)。
 つまり、特定のクラスにおいてどうしても自作のクラスローダを使わなくてはならないのなら、自前でクラスを解決するloadClassメソッドを作らなくてはなりません。また、クラスが同じでもローダが違えば互換性がありません。
 「既定のクラスローダにてクラスを読み込めなかった場合のみ」findClassを使って解決する方法ならそこまで労力は不要ですが、どちらにせよそのローダを使いたいクラスはOriginalClassLoader.defineClass()で定義してリフレクトして呼び出す必要がありそうです。この際、クラスローダごとのクラスの互換性に細心の注意が必要です。
 クラスローダではパッケージも登録できます。しかし、パッケージもクラスローダごとの定義になります。つまり、せっかく自分のローダでパッケージを定義しても、デフォルトのローダには全く適用されません。注意が必要です。
 というわけで、今回のテストコードはこちら。
// Main.java
public class Main{
	public static void main(String args[]) throws Exception{
		PackageClassLoader cl = new PackageClassLoader();

		cl.definePackage("com.yamicha.characters" , "Characters" , 
			"1.0" , "yamicha.com" , "Characters Package" , 
			"1.0" , "yamicha.com" , (URL)null);

		Class cls = Class.forName("Bridge" , true , cl);
		Object bridge = cls.newInstance();
		Method m = cls.getMethod("bridge");
		m.invoke(bridge);

		System.out.println("--- デフォルトローダに属するパッケージ ---");
		Package pack = (new com.yamicha.characters.Ilias()).
			getClass().getPackage();
		System.out.println("Package : " + pack.getName());
		System.out.println("Title : " + pack.getImplementationTitle());
		System.out.println("Vendor : " + pack.getImplementationVendor());
	}
}

// PackageClassLoader.java
public class PackageClassLoader extends ClassLoader{
	public PackageClassLoader() throws Exception{
		super();
	}
	public void resolve(Class c){
		resolveClass(c);
	}
	public Class readClass(String name , byte data[]){
		return defineClass(name , data , 0 , data.length);
	}
	public Package definePackage(String name , String title , 
		String ver , String vendor , String ititle , 
		String iver , String ivendor , URL seal){
		return super.definePackage(name , title , ver , vendor , 
			ititle , iver , ivendor , seal);
	}
	public Class loadClass(String name , boolean res)
		throws ClassNotFoundException{
		try{
			// クラス名をパスとファイル名に変換して読み込み
			File f = new File(name.replace("." , 
				System.getProperty("file.separator")) + ".class");
			int len = (int)f.length();
			byte b[] = new byte[len];
			InputStream is = new FileInputStream(f);
			is.read(b);
			is.close();

			return readClass(name , b);
		}catch(IOException e){
			return super.loadClass(name , res);
		}
	}
}

// Bridge.java
public class Bridge{
	public void bridge(){
		Ilias i = new Ilias();
		printCharacter(i);

		System.out.println("--- 属するパッケージ ---");
		Package pack = i.getClass().getPackage();
		System.out.println("Package : " + pack.getName());
		System.out.println("Title : " + pack.getImplementationTitle());
		System.out.println("Vendor : " + pack.getImplementationVendor());
	}
	public void printCharacter(Character chara){
		System.out.println(chara.getPrefix() + chara.getName());
		System.out.println("本名 : " + chara.getName());
		System.out.println("継承インタフェース : " + chara.getClasses());
		System.out.print("得意武器 : \n");
		for(String w : chara.getWeapons())
			System.out.println("\t" + w);
		System.out.print("行使魔法 : \n");
		for(String m : chara.getMagics())
			System.out.println("\t" + m);
		System.out.println("解説 : " + chara.getHelp());
	}
}

// com\yamicha\characters\Character.java
package com.yamicha.characters;

public interface Character{
	String getName();
	String getPrefix();
	String getClasses();
	String[] getWeapons();
	String[] getMagics();
	String getHelp();
}

// com\yamicha\characters\Ilias.java
package com.yamicha.characters;

public class Ilias implements Character{
	public String getName(){
		return "イリアス";
	}
	public String getPrefix(){
		return "魔道士";
	}
	public String getClasses(){
		return "革命魔道士";
	}
	public String[] getWeapons(){
		String list[] = {"小剣"};
		return list;
	}
	public String[] getMagics(){
		String list[] = {"全属性攻撃" , "全属性回復" , "全属性補助"};
		return list;
	}
	public String getHelp(){
		return "魔道士イリアス固有のクラス「革命魔道士」。\n" + 
"革命魔道士は「開発者」をインプリメントしており、様々なアルゴリズムに通じる。\n" + 
"そのため、すべての魔法を使用できる。これも開発者のたしなみか。\n" + 
"継承クラス : Human / 主な継承インタフェース : RevolutionWitch , Commander";
	}
}
 さて問題です。Main.javaの「デフォルトローダに属するパッケージ」と、Bridge.javaの「属するパッケージ」は何が違うでしょうか。答えは次の通り。
--- 属するパッケージ ---
Package : com.yamicha.characters
Title : Characters Package
Vendor : yamicha.com
--- デフォルトローダに属するパッケージ ---
Package : com.yamicha.characters
Title : null
Vendor : null
 これはつまり、デフォルトクラスローダで読み込まれたか、PackageClassLoaderで読み込まれたかの違いです。Main.main()にて、PackageClassLoaderに対してパッケージの情報を定義していますが、これはPackageClassLoaderの上記インスタンスでのみ有効です。BridgeはPackageClassLoaderで解決されたため、Bridge.javaでインスタンスを作る際にはPackageClassLoaderが用いられ、パッケージ情報を取得した場合、PackageClassLoaderに登録されたパッケージ情報が使われます。
 デフォルトのローダでクラスを解決しても、上記の情報は定義されていません。ということで、何も登録されていないとみなされます。クラスローダを意識しなければ混乱することになります。なお、どちらもnew Ilias()でインスタンスを作ってはいますが、この両者はローダが違うため、互換性がありません。
 で、プログラムを走らせている最中でありながら、操作を実行するたびに新しいクラスを使うようなプログラムですが、これを応用すれば一応可能ということになります。といっても、既存のクラス名と同じものをdefineClassしようとすれば例外をぶつけられるだけですから、クラスローダを破棄して取り替えてしまえば良い、ということになります。
 では先ほどのクラスを編集してみるとしましょう。まず当該部分を以下の通り作り変えます。
// Main.main(String args[])
while(true){
	System.out.println("続行するにはEnter、終了するには「q」を入力");

	byte b[] = new byte[1];
	System.in.read(b);
	System.in.skip(System.in.available());

	if(b[0] == 'q')
		return;

	{
		PackageClassLoader cl = new PackageClassLoader();

		Class cls = Class.forName("Bridge" , true , cl);
		Object bridge = cls.newInstance();
		Method m = cls.getMethod("bridge");
		m.invoke(bridge);
	}
}

// Bridge.bridge()
public void bridge(){
	Chara c = new Chara();
	printCharacter(c);
}
 次いで、com\yamicha\characters\Ilias.javaの名前をChara.javaにし、クラス名もCharaにします。後はコンパイルすれば、次のようになるでしょう。
魔道士イリアス
本名 : イリアス
継承インタフェース : 革命魔道士
得意武器 :
        小剣
行使魔法 :
        全属性攻撃
        全属性回復
        全属性補助
解説 : 魔道士イリアス固有のクラス「革命魔道士」。
革命魔道士は「開発者」をインプリメントしており、様々なアルゴリズムに通じる。
そのため、すべての魔法を使用できる。これも開発者のたしなみか。
継承クラス : Human / 主な継承インタフェース : RevolutionWitch , Commander
続行するにはEnter、終了するには「q」を入力
 ここは終了せずに待機させておき、その間にcom\yamicha\characters\Chara.javaを次のようにしてしまいます
package com.yamicha.characters;

public class Chara implements Character{
	public String getName(){
		return "サーラ";
	}
	public String getPrefix(){
		return "騎士";
	}
	public String getClasses(){
		return "デュアルナイト";
	}
	public String[] getWeapons(){
		String list[] = {"小剣" , "剣" , "大剣" , 
			"槍" , "斧" , "棍棒" , "鞭" , "杖" , "扇子" , "体術" , 
			"弓矢" , "ボウガン" , "銃"};
		return list;
	}
	public String[] getMagics(){
		String list[] = {};
		return list;
	}
	public String getHelp(){
		return "力と技と体力と素早さに極めて優れる騎士サーラのクラス。\n" + 
"武術はもとより知性も高く、ほぼすべての分野において研究者並みの知識を有する。\n" + 
"何をやっても一級なのは良いものの、たびたび魔道士イリアスに振り回されている様子。\n" + 
"継承クラス : Human / 主な継承インタフェース : DualKnight , Scientist , Wiser";
	}
}
 で、別のプロンプトでコンパイルし、コンパイルできたら先ほど待たせておいたプロンプトをEnterで進めます。
騎士サーラ
本名 : サーラ
継承インタフェース : デュアルナイト
得意武器 :
        小剣
        剣
        大剣
        槍
        斧
        棍棒
        鞭
        杖
        扇子
        体術
        弓矢
        ボウガン
        銃
行使魔法 :
解説 : 力と技と体力と素早さに極めて優れる騎士サーラのクラス。
武術はもとより知性も高く、ほぼすべての分野において研究者並みの知識を有する。
何をやっても一級なのは良いものの、たびたび魔道士イリアスに振り回されている様子。
継承クラス : Human / 主な継承インタフェース : DualKnight , Scientist , Wiser
続行するにはEnter、終了するには「q」を入力
 何と、起動中なのにクラスが変わってしまいました。これぞクラスチェンジ。革命魔道士からデュアルナイト、いくらなんでも変わりすぎなのでは。そういえばデュアルナイトも横文字ですか(固有名詞ですが)。この手法、応用すれば色々できるわけです。どうでも良いですが、プログラムにおいて変数やメソッドにローマ字を使われるとどうにも腹が立ちます。PerlやSQLの解説ページなどでも良くありますが、「namae」は「name」と紛らわしすぎます。しかし今どき、ゲームだって「Namae」などと痛い表記はしないでしょう。
 またしても長くなりましたが、クラスローダの法則でありました。
カテゴリ [開発魔法][社会問題] [トラックバック 0][コメント 0]
<- 前の記事を参照 次の記事を参照 ->

- Blog by yamicha.com -