物理の駅 by onsanai

Physics-station 研究で日々感じたことを忘れないための備忘録

Windows Server 2016 でRAMディスクを構成する

Windows ServerでRAMディスクを作成する方法

本方法は、Windows Server 2016で試したが、2019でも同様のことは可能。

下記のサイトが参考になったので、日本語訳しつつ紹介する

model-technology.com

まず、「役割と機能の追加ウィザード」からiSCSI ターゲットサーバーをインストールしておく

f:id:onsanai:20190624104454p:plain:w400
iSCSI ターゲットサーバー

次に、管理者権限でPowerShellを起動し、コマンドライン上でRAMディスク(iSCSIターゲット)を作成する

ある名前の新しいiSCSI ターゲットオブジェクトを作成する→指定したiSCSIターゲットの設定を変更する→指定したファイルパスとサイズでiSCSI仮想ディスクを作成する

New-iscsiservertarget -TargetName "testramdisk"

Set-IscsiServerTarget -TargetName "testramdisk" -InitiatorId "IQN:*"

New-IscsiVirtualDisk -Path "ramdisk:test.vhdx" -Size 50GB

ここではディスクサイズを50GBとしているが、搭載しているRAMサイズは超えないようにする。

仮想ディスクをiSCSIターゲットに割り当てる

Add-IscsiVirtualDiskTargetMapping -TargetName "testramdisk" -Path "ramdisk:test.vhdx"

PowerShell上での作業は以上。

f:id:onsanai:20190624105737p:plain:w600
PowerShellの画面

ダッシュボードの「ツール」から「iSCSI イニシエーター」を起動する

「ターゲット」にローカルIPアドレスを入れ、「クイック接続」し「完了」する。

ディスク管理からディスクが確認できる

f:id:onsanai:20190624110019p:plain:w600
ディスク管理画面

「オンライン」にして「新しいシンプルボリューム」にしてCrystalDiskMarkで遊んだ結果が以下の通り。

f:id:onsanai:20190624111002p:plain:w400
RAMディスクのRead Writeの速度

削除するとき

設定と逆順で削除していく。

「ディスク管理」から「ボリュームを削除」し「オフライン」にする

iSCSI イニシエーター」から「切断」する

指定されたiSCSI仮想ディスクと指定されたiSCSIターゲット間の割り当てを削除する→指定されたiSCSIターゲットを削除する→バーチャルハードディスク(VHD)ファイルを削除せずにバーチャルディスクオブジェクトを削除する

Remove-IscsiVirtualDiskTargetMapping -TargetName "testramdisk" -DevicePath "ramdisk:test.vhdx"

Remove-IscsiServerTarget -TargetName "testramdisk"

Remove-IscsiVirtualDisk  -Path "ramdisk:test.vhdx"

Visual Studio C++ x64のstd::ofstream のwriteには2GBの壁はない

The limitation of the size for the std::ofstream write is not 2GB in Visual Studio 2017. The limitation would be 64bit limits.

std::vector<uchar> v(0x100000000); // 4GB (=2^32)
std::ofstream ofs("o", std::ios::binary);
ofs.write((char*)&v[0], v.size()); //OK
ofs.close();

ChromeであるURL以外を接続させないようにしたい

URLBlacklistで全てのURLを指定、URLWhitelistで特定の(この例ではGoogleのみ)を指定。

以下の内容を test.reg という名前で保存し、管理者権限で実行すると良い。

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Google\Chrome]

[HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Google\Chrome\URLBlacklist]
"1"="*"

[HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Google\Chrome\URLWhitelist]
"1"="google.com"
"2"="google.co.jp"

Windows Server 関連のコマンド

DISKPERF -Y

ディスクの情報をタスクマネージャー上で見る。

小さいグラフを表示させるには、当該場所で右クリックで「グラフの表示」

Android版のMicrosoftリモートデスクトップからログインした後でWindowsから再接続すると日本語配列入力ができなくなる

タイトル通り。

Androidをクライアントとしてサーバーにリモートデスクトップ接続+ログインすると、クライアント(Android)から送られるキーボードの種類は英語配列キーボードであるため、リモートデスクトップ接続における配列キーボードが英語になる。その後、サーバー側をログアウトせずにWindowsのクライアントから接続すると、その設定は引き継がれるため、日本語配列キーボードでの入力ができなくなる。(日本語入力はできる)

