OmniAICreator/Qiita-1.07M huggingface dataset:
Swiftで関数定義いろいろ

練習みたいなもんです。
これを使ってどうこうみたいな話ではありませんのであしからず。


# classで

```lang:swift
import Cocoa

class SomeOps {
   	func add(a:Int,b:Int) -> Int { return a+b }
   	func sub(a:Int,b:Int) -> Int { return a-b }
   	func mul(a:Int,b:Int) -> Int { return a*b }
   	func sur(a:Int,b:Int) -> Int { return a%b }
}

let ops = SomeOps()
ops.add(1,b:2)
ops.sub(1,b:2)
ops.mul(1,b:2)
ops.sur(1,b:2)
```

普通な感じ。

# enumで

```lang:swift
import Cocoa

enum SomeOps {
    case add,sub,mul,sur
    func proc(a:Int,b:Int)->Int {
        switch self {
            case .add: return a+b
	        case .sub: return a-b
	        case .mul: return a*b
	        case .sur: return a%b
   	    }
   	}
}

SomeOps.add.proc(1,b:2)
SomeOps.sub.proc(1,b:2)
SomeOps.mul.proc(1,b:2)
SomeOps.sur.proc(1,b:2)
```

期待した形にはならなかった・・・。
僕が何か遠回りをしてるのかも。

# funcを返すfuncで

```lang:swift
import Cocoa

func makeSomeOps() -> Dictionary<String,(Int,Int) -> Int> {
    return [
        "add":{ (a:Int,b:Int) -> Int in return a+b },
        "sub":{ (a:Int,b:Int) -> Int in return a-b },
        "mul":{ (a:Int,b:Int) -> Int in return a*b },
        "sur":{ (a:Int,b:Int) -> Int in return a%b },
    ]
}

let ops = makeSomeOps()
ops["add"]!(1,2)
ops["sub"]!(1,2)
ops["mul"]!(1,2)
ops["sur"]!(1,2)
```

綺麗な気はするけど別に使いたくはならない。
`b:`って書かなくて良いところはいいかも。
「レッスンは何曜日？」をFactorで(横へな21)

