OmniAICreator/Qiita-1.07M huggingface dataset:
Electronでデスクトップに浜風ちゃんを召喚した

#Electron
Electronというjs,htmlで簡単にデスクトップアプリを作れるパッケージを見つけたので使ってみた。
公式：https://electronjs.org/
<img width="838" alt="スクリーンショット 2017-12-31 16.08.11.png" src="https://qiita-image-store.s3.amazonaws.com/0/201127/c9c7076c-e0c3-4985-a87a-a430179f98c7.png">

※node.jsが必要なのでインストールしておいてください。

```
electronをインストール
$ npm -g install electron-prebuilt

アプリ用ディレクトリを作成
$ mkdir electron
$ cd electron

package.jsonを生成
$ npm init -y
```

導入はこちらの記事を参考にした。
https://qiita.com/Quramy/items/a4be32769366cfe55778

まずはHelloWorldを表示してみる。

```
アプリのディレクトリで
$ electron .
```

<img width="723" alt="スクリーンショット 2017-12-31 16.18.26.png" src="https://qiita-image-store.s3.amazonaws.com/0/201127/592fa3ba-f694-ce6a-895e-d1f262129a6f.png">

ウィンドウを透明にするには以下の処理をかく。

```
mainWindow = new BrowserWindow({
width: 100, 横幅
height: 100, 縦幅
transparent: true, 透明
frame: false}); フレームを表示するか
```

<img width="693" alt="スクリーンショット 2017-12-31 16.22.12.png" src="https://qiita-image-store.s3.amazonaws.com/0/201127/13801a4e-a7a3-e879-c11c-3d677b266682.png">

透明になりました。


あとはhelloworldの文字を画像に置き換えるだけ。

##以上！
超適当な記事ですが参考になればと思います。
浮動小数点っていったい何なのか具体的に説明

## コンピュータからみた桁数が大きい数字

- 0.0000000000000000000000000000000000000001111
- 111100000000000000000000000000000000000000000

とかはコンピュータにとって非常にだるい。
桁数が大きいからコンピュータとはいえ計算が大変です。

## 浮動小数点とは

ここで活躍するのが浮動小数点です。
上の2つの数字を下記のように変換させます。

- $1.111×10^{-46}$
- $1.111×10^{46}$

※`46`剰という数字は桁数よみまちがえてるかも。。

こうすることで桁数が少なくなってコンピュータにとっても計算がスマートになります。
これを`浮動小数点`とよぶ。

32ビット浮動小数点とか64ビット浮動小数点があるが、64ビットの方が浮動小数点化したうえでもより大きな桁数を扱えます。
Netlify で Lamdba function を Deploy する


まだ alpha 版の機能です。Document は以下にあります。

https://functions-alpha--www.netlify.com/docs/lambda-functions/#configuring-the-functions-folder

## サンプル構成の作成

````
$ mkdir netlam
$ npm init 
$ npm i babel-core babel-loader netlify-lambda
````

babel 関連ライブラリが必要なのはバグかなにかか。後で修正されると思う。

`netlify-lamdba` は netlify で Lamdba デプロイ時にビルドしたり ローカルでエミュレートしたりしてくれる便利なコマンドです。

とりあえず以下のような構成でファイルを配置してみる。

````
├── README.md
├── netlify.toml
├── package.json
├── public
│   └── index.html
└── src
    ├── fuga.js
    └── hello.js

````

public は netlify 静的サイトホスティングで必要な構成です。とりあえずindex.html をUPしておく。

netlify.toml には以下のような形で Lamdba ビルド構成を記述していく。

````
[build]
  Command = "npm run build"
  functions = "functions"
  publish = "public"
````

functions には lamdba配信用のスクリプトがあるフォルダ名を記述。ここで指定したフォルダ名はビルド時に自動的に生成されるので存在しなくてOK

src/hello.js にはLamdba 用のスクリプトを記述

````
exports.handler = function(event, context, callback) {
  callback(null, {
    statusCode: 200,
    body: "Hello, World"
  });
}
````

最後にビルド用のコマンドを package.json に

````
{
  ....
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "build": "netlify-lambda build src"
  },
  ....
}
````

`netlify-lambda build src` は srcをコンパイルして、netlify.toml で指定したディレクトリに展開してくれるコマンド

この状態で `netlify-lambda serve src` コマンドを叩いて、エミュレートサーバをローカルで建てたれる。

## Deploy

デプロイ時のビルドコマンドは指定しなくてOK

無事にUPされると、Netlify のメニューの functions タブに、配信されている API の一覧と エントリURLが表示される。

console.logや実行された履歴などがログで見れるようになっていて結構便利
シグモイド関数で重要なのは難しい式ではなく、グラフの形なのです

## シグモイド関数の見た目

以下のような関数のことです。

