python で 医療系共同研究 ① ネットワーク環境構築

# 医療系の共同研究が本格的に始まり 

まずは専用PCへpythonの環境構築が及び
secureな方法の通信手段をどうするか？

機械学習だけではなくシステム全体の
ネットワーク環境を含めた設計イメージが必要になったため
こちらで学んだ知識をオープンにしていきたいと思います

余談ですが　私自身　臨床工学技士　という　医療従事者としても仕事をしているのですが
臨床工学技士は医療機器（薬機法では一部のソフトウェアも医療機器です）の専門家のため、
エンジニアとして院内のシステム開発に携わる方が多いのも特徴です！

国家資格でも、情報関係の問題があり　
大学時代に勉強した内容が非常に役に立っていると思います！

臨床工学技士について興味ある方は　
私が作成したこちらの動画を見ていただけると幸いです

https://www.youtube.com/watch?v=XmROj1cAjBc

https://ce-renmei.gr.jp/2022/05/16/%e5%8b%95%e7%94%bb%e3%82%b3%e3%83%b3%e3%83%86%e3%82%b9%e3%83%88%e7%b5%90%e6%9e%9c%e7%99%ba%e8%a1%a8%ef%bc%81/


さて、さっそく　どのように機械学習システムを院内で活用するか考えるため
基礎的なネットワークの知識から復習したいと思います

# 基礎的なネットワークの部分から

# TCP/IP
TCP/IPとは、インターネットを含む多くのコンピュータネットワークにおいて、
世界標準的に利用されている通信プロトコル
データの送受信に関わる一連の作業をまとめたもの

TCP/IPの階層は、以下のようになります

「アプリケーション層」：HTTP　SMTP POP3 FTP etc...
「トランスポート層」：TCP UDP
「ネットワーク層」：IP
「データリンク層」：Ethernet FDDI ATM PPP
「物理層」：データを信号に、信号をデータに変換

https://e-words.jp/w/TCP-IP.html

https://www.ikueikan.ac.jp/biblion/1997/sysadmin/node37.html

https://www.itmanage.co.jp/column/tcp-ip-protocol/


### URLとは

ネットワーク上の特定のデータなどを示すときに使われるのが

URL　uniform resource locator

です

細かく見ると以下のように表せます

スキーム名：サービスの種類　http　など
ドメイン：サーバーを特定　数字の場合もある
ポート番号：アプリケーションプロトコルを識別する番号
パス：サーバー内のファイルの住所
ファイル名：ファイル名は省略できる場合がある


https://wa3.i-3-i.info/word114.html

https://webukatu.com/wordpress/blog/1214/

## 遠隔ログイン

離れた場所にある別のコンピューターを操作できるサービスが遠隔ログインですが
種類があり　代表的なものにtelnet があります

#### telnet

Telnetとは、インターネットなどのTCP/IPネットワークを通じて別のコンピュータにアクセスし、
遠隔操作するための通信規約（プロトコル）の一つ。

Telnetは単純なテキストのやり取りのみを行なうため、テキストベースの他のプロトコルで動作するサーバにTelnetクライアントで接続し、リクエストなどを直接入力して操作やテストを行なう、といった使い方がされることもある。

Telnetそれ自体は認証や通信をまったく暗号化しないため、インターネットなど開かれたネットワークでそのまま使うことは危険であるとされる。このため、遠隔操作などの用途には暗号化に対応したSSHなどが使われることが多い。

https://e-words.jp/w/Telnet.html


#### ssh

SSHとは「Secure Shell」の略で、ネットワークに接続された機器を遠隔操作し、管理するための手段です。ポイントはSecure（安全）に！で、そのために必要な仕組みが用意されています。

https://www.kagoya.jp/howto/it-glossary/server/ssh/

####　デスクトップの共有　

ネットワーク上の他のコンピュータのデスクトップ環境にアクセスし
ファイルやアプリケーションを操作する技術です

通信プロトコルはRDP remote desktop protocol を利用します


Linuxサーバーにデスクトップ接続する方法

https://www.tericle.jp/oci-rdp-linux/



##「アプリケーション層」

TCP/IPの5階層のうち一番上位に来るのがアプリケーション層です

コンピューター同士のやり取りをユーザーが利用できる

通信サービス　という形にするのがこの層の役割です

そのため

クライアント　と　サーバーという概念をもっています

クライアント　と　サーバー　のやり取りを定めたプロトコルがある

これをアプリケーションプロトコルといいます

https://e-words.jp/w/%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%83%97%E3%83%AD%E3%83%88%E3%82%B3%E3%83%AB.html


アプリケーションソフトなどが個別の具体的な目的のために利用するプロトコルのことで、

TCP/IPの場合にはWebのデータを送受信するためのHTTPや、

ファイル転送のためのFTP、

メール送信のためのSMTP、

メール受信のためのPOPやIMAPなどがこれにあたります

アプリケーション層の役割が　「サービスを実現すること」
であるのに対して
アプリケーション層よりも下の層は　「通信を実現する事」が役割になります
　

## 「トランスポート層」

transport は　日本語で　運ぶ　や　輸送する　といった意味があり

