物理の駅 by onsanai

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

matplotlibのsubplotsで共通のカラーバーを表示する

qiita.com

これの丸コピだが、一応。

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, axes = plt.subplots(figsize=(10,10),ncols=2,nrows=2,)
im = axes[0,0].pcolormesh(X, Y, Z, cmap='inferno',vmin=0,vmax=1.1)
axes[0,0].set_xlabel("X")
axes[0,0].set_ylabel("Y")

axpos = axes[0,0].get_position()
cbar_ax = fig.add_axes([0.87, axpos.y0, 0.02, axpos.height])
cbar = fig.colorbar(im,cax=cbar_ax)
cbar.set_label("Z")

im = axes[0,1].pcolormesh(X, Y, Z*0.8, cmap='inferno',vmin=0,vmax=1.1)
axes[0,1].set_xlabel("X")
axes[0,1].set_ylabel("Y")

im = axes[1,0].pcolormesh(X, Y, Z*0.6, cmap='inferno',vmin=0,vmax=1.1)
axes[1,0].set_xlabel("X")
axes[1,0].set_ylabel("Y")

im = axes[1,1].pcolormesh(X, Y, Z*0.4, cmap='inferno',vmin=0,vmax=1.1)
axes[1,1].set_xlabel("X")
axes[1,1].set_ylabel("Y")

plt.subplots_adjust(right=0.85)
plt.subplots_adjust(wspace=0.15)
plt.show()

f:id:onsanai:20190920144841p:plain

7-Zipのオプション日本語訳

アーカイブファイル内のファイルのハッシュ値(CRC32)を取得するには、 l コマンドに加え、 -slt を使うべし。

-sltスイッチで得られる情報
  • Path
  • Size
  • Packed Size
  • Modified
  • Attributes
  • CRC
  • Encrypted
  • Method
  • Block
7-Zip 18.05 (x64) : Copyright (c) 1999-2018 Igor Pavlov : 2018-04-30

Usage: 7z <command> [<switches>...] <archive_name> [<file_names>...]
7z <コマンド> [<スイッチ>...] <アーカイブ名> [<ファイル名>...]

<Commands>
  a : ファイルをアーカイブに追加Add files to archive
  b : ベンチマークBenchmark
  d : アーカイブからファイルを削除Delete files from archive
  e : アーカイブからファイルを抽出 (ディレクトリ名を使用せず)Extract files from archive (without using directory names)
  h : ファイルのハッシュ値を計算Calculate hash values for files
  i : サポートされている形式に関する情報を表示Show information about supported formats
  l : アーカイブの内容をリストList contents of archive
  rn : アーカイブ内のファイルの名前を変更Rename files in archive
  t : アーカイブの整合性をテストTest integrity of archive
  u : ファイルを更新してアーカイブUpdate files to archive
  x : フルパスを用いた抽出eXtract files with full paths

