OmniAICreator/Qiita-1.07M huggingface dataset:
個人的に便利なAngularJSモジュール



angular-bootstrap (https://angular-ui.github.io/bootstrap/)
いつも取り敢えずコレを入れて、足りないものを探したり作ったり補っていく感じ。ModalとかPopupとかDropdownはやっぱ外せない。

## ルーター

ui-router(https://github.com/angular-ui/ui-router)
ngRouteの代替。機能充実。ビューをネストできたり他へ飛ぶ時に気軽にオブジェクトを渡せるのがつよい。

## Restful

- Restangular (https://github.com/mgonto/restangular)
- ngResource(https://docs.angularjs.org/api/ngResource/service/$resource)

いちいちServiceを書く手間が省ける。
今はRestangular使ってます。ngResouceは結局URLひとつに付き一つServiceを作らなきゃいけないのがめんどうですが、Restangularは以下のようにシンプルにチェインさせることができるので、ベースURL一つにサービス一つ用意するだけで良い。

```js:Restangular

Restangular.all('users').getList()
   .then(function(data){
      $scope.users = data;
   });
// GET: /users

$scope.user = data[0];
$scope.user.one('messages', 123).one('from', 123).getList('unread');
// GET: /users/123/messages/123/from/123/unread
```

今API側も同時進行で作ってるので、個人的にリソースをどうマッピングしたらいいのかの参考にもなりました。

## ファイルアップロード

ng-file-upload(https://github.com/danialfarid/ng-file-upload)

## AJAX ローディングバー

Angular Loading Bar(http://chieffancypants.github.io/angular-loading-bar/)
カスタマイズ性は低いですが、一度設定するだけでAJAX通信する時に必ず表示してくれる手軽さが良い。
毎度はいらないので自分で実装するというときはangular-spinnerかな。



## Alert

なぜangular-bootstrapは浮く奴を標準装備してないんだろう…

#### Dialog系
ngSweetAlert(http://oitozero.github.io/ngSweetAlert/#/home)
ngDialog(https://github.com/likeastore/ngDialog)
上がデザイン過多（大体浮く）で下がカスタマイズ自由すぎる（使う前に調整が必要）。
ngBootboxは馴染むけど、jQueryも本家bootbox.jsも必要なのが玉に瑕。SweetAlertもそうなので純Angularで行きたいならngDialogか。

#### Pop系 (ブロックしないやつ)
どちらもtoastrの移植。
https://github.com/jirikavi/AngularJS-Toaster (jQuery必要)
http://foxandxss.github.io/angular-toastr/ (純正)
何か融通が効かなくて古株の上をつかっているけど、下は活発に更新されてるようなので期待。

# チェックボックス
Checklist Model (http://vitalets.github.io/checklist-model/)
チェックボックスのチェックされてるやつを配列にしてくれたりオブジェクトを配列にしてくれたり。かゆいところに手が届く。

## マルチセレクト

AngularJS Dropdown Multiselect 
(http://dotansimha.github.io/angularjs-dropdown-multiselect/)
かゆいところに手が届く２。もう一つ有名な方は微妙に扱いづらかった為。ngDisabledに対応してない等不便があると思ったが、pull-requestの中に良いパッチをコミットしてくれてる人がいる。
あとソースコードがそんなに複雑でないので、自分で簡単に機能も追加できた。

## モジュールやライブラリのLazyLoad

ocLazyLoad (https://oclazyload.readme.io/)
SPAの難点は最初の読み込みがどうしても重いこと。特定のモジュールやライブラリは一瞬しか使わないのに……という時に、読み込ませたいタイミングで読み込ませられるモジュール。大工事にはなるかもですが、パフォーマンスを見直したい時に。ServiceもDirectiveもあります。



##スクロール

ngInfiniteScroll (http://sroze.github.io/ngInfiniteScroll/demos.html)
永久スクロールできるやつ

ngSmoothScroll (https://github.com/d-oliveros/ngSmoothScroll)
アンカー先スクロールできるやつ


##おまけ

http://ngmodules.org/ ここで人気順に見るのも良い。今見たらだいたいあった。
Token based Authを実装したときhttp-auth-interceptorにはお世話になりました。
Go(goquery)でQiitaのスクレイピングライブラリをつくった



[high5/go-qiita-explore](https://github.com/high5/go-qiita-explore)



スクレイピングの対象は、特定のタグを対象にした[最近ストックされた投稿](http://qiita.com/tags/golang/stocks)と[新着投稿](http://qiita.com/tags/golang/items)になる。 
※Qiitaが用意している[公開API](https://qiita.com/api/v2/docs)を利用すれば同等のことができ、安定もしているので、通常、そちらの利用をおすすめします。


## 使用例
取得したいtagとpage(省略可能,デフォルト1)を指定して使う。 


最近ストックされた投稿(例.ruby) 

```golang

package main

import (
    "fmt"
    "github.com/high5/go-qiita-explore"
    "log"
)

func main() {
    explore := explore.NewExplore()
    articles, err := explore.GetStocks("Ruby")
    if err != nil {
        log.Fatal(err)
    }
    for index, article := range articles {
        if index == 0 {
            fmt.Println("------------------------------------------------------------------------------")
        }
    fmt.Printf("title:        %s \n", article.Title)
        fmt.Printf("url:          %s \n", article.URL.String())
        fmt.Printf("user:         %s \n", article.UserName)
        fmt.Printf("user_url:     %s \n", article.UserURL.String())
        fmt.Printf("stock:        %d \n", article.StockCount)
        fmt.Printf("created_time: %s \n", article.CreatedTime.Format("2006-01-02"))
        for index, tag := range article.Tags {
            tagNo := index + 1
            fmt.Printf("tag%d:         %s (http://qiita.com/tags/%s)\n", tagNo, tag, tag)
        }
        fmt.Println("------------------------------------------------------------------------------")
    }
}
```

新着投稿(例.JavaScript)

```golang
package main

import (
    "fmt"
    "github.com/high5/go-qiita-explore"
    "log"
)

func main() {
    explore := explore.NewExplore()
    articles, err := explore.GetItems("JavaScript", 1)
    if err != nil {
        log.Fatal(err)
    }
    for index, article := range articles {
        if index == 0 {
            fmt.Println("------------------------------------------------------------------------------")
        }
    fmt.Printf("title:        %s \n", article.Title)
        fmt.Printf("url:          %s \n", article.URL.String())
        fmt.Printf("user:         %s \n", article.UserName)
        fmt.Printf("user_url:     %s \n", article.UserURL.String())
        fmt.Printf("stock:        %d \n", article.StockCount)
        fmt.Printf("created_time: %s \n", article.CreatedTime.Format("2006-01-02"))
        for index, tag := range article.Tags {
            tagNo := index + 1
            fmt.Printf("tag%d:         %s (http://qiita.com/tags/%s)\n", tagNo, tag, tag)
        }
        fmt.Println("------------------------------------------------------------------------------")
    }
}
```
VMWare Fusion 8 を使ってMacな仮想マシンを作る


つい最近 El Capitan が出たことだし、改めてVMの作り方を整理。

### キーボードの設定
キーボードがUSキーとして認識されてしまうので、JISキーボードとして認識させる。

``` virtual_machine.vmx
keyboard.vusb.idVendor=0x05AC  
keyboard.vusb.idProduct=0x020D  
```

USキーボードを外部キーボードなどで使用する場合は上記設定を外す。

### モニターの設定
15インチで2880x1440の解像度だと字が小さくて読みづらい場合はターミナルで以下のコマンドを実行。

```
sudo defaults write /Library/Preferences/com.apple.windowserver DisplayResolutionEnabled -bool YES
```

上記設定で、ｱｯやっぱ元の設定が良いですってなった場合はターミナルで以下のコマンドを実行。

```
sudo defaults delete /Library/Preferences/com.apple.windowserver DisplayResolutionEnabled
```

### VMWare Toolsのインストール
まぁこれはいつもどおりに、[仮想マシン] > [VMWare Tools のインストール] からインストールを実行。


あとはスナップショットを取って煮るなり焼くなりしましょう＾ｑ＾
[Windows 10] ESETのセキュリティソフトをインストールしているとエクスプローラーの設定やデスクトップアイコンの大きさ、位置などが勝手にリセットされる問題の対処法

エクスプローラの詳細表示の設定が保存されないのも、同じ原因。

以下、http://answers.microsoft.com/ja-jp/windows/forum/windows_10-start/windows-10/65fe77f8-a25b-4996-84dd-df9508a1787a からの抜粋

> もしESETをお使いなら以下をお試しください。
http://www.askvg.com/fix-desktop-icons-position-and-folder-view-settings-problem-in-windows-10/

> ※レジストリの編集ですのでくれぐれもご注意いただき、自己責任でお願いします。

> ■抜粋
次のキーをチェック
HKEY_CLASSES_ROOT\CLSID\{42aedc87-2188-41fd-b9a3-0c966feabec1}\InProcServer32
HKEY_CLASSES_ROOT\Wow6432Node\CLSID\{42aedc87-2188-41fd-b9a3-0c966feabec1}\InProcServer32

> 以下に修正
%SystemRoot%\system32\windows.storage.dll

> この時に所有権とアクセス権を取得設定する必要があります。

> 再起動
郵便番号データを自前で持つ

## 準備

[小林 照幸さん](https://github.com/koba-ninkigumi)の作られた以下をダウンロード

* [yubinbango/yubinbango](https://github.com/yubinbango/yubinbango)

## 修正方法

```diff:index.html
- <script src="https://yubinbango.github.io/yubinbango/yubinbango.js" charset="UTF-8"></script>
+ <script src="./yubinbango.js" charset="UTF-8"></script>
```

```diff:yubinbango.js
- this.URL="https://yubinbango.github.io/yubinbango-data/data"
+ this.URL="./yubinbango-data/data"
```

* [yubinbango/yubinbango-data](https://github.com/yubinbango/yubinbango-data)をダウンロードし展開
Thunderbirdのメッセージ既読時間の設定

いつのバージョンからかはわかりませんが、Thunderbird38.3.0をインストールしたところ、メッセージの既読時間のdelayがoffになっており、その設定をする項目もなくなっていました。

https://goo.gl/p3HLMN
には、「既読と表示」タブ というものがあるように書いてあるのですが、見当たりません。。。(以前はあったはず)
![スクリーンショット 2015-10-03 7.11.57.jpg](https://qiita-image-store.s3.amazonaws.com/0/32492/0fc98599-99f3-cdd8-abce-0f38f596b6a3.jpeg)


~~メッセージの既読時間のdelayを設定は上記画像の右下にある「設定エディタ」から行うことができます。
設定エディタ画面を開いた後、message_read_delayと検索すると、以下のような設定になっていますので、
mailnews.mark_message_read.delayの設定を falseからtrueに変更することで、delayが有効になります。~~
オプション - 表示 - 詳細タブ に、既読 の項目があり、そこで設定できることが分かりました。![スクリーンショット 2015-10-24 6.28.11.jpg](https://qiita-image-store.s3.amazonaws.com/0/32492/c29d2415-6dbf-f2d0-7b2c-0ac37ef0b464.jpeg)
数字の多いテキストデータが思ったよりも圧縮できなかったこと

# はじめに
数字の多いテキストデータを7zで圧縮したのですが、思ったほど圧縮できませんでした。
情報源符号化定理と併せて考察しました。

結論としては、7z圧縮値と理論値はほぼ一致しました。
思ったほど圧縮できなかった理由としては乱数で数値を発生させたため、
数字の出現頻度が一様になりエントロピーが増加したためでした。

# 7z圧縮
数字の多いテキストデータを7zで圧縮しました。
元データサイズは185kBで、圧縮後のデータサイズは77.3kBでした。
圧縮率は41.78%です。数字がほとんどなのでもっと圧縮できると思っていたのですがいまいちでした。

最大圧縮率はどのくらいなのかと調べてみたところ、
情報源符号化定理で見積もることができることがわかりました。

なお、"情報源(の)符号化"という耳慣れない言葉がでてきますが、
"情報源" = "圧縮前データ", "符号化" = "圧縮" ととらえても大きくは違わないと思います。

# 情報源符号化定理

情報源符号化定理とは、情報源の符号化において、
最小の平均符号長を与える定理です。

```math
(情報源エントロピー) = (最小の平均符号長)
```

となる符号が存在します。

エントロピーとは情報量の期待値として定義される量です。

まず、情報量$I$の定義から

```math
I = -log_2 P = log_2 \frac{1}{P}
```

$P$は事象の生起確率です。生起確率が大きいほど情報量は小さくなります。
よく発生する事柄は情報量が小さく、めったに起こらない事柄は情報量が大きいということになります。

次に、エントロピー$H$を定義します。N個の事象があり、それぞれの生起確率を$P_i$、情報量を$I_i$とします。

```math
H = \sum^{N}{P_i * I_i} = \sum^{N}{P_i * (-log_2 P_i)}
```

エントロピーは情報量の期待値(平均値)になっています。

まとめると、情報源記号の生起確率が分かれば、最小の平均符号長が分かることになります。

# 数字の多いテキストデータへの応用

情報源記号は8bit固定長の文字の並びです。
表現できる記号は2の8乗である256種類となります。

一方、実際に使用している記号は、

- 数字0~9文字
- 小数点"."
- 改行(\n)
- 半角空白

13種類です。256-13 = 243種類は使用しておらず、
生起確率0の無駄な記号となっています。

文字毎に個数をカウントして、生起確率$Pi$を計算しました。
生起確率からエントロピーを計算すると3.55(bit)になります。
情報源は8bit固定なので44.42%圧縮できることが分かります。
7z圧縮率は41.78%なので近い値になっています。

![image](https://qiita-image-store.s3.amazonaws.com/0/84205/b2f4c40e-4b66-4808-a25f-1e201a4a955a.png)

# 7zの方が圧縮率が高い

ここで興味深いのは7zの方が圧縮率が高いことです。
情報源符号化定理の条件として、"無記憶情報源"である必要があるのですが、
使用したデータは"マルコフ情報源"になっていたからではないかと考えています。

つまり情報源記号は完全なランダムではなく、並びに規則性があったためです。
データを抜粋します。" 0."という文字列が繰り返し現れています。

```
 0.8798806169075407 0.6572010431772227 0.5013760835440487
 0.427608301274456 0.2199377737264211 0.652005591194716
```

7zではここらへんの事情も考慮して圧縮しているようです。

# Appendix 文字出現頻度のカウント
テキストデータ内の文字の出現頻度をカウントするpythonスクリプトを作成したので記載します。
(*)ファイル名は"data.txt"固定値となっています。

```py3
d = {}
total = 0
with open("data.txt", "r") as f:
	for ln in f:
		for ch in ln:
			total = total + 1
			if ch in d:
				d[ch] = d[ch] + 1
			else:
				d[ch] = 1

for k, v in sorted(d.items(), key=lambda x:x[1]):
    print(k, v, v/total)

print("total:", total)
```
Github 上にあるリソースを zip で納品したいときは release-it つかうとバージョン管理もできて便利

たとえば納品ベースな仕事を受けたとき。

Github のプライベートリポジトリつくってもらって push することで納品できるのであればそんなに困らない。
だってそれで OK ならきっとクライアント側にエンジニアがいる/担当者自体が git つかえるのだもの。

2015年現在となっても、そうはいかないケースもあるので納品物の管理という作業はちょくちょく発生してしまう悲しさ。
クライアントから戻し対応一切受け付けず、一度提出したら即終了なお仕事なら困らないかもしれないけれど、そんな事案は遭遇したことがない。

以下、A: 依頼者、B: 作業者 としてながめてください。

* A: ここ直して
* B: はい、なおしました
* A: ここも直して欲しい
* B: あい
* A: あ、3つ前にもらったあそこのデザイン復活させたい
* B: 3つ前のってどれだ…これかな…これであってます？
* A: ちげーよそれじゃねーしおまえくそだななにいってんのまじくそが
* B: (FXXK)

というやりとりが発生するかもしれないなーって想像するだけでめんどくさい。あーめんどくさい。

こんなところで不毛なやり直し作業を発生させたくないからバージョン番号を振って、共通の言葉として使えると解消できそうなのだけれど、今度は手動でバージョン管理するのめんどくさいという問題がでてくる。

npm とか composer とか bower とか、プロジェクトディレクトリに依存パッケージ落としてくるやつらは提出用の zip から消したいしね。消したあとにインストールしなおすとかめんどくさい。


そんなあなたにおすすめなのが [release-it](https://github.com/webpro/release-it)。
npm からさくっとインストールできて Github 上のリポジトリを release-it してくれる。

具体的にはこんな感じ

```sh
// インストール
npm install release-it -g

cd PATH/TO/PROJECT
release-it
```

これだけ。これだけで Github の releases に新しいバージョン番号でタグ切ってくれる。
つまりそれは zip ファイルをダウンロード可能な状態になっているので渡すだけ。

README.md を読むと

```
elease-it minor
release-it 0.8.3
release-it 2.0.0-rc.3
```

こんなこともできてしまうっぽいのでメジャーバージョン変えたりするのも楽ちん。
zip を渡す前にリリースについての差分を下の画像みたいな感じで書いておくとか、タイトルちゃんと書くとか、コミットログコピペしておくとか、Slack なり Chatwork 経由の指示コピペしておくと後から探しやすいのでは。

![スクリーンショット 2015-10-03 5.09.13.png](https://qiita-image-store.s3.amazonaws.com/0/28612/949107ec-797f-7e2b-7fbd-d17d166e94c8.png)


ツール使えるところはどんどん使って不幸の数を減らしましょう。
watchOS 2の実機でNSDataがエラーになる

# はじめに

StoryboardにWKInterfaceImageを配置して、指定したURLの画像を表示します。

![Storyboard WKInterfaceImage](https://qiita-image-store.s3.amazonaws.com/0/3862/aaf5c23d-9fd5-a4df-621e-d3d442e8cc37.jpeg)

コードは以下のとおりです。

```swif:InterfaceController.swift
import WatchKit
import Foundation

class InterfaceController: WKInterfaceController {
    @IBOutlet var image: WKInterfaceImage!
    override func awakeWithContext(context: AnyObject?) {
        super.awakeWithContext(context)
        
        let url = NSURL(string: "https://YOUR_IMAGE_FILE")!
        let data = NSData(contentsOfURL: url)
        self.image.setImage(UIImage(data: data!))        
    }

    override func willActivate() {
        super.willActivate()
    }

    override func didDeactivate() {
        super.didDeactivate()
    }
}
```

シミュレータで実行すると画像が表示されます。
シミュレータのバージョンは`Version 2.0 (SimulatorApp-621 CoreSimulator-179`です。

![シミュレータ実行結果](https://qiita-image-store.s3.amazonaws.com/0/3862/6cc4c42f-233a-c348-4503-8064c4f55bd8.jpeg)

実機で実行するとNSDataの箇所でなエラーになります。
実機のバージョンは`watchOS 2.0(13S344)`です。

```
fatal error: unexpectedly found nil while unwrapping an Optional value
```

# NSURLSessionで書き換える

NSDataのメソッドにバグがあるようです。
[watchOS 2 on device doesn't read NSData](http://stackoverflow.com/questions/32769091/watchos-2-on-device-doesnt-read-nsdata)

NSDataをNSURLSessionで書き換えます。

```swif:InterfaceController.swift
import WatchKit
import Foundation


class InterfaceController: WKInterfaceController {

    @IBOutlet var image: WKInterfaceImage!
    override func awakeWithContext(context: AnyObject?) {
        super.awakeWithContext(context)
        
        let url = NSURL(string: "https://YOUR_IMAGE_FILE")!
        let task = NSURLSession.sharedSession().dataTaskWithURL(url, completionHandler: {data, response, error in
            self.image.setImage(UIImage(data: data!))
        })
        task.resume()
    }

    override func willActivate() {
        super.willActivate()
    }

    override func didDeactivate() {
        super.didDeactivate()
    }
}
```

実行するとシミュレータでも実機でも画像が表示されます。
軽くて、素早くて、 Swift の XML/HTML パーサー

#Fuzi
私が作ったXML/HTML パーサーFuziが[SwiftSandbox](http://swiftsandbox.io/issues/9#start) Issue 9に当選しましたｗ

Update: 2016/09/24, [FuziがFirefox for iOSプロジェクトに採用されました](https://github.com/mozilla/firefox-ios/pull/2105)

Fuzi は Mattt Thompson氏の [Ono](https://github.com/mattt/Ono)(斧) に参照し Swift 言語で実装した XML/HTML パーサーです。[[ドキュメント]](http://cezheng.github.io/Fuzi/)

よろしければ、どうぞお使いくださ（CocoaPods, Carthage対応あり）

https://github.com/cezheng/Fuzi

日本語のREADMEもあります　https://github.com/cezheng/Fuzi/blob/master/README-ja.md

#用例
##XML
```swift
import Fuzi

let xml = "..."
do {
  // if encoding is omitted, it defaults to NSUTF8StringEncoding
  let doc = try XMLDocument(string: xml, encoding: NSUTF8StringEncoding)
  if let root = document.root {
    print(root.tag)
    
    // define a prefix for a namespace
    document.definePrefix("atom", defaultNamespace: "http://www.w3.org/2005/Atom")
    
    // get first child element with given tag in namespace(optional)
    print(root.firstChild(tag: "title", inNamespace: "atom")
    
    // iterate through all children
    for element in root.children {
      print("\(index) \(element.tag): \(element.attributes)")
    }
  }
  // you can also use CSS selector against XMLDocument when you feels it makes sense
} catch let error as XMLError {
  switch error {
  case .NoError: print("wth this should not appear")
  case .ParserFailure, .InvalidData: print(error)
  case .LibXMLError(let code, let message):
    print("libxml error code: \(code), message: \(message)")
  }
}
```
##HTML
`HTMLDocument` は `XMLDocument` サブクラス。

```swift
import Fuzi

let html = "<html>...</html>"
do {
  // if encoding is omitted, it defaults to NSUTF8StringEncoding
  let doc = try HTMLDocument(string: html, encoding: NSUTF8StringEncoding)
  
  // CSS queries
  if let elementById = doc.css("#id") {
    print(elementById.stringValue)
  }
  for link in doc.css("a, link") {
      print(link.rawXML)
      print(link["href"]
  }
  
  // XPath queries
  if let title = doc.firstChild(xpath: "//head/title") {
    print(title.stringValue)
  }
  for paragraph in doc.xpath(".//body/descendant::p") {
    print(meta["class"])
  }
    
  // Evaluate XPath functions
  if let result = doc.eval(xpath: "count(/*/a)") {
    print("anchor count : \(result.doubleValue)")
  }
} catch let error {
  print(error)
}
```

##エラー処理なんて、どうでもいい場合

```swift
import Fuzi

let xml = "..."

// Don't show me the errors, just don't crash
if let doc1 = try? XMLDocument(string: xml) {
  //...
}

let html = "<html>...</html>"

// I'm sure this won't crash
let doc2 = try! HTMLDocument(string: html)
//...
```

#Onoからの移行?
下記2つのサンプルコードを見たら、`Ono`と`Fuzi`の違いをわかる。

[Onoサンプル](https://github.com/mattt/Ono/blob/master/Example/main.m)

[Fuziサンプル](https://github.com/cezheng/Fuzi/blob/master/FuziDemo/FuziDemo/main.swift)

もっと詳しい情報はgithubのREADMEをご覧ください。
PythonのようなスッキリしたSwift正規表現ライブラリー

# PySwiftyRegex
私が前に作った正規表現のライブラリは今週の[SwiftSandbox](http://swiftsandbox.io/issues/9#start) Issueに当選しましたｗ

Pythonのreのようなスッキリした正規表現ライブラリーです。よろしければ、どうぞお使いくださ（CocoaPods, Carthage対応あり）

https://github.com/cezheng/PySwiftyRegex

日本語のREADMEもあります https://github.com/cezheng/PySwiftyRegex/blob/master/README-ja.md


# よく使われるメッソドの用例
## RegexObjectをコンパイルする
```swift
let regex = re.compile("this(.+)that")
```
## 文字列の始めからマッチングする
```swift
if let m = regex.match("this one is different from that") {
	m.group()  //"this one is different from that"
	m.group(1) //" one is different from "
}
```
## 文字列の中にパターンを探す (first match)
```swift
if let m = regex.search("I want this one, not that one") {
	m.group()  //"this one, not that one"
	m.group(1) //" one, not "
}
```
## マッチングできた全ての文字列を取得する
```swift
regex.findall("this or that, this and that") // ["this or that", "this and that"]
```
## マッチングできた全てのMatchObjectを取得する
```swift
for m in regex.finditer("this or that, this and that") {
	m.group()  // 1st time: "this or that", second time: "this and that"
	m.group(1) // 1st time: " or ", second time: " and "
}
```
## パターンで文字列を分割する
```swift
let regex = re.compile("[\\+\\-\\*/]")

// デフォルト、全て分割する
regex.split("1+2-3*4/5")    // ["1", "2", "3", "4", "5"]

// 最大分割回数 = 2
regex.split("1+2-3*4/5", 2) // ["1", "2", "3*4/5"]
```
## パターンで文字列を置換する
```swift
let regex = re.compile("[Yy]ou")

// 全て置換する (この例は2回)
regex.sub("u", "You guys go grap your food")     // "u guys go grap ur food"
regex.subn("u", "You guys go grap your food")    // ("u guys go grap ur food", 2)

// 最大置換回数を1回にする (この例は1回)
regex.sub("u", "You guys go grap your food", 1)  // "u guys go grap your food"
regex.subn("u", "You guys go grap your food", 1) // ("u guys go grap your food", 1)
```

もっと詳しい情報はgithubのREADMEをご覧ください。
Automated Bundle Update with Descriptive Pull Request for Ruby Projects

<https://www.deppbot.com>

- [Why?](https://github.com/jollygoodcode/jollygoodcode.github.io/issues/3)
- We believe frequent `bundle update` is a good practice
- PaaS, practice as a service
- Support private gem host on Bitbucket / GitHub
- [Automated Security Updates](https://github.com/jollygoodcode/jollygoodcode.github.io/issues/15)
- Adopt your Git-Flow (Pull Request against branch other than `master`)
- Configurable frequency of Update (from every day to 14 days!)
- [GitHub Compare view](https://github.com/blog/612-introducing-github-compare-view) included 
- Changelog links provided, [why changelog?](http://keepachangelog.com/)
- Testimonials [ruby-bench/ruby-bench-web#122](https://github.com/ruby-bench/ruby-bench-web/pull/122), [rubysg/rubysg-reboot#15](https://github.com/rubysg/rubysg-reboot/pull/15)
- Free for Open Source, always
ISUCON5に初参加してきた

ISUCON5参戦記

ISUCON5にバナナマンズとして初参加しました。

> ISUCONとは
お題となるWebサービスを決められたレギュレーションの中で限界まで高速化を図るチューニングバトル、それがISUCONです。過去の実績も所属している会社も全く関係ない、結果が全てのガチンコバトルです。
http://isucon.net/archives/44132090.html

## 参加の経緯

同僚に今年もISUCONありますよ出ませんか？と声をかけてもらったのに後押しされて、今までどうせ自分がでても恥をかくだけと二の足を踏んでいたISUCONに参加を決めました。結局声をかけてくれた同僚とは別のチームで参加。

## 結果

Rubyで挑んで最高スコア1864と残念な結果でした。
来年の自分のためにも試行錯誤の足あとを残しておきます。

## チーム

メンバーは同じく声掛けで出る気になった社内の２年目と３年目の若手とおっさん（私）というチーム構成。

普段は全員Webアプリケーションエンジニア（Ruby,PHP）でインフラの経験があるのが自分だけという状況だったので、自分がインフラ・ミドルウェア周りを担当することに。

## 事前準備

- 同僚のインフラエンジニアによるISUCONで使う技術講座
- 過去問解く（[vagant-isucon](https://github.com/matsuu/vagrant-isucon)++）
- GCPに触れておく
- 過去の参加者情報やISUCONの勝ち方などを読み漁る
- my.cnfやnginx.conf、プロファイリング類の使い方を秘伝のタレとして準備

インフラ・ミドルウェアの知識が乏しいため、誘ってくれた同僚（インフラエンジニア）に当日の役割分担のアドバイスやチューニングのための計測ツールの紹介（[kataribe](https://github.com/matsuu/kataribe)、[pt-query-digest](https://www.percona.com/doc/percona-toolkit/2.2/pt-query-digest.html)、[dstat](https://github.com/dagwieers/dstat)など）をしてもらいました。

当日はほぼこれらの力がなかったらなんにもできなかったというくらい頼りっぱなしでした。

参考記事
- [ISUCONの勝ち方](http://yapcasia.org/2015/talk/show/86ebd212-fab3-11e4-8f5a-8ab37d574c3a)
- [ISUCON 夏期講習 2015 を開催しました](http://line-hr.jp/archives/45235513.html)
- [ざっくりと #isucon 2013年予選問題の解き方教えます](http://isucon.net/archives/32976287.html)

## ざっくり当日の流れ

| 時間 | やったこと |
|--------|--------|
| ~11:30 | インスタンス起動、鍵の設置、Git管理、ベンチ起動 |
| ~13:00 | プロファイリング、ソース読み、レギュレーション確認、役割分担 |
| ~18:40 | アプリケーション改善→設定変更→ベンチ実行→プロファイリング |
| ~19:00 | 再起動テストして提出 |

## 当日やったこと

- 9時には全員集合している驚異的（？）な集まりの良さ
- RedBullを人数分用意し先輩としての威厳を示す
- GCPのインスタンス立ち上げとssh鍵の配置
- Bitbucketにソースを置いて管理とデプロイできるように
- プロファイリングおじさん（katribe, pt­query­digest）
- nginxのワーカープロセス数を1→4に
- unicornのワーカープロセスを1→4に
- nginxでTCPからUNIXドメインソケットに
- nginxで静的ファイルを配信
- MySQLの設定をいくつか変更

この内効果があったのはunicornのプロセス数を上げたくらいで他は誤差の範囲でしかスコアに貢献できませんでした。途中Rubyのプロセス再起動忘れたりと2人には申し訳ない。。。

## はまったところ

- 運営から公開されたGCPのイメージのURLがhttpsから始まるものでインスタンスの設定ができない!
   - パスを読み替えて解決（落ち着け）
- GCPで指定されたインスタンスタイプが選択できない!
   - フリートライアル中は選択できず。事前にもらったクーポン適用で解決
- systemd全然わからん
   - ググって起動・停止方法見つけて解決
- /etc/my.cnfに設定を追加しても反映されない!
   - /etc/mysql/mysql.conf.d/mysql.confが本体だった!に気づいて解決
- インデックスが貼り終わらない
   - 諦めた。（後から知ったが今回のレギュレーションだとGCPのストレージが遅いらしい）

## 教訓

- 普段からパフォーマンス改善のためのツールや設定に慣れておく
- プロファイリングの結果をチーム全員が読めるようにしておく

## 感想

初回ベンチが65だった時はどうなることかと思ったけど、どうにもならなかった。（初期スコア比では約30倍！）

後半はアプリケーション側の改修に参加する予定だったのに、ツールやミドルウェアの設定・MySQLのインデックスが20分たっても終わらないなどで手間取っていたらあっというまに時間が過ぎ去り、まったくアプリケーションに手を出せなかったのが悔やまれる。

インフラ・ミドルウェア担当として参加だったので、ISUCONの準備を通じてリソース監視やログ解析系のツールやミドルウェアの設定調べたり学べたことは収穫だった。

でも負け惜しみではなく楽しかった！やっぱり見る側よりも参加する側の方が何倍も楽しいし悔しい。
社外のエンジニアと同じルールでガチンコで競えるというのは貴重な場。自分との差を知る良い機会でした。
運営の方々には感謝しかない。

またでるぞ!
Ubuntu 14.04 で最新の ffmpeg を簡単かつクリーンにインストールする方法



ここからstatic buildをとってくる

http://johnvansickle.com/ffmpeg/

最近のffmpegはすごくてlibcその他のライブラリをすべてstatic linkして環境非依存にしたバイナリを配ってる。

したがって以下のようにwgetして解凍して/usr/local/binにでも置けばそれで動いてしまう。


```bash
$ wget http://johnvansickle.com/ffmpeg/releases/ffmpeg-release-64bit-static.tar.xz
$ tar xvf ffmpeg-release-64bit-static.tar.xz
$ sudo cp ./ffmpeg-release-64bit-static/ffmpeg /usr/local/bin
```

なお、標準のlibcと結合していない関係でDNS resolutionができないという問題があり、これはインターネット上の動画を直接指定してダウンロードしながら処理したい時に問題となる。

解決するためにはnscdをインストールして動かす。
nscdがあると自動でそちらを利用して名前解決してくれる。

```bash
$ sudo apt-get install nscd
```
ansible+vagrantで簡単環境構築してみた際のメモ


社内の開発環境を毎回手動で作っていたのでリソースがもったない気がしたのとお気軽導入できそうだったので試した際のメモです

> 結構前に作ったのでだいぶ忘れているので思い出すためのメモでもあります。。。

## 構成

```
.
├── README.md
├── Vagrantfile
├── hosts
├── provision_vagrant.yml
├── roles
│   ├── common
│   │   └── tasks
│   │       └── main.yml
│   ├── composer
│   │   └── tasks
│   │       └── main.yml
│   ├── git
│   │   └── tasks
│   │       └── main.yml
│   ├── mysql
│   │   ├── handlers
│   │   │   └── main.yml
│   │   └── tasks
│   │       └── main.yml
│   ├── nginx
│   │   ├── handlers # 再起動taskなどの定義
│   │   │   └── main.yml
│   │   ├── tasks # install taskなどの定義
│   │   │   └── main.yml
│   │   └── templates # サーバにupするテンプレを定義
│   │       └── nginx.conf.j2
│   ├── php
│   │   ├── handlers
│   │   │   └── main.yml
│   │   └── tasks
│   │       └── main.yml
│   └── redis
│       ├── handlers
│       │   └── main.yml
│       └── tasks
│           └── main.yml
└── vars
    └── package.yml
```

基本的にrolesにいろいろなタスクをyaml形式で記述し
packageなどをまとめて定義したい場合は基本的にvarsにpackage.ymlをグルーピングして定義するようにしています。
wgetやvim/opensslなどはcommonタスク内でwith_itemsとしてグルーピングして``` yum install```を実行するようにしています

## playbookファイル定義

+ 簡単なinstall taskを定義してみる

```
- name: git install # タスク名
  yum: name=git state=installed # ミドルウェア stateにlatestなどを指定すると最新versionがinstallされる
```

ここではstate=installedを指定していますが最新のansible公式ドキュメントには

```
present # installされていること
latest # 最新があればupdate
absent # 削除
```

となっているので presentを使う方がいいと思います。

+ nginxをinstallしてnginx.confをあげてみる

```main.yml
#nginxをyumでinstallするためにrpmを登録
- name: nginx rpm update
  yum: name=http://nginx.org/packages/centos/6/noarch/RPMS/nginx-release-centos-6-0.el6.ngx.noarch.rpm

- name: nginx install
  yum: name=nginx state=latest

# docrookのディレクトリ作成
- name: docroot mkdir
  file: dest=/var/www group=vagrant owner=vagrant recurse=yes

# confのバックアップ
- name: default nginx conf backup
  shell: mv /etc/nginx/conf.d/default.conf /etc/nginx/conf.d/default.conf.bak

# .j2テンプレートで定義したconfのupload
- name: nginx conf
  template: src=nginx.conf.j2 dest=/etc/nginx/conf.d/nginx.conf owner=nginx group=nginx

# service start
- name: start nginx
  service: name=nginx state=started enabled=yes
```

かなり直感的でわかりやすいです。

> とりあえずざっくり思い出せた気がする。

## 実行

すべてを実行する場合

+ vagrant up

ansibleのタスクのみを実行する場合

+ ansible-playbook -i hosts provision_vagrant.yml

特定タスクのみ実行する場合

+ ansible-playbook -i hosts --tags hogehoge provision_vagrant.yml

## 出来上がったもの

githubにあげていつでもどこでもplaybook

playbookでのshell実行やtimezoonの変更(replace)など他の細かい部分は下記に定義してあります。

[ansiblePlayBook](https://github.com/yuua/ansiblePhpPlaybook)

+ 今回はphp用の環境を構築したがrubyなど他の言語で開発を行う際にもtaskを定義して使用しています。

+ ansiblePlayBookを作成する際に vagrantのplugin saharaに非常にお世話になりました。
Transaction最高でした。
Ubuntu14.10でメモリの使用状況を確認する

# freeコマンド
メモリの使用状況を表示する
\# デフォルトはキロバイト単位で表示

```
$ free
             total       used       free     shared    buffers     cached
Mem:       3977300    2679364    1297936     307544     140440    1275704
-/+ buffers/cache:    1263220    2714080
Swap:      4121596          0    4121596
```

`-m` でメガバイト単位で表示

```
$ free -m
             total       used       free     shared    buffers     cached
Mem:          3884       2848       1035        331        142       1283
-/+ buffers/cache:       1422       2462
Swap:         4024          0       4024
```

各項目について

|領域|項目|説明|
|:--|--:|:--:|
|Mem|total|実メモリの全容量|
||used|実メモリの使用容量|
||free|実メモリの空き容量|
||shared|共有メモリ容量|
||bufferes|バッファメモリ容量|
||cached|ページキャッシュメモリ容量|
|-/+ buffers/cache|used|実メモリの使用容量（used）からバッファメモリ（bufferes）とページキャッシュメモリ（cached）を引いたもの|
||free|実メモリの空き容量（free）にバッファメモリ（bufferes）とページキャッシュメモリ（cached）を足したもの|
|Swap|total|スワップ領域の全容量|
||used|スワップ領域の使用容量|
||free|スワップ領域の空き容量|

# vmstatコマンド
時間間隔（秒）を指定することで、メモリの使用状況をリアルタイムで表示する

10秒ごとにメモリの使用状況を表示する（メガバイト単位）

```
$ vmstat -SM 10
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 0  0      0    937    145   1295    0    0   145   104  347  987 25  3 70  3  0
 3  0      0    917    145   1316    0    0     0    80  621 1665  7  3 87  2  0
 0  0      0    919    145   1313    0    0     0    68  431  732  3  1 94  2  0
 0  0      0    943    145   1289    0    0     0    65  316  586  2  1 95  2  0

```
リンクエラーを生じさせる方法(Eclipse)

不慣れなWindows上Eclipse上でのリンクエラーに関してメモを残す。

事例1：Eclipseでのディレクトリの設定で,""で囲むと逆効果の設定がある。
LNK1104: cannot open file 'C:\Program.obj'
"C:\Program Files\boost_1_58_0\stage\lib"

リンク対象が
C:\Program
になってしまって生じる。
""で囲む、囲まないを変えてみて試してみる。

事例2：_MSC_VERの値　
Eclipseによる開発ではC++のコンパイラを選べる。C++のコンパイラとしてVisual Studio を使用している。Visual Studioでコンパイルしているのだから、前に「リンクエラーを生じさせる方法」で述べたように、Visual Studioのバージョンをそろえてコンパイル・リンクする必要がある。
　次のリンカのエラーは、そのことに注意して対策をしていく。

: error LNK2038: mismatch detected for '_MSC_VER': value '1700' doesn't match value '1800'

　Visual StudioのCコンパイラを用いている場合には、Visual Studioのバージョンを常に意識する必要がある。例を挙げれば、
boost_1_58_0\stage\libの下にあるlibファイルはファイル名の一部にlibファイルを生成したコンパイラを示すvc120の記述がある。
libboost_filesystem-vc120-mt-1_58.lib

また、OpenCVの配布の中にあるprecompileのライブラリにも、VCのバージョンごとに異なったファイル構成がある。
C:\opencv_2.4.11\build\x86\vc11\lib
C:\opencv_2.4.11\build\x86\vc12\lib

「リンクエラーを生じさせる方法（Visual Studio)」
に述べた内容に加えて、Eclipseの環境設定ファイルをエディタで開いてチェックする。
.settings フォルダの中にあるprefsファイルをチェックする。
例　org.eclipse.cdt.core.prefs
INCLUDE
LIB
PATH
などの設定値が書かれているので、
意図しない版のVisual Studioとそれを利用したlibファイルを使っていないか確認していく。
　Windowsのシステムの環境変数には、表示が読み取りにくいこともあって、十分にメンテナンスされておらず、古い設定が残っていたりする。
　
stackoverflowなどのサイトの情報を見ながら、チェックしていくこととしよう。


付記：
・言語仕様にしたがって書かれたC++のプログラムは、OSが共通であれば、使用するコンパイラやリンカに依存しないのが、期待したいところだが、実際にはそうなっていない。このことは、VisualStudioのバージョンがあがったときには、また、互換性が失われることを意味する。

・コンパイラやDebugやReleaseのモードによっては、きちんとビルドできて実行できているのに、他の条件ではビルドに成功しないことがある。
　本当になぞであって、何とかしてほしいと思う。
Redhat7にソースからvimをインストール

Amazonのredhat7にvimを入れてrubyの開発を行いたいと思い、vimをソースからインストールしたが、大変だったのでメモ
# hgコマンドのインストール
意外と探すと大変だった
```
easy_install mercurial
```
# lua_develをインストール
下記サイトからlua-devel-5.1.4-14.el7.x86_64.rpmをインストール
http://rpmfind.net/linux/rpm2html/search.php?query=lua-devel
```
sudo rpm -i ftp://rpmfind.net/linux/centos/7.1.1503/os/x86_64/Packages/lua-devel-5.1.4-14.el7.x86_64.rpm
```
# vimをインストール
```
sudo yum install ncurses-devel -y
hg clone https://vim.googlecode.com/hg vim
cd vim
hg pull
hg update
make distclean
./configure --prefix=/usr/local --with-features=huge --enable-multibyte --enable-rubyinterp --enable-luainterp --enable-cscope --enable-fail-if-missing
make
sudo make install
```

# 参考にさせていただいた記事
> Rubyプログラミングが快適になるVim環境を0から構築する
> http://qiita.com/mogulla3/items/42a7f6c73fa4a90b1df3
Raspberry Pi 2（略してパイ２）のGUI環境をWindows10から使う


# 概要

Xming X Server for Windows を利用して、Windows10 から Raspberry Pi のGUI環境を使えるようにします。
Raspberry Pi のHDMI出力を使わず、Windows10からGUI操作することができます。

# Raspberry Pi の設定

Raspberry Pi 側の設定として、最低限下記の設定を行う必要があります。

```bash
 $ sudo vi /etc/lightdm/lightdm.conf
	[SeatDefaults]
	#xserver-allow-tcp=false
	xserver-allow-tcp=true

	[XDMCPServer]
	#enabled=false
	enabled=true
```

# Xming のインストール

Windows10にて、https://osdn.jp/projects/sfnet_xming/ から Xming-6-9-0-31-setup.exe をダウンロードしてインストールします。

# Xming の設定

スタートメニューから XLaunch を起動します。

![pi012.PNG](https://qiita-image-store.s3.amazonaws.com/0/94538/59aff65f-0556-5090-c9e4-e90b85e24cc1.png)

「One Window」を選択して次へ進みます。

![pi013.PNG](https://qiita-image-store.s3.amazonaws.com/0/94538/44f63b59-44fa-f4a0-b7ed-f9fdc683d5f3.png)

「Start a program」を選択して次へ進みます。

![pi014.PNG](https://qiita-image-store.s3.amazonaws.com/0/94538/26540a22-dcc8-bf71-7aec-7be745743152.png)

Start program に「startlxde」を入力し、「Using PuTTY(plink.exe)」を選択します。
Connect to computer に Raspberry PiのIPアドレスなどを入力します。
Login as user にログインユーザ名を入力します。
次へ進みます。

![pi015.PNG](https://qiita-image-store.s3.amazonaws.com/0/94538/2be447e4-a4ff-f361-a2f5-9929475caed6.png)

デフォルトのまま次へ進みます。

![pi016.PNG](https://qiita-image-store.s3.amazonaws.com/0/94538/60292e1c-cdba-78ae-60af-c095f224cbb6.png)

Save configuration を押して、設定ファイルを保存しておきます。

完了を押すと、Xming が起動します。
2回目以降は、先ほど保存した設定ファイルから起動することができます。

# Raspberry Pi のGUIを使う

![pi017.PNG](https://qiita-image-store.s3.amazonaws.com/0/94538/2e368ae8-211b-0f2d-b17c-ec8b3ac89b65.png)

ログインユーザのパスワードを入力し、OKを押します。

![pi018.PNG](https://qiita-image-store.s3.amazonaws.com/0/94538/2fc0a0b7-6bcc-8a55-c3b7-1aaf013a2f5d.png)

無事 Raspberry Pi のGUIが表示されたら完了です。
VBAHaskellの紹介 その24（yield式の導入～lambdaExprの廃止）

(2016/11/16 追記)
プレースホルダの扱いを大きく変更しました。yield式はなくなってはいませんが、明示的に書く必要はほとんどなくなり、より直感的にプログラムできるようになりました。
* * *
VBAHaskellに実装していた `lambdaExpr`という関数を廃止し、代わりにyield式 ( `yield_0`、`yield_1` および `yield_2` )を導入した。その旨を [VBAHaskellの紹介 その16（ラムダ式？の生成）](http://qiita.com/mmYYmmdd/items/95efb65f408fe2405e84)に追記している。
`lambdaExpr`はいったん作ったものの、使うのも説明するのも難しく、実際使えなかった。実体が「遅延バインド」というややこしいもので、そのうえ表現したいHaskellの式との対応関係も見えづらいものだったからだ。

#当初の問題意識
1. 関数の入れ子が関数合成でしかない  
配列 m に対して `mapF(p_plus(1), m)` を計算すると、m の各要素に操作 `1+` がマップされる。この場合は `mapF` に `p_plus` を引数として渡していると言える。`mapF` は渡された `plus` を実行時に「関数として」使うように実装されている。  
これに対して `p_plus(p_plus(p_plus( ... ))` のような式は単に足し算を合成しているので、実行時には関数に関数を渡すのではない。外側の関数は内側の関数が計算した「結果の値」を使うだけだ。
2. 関数の実行を遅延させたい  
式 `p_Func1(p_Func2(1, ph_1), ph_2)` に引数 a, b を渡すと、`Func1(Func2(1, a), b)` という計算が実行される。しかしそうでなく、何らかの式を評価した結果が `Func1(p_Func2(a, ph_1), b))` のような **関数に関数を渡した形** になってほしいことがある。内側の関数が実行されずに関数のまま残っているイメージだ。（`ph_0`、`ph_1`、`ph_2` はVBAHaskellで用意したプレースホルダ式）


#評価時にプレースホルダになる式
実行したときに内側の関数が関数のまま残り、プレースホルダもそのまま残っていてほしいが、VBAHaskellの関数合成はスコープがフラットで、すべてのプレースホルダに実引数を渡して一斉に評価することしかできない。
そこで**「評価するとプレースホルダに変化する式」**として以下の3種類の **yield式** を導入することにした。
　　　　・ `yield_0` → `ph_0`
　　　　・ `yield_1` → `ph_1`
　　　　・ `yield_2` → `ph_2`
そして**「ひとつ以上の引数がyield式になっている関数式は、評価後も関数式のまま残す」**というルールとし、API側でそうなるよう実装した。こうすれば、式 `p_Func1(p_Func2(ph_1, yield_1), ph_2)` に引数 a, b を渡すと、`Func1(p_Func2(a, ph_1), b))` という形になる。

#Haskellの式との対応
Haskellのこういう式を考える。
　`\a b -> [a] : map (a:) b`

(a: ) のところにプレースホルダを置いて、疑似的に
　`\a b -> [a] : map (a: _placeholder_ ) b`
という式だと考え、関数や式を以下のように対応させる。

```
        : 演算子        →  cons 関数
        a              →   ph_1（ラムダ式の仮引数はプレースホルダ）
        b              →  ph_2（ラムダ式の仮引数はプレースホルダ）
        _placeholder_  →  yield_1
        [ a ]          →  makeSole 関数
```
これによってVBAHaskellとしては次の式となる。
　`p_cons(p_makeSole, p_mapF(p_cons(ph_1, yield_1), ph_2))`
長いしカッコ悪いが、いちおう対応はしている。

C++だとこんなラムダ式になるだろう。（効率とかは無視している）

```cpp
[]<typename T>(T const& a, std::vector<std::vector<T>> const& b){
    auto tmp = b;
    for ( auto& i : tmp )    i.insert(i.begin(), a);
    tmp.insert(tmp.begin(), std::vector<T>{1, a});
    return tmp;
};
```

これを含むサンプルは [テストモジュール](https://github.com/mYmd/VBA/blob/master/test_module.bas) の Sub segmentsTest2 にある。

* * *
ところで上のC++14のラムダ式はgccだといけるけど、clangだとダメ。規格的にはどうなんでしょう。
http://melpon.org/wandbox/permlink/04WzozqwuAerr0Ps
それと、
[ ]\<typename T, template \<typename> class V>(T const& a, V\<V\<T>> const& b)
って書き方できないんですかね？


* * *
過去記事
[VBAHaskellの紹介 その16（ラムダ式？の生成）](http://qiita.com/mmYYmmdd/items/95efb65f408fe2405e84)
[VBAHaskellの紹介 その23（ジャグ配列をフラットな配列に展開する再帰）](http://qiita.com/mmYYmmdd/items/3ec5ca36af49367fadab)
[VBAHaskellの紹介　その1　（最初はmapF）](http://qiita.com/mmYYmmdd/items/c731edf943acc0a0ebe9)
LoadAverageを定期的に外部へ記録する方法

#はじめに
サーバーを管理していると重く感じることがあり、その時SSHでLAを確認したりしています。
しかし、いちいち入るのが面倒なので、鯖落ちも考えて外部に記録するようにしてみました。
なるべくシンプルで導入の手間がかからないようにするために、新たに何かしらの監視ツールを導入をすることはしません。

#用意するもの
* shellscript
* cronの実行権限
* phpを実行できる外部サーバー

## shellscript
簡単に言うと、LAとunixtimeをGETで渡すだけである。

```bash:la_log.sh
#/bin/sh
## LAを/proc/loadavgから直接取る。なお５分間隔で記録するため５分毎のLA値を得る
LA5=`cat /proc/loadavg | awk '{print $2}'`
## LAを記録したUnixTimeを得る
UT=`date +%s`
## 記録する外部サーバーを記述する
LOG={yourExternalServer}/._la.php
## 外部サーバーにGETで値を渡す
wget -O - "${LOG}?la=${LA5}&ut=${UT}" 1>/dev/null 2>&1
exit
```

## cron
今回は５分毎のLA値を取得しているため、記録も５分毎に実行する
`*/5  *  *  *  *    {yourSavedPath}/la_log.sh`

## 外部サーバー
これはPHPを実行して保存するために用意する。
同じネットワークでもいいし、レン鯖でもいい。

```php:._la.php
<?php
  // タイムゾーンを東京に設定。
  date_default_timezone_set('Asia/Tokyo');
  // UnixTimeが送られて来たらそれを使う。ないならこっちの時間を使う。
  $_UT = ($_GET[ut]) ? $_GET[ut] : time();
  if (!$_GET[la]) exit(1); // そもそもLAがないなら終了
  // LOGのファイル名とフォーマットを決める。なおUnixTime依存
  $LOGFILE = './_LA/'.date("ymd",$_UT).'.log'; // あらかじめ./_LA/を作成しておく
  $LOGFORMAT = date("H:i:s",$_UT).'<>'.$_GET[la]; // HH:MM:SS<>LAのような書式である
  if ($LOGFILE, $LOGFORMAT."\n", FILE_APPEND) ) // ログは追記モードで追加する
    echo $LOGFORMAT; // ログの書き込みが成功すれば書き込みを返す
  else
    echo -1; // 失敗すれば-1を返す。
?>
```

#運用方法
これらを正しく設置すれば、外部に５分毎のLAが記録される。
間隔が短いのであれば/proc/loadavから15分ごとの値を取って記録してもいい。
また戻り値をローカルに保存しておいてもいい。
外部では記録された値を加工して見やすくしたり、統計を取ったりできる。
鯖落ちしていたりすると記録されないので、直前の記録からどのように落ちたか簡易的に想像できたりするかな。
Ruby2.X.XのCentOS6へのインストール方法(2015/10月現在)


Rubyのバージョンを管理しやすいように`rbebv`を使用して最新Rubyをインストールしようと思い覚え書き。

##rbenvのインストール
```
$ mkdir /var/rbenv
$ git clone git://github.com/sstephenson/rbenv.git
$ chmod -R 777 /var/rbenv
$ cd /var/rbenv/plugins
$ git clone git://github.com/sstephenson/ruby-build.git
```

##環境変数設定
```
$ vi /etc/profile.d/rbenv.sh
export RBENV_ROOT="/var/rbenv"
export PATH="${RBENV_ROOT}/bin:${PATH}"
eval "$(rbenv init -)"
```

##必要なライブラリのインストール
```
$ yum install -y readline-devel
```


##Rubyのインストール
```
$ rbenv install 2.X.X
Installing ruby-2.X.X...
```

##Rubyバージョンの選択
```
$ rbenv global 2.X.X
```

##Rubyバージョンの確認
```
$ ruby --version
ruby 2.X.X (2015-08-18 revision 51636) [x86_64-linux]
```

成功した。
Windows10でVPN接続の順番を変える方法

VPN接続が増えていくと、順番がランダムだと不便。Windows10では追加した順番に表示されてしまうが、後から並べかえたいこともしばしば。

以下ファイルにプレーンテキストで記述されているため、順番をテキストエディタで変更すればOK。

C:\Users\<UserName>\AppData\Roaming\Microsoft\Network\Connections\Pbk\rasphone.pbk

Ref.
http://answers.microsoft.com/en-us/windows/forum/windows_10-other_settings/windows-10-vpn-first-list-connect-and-sort/850f5600-7c73-48f9-a853-6f9793f02bc1
StartSSLでクライアント証明書をなくしたら


# 概要
SSL証明書を無料で発行してくれるStartSSLというサービスがあります。
再発行は有料だったりしますが、ただ暗号化通信できればいいだけの用途であれば非常にありがたい存在です。

証明書を発行するにはStartSSLのサイトにログインする必要がありますが、ログインIDとパスワードによる認証ではなく、クライアント証明書をブラウザにインストールして利用します。
クライアント証明書をバックアップしないままOSを再インストールしてしまったりするとログインできなくなります。

そう、私がそうでした(￣0￣)

再度ログインできるようになるまでに行った手順を残しておきたいと思います。

# 新たにSign-upする

初回登録のときと同様に、StartSSLのサイトからSign-upします。
その際に注意すべき点は

+ メールアドレスは未登録のメールアドレスを使用すること
+ 名前・住所などその他の情報は、初回登録のときと同じにすること

新しくSign-upしたアカウントと、初回登録したアカウントと紐付けるて復旧させるため、極力同じ情報を入力しておく必要があると思われます。

# StartSSLに連絡する

StartSSLサイト内のContact StartCom から、クライアント証明書をなくしたこと、新しいアカウントを作成したことなどを伝え、アカウントを紐付けてもらうよう依頼します。
もちろん英語で書く必要があります。

# StartSSLから連絡がくる

私の場合はメールで連絡したのですが、数分で返信が届きました。
すぐにアカウントを紐付けてくれたようです。

# 新たにSign-upしたクライアント証明書でログインする

新たにSign-upしたクライアント証明書でログインすると、初回登録したドメイン情報が操作できるようになっています。

# クライアント証明書をバックアップする

はい。
ちゃんとバックアップしましょう。
[Rails 4.2][Android] Android emulatorから Rails サーバーにアクセスするには

# 前提

自戒の意味を込めてのメモです。

Android初心者です。
Rails初心者です。

Volleyを使ってlocalhost:3000にアクセスしようとしました。

# 問題1

java.net.ConnectExceptionが出てアクセス出来ません。

# 対応1
localhostはAndroidEmulatorが使っているので、外部にアクセスするには↓を使います。

```zsh
http://10.0.2.2
```

# 問題2

でもまだアクセスできません。
理由は、Rails 4.2からサーバーの IP アドレスがlocalhostになり、外部からアクセスできなくなったようです。

http://doruby.kbmj.com/hyoshida/20150205/Rails_4.2__

![Screen Shot 2015-10-02 at 22.26.12.png](https://qiita-image-store.s3.amazonaws.com/0/18705/7adcd75f-49c2-ff85-e226-9b15387e2a28.png)


...いつの間に。完全に見落としていました。。。。


# 対応2

rails s の際にipアドレスを指定します。

```rb
$ rails s -b 0.0.0.0
```

![Screen Shot 2015-10-02 at 22.26.38.png](https://qiita-image-store.s3.amazonaws.com/0/18705/1d074d8d-4f2b-1c67-41ed-3a6ea150fe5b.png)


Rack自体に変更があった様です。
こちらもチェックしなくてはいけないですね。
https://github.com/rack/rack/commit/28b014484a8ac0bbb388e7eaeeef159598ec64fc
OpenShift Origin v3を自前環境にセットアップするメモ

OpenShiftそのものをDockerで動かす構成でセットアップしようとしていろいろハマったので作業ログを残しておく

# 1. 環境を用意する
## 1-1. 仮想マシン立ち上げ
Vagrantで適当な実験環境を作る。Vagrantfileは[こちら](https://gist.github.com/east301/c74b2f9d6f152fb6e98b#file-vagrantfile)。

仮想マシンを立ち上げ、SSHで中に入る。ここから先はすべて仮想環境で実行。

    $ ls
    Vagrantfile docker-compose.yml

    $ vagrant up
    $ vagrant ssh

ここでの仮想マシンのIPアドレスは`192.168.99.101`


## 1-2. Dockerをインストール
yumで普通にインストールする。ついでにdocker-composeも入れておく。

Dockerを立ち上げる前に`/etc/sysconfig/docker`をいじってinsecure registryを許可するようにする。
OpenShiftの内部では自前でdocker registryを持っていて、そこからビルドされたアプリが出し入れされる模様。
今回は簡単に`--insecure-regisry 0.0.0.0/0`をつけて起動するように変更。

これらの操作はVagrantfileの中で実行済み。
ちなみに今回利用したdockerコンテナ内のOpenShiftバイナリのバージョンは1.0.6


# 2. OpenShiftコンテナを立ち上げる
## 2-1. コンテナの立ち上げ
[こんな感じのdocker-compose.yml](https://gist.github.com/east301/c74b2f9d6f152fb6e98b#file-docker-compose-yml)を使って立ち上げる。

    $ cd /vagrant
    $ ls
    Vagrantfile docker-compose.yml

    $ sudo docker-compose up -d


## 2-2. OpenShiftのWeb UIを開いてみる
（仮想環境の）ホスト側から`http://openshift.192.168.99.101.xip.io:8443`を開き、ログインできればOK。
ちなみに管理者のIDと初期パスワードは`admin:admin`になっているはず。


# 3. OpenShift用のDocker registryを立ち上げる

ここから先は簡単のためOpenShiftコンテナの中で作業する。
   
    $ sudo docker ps  # コンテナのIDなどを確認
    $ sudo docker exec -it vagrant_origin_1 /bin/bash

Docker Registryを立ち上げる。
立ち上げておかないとアプリのビルドで失敗する。

    # oadm registry --create --credentials=openshift.local.config/master/openshift-registry.kubeconfig --config=openshift.local.config/master/admin.kubeconfig

# 4. OpenShiftの内外をつなぐためのルータを立ち上げる

    # echo '{"kind":"ServiceAccount","apiVersion":"v1","metadata":{"name":"router"}}' | oc create -f -
    # oc edit scc privileged
    (users: の中に`- system:serviceaccount:default:router`を追加)
    # oadm router router --credentials=openshift.local.config/master/openshift-router.kubeconfig --service-account=router
    
# 5. 適当なアプリをデプロイしてみる

https://github.com/openshift/nodejs-ex をデプロイしてみる。

    # oc login --username=admin --password=admin
    # oc new-project my-project
    # oc new-app openshift/nodejs-010-centos7~https://github.com/openshift/nodejs-ex.git

Web UI（または`oc status`）で「ビルドしてます」的な画面が見える。終わるまで少し待つ。
ビルド終了後、Web UIなどに出ているアドレス(`172.17.0.7:8080`とか)へアクセスして応答が帰ってくることを確認する。

# 6. 外から見えるようにする

（仮想環境の）ホスト側から直接アプリが見えるようにする。

    # oc expose service nodejs-ex --hostname=nodejs-ex.openshift.192.168.99.101.xip.io

ホスト側から`nodejs-ex.openshift.192.168.99.101.xip.io`でアクセスできるようになっていればOK。
おつかれさまでした。


# 参考
* https://docs.openshift.org/latest/getting_started/administrators.html
* https://github.com/openshift/origin/blob/master/examples/sample-app/README.md
* https://docs.openshift.com/enterprise/3.0/install_config/install/deploy_router.html
[解決] Amazon ES(Elasticsearch Service)を使ってみたら、POSTとquery-stringが共存できなくて困った件


表題通りなんですが。ちょっとハマりました。

## elasticsearch-api 本体側が修正されました

Karelさんが[教えてくれた!](https://twitter.com/karmiq/status/652090669352243200)  Thank you karel!

- [[API] Fixed, that `type` is not added both to path and URL parameters…](https://github.com/elastic/elasticsearch-ruby/commit/af96db7b996533aa91b4226df5c2be75eba07e83) 

type パラメータを bulk api の呼び出し側で削除するような対応が行われたようです。これで不格好な workaround を抹消できて、俺ハッピー。

## transport_options で Content-Type 指定することで回避できました

@xend 様にコメントで教えていただきました。Clientのコンストラクタで transport_options を指定することで対応できるようです。うーむ。jsonで送信するのであれば application/x-www-form-urlencoded でなぜ送る…。(2015/10/7追記)

## 以下ハマったのと workaround の経緯

```
$ curl mysearch.ap-southeast-1.es.amazonaws.com/_search/? -X POST -d '{}'

HTTP/1.1 403 Forbidden
Content-Type: application/json
Server: Jetty(8.1.12.v20130726)
x-amzn-RequestId: **********************
Content-Length: 135
Connection: keep-alive

{"message":"When Content-Type:application/x-www-form-urlencoded, URL cannot include query-string parameters (after '?'): '/_search/?'"}
```

ContentType が x-www-form-urlencoded だった場合、query-string が含まれたURLだと403でエラーになります (>_<!!

マジで?

これが問題になったのは、elasticsearch-railsを使ってバルクインサートしてる箇所であり。

調べて見ると、elasticsearch-api の bulk アクション([これ](https://github.com/elastic/elasticsearch-ruby/blob/master/elasticsearch-api/lib/elasticsearch/api/actions/bulk.rb#L67))が type パラメータを query-string として渡しているのが原因であろうと思われた。というかそれが上の制約と衝突してるのは間違いない。

ということで取り急ぎ type だけを特別扱いするように残念すぎるモンキーパッチを用意。

```
[ec2-user:~/my_rails_app]$ cat config/initializers/elasticsearch_patch.rb

# type を valid_params から除外する
module Elasticsearch
  module API
    module Actions
      def bulk(arguments={})
        valid_params = [
          :consistency,
          :refresh,
          :replication,
#         :type,
          :timeout ]

        method = HTTP_POST
        path   = Utils.__pathify Utils.__escape(arguments[:index]), Utils.__escape(arguments[:type]), '_bulk'

        params = Utils.__validate_and_extract_params arguments, valid_params
        body   = arguments[:body]

        if body.is_a? Array
          payload = Utils.__bulkify(body)
        else
          payload = body
        end
        perform_request(method, path, params, payload).body
      end
    end
  end
end
```


最初 elasticsearch-rails のバージョンが 1.7系だからじゃないかとか、Amazon ESのElasticsearchが1.5.2だからなんじゃねーかとかいろいろ疑ったのだが、空振りでした。

http://docs.aws.amazon.com/elasticsearch-service/latest/developerguide/aes-limits.html こことか参照すると、**Parameters in HTTP POST requests** が、**The service ignores parameters passed in URLs for HTTP POST requests signed with Signature Version 4.**とか書かれているので突破する方法はあるのかもしれない。が、手作業で署名したアクセスを作ってみても `Response body: {"message":"Credential should be scoped to correct service: 'es'. "}` とか言われてしまうので手詰まり感がある。Admin権限持ってるのにー。

かくして、上のようなパッチを置くことになってしまった。本当に反省している。しかし elasticsearch-api の方の不適切な挙動って感じでもないので、難しいところです。このやりかただと refresh とか consistency とか timeout とか指定できないし。うーん。
WordPress でパスワードの ”変更だけ” を行う方法

ユーザー管理画面から簡単にできるのかと思ってたけど、意外にも面倒だったのでメモ。
いくつかの方法があります。

### 1. WordPress の機能を使って変更する

- 未ログイン状態でログイン画面に行く
- 下の方にある「パスワードをお忘れですか?」のリンクをクリック
- 登録してあるメールアドレスを入力して先に進む
- 送られてくるメールに掲載されてるリンク先からパスワードを再設定

### 2. プラグインを使って変更する

できません。
いくつか試したけど、パスワードの ”変更だけ” を行うプラグインは無い模様。

以下のプラグインが近いんだけど、やりたいのはパスワードの変更だけなのに、色々と余計な機能がくっついてきてウザい。

- [WordPress › WP Password Policy Manager « WordPress Plugins](https://ja.wordpress.org/plugins/wp-password-policy-manager/screenshots/)

### 3. WP-CLI を使って変更する

WP-CLI が使えるのであれば、これが一番簡単。
コマンド一発で変更できます。

```bash
$ wp user update username --user_pass=newpassword
```

- [wp user update | WP-CLI](http://wp-cli.org/commands/user/update/)

### まとめ

わざわざメール送らずにユーザー管理画面からパスワードの変更ができれば良いのに。。
あと相変わらず WP-CLI は便利すなぁ。
Rails: ActiveRecordのenum要素をselectフォームでいい感じに表示する

みなさんは、ActiveRecordのenum好きですか？

```ruby:models/article.rb
class Article < ActiveRecord::Base
  enum status: { deleted: 0, drafted: 1, published: 2 }
# (略)
```

`Article.published` とか、 `@article.published?` とか気の利くメソッドをにょきにょき生やしてくれるので私は好きです

## formでselectしたい

enumの要素をformタグのselectとか使って出力して編集画面作りたいことってありますよね。人間ですもの。
普通にやるとselectメソッドの2つめの引数に配列を渡してやればいいのでこんな感じ？

```jade:_form.html.slim
= f.select :status, Article.statuses.keys.to_a, {}, class: 'form-control'
```
keysを省略するとエラーになります


## 日本語で表示したい

![Screen Shot 2015-10-02 at 8.26.21 PM.png](https://qiita-image-store.s3.amazonaws.com/0/60032/5b8371b7-5eae-55d1-3660-c9ded9e5f971.png)

なんかそれっぽくselectで表示できましたが、日本語で表示したいです。
要は2つめの引数に

```
{deleted: '削除済み', drafted: '下書き', published: '公開中'}
```

というような配列を渡してあげればいいので、モデルのクラスメソッドにこんなものを作ってみます

```ruby:models/article.rb
class Article < ActiveRecord::Base
    class << self
    def localed_statuses
      statuses.keys.map do |s|
        [ApplicationController.helpers.t("status.article.#{s}"), s]
      end
    end
  end
end
```

で、よしなな翻訳ファイルを用意してあげます

```yaml:ja/status.yml
ja:
  status:
    article:
      deleted: '削除済み'
      drafted: '下書き'
      published: '公開中'
```

ビューも書き換えます

```
= f.select :status, Article.localed_statuses, {}, class: 'form-control'
```

##補足

```
[ApplicationController.helpers.t("status.#{name.downcase}.#{s}"), s]
```

enumのstatusを使う率が高いので、
こう書き換えてクラス継承してもいいかなと思ったけどやり過ぎ感があるような気もしました

もっといい方法あれば教えて下さい
それでは！

## 2015.12.05 追記

上記の例ではモデルに設定していますが、viewで使いたい都合のメソッドかつ、モデルに紐付けて管理したい情報なので、 `Decorator` に実装するのが良いかもしれませんね
Node JS チュートリアル（１）


https://www.youtube.com/watch?v=Imj8PgG3bZU&list=PL6gx4Cwl9DGBMdkKFn3HasZnnAqVjzHn_&index=2

このサイトを参考にしました。

##node をインストール

僕の環境はMacなので、とりあえず、node jsのサイトからダウンロードしてインストールする

https://nodejs.org/en/

まあ、言われた通りにインストールする。特別引っかかるところはなかった。

##nodeを実行

ターミナルで、

```
node
```
と打てば、プロンプトが始まる

何か出力させてみよう
```
> console.log('tuna')
tuna
undefined
```

Control-Cの２回連続でコンソールモードから抜けられる

このYouTubeのチュートリアルではSublime textを使っているが、今流行りでオープンソースのATOMを使うことにする。
インストールは割愛する

app.jsというファイルをどこかのフォルダに作って、以下のコードを記述する。

```
console.log("tuna")
```

保存して、同じディレクトリで実行してやれば、ちゃんと出力する

```
$ node app.js
tuna
```

では、続きをやります
Spring Boot 1.3.0のlogback extensionsについて

#概要

まだSpring-Boot 1.3.0のGAはリリースされていませんが (2015/10/02時点ではM5)、1.3.0よりlogbackの拡張機能が使用できるようになります。
またlogbackに関する変更点がいくつかあります。

**環境**

下記の環境で動作確認を行いました。

* Windows7 (64bit)
* Spring Boot 1.3.0.M5

**参考**

* [Spring Boot 1.3 Release Notes] (https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-1.3-Release-Notes)
* [boot-features-logback-extensions] (http://docs.spring.io/spring-boot/docs/1.3.0.M5/reference/htmlsingle/#boot-features-logback-extensions)


## 変更点

### logback-spring.xml

1.3.0.M2よりlogback設定ファイルの名前は、logback-spring.xmlが推奨されます。

> When possible we recommend that you use the -spring variants for your logging configuration (for example logback-spring.xml rather than logback.xml). If you use standard configuration locations, Spring cannot completely control log initialization.

### Initialization failures

1.3.0.M2よりlogback設定ファイルに不備がありlogbackの初期化に失敗した場合は、アプリケーションの起動に失敗するようになります。

> Spring Boot 1.3 fails due to the missing file.

**例**

```
>java -jar -Dspring.profiles.active=dev　sblb-example-1.0-SNAPSHOT.jar
java.lang.reflect.InvocationTargetException
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:497)
        at org.springframework.boot.loader.MainMethodRunner.run(MainMethodRunner.java:53)
        at java.lang.Thread.run(Thread.java:745)
Caused by: java.lang.IllegalStateException: Logback configuration error detected:
```

## Logback extensions

1.3.0.M2より下記のlogbackの拡張機能が使用できるようになります。

### springProfile

`<springProfile>`タグを使用してプロファイル毎に設定を有効にすることができます。
name属性にプロファイル名を記述します。カンマ区切りで複数のプロファイルを指定することができます。

**例**

```xml:logback-spring.xml
  <springProfile name="dev">
    <include resource="logback-dev-logger.xml"/>
  </springProfile>

  <springProfile name="production">
    <include resource="logback-prod-logger.xml"/>
  </springProfile>
```

### springProperty

`<springProperty>`タグを使用してapplication設定ファイルの値を参照することができます。

**例**

```yml:application.yml
myapp:
  log:
    path: d:/logs
    name: sblg-example.log
```

```xml:logback-spring.xml
  <springProperty scope="context" name="logpath" source="myapp.log.path"/>
  <springProperty scope="context" name="logname" source="myapp.log.name"/>

  <appender name="FILE" class="ch.qos.logback.core.FileAppender">
     <file>${logpath}/${logname}</file>
  </appender>
```

## deprecated Log4j 1.x

logbackとは関係ありませんが、1.3.0.M5よりLog4j 1.xの使用が非推奨になりました。

> Log4JLoggingSystem is now deprecated following Apache’s EOL declaration for log4j 1.x.