[Java] JVMTIを使ってJVMエージェントを作ってみる その2

バイトコード表示

JVMTIを使ってJVMエージェントを作ってみる その1ではClassPrepareイベントハンドラを登録するところまでだったけど、今回はmainメソッドのバイトコードを表示するところまでやってみよう。

バイトコード表示にはバイトコードを取得する許可を与える必要があるため、AddCapabilitiesを使って、許可を与える。
    jvmtiCapabilities capabilities = { 0 };
    capabilities.can_get_bytecodes = 1;
    (*jvmti)->AddCapabilities(jvmti, &capabilities);

[Java] JVMTIを使ってJVMエージェントを作ってみる その1

JVMTI

Javaのコードを書き換えることなく、実行中にスレッドやヒープの情報を取得するツールはいろいろと存在する。
これらのツールのようにJavaの実行環境情報を実行中に取得するにはどうしたらいいんだろう。

JNIでクラス検索するときのパッケージ名ではJNIを使って、CからJVMを起動したけど、今度はJVMTIを使って、JVMから呼び出されるCのコードを作ってみよう。

JVITI(JVM Tool Interface)
https://docs.oracle.com/javase/8/docs/platform/jvmti/jvmti.html

※今回試した実行環境はJDK8, openSUSE 42.2

[Java] Jetty-Runnerでお手軽にWebアプリを試す

Jetty Runner

JavaでWebアプリを試したい場合はTomcatやGlassFishといったアプリケーションサーバを用意して、設定ファイルを作って、デプロイして...といった手順が必要になる。
でも、サンプル作成やデバッグ目的でもっと手軽にServletを作りたい時がある。
Dockerを使って環境を用意してもいいけど、[PHP] PHPのビルトインサーバでxdebugを使うの"php -S"並みにできないだろうか。
こんな時はJettyを使うといい。

[PHP] PHPで任意精度計算

BC Math

PHPでは小数を含めて、任意精度で計算をしたい場合はBC Math関数を使う。
http://php.net/manual/ja/book.bc.php

こんな感じで。
bcdiv('123.45', '78.90', 10);      // 1.5646387832

2値を比較する場合はbccompを使う。

[PHP] PHPの変な演算子

変な演算子たち

PHPではNull合体演算子、宇宙船演算子という変な演算子がある。

Null合体演算子は比較対象がNULLであれば指定した値を返し、非NULLであればその値をそのまま返してくれる。
宇宙船演算子はCのstrcmpみたいなもので、二値を比較して、等しければ0、右の値が大きければ1、左の値が大きければ-1を返してくれる。
// Null合体演算子
$foo ?? 'nothing';
// 宇宙船演算子
$a <=> $b;

※Null合体演算子、宇宙船演算子ともにPHP7からの機能。
PHPマニュアル 新機能

[WSH] Windowsのコマンドプロンプトでtee

tee

[WSH] Windowsのコマンドプロンプトで正規表現を使って、文字列置換ではコマンドプロンプトから文字列置換をする方法を書いた。

他にもよくある作業として、画面で出力を確認しながら、同じものをファイルに取っておきたいことがあるよね。
いわゆるteeだ。

[bash] quine

明けましておめでとうございます。
2018年もよろしくお願いします。

$ q=q=%q\;printf\\x20\$q\\x20\$q\\n;printf $q $q
q=q=%q\;printf\\x20\$q\\x20\$q\\n;printf $q $q