<Switches>
  -- : 解析を停止Stop switches parsing
  @listfile : ファイル名を含むリストファイルへのパスを設定set path to listfile that contains file names
  -ai[r[-|0]]{@listfile|!wildcard} : アーカイブを含めるInclude archives
  -ax[r[-|0]]{@listfile|!wildcard} : アーカイブを除外するeXclude archives
  -ao{a|s|t|u} : 上書きモードを設定set Overwrite mode
  -an : archive_nameフィールドを無効disable archive_name field
  -bb[0-3] : 出力ログレベルの設定set output log level
  -bd : 進捗状況インジケーターを無効disable progress indicator
  -bs{o|e|p}{0|1|2} : 出力/エラー/進捗の出力の有無を設定set output stream for output/error/progress line
  -bt : 実行時間統計を表示show execution time statistics
  -i[r[-|0]]{@listfile|!wildcard} : ファイル名を含めるInclude filenames
  -m{Parameters} : 圧縮方法を設定set compression Method
    -mmt[N] : CPUスレッド数を設定set number of CPU threads
    -mx[N] : 圧縮レベルを設定 -mx1(最速) -mv9(超圧縮) set compression level: -mx1 (fastest) ... -mx9 (ultra)
  -o{Directory} : 出力ディレクトリを設定set Output directory
  -p{Password} : パスワードを設定set Password
  -r[-|0] : 再帰サブディレクトリRecurse subdirectories
  -sa{a|e|s} : アーカイブ名モードを設定set Archive name mode
  -scc{UTF-8|WIN|DOS} : コンソール入出力の文字セットを設定set charset for for console input/output
  -scs{UTF-8|UTF-16LE|UTF-16BE|WIN|DOS|{id}} : リストファイルの文字セットを設定set charset for list files
  -scrc[CRC32|CRC64|SHA1|SHA256|*] : x,e,hコマンドハッシュ関数を設定set hash function for x, e, h commands
  -sdel : 圧縮後にファイルを削除delete files after compression
  -seml[.] : メールでアーカイブを送信send archive by email
  -sfx[{name}] : SFXアーカイブを作成Create SFX archive
  -si[{name}] : stdinからデータを読み取りread data from stdin
  -slp : ラージページモードを設定set Large Pages mode
  -slt : l(リスト)コマンドの技術情報を表示show technical information for l (List) command
  -snh : ハードリンクをリンクとして保存store hard links as links
  -snl : シンボリックリンクをリンクとして保存store symbolic links as links
  -sni : NTセキュリティ情報を保存store NT security information
  -sns[-] : NTFS代替ストリームを保存store NTFS alternate streams
  -so : 標準出力にデータを書き込みwrite data to stdout
  -spd : ファイル名のワイルドカード一致を無効disable wildcard matching for file names
  -spe : 抽出コマンドのルートフォルダーの重複を除去eliminate duplication of root folder for extract command
  -spf : 完全修飾ファイルパスを仕様use fully qualified file paths
  -ssc[-] : 大文字と小文字を区別するモードを設定set sensitive case mode
  -sse : アーカイブの作成を停止stop archive creating, if it can't open some input file
  -ssw : 共有ファイルを圧縮compress shared files
  -stl : 最後に変更されたファイルからアーカイブのタイムスタンプを設定set archive timestamp from the most recently modified file
  -stm{HexMask} : CPUスレッドのアフィニティマスクを設定(16進数)set CPU thread affinity mask (hexadecimal number)
  -stx{Type} : アーカイブタイプを除外exclude archive type
  -t{Type} : アーカイブのタイプを設定Set type of archive
  -u[-][p#][q#][r#][x#][y#][z#][!newArchiveName] : オプションを更新Update options
  -v{Size}[b|k|m|g] : ボリュームを作成Create volumes
  -w[{path}] : 作業ディレクトリを割当。空のパスは一時ディレクトリを意味assign Work directory. Empty path means a temporary directory
  -x[r[-|0]]{@listfile|!wildcard} : ファイル名を除外 eXclude filenames
  -y : 全ての要求でYesを仮定assume Yes on all queries

https://info.nrao.edu/computing/guide/file-access-and-archiving/7zip/7z-7za-command-line-guide

Python3で、正規分布でフィッティングし、各パラメータとカイ二乗を得る汎用的な関数を作ってみる

phst.hateblo.jp

これを少し汎用化して、リスト、ビンの数、最小値、最大値を与えて、正規分布でフィッティングする関数を作ってみた。

オプションで平均値の初期値、標準偏差の初期値、グラフを描画するかどうかを与える。

注: グラフの縦方向のエラーが分かりにくかったので、 plot -> errorbar へ修正した

使い方

import numpy.random
fit_gaussian(numpy.random.randn(10000),50,-5,5,show_plot=True)

関数

import math

def fit_gaussian(vx, nbin,min_x,max_x,*,mean_value=None,stdev_value=None,show_plot=False):
    '''
    return chi2, constant, error, mean, error, sigma, error, degree of freedom
    '''
    if len(vx) == 0:return 0,0,0,0,0,0,0,0
    import numpy as np
    import pandas as pd
    import matplotlib.pyplot as plt
    from scipy.optimize import curve_fit
    from scipy.stats import norm
    from scipy.stats import chisquare
    from statistics import mean, median,variance,stdev

    def gaussian_func(x, constant, mean, sigma):
        return constant * np.exp(- (x - mean) ** 2 / (2 * sigma ** 2))

    arr_x = [0 for i in range(nbin)]
    arr_y = [0 for i in range(nbin)]
    arr_yerror = [0 for i in range(nbin)]

    wbin = (max_x - min_x) / nbin
    if wbin <= 0:return 0,0,0,0,0,0,0,0

    for i in range(nbin): arr_x[i] = min_x + wbin * (i + 0.5)

    for x in vx:
        bin = math.floor((x - min_x) / wbin)
        if bin < 0:continue
        if bin >= nbin:continue
        arr_y[bin]+=1

    for i in range(nbin): arr_yerror[i] = math.sqrt(arr_y[i])

    if show_plot:
        import matplotlib.pyplot as plt
        plt.errorbar(arr_x,arr_y,linestyle="None",marker="+",yerr=arr_yerror)
        plt.show()

    if mean_value != None and stdev_value != None:
        parameter_initial = np.array([max(arr_y), mean_value, stdev_value]) #初期値は適宜与えるべし
    else:
        parameter_initial = np.array([max(arr_y), mean(vx), stdev(vx)]) #初期値は適宜与えるべし
    
    arr_x2 = []
    arr_y2 = []
    arr_yerror2 = []
    for x,y,yerror in zip(arr_x,arr_y,arr_yerror): #entry=0のデータを除外
        if y == 0:continue
        arr_x2.append(x)
        arr_y2.append(y)
        arr_yerror2.append(yerror)

    if len(arr_x2) < 4:return 0,0,0,0,0,0,0,0

    popt, pcov = curve_fit(gaussian_func, arr_x2, arr_y2, sigma=arr_yerror2,absolute_sigma =True, p0=parameter_initial)
    stderr = np.sqrt(np.diag(pcov)) #対角行列を取って平方根

    arr_fitted_y = gaussian_func(np.array(arr_x2), popt[0], popt[1], popt[2]) 
    chisq, p = chisquare(f_exp=arr_y2, f_obs=arr_fitted_y, ddof = 2)
    #print(f"Chi2 {chisq:.6f}")

    mat = np.vstack((popt,stderr)).T
    df = pd.DataFrame(mat,index=("Constant", "Mean", "Sigma"), columns=("Estimate", "Std. error"))
    #print(df)

    if show_plot:
        import matplotlib.pyplot as plt
        plt.errorbar(arr_x,arr_y,linestyle="None",marker="+",yerr=arr_yerror)
        arr_y = gaussian_func(np.array(arr_x),popt[0],popt[1],popt[2])
        plt.plot(arr_x,arr_y)
        plt.show()

    return chisq,popt[0],stderr[0],popt[1],stderr[1],popt[2],stderr[2], len(arr_x) - 3

f:id:onsanai:20190909210252p:plain:w500

Anacondaをインストールしてからのコマンド一覧

pip自体のアップグレード

pip install --upgrade pip --user

--upgrade -U は同じ意味

依存関係のチェック

pip check

アップデートのチェック

pip list --outdated

ディープラーニング関連

pip install tensorflow
pip install tensorflow-gpu
pip install keras

画像処理関連

pip install opencv-python

フォント関連

TensorFlowをWindows + Nvidia GPUで使ってみる (2019/08/21)

日々バージョンが新しくなってるので、2019/08/21時点で。

Cuda Toolkit 10.0

ダウンロードとインストール

https://developer.nvidia.com/cuda-10.0-download-archive

現時点での最新版は10.1だったが、pipからインストールできるtensorflow-gpuは10.0だった

cuDNN v7.6.2 をインストール

cuDNN v7.6.2 (July 22, 2019), for CUDA 10.0 をダウンロード

https://developer.nvidia.com/rdp/cudnn-download

Pythonにtensorflowをインストール

pip install tensorflow
pip install tensorflow-gpu

サンプルコード

https://www.tensorflow.org/tutorials

import os
os.environ["CUDA_DEVICE_ORDER"] = "PCI_BUS_ID" 
os.environ["CUDA_VISIBLE_DEVICES"] = "0"

import tensorflow as tf
mnist = tf.keras.datasets.mnist

(x_train, y_train),(x_test, y_test) = mnist.load_data()
x_train, x_test = x_train / 255.0, x_test / 255.0

model = tf.keras.models.Sequential([
  tf.keras.layers.Flatten(input_shape=(28, 28)),
  tf.keras.layers.Dense(512, activation=tf.nn.relu),
  tf.keras.layers.Dropout(0.2),
  tf.keras.layers.Dense(10, activation=tf.nn.softmax)
])
model.compile(optimizer='adam',
              loss='sparse_categorical_crossentropy',
              metrics=['accuracy'])

model.fit(x_train, y_train, epochs=5)
model.evaluate(x_test, y_test)

GPUを使いたくない場合は CUDA_VISIBLE_DEVICES-1 とすればよい

結果

WARNING: Logging before flag parsing goes to stderr.
W0821 20:29:07.159986  2124 deprecation.py:506] From C:\Users\Masahiro\Anaconda3\lib\site-packages\tensorflow\python\ops\init_ops.py:1251: calling VarianceScaling.__init__ (from tensorflow.python.ops.init_ops) with dtype is deprecated and will be removed in a future version.
Instructions for updating:
Call initializer instance with the dtype argument instead of passing it to the constructor
2019-08-21 20:29:07.664596: I tensorflow/core/platform/cpu_feature_guard.cc:142] Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX2
2019-08-21 20:29:07.738388: I tensorflow/stream_executor/platform/default/dso_loader.cc:42] Successfully opened dynamic library nvcuda.dll
2019-08-21 20:29:08.677659: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1640] Found device 0 with properties:
name: GeForce GTX 1050 major: 6 minor: 1 memoryClockRate(GHz): 1.493
pciBusID: 0000:02:00.0
2019-08-21 20:29:08.727962: I tensorflow/stream_executor/platform/default/dlopen_checker_stub.cc:25] GPU libraries are statically linked, skip dlopen check.
2019-08-21 20:29:08.740897: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1763] Adding visible gpu devices: 0
2019-08-21 20:29:10.242017: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1181] Device interconnect StreamExecutor with strength 1 edge matrix:
2019-08-21 20:29:10.253687: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1187]      0
2019-08-21 20:29:10.276918: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1200] 0:   N
2019-08-21 20:29:10.285098: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1326] Created TensorFlow device (/job:localhost/replica:0/task:0/device:GPU:0 with 1347 MB memory) -> physical GPU (device: 0, name: GeForce GTX 1050, pci bus id: 0000:02:00.0, compute capability: 6.1)
Epoch 1/5
60000/60000 [==============================] - 18s 299us/sample - loss: 0.2221 - acc: 0.9330
Epoch 2/5
60000/60000 [==============================] - 21s 355us/sample - loss: 0.0967 - acc: 0.9705
Epoch 3/5
60000/60000 [==============================] - 30s 493us/sample - loss: 0.0693 - acc: 0.9777
Epoch 4/5
60000/60000 [==============================] - 16s 264us/sample - loss: 0.0539 - acc: 0.9829
Epoch 5/5
60000/60000 [==============================] - 14s 235us/sample - loss: 0.0441 - acc: 0.9861
10000/10000 [==============================] - 2s 185us/sample - loss: 0.0631 - acc: 0.9801