一旦サーバー側をログアウトしてから、Windowsリモートデスクトップから接続+ログインすると、日本語配列キーボードでの入力ができるようになる。

理屈は分かるけど、初見で対策見つけるの難しいよね。

play.google.com

pythonのmatplotlibで2次元ヒストグラム(hist2d)のビンの値を直接操作する

pythonのmatplotlibで2次元ヒストグラム(plt.hist2d)のビンの値 (bin contents)を直接操作する方法はない。なので、 colormesh を使って描画しよう。

import matplotlib.pyplot as plt
import numpy as np

def f(x, y):
    return np.exp(-(x * x) / (2 * 3 ** 2)) * np.exp(-(y * y) / (2 * 3 ** 2))

X, Y = np.mgrid[0:21:1.0, 0:21:1.0]

X-=10.0
Y-=10.0
Y*=2.0

Z = f(X,Y)

fig, ax = plt.subplots()
im = ax.pcolormesh(X, Y, Z, cmap='inferno',vmin=0,vmax=1.1)
ax.set_xlabel("X")
ax.set_ylabel("Y")
cbar = fig.colorbar(im)
cbar.set_label("Z")
plt.show()

このようにしてカラーマップを作成することが出来る。

f:id:onsanai:20190703085418p:plain
二次元ヒストグラムっぽい絵

普通のヒストグラム(一次元ヒストグラム)も、棒グラフを使ってヒストグラムっぽく表示することが出来る。

import matplotlib.pyplot as plt
import numpy as np
 
X = np.array([i for i in range(-10,10)])
Y = np.exp(-(X * X) / (2 * 3 ** 2))
plt.bar(X, Y, width=1.0)
plt.show()

f:id:onsanai:20190430233014p:plain
一次元ヒストグラムっぽい絵

C++のクラスをPythonから使うためにBoost::Pythonを使うまで

BoostのPython用ライブラリを使いたかったのでコンパイルする

参考文献。

Boostライブラリのビルド方法 - boostjp

Boost 最新版をソースコードからビルドし、インストール(MSVC ビルドツールを使用)(Windows 上)

Visual Studio 2019の x64 Native Tools Command Prompt for VS 2019 を使って、

cd (解凍したディレクトリ)
bootstrap.bat
mkdir stage
b2.exe install -j2 --prefix=stage toolset=msvc-14.2 link=static,shared address-model=64 --with-python

を行う。 -j2 の1は1並列で行うの意味。Visual Studio側では、Visual Studio 2019は v142 となっているため、msvc-16.0 とはしない。

次に、Visual Studio 2019で次のサイトで書いてることをやってみる。

Boost.Python Tutorial - 1.70.0

Visual Studio 2019で、プロジェクト名「hello_ext」を「C++ 空のプロジェクト」で作成する。

  • Pathを正しく通す
    • インクルードディレクトリには、boostだけでなく、 $(USERPROFILE)\Anaconda3\include; も通す。(Anaconda3の場合)
    • ライブラリディレクトリには、boostだけでなく、 $(USERPROFILE)\Anaconda3\libs; も通す。
  • 構成プロパティ-> 全般 -> 構成の種類 は ダイナミックライブラリ (.dll) にする
  • 構成プロパティ-> 全般 -> ターゲットの拡張子 は .pyd にする

hello_ext.pyd が x64のRelease内に出力されるので、それをpythonを実行するディレクトリにコピーし、そこでpythonを起動する

>>> import hello_ext
>>> print hello_ext.greet()
hello, world

これで動くはずである。

#include <boost/python.hpp>

BOOST_PYTHON_MODULE(hello_ext)
{
    using namespace boost::python;
    def("greet", greet);
}

ここの、 BOOST_PYTHON_MODULE 内 今回の例では、hello_ext はプロジェクト名 (=出力する .pyd 名)と同じでなければならない。

boost::python(1) classと関数の使用方法(PythonからC++の呼び出し) - のんびりしているエンジニアの日記

yaml-cppをWindows10 Visual Studio 2017でコンパイルする

git clone https://github.com/jbeder/yaml-cpp

cmake for Windowsで、

f:id:onsanai:20190421180757p:plain:w400

f:id:onsanai:20190421181446p:plain:w400

Visual Studio 2017の場合は、

YAML_CPP.slnを開く

ALL_BUILDをビルド

INSTALLをビルド

で終わり。

