OmniAICreator/Qiita-1.07M huggingface dataset:
カレントディレクトリにPipfileが作成されない

## 事象

`pipenv`で仮想環境を作成した時にカレントディレクトリに**Pipfile**が作成されない
![スクリーンショット 2020-02-05 0.40.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252241/22e81f64-14a0-d2b6-d6f3-9d11d8d52a8e.png)

```フォルダ構成
parent
    └── child　←このディレクトリに作成したいが「parent」ディレクトリに作成されてしまう?
```


## 原因

親ディレクトリに**Pipfile**が存在していたため。
親ディレクトリに存在していると親ディレクトリの方を見るらしい……。

## 対応

親ディレクトリにある`Pipfile`が不要であれば、
削除してから再度仮想環境を作成するコマンドを実行する。

または、下記コマンドで仮想環境を作成することで親ディレクトリに`Pipfile`が存在していても
カレントディレクトリに`Pipfile`が作成される。

`PIPENV_NO_INHERIT=True pipenv --python 3`

## 参考サイト

- https://github.com/pypa/pipenv/issues/1317
- https://pipenv-ja.readthedocs.io/ja/translate-ja/advanced.html#pipenv.environments.PIPENV_NO_INHERIT
HTTPとは？GETとPOST？

#HTMLとは

HTTPとは
>WebサーバとWebクライアントの間でデータの送受信を行うために用いられるプロトコル（通信規約）。 Webページを構成するHTMLファイルや、ページに関連付けられたスタイルシート、スクリプト、画像、音声、動画などのファイルを、データ形式などのメタ情報を含めてやり取りすることができる。
[e-Words]http://e-words.jp/w/HTTP.html

リクエスト：ブラウザからサーバーへページの情報を要求する。

レスポンス：サーバーからブラウザへ応答する。


#HTTPリクエストメソッド
HTMLファイルなどデータを取得したいときはGETメソッド。
データをWebサーバーへ送信するときはPOSTメソッド。

#GETメソッド
URL末にWebブラウザからWebサーバーに渡す値をくっつけて送る。

例 http://www.~~~~~/test.html　　　⇒　　http://www.~~~~~/test.html?q=aaa

この場合閲覧履歴に残ってしまう…

#POSTメソッド
POSTメソッドで送った場合、HTTPリクエストのボディ部分につく。
そのためURLが変わらない。

他人に見られると困る情報（パスワード、クレジットカード番号など）を送るときはPOSTメソッドを使う。
【Linux】サーバーのスペックを調べるコマンドまとめ

稼働中のサーバーのメモリや、CPUや、ストレージをちょっと調べたい時のためのコマンドをまとめます。

# プロセス毎の使用率を確認

## メモリ降順

```
top -o MEM
```

## CPU降順

```
top -o CPU
```

# CPUのコア数を確認

```
cat /proc/cpuinfo |grep "cpu cores"
cpu cores : 2     # <-- 2コアと判断できる
```

# メモリ容量を確認

```
cat /proc/meminfo | grep "MemTotal"
MemTotal:      2058876 kB      # <-- 2GBと判断できる
```

# ストレージ・ディスクの容量を確認

```
df -Th
```

ファイルシステムを指定して表示する場合

```
df -Tht xfs
/dev/mapper/VolGroup00-LogVol00  ext3     26G   19G  5.6G  77% /     # 26GBと判断できる
```

* HDDかSSDか判断する方法
  * vda  -->  (おそらく) HDD
  * sda  -->  HDD 
  * sdb  -->  SSD
npm install で fetchMetadata から進まない

# 背景
- OSをアップデートした。(Catalina)
- 新規にパッケージをインストールしようとしてもできなかった。
- 元からあるプロジェクトのnode_modulesを削除してからの ``npm install`` はなぜかできた...?

＝＞ 調べよう。 

## こんな感じで進まない

![qiita.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520523/2e71e901-a363-1e0f-4a5c-c6494aa38780.png)
ChatBot 作ろうとしてた。
最初は ``botbuilder``のスペル間違えたのかな？とか、もうサポート終わっちゃったのかな？
とか思いましたが違ったようで、

# 対処法
```
$ npm config set http://registry.npmjs.org/
$ npm config set strict-ssl false
```
Windowsは

```
$ npm config set registry http://registry.npmjs.org/
```

``registry``をつけるといけるらしいです。

# 終わり
[Python]infで正の無限大を表す


float('inf')もしくはmath.infを使う。（math.infはPython3.5から）

## 実行してみる

```python
>>> float('inf')
inf

>>> import math
>>> math.inf
inf

>>> float('inf') == math.inf
True

>>> math.inf > 10 ** 10
True
>>> math.inf < 10 ** 10
False
```

## ドキュメント
https://docs.python.org/ja/3/library/math.html#math.inf
WindowsでMagicKeyboardを使う

# 環境
- Windows10Home
- MagicKeyboard（初代）
- Google日本語入力

# 実現したいこと
- WindowsでMagicKeyboardを使いたい
- 「英数」「かな」を有効化したい
- キーは左下から右に向かって「Ctrl」「Windows」「Alt」にしたい
- functionキーは特殊機能（音量調整等）ではなく標準機能（かな変換等）にしたい

# WindowsにMagicKeyboardを接続
設定　→　デバイス　→　Bluetoothとその他のデバイス　からMagicKeyboardを接続。

# ドライバインストール
以下リンクからWindowsBootCamp用ドライバをダウンロード。
https://support.apple.com/kb/DL1836?viewlocale=ja_JP&locale=ja_JP

キーボード以外のドライバも含まれているので、以下のドライバのみインストール。
bootcamp5.1.5722\BootCamp\Drivers\Apple\AppleKeyboardInstaller64.exe

# 「英数」「かな」を有効化
Google日本語入力プロパティ　→　キー設定の選択　→　編集

- モード：入力文字なし , コマンド：IMEを有効化　を「かな」キーに変更
- モード：入力文字なし , コマンド：IMEを無効化　を「英数」キーに変更

# キー割り当てを変更
以下リンクからKeySwapをインストール。
https://www.vector.co.jp/soft/winnt/util/se228667.html

- 「caps」を「Ctrl」に変更
- 「option」を「Windows」に変更
- 「command」を「Alt」に変更

スタートアップにKeySwapを登録。

# レジストリ変更
functionキーを標準機能にするためレジストリを編集。

[HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\KeyMagic]
"OSXFnBehavior"=hex:00

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\KeyMagic]
"OSXFnBehavior"=hex:00

# まとめ
この記事もWindowsでMagicKeyboardを使って書きました。
ITWeek2020について

#"ITWeek"とは
　ソフトウェア＆アプリ開発展、セールス自動化・CRM EXPO、組込み/エッジ コンピューティング展、データセンター＆ストレージ EXPO、情報セキュリティ EXPO、Web&デジタル マーケティング EXPO、クラウド業務改革EXPO、IoT&5Gソリューション展、次世代EC&店舗EXPO、AI･業務自動化展の10の専門展から構成されている日本最大のIT展示会。
　幅広くIT分野を網羅して開催することで、ビジネス拡大を求める出展社、来場者にとって欠かせない展示会となっている。

#主な展示内容
##ソフトウェア&アプリ開発展
　ソフトウェアの開発・保守・運用のための製品・技術が一堂に出展する専門展。
　毎年多数の企業の情報システム部門、ソフトウェア開発部門の責任者ならびに担当者が来場し、出展企業と活発な商談・受注を行っている。

##セールス自動化・CRM EXPO
　SFAや顧客管理、オンライン商談など営業を効率化する製品／サービスが一堂に出展する専門展。
　企業・団体の営業企画・営業推進、営業、経営者・経営企画、マーケティング部門の方々が、製品・サービスの導入を目的として多数来場。出展企業と活発な商談が行われる。

##組込み/エッジ コンピューティング展
　CPU/MCU、エッジ コンピューティング、ミドルウェア、ボード・コンピュータ、開発ツールなどが一堂に出展する展示会。
　自動車・輸送機器、FA機器、精密・医療機器、通信・モバイル機器、家電・AVなどのセットメーカーの設計者・開発者の方々が多数来場し、出展企業と活発な商談が行われる。

##データセンター＆ストレージEXPO
　電源・空調・ラックなどのデータセンターファシリティをはじめ、運用管理・バックアップソフト、SAN/NASからテープストレージまでITインフラを支える技術が一堂に出展する専門展。
　データセンター事業者・ゼネコンの設備・設計、運用・管理部門の方々や企業・官公庁・団体の情報システム、経営者、経営企画部門の方々が多数来場し、出展企業と活発な商談が行われる。

##情報セキュリティ EXPO
　情報セキュリティ・標的型攻撃 対策のあらゆる製品が一堂に出展する専門展。
　毎年多数の企業のリスク・セキュリティ管理部門、情報システム部門、経営・経営企画部門、監査部門、法務部門の 責任者ならびに担当者が来場し、出展企業と活発な商談・受注を行っている。

#Web&デジタル マーケティング EXPO
　マーケティングオートメーション、AI(人工知能)、WEBマーケティング、アドテク・動画広告など、マーケティングに関するソリューションが一堂に出展する専門展。
　各企業のマーケティング部門、広報・宣伝部門、営業企画・営業推進部門、販売促進部門の 責任者ならびに担当者が来場し、出展企業と活発な商談を行っている。