「[レッスンは何曜日？](http://d.hatena.ne.jp/torazuka/20140509/yhpg)」をFactorでやってみました。他の皆様による実装は [第21回オフラインリアルタイムどう書くの問題](http://qiita.com/torazuka/items/cbdb6b581a57e4754dd4) から辿れます。

次のような方針で解きました。

1. 各クラスについて最優先で希望している社員を配属する
1. 各クラスを先頭4人だけに絞る
1. 配属され先頭4人に入った人をリストから削除する
1. 未配属の人の希望クラスの1番目を消し、2番目を1番目に移動する
1. 全員の希望クラスがなくなるまで、1の手順に戻って繰り返す

```factor:21lesson.factor
USING: kernel sequences sequences.deep math math.order math.parser
       arrays splitting assocs sorting ;
IN: 21lesson

! 希望リストから配属候補を求める
: wish-list>candidate ( wish-list -- candidate )
    { 1 2 3 4 5 } swap [
        [ second first over = ] filter
        [ first ] map swap drop
    ] curry map ;

! 先頭4つだけにする
: only4 ( seq -- seq ) dup length 4 min head ;

! 配属リストに候補を追加する
: append-candidate-to-assigned ( assigned candidate -- assigned' )
    [ append only4 ] 2map ;

! 配属された社員を希望リストから削除する
: delete-assigned-from-wish-list ( assigned wish-list -- wish-list' )
    swap flatten [ swap first swap index not ] curry filter ;

! 希望リストの順位を繰り上げる
: shift-wish-list ( wish-list -- wish-list' )
    [ dup first swap second rest { } 2sequence ] map ;

! 最も高い希望を配属する
: assign-first-wish ( assigned wish-list -- assigned' wish-list' )
    [ wish-list>candidate append-candidate-to-assigned ] keep
    dupd delete-assigned-from-wish-list
    shift-wish-list ;

! 配属する
: assign-wish ( wish-list -- assigned )
    { { 0 { 0 0 0 0 0 } } } append
    5 { } <array> swap
    5 [ assign-first-wish ] times
    drop ;

! 入力文字列を希望リストに変換する
: >wish-list ( str -- wish-list )
    "|" split [ "_" split [ first string>number ]
        [ second [ digit> ] { } map-as ] bi { } 2sequence ] map ;

! 配属リストを文字列に変換する
: assigned>string ( assigned -- str )
    { 1 2 3 4 5 } swap zip
    [ second length 0 = not ] filter
    [
        dup first number>string "_" append
        swap second natural-sort
        [ number>string ] map ":" join append
    ] map "|" join ;

! 解く
: solve ( str -- str ) >wish-list assign-wish assigned>string ;
```

[Factor](http://factorcode.org/)を始めました。自分で書いたコードなのに数日経ったら読めません (^^;)

Factorは連鎖性プログラミング言語です。多くのプログラミング言語が `func(arg1, arg2)` や `(func arg1 arg2)` という語順なのに対して、Forthを始めとする連鎖性言語は `arg1 arg2 func` という語順で書きます。通常は変数を使わず、引数をスタックに積んで関数(ワード)を呼び出すと、結果がスタックに積まれて返ってきます。JVM(Java仮想マシン)のニーモニックを直接書いている雰囲気ですが、クォーテーション(無名関数)を使ったmapやfilterなど、関数型言語に似ている部分があります。
Swift で Dictionary の中身を for 文で回したい時


``` swift:sample

let dict = ["hoge":"fuga", "piyo":"foo"]

for (key,value) in dict{
    NSLog("Key: %@", key)
    NSLog("Value: %@", value)
}

```


``` 出力
Key: hoge
Value: fuga
Key: piyo
Value: foo

```

Objective-C の頃はこんな感じだったので、楽になった。
http://qiita.com/happy_ryo/items/a48e222837b7f0eedec1
データ分析用のプログラミング言語環境を用意する

以前に[データ分析用の計算機環境を用意する](http://qiita.com/ynakayama/items/d5eb82718d10a496c2ab)話をしましたが、計算機だけあってもプログラミング言語環境が無ければ話になりません。

今日は Python とその関連ライブラリのインストールを説明します。

## Python のビルド

最新版である [3.4.1 が 5/18 にリリースされました](https://www.python.org/download/releases/3.4.1/)。

### 自前でビルドをする理由

Python のセットアップ方法としては [virtualenv](https://github.com/pypa/virtualenv) のような言語用仮想環境や、 [apt](https://wiki.debian.org/Apt) や [brew](http://brew.sh/) のようなパッケージ管理システムを使う方も多いでしょう。

筆者はよく使うプログラミング言語については自前でビルドすることを推奨しています。その理由は主に次の通りです。

1. まだリリースされていない最新のソースコードを利用してビルドすることができる
2. 言語にバグや変更したい動作があったとき、自前で修正してビルドすることができる
3. 言語の開発に参加しやすくなる
4. 特定のパッケージ管理システムや仮想環境ミドルウェアにロックインされることなく、多くのプラットフォームで共通の手順を踏むことができる

### ビルドインストール先

またビルドしてインストールする先を標準化しておくことで、アンインストールやバージョンの切り替えがわかりやすくなります。

筆者はほとんどのプロダクトについて次のようにディレクトリを指定しています。

```
/opt/[プロダクト名]/[バージョン]
```

また /opt/[プロダクト名]/ の下に current というシンボリックリンクを生成しこれを使用したいバージョンにリンクさせます。

例えば次のようにします。

```bash
$ ls -la /opt/python/
drwxr-xr-x 3.3
drwxr-xr-x 3.4
drwxr-xr-x trunk
lrwxrwxrwx current -> 3.4

$ ls -la /opt/ruby/
drwxr-xr-x 1.9.3
drwxr-xr-x 2.0
drwxr-xr-x 2.1
lrwxrwxrwx current -> 2.1
```

こうしておけば、古いバージョンと共存してバージョンを切り替えるのも容易ですし、アンインストールするときも rm -rf で簡単に削除できます。

### インストールスクリプト

また、ビルドは手作業ではなくシェルスクリプトを利用します。

たとえば Python のインストールはこちらのスクリプトを利用します。
https://github.com/ynakayama/tagokura-python/blob/master/installer/install_python.sh

起動時はコメントにあるように、第 1 引数にバージョンを、第 2 引数にインストール先を指定します。

```
~/install_python.sh 3.4.1 /opt/python/3.4
```

シェルスクリプトを起動するだけでビルドをできるようにしておけば、異なるホストにインストールするときも、あるいはより新しいバージョンをビルドする際にも、わざわざ手作業を繰り返す必要がありません。

また最近では [chef](http://www.getchef.com/chef/) などに代表される自動化フレームワークが流行していますが、シェルスクリプトであれば昔から伝統的なものですので、そう簡単に陳腐化するような心配がありません。古くからある最小の環境などでも使えますし、何か問題があったときに中身を見て挙動を確認するのも容易です。

## pip パッケージをインストールする

本体と同じく pip パッケージもシェルスクリプトでまとめてインストールするのがおすすめです。

こちらのスクリプトを参考に必要なパッケージをまとめて入れてしまうのが良いでしょう。
https://github.com/ynakayama/tagokura-python/blob/master/installer/install_pip.sh

AWS を利用するのであれば [AWS コマンドラインインターフェース](http://aws.amazon.com/jp/cli/)も入れると良いでしょう。

## まとめ

計算機環境で利用するプログラミング言語のインストール作業は定型化、自動化しておくと何かと便利です。分散環境で利用する場合はバージョン間の差異が無いよう同じ手順でバージョンを指定してインストールしましょう。
Swift予約語リスト

backtick（\`）で挟めば使用できるとのこと。
つまり
>class

はダメだけど
>\`class\`

は使える。

* 宣言：`class`, `deinit`, `enum`, `extension`, `func`, `import`, `init`, `let`, `protocol`, `static`, `struct`, `subscript`, `typealias`, `var`
* 文: `break`, `case`, `continue`, `default`, `do`, `else`, `fallthrough`, `if`, `in`, `for`, `return`, `switch`, `where`, `while`
* 式・タイプ: `as`, `dynamicType`, `is`, `new`, `super`, `self`, `Self`, `Type`, `__COLUMN__`, `__FILE__`, `__FUNCTION__`, `__LINE__`
* 特別なコンテキストでの予約語: `associativity`, `didSet`, `get`, `infix`, `inout`, `left`, `mutating`, `none`, `nonmutating`, `operator`, `override`, `postfix`, `precedence`, `prefix`, `right`, `set`, `unowned`, `unowned`(`safe`), `unowned`(`unsafe`), `weak`, `willSet`

参考資料
* [Keywords | The Swift Programming Language: Lexical Structure](https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/Swift_Programming_Language/LexicalStructure.html#//apple_ref/doc/uid/TP40014097-CH30-XID_822)
Swiftをコマンドラインから実行

swift、ステキな言語ですね。
Objective-Cはキモ可愛い言語でしたが、キモさの部分がとれて、ただただ可愛い言語になったと思います。

まるで、大学デビューをして大人びてしまった幼なじみを見ているみたいで、
嬉しいような、なんだか少しもの寂しいような気持ちでいっぱいです。

さて、せっかくのswift、インストールしたのにxcode上でしか実行できないの、もったいないと思いませんか？
そんなあなたに朗報です。swift、コマンドラインからも実行できるようです。

Xcode6-Betaをインストールした状態で、以下のコマンドを実行しましょう。

``` bash
$ find /Applications/Xcode6-Beta.app -name swift | grep /bin/swift
```

もしも標準出力に`ほにゃらら/bin/swift`というファイルが書き出されたら、それがswiftです。
このファイルを実行してみると、インタプリタが立ち上がって、コマンドラインからswiftを実行できるようになります。

`~/.bash_profile`等に以下を追記して、いつでも呼び出せるようにしておきましょう。

```~/.bash_profile
export PATH=(swiftがある"bin/"ディレクトリへのフルパス):$PATH
```

これで、`swift`とタイプするだけでswiftのインタプリタを呼び出せるようにできます。
ちなみに、`-i`オプションで、外部スクリプトも実行できます。

``` bash
$ swift -i main.swift
```

![スクリーンショット 2014-06-03 19.01.35.png](https://qiita-image-store.s3.amazonaws.com/0/33933/597d24af-f872-c458-a1c9-b682948a7bcd.png)

これは便利！！
これでみなさんも幸せなswiftライフを。

# 追記

外部スクリプトを実行する際に、`import Foundation`しているとこのままでは実行できず、以下のようなエラーが出てしまいます。

```
main.swift:1:8: error: cannot load underlying module for 'Foundation'
import Foundation
       ^
<unknown>:0: note: did you forget to set an SDK using -sdk or SDKROOT?
<unknown>:0: note: use "-sdk $(xcrun --show-sdk-path --sdk macosx)" to select the default OS X SDK installed with Xcode
```

エラーに従って、いかのように実行するれば無事に通ります。

```
$ swift -sdk $(xcrun --show-sdk-path --sdk macosx) -i main.swift 
```
Mac OS X で簡単(?)に SSH Tunnel を構築する方法

普段、ウェブサーバーにファイルをアップする時は FTP や SFTP を使います。

しかし、セキュリティ管理にシビアなサーバーにアクセスするときには、最終のウェブサーバーの外部SSHポートが閉じられ、外部ネットワークのローカルネットワークからしかアクセス出来ない、特定の IP アドレスからしかアクセス出来ないなどの制限があります。

そんな時、SSH Tunnel という VPN を構築し、セキュリティを一段階強固な形にしてサーバーにアクセスすることができます。

Windows では WinSCP というソフトで SSH Tunnel を使った SFTP アクセスなどが簡単にできるのですが、自分は Mac OS X で Coda 2 というコーディングソフトを使っています。

Mac で、WinSCP と同じ、一発で SSH Tunnel を介して SFTP サーバーなどにアクセスできるソフトはありませんでしたので、今回は、SSH Tunnel を別のアプリで構築して  localhost に Port Forward (ポート転送) して、Coda 2 にアクセスした方法を書きます。

元記事
http://ja.katzueno.com/2012/08/2988/

これまでに Fugu, SSHTunnel, SSH Tunnel Manager というソフトを試しましたが、これらは RSA 鍵認証ができませんでした。

[Meekat](http://codesorcery.net/meerkat) というシェアウエアも見つけましたが、有料ソフトなのでパス。しかし、高機能なので本格的に仕事で使い出したら購入するかも。

（追記：Meekat 開発終了ということで無料になっていました。こちらもおすすめツールですが、今後の Mac OS X バージョン対応が見込めないです。）

数日間に及ぶリサーチの結果「[Coccinellida](http://coccinellida.sourceforge.net/)」というソフトに落ち着きました！

このソフト、オープンソースソフトで今日の時点では開発版。ちょっと、フリーズしやすかったり、インターフェースが貧弱で、最初、起動しているのかわかりませんでした。

起動すると、名前の通り、てんとう虫アイコンが上部メニューに申し訳なさそうに追加されるだけで、ドックスには何も表示されません。

それ以外は Meekat と変わらないくらい高機能なので、普通の人はこれで十分だと思います。

#用意しなければいけないアクセス情報

**サーバー A：最終的にアクセスしたい SFTP サーバー**

    アドレス

    ユーザー名

    パスワードもしくは鍵 (rsa_id) ファイル

    ポート番号 (例： 22 等)

**サーバー B：SSH トンネル用の踏み台サーバー**

    アドレス

    ユーザー名

    パスワードもしくは鍵 (rsa_id) ファイル

    ポート番号 (例： 22 等)

**自分の Mac**

    アドレスは: localhost

    転送先ポート番号。今回は「2022番」にしますが自由に決められます

#Coccinellida で SSH Tunnel 情報を設定

- Coccinellida をインストールして起動
- 画面右上、時計のあるメニューバーより、てんとう虫のアイコンをクリックし、メニューから”Preference”
- “Tunnels”TABをクリック
- “Add” をクリック
- “General” タブでは、以下の情報を入力
    - Name: 自分の好きな名前 (管理用)
    - Host: IP-B (SSH Tunnel サーバー用のIPなどのアドレス)
    - User: IP-B SSH Tunnel サーバーのログイン ID
    - Password もしくは “id_rsa” 鍵ファイルを「identity」より選択
- “Port Forwarding” タブでの設定方法
    - “Add” をクリック
    - Type は “Local” を指定
    - “Local Port” に ”2022″ を入力  (ここのポート番号は自分の好きな番号に変えられます)
    - “Local Host” は “localhost” のままをキープ
    - “Remote Host” には、最終的にアクセスしたい IP-A のアドレスを入力
    - “Remote Port” には “22″ と入力 (22番意外であれば、その番号に適宜変える)
    - Save を押して保存
- 終了

メニューから、追加したトンネルをクリックして、接続されるか確認しましょう

Local Port の番号は 2022 が普通ですが、しかし、他のアプリなどとバッティングする場合などもありますので、適宜ポート番号を変えてください。

# アプリケーション (Coda 2, Dreamweaver など) 設定方法

この SSHトンネル転送では、サーバーの情報が localhost として扱われるので、Coda 2 などの SFTP ソフトでもそのように設定します。

普段の SFTP の設定と違うことは・・・

- サーバーアドレスが “localhost” になる
- ポート番号は自分が設定した “2022″ 番になる
- ユーザー名、パスワード（もしくは鍵認証の鍵）情報は同じ

という感じで、Coda や Dreamweaver のサイト情報に入力します。

これで SSH Tunnel を使って、快適に安全なファイル転送が可能になりました〜ﾜｧ──ヽ(〃v〃)ﾉ──ｲ!!
GitLabのユーザ権限


**role** によって出来ることが結構細かく設定されているのでちゃんと考えて設定したほうがいい。
全員Masterとかは激しく危険。。

## Guest
- Create new issue
- Leave comments
- Write on project wall

リポジトリを clone することもできない。ソースコードをレビューのみの人向け。
基本的に commit から diff が確認できますので、この権限でもレビューは可能。

## Reporter

Reporter の役割は Guest ができることに加えて以下な権限が付与される。

- Pull project code
- Download project
- Create new merge request
- Create a code snippets

ソースコードが取得できます。また merge request (github の pull request に相当) ができる。
snippets はプロジェクトで共有可能。

## Developer

Reporter と同様に Reporter ができることに加え以下な権限が付与。

- Create new branches
- Push to non-protected branches
- Remove non-protected branches
- Add tags
- Write a wiki

リモートブランチを作ることができる。
また、protect されていない branch への push とか branch の削除も可能。
tag 付けや、 wiki への情報投入も可能。

## Master

Developer ができることに加え以下な権限が付与。

- Add new team members
- Push to protected branches
- Remove protected branches
- Push with force option
- Edit project
- Add Deploy Keys to project
- Configure Project Hooks

チームメンバの追加ができる。また、protected な branch の操作も可能になる。
全般的な管理やらその他諸々の権限が付与されている。
push with force option とか付いてる。

## Owner

- Transfer project to another namespace
- Remove project
Google Chrome 新タブで表示される、「良く訪れるサイト」のサムネイル画面表示機能を停止する方法

Google Chrome では、新しいタブを開いた時、今までよく訪れているサイトのサムネイル画面が表示されるようになりました。

![01.ChromeHome.jpg](https://qiita-image-store.s3.amazonaws.com/0/44367/8bae4320-b1dd-e6bf-c4c1-9deacd8a01ea.jpeg)


ただし、この機能めちゃくちゃ面倒くさい！

ノートパソコンで、お客さんと打ち合わせを行っている時や、説明マニュアルや、Ustream の生放送、セミナーなどで画面を見せてデモを行う際に自分がどのようなサイトを良く訪れているかが一目瞭然。

テストサイトや違うお客さんの開発中画面を見せちゃうと大変です。

*元記事*
http://ja.katzueno.com/2013/10/3033/

# Chrome Web Store で下記の拡張Appsをインストール

Google Chrome が最新アップデートで、この記事で紹介していた 「Instant Extended API」の無効化オプションを削除しました。Google の[公式フォーラムの Google 社員の投稿](https://productforums.google.com/forum/#!topic/chrome/THPuNSLtljg%5B1-25-true%5D)によると、下記のエクステンションを使って対処してほしいとのことです。

- [Replace New Tab Page](http://ykso.us/1e56CW1)：新しいタブが指定したURLのページが表示できるようになる Chrome App
- [Awesome New Tab Page 2](http://ykso.us/1ccg6uq)：タブのデザインをカスタマイズできるようになる Chrome App
- [Modern New Tab Page](http://ykso.us/1e56nKw)：Windows 8 みたいなインターフェースに変えられる Chrome App

現在、筆者は、最初の「Replace New Tab Page」を使っています。設定方法は下記の通り。

#「Replace New Tab Pages」設定方法

1. Replace New Tab Page を Chrome にインストール。
2. インストール後、アドレスバーに`chrome://extensions/`と入力し、インストールされた拡張 Extension の設定ページに移動。
3. Replace New Tab Pages を探して「Option (設定)」をクリック。
4. URL を入力する画面が出てくるので、開きたいURLを入力して保存。

筆者の場合は URL に「chrome://apps/」と入力し、Chrome の Apps ボタンを表示させました。

これで、紛らわしい Google の画面が出てくることはなくなりました。めでたしめでたし。
GitLab Tips


GitLab運用する上での小ネタ

### 起動/停止
- gitユーザでプロセスは動かさないといけない。（rootではダメ）

### バックアップ
- rake taskが用意されている。

	- http://qiita.com/mats/items/af822b497660517f4e17

### ユーザ権限
- http://qiita.com/mats/items/f11e2e25731c325eeda8
Excel でよく使うようになったショートカット一覧

仕事で Excel をよく使う人に、作業の円滑化で覚えておくべきショートカットキーの一覧を残しておきます。ショートカットキーを使いこなして、作業効率をあげましょう。

自分が最近良く使っているショートカットキーは下記のとおりです。

元記事
http://ja.katzueno.com/2014/01/3047/

|キー |効果|
|------------|-------------|
|Ctrl＋K |ハイパーリンクの挿入|
|Ctrl＋W	|ウィンドウを閉じる|
|Ctrl＋PageUp	|前のシートに移動|
|Ctrl＋PageDown	|後のシートに移動|
|Alt＋PageUp	|一画面右へに移動（スクロール）|
|Alt＋PageDown	|一画面右へに移動（スクロール）|
|Ctrl＋D	|上の行をコピー＆ペースト（Down）。（Shiftを押しながらだと一気に可能）|
|Ctrl＋R	|左の列をコピー＆ペースト（Right）。（Shiftを押しながらだと一気に可能）|
|Ctrl＋ドラッグ＆ドロップ	|ワークシートの複製|
|Alt＋Enter	|エクセルでセル内で改行|
|Shift＋スペース	|エクセルで行を選択（半角英数モードの時のみ）／範囲指定を行っているとEnterでその中へ移動（横へ移動）できる|
|Ctrl＋スペース	|エクセルで列を選択|
|Ctrl＋1	|セルの書式設定ダイアログを開く（テンキーの1は不可）|
|Ctrl＋9	|指定した行を隠す|
|Ctrl＋Shift＋9	|隠された行を表示|
|Ctrl＋0	|指定した列を隠す|
|Ctrl＋Shift＋0	|隠された列を表示|
|Alt＋Shift＋=	|SUM関数の呼び出し|
|F4	|セルを参照した状態で押すと、セルの絶対参照の切り替え|
|Shift＋F11 | 新しいワークシートの挿入|

下記のキーは、まず alt キーを押して、各キーを順番に押していくことによって、出来る機能です。

|キー |効果|
|------------|-------------|
|Alt＋OHR	|シート名の変更|
|Alt＋OCW	|列幅の変更|
|Alt＋ORE	|行の高さの変更|
|Alt＋OCA   |列幅の自動調整|
|Alt＋ORA   |行幅の自動調整|
|Alt＋IW   |新しいワークシートの挿入|
|Alt＋DL	|ワークシートの削除|
|Alt＋DS	|並べ替え|
|Alt＋DFF	|オートフィルタ|
|Alt＋EIS	|連続データ（加算）|
|Alt＋EISF	|連続データ（オートフィル）|

特に Alt + OCW と Alt+ ORE は、印刷用に、複数シートの横幅サイズを数値で指定して整えるのに最適です。

参考：http://ja.katzueno.com/2014/01/3047/

アドバイス: @y-d-k 様
文字列"12時34分"を"12:34"へ一行で変換

`rescue`節があるから複数行だ、というご指摘もあるでしょうが、そこはご容赦を。
#イディオム
マッチしない場合には空文字列を返すことにします。

```ruby
begin
  '%d:%d' % time_str.match(/(\d\d)時(\d\d)分/).captures
rescue
  ""
end
```
<del>ムリに一行にすることも出来ますが、読みづらいので使わないほうが良いでしょう。</del>

```ruby
begin '%d:%d' % time_str.match(/(\d\d)時(\d\d)分/).captures rescue "" end
```
>（コメント反映追記１）後置`rescue`文なら読みやすさに問題なし

>```ruby
'%d:%d' % time_str.match(/(\d\d)時(\d\d)分/).captures rescue ""
```

>（コメント反映追記２）時分を`Array#join`で繋げてしまう

>```ruby
time_str.match(/(\d{2})時(\d{2})分/).captures.join(":")
```
>（コメント反映追記３）対象文字列の必要部分が数字2文字×2なので、数字2文字を`String#scan`で取得して配列化、それを`Array#join`で繋げる

>```ruby
time_str.scan(/\d{2}/).join(':')
```

#解説
##部分マッチ抜き出し
`String#match`は`MatchData`オブジェクトを返します。
`MatchData`はマッチ全体`$&`及び部分マッチ（`$1`, `$2`, …）を含みます。このため単純に`MatchData#to_a`を使うと

```ruby
"12時34分".match(/(\d\d)時(\d\d)分/).to_a
=> ["12時34分", "12", "34"]
```
のようにマッチ全体も含んでいます。
ここで使いたいのは部分マッチ情報だけなので`MatchData#captures`を使います。

```ruby
"12時34分".match(/(\d\d)時(\d\d)分/).captures
=> ["12", "34"]
```
ただし、部分マッチがなかった場合に`MatchData#captures`は`nil`を返すので、その対策として`rescue`しています。
##フォーマット
`MatchData#captures`で得られた配列を`String#%`でフォーマットします。

```ruby
'%d:%d' % "12時34分".match(/(\d\d)時(\d\d)分/).captures
=> "12:34"
```

私は`String#%`の書き方に慣れていますが、違和感を感じる場合には`Kernel.#format`や`Kernel.#sprintf`なども使えます。ただし、`Kernel.#format`や`Kernel.#sprintf`の第2引数は配列を受けられないのでsplat（`*`）で開く必要があります。

```ruby
format('%d:%d', *("12時34分".match(/(\d\d)時(\d\d)分/).captures))
=> "12:34"
```
#参考リンク（るりま）
* [instance method String#match](http://rurema.clear-code.com/1.9.3/method/String/i/match.html)
* [instance method MatchData#captures](http://rurema.clear-code.com/1.9.3/method/MatchData/i/captures.html)
* [instance method String#%](http://rurema.clear-code.com/1.9.3/method/String/i/=25.html)
* [module function Kernel.#format](http://rurema.clear-code.com/1.9.3/method/Kernel/m/sprintf.html)
CentOS6.5にHHVMを入れる時のTips

CentOS6.5にHHVM入れようとしたら見事にyumさんが言うことを聞かなくなったので、解決メモ



#何が起こったか？

色んなインストールガイド的記事で書かれてるように


    $ yum install http://ftp.riken.jp/Linux/fedora/epel/6/x86_64/epel-release-6-8.noarch.rpm
    $ yum upgrade
    $ cd /etc/yum.repos.d/
    $ wget http://www.hop5.in/yum/el6/hop5.repo
    $ yum install hhvm


ってやったところ以下のエラーが出た。

    Error: Package: gnote-0.6.3-3.el6.x86_64 
                    (@anaconda-CentOS-201311272149.x86_64/6.5)
               Requires: libboost_filesystem-mt.so.5()(64bit)
               Removing: boost-filesystem-1.41.0-18.el6.x86_64 
                         (@anaconda-CentOS-201311272149.x86_64/6.5)
                         libboost_filesystem-mt.so.5()(64bit)
               Updated By: boost-filesystem-1.54.0-7.el6.x86_64 (hop5)
               Not found
    Error: Package: gnote-0.6.3-3.el6.x86_64 
                    (@anaconda-CentOS-201311272149.x86_64/6.5)
               Requires: libboost_system-mt.so.5()(64bit)
               Removing: boost-system-1.41.0-18.el6.x86_64 
                         (@anaconda-CentOS-201311272149.x86_64/6.5)
                         libboost_system-mt.so.5()(64bit)
               Updated By: boost-system-1.54.0-7.el6.x86_64 (hop5)
               Not found
     You could try using --skip-broken to work around the problem
     You could try running: rpm -Va --nofiles --nodigest

**（#^ω^）ﾋﾞｷﾋﾞｷ**


#どう対応したか？

結局のところgnoteが邪魔してるっぽいので削除しよーってことで以下のコマンド

#yum remove gnote

その後hhvmコマンドを実行すると以下の様なエラーが

    hhvm: error while loading shared libraries: liblcms2.so.2: cannot open shared object file: No such file or directory

ライブラリがないって言ってますね。
ってなわけでliblcms2.so.2の64bitライブラリを追加する作業を行います。

    wget http://pkgrepo.linuxtech.net/el6/release/x86_64/liblcms2-2.4-1.el6.x86_64.rpm
    yum install liblcms2-2.4-1.el6.x86_64.rpm

これでなんとかhhvmが使えるようになりました。
.svn 等同一名フォルダーを簡単に一斉削除する方法 (Mac や Linux)

元記事
http://ja.katzueno.com/2014/05/3082/

SVN から GIT に移行する作業をしているのですが、その際に面倒くさいのが、.svn ディレクトリを一掃する作業。

ターミナルなどのコマンドラインを使って行う方法です。

`find . -type d -name .svn -print0 | xargs -0 rm -rf`
や
`find . -type d -name .svn -delete`
など。
上部は、rm プロセスを動かすやり方で、下部は find で削除する方法です。（アドバイスありがとうございます！）

このコードは、コマンドラインの現在ある親ディレクトリから下の階層すべてのディレクトリを検索し「.svn」という名前のディレクトリを見つけ、その中にあるファイルを全て削除するというコマンドです。

これで、簡単に .svn ディレクトリを削除できますが、念の為に、バックアップととかとってから行ってくださいね。

上記のコマンドの「.svn」という部分を変更することにより、他のフォルダ名でも有効に活用できます。


以前、下記のコマンドを紹介していましたが、コメントにてご指摘いただき、修正しました。
`find . -type d -name .svn -exec rm -rf {} \;`
Laravelのmigrate:reset時に謎エラーが出た時の対処

app/database/migratinosの中身を色々といじくってたらmigrate:reset時に以下の様なエラーが出ました。

      [Illuminate\Database\QueryException]                                                                                       
      SQLSTATE[42S02]: Base table or view not found: 1051 Unknown table 'hoge' (SQL: drop table `hoge`)

お馴染みのcomposer dump-autoloadなどなどやってみたり、migrationファイルを消してやり直しても以下の様なエラーが出たりで全く解決せず・・・

    {"error":    {"type":"Symfony\\Component\\Debug\\Exception\\FatalErrorException","message":"Class 'CreateHoge' not found","file":"\/vendor\/laravel\/framework\/src\/Illuminate\/Database\/Migrations\/Migrator.php","line":297}}


なんじゃこりゃー！となったけども意外な方法で解決


+ データベースのmigrationsテーブルの中身を削除する
+ migrate:refreshを実行


まさかmigrationsテーブルがこんなエラーを引き起こすなんて・・・
めちゃ簡単に Mac のオーディオ入出力を切り替える方法

Mac OS X で、めちゃくちゃ素早く、あっさりと簡単に音声出力や入力を切り替えられる方法です。Mac OS X El Capitan まで確認済み。

元記事
http://ja.katzueno.com/2014/05/3083/

よく、HDMI対応のテレビに Mac をつなげてプレゼンする人、USBスピーカーとヘッドホンを簡単に切り替えたい人、Skype などの音声通話でマイクやスピーカーを切り替えたい人、そして Ustream などのネット中継やスクリーンキャストで音声出力を Soundflower などの仮想出力デバイスに切り替えることを頻繁に行っている人に朗報です。

アプリのインストール必要なし！

##1. システム環境設定のサウンドで、メニューバーにボリュームアイコンを表示

![20140513.1.AudioControl.jpg](https://qiita-image-store.s3.amazonaws.com/0/44367/537e59f2-fe78-61ed-a12e-77faadc9d80d.jpeg)

システム環境設定、サウンドの一番下のオプションにチェックを入れて、メニューバーにスピーカーアイコンを表示されます。下記のようなアイコンが現れます。

![20140513.2.Menubar.jpg](https://qiita-image-store.s3.amazonaws.com/0/44367/a8250d4a-442e-83ae-e0c0-9d2470ee91b9.jpeg)

##2. メニューバーのスピーカーアイコンを、Option (Alt) キーを押しながらクリック

すると・・・。なんと、メニューが音量調節ではなく、入出力デバイスの選択モードになるのでした！

![20140513.3.Menubar.jpg](https://qiita-image-store.s3.amazonaws.com/0/44367/e2d06489-73ad-af6e-b826-7aa9f87cb316.jpeg)

ソフトのインストールも必要ありません。あっけなく、音声アウトプット・インプットデバイスを素早く切り替えることができます。
Laravelのcheckbox小技

bladeのFormの中で同じnameのcheckboxを使っていて、複数チェックした後にsubmitされたデータを見てみると１つしかデータが入ってない！
って時にやったメモ。


#NGパターン

**test.blade.php**

    {{Form::checkbox('test', 1, true)}}
    {{Form::checkbox('test', 2, true)}}


**TestController.php**

    Log::debug(Input::all());
    // ↑２つチェックしたのに中身がtest: "2"になってる！


#OKパターン

**test.blade.php**

    {{Form::checkbox('test[]', 1, true)}}
    {{Form::checkbox('test[]', 2, true)}}


**TestController.php**

    Log::debug(Input::all());
    // ↑中身がtest: [1, 2]になってる！


というわけでcheckboxを使う際の小技でした。
LaravelでDB処理を書くときに気を付けたいこと

DBの処理を書くときに気を付けたいのがトランザクション処理ですが、Laravelを触る時は皆さんどう書いてますかね？

今の現場で以下のように書いている人がいたので、これがベストプラクティスなのか気になって調べてみた。

    try
    {
        // InsertとかupdateとかのDB処理
    } catch(exception e) 
    {
        // エラー内容の表示
    }


Laravelの場合、これはベストプラクティスではなくDB::transactionを使う方が良さ気です。

**参考URL：**
http://forumsarchive.laravel.io/viewtopic.php?id=1464
http://localdisk.hatenablog.com/entry/2013/12/29/Laravel_%E3%81%A7%E3%83%88%E3%83%A9%E3%83%B3%E3%82%B6%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3


DB::transactionを使うとエラーになった場合自動でロールバックまで行ってくれるので便利ですねー！

なので、LaravelでDB処理を書く際は以下のように書くのが良いみたいです。


    $table = Table::find(1);
    DB::transaction(function() use($table) {
        // InsertとかupdateとかのDB処理
        $table->save();
    });


こっちの方がかなりスッキリ記述できますね！

一つ注意点として
**DB処理以外をDB::transactionの中に書かないこと**！
SourceTree で GitHub の Fork レポジトリを追加＆同期する方法

大きなプロジェクトに参加していると、親・子・孫・親戚レポジトリなど、複雑な環境で、ソースコードの共有を行います。

SourceTree フォーク元や、そのさらなる上の階層フォークや別のフォークとの同期をさせたい場合の設定方法です。（Git 自身に関する初心者向けの解説は「サルにも分かる Git入門」などをまずお読みになるのが最適です。）

(2015年5月20日現在の情報です。）

###元記事
http://ja.katzueno.com/2014/05/3092/

##レポジトリとの相関関係

今回の例として

【concrete5 CMS 大元マスター】−【concrete5 日本語版マスター】-【自分のレポジトリ】

という3つのレポジトリがあると仮定してます。

##1. GitHub にて、親レポジトリ等の「Clone URL」のURLをコピー（覚える）

![20140520_SourceTree_GitHub5.jpg](https://qiita-image-store.s3.amazonaws.com/0/44367/45bc6cfb-8c3c-ab69-9b4e-714ee92decb6.jpeg)

まず、自分のレポジトリを普通に Clone します。そして、大元マスターや日本語版マスターの Clone URLをコピーします。


##2. SourceTree の設定

自分のレポジトリを設定したレポジトリを Source Tree で開いて、底のウインドウから「設定 (Settings)」ボタンを押します。

![20140520_SourceTree_GitHub2.jpg](https://qiita-image-store.s3.amazonaws.com/0/44367/1ac499f3-1ebd-227a-9d81-abe3d62b9181.jpeg)


##3. 追加

そして、「リモート(Remotes)」タブから「追加 (Add)」を押します。

![20140520_SourceTree_GitHub3.jpg](https://qiita-image-store.s3.amazonaws.com/0/44367/ba2641e3-0e96-b0c8-c078-5ddc16bc7ece.jpeg)


##4. 名前や Clone URL

「リモート名 (Remote name)」は、自分の好きな名前をつけて構いません。

「URL / path」は、さきほどコピーしたURLを貼り付けます。そして、OKを押します。この動作を、追っていきたいレポジトリの数分繰り返し行います。

![20140520_SourceTree_GitHub4.jpg](https://qiita-image-store.s3.amazonaws.com/0/44367/c8b4e558-3e71-5b72-8ac8-23d20a0e3937.jpeg)

これで、親レポジトリなどフォーク元のレポジトリも追えるようになります。

##親レポジトリの変更を自分のレポジトリに加える手順

GitHub for Mac でいう Sync を SourceTree で行う方法です。別レポジトリの変更を自分のローカルに取り込んで（Pullして）、自分のレポジトリにプッシュ (Push) するという方法を取ります。

まず、「Pull」ボタンを押し、変更を取り込みたい元となるレポジトリとブランチを選択し、「OK」を押して、ローカルコピーに、レポジトリの変更を取り入れます。

![20140520_SourceTree_GitHub6.jpg](https://qiita-image-store.s3.amazonaws.com/0/44367/8c647ea1-a3c5-c6a4-a5a0-f29e534ce75e.jpeg)

ローカルコピーに、別レポジトリのコミットを取り込んだら、今度は自分のレポジトリにその修正内容を Push します。「Push」を押して、Push先のレポジトリとブランチを選択し、「OK」を押すと、自分のレポジトリに元レポジトリからの変更を同期させることができます。

![20140520_SourceTree_GitHub7.jpg](https://qiita-image-store.s3.amazonaws.com/0/44367/4c4a62a9-06b8-e032-f990-52b8868dfd54.jpeg)


SourceTree を使って、快適な大規模開発を！

ネタ元：http://stackoverflow.com/questions/13273852/how-do-i-update-my-forked-repo-using-sourcetree
Swiftでアニメーションとタイマーを使ってみた

swiftでのタイマーやアニメーションの記事がどこにも無かったので書きました
#アニメーション

##作るもの
とりあえずラベルが画面外から移動してきて、完了後に「移動完了」と表示されるアプリを作ります。

##前準備
```swift:ViewController.swift
@IBOutlet var label : UILabel
```
でラベルを宣言し、ストーリーボードと関連づけておきます

##実装
viewDidLoad内にこのように書きます
objective-cではブロック構文を使用していましたが、swiftではクロージャを使います。

```swift:ViewController.swift
override func viewDidLoad() {
        super.viewDidLoad()
        UIView.animateWithDuration(3.0, animations: {() -> Void in
                self.label.center = CGPoint(x: 100,y: 300);
            }, completion: {(Bool) -> Void in
                self.label.text = "移動完了";
            })
    }
```


#タイマー

##つくるもの
カウントアップタイマーをつくります

##前準備
```swift:ViewController.swift
@IBOutlet var label : UILabel
```
でラベルを宣言し、ストーリーボードと関連づけておきます

##実装

viewDidLoad内にこのように書きます
objective-cではブロック構文を使用していましたが、swiftではクロージャを使います。

```swift:ViewController.swift
import UIKit

class ViewController: UIViewController {
    
    @IBOutlet var label : UILabel
    
    var countNum = 0
    
    override func viewDidLoad() {
        super.viewDidLoad()
        var timer = NSTimer.scheduledTimerWithTimeInterval(1.0, target: self, selector: Selector("update"), userInfo: nil, repeats: true)
        
    }
    
    func update() {
        label.text = String(countNum)
        countNum++
    }
    
}
```


セレクタはアノテーションなど使わず

```
Selector("update")
```

だけでいいようです。簡単！

##使ってみての感想

書く量的にはObjective-Cの時とさほどかわりませんが、ブロック構文やアノテーションなどの知識がなくとも、クロージャなどの他言語の知識で実装できるのがすばらしいと思いました！
時間があったら本格的なアプリも作っていってみたいと思います！
Laravelでお手製ライブラリを使いたい時のTips

Laravelで共通関数とかをまとめてあるお手製ライブラリを作って使いたい・・・

そんな時はこんな感じでやってみましょー！
（注：Laravel ver4.1.29でのお話になります）


#簡単なところから・・・

まずは簡単にライブラリを置いとくディレクトリを作りましょー
app/の下とかに作るのがいいかも

    mkdir libraries



#各設定ファイルにディレクトリを認識させる

で、次に各設定ファイルに書き加えをしてこのディレクトリを認識させましょー

**・app/start/global.php**

    ClassLoader::addDirectories(array(        
        app_path().'/commands',
        app_path().'/controllers',
        app_path().'/models',
        app_path().'/database/seeds',
        app_path().'/libraries'　←追加！
    ));

**・composer.json**

    "autoload": {
    
        "classmap": [    
            "app/commands",
            "app/controllers",
            "app/models",
            "app/database/migrations",
            "app/database/seeds",
            "app/tests/TestCase.php",
            "app/libraries"　←追加！
        ]
    }


この設定の後はお馴染みの **composer dump-autoload** を忘れずに！

#ライブラリファイルの作成

ここでは適当にhelper.phpとしますー

    <?php

    class Helper
    {
        public static function test(){
            print_r("テストだよ！");
            Log::debug("テストだよ！");
        } 
    }



#ライブラリを使ってみる！

では実際にさっき作ったライブラリを使ってみましょー
ここでは適当にMainControllerで使う体でやりますー

    index(){
        Helper::test();
    }


さて、画面上とstorage/laravel.logの結果はどうでしょうか？？
**"テストだよ！"**が出ればOKです！

これで無事ライブラリの作成及び登録ができましたー！
Vert.xのインストールとHelloWorld

#参考
[Vert.x公式](http://vertx.io/)

#インストール
## まずはgvmの準備
細かい話は抜きにして、gvmを利用します。
gvmのインストールは[公式を参考にしてください。](http://gvmtool.net/)
と言っても基本的にはターミナルで`curl -s get.gvmtool.net | bash`を実行するだけです。

Windowsの方は[こちらが非常に参考になります。](http://qiita.com/_y_u_/items/7a4ffd6b79c829c9962f)

## Vert.xのインストール
まずはどんなバージャンがあるのかチェック

```
k-kuwana% gvm list vertx
find: `/home/k-kuwana/.gvm/vertx': そのようなファイルやディレクトリはありません

================================================================================
Available Vertx Versions
================================================================================
     2.1                                                                           
     2.0.2-final                                                                   
     2.0.1-final                                                                   
     2.0.0-final                                                                   
     1.3.1.final                                                                   
     1.3.0.final                                                                   
     1.2.2.final                                                                   
     1.2.1.final                                                                   
     1.2.0.final                                                                   
     1.1.0.final                                                                   

================================================================================
+ - local version
* - installed
> - currently in use
================================================================================
```

2.1が最新っぽい。
なので最新をインストール

```
k-kuwana% gvm install vertx

Downloading: vertx 2.1

  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0
100 6340k  100 6340k    0     0  1376k      0  0:00:04  0:00:04 --:--:-- 1948k

Installing: vertx 2.1
Done installing!

Do you want vertx 2.1 to be set as default? (Y/n): Y

Setting vertx 2.1 as default.

```

ちなみにgvmでは、今回のVert.xに限らずバージョンを指定せずにインストールを実行すると最新バージョンがインストールされます。
一旦ターミナルを再起動するか、新しいターミナルを開くと、インストールされたvertxが利用できるようになっています。
# HelloWorld!
## ソースの用意

```groovy:/home/k-kuwana/work/src/groovy/vertx/Server.groovy
vertx.createHttpServer().requestHandler { request ->
    request.response.putHeader("Content-Type", "text/plain")
    request.response.end("Hello World!")
}.listen(8080)
```

##Vert.xの起動
上記のServer.groovyが有るディレクトリに移動して以下のコマンドを実行
`vertx run Server.groovy`
**Succeeded in deploying verticle** と表示されればVert.xの起動が起動しています。

##アクセス
http://localhost:8080/にアクセス！
これでHelloWorldが表示されるはず。
Laravel4.1.xから4.2.xへのアップグレード方法

ついにLaravel4.2がやってきましたー！

・リリースノート
http://laravel4.kore1server.com/docs/42/releases


PHP5.4が必要になったり、Laravel Forgeへの対応があったりetc etc....

というわけで今回はLaravel4.1.x→4.2.xへのアップグレード方法を書いていきます！


#アップグレード方法


まずはcomposer.jsonの中身を変更していきます！
4.1.*の部分を4.2.*に変更しましょー

    {
      "name": "laravel/laravel",
      "description": "The Laravel Framework.",
      "keywords": ["framework", "laravel"],
      "license": "MIT",
      "require": {
        "laravel/framework": "4.2.*",
      }, 

次にapp/config/app.phpに以下のコードも足して下さい！

    'cipher' => MCRYPT_RIJNDAEL_256

で、後はcomposer updateを実行するだけ！
超簡単！


という訳で4.1.*→4.2.*は色々と変更点が多いですので、リリースノートを見つつ動かなくなっているところはないか確認してみてくださいー。
Laravel4.2+HHVMでのバグっぽい挙動

ちょっと面白い現象に遭遇したので、日本語での共有をば。


#どういう状況で何が起こったのか？
現在、Laravel4.2とHHVMで開発をしていたのですが、
その際に何故かblade.phpの{{{ }}}や{{ }}が<?php echo 〜 ?>に置換されないという問題を発見しました。


#原因は？
何故そのようなことが起こるかというとvendor/laravel/framework/src/Illuminate/View/Compilers/BladeCompiler.phpの
compileEchos関数の引数として本来であればblade.phpの中身がまるっと渡されるはずなのですが、
確認してみると中途半端なところで途切れた状態で渡されていました。

    protected function compileEchos($value)
    {

      // 引数の$valueをerror_logなどで確認すればよく分かる

      $difference = strlen($this->contentTags[0]) - strlen($this->escapedTags[0]);
    
      if ($difference > 0)
      {   
        return $this->compileEscapedEchos($this->compileRegularEchos($value));
      }   
    
      return $this->compileRegularEchos($this->compileEscapedEchos($value));
    }

最初はLaravelのバグかと思いましたが、githubのissuesを調べてみると以下のissueが。

https://github.com/laravel/framework/issues/4519


どうもHHVMのせいっぽいなーと思ったので、試しにapacheでやってみると
確かに正常に動作しました・・・



これに関してはHHVMの方で何とかしてもらうか別のWebサーバソフトを使うかの選択肢しか
ないですので、HHVMをどうしても使いたい！という方はHHVMのissuesを逐一確認した方がいいかもしれません。

上記のissueを立てていた方が、HHVMの方でも同じissueを立てられていましたので、
HHVMを使われる方はウォッチしとくといいかもしれません。

https://github.com/facebook/hhvm/issues/2807


[追記]
対応完了したようです！
Laravel Homesteadを使ってみよう！

LaravelにはLaravel Homesteadというvagrantを使った開発環境作成のサポートがあります。


これを使ってサクッと開発環境を作りましょう！

**※環境としてはMacを使っているものとして進めていきますのでご注意を！**


# 事前準備

まずは、日本語で翻訳されたLaravel Homesteadのページを見てみましょー

http://laravel4.kore1server.com/docs/42/homestead


基本的にはこのページ通りに沿って進めていきます。

書いてないこととして事前にローカルのプロジェクトのapp/storageをchmod -R 777しといてください！



# vagrantとvirtualboxのインストール

vagrantは公式からパッケージをゲットしてきてインストールしましょー！
http://www.vagrantup.com/

virtualboxも同じく！
https://www.virtualbox.org/

ここではあまり特別なことはしません。


# Vagrant Boxの作成などなど

インストールできましたら、Laravel Homesteadのページを頼りにドンドコドンドコ進めていきましょー

    vagrant box add laravel/homestead
    git clone https://github.com/laravel/homestead.git Homestead


# 設定について

設定についてもLaravel Homesteadのページに書いてありますが、一応細かく書いていきますー

    cd Homestead
    vim Homestead.yaml

で、Homestead.yamlの中を以下のように設定
**※デフォルトのままでよい部分は省きます**

    authorize: （公開鍵の場所）
    
    keys:
         - （秘密鍵の場所）
    
    folders:
         - map: （Laravelのプロジェクトの場所：例,/var/www/laravel）
            to: /home/vagrant/Code
    
    sites:
         - map: homestead.app
            to: /home/vagrant/Code/（publicディレクトリの場所：例,laravel/public） 


あとは/etc/hostsに以下を追加

    127.0.0.1 homestead.app

で、変更後にvagrant upしましょー！


# MySQLの設定

この仮想環境のMySQLはユーザにhomesteadが設定されています。

もし既にプロジェクトのdatabase.phpでユーザ名やパスワードを設定していて、
仮想環境のために設定を変更したくない！って場合は、
vagrant up後にvagrant sshで仮想環境にログインし、以下を実行して下さいー

    mysql -u root -psecret
    GRANT ALL ON *.* TO 追加したいユーザ名@localhost IDENTIFIED BY 'パスワード';
    FLUSH PRIVILEGES;


あとは http://homestead.app:8000 にアクセスして画面が表示されれば完了です！
GitLabのバックアップとリストア


GitLabに用意されているrake taskの使い方。

## バックアップ

gitlabのルートディレクトリで以下を実行する。
実行ユーザはGitLabを動かしているユーザで行う。（通常はgitユーザ）

```bash:backup
$ bundle exec rake gitlab:backup:create RAILS_ENV=production
```

LOCK TABLESへのアクセス権限が無いと怒られたら下記を実行する。

```
mysql> GRANT LOCK TABLES ON `db_gitlab`.* TO 'user_gitlab'@'localhost';
```

###バックアップの設定
config/gitlab.ymlの「backup:」セクションに以下を記述する。

| 項目 | 内容 |
|:--|:--|
| path: | バックアップファイルの出力先。デフォルトは(相対パスで)tmp/backups |
| keep_time: | 世代管理で「残しておきたい秒数」を記述する。デフォルトは0で無期限。 |

## リストア

gitlabのルートディレクトリで以下を実行する。
実行ユーザはGitLabを動かしているユーザで行う。（通常はgitユーザ）

```bash:restore
$ bundle exec rake RAILS_ENV=production gitlab:backup:restore BACKUP=<file_name>
```

## cron設定

下記のようなshellファイルを作ってGitLabを動かしているユーザのcronに記述する。
PATHを通してあげないと怒られると思う。

```bash:gitlab-backup
#!/bin/bash

PATH=<gitユーザのPATHを参考にする>

export PATH

date
cd /home/git/gitlab
bundle exec rake gitlab:backup:create RAILS_ENV=production
```
[Grails]ユニーク制約（複数のキーで）

# 複数のキーでユニーク制約を付ける

通常ユニーク制約を付けたいフィールドに`name unique: true`とするだけだけど、複数のカラムを指定したい場合も当然ある。
例えば、商品名はユニークだけど、商品の種類が異なれば、商品名がかぶってもいい、など。
以下は、その例。

```groovy
package sample

class Content {

    String name
    static belongsTo = [contentCategory: ContentCategory]
    Date dateCreated
    Date lastUpdated

    static constraints = {
        name unique: 'contentCategory'
    }
    static mapping = {
        version false
    }
}
```

結果的に `"content_content_category_id_name_key" UNIQUE CONSTRAINT, btree (content_category_id, name)`というユニーク制約が追加された。

# 参考
ttp://grails.jp/doc/latest/ref/Constraints/unique.html
[Grails]データバインディング（エラー制御編）

#前提条件
* アプリケーション名は **bindingtes**
* ローカルホストで動作させる。
* ポートは8080


#型変換エラー(アクション引数)
##サンプルソース
```groovy
package bindingtest

class HogeController {
    def actionTest(String name, Integer age) {
        render """
            errors.hasErrors():${errors.hasErrors()}<br />
            errors.errorCount:${errors.errorCount}<br />
            errors.getFieldError:${errors.getFieldError("age")}<br />
        """
    }
}
```
## errosプロパティ
* errors.hasErrors()
* errors.errorCount
* errors.getFieldError('FIELD_NAME')

##実際の使い方
[http://localhost:8080/bindingtest/hoge/actionTest/?name=koji&age=abc]()にアクセスすると、ageはアクション引数としてIntegerに自動変換されるが、その際にabcはIntegerに変換できずにエラーになる。
そのエラーがerrorsプロパティで補足できる。

## メモ
アクション引数でのエラーは基本的に型変換での変換エラーのみのはず。
アクション引数に値が渡されなかった場合は、単純にnullが入るのでerrorsプロパティには何もセットされない。
例えば[http://localhost:8080/bindingtest/hoge/actionTest/?name=koji]()はageがセットされていないけど、errorsプロパティには何も入らない。

#型変換エラー(ドメイン)
##サンプルソース
```groovy
package bindingtest

class HogeController {
    def domainTest(){
        def hoge = new Hoge(params)
        if(hoge.hasErrors()) {
            render "Error value : ${hoge.errors.getFieldError("age").rejectedValue}"
        }
    }
}
```
## 実際の使い方
[http://localhost:8080/bindingtest/hoge/domainTest/?name=koji&age=abc]()にアクセスすると、 **Error value : abc** と表示される。
[Grails]データバインディング（日付編）

#前提条件
* アプリケーション名は **bindingtest**
* ローカルホストで動作させる
* ポートは **8080**

# 日付のバインディング
例えば **19850220** (1985年2月20日)というString型の日付をフォームから受け取り、ドメインのDate型のプロパティに渡す場合。
態々コントローラの中などでStringからDateに変換して・・・なんてする必要はない。
ドメインの対象のDate型プロパティに **@BindingFormat** とういアノテーションを利用するだけ。

```groovy:Hoge.groovy
package bindingtest
import org.grails.databinding.BindingFormat
class Hoge {

    String name
    Integer age
    @BindingFormat('yyyyMMdd')
    Date birthDate
    
    static constraints = {
    }
}
```

```groovy:HogeController.groovy
package bindingtest

class HogeController {

    def dateTest() {
        def hoge = new Hoge(params)
        if (hoge.hasErrors()) {
            render hoge.errors.fieldErrors
        } else {
            render hoge.birthDate
        }
    }
}
```

これで、[http://localhost:8080/bindingtest/hoge/dateTest/?name=koji&age=29&birthDate=19850220]()とうURLにアクセスすると、birthDateの値がちゃんとドメインのDate型変数birthDateに格納される。

データがドメインにバインディングされる際に、birthDateは **yyyyMMdd** という形式に合致しているかどうか自動的にチェックされ、Date型に変換され、格納される。

もしもDate型に変換できない場合は、errorsプロパティにエラーが格納される。

なお、yyyyMMddは言い換えるとただの8桁の数字となる。
つまり、渡された値がヨーロッパ形式で、20021985(20日02月1985年)だった場合、合計8桁の数字、という形式は保たれているわけなので、それをドメイン側は単純にyyyyMMdd(2002年19月85日)として解釈し、変換する。その結果、Date型には2003年8月23日が格納されることになる。
VirtualBoxでホストPCからゲストPCにSSHでつなぐ

VirtualboxにホストPCからゲストPCに繋ぐ方法。

## ホストPC側の設定

ssh のクライアント入れときましょう。

## VirtualBoxの設定

ゲストPCを終了させた状態で

`[設定]→[ネットワーク]`でアダプター2のタブを選択して`ネットワークアダプターを有効化`

んで、割り当て`ホストオンリーアダプター`を選択。後はデフォルトのまんまでOK.

## ゲストPC側の設定

```
sudo apt-get install openssh-server
```
でインストールして

```
sudo /etc/init.d/ssh start
```
でサービスを開始しとく。

```
ifconfig
```

で`eth1`に出てきたアドレス`192.168.56.101`をメモる。

```
eth1      Link encap:Ethernet  HWaddr 08:00:27:b6:58:04  
          inet addr:192.168.56.101  Bcast:192.168.56.255  Mask:255.255.255.0
```

## 繋いでみよう！

後はホストPCから

`ssh 192.168.56.101`

するとパスワード入力でゲストPCにログインできるはずです。

## その他
公開鍵方式でつないだり sshd_conf を編集したりは一般的な方法と一緒なので適当に設定しておきましょう。
DXFことはじめ #4


　DXFを理解しづらくしている要因として、屋上屋を架していることがあげられます。

　そのため、構成に一貫性がなく、しかも、その辺りのことはリファレンスマニュアルにも詳しく記載されていないので、「なぜそうなっているのか？」は自分で推測するしかありません。

　たとえば、前回とりあげたCLASSESセクションでは、クラスについての一連のデータに終わりを示すマーカーはなく、次のクラスの始まりをしめすマーカーをもって、区切りとしています。
　これは、SECTIONの終わりを示すENDSECというマーカーがあるのとは、異なるルールで作られています。ちなみに、後に解説するTABLESセクション内の要素や、BLOCKSセクション内の要素では、それぞれ、TABLE〜ENDTAB、BLOCK〜ENDBLKという始まりを示すマーカーと終わりを示すマーカーの組があります。 
　実際に自分でパーザ（読込ルーチン）を作ってみるとわかるのですが、先読み可能なパーザでは、むしろ、終わりのマーカーがあると邪魔です。CLASSESセクション内部のような構成のほうが、書き方としてはすっきりします。では、なぜ、終わりを示すマーカーなんかが使われているのでしょうか。

　AutoCAD Release12までの、DXFファイルでは、CLASSESセクションとOBJECTSセクションがなく、HEADER、TABLES、BLOCKS、ENTITIESの4セクション構成でした。
　そこに、Release13からCLASSESセクションとOBJECTSセクションが加わっています。つまり、昔の考え方(Release12以前の頃のプログラムの書き方)では、終わりを示すマーカーが必要だったから、それがDXFファイル上に存在しているが、最近の考え方(Release13を作った頃のプログラムの書き方)では、それがない方が都合が良かったということではないか、と考えられるのです。

　幸い、Release13のあとは、AutoCAD2000でTHUMNAILIMAGEセクション(サムネールイメージを16進ダンプしたようなデータがはいっている、これはこれで謎なセクション)が加わったのみで、大きな変更はなく、AutoCADが扱える図形要素の追加にともなって、ENTITIESセクション内のデータが追加されているだけになっています。

　通常、Release12以前の形式のDXFファイルを扱うことは少ないと思いますので、今回取り上げた4セクション構成の世代については、昔そういう形式だったということや、ENDなんとかというマーカーは昔必要だったから、今も使われているというような理解で十分だと思います。
ZKメモ

* https://github.com/slyphon/zk

# はまりどころ
* get("/path", watch: true)を何回登録しても一回だけコールバックされる。(ソースコメントより)
* Watcherのcallback内は、例外がつぶされる。
* createするときに間のpathが無いとProcessがとまる。。


# create

```ruby:
zk.create("/test", "abc")
# ２番目の要素はznodeの状態
zk.get("/test") #=> ["abc", #<Zookeeper::Stat>]
```

## オプション
### ignore
```ruby:
# 既にノードがあってもエラーにならない
zk.create("/test", ignore: :node_exists)

# 途中のノードが無くてもエラーにならない
zk.create("/test/abc", ignore: :no_node)
```

### ephemeral
```ruby:
# Ephemeralノードとして作成する
zk.create('/ephe', ephemeral: true)
```
### or
```ruby:
# :setと渡すと途中のpashを生成してくれる。
# sequentialとehemeralがだめ？(ソースのコメントより)
zk.create('/foo/bar/text', or: :set) #=> /foo/bar が無くても作られる。
```


# Stat
znodeの値とステータスを取得する

```ruby:
# 配列で [value, stat] と返される
value, stat = zk.get("/path")

# Ephemerarlかどうか？
stat.ephemeral? 
```

# Locker
Lockには以下の二つのtypeがある
default znodeをきめれる　

## default znodeを変更する
```ruby:
ZK::Locker.default_root_lock_node = "/abc"
```


## exclusives_locker
普通のロック

### 使い方
```ruby:
# 注) ロックをとったインスタンスでしかunlockできない
locker = zk.locker('hoge')
if locker.lock
  # do something
  locker.unlock
end

```

## shared_locker
よくわからない

# eventでとれる情報
```ruby:
zk.register(path) do |event|
  # watch対象のnodeが作られた？
  event.node_created?

  # watch対象のnodeに変更?
  event.node_changed?
end
```

# find
指定したノードに対し逐次実行していく。

```ruby:
zk.find("/root") do |path|
  p path # ここで処理を実行していく

  # abc以下はトラバースしない。
  ZK::Find.prune if path == "/root/abc"
end
```


# 子ノードの変更を常に監視する。
※ event => 再度event登録までのeventは拾えない

```ruby:
 zk = ZK.new

# 子ノードに追加・削除があったときに実行されるブロックを登録
zk.register("/test1") do |event|
  p event
  # 一度よばれると、Watcherの登録が消されるので再度登録
  zk.children("/test1", watch: true)
end

# watch開始
zk.children("/test1", watch: true)
```
DXFことはじめ #3


　[以前の投稿](http://qiita.com/kazhida@github/items/8a5fa68e8fa135614d5d)で、DXFはコンス・セルの集まりであることと、もっとも大きなデータのくくりがセクションであることを説明しました。

　ここでは、DXF2番目のセクション（CLASSESセクション）について説明します。

　DXFの2行で一つのペアになっていて、それをコンス・セルと呼ぶ（他の呼び方もあるけど、筆者はこれが好み）ことを踏まえて、ここでは、

```
 0 
SECTION
 2 
HEADER
```

を、

```Lisp
(  0 . SECTION)
(  2 . HEADER)
```

と表記して説明します。

### CLASSESセクション

　[HEADERセクション](http://qiita.com/kazhida@github/items/600fb15f1ed94bd567a1)の後には、CLASSESセクションが続きます。中身は、こんな感じです。

```Lisp
(  0 . SECTION)
(  2 . CLASSES)
(  0 . CLASS)
(  1 . ACDBDICTIONARYWDFLT)
(  2 . AcDbDictionaryWithDefault)
(  3 . ObjectDBX Classes)
( 90 .         0)
(280 .      0)
(281 .      0)
(  0 . CLASS)
(  1 . ACDBPLACEHOLDER)
(  2 . AcDbPlaceHolder)
(  3 . ObjectDBX Classes)
( 90 .         0)
(280 .      0)
(281 .      0)
(  0 . CLASS)
(  1 . LAYOUT)
(  2 . AcDbLayout)
(  3 . ObjectDBX Classes)
( 90 .         0)
(280 .      0)
(281 .      0)
  ;
(  0 . ENDSEC)
```

　例によって、最初の2つは、セクションのはじめを表すマーカーとセクションの名前なので、無視すると、それ以降のグループコードの並びに、規則性があることに気づきます。1組の規則性のあるパターンをまとめて、横に並べるようにしてみると、こんな風にして見ることができます。

```Lisp
((0 . CLASS) (1 . ACDBDICTIONARYWDFLT) (2 . AcDbDictionaryWithDefault) (3 . ObjectDBX Classes) (90 . 0) (280 . 0) (281 . 0))
((0 . CLASS) (1 . ACDBPLACEHOLDER)     (2 . AcDbPlaceHolder)           (3 . ObjectDBX Classes) (90 . 0) (280 . 0) (281 . 0))
((0 . CLASS) (1 . LAYOUT)              (2 . AcDbLayout)                (3 . ObjectDBX Classes) (90 . 0) (280 . 0) (281 . 0))
  ;
```

　行が折り返されて見づらいかもしれませんが、総じてこんな感じになっています。

```Lisp
(
  (0 . CLASS)
  (1 . 識別子)
  (2 . 識別子)
  (3 . 文字列)
  (90 .  数値)
  (280 . 数値)
  (281 . 数値)
)
```

あるいは、グループコード91の値を含む場合もあります。

```Lisp
(
  (0 . CLASS)
  (1 . 識別子)
  (2 . 識別子)
  (3 . 文字列)
  (90 .  数値)
  (91 .  数値)
  (280 . 数値)
  (281 . 数値)
)
```

　最初のグループコード(0 . CLASS)は、これがCLASSを表すレコードの先頭であることを、表します。(0 . SECTION)と同じ感じですが、これには、レコードの終端を表すマーカーはなく、次の(0 . CLASS)を区切りとしています。

　(0 . CLASS)の後のコンスセルが何を表しているかというと、ずばり、

```Lisp
(
  (0 . CLASS)
  (1 . DXF内でのクラスの名前)
  (2 . C++のクラス名)
  (3 . アプリケーション名)
  (90 .  フラグ)
  (91 .  カスタムクラスのインスタンス数)
  (280 . フラグ)
  (281 . フラグ)
)
```

です。「なんでここで、C++???」「アプリケーション名???」ってなると思います。筆者もなりました。

　まず、アプリケーション名ですが、これは、AutoCADがいくつものアプリケーション・モジュールの集合体だと考えるとわかりやすいと思います。アプリケーション名は、そのモジュールを表す名前ということです。
　プラグインみたいなものがあって、そのプラグインの名前だと思ってください。C++のクラス名というのは、そのアプリケーション・モジュール内で、どのクラスでデータを扱うかを決めるのに使用される識別子です（と思います）。
　いずれも、AutoCAD内部で必要なものなので、図面を描画するという観点からは、まったく必要ありません。グループコード91のインスタンス数についても同様、おそらくAutoCAD内部で使っているもの（多分、モジュールがアンロードできるかどうかをこれで判別している）で、普通のひとには、関係ないものです。

　では、このセクションに記載されているCLASSの使い途はあるのかというと、前述のように図形の描画に関しては、まったくもって不要です。
　後にでてくるOBJECTSセクションに含まれる、図面のデータの内部に関連づけられた拡張データなどを使った二次利用の場合、そのデータが何の役割をもっているのかを特定するために使用することがあるかもしれません。
　その場合でも、(1 . DXF内でのクラスの名前)といくつかあるフラグ(詳細は、リファレンスマニュアルを参照のこと)を調べれば、十分だと思います。

　ということで、このセクションも、あまり重要ではないのでした。(^-^;)
ComposerでPHPUnitをインストールし、FuelPHPでユニットテストを行う


# 概要

以下のページでセットアップした環境を前提としている。
http://qiita.com/uchiko/items/a5c2e45264963acc0e4a

oil経由でPHPUnitを実行できるように設定をする。

# PHPUnitのインストール

composer.jsonを編集して、PHPUnitをインストールするように設定する。
また、Stagehand TestRunnerというのが便利らしいので、それもインストールする。

```javascript:composer.json
    ...
    "require": {
        ...
        "phpunit/phpunit": "4.1.*",
        "piece/stagehand-testrunner": ">=3.5.0"
    },
    ...
```

以下のコマンドを実行するとインストールが始まる。

```shell
$ php composer.phar update
```


# oilの設定変更

oilのデフォルト設定だと、phpunitコマンドへのパスが通っていない。
以下の手順で、oilの設定を変更する。

oil.phpをappディレクトリにコピーする。

```shell
$ cp fuel/packages/oil/config/oil.php fuel/app/config/
```

oil.phpに項目を以下のように設定する。

```php:fuel/app/config/oil.php
'autoload_path' => '' ,
'binary_path' => DOCROOT.'fuel/vendor/bin/phpunit' ,
```

oilコマンド経由でテストが実行できるようになる。


# テストを実行してみる

以下のコマンドで、FuelPHPのCoreのテストを走らせることができる。

```shell
$ php oil test --group=Core
```

いくつかテストが失敗するのだがいいのだろうか。


# テストを書く

ここに記載しているコードは、
以下の書籍に載っているものを参考にさせていただきました。
http://tatsu-zine.com/books/fuelphp1st


以下のようにフィルタクラスを作成する。

```php:fuel/app/classes/myinputfilters.php
<?php

class MyInputFilters
{
    // 文字エンコーディングの検証フィルタ
    public static function check_encoding($value)
    {
        // 配列の場合は再帰的に処理
        if (is_array($value))
        {
            array_map(['MyInputFilters', 'check_encoding'], $value);
            return $value;
        }

        // 文字エンコーディングを検証
        if (mb_check_encoding($value, Fuel::$encoding))
        {
            return $value;
        }
        else
        {
            // エラーの場合はログに記録
            static::log_error('Invalid character encoding', $value);
            // エラーを表示してシュル用
            throw new HttpInvalidInputException('Invalid input data');
        }
    }

    // エラーをログに記録
    public static function log_error($msg, $value)
    {
        Log::error(
            $msg . ': ' . Input::uri() . ' ' . urlencode($value) . ' ' .
            Input::ip() . ' "' . Input::user_agent() . '"'
        );
    }
}
```

以下のようにテストを書く。

```php:fuel/app/tests/myinputfilters_Test.php
<?php

/**
 * MyInputFilters class Tests
 *
 * @group App
 */
class Test_MyInputFilters extends TestCase
{
    public function test_check_encoding_invalid_sjis()
    {
        $this->setExpectedException(
            'HttpInvalidInputException', 'Invalid input data'
        );

        $input = mb_convert_encoding('SJISの文字列です。', 'SJIS');
        $test = MyInputFilters::check_encoding($input);
    }

    public function test_check_encoding_valid()
    {
        $input = '正常なUTF-8の文字列です。';
        $test = MyInputFilters::check_encoding($input);
        $expected = $input;

        $this->assertEquals($expected, $test);
    }
}
```

以下のようにテストを実行する。

```shell
$ php oil test --group=App
Tests Running...This may take a few moments.
PHPUnit 4.1.1-2-ge93a391 by Sebastian Bergmann.

Configuration read from /home/uchiko/project/fuelphp-1.7/fuel/core/phpunit.xml

...............

Time: 1.32 seconds, Memory: 16.25Mb

OK (15 tests, 18 assertions)
```


できた。




# 参考

3分でできる FuelPHP 1.6 テスト環境
http://d.hatena.ne.jp/Kenji_s/20130214/fuelphp_test_env
Controller間共通でHTTPヘッダを追加する方法



以下のようにControllerのafterメソッドで行う。

```php:fuel/app/classes/controller/public.php
class Controller_Public extends Controller_Template
{
    pubulic function after($response)
    {
        $response = parent::after($response);
        $response->set_header('X-FRAME-OPTIONS', 'SAMEORIGIN');
        return $response;
    }
}
```

ここで定義した「Controller_Public」を継承していく。
Linux時刻ズレ


環境はCentOS6.4
`LC_*="ja_JP.UTF-8`で設定

確認

```
$ date
2014年  6月  3日 火曜日 07:06:18 UTC
```

実際は16時過ぎくらい（JSTで+9）なので、ロケーション設定直す

```
# バックアップ
sudo cp /etc/localtime /etc/localtime.org

# 確認
ls /usr/share/zoneinfo/Asia/Tokyo
/usr/share/zoneinfo/Asia/Tokyo

# シンボリックリンクでパス通す
sudo ln -s /etc/localtime /usr/share/zoneinfo/Asia/Tokyo
```

気を取り直して

```
$ date
2014年  6月  3日 火曜日 16:09:14 JST
```