軽量 O/R マッピング・ライブラリ Lightsleep 1.0.0 をリリース

Qitta に Lightsleep の紹介記事を投稿したので、下記のリンクからそちらを参照ください。

Java Runtime と JDBC ドライバーだけで動作する O/R マッピング・ライブラリ Lightsleep の紹介

仮想マシンを Windows 7 Ultimate から Windows 10 Pro にアップグレード

仮想マシン (以下VMと略記) を Windows 7 Ultimate から Windows 10 Pro にアップグレードしました。

VMware Workstation 11.1.2 (以下VMwareと記載) を使用しています。 Windows 7 のライセンスは、MSDN のですが、継続購入していないため、Windows 10 のライセンスは持っていません。

田マークの表示は?

いくつかの VM のうち1つだけ表示されていましたが、ほとんどは表示されていませんでした。

インストール用のISOイメージの作成

以下の手順です。

  1. MicorsoftのサイトからISOイメージを作成するツールをダウンロード。

  2. ダウンロードしたMediaCreationToolx64.exeを実行。 (自分のホストマシンが64bit Windows 7なので)

  3. 「他の PC 用にインストール メディアを作る」を選択して、次へ。

  4. 言語、エディション、アーキテクチャを選択して、次へ。

  5. 「ISO ファイル」を選択して、次へ。

物理マシンにインストールする場合は、USB フラッシュ ドライブの選択もありでしょうか。 アップグレードであれば、USB フラッシュ ドライブから起動できなくてもインストールできます。

マスター用 Windows 10 VM の作成

まずは今後必要になるであろう Windows 10 VM のマスターの作成を行いました。 以下の手順です。

  1. Windows 7 VM は残しておきたいので、Windows 7 VM をコピーして Windows 10 VMの元を作成。 私はいつもファイルコピーで行っています。

  2. ファイル名に "Windows7" が使用されているので変更。 Windows7.nvram → Windows10.nvram
    Windows7.vmsd → Windows10.vmsd
    Windows7.vmx → Windows10.vmx
    Windows7.vmxf → Windows10.vmxf
    Windows7.vmx, Windows7.vmxf をエディタで開いて、"Windows7" を "Windows10" に変更。

  3. Windows7.vmx を開き、CD/DVDを作成したISOイメージに設定して、VMを起動。

  4. CD/DVDドライブの setup.exe 実行。

  5. 「更新プログラムをダウンロードしてインストールする」が選択されているので、次へ。

  6. ライセンス条項が表示されるので、「同意する」をクリック。

  7. 「インストールする準備ができました」の画面で、「引き継ぐものを変更」をクリック。

  8. 「何も引き継がない」を選択して、次へ。
    この選択をするのは、マスター用の Windows 10 VM の作成のため、できるだけ Windows 10 の新規インストールに近い状態にしたいからです。

  9. 「インストールする準備ができました」の画面に戻るので、「インストール」をクリック。

  10. 「こんにちは」と表示される初期設定画面になるので、デフォルト設定のまま、次へ。
    国/地域、言語、タイムゾーンの選択なので、特に選択の必要はないと思います。

  11. 「すぐに使い始めることができます」と表示されますが、「設定のカスタマイズ」をクリック。

  12. 「設定のカスタマイズ」画面の個人用設定、位置情報の、すべてを「オン」から「オフ」に変更して、次へ。

  13. 「設定のカスタマイズ」の続き画面 (ブラウザの保護、etc) でもすべてを「オフ」に変更して、次へ。

  14. 「この PC はだれが所有しています?」画面で、「私が所有しています」を選択して、次へ。

  15. 「自分用にセットアップする」画面で、「この手順をスキップする」をクリック。
    ここで Microsoft アカウントで「サインイン」すると、Microsoft アカウントに登録されている名前で、Windows 10 アカウントが作成されてしまいます。
    日本語で名前が登録されていると、そのまま日本語のアカウント名になります。
    私は、Microsoft アカウントに登録されている名前を英語にしてあるため、その英語名で作成される事を期待していましたが、英語名を短くされてしまいました (6文字 → 5文字) 。
    結局新たに Windows 10 のアカウントを作成して Microsoft アカウントから自動的に作成された Windows 10 アカウントを削除する事になりました。
    なので、「この手順をスキップする」がお勧めです。

  16. 「この PC 用のアカウントの作成」画面になるので、ユーザー名、パスワード、パスワードのヒントを入力して、次へ。

  17. Windows 10 が起動し、右側に表示されるビューで「このネットワーク上の他の PC やデバイスが、この PC を検出できるようにしますか?」と問われるので、「はい」をクリック。

  18. Windows 10 VM をシャットダウン。

  19. 仮想マシンの設定を編集します。
    CD/DVDの設定を「物理ドライブを使用する」に戻し、「オプション/全般/ゲスト OS」で、Windows 10 x64 または Windows 10 を選択。

  20. Windows 10 VM を起動し、ログイン。

  21. VMware のメニューから「VM/VMware Tools の再インストール」を実行。
    Window 7 のインストール時に VMware Tools をインストールしていますが、再インストールしないと機能しないようです。