https://qiita.com/tilfin/items/24e9491eb8a4ce42eea6

https://qiita.com/resnant/items/80730ae63b26ce39c2e0

Pythonでデッドロックを回避しながらサブプロセスの標準出力を1行ずつ読み込む

Windowsだとシステムからの文字コードshift_jisなのでそれに対応

stderr = subprocess.PIPE にすると、 proc.stdout.readline を先に書いたとき、 stderr側での出力が貯まりすぎると、デッドロックが発生することがあるらしい。なので、stderrもSTDOUT側に流して、 stdout.readline だけで1行ずつ読み込む。

import subprocess
import sys

def run(exe_path,current_dir=None,*, parse=None, silent_pre=False, silent_cout=False,end="\n"):
    if not silent_pre:
        print("Exe:",exe_path)
        if current_dir != None:
            print("Target:",current_dir)

    if current_dir != None:
        proc = subprocess.Popen(exe_path,cwd=current_dir, stdout = subprocess.PIPE, stderr = subprocess.STDOUT,shell=True)
    else:
        proc = subprocess.Popen(exe_path,stdout = subprocess.PIPE, stderr = subprocess.STDOUT,shell=True)

    for line in iter(proc.stdout.readline,b''):
        if silent_cout:continue
        try:line_str = line.rstrip().decode("utf8")
        except:line_str = line.rstrip().decode("shift_jis")
        if parse != None and parse(line_str) == False:continue
        print(line_str,end=end)
    proc.wait()
    ret = int(proc.returncode)
    if  ret != 0:
        print("Return:",ret,"from",exe_path,"in",current_dir)

    return ret 

