OmniAICreator/Qiita-1.07M huggingface dataset:
Production ガイドライン

https://medium.com/@rakyll/production-guideline-9d5d10c8f1e を勝手に翻訳したものです。個人の感想を含みます。日本語母国語じゃないので誤字脱字及び理解の誤りなどがある可能性がありますのでご指摘または編集リクエストいただけるとありがたいです。

## 設計と開発
- ビルドは外部サービスなどから影響を受けない再現性のあるプロセスにしましょう。
- 設計時にサービスの SLO (サービスレベル目標) を定義しましょう
- 外部サービスの可用性のレベルを文書化しましょう
- 単一のグローバルなリソースに依存せず、複数またはフォールバックプラン（ハードコードなどでも）して置きましょう

## 構成管理
- 気密的な情報ではない静的かつ小規模な制定はコマンドラインフラグでも大丈夫ですが、その他はすべて設定管理サービスを利用してください。
- 動的設定はその設定管理サービスが利用できないときにファールバックの設定を持つようにしてください。
- 開発環境の設定は本番から継承することはやめましょう。プライバシーとデータ漏洩を起す恐れがあります。
- 動的に設定できるものを文書化し、設定管理サービスが利用できない場合の動作の説明も書きましょう

## リリース管理
- リリースプロセスはすべて文書化しましょう。
- SLO に影響を与えることも文書化しましょう。(例：キャッシュミスによる一時的な待ち時間の増加)
- カナリリリースプロセスがあれば文書化しましょう。自動的にフォールバックとか、分析できる仕組みを用意しましょう
- ロールバックではロールアウトと同じプロセスを使うようにしましょう

## 可観測性
- SLO に必要なメトリックスが収集されていることを確認しましょう
- クライアント側とサーバー側のデータは区別出来るようにしましょう。本番環境でもデバッグするためには重要です。
- 通常な作業などによるアラートは減らすようにしましょう
- Stackdriver 利用している場合はダッシュボードに GCP の指標も含みましょう
- トレースコンテキストを追加しましょう。gRPCの場合 grpc-trace-bin、HTTP の場合は X-Cloud-Trace-Context ヘッダーを参照してください。GCP側で問題をデバッグすることが可能になります。
- Stackdriver Profiler を有効化して CPU の使用率を最適化しましょう

## セキュリティと保護
- 外部通信は暗号化されていることを確認しましょう
- 本番環境の IAM が適切であることを確認しましょう
- プロジェクトに使っているリソースを完全に分離しましょう
- プロジェクト内のネットワークを使用し、VMインスタンスをグループ分けしましょう
- Cloud VPN サービスを使ってリモートネットワークを安全に接続しましょう
- ユーザデータへのアクセスは文書化し監視しましょう。アクセスログに記録され、監査されていることを確認しましょう
- デバッグエンドポイントは ACL によって制限されていることを確認しましょう
- ユーザの入力をサニタイズしましょう。ペイロードサイズの制限もしましょう
- 特定のユーザにアクセス拒否できる仕組みを持ちましょう。他のユーザに影響与えずに悪用を阻止できることになります
- 内部的に負荷などの影響を起こす可能性がある外部エンドポイントは避けましょう

## キャパシティプランニング
- サービスがどのように拡張して行くかを文書化してください （例：ユーザ数、受信ペイロードのサイズ、受信メッセージ数など）
- サービスのリソース要件を文書化してくさあい (例：VM　インスタンス数、Spanner インスタンス数、GPU や TPU などの特殊なハードウェアなど)
- リソースの成約の文書化。（例：タイプ、リージョンなど）
- リソースのクォータ制限の文書化 （例：API を使って新インスタンス作る場合の GCE API のレートリミットなど）
- 可能な場合、パフォーマンス低下などを測定するために負荷テストなどを検討してください
Ubuntu16.04にjupyter notebookをインストールする手順

Pythonのバージョンは2.7系

```
python --version
Python 2.7.12
```

jupyter notebookのインストール

```
sudo pip install jupyter
```

jupyter notebook起動の確認

```
jupyter notebook
```

ブラウザが立ち上がり、jupyter notebookが開く
http://localhost:8888/tree

終了の仕方
jupyter notebookが起動しているコンソールでCtrl+Cでプロセスを終了させる

新規のNotebooｋの作り方
jupyter notebookの画面の右上、newボタンを押しNotebook: Python 2を選択する

既存のNotebookをコンソールから開く場合

```
jupyter notebook FILENAME.ipynb 
```
Notebookを保存する場合
Notebookの画面上で古き良きフロッピーディスクアイコンをクリックする。
ファイル名は画面上のjupyterの右にある「Untitled1」と書かれているか箇所をクリックすると名前変更用のダイアログが起動する


## データ分析用のライブラリnumpy, scipy, scikit-learn,matplotlib, pandasがインストールされているかチェックする
ansible-playbookのリポジトリで環境を構築している場合は
numpy, scipy, scikit-learn, matplotlibはインストールされているはずである

pipでインストールされているリストをチェックて確認すること

```
pip list
```

# Pandasのインストール

```
 sudo pip install pandas
```

## jupyter notebookでのインポートしてみる
jupyter notebookで下記のスニペットを実行して表が表示されることを確認できれば
pandasがインストールされいることを確認できる

```
from sklearn import datasets
import pandas as pd
from collections import OrderedDict

iris = datasets.load_iris()

df = pd.concat([pd.DataFrame(iris.data,columns=iris.feature_names),pd.DataFrame(iris.target,columns=["species"])],axis=1)
df
```
Visual Studio CodeでCoqの環境作ってみた

手を出したかったけど出せていなかったCoqに入門しました。
Coqの環境として、メジャーなものは以下があるようです。

- CoqIDE
    - 恐らく、Coq界では標準に近い開発環境かと思います
    - Arch Linuxでは `pacman -S coqide` で入りました
    - これを使っていたのですが、自動インデント機能が見当たらなかったので、つらくなって別環境を探しはじめたのがきっかけで、この記事が生まれました
- Proof General (Emacs拡張)
    - いいらしいです。
    - 宗教上の理由でEmacs使えない人でも、Coq書くときは使ってる人がいる、らしいです。
    - けれども、今からEmacsに入門するのも面倒なので、今回はパスしました

ということで、なんか最近、妙にイケイケなVisual Studio Codeの拡張を探してみたら、いい感じのがありました。

![screen.png](https://qiita-image-store.s3.amazonaws.com/0/88256/658b0703-cf69-a1a9-5d29-a1447b3aa428.png)


## インストール
VSCodeの拡張機能を探すところに `vscoq` と打ち込むと出てくるやつを入れる。
https://github.com/siegebell/vscoq

## 操作方法
CoqIDEみたいに、1ステップずつコードを進めたり戻したりできます。

|操作|キーバインド|
|:--|:--|
|1ステップ進める|`Ctrl+Alt+↓(下矢印)`|
|1ステップ戻す|`Ctrl+Alt+↑(上矢印)`|
|カーソル位置までステップを動かす|`Ctrl+Alt+→(右矢印)`|
|最後までステップを進める|`Ctrl+Alt+End`|
|最初までステップを戻す|`Ctrl+Alt+Home`|

その他は[こちら](https://github.com/siegebell/vscoq/wiki/Setup)か、F1を押してCoqと入力して出てくるものをご参照下さい。

## その他、VSCodeの設定
Coqの文法上、ドットを行の最後につけることが多いのですが、私の環境では、VSCodeでドットを入力すると補完候補が出て、Enterを押すとそれが入力される憂き目に遭いました。
これはとてもつらいです。

VSCodeの設定でこれを変えることができ、設定画面を「enter」で検索したら、
`Editor: Accept Suggestion On Enter`
という項目が見つかります。デフォルトではonになっていますが、offにすると、Enterで候補を選べなくなります。(smartでは、うまくいきませんでした)

## 最後に
よいCoqライフを。
AKS+Virtual Node (ACI)環境の削除において、VNETの削除に失敗した場合の対処

以下の内容の通りでした
https://github.com/MicrosoftDocs/azure-docs/issues/18052?fbclid=IwAR3ueTYdtBc-aEBadreodGKdcQwrbhWGREE5C01DZunW4SWSRV_VeAfL9B8


```
RES_GROUP=myResourceGroup
VNET_NAME=myResourceGroup-vnet

# VNetに含まれるsubnetを削除。subnetの数だけ実施
SUBNET_NAME=default
SAL_ID=$(az network vnet subnet show --resource-group $RES_GROUP --vnet-name $VNET_NAME --name $SUBNET_NAME --query id --output tsv)/providers/Microsoft.ContainerInstance/serviceAssociationLinks/default
az resource delete --ids $SAL_ID --api-version 2018-07-01

az network vnet subnet update --resource-group $RES_GROUP --vnet-name $VNET_NAME --name $SUBNET_NAME --remove delegations 0
az network vnet subnet delete --resource-group $RES_GROUP --vnet-name $VNET_NAME --name $SUBNET_NAME

# VNetを削除
az network vnet delete --resource-group $RES_GROUP --name $VNET_NAME
```
LiveXamlを有効にする手順

#はじめに
Xamarin.Formsでモバイルアプリケーションを開発するとき、WPFやWinFormsのようなデザイナがないため、xaml書いてはエミュレータまたは実機でデバッグして表示を確認することを繰り返す必要があります。
熟練の方々にはxamlを書きつつ脳内には正確なUIのイメージが構築されているのだと思いますが、私のようにデザイナにおんぶにだっこな人間にはなかなか大変だったりします。

そこで最近巷で噂のあ「LiveXaml」というツールが非常に便利です。
これは、エミュレータまたは実機でデバッグ中にxamlを修正すると、その修正内容が直ちにデバッグ中のアプリケーションに反映されるという、素晴らしいものです。

その効果については動画でもググってもらうとすぐにわかると思います。

今回は、そのインストールについてです。
私はインストールするときに拡張機能だけインストールして「あれ、できないぞ？」と2時間ぐらい悩みましたが、インストールが必要なのは拡張機能だけではなく、Nugetパッケージもです。

#LiveXamlを使えるようにするまで

LiveXamlを使えるようにするには、以下の2つをインストールする必要があります。
ちなみに、14日間の無料トライアルがあり、これはアカウントの登録など必要ありません。
インストールが完了したらすぐに試用を開始できます。

- Visual Studio拡張機能のインストール
- Nugetパッケージのインストール

拡張機能だけでは動きません。

##拡張機能のインストール
メニューの`ツール`→`拡張機能と更新プログラム`を選択してください。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/245438/ab96647b-5bab-3927-1f8d-2a77f9582779.png)

`オンライン`タブで「livexaml」を検索すると、「LiveXAML for Xamarin Forms」という拡張機能が見つかるので、それをインストールします。
（張り付けた画像ではすでにインストール済みになっていますが）
インストール自体は、Visual Studioを終了させると開始します。この辺は指示に従えばOKです。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/245438/2133f949-045d-76f6-2ee5-c6e401f6150b.png)

