OmniAICreator/Qiita-1.07M huggingface dataset:
【Python】サクッとAmazonの商品情報を検索してみる


# はじめに
AmazonProductAdvertisingAPIのItemSearchを使ってAmazonの商品情報を検索します。
APIを利用するにはアカウントの登録が必要ですので、まだ持ってない場合は下記を参考に。
[Amazon Web サービス入門(Product Advertising API)](https://www.ajaxtower.jp/ecs/)

# 使用するライブラリ
API用のライブラリは[bottlenose](https://github.com/lionheart/bottlenose)を使用します。

```bash
$ pip install bottlenose
```

他にもpython-amazon-product-apiなどありますが、上記がシンプルで一番使いやすかったです。他のは商品情報を取得した後にエラーになったりと、よくわからない状態になってやめました。

# 今回書いたコード
https://github.com/maroemon58/simple-amazon-item-search

```bash
$ tree -a
.
├── .env.sample    # アカウントのIDやキーを設定　※ファイル名を.envに変更すること
├── .git
│   :
:
├── .gitignore
├── categorys.csv  # カテゴリ一覧
└── main.py        # メインプログラム
```

```main.py
import os
import urllib
import re
import pandas as pd
from dotenv import find_dotenv, load_dotenv
from bottlenose import Amazon
from bs4 import BeautifulSoup
from retry import retry

AWS_ACCESS_KEY_ID = os.environ.get('AWS_ACCESS_KEY_ID')
AWS_SECRET_ACCESS_KEY = os.environ.get('AWS_SECRET_ACCESS_KEY')
AWS_ASSOCIATE_TAG = os.environ.get('AWS_ASSOCIATE_TAG')

# エラーの場合、1秒待機しリトライ（最大5回）
@retry(urllib.error.HTTPError, tries=5, delay=1)
def search(amazon, k, i):
    print('get products...')
    return amazon.ItemSearch(Keywords=k, SearchIndex=i)
    

def main():
    amazon = Amazon(AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, AWS_ASSOCIATE_TAG, Region='JP',
                    Parser=lambda text: BeautifulSoup(text, 'xml')
                    )
    
    keyword = input('keyword? >> ')
    
    df_category = pd.read_csv('categorys.csv')
    indexs = range(df_category.shape[0])
        
    while True:
        # show category
        for i, v in df_category.iterrows():
            print(str(i) + '. ' + v['DispName'])
        print('')
        
        num = input('category number? [None : All] >> ')
        if not num:
            category = 'All'
            break
        elif re.match('[\d]', num):
            num = int(num)
            if num in indexs:
                category = df_category.loc[num, 'SearchIndex']
                break

    response = search(amazon, keyword, category)
    
    for item in response.find_all('Item'):
        print(item.Title.string)


if __name__ == '__main__':
    # find .env automagically by walking up directories until it's found, then
    # load up the .env entries as environment variables
    load_dotenv(find_dotenv())
    
    main()
```


```categorys.csv
SearchIndex,DispName
Apparel,服＆ファッション小物
Appliances,大型家電
Automotive,カー・バイク用品
Baby,ベビー&マタニティ
Books,本(和書)
Electronics,家電&カメラ
Grocery,食品・飲料・お酒
HealthPersonalCare,ヘルス&ビューティー
Music,ミュージック
Software,ソフトウェア
SportingGoods,スポーツ＆アウトドア
Toys,おもちゃ
VideoGames,ゲーム
Watches,時計
```

``` .env.sample
# ファイル名を.envに変更すること
AWS_ACCESS_KEY_ID=
AWS_SECRET_ACCESS_KEY=
AWS_ASSOCIATE_TAG=
```
※ dotenvについては[こちら](https://qiita.com/hedgehoCrow/items/2fd56ebea463e7fc0f5b)

注意すべき点はAPIの仕様で1時間当りの上限数（2000回）があるのですが、その制限内でも頻繁に503エラーが発生します。（調べた感じそういうものらしいです。。。）その対策で[retry](https://github.com/invl/retry)というライブラリを利用し、エラーとなったらリトライさせています。
フォーマットできなくなったUSBメモリを再認識

Qiita初投稿なのでちょっと難易度低めのやつを

Windowsで使っていたUSBメモリが認識はするが、フォーマットできなくなった
ディスクの管理からパーティション削除→再作成をするが、パーティション作成だけうまくいってフォーマットがされない状態になる

仮想環境でLinux OSを起動（うちの環境はVine Linux6.0）
端末から、認識したUSBメモリのドライブを確認する
`ls /dev/ | grep sd`
（grepで絞らなくてもいいけど、個人的には意味が分かりやすいので）
認識したドライブはsdbであることを確認
（決してパーティションのsdb1のほうではない）

`dd if=/dev/zero of=dev/sdb`
ddコマンドでsdbを全部zeroで埋める

終わったら、ホスト側にUSBメモリを認識
そうすると「使用するにはフォーマットが必要」と聞かれるのでフォーマットする

以上で作業終了
GoogleAppEngine上でのCloudEndpointsFrameworksクイックスタートできなかった

[App Engine 上での Cloud Endpoints Frameworks のクイックスタート](https://cloud.google.com/endpoints/docs/frameworks/python/quickstart-frameworks-python?hl=ja)がこれ通りやってもできたかったので書く

#モチベーション
* FireBaseとかGoogleCloudPlatformとか簡単で便利そうなので使ってみたかった
* Googleの製品だけでいろいろなんとかなるかやってみたかった
* ひとまず簡単にAPIをついくりたいと思って試しにクイックスタートをドキュメント通りやったのにできなかったので手順と共に書き残しておく

#クイックスタート
### 1. google Clodu SDKをインストールする

[Download the SDK for App Engine](https://cloud.google.com/appengine/docs/standard/python/download)
gcloudが使えるようになるはずなのでプロジェクトを登録する

```
❯ gcloud components update
❯ gcloud components install app-engine-python
❯ gcloud config set project [PROJECT-ID]
```


### 2. API

サンプルコードは以下
https://github.com/GoogleCloudPlatform/python-docs-samples/tree/master/appengine/standard/endpoints-frameworks-v2/echo

```
git clone https://github.com/GoogleCloudPlatform/python-docs-samples
```


インストールするパッケージは以下のファイルに記載してある

```
❯ cat ./requirements.txt 
google-endpoints==2.4.5
google-endpoints-api-management==1.3.0
```

パッケージをインストールする

```
pip install -t lib -r requirements.txt
```

公式だと
https://gapi-pypi.appspot.com/admin/nurpc-dev
が死んでるのでだめだった

```
#ドキュメント通りだと以下でインストールできない
pip install -t lib google-endpoints --extra-index-url=https://gapi-pypi.appspot.com/admin/nurpc-dev --ignore-installed
```

ローカルで起動してみる

```
❯ dev_appserver.py app.yaml
```

curlとか使って試す
http://localhost:8080/_ah/api/echo/v1/echo/
にPOSTしてみて成功してればOK

### 3. OpenAPIの設定ファイルを生成する
```
❯ python vender/endpoints/endpointscfg.py get_swagger_spec main.EchoApi --hostname [PROJECT-ID].appspot.com
```
hostnameの末尾はappspot.comであることに注意

### 4. OpenAPIの設定ファイルをデプロイする
api-managimentのアップデートがあったらしくて、endpointのdeploy時に従来だとgcloud service-managementだったけどバージョンがあがったため以下で行う

```
❯ gcloud endpoints services deploy ehov1openapi.json
```

リストを表示

```
❯ gcloud endpoints configs list --service=[PROJECT-ID].appspot.com
CONFIG_ID     SERVICE_NAME
2017-11-24r0  [PROJECT-ID].appspot.com
```
ここもhostnameの末尾はappspot.comであることに注意
deployしたCONFIG_IDとSERVICE_NAMEをapp.ymlに指定する

```
❯ cat env_variables.yaml 
env_variables:
  ENDPOINTS_SERVICE_NAME: [PROJECT-ID].appspot.com
  ENDPOINTS_SERVICE_VERSION: 2017-11-24r0
```

### APIのバックエンドをdeployする
```
❯ gcloud app deploy
```

deployされて
[PROJECT-ID].appspot.com/_ah/api/echo/v1/echo/
が叩ければOK
また、エンドポイントのマネジメントコンソールでリクエストが観測できればOK


#さいごに
* なかなかクイックスタートできなかった
* 公式ドキュメント以外に世の中を探してもでてきにくいなと思った
* いろいろ(FireBaseとかも)となにかつくるときに簡単にできそうだから使っていきたいと思っている
KB4054517でWindowsが使い物にならなくなった

(2018/01/09追記)
編集リクエストを頂き、タグ「WindowsUpdate」を追加しました。 @7of9 さん、ご指摘ありがとうございました。

---

KB4054517の適用中、Windowsが使い物にならなくなったので備忘録を兼ねて書きます  
素人知識かつ初めての投稿なので不備がありましたら指摘いただけると幸いです

# 症状
- Windows Updateが、「KB4054517をダウンロード中」の状態から動かなくなる。
- 再起動を試みると、「Windowsの準備をしています」の状態で数時間が経過してしまう。
    - 強制シャットダウンを試みるも、再度起動した際に同様の症状が再現する。
- Cドライブの残容量が減っていき、50GBあった容量が0になってしまった。

# 環境
- Windows 10 home 64bit (バージョン1709)
- 以前のWindows Updateは適用済み

# 対策
このアップデートを自動でやろうとして失敗しているようなので、

1. 自動アップデータ(?)からアップデートを隠す
2. 手動でアップデートを適用する(任意)

とやるのがよさそう。

## アップデートを隠す
1. [このサイト](https://support.microsoft.com/ja-jp/help/3073930/how-to-temporarily-prevent-a-driver-update-from-reinstalling-in-window)
 から [wushowhide.diagcab](http://download.microsoft.com/download/f/2/2/f22d5fdb-59cd-4275-8c95-1be17bf70b21/wushowhide.diagcab) をダウンロードする。 [^1]
2. 起動し、選択肢から「Hide updates」を選択。
3. Updateの一覧が表示されるので、KB4054517にチェックを入れて次へ。
4. ツールがUpdateを自動で適用しないようにしてくれるので、完了を押して終了する。

実行中のWindows Updateを中断してくれるわけではないようなので、アップデートが進行中の場合は再起動が必要みたい。

## 手動でアップデートを当て直す(任意)
上記の方法だけで再起動時に時間を食う、Cドライブを食い潰すなどの症状は解決するはずだが、配布されたアップデートを適用しないままというのも気持ちが悪いので手動でアップデートを当て直した。

1. [Windows Update カタログ](http://www.catalog.update.microsoft.com/Home.aspx) にアクセスし、KB4054517で検索を掛ける。一覧からPCに適したファイルをダウンロードする。
2. ダウンロードした .msu ファイルをダブルクリックして開き、インストールする

# 参考
- [[Windows10] Windows Update を個別で停止する方法](https://jp.answers.acer.com/app/answers/detail/a_id/45295/~/%5Bwindows10%5D-windows-update-%E3%82%92%E5%80%8B%E5%88%A5%E3%81%A7%E5%81%9C%E6%AD%A2%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95)
- [Windows Update カタログからドライバーや修正プログラムを含む更新プログラムをダウンロードする方法](https://support.microsoft.com/ja-jp/help/323166/how-to-download-updates-that-include-drivers-and-hotfixes-from-the-win)

[^1]: バージョン1511用と書いてあるが、バージョン1709でも問題なく動作した。
Excelで関数型プログラミングに目覚めたかもしれない。（応用編）

前回書いた基礎編の続きです。実際に、業務アプリを書く場合を例に説明していきます。


# ロット番号をMATCHする。

前提として、金属加工業で丸鋼からNC旋盤で部品を作成し、工程はロットで管理しているとします。
ロットは、年（４桁）ー機械番号（２桁）ー連番（３桁）とし、Excelのテーブルでデータを管理しています。
テーブル T1_  が検索先、テーブル T2_ を検索元、
ロット番号は、各テーブルの左端に、呼び出される関数はT2_の見出しが
LIの列にあるとし、列全体に関数 =MLOT(T1_,T2_) で埋められています。

```vbnet
Function MLOT(R1, R2)
    MLOT = MP(R1, R2, 3, 3, 0, 0)
End Function
```
前回定義した、関数MPを使うと簡単ですね。返り値は、検索先データの行数です。行数がわかれば、
検索先からデータを持ってくるには、隣のセルあたりに　関数 =DI(T1_[製品名],[@LI])　
とかすれば呼び出せるわけです。

# ３テーブルを使用し同じキーのデータを検索して集める。

実は、１行のテーブルはコントロールレコードとして使用できます。
テーブル T1_を検索先、テーブルT2_を検索キーを含むコントロールレコード、
テーブル T3_を検索結果が入るものとします。T1_,T2の左端は、製造番号（４桁）が入っています。T3_[L]に関数 =MPC(T1_,T2_,T3,1,1) で埋めます。

```vbnet
Function MPC(R1, R2, R3, Optional L = 2, Optional P = 1, Optional M1 = 0, Optional M2 = 1, Optional M3 = 0, Optional S = "") ' MATCH PAIR CHAIN
    On Error Resume Next

    M3 = IFZS(M3, MM(R3))
    M1 = IFC(M3 = 1, M1, DI(R3, M3 - 1))
    S = MP(R1, R2, L, P, M1, M2)
    
    MPC = S
End Function
```

T3_[L]には、検索先の同じ製造番号の行数が表示されます。
後は、T3_[製品名]　に関数 =DI(T1_[製品名],[@L])を埋めていくなどして
データを引っ張っていきます。

# 同一列で同じキーのデータを検索する。 

上ではテーブルを３つ使いましたが、同一列の場合に、列下の同一キーデータの場合はどうでしょう。簡単ですね。

```vbnet
Function MD(R, Optional L = 0, Optional P = 1, Optional M1 = 0, Optional M2 = 0, Optional S = "")
    On Error Resume Next
    Dim V: V = MV(R, M2, L, P)
    M1 = M2
    S = MLOOP(R, R, M1, M2, L, P, V)
    MD = IFC(S = M2, "", S)
End Function
```

# 小技1　連続した列のデータを取ってきて縦に並べる。

T1_は、検索先のテーブルで、T2_ にデータを受けます。
列[A]に関数 =DIJ(T1_[[D]:[K]],[A],3) を埋めると、取ってきたデータが
縦に並びます。

```vbnet
Function DIJ(R1, R2, I) 
    DIJ = DI(R1, I, MM(R2))
End Function
```
# 小技2　Rangeを配列に格納して返す。

```vbnet
Function AR(R, Optional M = 0, Optional N = 0, Optional S = "")
    On Error Resume Next
    M = IFZS(M, MM(R))
    N = IFZS(N, R.Rows.Count)
    ReDim S(1 To N): Dim J: For J = 1 To N: S(J) = DI(R, M, J): Next J
    AR = S
End Function

Function AC(R, Optional N = 0, Optional M = 0, Optional S = "")
    On Error Resume Next
    M = IFZS(M, R.Columns.Count)
    N = IFZS(N, NN(R))
    ReDim S(1 To M): Dim I: For I = 1 To M: S(J) = DI(R, I, N): Next I
    AC = S
End Function
```
# 小技３　配列振分サブルーチン

配列からデータを複数の変数に割り当てます。
日報データを作成するときに使った技で、テーブル列の追加、変更に対応できて便利です。

```vbnet
 CALL DD(AR(R,N),年,機械,連番,製品番号,製品名) 
```
という風に使用します。

```vbnet
Sub DD(AA, ParamArray AP())
    Dim J: For J = 0 To UBound(AP)
        AP(J) = AA(J + 1)
    Next J
End Sub
```

# 最後に

訂正依頼ありがとうございました。
VSCODE　からコピーしてペッタンしているのですがまだ慣れていません。

VBA は、普通でない使い方をすると、結構バグがあるようです。
Offset,Resize を誤って使うとハングまたはファイルを壊すし、
テーブルは、Rangeではなく ListObjects　らしいのに、Rangeで扱えてしまうとか、
引数で as Range　を付けるとエラーになるとか、
場合によって関数IFCがエラーになるのでIF文を使わざるを得ないとか、
再計算の実行順序が保証されてないのに関数 MPC が正しく動作するとか、
いろいろと謎があります。

簡単な実験をするには、Excelは最適なので楽しいです。

テーブルと構造的参照は、新しく入った概念なので、安定するには時間がかかるのでしょう。
VBA　も継ぎ接ぎされているので、M言語がユーザ定義関数として使えればいいのでしょうかね。
次はM言語について書く予定です。

ではでは。
Raspberry Piでサーボモーターを回す

このエントリは「[Raspberry Piでスマートロックつくった](https://qiita.com/undo0530/items/669b6ee6b2277ea64b33)」の解説2つめになります。
サムターンを回してカギを開閉するためにサーボモーターSG92Rを使います。Pythonでサーボを簡単に扱うライブラリはいくつかありますが、今回はRaspbianに最初から入っているRPi.GPIOを使って動かします。
# GPIOピンに接続
[秋月電子通商の商品紹介ページ](http://akizukidenshi.com/catalog/g/gM-08914/)によると、
動作電圧：4.8～6V、
配線：茶＝ＧＮＤ、赤＝電源［＋］、橙＝制御信号
だそうです。
![M-08914 (1).jpg](https://qiita-image-store.s3.amazonaws.com/0/222969/bc21ecad-03d4-0b50-a1af-9022ab192ce4.jpeg)
なので茶色をGND、赤を5V、黄色を4番あたりに繋いで制御パルス用に用います。
# プログラム
```python3
import RPi.GPIO as GPIO
import time

GPIO.setmode(GPIO.BCM)

#GPIO4を制御パルスの出力に設定
gp_out = 4
GPIO.setup(gp_out, GPIO.OUT)

#「GPIO4出力」でPWMインスタンスを作成する。
#GPIO.PWM( [ピン番号] , [周波数Hz] )
#SG92RはPWMサイクル:20ms(=50Hz), 制御パルス:0.5ms〜2.4ms, (=2.5%〜12%)。
servo = GPIO.PWM(gp_out, 50)

#パルス出力開始。　servo.start( [デューティサイクル 0~100%] )
#とりあえずゼロ指定だとサイクルが生まれないので特に動かないっぽい？
servo.start(0)
#time.sleep(1)

for i in range(3):
    #デューティサイクルの値を変更することでサーボが回って角度が変わる。
    servo.ChangeDutyCycle(2.5)
    time.sleep(0.5)

    servo.ChangeDutyCycle(7.25)
    time.sleep(0.5)

    servo.ChangeDutyCycle(12)
    time.sleep(0.5)

    servo.ChangeDutyCycle(7.25)
    time.sleep(0.5)

servo.stop()
GPIO.cleanup()
```
# 実行結果
<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">サーボモーター動いたo(^▽^)o <a href="https://twitter.com/hashtag/RaspberryPi?src=hash&amp;ref_src=twsrc%5Etfw">#RaspberryPi</a> <a href="https://t.co/09ljoifxkY">pic.twitter.com/09ljoifxkY</a></p>&mdash; undo (@undo) <a href="https://twitter.com/undo/status/934405218074112000?ref_src=twsrc%5Etfw">2017年11月25日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
# ちなみに
ラズパイでサーボっていうとよく[SG90](http://akizukidenshi.com/catalog/g/gM-08761/)が紹介されていますが今回はSG92Rを使っています。カギを回すために一応トルクがちょっと強めなSG92Rを採用したのが理由ですが、結果としては十分すぎるくらい強かったのでSG90でも問題なく回せると思います。サイズ感で好みの方を使えば良いでしょう。
Next：[Raspberry PiにNFCリーダを接続してSuicaを読み取る](https://qiita.com/undo0530/items/89540a03252e2d8f291b)
【vue】vue-routerでviewごとに異なるcssトランジションを設定したい

# 概要

この記事は [モバイルファクトリー Advent Calendar 2017](https://qiita.com/advent-calendar/2017/mobilefactory) 17日目の記事です。

16日目の記事は @tsukumaru さんの [go-staticmapsの地図にアイコンとして任意の画像を表示したい](https://qiita.com/tsukumaru/items/0f71943366bd7f8d63c8) でした。

先日vueのcssアニメーションについて触れる機会があったので、17日目の本記事ではタイトルのとおりvueのcssトランジションまわりについてご紹介します。

# vueでトランジション

vueで`v-if`や`v-show`によってコンポーネントの表示・非表示が切り替わる際にトランジションをさせたい場合は、そのコンポーネントを`<transition>`で囲うことで実現できます。
transitionコンポーネントのname属性に基づいたcssアニメーションが再生され、このときcssクラス名は`*-enter-to`,`*-enter`といった特定のクラス名でなければいけません。

参考：[Enter/Leave とトランジション一覧 - トランジションクラス](https://jp.vuejs.org/v2/guide/transitions.html#トランジションクラス)

```html
<div id="demo">
  <button v-on:click="show = !show">
    Toggle
  </button>
  <transition name="fade">
    <p v-if="show">hello</p>
  </transition>
</div>
```

```javascript
new Vue({
  el: '#demo',
  data: {
    show: true
  }
})
```

```css
.fade-enter-active, .fade-leave-active {
  transition: opacity .5s
}
.fade-enter, .fade-leave-to {
  opacity: 0
}
```

# vue-routerでviewを変更した際にトランジションさせる

`<router-view>`内でレンダリングされるviewが変更された際にトランジションを設定する場合も同様に`<transition>`を用いることで実現することができます。

```html
<transition name="fade">
  <router-view></router-view>
</transition>
```

# viewごとに異なるトランジションを設定する

先ほどの例だとrouter-viewを通して表示されるすべてのviewに対してfadeトランジションを行いますが、場合によってはviewごとに異なるトランジションを設定したい場合もあると思います。

## トランジションの仕組み

[Enter/Leave とトランジション一覧 - 単一要素-コンポーネントのトランジション](https://jp.vuejs.org/v2/guide/transitions.html#単一要素-コンポーネントのトランジション)に記述がありますが、transitionコンポーネントにラップされたコンポーネントに対してCSS トランジションのクラスを追加・削除を行うことでトランジションさせるような仕組みになっています。
なので、実際先ほどの例でhogeコンポーネントが描画されトランジションをしている間には以下のようなクラスが付与されています。

```html:hogeコンポーネントが描画されたとき
<hoge class="fade-enter-active fade-enter-to"></hoge>
```

## コンポーネントごとにCSSトランジションを記述する
つまり、描画されているコンポーネントのルートノードに対してCSSクラスが追加されるので、各コンポーネントごとにCSSトランジションを設定すれば各viewごとに異なるトランジションをさせることができます。

ただ単に設定しただけでは`*-enter-active`等のクラス名が重複してしまうので、各コンポーネントのスタイルを[scoped css](https://vue-loader.vuejs.org/ja/features/scoped-css.html)にしてあげます。

```html:hoge.vue
<template>
  <p>HOGE</p>
</template>

<style scoped>
.fade-enter-active {
  transition: all 1s 0s ease;
}
.fade-enter {
  opacity: 0;
}
</style>
```

```html:fuga.vue
<template>
  <p>HUGA</p>
</template>

<style scoped>
.fade-enter-active {
  transition: all 1s 0s ease;
}
.fade-enter {
  transform: translate(-100px, 0);
}
</style>
```

```html:App.vue
<template>
  <div id="app">
    <transition name="fade" appear>
      <router-view></router-view>
    </transition>
    <div>
      <router-link to="/hoge" >to hoge</router-link>
      <router-link to="/fuga" >to fuga</router-link>
    </div>
  </div>
</template>
```

![vue.gif](https://qiita-image-store.s3.amazonaws.com/0/102294/bb8de093-b0e8-2965-bc7d-d0a9fd36ef6c.gif)


viewごとに異なるトランジションを設定できました。

# まとめ

scoped cssを利用することでviewごとにトランジションを設定することが出来ます。同様にcssアニメーションも設定することができます。

vueのトランジションに関するドキュメントを見る限り、JSフックやリストトランジション等できることは様々あるようなので、それらに触れた際にはまたまとめておきたいと考えてます。

明日の担当は @akihiro_0228 さんです。よろしくお願いします。
UE4 VRテンプレートでOculusを使用したときに地面に埋め込まれる件

#原因
GetHMDDeviceNameで取得される文字列が、いつからか変更になったようです。

#修正箇所
BP MotionControllerPawnのイベントグラフで、以下のSwitch on Nameに
OculusHMD（スペースはありません）を追加します。

![oculushmd.png](https://qiita-image-store.s3.amazonaws.com/0/210135/36ba0f13-cfd5-97fe-cf0b-dfb3dab7356d.png)
pandoc Windows版のインストールpath

# pandoc のpathについて
ほとんど素人なので、以下のような質問をご容赦ください。
## OS: Windows7 Proffessional 64bit
## pandoc-2.0.4-windows.msi  をデフォルトでインストール

## C:\Users\Okuma>pandoc -v とやると
pandoc 2.0.4
Compiled with pandoc-types 1.17.3, texmath 0.10, skylighting 0.4.4.1
Default user data directory: C:\Users\Okuma\AppData\Roaming\pandoc

## C:\Users\Okuma>where pandoc とやると
C:\Users\Okuma\AppData\Local\Pandoc\pandoc.exe
これは実際には見当たらない！

## どのようにインストールすればよいのでしょうか？
【Breed】RPGのモンスターなどのキャラクターを作成するときに使うデザインパターン

RPGなど、キャラクターを扱うゲームを制作するときにに役に立つデザインパターンの情報です。
有名なGoFデザインパターンの23種類の中に含まれているものではありません。
サンプルコードはJavaで書いておりますが、UnityやC++など他の言語でも応用可能です。

##モンスタークラス

登場人物をオブジェクト指向のプログラムで作る時の一例をここで示しておきます。
まず、親クラス(あるいはインターフェース)としてキャラクターのモデルクラスを定義し、それを継承する形で、主人公やその仲間、モンスターなどのクラスを定義します。

```
//キャラクターを表す抽象クラスのフィールドの定義の一例
public abstract class Character{
　 //名前
   protected String name;
　 //ヒットポイント 
   protected int hp;
   //ヒットポイント最大値
   protected int maxHp
   //攻撃力
   protected int attackPower;
   //その他ゲームで必要になるステータス(ここでは省略)
　　　　　　....
}
```



```
//キャラクタークラスを継承したモンスター『スライム』を表すクラス
public class Slime extends Character{
　　//スライム(名前 スライム,HP　7/7,攻撃力 10のモンスター)を新規作成するコンストラクタ
　　Slime(){
      super.name = "スライム";
      super.hp = 7;
      super.maxHp = 7;
      super.attackPower = 10;
      //以下略
      ...
   }
}

```

##課題

さて、ここで、実際に普段遊ばれているゲームを想像していただきたいのです。

敵が登場する場合、同じ種族の敵が複数同時に登場することは珍しくありません。
『スライムA』『スライムB』『スライムC』なんて一体ずつを識別するためのアルファベットなどを割り振られながら。

また、モンスターが仲間になるRPGがあった場合、モンスターごとに個性が与えられることがあります。オス/メスだとかのんびり屋さん/せっかちのような性格だとか、少しずつ能力値が違ったり、あるいはプレイヤーが個別に名前をつけられたら愛着がわくかもしれません。

そういった要素を作りこむ場合には、『スライム』という種族としての個性以外に『スライムA』としての個体としての個性を与えなければなりません。

また、別のケースを考えてみましょう。
たとえば、モンスターが151種類登場する大作ゲームを考えてみましょう。
そういったものを作る場合、いくつモデルクラスをいくつ作らないといけないでしょうか。親クラスが１つとして、それに加えて、151種類のモデルクラスを作る必要が出てきます。そうなるとソースコードの量が膨大になっていき、開発だけでなく、保守運用も大変になっていきます。

##Breedパターン

これらを解決するデザインパターンがBreedパターンです。Breedとは英語でそのまま種族のことです。最大HPや攻撃力、モンスター名など、種族固有の数値は種族クラスのインスタンスをフィールドとしてキャラクターに持たせます。

```
//種族クラス
public class Breed{
   //種族の名前(スライム,ドラゴン,勇者,魔法使いなど)
   private String name;
   private int maxHp;
   private int attackPower;
   //以下略
   ...
}
```

```
public class Character{
   //種族クラスのインスタンスをフィールド変数にする
   private Breed breed;
   //キャラクターの名前(スライムA,ロト,サトシなど)
   private String name;
   private int hp;
   //以下略
   ...
}

```

##メリット

このパターンを採用することにより、スライムやドラゴンという種族を示す数多くのクラスが不要になり、すべて種族クラスのインスタンスになります。つまり、クラスの数はモンスターの種類の数だけ必要だったのが、キャラクタークラスと種族クラスの２つにまで減ります。

種族の名前と個体の名前を明確に分けて管理することができるので、スライムが複数同時に出てくる時にアルファベットを割り振るのも簡単になります。

また、150種類モンスターが居る状態で151匹目を追加したいとき、プログラムのソースコードを一行も書き換える必要がなくなります。外部のリレーショナルデータベースへ、あるいはJson形式で設定ファイルに新規データを追加するだけでいいのです。もちろん、外部データをBreedインスタンスに復元するロジックをあらかじめ組んでいる必要はありますが。これによって、プログラムが読めない人にも保守運用を任せられるようになります。

```
//json形式,後から容易にデータを追加可能
[
{名前:"スライム",maxHp:7,attackPower:10, ... },
{名前:"ドラゴン",maxHp:1000,attackPower:100, ... },
];
```

筆者は、プレイユーザーがモンスターを自分で設計できるゲーム(たとえばRPGツクールのようなものを思い浮かべると分かりやすい)を作ろうとしていたのですが、モンスターのデータをデータベースに外部化するように作らないと、モンスターデータをユーザーが後から追加できないという壁にぶち当たり、そのときにBreedパターンが役に立ちました。


##参考資料
Game Programming Patterns ソフトウェア開発の問題解決メニュー impress top gearシリーズ 

<a href="https://www.amazon.co.jp/Programming-Patterns-%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2%E9%96%8B%E7%99%BA%E3%81%AE%E5%95%8F%E9%A1%8C%E8%A7%A3%E6%B1%BA%E3%83%A1%E3%83%8B%E3%83%A5%E3%83%BC-impress-gear%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA-ebook/dp/B015R0M8W0/ref=sr_1_1?ie=UTF8&qid=1513503869&sr=8-1&keywords=%E3%82%B2%E3%83%BC%E3%83%A0%E3%80%80%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3">
 　<img src="https://images-fe.ssl-images-amazon.com/images/I/51b16u3rFJL.jpg" width="157" height="198">
</a>
Google ChromeでVagrant+VirtualBox等の開発環境でhttps接続にリダイレクトされる問題

#HTTPSに強制されてしまい開発環境がうまく利用できない。

Chromeをvagrant等の開発環境で利用していたところ、 httpsに強制されるようになりうまく表示できなくなった。
SSLを使ったサイトではないのでhttpで繋げたいが繋がらない…。

##HSTSか？
いつのまにかhttps接続を強制するHSTSが設定されていたかな？と確認するもそんなこともなく。

##解決
Chromeで、 **.app .dev ドメインではhttps接続が強制されるようになった**らしい。
[Github: Google Chrome Privacy Error](https://github.com/laravel/homestead/issues/755)

>Seems Chrome now forces .dev as well as .app domains to use strict HTTPS. 

なので、開発用として　vagrant.app　や vagrant.dev　等
app dev を利用している場合は、オレオレSSL証明書を導入するか、
.vagrant 等に変更が必要です。

今回はVirutalHostにて　sub.app.vagrant と変更することで解決しました。

めでたしめでたし。
ESP8266 > 磁気センサーの動作確認 > Sunhayato MM-DE21P

```txt:動作環境
- ESP-WROOM-02 (以下、ESP8266)
- ユニーバサル基板実装
- Arduino IDE 1.6.6
```

[カギ閉め忘れ問題 > 対処案 v0.1](https://qiita.com/7of9/items/a2bb833caa91ab798188)
にて検討しているシステム。

とりあえず、磁気検知でのGPIO入力を試した。

### 磁気センサー

- Sunhayato MM-DE21P
    - 463円 @ シリコンハウス
    - http://blog.siliconhouse.jp/archives/51804246.html
    - 1.6から3.3V駆動
    - 数kΩから数十kΩのプルアップが必要

### 半田実装

[電子工作 > 基板類が届いた > 小さめの基板 / チップコンデンサ / ポリウレタン銅線 / カプトンテープ](https://qiita.com/7of9/items/ce8df84d6133336de7c6)で購入していた[１６ホールユニバーサル基板（２．５４ｍｍ）](http://akizukidenshi.com/catalog/g/gP-02515/)上にストレートピンヘッダ経由で実装した。

![DSC_0275b.JPG](https://qiita-image-store.s3.amazonaws.com/0/32870/269f6be4-c948-dfe1-5f61-c5866814e014.jpeg)

左は気圧計の実装で作ったユニバーサル基板。
右は今回実装した基板。
上は棒磁石。

プルアップは左のユニバーサル基板で4.7kΩがVCCに接続されている。

### code 

とりあえずHIGH, LOWを検知できるか実装した。
チャタリング対策は未実装。

```c:esp8266_171216_magneticIO.ino
#include <ESP8266WiFi.h>

#define PIN_IN (4)

void setup() {
  WiFi.disconnect(); // watch dog reset対処
  Serial.begin(115200);
  pinMode(PIN_IN, INPUT);
}

void loop() {
  if (digitalRead(PIN_IN) == HIGH) {
    Serial.println("HIGH");
  } else {    
    Serial.println("LOW");
  }
  delay(1000); // msec
}
```

### 実行例

USBシリアル変換経由でシリアルモニタにて確認した(下記）。
電池はCR-123A(3V)。

![DSC_0271b.JPG](https://qiita-image-store.s3.amazonaws.com/0/32870/ad2467d5-d830-5731-5692-726f36d75ddf.jpeg)

```txt:run
LOW
LOW
LOW
LOW
LOW
LOW
HIGH
HIGH
HIGH
HIGH
HIGH
LOW
LOW
LOW
LOW
LOW
```

以下の結果となった。

- 棒磁石
    - 接触状態にてHIGHを検知
- ときどき郵便ボックスに投函される業者のマグネット
    - 検知せず

### ケース

今回のシステムでは、ケースに入れての使用を検討している。
ドアのカギかけ忘れ時に注意をうながすシステムなので、腕に付けるケースなりがいいかと思う。

![DSC_0276b.JPG](https://qiita-image-store.s3.amazonaws.com/0/32870/103ebad5-9ec1-1947-4c3a-88fc3d592900.jpeg)

xxxメイトを腕に巻いてる状態は不自然なので、さらに小型化して別のケースにするか、なんらかの検討が必要だろう。
Linux 4.14のリリースで気になるものをつまむ

この記事は、株式会社ACCESS Advent Calendar 2017の12日目の記事です。

---

# linux 4.14 LTS
リリースされた中で個人的に気になる機能をピックアップしていこうかと思います。

## 5段階ページングサポート
カーネルのサポートするメモリアドレス空間が大きくなります。
これまでは 256TiB 仮想アドレス、64TiB リアルアドレスのサポートだったのが 128PiB 仮想アドレス、4PiBリアルアドレスまで認識できるようになりました。

1モジュール 128GiB が市販され始めているので未来を見据えてという感じでしょう。
8枚で 1TiB なのでそろそろモンスターマシンはメモリがTiB単位でないと人権がないとか言われるんでしょうか。

アセンブラ部分のコードを解説している人がlinux アドベントカレンダーにいたので紹介。
http://retrage01.hateblo.jp/entry/2017/12/13/202209

## 送信ソケットのZero copy
ユーザープロセスからネットワークでデータを送信する際に一度カーネル空間上にコピーして送信していたのをPTEの操作でコピーをしないようになります。
ただし、メモリを送信前に書き換えてしまうと送信データが変わってしまうので注意。
単純にフラグを変更すれば早くなるというものではないので既存のコードと相談する部分が大きそうです。

利用するためには send のフラグに MSG_ZEROCOPY をつける必要があります。
10KB以上の送信であればつけて送るほうが早くなるとのこと。

詳しい利用法はこちら
https://www.kernel.org/doc/html/latest/networking/msg_zerocopy.html#socket-setup

論文
https://netdevconf.org/2.1/papers/debruijn-msgzerocopy-talk.pdf

論文上のパフォーマンスの比較だと
16KBでシステムサイクルが30％,ユーザーサイクルで80%の削減効果があるようです。

## 終わりに
linuxを使う人ならほとんどの人が関係あるというところで2つ紹介しました。
もっと深堀していきたかったですができずじまい…
docker container を WSL (Windows 10 Fall Creators Update) 上に移植してみる

# wsl-toyc

docker container を WSL (Windows 10 Fall Creators Update) 上に移植してみる。

## docker container の準備

ここでは、Windows にポーテイングされていない Redis 4.0系 を動かしてみます。

docker の稼働する環境で、移植したいコンテナーを作成します。

```
$ # docker container を作成
$ docker pull redis:4.0
$ docker create --name redis4 redis:4.0
```

## WSL distribution の作成

WSL 上に distribution を登録して、起動します。

管理者権限 *でない* 通常のコマンドプロンプトを開きます。

```
> rem ツールのダウンロード (お好みのプログラムで)
> curl -LO https://github.com/noumia/wsl-toyc/releases/download/v1.0/wsl-toyc.zip
> 7za x wsl-toyc.zip

> rem 環境用のフォルダーを準備して rootfs ファイル等を配置する
> mkdir redis4
> move create-toyc.exe redis4
> rem docker container のイメージファイル作成
> rem docker の稼働している環境から rootfs.tar.gz ファイルを転送しても可
> docker export redis4 | gzip -c - > redis4\rootfs.tar.gz

> rem redis4　環境を作成する (フォルダー名がそのままディストリビューション名になる)
> redis4\create-toyc.exe

> rem 起動用実行ファイルの準備 (実行ファイル名をディストリビューション名にリネーム)
> ren launch-toyc.exe redis4.exe

> rem redis-server の起動
> redis4 /bin/bash -c "cd /data && docker-entrypoint.sh redis-server"

> rem Ctrl-C 押下で redis-server は終了します。
```

起動コマンドの引数が煩雑になりますが、Dockerfile に記述されている設定情報が反映されないため、同等の動作を行うコマンドを記述する必要があります。

動作確認のため、別のコマンドラインプロンプトを開き、クライアントツールを起動します。

```
> redis4 redis-cli PING
PONG
```

## WSL distribution の削除

WSL ディストリビューション環境上に作成されたファイルは、すべて *削除* されます。

```
> wslconfig /u redis4
```

再利用をしない場合は、redis4 フォルダー, redis4.exe ファイルを削除します。

ディストリビューション削除後 redis4\create-toyc.exe を再実行すると、環境は初回起動の状態に戻ります。

## 動作のしくみ

https://github.com/noumia/wsl-toyc

2 つのプログラムから構成されていています。

|名称|動作|
|---|---|
|create-toyc.exe|rootfs.tar.gz をもとに WSL distribution を新たに作成|
|launch-toyc.exe|WSL distribution のランチャープログラム (使用時にはリネーム)|

作成時、WSL API の WslRegisterDistribution 関数を使用しますが、Linux ファイルシステムの展開先に呼び出しプロセスの実行ファイルの場所が使われる仕様なので、使用したい環境のインスタンス毎に実行ファイルを作成する必要があります。

create-toyc.exe では、ベースのフォルダー名をそのままディストリビューション名として、登録を行います。

ソースとしたい rootfs.tar.gz ファイル (ファイル名固定) は、create-toyc.exe と同じ場所に配置してください。

rootfs.tar としては、docker export コマンドで出力されるコンテナのファイルが使用できます。(gzip で圧縮が必要)

docker save で出力されるイメージファイルは、形態が異なるため、そのままでは使用できません。

大抵の docker コンテナは動作できると思われますが、glibc をベースとしないものは動作できません。そのため busybox や alpine をベースとしたコンテナは、動きません。

create-toyc.exe ファイルを別々の場所にコピーすることで、環境はいくつでも作成することができます。(ディストリビューション名はユニークにする必要があります。)

登録されているディストリビューション名は、wslconfig /l コマンドで確認できます。

登録すると create-toyc.exe ファイルの場所の rootfs 以下に Linux のファイルシステムが展開されますが、これらのファイルは、Windows 側のアプリからはアクセス禁止とされています。(ファイル破損の原因となります。)

Linux プログラムを起動する場合は、launch-toyc.exe を使用しますが、ファイル名を起動したいディストリビューション名にリネームしてください。

実行ファイル名 (拡張子除く) をディストリビューション名として抽出して、起動する仕掛けになっています。

引数なしで実行したときは、シェル (bash) が起動します。

ランチャープログラムの配置は、任意の場所でかまいません。

## コピーライトについて

このプロジェクト (https://github.com/noumia/wsl-toyc) のコード著作権は、パブリックドメインにあるものとします。
Redmineをセットアップする


本格的なデプロイ用ではなく、デモ用などにサクッと用意する。

http://www.redmine.org/projects/redmine/wiki/HowTo_Install_Redmine_on_Debian_9

```sh
sudo apt install gcc build-essential zlib1g zlib1g-dev zlibc ruby-zip libssl-dev libyaml-dev libcurl4-openssl-dev libapr1-dev libxslt1-dev checkinstall libxml2-dev libmagickwand-dev imagemagick postgresql postgresql-server-dev-9.5 ruby-dev libffi-dev
```
fetchした結果をXMLパースする

MPDを利用するのにXMLパースしたかった
XMLHttpRequestでの仕方はよく記事があったがfetchだと見当たらなかったのでメモ程度ですが共有

[fetchのpolyfill][1]を参考にの`parseJSON`の部分を`parseXML`にした例文を用意してみた

```js
function checkStatus(res) {
  if (res.status >= 200 && res.status < 300) {
    return res
  } else {
    const error = new Error(res.statusText);
    error.response = res;
    throw error
  }
}

function parseXML(response) {
  return response.text().then((stringContainingXMLSource) => {
    const parser = new DOMParser();
    return parser.parseFromString(stringContainingXMLSource, "text/xml");
  });

fetch(url)
  .then(checkStatus)
  .then(parseXML)
  .catch((error) => {
    console.log('request failed', error)
  });
```

[1]:https://github.com/github/fetch
nix crate

この記事は[Rustその2 Advent Calendar 2017](https://qiita.com/advent-calendar/2017/rust-lang-2) 17日目の記事です。

本記事ではUnix系システムプログラミングを行うのに便利な`nix crate`について簡単にご紹介できればと思います。

# nix crateとは
`nix crate`はいわゆるラッパーです。

RustにはC言語の型を定義した`libc crate`があり、この`crate`を利用すれば`fork`、`execv`、`clone`などのC言語でおなじみの関数を扱えます。
しかしこの`libc crate`の関数の多くは`unsafe`となっており、コンパイル時に安全であることを保証できないコードを書けるようになる為、取り扱いには注意が必要となってしまいます。

`nix crate`はこの`libc crate`の`unsafe`な部分をラップした`unsafe`でないAPIを提供しているので、`libc crate`の機能をより安全に利用できます。

# 使用例
`nix crate`を使用して`clone`を実行する例は下記のようになります。

まず`Cargo.toml`に依存関係を記述します。

```
[dependencies]
nix = "0.9.0"
```

次にソース上で`nix crate`を利用することを宣言し、`clone`が実装されている`sched`モジュールをインポートします。
（下記では`sched`モジュールの中身をすべてインポートしています。）

```rust:main.rs
extern crate nix;

use nix::sched::*;
```

後は、インポートした`sched`モジュールを利用して`clone`を実行する記述を書くだけです。
（プロセスの情報を出力させるのに`pentry crate`を利用しています。）

```rust:main.rs
extern crate nix;
extern crate pentry;

use nix::sched::*;

// プロセス情報出力処理
fn print_process_info() {
  if let Ok(ps) = pentry::current() {
    println!("{:?}", ps);
  }
}

// cloneしたプロセスで実行する処理
fn child() -> isize {

  // プロセス情報出力
  print_process_info();

  // 成功時は0を返す
  0
}

fn main() {
  // プロセス情報出力
  print_process_info();

　// stackのサイズ
  const STACK_SIZE: usize = 1024 * 1024;
  let ref mut stack: [u8; STACK_SIZE] = [0; STACK_SIZE];

　// cloneで実行する処理
  let cb = Box::new(|| child());

  // clone時に指定するフラグ（今回はフラグは指定しない）
  let clone_flags = CloneFlags::empty();

  // clone
  let p = clone(cb, stack, clone_flags, None);

  let p = match p {
    Ok(p) => p,
    Err(err) => panic!(err),
  }
}

```

```rust:実行結果
Process { pid: 2163, ppid: 1992, name: "clone", path: Some("/home/ubuntu/Rust/sample/target/debug/sample") }
Process { pid: 2180, ppid: 2163, name: "clone", path: Some("/home/ubuntu/Rust/sample/target/debug/sample") }
```

実行すると環境により出力結果は異なりますが、`clone`した子プロセスの親プロセスID`ppid`が、親のプロセスID`pid`となっているはずです。

# まとめ
`nix crate`を利用して`libc crate`の関数を利用することができました。
`unsafe`でない分`nix crate`を利用するとより安全になるのかと思います。

# 参考
[nix-rust/nix](https://github.com/nix-rust/nix)
[nix document](https://docs.rs/nix/0.9.0/nix/index.html)
AIとか機械学習とかの概要の話

## はじめに
この記事は新卒向けAdvent Calendarの12/17の記事になります。
私は今年の3月に地球惑星系の大学院を卒業して、4月にエンジニアとして就職し、データ分析系の仕事をしてきました。
新卒向けということで、自分の中での整理も兼ねて機械学習とかAIとかの基本的な話を書きます。
専門的な踏み込んだ話を書くつもりはないので、玄人の方はあまり読む意味がないかもです。
~~用意していたネタがあまりうまくいかなかったなんて言えない~~

## AI、人工知能、機械学習、ディープラーニング
この界隈だとよく出てくる言葉ですね笑
####人工知能(AI)：
人間の知能を機械で再現しようとする試み
分かりやすいところで言うとドラえ〇ん。
ドラ〇もんは人と話したり、ものを見て判断したり「汎用AI」と呼ばれる。
それに対して、現状は特定のタスク(画像分類や音声認識など)に特化したAIまでしか実現できておらず
こちらは特化型AIと呼ばれる


####機械学習：
人工知能を実現するための手法の一つ
人間が行うような何かから法則性などを学ぶこと、をコンピューターで実現するもの
データから学習して、法則性を見つけ出すことができる。
(例：過去のデータから未来予測する、似た者同士をまとめて分類する)

####ディープラーニング：
機械学習の中の手法の一つ
人間の脳の神経(ニューロン)の働きかたを模して造られたニューラルネットワークを多層に重ねたもの。
機械学習の手法にもいろいろあって、
例えば気温とビールの売り上げの関係なら、線形に考えてy=ax+bのaとbが分かれば予測できるが、
人間の脳神経を模して学習させて予測させたら、色々できるようになって一つの手法として確立されましたよ、という話。

##なにができるの？
よくこれらの技術は万能だと思われがちですが、どのように使うのか、何ができるのかは知っておく必要があります。
基本は人間の学習と一緒で、まずは教えて学習させる必要があります。
具体的に言うとデータを与えて学習させてやる必要があります。判断材料が無かったら人間も判断できませんからね。
そして、どのように学習するのかもこちらで指定してやります。「モデル」といいます。
先ほど挙げた線形回帰モデルや、ディープラーニング、SVM、ロジスティック回帰…色々ありますが、何を使いますか？ということです。
それぞれのモデルに得意不得意があるのでここは詳しく知る必要がありますね。

学習とは具体的に何をしているかというと、コンピュータなので数値計算で処理が行われるわけですが、
途中で掛けたり足したりする変数(重み)をより良い予測ができるように調整していくことを指しています。
線形モデルで言うとy=ax+bのaとbを実際に合うものに変えていくことが学習になりますね。

学習が終わったら予測です。
予測は大きく分けて「回帰」と「分類」があります。
回帰は温度や売り上げの未来予測など、数値を出したいときに使われて、
分類はクラスに分ける(ラベリング)時に使われます。
例えば画像を見て人か猫かを判断させるのは分類になります。


##教師あり学習、教師無し学習
学習の仕方には教師あり/なしの大きく二つがあります。
文字通り、答えを教えるのか教えないのかの違いです。

昔の将棋ソフトや2015年にプロの囲碁棋士を倒したAlphaGoは教師あり学習、
今年そのAlphaGoに圧勝したAlphaGoZeroは教師なし学習で学習したものでした。

以前の将棋や囲碁のソフトでは良い手はどういうものかを人が教えていました。(王は囲いで守った方が良いとか、飛車は相手陣地に攻め込んで龍に成った方が良いとか)
またAlphaGoは勝ち負けの情報とともに過去のプロ棋士の大量の棋譜を読み込ませ、勝つ試合ではどのような手がさされているのかを学習していました。
いずれもこうすると勝てますよ、というのを教えています。

AlphaGoZeroは教師無し学習の中の強化学習という手法を用いています。
これは碁の基本的なルールだけ教えて打ち手は教えず、あとはAlphaGoZeroどおしで対局をさせて
強い手を学習したそうです。
どういった手が強いのかは全く教えていないので教師無し学習というわけです。
3日で500万局対戦し、AlphaGoに圧勝したらしいです。
面白いのは3日間の学習の中で、人間が千年単位の歴史の中で見つけてきた囲碁の定石を見つけただけでなく、
新しい定石も生み出しているらしいです。っょぃ

##終わりに
新卒向けAdventCalendarで他分野の基礎の話が読めるのは面白いですね。
勉強頑張りましょう！
ReactにStripeのCheckoutを実装してみた。

この記事は、[Stripe Advent Calendar 2017](https://adventar.org/calendars/2339)の17日目です。

# 前書き
Stripeには、WEBサイトに簡単に決済機能を実装できる、[Checkout](https://stripe.com/checkout)という機能があります。
わずか数行のJavaScriptを書くだけで、おしゃれなモーダル形式の決済フォームを提供してくれます。

この記事では、ReactのWEBアプリの中でCheckoutを実装し、実決済部で利用するCard Tokenを発行するまでのフロント側での実装について解説します。

# 実装準備
Stripe Checkoutはわずか数行のJavaScriptのコードを書くだけで実装できます。
ですが、Reactを利用している場合は、便利なWrapperライブラリがあるのでそちらを利用します。

[React-Stripe-Checkout](https://github.com/azmenak/react-stripe-checkout)

```bash
# NPM
$ npm install react-stripe-checkout
# Yarn
$ yarn add react-stripe-checkout
```

それに併せて、HTMLの中にStripe.jsのタグを埋め込んで実装準備は終了です。

```html
<script src="https://js.stripe.com/v3/"></script>
```

# 実装
実装はとても簡単です。
上記でインストールした、react-stripe-checkoutをimportして
下記を例に、Componentを作成します。

```js
import React from 'react';
import StripeCheckout from 'react-stripe-checkout';

class Checkout extends React.Component {
  onToken(token) {
    console.log(token);
  }
  render() {
    return (
      <div>
        <StripeCheckout
          token={this.onToken}
          stripeKey="{STRIPE_API_KEY}"
          image="https://stripe.com/img/documentation/checkout/marketplace.png"
          name="寄付"
          panelLabel="寄付"
          amount={100}
          currency="JPY"
          locale="ja"
        />
      </div>
    );
  }
}

export default Checkout;
```

とりあえず、ここまで作れば下記のようなボタンが表示されて、押下するとCheckoutの画面が表示されます。

![スクリーンショット 2017-12-17 18.12.49.png](https://qiita-image-store.s3.amazonaws.com/0/159013/e5519ac7-a68a-ce2a-78ca-8dd229ef6a67.png)
![スクリーンショット 2017-12-17 18.12.55.png](https://qiita-image-store.s3.amazonaws.com/0/159013/7bc7f582-af7e-2f27-2c41-5d6527711404.png)

もし、**Pay With Card**のレイアウトを変更したい場合は、下記のようにStripeCheckoutタグの中で
Buttonを作成すれば好きなButtonでCheckoutを表示させることができます。

```html
<StripeCheckout
  token={this.onToken}
  stripeKey="{STRIPE_API_KEY}"
  image="https://stripe.com/img/documentation/checkout/marketplace.png"
  name="寄付"
  panelLabel="寄付"
  amount={100}
  currency="JPY"
  locale="ja"
>
  <Button
    basic
    color="blue"
  >
    寄付する
  </Button>
</StripeCheckout>
```

# 処理解説
StripeCheckoutの中のtokenというProps
これが、Checkoutでカード情報を入力して支払いボタンを押した時の処理です。

上記の例にある、onTokenがそれに該当します。

```js
onToken(token) {
  console.log(token);
}
```

ここでの引数、tokenはサーバの決済処理へ安全にカード情報を渡すために暗号化された
Card Tokenが含まれています。
ここで、簡単にTokenが利用できるのであとはサーバ、もしくはStripeのAPIを叩いて決済を行うだけです。
その辺りは、公式ドキュメントで詳しく書いているので、APIへ渡す**source**の部分を上記で取得できたtokenを渡せば、決済完了ですね。

[Stripe Charges](https://stripe.com/docs/charges)


# 後書き
サーバ側はともかく、フロント側の決済関連処理というのは、カードをどうやって入力するか、入力したカードをどうやってサーバに安全に渡すか。。という悩みがつきものです。
Stripeは、そういった開発者の悩む部分をフォームの提供によりとても楽にしてくれます。
Checkoutの他に、Stripe Elementsというのがあり、Checkoutとは別におしゃれなフォームを提供してくれます。
今回のように、サクッと決済機能を実装できてしまうので、ぜひ、お試しください。
【Mac超絶効率化】これでエンジニアに触らせても舌打ちされない！！Macの環境構築まとめ

# はじめに
対象: 特にエンジニアに限らず、Macでの作業を効率化させたい全ての人に捧げます。
エンジニアにパソコンを貸した時:「えーっと、これがこれで。あぁ〜〜＊＊入れてないのか〜。あ、＊＊もか〜:weary:」

エンジニアとは自動化を生業にしていると言っていいですが、そんな人々に軽い舌打ちをされないように、今回は僕がMacでの作業を効率化するための選りすぐり効率化ツールを紹介します。

# Macアプリ編
## Alfred
[ここからダウンロード](https://www.alfredapp.com/)
ネットで検索する、特定のサイトを開く、特定のアプリを開く、シャットダウンさせる、設定をいじる、フォルダを探す。。。全てのアクションの検索窓となるのが`Alfred`です。

↓ 画面中央の検索窓がAlfred、どこからでも検索可能。登録したサイト(youtube)を開く
<img src="https://i.gyazo.com/0b7556927849f8a6735e36588035ee0a.gif" alt="https://gyazo.com/0b7556927849f8a6735e36588035ee0a" width="700"/>
その他アプリ(chrome)への移動、フォルダ検索、wi-fi設定画面を開く、全ては一瞬で叶います。
もうマウスパッドに触るのはやめ、極力ウィンドウの移動・呼び出しにはAlfredを使いましょう。

## Dash
[ここからダウンロード](https://kapeli.com/dash)
二回以上同じテキストを書いたら、もう自動化しましょう。それを可能にするのがDashで、入力したいテキスト(例えば自分のメールアドレス)とそれを呼び出す用のテキストコマンド(例えば「;;@」)を登録することで簡単に登録した文言を呼び出すことができます。

↓ Dashで「;;@」と打ったら「hogehoge123@gmail.com」と入力されるよう登録してます。そこからAlfredでchromeに移り、登録したコマンドを使って瞬時に入力してます。
<img src="https://i.gyazo.com/fdd0ce6b9f1fb60e8912dea17a9e4387.gif" alt="https://gyazo.com/fdd0ce6b9f1fb60e8912dea17a9e4387" width="700"/>
単純な早さもそうですが、これで入力間違えの可能性がゼロになるところもpushしたいところです！

## Karabiner-Elements
[ここからダウンロード](https://pqrs.org/osx/karabiner/)
今回の本命。ただmacOS Sierraの場合だけなので、それ以外の方はKarabinerを使って以下のことを実現してください。
このアプリはキーボードカスタマイズのためのアプリです。あなたの理想のキーボード設定を実現しましょう！！！
まずは下２つの設定をします。

|   変更前   |    変更後     |
|:------------------:|:------------------:|
|   caps-lock   |     control     |
|     option    |      escape      |
<img src="https://i.gyazo.com/c6ae1569ba1aef17c1da3d7b1f2d1282.png" alt="https://gyazo.com/c6ae1569ba1aef17c1da3d7b1f2d1282" width="500"/>
あまり使わないキーを他のキーと変更しました。macにおいては`control + 何かキー`というショートカットはブルーオーシャンとなっているのでバンバン自分の好きなキーバインドを登録しまくれます。
準備ができたら早速`contrl`を使ったショートカットの設定です。

|   コマンド   |    結果    |
|:------------------:|:------------------:|
|   ctrl + h, j, k, l   |    ←, ↑, ↓, →     |
|   left-cmd, right-cmd   |     英数入力, かな入力に変更     |
<img src="https://i.gyazo.com/2f25defa2991f6bd1027be9f4f32d98a.png" alt="https://gyazo.com/2f25defa2991f6bd1027be9f4f32d98a" width="500"/>
こうなればokです。
これで一生、矢印キーをぽちぽちする地獄とはおさらばです。
設定方法はこちらを参考に→[Karabiner-Elementsの本家が「英数/かな」の切り替えに対応したみたい](https://qiita.com/emonuh/items/ba5f12ef459f3a34f83e)

## Magnet
[ここからダウンロード](https://itunes.apple.com/jp/app/magnet-%E3%83%9E%E3%82%B0%E3%83%8D%E3%83%83%E3%83%88/id441258766?mt=12)
Magnetはmacのウィンドウの大きさを自由自在にワンコマンドで操るアプリです。
具体的には全画面、左右上下半分、左右3/1や3/2にしたりできます。

↓ 微妙な大きさのchromeウィンドウを全画面に→左3/1に→AlfredでAtomを開く→Atomを右2/3に
<img src="https://i.gyazo.com/9664670f17dc860513d205950ee2a7bb.gif" alt="https://gyazo.com/9664670f17dc860513d205950ee2a7bb" width="700"/>
スタバの横の席で爆速でこんなことやっている人いたらびっくりしますね笑

# いったん
Atomでのたくさんのパッケージと、それに合わせてたショートカットを一緒に紹介したかったんですが今回はこれで終わりにしたいと思います。
後ほどchromeの拡張アプリとAtomの拡張について書きます。

今回はアプリだけに絞ったので、エンジニア以外の人にも見てもらえたら嬉しいです😬
ではより良い、「これ以上エンジニアに舌打ちされないライフ」を！！
sublime text でのファイルヘッダ入力 markdown編

## 目的
sublime text3 でAtomの[markdown-writer][bbbb001]で追加されるようなヘッダーを一発で入れたい。  
参考  

```
---
layout: "post"
title: "sublime-text-Markdown用ヘッダースニペット.markdown"
date: "2017-12-17 15:17"
---
```
[bbbb001]: https://github.com/zhuochun/md-writer

## 方法
スニペットを作りファイルネームを環境変数で記入する。
環境変数にない日付はInsertDateパッケージを用いて、コマンドで記入。
以上の流れをマクロにする。  

## 手順  
### スニペット登録
メニューバー->ツール->スニペット追加  

```xml

<snippet>
	<content><![CDATA[
---
layout: "post"
title: "$TM_FILENAME"
date: "$1"
---
]]></content>
	<!-- Optional: Set a scope to limit where the snippet will trigger -->
	<scope>text.html.markdown, text.html.markdown.multimarkdown</scope>
	<discription>Markdown file header. title and date.</discription>
</snippet>
```
Packagesフォルダに`./MySnippet/MarkdownSnippetMDHeader.sublime-snippet`で保存  

### InsertDate導入
1. `Package Control:Install Packeage` から 「InsertDate」  
1. タイムゾーン設定  ダイアログに従ってタイムゾーンを設定  
[InsertDate GitHub](https://github.com/FichteFoll/InsertDate)  

### マクロ設定
以下の内容のファイルを作る  

```json

[
	{
		"args":
		{
			"name": "Packages/MySnippet/MarkdownSnippetMDHeader.sublime-snippet"
		},
		"command": "insert_snippet"
	},
	{
		"args": {"format": "%Y-%m-%d %H:%M"},
		"command": "insert_date"
	},
]
```
Packagesフォルダに`./User/MarkdownHeader.sublime-macro`で保存
日付フォーマットはドキュメントによると[ここ][cccc001]を参考に  
[cccc001]:http://www.strfti.me/  

基本的には以上であるが、マクロをショートカットキーで呼び出せるようキーバインドしてもよい。  

## 参考  
+ [スニペットについてのドキュメント][aaaa001]  
[aaaa001]: http://docs.sublimetext.info/en/latest/extensibility/snippets.html
+ [[Sublime Text2]マクロを用いた日付入りファイルヘッダ入力][dddd001]  
[dddd001]:https://qiita.com/Sumire_sn24/items/9b8098affb6e45011299
illustrator/photohopすら全く触ったことない人がデザイン学ぶ(現在進行系)

# はじめに
初めまして、Life is tech!ゲームコースメンターのニーザです！Adventカレンダー更新が遅れて申し訳ないです。
さて本日は残す所Adventカレンダーも残り一種間ほどになりました。
自分がUnityメンターなのでUnity系の記事を書くかと思いきや、一旦プログラミング的なところから離れていこうと思います！
最初は、良きメンター・良きプログラマーになるには必ず必要となるであろう「コミュニケーション」に関して僕が日々気をつけていることを書きたいと思っていましたが、少し思考を変えて、デザインに関して書きたいと思います。
内容は題名の通り、「illustrator/photohopすら全く触ったことない人がデザインを学ぶ(現在進行系)」です！！

# なぜデザインを勉強するのか
日々インターンや、Unityでゲームを作ったり、アプリを作る中でいつも大きい壁に当たります。それは、
「デザインがどんなに考えて実行してみてもしっくりこない！！」
という壁です。
最初は、きっと何個も作っていく上で勝手に身につくものだろうと考えていました。しかし、一向に自分が納得できるデザインに辿り着かないのです...。
そこで考え方を心機一転デザインを学ぶことにしました！

# 実際にしたこと
いざ勉強するとは言っても、全く右も左もわからない状態からのスタートです。
最初は、グーグルでこのように検索しました！
「デザイン　勉強　初心者」
たくさんの記事を見ましたが、全然自分の持つ答えに納得がいきませんでした...。

## 概要を理解する
しかし、頭で考えるよりまずは何か行動を起こさなければということで、こちらの本を読みました！!

![デザイン本１.jpeg](https://qiita-image-store.s3.amazonaws.com/0/144044/4d055e7e-a617-b82c-46d9-4bc1bfecd881.jpeg)


これは多くの人に悩みを相談した時に、こちらの本を読んでデザインについて概要から理解して見たらどうかと勧めて頂きました本です。
本当にたくさんの方から支持されてきた名著の中の名著です！！

こちらの本は大変素晴らしく、全てを読み終わる頃には実はデザインというものは四つの原理原則から動いていることを学びました！
もちろん、自分の求めていたゴールであるデザインの基礎基本の理解はできました。
しかし、さあこの学んだ知識を活かそうと今までの自分の作品に当てはめようとして見ましたが、どのようにこのデザインスキルを用いていいかわからないのです。

## 実際に自分の作品に落とし込んで見る・今後の展望
ここはまだ自分なりの答えが出ていないので、随時更新していきたいと思います！

# 最後に
こんな中途半端な記事になってしまい申し訳ないです...。
しかし、デザインの壁というものはプログラマーに限らず自分でものを作ろうとする人にとっては、必ず当たる壁だと思います。なのでこれから僕がこの壁をどのように乗り越えたかについては乞うご期待ください！また、続きの記事はこの記事を更新するか勉強ログ自体は自分のブログか、Docbaseに必ず投稿することにしたので期待してください！！
明日はガハクさんによる「知っておきたいTCP/IP入門編」です！素晴らしい記事であると思いますので、明日のカレンダーも楽しみにしています！
TFSサーバー移設の失敗談

# はじめに

これは何も考えていない開発者がTFSサーバーの移設時に失敗した話です。
悪い例として、こんなことを起こさないよう、ちゃんと調べてから移設作業を行いましょう。
また、正しい方法ではない場合がありますので、参考程度にご覧ください。

## 移設が必要となった経緯
TFSはソース管理やビルドに使用しています。
TFSとは。。。以下のサイトを参照ください。
https://www.microsoft.com/ja-jp/dev/products/team-foundation-server.aspx

この子かなり便利で意外と何でもできちゃうんです。
何ができるかというと、、、優しいグーグル先生が教えてくれます。

で、今までは社内にサーバー機を準備して使用していました。
物理なので、いろいろとリスクが多いです。
一例をあげるとこんな感じ。
- HDDが壊れたりしたら？ 
- 急な停電がきたら？
- 停電時にUPSが正しく起動しなかったら？
他にもたくさんあると思います。
もちろん、回避策もあります。

この問題を解決するためにいろいろ検討しサーバーをクラウドに移設しよう(検討内容は省略)となりました。

## 失敗① バックアップ手順
DBのバックアップを毎日取っていました。
バックアップの方法はSQLserverのカタログを直接バックアップを取ってました。

TFSといってもDBをソフトで開いてるだけ。
DBのバックアップを取ってクラウドに転送・展開しTFSから接続したら行ける！
と安直に考え実施。
DB展開完了し開こうとしました。TFSがプロジェクトを見つけることができず開くことができませんでした。
残念！！

この時点で今まで取っていたバックアップに意味がない。ということが発覚。
(今まで障害が発生してなくてよかった。。。本当に。。。)

### 失敗①の解決策
教えてグーグル先生！ってことで調べたら以下の回答が来ました。

①TFSでプロジェクトを停止。停止後にデタッチ。
②デタッチ後にSQLserverでバックアップ。
③バックアップファイルを転送。
④転送されたファイルを展開。
⑤TFSからアタッチ

ちゃんと調べて行いましょう。。。

## 失敗② TFSのバージョン
せっかく移設するのなら、新しいバージョンを使用したい！
ということで2012→2016にしようと思いました。

結果からいうと、だめでした。
バージョンは合わせる必要があります。
バージョンのアップグレードは正しい手順で行いましょう。

### 失敗②の解決策
解決策は簡単です。
移設前のTFSのバージョンを調べて、同じバージョンのTFSをインストールしましょう。
アップグレードは調べて正しい方法で行いましょう。
今回はアップグレードする必要性がなかったので、同じバージョンをインストールしました。
そのため、手順についてはわかりません。
とりあえず、参考になりそうなサイトがありましたので、ご参考までに。。。
https://msdn.microsoft.com/ja-jp/library/jj620933(v=vs.120).aspx

## 失敗③ SQLserverのバージョン
いろいろがありましたが、多くの人の手助けをいただき移設の検証ができるようになりました！
検証は今のプロジェクトが参照できるか？今まで通り使えるか？等、当たり前のことです。

検証では特に問題ありませんでした。
さて、やっときました。本番です！

手順通りデタッチしてバックアップ。転送。SQLserverに展開。。。
→失敗。
あれ？転送中に失敗したかな？

最初からやり直し。
→失敗

検証では成功したのに。。。なんでだろう？
ということ調査。

原因
検証を行っている最中に移設元のTFSにサービスパックを適応してました。
適応したことによって、SQLserverのEnterprise Editionの機能まで使用することになっていました。
移設先のSQLserverのeditionはStandard Edition。
そのため、展開時にeditionが異なるから展開できないよ！と怒られていました。

### 失敗③の解決策
この解決策も簡単。SQLserverのeditionを合わせる。

## まとめ
手順通りにバックアップを取ろう！
ちゃんとバージョンを合わせよう！
SQLserverのバージョンを合わせよう！

何も考えずとりあえずやってみた！
という。。。悪い例ですね。

移設時はちゃんと調べて行いましょう。
最後には移行でき、問題なく稼働できました。

その後一度だけサーバーに障害が発生しましたが、イメージごとバックアップを取っていたため、被害は最小限で復旧することができました。

※参考したサイト
https://gyorgybalassy.wordpress.com/2014/04/07/migrating-a-tfs-project-collection-to-another-server/
DataGripを使おう

JetBrains アドベントカレンダー 17日目です。
今年はJetBrainsの製品をたくさん使いました。

* RubyMine
* WebStorm
* PhpStorm
* IntelliJ Ultimate
* ReSharper Ultimate

ざっと数えただけでもこんだけあります。
でも今年一番｢こいつぁすげぇ･･･｣ってなったのは

*DataGrip*

なんです。
日本語の記事が全然なくて最初セットアップに手こずったのでそれをさらっと書いてみます。

# 環境
サーバー側

* CentOS 7.4.1708
* MySQL 5.6

クライアント側

* Windows10 Pro
* DataGrip 2017.3



環境はVagrantで建ててます。
今回はサンプルで建ててるのでrootで接続したりしています。

# MySQLに外部接続の設定を追加する
MySQLで

`GRANT ALL PRIVILEGES ON *.* TO root@"192.168.33.1" IDENTIFIED BY 'pass' WITH GRANT OPTION;`

192.168.33.1から全権限の付いたrootにログインを許可してます。
パスワードは`pass`にしてます。
本当はこんな強力な権限ダメなんですがDataGripお試しということでこの設定でいきます。

# データベースに接続する
起動してまずはメニューバーのview→Tool Windows→Databaseを選択します。
(Alt+1でも出ます。)
左にサイドバーが出たと思います。
![dg.PNG](https://qiita-image-store.s3.amazonaws.com/0/100796/14dbee00-10b8-7392-3983-4d150bd79d2a.png)
画像赤枠のプラスマークを押してData Suorce→MySQLと選択します。
![dg2.PNG](https://qiita-image-store.s3.amazonaws.com/0/100796/652368ad-717a-e586-d856-c273f03246c8.png)
赤枠を編集しておきます。
ここでJDBCがインストールされていない場合、画像で｢no objects｣と表示されているあたりに｢ダウンロードしますか?｣的なメッセージが出るのでダウンロードしてください。

* Host 
 * MySQLのサーバーのIP
* Port
 * MySQLのサーバーのPort。MySQLのデフォルトのポートは3306。
* Database
 *  接続したいデータベース名。今回はRailsで適当に作ったデータベースを操作します。
* User
 *  前述の手順で設定したユーザー名です。今回は`root`
* Password
 * 今回は前述の手順で設定した `pass`

ここまで埋めたらTestConnectionを押して下さい。
Success!と出たら成功です。
出なかったらSELinuxなりFirewallなりを確認して下さい。

![dg3.PNG](https://qiita-image-store.s3.amazonaws.com/0/100796/089ed831-a5bb-ab83-f636-ed15e8f7cf96.png)

接続できるとこんな感じでテーブルとか見れると思います。


# 基本的な使い方
SQLを書くときは左のサイドバーの黒いコンソールアイコンをクリックして下さい。
そうすると新しいタブでSQLが書けます。
JetBrainsの強力な補完機能も`Ctrl+Space`で使えます。
実行は`Ctrl+Enter`で実行できます。
![dg4.PNG](https://qiita-image-store.s3.amazonaws.com/0/100796/70efd928-8017-02a9-569c-bd1bc0be41d9.png)

この画面でモリモリSQL書いてコードに落とし込むって使い方もありだと思います。

Tableの追加も`vagrant_development`を右クリックでNew→Tableから追加できます。
![dg5.PNG](https://qiita-image-store.s3.amazonaws.com/0/100796/4ee03121-7d1b-2463-ffe5-c36e6fccb341.png)


# おわりに
え、これで終わり?
って感じになってしまいましたがぶっちゃけ高機能過ぎて事細かく書いちゃうとめちゃめちゃ記事長くなるので基本の基だけ抑えました。
ぶっちゃけエンジニア以外にもおすすめできる製品です。迷わずクエリがサクサク書けるのはめちゃくちゃ強いです。
コードを書くわけではないけどデータベースを触る便利なツールを探してる人にもおすすめです。
既存のデータベース移行の際に使ったんですが、ExportしたSQLファイルを編集するときも活躍しました。
この設定方法はRubyMineやPhpStormのデータベース設定にも応用できます。
この記事を読んでもっとこのツールに触れる人が増えてくれればなと思います。
HOG特徴量とSVMの記事の差分

[HOG特徴量とSVMを使った自動車の検出](http://96n.hatenablog.com/entry/2016/01/23/100311)

こちらの記事のコードを動かしてみましたが、何点か修正が必要だったので差分だけ記載します。

環境構築

```.sh
# Python2.*
sudo python -m pip install scikit-image sklearn opencv-python

# Python3.*
pip install scikit-image sklearn opencv-python
```
全てのコード
`print "..."` は全て `print("...")`に書き換え

1つ目、3つ目のコード

```.diff
<     fd = hog(neg_roi, orientations=9, pixels_per_cell=(6,6),cells_per_block=(3,3), visualise=False)
---
>     fd = hog(neg_roi, orientations=9, pixels_per_cell=(6,6),cells_per_block=(3,3), visualise=False, block_norm='L2')
```

hogの引数に`block_norm='L2'`を追加

2つ目のコード
`sklearn.grid_search` はDeprecatedなので、`sklearn.model_selection`を使用する。また不要なimportを削除

```.py
import numpy as np
from sklearn.model_selection import GridSearchCV
from sklearn import svm
from sklearn.externals import joblib
```

3つ目のコード
タブとスペースが混ざっているのでスペースに統一

```
test_img = resize(test_img, img_size, mode='constant')
```
引数に`mode='constant'`を追加

`fd = hog(...` の次の行に `fd = fd.reshape(1, -1)` が必要

hogの引数に`block_norm='L2'`を追加

これでPython2でもPython3でも動くはず。

実行結果
![Screen Shot 2017-12-17 at 18.12.00.png](https://qiita-image-store.s3.amazonaws.com/0/481/6d31c2a4-4a60-e555-0b36-3a443229b2ef.png)
Raspberry Piの購入、初期設定

このエントリは「[Raspberry Piでスマートロックつくった](https://qiita.com/undo0530/items/669b6ee6b2277ea64b33)」の解説1つめになります。
Raspberry Piの購入から初期設定、スマートロック開発のために使用するPythonライブラリのインストール等を行います。
# Raspberry Piを購入する
今ならamazonやswitch-scienceなど大体どこでも買えますが、特にこだわりが無ければRaspberry Pi 3 model Bと電源アダプタやmicroSDカード等の必要周辺機器がセットになった[スターターキット](https://www.switch-science.com/catalog/3559/)がおすすめです。余計なものはいらんという人は本体だけ購入し必要な周辺機器だけを別途購入すれば良いです。ちなみに最新のRaspberry Pi Zero Wは品薄なため本体単品で売っているところはあまり無く、セットでの購入を余儀なくされます。海外の[PIMORONI](https://shop.pimoroni.com/products/raspberry-pi-zero-w)なんかだと逆に単品だけ在庫ありのセットは売り切れなんてことがあるので、手数料や配送日数を我慢できるならそちらもアリかと思います。
# OSを入手する
Raspberry Piの上で動作するOSは公式ページでダウンロードできます。
[https://www.raspberrypi.org/downloads/](https://www.raspberrypi.org/downloads/)
Raspberry Pi財団公式のOSとしてRaspbianというものがあるのでそれをダウンロードしたいところですが、上記ページにはいくつかバージョンがあります。NOOBSはインストーラ形式で、RaspbianはOSイメージそのまんまでダウンロードできます。今回はとりあえず[Raspbian stretch With Desktop](https://downloads.raspberrypi.org/raspbian_latest)を使います。
![922ca729489225739f9ee2f7f1fbb1bc.png](https://qiita-image-store.s3.amazonaws.com/0/222969/2de9a0fc-8e63-dc50-6150-fb0c0daeeda7.png)
# microSDにOSイメージを書き込む
OSイメージをダウンロードしたら次はmicroSDに書き込みます。単にコピーするだけではうまくいかないので注意してください。書き込みにはEtcherというソフトが簡単でおすすめです。
[Etcher.io
![4869bb580e29b579c064e82ccdc5d3b6.png](https://qiita-image-store.s3.amazonaws.com/0/222969/87da9999-2c23-0429-889e-cba6ff10a99a.png)](https://etcher.io/)
Etcherを起動したら左から順に、

1. Select imageをクリックしてRaspberrypi.orgからダウンロードしたOSイメージをZIPのまま選択
2. Select driveをクリックして書き込み先のmicroSDカードを選択
3. Flash!を押せば書き込みが始まります。microSDカードのフォーマットとかも勝手にやってくれるみたいです。

さて、これでRaspberry Pi起動前の準備は一応終わりです。SSH接続をしたいという人は書き込んだmicroSDのrootディレクトリにsshという名前の空っぽのファイルを作っておきましょう。

# Raspberry Piを起動し初期設定を行う
書き込んだmicroSDカードをRaspberry Piに挿し込み、HDMI、USBキーボード、（あればLANケーブル、マウスも）を接続したら、最後に電源用のmicroUSBケーブルを接続します。何も問題なければ自動的にログインされてデスクトップ画面が表示されると思います。
システムの各種設定を行うには、デスクトップ画面左上のRaspberry Piマークをクリック→設定→Raspberry Piの設定 を潜っていけば色々出てきますのでお好みに設定します。Wi-Fiを設定する時は右上のWi-Fiっぽいマークから。
インターネットに繋がったら、一応アップデートをかけておきます。左上スタートボタンからアクセサリ→LXTerminalを起動し、下記のコマンドを実行します。途中途中でY/n聞かれたり再起動しろと言われるので適宜。

```bash
sudo apt-get update
sudo apt-get upgrade
sudo apt-get dist-upgrade
sudo rpi-update
```
以上で大体OKです。お疲れ様でした。
Next：[Raspberry Piでサーボモーターを回す](https://qiita.com/undo0530/items/51cc446eefec6c91c26d)