完全に自信はない。これで良い?

communicate() を使うと一気にstdoutもstderrも読めるらしいけど、リアルタイム表示したいので使えない。

参照

Pythonでサブプロセスの標準出力を1行ずつ読み込む - Qiita

Python の subprocess で出力を受け取るときは communicate() を使おう - Qiita

WindowsでもPythonのコンソール上で色文字と色背景を使う

import colorama

colorama.init()
print(colorama.Back.GREEN + colorama.Fore.RED + "これがテストです")
print("設定は引き継がれる")
print(colorama.Style.RESET_ALL,end="")
print("リセットでもとに戻る")
colorama.deinit()

f:id:onsanai:20190811171810p:plain:w200

colorama.deinit() をしないまま、 colorama.init() し続けると248回目あたりでエラーが出るので注意。

直交座標系のずれ量を飛跡の角度に相当するRadial Lateral空間に変換するコード

放射線の飛跡のように、座標(cx, cy) 角度 (ax, ay)で表すことの出来る量の比較をする時、しばしば飛跡の進行方向(Radial方向)と垂直方向(Lateral方向)に分離して考えることがある。

飛跡1 (cx1, cy1, ax1, ay1)、飛跡2 (cx2, cy2, ax2, ay2) があるとき、角度差は次のように求めることができる。

