OmniAICreator/Qiita-1.07M huggingface dataset:
[C#][ReactiveExtensions] CompositeDisposableを再利用したい(DisposeではなくClearを使う)

# TL;DR
タイトルでもうすでに完結してるんですが・・・、DisposeではなくClearを使えばよかったというメモ。

# 背景
CompositeDisposableは一度でもDispose呼んじゃうと、その後にAddしても追加したそばからDisposeが呼ばれて破棄されるようになってしまいます。というかそういう仕様です。

それを知らずに使ってて、ReactivePropertyのSubscribeが２回目以降に効かなくなって困るという状態でした。
なのでDispose後に再度CompositeDisposableをnewするというイマイチな実装にしてました・・・。

## [CompositeDisposable.Add Method (System.Reactive.Disposables)](https://msdn.microsoft.com/en-us/library/system.reactive.disposables.compositedisposable.add(v=vs.103).aspx)
Addは以下のような仕様です。CompositeDisposable自体がdisposeされると、その後のAddされたものは都度disposeされるようになるようです。
> Adds a disposable to the CompositeDisposable or disposes the disposable if the CompositeDisposable is disposed.

## [CompositeDisposable.Clear Method (System.Reactive.Disposables)](https://msdn.microsoft.com/en-us/library/system.reactive.disposables.compositedisposable.clear(v=vs.103).aspx)
Clearなら登録されているものを全てdisposeしますが、CompositeDisposable自体はdisposeしません。なのでそのまま継続利用できます。
> Removes and disposes all disposables from the GroupDisposable, but does not dispose the CompositeDisposable.

## [CompositeDisposable.Remove Method (System.Reactive.Disposables)](https://msdn.microsoft.com/en-us/library/system.reactive.disposables.compositedisposable.remove(v=vs.103).aspx)
Removeも削除時に対象のdisposeを呼ぶ仕様なので、場合によってはRemoveを利用してもよいかと思います。
> Removes and disposes the first occurrence of a disposable from the CompositeDisposable.

# 結論
再利用したい場合はDisposeではなく、Clear or Remove を使いましょう。
（サンプルコードがDipose呼んでるものばかりなので、CompositeDisposableは再利用できないものと勘違いしていました）

#参考
[CompositeDisposable Class (System.Reactive.Disposables)](https://msdn.microsoft.com/en-us/library/system.reactive.disposables.compositedisposable(v=vs.103).aspx)

この記事を書いてる途中まで、以下の記事(RxJava)のようにReusableCompositeDisposableを定義しないといけないのかなと思ってました・・・。
[CompositeSubscriptionは再利用できない #RxJava - Islands in the byte stream](http://gfx.hatenablog.com/entry/2015/06/08/091656)
【エンジニア向け】ビットコインを学んでブロックチェーンを完全に理解する【第二回 トランザクション】

前回はこちら
[ビットコインを学んでブロックチェーンを理解する【第一回 歴史とネットワーク】](https://qiita.com/onokatio/items/04f23b7300dec7e287cb)

# トランザクションについて（以下TX）

本題の、ビットコインが送金を行う方法についてです。
ビットコインは、TXというものをネットワークにブロードキャストすることで、自分のアカウントから誰かのアドレスに送金することができます。

## TXの構造

|名前|説明|大きさ|
|:-:|:-:|:-:|
|version no|バージョン番号。現在は1|4バイト|
|In-counter|正の整数。list of inputsの数を定義する。|1 から 9 バイト|
|list of inputs|TxInの配列|不定。|
|Out-counter|正の整数。list of putputsの数を定義する。|1 から 9 バイト|
|list of outputs|TxOutの配列。|不定。|
|signature|上全部を自分のアカウントの秘密鍵で署名したもの。電子署名。| - |

**※一部省略しています**

TXは、大まかに2つのデータを持っています。トランザクションインプットと、トランザクションアウトプットです。上のようにTxInとTxOutと表現します。

TxOutには、自分が送金したいアドレスと、額が書いてあります。これが配列になっています、つまり同時に複数の人に送金することができます。

TxInは少し複雑です。ここではTX番号（ビットコインのTXにはすべて通し番号がついている）を使って、他人が自分宛てに送金したTXを指定します。
つまり、自分宛てのTXのTxOutの1つを指し示します。こうすることで、「自分にお金が送られたTXを参照することで、自分が受け取った以上は送金できない」仕組みを表現しています。
こうして、TXがTXを指し示し、巨大な網目のようになっているのがビットコインの送金システムです。

![tx.png](https://qiita-image-store.s3.amazonaws.com/0/154157/439601be-d47f-afcc-3406-19720778acb2.png)

このようにして、自分宛ての送金を複数参照し、その合計額分他の人に送金できる（相手がそれをTxInとして使うことができる）仕組みになっています。
とても複雑です。ぼくも理解するのに数週間かかりました。

## 例
たとえば、ボブがアリスに3BTCを2回送金したことがあるとします。
そして今回、アリスはトムに2BTC、ジェーンに4BTC送金したいと思っています。

このとき、ネットワークにはボブtoアリスの送金のTXが2つがあります。
ちなみにTX番号1と2は、誰かからのボブへの送金したときのTXです。

|Tx番号|TxInの数|TxIn[0]|TxOutの数|TxOut[0]|
|:-:|:-:|:-:|:-:|:-:|
|3|1|Tx番号 = 1, TxOutの番号 = 1|1|アドレス = <アリスのアドレス>, 額 = 3BTC|

|Tx番号|TxInの数|TxInの[0]|TxOutの数|TxOut[0]|
|:-:|:-:|:-:|:-:|:-:|
|4|1|Tx番号 = 2, TxOutの番号 = 1|1|アドレス = <アリスのアドレス>, 額 = 3BTC|

そして、アリスはトムに2BTCを送ります。まず、自分宛ての送金TXをネットワークから探します。合計で2BTCを超えるようにしなければいけません。今回は3BTCボブから送られてきたので、そのTxOutを使います。アリスは、ボブからの送金である、Tx番号3のTxOutを参照し、以下のようなTXを生成します。

|Tx番号|TxInの数|TxInの[0]|TxOutの数|TxOut[0]|TxOut[1]|
|:-:|:-:|:-:|:-:|:-:|:-:|
|5|1|Tx番号 = 3, TxOutの番号 = 1|2|アドレス = <アリスのアドレス>, 額 = 1BTC|アドレス = <トムのアドレス>, 額 = 2BTC|

これで、自分はトムに送金できた、もっといえばトムがTxInとして参照して他人に送金できるようになりました。ここで注目してほしいのは、送金先がアリス自分自身とトムの二人になっているところです。
TxInは合計で3BTCなので、本来このTxは3BTCを複数の人に同時に送金できます。しかし今回は2BTCしか送らないので、残りは自分宛てに1BTC送っています。
こうすることで、今度はこのTxOutをTxInとして参照するTxをアリスは生成することができます。
これはビットコインではお釣りなんて表現をします。

次にジェーンに4BTC送金してみましょう。
トムからの送金であるもう一つの3BTCのTxのTxoutが余っていて、さらに先程お釣りとして生成したTxOutがあるので。これらを合計して4BTCをTxの入力にし、出力を全部ジェーンにします。


|Tx番号|TxInの数|TxInの[0]|TxOutの数|TxOut[0]|TxOut[1]|
|:-:|:-:|:-:|:-:|:-:|:-:|
|6|2|Tx番号 = 4, TxOutの番号 = 1|Tx番号 = 5, TxOutの番号 = 1|1|アドレス = <ジェーンのアドレス>, 額 = 4BTC|


こうなると思います。

以上がビットコインの送金単位である「トランザクション」の仕組みと構成になっています。

# まとめ

- トランザクションには「入力」(TxIn)と「出力」（TxOut）があり、TxInでは自分宛の他のトランザクションのTxOutを指定する。これにより自分が送金された分しかお金を送金できない。
- トランザクションは入力と出力をそれぞれ複数持つことができ、それにより色々な額のTxOutをTxInとして入力に指定し、おつりとしての自分を含めた沢山の人にまとめて送金できる。
- トランザクションは番号で指定する。C言語のポインタ配列(*next)とかを想像しよう。


今回のを読んで、察しの言い方は「じゃあ自分宛てのTxOutを重複して使った場合はどうなる」なんて思うかもしれません。次回はそれに深く関わる「マイニングとブロック」を説明しようと思います。
ありがとうございました!
Coda2でXserverにSFTP接続する

Coda2を使ってXserverにSFTPで接続する際に、ちょっと困ったのでメモします。
なお、XseverでのSSH鍵の発行方法やSSH鍵のファイル移動やパーミッションの変更については割愛してます、ご了承ください。

修正：　Codaを立上げなおすたびにSFTPのパスワードを入力する必要があるためconfigとCodaのSFTPの設定を変更。

# 結論
.ssh/congfigファイルで接続先と鍵を紐付けした後、CodaのSFTP設定のサーバーアドレスは、configファイルの**host**を入力する。

**configの設定（Coda2の設定画面でSSH鍵ファイルの登録ができないために必要）**

```
Host 任意の名前
HostName XserverのサーバーID.xserver.jp
  Port 10022
  IdentityFile ~/.ssh/ssh鍵のファイル名
  AddKeysToAgent yes #パスワード毎回打ち込まないために追加
  UseKeychain yes　#パスワード毎回打ち込まないために追加
```

**Coda2: SFTP設定画面**
<img width="461" alt="スクリーンショット_2017_09_30_23_44.png" src="https://qiita-image-store.s3.amazonaws.com/0/204477/be0e67c3-0fab-8a3e-8069-76018bb4da83.png">


1. configで設定したhost「任意の名前」を入力
2. Xserverのユーザー名
3. パスフレーズ付きのSSH鍵の場合は入力
4. 今回は空欄でOK（空欄だとデフォルトのポート番号22になるが、configでポート番号を「10022」に設定しているので空欄でもOK）


# 今回つまづいた点
SFTP接続する際につまづいた点は、次の2点です。

1. Codaの設定画面でSSH鍵ファイルの場所を登録しようとすると、
**SSH 認証鍵を読み込めませんでした。このファイルは読み込み可能な形式では無いかも知れません。もしくは ~/.ssh/config ファイルを設置し直接認証鍵ファイルを参照してみてください。** と表示されて登録できない。
2. CodaでSFTP接続できないとの質問に対して、開発元であるPacinの公式では、下記のようにSSH鍵のconfigで接続先と鍵を紐付けすることで解決できるのでは、との回答をよくされてるが、configファイルで紐付けした後のCodaの設定がわからなかった。
 
>お問い合わせの件、お待たせしております。ターミナル.appとCodaのターミナルとで同じ鍵を使用した場合はどうなりますでしょうか？ssh/configで接続先と鍵を紐づけることで接続できるのでは？と期待しております。宜しくお願い申し上げます。
https://twitter.com/PanicJapan/status/852740054434709505


# 参考にしたサイト
https://www.sria.co.jp/blog/2014/08/how-to-sftp-using-ssh-key-authentication-from-coda2/
HSLで色指定

### CSSで色を扱うプロパティはいくつかあります

- color：文字色（前景色）
- background-color：背景色

    ```ruby:css
    {
      color: ***
      background-color: ***
    }
    ```

### Hex Color

- ***の部分の指定の仕方で最もよく見られるのが、Hex ColorといういわゆるRGBを16進数表記されたものになります

    ```ruby:css
    .sample {
      color: #ffc0cb   // pink
      background-color: #87ceeb   // skyblue
    }
    ```

### RGB
- 10進数で指定するもの、これもよく見ます。色のみを指定するやり方と一緒に明度も指定するやり方があります。


    ```ruby:css
    .sample {
      color: rgb(255,255, 0)   // yellow
      background-color: rgba(0, 0, 255, 0.5)   // pale blue
    }
    ```

### HSL Color
- Hex ColorもRGBも明度、特に彩度を自分で変化させながら色を指定しやすいのはHSLです。
- HSLとは
    - Hue（色味）
    - Saturation（彩度）
    - Lightness（明度）


    ```ruby:css
    .sample {
      color: hsl(0, 100%, 50%)    // 薄い赤
      background-color: hsl(180, 50%, 100%)   // 彩度の落ちた青緑 
    ```

- 色味は360の度の角度で指定します。赤が0度地点
    - ![hsl.PNG](https://qiita-image-store.s3.amazonaws.com/0/77327/bd92b52e-5f93-695e-20dc-a83557b802f4.png)

- HSLの便利ポイント
    - 色に対する彩度や明度を自分で決めることがコード書きながらできるところ
unityでreduxアーキテクチャを使った堅牢なシーケンス制御の実装

#はじめに
リアクティブスパゲッティ好きですか？僕は苦手です！
Reduxアーキテクチャをゲーム用にアレンジしてバグのないゲーム制作を楽しみましょう！

Reduxアーキテクチャって何？という人はこちらをどうぞ
https://qiita.com/kiita312/items/49a1f03445b19cf407b7

「ゲームプログラマになる前に読む本」を読んだ人はstoreってstatemachineのことなんじゃ…と思うでしょう
はい、僕はstatemachineと捉えました！

#sample code
https://github.com/masak2/redux_custom
![state_info.jpg](https://qiita-image-store.s3.amazonaws.com/0/75247/0b045db5-e4ff-02d6-d531-3baccd6dc994.jpeg)


#動かしてみよう
![2017-09-30_23h30_16.png](https://qiita-image-store.s3.amazonaws.com/0/75247/8e312d49-c14b-24de-f5ec-0ca2e3bb2e17.png)


実行してみればわかりますが
wait3secボタンを押してから httpボタンを押しても何も起きません
3秒経過してidle stateに戻ってからでないと遷移が起きないのです！
statemachineだから当然ですね
そしてこれがいいんです！

ボタン押されたコールバックに直接ロジックを書くとどうなるでしょう？
wait3secボタンを押してからhttpボタン押すと通信始まってしまいます！
httpボタン押してからwait3secボタン押すと待ち処理始まってしまいます！
よくある同時押しバグ、通信中に別の処理できちゃったバグのオンパレードです


#本家reduxとの違い
生成されたactionをdispatchせずactionBlackboardに登録しておくことです
そして各stateがactionBlackboardに登録されたactionを評価するのです
間髪入れずactionをdispatchしてしまうと同一フレームにおいて発生したactionが順番に評価されてしまうためバグの温床になってしまいます

#メリット、デメリット
メリットはなんといっても堅牢さ
シーケンス制御にからむ進行不能バグは発生しません
コルーチンと違いブレークポイントで簡単に止められるためデバッグも容易です

デメリットは冗長さと可読性の悪さ
1秒待つのにもstateを用意しなくてはいけないのは退屈です
コルーチンならyield return new WaitForSecond(1f)一行です
またコルーチンやunirxに比べて可読性も悪くなりがちです
この辺はクラスベースのstatemachineにするとか
arbor2使ってみるとかで対応するのはどうでしょうか？


#まとめ
やっぱりstatemachine最高ですね！！！
現実のプロジェクトでは階層型statemachineを使うことになります
未だイケてる実装を見たことがありません
Artifical Intelligencs for gamesのHSM c++実装が一番近いけど使いづらかった…
nugetにあるHSMはゲーム用途ではないためやはり使いづらい…
LVM の設定を ansible から実行する

かなり雑だが ansible から LVM 設定を行うタスクファイルを書いた。

そのまま使われることを想定した作りではないので、もし流用するなら変数化するべきところを変数化して改変する形で利用して欲しい。

一応 [MySQL の準同期レプリケーション + マルチスレッドレプリケーションを ansible で組む](https://qiita.com/shimacpyon/items/ba990c5ef9aaf719871a) の流れをくむ関連記事として書いた。

```yaml:roles/lvm/main.yml
# ボリュームグループ (vg) 及び論理ボリューム (lvg) は vagrant
# マウント先は /mnt/vagrant
# CentOS7 前提で書いてるためファイルシステムは xfs
---

# /dev/sda 以外のブロックデバイスを取得する
# /dev/sda 以外のブロックデバイスを全て LVM に入れること前提
- name: find all disk devices
  find:
    paths: /dev
    file_type: any
    patterns: "^sd[b-z]$"
    use_regex: yes
  register: found_devices

- name: create volume group
  lvg:
    vg: vagrant
    pvs: "{{ found_devices.files|map(attribute='path')|join(',') }}"
  become: yes

- name: create logical volume
  lvol:
    vg: vagrant
    lv: vagrant
    size: +100%FREE
    shrink: no
  become: yes

- name: make filesystem
  filesystem:
    fstype: xfs
    dev: /dev/vagrant/vagrant
    resizefs: yes
  become: yes

- name: mount disk
  mount:
    path: /mnt/vagrant
    src: /dev/vagrant/vagrant
    fstype: xfs
    state: mounted
  become: yes

# ansible でのワークアラウンドをきかせるため LANG を en_US.UTF-8 で固定化
# (英語以外のロケールだと LVM のパーティション取得で失敗する)
# あと unit (単位) は "GB" ではなく "GiB" にする。でないと差分計算がずれる原因になる
- name: get each disk size
  parted:
    device: "{{ item.path }}"
    unit: GiB
    state: info
  register: total_disk_size
  with_items: "{{ found_devices.files }}"
  environment:
    LANG: en_US.UTF-8
  become: yes

# /dev/sda 以外のディスクサイズの算出。表示のみ、何かしらで差分算出する場合に。
- name: get total disk size (GiB)
  debug:
    msg: "{{ item }}"
  with_items: "{{ total_disk_size.results|map(attribute='disk')|map(attribute='size')|list|sum }}"

```

ちなみになぜ論理ボリュームとボリュームグループが vagrant なのかはお察しの通り vagrant でやったから。当初は [Google Compute Engine](https://cloud.google.com/compute/?hl=ja) 上でやるつもりだったが、複数ディスクをアタッチしてもひとつのブロックデバイスとして表示されてしまい今回の目的が達成できなかった。
オブジェクトストレージのファイルアップロード時間比較

AWS S3, GCP GCS, Azure Blob Storage 等、様々なオブジェクトストレージサービスが存在します。

S3, GCS のそれぞれに複数のファイルをアップロードし、合計時間にどの程度差異があるかを確認します。

---
##### **条件**
* 1 ファイルあたりのサイズは 1 MB (ファイルの生成方法:`dd if=/dev/urandom of=dummy bs=1M count=1`)
* 1 プロセスで 100 ファイルをアップロードし終わるまでの時間を見る
* アップロードには、各サービスが提供している公式コマンドを利用する (awscli, gsutil)
* アップロード元のサーバは、各サービスのコンピュートサービスを利用し、可能な限りリソース量の近いもの、ブースト機能を備えないものを選択する (m3.medium@EC2,n1-standard-1@GCE)
* オブジェクトストレージと、コンピュートサービスの Region,AZ は同じ、もしくはできるだけ近いものを選択する

---
##### **アップロードスクリプト**
* S3

```
#!/bin/bash
count=0
while :
do
echo $count
[[ count -eq 100 ]] && break
aws s3 cp ./dummy s3://bucketname/${count}
count=$(($count+1))
done
```
* GCS

```
#!/bin/bash
count=0
while :
do
echo $count
[[ count -eq 100 ]] && break
gsutil cp ./dummy gs://bucketname/${count}
count=$(($count+1))
done
```
---
##### **実行方法**
それぞれ、3 回繰り返します。

```
for i in 1 2 3
do
time ./upload
done
```
---
##### **結果**
|        |       1 回目 |    2 回目    |    3 回目    |
|:-----------------|:------------------:|:------------------:|:------------------:|
|S3|3m37.910s|3m36.647s|3m35.076s|
|GCS|1m41.030s|1m39.567s|1m38.644s|

本検証方法では、アップロードにかかる時間は S3 > GCS となりました。

しかしながら、awscli, gsutil は、実行時に本検証とは関連のないモジュールの読み込みや処理を行っている可能性もあるため、次回は、できるだけそのような差異が出ないよう、SDK (Golang) を用いて必要最低限の API をコールする形で同様の検証を実施してみたいと思います。
CarrierWaveの使い方【Gem】

CarrierWaveの使い方を調べたのでまとめる。この記事ではアップロードから表示までをやっている。

imagemagickが必要なのでインストールする。
`$ brew install imagemagick`

新しいプロジェクトを作成。
`$ rails new uploader`
`$ cd uploader`

Gemfileに追記。

```:Gemfile
gem 'carrierwave'
```
`$ bundle install`

scaffoldを作成。
`$ rails g scaffold user name:string password:string`

`$ rails g uploader Avatar`

データベースを作成、マイグレーション。
`$ rails g migration add_avatar_to_users avatar:string`
`$ rake db:create db:migrate`

以下を追記。

```app/models/user.rb
class User < ActiveRecord::Base
  mount_uploader :avatar, AvatarUploader
end
```

アップロード画面。

```app/views/users/_form.html.erb
  <div class="field">
  <%= form.label :avatar %><br>
  <%= form.file_field :avatar %>
  </div>
```

画像を表示。

```app/views/users/show.html.erb
<p>
  <strong>Image:</strong>
  <%= image_tag @user.avatar %>
</p>
```

サーバーを立ち上げる。
`$ rails s`

アップロードと表示が可能になっている。
SSRS

# SSRS

SSRSとはなんぞや？から始める。

以下を参照
https://docs.microsoft.com/ja-jp/sql/reporting-services/create-deploy-and-manage-mobile-and-paginated-reports


- SSRS：SQL Server Reporting Servicesの略<br>

- レポート(帳票)をいい感じに作成・発行管理し、Webブラウザやモバイルデバイスで見せてくれるもの。


特に気になったのは以下の点

### ページ分割されたレポート
- PDFファイルやWordのように印刷用に最適化した固定レイアウトでのドキュメントの生成に最適。<br>

- PowerPointなどの新しい形式にエクスポート出来る。単なるスクリーンショットではなく、ライブ表示で編集可能。
→これExcel出力も出来るかな。<br><br>

- レポートのビジュアルをPowerBIダッシュボードにピン留めすることが出来る。その後はPowerBIダッシュボードだけですべての情報を監視できる。
→今回PowerBIも使う予定なのでこれはいいかもー(*'▽')

次はここを参照。
https://docs.microsoft.com/ja-jp/sql/reporting-services/install-windows/install-reporting-services
【備忘録】mac + homebrew + rbenv環境でRubyのバージョンアップ

現時点でのRuby最新バージョンの2.4.2をインストールしようと思ったけどすんなりいかなかったのでメモ

### アップデートが必要そうな物を探す
`$ brew list`

### rbenvとruby-buildなるものが入っていたのでこれをアップデートしてみる
`$ brew upgrade ruby-build`
`$ brew upgrade rbenv`

これでrbenvのインストール可能バージョン一覧を見てみる

```
$ rbenv install -l
  ~ 長いので省略 ~
  2.4.0-preview3
  2.4.0-rc1
  2.4.0
  2.4.1
  2.4.2
  2.5.0-dev
  jruby-1.5.6
  jruby-1.6.3
  jruby-1.6.4
  jruby-1.6.5
  ~ 長いので省略 ~
```
2.4.2ある！

### 早速インストールしようとするもエラー

```
$ rbenv install 2.4.2

ruby-build: use openssl from homebrew
Downloading ruby-2.4.2.tar.bz2...
-> https://cache.ruby-lang.org/pub/ruby/2.4/ruby-2.4.2.tar.bz2
Installing ruby-2.4.2...
ruby-build: use readline from homebrew

BUILD FAILED (OS X 10.12.6 using ruby-build 20170914)

Inspect or clean up the working tree at /var/folders/hh/p59ptnqj2ql7hkscht2mzk140000gn/T/ruby-build.20170930225056.10580
Results logged to /var/folders/hh/p59ptnqj2ql7hkscht2mzk140000gn/T/ruby-build.20170930225056.10580.log

Last 10 log lines:
Generating RDoc documentation
dyld: lazy symbol binding failed: Symbol not found: _utimensat
  Referenced from: /private/var/folders/hh/p59ptnqj2ql7hkscht2mzk140000gn/T/ruby-build.20170930225056.10580/ruby-2.4.2/./ruby
  Expected in: /usr/lib/libSystem.B.dylib

dyld: Symbol not found: _utimensat
  Referenced from: /private/var/folders/hh/p59ptnqj2ql7hkscht2mzk140000gn/T/ruby-build.20170930225056.10580/ruby-2.4.2/./ruby
  Expected in: /usr/lib/libSystem.B.dylib

make: *** [rdoc] Abort trap: 6
```

### xcode-selectをインストールで解決
`$ xcode-select --install`
`$ rbenv install 2.4.2`

これでインストール成功
【MSSQL】SQL Server で知ってるとちょっと便利なこと

何かとクセのあるMSSQL(Microsoft SQL Server)も便利だなと思う機能があります。
よく使うものを紹介します。

## 実行
- 普通クエリを実行するときは画像青枠内の実行を選択します
- ![3.PNG](https://qiita-image-store.s3.amazonaws.com/0/77327/1f85523f-f29b-28bc-8207-080f22f912a5.png)
- が、意外とめんどくさいので、このときは以下のショートカットを使います
    - `Alt + X`


## 編集適用
- 「上位200行の編集」という機能があります
- ただ、編集した後の適用がいまいちわからないときには以下のショートカットキーを使います
    - `Ctrl + R`

## DB、テーブル名、の参照
- クエリを作成中にDBやテーブル名を途中まで打つとナビゲーションが出てきます
- ただそれさえも面倒なときは以下を試してください
    - 左ペインのツリーからお求めのDBもしくはテーブルをクエリ文までDrag and Drop!
- 何も打つことなく、DBやテーブルを指定できます 

※上記を知っているだけで曲者のSQL Serverの操作が少し楽になります
opencv3でパノラマ画像を作成する

## はじめに
去年の12月に大学のアドベントカレンダーにパノラマ画像を作成する方法を書きました。
当時はOpenCV2系で開発していましたが、OpenCV3でも取り組んでみようと思いやってみました。
前回はSURFとホモグラフィを組み合わせて行いましたが、今回はstitchingにて取り組んでみました。
## 開発環境
- MacBook Pro(Retina, 13-inch, Early 2015)
- macOS Sierra
- Xcode9.0
- OpenCV3.3

## 方法
OpenCVにはStitcherクラスが用意されており、これを用いいることで簡易に複数枚の画像からパノラマ画像を合成することが出来ます。
しかしながら、処理時間は少しかかってしまうところが難点ですね。

1. 原画像の読み込み
2. 複数の画像からなる配列を作成
3. Stitcherクラスのインスタントstatusを作成
4. status.stitch()関数にて、画像配列から合成画像を作成

今回は、以下の３枚の画像を合成し、一枚の画像を出力したいと思います。

| A | B | C |
|:-:|:-:|:-:|
| ![1.png](https://qiita-image-store.s3.amazonaws.com/0/50627/eef3164d-a4ad-86f5-a98b-cf8c6e79b237.png)  | ![2.png](https://qiita-image-store.s3.amazonaws.com/0/50627/313e9517-a7a6-5a0a-69dd-933e4b99101f.png)  |  ![3.png](https://qiita-image-store.s3.amazonaws.com/0/50627/9e429727-82f7-a0a1-b9de-bd9369988943.png) |

接写気味で撮影したBRAVIAのリモコンです。
業務で高さ9cmほどに設置したカメラから３枚画像を撮影し、合成する必要があるためこのケースに近いかたちで写真を撮影しました。
(画像の解像度は450×600です。)


```cpp:panorama.cpp
#include "opencv2/core/core.hpp"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/stitching.hpp"
#include <iostream>

int main(int argc, const char * argv[]) {
    
    // load image
    cv::UMat Source1;
    cv::imread("A.png", CV_LOAD_IMAGE_COLOR).copyTo(Source1);

    // load image check
    if (Source1.empty()) {
        std::cout << "Failed to open Source image1" << std::endl;
    }
    
    // load image
    cv::UMat Source2;
    cv::imread("B.png", CV_LOAD_IMAGE_COLOR).copyTo(Source2);
    
    // load image check
    if (Source2.empty()) {
        std::cout << "Failed to open Source image2" << std::endl;
    }
    
    // load image
    cv::UMat Source3;
    cv::imread("C.png", CV_LOAD_IMAGE_COLOR).copyTo(Source3);
    
    // load image check
    if (Source3.empty()) {
        std::cout << "Failed to open Source image2" << std::endl;
    }
    
    // Create image array
    std::vector<cv::UMat> Sources;
    Sources.push_back(Source1);
    Sources.push_back(Source2);
    Sources.push_back(Source3);
    
    // Create Panorama image
    cv::Stitcher stitcher = cv::Stitcher::createDefault();
    // output image
    cv::UMat destination;
    // image synthesis
    cv::Stitcher::Status status = stitcher.stitch(Sources, destination);
    if (status != cv::Stitcher::OK) {
        std::cout << "failed to stitch images" << std::endl;
    }
    // Export image
    cv::imwrite("output.png", destination);
}
```
UMatにて処理を行いましたが、Matでも行えます。


## 結果
以下が出力画像になります。
![destination.png](https://qiita-image-store.s3.amazonaws.com/0/50627/2e8d944d-9782-7dce-ad59-20f25ff9102f.png)
概ね綺麗に画像合成出来ているかと思います。
画像が両端に行くに連れ歪んでいることは、撮影対象物とカメラとの距離が変わってしまっているからだと思います。
実行時間は、3.718秒でした。この程度であれば、自分の用途としては許容範囲内かと思っています。
Stitcherクラスを用いて、比較的簡単に画像合成ができることがわかりました。
次回はAKAZE等を用いて画像合成を行ってみたいと思います。


## 参考文献
[High level stitching API (Stitcher class)](http://docs.opencv.org/3.3.0/d8/d19/tutorial_stitcher.html "High level stitching API (Stitcher class)")
railsでbootstrap4をつかう。

twbs/bootstrap-sassではbootstrap3までしか使えない。

bootstrap4を使いたかったら
twbs/bootstrap-rubygem
を使う

###1
gemfileに
gem 'bootstrap', '~> 4.0.0.beta'
gem 'jquery-rails'(rails5の時のみ)
でbundle install

###2
mv app/assets/stylesheets/application.css app/assets/stylesheets/application.scss
でファイル名を変えて、

###3
```
 # app/assets/stylesheets/application.scss
@import "bootstrap";
```
と記述。その際 *= require and *= require_treeをすべて削除。
```
 # application.js
//= require jquery3
//= require popper
```
bootstrap4最高！！！
IISマネージャーユーザーで作成したアカウントを用いてVisualStudioから発行する

##はじめに
「WebDeployを使用してVisual Studioから発行する」の記事の続きとして書いています
前回は「発行の有効化」設定で、ユーザーにサーバーのWindowsローカルアカウントを指定しましたが、IISでのみ有効なアカウントを作成し、「発行の有効化」設定で指定することができます。
ここでは設定の手順をまとめます。

##手順
##WindowsServer2008R2環境設定

1. 管理サービスの設定を変更する
    1. 管理 -> 管理サービスの資格情報の識別を「Windows資格情報またはIISマネージャー資格情報」に変更する  
    ![009_01.PNG](https://qiita-image-store.s3.amazonaws.com/0/193740/0d874fc7-b138-3d00-7b86-cdb7f3f95d1e.png)


1. IISマネージャーユーザーを作成する
    1. 管理 -> IISマネージャーユーザーでユーザーの追加を選択する
    1. ユーザー名とパスワードを入力し、OKボタンを押下  
    画像ではユーザ名「webdeploy」  
    ![010.PNG](https://qiita-image-store.s3.amazonaws.com/0/193740/72233451-ca63-9706-57a9-fddcbaa73b97.png)

1. IISマネージャーのアクセス許可を設定する
    1. 管理 -> IIS マネージャーのアクセス許可でユーザーの許可を選択する
    1. IISマネージャーから2.2で作成したIISマネージャーユーザーを選択する  
    ![011.PNG](https://qiita-image-store.s3.amazonaws.com/0/193740/308a2d6a-fcfc-6897-f2ef-5d9e2fd5be57.png)


1. 発行の有効化を設定する
    前回と異なる所は以下の点です
    - 「発行アクセス許可を付与するユーザーを選択します」の項目を2.2.で作成したユーザーを指定する  
    ![012_01.PNG](https://qiita-image-store.s3.amazonaws.com/0/193740/f66843ab-5a08-62ba-0aba-6b357f206b75.png)


##VisualStudio2017(Windows10環境)操作手順
1. Visual Studioから発行する  
    前回と異なる所は以下の点です  
    - 発行の設定のユーザー名とパスワードを2.2.で作成したユーザーを指定する   
    ![013_01.PNG](https://qiita-image-store.s3.amazonaws.com/0/193740/d06ac8e5-11d8-18df-d0cf-4122bdbd2d5d.png)
iTerm2のSolarizedカラーテーマ使用時にmochaの実行結果が見えない問題はコントラスト調整で解決する

# 問題

iTerm2のカラーテーマとしてSolarizedを使用している環境で、Node.jsのテストフレームワークであるmochaを実行すると、以下のスクリーンショットのように一部の結果が見えない(チェックマークが付いている行に本来はテキストがある)

<img width="857" alt="Screen Shot 2017-09-30 at 22.35.48.png" src="https://qiita-image-store.s3.amazonaws.com/0/3966/fc4ba196-6631-3181-7e26-27abac897212.png">

# 解決方法

iTerm2のPreferences -> Profileタブ -> Colorsを開き、Minimum contrastを調整することで視認できるようになる。

<img width="1030" alt="Screen Shot 2017-09-30 at 22.43.12.png" src="https://qiita-image-store.s3.amazonaws.com/0/3966/7efcdbbb-98dd-311e-6f0c-45db1017d3af.png">

上のスクリーンショットのように調整すると、

<img width="857" alt="Screen Shot 2017-09-30 at 22.35.10.png" src="https://qiita-image-store.s3.amazonaws.com/0/3966/4cc5ddc5-099d-2a46-662f-1a7f6a264b11.png">

このようにテキストが視認できるようになる。

# リンク

* [Solarized - Ethan Schoonover](http://ethanschoonover.com/solarized)
* [Much of the color output is invisible with solarized terminal theme #802](https://github.com/mochajs/mocha/issues/802)
WebDeployを使用してVisual Studioから発行する

#はじめに
WebDeployを利用してVisualStudio2017から発行を行い、WindowsServer2008R2で作成したサイトの物理パスに直接ファイルを配置する手順を説明します

#手順
##WindowsServer2008R2環境設定
1. 役割サービスの追加から以下の項目をインストールする  
    - 管理ツール
        - 管理サービス

1. リモート接続の有効設定をする
    1. 管理 -> 管理サービスの「リモート接続を有効にする」にチェックの状態にする
    2. 管理サービスを開始の状態にする  
    ![003_01.PNG](https://qiita-image-store.s3.amazonaws.com/0/193740/797a21c1-e8f3-6e50-e1a6-ad81c3874e9b.png)

1. WebDeploy3.6をインストールする
    1. Web Platform Installer5.0をインストールする
        - Web Platform Installerを使用すると依存関係のあるソフトウェアをまとめてインストールできます  

    1. Web Platform Installerを利用してWebDeploy3.6をインストールする
        - インストールすると関連製品がまとめてインストールされる  
        ![003_02.PNG](https://qiita-image-store.s3.amazonaws.com/0/193740/ed8051e6-d282-6726-cd97-4e31da5d6a1f.png)

1. 発行の有効化を設定する
    1. サイトを右クリック -> 展開 -> web配置による発行の有効化 を選択する
    1. 設定ボタンを押下する  
    ![004_01.png](https://qiita-image-store.s3.amazonaws.com/0/193740/eec5230f-5054-b361-9527-3d7fc8dc56d2.png)


## VisualStudio2017(Windows10環境)操作手順

1. 発行のプロファイルを作成する
    1. プロジェクト名を右クリックして発行を選択する
    ![005_01.png](https://qiita-image-store.s3.amazonaws.com/0/193740/c018940c-a02a-123b-e1c2-e3e798fa176e.png)

    1. 「IIS、FTP、その他」項目を選択し、「発行」ボタンを押下する  
        ![006.png](https://qiita-image-store.s3.amazonaws.com/0/193740/1bad60ea-a066-58f1-4cce-bdb1ec7af57e.png)

    1. 発行の設定を入力する
        - 発行方法：Web Deploy
        - サーバー：「Web配置による発行の有効化」設定の「発行サーバーに接続するためのURLを指定します」項目
        - サイト名：作成したサイト名
        - ユーザー：「Web配置による発行の有効化」設定の「発行アクセス許可を付与するユーザーを選択します」項目のユーザー名  
        画像では「PC名\Administrator」
        - パスワード：上記ユーザーのパスワード  
    1. 「接続の検証」ボタンで接続できるか確認する
    1. 「次へ」ボタンを押下する  
        ![007_01.PNG](https://qiita-image-store.s3.amazonaws.com/0/193740/ea75b858-b27e-acc1-cfab-13e3fd00c2bc.png)

    1. 構成は「Release」を指定  
    1. 「保存」ボタンを押下する

1. 発行の実行
    1. 1.の設定が終わった時点で発行が行われ、結果が出力に表示される  
        正常に発行が行われれば、IISのサイト作成時に指定した物理パスにファイルが格納される  
    1. 再び発行を行う場合には「発行」ボタンを押下する  
    ![008_01.PNG](https://qiita-image-store.s3.amazonaws.com/0/193740/f9e01ab7-5e08-d4ae-0efd-209b7548503f.png)
git管理対象の全ファイルの文字コードを変換する

この例では、utf-8からcp932に変換しています。
[Git for Windows](https://git-for-windows.github.io/)が提供する`Git Bash`で動作確認しました。

```bash
git ls-files | xargs -I {} sh -c "echo {}; mv {} {}.tmp; iconv -f utf-8 -t cp932 {}.tmp > {}; rm {}.tmp"
```
ステレオカメラの領域にも深層学習が及んできている

ステレオカメラの領域にも深層学習が及んできている。

ヒトは、過去の経験を元に、単眼でも空間的な奥行きはこんなのではなかろうかと推測できる。

それが深層学習で、単眼のカメラからの奥行きの推定に及んできている。

- SlideShare [Depth estimation using deep learning]
(https://www.slideshare.net/SoubhiHadri/depth-estimation-using-deep-learning)


- qiita [誰でもできる深度推定 ~Depth Map Prediction in TensorFlow from beginning to end~]
(https://qiita.com/MasazI/items/67724fc676040bd490c4)


- qiita [[Survey]Depth Map Prediction from a Single Image using a Multi-Scale Deep Network]
(https://qiita.com/supersaiakujin/items/5fbac19a47a93f89b85c)


- Youtube [Semi-Supervised Deep Learning for Monocular Depth Map Prediction | Spotlight 2-1A]
(https://www.youtube.com/watch?v=KpJRSJx5yKs)


- Youtube [Unsupervised Monocular Depth Estimation With Left-Right Consistency]
(https://www.youtube.com/watch?v=jI1Qf7zMeIs)

- pdf [Real-Time Depth Estimation from 2D]
(http://cs231n.stanford.edu/reports/2016/pdfs/407_Report.pdf)

- [CNNとdepth推定を用いたオドメトリの算出 前編(CNN SLAM #1)](https://qiita.com/slowsingle/items/a3e8bb77b34e8f52a287)


- [Introducing OAK: Spatial AI Powered by OpenCV](https://opencv.org/introducing-oak-spatial-ai-powered-by-opencv/)
以下のHWに対応するライブラリが提供される予定らしい。
![](https://opencv.org/wp-content/uploads/2020/06/OAK-and-OAK-D-with-quarter-draft-w-gfx.jpg)

- [OpenCV Spatial AI Competition sponsored by Intel](https://opencv.org/opencv-spatial-ai-competition/)




## 追記：奥行きの推定についての仮説
### Q:ヒトは密に視差を求めているだろうか？
### 仮説：ヒトは密に視差を求めてはいない。私はそう考える。
### 理由：
- 左右のそれぞれの眼球からの画像は、交差して右左のの脳半球に届けられる。
- ステレオカメラの密に視差を求めるためには、密にテンプレートマッチングを必要とする。
- 脳半球を脳梁がつないでいるといっても、密にテンプレートマッチングできるほどの情報を共有させることができるとは、私には思えない。
### 推定：
視差は求めているが、明瞭な特徴点についてだけしか実施していないのではなかろうか。
それ以外の奥行きの推定は、最近流行りのDNNによる奥行き推定のようなやりかたをしているのではなかろうか。　



---
追記(2023.09.30)
Luxonis OAK-D Depth AIカメラが国内でも購入可能になっている。
[Luxonis OAK-D Depth AIカメラ]
(https://www.switch-science.com/products/7222)
![](https://www.switch-science.com/cdn/shop/products/3bfcd2bb-9ae3-4ede-898d-f02c9df37062_540x540.jpg?v=1691118317)
![Screenshot from 2023-09-30 20-59-36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83761/00fe11f4-e6e1-aa38-c2d7-8f5f925f1607.png)


https://www.luxonis.com/


追記（2023年12月）
NVIDIAのデバイスが利用可能ならば
[Stereo Depth DNN](https://docs.nvidia.com/isaac/archive/2020.1/packages/stereo_depth/doc/sddnn.html)
の記事を読んでほしい。
この中でNVIDIAのデバイスでのStereo Depth DNNの使い方が書いてある。

追記
以下の場所に最近の実装であるIGEVに対する移植がある。
GitHUb [libIGEVStereo](https://github.com/katsunori-waragai/libIGEVStereo)

---


---
参考情報
次の方が、Stereo Depth関係の記事を大量に書いてくださっている。

https://qiita.com/minh33
IISを利用してWEBサイトを公開する

#はじめに
WindowsServer2008R2環境のIISを利用してWEBサイトを公開する手順をまとめます
これはとりあえずWEBサイトを公開した状態にすることが目的であり、設定が十分であるかは考慮していません。
WEBサイトは文字列を表示するだけなものを前提としています。

# 1.IISでWEBサイトを公開する
ここでは事前に発行したWebアプリケーションのファイルが用意できている場合に、IISでWEBサイトを公開するまでの手順を説明します。

1. 役割の追加からWEBサーバー（IIS）をインストールする
1. 役割サービスの追加から以下の項目をインストールする  
項目はIISインストール時にデフォルトでチェックがついている項目です
    - HTTP基本機能
        - 静的なコンテンツ
        - 既定のドキュメント
        - ディレクトリの参照
        - HTTPエラー
    - 状態と診断
        - HTTPログ
        - 要求の監視
    - セキュリティ
        - 要求フィルター
    - パフォーマンス
        - 静的なコンテンツの圧縮
    - 管理ツール
        - IIS管理コンソール
    
    ※ WEBサイト構築に不要な役割がある可能性があります

1. IISにサイトを追加する
    1. 「サイト」を右クリックして「Webサイトの追加」を選択する
    1. 「サイト名」「コンテンツディレクトリ - 物理パス」を入力する  
    今回はサイト名を「minimum」とした  
    ![001.png](https://qiita-image-store.s3.amazonaws.com/0/193740/37d8d1d4-e7e9-754c-6bbe-4f9138c50336.png)

1. .NET Frameworkバージョンの変更する （アプリケーションプール）
    1. 作成したサイトのアプリケーションプールを選択し、.NET Frameworkバージョンを「v4.0.30319」に変更する  
    ![002.png](https://qiita-image-store.s3.amazonaws.com/0/193740/e9e88390-f52a-7d14-e5cb-52d33bbe9d7d.png)


1. 発行したファイルをフォルダに格納する
    1.  1.3.2.で指定した物理パスのフォルダに、事前に発行したファイルを格納する

1. サイトを開始する
    1. IISマネージャーの「Webサイトの管理」から開始する

以上で設定終了です

表示するファイルが「pagefirst.aspx」であれば
ブラウザからhttp://IPアドレス/pagefirst.aspx 
(ローカル環境ならhttp://localhost/pagefirst.aspx) で表示できます

# 2.Visual StudioでWebサイトを発行する</a>
ここではVisualStudio2017の環境でWebアプリケーションを発行する手順を説明します。

1. ソリューションエクスプローラーのプロジェクト名を右クリックし、発行を選択する
![005_01.png](https://qiita-image-store.s3.amazonaws.com/0/193740/ec1416be-8cee-8ee8-b365-77514ffabb0f.png)

2. 「フォルダー」を選択し、出力先のフォルダーを指定する
![101.PNG](https://qiita-image-store.s3.amazonaws.com/0/193740/6ea8cda9-3034-b3c2-f212-b2c438610639.png)

3. 発行ボタンを押下すると、発行が実行されて出力先にファイルが生成される
また、FolderProfile.pubxmlというプロファイルが作成され、発行時の設定が保存される
![102.PNG](https://qiita-image-store.s3.amazonaws.com/0/193740/8340cd77-85d2-aad5-754c-ed6c0981f06f.png)
JavaScriptとデータの操作 (IMMUTABLE)

永続的な不変のデータ構造を集めたライブラリです。V8などのエンジンに最適化されている。
Facebook製でMIT-licensed。[アレ](https://www.google.co.jp/search?q=facebook+react+license)でライセンスがMITになりました。

ところで永続的な不変のデータ構造で何をするのか？何が便利なのか？という疑問を持つ人は多いと思います。
JavaScriptは扱いやすく柔軟です。
ES2015の登場とbabelの存在で`var`から`let` `const`の利用が推奨されるようになりました。
再宣言や再代入不可と表現されます。

しかし`const`は宣言後オブジェクトに限り再割り当てを許します。
宣言後の値の変更・再割り当ては[airbnb](https://github.com/airbnb)で禁止されており`no-param-reassign`があります。
[no-param-reassignについての議論](https://github.com/airbnb/javascript/issues/641)よりV8はじめ多くのエンジンで最適化が行われないという記述があります。

## 例えば

![2017-09-30_22-11-50.png](https://qiita-image-store.s3.amazonaws.com/0/190699/e0b5b5dc-8703-264f-7f8d-8cc3ab1fc551.png)


* `Record`は新しくClassインスタンスを生成します。
    * 画像通りJavaScriptのObjectを記述します。
    * 記述したものを初期値として認識する。

* `DataRecord`で新しいインスタンスを生成します
    * 赤色の点線はflowに怒られている様子です。(v4.0.0-rc.1でflowとtypescriptの型定義を改善されたので悪いソースは怒られます)
    * Variablesを見ると`a, b`の値のみ存在します。(元のRecordのインスタンス生成時に定義されなかった値は全て無視されます)
    * [List](https://facebook.github.io/immutable-js/docs/#/List)のmethodが利用できます。


## 他の使い方
学生やハッカソンでも同様に授業などで強制された外部のapi叩いたときに要らない値を削ぎ落とすこともできますし、
素直に使うと期待するデータを明示することができてソースの可読性良くなりそうですね。
Delphi で Shell Open を叩く

# Shell Open

2022/04/26 追記
↓この記事もご覧ください

https://qiita.com/pik/items/16480b6f12f364d1e649

Delphi は GUI アプリのみならず当然ながら CUI のコンソールアプリケーションも作れます。
このときに OS の open コマンドを叩けると便利ですよね。
例えば、.html ファイルを open に渡せば関連付いたウェブブラウザが開くといった具合です。

open コマンドは Windows の場合は SehllExecute を、POSIX の場合は _system コマンドで叩けます。

具体的なコードは下記の通りです。

```Delphi:OpenCommand.pas
uses
  System.SysUtils

  {$IFDEF MSWINDOWS}
  , Winapi.Windows
  , Winapi.ShellAPI
  {$ENDIF}

  {$IFDEF POSIX}
  , Posix.Stdlib
  {$ENDIF POSIX}  ;

procedure ShellOpen(const iCmd: String);
{$IFDEF POSIX}
var
  M: TMarshaller;
{$ENDIF POSIX}
begin
  {$IFDEF MSWINDOWS}
  ShellExecute(0, 'open', PChar(iCmd), nil, nil, SW_SHOWNORMAL);
  {$ENDIF MSWINDOWS}
  {$IFDEF POSIX}
  _system(M.AsAnsi('open ' + iCmd).ToPointer);
  {$ENDIF POSIX}
end;
```

コレを使うと…

```delphi
procedure OpenGoogle;
begin
  ShellOpen('http://google.co.jp/');
end;
```

こんな感じで自動的に関連付いたブラウザが起動します。
デフォルトの場合 Windows では IE か Edge が、macOS の場合は Safari が開きます。

小ネタでした！
github issue がエラー全文載せなどで長くなって読みづらくなる時は<details>タグが便利

github の issue 機能は便利ですが、一つの issue の文字数が多くなると、大事な情報を見落としてしまいがちです。特にエラーやバグの issue を立てる際に、エラーの全文を載せたり、画像を何枚も貼って行く読みづらくなっていくと思います。

# HTML タグの `<details>` を使って、表示データを隠す
github issue 内では、HTML のタグを利用することもできます。[github で使える html タグ一覧](https://github.com/jch/html-pipeline/blob/master/lib/html/pipeline/sanitization_filter.rb#L42-L44)
以下のように書くことで、`<details>` 内の項目は `<summary>` の文言をクリックしない限り表示されません。(`<summary>` は`<details>`を展開する前に表示される文言)

```
<details>
<summary>エラー内容</summary>
とても長いエラー内容
とても長いエラー内容
とても長いエラー内容
...
</details>
```

## デモ： qiita のマークアップでも `<details>` を利用してみる
(*Internet Explorer などでは動かない~~可能性があります~~　追記： コメント欄で報告をいただきましたが Windows8.1+IE11 では動かないようです。)
<details>
<summary>エラー内容</summary>
とても長いエラー内容
とても長いエラー内容
とても長いエラー内容
...
</details>
↑ `エラー内容` をクリックすると展開されます。

# 注意
`<details>` 要素を使えるブラウザーが限られており、Internet Explorer や Edge では~~表示そのものが消えてしまう可能性があるので~~注意が必要です（自分の環境で試せてないので真偽は不明です。誰か検証していただけると　追記： コメント欄で報告いただきましたが、消えるのではなく、最初から表示されているようです。）。
https://developer.mozilla.org/ja/docs/Web/HTML/Element/details

利用できるブラウザでは以下の gif 画像のように表示されます。(IEなどで見れない方向け)
[record6.gif](https://qiita-image-store.s3.amazonaws.com/0/26095/87a6fa57-cf18-d6e6-db7e-6cc6291ebf95.gif)

# 補足
すでに qiita の [Markdown記法 チートシート](https://qiita.com/Qiita/items/c686397e4a0f4f11683d#details---%E6%8A%98%E3%82%8A%E3%81%9F%E3%81%9F%E3%81%BF) の項目にも`<details>`について書かれていますが、最近この機能を知って便利だったので、啓蒙活動的な意味合いも込めて投稿した次第です。
jestのautomockをimport/export記法で使う

# jestとは
facebookが作ったテストフレームワークです。
automockという特殊な機能を持っていて、すべてのモジュールがモック化された状態でロードされます。
今回は、automockの使い方を書いておきます。

# automockを使ったテストの書き方
まずは、jest用のconfigファイルを用意します。
package.jsonか、適当なjsonファイルに記述することができます。
package.jsonに書く場合は以下のとおり。
 
```json:package.json
{
  ...dependenciesとかなんかいろいろな設定
  "jest": {
    "automock": true
  }
}
```

package.jsonに記載する場合は特になにも指定しなくても勝手に読み込んでくれます。
適当な設定ファイルに書く場合は以下のとおり。

```json:jest.config.json
{
  "automock": true
}
```

実行する際には`jest --config ./jest.config.json`という感じでファイルを指定する必要があります。

# automockの威力
`automock`をオンにすると、テストコードで読み込むモジュールはすべてモック化されています。
あと、ここでは`automock`以外の話はあんまり書きません。(`__test__`というフォルダにテストコードを置く、とか。)

```js:module.js
export function add(x, y) {
  return x + y;
}
```
```js:__test__/module.test.js
import { add } from "../module";

describe("module", () => {
  describe("#add", () => {
    it("足し算した結果を返すこと。", () => {
      expect(add(2, 3)).toBe(5);
    })
  });
});
```

さて上記のようなコードがあった時、関数addのテストが行われると思ったでしょう。
ところがどっこい、addは`undefined`を返すので、テストはエラーになってしまいます。
理由は、`automock`はすべてのモジュールをモック化するからです。
正確には、addという関数は、`jest.fn()`で生成されるモック関数となっており、どんな呼び出しをしても`undefined`を返すようになってしまっています。

# automockの状態でテストをする方法
以下のような記述でテストができます。
モジュールのロードの方法によってテストの仕方が異なりますので、注意してください。

## requireをつかう
まずは`require`を使う方法から。

```js:__test__/module.test.js
jest.dontMock("../module");
const module = require("../module");

expect(module.add(2, 3)).toBe(5);
```
`module.js`内部で別のモジュールを利用している場合は、それも`jest.dontMock`してあげればよいです。

```js:__test__/module.test.js
jest.dontMock("../module");
jest.dontMock("../dependentModule");
const module = require("../module");

expect(module.pow(2, 3)).toBe(8);
```

## import/export
### import/exportの問題点
こちらが本題です。
jestでは、テストコード、モジュールの実行時にはbabelによるコードのトランスパイルが行われ、それを元にテストが実行されます。
(したがって、.babelrcの設定が使用されますし、importを利用したい場合はbabel-preset-es2017が必要になります)
そこで、以下のようなコードを書いてみるとどうなるでしょうか。

```js:__test__/module.test.js
jest.dontMock("../module");
import { add } from "../module";

expect(add(2, 3)).toBe(5);
```

これは、ざっくり書くと、以下のように変換されるらしいのです。

```js:trans/__test__/module.test.js
var add = require("../module").add;
jest.dontMock("../module");

expect...
```

要は、モジュールの読み込みよりも`jest.dontMock`が後に実行されてしまうため、手遅れなのです。

### 対策
以下のように記述することで、require記法を回避することができます。

```js:__test__/module.test.js
import { add } from "../module";
jest.unmock("../module");

expect...
```

これで、`module.js`以外のモジュールはモック化された状態でテストすることができるようになりました。
あとは好きにテストを書きましょう。
Delphi の Android Log を正しく表示する

# Delphi の Log

## Log.d が Info で出力される
Delphi では FMX.Types に Log クラスが定義され、そこにメソッドがいくつか定義されています。
最終的には下記のメソッドが呼ばれて IFMXLoggingService の Log メソッドが呼ばれます。

```delphi
class procedure Log.d(const Fmt: string; const Args: array of const);
begin
  if Logger <> nil then
    IFMXLoggingService(Logger).Log(Fmt, Args);
end;
```

ですが！
Delphi Android が出力する Log レベルがおかしいのです。
というのは、Log.d というメソッド名であるならば Debug レベルで出力しないといけないのに、Log レベルが Info で出てきます。
これは、FMX.Platform.Logger.Android.pas で、

```Delphi:FMX.Platform.Logger.Android.pas
procedure TAndroidLoggerService.Log(const AFormat: string; const Params: array of const);
begin
  // (中略)
  LOGI(M.AsUtf8(Msg).ToPointer);
end;
```

となっており、LOGI を呼んでいるからです。
ADB のログを見ても Info レベルになってしまうので非常に気持ち悪い！

そこで、Debug レベルで出力する方法を紹介します。

## Debug レベルで出力する

Androidapi.Log.pas に __android_log_write が定義されているので、コレを使います。
具体的には

```Delphi
uses
  System.SysUtils,
  Androidapi.Log;

class procedure Log.d(const iMsg: String);
var
  M: TMarshaller;
begin
  __android_log_write(
    android_LogPriority.ANDROID_LOG_DEBUG,
    M.AsUtf8('TAG').ToPointer,
    M.AsUtf8(iMsg).ToPointer);
end;
```

こんな感じです。

## __android_log_write について
第一引数の

```Delphi
android_LogPriority.ANDROID_LOG_DEBUG
````

で、DEBUG レベルを指定しています。
ここには、

```Delphi
type
  android_LogPriority = (
    ANDROID_LOG_UNKNOWN,
    ANDROID_LOG_DEFAULT,
    ANDROID_LOG_VERBOSE,
    ANDROID_LOG_DEBUG,
    ANDROID_LOG_INFO,
    ANDROID_LOG_WARN,
    ANDROID_LOG_ERROR,
    ANDROID_LOG_FATAL,
    ANDROID_LOG_SILENT
 );
```

が定義されているので使いたいレベルを指定します。

第二引数は TAG です。
ここは任意の文字列ですが、プロジェクト名だったり、ロググループを表す文字列にすると良いと思います。
（Log を表示する側でフィルタリングできるため）

第三引数が、表示するメッセージです。

## TMarshaller

ここで、第２，３引数には M.AsUtf8 というモノがついています。
これは TMarshaller の提供する文字列変換メソッドです。

Android は文字コードを UTF8 として扱うので、Delphi の文字列を UTF8 に変換しなければなりません。
そこで、TMarshaller を使って変更しています。
ただ、TMarshaller が返してくる値はメモリ上の値（TPtrWrapper）なので、ToPointer メソッドでポインタ値を渡してやります。

なお、マーシャリングとは [ASCII デジタル用語辞典](http://yougo.ascii.jp/caltar/%E3%83%9E%E3%83%BC%E3%82%B7%E3%83%A3%E3%83%AA%E3%83%B3%E3%82%B0)によると

> 異なる2つのシステム間で、データを交換できるようにデータを操作する処理

とあります。
つまり、今回の場合は Delphi の文字列を Android が扱う UTF8 に変換した、ということです。

## まとめ
これらをまとめて、Windows, macOS, Android, iOS で使えるようにした FMX.Log を公開しています。
コレを使うと、楽ちんです！

FMX.Log.pas - [https://bitbucket.org/JunHosokawa/fmx.log](https://bitbucket.org/JunHosokawa/fmx.log)
JavaScriptのオブジェクトの関数って何？って人に

JavaScriptを勉強しはじめて、JavaScriptのオブジェクトの関数って何ってなったのでいつでも思い出せるように書きます。

# オブジェクト

オブジェクト (object) とは、JavaScript における値の一のこと。
オブジェクトは、プロパティという、名前と値のセットを複数持つことができる。

```javascript:hoge.js
var hoge = {
    name: 'ホゲホゲ',
    age: 37
};
```
これは
name と age という 2 つのプロパティを持つオブジェクト作り、 hoge という変数に代入している。

呼びだし

```javascript
console.log(hoge.name);
console.log(hoge.age);
```

これで

```
ホゲホゲ
37
```

と表示される。
また
プロパティは変数と同じく、任意の値を代入、更新することができる
つまり

```javascript:
hoge.name = "ほげほげ"
console.log(hoge.name);
ほげほげ
```

となる。

# オブジェクトの関数
オブジェクトのプロパティに関数を設定できる。
例えば

```javascript:hoge.js
var hoge = {
    name: 'ホゲホゲ',
    age: 37,
    addage: function(){
        hoge.age++;
    }
};
```

下記を実行すると

```javascript
consele.log(hoge.age)
hoge.addage
console.log(hoge.age)
```

```
実行結果
37
38
```

となる。
これは、
`hoge.addage`
により、関数が実行され
`age`プロパティに1が足された。

なんかもっとこうだよってのがあれば、コメントください。
正規表現で「数字のみ以外の2文字以上の文字列」を抽出する

タイトルのことをやろうとしたら、同じことをやってる記事をWeb上で探せなかったのでメモ

【1月2日】や【5件】みたいなものを探したいけど、【123】みたいなものは無視したいときがあった。すなわち、【】の中の文字列(記号は除く)を取りたいけど、中身が数字だけだと困る、また、１文字だけだと困る、というピンポイントなことを考える機会があった。

まあまあ悩んで、下のような正規表現パターンを作ってやればいいという結論。(Pythonでかいてます)
    
    import re
    
    pat = re.compile(r'【\D\w+】|【\d\w*\D\w*】')

| の左側は、【】内の1文字目が数字以外の文字で、2文字目以降は、数字or文字の1文字以上を表す。
これだけだと1文字目が数字の【5件】などの場合に対応できないので、| の右側で、1文字目が数字だった場合のパターンを作っている。1文字目数字で、以降のどこかで数字以外の文字が入るが、それ以外は0字以上の数字or文字、というパターン。

使い所少ない&もっと良い方法はありそうだけど、とりあえずこれで問題なさそうなので書き留めておく。
Layer-wise Relevance Propagation を Chainer で実装する

#1. Layer-wise Relevance Propagation（LRP）

元論文は [これ](https://arxiv.org/abs/1604.00825) で、詳しいことは以下参照。



[Qiita:ディープラーニングの判断根拠を理解する手法](https://qiita.com/icoxfog417/items/8689f943fd1225e24358#33-%E5%87%BA%E5%8A%9B%E3%81%8B%E3%82%89%E5%85%A5%E5%8A%9B%E3%81%BE%E3%81%A7%E3%81%AE%E7%B5%8C%E8%B7%AF%E3%82%92%E9%80%86%E3%81%AB%E3%81%9F%E3%81%A9%E3%82%8Bdeconvolutionlrp)




私はLRPを

一度データを順伝搬させて、出力層から各層の出力と重みを元に貢献度を求めていく手法

だと理解しています。

 

#2. Chainer

国産のニューラルネットワーク用のフレームワークです。

一度、順伝搬させるとデータが数珠つなぎ的に残るので、個人的には使いやすくて好きです。

[Chainer: A flexible framework for neural networks](https://chainer.org/)

 

#3. 実装 (chainer v2.0.0)

Chainerは一度、順伝搬させるとデータと生成された層の種類を参照できるので、それを利用して実装しますバグなどがあるかもしれません。

下記のコードは最低限、線形結合と畳込み、プーリングのみに対応しています。
また、入力zのshapeは（データ数, 出力ニューロン数）を想定しています。


```python
import chainer
import numpy as np

def LRP(z, epsilon=0):
    creator = z.creator
    var = z
    # relevance value
    r = np.zeros(z.data.shape)
    for i, d in enumerate(z.data):
        r[i, d.argmax()] = d.max()

    while(creator is not None):
        x = creator.inputs[0].data
        y = creator.outputs[0]().data

        if len(creator.inputs) > 1:
            w = creator.inputs[1].data
        if creator.label == "LinearFunction":
            _y = y + epsilon*np.sign(y)
            r = x.reshape(r.shape[0], -1) * (np.dot(r/_y, w))
        elif creator.label == "Convolution2DFunction":
            _y = y + epsilon*np.sign(y)
            r = x * chainer.functions.deconvolution_2d(r.reshape(y.shape)/_y,
                                                       w).data
        elif creator.label == "MaxPooling2D":
            r = chainer.functions.unpooling_2d(
                r.reshape(y.shape),
                ksize=creator.kh,
                stride=creator.sy,
                outsize=x.shape[2:]).data

        var = creator.inputs[0]
        creator = var.creator
    return r

```

一応、出力層のデータが消えないように以下のhookを順伝搬の際に追加しました。

```python
from chainer.function import FunctionHook

class RetainOutputHook(FunctionHook):
    def forward_postprocess(self, function, in_data):
        function.retain_outputs([0])

''' Example
with RetainOutputHook():
    z = model.predict(x)
'''

```
# 4.出力例

下記のネットワーク（n_units=100）にMNISTを学習させて、入力に対するLRPを可視化しました。

```python
class CNN(chainer.Chain):
    def __init__(self, n_units):
        super(CNN, self).__init__()
        with self.init_scope():
            self.conv1 = chainer.links.Convolution2D(in_channels=1, out_channels=n_units//2, ksize=3, stride=1)
            self.conv2 = chainer.links.Convolution2D(in_channels=None, out_channels=n_units, ksize=3, stride=1)
            self.l = chainer.links.Linear(None, 10)

    def __call__(self, x):
        x = chainer.functions.relu(self.conv1(x))
        x = chainer.functions.max_pooling_2d(x, ksize=2, stride=2)
        x = chainer.functions.relu(self.conv2(x))
        x = chainer.functions.max_pooling_2d(x, ksize=2, stride=2)
        return self.l(x)
```



左：入力画像　右：LRP
![lrp.png](https://qiita-image-store.s3.amazonaws.com/0/141969/6fc09d5c-7c59-2ab2-6ad1-f9c90d6052f0.png)
Emacsでカーソル位置の相対パスのファイル名を他のバッファのディレクトリを基準に探して開く方法

相対パスのファイル名をコピペしたファイルが別ディレクトリにあっても、次の順序でがんばって探すので、ファイルが簡単に開けるようになります。

1. フルパスだったらそのまま開く
2. 現在のディレクトリを基準に探す
3. 現在のディレクトリから見て先祖のディレクトリに .git があればそのディレクトリからの相対パスとして探す
4. 直近で開いているバッファを順に切り替えながら、そのディレクトリを基準に 2 と 3 を試す

`dash` と `s` という便利ライブラリを利用しているので `M-x package-list-packages` からのインストールが必要です。

```elisp
(require 'dash)
(require 's)

(defun my-file-jump ()
  "カーソル下のファイルに飛ぶ。なかったら他のバッファのディレクトリを基点に探す
↓確認用
~/.emacs.d/init.el
~/.emacs.d/init.el:
~/.emacs.d/init.el:2
~/.emacs.d/init.el:3:
~/.emacs.d/init.el:3:in
~/.emacs.d/init.el(5)
~/.emacs.d/init.el (3 hit)       ; この数字は行番号ではない
./spec/models/user_spec.rb:6:in  ; がんばって探す
./spec/models/xxxx_spec.rb:6:in  ; がんばって探すがファイルがない
"
  (interactive)
  (let ((thing-at-point-file-name-chars "-~/[:alnum:]_.${}#%,") ; 後ろのコロンまで拾ってしまうためコロンだけ除去
        original-path path line git-root vpath)

    ;; とりあえずファイル名を拾う
    (setq original-path (thing-at-point 'filename))
    (unless original-path (error "?"))
    (setq original-path (s-chop-prefix "./" original-path))
    (setq path original-path)

    ;; 後ろに行番号らしきものがあれば拾う
    (save-excursion
      (end-of-thing 'filename)
      (unless (= (following-char) (string-to-char " "))
        (when (re-search-forward "[^[:digit:]]*\\([[:digit:]]+\\)" (line-end-position) t)
          (setq line (buffer-substring-no-properties (match-beginning 1) (match-end 1))))))

    ;; ファイルがなければ .git からの相対パスとみなす
    (unless (file-exists-p path)
      (setq git-root (locate-dominating-file default-directory ".git"))
      (when git-root
        (setq path (concat git-root original-path))))

    ;; それでもなければバッファリストから探す
    (unless (file-exists-p path)
      (catch 'loop
        (--each (-uniq (--map (with-current-buffer it default-directory) (buffer-list)))
          (progn
            ;; カレントからの相対パス
            (setq vpath (concat it original-path))
            (when (file-exists-p vpath)
              (setq path vpath)
              (throw 'loop nil))
            ;; .git からの相対パス
            (setq git-root (locate-dominating-file it ".git"))
            (when git-root
              (setq vpath (concat git-root original-path))
              (when (file-exists-p vpath)
                (setq path vpath)
                (throw 'loop nil)))))))

    (unless (file-exists-p path)
      (error "ファイルが見つかりません: %s" original-path))

    ;; ファイルが見つかったので
    (find-file path)
    (if line
        (goto-line (string-to-int line)))
    (delete-other-windows)              ; 他のWindowを消す (お好みで)
    (recenter-top-bottom)               ; 画面中央に配置   (お好みで)
    ))

```

キーバインドは `C-j` を無効にして `C-j C-j` に私は割り当てています。これもお好みです。

```elisp
(global-unset-key "\C-j")
(global-set-key "\C-j\C-j" 'my-file-jump)
```
前々処理４：サクサク使うSQL（エクセル簡単連携） 

# （ 目標 ）　エクセルとクリップボードでのデータ連携を体験する

エクセル同士でデータはクリップボード経由（コピペ）で簡単に貼り付けることができます。SQLbrowser の集計結果も、クリップボード経由でさくっと貼り付け可能です。
* ( 用語 ) クリップボード

### （ 手順 ）
* tmp.db 開ける
* 集計をつくる
* エクセルに貼り付ける

#### ●tmp.db を開ける
前回つかった tmp.db を開けます。ym_latest の table があること確認します。

#### ●集計結果をつくる
Exectute SQL のタブをクリックして、
```
select exp_imp,month,sum(Value) as sum from ym_latest group by 
exp_imp,month order by exp_imp,month
```
を実行します。結果の表の左の一番上（赤い楕円で囲んだところ）をクリックして、選択し、CTRL+Cでコピーします。

![sb_20170930_2.png](https://qiita-image-store.s3.amazonaws.com/0/48387/40cb774d-b082-fafc-0a25-9ac620911cbe.png)


エクセルに移動して、CTRL+P でペースト（貼り付け）します。
![sb_20170930_3.png](https://qiita-image-store.s3.amazonaws.com/0/48387/ea8f6b30-33d8-006d-2083-4bd82027be91.png)

#### ●エクセルに貼り付ける
これで終わり。ちょっと簡単すぎましたね。でも、項目はコピーされないようです。ちょっと不便です。開発者にお願いするともしかしすると、機能追加してくれるかもしれません。そういった期待ができるのが、オープンソースの開発でいいところです。そして、[お願い](https://github.com/sqlitebrowser/sqlitebrowser/issues/1058)は、すでにされています。
親と健康とjQuery

タイトルは「無くしてわかるありがたさ 親と健康とセロテープ」のもじりです（親や健康にまつわる話題はありませんので、そこはご了解ください）。

jQueryを排除しようとしたら、逆にその利便性に気付かされることとなりました。

# jQueryプラグイン

多くのプラグインがあることが、エコシステムとしてのjQueryの存在感を高めていることは、いうまでもありません。ただ、`$.fn.hogehoge`はjQueryエレメントへの適用ですが、`$.foobar`は、「名前空間だけjQuery」で、あまり依存性が高くない以上、この形式は廃れていくのかなと思っています。

そして、CommonJSにjQueryプラグインを入れてしまうと（特に、`$.fn`にセットするものの場合）jQueryオブジェクトへの副作用となってしまって、`require`の返り値から使う形式にならないので、合わなさはけっこう感じます。

# DOMトラバース
## シンプルなメソッド名

DOMのメソッドは、`getElementsByTagName`とか`setAttribute`のように、長いものが多いですが、jQueryは`.attr`のように簡略になっていますし、メソッドチェーンもできて便利です。

ただ、Visual Studio Codeを使いだしたら、DOMのメソッド名にも補完が効くようになって、長くてもそこまで困らないかなという感じもしてきています。

## データを吊るす
`$().data()`では、文字列などJSONエンコード可能なものだけでなく、プロトタイプのあるようなJavaScriptのオブジェクトを格納することすらできてしまいます。うまくやらないとメモリリークの危険があるとのことですが、正しいやり方がよくわかりません。

## ネイティブで賄えるようになったもの
セレクタ系は`querySelectorAll`が出たことでjQueryなしでもあまり困らなくなりました。クラスも、昔は`className`を自力でパースするしかなかったので`.addClass`などが便利だったのですが、DOMネイティブに`classList`が登場して、jQueryと似たような操作性で使えるようになっています。[以前に書いたように](https://qiita.com/jkr_2255/items/3fecd90513affa02d515)、`.closest`もネイティブ実装が登場しています。

そして、`.after`や`.before`、`.prepend`や`.append`といったものまでDOM入りを果たしていて、「jQueryの存在感」を感じさせられてしまいます（[Polyfill](https://github.com/WebReflection/dom4)）。

# イベント処理

## イベントを起こす
jQueryからイベントを起こすには、`.trigger('イベント名')`だけで済むのですが、ネイティブでやろうとすると、`create`→`init`→`dispatch`の3段階が必要など、地味に手間でした。

## イベントデリゲーション
jQueryでは`.on(イベント名, セレクタ, イベントハンドラ)`だけで行える、イベントバブリングで下位のエレメントを拾う処理も、DOMでは対象エレメントの判定が自前で必要そうな感じでした。

# アニメーション

CSS3でアニメーションが定義されるようになりましたが、jQueryのほうが便利な場面もいくつかあります。

## `scrollTop`のアニメーション
スクロール位置の制御はCSSではできないので、jQueryなしではタイマーを計って自力で動かす他ありません…と思ったら、[マージンで制御する技](https://hail2u.net/blog/webdesign/scroll-smoothly-to-top-with-css-transition.html)があるようです。

## 複数アニメーションの制御

jQueryでは、1つのエレメントに複数のアニメーションを与えると、それらは順番に実行されます。CSSのTransitionでそれをやろうとすれば、`transitionEnd`などで制御する必要があります。
Windows 10にWindows SDK 7.1をインストールする方法

## 症状

Windows 10には.NET Framework 4.Xがプリインストールされているにも関わらず、SDK 7.1のWebインストーラでは、プレリリース版の.NET Framework 4がインストールされているというメッセージが出ます。

![error.png](https://qiita-image-store.s3.amazonaws.com/0/10290/fe159237-9ec9-9c97-a80f-6e49fde0123c.png)

[OK]をクリックして強行できますが、C++コンパイラなどを選択できません。

![webinstaller.png](https://qiita-image-store.s3.amazonaws.com/0/10290/40b1e06c-0b61-9567-e68b-549a16e393de.png)


[Microsoftの中の人が推薦している](https://social.technet.microsoft.com/Forums/en-US/f5f97c06-abd4-4478-8a41-70312cff462c/cant-install-visual-c-100-because-missing-net-40-framework-cant-install-net-40-framework?forum=win10itprogeneral)、StackOverFlowの以下のコメントを参考にしました。

![stackoverflow.png](https://qiita-image-store.s3.amazonaws.com/0/10290/9dad8fde-4b8c-aa1b-4aa7-231249b82113.png)
https://stackoverflow.com/a/32534158

## 対処法

[SDK 7.1のISOイメージ](https://www.microsoft.com/en-us/download/details.aspx?id=8442)をダウンロードします。

ISOイメージをマウントして開くと、`setup.exe`があります。しかし、これを実行するとWebインストーラとほぼ同じオチになりますので、使いません。代わりに、`Setup`フォルダの中に入ります。

![folder.png](https://qiita-image-store.s3.amazonaws.com/0/10290/5430c7ad-a92e-11ef-3a9c-a22acadc2f96.png)

`Setup`フォルダの中の、`SDKSetup.exe`を実行します。

![setup.png](https://qiita-image-store.s3.amazonaws.com/0/10290/2c8c79f9-f48e-5b4d-1493-e4fa674eb24b.png)

コンポーネント選択画面に進むと、全部選択可能になっています。

![isoinstaller.png](https://qiita-image-store.s3.amazonaws.com/0/10290/53c438c2-ce39-43cb-09a5-d7f1679ebf1e.png)

インストールが成功するはずです。

> 参照元には、Visual C++ 2010 再頒布可能パッケージを一旦アンインストールする必要がある旨書かれていますが、Windows 10 Version 1703では、アンインストールしなくても大丈夫でした。

## ハマりポイント

### 間違ったISOイメージを選んでいる

ISOイメージには、3つあります。

* GRMSDK_EN_DVD.iso ... x86
* GRMSDKIAI_EN_DVD.iso ... IA64
* GRMSDKX_EN_DVD.iso ... x64(amd64)

間違ったISOイメージでインストールしようとすると、以下のようなメッセージが出てきます。(例：x64環境にGRMSDKIAI_EN_DVD.isoでインストール)

![invalid_iso.png](https://qiita-image-store.s3.amazonaws.com/0/10290/6f656aee-d9b7-1c24-c8c8-e2c390913900.png)

```
A problem occurred while installing selected Windows SDK components.

Setup could not find the file WinSDK_amd64\WinSDK_amd64.msi at any of the specified source locations D:\Setup
```