最新のブランチでは、Visual Studio 2013 でコンパイルすることはできない。C++11絡み。

Windows10とVisual Studio 2017でGeant4を動かした

Overview | geant4.web.cern.ch

WindowsでGeant4を入れたお話。

皆さん誤解しているかもしれませんが、WindowsでGeant4は動きます。GUIや、他のLinuxにしか対応していないツールや、マルチスレッド関連を除けば、ちゃんと動きます。 深いことをやろうとすると動かなくなることがありますが、とりあえず構造を作って粒子を打ち込むのであればできる。

と思っていたわけだ。こんなに苦労するとは思わなかった(8時間ほど)。詰まったのは G4LIB_BUILD_DLLプリプロセッサに追加するところだった。一通り導入方法を書きます。質問があればコメントでどうぞ。

Geant4のWindows + Visual Studioでの導入方法

Geant4の入手

まず、ダウンロードページからデータファイルとコンパイル済みのライブラリを入手しましょう。

http://geant4.web.cern.ch/support/download

「compiled using Visual Studio 2017 (version 15.9.3) on Windows 7, 32 bits, executable installer」と書いてありますが、Windows10でも動きます。

コンパイル済みのライブラリは C:\Program Files (x86)\Geant4 10.5 にインストールしたとします。初期設定でそうなっていると思います。 変更する点は次の絵のPATHを通すところ。とりあえず下記のようにしておこう。

f:id:onsanai:20190412153006p:plain:w300
Geant4 Windows10 Install Options

ソースファイルの入手

インストールした先のexamplesにサンプルコードはありますが、分かりにくいです。全然ベーシックじゃねぇです。KEKのGean4初心者講習の実習用ソースコードの方が分かりやすいです。KEK万歳です。 Geant4Tutorial20171129\TutorialMaterials\P01_FirstStep\source にあります。 直下にある *.cc と、srcにある *.cc includeにある *.hh を使います。

KEK wiki https://wiki.kek.jp/display/geant4/Geant4+Japanese+Tutorial+for+Detector+Simulation+2017

ソリューション、プロジェクトを作る

Visual Studio 2017で、適当な名前を付けて作ってください。

先ほどの *.cc *.hh を全部コピーして、ソースファイルとヘッダーファイルに突っ込みます。正しい流儀ではありませんが、気にしたら負けです。

プロジェクトの設定

Visual Studio内で、インクルードパスを設定し、ライブラリファイルを設定します。

  • インクルードパス: プロパティ→構成プロパティ→VC++ディレクトリ→インクルードディレクトC:\Program Files (x86)\Geant4 10.5\include\Geant4
  • ライブラリファイル: プロパティ→構成プロパティ→リンカー→入力→追加の依存ファイル C:\Program Files (x86)\Geant4 10.5\lib\*.lib

適宜インストール先に置きかえてください。

いくつかのプリプロセッサを設定する必要があります。プリプロセッサは プロパティ→構成プロパティ→C/C++プリプロセッサプリプロセッサの定義に、

G4LIB_BUILD_DLL
WIN32
_CRT_SECURE_NO_WARNINGS

を設定してください。

上から、DLLを呼び出す(dllimport を使う)設定、Windowsのヘッダにするための設定、古いCの関数でエラーを出さないための設定です。

環境変数

環境変数のpathに C:\Program Files (x86)\Geant4 10.5\bin を追加しましょう。

データファイルの環境変数は適宜下記のものを設定してください。使う物理リストによっては他の変数を要求されることもあります。

G4ENSDFSTATEDATA=C:\G4ENSDFSTATE2.2
G4LEDATA=C:\G4EMLOW7.7
G4LEVELGAMMADATA=C:\PhotonEvaporation5.3
G4SAIDXSDATA=C:\G4SAIDDATA2.0
G4PARTICLEXSDATA=C:\G4PARTICLEXS1.1

以前は G4NEUTRONXSDATA=C:\G4NEUTRONXS1.4 が必要だったが、G4PARTICLEXSDATAに統合された?

コードの修正

下記のようなエラーが出ると思います。

Geant4\Geometry.cc(43): error C2039: 'Invisible': 'G4VisAttributes' のメンバーではありません。
Geant4\G4VisAttributes.hh(68): note: 'G4VisAttributes' の宣言を確認してください
Geant4\Geometry.cc(43): error C2065: 'Invisible': 定義されていない識別子です。

