OmniAICreator/Qiita-1.07M huggingface dataset:
技術英語 > broken PC > Was there any indication ... ? / The field regulator is fused. / It seems intact.

TensorFlowで計算に使っていたPCが起動しなくなった。電源ボタンを押してもLEDが少しの時間点灯したのち、すぐに消える。

故障の関連英語を復習する。

http://qiita.com/7of9/items/58a27a3697b984d6fa65
> <font color=red>Was there any indication</font> yesterday that there was something wrong?

起動しない症状は実は時々起こっていた。1,2回試すと起動していたので、よしとしていた。今回は5,6回試してもまったく起動しなくなった。

<hr>

@ Star Trek > Voyager? / Deep Space Nine?

Trekのいずれかのシリーズで出てきた以下のフレーズ。エピソード番号など失念。

> <font color=red>The field regulator is fused</font>.

意訳「field regulatorが焼き切れている」

http://www.dictionary.com/browse/fused
> verb (used with object), fused, fusing.
> 2. to combine or blend by melting together; melt.


問題のPCの基板はまだ未確認。最近の基板は故障が明確ではないことが多いので、多分見つかりにくいだろう。

> <font color=red>It seems intact.</font>

http://qiita.com/7of9/items/75b0d7ac3b369561755f
意訳「損傷がないようだ」

<hr>
修理完了までの期間はDeep Learningの座学になるか、学習対象の数値計算コード(ADDA)のコード整理になりそうだ。

@ 井深さんの夢を叶えてあげた by 木原信敏さん
> 「風邪も引きよう」は、私流の「たまには休んで発想を変えてみなさい」という表現である。私は根を詰めて仕事をする性分で、気がついたら会社に泊まりこんででも、仕事を続けていた。だが、その時には、ほかの発想が全然わいてこなかった。

>新しい発想をする時には、何か別の空間がないとダメらしい。私の場合、その空間は風邪を引いた時に潜る布団の中だった。風邪を引いてしまい、嫌でも仕事の手を休めなければならなくなった時に、ふとよいアイデアが浮かんできた。
テーブルビューコントローラーのデリゲートメモ

### テーブルビューのデリゲートのメモ

swift3へ移行したときに引き数名違ったりしてもビルドエラーにならずに原因探すのに苦労したので。
スニペット登録用の備忘録。

```swift
    func numberOfSections(in tableView: UITableView) -> Int {
        return 1
    }

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return 10
    }
 
    func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
        /// 0.0だと33pxの余白が発生したので0.1を定義
        return 0.1
    }

    func tableView(_ tableView: UITableView, heightForFooterInSection section: Int) -> CGFloat {
        /// 0.0だと33pxの余白が発生したので0.1を定義
        return 0.1
    }

    func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
        return 50
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell: UITableViewCell = tableView.dequeueReusableCell(withIdentifier: "cellIdentifier")!
        return cell
    }

    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        /// セル選択
    }
```
zsh に shift+insert で貼り付けても URL escape したい

はい
====

```zsh:.zshrc
# Setup:
autoload -Uz bracketed-paste-magic
zle -N bracketed-paste bracketed-paste-magic
# 便利
zstyle :bracketed-paste-magic paste-init backward-extend-paste
```

あとはポエムです。

経緯
====

macOS/OS X で zsh 使ってる時、URL の文脈で自動でエスケープかけてくれてることに気付いてマジ便利と思っていたものの、Windows/Linux でターミナルに <kbd>shift-insert</kbd> で貼り付けた場合に適用されていなくて辛い思いをしていた。よく考えると Mac では Cmd+V で貼りつけていたので、これはターミナル側の機能なのでは…？と考えたりもしたが、bash で貼り付けるとエスケープされなかったので zsh の機能だと当たりを付けて調べた。

Bracketed Paste Mode
====================

<kbd>shift-insert</kbd> で貼り付けた部分がリージョン選択状態になっていたのでそれが原因かと思い、キーシーケンスがバッティングしてるのかとか適当なことを考えながら `^@` の bindkey を削除したりしている最中に <kbd>shift-insert</kbd> のキーシーケンス `^[[200~` に bracketed-paste というものが割り当てられているのに気付いた。

