OmniAICreator/Qiita-1.07M huggingface dataset:
Swiftのココが解らない新人プログラマーのメモ

# これなに？
30歳でも新人は新人。
Swiftの基礎を勉強しながら、社内で活用されているRxと奮闘。
そんな、新人プログラマーの悩みどころを書いていき、解決策を追記していきたい。
ベテランプログラマーさんは、新人の悩みどころが分かるかもしれない...?

ですので、この記事は更新してブラッシュアップしていきます。

## 困ったさんポイント
・`enum`ってなに？どんな場面で使うの？
・`protocol`の使い方。
・`delegate`とは何？

## ▼`enum`ってなに？どんな場面で使うの？
私はこう使った。
あるデータは`String型`で定義されており、
毎回、文字列を書いて比較するのは修正箇所が増えると考え、
ここで定義した内容を共通項目として扱いたかった。

```swift
// itemStringDataのデータを比較するためにStringとした
enum itemList : String{
    // 値A
    case itemA = "A"
    // 値B
    case itemB = "B"
    // 値C
    case itemC = "C"
    // 値D
    case itemD = "D"
    // 値E
    case itemE = "E"
}

...別な箇所で

// itemStringDataは文字列なのでenumを使って判断させたい。
 switch itemStringData {

 case itemList.itemA.rawValue:
     return 処理
     
 case itemList.itemB.rawValue:
     return 処理

 case itemList.itemC.rawValue:
     return 処理
     
 default:
     return 処理
 }
```
しかし、このコードはコードレビューでNGを食らった。
理由は、`文字列比較をしている`からとのこと。
そもそも、enumを共通項目として定義し文字列比較を統一したかったのだが、それが間違いだったようだ。

enumの正しい使い方は一体...困った。
### どうあるべきか？

