Hatena::ブログ(Diary)

夢見る大学生のはてな日記

2013-06-14

JVMTIを使ってみる。


初歩的なところで詰まってしまってなかなか先に進むことが出来ていなかったんですが、ひとまずやっと動いてくれましたので忘れる前に、自分の頭の整理も兼ねてエントリーを。


今回の環境


JVMTI(Java Virtual Machine Tool Interface)

Java仮想マシン上のプログラムの実行状態を取得する事ができるインタフェースなんだとか。詳しくは公式のドキュメント*1を。ちなみに、J2SE等に標準で付随しているhprofもこの機能を利用しているんだとか。最終的な目標としては、内部の情報を逐一取り出したいんですが、それは今後のお話ということで。


エージェントの作成

JVMTIを使用するためには、C又はC++で記述したエージェントをVMの起動時以前に呼び出しておくことで、VMの情報を取得出来るようです。ここでは、実際に何かを取得するのではなく、起動時にエージェントが問題なく呼び出せているのかどうかの確認のために最も初歩的なエージェントを作成します。

今回はこちらのサイト*2のエージェントを利用させて頂きました。

  • agent.c
/**
 * HelloAgent.c
 * 極簡単JVMTIエージェント
 */
#include <jvmti.h>
#include <stdio.h>

/**
 * JVMTIエージェントが含まれたライブラリがロードされた際に呼び出される。
 * options に'abort'が指定されると、JNI_ERRを返却する
 */
JNIEXPORT jint JNICALL Agent_OnLoad(JavaVM* vm, char* options, void* \
    reserved) {
  printf("Hello, JVMTI. option '%s' specified\n", options);
  if (options != NULL && strcmp("abort", options) == 0) {
    return JNI_ERR;
  } else {
    return JNI_OK;
  }
}

/**
 * JavaVMが終了する際に呼び出される。
 */
JNIEXPORT void JNICALL Agent_OnUnload(JavaVM* vm) {
  printf("Good-bye, JVMTI.\n");
}

$ gcc -g -Wall -fPIC -c agent.c -I /usr/lib/jvm/java-6-oracle/include/ -I /usr/lib/jvm/java-6-oracle/include/linux/

agent.c: 関数 ‘Agent_OnLoad’ 内:

agent.c:15:3: 警告: 関数 ‘strcmp’ の暗黙的な宣言です [-Wimplicit-function-declaration]

$ gcc -shared -o agent.so agent.o

これは本当になんでもいいのですが一番シンプルな定番なHelloWorldを用意し、コンパイルしておきます。

public class Hello {
 public static void main(String[] args) {
  System.out.println("Hello World!");        
 }
}

実行

$ java -agentpath:/"絶対パス"/agent.so Hello

Hello, JVMTI. option '(null)' specified

Hello World!

Good-bye, JVMTI.

$ java -agentpath:/"絶対パス"/agent.so=bastard Hello

Hello, JVMTI. option 'bastard' specified

Hello World!

Good-bye, JVMTI.

サンプルのエージェントでは引数あり・なしによる挙動の変化を試すことが出来るようになっていましたので、2回実行しています。


おわりに

まだまだ何か出来たという訳ではないんですが、ひとまず動いたということで今後のためにも書き残しておきたいと思います。

2013-05-10

Tex環境の構築 その2


さっきの記事を書いた後、さくっと検索したら難なく解決方法に巡り合えましたので続けてエントリーに。


今回の環境

  1. Ubuntu 12.04.2 LTS

インストール

まずは、TeX Liveバックポートと呼ばれるものを利用します。まずはリポジトリの追加。

$ sudo apt-add-repository ppa:texlive-backports/ppa

続いてパッケージをインストール

$ sudo aptitude install texlive-lang-cjk


確認

ということで、ちゃんとインストールできているか確認。

$ which platex

/usr/bin/platex

$ which dvipdfmx

/usr/bin/dvipdfmx

test.texなんてファイルに以下の内容を書いてみると、問題なく動いていることが確認できると思います。

\documentclass{jarticle}
\begin{document}
Hello World!
\end{document}

pdf化の方法は以下の通り。

$ platex test.tex

$ dvipdfmx test.dvi


おまけ