###LiveXamlの設定メニューは？
LiveXamlの設定はメニューの`ツール`→`LiveXAML Settings`です。

<img src="https://qiita-image-store.s3.amazonaws.com/0/245438/f50ab240-3d49-de07-9c30-dd629e63ac21.png" title="" alt="image.png" width="60%" height="" >

以下のウィンドウが開きます。
もし、ライセンスを購入したらここで入力するのでしょう。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/245438/79848ca2-88e6-10b2-d31c-30a0f9a3d8ca.png)

右側にNuGetパッケージをインストールすることと、使い方が書いてあります。
「1. Install LiveXAML package」に、「Automatic」と「Manual」とあります。
「Manual」のほうはわかります。自分でパッケージをインストールしてね、ということです。
では「Automatic」のほうはボタンを押せば自動でインストールしてくれるのかというとそんなことはありません。
このボタンはLiveXAMLの有効/無効を切り替えるためのボタンです。
個人的にトグルボタンの嫌いなところは、ボタンのラベルに書いてある内容が「現在の状態」を表しているのか、「ボタンを押した後に得られる状態」を表しているのかわかりにくいことがある点です。

今回のボタンは、「ボタンを押した後に得られる状態」なので、上の画像のようになっていたらつまりは「**現在LiveXAMLは有効**」ということになります。

とまあ、この「Automatic」と「Manual」は全然対になっていなかったりします。


##Nugetパッケージのインストール
メニューの`ツール`→`NuGetパッケージマネージャー`→`ソリューションのNuGetパッケージの管理`を選択してください。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/245438/1374911c-d0d8-efdd-8471-0706e2907857.png)

そして、`参照`タブで「livexaml」を検索すると、「LiveXAML」というパッケージが見つかるので、インストールします。
（画像ではインストール済みになっていますが）