Geometry.cc の43行目を下記のように修正してください。

   logVol_World->SetVisAttributes (G4VisAttributes::GetInvisible());

動かしてみる

P1というサンプルコードを動かすと、次のようにコンソールに表示されて止まります。ここにコマンドを入れていくと、粒子を買えたりビームを打ったりすることができます。warningが出ていますが、とりあえず気にしません。なぜ出るのかエラい人教えてください。

**************************************************************
 Geant4 version Name: geant4-10-05    (7-December-2018)
                       Copyright : Geant4 Collaboration
                      References : NIM A 506 (2003), 250-303
                                 : IEEE-TNS 53 (2006), 270-278
                                 : NIM A 835 (2016), 186-225
                             WWW : http://geant4.org/
**************************************************************

<<< Geant4 Physics List simulation engine: FTFP_BERT 2.0


 FTFP_BERT : new threshold between BERT and FTFP is over the interval
 for pions :   3 to 12 GeV
 for kaons :   3 to 12 GeV
 for proton :  3 to 12 GeV
 for neutron : 3 to 12 GeV

### Adding tracking cuts for neutron  TimeCut(ns)= 10000  KinEnergyCut(MeV)= 0
Available UI session types: [ Win32, GAG, csh ]

-------- WWWW ------- G4Exception-START -------- WWWW -------
*** G4Exception : UI0002
      issued by : G4UIExecutive::G4UIExecutive()
Specified session type is not build in your system,
or no session type is specified.
A fallback session type is used.
*** This is just a warning message. ***
-------- WWWW -------- G4Exception-END --------- WWWW -------

Idle>

講義資料の「ユーザ・アプリケーション作成の基礎」に使い方が載っています。コマンドを実際に打ちながら、色々動かしてみましょう。

https://wiki.kek.jp/display/geant4/Geant4+Japanese+Tutorial+for+Detector+Simulation+2017

ソースコードを書く

好きにソースコードを書きましょう。例えば、Geant4でHello World!を書くには次のようにするそうです。

#include <G4coutDestination.hh>

int main() {
    G4cout << "Hello world!" << G4endl;
}

IO部分はとりあえずの実装で良いなら、 std::coutstd::ofstream を使っても動きます。

では、良いシュミレーションライフを。

Windows Subsystem for Linux (WSL) でCERN ROOTバージョン6を動かすまで

この解説は、Linux PCやMac PCがなく、かつLinuxの仮想環境を動かせない人、UpdateされたWindows 10を持っている人、ROOT6を使いたい人向けのものです。

ROOT講習会2019用に加筆修正しました。

Ubuntu 18.04 LTSのインストール

WindowsUbuntuをインストールする。解説は英語しかないが、頑張ってインストールする。

docs.microsoft.com

管理者のPowerShellでコマンドを実行する

Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux

再起動が必要。

Microsoft Storeから「Ubuntu 18.04 LTS」をインストールする

www.microsoft.com

スタート画面からUbuntuの端末を起動する。

f:id:onsanai:20190412134340p:plain:w100
Ubuntu

ユーザー名を決め、パスワードを入れる。

2回目以降に起動するときは、「Windowsキー+R」からファイル名を指定して実行で「bash」と入れて実行する。

f:id:onsanai:20190426120019p:plain:w300
ファイル名を指定して実行

このように実行すると、Windows側のホームディレクトリ「C:\Users\Masahiro」内をカレントディレクトリ(cd)として実行できる。

事前の準備

下記のコマンドでインストールパッケージをアップデートする。 -y は途中のYes/No質問を自動で全てYesにするオプション。以下、断りのない限りUbuntuの端末上のコマンドである。

sudo apt -y update

アップグレードする

sudo apt -y upgrade

下記のコマンドでビルドツール(パッケージ)を一括でインストール。gccやmakeなどがインストールされる。

sudo apt -y install build-essential cmake

GUIを使えるようにする

Windows側にX-Serverをインストールする。

sourceforge.net

VcXsrv (スタートメニュー上ではXLaunchとなってる)を起動する。

f:id:onsanai:20190410103753p:plain:w100
VcXsrv XLaunch
何も考えずに次へ->次へ->次へ->完了。

xfce4パッケージをインストールする。

sudo apt -y install xfce4-terminal xfce4

