OmniAICreator/Qiita-1.07M huggingface dataset:
Dockerfile の Multi Stage Build 入門

# Dockerfile おさらい
```dockerfile
FROM nginx:latest
ADD . /usr/share/nginx/html
```
こういうやつです。

# 今回のサンプル
この記事で実際に動かすサンプルは Golang で書いた HTTP サーバーです。

```go:main.go
package main

import (
	"encoding/json"
	"net/http"
	"time"
)

func echo(w http.ResponseWriter, r *http.Request) {
	type Response struct {
		Status  int       `json:"status`
		Time    time.Time `json:"time`
		Message string    `json:"message`
	}

	w.Header().Set("Content-Type", "application/json")

	res := &Response{
		Status:  http.StatusOK,
		Time:    time.Now(),
		Message: "Json API Server by Golang on Docker",
	}

	json.NewEncoder(w).Encode(res)
}

func main() {
	http.HandleFunc("/", echo)
	http.ListenAndServe(":8888", nil)
}
```
今回の作業ディレクトリは `~/docker_msb/` とします。
`~/docker_msb/main.go` に上記のコードをコピーしてください。

# Dockerfile を書く
Dockerfile は `~/docker_msb/dockerfile` とします。
## MultiStageBuild を使わない場合
```dockerfile
# Golang 開発環境のイメージを使用
FROM golang:alpine
# 作業ディレクトリを /sample に指定(存在しない場合は勝手に作成される)
WORKDIR /sample
# main.go を作業ディレクトリにコピー
ADD main.go main.go
# コンテナの8888番ポートを開放
EXPOSE 8888
# コンテナが起動する際に実行されるコマンド # go run main.go 
CMD ["go", "run", "main.go"]
```

この Dockerfile を作成します。

```sh
$ docker build -t docker_s .
```

このコマンドでイメージを作成します。
今回は比較のためにイメージを作成しておきます。

## MultiStageBuild を使う場合
```dockerfile
# Golang の開発環境のイメージを build という名前をつけて使用
FROM golang:latest as build
# 作業ディレクトリを /build に指定(存在しない場合は勝手に作成される)
WORKDIR /build
# main.go を作業ディレクトリにコピー
ADD main.go main.go
# Go で main.go をビルド
RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o webapp -ldflags "-s -w" main.go

# 空のイメージを使用
FROM scratch as release
# 上の build から /build/webapp を /webapp にコピー
COPY --from=build /build/webapp /webapp
# コンテナの8888番ポートを開放
EXPOSE 8888
# コンテナが起動する際に実行されるコマンド # /webapp
ENTRYPOINT ["/webapp"]
```

この Dockerfile を作成します。

```sh
$ docker build -t docker_m .
```

このコマンドでイメージを作成します。
今回は比較のためにイメージも作成しておきます。

# 比較
```sh
$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
docker_s            latest              dbfcaa92a174        9 seconds ago       359MB # 使用しない場合
docker_m            latest              d2a160b3620f        49 seconds ago      5.57MB # 使用した場合
```

`size` を見ると一目瞭然ですね。
MultiStageBuild を使用しない場合のサンプルでは `golang:alpine` を使用しているため360MBですが、 `golang:latest` は800MBもあります。 MultiStageBuild を使用したほうがストレージの容量を圧迫せずに済みます。

# まとめ
MultiStageBuild が使えるときは使おう。
Kaggleのハローワールド、タイタニック号の生存者をロジスティック回帰で予測してみるー予測・評価編ー

# 0. はじめに
- 前提：大した記事でもないのに分けてしまいましたが、[モデリング編](https://qiita.com/anWest/items/f3d432e0e02f070ec107)の続きです。
- 主旨：テストデータを使って予測し、モデルの検証までのプロセスを紹介します。数学的な細かいところなどはすっ飛ばします。（Kaggle上で検証することが大前提）
- 環境：Kaggle Kernel Notebook

# 4. 予測する
[前回の記事](https://qiita.com/anWest/items/f3d432e0e02f070ec107)で作成したモデルで、テストデータを使って生存したかどうかを予測します。

## 4.1. テストデータ準備
まずは、テストデータを準備します。
実際のデータ解析時には、元のデータから訓練データとテストデータを分ける必要がありますが、
Kaggleでは分けてくれているので、Competitionページからテストデータ(test.csv)をダウンロードします。

```python
test_csv = pd.read_csv('../input/titanic/test.csv', sep=',')
test_csv.head()
```
念のため、テストデータの概要も確認しておきます。

```python
# 次元の確認
test_csv.shape
# 出力結果
(418, 11)

# 欠損データ数の確認
test_csv.isnull().sum()
# 出力結果
PassengerId      0
Pclass           0
Name             0
Sex              0
Age             86
SibSp            0
Parch            0
Ticket           0
Fare             1
Cabin          327
Embarked         0
dtype: int64
```
訓練データではFareの欠損値はありませんでしが、テストデータでは1件だけあるようです。
モデリング時のAgeと同様に、欠損値は平均値で埋めることにします。

テストデータに対しても、訓練データ同様にデータ整形をしていきます。

```python
# 不要な列を取り除く
test = test_csv.drop(['Name', 'SibSp', 'Ticket', 'Cabin'] , axis=1)

# 女性ダミーを作る
test['Female'] = test['Sex'].map(lambda x: 0 if x == 'male' else 1 ).astype(int)

# Parchが0とそれ以上でダミーを作る
test['Parch_d'] = test['Parch'].map(lambda x: 0 if x == 0 else 1).astype(int)

# EmbarkedがSとそれ以外でダミーを作る
test['Embarked_S'] = test['Embarked'].map(lambda x: 1 if x == 'S' else 0).astype(int)

# Ageの欠損値を埋める
test['Age'].fillna(test['Age'].mean(), inplace=True)

# Fareの欠損値を埋める
test['Fare'].fillna(test['Fare'].mean(), inplace=True)
```

# 4.2. 予測する
それでは、前回作成したモデルを使って予測していきましょう。

```python
# 予測する
predict = model.predict(test_x)
predict[:10]

# 出力結果
array([0, 0, 0, 0, 1, 0, 1, 0, 1, 0])
```
出力はNumpy配列のarrayで返ってくることに注意してください。

# 5. 評価
##  5.1. 予測結果データの提出
それでは、作成したモデルがどのくらいいいのかを検証していきたいと思います。
Kaggle上では、予測した結果を提出するとScoreが返ってきて、その値によって評価します。
そのため、提出用のデータを作成します。

```python
submit_csv = pd.concat([test['PassengerId'], pd.Series(predict)], axis=1)
submit_csv.columns = ['PassengerId', 'Survived']
submit_csv.to_csv('./submition.csv', index=False)
```
![スクリーンショット 2019-12-24 15.30.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/468508/a8a5fc6a-2b34-79c5-bc6f-058f8afa90d0.png)

こんな感じのデータを作って、Competitionのページから提出します。
結果は、こんな感じでした。
![スクリーンショット 2019-12-24 15.31.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/468508/9eebb8bf-8b8b-b053-8f9b-2f7b2fb27310.png)

## 5.2. 予測結果の評価
Kaggleでは正解データを入手できなかったので、正解データがあった場合の評価としてAccuracyを紹介します。

Accuracyは予測結果がどのくらい実際のデータと合っていたのかを示します。
Accuracy = （正しく予測できたサンプル数）/（全体のサンプル数）
として計算されます。

このうち、正しく予測できたサンプル数とは、1のサンプルは1、0のサンプルは0と予測できたものです。
仮に、先ほどのsubmit_csvに`'Survived_test'`という実際に生存したかどうかのデータが入っているとします。

```python
pd.crosstab(submit_csv['Survived'], submit_csv['Survived_test'])

# 出力結果(想定)
Survived_test   0   1 
Survived       
   0            a   b
   1            c   d
```
上記のような出力結果になるはずですので、
Accuracy = a + d / (a + b + c + d)
で求められます。

モデルの評価指標は他にもあって、モデルの用途などによって使い分けていきます。

# 6. 終わりに
- 途中でミスってEmbarked_Sを抜きでモデリング・評価していたのですが、そちらの方が結果は良かったです
- 今回はお試しなので直感的にではありますが、仮説を持ってモデリングしていきました
- 次回はロジスティック回帰の解説をしたいと思います
DjangoのMVT-モデルとモジュールの関係-

#目的
Djangoを使うときのMVTパターンと各パターンに対応するモジュールをまとめてみます。
ちなみに、モジュールとは「～.py」のソースファイルのこと。パッケージとはソースファイルを管理するためのフォルダのことです。（Pythonの方言と思ってもらえばOK）

#背景
MVTパターンはよく聞く、Djangoのフレームワークの記事はよく見かける。でもその2つの対応付けがイメージしにくいなと思ったので備忘録としてまとめてみます。
もっと詳しく書いて欲しいところや間違っているところがあればコメントお願いします。

#MVTパターンって？
| |   説明   |
|:-----------------|:------------------:|
| Model             |   データ管理   |
| View           |呼び出し制御|
| Template             |ユーザーインタフェース|

シンプルに書くとこんな感じでしょうか。
その他にもDjangoフォームという入力データ制御用クラスが使える機能があったりとか、大規模なアプリを作るのであればもう少しアーキテクチャのことを考えて、サービス層とドメイン層わけてとか考えられますが、それはまたいつか細かいバージョンでまとめてみようと思います。

#まずはDjangoプロジェクトの構成
例えば「sample_project」というプロジェクトを作成し、その中に「sample_app」というアプリケーションを作成した場合の基本的な構成を紹介します。
（Djangoプロジェクト作成時にデフォルトでは作られず、自身で追加が必要なフォルダやモジュールには、名前の前に☆をつけます）
（パッケージまたはフォルダの場合、名前の後ろに*をつけます）

```
sample_project*
 　| - sample_project*
       | - settings.py
       | - urls.py
       | - wsgi.py
