OmniAICreator/Qiita-1.07M huggingface dataset:
Visual Studio CodeでPowerShell開発環境を整える

この記事では、Visual Studio Codeを利用して、PowerShellの開発に必要となる機能をセットアップする方法をまとめます。多くの人が普通のテキストエディタや、PowerShell ISEを利用していると思います。Visual Studio Codeを利用すればPowerShellのコードはもちろん書けますし、拡張機能をインストールすることによりデバッグ、コード補完等のPowerShell ISEと同等の機能を持たせることが可能です。
なお本記事を執筆した時点でのVisual Studio Codeのバージョンは 1.10.2 です。

# 1. プラグインの導入
下記のPowerShell拡張用のプラグインはコーディングに必要な一通りの機能（デバッグ、インテリセンス等、詳細は後述）が揃っています。

|プラグイン|名前とリンク|用途|
|:-------|:--------|:-------|
|![image](https://ms-vscode.gallerycdn.vsassets.io/extensions/ms-vscode/powershell/0.10.1/1489705732347/Microsoft.VisualStudio.Services.Icons.Default)|[PowerShell](https://marketplace.visualstudio.com/items?itemName=ms-vscode.PowerShell)|This extension provides rich PowerShell language support for Visual Studio Code. Now you can write and debug PowerShell scripts using the excellent IDE-like interface that Visual Studio Code provides.|

Visual Studio CodeでCtrl+Pでコマンドパレットを開き、下記のコマンドを実行し、プラグインを検索します。

```
ext install PowerShell
```

拡張機能ペインから「PowerShell」を選択し、「インストール」をクリック。これでVisual Studio CodeにPowerShellを開発するために必要と思われる機能が全て導入されます。

# 2. 機能紹介
本プラグインを導入することで使用できる機能について紹介します。
## インテリセンス（コード補完）
コマンドを補完してくれたり、
![image](https://qiita-image-store.s3.amazonaws.com/0/34410/86f05dae-784f-d54b-2b33-2f63825c91dc.png)
コマンドのパラメータ候補を表示してくれたりします。
![image](https://qiita-image-store.s3.amazonaws.com/0/34410/fb53fbb7-cb57-daa2-f63f-a3419c2b805a.png)
## 端末（Terminal）の自動表示
編集中のファイルがPowerShellファイル（*.ps1）の場合、画面下部にTerminalが勝手に起動します。
![image](https://qiita-image-store.s3.amazonaws.com/0/34410/6d7fa9b5-4776-ce46-4809-5793e332c8d9.png)
## デバッグの実行
ブレイクポイントの設置、F5デバッグ実行、ウォッチ式、変数の表示など、PowerShell ISEと同じレベルの操作が可能です。
![image](https://qiita-image-store.s3.amazonaws.com/0/34410/970d3720-c562-c736-6530-ef38d6243968.png)
## その他の機能
前述のプラグインのページから、機能一覧を転記しておきます。

> - Syntax highlighting
> - Code snippets
> - IntelliSense for cmdlets and more
> - Rule-based analysis provided by PowerShell Script Analyzer
> - Go to Definition of cmdlets and variables
> - Find References of cmdlets and variables
> - Document and workspace symbol discovery
> - Run selected selection of PowerShell code using F8
> - Launch online help for the symbol under the cursor using Ctrl+F1
> - Local script debugging and basic interactive console support!

# 2. おわりに
今回はPowerShellを対象としました。Visual Studio Codeは多くの言語をサポートしているリッチテキストエディタですよね。何をするにしてもこれ一つで十分かも。今後ももっと他の活用方法を探してみたいと思います。
Gitで変更のあるプロジェクトを見つける



`git status` を再帰的に全Gitディレクトリで実行して、変更のあるリポジトリを簡単に見つけたい。

と思ったので作りました。

[yukimemi/gsr](https://github.com/yukimemi/gsr)

`go get` でインストールできます。

(バイナリファイルもそのうち用意する)


```sh
$ go get github.com/yukimemi/gsr
```

使い方は簡単で

```sh
$ gsr [再帰的にチェックしたいディレクトリ]
```

とすると、 `git status` で変更のあるディレクトリだけ出力されます。
デフォルトでは、ディレクトリ名だけが出力されます。

```sh
$ gsr --status [再帰的にチェックしたいディレクトリ]
```

と、オプションをつけると、 `git status` の出力結果も出力されます。

ちなみに、 [再帰的にチェックしたいディレクトリ] を指定しなかった場合、
`ghq root` を対象にチェックします。

[motemen/ghq](https://github.com/motemen/ghq) を使っている人には便利です。


デフォルトの出力がディレクトリ名なのは、pecoとか使って移動したいからです。

例えば、 `.zshrc` に、こんな設定を書いてやると、

```zsh
function __filter() {
  peco | while read line
  do
    echo "Exec: [$@ $line]"
    $@ $line
  done
}
alias gsrl='gsr | __filter cd'
alias ghl='gsr --all | __filter cd'
```

**gsrl** で、 **ghq** で管理された変更のあるgitディレクトリに移動出来るようになり、 **ghl** で **ghq** で管理されたすべてのディレクトリに移動出来るようになります。

非常にべんり。

さらに、 リモートと差分のあるリポジトリも対象としたい場合、以下のオプションが使用できます。

```sh
$ gsr --ahead --behind
```

| オプション | 出力対象 |
|:----------:|:--------:|
| --ahead    | リモートより新しいものも対象にする |
| --behind   | リモートより古いものも対象にする |


僕は常にこのオプションを有効化して使うので、環境変数に指定しています。
`.zshenv` とかに書いておくと、実行時にオプションをいちいち指定しなくても有効化されます。

```zsh
export GSR_SHOW_AHEAD=1
export GSR_SHOW_BEHIND=1
```

これは、使ってるライブラリ [urfave/cli](https://github.com/urfave/cli) の機能みたいです。すごい。

- - -

##### 参考

[urfave/cli](https://github.com/urfave/cli)

[git statusを利用したリポジトリ情報のプロンプト表示](http://int128.hatenablog.com/entry/2015/07/15/003851)
Docker使用時のいろんなワンライナー

# 停止中のコンテナを全削除
```bash
docker ps -a | grep [E]xited | awk '{print $1}' | xargs -n 1 docker rm
```
# 稼働中コンテナのIPアドレス一覧を取得
```bash
docker ps | tail -n +2 | awk '{print $1}' | xargs -n 1 docker inspect --format '{{.Name}}  {{.NetworkSettings.IPAddress}}'
```

# リンク切れのデータボリュームを削除
```bash
docker volume ls -qf dangling=true | xargs -r docker volume rm
```
symlinks をしれっと差し替えるメモ


Ubuntu 16.04 にてタイムゾーンを JST にしようと思って見てみたら `/etc/localtime` がいつのまにか symlinks になってた。結構前から？

今までは

```bash
$ cd /etc
$ sudo cp ./localtime ./localtime.orig
$ sudo cp /usr/share/zoneinfo/Japan ./localtime
```

みたいにバックアップとってさらにコピってきてたんだけども、 symlinks って事でどうしよっかなー？と迷いまして。普通に削除して symlinks 張り直しても良いんだけども、一瞬でもシステムのファイルがない状態が出来るってのが気持ち悪いなー。なんて。
ほんのり悩んだ結果、このやり方に落ち着きました。

```bash
$ sudo ln -rfi /usr/share/zoneinfo/Japan /etc/localtime
```

`-f` ですでにファイルがあっても置き換える。けども `-i` があるから確認してくれる。
実際には削除してから symlinks 張り直してるかも知れないんんだけども、コマンド一発で終わらせれるのが個人的にスッキリ。

完全に備忘録 & 重箱の隅レベルのお話でした！
vimコマンド個人メモ


##戻す・進める
| コマンド | 動作 |
|:-----------|:------------|
|u|編集をひとつ戻す|
|U|行の編集を戻す|

##移動
| コマンド | 動作 |
|:-----------|:------------|
|w|次の単語の一文字目まで移動|
|e|次の単語の最後の文字まで移動|
|gg|ファイルの最初の行に移動|
|G|ファイルの最後の行に移動|
|数値G|数値の行番号に移動|
|%|対応する('{等に移動|
|ctrl-b|1ページ分上に移動|
|ctrl-f|1ページ分下に移動|


##削除
| コマンド | 動作 |
|:-----------|:------------|
|dw|カーソル位置から単語をひとつ分削除|
|d$|カーソルの位置から行の最後まで削除|
|d^|カーソルの位置から行の最初まで削除|
|d数値w|カーソル位置から数値の数だけ単語を削除|
|dG|カーソル位置からファイルの最後まで削除|
|dgg|カーソル位置からファイルの最初まで削除|
|dd|行全体を削除。削除した行はバッファに保存されるのでpでペースとできる|

##コピーペースト
| コマンド | 動作 |
|:-----------|:------------|
|y|ヴィジュアルモードで選択範囲のコピー|
|yy|行のコピー|
|yi'|'で囲まれている範囲をコピー("の場合はyi")|
|p|貼り付け|
|"0p|レジスタ番号0を貼り付け(dでのカットに影響されない）|
|"*p|クリップボードの貼り付け|

##挿入
| コマンド | 動作 |
|:-----------|:------------|
|i|カーソルの下で入力モードへ|
|a|カーソルの次で入力モードへ|
|r|カーソルの下の文字を置き換え（挿入モードに入らない)|
|cc|行を消して入力モードへ|
|c$|カーソル位置から行末を消して入力モードへ|
|cw|カーソル位置から単語の終わりまでを消して入力モードへ|
|ciw|単語を消して入力モードへ|
|ci'|「''」の中を削除して入力モードへ|
|ci"|「""」の中を削除して入力モードへ|
|C|カーソルより右を削除して入力モードへ|
|cit|タグ内を削除してインサートモードへ|
|A|行末移動インサート|
|I|行末移動インサート|
|S|現在行を消してインサートモードへ|
|O|現在行の前に行を追加してインサートモードへ|

##置き換え
| コマンド | 動作 |
|:-----------|:------------|
|:s/置き換えしたい単語/置き換え後の単語|行の中で単語を一つ置き換える|
|:s/置き換えしたい単語/置き換え後の単語/g|行の中で単語を全て置き換える|
|:%s/置き換えしたい単語/置き換え後の単語/g|ファイル全体で全ての単語を置き換える|
|:%s/置き換えしたい単語/置き換え後の単語/g|ファイル全体で全ての単語をひとつひとつ確認しながら置き換える|


##検索
| コマンド | 動作 |
|:-----------|:------------|
|/|カーソル位置から下を検索|
|?|カーソル位置から上を検索|
|n|次の検索結果へ移動|
|N|前の検索結果へ移動|

##NEDTree
| コマンド | 動作 |
|:-----------|:------------|
|Ctrl+w|treeとファイルウィンドウの切り替え|
|o|ファイルをひらく|
|\<C-w\> w | ウィンドウの移動 |

#その他便利コマンド
| コマンド | 動作 |
|:-----------|:------------|
|gg,=G|インデントを自動で調整してくれる|
|=|ビジュアルモードで選択した範囲のインデントを自動で調整してくれる|
|>>|現在行にタブを挿入|
|;|nnoremap ; :<C-u>call append(expand('.'), '')<Cr>jを.vimrcに書いた後で、;で空行を追加|

#neosnipet
| コマンド | 動作 |
|:-----------|:------------|
| \<C-j\> | 候補を移動 |
| \<C-k\> | 候補を決定 |
| \<C-k\> | スニペット表示後に、入力欄を移動（変数名など) |

#dein.toml
| コマンド | 動作 |
|:-----------|:------------|
| :call  dein#update()| プラグインのcallアップデート |

#テキストオブジェクト
| コマンド | 動作 |
|:------|:-------|
|i | まとまり全体。yi"だったら"もコピーされる|
|a | まとまりの内側。ya"だったら"の内側のみコピーされる |j

#commentary.vim
| コマンド | 動作 |
|:-----------|:------------|
| gcc | 選択範囲をコメントアウト・解除|
show innodb status で データーベース の中身がメモリに入りきっているか確認

## `show innodb status\G`

* [innodb_buffer_pool_sizeのチューニング：どれくらい割り当てる？](https://corporate.inter-edu.com/developper/1373)
* `show innodb status\G` は mysql 5.5 以降? 使えなくなった。
    * 代わりに `show engine innodb status\G` を使う。

```rb
mysql> show engine innodb status\G

BUFFER POOL AND MEMORY
----------------------
Total memory allocated 2195718144; in additional pool allocated 0
Dictionary memory allocated 1350348
Buffer pool size   131072
Free buffers       0
Database pages     128747
```

* Free buffersが0なので、確保したバッファープールを使い切っている。
    * 0 にならないように innodb_buffer_pool_size 値を増やす
    * もしくは 不要なデータを大量削除しておく。

* mysqldを再起動して確認。
* 暖気のためDBをdumpしてから`Free buffers`値を確認。

## 0.00 reads/s, 0.00 creates/s, 0.00 writes/s

```diff
 ----------------------
 BUFFER POOL AND MEMORY
 ----------------------
 Total memory allocated 626511882; in additional pool allocated 1048320
 Buffer pool size   32768
 Free buffers       28540
 Database pages     4224
 Modified db pages  0
 Pending reads 0 
 Pending writes: LRU 0, flush list 0, single page 0
 Pages read 350, created 3874, written 12035
+0.00 reads/s, 0.00 creates/s, 0.00 writes/s
 No buffer pool page gets since the last printout
```

* reads/s が 0であればDISKから読み出されていない。


## innodb_buffer_pool_size

* my.cnf で innodb_buffer_pool_size サイズを指定できる。
* 実メモリの 80% まで指定できるらしいが、ここで指定した値の110% を使用される仕様。
    * 自分は70% までとした。
CircleCI 2.0 で Node.js のテストを試す

## はじめに
CircleCI 2.0 のベータ版が使えるようになったので、試しに Node のテストを実行してみました。

従来に比べ柔軟な設定ができるようになっており、非常に好感触でした。

### 参考
- [CircleCI 2.0: Beta Access - CircleCI](https://circleci.com/beta-access/)


## CircleCI 2.0 で何が変わったか
ざっくりいうと、任意の Docker イメージを指定し、任意のビルドステップを実行できるようになりました。

同じく Docker ベースの CI である [Wercker](http://www.wercker.com/) を使ったことがある方は、それと同じようなものを想像していただければ大丈夫です。

## 設定ファイルの比較
CircleCI 2.0 では、従来の設定ファイル `circle.yml` とは、全く異なる形式で `.circleci/config.yml` に設定ファイルを置きます。

### CircleCI 1.0
CircleCI 1.0 では、Node のテストを回す時に以下のような設定ファイルを記述していました。

```yaml
machine:
  node:
    version: 6.10.0
  environment:
    PATH: "${PATH}:${HOME}/${CIRCLE_PROJECT_REPONAME}/node_modules/.bin"

dependencies:
  cache_directories:
    - ~/.cache/yarn
  pre:
    - yarn --version
  override:
    - yarn

test:
  override:
    - yarn run build
    - yarn test
```

#### 参考
- [Using Yarn (the npm replacement) on CircleCI](https://circleci.com/docs/1.0/yarn/)

### CircleCI 2.0
上記 CircleCI 1.0 と同じことをする設定ファイルを下記に記載しました。

CircleCI 2.0 では、ビルド・テストで実行する Docker イメージに任意のものが設定できます。

今回は、公式に提供されている `node:6.10.0` (Ubuntu based) のイメージを使いました。

```yaml
version: 2
jobs:
  build:
    working_directory: ~/workspace
    docker:
      - image: node:6.10.0

    steps:
      - checkout
      - restore_cache:
          key: projectname-{{ .Branch }}-{{ checksum "yarn.lock" }}
      - run:
          name: System information
          command: |
            echo "Node $(node -v)"
            echo "Yarn v$(yarn --version)"
      - run:
          name: Install dependencies
          command: yarn
      - run:
          name: Build
          command: yarn run build
      - run:
          name: Test
          command: yarn test
      - save_cache:
          key: projectname-{{ .Branch }}-{{ checksum "yarn.lock" }}
          paths:
            - ~/workspace/node_modules
            - ~/.cache/yarn/
```

#### 所感
全般的に記述は長くなっていますが、設定の柔軟度がかなり上がっていて個人的には大変嬉しいです。

設定ファイルの記述を短くしたい場合は、Docker イメージ自体を自作して別のものにすればよいだけなので、そこ大した問題にはならないと思っています。

また、任意のファイルの内容に基いてキャッシュのキーを自前で制御することができるので、知らない間にキャッシュが悪さすることも無くなりそうです。

ビルド速度も、特に遅くなったとは感じませんでした [^1]。

#### 参考
- [Migrating from 1.0 to 2.0](https://circleci.com/docs/2.0/migrating-from-1-2/)
- [2.0 Project Walkthrough](https://circleci.com/docs/2.0/project-walkthrough/)
- [library/node - Docker Hub](https://hub.docker.com/_/node/)
- [docker-node/6.10/Dockerfile](https://github.com/nodejs/docker-node/blob/debf4ea17cee8c078df632e975ea69f1969094c0/6.10/Dockerfile)

## まとめ
CircleCI 2.0、かなり良さそうな雰囲気です。

現時点では一部足りてない機能があるかもしれませんが、正式リリースの頃にはきっと解決しているはず (と信じています)。

興味がある方は、ぜひ触ってみて下さい。

[^1]: 採用する Docker イメージによって変わりそうです。試してみて下さい。
gitのデフォルトメッセージに前回のメッセージを入れておく

IntelliJなどでコミットする時に、デフォルトで前回のコミットメッセージが出ているのがなかなか便利なので、それをコマンドラインのgitのコミットでもやってみた。

`prepare-commit-msg`hookを使って実現する。
前回のコミットメッセージにしたくないこともあるので、デフォルトではコメントとして表示することにする。

## 環境
* Mac OS X Yosemite 10.10.5
* Git 2.11.1

## gitテンプレートディレクトリを作成
特定のレポジトリではなく、PC上で扱う全てのレポジトリのコミットをhookするため、グローバルの.gitテンプレートディレクトリを準備する。
（なお、特定のレポジトリでだけhookしたい場合は、以下で作るpre-pushファイルをレポジトリの`.git/hooks/`におけばよい）

```bash
mkdir -p ~/.git_template/hooks
```

## .gitのテンプレートに.git_templateを指定

```bash
git config --global init.templatedir ~/.git_template/
```
これで新たにgitレポジトリを作ったりcloneすると.git_templateディレクトリの設定が有効になる。

## hookファイル作成
```bash
vi ~/.git_template/hooks/prepare-commit-msg
```

内容は以下のようにする。

```bash
#!/bin/sh

if [ "$2" == "" ] ; then
  git log > /dev/null 2>&1
  # 初回のコミットじゃなかったら
  if [ $? -eq 0 ]; then
    # 前回のコミットメッセージをデフォルトに設定
    echo "\n# `git --no-pager show -s --format=%B HEAD | awk -v RS='\n' -v ORS='\n# ' '{print}'``cat $1`" > $1
  fi
fi

```

### 内容
`$1`がコミットメッセージ用のファイル名になっている（`.git/COMMIT_EDITMSG`など）。


```bash
git log > /dev/null 2>&1
```
↑初回のコミットかどうかの判定用。

```bash
git --no-pager show -s --format=%B HEAD
```
↑一つ前のコミットメッセージ

```bash
awk -v RS='\n' -v ORS='\n# ' '{print}'
```
↑改行を「改行# 」に変換。

## hookファイルのパーミッション変更
パーミッションを変えて実行可能にする
これをしないとhookされない。

```bash
chmod +x ~/.git_template/hooks/prepare-commit-msg
```

## 結果
以上の設定をすると、commitする際に
```
  1
  2 # first commit
  3 #-
  4 #-
  5 # Please enter the commit message for your changes. Lines starting
  6 # with '#' will be ignored, and an empty message aborts the commit.
  7 # On branch master
  8 # Changes to be committed:
  9 #»------new file:   b.txt
 10 #
```
のように前回のコミットメッセージがコメントとして表示されるようになる。

## 参考
* 「githooks」 https://git-scm.com/docs/githooks
* 「issue番号を勝手にcommit commentに入れてくれるやつ」 http://qiita.com/jumbOrNot/items/9e63f4835b9335cbaf22
* 「コミットログに自動的にイシューナンバーを入れるGit Hooks」 http://mawatari.jp/archives/issue-number-to-the-commit-message-automatically
* 「How to make git log not prompt to continue?」 http://stackoverflow.com/questions/7736781/how-to-make-git-log-not-prompt-to-continue
* 「標準出力と標準エラー出力を闇に葬る」 http://unskilled.site/%E6%A8%99%E6%BA%96%E5%87%BA%E5%8A%9B%E3%81%A8%E6%A8%99%E6%BA%96%E3%82%A8%E3%83%A9%E3%83%BC%E5%87%BA%E5%8A%9B%E3%82%92%E9%97%87%E3%81%AB%E8%91%AC%E3%82%8B/
* 「改行コード変換をAWKで」 http://qiita.com/mori_taksi/items/170b59fd7340330f1e6f
教師無しimage to image　"Discover Cross-Domain Relations with Generative Adversarial Networks." のざっくりした紹介

#Discover Cross-Domain "Relations with Generative Adversarial Networks

最近機械学習の勉強をしていたら面白い論文がつい最近発表されていたので紹介させていただきます。
今日はunsupervised image to image の一種である
"Discover Cross-Domain "Relations with Generative Adversarial Networks"
https://arxiv.org/abs/1703.05192
のざっくりした紹介だけさせていただきます。
※ここではGANの説明は省かせていただきます。*1

今までは教師ありなimage to imageとして
"Image-to-Image Translation with Conditional Adversarial Networks"
https://phillipi.github.io/pix2pix/
などが世間を賑わせていました。
しかしこいつは面倒なことに対応する画像をラベリングすることでしか学習できないためデータセットを用意するのが大変という問題点があります。
今回の紹介するGANは unsupervised(教師無し)でもかなりの精度が出せるため是非紹介させていただきたいです。

ネットワーク全体は以下のようになっています。
<img width="399" alt="b834f63d0dfe5e68fbe240ac18321691.png" src="https://qiita-image-store.s3.amazonaws.com/0/155797/6b609cd6-10d9-5a34-d635-e9b94074a29f.png">


このGANのみそはGabとGbaをクロスさせ学習していくことで二種類の画像間から認識したいドメインを学習できるというところにあります。
新しい難しい理論は特に出ていません。
注意すべきところはGeneratorのloss関数に元の画像と復元画像との距離を考慮しているところです。
今まで出ていたunsupervised系よりも汎用性が高そうです*2。

発表されてから三日後にtorchpyでの実装が発表されていたので私も動かしてみました。
(21000 iteration)
https://github.com/carpedm20/DiscoGAN-pytorch

![21100_x_BA.png](https://qiita-image-store.s3.amazonaws.com/0/155797/ca539c8f-373f-f5f4-5831-8d0bdc5a9212.png)
![21100_x_BAB.png](https://qiita-image-store.s3.amazonaws.com/0/155797/a4eb12f6-c68f-d00c-c18e-90e04882d57b.png)
教師無しでここまでの精度が出せるのは感動です！

#まとめ
これ使えばラフ画to線画とかのデータセットも簡単に用意できそう。
今後もunsupevisedなimage to imageに注目していきたい。

---
*1 GANは以下の論文が数学的背景も書かれていてわかりやすいと思います。
https://arxiv.org/pdf/1406.2661.pdf

*2 unsupervised image to image 系で有名どころと言えば以下の論文があげられると思います
1,"Learning from Simulated and Unsupervised Images through Adversarial Training"
https://arxiv.org/abs/1612.07828
2,"Unsupervised Image-to-Image Translation with Generative Adversarial Networks"
https://arxiv.org/abs/1701.02676

1は元画像とrefine画像との距離を取っているので似たような画像間でしか難しいと思います。
2も汎用性は高いと思いますが、限られた範囲でのみだと思われます。
機械学習で賢いbotを作るには

#背景
機械学習の意味を知らなかったけど、ツイッターで見て興味がわいた。しかしインターネットを見てもよくわからなかった。本も高いものが多く、何を買ったらいいのかもよくわからなかった…ので知人の知人（詳しい）から、2時間で大体を教えてもらった。それを自分の理解を深めるためにもまとめようと思った。
#目的
賢いbotを作る（siriみたいな／大好きなあのキャラクターにしゃべってほしい）
#流れ
入力文章→（特徴抽出）→入力の特徴→（変換）→対応する特徴→（文章に変換）→出力文章

#機械学習の流れの理解（自分の理解）
##数値列に変換
###どの部分？
入力文書→★（入力のID列）→（変換）→★（出力文書のID）→出力文書
★の部分
###種類
(1)入力文書に一番近い”事前に登録しておいた文”のID列にする
(2)単語（正確には形態素）に分解して、単語毎のIDの列にする
(3)文字毎に分解して、文字のIDの列にする

(1)だと、
入力：おはよう/今日も/いい/天気/だね
###データベース
1:おはよう
2:今日
3:良い
4:天気
入力したやつをid列に：1/2/3/4

ここらへんは、
http://developer.yahoo.co.jp/webapi/jlp/ma/v1/parse.html
https://labs.goo.ne.jp/api/jp/morphological-analysis/
を使って頑張れば実現できそう


1:おはよう
2:今日
3:も
4:良い
5:天気
6:だね←キャラクターの特徴を表すことができる要素になったりする

逆に出力の辞書は、ID-返信文章にすればいい。

##ここまでできたところ

##変換
###どの部分？
 [1,2,3,4,5,6] → （変換） → [1]
この部分
###一般化
 [1,2,3,4,5,6] =x
 [1]=y
として、よく見るわかりやすい形の
y=f(x)を目指していく。
###関数
とりあえず、一番単純に
f(x) = a * x
としておいたとき
yとf(x)が同じに近いほどよいから
y-f(x) = y - ( a * x )
を最小化(=0)する。

入力と出力のペアが一つだけだと
[1]-a*[1,2,3,4,5,6]=0
で解けるけど、xとyはとてもたくさん出てくるので…
y1 - f( x1 )  +  y2 - f( x2 )  +  y3 - f( x3 ) … を最小化する。

###f(x)について
f (x) = a * xでは簡単すぎるので、実際はもっと複雑にする

#私にはわからなかったこと
・f( x )の変換1つ分がニューラルネットワークでいう単層パーセプトロンと呼ばれるやつ
　→脳みその神経回路を計算機上で表現するときの、一つの単位がf( x )？
・この変換がたくさん重ねられたもの f1( f2( f3( x ) ) ) が多層パーセプトロンになってディープラーニング

次は、ディープラーニングについて理解したことを追記でまとめます。
知っておきたい！YAGNIの法則

この記事では***具体的なコード***については触れません。
コードを書いていくのに使える法則について紹介します。

また、この記事では「[プリンシプル オブ プログラミング](https://www.amazon.co.jp/%E3%83%97%E3%83%AA%E3%83%B3%E3%82%B7%E3%83%97%E3%83%AB-%E3%82%AA%E3%83%96-%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B03%E5%B9%B4%E7%9B%AE%E3%81%BE%E3%81%A7%E3%81%AB%E8%BA%AB%E3%81%AB%E3%81%A4%E3%81%91%E3%81%9F%E3%81%84%E4%B8%80%E7%94%9F%E5%BD%B9%E7%AB%8B%E3%81%A4101%E3%81%AE%E5%8E%9F%E7%90%86%E5%8E%9F%E5%89%87-%E4%B8%8A%E7%94%B0-%E5%8B%B2/dp/4798046140)」という本を読んだ上で、
自分が特に重要と思った箇所を、備忘録も兼ねて、書いています。

# YAGNIとは
早速ですが、タイトルにあるYAGNIとは「You Aren't Going to Need it.」の略であり、
日本語では、「それはきっと必要にならない」という意味になります。
この意味からピンときた方もいるかもしれませんが、
このことをコードを書く上での法則に落とし込むと以下のようなことになります。

# YAGNIの法則
コードを書く上で「これが後で必要になりそう」で***書いてはいけない***という法則です。
あくまで、***必要なものは必要になったときに書けばよい***という考えで取り組みます。
どんなに正確に予想しようとしたところで、結局のところ予想でしかないので、
先回りしたコードを書くのは不可能だということです。

# なんでダメ？
あらかじめ、いろんなことに対応できるようコードに書いておいても、利用されないことが大半です。利用されなかった場合、その対応にかかった***時間は無駄***になるということです。
また、予想しながら拡張性を考慮して、コードを書くということはコード内にが煩雑になり、使われないコードが混ざるだけで、***難解な手を加えにくいコード***になっていってしまうのです。

# コードは単純に！
コード書くときは、汎用性よりも単純性を選ぶようにしましょう。
まずは***使えること***を念頭におき、できるだけシンプルに作りましょう。
そうすれば、新たに機能を拡張するようなときが来ても、単純なコードを変更するだけになり、
汎用的な難解なコードに手を加えるより、はるかに簡単になっているはずです。

# まとめ
***コードはYAGNIの法則に従い、必要なものを単純に書くようにしましょう！***
Dockerコンテナ・イメージの削除


#コンテナの削除
```bash
docker ps -a
docker rm <container name> 
```

#イメージの削除

```bash
docker images
docker rmi <repository name> 
```

#イメージを削除しても空き容量が増えないのは...
このファイルのせい

   - [Docker for MacでDocker.qcow2のサイズがどんどん大きくなる問題](http://easyramble.com/docker-for-mac-docker-qcow2.html)

Dockerアプリを停止して削除。その後起動すれば再作成される。
OracleXEのDockerコンテナ起動(Mac)

```
macOS 10.12.3 で実行したコードを記載しています。
```

#Oracle XE Docker Image取得 & コンテナ起動

```
docker run -d -p 1521:1521 -p 10022:22 --name=oracle-xe wnameless/oracle-xe-11g
```

#2回目以降の起動/停止
```
docker start oracle-xe
docker stop oracle-xe
```

#DockerコンテナにSSH接続、SQLPLUS起動

```
ssh root@localhost -p 10022
sqlplus system/oracle
```
- sshパスワードは```admin```

#DB 接続文字列

```
jdbc:oracle:thin:@localhost:1521:XE
```

#参考
- [使用したDockerイメージのDockerHubページ](https://hub.docker.com/r/wnameless/oracle-xe-11g/)
Gemの簡易説明


![](https://ruby.tw/logo.gif)

## turbolinks
* pjaxができるようになるライブラリ

## jbuilder
* jsonフォーマットをDSLで定義できるようになる

## sdoc
* Rubyのソースコード内のRDocコメントから、HTML形式のAPIドキュメントを生成する

## slim-rails
* Rubyのテンプレートエンジンで、Jade風のインデントでHTMLテンプレートを作れるライブラリ

## bootstrap-sass
* BootstrapのSASS版

## font-awesome-rails
* Font-AwesomeのウェブフォントとスタイルシートをRailsのアセットパイプラインに追加

## devise
* Railsに認証機能をつけられるようになる

## devise_invitable
* Emailを使った招待機能を実現する

## device-bootstrap-views
* deviseのログイン画面などのビューをBootstrap3に

## cancancan
* deviseが提供するのは認証のみなので、権限管理(認可)をやる場合はcancancanを使う

## dotenv-rails
* .envファイルに環境依存の変数や非公開情報(外部APIのシークレットキーなど)を定義しておくと、Railsから環境変数として読み込める

## sidekiq
* メール送信やバッチ処理といった非同期処理を実現するキューライブラリ

## sidekiq-unique-jobs
* 同じ内容のsidekiq非同期処理を1つしか同時に走らせないように

## sidekiq-dailures
* 実行が失敗に終わったsidekiqの非同期処理をトラッキングできる1

## sinatra
* sidekiqのダッシュボードを表示するため

## heroku-api
* HerokuのAPIをRubyで扱うためのクライアントライブラリ

## puma
* 並行性が高くスレッドベースの高速なHTTPサーバ

## byebug
* Controllerなどのソースコードにbyebugと書くことで、そのコンテキストでシェルを起動できデバッグ

## pry-rails
* rails consoleコマンドで起動するデフォルトのREPLであるirbの代わってpryを起動

## pry-byebug
* byebugのようにステップ実行できるライブラリですが、irbではなくpryを起動

## bullet
* N+1問題(非効率的な問合せSQLが乱発する問題)を検知して知らせてくれるライブラリ

# *Rspec*
## rspec
* Rubyのテストフレームワーク

## rspec-rails
* RailsのModelやControllerのテストを書くためのライブラリ

## simplecov
* テスト結果に基づいてカバレッジレポートを出力
* spec_helper(rails_helper)に以下を追加するだけ

```
require 'simplecov'
SimpleCov.start 'rails'
```

## factory_girl_rails
* DBとの結合テストをするとき、テスト用データ(Fixture)を生成してくれるライブラリ

## faker
* 名前や住所といったダミーデータをDB初期化時につっこんでくれ

## rubocop
* Rubyコードを静的解析して、コーディング規約に沿っているかチェックするツール

## web-console
* ウェブビューからrails consoleにアクセスできる

## better_errors
* Railsのデフォルトエラー画面をより使い勝手の良いものにする

## xray-rails
* ブラウザ上の表示にどのビューが表示されているかを分かりやすく囲って表示してくれる開発ツール

## spring
* Railsのアプリケーションプリローダで、テストやrakeタスクの起動を高速化

```
# setup
bundle exec spring binstub --all
# start
bundle exec spring server
bundle exec spring status
bundle exec spring stop
# rspec
bundle exec spring rspec
```

## spring-commands-rspec
* springにrspecコマンドを追加して、RSpecを高速化

## listen
* ファイルの変更を検知してそれをフックに何か処理ができる

## spring-watcher-listen
* springのファイルシステムの変更検知方法をpollingからlistenに変更してくれる
Weblogicのdockerコンテナの起動 (Mac)

```
macOS 10.12.3 で実行したコードを記載しています。
git のローカルディレクトリが ~/git である前提でコードを記載しています。
```

#コンテナビルド用のスクリプトを取得
githubからoracleの提供しているdockerスクリプトを取得する。

```bash
cd ~/git
git clone https://github.com/oracle/docker-images.git
```

# 各種インストーラのダウンロード
コンテナイメージのビルド時に、JavaとWeblogicのインストーラが必要なので、ダウンロードしておく。

 - [Java(要Oracleユーザ登録)](http://www.oracle.com/technetwork/java/javase/downloads/server-jre8-downloads-2133154.html)
    - Linux x64　(server-jre-8u121-linux-x64.tar.gz)

 - [Weblogic 12.2.1 (要Oracleユーザ登録)](http://www.oracle.com/technetwork/middleware/weblogic/downloads/wls-for-dev-1703574.html)
    - Generic　(fmw_12.2.1.0.0_wls_Disk1_1of1.zip)
    - Quick Installer for Mac OSX, Windows and Linux　(fmw_12.2.1.0.0_wls_quick_Disk1_1of1.zip)


　**Weblogicは12.2.1で。**管理サーバ作成用のスクリプトが12.2.1用しか用意されていなかった。


# Java8のDockerイメージ作成
Weblogic Dockerイメージのベースイメージになる。

```bash
cd ~/git/docker-images/OracleJava/java-8/
mv ~/Downloads/server-jre-8u121-linux-x64.tar.gz ./

./build.sh 
```

# WeblogicのDockerイメージ作成
```bash
cd ~/git/docker-images/OracleWebLogic/dockerfiles/
mv ~/Downloads/fmw_12.2.1.0.0_wls_Disk1_1of1.zip ./12.2.1/
mv ~/Downloads/fmw_12.2.1.0.0_wls_quick_Disk1_1of1.zip ./12.2.1/

./buildDockerImage.sh -d -s -v 12.2.1
```
- macだと標準でmd5sumがインストールされていないので、-sオプションでmd5チェックサム検証をスキップしている

# Weblogicドメイン作成済みDockerイメージ作成

```Bash
cd ~/git/docker-images/OracleWebLogic/samples/1221-domain/
docker build -t 1221-domain --build-arg ADMIN_PASSWORD=<define> .
```
<define> は任意のパスワード. 8文字以上で、少なくとも1文字は数字か記号。ここでは`adminadmin!`

# データソース設定済みDockerイメージ作成

```bash
cd ~/git/docker-images/OracleWebLogic/samples/1221-domain-with-resources/
docker build -t 1221-domain-with-resources .
```

作成するデータソースの設定を変更する場合は以下のファイルを書き換える。

```properties:container-scripts/datasource.properties
dsname=DockerDS
dsdbname=default;create=true
dsjndiname=jdbc/DockerDS
dsdriver=org.apache.derby.jdbc.ClientDataSource
dsurl=jdbc:derby://localhost:1527/default;ServerName=localhost;databaseName=default;create=true
dsusername=
dspassword=
dstestquery=SQL SELECT 1 FROM SYS.SYSTABLES
dsmaxcapacity=1
```

#管理サーバコンテナの起動
```bash
docker run -d --name=wlsadmin -p 7001:7001 1221-domain-with-resources
```
以下のURLから管理サーバコンソールにアクセスできる。
　http://localhost:7001/console
 ユーザ名:```weblogic``` 
　　パスワード:　先ほど設定したパスワード。ここでは`adminadmin!`

#管理対象サーバコンテナの起動
```Bash
docker run -d --name=wlsmanaged --link wlsadmin:wlsadmin 1221-domain createServer.sh
```
数秒後に、管理サーバコンソールの```環境->サーバ```にアクセスすると、管理対象サーバが追加されていることが確認できる。


#参考
- [WebLogic on Docker](https://github.com/oracle/docker-images/tree/master/OracleWebLogic)
Botkit with MongoDBの開発雛形作りました（Docker利用）


タイトルの通りです。
Botkit x MongoDB のSlackボットの開発をDocker上で行えるように雛形を作りました。

https://github.com/affectry-inc/docker-botkit

READMEの[日本語版](https://github.com/affectry-inc/docker-botkit/blob/master/README.ja.md)も作ったので詳しい使い方はそちらを見ていただきたいのですが、
開発の経緯、というかモットー、というか意識したこと、だけここに記します。

## 経緯

Slack導入企業の増加が著しいのでどんどんボットを作りたいのですが、
いざ開発！と思っても着手するまでに色々と面倒だったりします。

なので思い切って雛形を作りました。

## 取り入れた技術要素
* Botkit -> Slack公式ライブラリ。Slackと一番相性いいはず。
* MongoDB -> チャットボットと相性抜群！（のはず）ドキュメント指向DB。
* Docker w/ Compose -> コラボレータが増えても大丈夫！！すぐにジョインできるよ！
* Slash commands -> これぞSlackボットの醍醐味！
* Action buttons -> マウス愛好家にも優しい。Slackはエンジニアだけのものではありません。

## 一番のブレイクスルー
Botkitオリジナルのstorage管理は`teams`と`channels`と`users`の３テーブル（Mongo風に言うとコレクション）しか対応していません！！
これは大問題！！ちょっとひねったボットを開発しようとすると、すぐに行き詰まります。

なので独自のMongoDBアクセス用ライブラリを作り、独自のコレクションを簡単に追加できるようにしました。

## お願い
改善点があればissueの起票やプルリクしていただけると助かります。

おしまい
Reactの概要


![](https://video-react.js.org/assets/logo.png)

## React.js
1. Just the UI
	* MVCのVにあたるUIのみを構築するためのもので、他にどういったライブラリと組み合わせるかは問わない
	* ボタンやテキストが多く、入力した値を即座に表示するような画面
2. Virtual DOM
	* 実際のDOMに対する操作を抽象化し、シンプルなコードでそれなりのパフォーマンスを提供する（仮想DOMが高速）
3. Data flow
	* 一方向のデータフローにより、従来の双方向データバインディングを実現するコードよりも簡素でわかりやすい
	* 規模が大きくなっても管理しやすい

http://steps.dodgson.org/b/2014/12/11/why-is-real-dom-slow/

## Virtual DOM
* 実際のDOMと対となる構造体（＝仮想DOM）を用意し、その構造体に対して処理を行う
* その差分だけ実際のDOMに反映
* Virtual DOMの実装
	* 構造体と、差分適用のアルゴリズムを合わせたものを
	* この構造体は、ただのJavaScriptのオブジェクト
	* このオブジェクトだけを気にかければ良くなるため、設計コストが下がる

## Flux
* データの流れを一方向にすること
* 各コンポーネントが表示すべきデータを個別に更新するのではなく、アプリケーションとして単一のデータフローを形成し、その流れに載せる
* 各コンポーネントの責務は受け取ったデータを表示するだけになる

## JSX
HTMLのマークアップのような記述の部分がJSXと呼ばれるもので、Virtual DOMで扱うためのオブジェクトを簡潔に書けるようにした独自記法

```
// jsxを使わない場合
render: function() {
  return React.createElement('a', { href: 'https://facebook.github.io/react/' }, 'Hello!');
}
 
// jsxを使う場合
render: function() {
  return <a href="https://facebook.github.io/react/">Hello!</a>;
}
```

## Build

```
npm install -g react-tools
jsx -x jsx --watch src/ dest/
```

## Reactiveプログラミング
* 「反応する側」と「認識する側」を分けて考え、反応に対して自動的に対応するという考え方
* ある要素が変更されたら、一方向の流れで、関係する要素も変更される

## 関数型言語
* 関数型っぽく書くと、ほぼ純粋な関数（式）の集合体になるため、疎結合となり、ステート（状態）の管理が簡単
* サーバー側の処理の場合、並列処理（マルチスレッド）が書きやすくなるなどのメリット

## コンポーネント指向

[shouldComponentUpdate()](https://facebook.github.io/react/docs/update.html)
[Immutable.js](https://facebook.github.io/immutable-js/)
dots.Career Meetup の参加レポート

# 概要
* dots.Career Meetup −どの道、エンジニアにはチームリーディング力/マネジメント力は必須?!勉強会−
* [https://eventdots.jp/event/614319](https://eventdots.jp/event/614319)
* 参加してきたのでざっくりと各質問の内容をまとめて感想を書きます
* どの会社が何をおっしゃっていたかまでは明記しません

# 1部 登壇者
* アクセンチュア株式会社 水上 廣敏 氏
* 株式会社メルカリ　新井 啓太 氏
* 株式会社DeNA Games Tokyo　平岡 洋祐 氏
* freee株式会社　加来 純一 氏

# モデレーター
* トレジャーデータ株式会社 田籠 聡 氏

# 2部 登壇者
* 株式会社サイバーエージェント　藤原 聖 氏
* 株式会社ネクスト　花多山 和志 氏
* Fringe81株式会社　佐藤 拓人氏
* 株式会社ブレインパッド 下田 倫大 氏

# モデレーター
* 株式会社インテリジェンス 小沢 宏美 氏

# 質問1: 自社エンジニアのキャリアパスは?
* マネージャー?
* マネージャーorスペシャリスト?
* スペシャリストのみ?
* マネージャーorスペシャリストor別のキャリア?

## 回答まとめ
* マネージャーとスペシャリストの定義が明確に分かれているところは半々ぐらい
* 給与に関してはマネージャーだけが高い。という状態ではなく、スペシャリストも同等、それ以上の評価が当然されている
* 役割だけでなく、一人一人の多様性を受けいれ、34の特性に振り分けて評価するようにしている。という会社もある
* 基本はみなスペシャリストの路線を歩み、挙手したものがマネージャーの道へ行く。という会社もあった

# 質問2: キャリアパス別
* スペシャリストコースがある会社のスペシャリストの定義
* マネージャーの定義

## 回答まとめ
* 境界線が明確になってないだけで、役割としてマネージャーとスペシャリストは存在している
* 明確に分かれているところはある一定の評価ラインまで達した際にメンバーに今後のキャリアプランを選んでもらうことが多い
* 分けてないところは何を持ってスペシャリストとするかは難しいと考えている
    * ただし周りに信頼、尊敬されていればそれはスペシャリストだとも思っている
* 自分のプレゼンスを高めて会社に貢献できる人はスペシャリスト
* 他人に興味がない、コミュニケーションが苦手な人はマネージャーは難しいかもしれない
* チームを通して、チームを成長させることを考えられるのはマネージャー

# 質問3: マネージャーからスペシャリストへの転向は可能であるか
## 回答まとめ
* 基礎力がもともとあるのであれば、現場復帰かつスペシャリストになることは難しくない
* とはいえ変化が激しい領域の場合はそれ相応の努力が必要となる
* 実際、転職してくる人でマネジメントしていて現場に戻りたい。という人はいる
* 転向できるかどうかは本人の意思と努力次第であり制度としては可能

# 質問4(1部のみ): 他社でマネジメントをやっていた。という人がテクニカルなことをやりたい。と転職しにきたらどうするか
## 回答まとめ
* 何をやりたくて、そのために何をやってきたのかを見る
* 結果が出ていなくともどういった形跡を残してるかは必要
* ただやりたい。でもやれていない。という人は仕事としてやり始めても厳しいと思う
* スペシャリストになるまでの期間が長いと感じれる人の場合、お互い幸せになれないので正直に伝える

# 質問5: 今後のエンジニアリング業界でこの能力は欠かせない。と思うもの
## 回答まとめ
* 変化の激しい業界なので何にでも対応できる適応力、そのための基礎力が重要
* とにかくトライ＆エラーができる人。それがないと成長しない
* マイクロサービス化が進んだことで全てのレイヤーを見れる能力は求められる
* エンジニアとしての好奇心を失わないこと。そしてチームワークを大事にできること
* スルー力と直感力。いろんな新しい技術が出てくる。全てに目を奪われず、これだ！と思う物を選べる力があると強い

# 質問6(1部のみ): ヒューマンマネジメントをやるマネージャーになりたいと思ったことがあるか
* うちの会社だとこうゆう人がヒューマンマネジメントをやってる

## 回答まとめ
* 大半の方が人と話すのが嫌だからエンジニアになったと回答。w
* しかし大きなことを為すには個人では無理だと感じ始める
* ヒューマンマネジメントが必要になる場面が出てくる
* ヒューマンマネジメントはサポータ、ツール色が強いので最初からなりたい。とはなりづらい気がする

# 質問7(1部のみ): ヒューマンマネジメントをやる人はエンジニアの能力がいるのか
* 全く技術力がない人はいないと思う
* とはいえ時間が経っていくと基礎力があっても考え方は変わるともう
* そうゆうことをキャッチアップしてないヒューマンマネジメントは問題ないのか

## 回答まとめ
* 現場感を保つ程度には必要。逆を言えばそれ以上は必要ないかもしれない
* 実装レベルの理解はできてないかもだが、多少のキャッチアップをしていることで助け船は出せる
* ヒューマンマネジメントに振り切ってしまっても良いとは思うこともある
* コーチングなど磨くべきスキルもヒューマンマネジメントには存在する
* 相手がエンジニアである以上、エンジニアスキルを求められる可能性は高い。

# 感想、まとめ
* ヒューマンマネジメントはどの会社としても重要と捉えておりました
    * そしてそのスキルはエンジニアスキルの延長ではなく、ちゃんと別スキルとして認識されてました
    * ただし、関わるのがエンジニアである以上、メンバーからは求められる可能性もあるためエンジニア領域の情報キャッチアップは継続すべきなのだろうと思いました
* スペシャリストはとにかく努力した形跡や結果、もしくは周りの人の信頼、尊敬がなければなれないというのがどの会社も持ってるものに感じました
* マネージャーだけが給与が高い。という事実はどの会社にもありませんでした。そしてスペシャリストも非常に重宝されていました
* マネージャーからスペシャリストになるのは努力が必要。という会話はありましたが逆のパターンがあまり話題にならないのは気になりました
    * マネジメントにもスキルが求められるのであれば、逆も努力や実績がなければなれないべきと思っています
* マネージャであろうとスペシャリストであろうとトライ&エラーをすることと情報をキャッチアップすること。これが重要で意識せねばならない。と今回のセミナーで一番強く感じたところでした
MySQLのdockerコンテナ起動(Mac)

```
macOS 10.12.3 で実行したコードを記載しています。
```

# docker イメージの取得

```bash
docker pull mysql
```

# dockerコンテナの起動
```bash
docker run --name mysql -p 3306:3306 -e MYSQL_DATABASE=dev01 -e MYSQL_USER=dev01 -e MYSQL_PASSWORD=dev01  -e MYSQL_ROOT_PASSWORD=admin -d mysql
```

# MySqlのコマンドプロンプト起動
終了時に削除するオプションでコンテナを起動して、MySqlクライアントとして使用する。

```bash
docker run --link  mysql:mysql -it --rm mysql bash
mysql -u root -padmin -h $MYSQL_PORT_3306_TCP_ADDR dev01
```

#参考
http://dqn.sakusakutto.jp/2015/10/docker_mysqld_tutorial.html
LINQライブラリまとめ

統合言語クエリ「[LINQ](https://msdn.microsoft.com/ja-jp/library/bb397676.aspx)」は非常に便利な機能なので、C# 以外の言語でも使えたらなあと思うことがあります。

実は結構いろんな言語に移植されているので、一覧にまとめておきます。

※「LINQ って何？」と思った人は、別記事「[はじめての LINQ](https://qiita.com/nskydiving/items/c9c47c1e48ea365f8995)」を参照してください。

# LINQライブラリ一覧
| 言語 | LINQライブラリ |
|:----|:-----------:|
| Javascript | [jLinq](http://www.hugoware.net/Projects/jLinq)<br>[JSLINQ](https://github.com/Marak/JSLINQ)<br>[linq.js](http://linqjs.codeplex.com/)<br>[LINQ to JavaScript](http://jslinq.codeplex.com/)<br>[JSINQ](http://www.codeplex.com/jsinq) |
| TypeScript | [LinQ for TypeScript](https://github.com/kutyel/linq.ts)<br>[LINQ](https://github.com/ENikS/LINQ) |
| Java | [Jinq](https://github.com/my2iu/Jinq) <br>[linq4j](https://github.com/julianhyde/linq4j)<br>[JaQue](https://github.com/TrigerSoft/jaque)<br>[jLinqer](https://github.com/k--kato/jLinqer)<br>[JaQu](http://h2database.com/html/jaqu.html)<br>[Querydsl](http://www.querydsl.com/) |
| PHP | [Pinq](https://github.com/TimeToogo/Pinq)<br>[YaLinqo](https://github.com/Athari/YaLinqo)<br>[Ginq](https://github.com/akanehara/ginq)<br>[PHPLinq](http://phplinq.codeplex.com/) |
| Python | [pynq](https://github.com/heynemann/pynq)<br>[asq](https://github.com/sixty-north/asq)<br>[linqish](https://pypi.python.org/pypi/linqish) |
| Go | [go-linq](https://github.com/ahmetb/go-linq) |
| C++ | [LINQ for C++](http://cpplinq.codeplex.com/)<br>[Linq](https://github.com/pfultz2/Linq) |
| Swift | [SINQ](https://github.com/slazyk/SINQ) |
| Objective-C | [LinqToObjectiveC](https://github.com/ColinEberhardt/LinqToObjectiveC) |
| Visual Basic | [LINQ](https://msdn.microsoft.com/ja-jp/library/bb385100.aspx) |
| F# | [LINQ](https://docs.microsoft.com/ja-jp/dotnet/articles/fsharp/language-reference/query-expressions) |
boot2dockerで端末再起動後にx509 certificate errorが発生して対応したこと


boot2dockerのディスク容量を増やす必要があったため、`~/.boot2docker/profile`を修正してVMを作り直しました。
その時ハマった記録。


## 環境

* OS: macOS Sierra 10.12.3
* boot2docker version: v1.8.0



## 問題が発生した手順

1. `boot2docker delete`
2. `boot2docker init`
3. `boot2docker up`
4. 端末再起動
5. `boot2docker up`


## 発生した問題

* VM再作成後、3で起動した時点では192.168.59.104だったDocker hostのIP Addressが、5の後は192.168.59.103になってしまう。
* 環境変数`DOCKER_HOST`のIP Addressを192.168.59.103に修正しても、x509 certificate errorになってしまう。
* 端末を再起動せず、`boot2docker down/up`しただけではIP addressは192.168.59.104のままになっており、正常に動作する。


```x509認証エラー
$ docker ps
An error occurred trying to connect: Get https://192.168.59.103:2376/v1.24/containers/json: x509: certificate is valid for 127.0.0.1, 10.0.2.15, 192.168.59.104, not 192.168.59.103
```


## 最終的に実施した問題解消方法

* 私がやった限りでは既存VMのIP Addressを修正することができなかったので、再度`boot2docker delete -> init -> up`でVMを作り直しました。


## 備考

* VMを再作成した際、IP Addressが変わっていた場合は、端末再起動後にIP Addressが古いものになってしまい、x509 certificate errorになる可能性があるのでご注意ください。
* もしVM再作成以外に直す方法があればコメントお願いします。


## 以下、足掻いた記録（蛇足です）

問題が発生した手順5の後、とりあえずDocker hostのIP Addressをコマンドで設定。

```
ifconfig 
 192.168.59.104 netmask 255.255.255.0 broadcast 192.168.59.255 up
```

当然だが動くようにはなった。

しかしboot2docker VMはCore Linuxで、IP AddressはDHCPで設定しているので、リース期限が来ると再び192.168.59.103が設定されてしまう。

設定を永続化しておきたいが、`boot2docker down`で設定が消えてしまう。

また、DHCPで強制的に192.168.59.104を設定しようとしたけどうまくいきませんでした。
UnicornとNginxの概要と違い

![](https://vko-online.github.io/stacks/images/Gunicorn.png "")![](https://shanoor.gallerycdn.vsassets.io/extensions/shanoor/vscode-nginx/0.3.1/1486352618196/Microsoft.VisualStudio.Services.Icons.Default)


## Unicorn
* Application server
* プロセス上で動作するサーバ
* masterプロセスとworkerプロセスがある
*  masterプロセスがアプリケーションのソースコードを保持。これをforkしたworkerプロセス群が実際のリクエストを処理
* ソースコードをロードするのがmasterプロセスのみであるため、起動が早い
* デプロイ時のダウンタイムがない
* プロセスにシグナルを送ることでサーバの起動関連を指示
* masterプロセスがUSR2シグナルを送られると、masterプロセスは自身を再起動。このとき新しいmasterプロセスをforkした新しいworkerプロセス群も生成

## Nginx
* クライアントからのリクエストを受け、なんらかの処理（SSLや圧縮など）を行なうWebサーバ
* 開発環境と本番環境の違いはリクエストの数で、unicornはworkerプロセスがせいぜい数個であるのに対し、nginxは数千ものコネクション数が存在

## 流れ
1. Webサーバ（nginxなど）からリクエストがunicornに渡される
2. unicornはRackをとおしてRailsアプリケーションのルータに処理を渡す
3. Railsアプリケーションの結果をunicornが受け取る
4. unicornはこれをWebサーバに渡し、最終的にクライアントへと渡る
Nginx→Unicorn→Rails→Unicorn→Nginx

## unicorn-worker-killer(gem)
ActiveRecordのキャッシュなどでメモリを使用すると、プロセス単位のメモリ使用量がどんどん増えてしまう
* メモリ使用量などを基準に自動でworkerプロセスを再起動

## Settings
http://post.simplie.jp/posts/83
TwitterAPIで特定ツイートの会話を取得する

# Q.どうしてこんな記事を
A.TwitterのAPIを触ってたらツイートに対するメンションを取る公式APIが無い事に気づいて、電子の海を漂ったけどいい感じの答えが無くて喚いてたらモンエナをキーボードにこぼして3回くらい自殺したので、こんな犠牲者を少しでも減らすために

# Q.どうすれば取得できるの
自分の頭では以下のものしか思いつかなかった
ただしどれもスマートじゃない　というか公式APIが無い以上スマートにはできない気がする(そういう方法があったらこっそり教えてください)

## 方法1.SearchAPIを使う
シンプル　探すとこの方法が一番ヒットするイメージ

公式API的には「何にメンションされてるか」はわからないけど「何にメンションしているか」はわかるのでそれを利用する

具体的にはin_reply_to_status_idという情報がそれに当たる

何かしらの検索条件でツイートを取得して、それぞれのin_reply_to_status_idを確認して目的のツイートのIDと一致していたらそれがメンションという話

検索条件は条件演算子が使えるからtoを活用するといいはず

一見効率悪そうに見えて死ぬほど効率悪い　でも一番まともかもしれない

自分はこれ見てよっしゃ使おうぜとはならなかったのできっと悪いフレンズ

## 方法2.公式Twitterの使ってるAPIを飛ばす
仮に使うなら自己責任で

公式Twitter( https://twitter.com/ )の会話を見る(ツイート押したときに出てくるポップアップのアレ)機能の時に使ってるAPIで情報が取れる

APIはこれ↓
conversation/show/:id

ただし公式以外がアクセスしようとすると怒られるので使うなら偽装しないといけない(多分　少なくとも自分の環境ではそうだった)

某有名非公式クライアントを自分も使ってるが、リクエスト見たらこの方法でやっててびびった
案外こういう危ない行為がメジャーなのかな　いつBANされてもおかしくないと思うけど

ちなみにやってることはアレだけど、書き方は一番シンプルだったりする

## 方法3.公式クライアントをスクレイピング
方法2で済ませとけばいいものを、「偽装して直接API投げたらバレやすいけどスクレイピングならバレにくいのでは」とか変な知恵を働かせた結果がこれ

公式クライアントで会話表示させてソース見てみればわかるけどツイートのID表示内包してる部分があるのでそれ使ってShowAPIに投げる感じ

テキストとユーザ名みたいな基本情報だけでいいならDOMを解析するだけで済む

正しく動いたのを確認したあと小一時間くらい自分の所業を反省したのでこれで地獄に落ちることはないと思う


# 結論
最良なのは公式のdeveloperになって公式API作ることだと思う

conversation/show/:idがまともに使えないのも古生代くらい前にテスト通ってる癖に放置してる原住民のせいなので、そういうのは根本的に変えるべきだと思う

というわけでTwitter社に入社した後アメリカでの生活に困らないように、今日から注文するピザのサイズを一段階上げようと思う
競プロ備忘録～codingame「ghost in the cell」～

2017年2月26日～3月5日に開かれた競技プログラミングコンテスト、[codingame「ghost in the cell」](https://www.codingame.com/leaderboards/challenge/ghost-in-the-cell/global)の備忘録です。
![gic.png](https://qiita-image-store.s3.amazonaws.com/0/146379/a00e957a-cb13-8444-3f3e-fe6bea25e2b3.png)


#  結果
世界24/3508位、日本3/81位でした。
今回のお題は、ロジスティクス（兵站）を競うゲームだったと理解しています。
![cdg2.png](https://qiita-image-store.s3.amazonaws.com/0/146379/f098ccc8-d542-cd10-f894-d133fa633918.png)


# 考えたこと・やったこと

**初日**
ぱっと見で、好きな部類のゲームでした。既存のゲームでは、下記のFlashゲームが一番近いんじゃないかと思います。
![a824a55f.jpg](https://qiita-image-store.s3.amazonaws.com/0/146379/d00e77c2-12b5-6627-5b94-6a2f0ecc6f9b.jpeg)
http://www.bubblebox.com/play/action/20130192.htm

この手のゲームは、自分のユニットをなるべく遊ばせないようにする（陣地からなるべく動かす、移動は最小限に）のが重要なのは知っていたので、スタートダッシュで最寄りの陣地からユニットを移動させるようにして暫定世界一を取りました。
![cdg1.png](https://qiita-image-store.s3.amazonaws.com/0/146379/543dd6ff-a0f6-e188-fa85-a285673c2ff1.png)

**2日目**
オブジェクト指向にリファクタリング。この時、初日のコードとまったく同じ挙動を維持します。（初日のコード結果がそのままテストケースになる。）
合わせて、コーナーケース部分の挙動の確認と、実装アイディアをメモっておきます。
↓実際のメモ（✓マークは、最終的に実装したもの。ついてないのは未対応。）
> ■ルール
一度取ったら、兵士0でも自分の陣地。
ボムは発射陣地は見えるので、ターン毎の着弾予測は可能。
距離は最大20。
兵士のバトル後にボムの爆発判定。
中立に同時についた場合は、プレイヤー同士で潰し合う。
> 
> ■必須
✓ターン毎の予測★
✓どっちの兵士数が多いか
✓どっちの生産力が多いか
影響の無い範囲で、常に飛ばしておく※隠しておく？
✓前線の考え方。最寄りの敵陣より数を減らさない。
✓前線に兵を集める
最短での兵力増強★
✓ぎりぎりでの兵力増強
incを早めるため、一箇所に集中して投資
ボムを投げたあとに即座に畳み掛ける
✓自陣単位ではなく、ターゲット単位で行動を決める。
広いステージではinc中心、狭いステージではincよりもアタック。
★後出しした方が良いステージの攻略
期待値を求める。距離と生産数の関係。
✓敵陣を攻めるときは、最寄りの陣地まで一度行く。
✓移動時間が元の以下なら経由地を挟む。
✓中立地は、最小コストになるタイミングで取る。
✓所有者が変わることを考慮した予測ユニット数を出す。
✓ボムが見えているとき、可能性のある陣地は、敵の襲来を相殺する。
✓ボムの着弾先に送らない。バグ
✓生産maxなのに兵を送らない事がある。
✓ボム時の兵士予測にバグ。
✓ボムの可能性があるなら、兵士を動かす
✓ボム時の敵兵相殺
密集ステージは、前線に兵士を残す。incも控えめ
☓id0は、自陣が十分整ってから攻める。
ボムのうち先に兵士を送らない
取り返せる陣地にボムを打たない。
> 
> ■やりたい
✓中央を足掛かりに攻める。
中央の立地がイマイチ（遠い）な場合は中央を後回しにする。
✓ボムの着弾地予測、ボム避け。
不利な状態からの挽回策（今は特に無い）
相手に中立地点の敵を倒させ、乗っ取る。
ボムの先投げ、ボムの後投げ。
攻防の集中する自陣にボムを打ち、敵の予測を外す。
ボムを打つと同時に敵に押し寄せる。
捨てる工場の判断。※行動の優先順
敵がまとまってきた時に、ちょうどボムで殺る。
取られてもいいから取り返す。
掠め取って、すぐ戻る。
ボムの初激2発打つか？

**3～5日目**
必須の実装アイディアをコードに起こし、防御力を高めていきます。
この工程は実装すればするほど単純に強くなるので楽しい。
1週間のコンテストなので、どれだけアイディアを実装できるかの勝負と考え、シミュレータや先読みは一切行わず、ルールベースオンリーで行こうと決めました。この実装戦略は当たりだったと思います。

**6～8日目（最終日）**
今回のゲームの核となる、ロジスティクス（兵站）を競いにいきます。
基本的に、攻める側は移動時間のロスがあるため、相手にきっちり守られるとユニット数の自然増加の分だけ損をします。ただ、有利な陣地を先取りすることでリードタイムを短縮でき、相手が対応仕切れない速度で攻めることができます。
有利な陣地とは多くの場合中央（id:0）の陣地です。
![cdg4.png](https://qiita-image-store.s3.amazonaws.com/0/146379/5d045ab7-c94b-0309-a338-ce1637e33a2e.png)


ただ、防御時とは異なり、攻めと引きのバランスが難しく、残りの時間で十分に完成度を高められませんでした。これは実装順の戦略ミスです。（もっと防御を完璧にしておくべきだった。）
結果、上位にもそこそこ勝つけど、下位にもそこそこ負けるAIとなり、レートを安定して稼げませんでした。
終戦。

## ソースコード

（githubアカウント作らないと…）

# 最後に

ここまで読んで頂きありがとうございました。
お題の「Ghost in the cell」は通期コンテスト化しているので、気になる方は参加可能です。
https://www.codingame.com/multiplayer/bot-programming/ghost-in-the-cell

また次回のcodingameゲームAIコンテストは4/15～開催です。
https://www.codingame.com/contests/coders-of-the-caribbean
matplotlibで画像を連続的に表示する方法メモ

この記事は「この記事は最終更新日から1年以上が経過しています。」を経験しています。

`matplotlib.animation`を使って連続的に生成される画像を表示したい。次のように画像生成して`imshow`する関数を作ればこれができる。
途中`plt.clf()`をしているのは、ステップを重ねるごとに重くなっているように思えたので、毎度クリアしてみたというもの。

```py
import matplotlib.pyplot as plt
import matplotlib.animation as animation
import numpy as np

N = 50

fig, ax = plt.subplots()

def update(i):
  a = np.uint8(np.random.uniform(0, 255, [N, N, 3]))
  a[i:, i:] = 0.
  plt.clf()
  plt.imshow(a)
hoge = animation.FuncAnimation(fig, update, np.arange(1,  N), interval=25)  # 代入しないと消される
plt.show()
```

以上。
Material Design ColorsをMacのcolor picker上で選択できるようにする

Mac OS Xについてくるcolor pickerは、アプリケーションから色を指定するときにはほぼ必ず出てきます。ここでMaterial Design Colorsを選択できると便利かなと思ったので作ってみました。

<img width="249" alt="Screenshot of System Preferences (2017-03-19 23-51-15).png" src="https://qiita-image-store.s3.amazonaws.com/0/1034/63e37d20-7364-a996-6b45-75ab2feebaa1.png">

こんな感じで使えます。

# インストール

## ダウンロード
https://gist.github.com/chsh/f9bcb00a22cb5c5a7477757632917d25 からDownload ZIPで取得。中身は以下のようになっています。

## ファイル内容


- Material Design Colors
 [Color - Style - Material design guidelines](https://material.io/guidelines/style/color.html#color-color-palette) にあるカラーリスト
- Flat UI Colors
- Social Colors
- Metro Colors
- HTML Colors　- [Material Design Color, Flat Colors, Icons, Color Palette | Material UI](https://www.materialui.co/)にあるカラーリスト
- Kuretake Real Brush Colors: 毛筆タイプのカラーペン、呉竹カラーブラッシュ80色で使われているカラーリスト see. [型番と色のリスト](http://www.cleancolor.jp/RB-6000AT.html) via [手帳アレンジに使えるおすすめ商品 | Clean Color f - 株式会社呉竹](http://www.cleancolor.jp/lineup.html)

## Color pickerへの登録
何かのアプリケーションの色設定からcolor pickerを呼び出します。color pickerのタブ3つめ、Color Palletsというところで、設定ボタンから `Open…` を選んで上記のファイルのうち必要なものを追加します。

<img width="335" alt="Screenshot of System Preferences (2017-03-19 23-50-52).png" src="https://qiita-image-store.s3.amazonaws.com/0/1034/ba81603a-47f7-5191-e55a-c447d078cbea.png">

## Color pickerからの呼び出し

コンボボックスで使いたいカラーリストを選択するだけです。ここでは検索もできるので、例えばMaterial Design ColorsのA700セットから選ぶ、こともできます。色の名前でも絞り込めます。

<img width="249" alt="Screenshot of System Preferences (2017-03-19 23-51-15).png" src="https://qiita-image-store.s3.amazonaws.com/0/1034/63e37d20-7364-a996-6b45-75ab2feebaa1.png">

# 参考URL

## テキストからApple Color List formatファイルを作る

[ramonpoca/ColorTools: Tools for color management in Mac OS X and iOS, supporting Adobe Swatch Exchange and NSColorList formats](https://github.com/ramonpoca/ColorTools) via [R.swiftで色を管理する](http://qiita.com/noppefoxwolf/items/5132d173b7d82579932a#comment-59c4f20e483b1eb002a9)

## 超絶すごいcolor picker: sip

画面のどこかから色を拾うツールはいくつもありますが、いろんな方向に隙がなくて使い心地がよいアプリがありました。(ここでApple Color List formatを知ったのは内緒ですw)
[Sip for Mac](http://sipapp.io/)
英語の野菜名・果物名一覧

## ABC順のリストを作成する意味
個人的な趣味の話であるが、自分は現実とは何の繋がりもない、意味のないプロジェクト名をつけるのが好き
ここでいうプロジェクト名とは、開発プロジェクトのコードネームというよりも、次に作成するディレクトリ名くらいの小さな話
ABC順に命名しておけば、新しいプロジェクト名が必ず下にくる

## 野菜名・果物名一覧

| Alphabet | Name |
| :------: | ---- |
| A | Apple, Apricot, Avocado |
| B | Banana, Blueberry, Broccoli |
| C | Cabbage, Carrot, Celery, Cherry, Coconut, Corn, Cucumber |
| D | Daikon |
| E | Eggplant |
| F | Fennel, Fig, Fruit |
| G | Garlic, Ginger, Grape, Guava |
| H | Herb, Honeydew, Horseradish |
| I | IcePlant, Ingen |
| J | Jackfruit, Jellybean |
| K | Kiwifruit |
| L | Lettuce, Lotusroot |
| M | Mango, Melon, Mushroom |
| N | Nectarine |
| O | Okra, Onion, Orange |
| P | Papaya, Peach, Pear, Pecan, Pepper, Pineapple, Plum, Potato, Pumpkin |
| Q | (null) |
| R | Radish |
| S | Soybean, Spinach, Strawberry |
| T | Tomato |
| U | (null) |
| V | Vegetable |
| W | Watermelon |
| X | (null) |
| Y | Yam |
| Z | Zucchini |

## 参照

[Fruit and Vegetable A-Z Index - EDIS](http://edis.ifas.ufl.edu/features/fruitvegindex.html)

[The Crossword Solver](http://www.crosswordsolver.org/)

[野菜、果物の英語での名前一覧 - 英語豆知識ノート](http://park1.wakwak.com/~english/note/name-fruits-vegetables.html)
OWINによるStageMarkerの役割

元ネタは
　https://docs.microsoft.com/en-us/aspnet/aspnet/overview/owin-and-katana/owin-middleware-in-the-iis-integrated-pipeline

OWINでプログラムを書いていると、OWINミドルウエアをUseで追加した順番は指定できるんだけど、それがどのリクエストの段階で実行されるか理解できていなかった。
上記の記事を読むと、Stageという考え方があることがわかる。

Stageには

```C#
## Pipelineの定義
public enum PipelineStage
{
    Authenticate = 0,
    PostAuthenticate = 1,
    Authorize = 2,
    PostAuthorize = 3,
    ResolveCache = 4,
    PostResolveCache = 5,
    MapHandler = 6,
    PostMapHandler = 7,
    AcquireState = 8,
    PostAcquireState = 9,
    PreHandlerExecute = 10,
}
```
のような定義がある。
使い方は

```C#
app.UseStageMarker(PipelineStage.Authorize);
```
のように書く。

```C#
public void Configuration(IAppBuilder app)
{
    app.Use((context, next) =>
    {
        PrintCurrentIntegratedPipelineStage(context, "Middleware 1");
        return next.Invoke();
    });
    app.Use((context, next) =>
    {
        PrintCurrentIntegratedPipelineStage(context, "2nd MW");
        return next.Invoke();
    });
    app.UseStageMarker(PipelineStage.Authenticate);
    app.Run(context =>
    {
        PrintCurrentIntegratedPipelineStage(context, "3rd MW");
        return context.Response.WriteAsync("Hello world");
    });
    app.UseStageMarker(PipelineStage.ResolveCache);
}
```
こうすることで、１，２の呼び出しはAuthenticateRequestで、３はResolveRequestCacheで呼び出されるようになる。

また一つ理解。
Route53を使う理由！

# はじめに
AWSで構成を考える際、何となくRoute53を使っていませんか？？
お名前.comでドメイン取得したから使わない！って方もいると思います。
しかし、ある状況の時Route53を使わなければなりません！！！
その使用理由を改めてまとめます。

# 結論！！
###ルートドメインとELBを紐づけるときは、Route53必須！
**お名前.com のDNS登録では、CNAME登録する際にホスト名が必須！**

```
例
< ホスト名 >.aaa.com CNAME < ELBのドメイン名 >
```

ルートドメインの場合はホスト名がないためCNAME登録ができず、Route53を利用するしかない!

####理由
- **お名前.com等のDNSサービスでは、ELBのCNAMEを登録できません。。。**  
→取得したルートドメインでアクセスしたら、ELBにアクセスするという設定ができません。。。


####その他の理由
- 冗長化したロケーションで安心
- SLA100%（サービス品質）
- 何より安い！


# レコードについて
- Aレコード：ドメインとIPアドレス（IPv4）の紐づけ（正引き、複数のIPを設定可能）
- AAAレコード：AレコードのIPv6版
- CNAME：ドメインのエイリアスを指定（ドメインのあだ名みたいなもの）
- MXレコード：ドメインのメールサーバーを指定
- NSレコード：ドメインのネームサーバーを指定
- TXTレコード：なりすましメール防止に利用（dkimやspfなど）
- SOAレコード：ドメインのゾーンを情報を記載する（ドメインのDNSサーバー名、ドメイン管理者のアドレス、シリアル番号等）


# おわりに
案外Route53を使用する理由を書いてあるサイトがなかったので、まとめました。
お名前.comでドメインを取得した際も、ELBを使用する際はRoute53を使用しましょう！
Macでスクリーンショットからテキストを抽出して貼り付ける

![3月-19-2017 23-14-47.gif](https://qiita-image-store.s3.amazonaws.com/0/58084/e0f13ef1-22fb-f4fa-7fd0-d03bb1d512be.gif)

VigetがWgetになっているので精度は若干良くない。GIFの例では普通に文字列をコピーできるが、本来は画像になっている文字列で使用することを想定。

[Copying Text From Images to Your Clipboard | Viget](https://www.viget.com/articles/copying-text-from-images-to-your-clipboard)を元に設定をする。

## Tesseractのインストール

まず、画像からテキストを取り出すtesseractをインストールする。

```
$ brew install tesseract
```

日本語が抽出できるようにhttps://github.com/tesseract-ocr/tessdata から日本語用のデータをダウンロードする。

現時点で、Homebrewでインストールされるバージョンは3.04

```
$ tesseract -v                                                                                                                                                                                              (git)-[bisect/bad]   <!bisect>
tesseract 3.04.01
 leptonica-1.74.1
  libjpeg 8d : libpng 1.6.28 : libtiff 4.0.7 : zlib 1.2.8
```

なので、3.04treeからデータをダウンロードする。

```
$ curl -L -o /usr/local/share/tessdata/jpn.traineddata 'https://github.com/tesseract-ocr/tessdata/raw/3.04.00/jpn.traineddata'
```

使える言語にjpnがあることを確認する。

```
$ tesseract --list-langs
```

## Automaterの設定

Automaterでサービスを作る。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/58084/bdda3719-8140-583d-9f9f-620e2f63efca.png)

Automaterを起動して「新規書類」。「サービス」を選択。

アクションを「シェル」で検索して、出てきた「シェルスクリプトを実行」をダブルクリック。

受け取る項目を「入力なし」にする。

シェルを「/bin/bash」などにする。内容は以下のようにする。

```
PATH="/usr/local/bin:$PATH"
screencapture -i /tmp/ocr.png
mogrify -resize 200% /tmp/ocr.png
tesseract -psm 6 -l eng+jpn /tmp/ocr.png /tmp/ocr
cat /tmp/ocr.txt | tr -d '\n' | __CF_USER_TEXT_ENCODING=0x$(printf %x $(id -u)):0x08000100:14 pbcopy
```

`screencapture -i`でスクリーンショットを取るインタラクティブモードに入り、それを`/tmp/ocr.png`に保存する。
tesseractは文字のサイズが小さいとうまく認識されないので、`mogrify -resize 200%`で2倍にしている。`mogrify`はimagemagickをインストールすると入るコマンドなので、ない場合は

```
$ brew install imagemagick
```

でインストールする。

```
tesseract -psm 6 -l eng+jpn /tmp/ocr.png /tmp/ocr
```

で`/tmp/ocr.png`の画像から文字列を抽出して、`/tmp/ocr.txt`に保存する。`-l eng+jpn`で英語と日本語を対象にしている。`-psm 6`は抽出の形式。

テキストをクリップボードに保存する部分で`tr -d '\n'`しているのは、いらない改行を取り除くため。`__CF_USER_TEXT_ENCODING`の部分は日本語をクリップボードに保存するためのおまじない。

screenshot_to_textなど適当な名前で保存する。

## ショートカットを登録する

「システム環境設定」ー「キーボード」ー「ショートカット」ー「サービス」を選択して、「一般」にあるscreenshot_to_textを選択して、ショートカットを登録する。
スクリーンショットをクリップボードに保存するのが、Ctrl+Shift+Command+4なので、Ctrl+Shift+Command+5などに設定する。

## 参考サイト

- [Copying Text From Images to Your Clipboard | Viget](https://www.viget.com/articles/copying-text-from-images-to-your-clipboard)
- [Pythonで日本語OCRを行うときのメモ - Qiita](http://qiita.com/bohemian916/items/67f22ee7aeac103dd205)
- \_\_CF\_USER\_TEXT\_ENCODING
    - [UTF-8でpbcopyできるようにする - by edvakf in hatena](http://d.hatena.ne.jp/edvakf/20080929/1222657230)
    - [MacOS X 英語環境で Flash を日本語モードで使う | Tempus - 昨今明日](http://blogger.tempus.org/2008/09/macos-x-flash.html)
OwinのStartupクラスをWeb.configで指定する

元ネタは
　https://docs.microsoft.com/en-us/aspnet/aspnet/overview/owin-and-katana/owin-startup-class-detection

OwinでStartupクラスを作ってOWINを起動できるが、そのStartupクラスをWeb.config内で指定できるようだ。

例えばこんな風に

```xml
<appSettings>  
  <add key="owin:appStartup" value="StartupDemo.ProductionStartup" />
</appSettings>
```
PhpStormの日本語キーボードで［戻る］と［進む］

PhpStormのバージョンが17に上がって、下記の動きが改善（というのか？）されたので、これはPhpStorm16版と読み替えてください:bow:
##PhpStorm16の
メニューバーのボタンには「戻る」`Back(⌘[)`と「進む」`Forward(⌘])`というショートカットの表示がありますが、これを押してもぜんぜん違う動きをするので使ってない人多い？
まぁ英語キーボードを使ったことがあったり身近な人が使っていたりすると気づいたりするもんですが、普通日本人はわからんです。

#原因
その原因は英語キーボード配列に合わせてあるから。日本語キーボードではその位置に`@`と`[`があるので、それで読み替えれば動きます。

#結論
**「戻る」( ⌘@ )**

**「進む」( ⌘[ )**

以上

#おまけ
この日本語キーボードはDOS/Vを開発したIBMの大崎博士が推進しました。元々はこの位置にあったものを大人の都合で英語キーはあの配列にし、多言語対応にした際に戻したそうです。ちなみに大崎博士はアーキテクト寄りでプログラミングはあまり好きでないと聞いています。

プログラマーとしては["]や[']や[`]がとっちらかっている日本語配列より、それらがまとまっている英語配列のほうがいいんですけどねぇ。慣れの問題なのかもしれませんが。