OmniAICreator/Qiita-1.07M huggingface dataset:
lubridateパッケージの時間抽出・変換の速度について


## 概要
- Rの日付・時間周りの操作で便利なlubridateパッケージがよく使われるが、実際その速度ってどうなのか調べてみた
	- というか、上司が調べてた。ので、それを私の方でまとめた。
- 結果としては、lubridateを使わない方が速かった。

## データの準備

```
> days <- seq(as.POSIXct("2000-1-1 00:00:00"),len=365*24*10, by="1 hour")
> head(days, n=3)
[1] "2000-01-01 00:00:00 JST" "2000-01-01 01:00:00 JST" "2000-01-01 02:00:00 JST"
> tail(days, n=3)
[1] "2009-12-28 21:00:00 JST" "2009-12-28 22:00:00 JST" "2009-12-28 23:00:00 JST"
```

## 例：年月日に丸め変換

**lubridateを使うパターン**

```
> system.time(day <- floor_date(days, "day"))
   user  system elapsed 
  0.292   0.047   0.346 
> head(day, n=3)
[1] "2000-01-01 JST" "2000-01-01 JST" "2000-01-01 JST"
```

**lubridateを使わないバターン**

```
> system.time(day <- as.POSIXct(trunc(days, 'days')))
   user  system elapsed 
  0.065   0.003   0.070 
> head(day, n=3)
[1] "2000-01-01 JST" "2000-01-01 JST" "2000-01-01 JST"
```

思ってたより差があった。

## 例：時間(hour)の抽出

**lubridateを使うパターン**

```
> system.time(hours <- hour(days))
   user  system elapsed 
  0.058   0.002   0.061 
> head(hours, n=3)
[1] 0 1 2
```

**lubridateを使わないバターン**

```
> system.time(hours <- as.integer(as.POSIXlt(days)$hour))
   user  system elapsed 
  0.029   0.005   0.034 
> head(hours, n=3)
[1] 0 1 2
```

少しの差だが、使わないパターンの方が速い。

## まとめ
- 数十万単位のベクトルでは、さらに差が広がった。
- ただし、可読性という点では、lubridateはとても良いと思う。
- 速度を気にするなら、使わないパターンもおさせておくと良いかも。
- ちなみに、自社の分析チームでは、可読性向上のため、独自の日付・時間操作関数を独自パッケージで運用している。