##クラウド業務改革 EXPO
　クラウド業務改革 EXPO【春】は、ERP、グループウェア、ビジネスチャット、クラウドプラットフォーム、働き方改革ソリューション、リモートワークソリューション、モバイル業務支援などの製品／サービスが一堂に出展する専門展。
　企業・官公庁・団体の情報システム、経営者、経営企画・業務改革、総務・人事・経理、マーケティング、顧客サービスなどの部門の方々が多数来場し、出展企業と活発な商談が行われる。

##IoT&5Gソリューション展
　遠隔監視、予知保全、生産管理、５Gソリューション、ローカル5G、IOTデータ活用、通信モジュール、M2Mデバイスなどが一堂に出展する専門展。
　本展には、製造業をはじめ、社会インフラ（電気、ガス、水道など）、流通サービス業などの企画・開発、システム、生産部門の責任者ならびに担当者が来場し、出展企業と活発な商談を行っている。

##次世代 EC&店舗EXPO
　通販支援サービスや店舗運営・集客・接客ソリューション、さらにはネットと実店舗の連携サービスなどの製品が多数出展する展示会。
　本展には小売業、通販・ネットショップ、飲食・サービス、メーカー、ホテル・レジャーなどの業種の経営、EC、マーケティング、物流、システムの方々が多数来場し、出展企業と活発な商談・受注を行っている。

##ＡＩ・業務自動化 展
　ＡＩ（人工知能）技術・製品や、RPA・チャットボットなど業務自動化ソリューションが一堂に出展する専門展です。
　企業の情報システムや経営者、経営企画、総務、人事、マーケティング、開発の責任者の方が多数来場し、出展企業と活発な商談が行われます。
【Visual Studio for Mac】Debugger operation failed launch: program '' does not exist.の対処法

#使用ツール

VisualStudio for Mac : 8.4.3

#現象

VisualStudio for MacでDebugをしようとした際に、下記のエラーが出現

<img width="598" alt="スクリーンショット 2020-02-05 0.23.27.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/360790/6f886076-3cfe-7f16-eb60-2fe64662bfcd.png">

私の場合は、AzureFunctionのコードをデバッグしようとした時に発生しました。

#解決

ターミナルで以下のコマンドを実行
`ln -s /usr/local/share/dotnet/dotnet /usr/local/bin/`


どうやらローカル実行する場合はbinにパスを設定する必要があるらしい。
以上。
Jetson TX2でDeepStream SDKを動かしてみた

# 概要
この記事ではJetson TX2でDeepStream SDKのサンプルアプリを動かす手順を紹介しています。
DeepStream SDKを使用することで、Jetsonでの映像処理やディープラーニングの推論処理を高速に処理できるようになります。
今回動かすサンプルアプリは、USBカメラの映像を入力にして物体検出（PersonやCarなどを検出）を行う内容になります。

# 環境情報
Jetpack 4.3
Jetson TX2
カメラ：LOGICOOL HD PRO WEBCAM C920 

# Jetpack導入
TX2へのJetpackの導入は、NVIDIA SDK MANAGERを使って実施します。
手順については以下の記事を参考にしてください。

https://dev.classmethod.jp/hardware/jetson-setup-jetpack-with-sdkmanager/
https://qiita.com/harmegiddo/items/eb0e4796221b19f28d93

ただし、今回DeepStream SDKを使用するので、以下の画面でDeepStreamにチェックを入れます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103795/dbd41ee4-3948-dce2-dedb-ece4c2d4d7ec.png)


# jetson-stats導入
リソース使用量が見たくなるのでjetson-statsを入れておきます。

```bash
# pipをインストール
$ wget https://bootstrap.pypa.io/get-pip.py
$ sudo python3 get-pip.py
# jetson-statsをインストール
$ sudo -H pip3 install jetson-stats
# 実行してみる
$ jtop
```
jtopを起動すると以下のような画面でCPUやGPUの使用量を確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103795/7536df28-d357-f321-ae9f-3d2b71998b24.png)


# v4l-utilsをインストール
USBのカメラを使うのでv4l-utilsをインストールしておきます。

```bash
$ sudo apt-get install v4l-utils
```

# カメラの確認
v4l-utilsでTX2に接続されているカメラを確認します。 
/dev/video1にUSBカメラがついているのが確認できます。

```
$ v4l2-ctl --list-devices
vi-output, ov5693 2-0036 (platform:15700000.vi:2):
	/dev/video0

HD Pro Webcam C920 (usb-3530000.xhci-2.2):
	/dev/video1       
```

# サンプルアプリ実行
サンプルコードをHOMEディレクトリにコピーします。

```bash
$ mkdir ~/work
$ cp -r /opt/nvidia/deepstream/deepstream-4.0/samples/ ~/work
$ cd work
```
source1_usb_dec_infer_resnet_int8.txtを1箇所修正します。

```
$ vi samples/configs/deepstream-app/source1_usb_dec_infer_resnet_int8.txt 
```

USBカメラは/dev/video<font color="Red"><b>1</b></font>であることを確認しているので、
29行目camera-v4l2-dev-nodeを1に変更します。
(確認の結果USBカメラが/dev/video0であった場合には0のままにしておきます)

```config:source1_usb_dec_infer_resnet_int8.txt
 21 [source0]
 22 enable=1
 23 #Type - 1=CameraV4L2 2=URI 3=MultiURI
 24 type=1
 25 camera-width=1280
 26 camera-height=720
 27 camera-fps-n=30
 28 camera-fps-d=1
 29 camera-v4l2-dev-node=1   # 0から1に変更
```
今回使うモデルで検出できるラベルを確認します。


```bash
$ cat samples/models/Primary_Detector/labels.txt 
Car
Bicycle
Person
Roadsign
```


プログラムを実行します。

```bash
$ deepstream-app -c samples/configs/deepstream-app/source1_usb_dec_infer_resnet_int8.txt 
```

以下は車を検出した時の画面です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103795/0ba38ddb-20f4-1e95-5e73-6bfea728cd57.png)

アプリを実行しているターミナルには以下のような出力があり、24FPSぐらいで処理できていることがわかります。

```bash
**PERF: 26.12 (26.12)	
**PERF: 24.00 (25.02)	
**PERF: 23.99 (24.67)	
**PERF: 23.99 (24.50)	
**PERF: 24.02 (24.40)	
**PERF: 24.00 (24.33)	
**PERF: 24.00 (24.28)	
**PERF: 23.99 (24.25)	
**PERF: 24.02 (24.22)	
**PERF: 23.99 (24.20)	
**PERF: 24.00 (24.18)	
**PERF: 24.00 (24.17)	
**PERF: 24.00 (24.15)	
```

アプリを動かしている時のjtopの様子も以下のような感じで、GPUが有効に使用されているのが確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103795/7e45dc7b-8ea1-a15b-eec8-672a192ea1e0.png)

# まとめ
DeepStream SDKを使うことで、USBカメラの映像から高速に物体検出できることが確認できました。
また、今回動かしたリファレンスアプリ（deepstream-app）はConfigの変更で他にも色々できそうなので、今後試してみたいと思います。
セキュリティマネジメントの勉強ー脅威と脆弱性

#脅威と脆弱性
##脅威の種類
・物理的脅威…事故、故障、盗難、破壊など
・技術的脅威…不正アクセス、クラッキング、改竄など
・人的脅威…誤操作、紛失、不正利用など

##人的脅威
故意だけではなく、過失や誤謬もある
シャドーIT(勝手に私物端末を持ち込む)も含まれる

##具体例
・サイバー攻撃
・風評、炎上
・SPAM
・マルウェア

##マルウェア
１：ルートキット
攻撃後に自分の痕跡を消す

２：バックドア
正規の手続き踏まずに利用できる通信経路を作る

３：スパイウェア
キーロガーとか承諾なしに無断dlするダウンローダとか

４：ウイルス
マルウェア一般の総称

５：トロイの木馬
悪意のないプログラムと見せかけて不正な動きをする
自己伝染機能はない

６：ランサムウェア
勝手に暗号化して身代金要求する

７：アドウェア
広告付きの無料ソフトウェア
たまに悪いやつがいる

８：マクロウイルス
マクロに感染する

９：ボット
自動プログラム
マルウェアとは限らないが、ボットネットとして協調して攻撃する場合がある
遠隔操作ウイルスやC&C(Command & Control)サーバを利用してボットに司令が出されることが増えてる

１０：ワーム
自身を複製して他のシステムに拡散する
宿主となるファイルが存在しない

１１：偽セキュリティソフト
偽の警告を出して有償版購入を迫るマルウェア
金銭をだまし取るのが目的

１２：エクスプロイトコード
脆弱性検証用のコード
無暗に公開しないように
git push -u origin xxx の意味が分からないので調べてみた


```
[student@workstation DO288-apps]$git checkout -b source-build
Switched to a new branch 'source-build'
[student@workstation DO288-apps]$git push -u origin source-build...output omitted...
* [new branch]      source-build -> source-build
Branch source-build set up to track remote branch source-build from origin.
```

これの意味が分からないので、調べてみた。

リンクのみ提示の他力本願。

`git push -u` の-uの意味。
https://qiita.com/shumpeism/items/1b8027c8905ca826416d

origin とか master の意味。
https://qiita.com/seri1234/items/e651b3e108a695a92809

結論としては、ローカルで作成したブランチ source-build での変更を、リモートリポジトリの source-build ブランチに紐づける設定？
ローカルブランチは暗黙(前のコマンドgit checkout -bでスイッチしているから)で、git push -u origin source-build で指定している originもsource-buildもリモートリポジトリ上のリソースを指定。
でもローカルブランチ source-buildとリモートブランチ source-buildは一致させておかないと駄目なようだ(エラーになった)。
ElmでCRUDを作る - 其のC ①