調べると xterm 拡張の [Bracketed Paste Mode](https://srad.jp/~doda/journal/506765/) というものがあるらしく、これが関係しているらしい。適当に `bindkey -r "^[[200~"` とかやったが全然違ったので定義されてる bracketed-paste について調べた。

bracketed-paste-magic
=====================

まあやっぱり既にどこかで検討されてるもので、[bracketed-paste-magic](https://github.com/zsh-users/zsh/blob/master/Functions/Zle/bracketed-paste-magic) というものがあった。

ざっくり説明を読むと、Zsh 5.1 から上記の Bracket Paste Mode を zsh が考慮するようになったものの、その為の ZLE widget である bracketed-paste が url-quote-magic のような widget を無効化してしまうと。URL が自動エスケープされるのはこの widget のおかげだった様子。というわけでそれを回避する為にはこの bracketed-paste-magic を利用するといいらしい。

zstyles
========

文脈補完の zstyle について、bracketed-paste-magic の動作を制御するもの。[bracketed-paste-magic のコード](https://github.com/zsh-users/zsh/blob/master/Functions/Zle/bracketed-paste-magic) 中のコメントに詳細な説明がある。

active-widgets
--------------

bracketed-paste-magic のコンテキスト内で有効にしたい widget 名のパターンのリストを与える。組み込み拡張用にデフォルトで self-* というパターンが与えられている。

inactive-keys
-------------

bracketed-paste-magic が有効な間で無視するキーシーケンスのリストを与える。これはパターンは受け付けないらしい。デフォルトは無し。

paste-init/paste-finish
-----------------------

関数名のリストを取って、それぞれのタイミングの hook でコールする。リスト順に非 0 を返すまで実行される。なんかパラメータの説明とかあったけど zsh の関数を書いたこと無いので詳しくなく、色々ありますねという気持ちになった。

実行例として bracketed-paste-magic が提供している関数を paste-init に使用する例があった。

```zsh:.zshrc
zstyle :bracketed-paste-magic paste-init backward-extend-paste
```

これをやると貼り付けた地点のコンテキストを考慮して bracketed-paste-magic が有効になってくれる。URL の末尾にテキストを追加したい場合等に便利とあって、便利さを感じた。
レスポンシブルCSSを書く時の流れ

数日前に某サイトをスマホ対応にしている途中でいくつか気づいたことあったのでメモ

- 背景色やテキストの色、テキストの位置、フォントサイズ、行間、list-style、H1~H6のスタイルはほとんどの場合使いまわせる
- ボックスの配置はPCとスマホで違うので使いまわすことができない
- マウスオーバー系の奴はタッチパネルだと悲惨なことになるので分ける

次からレスポンシブル対応を考慮に入れつつCSSを書く場合、「背景色やテキストの色、テキストの位置、フォントサイズ、行間、list-style、H1~H6のスタイル」を先に書いて、残りの部分はメディアクエリーを駆使して描くと幸せになれるかもしれない
2つの別ディスク (HDD) にそれぞれ Windows と Ubuntu をインストールする

# ゴール
* 2つの HDD にそれぞれ Windows と Ubuntu をインストールする
* 起動する OS は BIOS で各ディスクの優先順位を上げ下げすることで指定する
    * それほど頻繁に OS を切り替える予定がないため

# OS
* Windows 10 （インストール済み）
* Ubuntu 14.04 （これからインストール）

# 手順

## ドライブを増設する
* 可能なら、既存のドライブと別のメーカー or 容量にしておくと、下図のようなややこしい自体に陥らずに済む

![15134045_1174151132667599_1044349031_o.jpg](https://qiita-image-store.s3.amazonaws.com/0/66421/f5448176-2fcb-3759-84cb-56c420c393a8.jpeg)

## Ubuntu 起動ディスクを USB メモリに作成

* https://www.ubuntulinux.jp/download/ja-remix から 64bit 版 ubuntu-ja-14.04-desktop-amd64.iso をダウンロード
* USB Writer などのフリーソフトを使って書き込み
    * トータルで 1.2GB 使用した

## USB メモリから Ubuntu を起動してインストール

* BIOS の設定を変更し、USB の優先順位を上げる
* USB から Ubuntu が起動するので、インストールを進める
* `インストールの種類` では必ず **それ以外** を選ぶこと！
    * 他の選択肢だと、問答無用で /dev/sda の MBR を上書きして grub がインストールされてしまう
    * /dev/sda が Windows の入ったディスクだった場合...
        * Windows の入ったディスクを第1優先にしても、まず grub が起動してそこから Windows を選ぶ羽目になる
        * Ubuntu の入ったディスクが取り外される or 故障すると Windows も起動できなくなる
    * もしうっかり通常インストールしてしまった場合のリカバリ手順は後述

![IMG_0542_2.JPG](https://qiita-image-store.s3.amazonaws.com/0/66421/eef9c96b-146e-2490-a5b9-0d2a145e8b43.jpeg)

* Ubuntu をインストールしたいディスクを選んでパーティションの設定をする
    * ディスクが未フォーマット状態の場合は `新しいパーティションテーブル` ボタンから初期化が可能
        * ディスクを間違えないように注意
    * `空き領域` を選択した状態で `+` ボタンをクリックして、パーティションを定義していく
        * メインのパーティション
            * サイズ: スワップ領域分を考慮して適当に決める
            * 基本パーティション（論理でもいいかも）
            * この領域の始点
            * 利用方法: ext4
            * マウントポイント: `/`
        * スワップ領域用パーティション
            * サイズ：最適値は諸説あるのでググって適当に決める
            * 論理パーティション（基本でもいいかも）
            * この領域の始点
            * 利用方法: スワップ領域

![IMG_0553_2.JPG](https://qiita-image-store.s3.amazonaws.com/0/66421/e55ea556-3a89-a079-69c6-cd7376eab619.jpeg)

![IMG_0550_2.JPG](https://qiita-image-store.s3.amazonaws.com/0/66421/c889a0fb-bbde-09a7-e33c-51fb771d1686.jpeg)

* `ブートローダをインストールするデバイス` で Ubuntu のインストール先ディスクを間違えずに指定

![IMG_0554_2.JPG](https://qiita-image-store.s3.amazonaws.com/0/66421/e55b245c-2ede-754a-f535-2a070e3b2f68.jpeg)

* インストール開始
* 再起動時に BIOS の設定を変更し、Ubuntu のディスクの優先順位を上げる
    * grub から Ubuntu が起動すれば OK
* 再起動して BIOS の設定を変更し、Windows のディスクの優先順位を上げる
    * 普通に Windows が起動すれば OK

# もし間違って Windows のブートローダーを grub で上書きしてしまったら？

* [Dual-boot Repair](https://www.boyans.net/DualBootRepair.html) を使う
    * 安全なソフトかどうか定かではないので、使用は自己責任で
    * `Automatic Repair` をクリックするだけ
        * 内部的には Windows の `bootsect` コマンドを実行してるっぽい？
    * 同作者の [Visual BCD Editor](https://www.boyans.net/) を使えば、現状の MBR の状況がわかるかも
機械学習論文読みメモ_17

[Stochastic Variance Reduction for Nonconvex Optimization](http://jmlr.org/proceedings/papers/v48/reddi16.pdf), ArXiv
非凸関数の和を最小化する問題を考える。
本論ではSGDの発展系であるstochastic variance reduced gradient(SVRG)を考える。
これはSGDの分散挙動を制御する手法で、線形オーダーも実現可能な高速手法になる。
しかしこの手法は非凸問題に関しては詳細な理論解析がされてこなかった。
本論では、パラメータの慎重な設定を持ってすれば、凸関数同様、従来のSGD、GDよりも早い収束が可能な事を示した。

[On the Quality of the Initial Basin in Overspecified Neural Networks](http://jmlr.org/proceedings/papers/v48/safran16.pdf), ICML2016
ランダム初期化と、ReLU関数に基づいた非線形Neural Networkの構造を幾何学的に解析する。
それによれば、高い確率である初期値を得たときに、それは全体最適値へ単調減少していく、あるいはすでに小さい目的関数の値を持つ、事が分かった。
このような特性は、大きいネットワークに対してより良く起きやすい。

[Stochastically Transitive Models for Pairwise Comparisons: Statistical and Computational Issues](https://arxiv.org/pdf/1510.05610.pdf), ArXiv
ペアワイズ比較データに関するモデルで、パラメトリックなモデルにはBradley-Terry-Luce(BTL) model, Thurstone modelがある。
BTLはあるアイテムがもう一つのアイテムよりも好まれる確率を表し、例えばロジットモデルのような形で表せる。
Thurstone modelは潜在変数モデルで、各評価者毎にある潜在変数が決まって、それにより全アイテムに関するランクは決定的に決まる。
評価者に対応する潜在変数は真値を中心にガウス分布するモデルによって確率的に決まる。
しかしながらこれらはパラメータに強く依存しており、表現力に制限がある。
本論ではより柔軟性の高きモデルを提案し、確率的に推移律を満たす事だけを要求するモデルとなっている。
このモデルはBTLとThurstoneを含む一般化されたモデルとなる。
しかしその最適化は簡単ではなく、その最適化のためのいくつかの手法を提案している。
マイナーな漢語系電算用語


「算法」（アルゴリズムのこと）って言葉，簡潔でけっこう好きなんだけど，知らない人もいるだろうし，広く使われているとは言い難い。

そういうマイナーな漢語のコンピューター用語をいくつか並べてみる（網羅は意図しない）。

|  訳語  |  原語  |
|:---|:---|
| 算法 | algorithm |
| 算譜 | program |
| 作譜 | programming |
| 算料 | data |
| 算帳 | file |
| 界面 | interface |
| 番地 | address |
| 電脳 | computer　|
| 軟件 | software |
| 硬件 | hardware |
| 金物 | hardware |
| 網 | network |


算法・算譜・作譜とかは普通に使いたいね。
算料，算帳とか界面は知らなかった（この記事を書くために調べてて見つけた）。

# data

data は哲学（？）方面だと「与件」て訳語もあるみたい。「感覚与件」（sense data）とか。

# address 

ワンボードマイコンの時代は，メモリーのアドレスのことを番地と呼ぶのが普通だったと思う。

# computer

「電脳」は中国語。

一口に中国語といっても，中華人民共和国（以下「大陸」）と台湾では字体が違ったり，語彙そのものが違うことがある。香港もまた違ったりする。

大陸の字体をここでは「簡体字」と呼ぶことにする。

「電脳」は簡体字では「电脑」。台湾では「電腦」。

大陸では「电脑」よりも「电子计算机」あるいは単に「计算机」のほうがふつうの表現ぽい[^ki]。

[^ki]: 「计算机」の「机」は「機」の簡体字である。日本漢字の「つくえ」とたまたま同じ字形になっている（いわゆる別字衝突）。

「電脳」は，日本では坂村健さんが盛んに使われていたっけ？
『[電脳都市感覚](http://iss.ndl.go.jp/books/R100000002-I000001982237-00)』NTT出版（1989）なんて本もあった（けっこう衝撃を受けた）。

日本語も「電脳」を使うときは何かちょっと面白く表現したり，格好をつけたり，といった意図を感じる。「電子計算機」やその略語の「電算機」のほうがメジャー。電算機は字数を減らしたい新聞で多用されたけど，今はどうだろうね。「電算化」「電算写植」なんて言葉もあった。

# software, hardware

「軟件」「硬件」は中国語。「軟件」は簡体字では「软件」。

日本では，（使うかどうかはともかく）この言葉の存在自体はそこそこ知られていると思ってたけど，そもそもほとんど知られていないらしいと最近気づいた。

上の表には hardware の訳語として「<ruby>金<rt>かな</rt>物<rt>もの</ruby>」を入れておいたけど，これは古い記憶をたぐっても，一冊の本で見ただけのような気がする。入れないほうがよかったかと，あとで思った。

英語では，電算用語以前に，「hardware」には鍋・釜のようなちょっとした金属器などを指す用法がある。この語義は日本語の「金物」に近いので，電算用語として「金物」の訳語を最初に使った人は，おそらくそういうところから持ってきたのだろう。

# network 

網は，接尾辞としてなら「通信網」とかメジャーだけど，通信業界（？）の人は「網」だけでも使うぽい。ずーっと，これ，アミって読むんだと思ってたけど，どうやらモウらしい（？）

# file

上の表では「算帳」と書いたが，この言葉をどこで見つけて表に入れたのか覚えていない。
以下の節の「島内の算譜」では「算帳」ではなく「算帖」となっている。

中国語では「算帳」は全く違う意味で使われるようなので，「算帖」のほうがよさそうな気がする。もしかすると「帖」が常用漢字に入っていないために代用漢字に差し替えたのかもしれない。

# その他

JIS X 0007 には，deadlock の訳語として「すくみ」，breakpoint の訳語として「中断点」が載っている。

# 漢語系電算用語はどうやってできた？

漢語系電算用語は，日本や中国でいろんな人が考案してきたのだろう。
以下の貴重な証言を見つけた。津田塾大学の [石井博先生のサイト](https://edu.tsuda.ac.jp/~ishii/FrameTop.html) 内のページで，2004 年に公表されたもの。

https://edu.tsuda.ac.jp/~ishii/Miscella/Simauti.html

「算譜」「算料」などの訳語ができた経緯や意図が生々しく書かれていて，たいへん興味深い。
Linuxを起動するとA start job is running for sys-subsystem-net-devices-wls3.deviceでネットに繋がらない

# 発端

Arch Linuxを起動すると、下記の症状が出てネットに繋がらなくなりました。

- 「A start job is running for sys-subsystem-net-devices-wls3.device」というエラーが出て、1分30秒止まる
- `sudo wifi-menu`でネットに繋ごうとしても、下記のエラーで繋がらない

```
Job for netctl@wlp3s0\x2dSSID名.service failed because the control process exited with error code.
See "systemctl status "netctl@wlp3s0\\x2dSSID名.service"" and "journalctl -xe" for details.
```

- `journalctl -xe`の結果が役に立たない

```
netctl@wlp3s0\x2dRedmi\x2dSSID名: Main process exited, code=exited, status=1/FAILURE
```
- ノートPCの物理wifiスイッチで、WifiをOFF->ONとすると繋がるようになる

物理スイッチOFF/ONでごまかしていたのですが、再起動する度にやるのは流石に面倒になってきました。
また、問題があるのに対処せず、面倒な手順に甘んじているのはダサい。

そこで、本腰を入れて解決しました。

他のsystemdを使っているディストリビューションでもあり得ると思ったので記事にします。

# 原因と対処

`dhcpcd`の問題でした。

下記のStack Overflowに書いてある通りの手順を試したら、解決しました。

- http://unix.stackexchange.com/questions/121060/arch-linux-not-connecting-to-wifi-anymore

```
sudo systemctl disable dhcpcd.service
```

でdhcpcdを止めてあげればOKでした。

また今回とは関係ありませんでしたが、下記のArchWikiの設定もしておくと良いでしょう。

- https://bbs.archlinux.org/viewtopic.php?id=170862

`echo 'TimeoutDHCP=20' >> /etc/netctl/wlp3s0-SSID名`
Jenkins2のPipelineでUnityのユニットテスト結果をgithubに通知する

Jenkins2で標準機能になったPipelineを使って、
Unityの自動テストを複数ブランチで動かして、
結果をgithubに通知するところまでやってみました。
簡単に紹介します。

# Jenkinsの環境
UnityがインストールされたmacOS

# Jenkinsプラグイン
+ NUnit Plugin
+ GitHub Plugin

# GitHub APIの認証設定
システム設定画面から、
1. GitHub → GitHub Server → API URLをhttps://api.github.com
2. 高度な設定 → Additional actions → Convert login and password to token
3. From login and password　→ githubのアカウント情報入力
4. Create token credentials

これで認証情報が作成されるので、Credentialsで選択。
Test connectionを押して認証できれば設定完了

# Jenkinsのジョブの作成
+ Multibranch PipelineかPipelineでジョブを作成
+ リポジトリの情報を入力


# ユニットテスト用のシェルスクリプト作成
Unityのユニットテストをbatchmodeで動かすスクリプトです。
Unityのプロジェクトの場所をhogeとしてます。
作成したスクリプトをルートに設置します。

``` sh:unit_test_run.sh
#!/bin/sh
set -e

UNITY_PATH="/Applications/Unity/Unity.app/Contents/MacOS/Unity"
RESULT_PATH=$（cd $(dirname $0) && pwd)
PROJECT_PATH="${RESULT_PATH}/hoge"


${UNITY_PATH} -quit -batchmode \
              -runEditorTests \
              -projectPath ${PROJECT_PATH} \
              -editorTestsResultFile $RESULT_PATH
```

テスト結果のコードは
0 - テスト成功
2 - テスト失敗
3 - 失敗
となります

# Jenkinsfileの作成
先ほど作成したスクリプトを走らせて、結果を通知します。
ルートにJenkinsfileを作成してgithubにPushします。

``` sh:Jenkinsfile
#!groovy

node {
    stage("SETUP") {
        env.WORKSPACE=pwd() + "@script";
    }

    stage("UNIT TEST") {
        dir (env.WORKSPACE) {
            result = sh(script: "**/unit_test_run.sh", returnStatus: true)
            step[$class: 'NUnitPublisher', 
                 testResultsPattern: '**/EditorTestResults.xml',                          
                 debug: false, 
                 keepJUnitReports: true,                   
                 skipJUnitArchiver: false, 
                 failIfNoResults: true])
        }
    }

    stage("NOTIFY") {
        def state = "ERROR"
        switch (result) {
            case 0:
                state = "SUCCESS"
                break
            case 2:
                state = "FAILURE"
                break
            default:
                break
        }

        step([$class: 'GitHubCommitStatusSetter',
              statusResultSource: [$class: 'ConditionalStatusResultSource',
                                   results: [[$class: 'AnyBuildResult', message: '', state: state]]]])
    }
}
```

returnStatus : trueにすると結果を変数で受け取れるので、
結果のコードからテスト結果をgithubに通知します。


Multibranch Pipelineでジョブを作成すると、
Jenkinsfileが存在するブランチ毎にジョブが作成され、
コミット単位で変更を検知してJenkinsfileの内容を走らせてくれます。
※ブランチが削除されるとジョブも削除されます。

Jenkinsはあまり詳しくないので、
間違いやここをこうしたほうがいい等あればご指摘お願いします。

# 参考記事
- Jenkins2.0のPipelineを触ってみたら便利だった
  - http://be-hase.hatenablog.com/entry/2016/04/28/175311
- GithubとJenkins Pipelineジョブを連携させる – MAMANのITブログ
  - https://blog.mamansoft.net/github%E3%81%A8jenkins-pipeline%E3%82%B8%E3%83%A7%E3%83%96%E3%82%92%E9%80%A3%E6%90%BA%E3%81%95%E3%81%9B%E3%82%8B/
高校数学復習を終えると統計学の入門ができるのか？

#高校数学を復習した経緯や勉強方法
高校数学を復習した経緯は、**予測分析(統計)学習時に数式で躓いたことです。**詳しい経緯や勉強方法は前記事[「文系卒社会人が統計・機械学習を理解するための数学勉強方法」](http://qiita.com/FukuharaYohei/items/0a66c37091dc27c71fe6)を参照してください。
約115時間かけて復習しました。
#サマリ
高校数学復習後に再び、[「統計学入門 (基礎統計学)」](http://amzn.to/2oVhAqI)を見返してみました。
結論は、高校数学復習を終えた状態で**統計入門を完全に理解できないけど理解が速く深くなった**、です。
入門に達していないのが悲しいですが、一方で成長した点は嬉しく複雑な気分です。
#復習の効果
数式に慣れたので、苦手意識が薄れて理解する速度が速くなりました。例えば、離散型の分散を示す以下の式はある程度すぐに頭に入ります(むしろ、今までが知識不足と言えばそれまでですが・・・)。

```math
V(X)=\int^\infty_{-\infty}(x-\mu)^2f(x)dx
```

これは、想像以上に楽になりました！意味がわかると少しモチベーションあがります:grinning:
#認識している足りない点
わかっているだけで、ガウス積分、偏微分なんかは[長岡先生の授業が聞ける高校数学の教科書数学 (考える大人の学び直しシリーズ)](http://amzn.to/2nueRau)で出てこなかったので、追加で勉強しないといけません。
ガウス積分は正規分布で、偏微分は回帰分析で使います。
ざっと[「統計学入門 (基礎統計学)」](http://amzn.to/2oVhAqI)を読み返しただけなので、他にもまだまだ足りない点があると思います。
#今後の方針
高校数学で足りなかったので、まずは大学数学に手を伸ばしました。
[「スバラシク実力がつくと評判の大学基礎数学キャンパス・ゼミ―大学の数学がこんなに分かる!単位なんて楽に取れる!」](http://amzn.to/2ombd1L)を買って勉強しました。非常にわかりやすい参考書です。

2年ほど勉強をして、統計学にフォーカスしたおすすめ勉強方法を[「文系卒社会人が統計入門する最短学習法」](https://qiita.com/FukuharaYohei/items/27d1ed76d770a19da323)に書きました。
macOSアプリにオレオレ再署名する(e.g. 夜フクロウを省電力に改造してみる)

# macOSのアプリケーション署名の仕組み
ぶっちゃけまだそんなに理解してない。
Androidと似たような感じだということ、標準でコマンドが用意されていて簡単にできることはわかった。

[Code Signing Tasks](https://developer.apple.com/library/content/documentation/Security/Conceptual/CodeSigningGuide/Procedures/Procedures.html)

署名は基本的に``codesign``コマンドで行える。``man``ページも用意されているのでそれを見たほうが早いかも。

# 再署名の必要性
文章を書くのが面倒くさいので経緯は箇条書きで...

1. Twitterクライアントである[夜フクロウ](https://sites.google.com/site/yorufukurou/home)が複数GPU搭載のmacにおいて自動切替に対応していない(``Info.plist``に対応の記述がない)
2. そのせいで起動するたびにディスクリートGPUが叩き起こされる
3. 驚異的なバッテリー消費
4. やばい
5. でも夜フクロウ使いたい
6. ``Info.plist``書き換えればいけそう
7. いけた
8. けど署名が無効になっているので暗号化されたファイルを復号化できなくなった
9. 起動するたびに再ログインを求められる
10. めんどくさい
11. 再署名したらいいんじゃね？

夜フクロウの``Info.plist``の書き換えによるGPU切替対応(偽装)の方法はブログの方に[書きました。](http://zeriyoshi.hatenablog.com/entry/2016/11/20/174047)

# 再署名しよう
実際に再署名をしていきます。

## 署名用の証明書を作る

1. **キーチェーンアクセス** を開きます。
2. **キーチェーンアクセス > 証明書アシスタント > 証明書を作成**をクリックします。
<img width="606" alt="スクリーンショット 2016-11-22 23.13.42.png" src="https://qiita-image-store.s3.amazonaws.com/0/76820/2619bb19-30d7-32ee-b47e-5eba8475e9c0.png">
3. 好きな名前をつけ、証明書のタイプで**コード署名**を選択します。
<img width="728" alt="スクリーンショット 2016-11-22 23.19.08.png" src="https://qiita-image-store.s3.amazonaws.com/0/76820/677e3f12-c77b-a139-b885-f583525c2f67.png">
4. 警告されるのでちゃんと意味を理解してから**続ける**をクリックします。
<img width="728" alt="スクリーンショット 2016-11-22 23.19.12.png" src="https://qiita-image-store.s3.amazonaws.com/0/76820/dd67f8a8-dc54-7d09-2cb9-4dd624dfaffe.png">
5. 署名用の証明書ができます。

## 署名する
実際にアプリに署名していきます。

1. ターミナル(シェル)を開き、再署名したいアプリケーションのあるディレクトリに移動します。
2. ``codesign --force --deep-verify --verbose --sign "<さっきつけた好きな名前>" <アプリケーション>.app``

ex) ``codesign --force --deep-verify --verbose --sign "zeriyoshi-modified-apps" Night\ Owl.app/``
<img width="719" alt="スクリーンショット 2016-11-23 0.32.12.png" src="https://qiita-image-store.s3.amazonaws.com/0/76820/7f1b891d-1a25-54aa-0be9-88d724098207.png">
3. 完成

# その他
* 一度でもそのアプリを使ったことがあるならば、改造をする前にAppCleaner等で設定ファイルもろとも完全に削除した後、一度再起動してからインストール、改造、再署名としたほうが安全
* MBP2016のTouchBarはスクリーンショットの撮影にはすごく便利だと思いました
BigQuery Standard SQLで配列のソートをする方法


BigQuery Standard SQLで配列のソートをするUDF関数を作ってみました。

```sql
#standardSQL
CREATE TEMPORARY FUNCTION ARRAY_INT64_SORT(arr ARRAY<INT64>)
RETURNS ARRAY<INT64> AS ((
  SELECT ARRAY_AGG(x) FROM(
    SELECT x FROM UNNEST(arr) AS x ORDER BY x
  )
));
SELECT ARRAY_INT64_SORT([8, 1, 3, 9, 5, 4, 7, 2, 6, 10])
```
Powershell で Windows10 の Windowsエクスペリエンスインデックスを確認する

Vistaと７にあった Windowsエクスペリエンスインデックスは、
Windows 8.1以降では表示用のGUIが省略されました。

しかし、性能を測定するプログラム WinSAT(Windows System Assessment Tool)そのものは存在しているため、以下の方法で表示可能でした。
<pre>
clear
winsat formal -restart clean
Get-CimInstance Win32_WinSat
</pre>
結果は、次のように表示されます。
<pre>
CPUScore              : 7.5
D3DScore              : 9.9
DiskScore             : 8.9
GraphicsScore         : 6.1
MemoryScore           : 7.9
TimeTaken             : MostRecentAssessment
WinSATAssessmentState : 1
WinSPRLevel           : 6.1
PSComputerName        : 
</pre>
ThinkPad X1 Carbon 2016 Gen4 の値です。
Phanの実行環境をDockerで作ってみた

こんにちは。型システムは静的型付け派です。

# やりたいこと
[Phan静的解析がもたらす大PHP型検査時代](http://inside.pixiv.net/entry/2016/11/11/202656)を見て、どんな結果を得られるのかを試してみました。

実行環境は
> Phanの動作にはPHP 7.0が必要で、php-astも要求されます。また、検査対象のアプリケーションが拡張モジュールに依存する場合は、それもインストールしておいた方が無難です。

と言うことなので、扱いやすいようにDockerで作りました。今回は拡張モジュールは導入ません。利用するコンテナは一つですが、dockerコマンドの実行時のオプションを忘れてしまうので、docker-composeを利用します。

# 今回の環境
<dl>
  <dt>Docker</dt><dd>Docker on Mac 1.12.1</dd>
  <dt>コンテナのOS</dt><dd>CensOS7</dd>
  <dt>php</dt><dd>7.0.13-1.el7.remi.x86_64</dd>
  <dt>php-ast</dt><dd>v0.1.2</dd>
  <dt>Phan</dt><dd>0.6</dd>
</dl>


# Dockerfile
コンテナは扱い慣れた CentOS７をベースにします。PHP7が必要なので ソースからのコンパイルもアリなのですが、今回は [Remi](http://rpms.famillecollet.com/enterprise/7/)を利用します。

```yaml:php7/Dockerfile

from centos:7

ENV PHAN_VERSION=0.6


# needs php7
RUN yum install -y epel-release wget;
# needs php-ast
RUN yum install -y git ;\
    yum groupinstall -y "Development Tools" ;
# git clone php-ast
RUN cd /usr/local/src ;\
    git clone https://github.com/nikic/php-ast.git 

# install php7 from remi repositroy
RUN rpm --import https://rpms.remirepo.net/RPM-GPG-KEY-remi
RUN wget http://rpms.famillecollet.com/enterprise/remi-release-7.rpm ; \ 
    rpm -ivh ./remi-release-7.rpm ; \
    yum install -y --enablerepo=epel,remi,remi-php70 php70 php-devel php70-php-pdo ; \
    sed -i '/^# vim:ts=4:sw=4$/i\source \/opt\/remi\/php70\/enable' /etc/bashrc

# install php-ast
RUN cd /usr/local/src ;\
    cd php-ast ;\
    phpize ;\
    ./configure ;\
    make ; \
    make install ; \
    echo 'extension="/usr/lib64/php/modules/ast.so"' > /etc/opt/remi/php70/php.d/20-ast.ini
    
# install Phan
RUN mkdir -p /usr/local/phan/bin; \
    wget https://github.com/etsy/phan/releases/download/${PHAN_VERSION}/phan.phar -O /usr/local/phan/bin/phan.phar 
```

Dockerfileでは行っていることです。
1. yumでファイルの取得に必要なwgetとgitと [php-ast](https://github.com/nikic/php-ast)をコンパイルするために"Development Tools"をインストールします。
3. RemiからPHPをインストールします。
4. `/etc/bashrc`で`/opt/remi/php70/enable`を読み込むことで、コンテナ内でbashを利用した時にphpコマンドにパスが通っている状態にします。
5. `php70-php-pdo`はPhanがSQLite3を使っているためです。
6. php-ast をコンパイルして、モジュールを有効にします。
7. Phanをphar形式でダウンロードし、作成したディレクトリ `/usr/local/phan/bin`
 に置いておきます。



# docker-compose
```docker-compose.yml
version: '2'
services:
  php7:
    build: php7
    volumes:
      - /path/to/myproduct:/code
    working_dir: /code
    command: /opt/remi/php70/root/usr/bin/php /usr/local/phan/bin/phan.phar --progress-bar -ophan.log 
```

## volumesオプション
実行時にはDockerのホストディレクトリにあるソースファイルをコンテナがマウントして、検査を実行します。

## commandオプション
Phanが実行していることが分かるように `--progress-bar`オプションを指定し、実行結果は`-ophan.log`で`phan.log`ファイルに残します。ログファイルが作成されるディレクトリはコンテナ内であれば`/code`ディレクトリに、マウント元のホストであれば`/path/to/myproduct`になります。


# .phan/config.php 
今回は`lib`ディレクトリだけを検索する、最低限の内容だけ作成しました。ファイルはホストの`/path/to/myproduct/.phan/config.php`に保存します。

``` php:config.php
<?php
return [
    'directory_list' => [
        'lib/',
    ],
    "exclude_analysis_directory_list" => [
    ],
];

```

# 実行方法
`docker-compose up`で実行します。

# 感想
小さいソースで試したところ、PHPDocの書き方でエラーになると予想した箇所がエラーにはならなかったので、検査内容を理解していく所からになりました。

言い訳になりますが、今回は様子見で試しただけです。本当に。
ipconfig の結果に、行番号をつけてみる

Windows10、次期アップデートでシェルをコマンドプロンプトからPowerShellに変更
http://blog.livedoor.jp/itsoku/archives/50054735.html

という嬉しい記事を見かけたので遊んでみるテスト。
別に、ipconfig でなければいけないというわけでもないですけど手頃だったので。
<pre>
$ipconfig_result = ipconfig
$ipconfig_result[38]
</pre>
とすると、結果は 38行めに該当する部分だけを抜き出して
<pre>
   IPv4 アドレス . . . . . . . . . . . .: 192.168.11.6
</pre>
と表示されることから、
行番号を表示するスクリプトを書いてみる。
<pre>
clear
$ipconfig_result = ipconfig
$MaxLineNo = $ipconfig_result.Count
for ( $line = 1; $line -lt $MaxLineNo; $line++ )
    {
    if ( $line -lt 10 )
        {
        $line_No = "0" + $line
        }
    else
        {
        $line_No = $line
        }
    Write-Host $line_No ":" $ipconfig_result[$line]
    }
</pre>
とすると、結果は、
<pre>
01 : Windows IP 構成
02 : 
03 : 
04 : イーサネット アダプター イーサネット:
05 : 
06 :    メディアの状態. . . . . . . . . . . .: メディアは接続されていません
07 :    接続固有の DNS サフィックス . . . . .: 
08 : 
09 : Wireless LAN adapter ローカル エリア接続* 1:
10 : 
11 :    メディアの状態. . . . . . . . . . . .: メディアは接続されていません
12 :    接続固有の DNS サフィックス . . . . .: 
13 : 
14 : イーサネット アダプター VMware Network Adapter VMnet1:
15 : 
16 :    接続固有の DNS サフィックス . . . . .: 
以下略
</pre>
これだけでもコマンドプロンプトではできないことが Powershell なら簡単にできる、
という片鱗を見せつけられてちょっと楽しい。
Flaskで複数ファイルのアップロード

以前、Flaskで複数ファイルのアップロードのやり方がわからず、試行錯誤したので、結果のメモ


```py:サーバ側の処理
if request.files.getlist('upload_files')[0].filename:
    upload_files = request.files.getlist('upload_files')
    for upload_file in upload_files:
        #受信したファイルをtmp/に保存
        upload_file.save("tmp/" + secure_filename(upload_file.filename))
```

```html:クライアント側のHTML
<form method="post">
    <div class="form-group pull-left">
        <input type="file" id="upload_files" name="upload_files" multiple="multiple" class="form-control">
        <p class="help-block">※複数ファイルの指定が可能です</p>
    </div>
    <div class="form-group">
        <input type="submit" value="送信" class="form-control btn btn-primary">
    </div>
</from>
```

クライアント側で複数指定して送信までは簡単だったが、それをサーバ側でどう受ければいいのかがよくわからず、四苦八苦。。。
いろいろ調べた結果、複数ファイルを送信すると、同じKEYでrequest.filesに格納されているようなので、request.filesから"get()"でなく"getlist()"で取得することで解決。
windows10環境にVagrant入れてsshで接続するまで５分でできた

Vagrant気になってはいたのですが、どうせ導入時に何かしらエラーとかでてロースキルな自分には、それの対応とかで時間かかるんだろうなぁとか思って保留、保留していたのですが、実際やってみたらエラーもなく５分で終わったという話し

#前提
2016/11/17時点で最新バージョンで確認しました。

 - VirtualBox 5.1.8 for Windows hosts
 - vagrant_1.8.7
 - OpenSSH-Win64 v0.0.3.0

#各種インストール
###VirtualBoxの導入
 - [ここ](https://www.virtualbox.org/wiki/Downloads)から
VirtualBoxをダウンロードしてインストールする。

###OpenSSHの導入
 - [ここ](https://github.com/PowerShell/Win32-OpenSSH/releases/tag/v0.0.3.0)からOpenSSHダウンロードして解凍する。
 - 解凍したディレクトリのパスを環境変数に追加します。  
 （環境変数の設定方法がわからない場合は[ググって](https://www.google.co.jp/search?q=windows+%E7%92%B0%E5%A2%83%E5%A4%89%E6%95%B0+%E8%A8%AD%E5%AE%9A&oq=windows+%E7%92%B0%E5%A2%83%E5%A4%89%E6%95%B0%E3%80%80%E8%A8%AD%E5%AE%9A)ください）

###Vagrantの導入
 - [ここ](https://www.vagrantup.com/downloads.html)からVagrantをダウンロードしてインストールする。

#Vagrantのセットアップ
 - 下記はCentOS7.2を導入したい場合の例です。
 - 他のバージョン等で行いたい場合は[ここ](https://atlas.hashicorp.com/bento)とかから探してください。
 - VMの作成と起動  
 `mkdir vagrant\centos72`  
 `cd vagrant\centos72`  
 `vagrant init bento/centos-7.2`  
 `vagrant up`  
 - VMに接続する  
 `vagrant ssh`
 - VMから抜ける  
 `exit`
 - VMを止める  
 `vagrant halt`

以上


#おまけ：実行しているコマンドプロンプト以外からVMにアクセスする
###接続情報確認
  - vagrantfileのあるディレクトリに移動する。
  - `vagrant status`でVMが起動していることを確認する。
  - vagrantfileのあるディレクトリで下記コマンドを実行する。  
  `vagrant ssh-config`
  - IdentityFileなどを確認する。  

```
Host default
  HostName 127.0.0.1
  User vagrant
  Port 2222
  UserKnownHostsFile /dev/null
  StrictHostKeyChecking no
  PasswordAuthentication no
  IdentityFile C:/Users/user/vagrant/centos72/.vagrant/machines/default/virtualbox/private_key
  IdentitiesOnly yes
  LogLevel FATAL
```
###接続
 - 下記コマンドを実行する。  
  `ssh -l vagrant -p [port] [HostName] -i [IdentityFile]`  
前項の接続情報だった場合は下記の様になる  
  `ssh -l vagrant -p 2222 127.0.0.1 -i C:/Users/user/vagrant/centos72/.vagrant/machines/default/virtualbox/private_key`
Rails5でdalli+memcachedを使ったセッション管理をする際の注意

[memcachedを利用したsession管理](http://qiita.com/ThreeTreesLight/items/bb1a5960a54fd214c674)

たとえば上の記事を参考にRails5にdalliを導入してmemcachedでセッション管理をしようと思っても、development環境ではそのままでは動かない。
Rails5からは、development環境でキャッシュを有効化するには、下記のコマンドを一度実行する必要がある。

```bash:キャッシュの有効化
$ rails dev:cache
```
実際には、development.rbを読めばわかるが、`tmp/cache-dev.txt`の有無で`perform_caching`の値が決定される。

```ruby:development.rb
...
  # Enable/disable caching. By default caching is disabled.
  if Rails.root.join('tmp/caching-dev.txt').exist?
    config.action_controller.perform_caching = true
    config.cache_store = :dalli_store
    config.public_file_server.headers = {
      'Cache-Control' => 'public, max-age=172800'
    }
  else
    config.action_controller.perform_caching = false
    config.cache_store = :null_store
  end
...
```

Rails4までは何もしなくてもよかったので、ちょっとしたハマりポイントである。

[Caching in development environment in Rails 5](http://blog.bigbinary.com/2016/01/25/caching-in-development-environment-in-rails5.html)
【メモ】普段あんまり意識出来てないHTTP関連の知識まとめ

###HTTPリクエストヘッダ(クライアントからの要求)
・Accept-Language：受信可能な言語
・Authorization：ログインユーザーの情報
・Cookie：クッキー
・Host：接続先のサーバーの名前
・If-Modified-Since：指定した時刻以降に更新していたらコンテンツが欲しい旨の指定
・Referer：直前に参照していたページのURL
・User-Agent：ブラウザの種類

###レスポンス(サーバからの応答)
・Date：レスポンスの日付
・Last-Modified:ファイルの最終更新日
・Content-Type:コンテンツのタイプ(text/htmlとか、charsetとか)
・Content-Length:ボディの長さをバイト表示
・Location：300番台ステータスコード時の移動先
・Expires：コンテンツの有効期限(キャッシュする際に使う)

###ステータスコード
こっち参照
http://www.tohoho-web.com/ex/http.htm#response

###HTTPコマンド
・GET：コンテンツの取得
・HEAD：コンテンツのヘッダだけの取得
・POST：フォームなどのデータの送信
・PUT：コンテンツの送信
・DELETE：コンテンツの削除

###HTTPヘッダの確認方法(Chrome)
・command + option + jでデベロッパーツールを表示
・Networkを選択
・左側のNameから確認したいファイルを選択
ELBをRoute53でAliasする時に出るAlias Hosted Zone IDとELBの関連性

## これはなに？
Route53とELBを紐付ける際にRoute53のAlias機能を使うがZone IDが違いました。
ELBのHosted zone idとRoute53のAlias Hosted Zone IDは関連性がない(特定条件において)ということをまとめておきます。

## 混乱のきっかけ
TerraformでRoute53の設定をしようとしていました。
以下のコードがサンプルでよくある設定かと思います。
ELBの情報を元にRoute53を設定しております。

```
resource "aws_route53_record" "elb" {
  zone_id = "domain zone id"
  name    = "hoge"
  type    = "A"

  alias {
    name                   = "${aws_elb.hoge.dns_name}"
    zone_id                = "${aws_elb.hoge.zone_id}"
    evaluate_target_health = "true"
  }
}
```

## 問題発生
`aws_elb.hoge.zone_id` の値と Route53の `Alias Hosted Zone ID` が違う値が設定されていました。
そのためTerraform planを実行すると毎回変更が検知されてしまいました。

## AWS Supportに連絡
ELBのHosted zone idとRoute53のAlias Hosted Zone IDは関連性がないと返答をいただきました。

## 勘違いした際のポイント
### 同じケースもある
ELBのHosted zone idとRoute53のAlias Hosted Zone IDが同じのケースがあります。
詳細は後で説明します。

### Terraformの仕様
https://www.terraform.io/docs/providers/aws/r/route53_record.html

```
zone_id - (Required) Hosted zone ID for a CloudFront distribution, S3 bucket, ELB, or Route 53 hosted zone. See resource_elb.zone_id for example.
```

こちらに書いてあるがAliasTargetのHostedZoneIdは作成時は必須ではない、削除する時だけ指定する必要がある
http://docs.aws.amazon.com/cli/latest/reference/route53/change-resource-record-sets.html

しかしTerraformでは作成時にも `alias.zone_id` の指定が必要である

## 何故違うのか
Alias Hosted Zone IDで表示されているIDはdualstackのIDです。
dualstackはIPv4とIPv6両方対応したDNS名です。
つまりELBの画面で表示されているHosted zoneとは別物です。
IPv4だけの時も発生する可能性はあるそうです。

## まとめ
AWSのマネジメントコンソールからRoute53を変更するとdualstackが自動的に付与されます。
そのため後からTerraformで実装すると今回のようなケースになるかと思います。
仕様を把握するまでかなり混乱しました。

レコードを削除する時に、ELBの値を元に削除しようとするとトラブルが発生する可能性があるので注意が必要です。
Looking for projects to partecipate in Japan ( 日本でプロジェクトを見つけます！)

皆さん、こんにちは!
私はFabrizioです。元気？

I'm currently looking for collaboration in projects with japanese developers small teams or start up. I'm currently living in Italy but I would like to move as soon as possible to Tokyo ( Shibuya ) and I would like to start having relationship with japanese programmers and projects. My main skills are PHP, Ruby, C, C# and Javascript.
I developed mainly intranet web app and mobile hybrid apps. My english skills are good and 
日本語を勉強しています.

私のLINEとSKYPE IDはFabral09てす。

Let me know if there is someone interested. For now,


Ciao Ciao!  ( Bye Bye ) :D


Fabrizio
Rubyで Google のMeasurement Protocolを一通り触ってみる

## 概要
　Measurement Protocol とは、ユーザーの利用状況に関するオフラインのデータを、GAサーバーに直接送信するための、データフォーマットである。Measurement Protocolで送信されたオフラインデータは、GA上のデータと結合し分析することが可能となる。ここで紐付けられたデータは、AdWordsでも利用でき、広告出稿の最適化(DCO: Display Campaigin Optimizer)にも活用することができる。

　なお、Measurement Protocolでのデータ送信においては、Google Analytics等と異なり、Oauth2認証は必要でない。認証に必要なデータは、全て payloadに含まれている。

## データ送信に必要な要素

```
# データ送信内容のサンプル
User-Agent: user_agent
POST https://www.google-analytics.com/collect
payload_data
```

簡単に利用する際に、必要な要素は大きく下記２点である。

- トランスポート
- ペイロード

トランスポートは、HTTPリクエストの方法とエンドポイントを決める。
ペイロードは送信するデータを決める。

## トランスポートについて
Measurement Protocol におけるデータの送信方法は、GET,POSTが存在する。
基本的にはPOSTを使えば良いと思うので、ここではPOSTで話を進める。
なおPOSTに関しても、一件ずつデータを送信する場合と、一気に複数件データを送る場合で、
エンドポイントが異なる

```
# 一件ずつ
https://www.google-analytics.com/collect
# 複数件
https://www.google-analytics.com/batch
```

※ GETリクエストでデータを送信する場合

https://developers.google.com/analytics/devguides/collection/protocol/v1/reference#get-

## ペイロードについて

下記のフォーマットで送信することができる。

```
#ペイロードのフォーマット
v=1 // Protocol Version
&tid=UA-123456-1 // Tracking ID: データ送信先を識別するID
&cid=5555   // Client ID: ユーザー固有のもの
&t=pageview // Pageview hit type:
```

## ペイロード
ペイロードとは、Measurement Protocolを使って、GA上で集計したいデータの塊。

```
# payload sample
v=1              // Version.
&tid=UA-XXXXX-Y  // Tracking ID / Property ID.
&cid=555         // Anonymous Client ID.

&t=event         // Event hit type
&ec=video        // Event Category. Required.
&ea=play         // Event Action. Required.
&el=holiday      // Event label.
&ev=300          // Event value.
```

payloadのサンプルは上記の通り。
ここで、payloadの中身はヒットタイプに依存して変化する。

### ヒットの種類

- pageview: 任意のユーザーが、特定のページを見たときとかに使う
- screenview: screenのトラッキングに利用
- event: ユーザーの行動を残す際に利用
- transaction: eコマースに利用
- item: eコマースに利用
- social: ソーシャルメディアの計上に利用.サイト内でイイねされた数の分析とか
- exception: 例外のトラッキングに利用
- timing: 速度の計測などに利用

ざざっと並べるとこんな感じ。
ここでは、event typeを使ってテストをしていく。


## 利用に必要な情報
- Tracking ID
- Client ID

Tracking ID が必要な人は、google analyticsに登録して取ってきて欲しい。
client ID の取得については、analytics.jsを使って取得する必要がある。

### client IDの取得
client IDを取得するコードはこのようになる。

```javascript
ga(function(tracker) {
  var cid = tracker.get('clientId');
  console.log(cid);
});
```

### テストコードの作成
動作確認に使ったコードがこちら。
client_idは ↑のjsのコードで取ってきたものを入れてください。

```ruby
require 'staccato'
client_id = 'xxx.xxx'
tracker = Staccato.tracker('UA-xxxx-Y', client_id)
hit = Staccato::Event.new(tracker, category: 'conversion', action: 'conversion')
response = hit.track!
puts response
```

### テストコードの確認

<img width="1018" alt="スクリーンショット 2016-11-22 午後9.13.49.png" src="https://qiita-image-store.s3.amazonaws.com/0/23606/50682dd0-fa9e-983e-8540-3ccd7df68466.png">


## 注意点
- AdWordsに紐付けることができる期限は、該当するユーザーのcookie_idが生成されてから10日間。
- **リクエストに問題があったとしても、Measurement Protocolから返されるレスポンスは2xx**

## 参考URL
https://developers.google.com/analytics/devguides/collection/protocol/v1/devguide
https://developers.google.com/analytics/devguides/collection/analyticsjs/events?hl=ja
ansible 2.2で使えなくなってしまったものまとめ

ansible 2.0でdeprecated（非推奨)になってしまったものが、2.2に上がって使えなくなってしまったので、全部修正する必要があります。直すの自体は簡単ですが、外部のplaybookに依存していると修正のPR出してもすぐにMergeしてもらえなかったりして面倒ではあります。

修正する際は、2.1などで試しにかけてみるのがdeprecatedと怒られて簡単です。
2.2に上げてしまうと、ただのsyntax errorとしか表示されなかったりします。

分かりやすく修正箇所をまとめていこうと思います。

### with_系のloopに使う変数は `"{{var}}"`で囲む
bare variablesと怒られてしまうやつ
2.2からはただのsyntax errorとしか出ないのでちょっと分かりにくくなります。

```diff
-  with_items: somelist
+  with_items: "{{somelist}}"
```

### with_系のloopの未定義変数の扱い
未定義の変数を置いているのがそもそもアレなので修正しましょう。
2.1まではloopを中断せずに警告が出るようになってます。
2.2では、`'var' is undefined`と出て失敗するようになりました。

### ansible-galaxyのrequirementsファイルはyaml形式にする
過去はtxt形式で書けましたが、yaml形式で書く必要があります。

[Ansibleを実用的に。ansible\-galaxyのロールをファイル管理しよう \- さくらのナレッジ](http://knowledge.sakura.ad.jp/tech/3118/)

### 辞書変数をtaskの全ての変数に割り当てるような使い方をしない
こちらは2.2でも`DEPRICATION WARNING`として怒られるだけです。
辞書変数自体をtaskの全ての変数に割り当てるような使い方をするのではなく、明示的にキーを指定しましょう。

```yaml
- hosts: localhost
  gather_facts: no
  vars:
    debug_params:
      msg: "hello there"
  tasks:
    # These are both deprecated:
    - debug: "{{debug_params}}"
    - debug:
      args: "{{debug_params}}"

    # Use this instead:
    - debug:
        msg: "{{debug_params['msg']}}"
```

### ホストパターンの区切りにはセミコロン(`;`)ではなく、コロン(`:`)もしくはカンマ(`,`)を使う
2.1までは、hostの定義に;を使えましたが、2.2では使えなくなっています。
（何も出ずに適用されないだけなので見逃しやすい）

和集合を表す場合は以下のように書き換えましょう

```diff
- hosts: dev;staging
+ hosts: dev:staging
```

### ホストの範囲指定には[x-y]ではなく、[x:y]を使う
番号が振られたサーバを範囲指定する際は以下のように書き換える
こちらは2.2でも`WARNING`が出ます

```diff
- hosts: web[5-10]
+ hosts: web[5:10]
```

### sudo/suの代わりにbecomeを使う
こちらも2.2では`DEPRICATION WARNING`として怒られるだけです。
[Ansible1\.9からはsudo/suの代わりにbecomeを使う \- Qiita](http://qiita.com/imoyoukan/items/12832aecd956d14b03f5)

### vars_promptのshort form形式を使わない
こちらも2.2では`DEPRICATION WARNING`として怒られるだけです。

```diff
- vars_prompt:
-   variable_name: "Prompt string"
+ vars_prompt:
+   - name: "variable_name"
+     prompt: "Prompt string"   
```

### include構文のtop levelで変数を定義しない

```diff
- - include: foo.yml
-     a: 1
+ - include: foo.yml
+   vars:
+     a: 1
```

### `any_errors_fatal`アトリビュートはtaskの中で指定していたら削除する
個人的に使ったことないですが、使っていたら削除しましょう。

### `environment`の辞書は`"{{var}}"`で囲む
```diff
- environment: bar_env
+ environment: "{{bar_env}}"
```

### tagsは、task includeのパラメータで指定する形式から置き換える
2.2以降だと、tagsは単に無視される（tagを指定しても実行されないことに注意)

```diff
- - include: foo.yml tags=a,b,c
+ - include: foo.yml
+   tags: [a, b, c]
```

### タスクの`first_available_file`オプションは置き換える
代わりに`with_first_found`オプションか`lookup`プラグインを使う
[Ansibleのplaybookで使用できるアトリビュートの一覧 \- Qiita](http://qiita.com/yunano/items/8494e785390360011a88#first_available_file)
Visual Studioメモ　キー入力待ち

# <i class="fa fa-cubes" style="font-size:1em;"></i> 概要
コンソールアプリを「デバッグの開始」時にキー入力待ちする方法。

コンソールアプリをVisual Studio上で実行するとき、デバッグなしで開始(`Ctrl+F5`)だとコンソールがキー入力待ちになり、出力内容を確認できます。
しかし、デバッグの開始(`F5`)だとコンソールがすぐに閉じてしまうため、出力内容を確認できません。
デバッグの開始(`F5`)時でもキー入力待ちをする方法を紹介します。

# <i class="fa fa-cubes" style="font-size:1em;"></i> コード
`Debugger.IsAttached`プロパティがTrueの時にキー入力待ちのコードを実行するようにします。

```CSharp
using System;

namespace ConsoleApplication001
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("hello");

            // デバッガーがプロセスにアタッチされているか？
            if (System.Diagnostics.Debugger.IsAttached)
            {
                Console.WriteLine("続行するには何かキーを押してください . . .");
                Console.ReadKey();
            }
        }
    }
}
```

```Text:実行結果
hello
続行するには何かキーを押してください . . .
```

# <i class="fa fa-book" style="font-size:1em;"></i> 参考サイト
* [Debugger.IsAttached プロパティ - MSDN](https://msdn.microsoft.com/ja-jp/library/system.diagnostics.debugger.isattached.aspx)
* [Console.ReadKey メソッド - MSDN](https://msdn.microsoft.com/ja-jp/library/system.console.readkey.aspx)
Docker入門3: Docker コンテナを建てる流れ

このページは WIP です。
途中ですが公開しています。

# 前置き
Dockerについてまだあまり知らないですが、せっかくなので他の人と共有できるようにアウトプットしてみます。
ツッコミ大歓迎です、どんどんおねがいします。

# フロー
## Dockerfile から
1. Dockerfile を作りこむ (参考: [Qiita: pottava: 効率的に安全な Dockerfile を作るには](/pottava/items/452bf80e334bc1fee69a))
2. Dockerfile を `build`
3. container を `create`
3. container を `start`
4. container を `stop` / `kill`
5. container を `rm`

## Docker Hub から (他のレジストリも含む)
1. [Docker Hub](https://hub.docker.com/) で目的のイメージを探す
2. (image を `pull`)
3. container を `create`
3. container を `start`
4. container を `stop` / `kill`
5. container を `rm`

# 各操作
## ps
`CONTAINER` に入る値は docker ps で表示される `CONTAINER ID` または `NAMES` のどちらでも指定可能。

## build
Dockerfile を `build` して image を生成する（[Docker: docker build](https://docs.docker.com/engine/reference/commandline/build/)）。

```bash
docker build [OPTIONS] PATH | URL | -
```
例:

- ```bash
docker build -t sample/image:tag .
```

    - `PATH` には Dockerfile を保存しているディレクトリへのパスを入れる。現在いる場所にある場合は `.` と入力する。
      Git リポジトリや Tarball も指定可能。
    - OPTIONS
        - `-t`, `--tag`: リポジトリ名とタグを指定する。後から使うためにもあったほうが良い。Docker Hub に `push` するのであれば命名規則があるので注意。
        - `-f`, `--file`: Dockerfileの名前を指定。（デフォルト: `PATH`/Dockerfile）
        - `--force-rm`: ビルド失敗後に、生成された中間コンテナを削除するか。(true/false。デフォルト: false。)
        - `--pull`: Dockerfile内のFROM句で指定したベースイメージの最新を毎回取得するか。(true/false。デフォルト: false。)
        - `--no-cache`: build時にcacheを使用しないようにするか。(true/false。デフォルト: false。)


## pull
[Docker Hub](https://hub.docker.com/) などから image をローカルに `pull` する([Docker: docker pull](https://docs.docker.com/engine/reference/commandline/pull/))。

```bash
docker pull [OPTIONS] NAME[:TAG|@DIGEST]
```

## create
  container を `create` する。

## start
`create` (`stop`) した container を `start` する。

```bash
docker start [OPTIONS] CONTAINER [CONTAINER...]
```
- OPTIONS
    - `-a`, `--attach`: 起動と同時にコンテナへアタッチする。（アタッチのみでコマンド操作などはできない。）
    - `-i`, `--interactive`: 起動と同時にコンテナへアタッチする。（インタラクティブモードとなり、継続してコマンド操作などが可能。）

## run
  `create` + `run`。私の場合は `create` や `start` を使わず `run` で済ませています。
## stop
  `start` や `run` した container を `stop` する。
## kill
  `start` や `run` した container を `kill` する。
## rm
  container を `rm` (削除) する。

# 次回
~~未定。~~
ページを公開しました: [Docker入門4: 実際にDocker コンテナを建ててみる](http://qiita.com/y_k/items/9afd9f551f3b868ef2f5)

というかこのページをもうちょっとボリューム増やします。

# 参考
[Qiita: Gin: docker buildのオプションまとめ](http://qiita.com/Gin/items/dde3c3085f13f0a45c40)
[Qiita: kooohei: docker startコマンド](http://qiita.com/kooohei/items/f0352f408056861a8f74)
babel-preset-es2015をbabel-preset-es2015-node6に変えてビルドを早くする

Node.js 4.x系で作ってたWEBアプリケーションがあり、サーバーサイドでもbabelに`babel-preset-es2015`を噛ませて通してた。
これを 6系 にアップグレードしようと思ったんだけど、そういえば6系にしたら`import/export`以外はほとんどES2015サポートしてるはずと気づいた。
そうなってくるとbabelで無駄なトランスパイルがいっぱい走って時間の無駄なのでどうにかできないかなとおもってぐぐったらピッタリなライブラリがあった。
https://github.com/jhen0409/babel-preset-es2015-node6

普通に考えてこっちのほうが無駄が少ないので変更してみる。

## babel-preset-es2015 -> babel-preset-es2015-node6
まずはnodeのアップデート。2016/11/22現在のレコメンドバージョンということで`v6.9.1`を使うことにした。

```bash:console
$ nvm install v6.9.1
$ nvm alias default 6.9.1
```

次にpresetsをes2015-node6に置き換え。

```bash:console
$ npm install --save-dev babel-preset-es2015-node6
```

es2015-node6を入れて

```diff:.babelrc
   "presets": [
-    "es2015"
+    "es2015-node6"
   ]
```

babelの設定を書き換える。
以上。アプリケーションもうまく動いたので互換性は保てそう。

## ビルド時間計測
早くなるのは当たり前で、どれくらいはやくなったか試してみる。

### babel-preset-es2015
```bash:console
$ npm run build:server
[12:01:16] Starting 'build:server'...
[12:01:19] Finished 'build:server' after 2.9 s
```

### babel-preset-es2015-node6
```bash:console
$ npm run build:server
[12:03:36] Starting 'build:server'...
[12:03:38] Finished 'build:server' after 1.94 s
```

1秒短縮！トランスパイルしたあとのファイルも軽くなってオトク。

「サーバーサイドでわざわざbabel通すな」とか「まだimport使うな」のような天の声が聞こえてきそうですが、もし同じようなことをしている人は試してみるとストレス軽減できるかも。
指定したRDSインスタンスのinit_connectパラメーターのみ初期化する

以前は
[RDS(MySQL)でJSTを使う たった１つの冴えたやり方] (http://dev.classmethod.jp/cloud/aws/rds-local-time-zone/ )
にある通り、ストアドプロシージャを入れて init_connect から呼ぶ必要があったらしい。


だが、TimeZoneの変更をパラメータグループでできるようになった今では不要！
ようし、init_connectを初期化じゃ！
と思ったが、AWS Mangaement Consoleからでは、初期化できなかった(´・ω・`)

以下のように、AWS CLIで実行することで解決。
--no-reset-all-parametersをつけないと大惨事になるので注意。

* 書式

```
aws rds reset-db-parameter-group --db-parameter-group-name <パラメータグループ名> --no-reset-all-parameters --parameters ParameterName=init_connect,ApplyMethod=pending-reboot --region <リージョン名>
```

*  実行例

```
$  aws rds reset-db-parameter-group --db-parameter-group-name rds-test --no-reset-all-parameters --parameters ParameterName=init_connect,ApplyMethod=pending-reboot --region ap-northeast-1
{
    "DBParameterGroupName": "rds-test" 
}
$ 
```
Chromeで文字化け。四角いはてな、豆腐文字？の直しかた

検索しても中々解決にたどり着けなかったのでメモ。
ChromeでGoogle関連（AdminやFirebase等）のページを閲覧したときに豆腐文字になる現象がありました。

<img width="585" alt="welcome-firabase.png" src="https://qiita-image-store.s3.amazonaws.com/0/6558/26286e4e-2004-35d3-9cb0-b81989569155.png">

Chromeで指定されているフォントが原因だったようです。
Sans-serif fontがHelveticaになっているので、El Capitanより追加されたHiragino Sansあたりに変更しておきましょう。

[Chrome] > [Preferences...] or `⌘,`

<img width="526" alt="Settings.png" src="https://qiita-image-store.s3.amazonaws.com/0/6558/a8ecadfb-946d-45dd-24c4-6a426ec8c1bb.png">

<img width="644" alt="Settings 2.png" src="https://qiita-image-store.s3.amazonaws.com/0/6558/5b36daad-d678-9bfa-7643-e307be46cad6.png">

<img width="479" alt="Settings 3.png" src="https://qiita-image-store.s3.amazonaws.com/0/6558/bc724448-f2dd-cbf7-0fbb-a0e279f73700.png">

***

<img width="527" alt="welcome-firebase.png" src="https://qiita-image-store.s3.amazonaws.com/0/6558/ec7f7421-29ce-a3cb-1b34-25a605aafc51.png">

直りました。
RPGツクールMVの十字キープラグインのメモリリーク対策

RPGツクールMVで作ったゲームをスマホゲームで遊ぶために、十字キーボタンを使いたくなることがあります。
`UCHU_MobileOperation.js` という、非常に便利な十字キープラグインがあり、私はありがたく使わせていただいております。

なお、ダウンロードは↓のURLから出来ます。
http://uchuzine.x0.com/demo/


ですが、このプラグイン、1つだけ困った問題があり、設定を間違えるとメモリリークを起こしてゲームが死にます。
原因は、 `createMessageWindow` メソッドのオーバーロード時にメモリリークを起こしてることが原因で、
この回避策は、以下でも紹介されております。
http://tm.lucky-duet.com/viewtopic.php?t=371

ですが、いちいちコードを修正するのは大半の人は面倒くさいでしょう。
この回避策の他に、回避できる方法があるので説明します。

プラグインの一覧を開き、 `UCHU_MobileOperation` の設定画面を開きます。
`HideButton OnMessage` というパラメータを探し、値を `true` から `false` にして下さい。

![スクリーンショット 2016-11-22 20.38.34.png](https://qiita-image-store.s3.amazonaws.com/0/9206/306c81db-6748-0313-88a0-25e4c8c0ebf6.png)

これだけでゲームが飛躍的に安定します。
この十字キープラグインを利用してる方は一度お試ししてみるのをオススメします。
TableauでBigQueryのTABLE_DATE_RANGEを使う方法


TableauでデータソースをGoogle Bigqueryにする際にTABLE_DATE_RANGEを使いたい！
そうじゃないと毎回フルスキャンでコストが・・・。なんてことにならないように

# 前提

BigQueryのテーブルは以下のような形で`yyyymmdd`が入っているとします

* weblog_20161118
* weblog_20161119
* weblog_20161120

# 手順

それではTableauの設定手順です。

## パラメータを作成

Tableauで参照する日付のFrom（開始）とTo（終了）を作成します。

![tableau1.png](https://qiita-image-store.s3.amazonaws.com/0/48307/e52c6ebc-dae1-e0ee-b448-8bed7a9adee6.png)

## カスタムSQLでパラメータを埋め込む

`from_date`, `to_date`のパラメータを使い、以下のようなSQL設定します

```sql
SELECT
  *
FROM (
  TABLE_DATE_RANGE(
    [dataset].weblog_,
    TIMESTAMP(<パラメーター.from_date>),
    TIMESTAMP(<パラメーター.to_date>)
   )
)
```

あとはパラメーターコントロールを表示してあげれば完了です。

![tableau2.png](https://qiita-image-store.s3.amazonaws.com/0/48307/dca9c9eb-8124-10e1-9dfc-35721d3d3e27.png)

# さいごに

パラメータは直接入力です。（なんでも指定可能です）
存在している日付だけ指定できるようになんとか改善したいものです。

というか、こんな形ではなくもっとスマートにできる方法があれば教えてください
Groovyスクリプトの配布方法

※過去のブログ記事の移行

[テーブルデータ入れ替えツール](https://gist.github.com/seriwb/aa6626e54d3aa2bf4842)を配布しようとしたとき、groovy-allのjarを使おうとしてハマったネタ。


## jarの場所
そもそもどこにあるのかわからなかった。。
てっきりlib配下にでもあるのかと思っていたら、そんなことはなく、embeddableフォルダ配下にあった。
※Windows8にデフォルトインストールだと以下

```
C:\Program Files (x86)\Groovy\Groovy-2.1.5\embeddable
groovy-all-2.1.5.jar
```

※同フォルダ配下にある「groovy-all-2.1.5-indy.jar」はinvokedynamicに対応したjarの模様。
invokedynamicってなんぞ？簡単に言うと効率化が上がったバイトコードみたい。

- http://www.oracle.com/technetwork/jp/articles/java/dyntypelang-427994-ja.html

## -jarだとCLASSPATH指定できない？！
alljarを使う場合の書き方は以下のようになるのですが、

```
java -jar lib\groovy-all-2.1.5.jar UpdateTable.groovy SOME_TABLE.csv
```

jarオプションの仕様でこの書き方をするとCLASSPATHが一切指定出来ません。
DBアクセスするので、CLASSPATHにJDBCのjarを通したかったのでこれだとまずくて、
色々考えましたが、普通にこんな感じのCLASSPATH指定でいけました。

```
java -cp .;lib\groovy-all-2.1.5.jar;lib\db2jcc4.jar groovy.ui.GroovyMain UpdateTable.groovy SOME_TABLE.csv
```

- libフォルダ配下に使いたいjarを置いたのなら、「-cp .;lib\*」でもいいはず。
- groovy-all-2.1.5.jarのMainクラスを知るためにはjarを解凍して、META-INF配下のMAINFEST.MFの末尾を見ればよいです。"Main-class: groovy.ui.GroovyMain"と書いてます。
- Groovyスクリプトに渡したい引数は、スクリプト名の後ろにスペース区切りで記入すればOK。

これでGroovyスクリプトを配布できますね！
macOS SierraでUS配列のEmacs使いがiTerm2に乗り換えて生きのこった話

だいたいこの記事の通りです。助かりましたありがとうございました。

http://qiita.com/naoya@github/items/56a34be85710f4ed5531

# 導入したツールとその設定

- Karabiner Elements
    - https://pqrs.org/osx/karabiner/
    - `caps lock` と `control` を入れ替えるために利用
    - :point_up: だけならOS標準機能でできるが、キーリピートの速度を変更するためにKarabiner Elementsを利用
- 英かな
    - https://ei-kana.appspot.com/
    - Karabiner Elementsでは未実装の機能を補完
        - `Command-L` -> 英数
        - `Command-R` -> かな
- iTerm2
    - https://www.iterm2.com/
        - `Terminal.app` から乗り換え
    - Karabiner Elementsでは未実装の機能を補完
        - `Command-L` と `Option-L` の入れ替え
        - `Option-L` を メタキーとして使う

# 実現したかったこと

- `A` の横は `control` じゃないと許せない
- コマンドキー単品入力で英数キー / かなキーの働きをさせたい
- ターミナル上でEmacsを使いたい
    - `Option` キーを Emacs の `meta` キーとして使いたい
    - `Option-L` と `Command-L` を入れ替えたい
    - `Command-Tab` の時はそのまま動作してほしい

# ちょっとだけ補足

- Karabiner Elements
    - 新しいMacBook Pro (TouchBar搭載のモデル） では、 `Preferences` -> `Devices` で `No product name` という、おそらくTouchBarを独立したキーボードとして認識している謎デバイスのチェックを外しておく必要がある。入ったままだと Karabiner が入力をフックして、ボリュームや明るさなどのシステムコントロールができなくなる。
- iTerm2
    - `Option` を `Meta` として使うには、 `Preferences` -> `Profiles` -> `Keys` で設定する（ちょっと探しちゃった）
        - `Let Option key acts as:` -> `+ESC`
- keyhac
    - [Alfred](https://www.alfredapp.com/)の起動キーバインド `Option-Space` を奪ってしまうので利用を見送り
Dockerコンテナでsystemd無しのSSH

## はじめに
DockerでSSHをやってみたら意外と難しかったのでメモ。systemdが起動していないコンテナ内ではsshdの起動に工夫がいるようですね。
調べたところやり方は何パターンかあるようですが、その中で筆者が個人的に気に入ったものを書きます。(筆者はCentOSのコンテナを用いました)

## コンテナ内からSSHで外部にログイン (コンテナがSSHクライアントになる場合)
コンテナ内から別のホストにSSHでログインするのは別に難しくありません。
まず、SSHクライアントをインストールします。

```bash
$ sudo yum -y install openssh openssh-clients
```

あとは普通に鍵を生成してから相手ホストに公開鍵を渡して、各々でパーミッションの設定をするといういつものやつです。

```bash
# コンテナ(クライアント)側の操作
# パスフレーズなしのRSA鍵を/root/.ssh以下に生成
$ ssh-keygen -t rsa -N "" -f /root/.ssh/id_rsa
# パーミッションの設定
$ chmod 700 /root/.ssh
# 公開鍵の転送
$ scp /root/.ssh/id_rsa.pub <ログインユーザ>@<相手ホストのIP>:~/.ssh
```

## コンテナ内でsshdを起動 (コンテナがSSHサーバになる場合)
難しいのはこっちです。コンテナ内では`systemd`が起動していないので、いつものように`systemctl start sshd`としてもエラーが出て上手くいきません。sshdを起動する際にちょっと工夫をいれます。

まずSSHサーバをインストールし、設定ファイルを書き換えておきます。

```bash
# SSHサーバのインストール
$ sudo yum -y install openssh openssh-server
# 設定ファイルの書き換え
$ sudo vi /etc/ssh/sshd_config
```

次にホスト鍵を生成します。systemdによってsshdが起動するわけではないので、自分でホスト鍵を生成する必要があるようです。設定ファイル内のホスト鍵の部分をコメントアウトしてしまう方法もアリです。

```bash
# ホスト鍵の生成 (必ずパスフレーズ無しにすること)
$ ssh-keygen -t rsa -N "" -f /etc/ssh/ssh_host_rsa_key
$ ssh-keygen -t dsa -N "" -f /etc/ssh/ssh_host_dsa_key
$ ssh-keygen -t ecdsa -N "" -f /etc/ssh/ssh_host_ecdsa_key
$ ssh-keygen -t ed25519 -N "" -f /etc/ssh/ssh_host_ed25519_key
```

次に`/var/run/sshd`と`/root/.ssh`の2つのディレクトリを作ります。

```bash
$ mkdir /var/run/sshd
$ mkdir /root/.ssh
```

そして、このコンテナに公開鍵を渡して`/root/.ssh`以下に置き、パーミッションの設定をします。

```bash
# Dockerホストからコンテナに公開鍵を渡す
$ sudo docker cp id_rsa.pub <コンテナID>:/root/.ssh

# 以下はコンテナ内で実行
# 公開鍵の名前とパーミッションの設定
$ cat /root/.ssh/id_rsa.pub >> /root/.ssh/authorized_keys
$ chmod 600 /root/.ssh/authorized_keys
# .sshのパーミッションの設定
$ chmod 700 /root/.ssh
```

最後にsshdを起動するのですが、ここで一工夫。__何の工夫もなしにsshdを起動しても一瞬デーモンが起動するだけですぐに停止してしまうため、sshdが常駐してくれません。__
そこで、こんなコマンドでsshdを起動します。

```bash
# sshdの起動 (sshdはフルパスで起動しないとエラー)
$ /usr/sbin/sshd && tail -f /dev/null &
```

`tail -f /dev/null`を`&&`で連結してあげることで、sshdが常駐してくれるようになります。
`/dev/null`は「ヌルデバイス」という特殊なファイルで、ここに書き込まれたデータはすべて捨てられて消去されるようになっています。このファイルをtailコマンドでずっと監視させることで、無限ループを実現しているわけです。これで、Ctrl+Cを押さない限りはsshdが停止することはありません。
こうすることでsshdが常駐し、外部からコンテナにSSHでログインすることが可能になります。(ポートフォワーディングの設定を忘れずに！)

## おわりに
Dockerコンテナだと、ちょっとSSHサーバ立てるだけでも面倒なことになるんですね…。完全に舐めてました。
紹介した方法以外にも、「/sbin/initを実行コマンドとした状態でコンテナを立てて`docker exec`コマンドでコンテナに入る方法」や、「supervisorを利用する方法」などいくつかあるようですが、今回紹介した方法が多分一番お手軽です。