## 参考
- [readr::parse_datetimeは組み込み関数より速いがfast_strptimeより遅い](http://qiita.com/dichika/items/4255bc4b5949c9b367f1)
- [R で文字列を POSIX time に変換するには lubridate::parse_date_time2() がちょっぱや](http://qiita.com/hoxo_m/items/6f18b163946f6f41deca)
Docker | docker run の -v オプションでホストの任意のパスをコンテナの任意のパスにマウントする

docker run の -v オプションでホストの任意のパスをコンテナの任意のパスにマウントします。

## <i class="fa fa-flask" style="font-size:1em;"></i> サンプル
### <i class="fa fa-server" style="font-size:1em;"></i> ホスト側の構成は以下

```bash
$ tree
.
└── sample_volume
    ├── hage.txt (中身は hage )
    ├── hige.txt (中身は hige )
    └── hoge.txt (中身は hoge )
```

### <i class="fa fa-link" style="font-size:1em;"></i> ホストのsample_volumeをコンテナにマウントします

```bash
$ docker run -v /home/tbpgr/work/test_docker_volume/sample_volume:/opt/webapp/sample_volume -d -p 5000:5000 training/webapp python app.py
```

### <i class="fa fa-check-circle" style="font-size:1em;"></i> マウントされたVolumeを確認します

```
$ docker run -v /home/tbpgr/work/test_docker_volume/sample_volume:/opt/webapp/sample_volume -d -p 5000:5000 training/webapp python app.py
9a3a272800abb7466d9365fb39704138dc85e6393cec41efaf3d6fb0b618ba71
$ docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                    NAMES
9a3a272800ab        training/webapp     "python app.py"     4 seconds ago       Up 4 seconds        0.0.0.0:5000->5000/tcp   goofy_sammet
$ docker exec -it goofy_sammet /bin/bash
root@9a3a272800ab:/opt/webapp# ls
Procfile  app.py  requirements.txt  sample_volume  tests.py
root@9a3a272800ab:/opt/webapp# cd sample_volume/
root@9a3a272800ab:/opt/webapp/sample_volume# ll
total 20
drwxrwxr-x 2 1000 1000 4096 Sep 30 02:20 ./
drwxr-xr-x 3 root root 4096 Sep 30 02:35 ../
-rw-rw-r-- 1 1000 1000    5 Sep 30 02:20 hage.txt
-rw-rw-r-- 1 1000 1000    5 Sep 30 02:20 hige.txt
-rw-rw-r-- 1 1000 1000    5 Sep 30 02:20 hoge.txt
root@9a3a272800ab:/opt/webapp/sample_volume# cat h*ge.txt
hage
hige
hoge
```

### <i class="fa fa-pencil" style="font-size:1em;"></i> 編集
ホスト側でhoge.txtの中身を`change`に変更します。
コンテナ内のファイルも変更されているか確認します。

```
$ docker exec -it goofy_sammet /bin/bash
root@9a3a272800ab:/opt/webapp# cat sample_volume/hoge.txt 
change
```

## <i class="fa fa-book" style="font-size:1em;"></i> 関連資料
* <i class="fa fa-external-link" style="font-size:1em;"></i> [クックパッド開発者ブログ](http://techlife.cookpad.com/entry/2015/04/20/134758)
* <i class="fa fa-external-link" style="font-size:1em;"></i> [Docker の Data Volume まわりを整理する - Qiita](http://qiita.com/lciel/items/e21a4ede3bac7fb3ec5a)
iOS9でLINE連携ができなくなった理由と対処法

#背景
iOS9にバージョンアップしてしばらくたち、自分が作ったゲームアプリで遊んでいた。
このゲーム内ではアプリのシェア機能として、Facebook/Twitter/LINEの連携をしているのだけれど、Facebook/Twitterは投稿ができるのに、LINEの連携がどうしてもできない。
おかしいと思い、対処法をメモしておく。

参考：自作アプリ[【くまのがっこう】ジャッキーのほしあつめ](http://blog.tadamatuapps.com/2015/09/blog-post_27.html)
（ちなみにフレームワークはcocos2d-xを利用している）

![IMG_2792x.png](https://qiita-image-store.s3.amazonaws.com/0/94988/320d44d9-9cb6-05a7-9c87-040d51f733aa.png)


#LINE連携できなくなった理由
LINEの連携にはURLスキーマを利用しています。

調べてみたところ、iOS9からURLスキーマの扱いに変更があった模様。

>iOS9からURLスキームの使用に関する変更があり、
従来のopenURLを実行するだけではカスタムURLスキームの遷移が使用できなくなりました。
※Apple公式のURLスキーム（ブラウザを開くなど）は正常に動作します。
参考：[iOS9でカスタムURLスキームの遷移に失敗するときの注意点](http://qiita.com/Night___/items/60355d21951cffbef51b)

実際にiOS9で実行をすると、以下のようなログが表示される。
`iOS[351:37229] -canOpenURL: failed for URL: "line://msg/text/xxxx" - error: "This app is not allowed to query for scheme line"`

LINE連携の実装は以前に書いた以下の記事に委ねます。
参考：[iOSアプリにソーシャル機能を組み込む【実践編】](http://blog.tadamatuapps.com/2015/07/ios.html)

シェア機能の重要性や効果についてはこんな記事もどうぞ。
参考：[「ねこあつめ」がなぜ人気アプリになったのか？ 分析その５：ソーシャル機能を分析しよう！編](http://blog.tadamatuapps.com/2015/07/blog-post_22.html)

#対処方法
利用するURLスキームの内容を明らかにすることで、今まで通り利用することができます。
具体的には`info.plist`に`LSApplicationQueriesSchemes`の`key`を追加し、カスタムURLスキームを入力します。
今回の場合は、URLスキームに`line`を入力します。

![スクリーンショット.png](https://qiita-image-store.s3.amazonaws.com/0/94988/ffa677f4-6421-f8af-a2cf-5f6ae93a1095.png)

これでシェア機能としてline連携ができるようになりました。

同じことで困っている方がいらっしゃれば、お役に立てれば嬉しいです。
住所を「都道府県」「市区町村」「それ以降」に分ける

住所の入力はまとめて行える方が便利な場面もありますが、処理によっては都道府県・市区町村をコードに変換して持たせる、あるいは別データとして管理するほうが便利です。とはいえ、変換はなかなか一筋縄では行きません。

# 辞書式でやる
いちばん単純に考えれば、都道府県・市区町村の全リストを持っておいて、それと照合して切り出すという方法があります。ただ、平成の大合併で1800弱まで減ってはいますが市町村はそれだけの数があって、データを揃える、あるいはフロントエンドで使うにはちょっと大きなデータ量かもしれません。

ということで、全件リストに頼らない方向性を考えていきます。

# 都道府県を（有無含め）判別
まずは、都道府県を切り出してみましょう。47個しかないのでリスト直持ちでもいいのですが、都道府県のほとんどが「2文字+都道府県のいずれか」で、3文字のものが神奈川県・和歌山県・鹿児島県だけなので、正規表現ですんなり切り出せそうです（「2文字または3文字+都道府県」としてしまうと、「東京都府/中市」や「宮崎県都/城市」を切り誤ることがあります）。

ただ、1つ気を付けないといけないのは、（実在するかどうかよくわかりませんが）「○市都町」のように都道府県なしで書いてあった場合に、「○市都」が都道府県だと誤認されてしまうことです。幸い、「市区町村」の文字を含む都道府県は現状ないので、`/^([^市区町村]{2}[都道府県]|[^市区町村]{3}県)/`とすれば、都道府県がある場合にそれを抽出する正規表現となります。

# 市区町村の切りだし
（あったとしたら）都道府県を抽出した上で、次は市区町村を切り出して行きましょう。いちばんシンプルなアルゴリズムを考えると、「2文字目以降で初めに現れる「市区町村」のどれかで切る」という方法が考えられます。大半の市区町村はこれでうまく行くのですが、「東京都武蔵村/山市」など、これでいかないパターンもいくつかあります。とはいえ、パターンは少ないのでこっちで網羅できればきちんと切れます。

そのような、途中に「市町村」の文字が入る市町村名・郡名は以下のようになっています（町村名については、郡名付きになると途中になるので、先頭のものも入れてあります）。2015年9月現在です。

* 北海道余**市**郡仁木町・赤井川村・余**市**町
* 宮城県柴田郡**村**田町
* 山形県
 * 東**村**山郡山辺町・中山町
 * 西**村**山郡河北町・西川町・朝日町・大江町
 * 北**村**山郡大石田町
* 福島県
 * 田**村**市
 * 田**村**郡三春町・小野町
* 栃木県芳賀郡**市**貝町
* 群馬県佐波郡玉**村**町
* 東京都武蔵**村**山市・東**村**山市・羽**村**市
* 新潟県十日**町**市
* 富山県中新川郡上**市**町
* 石川県野々**市**市
* 山梨県西八代郡**市**川三郷町
* 長野県大**町**市
* 三重県四日**市**市
* 兵庫県神崎郡**市**川町
* 奈良県高**市**郡高取町・明日香村
* 奈良県吉野郡下**市**町
* 広島県廿日**市**市
* 佐賀県杵島郡大**町**町
* 長崎県大**村**市

これらにヒットするように正規表現へまとめると、以下のようになります（読みやすいように途中改行しています）。

```
/^(余市郡(仁木町|赤井川村|余市町)|余市町|柴田郡村田町|(武蔵|東)村山市|
[東西北]村山郡...?町|田村(市|郡..町)芳賀郡市貝町|(佐波郡)?玉村町|[羽大]村市|
(十日|大)町市|(中新川郡)?上市町|(野々|[四廿]日)市市|
西八代郡市川三郷町|神崎郡市川町|高市郡(高取町|明日香村)|(吉野郡)?下市町|
(杵島郡)?大町町)/
```

ヒットしなければ、あとは市区町村で切るだけです。

# その他
これは、以前[個人ブログ](http://ameblo.jp/jkr2255/entry-11889425106.html)へ掲載したものを、少し改良の上再掲載しています。

# 参考リンク
* [都道府県市区町村の文字が入る市町村](http://uub.jp/zat/todofukenmoji.html)
ローカルNetwork設定の覚え書き


CentOSで、新たにNICを設置して、ローカルネットワーク接続する場合の覚え書きです。

###eth1の設定
```
vi /etc/sysconfig/network-scripts/ifcfg-eth1

DEVICE="eth1"
IPADDR="192.168.0.1"
NETMASK="255.255.255.0"
TYPE="Ethernet"
```

ネットワーク内にルータが特にない場合は、`GATEWAY`の設定はいらないようです。

###network設定の適用
```
/etc/rc.d/init.d/network restart
```

再起動すると反映されてます。
MySQL5.6のCentOS6へのインストール方法(2015/10月現在)


###リポジトリ設定

```
$ yum install http://dev.mysql.com/get/mysql-community-release-el6-5.noarch.rpm
```

###インストール
```
$ yum install mysql-community-server
```

###バージョンの確認
```
$ mysqld --version
mysqld  Ver 5.6.26 for Linux on x86_64 (MySQL Community Server (GPL))
```

###自動起動設定
```
$ chkconfig mysqld on
$ chkconfig --list mysqld
  mysqld         	0:off	1:off	2:on	3:on	4:on	5:on	6:off
```

###サーバの起動
```
$ service mysqld start
```

###サーバの停止
```
$ /etc/init.d/mysqld stop
```
Redmineでテストケースやテストの進捗管理

エクセルでテストケースを書き出すのはよくあったりするのですが、もっと良いやり方はないかと重い、考えたり調べたことのメモ。

エクセルからの脱却を考えている人も随分前からいるようで。いい加減、エクセルからの呪縛から解放されたいものです。十年一日のような仕事を最初にすり込まれるのは危険すぎる。

## 1. テスト項目を全てチケット化

* それ用にサブプロジェクト作成
* エクセルのシート単位（あるいは機能単位）で親チケット作成
* 上記の子チケットとして一項目一チケットで作成

一番安直なやり方。とりあえずエクセルから脱却したい一心でぱっと思い浮かんだ。
サブプロジェクトやチケットのコピーが出来ないと使い回しが厳しいか。


## 2. Redcaseプラグインを使用

[Redcase](https://www.redmine.org/plugins/redcase) という、テスト管理をするためのプラグインがある模様。

http://yohshiy.blog.fc2.com/blog-entry-219.html

http://mao-instantlife.hatenablog.com/entry/2015/06/24/Redcase%E3%82%92%E3%83%AA%E3%83%AA%E3%83%BC%E3%82%B9%E5%89%8D%E6%89%8B%E5%8B%95%E3%83%86%E3%82%B9%E3%83%88%E7%AE%A1%E7%90%86%E3%81%AB%E4%BD%BF%E3%81%86

## 3. TestLinkと連携

[TestLink](http://testlink.org/) というテスト管理ツールがあるようです。それがRedmineとの連携機能を持っている模様。

http://www.ramuda.co.jp/techlabo/archives/1630

http://www.slideshare.net/cakeyoshida/test-link-15753118

http://nobitasdiary.blogspot.jp/2011/11/testlinkredmine.html

http://www.r-labs.org/projects/rp-testlinklink/wiki/Wiki

## 4. Redmine関連の有償製品を使う

* [Ankosoft](http://www.ankosoft.co.jp/project/%E3%83%86%E3%82%B9%E3%83%88%E7%AE%A1%E7%90%86/)

* 公式サイトのサードパーティ製品のリンク集
http://www.redmine.org/projects/redmine/wiki/ThirdPartyTools#Test-Case-Management

### 番外：Redmineに関係なくテスト管理のサービスや製品

* [Qangaroo](https://qangaroo.jp/)
* [CAT](http://softwaretest.jp/service/cattcm.html)
* [TestRail](http://www.gurock.com/testrail/)
* [QASymphony](http://www.qasymphony.com/)
* [XQual](http://www.xqual.com/)

#### 参考サイト
http://www.softwaretestinghelp.com/15-best-test-management-tools-for-software-testers/

http://sssslide.com/www.slideshare.net/oota_ken/taas4

http://forza.cocolog-nifty.com/blog/2010/08/redmine-908c.html

http://www.slideshare.net/minazou67/bug-issuetrackingsystem2015

http://qiita.com/kkakizaki/items/10c3cfb6f22cd035e6f4
Macのストレージが0GBになったらクリーンインストール

#Macが遅くなったらクリーンインストール一択

ここ数日、ファイルを消しても消しても0GBになっていました。どうしようもなくなったので、クリーンインストールしたのですが、その時いろいろ思ったのでバックアップの取り方とインストールしなおしたアプリを書いておきます。

##バックアップ編
###パスワード
iCloudに記憶させておきましょう。OS再セットアップ後にiCloud連携させてしまえばキーチェーンですべてのシステムにアクセスできます。

###テキスト情報
情報はEvernoteかGoogleDriveに

###各種ファイル
GoogleDrive1択ですね。Dropboxでもいいですけど多分課金しないと足りません

###写真
Googleフォト一択です。全部あげちゃいましょう。iPhoneの写真はiCloudが面倒見るので大丈夫です。

###音楽
iTunesMacthかGooglePlayMusicなんですが、DRMかかっている以外は50000曲までアップロードできるGooglePlayMusicですね。


##インストール編
###VMソフトウェアの見直し
ずっとVMware Fusion使っていのですが、これを機にVirtualBoxだけにしてWindows環境も作りなおしました。VMだとWindowsに使う容量が60GBですが、VBだとWindows8なら25GBなので、安心です。余計なインストールはいらんです。Windowsもこれを機に10にしました。（Windows10は32GBが最低です）

###Adobe
必要最小限にしましょう。AcrobatぐらいでOK。

###Office for Mac
もう、Keynoteとか要りません。

###Chrome
まぁ、要りますがメモリを食うので、爆速になるSafariで十分かも。

###ATOM
SublimeよりもATOMでしょう

###Slack
これがないと仕事になりません。

###Evernote
さっき保存したデータをこちらに。


###Dropbox
クラウドのデータとの連携。ブラウザあれば十分ですが・・・。


###コマンドラインツール
必要なときに勝手に入るのでそれでOK

###XCODE
開発しない時は入れないようにしましょう。

結局何をやったのかというと、写真と音楽をクラウドにあげて、VMを一つにしました。という話です。

あとVagrantはOttoにシフトしようと考えています。
コーディングルールメモ


* font-sizeの単位はrem
* margin,padding,widthの単位は％
* text枠の外側に word-wrap:break-word
* 要素ごとの間隔は基本的に下にmargin,paddingを取る

siteの階層
.site > .sidebar + .site-content + .site-footer

site-contentの階層
.site-content > .content-area

postの階層
.post > .entry-header + .entry-content + .entry-footer
.entry-header > .entry-title
.entry-content
.entry-footer > .posted-on(日付) + .byline(筆者) + edit-link(編集)

クラス
| site-description | site-branding | site-header | site-title |

utility
| float | alignleft | alignnone | alignright |
p5.js  リサージュ図形


[数学ガールの秘密ノート](http://www.hyuki.com/girl/note.html)の第23回、第24回でリサージュ図形が出てきます。

- [第23回　行ったり来たりの迷い道（前編）](https://cakes.mu/posts/1672)
- [第24回　行ったり来たりの迷い道（後編）](https://cakes.mu/posts/1751)

リサージュ図形を [p5.js](http://p5js.org/) で作成してみました。

[こちらで試すことが出来ます。](http://noriok.sakura.ne.jp/p5js/lissajous-curve.html)

```js
x = r * cos(a * t)
y = r * sin(b * t + delta)
```

上記の式の `a`, `b`, `delta` を変更すると、いろんな形のリサージュ図形が現れます。


![lis.gif](https://qiita-image-store.s3.amazonaws.com/0/1900/9777135d-ba98-f3be-5884-cabe37445da4.gif "lis.gif")

- up, down ボタンで `a`, `b` の値を変更します。
- スライダーを動かすと、`delta` の値を変更します。


## プログラム

```js:lissajous-curve.js
'use strict';

// x = r * cos(a * t)
// y = r * sin(b * t + delta)

var a = 1; // パラメータ a
var b = 1; // パラメータ b
var buttonIncA, buttonDecA; // パラメータ a を変更するボタン
var buttonIncB, buttonDecB; // パラメータ b を変更するボタン
var slider; // パラメータ delta を変更するスライダー

function setup() {
    createCanvas(400, 400);
    noFill();

    buttonIncA = createButton("up");
    buttonIncA.position(width - 50, height - 80);
    buttonIncA.mousePressed(function() { a++; });

    buttonDecA = createButton("down");
    buttonDecA.position(width - 10, height - 80);
    buttonDecA.mousePressed(function() { a = Math.max(1, a-1); });

    buttonIncB = createButton("up");
    buttonIncB.position(width - 50, height - 50);
    buttonIncB.mousePressed(function() { b++; });
    
    buttonDecB = createButton("down");
    buttonDecB.position(width - 10, height - 50);
    buttonDecB.mousePressed(function() { b = Math.max(1, b-1); });

    slider = createSlider(0, 360);
    slider.position(width - 50, height - 20);
}

function draw() {    
    background(255);
    translate(width/2, height/2);

    // XY 軸
    stroke(188, 188, 188);
    line(-width, 0, width, 0);
    line(0, -height, 0, height);

    // 曲線上を移動する円
    var delta = slider.value();
    var t = frameCount * 0.03;
    var r = 100;
    stroke(0);
    ellipse( r * cos(a * t),
            -r * sin(b * t + radians(delta)),
            10,
            10);              

    // 曲線
    for (var i = 0; i < 360; i++) {
        var x1 = r * cos(a * radians(i));
        var y1 = r * sin(b * radians(i) + radians(delta));

        var x2 = r * cos(a * radians(i+1));
        var y2 = r * sin(b * radians(i+1) + radians(delta));
        line(x1, -y1, x2, -y2);
    }

    text("a: " + a, width/2 - 90, height/2 - 65);
    text("b: " + b, width/2 - 90, height/2 - 35);
    text("delta: " + delta, width/2 - 120, height/2 - 5);
}
```

## HTML 

```html
<html>
<head>
  <meta charset="UTF-8">
  <script language="javascript" type="text/javascript" src="p5-release/p5.js"></script>
  <script language="javascript" src="p5-release/addons/p5.dom.js"></script>
  <script language="javascript" type="text/javascript" src="lissajous-curve.js"></script>
  <style> body {padding: 0; margin: 0;} </style>
</head>
<body>
</body>
</html>
```

## リンク

- [数学ガールの秘密ノート](http://www.hyuki.com/girl/note.html)
  - [第23回　行ったり来たりの迷い道（前編）](https://cakes.mu/posts/1672)
  - [第24回　行ったり来たりの迷い道（後編）](https://cakes.mu/posts/1751)
expectを利用したssh接続時のパスワード入力の自動化

##目的
リモート接続先で任意のコマンドを入力する際、標準入力からパスワードを入力せず、プログラムでログイン処理を自動化する
**例**
`$ ssh hoge@example.com sudo service httpd restart`

##方法
expectを使用する

##設定
###インストール
`$ sudo yum -y install expect`

###sudoers
コメントアウトする
`# Defaults specification`
<hr>
###自動化プログラム
```bash:auto_login
#!/bin/sh
auto_login() {
host=$1
id=$2
pass=$3

expect -c "
set timeout 10
spawn ssh ${id}@${host} sudo service httpd restart
#ログインしたいだけなら、引数なし
#spawn ssh ${id}@${host}
expect \"Are you sure you want to continue connecting (yes/no)?\" {
    send \"yes\n\"
    expect \"${id}@${host}'s password:\"
    send \"${pass}\n\"
} \"${id}@${host}'s password:\" {
    send \"${pass}\n\"
}
interact
"
}
```

```bash:ssh_secondary
#!/bin/sh
set -x
# shスクリプト読込
. /home/vagrant/auto_login
# 自動ログイン実行
auto_login '***.***.***.***' 'vagrant' 'vagrant'
```
###デバッグ
```
[vagrant@primary ~]$ sudo ./ssh_secondary 
+ . /home/vagrant/auto_login
+ auto_login ***.***.***.***[secondary-IP] vagrant vagrant
+ host=***.***.***.***[secondary-IP]
+ id=vagrant
+ pass=vagrant
+ set -x
+ expect -c '
set timeout 10
#spawn ssh vagrant@***.***.***.***[secondary-IP]
spawn ssh vagrant@***.***.***.***[secondary-IP] sudo service httpd restart
expect "Are you sure you want to continue connecting (yes/no)?" {
    send "yes\n"
    expect "vagrant@***.***.***.***[secondary-IP]'\''s password:"
    send "vagrant\n"
} "vagrant@***.***.***.***[secondary-IP]'\''s password:" {
    send "vagrant\n"
}
interact
'
spawn ssh vagrant@***.***.***.***[secondary-IP] sudo service httpd restart
vagrant@***.***.***.***[secondary-IP]'s password: 
Stopping httpd: [  OK  ]
Starting httpd: [  OK  ]
[vagrant@primary ~]$ 
```
**プログラムの中にアイパスを書いてるので、利用はInternalで**
laravel-ide-helperを使ってLaravelの自作Facadeを補完できるようにする（PHP Storm編）

# なぜこの記事を書いたのか
LaravelのFacadeを使うときにメソッドの補完ができなくて本当につらかったから。

# この記事を読むと何ができる？
- 自作のFacadeがエイリアスを使うが補完できるようになる。
 - [barryvdh/laravel-ide-helper](https://github.com/barryvdh/laravel-ide-helper)を使う。
 - 本記事はPHP Stormの利用を前提としているが、laravel-ide-helper自体は他のエディタでも使える。

## laravel-ide-helperで、できたこと
**注意：すべての機能を解説しているわけではありません。試したことだけ書いています。**

- config/app.phpにエイリアスをした時に限り、自作Facadeが補完できる。
	- もちろん[LacavelデフォルトのFacade](http://laravel.com/docs/master/facades#facade-class-reference)は補完できる。
- エイリアスを書かずに補完はできない（っぽい）
    - `\path\to\MyClassFacade::myMethod`みたいなのはできなかった（エイリアスを強制される？）
- providerに自作Providerを登録しておけば、`\App::make(\path\to\MyClass::class)->superMethod()`のようなメソッド名が補完できる。
	- この場合`\path\to\MyClass`の補完はできないので手動で頑張る。

# 自作Facadeを作って補完する手順
## 事前準備
[公式ページの手順](https://github.com/barryvdh/laravel-ide-helper#install)に従いcomposerでlaravel-ide-helperをインストールする。

## Facadeを作成してアプリケーションに登録する
[公式ページのFacadeの作り方](http://laravel.com/docs/5.0/facades#creating-facades)にのっとって作る。この項目はなぜか最新のドキュメントからは削除されている。

- 自作のFacadeを適当なディレクトリに作る。
- 自作のFacadeをconfig/app.phpのaliasに登録する（仮にこの名前を`MyClass`とする）。
- 自作のProviderを適当なディレクトリにつくる。（公式ページのように`artisan`コマンドを使うと`app/Providers`に作られる）
- 自作のProviderをconfig/app.phpのproviderに登録する。

## 補完を試す
- `php artisan ide-helper:generate` `php artisan ide-helper:meta`を実行
- `\MyClass::superMethod`が補完できるようになっていれば成功。
	- `\My`あたりまで書けばどんどん補完していける。
[CSS] IE8 inputのテキストフィールドで上下中央揃えがline-heightではできなかった

IE8 inputのテキストフィールドで上下中央揃えにしたかったので
line-heightを使ってみるがうまくいかず

```html
<input type="text" class="hoge" value="ほげほげほげほげ">
```

```css
.hoge {
    line-height: 30px;
}
```

仕方ないので上下paddingで代用

```css
.hoge {
    padding: 7px 0;
}
プロジェクトファイルを使ってF#のソースコードをビルドする

Ubuntuで複数のF#のソースコードをビルドする方法。
今回はYeomonとxbuildを使った。

# Yeomanのインストール
## Ubuntuのnode.jsのバージョンを新しくする
Ubuntuのapt-getで入れられるバージョンが古いらしく、Yeomanのインストールでエラーが発生するので別の方法でインストールする。
やり方は下のページの"Debian and Ubuntu based Linux distributions"の通り。

[Installing Node.js via package manager | Node.js](https://nodejs.org/en/download/package-manager/)

    $ curl --silent --location https://deb.nodesource.com/setup_4.x | sudo bash -
    $ sudo apt-get install --yes nodejs
    $ nodejs -v
    v4.1.1

## YeomanとF#用ジェネレータのインストール
F#のプロジェクトファイルはYeomanのF#ジェネレータを使って生成する。

[fsprojects/generator-fsharp](https://github.com/fsprojects/generator-fsharp)

    $ sudo npm install -g yo
    $ sudo npm install -g generator-fsharp

# xbuildのインストール
xbuildはMonoを使ったF#の開発環境を作ると一緒に入るのでそちらを参照してください。

[VisualStudioCode - UbuntuとVisual Studio CodeでF#の開発環境の構築 + デバッグ方法 - Qiita](http://qiita.com/locatw/items/cb451586540be7cb5bba)

# プロジェクトファイルの生成とビルド
Hello Worldをプロジェクトファイルを使って作ってみる。

## プロジェクトを作成する
開発用のディレクトリにYeomanでプロジェクトを作成する。

    $ cd ~/dev/
    $ yo fsharp

いくつか質問されるので次の通りに選択・入力する。

    What do You want to do? => Create standalone project
    What type of application do you want to create? => Console Application
    What's the name of your application? => HelloWorld
    Do You want to use Paket? => No

"Your project is now created"と表示されて、次のディレクトリとファイルが生成されていればOK。

    $ ls
    HelloWorld
    $ ls HelloWorld/
    App.config  HelloWorld.fs  HelloWorld.fsproj

## ソースコードを編集する
Visual Studio Codeなどのエディタで"HelloWorld.fs"を次のように変更する。

```fsharp
module HelloWorld

[<EntryPoint>]
let main argv =
    printfn "Hello World"
    0
```

## ビルド
xbuildでプロジェクトのビルドをする。

    $ cd HelloWorld/

    # Debugビルド
    $ xbuild /p:Configuration=Debug

    # Releaseビルド
    $ xbuild /p:Configuration=Release

デバッグ版とリリース版の実行ファイルがそれぞれ"bin/Debug"と"bin/Release"に生成されるので、monoコマンドで実行するとちゃんと実行される。

    $ mono bin/Release/HelloWorld.exe
    Hello World
Devise

# 参考
[Rails + Devise 環境でのフレンドリーフォワーディング機能を修正 | EasyRamble](http://easyramble.com/fixed-bug-of-friendly-forwarding.html)

[Rails Devise でパスワードリセットなどのメールテンプレート（Mailer ビュー）をカスタマイズ | EasyRamble](http://easyramble.com/customize-mail-template-of-devise.html)

[plataformatec/devise](https://github.com/plataformatec/devise#configuring-models)

## It's composed of 10 modules:
### Database Authenticatable
> encrypts and stores a password in the database to validate the authenticity of a user while signing in. The authentication can be done both through POST requests or HTTP Basic Authentication.

### Omniauthable
> adds OmniAuth (https://github.com/intridea/omniauth) support.

### Confirmable
> sends emails with confirmation instructions and verifies whether an account is already confirmed during sign in.

### Recoverable
> resets the user password and sends reset instructions.

### Registerable
> handles signing up users through a registration process, also allowing them to edit and destroy their account.

### Rememberable
> manages generating and clearing a token for remembering the user from a saved cookie.

### Trackable
> tracks sign in count, timestamps and IP address.

### Timeoutable
> expires sessions that have not been active in a specified period of time.

### Validatable
> provides validations of email and password. It's optional and can be customized, so you're able to define your own validations.

### Lockable
> locks an account after a specified number of failed sign-in attempts. Can unlock via email or after a specified time period.

## View
### confirmations
#### new

### mailer
#### confirmation_instructions
#### reset_password_instructions
#### unlock_instructions

### passwords
#### edit
#### new

### registrations
#### edit
#### new

### sessions
#### new

### shared
#### links

### unlocks
#### new
Angular / Material Design やる時のATOMプラグイン一覧（オレ仕様だから信じるな）

えーっとですね、実はMacがおかしくなりまして、クリーンインストールしなくてはいけないので、ATOMのプラグイン一覧を書き写したものになります。

私は、現在、angularJSベースで書いているので、基本、HTML／CSS／JavaScript/Angular/Material Design/angular-materialを使うことを前提として実装しています。また、Monacaユーザーであり、onsenuiも実装しています。


##Monaca & angular & Material Design関連
angularjs
angularjs-helper
autocomplete-angular-material
autocomplete-onsenui
language-babel

##タグ閉じ系
atom-beautify
hightlight-column
hightlight-line
autoclose-html
autocomplete
autocomplete-paths

##無いとダメな奴
script
linter
linter-csslint
linter-jscs

##あると便利系
color-picker
file-icons
minimap


##日本語メニュー化系
japanese-menu


##Git系
git-plus
merge-conflicts


##ファイル出力系
pretty-json

##HTML系
atom-html-preview

これぐらいで今は済んでますが、あとからRuby on Railsで開発するので、もう少し付け足す感じですね。現場からは以上です。

##追記（2016年3月3日）
Ask Stack
minifier
atom runner
term2
web view
git log
Windowsでrm -rfしたい

コマンドプロンプトなら、

```ps1
rd /s /q
```

Powershellなら、

```ps1
Remove-Item C:\ -Recurse -Force
```

### 参考

* http://stackoverflow.com/questions/10443891/powershell-command-rm-rf
* http://stackoverflow.com/questions/97875/rm-rf-equivalent-for-windows
Windowsでprintenvしたい

コマンドプロンプトなら、

```ps1
set
```

Powershellなら、

```ps1
Get-ChildItem Env:
```

### 参考

* http://stackoverflow.com/questions/5327495/list-all-environment-variables-from-command-line
* https://technet.microsoft.com/en-us/library/ff730964.aspx
weibo(微博)のソーシャルボタンでは特殊文字「&(アンパサンド)」がエスケープされたままになる

※表題の通りです。
※解決方法が記載されている訳ではありません。

# youku(优酷)で検証
そういう訳で、youkuのタイトルに「＆」が入っている動画のweiboボタンを見てみる。
動画：[视频: 崔始源与刘雯在 H&M 2016 年新春系列广告中相爱了！](http://v.youku.com/v_show/id_XMTM0NDUwNzE0OA==.html?from=s1.8-1-1.2#paction)

シェアボタンのソースはこんな感じ
文字は全てエンコードされている。

```
<a title="转发到微博" charset="400-03-10" id="s_sina1" href="http://hz.youku.com/red/click.php?tp=1&amp;cp=4000363&amp;cpp=1000208&amp;url=http%3A//v.t.sina.com.cn/share/share.php%3Fappkey%3D2684493555%26url%3Dhttp%253A%252F%252Fv.youku.com%252Fv_show%252Fid_XMTM0NDUwNzE0OA%253D%253D.html%26title%3D%25E3%2580%2590%25E8%25A7%2586%25E9%25A2%2591%25EF%25BC%259A%25E5%25B4%2594%25E5%25A7%258B%25E6%25BA%2590%25E4%25B8%258E%25E5%2588%2598%25E9%259B%25AF%25E5%259C%25A8+H%2526M+2016+%25E5%25B9%25B4%25E6%2596%25B0%25E6%2598%25A5%25E7%25B3%25BB%25E5%2588%2597%25E5%25B9%25BF%25E5%2591%258A%25E4%25B8%25AD%25E7%259B%25B8%25E7%2588%25B1%25E4%25BA%2586%25EF%25BC%2581%25E3%2580%2591%26ralateUid%3D1642904381%26source%3D%25E4%25BC%2598%25E9%2585%25B7%25E7%25BD%2591%26sourceUrl%3Dhttp%253A%252F%252Fwww.youku.com%252F%26content%3Dutf8%26searchPic%3Dfalse" target="_blank"><i class="ico__sina"></i>微博</a>
```

# 期待される動作
期待される動作としては、これらの文字がデコードされて、weiboの文字入力フォームに
「视频: 崔始源与刘雯在 H&M 2016 年新春系列广告中相爱了！」
と表示されることである。

# 結果
![スクリーンショット 2015-09-30 20.04.21.png](https://qiita-image-store.s3.amazonaws.com/0/57635/4c79fbab-4e4e-4870-224d-05c15f803ab4.png)
ご覧の通り、「&(アンパサンド)」は「\&amp;」になる

# 当面の対策
## 投稿時に修正する
完全にユーザ任せになる
## タイトルに「&(アンパサンド)」が入っていたら全角変換にする
※未検証かつ非推奨
検証したら教えていただきたいところ

※ちなみに、このままシェアをしたことはないのでひょっとしたら投稿後にエスケープが解除されている...という淡い期待もしている。
【PHP】youtubeのURLから埋め込みコードを生成するには


フォームに入力されたyoutubeのURLから埋め込みコードを生成したい
なんてことがあるとする。

URLをから動画のIDだけ取ってくるのであれば以下の正規表現で片付く

```
#v=([-\w]{11})#
```

ご存知の通り、youtubeのURLはパラメータをくっつけていろんな再生設定が可能である。
例えばこんな感じ

- 指定の時間から再生する  
https://www.youtube.com/watch?v=sXrxmR8wO7A&t=10
- リスト再生  
https://www.youtube.com/watch?v=XVfdS7t-iLU&list=PLgtRDsudgFDAKjcrTIzU-fFdTNuLFViDF

これらの、ユーザーがフォームに入力したURLのパラメータを埋め込みコードに反映したいなんてことがあるとする

動画埋め込み用のパラメータはご覧の通り、たくさんあるので
https://developers.google.com/youtube/player_parameters?hl=ja#Parameters
今回は時間指定(t=〜〜)とリスト(list=〜〜)を対応できる処理を作ってみる

```php
/**
 * youtubeのURLから埋め込みタグを生成する
 *
 * @param   string $param youtubeのURL
 * @return  string        埋め込みタグ
 */
public function createvideotag($param)
{
    //とりあえずURLがyoutubeのURLであるかをチェック
    if(preg_match('#https?://www.youtube.com/.*#i',$param,$matches)){
        //parse_urlでhttps://www.youtube.com/watch以下のパラメータを取得
        $parse_url = parse_url($param);
        // 動画IDを取得
        if (preg_match('#v=([-\w]{11})#i', $parse_url['query'], $v_matches)) {
            $video_id = $v_matches[1];
        } else {
            // 万が一動画のIDの存在しないURLだった場合は埋め込みコードを生成しない。
            return false;
        }
        $v_param = '';
        // パラメータにt=XXmXXsがあった時の埋め込みコード用パラメータ設定
        // t=〜〜の部分を抽出する正規表現は記述を誤るとlist=〜〜の部分を抽出してしまうので注意
        if (preg_match('#t=([0-9ms]+)#i', $parse_url['query'], $t_maches)) {
            $time = 0;
            if (preg_match('#(\d+)m#i', $t_maches[1], $minute)) {
                // iframeでは正の整数のみ有効なのでt=XXmXXsとなっている場合は整形する必要がある。
                $time = $minute[1]*60;
            }
            if (preg_match('#(\d+)s#i', $t_maches[1], $second)) {
                $time = $time+$second[1];
            }
            if (!preg_match('#(\d+)m#i', $t_maches[1]) && !preg_match('#(\d+)s#i', $t_maches[1])) {
                // t=(整数)の場合はそのままの値をセット ※秒数になる
                $time = $t_maches[1];
            }
            $v_param .= '?start=' . $time;
        }
        // パラメータにlist=XXXXがあった時の埋め込みコード用パラメータ設定
        if (preg_match('#list=([-\w]+)#i', $parse_url['query'], $l_maches)) {
            if (!empty($v_param)) {
                // $v_paramが既にセットされていたらそれに続ける
                $v_param .= '&list=' . $l_maches[1];
            } else {
                // $v_paramが既にセットされていなかったら先頭のパラメータとしてセット
                $v_param .= '?list=' . $l_maches[1];
            }
        }
        // 埋め込みコードを返す
        return '<iframe width="600" height="338" src="https://www.youtube.com/embed/' . $video_id . $v_param . '" frameborder="0" allowfullscreen></iframe>';
    }
    // パラメータが不正(youtubeのURLではない)ときは埋め込みコードを生成しない。
    return false;
}
```
C# ActionとFunc　メモ

訳わかんなくなるのでメモ

■ 引数無し戻り値なし

      Action

■引数あり戻り値なし

      Action<引数型>

■引数なし戻り値あり

      Func<戻り値型>

■引数あり戻り値あり

      Func<引数型、戻り値型>
CakePHP3　インストール手順

#CakePHP3のインストール手順
CakePHP3のインストールの手順について説明します。
##インストール必須条件
<dl>
  <dt>PHP</dt>
  <dd>5.4.16以上</dd>
  <dt>MySQL</dt>
  <dd>5.1.10以上</dd>
  <dt>Etension</dt>
  <dd>mbstring mcrypt intl</dd>
</dl>

##composerでインストールをする
CakePHP3をインストールするにはcomposerが必須になります。
###composerのインストール方法
下記のコマンドを実行すればインストールできます。

```lang:
curl -sS https://getcomposer.org/installer | php
sudo mv composer.phar /usr/local/bin/composer
```
インストールができたかの確認は`$ composer`を実行して下記のように表示されれば成功です。
![スクリーンショット 2015-09-29 13.52.02.png](https://qiita-image-store.s3.amazonaws.com/0/92473/fa3e2ce4-f59d-daf1-d91b-d60d321b2219.png)

##CakePHP3のインストール
composerのインストールが完了したら、CakePHP3をインストールします。インストールは下記のコマンドでできます。

```lang:
composer create-project --prefer-dist cakephp/app hoge
```
インストールの途中で

```lang:
Set Folder Permissions ? (Default to Y) [Y,n]?
```
と聞かれるので`y`を入力すると、`tmp`以下のパーミッションを自動で設定してくれます。
http://localhost/hoge/ にアクセスして下記のような画像が表示されれば、インストールは完了です。
![スクリーンショット 2015-09-30 20.29.43.png](https://qiita-image-store.s3.amazonaws.com/0/92473/532b3a07-6334-e3f8-7e08-d676b5b5ff82.png)
thisの意味するところ

hoverやclickのようなイベントに使われるthis...

jQueryだと

	$(".hoge").hover(function(){
		$(this).css("color","red")
	});

と書いたりします。

この`$(this)`、１つ上に記述している`$(".hoge")`を単純に指しているかと思っていましたが、「イベントが起きている$(".hoge")」のことだそうです。

また、

	$(".hoge").hover(function(){
		$(".piyo",this).css("color","red")
	});

だと、`$(".piyo",this)`は
「イベントが起きている`$(".hoge")`の下層にある`$(".piyo")`」とのこと。
Rubyのnilってなんじゃ

なんか怖かったのでメモ。

```ruby
>> nil.class
=> NilClass
>> nil.class.superclass
=> Object
>> nil.class.superclass.superclass
=> BasicObject
>> nil.class.superclass.superclass.superclass
=> nil
>> nil.class.superclass.superclass.superclass.superclass
NoMethodError: undefined method `superclass' for nil:NilClass
        from (irb):11
        from /usr/local/rvm/rubies/ruby-2.2.1/bin/irb:11:in `<main>'
```

この入れ子構造はもちろん、

```ruby
>> nil.class.superclass.superclass.superclass.class
=> NilClass
>> nil.class.superclass.superclass.superclass.class.superclass
=> Object
>> nil.class.superclass.superclass.superclass.class.superclass.superclass
=> BasicObject
>> nil.class.superclass.superclass.superclass.class.superclass.superclass.class
=> Class
```
となる。
【laravel5】composer update をしたら盛大な文字化けを起こして困った　そんな時

# まずはじめに ※読み飛ばし推奨

---大事なことなので二回記述しますが、ここらへんは読み飛ばし推奨です---

laravel5でcomposer updateを起こしたらなんとも言いがたい、難読漢字だらけの文字化けを起こすのである。（私はこれをIT写経と名付けた）
ちなみにこの状態でmacのターミナルにてlaravelのコマンドを適当に打つと文字化けの中に絵文字が現れたりして非常に愉快な状態になる。

で、この状態をどうにも直さないことには開発ができないと困っていたところ、laravelのエキスパートが解決方法を伝授してくださった。
ご本人がドキュメント化しないのか尋ねたところ、株が上がるのであれば君がまとめておけばいいという粋な回答をいただく。
ということで、言われるがまま、株を上げるためにここに記しておくことにする。

---ここまで---
# 前提
APP_DEBUG = falseにする。
かつ
composer.jsonに以下の記載がある

```
~
"scripts":{
    "post-update-cmd":[
          "php artisan clear-compiled",
          "php artisan optimize"
    ]
}
```

# 原因
APP_DEBUG = false時にはphp artisan optimizeが実行されるため
[アプリ]/vendor/compiled.phpが生成されることによってこの問題が発生する。

生成されたcompiled.phpには

```
Symfony\Component\Debug のErrorHandlerクラスで
$e = md5("{$type}/{$line}/{$file}^@{$message}", true);
この処理でnull文字がはいっていて文字化けしている
^@
↑これ
コンパイル前は
$e = md5("{$type}/{$line}/{$file}\x00{$message}", true);
コンパイル時に\x00が解釈できなくて問題が起きている
```

そういう訳なので文字化けした状態からcompiled.phpを消すとうまいこと表示される。
例えば
1.

```
rm vendor/compild.php
```

2.

```
php artisan clear-compiled
```
で削除が可能

ただ、composer updateした際に生成されるので、このままでは再度composer updateをしたらまた例のcompiled.phpができあがって、文字化けが起こる ということを繰り返してしまう。

# 解決するには

1.composer updateをした時にcompiled.phpが生成されないような設定をする必要がある。
更に掘り下げると、compiled.phpはphp artisan optimizeというコマンドを実行した際に生成されるので、php artisan optimizeが起きる場所そのものを削除すれば良い。

ということで、アプリ直下のcomposer.jsonを見てみる。
すると、php artisan optimizeがあったので削除。
これで再度composer updateをしてもcompiled.phpが生成されずに済む、ということになる。

2.APP_DEBUG = trueにする
APP_DEBUG = true時にはoptimizeが実行されないので問題なければAPP_DEBUG = trueにする。
SoftLayer クッキングLABO

SoftLayerデザインパターンのサーバー構成を、Chefを使ってオートマチックに立ち上げようというコンセプトで やっていきます

## 即CHEFの機能を使えるシリーズ
このシリーズは、Knife とか Chefサーバーとか、面倒くさい作業は一切なしで、即クックブックを適用してサーバーの構築を進められるのだ ( ´ ▽ ` )ﾉ

###鉄板ロードバランサー LVS を10分で構築するCHEFクックブック
http://qiita.com/MahoTakara/items/f11a98565e41eee401d7
    - LVSリアルサーバーのクックブック https://github.com/takara9/lvs-web01
    - LVSバーチャルサーバーのクックブック https://github.com/takara9/lvs01

###MySQLのActive-Standby構成を30分で構築する
http://qiita.com/MahoTakara/items/fd48618c9e2905591755
    - Pacemaker + corosync クックブック https://github.com/takara9/pm_corosync01
    - iSCSIストレージ クックブック https://github.com/takara9/iscsiStorage01
    - MySQL クックブック https://github.com/takara9/mysql01
    - Hostfile クックブック https://github.com/customink-webops/hostsfile

###Nginx + WordPress を 1分で構築する CHEFクックブック
http://qiita.com/MahoTakara/items/0b19af5a1002547ebf47
    - WordPressを立ち上げるクックブック https://github.com/takara9/wordpress01

###CHEF の recipe で AWS や SoftLayer などクラウドベンダーを自動判定するには？
http://qiita.com/MahoTakara/items/dfcb75610253937cb214
    - ohaiの設定内容をダンプするクックブック https://github.com/takara9/ohai




#Knife を利用して、お行儀よく進めるシリーズ
----------------------------------------

## CHEFを利用するための準備作業
- [Chef-Zero/Solo と SoftLayer CUI の実行環境の作成](http://qiita.com/MahoTakara/items/68d17926d1cd14bb3979) (2015/10/1)
- [Chefのリポジトリの準備] (http://qiita.com/MahoTakara/items/795d1e009814e6b01f42) (2015/10/1)
- [Chef 対象サーバーと knife サーバーの鍵共有] (http://qiita.com/MahoTakara/items/fad764768c33488967ea) (2015/10/1)

## レシピ集
- [APF ファイアウォールの導入と設定のレシピ] (http://qiita.com/MahoTakara/items/f23a07e737ce81b74a9e)  <br/>
OSファイルウォールをインストールして有効化します。ポリシー定義ファイルを変更することでカスタマイズできます。(2015/10/2)
- [Linux のロケール設定を日本にするレシピ] (http://qiita.com/MahoTakara/items/3be10dd31a76e13605bf)  <br/>
時刻を日本標準時刻、メッセージを日本語に変更します。(2015/10/5)
- [ObjectStorageのマウント設定のCHEFクックブック] (http://qiita.com/MahoTakara/items/8e013b3ef1ad9c663c18) <br/>
SoftLayerのオブジェクト・ストレージをブロック・ストレージの様にマウントします。 CHEFコード (https://github.com/takara9/objectStorage01)   (2015/10/6 初版、2015/11/9 更新)
- [iSCSIストレージをマウントするCHEFクックブック] (http://qiita.com/MahoTakara/items/d21c57c38d5aa0184319) <br/>
エンデュランス・ストレージやパフォーマンス・ストレージのiSCSIストレージをマウントする様に設定します。(2015/10/7 初版  2015/11/9 更新) 
- [Pacemaker + Heartbeat でアクティブ・スタンバイを構成するレシピ] (http://qiita.com/MahoTakara/items/de823a0bdf4c77383efe) <br/>
Linuxのディストリビューションに含まれるOSSを利用して、アクティブ・スタンバイのHA構成を作るレシピです。 VIPのためにポータブル・サブネットを利用します。(2015/10/13)
- [Pacemaker + Corosync を利用してHAクラスタを構成するレシピ](http://qiita.com/MahoTakara/items/42da4199a99ae9532a25) <br/>
Heartbeatは長い間主流のクラスタ制御のサブシステムでしたが現在の推奨はCoroSyncになり、Linuxディストリビューションのリポジトリにも登録されています。CoroSyncは、CentOS7.1,CentOS6.7,Ubuntu14.04 でマルチキャストを利用して複数ノードでクラスタを構成できる強力なクラスタ制御ソフトです。(2015/10/13)
- [最新GA版 MySQL5.6 をセキュア・インストールするレシピ](http://qiita.com/MahoTakara/items/cb25e60cd08a6d969927) <br/>
LinuxディストリビューションにバンドルされているMySQLは、少し古いバージョンになっており、本番サービスや開発環境に利用するのは、最新版をダウンロードしてインストールしたいものです。アクティブ・スタンバイのHAクラスタ構成様に設定ファイルを修正するのも手間がかかるものです。このレシピは、これらの煩わし作業を解消します。(2015/10/15)
RSpec で Kernel.open をスタブする

# 概要

```app/controllers/hidamari_controller.rb
class HidamariController < ApplicationController
  # POST /hidamari/sketch
  def sketch
    ### 略 ###
   
    open('http://www.tbs.co.jp/anime/hidamari/')

    ### 略 ###
  end
end
```

上記のように [open-uri](http://docs.ruby-lang.org/ja/2.2.0/library/open=2duri.html) の [Kernel.open](http://docs.ruby-lang.org/ja/2.2.0/method/Kernel/m/open.html) を使用しているコードがあります。
その単体テストで open が呼ばれることを確認したいです。

うーん、Kernel.open をスタブする方法がぱっと思い浮かばなかったので色々試してみました。

```spec/controllers/hidamari_controller_spec.rb
# NG
expect(Kernel).to receive(:open).with('http://www.tbs.co.jp/anime/hidamari/')

# OK
expect_any_instance_of(Kernel).to \
  receive(:open).with('http://www.tbs.co.jp/anime/hidamari/')

# OK
expect_any_instance_of(Object).to \
  receive(:open).with('http://www.tbs.co.jp/anime/hidamari/')

# NG
expect_any_instance_of(BasicObject).to \
  receive(:open).with('http://www.tbs.co.jp/anime/hidamari/')

# OK (better)
#
# described_class == HidamariController #=> true
expect_any_instance_of(described_class).to \
  receive(:open).with('http://www.tbs.co.jp/anime/hidamari/')

# OK (best) ※ @jnchito さんにコメントで教えて頂きました。
# 
# controller は RSpec::Rails::ControllerExampleGroup に用意されている変数で、
# テスト対象のコントローラーのインスタンスが格納されています。
#
# controller.is_a?(HidamariController) #=> true
expect(controller).to \
  receive(:open).with('http://www.tbs.co.jp/anime/hidamari/')

post(:sketch)
```

`controller` をスタブする方法がもっともスマートだと思います。
`expect_any_instance_of` を使わずに `expect` で書ける (余計なスタブを行わずに済む) からです。

# 参考

* [How to rspec mock open-uri?](http://stackoverflow.com/questions/10796986/how-to-rspec-mock-open-uri)
* [RSpec Mocks 3.3 > Any Instance](https://relishapp.com/rspec/rspec-mocks/docs/working-with-legacy-code/any-instance)
Xcode7 & CocoaPods 0.38.2でArchiveすると“Generic Xcode Archive”になってしまう問題の解決方法(暫定対応)

# はじめに
先日、遅ればせながらXcodeのバージョンを7に上げたのですがタイトルの問題が起きた為、
暫定的な解決方法(2015/09/30現在)について記述しておきます。

まず筆者の開発環境について記述します。

- Xcode7.0
- CocoaPods 0.38.2
- iOSアプリ開発(WatchApp有り)

# 問題の現象
上記の環境においてXcodeで「Archive」を行うと以下の画像のような現象が起きました。
![Organizer.png](https://qiita-image-store.s3.amazonaws.com/0/87783/723cbff7-12e9-7c21-8104-7647873f8686.png)

最初に見た時は「ゑ！？」ってなりました。
当然、この状態ではAdHoc配信したりStoreへSubmitすることはできません。

この“Generic Xcode Archive”になってしまう問題ですが、様々な原因が考えられます。
CocoaPodsとは関係なく、プロジェクトのBuild Settingsの問題である可能性もあります。
そちらの問題についてまで触れると長くなるため、今回は割愛します。

今回、筆者が遭遇した問題はXcode7 & CocoaPods環境下でのみ発生する問題です。
尚、この現象自体はCocoaPodsのGithubで既にいくつかissueが起こされています（例: [#4021](https://github.com/CocoaPods/CocoaPods/issues/4021)）

# 解決方法について述べる前に
Githubのissueにいくつか解決方法が取り上げられていますが、根本的にはCocoaPodsの対応待ちです。
そのため、あくまでも**暫定的**な対応方法であり**自己責任**の下、行ってください。
筆者のやり方が間違っている可能性も十分ありえます。
素敵な解決方法をご存知の方がいらっしゃれば、是非コメントで教えてください。

# 解決方法
## 概要
CocoaPodsをGithubのmasterブランチ版でインストールし、pod installを実施する。
※preリリースされている最新の0.39.0.beta.4では解決できなかった為、未リリースの最新を参照するということ。

## 詳細な手順（一例）
　
<ol><li>Bundlerを使うため、インストールしてない人は以下のコマンドを叩いてください。

`$ gem install bundler`
</li>
<li>対象プロジェクトのPodfileがあるディレクトリにて「Gemfile」ファイルを作成

`$ vi Gemfile`

```rb:Gemfile
source 'https://rubygems.org'

gem 'cocoapods', :git => 'https://github.com/CocoaPods/CocoaPods.git'
```
</li>
<li>bundle installを実施

`$ bundle install`
</li>
<li>budler経由でpod installを実施

`$ bundle exec pod install`
</li>
<li>Xcodeでワークスペースを開き、Archiveを行えばいつも通りiOS App Archiveが出来上がります</li></ol>
## その他の解決手段
0.38.2で出来た“Generic Xcode Archive”を直接開き、手動でinfo.plistを修正するという方法もあります。
Archiveする度に修正しないといけないので、オススメしません…。

# 最後に
既にmasterブランチではfixされている問題なので、次回のリリース(or プレリリース)で解消される問題だと思います。
そのリリースが出るのを待てない！という方は、上記を試してみてください。
Socket.ioで作ったWebSocketサーバをELBでロードバランスする

## 課題
現在、作っているサービスではsocket.ioを使って作ったWebSocketサーバをELB経由で使っています。
開発環境はELB配下にEC2が1台で、本番環境は複数台です。

これ、どちらも正しく動いているように見えていたんですが、最近セットアップした本番環境の方でWebSocketへのUpgradeがうまくいっておらず、pollingで動いていることに今日気がつきました。

サービスとしてはまぁ一応問題はないんですが、WebSocketで動いていると思っていたものが実はPollingだったというのはわりかし衝撃です。

## 原因
なんでやねんと思ってググるとわりと簡単に原因に行き当たりました。公式ドキュメントで思いっきり説明されています。

http://socket.io/docs/using-multiple-nodes/

日本語だとこの辺でが参考になります。

- [Express / Socket.IO をスケールアウトしてみよう](https://gist.github.com/nulltask/89e6f36e194c951697a0)
- [Socket.IO or WebSocket を AmazonELB でバランスする検証](http://jxck.hatenablog.com/entry/20120228/1330444857)

どういうことかと言うと、socket-ioは最初はhttp(s)で接続して、WebSocketが使えそうだったらWebSocketを使うというアーキテクチャのため、イニシャルの接続でリクエストが２回発行されているんですね。

ロードバランシングしているとこの二つのリクエストが同じサーバに接続するとは限らないので異なるサーバに接続された場合にセッション情報が共有されていないためにWebSocketへのUpgradeが失敗する、と。

だったら、pollingもうまくいかないんじゃ。。。という気がしますがこれが動いているのは多分、Keep-Aliveが効いているためです。  
WebSocketとhttp(s)ではそもそもプロトコルが違うので、どうしても接続が分かれてしまうんだろうと推測します。

## 対策(不採用)
公式では、以下の対応方法が紹介されています。

### Sticky Sessionを使う
ロードバランサでSticky Sessionを使えるのであれば、同一クライアントからのリクエストは常に同一サーバに回されるのでこの問題は発生しません。

ただし、ELBの場合は

- WebSocketを使用する場合はTCPモードを使用する必要がある
  - httpモードではHTTPヘッダがELBによって若干書き換えられるのでWebSocket Upgradeができない
- TCPモードではSticky Sessionは使えない
  - httpヘッダとか一切見ないで素通ししているだけだから

となるのでこの方法は使えません。

### Redisを使ってセッションを共有する
(2015/10/15 追記)同僚からこれはメッセージをシェアするだけでハンドシェイク時には機能しないんじゃないかという指摘を受けました。
[socket.io-redis](https://github.com/socketio/socket.io-redis/blob/master/index.js)のソース見た感じ多分その通りです。
複数のWebSocketサーバを建てる場合にRedisは有効な解だと思いますが、以下のオリジナルの記述は間違いです。

~~多分これが正攻法です。~~
複数立っているsocket.ioサーバのセッション情報をRedisを介して共有することができるようなので、そうすれば複数のリクエストが異なるサーバに繋がっても問題なくなります。

解としてはこれがベストだろうと思うんですが、当たり前ですがRedisサーバを用意する必要があるわけです。
いずれやるのは良いとしても、時期的に今はサーバサイドに大きく手を入れたくはないのです。。。

## 対策(採用)
なんか方法はないものかと、socket.ioのソースを眺めていた所、かなりあっさりした解決法にたどり着いたのでここに紹介します。

``` javascript
var io = require("socket.io-client");
var url = ...;

var socket = io(url, {
    transports: ["websocket"]
});
```

いじょ。(^^v


transportsのデフォルトは`["polling", "websocket"]`ですが、これをwebsocketのみにすることによって最初のhttp(s)での接続をスキップしていきなりWebSocket接続することができます。
この場合(TCP的な)リクエストは1回になるのでセッション問題は発生しません。

ただし、当然ながらWebSocketに対応していないような古いブラウザへの対応はできなくなります。  
サービスの対象ブラウザをモダンブラウザに限定できるならこの方法もアリでしょう。

余談ですが、サーバサイドのコードには最初のhttp(s)リクエストに対応するためにCORS対応のコードが入っているんですが、このやり方の場合は多分それも不要になります。(WebSocketにはCORSなんて関係ないから)


## まとめ
もはやWebSocket非対応のブラウザなんか使ってはいけませぬ
強いられているんだふぉーすたっち


iPhone6s 記念に

http://jsdo.it/monpy/kK3d

force touch を使えば、インタラクティブな強いられているんだを実現できる。
コードは拝借しております。(http://qiita.com/nekoneko-wanwan/items/0911a59bf835d5b9e35a に感謝)
bash起動時の設定ファイル実行順序

## 図示
bash_profileやらbashrcやらややこしかったので起動順を図示してみた。

><a href="https://qiita-image-store.s3.amazonaws.com/0/29682/52eb2250-8bb6-a094-c8f0-c0d63aa45d1a.png"><img src="https://qiita-image-store.s3.amazonaws.com/0/29682/52eb2250-8bb6-a094-c8f0-c0d63aa45d1a.png" width="80%"></a>

> * ログイン起動：CUIモードやsshでログインした時
> * 対話起動：GUIからターミナルを開いた時や、bashをコマンドで直接実行した時

絶対こうだよと断言するほど自身はないんだけど、概ね次の理解で良さそう

* ``/etc``系はマシン固有の環境(ユーザにかかわらない)設定を記述
* ``~/``系はユーザ固有の設定を記述
 * → root以外のユーザが触るのは基本ここ 
* ``profile``系はbash環境にログインした時に実行される
* ``rc``系はbashを起動した時に実行される
 * →``/etc/bash.bashrc``は例外だが今はほぼ使われて無い？

## その他
* cシェルには``.login``というファイルがあるらしい。``~/.bash_login``はそれに由来するファイル
 * → どっちを使ってもいいけど普通は``.bash_profile``を使っとけということ？
* ``~/.profile``はbashじゃない環境でも実行される可能性がある模様
 * → bashに依存した設定は入れるなってことかな？
Ubuntu 14.04+julius+OpenJTalkで音声アシスタントを作ろうとした素人がハマった点と解決方法

#何をしようとしたのか？
NUC(DN2820FYKH)にLinuxをぶち込んで音声認識によって情報を音声で返すアシスタントを作りたかった。
Raspberry PiとかじゃなくてNUCなのは元々家庭用ファイルサーバーとか自分用ウェブサービス的なもののホスティングに使おうとしていたため。
当初はCentOS7が動いていたのでその上にJuliusとOpenJtalkを乗っけてやろうと思ったが、
そもそも先行事例がなさすぎて素人文系マンには無理だと見切ってUbuntuのLTSだったら情報もあるんじゃないの？
とUbuntuにした。
というのが始まりの部分
まだアシスタントは完成していないけどjulius,open_jtalkがそれぞれ無事動いたのでその辺りを公開。
あと相変わらずハマってる部分もあるのでそちらも書いておきます。

#環境は？
- Ubuntuは上述の通り14.04
- Juliusは4.3.1
- OpenJTalkは1.06
- HMM-Based Speech Synthesis Engine(hts_engine API)は1.09
- Mecabは0.994
- hts_engineとMecabはおそらくOpenJTalkについてきたやつ。別枠でmakeしてぶっこんだとかどっかから持ってきたという記憶はないので。


OpenJTalk周りは非常に不親切な状態だったので自分のような素人の為にも後で詳しく書いておきます。

#ハマった点リスト
##julius周り
1. OSS?ALSA?音声周りのドライバとかがよく分からない
2. Bluetoothのヘッドセットが繋がらない、音を拾わない。
3. 認識の成功率が低い、または関係ない言葉を正答として認識する
4. module modeで起動したはいいけどこのXMLどう整形すんねん。

まだありそうだけどとりあえずざっくりこんな感じ

##OpenJTalk周り
1. 不親切なエラー
2. OpenJTalkとhts_engineの依存関係がある...のか？
3. sourceforgeを見ても見つからないあるいは探しづらい情報たち
4. わかりづらい仕様変更と微妙に古い情報たち
5. 過去のバージョンに直接アクセスできない素敵なウェブサイト

#後で細かく追記していくけどざっくりとそれぞれどう解決したか、対処法とオススメの代替案

##Juliusと愉快な仲間たち
1. に関して：基本的にALSAをOSSエミュレーターで使う方法で解決した。
2. に関して：ハード的にBTアンテナの線が抜けてるだけでした。さしなおして解決。かと思ったら未だにBTで繋がってても音を拾わない事例が多発。USBマイク刺しっぱなしの方がソリューションとしては楽
3. に関して：認識した音声を辞書の単語リストとマッチングして近似の単語を投げ返してくるので、不要なゴミデータを意図的に作成すると相対的に正答データと誤答データの間の重み付けが分かれてそこそこの精度になる。まだ不満が残るのでSVMによる機械学習を用いて正誤判定するシステムを構築中。
4. に関して：XML要素が扱いにくい形になっているのでので、任意のスクリプトで成型をかければよろしい。具体的にはタグ要素を捨てて任意のkeyのValueのみを変数に入れるスクリプトを書いた。というかいっそJuliusのソースをいじって出力データをJSON配列の形式に書き換えてしまえばだいぶ扱いやすくなる気がするのでそっちも検討したい

##OpenJTalkと不快な仲間たち
1. に関して：エラーの判別とエラー内容が非常に不親切で何のエラーなのやらさっぱりわからん。ソースコードを見ても複数条件で起きうるエラーをひとまとめにしてエラーとして吐いてたのでハマった。ググってにたような事例の人を見つけ対処方を見つけで解決した。地獄かよ。
2. に関して：hts_engineとOpenJTalkにバージョンごとの依存関係があるのかは謎だが、OpenJTalkの設定ファイルの読み込み方が変わっているのでそのあたりの設定を書き換えないと動かなかった。ググっても詳しいことはでてこないしさらっとした解説がリリースノートにあっただけなので、簡単なミスなのに解決に長時間かかった。OpenJTalkのバージョンが1.06から、.htcdictで一括設定みたいな形になってたと思うので、それ以降のバージョンを使う場合は注意。
3. に関して：もうsourceforgeつかうのやめちくりーってなる。アカデミック系出身のOSSにありがちな不親切なウェブサイトやドキュメント担ってるので説明書的なpdfドキュメントを隅から隅まで読んで初めてちゃんと使える。斜め読みで使いたい機能だけをサクッと使うには向かないわー。
4. に関して：前述二つと関わるのだが、いまいち変更点がアナウンスされてない感じや、最新バージョンはリリースされててもブログやQiitaの記事は数年前とかのものだったりするのでOSやソフトのバージョンが違うと何が何やら...ってなる。RospeexやWebSpeechAPIの台頭によってこの辺のソフトをローカルに使う手間暇コストが馬鹿らしくなってるのもあって、2014年以降あまり使ってみた人のブログとかでの情報が出てないがソフトだけはちまちま更新されているので、公式ドキュメントをいちいち読んで変更点を把握しないとエラー吐いてしまうので使えない模様。
5. に関して：これは作った人が悪い。ユーザーには何もできない。古いバージョンを使いたい場合はソースフォージからソースを持ってきてmakeしないといけないみたい。最新版は細部の仕様が変わっているのもあってハマりまくる原因になった。最新版がエラーを吐く場合は基本的に設定ファイルとかオプションの仕様が変わった所為なのでそのあたりを把握して修正してあげればソフトそのものは動きます。

##オススメしたい代替案
特にこだわりがなければWebSpeechAPIを使ったウェブアプリを実装することをオススメします。
ロボットですらWi-Fi接続でリモート操作できる時代なので、音声認識システムはWebSpeechAPIに任せてChromeでWebAppを実行する形式にすると捗る。

- Chrome専用ウェブサイト(jsで音声認識周りを実装)→任意のサーバーサイドプログラムに投げてハードウェア側にコマンドを送ってハードを制御

とかにした方がシンプルで楽そう。
ハードウェア内にサーバーを持つのもRaspiとかで容易になっているので。
またはRospeexというソリューションも生まれてるのでそちらでもいいのかも。
いずれにせよネット接続必須になるのはメリットデメリットありますが。

進捗としては一応SVMをつかったりしてJuliusの認識精度を上げようとか、OpenJTalkで一時ファイルとして音声生成して再生するシステムを作ってやろうとかも一応並行して作業しているのですが、この辺りの努力をまるっとしなくて済むWebSpeechAPI版の実装を用いて完成を急ぐ方に力を入れることにしました。
CakePHPのfindメソッドのconditionsオプションキーで日付をうまく使う

ある日付を指定して、
日別の集計等をしたいけど、
持っている日付データはdatetime(timestamp)のみのときの話です。

```php
// 対象の日付
$targetDate = '2015-09-30'
```

2015-09-30のデータだけほしいのですが、
まずこんな感じだとダメです。（createdカラムはdatetime型）

```php
'conditions' => array(
	'created' => $targetDate
)
```
datetime型のcreatedに対してdate型のものと同じかどうかを比較しているのでダメです。


仕方なく、こんな感じでダサく書いてました。

```php
'conditions' => array(
	'created >= ' => $targetDate,
	'created < ' => date('Y-m-d', strtotime("$targetDate +1 day"))
)
```



これは、こんな感じでbetweenをうまく使って書けます。

```php
'conditions' => array(
	'created between ? and ?' => array($targetDate.' 00:00:00', $targetDate.' 23:59:59'),
)
```
CSS→Stylusを学ぶまでの軌跡① CSS3

# 学習目的

DerbyJSで使用しているStylusを習得する。
SASS（.scss）＋LESS等のCSSメタ言語の概要をとらえたうえで、Stylusを見ていく。

# 学習行程

- CSS→Stylusを学ぶまでの軌跡① CSS3
- CSS→Stylusを学ぶまでの軌跡② SASS
- CSS→Stylusを学ぶまでの軌跡③ LESS
- CSS→Stylusを学ぶまでの軌跡④ **Stylus**
- CSS→Stylusを学ぶまでの軌跡⑤ Appendix

# 概要

CASS, LESS, Stylusは、いずれも**CSSを拡張したメタ言語**である。
CSSを効率的に記述することができる。

## CSS の問題点

- 開発者のクセに影響される
- 継承やスタイルの使い回しについてコードが冗長
GitHub Enterprise 2.0を1年間運用してみた


#はじめに

近年では、開発をする上でGit、GitHubはほぼ必須といっても過言ではない _(過言か…？)_ ようになってきました。
もちろん、会社でも使いたい。ということでGitHub Enterprise(以下GHE)を足元サーバ(VMWare ESXi)で一昨年から去年の1年間運用しており、2.0が出たため、AWSに移行して、さらに1年間運用、合計2年間運用してきました。
そろそろ2年になったので、どんな感じで運用してきたかを共有するためにブログでも書いてみようかな…と思ったのが今回です。

#構成

##足元サーバのとき

###ユーザ数

約300人

###ハード構成

| CPU                 | Memory    | HDD | Hypervisor      | 価格 |
|---------------------|-----------|-----|-----------------|------|
| [Intel Core i7 4930K](http://ark.intel.com/ja/products/77780/Intel-Core-i7-4930K-Processor-12M-Cache-up-to-3_90-GHz) | DDR3 64GB | 2TB | VMWare ESXi 5.5 | 約20万     |


##AWSのとき

###ユーザ数

約1,000人

###ハード構成

####Masterとslave(後述)

| Instance Type | EBS(root) | EBS(block) |
|---------------|-----------|------------|
| r3.xlarge     | 60GiB     |  500GiB          |

####Backup用(後述)

| Instance Type | EBS(root) |
|---------------|-----------|
| t2.small    | 500GiB     | 

2.0では[High Availability Cluster Configuration](https://help.github.com/enterprise/2.0/admin-guide/high-availability-cluster-configuration/) が設定できます。Masterが死んでしまっても、大体2-10分程度で復帰することが可能です。しかし、設定はされていますが一度も使ったことはありません。

#安定性

極めて安定です。
2年間運用していますが、一度もGHE自体が要因で落ちたことはありません。
落ちたことがないので、本当にそれしかいうことがありません…。
8/30〜9/30のモニタを見たところ、r3.xlargeでもスペック的にはかなり余している状態です。結構アクティビティ自体は有るのですが（具体的な数字は書けない）、すごいですね…。

#運用

##可用性、障害対応

障害が起きたことがないので、特に何も言うことはないです…。
_ホント何のためにブログ書いてるんだか_
一応、上記に記載したとおり、HAを設定しているぐらいです。

##バージョンのアップデート

これがなかなかトリッキーです。
新しいバージョンが出るとメールが送られてきます。
まずリリースノートのNew Featureの部分を見てテンションを上げた後、必ず Known Issuesを読んで、影響があるかどうかを確かめています。まあ当たり前のことですね。ブログ作成時の最新は[こちら](https://enterprise.github.com/releases/2.3.3/notes)です。

その後、アップデートすることになるのですが、私は下記のような順番で行っています。

- メンテナンスモードに移行させユーザを遮断
- バックアップ用インスタンスを上記のスペックで作成
- [buckup-utils](https://github.com/github/backup-utils)を使ってすべてのバックアップを作成
- 新しくMasterとSlaveを作成
- [backup-utils](https://github.com/github/backup-utils)を使って、バックアップからリストア
- メンテナンスモードを解除
- 古いインスタンスを停止
- 数日間特に問題がなければ古いインスタンスとEBSを削除

[ここ]
(https://help.github.com/enterprise/2.0/admin-guide/upgrading-the-github-enterprise-virtual-machine/)に書かれている`ghe-upgrade`は行っていません。

しかし、最近リポジトリ数が増えてきたので、バックアップにかなりの時間を要することになってきているため、基本的に休日にアップグレードを行っています。

##ユーザ/Organization/oauth・外部アプリ連携の管理

勝手にやってもらってます。
ユーザはLDAP連携ができるのでそちらを使ったほうが良さそうです。

##GHEと合わせて使っているツール群

###Slack, Hubot

主に通知です

###JIRA

チケット管理ツールとしてJIRAを使っているプロジェクトでは、[Smart Commits](https://confluence.atlassian.com/fisheye/using-smart-commits-298976812.html)を使っているところがかなりあるようです。

###Jenkins

CIは重要ですね

###ZenHub Enterprise

最近の個人的なイチオシです。
GitHub.comだけではなく、[GHEでも使用可能になりました。](https://www.zenhub.io/enterprise)

#最近困っていること

##メール通知問題

PRが出されたり、issueが切られたりするとメールで通知が来ます。しかし、ユーザ数が多くなりすぎるとメールが飛びすぎていろいろな制限に引っかかってしまう可能性があります。
GHE自体にメール送信機能があれば…と思っているところです。

#まとめ

GitHub.comで開発をやっていると、[しばしばアクセスできなくなったり](http://cloud.watch.impress.co.jp/docs/column/infostand/20150406_696301.html)してしまうため、やはりGHEは重要な存在だといえるでしょう。
また、普段使い慣れているGitHubのUIがほぼそのままで使え、メンテナンスの手間が殆どなく、くだらない質問にも素早く応えてくれるサポートチームがあるため、他のソリューションを使うよりも少々高くてもGHEを使うのが得策だというのが、現時点での見解です。