で、これだけでも基礎的なものならば問題なく使えるようなんですが、別環境において私自信がいつも使っているテンプレ的なものがあるのですが、これをこの環境において実行しようとすると以下の様なエラーが出るんですね。

! Font OT1/pnc/m/n/10.95=pncr7t at 10.95pt not loadable: Metric (TFM) file not

found.

ということで、どうもフォントの一部が足りていないようなので以下のパッケージを追加します。

$ aptitude install texlive

これで私のテンプレを使っても問題なくtexpdf化することが出来ました。


参考にさせていただいたサイト

  1. Ubuntu 12.04でLaTeX環境を構築する
  2. TeX のエラーメッセージ - TEX WIKI
  3. ubuntu 12.04にtexをインストール - 禁漁の金魚の金色の岐路の業

TeX環境の構築


今更感が半端ないですけど、手元のクライアントマシンにもTeXがあった方が何かと便利ですよねーということで、さくさくっと環境構築ができましたので備忘録を。ただその一方で、いつもは簡単なUbuntu環境での構築の方が上手くいかないんですが、こちらの方もダメな原因はわかっているので解決次第、備忘録として書き残しておきたいと思います。


今回の環境

  1. Mac OSX 10.6.8
  2. MacTeX-2012

インストール

MacTexの公式サイト(http://tug.org/mactex/)から、少し時間はかかりますがMacTeX.pkgをダウンロードしてきます。

あとは、GUIにしたがってインストール


確認

% which platex

/usr/texbin/platex

% which dvipdfmx

/usr/texbin/dvipdfmx

ということで、問題なく動作するかと思います。


参考にさせていただいたサイト

  1. Mac(Mountain Lion)にMacTeX-2012を入れてみる

2013-04-23

Jikes RVMのインストール


Jikes RVM(http://jikesrvm.org/)なんていうVMがあるんですね。

元々はIBMが開発していたものだそうで、

簡単にいえば「すごくいじりやすいVM」かな。

JikesRVMで「Hello World」- I am Cruby!

なんだとか。

さくっとインストールしてしまうつもりが、かなり手こずってしまったのでエントリーとして備忘録を。



今回の環境について

  • Ubuntu 12.04.02 LST (x86_64)
  • Jikes RVM 3.1.3+hg

環境の準備

Jikes RVMを入れる際に必要となるパッケージを入れておきます。


インストール

Jikesのサイトからソースコードを持ってきてもいいんですが、管理が楽になるようにMercurialというバージョン管理システムを利用してソースコードを落としてきます。

$ hg clone http://hg.code.sourceforge.net/p/jikesrvm/code jikesrvm

落としてきたディレクトリの中に移動します。

$ cd jikesrvm

次に、ソースコードビルドするための設定ファイルとして".ant.properties"というファイルを"jikesrvm"ディレクトリ内に作成し以下の内容を記述します。

## "$ uname -m"等で自身の環境を確認し指定します。 ex.ia32-linux, ppc32-linux, x86_64-linux

host.name=x86_64-linux

## ビルドを行う構成を選択します。詳しくは公式のリファレンスを…。 ex.prototype, prototype-opt, development, production

config.name=development

ビルドを行います。sudoはあまり褒められたやり方ではないですね。はい。

$ sudo ant


問題なくビルドが通れば、"jikesrvm/dist/"というディレクトリが作成され、このディレクトリ内に"jikesrvm/dist/development_x86_64-linux/rvm"が作成されていると思います。確認してみましょう。

$ ./rvm -version

development Jikes RVM 3.1.3+hg (revision f24912e3a27ec636e2874889f053844c0937a429)


Hello World!!

定番のHello World!!もやっておきましょう。

HelloWorld.javaとファイルを作成し、以下の内容を記述します。

public class HelloWorld {
  public static void main (String[] args) {
    System.out.println("Hello World !!");
  }
}

コンパイル、実行してみましょう。

$ javac HelloWorld.java

$ ./rvm HelloWorld

Hello World !!


ただし、ここで注意が必要なのですがjava 7でコンパイルを行うと以下のようなエラーが出ました。

6に切り替えコンパイル、実行だと問題ないんですけどね。

./rvm HelloWorld

Exception in thread "MainThread" java.lang.UnsupportedClassVersionError: unsupported class file version 51.0

at org.jikesrvm.classloader.ClassFileReader.readConstantPool(ClassFileReader.java:58)

at org.jikesrvm.classloader.ClassFileReader.readClass(ClassFileReader.java:353)

at org.jikesrvm.classloader.RVMClassLoader.defineClassInternal(RVMClassLoader.java:336)

at org.jikesrvm.classloader.RVMClassLoader.defineClassInternal(RVMClassLoader.java:307)

at java.lang.VMClassLoader.defineClass(VMClassLoader.java:99)

at java.lang.VMClassLoader.defineClassWithTransformers(VMClassLoader.java:323)

at java.lang.ClassLoader.defineClass(ClassLoader.java:471)

at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:83)

at java.net.URLClassLoader.findClass(URLClassLoader.java:617)

at java.lang.ClassLoader.loadClass(ClassLoader.java:341)

at java.lang.ClassLoader.loadClass(ClassLoader.java:293)

at org.jikesrvm.classloader.TypeReference.resolveInternal(TypeReference.java:811)

at org.jikesrvm.classloader.TypeReference.resolve(TypeReference.java:799)


おわりに

弄りやすいVMということなんですが、入れるだけでも手こずってしまっている私。

諦めずに引き続きもう少し触って行きたいと思います。



参考にさせていただいたサイト

2012-12-13

Oracle Javaのインストール


久しぶりに環境構築をしようとするといつも詰まってしまうJavaインストール

最近はこうやればサクッと上手くいくんだ、というメモのエントリー。


環境


PPAの追加

今回はこちら(Oracle Java (JDK) 6 / 7 / 8 Installer PPA)を利用させて頂きます。

# add-apt-repository ppa:webupd8team/java

# aptitude update


Javaインストール

# aptitude install oracle-java7-installer


最後にバージョンの確認。

% java -version

java version "1.7.0_09"

Java(TM) SE Runtime Environment (build 1.7.0_09-b05)

Java HotSpot(TM) Client VM (build 23.5-b02, mixed mode)

% javac -version

javac 1.7.0_09

2012-12-10

tmuxのインストール


Screenしか使ったことが無いんですが、ふと使ってみましょうかということで。


ただAptitudeを使ってインストールしようとしたらバージョンが1.1となってしまうようで、最新版の1.7とは少し離れすぎてますよね。

ということで今回はソースからインストール

ちょっと詰まってしまったところが多々あるのでエントリーに。


今回の環境


ncursesのインストール

aptitudeでさくっと。

# aptitude install libncurses5-dev

libeventのインストール

こちらもaptitudeで入る1.xではダメみたいでソースから2.x以上を持ってきます。

// 公式サイトからいただきます。

$ wget https://github.com/downloads/libevent/libevent/libevent-2.0.21-stable.tar.gz

// 解凍

$ tar xvf libevent-2.0.21-stable.tar.gz

$ cd libevent-2.0.21-stable

// 問題なくインストール出来るかのチェック

$ ./configure

// makeの実行

$ make

// インストール

# make install

tmuxインストール

では、メインのtmuxインストール

公式サイト(http://tmux.sourceforge.net/)からソースをいただいてきます。(2012/12/11時点の最新版は1.7)

後はコマンドライン上で順番に。

// 解凍

$ tar xvf tmux-1.7.tar.gz

$ cd tmux-1.7

// 問題なくインストール出来るかのチェック

// ただし、先程インストールしたlibeventライブラリを参照する様オプションで指定してあげます。

$ ./configure LDFLAGS=-L/usr/local/lib/

// makeの実行

$ make

// インストール

# make install

で、インストール自体は終わりなんですがtmuxを立ち上げようとすると

$ tmux

tmux: error while loading shared libraries: libevent-2.0.so.5: cannot open shared object file: No such file or directory

と怒られてしまうので、"/etc/ld.so.conf.d/libevent.conf"に以下のように、ライブラリインストール場所を記述したファイルを作成します。

/usr/local/lib

あとは、これを有効にするために

# ldconfig

と、ldconfigコマンドを実行。こうすることで、問題なくtmuxを立ち上げられるようになるかと思います。


おわりに

% tmux -V

tmux 1.7

細かい設定とか使い方については、今から勉強しないと。。。




参考にさせていただいたサイト