OmniAICreator/Qiita-1.07M huggingface dataset:
Visual Studio Tools for Azure Functions 使ってみた

# Azure Functions とは
2016/11/16にGAされたMicrosoftのサーバーレスアーキテクチャです。
先日C#が利用可能になった AWS Lambda の Microsoft Azure 版といったところです。

基本的に処理時間に応じた課金となり、必要な時に必要な分のリソースを使用し、それに応じて課金されるというクラウドらしいアーキテクチャです。

# Visual Studio Tools for Azure Functions とは

2016/12/01 にPreview版が公開された Azure Functions をVisual Studio 2015 上でAzure Functions の開発が可能になる Visual Studio の拡張です。
本記事を書いている段階では当然まだPreviewのままで、機能に制限があります。

# なんでPreview版の使用を真面目に検討してるのか
Azure Functions、私の場合は .csx の開発を行っていたのですが、今までの .csx の開発環境がとにかくイケてなかったからです。

## .csx開発の試行錯誤
最初、Azure Protal上でそのまま書いてみたのですが、当然ですがとにかく書き辛い。やはりIntellisense  が効かないのが非常に辛い。
結局 Visual Studio でコンソールアプリを作り、その中で.csのコードを書いて Azure Portal 上のFunctions Editor に貼り付け、その度に必要部分を修正するという手法を取りました。
読んでいればすぐに想像がつくと思いますが、これまた手間がかかる。コードの修正、Try and Error の度に .cs -> .csx の変換や、場合によっては.csx 上でそのまま修正したりもしたくなりますので、どののコード部分を移植すればいいのか忘れて混乱し、無駄な手戻りを繰り返しました。

## Visual Studio Code での開発
これでは開発がやり辛いので、もっとましな方法はないものかと調べた結果、 Visual Studio Code 用にscriptRunner という拡張が公開されていることに気が付き、使用してみることにしました。
Chocolatey を使用して（この時点でやや面倒）scriptcs を入れて、Visual Studio Code はインストールしていたので、 scriptRunner を入れて開発環境が整いました。
しかし、単純な .csx ファイルの開発はでるようになったのですが、 nuget から外部パッケージを入れようとするとエラーが発生してこれを解決できず諦めて最初の手法に戻ってしまいました。（実行環境含めてサードパーティ製だったので、あまり追及する気力がわかなかった）

## VS拡張公開（ただしPreview）
そんな状態で面倒な手間をかけ続けていたのですが、本拡張が公開されやっとまともな開発環境が手に入るようになると安堵しつつ調べている次第です。ただし、まだPreviewなのでまだまだイケてない部分も多いので進化に期待しつつ使用していきたいところです。
~~正直、機能がGAした後に出してきてまだPreviewってなんだよと言いたいですが~~

# Visual Studio Tools for Azure Functions の使用条件
インストールにもいくつか条件があり、
- Visual Studio 2015 が Update 3 になっていること
- Microsoft Web Developer Tools がインストールされていること
- Azure SDK for .NET 2.9.6 がインストールされているされていること
となっています。