書きためたサンプルコードをアウトプット中です。
記事にすると改めて理解不足だった部分が洗い出されて良い復習になってます。
もし理解が間違っている箇所があれば指摘いただけると嬉しいです。

ちなみにこの記事は前の記事からの続きになってます。
さらに続きもありますのでよかったらどうぞ。

[ElmでCRUDを作る - 其のR](https://qiita.com/akkey2475/items/768922a14174f26ec1dc)

ElmでCRUDを作る - 其のC ① (この記事)

[ElmでCRUDを作る - 其のC ②](https://qiita.com/akkey2475/items/32cdc207df94d7135cc3)

[ElmでCRUDを作る - 其のD](https://qiita.com/akkey2475/items/3f070309d04253febac4)

# 今回作ったもの

TODOリストです。
前回の記事でR(Read)を作ったので、次はC(Create)を実装してみます。
Createは２段階に分ける予定です。

今回はボタンをクリックするとリストにアイテムが追加されるだけのものを作ります。

# まずは完成品

完成品こちらです。ここ([Try Elm!](https://elm-lang.org/try))で貼り付けて動作を試せます。

```elm
import Browser
import Html exposing (..)
import Html.Events exposing (..)


-- MAIN

main =
  Browser.sandbox
    { init = init
    , update = update
    , view = view
    }


-- MODEL

type alias Model =
  { list : List String }

init : Model
init = Model []


-- UPDATE

type Msg
  = AddItem String

update : Msg -> Model -> Model
update msg model =
  case msg of
    AddItem addText ->
      { model | list = model.list ++ [ addText ] }


-- VIEW

view : Model -> Html Msg
view model =
  div []
    [ button [ onClick ( AddItem "item" ) ] [ text "Add" ]
    , makeList model.list
    ]


-- ユーザー定義関数

makeList : List String -> Html Msg
makeList list =
  ul [] ( List.map makeListItem list )

makeListItem : String -> Html Msg
makeListItem itemText =
  li [] [ text itemText ]
```

# 解説

## モジュールの読み込み

```elm
import Html.Events exposing (..)
```

前回に加えてHtml.Eventsモジュールを追加しました。

## メイン関数

ここは前回から変更はないので割愛します。

## モデルの定義と初期化

ここも同じく前回から変更なしですね。割愛します。

## 更新処理の定義

```elm
type Msg
  = AddItem String
```

メッセージ(Msg)を定義します。
typeで宣言する型をカスタム型と言って、その値をバリアントというらしいです。

[カスタム型（Custom type）](https://guide.elm-lang.jp/types/custom_types.html)

つまり、Msgはカスタム型でAddItemがバリアントですね。
AddItemはString型の値を１つ持つことにします。

```elm
update : Msg -> Model -> Model
update msg model =
  case msg of
    AddItem addText ->
      { model | list = model.list ++ [ addText ] }
```

更新時にメッセージとして渡されたバリアントに応じた処理を記述します。
今回は処理は１つだけです。AddItemバリアントが渡ってきた場合の処理を記述します。
AddItemの持つString型の値にはaddTextという名前を当てています。
元のモデルのlistにaddTextを足したものを新しいモデルのlistとして生成します。

## ページ描画処理の定義

```elm
view : Model -> Html Msg
view model =
  div []
    [ button [ onClick ( AddItem "item" ) ] [ text "Add" ]
    , makeList model.list
    ]
```

view関数ではリストにアイテムを追加するための"Add"ボタンと、リストを表示しています。
"Add"ボタンをクリック(onClick)すると"item"という値を持つAddItemバリアントを更新処理に渡されます。
リストの表示に関しては前回と同じです。

## ユーザー定義関数

ここは前回から変更なしです。割愛します。

# まとめ

今回はリストへのアイテム追加処理のみを実装しました。
ただ現状では固定の文字列が追加されるのみでTODOリストにならないので、次回は任意の文字列をリストに追加できるようにします。

[ElmでCRUDを作る - 其のC ②](https://qiita.com/akkey2475/items/32cdc207df94d7135cc3)
PowerShellからJupyterNotebook/Labを起動できなくなった問題

#Jupyter Notebook/Labがコマンドから起動しない
タイトルの通り。
解決までに時間がかかったので備忘録として。
初歩的なミスです。

##発生した問題
本来ならPowerShellから
```jupyter notebook```
とコマンドを入力すればJupyter Notebookが起動します。

Anaconda Powershell Promptからは起動できます。
しかしwindowsにインストールされていたPowershellからは起動できませんでした。

##エラーメッセージ
```
Traceback (most recent call last):
  File "C:\Users\anaconda3\lib\site-packages\notebook\services\sessions\sessionmanager.py", line 9, in <module>
    import sqlite3
  File "C:\Users\anaconda3\lib\sqlite3\__init__.py", line 23, in <module>
    from sqlite3.dbapi2 import *
  File "C:\Users\anaconda3\lib\sqlite3\dbapi2.py", line 27, in <module>
    from _sqlite3 import *
ImportError: DLL load failed: 指定されたモジュールが見つかりません。

Traceback (most recent call last):
  File "C:\Users\anaconda3\lib\site-packages\jupyterlab_server\server.py", line 20, in <module>
    from notebook.notebookapp import aliases, flags, NotebookApp as ServerApp
  File "C:\Users\anaconda3\lib\site-packages\notebook\notebookapp.py", line 83, in <module>
    from .services.sessions.sessionmanager import SessionManager
  File "C:\Users\anaconda3\lib\site-packages\notebook\services\sessions\sessionmanager.py", line 12, in <module>
    from pysqlite2 import dbapi2 as sqlite3
ModuleNotFoundError: No module named 'pysqlite2'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "C:\Users\anaconda3\Scripts\jupyter-lab-script.py", line 5, in <module>
    from jupyterlab.labapp import main
  File "C:\Users\anaconda3\lib\site-packages\jupyterlab\labapp.py", line 14, in <module>
    from jupyterlab_server import slugify, WORKSPACE_EXTENSION
  File "C:\Users\anaconda3\lib\site-packages\jupyterlab_server\__init__.py", line 4, in <module>
    from .app import LabServerApp
  File "C:\Users\anaconda3\lib\site-packages\jupyterlab_server\app.py", line 9, in <module>
    from .server import ServerApp
  File "C:\Users\anaconda3\lib\site-packages\jupyterlab_server\server.py", line 26, in <module>
    from jupyter_server.base.handlers import (                          # noqa
ModuleNotFoundError: No module named 'jupyter_server'
```

No moduleと言われていますがAnaconda Powershell PromptからはJupyter Notebookを起動できるため既にAnacondaに入っているはず。
怪しいのは
```ImportError: DLL load failed: 指定されたモジュールが見つかりません。```
の部分。

##解決策
似たようなエラーが発生している人を発見しました。
（https://qiita.com/HashiY/items/71b7d205624c2b9e128e）
読み込むべきファイルのPathが通っていないため、windows側から読み込むことができずに起動できないと考えました。

環境変数に
```C:\Users\Anaconda3\Library\bin```
を追加。

無事起動して解決。
Herokuでのエラーログ確認方法

# Herokuでエラー発生
自作のアプリケーションをHerokuにアップし動作確認をしたところエラーが発生しました。
エラーの場合はオリジナルのエラーページに飛ばしていたのでなんのエラーか確認できなかったので、
下記の方法でエラーを確認することができました。

# ログの確認
下記コマンドで常にコマンドを吐き出させることができます。
`heroku logs --tail`
※終了させるには、`ctrl+c キー`を押下してください。

私の場合、500エラーが出ていることがわかりました。
そこで詳細エラーログを確認しました。

# 詳細エラーログの確認
下記コマンドを使用し、HerokuのAPP_DEBUGをtrueに変更することで、エラー発生時にエラーメッセージが詳細に出力された画面に遷移します。
`heroku config:set APP_DEBUG=true`

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/347621/0b0295f7-1853-510f-2c1c-4bcc6f6ed1d3.png)

エラーを再現し、エラーメッセージを確認することができました！
新しい項目を追加したのに、migrateを行うのを忘れていました。。。
確認し終えたらfalseに戻してあげましょう。

`heroku config:set APP_DEBUG=true`

以上、Qiita初投稿でした。


# 編集後記
この記事を公開後同期の @laughingman より便利な機能を紹介してもらいました。
### papertrailというアドオンです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/347621/158e3eb2-2c22-be55-c85e-0e823a22d00c.png)
Papertrailを押下すると、管理画面に飛ぶことができます。
エラーが起きたよ！と言われて、自分で再現させずとも管理画面から探しにいくだけで良さそうですね。
[参考]http://vdeep.net/heroku-papertrail
UiPath　ネットワークドライブ上のファイル操作　

UiPathでファイル操作をする際に、マウスカーソルで実行するよりも、コマンドプロンプトで操作した方が、楽で確実なので好んで使用しているのですが、ネットワークドライブ上のファイルを操作する際に悩んだので備忘録です。

ローカルドライブ内のディレクトリならば「CD」コマンドで目的のディレクトリに移動すれば問題ないのですが、ネットワークドライブの場合は、「CD」コマンドでは移動できないので、以下のコマンドを使用します。

（コマンドプロンプト起動していること）

「文字を入力/type into」アクティビティに

```
"pushd \\ネットワークドライブパス　[k(enter)]"
```

を入力します。これでネットワークドライブ上のディレクトリにアクセスできます。

ファイルのコピーやリネーム、移動等目的の作業が終わった後は
「文字を入力/type into」アクティビティに

```
"popd[k(enter)]"
```

で元に戻ります。

◾️概要説明

コマンドプロンプトで、ネットワークドライブに移動しようとすると、「指定されたドライブが見つかりません」というエラーが表示されるのですが、回避方法としては、ネットワークドライブにドライブ文字を割り当てる必要があるようでした。

ただ、UiPathで使用するとなると、規模が拡大すれば、ゆくゆくは別端末から実行する事も想定されます。
その際に、わざわざ同一ドライブを割り当てないと実行できないのが不便そうなので、「pushd」コマンドで一時的にドライブを割り当て、作業が済んだら「popd」でドライブ割り当てを解除するという方法が便利だと思います。
multiprocessing + psycopg2 でハマったところ

## やりたかったこと

複数回`pd.read_sql`実行する処理を`multiprocessing`で並列処理したかった。

## Versions

|Name|Version|
|:-:|:-:|
|python|3.7.3|
|pandas|0.24.2|
|numpy|1.16.2|
|psycopg2-binary|2.8.4|
|PostgreSQL|11.5|

## 成功例（非並列ver.）

### コード

```python
import multiprocessing
import pandas as pd
import numpy as np
import psycopg2

def get_connection():
	connection = psycopg2.connect(
						host='hostname',
						user='username',
						database='databasename',
						password='password')
	return connection

def function():
	for fuga in hoge:

		# fuga, pd.read_sql(sql='SELECT yyy...', con=conn)を含むなんらかの処理

	return

if __name__ == '__main__':
	with get_connection() as conn:
		hoge = np.ravel(pd.read_sql(sql='SELECT xxx...', con=conn).to_numpy())

		function
```

## 失敗例

上記成功例のコード最下部を`multiprocessing`で書き直し、それに応じて変数を食えるように`function()`を修正したところ、エラーが出力された。

### コード

```python
def function(i):
	fuga = hoge[i]

	# fuga, pd.read_sql(sql='SELECT yyy...', con=conn)を含むなんらかの処理

	return

if __name__ == '__main__':
	with get_connection() as conn:
		hoge = np.ravel(pd.read_sql(sql='SELECT xxx...', con=conn).to_numpy())

		with multiprocessing.Pool(processes=64) as pool:
			for _ in pool.imap_unordered(function, range(len(hoge))):
				pass
```

### エラー抜粋

```bash
multiprocessing.pool.RemoteTraceback:

# 中略

psycopg2.OperationalError: lost synchronization with server: got message type

# 中略

psycopg2.InterfaceError: connection already closed

# 中略

pandas.io.sql.DatabaseError: Execution failed on sql: SELECT yyy...
lost synchronization with server: got message type
unable to rollback

# 中略
```

## 成功例

上記失敗例のコードにおいて、`function()`に接続情報を書くことで回避できた。

### コード

```python
def function(i):
	with get_connection() as conn:
		fuga = hoge[i]

		# fuga, pd.read_sql(sql='SELECT yyy...', con=conn)を含むなんらかの処理

	return
```

## 注意

並列数や`function()`の処理内容に依っては下記エラーが出るが、`export OMP_NUM_THREADS=1`とすることで回避できた。

```bash
OMP: Error #34: System unable to allocate necessary resources for OMP thread:
OMP: System error #11: Resource temporarily unavailable
OMP: Hint Try decreasing the value of OMP_NUM_THREADS.
```
Digitization -> Digitalization -> Digital Transformation (DX) に関する備忘録 中国 深センのIT化 / 自動化

東京の渋谷にあるTech Playで2月4日に開催された富士通で理事をされている中山五輪男氏の講義です。
Tech Playはパーソル関連会社が取り仕切っており、企業の採用活動の一環としてセミナー形式でアフターファイブや週末に集客し企業の採用活動に結び付ける取り組みのようです。（今回でいうと富士通がTech Playに資金提供をしているような流れ）。100名の収容人数に対し抽選で半数の100名以上が落選されていたので、自分自身の備忘録にしがてら何が話されていたか共有しようと思います。

#Digitization vs. Digitalization vs. Digital Transformation (DX)
Digitization: 紙を単純に電子化するイメージ
Digitalization:　高速化や金銭の節約のイメージ
Digital Transformation (DX): 新たな収益モデルの創造で
　　　　　　　　　　　　　　　深センのような人々の動き自体がデジタル化しており、
　　　　　　　　　　　　　　　デジタルの中にリアルがあるイメージ

※紙を単に電子化することをdigital transformationとは言うべきではないが勘違いしている人が多い

#世界競争力ランキング(IMD)

63か国中、1位だった日本は今や30位、デジタル推進力がある国が上位に。
**https://www.mri.co.jp/knowledge/insight/20190806.html**
政府の効率性は38位、ビジネスの効率性は46位、ビッグデータの活用や分析、国際経験、起業家精神は最下位。
ますます低下をする一方。

#ビフォーデジタルとアフターデジタル（日本国内での造語）
ビフォーデジタル：Online to Offline, リアルとデジタルのオーバーラップ
アフターデジタル：Online merge Offline, デジタルの中に完結する形でリアルがある
今まではオフラインが前提だったが、5Gのアフターデジタルの時代ではオンラインが前提。
ヒト、モノ、カネ、データが常にオンライン

#デジタルの中心地はシリコンバレーではない。中国の深セン。
1980年30万人の農村が1400万人の近代化都市へ。
平均年齢は32.5歳、東京都は44.4歳。
10人に1人が社長。
HUAWEI（スマホ）、DJI（ドローン）、ZTE（スマホ）、テンセント（WeChat）の中心。
中国のいま働きたい会社ランキングはアリババ、Baidu、バイトダンス、フォースン、ニーオといった中華系がトップに来て次にテスラ、さらにディディ、アマゾン、ファーウェイ、メイテゥアンディエンビン、アントフィナンシャル（Alipay）、ネットイースに続き、JD（京東）が続く。

**JD（京東）のデジタル化は進んでいる。自動倉庫、無人スーパー（リアルと配送センターの組み合わせ）、ロボットレストランなど多数すでに展開済。
自動倉庫（YouTube動画リンクは筆者にて収集）：
https://www.youtube.com/watch?v=YN_FUMXUT0o
自動化レストラン（YouTube動画リンクは筆者にて収集）：
https://www.youtube.com/watch?v=b36KMK6ggoA
自動スーパー・配送センターの盒馬鮮生など：
リアルタイムで価格も変えられる。（YouTube動画リンクは筆者にて収集）
https://www.youtube.com/watch?v=b7H__AWKR_Y
https://www.youtube.com/watch?v=Q1eh_Xt4y58
https://www.youtube.com/watch?v=TG38mV8jd98
https://www.youtube.com/watch?v=W0KWE3gL5E4
https://www.youtube.com/watch?v=U9SMXCdKLqk
都市内の人や車の混雑状況が当局がリアルタイムにわかる（YouTube動画リンクは筆者にて収集）：
https://www.youtube.com/watch?v=ha1gRH_vXzE**

なんでもかんでもロボット化するのではなく、リアルでないといけないのはリアルを残していたりする（生鮮食品などお客さんが選びたいものはリアル店舗で買える、次回以降は通販に誘導もできる、消費行動はすべて蓄積できる）

深センでは・・・
自動車も歩行者も信号無視の検知が自動化され、だれが何度目の違反かすぐにわかり罰金徴収もキャッシュレスで自動化されるところまで来ている。スマホのながら運転も自動検知。
https://www.scmp.com/tech/innovation/article/3022961/next-time-you-go-through-red-light-china-its-growing-facial
強盗事件の犯人は30分で逮捕。財布を落としても戻ってくる。（誰かがとったらすぐに犯人がわかる時代）

（筆者により情報追加）
3年前でもここまで自動化されていた。
ユニクロやGUでもRFIDによる近いものはあるが、中国の無人コンビニの例。
営業停止店舗も多いようだが社会実験としての意義が大きかっただろうと思う。
https://www.youtube.com/watch?v=Yygyw5SyjwQ&list=PLOr-BSQI2oWrtRnkBBdhpW__lH8z4Vd8r&index=6&t=0s

#通信回線
1G 1980s
2G 1990s
3G 2000s
4G 2010s
5G 2020s すでにアメリカ、EU、中国、韓国では開始済。日本では2020年春デビュー。
　　　　4Gとの違いは（１）高速・大容量　（２）同時多接続　（３）低遅延
・映画2時間分のデータ転送時間が3秒
・4Gでは1kmx1kmでMAX10万台だったのが5Gでは100万台に。
・タイムラグが10分の1で10ミリ秒から1ミリ秒へ。100km/hの車の停止の指令を出すまでに2.8cmの距離。

#次の本はお勧め
AI新時代 富士通エバンジェリストが見据える未来ビジョン
富士通エフ・オー・エム株式会社 (FOM出版) (著), 中山 五輪男 (監修)
**https://amzn.to/37YjA7x**

アフターデジタル オフラインのない時代に生き残る
藤井 保文 (著), 尾原 和啓  (著)
**https://amzn.to/3b9EGlt**
ネットワーク設計現場で作る資料たち

#はじめに
基本、エンジニアは資料作成がてんこ盛りの毎日だと思います。
この記事ではネットワークの設計現場で作成している資料たちを紹介します。
作成に使用するソフトは現場によってはVisioを使ってるところもあるようですが、
私はほぼExcelを使って作ります。ここに挙がっている例図も全てExcelで作成しました。
（出来栄えは、ご容赦ください。。）

#物理構成図
システムを構成するネットワーク機器の物理的な接続関係を表した図です。
具体的にいうと、【どの機器】と【どの機器】の【どのインターフェース】同士が繋がっているのか、
また【どのようなケーブル】で繋がっているのかを表しています。

大規模なシステムになると、全体の物理構成が１sheetに収まらないので、
複数sheetに分けたりとかしたり。（管理LANのsheet、本番LANのsheetなど）

ケーブルの種類や規格については以下記事を参照ください↓
[イーサネットの規格](https://qiita.com/FJ-K/items/0c05ecacdbb841328394)

例図：
![物理構成図.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/537417/16b2c2b6-744f-6e03-6190-5bc9de3c1bb1.png)

#論理構成図
システムを構成するネットワーク機器がどのネットワークセグメントに属しているかを表した図です。
そのため、IPアドレスを持っていない機器（L2スイッチやHUBとか）は登場しません。
※L2スイッチでも管理用IPアドレスを持っている機器は登場します。

最近では、ネットワークの仮想化（ルータ・ファイアウォールとか）技術によって、
システムを構成するネットワークが大きくなり、仮想化で分離したネットワーク毎に図を作ったりします。

ネットワークの仮想化技術については以下を参照ください↓
[VRFの概要と仕組み ～VRF-Liteとの違い,構成例,設定例について～](https://milestone-of-se.nesuke.com/nw-basic/routing/vrf/)

例図：
![論理構成図.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/537417/6ae83dc6-1c06-6608-0f89-9f0c8ae94d82.png)

#IPアドレス一覧表
その名の通り、システムを構成する全てのIPアドレスをネットワークセグメント毎に一覧化して、
システムを構成する全ての機器（サーバ含め）が持っているIPアドレスと紐づけて表します。
IPアドレス＝住所と言われてる通り、システムを構成する機器たちの住所録です。
ネットワーク部隊のみならず、設計・構築する全部隊の【神資料】となるべく作成・管理します。

例図：
![IPアドレス一覧表.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/537417/3ac10754-c74b-2ce9-b700-9c72e44a304e.png)

#パラメータシート
ネットワーク機器に設定した情報を記載した資料です。
現場によって呼び名は様々かもしれません。設定情報シートとか？
メーカからフォーマットを提供してもらったり、なければ自身で作成したりします。

機器によっては、持っている機能全て記載すると膨大な量になってしまうので、
使用している機能だけを抜粋して記載する場合もあります。

原則、パラメータシートと実機から取得したコンフィグファイルが
イコールになっていることが正しい状態といえます。

例図：
![パラメータ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/537417/e798238e-75c5-65aa-72cf-5f3513a736d6.png)

今後もちょこちょこネットワーク関連の記事を投稿しようと思います。では。
node.jsからMongoDBに接続してDocumentを登録する。

#はじめに
node.jsからMongoDBをインストールして、接続しようとしたところ、最初の接続で少し躓いたので、まとめる。

#環境
- Windows10 Pro 64bit
- node.js v12.14.1
 - mongodb v6.13.4 
- MongoDB 4.2.3

#環境構築
##node.jsにmongodbをインストール
以下コマンドを実行
`npm install mongodb`

##MongoDBをインストールする。
公式サイトからWindows用のインストーラをダウンロードしてインストールする。
実行して「次へ」ボタン押していく。

インストール後に環境変数にPathを追加する。
`C:\Program Files\MongoDB\Server\4.2\bin`

#MongoDB側の準備
MongoDB Compass Communityを使用して、取得したいdatabaseとDocumentを作成しておく。
左下のボタンで押下すると、Create Databaseのダイアログが出るので、入力するだけ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/10294/c8ec4577-3a30-1052-c30c-1306c7b4ecc8.png)

#node.js側のコード
以上で準備完了。実際のサンプルコードは以下。
コメントアウト部分は旧VersionのMongoDBの記載方法です。
ネットで見つけた旧Versionの記載方法だと`TypeError: db.collection is not a function`のエラーになりはまる。

```node.js
const MongoClient = require("mongodb").MongoClient;
const dburl = "mongodb://localhost:27017/";
// const dburl = "mongodb://localhost:27017/myDatabase";

MongoClient.connect(dburl, (error, client) => {
  const collection = client.db('myDatabase').collection('myCollection');
  // const collection = client.collection('myCollection');

  collection
    .insertOne({_id: 1, path: "test"})
    .then(()=> console.log("success"))
    .catch(err => console.log(err));
});
```

#最後に
MongoDB以外にも、Electronもバージョンによって、大きく記述方法が変わっており、ネットで調べたコードでそのまま動かしてもうまく動かず躓くことが多い。。。
公式サイト読めばいいのだけど、時間かかるしで、少しジレンマを感じる今日この頃。
自分のためのAlexaテンプレート（ts version）をつくった

# はじめに
[少し前](https://qiita.com/ufoo68/items/46dffd560ce9ee9661e3)にAlexaのスキルを作ってそれっきりだったので、今回スキル開発に手をつけてみました。
しかしこのAlexaのスキルのテンプレートは生のJavaScript（要は型がないもの）しかなかったので自分用に[TypeScript](https://www.typescriptlang.org/)のテンプレートを作ってみました。

# 材料
今回は[Hello World](https://github.com/alexa/skill-sample-nodejs-hello-world)のテンプレートをベースにTypeScriptに改造しました。このテンプレートのスキルは単純に「こんにちは」等という言葉に対して「ハローワールド」と返すだけの単純なものです。

# 加えた改造
まずは`typescript`の導入です。

```bash
yarn add -D typescript tsc
```

ここは完全テンプレですが、とりあえず以下で`tsconfig.json`を作ります。

```bash
./node_modules/.bin/tsc --init
```

とりあえず`outDir`と`rootDir`は以下のように指定して、後は特に設定をいじりません。

```
"outDir": "./lambda/custom"            
"rootDir": "./src"
```

これで終わっても良かったのですが、[ESLint](https://eslint.org/)と[Prettier](https://prettier.io/)がないのが不満だったので入れることにしました。この２つを用いてコードの静的解析と自動補正を有効化します。導入は[ここ](https://qiita.com/y-w/items/dcf5fb4af52e990109eb)を参考にしました。あとは保存時に自動補正をかけるようにvscodeの設定を拡張します。

```json:.vscode\settings.json
{
  "editor.renderControlCharacters": true,
  "editor.formatOnSave": false,
  "editor.codeActionsOnSave": {
    "source.fixAll.eslint": true
  },
  "eslint.format.enable": true,
  "eslint.packageManager": "yarn",
  "eslint.workingDirectories": ["./src"],
  "eslint.validate": [
    "typescript"
  ]
}
```

`editor.formatOnSave`は無効化しておかないとprettierと喧嘩してしまいます！後はついでに[husky](https://github.com/typicode/husky)を入れてcommitしたときにeslintとかを走らせてエラーを検出するようにします。導入は[ここ](https://dev.classmethod.jp/node-js/pre-commit/)を参考にしながら、[こんな感じ](https://github.com/ufoo68/alexa-hello-ts/blob/master/package.json)で`package.json`を作成しました。

# コードの改造
元のJSのコードをTypeScriptでトランスパイルできるように書き換えました。細かい内容は省略しますが、特に面倒だったのが多言語対応でした。テンプレートのコードでは[i18next](https://www.i18next.com/)を使って`addRequestInterceptors`の中のハンドラーでゴニョゴニョするような実装（説明適当www）をしていましたが、これをTypeScriptで書き換えるのは辛かったので[こんな感じ](https://github.com/ufoo68/alexa-hello-ts/blob/master/src/languageStrings.ts)で自作関数に書き換えました。
コード全体は[ここ](https://github.com/ufoo68/alexa-hello-ts)で公開しているので一部のみを抜粋して、インテントハンドラーはこんな感じで書き換えました。

```typescript
const HelloWorldIntentHandler: Alexa.RequestHandler = {
  canHandle(handlerInput) {
    return (
      handlerInput.requestEnvelope.request.type === 'IntentRequest' &&
      handlerInput.requestEnvelope.request.intent.name === 'HelloWorldIntent'
    )
  },
  handle(handlerInput) {
    const speakOutput = languageStrings(handlerInput).HELLO_MSG
    return (
      handlerInput.responseBuilder
        .speak(speakOutput)
        .getResponse()
    )
  },
}
```

元のテンプレートを崩すことなく実装できた気がします。

# さいごに
あとはこれを[ASK CLI](https://developer.amazon.com/ja-JP/docs/alexa/smapi/ask-cli-command-reference.html)でテンプレートとして呼び出したいわけですが、その方法は[ここ](https://qiita.com/toshimin/items/7459707f1d3ec925c8be)を参照することにしました。やっぱりJavaScriptの開発はTypeScriptとESLintがかかせませんね！
HTTPプロトコルについて

#HTTPってなに？
・HyperText Transfer Protocol の略
・インターネットでHTMLなどのコンテンツの送受信に用いられる通信の約束（プロトコル）ごとのこと。
・クライアントがHTTPリクエスト(※1)を送り、それに対してサーバーHTTPレスポンス(※2)を返すという書式のこと。

※1・・・クライアントがサーバーに対して「http：//～のページを見せて！」と要求すること。
※2・・・サーバーがクライアントに対して「OK、必要なファイルを送るね！」と応答すること。

#HTTPリクエストの中身について
・リクエストライン、ヘッダー、ボディから構成されているよ。

**＜リクエストライン＞**
・要求のこと。どのURLに対してなにをしてほしいか要求している。

　記載方式：
　HTTPメソッド /リクエスト先のURI/プロトコルVer

　記載例：
　GET/ HTTP/1.1

**＜ヘッダー＞**
・クライアントから送信する追加情報のこと。

　記載例：
　Host.example.com　・・・　要求したいドメイン名
　User-Agent:Mozilla/　・・・　リクエスト送信したクライアントのアプリケーションタイプ
　Accept-Encoding: gzip, deflate　・・・　コンテンツのどの圧縮アルゴリズムならクライアントが理解できるか
　...

**＜ボディ＞**
・オプション設定でつけないことが多いよ。

#HTTPレスポンスの中身について
・ステータスライン、ヘッダー、ボディから構成されているよ。

**＜ステータスライン＞**
・要求の正否を返すもの。
　
　記載方式：
　プロトコルVer/ ステータスコード ステータスコードテキスト

　記載例：
　HTTP/1.1 200 OK

　主なステータスコード
　・200：通信成功時
　・300番台：リダイレクト時
　・400番台：クライアント側に問題がある時
　・500番台：サーバー側に問題がある時

**＜ヘッダー＞**
・追加情報を返すために利用されているよ。

　記載例：
　Date: Mon, 24 Feb 2020 14:47:35 GMT　・・・　いつレスポンスが生成されたか
　Content-Type: text/html; charset=UTF-8　・・・　リクエストに対して返したボディがどのコンテンツタイプなのか
　...

**＜ボディ＞**
・要求されたリクエストに対するコンテンツだよ。

　記載例：
　<!doctype html>
　<html>
　...
　</html>

#Chromeを使ったHTTPリクエストとHTTPレスポンスの確認方法
①確認したいサイト上で右クリックから[検証]を選択
②[NetWork]タブを選択
③ブラウザをリロード
④ドメイン名を選択

以上
Node-REDのwebsocketノードでハマった話

Raspberry Pi上で起動させたNode-REDと、クラウドのwebsocketサーバーとの通信でハマった出来事およびその解決方法を備忘録も兼ねてこちらに記します。
こちらについてはネットを調べても解決方法があまり多くは出てこなかったので、同じようなことで悩まれた方がいたら見ていただけますと幸いです。
※2/25追記
この件の原因については、websocket outノードのヘルプに理由が書かれておりました。。
灯台元ぐらし。。

# やりたかったこと
クラウドにあるwebsocketサーバーからのリクエストを、クライアントとなるRaspberry Pi上のNode-REDで受信し、その内容の一部と付加したいデータを組み合わせたデータを生成、レスポンスとしてサーバーに返したい。

■ノード配置イメージ
![Web 1920 – 1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/90062/4a9c652f-ec7e-b2bb-0d90-91781646df21.png)

■websocket in/outプロパティ設定
![スクリーンショット 2020-02-24 22.06.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/90062/1391a858-9e29-5e74-25b7-47d625f29930.png)

# 問題
websocket inノードからの値は問題なくfunctionノードに渡っているものの、なぜかwebsocket outノードまで流れていきませんでした。
しかし、functionノードにInjectノードを接続しフローを作って実行させてみると、問題なくwebsocket outノードが機能している。。この違いは何。。。
![zu2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/90062/eeadcb03-25f5-e58a-6aef-8867b8154cac.png)

# 原因と解決方法
websocket inおよびInjectノードからのフローにおいて、functionノードから出力されるペイロードのデータに違いはありませんでした。
結論として問題は**msgオブジェクト自体**にありました。

functionノードにDebugノードを繋ぎ、ログ出力対象をmsgオブジェクト全体にしてwebsocket inからのフローでログを確認すると、"_session"というパラメーターが"payload"と"_msgid"以外に付与されていることに気がつきました。
(中身の"type"プロパティより、websocketノード関連のプロパティであることは明白ですね)

■Debugノード出力結果(websocket inからのフロー)
![スクリーンショット 2020-02-24 22.05.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/90062/c30e51c2-7d3b-dfec-8aa0-80a2493c57f6.png)

もしやと思い、この"_session"パラメーターをchangeノードで削除してみました。

■変更後ノード配置イメージ
<img width="674" alt="スクリーンショット 2020-02-24 23.13.41.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/90062/f2907433-f7fe-4309-59e5-30f8ace6c1f6.png">
■changeノードプロパティ
<img width="518" alt="スクリーンショット 2020-02-24 23.12.48.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/90062/b09ba86c-cc0f-b11b-f61c-4847091ebb7b.png">

その結果、**問題なくサーバー側へデータを送信することができました。**

~~この"_session"パラメータの存在についてですが、
・ループ防止の観点でセッション情報がmsgオブジェクトに付与されている？
・そもそも目的としていた動作をwebsocket in/outノードで行うこと自体が主流ではない？
等考えられますが、ひとまず目的の動作ができているので、今は良しといたします。。。~~

（2/25追記）
アドバイスいただきwebsocket outノードのヘルプを確認したところ本件について記載が載っておりました。
![スクリーンショット 2020-02-25 0.51.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/90062/599977e3-c6e0-2fc9-c447-922db1592581.png)
「WebSocket Inノードが生成したメッセージをブロードキャストしたい場合には、フロー中でmsg._sessionプロパティを削除します。」
。。。バッチリ書いてある。
クラス内のメソッド情報を抜き出すためには

# 前書き
PHPにはクラス情報を取得するReflectionClassという関数があります。
この関数を使うとメソッドなどの行番も取得できるため、この行番情報とfile関数を併用することでコード内のメソッド一覧を取得できるのではと考えてみました。

# サンプルコード
```php
use Composer\Autoload\ClassMapGenerator;
use LogicException;
use ReflectionClass;

/**
 * Class ReflectionClassCode
 */
class ReflectionClassCode
{
    /**
     * クラス内のメソッドのコードを取得する
     *
     * @param array $class_paths
     * @param int|null $filter
     * @return array
     */
    public function getMethodCode(array $class_paths, int $filter = null)
    {
        $classes = [];
        foreach ($class_paths as $class_path) {
            foreach (ClassMapGenerator::createMap($class_path) as $model => $class_file_path) {
                $code_texts = file($class_file_path);
                $code_texts = collect($code_texts)->prepend('')->all();
                
                $method_codes = [];
                $reflection = new ReflectionClass($model);
                
                // 継承クラスのメソッドは除外したものを取得する
                $methods = collect($reflection->getMethods($filter))->where('class', $model)->all();
                foreach ($methods as $method) {
                    if ($method->getName() === '__construct') {
                        continue;
                    }
    
                    if (empty($method->getDocComment())) {
                        throw new LogicException('メソッドのPhoDocが未定義です。必ず入力して下さい');
                    }
    
                    $code_length = $method->getEndLine() - $method->getStartLine() + 1;
                    $method_code_doc_comments = $method->getDocComment() . PHP_EOL;
                    $method_code = array_slice($code_texts, $method->getStartLine(), $code_length);
                    $method_codes[$method->getName()] = '    ' . $method_code_doc_comments . collect($method_code)->join('');
                }
                
                $classes[$class_file_path] = $method_codes;
            }
        }
        
        return $classes;
    }
    
    /**
     * クラス内のメソッドのコードを取得する
     *
     * @param string $class_path
     * @param int|null $filter
     * @return array
     */
    public function findMethodCode(string $class_path, int $filter = null)
    {
        return collect($this->getMethodCode([$class_path], $filter))->first();
    }
}
```
学会・会議遠隔開催の機材と習慣

学会・会議を遠隔開催するのに必要な機材と関連する習慣を記録する。

＜この項は書き書けです。順次追記します。＞

# 撮像装置(camera)・集音装置(microphone)

カメラとマイクを内蔵するか、接続したネットワーク機器があるとよい。

カメラ・マイク付き携帯電話でも、Wi-Fiなどで電話料金がかからずに接続できればよい。
ノートPCなどで、カメラ、マイクを内蔵している装置は、ソフトウェアなどの設定が容易なことがある。

カメラ・マイクを内蔵していない装置の場合は、撮像装置だけ、集音装置だけ、両方が合体した装置を使うことがある。

# 放送系(broadcast system)

１対１よりは、多対多の系（system）が使い勝手がよい。
網の設定により、うまく通信できない場合があるかもしれない。
httpsさえ通れば、通信できる方が、設定は楽かもしれない。

## skype

## teams

## webex

## zoom

# 習慣

## 面談

普段、面談した会議で、議事録を取っていて、議事録の修正の必要がない発言をされている方なら問題がないかもしれない。

官庁等の会議で、詳細な議事録を取る場合に、しばしば、議事録作成後に、議事の修正の必要がある発言をされている方が時々おみえになる。

議事録を取らない会議であれば、アメリカの刑事物の番組のように、多少の嘘をついても、容疑者の自白が取れたり、証拠探しの情報が得られればよい的な発言を頻発される習慣があるのかもしれない。

業務で、記録を取らない(off-the-record)不確定または未確定な情報が大事なことがある。会話の最中の記録の有(on)、無(off)を指定できる仕組みがあるとよいかもしれない。

## 権利・義務
特許、著作権など、発言の中に、既存の権利がある事項と、これから特許・著作権を設定しようとする事項と、それ以外とに区分が必要なことがある。


## 筆談・筆記

誰かの発言中に、口頭で反論すると、同時発話で記録がうまく取れなかったり、話が先に進まなくなることがあるかもしれない。

発言中は、筆記(typing)で、意見があることを記録するようにするとよい。

複数人の筆記は、整理する方法が適切でないと誤解を与える場合があったり、炎上することがああるかもしれない。

実際にプログラムを書いている当事者同士であれば、筆談でも会話は成立することがある。実際にプログラムを書いている当事者同士でないと、利害が拡散したり、矛盾したりして、面識のある人同士であっても、筆談だとうまくまとまらないことがあるかもしれない。

## 炎上防止
参加者の一部に、特定の方向に話を誘導したいために、過剰に反応することがあるかもしれない。

事前に想定する制約条件の確認、会議の趣旨などについて、文書で掲載してあるとよいかもしれない。


## 議事録の保存公開方法

議事録には、しばしば対外的な機密を含み、保存および公開の方法が事前に決まっていないと、うまくいかないかもしれない。

# 文書履歴(document history)
ver. 0.01 初稿 20200224
ver. 0.04 URL追記　20230307

### 最後までおよみいただきありがとうございました。

いいね　💚、フォローをお願いします。

####  Thank you very much for reading to the last sentence.

Please press the like icon 💚　and follow me for your happy life.
AWS CLI インストール(Windows)

# 内容
Windows PCにAWS CLIをインストールして使用可能にするまでを記載。

# 手順
### AWS CLIインストール
#### AWS公式よりインストーラをダウンロード
[AWS CLI のインストール](https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-chap-install.html)より、AWS CLI バージョン 1またはAWS CLI バージョン 2のいずれかを選択し、インストーラをダウンロードします。
AWS CLIバージョン1-Windows 64bitの場合は"AWSCLI64PY3.msi"がダウンロードされます。

#### AWS CLIのインストール
先ほどダウンロードしたインストーラ"AWSCLI64PY3.msi"を実行してただひたすらポチポチします。
![ss_001.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510919/392773dd-7b06-1077-ac4d-d8d19a4e98da.jpeg)
![ss_002.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510919/01dc75cf-27bb-bd82-ee74-4ca9ca9b9a1f.jpeg)
![ss_003.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510919/4a47a280-6b6f-a86f-1cd0-def129145ec6.jpeg)
![ss_004.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510919/819b4171-7892-369d-8851-7bc435b30e5b.jpeg)
![ss_006.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510919/f89cbd0f-05ec-a1b3-a0b0-8a010f16e06a.jpeg)

#### CLI インストールの確認
コマンドプロンプトを起動し、"aws --version"を入力します。
以下のように返ってくれば問題なくインストールされていることを確認できます。
C:\> ***aws --version***
aws-cli/1.16.273 Python/3.7.3 Windows/10 botocore/1.13.0

### 設定
#### アクセスキー/シークレットキーの取得
※既に取得済みの場合はこの作業は不要。
AWSコンソールへログインし、[セキュリティ、ID、およびコンプライアンス]⇒[IAM]を選択します。
![ss_007.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510919/5ddb534a-41b9-aed6-3b04-74305bb3fff3.jpeg)

IAMのダッシュボードへ移動後、左側より[アクセス管理]⇒[ユーザー]を選択します。
![ss_008.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510919/2a180a40-41b0-1bc6-4ad3-c045f52974a4.jpeg)

対象のユーザーを選択します。今回であれば**TEST_A**になります。
![ss_009.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510919/e3eac210-c745-5850-eef3-7e9278cce8de.jpeg)

対象ユーザーの概要画面より[認証情報タブ]⇒[アクセスキー]⇒[アクセスキーの作成]を選択します。
![ss_011.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510919/23c3f832-8c37-fc62-08f2-9f2400e4119b.jpeg)

問題なく作成されると✓成功と表示されるので、[.csvファイルのダウンロード]を選択し、閉じるを選択します。
※アクセスキーIDとシークレットアクセスキーが記載されているcsvは無くさないよう任意の場所へ保存します。
![ss_012.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510919/38415512-34a6-cf7d-3bd0-f977f742e2e7.jpeg)

### CLIの設定
コマンドプロンプトを起動して、"aws configure"と入力します。
その後、先ほど作成したアクセスキーIDとシークレットアクセスキー、リージョン、

```
C:\>aws configure
AWS Access Key ID [None]:アクセスキーIDを入力
AWS Secret Access Key [None]:シークレットアクセスキーを入力
Default region name [None]:使用するリージョンを入力
※東京リージョンであればap-northeast-1を入力します。
Default output format [None]:"text","JSON","table"いずれかを入力
```

以上でAWS CLIの初期設定が完了となります。


## CLIが使用できるかの確認
AWS CLIのインストールと初期設定だけでは本当に使えるのかが分からないので取り敢えず、以下のどれかを実行して確認してみてください。
**IAMユーザの確認**

```
C:\>aws iam list-users
{
  "Users":[
       {
         ...ここに作成済みのユーザが表示されます。
       }
   ]
}
```

**S3 バケットの確認**

```
C:\>aws s3 ls
作成済みのS3 バケットが表示されます。
```
以上でCLIが使用できることを確認できます。
Qiitaで数式を書いてみよう

Qiita初投稿です。
宜しくお願い致します。
#1. MathJaxを使ってみよう
##1.1 MathJaxについて
Qiitaでは、MathJaxというライブラリを利用して綺麗な数式を表示することができるようです。
公式サイト（英語）：https://www.mathjax.org
日本語解説：https://oku.edu.mie-u.ac.jp/~okumura/javascript/mathjax.html

##1.2 MathJaxをQiitaで利用するには
記述例：

```
　```math
　1+1=2
　```
　$2-1=1$
```

表示例：

```math
1+1=2
```
$2-1=1$

mathで囲んだ場合は論文のようにセンタリングされ、$マークで囲んだ場合はインライン形式になりますので、用途に合わせて使い分けると良さそうです。
日本語解説サイトにも書いてある通り、LATEX並みに綺麗に数式を表示できます。
数学の論文にはよくLATEXが用いられますが、やはり

> 1+1=2
> 2-1=1

なんて味気なく書くよりは、論文に使われるような見た目で表示させたいですね。

#2. MathJaxの数式チートシート
https://easy-copy-mathjax.xxxx7.com
上記サイトに、MathJaxで利用できる数式がほとんど載っていますが、ここでは基本的なものを載せていきたいと思います。
#2.1 基本式

| 数式 | 記述方法 | 表示 | 補足 |
| --- | --- | --- | --- |
| 乗算 | a \times b<br/>a \cdot b | $a \times b$<br/>$a \cdot b$ |  |
| 除算 | a \div b | $a \div b$ |  |
| 分数 | \frac{a}{b} | $\frac{a}{b}$ |  |
| 分数<br/>(大きく表示) | \displaystyle \frac{a}{b} | $\displaystyle \frac{a}{b}$ | 分母や分子の文字サイズが他の文字と同じになる |
| 累乗 | a^b | $a^b$ |  |
| 平方根 | \sqrt{a} | $\sqrt{a}$ | $\sqrt{a}\sqrt{b}$のように、高さがバラバラになる |
| 平方根<br/>(高さ統一) | \sqrt{\mathstrut a} | $\sqrt{\mathstrut a}$ | $\sqrt{\mathstrut a}\sqrt{\mathstrut b}$のように、高さが統一化される |
| べき根 | \sqrt[b]{a} | $\sqrt[b]{a}$ |  |
| 常用対数 | \log{a}<br/>\log_{b}{a} | $\log{a}$<br/>$\log_{b}{a}$ | $\log$の右下（底）に数字が無い場合、底が10の対数と見做される |
| 自然対数 | \ln{a} | $\ln{a}$ | 底が$e$の対数と見做される |

#2.2 大小記号

| 数式 | 記述方法 | 表示 | 補足 |
| --- | --- | --- | --- |
| 等しい | a=b | $a=b$ | \eq は認識されない模様 |
| 等しくない | a \neq b | $a \neq b$ | not equalの略 |
| 大なり | a \gt b | $a \gt b$ | greater thanの略 |
| 大なりイコール | a \ge b<br/>a \geq b<br/>a \geqq b | $a \ge b$<br/>$a \geq b$<br/>$a \geqq b$ | greater than or equalの略 |
| 小なり | a \lt b | $a \lt b$ | less thanの略 |
| 小なりイコール | a \le b<br/>a \leq b<br/>a \leqq b | $a \le b$<br/>$a \leq b$<br/>$a \leqq b$ | less than or equalの略 |

今後、追記予定です。
VSCodeをSetting Syncで引っ越ししてたらxxxがないって怒られたときのメモ



[【初心者】VSCodeの設定同期エクステンション「Setting Sync」](https://qiita.com/tomokei5634/items/22128efe306ce9bc5682)

を見ながらVSCodeをお引越ししています。

対処方法って言う割にはメモに成り下がっているのでメモとして残します。

プラグインは自動で入れてくれるのですがプラグインが呼び出すソフトウェアはインストールしなければなりません。
今回はその中でもハマったところを中心に書いていきます。


### VSIXファイルでインストールした拡張機能は自動でインストールできない
そりゃそうだよな、考えてみれば・・・

Setting SyncはVSIXファイルからインストールしたプラグインについても自動でインストールできずエラーになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/126158/dfdca972-5dc0-87bb-6eef-880538b6f714.png)

https://github.com/apache/openwhisk-vscode/releases
ここからVSIXを手動で入れていたようです。
そして今気づいたのですが、このプロジェクト、DEPRECATEDになっていました・・・

### OS依存のプログラムは自動インストールできない
そりゃそうだよな、考えてみれば・・・

例えばWindowsの場合
- git for windows
- php (phperなので)
とかまわりはインストールされていません（まだきっとあるはず

日々探っていこうと思います
Rでモンテカルロ法を試してみる

# まえがき
Rの勉強を始めたのでアウトプットとしてQiitaに投稿していきます。

※R version 3.6.2 / RStudio Version 1.2.5033

# モンテカルロ法
モンテカルロ法とは、数値計算を乱数を用いて行う手法のこと(詳細はwikipediaを参照)。
こちらでは円の面積を求めることでπの近似計算をします。

# 円の面積を求めることによるπの近似計算
```montecarlo.r
mcs_and_plot_function <- function(N){
  set.seed(12345)
  # 円を描く
  # x^2 + y^2 = 1
  # y = sqrt(1 - x^2)
  x <- seq(0, 1, by=0.001)
  y <- sqrt(1 - x^2)

  # 乱数を発生させる
  xmc <- runif(N, 0, 1)
  ymc <- runif(N, 0, 1)
  
  # 円の範囲内か
  threshold <- (xmc^2 + ymc^2) <= 1
  # color用
  threshold_factor <- as.factor(threshold)

  # 円の描画
  plot(x, y, xlim=c(0, 1), ylim=c(0, 1), xlab="x", ylab="y", type="l")
  # plotを重ねる
  par(new=T)
  # 乱数を描画
  # cexは点の大きさ
  plot(xmc, ymc, xlim=c(0, 1), ylim=c(0, 1), xlab="x", ylab="y", col=threshold_factor, cex=0.1)

  # 円の面積
  true_value <- pi / 4
  # モンテカルロ法
  mcs <- sum(threshold) / N
  
  print(true_value)
  print(mcs)
}
```

# 実行結果
## mcs_and_plot_function(100)
```
[1] 0.7853982
[1] 0.71
```
![m100.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/273970/d55d1c75-3504-c706-7b1d-bb48a9dbd4ba.png)


## mcs_and_plot_function(1000)
```
[1] 0.7853982
[1] 0.776
```
![m1000.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/273970/4a01a0c4-d5e4-417b-5bb3-4048c814fb42.png)


## mcs_and_plot_function(10000)
```
[1] 0.7853982
[1] 0.7908
```
![m10000.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/273970/add646b5-637f-6e80-9b51-3989c5e37a01.png)


# Nの大きさと近似値の関係
```montecarlo_ratio.r
mcs_ratio_function <- function(N){
  set.seed(12345)        
  mcs_ratio <- c(NULL)
  # 乱数を発生させる
  xmc <- runif(N, 0, 1)
  ymc <- runif(N, 0, 1)
  # 円の範囲内か
  threshold <- (xmc^2 + ymc^2) <= 1
  for(i in 1:N){
    mcs <- sum(threshold[1:i]) / i
    mcs_ratio <- append(mcs_ratio, mcs)
  }
  # 描画
  plot(seq(1, N), mcs_ratio, xlab="N", ylab="value", type="l")
  abline(h=(pi / 4), col='red', lty=2)
}
```
※もっと良い書き方があればご指摘お願いします

![m_ratio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/273970/1662839f-3ee3-79fe-63f8-aeb46077f7cb.png)
『Unity C# 個人用メモ』 for文

自分やガチ始めたばかりの初心者用
###テンプレ
```
        //iが５未満の時に起動し、iに１を足す
        for (int i = 0; i < 5; i++)
        {
            //iの値をコンソールに表示する
            Debug.Log(i);
        }
```
``int i = 0;``
int型のiを作り0を代入
``i < 5;``
iの値が5より未満の時に中身を起動する
``i++``
iに１を足す

int型のiが5未満の時に中身を起動し、その後iに１を足す
という処理になる
この時iが0の時も処理が行われ、５未満なので４になるまで繰り替えされるので
`0,1,2,3,4の５回処理が行われる`

###数値の種類は変えられる
```
        //INTで使用
        //iが５未満の時に起動し、iに１を足す
        for (int i = 0; i < 5; i++)
        {
            //iの値をコンソールに表示する
            Debug.Log(i);
        }

        //floatで使用
        //iが10未満の時に起動し、iに2.5fを足す
        for (float i = 0; i < 10; i += 2.5f)
        {
            //iの値をコンソールに表示する
            Debug.Log(i);
        }
```
一定の回数などならint型を使用し、
座標などならfloat型を使用する

###２重で使用
```
        //xが５以下の時に起動し、xに１を足す
        for (int x = 0; x <= 5; x++)
        {
            //yが10以下の時に起動し、yに2.5fを足す
            for (float y = 0; y <= 10; y += 2.5f)
            {
                //iの値をコンソールに表示する
                Debug.Log(x);
                //iの値をコンソールに表示する
                Debug.Log(y);
            }
        }
```
処理の流れは
１．一つ目のfor文のxの値が0の時
２．二つ目のfor文の処理がすべて行われる
３．その後一つ目のfor文のxにx++で１が足され
４．再び二つ目のfor文の処理がすべて行われる
５．その後一つ目の(以下略

このような流れになる
Sourcetrailを使ってみたい（eclipseで）

日々ソースコードとにらめっこしている皆さんこんにちは。
sourcetrailって知ってますか？僕は最近知りました。
エンジニアとして働き始めて３年ですが、一番大変で時間をかけているのはコードの解読です。
スクラッチでプロジェクトを作ることもあると思いますが、多くの場合はパッケージや過去資産の流用だと思います。
人の書いたソースコードはいくら可読性があっても、膨大だと読み解くのが難しいです。
そんなソースコードの可視化して生産性向上を手助けしてくれるツールsourcetrailがオープンソース化したということで早速使ってみたいと思います。
また、eclipseのプラグインがあるとのことなので導入します。

#環境
・Ubuntu18.04
・eclipse2019-12
#インストール
##sourcetrail
[公式サイト](https://www.sourcetrail.com/)からダウンロードします。
MAC、Windows、LinuxそれぞれのOSに対してインストールが可能です。
Linuxの場合圧縮ファイルがインストールされるので、任意のディレクトリへ解凍しinstall.shを実行すると完了します。
##eclipseプラグイン
[Github](https://github.com/CoatiSoftware/eSourcetrail)に本体はあります。
eclipseで"Help" -> "Install New Software..."でWork with:へ(http://CoatiSoftware.github.io/eSourcetrail/updatesite)
と入力します。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/447500/d8c3f76b-5580-ce99-a841-4173763c55af.png" width="70%">
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/447500/516df296-8669-1a31-9da9-b28c04c0f453.png" width="70%">
eSourcetrailというプラグインをインストールしてeclipseを再起動します。

#プロジェクト
Linuxでの実行はSourcetrailのフォルダで`./Sourcetrail.sh`シェルを実行します。
左下の"New Project"をクリックし、Sourcetrail Project Nameへ適当な名前、Sourcetrail Project Locationへ適当なディレクトリを入れます。
今回はEmpty C++ Source Groupを選びます。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/447500/e1d5fcbd-6a20-c0a8-1c20-91ac7c5caf09.png" width="60%">
"C++ Standard"へC++の実行環境を選択し
"File & Directories to index"へ可視化したいソースのあるディレクトリを追加します。
"ExInclude Files & Directories"へは追加したくないものを追加します。（あまり使わなさそう）
"Include Paths"は書いてある通りコンパイルするときの-I以降のやつですね。
"Compiler Flags"コンパイルフラグなども設定できます。
一通り設定したら"Create"でプロジェクトが作られます。
ちなみにこの設定はいつでも"Edit Project..."で編集できます。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/447500/28ac544b-40cf-752f-f592-caaa423d12bc.png" width="70%">
こんな画面ができ、
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/447500/eefd8101-0920-d39d-029b-fed51f0058f5.png" width="70%">
こんな感じで可視化されます。

ちなみにeclipseのプラグインはというと、
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/447500/dbd4809d-6b99-99ee-08ea-03ffc3e57150.png" width="50%">

右クリックすると"eSourcetrail" -> "Send Location to Sourcetrail"が出てきます。
使い方は、デバッグで実行してブレイクポイントをで止めたときに"Send Location to Sourcetrail"を実行します。
Sourcetrailのプロジェクトで現在実行されているコードの部分が表示され、前後の依存関係が可視化されます。

#おわり
とっても簡単にソースコードが可視化されました。
sourcetrailの作者さんは自身のソフトウェアプロジェクトをもっと生産的にするために作ったらしいですが、とてもありがたいです。（オープンソース化に大感謝！）
LVM構成のCentOS7でシャットダウンに時間が掛かる。

# はじめに
CentOS7でシャットダウンに時間が掛かる事象が発生。`shutdown -h now`を実行して、
真っ黒画面に遷移した後、真っ黒画面の状態で90秒程停滞し、その後停止する。

真っ黒画面の状態で`ESC`を押すと、下記のようなメッセージが確認できた。

```
A stop job is running for LVM2 metadata daemon
```

メッセージを検索すると、シャットダウン時に発生するLVMのバグらしい。

# lvmetadの無効化
`2.02.187`でfixされているようだが、2020/02/24時点、CentOS7向けの
`lvm2`パッケージは`2.02.185`が最新のようだったので、`lvmetad`を無効化して
対処する。`/etc/lvm/lvm.conf`を下記のように変更すると、lvmetadを無効化できる。

```:"変更前"
        use_lvmetad = 0
```

```:"変更後"
        use_lvmetad = 1
```

再度OSをシャットダウンして、すんなり落ちれば対処完了。

# 参考
[sourceware.org - lvm2.git / commitdiff](https://sourceware.org/git/?p=lvm2.git;a=commitdiff;h=61358d92cbf202dbb483d63a63d5adf0463bb934)
[Red Hat -メタデータデーモン (LVMETAD)](https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/7/html/logical_volume_manager_administration/metadatadaemon)