　 | - sample_app*
       | - migrations*
       | - ☆templates*
             | - ☆static*
             | - ☆sample_app*
       | - models.py
       | - views.py
       | - ☆urls.py
　 | - manage.py
```
今回紹介する焦点がMVTなので、関連しないパッケージやモジュールは省略します。

#それぞれの層ごとに対応するモジュールは？
実際に各層ごとに対応するモジュールを紹介していきます。
##Model
Modelに関連するものはこれ

```
sample_project*
 　| - sample_project*
       | - settings.py・・・A
　 | - sample_app*
       | - migrations*・・・B
       | - models.py・・・C
```
**A.プロジェクト全体の設定用モジュール**
Modelだけで利用するモジュールではないですけど、データベースの設定情報などはここに書きます。

**B.migrationsパッケージ**
コードベースでデータベースを構築しようとしたときに、`makemigrations`コマンドにより生成されるソースファイルが格納されます。
`migrate`コマンドでここの内容がデータベースに適用されます。

**C.各Modelクラスの定義用モジュール**
ここに独自のModelクラスを定義していくことになります。
[Modelクラスの作り方](https://docs.djangoproject.com/ja/3.0/topics/db/models/)

##View
Viewに関連するものはこれ
Viewでは呼び出し後の制御のためのView関数の定義だけでなく、どのView関数を呼び出すかというURLディスパッチャの設定が必要になることをしっかり覚えておくことが大事です。

```
sample_project*
 　| - sample_project*
       | - urls.py・・・A
　 | - sample_app*
       | - views.py・・・B
       | - ☆urls.py・・・C
```

**A.プロジェクトパッケージ内のurls.py**
URLをもとにView関数を呼び出すためのディスパッチャ情報を記載します。
ただし、このモジュールではDjangoプロジェクト内の各アプリケーションを分割するためのURLディスパッチャを記載します。
今回の例では`http://~~~~~/sample_project/sample_app/`のように
ホスト名以降のアプリケーションの分割までのURLディスパッチャを登録します。

**B.各View関数定義用モジュール**
ここに独自のView関数を定義します。

**C.アプリケーションパッケージ内のurls.py**
アプリケーション内の各URLディスパッチャ情報を記載します。このモジュールは自身で追加する必要があります。
上記*A.*によりアプリケーションごとに分割されたURLの続きのURLディスパッチャを登録することになります。
今回の例では`http://~~~~~/sample_project/sample_app/home`とか`http://~~~~~/sample_project/sample_app/edit`のようなURLが指定できるように`sample_app/`の後ろの部分を登録します。

##Template
Templateに関連するものはこれ

```
sample_project*
　 | - sample_app*
       | - ☆templates*
             | - ☆static*・・・A
             | - ☆sample_app*・・・B

```

**A.レンダリング用ファイル（cssファイルやJSファイル）格納用パッケージ**
HTML以外に画面の構成に必要なファイルはここに置きます。

**B.Templateファイル格納用パッケージ**
HTMLファイルはここに置きます。

#まとめ
フレームワーク使うなら、どこに何書けばいいのかを整理することが結構大事です！
今回はひとまずシンプルな構成にしてMVTそれぞれでまずはここを見ないといけないというフォルダやファイルに絞って紹介しました。
MATLABでコーンフレークの栄養グラフっぽいのを描こう。

# コーンフレークの栄養グラフが気になる。

　ミルクボーイ面白かったですね！ということで、MATLAB でも栄養バランスの五角形みたいなグラフを書いてみましょう。


# 前にスタバのフード情報を取ってきたので、使いまわそう。