[![https://gyazo.com/fbe29acd64670ee27280d6e5bc2d79ba](https://i.gyazo.com/fbe29acd64670ee27280d6e5bc2d79ba.png)](https://gyazo.com/fbe29acd64670ee27280d6e5bc2d79ba)

## シグモイド関数の数式

数式だと以下です。

$y=\dfrac {1}{1+e^{-ax}}\left( a >0\right)$

簡略化して下記のように表現されたりします。

$y=\sigma \left( x\right)$

※$\sigma$は`シグマ`と読みます。

## シグモイド関数で重要なのは難しい式ではなく、グラフの形なのです

重要なのはグラフの形です。

- `x=0`周辺で`y`がグーンと上がっている
- 滑らかな線である

上記2つの特徴があります。

機械学習の分類という領域では結果が`Yes`か`No`かを求められることがあります。
つまり`x=0`周辺以外は大体`y=0`か`y=1`という性質がとても使いやすいのです。

また機械学習では微分を多用します。
滑らかな線でないと微分が数学的に面倒になってしまいます。

つまり、`シグモイド関数`は機械学習にとって都合の良い関数なのです。
目的関数、コスト関数、誤差関数、損失関数いろいろあるけど、なにが違うのかを検討

機械学習勉強でよーわからん単語、ややこしかった〇〇関数に関して調べました。

## 前置き

例えば`駅からの距離`、`部屋の広さ`、`築年数`から`家賃`を予測する機械学習を実装する流れは、

1. 大量の`駅からの距離`、`部屋の広さ`、`築年数`、`家賃`のデータを集める
2. 大量のデータから、法則（`家賃`の計算式）を導く

です。
しかしながら、`導かれる計算式の結果`と`家賃`には`差`が存在します。
（すべて計算式で1円たりとも違わずに表現できるはずがない）

この`差`が小さくなるように、計算式を考えていくことが機械学習の研究者たちのやるべきことでもあるのです。

この`差`を関数（なんらかの数式）で表現したものを`目的関数`といったり、`コスト関数`といったり、`誤差関数`といったり、`損失関数`といったりします。

## 目的関数、コスト関数、誤差関数、損失関数、なにがどう違うのか？

これは様々な議論がなされている。

https://www.quora.com/What-is-the-difference-between-a-cost-function-and-a-loss-function-in-machine-learning
https://stats.stackexchange.com/questions/179026/objective-function-cost-function-loss-function-are-they-the-same-thing

全部英語だったのでGoogle翻訳で私なりに理解した結果、以下のようになった。

### 損失関数 + 正則化項 = コスト関数

`損失関数`に`正則化項`をプラスしたものが`コスト関数`です。
※補足ですが、`正則化`とは過学習を防ぐための調整です。

### 損失関数 = 誤差関数

`損失関数`は`誤差関数`と同義です。

### 目的関数 ⊃ コスト関数、誤差関数、損失関数

`目的関数`が最も大きな枠組みです。
つまり、`コスト関数`も`誤差関数`も`損失関数`も、`目的関数`です。

`差`を小さくすべき目的があれば、小さくすべきですが、場合によっては最大化させないといけない時もあります。

つまり、機械学習において、`この関数を最小化させればモデルが導き出せる！`とか`この関数を最大化させればモデルが導き出せる！`といったなかで、`この関数`に当たるものが`目的関数`なのです。

## その他
### 目的関数、コスト関数、誤差関数、損失関数の英語

- 目的関数 objective function
- コスト関数 cost function
- 誤差関数 error function
- 損失関数 loss function

### 但し書

ただ、意見が分かれているので、各参考文献や教科書など、数式を見て判断るのがよさそうです。

まあ、私レベルであれば全部なんとなく一緒とおもっていても大丈夫そうです！
勾配降下法と誤差逆伝播法を簡単に説明！

## 勾配降下法

### いろいろな呼び名

まずは言葉のいろいろな言い方として、

- 勾配降下法(こうばいこうかほう)
- GradientDiscent(グラディエントディセントン)

と呼ばれたりします。
ここでは`勾配降下法`と呼ぶことにします。

### 機械学習における勾配降下法

機械学習では、`モデル(集めたデータから導き出した方程式みたいなもの)から求める予測値`と`集めたデータの実際の答え`の差分が最小になるように`モデル`を考えます。

したがって機械学習では、この差分(`目的関数`と呼ぶ)の最小を求めるといった手順が存在します。

この最小を求める方法のひとつが`勾配降下法`なのです。

### 勾配降下法ってどういう感じ？

仮に`目的関数`を$f\left( x\right)$と仮定して、どのような方法かというと、

1. `目的関数`上のどこかの1点をランダムで決める。どこでもOK。
2. その点の傾きが`負`であれば$x$を特定量(`ステップ幅`と呼んだりします)分増やす、傾きが`正`であれば$x$を特定量分減らす。ステップ幅は自分で決めることができます。
3. 増やされた、もしくは減らされた先での$x$での傾きが`負`であれば$x$を特定量分増やす、傾きが`正`であれば$x$を特定量減らす。
4. これの繰り返し(繰り返しの回数を`エポック数`と呼びます)
5. 複数回実行した結果の$x$に対する$f\left( x\right)$が誤差関数の最小値となる。

[![https://gyazo.com/d401ad252c3e6f603deff44a66888796](https://i.gyazo.com/d401ad252c3e6f603deff44a66888796.png)](https://gyazo.com/d401ad252c3e6f603deff44a66888796)

## 誤差逆伝播法

### いろいろな呼び名

まずは言葉のいろいろな言い方として、

- 誤差逆伝播法(ごさぎゃくでんぱほう)
- backpropagation(バックプロパゲーション)

と呼ばれたりします。
ここでは`誤差逆伝播法`と呼ぶことにします。

### 機械学習における誤差逆伝播法

勾配降下法と同様、`目的関数`の最小を求める方法のひとつです。

家賃を推測するモデルで、各要素として、`駅からの距離`、`部屋数`、`築年数`、・・・みたいな感じで、
テータ項目が非常に多い場合($x_{1},x_{2},x_{3}\ldots$のような場合)に`勾配降下法`よりも効果を発揮します。

### 具体的に勾配降下法と何が違うの？

最小を求めるポイントは微分なのですが、
$$y=w_{1}x_{1}+w_{2}x_{2}+w_{3}x_{3}\ldots$$
のような微分の場合、各$x_{i}$で微分しなければいけないので、計算が複雑になります。

そのような時、勾配降下法だと計算が複雑になり、計算コストが高くなってしまいます。
一方`誤差逆伝播法`では以下のように微分の分割の公式を利用します。

$$\dfrac {dy}{dx}=\dfrac {dy}{df}\cdot \dfrac {df}{dx}$$

何が言いたいかというと、一気に微分するのではなく、一つの要素ごとに順に微分していくというイメージです。
openFrameWorksのOSC

#はじめに
openFrameworksでOSC使う時用のメモ

#ofApp.h
1. addonを読み込む
2. 送信と受信用のインスタンスを用意
3. 送受信用の関数を用意

```c++
#pragma once
#include "ofxOsc.h"
class ofApp : public ofBaseApp{

	public:
		void setup();
		void update();
		void draw();

		void keyPressed(int key);
		void keyReleased(int key);
		void mouseMoved(int x, int y );
		void mouseDragged(int x, int y, int button);
		void mousePressed(int x, int y, int button);
		void mouseReleased(int x, int y, int button);
		void mouseEntered(int x, int y);
		void mouseExited(int x, int y);
		void windowResized(int w, int h);
		void dragEvent(ofDragInfo dragInfo);
		void gotMessage(ofMessage msg);

//ここから下〜〜
    ofxOscSender sender;
    ofxOscReceiver	receiver;

    void OSCsender(string message,int value);
    void OSCrecv();

````

#ofApp.cpp
1. 送受信するためのアドレスとポート番号を指定
2. 関数をコピー
3. 関数をdraw()内などで使う。

```c++

#include "ofApp.h"
#define SEND_PORT 8009
#define RECIEVE_PORT 8008
#define HOST "127.0.0.1"
void ofApp::setup(){
    sender.setup(HOST, SEND_PORT);
    receiver.setup(RECIEVE_PORT);
}

//--------------------------------------------------------------
void ofApp::update(){
    OSCrecv();
}

//--------------------------------------------------------------
void ofApp::draw(){
    OSCsender("/test", 123);
}

//ここから下〜〜
void ofApp::OSCsender(string address, int x){
    ofxOscMessage m;
    m.setAddress(address);
    m.addIntArg(x);
    sender.sendMessage(m);
}

void ofApp::OSCrecv(){
    
    while( receiver.hasWaitingMessages() )
    {
        
        ofxOscMessage m;
        
        receiver.getNextMessage( &m );
        
        //OSC message setting
        if ( m.getAddress() == "/test" ){
            test = m.getArgAsInt(0);
        }
    }
}
Windows 10 PC のクリーンインストールメモ

# 正月なので、PCをクリーンインストールしよう

と思ったら、Windows 10 でシステム設定からクリーンインストールしようとすると失敗する

![2017-12-31_14h49_27.png](https://qiita-image-store.s3.amazonaws.com/0/83984/1753a538-061c-b558-b78f-4776755beaa7.png)
ここから初期化しようとするとエラーで失敗する。

そこで、回復ドライブを作成してこちらから初期化する

![2017-12-31_14h50_44.png](https://qiita-image-store.s3.amazonaws.com/0/83984/cc388daa-5045-7b4a-4517-776489f79577.png)

システムファイルを回復ドライブにバックアップするにチェック

![2017-12-31_14h51_39.png](https://qiita-image-store.s3.amazonaws.com/0/83984/36482fbc-1e64-d3b1-46c4-7434784fcf1e.png)

8G以上のUSBメモリが必要。
このオプションを選択すると、どうやら **対象PCにプリインストールされた OS** に初期化することができる回復ドライブが作成されるらしい。

(私のPCはプリインストールOSが Windows 8.1 だったので 8.1 に初期化された。
Windows 10 で初期化されると思っていたのでびっくりした。)

あとは、Bios の設定を変更し USBブート で回復ドライブから起動。

トラブルシューティング > このPCを初期状態に戻す

データは全部削除。もちろんバックアップを忘れずに。

一旦 Winodws 10 にアップデートした PC は、以下のページから更新プログラムをダウンロードすれば問題なくアップデートできた。

https://www.microsoft.com/ja-jp/software-download/windows10

## メモ

最近は開発環境を scoop と powershell に寄せてきているので

```ps1
Set-ExecutionPolicy RemoteSigned -scope CurrentUser
iex (new-object net.webclient).downloadstring('https://get.scoop.sh')
scoop bucket add extras versinos
scoop install git 7zip
# private gist からプロファイルを
git clone mygist ~/WindowsPowerShell
scoop install pshazz
scoop install gradle nodejs go
scoop install docker docker-compose docker-machine go 
scoop install putty winscp
```
活性化関数を分かりやすく説明！

## 前提

例えば、`体重`、`肩幅`、`ウエスト`から`男性`か`女性`かを判断する機械学習エンジンを作ることをイメージしましょう。

## 前提条件において機械学習から求められる法則

- $u＝$`体重`$×$〇$+$`肩幅`$×$〇$+$`ウエスト`$×$〇
- $f\left( u\right) =au^{2}-b$のような`uを含む何らかの計算式`

とし、

- $f\left( u\right) = 0$であればあるほど`男`である可能性が高い
- $f\left( u\right) = 1$であればあるほど`女`である可能性が高い

とする。

## で、活性化関数って何？

この時の$f\left( u\right) =au^{2}-b$のような`uを含む何らかの計算式`を`活性化関数`と呼びます。

## 活性化関数の例

`活性化関数`の一例として、`ステップ関数`や`シグモイド関数`というものがあります。

(`ステップ関数`)
[![https://gyazo.com/1dfa9cc5bbcb9bde0d2536ce0ab3ff75](https://i.gyazo.com/1dfa9cc5bbcb9bde0d2536ce0ab3ff75.png)](https://gyazo.com/1dfa9cc5bbcb9bde0d2536ce0ab3ff75)

(`シグモイド関数`)
[![https://gyazo.com/fbe29acd64670ee27280d6e5bc2d79ba](https://i.gyazo.com/fbe29acd64670ee27280d6e5bc2d79ba.png)](https://gyazo.com/fbe29acd64670ee27280d6e5bc2d79ba)

要は、結果が`男`か`女`かという`0 or 1`の出力が求められる場合、`活性化関数`を利用して出力をなるべく`0寄り`か`1寄り`にできるだけ明確に分類しようという事なのです！
【備忘録】ECSでデプロイしたコンテナにアクセス出来ない時に見直すこと

# 問題点

ブラウザからECSでデプロイしたコンテナにアクセス出来ない。

![ecs35.png](https://qiita-image-store.s3.amazonaws.com/0/141934/449efdcb-a4f2-09b0-2c55-5670fa7dbdae.png)

# 状況

## デプロイ前

ECSにコンテナをデプロイする前の設定（原因と思われる箇所のみ抜粋）

### タスク定義

- ホストポートは動的割当に(ホストポートに**0**を指定)していた

![ecs34.png](https://qiita-image-store.s3.amazonaws.com/0/141934/c9291f51-f17c-5ddc-a94e-7a3c98ef6247.png)

### サービス

ALBを利用するように設定していた

![ecs43.png](https://qiita-image-store.s3.amazonaws.com/0/141934/ab5fef6a-8e73-3c0f-6de5-bb716a7cf89f.png)

## デプロイ後

コンテナデプロイ後の動作

### ターゲットグループ

状態が**unhealty**のままとなり、**healty**にならない。

![ecs30.png](https://qiita-image-store.s3.amazonaws.com/0/141934/53b78009-99d3-01b1-0e17-0ed5cdba5d32.png)

### タスク

タスクがSTOPされ、前回のステータスに**Task failed ELB health checks in xxx**と表示される。

![ecs31.png](https://qiita-image-store.s3.amazonaws.com/0/141934/c84fa7e3-fbbf-04dd-2822-f962611b0543.png)

# 原因

コンテナのヘルスチェックに失敗するため、ロードバランサーがコンテナにリクエストを送信していなかった。

# 見直し・解決方法

ロードバランサーのヘルスチェックがコンテナへ到達できるようにALBやEC2の設定を見直す。

## Application Load Balancer

- ALBとコンテナをデプロイするEC2インスタンスが同じVPCに配置されてるか？
- コンテナをデプロイするEC2インスタンスのアベイラビリティゾーンが含まれているか?

などを確認する。

![ecs37.png](https://qiita-image-store.s3.amazonaws.com/0/141934/1fa871ca-c540-eebc-407b-acca0558c2ae.png)

![ecs36.png](https://qiita-image-store.s3.amazonaws.com/0/141934/4ab3d88a-aef5-23ec-c705-c341960b4563.png)

ALBをコンテナをデプロイするEC2インスタンスと異なるVPCに配置していた場合は、VPCやアベイラビリティゾーンの設定に注意してALBを作成する。

![ecs32.png](https://qiita-image-store.s3.amazonaws.com/0/141934/58995245-3984-e85d-5bf2-9f84a3dd1f0c.png)

## セキュリティグループ

- EC2インスタンスに割り当てられているセキュリティグループがロードバランサーからのアクセスを許可しているか？

などを確認する。

![ecs38.png](https://qiita-image-store.s3.amazonaws.com/0/141934/daf5af9e-86b3-86b6-4c1e-9af81e8de3ef.png)

![ecs40.png](https://qiita-image-store.s3.amazonaws.com/0/141934/96a966da-231f-8a6b-8eaa-c15dab959c81.png)

公式ドキュメントの[タスク定義パラメーター](https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/task_definition_parameters.html)によると、`Docker デーモンは /proc/sys/net/ipv4/ip_local_port_range の一時ポート範囲 (最新の Amazon ECS 最適化 AMI では 32768 ～ 61000) を読み取ろうとします。`とあるので、EC2インスタンスに割当られているセキュリティグループにロードバランサーのセキュリティグループからポート32768 - 61000へのアクセスを許可するルールを追加する。

![ecs39.png](https://qiita-image-store.s3.amazonaws.com/0/141934/8dbd5a9c-aee4-8a36-a784-97da96397687.png)

# アクセス確認

ALBやEC2の設定を見直したところ、ヘルスチェックが通るようになり、ブラウザからコンテナへアクセスすることができるようになった。

![ecs41.png](https://qiita-image-store.s3.amazonaws.com/0/141934/750856a0-e9d6-f14b-ff43-802ba385b549.png)

![ecs42.png](https://qiita-image-store.s3.amazonaws.com/0/141934/a29be6ab-54e0-c6e4-47a4-9cc7f918a13b.png)
Microservicesアーキテクチャー導入企業一覧

どのような企業がMicroservicesアーキテクチャーを導入しているのか少し調べてみました。
参考URLとしてはいろいろあると思いますので、随時メンテナンスしようと思います。

# Early Adopters 
| 企業名            |企業URL            |参考URL            |Video|
|:-----------------|:------------------|:------------------|:------------------|
| Netflix   |https://www.netflix.com|[Link1](http://bit.ly/2lwgn8p) [Link2](http://bit.ly/2CgmpFf)|[Video](http://bit.ly/2BYJvMD) 
| UBER   |https://www.uber.com|[Link](http://ubr.to/2Ct56gW)|[Video](http://bit.ly/2q3Xb7i) 
| Airbnb   |https://www.airbnb.com|[Link](http://bit.ly/2CdHtMw)| [Video](http://bit.ly/2q2lgeQ)
| Orbitz   |https://www.orbitz.com|[Link](http://bit.ly/2EgxseV)|[Video](http://bit.ly/2loIvem)|
| eBay   |https://www.ebay.com|[Link](http://bit.ly/2EmTk8v)| 
| Amazon   |https://www.amazon.com|[Link](http://bit.ly/2lwgn8p)| 
| Gilt   |https://www.gilt.com|[Link](http://bit.ly/2EiEK1V)|[Video](http://bit.ly/2lwgyAB)
| Twitter   |https://twitter.com|[Link](http://bit.ly/2luRslu)|[Video](http://bit.ly/2Eky4A8)
| NIKE   |https://www.nike.com|[Link](http://zd.net/2q5lyRY)||[Video](http://bit.ly/2lxnltM) 
| BOX |https://www.box.com|[Link](http://bit.ly/2C2R5FR)|

出展
- [「Spring Microservices」](http://amzn.to/2CnJ5CI)
- [http://microservices.io/articles/whoisusingmicroservices.html](http://microservices.io/articles/whoisusingmicroservices.html)

# その他海外企業
| 企業名            |企業URL            |参考URL            |Video|
|:-----------------|:------------------|:------------------|:------------------|
| Spotify   |https://www.spotify.com|[Link](http://bit.ly/2Cm2svT)| 
| Lyft|https://www.lyft.com|[Link](http://bit.ly/2BZCuLo)| 
|TCF Bank|https://www.tcfbank.com/|[Link](http://bit.ly/2BU4804)|[Video](http://bit.ly/2BSsvuY)|

# 日本企業
| 企業名            |企業URL            |参考URL            |Video|
|:-----------------|:------------------|:------------------|:------------------|
| Mercari   |https://www.mercari.com| [Link](http://bit.ly/2q0rETH)
| AbemaTV   |https://abema.tv| [Link](http://bit.ly/2DC8LbZ)
|株式会社FiNC|https://finc.com|[Link](http://bit.ly/2lx9KT9)
|モノタロウ|https://www.monotaro.com|[Link](http://bit.ly/2DCVSOG)
|ユニクロ|https://www.uniqlo.com/jp/corp/corp_about.html|[Link](http://bit.ly/2UJh3aB)


# 番外編：Monolithicアーキテクチャー
http://highscalability.com/blog/2014/7/28/the-great-microservices-vs-monolithic-apps-twitter-melee.html
https://m.signalvnoise.com/the-majestic-monolith-29166d022228
Facebook/EtsyはMonolithなんでしょうか。
Haskellによる計算機モデルの実装(チューリングマシン)

## Haskell
Haskellは、純粋関数型言語という部類の言語で、従来の手続き型プログラミング言語とは違うパラダイムの言語です。
今回は、Haskellを用いてチューリングマシンを実装しました。

## チューリングマシンの概要
チューリングマシンを構成するパーツは3つです。
- テープ
- ヘッド
- 内部状態

テープは、文字が書いてある配列のようなものだと思ってください。マシンは、任意のテープの箇所の1文字を読み取ります。
内部状態は、マシンが持つ任意の状態です。
ヘッドは、このテープの文字を一文字ずつ読み取り、内部状態と文字の組み合わせによって、
- 内部状態を変え、
- テープの読み取り位置をずらす
というアクションを起こします。

たとえば、

```math

0 1 0 1 1 0 1 0 0 1 1 0 1 0 1
```
というテープがあったとします。
そしてマシンの内部状態は

``` math
{0, 1, 2}
```
の中のどれかだとします。
下記に示したものが状態遷移規則です。
左辺は、テープの文字と内部状態のペア
右辺は、テープの遷移先と、内部状態の遷移先です。

```math

        (0, 0) \rightarrow (-1, 2) \\
        (0, 1) \rightarrow (1, 1)\\
        (0, 2) \rightarrow (1, 2)\\
        (1, 0) \rightarrow (-1, 0)\\
        (1, 1) \rightarrow (-1, 1)\\
        (1, 2) \rightarrow (-1, 2)\\
```
上記に示したテープと遷移規則を元に、具体例を考えてみましょう。
マシンが左から2つめの文字(1)を読み取っているとします。そして、マシンの内部状態が0であったとします。
すると、状態遷移規則において、(1,0)であるので、テープの読み取り箇所を-1、マシンの内部状態を０に更新します。
テープの読み取り箇所は、最初2つめの文字であったものが、-1されるので、1つめのも文字になります。
そこで同じように文字を読み取り、内部状態を元に更新していくというフローです。これが永遠に繰り返されます。

## Stateモナドと内部状態
チューリングマシンの概要を理解したところで、今回はこのマシンを実装してみましょう。
今回は、内部状態を管理するために、Stateモナドを使い、内部状態を受け渡しながら、実際にテープの読み取りと内部状態の更新を行います。
Stateモナドに関しては、良記事があるのでそれらを参考にしてください。

参考文献
[Stateモナドで遊んでみよう](https://qiita.com/tsukimizake774/items/9c60c9e06ebc56b648b7)
[Haskell 状態系モナド 超入門](https://qiita.com/7shi/items/2e9bff5d88302de1a9e9)

## 実装
まず、`TeapIndex`と`InternalState`という型を定義します。そして、これらをタプルでペアにした`MachineState`を定義します。これが、Stateモナドによって管理されます。

```turing_machine.hs
type TeapIndex = Int
type InternalState = Int
type MachineState = (TeapIndex, InternalState)
```
次に読み取りの関数です。

```turing_machine.hs
readTeap :: State MachineState InternalState
readTeap = do
    (currentTeapIndex, currentInternalState) <- get
    let (moveTeapDirection, nextInternalState) = runRule currentTeapIndex currentInternalState
    put (currentTeapIndex + moveTeapDirection, nextInternalState)
    return nextInternalState
```
Stateモナドで、`MachineState`を持ち回り、evalStateをするとマシンの内部状態である`InternalState`を返します。`runRule`関数に、テープのインデックスと内部状態を与えると、どこに移動するかと新しい内部状態を返します。

次に状態遷移規則です。`runRule`関数の中に、`case-of`構文を使って実装します。

```turing_machine.hs
runRule :: Int -> Int -> (Int, Int)
runRule teapIndex internalState = do
    let currentTeapString = teap !! teapIndex
    case (currentTeapString, internalState) of
        (0, 0) -> (-1, 2) 
        (0, 1) -> (1, 1)
        (0, 2) -> (1, 2)
        (1, 0) -> (-1, 0)
        (1, 1) -> (-1, 1)
        (1, 2) -> (-1, 2)
```
最後に、テープを実際に読み込む関数を実装します。

```turing_machine.hs

readTeap3times = do
    state <- readTeap
    state <- readTeap
    return state

main = do
    print $ execState readTeap3times startState

```
Stateモナドを使っているため、同じ関数を呼び出しても違う値が返されます。

あとは、初期条件を与えて、実行します。

``` turing_machine.hs
teap = [1, 0, 1, 0, 0, 1, 0, 1, 1, 0]
startState = (5, 1)

main = do
    print $ execState readTeap3times startState

```

以上で実装は終了です。状態遷移規則とかを変えると、実際にマシンがうまく動いてることがわかります。
コードは[こちら](https://github.com/yamad07/algorithms_by_haskell)においてありますので、ぜひ参考にしてください。
## まとめ
今回は、チューリングマシンをHaskellのStateモナドを使って実装しました。
Stateモナドの使い方を学習する上で非常に良いトレーニングになったので、ぜひ実装してみてください！！
shape and reshape sample using numpy

```python
A = np.random.randint(0,10,(3,4,3,4))
print(A)
# solution by flattening the last two dimensions into one
# (useful for functions that don't accept tuples for axis argument)
print(A.shape)
AS = A.shape[:-2] + (-1,)
print(AS)
Ar = A.reshape(AS)
print(Ar)
sum = Ar.sum(axis=-1)
print(sum)
```
* e.g.

```
[[[[6 1 1 3]
   [2 6 4 0]
   [3 7 2 6]]

  [[8 0 6 0]
   [9 7 7 6]
   [1 4 0 3]]

  [[7 9 9 7]
   [1 4 2 9]
   [5 7 4 7]]

  [[5 0 3 6]
   [3 7 0 3]
   [3 1 4 4]]]


 [[[7 7 0 9]
   [6 1 9 5]
   [0 2 2 4]]

  [[0 2 3 9]
   [4 6 1 2]
   [1 2 7 7]]

  [[9 1 5 3]
   [3 4 2 0]
   [5 2 2 6]]

  [[0 4 2 2]
   [7 5 1 2]
   [5 7 9 0]]]


 [[[6 6 9 2]
   [6 5 3 7]
   [9 7 5 4]]

  [[6 6 3 8]
   [6 7 2 5]
   [9 4 4 8]]

  [[7 3 1 4]
   [0 2 0 9]
   [5 0 6 1]]

  [[4 3 3 1]
   [8 8 0 0]
   [1 0 7 3]]]]
(3, 4, 3, 4)
(3, 4, -1)
[[[6 1 1 3 2 6 4 0 3 7 2 6]
  [8 0 6 0 9 7 7 6 1 4 0 3]
  [7 9 9 7 1 4 2 9 5 7 4 7]
  [5 0 3 6 3 7 0 3 3 1 4 4]]

 [[7 7 0 9 6 1 9 5 0 2 2 4]
  [0 2 3 9 4 6 1 2 1 2 7 7]
  [9 1 5 3 3 4 2 0 5 2 2 6]
  [0 4 2 2 7 5 1 2 5 7 9 0]]

 [[6 6 9 2 6 5 3 7 9 7 5 4]
  [6 6 3 8 6 7 2 5 9 4 4 8]
  [7 3 1 4 0 2 0 9 5 0 6 1]
  [4 3 3 1 8 8 0 0 1 0 7 3]]]
[[41 51 71 39]
 [52 44 42 44]
 [69 68 38 38]]
```
# Refs.
* [What does -1 mean in numpy reshape?
](https://stackoverflow.com/questions/18691084/what-does-1-mean-in-numpy-reshape)
【New Year Calendar】チームのコミュニケーションが英語に変わってどうなったか

**New Year Calendar 6日目**
New Year Calendarって何ぞという方はまず[こちら](https://qiita.com/endam/items/ee648fed2a31c0efd249)をご覧ください。

今年最後に僕がJoinしているグローバルな開発チームについてお話したいと思います。

突然ですが・・
ある日開発チームのやりとりが全て英語になったとしたら、あなたならどうしますか？

**【選択肢】**
1. 逃亡する
2. 逃げちゃ駄目だ×3
3. 現実を受け入れる

現実的にそんなことはありえないと言う方もいるかもしれません。
でも実際僕らのチームはある日からコミュニケーションを英語にまるっと切り替えたのです。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/71113/0442a8de-58e7-3eed-c179-6d174c7459f8.png)

僕らは元々日本人だけの普通の開発チームでした。
しかし今年の4月ある事件が起こりました・・

#黒船の来襲 〜外国人エンジニアのチームJoin〜
突然アメリカ人エンジニアとブラジル人エンジニアが僕らのチームにJoinすることが決まったのです。
しかもアメリカ人エンジニアの方は日本語はあまり話せないときた:scream:

![image.png](https://qiita-image-store.s3.amazonaws.com/0/71113/ab3cf870-a5c4-09a2-564b-7c2bc9024f8d.png)

僕らはコミュニケーションをどうするか悩みました。
このまま日本語を使っても外国人エンジニアを置いてけぼりにしてしまう。それは開発チームとして絶対ヨクナイ。
ただ日本人メンバー全員そんな英語が上手いというわけでもない。
その前に僕が英語全く話せない汗

話し合った結果、チームで重大な決断を下しました。

#いざ開国 〜チームのコミュニケーションが英語に変わった瞬間〜
![image.png](https://qiita-image-store.s3.amazonaws.com/0/71113/58c87576-97b8-2b8e-5669-7694d15dad9c.png)

そう、これからは基本的にチーム内で英語を使うことに決まったのです！

英語にまるっと変わった時のSlackの実際のやりとりがこちら。

---
自分 「先程話し合った通り、今からGitHubのコメントやSlackでのやりとり、チームのMTGも英語でやろうということになりました。もし英語で通じなかった場合は日本語を使うということでヨロシクお願いします。 Yes, English! No Japanese！:fist:」
メンバーA 「We will be great English speakers！」
メンバーB 「Of course, in daily standup, speaking only English.」
自分 「Oh, that's difficult.. But we can!」
メンバーA 「Yes, we can. we will make our service great again.:point_up_tone1:」
自分
![image.png](https://qiita-image-store.s3.amazonaws.com/0/71113/45ac254f-241f-da8a-1809-51dc64866275.png)

---

Slackも含めてこれら全て英語に変更しました！

- Slack
- Gitコメント
- ソースコメント
- JIRA&Confluence
- 朝会
- チームMTG
- etc

#英語に変わってどうなった？
実際英語に変わった当初は開発効率が結構落ちました。
なぜならいちいちSlackとかで簡単なメッセ打つのもGoogle翻訳をフル活用して必死に訳していたからです。。
しかし英語に変わって3,4ヶ月経った頃、僕は次のメリットを実感するようになりました。

- **英語の技術ドキュメントを読めるようになった→実はかなり大きい利点**
- **ネット上で英語で技術的な質問をすることが怖くなくなった**
- **変数名やメソッド名で悩むことが無くなる苦笑**

つまりは**英語によってエンジニアとしての幅が確実に広がりました**

もし今「エンジニアに英語は必要か？」と聞かれたら、僕は「もちろん！」と答えるでしょう。
ただ、まだまだ僕自身英語が未熟なので、2018年も英語力をより向上するべく勉強を続けます。

それで皆さん Have a happy new year ! (良いお年を！)
Salseforce、Node.jsをRailsに移行した話

今年1番の成果であったAPI、DB基盤のRailsへの移行をまとめてみました。
Railsに移行したことで得られたものは計り知れません。

* DBマイグレーションが楽になった
* 開発生産性が飛躍的に向上した(当社比200%アップ)
* Circle CIでAPIのテストが行えるようになった
* Railsはドキュメント、ノウハウが広く普及しているのでキャッチアップが比較的に容易

以前に書いた [Node.jsのSequelizeでDBのmigrationを実行する](https://qiita.com/cobot00/items/0bc0da1095e09bcd0d5f) も併せて読んでいただくと味わい深さが増すと思います。

## 概要
2017年7月～9月と10月の2段階に分けてDB統合とAPIをRails(5.1.2)に移行を実施しました。
API基盤としてRailsを選択したのはかつて実装、運用していたことがあったのが大きいです。
なお、謎のロジックや重複するAPIの廃止、統合も行いました。

* 第1段階
  - DBをPostgreSQLに統合する
  - SalseforceのAPIを移行する(API数 80)
* 第2段階
  - Node.jsのAPIを移行する(API数 40)

### 参考情報：旧システム構成
謎なシステム構成なのは歴史的経緯とか大人の事情とかなので論理的に考えてはいけません。

* SalseforceとPostgreSQLの2つのDBがあり、一部テーブルはSalseforceからPostgreSQLに連携していた
* 認証と主要APIはSalseforce、新規APIはNode.jsに実装する方針

## 移行作業詳細
### DBをPostgreSQLに統合する
DBマイグレーションはRailsで管理、運用するようにしました。
新規にDB作成するケースを考慮して現状のDBスキーマの状態を作成する初期セットアップスクリプトを用意しています。Railsプロジェクトに `db/migrate_init` ディレクトリを用意し、 `INITIAL_MIGRATE=true` を指定した場合は初期セットアップを実行するようにしました。

```bash
INITIAL_MIGRATE=true bin/rake db:migrate
```

初期セットアップ用のDBマイグレーションスクリプトは以下のようなSQLの結果を利用して生成しています。

```sql
SELECT table_name, column_name, data_type,  is_nullable, column_default, character_maximum_length
FROM information_schema.columns
WHERE table_schema = 'public'
ORDER BY table_name, ordinal_position
```

### APIを移行する
フロント側の修正が必要なのと検証コストを考慮して最初にSalseforce、次にNode.jsと段階を分けています。APIを移行する上で以下のルールを徹底し、URIだけでどんな処理をするかが分かりやすくなるようにしました。

* URIはREST APIのルールを徹底する
* 正常系のテストは必ず書く
  - RSpecはコントローラーのテストが書きやすいので苦にはならなかった
* curlや [DHC](https://chrome.google.com/webstore/detail/restlet-client-rest-api-t/aejoelaoggembcahagimdiliamlcdmfm) で実際に動かす

## 移行作業を行ううえで大事なこと
* 信念と強い意志でやり抜く
* チーム内に移行の意義、生産性向上を強く訴え続ける

## オマケ：移行に至った背景
Salseforce、Node.jsともプロダクトが対象とするドメインと運用方法に噛み合っておらず、開発生産性が低く、運用がツラかったことによります。

### Salseforceのつらいところ
* 独自言語であるApex(Java風味)で実装しなければならない
* デプロイ方法が古式ゆかしい
  - ユニットテストのカバレッジ70%を超えていないとデプロイできないがテスト支援が微妙
    - 意味のないユニットテストをはびこらせる温床
* DBの仕様が独特
  - テーブル、カラムを追加する場合は `__c` という接尾辞をつける必要がある
  - IDは独自の採番ルールによる18桁の文字列になる
    - IDはユーザーが指定できないので複数環境で運用するのがつらい
* 外部からDB操作をする際は **SELECT文しか** 実行できない
  - しかも `SELECT *` が使えない、必ずカラム名を指定する必要がある
* ガバナ制限により実装方法が制限される
  - 1トランザクション内で実行できるDMLが150回まで
  - LongText型を使用しているとSOQLのLIMITのOFFSETが200までに制限される
* ドキュメント、ノウハウを調べるのがつらい

### Node.jsのつらいところ
* 認証やログ出力などの基盤処理を共通化できず、API毎に呼び出しを書かないといけない
  - Expressが微妙なだけなのかも
* 1リクエストで複数のリソースにアクセスする必要があると途端に実装がつらくなる
  - 業務系のドメインには向かない
* CPUヘヴィな処理があると死ぬ
* ライブラリが未成熟なものが多く、ハマった時につらい
* デバッグ・テストがつらい

### DBマイグレーションの変遷
* PostgreSQLは当初は初期セットアップ用のSQLスクリプトのみしかなかった
  - 変更が発生した場合は手作業でスキーマを変更していた
* DBマイグレーションをNode.jsのSequelizeで行うようにした
  - スキーマ変更毎にモデルクラスを修正するのがダルい
  - 複数の環境に適用するための手段が標準で用意されていない
* ActiveRecordクローンのSequelizeより、ActiveRecordでDBマイグレーションをしたくなる
【Node.js入門】インストールからローカルサーバー立ち上げまで


## Node.jsのインストール

[Node.jsのサイト](https://nodejs.org/ja/)にアクセスすると最新版のインストーラーをダウンロードできます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/195024/c441f88b-54c6-0fe8-dbc1-73708e2233b0.png)

次に、ダウンロードしたexeを起動し、ウィザードに従ってインストールすれば完了です。


## アクセスすると **Hello, Node.js**を返す簡単なWebサービスを作成する

作業するフォルダにJavaScriptファイルを作成します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/195024/8ed1899f-2a4a-cbc2-7ebc-1ebb881fcae7.png)

```js:hello-server.js
// Node.js の http モジュールを読み込む
const http = require('http');

// サーバーを生成
const myServer = http.createServer(requestListener = (req, res) => {
    // アクセス情報をターミナルに出力
    console.log(`url:${req.url}`);
    console.log(`method:${req.method}`);
    // http ヘッダーを出力
    res.writeHead(statusCode = 200, headers = {
        'Content-Type': 'text/html'
    });
    // レスポンス本体を出力
    res.end(data = '<h1>Hello, Node.js!</h1>\n')
});

// ポート番号:8081で受け付け開始
myServer.listen(port = 8081);
```

**`createServer`**はリクエスト時のリスナー関数を引数にとり**`http.Server`**クラスのインスタンスを返します。
リスナー関数の引数には要求情報と返信情報（**`http.IncomingMessage`**クラスと**`http.ServerResponse`**クラスのインスタンス）がコールバックされます。
httpヘッダー出力のステータスコード：200番台はクライアントからのリクエストが受付に成功したというステータスです。

## ローカルサーバーの立ち上げ

```powershell
# カレントディレクトリをhello-server.jsを作成したフォルダに移動します。(私の環境では以下の通りです)
PS C:\Users\sa500>cd C:\Users\sa500\Documents\study
PS C:\Users\sa500\Documents\study>

# ローカルサーバーを立ち上げます。
PS C:\Users\sa500\Documents\study> node hello-server.js
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/195024/f70d8c6f-71b3-cca6-3614-f027bc8a2634.png)


WebブラウザからURL:**`http://localhost:8081`**のローカルサーバーにアクセスすると**Hello, Node.js**が出力されます。
ディベロッパーツールから確認すると確かに**`<h1>Hello, Node.js!</h1>`**が出力されています。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/195024/201b20e7-74dd-431c-2863-ac15c33ac34c.png)

アクセスがあるたびにどのurlでどのメソッドにアクセスがあったかがターミナル出力されます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/195024/dd02ae3d-807f-b94d-e661-98272017d9f4.png)

## 参考

- [いまどきのJSプログラマーのためのNode.jsとReactアプリケーション開発テクニック](http://www.socym.co.jp/book/1114)
- [Node.js v9.3.0 Documentation](https://nodejs.org/api/http.html#http_event_request)
- [よく見るHTTPステータスコード一覧とその意味を理解する](https://www.seohacks.net/blog/seo-tech/1147/)
- [改訂新版JavaScript本格入門](http://gihyo.jp/book/2016/978-4-7741-8411-1) p207 - 名前付き引数でコードを読みやすくする
思うところがあってGoogle Analyticsを使ったABテスト方法をおさらいしてみた

思うところがあってGoogle Analyticsを使ったABテスト方法をおさらいしてみた。

# TL;DR
https://pokosho.com/a/abtest/

# やること
1つのviewでABテストをする。

# 設定

## なんにせよ、まずはGAを。

```html
<script async src="https://www.googletagmanager.com/gtag/js?id=UA-613309-1"></script>
<script>
window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}
gtag('js', new Date());
gtag('config', 'UA-613309-1');
</script>
```

## GAでABテストを作り、テストID(experiment_id)を取得する
![image.png](https://qiita-image-store.s3.amazonaws.com/0/21799/d506a211-2b32-c25e-fd63-7f8190159d73.png)

## GAでconvertionとするページを登録しておく
![image.png](https://qiita-image-store.s3.amazonaws.com/0/21799/d0f4c5fe-717c-ecca-2990-4fae3b6000a2.png)


## variation(パターン or オリジナル)を取得する
```html
<script src="//www.google-analytics.com/cx/api.js?experiment=[テストID]"></script>
```

```javascript

let variation = cxApi.chooseVariation();
console.log("variation", variation); // オリジナル:0 or パターン:1
```

### TODO
- 今回はJSで取得したが、サーバサイドで取得したい場合は予めcookieに入れておいてそれをみる？

## 表示を分ける
Vueを使ってみた。

```javascript
var app = new Vue({
  el: '#app',
  data: {
    isPattern: variation == 1
  }
});
```

```html
<div id="app" class="main container">
    <h1>欲しいですか？</h1>
    <a v-if="!isPattern" href="conversion.html" class="btn btn-danger btn-lg" role="button">5000兆円(Original)</a>
    <a v-if="isPattern" href="conversion.html" class="btn btn-primary btn-lg" role="button">お年玉(A)</a>
    <a href="drop.html" class="btn btn-secondary btn-lg" role="button">いらない</a>
</div>
```
logwatchで "Anacron job 'cron.daily' "メールが送信されるのを止める方法

最近、自宅用のメールサーバをDTIからConoHaにリプレイスしました。
その際、いちから CentOS 7 にマイグレーションしたんですが、久々すぎて忘れてるのか設定方法が変わったのか分からない手順がいくつかありました。

その中で、こんなメールを頻繁に受け取るようになりました。

![9B266BD9-7EDB-4C77-A108-794EE0BAE1CC.jpeg](https://qiita-image-store.s3.amazonaws.com/0/182842/878e7e1a-208e-0428-58d0-6a954838e5fb.jpeg)

どうやら logwatch のエラーメールのようですが、意外と修正するための情報がインターネットでは引っかかりませんでした。そこで少し仕組みを調べて自力で対応してみました。

というわけで、せっかく得られた知見ですから、備忘録を兼ねて共有します。興味のある方のお役に立てば幸いです。

# 原因

cron で実行するスクリプト /etc/cron.daily/0logwatch の標準エラー出力として下記のエラーが出力されるようです。

<pre>Ignoring header field "Auto-Submitted: auto-generated"
Ignoring header field "Precedence: bulk"
Ignoring header field "MIME-Version: 1.0"
Ignoring header field "Content-Transfer-Encoding: 7bit"
Ignoring header field "Content-Type: text/plain; charset="iso-8859-1""</pre>

これは logwatch がメール送信する際に、いくつかのメールヘッダを付与しようとするみたいです。それを無視したことを示すエラーが実行のたびに出力される模様でした。CentOS 7 デフォルトのスクリプトのはずですが、どの環境でも起こってるんですかね？特別なことは何もしてない環境なので不思議です。何か追加パッケージを入れれば出力されなくなるのかな？

しかし、内容をよく見てみるとコンテンツタイプなど重要なヘッダですね。これはどうにか上手く設定しなくちゃ。


<h2>解決方法</h2>

<h3>方法1</h3>

/etc/logwatch/conf/logwatch.conf を下記のように書き換えます。

変更前：
<pre>mailer = mailx -t</pre>

変更後：
<pre>#mailer = mailx -t
mailer = sendmail -t</pre>

mailxだとヘッダーを無視しちゃうみたいで、それが具合が悪かったみたいです。

<h3>方法2

<p>方法1を編み出すまでは、こちらで強引に対処してました。</P>

<p>/etc/cron.daily/0logwatch の中～下のほど該当行を下記の通りに書き換えします。</p>

変更前：

<pre>#Call logwatch
$LOGWATCH_SCRIPT $OPTIONS</pre>

変更後：
<pre>
#Call logwatch
$LOGWATCH_SCRIPT $OPTIONS > /dev/null 2>&1
</pre>

コマンド実行結果の標準出力と標準エラー出力を捨てる設定を入れるだけです。非常に簡単。

書き換え後は、必ず下記のコマンドで実行してみてエラー出力されなくなることを確認しましょう。

<pre>/etc/cron.daily/0logwatch</pre>

簡単ですが、標準のスクリプトを書き換えることになるので、今後のアップデートなどで上書きされたりするときにはまた書き換えが必要になるかもしれない点は注意ですね。あと、標準エラー出力全部捨てるので、logwatchが正常稼働しなくなった時には元に戻してからトラブルシューティングに当たる必要があります。ご注意ください。

## おわりに
いまどき logwatch を利用している方、そんなに多くないんですかね？何か有償or無償のログ監視系ツールやSwatchの方が多いのかな？

CentOS7で設定したら、すぐに発生するエラーで情報が引っ掛からないなんて、、、と思ってしまうわけです。

誰かもしご存知であれば教えてください。

## 元記事

[CentOS7: logwatchで "Anacron job 'cron.daily' "メールが送信されるのを止める方法](https://takulog.info/post-5056/)
【Qt】非同期なEventをテストしたい

それっぽいテストができるようになりましたが、方法がシックリきていません…。
マサカリが投げ込まれることを、心より望んでおります。

# やりたいこと

UDPでデータを受信できることをテストしたいです。
テスティングフレームワークにはgoogletestを使用します。

```C++
  TEST_F(UdpRecieverTest, SocketReadReady)
  {
    QUdpSocket reciever;
    reciever.bind(QHostAddress::LocalHost, 45454);

    QUdpSocket sender;
    QByteArray datagram = "message";
    sender.writeDatagram(datagram.data(), datagram.size(),
                         QHostAddress::LocalHost, 45454);

    // recieverにデータが届いたことをテストする
  }
```

# とりあえずできたこと

recieverにデータが届くと、*readReady*シグナルを受信できることをテストできました。
実装は次の通り。

【main.cpp】
main()内でQCoreApplicationを初期化し、Event loopを作成できるようにします。

```c++
#include <gtest/gtest.h>
#include <QCoreApplication>

int main(int argc, char *argv[])
{
  QCoreApplication a(argc, argv);
  ::testing::InitGoogleTest(&argc, argv);
  return RUN_ALL_TESTS();
}
```

【UdpRecieverTest.cpp】
(1) Qtテスティングフレームワークの*QSignalSpy*を使って、recieverのreadyRead()をスパイします。
(2) spy.wait()でEvent loopを開始し、シグナルをキャッチした(trueが返る)ことをテストします。
(3) spy.count()で、シグナルをちょうど1回キャッチしたことをテストします。

```c++
  TEST_F(UdpRecieverTest, SocketReadReady)
  {
    QUdpSocket reciever;
    reciever.bind(QHostAddress::LocalHost, 45454);
    QSignalSpy spy(&reciever, SIGNAL(readyRead())); // (1)

    QUdpSocket sender;
    QByteArray datagram = "message";
    sender.writeDatagram(datagram.data(), datagram.size(),
                         QHostAddress::LocalHost, 45454);

    EXPECT_TRUE(spy.wait(1000)); // (2)
    EXPECT_EQ(1, spy.count()); // (3)
  }
```

このテストはパスします。

# 気になっている点

```c++
    sender.writeDatagram(datagram.data(), datagram.size(),
                         QHostAddress::LocalHost, 45454);
// ↑
// この間にreadyRead()シグナルが発生すると、wait()がtimeoutするのでは？
// ↓
    EXPECT_TRUE(spy.wait(1000));
```

# 本当はこうするべき？

spyを別スレッドに移して、wait()かけてから、writeDatagram()を呼べば良い気がしますが、
wait()でタイムアウトするようになってしまいました…。

うーむ…。
SSH接続時にエラー

#事象
raspiのOSを焼き直したのちに、再度SSHで接続しようとしたところ、以下メッセージがでた。

```
$ ssh pi@192.168.1.10
Password:
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that a host key has just been changed.
The fingerprint for the ECDSA key sent by the remote host is
SHA256:/DtVwEQbWOlTXlJx0f5UeZK0BiJtBZcvQmkFMphRUjE.
Please contact your system administrator.
Add correct host key in /var/root/.ssh/known_hosts to get rid of this message.
Offending ECDSA key in /var/root/.ssh/known_hosts:1
ECDSA host key for 192.168.1.10 has changed and you have requested strict checking.
Host key verification failed.
```

#対策方法
どうやら、以前のSSH接続時の認証キーが残っていることが原因のようです。

##過去の遺物を削除
```
$ vi /Users/[@ユーザー名]/.ssh/known_hosts 

#known_hostsの中身（一部）
192.168.1.10 ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBNzbWlQ3Y+TfQkWjIyDwWZBCLHZJwuFsIklWLKFUPdumIuGTK9FbrQ1SOEHHO/KoLx9Ta1VgbFoBM8XheSScLk4=
```
上記known_hostsの部分を削除。

***Viの操作方法***

|操作|コマンド|
|:-:|:-:|
|削除|x|
|保存|:w|
|保存せずに閉じる|:q!|
|保存して閉じる|:wq|

詳しくは　[viコマンド集](http://www.ritsumei.ac.jp/~tomori/vi.html)


##再接続
```
$ ssh pi@192.168.1.10
The authenticity of host '192.168.1.10 (192.168.1.10)' can't be established.
ECDSA key fingerprint is SHA256:/DtVwEQbWOlTXlJx0f5UeZK0BiJtBZcvQmkFMphRUjE.
Are you sure you want to continue connecting (yes/no)? yes
                                                        ↑で「yes」と入力

Warning: Permanently added '192.168.1.10' (ECDSA) to the list of known hosts.
pi@192.168.1.10's password: 
Linux raspberrypi 4.9.41-v7+ #1023 SMP Tue Aug 8 16:00:15 BST 2017 armv7l

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
Last login: Fri Dec 29 12:40:23 2017 from 192.168.1.4
pi@raspberrypi:~ $ 
```
無事ログインできました！

#参考
[SSHサーバーが変わったら - profaim.jp](http://www.profaim.jp/tools/soft/network/ssh/server_changed.php)
CentOS7にnginxの設定

CentOS7でnginxの設定手順。
CentOSで安定版のNginxをインストールする。

#設定ファイル

/etc/yum.repos.d/nginx.repo というファイルを作成し、そのファイルに以下の設定を追加します。


```/etc/yum.repos.d/nginx.repo
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/7/$basearch/
gpgcheck=0
enabled=0


#{OSのバージョン}箇所に特定のバージョンを記述
baseurl=http://nginx.org/packages/centos/{OSのバージョン}/$basearch/
```

#nginxをインストール

```
sudo yum -y --enablerepo=nginx install nginx
```

インストール後、バージョンが表示されればOK。

```
nginx -v
・
・
・
nginx version: nginx/1.12.2
```

#nginxの設定
nginxの初期設定のファイルをバックアップ、
｛app_name｝.confを新規で作成します。

```
cp /etc/nginx/conf.d/default.conf /etc/nginx/conf.d/default.conf_old
cp /etc/nginx/conf.d/default.conf /etc/nginx/conf.d/｛app_name｝.conf
vi /etc/nginx/conf.d/｛app_name｝.conf
```
｛app_name｝.confを編集して、｛app_name｝の設定をします。
***root***の箇所がドキュメントルートを設定します。


```/etc/nginx/conf.d/｛app_name｝.conf
server {
    listen       80;
    server_name ｛app_name｝;
    access_log  /var/log/nginx/access.log  main;
    error_log   /var/log/nginx/error.log;
    root /var/www/｛app_name｝/public;

    error_page  404              /404.html;
    error_page  500 502 503 504  /50x.html;
}
```

#nginxの起動
***systemctl status nginx***でnginxの起動状態を確認します。
起動している場合は、Activeと表示されます。
起動している場合は、***sudo systemctl restart nginx***で再起動して、設定したファイルを読み込ませます。
※nginxの設定を書き換えた場合、再起動してください。

```
#状態確認
systemctl status nginx

#起動
sudo systemctl start nginx

#再起動
sudo systemctl restart nginx

```
起動して、ドキュメントルート以下に置いたファイルが表示できればOK。
numpy bincount and weights attribute

```python
w = np.array([0.3, 0.5, 0.2, 0.7, 1., -0.6]) # weights
x = np.array([0, 1, 1, 2, 2, 2])
print(np.bincount(x,  weights=w))
X = [1,2,3,4,5,6]
I = [1,3,9,3,4,1]
F = np.bincount(I,X)
print(F)
print(np.bincount(X,I))
```
```
[ 0.3  0.7  1.1]
[ 0.  7.  0.  6.  5.  0.  0.  0.  0.  3.]
[ 0.  1.  3.  9.  3.  4.  1.]
```
# Refs.
* [bincount weights](https://docs.scipy.org/doc/numpy-1.13.0/reference/generated/numpy.bincount.html)
bincount and at method in numpy

```python
print(np.bincount(np.array([0, 1, 1, 3, 2, 1, 7])))
Z = np.ones(10)
l = len(Z)
print(l)
I = np.random.randint(0,l,20)
print(I)
B = np.bincount(I, minlength=20)
print(B)
B = np.bincount(I, minlength=l)
print(B)
X = Z + B
print("====X====")
print(X)

# Another solution
# Author: Bartosz Telenczuk
np.add.at(Z, I, 1)
print(Z)
```
* e.g.

```
[1 3 1 1 0 0 0 1]
10
[6 6 9 5 6 4 5 4 2 8 1 9 0 2 8 7 0 2 9 2]
[2 1 4 0 2 2 3 1 2 3 0 0 0 0 0 0 0 0 0 0]
[2 1 4 0 2 2 3 1 2 3]
====X====
[ 3.  2.  5.  1.  3.  3.  4.  2.  3.  4.]
[ 3.  2.  5.  1.  3.  3.  4.  2.  3.  4.]
```
# Refs.
* [100 numpy exercisesの解説 51~75](http://minus9d.hatenablog.com/entry/2017/05/31/215512)
* [at](https://docs.scipy.org/doc/numpy-1.13.0/reference/generated/numpy.ufunc.at.html)
Rails5.1 SystemTest with Chromium Headless mode

# 内容
- Rails5.1でSystemTestが実装されていたそうな
- とりあえず使ってみるか
- Docker環境なのでheadless,disable-gpu,no-sandboxで使う
  - なぜno-sandboxが必要なの？後で調べる

## 準備
Debian9.2ならaptで簡単導入でした
※ Chromiumがインストールされるのでそこだけ注意
```
sudo apt install chromedriver
sudo apt install fonts-ipafont-gothic fonts-ipafont-mincho
```


## TestHelperの記述
```rb:test/application_system_test_case
require "test_helper"

class ApplicationSystemTestCase < ActionDispatch::SystemTestCase
  capabilities = Selenium::WebDriver::Remote::Capabilities.chrome(
    chromeOptions: {
      args: %w(no-sandbox headless disable-gpu window-size=1280x800)
    }
  )

  driven_by :selenium, using: :chrome,
    options: { desired_capabilities: capabilities }

end
```


### その他
chromiumでheadlessが動くか確認したときのコマンド

```sh
# コアダンプ
$ chromium --screenshot http://google.com/
$ chromium --headles --screenshot http://google.com/
$ chromium --headles --disable-gpu --screenshot http://google.com/

# 結局これでおｋ
$ chromium --no-sandbox --headless --disable-gpu --screenshot http://google.com/
```

出力
![screenshot.png](https://qiita-image-store.s3.amazonaws.com/0/33946/a9106daf-1b3e-c275-b20a-5de1563a5aff.png)




```./bin/rails runner testrun_selenium.rb```で色々試したときのスクリプト

```rb:testrun_selenium.rb
puts Rails.env

capabilities = Selenium::WebDriver::Remote::Capabilities.chrome(
  chromeOptions: {
    # binary: "/usr/bin/chromium", # 必要なし
    args: %w(no-sandbox headless disable-gpu window-size=1280x800)
  }
)

driver = Selenium::WebDriver.for :chrome,
  desired_capabilities: capabilities

driver.navigate.to "http://google.com"

element = driver.find_element(name: 'q')
element.send_keys "Hello WebDriver!"
element.submit

puts driver.title

driver.quit

```
TravisのようなバッジをGitHubに貼る方法

![ci.png](https://qiita-image-store.s3.amazonaws.com/0/15414/9ad48223-f371-bf3d-56aa-b6bb4afeefcd.png)

こんな風にライセンスやnpmダウンロード数などCI以外でも同じようなバッジ
を、GitHubはれます。

## 方法

[https://shields.io](https://shields.io)を使います。表示されているURLにリポジトリ情報などを入れるとsvgが返ってくるのでそれをつかうだけです。

## GitHub

- Star数
[![GitHub stars](https://img.shields.io/github/stars/SokichiFujita/starter-react-flux.svg)](https://github.com/SokichiFujita/starter-react-flux/stargazers) `https://github.com/[org]/[repo]/stargazers`

- issue数

[![GitHub issues](https://img.shields.io/github/issues/SokichiFujita/starter-react-flux.svg)](https://github.com/SokichiFujita/starter-react-flux/issues) `https://github.com/[org]/[repo]/issues`

## npm

- 合計ダウンロード数 
![](https://img.shields.io/npm/dt/express.svg) `https://img.shields.io/npm/dt/[パッケージ名].svg`

- 月間ダウンロード数
![](https://img.shields.io/npm/dm/express.svg) `https://img.shields.io/npm/dt/[パッケージ名].svg`

- ライセンス
![](https://img.shields.io/npm/l/express.svg) `https://img.shields.io/npm/dt/[パッケージ名].svg`

他にも多数あります

## 見た目の変更

URLのquery stringで`?style=xxxx`とすると見た目を変えられます。

- `plastic`: ![](https://img.shields.io/badge/style-plastic-green.svg?style=plastic)
- `flat`: ![](https://img.shields.io/badge/style-plastic-green.svg?style=flat)
- `flat-square`: ![](https://img.shields.io/badge/style-plastic-green.svg?style=flat-square) 
- `for-the-badge`: ![](https://img.shields.io/badge/style-plastic-green.svg?style=for-the-badge) 
- `social`: ![](https://img.shields.io/badge/style-plastic-green.svg?style=social)
定期的に Google Cloud Datastore から BigQuery へ自動でデータをシンクする方法

あまり書いている人がいなかったのと、一度聞かれたことがあったので、他の人の時間節約のためにかいておきます。[ここ](https://cloud.google.com/bigquery/docs/loading-data-cloud-datastore)を自動化したものです。


# データの流れ

Datastore => Google Storage => BigQuery

# スクリプト

`PROJECT_ID`はGCPのproject idです。あらかじめ`gs://${PROJECT_ID}-backup`のバケットを作っておいてください。あとjqコマンドも入れてください。

```bash

#!/usr/bin/env bash

set -e

gcloud config set project ${PROJECT_ID}

RESULT=`gcloud beta datastore export --kinds="TableA,TableB" --format=json gs://${PROJECT_ID}-backup`

DIR=`echo $RESULT | jq -r .metadata.outputUrlPrefix`

for x in TableA TableB
do
    echo import ${x}
    bq load --project_id=${PROJECT_ID} --headless --source_format=DATASTORE_BACKUP --replace cloud_datastore.${x} ${DIR}/all_namespaces/kind_${x}/all_namespaces_kind_${x}.export_metadata
done


```
Remark.js on JekyllをGithub Pagesで公開する

Jekyllで構築したウェブサイト上でスライドを公開したい人向けの記事です.

Remark.jsとJekyll, JekyllとGithub Pages, Github PagesとRemark.jsの組み合わせは検索に引っかかるため, なんの疑いもなく3つを組み合わせようとしたところGithub上でスライド部分のMarkdownがHTMLに変換されてしまい, 上手くいかなかったため解決策を共有しておきます.

ここではそれぞれが使える環境を想定しています.
もし不十分であればお手数ですが他のページで整えてからご覧ください.

また, こちらのページを参考にさせていただきました. 中国語のため本文はあまり理解できませんでしたが, この場を借りてお礼を申し上げます.

[Integrating RemarkJS with Jekyll](http://chunyang-wen.github.io/jekyll-remarkjs.html)

Thank you for your post!

## 環境
```
Remark.js: remark-latest.min.js
Jekyll: v3.6.2
```

## 方法
まずはじめに必要なディレクトリツリーを示しておきます.

```
username.github.io/
 ├── _includes
 │    └── slides
 │         └── your_slide.md
 ├── _layouts
 │    └── slide.html
 └── _posts
      └── YYYY-MM-DD-your_slide.md
```

まずはlayoutから作っていきます. ここはRemark.jsの公式の[テンプレート](https://github.com/gnab/remark/wiki/Using-with-Jekyll)を元にtextareaを変更します.

Liquid構文を用いて\_includesディレクトリから本文をインポートしています.

```diff:_layouts/slide.html
    <body>
      <textarea id="source">
- {{ content }}
+ {% include slides/{{ page.slide }} %}
      </textarea>
      <script src="https://remarkjs.com/downloads/remark-latest.min.js" type="text/javascript">
```

次に\_includes/slides/以下にRemark.jsに与えたいMarkdownのファイルを置きます.
このファイルの先頭にはFront-matterを書く必要がないので普通にスライドを作って大丈夫です.
また, このファイルは公式のように.htmlにする必要はなく, .mdで書きましょう.

最後に\_posts/以下にJekyllに認識させるファイルを置きます.
以下が全文です. Front-matterのみ書いておけば良いです.
このとき, slideの引数として\_includes/slides/以下のファイル名を与えておきましょう.
なお, こちらの拡張子も.mdでOKです.

```markdown:_posts/YYYY-MM-DD-your_slide.md
---
layout: slide
title: Title
slide: your_slide.md
---
```

あとはGithubにPushしてください.

## 結果
Remark.js on JekyllをGithub Pagesで公開できる.
asarray, view and getattr method in numpy

```python
class NamedArray(np.ndarray):
    def __new__(cls, array, name="no name"):
        print(array,type(array))
        a = np.asarray(array) # it does not change even if there is no
        print(a,type(a))
        obj = a.view(cls)
        print(obj,type(obj))
        obj.name = name
        return obj
    def __array_finalize__(self, obj):
        print(sys._getframe().f_code.co_name)
        print(type(self),type(obj))
        if obj is None: return
        g = getattr(obj, 'name', "no name")
        print(g)
        self.info = g
        g = getattr(obj, 'name', "no name")
        print(g)
        self.infotest = g

Z = NamedArray(np.arange(10), "range_10")
print (Z.name)
print (Z.info, Z.infotest)
```
```
[0 1 2 3 4 5 6 7 8 9] <class 'numpy.ndarray'>
[0 1 2 3 4 5 6 7 8 9] <class 'numpy.ndarray'>
__array_finalize__
<class '__main__.NamedArray'> <class 'numpy.ndarray'>
no name
no name
[0 1 2 3 4 5 6 7 8 9] <class '__main__.NamedArray'>
range_10
no name no name
```
# Refs.
* [view](https://docs.scipy.org/doc/numpy-1.13.0/reference/generated/numpy.ndarray.view.html)
* [\_\_array_finalize\_\_](https://docs.scipy.org/doc/numpy-1.13.0/user/basics.subclassing.html)
* [実行中の関数・メソッド名](https://qiita.com/megmogmog1965/items/0b4ea3d58e34f1854158)
* [getattr](https://docs.python.jp/3/library/functions.html#getattr)
Mac(High Sierra)で4TBの外付けHDDがフォーマットできない


macOS High Sierra (10.13.2)な iMac に某B社の4TBな外付けUSBハードディスクを接続して、ディスクユーティリティから再フォーマットしようとすると「MediaKitが要求された操作を行うには装置上に十分な領域がない」的なエラーメッセージが表示されて、フォーマットもマウントもできない状態になっていました。

## GUIではできない

Windowsならフォーマットできそうですが、あいにく持っていません。
High Sierraの仕様なのか不具合なのかはわかりませんが、少なくとも最近のMacのGUIからでは操作できないようです。

## CUIではできる

というわけで、危険を伴いますがターミナル(Terminal.app)からコマンドライン版のディスクユーティリティを使ってフォーマットします。
不要な外付けストレージはすべて外しておいた方が良いです。

```shell-session
sudo diskutil list external
```

色々繋がっていれば色々と表示されると思いますが、この表示を読んでどれが外付けUSBハードディスクなのか当たりをつけます。たぶん該当するdiskは、TYPE が Microsoft Basic Data なパーテーションが含まれていたり、ボリュームの SIZE が 4.0TB とかになっていると思います。自分のところでは /dev/disk3 でした。

```shell-session
sudo diskutil eraseDisk ExFAT "ボリュームラベル" /dev/disk3
```

ディスクの指定を間違えると、やったことはありませんが、たぶんMacのディスクがまっさらになります。
引数の`ExFAT`の箇所は、`JHFS+`とか指定できます。引数の`"ボリュームラベル"`は、マウントしたときにFinderに表示される名前です。詳しくは、`man diskutil`で確認してください。

## 古いバージョンならGUIでもできる

古いバージョンのmacOS(OSX)のリカバリーディスクが起動できるのであれば、そのインストーラと一緒に入っているディスクユーティリティを使うのも手です。

以上です。
Chocolateyのインストール済みパッケージ一覧をCLIのみでpackage.configに吐き出す手順

# 概要
Windowsのパッケージ管理ツールのchocolateyで、
インストール済みパッケージ一覧をpackage.configというXMLファイルに出力します。

**※今回の手順ではインストールするパッケージのバージョンについては考慮しません。**

# 理由
chocolateyでパッケージをインストールする方法はいくつかあって、
ひとつはシンプルに`choco install packagename`する方法。

もう一つは、`choco install package.config`を実行する方法。
package.configというインストールしたいパッケージの情報を記載したXMLファイルを読み込ませて一気にインストールする方法です。

このpackage.configですが、chocolateyguiというツールを使用すれば
インストール済みパッケージをpackage.configというファイルとして
エクスポートできるそうですが、
chocolatey単体ではどうもできない？のかググっても情報が見つかりませんでした。

設定ファイルだけ出力できればGitHubでバージョン管理することもできますし、
他の環境に以降するのも容易になります。

しかしエクスポートのためだけにツール入れるのもあれだったので、
せっかくなので簡単なスクリプトを書いてXMLとして出力すれば
解決できそうだと考えた次第です。

# 動作確認環境
|項目|バージョン|
|---|---|
|OS|Windows10 Home|
|PowerShell|5.1.16299.98|
|chocolatey|v0.10.8|

# スクリプト
作成するスクリプトは下記の2つです。

- out_pkgs.bat
- out_pkgs.ps1

```bat:out_pkgs.bat
@echo off

powershell Set-ExecutionPolicy RemoteSigned
powershell .\out_pkgs.ps1
powershell Set-ExecutionPolicy Restricted
```

```ps1:out_pkgs.ps1
$outFileName = "package.config"

echo "<?xml version=`"1.0`" encoding=`"utf-8`"?>`n<packages>" | Out-File $outFileName -Encoding utf8

choco list -localonly | sls "(chocolatey|packages installed)" -NotMatch | % {
  $packageName = ([string]$_).Split(" ")[0]
  echo "  <package id=`"$packageName`" />"
} | Out-File $outFileName -Append -Encoding utf8

echo "</packages>" | Out-File $outFileName -Append -Encoding utf8
```

# 実行手順
## スクリプト配置
1. 管理者権限でPowerShell端末を起動する。  
   Windows10環境でしたら、`Winキー + X` → `A`で管理者権限でPowerShell端末を起動できます。
2. 任意の作業ディレクトリに移動する。
3. 上記の内容の、下記の2つのスクリプトをカレントディレクトリに配置する。
    - out_pkgs.bat
    - out_pkgs.ps1

## スクリプト実行
1. `ls`を実行して、上記2つのスクリプトがカレントディレクトリに存在することを確認する。
1. `.\out_pkgs.bat`と入力して実行する。

## 確認
1. `ls`を実行して、package.configが生成されていることを確認する。
2. `cat .\package.config`と入力して実行する。  
   `choco list -localonly`と入力して実行する。  
   上記2つのコマンドの実行結果を比較して、インストールされているものに相違がないことを確認します。  
   ※今回はバージョン情報をpackage.configに記載しないようにしているので、
   バージョン情報に差異があるのは仕様です。

# パッケージのインストール方法
1. 管理者権限でPowerShell端末を起動する。
2. 任意の作業ディレクトリに移動する。
3. 上記手順で作成したpackage.configをカレントディレクトリに配置する。
4. `ls`を実行して、package.configがカレントディレクトリに存在することを確認する。
5. `choco install package.config -y`を実行する。
6. インストールが進むため、完了するまで待機する。
numpy.nditer and operands attribute

```python
A = np.arange(3).reshape(3,1)
A = A + 2;
B = np.arange(3).reshape(1,3)
C = [A,B,None]
print(C)
it = np.nditer(C)
print(A)
print(B)
for x,y,z in it: 
 print("====xy====")
 xy = x + y
 print(xy)
 print("========")
 z[...] = xy
print(z)
print(it.operands[0])
print(it.operands[2])
```
```
[array([[2],
       [3],
       [4]]), array([[0, 1, 2]]), None]
[[2]
 [3]
 [4]]
[[0 1 2]]
====xy====
2
========
====xy====
3
========
====xy====
4
========
====xy====
3
========
====xy====
4
========
====xy====
5
========
====xy====
4
========
====xy====
5
========
====xy====
6
========
6
[[2]
 [3]
 [4]]
[[2 3 4]
 [3 4 5]
 [4 5 6]]
```
# Refs.
* [【Python】numpy.nditer()という関数](http://www.aipacommander.com/entry/2017/05/14/172220)
* [numpy.nditer](https://docs.scipy.org/doc/numpy-1.13.0/reference/generated/numpy.nditer.html)