<?xml version="1.0"?>
<?xml-stylesheet type="text/css" href="https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/skins/common/feed.css?303"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ja">
		<id>https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Kttn</id>
		<title>Eospedia - 利用者の投稿記録 [ja]</title>
		<link rel="self" type="application/atom+xml" href="https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Kttn"/>
		<link rel="alternate" type="text/html" href="https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/%E7%89%B9%E5%88%A5:%E6%8A%95%E7%A8%BF%E8%A8%98%E9%8C%B2/Kttn"/>
		<updated>2026-05-11T23:37:26Z</updated>
		<subtitle>利用者の投稿記録</subtitle>
		<generator>MediaWiki 1.23.6</generator>

	<entry>
		<id>https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/RELION</id>
		<title>RELION</title>
		<link rel="alternate" type="text/html" href="https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/RELION"/>
				<updated>2021-01-07T13:09:27Z</updated>
		
		<summary type="html">&lt;p&gt;Kttn: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;2017年現在で、デファクトスタンダードとなっているRELIONに関して、まとめたものです。&lt;br /&gt;
&lt;br /&gt;
== 導入方法　==&lt;br /&gt;
=== [[RELIONのMacへの導入]]===&lt;br /&gt;
===RELION2のLinuxへの導入===&lt;br /&gt;
* [[ハードウェア]]&lt;br /&gt;
* [[RELION2のUbuntuへの導入]]&lt;br /&gt;
* [[RELION2のCentOSへの導入]]&lt;br /&gt;
* [[RELION2のScientificLinux7への導入]]&lt;br /&gt;
&lt;br /&gt;
== [[RELIONチュートリアル]]==&lt;br /&gt;
RELIONを使った構造解析に関するチュートリアルサイトです。&lt;br /&gt;
 [[RELIONチュートリアル]]:2.0&lt;br /&gt;
 [[RELION3チュートリアル]]:3.0&lt;br /&gt;
 [[RELION3.1チュートリアル]]:3.1&lt;br /&gt;
&lt;br /&gt;
== [[RELION理論]]==&lt;br /&gt;
[[RELION]]のアルゴリズムを通して、三次元再構成の基本を示した頁になります。&lt;br /&gt;
&lt;br /&gt;
== [[RELION実装]]==&lt;br /&gt;
[[RELION]]の実装を通して、三次元再構成の基本を示した頁になります。&lt;br /&gt;
&lt;br /&gt;
== [[RELION tips]] ==&lt;br /&gt;
[[RELION]]のtipsをまとめた項になります。&lt;br /&gt;
&lt;br /&gt;
== [[Visual Studio CodeでRELIONのdebug]] ==&lt;br /&gt;
Visual Studio Codeを使って[[RELION]]のデバッグ実行をする方法&lt;/div&gt;</summary>
		<author><name>Kttn</name></author>	</entry>

	<entry>
		<id>https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/instamatic</id>
		<title>instamatic</title>
		<link rel="alternate" type="text/html" href="https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/instamatic"/>
				<updated>2020-12-23T12:23:37Z</updated>
		
		<summary type="html">&lt;p&gt;Kttn: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== 必要要件 ==&lt;br /&gt;
* Windows&lt;br /&gt;
* Python3&lt;br /&gt;
* JEOL TEMを使う場合&lt;br /&gt;
** JEOL TemExternal&lt;br /&gt;
* シミュレーションモードを使う場合&lt;br /&gt;
** 特になし&lt;br /&gt;
&lt;br /&gt;
== インストール ==&lt;br /&gt;
最新版のインストール方法について説明する。&lt;br /&gt;
&lt;br /&gt;
* 参考： https://github.com/stefsmeets/instamatic/blob/master/docs/setup.md&lt;br /&gt;
&lt;br /&gt;
https://github.com/stefsmeets/instamatic より、ソースコードをクローンする。&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git clone https://github.com/stefsmeets/instamatic.git&lt;br /&gt;
cd instamatic&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
※ commit 2c32254以降を使用すること。古いバージョンだとsimulationモードがエラーで動作しない場合あり。&lt;br /&gt;
&lt;br /&gt;
依存ライブラリを記述したrequirements.txtがあるので、pipでそれらをインストールする。&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
pip install -r requirements.txt&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
instamaticをPython環境へインストールする。&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
python setup.py install&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== シミュレーションモード ==&lt;br /&gt;
実際にTEM、カメラに接続せず、シミュレーションモードで動作させる方法。&lt;br /&gt;
=== 初期設定 ===&lt;br /&gt;
Powershellを開き、instamaticを起動する。&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
instamatic.exe&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
初回起動の時は、設定ファイルを格納したディレクトリを自動で作ってくれる。執筆者環境の場合、C:\Users\kttn8\AppData\Roaming\instamatic\config が作成された。&lt;br /&gt;
&lt;br /&gt;
コンフィグが作成されたら、autoconfigで設定を変えられる。&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
instamatic.autoconfig.exe&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
インタラクティブなプロンプトが表示されるので、適宜答えていく。今回はシミュレーションモードで設定をしてみる。&lt;br /&gt;
&lt;br /&gt;
↓プロンプトでのやりとり&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
PS C:\Users\kttn8&amp;gt; instamatic.autoconfig.exe&lt;br /&gt;
Config directory: C:\Users\kttn8\AppData\Roaming\instamatic\config&lt;br /&gt;
&lt;br /&gt;
 1: jeol&lt;br /&gt;
 2: fei&lt;br /&gt;
 3: simulate&lt;br /&gt;
&lt;br /&gt;
Which microscope can I connect to? [simulate] &amp;gt;&amp;gt;&lt;br /&gt;
simulate&lt;br /&gt;
&lt;br /&gt;
 1: None&lt;br /&gt;
 2: gatan&lt;br /&gt;
 3: tvips&lt;br /&gt;
 4: simulate&lt;br /&gt;
&lt;br /&gt;
Which camera can I connect to? [simulate] &amp;gt;&amp;gt;&lt;br /&gt;
simulate&lt;br /&gt;
&lt;br /&gt;
 1: C:\Users\kttn8\AppData\Local\Programs\Python\Python38\lib\site-packages\instamatic-1.3.0-py3.8.egg\instamatic\config\camera\orius.yaml&lt;br /&gt;
 2: C:\Users\kttn8\AppData\Local\Programs\Python\Python38\lib\site-packages\instamatic-1.3.0-py3.8.egg\instamatic\config\camera\simulate.yaml&lt;br /&gt;
 3: C:\Users\kttn8\AppData\Local\Programs\Python\Python38\lib\site-packages\instamatic-1.3.0-py3.8.egg\instamatic\config\camera\simulateDLL.yaml&lt;br /&gt;
 4: C:\Users\kttn8\AppData\Local\Programs\Python\Python38\lib\site-packages\instamatic-1.3.0-py3.8.egg\instamatic\config\camera\timepix.yaml&lt;br /&gt;
 5: C:\Users\kttn8\AppData\Local\Programs\Python\Python38\lib\site-packages\instamatic-1.3.0-py3.8.egg\instamatic\config\camera\tvips-f416.yaml&lt;br /&gt;
 6: C:\Users\kttn8\AppData\Local\Programs\Python\Python38\lib\site-packages\instamatic-1.3.0-py3.8.egg\instamatic\config\camera\tvips-xf416.yaml&lt;br /&gt;
 7: None&lt;br /&gt;
&lt;br /&gt;
Which camera type do you want to use (select closest one and modify if needed)? [None] &amp;gt;&amp;gt;&lt;br /&gt;
None&lt;br /&gt;
&lt;br /&gt;
Mode: mag1&lt;br /&gt;
High tension: 200 kV&lt;br /&gt;
Current density: 100221.24 pA/cm2&lt;br /&gt;
GunShift(x=57788, y=11163)&lt;br /&gt;
GunTilt(x=42281, y=34217)&lt;br /&gt;
BeamShift(x=32772, y=30285)&lt;br /&gt;
BeamTilt(x=36439, y=255)&lt;br /&gt;
ImageShift1(x=37126, y=55930)&lt;br /&gt;
ImageShift2(x=42692, y=62856)&lt;br /&gt;
DiffShift(x=52452, y=45943)&lt;br /&gt;
Stage(x=52584.0, y=-33851.0, z=-8761.0, a=35.0, b=-9.0)&lt;br /&gt;
Magnification(value=25000, index=10)&lt;br /&gt;
DiffFocus(value=n/a)&lt;br /&gt;
Brightness(value=20770)&lt;br /&gt;
SpotSize(1)&lt;br /&gt;
Saved alignments: ('neutral.yaml',)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wrote files config files:&lt;br /&gt;
    Copy simulate_tem.yaml -&amp;gt; `C:\Users\kttn8\AppData\Roaming\instamatic\config\simulate_tem.yaml`&lt;br /&gt;
    Copy simulate_calib.yaml -&amp;gt; `C:\Users\kttn8\AppData\Roaming\instamatic\config\simulate_calib.yaml`&lt;br /&gt;
&lt;br /&gt;
In `settings.yaml`:&lt;br /&gt;
    microscope: simulate_tem&lt;br /&gt;
    calibration: simulate_calib&lt;br /&gt;
&lt;br /&gt;
Todo: Check and update the pixelsizes in `simulate_calib.yaml`&lt;br /&gt;
    In real space, pixelsize in nm&lt;br /&gt;
    In reciprocal space, pixelsize in px/Angstrom&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 起動方法 ===&lt;br /&gt;
シェルで以下コマンドを打つ。&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
instamatic&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
すると以下のようなGUIが立ち上がる。パスとかは適宜変更しないと、何か操作したときにエラーメッセージが多分出てくる。&lt;br /&gt;
&lt;br /&gt;
[[File:2020-04-28 (1).png|x400px]]&lt;br /&gt;
&lt;br /&gt;
== コンソール実行 ==&lt;br /&gt;
=== JEOL TemExternal(COM)をPythonから直接叩く ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
import comtypes&lt;br /&gt;
comtypes.CoInitialize()&lt;br /&gt;
import comtypes.client&lt;br /&gt;
temext = comtypes.client.GetModule(('{CE70FCE4-26D9-4BAB-9626-EC88DB7F6A0A}', 3, 0))&lt;br /&gt;
# TEM3コンポーネントのオブジェクト&lt;br /&gt;
tem3 = comtypes.client.CreateObject(temext.TEM3, comtypes.CLSCTX_ALL)&lt;br /&gt;
# LEN3インターフェイス&lt;br /&gt;
lens3 = tem3.CreateLens3()&lt;br /&gt;
# DEF3インターフェイス (deflector制御API)&lt;br /&gt;
stage3 = tem3.CreateDef3()&lt;br /&gt;
#　などなど&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Instamatic TEMControllerでTEMを制御 ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
from instamatic import TEMController&lt;br /&gt;
ctrl = TEMController.initialize(tem_name='jeol', cam_name=None)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* instamaticのTEMServer使わない場合(setting.yamlでuse_tem_server=False)は ctrl.tem が JeolMicroscopeクラスインスタンスになり、そのメソッドからTemExternalのCOMインターフェイスを間接的にたたく感じになる&lt;br /&gt;
* TEMServer使う場合は、ctrl.tem が MicroscopeClientクラスインスタンスになり、TEMServerを介してJeolMicroscopeインスタンスにコマンド渡す感じ (使う分には、ctrl.temをJeolMicroscopeインスタンスだと思ってAPI叩けばok)&lt;br /&gt;
&lt;br /&gt;
== コンフィグロードのテスト ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
from instamatic import config&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* configの__init__.pyの中で各種読み込みが実行されて、各種コンフィグはディクショナリ型の値をもつ属性として保持される&lt;br /&gt;
* 例えば config.microscope.wavelength のようにアクセス&lt;/div&gt;</summary>
		<author><name>Kttn</name></author>	</entry>

	<entry>
		<id>https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/instamatic</id>
		<title>instamatic</title>
		<link rel="alternate" type="text/html" href="https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/instamatic"/>
				<updated>2020-12-23T10:23:56Z</updated>
		
		<summary type="html">&lt;p&gt;Kttn: /* Instamatic TEMControllerでTEMを制御 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== 必要要件 ==&lt;br /&gt;
* Windows&lt;br /&gt;
* Python3&lt;br /&gt;
* JEOL TEMを使う場合&lt;br /&gt;
** JEOL TemExternal&lt;br /&gt;
* シミュレーションモードを使う場合&lt;br /&gt;
** 特になし&lt;br /&gt;
&lt;br /&gt;
== インストール ==&lt;br /&gt;
最新版のインストール方法について説明する。&lt;br /&gt;
&lt;br /&gt;
* 参考： https://github.com/stefsmeets/instamatic/blob/master/docs/setup.md&lt;br /&gt;
&lt;br /&gt;
https://github.com/stefsmeets/instamatic より、ソースコードをクローンする。&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git clone https://github.com/stefsmeets/instamatic.git&lt;br /&gt;
cd instamatic&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
※ commit 2c32254以降を使用すること。古いバージョンだとsimulationモードがエラーで動作しない場合あり。&lt;br /&gt;
&lt;br /&gt;
依存ライブラリを記述したrequirements.txtがあるので、pipでそれらをインストールする。&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
pip install -r requirements.txt&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
instamaticをPython環境へインストールする。&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
python setup.py install&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== シミュレーションモード ==&lt;br /&gt;
実際にTEM、カメラに接続せず、シミュレーションモードで動作させる方法。&lt;br /&gt;
=== 初期設定 ===&lt;br /&gt;
Powershellを開き、instamaticを起動する。&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
instamatic.exe&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
初回起動の時は、設定ファイルを格納したディレクトリを自動で作ってくれる。執筆者環境の場合、C:\Users\kttn8\AppData\Roaming\instamatic\config が作成された。&lt;br /&gt;
&lt;br /&gt;
コンフィグが作成されたら、autoconfigで設定を変えられる。&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
instamatic.autoconfig.exe&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
インタラクティブなプロンプトが表示されるので、適宜答えていく。今回はシミュレーションモードで設定をしてみる。&lt;br /&gt;
&lt;br /&gt;
↓プロンプトでのやりとり&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
PS C:\Users\kttn8&amp;gt; instamatic.autoconfig.exe&lt;br /&gt;
Config directory: C:\Users\kttn8\AppData\Roaming\instamatic\config&lt;br /&gt;
&lt;br /&gt;
 1: jeol&lt;br /&gt;
 2: fei&lt;br /&gt;
 3: simulate&lt;br /&gt;
&lt;br /&gt;
Which microscope can I connect to? [simulate] &amp;gt;&amp;gt;&lt;br /&gt;
simulate&lt;br /&gt;
&lt;br /&gt;
 1: None&lt;br /&gt;
 2: gatan&lt;br /&gt;
 3: tvips&lt;br /&gt;
 4: simulate&lt;br /&gt;
&lt;br /&gt;
Which camera can I connect to? [simulate] &amp;gt;&amp;gt;&lt;br /&gt;
simulate&lt;br /&gt;
&lt;br /&gt;
 1: C:\Users\kttn8\AppData\Local\Programs\Python\Python38\lib\site-packages\instamatic-1.3.0-py3.8.egg\instamatic\config\camera\orius.yaml&lt;br /&gt;
 2: C:\Users\kttn8\AppData\Local\Programs\Python\Python38\lib\site-packages\instamatic-1.3.0-py3.8.egg\instamatic\config\camera\simulate.yaml&lt;br /&gt;
 3: C:\Users\kttn8\AppData\Local\Programs\Python\Python38\lib\site-packages\instamatic-1.3.0-py3.8.egg\instamatic\config\camera\simulateDLL.yaml&lt;br /&gt;
 4: C:\Users\kttn8\AppData\Local\Programs\Python\Python38\lib\site-packages\instamatic-1.3.0-py3.8.egg\instamatic\config\camera\timepix.yaml&lt;br /&gt;
 5: C:\Users\kttn8\AppData\Local\Programs\Python\Python38\lib\site-packages\instamatic-1.3.0-py3.8.egg\instamatic\config\camera\tvips-f416.yaml&lt;br /&gt;
 6: C:\Users\kttn8\AppData\Local\Programs\Python\Python38\lib\site-packages\instamatic-1.3.0-py3.8.egg\instamatic\config\camera\tvips-xf416.yaml&lt;br /&gt;
 7: None&lt;br /&gt;
&lt;br /&gt;
Which camera type do you want to use (select closest one and modify if needed)? [None] &amp;gt;&amp;gt;&lt;br /&gt;
None&lt;br /&gt;
&lt;br /&gt;
Mode: mag1&lt;br /&gt;
High tension: 200 kV&lt;br /&gt;
Current density: 100221.24 pA/cm2&lt;br /&gt;
GunShift(x=57788, y=11163)&lt;br /&gt;
GunTilt(x=42281, y=34217)&lt;br /&gt;
BeamShift(x=32772, y=30285)&lt;br /&gt;
BeamTilt(x=36439, y=255)&lt;br /&gt;
ImageShift1(x=37126, y=55930)&lt;br /&gt;
ImageShift2(x=42692, y=62856)&lt;br /&gt;
DiffShift(x=52452, y=45943)&lt;br /&gt;
Stage(x=52584.0, y=-33851.0, z=-8761.0, a=35.0, b=-9.0)&lt;br /&gt;
Magnification(value=25000, index=10)&lt;br /&gt;
DiffFocus(value=n/a)&lt;br /&gt;
Brightness(value=20770)&lt;br /&gt;
SpotSize(1)&lt;br /&gt;
Saved alignments: ('neutral.yaml',)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wrote files config files:&lt;br /&gt;
    Copy simulate_tem.yaml -&amp;gt; `C:\Users\kttn8\AppData\Roaming\instamatic\config\simulate_tem.yaml`&lt;br /&gt;
    Copy simulate_calib.yaml -&amp;gt; `C:\Users\kttn8\AppData\Roaming\instamatic\config\simulate_calib.yaml`&lt;br /&gt;
&lt;br /&gt;
In `settings.yaml`:&lt;br /&gt;
    microscope: simulate_tem&lt;br /&gt;
    calibration: simulate_calib&lt;br /&gt;
&lt;br /&gt;
Todo: Check and update the pixelsizes in `simulate_calib.yaml`&lt;br /&gt;
    In real space, pixelsize in nm&lt;br /&gt;
    In reciprocal space, pixelsize in px/Angstrom&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 起動方法 ===&lt;br /&gt;
シェルで以下コマンドを打つ。&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
instamatic&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
すると以下のようなGUIが立ち上がる。パスとかは適宜変更しないと、何か操作したときにエラーメッセージが多分出てくる。&lt;br /&gt;
&lt;br /&gt;
[[File:2020-04-28 (1).png|x400px]]&lt;br /&gt;
&lt;br /&gt;
== コンソール実行 ==&lt;br /&gt;
=== JEOL TemExternal(COM)をPythonから直接叩く ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
import comtypes&lt;br /&gt;
comtypes.CoInitialize()&lt;br /&gt;
import comtypes.client&lt;br /&gt;
temext = comtypes.client.GetModule(('{CE70FCE4-26D9-4BAB-9626-EC88DB7F6A0A}', 3, 0))&lt;br /&gt;
# TEM3コンポーネントのオブジェクト&lt;br /&gt;
tem3 = comtypes.client.CreateObject(temext.TEM3, comtypes.CLSCTX_ALL)&lt;br /&gt;
# LEN3インターフェイス&lt;br /&gt;
lens3 = tem3.CreateLens3()&lt;br /&gt;
# DEF3インターフェイス (deflector制御API)&lt;br /&gt;
stage3 = tem3.CreateDef3()&lt;br /&gt;
#　などなど&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Instamatic TEMControllerでTEMを制御 ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
from instamatic import TEMController&lt;br /&gt;
ctrl = TEMController.initialize(tem_name='jeol', cam_name=None)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* instamaticのTEMServer使わない場合(setting.yamlでuse_tem_server=False)は ctrl.tem が JeolMicroscopeクラスインスタンスになり、そのメソッドからTemExternalのCOMインターフェイスを間接的にたたく感じになる&lt;br /&gt;
* TEMServer使う場合は、ctrl.tem が MicroscopeClientクラスインスタンスになり、TEMServerを介してJeolMicroscopeインスタンスにコマンド渡す感じ (使う分には、ctrl.temをJeolMicroscopeインスタンスだと思ってAPI叩けばok)&lt;/div&gt;</summary>
		<author><name>Kttn</name></author>	</entry>

	<entry>
		<id>https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/instamatic</id>
		<title>instamatic</title>
		<link rel="alternate" type="text/html" href="https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/instamatic"/>
				<updated>2020-12-23T10:23:16Z</updated>
		
		<summary type="html">&lt;p&gt;Kttn: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== 必要要件 ==&lt;br /&gt;
* Windows&lt;br /&gt;
* Python3&lt;br /&gt;
* JEOL TEMを使う場合&lt;br /&gt;
** JEOL TemExternal&lt;br /&gt;
* シミュレーションモードを使う場合&lt;br /&gt;
** 特になし&lt;br /&gt;
&lt;br /&gt;
== インストール ==&lt;br /&gt;
最新版のインストール方法について説明する。&lt;br /&gt;
&lt;br /&gt;
* 参考： https://github.com/stefsmeets/instamatic/blob/master/docs/setup.md&lt;br /&gt;
&lt;br /&gt;
https://github.com/stefsmeets/instamatic より、ソースコードをクローンする。&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git clone https://github.com/stefsmeets/instamatic.git&lt;br /&gt;
cd instamatic&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
※ commit 2c32254以降を使用すること。古いバージョンだとsimulationモードがエラーで動作しない場合あり。&lt;br /&gt;
&lt;br /&gt;
依存ライブラリを記述したrequirements.txtがあるので、pipでそれらをインストールする。&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
pip install -r requirements.txt&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
instamaticをPython環境へインストールする。&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
python setup.py install&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== シミュレーションモード ==&lt;br /&gt;
実際にTEM、カメラに接続せず、シミュレーションモードで動作させる方法。&lt;br /&gt;
=== 初期設定 ===&lt;br /&gt;
Powershellを開き、instamaticを起動する。&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
instamatic.exe&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
初回起動の時は、設定ファイルを格納したディレクトリを自動で作ってくれる。執筆者環境の場合、C:\Users\kttn8\AppData\Roaming\instamatic\config が作成された。&lt;br /&gt;
&lt;br /&gt;
コンフィグが作成されたら、autoconfigで設定を変えられる。&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
instamatic.autoconfig.exe&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
インタラクティブなプロンプトが表示されるので、適宜答えていく。今回はシミュレーションモードで設定をしてみる。&lt;br /&gt;
&lt;br /&gt;
↓プロンプトでのやりとり&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
PS C:\Users\kttn8&amp;gt; instamatic.autoconfig.exe&lt;br /&gt;
Config directory: C:\Users\kttn8\AppData\Roaming\instamatic\config&lt;br /&gt;
&lt;br /&gt;
 1: jeol&lt;br /&gt;
 2: fei&lt;br /&gt;
 3: simulate&lt;br /&gt;
&lt;br /&gt;
Which microscope can I connect to? [simulate] &amp;gt;&amp;gt;&lt;br /&gt;
simulate&lt;br /&gt;
&lt;br /&gt;
 1: None&lt;br /&gt;
 2: gatan&lt;br /&gt;
 3: tvips&lt;br /&gt;
 4: simulate&lt;br /&gt;
&lt;br /&gt;
Which camera can I connect to? [simulate] &amp;gt;&amp;gt;&lt;br /&gt;
simulate&lt;br /&gt;
&lt;br /&gt;
 1: C:\Users\kttn8\AppData\Local\Programs\Python\Python38\lib\site-packages\instamatic-1.3.0-py3.8.egg\instamatic\config\camera\orius.yaml&lt;br /&gt;
 2: C:\Users\kttn8\AppData\Local\Programs\Python\Python38\lib\site-packages\instamatic-1.3.0-py3.8.egg\instamatic\config\camera\simulate.yaml&lt;br /&gt;
 3: C:\Users\kttn8\AppData\Local\Programs\Python\Python38\lib\site-packages\instamatic-1.3.0-py3.8.egg\instamatic\config\camera\simulateDLL.yaml&lt;br /&gt;
 4: C:\Users\kttn8\AppData\Local\Programs\Python\Python38\lib\site-packages\instamatic-1.3.0-py3.8.egg\instamatic\config\camera\timepix.yaml&lt;br /&gt;
 5: C:\Users\kttn8\AppData\Local\Programs\Python\Python38\lib\site-packages\instamatic-1.3.0-py3.8.egg\instamatic\config\camera\tvips-f416.yaml&lt;br /&gt;
 6: C:\Users\kttn8\AppData\Local\Programs\Python\Python38\lib\site-packages\instamatic-1.3.0-py3.8.egg\instamatic\config\camera\tvips-xf416.yaml&lt;br /&gt;
 7: None&lt;br /&gt;
&lt;br /&gt;
Which camera type do you want to use (select closest one and modify if needed)? [None] &amp;gt;&amp;gt;&lt;br /&gt;
None&lt;br /&gt;
&lt;br /&gt;
Mode: mag1&lt;br /&gt;
High tension: 200 kV&lt;br /&gt;
Current density: 100221.24 pA/cm2&lt;br /&gt;
GunShift(x=57788, y=11163)&lt;br /&gt;
GunTilt(x=42281, y=34217)&lt;br /&gt;
BeamShift(x=32772, y=30285)&lt;br /&gt;
BeamTilt(x=36439, y=255)&lt;br /&gt;
ImageShift1(x=37126, y=55930)&lt;br /&gt;
ImageShift2(x=42692, y=62856)&lt;br /&gt;
DiffShift(x=52452, y=45943)&lt;br /&gt;
Stage(x=52584.0, y=-33851.0, z=-8761.0, a=35.0, b=-9.0)&lt;br /&gt;
Magnification(value=25000, index=10)&lt;br /&gt;
DiffFocus(value=n/a)&lt;br /&gt;
Brightness(value=20770)&lt;br /&gt;
SpotSize(1)&lt;br /&gt;
Saved alignments: ('neutral.yaml',)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wrote files config files:&lt;br /&gt;
    Copy simulate_tem.yaml -&amp;gt; `C:\Users\kttn8\AppData\Roaming\instamatic\config\simulate_tem.yaml`&lt;br /&gt;
    Copy simulate_calib.yaml -&amp;gt; `C:\Users\kttn8\AppData\Roaming\instamatic\config\simulate_calib.yaml`&lt;br /&gt;
&lt;br /&gt;
In `settings.yaml`:&lt;br /&gt;
    microscope: simulate_tem&lt;br /&gt;
    calibration: simulate_calib&lt;br /&gt;
&lt;br /&gt;
Todo: Check and update the pixelsizes in `simulate_calib.yaml`&lt;br /&gt;
    In real space, pixelsize in nm&lt;br /&gt;
    In reciprocal space, pixelsize in px/Angstrom&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 起動方法 ===&lt;br /&gt;
シェルで以下コマンドを打つ。&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
instamatic&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
すると以下のようなGUIが立ち上がる。パスとかは適宜変更しないと、何か操作したときにエラーメッセージが多分出てくる。&lt;br /&gt;
&lt;br /&gt;
[[File:2020-04-28 (1).png|x400px]]&lt;br /&gt;
&lt;br /&gt;
== コンソール実行 ==&lt;br /&gt;
=== JEOL TemExternal(COM)をPythonから直接叩く ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
import comtypes&lt;br /&gt;
comtypes.CoInitialize()&lt;br /&gt;
import comtypes.client&lt;br /&gt;
temext = comtypes.client.GetModule(('{CE70FCE4-26D9-4BAB-9626-EC88DB7F6A0A}', 3, 0))&lt;br /&gt;
# TEM3コンポーネントのオブジェクト&lt;br /&gt;
tem3 = comtypes.client.CreateObject(temext.TEM3, comtypes.CLSCTX_ALL)&lt;br /&gt;
# LEN3インターフェイス&lt;br /&gt;
lens3 = tem3.CreateLens3()&lt;br /&gt;
# DEF3インターフェイス (deflector制御API)&lt;br /&gt;
stage3 = tem3.CreateDef3()&lt;br /&gt;
#　などなど&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Instamatic TEMControllerでTEMを制御 ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
from instamatic import TEMController&lt;br /&gt;
ctrl = TEMController.initialize(tem_name='jeol', cam_name=None)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* instamaticのTEMServer使わない場合(setting.yamlでuse_tem_server=False)は ctrl.tem が JeolMicroscopeクラスインスタンスになり、そのメソッドからCOMインターフェイスを間接的にたたく感じになる&lt;br /&gt;
* TEMServer使う場合は、ctrl.tem が MicroscopeClientクラスインスタンスになり、TEMServerを介してJeolMicroscopeインスタンスにコマンド渡す感じ (使う分には、ctrl.temをJeolMicroscopeインスタンスだと思ってAPI叩けばok)&lt;/div&gt;</summary>
		<author><name>Kttn</name></author>	</entry>

	<entry>
		<id>https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/Python_on_Windows10</id>
		<title>Python on Windows10</title>
		<link rel="alternate" type="text/html" href="https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/Python_on_Windows10"/>
				<updated>2020-11-24T04:45:04Z</updated>
		
		<summary type="html">&lt;p&gt;Kttn: ページの作成:「覚書です。  = '''PYTHONPATHの設定''' = * コントロールパネルを開き、System and Security &amp;gt; System &amp;gt; Advanced system setting と進む * System Properti...」&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;覚書です。&lt;br /&gt;
&lt;br /&gt;
= '''PYTHONPATHの設定''' =&lt;br /&gt;
* コントロールパネルを開き、System and Security &amp;gt; System &amp;gt; Advanced system setting と進む&lt;br /&gt;
* System Propertiesウィンドウが開いたらAdvancedタブのEnvironment Variablesを押下する&lt;br /&gt;
* User variables for (ユーザー名) で New... を押下する&lt;br /&gt;
* Variable name: PYTHONPATH&lt;br /&gt;
* Variable value(例): C:\Users\Hoge\Softwares\fuga_image_library;%PYTHONPATH%&lt;br /&gt;
** パスはセミコロンで列挙。%%で挟んで環境変数名を記述すると変数展開される。&lt;/div&gt;</summary>
		<author><name>Kttn</name></author>	</entry>

	<entry>
		<id>https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/Python</id>
		<title>Python</title>
		<link rel="alternate" type="text/html" href="https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/Python"/>
				<updated>2020-11-24T04:40:10Z</updated>
		
		<summary type="html">&lt;p&gt;Kttn: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;当研究室特有の説明を含む場合があるので留意ください。 &lt;br /&gt;
&lt;br /&gt;
== [[Python tips]] ==&lt;br /&gt;
いつも調べてしまうことなどを書き残しておく&lt;br /&gt;
&lt;br /&gt;
== [[Numpy tips]] ==&lt;br /&gt;
&lt;br /&gt;
== [[Matplotlib tips]] ==&lt;br /&gt;
&lt;br /&gt;
== [[JupyterLab設定]] ==&lt;br /&gt;
Jupyter Labの設定集&lt;br /&gt;
&lt;br /&gt;
== [[DockerでJupyterLab]] ==&lt;br /&gt;
Jupyter Notebook(.ipynb)をウェブブラウザで閲覧、作成、編集、実行できるJupyterLabサーバーをDockerで立ち上げ、リモートのPCのウェブブラウザから使う方法を説明します。&lt;br /&gt;
&lt;br /&gt;
== [[Visual Studio CodeでPythonデバッグ実行]] ==&lt;br /&gt;
Visual Studio CodeでPythonスクリプトをデバッグ実行する方法について説明します。&lt;br /&gt;
&lt;br /&gt;
== [[PythonのためのVisual Studio Code設定覚書]] ==&lt;br /&gt;
&lt;br /&gt;
== [[Anaconda覚書]] ==&lt;br /&gt;
&lt;br /&gt;
== [[Pythonトラブルシューティング]] ==&lt;br /&gt;
&lt;br /&gt;
== [[Python on Windows10]] ==&lt;/div&gt;</summary>
		<author><name>Kttn</name></author>	</entry>

	<entry>
		<id>https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/Python</id>
		<title>Python</title>
		<link rel="alternate" type="text/html" href="https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/Python"/>
				<updated>2020-11-24T04:40:01Z</updated>
		
		<summary type="html">&lt;p&gt;Kttn: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;当研究室特有の説明を含む場合があるので留意ください。 &lt;br /&gt;
&lt;br /&gt;
== [[Python tips]] ==&lt;br /&gt;
いつも調べてしまうことなどを書き残しておく&lt;br /&gt;
&lt;br /&gt;
== [[Numpy tips]] ==&lt;br /&gt;
&lt;br /&gt;
== [[Matplotlib tips]] ==&lt;br /&gt;
&lt;br /&gt;
== [[JupyterLab設定]] ==&lt;br /&gt;
Jupyter Labの設定集&lt;br /&gt;
&lt;br /&gt;
== [[DockerでJupyterLab]] ==&lt;br /&gt;
Jupyter Notebook(.ipynb)をウェブブラウザで閲覧、作成、編集、実行できるJupyterLabサーバーをDockerで立ち上げ、リモートのPCのウェブブラウザから使う方法を説明します。&lt;br /&gt;
&lt;br /&gt;
== [[Visual Studio CodeでPythonデバッグ実行]] ==&lt;br /&gt;
Visual Studio CodeでPythonスクリプトをデバッグ実行する方法について説明します。&lt;br /&gt;
&lt;br /&gt;
== [[PythonのためのVisual Studio Code設定覚書]] ==&lt;br /&gt;
&lt;br /&gt;
== [[Anaconda覚書]] ==&lt;br /&gt;
&lt;br /&gt;
== [[Pythonトラブルシューティング]] ==&lt;br /&gt;
&lt;br /&gt;
== [[Python on Windows10]]&lt;/div&gt;</summary>
		<author><name>Kttn</name></author>	</entry>

	<entry>
		<id>https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/Visual_Studio_Code%E3%81%A7Python%E3%83%87%E3%83%90%E3%83%83%E3%82%B0%E5%AE%9F%E8%A1%8C</id>
		<title>Visual Studio CodeでPythonデバッグ実行</title>
		<link rel="alternate" type="text/html" href="https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/Visual_Studio_Code%E3%81%A7Python%E3%83%87%E3%83%90%E3%83%83%E3%82%B0%E5%AE%9F%E8%A1%8C"/>
				<updated>2020-11-20T06:18:08Z</updated>
		
		<summary type="html">&lt;p&gt;Kttn: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= '''デバッグ設定ファイル launch.json''' =&lt;br /&gt;
== launch.jsonで使える定義済み変数 ==&lt;br /&gt;
https://code.visualstudio.com/docs/editor/variables-reference&lt;br /&gt;
&lt;br /&gt;
== デバッガに環境変数を渡す ==&lt;br /&gt;
参考： [https://qiita.com/YumaInaura/items/72c1c68e22c71f37cdd3#%E7%92%B0%E5%A2%83%E5%A4%89%E6%95%B0%E3%82%92%E6%B8%A1%E3%81%99 VSCode 用のlaunch.jsonでデバッグコマンドに環境変数 / 引数 / フラグを渡す設定]&lt;br /&gt;
&lt;br /&gt;
launch.jsonに環境変数を記述すればよい。&lt;br /&gt;
&lt;br /&gt;
例：PythonのモジュールサーチパスPYTHONPATHを追加する&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    // IntelliSense を使用して利用可能な属性を学べます。&lt;br /&gt;
    // 既存の属性の説明をホバーして表示します。&lt;br /&gt;
    // 詳細情報は次を確認してください: https://go.microsoft.com/fwlink/?linkid=830387&lt;br /&gt;
    &amp;quot;version&amp;quot;: &amp;quot;0.2.0&amp;quot;,&lt;br /&gt;
    &amp;quot;configurations&amp;quot;: [&lt;br /&gt;
        {&lt;br /&gt;
            &amp;quot;name&amp;quot;: &amp;quot;Python: モジュール&amp;quot;,&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;python&amp;quot;,&lt;br /&gt;
            &amp;quot;request&amp;quot;: &amp;quot;launch&amp;quot;,&lt;br /&gt;
            &amp;quot;module&amp;quot;: &amp;quot;instamatic&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        {&lt;br /&gt;
            &amp;quot;name&amp;quot;: &amp;quot;Python: Current File&amp;quot;,&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;python&amp;quot;,&lt;br /&gt;
            &amp;quot;request&amp;quot;: &amp;quot;launch&amp;quot;,&lt;br /&gt;
            &amp;quot;program&amp;quot;: &amp;quot;${file}&amp;quot;,&lt;br /&gt;
            &amp;quot;console&amp;quot;: &amp;quot;integratedTerminal&amp;quot;,&lt;br /&gt;
            &amp;quot;env&amp;quot;: {&lt;br /&gt;
                &amp;quot;PYTHONPATH&amp;quot;: &amp;quot;${workspaceFolder}&amp;quot;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    ]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Windowsの場合&lt;br /&gt;
** ディレクトリのセパレータはバックスラッシュだが、あとに続く文字によっては特殊文字と見なされてしまうので、バックスラッシュは二重にして書く。&lt;br /&gt;
** パスを続けて2つ以上書く場合、例えば次のようにする。&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
            &amp;quot;env&amp;quot;: {&lt;br /&gt;
                &amp;quot;PYTHONPATH&amp;quot;: &amp;quot;${workspaceFolder};C:\\Users\\hogeta\\hoge\\fuga&amp;quot;&lt;br /&gt;
            }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== モジュールのデバッグ ==&lt;br /&gt;
スクリプトではなくモジュール(インポートで呼び出される側のコード)をデバッグする場合は、モジュールとしてデバッグする。&lt;br /&gt;
&lt;br /&gt;
例：ワークスペースフォルダに置いてあるinstamatic.server.tem_serverというモジュール (ファイルとしては${workspaceFolder}/instamatic/server/tem_server.py)をデバッグしたいとき&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    // IntelliSense を使用して利用可能な属性を学べます。&lt;br /&gt;
    // 既存の属性の説明をホバーして表示します。&lt;br /&gt;
    // 詳細情報は次を確認してください: https://go.microsoft.com/fwlink/?linkid=830387&lt;br /&gt;
    &amp;quot;version&amp;quot;: &amp;quot;0.2.0&amp;quot;,&lt;br /&gt;
    &amp;quot;configurations&amp;quot;: [&lt;br /&gt;
        {&lt;br /&gt;
            &amp;quot;name&amp;quot;: &amp;quot;Python: debug tem_server module&amp;quot;,&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;python&amp;quot;,&lt;br /&gt;
            &amp;quot;request&amp;quot;: &amp;quot;launch&amp;quot;,&lt;br /&gt;
　　　　　　&amp;quot;cwd&amp;quot;: &amp;quot;${workspaceFolder}&amp;quot;,&lt;br /&gt;
            &amp;quot;module&amp;quot;: &amp;quot;instamatic.server.tem_server&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
    ]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 標準ライブラリや外部ライブラリの中までステップインする ==&lt;br /&gt;
デバッグの設定ファイルであるlaunch.jsonにて、justMyCodeオプションをFalseとすればよい、とのこと&lt;br /&gt;
&lt;br /&gt;
参考： https://srbrnote.work/archives/4231&lt;br /&gt;
&lt;br /&gt;
= '''デバッガ使い方''' =&lt;br /&gt;
== 現在のデバッグ行に飛ぶ ==&lt;br /&gt;
コールスタックペインに表示されている一番上の項目をクリックすれば、現在デバッグしている行（正確にはこれから実行する行）に飛べる。デバッグ中にファイルをいろいろ移動して迷子になってしまったときに、デバッグ行に戻れる。&lt;br /&gt;
&lt;br /&gt;
参考： https://stackoverflow.com/a/56270324&lt;/div&gt;</summary>
		<author><name>Kttn</name></author>	</entry>

	<entry>
		<id>https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/Python%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AEVisual_Studio_Code%E8%A8%AD%E5%AE%9A%E8%A6%9A%E6%9B%B8</id>
		<title>PythonのためのVisual Studio Code設定覚書</title>
		<link rel="alternate" type="text/html" href="https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/Python%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AEVisual_Studio_Code%E8%A8%AD%E5%AE%9A%E8%A6%9A%E6%9B%B8"/>
				<updated>2020-11-20T05:56:38Z</updated>
		
		<summary type="html">&lt;p&gt;Kttn: /* 特定のディレクトリにモジュールサーチパスを通す */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== 特定のディレクトリにモジュールサーチパスを通す ==&lt;br /&gt;
* VSCodeの設定で、ワークスペースもしくはディレクトリのタブを開く(ワークスペースの設定としたいか、ディレクトリの設定としたいかで選ぶ)。&lt;br /&gt;
* setting.jsonを開く。&lt;br /&gt;
* python.analysis.extraPaths と python.autoComplete.extraPaths に、所望のディレクトリを追加する。&lt;br /&gt;
例えばpiyo_image_handlerが自作のモジュールで、それを開発に使いたいとなったら、&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    &amp;quot;python.analysis.extraPaths&amp;quot;: [&lt;br /&gt;
        &amp;quot;C:\\Users\\hoge\\Softwares\\piyo_image_handler&amp;quot;&lt;br /&gt;
    ],&lt;br /&gt;
    &amp;quot;python.autoComplete.extraPaths&amp;quot;: [&lt;br /&gt;
        &amp;quot;C:\\Users\\hoge\\Softwares\\piyo_image_handler&amp;quot;&lt;br /&gt;
    ]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
とする。&lt;br /&gt;
&lt;br /&gt;
デバッグもする場合は、launch.jsonにもパスを追加する。&lt;br /&gt;
( [[Visual Studio CodeでPythonデバッグ実行#デバッガに環境変数を渡す]] )&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
        {&lt;br /&gt;
            &amp;quot;name&amp;quot;: &amp;quot;Debug scripts&amp;quot;,&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;python&amp;quot;,&lt;br /&gt;
            &amp;quot;request&amp;quot;: &amp;quot;launch&amp;quot;,&lt;br /&gt;
            &amp;quot;program&amp;quot;: &amp;quot;${file}&amp;quot;,&lt;br /&gt;
            &amp;quot;console&amp;quot;: &amp;quot;integratedTerminal&amp;quot;,&lt;br /&gt;
            &amp;quot;env&amp;quot;: {&lt;br /&gt;
                &amp;quot;PYTHONPATH&amp;quot;: &amp;quot;${workspaceFolder};C:\\Users\\hoge\\Softwares\\piyo_image_handler&amp;quot;&lt;br /&gt;
            }&lt;br /&gt;
        },&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Kttn</name></author>	</entry>

	<entry>
		<id>https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/Python%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AEVisual_Studio_Code%E8%A8%AD%E5%AE%9A%E8%A6%9A%E6%9B%B8</id>
		<title>PythonのためのVisual Studio Code設定覚書</title>
		<link rel="alternate" type="text/html" href="https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/Python%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AEVisual_Studio_Code%E8%A8%AD%E5%AE%9A%E8%A6%9A%E6%9B%B8"/>
				<updated>2020-11-20T05:53:18Z</updated>
		
		<summary type="html">&lt;p&gt;Kttn: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== 特定のディレクトリにモジュールサーチパスを通す ==&lt;br /&gt;
* VSCodeの設定で、ワークスペースもしくはディレクトリのタブを開く(ワークスペースの設定としたいか、ディレクトリの設定としたいかで選ぶ)。&lt;br /&gt;
* setting.jsonを開く。&lt;br /&gt;
* python.analysis.extraPaths と python.autoComplete.extraPaths に、所望のディレクトリを追加する。&lt;br /&gt;
例えばpiyo_image_handlerが自作のモジュールで、それを開発に使いたいとなったら、&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    &amp;quot;python.analysis.extraPaths&amp;quot;: [&lt;br /&gt;
        &amp;quot;C:\\Users\\hoge\\Softwares\\piyo_image_handler&amp;quot;&lt;br /&gt;
    ],&lt;br /&gt;
    &amp;quot;python.autoComplete.extraPaths&amp;quot;: [&lt;br /&gt;
        &amp;quot;C:\\Users\\hoge\\Softwares\\piyo_image_handler&amp;quot;&lt;br /&gt;
    ]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
とする。&lt;/div&gt;</summary>
		<author><name>Kttn</name></author>	</entry>

	<entry>
		<id>https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/Visual_Studio_Code%E3%81%A7Python%E3%83%87%E3%83%90%E3%83%83%E3%82%B0%E5%AE%9F%E8%A1%8C</id>
		<title>Visual Studio CodeでPythonデバッグ実行</title>
		<link rel="alternate" type="text/html" href="https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/Visual_Studio_Code%E3%81%A7Python%E3%83%87%E3%83%90%E3%83%83%E3%82%B0%E5%AE%9F%E8%A1%8C"/>
				<updated>2020-11-20T05:44:03Z</updated>
		
		<summary type="html">&lt;p&gt;Kttn: /* デバッガに環境変数を渡す */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== デバッガに環境変数を渡す ==&lt;br /&gt;
参考： [https://qiita.com/YumaInaura/items/72c1c68e22c71f37cdd3#%E7%92%B0%E5%A2%83%E5%A4%89%E6%95%B0%E3%82%92%E6%B8%A1%E3%81%99 VSCode 用のlaunch.jsonでデバッグコマンドに環境変数 / 引数 / フラグを渡す設定]&lt;br /&gt;
&lt;br /&gt;
launch.jsonに環境変数を記述すればよい。&lt;br /&gt;
&lt;br /&gt;
例：PythonのモジュールサーチパスPYTHONPATHを追加する&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    // IntelliSense を使用して利用可能な属性を学べます。&lt;br /&gt;
    // 既存の属性の説明をホバーして表示します。&lt;br /&gt;
    // 詳細情報は次を確認してください: https://go.microsoft.com/fwlink/?linkid=830387&lt;br /&gt;
    &amp;quot;version&amp;quot;: &amp;quot;0.2.0&amp;quot;,&lt;br /&gt;
    &amp;quot;configurations&amp;quot;: [&lt;br /&gt;
        {&lt;br /&gt;
            &amp;quot;name&amp;quot;: &amp;quot;Python: モジュール&amp;quot;,&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;python&amp;quot;,&lt;br /&gt;
            &amp;quot;request&amp;quot;: &amp;quot;launch&amp;quot;,&lt;br /&gt;
            &amp;quot;module&amp;quot;: &amp;quot;instamatic&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        {&lt;br /&gt;
            &amp;quot;name&amp;quot;: &amp;quot;Python: Current File&amp;quot;,&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;python&amp;quot;,&lt;br /&gt;
            &amp;quot;request&amp;quot;: &amp;quot;launch&amp;quot;,&lt;br /&gt;
            &amp;quot;program&amp;quot;: &amp;quot;${file}&amp;quot;,&lt;br /&gt;
            &amp;quot;console&amp;quot;: &amp;quot;integratedTerminal&amp;quot;,&lt;br /&gt;
            &amp;quot;env&amp;quot;: {&lt;br /&gt;
                &amp;quot;PYTHONPATH&amp;quot;: &amp;quot;${workspaceFolder}&amp;quot;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    ]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Windowsの場合&lt;br /&gt;
** ディレクトリのセパレータはバックスラッシュだが、あとに続く文字によっては特殊文字と見なされてしまうので、バックスラッシュは二重にして書く。&lt;br /&gt;
** パスを続けて2つ以上書く場合、例えば次のようにする。&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
            &amp;quot;env&amp;quot;: {&lt;br /&gt;
                &amp;quot;PYTHONPATH&amp;quot;: &amp;quot;${workspaceFolder};C:\\Users\\hogeta\\hoge\\fuga&amp;quot;&lt;br /&gt;
            }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 現在のデバッグ行に飛ぶ ==&lt;br /&gt;
コールスタックペインに表示されている一番上の項目をクリックすれば、現在デバッグしている行（正確にはこれから実行する行）に飛べる。デバッグ中にファイルをいろいろ移動して迷子になってしまったときに、デバッグ行に戻れる。&lt;br /&gt;
&lt;br /&gt;
参考： https://stackoverflow.com/a/56270324&lt;br /&gt;
&lt;br /&gt;
== モジュールのデバッグ ==&lt;br /&gt;
スクリプトではなくモジュール(インポートで呼び出される側のコード)をデバッグする場合は、モジュールとしてデバッグする。&lt;br /&gt;
&lt;br /&gt;
例：ワークスペースフォルダに置いてあるinstamatic.server.tem_serverというモジュール (ファイルとしては${workspaceFolder}/instamatic/server/tem_server.py)をデバッグしたいとき&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    // IntelliSense を使用して利用可能な属性を学べます。&lt;br /&gt;
    // 既存の属性の説明をホバーして表示します。&lt;br /&gt;
    // 詳細情報は次を確認してください: https://go.microsoft.com/fwlink/?linkid=830387&lt;br /&gt;
    &amp;quot;version&amp;quot;: &amp;quot;0.2.0&amp;quot;,&lt;br /&gt;
    &amp;quot;configurations&amp;quot;: [&lt;br /&gt;
        {&lt;br /&gt;
            &amp;quot;name&amp;quot;: &amp;quot;Python: debug tem_server module&amp;quot;,&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;python&amp;quot;,&lt;br /&gt;
            &amp;quot;request&amp;quot;: &amp;quot;launch&amp;quot;,&lt;br /&gt;
　　　　　　&amp;quot;cwd&amp;quot;: &amp;quot;${workspaceFolder}&amp;quot;,&lt;br /&gt;
            &amp;quot;module&amp;quot;: &amp;quot;instamatic.server.tem_server&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
    ]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 標準ライブラリや外部ライブラリの中までステップインする ==&lt;br /&gt;
デバッグの設定ファイルであるlaunch.jsonにて、justMyCodeオプションをFalseとすればよい、とのこと&lt;br /&gt;
&lt;br /&gt;
参考： https://srbrnote.work/archives/4231&lt;/div&gt;</summary>
		<author><name>Kttn</name></author>	</entry>

	<entry>
		<id>https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/Git</id>
		<title>Git</title>
		<link rel="alternate" type="text/html" href="https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/Git"/>
				<updated>2020-11-19T14:26:48Z</updated>
		
		<summary type="html">&lt;p&gt;Kttn: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= '''CLI''' =&lt;br /&gt;
== ユーザー名とemailの登録 ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git config --global user.name &amp;quot;ユーザー名&amp;quot;&lt;br /&gt;
git config --global user.email メールアドレス&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= '''GitHub''' =&lt;br /&gt;
== Issueコメント ==&lt;br /&gt;
=== 他のリポジトリのコミットへのリンク ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ユーザー名/リポジトリ名@コミットハッシュ&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
例えば&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
yasunaga-lab/hogefuga@fdk54u89iraa66baab5f4955e0dba066ea0d7dab1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Kttn</name></author>	</entry>

	<entry>
		<id>https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/Python_tips</id>
		<title>Python tips</title>
		<link rel="alternate" type="text/html" href="https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/Python_tips"/>
				<updated>2020-11-19T13:51:06Z</updated>
		
		<summary type="html">&lt;p&gt;Kttn: /* build-in */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== argparse ==&lt;br /&gt;
https://docs.python.org/release/3.8.2/library/argparse.html&lt;br /&gt;
=== インスタンス化 ===&lt;br /&gt;
モジュールdocstring書いといてそれをdescriptionにすると良さげ&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
parser = argparse.ArgumentParser(description=__doc__)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== オプション名の書き方と格納先変数名 ===&lt;br /&gt;
https://docs.python.org/release/3.8.2/library/argparse.html#dest&lt;br /&gt;
&lt;br /&gt;
=== 引数個数の指定 ===&lt;br /&gt;
https://docs.python.org/release/3.8.2/library/argparse.html#nargs&lt;br /&gt;
&lt;br /&gt;
==== 一つ以上のキーワード引数 ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
parser.add_argument('--hoge', nargs='+', help='Hoge files')&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
パース結果はリストに格納される。&lt;br /&gt;
&lt;br /&gt;
=== ヘルプメッセージにデフォルト値を表示する ===&lt;br /&gt;
https://docs.python.org/release/3.8.2/library/argparse.html#argparse.ArgumentDefaultsHelpFormatter&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
parser = argparse.ArgumentParser(formatter_class=argparse.ArgumentDefaultsHelpFormatter)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== スニペット1 ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def parse_args():&lt;br /&gt;
    parser = argparse.ArgumentParser(&lt;br /&gt;
        formatter_class=argparse.ArgumentDefaultsHelpFormatter,&lt;br /&gt;
        description=__doc__&lt;br /&gt;
    )&lt;br /&gt;
&lt;br /&gt;
    args = parser.parse_args()&lt;br /&gt;
&lt;br /&gt;
    print('##### Command #####\n\t' + ' '.join(sys.argv))&lt;br /&gt;
    args_print_str = '##### Input parameters #####\n'&lt;br /&gt;
    for opt, val in vars(args).items():&lt;br /&gt;
        args_print_str += '\t{} : {}\n'.format(opt, val)&lt;br /&gt;
    print(args_print_str)&lt;br /&gt;
    return args&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 具体例1 ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def parse_args():&lt;br /&gt;
    parser = argparse.ArgumentParser(&lt;br /&gt;
        formatter_class=argparse.ArgumentDefaultsHelpFormatter,&lt;br /&gt;
        description=__doc__&lt;br /&gt;
    )&lt;br /&gt;
    parser.add_argument('--Z_file', type=str, required=True, help='Pickled file of latent variables.')&lt;br /&gt;
    parser.add_argument('--k_init', type=int, default=2, help='Initial number of clusters in X-Means')&lt;br /&gt;
    parser.add_argument('--k_max', type=int, default=20, help='Max number of clusters in X-Means')&lt;br /&gt;
    parser.add_argument('--criterion', type=str, default='bic', choices=['bic', 'mndl'], help='Splitting criterion. bic: bayesian information criterion, mndl: minimum noiseless description length.')&lt;br /&gt;
    parser.add_argument('--random_state', type=int, default=None, help='Random seed for X-Means initialization (K-Means++)')&lt;br /&gt;
    parser.add_argument('--no_ccore', action='store_true', help='Use python implementation of PyClustering library, instead of C++.')&lt;br /&gt;
    parser.add_argument('--outdir', required=True, help='Output directory.')&lt;br /&gt;
    parser.add_argument('--input_star', type=str, required=True, help='Input star file.')&lt;br /&gt;
    parser.add_argument('--output_star_rootname', type=str, default='cluster', help='Output file rootname for each cluster\'s star file.')&lt;br /&gt;
    parser.add_argument('--output_model', type=str, default='xmeans_model.pkl', help='Output X-Means model file name (pickled).')&lt;br /&gt;
&lt;br /&gt;
    args = parser.parse_args()&lt;br /&gt;
&lt;br /&gt;
    print('##### Command #####\n\t' + ' '.join(sys.argv))&lt;br /&gt;
    args_print_str = '##### Input parameters #####\n'&lt;br /&gt;
    for opt, val in vars(args).items():&lt;br /&gt;
        args_print_str += '\t{} : {}\n'.format(opt, val)&lt;br /&gt;
    print(args_print_str)&lt;br /&gt;
    return args&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== logging ==&lt;br /&gt;
https://docs.python.org/release/3.8.2/library/logging.html&lt;br /&gt;
=== ロガー生成スニペット ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
logging_fmt = logging.Formatter(&lt;br /&gt;
    '\n[%(asctime)s - %(name)s - %(levelname)s] %(message)s')&lt;br /&gt;
logger = logging.getLogger(__name__)&lt;br /&gt;
logger.setLevel(logging.DEBUG)&lt;br /&gt;
stream_handler = logging.StreamHandler()&lt;br /&gt;
stream_handler.setFormatter(logging_fmt)&lt;br /&gt;
logger.addHandler(stream_handler)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def set_logger(log_file, is_debug):&lt;br /&gt;
    if log_file is not None:&lt;br /&gt;
        log_file_dir = os.path.dirname(log_file)&lt;br /&gt;
        if log_file_dir:&lt;br /&gt;
            if not os.path.exists(log_file_dir):&lt;br /&gt;
                logger.debug('Creating log file directory...')&lt;br /&gt;
                os.makedirs(log_file_dir)&lt;br /&gt;
            elif not os.path.isdir(log_file_dir):&lt;br /&gt;
                logger.error('{} is not a directory.'.format(log_file_dir))&lt;br /&gt;
                sys.exit(1)&lt;br /&gt;
        file_handler = logging.FileHandler(log_file, mode='w')&lt;br /&gt;
        file_handler.setFormatter(logging_fmt)&lt;br /&gt;
        logger.addHandler(file_handler)&lt;br /&gt;
&lt;br /&gt;
    if not is_debug:&lt;br /&gt;
        logger.setLevel(logging.INFO)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== serialize ==&lt;br /&gt;
=== pickle ===&lt;br /&gt;
==== 保存 ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
pickle.dump(\&lt;br /&gt;
    object_to_be_serialized,&lt;br /&gt;
    open(outfile, 'wb'),&lt;br /&gt;
    protocol=4)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 読み込み ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
with open(pickled_file, 'rb') as f:&lt;br /&gt;
    pickled_content = pickle.load(f)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== subprocess ==&lt;br /&gt;
=== run - 同期型 ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ret = subprocess.run(&amp;quot;シェルコマンド&amp;quot;, text=True, shell=True, capture_output=True)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
投げたシェルコマンドが終わるまで呼び出し側コードはブロックされる。&lt;br /&gt;
&lt;br /&gt;
retが持つ属性は ret.args, ret.returncode, ret.stdout, ret.stderr。&lt;br /&gt;
&lt;br /&gt;
=== Popen - 非同期型 ===&lt;br /&gt;
* 参考&lt;br /&gt;
** https://qiita.com/HidKamiya/items/e192a55371a2961ca8a4&lt;br /&gt;
** https://qiita.com/megmogmog1965/items/5f95b35539ed6b3cfa17&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
p = subprocess.Popen(&amp;quot;シェルコマンド&amp;quot;, shell=True, text=True, stderr=subprocess.STDOUT, stdout=subprocess.PIPE)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Popenはコマンド投げっぱなしで、呼び出し側コードは遠慮なく先へ進む。&lt;br /&gt;
&lt;br /&gt;
処理の終了 (p.poll() is not None)を待ちつつ、出力をリアルタイム表示するには、例えば以下の様にする。&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
while True:&lt;br /&gt;
    if p.poll() is not None:&lt;br /&gt;
        break&lt;br /&gt;
    line = p.stdout.readline()&lt;br /&gt;
    if line is not None:&lt;br /&gt;
        print(line, end='')&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== datetime ==&lt;br /&gt;
* datetimeはモジュール名、datetime.datetimeはdatetimeモジュールのdatetimeクラス&lt;br /&gt;
=== タイムスタンプ文字列生成 ===&lt;br /&gt;
20201119-093428 などのフォーマットで年月日-時刻の文字列を生成するには、&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
import datetime&lt;br /&gt;
datetime.datetime.now().strftime('%Y%m%d-%H%M%S')&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
nowはクラスメソッドで、現在時刻を持ったインスタンスを生成する。&lt;br /&gt;
&lt;br /&gt;
=== iso8601フォーマットで時刻表示 ===&lt;br /&gt;
isoformatメソッドを使う。例えば、&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
In [6]: a = datetime.datetime.strptime('2020/11/19 18:55:37.614', '%Y/%m/%d %H:%M:%S.%f')&lt;br /&gt;
&lt;br /&gt;
In [7]: a.isoformat()&lt;br /&gt;
Out[7]: '2020-11-19T18:55:37.614000'&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 任意の型式の日時表示からdatetimeインスタンス生成 ===&lt;br /&gt;
strptimeメソッドを使う。例えば、&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
In [5]: datetime.datetime.strptime('2020/11/19 18:55:37.614', '%Y/%m/%d %H:%M:%S.%f')&lt;br /&gt;
Out[5]: datetime.datetime(2020, 11, 19, 18, 55, 37, 614000)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
どうやらミリ秒は無くて、マイクロ秒(%fでパース)で表現するらしい。&lt;br /&gt;
&lt;br /&gt;
== docstring ==&lt;br /&gt;
=== モジュールdocstring ===&lt;br /&gt;
ファイルの先頭にそのモジュールの説明を書けばよい。&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
'''Hoge fuga module&lt;br /&gt;
&lt;br /&gt;
This module is for hoge fuga piyo!'''&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
シェバン行やエンコーディング指定はモジュールdocstringの前に書く。&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/usr/bin/env python&lt;br /&gt;
# *_* coding: utf-8 *_*&lt;br /&gt;
&lt;br /&gt;
'''Hoge fuga module&lt;br /&gt;
&lt;br /&gt;
This module is for hoge fuga piyo!'''&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
モジュールdocstringは&amp;lt;pre&amp;gt;__doc__&amp;lt;/pre&amp;gt;で参照できる。&lt;br /&gt;
&lt;br /&gt;
== build-in ==&lt;br /&gt;
=== print ===&lt;br /&gt;
==== 改行無しで表示 ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
print('hogefuga', end='')&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 型チェック ===&lt;br /&gt;
==== isinstance ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
isinstance(obj, class_or_tuple)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Kttn</name></author>	</entry>

	<entry>
		<id>https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/Python_tips</id>
		<title>Python tips</title>
		<link rel="alternate" type="text/html" href="https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/Python_tips"/>
				<updated>2020-11-19T13:39:47Z</updated>
		
		<summary type="html">&lt;p&gt;Kttn: /* datetime */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== argparse ==&lt;br /&gt;
https://docs.python.org/release/3.8.2/library/argparse.html&lt;br /&gt;
=== インスタンス化 ===&lt;br /&gt;
モジュールdocstring書いといてそれをdescriptionにすると良さげ&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
parser = argparse.ArgumentParser(description=__doc__)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== オプション名の書き方と格納先変数名 ===&lt;br /&gt;
https://docs.python.org/release/3.8.2/library/argparse.html#dest&lt;br /&gt;
&lt;br /&gt;
=== 引数個数の指定 ===&lt;br /&gt;
https://docs.python.org/release/3.8.2/library/argparse.html#nargs&lt;br /&gt;
&lt;br /&gt;
==== 一つ以上のキーワード引数 ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
parser.add_argument('--hoge', nargs='+', help='Hoge files')&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
パース結果はリストに格納される。&lt;br /&gt;
&lt;br /&gt;
=== ヘルプメッセージにデフォルト値を表示する ===&lt;br /&gt;
https://docs.python.org/release/3.8.2/library/argparse.html#argparse.ArgumentDefaultsHelpFormatter&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
parser = argparse.ArgumentParser(formatter_class=argparse.ArgumentDefaultsHelpFormatter)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== スニペット1 ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def parse_args():&lt;br /&gt;
    parser = argparse.ArgumentParser(&lt;br /&gt;
        formatter_class=argparse.ArgumentDefaultsHelpFormatter,&lt;br /&gt;
        description=__doc__&lt;br /&gt;
    )&lt;br /&gt;
&lt;br /&gt;
    args = parser.parse_args()&lt;br /&gt;
&lt;br /&gt;
    print('##### Command #####\n\t' + ' '.join(sys.argv))&lt;br /&gt;
    args_print_str = '##### Input parameters #####\n'&lt;br /&gt;
    for opt, val in vars(args).items():&lt;br /&gt;
        args_print_str += '\t{} : {}\n'.format(opt, val)&lt;br /&gt;
    print(args_print_str)&lt;br /&gt;
    return args&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 具体例1 ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def parse_args():&lt;br /&gt;
    parser = argparse.ArgumentParser(&lt;br /&gt;
        formatter_class=argparse.ArgumentDefaultsHelpFormatter,&lt;br /&gt;
        description=__doc__&lt;br /&gt;
    )&lt;br /&gt;
    parser.add_argument('--Z_file', type=str, required=True, help='Pickled file of latent variables.')&lt;br /&gt;
    parser.add_argument('--k_init', type=int, default=2, help='Initial number of clusters in X-Means')&lt;br /&gt;
    parser.add_argument('--k_max', type=int, default=20, help='Max number of clusters in X-Means')&lt;br /&gt;
    parser.add_argument('--criterion', type=str, default='bic', choices=['bic', 'mndl'], help='Splitting criterion. bic: bayesian information criterion, mndl: minimum noiseless description length.')&lt;br /&gt;
    parser.add_argument('--random_state', type=int, default=None, help='Random seed for X-Means initialization (K-Means++)')&lt;br /&gt;
    parser.add_argument('--no_ccore', action='store_true', help='Use python implementation of PyClustering library, instead of C++.')&lt;br /&gt;
    parser.add_argument('--outdir', required=True, help='Output directory.')&lt;br /&gt;
    parser.add_argument('--input_star', type=str, required=True, help='Input star file.')&lt;br /&gt;
    parser.add_argument('--output_star_rootname', type=str, default='cluster', help='Output file rootname for each cluster\'s star file.')&lt;br /&gt;
    parser.add_argument('--output_model', type=str, default='xmeans_model.pkl', help='Output X-Means model file name (pickled).')&lt;br /&gt;
&lt;br /&gt;
    args = parser.parse_args()&lt;br /&gt;
&lt;br /&gt;
    print('##### Command #####\n\t' + ' '.join(sys.argv))&lt;br /&gt;
    args_print_str = '##### Input parameters #####\n'&lt;br /&gt;
    for opt, val in vars(args).items():&lt;br /&gt;
        args_print_str += '\t{} : {}\n'.format(opt, val)&lt;br /&gt;
    print(args_print_str)&lt;br /&gt;
    return args&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== logging ==&lt;br /&gt;
https://docs.python.org/release/3.8.2/library/logging.html&lt;br /&gt;
=== ロガー生成スニペット ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
logging_fmt = logging.Formatter(&lt;br /&gt;
    '\n[%(asctime)s - %(name)s - %(levelname)s] %(message)s')&lt;br /&gt;
logger = logging.getLogger(__name__)&lt;br /&gt;
logger.setLevel(logging.DEBUG)&lt;br /&gt;
stream_handler = logging.StreamHandler()&lt;br /&gt;
stream_handler.setFormatter(logging_fmt)&lt;br /&gt;
logger.addHandler(stream_handler)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def set_logger(log_file, is_debug):&lt;br /&gt;
    if log_file is not None:&lt;br /&gt;
        log_file_dir = os.path.dirname(log_file)&lt;br /&gt;
        if log_file_dir:&lt;br /&gt;
            if not os.path.exists(log_file_dir):&lt;br /&gt;
                logger.debug('Creating log file directory...')&lt;br /&gt;
                os.makedirs(log_file_dir)&lt;br /&gt;
            elif not os.path.isdir(log_file_dir):&lt;br /&gt;
                logger.error('{} is not a directory.'.format(log_file_dir))&lt;br /&gt;
                sys.exit(1)&lt;br /&gt;
        file_handler = logging.FileHandler(log_file, mode='w')&lt;br /&gt;
        file_handler.setFormatter(logging_fmt)&lt;br /&gt;
        logger.addHandler(file_handler)&lt;br /&gt;
&lt;br /&gt;
    if not is_debug:&lt;br /&gt;
        logger.setLevel(logging.INFO)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== serialize ==&lt;br /&gt;
=== pickle ===&lt;br /&gt;
==== 保存 ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
pickle.dump(\&lt;br /&gt;
    object_to_be_serialized,&lt;br /&gt;
    open(outfile, 'wb'),&lt;br /&gt;
    protocol=4)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 読み込み ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
with open(pickled_file, 'rb') as f:&lt;br /&gt;
    pickled_content = pickle.load(f)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== subprocess ==&lt;br /&gt;
=== run - 同期型 ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ret = subprocess.run(&amp;quot;シェルコマンド&amp;quot;, text=True, shell=True, capture_output=True)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
投げたシェルコマンドが終わるまで呼び出し側コードはブロックされる。&lt;br /&gt;
&lt;br /&gt;
retが持つ属性は ret.args, ret.returncode, ret.stdout, ret.stderr。&lt;br /&gt;
&lt;br /&gt;
=== Popen - 非同期型 ===&lt;br /&gt;
* 参考&lt;br /&gt;
** https://qiita.com/HidKamiya/items/e192a55371a2961ca8a4&lt;br /&gt;
** https://qiita.com/megmogmog1965/items/5f95b35539ed6b3cfa17&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
p = subprocess.Popen(&amp;quot;シェルコマンド&amp;quot;, shell=True, text=True, stderr=subprocess.STDOUT, stdout=subprocess.PIPE)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Popenはコマンド投げっぱなしで、呼び出し側コードは遠慮なく先へ進む。&lt;br /&gt;
&lt;br /&gt;
処理の終了 (p.poll() is not None)を待ちつつ、出力をリアルタイム表示するには、例えば以下の様にする。&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
while True:&lt;br /&gt;
    if p.poll() is not None:&lt;br /&gt;
        break&lt;br /&gt;
    line = p.stdout.readline()&lt;br /&gt;
    if line is not None:&lt;br /&gt;
        print(line, end='')&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== datetime ==&lt;br /&gt;
* datetimeはモジュール名、datetime.datetimeはdatetimeモジュールのdatetimeクラス&lt;br /&gt;
=== タイムスタンプ文字列生成 ===&lt;br /&gt;
20201119-093428 などのフォーマットで年月日-時刻の文字列を生成するには、&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
import datetime&lt;br /&gt;
datetime.datetime.now().strftime('%Y%m%d-%H%M%S')&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
nowはクラスメソッドで、現在時刻を持ったインスタンスを生成する。&lt;br /&gt;
&lt;br /&gt;
=== iso8601フォーマットで時刻表示 ===&lt;br /&gt;
isoformatメソッドを使う。例えば、&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
In [6]: a = datetime.datetime.strptime('2020/11/19 18:55:37.614', '%Y/%m/%d %H:%M:%S.%f')&lt;br /&gt;
&lt;br /&gt;
In [7]: a.isoformat()&lt;br /&gt;
Out[7]: '2020-11-19T18:55:37.614000'&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 任意の型式の日時表示からdatetimeインスタンス生成 ===&lt;br /&gt;
strptimeメソッドを使う。例えば、&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
In [5]: datetime.datetime.strptime('2020/11/19 18:55:37.614', '%Y/%m/%d %H:%M:%S.%f')&lt;br /&gt;
Out[5]: datetime.datetime(2020, 11, 19, 18, 55, 37, 614000)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
どうやらミリ秒は無くて、マイクロ秒(%fでパース)で表現するらしい。&lt;br /&gt;
&lt;br /&gt;
== docstring ==&lt;br /&gt;
=== モジュールdocstring ===&lt;br /&gt;
ファイルの先頭にそのモジュールの説明を書けばよい。&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
'''Hoge fuga module&lt;br /&gt;
&lt;br /&gt;
This module is for hoge fuga piyo!'''&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
シェバン行やエンコーディング指定はモジュールdocstringの前に書く。&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/usr/bin/env python&lt;br /&gt;
# *_* coding: utf-8 *_*&lt;br /&gt;
&lt;br /&gt;
'''Hoge fuga module&lt;br /&gt;
&lt;br /&gt;
This module is for hoge fuga piyo!'''&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
モジュールdocstringは&amp;lt;pre&amp;gt;__doc__&amp;lt;/pre&amp;gt;で参照できる。&lt;br /&gt;
&lt;br /&gt;
== build-in ==&lt;br /&gt;
=== print ===&lt;br /&gt;
==== 改行無しで表示 ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
print('hogefuga', end='')&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Kttn</name></author>	</entry>

	<entry>
		<id>https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/Python_tips</id>
		<title>Python tips</title>
		<link rel="alternate" type="text/html" href="https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/Python_tips"/>
				<updated>2020-11-19T13:35:36Z</updated>
		
		<summary type="html">&lt;p&gt;Kttn: /* datetime */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== argparse ==&lt;br /&gt;
https://docs.python.org/release/3.8.2/library/argparse.html&lt;br /&gt;
=== インスタンス化 ===&lt;br /&gt;
モジュールdocstring書いといてそれをdescriptionにすると良さげ&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
parser = argparse.ArgumentParser(description=__doc__)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== オプション名の書き方と格納先変数名 ===&lt;br /&gt;
https://docs.python.org/release/3.8.2/library/argparse.html#dest&lt;br /&gt;
&lt;br /&gt;
=== 引数個数の指定 ===&lt;br /&gt;
https://docs.python.org/release/3.8.2/library/argparse.html#nargs&lt;br /&gt;
&lt;br /&gt;
==== 一つ以上のキーワード引数 ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
parser.add_argument('--hoge', nargs='+', help='Hoge files')&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
パース結果はリストに格納される。&lt;br /&gt;
&lt;br /&gt;
=== ヘルプメッセージにデフォルト値を表示する ===&lt;br /&gt;
https://docs.python.org/release/3.8.2/library/argparse.html#argparse.ArgumentDefaultsHelpFormatter&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
parser = argparse.ArgumentParser(formatter_class=argparse.ArgumentDefaultsHelpFormatter)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== スニペット1 ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def parse_args():&lt;br /&gt;
    parser = argparse.ArgumentParser(&lt;br /&gt;
        formatter_class=argparse.ArgumentDefaultsHelpFormatter,&lt;br /&gt;
        description=__doc__&lt;br /&gt;
    )&lt;br /&gt;
&lt;br /&gt;
    args = parser.parse_args()&lt;br /&gt;
&lt;br /&gt;
    print('##### Command #####\n\t' + ' '.join(sys.argv))&lt;br /&gt;
    args_print_str = '##### Input parameters #####\n'&lt;br /&gt;
    for opt, val in vars(args).items():&lt;br /&gt;
        args_print_str += '\t{} : {}\n'.format(opt, val)&lt;br /&gt;
    print(args_print_str)&lt;br /&gt;
    return args&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 具体例1 ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def parse_args():&lt;br /&gt;
    parser = argparse.ArgumentParser(&lt;br /&gt;
        formatter_class=argparse.ArgumentDefaultsHelpFormatter,&lt;br /&gt;
        description=__doc__&lt;br /&gt;
    )&lt;br /&gt;
    parser.add_argument('--Z_file', type=str, required=True, help='Pickled file of latent variables.')&lt;br /&gt;
    parser.add_argument('--k_init', type=int, default=2, help='Initial number of clusters in X-Means')&lt;br /&gt;
    parser.add_argument('--k_max', type=int, default=20, help='Max number of clusters in X-Means')&lt;br /&gt;
    parser.add_argument('--criterion', type=str, default='bic', choices=['bic', 'mndl'], help='Splitting criterion. bic: bayesian information criterion, mndl: minimum noiseless description length.')&lt;br /&gt;
    parser.add_argument('--random_state', type=int, default=None, help='Random seed for X-Means initialization (K-Means++)')&lt;br /&gt;
    parser.add_argument('--no_ccore', action='store_true', help='Use python implementation of PyClustering library, instead of C++.')&lt;br /&gt;
    parser.add_argument('--outdir', required=True, help='Output directory.')&lt;br /&gt;
    parser.add_argument('--input_star', type=str, required=True, help='Input star file.')&lt;br /&gt;
    parser.add_argument('--output_star_rootname', type=str, default='cluster', help='Output file rootname for each cluster\'s star file.')&lt;br /&gt;
    parser.add_argument('--output_model', type=str, default='xmeans_model.pkl', help='Output X-Means model file name (pickled).')&lt;br /&gt;
&lt;br /&gt;
    args = parser.parse_args()&lt;br /&gt;
&lt;br /&gt;
    print('##### Command #####\n\t' + ' '.join(sys.argv))&lt;br /&gt;
    args_print_str = '##### Input parameters #####\n'&lt;br /&gt;
    for opt, val in vars(args).items():&lt;br /&gt;
        args_print_str += '\t{} : {}\n'.format(opt, val)&lt;br /&gt;
    print(args_print_str)&lt;br /&gt;
    return args&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== logging ==&lt;br /&gt;
https://docs.python.org/release/3.8.2/library/logging.html&lt;br /&gt;
=== ロガー生成スニペット ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
logging_fmt = logging.Formatter(&lt;br /&gt;
    '\n[%(asctime)s - %(name)s - %(levelname)s] %(message)s')&lt;br /&gt;
logger = logging.getLogger(__name__)&lt;br /&gt;
logger.setLevel(logging.DEBUG)&lt;br /&gt;
stream_handler = logging.StreamHandler()&lt;br /&gt;
stream_handler.setFormatter(logging_fmt)&lt;br /&gt;
logger.addHandler(stream_handler)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def set_logger(log_file, is_debug):&lt;br /&gt;
    if log_file is not None:&lt;br /&gt;
        log_file_dir = os.path.dirname(log_file)&lt;br /&gt;
        if log_file_dir:&lt;br /&gt;
            if not os.path.exists(log_file_dir):&lt;br /&gt;
                logger.debug('Creating log file directory...')&lt;br /&gt;
                os.makedirs(log_file_dir)&lt;br /&gt;
            elif not os.path.isdir(log_file_dir):&lt;br /&gt;
                logger.error('{} is not a directory.'.format(log_file_dir))&lt;br /&gt;
                sys.exit(1)&lt;br /&gt;
        file_handler = logging.FileHandler(log_file, mode='w')&lt;br /&gt;
        file_handler.setFormatter(logging_fmt)&lt;br /&gt;
        logger.addHandler(file_handler)&lt;br /&gt;
&lt;br /&gt;
    if not is_debug:&lt;br /&gt;
        logger.setLevel(logging.INFO)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== serialize ==&lt;br /&gt;
=== pickle ===&lt;br /&gt;
==== 保存 ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
pickle.dump(\&lt;br /&gt;
    object_to_be_serialized,&lt;br /&gt;
    open(outfile, 'wb'),&lt;br /&gt;
    protocol=4)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 読み込み ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
with open(pickled_file, 'rb') as f:&lt;br /&gt;
    pickled_content = pickle.load(f)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== subprocess ==&lt;br /&gt;
=== run - 同期型 ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ret = subprocess.run(&amp;quot;シェルコマンド&amp;quot;, text=True, shell=True, capture_output=True)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
投げたシェルコマンドが終わるまで呼び出し側コードはブロックされる。&lt;br /&gt;
&lt;br /&gt;
retが持つ属性は ret.args, ret.returncode, ret.stdout, ret.stderr。&lt;br /&gt;
&lt;br /&gt;
=== Popen - 非同期型 ===&lt;br /&gt;
* 参考&lt;br /&gt;
** https://qiita.com/HidKamiya/items/e192a55371a2961ca8a4&lt;br /&gt;
** https://qiita.com/megmogmog1965/items/5f95b35539ed6b3cfa17&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
p = subprocess.Popen(&amp;quot;シェルコマンド&amp;quot;, shell=True, text=True, stderr=subprocess.STDOUT, stdout=subprocess.PIPE)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Popenはコマンド投げっぱなしで、呼び出し側コードは遠慮なく先へ進む。&lt;br /&gt;
&lt;br /&gt;
処理の終了 (p.poll() is not None)を待ちつつ、出力をリアルタイム表示するには、例えば以下の様にする。&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
while True:&lt;br /&gt;
    if p.poll() is not None:&lt;br /&gt;
        break&lt;br /&gt;
    line = p.stdout.readline()&lt;br /&gt;
    if line is not None:&lt;br /&gt;
        print(line, end='')&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== datetime ==&lt;br /&gt;
* datetimeはモジュール名、datetime.datetimeはdatetimeモジュールのdatetimeクラス&lt;br /&gt;
=== タイムスタンプ文字列生成 ===&lt;br /&gt;
20201119-093428 などのフォーマットで年月日-時刻の文字列を生成するには、&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
import datetime&lt;br /&gt;
datetime.datetime.now().strftime('%Y%m%d-%H%M%S')&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
nowはクラスメソッドで、現在時刻を持ったインスタンスを生成する。&lt;br /&gt;
&lt;br /&gt;
=== 任意の型式の日時表示からdatetimeインスタンス生成 ===&lt;br /&gt;
strptimeメソッドを使う。例えば、&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
In [5]: datetime.datetime.strptime('2020/11/19 18:55:37.614', '%Y/%m/%d %H:%M:%S.%f')&lt;br /&gt;
Out[5]: datetime.datetime(2020, 11, 19, 18, 55, 37, 614000)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
どうやらミリ秒は無くて、マイクロ秒(%fでパース)で表現するらしい。&lt;br /&gt;
&lt;br /&gt;
== docstring ==&lt;br /&gt;
=== モジュールdocstring ===&lt;br /&gt;
ファイルの先頭にそのモジュールの説明を書けばよい。&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
'''Hoge fuga module&lt;br /&gt;
&lt;br /&gt;
This module is for hoge fuga piyo!'''&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
シェバン行やエンコーディング指定はモジュールdocstringの前に書く。&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/usr/bin/env python&lt;br /&gt;
# *_* coding: utf-8 *_*&lt;br /&gt;
&lt;br /&gt;
'''Hoge fuga module&lt;br /&gt;
&lt;br /&gt;
This module is for hoge fuga piyo!'''&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
モジュールdocstringは&amp;lt;pre&amp;gt;__doc__&amp;lt;/pre&amp;gt;で参照できる。&lt;br /&gt;
&lt;br /&gt;
== build-in ==&lt;br /&gt;
=== print ===&lt;br /&gt;
==== 改行無しで表示 ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
print('hogefuga', end='')&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Kttn</name></author>	</entry>

	<entry>
		<id>https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/Python_tips</id>
		<title>Python tips</title>
		<link rel="alternate" type="text/html" href="https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/Python_tips"/>
				<updated>2020-11-19T11:46:16Z</updated>
		
		<summary type="html">&lt;p&gt;Kttn: /* argparse */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== argparse ==&lt;br /&gt;
https://docs.python.org/release/3.8.2/library/argparse.html&lt;br /&gt;
=== インスタンス化 ===&lt;br /&gt;
モジュールdocstring書いといてそれをdescriptionにすると良さげ&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
parser = argparse.ArgumentParser(description=__doc__)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== オプション名の書き方と格納先変数名 ===&lt;br /&gt;
https://docs.python.org/release/3.8.2/library/argparse.html#dest&lt;br /&gt;
&lt;br /&gt;
=== 引数個数の指定 ===&lt;br /&gt;
https://docs.python.org/release/3.8.2/library/argparse.html#nargs&lt;br /&gt;
&lt;br /&gt;
==== 一つ以上のキーワード引数 ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
parser.add_argument('--hoge', nargs='+', help='Hoge files')&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
パース結果はリストに格納される。&lt;br /&gt;
&lt;br /&gt;
=== ヘルプメッセージにデフォルト値を表示する ===&lt;br /&gt;
https://docs.python.org/release/3.8.2/library/argparse.html#argparse.ArgumentDefaultsHelpFormatter&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
parser = argparse.ArgumentParser(formatter_class=argparse.ArgumentDefaultsHelpFormatter)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== スニペット1 ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def parse_args():&lt;br /&gt;
    parser = argparse.ArgumentParser(&lt;br /&gt;
        formatter_class=argparse.ArgumentDefaultsHelpFormatter,&lt;br /&gt;
        description=__doc__&lt;br /&gt;
    )&lt;br /&gt;
&lt;br /&gt;
    args = parser.parse_args()&lt;br /&gt;
&lt;br /&gt;
    print('##### Command #####\n\t' + ' '.join(sys.argv))&lt;br /&gt;
    args_print_str = '##### Input parameters #####\n'&lt;br /&gt;
    for opt, val in vars(args).items():&lt;br /&gt;
        args_print_str += '\t{} : {}\n'.format(opt, val)&lt;br /&gt;
    print(args_print_str)&lt;br /&gt;
    return args&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 具体例1 ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def parse_args():&lt;br /&gt;
    parser = argparse.ArgumentParser(&lt;br /&gt;
        formatter_class=argparse.ArgumentDefaultsHelpFormatter,&lt;br /&gt;
        description=__doc__&lt;br /&gt;
    )&lt;br /&gt;
    parser.add_argument('--Z_file', type=str, required=True, help='Pickled file of latent variables.')&lt;br /&gt;
    parser.add_argument('--k_init', type=int, default=2, help='Initial number of clusters in X-Means')&lt;br /&gt;
    parser.add_argument('--k_max', type=int, default=20, help='Max number of clusters in X-Means')&lt;br /&gt;
    parser.add_argument('--criterion', type=str, default='bic', choices=['bic', 'mndl'], help='Splitting criterion. bic: bayesian information criterion, mndl: minimum noiseless description length.')&lt;br /&gt;
    parser.add_argument('--random_state', type=int, default=None, help='Random seed for X-Means initialization (K-Means++)')&lt;br /&gt;
    parser.add_argument('--no_ccore', action='store_true', help='Use python implementation of PyClustering library, instead of C++.')&lt;br /&gt;
    parser.add_argument('--outdir', required=True, help='Output directory.')&lt;br /&gt;
    parser.add_argument('--input_star', type=str, required=True, help='Input star file.')&lt;br /&gt;
    parser.add_argument('--output_star_rootname', type=str, default='cluster', help='Output file rootname for each cluster\'s star file.')&lt;br /&gt;
    parser.add_argument('--output_model', type=str, default='xmeans_model.pkl', help='Output X-Means model file name (pickled).')&lt;br /&gt;
&lt;br /&gt;
    args = parser.parse_args()&lt;br /&gt;
&lt;br /&gt;
    print('##### Command #####\n\t' + ' '.join(sys.argv))&lt;br /&gt;
    args_print_str = '##### Input parameters #####\n'&lt;br /&gt;
    for opt, val in vars(args).items():&lt;br /&gt;
        args_print_str += '\t{} : {}\n'.format(opt, val)&lt;br /&gt;
    print(args_print_str)&lt;br /&gt;
    return args&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== logging ==&lt;br /&gt;
https://docs.python.org/release/3.8.2/library/logging.html&lt;br /&gt;
=== ロガー生成スニペット ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
logging_fmt = logging.Formatter(&lt;br /&gt;
    '\n[%(asctime)s - %(name)s - %(levelname)s] %(message)s')&lt;br /&gt;
logger = logging.getLogger(__name__)&lt;br /&gt;
logger.setLevel(logging.DEBUG)&lt;br /&gt;
stream_handler = logging.StreamHandler()&lt;br /&gt;
stream_handler.setFormatter(logging_fmt)&lt;br /&gt;
logger.addHandler(stream_handler)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def set_logger(log_file, is_debug):&lt;br /&gt;
    if log_file is not None:&lt;br /&gt;
        log_file_dir = os.path.dirname(log_file)&lt;br /&gt;
        if log_file_dir:&lt;br /&gt;
            if not os.path.exists(log_file_dir):&lt;br /&gt;
                logger.debug('Creating log file directory...')&lt;br /&gt;
                os.makedirs(log_file_dir)&lt;br /&gt;
            elif not os.path.isdir(log_file_dir):&lt;br /&gt;
                logger.error('{} is not a directory.'.format(log_file_dir))&lt;br /&gt;
                sys.exit(1)&lt;br /&gt;
        file_handler = logging.FileHandler(log_file, mode='w')&lt;br /&gt;
        file_handler.setFormatter(logging_fmt)&lt;br /&gt;
        logger.addHandler(file_handler)&lt;br /&gt;
&lt;br /&gt;
    if not is_debug:&lt;br /&gt;
        logger.setLevel(logging.INFO)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== serialize ==&lt;br /&gt;
=== pickle ===&lt;br /&gt;
==== 保存 ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
pickle.dump(\&lt;br /&gt;
    object_to_be_serialized,&lt;br /&gt;
    open(outfile, 'wb'),&lt;br /&gt;
    protocol=4)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 読み込み ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
with open(pickled_file, 'rb') as f:&lt;br /&gt;
    pickled_content = pickle.load(f)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== subprocess ==&lt;br /&gt;
=== run - 同期型 ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ret = subprocess.run(&amp;quot;シェルコマンド&amp;quot;, text=True, shell=True, capture_output=True)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
投げたシェルコマンドが終わるまで呼び出し側コードはブロックされる。&lt;br /&gt;
&lt;br /&gt;
retが持つ属性は ret.args, ret.returncode, ret.stdout, ret.stderr。&lt;br /&gt;
&lt;br /&gt;
=== Popen - 非同期型 ===&lt;br /&gt;
* 参考&lt;br /&gt;
** https://qiita.com/HidKamiya/items/e192a55371a2961ca8a4&lt;br /&gt;
** https://qiita.com/megmogmog1965/items/5f95b35539ed6b3cfa17&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
p = subprocess.Popen(&amp;quot;シェルコマンド&amp;quot;, shell=True, text=True, stderr=subprocess.STDOUT, stdout=subprocess.PIPE)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Popenはコマンド投げっぱなしで、呼び出し側コードは遠慮なく先へ進む。&lt;br /&gt;
&lt;br /&gt;
処理の終了 (p.poll() is not None)を待ちつつ、出力をリアルタイム表示するには、例えば以下の様にする。&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
while True:&lt;br /&gt;
    if p.poll() is not None:&lt;br /&gt;
        break&lt;br /&gt;
    line = p.stdout.readline()&lt;br /&gt;
    if line is not None:&lt;br /&gt;
        print(line, end='')&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== datetime ==&lt;br /&gt;
* datetimeはモジュール名、datetime.datetimeはdatetimeモジュールのdatetimeクラス&lt;br /&gt;
=== タイムスタンプ文字列生成 ===&lt;br /&gt;
20201119-093428 などのフォーマットで年月日-時刻の文字列を生成するには、&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
import datetime&lt;br /&gt;
datetime.datetime.now().strftime('%Y%m%d-%H%M%S')&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
nowはクラスメソッドで、現在時刻を持ったインスタンスを生成する。&lt;br /&gt;
&lt;br /&gt;
== docstring ==&lt;br /&gt;
=== モジュールdocstring ===&lt;br /&gt;
ファイルの先頭にそのモジュールの説明を書けばよい。&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
'''Hoge fuga module&lt;br /&gt;
&lt;br /&gt;
This module is for hoge fuga piyo!'''&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
シェバン行やエンコーディング指定はモジュールdocstringの前に書く。&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/usr/bin/env python&lt;br /&gt;
# *_* coding: utf-8 *_*&lt;br /&gt;
&lt;br /&gt;
'''Hoge fuga module&lt;br /&gt;
&lt;br /&gt;
This module is for hoge fuga piyo!'''&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
モジュールdocstringは&amp;lt;pre&amp;gt;__doc__&amp;lt;/pre&amp;gt;で参照できる。&lt;br /&gt;
&lt;br /&gt;
== build-in ==&lt;br /&gt;
=== print ===&lt;br /&gt;
==== 改行無しで表示 ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
print('hogefuga', end='')&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Kttn</name></author>	</entry>

	<entry>
		<id>https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/Python_tips</id>
		<title>Python tips</title>
		<link rel="alternate" type="text/html" href="https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/Python_tips"/>
				<updated>2020-11-19T11:44:46Z</updated>
		
		<summary type="html">&lt;p&gt;Kttn: /* argparse */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== argparse ==&lt;br /&gt;
https://docs.python.org/release/3.8.2/library/argparse.html&lt;br /&gt;
=== インスタンス化 ===&lt;br /&gt;
モジュールdocstring書いといてそれをdescriptionにすると良さげ&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
parser = argparse.ArgumentParser(description=__doc__)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== オプション名の書き方と格納先変数名 ===&lt;br /&gt;
https://docs.python.org/release/3.8.2/library/argparse.html#dest&lt;br /&gt;
&lt;br /&gt;
=== 引数個数の指定 ===&lt;br /&gt;
https://docs.python.org/release/3.8.2/library/argparse.html#nargs&lt;br /&gt;
&lt;br /&gt;
==== 一つ以上のキーワード引数 ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
parser.add_argument('--hoge', nargs='+', help='Hoge files')&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
パース結果はリストに格納される。&lt;br /&gt;
&lt;br /&gt;
=== ヘルプメッセージにデフォルト値を表示する ===&lt;br /&gt;
https://docs.python.org/release/3.8.2/library/argparse.html#argparse.ArgumentDefaultsHelpFormatter&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
parser = argparse.ArgumentParser(formatter_class=argparse.ArgumentDefaultsHelpFormatter)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== スニペット1 ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def parse_args():&lt;br /&gt;
    parser = argparse.ArgumentParser(&lt;br /&gt;
        formatter_class=argparse.ArgumentDefaultsHelpFormatter,&lt;br /&gt;
        description=__doc__&lt;br /&gt;
    )&lt;br /&gt;
&lt;br /&gt;
    args = parser.parse_args()&lt;br /&gt;
&lt;br /&gt;
    logger.info('##### Command #####\n\t' + ' '.join(sys.argv))&lt;br /&gt;
    args_print_str = '##### Input parameters #####\n'&lt;br /&gt;
    for opt, val in vars(args).items():&lt;br /&gt;
        args_print_str += '\t{} : {}\n'.format(opt, val)&lt;br /&gt;
    return args&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 具体例1 ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def parse_args():&lt;br /&gt;
    parser = argparse.ArgumentParser(&lt;br /&gt;
        formatter_class=argparse.ArgumentDefaultsHelpFormatter,&lt;br /&gt;
        description=__doc__&lt;br /&gt;
    )&lt;br /&gt;
    parser.add_argument('--Z_file', type=str, required=True, help='Pickled file of latent variables.')&lt;br /&gt;
    parser.add_argument('--k_init', type=int, default=2, help='Initial number of clusters in X-Means')&lt;br /&gt;
    parser.add_argument('--k_max', type=int, default=20, help='Max number of clusters in X-Means')&lt;br /&gt;
    parser.add_argument('--criterion', type=str, default='bic', choices=['bic', 'mndl'], help='Splitting criterion. bic: bayesian information criterion, mndl: minimum noiseless description length.')&lt;br /&gt;
    parser.add_argument('--random_state', type=int, default=None, help='Random seed for X-Means initialization (K-Means++)')&lt;br /&gt;
    parser.add_argument('--no_ccore', action='store_true', help='Use python implementation of PyClustering library, instead of C++.')&lt;br /&gt;
    parser.add_argument('--outdir', required=True, help='Output directory.')&lt;br /&gt;
    parser.add_argument('--input_star', type=str, required=True, help='Input star file.')&lt;br /&gt;
    parser.add_argument('--output_star_rootname', type=str, default='cluster', help='Output file rootname for each cluster\'s star file.')&lt;br /&gt;
    parser.add_argument('--output_model', type=str, default='xmeans_model.pkl', help='Output X-Means model file name (pickled).')&lt;br /&gt;
&lt;br /&gt;
    args = parser.parse_args()&lt;br /&gt;
&lt;br /&gt;
    logger.info('##### Command #####\n\t' + ' '.join(sys.argv))&lt;br /&gt;
    args_print_str = '##### Input parameters #####\n'&lt;br /&gt;
    for opt, val in vars(args).items():&lt;br /&gt;
        args_print_str += '\t{} : {}\n'.format(opt, val)&lt;br /&gt;
    return args&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== logging ==&lt;br /&gt;
https://docs.python.org/release/3.8.2/library/logging.html&lt;br /&gt;
=== ロガー生成スニペット ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
logging_fmt = logging.Formatter(&lt;br /&gt;
    '\n[%(asctime)s - %(name)s - %(levelname)s] %(message)s')&lt;br /&gt;
logger = logging.getLogger(__name__)&lt;br /&gt;
logger.setLevel(logging.DEBUG)&lt;br /&gt;
stream_handler = logging.StreamHandler()&lt;br /&gt;
stream_handler.setFormatter(logging_fmt)&lt;br /&gt;
logger.addHandler(stream_handler)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def set_logger(log_file, is_debug):&lt;br /&gt;
    if log_file is not None:&lt;br /&gt;
        log_file_dir = os.path.dirname(log_file)&lt;br /&gt;
        if log_file_dir:&lt;br /&gt;
            if not os.path.exists(log_file_dir):&lt;br /&gt;
                logger.debug('Creating log file directory...')&lt;br /&gt;
                os.makedirs(log_file_dir)&lt;br /&gt;
            elif not os.path.isdir(log_file_dir):&lt;br /&gt;
                logger.error('{} is not a directory.'.format(log_file_dir))&lt;br /&gt;
                sys.exit(1)&lt;br /&gt;
        file_handler = logging.FileHandler(log_file, mode='w')&lt;br /&gt;
        file_handler.setFormatter(logging_fmt)&lt;br /&gt;
        logger.addHandler(file_handler)&lt;br /&gt;
&lt;br /&gt;
    if not is_debug:&lt;br /&gt;
        logger.setLevel(logging.INFO)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== serialize ==&lt;br /&gt;
=== pickle ===&lt;br /&gt;
==== 保存 ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
pickle.dump(\&lt;br /&gt;
    object_to_be_serialized,&lt;br /&gt;
    open(outfile, 'wb'),&lt;br /&gt;
    protocol=4)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 読み込み ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
with open(pickled_file, 'rb') as f:&lt;br /&gt;
    pickled_content = pickle.load(f)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== subprocess ==&lt;br /&gt;
=== run - 同期型 ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ret = subprocess.run(&amp;quot;シェルコマンド&amp;quot;, text=True, shell=True, capture_output=True)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
投げたシェルコマンドが終わるまで呼び出し側コードはブロックされる。&lt;br /&gt;
&lt;br /&gt;
retが持つ属性は ret.args, ret.returncode, ret.stdout, ret.stderr。&lt;br /&gt;
&lt;br /&gt;
=== Popen - 非同期型 ===&lt;br /&gt;
* 参考&lt;br /&gt;
** https://qiita.com/HidKamiya/items/e192a55371a2961ca8a4&lt;br /&gt;
** https://qiita.com/megmogmog1965/items/5f95b35539ed6b3cfa17&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
p = subprocess.Popen(&amp;quot;シェルコマンド&amp;quot;, shell=True, text=True, stderr=subprocess.STDOUT, stdout=subprocess.PIPE)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Popenはコマンド投げっぱなしで、呼び出し側コードは遠慮なく先へ進む。&lt;br /&gt;
&lt;br /&gt;
処理の終了 (p.poll() is not None)を待ちつつ、出力をリアルタイム表示するには、例えば以下の様にする。&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
while True:&lt;br /&gt;
    if p.poll() is not None:&lt;br /&gt;
        break&lt;br /&gt;
    line = p.stdout.readline()&lt;br /&gt;
    if line is not None:&lt;br /&gt;
        print(line, end='')&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== datetime ==&lt;br /&gt;
* datetimeはモジュール名、datetime.datetimeはdatetimeモジュールのdatetimeクラス&lt;br /&gt;
=== タイムスタンプ文字列生成 ===&lt;br /&gt;
20201119-093428 などのフォーマットで年月日-時刻の文字列を生成するには、&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
import datetime&lt;br /&gt;
datetime.datetime.now().strftime('%Y%m%d-%H%M%S')&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
nowはクラスメソッドで、現在時刻を持ったインスタンスを生成する。&lt;br /&gt;
&lt;br /&gt;
== docstring ==&lt;br /&gt;
=== モジュールdocstring ===&lt;br /&gt;
ファイルの先頭にそのモジュールの説明を書けばよい。&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
'''Hoge fuga module&lt;br /&gt;
&lt;br /&gt;
This module is for hoge fuga piyo!'''&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
シェバン行やエンコーディング指定はモジュールdocstringの前に書く。&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/usr/bin/env python&lt;br /&gt;
# *_* coding: utf-8 *_*&lt;br /&gt;
&lt;br /&gt;
'''Hoge fuga module&lt;br /&gt;
&lt;br /&gt;
This module is for hoge fuga piyo!'''&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
モジュールdocstringは&amp;lt;pre&amp;gt;__doc__&amp;lt;/pre&amp;gt;で参照できる。&lt;br /&gt;
&lt;br /&gt;
== build-in ==&lt;br /&gt;
=== print ===&lt;br /&gt;
==== 改行無しで表示 ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
print('hogefuga', end='')&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Kttn</name></author>	</entry>

	<entry>
		<id>https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/Python_tips</id>
		<title>Python tips</title>
		<link rel="alternate" type="text/html" href="https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/Python_tips"/>
				<updated>2020-11-19T11:42:46Z</updated>
		
		<summary type="html">&lt;p&gt;Kttn: /* 引数個数の指定 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== argparse ==&lt;br /&gt;
https://docs.python.org/release/3.8.2/library/argparse.html&lt;br /&gt;
=== インスタンス化 ===&lt;br /&gt;
モジュールdocstring書いといてそれをdescriptionにすると良さげ&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
parser = argparse.ArgumentParser(description=__doc__)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== オプション名の書き方と格納先変数名 ===&lt;br /&gt;
https://docs.python.org/release/3.8.2/library/argparse.html#dest&lt;br /&gt;
&lt;br /&gt;
=== 引数個数の指定 ===&lt;br /&gt;
https://docs.python.org/release/3.8.2/library/argparse.html#nargs&lt;br /&gt;
&lt;br /&gt;
==== 一つ以上のキーワード引数 ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
parser.add_argument('--hoge', nargs='+', help='Hoge files')&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
パース結果はリストに格納される。&lt;br /&gt;
&lt;br /&gt;
=== ヘルプメッセージにデフォルト値を表示する ===&lt;br /&gt;
https://docs.python.org/release/3.8.2/library/argparse.html#argparse.ArgumentDefaultsHelpFormatter&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
parser = argparse.ArgumentParser(formatter_class=argparse.ArgumentDefaultsHelpFormatter)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 具体例1 ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def parse_args():&lt;br /&gt;
    parser = argparse.ArgumentParser(&lt;br /&gt;
        formatter_class=argparse.ArgumentDefaultsHelpFormatter,&lt;br /&gt;
        description=__doc__&lt;br /&gt;
    )&lt;br /&gt;
    parser.add_argument('--Z_file', type=str, required=True, help='Pickled file of latent variables.')&lt;br /&gt;
    parser.add_argument('--k_init', type=int, default=2, help='Initial number of clusters in X-Means')&lt;br /&gt;
    parser.add_argument('--k_max', type=int, default=20, help='Max number of clusters in X-Means')&lt;br /&gt;
    parser.add_argument('--criterion', type=str, default='bic', choices=['bic', 'mndl'], help='Splitting criterion. bic: bayesian information criterion, mndl: minimum noiseless description length.')&lt;br /&gt;
    parser.add_argument('--random_state', type=int, default=None, help='Random seed for X-Means initialization (K-Means++)')&lt;br /&gt;
    parser.add_argument('--no_ccore', action='store_true', help='Use python implementation of PyClustering library, instead of C++.')&lt;br /&gt;
    parser.add_argument('--outdir', required=True, help='Output directory.')&lt;br /&gt;
    parser.add_argument('--input_star', type=str, required=True, help='Input star file.')&lt;br /&gt;
    parser.add_argument('--output_star_rootname', type=str, default='cluster', help='Output file rootname for each cluster\'s star file.')&lt;br /&gt;
    parser.add_argument('--output_model', type=str, default='xmeans_model.pkl', help='Output X-Means model file name (pickled).')&lt;br /&gt;
&lt;br /&gt;
    args = parser.parse_args()&lt;br /&gt;
&lt;br /&gt;
    logger.info('##### Command #####\n\t' + ' '.join(sys.argv))&lt;br /&gt;
    args_print_str = '##### Input parameters #####\n'&lt;br /&gt;
    for opt, val in vars(args).items():&lt;br /&gt;
        args_print_str += '\t{} : {}\n'.format(opt, val)&lt;br /&gt;
    return args&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== logging ==&lt;br /&gt;
https://docs.python.org/release/3.8.2/library/logging.html&lt;br /&gt;
=== ロガー生成スニペット ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
logging_fmt = logging.Formatter(&lt;br /&gt;
    '\n[%(asctime)s - %(name)s - %(levelname)s] %(message)s')&lt;br /&gt;
logger = logging.getLogger(__name__)&lt;br /&gt;
logger.setLevel(logging.DEBUG)&lt;br /&gt;
stream_handler = logging.StreamHandler()&lt;br /&gt;
stream_handler.setFormatter(logging_fmt)&lt;br /&gt;
logger.addHandler(stream_handler)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def set_logger(log_file, is_debug):&lt;br /&gt;
    if log_file is not None:&lt;br /&gt;
        log_file_dir = os.path.dirname(log_file)&lt;br /&gt;
        if log_file_dir:&lt;br /&gt;
            if not os.path.exists(log_file_dir):&lt;br /&gt;
                logger.debug('Creating log file directory...')&lt;br /&gt;
                os.makedirs(log_file_dir)&lt;br /&gt;
            elif not os.path.isdir(log_file_dir):&lt;br /&gt;
                logger.error('{} is not a directory.'.format(log_file_dir))&lt;br /&gt;
                sys.exit(1)&lt;br /&gt;
        file_handler = logging.FileHandler(log_file, mode='w')&lt;br /&gt;
        file_handler.setFormatter(logging_fmt)&lt;br /&gt;
        logger.addHandler(file_handler)&lt;br /&gt;
&lt;br /&gt;
    if not is_debug:&lt;br /&gt;
        logger.setLevel(logging.INFO)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== serialize ==&lt;br /&gt;
=== pickle ===&lt;br /&gt;
==== 保存 ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
pickle.dump(\&lt;br /&gt;
    object_to_be_serialized,&lt;br /&gt;
    open(outfile, 'wb'),&lt;br /&gt;
    protocol=4)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 読み込み ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
with open(pickled_file, 'rb') as f:&lt;br /&gt;
    pickled_content = pickle.load(f)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== subprocess ==&lt;br /&gt;
=== run - 同期型 ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ret = subprocess.run(&amp;quot;シェルコマンド&amp;quot;, text=True, shell=True, capture_output=True)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
投げたシェルコマンドが終わるまで呼び出し側コードはブロックされる。&lt;br /&gt;
&lt;br /&gt;
retが持つ属性は ret.args, ret.returncode, ret.stdout, ret.stderr。&lt;br /&gt;
&lt;br /&gt;
=== Popen - 非同期型 ===&lt;br /&gt;
* 参考&lt;br /&gt;
** https://qiita.com/HidKamiya/items/e192a55371a2961ca8a4&lt;br /&gt;
** https://qiita.com/megmogmog1965/items/5f95b35539ed6b3cfa17&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
p = subprocess.Popen(&amp;quot;シェルコマンド&amp;quot;, shell=True, text=True, stderr=subprocess.STDOUT, stdout=subprocess.PIPE)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Popenはコマンド投げっぱなしで、呼び出し側コードは遠慮なく先へ進む。&lt;br /&gt;
&lt;br /&gt;
処理の終了 (p.poll() is not None)を待ちつつ、出力をリアルタイム表示するには、例えば以下の様にする。&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
while True:&lt;br /&gt;
    if p.poll() is not None:&lt;br /&gt;
        break&lt;br /&gt;
    line = p.stdout.readline()&lt;br /&gt;
    if line is not None:&lt;br /&gt;
        print(line, end='')&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== datetime ==&lt;br /&gt;
* datetimeはモジュール名、datetime.datetimeはdatetimeモジュールのdatetimeクラス&lt;br /&gt;
=== タイムスタンプ文字列生成 ===&lt;br /&gt;
20201119-093428 などのフォーマットで年月日-時刻の文字列を生成するには、&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
import datetime&lt;br /&gt;
datetime.datetime.now().strftime('%Y%m%d-%H%M%S')&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
nowはクラスメソッドで、現在時刻を持ったインスタンスを生成する。&lt;br /&gt;
&lt;br /&gt;
== docstring ==&lt;br /&gt;
=== モジュールdocstring ===&lt;br /&gt;
ファイルの先頭にそのモジュールの説明を書けばよい。&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
'''Hoge fuga module&lt;br /&gt;
&lt;br /&gt;
This module is for hoge fuga piyo!'''&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
シェバン行やエンコーディング指定はモジュールdocstringの前に書く。&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/usr/bin/env python&lt;br /&gt;
# *_* coding: utf-8 *_*&lt;br /&gt;
&lt;br /&gt;
'''Hoge fuga module&lt;br /&gt;
&lt;br /&gt;
This module is for hoge fuga piyo!'''&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
モジュールdocstringは&amp;lt;pre&amp;gt;__doc__&amp;lt;/pre&amp;gt;で参照できる。&lt;br /&gt;
&lt;br /&gt;
== build-in ==&lt;br /&gt;
=== print ===&lt;br /&gt;
==== 改行無しで表示 ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
print('hogefuga', end='')&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Kttn</name></author>	</entry>

	<entry>
		<id>https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/Python_tips</id>
		<title>Python tips</title>
		<link rel="alternate" type="text/html" href="https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/Python_tips"/>
				<updated>2020-11-19T11:39:28Z</updated>
		
		<summary type="html">&lt;p&gt;Kttn: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== argparse ==&lt;br /&gt;
https://docs.python.org/release/3.8.2/library/argparse.html&lt;br /&gt;
=== インスタンス化 ===&lt;br /&gt;
モジュールdocstring書いといてそれをdescriptionにすると良さげ&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
parser = argparse.ArgumentParser(description=__doc__)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== オプション名の書き方と格納先変数名 ===&lt;br /&gt;
https://docs.python.org/release/3.8.2/library/argparse.html#dest&lt;br /&gt;
&lt;br /&gt;
=== 引数個数の指定 ===&lt;br /&gt;
https://docs.python.org/release/3.8.2/library/argparse.html#nargs&lt;br /&gt;
&lt;br /&gt;
=== ヘルプメッセージにデフォルト値を表示する ===&lt;br /&gt;
https://docs.python.org/release/3.8.2/library/argparse.html#argparse.ArgumentDefaultsHelpFormatter&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
parser = argparse.ArgumentParser(formatter_class=argparse.ArgumentDefaultsHelpFormatter)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 具体例1 ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def parse_args():&lt;br /&gt;
    parser = argparse.ArgumentParser(&lt;br /&gt;
        formatter_class=argparse.ArgumentDefaultsHelpFormatter,&lt;br /&gt;
        description=__doc__&lt;br /&gt;
    )&lt;br /&gt;
    parser.add_argument('--Z_file', type=str, required=True, help='Pickled file of latent variables.')&lt;br /&gt;
    parser.add_argument('--k_init', type=int, default=2, help='Initial number of clusters in X-Means')&lt;br /&gt;
    parser.add_argument('--k_max', type=int, default=20, help='Max number of clusters in X-Means')&lt;br /&gt;
    parser.add_argument('--criterion', type=str, default='bic', choices=['bic', 'mndl'], help='Splitting criterion. bic: bayesian information criterion, mndl: minimum noiseless description length.')&lt;br /&gt;
    parser.add_argument('--random_state', type=int, default=None, help='Random seed for X-Means initialization (K-Means++)')&lt;br /&gt;
    parser.add_argument('--no_ccore', action='store_true', help='Use python implementation of PyClustering library, instead of C++.')&lt;br /&gt;
    parser.add_argument('--outdir', required=True, help='Output directory.')&lt;br /&gt;
    parser.add_argument('--input_star', type=str, required=True, help='Input star file.')&lt;br /&gt;
    parser.add_argument('--output_star_rootname', type=str, default='cluster', help='Output file rootname for each cluster\'s star file.')&lt;br /&gt;
    parser.add_argument('--output_model', type=str, default='xmeans_model.pkl', help='Output X-Means model file name (pickled).')&lt;br /&gt;
&lt;br /&gt;
    args = parser.parse_args()&lt;br /&gt;
&lt;br /&gt;
    logger.info('##### Command #####\n\t' + ' '.join(sys.argv))&lt;br /&gt;
    args_print_str = '##### Input parameters #####\n'&lt;br /&gt;
    for opt, val in vars(args).items():&lt;br /&gt;
        args_print_str += '\t{} : {}\n'.format(opt, val)&lt;br /&gt;
    return args&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== logging ==&lt;br /&gt;
https://docs.python.org/release/3.8.2/library/logging.html&lt;br /&gt;
=== ロガー生成スニペット ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
logging_fmt = logging.Formatter(&lt;br /&gt;
    '\n[%(asctime)s - %(name)s - %(levelname)s] %(message)s')&lt;br /&gt;
logger = logging.getLogger(__name__)&lt;br /&gt;
logger.setLevel(logging.DEBUG)&lt;br /&gt;
stream_handler = logging.StreamHandler()&lt;br /&gt;
stream_handler.setFormatter(logging_fmt)&lt;br /&gt;
logger.addHandler(stream_handler)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def set_logger(log_file, is_debug):&lt;br /&gt;
    if log_file is not None:&lt;br /&gt;
        log_file_dir = os.path.dirname(log_file)&lt;br /&gt;
        if log_file_dir:&lt;br /&gt;
            if not os.path.exists(log_file_dir):&lt;br /&gt;
                logger.debug('Creating log file directory...')&lt;br /&gt;
                os.makedirs(log_file_dir)&lt;br /&gt;
            elif not os.path.isdir(log_file_dir):&lt;br /&gt;
                logger.error('{} is not a directory.'.format(log_file_dir))&lt;br /&gt;
                sys.exit(1)&lt;br /&gt;
        file_handler = logging.FileHandler(log_file, mode='w')&lt;br /&gt;
        file_handler.setFormatter(logging_fmt)&lt;br /&gt;
        logger.addHandler(file_handler)&lt;br /&gt;
&lt;br /&gt;
    if not is_debug:&lt;br /&gt;
        logger.setLevel(logging.INFO)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== serialize ==&lt;br /&gt;
=== pickle ===&lt;br /&gt;
==== 保存 ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
pickle.dump(\&lt;br /&gt;
    object_to_be_serialized,&lt;br /&gt;
    open(outfile, 'wb'),&lt;br /&gt;
    protocol=4)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 読み込み ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
with open(pickled_file, 'rb') as f:&lt;br /&gt;
    pickled_content = pickle.load(f)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== subprocess ==&lt;br /&gt;
=== run - 同期型 ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ret = subprocess.run(&amp;quot;シェルコマンド&amp;quot;, text=True, shell=True, capture_output=True)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
投げたシェルコマンドが終わるまで呼び出し側コードはブロックされる。&lt;br /&gt;
&lt;br /&gt;
retが持つ属性は ret.args, ret.returncode, ret.stdout, ret.stderr。&lt;br /&gt;
&lt;br /&gt;
=== Popen - 非同期型 ===&lt;br /&gt;
* 参考&lt;br /&gt;
** https://qiita.com/HidKamiya/items/e192a55371a2961ca8a4&lt;br /&gt;
** https://qiita.com/megmogmog1965/items/5f95b35539ed6b3cfa17&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
p = subprocess.Popen(&amp;quot;シェルコマンド&amp;quot;, shell=True, text=True, stderr=subprocess.STDOUT, stdout=subprocess.PIPE)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Popenはコマンド投げっぱなしで、呼び出し側コードは遠慮なく先へ進む。&lt;br /&gt;
&lt;br /&gt;
処理の終了 (p.poll() is not None)を待ちつつ、出力をリアルタイム表示するには、例えば以下の様にする。&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
while True:&lt;br /&gt;
    if p.poll() is not None:&lt;br /&gt;
        break&lt;br /&gt;
    line = p.stdout.readline()&lt;br /&gt;
    if line is not None:&lt;br /&gt;
        print(line, end='')&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== datetime ==&lt;br /&gt;
* datetimeはモジュール名、datetime.datetimeはdatetimeモジュールのdatetimeクラス&lt;br /&gt;
=== タイムスタンプ文字列生成 ===&lt;br /&gt;
20201119-093428 などのフォーマットで年月日-時刻の文字列を生成するには、&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
import datetime&lt;br /&gt;
datetime.datetime.now().strftime('%Y%m%d-%H%M%S')&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
nowはクラスメソッドで、現在時刻を持ったインスタンスを生成する。&lt;br /&gt;
&lt;br /&gt;
== docstring ==&lt;br /&gt;
=== モジュールdocstring ===&lt;br /&gt;
ファイルの先頭にそのモジュールの説明を書けばよい。&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
'''Hoge fuga module&lt;br /&gt;
&lt;br /&gt;
This module is for hoge fuga piyo!'''&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
シェバン行やエンコーディング指定はモジュールdocstringの前に書く。&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/usr/bin/env python&lt;br /&gt;
# *_* coding: utf-8 *_*&lt;br /&gt;
&lt;br /&gt;
'''Hoge fuga module&lt;br /&gt;
&lt;br /&gt;
This module is for hoge fuga piyo!'''&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
モジュールdocstringは&amp;lt;pre&amp;gt;__doc__&amp;lt;/pre&amp;gt;で参照できる。&lt;br /&gt;
&lt;br /&gt;
== build-in ==&lt;br /&gt;
=== print ===&lt;br /&gt;
==== 改行無しで表示 ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
print('hogefuga', end='')&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Kttn</name></author>	</entry>

	<entry>
		<id>https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/Git</id>
		<title>Git</title>
		<link rel="alternate" type="text/html" href="https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/Git"/>
				<updated>2020-11-19T10:46:55Z</updated>
		
		<summary type="html">&lt;p&gt;Kttn: ページの作成:「== ユーザー名とemailの登録 == &amp;lt;pre&amp;gt; git config --global user.name &amp;quot;ユーザー名&amp;quot; git config --global user.email メールアドレス &amp;lt;/pre&amp;gt;」&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== ユーザー名とemailの登録 ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git config --global user.name &amp;quot;ユーザー名&amp;quot;&lt;br /&gt;
git config --global user.email メールアドレス&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Kttn</name></author>	</entry>

	<entry>
		<id>https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/%E3%83%A1%E3%82%A4%E3%83%B3%E3%83%9A%E3%83%BC%E3%82%B8</id>
		<title>メインページ</title>
		<link rel="alternate" type="text/html" href="https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/%E3%83%A1%E3%82%A4%E3%83%B3%E3%83%9A%E3%83%BC%E3%82%B8"/>
				<updated>2020-11-19T10:43:46Z</updated>
		
		<summary type="html">&lt;p&gt;Kttn: /* Git] */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== '''Eospediaにようこそ''' ==&lt;br /&gt;
&lt;br /&gt;
2010年11月05日に、研究室内にEospediaクローズドβ版の運営を開始しました。&amp;lt;br&amp;gt;&lt;br /&gt;
2012年８月に、こちらが電子顕微鏡画像処理システムEosのホームページの本家となるように、オープンにしました。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Eos]]のコマンド説明やその中のアルゴリズムについてなど、幅広い知識を集約できればと思います。また、2012年より開発を開始した[[PIONE]]、2013年度より開発を開始した[[VEM/WITs]]についても同様にこちらでまとめていきます。&amp;lt;br&amp;gt;&lt;br /&gt;
それに加えて、電子顕微鏡画像処理を含む、各種画像処理の基本を学ぶことができるサイトとして運営したいと考えています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Eos]]は、[https://sourceforge.jp/projects/eos/ Eos@sourceforge]上で、[[PIONE]]は、[https://github.com/pione PIONE@github]で開発を進めています。それらをまとめた情報はこちらで展開したいと思います。将来は、大学から離れた方が良いかと考えています。それぞれ開発や利用に興味があるかたはそれぞれのサイトも覗いてみて下さい。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
wikiは「間違いをいかに防ぐか」ではなく、「いかに修正するか」が哲学ですので、&lt;br /&gt;
間違いを恐れず(もちろんデタラメは論外)皆さんの知識とノウハウを自由に書いて頂ければ幸いです。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
只今ホームページに公開していたEosマニュアル(日本語版も含む)の転載作業を進めています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
ちなみに、[http://www.yasunaga-lab.bio.kyutech.ac.jp/Eos/ 英語版]もあります。現在は、日本語版のほうが充実しています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
また、Eosに関しては、[http://sourceforge.jp/projects/eos/lists/ メーリングリスト]及び[http://sourceforge.jp/projects/eos/forums/ フォーラム]があります。&amp;lt;br&amp;gt;&lt;br /&gt;
Eosの使い方を知りたい方は：eos-users@&amp;lt;br&amp;gt;&lt;br /&gt;
Eosでの開発にご興味のある方は：eos-developers@&amp;lt;br&amp;gt;&lt;br /&gt;
Eosのドキュメント作成のお手伝いを頂ける方は：eos-document@&amp;lt;br&amp;gt;&lt;br /&gt;
にて、是非ともご協力下さい。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
また、facebook上で、Eos User Group[https://www.facebook.com/EosUserGroup]を開設しました。こちらからも発信していくことにします。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
詳細は,安永[mailto:yasunaga@bio.kyutech.ac.jp]までご連絡下さい。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 開発しているシステムの全体像（Eos/PIONE/Zephyr &amp;amp; WITs/VEM) ==&lt;br /&gt;
　現在、電子顕微鏡画像取得・処理・分析のための一連のワークフロー全体を総括するソリューションとして、Eos/PIONE/Zephyr &amp;amp; WITs/VEMとよぶシステムを作っています。システム全体の名前もつけたほうがよい位、Systems of System といった様相になってきています。個々に、当該システムの概要とその目指す姿をまとめておきたいと思います。&lt;br /&gt;
&lt;br /&gt;
　下記のページにまとめておきます。&lt;br /&gt;
[[Eos/PIONE/Zephyr/WITs/VEM システム]]&lt;br /&gt;
&lt;br /&gt;
== '''Eosビギナーズガイド''' ==&lt;br /&gt;
&lt;br /&gt;
=== [[Eos|Eosとは？]] ===&lt;br /&gt;
　Eosとはなにかについて述べます。&lt;br /&gt;
=== [[コマンド|Eosのコマンドとは？]] ===&lt;br /&gt;
　Eosにおけるコマンドについて述べます。&lt;br /&gt;
=== [[Makefile|Eosはどうやって使うの？]] ===&lt;br /&gt;
　Eosにおける[[make]]を用いたコマンドの統合方法について述べます。&lt;br /&gt;
=== [[コマンド一覧|Eosのコマンド一覧表]] ===&lt;br /&gt;
　Eosが提供するコマンドの一覧を示します。&lt;br /&gt;
=== [[機能別コマンド一覧|Eosの機能別コマンド一覧表]] ===&lt;br /&gt;
　Eosが提供するコマンドの機能別一覧を示します。&lt;br /&gt;
&lt;br /&gt;
== Eos/PIONEのインストール方法 ==&lt;br /&gt;
===[[必要な環境|Eosの必要な環境]]===&lt;br /&gt;
&lt;br /&gt;
=== [[ダウンロード|Eosのダウンロード(インストール方法)]] ===&lt;br /&gt;
　Eosのダウンロード方法について述べます。利用するだけであれば、ダウンロードだけで利用することができます。共同開発を進めたい方、機能の要望がある方は、現在、EosはOSDN(旧：SourceForge)にて開発を進めています。是非、ご一緒して下さい。&lt;br /&gt;
&lt;br /&gt;
=== [[インストール方法|Eosのインストール方法（開発・再構築）]] ===&lt;br /&gt;
　Eosのインストール方法について述べます。ここでは、ダウンロードしたファイルから再構築する方法や自分自身が開発したソースコードを運用する方法を述べています。&lt;br /&gt;
&lt;br /&gt;
=== [[PIONEのインストール方法]]===&lt;br /&gt;
　makeに替わる分散プロセス処理プラットフォーム(PIONE)のインストール方法を示します。現在、PIONEはgithubにて開発を進めています。&lt;br /&gt;
&lt;br /&gt;
== '''Eosリファレンス''' ==&lt;br /&gt;
&lt;br /&gt;
=== [[統合コマンド|Eosの提供する統合コマンド]] ===&lt;br /&gt;
　Eosが提供する統合コマンドについて述べます。&lt;br /&gt;
&lt;br /&gt;
=== 統合コマンド：[[PIONE]]===&lt;br /&gt;
　Eosが分散環境、クラウド環境に対応した統合環境として提供するPIONEについて述べます。インストールに関しては[[PIONEのインストール]]を、ブラウザ操作に関しては[[PIONEの起動方法]]や[[PIONE Webclientチュートリアル]]を、[[PIONE定義書]]の作り方や実行方法については[[PIONEチュートリアル]]や[[PIONEチュートリアル-PNML]]を、ログの確認方法は[[PIONEチュートリアル-XES]]を、パッケージの作り方は[[PIONEチュートリアル-package]]を、コマンドの一覧は[[PIONEコマンド一覧]]または[[機能別PIONEコマンド一覧]]を、メソッドの一覧などは[[PIONEの式]]を、その他TIPSなどは[[PIONEのTIPS]]をご覧下さい。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 電子顕微鏡制御統合環境(WITs/VEM) ===&lt;br /&gt;
&lt;br /&gt;
==== 相関顕微鏡のためのシステム ====&lt;br /&gt;
　同一視野の撮影のためのシステムの提供を進めています．[[SerialEM]]に対応する環境として，電子顕微鏡を仮想化するための[[VEM]]，および，[[VEM]]と通信して，電子顕微鏡を制御するための[[WITs]]というシステムに大きく分けて開発を進めています．&lt;br /&gt;
&lt;br /&gt;
下記に[[WITs]]としてのアプリケーションのリストを示します．&lt;br /&gt;
&lt;br /&gt;
[[WITs-CLEM]]: 相関顕微鏡向けのシステムになります．&lt;br /&gt;
&lt;br /&gt;
== '''Eos チュートリアル'''　==&lt;br /&gt;
=== 環境の設定　===&lt;br /&gt;
最初にEosのインストール方法を簡単に説明します。詳細は、[[インストール方法|Eosのインストール方法の詳細]]をご覧下さい。&lt;br /&gt;
&lt;br /&gt;
* [[Eosのインストール|Eosのインストール方法]]&lt;br /&gt;
&lt;br /&gt;
=== Eosでのコマンドの取り扱い　===&lt;br /&gt;
Eosのコマンドの簡単な使い方を説明します。詳細は、[[コマンド|コマンドの詳細]]をご覧下さい。Eosでは、基本はCUIを使ったコマンドの実行により画像処理を進めます。その結果は、ファイルとして保存され、その内容を確認することが出来ます。&lt;br /&gt;
&lt;br /&gt;
* [[Eosのコマンド|Eosのコマンド]]&lt;br /&gt;
&lt;br /&gt;
=== Eosでの画像の取り扱い　===&lt;br /&gt;
Eosで取り扱うことのできる[[画像フォーマット]]と一般的な画像フォーマットからの変換方法を示します。&lt;br /&gt;
* [[画像フォーマット|画像フォーマット]]&lt;br /&gt;
* [[画像フォーマット変換|画像フォーマットの変換]]&lt;br /&gt;
&lt;br /&gt;
=== Eosを使った簡単な画像処理　===&lt;br /&gt;
Eosを使った簡単な画像処理を実行してもらいます。&lt;br /&gt;
* [[簡単な画像処理|簡単な２次元画像処理]]&lt;br /&gt;
&lt;br /&gt;
=== [[チュートリアル一覧]] ===&lt;br /&gt;
ここには、[[Small Tools]]や様々な[[画像処理]]で使用する[[Makefile]]や[[PIONE]]の一覧があります。&lt;br /&gt;
&lt;br /&gt;
=== CTF画像補正　===&lt;br /&gt;
電子顕微鏡画像では、その撮影方法に由来して、コントラストが大きく変調を受けています。ここでは、その画像のコントラストの変調を補正する方法を示します。&lt;br /&gt;
* [[CTF補正|CTFの補正]]&lt;br /&gt;
&lt;br /&gt;
=== 単粒子解析の基礎　===&lt;br /&gt;
　ここでは、単粒子解析の基礎を行います。実際の単粒子解析は、粒子の形やその対称性などを使って探索方法や3次元再構成法を切り替えることができます。&lt;br /&gt;
&lt;br /&gt;
==== [[単粒子解析]]の概要 ====&lt;br /&gt;
　単粒子解析の概要を示します。&lt;br /&gt;
&lt;br /&gt;
==== [[粒子抽出|粒子の抽出]] ====&lt;br /&gt;
　まず、単粒子を抽出します。ここでは、手動で切り出す方法を示します。自動で切り出す方法も各種提案されています。&lt;br /&gt;
&lt;br /&gt;
==== [[２次元画像の分類|２次元画像の分類]] ====&lt;br /&gt;
　２次元画像を分類して、ＳＮ比を上げます。&lt;br /&gt;
&lt;br /&gt;
==== [[参照付投影角度決定|参照像があるときの投影角の決定方法]] ====&lt;br /&gt;
　参照像があるときの投影角の決定方法を説明します。参照像としては、単なる球や楕円体などとすることもあり得ます。参照像がない場合の構造解析法も別途存在しています。&lt;br /&gt;
&lt;br /&gt;
==== [[参照無投影角度決定|参照像がないときの投影角の決定方法]] ====&lt;br /&gt;
　参照画像がないときの投影角の決定方法を示しています。[[コモンライン]]をもちいた[[コモンライン探索]]という方法が一般的です。ただノイズに弱く問題が生じる場合があります。&lt;br /&gt;
&lt;br /&gt;
==== [[３次元再構成・逆投影|３次元再構成・逆投影法]] ====&lt;br /&gt;
　3次元再構成自身を解説します。&lt;br /&gt;
&lt;br /&gt;
==== [[らせん対称をもつ粒子の３次元再構成法]]====&lt;br /&gt;
　アクチンフィラメントなどのらせん対称性をもつ場合のEosでの解析法を紹介します。&lt;br /&gt;
&lt;br /&gt;
==== [[可視化ツール|可視化ツール]] ====&lt;br /&gt;
　できあがった三次元像を可視化するためのツールを紹介します。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====参考資料  ====&lt;br /&gt;
&lt;br /&gt;
===== [[RELION]] =====&lt;br /&gt;
　単粒子解析法のデファクトスタンダードになりつつある[[RELION]]について、解説を準備することにしました。&lt;br /&gt;
少しずつ整理していきます。&lt;br /&gt;
&lt;br /&gt;
===== [[Gautomatch]] =====&lt;br /&gt;
 　粒子抽出のためのプログラムのひとつです。&lt;br /&gt;
&lt;br /&gt;
===== [[cryoDRGN]] =====&lt;br /&gt;
　深層ニューラルネットワークを用いた単粒子3D再構成プログラム[[cryoDRGN]]に関するページです。&lt;br /&gt;
&lt;br /&gt;
===== [[Topaz]] =====&lt;br /&gt;
　深層ニューラルネットワークを用いた単粒子ピッキングプログラム[[Topaz]]に関するページです。&lt;br /&gt;
&lt;br /&gt;
===== [[cryoSPARC]] =====&lt;br /&gt;
　優れたUIを持った単粒子解析パッケージ[[cryoSPARC]]に関するページです。&lt;br /&gt;
&lt;br /&gt;
==== 備考 ====&lt;br /&gt;
　上記のチュートリアル・ページは、2012/09/10-11 単粒子解析Workshopでの資料を元に作成したものです。&lt;br /&gt;
今後もこのサイトを充実させ、ワークショップ等で利用していきたいと考えています。&lt;br /&gt;
&lt;br /&gt;
=== [[電子線トモグラフィー]] ===&lt;br /&gt;
　電子線トモグラフィーとは、同一視野の連続傾斜像から、その視野の３次元画像を再構成する方法です。細胞内の構造や構造多型性をもつタンパク質の構造解析に有効な方法です。&lt;br /&gt;
&lt;br /&gt;
==== [[電子線トモグラフィー]]の概要 ====&lt;br /&gt;
　電子線トモグラフィー法は、同一視野の傾斜シリーズ画像のセットから３次元像を再構成する方法です。ここではその概要を述べます。&lt;br /&gt;
&lt;br /&gt;
==== [[画像の補正]] ====&lt;br /&gt;
　傾斜画像では、視野全体がアンダーフォーカスとなるように、通常の電子顕微鏡撮影よりも大きなデフォカース値をとる場合が多いです。その場合、LaB6などの電子銃では第一トーンリングより外側の情報がほとんど無いために、CTF補正等は必要ありませんが、電界放出銃を利用した場合には、場合によっては間違った情報を与える場合があるので注意が必要です。&lt;br /&gt;
&lt;br /&gt;
==== [[ラフ・アラインメント]] ====&lt;br /&gt;
　傾斜画像の中心付近の画像の相関から、それぞれの傾斜画像の大まかな位置を合わせます。&lt;br /&gt;
&lt;br /&gt;
==== [[ファイン・アラインメント]] ====&lt;br /&gt;
　傾斜画像の軸の位置、角度を出来る限り一致させます。&lt;br /&gt;
&lt;br /&gt;
==== [[３次元再構成]] ====&lt;br /&gt;
　２次元画像のセットから３次元画像を再構成します。&lt;br /&gt;
&lt;br /&gt;
==== [[電子線トモグラフィー画像のもつ問題点]] ====&lt;br /&gt;
　全方位からの投影像を得られないために、ミッシングエリアとよばれる情報がない領域があります。そのため、方向依存でのボケを生じます。&lt;br /&gt;
&lt;br /&gt;
==== [[トモグラム画像の解釈]] ====&lt;br /&gt;
　多様な構造を含むため、３次元画像から興味あるセグメントを切り出すなどの作業が必要です。そのための支援ソフトウェアが必要です。&lt;br /&gt;
&lt;br /&gt;
==== [[サブトモグラム画像の平均化]] ====&lt;br /&gt;
　クライオ電子顕微鏡画像からトモグラム画像はノイズが多いため、同等の構造をしたものを平均化する必要があります。&lt;br /&gt;
&lt;br /&gt;
==== 参考資料 ====&lt;br /&gt;
===== [[IMOD/ETomo]]の使い方=====&lt;br /&gt;
　[[IMOD/ETomo]]は、電子線トモグラフィー法やシリアルセクションなどで使われる、デファクトスタンダードともいえる3次元再構成プログラムです。&lt;br /&gt;
&lt;br /&gt;
====== [[eTomoチュートリアル]] ======&lt;br /&gt;
　eTomoのチュートリアルを示しています。&lt;br /&gt;
&lt;br /&gt;
=== 連続２次元画像からの３次元再構成 ===&lt;br /&gt;
　連続切片(Serial Section）や、連続ブロック表面(Serial Block Face)からの３次元再構成のための手順を示したものです。&lt;br /&gt;
&lt;br /&gt;
==== [[SBF-SEMからの３次元再構成]] ====&lt;br /&gt;
&lt;br /&gt;
== Eosにおける開発（開発者向け） ==&lt;br /&gt;
&lt;br /&gt;
　Eosのもうひとつのウリは迅速なプログラムの開発です。その手法について下記に述べます。&lt;br /&gt;
&lt;br /&gt;
=== [[Eosの構造|Eosの構造]] ===&lt;br /&gt;
　Eosの構造(Architecture）について述べます。&lt;br /&gt;
&lt;br /&gt;
=== [[Eosの開発|Eosの開発]]===&lt;br /&gt;
　SourceForgeからクローンを作成し、localで新規ツールなどを開発した後、SourceForgeに登録するまでの流れを示します。&lt;br /&gt;
&lt;br /&gt;
=== [[Eosの開発におけるTIPS]] ===&lt;br /&gt;
　Eos上で開発する際のTIPSをまとめています。&lt;br /&gt;
&lt;br /&gt;
=== [[ツールの開発]] ===&lt;br /&gt;
==== [[ツールの作り方]] ====&lt;br /&gt;
　Eosの上での[[Small Tools]]([[コマンド群]])の作り方について述べます。&lt;br /&gt;
&lt;br /&gt;
==== [[簡単なプログラム例]] ====&lt;br /&gt;
　Eosの上での[[Small Tools]]([[コマンド群]])の簡単なプログラム例について述べます。&lt;br /&gt;
&lt;br /&gt;
=== [[ライブラリ（API）の作り方]]===&lt;br /&gt;
　Eosの上での[[オブジェクト指向型ライブラリ]]（[[API]]）の作り方について述べます。&lt;br /&gt;
&lt;br /&gt;
=== [[ライブラリ(API)一覧]]===&lt;br /&gt;
　Eosの上での[[オブジェクト指向型ライブラリ]]（[[API]]）の一覧です。&lt;br /&gt;
&lt;br /&gt;
=== [[機能別ライブラリ(API)一覧]]===&lt;br /&gt;
　Eosの上での機能別に分類された[[オブジェクト指向型ライブラリ]]（[[API]]）の一覧です。&lt;br /&gt;
&lt;br /&gt;
並列処理のためのライブラリ&lt;br /&gt;
*[[eosCuda]]: CUDA を使うためのライブラリ&lt;br /&gt;
*[[eosPThread]]: pthread を使うためのライブラリ&lt;br /&gt;
&lt;br /&gt;
=== [[統合コマンドの作り方]]===&lt;br /&gt;
　統合コマンドの作り方を示します。&lt;br /&gt;
&lt;br /&gt;
==== [[Makefileによる統合]] ====&lt;br /&gt;
　[[Makefile]]を用いた統合方法について示します。[[Visualmake]]は自動的に簡易型のGUIを提供します。&lt;br /&gt;
&lt;br /&gt;
==== [[PIONEによる統合]]  ====&lt;br /&gt;
　分散環境（クラウド環境）に対応したプロセス定義書[[PIONE]]を用いた統合方法について示します。&lt;br /&gt;
&lt;br /&gt;
==== [[PIONEチュートリアル]] ====&lt;br /&gt;
　[[PIONE]]の使い方を示したチュートリアルです。&lt;br /&gt;
&lt;br /&gt;
==== [[PIONEチュートリアル-PNML]]====&lt;br /&gt;
　[[PNML]]を用いたPIONE定義書の設計方法を示しています．&lt;br /&gt;
&lt;br /&gt;
==== [[PIONEチュートリアル-XES]]====&lt;br /&gt;
　ログファイルを[[XES]]形式に変換し、[[ProM]]を利用して処理結果を確認する方法を示しています。&lt;br /&gt;
&lt;br /&gt;
==== [[PIONEチュートリアル-package]]====&lt;br /&gt;
　[[PIONE定義書]]などをひとつにまとめたパッケージを作成する方法を示しています。&lt;br /&gt;
&lt;br /&gt;
==== [[bashによる統合]] ====&lt;br /&gt;
　bashなどのスクリプト言語による統合方法について示します。&lt;br /&gt;
&lt;br /&gt;
==== [[統合コマンドによる統合]] ====&lt;br /&gt;
　[[Display2]], [[smolet]], [[Eos]]などのTcl/Tk型の統合コマンドによる統合, [[ctfDisplay]]等のRuby型の統合コマンドによる統合，[[molvie]]などのＣ言語型の統合コマンドによる統合、などの各種方法について示します。&lt;br /&gt;
&lt;br /&gt;
=== [[並列処理による高速化]] ===&lt;br /&gt;
　Eosでは、makeを使った単一ホストでのプロセスレベルでの並列処理、PIONEを使った分散環境におけるプロセスレベルの並列処理に加えて、pthread/GPGPUを用いたthreadレベルでの高速化も試行しています。すべてのコードが対応している訳ではありませんが、随時、対応を進めています。&lt;br /&gt;
&lt;br /&gt;
===== [[eosPThread]] =====&lt;br /&gt;
&lt;br /&gt;
===== [[eosCuda]] =====&lt;br /&gt;
&lt;br /&gt;
=== [[よく使うシェルコマンド]] ===&lt;br /&gt;
　ここでは[[コマンド]]、[[Makefile]]、[[PIONE]]などの作成や実行においてよく使うシェルコマンドを簡易的にリストアップしています。&lt;br /&gt;
&lt;br /&gt;
== [[画像処理]] ==&lt;br /&gt;
=== [[画像処理一般]] ===&lt;br /&gt;
　ここでは画像処理一般に関する話をまとめています。&lt;br /&gt;
&lt;br /&gt;
==== [[簡単な画像処理]]====&lt;br /&gt;
　Eosを使った簡単な画像処理に関するチュートリアルが掲載されています。&lt;br /&gt;
&lt;br /&gt;
==== [[画像の入力]]と[[レンズ]] ====&lt;br /&gt;
　コンピュータを使って画像処理を行う前に、画像がデジタル化される入力装置のことを気にしておく必要があります。&lt;br /&gt;
&lt;br /&gt;
==== [[CTF]],[[PSF]]と[[MTF]]====&lt;br /&gt;
　真に得たい画像をf(x,y)で表現した場合に、[[画像の入力]]方法や[[レンズ]]の性能などによりどうしても画像が劣化します。&lt;br /&gt;
&lt;br /&gt;
==== [[標本化]] ====&lt;br /&gt;
　アナログ画像をデジタル画像にするためには、空間を刻み、離散化することが重要です。このステップを標本化といいます。&lt;br /&gt;
&lt;br /&gt;
==== [[量子化]] ====&lt;br /&gt;
　デジタル画像処理では、アナログである濃度値（光学密度）をあるビット数内で表現する量子化（ＡＤ変換）という操作が最初に必要です。&lt;br /&gt;
&lt;br /&gt;
==== [[ノイズ除去]] ====&lt;br /&gt;
　ノイズが非常に多い画像を取り扱うためには、ノイズの性質をよく知ることが重要です。&lt;br /&gt;
&lt;br /&gt;
===== [[平滑化]] =====&lt;br /&gt;
　画像のもつノイズを取り除くことを主たる目的として実施する画像処理方法です。ノイズの性質をよく理解することで、適切なノイズ除去が可能になります。&lt;br /&gt;
&lt;br /&gt;
==== [[エッジ検出]] ====&lt;br /&gt;
　対象物の形を理解するために重要なステップですが、とても難しいステップでもあります。&lt;br /&gt;
&lt;br /&gt;
==== [[２値画像処理]] ====&lt;br /&gt;
　シグナルと背景の切り分けや、代表点や骨格の抽出など、画像処理や解析のスタートとなる処理方法です。&lt;br /&gt;
&lt;br /&gt;
==== [[フーリエ空間]]を利用した画像処理 ====&lt;br /&gt;
&lt;br /&gt;
==== 実空間の[[カーネル]]を用いた画像処理 ====&lt;br /&gt;
&lt;br /&gt;
==== [[マスマティカル・モルフォロジー]]を使った画像処理 ====&lt;br /&gt;
&lt;br /&gt;
=== [[電子顕微鏡画像処理]] ===&lt;br /&gt;
　電子顕微鏡画像処理に関する話をまとめています。&lt;br /&gt;
&lt;br /&gt;
==== [[モンタージュ]]、[[パノラマ]]画像 ====&lt;br /&gt;
　異なる領域を撮影した複数の画像（ただし、その一部は重なっている画像のセット）を組み合わせて、広領域の画像をつくる方法です。&lt;br /&gt;
&lt;br /&gt;
==== [[CTF補正]] ====&lt;br /&gt;
　電子顕微鏡の画像は、原理的に、画像変調を受けています。その画像変調を補正する為の画像処理です。&lt;br /&gt;
&lt;br /&gt;
==== [[３次元画像の位置合わせ]] ====&lt;br /&gt;
　３次元画像同士を平均し、雑音をとるための手法です。&lt;br /&gt;
&lt;br /&gt;
==== [[シリアル画像の位置合わせ]] ====&lt;br /&gt;
　連続切片の画像同士の位置を合わせることで、三次元像を再構成する手法です。&lt;br /&gt;
&lt;br /&gt;
=== [[３次元再構成法]] ===&lt;br /&gt;
　３次元再構成法とは、２次元の画像から３次元の画像を再構成する技術です&lt;br /&gt;
&lt;br /&gt;
==== [[中央断面定理]]====&lt;br /&gt;
　投影像からなぜ、内部の構造がわかるのか、それを支えているのがこの中央断面定理です．&lt;br /&gt;
&lt;br /&gt;
==== [[フーリエ法]]====&lt;br /&gt;
==== [[逆投影法]]====&lt;br /&gt;
==== [[SIRT]]====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== [[3Dモデル関連]] ==&lt;br /&gt;
=== [[chimera]] ===&lt;br /&gt;
　ボリュームデータやＰＤＢデータなどを可視化表示するためのソフトウェアです。&lt;br /&gt;
=== [[chimerax]] ===&lt;br /&gt;
=== [[vmd]] ===&lt;br /&gt;
=== [[NAMD]] ===&lt;br /&gt;
&lt;br /&gt;
== [[電子顕微鏡制御]] ==&lt;br /&gt;
　電子顕微鏡制御のためのソフトウェアを開発しています。[[VEM]]は、仮想電子顕微鏡として各種の電子顕微鏡のコマンドを統一するためのシステムです。[[WITs]]は、VEMを通して電子顕微鏡を操作するためのUI(User Interface)です。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[FEIの制御]]===&lt;br /&gt;
&lt;br /&gt;
== [[電子顕微鏡]] ==&lt;br /&gt;
　ここでは電子顕微鏡に関する基礎、FAQ、TIPSをまとめておきます。&lt;br /&gt;
&lt;br /&gt;
=== [[電子銃]]===&lt;br /&gt;
　電子顕微鏡の電子線源である電子銃についての解説です。&lt;br /&gt;
&lt;br /&gt;
=== [[電子レンズ]]===&lt;br /&gt;
　透過電子顕微鏡の光学系、及び、レンズの仕組みに関する解説です。&lt;br /&gt;
&lt;br /&gt;
=== [[透過型電子顕微鏡のコントラスト]]===&lt;br /&gt;
　透過型電子顕微鏡(TEM)がつくるコントラストに関する解説です。&lt;br /&gt;
&lt;br /&gt;
=== [[走査型透過電子顕微鏡のコントラスト]]===&lt;br /&gt;
　走査型透過電子顕微鏡(STEM)がつくるコントラストに関する解説です。&lt;br /&gt;
&lt;br /&gt;
=== [[走査型電子顕微鏡のコントラスト]] ===&lt;br /&gt;
　走査型電子顕微鏡(SEM)がつくるコントラストに関する解説です。&lt;br /&gt;
&lt;br /&gt;
=== [[クライオ電子顕微鏡法]] ===&lt;br /&gt;
　クライオ電子顕微鏡法に関する解説です。&lt;br /&gt;
&lt;br /&gt;
=== [[電子顕微鏡のFAQ]] ===&lt;br /&gt;
　電子顕微鏡に関するよくある質問に対する回答です。&lt;br /&gt;
&lt;br /&gt;
=== [[電子顕微鏡のTIPS]] ===&lt;br /&gt;
　電子顕微鏡を利用する際などのTIPSをまとめることにしました。&lt;br /&gt;
&lt;br /&gt;
== [[ロードマップ|Eosの今後の発展（ロードマップ）について]] ==&lt;br /&gt;
　Eosの今後の開発方針([[ロードマップ]])について述べます。&lt;br /&gt;
&lt;br /&gt;
=== [[ロードマップ]] ===&lt;br /&gt;
　現在、開発はOSDNのチケットシステムを利用しており、チケット駆動型開発になっています。チケットの粒度はさまざまで、現在、いろいろと試しながら、開発環境を構築しています。&lt;br /&gt;
&lt;br /&gt;
=== [[CUDA]]への対応 ===&lt;br /&gt;
　[[EosのCUDAへの対応状況]]を述べます。&lt;br /&gt;
　&lt;br /&gt;
&lt;br /&gt;
== FAQ and TIPS ==&lt;br /&gt;
=== [[FAQ]] ===&lt;br /&gt;
　よくある質問をまとめました。まだまだ不十分ですが、少しずつ増やしていきたいと思います。&lt;br /&gt;
&lt;br /&gt;
=== [[EosのTIPS]] ===&lt;br /&gt;
　よくある画像処理法をまとめてました。まだまだ不十分ですが、少しずつ増やしていきたいと思います。&lt;br /&gt;
&lt;br /&gt;
=== [[Eos関連ソフトウェアのTIPS]] ===&lt;br /&gt;
　Eosに関連するソフトウェアの使い方をまとめています。&lt;br /&gt;
&lt;br /&gt;
=== [[LINUXに関連したソフトウェアのTIPS]] ===&lt;br /&gt;
&lt;br /&gt;
=== [[OSXに関連したソフトウェアのTIPS]] ===&lt;br /&gt;
　ＯＳＸで利用されているソフトウェアについてまとめています。&lt;br /&gt;
&lt;br /&gt;
== 開発にかける思い ==&lt;br /&gt;
　開発当時と比べても非常に多くのソフトウェアが開発され、利用されている。その中で、継続的に開発していく意味はどこにあるのだろうか。[[開発にかける思いByYasunaga]]を少しずつ書き綴っていこう。&lt;br /&gt;
&lt;br /&gt;
== Eos User Group ==&lt;br /&gt;
　Eosを利用する上での情報共有の場を、仮にFacebookの上に作りました。参加されたい方は、facebook上で登録をお願いします。&lt;br /&gt;
&lt;br /&gt;
== '''イメージイラストについて''' ==&lt;br /&gt;
&lt;br /&gt;
現在、Eospediaのイメージイラストを募集中です。&lt;br /&gt;
我こそはという方はEospedia管理者まで御連絡下さい。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Eospedia(WIKI)の使い方・設定に関しては、[http://meta.wikimedia.org/wiki/Main_Page ユーザーズガイド]を参照して下さい。&lt;br /&gt;
&lt;br /&gt;
== Eos関連ツール及びサイト ==&lt;br /&gt;
=== 開発言語 ===&lt;br /&gt;
*[[C]]&lt;br /&gt;
*[[C++]]&lt;br /&gt;
*[[Ruby]]&lt;br /&gt;
*[[Tcl]]&lt;br /&gt;
*[[Tk]]&lt;br /&gt;
&lt;br /&gt;
=== ワークフロー関係(PIONE) ===&lt;br /&gt;
==== ペトリネット ====&lt;br /&gt;
*[[PNML]]&lt;br /&gt;
*[[WoPeD]]&lt;br /&gt;
==== アクション記述 ====&lt;br /&gt;
*[[Markdown]]&lt;br /&gt;
&lt;br /&gt;
==== ログファイル ====&lt;br /&gt;
*[[XES]]:ログファイル形式&lt;br /&gt;
*[[ProM]]:可視化のためのツール&lt;br /&gt;
&lt;br /&gt;
=== ドキュメント作成ツール ===&lt;br /&gt;
*[[Pandoc]]&lt;br /&gt;
*[[html]]&lt;br /&gt;
*[[mediawiki]]&lt;br /&gt;
*[[Eospediaの編集で使用しているツール]]&lt;br /&gt;
&lt;br /&gt;
== エディタ、統合開発環境 ==&lt;br /&gt;
=== [[Visual Studio Code]] ===&lt;br /&gt;
Microsoft主導でオープンソース開発が進められている、クロスプラットフォーム(Windows/macOS/Linux)のプログラミングエディタです。&lt;br /&gt;
&lt;br /&gt;
=== [[Vim]] ===&lt;br /&gt;
言わずと知れた著名なテキストエディタです。非常にとっつきにくいですが、慣れると捗ります。&lt;br /&gt;
&lt;br /&gt;
== その他 ==&lt;br /&gt;
=== [[クライオ電顕備忘録]] ===&lt;br /&gt;
　クライオ電顕関連の備忘録です。まとまり次第他の項目に順次移したりします。&lt;br /&gt;
&lt;br /&gt;
=== [[MicroED]] ===&lt;br /&gt;
MicroED(Micro crystal Electron Diffraction:微結晶電子線回折)に関する情報を書き残していきます。&lt;br /&gt;
&lt;br /&gt;
=== [[リモートワーク推進]] ===&lt;br /&gt;
リモートワーク推進のためのツール関連について書き残していきます。&lt;br /&gt;
&lt;br /&gt;
=== [[Python]] ===&lt;br /&gt;
Python関係について書き残していきます。&lt;br /&gt;
&lt;br /&gt;
=== [[Linux関連]] ===&lt;br /&gt;
Linux関連について書き残していきます。&lt;br /&gt;
&lt;br /&gt;
=== [[EMAN2関連]] ===&lt;br /&gt;
EMAN2関連について書き残していきます。&lt;br /&gt;
&lt;br /&gt;
=== [[Moodle関連]] ===&lt;br /&gt;
Moodle関連について整理しています。&lt;br /&gt;
&lt;br /&gt;
=== [[計算機利用ことはじめ]] ===&lt;br /&gt;
研究室で初めて計算機を使う方へ向けたお役立ち情報を書いていきます。&lt;br /&gt;
&lt;br /&gt;
=== [[単粒子解析ことはじめ]] ===&lt;br /&gt;
研究室で初めて単粒子解析をする方へ向けたお役立ち情報。&lt;br /&gt;
&lt;br /&gt;
=== [[クライオ電顕ことはじめ]] ===&lt;br /&gt;
研究室でクライオ電顕観察に挑戦する方へ向けて。&lt;br /&gt;
&lt;br /&gt;
=== [[Docker関連]] ===&lt;br /&gt;
Dockerを利用して研究、開発の環境を構築する方法を書いていきます。&lt;br /&gt;
&lt;br /&gt;
=== [[EMPIAR]] ===&lt;br /&gt;
電顕画像データベースである[[EMPIAR]]について&lt;br /&gt;
&lt;br /&gt;
=== [[XML Schema]] ===&lt;br /&gt;
XMLのデータ構造を定義するための言語であるXML Schema(スキーマ)について&lt;br /&gt;
&lt;br /&gt;
=== [[Git]] ===&lt;br /&gt;
&lt;br /&gt;
=== [[研究お役立ちツール]] ===&lt;br /&gt;
研究活動をするうえで役に立つと思ったツールを書いておきましょう。&lt;br /&gt;
&lt;br /&gt;
== 外部リンク ==&lt;br /&gt;
=== Eos関連サイト===&lt;br /&gt;
&lt;br /&gt;
* [http://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/ Eospedia.jp]&lt;br /&gt;
* [http://www.yasunaga-lab.bio.kyutech.ac.jp/Eos/ Eospedia.en]&lt;br /&gt;
* [http://sourceforge.jp/projects/eos/ Eos SourceForge]&lt;br /&gt;
&lt;br /&gt;
=== 電子顕微鏡画像処理関連サイト ===&lt;br /&gt;
*[https://www.imagescience.de/em2em.html em2em]:汎用画像フォーマット変換ツール&lt;br /&gt;
* [http://en.wikibooks.org/wiki/Software_Tools_For_Molecular_Microscopy Software Tools For Molecular Microscopy]&lt;br /&gt;
* [http://emdatabank.org/emsoftware.html EM Software on EMDataBank]&lt;br /&gt;
&lt;br /&gt;
=== 所属関連サイト ===&lt;br /&gt;
* [http://www.yasunaga-lab.bio.kyutech.ac.jp/ 安永研究室]&lt;br /&gt;
* [http://www.bio.kyutech.ac.jp/ 生命情報工学科]&lt;br /&gt;
* [http://www.iizuka.kyutech.ac.jp/ 情報工学部／情報工学府]&lt;br /&gt;
* [http://www.kyutech.ac.jp/ 九州工業大学]&lt;br /&gt;
&lt;br /&gt;
== メディアウィキの始め方 ==&lt;br /&gt;
* [[testpage]] : メディアウィキのテスト頁&lt;br /&gt;
* [http://www.mediawiki.org/wiki/Manual:Configuration_settings/ja 設定一覧]&lt;br /&gt;
* [http://www.mediawiki.org/wiki/Manual:FAQ/ja MediaWiki FAQ]&lt;br /&gt;
* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki リリース情報メーリングリスト]&lt;/div&gt;</summary>
		<author><name>Kttn</name></author>	</entry>

	<entry>
		<id>https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/%E3%83%A1%E3%82%A4%E3%83%B3%E3%83%9A%E3%83%BC%E3%82%B8</id>
		<title>メインページ</title>
		<link rel="alternate" type="text/html" href="https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/%E3%83%A1%E3%82%A4%E3%83%B3%E3%83%9A%E3%83%BC%E3%82%B8"/>
				<updated>2020-11-19T10:43:37Z</updated>
		
		<summary type="html">&lt;p&gt;Kttn: /* その他 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== '''Eospediaにようこそ''' ==&lt;br /&gt;
&lt;br /&gt;
2010年11月05日に、研究室内にEospediaクローズドβ版の運営を開始しました。&amp;lt;br&amp;gt;&lt;br /&gt;
2012年８月に、こちらが電子顕微鏡画像処理システムEosのホームページの本家となるように、オープンにしました。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Eos]]のコマンド説明やその中のアルゴリズムについてなど、幅広い知識を集約できればと思います。また、2012年より開発を開始した[[PIONE]]、2013年度より開発を開始した[[VEM/WITs]]についても同様にこちらでまとめていきます。&amp;lt;br&amp;gt;&lt;br /&gt;
それに加えて、電子顕微鏡画像処理を含む、各種画像処理の基本を学ぶことができるサイトとして運営したいと考えています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Eos]]は、[https://sourceforge.jp/projects/eos/ Eos@sourceforge]上で、[[PIONE]]は、[https://github.com/pione PIONE@github]で開発を進めています。それらをまとめた情報はこちらで展開したいと思います。将来は、大学から離れた方が良いかと考えています。それぞれ開発や利用に興味があるかたはそれぞれのサイトも覗いてみて下さい。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
wikiは「間違いをいかに防ぐか」ではなく、「いかに修正するか」が哲学ですので、&lt;br /&gt;
間違いを恐れず(もちろんデタラメは論外)皆さんの知識とノウハウを自由に書いて頂ければ幸いです。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
只今ホームページに公開していたEosマニュアル(日本語版も含む)の転載作業を進めています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
ちなみに、[http://www.yasunaga-lab.bio.kyutech.ac.jp/Eos/ 英語版]もあります。現在は、日本語版のほうが充実しています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
また、Eosに関しては、[http://sourceforge.jp/projects/eos/lists/ メーリングリスト]及び[http://sourceforge.jp/projects/eos/forums/ フォーラム]があります。&amp;lt;br&amp;gt;&lt;br /&gt;
Eosの使い方を知りたい方は：eos-users@&amp;lt;br&amp;gt;&lt;br /&gt;
Eosでの開発にご興味のある方は：eos-developers@&amp;lt;br&amp;gt;&lt;br /&gt;
Eosのドキュメント作成のお手伝いを頂ける方は：eos-document@&amp;lt;br&amp;gt;&lt;br /&gt;
にて、是非ともご協力下さい。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
また、facebook上で、Eos User Group[https://www.facebook.com/EosUserGroup]を開設しました。こちらからも発信していくことにします。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
詳細は,安永[mailto:yasunaga@bio.kyutech.ac.jp]までご連絡下さい。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 開発しているシステムの全体像（Eos/PIONE/Zephyr &amp;amp; WITs/VEM) ==&lt;br /&gt;
　現在、電子顕微鏡画像取得・処理・分析のための一連のワークフロー全体を総括するソリューションとして、Eos/PIONE/Zephyr &amp;amp; WITs/VEMとよぶシステムを作っています。システム全体の名前もつけたほうがよい位、Systems of System といった様相になってきています。個々に、当該システムの概要とその目指す姿をまとめておきたいと思います。&lt;br /&gt;
&lt;br /&gt;
　下記のページにまとめておきます。&lt;br /&gt;
[[Eos/PIONE/Zephyr/WITs/VEM システム]]&lt;br /&gt;
&lt;br /&gt;
== '''Eosビギナーズガイド''' ==&lt;br /&gt;
&lt;br /&gt;
=== [[Eos|Eosとは？]] ===&lt;br /&gt;
　Eosとはなにかについて述べます。&lt;br /&gt;
=== [[コマンド|Eosのコマンドとは？]] ===&lt;br /&gt;
　Eosにおけるコマンドについて述べます。&lt;br /&gt;
=== [[Makefile|Eosはどうやって使うの？]] ===&lt;br /&gt;
　Eosにおける[[make]]を用いたコマンドの統合方法について述べます。&lt;br /&gt;
=== [[コマンド一覧|Eosのコマンド一覧表]] ===&lt;br /&gt;
　Eosが提供するコマンドの一覧を示します。&lt;br /&gt;
=== [[機能別コマンド一覧|Eosの機能別コマンド一覧表]] ===&lt;br /&gt;
　Eosが提供するコマンドの機能別一覧を示します。&lt;br /&gt;
&lt;br /&gt;
== Eos/PIONEのインストール方法 ==&lt;br /&gt;
===[[必要な環境|Eosの必要な環境]]===&lt;br /&gt;
&lt;br /&gt;
=== [[ダウンロード|Eosのダウンロード(インストール方法)]] ===&lt;br /&gt;
　Eosのダウンロード方法について述べます。利用するだけであれば、ダウンロードだけで利用することができます。共同開発を進めたい方、機能の要望がある方は、現在、EosはOSDN(旧：SourceForge)にて開発を進めています。是非、ご一緒して下さい。&lt;br /&gt;
&lt;br /&gt;
=== [[インストール方法|Eosのインストール方法（開発・再構築）]] ===&lt;br /&gt;
　Eosのインストール方法について述べます。ここでは、ダウンロードしたファイルから再構築する方法や自分自身が開発したソースコードを運用する方法を述べています。&lt;br /&gt;
&lt;br /&gt;
=== [[PIONEのインストール方法]]===&lt;br /&gt;
　makeに替わる分散プロセス処理プラットフォーム(PIONE)のインストール方法を示します。現在、PIONEはgithubにて開発を進めています。&lt;br /&gt;
&lt;br /&gt;
== '''Eosリファレンス''' ==&lt;br /&gt;
&lt;br /&gt;
=== [[統合コマンド|Eosの提供する統合コマンド]] ===&lt;br /&gt;
　Eosが提供する統合コマンドについて述べます。&lt;br /&gt;
&lt;br /&gt;
=== 統合コマンド：[[PIONE]]===&lt;br /&gt;
　Eosが分散環境、クラウド環境に対応した統合環境として提供するPIONEについて述べます。インストールに関しては[[PIONEのインストール]]を、ブラウザ操作に関しては[[PIONEの起動方法]]や[[PIONE Webclientチュートリアル]]を、[[PIONE定義書]]の作り方や実行方法については[[PIONEチュートリアル]]や[[PIONEチュートリアル-PNML]]を、ログの確認方法は[[PIONEチュートリアル-XES]]を、パッケージの作り方は[[PIONEチュートリアル-package]]を、コマンドの一覧は[[PIONEコマンド一覧]]または[[機能別PIONEコマンド一覧]]を、メソッドの一覧などは[[PIONEの式]]を、その他TIPSなどは[[PIONEのTIPS]]をご覧下さい。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 電子顕微鏡制御統合環境(WITs/VEM) ===&lt;br /&gt;
&lt;br /&gt;
==== 相関顕微鏡のためのシステム ====&lt;br /&gt;
　同一視野の撮影のためのシステムの提供を進めています．[[SerialEM]]に対応する環境として，電子顕微鏡を仮想化するための[[VEM]]，および，[[VEM]]と通信して，電子顕微鏡を制御するための[[WITs]]というシステムに大きく分けて開発を進めています．&lt;br /&gt;
&lt;br /&gt;
下記に[[WITs]]としてのアプリケーションのリストを示します．&lt;br /&gt;
&lt;br /&gt;
[[WITs-CLEM]]: 相関顕微鏡向けのシステムになります．&lt;br /&gt;
&lt;br /&gt;
== '''Eos チュートリアル'''　==&lt;br /&gt;
=== 環境の設定　===&lt;br /&gt;
最初にEosのインストール方法を簡単に説明します。詳細は、[[インストール方法|Eosのインストール方法の詳細]]をご覧下さい。&lt;br /&gt;
&lt;br /&gt;
* [[Eosのインストール|Eosのインストール方法]]&lt;br /&gt;
&lt;br /&gt;
=== Eosでのコマンドの取り扱い　===&lt;br /&gt;
Eosのコマンドの簡単な使い方を説明します。詳細は、[[コマンド|コマンドの詳細]]をご覧下さい。Eosでは、基本はCUIを使ったコマンドの実行により画像処理を進めます。その結果は、ファイルとして保存され、その内容を確認することが出来ます。&lt;br /&gt;
&lt;br /&gt;
* [[Eosのコマンド|Eosのコマンド]]&lt;br /&gt;
&lt;br /&gt;
=== Eosでの画像の取り扱い　===&lt;br /&gt;
Eosで取り扱うことのできる[[画像フォーマット]]と一般的な画像フォーマットからの変換方法を示します。&lt;br /&gt;
* [[画像フォーマット|画像フォーマット]]&lt;br /&gt;
* [[画像フォーマット変換|画像フォーマットの変換]]&lt;br /&gt;
&lt;br /&gt;
=== Eosを使った簡単な画像処理　===&lt;br /&gt;
Eosを使った簡単な画像処理を実行してもらいます。&lt;br /&gt;
* [[簡単な画像処理|簡単な２次元画像処理]]&lt;br /&gt;
&lt;br /&gt;
=== [[チュートリアル一覧]] ===&lt;br /&gt;
ここには、[[Small Tools]]や様々な[[画像処理]]で使用する[[Makefile]]や[[PIONE]]の一覧があります。&lt;br /&gt;
&lt;br /&gt;
=== CTF画像補正　===&lt;br /&gt;
電子顕微鏡画像では、その撮影方法に由来して、コントラストが大きく変調を受けています。ここでは、その画像のコントラストの変調を補正する方法を示します。&lt;br /&gt;
* [[CTF補正|CTFの補正]]&lt;br /&gt;
&lt;br /&gt;
=== 単粒子解析の基礎　===&lt;br /&gt;
　ここでは、単粒子解析の基礎を行います。実際の単粒子解析は、粒子の形やその対称性などを使って探索方法や3次元再構成法を切り替えることができます。&lt;br /&gt;
&lt;br /&gt;
==== [[単粒子解析]]の概要 ====&lt;br /&gt;
　単粒子解析の概要を示します。&lt;br /&gt;
&lt;br /&gt;
==== [[粒子抽出|粒子の抽出]] ====&lt;br /&gt;
　まず、単粒子を抽出します。ここでは、手動で切り出す方法を示します。自動で切り出す方法も各種提案されています。&lt;br /&gt;
&lt;br /&gt;
==== [[２次元画像の分類|２次元画像の分類]] ====&lt;br /&gt;
　２次元画像を分類して、ＳＮ比を上げます。&lt;br /&gt;
&lt;br /&gt;
==== [[参照付投影角度決定|参照像があるときの投影角の決定方法]] ====&lt;br /&gt;
　参照像があるときの投影角の決定方法を説明します。参照像としては、単なる球や楕円体などとすることもあり得ます。参照像がない場合の構造解析法も別途存在しています。&lt;br /&gt;
&lt;br /&gt;
==== [[参照無投影角度決定|参照像がないときの投影角の決定方法]] ====&lt;br /&gt;
　参照画像がないときの投影角の決定方法を示しています。[[コモンライン]]をもちいた[[コモンライン探索]]という方法が一般的です。ただノイズに弱く問題が生じる場合があります。&lt;br /&gt;
&lt;br /&gt;
==== [[３次元再構成・逆投影|３次元再構成・逆投影法]] ====&lt;br /&gt;
　3次元再構成自身を解説します。&lt;br /&gt;
&lt;br /&gt;
==== [[らせん対称をもつ粒子の３次元再構成法]]====&lt;br /&gt;
　アクチンフィラメントなどのらせん対称性をもつ場合のEosでの解析法を紹介します。&lt;br /&gt;
&lt;br /&gt;
==== [[可視化ツール|可視化ツール]] ====&lt;br /&gt;
　できあがった三次元像を可視化するためのツールを紹介します。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====参考資料  ====&lt;br /&gt;
&lt;br /&gt;
===== [[RELION]] =====&lt;br /&gt;
　単粒子解析法のデファクトスタンダードになりつつある[[RELION]]について、解説を準備することにしました。&lt;br /&gt;
少しずつ整理していきます。&lt;br /&gt;
&lt;br /&gt;
===== [[Gautomatch]] =====&lt;br /&gt;
 　粒子抽出のためのプログラムのひとつです。&lt;br /&gt;
&lt;br /&gt;
===== [[cryoDRGN]] =====&lt;br /&gt;
　深層ニューラルネットワークを用いた単粒子3D再構成プログラム[[cryoDRGN]]に関するページです。&lt;br /&gt;
&lt;br /&gt;
===== [[Topaz]] =====&lt;br /&gt;
　深層ニューラルネットワークを用いた単粒子ピッキングプログラム[[Topaz]]に関するページです。&lt;br /&gt;
&lt;br /&gt;
===== [[cryoSPARC]] =====&lt;br /&gt;
　優れたUIを持った単粒子解析パッケージ[[cryoSPARC]]に関するページです。&lt;br /&gt;
&lt;br /&gt;
==== 備考 ====&lt;br /&gt;
　上記のチュートリアル・ページは、2012/09/10-11 単粒子解析Workshopでの資料を元に作成したものです。&lt;br /&gt;
今後もこのサイトを充実させ、ワークショップ等で利用していきたいと考えています。&lt;br /&gt;
&lt;br /&gt;
=== [[電子線トモグラフィー]] ===&lt;br /&gt;
　電子線トモグラフィーとは、同一視野の連続傾斜像から、その視野の３次元画像を再構成する方法です。細胞内の構造や構造多型性をもつタンパク質の構造解析に有効な方法です。&lt;br /&gt;
&lt;br /&gt;
==== [[電子線トモグラフィー]]の概要 ====&lt;br /&gt;
　電子線トモグラフィー法は、同一視野の傾斜シリーズ画像のセットから３次元像を再構成する方法です。ここではその概要を述べます。&lt;br /&gt;
&lt;br /&gt;
==== [[画像の補正]] ====&lt;br /&gt;
　傾斜画像では、視野全体がアンダーフォーカスとなるように、通常の電子顕微鏡撮影よりも大きなデフォカース値をとる場合が多いです。その場合、LaB6などの電子銃では第一トーンリングより外側の情報がほとんど無いために、CTF補正等は必要ありませんが、電界放出銃を利用した場合には、場合によっては間違った情報を与える場合があるので注意が必要です。&lt;br /&gt;
&lt;br /&gt;
==== [[ラフ・アラインメント]] ====&lt;br /&gt;
　傾斜画像の中心付近の画像の相関から、それぞれの傾斜画像の大まかな位置を合わせます。&lt;br /&gt;
&lt;br /&gt;
==== [[ファイン・アラインメント]] ====&lt;br /&gt;
　傾斜画像の軸の位置、角度を出来る限り一致させます。&lt;br /&gt;
&lt;br /&gt;
==== [[３次元再構成]] ====&lt;br /&gt;
　２次元画像のセットから３次元画像を再構成します。&lt;br /&gt;
&lt;br /&gt;
==== [[電子線トモグラフィー画像のもつ問題点]] ====&lt;br /&gt;
　全方位からの投影像を得られないために、ミッシングエリアとよばれる情報がない領域があります。そのため、方向依存でのボケを生じます。&lt;br /&gt;
&lt;br /&gt;
==== [[トモグラム画像の解釈]] ====&lt;br /&gt;
　多様な構造を含むため、３次元画像から興味あるセグメントを切り出すなどの作業が必要です。そのための支援ソフトウェアが必要です。&lt;br /&gt;
&lt;br /&gt;
==== [[サブトモグラム画像の平均化]] ====&lt;br /&gt;
　クライオ電子顕微鏡画像からトモグラム画像はノイズが多いため、同等の構造をしたものを平均化する必要があります。&lt;br /&gt;
&lt;br /&gt;
==== 参考資料 ====&lt;br /&gt;
===== [[IMOD/ETomo]]の使い方=====&lt;br /&gt;
　[[IMOD/ETomo]]は、電子線トモグラフィー法やシリアルセクションなどで使われる、デファクトスタンダードともいえる3次元再構成プログラムです。&lt;br /&gt;
&lt;br /&gt;
====== [[eTomoチュートリアル]] ======&lt;br /&gt;
　eTomoのチュートリアルを示しています。&lt;br /&gt;
&lt;br /&gt;
=== 連続２次元画像からの３次元再構成 ===&lt;br /&gt;
　連続切片(Serial Section）や、連続ブロック表面(Serial Block Face)からの３次元再構成のための手順を示したものです。&lt;br /&gt;
&lt;br /&gt;
==== [[SBF-SEMからの３次元再構成]] ====&lt;br /&gt;
&lt;br /&gt;
== Eosにおける開発（開発者向け） ==&lt;br /&gt;
&lt;br /&gt;
　Eosのもうひとつのウリは迅速なプログラムの開発です。その手法について下記に述べます。&lt;br /&gt;
&lt;br /&gt;
=== [[Eosの構造|Eosの構造]] ===&lt;br /&gt;
　Eosの構造(Architecture）について述べます。&lt;br /&gt;
&lt;br /&gt;
=== [[Eosの開発|Eosの開発]]===&lt;br /&gt;
　SourceForgeからクローンを作成し、localで新規ツールなどを開発した後、SourceForgeに登録するまでの流れを示します。&lt;br /&gt;
&lt;br /&gt;
=== [[Eosの開発におけるTIPS]] ===&lt;br /&gt;
　Eos上で開発する際のTIPSをまとめています。&lt;br /&gt;
&lt;br /&gt;
=== [[ツールの開発]] ===&lt;br /&gt;
==== [[ツールの作り方]] ====&lt;br /&gt;
　Eosの上での[[Small Tools]]([[コマンド群]])の作り方について述べます。&lt;br /&gt;
&lt;br /&gt;
==== [[簡単なプログラム例]] ====&lt;br /&gt;
　Eosの上での[[Small Tools]]([[コマンド群]])の簡単なプログラム例について述べます。&lt;br /&gt;
&lt;br /&gt;
=== [[ライブラリ（API）の作り方]]===&lt;br /&gt;
　Eosの上での[[オブジェクト指向型ライブラリ]]（[[API]]）の作り方について述べます。&lt;br /&gt;
&lt;br /&gt;
=== [[ライブラリ(API)一覧]]===&lt;br /&gt;
　Eosの上での[[オブジェクト指向型ライブラリ]]（[[API]]）の一覧です。&lt;br /&gt;
&lt;br /&gt;
=== [[機能別ライブラリ(API)一覧]]===&lt;br /&gt;
　Eosの上での機能別に分類された[[オブジェクト指向型ライブラリ]]（[[API]]）の一覧です。&lt;br /&gt;
&lt;br /&gt;
並列処理のためのライブラリ&lt;br /&gt;
*[[eosCuda]]: CUDA を使うためのライブラリ&lt;br /&gt;
*[[eosPThread]]: pthread を使うためのライブラリ&lt;br /&gt;
&lt;br /&gt;
=== [[統合コマンドの作り方]]===&lt;br /&gt;
　統合コマンドの作り方を示します。&lt;br /&gt;
&lt;br /&gt;
==== [[Makefileによる統合]] ====&lt;br /&gt;
　[[Makefile]]を用いた統合方法について示します。[[Visualmake]]は自動的に簡易型のGUIを提供します。&lt;br /&gt;
&lt;br /&gt;
==== [[PIONEによる統合]]  ====&lt;br /&gt;
　分散環境（クラウド環境）に対応したプロセス定義書[[PIONE]]を用いた統合方法について示します。&lt;br /&gt;
&lt;br /&gt;
==== [[PIONEチュートリアル]] ====&lt;br /&gt;
　[[PIONE]]の使い方を示したチュートリアルです。&lt;br /&gt;
&lt;br /&gt;
==== [[PIONEチュートリアル-PNML]]====&lt;br /&gt;
　[[PNML]]を用いたPIONE定義書の設計方法を示しています．&lt;br /&gt;
&lt;br /&gt;
==== [[PIONEチュートリアル-XES]]====&lt;br /&gt;
　ログファイルを[[XES]]形式に変換し、[[ProM]]を利用して処理結果を確認する方法を示しています。&lt;br /&gt;
&lt;br /&gt;
==== [[PIONEチュートリアル-package]]====&lt;br /&gt;
　[[PIONE定義書]]などをひとつにまとめたパッケージを作成する方法を示しています。&lt;br /&gt;
&lt;br /&gt;
==== [[bashによる統合]] ====&lt;br /&gt;
　bashなどのスクリプト言語による統合方法について示します。&lt;br /&gt;
&lt;br /&gt;
==== [[統合コマンドによる統合]] ====&lt;br /&gt;
　[[Display2]], [[smolet]], [[Eos]]などのTcl/Tk型の統合コマンドによる統合, [[ctfDisplay]]等のRuby型の統合コマンドによる統合，[[molvie]]などのＣ言語型の統合コマンドによる統合、などの各種方法について示します。&lt;br /&gt;
&lt;br /&gt;
=== [[並列処理による高速化]] ===&lt;br /&gt;
　Eosでは、makeを使った単一ホストでのプロセスレベルでの並列処理、PIONEを使った分散環境におけるプロセスレベルの並列処理に加えて、pthread/GPGPUを用いたthreadレベルでの高速化も試行しています。すべてのコードが対応している訳ではありませんが、随時、対応を進めています。&lt;br /&gt;
&lt;br /&gt;
===== [[eosPThread]] =====&lt;br /&gt;
&lt;br /&gt;
===== [[eosCuda]] =====&lt;br /&gt;
&lt;br /&gt;
=== [[よく使うシェルコマンド]] ===&lt;br /&gt;
　ここでは[[コマンド]]、[[Makefile]]、[[PIONE]]などの作成や実行においてよく使うシェルコマンドを簡易的にリストアップしています。&lt;br /&gt;
&lt;br /&gt;
== [[画像処理]] ==&lt;br /&gt;
=== [[画像処理一般]] ===&lt;br /&gt;
　ここでは画像処理一般に関する話をまとめています。&lt;br /&gt;
&lt;br /&gt;
==== [[簡単な画像処理]]====&lt;br /&gt;
　Eosを使った簡単な画像処理に関するチュートリアルが掲載されています。&lt;br /&gt;
&lt;br /&gt;
==== [[画像の入力]]と[[レンズ]] ====&lt;br /&gt;
　コンピュータを使って画像処理を行う前に、画像がデジタル化される入力装置のことを気にしておく必要があります。&lt;br /&gt;
&lt;br /&gt;
==== [[CTF]],[[PSF]]と[[MTF]]====&lt;br /&gt;
　真に得たい画像をf(x,y)で表現した場合に、[[画像の入力]]方法や[[レンズ]]の性能などによりどうしても画像が劣化します。&lt;br /&gt;
&lt;br /&gt;
==== [[標本化]] ====&lt;br /&gt;
　アナログ画像をデジタル画像にするためには、空間を刻み、離散化することが重要です。このステップを標本化といいます。&lt;br /&gt;
&lt;br /&gt;
==== [[量子化]] ====&lt;br /&gt;
　デジタル画像処理では、アナログである濃度値（光学密度）をあるビット数内で表現する量子化（ＡＤ変換）という操作が最初に必要です。&lt;br /&gt;
&lt;br /&gt;
==== [[ノイズ除去]] ====&lt;br /&gt;
　ノイズが非常に多い画像を取り扱うためには、ノイズの性質をよく知ることが重要です。&lt;br /&gt;
&lt;br /&gt;
===== [[平滑化]] =====&lt;br /&gt;
　画像のもつノイズを取り除くことを主たる目的として実施する画像処理方法です。ノイズの性質をよく理解することで、適切なノイズ除去が可能になります。&lt;br /&gt;
&lt;br /&gt;
==== [[エッジ検出]] ====&lt;br /&gt;
　対象物の形を理解するために重要なステップですが、とても難しいステップでもあります。&lt;br /&gt;
&lt;br /&gt;
==== [[２値画像処理]] ====&lt;br /&gt;
　シグナルと背景の切り分けや、代表点や骨格の抽出など、画像処理や解析のスタートとなる処理方法です。&lt;br /&gt;
&lt;br /&gt;
==== [[フーリエ空間]]を利用した画像処理 ====&lt;br /&gt;
&lt;br /&gt;
==== 実空間の[[カーネル]]を用いた画像処理 ====&lt;br /&gt;
&lt;br /&gt;
==== [[マスマティカル・モルフォロジー]]を使った画像処理 ====&lt;br /&gt;
&lt;br /&gt;
=== [[電子顕微鏡画像処理]] ===&lt;br /&gt;
　電子顕微鏡画像処理に関する話をまとめています。&lt;br /&gt;
&lt;br /&gt;
==== [[モンタージュ]]、[[パノラマ]]画像 ====&lt;br /&gt;
　異なる領域を撮影した複数の画像（ただし、その一部は重なっている画像のセット）を組み合わせて、広領域の画像をつくる方法です。&lt;br /&gt;
&lt;br /&gt;
==== [[CTF補正]] ====&lt;br /&gt;
　電子顕微鏡の画像は、原理的に、画像変調を受けています。その画像変調を補正する為の画像処理です。&lt;br /&gt;
&lt;br /&gt;
==== [[３次元画像の位置合わせ]] ====&lt;br /&gt;
　３次元画像同士を平均し、雑音をとるための手法です。&lt;br /&gt;
&lt;br /&gt;
==== [[シリアル画像の位置合わせ]] ====&lt;br /&gt;
　連続切片の画像同士の位置を合わせることで、三次元像を再構成する手法です。&lt;br /&gt;
&lt;br /&gt;
=== [[３次元再構成法]] ===&lt;br /&gt;
　３次元再構成法とは、２次元の画像から３次元の画像を再構成する技術です&lt;br /&gt;
&lt;br /&gt;
==== [[中央断面定理]]====&lt;br /&gt;
　投影像からなぜ、内部の構造がわかるのか、それを支えているのがこの中央断面定理です．&lt;br /&gt;
&lt;br /&gt;
==== [[フーリエ法]]====&lt;br /&gt;
==== [[逆投影法]]====&lt;br /&gt;
==== [[SIRT]]====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== [[3Dモデル関連]] ==&lt;br /&gt;
=== [[chimera]] ===&lt;br /&gt;
　ボリュームデータやＰＤＢデータなどを可視化表示するためのソフトウェアです。&lt;br /&gt;
=== [[chimerax]] ===&lt;br /&gt;
=== [[vmd]] ===&lt;br /&gt;
=== [[NAMD]] ===&lt;br /&gt;
&lt;br /&gt;
== [[電子顕微鏡制御]] ==&lt;br /&gt;
　電子顕微鏡制御のためのソフトウェアを開発しています。[[VEM]]は、仮想電子顕微鏡として各種の電子顕微鏡のコマンドを統一するためのシステムです。[[WITs]]は、VEMを通して電子顕微鏡を操作するためのUI(User Interface)です。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[FEIの制御]]===&lt;br /&gt;
&lt;br /&gt;
== [[電子顕微鏡]] ==&lt;br /&gt;
　ここでは電子顕微鏡に関する基礎、FAQ、TIPSをまとめておきます。&lt;br /&gt;
&lt;br /&gt;
=== [[電子銃]]===&lt;br /&gt;
　電子顕微鏡の電子線源である電子銃についての解説です。&lt;br /&gt;
&lt;br /&gt;
=== [[電子レンズ]]===&lt;br /&gt;
　透過電子顕微鏡の光学系、及び、レンズの仕組みに関する解説です。&lt;br /&gt;
&lt;br /&gt;
=== [[透過型電子顕微鏡のコントラスト]]===&lt;br /&gt;
　透過型電子顕微鏡(TEM)がつくるコントラストに関する解説です。&lt;br /&gt;
&lt;br /&gt;
=== [[走査型透過電子顕微鏡のコントラスト]]===&lt;br /&gt;
　走査型透過電子顕微鏡(STEM)がつくるコントラストに関する解説です。&lt;br /&gt;
&lt;br /&gt;
=== [[走査型電子顕微鏡のコントラスト]] ===&lt;br /&gt;
　走査型電子顕微鏡(SEM)がつくるコントラストに関する解説です。&lt;br /&gt;
&lt;br /&gt;
=== [[クライオ電子顕微鏡法]] ===&lt;br /&gt;
　クライオ電子顕微鏡法に関する解説です。&lt;br /&gt;
&lt;br /&gt;
=== [[電子顕微鏡のFAQ]] ===&lt;br /&gt;
　電子顕微鏡に関するよくある質問に対する回答です。&lt;br /&gt;
&lt;br /&gt;
=== [[電子顕微鏡のTIPS]] ===&lt;br /&gt;
　電子顕微鏡を利用する際などのTIPSをまとめることにしました。&lt;br /&gt;
&lt;br /&gt;
== [[ロードマップ|Eosの今後の発展（ロードマップ）について]] ==&lt;br /&gt;
　Eosの今後の開発方針([[ロードマップ]])について述べます。&lt;br /&gt;
&lt;br /&gt;
=== [[ロードマップ]] ===&lt;br /&gt;
　現在、開発はOSDNのチケットシステムを利用しており、チケット駆動型開発になっています。チケットの粒度はさまざまで、現在、いろいろと試しながら、開発環境を構築しています。&lt;br /&gt;
&lt;br /&gt;
=== [[CUDA]]への対応 ===&lt;br /&gt;
　[[EosのCUDAへの対応状況]]を述べます。&lt;br /&gt;
　&lt;br /&gt;
&lt;br /&gt;
== FAQ and TIPS ==&lt;br /&gt;
=== [[FAQ]] ===&lt;br /&gt;
　よくある質問をまとめました。まだまだ不十分ですが、少しずつ増やしていきたいと思います。&lt;br /&gt;
&lt;br /&gt;
=== [[EosのTIPS]] ===&lt;br /&gt;
　よくある画像処理法をまとめてました。まだまだ不十分ですが、少しずつ増やしていきたいと思います。&lt;br /&gt;
&lt;br /&gt;
=== [[Eos関連ソフトウェアのTIPS]] ===&lt;br /&gt;
　Eosに関連するソフトウェアの使い方をまとめています。&lt;br /&gt;
&lt;br /&gt;
=== [[LINUXに関連したソフトウェアのTIPS]] ===&lt;br /&gt;
&lt;br /&gt;
=== [[OSXに関連したソフトウェアのTIPS]] ===&lt;br /&gt;
　ＯＳＸで利用されているソフトウェアについてまとめています。&lt;br /&gt;
&lt;br /&gt;
== 開発にかける思い ==&lt;br /&gt;
　開発当時と比べても非常に多くのソフトウェアが開発され、利用されている。その中で、継続的に開発していく意味はどこにあるのだろうか。[[開発にかける思いByYasunaga]]を少しずつ書き綴っていこう。&lt;br /&gt;
&lt;br /&gt;
== Eos User Group ==&lt;br /&gt;
　Eosを利用する上での情報共有の場を、仮にFacebookの上に作りました。参加されたい方は、facebook上で登録をお願いします。&lt;br /&gt;
&lt;br /&gt;
== '''イメージイラストについて''' ==&lt;br /&gt;
&lt;br /&gt;
現在、Eospediaのイメージイラストを募集中です。&lt;br /&gt;
我こそはという方はEospedia管理者まで御連絡下さい。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Eospedia(WIKI)の使い方・設定に関しては、[http://meta.wikimedia.org/wiki/Main_Page ユーザーズガイド]を参照して下さい。&lt;br /&gt;
&lt;br /&gt;
== Eos関連ツール及びサイト ==&lt;br /&gt;
=== 開発言語 ===&lt;br /&gt;
*[[C]]&lt;br /&gt;
*[[C++]]&lt;br /&gt;
*[[Ruby]]&lt;br /&gt;
*[[Tcl]]&lt;br /&gt;
*[[Tk]]&lt;br /&gt;
&lt;br /&gt;
=== ワークフロー関係(PIONE) ===&lt;br /&gt;
==== ペトリネット ====&lt;br /&gt;
*[[PNML]]&lt;br /&gt;
*[[WoPeD]]&lt;br /&gt;
==== アクション記述 ====&lt;br /&gt;
*[[Markdown]]&lt;br /&gt;
&lt;br /&gt;
==== ログファイル ====&lt;br /&gt;
*[[XES]]:ログファイル形式&lt;br /&gt;
*[[ProM]]:可視化のためのツール&lt;br /&gt;
&lt;br /&gt;
=== ドキュメント作成ツール ===&lt;br /&gt;
*[[Pandoc]]&lt;br /&gt;
*[[html]]&lt;br /&gt;
*[[mediawiki]]&lt;br /&gt;
*[[Eospediaの編集で使用しているツール]]&lt;br /&gt;
&lt;br /&gt;
== エディタ、統合開発環境 ==&lt;br /&gt;
=== [[Visual Studio Code]] ===&lt;br /&gt;
Microsoft主導でオープンソース開発が進められている、クロスプラットフォーム(Windows/macOS/Linux)のプログラミングエディタです。&lt;br /&gt;
&lt;br /&gt;
=== [[Vim]] ===&lt;br /&gt;
言わずと知れた著名なテキストエディタです。非常にとっつきにくいですが、慣れると捗ります。&lt;br /&gt;
&lt;br /&gt;
== その他 ==&lt;br /&gt;
=== [[クライオ電顕備忘録]] ===&lt;br /&gt;
　クライオ電顕関連の備忘録です。まとまり次第他の項目に順次移したりします。&lt;br /&gt;
&lt;br /&gt;
=== [[MicroED]] ===&lt;br /&gt;
MicroED(Micro crystal Electron Diffraction:微結晶電子線回折)に関する情報を書き残していきます。&lt;br /&gt;
&lt;br /&gt;
=== [[リモートワーク推進]] ===&lt;br /&gt;
リモートワーク推進のためのツール関連について書き残していきます。&lt;br /&gt;
&lt;br /&gt;
=== [[Python]] ===&lt;br /&gt;
Python関係について書き残していきます。&lt;br /&gt;
&lt;br /&gt;
=== [[Linux関連]] ===&lt;br /&gt;
Linux関連について書き残していきます。&lt;br /&gt;
&lt;br /&gt;
=== [[EMAN2関連]] ===&lt;br /&gt;
EMAN2関連について書き残していきます。&lt;br /&gt;
&lt;br /&gt;
=== [[Moodle関連]] ===&lt;br /&gt;
Moodle関連について整理しています。&lt;br /&gt;
&lt;br /&gt;
=== [[計算機利用ことはじめ]] ===&lt;br /&gt;
研究室で初めて計算機を使う方へ向けたお役立ち情報を書いていきます。&lt;br /&gt;
&lt;br /&gt;
=== [[単粒子解析ことはじめ]] ===&lt;br /&gt;
研究室で初めて単粒子解析をする方へ向けたお役立ち情報。&lt;br /&gt;
&lt;br /&gt;
=== [[クライオ電顕ことはじめ]] ===&lt;br /&gt;
研究室でクライオ電顕観察に挑戦する方へ向けて。&lt;br /&gt;
&lt;br /&gt;
=== [[Docker関連]] ===&lt;br /&gt;
Dockerを利用して研究、開発の環境を構築する方法を書いていきます。&lt;br /&gt;
&lt;br /&gt;
=== [[EMPIAR]] ===&lt;br /&gt;
電顕画像データベースである[[EMPIAR]]について&lt;br /&gt;
&lt;br /&gt;
=== [[XML Schema]] ===&lt;br /&gt;
XMLのデータ構造を定義するための言語であるXML Schema(スキーマ)について&lt;br /&gt;
&lt;br /&gt;
=== [[Git]]] ===&lt;br /&gt;
&lt;br /&gt;
=== [[研究お役立ちツール]] ===&lt;br /&gt;
研究活動をするうえで役に立つと思ったツールを書いておきましょう。&lt;br /&gt;
&lt;br /&gt;
== 外部リンク ==&lt;br /&gt;
=== Eos関連サイト===&lt;br /&gt;
&lt;br /&gt;
* [http://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/ Eospedia.jp]&lt;br /&gt;
* [http://www.yasunaga-lab.bio.kyutech.ac.jp/Eos/ Eospedia.en]&lt;br /&gt;
* [http://sourceforge.jp/projects/eos/ Eos SourceForge]&lt;br /&gt;
&lt;br /&gt;
=== 電子顕微鏡画像処理関連サイト ===&lt;br /&gt;
*[https://www.imagescience.de/em2em.html em2em]:汎用画像フォーマット変換ツール&lt;br /&gt;
* [http://en.wikibooks.org/wiki/Software_Tools_For_Molecular_Microscopy Software Tools For Molecular Microscopy]&lt;br /&gt;
* [http://emdatabank.org/emsoftware.html EM Software on EMDataBank]&lt;br /&gt;
&lt;br /&gt;
=== 所属関連サイト ===&lt;br /&gt;
* [http://www.yasunaga-lab.bio.kyutech.ac.jp/ 安永研究室]&lt;br /&gt;
* [http://www.bio.kyutech.ac.jp/ 生命情報工学科]&lt;br /&gt;
* [http://www.iizuka.kyutech.ac.jp/ 情報工学部／情報工学府]&lt;br /&gt;
* [http://www.kyutech.ac.jp/ 九州工業大学]&lt;br /&gt;
&lt;br /&gt;
== メディアウィキの始め方 ==&lt;br /&gt;
* [[testpage]] : メディアウィキのテスト頁&lt;br /&gt;
* [http://www.mediawiki.org/wiki/Manual:Configuration_settings/ja 設定一覧]&lt;br /&gt;
* [http://www.mediawiki.org/wiki/Manual:FAQ/ja MediaWiki FAQ]&lt;br /&gt;
* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki リリース情報メーリングリスト]&lt;/div&gt;</summary>
		<author><name>Kttn</name></author>	</entry>

	<entry>
		<id>https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/Python_tips</id>
		<title>Python tips</title>
		<link rel="alternate" type="text/html" href="https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/Python_tips"/>
				<updated>2020-11-19T09:46:05Z</updated>
		
		<summary type="html">&lt;p&gt;Kttn: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== argparse ==&lt;br /&gt;
https://docs.python.org/release/3.8.2/library/argparse.html&lt;br /&gt;
=== インスタンス化 ===&lt;br /&gt;
モジュールdocstring書いといてそれをdescriptionにすると良さげ&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
parser = argparse.ArgumentParser(description=__doc__)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== オプション名の書き方と格納先変数名 ===&lt;br /&gt;
https://docs.python.org/release/3.8.2/library/argparse.html#dest&lt;br /&gt;
&lt;br /&gt;
=== 引数個数の指定 ===&lt;br /&gt;
https://docs.python.org/release/3.8.2/library/argparse.html#nargs&lt;br /&gt;
&lt;br /&gt;
=== ヘルプメッセージにデフォルト値を表示する ===&lt;br /&gt;
https://docs.python.org/release/3.8.2/library/argparse.html#argparse.ArgumentDefaultsHelpFormatter&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
parser = argparse.ArgumentParser(formatter_class=argparse.ArgumentDefaultsHelpFormatter)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 具体例1 ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def parse_args():&lt;br /&gt;
    parser = argparse.ArgumentParser(&lt;br /&gt;
        formatter_class=argparse.ArgumentDefaultsHelpFormatter,&lt;br /&gt;
        description=__doc__&lt;br /&gt;
    )&lt;br /&gt;
    parser.add_argument('--Z_file', type=str, required=True, help='Pickled file of latent variables.')&lt;br /&gt;
    parser.add_argument('--k_init', type=int, default=2, help='Initial number of clusters in X-Means')&lt;br /&gt;
    parser.add_argument('--k_max', type=int, default=20, help='Max number of clusters in X-Means')&lt;br /&gt;
    parser.add_argument('--criterion', type=str, default='bic', choices=['bic', 'mndl'], help='Splitting criterion. bic: bayesian information criterion, mndl: minimum noiseless description length.')&lt;br /&gt;
    parser.add_argument('--random_state', type=int, default=None, help='Random seed for X-Means initialization (K-Means++)')&lt;br /&gt;
    parser.add_argument('--no_ccore', action='store_true', help='Use python implementation of PyClustering library, instead of C++.')&lt;br /&gt;
    parser.add_argument('--outdir', required=True, help='Output directory.')&lt;br /&gt;
    parser.add_argument('--input_star', type=str, required=True, help='Input star file.')&lt;br /&gt;
    parser.add_argument('--output_star_rootname', type=str, default='cluster', help='Output file rootname for each cluster\'s star file.')&lt;br /&gt;
    parser.add_argument('--output_model', type=str, default='xmeans_model.pkl', help='Output X-Means model file name (pickled).')&lt;br /&gt;
&lt;br /&gt;
    args = parser.parse_args()&lt;br /&gt;
&lt;br /&gt;
    logger.info('##### Command #####\n\t' + ' '.join(sys.argv))&lt;br /&gt;
    args_print_str = '##### Input parameters #####\n'&lt;br /&gt;
    for opt, val in vars(args).items():&lt;br /&gt;
        args_print_str += '\t{} : {}\n'.format(opt, val)&lt;br /&gt;
    return args&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== logging ==&lt;br /&gt;
https://docs.python.org/release/3.8.2/library/logging.html&lt;br /&gt;
=== ロガー生成スニペット ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
logging_fmt = logging.Formatter(&lt;br /&gt;
    '\n[%(asctime)s - %(name)s - %(levelname)s] %(message)s')&lt;br /&gt;
logger = logging.getLogger(__name__)&lt;br /&gt;
logger.setLevel(logging.DEBUG)&lt;br /&gt;
stream_handler = logging.StreamHandler()&lt;br /&gt;
stream_handler.setFormatter(logging_fmt)&lt;br /&gt;
logger.addHandler(stream_handler)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def set_logger(log_file, is_debug):&lt;br /&gt;
    if log_file is not None:&lt;br /&gt;
        log_file_dir = os.path.dirname(log_file)&lt;br /&gt;
        if log_file_dir:&lt;br /&gt;
            if not os.path.exists(log_file_dir):&lt;br /&gt;
                logger.debug('Creating log file directory...')&lt;br /&gt;
                os.makedirs(log_file_dir)&lt;br /&gt;
            elif not os.path.isdir(log_file_dir):&lt;br /&gt;
                logger.error('{} is not a directory.'.format(log_file_dir))&lt;br /&gt;
                sys.exit(1)&lt;br /&gt;
        file_handler = logging.FileHandler(log_file, mode='w')&lt;br /&gt;
        file_handler.setFormatter(logging_fmt)&lt;br /&gt;
        logger.addHandler(file_handler)&lt;br /&gt;
&lt;br /&gt;
    if not is_debug:&lt;br /&gt;
        logger.setLevel(logging.INFO)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== serialize ==&lt;br /&gt;
=== pickle ===&lt;br /&gt;
==== 保存 ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
pickle.dump(\&lt;br /&gt;
    object_to_be_serialized,&lt;br /&gt;
    open(outfile, 'wb'),&lt;br /&gt;
    protocol=4)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 読み込み ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
with open(pickled_file, 'rb') as f:&lt;br /&gt;
    pickled_content = pickle.load(f)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== subprocess ==&lt;br /&gt;
=== run - 同期型 ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ret = subprocess.run(&amp;quot;シェルコマンド&amp;quot;, text=True, shell=True, capture_output=True)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
投げたシェルコマンドが終わるまで呼び出し側コードはブロックされる。&lt;br /&gt;
&lt;br /&gt;
retが持つ属性は ret.args, ret.returncode, ret.stdout, ret.stderr。&lt;br /&gt;
&lt;br /&gt;
=== Popen - 非同期型 ===&lt;br /&gt;
* 参考&lt;br /&gt;
** https://qiita.com/HidKamiya/items/e192a55371a2961ca8a4&lt;br /&gt;
** https://qiita.com/megmogmog1965/items/5f95b35539ed6b3cfa17&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
p = subprocess.Popen(&amp;quot;シェルコマンド&amp;quot;, shell=True, text=True, stderr=subprocess.STDOUT, stdout=subprocess.PIPE)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Popenはコマンド投げっぱなしで、呼び出し側コードは遠慮なく先へ進む。&lt;br /&gt;
&lt;br /&gt;
処理の終了 (p.poll() is not None)を待ちつつ、出力をリアルタイム表示するには、例えば以下の様にする。&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
while True:&lt;br /&gt;
    if p.poll() is not None:&lt;br /&gt;
        break&lt;br /&gt;
    line = p.stdout.readline()&lt;br /&gt;
    if line is not None:&lt;br /&gt;
        print(line, end='')&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== datetime ==&lt;br /&gt;
* datetimeはモジュール名、datetime.datetimeはdatetimeモジュールのdatetimeクラス&lt;br /&gt;
=== タイムスタンプ文字列生成 ===&lt;br /&gt;
20201119-093428 などのフォーマットで年月日-時刻の文字列を生成するには、&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
import datetime&lt;br /&gt;
datetime.datetime.now().strftime('%Y%m%d-%H%M%S')&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
nowはクラスメソッドで、現在時刻を持ったインスタンスを生成する。&lt;br /&gt;
&lt;br /&gt;
== build-in ==&lt;br /&gt;
=== print ===&lt;br /&gt;
==== 改行無しで表示 ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
print('hogefuga', end='')&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Kttn</name></author>	</entry>

	<entry>
		<id>https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/Docker%E3%83%88%E3%83%A9%E3%83%96%E3%83%AB%E3%82%B7%E3%83%A5%E3%83%BC%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0</id>
		<title>Dockerトラブルシューティング</title>
		<link rel="alternate" type="text/html" href="https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/Docker%E3%83%88%E3%83%A9%E3%83%96%E3%83%AB%E3%82%B7%E3%83%A5%E3%83%BC%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0"/>
				<updated>2020-11-17T13:32:02Z</updated>
		
		<summary type="html">&lt;p&gt;Kttn: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= '''ホストマシンデバイス関連''' =&lt;br /&gt;
== コンテナ内でノーマルユーザーだとGPUが使えない ==&lt;br /&gt;
===症状===&lt;br /&gt;
rootユーザー&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
(host)$ docker exec -it relion-docker bash&lt;br /&gt;
&lt;br /&gt;
(container)[root@relion-docker softwares]# nvidia-smi&lt;br /&gt;
Sat May 18 09:35:06 2019&lt;br /&gt;
+-----------------------------------------------------------------------------+&lt;br /&gt;
| NVIDIA-SMI 418.74       Driver Version: 418.74       CUDA Version: 10.1     |&lt;br /&gt;
|-------------------------------+----------------------+----------------------+&lt;br /&gt;
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |&lt;br /&gt;
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |&lt;br /&gt;
|===============================+======================+======================|&lt;br /&gt;
|   0  GeForce GTX 1080    Off  | 00000000:05:00.0  On |                  N/A |&lt;br /&gt;
| 29%   44C    P8     7W / 180W |     72MiB /  8119MiB |      0%      Default |&lt;br /&gt;
+-------------------------------+----------------------+----------------------+&lt;br /&gt;
|   1  GeForce GTX 1080    Off  | 00000000:06:00.0 Off |                  N/A |&lt;br /&gt;
| 27%   41C    P8     6W / 180W |      2MiB /  8119MiB |      0%      Default |&lt;br /&gt;
+-------------------------------+----------------------+----------------------+&lt;br /&gt;
|   2  GeForce GTX 1080    Off  | 00000000:09:00.0 Off |                  N/A |&lt;br /&gt;
| 27%   37C    P8     6W / 180W |      2MiB /  8119MiB |      0%      Default |&lt;br /&gt;
+-------------------------------+----------------------+----------------------+&lt;br /&gt;
|   3  GeForce GTX 1080    Off  | 00000000:0A:00.0 Off |                  N/A |&lt;br /&gt;
| 27%   37C    P8     6W / 180W |      2MiB /  8119MiB |      0%      Default |&lt;br /&gt;
+-------------------------------+----------------------+----------------------+&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ノーマルユーザー(Dockerイメージビルド時に作成済みのユーザー)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
(host)$ docker exec -u kttn -it relion-docker bash&lt;br /&gt;
&lt;br /&gt;
(container)[kttn@relion-docker ~]$ nvidia-smi&lt;br /&gt;
Failed to initialize NVML: Insufficient Permissions&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===原因===&lt;br /&gt;
ホストマシンにVirtualGLをインストールしてあり、インストール時の設定でGPUデバイスの所有者グループがvglusersに書き換えられていたため。&lt;br /&gt;
&lt;br /&gt;
===対処===&lt;br /&gt;
コンテナ内で vglusers というグループを作り、ノーマルユーザーをvglusersに追加すれば、GPUデバイスを使えるようになった。&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
(contianer) $ sudo groupadd -g &amp;lt;ホストマシンにおけるvglusersのGID&amp;gt; vglusers&lt;br /&gt;
(contianer) $ sudo usermod -aG vglusers &amp;lt;non-rootユーザーのユーザー名&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
あるいは、ホストマシンでVirtualGLをアンインストールするか。(所有グループがrootに戻るか要確認)&lt;br /&gt;
&lt;br /&gt;
= '''Dockerfile関連''' =&lt;br /&gt;
== CMD [&amp;quot;/usr/sbin/sshd&amp;quot;, &amp;quot;-D&amp;quot;] を入れても外からsshアクセスできない ==&lt;br /&gt;
===症状===&lt;br /&gt;
Dockerfileの最後に&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CMD [&amp;quot;/usr/sbin/sshd&amp;quot;, &amp;quot;-D&amp;quot;]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
を書いて、コンテナを -d オプション付きで立ち上げれば外からsshアクセスできると思ったが、できない。&lt;br /&gt;
&lt;br /&gt;
===原因===&lt;br /&gt;
ビルドしてrunしたコンテナのログを確認すると&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ docker logs upbeat_liskov  # upbeat_liskovはコンテナの名前&lt;br /&gt;
&lt;br /&gt;
Missing privilege separation directory: /var/run/sshd&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/var/run/sshdというディレクトリをあらかじめ作っておかないといけないらしい。&lt;br /&gt;
&lt;br /&gt;
===対処===&lt;br /&gt;
Dockerfileに、sshdのコマンドを走らせる前に&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
RUN mkdir -p /var/run/sshd&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
を書き加えて再ビルドしたら大丈夫になった。&lt;br /&gt;
&lt;br /&gt;
= '''ネットワーク関係''' =&lt;br /&gt;
== マシンを再起動したらswarm(overlayネットワーク)が機能しなくなった ==&lt;br /&gt;
=== 症状 ===&lt;br /&gt;
あるoverlayネットワークに参加しているコンテナがswarmワーカーノード上にあって、計算機の再起動後にdocker startでコンテナ再起動しようとしたところ、以下のようなエラーが出て再起動してくれなかった。&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Error response from daemon: Could not attach to network asuaxn22bff1sq8pqqay2sg64: context deadline exceeded&lt;br /&gt;
Error: failed to start containers: &amp;lt;コンテナ名&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
swarmのマスターノードで docker node ls すると、ワーカーノードのSTATUSが軒並み Down となっていた。&lt;br /&gt;
&lt;br /&gt;
=== 原因 ===&lt;br /&gt;
推測。&lt;br /&gt;
&lt;br /&gt;
swarm通信用のポートはfirewall-cmdで開けるが、--permanentオプションを付けて実行しないと、計算機再起動した際に設定が消えるらしい。上記問題が出た環境は--permanetを付けずにポートを開いていたので、それゆえ再起動した後にポートが閉じてしまってswarm通信ができず、各ノードのSTATUSがDownとなっていたと考えられる。(実際に検証する前にネットワーク設定を消してしまったので検証はできていない) &lt;br /&gt;
&lt;br /&gt;
=== 対処 ===&lt;br /&gt;
推測。&lt;br /&gt;
&lt;br /&gt;
--permanentオプションをつけてfirewall-cmdでポートを改めて開ける。&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;gt; sudo firewall-cmd --zone=public --add-port=2377/tcp --add-port=7946/tcp --add-port=7946/udp --add-port=4789/udp --permanent&lt;br /&gt;
&amp;gt; sudo systemctl restart firewalld.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= '''Dockerデーモンのエラー''' =&lt;br /&gt;
== /var/lib/docker が read-only file system のため操作不能 ==&lt;br /&gt;
=== 症状 ===&lt;br /&gt;
swarmに参加しようとすると、以下エラー&lt;br /&gt;
* Error response from daemon: unlinkat /var/lib/docker/swarm/certificates: read-only file system&lt;br /&gt;
&lt;br /&gt;
コンテナを削除しようとすると、以下エラー&lt;br /&gt;
* Error response from daemon: container 36060bd231466311ebcbbcbe1a44e25d76e37b43f77b76d2b6f284d8bd8ae157: driver &amp;quot;aufs&amp;quot; failed to remove root filesystem: error removing layers dir for aefdacf5ed56d31750ee2b73381bf0aa24afe93f91d15a7a89a2dbda90b5489f: remove /var/lib/docker/aufs/layers/aefdacf5ed56d31750ee2b73381bf0aa24afe93f91d15a7a89a2dbda90b5489f: read-only file system&lt;br /&gt;
&lt;br /&gt;
デーモンを再起動しようとすると、&lt;br /&gt;
* Error response from daemon: container 36060bd231466311ebcbbcbe1a44e25d76e37b43f77b76d2b6f284d8bd8ae157: driver &amp;quot;aufs&amp;quot; failed to remove root filesystem: error removing layers dir for aefdacf5ed56d31750ee2b73381bf0aa24afe93f91d15a7a89a2dbda90b5489f: remove /var/lib/docker/aufs/layers/aefdacf5ed56d31750ee2b73381bf0aa24afe93f91d15a7a89a2dbda90b5489f: read-only file system&lt;br /&gt;
&lt;br /&gt;
しまいにはdocker psすると&lt;br /&gt;
* Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?&lt;br /&gt;
&lt;br /&gt;
=== 原因 ===&lt;br /&gt;
* https://github.com/moby/moby/issues/18010&lt;br /&gt;
&lt;br /&gt;
/var/run/docker.sockを載せているファイルシステムに障害が発生して、OSが保護のためにread-onlyでマウントしなおしたのでは、という議論があり、その線で調べてみた。&lt;br /&gt;
&lt;br /&gt;
実際、rootユーザーでも本来書き込めるはずの場所にファイル作成などができなくなっている。&lt;br /&gt;
&lt;br /&gt;
また、dmesgを確認すると以下のような記述がある。&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[  375.096148] ata5.00: exception Emask 0x0 SAct 0x4 SErr 0x0 action 0x0&lt;br /&gt;
[  375.096195] ata5.00: irq_stat 0x40000008&lt;br /&gt;
[  375.096235] ata5.00: failed command: READ FPDMA QUEUED&lt;br /&gt;
[  375.096279] ata5.00: cmd 60/08:10:28:47:c6/00:00:03:00:00/40 tag 2 ncq 4096 in&lt;br /&gt;
                        res 41/40:08:28:47:c6/00:00:03:00:00/40 Emask 0x409 (media error) &amp;lt;F&amp;gt;&lt;br /&gt;
[  375.096334] ata5.00: status: { DRDY ERR }&lt;br /&gt;
[  375.096374] ata5.00: error: { UNC }&lt;br /&gt;
[  375.096977] ata5.00: configured for UDMA/133&lt;br /&gt;
[  375.096990] sd 4:0:0:0: [sda] tag#2 FAILED Result: hostbyte=DID_OK driverbyte=DRIVER_SENSE&lt;br /&gt;
[  375.096994] sd 4:0:0:0: [sda] tag#2 Sense Key : Medium Error [current] [descriptor] &lt;br /&gt;
[  375.096998] sd 4:0:0:0: [sda] tag#2 Add. Sense: Unrecovered read error - auto reallocate failed&lt;br /&gt;
[  375.097003] sd 4:0:0:0: [sda] tag#2 CDB: Read(10) 28 00 03 c6 47 28 00 00 08 00&lt;br /&gt;
[  375.097006] blk_update_request: I/O error, dev sda, sector 63325992&lt;br /&gt;
[  375.097058] ata5: EH complete&lt;br /&gt;
[  375.097063] EXT4-fs error (device sda1): ext4_find_entry:1456: inode #2081132: comm updatedb.mlocat: reading directory lblock 0&lt;br /&gt;
[  375.267568] Aborting journal on device sda1-8.&lt;br /&gt;
[  375.995157] EXT4-fs error (device sda1): ext4_journal_check_start:56: &lt;br /&gt;
[  375.995165] EXT4-fs (sda1): Remounting filesystem read-only&lt;br /&gt;
[  375.995248] Detected aborted journal&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 対処 ===&lt;br /&gt;
対処中&lt;/div&gt;</summary>
		<author><name>Kttn</name></author>	</entry>

	<entry>
		<id>https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/Docker%E9%96%A2%E9%80%A3</id>
		<title>Docker関連</title>
		<link rel="alternate" type="text/html" href="https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/Docker%E9%96%A2%E9%80%A3"/>
				<updated>2020-11-17T12:27:25Z</updated>
		
		<summary type="html">&lt;p&gt;Kttn: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Dockerを利用して研究、開発の環境を構築する方法を書いていきます。&lt;br /&gt;
&lt;br /&gt;
== 用語の整理 ==&lt;br /&gt;
なかなかに複雑なので用語を整理しておきます。間違っている部分もあるかもしれないので、適宜修正してください。&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:100%&amp;quot;&lt;br /&gt;
|+Docker用語の整理&lt;br /&gt;
! style=&amp;quot;width:10%&amp;quot; | 用語&lt;br /&gt;
! 説明&lt;br /&gt;
|-&lt;br /&gt;
! Docker&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Docker machine&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Docker engine&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
! Docker desktop&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
! Docker CLI&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
! Docker compose&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
! Docker swarm&lt;br /&gt;
| 複数のホストマシン上のDockerをネットワークを介して相互接続する機能。&lt;br /&gt;
|-&lt;br /&gt;
! Kubernetes (K8s)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! NVIDIA Docker&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! NVIDIA Container Toolkit&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Dockerのネットワークについて ==&lt;br /&gt;
1つのホストマシン上のDocker上でのコンテナ間の通信や、複数のホストマシン上のDocker上でのコンテナ間の通信、自分の好みのDockerネットワークを組む方法などについて、公式ドキュメント( https://docs.docker.com/network/ )がある。&lt;br /&gt;
&lt;br /&gt;
== Docker swarm ==&lt;br /&gt;
複数のホストマシン上のDockerをネットワークを介して相互接続する機能。SwarmでDockerのクラスタを作った暁には、overlayと呼ばれるタイプのDockerネットワークを作成し、そのネットワークへ(複数のホストで動作している)コンテナを参加させることで、ホストをまたいでのコンテナ間の通信が可能となる。他にも色々できる。&lt;br /&gt;
&lt;br /&gt;
https://docs.docker.com/network/ で、Networking overview ⇒ Bridge network tutorial ⇒ Overlay networking tutorial と読み進めると、機能やありがたみが分かりやすいのではないかと思う。&lt;br /&gt;
&lt;br /&gt;
== Portainer ==&lt;br /&gt;
DockerのGUI管理ツールです。https://www.portainer.io/&lt;br /&gt;
&lt;br /&gt;
ウェブブラウザでアクセスして管理、確認できます。&lt;br /&gt;
&lt;br /&gt;
== [[Dockerトラブルシューティング]] ==&lt;/div&gt;</summary>
		<author><name>Kttn</name></author>	</entry>

	<entry>
		<id>https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/Docker%E9%96%A2%E9%80%A3</id>
		<title>Docker関連</title>
		<link rel="alternate" type="text/html" href="https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/Docker%E9%96%A2%E9%80%A3"/>
				<updated>2020-11-17T12:15:24Z</updated>
		
		<summary type="html">&lt;p&gt;Kttn: /* swarmに参加できない */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Dockerを利用して研究、開発の環境を構築する方法を書いていきます。&lt;br /&gt;
&lt;br /&gt;
== 用語の整理 ==&lt;br /&gt;
なかなかに複雑なので用語を整理しておきます。間違っている部分もあるかもしれないので、適宜修正してください。&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:100%&amp;quot;&lt;br /&gt;
|+Docker用語の整理&lt;br /&gt;
! style=&amp;quot;width:10%&amp;quot; | 用語&lt;br /&gt;
! 説明&lt;br /&gt;
|-&lt;br /&gt;
! Docker&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Docker machine&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Docker engine&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
! Docker desktop&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
! Docker CLI&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
! Docker compose&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
! Docker swarm&lt;br /&gt;
| 複数のホストマシン上のDockerをネットワークを介して相互接続する機能。&lt;br /&gt;
|-&lt;br /&gt;
! Kubernetes (K8s)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! NVIDIA Docker&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! NVIDIA Container Toolkit&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Dockerのネットワークについて ==&lt;br /&gt;
1つのホストマシン上のDocker上でのコンテナ間の通信や、複数のホストマシン上のDocker上でのコンテナ間の通信、自分の好みのDockerネットワークを組む方法などについて、公式ドキュメント( https://docs.docker.com/network/ )がある。&lt;br /&gt;
&lt;br /&gt;
== Docker swarm ==&lt;br /&gt;
複数のホストマシン上のDockerをネットワークを介して相互接続する機能。SwarmでDockerのクラスタを作った暁には、overlayと呼ばれるタイプのDockerネットワークを作成し、そのネットワークへ(複数のホストで動作している)コンテナを参加させることで、ホストをまたいでのコンテナ間の通信が可能となる。他にも色々できる。&lt;br /&gt;
&lt;br /&gt;
https://docs.docker.com/network/ で、Networking overview ⇒ Bridge network tutorial ⇒ Overlay networking tutorial と読み進めると、機能やありがたみが分かりやすいのではないかと思う。&lt;br /&gt;
&lt;br /&gt;
== Portainer ==&lt;br /&gt;
DockerのGUI管理ツールです。https://www.portainer.io/&lt;br /&gt;
&lt;br /&gt;
ウェブブラウザでアクセスして管理、確認できます。&lt;br /&gt;
&lt;br /&gt;
== トラブルシューティング ==&lt;br /&gt;
=== ネットワーク関係 ===&lt;br /&gt;
==== コンテナのネットワークが回復していないせいでコンテナが再起動できない ====&lt;br /&gt;
計算機を再起動したあと、ユーザー定義で作成したoverlayネットワークが何やらダウンして、復旧できなかった。&lt;br /&gt;
&lt;br /&gt;
で、計算機の停止前にそのoverlayネットワークに参加していたコンテナに対し、計算機の再起動後にdocker startでコンテナ再起動しようとしたところ、以下のようなエラーが出て再起動してくれなかった。&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Error response from daemon: Could not attach to network asuaxn22bff1sq8pqqay2sg64: context deadline exceeded&lt;br /&gt;
Error: failed to start containers: &amp;lt;コンテナ名&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ネットワークを復活させられればstart可能となるのか、そもそも同じネットワークを復活させられるのか、よくわからなかったが、とりあえず以下のようにしてネットワークからコンテナを切り離し、そのうえでコンテナをstartとすれば、立ち上がってくれるようにはなった。(もちろんネットワークからは抜けたまま)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;gt; docker network disconnect &amp;lt;死んでるoverlayネットワークの名前&amp;gt; &amp;lt;コンテナ名&amp;gt;&lt;br /&gt;
&amp;gt; docker start &amp;lt;コンテナ名&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
当該コンテナがどんなネットワークに属しているかは、&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;gt; docker inspect &amp;lt;コンテナ名&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
で、&amp;quot;Networks&amp;quot;を見ればよい。(デフォルトで参加するネットワークは&amp;quot;bridge&amp;quot;で、それ以外を見ればよい)&lt;br /&gt;
&lt;br /&gt;
(追記) 上記はoverlayネットワークがダウンしていたわけではなく、計算機再起動によりswarm通信用のポートが閉じていたためだった。[[DockerでcryoSPARCクラスタ#ホストマシンを再起動した後のクラスタの復旧]]&lt;br /&gt;
&lt;br /&gt;
==== swarmに参加できない ====&lt;br /&gt;
* 症状&lt;br /&gt;
とあるノードにて&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;gt; docker swarm join --token *** 192.168.5.88:2377&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
すると&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Error response from daemon: unlinkat /var/lib/docker/swarm/certificates: read-only file system&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
と出てきてswarmに参加できない&lt;br /&gt;
&lt;br /&gt;
というか色々おかしくて、コンテナの削除もできない&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;gt; docker rm csparc-worker-DL-Box&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* エラーメッセージ&lt;br /&gt;
** Error response from daemon: container 36060bd231466311ebcbbcbe1a44e25d76e37b43f77b76d2b6f284d8bd8ae157: driver &amp;quot;aufs&amp;quot; failed to remove root filesystem: error removing layers dir for aefdacf5ed56d31750ee2b73381bf0aa24afe93f91d15a7a89a2dbda90b5489f: remove /var/lib/docker/aufs/layers/aefdacf5ed56d31750ee2b73381bf0aa24afe93f91d15a7a89a2dbda90b5489f: read-only file system&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
デーモンの再起動もできない&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;gt; sudo systemctl restart docker&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* エラーメッセージ&lt;br /&gt;
** Error response from daemon: container 36060bd231466311ebcbbcbe1a44e25d76e37b43f77b76d2b6f284d8bd8ae157: driver &amp;quot;aufs&amp;quot; failed to remove root filesystem: error removing layers dir for aefdacf5ed56d31750ee2b73381bf0aa24afe93f91d15a7a89a2dbda90b5489f: remove /var/lib/docker/aufs/layers/aefdacf5ed56d31750ee2b73381bf0aa24afe93f91d15a7a89a2dbda90b5489f: read-only file system&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
そして動かなくなった&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;gt; docker ps&lt;br /&gt;
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Kttn</name></author>	</entry>

	<entry>
		<id>https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/Docker%E9%96%A2%E9%80%A3</id>
		<title>Docker関連</title>
		<link rel="alternate" type="text/html" href="https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/Docker%E9%96%A2%E9%80%A3"/>
				<updated>2020-11-17T12:07:04Z</updated>
		
		<summary type="html">&lt;p&gt;Kttn: /* swarmに参加できない */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Dockerを利用して研究、開発の環境を構築する方法を書いていきます。&lt;br /&gt;
&lt;br /&gt;
== 用語の整理 ==&lt;br /&gt;
なかなかに複雑なので用語を整理しておきます。間違っている部分もあるかもしれないので、適宜修正してください。&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:100%&amp;quot;&lt;br /&gt;
|+Docker用語の整理&lt;br /&gt;
! style=&amp;quot;width:10%&amp;quot; | 用語&lt;br /&gt;
! 説明&lt;br /&gt;
|-&lt;br /&gt;
! Docker&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Docker machine&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Docker engine&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
! Docker desktop&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
! Docker CLI&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
! Docker compose&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
! Docker swarm&lt;br /&gt;
| 複数のホストマシン上のDockerをネットワークを介して相互接続する機能。&lt;br /&gt;
|-&lt;br /&gt;
! Kubernetes (K8s)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! NVIDIA Docker&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! NVIDIA Container Toolkit&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Dockerのネットワークについて ==&lt;br /&gt;
1つのホストマシン上のDocker上でのコンテナ間の通信や、複数のホストマシン上のDocker上でのコンテナ間の通信、自分の好みのDockerネットワークを組む方法などについて、公式ドキュメント( https://docs.docker.com/network/ )がある。&lt;br /&gt;
&lt;br /&gt;
== Docker swarm ==&lt;br /&gt;
複数のホストマシン上のDockerをネットワークを介して相互接続する機能。SwarmでDockerのクラスタを作った暁には、overlayと呼ばれるタイプのDockerネットワークを作成し、そのネットワークへ(複数のホストで動作している)コンテナを参加させることで、ホストをまたいでのコンテナ間の通信が可能となる。他にも色々できる。&lt;br /&gt;
&lt;br /&gt;
https://docs.docker.com/network/ で、Networking overview ⇒ Bridge network tutorial ⇒ Overlay networking tutorial と読み進めると、機能やありがたみが分かりやすいのではないかと思う。&lt;br /&gt;
&lt;br /&gt;
== Portainer ==&lt;br /&gt;
DockerのGUI管理ツールです。https://www.portainer.io/&lt;br /&gt;
&lt;br /&gt;
ウェブブラウザでアクセスして管理、確認できます。&lt;br /&gt;
&lt;br /&gt;
== トラブルシューティング ==&lt;br /&gt;
=== ネットワーク関係 ===&lt;br /&gt;
==== コンテナのネットワークが回復していないせいでコンテナが再起動できない ====&lt;br /&gt;
計算機を再起動したあと、ユーザー定義で作成したoverlayネットワークが何やらダウンして、復旧できなかった。&lt;br /&gt;
&lt;br /&gt;
で、計算機の停止前にそのoverlayネットワークに参加していたコンテナに対し、計算機の再起動後にdocker startでコンテナ再起動しようとしたところ、以下のようなエラーが出て再起動してくれなかった。&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Error response from daemon: Could not attach to network asuaxn22bff1sq8pqqay2sg64: context deadline exceeded&lt;br /&gt;
Error: failed to start containers: &amp;lt;コンテナ名&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ネットワークを復活させられればstart可能となるのか、そもそも同じネットワークを復活させられるのか、よくわからなかったが、とりあえず以下のようにしてネットワークからコンテナを切り離し、そのうえでコンテナをstartとすれば、立ち上がってくれるようにはなった。(もちろんネットワークからは抜けたまま)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;gt; docker network disconnect &amp;lt;死んでるoverlayネットワークの名前&amp;gt; &amp;lt;コンテナ名&amp;gt;&lt;br /&gt;
&amp;gt; docker start &amp;lt;コンテナ名&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
当該コンテナがどんなネットワークに属しているかは、&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;gt; docker inspect &amp;lt;コンテナ名&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
で、&amp;quot;Networks&amp;quot;を見ればよい。(デフォルトで参加するネットワークは&amp;quot;bridge&amp;quot;で、それ以外を見ればよい)&lt;br /&gt;
&lt;br /&gt;
(追記) 上記はoverlayネットワークがダウンしていたわけではなく、計算機再起動によりswarm通信用のポートが閉じていたためだった。[[DockerでcryoSPARCクラスタ#ホストマシンを再起動した後のクラスタの復旧]]&lt;br /&gt;
&lt;br /&gt;
==== swarmに参加できない ====&lt;br /&gt;
* 症状&lt;br /&gt;
とあるノードにて&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;gt; docker swarm join --token *** 192.168.5.88:2377&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
すると&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Error response from daemon: unlinkat /var/lib/docker/swarm/certificates: read-only file system&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
と出てきてswarmに参加できない&lt;br /&gt;
&lt;br /&gt;
というか色々おかしくて、コンテナの削除もできない&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;gt; docker rm csparc-worker-DL-Box&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* エラーメッセージ&lt;br /&gt;
** Error response from daemon: container 36060bd231466311ebcbbcbe1a44e25d76e37b43f77b76d2b6f284d8bd8ae157: driver &amp;quot;aufs&amp;quot; failed to remove root filesystem: error removing layers dir for aefdacf5ed56d31750ee2b73381bf0aa24afe93f91d15a7a89a2dbda90b5489f: remove /var/lib/docker/aufs/layers/aefdacf5ed56d31750ee2b73381bf0aa24afe93f91d15a7a89a2dbda90b5489f: read-only file system&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
デーモンの再起動もできない&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;gt; sudo systemctl restart docker&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* エラーメッセージ&lt;br /&gt;
** Error response from daemon: container 36060bd231466311ebcbbcbe1a44e25d76e37b43f77b76d2b6f284d8bd8ae157: driver &amp;quot;aufs&amp;quot; failed to remove root filesystem: error removing layers dir for aefdacf5ed56d31750ee2b73381bf0aa24afe93f91d15a7a89a2dbda90b5489f: remove /var/lib/docker/aufs/layers/aefdacf5ed56d31750ee2b73381bf0aa24afe93f91d15a7a89a2dbda90b5489f: read-only file system&lt;/div&gt;</summary>
		<author><name>Kttn</name></author>	</entry>

	<entry>
		<id>https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/Docker%E9%96%A2%E9%80%A3</id>
		<title>Docker関連</title>
		<link rel="alternate" type="text/html" href="https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/Docker%E9%96%A2%E9%80%A3"/>
				<updated>2020-11-17T11:44:02Z</updated>
		
		<summary type="html">&lt;p&gt;Kttn: /* ネットワーク関係 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Dockerを利用して研究、開発の環境を構築する方法を書いていきます。&lt;br /&gt;
&lt;br /&gt;
== 用語の整理 ==&lt;br /&gt;
なかなかに複雑なので用語を整理しておきます。間違っている部分もあるかもしれないので、適宜修正してください。&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:100%&amp;quot;&lt;br /&gt;
|+Docker用語の整理&lt;br /&gt;
! style=&amp;quot;width:10%&amp;quot; | 用語&lt;br /&gt;
! 説明&lt;br /&gt;
|-&lt;br /&gt;
! Docker&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Docker machine&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Docker engine&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
! Docker desktop&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
! Docker CLI&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
! Docker compose&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
! Docker swarm&lt;br /&gt;
| 複数のホストマシン上のDockerをネットワークを介して相互接続する機能。&lt;br /&gt;
|-&lt;br /&gt;
! Kubernetes (K8s)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! NVIDIA Docker&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! NVIDIA Container Toolkit&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Dockerのネットワークについて ==&lt;br /&gt;
1つのホストマシン上のDocker上でのコンテナ間の通信や、複数のホストマシン上のDocker上でのコンテナ間の通信、自分の好みのDockerネットワークを組む方法などについて、公式ドキュメント( https://docs.docker.com/network/ )がある。&lt;br /&gt;
&lt;br /&gt;
== Docker swarm ==&lt;br /&gt;
複数のホストマシン上のDockerをネットワークを介して相互接続する機能。SwarmでDockerのクラスタを作った暁には、overlayと呼ばれるタイプのDockerネットワークを作成し、そのネットワークへ(複数のホストで動作している)コンテナを参加させることで、ホストをまたいでのコンテナ間の通信が可能となる。他にも色々できる。&lt;br /&gt;
&lt;br /&gt;
https://docs.docker.com/network/ で、Networking overview ⇒ Bridge network tutorial ⇒ Overlay networking tutorial と読み進めると、機能やありがたみが分かりやすいのではないかと思う。&lt;br /&gt;
&lt;br /&gt;
== Portainer ==&lt;br /&gt;
DockerのGUI管理ツールです。https://www.portainer.io/&lt;br /&gt;
&lt;br /&gt;
ウェブブラウザでアクセスして管理、確認できます。&lt;br /&gt;
&lt;br /&gt;
== トラブルシューティング ==&lt;br /&gt;
=== ネットワーク関係 ===&lt;br /&gt;
==== コンテナのネットワークが回復していないせいでコンテナが再起動できない ====&lt;br /&gt;
計算機を再起動したあと、ユーザー定義で作成したoverlayネットワークが何やらダウンして、復旧できなかった。&lt;br /&gt;
&lt;br /&gt;
で、計算機の停止前にそのoverlayネットワークに参加していたコンテナに対し、計算機の再起動後にdocker startでコンテナ再起動しようとしたところ、以下のようなエラーが出て再起動してくれなかった。&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Error response from daemon: Could not attach to network asuaxn22bff1sq8pqqay2sg64: context deadline exceeded&lt;br /&gt;
Error: failed to start containers: &amp;lt;コンテナ名&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ネットワークを復活させられればstart可能となるのか、そもそも同じネットワークを復活させられるのか、よくわからなかったが、とりあえず以下のようにしてネットワークからコンテナを切り離し、そのうえでコンテナをstartとすれば、立ち上がってくれるようにはなった。(もちろんネットワークからは抜けたまま)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;gt; docker network disconnect &amp;lt;死んでるoverlayネットワークの名前&amp;gt; &amp;lt;コンテナ名&amp;gt;&lt;br /&gt;
&amp;gt; docker start &amp;lt;コンテナ名&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
当該コンテナがどんなネットワークに属しているかは、&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;gt; docker inspect &amp;lt;コンテナ名&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
で、&amp;quot;Networks&amp;quot;を見ればよい。(デフォルトで参加するネットワークは&amp;quot;bridge&amp;quot;で、それ以外を見ればよい)&lt;br /&gt;
&lt;br /&gt;
(追記) 上記はoverlayネットワークがダウンしていたわけではなく、計算機再起動によりswarm通信用のポートが閉じていたためだった。[[DockerでcryoSPARCクラスタ#ホストマシンを再起動した後のクラスタの復旧]]&lt;br /&gt;
&lt;br /&gt;
==== swarmに参加できない ====&lt;br /&gt;
* 症状&lt;br /&gt;
とあるノードにて&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;gt; docker swarm join --token *** 192.168.5.88:2377&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
すると&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Error response from daemon: unlinkat /var/lib/docker/swarm/certificates: read-only file system&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
と出てきてswarmに参加できない&lt;/div&gt;</summary>
		<author><name>Kttn</name></author>	</entry>

	<entry>
		<id>https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/Docker%E3%81%A7cryoSPARC%E3%82%AF%E3%83%A9%E3%82%B9%E3%82%BF</id>
		<title>DockerでcryoSPARCクラスタ</title>
		<link rel="alternate" type="text/html" href="https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/Docker%E3%81%A7cryoSPARC%E3%82%AF%E3%83%A9%E3%82%B9%E3%82%BF"/>
				<updated>2020-11-17T11:07:27Z</updated>
		
		<summary type="html">&lt;p&gt;Kttn: /* CentOS 7 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== この記事について ==&lt;br /&gt;
cryoSPARCはインストールで問題が起きる場合がある。Dockerで動かせるようにすれば、Dockerが使えるマシンがあればおおむねどこでもcryoSPARCを動かせるようになる。&lt;br /&gt;
&lt;br /&gt;
単一ノードでcryoSPARCを使うだけれあればすでに作成済みのDockerイメージ( https://github.com/yasunaga-lab/docker/tree/master/cryosparc )が使える。複数ノードでcryoSPARCを動かしてクラスタを作るためにはDocker間の通信設定などが必要になる。ここにそのあたりの方法を書き残しておく。&lt;br /&gt;
&lt;br /&gt;
== Docker swarmによる(仮想)ネットワーク構築 ==&lt;br /&gt;
異なるホストマシンの上に載っているDockerを相互接続するためにswarmを構成したうえで、cryoSPARCコンテナ間通信用のoverlayネットワークを作成する。(参考： [[Docker関連]]  )&lt;br /&gt;
&lt;br /&gt;
=== ファイアウォール設定 ===&lt;br /&gt;
Docker間の通信に必要なポートを開ける必要がある。こちらを参照⇒ https://docs.docker.com/network/overlay/#create-an-overlay-network&lt;br /&gt;
&lt;br /&gt;
==== CentOS 7 ====&lt;br /&gt;
CentOSの場合はfirewall-cmdでポートを開けることができる。クラスタに参加するホストマシンのすべてで実行する必要がある。(firewall-cmdについて参考： [[Linux関連#ネットワーク関連]])&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;gt; sudo firewall-cmd --zone=public --add-port=2377/tcp --add-port=7946/tcp --add-port=7946/udp --add-port=4789/udp&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
上記だけだと設定は永続的ではなく、ホストマシンを再起動するとポートが再び閉じてしまうので、永続化させたい場合は --permanent オプションをつけること。&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;gt; sudo firewall-cmd --zone=public --add-port=2377/tcp --add-port=7946/tcp --add-port=7946/udp --add-port=4789/udp --permanent&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ポートを開けた後は、--reloadで設定を反映するか、&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;gt; sudo firewall-cmd --reload&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
firewalldを再起動する。&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;gt; sudo systemctl restart firewalld.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Ubuntu 18.04 LTS ====&lt;br /&gt;
ufw (Ubuntu firewall)を使うが、未調査。&lt;br /&gt;
&lt;br /&gt;
=== Swarmの構成 ===&lt;br /&gt;
クラスタに参加させたいホストマシン達のDockerでswarmを構成する。Swarmにはマネージャーノードとワーカーノードの概念がある。&lt;br /&gt;
&lt;br /&gt;
まずはマネージャーノードにしたいホストマシンにて以下を実行する。&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;gt; docker swarm init&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
すると以下のような文字列が出力されるから、これをワーカーノードとしてクラスタに参加させたいホストマシンのそれぞれで実行すればよい。&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
docker swarm join --token &amp;lt;トークン文字列&amp;gt; &amp;lt;マネージャーノードのIPアドレス&amp;gt;:2377&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
成功すれば&amp;quot;This node joined a swarm as a worker.&amp;quot;と表示される。&lt;br /&gt;
&lt;br /&gt;
あとあと上記のコマンドを確認したい場合は、マネージャーノードにて&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;gt; docker swarm join-token worker&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
とすれば、ワーカーノード追加用のコマンド(トークン文字列も含めて)を確認できる。&lt;br /&gt;
&lt;br /&gt;
現在swarmに加わっているホストマシンの一覧を確認するには、&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;gt; docker node ls&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
マネージャー、ワーカーとややこしいことを書いたが、たぶん、swarm上でサービス (Dockerの用語)を動かす時に必要になる役割で、今回のようにそれぞれのホストでcryoSPARCコンテナを動かし、それを相互接続する、というだけであれば、どれをマネージャーにするかなどはあまり関係ないのではないかとは思う。&lt;br /&gt;
&lt;br /&gt;
=== Overlayネットワークの作成 ===&lt;br /&gt;
Swarmのマネージャーノードにて、コンテナ間をつなぐためのoverlayネットワークを作成する。ここでは、cryosparc-netという名前で作ってみる。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;gt; docker network create --driver=overlay --attachable cryosparc-net&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
これをワーカーノードでやる必要はない。マネージャーノードで作ればワーカーノードからも利用可能になる。&lt;br /&gt;
&lt;br /&gt;
ネットワークの一覧を確認する。cryosparc-netがswarmをスコープとして作られていることが確認できる。&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;gt; docker network ls&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== cryoSPARCクラスタ構築 ==&lt;br /&gt;
クラスタに加えたいノードのそれぞれでcryoSPARCを動かす能力のあるdockerコンテナを動かし、それらをcryosparc-netに参加させ、cryoSPARCのマスターとして使いたいコンテナでのみcryoSPARCのマスターインストールをして、必要ならワーカーもインストールし、他のコンテナではワーカーのみインストールする + α をすればクラスタ構築できた。cryoSPARCのインストール場所やデータベース、プロジェクトディレクトリなどなどは、どのホスト・コンテナからもマウント可能なネットワークドライブに置く必要があります。&lt;br /&gt;
&lt;br /&gt;
手順が煩雑なのでいずれ整理して書きます。(各ホストマシンでコンテナを動かして、同一の仮想ネットワーク上に載せることさえできれば、あとは通常のcryoSPARC master workerインストールと同じです。)&lt;br /&gt;
&lt;br /&gt;
=== コンテナをcryosparc-netに参加させる方法 ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;gt; docker network connect cryosparc-net &amp;lt;コンテナ名&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== cryoSPARCワーカーを追加する方法 ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;gt; cryosparcw connect --worker &amp;lt;ワーカーコンテナ名&amp;gt; --master &amp;lt;マスターコンテナ名&amp;gt; --port 39000 --ssdpath &amp;lt;SSDのパス&amp;gt; --lane &amp;lt;レーン名&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
デフォルトのレーン名は default である。&lt;br /&gt;
&lt;br /&gt;
新しいレーンを作る場合は、--newlaneフラグを立てたうえで--lane で新しいレーン名を指定する。&lt;br /&gt;
&lt;br /&gt;
--ssdquota によりSSDの使用可能量(MB)を適宜指定したほうがよいだろう。&lt;br /&gt;
&lt;br /&gt;
=== ワーカーの設定変更 ===&lt;br /&gt;
ワーカーの設定を一部変更するには、--updateフラグを立てたうえで、変更したいオプション値を指定すればよい。例えばssdquotaを100GBに制限したければ、&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;gt; cryosparcw connect --worker &amp;lt;ワーカーコンテナ名&amp;gt; --master &amp;lt;マスターコンテナ名&amp;gt; --update --ssdquota 100000&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
とする。workerとmasterは指定が必要。&lt;br /&gt;
&lt;br /&gt;
=== cryosparcw connectのエラー ===&lt;br /&gt;
以下のようなエラーが出た場合は、&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 ---------------------------------------------------------------&lt;br /&gt;
  CRYOSPARC CONNECT --------------------------------------------&lt;br /&gt;
 ---------------------------------------------------------------&lt;br /&gt;
  Attempting to register worker csparc-worker-DL-Box to command csparc-master-worker-cs08:39002&lt;br /&gt;
Traceback (most recent call last):&lt;br /&gt;
  File &amp;quot;bin/connect.py&amp;quot;, line 84, in &amp;lt;module&amp;gt;&lt;br /&gt;
    print     &amp;quot;  Connecting as unix user %s&amp;quot; % (os.environ['USER'])&lt;br /&gt;
  File &amp;quot;/net/fs10/work02/csparc/cryosparc2_worker/deps/anaconda/lib/python2.7/UserDict.py&amp;quot;, line 40, in __getitem__&lt;br /&gt;
    raise KeyError(key)&lt;br /&gt;
KeyError: 'USER'&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
USER環境変数が設定されていない。cryoSPARCのユーザー名(cryoSPARCが管理しているユーザー名ではなくて、計算機システム側のユーザー名)がcryosparc_userだとすると、&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;gt; export USER=cryosparc_user&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
としてから再度connectをすれば大丈夫(なはず)。&lt;br /&gt;
&lt;br /&gt;
== ホストマシンを再起動した後のクラスタの復旧 ==&lt;br /&gt;
停止したコンテナをdocker startで再稼働するとき、swarmのマスターではうまく行くがワーカーでは失敗するエラーが起きた。&lt;br /&gt;
エラーがの内容(例)は&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Error response from daemon: Could not attach to network asuaxn22bff1sq8pqqay2sg64: context deadline exceeded&lt;br /&gt;
Error: failed to start containers: csparc-worker-cs06&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
マスターノードで docker node ls すると、ワーカーノードのSTATUSが軒並み Down になっていて、dockerのネットワークが駄目な感じがあった。が、修復の方法がよくわからず、頓挫中。&lt;br /&gt;
&lt;br /&gt;
=== 原因 ===&lt;br /&gt;
[[#ファイアウォール設定|ファイアウォール設定]]でswarm通信用のポートをfirewall-cmdで開けるが、--permanentオプションを付けて実行しないと、計算機再起動した際に設定が消えるらしい。上記問題が出た環境は--permanetを付けずにポートを開いていたので、それゆえ再起動した後にswarm通信ができず、各ノードのSTATUSがDownとなっていたと考えられる。(実際に検証する前にネットワーク設定を消してしまったので検証はできていない)&lt;/div&gt;</summary>
		<author><name>Kttn</name></author>	</entry>

	<entry>
		<id>https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/Linux%E9%96%A2%E9%80%A3</id>
		<title>Linux関連</title>
		<link rel="alternate" type="text/html" href="https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/Linux%E9%96%A2%E9%80%A3"/>
				<updated>2020-11-17T11:05:46Z</updated>
		
		<summary type="html">&lt;p&gt;Kttn: /* ポート開放 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= ネットワーク関連 =&lt;br /&gt;
== ネットワーク系ツールのインストール ==&lt;br /&gt;
=== Ubuntu 16.04 ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;gt; sudo apt install iputils-ping net-tools&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ポートスキャン ==&lt;br /&gt;
nmap (Network Mapper)を使えば、あるIPアドレスをもつ計算機が、どのポートを外部に開放しているかを調べることができる。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;gt; nmap -Pn 192.168.4.xx&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   Starting Nmap 7.60 ( https://nmap.org ) at 2020-07-16 16:47 JST&lt;br /&gt;
   Nmap scan report for &amp;lt;ホスト名&amp;gt; (192.168.4.xx)&lt;br /&gt;
   Host is up (0.47s latency).&lt;br /&gt;
   Not shown: 999 filtered ports&lt;br /&gt;
   PORT   STATE SERVICE&lt;br /&gt;
   22/tcp open  ssh&lt;br /&gt;
&lt;br /&gt;
   Nmap done: 1 IP address (1 host up) scanned in 69.83 seconds&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
といった感じで、tcp22番ポートがsshプロトコル用に開放されていることがわかる。&lt;br /&gt;
&lt;br /&gt;
== firewallが動作しているかの確認 ==&lt;br /&gt;
=== Ubuntu 16.04 ===&lt;br /&gt;
firewallの制御はufw (ubuntu firewall)を使う。&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;gt; sudo ufw status&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== CentOS 7 ===&lt;br /&gt;
firewallの制御はfirewall-cmdを使う。&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;gt; sudo firewall-cmd --state&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== firewallのゾーンについて ==&lt;br /&gt;
Windowsでパブリックネットワークやプライベートネットワークなど、セキュリティポリシーの異なるネットワーク設定が用意されているのと同じように、Linuxのfirewallでもゾーンと呼ばれるそのような区分けが存在する。ゾーンごとで通信を許可するプロトコルやポートを変えることができる。&lt;br /&gt;
&lt;br /&gt;
存在するゾーンは以下コマンドでリストアップする。&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;gt; sudo firewall-cmd --list-all-zones&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
アクティブになっている(使用されている)ゾーン名の横には active とカッコ書きで表示され、interfaces: の項目に、そのゾーン設定のもとで運用されているネットワークインターフェースが列挙される。&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
public (active)&lt;br /&gt;
  target: default&lt;br /&gt;
  icmp-block-inversion: no&lt;br /&gt;
  interfaces: eno1&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ポート、サービスの開放状態の確認 ==&lt;br /&gt;
firewall-cmdの--list-allオプションで、デフォルトゾーン(たぶんpublic)の設定を確認できる。特定のゾーンの設定を見たければ --zone=&amp;lt;ゾーン名&amp;gt; をさらに付け加えればよい。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;gt; firewall-cmd --list-all&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   public (active)&lt;br /&gt;
     target: default&lt;br /&gt;
     icmp-block-inversion: no&lt;br /&gt;
     interfaces: enp129s0&lt;br /&gt;
     sources:&lt;br /&gt;
     services: dhcpv6-client snmp ssh&lt;br /&gt;
     ports:&lt;br /&gt;
     protocols:&lt;br /&gt;
     masquerade: no&lt;br /&gt;
     forward-ports:&lt;br /&gt;
     source-ports:&lt;br /&gt;
     icmp-blocks:&lt;br /&gt;
     rich rules:&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
上の出力例では、publicゾーンがDHCP, SNMP, SSHに応答できるよう設定してあるのがわかる。&lt;br /&gt;
&lt;br /&gt;
== ポート開放 ==&lt;br /&gt;
参考：&lt;br /&gt;
* [https://eng-entrance.com/linux-centos-port 【すぐわかる】CentOSのポート開放のやり方]&lt;br /&gt;
&lt;br /&gt;
firewall-cmdを使う。例えばpublicゾーンの2377番ポートをTCP用に開けるならば以下の様にする。&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;gt; firewall-cmd --zone=public --add-port=2377/tcp&lt;br /&gt;
&amp;gt; firewall-cmd --reload&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
上記だけでは設定は永続化されない(再起動すると元に戻る)ので、永続化させるには以下の様に --add-port するコマンドに --permanent オプションを付ける。&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;gt; firewall-cmd --zone=public --add-port=2377/tcp --permanent&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
--add-portオプションを複数回指定して、一度に複数個のポート設定を追加することもできる。&lt;br /&gt;
&lt;br /&gt;
== 特定のポートが使用中か否かのチェック ==&lt;br /&gt;
lsofコマンドを使う。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;gt; lsof -i:&amp;lt;ポート番号&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
使われていなければ何も表示されない。管理者権限でないと表示されない場合があるので、管理者権限で実行したほうが良い。&lt;br /&gt;
&lt;br /&gt;
= ファイルサーバー関連 =&lt;br /&gt;
== autofsを有効化する ==&lt;br /&gt;
/netが存在しない、または/net内でファイルサーバーのディレクトリに入ろうとしてもエラーが出る場合、autofsが動いていない。&lt;br /&gt;
&lt;br /&gt;
以下の作業は管理者権限で実施する。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;step1: /etc/auto.masterを編集する&amp;lt;/b&amp;gt;&lt;br /&gt;
* root権限でエディタで/etc/auto.masterを開き、以下の行がコメントアウトされていればコメントアウトを外す。&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/net    -hosts&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;step2: autofsサービスを有効化して起動する&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl enable --now autofs&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;step3: 確認&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ls /net/fs09/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
work01, work02などが見えればok。fs09以外にも、研究室内でNFSエクスポートをかけてあるリモートファイルシステムはすべてアクセス可能になる。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;step4: ホームディレクトリのリンクを張る&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
研究室計算機のアカウントはホームディレクトリを /home/people/&amp;lt;アカウント名&amp;gt; としていて、その実体は /net/fs09/homes/people/&amp;lt;アカウント名&amp;gt; にある(2020/4/28現在)ので、以下の様にシンボリックリンクを張る。&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd /home&lt;br /&gt;
ln -s /net/fs09/homes/people .&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= ユーザー管理関連 =&lt;br /&gt;
== LDAPユーザーの追加方法 ==&lt;br /&gt;
まずLDAPサーバーにrootログインする。&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;gt; ssh root@ldap&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;gt; ls&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
rootのホームディレクトリでlsすると *.ldif ファイルがごろごろ転がっているはずで、これがLDAPのユーザー登録に用いるファイル群である。&lt;br /&gt;
&lt;br /&gt;
LDAPユーザーにはUIDを通しでつけているから、現状のUIDの使用状況を確認する。ユーザーは12000番台を割り当てているので、以下で一覧を表示する。&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;gt; ldapsearch -x -L -b &amp;quot;dc=yasunaga-lab,dc=bio,dc=kyutech,dc=ac,dc=jp&amp;quot; | grep 'uidNumber: 12' | sort | tail&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
例えば以下の様に表示されたならば、&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
uidNumber: 12117&lt;br /&gt;
uidNumber: 12118&lt;br /&gt;
uidNumber: 12119&lt;br /&gt;
uidNumber: 12120&lt;br /&gt;
uidNumber: 12121&lt;br /&gt;
uidNumber: 12122&lt;br /&gt;
uidNumber: 12123&lt;br /&gt;
uidNumber: 12124&lt;br /&gt;
uidNumber: 12125&lt;br /&gt;
uidNumber: 12126&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
新規ユーザーはUID 12127 として登録すればよい。&lt;br /&gt;
&lt;br /&gt;
次にユーザーのパスワードを用意し、ハッシュ値を作成する。&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;gt; slappasswd&lt;br /&gt;
New password:&lt;br /&gt;
Re-enter new password:&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
研究室の既存のドキュメントでは「ユーザーパスワードは大文字、小文字、数字、記号を含む１２桁で設定」と書いてあるが、これが研究室での規約ということなのか、そうでないとシステムが受け付けないということなのか、よくわからない。気になったらだれか調べてください。いまのところ調べるのが面倒なため何も考えずに従っています。&lt;br /&gt;
&lt;br /&gt;
以下のようなハッシュ値が表示されるから、それを控えておく。&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{SSHA}PZfbmb0GBrR+YNoWNqtQl5JXWrPSKsZJ&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
で、ldifファイルのテンプレートをコピーして新規追加ユーザー用のldifファイルを用意する。&lt;br /&gt;
&lt;br /&gt;
コピーの時に間違って他のldifを上書きしたりしないように注意。&lt;br /&gt;
&lt;br /&gt;
新しいユーザーはフルネームが Shiroh EMIYA, ユーザー名が shiroh であるものとして説明する。&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;gt; cp template.ldif 2020_shiroh.ldif&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
2020と書いたのは2020年度に追加したユーザーであることを明らかとするため。&lt;br /&gt;
&lt;br /&gt;
で、2020_shiroh.ldif を開くと以下の様になっているんで、&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dn: cn=&amp;lt;Firstname&amp;gt; &amp;lt;LASTNAME&amp;gt;,ou=People,dc=yasunaga-lab,dc=bio,dc=kyutech,dc=ac,dc=jp&lt;br /&gt;
cn: &amp;lt;Firstname&amp;gt; &amp;lt;LASTNAME&amp;gt;&lt;br /&gt;
gidnumber: 1001&lt;br /&gt;
homedirectory: /home/people/&amp;lt;username&amp;gt;&lt;br /&gt;
loginshell: /bin/bash&lt;br /&gt;
objectclass: account&lt;br /&gt;
objectclass: posixAccount&lt;br /&gt;
uid: &amp;lt;username&amp;gt;&lt;br /&gt;
uidnumber: &amp;lt;uidnumber&amp;gt;&lt;br /&gt;
userpassword: &amp;lt;a password encripted with slappasswd&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;...&amp;gt;の部分を適宜置き換えればよい。&lt;br /&gt;
&lt;br /&gt;
例えば、&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dn: cn=Shiroh EMIYA,ou=People,dc=yasunaga-lab,dc=bio,dc=kyutech,dc=ac,dc=jp&lt;br /&gt;
cn: Shiroh EMIYA&lt;br /&gt;
gidnumber: 1001&lt;br /&gt;
homedirectory: /home/people/shiroh&lt;br /&gt;
loginshell: /bin/bash&lt;br /&gt;
objectclass: account&lt;br /&gt;
objectclass: posixAccount&lt;br /&gt;
uid: shiroh&lt;br /&gt;
uidnumber: 12127&lt;br /&gt;
userpassword: {SSHA}PZfbmb0GBrR+YNoWNqtQl5JXWrPSKsZJ&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
で、ldapaddコマンドでLDAPへ登録する。&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;gt; ldapadd –x –D &amp;quot;cn=Manager, dc=yasunaga-lab, dc=bio, dc=kyutech, dc=ac, dc=jp&amp;quot; –W –f 2020_shiroh.ldif&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
LDAP管理パスワードを聞かれるけど、知らなければネットワーク係に問い合わせてください。&lt;br /&gt;
&lt;br /&gt;
成功すれば以下のようなメッセージだけが表示される。&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
adding new entry &amp;quot;cn=Shiroh EMIYA,ou=People,dc=yasunaga-lab,dc=bio,dc=kyutech,dc=ac,dc=jp&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
で、ホームディレクトリ作成する。ホームディレクトリは/net/fs09/homes/people/に置いてあるので、そこに新規ユーザー名と同じディレクトリを作成する。パーミッションもちゃんとアレしてください&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;gt; cd /net/fs09/homes/people&lt;br /&gt;
&amp;gt; mkdir shiroh&lt;br /&gt;
&amp;gt; chown 12127:1001 shiroh&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
で、LDAPクライアントを有効化しているどっかの計算機にログインして、ユーザーとホームディレクトリが有効になっているかどうかチェックしてください。&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;gt; ssh shiroh@cs05&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
完全なる虚無のホームディレクトリを作ったためシェルがすっぴん状態ですから、ほかの人のbashrcとかを見て適当によろしくやってください。もしくはだれかやる気のある人が、ホームディレクトリのテンプレート的なものを作成してください。&lt;br /&gt;
&lt;br /&gt;
== LDAPでユーザー管理していない計算機にアカウントを追加する ==&lt;br /&gt;
&amp;lt;前提&amp;gt;&lt;br /&gt;
* LDAPサーバーに研究室アカウントを登録済みであること&lt;br /&gt;
* アカウントを追加したい計算機で管理者権限を使えること&lt;br /&gt;
* アカウントを追加したい計算機でautofsが有効になっており、LDAPアカウントのホームディレクトリにアクセス可能なこと&lt;br /&gt;
&lt;br /&gt;
&amp;lt;想定状況&amp;gt;&lt;br /&gt;
* LDAPでユーザー管理していない計算機(rc, DL-Boxなど)において、LDAPに登録してあるユーザー所有のファイルやディレクトリに同じ権限でアクセスできるようなアカウントを作りたい。ホームディレクトリも共有したい。&lt;br /&gt;
** LDAPを有効化しようにも既存ユーザーとLDAPユーザー名やグループ名などがバッティングしていてLDAP有効化できない場合とか、宗教上の理由によりその計算機でLDAPを使いたくない場合など。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;step1: LDAPユーザーのUIDとGIDを確認する&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
LDAPでユーザー管理している計算機上で、idコマンドにより確認する。&lt;br /&gt;
&lt;br /&gt;
例えばユーザー名がkttnである場合、&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[13:36:52 kttn@cs05 ~]&lt;br /&gt;
&amp;gt; id kttn&lt;br /&gt;
uid=12118(kttn) gid=1001(yasunaga-lab) groups=1001(yasunaga-lab),10(wheel)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
※ cs06ではgid=1001はLDAP有効化以前の既存グループwcsに持っていかれているので、yasunaga-labではなくwcsと表示される。&lt;br /&gt;
&lt;br /&gt;
上記より、UIDは12118, GIDは1001であると確認できる。Linuxではユーザー識別にユーザー名とグループ名は関係なくて、UIDとGIDが同じであるか否かでユーザー識別がされる。したがって、UIDとGIDが上記で確認したLDAPユーザーのそれらと同じアカウントを作りさえすれば目的は達成できる。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;step2: 既存アカウントおよびグループの確認&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ユーザー名 kttn, uid 12118, グループ名 yasunaga-lab, gid 1001 でアカウントを追加したいものとして説明する。&lt;br /&gt;
&lt;br /&gt;
アカウントを追加したい計算機にログインし、まず同じユーザー名をもつユーザーが存在しないか調べる。&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[kttn@rc ~]$ id -u kttn&lt;br /&gt;
1007&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
遺憾ながらすでにkttnという名前のアカウントを作ってしまっていて、同じアカウント名を使えないため、ユーザー名はkttn2として作ることにする。&lt;br /&gt;
&lt;br /&gt;
同様にグループ名を調べる。&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[kttn@rc ~]$ id -g yasunaga-lab&lt;br /&gt;
id: yasunaga-lab: no such user&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
yasunaga-labという名前の既存グループは存在しないため、yasunaga-labという名前のグループを新たに作成しても良い。&lt;br /&gt;
&lt;br /&gt;
次に同じUIDを持つユーザーが存在しないか調べる。&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[kttn@rc ~]$ id -un 12118&lt;br /&gt;
id: 12118: no such user&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
存在しない。&lt;br /&gt;
&lt;br /&gt;
同様にGID&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[kttn@rc ~]$ id -gn 1001&lt;br /&gt;
wcs&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
残念ながらwcsというグループがすでにGID 1001を割り当てられている。yasunaga-labというグループは作らずに、wcsというグループでアカウントを作ることにする。&lt;br /&gt;
&lt;br /&gt;
まとめると、ユーザー名 kttn2 (uid=12118), 所属グループ wcs (gid=1001) でアカウントを作成することにする。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;step3: アカウント作成&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
管理者権限で実施。&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[root@rc ~]# useradd --home-dir /home/people/kttn --gid 1001 --groups wheel --no-create-home --shell /usr/bin/bash --uid 12118 kttn2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
--shellはLDAPユーザーのそれと同じにする。--shellのパスはOSによって違うかもしれないが、centos7の場合bashは/usr/bin/bashである。Ubuntu16.04の場合は/bin/bash。&lt;br /&gt;
&lt;br /&gt;
--groupsは追加のグループを指定していて、centos7ではwheelを追加するとsudoコマンド使用が可能になる。&lt;br /&gt;
&lt;br /&gt;
--home-dirは、LDAPユーザーで使っているホームディレクトリを指定すること！&lt;br /&gt;
&lt;br /&gt;
次にパスワードの設定。&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[root@rc ~]# passwd kttn2&lt;br /&gt;
Changing password for user kttn2.&lt;br /&gt;
New password:&lt;br /&gt;
Retype new password:&lt;br /&gt;
passwd: all authentication tokens updated successfully.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
LDAPユーザーのそれと同じにしとくが吉。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;step4: 確認&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
suコマンドで追加したユーザーになってみる。&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[root@rc ~]# su kttn2   &lt;br /&gt;
[14:32:31 kttn2@rc /root] &lt;br /&gt;
&amp;gt; cd&lt;br /&gt;
&lt;br /&gt;
[14:32:31 kttn2@rc ~]&lt;br /&gt;
&amp;gt; ls&lt;br /&gt;
ビデオ        デスクトップ  docker     pyenv-init.sh  scripts            tmp   画像&lt;br /&gt;
ダウンロード  ドキュメント  Downloads  R              softwares          web   音楽&lt;br /&gt;
テンプレート  Desktop       perl5      repos          thinclient_drives  公開&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
問題なくホームディレクトリが見れている。あとは念のためファイル作れるかとか消せるかとかをチェックすればよい。&lt;br /&gt;
&lt;br /&gt;
もちろん外側からsshするときは新たに作成したユーザー名で、&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ssh kttn2@rc&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
とかやる。&lt;br /&gt;
&lt;br /&gt;
=ウェブサーバー関連=&lt;br /&gt;
== 特定のIPアドレスをアクセス禁止にする ==&lt;br /&gt;
Scientific Linux 6の場合。&lt;br /&gt;
&lt;br /&gt;
ターミナルでログインし、/etc/sysconfig/iptables をroot権限で開き、以下の書式でIPを追記する。&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
-A INPUT -s &amp;lt;IP address&amp;gt;/&amp;lt;subnet bit数&amp;gt; -p tcp -j REJECT&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
例えば192.0.2.xxx からのアクセスを禁止するには、192.0.2.0/24 と書く。udpアクセスを禁止する場合はtcpの代わりにudpと書く。&lt;br /&gt;
&lt;br /&gt;
上記を編集した後、以下によりiptablesをリロードして設定を反映させる。&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
service iptables restart&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
iptablesを再起動すると、ごくわずかな時間だがiptablesによるアクセス管理が無効になるようで、その間アクセスが多くなったりする。&lt;br /&gt;
&lt;br /&gt;
= ロケール =&lt;br /&gt;
== CentOS7 ==&lt;br /&gt;
以下コマンドでロケールを指定し、設定を反映させる。&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo localectl set-locale LANG=ja_JP.UTF-8&lt;br /&gt;
source /etc/locale.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
簡単にウェブを探しても、システム全体でこれを永続させるような方法が見当たらず。システムの環境変数としてLANG=ja_JP.UTF-8を指定すればいいような気もするが...&lt;br /&gt;
&lt;br /&gt;
ユーザーの.bash_profileに、以下を追記する。&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
LANG=ja_JP.UTF-8&lt;br /&gt;
export LANG&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
ログイン直後はロケール設定失敗みたいなエラーが出てくるかもしれないが、それを除けば日本語コンソール環境みたいになる。&lt;br /&gt;
&lt;br /&gt;
== CentOS7 Docker ==&lt;br /&gt;
Dockerの場合はlocalectfを使用できないので、以下コマンドを使う。nvidia/cudaのcentos7イメージの場合はこれだけでいける、はず。&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo localedef -f UTF-8 -i ja_JP ja_JP.UTF-8&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ubuntu 18.04 Docker ==&lt;br /&gt;
以下でokだった。&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo apt install language-pack-ja-base&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= BASH =&lt;br /&gt;
== ディレクトリスタック ==&lt;br /&gt;
複数のディレクトリパスをディレクトリスタックに記憶しておき、ディレクトリ移動を楽にする仕組み。&lt;br /&gt;
&lt;br /&gt;
* ディレクトリを移動するとともに、ディレクトリスタックに追加するコマンド&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
pushd &amp;lt;行先ディレクトリ&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 現在のディレクトリスタックの表示&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dirs -v&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
1カラム目がディレクトリスタックにおけるそのディレクトリの識別番号。&lt;br /&gt;
&lt;br /&gt;
* ディレクトリスタックの中の特定のディレクトリへ移動&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# 識別番号を確認&lt;br /&gt;
dirs -v&lt;br /&gt;
# 移動(+記号を忘れずに)&lt;br /&gt;
pushd +&amp;lt;識別番号&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= SSH =&lt;br /&gt;
== リモートマシンでコマンドだけ実行する ==&lt;br /&gt;
リモートで実行したいコマンドをいつものsshコマンドの後ろに書くだけ。クォートは不要。&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ssh user@host command&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Kttn</name></author>	</entry>

	<entry>
		<id>https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/Docker%E9%96%A2%E9%80%A3</id>
		<title>Docker関連</title>
		<link rel="alternate" type="text/html" href="https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/Docker%E9%96%A2%E9%80%A3"/>
				<updated>2020-11-17T09:17:41Z</updated>
		
		<summary type="html">&lt;p&gt;Kttn: /* ネットワーク関係 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Dockerを利用して研究、開発の環境を構築する方法を書いていきます。&lt;br /&gt;
&lt;br /&gt;
== 用語の整理 ==&lt;br /&gt;
なかなかに複雑なので用語を整理しておきます。間違っている部分もあるかもしれないので、適宜修正してください。&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:100%&amp;quot;&lt;br /&gt;
|+Docker用語の整理&lt;br /&gt;
! style=&amp;quot;width:10%&amp;quot; | 用語&lt;br /&gt;
! 説明&lt;br /&gt;
|-&lt;br /&gt;
! Docker&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Docker machine&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Docker engine&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
! Docker desktop&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
! Docker CLI&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
! Docker compose&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
! Docker swarm&lt;br /&gt;
| 複数のホストマシン上のDockerをネットワークを介して相互接続する機能。&lt;br /&gt;
|-&lt;br /&gt;
! Kubernetes (K8s)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! NVIDIA Docker&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! NVIDIA Container Toolkit&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Dockerのネットワークについて ==&lt;br /&gt;
1つのホストマシン上のDocker上でのコンテナ間の通信や、複数のホストマシン上のDocker上でのコンテナ間の通信、自分の好みのDockerネットワークを組む方法などについて、公式ドキュメント( https://docs.docker.com/network/ )がある。&lt;br /&gt;
&lt;br /&gt;
== Docker swarm ==&lt;br /&gt;
複数のホストマシン上のDockerをネットワークを介して相互接続する機能。SwarmでDockerのクラスタを作った暁には、overlayと呼ばれるタイプのDockerネットワークを作成し、そのネットワークへ(複数のホストで動作している)コンテナを参加させることで、ホストをまたいでのコンテナ間の通信が可能となる。他にも色々できる。&lt;br /&gt;
&lt;br /&gt;
https://docs.docker.com/network/ で、Networking overview ⇒ Bridge network tutorial ⇒ Overlay networking tutorial と読み進めると、機能やありがたみが分かりやすいのではないかと思う。&lt;br /&gt;
&lt;br /&gt;
== Portainer ==&lt;br /&gt;
DockerのGUI管理ツールです。https://www.portainer.io/&lt;br /&gt;
&lt;br /&gt;
ウェブブラウザでアクセスして管理、確認できます。&lt;br /&gt;
&lt;br /&gt;
== トラブルシューティング ==&lt;br /&gt;
=== ネットワーク関係 ===&lt;br /&gt;
==== コンテナのネットワークが回復していないせいでコンテナが再起動できない ====&lt;br /&gt;
計算機を再起動したあと、ユーザー定義で作成したoverlayネットワークが何やらダウンして、復旧できなかった。&lt;br /&gt;
&lt;br /&gt;
で、計算機の停止前にそのoverlayネットワークに参加していたコンテナに対し、計算機の再起動後にdocker startでコンテナ再起動しようとしたところ、以下のようなエラーが出て再起動してくれなかった。&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Error response from daemon: Could not attach to network asuaxn22bff1sq8pqqay2sg64: context deadline exceeded&lt;br /&gt;
Error: failed to start containers: &amp;lt;コンテナ名&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ネットワークを復活させられればstart可能となるのか、そもそも同じネットワークを復活させられるのか、よくわからなかったが、とりあえず以下のようにしてネットワークからコンテナを切り離し、そのうえでコンテナをstartとすれば、立ち上がってくれるようにはなった。(もちろんネットワークからは抜けたまま)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;gt; docker network disconnect &amp;lt;死んでるoverlayネットワークの名前&amp;gt; &amp;lt;コンテナ名&amp;gt;&lt;br /&gt;
&amp;gt; docker start &amp;lt;コンテナ名&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
当該コンテナがどんなネットワークに属しているかは、&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;gt; docker inspect &amp;lt;コンテナ名&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
で、&amp;quot;Networks&amp;quot;を見ればよい。(デフォルトで参加するネットワークは&amp;quot;bridge&amp;quot;で、それ以外を見ればよい)&lt;br /&gt;
&lt;br /&gt;
(追記) 上記はoverlayネットワークがダウンしていたわけではなく、計算機再起動によりswarm通信用のポートが閉じていたためだった。[[DockerでcryoSPARCクラスタ#ホストマシンを再起動した後のクラスタの復旧]]&lt;/div&gt;</summary>
		<author><name>Kttn</name></author>	</entry>

	<entry>
		<id>https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/mediawiki</id>
		<title>mediawiki</title>
		<link rel="alternate" type="text/html" href="https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/mediawiki"/>
				<updated>2020-11-17T09:15:35Z</updated>
		
		<summary type="html">&lt;p&gt;Kttn: /* 内部リンク */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== データの埋め込み表示 ==&lt;br /&gt;
=== 画像ファイルを埋め込んで表示する ===&lt;br /&gt;
* 「ファイルをアップロード」から画像ファイルをアップロードする。このとき、ファイル名をコピっておく。&lt;br /&gt;
* 例えばアップロードしたファイル名がhoge.pngならば、以下の書式で本文に記述すればよい。&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[[File:hoge.png]]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 画像が大きすぎる場合などは大きさを制限すればよい。&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# 縦を400ピクセルに制限&lt;br /&gt;
[[File:hoge.png|x400px]]&lt;br /&gt;
&lt;br /&gt;
# 幅を200ピクセルに制限&lt;br /&gt;
[[File:hoge.png|200px]]&lt;br /&gt;
&lt;br /&gt;
# 幅200ピクセル、縦400ピクセルに制限&lt;br /&gt;
[[File:hoge.png|200x400px]]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 公式ドキュメント&lt;br /&gt;
** https://www.mediawiki.org/wiki/Help:Images/ja&lt;br /&gt;
&lt;br /&gt;
== 内部リンク ==&lt;br /&gt;
* 同じMediawiki内のコンテンツへのリンクを内部リンクと呼ぶ。&lt;br /&gt;
* 角かっこ2個で囲むのが基本。&lt;br /&gt;
=== 異なるページへの内部リンク ===&lt;br /&gt;
例えばメインページにリンクを貼るには以下の様にする。&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[[メインページ]]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
実際やってみた結果⇒ [[メインページ]]&lt;br /&gt;
&lt;br /&gt;
=== 異なるページ内の節への内部リンク ===&lt;br /&gt;
例えばメインページの「Eospediaにようこそ」節へのリンクを貼るには、&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[[メインページ#Eospediaにようこそ]]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
実際やってみた結果⇒ [[メインページ#Eospediaにようこそ]]&lt;br /&gt;
&lt;br /&gt;
別の文字列に置き換えるには、以下の様に置き換え文字列をパイプ記号 | に続けて書けばよい。&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[[メインページ#Eospediaにようこそ|おいでませEospedia]]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
実際やってみた結果⇒ [[メインページ#Eospediaにようこそ|おいでませEospedia]]&lt;br /&gt;
&lt;br /&gt;
=== 同一ページ内の節への内部リンク ===&lt;br /&gt;
例えば本ページの「データの埋め込み表示」節へのリンクを貼るには以下の様にする。&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[[#データの埋め込み表示]]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
実際やってみた結果⇒ [[#データの埋め込み表示]]&lt;br /&gt;
&lt;br /&gt;
ハッシュ記号を消したいとか、別の文字列に置き換えるには、以下の様に置き換え文字列をパイプ記号 | に続けて書けばよい。&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[[#データの埋め込み表示|別の文字列]]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
実際やってみた結果⇒ [[#データの埋め込み表示|別の文字列]]&lt;/div&gt;</summary>
		<author><name>Kttn</name></author>	</entry>

	<entry>
		<id>https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/Linux%E9%96%A2%E9%80%A3</id>
		<title>Linux関連</title>
		<link rel="alternate" type="text/html" href="https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/Linux%E9%96%A2%E9%80%A3"/>
				<updated>2020-11-17T09:02:15Z</updated>
		
		<summary type="html">&lt;p&gt;Kttn: /* SSH */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= ネットワーク関連 =&lt;br /&gt;
== ネットワーク系ツールのインストール ==&lt;br /&gt;
=== Ubuntu 16.04 ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;gt; sudo apt install iputils-ping net-tools&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ポートスキャン ==&lt;br /&gt;
nmap (Network Mapper)を使えば、あるIPアドレスをもつ計算機が、どのポートを外部に開放しているかを調べることができる。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;gt; nmap -Pn 192.168.4.xx&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   Starting Nmap 7.60 ( https://nmap.org ) at 2020-07-16 16:47 JST&lt;br /&gt;
   Nmap scan report for &amp;lt;ホスト名&amp;gt; (192.168.4.xx)&lt;br /&gt;
   Host is up (0.47s latency).&lt;br /&gt;
   Not shown: 999 filtered ports&lt;br /&gt;
   PORT   STATE SERVICE&lt;br /&gt;
   22/tcp open  ssh&lt;br /&gt;
&lt;br /&gt;
   Nmap done: 1 IP address (1 host up) scanned in 69.83 seconds&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
といった感じで、tcp22番ポートがsshプロトコル用に開放されていることがわかる。&lt;br /&gt;
&lt;br /&gt;
== firewallが動作しているかの確認 ==&lt;br /&gt;
=== Ubuntu 16.04 ===&lt;br /&gt;
firewallの制御はufw (ubuntu firewall)を使う。&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;gt; sudo ufw status&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== CentOS 7 ===&lt;br /&gt;
firewallの制御はfirewall-cmdを使う。&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;gt; sudo firewall-cmd --state&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== firewallのゾーンについて ==&lt;br /&gt;
Windowsでパブリックネットワークやプライベートネットワークなど、セキュリティポリシーの異なるネットワーク設定が用意されているのと同じように、Linuxのfirewallでもゾーンと呼ばれるそのような区分けが存在する。ゾーンごとで通信を許可するプロトコルやポートを変えることができる。&lt;br /&gt;
&lt;br /&gt;
存在するゾーンは以下コマンドでリストアップする。&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;gt; sudo firewall-cmd --list-all-zones&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
アクティブになっている(使用されている)ゾーン名の横には active とカッコ書きで表示され、interfaces: の項目に、そのゾーン設定のもとで運用されているネットワークインターフェースが列挙される。&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
public (active)&lt;br /&gt;
  target: default&lt;br /&gt;
  icmp-block-inversion: no&lt;br /&gt;
  interfaces: eno1&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ポート、サービスの開放状態の確認 ==&lt;br /&gt;
firewall-cmdの--list-allオプションで、デフォルトゾーン(たぶんpublic)の設定を確認できる。特定のゾーンの設定を見たければ --zone=&amp;lt;ゾーン名&amp;gt; をさらに付け加えればよい。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;gt; firewall-cmd --list-all&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   public (active)&lt;br /&gt;
     target: default&lt;br /&gt;
     icmp-block-inversion: no&lt;br /&gt;
     interfaces: enp129s0&lt;br /&gt;
     sources:&lt;br /&gt;
     services: dhcpv6-client snmp ssh&lt;br /&gt;
     ports:&lt;br /&gt;
     protocols:&lt;br /&gt;
     masquerade: no&lt;br /&gt;
     forward-ports:&lt;br /&gt;
     source-ports:&lt;br /&gt;
     icmp-blocks:&lt;br /&gt;
     rich rules:&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
上の出力例では、publicゾーンがDHCP, SNMP, SSHに応答できるよう設定してあるのがわかる。&lt;br /&gt;
&lt;br /&gt;
== ポート開放 ==&lt;br /&gt;
参考：&lt;br /&gt;
* [https://eng-entrance.com/linux-centos-port 【すぐわかる】CentOSのポート開放のやり方]&lt;br /&gt;
&lt;br /&gt;
firewall-cmdを使う。例えばpublicゾーンの2377番ポートをTCP用に開けるならば以下の様にする。&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;gt; firewall-cmd --zone=public --add-port=2377/tcp&lt;br /&gt;
&amp;gt; firewall-cmd --reload&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
--add-portオプションを複数回指定して、一度に複数個のポート設定を追加することもできる。&lt;br /&gt;
&lt;br /&gt;
== 特定のポートが使用中か否かのチェック ==&lt;br /&gt;
lsofコマンドを使う。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;gt; lsof -i:&amp;lt;ポート番号&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
使われていなければ何も表示されない。管理者権限でないと表示されない場合があるので、管理者権限で実行したほうが良い。&lt;br /&gt;
&lt;br /&gt;
= ファイルサーバー関連 =&lt;br /&gt;
== autofsを有効化する ==&lt;br /&gt;
/netが存在しない、または/net内でファイルサーバーのディレクトリに入ろうとしてもエラーが出る場合、autofsが動いていない。&lt;br /&gt;
&lt;br /&gt;
以下の作業は管理者権限で実施する。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;step1: /etc/auto.masterを編集する&amp;lt;/b&amp;gt;&lt;br /&gt;
* root権限でエディタで/etc/auto.masterを開き、以下の行がコメントアウトされていればコメントアウトを外す。&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/net    -hosts&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;step2: autofsサービスを有効化して起動する&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl enable --now autofs&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;step3: 確認&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ls /net/fs09/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
work01, work02などが見えればok。fs09以外にも、研究室内でNFSエクスポートをかけてあるリモートファイルシステムはすべてアクセス可能になる。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;step4: ホームディレクトリのリンクを張る&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
研究室計算機のアカウントはホームディレクトリを /home/people/&amp;lt;アカウント名&amp;gt; としていて、その実体は /net/fs09/homes/people/&amp;lt;アカウント名&amp;gt; にある(2020/4/28現在)ので、以下の様にシンボリックリンクを張る。&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd /home&lt;br /&gt;
ln -s /net/fs09/homes/people .&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= ユーザー管理関連 =&lt;br /&gt;
== LDAPユーザーの追加方法 ==&lt;br /&gt;
まずLDAPサーバーにrootログインする。&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;gt; ssh root@ldap&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;gt; ls&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
rootのホームディレクトリでlsすると *.ldif ファイルがごろごろ転がっているはずで、これがLDAPのユーザー登録に用いるファイル群である。&lt;br /&gt;
&lt;br /&gt;
LDAPユーザーにはUIDを通しでつけているから、現状のUIDの使用状況を確認する。ユーザーは12000番台を割り当てているので、以下で一覧を表示する。&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;gt; ldapsearch -x -L -b &amp;quot;dc=yasunaga-lab,dc=bio,dc=kyutech,dc=ac,dc=jp&amp;quot; | grep 'uidNumber: 12' | sort | tail&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
例えば以下の様に表示されたならば、&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
uidNumber: 12117&lt;br /&gt;
uidNumber: 12118&lt;br /&gt;
uidNumber: 12119&lt;br /&gt;
uidNumber: 12120&lt;br /&gt;
uidNumber: 12121&lt;br /&gt;
uidNumber: 12122&lt;br /&gt;
uidNumber: 12123&lt;br /&gt;
uidNumber: 12124&lt;br /&gt;
uidNumber: 12125&lt;br /&gt;
uidNumber: 12126&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
新規ユーザーはUID 12127 として登録すればよい。&lt;br /&gt;
&lt;br /&gt;
次にユーザーのパスワードを用意し、ハッシュ値を作成する。&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;gt; slappasswd&lt;br /&gt;
New password:&lt;br /&gt;
Re-enter new password:&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
研究室の既存のドキュメントでは「ユーザーパスワードは大文字、小文字、数字、記号を含む１２桁で設定」と書いてあるが、これが研究室での規約ということなのか、そうでないとシステムが受け付けないということなのか、よくわからない。気になったらだれか調べてください。いまのところ調べるのが面倒なため何も考えずに従っています。&lt;br /&gt;
&lt;br /&gt;
以下のようなハッシュ値が表示されるから、それを控えておく。&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{SSHA}PZfbmb0GBrR+YNoWNqtQl5JXWrPSKsZJ&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
で、ldifファイルのテンプレートをコピーして新規追加ユーザー用のldifファイルを用意する。&lt;br /&gt;
&lt;br /&gt;
コピーの時に間違って他のldifを上書きしたりしないように注意。&lt;br /&gt;
&lt;br /&gt;
新しいユーザーはフルネームが Shiroh EMIYA, ユーザー名が shiroh であるものとして説明する。&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;gt; cp template.ldif 2020_shiroh.ldif&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
2020と書いたのは2020年度に追加したユーザーであることを明らかとするため。&lt;br /&gt;
&lt;br /&gt;
で、2020_shiroh.ldif を開くと以下の様になっているんで、&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dn: cn=&amp;lt;Firstname&amp;gt; &amp;lt;LASTNAME&amp;gt;,ou=People,dc=yasunaga-lab,dc=bio,dc=kyutech,dc=ac,dc=jp&lt;br /&gt;
cn: &amp;lt;Firstname&amp;gt; &amp;lt;LASTNAME&amp;gt;&lt;br /&gt;
gidnumber: 1001&lt;br /&gt;
homedirectory: /home/people/&amp;lt;username&amp;gt;&lt;br /&gt;
loginshell: /bin/bash&lt;br /&gt;
objectclass: account&lt;br /&gt;
objectclass: posixAccount&lt;br /&gt;
uid: &amp;lt;username&amp;gt;&lt;br /&gt;
uidnumber: &amp;lt;uidnumber&amp;gt;&lt;br /&gt;
userpassword: &amp;lt;a password encripted with slappasswd&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;...&amp;gt;の部分を適宜置き換えればよい。&lt;br /&gt;
&lt;br /&gt;
例えば、&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dn: cn=Shiroh EMIYA,ou=People,dc=yasunaga-lab,dc=bio,dc=kyutech,dc=ac,dc=jp&lt;br /&gt;
cn: Shiroh EMIYA&lt;br /&gt;
gidnumber: 1001&lt;br /&gt;
homedirectory: /home/people/shiroh&lt;br /&gt;
loginshell: /bin/bash&lt;br /&gt;
objectclass: account&lt;br /&gt;
objectclass: posixAccount&lt;br /&gt;
uid: shiroh&lt;br /&gt;
uidnumber: 12127&lt;br /&gt;
userpassword: {SSHA}PZfbmb0GBrR+YNoWNqtQl5JXWrPSKsZJ&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
で、ldapaddコマンドでLDAPへ登録する。&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;gt; ldapadd –x –D &amp;quot;cn=Manager, dc=yasunaga-lab, dc=bio, dc=kyutech, dc=ac, dc=jp&amp;quot; –W –f 2020_shiroh.ldif&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
LDAP管理パスワードを聞かれるけど、知らなければネットワーク係に問い合わせてください。&lt;br /&gt;
&lt;br /&gt;
成功すれば以下のようなメッセージだけが表示される。&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
adding new entry &amp;quot;cn=Shiroh EMIYA,ou=People,dc=yasunaga-lab,dc=bio,dc=kyutech,dc=ac,dc=jp&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
で、ホームディレクトリ作成する。ホームディレクトリは/net/fs09/homes/people/に置いてあるので、そこに新規ユーザー名と同じディレクトリを作成する。パーミッションもちゃんとアレしてください&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;gt; cd /net/fs09/homes/people&lt;br /&gt;
&amp;gt; mkdir shiroh&lt;br /&gt;
&amp;gt; chown 12127:1001 shiroh&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
で、LDAPクライアントを有効化しているどっかの計算機にログインして、ユーザーとホームディレクトリが有効になっているかどうかチェックしてください。&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;gt; ssh shiroh@cs05&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
完全なる虚無のホームディレクトリを作ったためシェルがすっぴん状態ですから、ほかの人のbashrcとかを見て適当によろしくやってください。もしくはだれかやる気のある人が、ホームディレクトリのテンプレート的なものを作成してください。&lt;br /&gt;
&lt;br /&gt;
== LDAPでユーザー管理していない計算機にアカウントを追加する ==&lt;br /&gt;
&amp;lt;前提&amp;gt;&lt;br /&gt;
* LDAPサーバーに研究室アカウントを登録済みであること&lt;br /&gt;
* アカウントを追加したい計算機で管理者権限を使えること&lt;br /&gt;
* アカウントを追加したい計算機でautofsが有効になっており、LDAPアカウントのホームディレクトリにアクセス可能なこと&lt;br /&gt;
&lt;br /&gt;
&amp;lt;想定状況&amp;gt;&lt;br /&gt;
* LDAPでユーザー管理していない計算機(rc, DL-Boxなど)において、LDAPに登録してあるユーザー所有のファイルやディレクトリに同じ権限でアクセスできるようなアカウントを作りたい。ホームディレクトリも共有したい。&lt;br /&gt;
** LDAPを有効化しようにも既存ユーザーとLDAPユーザー名やグループ名などがバッティングしていてLDAP有効化できない場合とか、宗教上の理由によりその計算機でLDAPを使いたくない場合など。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;step1: LDAPユーザーのUIDとGIDを確認する&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
LDAPでユーザー管理している計算機上で、idコマンドにより確認する。&lt;br /&gt;
&lt;br /&gt;
例えばユーザー名がkttnである場合、&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[13:36:52 kttn@cs05 ~]&lt;br /&gt;
&amp;gt; id kttn&lt;br /&gt;
uid=12118(kttn) gid=1001(yasunaga-lab) groups=1001(yasunaga-lab),10(wheel)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
※ cs06ではgid=1001はLDAP有効化以前の既存グループwcsに持っていかれているので、yasunaga-labではなくwcsと表示される。&lt;br /&gt;
&lt;br /&gt;
上記より、UIDは12118, GIDは1001であると確認できる。Linuxではユーザー識別にユーザー名とグループ名は関係なくて、UIDとGIDが同じであるか否かでユーザー識別がされる。したがって、UIDとGIDが上記で確認したLDAPユーザーのそれらと同じアカウントを作りさえすれば目的は達成できる。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;step2: 既存アカウントおよびグループの確認&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ユーザー名 kttn, uid 12118, グループ名 yasunaga-lab, gid 1001 でアカウントを追加したいものとして説明する。&lt;br /&gt;
&lt;br /&gt;
アカウントを追加したい計算機にログインし、まず同じユーザー名をもつユーザーが存在しないか調べる。&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[kttn@rc ~]$ id -u kttn&lt;br /&gt;
1007&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
遺憾ながらすでにkttnという名前のアカウントを作ってしまっていて、同じアカウント名を使えないため、ユーザー名はkttn2として作ることにする。&lt;br /&gt;
&lt;br /&gt;
同様にグループ名を調べる。&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[kttn@rc ~]$ id -g yasunaga-lab&lt;br /&gt;
id: yasunaga-lab: no such user&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
yasunaga-labという名前の既存グループは存在しないため、yasunaga-labという名前のグループを新たに作成しても良い。&lt;br /&gt;
&lt;br /&gt;
次に同じUIDを持つユーザーが存在しないか調べる。&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[kttn@rc ~]$ id -un 12118&lt;br /&gt;
id: 12118: no such user&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
存在しない。&lt;br /&gt;
&lt;br /&gt;
同様にGID&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[kttn@rc ~]$ id -gn 1001&lt;br /&gt;
wcs&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
残念ながらwcsというグループがすでにGID 1001を割り当てられている。yasunaga-labというグループは作らずに、wcsというグループでアカウントを作ることにする。&lt;br /&gt;
&lt;br /&gt;
まとめると、ユーザー名 kttn2 (uid=12118), 所属グループ wcs (gid=1001) でアカウントを作成することにする。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;step3: アカウント作成&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
管理者権限で実施。&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[root@rc ~]# useradd --home-dir /home/people/kttn --gid 1001 --groups wheel --no-create-home --shell /usr/bin/bash --uid 12118 kttn2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
--shellはLDAPユーザーのそれと同じにする。--shellのパスはOSによって違うかもしれないが、centos7の場合bashは/usr/bin/bashである。Ubuntu16.04の場合は/bin/bash。&lt;br /&gt;
&lt;br /&gt;
--groupsは追加のグループを指定していて、centos7ではwheelを追加するとsudoコマンド使用が可能になる。&lt;br /&gt;
&lt;br /&gt;
--home-dirは、LDAPユーザーで使っているホームディレクトリを指定すること！&lt;br /&gt;
&lt;br /&gt;
次にパスワードの設定。&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[root@rc ~]# passwd kttn2&lt;br /&gt;
Changing password for user kttn2.&lt;br /&gt;
New password:&lt;br /&gt;
Retype new password:&lt;br /&gt;
passwd: all authentication tokens updated successfully.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
LDAPユーザーのそれと同じにしとくが吉。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;step4: 確認&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
suコマンドで追加したユーザーになってみる。&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[root@rc ~]# su kttn2   &lt;br /&gt;
[14:32:31 kttn2@rc /root] &lt;br /&gt;
&amp;gt; cd&lt;br /&gt;
&lt;br /&gt;
[14:32:31 kttn2@rc ~]&lt;br /&gt;
&amp;gt; ls&lt;br /&gt;
ビデオ        デスクトップ  docker     pyenv-init.sh  scripts            tmp   画像&lt;br /&gt;
ダウンロード  ドキュメント  Downloads  R              softwares          web   音楽&lt;br /&gt;
テンプレート  Desktop       perl5      repos          thinclient_drives  公開&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
問題なくホームディレクトリが見れている。あとは念のためファイル作れるかとか消せるかとかをチェックすればよい。&lt;br /&gt;
&lt;br /&gt;
もちろん外側からsshするときは新たに作成したユーザー名で、&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ssh kttn2@rc&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
とかやる。&lt;br /&gt;
&lt;br /&gt;
=ウェブサーバー関連=&lt;br /&gt;
== 特定のIPアドレスをアクセス禁止にする ==&lt;br /&gt;
Scientific Linux 6の場合。&lt;br /&gt;
&lt;br /&gt;
ターミナルでログインし、/etc/sysconfig/iptables をroot権限で開き、以下の書式でIPを追記する。&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
-A INPUT -s &amp;lt;IP address&amp;gt;/&amp;lt;subnet bit数&amp;gt; -p tcp -j REJECT&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
例えば192.0.2.xxx からのアクセスを禁止するには、192.0.2.0/24 と書く。udpアクセスを禁止する場合はtcpの代わりにudpと書く。&lt;br /&gt;
&lt;br /&gt;
上記を編集した後、以下によりiptablesをリロードして設定を反映させる。&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
service iptables restart&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
iptablesを再起動すると、ごくわずかな時間だがiptablesによるアクセス管理が無効になるようで、その間アクセスが多くなったりする。&lt;br /&gt;
&lt;br /&gt;
= ロケール =&lt;br /&gt;
== CentOS7 ==&lt;br /&gt;
以下コマンドでロケールを指定し、設定を反映させる。&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo localectl set-locale LANG=ja_JP.UTF-8&lt;br /&gt;
source /etc/locale.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
簡単にウェブを探しても、システム全体でこれを永続させるような方法が見当たらず。システムの環境変数としてLANG=ja_JP.UTF-8を指定すればいいような気もするが...&lt;br /&gt;
&lt;br /&gt;
ユーザーの.bash_profileに、以下を追記する。&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
LANG=ja_JP.UTF-8&lt;br /&gt;
export LANG&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
ログイン直後はロケール設定失敗みたいなエラーが出てくるかもしれないが、それを除けば日本語コンソール環境みたいになる。&lt;br /&gt;
&lt;br /&gt;
== CentOS7 Docker ==&lt;br /&gt;
Dockerの場合はlocalectfを使用できないので、以下コマンドを使う。nvidia/cudaのcentos7イメージの場合はこれだけでいける、はず。&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo localedef -f UTF-8 -i ja_JP ja_JP.UTF-8&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ubuntu 18.04 Docker ==&lt;br /&gt;
以下でokだった。&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo apt install language-pack-ja-base&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= BASH =&lt;br /&gt;
== ディレクトリスタック ==&lt;br /&gt;
複数のディレクトリパスをディレクトリスタックに記憶しておき、ディレクトリ移動を楽にする仕組み。&lt;br /&gt;
&lt;br /&gt;
* ディレクトリを移動するとともに、ディレクトリスタックに追加するコマンド&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
pushd &amp;lt;行先ディレクトリ&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 現在のディレクトリスタックの表示&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dirs -v&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
1カラム目がディレクトリスタックにおけるそのディレクトリの識別番号。&lt;br /&gt;
&lt;br /&gt;
* ディレクトリスタックの中の特定のディレクトリへ移動&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# 識別番号を確認&lt;br /&gt;
dirs -v&lt;br /&gt;
# 移動(+記号を忘れずに)&lt;br /&gt;
pushd +&amp;lt;識別番号&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= SSH =&lt;br /&gt;
== リモートマシンでコマンドだけ実行する ==&lt;br /&gt;
リモートで実行したいコマンドをいつものsshコマンドの後ろに書くだけ。クォートは不要。&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ssh user@host command&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Kttn</name></author>	</entry>

	<entry>
		<id>https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/Linux%E9%96%A2%E9%80%A3</id>
		<title>Linux関連</title>
		<link rel="alternate" type="text/html" href="https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/Linux%E9%96%A2%E9%80%A3"/>
				<updated>2020-11-17T09:01:59Z</updated>
		
		<summary type="html">&lt;p&gt;Kttn: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= ネットワーク関連 =&lt;br /&gt;
== ネットワーク系ツールのインストール ==&lt;br /&gt;
=== Ubuntu 16.04 ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;gt; sudo apt install iputils-ping net-tools&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ポートスキャン ==&lt;br /&gt;
nmap (Network Mapper)を使えば、あるIPアドレスをもつ計算機が、どのポートを外部に開放しているかを調べることができる。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;gt; nmap -Pn 192.168.4.xx&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   Starting Nmap 7.60 ( https://nmap.org ) at 2020-07-16 16:47 JST&lt;br /&gt;
   Nmap scan report for &amp;lt;ホスト名&amp;gt; (192.168.4.xx)&lt;br /&gt;
   Host is up (0.47s latency).&lt;br /&gt;
   Not shown: 999 filtered ports&lt;br /&gt;
   PORT   STATE SERVICE&lt;br /&gt;
   22/tcp open  ssh&lt;br /&gt;
&lt;br /&gt;
   Nmap done: 1 IP address (1 host up) scanned in 69.83 seconds&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
といった感じで、tcp22番ポートがsshプロトコル用に開放されていることがわかる。&lt;br /&gt;
&lt;br /&gt;
== firewallが動作しているかの確認 ==&lt;br /&gt;
=== Ubuntu 16.04 ===&lt;br /&gt;
firewallの制御はufw (ubuntu firewall)を使う。&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;gt; sudo ufw status&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== CentOS 7 ===&lt;br /&gt;
firewallの制御はfirewall-cmdを使う。&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;gt; sudo firewall-cmd --state&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== firewallのゾーンについて ==&lt;br /&gt;
Windowsでパブリックネットワークやプライベートネットワークなど、セキュリティポリシーの異なるネットワーク設定が用意されているのと同じように、Linuxのfirewallでもゾーンと呼ばれるそのような区分けが存在する。ゾーンごとで通信を許可するプロトコルやポートを変えることができる。&lt;br /&gt;
&lt;br /&gt;
存在するゾーンは以下コマンドでリストアップする。&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;gt; sudo firewall-cmd --list-all-zones&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
アクティブになっている(使用されている)ゾーン名の横には active とカッコ書きで表示され、interfaces: の項目に、そのゾーン設定のもとで運用されているネットワークインターフェースが列挙される。&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
public (active)&lt;br /&gt;
  target: default&lt;br /&gt;
  icmp-block-inversion: no&lt;br /&gt;
  interfaces: eno1&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ポート、サービスの開放状態の確認 ==&lt;br /&gt;
firewall-cmdの--list-allオプションで、デフォルトゾーン(たぶんpublic)の設定を確認できる。特定のゾーンの設定を見たければ --zone=&amp;lt;ゾーン名&amp;gt; をさらに付け加えればよい。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;gt; firewall-cmd --list-all&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   public (active)&lt;br /&gt;
     target: default&lt;br /&gt;
     icmp-block-inversion: no&lt;br /&gt;
     interfaces: enp129s0&lt;br /&gt;
     sources:&lt;br /&gt;
     services: dhcpv6-client snmp ssh&lt;br /&gt;
     ports:&lt;br /&gt;
     protocols:&lt;br /&gt;
     masquerade: no&lt;br /&gt;
     forward-ports:&lt;br /&gt;
     source-ports:&lt;br /&gt;
     icmp-blocks:&lt;br /&gt;
     rich rules:&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
上の出力例では、publicゾーンがDHCP, SNMP, SSHに応答できるよう設定してあるのがわかる。&lt;br /&gt;
&lt;br /&gt;
== ポート開放 ==&lt;br /&gt;
参考：&lt;br /&gt;
* [https://eng-entrance.com/linux-centos-port 【すぐわかる】CentOSのポート開放のやり方]&lt;br /&gt;
&lt;br /&gt;
firewall-cmdを使う。例えばpublicゾーンの2377番ポートをTCP用に開けるならば以下の様にする。&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;gt; firewall-cmd --zone=public --add-port=2377/tcp&lt;br /&gt;
&amp;gt; firewall-cmd --reload&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
--add-portオプションを複数回指定して、一度に複数個のポート設定を追加することもできる。&lt;br /&gt;
&lt;br /&gt;
== 特定のポートが使用中か否かのチェック ==&lt;br /&gt;
lsofコマンドを使う。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;gt; lsof -i:&amp;lt;ポート番号&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
使われていなければ何も表示されない。管理者権限でないと表示されない場合があるので、管理者権限で実行したほうが良い。&lt;br /&gt;
&lt;br /&gt;
= ファイルサーバー関連 =&lt;br /&gt;
== autofsを有効化する ==&lt;br /&gt;
/netが存在しない、または/net内でファイルサーバーのディレクトリに入ろうとしてもエラーが出る場合、autofsが動いていない。&lt;br /&gt;
&lt;br /&gt;
以下の作業は管理者権限で実施する。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;step1: /etc/auto.masterを編集する&amp;lt;/b&amp;gt;&lt;br /&gt;
* root権限でエディタで/etc/auto.masterを開き、以下の行がコメントアウトされていればコメントアウトを外す。&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/net    -hosts&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;step2: autofsサービスを有効化して起動する&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl enable --now autofs&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;step3: 確認&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ls /net/fs09/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
work01, work02などが見えればok。fs09以外にも、研究室内でNFSエクスポートをかけてあるリモートファイルシステムはすべてアクセス可能になる。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;step4: ホームディレクトリのリンクを張る&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
研究室計算機のアカウントはホームディレクトリを /home/people/&amp;lt;アカウント名&amp;gt; としていて、その実体は /net/fs09/homes/people/&amp;lt;アカウント名&amp;gt; にある(2020/4/28現在)ので、以下の様にシンボリックリンクを張る。&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd /home&lt;br /&gt;
ln -s /net/fs09/homes/people .&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= ユーザー管理関連 =&lt;br /&gt;
== LDAPユーザーの追加方法 ==&lt;br /&gt;
まずLDAPサーバーにrootログインする。&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;gt; ssh root@ldap&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;gt; ls&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
rootのホームディレクトリでlsすると *.ldif ファイルがごろごろ転がっているはずで、これがLDAPのユーザー登録に用いるファイル群である。&lt;br /&gt;
&lt;br /&gt;
LDAPユーザーにはUIDを通しでつけているから、現状のUIDの使用状況を確認する。ユーザーは12000番台を割り当てているので、以下で一覧を表示する。&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;gt; ldapsearch -x -L -b &amp;quot;dc=yasunaga-lab,dc=bio,dc=kyutech,dc=ac,dc=jp&amp;quot; | grep 'uidNumber: 12' | sort | tail&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
例えば以下の様に表示されたならば、&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
uidNumber: 12117&lt;br /&gt;
uidNumber: 12118&lt;br /&gt;
uidNumber: 12119&lt;br /&gt;
uidNumber: 12120&lt;br /&gt;
uidNumber: 12121&lt;br /&gt;
uidNumber: 12122&lt;br /&gt;
uidNumber: 12123&lt;br /&gt;
uidNumber: 12124&lt;br /&gt;
uidNumber: 12125&lt;br /&gt;
uidNumber: 12126&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
新規ユーザーはUID 12127 として登録すればよい。&lt;br /&gt;
&lt;br /&gt;
次にユーザーのパスワードを用意し、ハッシュ値を作成する。&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;gt; slappasswd&lt;br /&gt;
New password:&lt;br /&gt;
Re-enter new password:&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
研究室の既存のドキュメントでは「ユーザーパスワードは大文字、小文字、数字、記号を含む１２桁で設定」と書いてあるが、これが研究室での規約ということなのか、そうでないとシステムが受け付けないということなのか、よくわからない。気になったらだれか調べてください。いまのところ調べるのが面倒なため何も考えずに従っています。&lt;br /&gt;
&lt;br /&gt;
以下のようなハッシュ値が表示されるから、それを控えておく。&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{SSHA}PZfbmb0GBrR+YNoWNqtQl5JXWrPSKsZJ&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
で、ldifファイルのテンプレートをコピーして新規追加ユーザー用のldifファイルを用意する。&lt;br /&gt;
&lt;br /&gt;
コピーの時に間違って他のldifを上書きしたりしないように注意。&lt;br /&gt;
&lt;br /&gt;
新しいユーザーはフルネームが Shiroh EMIYA, ユーザー名が shiroh であるものとして説明する。&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;gt; cp template.ldif 2020_shiroh.ldif&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
2020と書いたのは2020年度に追加したユーザーであることを明らかとするため。&lt;br /&gt;
&lt;br /&gt;
で、2020_shiroh.ldif を開くと以下の様になっているんで、&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dn: cn=&amp;lt;Firstname&amp;gt; &amp;lt;LASTNAME&amp;gt;,ou=People,dc=yasunaga-lab,dc=bio,dc=kyutech,dc=ac,dc=jp&lt;br /&gt;
cn: &amp;lt;Firstname&amp;gt; &amp;lt;LASTNAME&amp;gt;&lt;br /&gt;
gidnumber: 1001&lt;br /&gt;
homedirectory: /home/people/&amp;lt;username&amp;gt;&lt;br /&gt;
loginshell: /bin/bash&lt;br /&gt;
objectclass: account&lt;br /&gt;
objectclass: posixAccount&lt;br /&gt;
uid: &amp;lt;username&amp;gt;&lt;br /&gt;
uidnumber: &amp;lt;uidnumber&amp;gt;&lt;br /&gt;
userpassword: &amp;lt;a password encripted with slappasswd&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;...&amp;gt;の部分を適宜置き換えればよい。&lt;br /&gt;
&lt;br /&gt;
例えば、&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dn: cn=Shiroh EMIYA,ou=People,dc=yasunaga-lab,dc=bio,dc=kyutech,dc=ac,dc=jp&lt;br /&gt;
cn: Shiroh EMIYA&lt;br /&gt;
gidnumber: 1001&lt;br /&gt;
homedirectory: /home/people/shiroh&lt;br /&gt;
loginshell: /bin/bash&lt;br /&gt;
objectclass: account&lt;br /&gt;
objectclass: posixAccount&lt;br /&gt;
uid: shiroh&lt;br /&gt;
uidnumber: 12127&lt;br /&gt;
userpassword: {SSHA}PZfbmb0GBrR+YNoWNqtQl5JXWrPSKsZJ&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
で、ldapaddコマンドでLDAPへ登録する。&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;gt; ldapadd –x –D &amp;quot;cn=Manager, dc=yasunaga-lab, dc=bio, dc=kyutech, dc=ac, dc=jp&amp;quot; –W –f 2020_shiroh.ldif&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
LDAP管理パスワードを聞かれるけど、知らなければネットワーク係に問い合わせてください。&lt;br /&gt;
&lt;br /&gt;
成功すれば以下のようなメッセージだけが表示される。&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
adding new entry &amp;quot;cn=Shiroh EMIYA,ou=People,dc=yasunaga-lab,dc=bio,dc=kyutech,dc=ac,dc=jp&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
で、ホームディレクトリ作成する。ホームディレクトリは/net/fs09/homes/people/に置いてあるので、そこに新規ユーザー名と同じディレクトリを作成する。パーミッションもちゃんとアレしてください&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;gt; cd /net/fs09/homes/people&lt;br /&gt;
&amp;gt; mkdir shiroh&lt;br /&gt;
&amp;gt; chown 12127:1001 shiroh&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
で、LDAPクライアントを有効化しているどっかの計算機にログインして、ユーザーとホームディレクトリが有効になっているかどうかチェックしてください。&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;gt; ssh shiroh@cs05&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
完全なる虚無のホームディレクトリを作ったためシェルがすっぴん状態ですから、ほかの人のbashrcとかを見て適当によろしくやってください。もしくはだれかやる気のある人が、ホームディレクトリのテンプレート的なものを作成してください。&lt;br /&gt;
&lt;br /&gt;
== LDAPでユーザー管理していない計算機にアカウントを追加する ==&lt;br /&gt;
&amp;lt;前提&amp;gt;&lt;br /&gt;
* LDAPサーバーに研究室アカウントを登録済みであること&lt;br /&gt;
* アカウントを追加したい計算機で管理者権限を使えること&lt;br /&gt;
* アカウントを追加したい計算機でautofsが有効になっており、LDAPアカウントのホームディレクトリにアクセス可能なこと&lt;br /&gt;
&lt;br /&gt;
&amp;lt;想定状況&amp;gt;&lt;br /&gt;
* LDAPでユーザー管理していない計算機(rc, DL-Boxなど)において、LDAPに登録してあるユーザー所有のファイルやディレクトリに同じ権限でアクセスできるようなアカウントを作りたい。ホームディレクトリも共有したい。&lt;br /&gt;
** LDAPを有効化しようにも既存ユーザーとLDAPユーザー名やグループ名などがバッティングしていてLDAP有効化できない場合とか、宗教上の理由によりその計算機でLDAPを使いたくない場合など。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;step1: LDAPユーザーのUIDとGIDを確認する&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
LDAPでユーザー管理している計算機上で、idコマンドにより確認する。&lt;br /&gt;
&lt;br /&gt;
例えばユーザー名がkttnである場合、&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[13:36:52 kttn@cs05 ~]&lt;br /&gt;
&amp;gt; id kttn&lt;br /&gt;
uid=12118(kttn) gid=1001(yasunaga-lab) groups=1001(yasunaga-lab),10(wheel)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
※ cs06ではgid=1001はLDAP有効化以前の既存グループwcsに持っていかれているので、yasunaga-labではなくwcsと表示される。&lt;br /&gt;
&lt;br /&gt;
上記より、UIDは12118, GIDは1001であると確認できる。Linuxではユーザー識別にユーザー名とグループ名は関係なくて、UIDとGIDが同じであるか否かでユーザー識別がされる。したがって、UIDとGIDが上記で確認したLDAPユーザーのそれらと同じアカウントを作りさえすれば目的は達成できる。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;step2: 既存アカウントおよびグループの確認&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ユーザー名 kttn, uid 12118, グループ名 yasunaga-lab, gid 1001 でアカウントを追加したいものとして説明する。&lt;br /&gt;
&lt;br /&gt;
アカウントを追加したい計算機にログインし、まず同じユーザー名をもつユーザーが存在しないか調べる。&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[kttn@rc ~]$ id -u kttn&lt;br /&gt;
1007&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
遺憾ながらすでにkttnという名前のアカウントを作ってしまっていて、同じアカウント名を使えないため、ユーザー名はkttn2として作ることにする。&lt;br /&gt;
&lt;br /&gt;
同様にグループ名を調べる。&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[kttn@rc ~]$ id -g yasunaga-lab&lt;br /&gt;
id: yasunaga-lab: no such user&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
yasunaga-labという名前の既存グループは存在しないため、yasunaga-labという名前のグループを新たに作成しても良い。&lt;br /&gt;
&lt;br /&gt;
次に同じUIDを持つユーザーが存在しないか調べる。&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[kttn@rc ~]$ id -un 12118&lt;br /&gt;
id: 12118: no such user&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
存在しない。&lt;br /&gt;
&lt;br /&gt;
同様にGID&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[kttn@rc ~]$ id -gn 1001&lt;br /&gt;
wcs&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
残念ながらwcsというグループがすでにGID 1001を割り当てられている。yasunaga-labというグループは作らずに、wcsというグループでアカウントを作ることにする。&lt;br /&gt;
&lt;br /&gt;
まとめると、ユーザー名 kttn2 (uid=12118), 所属グループ wcs (gid=1001) でアカウントを作成することにする。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;step3: アカウント作成&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
管理者権限で実施。&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[root@rc ~]# useradd --home-dir /home/people/kttn --gid 1001 --groups wheel --no-create-home --shell /usr/bin/bash --uid 12118 kttn2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
--shellはLDAPユーザーのそれと同じにする。--shellのパスはOSによって違うかもしれないが、centos7の場合bashは/usr/bin/bashである。Ubuntu16.04の場合は/bin/bash。&lt;br /&gt;
&lt;br /&gt;
--groupsは追加のグループを指定していて、centos7ではwheelを追加するとsudoコマンド使用が可能になる。&lt;br /&gt;
&lt;br /&gt;
--home-dirは、LDAPユーザーで使っているホームディレクトリを指定すること！&lt;br /&gt;
&lt;br /&gt;
次にパスワードの設定。&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[root@rc ~]# passwd kttn2&lt;br /&gt;
Changing password for user kttn2.&lt;br /&gt;
New password:&lt;br /&gt;
Retype new password:&lt;br /&gt;
passwd: all authentication tokens updated successfully.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
LDAPユーザーのそれと同じにしとくが吉。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;step4: 確認&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
suコマンドで追加したユーザーになってみる。&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[root@rc ~]# su kttn2   &lt;br /&gt;
[14:32:31 kttn2@rc /root] &lt;br /&gt;
&amp;gt; cd&lt;br /&gt;
&lt;br /&gt;
[14:32:31 kttn2@rc ~]&lt;br /&gt;
&amp;gt; ls&lt;br /&gt;
ビデオ        デスクトップ  docker     pyenv-init.sh  scripts            tmp   画像&lt;br /&gt;
ダウンロード  ドキュメント  Downloads  R              softwares          web   音楽&lt;br /&gt;
テンプレート  Desktop       perl5      repos          thinclient_drives  公開&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
問題なくホームディレクトリが見れている。あとは念のためファイル作れるかとか消せるかとかをチェックすればよい。&lt;br /&gt;
&lt;br /&gt;
もちろん外側からsshするときは新たに作成したユーザー名で、&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ssh kttn2@rc&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
とかやる。&lt;br /&gt;
&lt;br /&gt;
=ウェブサーバー関連=&lt;br /&gt;
== 特定のIPアドレスをアクセス禁止にする ==&lt;br /&gt;
Scientific Linux 6の場合。&lt;br /&gt;
&lt;br /&gt;
ターミナルでログインし、/etc/sysconfig/iptables をroot権限で開き、以下の書式でIPを追記する。&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
-A INPUT -s &amp;lt;IP address&amp;gt;/&amp;lt;subnet bit数&amp;gt; -p tcp -j REJECT&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
例えば192.0.2.xxx からのアクセスを禁止するには、192.0.2.0/24 と書く。udpアクセスを禁止する場合はtcpの代わりにudpと書く。&lt;br /&gt;
&lt;br /&gt;
上記を編集した後、以下によりiptablesをリロードして設定を反映させる。&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
service iptables restart&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
iptablesを再起動すると、ごくわずかな時間だがiptablesによるアクセス管理が無効になるようで、その間アクセスが多くなったりする。&lt;br /&gt;
&lt;br /&gt;
= ロケール =&lt;br /&gt;
== CentOS7 ==&lt;br /&gt;
以下コマンドでロケールを指定し、設定を反映させる。&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo localectl set-locale LANG=ja_JP.UTF-8&lt;br /&gt;
source /etc/locale.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
簡単にウェブを探しても、システム全体でこれを永続させるような方法が見当たらず。システムの環境変数としてLANG=ja_JP.UTF-8を指定すればいいような気もするが...&lt;br /&gt;
&lt;br /&gt;
ユーザーの.bash_profileに、以下を追記する。&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
LANG=ja_JP.UTF-8&lt;br /&gt;
export LANG&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
ログイン直後はロケール設定失敗みたいなエラーが出てくるかもしれないが、それを除けば日本語コンソール環境みたいになる。&lt;br /&gt;
&lt;br /&gt;
== CentOS7 Docker ==&lt;br /&gt;
Dockerの場合はlocalectfを使用できないので、以下コマンドを使う。nvidia/cudaのcentos7イメージの場合はこれだけでいける、はず。&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo localedef -f UTF-8 -i ja_JP ja_JP.UTF-8&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ubuntu 18.04 Docker ==&lt;br /&gt;
以下でokだった。&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo apt install language-pack-ja-base&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= BASH =&lt;br /&gt;
== ディレクトリスタック ==&lt;br /&gt;
複数のディレクトリパスをディレクトリスタックに記憶しておき、ディレクトリ移動を楽にする仕組み。&lt;br /&gt;
&lt;br /&gt;
* ディレクトリを移動するとともに、ディレクトリスタックに追加するコマンド&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
pushd &amp;lt;行先ディレクトリ&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 現在のディレクトリスタックの表示&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dirs -v&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
1カラム目がディレクトリスタックにおけるそのディレクトリの識別番号。&lt;br /&gt;
&lt;br /&gt;
* ディレクトリスタックの中の特定のディレクトリへ移動&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# 識別番号を確認&lt;br /&gt;
dirs -v&lt;br /&gt;
# 移動(+記号を忘れずに)&lt;br /&gt;
pushd +&amp;lt;識別番号&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= SSH =&lt;br /&gt;
== リモートマシンでコマンドだけ実行する ==&lt;br /&gt;
リモートで実行したいコマンドをいつものsshコマンドの後ろに書くだけ。クォートは不要。&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ssh user@host command&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Kttn</name></author>	</entry>

	<entry>
		<id>https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/mediawiki</id>
		<title>mediawiki</title>
		<link rel="alternate" type="text/html" href="https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/mediawiki"/>
				<updated>2020-11-17T08:24:02Z</updated>
		
		<summary type="html">&lt;p&gt;Kttn: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== データの埋め込み表示 ==&lt;br /&gt;
=== 画像ファイルを埋め込んで表示する ===&lt;br /&gt;
* 「ファイルをアップロード」から画像ファイルをアップロードする。このとき、ファイル名をコピっておく。&lt;br /&gt;
* 例えばアップロードしたファイル名がhoge.pngならば、以下の書式で本文に記述すればよい。&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[[File:hoge.png]]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 画像が大きすぎる場合などは大きさを制限すればよい。&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# 縦を400ピクセルに制限&lt;br /&gt;
[[File:hoge.png|x400px]]&lt;br /&gt;
&lt;br /&gt;
# 幅を200ピクセルに制限&lt;br /&gt;
[[File:hoge.png|200px]]&lt;br /&gt;
&lt;br /&gt;
# 幅200ピクセル、縦400ピクセルに制限&lt;br /&gt;
[[File:hoge.png|200x400px]]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 公式ドキュメント&lt;br /&gt;
** https://www.mediawiki.org/wiki/Help:Images/ja&lt;br /&gt;
&lt;br /&gt;
== 内部リンク ==&lt;br /&gt;
* 同じMediawiki内のコンテンツへのリンクを内部リンクと呼ぶ。&lt;br /&gt;
=== 同一ページ内の節への内部リンク ===&lt;br /&gt;
例えば本ページの「データの埋め込み表示」節へのリンクを貼るには以下の様にする。&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[[#データの埋め込み表示]]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
実際やってみた結果⇒ [[#データの埋め込み表示]]&lt;br /&gt;
&lt;br /&gt;
ハッシュ記号を消したいとか、別の文字列に置き換えるには、以下の様に置き換え文字列をパイプ記号 | に続けて書けばよい。&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[[#データの埋め込み表示|別の文字列]]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
実際やってみた結果⇒ [[#データの埋め込み表示|別の文字列]]&lt;/div&gt;</summary>
		<author><name>Kttn</name></author>	</entry>

	<entry>
		<id>https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/Docker%E3%81%A7cryoSPARC%E3%82%AF%E3%83%A9%E3%82%B9%E3%82%BF</id>
		<title>DockerでcryoSPARCクラスタ</title>
		<link rel="alternate" type="text/html" href="https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/Docker%E3%81%A7cryoSPARC%E3%82%AF%E3%83%A9%E3%82%B9%E3%82%BF"/>
				<updated>2020-11-17T08:17:42Z</updated>
		
		<summary type="html">&lt;p&gt;Kttn: /* ファイアウォール設定 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== この記事について ==&lt;br /&gt;
cryoSPARCはインストールで問題が起きる場合がある。Dockerで動かせるようにすれば、Dockerが使えるマシンがあればおおむねどこでもcryoSPARCを動かせるようになる。&lt;br /&gt;
&lt;br /&gt;
単一ノードでcryoSPARCを使うだけれあればすでに作成済みのDockerイメージ( https://github.com/yasunaga-lab/docker/tree/master/cryosparc )が使える。複数ノードでcryoSPARCを動かしてクラスタを作るためにはDocker間の通信設定などが必要になる。ここにそのあたりの方法を書き残しておく。&lt;br /&gt;
&lt;br /&gt;
== Docker swarmによる(仮想)ネットワーク構築 ==&lt;br /&gt;
異なるホストマシンの上に載っているDockerを相互接続するためにswarmを構成したうえで、cryoSPARCコンテナ間通信用のoverlayネットワークを作成する。(参考： [[Docker関連]]  )&lt;br /&gt;
&lt;br /&gt;
=== ファイアウォール設定 ===&lt;br /&gt;
Docker間の通信に必要なポートを開ける必要がある。こちらを参照⇒ https://docs.docker.com/network/overlay/#create-an-overlay-network&lt;br /&gt;
&lt;br /&gt;
==== CentOS 7 ====&lt;br /&gt;
CentOSの場合はfirewall-cmdでポートを開けることができる。クラスタに参加するホストマシンのすべてで実行する必要がある。(firewall-cmdについて参考： [[Linux関連#ネットワーク関連]])&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;gt; sudo firewall-cmd --zone=public --add-port=2377/tcp --add-port=7946/tcp --add-port=7946/udp --add-port=4789/udp&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
上記だけだと設定は永続的ではなく、ホストマシンを再起動するとポートが再び閉じてしまうので、永続化させたい場合は --permanent オプションをつけること。&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;gt; sudo firewall-cmd --zone=public --add-port=2377/tcp --add-port=7946/tcp --add-port=7946/udp --add-port=4789/udp --permanent&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Ubuntu 18.04 LTS ====&lt;br /&gt;
ufw (Ubuntu firewall)を使うが、未調査。&lt;br /&gt;
&lt;br /&gt;
=== Swarmの構成 ===&lt;br /&gt;
クラスタに参加させたいホストマシン達のDockerでswarmを構成する。Swarmにはマネージャーノードとワーカーノードの概念がある。&lt;br /&gt;
&lt;br /&gt;
まずはマネージャーノードにしたいホストマシンにて以下を実行する。&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;gt; docker swarm init&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
すると以下のような文字列が出力されるから、これをワーカーノードとしてクラスタに参加させたいホストマシンのそれぞれで実行すればよい。&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
docker swarm join --token &amp;lt;トークン文字列&amp;gt; &amp;lt;マネージャーノードのIPアドレス&amp;gt;:2377&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
成功すれば&amp;quot;This node joined a swarm as a worker.&amp;quot;と表示される。&lt;br /&gt;
&lt;br /&gt;
あとあと上記のコマンドを確認したい場合は、マネージャーノードにて&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;gt; docker swarm join-token worker&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
とすれば、ワーカーノード追加用のコマンド(トークン文字列も含めて)を確認できる。&lt;br /&gt;
&lt;br /&gt;
現在swarmに加わっているホストマシンの一覧を確認するには、&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;gt; docker node ls&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
マネージャー、ワーカーとややこしいことを書いたが、たぶん、swarm上でサービス (Dockerの用語)を動かす時に必要になる役割で、今回のようにそれぞれのホストでcryoSPARCコンテナを動かし、それを相互接続する、というだけであれば、どれをマネージャーにするかなどはあまり関係ないのではないかとは思う。&lt;br /&gt;
&lt;br /&gt;
=== Overlayネットワークの作成 ===&lt;br /&gt;
Swarmのマネージャーノードにて、コンテナ間をつなぐためのoverlayネットワークを作成する。ここでは、cryosparc-netという名前で作ってみる。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;gt; docker network create --driver=overlay --attachable cryosparc-net&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
これをワーカーノードでやる必要はない。マネージャーノードで作ればワーカーノードからも利用可能になる。&lt;br /&gt;
&lt;br /&gt;
ネットワークの一覧を確認する。cryosparc-netがswarmをスコープとして作られていることが確認できる。&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;gt; docker network ls&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== cryoSPARCクラスタ構築 ==&lt;br /&gt;
クラスタに加えたいノードのそれぞれでcryoSPARCを動かす能力のあるdockerコンテナを動かし、それらをcryosparc-netに参加させ、cryoSPARCのマスターとして使いたいコンテナでのみcryoSPARCのマスターインストールをして、必要ならワーカーもインストールし、他のコンテナではワーカーのみインストールする + α をすればクラスタ構築できた。cryoSPARCのインストール場所やデータベース、プロジェクトディレクトリなどなどは、どのホスト・コンテナからもマウント可能なネットワークドライブに置く必要があります。&lt;br /&gt;
&lt;br /&gt;
手順が煩雑なのでいずれ整理して書きます。(各ホストマシンでコンテナを動かして、同一の仮想ネットワーク上に載せることさえできれば、あとは通常のcryoSPARC master workerインストールと同じです。)&lt;br /&gt;
&lt;br /&gt;
=== コンテナをcryosparc-netに参加させる方法 ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;gt; docker network connect cryosparc-net &amp;lt;コンテナ名&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== cryoSPARCワーカーを追加する方法 ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;gt; cryosparcw connect --worker &amp;lt;ワーカーコンテナ名&amp;gt; --master &amp;lt;マスターコンテナ名&amp;gt; --port 39000 --ssdpath &amp;lt;SSDのパス&amp;gt; --lane &amp;lt;レーン名&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
デフォルトのレーン名は default である。&lt;br /&gt;
&lt;br /&gt;
新しいレーンを作る場合は、--newlaneフラグを立てたうえで--lane で新しいレーン名を指定する。&lt;br /&gt;
&lt;br /&gt;
--ssdquota によりSSDの使用可能量(MB)を適宜指定したほうがよいだろう。&lt;br /&gt;
&lt;br /&gt;
=== ワーカーの設定変更 ===&lt;br /&gt;
ワーカーの設定を一部変更するには、--updateフラグを立てたうえで、変更したいオプション値を指定すればよい。例えばssdquotaを100GBに制限したければ、&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;gt; cryosparcw connect --worker &amp;lt;ワーカーコンテナ名&amp;gt; --master &amp;lt;マスターコンテナ名&amp;gt; --update --ssdquota 100000&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
とする。workerとmasterは指定が必要。&lt;br /&gt;
&lt;br /&gt;
=== cryosparcw connectのエラー ===&lt;br /&gt;
以下のようなエラーが出た場合は、&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 ---------------------------------------------------------------&lt;br /&gt;
  CRYOSPARC CONNECT --------------------------------------------&lt;br /&gt;
 ---------------------------------------------------------------&lt;br /&gt;
  Attempting to register worker csparc-worker-DL-Box to command csparc-master-worker-cs08:39002&lt;br /&gt;
Traceback (most recent call last):&lt;br /&gt;
  File &amp;quot;bin/connect.py&amp;quot;, line 84, in &amp;lt;module&amp;gt;&lt;br /&gt;
    print     &amp;quot;  Connecting as unix user %s&amp;quot; % (os.environ['USER'])&lt;br /&gt;
  File &amp;quot;/net/fs10/work02/csparc/cryosparc2_worker/deps/anaconda/lib/python2.7/UserDict.py&amp;quot;, line 40, in __getitem__&lt;br /&gt;
    raise KeyError(key)&lt;br /&gt;
KeyError: 'USER'&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
USER環境変数が設定されていない。cryoSPARCのユーザー名(cryoSPARCが管理しているユーザー名ではなくて、計算機システム側のユーザー名)がcryosparc_userだとすると、&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;gt; export USER=cryosparc_user&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
としてから再度connectをすれば大丈夫(なはず)。&lt;br /&gt;
&lt;br /&gt;
== ホストマシンを再起動した後のクラスタの復旧 ==&lt;br /&gt;
停止したコンテナをdocker startで再稼働するとき、swarmのマスターではうまく行くがワーカーでは失敗するエラーが起きた。&lt;br /&gt;
エラーがの内容(例)は&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Error response from daemon: Could not attach to network asuaxn22bff1sq8pqqay2sg64: context deadline exceeded&lt;br /&gt;
Error: failed to start containers: csparc-worker-cs06&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
マスターノードで docker node ls すると、ワーカーノードのSTATUSが軒並み Down になっていて、dockerのネットワークが駄目な感じがあった。が、修復の方法がよくわからず、頓挫中。&lt;br /&gt;
&lt;br /&gt;
=== 原因 ===&lt;br /&gt;
[[#ファイアウォール設定|ファイアウォール設定]]でswarm通信用のポートをfirewall-cmdで開けるが、--permanentオプションを付けて実行しないと、計算機再起動した際に設定が消えるらしい。上記問題が出た環境は--permanetを付けずにポートを開いていたので、それゆえ再起動した後にswarm通信ができず、各ノードのSTATUSがDownとなっていたと考えられる。(実際に検証する前にネットワーク設定を消してしまったので検証はできていない)&lt;/div&gt;</summary>
		<author><name>Kttn</name></author>	</entry>

	<entry>
		<id>https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/Docker%E3%81%A7cryoSPARC%E3%82%AF%E3%83%A9%E3%82%B9%E3%82%BF</id>
		<title>DockerでcryoSPARCクラスタ</title>
		<link rel="alternate" type="text/html" href="https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/Docker%E3%81%A7cryoSPARC%E3%82%AF%E3%83%A9%E3%82%B9%E3%82%BF"/>
				<updated>2020-11-17T08:14:59Z</updated>
		
		<summary type="html">&lt;p&gt;Kttn: /* ファイアウォール設定 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== この記事について ==&lt;br /&gt;
cryoSPARCはインストールで問題が起きる場合がある。Dockerで動かせるようにすれば、Dockerが使えるマシンがあればおおむねどこでもcryoSPARCを動かせるようになる。&lt;br /&gt;
&lt;br /&gt;
単一ノードでcryoSPARCを使うだけれあればすでに作成済みのDockerイメージ( https://github.com/yasunaga-lab/docker/tree/master/cryosparc )が使える。複数ノードでcryoSPARCを動かしてクラスタを作るためにはDocker間の通信設定などが必要になる。ここにそのあたりの方法を書き残しておく。&lt;br /&gt;
&lt;br /&gt;
== Docker swarmによる(仮想)ネットワーク構築 ==&lt;br /&gt;
異なるホストマシンの上に載っているDockerを相互接続するためにswarmを構成したうえで、cryoSPARCコンテナ間通信用のoverlayネットワークを作成する。(参考： [[Docker関連]]  )&lt;br /&gt;
&lt;br /&gt;
=== ファイアウォール設定 ===&lt;br /&gt;
Docker間の通信に必要なポートを開ける必要がある。こちらを参照⇒ https://docs.docker.com/network/overlay/#create-an-overlay-network&lt;br /&gt;
&lt;br /&gt;
CentOSの場合はfirewall-cmdでポートを開けることができる。クラスタに参加するホストマシンのすべてで実行する必要がある。(firewall-cmdについて参考： [[Linux関連#ネットワーク関連]])&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;gt; sudo firewall-cmd --zone=public --add-port=2377/tcp --add-port=7946/tcp --add-port=7946/udp --add-port=4789/udp&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
上記だけだと設定は永続的ではなく、ホストマシンを再起動するとポートが再び閉じてしまうので、永続化させたい場合は --permanent オプションをつけること。&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;gt; sudo firewall-cmd --zone=public --add-port=2377/tcp --add-port=7946/tcp --add-port=7946/udp --add-port=4789/udp --permanent&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Swarmの構成 ===&lt;br /&gt;
クラスタに参加させたいホストマシン達のDockerでswarmを構成する。Swarmにはマネージャーノードとワーカーノードの概念がある。&lt;br /&gt;
&lt;br /&gt;
まずはマネージャーノードにしたいホストマシンにて以下を実行する。&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;gt; docker swarm init&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
すると以下のような文字列が出力されるから、これをワーカーノードとしてクラスタに参加させたいホストマシンのそれぞれで実行すればよい。&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
docker swarm join --token &amp;lt;トークン文字列&amp;gt; &amp;lt;マネージャーノードのIPアドレス&amp;gt;:2377&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
成功すれば&amp;quot;This node joined a swarm as a worker.&amp;quot;と表示される。&lt;br /&gt;
&lt;br /&gt;
あとあと上記のコマンドを確認したい場合は、マネージャーノードにて&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;gt; docker swarm join-token worker&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
とすれば、ワーカーノード追加用のコマンド(トークン文字列も含めて)を確認できる。&lt;br /&gt;
&lt;br /&gt;
現在swarmに加わっているホストマシンの一覧を確認するには、&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;gt; docker node ls&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
マネージャー、ワーカーとややこしいことを書いたが、たぶん、swarm上でサービス (Dockerの用語)を動かす時に必要になる役割で、今回のようにそれぞれのホストでcryoSPARCコンテナを動かし、それを相互接続する、というだけであれば、どれをマネージャーにするかなどはあまり関係ないのではないかとは思う。&lt;br /&gt;
&lt;br /&gt;
=== Overlayネットワークの作成 ===&lt;br /&gt;
Swarmのマネージャーノードにて、コンテナ間をつなぐためのoverlayネットワークを作成する。ここでは、cryosparc-netという名前で作ってみる。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;gt; docker network create --driver=overlay --attachable cryosparc-net&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
これをワーカーノードでやる必要はない。マネージャーノードで作ればワーカーノードからも利用可能になる。&lt;br /&gt;
&lt;br /&gt;
ネットワークの一覧を確認する。cryosparc-netがswarmをスコープとして作られていることが確認できる。&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;gt; docker network ls&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== cryoSPARCクラスタ構築 ==&lt;br /&gt;
クラスタに加えたいノードのそれぞれでcryoSPARCを動かす能力のあるdockerコンテナを動かし、それらをcryosparc-netに参加させ、cryoSPARCのマスターとして使いたいコンテナでのみcryoSPARCのマスターインストールをして、必要ならワーカーもインストールし、他のコンテナではワーカーのみインストールする + α をすればクラスタ構築できた。cryoSPARCのインストール場所やデータベース、プロジェクトディレクトリなどなどは、どのホスト・コンテナからもマウント可能なネットワークドライブに置く必要があります。&lt;br /&gt;
&lt;br /&gt;
手順が煩雑なのでいずれ整理して書きます。(各ホストマシンでコンテナを動かして、同一の仮想ネットワーク上に載せることさえできれば、あとは通常のcryoSPARC master workerインストールと同じです。)&lt;br /&gt;
&lt;br /&gt;
=== コンテナをcryosparc-netに参加させる方法 ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;gt; docker network connect cryosparc-net &amp;lt;コンテナ名&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== cryoSPARCワーカーを追加する方法 ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;gt; cryosparcw connect --worker &amp;lt;ワーカーコンテナ名&amp;gt; --master &amp;lt;マスターコンテナ名&amp;gt; --port 39000 --ssdpath &amp;lt;SSDのパス&amp;gt; --lane &amp;lt;レーン名&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
デフォルトのレーン名は default である。&lt;br /&gt;
&lt;br /&gt;
新しいレーンを作る場合は、--newlaneフラグを立てたうえで--lane で新しいレーン名を指定する。&lt;br /&gt;
&lt;br /&gt;
--ssdquota によりSSDの使用可能量(MB)を適宜指定したほうがよいだろう。&lt;br /&gt;
&lt;br /&gt;
=== ワーカーの設定変更 ===&lt;br /&gt;
ワーカーの設定を一部変更するには、--updateフラグを立てたうえで、変更したいオプション値を指定すればよい。例えばssdquotaを100GBに制限したければ、&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;gt; cryosparcw connect --worker &amp;lt;ワーカーコンテナ名&amp;gt; --master &amp;lt;マスターコンテナ名&amp;gt; --update --ssdquota 100000&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
とする。workerとmasterは指定が必要。&lt;br /&gt;
&lt;br /&gt;
=== cryosparcw connectのエラー ===&lt;br /&gt;
以下のようなエラーが出た場合は、&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 ---------------------------------------------------------------&lt;br /&gt;
  CRYOSPARC CONNECT --------------------------------------------&lt;br /&gt;
 ---------------------------------------------------------------&lt;br /&gt;
  Attempting to register worker csparc-worker-DL-Box to command csparc-master-worker-cs08:39002&lt;br /&gt;
Traceback (most recent call last):&lt;br /&gt;
  File &amp;quot;bin/connect.py&amp;quot;, line 84, in &amp;lt;module&amp;gt;&lt;br /&gt;
    print     &amp;quot;  Connecting as unix user %s&amp;quot; % (os.environ['USER'])&lt;br /&gt;
  File &amp;quot;/net/fs10/work02/csparc/cryosparc2_worker/deps/anaconda/lib/python2.7/UserDict.py&amp;quot;, line 40, in __getitem__&lt;br /&gt;
    raise KeyError(key)&lt;br /&gt;
KeyError: 'USER'&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
USER環境変数が設定されていない。cryoSPARCのユーザー名(cryoSPARCが管理しているユーザー名ではなくて、計算機システム側のユーザー名)がcryosparc_userだとすると、&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;gt; export USER=cryosparc_user&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
としてから再度connectをすれば大丈夫(なはず)。&lt;br /&gt;
&lt;br /&gt;
== ホストマシンを再起動した後のクラスタの復旧 ==&lt;br /&gt;
停止したコンテナをdocker startで再稼働するとき、swarmのマスターではうまく行くがワーカーでは失敗するエラーが起きた。&lt;br /&gt;
エラーがの内容(例)は&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Error response from daemon: Could not attach to network asuaxn22bff1sq8pqqay2sg64: context deadline exceeded&lt;br /&gt;
Error: failed to start containers: csparc-worker-cs06&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
マスターノードで docker node ls すると、ワーカーノードのSTATUSが軒並み Down になっていて、dockerのネットワークが駄目な感じがあった。が、修復の方法がよくわからず、頓挫中。&lt;br /&gt;
&lt;br /&gt;
=== 原因 ===&lt;br /&gt;
[[#ファイアウォール設定|ファイアウォール設定]]でswarm通信用のポートをfirewall-cmdで開けるが、--permanentオプションを付けて実行しないと、計算機再起動した際に設定が消えるらしい。上記問題が出た環境は--permanetを付けずにポートを開いていたので、それゆえ再起動した後にswarm通信ができず、各ノードのSTATUSがDownとなっていたと考えられる。(実際に検証する前にネットワーク設定を消してしまったので検証はできていない)&lt;/div&gt;</summary>
		<author><name>Kttn</name></author>	</entry>

	<entry>
		<id>https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/Docker%E3%81%A7cryoSPARC%E3%82%AF%E3%83%A9%E3%82%B9%E3%82%BF</id>
		<title>DockerでcryoSPARCクラスタ</title>
		<link rel="alternate" type="text/html" href="https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/Docker%E3%81%A7cryoSPARC%E3%82%AF%E3%83%A9%E3%82%B9%E3%82%BF"/>
				<updated>2020-11-17T08:08:41Z</updated>
		
		<summary type="html">&lt;p&gt;Kttn: /* ホストマシンを再起動した後のクラスタの復旧 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== この記事について ==&lt;br /&gt;
cryoSPARCはインストールで問題が起きる場合がある。Dockerで動かせるようにすれば、Dockerが使えるマシンがあればおおむねどこでもcryoSPARCを動かせるようになる。&lt;br /&gt;
&lt;br /&gt;
単一ノードでcryoSPARCを使うだけれあればすでに作成済みのDockerイメージ( https://github.com/yasunaga-lab/docker/tree/master/cryosparc )が使える。複数ノードでcryoSPARCを動かしてクラスタを作るためにはDocker間の通信設定などが必要になる。ここにそのあたりの方法を書き残しておく。&lt;br /&gt;
&lt;br /&gt;
== Docker swarmによる(仮想)ネットワーク構築 ==&lt;br /&gt;
異なるホストマシンの上に載っているDockerを相互接続するためにswarmを構成したうえで、cryoSPARCコンテナ間通信用のoverlayネットワークを作成する。(参考： [[Docker関連]]  )&lt;br /&gt;
&lt;br /&gt;
=== ファイアウォール設定 ===&lt;br /&gt;
Docker間の通信に必要なポートを開ける必要がある。こちらを参照⇒ https://docs.docker.com/network/overlay/#create-an-overlay-network&lt;br /&gt;
&lt;br /&gt;
CentOSの場合はfirewall-cmdでポートを開けることができる。クラスタに参加するホストマシンのすべてで実行する必要がある。(firewall-cmdについて参考： [[Linux関連#ネットワーク関連]])&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;gt; sudo firewall-cmd --zone=public --add-port=2377/tcp --add-port=7946/tcp --add-port=7946/udp --add-port=4789/udp&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Swarmの構成 ===&lt;br /&gt;
クラスタに参加させたいホストマシン達のDockerでswarmを構成する。Swarmにはマネージャーノードとワーカーノードの概念がある。&lt;br /&gt;
&lt;br /&gt;
まずはマネージャーノードにしたいホストマシンにて以下を実行する。&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;gt; docker swarm init&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
すると以下のような文字列が出力されるから、これをワーカーノードとしてクラスタに参加させたいホストマシンのそれぞれで実行すればよい。&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
docker swarm join --token &amp;lt;トークン文字列&amp;gt; &amp;lt;マネージャーノードのIPアドレス&amp;gt;:2377&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
成功すれば&amp;quot;This node joined a swarm as a worker.&amp;quot;と表示される。&lt;br /&gt;
&lt;br /&gt;
あとあと上記のコマンドを確認したい場合は、マネージャーノードにて&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;gt; docker swarm join-token worker&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
とすれば、ワーカーノード追加用のコマンド(トークン文字列も含めて)を確認できる。&lt;br /&gt;
&lt;br /&gt;
現在swarmに加わっているホストマシンの一覧を確認するには、&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;gt; docker node ls&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
マネージャー、ワーカーとややこしいことを書いたが、たぶん、swarm上でサービス (Dockerの用語)を動かす時に必要になる役割で、今回のようにそれぞれのホストでcryoSPARCコンテナを動かし、それを相互接続する、というだけであれば、どれをマネージャーにするかなどはあまり関係ないのではないかとは思う。&lt;br /&gt;
&lt;br /&gt;
=== Overlayネットワークの作成 ===&lt;br /&gt;
Swarmのマネージャーノードにて、コンテナ間をつなぐためのoverlayネットワークを作成する。ここでは、cryosparc-netという名前で作ってみる。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;gt; docker network create --driver=overlay --attachable cryosparc-net&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
これをワーカーノードでやる必要はない。マネージャーノードで作ればワーカーノードからも利用可能になる。&lt;br /&gt;
&lt;br /&gt;
ネットワークの一覧を確認する。cryosparc-netがswarmをスコープとして作られていることが確認できる。&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;gt; docker network ls&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== cryoSPARCクラスタ構築 ==&lt;br /&gt;
クラスタに加えたいノードのそれぞれでcryoSPARCを動かす能力のあるdockerコンテナを動かし、それらをcryosparc-netに参加させ、cryoSPARCのマスターとして使いたいコンテナでのみcryoSPARCのマスターインストールをして、必要ならワーカーもインストールし、他のコンテナではワーカーのみインストールする + α をすればクラスタ構築できた。cryoSPARCのインストール場所やデータベース、プロジェクトディレクトリなどなどは、どのホスト・コンテナからもマウント可能なネットワークドライブに置く必要があります。&lt;br /&gt;
&lt;br /&gt;
手順が煩雑なのでいずれ整理して書きます。(各ホストマシンでコンテナを動かして、同一の仮想ネットワーク上に載せることさえできれば、あとは通常のcryoSPARC master workerインストールと同じです。)&lt;br /&gt;
&lt;br /&gt;
=== コンテナをcryosparc-netに参加させる方法 ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;gt; docker network connect cryosparc-net &amp;lt;コンテナ名&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== cryoSPARCワーカーを追加する方法 ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;gt; cryosparcw connect --worker &amp;lt;ワーカーコンテナ名&amp;gt; --master &amp;lt;マスターコンテナ名&amp;gt; --port 39000 --ssdpath &amp;lt;SSDのパス&amp;gt; --lane &amp;lt;レーン名&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
デフォルトのレーン名は default である。&lt;br /&gt;
&lt;br /&gt;
新しいレーンを作る場合は、--newlaneフラグを立てたうえで--lane で新しいレーン名を指定する。&lt;br /&gt;
&lt;br /&gt;
--ssdquota によりSSDの使用可能量(MB)を適宜指定したほうがよいだろう。&lt;br /&gt;
&lt;br /&gt;
=== ワーカーの設定変更 ===&lt;br /&gt;
ワーカーの設定を一部変更するには、--updateフラグを立てたうえで、変更したいオプション値を指定すればよい。例えばssdquotaを100GBに制限したければ、&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;gt; cryosparcw connect --worker &amp;lt;ワーカーコンテナ名&amp;gt; --master &amp;lt;マスターコンテナ名&amp;gt; --update --ssdquota 100000&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
とする。workerとmasterは指定が必要。&lt;br /&gt;
&lt;br /&gt;
=== cryosparcw connectのエラー ===&lt;br /&gt;
以下のようなエラーが出た場合は、&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 ---------------------------------------------------------------&lt;br /&gt;
  CRYOSPARC CONNECT --------------------------------------------&lt;br /&gt;
 ---------------------------------------------------------------&lt;br /&gt;
  Attempting to register worker csparc-worker-DL-Box to command csparc-master-worker-cs08:39002&lt;br /&gt;
Traceback (most recent call last):&lt;br /&gt;
  File &amp;quot;bin/connect.py&amp;quot;, line 84, in &amp;lt;module&amp;gt;&lt;br /&gt;
    print     &amp;quot;  Connecting as unix user %s&amp;quot; % (os.environ['USER'])&lt;br /&gt;
  File &amp;quot;/net/fs10/work02/csparc/cryosparc2_worker/deps/anaconda/lib/python2.7/UserDict.py&amp;quot;, line 40, in __getitem__&lt;br /&gt;
    raise KeyError(key)&lt;br /&gt;
KeyError: 'USER'&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
USER環境変数が設定されていない。cryoSPARCのユーザー名(cryoSPARCが管理しているユーザー名ではなくて、計算機システム側のユーザー名)がcryosparc_userだとすると、&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;gt; export USER=cryosparc_user&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
としてから再度connectをすれば大丈夫(なはず)。&lt;br /&gt;
&lt;br /&gt;
== ホストマシンを再起動した後のクラスタの復旧 ==&lt;br /&gt;
停止したコンテナをdocker startで再稼働するとき、swarmのマスターではうまく行くがワーカーでは失敗するエラーが起きた。&lt;br /&gt;
エラーがの内容(例)は&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Error response from daemon: Could not attach to network asuaxn22bff1sq8pqqay2sg64: context deadline exceeded&lt;br /&gt;
Error: failed to start containers: csparc-worker-cs06&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
マスターノードで docker node ls すると、ワーカーノードのSTATUSが軒並み Down になっていて、dockerのネットワークが駄目な感じがあった。が、修復の方法がよくわからず、頓挫中。&lt;br /&gt;
&lt;br /&gt;
=== 原因 ===&lt;br /&gt;
[[#ファイアウォール設定|ファイアウォール設定]]でswarm通信用のポートをfirewall-cmdで開けるが、--permanentオプションを付けて実行しないと、計算機再起動した際に設定が消えるらしい。上記問題が出た環境は--permanetを付けずにポートを開いていたので、それゆえ再起動した後にswarm通信ができず、各ノードのSTATUSがDownとなっていたと考えられる。(実際に検証する前にネットワーク設定を消してしまったので検証はできていない)&lt;/div&gt;</summary>
		<author><name>Kttn</name></author>	</entry>

	<entry>
		<id>https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/XML_Schema</id>
		<title>XML Schema</title>
		<link rel="alternate" type="text/html" href="https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/XML_Schema"/>
				<updated>2020-11-16T13:41:08Z</updated>
		
		<summary type="html">&lt;p&gt;Kttn: ページの作成:「== 参考文献 == === 初心者向け === * SEのためのXML Schema入門 ** https://www.atmarkit.co.jp/ait/articles/0312/02/news002.html  == 開発ツール == === Vis...」&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== 参考文献 ==&lt;br /&gt;
=== 初心者向け ===&lt;br /&gt;
* SEのためのXML Schema入門&lt;br /&gt;
** https://www.atmarkit.co.jp/ait/articles/0312/02/news002.html&lt;br /&gt;
&lt;br /&gt;
== 開発ツール ==&lt;br /&gt;
=== Visual Studio ===&lt;br /&gt;
* スキーマ記述時のコーディング支援(補完とかミスの指摘とか)がある&lt;br /&gt;
* 記述内容をツリー構造や絵で可視化できる&lt;br /&gt;
[[File:スクリーンショット_2020-11-16_223058.png|400px]]&lt;/div&gt;</summary>
		<author><name>Kttn</name></author>	</entry>

	<entry>
		<id>https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/mediawiki</id>
		<title>mediawiki</title>
		<link rel="alternate" type="text/html" href="https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/mediawiki"/>
				<updated>2020-11-16T13:40:18Z</updated>
		
		<summary type="html">&lt;p&gt;Kttn: ページの作成:「== 画像ファイルを埋め込んで表示する == * 「ファイルをアップロード」から画像ファイルをアップロードする。このとき、フ...」&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== 画像ファイルを埋め込んで表示する ==&lt;br /&gt;
* 「ファイルをアップロード」から画像ファイルをアップロードする。このとき、ファイル名をコピっておく。&lt;br /&gt;
* 例えばアップロードしたファイル名がhoge.pngならば、以下の書式で本文に記述すればよい。&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[[File:hoge.png]]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 画像が大きすぎる場合などは大きさを制限すればよい。&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# 縦を400ピクセルに制限&lt;br /&gt;
[[File:hoge.png|x400px]]&lt;br /&gt;
&lt;br /&gt;
# 幅を200ピクセルに制限&lt;br /&gt;
[[File:hoge.png|200px]]&lt;br /&gt;
&lt;br /&gt;
# 幅200ピクセル、縦400ピクセルに制限&lt;br /&gt;
[[File:hoge.png|200x400px]]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 公式ドキュメント&lt;br /&gt;
** https://www.mediawiki.org/wiki/Help:Images/ja&lt;/div&gt;</summary>
		<author><name>Kttn</name></author>	</entry>

	<entry>
		<id>https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB:%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88_2020-11-16_223058.png</id>
		<title>ファイル:スクリーンショット 2020-11-16 223058.png</title>
		<link rel="alternate" type="text/html" href="https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB:%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88_2020-11-16_223058.png"/>
				<updated>2020-11-16T13:31:43Z</updated>
		
		<summary type="html">&lt;p&gt;Kttn: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Kttn</name></author>	</entry>

	<entry>
		<id>https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/%E3%83%A1%E3%82%A4%E3%83%B3%E3%83%9A%E3%83%BC%E3%82%B8</id>
		<title>メインページ</title>
		<link rel="alternate" type="text/html" href="https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/%E3%83%A1%E3%82%A4%E3%83%B3%E3%83%9A%E3%83%BC%E3%82%B8"/>
				<updated>2020-11-16T13:23:12Z</updated>
		
		<summary type="html">&lt;p&gt;Kttn: /* その他 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== '''Eospediaにようこそ''' ==&lt;br /&gt;
&lt;br /&gt;
2010年11月05日に、研究室内にEospediaクローズドβ版の運営を開始しました。&amp;lt;br&amp;gt;&lt;br /&gt;
2012年８月に、こちらが電子顕微鏡画像処理システムEosのホームページの本家となるように、オープンにしました。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Eos]]のコマンド説明やその中のアルゴリズムについてなど、幅広い知識を集約できればと思います。また、2012年より開発を開始した[[PIONE]]、2013年度より開発を開始した[[VEM/WITs]]についても同様にこちらでまとめていきます。&amp;lt;br&amp;gt;&lt;br /&gt;
それに加えて、電子顕微鏡画像処理を含む、各種画像処理の基本を学ぶことができるサイトとして運営したいと考えています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Eos]]は、[https://sourceforge.jp/projects/eos/ Eos@sourceforge]上で、[[PIONE]]は、[https://github.com/pione PIONE@github]で開発を進めています。それらをまとめた情報はこちらで展開したいと思います。将来は、大学から離れた方が良いかと考えています。それぞれ開発や利用に興味があるかたはそれぞれのサイトも覗いてみて下さい。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
wikiは「間違いをいかに防ぐか」ではなく、「いかに修正するか」が哲学ですので、&lt;br /&gt;
間違いを恐れず(もちろんデタラメは論外)皆さんの知識とノウハウを自由に書いて頂ければ幸いです。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
只今ホームページに公開していたEosマニュアル(日本語版も含む)の転載作業を進めています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
ちなみに、[http://www.yasunaga-lab.bio.kyutech.ac.jp/Eos/ 英語版]もあります。現在は、日本語版のほうが充実しています。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
また、Eosに関しては、[http://sourceforge.jp/projects/eos/lists/ メーリングリスト]及び[http://sourceforge.jp/projects/eos/forums/ フォーラム]があります。&amp;lt;br&amp;gt;&lt;br /&gt;
Eosの使い方を知りたい方は：eos-users@&amp;lt;br&amp;gt;&lt;br /&gt;
Eosでの開発にご興味のある方は：eos-developers@&amp;lt;br&amp;gt;&lt;br /&gt;
Eosのドキュメント作成のお手伝いを頂ける方は：eos-document@&amp;lt;br&amp;gt;&lt;br /&gt;
にて、是非ともご協力下さい。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
また、facebook上で、Eos User Group[https://www.facebook.com/EosUserGroup]を開設しました。こちらからも発信していくことにします。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
詳細は,安永[mailto:yasunaga@bio.kyutech.ac.jp]までご連絡下さい。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 開発しているシステムの全体像（Eos/PIONE/Zephyr &amp;amp; WITs/VEM) ==&lt;br /&gt;
　現在、電子顕微鏡画像取得・処理・分析のための一連のワークフロー全体を総括するソリューションとして、Eos/PIONE/Zephyr &amp;amp; WITs/VEMとよぶシステムを作っています。システム全体の名前もつけたほうがよい位、Systems of System といった様相になってきています。個々に、当該システムの概要とその目指す姿をまとめておきたいと思います。&lt;br /&gt;
&lt;br /&gt;
　下記のページにまとめておきます。&lt;br /&gt;
[[Eos/PIONE/Zephyr/WITs/VEM システム]]&lt;br /&gt;
&lt;br /&gt;
== '''Eosビギナーズガイド''' ==&lt;br /&gt;
&lt;br /&gt;
=== [[Eos|Eosとは？]] ===&lt;br /&gt;
　Eosとはなにかについて述べます。&lt;br /&gt;
=== [[コマンド|Eosのコマンドとは？]] ===&lt;br /&gt;
　Eosにおけるコマンドについて述べます。&lt;br /&gt;
=== [[Makefile|Eosはどうやって使うの？]] ===&lt;br /&gt;
　Eosにおける[[make]]を用いたコマンドの統合方法について述べます。&lt;br /&gt;
=== [[コマンド一覧|Eosのコマンド一覧表]] ===&lt;br /&gt;
　Eosが提供するコマンドの一覧を示します。&lt;br /&gt;
=== [[機能別コマンド一覧|Eosの機能別コマンド一覧表]] ===&lt;br /&gt;
　Eosが提供するコマンドの機能別一覧を示します。&lt;br /&gt;
&lt;br /&gt;
== Eos/PIONEのインストール方法 ==&lt;br /&gt;
===[[必要な環境|Eosの必要な環境]]===&lt;br /&gt;
&lt;br /&gt;
=== [[ダウンロード|Eosのダウンロード(インストール方法)]] ===&lt;br /&gt;
　Eosのダウンロード方法について述べます。利用するだけであれば、ダウンロードだけで利用することができます。共同開発を進めたい方、機能の要望がある方は、現在、EosはOSDN(旧：SourceForge)にて開発を進めています。是非、ご一緒して下さい。&lt;br /&gt;
&lt;br /&gt;
=== [[インストール方法|Eosのインストール方法（開発・再構築）]] ===&lt;br /&gt;
　Eosのインストール方法について述べます。ここでは、ダウンロードしたファイルから再構築する方法や自分自身が開発したソースコードを運用する方法を述べています。&lt;br /&gt;
&lt;br /&gt;
=== [[PIONEのインストール方法]]===&lt;br /&gt;
　makeに替わる分散プロセス処理プラットフォーム(PIONE)のインストール方法を示します。現在、PIONEはgithubにて開発を進めています。&lt;br /&gt;
&lt;br /&gt;
== '''Eosリファレンス''' ==&lt;br /&gt;
&lt;br /&gt;
=== [[統合コマンド|Eosの提供する統合コマンド]] ===&lt;br /&gt;
　Eosが提供する統合コマンドについて述べます。&lt;br /&gt;
&lt;br /&gt;
=== 統合コマンド：[[PIONE]]===&lt;br /&gt;
　Eosが分散環境、クラウド環境に対応した統合環境として提供するPIONEについて述べます。インストールに関しては[[PIONEのインストール]]を、ブラウザ操作に関しては[[PIONEの起動方法]]や[[PIONE Webclientチュートリアル]]を、[[PIONE定義書]]の作り方や実行方法については[[PIONEチュートリアル]]や[[PIONEチュートリアル-PNML]]を、ログの確認方法は[[PIONEチュートリアル-XES]]を、パッケージの作り方は[[PIONEチュートリアル-package]]を、コマンドの一覧は[[PIONEコマンド一覧]]または[[機能別PIONEコマンド一覧]]を、メソッドの一覧などは[[PIONEの式]]を、その他TIPSなどは[[PIONEのTIPS]]をご覧下さい。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 電子顕微鏡制御統合環境(WITs/VEM) ===&lt;br /&gt;
&lt;br /&gt;
==== 相関顕微鏡のためのシステム ====&lt;br /&gt;
　同一視野の撮影のためのシステムの提供を進めています．[[SerialEM]]に対応する環境として，電子顕微鏡を仮想化するための[[VEM]]，および，[[VEM]]と通信して，電子顕微鏡を制御するための[[WITs]]というシステムに大きく分けて開発を進めています．&lt;br /&gt;
&lt;br /&gt;
下記に[[WITs]]としてのアプリケーションのリストを示します．&lt;br /&gt;
&lt;br /&gt;
[[WITs-CLEM]]: 相関顕微鏡向けのシステムになります．&lt;br /&gt;
&lt;br /&gt;
== '''Eos チュートリアル'''　==&lt;br /&gt;
=== 環境の設定　===&lt;br /&gt;
最初にEosのインストール方法を簡単に説明します。詳細は、[[インストール方法|Eosのインストール方法の詳細]]をご覧下さい。&lt;br /&gt;
&lt;br /&gt;
* [[Eosのインストール|Eosのインストール方法]]&lt;br /&gt;
&lt;br /&gt;
=== Eosでのコマンドの取り扱い　===&lt;br /&gt;
Eosのコマンドの簡単な使い方を説明します。詳細は、[[コマンド|コマンドの詳細]]をご覧下さい。Eosでは、基本はCUIを使ったコマンドの実行により画像処理を進めます。その結果は、ファイルとして保存され、その内容を確認することが出来ます。&lt;br /&gt;
&lt;br /&gt;
* [[Eosのコマンド|Eosのコマンド]]&lt;br /&gt;
&lt;br /&gt;
=== Eosでの画像の取り扱い　===&lt;br /&gt;
Eosで取り扱うことのできる[[画像フォーマット]]と一般的な画像フォーマットからの変換方法を示します。&lt;br /&gt;
* [[画像フォーマット|画像フォーマット]]&lt;br /&gt;
* [[画像フォーマット変換|画像フォーマットの変換]]&lt;br /&gt;
&lt;br /&gt;
=== Eosを使った簡単な画像処理　===&lt;br /&gt;
Eosを使った簡単な画像処理を実行してもらいます。&lt;br /&gt;
* [[簡単な画像処理|簡単な２次元画像処理]]&lt;br /&gt;
&lt;br /&gt;
=== [[チュートリアル一覧]] ===&lt;br /&gt;
ここには、[[Small Tools]]や様々な[[画像処理]]で使用する[[Makefile]]や[[PIONE]]の一覧があります。&lt;br /&gt;
&lt;br /&gt;
=== CTF画像補正　===&lt;br /&gt;
電子顕微鏡画像では、その撮影方法に由来して、コントラストが大きく変調を受けています。ここでは、その画像のコントラストの変調を補正する方法を示します。&lt;br /&gt;
* [[CTF補正|CTFの補正]]&lt;br /&gt;
&lt;br /&gt;
=== 単粒子解析の基礎　===&lt;br /&gt;
　ここでは、単粒子解析の基礎を行います。実際の単粒子解析は、粒子の形やその対称性などを使って探索方法や3次元再構成法を切り替えることができます。&lt;br /&gt;
&lt;br /&gt;
==== [[単粒子解析]]の概要 ====&lt;br /&gt;
　単粒子解析の概要を示します。&lt;br /&gt;
&lt;br /&gt;
==== [[粒子抽出|粒子の抽出]] ====&lt;br /&gt;
　まず、単粒子を抽出します。ここでは、手動で切り出す方法を示します。自動で切り出す方法も各種提案されています。&lt;br /&gt;
&lt;br /&gt;
==== [[２次元画像の分類|２次元画像の分類]] ====&lt;br /&gt;
　２次元画像を分類して、ＳＮ比を上げます。&lt;br /&gt;
&lt;br /&gt;
==== [[参照付投影角度決定|参照像があるときの投影角の決定方法]] ====&lt;br /&gt;
　参照像があるときの投影角の決定方法を説明します。参照像としては、単なる球や楕円体などとすることもあり得ます。参照像がない場合の構造解析法も別途存在しています。&lt;br /&gt;
&lt;br /&gt;
==== [[参照無投影角度決定|参照像がないときの投影角の決定方法]] ====&lt;br /&gt;
　参照画像がないときの投影角の決定方法を示しています。[[コモンライン]]をもちいた[[コモンライン探索]]という方法が一般的です。ただノイズに弱く問題が生じる場合があります。&lt;br /&gt;
&lt;br /&gt;
==== [[３次元再構成・逆投影|３次元再構成・逆投影法]] ====&lt;br /&gt;
　3次元再構成自身を解説します。&lt;br /&gt;
&lt;br /&gt;
==== [[らせん対称をもつ粒子の３次元再構成法]]====&lt;br /&gt;
　アクチンフィラメントなどのらせん対称性をもつ場合のEosでの解析法を紹介します。&lt;br /&gt;
&lt;br /&gt;
==== [[可視化ツール|可視化ツール]] ====&lt;br /&gt;
　できあがった三次元像を可視化するためのツールを紹介します。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====参考資料  ====&lt;br /&gt;
&lt;br /&gt;
===== [[RELION]] =====&lt;br /&gt;
　単粒子解析法のデファクトスタンダードになりつつある[[RELION]]について、解説を準備することにしました。&lt;br /&gt;
少しずつ整理していきます。&lt;br /&gt;
&lt;br /&gt;
===== [[Gautomatch]] =====&lt;br /&gt;
 　粒子抽出のためのプログラムのひとつです。&lt;br /&gt;
&lt;br /&gt;
===== [[cryoDRGN]] =====&lt;br /&gt;
　深層ニューラルネットワークを用いた単粒子3D再構成プログラム[[cryoDRGN]]に関するページです。&lt;br /&gt;
&lt;br /&gt;
===== [[Topaz]] =====&lt;br /&gt;
　深層ニューラルネットワークを用いた単粒子ピッキングプログラム[[Topaz]]に関するページです。&lt;br /&gt;
&lt;br /&gt;
===== [[cryoSPARC]] =====&lt;br /&gt;
　優れたUIを持った単粒子解析パッケージ[[cryoSPARC]]に関するページです。&lt;br /&gt;
&lt;br /&gt;
==== 備考 ====&lt;br /&gt;
　上記のチュートリアル・ページは、2012/09/10-11 単粒子解析Workshopでの資料を元に作成したものです。&lt;br /&gt;
今後もこのサイトを充実させ、ワークショップ等で利用していきたいと考えています。&lt;br /&gt;
&lt;br /&gt;
=== [[電子線トモグラフィー]] ===&lt;br /&gt;
　電子線トモグラフィーとは、同一視野の連続傾斜像から、その視野の３次元画像を再構成する方法です。細胞内の構造や構造多型性をもつタンパク質の構造解析に有効な方法です。&lt;br /&gt;
&lt;br /&gt;
==== [[電子線トモグラフィー]]の概要 ====&lt;br /&gt;
　電子線トモグラフィー法は、同一視野の傾斜シリーズ画像のセットから３次元像を再構成する方法です。ここではその概要を述べます。&lt;br /&gt;
&lt;br /&gt;
==== [[画像の補正]] ====&lt;br /&gt;
　傾斜画像では、視野全体がアンダーフォーカスとなるように、通常の電子顕微鏡撮影よりも大きなデフォカース値をとる場合が多いです。その場合、LaB6などの電子銃では第一トーンリングより外側の情報がほとんど無いために、CTF補正等は必要ありませんが、電界放出銃を利用した場合には、場合によっては間違った情報を与える場合があるので注意が必要です。&lt;br /&gt;
&lt;br /&gt;
==== [[ラフ・アラインメント]] ====&lt;br /&gt;
　傾斜画像の中心付近の画像の相関から、それぞれの傾斜画像の大まかな位置を合わせます。&lt;br /&gt;
&lt;br /&gt;
==== [[ファイン・アラインメント]] ====&lt;br /&gt;
　傾斜画像の軸の位置、角度を出来る限り一致させます。&lt;br /&gt;
&lt;br /&gt;
==== [[３次元再構成]] ====&lt;br /&gt;
　２次元画像のセットから３次元画像を再構成します。&lt;br /&gt;
&lt;br /&gt;
==== [[電子線トモグラフィー画像のもつ問題点]] ====&lt;br /&gt;
　全方位からの投影像を得られないために、ミッシングエリアとよばれる情報がない領域があります。そのため、方向依存でのボケを生じます。&lt;br /&gt;
&lt;br /&gt;
==== [[トモグラム画像の解釈]] ====&lt;br /&gt;
　多様な構造を含むため、３次元画像から興味あるセグメントを切り出すなどの作業が必要です。そのための支援ソフトウェアが必要です。&lt;br /&gt;
&lt;br /&gt;
==== [[サブトモグラム画像の平均化]] ====&lt;br /&gt;
　クライオ電子顕微鏡画像からトモグラム画像はノイズが多いため、同等の構造をしたものを平均化する必要があります。&lt;br /&gt;
&lt;br /&gt;
==== 参考資料 ====&lt;br /&gt;
===== [[IMOD/ETomo]]の使い方=====&lt;br /&gt;
　[[IMOD/ETomo]]は、電子線トモグラフィー法やシリアルセクションなどで使われる、デファクトスタンダードともいえる3次元再構成プログラムです。&lt;br /&gt;
&lt;br /&gt;
====== [[eTomoチュートリアル]] ======&lt;br /&gt;
　eTomoのチュートリアルを示しています。&lt;br /&gt;
&lt;br /&gt;
=== 連続２次元画像からの３次元再構成 ===&lt;br /&gt;
　連続切片(Serial Section）や、連続ブロック表面(Serial Block Face)からの３次元再構成のための手順を示したものです。&lt;br /&gt;
&lt;br /&gt;
==== [[SBF-SEMからの３次元再構成]] ====&lt;br /&gt;
&lt;br /&gt;
== Eosにおける開発（開発者向け） ==&lt;br /&gt;
&lt;br /&gt;
　Eosのもうひとつのウリは迅速なプログラムの開発です。その手法について下記に述べます。&lt;br /&gt;
&lt;br /&gt;
=== [[Eosの構造|Eosの構造]] ===&lt;br /&gt;
　Eosの構造(Architecture）について述べます。&lt;br /&gt;
&lt;br /&gt;
=== [[Eosの開発|Eosの開発]]===&lt;br /&gt;
　SourceForgeからクローンを作成し、localで新規ツールなどを開発した後、SourceForgeに登録するまでの流れを示します。&lt;br /&gt;
&lt;br /&gt;
=== [[Eosの開発におけるTIPS]] ===&lt;br /&gt;
　Eos上で開発する際のTIPSをまとめています。&lt;br /&gt;
&lt;br /&gt;
=== [[ツールの開発]] ===&lt;br /&gt;
==== [[ツールの作り方]] ====&lt;br /&gt;
　Eosの上での[[Small Tools]]([[コマンド群]])の作り方について述べます。&lt;br /&gt;
&lt;br /&gt;
==== [[簡単なプログラム例]] ====&lt;br /&gt;
　Eosの上での[[Small Tools]]([[コマンド群]])の簡単なプログラム例について述べます。&lt;br /&gt;
&lt;br /&gt;
=== [[ライブラリ（API）の作り方]]===&lt;br /&gt;
　Eosの上での[[オブジェクト指向型ライブラリ]]（[[API]]）の作り方について述べます。&lt;br /&gt;
&lt;br /&gt;
=== [[ライブラリ(API)一覧]]===&lt;br /&gt;
　Eosの上での[[オブジェクト指向型ライブラリ]]（[[API]]）の一覧です。&lt;br /&gt;
&lt;br /&gt;
=== [[機能別ライブラリ(API)一覧]]===&lt;br /&gt;
　Eosの上での機能別に分類された[[オブジェクト指向型ライブラリ]]（[[API]]）の一覧です。&lt;br /&gt;
&lt;br /&gt;
並列処理のためのライブラリ&lt;br /&gt;
*[[eosCuda]]: CUDA を使うためのライブラリ&lt;br /&gt;
*[[eosPThread]]: pthread を使うためのライブラリ&lt;br /&gt;
&lt;br /&gt;
=== [[統合コマンドの作り方]]===&lt;br /&gt;
　統合コマンドの作り方を示します。&lt;br /&gt;
&lt;br /&gt;
==== [[Makefileによる統合]] ====&lt;br /&gt;
　[[Makefile]]を用いた統合方法について示します。[[Visualmake]]は自動的に簡易型のGUIを提供します。&lt;br /&gt;
&lt;br /&gt;
==== [[PIONEによる統合]]  ====&lt;br /&gt;
　分散環境（クラウド環境）に対応したプロセス定義書[[PIONE]]を用いた統合方法について示します。&lt;br /&gt;
&lt;br /&gt;
==== [[PIONEチュートリアル]] ====&lt;br /&gt;
　[[PIONE]]の使い方を示したチュートリアルです。&lt;br /&gt;
&lt;br /&gt;
==== [[PIONEチュートリアル-PNML]]====&lt;br /&gt;
　[[PNML]]を用いたPIONE定義書の設計方法を示しています．&lt;br /&gt;
&lt;br /&gt;
==== [[PIONEチュートリアル-XES]]====&lt;br /&gt;
　ログファイルを[[XES]]形式に変換し、[[ProM]]を利用して処理結果を確認する方法を示しています。&lt;br /&gt;
&lt;br /&gt;
==== [[PIONEチュートリアル-package]]====&lt;br /&gt;
　[[PIONE定義書]]などをひとつにまとめたパッケージを作成する方法を示しています。&lt;br /&gt;
&lt;br /&gt;
==== [[bashによる統合]] ====&lt;br /&gt;
　bashなどのスクリプト言語による統合方法について示します。&lt;br /&gt;
&lt;br /&gt;
==== [[統合コマンドによる統合]] ====&lt;br /&gt;
　[[Display2]], [[smolet]], [[Eos]]などのTcl/Tk型の統合コマンドによる統合, [[ctfDisplay]]等のRuby型の統合コマンドによる統合，[[molvie]]などのＣ言語型の統合コマンドによる統合、などの各種方法について示します。&lt;br /&gt;
&lt;br /&gt;
=== [[並列処理による高速化]] ===&lt;br /&gt;
　Eosでは、makeを使った単一ホストでのプロセスレベルでの並列処理、PIONEを使った分散環境におけるプロセスレベルの並列処理に加えて、pthread/GPGPUを用いたthreadレベルでの高速化も試行しています。すべてのコードが対応している訳ではありませんが、随時、対応を進めています。&lt;br /&gt;
&lt;br /&gt;
===== [[eosPThread]] =====&lt;br /&gt;
&lt;br /&gt;
===== [[eosCuda]] =====&lt;br /&gt;
&lt;br /&gt;
=== [[よく使うシェルコマンド]] ===&lt;br /&gt;
　ここでは[[コマンド]]、[[Makefile]]、[[PIONE]]などの作成や実行においてよく使うシェルコマンドを簡易的にリストアップしています。&lt;br /&gt;
&lt;br /&gt;
== [[画像処理]] ==&lt;br /&gt;
=== [[画像処理一般]] ===&lt;br /&gt;
　ここでは画像処理一般に関する話をまとめています。&lt;br /&gt;
&lt;br /&gt;
==== [[簡単な画像処理]]====&lt;br /&gt;
　Eosを使った簡単な画像処理に関するチュートリアルが掲載されています。&lt;br /&gt;
&lt;br /&gt;
==== [[画像の入力]]と[[レンズ]] ====&lt;br /&gt;
　コンピュータを使って画像処理を行う前に、画像がデジタル化される入力装置のことを気にしておく必要があります。&lt;br /&gt;
&lt;br /&gt;
==== [[CTF]],[[PSF]]と[[MTF]]====&lt;br /&gt;
　真に得たい画像をf(x,y)で表現した場合に、[[画像の入力]]方法や[[レンズ]]の性能などによりどうしても画像が劣化します。&lt;br /&gt;
&lt;br /&gt;
==== [[標本化]] ====&lt;br /&gt;
　アナログ画像をデジタル画像にするためには、空間を刻み、離散化することが重要です。このステップを標本化といいます。&lt;br /&gt;
&lt;br /&gt;
==== [[量子化]] ====&lt;br /&gt;
　デジタル画像処理では、アナログである濃度値（光学密度）をあるビット数内で表現する量子化（ＡＤ変換）という操作が最初に必要です。&lt;br /&gt;
&lt;br /&gt;
==== [[ノイズ除去]] ====&lt;br /&gt;
　ノイズが非常に多い画像を取り扱うためには、ノイズの性質をよく知ることが重要です。&lt;br /&gt;
&lt;br /&gt;
===== [[平滑化]] =====&lt;br /&gt;
　画像のもつノイズを取り除くことを主たる目的として実施する画像処理方法です。ノイズの性質をよく理解することで、適切なノイズ除去が可能になります。&lt;br /&gt;
&lt;br /&gt;
==== [[エッジ検出]] ====&lt;br /&gt;
　対象物の形を理解するために重要なステップですが、とても難しいステップでもあります。&lt;br /&gt;
&lt;br /&gt;
==== [[２値画像処理]] ====&lt;br /&gt;
　シグナルと背景の切り分けや、代表点や骨格の抽出など、画像処理や解析のスタートとなる処理方法です。&lt;br /&gt;
&lt;br /&gt;
==== [[フーリエ空間]]を利用した画像処理 ====&lt;br /&gt;
&lt;br /&gt;
==== 実空間の[[カーネル]]を用いた画像処理 ====&lt;br /&gt;
&lt;br /&gt;
==== [[マスマティカル・モルフォロジー]]を使った画像処理 ====&lt;br /&gt;
&lt;br /&gt;
=== [[電子顕微鏡画像処理]] ===&lt;br /&gt;
　電子顕微鏡画像処理に関する話をまとめています。&lt;br /&gt;
&lt;br /&gt;
==== [[モンタージュ]]、[[パノラマ]]画像 ====&lt;br /&gt;
　異なる領域を撮影した複数の画像（ただし、その一部は重なっている画像のセット）を組み合わせて、広領域の画像をつくる方法です。&lt;br /&gt;
&lt;br /&gt;
==== [[CTF補正]] ====&lt;br /&gt;
　電子顕微鏡の画像は、原理的に、画像変調を受けています。その画像変調を補正する為の画像処理です。&lt;br /&gt;
&lt;br /&gt;
==== [[３次元画像の位置合わせ]] ====&lt;br /&gt;
　３次元画像同士を平均し、雑音をとるための手法です。&lt;br /&gt;
&lt;br /&gt;
==== [[シリアル画像の位置合わせ]] ====&lt;br /&gt;
　連続切片の画像同士の位置を合わせることで、三次元像を再構成する手法です。&lt;br /&gt;
&lt;br /&gt;
=== [[３次元再構成法]] ===&lt;br /&gt;
　３次元再構成法とは、２次元の画像から３次元の画像を再構成する技術です&lt;br /&gt;
&lt;br /&gt;
==== [[中央断面定理]]====&lt;br /&gt;
　投影像からなぜ、内部の構造がわかるのか、それを支えているのがこの中央断面定理です．&lt;br /&gt;
&lt;br /&gt;
==== [[フーリエ法]]====&lt;br /&gt;
==== [[逆投影法]]====&lt;br /&gt;
==== [[SIRT]]====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== [[3Dモデル関連]] ==&lt;br /&gt;
=== [[chimera]] ===&lt;br /&gt;
　ボリュームデータやＰＤＢデータなどを可視化表示するためのソフトウェアです。&lt;br /&gt;
=== [[chimerax]] ===&lt;br /&gt;
=== [[vmd]] ===&lt;br /&gt;
=== [[NAMD]] ===&lt;br /&gt;
&lt;br /&gt;
== [[電子顕微鏡制御]] ==&lt;br /&gt;
　電子顕微鏡制御のためのソフトウェアを開発しています。[[VEM]]は、仮想電子顕微鏡として各種の電子顕微鏡のコマンドを統一するためのシステムです。[[WITs]]は、VEMを通して電子顕微鏡を操作するためのUI(User Interface)です。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[FEIの制御]]===&lt;br /&gt;
&lt;br /&gt;
== [[電子顕微鏡]] ==&lt;br /&gt;
　ここでは電子顕微鏡に関する基礎、FAQ、TIPSをまとめておきます。&lt;br /&gt;
&lt;br /&gt;
=== [[電子銃]]===&lt;br /&gt;
　電子顕微鏡の電子線源である電子銃についての解説です。&lt;br /&gt;
&lt;br /&gt;
=== [[電子レンズ]]===&lt;br /&gt;
　透過電子顕微鏡の光学系、及び、レンズの仕組みに関する解説です。&lt;br /&gt;
&lt;br /&gt;
=== [[透過型電子顕微鏡のコントラスト]]===&lt;br /&gt;
　透過型電子顕微鏡(TEM)がつくるコントラストに関する解説です。&lt;br /&gt;
&lt;br /&gt;
=== [[走査型透過電子顕微鏡のコントラスト]]===&lt;br /&gt;
　走査型透過電子顕微鏡(STEM)がつくるコントラストに関する解説です。&lt;br /&gt;
&lt;br /&gt;
=== [[走査型電子顕微鏡のコントラスト]] ===&lt;br /&gt;
　走査型電子顕微鏡(SEM)がつくるコントラストに関する解説です。&lt;br /&gt;
&lt;br /&gt;
=== [[クライオ電子顕微鏡法]] ===&lt;br /&gt;
　クライオ電子顕微鏡法に関する解説です。&lt;br /&gt;
&lt;br /&gt;
=== [[電子顕微鏡のFAQ]] ===&lt;br /&gt;
　電子顕微鏡に関するよくある質問に対する回答です。&lt;br /&gt;
&lt;br /&gt;
=== [[電子顕微鏡のTIPS]] ===&lt;br /&gt;
　電子顕微鏡を利用する際などのTIPSをまとめることにしました。&lt;br /&gt;
&lt;br /&gt;
== [[ロードマップ|Eosの今後の発展（ロードマップ）について]] ==&lt;br /&gt;
　Eosの今後の開発方針([[ロードマップ]])について述べます。&lt;br /&gt;
&lt;br /&gt;
=== [[ロードマップ]] ===&lt;br /&gt;
　現在、開発はOSDNのチケットシステムを利用しており、チケット駆動型開発になっています。チケットの粒度はさまざまで、現在、いろいろと試しながら、開発環境を構築しています。&lt;br /&gt;
&lt;br /&gt;
=== [[CUDA]]への対応 ===&lt;br /&gt;
　[[EosのCUDAへの対応状況]]を述べます。&lt;br /&gt;
　&lt;br /&gt;
&lt;br /&gt;
== FAQ and TIPS ==&lt;br /&gt;
=== [[FAQ]] ===&lt;br /&gt;
　よくある質問をまとめました。まだまだ不十分ですが、少しずつ増やしていきたいと思います。&lt;br /&gt;
&lt;br /&gt;
=== [[EosのTIPS]] ===&lt;br /&gt;
　よくある画像処理法をまとめてました。まだまだ不十分ですが、少しずつ増やしていきたいと思います。&lt;br /&gt;
&lt;br /&gt;
=== [[Eos関連ソフトウェアのTIPS]] ===&lt;br /&gt;
　Eosに関連するソフトウェアの使い方をまとめています。&lt;br /&gt;
&lt;br /&gt;
=== [[LINUXに関連したソフトウェアのTIPS]] ===&lt;br /&gt;
&lt;br /&gt;
=== [[OSXに関連したソフトウェアのTIPS]] ===&lt;br /&gt;
　ＯＳＸで利用されているソフトウェアについてまとめています。&lt;br /&gt;
&lt;br /&gt;
== 開発にかける思い ==&lt;br /&gt;
　開発当時と比べても非常に多くのソフトウェアが開発され、利用されている。その中で、継続的に開発していく意味はどこにあるのだろうか。[[開発にかける思いByYasunaga]]を少しずつ書き綴っていこう。&lt;br /&gt;
&lt;br /&gt;
== Eos User Group ==&lt;br /&gt;
　Eosを利用する上での情報共有の場を、仮にFacebookの上に作りました。参加されたい方は、facebook上で登録をお願いします。&lt;br /&gt;
&lt;br /&gt;
== '''イメージイラストについて''' ==&lt;br /&gt;
&lt;br /&gt;
現在、Eospediaのイメージイラストを募集中です。&lt;br /&gt;
我こそはという方はEospedia管理者まで御連絡下さい。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Eospedia(WIKI)の使い方・設定に関しては、[http://meta.wikimedia.org/wiki/Main_Page ユーザーズガイド]を参照して下さい。&lt;br /&gt;
&lt;br /&gt;
== Eos関連ツール及びサイト ==&lt;br /&gt;
=== 開発言語 ===&lt;br /&gt;
*[[C]]&lt;br /&gt;
*[[C++]]&lt;br /&gt;
*[[Ruby]]&lt;br /&gt;
*[[Tcl]]&lt;br /&gt;
*[[Tk]]&lt;br /&gt;
&lt;br /&gt;
=== ワークフロー関係(PIONE) ===&lt;br /&gt;
==== ペトリネット ====&lt;br /&gt;
*[[PNML]]&lt;br /&gt;
*[[WoPeD]]&lt;br /&gt;
==== アクション記述 ====&lt;br /&gt;
*[[Markdown]]&lt;br /&gt;
&lt;br /&gt;
==== ログファイル ====&lt;br /&gt;
*[[XES]]:ログファイル形式&lt;br /&gt;
*[[ProM]]:可視化のためのツール&lt;br /&gt;
&lt;br /&gt;
=== ドキュメント作成ツール ===&lt;br /&gt;
*[[Pandoc]]&lt;br /&gt;
*[[html]]&lt;br /&gt;
*[[mediawiki]]&lt;br /&gt;
*[[Eospediaの編集で使用しているツール]]&lt;br /&gt;
&lt;br /&gt;
== エディタ、統合開発環境 ==&lt;br /&gt;
=== [[Visual Studio Code]] ===&lt;br /&gt;
Microsoft主導でオープンソース開発が進められている、クロスプラットフォーム(Windows/macOS/Linux)のプログラミングエディタです。&lt;br /&gt;
&lt;br /&gt;
=== [[Vim]] ===&lt;br /&gt;
言わずと知れた著名なテキストエディタです。非常にとっつきにくいですが、慣れると捗ります。&lt;br /&gt;
&lt;br /&gt;
== その他 ==&lt;br /&gt;
=== [[クライオ電顕備忘録]] ===&lt;br /&gt;
　クライオ電顕関連の備忘録です。まとまり次第他の項目に順次移したりします。&lt;br /&gt;
&lt;br /&gt;
=== [[MicroED]] ===&lt;br /&gt;
MicroED(Micro crystal Electron Diffraction:微結晶電子線回折)に関する情報を書き残していきます。&lt;br /&gt;
&lt;br /&gt;
=== [[リモートワーク推進]] ===&lt;br /&gt;
リモートワーク推進のためのツール関連について書き残していきます。&lt;br /&gt;
&lt;br /&gt;
=== [[Python]] ===&lt;br /&gt;
Python関係について書き残していきます。&lt;br /&gt;
&lt;br /&gt;
=== [[Linux関連]] ===&lt;br /&gt;
Linux関連について書き残していきます。&lt;br /&gt;
&lt;br /&gt;
=== [[EMAN2関連]] ===&lt;br /&gt;
EMAN2関連について書き残していきます。&lt;br /&gt;
&lt;br /&gt;
=== [[Moodle関連]] ===&lt;br /&gt;
Moodle関連について整理しています。&lt;br /&gt;
&lt;br /&gt;
=== [[計算機利用ことはじめ]] ===&lt;br /&gt;
研究室で初めて計算機を使う方へ向けたお役立ち情報を書いていきます。&lt;br /&gt;
&lt;br /&gt;
=== [[単粒子解析ことはじめ]] ===&lt;br /&gt;
研究室で初めて単粒子解析をする方へ向けたお役立ち情報。&lt;br /&gt;
&lt;br /&gt;
=== [[クライオ電顕ことはじめ]] ===&lt;br /&gt;
研究室でクライオ電顕観察に挑戦する方へ向けて。&lt;br /&gt;
&lt;br /&gt;
=== [[Docker関連]] ===&lt;br /&gt;
Dockerを利用して研究、開発の環境を構築する方法を書いていきます。&lt;br /&gt;
&lt;br /&gt;
=== [[EMPIAR]] ===&lt;br /&gt;
電顕画像データベースである[[EMPIAR]]について&lt;br /&gt;
&lt;br /&gt;
=== [[XML Schema]] ===&lt;br /&gt;
XMLのデータ構造を定義するための言語であるXML Schema(スキーマ)について&lt;br /&gt;
&lt;br /&gt;
=== [[研究お役立ちツール]] ===&lt;br /&gt;
研究活動をするうえで役に立つと思ったツールを書いておきましょう。&lt;br /&gt;
&lt;br /&gt;
== 外部リンク ==&lt;br /&gt;
=== Eos関連サイト===&lt;br /&gt;
&lt;br /&gt;
* [http://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/ Eospedia.jp]&lt;br /&gt;
* [http://www.yasunaga-lab.bio.kyutech.ac.jp/Eos/ Eospedia.en]&lt;br /&gt;
* [http://sourceforge.jp/projects/eos/ Eos SourceForge]&lt;br /&gt;
&lt;br /&gt;
=== 電子顕微鏡画像処理関連サイト ===&lt;br /&gt;
*[https://www.imagescience.de/em2em.html em2em]:汎用画像フォーマット変換ツール&lt;br /&gt;
* [http://en.wikibooks.org/wiki/Software_Tools_For_Molecular_Microscopy Software Tools For Molecular Microscopy]&lt;br /&gt;
* [http://emdatabank.org/emsoftware.html EM Software on EMDataBank]&lt;br /&gt;
&lt;br /&gt;
=== 所属関連サイト ===&lt;br /&gt;
* [http://www.yasunaga-lab.bio.kyutech.ac.jp/ 安永研究室]&lt;br /&gt;
* [http://www.bio.kyutech.ac.jp/ 生命情報工学科]&lt;br /&gt;
* [http://www.iizuka.kyutech.ac.jp/ 情報工学部／情報工学府]&lt;br /&gt;
* [http://www.kyutech.ac.jp/ 九州工業大学]&lt;br /&gt;
&lt;br /&gt;
== メディアウィキの始め方 ==&lt;br /&gt;
* [[testpage]] : メディアウィキのテスト頁&lt;br /&gt;
* [http://www.mediawiki.org/wiki/Manual:Configuration_settings/ja 設定一覧]&lt;br /&gt;
* [http://www.mediawiki.org/wiki/Manual:FAQ/ja MediaWiki FAQ]&lt;br /&gt;
* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki リリース情報メーリングリスト]&lt;/div&gt;</summary>
		<author><name>Kttn</name></author>	</entry>

	<entry>
		<id>https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/Matplotlib_tips</id>
		<title>Matplotlib tips</title>
		<link rel="alternate" type="text/html" href="https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/Matplotlib_tips"/>
				<updated>2020-11-04T12:58:10Z</updated>
		
		<summary type="html">&lt;p&gt;Kttn: /* 画像ファイルを開いて表示 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== 参考文献(全般) ==&lt;br /&gt;
* [https://matplotlib.org/tutorials/index.html 公式チュートリアル]&lt;br /&gt;
* [https://qiita.com/skotaro/items/08dc0b8c5704c94eafb9 早く知っておきたかったmatplotlibの基礎知識、あるいは見た目の調整が捗るArtistの話]&lt;br /&gt;
&lt;br /&gt;
== JupyterLabでインタラクティブプロット ==&lt;br /&gt;
* 下準備&lt;br /&gt;
** ipympl( https://github.com/matplotlib/ipympl )をインストール&lt;br /&gt;
&lt;br /&gt;
* 使い方&lt;br /&gt;
** ノートブックの冒頭で以下のマジックコマンドをたたく&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
%matplotlib widget&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
始めにinlineにしておいて途中からwidgetに変えるとかは無理。最初から冒頭でwidgetにしておく必要あり。&lt;br /&gt;
&lt;br /&gt;
== 複数プロット ==&lt;br /&gt;
=== 参考文献 ===&lt;br /&gt;
* https://matplotlib.org/devdocs/gallery/subplots_axes_and_figures/subplots_demo.html&lt;br /&gt;
&lt;br /&gt;
=== 具体例1 ===&lt;br /&gt;
* 縦に3つのグラフを並べて、x軸の目盛りとラベルは一番下のみに表示&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    fig, ax = plt.subplots(nrows=3, ncols=1, figsize=figsize, dpi=dpi, sharex=True)&lt;br /&gt;
    ax[0].plot(epoch, gen_loss)&lt;br /&gt;
    ax[0].set_ylabel('Generator loss')&lt;br /&gt;
    ax[1].plot(epoch, kld)&lt;br /&gt;
    ax[1].set_ylabel('KLD')&lt;br /&gt;
    ax[2].plot(epoch, total_loss)&lt;br /&gt;
    ax[2].set_ylabel('Total loss')&lt;br /&gt;
    ax[2].set_xlabel('Epoch')&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 3Dプロット ==&lt;br /&gt;
=== Axes3D ===&lt;br /&gt;
* インポート&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
from mpl_toolkits.mplot3d import Axed3D&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 使い方&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
fig = plt.figure()&lt;br /&gt;
ax = fig.add_subplot(111, projection='3d')&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* axはAxes3Dというクラスのインスタンスになっていて、3Dプロット用のメソッドを持っている。&lt;br /&gt;
** APIは https://matplotlib.org/3.3.2/api/_as_gen/mpl_toolkits.mplot3d.axes3d.Axes3D.html#mpl-toolkits-mplot3d-axes3d-axes3d を参照&lt;br /&gt;
* %matplotlib widget と一緒に使うと、3Dプロットの回転とかがマウスドラッグで可能。&lt;br /&gt;
&lt;br /&gt;
== プロットの保存 ==&lt;br /&gt;
=== オブジェクト指向インターフェイス ===&lt;br /&gt;
* ドキュメント&lt;br /&gt;
** https://matplotlib.org/3.3.2/api/_as_gen/matplotlib.figure.Figure.html?highlight=savefig#matplotlib.figure.Figure.savefig&lt;br /&gt;
matplotlib.figure.Figureオブジェクト (fig) に対し、&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
fig.savefig('hoge.png', bbox_inches='tight')&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* bbox_inches='tight' を付けない場合、例えばfigが 10x7inch@100dpiであれば 1000x700 pixelで画像が保存されるが、図によってはかなりの余白ができてしまう。&lt;br /&gt;
* bbox_inches='tight' を付けると、図の中のコンテンツをできるだけタイトに囲むバウンディングボックスでもって図が保存される。画素数はその分減少するけど無駄な余白が無い。&lt;br /&gt;
&lt;br /&gt;
windowsのダークテーマとか使っていて、標準のフォトアプリとかで保存画像を開くと、軸やラベルの部分が背景が透明化されていて見づらいかもしれない。その場合は&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
fig.savefig('hoge.png', bbox_inches='tight', facecolor='w')&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
としてfigを白くすればよい。&lt;br /&gt;
&lt;br /&gt;
ループ回して大量に保存するとかならfigはcloseして消すべし？&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
plt.close(fig)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 画像ファイルを開いて表示 ==&lt;br /&gt;
=== Jupyter, IPythonの場合 ===&lt;br /&gt;
==== Pillow ====&lt;br /&gt;
* ドキュメント&lt;br /&gt;
** https://pillow.readthedocs.io/en/stable/reference/Image.html&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
from PIL import Image&lt;br /&gt;
from IPython.display import display&lt;br /&gt;
&lt;br /&gt;
display(Image.open('hoge.png'))&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Kttn</name></author>	</entry>

	<entry>
		<id>https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/Matplotlib_tips</id>
		<title>Matplotlib tips</title>
		<link rel="alternate" type="text/html" href="https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/Matplotlib_tips"/>
				<updated>2020-11-04T12:51:00Z</updated>
		
		<summary type="html">&lt;p&gt;Kttn: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== 参考文献(全般) ==&lt;br /&gt;
* [https://matplotlib.org/tutorials/index.html 公式チュートリアル]&lt;br /&gt;
* [https://qiita.com/skotaro/items/08dc0b8c5704c94eafb9 早く知っておきたかったmatplotlibの基礎知識、あるいは見た目の調整が捗るArtistの話]&lt;br /&gt;
&lt;br /&gt;
== JupyterLabでインタラクティブプロット ==&lt;br /&gt;
* 下準備&lt;br /&gt;
** ipympl( https://github.com/matplotlib/ipympl )をインストール&lt;br /&gt;
&lt;br /&gt;
* 使い方&lt;br /&gt;
** ノートブックの冒頭で以下のマジックコマンドをたたく&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
%matplotlib widget&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
始めにinlineにしておいて途中からwidgetに変えるとかは無理。最初から冒頭でwidgetにしておく必要あり。&lt;br /&gt;
&lt;br /&gt;
== 複数プロット ==&lt;br /&gt;
=== 参考文献 ===&lt;br /&gt;
* https://matplotlib.org/devdocs/gallery/subplots_axes_and_figures/subplots_demo.html&lt;br /&gt;
&lt;br /&gt;
=== 具体例1 ===&lt;br /&gt;
* 縦に3つのグラフを並べて、x軸の目盛りとラベルは一番下のみに表示&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    fig, ax = plt.subplots(nrows=3, ncols=1, figsize=figsize, dpi=dpi, sharex=True)&lt;br /&gt;
    ax[0].plot(epoch, gen_loss)&lt;br /&gt;
    ax[0].set_ylabel('Generator loss')&lt;br /&gt;
    ax[1].plot(epoch, kld)&lt;br /&gt;
    ax[1].set_ylabel('KLD')&lt;br /&gt;
    ax[2].plot(epoch, total_loss)&lt;br /&gt;
    ax[2].set_ylabel('Total loss')&lt;br /&gt;
    ax[2].set_xlabel('Epoch')&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 3Dプロット ==&lt;br /&gt;
=== Axes3D ===&lt;br /&gt;
* インポート&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
from mpl_toolkits.mplot3d import Axed3D&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 使い方&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
fig = plt.figure()&lt;br /&gt;
ax = fig.add_subplot(111, projection='3d')&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* axはAxes3Dというクラスのインスタンスになっていて、3Dプロット用のメソッドを持っている。&lt;br /&gt;
** APIは https://matplotlib.org/3.3.2/api/_as_gen/mpl_toolkits.mplot3d.axes3d.Axes3D.html#mpl-toolkits-mplot3d-axes3d-axes3d を参照&lt;br /&gt;
* %matplotlib widget と一緒に使うと、3Dプロットの回転とかがマウスドラッグで可能。&lt;br /&gt;
&lt;br /&gt;
== プロットの保存 ==&lt;br /&gt;
=== オブジェクト指向インターフェイス ===&lt;br /&gt;
* ドキュメント&lt;br /&gt;
** https://matplotlib.org/3.3.2/api/_as_gen/matplotlib.figure.Figure.html?highlight=savefig#matplotlib.figure.Figure.savefig&lt;br /&gt;
matplotlib.figure.Figureオブジェクト (fig) に対し、&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
fig.savefig('hoge.png', bbox_inches='tight')&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* bbox_inches='tight' を付けない場合、例えばfigが 10x7inch@100dpiであれば 1000x700 pixelで画像が保存されるが、図によってはかなりの余白ができてしまう。&lt;br /&gt;
* bbox_inches='tight' を付けると、図の中のコンテンツをできるだけタイトに囲むバウンディングボックスでもって図が保存される。画素数はその分減少するけど無駄な余白が無い。&lt;br /&gt;
&lt;br /&gt;
windowsのダークテーマとか使っていて、標準のフォトアプリとかで保存画像を開くと、軸やラベルの部分が背景が透明化されていて見づらいかもしれない。その場合は&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
fig.savefig('hoge.png', bbox_inches='tight', facecolor='w')&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
としてfigを白くすればよい。&lt;br /&gt;
&lt;br /&gt;
ループ回して大量に保存するとかならfigはcloseして消すべし？&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
plt.close(fig)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 画像ファイルを開いて表示 ==&lt;br /&gt;
=== Pillow ===&lt;br /&gt;
* ドキュメント&lt;br /&gt;
** https://pillow.readthedocs.io/en/stable/reference/Image.html&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
from PIL import Image&lt;br /&gt;
&lt;br /&gt;
im = Image.open('hoge.png')&lt;br /&gt;
im.show()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Kttn</name></author>	</entry>

	<entry>
		<id>https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/Matplotlib_tips</id>
		<title>Matplotlib tips</title>
		<link rel="alternate" type="text/html" href="https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/Matplotlib_tips"/>
				<updated>2020-11-04T12:48:19Z</updated>
		
		<summary type="html">&lt;p&gt;Kttn: /* オブジェクト指向インターフェイス */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== 参考文献(全般) ==&lt;br /&gt;
* [https://matplotlib.org/tutorials/index.html 公式チュートリアル]&lt;br /&gt;
* [https://qiita.com/skotaro/items/08dc0b8c5704c94eafb9 早く知っておきたかったmatplotlibの基礎知識、あるいは見た目の調整が捗るArtistの話]&lt;br /&gt;
&lt;br /&gt;
== JupyterLabでインタラクティブプロット ==&lt;br /&gt;
* 下準備&lt;br /&gt;
** ipympl( https://github.com/matplotlib/ipympl )をインストール&lt;br /&gt;
&lt;br /&gt;
* 使い方&lt;br /&gt;
** ノートブックの冒頭で以下のマジックコマンドをたたく&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
%matplotlib widget&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
始めにinlineにしておいて途中からwidgetに変えるとかは無理。最初から冒頭でwidgetにしておく必要あり。&lt;br /&gt;
&lt;br /&gt;
== 複数プロット ==&lt;br /&gt;
=== 参考文献 ===&lt;br /&gt;
* https://matplotlib.org/devdocs/gallery/subplots_axes_and_figures/subplots_demo.html&lt;br /&gt;
&lt;br /&gt;
=== 具体例1 ===&lt;br /&gt;
* 縦に3つのグラフを並べて、x軸の目盛りとラベルは一番下のみに表示&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    fig, ax = plt.subplots(nrows=3, ncols=1, figsize=figsize, dpi=dpi, sharex=True)&lt;br /&gt;
    ax[0].plot(epoch, gen_loss)&lt;br /&gt;
    ax[0].set_ylabel('Generator loss')&lt;br /&gt;
    ax[1].plot(epoch, kld)&lt;br /&gt;
    ax[1].set_ylabel('KLD')&lt;br /&gt;
    ax[2].plot(epoch, total_loss)&lt;br /&gt;
    ax[2].set_ylabel('Total loss')&lt;br /&gt;
    ax[2].set_xlabel('Epoch')&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 3Dプロット ==&lt;br /&gt;
=== Axes3D ===&lt;br /&gt;
* インポート&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
from mpl_toolkits.mplot3d import Axed3D&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 使い方&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
fig = plt.figure()&lt;br /&gt;
ax = fig.add_subplot(111, projection='3d')&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* axはAxes3Dというクラスのインスタンスになっていて、3Dプロット用のメソッドを持っている。&lt;br /&gt;
** APIは https://matplotlib.org/3.3.2/api/_as_gen/mpl_toolkits.mplot3d.axes3d.Axes3D.html#mpl-toolkits-mplot3d-axes3d-axes3d を参照&lt;br /&gt;
* %matplotlib widget と一緒に使うと、3Dプロットの回転とかがマウスドラッグで可能。&lt;br /&gt;
&lt;br /&gt;
== プロットの保存 ==&lt;br /&gt;
=== オブジェクト指向インターフェイス ===&lt;br /&gt;
* ドキュメント&lt;br /&gt;
** https://matplotlib.org/3.3.2/api/_as_gen/matplotlib.figure.Figure.html?highlight=savefig#matplotlib.figure.Figure.savefig&lt;br /&gt;
matplotlib.figure.Figureオブジェクト (fig) に対し、&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
fig.savefig('hoge.png', bbox_inches='tight')&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* bbox_inches='tight' を付けない場合、例えばfigが 10x7inch@100dpiであれば 1000x700 pixelで画像が保存されるが、図によってはかなりの余白ができてしまう。&lt;br /&gt;
* bbox_inches='tight' を付けると、図の中のコンテンツをできるだけタイトに囲むバウンディングボックスでもって図が保存される。画素数はその分減少するけど無駄な余白が無い。&lt;br /&gt;
&lt;br /&gt;
windowsのダークテーマとか使っていて、標準のフォトアプリとかで保存画像を開くと、軸やラベルの部分が背景が透明化されていて見づらいかもしれない。その場合は&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
fig.savefig('hoge.png', bbox_inches='tight', facecolor='w')&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
としてfigを白くすればよい。&lt;br /&gt;
&lt;br /&gt;
ループ回して大量に保存するとかならfigはcloseして消すべし？&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
plt.close(fig)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Kttn</name></author>	</entry>

	<entry>
		<id>https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/Matplotlib_tips</id>
		<title>Matplotlib tips</title>
		<link rel="alternate" type="text/html" href="https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/Matplotlib_tips"/>
				<updated>2020-11-04T12:38:14Z</updated>
		
		<summary type="html">&lt;p&gt;Kttn: /* オブジェクト指向インターフェイス */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== 参考文献(全般) ==&lt;br /&gt;
* [https://matplotlib.org/tutorials/index.html 公式チュートリアル]&lt;br /&gt;
* [https://qiita.com/skotaro/items/08dc0b8c5704c94eafb9 早く知っておきたかったmatplotlibの基礎知識、あるいは見た目の調整が捗るArtistの話]&lt;br /&gt;
&lt;br /&gt;
== JupyterLabでインタラクティブプロット ==&lt;br /&gt;
* 下準備&lt;br /&gt;
** ipympl( https://github.com/matplotlib/ipympl )をインストール&lt;br /&gt;
&lt;br /&gt;
* 使い方&lt;br /&gt;
** ノートブックの冒頭で以下のマジックコマンドをたたく&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
%matplotlib widget&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
始めにinlineにしておいて途中からwidgetに変えるとかは無理。最初から冒頭でwidgetにしておく必要あり。&lt;br /&gt;
&lt;br /&gt;
== 複数プロット ==&lt;br /&gt;
=== 参考文献 ===&lt;br /&gt;
* https://matplotlib.org/devdocs/gallery/subplots_axes_and_figures/subplots_demo.html&lt;br /&gt;
&lt;br /&gt;
=== 具体例1 ===&lt;br /&gt;
* 縦に3つのグラフを並べて、x軸の目盛りとラベルは一番下のみに表示&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    fig, ax = plt.subplots(nrows=3, ncols=1, figsize=figsize, dpi=dpi, sharex=True)&lt;br /&gt;
    ax[0].plot(epoch, gen_loss)&lt;br /&gt;
    ax[0].set_ylabel('Generator loss')&lt;br /&gt;
    ax[1].plot(epoch, kld)&lt;br /&gt;
    ax[1].set_ylabel('KLD')&lt;br /&gt;
    ax[2].plot(epoch, total_loss)&lt;br /&gt;
    ax[2].set_ylabel('Total loss')&lt;br /&gt;
    ax[2].set_xlabel('Epoch')&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 3Dプロット ==&lt;br /&gt;
=== Axes3D ===&lt;br /&gt;
* インポート&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
from mpl_toolkits.mplot3d import Axed3D&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 使い方&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
fig = plt.figure()&lt;br /&gt;
ax = fig.add_subplot(111, projection='3d')&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* axはAxes3Dというクラスのインスタンスになっていて、3Dプロット用のメソッドを持っている。&lt;br /&gt;
** APIは https://matplotlib.org/3.3.2/api/_as_gen/mpl_toolkits.mplot3d.axes3d.Axes3D.html#mpl-toolkits-mplot3d-axes3d-axes3d を参照&lt;br /&gt;
* %matplotlib widget と一緒に使うと、3Dプロットの回転とかがマウスドラッグで可能。&lt;br /&gt;
&lt;br /&gt;
== プロットの保存 ==&lt;br /&gt;
=== オブジェクト指向インターフェイス ===&lt;br /&gt;
* ドキュメント&lt;br /&gt;
** https://matplotlib.org/3.3.2/api/_as_gen/matplotlib.figure.Figure.html?highlight=savefig#matplotlib.figure.Figure.savefig&lt;br /&gt;
matplotlib.figure.Figureオブジェクト (fig) に対し、&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
fig.savefig('hoge.png', bbox_inches='tight')&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* bbox_inches='tight' を付けない場合、例えばfigが 10x7inch@100dpiであれば 1000x700 pixelで画像が保存されるが、図によってはかなりの余白ができてしまう。&lt;br /&gt;
* bbox_inches='tight' を付けると、図の中のコンテンツをできるだけタイトに囲むバウンディングボックスでもって図が保存される。画素数はその分減少するけど無駄な余白が無い。&lt;br /&gt;
&lt;br /&gt;
ループ回して大量に保存するとかならfigはcloseして消すべし？&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
plt.close(fig)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Kttn</name></author>	</entry>

	<entry>
		<id>https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/Matplotlib_tips</id>
		<title>Matplotlib tips</title>
		<link rel="alternate" type="text/html" href="https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/Matplotlib_tips"/>
				<updated>2020-11-04T12:33:25Z</updated>
		
		<summary type="html">&lt;p&gt;Kttn: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== 参考文献(全般) ==&lt;br /&gt;
* [https://matplotlib.org/tutorials/index.html 公式チュートリアル]&lt;br /&gt;
* [https://qiita.com/skotaro/items/08dc0b8c5704c94eafb9 早く知っておきたかったmatplotlibの基礎知識、あるいは見た目の調整が捗るArtistの話]&lt;br /&gt;
&lt;br /&gt;
== JupyterLabでインタラクティブプロット ==&lt;br /&gt;
* 下準備&lt;br /&gt;
** ipympl( https://github.com/matplotlib/ipympl )をインストール&lt;br /&gt;
&lt;br /&gt;
* 使い方&lt;br /&gt;
** ノートブックの冒頭で以下のマジックコマンドをたたく&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
%matplotlib widget&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
始めにinlineにしておいて途中からwidgetに変えるとかは無理。最初から冒頭でwidgetにしておく必要あり。&lt;br /&gt;
&lt;br /&gt;
== 複数プロット ==&lt;br /&gt;
=== 参考文献 ===&lt;br /&gt;
* https://matplotlib.org/devdocs/gallery/subplots_axes_and_figures/subplots_demo.html&lt;br /&gt;
&lt;br /&gt;
=== 具体例1 ===&lt;br /&gt;
* 縦に3つのグラフを並べて、x軸の目盛りとラベルは一番下のみに表示&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    fig, ax = plt.subplots(nrows=3, ncols=1, figsize=figsize, dpi=dpi, sharex=True)&lt;br /&gt;
    ax[0].plot(epoch, gen_loss)&lt;br /&gt;
    ax[0].set_ylabel('Generator loss')&lt;br /&gt;
    ax[1].plot(epoch, kld)&lt;br /&gt;
    ax[1].set_ylabel('KLD')&lt;br /&gt;
    ax[2].plot(epoch, total_loss)&lt;br /&gt;
    ax[2].set_ylabel('Total loss')&lt;br /&gt;
    ax[2].set_xlabel('Epoch')&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 3Dプロット ==&lt;br /&gt;
=== Axes3D ===&lt;br /&gt;
* インポート&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
from mpl_toolkits.mplot3d import Axed3D&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 使い方&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
fig = plt.figure()&lt;br /&gt;
ax = fig.add_subplot(111, projection='3d')&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* axはAxes3Dというクラスのインスタンスになっていて、3Dプロット用のメソッドを持っている。&lt;br /&gt;
** APIは https://matplotlib.org/3.3.2/api/_as_gen/mpl_toolkits.mplot3d.axes3d.Axes3D.html#mpl-toolkits-mplot3d-axes3d-axes3d を参照&lt;br /&gt;
* %matplotlib widget と一緒に使うと、3Dプロットの回転とかがマウスドラッグで可能。&lt;br /&gt;
&lt;br /&gt;
== プロットの保存 ==&lt;br /&gt;
=== オブジェクト指向インターフェイス ===&lt;br /&gt;
* ドキュメント&lt;br /&gt;
** https://matplotlib.org/3.3.2/api/_as_gen/matplotlib.figure.Figure.html?highlight=savefig#matplotlib.figure.Figure.savefig&lt;br /&gt;
matplotlib.figure.Figureオブジェクト (fig) に対し、&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
fig.savefig('hoge.png', bbox_inches='tight')&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* bbox_inches='tight' を付けない場合、例えばfigが 10x7inch@100dpiであれば 1000x700 pixelで画像が保存されるが、図によってはかなりの余白ができてしまう。&lt;br /&gt;
* bbox_inches='tight' を付けると、図の中のコンテンツをできるだけタイトに囲むバウンディングボックスでもって図が保存される。画素数はその分減少するけど無駄な余白が無い。&lt;/div&gt;</summary>
		<author><name>Kttn</name></author>	</entry>

	<entry>
		<id>https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/Python%E3%83%88%E3%83%A9%E3%83%96%E3%83%AB%E3%82%B7%E3%83%A5%E3%83%BC%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0</id>
		<title>Pythonトラブルシューティング</title>
		<link rel="alternate" type="text/html" href="https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/Python%E3%83%88%E3%83%A9%E3%83%96%E3%83%AB%E3%82%B7%E3%83%A5%E3%83%BC%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0"/>
				<updated>2020-11-04T11:49:05Z</updated>
		
		<summary type="html">&lt;p&gt;Kttn: ページの作成:「== RuntimeWarning: numpy.ufunc size changed == JupyterLabでNumpyとかその依存ライブラリをインポートしたとき、以下のエラーが何個か出てき...」&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== RuntimeWarning: numpy.ufunc size changed ==&lt;br /&gt;
JupyterLabでNumpyとかその依存ライブラリをインポートしたとき、以下のエラーが何個か出てきた。&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
RuntimeWarning: numpy.ufunc size changed, may indicate binary incompatibility. Expected 192 from C header, got 216 from PyObject return f(*args, **kwds)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
そのノートブックのカーネルを再起動して再度インポートセルを実行したらエラーがなぜか消えたので、とりあえずカーネルを再起動するのは一つの手。&lt;/div&gt;</summary>
		<author><name>Kttn</name></author>	</entry>

	<entry>
		<id>https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/Python</id>
		<title>Python</title>
		<link rel="alternate" type="text/html" href="https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/Python"/>
				<updated>2020-11-04T11:45:23Z</updated>
		
		<summary type="html">&lt;p&gt;Kttn: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;当研究室特有の説明を含む場合があるので留意ください。 &lt;br /&gt;
&lt;br /&gt;
== [[Python tips]] ==&lt;br /&gt;
いつも調べてしまうことなどを書き残しておく&lt;br /&gt;
&lt;br /&gt;
== [[Numpy tips]] ==&lt;br /&gt;
&lt;br /&gt;
== [[Matplotlib tips]] ==&lt;br /&gt;
&lt;br /&gt;
== [[JupyterLab設定]] ==&lt;br /&gt;
Jupyter Labの設定集&lt;br /&gt;
&lt;br /&gt;
== [[DockerでJupyterLab]] ==&lt;br /&gt;
Jupyter Notebook(.ipynb)をウェブブラウザで閲覧、作成、編集、実行できるJupyterLabサーバーをDockerで立ち上げ、リモートのPCのウェブブラウザから使う方法を説明します。&lt;br /&gt;
&lt;br /&gt;
== [[Visual Studio CodeでPythonデバッグ実行]] ==&lt;br /&gt;
Visual Studio CodeでPythonスクリプトをデバッグ実行する方法について説明します。&lt;br /&gt;
&lt;br /&gt;
== [[PythonのためのVisual Studio Code設定覚書]] ==&lt;br /&gt;
&lt;br /&gt;
== [[Anaconda覚書]] ==&lt;br /&gt;
&lt;br /&gt;
== [[Pythonトラブルシューティング]] ==&lt;/div&gt;</summary>
		<author><name>Kttn</name></author>	</entry>

	<entry>
		<id>https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/Docker%E9%96%A2%E9%80%A3</id>
		<title>Docker関連</title>
		<link rel="alternate" type="text/html" href="https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/Docker%E9%96%A2%E9%80%A3"/>
				<updated>2020-11-04T10:30:17Z</updated>
		
		<summary type="html">&lt;p&gt;Kttn: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Dockerを利用して研究、開発の環境を構築する方法を書いていきます。&lt;br /&gt;
&lt;br /&gt;
== 用語の整理 ==&lt;br /&gt;
なかなかに複雑なので用語を整理しておきます。間違っている部分もあるかもしれないので、適宜修正してください。&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:100%&amp;quot;&lt;br /&gt;
|+Docker用語の整理&lt;br /&gt;
! style=&amp;quot;width:10%&amp;quot; | 用語&lt;br /&gt;
! 説明&lt;br /&gt;
|-&lt;br /&gt;
! Docker&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Docker machine&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Docker engine&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
! Docker desktop&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
! Docker CLI&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
! Docker compose&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
! Docker swarm&lt;br /&gt;
| 複数のホストマシン上のDockerをネットワークを介して相互接続する機能。&lt;br /&gt;
|-&lt;br /&gt;
! Kubernetes (K8s)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! NVIDIA Docker&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! NVIDIA Container Toolkit&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Dockerのネットワークについて ==&lt;br /&gt;
1つのホストマシン上のDocker上でのコンテナ間の通信や、複数のホストマシン上のDocker上でのコンテナ間の通信、自分の好みのDockerネットワークを組む方法などについて、公式ドキュメント( https://docs.docker.com/network/ )がある。&lt;br /&gt;
&lt;br /&gt;
== Docker swarm ==&lt;br /&gt;
複数のホストマシン上のDockerをネットワークを介して相互接続する機能。SwarmでDockerのクラスタを作った暁には、overlayと呼ばれるタイプのDockerネットワークを作成し、そのネットワークへ(複数のホストで動作している)コンテナを参加させることで、ホストをまたいでのコンテナ間の通信が可能となる。他にも色々できる。&lt;br /&gt;
&lt;br /&gt;
https://docs.docker.com/network/ で、Networking overview ⇒ Bridge network tutorial ⇒ Overlay networking tutorial と読み進めると、機能やありがたみが分かりやすいのではないかと思う。&lt;br /&gt;
&lt;br /&gt;
== Portainer ==&lt;br /&gt;
DockerのGUI管理ツールです。https://www.portainer.io/&lt;br /&gt;
&lt;br /&gt;
ウェブブラウザでアクセスして管理、確認できます。&lt;br /&gt;
&lt;br /&gt;
== トラブルシューティング ==&lt;br /&gt;
=== ネットワーク関係 ===&lt;br /&gt;
==== コンテナのネットワークが回復していないせいでコンテナが再起動できない ====&lt;br /&gt;
計算機を再起動したあと、ユーザー定義で作成したoverlayネットワークが何やらダウンして、復旧できなかった。&lt;br /&gt;
&lt;br /&gt;
で、計算機の停止前にそのoverlayネットワークに参加していたコンテナに対し、計算機の再起動後にdocker startでコンテナ再起動しようとしたところ、以下のようなエラーが出て再起動してくれなかった。&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Error response from daemon: Could not attach to network asuaxn22bff1sq8pqqay2sg64: context deadline exceeded&lt;br /&gt;
Error: failed to start containers: &amp;lt;コンテナ名&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ネットワークを復活させられればstart可能となるのか、そもそも同じネットワークを復活させられるのか、よくわからなかったが、とりあえず以下のようにしてネットワークからコンテナを切り離し、そのうえでコンテナをstartとすれば、立ち上がってくれるようにはなった。(もちろんネットワークからは抜けたまま)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;gt; docker network disconnect &amp;lt;死んでるoverlayネットワークの名前&amp;gt; &amp;lt;コンテナ名&amp;gt;&lt;br /&gt;
&amp;gt; docker start &amp;lt;コンテナ名&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
当該コンテナがどんなネットワークに属しているかは、&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;gt; docker inspect &amp;lt;コンテナ名&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
で、&amp;quot;Networks&amp;quot;を見ればよい。(デフォルトで参加するネットワークは&amp;quot;bridge&amp;quot;で、それ以外を見ればよい)&lt;/div&gt;</summary>
		<author><name>Kttn</name></author>	</entry>

	</feed>