OmniAICreator/Qiita-1.07M huggingface dataset:
Atomの設定とよく使う便利なショートカット

# Atomとは
プログラマっぽいテキストエディタ。かっこいい。
Sublime Textと似ているらしいがそっちは使ったことがない。
ネットに転がっているショートカット集はほとんど使わない（僕が）ものも載っているので、自分が使うものだけメモっておく。
また、UndoやRedo、保存や新規ファイルを開くなどの基本的なものは割愛する。
# 設定
- EditorタブのShow Invisiblesにチェックを入れると空白文字と改行文字が見えるようになる。
- EditorタブのSoft Wrapにチェックを入れると長い行を折り返してくれる。
- ThemesタブのCore PackageのUI ThemeをAtom Darkに、Syntax ThemeをOne Darkに設定した。
- Packagesタブのコアパッケージ内のwrap-guideというパッケージをDisableにすると編集画面のガイド線を消せる。
- Pakcagesタブのコアパッケージ内のlanguage-htmlというパッケージのShow Indent Guideにチェックを入れるとインデントに縦線が表示されて見やすくなる。
- Editorタブのfont-familyをネットからダウンロードしたRicty Diminishedにすると全角スペースが可視化されるのでミスが減る。
- コミュニティパッケージであるminimapをインストールするとコード全体を編集画面の端に表示してくれる。
- コミュニティパッケージであるfile-iconsをインストールするとファイル種別ごとに適したアイコンを表示してくれる。

# ショートカット集
- Command + f : 検索、置換(escキーで閉じる)
- Command + / : カーソルがある行をコメントアウト（複数行選択可）
- Command + k + b : （英字入力のときに）ツリーを表示・非表示
- Command + Alt + \ : （日本語入力のときに）ツリーを表示・非表示
- Command + Enter : 行末にカーソルがなくても改行できる
- Cmmand + Shift + Enter : 行末にカーソルがなくても新しい行を上に挿入できる
- Command + Shift + d : カーソルがある行を複製（複数行選択可）
- Ctrl + Shift + k : カーソルがある行を削除（複数行選択可）
- タブを画面の上下左右にドラッグ : 矢印キーの方向にペイン(Pane)分割（ショートカットがあるがドラッグのほうがやりやすい）
- Command押しながら選択 : 複数箇所を同時に編集（ショートカットではない…？）
- Ctrl + m : 対応する{}やタグなどに移動
- Ctrl + Shift + m : 対応する{}やタグ内をすべて選択
- Alt + Shift + i : 選択範囲を自動インデント（コピペしたコードのインデントずれを直すのに便利）（実は自作ショートカットなので後述）

# ショートカットを作成する
1. 左上のAtomメニューからキーマップ(Key map)を開く。
2. 下記の部分をコピーしてファイルの末尾に追加し、コメントアウトを解除する。

    ```
    # 'atom-text-editor':
    #   'enter': 'editor:newline
    ```
3. Shift + Ctrl + p でコマンドパレットを開いて、Key Binding Resolverを開く
4. ショートカットを設定したいキーを押して何も設定されていないキーの組み合わせを探す。（今回はAlt + Shift + iにした。）
5. さっきの部分を以下のように編集する。

    ```
    'atom-text-editor':
      'alt-shift-i': 'editor:auto-indent
    ```
7. Command + s で保存する。

##　リスト内での改行
http://qiita.com/spaceprobe/items/b4ab0701f7b1fa92a060
今回の記事を書くに当たって、上記の番号付きリスト内にコードを挿入するときに戸惑ったので参考にさせていただきました。
初めてのプログラミングで社内の経費精算管理ツールをつくってみる（まで）#1

##はじめに

2015年から会社で参加し始めた Advent Calendar。
昨年はエンジニアの3人が参加するのみだったが、2016年はデザイナー、ディレクター（自分）も含め全員で参加することに。（困った）

今までの自分の業務で行ってきた範囲ではhtml、css、Javascriptの修正をちょこっとやる程度でした。（範囲が狭い）
昨今のIT業界の恐ろしいまでの進化のスピードを考えるとこのままではディレクターとしてまずい。非情にまずい。（まずすぎる）

ということで自分の業務の幅を広げるためにも（他にも色々きっかけはあったのですが割愛）プログラミングを覚えようと一念発起。これから登る山がどの位の高さなのかイマイチ分かっていない状態ですがスタートします。。


##何をつくるか
まずはここから考えました。
メンバーの役に立って、且つプログラミングを学べるもの。。

が、検討もつかなかったので社内で相談。（もう少し考えようよ）

* 経費精算管理ツール
* 書籍管理ツール

出てきた順番で経費精算ツールに決定。
あれこれ悩んでも結局分からないしね。（3日考えても結果は変わらないはず）


##ゴールの設定
* とにかくきちんと動くものをつくる（最後まであきらめずに）


##現状の課題と対策を考える
###現状の課題
今の運用ではエクセルを使用し経費精算の申請を行ってます。
その中で課題に思う事をメンバー視点、管理者視点で洗い出していきます。

＜メンバー視点＞

* 勘定科目（○○費とか）に何を記載すれば良いのか項目が分かり辛い
* 日にちを半角スペースで入力するのが面倒くさい
* 月末に領収書をまとめるのが面倒くさい

＜管理者視点＞

* 各メンバーで勘定科目の項目が異なるため入力しなおしが発生する
* 6人分のファイルをいちいち開くのが面倒くさい


まとめるといろいろと面倒くさい事が多いってことですね。
（面倒くさがりはエンジニア向きって聞いた事があります。残念ながら自分は真逆。。）

###対策

* 勘定科目をプルダウン形式にし、各科目の該当例も表示しておく（管理者の入力しなおしも減る、はず）
* 日にちはカレンダーから選択できる形式にする
* メンバーの記載した各シートを管理者の1枚のシートに反映する

月末の領収書まとめは、、各自でクリアファイルにまとめておきましょう。
交通費は、、グーグルカレンダーにどこに行ったか記載しましょう（事前にね）。

###メモ
因みに弊社で使いそうな勘定科目はこの位で事足りそうです。
参考までに。

|#|科目|科目の内容|
|:-:|:-:|:-:|
|1|福利厚生費|スポーツジム、残業食事代など|
|2|旅費交通費|通勤定期代、出張旅費、電車、タクシーなど|
|3|消耗品費|仕様に応じて消耗していくもの。ティッシュなど|
|4|事務用品費|消耗品のうち事務用文房具|
|5|通信費|通信費|
|6|会議費|取引先との打合せ飲食費など|
|7|交際接待費|業務上のおみやげ茶菓子代・接待の飲食代など|
|8|諸会費|諸会費|
|9|雑費|掃除代、ごみ処理券など|
|10|研修費|仕事上必要なセミナーへの参加費など|
|11|租税公課|税金の立て替え払いなど|
|12|荷造運賃|荷造運賃|
|13|租税公課|印紙|
|14|印刷製本費|印刷費用|
|15|立替金|仕事上で立替えた経費|

##終わりに
###次回に向けて
次は実際の業務フローを書き出して課題に漏れが無いかの検証について書いてみたいと思います。

###雑感とお断り（というかお詫び）
記念すべき第1回目のAdvent Calendarですが、予想以上に書くのに時間がかかってしまいました。この位の内容は30分位で書けるようにしたい。。

ここまで読んでくださる方がどの位いらっしゃるか分かりませんが、書いている内容は実況中継に近い非情にリアルタイムな内容になってます。
まだ技術的な事は何も出てこないし、そもそもいつ終わんだ？（年が明けんぞ）的な日記の様な感じです。
が、Advent Calendarの時期が終わっても今回つくっている（つくろうとしている）経費精算管理ツールが完成するまでは備忘録代わりに続けたいと思います。

どうぞ宜しくお願いいたします。
VSS CLI

About Visual SourceSafe Commands
https://msdn.microsoft.com/ja-jp/library/asxkfzy4(v=vs.90).aspx

## Commands

### CP
Sets the current project path.
https://msdn.microsoft.com/ja-jp/library/z67ws9za(v=vs.90).aspx

### Add
Adds new files.
https://msdn.microsoft.com/ja-jp/library/tszt2szw(v=vs.90).aspx

### Checkout
Checks out a file and makes the working copy of the file in the current project writable.
https://msdn.microsoft.com/ja-jp/library/7wbe5121(v=vs.90).aspx

### Checkin
Updates.
https://msdn.microsoft.com/ja-jp/library/tt66dycz(v=vs.90).aspx

### Get
Retrieves read-only copies
https://msdn.microsoft.com/ja-jp/library/661w6e3d(v=vs.90).aspx

## Options

### -C
comment.
https://msdn.microsoft.com/ja-jp/library/96xcwzsx(v=vs.90).aspx

#### -C-
Tells the command to use no comment.

#### -Ctext
Uses the string text as the comment for all items.

# Sample

~~~ powershell:vss_manager.ps1
$Project = $Args[0]
$File    = $Args[1]
$NewFile = $Args[2]
$Comment = "-C" + $Args[3]

ss CP $Project
ss Get $File
if ($?) {
    ss Checkout $File -C-
    COPY $NewFile $File
    ss Checkin $File $Comment
} else {
    ss Add $File $Comment
}
~~~
Github 登録時の二段階認証

#手順

githubのアカウントを持ってない人は事前に取得してください。