# インストール
- Azure SDK for .NET 2.9.6 は [Microsoft Web Platform Installer](https://www.microsoft.com/web/downloads/platform.aspx) からインストールします。
- Visual Studio Tools for Azure Functionsは以下のURLからダウンロードし、インストールを行います。
 - https://aka.ms/azfunctiontools

# プロジェクトの作成
Visual Studio Tools for Azure Functions をインストールするとプロジェクトテンプレートに "Azure Functions (Preview)" が追加されます。
![VS4AzureFunc_001.png](https://qiita-image-store.s3.amazonaws.com/0/150005/26edcf2a-a8b5-6b48-21b1-85a765eead44.png)

そしてプロジェクトを右クリック→コンテキストメニューから追加→New Azure Function... を選択すると以下の画面が出てくるので作りたいものを選択し必要情報を入力。
![VS4AzureFunc_002.png](https://qiita-image-store.s3.amazonaws.com/0/150005/a65084bf-f526-cf9d-b770-631cb2293223.png)

QueueTrigger - C# で作成するとこんな感じでFunctionが作成されます。
![VS4AzureFunc_003.png](https://qiita-image-store.s3.amazonaws.com/0/150005/07734cd9-3051-3f79-121f-ca85792b4b49.png)

これで Azure Functions の開発を Visual Studio 上で行う事ができるようになりました。
プロジェクトのコンテキストメニューから[公開]を選ぶことで同じく Visual Studio 上から App Service へのデプロイもできます。
![VS4AzureFunc_004.png](https://qiita-image-store.s3.amazonaws.com/0/150005/67544c19-cda7-3d77-4196-e117d0f7f3de.png)
大分便利になりましたね。

# とはいえ
まだまだ問題もありまして、例えば新しい項目の追加で別の.csxを追加しようとしても何も出てこなかったり、色々不便な点もあります。
現状ではそのあたりの折り合いを付けつつ使っていく必要がありそうです。
浮動小数点の表現の仕方

浮動小数点をある特定の桁数で表現しなければいけなかったことがあったので、
備忘録がてらに記載方法を書きます。


```java
double f = 1.5
System.out.printf("%6.5f",f);
```
それか

```java
double f = 1.5
System.out.println(String.format("%6.5f",f));
```

の方法で浮動小数点を表現できます。
文字列連結時に浮動小数点を表現する場合はString.formatを使えば可能です。

記載内容の詳しい説明ですが、
String.format（%A.Bf、変数）

Aに入る値としては、表示したい桁数です。
Bに入る値としては、小数点以下の表示したい桁数になります。

なので、↑に記載の内容だと、
表示される値は「1.50000」になります。
Emacs Lisp で括弧を省略できる式として利用できるシンボル

Emacs Adevent Calendar 2016 の 12/9 が空だったため、Emacs Lisp の豆知識を入れます。

Emacs Lispでは、引数を評価しない特殊形式 `quote` は頻出するため、 `'` で代用できます。

すなわち以下の２式は等価で、上側の式は括弧が不要になっています。

````lisp
'a
(quote a)
````

このように、括弧を省略できる式として扱えるシンボルが、Emacs Lisp では他に4つ用意されています。

バッククォート（すでに backquoteマクロとして定義済です）

````lisp
`a
(\` a)
````

カンマ （バッククォート内で、特殊シンボルとして利用されています）

````lisp
,a
(\, a)
````

カンマ・アット（バッククォート内で、特殊シンボルとして利用されています）

````lisp
,@a
(\,@ a)
````

カンマ・ドット

````lisp
,.a
(\,. a)
````

上記のうち、バッククォート以外は、関数やマクロとして定義されていないため、自分で利用できます。カンマ・ドットは1995年頃、 Common Lisp のバッククォートの「破壊的なスプライシング」と互換性を持たせるために Reader に導入されました。しかし、破壊的なスプライシングそのものが使いにくという理由のため、 backquote.el 本体には実装されず、かといって、Reader からもカンマ・ドットは削除されず、放置状態が続いています。

以下に、これらのシンボルを局所的な関数として利用する例を示します。

````lisp
(defun example (info)
  (concat
     "name=" (assoc-default :name info) "\n"
     "address=" (assoc-default :address info) "\n"
     "tel=" (assoc-default :tel info) "\n"
     ...))
````

上記のように引数が１つだけ異なる関数を大量に呼び出す場合、それを cl-flet で以下のように置き換えると

````lisp
(defun example (info)
  (cl-flet ((\, (key) (assoc-default key info))))
    (concat
      "name=" ,:name "\n"
      "address=" ,:address "\n"
      "tel=" ,:tel "\n"
      ...)))
````

このようにコードをすっきりさせることができます。

コードを変数化し、別に分離する際には、 eval 時に backquote を必要とする場面がしばしばあるため、 backquote マクロに影響されないカンマ・ドットは特に有用です。

````lisp
(defvar info
  '((:name . "hoge") (:address . "page") (:tel . "num")))

;; ここで format を変数として分離したい。
(defvar format
  '("name=" ,.:name "\n"
    "address=" ,.:address "\n"
    "tel=" ,.:tel "\n"))

;; 実際の評価
(defun example (info)
  "Test INFO."
  (eval `(cl-flet ((\,. (key) (assoc-default key info)))
           ,(cons 'concat format)) t))
````
技術英語 > You might [have a better sense of] how to isolate global variables in access routines

@ Code Complete (No. 18429 / 36077)

> You might **<font color=red>have a better sense of</font>** how to isolate global variables in access routines

http://eow.alc.co.jp/search?q=have+a+better+sense+of
> ～についてよりよく理解［把握］する

<hr>
僕が「回路の神様」と呼んでいる50年間、回路の設計、実装、試験を続けてきたSさんは、こちらが困っている回路の悪い部分を特定して次々に直していってくれた。もう3年は前のお話。

He had a better sense of how to address the problem.
https://www.merriam-webster.com/dictionary/address

最近はずっと会っていない。

その人の1/100の知識でもあれば電子回路関連のトラブル対策にかかる時間を激減することができる。

たくさん教えていただいたはずだけれど、飲み込みの悪さのためかあまり身についてはいません。
Hacker Newsを一覧表示してくれるCLIツールを書いた


## はじめに

この記事は、[Go Advent Calendar 2016](http://qiita.com/advent-calendar/2016/go) 8日目の記事です。

## 作ったもの

[Hacker News](http://b.hatena.ne.jp/hotentry)の一覧を表示してくれるコマンドラインツール「hngo」
https://github.com/massa142/hngo

![Screenshot.png](https://qiita-image-store.s3.amazonaws.com/0/19111/d9624fb8-0d32-841a-dd75-b0b46bf01bb3.png "Screenshot.png")

[去年のGo Advent Calendar](http://qiita.com/advent-calendar/2015/go)で、はてブを一覧表示してくれるCLIツールを作りました。
[はてブ ホットエントリーを一覧表示してくれるCLIツールを書いた](http://qiita.com/massa142/items/4179dfe7e41b002cd68e)

この[gotebu](https://github.com/massa142/gotebu)を毎日使っていますが、便利で捗るんで今年はHacker News版のCLIを作ってみました。

[Hacker News API](https://github.com/HackerNews/API)を使えばスクレイピングしなくてもOKだと思いますが、去年からの流用なので今回も[goquery](https://github.com/PuerkitoBio/goquery)を使ってデータを抜き出しました。

## 参考にしたもの

+ [コマンドラインツールについて語るときに僕の語ること - YAPC::Asia Tokyo 2014](http://yapcasia.org/2014/talk/show/b49cc53a-027b-11e4-9357-07b16aeab6a4)

+ [「commit-m: GitHubコミットメッセージの文例が検索できるサービス」がとても便利だったのでcliから使えるコマンド書いた](http://yuroyoro.hatenablog.com/entry/2015/11/10/132620)

## おわりに

hngoのおかげで、普段あまりチェックできてないHacker Newsがもっと身近な存在になりそうです！ʕ◔ϖ◔ʔ

+ goqueryはやっぱりお手軽で使いやすい
+ CLIツールを簡単に作れるGolang楽しい

来年から仕事でGolangを使うことになりそうなので、とりあえず会社で借りた[みんなのGo言語【現場で使える実践テクニック】](http://gihyo.jp/book/2016/978-4-7741-8392-3)をはやく読みます！
Raspberry PiにRaspbianOSをインストールしたり設定したりのメモ（Mac限定）

# ダウンロードせよ

[公式](https://www.raspberrypi.org/downloads/raspbian/)か[ミラー](http://ftp.jaist.ac.jp/pub/raspberrypi/raspbian/images/)からzipファイルを落として解凍しておきます
(早いのでミラーがおすすめ)

# 魂のコマンドを叩き込め

```
# cd imgファイルのあるディレクトリ

SDカードのデバイス番号調べる
# df -h

フォーマットする(diskNのNは上で調べた番号)
# sudo diskutil eraseDisk FAT32 RPI /dev/diskN

アンマウントする(diskNのNは上で調べた番号)
# sudo diskutil unmountDisk /dev/diskN

rdiskNとするとraw書き込みで早い
# sudo dd bs=1m if=[imgファイルのパス] of=/dev/rdiskN
```

# ラズパイにSDカードを挿して起動せよ
動いたかな？

# 接続
ラズパイのipはarp -a とかで適当に検索

```
初期パスワードはraspbianになってます
# ssh pi@ipアドレス
```

# 設定
この辺で適当に設定

```
# sudo apt-get update -y
# sudo apt-get upgrade -y
# sudo apt-get dist-upgrade -y
# sudo apt-get autoremove
# sudo apt-get clean
# sudo raspi-config
# sudo rpi-update
# sudo reboot
```

wifi設定

```
# sudo sh -c 'wpa_passphrase wifiのSSID wifiのPASSWORD >> /etc/wpa_supplicant/wpa_supplicant.conf'
```

# 日本語化

```
# sudo apt-get install -y ibus-mozc
# sudo apt-get install -y fonts-vlgothic ttf-kochi-gothic ttf-kochi-mincho fonts-takao fonts-vlgothic fonts-ipafont xfonts-intl-japanese xfonts-intl-japanese-big xfonts-kaname 
```
Nutanixが提供するデータ保護機能 (サイト間での移行・復旧編) その1

# はじめに
この記事は、[Nutanix Advent Calendar 2016](http://www.adventar.org/calendars/1783) 12月8日の分として作成しました。本記事の内容はこの日付の情報に基づいています。

またこの記事は[Nutanixが提供するデータ保護機能 (リモートレプリケーション編)](http://qiita.com/shmza/items/cb7116def4c8629919e1)の続編となります。前回の記事 [^1] はNutanixのAsyncDRの機能を用いて、複数のNutanixクラスター間でストレージのスナップショットを取得し、それを対向のNutanixクラスターに転送する手法をご紹介いたしました。

今回の記事では、複数の拠点をまたいで仮想マシンを復旧・移行する手法をご紹介します。

# Nutanixクラスターをまたぐ仮想マシンの復旧・移行の概要
AsyncDR機能を用いてDRサイト側に転送されたスナップショットデータを復元します。特徴的なのは、単にデータの復旧を行うだけではなく、DRサイト側のハイパーバイザー上に自動的に仮想マシンのインベントリの登録も行われる点です。それによりDRサイト側で復旧オペレーションを行うだけで、仮想マシンとして電源を入れて使用することができます。

また、2016年2月にリリースされたNutanixのAOS4.6からは異種ハイパーバイザー間でも復旧・マイグレーションが可能になりました。例えば、本番サイトはESXiハイパーバイザーを使用し、DRサイトではAHV(Acropolis HyperVisor: Nutanixが提供するKVMをベースとしたハイパーバイザー)を使用する構成も可能となります。

<img width="563" alt="異種ハイパーバイザー間のデータ保護" src="https://qiita-image-store.s3.amazonaws.com/0/83432/6ecfc4fa-28c3-11e1-c2ca-b59514cd294e.png">

スナップショットを転送する際に自動的に仮想マシンの形式をそれぞれのハイパーバイザーの形式、例えばESXiの場合はVMDK形式やAHVの場合はQCOW2形式に変換するため、異種ハイパーバイザー間でもシームレスな移行が可能です。クロスハイパーバイザーでのDRについては、ブログ[「インフラ屋とアプリ屋のあいだ: Nutanixのクロスハイパーバイザーを試してみるその①　そもそもAHVとは」](https://infraapp.blogspot.jp/2016/12/nutanixahv.html)にまとめられておりますので、ぜひご一読ください。

# 復旧・移行のパターン
復旧・移行には以下の3つのパターンがあります。

- **計画的な移行(Planned Failover):** 本番サイト、DRサイトともに稼働している状態で、仮想マシンを本番サイトからDRサイトに移行します
- **災害による移行(Disaster Failover):** 本番サイトが被災して完全に停止した状態で、DRサイトから仮想マシンを復旧します
- **DRサイトから本番サイトへのフェイルバック(Failback):** 本番サイトが復旧したのちに。DRサイトの仮想マシンを本番サイトに移行します。操作としては計画的な移行と同一です

それぞれの移行方法で必要となるオペレーションと、実行した時にどのような処理が行われるかを図示します。

- **計画的な移行(Planned Migration)とフェイルバック:**
<img width="700" alt="計画的な移行" src="https://qiita-image-store.s3.amazonaws.com/0/83432/79b99eaf-000f-107e-6c98-afe64d28f619.png">

- **災害による移行:**
<img width="700" alt="災害による移行" src="https://qiita-image-store.s3.amazonaws.com/0/83432/94600b33-d870-75b3-757f-0dceb84f8584.png">



どちらも最小限の手動オペレーションで移行・復旧が行われます。

#留意点
サイト間での移行・復旧は非常に便利で強力な機能ですが、幾つか留意すべき点があります。

- IPアドレスを変更することができない: スナップショットを使用した機能のため、移行元と移行先の仮想マシンは同一IPアドレス設定となります。IPアドレス変更の自動化などはできません
- 仮想マシンの起動は手動: 本機能では仮想マシンの自動起動は行われません。起動は管理者が手動で実施する必要があります
- vCenterにはインベントリが残る: ESXiを使用している場合、仮想マシンの登録解除や削除はvCenterを介さず、直接ESXiサーバに対してオペレーションを行います。このため、vCenterサーバー上には親なしの状態で仮想マシンのインベントリが残ってしまいます
- コールドマイグレーションになる： 移行手順の図の通り、この機能での移行は仮想マシンの再起動を伴うコールドマイグレーションとなります

# 終わりに
Nutanixの災害対策機能の移行・復旧の概要と2つのNutanixクラスターを使用した移行・復旧手順をご紹介しました。
繰り返しの引用となりますが、異種ハイパーバイザー間のDR機能については、ブログ[「インフラ屋とアプリ屋のあいだ: Nutanixのクロスハイパーバイザーを試してみるその①　そもそもAHVとは」](https://infraapp.blogspot.jp/2016/12/nutanixahv.html)のシリーズで詳細に解説されていますので、ぜひ合わせてご一読ください。
次回は計画的な移行と、災害による移行のそれぞれの操作をご紹介します。

[^1]: 約1年前の記事です。ごめんなさい
Mapped Typeを使って、Partial typeからStrict typeを生成する

**2016.12.12 追記**

**コメントにある通り、この挙動は意図したものではないようです。(Nightly 2.2.0 dev.20161211で挙動も変わったようです)
残念ですが、今のところPartial TypeからStrict Typeを得る一般的な方法はないようです。**

もともとの動機は、下のような２つの型を別々に書きたくないという話だったのですが、

```ts
type PersonPartial = { name: string, age?: number, gender?: "male"|"female" };
type PersonStrict = { name: string, age: number, gender: "male"|"female" };
```

とりあえず、

```ts
type PersonRequired = { name: string };
type PersonOptional = { age: number, gender: "male"|"female" };
type PersonPartial = PersonRequired & Partial<PersonOptional>;
type PersonStrict = PersonRequired & PersonOptional;
```

とでもするしかなさそうです。

-----

TypeScript 2.1がリリースされました。
やはり `keyof` / Mapped type の注目度が高いようで、qiitaにもネタが集まりつつありますね。いいことです。

[TypeScript 2.1のkeyofとかMapped typesがアツい](http://qiita.com/Quramy/items/e27a7756170d06bef22a)
[TypeScript 2.1 で setState() が型安全になるぞー](http://qiita.com/kawachi/items/1511f20aa6397804ad3f)

## やりたいこと

さて、以下のような２つの型があるとします。[^1]

```ts
type PersonStrict = { name: string, age: number };
type PersonPartial = { name?: string, age?: number };
```

`Partial<T>` を使えば、 `PersonPartial` は以下のように `PersonStrict` から得ることができるというのは、上に挙げた「[TypeScript 2.1 で setState() が型安全になるぞー](http://qiita.com/kawachi/items/1511f20aa6397804ad3f)」でも紹介されていました。

```ts
type PersonPartial = Partial<PersonStrict>;
```

では、逆に `PersonPartial` から `PersonStrict` を得ることはできるでしょうか？ [^2]

```ts
type Strict<T> = ???; // これをどう定義すれば、下のように PersonStrict を得られるか？
type PersonStrict = Strict<PersonPartial>;
```

## こたえ

素直に考えると、これ(↓)でできそうな気がします。が、実際にやってみると、これでは各メンバは省略可能なままです。

```ts
type Strict<T> = { [K in keyof T]: T[K] };
const person: Strict<PersonPartial> = { name: "iwata" }; // 代入できてしまう
```

ですが、これに　`()` をおまじないとして付加すると、見事に strict typeに変わりました。

```ts
type Strict<T> = { [K in (keyof T)]: T[K] };
const person: Strict<PersonPartial> = { name: "iwata" }; // age がないというエラーになる
```

TypeScript面白いですね。

## なぜそうなる？

**正直に言うと、分かりません。**

想像でしかないですが、一つ目の例の `[K in keyof T]` というのはそれ自体が一つのイディオムで、この場合に限り省略可能かどうかをMapped typeに引き継ぐための処理がなされているのではないかなあと。
これに()をつけて、`keyof T` を先に評価させることで、「Tのプロパティ名」ではなく「単なる "name" と "age" の直和型」に意味が変わるので、省略可能かどうかという情報が欠落するということかなあと考えています。
ご存じの方がいたら教えてください。

## 免責事項
ドキュメント上にこの挙動に関する記述を見つけることはできなかったので、実はこれは仕様ではなくて不具合だったみたいな話になるかもしれません。
その場合はごめんなさい。


## 脚注

[^1]: `PersonPartial` のような全てのメンバを省略可能にした型を「Partial type」と呼ぶのはドキュメントにも登場する呼び方なのですが、逆に全てのメンバを省略不可にした型をなんと呼ぶべきかは見当たらなかったので、とりあえずこのエントリでは「Strict type」と呼ぶことにしています。

[^2]: なんでそんなことをしたいのかはまた別の機会に。
Octopressのコード表示の行番号のズレを直す


私のブログで、コード表示をすると、行番号がずれて表示されていた。

![bootstrap.png](https://qiita-image-store.s3.amazonaws.com/0/29692/c020176d-02a8-aa23-e934-5b29fb1ab102.png "bootstrap.png")

検索しても情報が出ないので困り果てていたが、ふとWebインスペクタを見ると、bootstrap.cssがsyntax.cssと干渉しているのが原因だと判明した。

## 方法

bootstrap.cssの`code,pre{}`に、`font-size:12px;`なる箇所があるので、これを削除すれば良いです。

## 余談

(スクリーンショットですが、[pngout](http://www.jonof.id.au/kenutils)で圧縮した後、[7png](https://github.com/cielavenir/7razf)で再圧縮することでわずかながらより小さい画像を作成できました)
バージョン管理ツール、パッケージ管理ツールの種類をまとめました

## 最初に

最近言語の勉強している中で、バージョン管理ツールやパッケージ管理ツールが色々あって、何がなんだか分からなくなってしまったのでまとめました。

**言語のバージョン管理ツールとは**
言語の各バージョンのインストール・アンインストールや切り替えを簡単に行ってくれるツールです。
同じく「バージョン管理ツール」と呼ばれるGitやSVNとは別物です。この記事ではわかりやすくするために「言語のバージョン管理ツール」と表現しました。

**言語のパッケージ管理ツールとは**
言語の各パッケージのインストール・アンインストールを行うツールです。インストール・アップグレート時には依存関係にあるパッケージを自動でインストール・アップグレートしてくれます。
この記事ではOSのパッケージ管理ツールと分けるために「言語のバージョン管理ツール」と表現しました。

**OSのパッケージ管理ツールとは**
機能としては言語のパッケージ管理ツールと同じですが、こちらはOSのパッケージを管理するツールです。

---

※実際に動作までは確認していないので、すべてのツールが上で説明しているような機能を提供しているわけではないかもしれません。参考として見てみてください。

## 言語のバージョン管理ツール

`ndenv` (Node.js)
`nodenv` (Node.js)
`rbenv` (Ruby)
`phpenv` (PHP)
`pyenv` (Python)
`plenv` (Perl)
`jenv` (Java)
`scalaenv` (Scala)
`swiftenv` (Swift)
`goenv` (Go言語)

`nodebrew` (Node.js)
`rbrew` (Ruby)
`phpbrew` (PHP)

`nvm` (Node.js)
`nodist` (Node.js)

**補足**
○○env系は他にも様々な言語用のツールが存在しているようです。また、 `anyenv` というツールで一括管理することができます。

## 言語のパッケージ管理ツール

`npm` (Node.js)
`yarn` (Node.js)
`gem` (Ruby)
`Composer` (PHP)
`pip` (Python)
`CPAN` (Perl)
`sbaz` (Scala)
`glide` (Go言語)

**補足**
Scalaの場合は `sbt` というビルドツールを使えばパッケージ管理もやってくれるみたいなのでこっちの方が便利そうでした。

## OSのパッケージ管理ツール

`PackageManagemet` (Windows)
`Chocolatey` (Windows)
`MacPort` (Mac)
`Homebrew` (Mac)
`rpm` (Linux RedHot系)
`yum` (Linux RedHot系)
`deb` (Linux Debian系)
`apt-get` (Linux Debian系)
`Linuxbrew` (Linux)

**補足**
LinuxbrewはLinux版のHomebrewということらしいです。

## 最後に

npmとnvmやNodebrewとHomebrewなど名前が似ていて紛らわしいなと思います。同じように感じている方の参考になれば幸いです。
何も知らない人のための人工知能①人工知能を学ぶ意義

#人工知能って神様なの？
最近やたらと「人工知能（**A**rtificial **I**ntelligence）」という言葉が聞かれるようになった気がする。
googleで「人工知能」を検索すると約1750万件の検索結果が得られる（2016/12/09現在）。
「AI」では約19億8千万件だ。
「ピコ太郎」が約1630万件であることを考えると、この世の人工知能に関する関心はPPAP並に高いと言えるかもしれない。

*・・・高いのか？*

まあ、よかろう。ところで、この「人工知能」について正しく理解しているひとはどれほどいるのだろうか。
「知能」なんて言うくらいだから、さぞかし難しいものの塊で、自分の持っているPCでは到底扱うことなんてできないと思い込んでいる方も多かろう。

ところがそうでもない。

試しに、今ここで簡単な人工知能を作ってみせよう。
まずはRというソフトウェアを起動する。
出てきた画面にこれを打つ。

```r:testnn.r
library(nnet)
test.nn <- nnet(data$x, data$y, size=10, maxit=100)
```
終わり。
これで隠れ層1層、ノード10個、最大学習回数100回のニューラルネットワークが完成。
（今は何も解らなくてOKです）
あ、これだとデータが何も入ってないのでエラーで動かないけどね。

どうです、意外に簡単でしょう？

過去の研究者のおかげで、今人工知能というのはこんなにも身近でこんなにも単純に扱えるようになっている。
知らない方がもったいない。人工知能（の大半）はそんなに怖いものじゃない。

私はパソコンに詳しくない人にこそ、人工知能を知って欲しいと考えています。
なぜなら、人工知能を恐れ、その万能性を勝手に信じることこそ、人類が人工知能に支配される可能性を増大させるからです。
（というか、今現在、支配されてないのに「支配されてる」と思い込んでる例が多すぎる！）

今後、研究者や技術者の手により新しいアルゴリズム（しくみ）が開発され、新しい「知能」が誕生していくでしょう。
それでも、限界はありますし、ヒトと完全に同一にはなれません。

**人工知能にはいったい何ができるのか**
**あなたなら人工知能を使って何をするか**

そして人工知能を考えることを通じて

**人間にしか出来ないことは何か**
**そもそも「知能」ってなんぞや**

ということを考えてもらえると、この世の中の見方がかわってくると思います。

#この講座でやること（予定）
この講座では当面の間、生物の脳の神経伝達を再現した「ニューラルネットワーク（Neural Network）」についてご紹介する予定です。

というのも、ここが私が勉強して得た知識をそのままアウトプットするための場所を兼ねているので、私が当面興味を持って勉強する予定の分野しか紹介できないからです。

ニューラルネットワークは今急速に成長している分野ですし、なにせ私たちの脳を再現しているものなので、十分楽しんでいただけるかと思います。

#注意
- 私が暇なときに更新しますのでスパンは未定です、あしからず。
- 数学をできるだけ使わないようにしますがある程度は許してください。
- もし実際にやってみたいという方がいらっしゃいましたら、pythonかRをご準備ください。
    - pythonを2系にするか3系かはまだ決めてないです。
    - パソコンが丸1日フリーズする覚悟で臨んでください。ははは笑
    - これはプログラミング講座ではないので、プログラミングのフォローアップまでするつもりはありません。自力でがんばってください。
Hierarchy上で選択したオブジェクトの子どもを一括でNavMeshArea設定を変える方法

##NavMeshAreaの設定を一括で変えるEditor拡張

NavMeshを使用している際に、オブジェクトのNavMeshAreaの設定を一括で変えたかったので作ってみました。

あくまで、今回は子階層全てのオブジェクトを対象に記述しています。

Hierarchyでオブジェクトを右クリックして、Menuを追加してNavMeshAreaの設定を変えることができます。

NavMeshAreaの設定を変えるとBakeもするように記述しました。

<img width="292" alt="スクリーンショット 2016-12-09 1.53.07.png" src="https://qiita-image-store.s3.amazonaws.com/0/127761/84137151-1710-5356-a873-006cbfc52117.png">


```csharp:NavSetting.cs
using UnityEngine;
using UnityEditor;

public class NavSetting {

    [MenuItem("GameObject/Child to Walkable", false, 20)]
    public static void ChildToWalkable()
    {
        SettingNav("Walkable");
    }

	[MenuItem("GameObject/Child to Not Walkable", false, 21)]
    public static void ChildToNotWalkable()
    {
        SettingNav("Not Walkable");
    }

	[MenuItem("GameObject/Child to Jump", false, 22)]
    public static void ChildToJump()
    {
        SettingNav("Jump");
    }

	public static void SettingNav(string areaName) {
		var selectObject = Selection.activeGameObject;
		var areaNum = NavMesh.GetAreaFromName(areaName);
		for(int i = 0; i<selectObject.transform.childCount; i++) {
			var child = selectObject.transform.GetChild(i);
			GameObjectUtility.SetStaticEditorFlags(child.gameObject, StaticEditorFlags.NavigationStatic);
			GameObjectUtility.SetNavMeshArea(child.gameObject, areaNum);
		}
		NavMeshBuilder.BuildNavMesh();
	}
}

```
DataBindingのGradle設定でちょっとハマったとこ

##ハマったとこ

DataBindingを使うためには、[公式](https://developer.android.com/topic/libraries/data-binding/index.html#build_environment)にも記述ある通り、Android Plugin for Gradle 1.5.0-alpha1以降が必要です。
しかし、それに気づかずバージョンが1.3.0のままになっていた為、GradleのSync時に下記エラーが出力されSyncが失敗...。

```
Error:(9, 0) Gradle DSL method not found: 'dataBinding()'
Possible causes:
The project 'KotlinTest' may be using a version of Gradle that does not contain the method.
The build file may be missing a Gradle plugin.
```


今回は下記のようにバージョンを2.2.0に変更してあげました。変更後、エラーが解消。

```
dependencies {
        classpath 'com.android.tools.build:gradle:2.2.0'
}
```




##警告が出た
また、サポートされている最小のGradleバージョンの指定が誤っていたため、下記のような警告が出ました。

```
Warning:Minimum supported Gradle version is 2.14.1. Current version is 2.4.
```


単純に`gradle-wrapper.properties`内のバージョンを2.4から2.14.1に書き換えてSyncすれば解消するのですが、
Gradleの設定が`[Use local gradle distribution]`になっている場合、`gradle-wrapper.properties`の内容が反映されないため、`[Use default gradle wrapper(recommended)]`へ変更。
変更後にSyncしてあげると解消されました。

・変更箇所
`[Setting]→[Build,Execution,Deployment]→[Build Tool]→[Gradle]→[Use default gradle wrapper(recommended)]`
WebRTCの有効な使い方

これは[マイネットエンターテイメント Advent Calendar](http://qiita.com/advent-calendar/2016/mynet) 9日目の記事です。


みなさまこんにちは。
山の中で動物たちと暮らしていたところを連れてこられて、気がついたら東京でソーシャルゲームの開発をしていました。
人生って何が起こるかわかりませんね。

#WebRTC導入のきっかけ
さてさて、もう暦は１２月。随分と寒くなってまいりました。
自分は狩猟免許も持っていますので、この時期は山に罠を仕掛けに行きます。

しかしここで一つ問題が。
罠を仕掛けたら、見回りに行かないといけないのです。

仕掛けるのはただでさえ山奥なのに、この時期とかもう寒いし。
虫とかいるし、あんまり出たくないじゃあないですか。
ウチの裏こんな感じですし。
![s_DSC_0252.jpg](https://qiita-image-store.s3.amazonaws.com/0/150585/3218c5b3-ea34-65ca-6480-190ebe50fb2f.jpeg)



そこでどうにか家からWebRTCを使って監視環境を作ることにしました。

#WebRTCって
ブラウザ間でビデオチャットやファイル共有などP２Pでいろいろ通信できるようになるAPIです。
NAT越えのサーバが必要にありますがgoogleなどからも提供されている（stun.l.google.com:19302）ので自前のサーバがなくても大丈夫です。
あと数年前から微妙に流行りそうで流行らない感じ。

こいつで格安スマホを使ってお家からでも山中の罠の様子が監視できるようにします。

#用意したもの
AWS S3(html置くのに利用)
[SimpleWebRTC](https://simplewebrtc.com/　"SimpleWebRTC")(WebRTC用のライブラリ)

TURN/STUN サーバ用意するのも大変なのでSimpleWebRTCを利用させてもらいました。

#使い方
まずsimplewebrtcを読み込みます

```html:index.html
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.9.0/jquery.min.js"></script>
<script src="https://simplewebrtc.com/latest-v2.js"></script>
```

続いてオブジェクトの作成

```html:index.html
var webrtc = new SimpleWebRTC({
                remoteVideosEl: 'remoteVideo',
                autoRequestMedia: true
            });
```

「trap」というビデオ窓に入れます

```
webrtc.on('readyToCall', function () {
    webrtc.joinRoom('trap');
});
```

最後に相手側の映像を映す要素を置きます。

```
<div id='remoteVideo'></div>
```

もう一方のブラウザでページを開いて、ビデオ映像が共有されていれば準備OKです！
あとは格安SIMかなんかのスマホを罠の近くに仕掛けに行きましょう！

#まとめ
1.足跡を探します。
2.ヌタ場を見つけます。
3.罠を仕掛けます。
4.SimpleWebRTCをいれたページを用意します。
5.ページを開きっぱで罠の近くにスマホを設置します。
6.帰ってスリープモードになってないことを祈って寝ます。

以上です！
さあ準備ができたら出かけましょう！



次回はtaka3110さんです！よろしくお願いします！！


##参考
「SimpleWebRTC」
https://github.com/andyet/SimpleWebRTC
「Getting Started with WebRTC」
https://www.amazon.com/Getting-Started-WebRTC-Rob-Manson/dp/1782166300
「大日本猟友会」
http://www.moriniikou.jp/
OracleとPHPのソートで NULLの位置が違うから困ったという話

動的SQL禁止令が敷かれている職場では、

SQLで全件取得 (静的で書ける範囲の絞り込み条件は書かれている)
→ PHPで絞り込み (職場の自作フレームワークの関数。これのせいでソートが崩れる) 
→ PHPでソートし直す

こんな(無駄とバグの潜む)フローが主流になっている。


今回、これで困ったのが、

# OracleとPHPのソートでは、nullの位置が違う

Oracle SQLで昇順にした場合、ソート順の一番**最後**に NULL 値が来るが、
PHPの昇順では**最初**になってしまう。

NULL 値の取り扱い方が違うので仕方ない…

## OracleでのNULLの扱い
NULL≒無限大

> **NULL のソート ORDER BY NULLS ～**
Oracle 8.1.6 以上であれば、NULL の並べ替えのために NVL,MIN 関数を使う必要がなくなっている。
NULL はデフォルトの昇順ソートでは最後、降順ソートでは最初に並び替えられる。(≒無限大)


NULL≒ブラックホール
>オラクルにおける NULL とは、C言語などの NULL STRING '\0' CHAR(0) とは別の存在である。
また、数学の空集合(a set null) と比較すると宇宙の特異点のようなブラックホールとも思える強力なパワーで特別な振る舞いをする。
それを知らないでおくと、ブラックホールに飲み込まれて大切なデータを失う時限式の不具合を抱えることになりかねない。

## PHPでのNULLの扱い
ややこしいのでこちら参照
[PHP: PHP 型の比較表 - Manual](http://php.net/manual/ja/types.comparisons.php)

# 逆にOracleの昇順でNULLを最初にしたいときは
ORDER BY に並び替えのオプションを指定ができる。

```sql
ORDER BY ORDER_NO ASC NULLS FIRST
```

`NULLS FIRST`
　NULL 値を順序の最初にするソートを行なう
`NULLS LAST`
　NULL 値を順序の最後にするソートを行なう


# ちなみに…MySQLはPHPと同じソート順

MySQLもPHPと同じく昇順ではNULLが最初になるが、
下記のように書くと最後にすることができるらしい。

```mysql
SELECT * FROM table ORDER BY column IS NULL ASC, column ASC;
```


## 本題

多次元配列（DBから取得したレコードデータ）なので、array_multisortを使ってソートを行っている。
でも、改修範囲は最低限にしたい( ＝ SQLを触らずに済ませたい)。

そこで [0, 1, ~, 99999, null ] という配列を作成して回避を図る。

```php
$ary = range(0,99999);
$ary[] = "null";
echo $ary[100000];
-> null
```

これをソート部分に組み込む。

```php
$ary1 = range(0,99999);
$ary1[] = "null";
$ary2 = array_column($dbData, 'NAME');
array_multisort($ary1, SORT_ASC, $ary2, SORT_ASC, $dbData);
```

でとりあえず事なきを得た。
こんな方法でいいのかはよく分からない。

そもそも動的SQL使えたら、こんな手間ないんだけど。


# 参考サイト
 - [NULL の特性 - オラクル・Oracleをマスターするための基本と仕組み](http://www.shift-the-oracle.com/element/null/nulls-effect.html)
 - [PHP: PHP 型の比較表 - Manual](http://php.net/manual/ja/types.comparisons.php)
 - [MySQL で NULL を一番最後にして昇順にソートする | Sun Limited Mt.](http://blog.syuhari.jp/archives/69)
Railsのtruncateの使い方

# truncateとは

文字列を切り捨てて省略表示します。

使い方はこちらの記事を参考にしました。
[Rails - 長い文字列を省略して表示する](http://qiita.com/ishidamakot/items/2e74d980b3a338e4c784)

# 2つある？

どうやらString#truncateとTextHelperとしてのtruncateがあるらしい…

```string.rb
'Once upon a time in a world far far away'.truncate(27)
# => "Once upon a time in a wo..."
```
http://api.rubyonrails.org/classes/String.html#method-i-truncate

```helper.rb
truncate("Once upon a time in a world far far away")
# => "Once upon a time in a world..."
```

http://api.rubyonrails.org/classes/ActionView/Helpers/TextHelper.html#method-i-truncate

# 何が違うの？

困ったときはソースコードを見よう:innocent::sparkles:

- String#truncateの実装

```String#truncate.rb
def truncate(truncate_at, options = {})
  return dup unless length > truncate_at

  omission = options[:omission] || '...'
  length_with_room_for_omission = truncate_at - omission.length
  stop = \
    if options[:separator]
      rindex(options[:separator], length_with_room_for_omission) || length_with_room_for_omission
    else
      length_with_room_for_omission
    end

  "#{self[0, stop]}#{omission}"
end

```
[link:github](https://github.com/rails/rails/blob/1a0853c41f0d7a7ac5708fdc5f14f2aeba4bcbe0/activesupport/lib/active_support/core_ext/string/filters.rb#L64)


- Texthelperの実装

```texthelper.rb
def truncate(text, options = {}, &block)
  if text
    length  = options.fetch(:length, 30)

    content = text.truncate(length, options)
    content = options[:escape] == false ? content.html_safe : ERB::Util.html_escape(content)
    content << capture(&block) if block_given? && text.length > length
    content
   end
end
```
[link:github](https://github.com/rails/rails/blob/82aab15dac7b15f7d19ef9f931068e8777c17e55/actionview/lib/action_view/helpers/text_helper.rb#L92)


あ、これTexthelperの内部でString#truncateが呼ばれてるやつだ…！

なのでTexthelperの方は

1. 使えるオプションが多い（:escape）
2. ブロックで使うことができる

といった違いがありそうです。
[Python3] AtCoder Beginner Contest 048

たまには競技プログラミングも、ということでABC048に挑戦。
http://abc048.contest.atcoder.jp/assignments
C++は日常的に使うことが無くなってきたので、最近出番の多いPython3で挑戦。

## A - AtCoder *** Contest

２語目の頭文字を出力すればよい。変数展開には`format`を。

```py3
s = input()[8]
print("A{0}C".format(s))
```

## B - Between a and b ...

0からaまで、0からbまでと分けてxで割って切り捨て。

```py3
a,b,x = list(map(int, input().split()))
ans = max((b//x)-((a-1)//x),0)
print(ans)
```

## C - Boxes and Candies

2箱ずつ見ていくが、後ろの箱からできるかぎり抽出していくのが最適。（貪欲法）
左から1箱ずつ見ていって、条件を満たすように処理していけば計算量$O(N)$

```py3
N, x = list(map(int, input().split()))
arr = list(map(int, input().split()))

cnt, prv = 0, 0

for i in range(N):
    diff = max(arr[i] + prv - x, 0)
    cnt += diff
    arr[i] -= diff
    prv = arr[i]

print(cnt)
```

## D - An Ordinary Game

全通り試すと$O(N!)$になるし、DPでも上手く解けそうにない。調べると、交互にプレイして動けなくなった方が負け、といったゲームは*NIM*というゲームと同型であることが多いことがわかった。

- 2人
- 盤面の情報は公開
- 勝つか負けるか2値

https://ja.wikipedia.org/wiki/%E3%83%8B%E3%83%A0

極限状態を考えるといいようなので、遷移しきって勝敗が付く状態（最終状態）を考えると、

- 最初と最後の文字が一致していると、
 - 最終状態の文字数はかならず奇数になる

ことがわかる。

この場合、交互にプレイするゲームなので、初期状態の文字数の偶奇でどちらが勝つかが一意に定まる。

逆に最初と最後の文字が一致していないと最終状態の文字数は偶数なので、その判定だけすればよい。

```py3
s = input()
xor = bool(len(s)%2==0) ^ bool(s[0]==s[-1])
print("Second" if xor else "First")
```
DocValuesを使った場合のソートのパフォーマンス

# DocValues
Lucene4.0 から導入されたカラム指向のデータ構造です。
[公式ドキュメント](https://cwiki.apache.org/confluence/display/solr/DocValues)によると
facet,sort,groupingのパフォーマンスが高速化するとあります。
今回はその中のsortについて検証します。


# 調査に使ったインデックス
[前回](http://qiita.com/tkondo/items/20f5319b8ac5876ad881)と同じです

# Solrのバージョン
5.5.2


# 調査したパターン
インデックスが100万件(optimize済み)の状態で調査をおこないます。
DocValuesの有り無しで検証するのですが、検索だけした場合と、インデックスの更新をかけながら検索した場合のパフォーマンスも検証します。
これはSolrCloud環境において検索と更新の負荷が同時にかかることを想定してのことです。



## 検索のみの場合
パフォーマンスに差が出やすいように多重ソートにしました。

* DocValues=false

```
q=*:*&wt=json&indent=true&start=0&rows=10&fl=*,score&sort=sort_int1 desc,sort_int2 asc,sort_int3 desc,sort_int4 asc,sort_int5 desc
```

* DocValues=true

```
q=*:*&wt=json&indent=true&start=0&rows=10&fl=*,score&sort=sort_doc_val_int1 asc,sort_doc_val_int2 desc,sort_doc_val_int3 asc,sort_doc_val_int4 desc, sort_doc_val_int5 asc
```


Solrのキャッシュが無い状態で比較するため、毎回リロードをして実施しています。

|                | 処理時間(ミリ秒)1回目| 処理時間 2回目| 処理時間 3回目|
|:---------------|-------------------|--------------|-------------:|
| DocValues=false|               1534|          1460|          1268|
| DocValues=true |                 52|            61|            57|

元々Solrの検索はキャッシュが効いていない状態ではパフォーマンスが良くない印象でしたが、DocValuesがあるフィールドに対してはかなりのパフォーマンスが出ています。


## 更新 + 検索の場合
[この検証](http://qiita.com/tkondo/items/20f5319b8ac5876ad881)のパターン2で更新をかけつつ検索リクエストもおこないました。
クエリは120パターン用意しています。
詳細は[git](https://github.com/tkondo1223/solr-advent-calender2016/tree/master/docval_sort)に上がっています。

|                | 平均(ミリ秒)|  分散|
|:---------------|-----------|------|
| DocValues=false|         66| 120.7|
| DocValues=true |         67|    19|

平均はほぼ変わりませんでしたが、DocValues有りの方が分散がかなり小さくなっています。
Solr Adminで確認したところ、DocValues=falseの時だけfield Cacheが生成されていました。
1度キャッシュが生成されると、DocValuesが無くても高速に処理できるようです。
ただし、Commitが処理された段階でキャッシュが落ちるので、更新リクエストが常に飛び交うようなリアルタイム性の高いシステムではDocValuesの方が安定したパフォーマンスが出せそうです。


# まとめ
DocValuesを使うことでキャッシュが無くても安定したパフォーマンスが出せることが分かりました。
ここで新たな疑問として、DocValuesを付けることでインデキシングのパフォーマンスやインデックスサイズがどのように変化していくのが気になってきます。
また、5.5.2では指定できないようですが、DocValuesをメモリ上に保持するdocValuesFormat="Memory"というオプションもあるため、DocValuesを使ったフィールドのパフォーマンスはさらに良くなりそうです。
unityからandroid studioのプロジェクトファイルをエクスポートする

# unityからandroid studio向けにプロジェクトファイルをエクスポートする

## 概要
unityで作成したプロジェクトからandroid Studioのプロジェクトファイルにエクスポートするときに、つまづきました。端的に言うとGradleでエクスポートするのが正解でした。

### バージョン
Unity 5.5
Android Studio 2.2.3

## unity側からエクスポート
![スクリーンショット 2016-12-09 0.17.56.png](https://qiita-image-store.s3.amazonaws.com/0/102408/4f19ca6a-22ce-bada-dc53-5ce088e3ccca.png)

* **File > Build Settings**を開きます
* **Build System**を**Gradle(new)**にします。
* **Export**をクリック。
* エクスポートの場所を指定します。

## Android Studioで開く
![スクリーンショット 2016-12-09 0.24.45.png](https://qiita-image-store.s3.amazonaws.com/0/102408/ba2d2d79-9474-8753-a93b-789a5899dee1.png)

* **Import project**をクリック
* unity側でエクスポートした場所の直下にできたプロジェクトフォルダを選択します。

基本的に、これで開けるはず。

### Gradleの場所を聞かれる
初めて使うときに、**Gradle Home:**と出てきて、Gradleが置いてあるディレクトリを聞かれました。
Gradleの場所ですが、
**Android Studio.app/Contents/gradle/gradle-バージョン**
を指定するとOKだと思います。

## つまづいたこと
Unityでエクスポートする際、Gradleではなく、ADTにしていましたが、全くうまくいかずに、ビルドできませんでした。android studioが新しくなって、UnityもGradleではきだせるようになって、万々歳なんですかね。
【FileMaker】意外と敷居が高いらしい - スクリプトトリガ - OnObjectValidate

はい、今日は、[AdventCalendar 2016 FileMaker Tips](https://qiita.com/advent-calendar/2016/filemaker-tips/) 12/09の記事です。

今回は、スクリプトトリガの[OnObjectValidate](https://www.filemaker.com/help/14/fmp/ja/html/script_trigg.36.5.html#432455)です。
アクティブなオブジェクトが検証および保存される前に動きます。

まずは、動作確認です。
https://youtu.be/fD4Bzf9ifMQ

この例では、「入会日」と「退会日」の順番が違っている場合にカスタムダイアログが出るようにOnObjectValidateを設定しています。

入会日と、
![スクリーンショット 2016-12-08 14.41.53.png](https://qiita-image-store.s3.amazonaws.com/0/60538/3f7e763d-216c-7935-e5d2-bcdc89122ec3.png)

退会日の設定です。
![スクリーンショット 2016-12-08 14.42.20.png](https://qiita-image-store.s3.amazonaws.com/0/60538/64f65409-7a40-af37-0c99-002b50b8833c.png)
チェック対象のフィールドが空欄だった場合はチェックしないようにしています。

この処理は、データ保存前に行われるので、保存された後は、OnObjectValidateでチェックOKになったデータのみが保存される、ということになります。

レイアウトの設定で大抵自動保存にしていることが多いのですが、この自動保存を活かしつつ、各フィールドの入力チェックを行いたい場合に有効ですね。

では。
golangの開発で使っている色々

# この記事について
[アイスタイルアドベントカレンダー2016](http://qiita.com/advent-calendar/2016/istyle)の9日目の記事です
golangについて書きますよ

# 初めに
弊社では主にphpで開発が行われていますが、一部でgolangやscalaの導入も始めています。
（ちなみに去年の時点での比率は[こんな感じ](http://qiita.com/ktarow/items/b5f33c573873e6829b0e)）
今回はgo開発で利用しているツール/ライブラリをいくつか紹介をさせて頂きます。

# WebFramework
担当プロジェクトでは[labstack/echo](https://github.com/labstack/echo)を利用しています。
こちらは社内の利用実績があった事で採用したというのが大きいのですが個人の感想は以下な感じです

### 良い所
+ Middlewareがある
+ 開発が活発
+ 名前が発音しやすい

### つらい所
+ Loggingの拡張がちょっと面倒
+ 開発が活発なのでガンガン変わってく

その他にルーティグの書き方が凄くシンプルに書けるので気に入っています。
以下のように書く事ができます。

```
e := echo.New()
v1 := e.Group("/v1")
{
	// GET /v1/cats
	v1.GET("/cats", func(c echo.Context) error {
	})
}
e.Logger.Fatal(e.Start(":1323"))
```


# テスト
golangでは標準パッケージでテストをサポートしているため
それを利用するだけでも充分にテストを書くことは出来るのですが
自然言語でテストの内容を表現したい時には[onsi/ginkgo](https://github.com/onsi/ginkgo)を利用しています。

### サンプル
```
var _ = Describe("SearchCatAction", func() {
	Context("type = 1 でリクエストする", func() {
		cat := SearchCatAction(1)
		It("三毛猫が返却される", func() {
			Expect(cat).To(Equal("三毛猫"))
		})
	})
	Context("type != 1 でリクエストする", func() {
		cat := SearchCatAction(0)
		It("いないよ！が返却される", func() {
			Expect(cat).To(Equal("いないよ！"))
		})
	})
})
```

こちらは標準テストフォーマットからginkgoのテストフォーマットへの変換機能もある為、
標準テストからの切り替えもスムーズに行えるかと思います。

# APIドキュメント
どんな開発でもドキュメント管理はつきものですが管理が疎かになりがちです。
担当プロジェクトでは実装とドキュメントの更新を統一的に進めていく補佐として
[yvasiyarov/swagger](https://github.com/yvasiyarov/swagger)を利用しています。

こちらのライブラリはアノテーションを元にswagger形式のドキュメントを生成してくれます。

記述例

```
// @APIVersion 1.0.0
// @APITitle catAPI
// @APIDescription catAPIだよ

package main

func main() {
    //API実装
}

エンドポイントの例

// SearchCatAction 猫検索
// @Title 種別名検索API
// @Description 種別IDを入力すると種別名を返却します
// @Param type query int true "猫ID"
// @Success 200 {object} string "種別名"
// @Resource /cat
// @Router /v1/cat/images [get]
func SearchCatAction(string catType) {
}
```

ドキュメントの生成コマンド

```
go get github.com/yvasiyarov/swagger
swagger -apiPackage="cat" -mainApiFile="cat.go"
```
上記を行うとswagger形式のフォーマットで記載されてdoc.goというファイルが生成されます。
このファイルを元にWebブラウザからAPIドキュメントを参照出来るようにしています。

#まとめ
go開発で利用しているライブラリ/ツールを紹介しました
社内外問わず、goの利用が拡大していけば嬉しいです。
なお、ここで利用しているサンプルコードは[ここ](https://github.com/katsutomu/catsapi)に公開しています。

#明日は
[kubotak氏](http://qiita.com/kubotak)の記事です！
今年もフロントエンドの何かを書くそうです。お楽しみに！！
XML形式レスポンスをPHPでパースした話

 PHPでXMLをパースするパターンをまとめた

## HTTPレスポンス

```response.xml
<?xml version="1.0" encoding="UTF-8" ?>
<response>
 <message>&#12510;&#12473;&#12479;&#12540;</message>
 <rate type="moon">7</rate>
 <rate type="star">5</rate>
</response>
```
## パース準備
参照：http://php.net/manual/ja/simplexmlelement.construct.php

```parse.php
$xml = new SimpleXMLElement('response.xml', NULL, TRUE);
```

## `message`にアクセス
```parse.php
echo $xml->message;
```

実行結果

```
&#12510;&#12473;&#12479;&#12540;
```

### 数値実体参照`&#12510;&#12473;&#12479;&#12540;` をUTF-8で文字列変換
```parse.php
$str = mb_convert_encoding($xml->message, 'UTF-8', 'HTML-ENTITIES');
echo $str;
```
実行結果

```
マスター
```

## `type`にアクセス
```parse.php
foreach ($movies->rate as $val) {
    echo $val['type'] . "\n";
}
```
実行結果

```
moon
star
```
BayesOptインストール方法

#1. ベイズ的最適化
機械学習のハイパーパラメータの最適化に、最近ベイズ的最適化が使われている。

pythonでベイズ的最適化が使えるモジュールを検索すると、たくさん出てきてどれを使えばいいかよくわからなかった。
セミナで、獲得関数にUCBを使うよりもmutual informationが使うほうがよいと聞いた。
だからmutual informationが使えるpythonのモジュールを探したところBayesOptが見つかった。
しかしインストールに苦労したのでインストール方法を記す。


#2. BayesOptインストール
python2.7で以下を実施する。(python3では動かなかった。)

```
$ git clone https://github.com/rmcantin/bayesopt
$ cd bayesopt
$ brew install cmake
$ cmake -DBAYESOPT_PYTHON_INTERFACE=ON . 
$ ccmake .
```

and press "t" to select advanced features. Then, look if the PYTHON_* variables point to the same install/version.
"t"を押して、advanceモードに切り替えて以下のパラメータを環境に合わせて調整。
(macでanaconda使用の場合、以下のような感じ)

```
PYTHON_EXECUTABLE                /Users/macuser/.pyenv/versions/miniconda3-3.9.1/envs/py27/bin/python
PYTHON_INCLUDE_DIR               /Users/macuser/.pyenv/versions/miniconda3-3.9.1/envs/py27/include/python2.7
PYTHON_LIBRARY                   /Users/macuser/.pyenv/versions/miniconda3-3.9.1/envs/py27/lib/libpython2.7.dylib
```

```
$ make
$ sudo make install
```

3.動作確認
cloneしたディレクトリのpython配下にテストスクリプトdemo_distance.pyがあるので

```
params['crit_name'] = "cSum(cEI,cDistance)"
params['crit_params'] = [1, 0.5]
params['kernel_name'] = "kMaternISO3"
```

を以下に修正して実行。

```
params['crit_name'] = "cMI"
#params['crit_params'] = [1, 0.5]
params['kernel_name'] = "kMaternISO5"
```
[Git] コンフリクトの治し方

# コンフリクトとは
gitでブランチ同士を統合する場合は， 下記のコマンドを使用します．

```
$git merge [マージするブランチ名]
```
この際に自動的にコードが統合されます． この際に自動で統合できないことをコンフリクトといいます．
コンフリクトが起きた場合は， ローカルで解消する必要があります．
>![git_frow.png](https://qiita-image-store.s3.amazonaws.com/0/121224/fe18306d-28ce-5d73-5e98-b0f020452078.png)
>http://blog.bonar.jp/entry/2014/09/04/223048
コンフリクトを起こしたファイルは`Local change`にて修正する．

# 手動で訂正する場合
masterブランチでsub_branchをマージする場合．

```
$git merge sub_branch
```

```erb
<body>
<<<<<<<HEAD

[ローカルブランチのコード]

=======

[マージするブランチのコード]

>>>>>>>2384792396c53837ec06b9c2a842bfccc28f3996ki
</body>
```
`<<<<<<<`と`>>>>>>>`で囲まれた部分を手動で修正する．

### GitHubでの解消機能紹介
ローカルで解決しなくてもWebで解決できる様になっています。（2016/12/13リリース）
https://github.com/blog/2293-resolve-simple-merge-conflicts-on-github
![fd64b010-c06b-11e6-9dd3-a827e299c5bf.gif](https://qiita-image-store.s3.amazonaws.com/0/121224/4d65b5c7-fd77-9335-d924-8849332c7d10.gif)


# コンフリクトのメッセージについて
コンフリクトの際にstageに乗らないファイルには， 下記のようなものがある．
## 修正が必要(かも？)
### UU（both modified）
3ウェイマージした結果のコンフリクトファイル． 
=>コンフリクトしている箇所を編集する必要あり．
### AA（both added）
マージされるブランチ（HEAD）にあるファイルと、マージするブランチにあるファイルをマージした結果、変更箇所がコンフリクトしているファイル
=>コンフリクトしている箇所を編集する必要あり．
### UD（deleted by them)
マージされるブランチ（HEAD)に存在するファイルが、マージするブランチでは削除されているファイル
=>ファイルを削除するか， 残すか選択
### DU（deleted by us）
マージするブランチに存在するファイルが、マージされるブランチ（HEAD）では削除されているファイル.
=>ファイルを削除するか， 残すか選択

## 修正が不要
### AU（added by us）
マージされるブランチ（HEAD）にのみ存在するファイル．
=>ファイルはそのまま
### UA（added by them）
マージするブランチにのみ存在するファイルです。
=>自動的にstagingに乗る．
### DD（both deleted)
マージされるブランチ（HEAD）及び、マージするブランチから削除されたファイル.
=>自動で削除


# 参考
>http://qiita.com/uasi/items/c7845f61a2f681db7ce2
>http://blog.bonar.jp/entry/2014/09/04/223048
>Gitポケットリファレンス(書籍)
Travis CIを使ってupLatexの文書の自動テストをする

# やりたいこと
論文を複数人で書くとき、Git＋GitHubで管理したい。しかし、コンパイルが通らない状態でブランチをプッシュされると、そのブランチをマージした人まで困ることになる。
そんなときに、自動テストを導入すれば、事前にテストに合格したものだけマージすることができる。
テストは、コンパイルが通ればテストに合格、通らなければ失敗とします。

TeXで自動テストをする情報がそもそも少ないし、ましてupLaTeXの情報はさらに少ないので書きました。

# 方法
Travis CIの使い方はさほど難しくないので割愛。`.travis.yml`の記述法だけ書いておきます。

```
before_install:
  - mkdir -p $HOME/texlive
  - curl -L https://github.com/urdh/texlive-blob/releases/download/20170106/texlive.tar.xz | tar -JxC $HOME/texlive

install:
  - export PATH=$PATH:$HOME/texlive/bin/x86_64-linux
  - tlmgr update --self
  - tlmgr install collection-langjapanese
# 自動テストの時間を短縮するために、最小限のパッケージしかインストールしていません。
# パッケージをTeXファイルに追加した際、自動テストのビルドが失敗する場合はここにも追加してください。
  - tlmgr install newtx
  - tlmgr install newpx fontaxes kastrup tex-gyre

script:
  - ptex2pdf ＜Filename＞.tex -u -l -ot -interaction=batchmode     #batchmodeにしないと、TeXのエラーが出たときに入力を求められるので、
                                                                   #タイムアウト（10分）するまで時間を浪費します。
#必要に応じてupbibtexなども使えます。
```

# 気になること
毎回TeXをダウンロードしてくるのは無駄な気がします・・・。最小構成とはいえ、140MBくらいあります。
**原因不明でテストが失敗する場合、installで `tlmgr update --self --all` を実行するとうまくいくかも知れません。**

# テスト結果をSkypeに通知する
[GitHubのイベントをSkypeのBotに喋らせる](http://qiita.com/fr0077/items/3de5377638b3337318fa)をごらんください。
Korora初期設定その1(mozc編)

## mozcの導入


### 前置き
---

windowsを使ってると、google日本語入力が染み付いており、
Korora初期からある日本語入力ちゃんでは少し物足りなくなる。
(キーボードのキー変更も容易になるので、変換・無変換もIMEのON/OFFの切り替えに使えるしね)

そこでgoogleが提供しているMozcを使おう。
本来のgoogle日本語入力ではカタカナ英語を入れると英語に直してくれる便利機能ががあるが、これらが使えないなど、一部機能性があるが問題なく使うことができる。

### 導入手順
---

ネットを探してると実は意外と導入が面倒らしいmozc。
４つくらいもモジュールをインストールして、その順番が悪いとコンフリクトを起こすとか…
しかし、yum環境が使えれば
`sudo yum install ibus-mozc`
これだけで入る。(便利)

ただこれだけでは使えないので、設定の入力メソッドから、「追加」を選んで、下記の図のように追加してやる。

![settei.png](https://qiita-image-store.s3.amazonaws.com/0/125791/8f8e081f-cc95-d1fa-1bc1-480c48d314e5.png)

### 終わりに
---

無事、mozcが入れば、いらない日本語入力は消してしまってもいい。

更に設定から、キーの割当をwindows同様に行うことで、自分のお気に入りの日本語入力環境を作ることができる。

ブログ始めました、よかったら遊びに来てください
https://red-full-moon.com/
マジで初めてプログラミングを始める人に教えるべき3つのこと

僕はプログラミングのプロではないし、周りを見渡せば自分より得意な人はいっぱいいますが、何故か文系や後輩にプログラミングを教えてほしいと頼まれることが多いです。

個人的にプログラミングは最初の壁さえ乗り越えれば、後は調べてどうにでもなると思っています。だから少し教えて放置してみると、意外とよく吸収してくれる人も多いように思います（本人のやる気は前提条件）。

では、何を教えたら後は突き放して良いのかをまとめます。

# git
「初めにgitはハードルが高くないか？」と思う人も多いと思います。しかし、勉強するにはどんなに良い教科書よりも自分の学びを書き取れるノートが大事です。意味を問われたら、「ポケモンのセーブと同じでジムリーダーや四天王と戦う前に自分のタイミングでセーブができる」ということにしておきましょう。
![image](https://qiita-image-store.s3.amazonaws.com/0/98466/bba680af-fd3a-b797-3942-3a803ea920fd.png)

最低限コミットと履歴が見れる能力を付けさせてあげればいいと思います。日本語コミットも許しましょう。僕は自分でも使っている[SourceTree](https://ja.atlassian.com/software/sourcetree)の導入をすることが多いです。これを使えばコマンドいらずでコミットも履歴も見れるので便利です。後でその人から別の質問を受けたついでにブランチを切ってあげて、すぐ元に戻れることを示すと新しい便利さに気づく人が多いです。

# 黒い画面の出し方
実際には黒い画面に拘る必要はないです。なんでもいいからプログラムを書ける、（コンパイルできる）、動かせる環境を一つ作ってあげましょう。プログラミングを聞いてくる人というのは基本的にプログラムを書いたことがない人です。まずは同じ世界に連れてきてあげましょう。

<img width="490" alt="Screen Shot 2016-12-08 at 23.47.22.png" src="https://qiita-image-store.s3.amazonaws.com/0/98466/52fcb524-b111-9d2c-1abb-8a529c31787e.png">

プログラムを書けるようになると質問が変わってきます。文系の人にプログラムを書かせないままプログラムの話をするのなんて、アメリカにいるアメリカ人と日本から大声で喋ろうとするようなものです。まず届きません。Macだとpythonが最初から入っているので導入にはちょうどよいです。ただこれは教える人の得意不得意に合わせましょう。

# 調べる方法
最後にわからないことを調べる方法について教えてあげましょう。もちろん基本はググれで問題ないですし、今の時代の人間でググれない人には危機感を覚えさせたほうが良いと思います。ただ迷ったときにどこに頼るのかはわかっておいたほうが安心できます。そういう意味でQiitaはちょうどいいプラットフォームです。分かった気になって記事を書くことを勧めましょう。もっとわかった気になっている先輩たちにボコボコにしてもらいましょう（あとでフォローはしてあげてください）。
加えて、英語を使う人間のほうが多いので英語のプラットフォームのことも教えておき、新しい内容はこっちを参照するように言っておきましょう。StackOverflowが一番有名かなと思います。

# その後のフォロー
ここまで教えたら後は放置です。本当にやってみたいと思っている人はここから急速に伸びていくのが見てて面白いです。たまに頼ってきた場合には、調べ方を追加して教えていくほうがその人の伸びに貢献できると思います。
FreeBSD の RaspberryPi3 対応がだいぶ良くなった

# HEAD に取り込まれた RaspberyPi3 対応
以前 RaspberryPi３ に関する[記事 Raspberry Pi 3で FreeBSD(ARM64) をお試しする](http://qiita.com/s_mitu/items/12aa53d534073489cabc) で紹介したOSイメージは、一発芸的に「とりあえず動いたでー」といった感じで、HDMI出力も有線LANもないかなりハードなものでした。

それから数ヶ月、ついに今年10月、RaspberryPi3対応のコードが正式に FreeBSD の HEAD にマージされました([freebsd-arm でのアナウンス](https://lists.freebsd.org/pipermail/freebsd-arm/2016-October/014831.html))。

arm64 対応で、HDMIも有線LANもふつうに動きます。GPIO も動いてLチカもOK(i2cはまだだめ)。~~SMPや、~~ Pi3 の売りである WiFi や Bluetooth はまだ未対応ですがこれだけ動けば随分と気楽にいじれるようになったと思います~~(SMP対応については後述)~~。

---
**2018/12/01 追記
SMP は既に普通に動いています。**

---

# インストール
[FreeBSD wiki](https://wiki.freebsd.org/arm64/rpi3)にビルド手順などがありますが、~~SDイメージを既に RaspBSDで配布しているので、それを試すのが楽だと思います。~~

~~http://www.raspbsd.org/raspberrypi.html （ダウンロードページ)
http://download.raspbsd.org/FreeBSD-aarch64-12.0-GENERIC-UP-308109M.img.gz (2016/12/02時点の最新イメージ)~~

---
**2018/12/01 追記**
**RaspBSD の更新が止まってしまっていて、ダウンロードできるファイルが今となってはとても古いイメージとなってしまいました。最新イメージは**

<pre>
https://download.freebsd.org/ftp/snapshots/arm64/aarch64/ISO-IMAGES/12.0/
</pre>

**以下の**
<pre>
FreeBSD-12.0-*-arm64-aarch64-RPI3-(日付)-r(リビジョン).img.xz
</pre>

**なファイルです。
上記はcurrent を定期的にビルドして機械的にアップロードされているイメージなので、しばらく日にちが経つと自動的に消えてしまう点は注意してください（安定して動いてたイメージはローカルで保持しておくとか）。**

---

イメージをダウンロードしたら、microSD に(gz解凍しながら)dd して RaspberryPi3に挿入して起動するだけです(dd等は[過去記事：FreeBSD で Raspberry Pi インストール](http://qiita.com/s_mitu/items/ecfcab3826fee2c873d9)参照)。



wiki手順通りのビルドに関しては [slug](http://qiita.com/slug) さんがこちらの[記事 Raspberry Pi 3 Model BにFreeBSD 12-CURRENTを入れてみた](http://qiita.com/slug/items/d235c5d3d7972c90605d#comment-226fe89e85c2e31a6e)を書かれているので参考になると思います。

~~# pkg は11-stable版を使う
ソフトのインストールに便利な pkg も使えます。しかし上記のRaspBSDのダウンロードページの下に書いてあるとおり、現時点では12-current向けpkg が配布されて無いので、11-stable版を使うよう pkg を設定してあげる必要があります。
RaspBSDのダウンロードページの注意書き通り~~

~~```
env ABI=FreeBSD:11:aarch64 pkg bootstrap
```~~

~~を実行したあと、/usr/local/etc/pkg.confに~~

~~```
ABI = "FreeBSD:11:aarch64";
```~~
~~という行を追加します。~~

---

**2018/12/01 追記**
**上記の小細工は不要になりました。**

---

pkg はかなりそろっていて、ビルド無しで Xorg 環境が構築できます。構築手順は他の Raspberry Pi と同じです(参考: [FreeBSD/RaspberryPi での Xorg のインストール](http://qiita.com/s_mitu/items/be2d994ae731a5c98be6))。

~~# ビルドするためには devel/aarch64-binutils が必要
このイメージの初期状態ですとcc はあるのですが、いざコンパイルしようとすると「ldが無いよ」エラーが出てリンクできずに終わってしまいます。
リンクに必要な binutilsが入ってないためで、pkg で devel/aarch64-binutils をインストールすればコンパイルとリンクが行われ、実行ファイルが生成できるようになります。~~

---

**2018/12/01 追記**
**上記のような手間は不要になりました。**

---


~~# SMP 対応きちゃった
上の方でSMP対応がまだと書きましたが、2016/11/29 freebsd-arm ML に
「SMP対応が使えるレベルになったでー」
という投稿がありました。現時点で早速試したい人向け手順も書いてあります。
https://lists.freebsd.org/pipermail/freebsd-arm/2016-November/015092.html
というわけで試してみた結果については別記事にしたいと思います(小出しにしていくスタイル)。~~
Django Formの落穂拾い

連投すいません。
カレンダー埋めたいなと思いまして・・・


* Django 1.9.11
* Python 3.5.2

# この記事について

ずっとFormのことばっかり書いてますが、

* Formフィールドの並び順の設定
* crispy form(さわりの部分のみ)

について書いてます

# ModelForm.field_order

Model Formには`field_order`というフィールド？があります。
これは、文字通りフィールドの並び順を設定するフィールドです。 

```py3:forms.py
class MyForm(ModelForm):
    field_order = ["name", "age", "address", ]
```

のようにすると、フィールドの並び順が設定されます。
先頭のフィールドだけ決めたい、という時は、そのフィールドだけ書けばOKです。
残りはDjangoによって決定されます。

そうすれば、

```jinja:form.html
<form method="post">
{% csrf_token %}
{{ form }}
<button type="submit">
</form>
```

のようにした時でも並び順が思い通りになります。

# crispy form

私はよくTwitter Bootstrap を使うのですが、`{{ form }}`ではCSSの`class`を指定することができません。
そういう時はcripsy formを使います。

[ドキュメント](http://django-crispy-forms.readthedocs.io/en/latest/index.html)

```
pip install django-crispy-forms
```

これで入ります。

あとは、`settings.py`で

```py3:settings.py
INSTALLED_APPS += ('crispy_forms', )
CRISPY_TEMPLATE_PACK = 'bootstrap3'
```

として、テンプレートで

```jinja:form.html
{% load crispy_forms_tags %}
<form method="post">
{% csrf_token %}
{{ form|crispy }}
<button class="btn btn-primary" type="submit">
</form>
```

とすれば、あら不思議。
ちゃんとスタイルが設定されたフォームになります。

もっと詳しく設定したい場合はドキュメントを見てください。

また、[GoDjango](https://godjango.com/)に[crispy formのスクリーンキャスト](https://godjango.com/29-crispy-forms/)があったのでリンクを貼っておきます。
私が紹介した使い方よりももう少し深く使ってます。

最初に書いたフィールドの並び順と、crispy formを使えば、フォームのレイアウトはかなり楽になると思います。

特にcrispy formはかなりのことができるのでオススメのモジュールです。

# 最後に
ネタ切れです。
閑話休題。MoodleにおけるPerl。

<img width="401" alt="moodle.png" src="https://qiita-image-store.s3.amazonaws.com/0/116241/396391a4-8516-8d93-3d04-f9f19825460d.png">

# MoodleでPerlは使えるのか？

私は主にPerlを使うことが多く、今はある意味仕方なしにPHPを使う仕事をしています。
MoodleでもPerlを使う方法がないかちょっと探してみて、見つけたのが、このトピックなので紹介いたします。

[Perl | https://moodle.org/mod/forum/discuss.php?d=17234](https://moodle.org/mod/forum/discuss.php?d=17234)

> why xe don't use perl?
> （なぜ私たちはperlを使わないのですか？）

それに対して、

> AAARGH!
> I will leave moodle.org if anybody will ever mention that word again!
> I have programmed with Perl. I have one advice: Use PHP when dealing with internet.
> （AAARGH！
> 誰かがその言葉をもう一度言及するなら、私はmoodle.orgから抜けます！
> 私はPerlでプログラミングしたことがあります。
> 私から1つの助言があるとすればこれ：インターネットで何かするときにはPHPを使え。）

とまあ、不毛な感じでした。

やはりMoodleでPerlは無理そうです。


# ここで宣伝

2016年12月10に実施される[YAPC::Hokkaido](http://yapcjapan.org/2016hokkaido/)に、[Fuwa Takayuki](http://qiita.com/yue)さんが登壇されます。

残念ながら、チケットはすでに完売、Moodleの話もほとんど出ませんが、果たしてどんな話をするか楽しみです。

果たして資料は公開されるかな？
|ω・`）
JetBrainsのIDE(WebStormとか)でnpmの代わりにYarnを使う

JetBrainsのIDEには登録したタスクをボタン一つで実行する機能があるのですが、
ここで[npmの代わりにYarnを使うよう設定できるようになった(2016.3)](https://youtrack.jetbrains.com/issue/WEB-23737#comment=27-1669437)らしいので、使ってみることにしました。
![スクリーンショット 2016-12-08 15.12.59.png](https://qiita-image-store.s3.amazonaws.com/0/45427/a458a779-bff7-f867-cbdd-2ef9d5d4b5df.png)
(参考画像)

macOS上でしか確認していないので、ご了承ください。

## Yarnをプロジェクトにインストールする
`npm install yarn --save-dev`

## Preferencesを開いてYarnを指定する
[Preferences] => [Node.js and NPM]と進んで、[Node interpreter:]の右側にあるボタンをクリックします。
![スクリーンショット_2016-12-08_15_18_43.png](https://qiita-image-store.s3.amazonaws.com/0/45427/bc34d5ec-fda0-e492-e84f-70d52c4190d5.png)

すると、インストールしたyarnが選択できるようになっています。
![スクリーンショット_2016-12-08_15_19_01.png](https://qiita-image-store.s3.amazonaws.com/0/45427/85583acd-3a36-dba0-56ff-e6237ede5664.png)

## Homebrewで入れたYarnを使いたい場合
現時点(2016/12/8)のバージョン2016.3.1では自動で見つけてくれないので、自分でパスを指定する必要があります。
Yarn公式が推奨するのがbrewからのインストールと言うこともあり、この件についてはJetBrainsのissueにも上がっています。

https://youtrack.jetbrains.com/issue/WEB-24200


> As a workaround, you can specify manually /usr/local/Cellar/yarn/0.17.0/libexec/lib/node_modules/yarn .
These paths will be auto-detected in the WS 2016.3.2
Please note that /usr/local/Cellar/yarn/0.17.0 is not a valid npm package, thus it won't be accepted to avoid possible confusion.

と言う事なので、自分で`/usr/local/Cellar/yarn/{バージョン}/libexec/lib/node_modules/yarn`を探して指定しましょう。
(`/usr/local/bin/yarn`では、そんなディレクトリは無いと言われてダメでした…。)

上記リンクによると、すでに修正は完了しており、次のバージョン(2016.3.2)では自動で見つけてくれるようになるそうです。