OmniAICreator/Qiita-1.07M huggingface dataset:
お名前.comとさくらのVPSでネームサーバーを設定する

この記事は、下記の記事を構成している記事のひとつです。
[さくらのVPS と Debian 8 Jessie で独自ドメインのWebサイトを立ち上げる手順](http://qiita.com/osktak/items/7224bd263288b40b4b98)

・さくらのVPS（プラン512）
・Debian 8 Jessie（さくらのVPS カスタムインストール）
の環境を前提にしています。

# お名前.comでネームサーバーを設定する

ドメインNaviにログインし、ネームサーバーの設定を行います。

![nameserver1.png](https://qiita-image-store.s3.amazonaws.com/0/162149/5b903b58-13a0-9ce1-0204-7ce85ef4a784.png)

ネームサーバーは、さくらのVPSのネームサーバーを利用するので、「他のネームサーバーを利用」で、
プライマリネームサーバー：ns1.dns.ne.jp
セカンダリネームサーバー：ns2.dns.ne.jp
に設定します。

![nameserver2.png](https://qiita-image-store.s3.amazonaws.com/0/162149/e5275f9f-3f01-a1be-ab5e-3b6037911231.png)

# さくらのVPSでネームサーバーを設定する

ドメインメニューから「ネームサーバ新規登録」をクリックします。

![nameserver3.png](https://qiita-image-store.s3.amazonaws.com/0/162149/32d11e77-5e20-a725-2275-58d2fdad2b24.png)

新しいネームサーバの登録のドメイン名に、登録するドメインを入力し、「送信ボタン」を押下します。

![nameserver4.png](https://qiita-image-store.s3.amazonaws.com/0/162149/666ccc92-7ac5-c439-c444-f51d2199ec34.png)

ドメインメニューに戻ります。

![nameserver5.png](https://qiita-image-store.s3.amazonaws.com/0/162149/f9de41b6-4497-d580-1e31-653dae15785e.png)


ネームサーバとゾーンの管理の「ゾーン編集」ボタンを押下します。
![nameserver6.png](https://qiita-image-store.s3.amazonaws.com/0/162149/17797c0c-2ba1-be96-ef5b-965c14a05647.png)

さくらのVPSのサーバのIPアドレスを入力して「送信する」ボタンを押下します。

![nameserver7.png](https://qiita-image-store.s3.amazonaws.com/0/162149/c3c53880-064c-a3cb-6b86-bd203469a5bb.png)

設定完了です。「www」「mail」「ftp」のエントリ名が自動的に登録されています。
必要に応じて削除、修正して下さい。

![nameserver8.png](https://qiita-image-store.s3.amazonaws.com/0/162149/3e6028e1-f3fd-1fc4-0740-33983bf1cacc.png)
JS初心者がクロージャ（closure）を理解する

# 目的
自分のようなJavaScript入門者への情報共有、また自分の備忘録のために作成します。

# クロージャとは
**「”ローカル変数を参照する関数”を戻り値とした関数」**。
クロージャを使うことで、通常は関数処理終了後に破棄されるローカル変数の値を保持しておくことが可能になります。
Java的に言うと、**「クラスからインスタンスを生成し、そのインスタンスフィールドにアクセスする」**ことであると私は思いました。

# 説明

以下の関数を定義しておく。これが**コンストラクタ**となる。

```closure.js
function closure () {
  var hoge = {};

  return function (key) {
    hoge[key] = "fuga";
    console.log(hoge);
  }
}
```

そして、関数closureを別の変数に格納する。
これにより**インスタンス化**がなされた。

```closure.js
var test = closure();
```

以上の準備をしたうえで、test("fuga")とtest("puyo")を実行していく。
すると…

```closure.js
test("fuga");
> Object { fuga: "fuga" }

test("puyo");
> Object { fuga: "fuga", piyo: "fuga" }
```

別々に関数を実行しているにも関わらず、関数内のローカル変数hogeが保持されているのがわかる。
**関数がまるでインスタンスのようにふるまっている**。これがクロージャ。

以上です。

# 初見
* Javaと比較すると（以前はJavaをやっていました）、JavaScriptの「関数」が万能すぎて、よく面食らっています。
* クロージャも本を読んだときは？？？だったが、こうしてようやく記事にすることで理解できたと思います。JS習得を続けたいです。
Atomのgit-plusでリモートリポジトリにpushできない時のメモ

初投稿はもっとましなの書くつもりだったけど、とりあえず何処かにメモしておきたい。

# commitまではできるけどpush出来ない時

どうもoriginというリモートハンドルが存在しないと上手くいかないっぽい。環境によるのかもしれないが。

`git remote -v`

で確認して、無ければ `git remote add origin [url]` 。

ちなみに紆余曲折あって設定が吹っ飛んでいたようだ。

設定が吹き飛ぶ前は、GCP内の非公開リポジトリなので「google」という名前を使っていたのでそれだけ設定し直したのだが、ダメだった（この状態だとAtom以外のツールからはpushできる）。

同じリモートリポジトリ／プロジェクトに複数のハンドルがあるのは問題無く、最後にpush先を選択できる。

駄目だった時はエラーメッセージらしきものが右上や下部に現れるのだけど、消えるの早すぎて読めない…。
[Rails]本番環境のデプロイで思わぬところで躓いた

##環境
Ruby 2.3.1
Rails 5.0.0
unicorn
AWS/EC2

鍵の設定やらMySQLのインストールやらでちょこちょこ躓きながらも、
ようやくアセットファイルのコンパイルにたどり着きました。

rails assets:precompileとコマンドを打つことでpublic/assets以下にファイルができるのですが、
下記の通りCSSが読み込まれないという現象が。

<img width="364" alt="スクリーンショット 2017-02-12 15.27.16.png" src="https://qiita-image-store.s3.amazonaws.com/0/157055/c27018e5-8c2c-1046-5286-6a3fa1992d8b.png">

一見するとCSSだけが読み込まれていないように見えますが、
chromeのデベロッパーツールを見るともはやHTMLから違う、、、

EC2サーバーには最新のコードをクローンしているし、vimで中身を見ても問題ない。
とりあえずCSSが効いていないと踏んで検索するとconfig.assets.compileをtrueにしたりキャッシュを消したり色々出てきました。

あれこれ試しましたが、結果は変わらず。
var/wwwからディレクトリを作り直したり、ブラウザのキャッシュを消したりしてもダメ。

しかし結果的にはgemのhaml-railsが開発環境でしかインストールされておらず、
CSSはおろかHTMLも読み込まれていないということでした。


##後日検証

　gem haml-railsをしっかりと本番環境にインストールし、再度デプロイ。
案の定CSSは反映されていませんが、前日までとは違い、ちゃんとコード通りのHTMLが表示されている。

<img width="427" alt="スクリーンショット 2017-02-12 17.14.41.png" src="https://qiita-image-store.s3.amazonaws.com/0/157055/552cbd27-cc7a-7191-778d-0c7bd211c32d.png">

私の場合は

bundle exec rake assets:precompile RAILS_ENV=production

とするだけで無事読み込まれました。

そしてついにデプロイ。

<img width="1118" alt="スクリーンショット 2017-02-12 19.47.52.png" src="https://qiita-image-store.s3.amazonaws.com/0/157055/0ef065d0-c8ea-4ade-61e8-ae037c763cfb.png">


アセットコンパイルが怪しい決め込んでいたことが、泥沼にはまった原因です。猛省します。
Visual Studio Code の Preview 表示用にレンダリングされた HTML を見たい


## 見たいの？

HTML mode や Markdown mode で書かれた内容をプレビューで表示することができるけど、表示するためにレンダリングされた HTML を得るに方法です。

`ヘルプ | 開発者ツールの切り替え` で開発者ツールを呼び出せすことができますが、欲しい部分は Shadow-DOM? という扱いになっているようで、そのままでは見ることができない。

![スクリーンショット 2017-02-12 19.41.35.png](https://qiita-image-store.s3.amazonaws.com/0/65800/67f92f14-a695-a94d-87dd-b49aa3cc386d.png "スクリーンショット 2017-02-12 19.41.35.png")

## 見れるの？

下記のようなキーバインドを定義します。`key` は適当に空いてるものか、お好きなものを割り当てます。

```json
    {
        "key": "f8",
        "command": "_webview.openDevTools"
    }
```

なんでも良いのでプレビューを開いあと、定義したキーを押して見る。すると、開発者ツールと同じようなウインドウが開き、そこにはプレビュー画面用にレンダリングされた HTML が表示されます。

![スクリーンショット 2017-02-12 19.42.31.png](https://qiita-image-store.s3.amazonaws.com/0/65800/b5a51bf7-d6c3-78f4-2d53-8eabb514a4f5.png "スクリーンショット 2017-02-12 19.42.31.png")

やったね。

## コマンドの定義

おお、コマンドが定義されているソースはここでした。なるほど。

<https://github.com/Microsoft/vscode/blob/master/src/vs/workbench/parts/html/browser/webview.ts#L29>

これで、何が起きているかわかったのでした。
(マルチバイト文字では、アンカーが生成されておらず id には何も設定されていないことがわかった

これを知らなくて、Markdown Extension を改造して OutPut Channel にレンダリングされた HTML を吐き出させていたのは良い思いでです。

## 参考

* [Inspect a Webview #12871](https://github.com/Microsoft/vscode/issues/12871)
railsのProductionで手動でPrecompileし直す

# 背景

プロダクションで出たJSのエラーがローカルで再現できない場合に、JSファイルは、precompileされているのでどこでエラーがでているのか見定めるのが難しい。

そこで、Productionのコードに`console.log`などを書いてどこのファイルは正常で、どこのファイルで死んでいるのかをチェックしたい。


# もしも

単にDeployの際にPrecompileがうまく言ってないだけの場合は、capistranoを使っている場合以下のコマンドでprecompileを再試行することができる

```
bundle exec cap production deploy:assets:precompile
```

念のために、serverも再起動して確認。

```
# 再起動のrakeタスクは自分で作成する必要がある
bundle exec cap production unicorn:restart 
```


# Productionサーバで手動でPrecompileし直す

0. `<path to app>/release/<最新のtimestamp>/app/assets/`のファイルを編集する。
    1.  例: `console.log 'aaaa.coffee start'`など

1. Precompileしたものを全て削除

    ```bash
    bundle exec rake assets:clobber RAILS_ENV=production
    ```

2. precompileする（新しいdigest が割り振られる）

    ```bash
    bundle exec rake assets:precompile RAILS_ENV=production
    ```

3. Webサーバを再起動

    ```bash
    sudo systemctl restart <rails_app>.service
    ```

これで、どこのファイルまで問題なく読まれて、どこで問題が置きたかを簡単に確かめられる。
twitter -> fluentd -> elasticsearch -> elastalert -> slackで、エゴサをしたい人生だった。


# 前提
__作業未完です！！__

__かなり個人的な作業手順メモです。__

fluentdとかelasticsearchを初めて触りながらやってみた。

amazon linuxで作業。
ちなみにlinux全く分からないマンです。

# fluentd
## fluentd本体

### preinstallガイドにしたがって作業
http://docs.fluentd.org/v0.12/articles/before-install

以下忘れずに。

```
ulimit -n
```

```
root soft nofile 65536
root hard nofile 65536
* soft nofile 65536
* hard nofile 65536
```

このへんも適当にやっとく。

http://qiita.com/ayaniimi213/items/4197a295c13b59166e8c 

### インストール

http://docs.fluentd.org/v0.12/articles/install-by-rpm

```
curl -L https://toolbelt.treasuredata.com/sh/install-redhat-td-agent2.sh | sh
```

## fluent-plugin-twitter
 

インストール手順は以下。
 
https://github.com/y-ken/fluent-plugin-twitter

```
# for td-agent2
sudo td-agent-gem install eventmachine
sudo td-agent-gem install fluent-plugin-twitter
```

twitterのtokenとかは適当に発行。

## fluent-plugin-elasticsearch

```
sudo td-agent-gem install fluent-plugin-elasticsearch
```

# ElasticSearch
## ElasticSearch本体

### まずJava8をいれる。

http://dev.classmethod.jp/cloud/aws/java8_tomcat8_on_amazon_linux/

### jvmのヒープサイズ変更

awsのec2をmicroにしてると、設定を変更しないと、elasticsearchが起動しないため。

```
sudo vi /etc/elasticsearch/jvm.options
```

```
-Xms768m
-Xmx768m
```

上記のサイズがベストなのかはわからん。

参考：
http://fujitora.hatenablog.jp/entry/2016/10/31/180411

## 日本語検索

```
sudo /usr/share/elasticsearch/bin/elasticsearch-plugin install analysis-kuromoji
```

## ElastAlert

下記参照しながらインストール

https://elastalert.readthedocs.io/en/latest/running_elastalert.html

やらかしたっぽくてパスが通らなかったので適当に追加。

```
which pip
```

```
export PATH=/usr/local/bin:$PATH
```

http://qiita.com/AknYk416/items/e9e0e2132f6996735ec9


### ruleとalert文面の書き方
クエリの書き方が全く分からずすごい試行錯誤した。たぶんイケてない。

（kuromoji_analyzerも必要かどうかよくわかってない）

下記参照

http://elastalert.readthedocs.io/en/latest/ruletypes.html

https://github.com/Yelp/elastalert#how-can-i-change-whats-in-the-alert

例：

```rule.yaml
...ルール名とか省略...
filter:
- query:
    query_string:
      query: "じゅみ OR (/.*jumit.*/)"
      fields: ["text"]
      default_operator: "and"
  analyzer:
    kuromoji_analyzer:
      type: "custom"
      tokenizer: "kuromoji_tokenizer"
...slack_webhook_urlとかは省略...
alert_subject: "{0} <https://twitter.com/{1}/status/{2}|Tweet>"
alert_subject_args: ["text","user.screen_name", "id"]
alert_text: "{0} <https://twitter.com/{1}/status/{2}|Tweet>"
alert_text_type: exclude_fields
alert_text_args: ["text","user.screen_name", "id"]
```

なんか英単語系の部分一致がうまくいかなかったので、むりやり正規表現にした。（indexの設定とかめんどかったため）

# とりあえず動かしてみるが。。
ルールのテストではうまく行ったけども、userstreamのデータが増えてくるとクエリの結果取得がすごい時間かかってるっぽい。

ぐぬぬ。。。

fluent-plugin-slackを使わずにelasticsearch通して通知しようとしてるのは、エゴサ以外に、1日周期ぐらいで集約して情報を通知するのも考えてて、設定が二重になるのがイヤだったから。

でも、遅いのであればそっちにしようかな。。
（Elasticsearchに即時性求めちゃいけない気もしてるし）
Python3+OpenCV3.1＋ffmpegで動画を読み込む（Ubuntu16.04）

MacにデュアルブートしたUbuntu16.04にOpenCV3.1をインストールした際の覚書です。

## 環境

- Ubuntu16.04
- Python 3.5.2 

UbuntuはiMacにデュアルブートしたものです。Python3系は`pyenv`を使わずに`sudo apt-get install python3-pip python3-dev`でインストールしました。

## ffmpegをOpenCVで使うには

OpenCVのインストールは`anaconda`を使うと楽に出来ると思ったのですが、動画ファイル（`mp4`や`avi`など）の読み込みに対応していません。

どうも展開する際、自分でビルドしなければならない様です。参考になったリンクを貼っておきます。

[OpenCV 3.1 Installation Guide on Ubuntu 16.04 - GitHub](https://github.com/intel/caffe/wiki/Ubuntu-16.04-or-15.10-OpenCV-3.1-Installation-Guide)

こちらをそのまま利用できました。

```bash
$ sudo apt-get install --assume-yes build-essential cmake git
$ sudo apt-get install --assume-yes build-essential pkg-config unzip ffmpeg qtbase5-dev python-dev python3-dev python-numpy python3-numpy
$ sudo apt-get install --assume-yes libopencv-dev libgtk-3-dev libdc1394-22 libdc1394-22-dev libjpeg-dev libpng12-dev libtiff5-dev libjasper-dev
$ sudo apt-get install --assume-yes libavcodec-dev libavformat-dev libswscale-dev libxine2-dev libgstreamer0.10-dev libgstreamer-plugins-base0.10-dev
$ sudo apt-get install --assume-yes libv4l-dev libtbb-dev libfaac-dev libmp3lame-dev libopencore-amrnb-dev libopencore-amrwb-dev libtheora-dev
$ sudo apt-get install --assume-yes libvorbis-dev libxvidcore-dev v4l-utils
```

 公式のレポジトリからダウンロードしたものはCUDAのサポートもされている様です。

```bash
$ git clone https://github.com/opencv/opencv.git
$ cd opencv
```

ダウンロード後、以下の指定をしてビルドします。

```bash
$ mkdir build
$ cd build/
$ cmake -D CMAKE_BUILD_TYPE=RELEASE -D
CMAKE_INSTALL_PREFIX=/usr/local -D WITH_TBB=ON -D
WITH_V4L=ON -D WITH_QT=ON -D WITH_OPENGL=ON -D
WITH_CUBLAS=ON -DCUDA_NVCC_FLAGS="-D_FORCE_INLINES" ..    
$ make -j $(($(nproc) + 1))
```
展開してインストールします。

```bash
$ sudo make install
$ sudo /bin/bash -c 'echo "/usr/local/lib" > /etc/ld.so.conf.d/opencv.conf'
$ sudo ldconfig
$ sudo apt-get update
```

ビルドは１時間半位は見ておいたほうがいいですね。

## 動画の読み込み

これで動画が読み込めるようになりました。[公式ドキュメンテーション](http://docs.opencv.org/3.0-beta/doc/py_tutorials/py_gui/py_video_display/py_video_display.html)のサンプルコードを試してみます。

```python
import numpy as np
import cv2

cap = cv2.VideoCapture('street.mp4')

while(cap.isOpened()):
    ret, frame = cap.read()

    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

    cv2.imshow('frame',gray)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

cap.release()
cv2.destroyAllWindows()

```
[フリーストック動画サイト](https://videos.pexels.com/)よりダウンロードした画像を白黒で表示してみます。

![Screenshot from 2017-02-12 19-17-28.png](https://qiita-image-store.s3.amazonaws.com/0/47128/ea86ed2f-c40e-bc7f-e40f-e54773e76c2b.png)

上手く行きました。
サクラエディタで正規表現を使用し、大文字・小文字変換

正規表現の大文字・小文字の変換ってどうやるのかよく忘れてしまう。今度こそ忘れないようにするため備忘録として残した。

## 大文字　→　小文字（lower）
置換前　(.)
置換後　**\l$1**
※\lは\Lでも可

- 更新前
`QIITA`

- 更新後
`qiita`

## 小文字　→　大文字（upper）
置換前　(.)
置換後　**\u$1**
※\uは\Uでも可

- 更新前
`qiita`

- 更新後
`QIITA`


「lower」と「upper」で覚えれば当分忘れないですみそうです。

また、(.)と$1がマッチングしているので、この部分を応用することで、先頭のみ大文字にするとか、コンマの前だけ大文字とか編集できます。

### 例：qiita　→　Qiita
置換前　(^.)
置換後　**\u$1**

- 更新前
`qiita`

- 更新後
`Qiita`

(^.)と\u$1より先頭の文字のみ大文字に変換したことがわかります。

サクラエディタでしか試していないのですが、他のエディタでも実行できると思います。

## 参考資料
- [置換パターン](http://k-takata.o.oo7.jp/mysoft/bregonig.html#SCT-5.3%2E)
ローカルからherokuへのアップロードまでのメモ

ローカルでコード書いてherokuにあげるときにやるべきこと


アセットプリコンパイラ

rake assets:precompile RAILS_ENV=production

ソースコードをgitでpush

git add .

git commit -m '任意のコメント'

git push heroku master

db周り

heroku run rake db:migrate RAILS_ENV=production
devise_token_authでメール認証をアクティブ化できなかった

なかなか発見できなくて詰まったので備忘録的に残しておく。

devise_token_auth 利用時にemailでの認証を追加するときに大きく詰まった。やりたいことは単純で以下の２ステップ。


1. mailcatcher環境をローカル構築
2. deviseでメール認証を可能に

順にまとめていく。

## mailcatcher環境の構築

[mailcatcher](https://github.com/sj26/mailcatcher)の説明は次の通り

> MailCatcher runs a super simple SMTP server which catches any message sent to it to display in a web interface. Run mailcatcher, set your favourite app to deliver to smtp://127.0.0.1:1025 instead of your default SMTP server, then check out http://127.0.0.1:1080 to see the mail that's arrived so far.

### 試したこと

readmeに書かれている通りの手順で構築できるかをまずは試した。しかしこれは失敗。mailcatcherはうまく立ち上がるんだけど、sinatraを入れたせいで、```rails sercer```コマンドを叩くとエラーが出るように。確かにわざわざrails環境で用意する必要も無いと思ったので、違う方法を考えることにした。（この辺詳しい人いたら教えて欲しいです。。）

### 実際の環境

```
git clone https://github.com/sj26/mailcatcher.git
cd mailcatcher
bundle 
bundle exec ./bin/mailcatcher -f
```

もしもうまくいかなかった場合は、

```bundle install sinatra``` でsinatraをインストールしてもう一回試してみることをおすすめします。

この手順に沿っていけば、smtpサーバーが構築できる。アドレスは最後のコマンドを実行した時に出力される以下。httpの方は送信されたメールを確認するブラウザ。

```
smtp://127.0.0.1:1025
http://127.0.0.1:1080
```

とはいっても、何故か僕の環境では、うまくブラウザ経由でみれなかったので、以下のコマンドからAPI経由で確認している。

```
curl -s localhost:1080/messages

# [{"id":1,"sender":"<from@example.com>","recipients":["<to_address@example.com>"],"subject":"test subject","size":"290","created_at":"2017-02-12T07:43:54+00:00"},{"id":2,"sender":"<from@example.com>","recipients":["<to_address@example.com>"],"subject":"test subject","size":"289","created_at":"2017-02-12T07:44:46+00:00"}]

```

これでmailcatcher環境が構築できたので、次はdevise_token_auth側の設定


### devise_token_auth側の設定
ありがちなエラーみたいで、色んな情報が載っていて振り回されまくった。ちなみにずっと出てたエラーは以下

```
Unpermitted parameter: registration
```

「お、ストロングパラメーター関係やーん！」って思って色々ぐぐってたけど、結局全然違った。

### 解決方法

僕の解決方法は次の通り。

```config/initializers/devise_token_auth.rb
  # 以下を追加
  config.default_confirm_success_url = "confirmed"
```

以上！ストロングパラメーターでもなんでもなかった。こいつは[ここ](https://github.com/lynndylanhurley/devise_token_auth#initializer-settings)に書かれているパラメーターなんだけど、これを設定することで全てが解決した。
[めも]コンソールに日本語を出力したい場合(wcoutで日本語出力する場合など)

めもなので、ざっくりと。内容の一部に実験結果を含みます。
検証環境：Windows7(日本語版), Visual Studio 2015
※ソースコードのエンコードは、Shift-JIS (CR+LF)。
※コンソールウィンドウのコードページは、「932 (ANSI/OEM 日本語 Shift-JIS)」
**(コンソールを「437 OEM - 米国」 などに設定すると、どのパターンでも文字化けします。)**

#wcoutで日本語を出力したい場合
```wcout.imbue(std::locale(""));``` // システムのデフォルトが日本語の場合
```wcout.imbue(std::locale("Japanese"));```
などを使う。

※間違えて```wcout.imbue(std::locale());``` (localeに渡す引数が空)とすると、失敗する。
=> ```locale().c_str();```の戻り値は、C。

```setlocale(LC_ALL, "");```
などの影響は受けない。

例えば、
```setlocale(LC_ALL, "C");```
としても、wcout.imbue()で正しいロケールを設定してあれば、wcoutでは日本語の文字も出力される。

**wcout.imbue()で正しいロケールを設定する前に、wcoutに日本語の文字を渡した場合は、**
**``wcout.clear()``などでエラーをクリアするまで、(英語も含め)文字が出力されなくなります。**
実験する時は、要注意。(気が付かないと、はまります。)

##coutでも日本語は出力できる。
``puts("日本語");`` などと同様で、ロケールがCになっていても、``cout << "日本語";`` は日本語の文字が出力される。

#setlocaleの影響を受ける関数
ヘルプ> 「ロケール」
https://msdn.microsoft.com/JA-JP/library/wyzd2bce(v=VS.140,d=hv.2).aspx
(coutなどは、このページに無いかと思います。``<stdio.h>``と``<iostream>``のどちらが必要かで考えると良いかも？)

#めも：ロケールで指定する値
見つけにくいですが…
ヘルプ> 「ロケール名、言語、および国/地域識別文字列」(setlocaleのページから飛べます)
> ロケール名の一覧については、「Culture Name各国語サポートの (NLS) の API リファレンス」の の列を参照してください。

リンク先：
[MS-LCID]: Windows Language Code Identifier (LCID) Reference> 
5 Appendix A: Product Behavior
https://msdn.microsoft.com/en-us/library/cc233982.aspx

※日本語は、ヘルプの「言語識別文字列」、「国/地域識別文字列」に入っていないので、
リンク先にあるリストから探しましょう。
> Language | Location (or type) | Language tag | Supported version
> Japanese | Japan | ja-JP | Release A
> Japanese | Japan  | ja | Release 7

std::locale()に渡すのは、Languageなど。
setlocale()に渡すのは、Language tagなど。
(詳細は、ヘルプ> 「ロケール名、言語、および国/地域識別文字列」を参照。)
Ubuntu（Debian系）でユーザを作る際はuseraddではなくadduser

ubuntuでユーザを作成した際に、`useradd`を用いて作成したユーザでログインしたところホームディレクトリがないと怒られた

```
# useradd new_user
# su - new_user
No directory, logging in with HOME=/
```

どうもデフォルトではディレクトリを作成してくれないようである。`man useradd` をみるに、`-m` オプションを明示的に指定するか、`CREATE_HOME=yes` でなければ、ホームディレクトリは作成されないようだ

```
       -m, --create-home
           Create the user's home directory if it does not exist. The files and directories contained
           in the skeleton directory (which can be defined with the -k option) will be copied to the
           home directory.

           By default, if this option is not specified and CREATE_HOME is not enabled, no home
           directories are created.
```

そして、Debian系はデフォルトでは、CREATE_HOMEに関する設定がない

```
# useradd -D
GROUP=100
HOME=/home
INACTIVE=-1
EXPIRE=
SHELL=/bin/sh
SKEL=/etc/skel
CREATE_MAIL_SPOOL=no
```

また、`useradd`のDescriptionには次のように書いてある

```
DESCRIPTION
       useradd is a low level utility for adding users. On Debian, administrators should usually use
       adduser(8) instead.
```

調べてみると、`adduser` という似たような名前のコマンドがあり、こちらでユーザを作成するのが、Debianユーザの常識だそうである。たしかに、こちらでユーザを作成すると、ちゃんとホームディレクトリを作ってくれた。知らなかった、、

`man adduser`には次のように書いてある

```
DESCRIPTION
       adduser and addgroup add users and groups to the system according to command line  options  and
       configuration  information  in  /etc/adduser.conf.   They  are friendlier front ends to the low
       level tools like useradd, groupadd and usermod programs, by default choosing Debian policy con‐
       formant  UID  and  GID values, creating a home directory with skeletal configuration, running a
       custom script, and other features.  adduser and addgroup can be run in one of five modes:
```

みてみると、このコマンドはperlスクリプトであり、内部で`useradd`を呼び出すフロントエンドとなっている。

```
# which adduser
/usr/sbin/adduser
# file /usr/sbin/adduser
/usr/sbin/adduser: a /usr/bin/perl script, ASCII text executable
```

以上、ユーザを作成するときは`adduser`を使いましょう！
C言語の helloworld を gettext で日本語化

いいサンプルが見つからなったので。

元となる helloworld プログラム

```c:hello0.c
#include <stdio.h>

int main()
{
    printf("hello, world\n");
}
```
コンパイル
```　$ gcc -o hello hello0.c
```

動作確認

```
$ ./hello
hello, world
```

gettextに対応するとこうなる

```c:hello1.c
#include <stdio.h>

/* setlocale() */
#include <locale.h>
 
/* bindtextdomain(), textdomain() */
#include <libintl.h>

int main()
{
    /* ロケール名を環境変数から取得 */
    setlocale(LC_ALL, "");

    /* ドメイン名"hello"のメッセージカタログディレクトリをカレントディレクトリに設定 */
    bindtextdomain("hello", ".");

    /* ドメイン名を"hello"に設定 */
    textdomain("hello");

    printf(gettext("hello, world\n"));
}
```
コンパイル
```$ gcc -o hello hello1.c
```

動作確認（まだ日本語化されていません）

```
$ ./hello
hello, world
```

ソースファイルからpotファイル（hello.pot）作成
```　$ xgettext -d hello -o hello.pot hello1.c
```

potファイル（hello.pot） からpoファイル（hello.po） 作成
```　$ msginit --locale ja_JP.UTF-8 --input hello.pot --output-file hello.po
```

poファイル（hello.po）を編集（「hello, world」に対応する日本語を書き足す）
```　vi hello.po
```

```pot:hello.po
# PACKAGE パッケージに対する英訳.
# Copyright (C) 2017 THE PACKAGE'S COPYRIGHT HOLDER
（中略）
#: hello1.c:20
#, c-format
msgid "hello, world\n"
msgstr "こんにちは、世界！\n"
```

poファイル（hello.po）から、moファイル（hello.mo）を作成
```　$ msgfmt -o hello.mo hello.po
```

指定のディレクトリを作成して、moファイルを配置

```
$ mkdir -p ja/LC_MESSAGES
$ cp hello.mo ja/LC_MESSAGES/hello.mo
```

動作確認

```
$ ./hello
こんにちは、世界！
```
NGINXでステータスコード444とは


ステータスコード444を返すように設定することができます。

設定は以下のとおり。

　return 444;


注意点として・・・

444は NGINX にコネクションを閉じさせる特別なコードのようです。

　return 444; 

が評価されるとNGINXは何のレスポンスも返さずにコネクションを閉じるようです。

　HTTP/1.1 444 

のようなレスポンスを返すわけではないようです。

返すと思っていました・・・汗
Laravel 5.2でIlluminate/HtmlServiceProviderはサポート外

# Laravel 5.2にIlluminate/HtmlServiceProviderをインストールして使おうとするとエラーが出る。

```
Call to undefined method Illuminate\Foundation\Application::bindShared()
```
原因はApplicationクラスのメソッド名変更。bindShare()が5.2ではsingleton()に変わっているらしい。故に、以下のページで言及されているけど、$app->bindShare()の呼び出しを$app->singleton()に変更すれば動くみたい。

Call to undefined method Illuminate\Foundation\Application::bindShared()
https://laracasts.com/discuss/channels/laravel/call-to-undefined-method-illuminatefoundationapplicationbindshared

だけど、配布されているレポジトリをカスタマイズして使うのは避けたい。調べたら、5.2対応のHtmlServiceProviderが配布されていた。

# Laravel Collective
https://laravelcollective.com/docs/5.2/html

5.2ではこれを使うべし。

# 参考記事
http://www.84kure.com/blog/2015/12/29/laravel-5-2%E3%81%A7illuminatehtmlserviceprovider%E3%81%AF%E3%82%B5%E3%83%9D%E3%83%BC%E3%83%88%E5%A4%96/
Androidスマホでスクリーンショットを撮る方法

Androidスマホでスクリーンショットを撮る方法

Android 4.0以降のスマートフォンであれば、ほとんどの場合、
端末の電源ボタンと音量ダウンボタンを同時に長押しすることでスクリーンショットを撮影できます。
iPhoneとは異なり、ボタンをほぼ同時に押し、長押しする必要があるので注意しましょう。
DropwizardでSwaggerを使う場合の注意点


[こっち](https://github.com/federecio/dropwizard-swagger)は更新が止まっているようなので、[フォークされた方](https://github.com/smoketurner/dropwizard-swagger)を使った方が良さそう。



### 更新が止まっている方のつらいやつ

https://github.com/federecio/dropwizard-swagger/blob/c7051642f8055c3f786e6d6060237a252779e78c/src/main/java/io/federecio/dropwizard/swagger/SwaggerBundle.java#L60

```java
environment.getObjectMapper().setSerializationInclusion(JsonInclude.Include.NON_NULL);
```

Jacksonで値がnullになっているキーを除去する設定をするようになっている。。

以前見たときに、IssueだかPullRequest上がっていた気がしたけど見つけられなかった。
JWT : JSON Web Token の読みかた

# 問題

JWT : JSON Web Token の読みかたが分からない。

# 解決策

仕様 (RFC 7519) に書いてある。

> The suggested pronunciation of JWT is the same as the English word "jot".
https://tools.ietf.org/html/rfc7519#section-1

"jot" をどう読むかは http://ejje.weblio.jp/content/jot などを参考に。

ぼくは「ジョット」と読むつもりだ。
Amazon SNS で複数のエンドポイントが作成される原因と対策

# 概要
Amazon SNS のCreatePlatformEndpointというAPIは
[同じトークンと属性であれば同じエンドポイントを返却する(冪等性)](http://docs.aws.amazon.com/sns/latest/api/API_CreatePlatformEndpoint.html)ということでしたので、
安心して毎回CreatePlatformEndpointを呼ぶようにしていました。

しかし、使っている内にいつの間にか同じトークンに対して複数のエンドポイントが作成される事態に。
さらに、これだけならまだよかったのですが3つを超えるエンドポイントを作成しようとすると
エラーが発生してそれ以上エンドポイントを作成できないという詰んだ状態に。。。

原因を特定するのにかなりの時間がかかってしまったため、
同じような境遇の人たちのため、以下に詳細を記載しておきます。

# 原因
GCMとSNSの仕様が原因ということがわかりました。

- GCM
    - 古いトークンに対してプッシュするとGCMは最新のトークンを返却
    - 古いトークンは一定期間有効で、複数前のトークンでも最新のトークンを返却
- SNS
    - GCMから新しいトークンが返却されると、古いトークンを新しいトークンに自動で書き換え
    - 同じトークンに対して異なるエンドポイントを4つ以上作成しようとするとInvalidParameterExceptionをthrow
        - (プッシュのトークン自動書き換え時にExceptionは発生しない)

# 発生条件
- GCM or FCM?
    - GCMでしか確認できていない。FCMも一緒？
- 古いトークンに対してプッシュ

# 再現手順
1. GCM導入済みのアプリをインストール
2. トークンAを取得し、DBに保存
3. CreatePlatformEndpointでトークンAからエンドポイントAを取得し、DBに保存
4. アプリをアンインストール
5. アプリを再度インストール
6. トークンBを取得し、DBに保存
7. CreatePlatformEndpointでトークンBからエンドポイントBを取得、DBに保存
8. トークンAを使用してSNSでプッシュ
    - エンドポイントAに紐づくトークンAがトークンBに書き換わる
9. SNS上ではトークンBに対してエンドポイントAとBの2つが作成された状態となる

上記5〜8を繰り返すと同じトークンに対して異なるエンドポイントが作成されていきます。
もし、9の時点でトークンBに紐づくエンドポイントが3つ作成された状態だった場合、
トークンBで再度CreatePlatformEndpointを実行すると、
「This endpoint is already registered with a different token」
というInvalidParameter例外がthrowされ、それ以上エンドポイントを作成することはできなくなります。

# 対応策
上記のInvalidParameterを回避するためには、エンドポイントを作成済みのトークンで
再度CreatePlatformEndpointを実行しないようにする必要があります。

AWSのサポートに問い合わせたところ、
以下のサイトにある方法でトークンを管理することで上記の問題を解決できるとのことでした。

[プラットフォームエンドポイントの作成とデバイストークンの管理 擬似コード](https://docs.aws.amazon.com/ja_jp/sns/latest/dg/mobile-platform-endpoint.html#mobile-platform-endpoint-pseudo-code)

つまり、一度作成したエンドポイントはトークンと共にDBやアプリ内に保存しておき、
2度目以降はCreatePlatformEndpointを実行しないようにすればいいわけですね。

みなさんも Amazon SNS を使用する際は上記に気をつけて実装してください。

# 参考
[API Reference CreatePlatformEndpoint](http://docs.aws.amazon.com/sns/latest/api/API_CreatePlatformEndpoint.html)
[プラットフォームエンドポイントの作成とデバイストークンの管理 擬似コード](https://docs.aws.amazon.com/ja_jp/sns/latest/dg/mobile-platform-endpoint.html#mobile-platform-endpoint-pseudo-code)
[プラットフォームエンドポイントの作成とデバイストークンの管理 トラブルシューティング](https://docs.aws.amazon.com/ja_jp/sns/latest/dg/mobile-platform-endpoint.html#mobile-platform-endpoint-problems)
[Amazon SNS のモバイルトークン管理についてのベストプラクティス](http://dev.classmethod.jp/cloud/aws/sns-mobile-token/)
Raspbianのデフォルトユーザpiから管理者権限を奪う話

RaspberryPiをIoTのおもちゃとしてではなく、24時間365日運用のLinuxサーバとしてみたとき、パスワードなしでsudoできてしまうデフォルトユーザpiの存在は危険なので、あれこれ手を打つ。当然ながらrootのパスワードはpasswdコマンドで設定しているものとする。

#sudoを使えなくする

普段使っている一般ユーザ(user)がsudo出来るようにするには、

```shell
sudo gpasswd -a user sudo
```

でOK。次にpiをsudoグループから削除する。

```shell
sudo gpasswd -d pi sudo
```

これで無事完了！…ではなく、もう一手間必要。

```shell
sudo vim /etc/sudoers.d/010_pi-nopasswd
```

で下記の行(デフォルトだと1行)をコメントアウトしてやる。

```shell
pi ALL=(ALL) NOPASSWD: ALL
↓
#pi ALL=(ALL) NOPASSWD: ALL
```

保存して、piからsudoできなくなっていればOK。
VMware Fusionホストmacとゲストwin7の切り替え設定

# VMware Fusionホストmacとゲストwin7の切り替え設定

VMとmacの行き来にはmac側ショートカットcontrol+矢印のウインドウ切り替えを使用してたのですが、そのためだけにVMのショートカット主導権がmac側に奪われるのは効率が悪いので、VM設定で[Mac OS キーボードショートカットを有効にする]をオフにしてmac⇔VM切り替えは別の方法を模索することにしました。

環境

- Mac OS X 10.6.8 Snow Leopard
- VMware Fusion 3.1.4
- Windows7 Home SP1(32bit)

目的・条件

- VM常時フルスクリーン運用
- ホストmacとゲストの切り替えを素早くスムーズに（mac側のcontrol+矢印でのウインドウ切替えと同等な感じにしたい）
- VM使用中はmac側ショートカット利用なし
- VM → mac … VMデフォルト設定「Fusionショートカット」の[アプリケーションを隠す]（command+H）を使用
- mac → VM … macシステム環境設定のショートカットを利用


## mac アプリ起動サービス作成

アプリ起動（＆アクティブ化）をショートカットに割り当てるためには、サービスを登録する必要有り。

- アプリケーション Automator.appを起動
- 「ワークフローのテンプレートを選択」から[サービス]を選択
- 左ペイン [ライブラリ]>[ユーティリティ]の一覧より[アプリケーションを起動]を右ペインにドラッグ＆ドロップ
- 右ペイン上部「”サービス”は、次の項目を受け取ります：」のプルダウン[入力なし]、「検索対象：」[すべてのアプリケーション]、「選択されたテキストを置き換える」チェック無し
- 「アプリケーションを起動」項目プルダウンより[VMware Fusion]を選択
- ファイルメニュー[保存]> ダイアログで適切な名前を付けて保存。「VMwareFusionを開く」
- システム環境設定[キーボード]>[キーボードショートカット]>[サービス]一覧の中に上記作成の項目を選択しショートカットを入力（今回はcommand+cntrol+h を設定した）

無事に起動とアクティブ切り替えをショートカット化できました。
しかし、実際のところ動作が遅いので、VM起動後は素直にcommand+tabでアプリ切り替えした方が快適という結果に。。


## 参考
http://windowsmac.net/?p=1065
LINEでゲームブックが楽しめるbotを開発しました

# PR的なもの
![linebot_PR.png](https://qiita-image-store.s3.amazonaws.com/0/165070/ee5429c5-2640-bdc9-c5de-4c15398d00c8.png)

# はじめに
LINEのMessaging APIを利用して、気軽にゲームブックが遊べるbotを開発しました。紙媒体ならではのドキドキ感と、アプリならではのサクサク感の両立を目指しています。LINEから友だち追加をすることで直ぐにゲームを開始できます。

スマホの方はこちらのリンクから
<a href="https://line.me/R/ti/p/%40fdy3415x"><img height="36" border="0" alt="友だち追加" src="https://scdn.line-apps.com/n/line_add_friends/btn/ja.png"></a>

PCの方はQRコードをスマホでかざしてください（上の画像と同じです）
<img src="http://qr-official.line.me/L/aPZfp_o06l.png">

# ゲームブックとは
1980年代から1990年代にかけて大流行した、ゲームとノベル（小説）を融合した書籍のことです。物語の随所に読者への選択肢が与えられており、選んだ行動によって結末が変化します。30～40代の人は「火吹山の魔法使い」「ドラゴンクエスト」「ソーサリー」などが馴染み深いかと。

「廃れた」「オワコン」とか思うかもしれませんが、「脱出ゲームブックシリーズ」に代表されるように近年でも新刊が発行されており、またゲーム界隈においてもサウンドノベルや美少女ゲームといったところがゲームブックの遺伝子を引き継いでいます。

ダンガンロンパや逆転裁判も、ゲームとノベルを両方楽しむ作品ですよね。

# このゲームブックについて
LINEとゲームブックの相性がいいことをアピールするためのサンプル的な作品です。とはいえ、ある程度は遊んでもらいたいので、頑張ってオリジナルの作品を書き上げました。一昔前のゲームブックの雰囲気が伝わればと思います。

総パラグラフ数は90。平均プレイ時間は1時間程度かな？ゲームブック界では短編に属するかと。

プロ作家ではないので、多少の稚拙さはご容赦いただければ（逃げ）・・・
「設定が中二すぎるだろ！」とか「文章が痛すぎるだろ！」とかいう突っ込みも無しで（逃げ）・・・

# 操作方法
##ゲームの始め方!
友達追加してゲームブックbotのトークを開いたら、下部の「ゲームメニュー」→「最初から始める」をタップします。
![howto_1.png](https://qiita-image-store.s3.amazonaws.com/0/165070/69de7f24-7474-7029-96e9-1c191c38a4e3.png)

すると、ゲームブックの表紙に遷移します。ふきだしの「ゲームを始める」をタップすればゲーム開始です。
![howto_2.png](https://qiita-image-store.s3.amazonaws.com/0/165070/8ad41bd1-8c18-e149-98c3-5a1d7f7d0de0.png)

仮にバッドエンドに行き着いても、もう一度「ゲームメニュー」→「最初から始める」でゲームをやり直せます。

ゲームブックは人生とは違い何度でもやり直せるのです（ここ重要）。

## 進め方
物語の随所には選択肢が用意されています。これだ！と思った選択肢をタップしてください。
![howto_3.png](https://qiita-image-store.s3.amazonaws.com/0/165070/80ae8f80-0f9d-0d99-9e73-2071b3174537.png)

紙媒体のようにパラグラフ番号を見ながら紙をパラパラとめくる必要はありません。タップひとつで次のシーンに飛ぶことができます。

## 所持品を使う
選択肢だけが、あなたの取れる行動の全てではありません。時には所持品を使って、選択肢に無い秘密の行動を取る必要があります。

あなたは最初からナイフを持っています。例えば、あるシーンにおいて選択肢は「正面に戻る」しかありませんが、キーボードを開いて「@ナイフ」と入力してみましょう。
![howto_4.png](https://qiita-image-store.s3.amazonaws.com/0/165070/fbe701e5-10af-281a-12b5-a77cc78f1e8b.png)

次のシーンでは、ナイフを使って道を開くことに成功しました。
![howto_5.png](https://qiita-image-store.s3.amazonaws.com/0/165070/c2b510cc-0d35-1a30-54e7-de22a37d3ec9.png)

所持品が使えるシーンは限られています。しかし、多くはゲームを進めるうえで重要な箇所であり、かつ前後の文脈からある程度の推測が当てられます。

「何も考えずとも選択肢を虱潰しに選べばゲームブックをクリアできる」という考えは誤りです（そういう本も多いが・・・）。前後の文脈から、知恵と記憶を頼りに著者の仕掛けを突破するのが、ゲームブックの醍醐味ともいえます。

## その他
メニューは全部で４つ。残りを紹介します。
![howto_7.png](https://qiita-image-store.s3.amazonaws.com/0/165070/7695849c-b229-cfd1-63c5-63f2f68eff5d.png)

### 所持品・ステータスを見る
冒険で手に入れた所持品と現在の体力を表示します。体力が無くなるとゲームオーバーなので、なるべく体力を減らさないように注意して進みましょう。

### 直前の内容を読む
最後のシーンをもう一度出力します。選択肢選んでも何も反応しないなど正常に動作しない時は、とりあえず、ここ押してみてください。

### サイトを見る
本botの説明サイトに飛びます（というか、このページ）。

# 開発者について
普段のお仕事は、サーバ運用やサイト運営がメイン。プログラミングは大学時代に少しかじったか、せいぜい数十行のバッチプログラムを作る程度。こんな自分でも、LINE Messaging APIがあれば、プログラム本を頼りにチャットbotを作ることができました（えっへん）。

なお、ゲームブックは自宅に200冊以上あります。。。

本システムではPHPプログラムをHeroku上で動かしています。ほぼノンプログラマーの観点から、嵌った点やシステム構築の考え方を今後に書いていければと思います。
Hyper-V の外部仮想スイッチを追加するコマンド (と、それが失敗する件)

Windows で Hyper-V を使って仮想マシンを動かして、その仮想マシンを外部ネットワークに接続させたい。 最近は NAT の仕組みもできたりしてるっぽい (まだ詳しく調べてない) けど、従来の方法としては 「外部仮想スイッチを作成」 して、仮想マシンの NIC から外部仮想スイッチを経由して外部ネットワークに接続する。

* MS による日本語ドキュメント : [仮想ネットワークを作成する](https://docs.microsoft.com/ja-jp/virtualization/hyper-v-on-windows/quick-start/connect-to-network)
* MS による英語ドキュメント : [Create a virtual network](https://docs.microsoft.com/en-us/virtualization/hyper-v-on-windows/quick-start/connect-to-network)

Hyper-V マネージャの仮想スイッチマネージャを使って GUI 上で追加することもできるのだけど、コマンドを使う方法を書いておく。

# PowerShell 上でコマンドを使用して外部仮想スイッチを追加

まずは `Get-NetAdapter` コマンドで Windows 10 システムに接続されているネットワーク アダプターの一覧を取得。

```
PS C:\Users\nobuoka> Get-NetAdapter

Name                      InterfaceDescription                    ifIndex Status       MacAddress             LinkSpeed
----                      --------------------                    ------- ------       ----------             ---------
Bluetooth ネットワーク...  Bluetooth Device (Personal Area Netw...       8 Disconnected XX-XX-XX-XX-XX-XX         3 Mbps
Wi-Fi                     Intel(R) Dual Band Wireless-AC 7265          13 Up           XX-XX-XX-XX-XX-XX     866.7 Mbps
```

外部仮想スイッチの接続先として、このうちのどれか 1 つを選ぶ。 今回の場合は 「Wi-Fi」 しかないので、「Wi-Fi」 にする。

あとは `New-VMSwitch` コマンドを使って作成する。 名前と、管理 OS 側に共有するかどうか (`-AllowManagementOS`) と、接続先のネットワークアダプタを指定する。

```
PS C:\Users\nobuoka> New-VMSwitch -Name "Wi-Fi VM Switch" -AllowManagementOS $True -NetAdapterName "Wi-Fi"
```

物理的なネットワークアダプタが 1 つしかないのであれば、管理 OS 側に共有しないと管理 OS 側からネットワーク接続ができなくなってしまう。 物理ネットワークアダプタが 1 つの環境ならほぼ `$True` 一択だと思う。

# なぜかうまくいかない

という上記手順で作成できるはずなのだけど、うちの環境ではうまくいかない。 Windows 10 Pro IP Build 14986 な環境。

```
PS C:\Users\nobuoka> New-VMSwitch -Name "Wi-Fi VM Switch" -AllowManagementOS $True -NetAdapterName "Wi-Fi"
New-VMSwitch : 仮想イーサネット スイッチの接続の追加中にエラーが発生しました。
イーサネット ポート '{D68B5B04-9606-4A68-9F3E-E15DFE8E1635}' のバインドに失敗しました: ポインターが無効です (0x80004003)。
発生場所 行:1 文字:1
+ New-VMSwitch -Name "Wi-Fi VM Switch" -AllowManagementOS $True -NetAda ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidArgument: (:) [New-VMSwitch]、VirtualizationException
    + FullyQualifiedErrorId : InvalidParameter,Microsoft.HyperV.PowerShell.Commands.NewVMSwitch
```

英語だとこんな感じ。

```
PS C:\Users\nobuoka> New-VMSwitch -Name "Wi-Fi VM Switch" -AllowManagementOS $True -NetAdapterName "Wi-Fi"
New-VMSwitch : Failed while adding virtual Ethernet switch connections.
Ethernet port '{7B47F169-98C7-4306-B150-0B75D1E5EB62}' bind failed: Invalid pointer (0x80004003).
At line:1 char:1
+ New-VMSwitch -Name "Wi-Fi VM Switch" -AllowManagementOS $True -NetAda ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidArgument: (:) [New-VMSwitch], VirtualizationException
    + FullyQualifiedErrorId : InvalidParameter,Microsoft.HyperV.PowerShell.Commands.NewVMSwitch
```

Windows の初期化をした直後には成功したのだけど、ネットワーク周りをいじってるうちにおかしくなったっぽい？ Insider Preview だからなのか正式リリース版でもダメなのかとか、調査が面倒なのでまだそこまで調べられてない。 備忘録として残しておく。

どうやって調査していけばいいのかもわからないので、知見ある方いらっしゃいましたら教えてください :bow:
意外に面倒だった、Mac環境でラズパイにNOOBS無しでRaspbianをインストールした件(ほぼ完了)

#おさらい

[前回](http://qiita.com/MeguMegu1978/items/a96d77e0a0bbeab8f7ff)の続き。

・NOOBSなし(はあんまり関係ないけど)でSDカードにddでRaspbianインストール済み
・有線LAN or 無線LANでラズパイにssh出来る
・USBからの給電を1200mAに設定済み
・2.5インチ外付けHDD(USB給電タイプ)接続するが認識しない←イマココ

#打開策1 SSDにしてみる
HDDより消費電力が低い外付けSSDを用意してUSB接続してみる。

```shell
hoge@mochi:~ $ sudo fdisk -l
:
:
Device         Boot  Start      End  Sectors  Size Id Type
/dev/mmcblk0p1        8192   137215   129024   63M  c W95 FAT32 (LBA)
/dev/mmcblk0p2      137216 30318591 30181376 14.4G 83 Linux

:
:

Device     Start        End    Sectors   Size Type
/dev/sda1   2048 1465149134 1465147087 698.7G Linux filesystem
```

/dev/sda1がでてきたら、無事認識しています。
本来はこの後、このSSDでセットアップを進めたかったのですが…5年前に購入し酷使していたブツのせいか、後ほどSDカードからOSをddした後のe2fsckを通らなかったため断念。

#打開策2 電源周りを強化
家に転がっていた、[USB給電の強まった電源タップ](https://www.amazon.co.jp/gp/product/B01M7X5UXE/ref=oh_aui_detailpage_o09_s00?ie=UTF8&psc=1)や、[給電用のUSB端子のついたUSBケーブル](https://www.amazon.co.jp/Groovy-GM-UH004-%E9%9B%BB%E6%BA%90%E8%A3%9C%E5%8A%A9%E3%82%B1%E3%83%BC%E3%83%96%E3%83%AB%E4%BB%98USB%E3%82%B1%E3%83%BC%E3%83%96%E3%83%AB/dp/B002TOK122/ref=sr_1_sc_2?s=computers&ie=UTF8&qid=1486880892&sr=1-2-spell&keywords=USN%E3%82%B1%E3%83%BC%E3%83%96%E3%83%AB+%E7%B5%A6%E9%9B%BB)を使って再度HDDを接続。こいつ…動くぞ…！！

#SDカードのOSをddでHDDにコピーとパーティションのリサイズ
みんな大好きddコマンドでHDDにOSをコピー。

```shell
hoge@mochi:~ $ sudo dd if=/dev/mmcblk0p2 of=/dev/sda1 bs=1m conv=noerror,sync
```

しばらく放置するとコピーがおわるので、e2fsckして、リサイズに備える。

```shell
hoge@mochi:~ $ sudo e2fsck /dev/sda1
```

で、不正ブロックを修正するか聞かれたら、yと答えておきましょう。次に、パーティションのリサイズをします。これもコマンド一発

```shell
hoge@mochi:~ $ sudo resize2fs /dev/sda1
```

で終わりです。

#ブートパーティションを切り替える
/etc/fstabとcmdline.txtを書き換えて、ブートパーティションを切り替えます。まず前者。気をつけるのは、修正するのはdd先のHDDの/etc/fstabだという所。おあつらえ向きのマウントポイント(/mnt)があるので、そこにHDDをマウントして編集する。

```shell
hoge@mochi:~ $ sudo mount -t ext4 /dev/sda1 /mnt
hoge@mochi:~ $ sudo vim /mnt/etc/fstab
```

![スクリーンショット 2017-02-12 15.55.08.png](https://qiita-image-store.s3.amazonaws.com/0/16181/2c9bfc00-b836-5d0a-ce80-7583e871d1ed.png "/etc/fstab")

```shell
/dev/mmcblk0p2
```

の部分を、スクリーンショットのように

```shell
/dev/sda1
```

に書き換える。

次はcmdline.txtだ。シェルから```sudo halt```あたりで、一旦ラズパイの電源を落とし、SDカードをPCにマウント(認識させる)SDカード直下に、cmdline.txtがあるので、fstab同様、```/dev/mmcblk0p2```となっている部分を```/dev/sda1```とにする。

この状態で、SDカードをラズパイに戻し電源投入後に無事起動すれば、HDDから起動してる…ハズ。

もし、無事起動しなかった場合は、cmdline.txtを```/dev/mmcblk0p2```に戻せば、SDカードから起動するようになる。HDDからの起動時のエラーなどは、ディスプレイ接続して確認するようにしましょう。

#最後に
若干無理矢理感はあるもののHDDからのOS起動にはこぎつけました。ただ、給電をタップからではなく、iPhone付属のACアダプタ<->USB変換コネクタでの給電に切り替えたところ、やはり起動しなくなったりとこのあたりはしっかり足固めしてあげないとだめな様子。ラズパイにも、正規のACアダプタを買ってあげよう…
MacBook Pro (Mid 2012) でtensorflow-gpuをセットアップした時のメモ

# 概要
iMacやMacBook Proは、機種によってはNVIDIAのグラフィックボードを搭載しているようです。
手持ちのMacBook Pro (Retina, 2012 MID)にNVIDIA GeForce GT 650Mが載っていました。
せっかくのGPUを活かすべく、tensorflow-gpuのセットアップをしてみました。
### 注意
- 2017年2月12日時点の記事です。
- [CUDA GPUs](https://developer.nvidia.com/cuda-gpus)が必要です。

# 環境
- OS 10.12.3 (Sierra)
- Python 2.7
- tensorflow-gpu 0.12.1

# セットアップ
基本的には、公式の[Download and Setup](https://www.tensorflow.org/versions/r0.12/get_started/os_setup.html)に従います。また、コマンドは[参考記事](http://qiita.com/ariiyu/items/65a9f01f0d42d97be1d4#%E5%8F%82%E8%80%83%E8%A8%98%E4%BA%8B)とほぼ同様です。

※以下はTensorflowをconfigure済みの場合のコマンドです。途中で試行錯誤したので、一部の手順が抜けている可能性があります。


## Cuda

```
$ brew upgrade
$ brew install coreutils
$ brew cask install cuda
```

## cuDNN
NVIDIAの[ダウンロードページ](https://developer.nvidia.com/cudnn-download)から入手。ユーザー登録が必要。


今回はcuDNN v5.1 Library for OSXをダウンロードしました。

中身を、`/user/local/cuda/lib`と `/user/local/cuda/include`にそれぞれ移します。

後の実行時にエラーが出たので、シンボリックリンクも貼りました。

```
$ cd /usr/local/cuda/lib
$ sudo ln -s libcuda.dylib libcuda.1.dylib
```

パスの記述は、最終的に以下のようになりました。

```shell:.bashrc
export CUDA_HOME=/usr/local/cuda
export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:/usr/local/cuda/lib"
export DYLD_LIBRARY_PATH="$DYLD_LIBRARY_PATH:$CUDA_HOME/lib"
export PATH="$CUDA_HOME/bin:$PATH"
```


## tensorflow-gpu
```
$ brew install bazel
$ brew install tensorflow-gpu==0.12.1
```

インストールができたら、configureしてください。

# 動作確認

tensorflowを使うサンプルを動かしてみます。インポートエラーなどが出なければOKです。  
公式の[Using GPUs](https://www.tensorflow.org/how_tos/using_gpu/)に色々書かれていますが、configを渡すこともできます。

```python:sample.py
import tensorflow as tf
...
# for tensorflow-gpu
config = tf.ConfigProto()
config.log_device_placement = True
config.gpu_options.allow_growth = True
...
sess = tf.Session(config=config)
sess.run(c)
```

実行時に、以下のようにデバイスの情報が表示されます。

```
I tensorflow/core/common_runtime/gpu/gpu_device.cc:885] Found device 0 with properties: 
name: GeForce GT 650M
major: 3 minor: 0 memoryClockRate (GHz) 0.9
pciBusID 0000:01:00.0
Total memory: 1023.69MiB
Free memory: 833.14MiB
```

## さいごに
途中で結構ハマってしまいました。
また、Free memoryが少ない場合、実行後に落ちました。最初はセットアップに失敗したかと思いましたが、Chromeなど他のアプリケーションをシャットダウンすると上手くいきました。
CPU版tensorflowと比べると、かなり処理が速くなった気がします。メモリ容量で問題が出た時は、別マシンか外付けのグラフィックカードを使うのが良いかもしれません。

# 参考記事
- [TensorFlow を macOS 10.12 + CUDA 8.0 向けにセットアップする - Qiita](http://qiita.com/tnzk/items/111a4450142fbb250b0b)
- [【爆速なるか!?】OSXでTensorflowのGPU版を使うためのセットアップ](http://qiita.com/tawago/items/68bef63d8bb02797c669)
"Method d in android.util.Log not mocked." をころす

後から試験書いたらこんなこと言われた。

```
java.lang.RuntimeException: Method d in android.util.Log not mocked. See http://g.co/androidstudio/not-mocked for details.

	at android.util.Log.d(Log.java)
...

Process finished with exit code -1
```

そしたら、これを

```java
Log.d(TAG, "ｳｪｰｲ");
```

こうして

```java
log("ｳｪｰｲ");
```

```java
private static void log(String msg) {
    Log.d(TAG, msg);
}
```

こう。

```java
private static void log(String msg) {
    try {
        Log.d(TAG, msg);
    } catch (RuntimeException ignored) {
    }
}
```

やったぜ。

ちなみに `sout` に置き換えると出力がうるさい感じです。見たいならそれで良いけど。

他の人どうしてるんだろ。こういう↓ことしてるのかな。

- [Method d in android.util.Log not mocked.に対する3つの対処法 - Qiita](http://qiita.com/oxsoft/items/b12b7a6c17e92eb880cd)
Lチカやってみる

#Lチカやってみる

LチカとはLEDを点滅すること。

---

# ハードウェアのHelloWorld
ソフトで最初にするプログラム
ハードウェアの工作でそれに相当するもの
---

# 用意するもの

LEDと抵抗、ブレッドボード、電源。
---

# いいこと思いついた！

電源を強力にして、抵抗をなくせば明るくなるよ！
---

# LEDをたくさん並べて、
抵抗は１つにまとめたら回路が簡単になるよ！
---

#  　福袋で買ってきたLED

100Vにつなげたら照明になるね！
---

# NeoPixelで
---

ライト作ればいいんじゃない！
---

# おまい天才だな・・・

この、天才のアイデア、やってみたらどうなるでしょう！！

---

# 006Pにつなげる！！

![IMG_20170212_090606.jpg](https://qiita-image-store.s3.amazonaws.com/0/165002/48aed512-4f14-d92f-865b-45c9eec889b5.jpeg)

---

# LEDはコレです

![IMG_20170212_090610.jpg](https://qiita-image-store.s3.amazonaws.com/0/165002/cda304c5-720c-861a-1125-5a25691732d0.jpeg)

---

# 錆びてるのが重要です

![IMG_20170212_090622.jpg](https://qiita-image-store.s3.amazonaws.com/0/165002/e5a6f7de-6ee8-50b9-7052-6aad735599c3.jpeg)

---

# 9Vで明るく光る？

006Pにつなげました。

[![IMAGE ALT TEXT HERE](http://img.youtube.com/vi/A7a8CeAlT18/0.jpg)](http://www.youtube.com/watch?v=A7a8CeAlT18)

https://youtu.be/A7a8CeAlT18

一瞬光ってすぐ消える

電気が足りないのかな？

---

# 16VのACアダプタにつなげました

https://youtu.be/7ft30EiFJSA

一瞬光ってすぐ消える？

まだ足りないのかな？

---

# 昇圧コンバーター

![IMG_20170212_092329.jpg](https://qiita-image-store.s3.amazonaws.com/0/165002/d8679d07-d132-c4f1-4263-cd8bd5f9ca13.jpeg)

---

# こんな感じで

![IMG_20170212_111028.jpg](https://qiita-image-store.s3.amazonaws.com/0/165002/50c39523-4826-9cc5-afd4-fb12485b0b7b.jpeg)

---

# 20V→30V→40V→・・・100V

https://youtu.be/Uo6xxVyTm_Q
https://youtu.be/Vsvf1w-L6v4
50V
https://youtu.be/ITPXhBUkgXg
80V
https://youtu.be/vQnwUAsaRAc
どれも、すぐ光ってすぐ消える

---

# LEDが悪い？

黄色や緑にしたけど・・・・あまり変わりない


失望！！

---

# 電流制限抵抗

ひとつひとつつけるのってアレじゃない？

---

# まとめてみました１

https://youtu.be/gZZSsm8FNWs

正常！！

つまらない・・・

---

# まとめてみました２

https://youtu.be/HLj-AGF5G5M

OK!!

---


# 100Vにつなげる！！

100Vの電源として、ピザの配電盤を持ってきます。

![IMG_20170212_121105.jpg](https://qiita-image-store.s3.amazonaws.com/0/165002/5253a7a8-f6dc-a2e1-5a3f-61a2fecfda4a.jpeg)

---

# 44個直列にしてみました


![IMG_20170212_121201.jpg](https://qiita-image-store.s3.amazonaws.com/0/165002/5bc7697b-e796-01b2-b528-ee7f53305f87.jpeg)

---

# 光りました！！


![IMG_20170212_121211.jpg](https://qiita-image-store.s3.amazonaws.com/0/165002/d09e4876-18b3-10fc-fde6-2eaf2df2a2aa.jpeg)

---


# 100Vで動かすには

フリッカーが激しいです

蛍光灯もフリッカーがありますが100Hz/120Hzです

LEDは50Hz/60Hzです

ブリッジダイオードをつけて、電解コンデンサをつけると改善しますが・・・

---


# 通常は、10Ｖとか30Vとかで動かします

DC電源ユニットが必要です

---


# NeoPixelって照明に使えないの？

RGBそれぞれ500mcdとすると7lmぐらい。


60W電球が800lm。うーん。

---

# パワーLEDを使うと

3WLEDで200lm、3.8V

10WLEDで850lm,10V

こういったものを100Vで動かすやり方

http://qiita.com/nanbuwks/items/018cc000757f9657a555
dockerコンテナが起動できない場合（windows）

コンテナが起動しな場合に下記のコマンドでログを確認する。

```
$ docker logs コンテナ名
```

確認して下記のようなエラーが表示されたら

```
goroutine 1 [running, locked to thread]:
panic(0x88f8a0, 0xc8201216c0)
        /usr/local/go/src/runtime/panic.go:481 +0x3e6
github.com/urfave/cli.HandleAction.func1(0xc8200ef2e8)
        /tmp/tmp.n151sEscRu/src/github.com/opencontainers/runc/Godeps/_workspace/src/github.com/urfave/cli/app.go:478 +0x38e
panic(0x88f8a0, 0xc8201216c0)
        /usr/local/go/src/runtime/panic.go:443 +0x4e9
github.com/opencontainers/runc/libcontainer.(*LinuxFactory).StartInitialization.func1(0xc8200eebf8, 0xc82001a0c8, 0xc8200eed08)
        /tmp/tmp.n151sEscRu/src/github.com/opencontainers/runc/Godeps/_workspace/src/github.com/opencontainers/runc/libcontainer/factory_linux.go:259 +0x136
github.com/opencontainers/runc/libcontainer.(*LinuxFactory).StartInitialization(0xc820051630, 0x7fcbbba9a728, 0xc8201216c0)
        /tmp/tmp.n151sEscRu/src/github.com/opencontainers/runc/Godeps/_workspace/src/github.com/opencontainers/runc/libcontainer/factory_linux.go:277 +0x5b1
main.glob.func8(0xc82006ea00, 0x0, 0x0)
        /tmp/tmp.n151sEscRu/src/github.com/opencontainers/runc/main_unix.go:26 +0x68
reflect.Value.call(0x7f45a0, 0x9a4d88, 0x13, 0x8ebac8, 0x4, 0xc8200ef268, 0x1, 0x1, 0x0, 0x0, ...)
        /usr/local/go/src/reflect/value.go:435 +0x120d
reflect.Value.Call(0x7f45a0, 0x9a4d88, 0x13, 0xc8200ef268, 0x1, 0x1, 0x0, 0x0, 0x0)
        /usr/local/go/src/reflect/value.go:303 +0xb1
github.com/urfave/cli.HandleAction(0x7f45a0, 0x9a4d88, 0xc82006ea00, 0x0, 0x0)
        /tmp/tmp.n151sEscRu/src/github.com/opencontainers/runc/Godeps/_workspace/src/github.com/urfave/cli/app.go:487 +0x2ee
github.com/urfave/cli.Command.Run(0x8ee970, 0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x984240, 0x51, 0x0, ...)
        /tmp/tmp.n151sEscRu/src/github.com/opencontainers/runc/Godeps/_workspace/src/github.com/urfave/cli/command.go:191 +0xfec
github.com/urfave/cli.(*App).Run(0xc820001500, 0xc82000a100, 0x2, 0x2, 0x0, 0x0)
        /tmp/tmp.n151sEscRu/src/github.com/opencontainers/runc/Godeps/_workspace/src/github.com/urfave/cli/app.go:240 +0xaa4
main.main()
        /tmp/tmp.n151sEscRu/src/github.com/opencontainers/runc/main.go:137 +0xe24
```

下記のコマンドで、windows用の改行コードを変更してあげる。

```
find ./ -type f -name "*.sh" -print0 | xargs -0 sed -i 's/\r//'
```

再度、コンテナを起動させてみると起動するはず。。。。
Angular-cli ng serveでhttps

適当な場所に

```
$ openssl genrsa -des3 -passout pass:pass_hoge -out server_pass.key 2048
$ openssl rsa -passin pass:pass_hoge -in server_pass.key -out server.key
$ openssl req -new -key server.key -out server.csr

Country Name (2 letter code) [AU]:(国名)
State or Province Name (full name) [Some-State]:(都道府県)
Locality Name (eg, city) []:(市町村)
Organization Name (eg, company) [Internet Widgits Pty Ltd]:(組織名)
Organizational Unit Name (eg, section) []:(部署名)
Common Name (e.g. server FQDN or YOUR name) []:(サーバ名:FQDN)
Email Address []:(メールアドレス)
Please enter the following ‘extra’ attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:

$ openssl x509 -req -sha256 -days 365 -in server.csr -signkey server.key -out server.crt
```

**乱数ファイルを利用する場合**

```
$ openssl genrsa -des3 -passout pass:pass_hoge -out server.pass.key 2048
```
↓

```
$ openssl dgst -md5 /var/log/system.log > rand.dat
$ openssl genrsa -des3 -passout pass:pass_hoge -rand rand.dat -out server_pass.key 2048
```

**パスフレーズなしでKey作成**
```
$ openssl genrsa -des3 -passout pass:pass_hoge -out server.pass.key 2048
```
↓

```
$ openssl genrsa -rand rand.dat 2048 > server.key
```

**ng serve**

```
ng serve --ssl true --ssl-key "server.keyまでのパス" --ssl-cert "server.crtまでのパス"
```

これでhttpsでアクセスできるはず。

## 補足
`package.json`の `"start": "ng serve"` を `"start": "ng serve --ssl true --ssl-key server.keyまでのパス --ssl-cert server.crtまでのパス"`
とかにすると `npm start`の時にhttpsで立ち上がってくれる。
もしくは

```
  "scripts": {
    "start": "ng serve",
    "hoge": "ng serve --ssl true --ssl-key server.keyまでのパス --ssl-cert server.crtまでのパス",
  },
```

こんな感じで好きな名前で登録して
`$ npm run hoge`
でも立ち上がってくれる。
railsのmailerでcssファイルを使う＆画像も入れる

#RailsのMailerでメール送るときに、メールをCSSでDesignしたい

##問題

1. メールclientによっては、ヘッダーがスキップされてしまうので、ヘッダーでcssファイルを読み込んでもだめな場合ある
2. inlineで書く必要がある
    3.  例：`.test{style: 'background-color: red;'} `
    4.  これだと複雑なものを全て書くのは不可能


## 解決策→ premailer-rails


https://github.com/fphilipe/premailer-rails

このGemでは、Headerに書いたcssファイルをinline cssに変換してくれるので、上記の問題を解決することができる。

```:Gemfile
gem 'nokogiri'
gem 'premailer-rails'
```

```haml:app/views/layouts/mailer.haml
%head
  = stylesheet_link_tag 'application', media: 'all'
%body
  ...
```

これで、普通のViewsと同じように使えるようになる。

##注意

1. 不要な物も全て読み込んでしまうので、メールに必要なcss だけを、`email.css`に隔離して、読み込むべきかも
2. Bootstrapなどを使ってる場合は、inlineに変換されるときに、順番がなくなったり、Overwriteの関係がおかしくなったりするせいか、ちょっと予想とことなるDesignになったりする(原因はちゃんと調べてない)

# 画像を入れる

1. 画像ファイルは、`app/assets/images`以下においておく

2. heleperを作っておく

    ```rb:app/helpers/email_helper.rb
    module EmailHelper
      def email_image_tag(image, options = {})
        image_tag email_image_url(image), options
      end

      def email_image_url(image)
        attachments[image] = File.read     Rails.root.join("app/assets/images/#{image}")
        attachments[image].url
      end
    end
    ```

3. MailerのViewsで呼ぶ(ここでは、layoutsで呼んでいるが、個々のメールのテンプレートで呼んでもOK)

    ```rb:app/views/layouts/mailer.haml
    = email_image_tag 'mail_image.png'
    ```


# おまけ：メーラーのテストに関してはこちら

[rails でmailにimageを入れてるときのLinkのrspecのテスト](http://qiita.com/gymnstcs/items/148a67c354216723555d)
Android Thingsをラズパイ3に入れる

Android for IoTな[Android Things](https://developer.android.com/things/index.html)をラズパイ3に入れてみたので、今回はその手順紹介。
必要なものは以下。

* Raspberry Pi3
* MicroSD 8GB以上
* Raspberry Pi3用電源アダプタ
* HDMI対応ディスプレイ
* HDMIケーブル
* LANケーブル

RaspberryPi3は正規代理店の[KSY](https://raspberry-pi.ksyic.com/main/index)で購入可能。
電源がちょっと特殊(？)なので、電源アダプタは対応版を用意した方が良いみたい。
僕はSDカードは余ってるのがあったのと、ケースはどっちでも良かったので、電源アダプタとセットになった「[Pi 3 Official 2.5A 電源セット (JP)](https://raspberry-pi.ksyic.com/?pdp.id=196)」を購入。

イメージを書き込んだり、Android Thingsにつなぐための環境はいつも通り。

|対象|OS|
|:--|:--|
|PC|Windows10 x64|

あと、adbを使うので、PCにはAndroidSDKを入れておくこと。

手順は基本的に下記の通り。
https://developer.android.com/things/hardware/raspberrypi.html

# Android Thingsイメージの取得
[Flashing the image](https://developer.android.com/things/hardware/raspberrypi.html#flashing_the_image)の項目の下記文章中のリンク(latest preview image)をクリックする。
`To flash Android Things onto your Raspberry Pi, download the latest preview image and follow these steps:`

[System Image Downloads](https://developer.android.com/things/preview/download.html)のページから、Raspberry PiのThings packageの項目のリンクをクリックする。
僕が取得した時は「androidthings_rpi3_devpreview_2.zip」だった。

ダウンロードが終わったら、このzipファイルを解凍する。

# イメージの書き込み
ラズパイ公式サイトの書き込み手順を実行していく。Windowsだと[ここ](https://www.raspberrypi.org/documentation/installation/installing-images/windows.md)。
以下はWindowsでの手順。

1. SDカードをPCに接続する
1. 書き込みツールの[Win32DiskImager](https://sourceforge.net/projects/win32diskimager/)のインストーラを取得する
1. Win32DiskImagerをインストール
1. Win32DiskImagerを管理者権限で起動する
1. 「Image File」にAndroid Thingsのイメージファイルのパス(解凍したフォルダ以下のimgファイルパス)を指定する
1. 「Device」にSDカードのドライブパスを指定する  
(このドライブパスを間違えると取り返しのつかない事態になるので、気を付けること)
1. 「Write」ボタンを押下し、イメージ書き込みを開始  
(僕の環境では、だいたい5～10分くらいで終わった)
![001.PNG](https://qiita-image-store.s3.amazonaws.com/0/141310/65320756-11ec-e2b5-b150-93ec372b2402.png)

# Android Thingsに接続する
イメージを書き込んだSDカードを取り出して、ラズパイに入れる。
有線LAN、HDMIディスプレイをつなぎ、microUSBに電源をつなぐ。

Android Thingsがしばらくすると起動し、
`Ethernet eth0 connected`
と表示されているところのIPアドレスを確認する。

`adb connect (IPアドレス)`
を実行すると、
`connected to (IPアドレス):5555`
と表示されればOK。

試しに、
`adb devices`
を実行してみると、
`(IPアドレス):5555      device`
が表示される。

logcatを見る場合は、
`adb logcat -d`
で見れる。

# WiFi接続の設定
下記コマンドで、対象SSIDとパスワードを指定して実行する。

```
adb shell am startservice -n com.google.wifisetup/.WifiSetupService -a WifiSetupService.Connect -e ssid (対象のSSID) -e passphrase (パスワード)
```

`WiFi "(SSID)" connected`
と表示されているところのIPアドレスになる。




これでAndroidStudioを使って作ったIoT用アプリを動かせるようになる。
ちなみにサンプルは[ここ](https://developer.android.com/things/sdk/samples.html)にある。