import math

# 方法1
def xy2radial(cx1,cy1,ax1,ay1,cx2,cy2,ax2,ay2):
    ax = (ax1 + ax2) * 0.5
    ay = (ay1 + ay2) * 0.5
    r = (ax ** 2 + ay ** 2) ** 0.5
    ax /= r
    ay /= r
    dax = ax2 - ax1
    day = ay2 - ay1
    dar = ax * dax + ay * day
    dal = -ay * dax + ax * day
    dcx = cx2 - cx1
    dcy = cy2 - cy1
    dcr = ax * dcx + ay * dcy
    dcl = -ay * dcx + ax * dcy

    return dcr,dcl,dar,dal

# 方法2
def xy2radial2(cx1,cy1,ax1,ay1,cx2,cy2,ax2,ay2):
    ax = (ax1 + ax2) * 0.5
    ay = (ay1 + ay2) * 0.5
    rotation_cos = math.cos(-math.atan2(ay,ax))
    rotation_sin = math.sin(-math.atan2(ay,ax))
    dax = ax2 - ax1
    day = ay2 - ay1
    dar = dax * rotation_cos - day * rotation_sin
    dal = dax * rotation_sin + day * rotation_cos
    dx = cx2 - cx1
    dy = cy2 - cy1
    dcr = dx * rotation_cos - dy * rotation_sin
    dcl = dx * rotation_sin + dy * rotation_cos

    return dcr,dcl,dar,dal