1. 携帯に【Google Authenticator】というアプリをダウンロード
2. ブラウザからgithubのサイトにログイン
3. ページを移動   
Personal settings > Security > Set up two-factor authentication 
4. 下記キャプチャーの左の「app」を選択
![screenshot.png](https://qiita-image-store.s3.amazonaws.com/0/117024/244eb403-4c0f-5f04-e29c-69f3d010e63e.png)
5. するとバーコードが出てくるので、携帯でさきほどのアプリを起動させて読み取る
6. さらに携帯に表示された数字をブラウザで入力し、二段階認証は完了

※ちなみに【Google Authenticator】はAWSの二段階認証などでも重宝します。

##注意事項 パスワードが使えなくなる

これで、ログインする際などに、二段階の認証をかけることが可能。
ただし、この二段階認証をかけることで、プライペードリポジトリをhttpsでクローン(ダウンロード)してくるときに、パスワードが使えなくなります。
ブラウザで必ずトークンを発行する必要があり、パスワードでなくこのトークンを使ってクローンすることになります。

#recovery code

二段階認証をただ設定しただけだと、携帯の紛失時に、大変なことになりかねません。
ので、かならずリカバリーコードを取得することをオススメします。

二段階認証を完了したあとに、出てくる画面です。
「DownLoad」ボタンを押しましょう

![screenshot.png](https://qiita-image-store.s3.amazonaws.com/0/117024/95755e66-3bc1-38c3-8399-bc53ae80a863.png)

すると、暗号化されたテキストファイルがダウンロードできるので、どこかに保存しておくといいと思います。

###参考サイト

http://yashims85.hatenablog.com/entry/2015/11/05/014430

ちなみに、今回は、SNS認証(番号認証)は行っておりません。
Windows10が勝手にスリープ解除してしまう

世の中の人みな困ってるみたいね。
それなので、大体の方法は載っているんだけど。
世の中に載ってる以外の原因もあったので忘備録。
コマンドプロンプト以外は、タスクバーのWindowsアイコン右クリックからの流れ。

# スリープ解除している原因を探る

0. イベントビューアー
1. Windowsのログ
1. システム
2. ソースが Power-Troubleshooter のイベント

ここにいつだれが解除したのかが記録されている。

# 数分でスリープ解除
イベントログみて、スリープ後数分でスリープ解除している原因はネットワークアダプターだった。

0. デバイスマネージャー
0. ネットワークアダプター
0. （自分が使ってるネットワークアダプターの名前）
0. 電源の管理タブ
- [ ] このデバイスで、コンピュータのスタンバイ状態を解除できるようにする(O)

# 夜中に突然スリープ解除
夜中の寝静まる時間帯に勝手にスリープ解除するのは俗にいうWindowsUpdateが原因。

0. コントロールパネル
0. セキュリティとメンテナンス
0. メンテナンス(M)スライドダウン
0. 自動メンテナンスのメンテナンス設定変更
0. [ ] スケジュールされたメンテナンスによるコンピューターのスリープ解除を許可する

#ウィルス対策ソフトがウィルス？？
それでも忘れた頃の夜中にスリープ解除してしまう。
イベントログには、スリープ状態の解除元が不明となっている。
つまりはOSの何かではないってこと？？

コマンドプロンプトで `powercfg -waketimers` を実行すると、アクティブなスリープ解除タイマーを列挙してくれるらしい。(要管理者権限)

```
powercfg -waketimers
[SERVICE] \Device\HarddiskVolume2\Windows\System32\svchost.exe (SystemEventsBroker) によって設定されたタイマーは 5:56:40 (2016/11/27) で有効期限が切れます。
  理由: Windows は、スリープ状態の解除を要求したスケジュールされたタスク 'Maintenance Activator' を実行します。
```

おや？悪さをしている誰かがいるね。
名前からアップデートとか実行してそう。
でもWindowsUpdateの設定は確認済みだし・・・

いましたよ。
タスクスケジューラーのMcAfee項目にある、「McAfee Auto Maintenance Task Agent」の条件に
「タスクを実行するためにスリープを解除する」のチェックボックスが有効に！！
こいつを無効にしてからのコマンド結果が変わった！

0. コンピュータの管理
0. システムツール
0. タスクスケジューラ
0. McAfee
0. McAfee Auto Maintenance Task Agent のプロパティ
0. 条件タブ
0. [ ]タスクを実行するためにスリープを解除する

再度コマンド実行で確認。

```
C:\WINDOWS\system32>powercfg -waketimers
システムにアクティブなスリープ解除タイマーがありません。
```

お！
これでしばらく様子見。
でもこれって、スリープしてる時間ばかりだからウィルスチェックがされないのか？

しかし、McAfeeが原因だったとは・・・
でもWindows10にアップデートするまでは発生しなかった問題なんだよな～。
やっぱりWindows10がダメなのかしら？？
でもWindowsでしか対応していないゲーム動かしたいし・・・
かといって、古いバージョンのWindowsを使い続けるわけにもいかないし・・・
困ったもんだ。

# 2017-11-16 追記
これらの設定が反映されていてもスリープ解除してしまう現象が発生していた。
ご丁寧に再起動までしてるくそっぷり。
Windows Updateがご丁寧にどやってきたので、犯人は特定できていた。
上記に記載されていた設定が戻されていた。
それとタスクスケジューラーにも新たな項目を見つけたので、そいつの設定も変更。

0. タスクスケジューラー
1. Microsoft
2. Windows
3. UpdateOrchestrator
4. Rebootのプロパティ
5. []タスクを実行するためにスリープを解除する

どれも定期的に設定が戻されてしまうので、時々確認するしかない。
Androidアプリにログ系ライブラリを導入してみた話

この記事は[Monstar Lab, Inc. Advent Calendar 2016](http://qiita.com/advent-calendar/2016/monstar-lab) 2日目の記事です。

前日は @shanonim の [Philips Hue x Johnny-Five x 温度センサ(LM35)でオフィスIoTやってみた - Qiita](http://qiita.com/shanonim/items/b3555a84edd78f719d7a) でした。

自宅用にHueがほしいですね。最近、金使いすぎなのでもうちょっと後でにはなりますが。。
Johnny-Fiveはお手軽にデバイスを操作出来て良いですね。

## 概要

とあるプロジェクトで、Androidアプリにログ系のライブラリを導入してみました。
その中で感じたことをまとめたメモがあったので、その焼き直しです。（新しい記事を書く時間が無かった。。。）
また、経緯に関しては記憶を辿って書いているので、フィクションの可能性があります。技術的な部分は大丈夫なはずです。

## 先に結論

[Timber](https://github.com/JakeWharton/timber) はいいぞ。

## いままで

`android.util.Log` を使っていました。
また、本番リリース時にはproguardによって、削除していました。
理由としては、秘匿情報を知られてしまう可能性、パフォーマンス劣化を防ぐためですね。

参考： [Yukiの枝折: Android:ログコードをProguardで削除する](http://yuki312.blogspot.jp/2012/03/androidproguard_09.html)

ただこの`Log`クラス、常に`tag`が必要になり、下記のようなボイラープレートコードが量産されました。
`private static final String TAG = HogeFragment.class.getSimpleName();`
これもAndroid StudioのSnippet（だったかな？）を使えば、簡単に追加できますが、やっぱりコードは少ないに越したことはないので、微妙でした。

## とあるプロジェクトでの話

そんな経緯があったので、「なんか無いかなー」と探したところ、[zserge/log](https://github.com/zserge/log)というものを見つけました。

その時のプロジェクトでは、すでに実装が始まっており、`android.util.Log`を利用していたので、「`Log.d(TAG, "hogehoge");`って書いているところそのままで、とりあえずimport文だけ変えれば簡単に導入できるやん！」ということで、導入してみました。

実際導入するときには、`android.util.Log`をgrepして、`trikita.log.Log`に変換するだけで、一旦は置き換えが完了し、順次`TAG`定数の削除、引数の`TAG`の削除をするだけでした。
※ 今確認すると、 https://github.com/zserge/log#migration-from-androidutillog ここに移行コマンドがあったんですね。

細かいところですが、「ここでログ出力したほうがいいかな？」と考えたところで、`TAG`定数の有無を確認→定義→やっと実装となっていたところが、頭を使わずにログを出せるようになったのは良かったです。

## 徐々に辛くなってきた話

クラス名が同じため、移行が簡単だったのは良かったのですが、実装中はちょっと邪魔でした。
`Log`と書いたときの候補として、2つ出てきてしまいます。
コード書くときに気をつけなければならないことが増えてしまいました。

特に、何も考えずにEnterを押してしまって、`android.util`をimportしてしまったときは、Ctrl+zで戻ったりが面倒でした。

## 別のプロジェクトの話

そのプロジェクトはそのままですが、別のプロジェクト始めるときに、再度ログ系ライブラリを探してみました。
すると、Jake神が[Timber](https://github.com/JakeWharton/timber)というのを作っているではありませんか。

こちらも勝手にTAGに設定する文字列を作ってくれるみたいです。

また、READMEに記載されている通り、Android Studioでコード書いてるそばから、warningを出してくれるので、文字列連結をしてしまうことも無く、パフォーマンス的にも劣化が少なそうです。

また、`Timber.plant`によって、Logcat以外の場所に出力することも容易です。
[AndroidのTimber(ログ系)とFabric/Crashlytics(クラッシュレポート)を使ってみた。 - さまよえる、Android](http://araiyusuke.hatenadiary.com/entry/2015/11/01/182339) にあるように、本番ビルドのときには別の`Tree`を`plant`しておけば、WARNのログをcrashlytics上で見れたり出来て便利です。

同様に、`Tree`を自分で書けば、FirebaseのCrash Reportingに飛ばすことも出来ます。
https://github.com/noboru-i/kyouen-android/blob/16eed54/app/src/main/java/hm/orz/chaos114/android/tumekyouen/App.java#L53

## 今後

新しいAndroidアプリのプロジェクトがあれば、とりあえずTimberを入れて、`Timber.DebugTree`を`plant`しておけば良いと思ってます。
開発がある程度進んできた段階で、FirebaseやFabricを導入して、必要な`Tree`を`plant`する感じで。

明日は、、、誰も入ってないですね。気力があれば、連続で書こうかな。無いかも。
気力が無ければ、次は5日目の @aratafuji さんです。楽しみですね。
NSLの世界へ　Hello World

#NSLのダウンロードとインストール
Twitterなどで、NSLに興味はあるがどうすればいいかわからないという声を
聞いたので紹介してみます。
先に書かれた方がいらっしゃるのでそちらもぜひ参考に。
http://qiita.com/rzn/items/f5962f544a8ef351c219

NSLについては、後日別の記事で詳しく語るつもりなのでそちらを参照。

では、早速、検索エンジンでオーバートーンと検索して以下の手順で進めていきます。

![2016-12-01_23h46_28.png](https://qiita-image-store.s3.amazonaws.com/0/152330/647571e7-7526-88f7-97f3-108fe48f68ee.png)

![2016-12-01_23h47_08.png](https://qiita-image-store.s3.amazonaws.com/0/152330/d41e5b8c-cff1-c462-d4c1-97f3d8f6cc24.png)

![2016-12-01_23h41_34.png](https://qiita-image-store.s3.amazonaws.com/0/152330/3c359a12-4319-45c1-beb4-6531c94a991b.png)

![2016-12-01_23h48_43.png](https://qiita-image-store.s3.amazonaws.com/0/152330/5006b14f-1198-e785-cbcb-01e1936ef51d.png)

![2016-12-02_00h09_25.png](https://qiita-image-store.s3.amazonaws.com/0/152330/a0215a12-9636-28a4-cc3b-d96cfada148f.png)

![2016-12-02_00h11_10.png](https://qiita-image-store.s3.amazonaws.com/0/152330/785927d7-32b5-8642-78ad-a66476d1f06e.png)

![2016-12-02_00h39_17.png](https://qiita-image-store.s3.amazonaws.com/0/152330/264e312e-e866-2486-1ebf-dcc3e9881481.png)

ざっくりとインストール方法を紹介してみました。
そもそもアジャイル開発ってなんだ

[アジャイル開発 Advent Calendar 2016](http://qiita.com/advent-calendar/2016/agile) の１日目の記事になります。


## アジャイル概念の背景
この宣言に凝縮されています。
[アジャイルソフトウェア開発宣言](http://agilemanifesto.org/iso/ja/manifesto.html)

```
プロセスやツールよりも個人と対話を、
包括的なドキュメントよりも動くソフトウェアを、
契約交渉よりも顧客との協調を、
計画に従うことよりも変化への対応を、

価値とする。すなわち、左記のことがらに価値があることを
認めながらも、私たちは右記のことがらにより価値をおく。
```

個人的な理解ですが、人を重視し、柔軟性を軸とすると理解しています。
その理由ですが、
ソフトウェアは作っている間にも市場や環境は変化し、必要なものが変わること。
作っていくことによって、より十分な理解が進みよりよい方法や正しい方法が見えること。

ここで計画を重視してしまうと、最終的に良い物が完成しないこと、環境にマッチしきれていないものが出来る確率が高いことは明白です。
これを実現するためにアジャイルという開発手法を実践するのだと思っています。




そして、そのアジャイル開発宣言の背景には以下の考えがあります。
[アジャイル宣言の背後にある原則](http://agilemanifesto.org/iso/ja/principles.html)

## アジャイル手法
では、その概念を実行するためにはどうすればよいか？というものをまとめたものが手法になります。
それが`スクラム`や`XP`などいくつかの手法あります。

これらは学ばなければならないものです。
名前だけ真似ても出来るようになりません。
アジャイルチームを作るためには、知識があった上で取捨選択して導入しなければならないです。

一番メジャーな２つの手法についてざっくりと説明すると

#### XP (エクストリームプログラミング)
アジャイルソフトウェア開発宣言の考え方を中心に
プラクティスが中心のアジャイル手法になります。

#### スクラム開発
プロセス中心のプラクティスが多く
登場人物の中心概念はスクラムマスタ、プロダクトオーナー、開発チームという３つの役割を中心に定義されています

## プラクティス

開発手法にはいくつかのプラクティスがあります。
プラクティスとは朝会やペアプログラミング、スプリントなど具体的な実践方法のことです。

これらは個別に難易度が違うため、これからのアドベントカレンダーでも語るものが多くあると思います。


# 最後に

よく比較されますがウォーターフォールが悪いというものではありません。
導入すれば必ず良くなるわけでもありません。
正しい知識を身につけることは必ず必要であり
チーム導入方法については最新の注意を払いながら導入する必要があります。


運用するさいに発生した問題やノウハウをこれからAdventCalendarに書いていきたいと思いますのでよろしくお願いします。
Qiitaの「いいね」に消された「ストック数」を復活させた

# 作ったもの QiitaStockWatcher
Qiitaのページでストック数を見れるようなChrome拡張を作りました！
<img width="389" alt="screenshot.png" src="https://qiita-image-store.s3.amazonaws.com/0/110485/ddc8956a-1e2e-e95b-1a8e-4df151a2a227.png">

# 使い方
https://github.com/hikarut/QiitaStockWatcher
こちらからQiitaStockWatcher.crxをダウンロードしてChromeの拡張機能にドラッグ＆ドロップで入れてください。

※QiitaAPIを使っているためリクエスト制限があります。 150リクエスト/1時間を越えるとストック数も表示されなくなるのでご理解ください。


# 背景
Qiitaの仕様が変わり「いいね」と「ストック」が別物になりました。
[投稿記事やコメントに「いいね」できるようになりました（Contributionの算定基準も変わります）](http://blog.qiita.com/post/153200849029/qiita-like-button)

これ自体は特に違和感はないのですが、「いいね」が登場したことによってコントリビューションの算出基準も変わって**コントリビューションに影響するのはいいね数だけでストック数は影響しなくなっています。**
その関係か**ストック数も表示されなくなっています。**

個人的にはストック数がコントリビューションに影響しなくなったというのが何か残念だなーと思いつつも、、こればっかりはどうしようもなく。。(そのうちストック数もコントリビューションにカウントしてくれるといいなと思ったりしてます。。)

いいね数は見れるのにストック数が見れないのは何でだろうと思い、せっかくなら「ストック」数も見たいなと思って作りました :smiley:
pix2pixモデルを使ってみる

##はじめに
今回は最近巷で噂の`pix2pix`モデルをインストールし、使ってみる。ラベルから画像を生成したり、航空写真から地図を生成したりと、いろいろできるみたい。
![pix2pix_01.jpg](https://qiita-image-store.s3.amazonaws.com/0/116706/d167daaf-d091-efd1-26b2-24ef96444d42.jpeg)
論文はP. IsolaらのImage-to-Image Translation Using Conditional Adversarial Networks。
https://arxiv.org/pdf/1611.07004v1.pdf

ソースコードはこちら。
https://github.com/phillipi/pix2pix

著者らのホームページはこちら。
https://phillipi.github.io/pix2pix/
##環境
OS:Ubuntu14.04
GPU:GTX1070
CUDA:8.0 RC
cuDNN:5.1
python2.7.6
など
##Torch関連をインストール
Torchは既にインストールしてある。
http://qiita.com/masataka46/items/41f9fac011590f3cd4f1

`torch`関連パケージの`nngraphとdesplay`をインストールする。

```
luarocks install nngraph
luarocks install https://raw.githubusercontent.com/szym/display/master/display-scm-0.rockspec
```

うまくいったみたい。
##Image-to-imageモデルをインストールする。
モデルを`git clone`する。

```
git clone https://github.com/phillipi/pix2pix.git
```

次にデータを持ってくる。

```
cd pix2pix
bash ./datasets/download_dataset.sh facades
```

##学習させてみる
次にダウンロードしたデータセットで学習させてみる。

```
DATA_ROOT=./datasets/facades name=facades_generation which_direction=BtoA th train.lua
```

２時間半で２００回の学習が終了した。
##学習したモデルでテストする
最後に学習したモデルでテストする。

```
DATA_ROOT=./datasets/facades name=facades_generation which_direction=BtoA phase=val th test.lua
```

結果は`./results/facades_generation/latest_net_G_val/index.html`に保存された。以下の画像は出力結果の一部。
![pix2pix_result161202.png](https://qiita-image-store.s3.amazonaws.com/0/116706/ddac6345-1a0f-21d4-22ea-eead679dc7d3.png)

Outputとして生成された画像はGroundTruthとは異なるが、こんな建物は確かにありそうなので、これはこれでいいと思う。学習用データに影響されてるのだろう。
sublime text3の良さを知りterminalとの連携をスムーズにしたい

#はじめに
##目的

- 最近周りでsublimeを使う人が減ってきた感じがするので、sublimeの良さを知って欲しい
- sublimeとterminalの切り替えをキーボードだけでスムーズにする

## 約束事

vimでいいじゃん
atomの方がよくね？

は禁句です

##sublimeのメリット
- 本来は有料ソフトだが、無料試用版が機能・期間無制限で使える
- 豊富なプラグインがある
- 起動が早い

#sublime textのインストール
[ここ](https://www.sublimetext.com/3)からsublime textをダウンロードしてインストールします



#プラグインの導入

##package controlの導入
sublimeにプラグインを導入するためにはpackage controlを利用して導入します

そのため[このサイト](https://packagecontrol.io/installation)に書いてある通りに、画面上部のView->Show Consoleで画面下部に出てくるコンソールに入力します
しばらくすると導入完了

##プラグインのインストール
macの人は⌘+shift+p    windowの人はctrl+shift+pで
<img width="461" alt="スクリーンショット 2016-11-12 20.41.00.png" src="https://qiita-image-store.s3.amazonaws.com/0/96484/0e87acf2-c659-2b1d-96fd-e49805624b0a.png">
が表示されるはずですので
<img width="608" alt="スクリーンショット 2016-11-12 23.21.23.png" src="https://qiita-image-store.s3.amazonaws.com/0/96484/93931598-779a-f37d-85bf-70f7f3f4a957.png">
*Package Control:Install Package* を選ぶことでプラグインをインストールできます

###今回必要なプラグイン
今回は*Terminal*が必須です
これによりsublime上でterminalが起動できるようになります

またwindowsユーザーは
基本の文字コードがshit-jisのため
- ConvertToUTF8
- IME Support
の2つを導入することは強くお勧めします

terminalを起動することはこれでできるのですが、windowsの場合はcmdではなくpower shellが開いてしまうため
Preferences->Terminal->Settings - User
を開き

```sublime
{
    "terminal": "cmd",
    "parameters": ["/k", "chcp", "65001"]
}
```

としてcmdが開くようにしておきましょう


#sublimeをterminalで開く
##macの場合

###シンボリックリンクを作成
terminalで

```bash
ln -s /Applications/Sublime\ Text.app/Contents/SharedSupport/bin/subl /usr/local/bin/subli
```

でシンボリックリンクを貼って*subli*で使えるようにしておきましょう
なお公式ではsublでシンボリックリンクを張りますが、今回はsublを別のことにするので、subliにしています

###functionの作成

```bash
vi ~/.bashrc
```

の中で

```bash
subl(){
	if [ $# -ge 1 ] ; then
		subli -b $@
	else
		subli & exit
	fi
}

```

という関数を作ります
これはsublコマンドを実行した時に、引数があれば*バックグラウンド*でsublimeを開き
引数がなければsublimeにフォーカスを移し、terminalを閉じます
terminalを閉じる理由はsublime上のterminalプラグインは毎回新しいterminalを開くため、terminalが複数開く事態になってしまうからです



##windowsの場合

```path
C:\Program Files\Sublime Text 3
```

を環境変数のPATHに追加しましょう

次にパスを通したディレクトリを開き
subl.exeをsubli.exeとします

バッチファイルを追加するので、バッチファイル用のディレクトリを作り、それにパスを通しておきます
バッチファイル用のディレクトリに

subl.batという名前で、中身を

```bat
@echo off
rem 引数が0なら終了する
if "%1"=="" (
	rem 引数がなければsublimeにフォーカスしてcmdを終了する

	subli & exit
) else (
	rem 引数があればバックグラウンドで実行する

	subli -b %*
)
```

と保存します

#利用の仕方

```bash
subl XXX
```
でsublimeを開きます
XXXはファイルまたはディレクトリで複数指定できます
バックグラウンドで開きます
↓
その後sublとするとsublimeにフォーカスを移し、terminalが閉じます
↓
sublime上で⌘+shift+tもしくはctrl+shift+tでterminalを開きます

これを繰り返す

また

```bash
subl -n　XXX
```

と-nオプションをつけると新しいウィンドウで開いてくれます

![qiita_test_gif.gif](https://qiita-image-store.s3.amazonaws.com/0/96484/c48e4b28-e711-32d6-cb14-b26884ebb664.gif)
一切マウスやトラックパットを使わずにここまでできます

#sublimeのおすすめプラグイン

## terminal
今回の主役
sublime上でterminalを開ける

##GitGutter
sublime上でgitでソースコードを管理していてる場合、変更箇所が表示される

##BrackethigHlighter
{} や() []がどこに対応しているのかを強調してくれる

##ConvertToUTF8
自動でUTF8に変換してくれ、保存する時に元の文字コードをに直してくれる

##WakaTime
[wakatime](https://wakatime.com/)のプラグイン
プログラミングの時間をどれだけやったかを自動で収集して、グラフにしてくれるサービス
モジベーション維持や、どのファイルにどの程度の時間をかけたのかをみるのに使っている
フリーランスになる前にすること！

# フリーランスになる前にすること

フリーランスになると、社会的や経済的に様々な制約を受けます。

 - 社会的信用がゼロになる
 - 保険料が増額になる
 - 税金が増額になる
 - 毎月お金が入金されるとは限らない
 - 今、働いている労働賃金は、数ヶ月後になることが多い

こんなことが起こります。

## 社会的信用がゼロになる

あなたの社会的信用は、あなたの就職先の会社によって保たれていたものです。
なので、あなた単体の社会的信用は全くの無価値の「ゼロ」になります。
これは、個人事業主でも法人（会社）を起業しても同じです。

まあ、フリーランスになる前に、クレジットカードを作成したり、ローンを組んだりするのは
必須事項です。

「会社役員や経営者は、フリーターより社会的信用地位が低いんですよ」と、とある地方信用金庫の営業に投げつけられた暴言です。

## 保険料が増額になる

厚生年金、社会保険料ってやつは、会社員時代には会社と折半することがほとんどです。
なかには悪徳な会社で、全額自己負担をさせられた会社もありましたが、法的に正しいのは会社と折半なので、その二倍の金額を支払う事になります。
日本は、国民全員が健康保険に入らないといけないので、会社の厚生年金や健康保険組合を退会したら、国民健康保険や国民年金に入るわけですが、これが大きな落とし穴があります。
国民健康保険や国民年金は、前年度の収入額によって保険料が決定されるので、
前年度４００万円を超えた収入があった場合、8万円近くの健康保険料と国民年金を
支払う地獄が待ち構えています。
某IT健保協会って、保険料が格安なんですけど、加入するためには審査が厳しく
そう簡単には入れない保険組合だったりします。
一般的に起業したばかりの会社は、国民健康保険か協会けんぽしか加入できないと思った方が良いと思います。


## 税金が増額になる

これも、前年度の収入から算出される市と県の住民税が一気に徴収されます。
フリーランスで独立直後で、いろいろと出費がかさむ時期に、税金もがっぽり持っていかれます。
税金に関しては、強制徴収と言って、銀行口座を差し押さえされたり、動的財産を没収されたりするので、支払から逃れることはできないです。

## 毎月お金が入金されるとは限らない

会社員時代は、月給という素敵システムで毎月決まった日に給与が振り込まれますが、
フリーランスになると、仕事を納品した対価に対する請求になるので、全く収入がない月が年に数回発生することは覚悟しましょう。
こればかりは、毎月、決まった日に給与やボーナスが出る、会社員は羨ましいです。

## 今、働いている労働賃金は、数ヶ月後になることが多い

今、一生懸命働いて、納品しても、請求後翌月末に支払（入金）になることが多いです。
つまり、今働いても、翌月末まで一切の収入が無い場合があるということです。
これが一番つらい。
定期的にお仕事を頂いている人は別ですが、単発の仕事が多いと、入金の無い月が多くなり。いろいろな支払が滞り、カード破産の直前まで追い込まれます。


# フリーランスに向かない人

次に当てはまる人はフリーランスになることはやめておけ、

 - 養う家族がいる人
 - 住宅ローンを組んだばかりの人、これから組もうとする人
 - 毎月のカード払いが給料の半分以上を占める人
 - 定期的に病院に通院して治療している人
 - 貯金がゼロの人
 - 貯金以外の財産がない人
 - 多趣味の人
 - 散財がすべての人

悪いことは言わない、会社員だったら会社員として転職しなさい。

まあ、大手L社やC社のバナー広告に騙されずに、転職をおすすめするよ。

では、また明日。
Windows に MySQL 5.7 をインストールする 

MySQLの Zip Archive からインストールする場合のメモ

## ZIP Archive をダウンロードする

http://dev.mysql.com/downloads/mysql/ から Zip Archive をダウンロードする

## ダウンロードした Zip Archive を展開する

適当な場所に ダウンロードしたZip Archive を展開する。(例えば c:\mysql)


## my.iniを作成する

以下のように c:\mysql\my.ini を作成する

```
# For advice on how to change settings please see
# http://dev.mysql.com/doc/refman/5.7/en/server-configuration-defaults.html
# *** DO NOT EDIT THIS FILE. It's a template which will be copied to the
# *** default location during install, and will be replaced if you
# *** upgrade to a newer version of MySQL.

[mysqld]

# Remove leading # and set to the amount of RAM for the most important data
# cache in MySQL. Start at 70% of total RAM for dedicated server, else 10%.
# innodb_buffer_pool_size = 128M
innodb_buffer_pool_size = 64M
innodb_file_per_table = 1
innodb-status-output = 0
innodb-status-output-locks = 0

default-storage-engine = innodb

# Remove leading # to turn on a very important data integrity option: logging
# changes to the binary log between backups.
# log_bin
log_bin = mysql-bin

# These are commonly set, remove the # and set as required.
# basedir = .....
# datadir = .....
# port = .....
# server_id = .....
basedir = "c:/mysql"
datadir = "c:/mysql/data"
tmpdir  = "c:/mysql/tmp"
port = 3306
server_id = 1

character-set-server = utf8
collation-server = utf8_general_ci

transaction-isolation = REPEATABLE-READ

# Logging
log_output = FILE
log_error_verbosity = 3
log_error = "c:/mysql/logs/mysqld_error.log"
general_log = 1
general_log_file = "c:/mysql/logs/general_query_all.log"
log-slow-admin-statements = 1
log-queries-not-using-indexes = 1
slow_query_log = 1
long_query_time = 1
slow_query_log_file = "c:/mysql/logs/slow_query.log"
log_syslog = 0
log_timestamps = SYSTEM

# Remove leading # to set options mainly useful for reporting servers.
# The server defaults are faster for transactions and fast SELECTs.
# Adjust sizes as needed, experiment to find the optimal values.
# join_buffer_size = 128M
# sort_buffer_size = 2M
# read_rnd_buffer_size = 2M

sql_mode = ONLY_FULL_GROUP_BY,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES

# autocommit = 0
explicit_defaults_for_timestamp = true

default_password_lifetime = 0
secure-file-priv = "C:/var/tmp"

[mysql]
default-character-set = utf8
show-warnings
```

## 初期化

以下のコマンドを実行して初期化する

```
mysqld --initialize-insecure --user=mysql
```

## 動作チェック

以下のコマンドを実行してサービスを起動し、動作チェックする。

```
mysqld --defaults-file="c:\mysql\my.ini" --console
```

## サービスインストール

管理者権限で以下のコマンドを実行し、サービスとして起動できるようにする。

```
mysqld --install "MySQL 5.7.16"
```
（オープンソースにおける）ユニコーンの法則【日本語訳】

# ユニコーンの法則

ユニコーンの法則（Unicorn Law）は、Emma Jane Hogbin[^1]によって提唱されたトークニズム（tokenism[^2], 名ばかり平等主義）についての声明です。2009年のOpen Source Bridge[^3]で、彼女とGabrielle Roth[^4]によって名付けられました。

> もしあなたがオープンソースで活躍する女性であれば、いつか「オープンソースで活躍する女性」についての発表をする[^5]ことになるでしょう。

[法則の元になったオリジナルのtwitterメッセージ](https://twitter.com/gorthx/status/2215270379)

ユニコーンの法則は、Godwinの法則[^6]の変奏（play）です。 知らない方のために紹介すると、Godwinの法則は「Usenetの議論が長くなるにつれて、ナチスやヒトラーとの比較が含まれるようになる確率は1に近づく」というものです。ユニコーンの法則では、オープンソースの女性が「オープンソースの女性であること」について話をする可能性が1に近づきます。

ユニコーンの法則は、内的および外的な動機に由来します。多くの女性は、おそらく、女性のコンピューティング・グループへの参加やコンピューティングにおける女性の主張を含む、自分自身とコミュニティを観察・診断する期間を持ちます。これが、経験したことを公の場で発表することにつながります。他の女性は、オープンソースで女性の経験を代表するように求められ、注目されることを強いられます。後者の場合、職場やギークコミュニティ（例：カンファレンスでのプレゼンテーション）でのトークニズムの例になることもあります。

## ユニコーン

この法則に起因して、**ユニコーン**という言葉を、例外的[^7]な（すなわち最初のあるいは唯一の女性として扱われる）女性を表すのに採用するギーク系フェミニストもいます。


## ユニコーン・トーク

ユニコーン・トークは、__女性であるために__技術系カンファレンスに招待された女性が行う発表です。これらの発表は、問題の分野の女性に関連したテーマ（例: 技術分野における女性）について行われることもしばしばあります。

ユニコーン・トークの招待は、両刃の剣です。ユニコーン・トークをすると、女性の存在感・可視性（visibility）[^8]を高めることができます。しかし、技術的ではない話題について発表することは、女性は技術的ではないという見解を招く可能性があります。また、女性の問題に関する発表は、どんな発表であれハラスメント[^9]を含むネガティブな反応を誘発する危険性があります。

----

（訳者より: 本文書は http://geekfeminism.wikia.com/wiki/Unicorn_Law の翻訳です。オリジナルのライセンスはCC-BY-SA 3.0 unportedで、本翻訳もそれに従います。）


[^1]: http://geekfeminism.wikia.com/wiki/Emma_Jane_Hogbin
[^2]: http://geekfeminism.wikia.com/wiki/Tokenism
[^3]: http://geekfeminism.wikia.com/wiki/Open_Source_Bridge
[^4]: http://geekfeminism.wikia.com/wiki/Gabrielle_Roth
[^5]: http://geekfeminism.wikia.com/wiki/Women_speakers
[^6]: https://en.wikipedia.org/wiki/Godwin%27s_law
[^7]: http://geekfeminism.wikia.com/wiki/Exceptionalism
[^8]: http://geekfeminism.wikia.com/wiki/Invisibility
[^9]: http://geekfeminism.wikia.com/wiki/Harassment
Animate/Flashで使えるJSFLをHaxeで書く

これは、[FLASHer その2 Advent Calendar 2016](http://qiita.com/advent-calendar/2016/flasher2) の記事です。

# JSFLとは
JSFLとは、Animate CC(または、Flash Pro)の[JavaScript API](http://help.adobe.com/ja_JP/flash/cs/extend/WS5b3ccc516d4fbf351e63e3d118a9024f3f-7fe8.html)をつかってツール上の様々な操作をできるスクリプトです。

単純作業の自動化などに使えます。

## JSFLの事例

JSFLを使うと例えば以下のようなことができます。

[現在開いているドキュメントのディレクトリを開く.jsfl](https://github.com/ics-nohara/JFSL/blob/master/%E7%8F%BE%E5%9C%A8%E9%96%8B%E3%81%84%E3%81%A6%E3%81%84%E3%82%8B%E3%83%89%E3%82%AD%E3%83%A5%E3%83%A1%E3%83%B3%E3%83%88%E3%81%AE%E3%83%87%E3%82%A3%E3%83%AC%E3%82%AF%E3%83%88%E3%83%AA%E3%82%92%E9%96%8B%E3%81%8F.jsfl)
[空フォルダを削除する君.jsfl](http://qiita.com/clockmaker/items/b68a650e0dc80f8395a2)
[ビットマップからナインスライスMCを生成.jsfl](http://qiita.com/masato_makino/items/41ab4f51502e3807a013)

# Haxeとは

[Haxe](https://haxe.org/)はActionScript3に似た言語で、swf、ActionScript3、JavaScript、C#、Java、C++、Python、PHP、Luaという複数のプラットフォームに出力可能な言語です。

詳しくは、https://ja.wikipedia.org/wiki/Haxe を見てください。

## Haxe/JSFLの第一歩
Haxeをインストールしたら、以下のコマンドを入力して、[haxe-jsfl](https://github.com/tmskst/haxe-jsfl)をインストールします。

```sh
haxelib git haxe-jsfl https://github.com/tmskst/haxe-jsfl.git
```

haxe-jsfl は、JSFLのAPIの型情報などをまとめたライブラリです。

次に、Haxeのコンパイル用に`build.hxml`を用意します。

```hxml:build.hxml
# JavaScriptターゲットで出力
-js bin/output.jsfl 

# 型情報のライブラリを指定 
-lib haxe-jsfl:git 

# Haxeのソースコードを置くディレクトリの指定
-cp src

# メインクラスの指定
-main Main
```

そして、以下のようなHaxeファイルを準備します

```src/Main.hx
class Main {	
	static function main() {
		trace("Hello JSFL");
	}
}
```

これを以下のコマンドでコンパイルします。

```
haxe build.hxml
```

これで、生成された`output.jsfl`をFlashにドラッグ&ドロップすると、`Hello JSFL`と表示されるはずです。


## Haxeで書くことのメリット

### 入力補完が効く

JSFLの仕様は http://help.adobe.com/ja_JP/flash/cs/extend/flash_extending_reference.pdf に書かれていますが、いちいちこれを読み返しながら作業するのは面倒です。

Haxeで書けば、これらの関数についての補完が効くのでドキュメントを見返す関数も少なくて済みます。

### JSONの読み書きが楽
Haxeの標準ライブラリでは、Haxeで実装されているJSONパーサ/プリンタと、ブラウザ側のJSON APIの両方が利用可能です。

JSFLからはブラウザが提供しるJSON APIは使えませんが、Haxeではコンパイル時に`-D haxeJSON`のオプションを指定することで、Haxeのコードで使用されているJSONパーサ/プリンタが使用されるようになります。

これを使うことで、簡単にJSFLでJSONをあつかうことができます。

### 簡単なActionScriptならパースできる
JSFLではflaファイル内で使用しているActionScriptにアクセス可能ですが、JavaScriptのコードでここから情報を読み取ろうとすると大変です。

Haxeには、Haxeのコードをパースするライブラリがいくつかあります。

[haxeparser](https://github.com/Simn/haxeparser)
[hscript](https://github.com/HaxeFoundation/hscript)

Haxeの文法とActionScript3の文法はよく似ていますから、HaxeとActionScript3で差が出ないようなコードであればこれらのライブラリでパースすることができます。

### Haxeのプログラムとの連携が楽

JSONとして出力する場合、そのスキーマ情報を[typedef](https://haxe.org/manual/type-system-typedef.html) として定義しておくことで出力側と読み込み側で型情報を共有してあつかえます。

また、Haxeの[独自シリアライザ](http://haxe.org/manual/std-serialization.html)を使うことで、Haxe/JSFLで作ったhaxeのオブジェクトをそのまま文字列化して、他のプログラムに持ち運ぶことができます。


## HaxeでJSFLの事例

選択したライブラリ内アイテムを一括で複製する
[LibraryItemDuplication](http://www.dango-itimi.com/blog/archives/2015/001236.html)

各ビットマップデータに対し一括で、 画質を Lossless(PNG/GIF)化し スムージングを OFF にする JSFL
[BitmapSmoothCut](https://github.com/siratama/BitmapSmoothCut)

Flash CC 内構造を Haxe クラスに出力する
[Flash-To-Haxe-Converter](https://github.com/siratama/Flash-To-Haxe-Converter/blob/master/README_jp.md)


------

以上です。
[Swifty]MVCのModel

<p>Try! Swift 2016での発表『<a href="https://realm.io/jp/news/tryswift-daniel-steinberg-blending-cultures/">文化を調和させる: 関数型プログラミング、プロトコル志向プログラミング、オブジェクト指向プログラミングの優れたテクニックを取り入れる</a>』の手法をXcodeの新規プロジェクト（iOS / Application / Master-Detail Application）で作成されたソースコードに適用してたことをシリーズで発表する。</p>

<p>発表では、データをViewControllerのインスタンス変数として保持したが、自分流では必ずModel（Dataコントローラ）を用意しているので、今回もそうした。</p>

<pre><code>class Document: NSObject {
    static let sharedInstance: Document = {
        let instance = Document()
        return instance
    }()
    
    private override init() {
    }
    
    private let hand = Hand()
}
</code></pre>

<pre><code>class MasterViewController: UITableViewController {
 
    var detailViewController: DetailViewController? = nil
    let document = Document.sharedInstance
 
    override func viewDidLoad() {
        super.viewDidLoad()
        self.navigationItem.leftBarButtonItem = self.editButtonItem
 
        let addButton = UIBarButtonItem(barButtonSystemItem: .add,             target: self, action:             #selector(MasterViewController.addNewCard(sender:)))
        self.navigationItem.rightBarButtonItem = addButton
        if let split = self.splitViewController {
            let controllers = split.viewControllers
            self.detailViewController                 = (controllers[controllers.count-1]                 as! UINavigationController).topViewController                 as? DetailViewController
        }
    }
    :
</code></pre>

<p>データをViewControllerのプロパティにしてしまうと、データ管理ができないので、自分は必ずDocumentクラスを用意するようにしている。</p>

ソースコード
GitHubからどうぞ。<br />
<a href="https://github.com/murakami/workbook/tree/master/ios/Hand">https://github.com/murakami/workbook/tree/master/ios/Hand</a> - GitHub<br />

関連情報
<a href="https://realm.io/jp/news/tryswift-daniel-steinberg-blending-cultures/">文化を調和させる</a><br />

【Cocoa練習帳】
<a href="http://www.bitz.co.jp/weblog/">http://www.bitz.co.jp/weblog/</a><br />
<a href="http://ameblo.jp/bitz/">http://ameblo.jp/bitz/</a>（ミラー・サイト）<br />
<a href="https://t.co/6P3h2jtbRk</a>note<br />
機械学習で競馬予想（その3）


[前回](http://qiita.com/tsunaki/items/a1492bd7fd8bf24c2786)までの統計による機械学習からディープラーニング（深層学習）による予測についての記事を書きます。

## 今回のテーマ
多層ニューラルネットワークについて調べたのでまずはそちらから記事にしたいと思います。


## はじめに
ディープラーニングについては様々なライブラリが出ていますので、参考までにリンク一覧を貼っておきます。
　[ライブラリ一覧]
　　TensorFlow:https://www.tensorflow.org/
　　Chainer:http://chainer.org/
　　Caffe:http://caffe.berkeleyvision.org/
　　Theano:http://deeplearning.net/software/theano/index.html
　　Torch:http://torch.ch/
　　scikit-learn:http://scikit-learn.org/stable/
　　PyML:http://pyml.sourceforge.net/
　　Pylearn2:http://deeplearning.net/software/pylearn2/
　　PyBrain:http://pybrain.org/pages/home

## ディープラーニングとは？？

ディープラーニングとは、脳の神経回路にヒントを得た「ニューラルネットワーク」をシステムで再現した機械学習の一種。
回路の中間部分を多層からなる構成にすることで、データの特徴を多段階でより深く学習していくもの。らしい。。
難しい（笑）
簡単に言うと、目で見たものや聞いたものを「バイアス（偏見）」や「ウェイト（重み）」も含めアウトプットする、脳を再現したプログラムって感じです。
また偏見や重み付けは過去データから学習していくもの(教師あり学習)から、入力されたデータの傾向から類似データをクラスタリングする教師なし学習、そして徐々にデータを学習して特徴抽出していく強化型のものがある。
![dl01.png](https://qiita-image-store.s3.amazonaws.com/0/52867/9ac4a1ce-dd29-d512-e2cd-1829e21c9158.png "dl01.png")

## ディープラーニングと機械学習の違い
前述の通りディープラーニングは機械学習の一種だが、機械学習は予めデータの特徴となるパラメータを定義する必要があった。
それに比べディープラーニングは自動的に特徴を抽出して学習していくという違いがある。


今回はここまでとします。
次は実際のプログラムでの競馬予想のサンプルをあげたいと思います。


[開発しているSIVAについて]
［facebook］
https://www.facebook.com/AIkeiba/
［Twitter］
https://twitter.com/Siva_keiba
随時実況していきますので、いいね！フォローお願いします。
多次元配列を多重Forで走査する場合の囲む順番の注意

# はじめに

自分がいつも行っている囲み方が、（体感できるかは置いておいて）効率面であまりよろしくない方法だった。

自分の感覚だと違和感があったので、同じ感覚の人もいるだろうと備忘録ついでに公開。

# 配列について

同じ種類のデータをメモリ上に隙間なく並べたもの。
使うデータが隣り合っているなら、CPUがデータを求めてメモリ上を探す手間が減るため処理効率が良くなる。

→メモリのアドレス順に配列の要素にアクセスすると効率が良い。

# 具体的には→大きい次元の添え字から囲む

悪い例

```vbnet
'悪い例
'sampleArray(0 To X, 0 To Y)
Dim i&, j&
For i = 0 To X  '1次元目
    For j = 0 To Y  '2次元目
        '
        'Debug.Print VarPtr(sampleArray(i, j))
        'sampleArray(i, j)を使って何か処理
        '
    Next j
Next i
```

良い例


```vbnet
'良い例
'sampleArray(0 To X, 0 To Y)
Dim i&, j&
For j = 0 To Y  '2次元目
    For i = 0 To X  '1次元目
        '
        'Debug.Print VarPtr(sampleArray(i, j))
        'sampleArray(i, j)を使って何か処理
        '
    Next i
Next j
```

`i,j`の順番がずれるのが気になるが、こちらのほうがメモリのアクセス順の面でより良い方法となる。

# その他サンプル

```vbnet
'Excelで実行すること前提
Sub 配列アドレステスト()
    Dim tmpArray() As Variant
    
    Let tmpArray = Range("A1:A9").Value
    Call PrintArrayAddress(tmpArray, "9行1列")
    
    Let tmpArray = Range("A1:I1").Value
    Call PrintArrayAddress(tmpArray, "1行9列")
    
    Let tmpArray = Range("A1:C3").Value
    Call PrintArrayAddress(tmpArray, "3行3列")
    
End Sub

Sub PrintArrayAddress(ByRef inputArray() As Variant, ByVal iArrayName As String)
    Dim i&, j&
    Debug.Print vbCrLf; iArrayName; "の配列アドレス"
    
    '良くないアクセス方法なので3行3列の配列ではアドレスがずれて出力される
    For i = LBound(inputArray, 1) To UBound(inputArray, 1) Step 1
        For j = LBound(inputArray, 2) To UBound(inputArray, 2) Step 1
            Debug.Print iArrayName; "("; i; ","; j; ")", VarPtr(inputArray(i, j))
        Next j
    Next i
End Sub
```

# 参考
いつもお世話になっています。
>[VBA ReDimはなぜ最後の次元だけしか拡張できないのか。](http://thom.hateblo.jp/entry/2015/12/26/014523 "VBA ReDimはなぜ最後の次元だけしか拡張できないのか。")

>[VBA 配列とコレクションの違いをメモリ上のデータ構造から理解する](http://thom.hateblo.jp/entry/2016/08/31/014820 "VBA 配列とコレクションの違いをメモリ上のデータ構造から理解する")
[Qiita改善案 AdventCalendar] appというタグを勝手にa++にするのをやめてほしい


appというタグをつけると、勝手にa++というタグになってしまうので、それをなくしてほしいです。
なお、appだけではなく、dppなどでも同様の現象が発生します。

![スクリーンショット 2016-12-02 0.12.27.png](https://qiita-image-store.s3.amazonaws.com/0/74551/553e83f5-b43c-2569-dd00-54655919eaa0.png "スクリーンショット 2016-12-02 0.12.27.png")

![スクリーンショット 2016-12-02 0.12.43.png](https://qiita-image-store.s3.amazonaws.com/0/74551/ecce939f-fd76-2dc6-8c34-94e15c872b9a.png "スクリーンショット 2016-12-02 0.12.43.png")

多分、cppをc++に名寄せするためのロジックが働いているのではないでしょうか?
appはアプリという意味で使いたいこともあるので、appに対してはこの処理をかけないでほしいです。

おそらく、こんなコードがある気がする・・・

```ruby
'app'.gsub(/^(\w)(pp)$/, '\1++') # => a++
```
yamlを千切り「sengiri_yaml」

# sengiri_yamlとは？
巨大なyamlファイルを1要素単位に分割したり、逆に分割されたyamlファイルを連結して1つの `Hash` や `Array` として扱うためのgemです。

* https://github.com/sue445/sengiri_yaml
* https://rubygems.org/gems/sengiri_yaml

キャベツの千切りみたいにyamlを細切りにすることをイメージしたgemです。[^sengiri]

![キャベツの千切り](https://qiita-image-store.s3.amazonaws.com/0/8059/d7288d7e-c4ac-6644-97bb-5223f2d364fe.png)

[^sengiri]: キャベツの千切り画像の出典は http://www.irasutoya.com/2015/02/blog-post_987.html

# 使い方
## yamlの分割
元ファイル

```yaml:/path/to/fat.yml
- data1: data1
  value: 1
- data2: data2
  value: 2
```

`sengiri_yaml` コマンドで分割

```shell-session
$ sengiri_yaml "/path/to/fat.yml" "/path/to/fat_dir"
```

* 1つ目の引数が元ファイル
* 2つ目の引数が出力先のディレクトリ

分割後は下記のようなymlが作られます

```yaml:/path/to/data1.yml
---
- data1: data1
  value: 1
```

```yaml:/path/to/data2.yml
---
- data2: data2
  value: 2
```

例では `Array` の分割ですが、`Hash` にも対応しています

## 分割されたyamlを読み込み
`SengiriYaml.load_dir` でディレクトリにある分割されたyamlファイルをまとめて読み込みます。

```ruby
merged_data = SengiriYaml.load_dir("/path/to/fat_dir")
# => [{"data1" => "data1", "value" => 1}, {"data2" => "data2", "value" => 2}]
```

# rubicureでの使用例
元々はrubucureの900行近くあったyamlファイルをいい感じに分割していい感じに読み込むために作りました。

現在のyamlファイル　[^rubicure_yaml]


[^rubicure_yaml]: https://github.com/sue445/rubicure/tree/v0.4.10/config/girls

![image](https://qiita-image-store.s3.amazonaws.com/0/8059/8797a0f5-0961-7c52-6315-5ec26fa6e736.png)


読み込んでいる箇所 [^rubicure_girl]

[^rubicure_girl]: https://github.com/sue445/rubicure/blob/v0.4.10/lib/rubicure/girl.rb#L131-L137

```ruby:lib/rubicure/girl.rb
      # @return [Hash] content of config/girls/*.yml
      def config
        unless @config
          @config = SengiriYaml.load_dir("#{File.dirname(__FILE__)}/../../config/girls").deep_symbolize_keys
        end
        @config
      end
```

当時のリファクタリングの様子 [^rubicure_pr]

[^rubicure_pr]: https://github.com/sue445/rubicure/pull/64/files

```diff
-        config_file = "#{File.dirname(__FILE__)}/../../config/girls.yml"
-        @@config = YAML.load_file(config_file).deep_symbolize_keys
+        @@config = SengiriYaml.load_dir("#{File.dirname(__FILE__)}/../../config/girls").deep_symbolize_keys
```

yaml分割後に `YAML.load_file` してるところを `SengiriYaml.load_dir` にするだけで動きます。
Linux・MacでVimでHSP開発

皆さんこんにちは、猫でおなじみ[mjhd](https://twitter.com/mjhd_devlion)です。
この頃は大学に住み着いてるノラ猫が子供を産みまして、ひたすらに愛でる日々を送っております。

今回は、前回のsharkppさんによる「[macOS と Wine で作る HSP 3 の開発環境 — さめたすたすのお家](http://www.sharkpp.net/blog/2016/12/01/hsp-advent-calendar-2016-1st-day.html)」を勝手に引き継ぎまして、
**「Linux・MacでVimでHSP開発」の説明をしたいと思います。**

## HSPもVimで開発したい
VimmerでHSPerな人なら、HSP開発もVimで行いたくて仕方がないと思います。**当然の欲求です。**抗えるものではありません。
また**宗教上の理由**などでLinux・Macしか使えない人もいるかと思います。
そこで今回は、Linux・Mac向けに、VimでHSP開発を行う環境を整えたいと思います。

## VimHotというプラグイン
実はもう既にWindows用に[VimHot](http://hp.vector.co.jp/authors/VA038334/archive/)というVimプラグインが存在します。
これを使えばVimでHSPのシンタックスハイライトなどが行えます…が、いかんせんWindows用です。Linux・Macでは動きません。

そこで、**VimHotをLinux・Mac向けに改造しました。**

## 必要なもの
* nkf
* wine

## wineのインストール
前回「[macOS と Wine で作る HSP 3 の開発環境 — さめたすたすのお家](http://www.sharkpp.net/blog/2016/12/01/hsp-advent-calendar-2016-1st-day.html)」を参考に導入してください。
ここでは、C:\hsp34にインストールした前提で説明をしたいと思います。

## インストール
今回インストールするプラグインはコチラ。GonbeiさんのVimhotを改造したものになります。
[mjhd-devlion/vimhot: vim plugin for HSP](https://github.com/mjhd-devlion/vimhot)

NeoBundleを使用している前提で書きます。

* ~/.vimrcに以下の行を足しましょう。

```
NeoBundle 'mjhd-devlion/vimhot'
NeoBundle 'open-browser.vim'
```

* vimを起動して

```
:NeoBundleInstall
```
を実行すればプラグインのインストールが終わります。

* 次に、**~/.vim/bundle/vimhot**内にある**hscl.exe**ファイルを、
**~/.wine/drive_c/hsp34**にコピーしましょう。

以上で設定は終わりです。

## 設定
このままでは使い勝手が良くないので、設定をしてF5キーでコンパイルできたりF1キーでヘルプ開いたりできるようにしましょう。

```
" HSP
autocmd BufNewFile,BufRead *.hsp call FileTypeHsp()
function FileTypeHsp()
  compiler hsp
  set filetype=hsp
  se omnifunc=hspcomplete#Complete
  
  " キー設定
  noremap <F1> ":OpenBrowser http://ohdl.hsproom.me/?q=" . expand( "<cword>")<CR>
  noremap <F5> :make<CR>
endfunction
```

標準のHDLがwine上では正常に動作しないため、
ヘルプの表示にはfujidigさんによるオンライン上のヘルプドキュメントライブラリ、[online-hsp-document-library](https://github.com/mjhd-devlion/online-hsp-document-library)を使用しています。

以上で、インストール完了です。

## 動作画面
設定が終わると、こんな感じでVimによるHSP開発環境が出来上がります。

![Untitled4.gif](https://qiita-image-store.s3.amazonaws.com/0/43622/acdd3b72-933b-f486-7b88-5c52d3cfd45f.gif)

# 素敵なHSPライフを！
CSS(SCSS)だけでPPAP✏️🍍🍎✏️

散々擦られているネタですが, 昨日PPAPが流行語にも選ばれましたのでCSS(SCSS)のみで実装してみました。

参考
http://qiita.com/hmhmsh/items/a9c1848437b765e538d3
http://qiita.com/on0z/items/ef32f79bde5452a2ccec

# 仕様

Pen: ✏️
Pineapple: 🍍
Apple: 🍎

Pen, Pineapple, Apple, Penをランダムに出力して ✏️🍍🍎✏️ の並びが来たら"Pen Pineapple Apple Pen !!"と出力して終了します。

# デモ

[PPAP SCSS on Codepen](https://codepen.io/knhr__/pen/aBVpoz/)

キャプチャ
<img width="708" alt="Screen Shot 2016-12-01 at 23.06.49.png" src="https://qiita-image-store.s3.amazonaws.com/0/134294/576a45b0-7d21-51b1-9c3d-23d788e0cb05.png">

# 処理部分

```scss
$content: "";
$pen: "✏️";
$pineaple: "🍍";
$apple: "🍎";
$array: $pen, $apple, $pineaple;
$init: "";
$p: $pen;
$pp: $pen + $pineaple;
$ppa: $pen + $pineaple + $apple;
$ppap: $pen + $pineaple + $apple + $pen;
$state: $init;

@function createState($nextState, $t, $c){
    @if $c == $t {
      @return $nextState;
    } @else {
      @return $init; 
   }
}

@while $state != $ppap {
    $c: nth($array, random(3));
     
    $content: append($content,  $c);    
     
    @if $state == $init{
      $state: createState($p, $pen, $c);
    } @elseif $state == $p {
      $state: createState($pp, $pineaple, $c);
    } @elseif $state == $pp {
      $state: createState($ppa, $apple, $c);
    } @elseif $state == $ppa {
      $state: createState($ppap, $pen, $c);
    } @else {
      $state: $init; 
    }
}
```

# ランダム関数について

SCSSって言っても結局静的なCSSを吐き出すだけなのでRandom関数はコンパイル時にランダムな値を出力するだけです。
そのためCodepen上ではリロード時にコンパイルが走るため擬似的にうまいこと毎回の表示で異なる出力が再現できます。

https://blog.codepen.io/2013/08/26/random-function-in-sass/

# まとめ

while, if, random があれば割となんでもできる！！
match withはfunctionで書き直せるじゃないか

足し算できる言語を作ります。

```
type e = EInt | EAdd of e * e

let rec eval e =
  match e with
  | EInt(i) -> i
  | EAdd(e1,e2) -> eval e1 + eval e2

let () =
  Printf.printf "%d\n" (eval (EAdd(EInt 1, EInt 2)))
```

足し算できる言語を作ります。これは、以下のようにかきますよね。

```
type e = EInt | EAdd of e * e

let rec eval =
  function
  | EInt(i) -> i
  | EAdd(e1,e2) -> eval e1 + eval e2

let () =
  Printf.printf "%d\n" (eval (EAdd(EInt 1, EInt 2)))
```

ところで、|>演算子を使えば

```
type e = EInt | EAdd of e * e

let rec eval e =
  e |> function
  | EInt(i) -> i
  | EAdd(e1,e2) -> eval e1 + eval e2

let () =
  Printf.printf "%d\n" (eval (EAdd(EInt 1, EInt 2)))
```

と書くことができます。パーシャル関数が使えて|>演算子に相当するものがあれば、マッチ構文はわざわざ作る必要が無いように思います。

言語を作る場合には、パーシャル関数を考えさえすれば、パターンマッチの構文は不要なのではないかという話でした。
EmacsLispことはじめ 設定を書く~hookと自作コマンド~

# はじめに

この記事は、[SLP_KBITその2 Advent Calendar 2016 - Qiita](http://qiita.com/advent-calendar/2016/slp_kbit2)の2日目の記事です。
[SLP_KBIT Advent Calendar 2016 - Qiita](http://qiita.com/advent-calendar/2016/slp_kbit)の1日目の記事の続きです。

hubotについて書くと言っていたのですがやっぱりElispについて書くことにしました！

前回は、EmacsLispを普通のプログラミング言語と同じように使って、プログラムの作成を行いました。
しかし、EmacsLispは本来はEmacsの設定や機能を書くための言語...なので、今回は実際にEmacsの設定を書いていこうと思います！
目指せ脱コピペinit.el ！

# scratchでEmacsLispを記述する

前回の記事では、EmacsLispをscript言語のように実行するオプション`--script`で実行していました。
今回は、きちんとEmacs内で実行します。
通常、emacsを起動した際には、scratchというバッファが開かれています。
`C-x C-b -> C-x o -> scratchを選択 -> Enter`でscratchバッファに移動することが出来ます。
ここでは、EmacsLispの式を書いた後、行末で`C-j`を押すことで、その式が評価されます。
例: `(message "Hello")`と書いて、行末で`C-j`を押すと、Emacs下部の領域(エコー領域)と式の直下に`"Hello"`と表示されると思います。
こうして、逐次実行結果を確認しながら書くことが出来ます。


![emacs-lisp-scratch.gif](https://qiita-image-store.s3.amazonaws.com/0/33326/2fa5dc3b-7f01-3526-219b-d9772c9f7e3b.gif)

# 関数の定義

EmacsLispでの関数の定義は、以下の形式で記述することが出来ます。

```el
(defun 関数名 (引数1 引数2 ...) 処理)
```

例えば、`"Hello"`と表示するだけの関数`my-message`を、以下のような処理で記述します。 

```el:init.el
(defun my-message ()
  (message "Hello"))
```

# hook

Emacsには、本体に様々なhookが用意されています。
hookとは、特定のイベントのタイミングで、指定した処理を実行する仕組みです。
まずは、簡単にemacs起動時に先程の関数を実行するようにhookしてみましょう。
hookの追加は、`add-hook`関数で実行します。emacs起動終了のhookは、`emacs-startup-hook`です。
以下の設定を追加しましょう。

```el:init.el
(add-hook 'emacs-startup-hook 'my-message)
```

これで、起動した際にエコー領域に`Hello`と表示されるようになったと思います。

# シングルクォート

先程の設定には、`'my-message`のように、関数名やhook名の直前に、シングルクォートが書かれていたと思います。
これは、`quote`<del>関数</del>の省略記法です。
<del>`quote`関数は、引数に与えられた値を評価せずに、シンボルを返却する関数です。</del>(2016.12.03 追記[^1])
`quote`は、引数に与えられた値を評価せずに、シンボルを返却する **特殊形式** と呼ばれるものの1つです。
シンボルとは、簡単に言うと**引数そのもの**のことです。
以下に例を示します。

```el
(setq hoge 1)
=> 1

hoge
=> 1

(quote hoge)
=> hoge

'hoge
=> hoge
```

上記の通り、`quote`を付けた場合には、値ではなく`hoge`という変数自体が返却されています。

`setq`も、実は`(set (quote 変数) 値)`と同様な意味を持つ特殊記法です。(\*1)
例えば、以下を実行しようとしたとき、2行目では、変数`hoge`が展開され、`8`となり、`8`に`1`を代入しようとするよくわからない式になってしまいます。
`quote`を使うことで、`hoge`というシンボルに`8`を代入するという式になります。

```el
(setq hoge 8)
(set hoge 1)
```

# 関数をコマンドにする

先程の`my-message`関数は、コード内からは呼び出せますが、ユーザから呼び出すことが出来ません。
これを、`my-message`というコマンドとして、ユーザから呼び出せるようにしてみましょう。
やることは、関数の本体の直前に`(interactive)`という式を挿入するだけです。

```el:init.el
(defun my-message ()
  (interactive)
  (message "Hello"))
(add-hook 'emacs-startup-hook 'my-message)
```

結果
![emacs-lisp-interactive.gif](https://qiita-image-store.s3.amazonaws.com/0/33326/4c905ec9-ce74-f410-7c8c-bbdca01d73f5.gif)
無事、新しいコマンドを作成することが出来ました！(ﾊﾟﾁﾊﾟﾁﾊﾟﾁ

# おわりに

今回は、hookと自作コマンドについて取り上げました。
非常に簡単な内容なので、物足りない人がいたらごめんなさい。_(_ _)_
hookはinit.el書いていてもよく見かけるので、覚えておいて損はないです！
次回ぐらいには、もっと便利な設定を書けるように精進してきます。

[^1]: `quote`、`setq`は、関数ではなく特殊形式と呼ばれるものでした。 @tadsan さんからのコメント頂いたため、変更をしました。
開発をちょっと快適にするXcode小ワザ集

日々のXcodeによる開発がちょっと快適になるようなTipsを紹介したいと思います。

## メインターゲット
Xcode触りたてくらいから、開発に少し慣れてきたかな、という人

## 環境
Xcode8.1

## シーン1
### 任意のファイルをアシスタントエディタで開きたい！

- `option` を押しながら該当のファイルをクリックする

コードとIB上のパーツをIBOutlet接続したい、というときが1番の使い所でしょうか。
他のクラスを見ながら実装したい、というときにも使えます。

<img width="1532" alt="UIView_Style_swift.png" src="https://qiita-image-store.s3.amazonaws.com/0/102583/22740da0-90fa-c63b-aa72-5880172e6fd7.png">

<img width="1529" alt="UIView_Style_swift_2.png" src="https://qiita-image-store.s3.amazonaws.com/0/102583/d23ef0c4-d167-0cdf-089a-1e45349575bd.png">


## シーン2
### ファイル名で検索して、そのファイルに移動したい！

ドキュメントやコメントにファイル名の記載があって、そのファイルを編集したい！ということはよくあると思います。
ディレクトリ構造が複雑なアプリだったりすると、地味に目的のファイルを探すのが面倒だったりします。
そんなときに使えるショートカットがこちら！

- `command + shift + o`

目的のファイル名を入力すると候補がズラッと出てくるので、こちらから一発で移動可能です。
さらに、メソッド名や変数名も検索の対象となっています。

<img width="1102" alt="search.png" src="https://qiita-image-store.s3.amazonaws.com/0/102583/e8f519bc-d8fc-a8fc-32d4-6bc240990231.png">


## シーン3 
### アシスタントエディタ側で `command + shift + o` 使いたい！

`command + shift + o` や直接ファイルを選択して開く際、デフォルトでプライマリエディタ側を使うようになっています。
でもアシスタントエディタ側で開きたいときもある！
そんなときは・・・

- `Preference` > `Navigation` の `Navigation:` で `Uses Focused Editor` を選択する

<img width="748" alt="navigation.png" src="https://qiita-image-store.s3.amazonaws.com/0/102583/7f8d53f2-1eee-3047-12d0-d7263556cdc3.png">

そうするとフォーカスが当たっているエディタ側でファイルが開かれます。
個人的にはこちらの設定の方が直感的でいいのかなと思っています。

## シーン4
### 今見てるファイルはどのディレクトリにあるのか知りたい！

- `command + shift + j`

シーン2の `command + shift + o` やブレークポイントで引っかかったりして、直接ファイルが開かれることは多々あるかと思います。
特に周辺のクラスもまとめて触るときなんかは、プロジェクトナビゲーターで現在のファイルを表示させたいですよね。
そんなときはこちらのショートカットを使いましょう。
プロジェクトナビゲーター上に現在開いているファイルを表示してくれます。

<img width="261" alt="j.png" src="https://qiita-image-store.s3.amazonaws.com/0/102583/813640c8-8086-f9f5-75cd-76d7a5ccdb7c.png">

<img width="262" alt="j_2.png" src="https://qiita-image-store.s3.amazonaws.com/0/102583/a3a37f97-2d44-82ef-0158-2377182dbc17.png">


## シーン5
### アプリが落ちるときにブレークポイントが効いてほしい！

- `Breakpoint Navigator`左下の`+`を押下し、`Exception Breakpoint…`を選択する

アプリが落ちてしまうので原因を探りたい・・・でもそもそもアタリをつけられない・・・というときにはこれ！
例外発生時にブレークしてくれます。
こいつを仕込んでおけば、不具合の解決が早くなりそうですね。
原因によってはそのまま落ちてしまうこともあるので頭の片隅に入れておいてください。
Vim 8.0 Advent Calendar 2 日目 チャンネル

この記事は [Vim 8.0 Advent Calendar](http://qiita.com/advent-calendar/2016/vim8) の 2 日目の記事です。

Vim 8.0 では、外部リソースとのやりとりを行う機能としてチャンネルが追加されました。
本記事では、チャンネルの基本的な使い方として、ソケット通信を行う方法について簡単に説明します。
詳細については Vim 付属の help を参照してください。

## チャンネルを使う

この例では、ローカルホストの HTTP サーバに対して `ch_sendraw()` 関数を使ってリクエストを送り、結果をハンドラで受け取って表示しています。


```vim
" リモートからのレスポンスがあった際に呼ばれるハンドラ関数を定義します
function! s:handle(ch, msg) abort
  " レスポンスを表示します。実際にはタイミング次第ではレスポンスが分割される可能性もあり得ます
  echo a:msg
  " ch_close() 関数でチャンネルを閉じることができます
  " リモートから切断された場合は自動的に閉じられます
  if ch_status(a:ch) !=# 'closed'
    call ch_close(a:ch)
  endif
  echo ch_status(s:ch)
  " => closed
endfunction

" チャンネルを開く際に渡すオプションを用意します
" ここではモードを "raw"、コールバックに先ほど定義したハンドラ関数の参照を指定しています
let s:options = {'mode': 'raw', 'callback': function('s:handle')}

" ch_open() でチャンネルを開きます
let s:ch = ch_open('localhost:80', s:options)
" ここで s:ch 変数は channel 型の値になります。channel 型は、チャンネル機能のために新しく追加された型です
echo ch_status(s:ch)
" => open
" 生の HTTP を叩きます
call ch_sendraw(s:ch, "GET / HTTP/1.0\r\n\r\n")
```

ここで、`s:handle()` 関数は非同期に呼び出されます。つまり、サーバからのレスポンスがあるまでの間、ユーザーは編集を続けることができます。
ただし、マルチスレッドではない点に注意してください。`s:handle()` が呼び出され、実行されている間はユーザーは Vim の操作ができません。重い処理はしないように注意が必要です。

## チャンネルのモード

先ほどの例では raw モードでチャンネルを使用しました。チャンネルには他にも多くのメッセージの送信/受信の方法があります。

チャンネルで行う通信には 4 つのモードがあります。モードによって Vim はメッセージを解釈し、コールバックをメッセージ単位で呼び出してくれたり、メッセージのエンコード/デコードを行ってくれます。

- JSON
  [JSON](http://www.json.org/ "JSON") 単位でメッセージをやりとりします。
  メッセージには JSON を Vim のオブジェクトに変換したものが渡されます。

- JS
  JSON に似ていますが、JavaScript のオブジェクトを使ってメッセージをやりとりします。
  オブジェクトのキーの `""` が省略されたり、配列に空の要素が許可されたりなどの違いがあります。

- NL
  行単位でメッセージをやりとりします。
  メッセージには末尾の改行を取り除いたものが渡されます。

- RAW
  Vim はメッセージを解釈しません。そのままのデータが使われます。

## その他のメッセージの読み書きの方法

例では `ch_sendraw()` と、ハンドラを使った読み書きを行いました。他にもいくつか紹介します。

### `ch_sendexpr()` `ch_sendraw()`

チャンネルに対してメッセージを送ります。
`JSON` モードや `JS` モードの際は `ch_sendexpr()` を使い、Vim のオブジェクトを渡すことでエンコードされた値が送られます。
`NL` モードや `RAW` モードの際は `ch_sendraw()` を使い、文字列を渡すことで生のデータを送れます。

### `ch_read()` `ch_readraw()`

チャンネルのバッファにあるメッセージを読みます。読みとったメッセージはバッファから取り除かれます。また、ハンドラに処理されたメッセージもバッファからすでにないため、読めません。
`JSON` モードや `JS` モードの際は `ch_read()` を使い、デコードされた値が得られます。
`NL` モードや `RAW` モードの際は `ch_readraw()` を使い、生のデータを得られます。`NL` モードの場合は、改行単位でメッセージを読み取ります。

### `ch_evalexpr()` `ch_evalraw()`

チャンネルに対してメッセージを送り、そのレスポンスを待って、レスポンスを返します。send と read を一度にやるものです。使い分けについても前述のものと同じです。


|            | `JSON`/`JS`     | `NL`/`RAW`     |
|:---------- |:--------------- |:-------------- |
| **送信**   | `ch_sendexpr()` | `ch_sendraw()` |
| **受信**   | `ch_read()`     | `ch_readraw()` |
| **送受信** | `ch_evalexpr()` | `ch_evalraw()` |



チャンネルには他にもまだまだ機能やオプションがあります。詳細は `:help channel` を参照してみてください。