OmniAICreator/Qiita-1.07M huggingface dataset:
TestLinkのデータベース内部

定義されている全テーブルの説明はしていませんのであしからず。

# テスト仕様関連の主要なテーブル

| テーブル名 | 説明 |
|-----------|------|
| testprojects | テストプロジェクトの情報を管理するテーブル |
| testsuites | テストスイートの情報を管理するテーブル |
| nodes_hierarchy | テスト仕様の構造を管理するテーブル |
| tcversions | テストケースをバージョンごとに管理するテーブル |
| tcsteps | テストケースのテスト手順を管理するテーブル |

## nodes_hierarchy テーブル

| カラム名      | 説明 |
|--------------|------|
| id           |      |
| name         |      |
| parent_id    | 親ノードのID |
| node_type_id | `node_types`テーブルのID |
| node_order   | ツリー上の表示位置(?) |

例えば、以下のような構造になっていた場合。

    testproject
    + testsuite1
    |   testcase1
    |   + testcase_version1
    |   |   testcase_step1
    |   |
    |   + testcase_version2
    |       testcase_step1
    |
    + testsuite2
        testsuite3
          testcase2
          + testcase_version1
          |   testcase_step1
          |
          + testcase_version2
              testcase_step1

テーブルは以下のような感じに定義される。

| id | name        | parent_id | node_type_id | node_order |
|---:|------       |----------:|-------------:|-----------:|
| 1  | testproject | NULL      | 1            | 1          |
| 2  | testsuite1  | 1         | 2            | 0          |
| 3  | testcase1   | 2         | 3            | 0          |
| 4  | testcase_version1 | 3   | 4            | 0          |
| 5  | testcase_step1    | 4   | 9            | 0          |
| 6  | testcase_version2 | 3   | 4            | 0          |
| 7  | testcase_step1    | 6   | 9            | 0          |
| 8  | testsuite2  | 1         | 2            | 0          |
| 9  | testsuite3  | 8         | 2            | 0          |
| 10 | testcase2   | 9         | 3            | 0          |
| 11 | testcase_version1 | 10  | 4            | 0          |
| 12 | testcase_step1    | 11  | 9            | 0          |
| 13 | testcase_version2 | 10  | 4            | 0          |
| 14 | testcase_step1    | 13  | 9            | 0          |

本テーブルの`id`と各node_typeのIDは同じ値となるので、`testproject`の内容を知りたかったら `select * from testprojects where id = 1` で取れる。

`node_type_id` は `node_types` テーブルで定義されているIDが指定されている。`1.9.4` の定義は以下の通り

| id | description |
|----|-------------|
| 1  | testproject |
| 2  | testsuite   |
| 3  | testcase    |
| 4  | testcase_version |
| 5  | testplan    |
| 6  | requirement_spec |
| 7  | requirement |
| 8  | requirement_version |
| 9  | testcase_step |
| 10 | requirement_revision |
| 11 | requirement_spec_revision |

# テスト計画、実行関連の主要なテーブル

| テーブル名 | 説明 |
|-----------|------|
| testplans | テスト計画の情報を管理するテーブル |
| builds    | ビルド情報を管理するテーブル      |
| testplan_tcversions | テスト計画とテストバージョン(テストケース)の関連テーブル |
| executions | 実施結果を管理するテーブル |

`testplan_tcversions`には`testplans`のIDと`tcversions`のIDが管理されているので、それらを各テーブルから引っ張ってくればテストケースとテスト計画がリンクできる。

`executions`には`testplan_id`, `build_id`, `tcversion_id`があるので、実施結果がどのテスト計画、テストケースに紐づいているかがわかる。また、`status`に実施結果が格納されている。`p`が成功、`f`が失敗、`b`がブロック、`n`が未実施

# あとがき

カスタムレコードやユーザー情報についてはまだ調査できてないです。やる気もないし。もしやる気が出て、まとめたいなと思ったら書きます。
Firefox 35.x にしたらvimperatorのgiでTypeErrorが出る