参考にさせて頂いた記事
[【Swift】列挙型（enum）を.rawValueなしで呼ぶにはcaseを使わない](https://qiita.com/mshrwtnb/items/50e8f5593b7beaaf2cdf)
コメント欄が主軸のお話。

`enum`を使った比較は、`enum`に変換して比較する。
比較対象が増えたりした場合、`enum`を修正すればいいし、
ヘンテコなデータが来てもしっかりと弾いてくれる。

## ▼`protocol`の使い方。
共通項目として明示的に定義して使う。
その認識は間違っているのだろうか。

```swift
protocol Hoge {
//プレイヤーの装備情報
 func soubi()
}

extension Hoge {

 func soubi(){
 //共通処理
 }

}

struct Moge: Hoge{
 func soubi()
}
```
`protocol Hoge`を書くことで、明示的に共通項目`soubi`があることが分かる。
という感覚。
`MVC`や`MVVM`、`Clean Architecture`などのそれぞれの層での受け渡しはProtocol化？
んー利点や理由がよくわかっていない。

### どうあるべきか？
理解が深まり、自分で飲み込めたらここに考え方と正解を書く。

## ▼`delegate`とは何？
さっぱり。
他の方の記事みてる程度...
処理を代行して行なう。
それだけ、使い道もわからん。

### どうあるべきか？
理解が深まり、自分で飲み込めたらここに考え方と正解を書く。


##### こんな感じで、Swiftの基礎もよくわかっていないので、色々書き留めていきたい。😢
DateTimeクラスとDateTimeImmutableクラスの違いを理解する

## 概要
自分はミュータブルとイミュータブルの違いも分かっていませんでした。
そんな私がDateTimeクラスでハマったことがあったので、これを機会に理解していきます。

## 特徴
### [PHP: DateTime - Manual](http://php.net/manual/ja/class.datetime.php)
DateTimeクラスはミュータブルらしいです。

>ミュータブルとは
>オブジェクトで、作成後も状態を変えることができる。

### [PHP: DateTimeImmutable - Manual](http://php.net/manual/ja/class.datetimeimmutable.php)
DateTimeImmutableクラスはイミュータブルらしいです。

>イミュータブル
>オブジェクトで、作成後は状態を変えることができない。

ふむふむ…。
[イミュータブル - Wikipedia](https://ja.wikipedia.org/wiki/%E3%82%A4%E3%83%9F%E3%83%A5%E3%83%BC%E3%82%BF%E3%83%96%E3%83%AB)によると、ミュータブルとイミュータブルの違いは、オブジェクト作成後にその状態を変えられるかどうかが違いのようです。
これがどのように影響していくるか、次の章で確認してきます。

### 動作検証
まずは特定の日付でそれぞれのオブジェクトを作成し、14日前の日付に変更します。

```php
$date = new DateTime('2018-04-25');
echo 'DateTime : ';
echo $date->modify('-14 day')->format('Y-m-d H:i:s') . PHP_EOL;

$dateImmu = new DateTimeImmutable('2018-04-25');
echo 'DateTimeImmutable : ';
echo $dateImmu->modify('-14 day')->format('Y-m-d H:i:s') . PHP_EOL;
```

```bash:実行結果
DateTime : 2018-04-11 00:00:00
DateTimeImmutable : 2018-04-11 00:00:00
```
このときはどちらも同じ結果となります。
これだけの処理ならミュータブルなDateTimeクラスでも不都合はありません。
では、特定の日付を起点に、14日前の日付と30日前の日付を生成してみましょう。


```php
$date = new DateTime('2018-04-25');
echo 'DateTime : ';
echo $date->modify('-14 day')->format('Y-m-d H:i:s') . PHP_EOL;
echo $date->modify('-30 day')->format('Y-m-d H:i:s') . PHP_EOL;

$dateImmu = new DateTimeImmutable('2018-04-25');
echo 'DateTimeImmutable : ';
echo $dateImmu->modify('-14 day')->format('Y-m-d H:i:s') . PHP_EOL;
echo $dateImmu->modify('-30 day')->format('Y-m-d H:i:s') . PHP_EOL;
```

```bash:実行結果
DateTime : 2018-04-11 10:35:19
2018-03-12 10:35:19
DateTimeImmutable : 2018-04-11 10:35:19
2018-03-26 10:35:19
```

どちらも2018-04-25を起点にしていますが、実行結果が変わりましたね。
2018-04-25の30日前は2018-03-26なので、DateTimeImmutableクラスが正しい結果となります。

DateTimeクラスはミュータブルなため、14日前の日付を生成した際に、ベースの日付が変わってしまい、14日前の日付から30日前の日付を生成してしまっています。
DateTimeImmutableクラスはイミュータブルなため、14日前の日付を生成した際にも、ベースの日付が変わらず、ベースの日付から30日前の日付を生成しています。

以上のことから、

DateTimeクラス → 日付計算を行うときに注意が必要
DateTimeImmutableクラス　→　日付計算もいい感じにしてくれる

と言えるかなと思います。

### 最後に
DateTimeクラスとDateTimeImmutableクラスでは、オブジェクト作成後の動きが違い、そのため特定の操作を行うときに挙動が変わることがわかりました。

自分は、DateTimeクラスで上記の動きにハマったことがあり、今回の調べてみました。
日々のちょっとした疑問も調べてみると良いことがあるなと思いました。

以上、最後まで読んで頂きありがとうございました。
環境変数について (身内向け)

今回頂いた質問の要約は以下の通り。

> *環境変数* とは何でしょうか。
> *変数* は, 「CPU が使う数字や文字を入れる箱のようなもの。」
> というイメージです。
> *環境変数* は Linux 用の箱, と考えればよいのでしょうか。

Yes, だいたい合ってる。
Linux の設定が入っている箱, というイメージでとりあえず OK.

## 実験: LANG 環境変数について

CentOS にログインして `$ ls -l /` というコマンドを実行すると,
ディレクトリーの一覧が出力される。

![WS000000.PNG](https://qiita-image-store.s3.amazonaws.com/0/124605/73f39849-fd1a-6e45-856f-7089239d865e.png)

注目するべきは, タイムスタンプ (日時) が **12月 15** と日本語で表記されている。
これは, **LANG** という環境変数に, 日本語を表す *ja_JP.UTF-8* という文字列が設定されているためである。

環境変数は `$ echo ${LANG}` といったコマンドで確認できる。
頭にドルマーク ($) を付けるのがポイント。中括弧は有っても無くても OK.

![WS000001.PNG](https://qiita-image-store.s3.amazonaws.com/0/124605/14285b77-7b3a-c58a-7cc4-b17b1baa45ea.png)

そこで, LANG 環境変数に英語を表す *C* を設定してみよう。
環境変数の設定はイコール (=) で設定できる: コマンドは `$ LANG=C` となる。

![WS000002.PNG](https://qiita-image-store.s3.amazonaws.com/0/124605/47b2a728-6245-859c-8f32-3856169a845e.png)

その上で再度, `$ ls -l /` というコマンドを実行すると,
*12月 15* と出力されていた文字列が **Dec 15** と表記されていることがわかる。

![WS000003.PNG](https://qiita-image-store.s3.amazonaws.com/0/124605/1f3c9f63-d84b-d811-9f25-9b2b410f101d.png)

以上
AV1 specification を読む 2018-04-17 (7.10.2.1. Rounding Variables Derivation Process)

#AV1 specification 日本語訳 (2018-04-17)

2018-04-17

この節では、演算途中での丸めをする桁の位置を計算しています。
内部演算精度16ビットを超えないよう、ビット深度に依存して桁を調整しています。

----

#### 7.10.2.1. Rounding Variables Derivation Process

The input to this process is a variable isCompound.

この処理の入力は isCompound です。

> The rounding variables InterRound0, InterRound1, and InterPostRound are derived as follows:
>
> * InterRound0 (representing the amount to round by after horizontal filtering) is set equal to 3.
> * InterRound1 (representing the amount to round by after vertical filtering) is set equal to ( isCompound ? 7 : 11).
> * If BitDepth is equal to 12, InterRound0 is set equal to InterRound0 + 2.
> * If BitDepth is equal to 12 and isCompound is equal to 0, InterRound1 is set equal to InterRound1 - 2.
> * InterPostRound (representing the amount to round by at the end of the prediction process) is set equal to 2 * FILTER_BITS - ( InterRound0 + InterRound1 ).

丸め変数 InterRound0, InterRound1, InterPostRound を以下のように求めます。

 * InterRound0=3 （水平フィルタ後の丸め量）
 * InterRound1=( isCompound ? 7 : 11) （垂直フィルタ後の丸め量）
 * BitDepth==12 ならば、InterRound0 = InterRound0 + 2
 * BitDepth==12 && isCompound==0 ならば、InterRound1 = InterRound1 - 2
 * InterPostRound=2 * FILTER_BITS - ( InterRound0 + InterRound1 )　（インター予測終了時の丸め量）

> Note: The rounding is chosen to ensure that the output of the horizontal filter always fits within 16 bits.

注意：
水平フィルタ出力が16ビット以内に収まるよう、丸め量が選択されています。
iOS＋Monaca＋iframeで、フォーム入力時にページの頭に飛んでしまう問題の対処

# 概要
Monacaで開発したアプリをiPhoneで動かした際、iframeに埋め込んだフォームを入力しようとすると、
入力項目をフォーカスした瞬間に、ページの頭に飛ばされ続けました。
その対処法を記録しておきたいと思います。

# 環境
Cordovaバージョン 7.1.0
Onsen UI 2
iPhone 8

# 対処法
以下をiframeで埋め込まれる側のcssに記載しました。これでページトップに飛ばされなくなりました。

```css
html, body{
  overflow: auto !important;
  height: 100% !important;
  -webkit-overflow-scrolling: touch !important;
}
```
選択リストの使用

日本でsalesforceを使って、開発する際に、選択リストはよく使用されると思います。
しかし、日本だからこそ、注意する必要があります。
それは、オブジェクト設定する時に、つい、選択リストの値と参照名が同じの日本語の漢字になってしまうことです！！！

では、選択リストの使用について共有させていただきます。間違えたら、ご指導をよろしくお願いいたします。


>[関連ナレッジ](https://help.salesforce.com/articleView?id=000249492&language=ja&type=1)

>**説明**	
この記事は、2017 年 1 月 18 に公開された Salesforce Developers Blog の記事 ”Keeping Picklist Integrations Safe by Using API Names” を翻訳したものです。https://developer.salesforce.com/blogs/developer-relations/2017/01/keeping-picklist-integrations-safe-using-api-names.html


>**解決策**	
現在に至るまで、システム管理者は常に選択リスト値を変更した際、その値を参照しているデータインポートおよびエクスポート、Apex、SOQL などのインテグレーションを更新する必要がありました。Spring ‘17 リリースにおいて、弊社はお客様の選択リストのインテグレーションを守るために、この挙動を変更します。現時点から、それぞれの選択リスト値は表示ラベルと API 参照名で表されます (名前と値のペアのデータ表現に似ています)。
 
選択リスト値の表示ラベル - ユーザインターフェースを介してレコードに表示されます
選択リスト値の API 参照名 - メタデータレベルで内部的に使用されます

#SFDCの選択リスト
- 選択リストの構成
  選択リストは「値」と「API参照名」で構成され、イメージは画像のようになります<img width="699" alt="Screen Shot 2018-04-27 at 0.01.18.png" src="https://qiita-image-store.s3.amazonaws.com/0/253302/f8e780bd-9a57-ed50-5f98-077fe6341027.png">

この値の部分は、オブジェクトを設定する際に、日本国内であれば、案件はほとんど、日本語になるのが
当たり前となり、そこで、値はAPI参照名と同じになり、そのまま漢字になるわけ

しかし、このAPI参照名を設定できる、開発名のように設定し、使える

サンプルは下記の画像のように
<img width="688" alt="Screen Shot 2018-04-27 at 0.06.53.png" src="https://qiita-image-store.s3.amazonaws.com/0/253302/cf062f9c-a266-8951-6c31-672d29f1e615.png">

上記の画像のように設定した選択リストはアカウントの項目とする
項目のAPI名はUpsellOpportunity__cとする

APEXコードで値を設定する時に
`1:  Account. UpsellOpportunity__c = 'Maybe';`
と書く、値が「可能」となる

それでは、投稿人　朱でした！
【Draft版公開】Machine Learning Yearning 6章 by stanford大学Andrew Ng教授

現在、AIや機械学習界隈で最も有名なスタンフォード大学のAndrew Ng教授が、「Machine Learning Yearning」という書籍を執筆中です。2018年4月18日に、そのドラフト版（1-14章）が公開されました。
この投稿では、いち早く本書籍を翻訳しました。

http://www.mlyearning.org/
![図1.png](https://qiita-image-store.s3.amazonaws.com/0/188414/741778bb-9523-9feb-736b-6bd5aedc42e6.png)

この本は、機械学習プロジェクトの構築方法を提供します。また、機械学習アルゴリズムを教えるのではなく、機械学習アルゴリズムが機能する方法に焦点を当てています。

本投稿は、6章の翻訳になります。少しづつ翻訳していきます。

##### **1～5章の翻訳**
[【Draft版公開】Machine Learning Yearning 1～5章 by stanford大学Andrew Ng教授](https://qiita.com/Ishio/items/2096b8806a20c8ca52be)

##### **7-8章の翻訳**
[【Draft版公開】Machine Learning Yearning 7～8章 by stanford大学Andrew Ng教授](https://qiita.com/Ishio/items/94a73dcba8bdde25e48b)

##### **9-10章の翻訳**
[【Draft版公開】Machine Learning Yearning 9～10章 by stanford大学Andrew Ng教授](https://qiita.com/Ishio/items/f074a6609ae034762150)

##### **11-12章の翻訳**
[【Draft版公開】Machine Learning Yearning 11～12章 by stanford大学Andrew Ng教授]
(https://qiita.com/Ishio/items/35c756e073a1f2f1d244)

本書籍は、とても読みやすく、かつ各章短めに記載されています。

## **6.Your dev and test sets should come from the same distribution（開発/テストセットは同じ分布にするべき）**
あなたの猫アプリの画像データは、米国、中国、インド、その他の4つの地域に分けられます。開発セットとテストセットを考え出るとき、開発セットに米国とインドを配置し、中国、その他の国々はテストセットとして提供するかもしれません。
言い換えると、4つの地域のうち2地域のデータを開発セットにランダムに割り当て、残りの2つの地域をテストセットに割り当てることができます。

開発セットとテストセットを定義したら、あなたのチームは開発セット上のパフォーマンスを向上させることに集中します。 したがって、開発セットは、最も向上したいタスクを反映する必要があります。4つの地域のデータでうまくいく必要があります。2つの地域データだけでなく。
2つ目の問題は、開発セットとテストセットで、異なる分布を持っていることです。
開発セットでうまく働く分類器を構築できても、テストセットではうまくいきません。
私は多くのフラストレーションと無駄な努力を伴うこの結果をこれまで見てきました。この事象があなたに発生しないようにしてください。例として、あなたのチームが、テストセットではなく開発セットでうまく動作するシステムを開発したとします。仮にあなたの開発セットとテストセットが同じ分布であるならば、何がうまくいっていないかを明確に診断できます。明らかな改善方法は、より多くの開発セットデータを収集することです。
しかし、開発セットとテストセットが異なる分布から生成されている場合、あなたの選択はあまり明確ではありません。いくつかのことが間違っている可能性が高いです。

1. 開発セットに対してオーバーフィットの可能性があります。
2. テストセットは開発セットより困難な状況である場合。実はあなたのアルゴリズムは期待通りにやっているかもしれません。それ以上の改善はありません。
3. テストセットは必ずしも困難な状況ではないが、開発セットと異なる分布である場合。だから、開発セットでうまく機能することが、テストセットではうまくいきません。この場合、開発セットのパフォーマンスを向上させるための多くの作業が無駄になります。

機械学習のアプリケーションの動作は非常に難しいです。開発セットとテストセットの分布が不一致である場合、開発セットの分布を改善することでテストセット上でのパフォーマンスが向上するかどうかは、さらに不確実となります。開発セットとテストセットの分布が一致しない場合、何が機能し何が機能していないかを明らかにすることが難しくなり、作業の優先順位を決めることが困難になります。
ある分布で訓練され、他の分布にも一般化された学習アルゴリズムを開発することは、重要な研究課題の一つです。でも、あなたの目標が研究の進展を促進することではなく、特定の機械学習アプリケーションをよりよくすることであれば、同じ分布から導かれた開発/テストセットを選ぶことをお勧めします。これにより、チームがより効率的になります。
Fortran2003の自動割付けに足を取られた

Logicalの2次元配列をAllocatableな変数に代入してもAllocatedになっていなかった？(4/26現在確認中)

# 条件

* Windows10 
* gfortran 5.4.0 build by MinGW-W64

# 起こったこと

以下のようなコードを実行したところ実行時エラーを吐いた．

```Fortran:

logical,dimension(:,:),allocatable :: mask
integer,dimension(:,:),allocatable :: array
integer :: i,j

allocate(array(100,100))

do j=1,100
  do i=1,100
    array(i,j) = (j-1)*100+i
  enddo
enddo

mask = (array == 7)

do j=1,100
  do i=1,100
    if (mask(i,j)) then
      print *,array(i,j)
    endif
  enddo
enddo

deallocate(array)
deallocate(mask)

```

# 結論

1. gfortran5.4.0では配列の自動割当時にはAlocattedされない？
2. 動的に配列を使うときは，きちんと割り当ててから使おう！
3. 新しい機能を使うときは挙動を確認しよう！
AutoencoderでDeconvolutionとUpSamplingの比較をしてみました

最近物体検出していたが、そこでDSSDなるものが性能いいよという記述を見つけたので、その準備として、Deconvolutionって、UpSamplingと具体的にどっちがどうなの？？
ということで、Autoencoderに両方使って出てきた画像を比較してみました。

コードは以下にようなものです。
[AutoEncoder / AutoEncoder_Deconv.py](https://github.com/MuAuan/AutoEncoder/blob/master/AutoEncoder_Deconv.py)

【参考】
[リアルタイム物体検出向けニューラルネット、SSD(Single Shot Multi Detector)及びその派生モデルの解説](http://segafreder.hatenablog.com/entry/2018/03/11/152515)
[DSSD : Deconvolutional Single Shot Detector](https://arxiv.org/abs/1701.06659)（論文）
Cheng-Yang Fu, Wei Liu, Ananth Ranga, Ambrish Tyagi, Alexander C. Berg
(Submitted on 23 Jan 2017)

###KerasDocumentationによれば
Decovolutionとは以下のリンクのとおりです。
[Conv2DTranspose](https://keras.io/layers/convolutional/)
そして、イメージが以下にありました。
[ニューラルネットワークにおけるDeconvolution](https://qiita.com/shngt/items/9c86e69e16ce6d61a0c6)

###使い方
モデル部分のコードは以下のとおりです。

```py
def encoded(input_img,dim_factor):
    x = Convolution2D(64, (3, 3), activation='relu', padding='same')(input_img)
    x = MaxPooling2D((2, 2), padding='same')(x)
    x = Convolution2D(128, (3, 3), activation='relu', padding='same')(x)
    x = MaxPooling2D((2, 2), padding='same')(x)
    encoded = Convolution2D(8*dim_factor, (3, 3), activation='relu', padding='same')(x)
    return encoded

def decoded(encoded,dim_factor):
    x = Convolution2D(8*dim_factor, (3, 3), activation='relu', padding='same')(encoded)
    #x = Conv2DTranspose(128, 9, 9, activation='relu',   border_mode='valid')(x)
    x = UpSampling2D((2, 2))(x)
    x = Convolution2D(128, (3, 3), activation='relu', padding='same')(x)
    #x = Conv2DTranspose(64, 17, 17, activation='relu', border_mode='valid')(x)
    x = UpSampling2D((2, 2))(x)
    decoded = Convolution2D(3, (3, 3), activation='sigmoid', padding='same')(x)
    return decoded
```

つまり、#で消している部分を入れ替えれば同じような役割で機能してくれます。
今は通常のUpSampling版というわけです。
ある意味、無理やりUpSamplingと同じサイズになるようにパラメータを合わせてみました。

###結果
Deconvolution版の実行結果は以下のようになりました。
![deconv_AE.gif](https://qiita-image-store.s3.amazonaws.com/0/233744/5c880044-ca47-caad-6512-f4ea5960b9f4.gif)

そして、通常のUpSampling版は以下のようになりました。
![ordinary_AE.gif](https://qiita-image-store.s3.amazonaws.com/0/233744/157bc486-9cdf-e20e-ea2f-ab74c60850da.gif)

両者を比較すると一目瞭然です。
UpSamplingバージョンの方が綺麗です。
ちなみに、中間層の次元は同じなので今回に限っては両者の変換の仕組みが効いていると言えそうです。
【参考】
[CapsNetで遊んでみた♬～Autoencoderと比較すると～](https://qiita.com/MuAuan/items/43f0af43d441b58ecc2b)

###まとめ
ということで、DSSDなどで使う場合は、UpSamplingでやってもいいように思います。
ただし、必ずしもサイズを倍にしたい場合だけではないので、Decovolutionの方がサイズの自由度が高く、こちらがフィットする場合もありそうです。
Rustでfor文を使わないでRangeとかVecとかスライスを処理する方法

※2018年6月21更新：Rust 1.26以降(Inclusive rangeを使用)

# はじめに
forとか書かなくていいなら書かないほうがよくない？？？？？？

もちろん、書いたほうが読みやすいぜ！
みたいなところもあるけど。

でも、例えば1～100の数字に対してすべて2倍するとか、奇数だけ取り出して二乗するとか
fizzbuzzするとかそういうことするだけだったら、ぶっちゃけfor文いらないよね。

以下の例では、Vecを例に使っているけど、スライスも
Iteratorトレイトを実装しているので、まったく同じコードで書ける。


# for文を使わずに、奇数を2乗
``` Rust
fn main(){
    let n = (0..=20).collect::<Vec<u32>>();
    
    let v = n.iter().filter(|n|(*n)%2==1).map(|n|n*n).collect::<Vec<u32>>();
    println!("{:?}",v);
}
```
ちょースマート

### もっとスマートに（追記）

```Rust
fn main(){
    println!("{:?}",(0..=20).filter(|n|(*n)%2==1).map(|n| n * n).collect::<Vec<u32>>());
}
```

### もっともっとスマートに（追の追記）
@tatsuya6502 さんからめっちゃ良いアドバイスをもらったので追記
ありがとうございます

``` Rust
fn main() {
    (0..=20)
        .filter_map(|n| if n % 2 == 1 { Some(n * n) } else { None })
        .for_each(|n| print!("{}, ", n));
    println!("");
}
```

filter_mapで条件と実行内容を合わせて書けるの良いし
for_eachでprintできるから自分で成型する場合もすごく見やすくなった。

めっちゃPythonっぽい。

# for文使わずにFizzbuzzする

``` Rust
fn main(){
    let n = (0..=20).collect::<Vec<u32>>();

    let fb = n.iter().map(fizzbuzz).collect::<Vec<String>>();
    println!("{:?}",fb);
}

fn fizzbuzz(n:&u32)->String{
    match n{
        n if n%3==0&&n%5==0 =>"fizz buzz".to_owned(),
        n if n%3==0 =>"fizz".to_owned(),
        n if n%5==0 =>"buzz".to_owned(),
        n => n.to_string()
    }
}
```
最の高

### もっとスマートに（追記）

``` Rust
fn main(){
    println!("{:?}",(0..=20).map(fizzbuzz).collect::<Vec<String>>());
}

fn fizzbuzz(n:u32)->String{
    match n{
        n if n%3==0&&n%5==0 =>"fizz buzz".to_owned(),
        n if n%3==0 =>"fizz".to_owned(),
        n if n%5==0 =>"buzz".to_owned(),
        n => n.to_string()
    }
}
```

### もっともっとスマートに（追の追記）

``` Rust
fn main() {
    (1..=20).map(fizzbuzz).for_each(|n| print!("{}, ", n));
    println!("");
}

fn fizzbuzz(n:u32)->String{
    match n{
        n if n%15==0 =>"fizz buzz".to_owned(),
        n if n%3==0 =>"fizz".to_owned(),
        n if n%5==0 =>"buzz".to_owned(),
        n => n.to_string()
    }
}
```

どんなコードが実際吐かれるかは書かれてるかは逆アセ見てみればわかるけど
たぶんVecの処理がなくなったからヒープのアロケートとコピーが減ったりで
早くなってるかもしれない

# おわりに
Rustはいいぞ。
リモートサーバーへのsshは~/.ssh/configを設定して楽をする

# 背景
仕事で複数台のサーバーにそれぞれアクセスする場合があるのですが...
毎回ssh接続のたびに、異なるIPを `ssh root@192.168.1.1` とか
`ssh centos@127.0.0.1` とか打つのは面倒くさいです。
先輩から `~/.ssh/config` を設定するといいよ！と教えてもらい設定することに！

# やった方がいい理由
普段ターミナルからshellを扱うときには補完が利くzshとかfishで入力する場合が多いと思います。
実際、私自身も過去にfishがコマンドを補完してくれるので、補完で出てきたコマンドをそのまま打って、本番につないでいるつもりでstaging環境(準本番環境)につないで作業してしまうという間抜けなミスをしたことがありました。

実際2つのサーバーで微妙にIPが似ていて、うろ覚えでfishの補完で出てきた
 `ssh ユーザー@127.0.0.1` をそのまま打ってしまったのが原因です。
staging環境だと思って本番環境で作業していたら、本当に洒落にならなかったですね。
実際複数台のサーバーのIPを全て覚えるのは難しいので、ミスを未然に防ぐという意味でも設定しておいた方が良いかと！

# 設定方法

vimで~/.ssh/configに対象のサーバーのホスト名とIPとユーザー名を追加するだけ

```ruby
$ vim ~/.ssh/config 
```

.ssh/configファイルの中身で任意の場所に下記項目を追記する

```
<省略>
Host bt ← ここにsshの時に入力したいエイリアスを指定(今回はbatchサーバーということでbtと入力)
  HostName 127.0.0.1 ← ここにサーバーのIPを入力する
  User hoge ← サーバーに入るユーザー名を指定
<省略>
```

最後に確認

```ruby
 # sshで入れることを確認
$ ssh bt
[hoge@batch ~]$
```

これでOK
[laravel]Notificationを使ってメール送るときにMailableを使う

#　やりたいこと
[公式](https://readouble.com/laravel/5.5/ja/notifications.html#mail-notifications)の「メール通知」の「他の通知フォーマットオプション」で`Mailable`を使うやり方が紹介されているが、あまりに簡素な説明になってしまっているので、具体的なやり方を確認する。

# 環境
Laravel 5.5

# 何が嬉しいか
通常は`MailMessage`インスタンスを使うが、これだと必要最低限のことしかできない。`Mailable`インスタンスだと`MailMessage`インスタンスではできなかった以下のようなことができるようになる。
- テキストメールを送れる。
- `SwiftMailer`に好き勝手にパラメータを渡せる。
　- `return-path`が設定できる。
　- `x-mailer`のような拡張ヘッダを追加できる。

# Mailファサード使ってsend()すれば良いじゃん
それだと`notify()`ではなく`send()`になり、「通知」のコンテキストが損なわれるのでやりたくない。

# やってみた
まずMailableクラスを直接インスタンスとして利用しようとすると、`build()`が実装されてないっていう旨のエラーが吐かれる。そのため、継承して`build()`するだけのクラスを`app/Email`内に新規作成する。

```php:app/Email/Notification.php
<?php

namespace App\Mail;

use Illuminate\Mail\Mailable;

class Notification extends Mailable
{
    /**
     * Build the message.
     *
     * @return $this
     */
    public function build()
    {
        //
    }
}
```

次に作成したNotificationクラスを通知用のクラスのtoMailメソッドで呼び出すようにする。

## 変更前
ヘッダを自由に設定できず、テキストメールを作ることもできなかったため、ヘッダの拡張は諦めつつmarkdownで送っている。

```php:php:app/Notifications/SampleNotification.php
public function toMail($notifiable)
{
    return (new MailMessage)
        ->from(config('mail.from.address'))
        ->subject('メッセージ受信通知')
        ->markdown('emails.message_received', ['url' => route('hoge')]);
}
```

## 変更後
ヘッダに`return-path`と`x-Mailer`を設定して、テキストメールを作って送れるようになった。

```php:app/Notifications/SampleNotification.php
public function toMail($notifiable)
{
    return (new \App\Mail\Notification())
        ->text('emails.message_received', ['url' => route('hoge')])
        ->from(config('mail.from.address'))
        ->to($notifiable->email)
        ->subject('メッセージ受信通知')
        ->withSwiftMessage(function (\Swift_Message $message) {
            $message
                ->setReturnPath(config('mail.from.address'))
                ->getHeaders()->addTextHeader('X-Mailer', 'hoge-mailer');
        });
}
```
以上。

共通でセットするパラメータであれば、`build()` 内で`return $this->from(config('mail.from.address'))`　とかしても良さそう。
（備忘録）Alexa道場の関連資料まとめ

# 1. はじめに
Alexaスキル開発初心者が、最初に学ぶべき『Alexa道場』（コーヒーショップのスキル開発）について、自分への備忘録として関連資料をまとめてみました。ご参考になれば幸いです。

# 2. 対話モデルのデザインについて学ぶ
[第3回Alexa道場：音声インターフェイスをデザインしよう](https://youtu.be/8TOX5jAP4HA)

# 3. AWS Lambdaについて学ぶ
[第4回Alexa道場：Node jsを使ってAlexaスキルを作ろう](https://youtu.be/3o18Sd-QNfA)

# 4. Slot（スロット）について学ぶ
[第5回Alexa道場：スロットを使って発話内の可変文字列を取得しよう](https://youtu.be/CiU56Eelcd4)
[参考：インテント、発話、スロットの作成](https://developer.amazon.com/ja/docs/custom-skills/create-intents-utterances-and-slots.html)

# 5. ハンズオントレーニングの演習教材
[Alexaハンズオンワークショップのテキスト（PDF）](https://alexa.design/jp-text)

# 6. サンプルコード
[サンプルコード（対話モデルJSON + Lambda Node.js）](http://bit.ly/2EF25Kb )

# 7. SDKの日本語ドキュメント
[SDKの日本語ドキュメント](https://github.com/alexa/alexa-skills-kit-sdk-for-nodejs/blob/master/Readme.jp.md)

# 8. Alexa道場
[Alexa道場サイト](https://developer.amazon.com/ja/alexa-skills-kit/webinars)

# 9. おわりに
大人気のハンズオントレーニングに、なかなか申し込めない方や、遠方で参加が困難な方々に、少しでも参考になれば幸いです。
ぜひ、皆さんも、音声スキル開発、初めてみてください。
GoFメモ - 1.Template Method

# ページ説明
PHPのデザインパターンの学習の記録として残すことにしました。

## 参照

こちらのサイトに大切なことはすべて書いてあります。
[Do You PHP はてな](http://d.hatena.ne.jp/shimooka/20141211/1418298136)

### パターン一覧
ページを追記する度にリンクをつなげます

- **1.Template Method**
- 2.Singleton
- 3.Adapter
- 4.Factory Method 
- 5.Façade
- 6.Iterator
- 7.Abstract Factory
- 8.Bridge 
- 9.Builder
- 10.Chain of Responsibility
- 11.Command
- 12.Composite
- 13.Decorator
- 14.Flyweight
- 15.Interpreter
- 16.Mediator
- 17.Memento
- 18.Observer
- 19.Prototype
- 20.Proxy
- 21.State
- 22.Strategy
- 23.Visitor

## 1.Template Method

### 概要

完全に同じ場合は処理を親クラスに移したり別クラスを作成しメソッドを定義したりするが、一部ことなる場合などに用いるデザインパターン。
異なる処理の部分を分けて、各クラスごとにその処理を実装する。

### 特徴

 - 親クラスで処理の大枠を定義し、具体的な処理内容はサブクラスで行う。
 - 共通処理は親クラスにまとめるので、変更が発生した場合でも親クラス（AbstractCalss）を修正するだけで済む。
 - 親クラスで定義された抽象メソッドはサブクラス側で実装するので、サブクラスによって処理内容を変更することができる。
 
### クラス構造

##### AbstractClass
処理の大きな枠食いを定義するクラスで、具体的な処理内容はサブクラスで実装する。

```AbstractClass.php
// 処理の大きな枠組みを定義するメソッド
TemplateMethod()

// 抽象メソッドでサブクラスで中身は実装する
PrimitiveOperation1()
PrimitiveOperation2()

// ※抽象メソッドのようにサブクラスで実装することが期待されるメソッドの名前は「do~」が多いらしい。
```
##### ConcreteClass
AbstractClassを継承したサブクラス。AbstractClassで定義された抽象メソッドを実装する。
AbstractClassで枠組みを定義したメソッド(TemplateMethod())から呼び出される。

```ConcreteClass.php
//親であるAbstractClassの抽象メソッドの具体的な実装。各サブクラス毎に異なる実装をおこなうことで、処理の詳細を変更することができる。
PrimitiveOperation1()
PrimitiveOperation2()
```

### オブジェクト指向的要素

 - 継承
 - 親クラスでは具体的な処理内容をわざと抽象メソッドにし、サブクラスで実装するとことで、抽象メソッドの実装が保証される
 - サブクラス毎に実装内容を変更することができる
 - 親クラスがサブクラスのメソッドを呼び出す　制御構造の反転　

### 関連パターン

- 4.Factory Method 
- 22.Strategy
[Windows]爆速でツールを起動する方法

#仕事はスピードが命
初投稿。
新人の頃よく先輩に言われた。
**仕事はスピードが命。**
**マウスはなるべく使わない！**
新人の頃の俺が覚えた開発ツールをキーボードのみで素早く起動する技（２秒）

#準備：System32フォルダにショートカット
system32というフォルダを開きます。
C:\Windows\System32

このフォルダに自分がよく使うツールのショートカットを作成し短めの名前に変更しておきます
（要管理者権限）
今回は例としてVisual Studio Codeのショートカットを「vs」の名前で作成
![vsname.png](https://qiita-image-store.s3.amazonaws.com/0/253529/2a0efb26-eb1d-47a3-0677-4c7acfcf17d2.png)
これだけで準備完了

#爆速起動実行
「Windowsキー」＋「R」でファイル名を指定して実行　でショートカットを指定
![windowsr.PNG](https://qiita-image-store.s3.amazonaws.com/0/253529/c380eaf9-c35f-37e7-336b-c21b8defb764.png)

##爆速起動完了（２秒）
![vscode.png](https://qiita-image-store.s3.amazonaws.com/0/253529/33279c25-21e4-8d37-06f3-d2ae8ff54bf2.png)


**たくさんのツールをマウスでカチカチ開いているあなた、同僚とスピードで差をつけちゃいましょう！**
UITabBarControllerとUINavigationControllerをコードで作る

#背景
ViewControllerごとにStoryboardを分けている人、そもそもStoryboardを使わない人って一定数いると思うんですけど、そう言った時にTabBarController使ってるのにNavigationControllerの設定もしたいのよねーという人いると思うんですよ。

#実装していきます。
##開発環境
Swift: version 4.0
Xcode: version 9.3

##実装①　クラスファイルの作成
TabBarControllerのクラスファイルを作成。あとはタブごとのページのViewControllerがあれば大丈夫です。

```MainTabBarController.swift

class MainTabBarController: UITabBarController {
}
```

##実装②　変数の用意
各画面となるViewControllerを格納する変数を用意します。

```MainTabBarController.swift
class MainTabBarController: UITabBarController {

    override func viewDidLoad() {
        super.viewDidLoad()
        var viewControllers = [UIViewController]()

    }
}
```

##実装③　それぞれの画面の設定(tabの画像など)


```MainTabBarController.swift
class MainTabBarController: UITabBarController {

    override func viewDidLoad() {
        super.viewDidLoad()
        var viewControllers = [UIViewController]()
        let firstViewController = UIStoryboard(name: "FirstViewController", bundle: nil).instantiateInitialViewController()
        firstViewController?.tabBarItem = UITabBarItem(tabBarSystemItem: .bookmarks, tag: 1)
        viewcontrollers.append(firstViewController!)

        let secondViewController = UIStoryboard(name: "SecondViewController", bundle: nil).instantiateInitialViewController()
        secondViewController?.tabBarItem = UITabBarItem(tabBarSystemItem: .bookmarks, tag: 1)
        viewcontrollers.append(secondViewController!)
    }
}

```

##実装④ NavigatoinControllerの設定
全ての画面を設定した最後にすべての画面の配列のインスタンスにUINavigationControllerを設定し、TabBarControllerのタブとして設定します。


```MainTabBarController.swift
class MainTabBarController: UITabBarController {

    override func viewDidLoad() {
        super.viewDidLoad()

        var viewControllers = [UIViewController]()

        let firstViewController = UIStoryboard(name: "FirstViewController", bundle: nil).instantiateInitialViewController()
        firstViewController?.tabBarItem = UITabBarItem(tabBarSystemItem: .bookmarks, tag: 1)
        viewcontrollers.append(firstViewController!)

        let secondViewController = UIStoryboard(name: "SecondViewController", bundle: nil).instantiateInitialViewController()
        secondViewController?.tabBarItem = UITabBarItem(tabBarSystemItem: .bookmarks, tag: 1)
        viewcontrollers.append(secondViewController!)

        self.viewControllers = viewcontrollers.map{ UINavigationController(rootViewController: $0)}
        self.setViewControllers(viewControllers, animated: false)
    }
}
```
以上で完了です、simulatorで動かしてみてください。

#最後に
正直、viewDidLoad()に書くのは如何なものかと今でも疑問に思っているので、もしいい解決策、例えばinit()に書けよとかいうのであれば教えてください。

#参考文献
海外のサイトですが、このサイトのまんまにやりました。正直細かい部分は違う部分もありますが、核となる部分は同じです。
https://medium.com/@ITZDERR/uinavigationcontroller-and-uitabbarcontroller-programmatically-swift-3-d85a885a5fd0
UMSとPS3でISOを再生する

# はじめに
ため込んでいたISOをTVでみたいなーっと思って我が家でやってみた時のメモです。
今更感がすごいですが、UMS（Universal Media Server）とPS3を使ってISOを再生する方法について書きたいと思います。わたしが色々と調べた時にまとまった記事がなく苦労したため、誰かの参考になれば幸いです。

# 動作環境
UMSを動かす人：Linux Mint18.3 MATE32bit
UMS Version：7.0.0
PS3 Version：4.82
ネットワーク環境：100Mでスイッチング

ちなみに、IPアドレスはUMS/PS3とも固定にしています。
※UMS/PS3は**同じセグメント**に配置してください

# 依存関係のアプリ設定
まず、UMSを動かすのに必要なアプリを入れていきます。

- Java

```

$ sudo add-apt-repository ppa:webupd8team/java
$ sudo apt-get update
$ sudo apt-get install oracle-java8-installer
（Java 8 をインストールする。）

$ java -version 
java version "1.8.0_171"
Java(TM) SE Runtime Environment (build 1.8.0_171-b11)
Java HotSpot(TM) Server VM (build 25.171-b11, mixed mode)
（バージョンを確認する。）

$ sudo apt-get install oracle-java8-set-default
（構成パッケージをインストールする。）

$ echo 'JAVA_HOME=/usr/lib/jvm/java-8-oracle' | sudo tee -a /etc/environment
$ echo 'JRE_HOME=/usr/lib/jvm/java-8-oracle/jre' | sudo tee -a /etc/environment
（環境変数を設定する。）

```

- Mplayer

```
sudo apt-get install mplayer
```

- Mediainfo

```
sudo apt-get install mediainfo
```

- ffmpeg

```
sudo apt-get instrall ffmpeg
```

- MEncoder

```
sudo apt-get instrall mencoder
```

# UMS本体の設定
[こちら](http://www.universalmediaserver.com/)からダウンロードなりwgetなりして取得します。

*以下からちゃんとメモしていなかったのでうろ覚えです。間違っていたらすみませんorz*

```
tar xzvf UMS-7.0.0.tgz
（圧縮されたアーカイブを展開する）

sudo mv ums-7.0.0 /opt/.
(/optに移動)

sudo chown -R root:root /opt/ums-7.0.0
（所有者の変更）

sudo ln -s /opt/ums-7.0.0 /opt/ums
（シンボリックリンク張るln -s リンク元 登録名）

./opt/ums/UMS.sh
（起動したら、Ctrl + C で終了する）

./opt/ums/UMS.sh　を自動起動に登録する
（コントロールセンターなどから）

再起動する

GUIが起動してウィザード始まるのでいい感じに設定する

変換設定->MEncoder->詳細設定->追加パラメータに以下を追加する（参考画像を参照）
vcodec == mpeg2 :: -ovc copy -nosync

表示/共有設定->共有フォルダからISOを保存しているPATHを指定する（参考画像を参照）

PS3でビデオ->メディアサーバーを検索する

Universal Media Server が見つかったらISOを楽しむ

```

# 参考画像

1. 詳細設定
![1.png](https://qiita-image-store.s3.amazonaws.com/0/252733/1890e79b-ea7c-74ee-16cc-2d070c71119a.png)  

2. 追加パラメータ
![2.png](https://qiita-image-store.s3.amazonaws.com/0/252733/2dc4b730-63eb-2ded-9eb4-d043675d7622.png)  

3. 共有フォルダ
![3.png](https://qiita-image-store.s3.amazonaws.com/0/252733/356e48b7-1ec2-5abb-4529-ed05396872c6.png)



# ハマったこと
- PS3が見つからない→基本設定のネットワークデバイスを指定でいきました。
- タイトルが見つかりません→一生懸命MEncoderの設定を入れていたが、そもそもMEncoderが入っていなかったorz
- 再生できません→MEncoderの設定が腐っていました。  
ググると大体以下のような記述を見かけますが、これをそのまま入れると私の環境では連続した一行（改行が\nになる）になってしまい、有効な設定ではなくなっていました。  
vcodec == mpeg2 :: -ovc copy -nosync  
container == iso :: -ovc copy -nosync　★不要  
container == iso :: -oac copy -nosync　★不要  
- 音ズレがひどい→変換設定->基本設定->音声設定のAC-3エンコードの音声チャンネル数を２チャンネルにしたら改善しました。  

# 宿題
ものによってはまだ音ズレするISOがあります。検証するのが面倒くさいのでそういうのは再生を諦めちゃっています。どなたか解決方法をご存知でしたらご教示ください！
ffmpeg 4.0 をlibsrtを有効にしてビルドする

書き直したのでこちらを参照してください。
[ffmpeg 4.3 をlibsrtを有効にしてビルドする](https://qiita.com/tetsu_koba/items/68ce84104580d23e206c)

ffmpeg 4.0 で新しくサポートされたsrtのプロトコルを試してみようと思って。

# 準備

## 依存ライブラリの準備

ubuntu 16.04 を使用している。

```
sudo apt build-dep ffmpeg
```

## libsrtのビルドとインストール

```
git clone https://github.com/Haivision/srt.git
cd srt/
git checkout -b v1.3.0 v1.3.0
sudo apt-get install tclsh pkg-config cmake libssl-dev build-essential
./configure 
make
sudo make install
sudo ldconfig
```

# ffmpegのソースの入手

```
git clone https://git.ffmpeg.org/ffmpeg.git ffmpeg
cd ffmpeg/
git checkout -b n4.0 n4.0
```

# ビルドとインストール

```
./configure --enable-libsrt --enable-libx264 --enable-libx265 --enable-gpl
make
sudo make install
```

```
$ which ffmpeg
/usr/local/bin/ffmpeg
$ ffmpeg -version
ffmpeg version n4.0 Copyright (c) 2000-2018 the FFmpeg developers
built with gcc 5.4.0 (Ubuntu 5.4.0-6ubuntu1~16.04.9) 20160609
configuration: --enable-libsrt --enable-libx264 --enable-libx265 --enable-gpl
libavutil      56. 14.100 / 56. 14.100
libavcodec     58. 18.100 / 58. 18.100
libavformat    58. 12.100 / 58. 12.100
libavdevice    58.  3.100 / 58.  3.100
libavfilter     7. 16.100 /  7. 16.100
libswscale      5.  1.100 /  5.  1.100
libswresample   3.  1.100 /  3.  1.100
libpostproc    55.  1.100 / 55.  1.100
```

```
$ ffmpeg -protocols |grep srt
ffmpeg version n4.0 Copyright (c) 2000-2018 the FFmpeg developers
  built with gcc 5.4.0 (Ubuntu 5.4.0-6ubuntu1~16.04.9) 20160609
  configuration: --enable-libsrt --enable-libx264 --enable-libx265 --enable-gpl
  libavutil      56. 14.100 / 56. 14.100
  libavcodec     58. 18.100 / 58. 18.100
  libavformat    58. 12.100 / 58. 12.100
  libavdevice    58.  3.100 / 58.  3.100
  libavfilter     7. 16.100 /  7. 16.100
  libswscale      5.  1.100 /  5.  1.100
  libswresample   3.  1.100 /  3.  1.100
  libpostproc    55.  1.100 / 55.  1.100
  srtp
  srt
  srtp
  srt
```

確かにプロトコルにsrt が追加された。

# 追記: ffplayのビルド

ffplayもデフォルトで一緒にビルドされるようになっているが、必要なライブラリが足りない場合は除外される。最初にやったときにはffplayはビルドされていなかった。以下を追加でインストールしたら、ffplayもビルドされるようになった。

```
sudo apt install libsdl2-dev
```

# 続き
[ffmpeg 4.0 に入った新しい映像伝送プロトコルSRTを試す](https://qiita.com/tetsu_koba/items/b8e1868a726c6201d3ab)


# 追記 (2018.11.12)
[ffmpeg 4.1 でSRTのバグが解消された](https://qiita.com/tetsu_koba/items/cc1ecb9c2f5ae2901aa9)
なので、SRTを使うならffmpeg 4.1以降を使いましょう。

```
git checkout -b n4.x n4.1
```
ペアワイズ法を使ってテストケースを自動で削減する

どうもmiyachi（[@_38ch](https://twitter.com/_38ch)）です。
あるSNSを開発していてテストをする場合に、よくある例として、どのデバイスでやるか、どのブラウザでやるか、どのログイン認証方法でやるかみたいな話が出てきます。

テストケースを決める因子としては、

* デバイス：Mac, Windows, iPhone, iPad, Android
* ブラウザ：Safari, Chrome, Firefox, IE
* ログイン認証方法：Facebookログイン、Twitterログイン、Googleログイン、Instagramログイン

これだけで、全てのケースを網羅しようとすると、

```
デバイス数（5つ） x ブラウザ数(4つ) x ログイン認証方法(4つ) = 80通り
```
80通りもあるわけです。
まぁ頑張って手分けしたらできるけど、できればやりたくないレベル。

## ペアワイズ法を使ってテストケースを圧倒的に少なくする
ペアワイズ法とは、簡単にいうと、**「アプリのバグって基本的に、1つ、もしくは2つの因子によって引き起こされるよね。だから3つ以上因子があったとしても、すべての組み合わせ確認する必要ないよね」**的な思想に基づくテストケース作成法です。

ただ、自力でペアワイズ法をすでにあるテストケースに適応するのは、ちょっと難しいので、Microsoftが公開しているオープンソースの「PICT」とういうツールを使いましょう。

以下のステップで導入できます。

```unix
$ git clone https://github.com/Microsoft/pict.git
$ cd pict/
$ make
$ sudo install -m 0755 pict /usr/local/bin/pict
```

これでpictコマンドが使えるようになったので、次はテストケースをpictが読めるように書いてあげましょう。書き方は超シンプルでこんな感じ。

```
デバイス : Mac,Windows,iPhone,iPad,Android
ブラウザ : Safari,Chrome,Firefox,IE
ログイン認証方法 : Facebookログイン,Twitterログイン,Googleログイン,Instagramログイン
```
これを.txtの拡張子で保存してあげる。

## PICTにテストケースを削減してもらう
ではTerminalから先ほど、単純計算で80通りあったテストケースがどれくらい少なくなったのか見てみましょう。

**実行**

```unix
$ pict test_case.txt
```
**結果**

```unix
デバイス	ブラウザ	ログイン認証方法
Windows	Firefox	Facebookログイン
iPad	Safari	Twitterログイン
Android	Chrome	Googleログイン
Windows	IE	Instagramログイン
iPad	Firefox	Googleログイン
iPhone	IE	Googleログイン
Windows	Safari	Googleログイン
iPhone	Safari	Instagramログイン
iPad	IE	Facebookログイン
iPhone	Firefox	Twitterログイン
Mac	Safari	Facebookログイン
Android	IE	Twitterログイン
Mac	IE	Googleログイン
Mac	Chrome	Twitterログイン
iPhone	Chrome	Facebookログイン
Android	Firefox	Instagramログイン
Windows	Chrome	Twitterログイン
iPad	Chrome	Instagramログイン
Android	Safari	Facebookログイン
Mac	Firefox	Instagramログイン
```

### たったの20通り (1/4) に減っている！！
※ MacでIEとか組み合わせ的におかしいものは、条件書いて落とせるので詳細ググってみてください。


単純にケースが知りたい時は、`/s`をお尻につけて実行してあげましょう。

```unix
$ pict test_case.txt /s
　　　　Combinations:   56
　　　　Generated tests:20
　　　　Generation time:0:00:00
```

それ本当に信頼できるのって方は、Microsoftが出してる論文読んでみてください。
[Pairwise Testing in the Real World: Practical Extensions to Test-Case Scenarios](https://msdn.microsoft.com/en-us/library/cc150619.aspx)
webpackでパーミッションエラー

# バンドル吐き出し時にパーミッションエラー発生

以下のエラー。

```
Error: EACCES: permission denied, open '/public/js/bundle.js'
```

どうやら、これは既知のバグらしく、コンフィグ作成時にoutputパスを相対パス指定することで解決するとのこと。
https://github.com/webpack-contrib/copy-webpack-plugin/issues/41

ただし、webpackのバージョンによっては相対パス指定が不可能。
なので、以下の書き方が必要となる。

```
output: {
    filename: 'bundle.js',
    path: path.join(__dirname, "/public/js/"),
},
```

上記は、`path.join()`を使用したもの。
私の場合これで解決しました。


webpack難しい:frowning2:
StoryboardからUIViewの枠線、角丸、影を設定する


### 開発環境
* Xcode9.2
* Swift3.2

# Storyboardで設定できるプロパティを拡張する

UIViewのextensionとして以下のようなコードを書くとstoryboardでプロパティ設定できる項目が追加されます。

```swift
import UIKit


extension UIView {
  
    /// 枠線の色
    @IBInspectable var borderColor: UIColor? {
        get {
            return layer.borderColor.map { UIColor(cgColor: $0) }
        }
        set {
            layer.borderColor = newValue?.cgColor
        }
    }
    
    /// 枠線のWidth
    @IBInspectable var borderWidth: CGFloat {
        get {
            return layer.borderWidth
        }
        set {
            layer.borderWidth = newValue
        }
    }
    
    /// 角丸の大きさ
    @IBInspectable var cornerRadius: CGFloat {
        get {
            return layer.cornerRadius
        }
        set {
            layer.cornerRadius = newValue
            layer.masksToBounds = newValue > 0
        }
    }
  
  /// 影の色
  @IBInspectable var shadowColor: UIColor? {
    get {
      return layer.shadowColor.map { UIColor(cgColor: $0) }
    }
    set {
      layer.shadowColor = newValue?.cgColor
      layer.masksToBounds = false
    }
  }
  
  /// 影の透明度
  @IBInspectable var shadowAlpha: Float {
    get {
      return layer.shadowOpacity
    }
    set {
      layer.shadowOpacity = newValue
    }
  }
  
  /// 影のオフセット
  @IBInspectable var shadowOffset: CGSize {
    get {
     return layer.shadowOffset
    }
    set {
      layer.shadowOffset = newValue
    }
  }
  
  /// 影のぼかし量
  @IBInspectable var shadowRadius: CGFloat {
    get {
     return layer.shadowRadius
    }
    set {
      layer.shadowRadius = newValue
    }
  }
  
}
```

# 使い方

storyboardでUIViewまたはUIViewを継承しているクラスを選択してポチポチするだけです:clap:

<img width="263" alt="スクリーンショット 2018-04-26 22.23.06.png" src="https://qiita-image-store.s3.amazonaws.com/0/127713/81eb4e3b-5619-a8d5-3dff-e0ba365dc8b7.png">

`@IBInspectable`はすばらしいアノテーションですね。  
おしまい🍣
gpsd起動時にエラーが発生した時の対処法

GPSを搭載したRaspberry Piでgpsdの起動がエラーとなった時の対応メモです。

# エラー内容
```bash
# systemctl start gpsd
A dependency job for gpsd.service failed. See 'journalctl -xe' for details.

# systemctl status gpsd
● gpsd.service - GPS (Global Positioning System) Daemon
   Loaded: loaded (/lib/systemd/system/gpsd.service; indirect; vendor preset: enabled)
   Active: inactive (dead)

# journalctl -xe

-- Subject: Unit gpsd.service has failed
-- Defined-By: systemd
-- Support: https://www.debian.org/support
--
-- Unit gpsd.service has failed.
--
-- The result is dependency.
Apr 26 22:11:01 raspberrypi systemd[1]: gpsd.service: Job gpsd.service/start failed with result 'dependency'.
Apr 26 22:11:07 raspberrypi systemd[1]: gpsd.socket: Failed to listen on sockets: Cannot assign requested addres
Apr 26 22:11:07 raspberrypi systemd[1]: Failed to listen on GPS (Global Positioning System) Daemon Sockets.
-- Subject: Unit gpsd.socket has failed
-- Defined-By: systemd
-- Support: https://www.debian.org/support
--
-- Unit gpsd.socket has failed.
--
-- The result is failed.
```

ソケットの生成がエラーとなっていました。

# 原因
IPv6を無効にしていたことが原因でした。(使わないかと思いまして・・・)

まず下記の通り、IPv6設定を有効にしてOSを再起動します。

```bash
# vim /etc/sysctl.conf

#net.ipv6.conf.all.disable_ipv6 = 1
#net.ipv6.conf.default.disable_ipv6 = 1

# reboot
```

OS起動後にgpsdが起動できることを確認出来ました。

```bash
# systemctl start gpsd

# systemctl status gpsd
● gpsd.service - GPS (Global Positioning System) Daemon
   Loaded: loaded (/lib/systemd/system/gpsd.service; indirect; vendor preset: enabled)
   Active: active (running) since Thu 2018-04-26 22:14:48 JST; 1s ago
 Main PID: 830 (gpsd)
   CGroup: /system.slice/gpsd.service
           └─830 /usr/sbin/gpsd -N /dev/serial0

Apr 26 22:14:48 raspberrypi systemd[1]: Started GPS (Global Positioning System) Daemon.
```
Actions on GoogleとDialogflowのwebhook連携でサーバ側から会話を終了させる


サーバ側から会話終了させる方法が判らず探してて、
DialogflowのDocsではなく、Google側のREFERENCEに記載があったので
忘れないようメモ代わりに記載。

https://developers.google.com/actions/reference/v1/dialogflow-webhook

expect_user_response 項目をfalseにしてDialogflowにjsonを返してあげれば
会話は終了します。
普段、会話を継続させる場合は頑張ってこの項目を付けなくても会話は継続していました。

```
{
    "contextOut": [{
        "name": "lastcontext",
        "lifespan": 2,
        "parameters": {
            "lastaction": "input.welcome",
            "Spot": "",
            "unknown_count": "0"
        }
    }],
    "responsedate": "2018-04-26 20:43:15",
    "speech": "ttt",
    "displayText": "",
    "data": {
        "google": {
            "expect_user_response": "true"
        }
    }
}
```
IAMポリシーのリージョン制限をさっそく試してみた

#IAMポリシーのリージョン制限をさっそく試してみた

個人的朗報です。

それは使用できるリージョンを制限したい!!!!が簡単に実現可能になりました。

今回のアップデートはIAMポリシーのCondition句に制限したいリージョンを記載して
APIを制御することができます。
※そもそもリージョンを画面から切り替えることすらできなくするものではありません。

>https://aws.amazon.com/jp/blogs/security/easier-way-to-control-access-to-aws-regions-using-iam-policies/

##お試し
Adminのポリシーに制限をいれた形になります。
jsonの意味は「すべてのアクションを許可する(リクエストのリージョンは東京リージョンのみ)」
です

```.json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "*",
            "Resource": "*",
            "Condition": {
                "StringEquals": {
                    "aws:RequestedRegion": "ap-northeast-1"
                }
            }
        }
    ]
}
```

マネジメントコンソールをバージニアに切り替えてEC2のダッシュボードを見ると
権限が無いことが表示されています。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/240644/16b1cf17-4d67-9fca-a465-2a7ada693d88.png)

東京リージョンに切り替えるとしっかり見えてますね！

![image.png](https://qiita-image-store.s3.amazonaws.com/0/240644/871adad5-3669-d922-b1d8-a6f3910b83cb.png)

##まとめ
簡単にリージョンの制限ができるので、要件次第でしっかり活用したいですね。
CloudTrailの分析からすこしおさらばできるかもしれません。

##おまけ

![image.png](https://qiita-image-store.s3.amazonaws.com/0/240644/b98e34ba-d0aa-6911-400f-609366bd0b5f.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/240644/772b6efe-8d99-498d-9d78-9bdb7a5b7284.png)


グローバルなサービスを使用する際は注意しましょう。。。。:cry:
Cloud9で管理者として任意のバージョンのRubyをインストールする。

##●困りごと
cloud9環境でRuby 2.4.1がすでにインストールされていた。
Ruby 2.0.0-p648に変更したいとき。

```
$ rvm install ruby-2.0.0-p648
```
のコマンドを入力しても、インストールできなかった。

##●解決方法
ターミナルで以下を入力し管理者になる。

```
$ sudo -s
```


以下を入力し任意のRubyのバージョンをインストールする。

```
# rvm install ruby-2.0.0-p648
```


`control d`(macの場合)で管理者から出られる。exitと表示され、通常のディレクトリ表示になる。

Rubyのバージョンを確認

```
# ruby -v 
ruby 2.0.0-p648
```

###●メモ

初心者で全然わからずテキストを進めていたが、Rubyのインストールで早速つまづいた。。

調べてみると管理者でインストールできるようだった。

以下で管理者権限から出ておきます。

```
# exit
```
少しでもこのメモがお役に立てばと思います。
AWS EC2のメンテナンス情報の取得

##　前書き
AWSのEC2で、クラウドだといっても流石に完全無停止であるわけではないですね。インスタンスの起動しているホスト自体に計画的なメンテナンスがあったりして、計画的に停止・起動の必要が発生したります。
その、計画的なメンテナンス情報は、マネージメントコンソールのイベント情報や、メールでの通知が来たりします。
ただ、複数のアカウントをもっていたりして、全部のアカウントにログインしていなかったり、メールの受信量が多くて埋もれたりすると、意外に見逃しがちになる場合があります。

##　複数の方法や能動的な方法で情報を取得
メールだと受動的な情報なので、別の方法で能動的に情報ができないか？
はい、できます。aws　cli　でインスタンスのステータスで取得ができます。

```shell
AWS_ACCESS_KEY_ID=xxxxxxxxxxxxxxxx AWS_SECRET_ACCESS_KEY=xxxxxxxxxxxxxxx ¥
aws ec2 describe-instance-status --instance-id i-xxxxxxxxxxxxxxxxx --query="InstanceStatuses[*].Events"
```
上記のコマンドでEC2のイベント情報が取得できます。
複数のアカウントを動的に切り替えるために、credentialに記録せずに、環境変数で渡すようにAWS_ACCESS_KEY_IDとAWS_SECRET_ACCESS_KEYをしようしています。

## 取得したメンテナンス情報
下記が、自分が管理していたEC2で取得できたイベント情報です

```sh
[
  [
    {
      "Code" : "instance-stop",
      "Description" : "The instance is running on degraded hardware",
      "NotBefore" : "2018-XX-XXTXX:00:00.000Z"
    }
  ]
]
```
上記のイベント情報が上がって来たら、インスタンスをSTOP・STARTしましょう。
(※OSのrebootでは、インスタンスが止まらないので起動ホストがかわりませんので、必ずインスタンスのSTOP・STARTが必要です)

##　インスタンスをSTOP・STARTした後
すぐに、イベント情報が消えると思っていたのですが、違いました。

```sh
[
  [
    {
      "Code" : "instance-stop",
      "Description" : "[Completed] The instance is running on degraded hardware",
      "NotBefore" : "2018-XX-XXTXX:00:00.000Z"
    }
  ]
]
```
上記のように、Completedという状態の情報が出続けていました。

いつになると消えるのだろう？、もしや「NotBefore」の日付まで出続けるのか？とおもっていたら、再起動後１週間できえました(「NotBefore」の日付より前で消えました)

###　後書き
もし、メールやマネージメントコンソールログイン以外でメンテ情報を取得したけれは、cronで設定してみてはどうでしょう
AWS CLI s3 cp/mvでワイルドカードが使えないならxargsと併用するといいっぽい

AWS CLIでs3に大量ファイルをcopy/moveを試みようとするとぶち当たるワイルドカードが使えない問題
``--recursive``オプションを使えばいいのですがいまいち解りにくくて萎えてたのですが、
普段からよく使うxargsと併用してみるとなんか直感的になったのでその方法を・・



```
ls -1 *.txt|xargs -I FILENAME aws s3 mv FILENAME s3://バケット名/FILENAME
```



xargsには `-I replace-str `オプションというのがあり、
xargsにパイプで渡ってきた行を`replace-str`で指定した文字に置き換えてくれて、
しかも置き換え文字は何度でも登場させてもいいので


まず、`ls -1 *.txt`として対象ファイルを1ファイルごと改行付きで出力させ
`aws s3 cp/mv`のLocalPath　S3Uriの部分に`replace-str`を設定・指定してあげればOKです。

先の例ではlsの結果がxargsでは`FILENAME`という置き換え文字のところに当てはまり
aws s3 cp/mvのごく普通の書き方として実行されます。

もちろんパイプ中に`grep -v`等でlsの結果からファイル名を対象外にしたりも出来るので
随分直感的に扱えるようになりました。
mxnetのみで画像リサイズ

```
# mxnet==1.1.0, opencv==3.3.1, numpy==1.12.1

import cv2
import numpy as np
import mxnet as mx

# size after resize
dh = 1200
dw = 600

# original image
orig_im = cv2.imread('/tmp/some.png')

# resize with opencv
im = cv2.resize(orig_im, (dw, dh))
cv2.imwrite('/tmp/out1.jpg', im)

# resize with mxnet
im = mx.nd.array(orig_im)
aff_mat = mx.nd.array([[1, 0, 0, 0, 1, 0]])
grid = mx.nd.GridGenerator(data=aff_mat, transform_type='affine', target_shape=(dh, dw))
im = im.reshape((1, *im.shape)).transpose((0, 3, 1, 2))
im = mx.nd.BilinearSampler(im, grid)
im = im.transpose((0, 2, 3, 1))
im = im.reshape(im.shape[1:])
cv2.imwrite('/tmp/out2.jpg', im.asnumpy())
```
Solidityの配列n面相、ほかハマりどころ

```c
pragma solidity ^0.4.23; // この文書の対象バージョン
```

# はじめに

Ethereum上のコントラクトを書こうとしてSolidityを使ってみましたが、いろいろハマってしまいました。特に、配列の扱いについて複雑な面が多いと感じました。

# 文法の違い

Solidityは概ねC言語やJavaScript的な文法となっていますが、微妙なところで違うので、同じ感覚で書いていると思わぬところでエラーとなってしまいます。

## 変数宣言

変数宣言を複数いっぺんに行うことが、現行のSolidityでは行えません。「コントラクトの読みやすさに寄与するものではない」ということで、[Issueも閉じられています](https://github.com/ethereum/solidity/issues/3300)。1つずつ書くほかありません。

```c
uint a, b; // エラー

uint a;
uint b;
```

## 関数の修飾子

他の言語と同じ感覚で`public function`と書いてみたところ、これもエラーとなりました。Solidityの関数記法は、`function(引数) 修飾子 returning(返り値)`のように順番が決まっていて、そのとおりに書くしかありません。

# `storage`変数と`memory`変数

Ethereumがブロックチェーンの仕組みなので、変数にもコントラクトを超えて永続する`storage`変数と、1回の実行で役割を終える`memory`変数があります。状況によってデフォルトでどちらになるかが決まっていますが、

* 関数外の状態変数…`storage`固定
* 関数の引数…デフォルトで`memory`
* ローカル変数…デフォルトで`storage`

というようになっています。ただ、煩雑ですので、状態変数以外は常に明示したほうがいいかもしれません。そして、それぞれの間で代入を行った場合、以下のような動作になります。配列などの参照型といっても、コピーされる場面が多々あるのは要注意です。

|from＼to| 状態 |`memory` |`storage`|
|---|---|---|---|
|状態変数|コピー|コピー|参照設定|
|`memory`変数|コピー|☆|コピー※|
|ローカルの`storage`変数|コピー|コピー※|参照のコピー※|

☆：値型ならコピー、参照型（配列・`struct`）なら参照のコピー
※：事前に参照設定をしていなければ動かない。

# 配列の複雑さ

さらに、配列では特有の注意点がいくつもあります。

## 添字の型

Solidityでは、配列の要素は0から始まり、「負の値でアクセスすると末尾から数える」というような機能がないこともあって、添字の型は`uint`となっています。C言語的に`for(int i = 0; i < arr.length;++i){ arr[i] }`のように書いてしまうと、`int`を`uint`に暗黙の変換ができないので、コンパイル時点でエラーとなります。ループカウンタは`uint`で宣言しましょう。

## 固定長配列と動的長さの配列[^1]

Solidityの配列には、固定長のものと動的長さのものがありますが、動的長さの配列は`memory`と`storage`で挙動が異なります。

* 固定長配列…`int[3] arr;`のように、宣言時に個数を決め打つ。配列リテラルも固定長配列扱い。
* `memory`の動的長さの配列…`int[] memory arr = new int[](5);`のように、`new`で長さを決める。一度`new`したあとには、長さを**変更できない**。
* `storage`の可変長配列…デフォルトでは要素0個の配列。`.push`や`.length`の操作で長さを変更可能。

なお、現行のSolidityでは、動的長さの配列に（配列リテラルを含め）固定長配列を代入できないので、「最初にリテラルを追加してから`.push`していく」ようなことは行なえません。また、`memory`配列は後から長さを変更できないので、「余分目に確保しておく」あるいは「必要な長さを事前に算出する」ような操作が必要です。

# ハッシュテーブル（`mapping`）

連想配列的に使える`mapping`ですが、中身はハッシュテーブルになっていて[^2]、元のキーの値は**記憶していません**（いくつ入っているか知ることも不可能です）。また、事前に設定していなかったキーで取得しようとした場合、ゼロクリアされた値が得られます。`storage`専用です。

# 脚注
[^1]: `memory`の方の挙動が「可変長」とはいいがたいので、こうしています。
[^2]: ハッシュ値は256ビットのKeccakなので、ガス代を現実的に支払える範囲内であれば、キーの衝突は気にしなくていいでしょう。
asyncの微妙な引っかかりどころ

皆さんは既に元気にasync/awaitを使いこなされているかとは思いますが、個人的に引っかかったところを備忘録にしておこうと思います。
なお推論コミです。

まずはコードから。

```async.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

namespace test
{
    class Program
    {
        static void Main(string[] args)
        {
            //Main内でasyncする場合はTaskを用意して走らせる必要がある。
            var task = Task.Run(async () =>
            {
                //１．ここでawaitすると同期処理に
                var alpha = GetsSum(5);
                var bravo = GetsSum(7);
                //２．ここでawaitすると非同期処理に
                int a = await alpha;
                int b = await bravo;

                Console.WriteLine($"{a}+{b}={a + b}");
            });
            
            Console.ReadLine();
        }

        //一定時間ごとに値を加算、コンソールに出力する。
        static async Task<int> GetsSum(int interval)
        {
            Console.WriteLine($"task start interval {interval}");
            var intTask = Task<int>.Run(() =>
            {
                var sum = 0;

                for (int i = 0; i < 1000/interval; i++)
                {
                    sum += i;
                    Console.WriteLine($"interval {interval}'s sum : {sum}");
                    Thread.Sleep(interval);
                }

                return sum;
            });

            return await intTask;
        }
    }
}
```

単純に加算していくプログラムですが、awaitをかける部分を間違えると同期処理になってしまいます。
１．の部分でかけると同期処理に。２．の部分でかければ非同期処理になりました。
宣言時にawaitをかけると引っかかるのかなーと思った次第でした
GoでBenchmarking Raspberry Pi Zero W GPIO Speed

> やっとラズパイZeroWが手に入ったのでとりあえずGo言語でGPIOアクセス速度の調査を行った
> 調査は単純にGPIOをトグルし1Clockの周波数を取得した。
<font color='Blue'> 2018/4/29 コメントにてCコンパイラの最適化オプションを使うと良いとのことなのでWiringPi-Goで追加検証</font>

```
for {                                                                                               
    pin.Toggle()
}
```

###　調査結果

* リファレンス　C言語 WiringPi
結果は6MHz。結構速い。（コードは下の参考のHi/Low書き込みループ。トグルではない）
![Screenshot from 2018-04-25 20-02-28.png](https://qiita-image-store.s3.amazonaws.com/0/145884/349e5694-ab43-5d11-5131-de995b53bc52.png)
> [参考Benchmarking Raspberry Pi GPIO Speed](http://codeandlife.com/2015/03/25/raspberry-pi-2-vs-1-gpio-benchmark/)

* [gobot](https://gobot.io/)
　結果は 10KHzと遅い。デューティも悪い。
　だが、このライブラリはI2C、SPI、センサ等の部品をサポートする初心者にやさしいライブラリであり、GitHubスターも多い。oledの動作確認でお世話になったので応援したい:wink:
　公式のサンプルコードの内容がHelloWorld程度なのが少し残念。
![Screenshot from 2018-04-24 23-32-34.png](https://qiita-image-store.s3.amazonaws.com/0/145884/2a5c893e-3f38-18c1-aa90-fbc495c5d059.png)

* [go-rpio](https://github.com/stianeikeland/go-rpio) 
　結果は400KHz。Cの1/10以下と寂しい結果
![gorpio.png](https://qiita-image-store.s3.amazonaws.com/0/145884/34b0ee2c-6b08-c52b-9d94-8e63bd940913.png)

* [bcm2835](https://github.com/janne/bcm2835)
　結果は340KHz。CのBCM2835はWiringPiより速いはずなのになぜそうならないのか・・・bcm2835とかCGOでCをコールしてるだけだと思うのだが、オーバヘッドでかすぎ
![Screenshot from 2018-04-26 20-02-00.png](https://qiita-image-store.s3.amazonaws.com/0/145884/36c1dd8d-b4f8-7bb0-4f8f-c5690a042850.png)

* [WiringPi-Go](https://github.com/hugozhu/rpi)
　結果は200KHz。やっぱりオーバヘッドがでかいみたい。
あとソースの修正が必要だった。
![Screenshot from 2018-04-26 20-49-06.png](https://qiita-image-store.s3.amazonaws.com/0/145884/d6d092eb-e934-0a5e-c376-24e1ae000e57.png)
![Screenshot from 2018-04-26 20-47-18.png](https://qiita-image-store.s3.amazonaws.com/0/145884/6a05be80-7367-a4e6-e69c-2c149880e11b.png)
　WiringPi-Goのソースに最適化オプションを追加して再調査
結果は300KHzと効果あり。ただ、前回のコードを実行すると250KHzだったので効果20%となる。
![Screenshot from 2018-04-29 12-24-13.png](https://qiita-image-store.s3.amazonaws.com/0/145884/a0c6eff6-9c07-43a8-e95d-84af04ed3f2c.png)

```go
package rpi

/*
#cgo CFLAGS: -g -O3 -std=c99
#cgo LDFLAGS: -lwiringPi
```

> CGOのオプションについては初めて触ったのでやり方が合っているのかわからないが、
適当に書き換えるとGoコンパイラに怒られるし、結果が変わるので大丈夫だろう・・・
CGOのオプションてコメントで書けるのか:sweat_smile:

---

##### あとがき
GoならCに近い性能がでると思っていたので、Go信者※の俺にはツライ現実だった。まぁラズパイではI2CとSPIが使えればいいよね
※仕事で.Netしかさわらないので、いつまでたってもGoを覚えられないけど、Goの設計思想に感銘を受けた。が普段つかわないので覚えられない:weary:

というわけでGoで少しでも速いGPIOが欲しいなら[go-rpio](https://github.com/stianeikeland/go-rpio)を使おう。
ちなみに、ToggleよりHigh/Lowと書いたほうが10%くらい速くなった。
Toggleは切り替え前にif文が入るため速度が落ちるようだ。


```
for {                                                                                               
    pin.High()
    pin.Low()                                                                           
}
```

どうでもいいが、ZeroWもソニー製のようだ
![Screenshot from 2018-04-25 20-40-47.png](https://qiita-image-store.s3.amazonaws.com/0/145884/a1270522-466c-48f0-681a-f6f03214ba33.png)