2010年8月30日
#
久しぶりにCDとか見にいったとです。
「お、懐かしー、このCD再発されたんだ」とか思って、手にとって見てみると、『ボーナストラック10曲追加』。
……。
いや、あの、これって、もともとは6曲しか入ってないアルバムなんですが……。
ボーナストラックの方が多いだろと。もう、それならいっそ新譜として出せと。
やまだです。相変わらず投げっぱなしの前文です。
ふんっ、Tech・Ed なんか行けなくたって、悲しくなんかないもんっ、と虚勢をはる今日この頃だったりします。
で、前月の続きなんですが、ちょっとコンスタントープールをざっくり解説など。
……とはいっても、基本的に「その他のデータ(その1)」なんですよね。雑多なデータの集まり。
#やっぱり図が前月の使い回しですw
では先頭のエントリから見ていきましょうか。CONSTANT_Methodref、これは文字通りメソッド定義です。
で、その構成要素が、10 と 25。じゃあ、10番目は何かというと CONSTANT_Class、クラスですな。25番目は Constant_NameAndType つまり名前と型。
要するに、コンスタントプールのメソッド定義は、それが属するクラスと、名前と型から成っていますと。
で、この 10 番目のエントリ CONSTANT_Class にはデータとして何が入っているかというと、31。31番目を見ろということになります。
そこにあるのは CONSTANT_UTF8、つまり UTF8 形式で文字列が入ってます。じゃあ他の文字コードにも対応しているのか、ということになりますが UTF8 以外のタグは(少なくとも公式では)定義されていないようです。
で、その中身は、java/lang/Object これは、java.lang.Object クラスってことですな。なぜかパッケージのセパレータ文字が変わってたりします。
25番目の NameAndType を見ると、さらに 17 番目と 18 番目を見ろと。それぞれはやはり文字列。前者がメソッド名を示し、後者が型を示します。
ということで、このメソッド名は <init>。これはコンストラクタの内部名です。これと衝突しないように、Java では <init> メソッドは予約語扱いでソースコード上では記述できないようになっています。同様に、クラスの初期化メソッドは <clinit> という内部名になります。
で、型は ()V。()内に何もないので、引数はなし。()の後にあるのが、返値の型でVは Void を表しています。
では、引数がある場合はどう表現するんだと。その場合は22番目にあるような形になります。[ は配列を表し、Lはその後;までクラス名がつながります。
という形に、一か所からずるずるとその他の情報がぶら下がっている形になっているわけです。
というわけで、命令側からは一か所指定しとけば、そこからいくらでも必要な情報は辿っていけるということになるわけですが、今回はこの辺で。
#えーと、ある意味今更な解説なので、今後続くかどうかは、私の気分と、誰かからクレームがつくかどうかで決まります?
では。
2010年7月31日
#
そういえば、少し前、私のブログに40個弱のスパムコメントがつきました。
いや、私のブログになんかコメントつけてスパムとして何か意味あるのか?、という話は置いておくとして、「どこかで見たような文章だなー」とか思ったりしたのですが、よくよく見てみると全部元のブログエントリか、他のコメントからの文章引き写しでだったりしました。で、その中に
さかもとです。
とか見つけると、「これ、そもそもの引用元もスパムだったんじゃないかー」とか思ったりしますw
やまだです。
いやー、こー暑いとプールにでも行きたいですねー。
ということで、今回は Java クラスファイルのコンスタントプールのお話です。
コンスタントプールとは、もう名の通り、コンスタントのプールです。もうコンスタントが芋洗い状態でわらわらとw
悪い言い方をすると、文字列とかその他の情報を「ええい面倒だ、全部まとめて一緒に入れちまえっ!」ってな感じですね。
まず、サンプルコードで、全く中身のないプログラムを書いてみます。
public class Main1 {
int i = 62584;
double d = 15.42;
String s = "yamada";
public static void main(String[] args) {
}
}
で、これから生成されたクラスファイルのコンスタントプールを覗いてみると、以下のようになってたりします。
コンスタントプールの各エントリはTLV(Tag-Length-Value)形式(*1)で構成されています。つまり、可変長データなわけです。
*1 冒頭の Tag でデータの種類、次にデータの長さ、そのあとにデータの中身を格納する、という可変長データを表現するときの汎用形式
とりあえず、まずはひとつひとつの中身にはこだわらないことにして、これ、何かおかしいとは思いませんでしょうか?
コンスタントプール数が32なのに、1から数えてみたら31までしか含まれていないんですよね。でも、それがJava VMの仕様なんです。
コンスタントプールには、「コンスタントプール数」で定義された個数-1しかエントリがない仕様だったりすると。
……いや、それ普通、仕様バグって言わない?
で、もっとちゃんと見てみると、実際には、さらに一つ足りないんです。上記だと、5番が抜けています。
これって、このツールのバグ……ではなくて、これもJava VM の仕様だったりすると。
long や double の変数の定義では、それぞれ2エントリ分を使用する、という仕様になっているようです。
……ちょっと待て。そもそも、コンスタントプールの各エントリって固定長ならいざ知らず、可変長ですよ?エントリを2つ潰す意味あるの?
……いや、それ普通、仕様バグって言わない?
まぁ、そうやらざるをえない諸般の事情はあったんでしょう、下位互換性を保たないといけないという考え方もあるでしょう。
でも、前回のエントリで書いたバージョン識別のメカニズムがあるんだから、バージョンを判断して過去のバージョンだったときだけ下位互換性を保てば良いのではないの、とか思ったりします。
つーか、そんな変な仕様をずっと引きずるなよー、とか思うのは私だけでしょうか?
で、Java のソースコードと ConstantPool の対比の話を全く何も書いていないので、それは次の機会があれば、ということで。
では。
2010年6月30日
#
久しぶりに某所に顔を出しました。「しらが、増えたねー」と言われました。
しらがさんは増殖しないっ。あと、人を呼び捨てにするのはどうかと思いますよ?
月末です。Rさんに対抗して○敵なやまだです。
ここで突然ですが問題です。
○の中に適当な文字を入れよ(20点)。1.素、2.無、3、不、4.索
ここで、前回と同じ画面を貼ってみたりする。
ここに Magic ってなものがあったりするわけですが、Windows 文化な方にはあまりなじみがなかったりする概念ではなかろーかなと。
Java のクラスファイルだと、この Magic に CAFEBABE ってのが格納されています。なんで CAFEBABE かというと、CAFE *1の子供だからですな。*2
*1 ジャワ島のコーヒーから転じて Java はコーヒーを意味する英単語として使われているとのこと。
*2 と、私は聞いておりますが、実際のところ、*1 記載内容含めて諸説があるようです。
あ、ちなみにこの Magic は文字列で書き込まれているわけではありません。16進数表記です。だから厳密には 0xcafebabe と書くべきなのかな。16進表記と言うことはアルファベットはaからfまでしか使えないわけで……まぁ、deadface でなかっただけましかなぁ、ということでw
Windows 環境だと、こういう目的には何かっていうと拡張子が使われているようで、バージョンが換わる都度、拡張子を変えていくワープロソフト、とか『お前はいくつ拡張子を食いつぶすつもりなんだよっ!』とツッコミを入れたくなることも多々あったり。せめて同じソフトの中では、バージョンの違いぐらい内部で判断するようにしたいもんです。
と、いうところでJava のバージョンなんですが、Java のクラスファイルにはしっかり格納されています。なので、Java のクラスファイルであるか否か、そのバージョンはいくつか、ということがわかるようになっています。
Java クラスファイルにおけるバージョン番号は、JDK1.x だったら (44+x).0 という公式になっています。ただし、JDK1.1までは特殊で、45.3 というマイナーバージョン(小数点以下)が入るケースもあったようです。
#最新仕様では、JDKのバージョンがあがる都度、クラスファイル上のメジャーバージョンも増えていく(マイナーバージョンは使われない)ようです。
なぜメジャーバージョンが 45 なんて大きな数から始まっているかというと……、私も理由はしりませんが、Java 前身のOak と名乗っていた頃にメジャーバージョンアップを繰り返していたからではないかと。
なので、Java のクラスファイルは拡張子とかが別物でも、そのファイルを見れば、Java のクラスファイルであることもわかるし、どのバージョン用に作成されたかもわかる仕様になっています。
それなのに、というところで、時間もないので以降はまた別のエントリで。
#って、こんなのに興味持つ人がどれだけいるんだという話が。
2010年5月31日
#
えと、「これからはアジャイルだ!」とか言う人に限って、工程管理ができない例が多いように思えるのは気のせいでしょうかね?
そもそもアジャイルとウォーターフォールって背反するものなのかなぁ、と。ウォーターフォールの各工程で、スパイラルに回すことだってできないわけじゃないとは思うんですけどね。当然、スパイラルで複数回を回すからには小さく各工程を前倒しで実施する必要はありますけど。
というわけで、やまだです。やっぱり月末です。
> .class ファイルの比較ツールでも作ろうか、と思っている今日この頃なのでありました。
などと、私は以前ほざいていたわけですが、……挫折しました orz。はい、あっさりと。
で、仕方がないので、まずは .class ファイルのビューワでも作ってみようかと。
まぁ、同様のツールには古くは ClassGlass (公開停止?)から、 JClassLib とか先達はいくらでもあるわけですが。
なんとなく動く感じのものができてきたので、とりあえず画面でもさらしてみようかと。
あ、ちなみにWPF使って作ってます。……、「いや、なんで Java 用のツールをWPFで?」ってツッコミはまず最初に自分がしてますので気にしないように。
で、改めて思ったんですが 、やっぱり面白いなぁ、と。Java クラスファイルも、WPF も。
下手に動くものだから嬉しくて、次回(……いつだ?)以降もちょっとこのネタで引っ張ってみようかと。きっちり書こうとして挫折した前科があるので、ゆるーく書いていきたいとは思っていますが。
#技術的には何ら新規性はない話ですが……。
早くも気力が尽きたので、今回はこの辺で。
では。
2010年4月2日
#
とか、クレタ人が全員嘘つきかどうか、という問題は、さておき、
たまには「自分が間違っている前提で物事を考えてみる」機会を
つくってみるのもよいことではないかと思ってみたり。
……ふう、なんとか間にあった……。
2010年3月5日
#
祭じゃ祭じゃー、とむりやり参入してみるテスト。
やまだです。
もともとは「ループを使わずに配列の順序を逆にする。」というお題。
元ネタはこちら:
ホワイトボードプログラミング
反転...ですかー
とりあえず、反則っぽいけどインデクサ使ってやってみましたー。
まずはコード。
class ReverseIndexer {
int[] array;
int length;
pubic ReverseIndexer(int[] originalArray) {
array = originalArray;
length = array.Length;
}
public int this[int i] {
set { this.array[length - i -1] = value; }
get { return this.array[length - i - 1]; }
}
}
class Program {
static void Main(string[] args) {
int[] oldArray = new[] { 1, 2, 3, 4, 5 };
ReverseIndexer newArray = new ReverseIndexer(oldArray);
System.Console.Writeline(newArray[0]);
System.Console.Writeline(newArray[1]);
System.Console.Writeline(newArray[2]);
System.Console.Writeline(newArray[3]);
System.Console.Writeline(newArray[4]);
}
}
IEnumerable なんか実装したりはしません。ループになるからw
で、このコードから
「配列の順序を逆に」というだけで、「逆の配列を用意しろ」なんて言ってないんじゃないの?
だったら、配列一式を最初から用意する必要なんてないよいよね。最初から一式揃えなくても、
必要なものを必要なときに手に入れられればいいという考え方があってもよいんじゃないかなー。
効率ばかり追い求めないで、遊び心を持つことも必要かも。そこから何かが生まれることもあるし。
という考えがあると思うか否かは読み手の自由です。 < をい!
少なくとも私から遊び心をとったら何も残らないような気がする :-P
では。
2010年2月28日
#
この間、本屋にいったとき某雑誌でとある作家の名前を見つけました。
つい、懐かしくなってちょっとぱらぱらめくって見たのですが、「連載13回」。おお、結構続いている。
で、タイトルイラストが1ページ、と。で、本文は……1ページ。
……まあ、この人らしいと思いました。これで許されるというのが羨ましい気はしますけど。
とりあえず、その日はその作家のほぼ番外編しか書かれていないシリーズ本を買って帰りました。
……やまだです。
最近、公私ともに少しプログラムを行う機会が増えてきました。ちとブランク長いのできついですが。
で、WPF 等で遊びつつも、昔の Java プログラムとか引っ張り出してきたりしているわけですが、そこでちと困ったことが一つ。
「これの最新ソースコードってどれだっけ?」
いや、余所様の持ち物じゃないので、いざとなれば Java は class ファイルからリバースすれば良いのですが、jar や war に含まれているファイル一式をリバースしまくるのも面倒だし、コメントまでは復元できないし。
しかし、Java だとソースコードも jar や war に一緒にアーカイブできたりするのですよね。当時は「いや、これセキュリティ的にどーなのよ?」とか思っていたこともありましたが。でも、逆にこんな状態だと、ソースコードも一緒に同一アーカイブで一緒に管理できると楽だなぁ、とか思ったりします。
#いや、お仕事でやる分には、ソースはランタイムのパッケージに含めず別管理、が正しいのでしょうが。
とりあえず、NetBeans で Java のソースコードも war ファイルに含めようとしてみました。
そのためには、プロジェクトの「プロパティ」から「パッケージ」で「WARファイルから除外」を空欄にすればよい、と。
でも、そうすると、WEB-INF/classes の下に .java ファイルと .class ファイルが混在することになるんですよねぇ。
WEB-INF/src の下に .java ファイル、WEB-INF/classes の下に .class ファイル、というように切り分けるにはどうするか、で試行錯誤を繰り返し、結果、次の画面のようになりました。
一度、WAR ファイルから .java ファイルを削除して、その後に再度追加する、と。
やろうとしていることの割には、意外と面倒な気が。もっと簡単にできないものなのですかねぇ。
ですが、とりあえず、.java ファイルと .class ファイルはこれで一緒に管理できるようになった、と。
で、次の課題として、その .java ファイルと .class ファイルはちゃんと対応がとれているのか、というのがあるんですが。
Java ってデプロイ後に .class ファイルの差し替えもできますからねぇ。 .class ファイルだけ差し替えてれば、そこでズレが生じている可能性もあるし。
.class ファイルの比較ツールでも作ろうか、と思っている今日この頃なのでありました。
では。
2010年1月31日
#
……やまだです。……ええ、やまだです。
Sandcastle Help File Builder (SHFB) 1.8.0.3 がでてますね。いやー、長いままβだったのでこのまま正式版がでないのかと思ってましたが。
そういえば、Sandcastle 本体の方はここ1年以上更新されていないようです……。
仕事の内容が変わったこともあって、最近は .NET のドキュメントを作る必要もなくなってたりしますが、ちょっと懐かしくなって触ってみようかと。
で、触ってみた印象です。
【変わらないように見えるところ】
・あまりスペックが高くないPCで実行しようとしたり、もしくは他のアプリケーションを多数起動していると、メモリ不足などが発生しやすい。
で、他のアプリ一通り終了してから再実行しなければならなかったり、延々処理が止まっているように見えたり、と。(まぁ、しかたがないことかもしれませんが。)
【悪くなったように見えるところ】
・設定可能な項目が増えたように思います。自由度が上がった、という意味では良いことなのでしょうが、何を、どこまで設定してよいのか、わかりにくくなった気がします。
・で、GUIが変わってるので、どこで対象アセンブリとXMLを指定してよいか、なかなか分かりませんでした。それがなきゃ始まらんだろうとw
↑ProjectExplorer 上で右クリックメニューから追加だ!、ということを理解するまで小一時間……。
・SHFB の設定ファイルの書式(拡張子)が変わって、以前の設定ファイルを解釈してくれなくなっています。
↑変換メニューはあるけど、途中でエラーになりました。設定ファイルを新たに作り直してから、テキストベースで見比べて手作業更新が一番早そうな気もします。
【良くなったと思えるところ】
・Sandcastle 側のエラーをちゃんと拾ってエラーコード付きで出力してくれるようになったようです。
↑最大の改善点?エラーコードごとの対策は、ヘルプファイルの Errors and Warningd を参照すべし。
・安定性が上がった?
↑……かも?
え、と、あと次の設定は False にしておくのが個人的には推奨です。
DocumentInheritedFrameworkMembers
フレームワークから継承するメソッドのコメントまで探しにいくみたいなので、環境によってはかなりシャレにならない負荷が……。
Sandcastle Style の方も更新されているようなので、この辺にこっそり日本語化ファイルの更新版も置いておきますね。
では。
2009年12月22日
#
今年も、あと1週間ほどになりました。来年も、あと1年ちょっとで終わりですね。
……やまだです。
今年はあまり動けず、また反省点の多い年でした。
で、思うところあって来年の目標を。
1. 言うべきことは言う。
2. 言っただけのことはする。
やっぱり、自分なりにやろうと思ったことには何かしら意見を伴うはず。
で、言ったことはそのまま自分に跳ね返ってくる。
周り見てても、言いっぱなしで自分の言葉に責任を持っていない人が多いなぁ、と。
人にはいろいろと偉そうに言ってるけど、じゃあ自分はそれに対して何してるの?と思うことが多いですね。
で、それがそのまま、じゃあ自分はどうなんだと返ってくるわけで。
↑誰からも言われなくても、自分が自分に対してそう思うで。
うん、頑張らないといけないなぁ、と思います。いろいろとくじけそうですけど。
では。時間がないので今回はこの辺で。
縁がありましたら、また来年もよろしくお願いいたします。
2009年11月30日
#
知り合いの人と間違えて声を掛けそうになるってことありますよね?
私も何度か「あれ、Kさん、こんなところでどうしたの?」とか声を掛けそうになって、よく見たら別人だった、ということが何度かありました。
で、それがたいてい、それぞれ違う場所にある本屋で、間違えそうになった人たちもそれぞれ別の人達なのですが、こぞってそれがボーイズラブのコーナーの前ってことはどういうことよ?
とか思う今日この頃だったりしますw
ども、この秋の大阪勉強会に参加しそこねたやまだです。
そういえばそこでのグループディスカッションのテーマで「IT技術者のモチベーションの維持、高め方」というのがあったなぁ、と。
で、今更なんですが、私なりにそのテーマでちょっと書いてみようかと。
----
その1.頑張っている人を見る
自分の中だけで高めていくのは難しい、なら外からエネルギーを貰えばよいのじゃないかと。
頑張っている人を見るだけで、「ああ、自分も頑張らなきゃなぁ」という気分にさせられますよね。
で、勉強会とかセミナーとかも最近行けてなかったりしたんですが、11/5 は Microsoft Developer Forum 2009 に顔出してきました。
MVP とかじゃなくても参加できたんですね、これ。
本題の Forum の方を除いても(<おい)、やっぱり、そういうところに出てくる人たちって、自分でなんとかしたいと思っている人が多いので、何かと刺激を受けたり。
でも、なかなかそういうところに出ていく時間が作れなかったりしますが…… orz
----
その2.目標を立ててみる
頑張ってみようと思っても、やっぱりなんとなくずるずるになっていくものですよね。
で、やっぱり目標として具体化すると努力する形も見えてくるのかなぁ、と。
そう考えると、試験、というのは最も手っ取り早い方法かと思ったりします。なので、まずは試験を受けるところから始めてみないとなぁ。
----
その3.なんとかしたいと思ってみる
こっちはその1の逆。
いや、それじゃ駄目だろと、なんでそういう風になるんだと、そういうものもいっぱい周りにはあるわけで。
例えば、「偉そうに言ってるけど、お前は何にもやってないだろ!」と思う人が近くにいたりします。
で、文句だけ言っていても何も解決しませんし、ひいては「偉そうに言っているけど、何もやってない」人に自分がなってしまっている、というオチがつく、と。
そこで「じゃあ、自分ならどうするのか」と自分に問いかけてみます。
自分はそこでどういう解決策を打てるのか、自分のこととしてとらえてみると結構いろいろと考えさせられます。
#いったん自分で駄目を出した以上、さあ自分にはできねーとは言わせねーぞ、ってことですね。
----
私も、このところ、あまりまとまった時間がとれていません。それでも何かやらないといけないと思っているわけで。
で、最近私は何をやってるかというと……小説書いてます(笑)。
だって、とある小説読んでて「こんな終わり方じゃあ納得できーん!」って思っちゃったんですもん。
じゃあ、「お前が納得できるものを自分で書いてみろ」とその台詞がそのまま自分に返ってきちゃったと。
面白い、面白くない、という以前に自分が納得できるものを書かなきゃいけない。
相手が自分だけに下手にごまかすこともできないし、ほんと大変ですw
いや、書き終えたからって別に公表できるわけでもなし作業的には無駄な努力(and/or 自己満足)だと言えるんですが、自分にだけは愛想尽かされたくはないなぁ、と。
でも、時々思ったりします。私は何をしているんだろ?、ってw
……なんかまとまりないですが。 (こんなエントリで私は許してくれるのでしょーか?)
では。