firefox35にあげたらvimperatorのgiで以下エラーが出るようになってしまいました(´･_･`)

```
TypeError: 'snapshotLength' getter called on an object that does not implement interface XPathResult.
```

## 環境
firefox 35.01
vimperator 3.8.3

##解決策

参考：[If a textbox has not get been selected normal mode command gi results in a TypeError · Issue #33 · vimperator/vimperator-labs](https://github.com/vimperator/vimperator-labs/issues/33)


oniatsu :「I tried again to use 'gi' with Vimperator 3.8.3-a3, then the probrem did not occur.」
↓
gkatsev :「Alpha 3 is available in github releases: https://github.com/vimperator/vimperator-labs/releases/tag/3.8.3-a3」

ということだったので[ここ](https://github.com/vimperator/vimperator-labs/releases/tag/3.8.3-a3)に行ってダウンロードリンクをクリック

![スクリーンショット_2015-02-14_21_44_26.png](https://qiita-image-store.s3.amazonaws.com/0/64633/c620a6b2-a995-2c96-5189-4fac9403efb7.png "スクリーンショット_2015-02-14_21_44_26.png")

すると勝手にfirefoxのアドオンのダウンロード・インストールが始まります!


最新版を使いたかったらfirefoxのADD-ONSじゃなくてgithub覗いてみましょう!ということです!
RubyのHash要素にドット記法でアクセスさせる（Hashクラス拡張せずに特定のオブジェクトにのみ適用する）


# Goal

* `hash['key']`ではなく、`hash.key`でアクセスさせる
* クラス拡張の影響を特定の範囲内におさえるため、Hashクラス拡張せずに対応する
* hashインスタンスに拡張モジュールをextendする

# Code

```rb:hash_ext.rb
require 'pp'

module HashExtension
  def method_missing(method, *params)
    if method.to_s[-1,1] == "="
      # シンボルキーに優先的に書き込む
      key = method.to_s[0..-2].gsub(':', '')
      key = self.has_key?(key.to_sym) ? key.to_sym :
        ( self.has_key?(key.to_s) ? key.to_s : key.to_sym )
      self[key] = params.first
    else
      # シンボルキーとストリングキー両方存在する場合、
      # シンボルキーを優先的に返す
      key = self.has_key?(method.to_sym) ? method.to_sym : method.to_s
      self[key]
    end
  end
end

hash1 = { name: 'Isaac Newton', age: 372 }
hash2 = { name: 'Carolus Fridericus Gauss', age: 237 }

##
## hash1のオブジェクトのみmethod_missing機能拡張する
## 
hash1.extend HashExtension

## 
## hash1オブジェクトはメソッドよびだしでハッシュ要素にアクセスできるが、
## HashExtensionをextendしていないhash2オブジェクトには拡張の影響が及んでいないことを確認
## 
p hash1.name
  # "Isaac Newton"
p hash2.name
  # hash_ext.rb:17:in `<main>': undefined method `name' for {:name=>"Carolus Fridericus Gauss", :age=>237}:Hash (NoMethodError)

## 
## 代入時はキーが存在すれば上書き、存在しなければ追加することを確認
## 

hash1.name = "Sir Isaac Newton"
hash1.role = "physicist"

pp hash1
  # {:name=>"Sir Isaac Newton", :age=>372, :role=>"physicist"}
```

# Environment

```
% uname -a
Linux *** 2.6.32-431.el6.x86_64 #1 SMP Fri Nov 22 03:15:09 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux

% ruby -v
ruby 2.1.1p76 (2014-02-24 revision 45161) [x86_64-linux]

% cat /etc/issue
CentOS release 6.5 (Final)
Kernel \r on an \m
```
Go入門 vol.1 〜Go言語の特徴〜

## はじめに

Go言語に入門します。第 1 回目になります。

[A Tour of Go](http://go-tour-jp.appspot.com/#1) から入門するのが一般的らしいのですが、
今回は下記の教材を使って学習したいと思います。

## 教材

今回の教材は、「WEB+DB PRESS vol.82」に掲載されていた
「はじめてのGo」という特集を参考に、学習を進めたいと思います。
ちょっと前のものになってしまうのですが、先輩からオススメされたので採用しました。

著者の jxck さんのブログでも紹介されていました。ご参考まで。
[Web+DB Press vol.82 で Go の特集を書かせて頂きました #wdpress - Block Rockin’ Codes](http://jxck.hatenablog.com/entry/wbpress-vol.81-go)

## 学習内容

今回は、

Go言語の特徴

について、簡単にまとめていきたいと思います。

箇条書きの箇所は、ほぼ引用部となりますが、
私なりに解釈し、自分の言葉で文章を補足してみました。
（ですので、その解釈間違ってますよ・・・という場合は、
　コメントでこっそりかつ大胆にご指摘いただけると幸いです。）

詳細が気になる方は、ぜひ実際の書籍をご覧くださいませ！

## Go言語の特徴

Go言語の特徴は、ざっと以下の通りです。

### シンプル イズ ザ ベスト

カタカナで書くとうさんくさいのはさておき、
Go 言語はとてもシンプルな言語です。私はシンプル好きです。シンプル万歳。

もちろん、Go 言語は「あえて」シンプルに保っているのです。
ほら、素朴なものこそ、噛めば噛むほど味がでるっていうじゃないですか・・・。

という冗談はさておき、
Go 言語がシンプルを保っている理由は、

* コンパイルの高速化
* 予期せぬミスの減少

というとても現実的な目的があります。

では、上記をどのように実現しているかをみていきましょう。

#### 最小限の構文

Go 言語は、構文を最小限に保っています。

* 表現方法を制限する。
* コンパイルを遅くする原因となる構文を極力取り込まない。

（具体例）

* 繰り返し構文は for 文のみ
* if の波括弧は省略不可、三項演算子もなし ...などなど

ないない運動ですね！！！なななな〜い。
他言語であらゆる構文を使い慣れた方は、不便に感じるかもしれません。

しかし、上記の制限を設けることによって、

* 開発者による表現のばらつきを抑えることができる。
* 高速にコンパイルできる。

というメリットを得ることができます。


#### 危険の回避

Go 言語では、危険を回避する仕組みが備わっています。

今流行りの、
「いや、ちょと待ってちょと待ってお兄さん」ってことだね。


> コードは、追加するより削除する方が影響範囲が読みにくく、難しい

名言ですよね。コーディング標語大賞があったら間違いなく大賞ものですよ。

Go 言語では、危険の潜んだコードは自動的に（徹底的に？）排除する構造になっているようです。

* 不要なコードの存在をコンパイル時に検出し、不要なコードが存在することを防ぐ
 
（具体例）       

- ポインタ演算（メモリリークの原因）を排除
- 暗黙の型変換（意図せぬエラーの原因）を排除
- 使われていない変数、インポートされたのに使われていないパッケージがあるとコンパイルが通らない ...などなど

こりゃ、なかなかコンパイル通すの大変だぜ・・・と思ったそこのあなた、
キチャナイコーディング検定１級ですね。私のことです。

#### 例外の排除

これは Go 言語の特徴的なところなんだけど、
ちょっと難しいから、次回以降に詳しく調べたいと思ってる。

簡単にいうと、
「俺の辞書に『例外』という文字はない（キリッ」
ってことだと、今は解釈してる。やだ、かっこいい。

* 発生した異常を戻り値として呼び出し側に返す方針を採用
    - Go では多値を返せることを利用
* パニックとリカバリという異常を処理する仕組みを備えている
    - ゼロ除算や配列の範囲外への添字へのアクセス


### 特徴的な機能

Go 言語をシンプルに保つ一方で、今っぽいモダンな機能は積極的にサポートしています。
いいとこ取りな予感やね。

* クロスコンパイルのサポート
* 並行処理のサポート

（具体例）

- コンパイル時にOSとCPUアーキテクチャを指定し、その環境に合わせた実行ファイルを生成できる。
- ゴルーチンという軽量スレッドを用いて処理を並行に実施
- ゴルーチンの間ではチャネルという機能でデータをやり取りする仕組みが備わる

### 充実した開発環境

Go 言語を始めたいと思っているそこのあなた！
必見です。

Go 言語は、開発を助けるさまざまなパッケージ、ツール、
各エディタやツールのためのプラグインなどが公開されているため、
すぐに開発を始めることができます。

* 標準パッケージ
    * 外部パッケージに頼らずともかなりの開発をカバーできる
    * 標準パッケージの一覧は公式ドキュメントで確認できる
* ツールのサポート
    * 開発を支援するコマンドが同梱されている
* 各エディタのサポート
    * 有志よる主要なエディタやツールへのプラグインが公開されている

### フォーマット

Go 言語では、標準のコーディング規約が定められています。
プロジェクトごとにコーディング規約を用意したり、
開発者同士の思考を巡って無駄な言い争いを起こることを防いでいます。

* インデントはハードタブ（タブ文字）
* 半角スペースを入れるべき場所/入れるべきでない場所が規約として定められている
* コーディング規約はわざわざ覚える必要はない
    * `go fmt` コマンドを用いることでコードを自動整形できる


### ドキュメント

Go 言語は、標準パッケージやサードパーティパッケージのドキュメントを確認できる
` godoc `コマンドが用意されています。

ただし、` godoc `コマンドを使用するには、別途インストールが必要です。
godoc を使えるようにするにはこちらを参照ください。

* [Go で godoc を使えるようにする〜godoc のインストール〜 - Qiita](http://qiita.com/megu_ma/items/2066aef2f8c7f0ce2cc3 "Go で godoc を使えるようにする〜godoc のインストール〜 - Qiita")


## おわりに

引き続き Go 言語の学習をお楽しみください！

### Go入門リンク

* [Go入門 vol.2 〜Go言語の基本文法（main パッケージ、インポート、組込み型、変数）〜 - Qiita](http://qiita.com/megu_ma/items/f5e66293b2934e117731 "Go入門 vol.2 〜Go言語の基本文法（main パッケージ、インポート、組込み型、変数）〜 - Qiita")


以上、おわり。
[Swift] 配列と辞書


自分用忘備録 (swift 1.0)

配列
-

####配列の作成

```swift
var array1 = [4, 5, 6]			//型推論
var array2:[Int] = [1, 4, 5]	//型指定
var array3 = [Int](); var array4:[Int] = []  //初期化
var array6 = [Int](1...10)		//範囲を指定[1, 2...10]
var array7 = [Double](stride(from: 8.0, through: 10.0, by: 0.5))    //範囲と増減値を指定 [8.0, 8.5...10.0]
var array8 = [String](count: 5, repeatedValue: "def")    //指定した値を繰り返す ["def"..."def"]
var part = array1[1...2]        //配列の一部から新しい配列を作成[5, 6]
```
####要素の追加

```swift
var tmp1 = [Int]()
tmp1.append(5)      //末尾に追加[5]
tmp1.insert(9, atIndex: 0)  //インデックス番号に挿入[9, 5]
tmp1 += [6]         //末尾に追加[9, 5, 6]
tmp1 = [4] + tmp1   //先頭に追加[4, 9, 5, 6]
```
####代入と追加、削除

```swift
var tmp2 = [1, 4, 5]
tmp2[2] = 9                 //2番を9に[1, 4, 9]
tmp2[1...2] = [8, 6, 10]    //1から2番を8,6,10に[1, 8, 6, 10]
tmp2[0...0] = [4, 0, 6]     //0番を4,0,6に[4, 0, 6, 8, 6, 10]
tmp2[1...3] = []            //1から3番を削除[4, 6, 10]
tmp2.removeAtIndex(2)       //インデックス番号で削除[4, 6]
tmp2.removeLast()           //最後を削除[4]
tmp2.removeAll(keepCapacity: false) //全削除 引数は元の記憶領域を保持するか
```
####プロパティ

```swift
var tmp3 = [1, 5, 6, 2]
tmp3.count      //要素の個数 Int {get}   4
tmp3.first      //最初の要素 T?  {get}   1
tmp3.last       //最後の要素 T?  {get}   2
tmp3.isEmpty    //要素の有無 Bool{get}   false
```
####ソート

```swift
var other = [6,3,2,6,9,8,4,0,1,7]
let reverse = other.reverse()	//逆に並べた配列を返す[7, 1, 0, 4, 8, 9, 6, 2, 3, 6]
other.sort({$0 < $1})			//other自体が変更される[0, 1, 2, 3, 4, 6, 6, 7, 8, 9]
var sorted = other.sorted({$1 < $0})	//元の配列を保持してソート"[9, 8, 7, 6, 6, 4, 3, 2, 1, 0]"
```
####オプショナル型の配列

```swift
var optArray:[Int?] = [5, 3, nil, 8]
let num:Int = optArray[1]!          //返り値はオプショナル型
```
####多次元配列

```swift
var multi: [[Int]] = [[1, 2, 3], [9, 8, 7]]
multi[0]            //[1, 2, 3]
multi[0][2]         //3
multi[1].append(6)  //1番の配列の末尾に6を追加 [[1, 2, 3], [9, 8, 7, 6]]
```

####要素からインデックス番号を得る
```swift:GetIndex
let array = [10,50,80]
let index = find(array, 50)
println(index)		//1
```
`find`はSwift 2.0からはサポートされなくなり、新しく`.indexOf`が追加される。

```swift:indexOf
let array = [10,50,80]
let index = array.indexOf(50)
println(index)		//1
```


辞書
-
`var dic = [key:value]`
キーと値の方はそれぞれ統一されている必要がある
辞書から得た値の型はオプショナル型になる
キーはHashableな型でなければならない

型を明示する場合
下記は空の辞書が作られる
`var dic = [String:Int] ()`
`var dic:[String:Int] = [:]`

####要素の追加と削除

```swift
var dic:[String:Int] = ["zero":0]
dic["one"] = 1
dic["zero"] = nil
```
####辞書の比較
要素の順序は問わない

```
var dic1 = ["zero":0, "one":1]
var dic2 = ["one":1, "zero":0]
dic1 == dic2		///true
```
####辞書から配列を作る

```swift
var dic = ["zero":0, "one":1, "two":2]
var keys = [String](dic.keys)	//["zero", "one", "two"]
var values = [Int](dic.values)	//[0, 1, 2]
```
####メソッドとプロパティ

```swift
var dic = ["zero":0, "one":1, "two":2]
//oldには更新前の2が入り、dicの"two"の値が9に更新される キーが存在しなければnilが帰る
let old = dic.updateValue(9, forKey: "two")
//delには削除前の0が入り、dicの"zero"が削除される キーが存在しなければnilが帰る
let del = dic.removeValueForKey("zero")
let num = dic.count		//要素の数(2)
```
[JAWS-UG CLI] IAM:#9 ログインプロファイルの削除 (マネジメントコンソールからのログイン不許可)

AWS CLIを利用して、IAMユーザがマネジメントコンソール(web)にログインできないように、パスワード設定を削除してみます。

(AWS APIしか利用しない場合、パスワード設定をしないことでマネジメントコンソールからのログインを防止することができます。)


前提条件
========

## IAMへの権限

* IAMに対してフル権限があること。

## AWS CLIのバージョン

以下のバージョンで動作確認済

* AWS CLI 1.7.6


# 0. 準備

0.1. コマンドのバージョン確認
-----------------------------

コマンド:

```bash:コマンド:
aws --version
```

結果(例):

```text:結果(例):
aws-cli/1.7.14 Python/2.7.5 Darwin/13.4.0
```



0.2. 変数の確認
-----------------------------

```bash:変数の確認:
aws configure list |grep profile
```

```text:結果(例):
   profile         iadm-prjZ-mbp13              env    AWS_DEFAULT_PROFILE
```

profileの値がIAM管理ユーザになっていることを確認します。


# 1. 事前作業

## 1.1. 対象IAMユーザの指定

マネジメントコンソールからのログイン許可を削除するIAMユーザを指定します。

```bash:コマンド:
IAM_USER_NAME=taro
```

## 1.2. ログインプロファイルの確認

対象となるIAMユーザのログインプロファイルが存在することを確認します。

```bash:コマンド:
aws iam get-login-profile --user-name ${IAM_USER_NAME}
```

```json:結果(例):
{
    "LoginProfile": {
        "UserName": "taro", 
        "CreateDate": "2014-09-07T12:01:53Z", 
        "PasswordResetRequired": false
    }
}
```

# 2. 設定の削除

対象となるIAMユーザのログインプロファイルを削除します。

```bash:コマンド:
aws iam delete-login-profile --user-name ${IAM_USER_NAME}
```

```text:結果:
(戻り値なし)
```

# 3. 事後確認

対象となるIAMユーザのログインプロファイルが存在しないことを確認します。

```bash:コマンド:
aws iam get-login-profile --user-name ${IAM_USER_NAME}
```

```text:結果(例):
A client error (NoSuchEntity) occurred when calling the GetLoginProfile operation: Cannot find Login Profile for User taro
```
[JAWS-UG CLI] IAM:#8 ログインプロファイルの作成 (マネジメントコンソールからのログイン許可)


AWS CLIを利用して、IAMユーザがマネジメントコンソール(web)からログインできるように、パスワードの設定をしてみます。

(AWS APIしか利用しない場合は、この作業は不要です。パスワード設定をしないことで、マネジメントコンソールからのログインを防止することができます。)


前提条件
========

## IAMへの権限

* IAMに対してフル権限があること。

## AWS CLIのバージョン

以下のバージョンで動作確認済

* AWS CLI 1.7.18
* AWS CLI 1.7.14
* AWS CLI 1.7.6


# 0. 事前準備


0.1. コマンドのバージョン確認
-----------------------------

コマンド:

```bash:コマンド:
aws --version
```

結果(例):

```text:結果(例):
aws-cli/1.7.18 Python/2.7.5 Darwin/13.4.0
```



0.2. 変数の確認
-----------------------------

```bash:変数の確認:
aws configure list |grep profile
```

```text:結果(例):
   profile         iadm-prjZ-mbp13              env    AWS_DEFAULT_PROFILE
```

profileの値がIAM管理ユーザになっていることを確認します。



# 1. 事前作業

## 1.1. 対象IAMユーザの指定

マネジメントコンソールからのログインを許可するIAMユーザを指定します。

```bash:コマンド(例):
IAM_USER_NAME=taro
```


## 1.2. ログインプロファイルの確認

対象となるIAMユーザのログインプロファイルが存在しないことを確認します。

```bash:コマンド:
aws iam get-login-profile --user-name ${IAM_USER_NAME}
```

```text:結果(例):
A client error (NoSuchEntity) occurred when calling the GetLoginProfile operation: Cannot find Login Profile for User taro
```

## 1.3. 初期パスワードの指定

対象となるIAMユーザに提供する初期パスワードを指定します。

```bash:コマンド:
IAM_PASSWORD_NEW='#userPass123'
```

# 2. 設定

対象となるIAMユーザのログインプロファイルを作成します。

```bash:コマンド:
aws iam create-login-profile \
  --user-name ${IAM_USER_NAME} \
  --password "${IAM_PASSWORD_NEW}"
```

```json:結果(例):
{
    "LoginProfile": {
        "UserName": "taro", 
        "CreateDate": "2014-09-07T12:01:53.109Z", 
        "PasswordResetRequired": false
    }
}
```

# 3. 事後確認

対象となるIAMユーザのログインプロファイルが存在することを確認します。

```bash:コマンド:
aws iam get-login-profile --user-name ${IAM_USER_NAME}
```

```json:結果(例):
{
    "LoginProfile": {
        "UserName": "taro", 
        "CreateDate": "2014-09-07T12:01:53Z", 
        "PasswordResetRequired": false
    }
}
```

# 4. マネジメントコンソールにログイン


マネジメントコンソールからログインします。

ハンズオンで、CLIの操作の結果を、マネジメントコンソールから確認してみましょう。
俺のnpmが、Node.jsを全力で邪魔している

バージョン確認でこけた。

```
$ npm -v

module.js:340
    throw err;
          ^
Error: Cannot find module 'npmlog'
    at Function.Module._resolveFilename (module.js:338:15)
    at Function.Module._load (module.js:280:25)
    at Module.require (module.js:364:17)
    at require (module.js:380:17)
    at /usr/local/lib/node_modules/npm/bin/npm-cli.js:18:11
    at Object.<anonymous> (/usr/local/lib/node_modules/npm/bin/npm-cli.js:75:3)
    at Module._compile (module.js:456:26)
    at Object.Module._extensions..js (module.js:474:10)
    at Module.load (module.js:356:32)
    at Function.Module._load (module.js:312:12)
```

で、brewで再インストールとかもしたけど変わらず。
ググったら``npm install -g npm-install-missing``だという意見が多数だったので試したけど無理。

これで解決しました。
https://github.com/tj/n/issues/101

``curl -0 -L http://npmjs.org/install.sh | sudo sh``

thank you!
Firefoxでcss3アニメーションが動作しないときの対処方法

FirefoxにSelenuim IDEをインストールして、改修中のWebサイトのテストケースを作成しようとしたところ、CSS3のアニメーションが動作しない。
ChromeやSafariでは問題なく動作するので、「何故動かん？」と原因について調査したので、対処方法についてまとめました。

#### 対処方法
CSS3アニメーション属性の接頭語に「-webkit」が指定されていたので、「-moz」に変更する

一部JavaScript（jQuery）で動的に設定している箇所があったので、下記の通り修正
また、トランジション終了後のbindが実行できていなかったので「webkitTransitionEnd」から「transitionend」に変更


 * 修正前

```
$("#menuContainer").css({
	'-webkit-transform':'translate3d(350px,0,0)', 
	'-webkit-transition':'-webkit-transform 400ms cubic-bezier(0,0,0.25,1)'
}).bind('webkitTransitionEnd', function(){
	// トランジション終了後の処理を記述

});
```
 * 修正後

```
$("#menuContainer").css({
	'-moz-transform':'translate3d(350px,0,0)', 
	'-moz-transition':'-moz-transform 400ms cubic-bezier(0,0,0.25,1)'
}).bind('transitionend', function(){
	// トランジション終了後の処理を記述

});
```


#### 参考URL
http://memopad.bitter.jp/w3c/css3/css3_animations.html
http://blog.webcreativepark.net/2013/04/13-174122.html
ターミナルに何も残さないように、manをMacVimで読む


## manをVimで読むと快適
* [manをVimで見る](http://rcmdnk.github.io/blog/2014/07/20/computer-vim/)

```console
$ man find | col -b -x | vim +"set ft=man nolist nomod noma" -
```

## MacVimで標準入力を読むと、変なのが残る
```console
$ man find | col -b -x | mvim +"set ft=man nolist nomod noma" -
$ Vim: Reading from stdin...
# ctrl+cで終了させないと消えない
# MacVimを完全に終了しても消えない

$ man find | col -b -x | mvim -f +"set ft=man nolist nomod noma" -
# noforkだとMacVim終了で消える
```

## MacVimを起動してから、EXコマンドでmanの出力を読み込む
```console
$ mvim +"r ! man find | col -b -x" +"normal ggdd" +"set ft=man nolist nomod noma"
# 何も残らない！
```

## シェルスクリプト化
```manv.sh
#!/bin/bash
if man "$1" >&/dev/null;then
  mvim +"r ! man $1 | col -b -x" +"normal ggdd" +"set ft=man nolist nomod noma"
else
  echo "ERROR: No man to argument." 1>&2
  exit 1
fi
```

```console
$ manv find
# MacVimが起動してfindのmanを読み込む

$ manv zzz
ERROR: No man to argument.
```

## 関連
* [Vimの起動オプションでファイルにテンプレートを追記して挿入モードに移行する - Qiita](http://qiita.com/catfist/items/11dd92300f57b261b6b3)
Minecraft Server 建てられるかチャレンジ！

初投稿でうまくまとめられるかわかりませんが、Minecraft Serverの建て方をこれから地道にまとめていこうと思います！

今回まとめていく[Minecraft](https://minecraft.net/)対象バージョンは1.8が動くように立てていこうと思います。

## 事前に準備しているもの
・[サクラインターネット](http://vps.sakura.ad.jp/)でレンタルしたVPS(CentOS)
・git
・Minecraftの用語の知識！

事前に準備してあるサクラインターネットVPSのセキュリティ関連の設定は先にしてある前提で進めていきます。

[サクラインターネットセキュリティ関連の設定方法など](https://help.sakura.ad.jp/app/answers/detail/a_id/2422)

始める前にどういったツールを使っていこうかまとめていきます。

## ツール説明
＜Bukkit＞
この[Bukkit](http://dev.bukkit.org/)というのは、Bukkitチームが作ったMinecraftのサーバーのことです。
正式名称はCraftBukkitというそうです。

Bukkitを使うとプラグインが入れられていろいろ便利らしいです。
実際に私はMinecraftのサーバを建てるのが今回が初めてなのでBukkitについてはあまり詳しくないです・・・

>2014年9月4日に、CraftBukkitがDMCA(米国デジタルミレニアム著作権法)に抵触するという理由で公開停止しています。 

そのため今回はSpigotを使用していきます。

＜Spigot＞
SpigotはBukkitよりパフォーマンス向上されているツールだそうです。
基本はBukkitと同じです。

それでは進めて行こうと思います。

真面目に書くの疲れた・・・
ここからはゆるく書いていきます！

## 作業開始！

まずJDK（1.8）が必要なのでインストールしましょう！！！
jdkの一覧を表示して・・・

`# yum search jdk`
もしくは
`# yum list | grep jdk`

![SnapCrab_NoName_2015-2-14_19-8-41_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/68930/96cca91f-ffb4-5f59-15ba-54e1fc3f86f4.png)

上記の画面の白くなっている部分のjava-1.8.0-openjdk-devel.x86_64 : OpenJDK Development Environmentをインストールしていきましょう。

インストーーール！
`# yum install java-1.8.0-openjdk-devel.x86_64`

インストールが完了したら確認
`# java -version`

![SnapCrab_NoName_2015-2-14_19-23-0_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/68930/227a7474-4c55-84a2-9e69-c407e03cc00d.png)

それではいよいよBuildToolsを使っていきたいと思います！
まず[このサイト](http://www.spigotmc.org/threads/bukkit-craftbukkit-spigot-1-8.36598/)とかでBuildTools.jarファイルをDLしてきましょう。

ちなみに英文ですがBuikdToolsの使い方とかいろいろ書いてあった気がします。

落としてきたらファイル転送しましょう！
もしくは、上のサイトから落とさなくてもwgetコマンドで取ってくる方法もあります。
`# wget -O BuildTools.jar https://hub.spigotmc.org/jenkins/job/BuildTools/lastSuccessfulBuild/artifact/target/BuildTools.jar`
的な

あとは落としてきたBuildTools.jarを実行するだけだ！
`# java -jar BuildTools.jar`
少し時間はかかります！

完了したBuildToolsと同じ階層にいろいろファイルができていると思いますが、spigot-1.8.jarファイルを実行することによってサーバ起動ができます。
実際に起動してみましょう！
`# java -jar spigot-1.8.jar`
![SnapCrab_NoName_2015-2-14_20-6-50_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/68930/4ab3883f-8560-b8ad-5c61-1fabe1625b47.png)

普通に起動するとEULAの規約に同意しないと起動できませんって出ると思います。
なので規約に同意するためにeula.txtを編集する必要があります。
`# vi eula.txt`
![SnapCrab_NoName_2015-2-14_20-8-42_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/68930/ce1cf7e0-6307-570f-9f60-6a2b3a2a4644.png)

中身をみると
`eula=false`
となっていて、規約に同意しませんという設定になっています。
なのでこれを
`eula=true`
にしてあげましょう！

そして先程のコマンドを実行してみましょう！
`# java -jar spigot-1.8.jar`

ワールドが生成されて、最後に
`Done (2.483s)! For help, type "help" or "?"`
が表示された状態でサクラインターネットのグローバルIPアドレスにMinecraftのクライアントで接続してみましょう！
※注意
Minecraftはデフォルトではポート25565を使用しているので事前に開放しておいてください！

![SnapCrab_NoName_2015-2-14_20-17-34_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/68930/230a8453-2088-27f9-ad81-53a106608343.png)

ログインできるとサーバーのログにログインしたユーザがかかれるはずです！
そして
![SnapCrab_NoName_2015-2-14_20-15-8_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/68930/8bcd4581-2cfa-336a-243f-d762908f5538.png)

きたーーーーーーーーーーー！！！！
ってなるはずです！

とりあえず今回はサーバーを建てて接続までのざっと流れを書きましたが、細かい設定などはおいおい記事としてあげるかもしれません！

今回はご覧になってくださってありがとうございます！
それではみなさん、よいMinecraftをご堪能ください！

さよなら～
機械学習によるデータ分析まわりのお話

機械学習によるデータ分析について，できるだけ広く浅くまとめてみました．

アルゴリズムの詳細やツールの使い方などにはほとんど触れず，
実際にデータ分析を行う際の注意点などに重きをおいています．

「機械学習によるデータ分析まわりのお話」
http://www.slideshare.net/canard0328/ss-44288984
PHPerのための初めてのRuby入門①

こんにちは。骨の髄からのPHPerがRubyをイチから学ぶ手順をまとめていきます。

今回はインストールから標準ライブラリでHTTPリクエスト先のHTMLファイルを取得してくる所までやってみました。

## インストール編

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

まず、rbenvを入れれば問題無し。

```
brew install rbenv
```

ruby-buildを入れないと、最新のrubyのインストールが出来ないので忘れずにインストール

```
git clone git://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
```

### Ruby

現在の最新の安定版の2.2.0をインストール

```

rbenv install 2.2.0
```

インストールしたら、バージョンを切り替える

```
rbenv global 2.2.0
```

## 実装編

### コマンドラインからHello World

```
ruby -e 'puts "Hello World"'
```

### ファイルからHello World

```
vi hello.rb
```

```hello.rb
puts "Hello World"
```

```
ruby hello.rb
```

これで、Hello World出来ました。

### メソッドの宣言・呼び出しを行う

メソッドの宣言

```rb
def hello(name)
  puts "Hello#{name}sann!"
end
```

メソッドの実行

```rb
hello("Jonh")
```

### 外部モジュールを読みこむ

```rb
require './hello.rb
```

拡張子は省略可

```rb
require './hello'
```

### 標準ライブラリを読み込む

```rb
require 'open-uri'
```

open-uriはhttpリクエストを行うための標準ライブラリ

## Open-URIでHTTPファイルの内容を出力する

```rb
require 'open-uri'

# URLオブジェクト生成
uri = URI.parse('http://www.example.co.jp')

# 読み込んだHTMLファイルの内容を出力
uri.open do |file|
  file.each_line {|line| p line}
end
```

以上です。まずPHPerが違和感を持つのは、do |変数名|と{}ですね。。

次回はここらへんの理解を深めていきたいと思います。
Yokohama.rb #53 memo


#レシピブック

特に断らない限り、すべて ruby 2.2.0p0 。

## File.read

手元で試せていないけど、ruby 2.1.5 on windows で

```ruby
a=File.read "filename.txt" # CRLF を LF に変換
b=File.read "filename.txt", 20 # CRLF が CRLF のまま
```

となる模様。
バイト数を指定すると勝手にバイナリモードになるらしい。
こわい。

File#read も同様。ぐぬぬ。

あと、

```rb
a=File.read( "filename", 2, 3 )# 2バイト、3バイト目から
b="string"[ 2, 3 ] # 2文字目から、3文字
```

File.read と string では、引数の順序が違う。これは、引数がひとつの場合の動作

```rb
a=File.read( "filename", 2 )# 2バイト、先頭から
b="string"[ 2 ] # 2文字目から、1文字
```

とのつじつまを合わせるためなので仕方がないけど気持ち悪くはある。

## File.binread

知らなかった。便利そう。
しかし。

```ruby
one=File.read("one") # ok
two=File.binread("two") # ok
three=File.open("three"){ |f| f.read } # ok
four=File.open("four"){ |f| f.binread } # undefined method `binread'
```

クラスメソッドにはあるけど、インスタンスメソッドにはない。

`f.read(0)` で binread 相当の動作になると思う（手元に windows がないので未確認）

## puts の動作

レシピブックの話題とはあまり関係ないけど、 puts の動作に衝撃を受けた。

ruby の puts は、末尾に改行がある文字列を出すと puts 自身は改行を出さない。

```ruby
puts "hoge" #=> hoge に続いて改行を1個出力
puts "hoge\n" #=> hoge に続いて改行を1個出力
puts "hoge\n\n" #=> hoge に続いて改行を2個出力
```

ちなみに C言語の puts は、普通に引数を出力した後に改行を出す。

## $stdout.sync

```ruby
$stdout.sync=false
50.times do
  print "o"
  i=0
  1000_000.times{ i+=1 }
end
```

とやっても、ちゃんと１個ずつ `o` が出る。なんでだろう。
OCamlでdlopenしてもdlsymで参照できなかった #solved

# flagsの指定が必要だった

```
Dl.dlopen ~filename:"libtrusterd.dylib" ~flags:[Dl.RTLD_NOW];;
```

# 関連投稿

- [lablglutが動かない場合](http://qiita.com/kjunichi/items/5772322ac98410e97851)

# 関連記事

- [Mavericksにしたからかutopが動かなくなっていた #OCaml #opam #solved](http://abrakatabura.hatenablog.com/entry/2013/12/23/220415)
- [OCaml(OpenGL)で「プログラムでシダを描画する」を通して学んだことのまとめ](http://abrakatabura.hatenablog.com/entry/2014/07/03/064416)
- [OSXで最速でOCamlでPostgresqlに接続するには](http://abrakatabura.hatenablog.com/entry/2013/06/27/064038)
- [WindowsにOCaml入れようとしてocamlfindが動かない件](http://abrakatabura.hatenablog.com/entry/2017/05/02/072551)
- [Windowsで公式のOCamlをいれて、utop動かすところまで出来た](http://abrakatabura.hatenablog.com/entry/2017/05/04/074542)
OCaml初心者が悩んだ、Cにコールバックしてもらう関数の定義

# 背景

ctypesで関数ポインタをC側に渡し、コールバックしてもらうユースケースで
問題となった。

# Cから呼びたい型

以下のコードでC側からは

```C
int hoge(char*p)
```

という関数としてコードを呼び出したい。

# 悩んだこと

引数と返り値の型をなんとかしたい。


```ml
let f x = 
begin 
 print_string x;
 -1;
end;;
```

糖衣構文でやり過ごせた。

引数xの方はprint_stringでstring型にできた。
-1とすることで返り値は符号付きのint型として
OCamlのコンパイラに認めてもらえた。

# 関連投稿

- [「プログラムでシダを描画する」をOCaml(OpenGL)で描画する](http://qiita.com/kjunichi/items/03d821ae2cb742d811bf)
- [lablglutが動かない場合](http://qiita.com/kjunichi/items/5772322ac98410e97851)
- [OCamlでdlopenしてもdlsymで参照できなかった #solved - Qiita](https://qiita.com/kjunichi/items/9c05f4e92402be646310)

# 関連記事

- [Mavericksにしたからかutopが動かなくなっていた #OCaml #opam #solved](http://abrakatabura.hatenablog.com/entry/2013/12/23/220415)
- [OCaml(OpenGL)で「プログラムでシダを描画する」を通して学んだことのまとめ](http://abrakatabura.hatenablog.com/entry/2014/07/03/064416)
- [OSXで最速でOCamlでPostgresqlに接続するには](http://abrakatabura.hatenablog.com/entry/2013/06/27/064038)
- [WindowsにOCaml入れようとしてocamlfindが動かない件](http://abrakatabura.hatenablog.com/entry/2017/05/02/072551)
- [Windowsで公式のOCamlをいれて、utop動かすところまで出来た](http://abrakatabura.hatenablog.com/entry/2017/05/04/074542)
- [Windowsでlablglを使う](http://abrakatabura.hatenablog.com/entry/2017/05/27/072722)
cakephpの2系でデフォルトでfetch出来るmetaとかtitleとかscriptはどこで定義されているのか

調べました。

## きっかけ

cakephp2の勉強やってて、default.ctpに書かれている$this->fetchメソッドがよく分からず調べていたものの、assignで書き換えられるよ！って話しか無くて、どこにあるんだ！って思ってげきおこになったので調べた。

## 使用したCakePHPのバージョン

2.6.1です。

## 記述されているファイル

該当の記述があるのは、lib\Cake\View\View.phpです。  
このファイルの500行目くらいにあるrenderLayoutメソッドです。

```php
public function renderLayout($content, $layout = null) {
    $layoutFileName = $this->_getLayoutFileName($layout);
    if (empty($layoutFileName)) {
        return $this->Blocks->get('content');
    }

    if (empty($content)) {
        $content = $this->Blocks->get('content');
    } else {
        $this->Blocks->set('content', $content);
    }
    $this->getEventManager()->dispatch(new CakeEvent('View.beforeLayout', $this, array($layoutFileName)));

    $scripts = implode("\n\t", $this->_scripts);
    $scripts .= $this->Blocks->get('meta') . $this->Blocks->get('css') . $this->Blocks->get('script');

    $this->viewVars = array_merge($this->viewVars, array(
        'content_for_layout' => $content,
        'scripts_for_layout' => $scripts,
    ));

    $title = $this->Blocks->get('title');
    if ($title === '') {
        if (isset($this->viewVars['title_for_layout'])) {
            $title = $this->viewVars['title_for_layout'];
        } else {
            $title = Inflector::humanize($this->viewPath);
        }
    }
    $this->viewVars['title_for_layout'] = $title;
    $this->Blocks->set('title', $title);

    $this->_currentType = self::TYPE_LAYOUT;
    $this->Blocks->set('content', $this->_render($layoutFileName));

    $this->getEventManager()->dispatch(new CakeEvent('View.afterLayout', $this, array($layoutFileName)));
    return $this->Blocks->get('content');
}
```

上記にある、$this->Blocks->setというメソッドがassignの役割を果たしています。
そもそもfetchとかassignはViewBlockの機能なのです。

このように定義されていることが分かったので良かったです。
OCamlでchar*を使うには

# 背景

ctypesでCのコードを呼び出す場合

# OCamlでの型指定

stringで良い。

node-ffiと同様でした。

# 関連記事

- [Mavericksにしたからかutopが動かなくなっていた #OCaml #opam #solved](http://abrakatabura.hatenablog.com/entry/2013/12/23/220415)
- [OCaml(OpenGL)で「プログラムでシダを描画する」を通して学んだことのまとめ](http://abrakatabura.hatenablog.com/entry/2014/07/03/064416)
- [OSXで最速でOCamlでPostgresqlに接続するには](http://abrakatabura.hatenablog.com/entry/2013/06/27/064038)
- [WindowsにOCaml入れようとしてocamlfindが動かない件](http://abrakatabura.hatenablog.com/entry/2017/05/02/072551)
- [Windowsで公式のOCamlをいれて、utop動かすところまで出来た](http://abrakatabura.hatenablog.com/entry/2017/05/04/074542)
- [Windowsでlablglを使う](http://abrakatabura.hatenablog.com/entry/2017/05/27/072722)
DataReader からクラスにマッピングのサンプル

#はじめに
[IEnumerable から IDataReader へ変換](http://qiita.com/st450/items/831d90990658e023a679)を作成していて、もっと簡単にデータを変換するためDataReaderから指定したクラスにデータを格納するクラスを作ると簡単にデータを変換できると考えサンプルを作成した。
DbExecutorも良かったが、直接クラスに格納した方が手間が省ける。
パラメータもDbExecutor のソースを読んで追加したり、nullの対応をすると便利なツールが作成出来そうだ。
#サンプルコード
```csharp
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.Data.SqlClient;
using System.Reflection;
using System.Threading.Tasks;
using SampleDataReader.Properties;

namespace SampleDataReader
{

    class DataReaderEnumerable<TSource> 
    {
        private readonly string _sql;
        private readonly string _connectString;
        private readonly List<PropertyInfo> listProp = new List<PropertyInfo>();

        public DataReaderEnumerable(string sql, string connectString)
        {
            _sql = sql;
            _connectString = connectString;
            foreach (var prop in typeof(TSource).GetProperties())
            {
                listProp.Add(prop);
            }
        }

        public IEnumerable<TSource> AsEnumerable()
        {
            using (var conn = new SqlConnection(_connectString))
            {
                conn.Open();
                var cmd = new SqlCommand(_sql, conn);
                using (var rd = cmd.ExecuteReader())
                {
                    while (rd.Read())
                    {
                        TSource cls = Activator.CreateInstance<TSource>();
                        foreach (var fld in listProp)
                            fld.SetValue(cls, rd[fld.Name]);
                        yield return cls;
                    }
                }
            }
        }
    }

    class SampleTable
    {
        public int Field1 { get; set; }
        public string Field2 { get; set; }
    }

    class Program
    {
        static void Main(string[] args)
        {

            string sql = "SELECT * FROM SampleTable";
            string constr = Settings.Default.xxxConnectionString;
            var cls = new DataReaderEnumerable<SampleTable>(sql, constr);
            foreach (var row in cls.AsEnumerable())
            {
                Console.WriteLine("{0} {1}", row.Field1, row.Field2);
            }

        }
    }
}```
MyBatisでMapperクラスを検索して、SqlSessionFactoryに追加する（ポエム）

## 1. やりたいこと

MyBatisでmybatis-config.xmlでmappersの設定を記述しないで、
実行時にMapperクラスを検索して、SqlSessionFactoryに追加したい。

(設定ファイルに記述できるならそうしたほうがいいです>_<
 諸事情により設定ファイルでないほうが良いと判断したためなのです)

## 2. バージョン

* Java 6 (今は2015年ですが何も聞かないでください；；)
* MyBatis 3.2.8

## 3. こうやった

手順的にはこんな感じです。
1. Mapperを表すアノテーションを作成
2. 1.のアノテーションが付与されたクラスを検索する
3. 2.の検索結果のクラスをSqlSessionFactory.getConfiguration().addMapper(Class<T> type)に渡して追加する

コードはこんな感じです。

1.のMapperを表すアノテーションはこれだけ。。

```java:Mapper.java
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface Mapper {
}
```

2.の検索するところは、MyBatisにResolverUtilというユーティリティにそのまんまのメソッドがあったのでそれを利用です。

```java:App.java
// 検索して追加するところだけ抜粋です
// packageName は検索対象のパッケージ名の配列です
ResolverUtil<Class<?>> resolverUtil = new ResolverUtil<Class<?>>();
resolverUtil.findAnnotated(Mapper.class, packageName);
for (Class<?> clazz : resolverUtil.getClasses()) {
    sqlSessionFactory.getConfiguration().addMapper(clazz);
}
```

## 4. おわりに

mybatis-config.xmlに設定したらいいと思います；；

spring-mybatisはまだ触ってないので、これから触ろうと思います>_<
Alfred 2からLogophileと研究社辞書アプリと辞書.appを串刺し検索する

注: Yosemiteから、Cocoa APIにアクセスするためのRuby 1.8がMacから撤去されてしまったので、以下のworkflowはYosemite以降では動作しません。その代わりJXAというJavaScriptベースのスクリプト環境がMacに追加され、そこからならCocoa API にアクセスできるようになったとのことです。そのうち https://github.com/dtinth/JXA-Cookbook/wiki あたりを参考にしてJSベースで作り直すかもしれません。

[Alfred 2からLogophileを検索するworkflow](http![step2.png](https://qiita-image-store.s3.amazonaws.com/0/20266/f41f9de5-14bd-8be0-f7b1-360a686e88be.png)
://qiita.com/hachi8833/items/476923bd548c305cdd88)の続編。

Alfred 2 から Logophile の英語辞典を検索できるようになって非常に快適になった。

しかし LogoVista とかいう会社が出している研究社の英語辞典シリーズは辞典ごとに独立したアプリケーションになっていて、同じ会社の辞書同士をまとめて串刺し検索することすらできない。辞書データをLogophile にインポートすることもできない。今時こんな20世紀の商売は許しがたい。

そんな辞書を 2 冊も買ってしまった以上せめて Alfred 2 から Logophile と同時にこれらの辞書を呼び出して見かけ上の串刺し検索を実現することにする。ライセンス的にも合法のはず。

追記: せっかくなので、Mac OSに備え付けの辞書.appも一緒に串刺し表示できるようにしてみた。

# Alfred 2 からの串刺し呼び出しを実現

[Alfred 2](http://www.alfredapp.com/) と有料の[PowerPack](http://www.alfredapp.com/powerpack/)、そして有料の [Logophile](http://dicwizard.jp/logophile/) が Mac にインストールされていることが前提。

- LogoVista の辞書アプリを App Store で購入・インストールしたら、コントロールパネルの [キーボード] > [ショートカット] > [サービス] を開き、アプリで検索する項目のチェックボックスをオンにする。
 
![step1.png](https://qiita-image-store.s3.amazonaws.com/0/20266/9ea11d25-88fd-818c-41ce-4247ba69c97b.png)

これで [サービス] メニューに辞書アプリで検索する項目が追加される。

![step2.png](https://qiita-image-store.s3.amazonaws.com/0/20266/6b4bf2a8-a24c-1a1f-b966-a61de32e6343.png)

- 拙作 [Logophile.workflow](https://github.com/hachi8833/workflow_logophile/blob/master/Logophile.alfredworkflow)ページの [View Raw] をクリックし、ワークフローをダウンロードする。これをダブルクリックしてワークフローをインストールする。

- 一応この時点で動作を確認しておく。`?`の後に続けて語を入力するとLogophileが起動して語が検索される。

![step2-1.png](https://qiita-image-store.s3.amazonaws.com/0/20266/89f12d84-427c-2dcb-80f6-8d041375264e.png)


- Alfred 2の設定画面でLogophileワークフローを開く。最初は右の [Run NSAppleScript] がひとつしかない状態なので、これをクリックしてコピー・貼り付けすることでこのスクリプトを複製する。今回は辞書を3つ追加するので3回複製した (下図では2回しか複製していないが)。

![step3.png](https://qiita-image-store.s3.amazonaws.com/0/20266/131430ee-1c27-c146-bdb7-66a038d69609.png)

- [Run NSAppleScript]を複製したら、[Keyword]から線をドラッグしてつなぐ。ちなみに[Run NSAppleScript]は上から順に実行される。自分はLogophile呼び出しを一番下に置いた。

- 複製した[Run NSAppleScript]をダブルクリックして開き、下の図で選択されている部分をサービスメニュー項目に置き換えればよい。

![step4.png](https://qiita-image-store.s3.amazonaws.com/0/20266/242cdc6a-c5e8-0a49-c462-426f21d7cf6e.png)

- ここでひとつ罠があるので注意。実は上で置き換えるサービス項目名は**英語版**のそれでなければならないのだ。日本語表示のサービス項目名を一生懸命入力してもピクリとも動いてくれない。英語版のサービス名を知るには、何でもよいのでメニューが英語のアプリケーションを起動し、`Services`メニューを見てみる。以下はiTermで確認した例。`makeReferenceToLVEDKENCOLLO.MAS`などというおぞましい名前になっているが、これがAppleScript的に正式な名前だったりする。

![step5.png](https://qiita-image-store.s3.amazonaws.com/0/20266/53192a65-25c7-fee8-4f8c-b1e33aa14c4b.png)

- これを[Run NSAppleScript]の2行目に以下のように反映してSaveすれば、めでたく動くようになる。

![step6.png](https://qiita-image-store.s3.amazonaws.com/0/20266/0f95f9fb-18dc-c1b5-1c35-752bcdbb951f.png)

- (追伸)同じ要領でMac OSの辞書.appも串刺し検索表示の仲間に加えることができる。先に答えを書いてしまうとサービス名は`Look Up in Dictionary`とすればよい。

![step8.png](https://qiita-image-store.s3.amazonaws.com/0/20266/243e1c12-e774-7e24-3f9f-414f2f5f8652.png)

以下は実行例。

![bloggif_54df15e220dcb.gif](https://qiita-image-store.s3.amazonaws.com/0/20266/5dff23ac-4247-0868-c950-cce46068bf22.gif)
OS XでGNATをインストールする方法

備忘録として、技術記事はHow toではなくWhy toで書けと言われましたが、How toで書きます。

Adaが何たるかは常日頃かAdaにお世話になってる日本人なら説明の必要は無いと思うので割愛します。

それではGNATをインストールしていきましょう

#### 環境/今回インストールしたもの

* OS X 10.8.5
* GNAT Ada GPL 2014

#### ダウンロードする

GNATはGCCに含まれるAdaのコンパイラですが、何故かbrewでインストールしたgcc4.9.0には含まれておらず、brewでもgnatはインストール出来ないようなので頑張ってインストールする必要がある

 [Adacore](http://libre.adacore.com)からGNAT GPL editionをダウンロードする。

適当な場所に広げる。

#### インストールする

続いてはインストール

```bash
$ cd
$ tar zxvf ~/Downloads/gnat-gpl-2014-x86_64-darwin-bin.tar.gz
$ cd gnat-gpl-2014-x86_64-darwin-bin
$ sudo ./doinstall
```

として10分ほど待つとインストールが完了する。

まだPATHが通っていないためコマンドが使えない


#### PATHを通す

~/.bash_profileかどこかに

```bash
PATH="/usr/local/gnat/bin:$PATH"
```

と記述して

```bash
source ~/.bash_profile
```

とするとPATHが通りつかえるようになる

#### 終わり

これで潜水艦を開発する第一歩を踏み出すことができました。
GentooのUSEフラグを縦に表示するワンライナー

emerge --info からUSEフラグの行をgrepして、xargsで縦表示に変換します。

```bash
emerge --info 2>/dev/null | grep USE= | sed 's/^USE="//' | sed 's/"$//' | xargs -n 1
```

こうするとgrepしやすいです。
wzrd - もっとも簡単なフロントエンドの為のbrowserifyサーバー


## よくある問題

こういうディレクトリ構造で(単純化してます)

```
index.html
index.coffee # bundle.jsにコンパイルされる
bundle.js
```

index.coffeeを起点に、browserifyでjsに変形しつつbundle.jsに結合していたとします。
で、index.htmlは `<script src="bundle.js"></script>` で読み込んでるはず。


たぶん、こういう感じに実行していると思います

```shell
browserify -t coffeeify --extension=".coffee" index.coffee > bundle.js
```

このとき、.gitignore書いたり毎回ビルドしてブラウザのリロードの前にbundle.js管理するの面倒くさいですよね。

(注意: この例ではcoffeeifyを使うのでnpm install coffeeify が必要です)

## Wzrdを使う

[maxogden/wzrd](https://github.com/maxogden/wzrd "maxogden/wzrd")

```
npm install wzrd -g
```

wzrdはパス解決時にbrowserifyによるビルド結果を返す簡易アセットサーバーを建てます。

```shell
browserify -t coffeeify --extension=".coffee" index.coffee > bundle.js
```


だと、次のようになります。

```
$ wzrd index.coffee:bundle.js -- -t coffeeify --extension=".coffee"
server started at http://localhost:9966
```

http://localhost:9966/index.html を開くと, bundle.jsを読みに行った時にbrowserifyで実行した結果を返してくれます。

## 何が嬉しいの

ファイル監視じゃなくてブラウザリロード時に読み込み直してるのがポイント。

`index.html` `index.coffee` `package.json` のミニマムスタートができて自分は非常に嬉しい。webpackはどうも設定が増えてごてごてしていく。


というわけで最小のフロントエンドプロジェクトテンプレートを作ってみた [mizchi-sandbox/minskl](https://github.com/mizchi-sandbox/minskl "mizchi-sandbox/minskl")


それではよきフロントエンドを。
Goのinterfaceと他の言語（Swift/ObjC/Java/PHP）での（明示的）実装方法

Goではインターフェース型で実装された関数を全て実装すれば、その型で振舞うことができます。

ダック・タイピングなアプローチができるので、これが扱えるのと扱えないのではコードに差が出てくるなと感じます。

一旦慣れてしまえば簡単に使えるのですが、わからない人向けに感覚値として掴んでもらえればと思って明示的な方法でインターフェースの実装を他の言語に置き換えています。

https://github.com/kaneshin/sample-interfaces

- [Go](https://github.com/kaneshin/sample-interfaces/blob/master/main.go)
- [Swift](https://github.com/kaneshin/sample-interfaces/blob/master/main.swift)
- [Objective-C](https://github.com/kaneshin/sample-interfaces/blob/master/main.m)
- [Java](https://github.com/kaneshin/sample-interfaces/blob/master/main.java)
- [PHP](https://github.com/kaneshin/sample-interfaces/blob/master/main.php)

Goのファイルに関して、今回はインターフェースを埋め込んでいるため、仮に`Sounds`関数を実装していなくてもビルドが通ります。

ですが、もちろんのこと実装していないため、ランタイムエラーとなります。

そこの違いもいろいろ触ってもらえればと。（ビルドエラーかランタイムエラーか、実装変えるとどうなるかなどなど）


一部だけ解説します。

Goでは宣言したinterfaceの実装さえされていれば、その型で振舞われるため、わざわざインターフェースを埋め込まなくてもよいです。
よくわからないければ、作り手の意思としてチョイスする感じでよいかと。（適当）

```go
package main

import "fmt"

type Animal interface {
	sounds() string
}

type Cat struct {
	Animal
	Name string
}

func (c Cat) sounds() string {
	return "Meow"
}

func call(a Animal) {
	fmt.Println(a.sounds())
}

func main() {
	cat := Cat{Name: "NyanCat"}
	call(cat)
}
```

Swiftのprotocolでは、Objective-C時代にあった`@optional`にあたるものがなくなりました。

そのため、protocol実装されたオブジェクトに関して必ず実装する必要があるため、ランタイムエラーとなり得る実装は無理な気がしました。柔軟ではないですね。（さすが堅牢をうたっているだけある（褒めてます。褒めてます。

```swift

protocol Animal {
    func sounds() -> String
}

struct Cat: Animal {
    var name: String

    init(name: String) {
        self.name = name
    }

    func sounds() -> String {
        return "Meow"
    }
}

func call(a : Animal) {
    println(a.sounds())
}

func main() {
    var cat = Cat(name: "NyanCat")
    call(cat)
}

main()
```

Objective-Cには`@optional`があるため、`- (NSString *)sounds;`を実装しなくてもビルドが通ります。
が、もちろんメソッドがない場合はランタイムエラーとなります。

```objc
#import <Foundation/Foundation.h>

@protocol Animal
@optional
- (NSString *)sounds;
@end

@interface Cat : NSObject <Animal>
@property (nonatomic, strong) NSString *name;
@end

@implementation Cat
- (NSString *)sounds {
    return @"Meow";
}
@end

void call(NSObject<Animal> *a) {
    printf("%s\n", [[a sounds] UTF8String]);
}

int main(int argc, char *argv[])
{
    Cat *cat = [Cat new];
    cat.name = @"NyanCat";
    call(cat);
    return 0;
}
```
phpでmecabを使う手順

## mecabをlinuxにインストール

```shell-session
sudo yum install gcc-c++
cd /tmp
wget https://mecab.googlecode.com/files/mecab-0.996.tar.gz
tar zxfv mecab-0.996.tar.gz
cd mecab-0.996
sudo ./configure --enable-utf8-only
sudo make
sudo make install

```

## 辞書のインストール

```shell-session
wget https://mecab.googlecode.com/files/mecab-ipadic-2.7.0-20070801.tar.gz
tar zxfv mecab-ipadic-2.7.0-20070801.tar.gz
cd mecab-ipadic-2.7.0-20070801
sudo ./configure --with-charset=utf8
sudo make
sudo make install
```

## 動作確認

```shell-session
mecab
すもももももももものうち
```

下記のようになっていればOK。

```shell-session
すもも  名詞,一般,*,*,*,*,すもも,スモモ,スモモ
も      助詞,係助詞,*,*,*,*,も,モ,モ
もも    名詞,一般,*,*,*,*,もも,モモ,モモ
も      助詞,係助詞,*,*,*,*,も,モ,モ
もも    名詞,一般,*,*,*,*,もも,モモ,モモ
の      助詞,連体化,*,*,*,*,の,ノ,ノ
うち    名詞,非自立,副詞可能,*,*,*,うち,ウチ,ウチ
```

## phpにmecabモジュールを入れる

* php-mecabのインストール

```shell-session
cd /tmp
wget https://github.com/rsky/php-mecab/archive/master.zip
unzip master.zip
cd php-mecab-master/mecab
phpize
sudo ./configure
sudo ./configure --with-php-config=/usr/bin/php-config --with-mecab=/usr/local/bin/mecab-config
sudo make
sudo make install
```

* シンボリックリンクの作成

```shell-session
sudo ln -s /usr/lib64/php/modules/mecab.so /etc/php.d
```

* php.iniの編集

```shell-session
vim /etc/php.ini
```

```vim:/etc/php.ini
 ;;;;;;;;;;;;;;;;;;;;;;
 ; Dynamic Extensions ;
 ;;;;;;;;;;;;;;;;;;;;;;

 ; If you wish to have an extension loaded automatically, use the following
 ; syntax:
 ;
 ;   extension=modulename.extension
 ;
 ; For example, on Windows:
 ;
 ;   extension=msql.dll
 ;
 ; ... or under UNIX:
 ;
 ;   extension=msql.so
 ;
 ; ... or with a path:
 ;
 ;   extension=/path/to/extension/msql.so
 ;
 ; If you only provide the name of the extension, PHP will look for it in its
 ; default extension directory.

 ;;;;
 ; Note: packaged extension modules are now loaded via the .ini files
 ; found in the directory /etc/php.d; these are loaded by default.
 ;;;;

 extension=mecab.so

```

* apacheの再起動

```shell-session
service httpd restart
```

* 動作確認

```

php -r 'phpinfo();' | grep 'mecab' -i　

```

以下のようになっていれば問題ない。

```
mecab
MeCab Support => enabled
MeCab Library => 0.996 => 0.996
mecab.default_dicdir => no value => no value
mecab.default_rcfile => no value => no value
mecab.default_userdic => no value => no value
```
Amazon RDSのDBインスタンスにリモートログイン


Amazon RDSでデータベースインスタンスが変わるごとに接続URLが変わるが、その度にいちいち接続スクリプトを書き直すわけにはいかないので自動化。

1. 自分の手元PCにaws-cliとjqをインストール。
2. DBインスタンスに紐づいているセキュリティ・グループのInbound設定のカスタムIPの欄に自分の手元PCのIPアドレスを追加して、リモートアクセスできるようにする。
3. 下記スクリプトを手元PCの任意のフォルダに作成して、実行権限をつける`chmod +x rdslogin.sh`。

```sh:rdslogin.sh
#!/bin/sh
eval `aws rds describe-db-instances | jq -c '.DBInstances[] | .Endpoint | "mysql -h \(.Address) -P \(.Port) -u <db-user-name> -p<password>"' | tr '"' '\0'`
```

4../rdslogin.shしてパスワードを入力すると、AWSのデータベースサーバにログインするコード
`mysql -h somerandomstrings.us-east-1.rds.amazonaws.com -P 3306 -u <db-user-name> -p<password>`
を作って実行してくれる。
`aws rds describe-db-instances`で取得できるRDSインスタンス情報のJSONの中から接続に必要なURL等をjqで抜き出している。

例えば、MySQLのユーザー名がroot、パスワードがpasswordなら、スクリプトは

```sh:rdslogin.sh
#!/bin/sh
eval `aws rds describe-db-instances | jq -c '.DBInstances[] | .Endpoint | "mysql -h \(.Address) -P \(.Port) -u root -ppassword"' | tr '"' '\0'`
```

RDSインスタンスが単一の場合を想定しています。インスタンスが複数ある場合はjqによるJSONのパースの部分の修正が必要です。
PyCharmでPyQGISをごにょごにょ

デバッグに関しては有償パッケージでないとできないそうなので
[PyCharmを使ったQGIS Pluginのデバッグ方法](http://d.hatena.ne.jp/tmizu23/20131217/1387263503)

とりあえず、開発環境の構築といいますか、IDEでpyqgis使いたいです、といったお話。

**Eclipse使えばいいじゃん。**

#<font color=red>そんな言葉は聞きたくない！！</font>

最初は[ここ](http://nathanw.net/2014/05/10/setting-up-pycharm-for-pyqgis-and-qt/)を参考にさせてもらってたんだけど、うまくいかなくてう～ん・・・う～ん・・・悩んでたら、やっぱり同じような人はいるようで

[Setting up pycharm and pyqgis](http://gis.stackexchange.com/questions/116767/setting-up-pycharm-and-pyqgis
)

上のリンクの手助けしてくれた人が案内してくれている[サイト](http://spatialgalaxy.net/2014/10/09/a-quick-guide-to-getting-started-with-pyqgis-on-windows/)をなめていたらそれっぽい感じになったのでいいかな、と。

![pyqgis.jpg](https://qiita-image-store.s3.amazonaws.com/0/59288/440ffd9d-78c1-3e57-7c6c-298873b9c2ac.jpeg)

手順は・・・上のリンクを参考にしてね（てへぺろ
railsでテーブルの確認

```
$ sqlite3 db/development.sqlite3
```
で開発用のデータベースに入る

```
> .tables
```
でテーブルの一覧を表示

```:表示例
posts              schema_migrations
```

データ構造は.schemaを使う

```
> .schema posts
```

```sql:表示例
CREATE TABLE "posts" ("id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "body" text, "created_at" datetime NOT NULL, "updated_at" datetime NOT NULL);
```
【CSS】要素を横に並べる

liやdivを横に並べる方法。

```html:対象のhtml
<div class='box'>box</div>
<div class='box'>box</div>
<div class='box'>box</div>

<div class='after'>after</div>
```

##floatを使う方法
floatして、clearで回り込みを消す。

```css:css
.box{
 float: left;
 width: 200px;
}
.after{
 clear:both;
}
```

##inline-blockを使う方法

```css:css
.box{
 display: inline-block;
 width: 200px;
}

```

参考：[inline-blockで作るレイアウト](http://ja.learnlayout.com/inline-block-layout.html)
【Googleスプレッドシート】プルダウンでリストを作る

スプレッドシートでプルダウンからアイテムを指定したいときどうすればいいのかメモ。

1. プルダウンを使いたいセルに移動
2. データ＞確認…をクリック
3. 条件を「リストで直接指定」に変更
4. 条件の横のセルにアイテムの一覧を半角カンマ区切りで入力し、保存
vmware-modulesのパッチ

Linuxのカーネルを3.19.0にしたらvmware-modulesがコンパイルできなくなってしまいました。

ということでパッチを作って使っています。Funtoo Linuxですが、Gentooでも使えるのかなと思っています。

vmware-moduleの279.3-r1用です。ローカルオーバーレイを作るか
epatchを使ってあててみて下さい。

[vmware-modules patches for Funtoo(Gentoo?) GNU/Linux Kernel 3.19.0 | 現状有姿](http://keiblo.com/archives/1165)
tarのオプションをまとめる

よく使う"tar zcvf"/"tar zxvf"以外、すぐ忘れてしまうので、まとめておく。

勝手なカテゴリ分けしてます。。。

## はじめに
最近のtarを使う場合、単純な書庫作成/展開に関しては、それぞれオプションをひとつ覚えておけばいい。

* 書庫作成時：`acvf`
* 書庫展開時：`xvf`

それぞれのオプションの意味は、以下を参照してください。

## オプション
### 制御オプション

| オプション | 意味                |
|:---------:|:-------------------|
| c         | 書庫を作成する(tarファイルを作る) |
| x         | 書庫からファイルを取り出す(tarファイルを展開する) |
| t         | 書庫のファイルを表示する(tarのファイルリストを表示する)|

### ファイルオプション

| オプション | 意味                |
|:---------:|:-------------------|
| f         | 指定したファイル名を使用する |

### 圧縮方式
最近のtarを使う場合、展開時は何も付けなくて良い
書庫作成時は、`-a`オプションを付けておけば拡張子から自動判別してくれる。

| オプション | 意味                    | 拡張子  |
|:---------:|:-----------------------|:------:|
| a         |圧縮形式を拡張子から自動認識しちゃう | - |
| z         |gzipを通し処理する        |.gz     |
| j         |bzip2を通して処理する　   |.bg2 |
| J         |xz compressを通し処理する|.xz  |

皆様のご指摘を反映(2015/2/18)
ありがとうございました！

### その他

| オプション | 意味                |
|:---------:|:-------------------|
| v         | 処理したファイルの一覧を表示する(verbose) |

## 凡例

* 拡張子から圧縮形式を自動判別し、書庫を作成する。

`tar acvf hoge.tar.gz ./hoge`
`tar acvf hoge.tar.gz ./hoge`
`tar acvf hoge.tar.gz ./hoge`

* 拡張子から圧縮形式を自動判別し、書庫を展開する

`tar acvf hoge.tar.gz`
`tar acvf hoge.tar.gz`
`tar acvf hoge.tar.gz`

* tar.gzのファイルの書庫を作成する。

`tar zcvf hoge.tar.gz ./hoge`

* tar.bz2のファイルを展開する。

`tar jxvf hoge.tar.bz2`

* とにかく書庫を展開する。

`tar axvf hoge.tar.bz2`
[baserCMS]プラグインを用意せずにイベント処理を発動させる方法例


baserCMS（CakePHP）には、プラグイン側から、処理途中に別の処理を割り込ませるイベント処理を手軽に作って利用することができます。
そのイベント処理ですが、たまーにプラグインを作るまでもなく実行したい場面があります。
そんなときの方法をシェア。

## 環境

- baserCMS 3.0.6.1
- PHP 5.4.19


## イベント処理の作成
イベント処理自体がないのに、先にイベントを呼び出そうとするともちろんエラーになります。
そのため、先ずは先に利用したい処理を作成しておきます。

とりあえず startup() とか作って、適当な文字列をエコーさせておくとかのテスト書いて、処理が通ることから確認すると良いです。

ここでは以下にサンプル例載せておきます。
ブログコンテンツIDが1のカテゴリアーカイブを表示し、そのカテゴリ名が info の場合は、1ページの表示件数を強制的に1,000件にしてみました。
というサンプルです。

```php:/app/Event/HogeControllerEventListener.php
<?php
/**
 * [ControllerEventListener]
 *
 */
class HogeControllerEventListener extends BcControllerEventListener {
/**
 * 登録イベント
 *
 * @var array
 */
	public $events = array(
		'Blog.Blog.startup',
	);
	
/**
 * blogBlogStartup
 * ブログのカテゴリアーカイブ表示の際、指定カテゴリではページ分割を無効化する
 * 
 * @param CakeEvent $event
 */
	public function blogBlogStartup(CakeEvent $event) {
		// 管理側では無効
		if (BcUtil::isAdminSystem()) {
			return;
		}

		$Controller = $event->subject();
		// 対象とするブログコンテンツID以外では無効
		if (!in_array(Hash::get($Controller->blogContent, 'BlogContent.id'), array('1'))) {
			return;
		}
		// archives アクション以外では無効
		if (!in_array(Hash::get($Controller->request->params, 'action'), array('archives'))) {
			return;
		}
		// カテゴリに属する記事一覧表示画面以外では無効
		if (!in_array(Hash::get($Controller->request->params, 'pass.0'), array('category'))) {
			return;
		}
		// ブログカテゴリが info の場合に表示件数を切替える
		if (Hash::get($Controller->request->params, 'pass.1') == 'info') {
			$Controller->blogContent['BlogContent']['list_count'] = 1000;
		}
	}

}
```


## イベント処理の追加
イベントが発動できるように、処理したいイベントリスナーをアタッチ（取り付け）します。
記述箇所は「/app/Config/bootstrap.php」が良さそうです。
「Attach Events」以下が追記した内容。

```php:/app/Config/bootstrap.php
<?php
// Attach Events
App::uses('HogeControllerEventListener', 'Event');
App::uses('CakeEventManager', 'Event');
CakeEventManager::instance()->attach(new HogeControllerEventListener());
```


### 参考記事

- コールバックはもう古い！CakePHPのEventを使おう
http://blog.candycane.jp/%E3%83%96%E3%83%AD%E3%82%B0/2012/12/04/%25e3%2582%25b3%25e3%2583%25bc%25e3%2583%25ab%25e3%2583%2590%25e3%2583%2583%25e3%2582%25af%25e3%2581%25af%25e3%2582%2582%25e3%2581%2586%25e5%258f%25a4%25e3%2581%2584%25ef%25bc%2581cakephp%25e3%2581%25aeevent%25e3%2582%2592%25e4%25bd%25bf%25e3%2581%258a%25e3%2581%2586.html
- プラグイン開発について | baser CMS
http://basercms.net/manuals/3/programmers/4.html