yamicha.com's Blog - Presented by yamicha.com
Blog yamicha.com's Blog - 2017/09 の記事
[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/09/26(Tue)20:40:43
 安倍内閣誕生。それは誕生もするでしょうが、とにもかくにも官房長官他重要ポストに与謝野氏が入っていないのは何よりです。「消費者金融利権保護担当相」などいかがでしょう。後は「太陽戦略拉致担当相」「教育壊滅担当相」「堀江氏の再チャレンジ担当相」なども置くそうで。ついでに「安倍氏の秘書が耐震偽装にかかわっていたことを究明する担当相」「番組改編に安倍氏がかかわっていたことをただす担当相」なども作っては。
 しかし、どうしてこれらの事件が忘れ去られているのやら。耐震偽装については「一点の曇りもない」と豪語しつつ秘書をかばって証人喚問を退けたことから疑い濃厚ですし、番組改編についてはほぼ確実でしょうが、これは安部氏のみを責めることはできません。要するにNHK自体がそういう組織ですし、普段からたびたび改変は横行しているのでしょう。それを、公になっては互いに都合の悪いNHKと自民党が協力してもみ消した、というわけです。
 さあ、安倍氏の時代が終わるのはいつか、それだけが知りたいところです。森総理のように早々ヘマでもやってくれれば、教育をぶち壊しにされなくて済むのですが。安倍氏支持の大部分である「低IQ層」に関しては、イメージ次第でいくらでも意見を変えるため、何か問題が見つかればあっという間に形勢逆転です。
 しかし、本当に参院選で新庄など起用してくると辛いでしょうか。要するに「低IQタレント選挙をそのまま受け継いだ」ことになりますから。政策を十分に考える層には自民支持も民主支持もおり、「低IQ選挙をした側は何が何でも落選させよう」という合意は取れていません。逆に、低IQ層及び「自分で考えているつもりでも実は操作されている」層(エセ右翼に多い)は劇場型タレント選挙、あるいは中身がなくても中国などを批判した側にひたすら傾くため、今のところ「低IQ選挙を行った側が勝つ」という図式ができています。
 ともかく皆様には、参院選で新庄選手を起用、あるいは最終的に起用されなくてもより強く起用しようとした政党に対しては、それが自民、民主のどちらであるかにかかわらず、絶対に支持をせず、それとは逆の政党を支持するようお願い申し上げます。仮に自分がその党を吟味して支持していたとしても、低IQ層がろくに考えもしないでその党に票をバカバカ入れた場合、あなたの票は「死に票」になるのです。

 判例を覆す事例ですが、奈良事件の小林被告に死刑判決。被害者1名での死刑は相当なものです。これまでの基準としては、大まかに「3人殺害で死刑」とされていました。人命の重さを考えれば、人数次第というのも変な話ではありますが。ただ、必ずしもこの「ひな形」に沿うわけではありません。
 具体的には、死亡という結果は同じであっても、保険金殺人、身代金目的誘拐殺人、計画殺人、通り魔的な殺人については重く、客観的にも理由がある程度理解できる怨恨、そうした理由による衝動殺人(これは殺意が証明できなければ傷害致死)などは軽く、殺意のない死亡事件、交通死亡事故、あるいは自己防衛のために相手をやむをえず攻撃して死亡させた場合などは適用される法律も違ってきます。当然ではありますが。
 実際のケースでは、家庭内暴力がひどい配偶者に耐えかねて殺害したところ、かなり軽い判決が下された例などあります(客観的にやむをえない事情があると認められる)。介護疲れ殺人などにも軽い判決が出されることは多いようです。しかし、日本の司法は無理心中に軽い判決を出すべからず。自分の自殺願望に他人を巻き込んだ身勝手な犯行なのですから。
 ということで、手口が極めて残虐であったり利己的であったりする場合、原理的には1人殺害による死刑も考えられます。今までほとんど例はなかったのですが。子どもをわいせつ目的誘拐・殺害というのはボーダーでしょうか。広島では無期懲役、奈良では死刑。どちらも控訴審で結果が変わる可能性はあります。
 逆に言えば、この判決は広島事件の裁判に影響を与える可能性があります。かなり共通項が多いようですから、同じ判決になっても不自然ではありません。広島の場合、海外とはいえ同種の犯罪暦があったり、日本に偽装入国したりしています。現在公開されている情報だけでは、一概にどちらが重いかを決定することはできませんが、今回の裁判が「判例」となるかどうか。
 後は光市の事件。実際、この辺りが死刑と無期懲役の中間点ということですか。

 とかく複雑なクラスローダ。これですが、クラスをこちらから読ませるだけではなく、クラスを解決する仕組みまで作り変えてしまうことができるようです。薄皮1枚をかませたJavaならではで、C++ではそうはいきません。
 というわけで、今回は「データベース経由でクラスを読み取るクラスローダ」でも。ただし、クラスはあらかじめロードするのではなく、使用時にクラスローダにて読み込ませます。普通のクラスローダと同じ仕組みです。
 まず次のようなテスト用クラスを作りまして、
// DatabaseClass.java
public class DatabaseClass{
	public DatabaseClass(){
		System.out.println("Construct DatabaseClass");
	}
	public void method(){
		System.out.println("Call DatabaseClass.method");
	}
}

// Bridge.java
public class Bridge{
	public Bridge(){
		System.out.println("Construct Bridge");
	}
	public DatabaseClass getDatabaseClass(){
		DatabaseClass dbc = new DatabaseClass();
		dbc.method();
		return dbc;
	}
}
 これを使うことにします。Bridgeは文字通りブリッジであり、まずブリッジを独自のクラスローダで読み込ませ、その後でブリッジの特定のメソッド(今回はgetDatabaseClass())を呼び出せば、そこで生成されるクラスはデータベースを使う独自のクラスローダで読み込まれるのではないか、という魂胆です。
 つまり、もともとのクラスのmainメソッドからこのブリッジ内のメソッドをリフレクトして呼び出せば、実質このブリッジメソッドをmainとして扱うことで、全部自作のクラスローダで面倒を見ることができるものと考えられます。PHP/Java Bridgeも似たような仕組みでしょう。
 ということで、データベースから読み込めるクラスローダを作ります。
// DatabaseClassLoader.java
public class DatabaseClassLoader extends ClassLoader{
	private Connection connection;
	public DatabaseClassLoader() throws Exception{
		super();

		Driver d = (Driver)Class.forName(
			"com.mysql.jdbc.Driver").newInstance();
		connection = d.connect(
			"jdbc:mysql://www.localyamicha.com:3306/yamicha?" + 
			"user=yamicha&password=password&useUnicode=true" + 
			"&defaultEncoding=SJIS" , null);
	}
	protected void finalize(){
		try{
			connection.close();
		}catch(SQLException e){
		}
	}
	private byte[] getByteCodes(String name){
		System.out.println("ByteCodes:" + name);
		try{
			byte b[] = null;

			PreparedStatement ps = connection.prepareStatement(
				"SELECT data FROM datatable WHERE name = ?");
			ps.setString(1 , name + ".class");
			ResultSet rs = ps.executeQuery();
			if(rs.next())
				b = rs.getBytes("data");
			ps.close();

			return b;
		}catch(SQLException e){
			return null;
		}
	}
	public void resolve(Class c){
		resolveClass(c);
	}
	// クラスを読み込む
	protected Class loadClass(String name , boolean res)
		throws ClassNotFoundException{
		System.out.println("LoadClass:" + name);

		if(findLoadedClass(name) != null && !res)
			return findLoadedClass(name);

		byte b[] = getByteCodes(name);
		if(b == null){
			return super.loadClass(name , res);
		}

		return defineClass(name , b , 0 , b.length);
	}
}
 なかなか手を抜いていますが、あまりお気になさらずに。ドライバをDriverManager経由ではなく取得しているのは、コンストラクタで接続しているためです。本来新しいクラスローダ(つまり自分自身)を使って読み取るようにしたいところですが、コンストラクタで自分自身にforNameすることはできません。コンストラクタの後で呼び出すものとして接続開始メソッドを作れば可能でしょうが、2度手間です。ということで。
 loadClass(String , boolean)の2つ目の引数の使い方については、正しいのか自信がありません。ただ、これでも一応動くということで。ポイントはgetByteCodes(name)にてnullが返った(つまり該当するクラスがデータベースになかった)場合、親に解決させる部分です。これをしなかった場合、java.lang.ObjectといったシステムクラスをDBから探すも見つからず、例外を投げつけてきます。
 クラスに関しては、コンパイルして生成されたBridge.class及びDatabaseClass.classを次のテーブルに登録しておきます。この際、カラム「name」はそのままファイル名(Bridge.classなど。拡張子も含む)、カラム「data」にファイルの中身を登録するものとします。
Database : yamicha
Table : datatable
CREATE TABLE datatable(name VARCHAR(256) , data MEDIUMBLOB , 
PRIMARY KEY(name));
 ClassLoaderに関しては、loadClassではなくfindClassをオーバーライドするのが推奨されています。しかし、J2SE 5.0のリファレンスによると、loadClassのデフォルトの実装では、まず親クラスローダを探してからfindClassをコールするシステムになっており、親クラスローダの検索を優先したり、すでに同じクラスが登録されていたら読み込まないなど、こちらで自由な実装ができません。ということで、loadClassを丸ごとオーバーライドしてしまいます。
 ついでに、loadClassとfindClassを両方オーバーライドする際には注意が必要かもしれません。loadClass内でsuper.loadClass()によって親に丸投げした際、そこでfindClassがコールされれば、自分のfindClassが呼ばれることになります。
 後はこれといって特筆すべき点もないでしょう。それでは、これを呼び出すMainクラスを作成します。
public class Main{
	public static void main(String args[]) throws Exception{
		// クラスローダを作る
		DatabaseClassLoader dbcl = new DatabaseClassLoader();

		// Bridge インスタンスを作る
		Class cls = dbcl.loadClass("Bridge");
		Object bridge = cls.newInstance();

		// メソッドをリフレクト
		Method gdc = cls.getMethod("getDatabaseClass" , (Class[])null);
		Object dbcls = gdc.invoke(bridge);

		// 一応クラスローダを表示
		System.out.println(dbcls.getClass().getClassLoader());
	}
}
 これら4つのクラスをまとめてコンパイルし、データベースにクラスファイル2つ(Bridge.class、DatabaseClass.class)を登録した後、この2つのファイルは隠して(あるいは削除して)しまいます。つまり、通常のクラスローダからこれらのクラスを読み込むことは絶対にできなくなります。
 後は「java Main」コマンドで実行するのみです。見事に動作することが分かるでしょう。上記mainメソッドではBridge上のメソッドをリフレクトして呼び出していますが、上記でクラスファイル2つを隠蔽しないで置いておき、さらにそのクラスファイルとデータベース上のクラスが全く同じものであれば、リフレクトしなくてもキャストで使えるかもしれません(クラスローダが違うため、できない可能性が高いですが)。ただ、Bridgeで全部処理するように組む以上、どのみちほぼ違いはありません。
 なお、実行時にはデータベースからクラスを読み取るため、Bridge及びDatabaseClassの2つのクラスがなくても動くのですが、コンパイルする時にはスタブとして必要です。ソースを4つまとめてコンパイルする場合には、クラスファイルが消えていても大丈夫ですが、例えばBridgeのみをコンパイルする際にはDatabaseClassのクラスファイルが必要です。
 実行結果は次の通り。
LoadClass:Bridge
ByteCodes:Bridge
LoadClass:java.lang.Object
ByteCodes:java.lang.Object
LoadClass:java.lang.System
ByteCodes:java.lang.System
LoadClass:java.io.PrintStream
ByteCodes:java.io.PrintStream
Construct Bridge
LoadClass:DatabaseClass
ByteCodes:DatabaseClass
Construct DatabaseClass
Call DatabaseClass.method
DatabaseClassLoader@1ed2ae8
 正しくBridgeやDatabaseClassが解決され、生成され、コールされていることが分かります。java.lang.Objectなどのクラスに関しては、DatabaseClassLoader.loadClass内のsuper.loadClassにて読み込まれています。しつこいようですが、データベースからクラスを解決しているため、Bridge.classとDatabaseClass.classを消してしまっても動きます。
 これを何に使うべきか、と言われれば厳しいのですが。見たところ使えそうではあるのですが、データを途中で更新する必要がある場合、よほど必要でなければクラスファイルを書き換えてリロードさせるより何かしらの設定ファイルを読ませる方が合理的ですし、Servletで使うクラスは最初からlibにでも投げ込んでおいた方が合理的ですし(そもそもライブラリの自動読み取りはコンテナの管轄では)、Appletでは使おうにも厳しい制限があり、読み取り可能なURLなどが厳しく制限されます。それこそ他の言語とのブリッジでも作るのでなければ何とも。
 ただ、クラスローダの理解がJavaにおいて重要であると考えられる点と、何か困った時には切り札になりそうですので、よしとしておきましょう。
カテゴリ [開発魔法][社会問題] [トラックバック 1][コメント 0]
<- 前の記事を参照 次の記事を参照 ->

Trackback(1)
ツキアイゲノムバトン(from ブログ@うにうに画像倉庫) - 2006/09/29(Fri)19:40:27
【マチカドジヘン】の麻斗様から、面白そうなバトンが回ってきたので、回答します。ツキアイゲノムとは【こちら】の心理テストの様なモノです。未回答のエク♪さんのバトンですが、ハンゲブログの方で書かせて頂きました。 1、貴方のツキアイゲノムは何ですか 表-スロウ ..


- Blog by yamicha.com -