~/.bash_profile を開き、以下の記述を末尾に追加する。~/.bash_profile を開くには、 nano ~/.bash_profile が便利だろう。

export DISPLAY=:0.0

再読み込みする。

source ~/.bash_profile

xeyesが表示されればOK。

xeyes

f:id:onsanai:20190421130225p:plain:w100
XEYES

Python3でROOTを動かしたい人のための、ROOTバージョン6のコンパイル方法

Python3で動かす必要のない人は、後述の方が楽かつ速い。

奥村氏のテキストを参考に、ROOT v6.16.00 をコンパイル方法を説明する。

ROOTのソースコードをホームディレクトリにダウンロードする。

cd ~
wget https://root.cern/download/root_v6.16.00.source.tar.gz

/use/local へ移動し、管理者権限でROOTのソースコードを展開

cd /usr/local
sudo tar zxvf ~/root_v6.16.00.source.tar.gz

コンパイルに必要な各種パッケージを導入する。 詳細は、UbuntuでROOTをコンパイルするためにで必要なパッケージを確認されたし。Ubuntu16までとなっているが、18系もそう大差はないように思われる。

sudo apt -y install libx11-dev libxpm-dev libxft-dev libxext-dev libgsl0-dev python3-dev

cmakeをビルドする用のディレクトリを作成し、python3付きでコンパイルcmakeする

sudo mkdir root-6.16.00/cmake_build
cd root-6.16.00/cmake_build
sudo cmake ../ -DPYTHON_EXECUTABLE=/usr/bin/python3

makeする。 -j 8 は並列化するためのもので、スレッド数に応じて数字を変えるか、分からない場合は sudo makeだけでよい。 makeはかなり時間がかかる。(当方の環境で8スレッド並列でやって1時間ほどかかった)

sudo make -j 8

4コア8スレッドのラップトップでmakeしている最中のタスクマネージャーはこうなる f:id:onsanai:20190421101551p:plain:w300

~/.bash_profile にROOTのパスを通すため、以下のように記述する。

cd /usr/local/root-6.16.00/cmake_build
source bin/thisroot.sh
cd - > /dev/null

~/.bash_profile を再読み込み

source ~/.bash_profile

次のセクションを飛ばして、ROOTの起動の確認へ。

Pythonを必要としない人のためのROOTバージョン6の簡単インストール方法

ROOT講習会に参加する人は、この「簡単インストール方法」は行わないで下さい。

ROOTの最新版 又は、指定のバージョンをホームディレクトリにダウンロードする。執筆時の最新版は v6.16.00 だった。

cd ~
wget https://root.cern/download/root_v6.16.00.Linux-ubuntu18-x86_64-gcc7.3.tar.gz

/usr/local に展開する。

cd /usr/local
sudo tar xvzf ~/root_v6.16.00.Linux-ubuntu18-x86_64-gcc7.3.tar.gz

~/.bash_profile を開き、末尾に以下の記述追加する

cd /usr/local/root
source bin/thisroot.sh
cd - > /dev/null

~/.bash_profile を再読み込み

source ~/.bash_profile

ROOTの起動の確認

ROOTをグラフィックなしで起動できるか確認する。 -b はグラフィックなしのオプション。

root -b

以下のように表示されればOK

   ------------------------------------------------------------
  | Welcome to ROOT 6.16/00                  https://root.cern |
  |                               (c) 1995-2018, The ROOT Team |
  | Built for linuxx8664gcc on Jan 23 2019, 09:06:13           |
  | From tags/v6-16-00@v6-16-00                                |
  | Try '.help', '.demo', '.license', '.credits', '.quit'/'.q' |
   ------------------------------------------------------------

.q でROOTのモードから抜けられる。次に、ROOTをグラフィックありで起動してみる。

root

ROOTのグラフィックスが表示されることを確認する。

f:id:onsanai:20190410102652p:plain:w500
ROOT グラフィックス

Ubuntuの実態は、ユーザー名「Masahiro」の場合は下記ディレクトリにある。

C:\Users\Masahiro\AppData\Local\Packages\CanonicalGroupLimited.UbuntuonWindows_79rhkp1fndgsc\LocalState\rootfs

リモートでWindows系を動かしているときにマウスが消えた時

ディスプレイを接続していなかったり、マウスを接続していないと、マウスが消えてしまうことがある

f:id:onsanai:20190401185208p:plain:w500

マウスキー機能を有効にします

を有効にしましょう。