処理時間は若干方法1の方が早かった。三角関数の処理は、CPUで実装されている? らしいのでそんなに遅くもない。

f:id:onsanai:20190808123417p:plain

参考文献 https://dx.doi.org/10.1093/ptep/ptx131

高い飛跡密度における飛跡再構成アルゴリズム (日本語訳)

arxiv.org

の付録Bの日本語訳です。一部に筆者の意訳を含みます。

原子核乾板は、その高分解能により各フィルムに記録された膨大な量のイベント又は10^ 5 tracks/cm^ 2オーダーの飛跡の陽子反応を再構成することができる。 これは、位置分解能0.4 μmと角度分解能2mradのベクトル情報を持つベーストラックの性質にも依っている。

飛跡再構成の基本的概念は、位置及び角度空間における異なるフィルム上のベーストラックの対応付に基づいている。 広く用いられてきたアルゴリズムでは、2つの連続したベーストラックの対応テストが用いられている。 しかし、DsTau実験のように高い飛跡密度環境では再構成が失敗することがある。 特に、数mrad以内の同じ方向に進む2つ以上の飛跡が数ミクロン以内で接近すると、このアルゴリズムは正しい経路を決定できないことがある。

新しいトラッキングアルゴリズムは、高い飛跡密度と狭い角度広がり環境で飛跡を再構成するために開発した。 複数の経路候補が生じた時、まずは全ての可能な経路を生成する。 図21-(a)の場合、Z _ 1からZ _ 2間で2^ 4=16の可能な経路が考えられる。 それぞれの経路に対して、経路に含まれるベーストラックによって作られた面積の平均に基づいた次のテスト変数を評価する。

 \displaystyle
a^{average}=\left(\sum_i^{n-2}a^{pos}+\sum_i^{n-1} a^{angle}\right)/(n-0.5).

ここで、a^ {average}は図21-(b)で示すようにベーストラックの位置a^ {pos}と角度a^ {angle}で作られる平均面積である。nは経路に含まれるベーストラック数で、-0.5は長い経路に重みを付けるための経験値である。最小のa^ {average}を持つ経路が最良の経路として選ばれる。 この手順を、選択した経路に含まれるベーストラックを取り除きながら繰り返す。

 \displaystyle
a^{pos}=\frac{1}{2}\cdot \left|\vec{AB} \times \vec{AC}\right|

 \displaystyle
a^{angle}=\frac{1}{2}\cdot \frac{\left|\vec{AB}\right|}{2} \cdot \left|(\vec{V_A}+\vec{V_B}) \times \frac{\vec{AB}}{2}\right|

f:id:onsanai:20190731104845p:plain f:id:onsanai:20190731104855p:plain

Python3でYAMLファイルをMessagePack形式でファイルに出力する方法 又は 出力したファイルから読み込む方法

filename_yml という YAML形式のファイルがあり、filename_msgというMessagePack形式で出力したいとする。

filename_yml = "test.yml"
filename_msg = "test.msg"

import yaml
import msgpack 
obj = yaml.load(open(filename_yml),Loader=yaml.CLoader)
msgpack.dump(obj,open(filename_msg,"wb"), use_bin_type=False)
obj = msgpack.load(open(filename_msg,"rb"),raw=False)

use_bin_type=False 及び raw=False は、文字コードを ascii のstringにする指定である。

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"

NuGetで自作パッケージを公開した

pythonパッケージに比べて簡単すぎた。参考にしたのは以下のサイト

qiita.com

ソースファイル

Masahiro Yoshimoto / affine6p-cs · GitLab

パッケージ

NuGet Gallery | Affine6P 1.0.2