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回実行しています。

おわりに

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

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

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

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を入れてみる

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ということなんですが、入れるだけでも手こずってしまっている私。
諦めずに引き続きもう少し触って行きたいと思います。


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

tmuxのインストール


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


ただAptitudeを使ってインストールしようとしたらバージョンが1.1となってしまうようで、最新版の1.7とは少し離れすぎてますよね。
ということで今回はソースからインストール。
ちょっと詰まってしまったところが多々あるのでエントリーに。

今回の環境

  • Ubuntu 10.04.4
  • tmux 1.7.
  • libevent 2.0.21

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

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



鍵交換方式を使ったSSH接続


言われてみれば、大学の授業の最初のほうで習ったなー程度の知識しかない、公開鍵暗号方式について少し自分の中で復讐。
というか2chで見つけたとある無料レンタル鯖(wkey.me)でSSHログインする際に必要でしたので、いい機会なので今後のためにも書き残しておきたいと思います。概念や仕組み等の説明は他のサイトにお願いするとして、このエントリーは具体的な使い方をメインに。


環境

PuTTYgen

まずは、みんな大好きPuTTYに付属されている?PuTTYgenを利用して秘密鍵と公開鍵を作っていきます。

予めタクスバーにPuTTYが登録してあれば、画像の様に右クリックでPuTTYgenを起動できると思います。



新規に作成する場合は、"Generate"をクリック。

マウスを少し動かす(ココ結構重要で、ただ待っていると進みません)と、鍵が作成されます。

オプションで"Key comment"部分のコメントを変更可能。
"Key passphrase"と再度"Confirm passphrase"に任意のパスフレーズを入力します。(省略可)


ここまで完了したら、秘密鍵、公開鍵を保存します。

秘密鍵


今回は、PuTTYで使用するので"Save private key"ボタンをクリックして、"***.ppk"と保存します。

しかし、OpenSSH形式で利用したい場合などには、"Conversions"→"Export OpenSSH key"から同様に"***.ppk"のように保存します。

公開鍵


こちらも同様に、PuTTYで使用する場合は"Save public key"ボタンをクリックして、公開鍵と理解しやすいように"***.pub"という拡張子で保存で保存します。
しかし今回の場合は、OpenSSH形式で利用したいので下の画像の赤で囲った部分をコピー&ペーストで利用します。

サーバでの準備

設定画面からShellユーザーの追加を行い、次の画像の様に"SSH-RSA Public Key"に先ほどコピーした公開鍵をペーストします。

これを保存して事前準備が完了しました。

SSHでログイン

では最後に、PuTTYを利用してログインしたいと思います。
公式サイトにもあるように、22番ポートではなく30890番ポートである点に注意が必要です。
必要事項を入力したら、"接続"→"SSH"→"認証"の"認証パラメータ"から"認証のためのプライベートキーファイル(K)"に先ほど保存した"***.ppk"を選択します。
あとは、いつも通り"開く"を選択すればログイン出来るかと思います。(接続前に設定の保存も忘れずに)


おわりに

つい面倒でパスワードでのSSH接続を許可にしがちですが、こういったセキュリティへの配慮は必要ですよね。
なかなか無料でSSHが使える共有サーバもないそうなんですが、SSH可、PHPPerlRubyも使える鯖、wkey.me。
せっかくなら、ScreenとかZshellも使えたら作業が捗るんですけどそこは今後に期待するとして、ぜひ使ってみてはどうでしょうか。ステマですね。w

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