OmniAICreator/Qiita-1.07M huggingface dataset:
Google Home で独自のコマンドを利用する（IFTTT）

# Google Home で独自のコマンドを利用する（IFTTT）
Google Home にて、プリセットのコマンドではなく、独自のコマンドを設定します。
Google Home（Google Assistant）を、アウトプットとなるサービスをむずびつける仕組みとして、IFTTTを利用します。
連携先のサービスは以下で検索できます。
[Search services and Applets on IFTTT by category - IFTTT](https://ifttt.com/search)
![グラフィックス1.png](https://qiita-image-store.s3.amazonaws.com/0/235420/02d7ed25-2e26-34cf-bf85-2abec89c5016.png)

## アプレットの表示
作成した設定は「アプレット」をして表示されます。

１．IFTTTにログインします。
　[IFTTT](https://ifttt.com/)

２．［My Applets］を選択します
![１.png](https://qiita-image-store.s3.amazonaws.com/0/235420/9eb1aa68-74c1-6643-1cb7-ca643d3a5d25.png)


## アプレットの作成
設定を作成します。

１．［New Applet］を選択します
![2.png](https://qiita-image-store.s3.amazonaws.com/0/235420/ce510737-5a7b-d767-cf1c-6c197cc6d47a.png)
２． if this then that の［this］を選択します
![3.png](https://qiita-image-store.s3.amazonaws.com/0/235420/87a28772-a654-285f-0a64-c956631ef729.png)

３． ［Google Assistant］を選択します
![5.jpg](https://qiita-image-store.s3.amazonaws.com/0/235420/fb18f83e-6f43-6cdd-4305-405447aaecb9.jpeg)

IFTTTに利用するGoogleAssistantの情報が登録されていない場合、認証設定が実施されます。

４． 以下のうち、いずれかを選択します
![6.png](https://qiita-image-store.s3.amazonaws.com/0/235420/bca5c9ec-3e3c-115c-e18d-014cf12b36a0.png)

・ Say a simple phrase
　Google Home に特定の文章で指示を出します。
　変数は使用しません。
・ Say a phrase with a number
　Google Home に特定の文章で指示を出します。
　数値を変数として使用します。
・ Say a phrase with a text ingredient
　Google Home に特定の文章で指示を出します。
　文字列を変数として使用します。
・ Say a phrase with both a number and a text ingredient
　Google Home に特定の文章で指示を出します。
　数値と文字列を変数として使用します。

以下の説明では［Say a phrase with both a number and a text ingredient］を選択したものとします。

５．各項目を入力します。
　入力が完了したら［Create trigger］を選択します。
![7.png](https://qiita-image-store.s3.amazonaws.com/0/235420/80795a73-0ee8-81e6-de5f-213740db0d69.png)
・ What do you want to say?
　Google Home が認識する指示文書を入力します。
　変数は以下の通り指定します。
　数値　：　#
　文字列：　$
　入力例：$ の音量を # にして
・ What's another way to say it? (optional)
　他にGoogle Homeに認識させる指示文書を入力します。
　任意入力項目です。
・ WAnd another way? (optional)
　他にGoogle Homeに認識させる指示文書を入力します。
　任意入力項目です。
・ What do you want the Assistant to say in response?
　Google Homeが命令文を認識した際に発する文書を入力します、
　何も発させない場合は、スペースを入力します。
・ Language
　Japanese を選択します。

６．if this then that の［that］を選択します
![11.png](https://qiita-image-store.s3.amazonaws.com/0/235420/85553338-c9f7-8651-ecc0-2ccf3b872aad.png)
７．actionを選択します。
![IFTTT-7.jpg](https://qiita-image-store.s3.amazonaws.com/0/235420/fdbb64e1-8f70-7916-df83-635b61b8a848.jpeg)
2018/02/03 時点で 6x66 の選択肢が表示されています。

８．actionに必要な設定を行います。
　指示文書に変数を使用していた場合、取得した変数を利用できます。
　数値　：{{NumberField}}
　文字列：{{TextField}}
　入力が完了したら［Create action］を選択します。

８．アプレットのタイトルを確認し［Finish］を選択します
![13.jpg](https://qiita-image-store.s3.amazonaws.com/0/235420/5f15803e-831d-abf4-e097-65d7a679abb1.jpeg)
通常、数秒でアプレットを利用できるようになります。
あしたのIoE 　(明日のデータマエショリスト①)

#DataFrameを仲介役に、いろいろしていくために。
IoTと違い、あまりバズりそうにないIoE(Internet of Everything)。言い出しっぺはシスコシステムズあたりだとか。データサイエンティストはバズったのだろうが、実態としてのデータマエショリストは名前からしてあまりバズってほしくない。

ただ、IoT案件をデータ側から見た場合、クライアントにとって有意な分析をするために、IoTなセンサーデータと他のデータとを組み合わせて...といった話が多いはず。何らかのデータが来て、それなりの前処理をして...ってものを、「IoEなデータ前処理」といっても良いはず。

ということで、近い将来の、あるいは、あしたの「IoEなデータ前処理」の基礎力・応用力つくりをDataFrame(自分の場合、pandasなそれ)を使ってこつこつと取りんでいきたい。


#想定する（実装する）お題。
以下の想定のもと、お試し実装を進めていきたい。
##①費用対効果の高いデータ処理基盤をクラウド上に準備
データは２１世紀の原油、なんだとか。石油産業で原油の掘削・輸送コストが事業上の大きな課題であるように、データ処理でも費用対効果は実務上の大きな課題。クラウドはAWSでもAzureでもGCPでも良いので、（工数的な意味も込みで）費用対効果の高いデータ処理基盤の構築方法を探っていきたい。

##②データの活用過程にEthereum仕様ベースの実行が組み込まれる。
別にEtheereumでなくても良いんだけれど、IoT/IoEな分散システムでは、ブロックチェーン（あるいはその派生・改良版）を活用しての証憑確保というシナリオは定着していくものと考えている。特にクラウドを使う場合、クラウド上の情報を全面的に信用することはよろしくないだろうから、正しい意味でのブロックチェーンの活用は望ましいところ。
ということで、ワールドコンピュータという野心的なビッグマウスが、少なくとも金銭的評価では成功しているEtheereumを使う。
###Ethereumのモバイル・IoTクライアント向け実装
　これは、Ethereumのモバイル・IoTクライアント向け実装(Status)が、Nimで書き進められていることによる。ラズパイでNimしたいしたい。
##③データ量は急増しうる（バズりうる）
テレビ放送かFintechかICOなどな何かによって(->テキトー)、特定ドメインのデータ量が急増することがありうるものとする。　ということでデータ量の増減に強いアーキテクチャを試したい。ストリーム処理だろうか。

##④ラズパイからデータを受け取り続ける。
（多くの場合）IoEはIoTを含む。近い将来にラズパイ３やラズパイ４、あるいは他のより省電力な機器からデータをたくさん受け取ることを想定（実際に受け取ることもやる）。端末側の諸シナリオ（通信回線品質、機器故障、情報セキュリティなど）を扱う

#準備開始
**千里の道もはじめの一歩から**。ということで、手始めは自分には割合と長い付き合いのCloud9にお試し環境を用意することから始めたい。
さすがに今回は途中から有償環境も使うかな。
##cloud9にMiniconda
骨太なPythonistaからはいろいろと批判もあるＡｎａｃｏｎｄａシリーズ。ただ、お試し用途に便利なことも事実。ここでは弟分のMinicondaを導入しておきたい。pythonはなるべく新しいものを使いたいもので。

Qiita上の先人に習い、pyenvを入れてしまう。

```
git clone https://github.com/yyuu/pyenv.git ~/.pyenv
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bashrc
echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc
echo 'eval "$(pyenv init -)"' >> ~/.bashrc
```

pyenv経由でminicondaを入れるに辺り唯一のポイントは導入可能なminicondaのバージョンを確認しておくこと:
> pyenv install --list | grep mini

導入バージョンが決まれば、あとは一直線。例えば:

```
pyenv install miniconda3-4.3.30
pyenv rehash
pyenv global miniconda3-4.3.30
```

とりあえず、pandas(+numpy)は入れておこう。
> pip install pandas

minicondaなら、cloud9でも余裕で導入できる。nimの最新版も一緒に導入できるくらい余裕がある（#あしたのIoEではバイナリ通信周りは全面的にnimに任せようと思っている）。

```
$ nim -v
Nim Compiler Version 0.17.3 [Linux: amd64]
Copyright (c) 2006-2018 by Andreas Rumpf

git hash: b4eff82e62883d307db83f3e875be2e1b521b0ff
active boot switches: -d:release
$ python -V
Python 3.6.3 :: Anaconda, Inc.
```

もっといろいろ入れたくなったら、AWSの安いプラン（当初は無料）でcloud 9ね。

#続く。

##IoE、その心は？

バズりそうにないIoE(Internet of Everything)ではなく、**IoE　= Internet of Ethereum**で良いのではないかと思っている。投資家・投機家の皆さま観点からは、今年は、Ethereum叩きな観点になるのかもだけれど。Nimタグつけといてnimについて何も書いてないけど、Internet of Ethereumのモバイル端末のマエショリストはこのnimめにお任せくださいませ（お噛ませくださいませ）、的な。

##それなんて、あしたのJoE、、、
なんか微妙なタイトルじゃないかって。
それは、『あしたのジョー』作家先生、ちばてつや御大が自ら描いた幻のラストを目にしてしまったから、、、

![それ.png](http://kaimakulink.up.n.seesaa.net/kaimakulink/image/2010-11-27_073134.jpg?d=a0)

（　出典　三重・四日市市　私立博物館、なのかな）

なんかパンチドランカーとかそういうのを超えたインパクトが（真っ白な灰、燃え尽き症候群、いや、そんなのとは違う、、）。『はじめの一歩』の作者先生もこれを目にしてしまったのだろうか、、、
少なくとも仮想通貨が下がって燃え尽きてたそがれている人ではないが。

ということで、なんとなく、あしたのIoE。
**明日に向かって（コマンドを）打つべし、打つべし**。（サンドバッグではなくサンドボックスを）叩け、叩け、叩け、おいらにゃぁ(以下 ry...)。
Protocolによるポリモーフィズム（多態性）

#概要
呼び出すメソッドは同じでも、オブジェクトの型によって振る舞いを変化させることをポリモーフィズム（多態性）と呼びます。本記事ではProtocolを使ったポリモーフィズムの実装例を紹介します。

#背景
そもそも何故ポリモーフィズムを使う必要があるのでしょうか。ポリモーフィズムのメリットとして、「メソッドの呼び出し元でオブジェクトの具体的な型を知らなくても済む」という点が挙げられます。例えば、似たような性質を持つが厳密には異なる二つのクラス、クラスAとクラスBがあるとします。この二つのクラスは共に同名のメソッド(doSomethingとします）を持っていますが、その中の処理は異なるものとします。

もしdoSomethingの呼び出し元で、対象のオブジェクトがクラスAのインスタンスなのかクラスBのインスタンスなのか知らなければならないとしたら、その識別の処理を呼び出し元に書かなければなりません。また、同様の性質を持つクラスCやクラスDが将来作られた場合、やはり呼び出し元を修正してクラスCやクラスDを識別するコードを書く必要があります。

Protocolを使用して具体的な型を隠蔽することにより、呼び出し元のコードをそういった処理から解放することが可能になります。以下に具体例を示します。

#Protocolの宣言と実装
まず、何らかの計算を行うcalculateメソッドを宣言したCaculatorProtocolがあるとします。

```swift:CalculatorProtocol
protocol CalculatorProtocol {
    // 何らかの計算を行うメソッド
    func calculate(num: Int) -> Int
}
```

次に、CalculatorProtocolを実装する二つのクラスを定義します。どちらもcalculateメソッドを実装していますが、一方は引数の２倍を返す処理、もう一方は引数の２乗を返す処理と、同名のメソッドで異なる処理を行っています。

```swift:DoubleCalculator
class DoubleCalculator: CalculatorProtocol {
    func calculate(num: Int) -> Int {
        // 引数の２倍を返す
        return num * 2
    }
}
```

```swift:SquareCalculator
class SquareCalculator: CalculatorProtocol {
    func calculate(num: Int) -> Int {
        // 引数の２乗を返す
        return num * num
    }
}
```

さらに、typeの値に応じてCalculatorProtocolオブジェクトを返すgetCalculatorメソッドを実装したCalculatorHandlerを用意します。

```swift:CalculatorHandler
class CalculatorHandler {
    func getCalculator(type: String) -> CalculatorProtocol? {
        if (type == "Double") {
            return DoubleCalculator()
        } else if (type == "Square") {
            return SquareCalculator()
        } else {
            return nil
        }
    }
}
```

#使用例（呼び出し元）
最後に、これらを使用して実際にcalculateメソッドを呼んでみましょう。

```swift:calculateメソッドの呼び出し元
let type = "Square"
let num = 4

if let calculator: CalculatorProtocol = CalculatorHandler().getCalculator(type: type) {
    let result = calculator.calculate(num: num)
    print(String(result))
}

```

####実行結果

```
16
```

呼び出し元では、calculatorオブジェクトがDoubleCalculatorのインスタンスなのか、SquareCalculatorのインスタンスなのかを判別していません。このようにしておけば、将来的にTripleCalculatorやCubeCalculatorといった新しいCalculatorProtocolの実装が現れても、呼び出し元を修正する必要がありません。このようにProtocolを活用することで抽象度を上げ、柔軟かつ保守性の高いコードを記述することが可能になります。
ArcGISのツールを適当につくっている話

### どういったものか  
ArcGISと言う商用ソフトで動くツールです。
https://github.com/MALORGIS/l100toolsForArcGIS

![ツール](https://raw.githubusercontent.com/MALORGIS/l100toolsForArcGIS/images/images/toolbox_ja.jpg "ツール") 

## なぜ作成してどういったときに使用するのか
機能が上位版(値段が高い)にしかないものやPython書けないオペレーターの手数を減らすように100行程度でサクッと実現できそうな簡単なツールを増やしています。  
とりあえずツールを増やしている段階で実装は適当なので、そのうちまとめないといけない気がしていますが気分次第の予定です。
unixまとめ

- mkdir app{1..40}:一気に40のディレクトリ作成→作業効率が上がる

## unixとは何か？UNIXや互換OS、ディストリビューション、Linux
- POSIX:共通規格  
- BSD(MacOS)/Minix/Linux(Distribution:Red Hat(RHEL/CentOS)/Debian(Ubuntu))

## promptの確認(入力を促している部分)
- [vagrant@localhost ~]$

## システムの全体像を把握しよう
- bin:cat/cp
- etc:application設定ファイル
- home:各ユーザーのhomeディレクトリ
- sbin:システム管理用のコマンド
- usr:一般的なアプリケーションが格納
- var:システムのログファイル(頻繁に書き換えるもの)
- home/vagrant(薄くなるもの:.ファイル(簡単にいじれないように設定ファイルになっている。不可視ファイル。))

## ディレクトリ間を移動
- pwd(print-working-directory)
- clear or ctrl+l
- cd(change-directory)
- cd ..:一つ前
- pwd /home/vagrant:path(絶対指定:一番上の階層から見る) cd ~(総体指定:カレントディレクトリから見る)
- cd -:直前のディレクトリ

## ディレクトリを操作(ディレクトリの作成、内容の表示、コピー、移動、削除 
- mkdir:make directory mkdir -p(parent)
- cd:check directory
- cp:copy cd -r(recursive)
- mv:move
- rm:remove rmdir
- rmdir(中身がからのものにしか使えない)
- rm -r(中身があってもおけ)

## ファイルを操作
- cat:内容確認
- less:長いファイルを表示 spaceかCTRL+f(1画面先)、CTRL+B(1画面前)、G(ファイルの先頭)、shift+Gで末尾
- cp:copy
- mv:move 同じディレクトリ内で使うと名前の変更
- rm:remove

## bashの便利機能
- tabによる補完(コマンド、ディレクトリ)
- CTRL+C:現在のコマンドを安全に終了
- 矢印キーによる履歴
- CTRL+R:直近のコマンドの履歴を検索

## コマンドの履歴を活用
- history or !と履歴番号(ex: !800)
- !!:1個前
- !-2:2個前
- !$:コマンドに渡した最後の入力値を再活用
- !pw:pwに始まる直近のコマンドを実行
- !pw:p(実行せずにコマンドの表示のみ)

## コマンドについて詳しく調べる
- man:manual(ex: man ls)
- g:先頭
- shift+g:末尾

## シンボリックリンク
- ls -l:詳細リスト
- ln -s config/production/database dbconfig(シンボリックリンク)
- unlink:シンボリックリンクの消去

## ユーザー、グループを確認
- /etc/passed:登録されているユーザーリスト
- d:ディレクトリ、-：通常ファイル、l:シンボリックリンク
- /etc/group:登録されているグループリスト
- groups:自分の所属グループの確認

## permissionの理解
- r(read)/w(write)/e(execute)
- u(ser)/g(roup)/o(ther)
- chmod:権限付与 (ex:chmod g+x sample)

## permissionを数値で表現
- 2進数で表現 r w x 4 2 1
- rwx(421)/rw-(420)/r--(400)= 764
- chmod 774 sample(rwx rwx r--)

## コマンドを作って見る
- コマンドの作成(#!/bin/bash ファイル作成)
- 実行権限の付与(chmod)

## PATH(環境変数)を通す
- echo $PATH:どこからコマンドを検索してきているか
- printenv:全ての環境変数を見れる
- pwdで現在地を確認→export PATH=/home/vagrant/unix-study/myapp:$PATH
→exportは環境変数を設定するためのコマンド。
- PATHを通す：特定のディレクトリをPATHに加えること
- which hi(コマンドがどこのディレクトリから来てるかはwhichで確認できる)
- ログアウトすると無効になる。ログアウトしても無効にならない設定もあるが、よくわからないうちはなるべく触らないようにする。

## 管理ユーザーになる
- su-:rootユーザー
- sudo:管理者ユーザーとしてコマンドを通す

## chownを使う
- chown(change owner):ファイルに対してのユーザーとグループの権限変更

## wc/head/tail/grep
- wc(word count):行数や単語数、バイト数、ファイル名
- head: 最初の何行かをみる(defaultで10行)
- tail: 最後の何行かをみる
- grep: ファイル内の文字列を検索

## リダイレクション、パイプ
- リダイレクション　＞:あるコマンドの結果をファイルに保存
→ >>:末尾に追記。<<:ファイルの内容をコマンドに追加
- パイプ | :ファイルの内容を他のコマンドに渡す

## ワイルドカードを使ってみる
- *:任意の文字列
- ?:任意の1文字

## find/xargs
- find:ファイル検索
- xargs

## ブレース展開
- ブレース:{} ex) 
- ex)`echo {a,b,c}`
- ex)`echo {1..10}`
- ex)`echo {1..10}{a..g}`
Azure CLI の使い方

Azure CLI の使い方を、az iot コマンドを例にして示します。

GUI で、IOT Hub と、デバイスを作成します。
この例では、
 Hub は、iot-aa
 Device は pansy
です。
![azure_feb0401.png](https://qiita-image-store.s3.amazonaws.com/0/179446/d72d83bc-09ca-b617-511e-2f811324328f.png)

ブラウザーで、Azure CLI を起動します。
![azure_feb0402.png](https://qiita-image-store.s3.amazonaws.com/0/179446/1f359165-2279-e04e-3cd5-da4e53483ff6.png)

az コマンドと、linux のコマンドが使えます。
![azure_feb0403.png](https://qiita-image-store.s3.amazonaws.com/0/179446/81506933-e416-a2ff-2180-ea38ec6108ab.png)

az コマンドでアカウントの確認

```bash
az account list
```

az iot コマンドの例

```bash
az iot hub list
az iot hub show-connection-string
az iot hub show --name iot-aa
az iot device  show --hub-name iot-aa --device-id pansy
az iot device show-connection-string --hub-name iot-aa --device-id pansy
```
TypeScript 配列の要素を入れ替える関数

配列の何番目の要素と何番目の要素を入れ替えるみたいな処理をしたかったんだけど、これっていうのが探しても見つからなかったから自分で書いた。稀に良く使いまわしそう。
immutable.js にはきっとこういう機能が含まれてるはず。
Spread演算子を使うとconcatが可読性高く書けていいなと思いました。


Demo: https://jsfiddle.net/kmdsbng/ropb6867/

```ts
const swapArray = <P>(ary: P[], index1: number, index2: number): P[] => {
  const [frontIndex, backIndex] =
    (index1 < index2) ? [index1, index2] : [index2, index1];
    
  if (frontIndex < 0 || ary.length <= backIndex) {
      throw new RangeError();
  }
  
  if (frontIndex == backIndex) {
      return ary;
  }
  
  const frontValue = ary[frontIndex]
  const backValue = ary[backIndex]
  const frontward = ary.slice(0, frontIndex)
  const middle = ary.slice(frontIndex + 1, backIndex)
  const backward = ary.slice(backIndex + 1, ary.length)

  return [
      ...frontward,
      backValue,
      ...middle,
      frontValue,
      ...backward]
}

const ary = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11];

console.log(swapArray(ary, 2, 5)); // [0, 1, 5, 3, 4, 2, 6, 7, 8, 9, 10, 11]
console.log(swapArray(ary, 0, 0)); // [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
console.log(swapArray(ary, 10, 11)); // [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 10]
console.log(swapArray(ary, 11, 0)); // [11, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 0]
//console.log(swapArray(ary, 10, 12)); // RangeError
//console.log(swapArray(ary, -1, 1)); // RangeError
```
ドキドキロシアンルーレット


問題説明、割と足りなくないですか、特に3つめ(ソースのコメントにいろいろ書いた)
1時間以内でこれを補完するのは厳しいかと…

\# でもやっぱり、yieldは良いですねー

```rb:tyama_henae21.rb
#!/usr/bin/env ruby
#https://mtsmfm.github.io/2018/02/03/doukaku-e21.html
#https://qiita.com/mtsmfm/items/b48952dee07784cce8f2

=begin
補足
・参加者は与えられた順番で引き金を引いていき、全員引き終わったら最初の参加者に戻る。
・引き金を引いても弾倉は回転しない。このため、2回連続でアタリとなることはない。
・「アタリを引いた人」が1巡目で引いたとは限らない。
[1]12[4][3]/8
の[4]は2巡目で引いている。
1,4,3ハズレ,3の順番で引いたとすると、
11010000
となるが、2個目の1は、1巡目で2人目がアタリを引いていないことに矛盾する。
よって、解き方にも依るが、ハズレも確定させていく必要がある。
=end

def dfs(r,cur,i,a,b,k)
	# r:結果(-1:未確定、1:弾が入っていた)
	# cur:弾倉のカーソル
	# i:i人目
	# a:ハズレの際回す数
	# b:アタリを引いた人か
	# k:連続ハズレ数
	return to_enum(:dfs,r,cur,i,a,b,k) if !block_given?
	if b.all?(&:!)
		yield r
	elsif k<=r.size*2 # 少し多めにする
		# 「弾倉数」回回ったら、今まで確定した分では決められた回数アタリが出せない
		# (確定に誤りがある)とする
		i=0 if i==a.size
		if !b[i]
			r[cur]=0 if f=r[cur]==-1
			dfs(r,(cur+a[i])% r.size,i+1,a,b,k+1,&proc)
			r[cur]=-1 if f
		else
			if r[cur]==-1
				r[cur]=1
				dfs(r,cur,i,a[0,i]+a[i+1..-1],b[0,i]+b[i+1..-1],0,&proc)
				r[cur]=-1
			end
			r[cur]=0 if f=r[cur]==-1
			dfs(r,(cur+a[i])% r.size,i+1,a,b,k+1,&proc)
			r[cur]=-1 if f
		end
	end
end

def parse(s)
	#[3]4[4]3/7
	#a => [3, 4, 4, 3]
	#b => [true, false, true, false]
	a=[]
	b=[]
	f=false
	s.each_char{|c|
		if c=='['
			f=true
		elsif c!=']'
			a<<c.to_i
			b<<f
			f=false
		end
	}
	[a,b]
end

STDOUT.sync=true
while gets
	x,y=$_.chomp.split('/')
	a,b=parse(x)
	dfs([-1]*y.to_i,0,0,a,b,0){|e|
		puts e.map{|e|e<0?0:e}*''
		#2行以上出力される == 一意でないといえる
	}
end
```

## 以前のテストデータ
`66[6]2[9]6[6][9]5[6]11/15` に対する出力はこれで全部かな？

```
000011000001101
001011000000101
000011001000101
001001010000101
010001001000101
010000001001101
001000000011101
001000001010101
001001000111000
000001001111000
000001000111001
```
NEMのNamespaceの作成手順

##前提
- NanoWalletがインストールされていること（https://nem.io/downloads/）
- NanoWalletにXEM残高が100XEM（プラス送金手数料0.15XEM）以上あること
   - Sub-Namespaceを作る場合はさらに10XEMずつ必要

##環境
`MacOS Sierra 10.12.6
Nano Wallet v2.0.14`

##空きNamespaceの確認
　NEMのNamespaceはWWWにおけるドメイン名のようなものであり、すでに誰かによって取得されているものを重複して取得することはできない。そこで、まずは自分が取りたいNamespaceが空いているか確認する必要があるが、これもNano Walletの操作で行える。

1.　Explorer > Namespaces & Mosaicsを開く。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/201508/fbacb479-58e3-7187-c175-e88ad426b6e5.png)

2.　Search namespacesに取得したいNamespaceを入力し検索する。検索結果が表示されなければ、まだ取得されていない。

##Namespaceの取得

1.　Services > Namespaces & Subdomains > Create Namespace を開く。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/201508/d45edef6-8ff0-e907-ab0a-01cba89bbd3c.png)

2.　Namespace: に取得したいNamespaceを入力する。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/201508/b2d3b88e-0619-b4d7-1a8f-607b4583af8e.png)


3.　Password:　にNano WalletのPasswordを入力する。
4.　Resisterを押す。**※100XEM送金される。取り消すことはできない。**
5.　取得が完了すると、Parent Namespaceで取得したNamespaceを選択できるようになる。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/201508/c5166950-9911-7de6-1b8c-7d14a0abe15f.png)

##Sub-Namespaceの取得
1. Parent Namespace:　に取得したNamespaceを選択する。
2. Namespace: に取得したいSub-Namespaceを入力する。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/201508/9be098b0-9e0e-6713-1380-9fbd68ad3a67.png)

3.　Password:　にNano WalletのPasswordを入力する。
4.　Resisterを押す。

　Sub-Namespaceが正常に作成されると、Explorer > Namespaces & MosaicsでNamespaceを検索した際にSub-Namespaceに表示されるようになる。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/201508/399ed9f7-5533-6442-c77a-1d89bfc654f4.png)
railsのアセットパイプラインについて解説する

なんとなく知っているけど、聞かれたらドキッとするのでAssets Pipelineについて詳しくまとめました。

## アセットパイプラインとは何か？

作業がしやすいように画像、javascript、css、htmlファイルを分解つしてコーディングして、最終的に1つのファイルにまとめる仕組みのことです。

普段railsを使うときには意識することはありませんが、htmlファイルは```app/views```に配置されてjavascriptファイルは```app/assets/javascripts```に配置されていると思います。

このようにファイルは分けて管理した方が、人間にとってはわかりやすいですが、最終的には全て統合して一つのファイルに統合して扱われます。さらに字を詰めることでファイルの容量を最小化する働きがあります。

## アセットパイプラインの動き

### 1.コンパイル

- .js.coffee形式のファイルを.js形式にコンパイル
- .css.scss形式のファイルを.css形式にコンパイル

### 2.統合

コンパイル済みの

- .js形式のファイル達をapplication.js
- .css形式のファイル達をapplication.css

に統合する。

### 3.統合

application.jsとapplication.cssから改行、コメント、空白を取り除く

### 4.ダイジェスト付与

圧縮後のapplication.jsやapplication.cssや画像にハッシュ値というファイル固有の文字列を付与する。
これによって、編集作業をするごとに全く別のファイルだと認識され、予期せぬキャッシュの適用を防ぐ。

[キャッシュについてのわかりやすいページ](http://wa3.i-3-i.info/word139.html)
[ダイジェストについてのわかりやすいページ](http://wa3.i-3-i.info/word15954.html)

## どこが担っているの？

> 技術的には、アセットパイプラインは既にRails 4のコア機能ではありません。フレームワークから分離され、sprockets-railsというgemに書き出されています。

> Railsではデフォルトでアセットパイプラインが有効になっています。

引用：[RAILS GUIDE](https://railsguides.jp/asset_pipeline.html)

また```sprockets-rails```はアセット圧縮の際に

```
gem 'sass-rails' //sassファイルをコンパイル
gem 'uglifier'   //javascriptのコード軽量化
gem 'coffee-rails'  //coffeeファイルをコンパイル
```

を使っています。

## アセットプリコンパイル

production環境では処理速度に対する影響を防ぐために自動でコンパイルが行われない。
解決方法が二つある。

- アセットプリコンパイルを行う
- 設定を変える

### アセットプリコンパイルを行う

以下のコマンドを実行します

```
rake assets:precompile RAILS_ENV=production
```

### 設定を変える

```ruby:config/production.rb
config.assets.compile = true
```

に変える。
Raspbian セットアップ

ラズパイを買ってRaspbianをセットアップしたので、手順をまとめます。


#用意したもの
- Raspberry Pi3 Model B
- 32GB SDカード Class10
- Windows PC
- DD for Windows
- Raspbian OS（記事作成時は 2017-11-29-raspbian-stretch.img）

# SDカードにインストール
1. [Raspbian](https://www.raspberrypi.org/downloads/raspbian/)をダウンロードします。

2. SDカードにimgファイルを書き込むソフトをダウンロードします。
今回は[DD for Windows](http://www.si-linux.co.jp/techinfo/index.php?DD%20for%20Windows)を使います。

3. ダウンロードしたDDWin.exeを起動します。
![スクリーンショット (6).png](https://qiita-image-store.s3.amazonaws.com/0/183992/3b6f11cb-f8f8-80ad-0a45-456bf7b77413.png)
<br>
4. 対象のディスクにSDカードが表示されない場合は、
「管理者として実行」でDDWin.exeを起動します。
![スクリーンショット (9).png](https://qiita-image-store.s3.amazonaws.com/0/183992/7f226671-0ceb-1551-ed56-671d795d98ef.png)


5. ファイル選択で拡張子でAll Filesを選択して、
1.でダウンロードしたimgファイルを選択します。

6. 書込ボタンを押してしばらくすると完了します。

#Raspbianセットアップ
#アップデート
```
sudo apt-get update
sudo apt-get upgrade
sudo apt-get dist-upgrade
```



#SSH設定
```
sudo raspi-config

「5 Interfacing Options」を選択

「P2 SSH」を選択

```

有効にするとSSH接続できます。

###再起動します。
```
sudo reboot
```

※途中から有線LAN⇒Wi-fi接続に切り替えるとIPアドレスが変わるので
　SSH接続をする時は再確認してください。

これ以降はSSH接続で操作します。

# SSHのポート番号変更

ポート番号で自由に使えるのは49152番 - 65535番なので、
適当な番号を割り振ります。
[Wikipedia ポート番号](https://ja.wikipedia.org/wiki/%E3%83%9D%E3%83%BC%E3%83%88%E7%95%AA%E5%8F%B7)

```
$ sudo vim /etc/ssh/sshd_config

#Port 22
Port 49876 ←追記
```

保存をしたらSSHを再起動します。

```
$ sudo service ssh restart

$ exit
```

#piユーザ設定変更
別記事を作りました。
[Raspbianでpiユーザ名とパスワードをうまいこと変更する](https://qiita.com/kenchang/items/849c82f16ba5eafe070d)

#時計の設定

```
$ sudo apt-get install ntpdate
$ sudo ntpdate -v ntp.nict.jp

$ date
Sat 24 Feb 13:31:59 UTC 2018　←変更前の状態を確認

$ sudo timedatectl set-timezone Asia/Tokyo

$ date
Sat 24 Feb 22:32:15 JST 2018　←変更後の状態を確認
```

#参考資料
[[Raspbian]ユーザ名変更の個人的に「正しい」と思うやり方]
(https://jyn.jp/raspberrypi-username-change/)

[Raspbianのインストールと最強の初期設定](https://jyn.jp/raspbian-setup/)
Pandasを理解するために触れた資料メモ

37歳のプログラミングから離れて久しいおっちゃんです。最近、Pandasを理解しようと奮闘しております。Web上で自分にフィットする資料がないか探した中から、「最初からこれ読んでおけば良かった！」というものをメモしておきます。

[Pandasを用いた基礎分析 - Platinum Data Blog by BrainPad]
(http://blog.brainpad.co.jp/entry/2014/12/10/204111)
Pandasって何ができるんだっけ？というのを把握するのに良いブログでした。概要を掴むために呼んでおくと良いかも。

[Tutorials — pandas 0.22.0 documentation](https://pandas.pydata.org/pandas-docs/stable/tutorials.html)
考えてみれば何でもチュートリアルを試すのがいいんだよな。プログラミングから遠ざかっていたので当たり前のことを忘れてしまっていました。

# Note

## loc, iloc, ix の覚え方

### loc

> Purely label-location based indexer for selection by label.

ロケーションをラベルで指定することができます。

### iloc

> Purely integer-location based indexing for selection by position.

ロケーションをInteger型の整数で指定することができます。

### ix

> A primarily label-location based indexer, with integer position fallback.

ロケーションをラベルでもInteger型の整数でも指定することができます。

いったんは以上。いいものを見つけたら追加していきます。
[iOS] UIViewをアニメーションでフェードアウトさせる

#概要
数秒間だけ表示されて消えるようなViewを実装する場合、一瞬で消えるよりもフェードアウトのアニメーションをつけると、より視覚的なUXが高まります。本記事ではViewをフェードアウトさせる簡単なアニメーションを紹介します。


```swift:5秒後にViewをフェイドアウトさせるアニメーション
UIView.animate(withDuration: 0.2, delay: 5.0, options: UIViewAnimationOptions.allowUserInteraction, animations: {
    // Viewを見えなくする
    fadeoutView.alpha = 0.05
}) { (completed) in
    // Animationが完了したら親Viewから削除する
    fadeoutView.removeFromSuperview()
}
```

##補足
alphaを完全に0にするとuser interactionが無効になりタップできなくなるので、上記の例ではあえて0.05に指定しています。特にタップ等の操作が必要のないViewに対しては、alphaを完全に0にしても良いでしょう。
「おや…ELBのようすが…?」という時に確認すること

私の経験上、「ELBがおかしいぞ!AWSしっかりしろや!」と思ったら、よくよく調べると実装がダメなだけだったというパターンがよくあるのでまとめたい。

あ、ELBと言いながら厳密にはALBの話をメインにします。

# CASE 1. 「バックエンドは生きてるはずなのにヘルスチェックが失敗する!」

つまり以下のような症状が出る状況

1. ヘルスチェックが失敗する
2. バックエンドに直接アクセスしたら普通にうまくいく
3. バックエンドのアクセスログ見たら、ヘルスチェックに200を返している

というパターン。
「バックエンドは生きてるしヘルスチェックにも200を返してる!それなのに失敗扱いなんてELBの不具合だ!」と思いたくなる気持ちはわかるが、まずは落ち着いてヘルスチエックの成否の基準を見直そう。

・[ターゲットグループのヘルスチェック \- Elastic Load Balancing](https://docs.aws.amazon.com/ja_jp/elasticloadbalancing/latest/application/target-group-health-checks.html)

> ターゲットが応答タイムアウト期間内に応答するのを待ちます。

つまりバックエンドが200を返していようが、タイムアウトしていたらヘルスチェック的には失敗なのだ。
とりあえずバックエンドのアクセスログから処理時間を確認してみよう。**まさか処理時間を出力するようにログフォーマットを設定してないなんて言わないよな?**

ちなみにステータスコード200というのも注意が必要で、みんな大好きApacheのドキュメントにこんな記載がある

・[mod\_log\_config \- Apache HTTP サーバ バージョン 2\.4](https://httpd.apache.org/docs/2.4/ja/mod/mod_log_config.html)

> | %s | ステータス。内部でリダイレクトされたリクエストは、元々の リクエストのステータス --- 最後のステータスは %>s |
|:--|:--|

すこぶる分かりにくい文章だが、要するに
・ %s -> リダイレクトが発生した際に3XXのコードを出力する
・ %>s -> リダイレクトが発生した際に3XXのコードを出力せず、リダイレクト後の処理の結果のコードを出力する

というわけだ。そのため、「200を返してるし、CPU使用率も上がってないから大丈夫なはず」と思ってたら実はリダイレクトしまくってタイムアウトしてた、というパターンもある。
そして、筆者の記憶が確かならApacheではデフォルトで%>sが設定されている。

というわけでこの症状の場合は、ELBの不具合とヘルスチェックのタイムアウト、どちらの方がありえそうか考えて調査をはじめてみよう。

# CASE 2. 「HTTPCode_ELB_5XX_Countメトリクスが出てる!」

「5XXはサーバサイドのエラー…ELBが5XXエラーを出しているということは…ELBの不具合や!」と思いたくなる気持ちはわかるが、まあ落ち着いてほしい。
私も過去に502 Bad Gatewayに悩まされ、AWSにも問い合わせたりしたが、結局のところバックエンドの実装がクソだったのが原因だった。
だから落ち着いてまずはこれを見てほしい。

・[Application Load Balancer のトラブルシューティング \- Elastic Load Balancing](https://docs.aws.amazon.com/ja_jp/elasticloadbalancing/latest/application/load-balancer-troubleshooting.html#load-balancer-http-error-codes)

うん、分かりにくいな。
5XX系のエラーに絞って、頑張って解説してみよう。

## HTTP 502: Bad Gateway

そもそも502 Bad Gatewayというもの自体が分かりにくい。
Wikipediaによると

> 不正なゲートウェイ。ゲートウェイ・プロキシサーバは不正な要求を受け取り、これを拒否した。

これで理解できる人間はほぼいないだろう。
502 Bad Gatewayについてはこちらのページの解説が分かりやすい。

・[502Bad Getewayの原因と意味について ｜ ぷろめし｜プログラミングよりも飯が好き](http://www.promeshi.com/archives/2161)

ELBに当てはめて考えるなら、「ELBからバックエンドにリクエストを投げたが、解せないレスポンスが帰ってきた」という状況である。
つまり、ELBがイかれている可能性もあるが、バックエンドがイかれたレスポンスを返したり途中でコネクションをブッチしている可能性もあるのだ。

つまり、502 Bad Gatewayが現れたらバックエンドからのレスポンスがどうなってるかを見直した方がいいだろう。

## HTTP 503: Service Unavailable

一時的に使えないというやつ。
上記のドキュメントにはターゲットグループにインスタンスが無いという場合しか書いてないが、実は他にも503が発生する可能性はある。

ELBはトラフィック量に合わせて自動でスケールするが、あまりに急激にトラフィックが増加した場合にはスケールが間に合わなくなることがある。そういう場合にはELBの処理能力が足りなくなって503が発生することになる。
ほっといたらそのうちELBがスケールして解決するが、「一瞬たりとも落とせないんだ!」という時は予めPre-warmingを申し込んでおこう。

・[Elastic Load Balancing の暖気申請について ｜ Developers\.IO](https://dev.classmethod.jp/cloud/aws/elastic-load-balancing-pre-warming/)

見積もりがガバガバだと「ほんまにPre-warming必要か?」と突っ込まれることもあるので、真面目に見積もろう。

## HTTP 504: Gateway Timeout

これは分かりやすい。
ELB -> バックエンドの通信がタイムアウトしたということである。
バックエンドの処理を見直すか、タイムアウト時間を伸ばすかの二択だが、基本的にはバックエンドの処理を見直す方が健全である。

# 色々調べたが、どう考えても実装に問題はない時は…

AWS側の問題という可能性もあるので、問い合わせよう。
Datadog APIでInfrastructure List相当のホスト一覧を取得する

Datadogでホストの一覧を取得する場合、公式で載っているのは大体以下です。

* https://docs.datadoghq.com/api/?lang=bash#search
* https://docs.datadoghq.com/ja/api/#search

これで取得すると、以下のような形式になります。(prettifyしています)

```bash:公式にあるホスト一覧の取得方法
curl -XGET "https://app.datadoghq.com/api/v1/search?api_key=${API_KEY}&application_key=${APP_KEY}&q=hosts:"
```

通常では`metrics`と`hosts`がどちらも表示されるので、`q=hosts:`でホストだけに絞っています。

```json:取得結果
{
  "results": {
    "hosts": [
      "host1",
      "host2",
      "...",
    ]
  }
}
```

取れることは取れるのですが、本当にホストの一覧しか取れていません。もっと、ホストに紐づくタグとか…というか、画面でいう[Infrastructure List](https://docs.datadoghq.com/graphing/infrastructure/)(下記のイメージ)相当のものは取れないのかと思ったら、公式FAQに書いてありました。

![infrastructure list](https://datadog-docs.imgix.net/images/graphing/infrastructure/index/infrastructure_list-26a7dc7c.png?fit=max&auto=format&w=1680&h=926&dpr=2)

[Query the Infrastructure List via the API
](https://docs.datadoghq.com/developers/faq/query-the-infrastructure-list-via-the-api/)


```bash:infrastructurelist相当のホスト一覧取得
curl -XGET "https://app.datadoghq.com/reports/v2/overview?api_key=${API_KEY}&application_key=${APP_KEY}"
```

```json:取得結果
{
  "rows": [
    {
      "display_name": "host1",
      "name": "host1",
      "tags_by_source": {
        "Datadog": [
          "default"
        ],
        "Users": [
          "env:prod"
        ]
      },
      "up": true,
      "host_name": "host1",
      "has_metrics": false,
      "id": 335160838,
      "last_seen": 1517730959
    }
  ...
  ],
  "window": "3h:30m",
  "row_type": "host",
  "display_hostname_dropdown": false
}
```

なにげにv2のAPIなんですね。
これってFAQというより普通にAPIドキュメントに書いて欲しい気がしますが、何はともあれ欲しい情報が取れそうです。

### 追記

2018/2/7現在、[Query the Infrastructure List via the API
](https://docs.datadoghq.com/developers/faq/query-the-infrastructure-list-via-the-api/)の紹介にパラメータとして `with_source` というものがありますが、正しくは `with_sources` です。なので、もしこのパラメータを使いたければ `&with_sources=true` と指定する必要があります。公式に問い合わせているので、おそらくドキュメントが修正されると思います。
メモ: pandas で `A + B` という文字から結果を導き、ログ用の文字列も作成する

たとえば次のような df があったとする。

```py
import pandas as pd
df = pd.DataFrame(index=[1,2,3], data={A:[4,5,6],B:[7,8,9]})
```

```pycon
>>> df
   A  B
1  4  7
2  5  8
3  6  9
```

やりたいこと: `A + B` の結果を `C` 列に代入し、 `D` 列に計算の内容を下記のようにログとして保存したい。

```pycon:理想形
   A  B   C                    D
1  4  7  11  C(11) = A(4) + B(7)
2  5  8  13  C(13) = A(5) + B(8)
3  6  9  15  C(15) = A(6) + B(9)
```

下記のようなコードで実現可能。

```py
expr = 'A + B'

# 計算結果を保存
df['C'] = df.eval(expr)

# df の内容で置き換えする関数
def _replace_log(log, v_list):
    for i, v in v_list.iteritems():
        log = log.replace(i, '{}({})'.format(i, v))
    return log
# ログ用の文字列を保存
df['D'] = [_replace_log('C = ' + expr, v) for i, v in df.iterrows()]
```

もっと良いやり方があるだろうか。
Raspberry Piに接続したサーボをリモートで制御する-Windows Clientソフト

#はじめに
[Raspberry Piに接続したサーボをリモート(クライアントサーバモデル)で制御する](https://qiita.com/tlab/items/c6f8544d11e481885063)では、ターミナルからRaspberry Piにテキストメッセージを送信して、サーボモータを制御しました。
![System.png](https://qiita-image-store.s3.amazonaws.com/0/211703/089c7fa2-6c9a-b042-0dcd-9131f1dd2fef.png)

 このプロジェクトではVisual Studio 2017のMFCにて、Windowsのクライアントを作成します。

#画面イメージ
IPを設定して、CONNECTで接続し、スライダバーで設定したい位置を設定し、MOVEを押すことでコマンドを送信します。
![WinClient.png](https://qiita-image-store.s3.amazonaws.com/0/211703/bdf24df9-694d-f348-47d7-016aafcbd48f.png)

#ソース
ソースはgithubにアップしています。

[ソース@github](https://github.com/ekqxa6/RaspServoClient)


#今後
これをクライアントのサンプルとして、今後はOpenCVとの連携を狙っていく予定です。OpenCVはVisualStudio+MFCでの運用を想定しています。

2018/02/04 Ikeda
React NativeのTextInputをインライン要素のように使う方法（よりよい方法求む）

# 概要
React NativeのTextInputコンポーネントをインライン要素のように用いる方法が分からず、試行錯誤した結果1つの方法を見つけたので共有します。
ただ、見つけた方法は素直な方法ではないと思われるので、より良い方法をご存知の方はぜひコメント等お願いします。

# 実現したいもの
ところどころがテキストインプットになっている以下のような文章です。

![49063.jpg](https://qiita-image-store.s3.amazonaws.com/0/157673/a3de8040-d75d-b943-f95b-f3be4478c631.jpeg)


# 実現する方法
`App.js` に以下のように記述すれば実現することができます。
ポイントは

- 親コンポーネントに `flexDirection: 'row', flexWrap: 'wrap'` というスタイルを与える
- 文章を1文字ずつTextコンポーネントにする（実際には配列の `map` などで行う）

の2点です。この2点目のポイントが素直でないので、より良い方法を探しています。

```App.js
import React from 'react';
import { View, Text, TextInput } from 'react-native';

export default class App extends React.Component {
  render() {
    return (
      <View style={{flexDirection: 'row', flexWrap: 'wrap'}}>
        <Text>あ</Text>
        <Text>い</Text>
        <Text>う</Text>
        <Text>え</Text>
        <TextInput style={{width: 40}}></TextInput>
        <Text>か</Text>
        <Text>き</Text>
        <Text>く</Text>
        <Text>け</Text>
        <Text>こ</Text>
        <Text>さ</Text>
        <TextInput style={{width: 40}}></TextInput>
        <Text>す</Text>
        <Text>せ</Text>
        <Text>そ</Text>
        <Text>た</Text>
        <Text>ち</Text>
        <Text>つ</Text>
        <Text>て</Text>
        <Text>と</Text>
        <TextInput style={{width: 40}}></TextInput>
        <Text>に</Text>
      </View>
    );
  }
}

```
Windows + vagrant でansibleを簡単に使う

# 結論
ちょっとずる（？）です。shellを使います。
「邪道だ！」と思うかもしれませんが一番簡単でした。

# 経緯
今まではvagrant + chef で環境構築していましたが、世が「ansible」「ansible」というので挑戦してみようと思った次第です。
yamlでの設定はchefより確かに簡単にかける気がします。また、数多くの方がさまざまなplaybookを公開してくださっているので、必要なモジュールをすぐに組み込めて楽です。（これはchefも一緒か）

で、実際に取り掛かったみたらWindows故のエラーになりましたので頭を切り替えて簡単に解決させようとした備忘録です。


# 作業内容

### vagrant + ansible 環境の設定ファイル作成

基本的にこちらの「[vagrant+ansibleで開発環境を構築する(OSインストール編)](https://qiita.com/ak-ymst/items/07906a5fb3f5fb283386)」を参考に準備しました。

この記事の「Ansibleの動作確認」まで進めたところで以下のエラーに見舞われました。

```  
C:\Users\Project\vagrant>vagrant provision
==> default: Running provisioner: ansible...
Windows is not officially supported for the Ansible Control Machine.
Please check https://docs.ansible.com/intro_installation.html#control-machine-requirements
…略
```  
読んで字のごとくWindowsではansibleがサポートされていない、とのこと。。
~~これだから開発PCでWindowsしか支給できない会社はくそ~~

そんなことを報告したら先輩から一言
「shellは使えるんだから、mount先のvmでansible実行すれば？」

Σ（ﾟдﾟ）


### vmでansibleを実行するshellを実装

```bash:ansible.sh
#!/bin/bash

if ! [`which ansible`]; then
    yum install -y epel-release
    yum install -y ansible
fi

ansible-playbook -vv -i /vagrant/ansible/hosts /vagrant/ansible/playbook.yml
```

で、これをprovisionで実行するようVagrntfileを修正

```text:Vagrantfile
# -*- mode: ruby -*-
# vi: set ft=ruby :

# All Vagrant configuration is done below. The "2" in Vagrant.configure
# configures the configuration version (we support older styles for
# backwards compatibility). Please don't change it unless you know what
# you're doing.
Vagrant.configure("2") do |config|

(中略)

  # Ansible provisioning
  config.vm.provision "shell", :path => "ansible.sh"

end
```

満を持して`vagrnt up`を実行すると、無事にansibleでの環境構築ができました！

shellの`yum install ~~`の部分はホストOSに応じて変更が必要なのが難点ですね。。

以上でWindows + vagrant でもansibleでの環境構築が可能となりました。
pythonのthreadingでスレッド内の変数を上書きする

pythonのthreadingモジュールを使ってスレッド生成後に実行しているスレッドに対して変数の上書きをするメモです。
最終的にやりたかった事は、無限ループ処理が入った複数スレッドを生成した後に、任意のタイミングでスレッドを停止させてみたかったというところがきっかけです。

# threadingドキュメント

[https://docs.python.jp/3/library/threading.html#module-threading](https://docs.python.jp/3/library/threading.html#module-threading)

# スレッド内変数の上書き

```python:example.py
#!/usr/bin/env python3
import threading
import time

class ThreadJob(threading.Thread):
    def __init__(self, v=""):
        threading.Thread.__init__(self)
        self.line = v
        self.kill_flag = False

    def run(self):
        old = ""
        print(self.kill_flag)
        while not(self.kill_flag):
            if(self.line and self.line != old):
                print(self.line)
                old = self.line
        print(self.kill_flag)

if __name__ == "__main__":
    t = ThreadJob()

    # スレッドを実行
    t.start()

    # 実行中のスレッドに対して `line` を上書き
    t.line = "HOGE"
    time.sleep(1)

    # 実行中のスレッドに対して `line` を上書き
    t.line = "FUGA"
    time.sleep(1)

    # 実行中のスレッドを終了する
    t.kill_flag = True
```

`ThreadJob` というサブクラスを作って `__init__` に `line` 変数を生成しています。
スレッド実行すると `kill_flag` が `True` にならない限り無限ループの処理をさせます。
無限処理中に `line` 変数を上書きしています。
最終的に `kill_flag` を `True` にしてWhileから抜け出させます。
生成したスレッドと同期を取っていないので `time.sleep` の力技を使っています。

# 実行

実行すると以下のようになります。

```
$ ./example.py
False
HOGE
FUGA
True
```

# 参考

以下のやり方を使えば `Ctl-C` で生成した複数のスレッドを停止することができそうです。

[https://stackoverflow.com/questions/42247429/python-threads-exit-with-ctrl-c-in-python](https://stackoverflow.com/questions/42247429/python-threads-exit-with-ctrl-c-in-python)
[iOS] NumberFormatter, DateFormatterの用例

```swift:Formatterの用例
// 数値をコンマ付き数字の文字列に変換して返す
func getDecimalStyleString(num: Int) -> String {
    let formatter = NumberFormatter()
    formatter.numberStyle = NumberFormatter.Style.decimal
    
    if let text = formatter.string(from: NSNumber(value: num)) {
        return text
    } else {
        return String(num)
    }
}

// タイムゾーン付きDate文字列を整形して返す
func getFormattedDateString(date: String) -> String {
    let dateFormatter = DateFormatter()
    dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.sssZ"
    
    if let date = dateFormatter.date(from: date) {
        dateFormatter.dateFormat = "MM月dd日(E)HH:mm"
        dateFormatter.locale = Locale(identifier:"ja_JP")
        return dateFormatter.string(from: date)
    } else {
        return date
    }
}
```
JSのジェネレーター関数の書き方まとめ

JSでgeneratorを書くとき、メソッドの記法によって*をどこに書くかわからなくなることがあったのでまとめた。

generatorについて
https://developer.mozilla.org/ja/docs/Web/JavaScript/Guide/Iterators_and_Generators



>ジェネレーター関数は、イテレーターのファクトリーとして働く、特別な種類の関数です。この関数を実行すると、新しいジェネレーターを返します。function* 構文を使用している場合に、関数はジェネレーター関数となります。


## 通常の関数式
```JavaScript
let g = function* () {};
```

これは最も一般的でよく見る形で、functionの後に*をつけるだけなので迷うこともない。


## オブジェクト内の関数
```JavaScript
let obj = {
   *g() {}
};
obj.g()
```

オブジェクト内に関数`g()`があった場合のジェネレーター関数の書き方。
関数名の前に`*`をつける。
呼び出しは`obj.g()`


## 文字列による関数オブジェクト
```JavaScript
const generatorName = 'g';
let obj = {
   *[generatorName]() {}
};
obj.g()
```

オブジェクト初期化子による関数。`generatorName `という関数名を文字列として指定した時。
その場合も関数名の前だが`[]`内にある変数が関数名として評価されるので`[]`外に`*`をつける。
呼び出しは`obj.g()`

## ・クラス内の文字列による関数オブジェクト
```JavaScript
const generatorName = 'g';
class Hoge {
   *[generatorName]() {}
}
new Hoge().g();
```

クラス内に書く場合でも同様に`*[generatorName]`となる。

## Arrow Functionによる関数オブジェクト
できない。

## まとめ
どっかに`*`をつければいい。
mac環境、brewとかpyenvとか 整理

どのようになにをインストールしたのか覚えてなく、環境がグチャグチャしているので、整理した。大胆に整理。なので、何かが壊れるかも。そのときはまた考える。んで今後はbrewに統一します ;(

## brewのuninstall

`ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/uninstall)"`

## pyenvのuninstall

`~/.pyenv の 削除`
bash profileとかの不要なところを直す

## /usr/localの中身の整理

`/usr/local/* の削除`

## もう一度brewのinstall

それで、もう一度brewのインストール。

`/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"`

gitが無いっていうのでgitのinstall
`brew install git`

もともとはpythonのバージョンが何故か上がらずエラーだったので、python最新のインストール。

`brew install python3`

これで一旦は整理完了。
Azure について調べてまとめてみた！₍₍ ◝(・ω・)◟ ⁾⁾

祝  初投稿₍₍ ◝(・ω・)◟ ⁾⁾

>普段は主にPHPの開発やｊQueryの開発をしている
>ひよっこエンジニア(開発歴2年ほど)ですが
最近興味のあるAzure　について調べてみたので
そのまとめを共有したいと思います

## 1. そもそもクラウドとは

いま流行りのワードでAWSやAzureなどとよく耳にするのですが
実際にクラウドってなんですかと聞かれると意外と答えるのが難しいのです。

一言でまとめると**「クラウドとはITリソースの利用形態のひとつ」**だと思います。

![cloud](https://www.fujixerox.co.jp/support/xdirect/magazine/rp1112/images/11121a_02.jpg "cloud")


インターネットなどのネットワークに接続されたリソースを
利用者はサービスとして利用します。

サービスには...

- コンピューター（サーバー）
- ネットワーク
- ストレージ
- データベース
- アプリケーション

などがあります。

### 1-1. 実装モデルの定義について

| 実装モデルの定義 | 説明 |
|:---:|:--:|
|  パブリッククラウド |  ベンダーによって管理されており、一般に公開されている。 |
|  プライベートクラウド |  組織の専用利用のために提供される。オンプレミス※などで仮想化技術を使い、組織内でITインフラを共有する       |
|  ハイブリットクラウド |  2つ以上の異なるクラウドを組み合わせる。パブリックとプライベートが一般的 |
※オンプレミスとは、自社の建物内にサーバーや回線といった設備を構築・運用することです。
![cloud](http://jpn.nec.com/cloud/smb/column/images/04_01.png "cloud")


### 1-2. サービスモデルの定義について

| サービスモデルの定義 | 説明 |
|:-:|:-:|:-:|
|  IaaS |  仮装サーバーを利用して、コンピューティング、ストレージ、ネットワークなどの基本的なリソースを提供 |
|  PaaS |  利用者のアプリケーションを動かすためのプラットフォームをランタイムやツールを合わせて提供 |
|  Saas |  サービス提供者がアプリケーションを提供 |

## 2. Azureの利用メリットって？

* 課題に集中できる
* 柔軟なキャパシティとスケーラビリティ
* 可用性向上のための多様な選択肢
* サービス、システム提供開始までの時間を短縮
* 世界中で利用可能
* 信頼性の高さ

参考　https://cloud.watch.impress.co.jp/docs/special/1095390.html
[iOS] ステータスバーの表示/非表示に対応する

#背景
通常のiOSアプリ開発であればステータスバーの表示/非表示を自分自身で管理できるため、UIの実装にそれほど気を使う必要はありません。ただしiOSアプリ向けのSDKを開発する場合で、かつフルスクリーンで表示する何らかのViewまたはViewControllerを実装しているなら、クライアントアプリ側のステータスバーの表示/非表示の両方の場合に対応する必要があるでしょう。本記事ではアプリ側に何らかのView(ViewController)をフルスクリーンで表示するSDKを開発する場合を想定し、ステータスバーの表示設定に応じてUIを調整する手法を紹介します。

#Constraintの設定

例えばSDK側で実装するViewControllerがNavigationBarを持っている場合、NavigationBarとSuper View（親View）の間にTop Constraintを指定し、propertyとしてコードに登録しておきます。

```swift
@IBOutlet weak var navigationBarTopConstraint: NSLayoutConstraint!
```


#frameとconstraintを調整するメソッドを用意
クライアントアプリ側のステータスバーの表示/非表示はViewControllerのprefersStatusBarHiddenか、UIApplication.shared.isStatusBarHiddenで判定できるため、それらの値に応じてConstraintの値とViewのframeを調整するメソッドを用意します。

```swift:viewのframeとconstraintを調整する
func adjsut(view: UIView, constraint: NSLayoutConstraint) {
    let statusBarHeight: CGFloat = 20
    let margin: CGFloat = (self.prefersStatusBarHidden || UIApplication.shared.isStatusBarHidden) ? 0 : statusBarHeight
    
    constraint.constant = margin
    view.frame = CGRect(x: view.frame.origin.x,
                        y: margin,
                        width: view.frame.size.width,
                        height: view.frame.size.height)
}
```

#使用方法
UIViewControllerのviewDidLayoutSubviewsで上記のメソッドを呼ぶことで、クライアントアプリ側の設定に応じてViewのframeとConstraintを調整することができます。

```swift
override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()
    self.adjsut(view: self.navigationBar, constraint: self.navigationBarTopConstraint)
}
```
Windows Updateで80072f8fエラーでハマったので試行錯誤のメモ

#Windows Updateでハマったので試行錯誤のメモ
　手動でのWindowsUpdateが業務に入っている会社があるそうですよハハハ。
尚、ここでの記録はWindows7 32bit 及び 64bitでうまくいったものです。
###80072f8fエラー
#####WindoswsUpdateを実行→80072f8fエラー
　エラーとしてはPCの内部時計とサーバの時間が大幅にずれている、というものです。そんなはずはないんですけど、確かにタイムサーバーと通信できていないようです。では確実に生きているnict.jpに通信先を変えてしまいましょう。
#####→タイムサーバーをnictに変更　効果なし
　あれ。通信はうまくいき、時間もピッタリですが、再起動しても同一のエラーで引っ掛かります。ここまではよくあります。こういう時はアレの出番ですね。大分改善されたWindowsUpdateトラブルシューティングツール。これだけで大体のUpdate障害は回復します。
　ちなみに、この操作をする前にWindowsUpdateAgentそのものが古い場合がありますので、その場合は最新のMonthlyRollupを走らせておけば大丈夫でしょう。
#####トラブルシューティングツール実行→WindowsUpdateのエラー(未解決)
　おっと。しかし慌てるのはまだ早い。WindowsUpdateトラブルシューティングツールは回復するまで何回も再起動しろって指示がありますからね。何度か再起動してみましょう。
#####再起動を繰り返す→効果なし
　…暗雲が立ち込めてきました。今日は21時には会社を出ようと思っていたのになぁ。事務所に長くいたのがばれるとまた喫煙室で詰められます。どこかシステム情報の破損などが起こっているのでしょうか? MicrosoftFixItを確認し、ServicingStackUpdate(SSU)を実行しろとあるのでこれを頼ってみます。
#####ServicingStackUpdate(SSU)を実行→1つだけダウンロード成功
　スタックしている10本の更新のうち、1つだけ通りましたが、後はダメです。windowsupdateでまた同じエラーが出ています。気づけば事務所のPCの大半のWindowsUpdateが終了し、ドツボにはまっているのは3台だけです。以前WindowsUpdateでドはまりした記憶を掘り起こし、一時ファイルが重すぎてUpdateが走っていなかったことを思い出しました。WindowsUpdate一時ファイルを確認すると1.2GB...これだ!　藁にもすがる思いで一時ファイルを削除します。
#####Windowsの一時ファイル削除して再起動→効果なし
　いよいよヤバくなってきました。そろそろさっさと定時前に客先直帰を宣言した上司に徹夜コールをした方がいいかもしれません。また査定下げるとか言われるんだろうなぁ。
　さて、一時ファイルというセンは悪くないのでは? WindowsUpdateを何度も繰り返しています。実はこのハマっている3台は手近にあるため、定例更新以外にちょくちょくWindowsUpdateをかけている機体なのです。DateStoreにも相当ゴミがたまっているのでは…可能性にかけてwualtを停止、DateStoreを削除してwualtを再起動してみます。
　参考→https://support.microsoft.com/ja-jp/help/875560
#####DateStore削除→WindowsUpdateが走る
　今までの苦労が嘘のようにするっとWindowsUpdateが通りました。いやぁ、こんなことがあるんですねぇ。何が原因で詰まってたんでしょう。ギリギリ終電に間に合うので、取り出していたリカバリディスクをしまってさっさと帰ることにしました。
swift初心者:「this class is not key value coding-compliant for the key」の対処方法

#はじめに
初歩的なエラーかと思いますが、初心者のため記録として残したいと思います。

#`this class is not key value coding-compliant for the key`
`this class is not key value coding-compliant for the key`
上記エラーはStoryboardの接続が芳しくないときに発生するエラーです。
StoryboardからIBOutletやIBActionを以下のようにhogeContorollerに接続した後、

```swift:hogeContoroller
@IBOutlet weak var titleTextField: UITextField!
@IBAction weak var titleTextField: UITextField!
```

の削除を試みた際にhogeControllerのみ@IBOutletや@IBAction接続を削除してしまうと発生します。
必ずcontrollerのみでなく、Storyboardの
`Show the Connections inspecter`上からも接続を解除するようにしましょう。

<img width="４００" alt="スクリーンショット 2018-02-04 16.22.34.png" src="https://qiita-image-store.s3.amazonaws.com/0/226787/379ed02f-92a0-55f2-d0b6-e6b255404443.png">
PWAやってみた

初学者のPWAまとめ
https://qiita.com/wingsys/items/cb149499c21bf1af472a

PWAやってみたメモ1
https://qiita.com/wingsys/items/bb5328487f7e1802a981

PWAやってみたメモ2
https://qiita.com/wingsys/items/98cf196ff32237377a23

というわけで、PWAやってみた。

# 結局どんなん作ったの？
こんなの。

![test.png](https://qiita-image-store.s3.amazonaws.com/0/105453/00e38e3a-e903-3864-3d73-2bb3bd0a188a.png)

……ショボいと言わないでくれ。わかってるんだ。
ただ、重要な点が一つある。
**勘違いしていたけど、PWA最大の特異性はPushではなく、やっぱりOfflineで動く点だったんだ**。

# 一番参考になった資料は？
Google様直々のハンズオンが一番だった。
https://codelabs.developers.google.com/codelabs/your-first-pwapp/#0

ソースは……ちょっと出来がアレなので非公開で……

# Offlineで動く点 って？
今回、元々はPush通知を利用し、Todoの時間が来た時に通知を出すつもりだった。
しかし、firebaseの理解に手間取ったのでやめた。とにかく動かすことを優先した。

そしてfirebaseにdeployして、AndroidでHomeへ置いてみて、firebase projectを落として気づいた。
**サーバ、もうないのに動いてるじゃん**。

もちろん、これは当然のことだ。
機能を削減したこともあって、今回作ったものはその全てがキャッシュされ、キャッシュとlocalStorageだけで完結するようにしてある。
だから、キャッシュとlocalStorageだけで動いた。それだけのことだ。

![test1.png](https://qiita-image-store.s3.amazonaws.com/0/105453/cef3f0bb-faa0-023d-3888-0b97dbeade4d.png)
(Androidのホームに足した状態。左上のオレンジのやつだ。サーバは落としてあるが、この状態でも使えた)

**だけど、それが画期的なことなんだと今更気づいた**。**Webアプリが** (限定的とはいえ) **ローカルオンリーで動くことの意味は小さくない**。

極端な話、**ローカルに寄せたWebアプリを基本無料で売り出して、アップデートはサブスクリプションで、ということだってできる**。ということが、作ってみて今更わかった。

作ってみるとわかる。PWA、思ったより、すごい。

(もっとも、キャッシュできる容量の問題もあるし、あまり強烈なものを組むのは難しい。しばらくはネイティブのままだろう、という気もする)
Latexit でKeynote,Powerpointに綺麗な数式を貼ろう！(導入から日本語対応まで)

みなさん、プレゼン資料に数式を貼る時どうしていますか？
・パワポであれば数式エディタを使う
・その数式が書いてあるPDFをスクショして使う
などでしょうか？
 
残念ながらKeynoteには数式エディタの機能は無いようです。
そんな時にLatexitの登場です！
 
Latexitを使えばこのように、綺麗に数式を貼ることができます。

<img width="500" alt="スクリーンショット 2018-02-04 14.19.06.png" src="https://qiita-image-store.s3.amazonaws.com/0/182836/74c4b972-ed0d-0288-c0f7-45a18dc40cb6.png">

では、実際に使ってみましょう！

## 1.install
```brew cask install latexit```
でインストールできます。
brewって何？って人はこちらから参照してbrewをインストールしてください。
>[Homebrewインストール手順](https://qiita.com/rabbit1013/items/1494cf345ff172c3b9cd)

## 2.使い方
latexitを開いて
<img width="350" alt="スクリーンショット 2018-02-04 13.50.27.png" src="https://qiita-image-store.s3.amazonaws.com/0/182836/1c2fd223-d04b-301c-54cd-cdf84928dcf4.png">


tex形式で数式を打ち込んで
<img width="350" alt="スクリーンショット 2018-02-04 13.52.27.png" src="https://qiita-image-store.s3.amazonaws.com/0/182836/0d555cee-cd44-a853-7d5e-9f6508d56995.png">

### **Latex it!**
<img width="350" alt="スクリーンショット 2018-02-04 13.56.49.png" src="https://qiita-image-store.s3.amazonaws.com/0/182836/30d8ae68-90ae-091b-b7fe-a6bdf3f64d01.png">

できました！
<img width="350" alt="スクリーンショット 2018-02-04 13.52.45.png" src="https://qiita-image-store.s3.amazonaws.com/0/182836/9b1c16dd-0a9b-f437-3d42-79bfa1c0c926.png">


上の表示された数式はもう画像化されているのでKeynoteにコピペすれば綺麗な数式を貼ることができます。
<img width="350" alt="スクリーンショット 2018-02-04 13.54.38.png" src="https://qiita-image-store.s3.amazonaws.com/0/182836/3dbf2477-2b09-66da-5cdc-93a450f13e82.png">



簡単ですね！


## 3.日本語対応について
Latexitで数式と日本語を組み合わせようと思ったら、
日本語を書くために
\mbox{}, \text{}
などがありますが、インストールしてそのまま実行しようとすると、
Package inputenc Error Unicode
とエラーが出てしまいます。
 
回避方法としては、
Latexitの環境設定を開き
プログラムのタブをクリックすると、
デフォルトでは、pdflatexになっていると思います。
これを**latexit+dvipdf**に変更します。
 

次に、下のディレクトリ指定を
**Latexit: /usr/local/texlive/2017/bin/x86_64-darwin/platex**
**dvipdf:/usr/local/texlive/2017/bin/x86_64-darwin/dvipdfmx**
に指定します。
2017のところはあなたがダウンロードしたversionに合わせてください。
<img width="350" alt="スクリーンショット 2018-02-04 14.39.52.png" src="https://qiita-image-store.s3.amazonaws.com/0/182836/16d83754-a620-e614-48fa-c76656da9013.png">


これでこのように日本語もきちんとLatexitで打てるようになりました。
<img width="350" alt="スクリーンショット 2018-02-04 14.08.08.png" src="https://qiita-image-store.s3.amazonaws.com/0/182836/344426b9-3cb6-6efc-171d-1ec4e1227c06.png">
 



### おまけ
今回の本筋とは全く関係ないですが、例で示した資料は非負値行列因子分解(Non-negative Matrix Factorization)という次元削減の手法に関してまとめていた時のものです。
興味がある方はこちらをどうぞ。
>[NMF: Non-negative Matrix Factorization（非負値行列因子分解](https://abicky.net/2010/03/25/101719/)
railsで効率的なクエリを作るためのtips5選

ActiveRecordは便利だけど、どんなSQLが発行されてるかデータベースへの不要なアクセスをしていないかなどを意識してより効率的なクエリを作っていきましょう╭( ･ㅂ･)و ̑̑

# selectとpluck
値が欲しいだけなら`pluck`を使うべきだけど、メソッドも使いたい場合は`select`を使ったほうが良い。

* `select`は選択したフィールドを取り出しモデルのメソッドとリレーションにアクセスできるモデルオブジェクトが返ってくる。
* `pluck`は選択したフィールドを取り出し値の配列を返すのでメモリは少なくなる。

# ActiveRecordのクエリメソッドよりRubyメソッドを使う
クエリメソッドの代わりにRubyメソッドを使うことが出来るなら不要なデータベース呼び出しを減らせる。
例えば`count`ではなく`length`を使うようにする。

# eager_loadを使ってN+1クエリを防止する
includesやeage_loadを正しく使ってN+1クエリが発行されないように注意する。
詳細は下記リンクの記事を読むと理解が深まる。

* [ActiveRecordのjoinsとpreloadとincludesとeager_loadの違い](https://qiita.com/k0kubun/items/80c5a5494f53bb88dc58)

``` ruby
# このコードではクエリが11回も発行されてる。
translators = Translator.first(10)
translators.each do |translator|
  translator.books.pluck(:title)
end

# `includes(:posts)`を使うことによってクエリを1回にして解決することが出来る。
translators = Translator.first(10).includes(:books)
translators.each do |translator|
  translator.books.pluck(:title)
end
```

# find_eachを使う
大量のメモリを消費する場合、パフォーマンスが低下する。
そういうときは`find_each`を使ってレコードを分割取得して処理すると良い。


# 複数レコードの更新をまとめて行う
同じ値で複数レコードを更新する場合は下のコードで実現できる。

``` ruby
User.where(is_admin: true).update_all(is_admin: false)
```

異なる値で複数レコードを更新したい場合は単一のクエリでは不可能だしパフォーマンスが低くなる。
だけどトランザクションブロックにラップすると、すべてのレコードが一度に更新されず、同じ量のクエリが実行されてもトランザクションは1回だけのコミットになるためパフォーマンスが向上する。

``` ruby
# ラップされていない
20.times do |i|
  Book.update(title: "UPDATE_TITLE#{i}")
end

# トランザクションで更新をラップする
ActiveRecord::Base.transaction do 
  20.times do |i|
    Book.update(title: "UPDATE_TITLE#{i}")
  end
end
```
TensorFlow (1.0系) での Global Average Pooling の汎用的な書き方

> TensorFlow 2.0系では `tf.keras.layers.GlobalAveragePooling2D()` で完了します。
> 一応 2.0 系でも似たような書き方はできますが、よほど特殊なレイヤーでなければ必要ないはずです。

# TensorFlow での Global Average Pooling の汎用的な書き方

検索しても見つけられなかったので書きました。参考になっていただければ幸いです。
`Global Average Pooling` に関しては、ネット上に秀逸な記事が豊富なので説明は省きます。

入力と出力のテンソル形状が判明している場合は (MNIST など)

`x = tf.nn.avg_pool(x, ksize=[1,7,7,1], strides=[1,1,1,1], padding="VALID")`

のような書き方がありますね。(変数 `x` は処理するテンソルです)

しかし入力画像がフリーサイズの場合、上記の方法だとカーネルサイズを合わせることができずにうまく行きません。
そこで、個人的に以下の書き方で `Global Average Pooling` を実装しているので紹介します。
他にも色々な方法があると思いますが、その一つだと思ってくれれば幸いです。

# 書き方

* 想定する入力の shape: [バッチサイズ, 高さ, 幅, チャンネル数]
* 想定する出力の shape: [バッチサイズ, チャンネル数] 

以下の関数で記述できる。

```py3
def global_average_pooling(x):
    for _ in range(2):
        x = tf.reduce_mean(x, axis=1)
    return x
```

# 解説

`tf.reduce_mean` によってだるま落としのようにテンソルを削り、平均を取る。

# 例

例えば、Cifar-10 のような 10クラス分類に使う場合、`Global Average Pooling` の前に カーネルサイズ `1x1` の `Convolution` などの方法で 10チャンネルにしましょう。
その後、Global Average Pooling をすることでテンソルの形状が `[バッチサイズ, 10]` になります。
後は `Softmax` 等にかけて出力しましょう。

# おわりに

説明不足であればコメントで対応します。
実装におかしな点があればこちらもコメントで対応します。
Dartを使って、Flutter と Html5 上で Audio を再生したみた。

Dart は、 サーバーサイド、 Html5、 iOS、 Android で 動作します。
Android と iOS は [Flutter](https://flutter.io/) を利用します。 Html5 は [WebDev](https://webdev.dartlang.org/)を利用します。

残念ながら、Web用、スマートフォン用で APIが違います。
そこで、Html5 と Flutter で、同じInterface で 動作する　Audio Package を作成してみました。 

# ことはじめ
今、実験的に Html でも、 Flutter でも動作可能な、ゲームフレームワークを、作成しています。
Flutter のベースとなった Skyのさらにベースとなった MOJO を利用することで、
Flutter で Audio を再生できました。

しかし、流石に、メンテナンスがされていなことなどから、このAPIは廃止されてしまいました。

Andorid/iOS用の Plugin を書いて対応するようにとの事、

Audio Player を作成して見ることにしました。


# こんな感じにした

https://github.com/kyorohiro/umiuni2d_media/

Interface を以下のように切りました。


```media.dart
library umiuni2d_media;

import 'dart:async';

abstract class MediaManager {
  String get assetsRoot;
  Future<MediaManager> setupMedia(String path);
  Future<AudioPlayer> loadAudioPlayer(String playerId, String path);
  Future<AudioPlayer> createAudioPlayer(String playerId, String path);
  AudioPlayer getAudioPlayer(String id);
}

abstract class AudioPlayer {
  String get playerId;
  String get url;
  Future<AudioPlayer> prepare();
  Future<double> getCurrentTime();
  Future<AudioPlayer> seek(double currentTime);
  Future<AudioPlayer> play();
  Future<AudioPlayer> pause();
  FutureOr<AudioPlayer> stop();
  Future<double> getVolume();
  void setVolume(double v);
}
```

で、Html5とFlutter上で動作させました。

![スクリーンショット 2018-02-04 2.15.01.png](https://qiita-image-store.s3.amazonaws.com/0/54192/48820e77-6ab5-02ef-9010-3545db4d9fe9.png)




# 利用した API

Android は、android.media.MediaPlayer　を を利用してAudioを再生しました。
iOSは、AVFoundation の AVAudioPlayerを利用しました。
Html5 用には、WebAudio を利用しました。


# つまずいた点
pubspec.yaml に Html5 用のと、 Flutter 用ので、共用できませんでした。　2.0.0-dev.15.0で、
そのため、 3つのpackage を用意する必要がありました。
- Interface だけを定義した　package
- Flutter 用の plugin 
- Html5 用の package




おわり

# REF

ということで、 Html5 と Flutter 上で動作する Audio Package 
https://github.com/kyorohiro/umiuni2d_media/

以下でもアレコレ書いています。
https://medium.com/@kyorohiro_72753/dart-x-flutter-memo-ex-4-lets-make-tiny-audio-library-for-flutter-and-html5-2034aada2daf