　ちょうどよく[前の記事でスタバの栄養素が取ってあった](https://qiita.com/teruqii/items/7c2883ddaa5f26d05203)ので、これをグラフにしてみましょう。グラフにするので、１日に必要な栄養素にまで正規化しておきましょう。

```matlab
%% ウェブから落としてくる。
url = "https://www.starbucks.co.jp/assets/images/web2/images/allergy/pdf/allergen-food.pdf";
websave('starbucks_food.pdf',url)

%% 関連しそうな文字列をごっそり取り出す。
D = extractFileText('starbucks_food.pdf');
D = extractBetween(D,"食塩相当量（g）","お問い合わせ先");
D = replace(D,newline,' ');
X = regexp(D,'[^0-9]+ [0-9.]+ [0-9.]+ [0-9.]+ [0-9.]+ [0-9.]+','match');

%% テーブルを作ったり。
for n = 1:length(X)
    spl = split(X(n));
    Name(n,1) = join(spl(1:end-5));
    Energy(n,1) = double(spl(end-4));
    Protein(n,1) = double(spl(end-3));
    Fat(n,1) = double(spl(end-2));
    Carbo(n,1) = double(spl(end-1));
    Salt(n,1) = double(spl(end));
end

T = table(Name,Energy,Protein,Fat,Carbo,Salt);

%% 一日に必要な栄養素で正規化しましょう。
T_full = [2600  60  500  250  8];  % だいたいこのくらいらしい。(kcal, g, g, g, g)
T{:,2:end} = T{:,2:end}./T_full;
```

　どんなもんかね。コマンドウィンドウで見てみよう。

```matlab
>> T(1:3,:)

ans =

  3×6 table

                     Name                     Energy     Protein      Fat      Carbo      Salt 
    ______________________________________    _______    ________    ______    ______    ______

    " ペストリー ブルーベリースコーン"             0.11077    0.091667    0.0222    0.1692       0.1
    " ペストリー ストロベリーチーズケーキスコーン"    0.13846     0.12667    0.0306     0.196      0.15
    " ペストリー チョコレートチャンクスコーン"       0.13577        0.11     0.032    0.1848    0.1375
```

よさそう！


# テーブルを入力として、2列目以降をプロットする関数を作ろう。

　1列目が名前で、2列目以降が栄養素としてプロットできるようにしましょう。sin / cos を使って、こんな感じの関数を作ればいいね。

```matlab:corn_plot.m
function corn_plot(T,color)
[m,n] = size(T);
for ix = 0:n-2
    plot(linspace(0,sind(ix/(n-1)*360),5),linspace(0,cosd(ix/(n-1)*360),5),'+-')
    text(sind(ix/(n-1)*360), cosd(ix/(n-1)*360), T.Properties.VariableNames{ix+2})
    hold on
end
for ix = 1:m
    x = T{ix,2:end} .* sind((0:n-2)/(n-1)*360);
    y = T{ix,2:end} .* cosd((0:n-2)/(n-1)*360);
    P = patch(x,y,color);
    P.FaceAlpha = 0.2;
    P.EdgeColor = 'r';
    P.LineWidth = 3;
end
axis equal
axis off
title([T{ix,1},'は、栄養バランス満点！！'])
end
```


　じゃあブルーベリースコーンでもプロットしてみましょう！コマンドウィンドウでこんな感じ。

```matlab
>> corn_plot(T(1,:),'b')
```

![blueberry.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475339/f9847b58-c2ca-5b79-e6bd-06ba32a33375.png)

全然、栄養バランス満点に見えない！
値が小さいから、３つくらい重ねて描いてみよう。

```matlab
>> corn_plot(T(1,:),'b')
>> corn_plot(T(2,:),'g')
>> corn_plot(T(3,:),'c')
```

![scone.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475339/64accb67-344f-b0d8-18c3-edae01f3e0e9.png)

・・・きっとスコーンはダイエットにいいのね。

# 全部重ねてみよう。

```matlab
>> corn_plot(T,'c')
```

![starbucks_all.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475339/46569411-5b5f-2a65-0966-8c95c4b84da4.png)

圧倒的な大きさのものがないと見栄えしない。。


# とりあえずできた。

　ビタミンとかの指標がないと見栄えが悪いということと、コーンフレークのグラフの大きさはすごいな、ということでいいか。。
docker-compose 停止 + イメージ削除 + ボリューム削除

# docker-composeで起動

```
docker-compose up --build -d
```

http://docs.docker.jp/compose/reference/up.html

# docker-composeで停止 + イメージ削除 + ボリューム削除

```
docker-compose down --rmi all -v
```

オプションの意味は公式サイト参照
http://docs.docker.jp/compose/reference/down.html
Latexで参考文献の行間を詰めたい

## 状況・問題
- bibtexを利用して参考文献を表示している
- 参考文献の部分だけ`\scriptsize`を利用してフォントサイズを下げている
- 全体に対してすでに`\baselinestretch`をかけているため，これを使って参考文献の行間を詰められない

## 解決策
- 中間ファイルである`.bbl`から直書きの`thebibliography`をtexファイルへコピペする
- その直下で以下を追加
    - `\setlength{\itemsep}{-2pt}`

- こんな感じ

```
\begin{thebibliography}{10}
    \scriptsize % フォントサイズを下げる
    \setlength{\itemsep}{-2pt} % 行間を縮める

    \bibitem{...
\end{thebibliography}

```
RTK-GPSをRaspberry Piで使う

# 目的

より精度の高い測位の可能な、RTKをラズパイで動かして、ROS経由でUnityに送信してみる。

# 使う装置

トランジスタ技術で扱っていた、u-blox [NEO-M8P モジュール](https://shop.cqpub.co.jp/hanbai/books/I/I000239.html)を使ってみる。

# 準備

Raspberry Pi ZeroW にRTKLIBをインストールする。
手順は、[ここ](https://toragi.cqpub.co.jp/Portals/0/support/junior/article/2017/1704gnss.html)を参考にした。
[リポジトリ](https://github.com/tomojitakasu/RTKLIB)から最新を落としてきて、素直にビルドできたので、M8Pモジュールをつないで動かしてみる。

# M8Pモジュールの設定

u-centerを使って、[このエントリー](https://qiita.com/m_take/items/5dfe43f9c145bbec0e21)を参考にして設定した。
ただし、NMEAの出力とRTCM3の入力を両方ともUSBに設定する。
また、Automotiveの設定をユースケースに合わせてPedestrianにしておいた。

# 動かしてみる

今回基準点は、自宅から近かったのもあり、CQ出版様が公開されている基準局を使用してみた。住んでいる場所によって変わってくるので、要確認。近くに公開されている基準点がなければ、自分で作るなりが必要となる。
M8PモジュールはUSBでつなぐとラズパイからは`/dev/ttyACM0`に見えるので、ntripの出力はそこにする。
以下コマンドでRTK情報がモジュールに送信されているはず？

```
./str2str -in ntrip://160.16.134.72:80/CQ-RTCM3 -out serial://ttyACM0:115200
```

# 結果

`cat /dev/ttyACM0`で確認した結果、NMEAがとれていることを確認できた。

```
$GNGGA,020827.00,3543.XXXXXX,N,13943.XXXXXXX,E,5,07,1.39,49.513,M,39.333,M,1.0,0000*59
$GNGSA,A,3,21,28,15,24,20,05,13,,,,,,2.49,1.39,2.07*13
$GPGSV,3,1,09,05,35,126,19,12,00,172,,13,46,047,31,15,67,356,32*7E
$GPGSV,3,2,09,20,25,313,38,21,36,285,41,24,52,213,22,28,17,061,10*79
$GPGSV,3,3,09,30,01,041,*47
$GNGLL,3543.XXXXXXX,N,13943.XXXXXXX,E,020827.00,A,D*7D
```

これを、前回のと同様に、ROS経由でUnityに持っていけば、より精度の高い測位が期待できるかも。
Kendra 試してみたよ。

こんにちは。Da Vinci Studio の bbz です。

社内ドキュメントとかから欲しい情報を探すのって結構めんどくさいですよね。
キーワード検索だとあれこれヒットするし。
ペロッと欲しい情報が探せないかなということで先日発表された AWS Kendra 試してみました。

## Kendra

### Kendra とは
> 機械学習を原動力とする高精度のエンタープライズ検索サービスです。

https://aws.amazon.com/jp/kendra/

ということで自然言語で問い合わせたらいい感じに答えてくれそうな検索サービスですね。
(まだ Preview 段階ですが)

### セットアップ
管理コンソールから手軽に使えます。
（まだ東京 Region にはありませんのでバージニアとか選んでください。）
![スクリーンショット 2019-12-23 7.39.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542735/451a4dd5-c669-b671-9db3-27b8bdee79f7.png)

最初は index を作成。
結構時間かかります。（30分くらい）
![スクリーンショット 2019-12-23 7.39.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542735/bc6bdc69-c9c8-d2c9-ae94-8b45bd6fbb3e.png)

つづいて Data Source の追加
たくさんの Source を追加できるようになるみたいですが、今のところは３つだけ。
> Amazon Kendra は、ファイルシステム、ウェブサイト、Box、DropBox、Salesforce、SharePoint、リレーショナルデータベース、および Amazon S3 などの人気のデータソースに対する幅広いネイティブなクラウドコネクタとオンプレミスコネクタを提供することにより、検索アプリケーションの構築に伴う困難な作業を排除します。


>プレビューでご利用いただけるコネクタは、SharePoint Online、JDBC、および S3 のみとなります。

<img width="1103" alt="スクリーンショット 2019-12-24 9.28.41.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542735/215405df-b3a5-1f1b-4d8b-c838fb4db758.png">

Data Source 追加したら後はドキュメントなりを突っ込んで検索するだけ！！
<img width="987" alt="スクリーンショット 2019-12-24 9.35.27.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542735/4a8bb494-4317-2c5d-ed8b-400345c6748e.png">

なのですが、現在はデータもクエリも英語だけの対応なのであった :innocent: 

## 無理やり日本語で検索する
英語で使えばいいのですが、どうせなら日本語のキーワードで検索（入力）したいので ↓ の感じにしてみました。
 
1. Slack で日本語入力 -> Slackbot に飛ぶ
2. AWS Translate で問い合わせを英語に翻訳
3. 翻訳されたクエリで Kendra に問い合わせ
4. 結果を AWS Translate で日本語に翻訳
5. Slack に表示

（データは英語に翻訳して S3 に置いておく。）

で、使ってみるとこんな感じ。（表示しているのは一部のレスポンスだけ）
ちゃんと日本語で検索してる風に見えますね。
![スクリーンショット 2019-12-24 14.25.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542735/9dd76686-0983-3f66-2448-4ff353c45f42.png)

## 料金
すごく手軽に使える Kendra ですが料金は結構お高い。
https://aws.amazon.com/jp/kendra/pricing/

今は Enterprise Edition しか使えないというのもありますが `$7/hour` もしちゃいます。
ざっくり `$7 x 720 hours/month = $5,040` ですね :innocent: 
(Developer Edition が出てくれば `$2.5 x 720 hours/month = $1,800` と少し利用しやすくはなりそうですが。)

## 使ってみて
Index 作ってデータ連携させるだけで使えてとっても簡単。検索は楽ちんになりますね。
ただ関連のあるデータはちゃんと返してくれるものの、すごい検索精度だ！！とはなりませんでした。
(今回は途中で翻訳とか挟んでるし。)
データ量が増えてクエリがもうちょい複雑になると違ってくるかもですが。

良くある質問と回答を事前に登録したり Kendra の結果を評価して育てていく必要はありそうですね。
![スクリーンショット 2019-12-24 13.20.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542735/39a6260b-e2cd-b7e8-27fd-692443a91dc0.png)
事前登録するとこんな感じででてくる。
![スクリーンショット 2019-12-24 13.22.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542735/970e630f-a07d-bd74-c3ac-89f3ff02dbce.png)

まだ Preview なので本番利用はできないですが、GA になって日本語対応もしてくれたら使い所はありそうだなーという感じでした！
Lifetimeで発生する問題の対処法

#はじめに
OutsystemsのLifetimeを運用する上で、Lifetime↔各環境間でSyncが上手くいかない場合があります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130275/470df95c-b7e5-3c96-4f11-690bf1b3cef8.png)

プロセスがそのまま生きているとSyncができない状態にもなります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130275/bced77e5-6ec8-9a62-540c-ab2f1899623a.png)



この辺の情報があまりなかったため、対処法について書きます。
但し、この状態になる原因は様々なため、対処法の1つと思っていただけると幸いです。

#想定読者
Outsystemsのインフラ担当者 or LifeTimeを触るであろう方



##エラーの確認箇所

まずはそれぞれ発生するエラーの原因を判明するためにここをチェックしましょう。

####・LifeTimeサーバのServicecenterのErrorsログ

####・LifeTimeサーバのServicecenterのProcessesログ

個人的には、Forgeとして提供されているBPT Utilsを利用するのをおすすめします。
実行中のプロセスのkillなどを楽にできます。
https://www.outsystems.com/forge/component-overview/1313/bpt-utils

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130275/c62ba1e9-f5b8-c2d5-775c-76200ea830eb.png)


##実際に弊社で起こった問題とその対処法

###①
```
 Unexpected character encountered while parsing value: $. Path '', line 0, position 0.
```
####対処法
対象の環境のモバイルconfig周りのデータを一旦リセットすることにより解消

```
delete from ossys_App_Mobile_Config;
delete from ossys_Mobile_Certificate;
delete from ossys_Mobile_Config_Data; 
```

###②
```
Login denied for 'Plat****'. Invalid password.
```
通常、このエラーは、各環境のトークンがLifeTime環境のトークンと一致しないと発生します。



####2.1 次のクエリを実行して、ユーザー「PlatformServices」でログインを試みたIPアドレスを見つけます。

```
SELECT DISTINCT IPADDRESS from OSSYS_LOGIN_ATTEMPT where userid=(SELECT id FROM OSSYS_USER WHERE username LIKE 'PlatformServices')
```

####2.2 上記のクエリからこれらのIPを取得したら、ユーザーPlatformServicesのブロックを解除するために、すべてのIPについて、対象の環境データベースで次のクエリを実行する必要があります。
PlatformServices ユーザーに対して複数のIPアドレスがブロックされている可能性があります。

```
INSERT INTO OSSYS_LOGIN_ATTEMPT (USERID, USERNAME, INSTANT, IPADDRESS, USERNAMEFAILURECOUNT, IPADDRESSFAILURECOUNT, SUCCESS, RESULT)VALUES ((select id from ossys_user where username like 'PlatformServices'), 'PlatformServices', GETDATE(), '<ip>', 0, 0, 0, 'Unblocked')
```



####2.3 Lifetimeのデータベースで対象の環境のIDを確認します

OSLTM_ENVIRONMENTテーブルではLifetimeに繋がっている各環境のステータスの確認が可能です

```
SELECT * from OSLTM_ENVIRONMENT WHERE NAME like <Environment_name>
```


####2.4 前の手順の結果に基づいて、Lifetime環境データベースの各環境の保存済みトークンを削除します。

```
DELETE FROM OSLTM_ENVIRONMENTTOKEN WHERE ID = <Environment_id>
```

####2.5 対象の環境のデータベースで環境トークンを削除します。

```
DELETE from OSSYS_PARAMETER WHERE name = 'ClientApplicationToken'
```

####2.6 LifeTimeのデプロイサイクルから対象の環境の登録を解除します。

####2.7 対象の環境のConfigurationToolを実行して、実稼働環境でService Centerインストールを実行します。この手順により、トークンが再作成されます。

####2.8 LifeTimeのデプロイサイクルに対象の環境を再度登録し、同期が正常に完了したかどうかを確認します。
ここで、エラーが発生しなかったらOKです。


#最後に

####2.6
の手順で実施しているように、Syncで不具合が起きた場合、LifetimeのデプロイサイクルからSyncが上手くいかない環境を外すと思いますが、
OSLTM_ENVIRONMENTテーブルの内容を確認して、トークン等を削除することでSync系の問題は解決できるのかな？と思いました。
API経由でBundleSidを登録する（個人編）

:::note alert
2023年5月1日を持ちまして、株式会社KDDIウェブコミュニケーションズのTwilioリセール事業が終了したため、本記事に記載されている内容は正確ではないことを予めご了承ください。
:::

# はじめに

<font color='red'>■■■ 重要 ■■■
2021年8月現在、日本の番号（050/0120/0800）の購入については、法人契約が必須となります。
以下の手順での申請はできませんので、ご注意ください。
</font>

みなさん、こんにちは。
KDDIウェブコミュニケーションズのTwilio事業部エバンジェリストの高橋です。

Twilio側の仕様変更に伴い従来のアイデンティティがBundlesに変わりました。また、この変更に併せてドキュメントのアップロードを始めとしたAPIも公開されています。
[APIドキュメント](https://www.twilio.com/docs/phone-numbers/regulatory/getting-started/create-new-bundle-public-rest-apis)

ただし、こちらのAPIはまだSDKに反映されておらず、Curlのみサンプルが掲載されている状態です。そこで今回は、Node.jsを使ったプログラムを使って、BundleSidを登録するサンプルを紹介します。

このプログラムは、Twilio（KWCアカウント）におけるBundleSidの登録を自動化するものです。
以下の条件でのみ動作します。

- 個人での申請（法人申請には対応していません）
- 運転免許証による書類提出（免許証以外には対応していません）
- Node.js（バージョン8以降）がインストールされていること

## 準備

まずは運転免許証のコピーを**JPEG形式**で準備してください（サイズは5MB以内）。
スマホのカメラで撮影したものでも大丈夫ですが、免許証のみが写るように周りの画像は削除してください。

## インストール

適当なフォルダに移動し、リポジトリを取得します。gitが使えない方は、[こちらのZIPファイル](https://github.com/twilioforkwc/create-bundle/archive/master.zip)をダウンロードしてから解凍してください。

```
$ git clone https://github.com/twilioforkwc/create-bundle.git
$ cd create-bundle
$ npm install
$ mv .env.example .env
```

運転免許証の画像ファイルを、imagesフォルダにコピーしてください。
`.env`ファイルをエディタで開き、以下の項目をすべてご自分の内容に置き換えます。

|項目名|内容|
|:--|:--|
|ACCOUNT_SID|TwilioアカウントのAccountSid（ACから始まる文字列）|
|AUTH_TOKEN|AccountSidに対応するAuthToken|
|EMAIL|ご自分のメールアドレス（審査結果が通知されます）|
|BIRTH_DATE|ご自分の誕生日をYYYY-MM-DD形式で|
|FIRST_NAME|名前（名）を免許証に記載されている通りに|
|LAST_NAME|名前（姓）を免許証に記載されている通りに|
|IMAGE_FILE_NAME|免許証の画像ファイル名|
|STREET|住所（町丁目と建物名）を免許証に記載されている通りに|
|CITY|住所（市区町村）を免許証に記載されている通りに|
|REGION|住所（都道府県）を免許証に記載されている通りに|
|POSTAL_CODE|郵便番号をハイフンなしで|
|ISO_COUNTRY|日本の場合はJPのままで|

## プログラムの実行

```
$ node createBundle.js

...最初にテストコードが走って`.env`の内容をチェックします。
...テストがすべてPASSすると申請が始まります。

>>> AddressSid:ADf5bfb33ca656b88905c8e9827428f2ff created.
>>> BundleSid:BUf7e15df42d83dfc5697f1adb1bcef793 created.
>>> UserSid:IT9111cd08fbd6c31ae2914dd811327b09 created.
>>> DocumentSid:RDadd732e4cbb99d0034f7dea093f48df9 created.
>>> Assign completed.
>>> Submitted.
```

上記のように`Submitted.`が表示されれば成功です。
すぐに先程のメールアドレス宛に、「Twilio Regulatory Bundle Status Update」というタイトルのメールが届きます。
管理コンソールにログインし、電話番号 > Regulatory Complience > Bundlesを確認し、STATUSが`Pending Review`になっていることを確認しましょう。

![スクリーンショット 2019-12-24 18.05.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86046/d05dfabe-af17-5aa8-2320-0930bcf0acd9.png)

３営業日以内には審査が完了し、審査がパスするとSTATUSが`Twilio Approved`になり、電話番号を購入することができるようになります。

# まとめ

詳しいコードの内容は、ぜひ`createBundle.js`の中身を見ていただければと思いますが、大まかな流れは以下のようになっています。

1. 住所を登録する（27行目）。
2. Bundleリソースを作成する（41行目）。
3. エンドユーザを作成する（64行目）。
4. ドキュメントを作成してアップロードする（91行目）。
5. Bundleリソースにドキュメントを紐付ける（122行目）。
6. Bundleリソースにエンドユーザを紐付ける（137行目）。
7. Bundleを申請する（154行目）。

住所は4.のドキュメントを作成するときに利用します。
審査のポイントは、書類に書かれた内容と申請内容が一致することなので、住所や名前などに間違いがないことを確認してからプログラムを実行してください。

---
### Twilio（トゥイリオ）とは

https://twilio.kddi-web.com
Twilioは音声通話、メッセージング（SMS/チャット）、ビデオなどの 様々なコミュニケーション手段をアプリケーションやビジネスへ容易に組み込むことのできるクラウドAPIサービスです。初期費用不要な従量課金制で、各種開発言語に対応しているため、多くのハッカソンイベントやスタートアップなどにも、ご利用いただいております。
【Laravel】テンプレートでビューを楽に作る

#はじめに
ビューファイルを作成する時にテンプレートを利用することで簡単に全体の統一感を出すことができます。
では、説明していきます
#テンプレートの使い方
まずベースとなるテンプレートの利用方法について説明します。
##テンプレートファイルの作成
`layouts`フォルダの中に`app.blade.php`のファイルを作成してください。
そして、下記の内容を記述してください。

```html:resources/views/layouts/app.blade.php
<html>
    <head>
        <title>アプリ名 - @yield('title')</title>
    </head>
    <body>
        @section('sidebar')
            ここがメインのサイドバー
        @show

        <div class="container">
            @yield('content')
        </div>
    </body>
</html>
```

`@section`
　　使用目的はコンテンツの区画を定義することです。
　　最後には`@show`を使用します。
　　`@section('sidebar')`記述で`sidebar`という区画を定義しています。
`@yield`
　　表示内容を定義するためのものです。値を表示する場所を指定します。
　　`@yield('title')`は`title`という変数を使う場所を指定しています。
  
##ビューファイルの編集
ビューファイルでのレイアウトの参照方法について説明します。

```html:resources/views/child.blade.php
@extends('layouts.app')

@section('title', 'Page Title')

@section('sidebar')
    @@parent

    <p>ここはメインのサイドバーに追加される</p>
@endsection

@section('content')
    <p>ここが本文のコンテンツ</p>
@endsection
```
###`@extends`
`@extends('layouts.app')`
　　`layouts/app.blade.php`を継承します。
###`@section`①
`@section('title', 'Page Title')`
　　`title`に`Page Title`を代入する
###`@section`②

```html:
@section('sidebar')
    @@parent
    <p>ここはメインのサイドバーに追加される</p>
@endsection
```

`@section('sidebar')`は`sidebar`に代入する値を設定します。
`@@parent`は継承元の`app.blade.php`の内容を表しています。
`@endsection`は`@section`の終わりです。

#コンポーネントの使い方
コンポーネントとは部分的に使うテンプレートです。

```html:resources/views/alert.blade.php
<div class="alert alert-danger">
    <div class="alert-title">{{ $title }}</div>
    {{ $slot }}
</div>
```

`$slot`には下記の`@component`内の`@slot`以外の内容が入ります。

ビューファイルでのコンポーネントの参照方法を説明します。

```html:resources/views/child.blade.php
@component('alert')
    @slot('title')
        Forbidden
    @endslot
    You are not allowed to access this resource!
@endcomponent
```

`@component('alert')`は`alert.blade.php`を参照します。
`@slot('title')`は`$title`に変数を代入します。

以上で説明は終わりです。

**疑問、気になるところがございましたら、質問、コメントよろしくお願いします！！！**
【unzip】zipファイル内のディレクトリ区切り文字がバックスラッシュなものから任意のファイルのみを解凍する方法

もしかすると当たり前のことかもしれませんが、フィーリングで調べても答えがなかなか見つからなかったので備忘目的でメモします。

# 事の起こり
unzipコマンドで特定のファイルのみを解凍したい時

下記のようなzipファイルがある場合

```hoge.zip
$ zipinfo -1 hoge.zip
aaa/bbb/ccc.txt
ddd/eee/fff.jpg
ggg/hhh/iii.log
```
unzip {解凍対象zip} {取り出したいファイルパス} で実現できる。

```
$ unzip hoge.zip aaa/bbb/ccc.txt
```

がしかし、zipファイル内のディレクトリの区切りがバックスラッシュであった場合

```hoge_bs.zip
$ zipinfo -1 hoge_bs.zip
aaa\bbb\ccc.txt
ddd\eee\fff.jpg
ggg\hhh\iii.log
```
同じ調子でコマンドを入れるとエラーになってしまう

```
$ unzip hoge_bs.zip aaa\bbb\ccc.txt
Archive:  hoge_bs.zip
caution: filename not matched:  aaabbbccc.txt
```
#試行錯誤

シングルクォートで囲めばいいのか？と思うもこれもダメ

```
$ unzip hoge_bs.zip 'aaa\bbb\ccc.txt'
Archive:  hoge_bs.zip
caution: filename not matched:  aaa\bbb\ccc.txt
```
実は展開時にパスがスラッシュに変換されているのか？と試してみるもこれもダメ

```
$ unzip hoge_bs.zip 'aaa/bbb/ccc.txt'
Archive:  hoge_bs.zip
caution: filename not matched:  aaa/bbb/ccc.txt
```

# 上手くいった方法
バックスラッシュを2つにしてあげると上手くいきました

```
$ unzip hoge_bs.zip 'aaa\\bbb\\ccc.txt'
Archive:  hoge_bs.zip
warning:  hoge_bs.zip appears to use backslashes as path separators
  inflating: aaa/bbb/ccc.txt
```

こうやってまとめてみると、これって常識なんじゃないかと反省し始めています……
fetchでeuc-jpページを丸ごととってきてutf-8に変換して書き出す。

```js

fetch(`test.html`)
    .then(res => res.blob()) //blobとして読み込みむ
    .then(res => {
        return new Promise(resolve => {
            const reader = new FileReader();
            reader.onload = () => { resolve(reader.result) };
            reader.readAsText(res, 'euc-jp'); // 第2引数に、任意で文字エンコーディングを指定し、文字列として読み込む
        });
    }).then(res => {
        const document = new DOMParser().parseFromString(res, 'text/html'); // HTMLDocument (Document) が返る
        console.log(document.getElementById('id名').innerText);
    });

```

一度 Blob として読み込み、文字コードを指定して文字列に変換し、そこから DOM に parse する

参考
[FileReader.readAsText() - 文字列として読み込む](https://lab.syncer.jp/Web/API_Interface/Reference/IDL/FileReader/readAsText/)
[DOMParser](https://developer.mozilla.org/ja/docs/Web/API/DOMParser)
[Fetch API で Shift_JIS の HTML をDOM として読み込む](https://qiita.com/kerupani129/items/6646eb920c23658bc525)
[rails]credentials.yml.encにdatabase設定を保存している場合のheroku デプロイ

##ローカルの開発環境
データベースのパスワードなどを平文でdatabase.ymlに保存したくないので、
credentials.yml.encにdatabaseのパスワードなどを保存している。
↓
[【備忘録】credentials.yml.encにdatabase設定を保存する](https://qiita.com/NaokiIshimura/items/e5db6ca7d56f2cb1f1fb)

##heroku
この環境のままherokuにデプロイし、db:migrateするとherokuのdbに接続できず、エラーになる。

```sh:
$ heroku rake db:migrate
....
rake aborted!
NoMethodError: Cannot load database configuration:
undefined method `[]' for nil:NilClass
```
このままheroku openすると以下のようなエラーになってApp Crashedになる。

```sh:
heroku[router]: at=error code=H10 desc="App crashed" method=GET path="/" host=violao.herokuapp.com request_id=bf9aba32-8c1e-4b44-948b-3d302934f41f fwd="XXX.XXX.XXX.XXX" dyno= connect= service= status=503 bytes= protocol=https
```

##解決方法
master.key をherokuの環境変数としてセットする。

```sh:
$ heroku config:set RAILS_MASTER_KEY=`cat config/master.key`
Setting RAILS_MASTER_KEY and restarting ⬢ app_name... done, v13
RAILS_MASTER_KEY: xxxxxx601433892f64d2c33e69cxxxxxx
```
↓参考
[secrets.ymlや環境変数をRails 5.2のEncrypted Credentialsに移行する](https://qiita.com/d-mato/items/aab2b6b2f587a8582631#heroku)

その後 heroku db:migrateでdbのマイグレーションを行うと、エラーが解消し、heroku openでアプリが起動する。

```sh:
$ heroku rake db:migrate
```
Entity Framework Coreにおける行ロックと同時実行制御の挫折

# やりたかったこと

Entity Framework CoreでAzureのSQL Databaseに接続し、

1. 行の更新は競合させない
1. 接続エラーは数回リトライする

を実現したかった

# 挫折した点
## 行ロックは相変わらずできない

EF Coreになり、行ロックに対応していないかと期待しましたが、まだ未対応。

System.ComponentModel.DataAnnotations.ConcurrencyCheckを使って楽観ロックをすることで、更新を競合させないことは可能。
https://docs.microsoft.com/ef/core/modeling/concurrency

## ConcurrencyCheckをいれたときのリトライがいまいち

公式のドキュメントでは、DbUpdateConcurrencyExceptionをキャッチして、問題のデータをアップデートするような例が提示されています。

ところが、現在のDBの値に応じて、保存したい値が異なる場合、次の(1)と(2)で同じような処理を入れる必要があります。
扱うエンティティも異なるので共通化しづらいし、リトライ機構も自分で実装する必要があり、どうもいまいち。

```csharp
using (var context = new PersonContext())
{
    // データを取得

    // (1) 保存したいデータと現在のDBのデータを比較して保存する値を決める

    var saved = false;
    while (!saved)
    {
        try
        {
            // Attempt to save changes to the database
            context.SaveChanges();
            saved = true;
        }
        catch (DbUpdateConcurrencyException ex)
        {

            foreach (var entry in ex.Entries)
            {
                if (entry.Entity is Person)
                {
                    var proposedValues = entry.CurrentValues;
                    var databaseValues = entry.GetDatabaseValues();

                    foreach (var property in proposedValues.Properties)
                    {
                        var proposedValue = proposedValues[property];
                        var databaseValue = databaseValues[property];

                        // (2)　ここで(1)と同じ操作をしなくてはならない
                    }

                    // Refresh original values to bypass next concurrency check
                    entry.OriginalValues.SetValues(databaseValues);
                }
                else
                {
                    throw new NotSupportedException(
                        "Don't know how to handle concurrency conflicts for "
                        + entry.Metadata.Name);
                }
            }
        }
    }
}
```

参考
https://docs.microsoft.com/ef/core/saving/concurrency

## SqlServerRetryingExecutionStrategyはSqlExceptionしか扱わないらしい

Microsoft.EntityFrameworkCore.SqlServerRetryingExecutionStrategyのラッパークラスを作って、DbUpdateConcurrencyExceptionもSELECTからやり直すようにできればシンプルになると考え、作ってみました。

ただ、DbUpdateConcurrencyExceptionが発生しても、そもそもShouldRetryOnに入ってこないようで、挫折

参考
https://docs.microsoft.com/dotnet/api/microsoft.entityframeworkcore.sqlserverretryingexecutionstrategy

# まとめ

Entity Framework Coreになっても、まだいまいちなので他の方法を探したほうがよいな、という印象でした。
今更ながらODENetについて調べてみた

## 概要
このバズっている[認めたくないものだな… Neural Networkの力学系表現というものを](https://qiita.com/BootCamp_2019/items/478334a37b54f9641725)に感化され、ODENetについて少しだけ調べておもしれええってなったので備忘録的にまとめます。自分の書いてる内容は薄いです。読める人は原論文読みましょう！
大手のAI研究者は実装もやりつつ、いろんなキャッチアップもしててやはり優秀な方が多いですね！！さすが！！

## サクッとなにがすごいのか

参考文献にも出しますが、いろいろなまとめがもうすでに上がっており、非常に勉強になったのでとりあえず細かいところはそちらにリンクを飛ばして、自分の浅はかにもちょっとかじれたところだけを書いていきます。
この辺が素晴らしいのでぜひご覧ください。

- とりあえずの原論文[Neural Ordinary Differential Equations](https://arxiv.org/pdf/1806.07366.pdf)
- [論文紹介: Neural Ordinary Differential Equations](https://qiita.com/github-nakasho/items/10f71e756a1cca94b5ca)
- [NIPS 2018最優秀賞論文　トロント大学発 ： 中間層を微分可能な連続空間で連結させる、まったく新しいNeural Networkモデル](https://ainow.ai/2018/12/25/159218/)


<img width="636" alt="Screen Shot 2019-12-24 at 3.59.41.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/519792/4ce491ef-39c0-3cae-0a69-c62d8001a58c.png">
もうこの画像が全て（ではないけど）ある意味使い古されている原論文[Neural Ordinary Differential Equations](https://arxiv.org/pdf/1806.07366.pdf)の図になります。
もともとニューラルネットは隠れ層をいくつか用意して、ある意味離散的に各層に情報を伝達するような、「とぎれとぎれ」の近似を行なっていたわけです。例えば ResNetでいうと
<img width="372" alt="Screen Shot 2019-12-24 at 3.59.11.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/519792/b1687210-06b1-d72f-a5d2-a5c63719c6f3.png">
この更新式ってオイラー近似（時刻$t$ の常微分方程式を解くときのオイラー法）に似てない？となったわけでして、
<img width="346" alt="Screen Shot 2019-12-24 at 3.59.20.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/519792/a057d3fe-632a-b93f-ef8a-56e76cf5da59.png">
この上の常微分方程式をオイラー法で解く際の、$t$を連続的な層情報とすれば、「連続的な」層を持つようなNNが学習できるんじゃ？となったのがODENetになります。

このとき、常微分方程式を解く際の計算量はもちろんどれだけ$t$の幅を細かくとるか、が関わってくるのですが、これは連続的な層をどれだけ粗くとるか、ということと計算量のトレードオフになっています。
論文の提案では、学習の際、バックプロパゲーションをするときに計算グラフをメモリ上に全て保持しなければならなかった従来のニューラルネットの学習ではなく、ODENetを使うことによって計算グラフの保持の必要がなく、常微分方程式のソルバーを使うことでニューラルネット学習しようよ、ということになっています。

論文の１つのメインポイントは、素直にこれを実行した時にやはり保持しないといけない計算グラフを、adjoint-methodを使うことで保持の必要を無くしたというところです。
学習の際に小さくしたいロス関数は、
<img width="1040" alt="Screen Shot 2019-12-24 at 4.19.26.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/519792/0f11aded-b3ba-ffff-7440-1e45221472d9.png">

になりますが、これをパラメータで微分したときの挙動が知りたいわけで、
それをajointと呼ばれる
<img width="318" alt="Screen Shot 2019-12-24 at 4.19.34.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/519792/41d8f7ff-f24a-97fa-fae8-b7f7063b13ca.png">

が従う微分方程式
<img width="496" alt="Screen Shot 2019-12-24 at 4.19.42.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/519792/9ae81430-dc22-a1e3-4da5-2e08fc91a7f3.png">
をソルバーを使って解くことで、メモリに計算グラフを置く必要性を解消しています。

## 常微分方程式で定式化されるニューラルネット
この解釈めちゃくちゃおもしろいですね！！
原論文の式の導出なども含め、もう少し深入りできるように頑張ります！


おわり。
VSCodeでデバッグ設定ファイルlaunch.json (C言語)

1.Remote-WSL: 接続終了
2.「デバッグと実行(Ctrl+Shift+D)」ボタンをクリックし、「launch.json編集」リンクを押下する
3.C++(windows)起動を選択する
4.launch.jsonの「"configurations"」の内容を削除し、「構成の追加...」ボタンを押下する
5.「□ C/C++: (gdb) Bash on Windows の起動」を選択する
6.内容を以下ののように作り直す
　{
　　　// IntelliSense を使用して利用可能な属性を学べます。
　　　// 既存の属性の説明をホバーして表示します。
　　　// 詳細情報は次を確認してください: https://go.microsoft.com/fwlink/?linkid=830387
　　　"version": "0.2.0",
　　　"configurations": [
　　　{
　　　　　"name": "(gdb) Bash on Windows の起動",
　　　　　"type": "cppdbg",
　　　　　"request": "launch",
　　　　　"program": "/mnt/c/wk/LINUXC/algorithms/palindrome/palindrome",--Ubuntu環境の実行ファイル　改修内容
　　　　　"args": [],
　　　　　"stopAtEntry": false,
　　　　　"cwd": "/mnt/c/wk/LINUXC/algorithms/palindrome/",              --Ubuntu環境の実行ディレクトリー　改修内容
　　　　　"environment": [],
　　　　　"externalConsole":  true,　　　　　　　　　　                    --false →　trueに設定　改修内容
　　　　　"pipeTransport": {
　　　　　"debuggerPath": "/usr/bin/gdb",
　　　　　"pipeProgram": "${env:windir}\\system32\\bash.exe",
　　　　　"pipeArgs": ["-c"],
　　　　　"pipeCwd": "/"　　　　　　　　　　　　　　　　　　　　　　　　　--"" → "/"　改修内容
　　　},
　　　"setupCommands": [
　　　　{
　　　　　"description": "gdb の再フォーマットを有効にする",
　　　　　"text": "-enable-pretty-printing",
　　　　　"ignoreFailures": true
　　　　}
　　　],
　　　"sourceFileMap": {　　　　　　　　　　--Ubuntu環境とWindows環境のマップ　改修内容
　　　"/mnt/c/wk/LINUXC/algorithms/": "C:\\\wk\\LINUXC\\\algorithms"
　　　}
　　}
　]
}
7.ソースにブレークポイントをつけ、F5ボタンクリックし、デバッグ状態に入る
【React】useEffectの第２引数って？


# 概要
ReactのHooksに関して学び始めた際に`useEffect`の使用方法、特に第２引数部分の意味の理解に苦しんだので、そのまとめです。

# useEffectとは
ReactのHooksの１つです。
公式では、`副作用を実行するフック`のように説明されています。
ざっくり言うと、ライフサイクルメソッドを関数コンポーネントで実現する為に使われたりします。

この`useEffect`ですが、2つの引数を持ちます。

# まず第１引数
第2引数を空にすると、Render毎に実行される関数を取ります。

```js
useEffect(() => {
  console.log("毎回実行");
});
```

※ コメントにて@ryo0さんに補足して頂きましたが、実際は`useEffect`の第2引数を空にすると、FCの`state`, `props`のうちいずれかが更新される度に`useEffect`のbodyが走るようになる為危険です。その為、通常第2引数を空にすることはありません。

# そして第２引数
第２引数を与える事で第１引数の関数が実行されるタイミングを自在にコントロールする事ができます。
下記の２つのケースを考えます。

## (1) 空の配列が渡された場合

第2引数に空の配列が渡された場合、最初の`render時`のみ第１引数の関数を実行します。

```js
// 最初のrender時のみ第１引数の関数を実行
useEffect(() => {
  console.log('最初のrender時のみ実行')
}, [])
```

## (2)値の配列が渡された場合
第2引数に値の配列が渡された場合、`最初のマウント時と与えられた値に変化があった場合`のみ第１引数の関数を実行します。

```js
// 与えられた値に変化があった場合のみ第１引数の関数を実行
useEffect(() => {
console.log('変化があった場合の実行')
}, [value])
```

# まとめ

- 第2引数を指定なし=> `Render毎`に第１引数の関数を実行。
- 第2引数に`[]`を指定 => 最初の`render`時に第１引数の関数を実行。
- 第2引数に値の配列を指定 => 最初の`render`時と指定された値に変化があった場合`のみに第１引数の関数を実行。

# 参照
本記事では非常に簡単な`useEffect`の説明を行いました。
より詳しく、正確な詳細等は下記を参照してください。

- [A Complete Guide to useEffect — Overreacted](https://overreacted.io/a-complete-guide-to-useeffect/)
- [Using the Effect Hook – React](https://reactjs.org/docs/hooks-effect.html)
(実機試験配信停止？) Microsoft Azure AZ-103 Azure Administrator 受験/合格体験記

#（情報更新）試験配信トラブルだった可能性あり。追加で投稿しました
https://qiita.com/mnoda/items/5ae5151ef6d99338254b

#（情報更新）日本のMCPサポートに連絡はしておきました
https://trainingsupport.microsoft.com/ja-jp/mcp/forum/all/az-103-azure-administrator/098d98db-a0f8-4a37-9bc9-d0093ceb2a5f


#1週間みっちりAzureにつかって合格
Azureの無料枠にサインアップしたのが約1週間前。
自らWindows 10のVM作成しAWSとの違いを勉強したり（単純に「OS停止」しても課金継続するのですね）
https://qiita.com/mnoda/items/7e9700f14bfa6c02086f
https://qiita.com/mnoda/items/f96e82015129635ac9d9
とにかく画面に表示されているものを手当たり次第にクリックして中身を把握していきました。
Azureを活用したMachine Learningの無料セミナーにも参加する機会があり、
その際にAzure使っていたのですが、これってColaboratoryでもいいんじゃない？みたいなことも
先週末体験していました。（幅広く知識つけておくとこれならこっちでいいじゃない？って思いつきますよね）
VM作るとディスク、ネットワーク関係でいろいろ自動作成されますから作成されたものをこじ開けて
設定内容など疑問に思ったものはネット検索で調べていくみたいなこともかなりしました。
土日もAzureと一緒に過ごしていましたが、仕事の合間もさることながら
何とか1週間で試験合格までレベルを持っていけました。
SSO（Azure AD Connect）やO365関係でAzure ADをそれなりにさわっていましたからライセンス体系の違いがあるにせよ認証系のキャッチアップ（一般的なADの話やMFA関係）についてはハードルが低かったです。

#問題数、試験セクション数概略

私が受けたものは46問（第一セクション4問、第二セクション42問。内、第一セクションのセクション終了時と第二セクションの最初の部分は後戻り不可。択一(Yes/No含む)式、ドラッグドロップ/並び替え方式。）問題数が少なく意外に直ぐに終わりました。ネットの他の受験体験記によると12月の試験改定で問題数が減って実機試験が一旦無くなった様子だが、果たして復活するのだろうか。試験問題数が少ないと1問の間違いが試験点数にかなり響きますね。
　
#システム障害が頻発し実機試験/ラボ試験が無くなったのか？それともたまたま無かっただけ？
公式サポートサイトの投稿内容を見る限りにおいては「テストセンターで実施でも相当数のトラブル」がある模様。"microsoft az-103 lab issue site:trainingsupport.microsoft.com"のようなキーワードでググると公式サポートサイトでも障害事例がいろいろ出てきました。例外というよりかなりのトラブルが発生していたようでトラブルを理由に一旦配信停止になったのでしょうか。実際の実機試験でこんなトラブルにあったらどうしようとヒヤヒヤしていましたが、実機試験がなくテストセンターで拍子抜けしてしまいました。
https://trainingsupport.microsoft.com/en-us/mcp/forum/all/az-103-exam-lab-environment-issues-at-pearson-vue/6d912e82-42bb-4524-a288-58945d04af0c
https://trainingsupport.microsoft.com/en-us/mcp/forum/all/az-103-lab-issues/1fcbde9f-822d-4e2b-99c6-583f1cff45e6
https://trainingsupport.microsoft.com/en-us/mcp/forum/all/az-103-lab-issues/b1ce049a-4644-4aff-ae18-0b0013073ac0
https://trainingsupport.microsoft.com/en-us/mcp/forum/all/az-103-exam-issues/24709cd2-1a71-4562-8fb9-46ef4d42b4a2?page=2
https://trainingsupport.microsoft.com/en-us/mcp/forum/all/az-103-exam-lab-technical-problem/c3defa51-dc0c-4f5e-b343-42959d04f0aa


#AWS, Azure のAssociateレベルのダブルホルダーになった
ITで約50の試験、IT以外で50を超える試験を受けてきており、
今まで受けてきた試験総数は100を超えました。
一体どれだけお金使ってきたのだろう・・・なんだかんだで20年間で300万円は使ったかな？！
1年で考えると15万円ですから、一般人でも支出できなくはない金額ではないかと思います。
上級試験合格で割愛している試験もありますが免許/一覧はこちら：
**http://bit.ly/liccert**

#AWS, Azure, 他の勉強会をするかもしれません。
AWS, Azureの一般的な操作方法習得と資格試験で必要な事項の習得を
同時にやってしまった方が効率的です。今後勉強会を開催するかもしれません。
connpassで募るのがよいのだろうか・・・
お金がかからず人数アップダウンが簡単にできそうな会場手配が結構大変ですね。
Azureの勉強会なら品川のマイクロソフト使わせてくれると思いますが、
AWSも一緒に勉強となるとそうもいかんかな・・・
Rubyでじゃんけん

#Rubyにてじゃんけん (Rock-Paper-Scissors)

##1.じゃんけんの構造化

そもそもじゃんけんとは？？
グー、チョキ、パーのどれかを互いに選択し、勝敗を決めるものである。
今回はプレイヤーとプログラムで戦う。
グー Rock
チョキ Paper
パー Scissors
で対戦。
(プログラムでは、乱数を返す、randが活躍するが、それは後々)

##2.playerの手選択
入力による代入

~~~Ruby
p 'rock-paper-scissors'
player=gets
~~~

↑rock、paper、scissorsのどれかを選んでもらう
プレイヤーがスペルミスしたときの対応も重要になる

##3.programの手選択
乱数で決定する。

~~~RUby
program_hand=rand(3)
~~~

↑program_handは0、1、2を乱数で返すことになる。


##4.整理
人間にとっては、Rock-Paper-Scissorsという文字表記が分かりやすいが、乱数を0、1、2でやったように、プログラム(機械)からすると、文字よりも数字が分かりやすい。

よって、じゃんけんをしている２人(player、program)において、手を数字と文字であらわしておく

0 グー Rock
1 チョキ Paper
2 パー Scissors

~~~ruby
if program_hand==0
	program="rock"
elsif program_hand==1
	program="paper"
elsif program_hand==2
	program="scissors"
end
~~~

~~~ruby
if player=="rock"
	player_hand=0
elsif player=="paper"
	player_hand=1
elsif player=="scissors" 
	player_hand=2
end
~~~


##5.じゃんけんの勝敗をつける

ここで、条件分岐が登場
if文を用いる

~~~ruby
if player_hand==program_hand
	p 'draw'
elsif ((player_hand==0 and program_hand==2) or (player_hand==1 and program_hand==0) or (player_hand==2 or program_hand==0))and a==1
	p 'you win'
elsif 
	p 'you lose'
end
~~~

条件の式を書く上で、論理が連続で出てくることがある。（andやor）
論理の優位性などという話があるらしいが、難しい。
先に計算したい方をかっこでくくっちゃうのが早い、簡単、わかりやすい。

##6.スペルミスに対する対応

rock、paper、scissorsのどれかを選んでもらうことになってるが、
それ以外の入力には、いかにして対応するのか？？

one more please
と表示させることに

aという変数を登場させる。初期値0
rock、paper、scissorsのどれかが記入されたときのみa=1を代入。

aをつかって判断する

↓完成

~~~Ruby
p 'rock-paper-scissors'
player=gets


a=0

if player=="rock"
	player_hand=0
	a=1
elsif player=="paper"
	player_hand=1
	a=1
elsif player=="scissors" 
	player_hand=2
	a=1
end

program_hand=rand(3)


if program_hand==0
	program="rock"
elsif program_hand==1
	program="paper"
elsif program_hand==2
	program="scissors"
end



if a==0
	p 'one more please'
elsif player_hand==program_hand
	p 'draw'
elsif ((player_hand==0 and program_hand==2) or (player_hand==1 and program_hand==0) or (player_hand==2 or program_hand==0))and a==1
	p 'you win'
elsif 
	p 'you lose'
end

p "player",player,"program",program
~~~
バックエンド知識がない自分がGoogleAppsScriptを使って爆速でAPIを作って爆速で没にした話

# はじめに
これは[バックエンドの知識がない自分がFirestore+GoogleAppsScriptで簡易DBを構築した話](https://qiita.com/m-coder/items/3a117230e16ccfb6859c)の前段階の話です。

# 結論から言うと
- スプレッドシートとGoogleAppsScriptを使って簡易API作った！
- 動作速度が遅くて没にした:cry:
- 個人利用やテストデータを試すには十分使えると思うよ！

# 概要
[GoogleAppsScript(GAS)](https://developers.google.com/apps-script/)には、作成したスクリプトを「Webアプリケーションとして導入」するという機能があります。
これを使うと、**自分でサーバーを立てたりする事なく超簡単にAPIを公開できます**。

今回はGETリクエストが来たらスプレッドシートのデータを取得し、JSONで返すというAPIを作る事で、スプレッドシート上でDB管理のような事をできないか？と考えて実装しました。

# 実装方法
[「スプレッドシート上のデータを取得する処理を書く」](https://qiita.com/m-coder/items/3a117230e16ccfb6859c#%E3%82%B9%E3%83%97%E3%83%AC%E3%83%83%E3%83%89%E3%82%B7%E3%83%BC%E3%83%88%E4%B8%8A%E3%81%AE%E3%83%87%E3%83%BC%E3%82%BF%E3%82%92%E5%8F%96%E5%BE%97%E3%81%99%E3%82%8B%E5%87%A6%E7%90%86%E3%82%92%E6%9B%B8%E3%81%8F)
までは前回と同じなので省略します。前回の記事↑を参照ください。

## GETリクエストをGASで受け取る処理を実装する
GASには`doGet`というfunctionが用意されており、これを実装する事でGETリクエストを受け取った時の処理を記述することができます。（POSTリクエストは`doPost`）
詳しくは[公式](https://developers.google.com/apps-script/guides/web)を確認してください。

今回はGETリクエストを受け取った時にシートの値をJSONとして返します。

```
function doGet(e){ 
  // シートの値を取得
  var json = getSheetValue(sheet);
  var out = ContentService.createTextOutput();

  // MimeTypeをJSONに設定
  out.setMimeType(ContentService.MimeType.JSON);

  // JSONテキストをセット
  out.setContent(JSON.stringify(json));
  return out;
}
```

たったこれだけです。
これをAPIとして公開します。

## 作成したスクリプトを公開する
GASの[公開] > [ウェブアプリケーションとして導入]を選択します。
<img width="369" alt="スクリーンショット 2019-12-24 13.46.06.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309569/336573c9-2d20-e086-3c6b-44b8b9826366.png">
すると下記のようなウィンドウが出ると思います。
<img width="469" alt="スクリーンショット 2019-12-24 13.48.07.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309569/b1e4463f-34d9-5d0a-50f5-41ca2baa42c8.png">
`Project version:`は`New`を選びます。（ここでバージョン管理もできます）
一番下の`Who has access to the app:`を`Anyone, even Anonymous（全員（匿名ユーザを含む））`に変更し、Deployを選択します。
<img width="453" alt="スクリーンショット 2019-12-24 13.55.29.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309569/c1609b46-2459-250f-b799-74c2304b78c0.png">
上記のようなウィンドウが出たら、公開完了です。
テキストボックスに表示されている
https://script.google.com/macros/s/{xxxx}/exec
がAPIのURLになりますので、ブラウザでアクセスしてみます。
<img width="777" alt="スクリーンショット 2019-12-24 14.00.07.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309569/da7235d2-1d1f-066e-d6f7-d5a25d84e371.png">
このようにJSONが表示されていれば成功です。
超簡単にAPIが作成できました！

# 問題点
このAPIにも問題点があり、それは**動作速度が遅い**ことです。
私のアプリでは数件のデータにもかかわらず取得に2秒弱かかり、これは使えないという事で**約30分で実装したものを約30秒で没にしました**。実装も爆速なら没までのスピードも爆速です。

ただ、自分の使い方には合っていなかったというだけで、**個人で試しに使ってみるには十分有用**だと思います。

# 参考リンク
- [GoogleAppsScriptを使って無料で簡易APIを作成してみる](https://qiita.com/roana0229/items/fbff1a03d127dac7bdc4)
- [今から10分ではじめる Google Apps Script(GAS) で Web API公開](https://qiita.com/riversun/items/c924cfe70e16ee3fe3ba)
- [【GAS】スプレッドシートのデータをJSON出力する関数をExecution APIで外部のNode.jsから実行する](https://qiita.com/kingpanda/items/8e60a64dc2454f6ae6b5)
sshにてgithubに接続しpushまで


#はじめに

学校の実験で共同開発を行うことになったのでgithubを用いて開発を行おうとしたところ、

```
git clone　git@github.com:UserName/Repository.git
```

で行き詰ったので備忘録として記事を書くことにしました。

#GitHubでリポジトリの作成

最初にgithubにてリモートリポジトリの作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315086/7bacde59-e005-55ac-0a3d-a651a7cad0b6.png)
自分のアカウントの”Repositories”に行き、緑色のNewというボタンを押下しリポジトリ作成画面へ、今回はリポジトリ名を"Project1"という名前で作成します。
公開する予定はないのでPrivateのラジオボタンを押下。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315086/b30b4940-1ee5-ef06-94fa-0fceeae08a83.png)


---

次にリポジトリをクローンするためにURLをクリップボードにコピーします。
SSH接続を行うので今回はSSHを選択し、コピー。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315086/3873799c-b0a0-34a8-7566-7795902788c5.png)

次にローカルリポジトリ用にディレクトリを作成し、クローンをするために

```
git clone git@github.com:ユーザ名/リポジトリ名.git
```

するとエラーメッセージが出ました。

```
Please make sure you have the correct access rights
```


どうやらアクセス権が無いようなので、SSHの公開鍵と秘密鍵を発行してGitHubに登録しましょう。


#SSH鍵の作成

```
ssh-keygen -t rsa -b 4096 -c "your@mail.com"
```
※メールアドレスは自分がGitHubで登録しているものを参照

```
Enter file in which to save the key (you/.ssh/id_rsa):
```
ここでは鍵を保存する場所を聞かれているので特に指定がなければ（）内の場所に保存されるのでそのままEnter.

```
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
```
パスフレーズを尋ねられるので適当に自分の覚えられるパスフレーズを２回入力、これで作成完了です。



#GitHubへ公開鍵を登録

先ほど作ったid_rsa.pubをクリップボードにコピーし、GitHubに移動します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315086/11211320-bb37-d24d-b41d-2f8ab6f0ca5d.png)

「Setting」より「SSH and GPG keys」の項目を選択、「New SSH Key」より適当なタイトルを付けKeyには先ほどコピーした内容を転記し、Add SSH Key.

これでGitHubに公開鍵の登録が完了しました！早速git cloneをしてみましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315086/a7e4dc58-ad94-94d9-cb31-564632ae15fb.png)

パスフレーズを入力し…done!
ディレクトリを確認したところちゃんと”Project1”のディレクトリがクローンされているので無事出来ましたね。最後にpushしましょう。


#Pushまで

まずは適当にtxtファイルでも作成します。
変更箇所があったか確認するためにgit statusをします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315086/a3e38b58-8062-4d76-202f-10dd92007682.png)

するとaddしていないファイルが赤文字で出力されているので
>git add file.txt
でaddします。

次にコミットを行います、コミットするときには**オプション”-m”でコミットメッセージを入力すること**を忘れないでください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315086/a0179f54-10df-9a20-d2da-8b8ecaf79e85.png)

コミットすることができましたね、最後にpushしましょう。

pushは
>git push origin BranchName

でpushができます、今回はmasterブランチにpushします。
パスフレーズを求められるので入力し、完了です！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315086/9fa3fb62-16ef-f009-efbf-062e53002c95.png)


GitHubのほうに行き確認すると…

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315086/1daf45c2-c627-e438-7902-4db3b4301466.png)

無事Pushできてますね！よかったー
[Angular] 親コンポーネントから子コンポーネントのスタイルを変更しようとしたらハマった

## やりたかったこと
親コンポーネントで定義したスタイルを子コンポーネントへ反映させたかった。

```html:parent-compomemt.html
<parent-compomemt>
  <child-compomemt class="double-border">
</parent-compomemt>
```

```html:child-compomemt.html
<input type="text" class="input">
```

下記のような定義ではスタイルは反映されない。
そもそも親から子のスタイルを変えるのはお作法的にも悪いとのこと。

```ccss:parent-compomemt.scss
.double-border {
  .input {
    border: double;
  }
}
```

## 解決策
`:host`を使用して、子コンポーネント側で定義すれば良い。

```ccss:child-compomemt.scss
:host.double-border {
  .input {
    border: double;
  }
}
```
間接要員がエンジニアさんに囲まれた！

## 組織全体に通じる開発部門の知恵
非エンジニアの人間が開発部門に異動して、仕事に対しての思考、行動、観点に開発部門『ならでは』の特徴に初め感心して見ていました。
そのうち、『それ』は全ての部署に通じる生産性を上げ、成長を加速するポイントだと気付きました。
* タスクの進捗は状態では無く割合で報告、共有すること
* 遅れや滞りの理由を明確にすること
* 知恵とノウハウの共有の場を作ること
* 問題点を曖昧にせず、予め仮説、策を立てること

### 自己紹介
当社（現ノースディテール社）に転職して、年を越したら丸二年。
元々直前10年弱、北海道農産物のサプライチェーンを構築するベンチャーで、私は営業以外のあらゆる雑多な業務と人材育成事業を兼任し、名ばかり役員の完全なるプレイヤーを楽しみながら、人や国内外の地域に惹かれ続けていた。
震災後は被災地に入りプロジェクトを設計し、地域の若者が軌道に乗せるのを見届け、北海道に戻り次第、インドネシアに飛びトマトの圃場を視察、市場調査を終え、傍ら大学、企業へ講師に呼んでもらい。
「これは」という農産物の商品開発やネーミング、キャッチコピーを生み出すと、教育学術新聞へ連載の原稿を書き、一体自分が何屋なんだか。（エキサイティングで楽しかったけど）
勿論、全てにおいてプロジェクトが立ち上がる度にゴールとマイルストーンとをにらめっこし、調整しながら成果にコミットする毎日に慣れていたが、そこはベンチャー。
「ある程度の自由が利いてしまう」し、そうでもしなきゃ体がいくつあっても足りなかった（甘え）
この「多忙過ぎるが生温い」立場、30秒係らず稟議の通る（誤解無きよう。正真正銘地道に黒決算で成長、現在もこの企業は地域に根付き北海道に貢献されています）合理的で恵まれた環境が、当原稿後述の感銘に繋がる経験となる。

## 現在の立場
当社に入社したきっかけは省くが、一般的に世間で間接部門と称される人事、総務、労務、財務経理が固まっている管理部にいた。過去形。
今年初夏、私はエンジニアさんやデザイナーさんのいる開発部に異動になった。
勿論、IT技術を持たない私は、開発のミッションでは当然無く、70人のエンジニアさんらの中で、間接的なミッションをもらえた。

### 初めて開発の現場を見る毎日
開発部と管理部は異なるビルという事もあり、この開発部に一日中いる事など無かったので、朝から晩まで何度も「そんな事してたのか！！」と感銘の日々。
完璧なプロジェクトの進捗管理と、機能、マネジメントを行ない、顧客との調整やフォロー、QCDを常に頭に、各人、技術能力を発揮しているのだから、超人の集団なんじゃないかと。
それまで見えなかった故の私のイメージを覆したし、そしてこれは全部署、彼ら開発の仕事の運び方、機能、観点を取り入れる事で、生産性が格段に上がると気がついた。

### 開発の「当たり前」こそ、鍵
例えば、私が報告資料を作ると基本的な指摘をもらえた（恥ずかしい話、長く浸かったベンチャー特有の自由と立場がなす力技ですっ飛ばしてきた基本的で細かい質の部分）
・進捗報告は進捗の割合で報告すること
→遅れている場合の課題、問題、方法、リスケを考える為
・ゴールまでの残タスクの箇条書きの列挙を追加すること
→誰が何をどの位残しているかゴールまでの見える化
等々、当たり前のことなのに、きっちり此処まで実行している間接部門が世の中にあるかどうか。
部門の特性を盾にしたらキリがないが、進捗の割合には「成功（順調）」にも理由があり、逆に「遅れ」にも理由がある。
それが明確に蓄積されれば、知恵となり、いくら無謀な差し込みタスクが入ってきても、優先順位と時間の見積もりを正しくおこなう事ができるようになって、結果、残業が減り、ストレスも減る。
残タスクの箇条書き列挙一つ挙げても、周りがそれを知ることで、時間のある他のメンバーがフォローに廻ることも可能で、そうすると生産性も上がる。

見渡すと毎朝夕、各プロジェクトではMTGを欠かさず、そこで進捗状況や課題、解決提案をおこなう知恵とノウハウの共有は若者の育成に繋がっている。
リーダー達は皆、彼らからの一つ一つの報告や相談に必ず
・不確実性のある「点」を決して見逃さず、そこに対して確実な策を考えられるよう思考の軌道を修正
・時に守りに入ろうとする相手の本能に真直ぐなリインフォースを「感情」を入れずコントロール
・見えている（相談されている）問題解決を超えてそこに至った問題発見の観点
を含め伝えている。感情商売が長かった私には初め、厳しいなと見えた。が、一晩、二晩考えた結果、真っ正面で目の前一人の承認と効力感を冷静に根付かせるリーダーのアクノレッジメントに鳥肌が立った。

### 異なる部署への水平展開で叶うこと
もし、管理部が上記を実践したとすると、間違いなく
思考は明らかに「木を見ず森を見る」に変化し、部、係、担当、まして目の前のちっさいタスクなんか悠々と超え組織全体の「何をどうするのがBest、、、うーん、、、Specialが適切（＝本質の“何故”がわかるから）か」で行動する。
管理部によく見られる経営層と現場との間でのジレンマに悩まされることもなければ、間接＝必要なんだけどコストという現日本の悪い当たり前さえ変えられると思う。