Windows 7 VMのアップグレード

マスター用 Windows 10 VM を作成しましたが、これを使用せず、個々の VMWindows 10 にアップグレードしました。

以下の手順です。マスター用と似ていますが、個人用ファイルとアプリは引き継ぎます。

  1. ファイル名に "Windows7" が使用されているので変更。
    Windows7.nvram → Windows10.nvram
    Windows7.vmsd → Windows10.vmsd
    Windows7.vmx → Windows10.vmx
    Windows7.vmxf → Windows10.vmxf
    Windows7.vmx, Windows7.vmxf をエディタで開いて、"Windows7" を "Windows10" に変更。

  2. Windows7.vmx を開き、CD/DVDを作成したISOイメージに設定して、VMを起動。

  3. CD/DVDドライブの setup.exe 実行。

  4. 「更新プログラムをダウンロードしてインストールする」が選択されているので、次へ。

  5. ライセンス条項が表示されるので、「同意する」をクリック

  6. 「インストールする準備ができました」の画面で、「個人用ファイルとアプリを引き継ぐ」に✓が入った状態で、「インストール」をクリック。

  7. 「ようこそ、こんにちは」と表示されるので、次へ。

  8. 「すぐに使い始めることができます」と表示されますが、「設定のカスタマイズ」をクリック。

  9. 「設定のカスタマイズ」画面の個人用設定、位置情報の、すべてを「オン」から「オフ」に変更して、次へ。

  10. 「設定のカスタマイズ」の続き画面 (ブラウザの保護、etc) でもすべてを「オフ」に変更して、次へ。

  11. 「新しい Windows 用のアプリ」画面で、デフォルトのまま、次へ。

  12. Windows 10 が起動するが、シャットダウン。

  13. 仮想マシンの設定を編集します。
    CD/DVDの設定を「物理ドライブを使用する」に戻し、「オプション/全般/ゲスト OS」で、Windows 10 x64 または Windows 10 を選択。

  14. Windows 10 VM を起動し、ログインします。

  15. VMware のメニューから「VM/VMware Tools の再インストール」を実行。
    「プログラムのメンテナンス」画面では、「修復」を選択して、次へ。

終わりに

今回とりあえず、Windows 7 VMWindows 10 へのアップグレード (32bit 版および 64bit 版) を行いましたが、Windows 7 でインストールしていたソフトウェアの動作確認はまだ行っていません。

Javaのデバッグ時にトレースログを出力するライブラリ(DebugTrace)を開発

Java 8以降に対応しています。

特徴

  1. インデント対応
  2. マルチスレッド対応
  3. リフレクションを使用した変数内容表示
  4. 変数内容表示の改行処理
  5. クラス名、メソッド名、行番号の自動生成
  6. リソースファイルによるログ内容のカスタマイズ
  7. 各種ロガーを利用可能
    • コンソール出力(stdout, stderr)
    • java.util.logging
    • log4j 1, 2
    • SLF4

インストール方法

GitHubで公開しているので、以下のURLからzipファイルをダウンロードしてください。

URL: https://github.com/MasatoKokubo/DebugTrace/releases

ダウンロードしたzipファイルを解凍して中に入っている debugtrace-x.x.x.jar をプロジェクトのビルドパスに追加してください。

使用方法

デバッグしたいメソッドおよびそのメソッドからコールされるメソッド(必要に応じて)の入口と出口にDebugTrace.enter()DebugTrace.leave()を追加します。またメソッド内で変数の内容をログに出力する場合は、DebugTrace.print(...)を挿入してください。

使用例

package sample;

import org.debugtrace.DebugTrace;

public class Sample1 {
    public static void main(String[] args) {
        DebugTrace.enter();

        DebugTrace.print("args", args);

        DebugTrace.leave();
    }
}