トランスポートの役割は　データを相手に届けることです

IPと併用するTCP（Transmission Control Protocol）やUDP（User Datagram Protocol）が有名。

TCP（Transmission Control Protocol）は信頼性のある通信路を実現してくれるため、
アプリケーションはネットワークの状態に関係なく（混雑で遅くなったり、送信が失敗したりしても気にせずに）、
データをやり取りできる。

UDP（User Datagram Protocol）はスピード重視

UDPのヘッダには、TCPと同様に送信元ポート番号と宛先ポート番号が設定されており、
ポートを指定した通信が可能です。
しかしTCPとは異なりコネクションレスの通信プロトコルであるため、
ハンドシェイクによるセッション確立や切断、
フロー制御、誤り制御、輻輳制御といった機能はありません。
一方的にメッセージを送る、メッセージ指向型のプロトコルです。

https://www.f5.com/ja_jp/services/resources/glossary/user-datagram-protocol-udp


## 「ネットワーク層」

複数のネットワークを相互に接続した環境（インターネットワーク）で、機器間のデータ伝送を実現します。
IP（Internet Protocol）はこの層のプロトコルです

IP、ルーティングなど

ルーティングとはコンピュータが送信したデータ（パケット）を宛先のコンピュータまで適切に転送する処理のこと。

言葉の意味から、ルーティング（＝routing）→道案内と理解できればまずはOK

単に道案内をするだけでなく、道路が渋滞しないように
一番効率的なルートでデータを届ける仕組みを提供するのがルーティングの役割です。

https://it-biz.online/it-skills/routing/

## 「データリンク層」

Ethernet 

イーサネット (Ethernet) は、家庭・企業・データセンターなどで使用されるコンピューターネットワークにおいて、LANやWANを構成する有線ローカルエリアネットワークの主流な通信規格である。 その技術仕様はIEEE 802.3で規定されている

FDDI 

ファイバ分散データインタフェース（FDDI）は、米国規格協会（ANSI）によって1980年代初頭に制定されたネットワーク規格で、最大100Mbpsの速度での動作に対応しています。 標準のFDDIネットワークは、一連のノードに対して逆方向に信号を伝送する２つのリングとともに、リングトポロジの中に設定されています。


## 「物理層」

データを信号に、信号をデータに変換


# docker で python

テスト環境を作成するため
docker で動作確認をすることで

windowsでも　 python 仮想環境　の作成や　シェルが動くかを試すことができます

自分のコンピュータの環境を汚すことなく、
隔離された環境を作ってそこでプログラムを動かすことができるので
トライアンドエラーも簡単で、
その作った環境はシェアすることでどこでも実行できるという点がメリットです。

 https://qiita.com/jhorikawa_err/items/fb9c03c0982c29c5b6d5

上記の記事を参考に

docker-pythonフォルダを作業フォルダにした上で
Dockerイメージ（仮想環境のテンプレート）の作成し、
そのイメージを利用してDockerのコンテナ
（テンプレートを利用して作られ実際に実行される仮想環境が入った入れもの）を起動します。

以下のようなイメージとなります

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2629668/e51d0dd8-fd2b-9627-54cf-8f17bde30a7b.png)


# docker ubuntuで シェルコマンドの動作確認

シェルの一例ですが
docker ではコマンドを使う必要があるので
以下にコマンドの一例を示します

echoコマンド で　文字出力
```
echo "hello python"
```
echoコマンドの出力先をファイルにリダイレクトする。

```
echo "hello world" > foo.txt
```
#cat コマンドでファイルの内容を表示する
```
cat foo.txt
```
ファイルをコピーする
```
cp foo.txt bar.txt
```
ファイルの名前を変更する
```
mv bar.txt new.txt
```
ファイルを削除する
```
rm new.txt
```
ディレクトリを作成する
```
mkdir test
```
同じファイル名で　testディレクトリ　にファイルをコピーする
```
cp foo.txt test
```
ファイル名を変えて　testディレクトリ　にファイルをコピーの場合
```
cp foo.txt test/bar.txt
```
ファイル／ディレクトリの名前を変更する
```
mv bar.txt new.txt
```

#### ツリーの最上位をルートディレクトリと呼びます

「ファイルパス」とは、ファイルツリーにおいて、各ディレクトリやファイルの位置をテキストで記述したもの。
 ルートディレクトリの一覧を表示する場合は以下のコマンドです
```
ls -al /
```

コマンドの実行履歴を表示する
```
history
```
コマンドの実行履歴をviを活用し
bash とすることもできhistory　は便利なコマンドです

https://udemy.benesse.co.jp/development/system/shellscript.html


# シェルスクリプトの活用

pythonモジュールの実行を含めた シェルスクリプトを作ることで
ネットワークで接続した後にも自動で実行する仕組みを作成可能です

共同研究ではpython のモジュールを安全に実装する仕組みが必要でしたが
セキュリティを考えたネットワーク接続　や　シェルスクリプトの活用がイメージできました

docker を利用することで　自分のコンピュータの環境を汚すことなく、
テスト環境を模擬的に作ることもできるため　おすすめです