![image.png](https://qiita-image-store.s3.amazonaws.com/0/245438/acc2d5b9-8225-a8cc-a35f-b1d41c55d245.png)


これでLiveXamlのインストールが完了し、使うことができるようになりました。

#使ってみよう
使い方は上で説明した設定ウィンドウにも書いてありますが、以下のとおりです。

1. エミュレータまたは実機でデバッグ開始
2. xamlファイルを編集し、保存
3. デバッグ中のアプリケーションの表示が変更されることが確認できる

とても便利ですね！

#おわりに
とても便利なLiveXaml、買わない手はないと思うのですが、気になるお値段は以下のとおりです。

- 買い切り：240ドル
- 月極：24ドル/月

お安い！
【備忘録】C++のstd::sortでsegmentation fault

std::sortでややハマったので，忘れないうちにメモしておきます．

# std::sortの基本的な使い方
```c++:sort.cpp
#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

int main() {
  int data[] = {1, 5, 3, 2};
  vector<int> A(data, data+4);
  sort(A.begin(), A.end());

  // 出力
  for(size_t i=0; i<A.size(); i++) {
    cout << A[i] << ' ';
  }
  cout << endl;

  return 0;
}
```
コンパイルして，実行します．

```
$ g++ sort.cpp
$ ./a.out
```
```:出力
1 2 3 5
```

# 定義した比較関数を使ってソートする（悪い例）
次に少し応用して，定義した比較関数`compare`を使ったソートを試してみます．

```c++:sort_func.cpp
#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

// 比較関数を定義する
bool compare(int i, int j) {
  return i <= j;
}

int main() {
  int data[] = {1, 5, 3, 2};
  vector<int> A(data, data+4);
  sort(A.begin(), A.end(), compare); // 定義した比較関数を使う

  // 出力
  for(size_t i=0; i<A.size(); i++) {
    cout << A[i] << ' ';
  }
  cout << endl;

  return 0;
}
```
```
$ g++ sort_func.cpp
$ ./a.out
```
```:出力
1 2 3 5
```
うまく動作します．

# 同じ値が入った配列をソートする（悪い例）

上のコードを少し変えて，ソートする配列の要素が全て同じ場合を試してみます．
簡単のため，1だけが並んだ配列のソートを試してみます．標準入力から1の個数を与えるようにします．

```c++:sort_func_same.cpp
#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

bool compare(int i, int j) {
  return i <= j;
}

int main() {
  // ソートする配列を変更
  int N;
  cin >> N;
  vector<int> A(N);
  for(int i=0; i<N; i++) {
    A[i] = 1;
  }
  sort(A.begin(), A.end(), compare);

  // 出力
  for(int i=0; i<N; i++) {
    cout << A[i] << ' ';
  }
  cout << endl;

  return 0;
}
```

実際に実行してみます．

```
$ g++ sort_func_same.cpp
$ ./a.out
10
```
```:出力
1 1 1 1 1 1 1 1 1 1
```
うまく動作している？

```
$ ./a.out
100
```
```:出力
0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
```
んん？

```
$ ./a.out
100000
```
```:出力
Segmentation fault
```
セグフォしてしまいました．

# 原因と結論
比較関数の中で，**値が同じ場合は`false`を返す**ようにしないといけませんでした．

```c++
bool compare(int i, int j) {
  return i < j;
}
```
ある配列をソートしようとするとき，単純に考えると，ある２つの要素を取ってきて，比較関数にかけたときの返り値が`true`の場合にその２つの要素を交換します．このとき，比較関数を`return i <= j;`としてしまうと，`i`と`j`が等しい場合に，

1. 比較関数が`true`を返して，`i`と`j`をひっくり返す．
2. ひっくり返った`i`と`j`を再度比較することがあった場合に，またまた`true`を返して，ひっくり返す．

といった感じで連続してひっくり返し続けてしまうのが原因ではないかと考察しました．実際の`std::sort`ではアルゴリズムとしてクイックソート（の改良版であるイントロソート）が使われているそうで，その際の要素のアクセス順などの厳密な考察はしていませんが，大雑把に考えるとそういうことでしょうか．上の例で，要素数が小さいときには支障がなかった（ように見えた）り，`100`くらいのやや大きめの値を入れたときにどこからか`0`が湧いてきたりするのは謎ですが，比較演算子を等号なしの不等号に変更すると問題なく動作しました．

今回は単純な例で試してみましたが，自分がハマったのはもう少し複雑な比較関数でした．今後比較関数を自前で定義するときは，**比較関数に等号が成立してしまう条件は入れない**ように気をつけようと思います．

# 参考
[sort - cpprefjp C++日本語リファレンス](https://cpprefjp.github.io/reference/algorithm/sort.html)
[sort function C++ segmentation fault - Stack Overflow](https://stackoverflow.com/questions/1541817/sort-function-c-segmentation-fault)

# 更新
[2020/04/30] コードの記法をやや変更しました．
Web API 設計の基本を学ぶ（APIエンドポイント）

# はじめに

Web API の設計に関する基本的な考え方を理解するために、「[Web API: The Good Parts](https://www.oreilly.co.jp/books/9784873116860/)」を読んでいます。

書籍の記述だけでは上手く腹落ちしなかった箇所で、追加で調べたことがタイトルに合致する内容であれば、こちらに追記していきます。

# API エンドポイント（URI） の設計

Web API におけるエンドポイントは、API に アクセスするための URI を指します。

基本的には、**URI が「リソース」を指すものであり、URI と HTTP メソッドの組み合わせで処理の内容を表すのが良い設計である**とされています。
これは、HTTP の URI がリソースを指すことで「名詞」として考え、それに HTTP メソッドを「動詞」として組み合わせることで、シンプルに行いたいことを表現することができるからです。

良い設計に近づけるために気をつけなければならないことを、いくつか記載します。
（追記するべきことがあれば、追記していきたいと思っています）

## URI が短く入力しやすくなっているか？

短くてシンプルな URI にしておくと、以下のような良いことがあります。

* わかりやすい
* 覚えやすい
* 入力間違いが少ない

## URI は人間が読んで理解できるか？

URI だけで何を目的としたものが理解できることが重要です。

* 勘違いによるトラブルを防ぐため。
* ドキュメントの参照頻度を減らすため。

また、この観点で気をつけたいのは、**「短い URI を目指すがあまり、意味がわかりにくくなってしまうことの防止」**です。

### 省略表現の扱いについて

慣れてる人にしか伝わらない省略表現をむやみに使うことは避けたほうが良いと思います。

ただし、省略表現そのものがだめというわけではなく、「jp」や「jpn」のように国際規格ISO 3166-1で標準化されたものは、こちらを使った方がわかりやすいこともあるので、ここは内容を見て判断する必要があります。

## URI に大文字小文字が混在していないか？

標準的に選択されているのは小文字なので、小文字で統一する方が好ましいです。

* 大文字小文字が混在していると、間違えやすくなるため。

## URI は外部の人も使いやすいか？

サーバ側の都合はサーバサイドで処理をするようにして、Web API の利用者にそれを意識させない設計の方が好ましいです。

## URI にサーバ側のアーキテクチャの都合が含まれていないか？

Web API を提供するサーバがどの言語で API を実装しているかや、システム構成などの情報が API の利用者に伝わらない方が好ましいです。

* API の利用者にとっては不要な情報であるため。
* 広く周知された脆弱性が含まれている場合などで特に、攻撃を受ける可能性が高まるため。

## URI のルールは統一されているか？

URI に利用される単語や、 URI の構造は統一感がある方が好ましいです。

* 統一感がない場合、クライアント側の実装時に混乱を招きやすいため。

## 適切な HTTP メソッドを利用しているか？

HTTP メソッドは「動詞」として表現するため、適切なものを使用する方が好ましいです。

| メソッド名 | 説明 |
|:----------------|:----------------|
| GET | リソースの取得 |
| POST | リソースの登録（リソース名は指定しない） |
| PUT | リソースの登録/更新（リソース名を指定する） |
| DELETE | リソースの削除 |
| PATCH | リソースの一部変更 |
| HEAD | リソースのメタ情報の取得 |

### POST と PUT の使い分け

POST と PUT の使い分けは、 URI の指定の仕方にあリます。

`POST /photos` とすると、リソース名がサーバ側で割り振られて、`GET /photos/25252`などの新しい URI がアクセス可能になります。一方、 PUT は、`PUT /photos/25252`のように、使用者がリソースを指定する場合に使います。

### PUT と PATCH の使い分け

PUT はデータを完全に上書きしたい場合に使います。
PATCH はデータの一部だけを更新したい場合に使います。

## URI で利用される名詞は複数形になっているか？

URI でリソースを表現する場合、リソース名は `users` や `photos` のように、複数形の方が適切であるとされています。
これは、データベースのテーブル名が複数形の方が適切であると言われることと同じで、リソースも「集合」を表すものであるため、複数形の方が適切だとされています。

## URI にスペースやエンコードが必要な文字が使われていないか？

パーセントエンコーディングされる文字や、スペースは利用しない方が好ましいです。

### パーセントエンコーディング

パーセントエンコーディングは、URI において使用できない文字を使う際に行われるエンコード（一種のエスケープ）です。
パーセントエンコーディングされると、元の文字がひと目でわからなくなってしまいます。

## URI で単語をつなげる必要がある場合にハイフンを利用しているか？

もっとも良いのは、単語をつなぎ合わせることを極力避けることとされています。

しかし、やむを得ず単語をつなげなければならない場合もあると思います。
その場合、特にポリシーがなければ、ハイフンで繋ぐのが良いという意見が多いようです。
[Hyphen, underscore, or camelCase as word delimiter in URIs?](https://www.google.com/search?q=uri+hyphen&oq=uri+hyphen&aqs=chrome..69i57j0l5.3162j0j9&sourceid=chrome&ie=UTF-8)

# 参考

* [Web API: The Good Parts](https://www.oreilly.co.jp/books/9784873116860/)
エンジニアはスーツ大嫌いだよね？でもスーツ好きになればエンジニア就職の単価アップするかもしれないぞ。動きやすいストレッチスーツとかどう？

エンジニアはスーツ大嫌いだよね？でもスーツ好きになればエンジニア就職の単価アップするかもしれないぞ。動きやすいストレッチスーツとかどう？

# Twitter

<blockquote class="twitter-tweet" data-lang="en"><p lang="ja" dir="ltr">給与をアップさせるための<br>一番簡単な方法は<br>スーツ着ることだよ<br><br>ちゃんとしてるように見えるじゃない？<br>それだけで単価アップするんだよね。<br><br>次の簡単な方法はね<br>身だしなみだよ。<br><br>前髪あげておでこ見せて<br>キラッと爽やかな笑顔とかしたら<br>それだけで単価アップするんだよね。<br><br>そんなもんだよ。</p>&mdash; Motcii (もっち〜) ＠ 離職率100%を目指す経営 by 現役エンジニア社長 &amp; 客員教授 (@ginza_no_motcii) <a href="https://twitter.com/ginza_no_motcii/status/1084278501362941952?ref_src=twsrc%5Etfw">January 13, 2019</a></blockquote>

# Me

[とあるエンジニアが就職したい会社の条件。スーツ着用は絶対無理！という個人的な心の叫び。 - Qiita](https://qiita.com/YumaInaura/items/10f72b48d4dff0e3972a)

# 法則

<blockquote class="twitter-tweet" data-lang="en"><p lang="ja" dir="ltr">真逆だから高くなるんですよ。<br>需要と供給の原則ですね。<br>みんなが嫌がることが<br>一番効果的な単価アップの手法</p>&mdash; Motcii (もっち〜) ＠ 離職率100%を目指す経営 by 現役エンジニア社長 &amp; 客員教授 (@ginza_no_motcii) <a href="https://twitter.com/ginza_no_motcii/status/1084279897076318208?ref_src=twsrc%5Etfw">January 13, 2019</a></blockquote>

# 感想

- スーツ好きな人はエンジニア単価が高くなるからスーツ路線を貫いたら良いかも！
- いったん着慣れてしまったら私服も毎日選ばなくて良いし、むしろコストは低いかも！
- 忍者スーツみたいなものすごく動きやすいスーツを選びにいきたくなった‥！ (単に格好良いかもという理由で)

# 折衷案

最近は動きやすいスーツも出てるみたいだよね
![image](https://user-images.githubusercontent.com/13635059/51081022-5d6c7e00-1729-11e9-9e56-27735254ff6e.png)

---

https://twitter.com/yumainaura

https://github.com/YumaInaura/YumaInaura/issues









<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Twitterには「この人はこの人にフォローされています」という信用経済のUIがある。SNSは、人間の村社会を実現している。

Twitterには「この人はこの人にフォローされています」という仕組みがある。SNSは、人間の村社会を実現している。

# Twitterと信用経済

今更かもしれないけどTwitterで人のアカウントのプロフィールページを見て、フォローするかフォローしないかを判断する時、この人は誰々さんにフォローされていますみたいな表示が出てくるじゃないですか。あれってすごい社会的な仕組みとして機能しているよな。

すべてのSNSがそうだと思うけれど、Twitterも信用経済、信用社会でできているから、それを加速させるのが、この表示だな。

# Twitter初心者の人は

あの、フォローとフォロワーのサークルの中にまずは切り込む必要があるかもしれない。関係性の輪の中へ。


# もともとは

友達や知り合い同士でなう！を共有するためのサービスだったTwitter。

それがはるかに拡張した今、誰でも気軽にフォローできる、拡散型のサービスになった代わりに、逆に内輪的な世界を守るための仕組みがあるのは、むしろ原点回帰というか、Twitterの本質なのかもしれない。

# Twitterのような気軽なインターフェイスや、サービスのイメージ、その表層だけを見てしまうと

その薄いベールの下に、人間の本質的な社会が存在すると言うことが、わかりづらいかもしれない。

Twitterを使っていて思うのは、やはり人間の本質的なコミニケーションの世界が存在して、はるか昔の原始社会の村社会のように、たくさんの村が存在して、それぞれがサークルを作り、そして村と村同士がさらに脳細胞のように電気信号をやりとりしているだろうということだ。


# 人間が使うソフトウェア、特にSNSでは、必ず根底に

この信用経済の仕組みが流れていると思う。

サービスやソフトウェアは、人間社会にかかる薄いヴェールのようなものなのだ。

いや確かに、サービスが人間社会を独自構築していく部分も多く、やばいキラーツールなのだけど。TwitterとかFacebookとかのサービスって。

---

https://twitter.com/yumainaura

https://github.com/YumaInaura/YumaInaura/issues









<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
kubernetesのservice accountとデフォルトの権限を理解する

kubernetesでRBACを利用する場合、service account(以下sa）を作成するとどのような権限が割り当てられているか把握できていますでしょうか。私はできていなくて、環境によってsaを作った時のデフォルト権限がなんか違う気がし、もやもやしていたので調べました。

- 想定読者
    - KubernetesのRBACの概要は理解している
    - KubernetesのRBAC関連リソースを理解している
        - Role
        - RoleBinding
        - ClusterRole
        - ClusterRoleBinding
 

# 結論
- 全てのsaは「system:serviceaccounts」グループに属する
    - つまりsystem:serviceaccountsグループに対して許可した権限は全てのsaに適用される
- 環境によってはsystem:serviceaccountsに対してデフォルトで権限が与えられている
    - 例えばdocker-desktopではcluster-admin権限が与えられている
    - 他のKubernetes環境(EKSなど）を使った時に仕様を理解していないと挙動の違いに悩まされる

結論は簡単ですが、上記の内容は重要な仕様なわりにドキュメントにさらっと書かれているので理解が遅れました、、、、。

# 環境の違い
system:serviceaccountsなどの設定は環境によってデフォルトで作成されていたり、されてなかったりするのでややこしいです。

## docker-desktop
例えばdocker-desktopを確認してみると、以下のようなClusterRoleBindingsがデフォルトで作成されています。

```bash
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: docker-for-desktop-binding
  selfLink: /apis/rbac.authorization.k8s.io/v1/clusterrolebindings/docker-for-desktop-binding
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-admin
subjects:
- apiGroup: rbac.authorization.k8s.io
  kind: Group
  name: system:serviceaccounts
```

つまり、saを作成するとデフォルトでcluster-adminという強い権限が与えられます。（かなり危険ですね。）

## EKS
EKSの場合はsystem:serviceaccountsに関するClusterRoleBindingsはデフォルトでは作成されていません。つまりsaを作成して管理者が権限を与えない限り、saは権限を持ちません。

# まとめ
内容として少ないですが、RBACを理解するうえでコアなsaの仕様を紹介しました。


# 参考URL
- [Using RBAC Authorization - Kubernetes](https://kubernetes.io/docs/reference/access-authn-authz/rbac/#referring-to-subjects)
「bundle update --sourceで特定のgemをアップデート」は、何がダメで、「--conservative」とは何なのか

のっぴきならない事情により、依存しているgemを除いた特定のgemだけをupdateしたい、という時に

    bundle update --source hoge

ってやるとできるよ、とどこかで聞いたことがありました。

久しぶりにのっぴきならない事情があって --sourceオプションを使おうとした時に --conservativeオプションを使わなきゃダメ、と教えてもらいました。
--sourceオプションとなにが違って、なんでこちらが良いのかをググってみても、 「--conservativeを使わなきゃダメなんだ」という記事が引っかかるだけで、何故「--conservativeを使わなきゃダメ」なのかわからなかったので、気になって調べてみました。

## conservativeオプション


v1.14以降のbundlerではupdateコマンドにconservativeというオプションがあります。

    bundle update --conservative hoge

bundlerのDoc曰く、依存関係にあるgemをupdateしないとのこと。まさにのっぴきならない事情向きな用途です。
> Use bundle install conservative update behavior and do not allow shared dependencies to be updated.
https://bundler.io/v2.0/man/bundle-update.1.html

## sourceオプション

sourceオプションの方もDocを見てみると、どこのソースのgemを使うのか指定するオプションとのこと。
> The name of a :git or :path source used in the Gemfile(5). For instance, with a :git source of http://github.com/rails/rails.git, you would call bundle update --source rails
https://bundler.io/v2.0/man/bundle-update.1.html

ぜんぜんのっぴきならない事情向けじゃないですね。
なぜこのオプションでやりたいことができていたのか、気になって仕方がないのでbundlerのリポジトリを漁ってみました。
すると、過去のissueで、「--sourceが依存関係にあるgemを更新しないで特定の　gemだけを更新するノウハウとして広まりつつあるけど、これってたまたまそういう挙動になっちゃってるだけで、--sourceの挙動としてあかんのでは？」というような議論がなされていました。
https://github.com/bundler/bundler/issues/3759
（微妙な英語力でナナメ読みしてるので違ってたらすいません。。。）

## 結論：「--source」はたまたまそれっぽい挙動だっただけ

--sourceが依存関係のgemまでアップデートしなかったのは「たまたま」だった。
やりたいことを実現するためのオプションは--conservative。
iPhone音声入力をコスパ最強でブログにアウトプットする方法を試行錯誤していたら、音楽雑誌のインタビュー記事的なレイアウトに行き着いたかもしれないUI話。フォント！レイアウト！

iPhone音声入力をコスパ最強でブログにアウトプットする方法を試行錯誤していたら、音楽雑誌のインタビュー記事的なレイアウトに行き着いたかもしれないUI話。フォント！レイアウト！

# iPhone音声入力で Twitter で語って、Slackにテキストだけを連携共有

![image](https://user-images.githubusercontent.com/13635059/51080744-7de60980-1724-11e9-95da-2d092a3b2d0b.png)

# そのままコピペで、ほかサービスのフォームに移動させる

![image](https://user-images.githubusercontent.com/13635059/51080749-9eae5f00-1724-11e9-9637-becd403fc28f.png)

# 見出しをつけるのにキーボードを打つのも面倒だけど、見出しはつけたい

こんな感じで、ハッシュや改行の入力だけで、もとのテキストをそのまま見出しとして利用する

![image](https://user-images.githubusercontent.com/13635059/51080765-cbfb0d00-1724-11e9-8817-520f70075408.png)

# 結果

音楽雑誌のインタビュー記事みたいになる

![image](https://user-images.githubusercontent.com/13635059/51080768-d4534800-1724-11e9-83ff-f3e6dd55ff35.png)

# 感想

音声で語るのはまさにインタビュー！

それに見出しをつけるための試行錯誤として、そもそも、音楽雑誌的なフォントやレイアウトも生まれたのでは…！？

# シームレスな、区切りのないリソースに対しての、無段階的な見出し付け

そう

# 弱い境界線

をUIで実現していたのでは？

# やっぱり僕らのSlackやTwitterやブログの世界は、もっとシームレスになるべきだ

全ての境界線が曖昧になっていく世界、それが人間の脳みそ的にも自然だと思わないかい？

# 良い音楽雑誌の画像‥がぞう‥

not found 

now printing ?

help me please

---

https://twitter.com/yumainaura

https://github.com/YumaInaura/YumaInaura/issues














<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
pingをある範囲に実施するワンライナー

#Powershellにて

```
for($idx=0;$idx-lt255;$idx++){ping -n 1 192.168.0.$idx | Select-String TTL;}
```
##出力例
以下のように返答があったアドレスのみ表示される。

```
192.168.0.1 からの応答: バイト数 =32 時間 =2ms TTL=64
192.168.0.31 からの応答: バイト数 =32 時間 =686ms TTL=64
192.168.0.35 からの応答: バイト数 =32 時間 =180ms TTL=64
192.168.0.54 からの応答: バイト数 =32 時間 =3ms TTL=64
192.168.0.80 からの応答: バイト数 =32 時間 <1ms TTL=128
192.168.0.148 からの応答: バイト数 =32 時間 =123ms TTL=64
```
#動機
RasPiをLANにつないでSSH経由でモニタレスでセットアップしたいが、RasPiのアドレスを調べる必要があったため。
そういう時はRaspberryPiのSSHを有効にしてから起動するようにする。
[Raspberrypi sshを有効に](https://www.penpale.jp/blog/raspberry_pi_zero_w_setup_without_monitor.html)
【WordPress】ブロックエディタの基礎知識

## どんなものなのか？

[新しい Gutenberg 編集エクスペリエンス](https://ja.wordpress.org/gutenberg/)

## 試したい

### WordPress.orgで試す

[新しい Gutenberg 編集エクスペリエンス](https://ja.wordpress.org/gutenberg/)

### すでにある5.0系ではないサイトで試す

[Gutenberg](https://ja.wordpress.org/plugins/gutenberg/)プラグインを入れる。

### 5.0系のテストサイトをたてる

## 無効にする方法

### プラグイン

#### [Classic Editor](https://ja.wordpress.org/plugins/classic-editor/)

新しいサイトやすでに5.0系をインストールしているサイトやアップデートすることが決まっていて、無効にしたい場合はこれでOK。
以下設定できる項目。

![スクリーンショット 2019-01-13 9.39.27.png](https://qiita-image-store.s3.amazonaws.com/0/13242/527711fd-8f17-54e5-682d-d414cc444b0c.png)

#### [Disable Gutenberg](https://wordpress.org/plugins/disable-gutenberg/)

まだ5.0系にしないけど、紹介の項目なども消したい。将来アップデートした時には無効にしたい、というときはこちらが便利。
以下設定できる項目。

![スクリーンショット 2019-01-13 9.41.00.png](https://qiita-image-store.s3.amazonaws.com/0/13242/80ec8378-664b-fcc0-f34e-5149755b9488.png)

### いろんな条件での無効化

[WordPress：Gutenberg（ブロックエディタ）を無効化する方法 \| NxWorld](https://www.nxworld.net/wordpress/wp-disable-gutenberg.html)

## ブロック

### 一覧

[【WordPress】Gutenbergのブロック一覧](https://qiita.com/ituki_b/items/f7509451f1b38f1c9288)

### クラシックブロックに書いた内容を一括でブロック変換する

[WordPressの新エディターGutenberg\(グーテンベルク\)で、クラシックブロックに書いた内容を一括でブロック変換する方法 – WordPress（ワードプレス）テーマ＆プラグイン販売 コミュニティコムショップ](https://www.communitycom.jp/shop/blog/classic-editor-to-gutenberg/?fbclid=IwAR2S8dux-VGSG8yYJ6a07XSTxTxAKFp4bk2KIPQBACvJGkCMKdmo8FrXDlQ)

### デフォルト表示されているブロックを非表示にする

[WordPress：Gutenbergでデフォルト表示されているブロックを非表示にする方法 \| NxWorld](https://www.nxworld.net/wordpress/wp-gutenberg-remove-default-block.html?fbclid=IwAR1o0HBtMkRgpyF3tiQDBLf4AFdmFJLT4lgolsmNiio76C9IeZyRzVQ3ygg)

### 開発

#### 簡単に開発環境を用意する（Docker ＋ Local by Flywheel ＋　 npm create-guten-block）

[create\-guten\-blockで手軽にGutenbergプラグイン開発環境を整える@ryo511 \- Qiita](https://qiita.com/ryo511/items/d6ad78fc8c7076116f8f)

#### [Gutenberg Handbook – The new Gutenberg editing experience — WordPress](https://wordpress.org/gutenberg/handbook/)

#### ブロックの有効無効を管理画面で指定できるBlock Managerプラグイン

[Disable Gutenberg Blocks – Block Manager \| WordPress\.org](https://ja.wordpress.org/plugins/disable-gutenberg-blocks/)

#### 簡易的なGutenbergブロックを作成できるプラグイン「Block Lab」 

[WordPress：簡易的なGutenbergブロックを作成できるプラグイン「Block Lab」 \| NxWorld](https://www.nxworld.net/wordpress/wp-plugin-block-lab.html?fbclid=IwAR3-dPMfhhSk4bAbfGyFYTJSKHuCtH9hgASN82-vvhvnQsqoojviriufgi4)
Twitterでリスト機能を使わないユーザーはステップ数のオーバーヘッドに弱いかもしれない。脳は多様性でできている。一応UIの話。



# Twitterで、僕の場合

昔リスト機能を使いこなそうとしたことがあったけれど、結局やめてしまったな。

# ホームからリストに飛ぶときのコスト感が

半端ないことに気づいて。結局リストに入れても見ないことが多くなって。

# でも逆に

リストからしか絶対ツイートに飛ばない人もいると聞いた。 

https://t.co/bZrMaviDcy

# 個人個人の脳の仕組みというのは、人それぞれ違って、多様性があるという。

だから人がどちらにコストとオーバヘッドを感じるかと言うのは、気質や性質の違い、そこに依存するところなのだろう。

僕の場合は、他のソーシャルサービスでもとにかくホーム画面しか見たくない。

# ステップ数をとにかく嫌うので

オーバーヘッドの摩擦係数のようなものがめちゃくちゃ高いのかもしれない。

逆にホーム画面でいろんなツイートが流れてきて混乱してしまうのは、別軸の意識の仕組みが働いているんだろうな。

# Twitterの使い方1つとってみても

自分自身の経験をもとに、あれがいいこれがいいと言ったりするけれど。

個人個人の多様性、違いと言うものが確実に存在すると言う事は、科学的に明日らしい。

だから自分にとっての最適な戦術は、やはり自分自身の感覚に聞いてみるしかない。

# 結論は普通の話。


---

https://twitter.com/yumainaura

https://github.com/YumaInaura/YumaInaura/issues









<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Pythonではじめる機械学習　レポート⑥

#6章　アルゴリズムチェーンとパイプライン
　多くの機械学習アルゴリズムにおいて、データの表現は非常に重要である。
そのため、データを変換する処理と機械学習の処理が複数あったとき、
連鎖的に実行する必要がある。
scikit-learnでは、Pipelineクラスを使って、
複数の処理ステップを繋ぎ、１つのEstimator(推定器)にできる。

##6.1 汎用パイプラインインターフェイス
　パイプラインに並べるEstimator(処理)に関する制約は、
次に使うデータを呼び出すためのtransformメソッドの定義のみでよい。
![無題.png](https://qiita-image-store.s3.amazonaws.com/0/314381/574b97a4-a55e-bc2b-d343-ecbcc377c2dd.png)
![無題.png](https://qiita-image-store.s3.amazonaws.com/0/314381/6deb643a-7d94-5b4b-261f-1684ef4722b3.png)
![無題.png](https://qiita-image-store.s3.amazonaws.com/0/314381/47b8580e-7f74-0ba2-e996-84f9e39ba880.png)
エンジニアには、自分が理解できないことを、言語化したいと言う欲求がある。尾崎豊みたいな代弁者はいませんか？

エンジニアには、自分が理解できないことを、言語化したいと言う欲求がある。尾崎豊みたいな代弁者はいませんか？


# 最近Twitterでよく聞く話

全部理解できないけど、理解したい！もやもやする！でも全部は理解できない！

# 弱点

僕も本能で動けばいいのに、頭で考えてしまって、言葉で説明しないとどうにも動けなかったり。

だけど最近は説明できない事は説明できないまま動いて、動きながら、言葉での説明を脳が探し求めていたりする感じがあるな。

# 例えば半年とか1年位

ずっとモヤモヤしていて、言語化できずに、ことあるごとに、説明や表現ができないもどかしさに出くわすこともある。

だけど、それが説明できた時と言うのは、本当にすっきりした気持ちになる。

# だけど、説明できなければモヤモヤすると言う現象自体も謎だし。

言語化したらスッキリすると言う謎現象についても、うまく言語化して説明できないし。

やっぱりなんだかんだともどかしい。

# 本当に科学者が数百億の言葉を尽くしてさえ

人間の脳や、自然界の現象や、雨中の仕組みなどとても説明しきれないのだから。

1個の人間が説明できないことがあっても、それは究極に当たり前のことだと言うほかないのかもしれない。

# ところで

そういえばエッセイストにも、とにかく言語化を大事にする人がいる。

昔よく読んでいた中村うさぎ、Twitterではあちゅう、あと臨死江古田ちゃんの作者の人もそんな感じを受ける。気のせいだろうか。

エンジニアは物事の言語化のために、エッセイも読むと良いかもしれない。

「しらんけど」

# エンジニア is me

とにかく僕にとっても、言語化できる、自分で理解納得ができる、それはすごく大事なことみたいだ。

人間と言うものに与えられた言葉という偉大なるギフトを、最大限に生かしつつ、この複雑な世界に立ち向かい、そして戯れ遊びたいものである。

# P.S 尾崎豊の伝説は

かつて尾崎豊は、ティーネージャーの言葉にできないもどかしさについて歌い、叫びそして伝説になった。

この見えない困った感じを、みんなどうにかしたいと薄々感じているんだろう。

もどかしさ代弁サポーター的な職業があって良さそうだ。

いや、それこそ僕らが知るアーティストの本質じゃないか 

https://t.co/yRsVRrWHph

# 言語化したいマン参上！

あ、すいません…iPadProで遊びたくてつい‥。

![image](https://user-images.githubusercontent.com/13635059/51080625-bab10100-1722-11e9-9d58-a1accbeb1481.png)



---

https://twitter.com/yumainaura

https://github.com/YumaInaura/YumaInaura/issues


https://twitter.com/YumaInaura/status/1084249120313729025








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
『機械学習のエッセンス(http://isbn.sbcr.jp/93965/)』のPythonサンプルをJuliaで書き換えてみる。（第04章05NumPy/SciPyによる線形代数）

# はじめに

[『機械学習のエッセンス(http://isbn.sbcr.jp/93965/)』のPythonサンプルをJuliaで書き換えてみる。（第04章04疎行列）](https://qiita.com/yshutaro/items/e0a3a6c9ea84f8ab0fd3)の続きです。

## 逆行列を求める

逆行列は`inv`関数で求めることができます。

```math
\begin{pmatrix}
   3 & 1 & 1 \\
   1 & 2 & 1 \\
   0 & -1 & 1
\end{pmatrix}
```

```julia
julia> a = [3 1 1; 1 2 1; 0 -1 1]
3×3 Array{Int64,2}:
 3   1  1
 1   2  1
 0  -1  1

julia> inv(a)
3×3 Array{Float64,2}:
  0.428571  -0.285714  -0.142857
 -0.142857   0.428571  -0.285714
 -0.142857   0.428571   0.714286
```

## "\"演算子を使う。（1次方程式を解く）

```math
\begin{pmatrix}
   3 & 1 & 1 \\
   1 & 2 & 1 \\
   0 & -1 & 1
\end{pmatrix}
\begin{pmatrix}
  x \\
  y \\
  z
\end{pmatrix}
=
\begin{pmatrix}
  1 \\
  2 \\
  3
\end{pmatrix}
```

Juliaでは`\`（バックスラッシュ）演算子で1次方程式が解けるようです。便利ですね。

```julia
julia> a = [3 1 1; 1 2 1; 0 -1 1]
3×3 Array{Int64,2}:
 3   1  1
 1   2  1
 0  -1  1

julia> b = [1, 2, 3]
3-element Array{Int64,1}:
 1
 2
 3

julia> a \ b
3-element Array{Float64,1}:
 -0.5714285714285714 
 -0.14285714285714302
  2.857142857142857 
```

## LU分解により連立方程式を解く

Juliaには`LinearAlgebra`モジュールに`lu`という関数があります。
https://docs.julialang.org/en/v1/stdlib/LinearAlgebra/index.html#LinearAlgebra.lu
日本語訳はこちら。
https://code.i-harness.com/ja/docs/julia~1.0/stdlib/linearalgebra/index#LinearAlgebra.lu

```julia
julia> using LinearAlgebra

julia> l, u, p = lu(a)
LU{Float64,Array{Float64,2}}
L factor:
3×3 Array{Float64,2}:
 1.0        0.0  0.0
 0.333333   1.0  0.0
 0.0       -0.6  1.0
U factor:
3×3 Array{Float64,2}:
 3.0  1.0      1.0     
 0.0  1.66667  0.666667
 0.0  0.0      1.4  

julia> u \ (l \ b)
3-element Array{Float64,1}:
 -0.5714285714285714
 -0.14285714285714302
  2.857142857142857
```

# 参考

Juliaには`LinearAlgebra.factorize`という関数があって、与えられた行列に対して最適な分解をしてくれるようです。
https://docs.julialang.org/en/v1/stdlib/LinearAlgebra/index.html#LinearAlgebra.factorize
日本語訳はこちら。
https://code.i-harness.com/ja/docs/julia~1.0/stdlib/linearalgebra/index#LinearAlgebra.factorize

上記の`a`に対して`factorize`関数を使ってみるとLU分解してくれました。

```julia
julia> a = [3 1 1; 1 2 1; 0 -1 1]
3×3 Array{Int64,2}:
 3   1  1
 1   2  1
 0  -1  1

julia> using LinearAlgebra

julia> factorize(a)
LU{Float64,Array{Float64,2}}
L factor:
3×3 Array{Float64,2}:
 1.0        0.0  0.0
 0.333333   1.0  0.0
 0.0       -0.6  1.0
U factor:
3×3 Array{Float64,2}:
 3.0  1.0      1.0     
 0.0  1.66667  0.666667
 0.0  0.0      1.4  
```
【WordPress】Gutenbergのブロック一覧

説明は気が向いたら更新します。

## インライン要素

- インライン画像

## 一般ブロック

- 段落：ブロックを使って、いろいろな物語を組み立ててください。（特殊文字を入れるボタンはない）
- ファイル：ファイルをダウンロードするリンクを追加します。（埋め込み用じゃなくて、ダウンロード用。）
- 画像：画像を挿入し、視覚に訴えます。（１枚ずつ貼りたいとき用。ギャラリーとかカバー画像は別途ある）
- 見出し：新しいセクションを紹介しコンテンツを整理することで、ビジター (と検索エンジン) のコンテンツ構造理解の手助けをしましょう。
- ギャラリー：リッチギャラリーに複数の画像を表示します。
- リスト：番号なし、または番号付きのリストを作成します。
- 引用：引用テキストを視覚的に強調します。「他者の引用は、我々自身への引用である」—フリオ・コルタサル
- 音声：シンプルな音声プレイヤーを埋め込みます。（シンプルにmp3などをURL指定orアップロードする場合。サービスの場合は埋め込みを使う）
- カバー：テキストオーバーレイを含む画像または動画を追加します。ヘッダーに最適です。
- 動画：メディアライブラリから動画を埋め込むか、新しい動画をアップロードしてください。（サービスの場合は埋め込みを使う）

## フォーマット

- 詩：詩を挿入します。特別な余白形式を使ったり、歌詞を引用したりできます。
- ソースコード：余白やタグを考慮したコードスニペットを表示します。
- クラシック：従来の WordPress エディターを使用します。
- カスタム HTML：カスタム HTML コードを追加します。編集しながらプレビューが可能です。（旧エディタで複雑なHTMLを入れているとこれになる）
- 整形済み：スペースやタブを含むテキストを追加し、スタイリングして表示します。
- プルクオート：テキストの引用に特別な視覚的強調を加えます。
- テーブル：表の挿入。チャートとデータの共有に最適です。

## レイアウト要素

- 改ページ：コンテンツを複数のページに分けて表示します。
- ボタン：カスタムボタンで読者にアクションを促しましょう。
- カラム：複数カラム表示のブロックを追加して、お好みのブロックを配置してください。
- メディアと文章：画像と文章を横並びのリッチなレイアウトにします。
- 続きを読む：コンテンツの抜粋を指定します。指定したブロックの前のコンテンツがアーカイブページで抜粋として表示されます。
- 区切り：水平の区切りを使って、アイデアやセクションの間で改行します。
- スペーサー：ブロックの間に、高さをカスタマイズ可能な余白を追加します。


## ウィジェット

- ショートコード
- アーカイブ
- カテゴリー
- 最新のコメント
- 最新の記事


## 埋め込み

- Twitter
- YouTube
- Facebook
- Instagram
- WordPress
- SoundCloud
- Spotify
- Flickr
- Vimeo
- Animoto
- Cloudup
- CollegeHumor
- Dailymotion
- Funny or Die
- Hulu
- Imgur
- Issuu
- Kickstarter
- Meetup.com
- Mixcloud
- Photobucket
- Polldaddy
- Reddit
- ReverbNation
- Screencast
- Scribd
- Slideshare
- SmugMug
- Speaker Deck
- TED
- Tumblr
- VideoPress
- WordPress.tv
エンジニアの勉強に疲れた？ とても眠いときのカフェでの過ごし方。マインドフルネスのテクニック。

エンジニアの勉強に疲れた？ とても眠いときのカフェでの過ごし方。マインドフルネスのテクニック。

![image](https://user-images.githubusercontent.com/13635059/51080574-c7812500-1721-11e9-9f49-957cc9cd7d8e.png)

目は閉じるか、半分だけ閉じて、店の中のざわめきに脳や体を委ねるイメージ。

体の中で猛烈な勢いで回っている、思考スピードのようなものを感じ取って、スローダウンする。 


# マインドフルネスの技術ではとにかく呼吸が大事だ。

自分の中に生き物がいるとイメージして、そいつが呼吸するの優しく見守る。

生き物の呼吸を妨げているのに気づいたら、その生き物の自然な波に、優しく乗り直す。

# 呼吸と言う人間の自然なもの。

視覚情報と言う人間のエネルギーを大きく使うもの。

後は、音の感受性に働きかけることで、自分の肉体の癒しを最大化するイメージだ。癒しを最大化するイメージだ。

あたたかな海に揺らめく、クラゲのように、自分の生体反応を感じとってみる。

もしかしたらスピリチュアルに聞こえるかもしれないが、人間の治癒能力と言うものは、実はコントロールできるらしい。

これは実験によって明らかということだ。

# ヨガの達人は、自律神経にさえダイレクトに働きかけることができるらしいぞ。

瞑想の達人は、脳の幸福度を司る神経のようなものが、ものすごく発達していて、MRIか何かでその尋常じゃない脳波が測定されたらしい。

マインドフルネスは人間に必要なもののすべてを備えている気がするな。 


---

https://twitter.com/yumainaura

https://github.com/YumaInaura/YumaInaura/issues

https://twitter.com/YumaInaura/status/1084263025828257792/photo/1








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Azure IoT EdgeのedgeHubでUnable to start Kestrel

Azure IoT EdgeのedgeHubで、`Unable to start Kestrel`エラーが発生したときの対処方法。

# 事象

edgeHubモジュールを起動直後、止まってしまう。  
`iotedge logs edgeHub`コマンドでログを確認すると、`Unable to start Kestrel`エラーと共に、`System.Net.Sockets.SocketException (13): Permission denied`が発生している。

```
2018-12-29 06:10:47.175 +00:00 [FTL] - Unable to start Kestrel.
System.Net.Sockets.SocketException (13): Permission denied
   at System.Net.Sockets.Socket.UpdateStatusAfterSocketErrorAndThrowException(SocketError error, String callerName)
   at System.Net.Sockets.Socket.DoBind(EndPoint endPointSnapshot, SocketAddress socketAddress)
   at System.Net.Sockets.Socket.Bind(EndPoint localEP)
   at Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.SocketTransport.BindAsync()
   at Microsoft.AspNetCore.Server.Kestrel.Core.KestrelServer.<>c__DisplayClass22_0`1.<<StartAsync>g__OnBind|0>d.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.AddressBinder.BindEndpointAsync(ListenOptions endpoint, AddressBindContext context)
   at Microsoft.AspNetCore.Server.Kestrel.Core.ListenOptions.BindAsync(AddressBindContext context)
   at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.AddressBinder.EndpointsStrategy.BindAsync(AddressBindContext context)
   at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.AddressBinder.BindAsync(IServerAddressesFeature addresses, KestrelServerOptions serverOptions, ILogger logger, Func`2 createBinding)
   at Microsoft.AspNetCore.Server.Kestrel.Core.KestrelServer.StartAsync[TContext](IHttpApplication`1 application, CancellationToken cancellationToken)
2018-12-29 06:10:47.314 +00:00 [INF] - Stopping
```

> わたしは、TinkerOS v2.0.8 (Debian stretch based)で発生しました。←このOSはAzure IoT Edgeで[サポート](https://docs.microsoft.com/ja-jp/azure/iot-edge/support#operating-systems)されていません。

# 原因

ファイルシステムが`CAP_NET_BIND_SERVICE`に対応していないため、Http Server(Kestrel)の起動に失敗している。

# 回避方法

Http Serverを無効にする。

> 無効にすると、HTTPプロトコルに応答しなくなります。Transparent Gatewayなど、ゲートウェイ用途で使おうとしているときは、AMQPやMQTTで接続するようにしましょう。

## 設定方法

Azure Portalで対象のIoT Edgeデバイスを選択して、`モジュールの設定`にある`Edgeランタイムの詳細設定を構成する`をクリックし、Edge Hubの環境変数に名前：`httpSettings__enabled`、値：`false`を追加してください。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/109634/98ddad94-a015-4d41-cd41-ae647b75e39d.png)

# 参考

* [edgeHub System.Net.Sockets.SocketException (13): Permission denied](https://github.com/Azure/iotedge/issues/671)
* [Microsoft.Azure.Devices.Edge.Hub.Service](https://github.com/Azure/iotedge/blob/master/edge-hub/src/Microsoft.Azure.Devices.Edge.Hub.Service/Program.cs#L132)
* [Azure IoT Edge のサポートされるシステム](https://docs.microsoft.com/ja-jp/azure/iot-edge/support#operating-systems)
眠れない夜のために〜延々と２の冪乗を表示し続けるプログラム〜two〜

common lisp で書かれています。
ubuntuでの、CLISPのインストール方法は以下の通り。

```
sudo apt-get install clisp
```
TWO：コード

```
(defun two () (do ((i 1 (* i 2))) (() ()) (format t "~A ~%" i)))
```
python版

```two.py
#!/usr/bin/python3
i=1
while True:
  i=i*2
  print(i)
```
str.rstrip()での文字列削除での注意点 ~python学習1.04~

#str.rstrip()とは
文字列を右(末尾)から、引数に指定された文字、あるいは文字列がないか探して除去する関数である。
以下に例を示す。

```qiita1.py
>>> x = 'Don\'t say "lazy"'
>>> x = x.rstrip('"lazy"')
>>> print(x)
Don't say 
```
x.rstrip()は、xから引数に該当する文字列を除去した結果(str型)を返却するため、返り値を受け取らないと除去した値を扱うことができない。
これは、str型がimmutableであることに起因するだろう。

##注意点とは
引数に含まれる文字が除去の対象となることである。
もう少し具体的に言うと、'"lazy"' が仮引数に与えられた場合、
'"lazy"' の連続した文字列を除去するのではなく、'y"' や 'zy"', 'az' など部分的な文字であっても除去してしまう。
ただし、~~文字列の末尾が引数の文字列の末尾と一致していない場合や、~~ 引数に含まれない文字が現れた場合、
そこで評価は終了し値が返される。
具体例を以下に示す。

```qiita2.py
>>> x = 'Don\'t say "lazy"'
>>> print(x.rstrip(" \"lazy\""))
Don't s
>>> print(x.rstrip("lazy"))
Don't say "lazy"
```
1つ目のrstrip()について、qiita1.pyとの違いは空白文字が追加されている。
~~2つ目のrstrip()について、末尾が違うため除去されずに値が返されている。~~

##おわりに
Don't say "lazy"というわかりにくい文字列で書いてたいへん恐縮だが、
文字列内に " と ' が含まれているため、文字列の勉強にはおススメである。

##開発環境
Windows10 64bit
Python 3.7.1
PyCharm 2018.3.2


##参考資料
学習に用いているものとして、以下の２つがメインです。
・[詳細! Python 3 入門ノート](https://www.amazon.co.jp/%E8%A9%B3%E7%B4%B0-Python-%E5%85%A5%E9%96%80%E3%83%8E%E3%83%BC%E3%83%88-%E5%A4%A7%E9%87%8D-%E7%BE%8E%E5%B9%B8/dp/4800711673/ref=sr_1_1?ie=UTF8&qid=1546995770&sr=8-1&keywords=%E8%A9%B3%E7%B4%B0%21Python3%E5%85%A5%E9%96%80%E3%83%8E%E3%83%BC%E3%83%88)
・[Python公式ドキュメント](https://docs.python.jp/3/tutorial/index.html)
PDF の回転を削除する

PDF ファイルの Page rot を 0 にする方法です。

```bash:pdf_rot_omit.sh
#
TMP_PS="/tmp/tmp001.ps"
pdf2ps $1 $TMP_PS
ps2pdf $TMP_PS $2
#
```

実行方法

```bash
./pdf_rot_omit.sh in01.pdf out01.pdf
```

入力ファイルの情報

```text
$ pdfinfo in01.pdf
（省略）
Page size:      842 x 1191 pts (A3)
Page rot:       90
（省略）
```

出力ファイルの情報

```text
$ pdfinfo out01.pdf
（省略）
Page size:      1191 x 842 pts (A3)
Page rot:       0
（省略）
```

この手法は、codec の問題を回避するにも使えます。
下記のようなエラーが出た時です。
既存のファイルに加筆する時などに、このようなエラーが出たら、元ファイルを変換して問題を回避できます。

```text
'charmap' codec can't encode characters in position 1-12: character maps to <undefined>
```
アセンブラで「Happy New Year!!」

# アセンブラで「Happy New Year!!」

## 背景
ずっとアセンブリ言語（以降、アセンブラと表記）を書いてみたかったのですが、なかなか踏み出せずにいました。今年最初の投稿はアセンブラで「Happy New Year!!」を出力したいと思います。

## アセンブリ

## 環境
* カーネル(Windows Subsystem for Linux)

```
$ uname -a
Linux DESKTOP 4.4.0-17134-Microsoft #523-Microsoft Mon Dec 31 17:49:00 PST 2018 x86_64 x86_64 x86_64 GNU/Linux
```

* CPU

```
$ lshw -class processor
  *-cpu
       product: Intel(R) Core(TM) i5-7200U CPU @ 2.50GHz
       vendor: Intel Corp.
       physical id: 1
       bus info: cpu@0
       capacity: 2712MHz
       width: 64 bits
```

* NASM

```
$ nasm -v
NASM version 2.13.02
```

* リンカ

```
$ ld -v
GNU ld (GNU Binutils for Ubuntu) 2.30
```

## NASMのインストール

```
$ sudo apt-get install nasm
```

### NASMとは
https://ja.wikipedia.org/wiki/Netwide_Assembler

## リンカのインストール

```
$ sudo apt install binutils
```

### リンカとは
http://e-words.jp/w/%E3%83%AA%E3%83%B3%E3%82%AB.html


## プログラム

``` new_year.asm
bits 64
section .text
global _start

_start:
        xor     eax, eax
        mov     edx, eax
        inc     eax         ; sys_write (01)
        mov     edi, eax    ; stdout    (01)
        mov     dl, len     ; length    (13)
        mov     rsi, msg    ; address
        syscall
        xor     edi, edi    ; return 0
        mov     eax, edi
        mov     al, 60      ; sys_exit
        syscall

section .data
        msg     db      'Happy New Year!!', 0x0A
        len     equ     $ - msg

```

簡単な解説（正しくないかもしれません、ご了承ください）
* `section .data`が初期値を持つ変数を格納するセクション
* `section .text`が機械語の部分を格納するためのセクション


### 実行
```
$ nasm -f elf64 new_year.asm
$ ld -s -o a.out new_year.o
$ ./a.out
Happy New Year!!
```

## 所感
* 今まで、JavaやRubyといった言語しか触れたことがないので、勝手が全くわからず苦戦した。
* 自分の書いているプログラムが、実はこういったプロセスを経て動いていることを学ぶことができた。
* 64bit CPUのレジストリの使い方について、簡単にではあるが理解できた。
* なぜこんなことをしているのか、時々わからなくなった笑
* 今度はLinuxのカーネルを読んでみたいな（まだまだ先は長そう。。。）


## 参考記事
### Qiitaの記事
* https://qiita.com/0gajun/items/e772e1223f6e596eb362
* https://qiita.com/edo_m18/items/83c63cd69f119d0b9831
* https://qiita.com/h2suzuki/items/c2b0b51abb252155db2f
たとえばTwitterではユーザーアーデンティティを固定させないために、簡単なプロフィール更新のUIが用意されていてほしい

たとえばTwitterではユーザーアーデンティティを固定させないために、簡単なプロフィール更新のUIが用意されていてほしい

TwitterやQiitaなどのSNSのプロフィールも固定せずに、動的に動かしていったほうが良い、リファクタリングが必要だ

![image](https://user-images.githubusercontent.com/13635059/51079873-55094880-1713-11e9-8880-9f24cc89b8bb.png)

ふと自分のプロフィールがポップで浮かび上がったときに、違和感を感じるようであれば、それは今の自分の脳の状態と、過去に書いたプロフィール文が噛み合っていないということなのかもしれない。

サービス的な目線でいうと、固定度の低い、Twitterのような流動性の高いサービスであればあるほど、プロフィールは更新しやすいようにしておいたほうが良いと思う。

人間そのものが流動的であるように、ユーザーのアイデンティティも決して1日たりとも固定されるものではない。アイデンティティを固定させないためも、ふれきしぶる！なプロフィール変更のためのインターフェイスが必要だ。



---

https://twitter.com/yumainaura

https://github.com/YumaInaura/YumaInaura/issues









<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Dockerのイメージのビルド時にMavenの依存ライブラリをキャッシュさせたい

参考にしました： https://whitfin.io/speeding-up-maven-docker-builds/

実行時(docker run)ではなくイメージのビルド時(docker build)の話です。

行きついた答えは以下です。

``` Dockerfile:Dockerfile
# pom.xmlをコピーする（pom.xmlが変化した場合は再ビルドを許容する）
COPY /path/to/pom.xml pom.xml

# プロジェクトの依存関係とMaven pluginの依存関係も含める場合は、実際に使うゴールを書く。
# cleanは最後に持ってくると、成果物を消してくれるので無駄が減ってより良い
RUN mvn package clean

# プロジェクトの依存関係だけであればこっちでよい
RUN mvn dependency:go-offline

# 以降は普通のbuild or run用のコマンドが続く...
```

`dependency:go-offline`はプロジェクトの依存関係を見てくれるが、**ゴールの実行に必要なプラグインの依存関係**までは見てくれない。
これはゴール実行時でないとわからないようなので、ゴールを書いている。

他にやり方無いんか？というと、実行時ならボリュームをマウントする方法が使える。
しかしコンテナで動くCIサービスにはマウントできる永続ボリュームが無いため毎回使い捨てることになる。
そうなるとMavenのキャッシュの仕組みが機能しなくなってしまうので、コードを1行直すだけなのに、毎回プラグインや依存ライブラリのダウンロードを行ってしまい、反映に時間がかかり辛くなる。
なので、イメージに含めてしまおうという考え。ビルド用のイメージならサイズが大きくても多少はよいので。

あと、ゴールによっては失敗する可能性もある。そのときは失敗を無視する`--fail-never`オプションが使えるかもしれない。
初心者の技術書との向き合い方

#前置き
新しい言語やスキルを学びたいと思ったけど、わかりやすいと評判の学習書を読んで挫折したこと、ありませんか？

「入門/よくわかる/初心者のための/たのしい/○○でもわかる！」なんて書いてたのになんで理解できないんだろう…。
自分へのアウトプットと、同じ経験をしている人になにか残せたらと自分なりの向き合い方を考えてみました。


##いまのぼく
前々から興味があった言語について。
新しく学習したいと技術書を買ったのですが、早くも挫折しそうです。

私も一応技術者の端くれ。
今メインで使っている言語に関しても似たような経験があったなぁと考えたとき、
何故か技術とは直接関係のない学生時代を思い出した。

##唐突な自分語り
中学生の頃、英語が好きだった
1つ1つ新しい表現を知ることが楽しくて仕方がなかった

高校に入り、いざスキルアップと考えたが授業内容で躓いた。
「これは関係代名詞だけど、こっちは関係副詞だね」
「時制の一致を用いればここに入る単語は過去形になるよね」
英語を知りたいだけなのにまず「言葉の定義」を覚える事に違和感を感じた
好きだったはずの英語が苦手になった

##おそらく今同じことが起こっている！
たとえば「I have a pen.」の意味として、
**「私 + 持っている + 1個 + ペン + 。」**と教えるのか
**「一人称の人称代名詞 + 動詞 + 不定冠詞 + 名詞 + 終止符」**を説明するのか。

どちらも正しいけど、たぶんここが初心者にとっての壁なんだろうと思った。

例えば以下の説明があったとする。

> オブジェクトは「もの」、メソッドは「オブジェクトに対しての操作を決めている仕組み」です。クラスは「設計書」のオブジェクト、インスタンスは「クラスを基にできあがった」オブジェクトです。
> そして、クラスオブジェクト内からメソッドを実行してインスタンスオブジェクトを生成する方法はクラスメソッドで、新しいインスタンスオブジェクトからクラスオブジェクト内のメソッドを参照・実行してインスタンスオブジェクトを生成する方法はインスタンスメソッドと言います。

うん、慣れ親しんでいない人にとってはだいぶイメージがつきにくい。
※ちなみに僕なりの解釈をざっくりまとめただけなので間違っていたらすみません。。

##初学者のアプローチ
思うに「初心者」と呼ばれる人には2種類いると思う

####ざっくり全体像を把握したいひと
- 目的はないが、興味がある人
- 目的があるがまずは簡単なものから動かしてみたい人
- スキルの1つとしてとりあえず学びたい人（引き出しを増やしておきたい人）

etc

####正しく理解したいひと
- 目的がハッキリしていて、且つモチベーションが高い人
- 改めて基礎を学びたい人（独学でかじったレベルの人）

etc

僕含め、多分挫折する人は1の括りが多いんじゃないかな？
2の人に関してはおそらく学習スピードが早いと思われる。ただしモチベーション維持が難しい。

##初心者向けの本
そして、所謂「初心者向け」と呼ばれる学習書も2種類あるという事になる。

1. 全体像を把握するための本
2. 正しく理解するための本

**「ざっくり全体像を把握したい人」が「正しく理解するための本」を読んでるのが、苦しむ原因なんじゃないかな。**

もちろん、世の中のそういう書籍が駄作かと言えばそんな事はない。
ただ、「初心者」という目線が何を指すのかにもよるんだろうとは思う。

僕が言いたいのはどちらのタイプや本が良いかという話ではなく、
それぞれのタイミングで自分のタイプの学習書を選ぶことが大事ということ。
いずれにしても、興味や関心を行動に移そうとする時点で尊いはず。

なので、技術書は人やネットでオススメのものを買うより、
実際に見て合う合わないを判断したほうがいいと言う事です。

当たり前の事かもですが、それに気づかない間は結構辛い。

##僕なりの結論
今まで

興味を持つ
↓
初心者向けの技術書を探して買う
↓
読む
↓
正しく理解しようとする
↓
全然簡単じゃない
↓
辛い
↓
挫折

みたいな事がよくあって、そのたびに

**・向いてないんじゃないか**
**・やる気が足りないのかな**
**・理解力がないのかな**

なんて思っていたけど、スキルパスの向き合い方を変えるだけで解決しそう。

個人差があるので一概には言えないが、僕の目指す方向としては

1. **「ざっくり全体像を把握」してみる**
2. **何でもいいからとりあえずアウトプットしてみる（デタラメでも最悪動けばいいの精神）**
3. **自分の中で1と2のトライ＆エラーを繰り返す**
4. **「正しく理解」する事を目的にする**

中級者になるためにはどちらの視点も必要にはなってくる。
`pen I a have.`でも意味は通じるかもしれない。**でも正しくはない。**

---

そんな訳で今までの自分をアウトプットしてみる（物理的に）

```ruby:readbook.rb
def read
	##元の興味・やる気（単位は不明）
	motivation = 10
	#読んだページ数
	page = 1

	#本を読み続ける
	loop do
		#読む
		puts "本を#{page}ページ読んだけど"
		#辛さを味わう
		puts "全然簡単じゃなくない？"
		puts "辛い・・・"
		#読んだページ数は増える
		page += 1
		#やる気が削がれる
		motivation -= 1
		puts "（モチベーションが#{motivation}になった！）"

		#モチベーションが保てなくなった場合
		if motivation <= 0
			#挫折
			puts "もうダメだ・・・"
			puts "～ 挫 折 ～"
			#終了
			break;
		end
	end
end

read()
```
申し訳程度のソースコード、且つ稚拙ですが今の自分にとって動けばいいかな。。


##まとめると
**「初心者向けで分かりやすい」と言われた本を理解できなかったのは決してあなたのせいではなく
ただ単純に"今の"自分にとって分かりにくいものを選んだだけ。**
凹む事は何一つない。

とりあえず自戒を込めてアウトプット。
**願わくば、あなたの「好き」や「知りたい」が苦しみとならないように。**
webpack + awesome-typescript-loader + react で開発環境を用意する


※　この資料書いたときには awesome-typescript-loader 悪くないじゃんと思っていたんですが、2019年現在 ts-loaderです。

---
`awesome-typescript-loader` は [Typescript 公式でも説明されている](http://www.typescriptlang.org/docs/handbook/react-&-webpack.html)ので採用。

タイトル通りのメモ。手軽に。

## セットアップ

```sh
npm init -y
npm install --save react react-dom @types/react @types/react-dom
npm install --save-dev webpack webpack-dev-server webpack-cli
npm install --save-dev typescript awesome-typescript-loader source-map-loader
npm install --save-dev html-webpack-plugin
```
## tsconfig.json

生成して

```sh
npx tsc --init
```

編集する

```json
...

   "jsx": "react"

...
```


## webpack.config.js

```js
const path = require("path");
const HtmlWebpackPlugin = require("html-webpack-plugin");
const { CheckerPlugin } = require("awesome-typescript-loader");

module.exports = {
  entry: "./src/index.tsx",
  output: {
    filename: "bundle.js",
    path: __dirname + "/dist"
  },
  devtool: "source-map",
  resolve: {
    extensions: [".ts", ".tsx", ".js", ".json"]
  },

  module: {
    rules: [
      { test: /\.tsx?$/, loader: "awesome-typescript-loader" },
      { enforce: "pre", test: /\.js$/, loader: "source-map-loader" }
    ]
  },
  devServer: {
    contentBase: path.join(__dirname, "public"),
    watchContentBase: true,
    open: true
  },
  optimization: {
    splitChunks: {
      chunks: "all"
    }
  },
  plugins: [
    new CheckerPlugin(),
    new HtmlWebpackPlugin({ template: "src/index.html" })
  ]
};
```

## src/index.tsx

```tsx
import * as React from "react";
import * as ReactDOM from "react-dom";

type Props = {
  greeting: string;
};

const Hello = (props: Props) => {
  return <h1>{props.greeting}</h1>;
};

ReactDOM.render(
  <Hello greeting="Hello World" />,
  document.querySelector("#content")
);
```

## src/index.html

```html
<div id="content"/>
```

## package.json

```json
{
  ... 

  "scripts": {
    "start": "webpack-dev-server --mode development",
    ...
  }

  ...
}
```

## 所感

es6 + babel + flowtype の環境よりビルドと型チェックが全体的に高速だったのが好印象でした。最近 flow がよく刺さるので typescript で安定かなぁという気分。