実行すると、以下のログがコンソールに出力されます。

ログ

2015-07-10 15:09:22.060 DebugTrace 1.2.2 / logger wrapper: DebugTrace$$Lambda$2/1831932724
2015-07-10 15:09:22.088 
2015-07-10 15:09:22.089 
2015-07-10 15:09:22.089 ______________________________ main ______________________________
2015-07-10 15:09:22.090 
2015-07-10 15:09:22.095 Enter sample.Sample1.main (7)
2015-07-10 15:09:22.099 |  args = (String[] length:3)[
2015-07-10 15:09:22.099 |  |  0: "aaa",
2015-07-10 15:09:22.099 |  |  1: "bbb",
2015-07-10 15:09:22.100 |  |  2: "ccc",
2015-07-10 15:09:22.100 |  ] (9)
2015-07-10 15:09:22.101 Leave sample.Sample1.main (11)

ログの内容について

ログの最初の行は、DebugTraceが初期化時に出力します。
4行目の ________ main ________などは、最初の起動時かスレッドが切り替わった場合に出力されます。
その後のEnter ...からLeave ...までが、自分で追加したデバッグコードに相当します。
EnterおよびLeaveの出力は、そのコードが記述されたクラス名 (場合によってはパッケージ名も) 、メソッド名、行番号が出力されます。
Enter/Leaveがネストしている場合は、インデントされて出力されます。インデントの管理はスレッド毎になっているため、複数のスレッドがログを出力した場合でも、メソッドコールのネスト状態が分かりやすくなっています。
argsのような配列、Collection、Mapや値タイプではないオブジェクトの出力では、項目毎に改行されます。
変数内容の出力も、階層化されていれば、インデントされて出力され、最後に行番号が付加されます。

変数内容の出力でリフレクションを使用する条件

まずプリミティブ変数やそれらのラッパーオブジェクト(Integerなど)、BigDecimal、Date、Time、Timestamp などの値タイプのオブジェクトの場合、そのクラスのtoStringメソッドかString.formatメソッドを使用して文字化したものを出力します。
その他のクラスの場合で配列、Collection、Mapなどのコンテナタイプのクラスの場合、そのクラスのtoStringメソッドを使用せず、DebugTraceが要素毎の出力を行います。
上記に該当しないクラスの場合、そのクラスまたはObjectクラスを除くスーパークラスにtoStirngメソッドが定義されていれば、そのメソッドを使用してオブジェクトを文字列化します。
toStringメソッドの定義がない場合は、リフレクションを使用してオブジェクトの各フィールド内容を出力します。
ただし出力対象となるフィールドには、以下の条件があります。

  • staticではないこと
  • publicであるか、またはそのフィールドのpublicであるgetメソッドが定義されていること
  • getメソッドは、フィールド名と同じ名前かgetまたはisのプレフィックスのついた名前であること

ロガーの指定方法

DebugTrace.propertiesファイルを作成して、そのフォルダを実行時のクラスパスに含めてください。 このファイルがない場合は、コンソール出力(stdout)になります。
loggerキーの値にロガー名を設定します。

DebugTrace.propertiesの例(Log4j 2を使用する場合)

logger = Log4j2

ロガー名には以下があります。

  • Jdk
  • Log4j
  • Log4j2
  • SLF4J
  • System.out
  • System.err

System.out, System.err以外では、それぞれのロガーの設定ファイルが必要になります。
それらの設定ファイルで使用するロガー名は、org.debugtrace.DebugTraceを指定してください。またログレベルは、デフォルトで各ロガーでの最低レベルになっています。Jdk loggerの場合はfinestで、Log4j 1、2、SLF4Jの場合はtraceです。

log4j2.xmlの例(Log4j 2を使用する場合)

<?xml version="1.0" encoding="UTF-8"?>
<configuration status="WARN">
  <appenders>
    <Console name="Console" target="SYSTEM_OUT">
      <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} %5p %msg%n"/>
    </Console>
  </appenders>

  <loggers>
    <logger name="org.debugtrace.DebugTrace" level="trace"/>
    <root level="error">
      <appender-ref ref="Console"/>
    </root>
  </loggers>
</configuration>

終わりに

以上がDebugTraceの紹介となります。
ダウンロードしたzipファイル内のJavaDocには、 DebugTraceクラスの各種メソッドとDebugTrace.propertiesについての詳細な説明の記載があります。