OmniAICreator/Qiita-1.07M huggingface dataset:
はてなブックマークの複数のエントリーのコメントを同時進行でウォッチできるサービス「ブコメwatcher」をBackbone.jsで作成しました。

![main.png](https://qiita-image-store.s3.amazonaws.com/0/17021/9ac9c590-765d-e013-9406-1f156625a574.png)

まあ宣伝と言えば宣伝なんですけど、オープンソースかつクライアントサイドだけで動作するサーバー不要のアプリケーションなのでBackbone.jsのサンプルアプリ的な位置づけと考えてもらえればこれ幸いです。

* サイトはこちら <http://bucome-watcher.herokuapp.com/>
* ソースはこちら <https://github.com/ktty1220/bucome-watcher>

## で、まずこのアプリケーションの説明ですが

こちらの画面説明をご覧ください。3つのリストから構成されています。

![list.png](https://qiita-image-store.s3.amazonaws.com/0/17021/e495467d-dbd6-33fa-9e2a-16b67f64d0c6.png)

###  左: はてなブックマークホットエントリー一覧

はてなブックマークのホットエントリー一覧が表示されます。各エントリーにマウスカーソルを合わせると`ウォッチリストに追加`というボタンが表示されます。

このボタンを押すと中央のリスト(ウォッチリスト)にエントリーが追加されて、一定間隔で新着コメントがあるかどうかチェックします。

また、エントリーのタイトルにマウスカーソルを合わせると、記事の概要がツールチップで表示されます。

![point1.png](https://qiita-image-store.s3.amazonaws.com/0/17021/23d44b37-da4b-0d42-f63b-ec4471746dc6.png)

### 中央: ウォッチリスト

一定間隔で新着コメントをチェックする対象のエントリー一覧です。各エントリーにマウスカーソルを合わせると`コメント一覧`というボタンが表示されます。

このボタンを押すと右のリスト(コメントリスト)にそのエントリーについたコメントの一覧を見ることができます。

新着コメントがあった場合にはエントリーの右下に赤いマークで新着コメント数が表示されます。

![point2.png](https://qiita-image-store.s3.amazonaws.com/0/17021/d00f424a-262c-b5d2-c0b6-2fb7c52b72fa.png)

### 右: コメントリスト

ウォッチリストで選択したエントリーのコメント一覧を表示します。新着コメントには色が付きます。

このように、Twitterのタイムラインのような感覚ではてなブックマークのコメントを見ることができます。

### ウオッチリストの情報保存先

ウォッチリストに登録したエントリーはブラウザのローカルストレージに保存されます。したがって一旦ブラウザを閉じて開き直したり、リロードしたりしてもウォッチリストの情報は消えません。

ウォッチリスト上部のウォッチリスト消去ボタンを押すと登録されているウォッチリストとローカルストレージがクリアされます。

なお、ブラウザにデータを保存するため、デバイス間でのウォッチリストの共有はできません。

## ここから技術的な話

各リストの制御はBackbone.jsで行っています。また、はてなブックマークの情報はRSSとはてなブックマークAPIを使用しています。クロスドメインのRSSを取得するにあたり、Google Feed APIを利用しています。

Backbone.jsに興味があってアプリケーションとして形になっているサンプルが欲しい、という方にとっては丁度良い規模のサンプルになるかな、と(ソースはCoffeeScriptで書いているのでCoffeeScriptに慣れていないとちょっと面倒かもしれませんが)。コメントも多めに入れてあるので参考になれば、と思います。

ただ、自分自身もBackbone.jsを使ったのは初めて(しかも1週間くらい前から)なので、調査不足による妥協でショボい書き方をしている部分も多々あると思います。その点はご容赦を。

また、アプリケーション自体についてもご意見・ご感想・ご要望・バグ指摘などお待ちしています。もちろん改造してもっと便利にしたり(スマホ対応するとか)、亜種を作成してもらっても構いません。

## 申し訳程度にTipsを

### 1. XML要素の取得

今回Google Feed APIを使用して遭遇したのですが、XMLの情報を取得するときに`dc:date`みたいな要素はそのまま指定しても取得できませんでした。しかもブラウザによって取得方法が異なっていたのでメモっときます。

* Google Chromeの場合

    `date`だけで取得できます。下記のIE、Firefoxのような指定をすると取得できません。

* IE、Firefoxの場合

    `dc\\\\:date`というようにコロンの前にバックスラッシュを2つ付ける必要があります。`date`だけでは取得できません。

今回はブラウザによる判別ではなく、両方試してどちらかで取れたらOKみたいなやり方で取得しています。

### 2. Googleから返されるRSSフィードが古い

おそらく、Google側のサーバーで取得したRSSのキャッシュ期間を設けているのだろうけど、このキャッシュ期間がすごく長いっぽい(1時間くらい？)

回避方法としては、Google Feed APIを呼び出すときにURLパラメータにタイムスタンプ的なものを付加すれば強制的にキャッシュを無効にして最新の情報を取得できます(jQueryの$.ajaxが自動的に付加してくれるやつみたいなの)。

ただ、毎回アクセス時にキャッシュを無効にするのもGoogleさんの負担が大きくなりそうなので、今回はこのダミーパラメータの作り方を工夫して5分間はキャッシュされるようにしています。

以上、小ネタでした。
Fluentdで集めた、Nginxのログを、MongoDBのMapReduceを使ってアクセス解析入門！！


キーワード入れ込みまくった感がすごいですが
やりたかったことは、Nginxのログを、mongoに格納
そしてそのデータをmongoのMapReduceを使って解析するという事です。

今回はサンプルに、http status codeの集計をします。

### 前提として
MongoDB導入済み
Nginxのログ格納済み

database: nginx
collection: access

なので、Fluentdとかは今回話題に出て来ません。むしろnginxも不要かも知れません。

・・・よし、一旦不要にします。

### 改めて前提として
Mongodb導入済み

```bash
use nginx
db.access.save({status:200});
db.access.save({status:200});
db.access.save({status:200});
db.access.save({status:200});
db.access.save({status:300});
db.access.save({status:400});
db.access.save({test:123});

db.access.find();
{ "_id" : ObjectId("51b9ffe092e0e471137ad2f2"), "status" : 200 }
{ "_id" : ObjectId("51b9ffe092e0e471137ad2f3"), "status" : 200 }
{ "_id" : ObjectId("51b9ffe092e0e471137ad2f4"), "status" : 200 }
{ "_id" : ObjectId("51b9ffe092e0e471137ad2f5"), "status" : 200 }
{ "_id" : ObjectId("51b9ffe092e0e471137ad2f6"), "status" : 300 }
{ "_id" : ObjectId("51b9ffe092e0e471137ad2f7"), "status" : 400 }
{ "_id" : ObjectId("51b9ffe192e0e471137ad2f8"), "test" : 123 }
```
こんな状況です。この量のままだと見てわかるけど、増えたら面倒
では、コード毎にカウントしようそうしよう

{200:4},{300:1},{400:1}とかだと嬉しいな

では、進めます。

mongoには外部ファイル実行する機能がありますので

```log.js
var colName = 'access.status';

var map = function() {
  var label = String(this.status);

  emit(
    label,
    {count: 1}
  );
}

//簡単に言うと、
//keyには200
//valuesには[{count:1},{count:1},{count:1}]
//と言った感じでデータが渡ってきてカウントアップしてる感じです。
var reduce = function(key, values) {
  var result = {count: 0};

  values.forEach(function(value) {
    result.count += value.count;
  });

  return result; 
}


mongo = new Mongo('localhost');
mydb = mongo.getDB('nginx');

var res = mydb.access.mapReduce(map, reduce, {out: colName});

shellPrint(res);
```

### Map MapReduceを登録

```bash
$ mongo log.js
MongoDB shell version: 2.4.0
connecting to: test
{
        "result" : "access.status",
        "timeMillis" : 1080,
        "counts" : {
                "input" : 7,
                "emit" : 7,
                "reduce" : 1,
                "output" : 4
        },
        "ok" : 1,
}
```

### では、処理を実行してみましょう！！

```bash
$ mongo
MongoDB shell version: 2.4.0
connecting to: test
> use nginx
switched to db nginx
> db.access.status.find();
{ "_id" : "200", "value" : { "count" : 4 } }
{ "_id" : "300", "value" : { "count" : 1 } }
{ "_id" : "400", "value" : { "count" : 1 } }
{ "_id" : "undefined", "value" : { "count" : 1 } }
```

このような感じで、
200が4
300が1
400が1
statusなしが1
という結果を得る事ができました。
Chocolatey NuGetの導入

http://chocolatey.org/
Windos向けの良いパッケージ管理があったので導入

このパッケージ管理自体のインストールは

1. サイトを開いて中段のコマンド文字列をコピー
1. Windowsのcmd.exeを実行してそのまま文字列を貼り付けして実行

パッケージのインストールは`cinst package_name`をコマンドプロンプトで実行すれば行われる

パッケージの一覧はサイト上の http://chocolatey.org/packages にあって検索できる。
例えば自分のPCに入っているソフトを例にすると

```bat:
cinst ruby
cinst vagrant
cinst notepadplusplus
cinst vim
cinst firefox
cinst GoogleChrome
```

上記は既にパッケージにあったのでコマンドを叩けばインストールできる。UACのプロンプトが出ることがあるので注意すること。

パッケージを削除する場合は`cuninst package_name`。自分の環境でFoxitReaderを入れてみた際はコントロールパネル側でもアンインストールが出来た。
必要悪の preserving 

# Boo のスコープ

Boo には言語コアな機能として、（メソッド内などで）ローカルスコープを導入する方法がありません。

例えば、C++やJavaなんて方面の言語は { } を使って、次のようにローカルスコープを導入できます。

```cpp:
int a = 5;
if ... {
   int a = 3;  // シャドウイング。外側の a とは違う。
   int b = 9;
   cout << a << endl; // 3
}
cout << a << endl;  // 5
// cout << b << endl;  // コンパイルエラー。b は if の内側の変数。
```

Boo は、上記のC++コードを真似しても結果が違います。

```boo:
a as int = 5
if ...:
    # a as int = 3   # コンパイルエラー... ;_;
    a = 3
    b as int = 9
    print a   # 3
print a   # 3
print b   # 9 です。内側も外側もないです。
```

そこで、Boo には preserving というローカルスコープ「っぽいもの」を導入するマクロがあります。
これがスゲーかっこ悪い。

```boo:
a as int = 5
preserving a:   # このブロック抜けたら a の値が復帰する。
	# a as int = 3   # これはやっぱりコンパイルエラー
	a = 3
	print a   # 3
print a   # 5
```

超カッコ悪いです。なんか、preserving というマクロの後に保存する変数名書いたりするのが、php の無名関数で use とかわざわざ書かせているみたいです。

まぁ、ブロックにスコープ機能が無いので、次のような場合に１行得する、とかイマイチお得に感じられないメリットもあります。

```boo:
# if で分岐して変数 a に値設定。
# この行に a as int のような宣言が必要無い、という微妙なお得度。
if ....:
    a = 5  # Boo は代入が宣言を兼ねられる。これもばっちいですね。
else:
    a = 3
print a  # 分岐処理の結果
```

# preserving の正体

preserving は次のマクロです。もう想像通り。ソースは Boo 処理系の src/Boo.Lang.Extensions/Macros/PreservingMacro.boo から。

```boo
macro preserving:
	restoration = Block()    # 指定した変数を復帰する代入文を入れるブロック。
	for arg in preserving.Arguments:
		# テンポラリ変数を作って、指定した変数値を保存するコード展開
		temp = ReferenceExpression(Context.GetUniqueName("preserving"))
		yield [| $temp = $arg |]
		# 復帰ブロックに、保存した値を再代入するコード追加。
		restoration.Add([| $arg = $temp |])		
	yield [|
		try:
			$(preserving.Body)   # preserving の本体
		ensure:
			$restoration   # 本体の処理おわったら、復帰ブロック実行。
	|]
```

まぁ、この方法を拡張して、preserving のブロックをネストメソッド（Boo はメソッドの中でメソッドを定義できます）として定義すれば、それなりにちゃんとしたスコープを導入することはできます..。

でも、初めっからちゃんとコアな機能としてほしいよね...。

# 結論

Boo って結構汚い言語です。それが Boo クオリティ。

といいながら、この preserving はさすがに使ったことありません。
Heroku で bundle update した上で Pull Request させる


Heroku で bundle update した上で Pull Request させる？
---

先日RubyKaigi2013で @kyanny さんのお話を聞いて感銘を受けました。
お話されていた内容の詳細は下記URLで書かれています。

[RubyKaigi 2013 kyannys blog](http://blog.kyanny.me/entry/2013/06/02/RubyKaigi_2013)

この記事の中ではGemfileのアップデート作業はとても大事な仕事だと説明しています。
非常に共感したのでプライベートのプロジェクトでも導入したいなと思ったのでした。

ちなみにIncrementsは[Circle CIを導入している](http://qiita.com/items/924430ffa6f9fbea44c8)のでJenkinsに仕事をさせることはできません。

Jenkinsは導入していなくても、1日毎にpull requestを実行出来る環境があれば良いと考えたのでHerokuでできないか調べてみました。(テストはCircle CIやTravis CIのGIthub連携でやってくれる)

Herokuでもできた
---

Heorkuはappを作成後、デフォルトの.bundleディレクトリを用意するので、その挙動を回避してあげる事でHeroku内でリポジトリをcloneする事ができるようになります。

皆さんでも出来る様にプロジェクトにしてみたので、お試しください。
https://github.com/camelmasa/gemfile-monitor-heroku-app

shの中は簡単なコマンドになっているので、簡単に編集できます。

``` bash:gemfile-monitor.sh 

#!/bin/sh
SHELL=/bin/bash

# monitor github repository
repository='' # example. git@github.com:camelmasa/animate-rails.git

# repository
date=`date '+%Y-%m-%d'`
branch="update-gemfile-${date}"

mv bundle_config .bundle/config
git clone ${repository} repo
cd repo
git checkout -b ${branch}
bundle update
git add Gemfile.lock
git commit -m 'update Gemfile'
git push origin ${branch}
hub pull-request  ${branch}

```

pull requestはこんな感じで来ます。
![こんな感じ](https://qiita-image-store.s3.amazonaws.com/0/996/e29ace57-4a25-8b03-e9c8-83c278e848d6.jpeg)


注意点
---

注意点としては以下。

- 普段hubコマンドを使用している前提
- git cloneする際にパスワードを入力しなくても良いようにしないといけない
 - 秘密鍵/公開鍵を作成する際にパスワードを入力しない等
- 秘密鍵がHeroku上に存在することになる
- __gem sqliteを使用するリポジトリの場合、gem updateで失敗する__
 - 回避する方法があれば教えてほしいです ＞＜

まとめ
---

難点があるので小さなプロジェクトに向いているかもしれませんね。
フィードバックお待ちしてます :)
jQueryでチェックボックスのチェック状態を調べる方法

ブログに書いたよ。
<a href="http://d.hatena.ne.jp/replication/20130613/1371137959">jQueryでチェックボックスのチェック状態を調べる方法 - 大人になったら肺呼吸</a> <a href="http://b.hatena.ne.jp/entry/d.hatena.ne.jp/replication/20130613/1371137959"><img src="http://b.hatena.ne.jp/entry/image/http://d.hatena.ne.jp/replication/20130613/1371137959" alt="はてなブックマーク - jQueryでチェックボックスのチェック状態を調べる方法 - 大人になったら肺呼吸" border="0" /></a>
Windows Server 2008 R2 Datacenter に対する設定

最近Windows　VPSを借りてみました。
環境構築についてメモしていきます。

#1.Framework 3.5 SP1の構成について
###dotnetfx35.exeをダウンロードして、実行するとエラーになります。

####〔エラーメッセージ〕
「インストールするにはロール管理ツールを使用するか、または Microsoft .NET Framework 3.5 SP1 を構成します]

####〔対策〕
Windows Server 2008 R2に.NET Frameworkをインストールする場合には、
dotnetfx35setup.exeを実行するのではなく、管理ツールから「サーバーマネージャ」を起動し、
「役割の追加」で「アプリケーションサーバー」を選択し、「.NET Framework 3.5.1の機能」
を追加してください。

#2.FTPサーバーの構築について
###ファイルの転送の目的を実現するために、FTPサーバーを構築します。
ちょうどWeb上にこの情報があったので、これを参照してください。
http://www.ipentec.com/document/document.aspx?page=windows-server-2008-r2-ftp-server-install

#3.リモート接続用のソフトについて
・TeamViewerの使用
＞Windows Server 2008 R2にこのアプリをインストール。
＞クライアント側のPCにも入れます。
後はTeamViewerのIDとパスワードを使って簡単に接続できます。スピードはそこそこ早いです。
また、iPhoneにTeamViewerを入れるとiPhoneを使って、サーバーをコントロール可能です。

・Remote Desktop Connectionの使用
＞自分はMacAirにこれも入れて使っています。
RDC➡環境設定➡表示➡リモートデスクトップサイズで「全画面表示」を選択して使ってみると
楽しいです。コントロールの対象サーバーがまるで自分のローカルPCのように操作できます。
もちろんサーバー上のブラウザでサイトをアクセスすることもできますが、
自分のローカルマシンの方が早いので、それを使い分けると良いでしょう。

#4.Mac用FTPソフトについて
　Mac用のFTPソフトとしては以下のようなものがある。

FileZilla（https://filezilla-project.org/）
Mac OS X / Windows対応、フリーソフト、日本語対応、FTP/SFTP/FTPS

Cyberduck（http://cyberduck.ch/）
Mac OS X対応、フリーソフト、日本語対応、FTP/SFTP/FTPS

FireFTP（https://addons.mozilla.org/ja/firefox/addon/fireftp/）
Firefox のアドオン、フリーソフト、FTP/SFTP/FTPS

Fetch
Mac OS X対応、有料、日本語対応、FTP/SFTP/FTPS

Transmit
Mac OS X対応、有料、FTP/SFTP/FTPS

#5.Git Extensionsを利用する場合、Microsoft .NET Framework 4がいるため、下記のリンクからMicrosoft .NET Framework 4 (Web インストーラー) をダウンロードしてインストールします。インストール後6番従って、Gitをインストールする。Framework3.5のままでもインストール
できる方法もあるそうです。（http://stackoverflow.com/questions/7431943/install-gitextensions-on-a-machine-with-net-4-0-only）実証していないです。
http://www.microsoft.com/ja-jp/download/details.aspx?id=17851

#6.WindowsにGit環境をインストールする
ローカルマシンとサーバー間でソースの共有をしたいので、Gitを入れてみます。
参考になるサイトは下記の通りです。
http://codezine.jp/article/detail/7077

実際にやってみたところ、下記のサイトのBonobo Git Serverが提供しているツールが一番使いやすいです。
IISの中に入れて公開するだけで、httpプロトコルでソースを取得することがもちろん、pushもできます。
http://bonobogitserver.com/
URLから特定のパラメータの値をとりだす


http://~~~~?code=●●●●●●

↑の●●●を取り出す。


```slicePalamValue
slicePalamValue = function(url, key){
	return url.split(key+"=")[1].split("&")[0];
}

var url = http://aaaaaaaaa.com/code=ABCDEFG
console.log(slicePalamValue(url,"code")); //ABCDEFG
Engine Yard Cloud へデプロイした事を HipChat へ通知したい！


以下のように、デプロイをフックするスクリプトを用意して、リポジトリに commit & push しておくだけです。

* `AUTH_TOKEN` と `ROOM_ID` は自分の環境に合わせて変更して下さい。

```ruby:/deploy/after_restart.rb
require 'open-uri'

auth_token = 'AUTH_TOKEN'
room_id    = 'ROOM_ID'
from       = 'Engine Yard'
color      = 'purple'
notify     = 1
message    = "#{deployed_by} deployed a new version of #{app}: #{environment_name} (#{revision[0...6]})."

`curl -d "auth_token=#{auth_token}&room_id=#{room_id}&from=#{from}&color=#{color}&notify=#{notify}&message=#{message}" https://api.hipchat.com/v1/rooms/message`
```

## 利用可能な変数

スクリプトで利用可能な変数一覧は、以下のページに掲載されているので、
通知するメッセージは自由にカスタマイズする事が可能です。

* [Use Deploy Hooks : Engine Yard Developer Center](https://support.cloud.engineyard.com/entries/21016568-Use-Deploy-Hooks)

## HipChat の通知 API

API の詳細は、以下のページに掲載されています。

* [HipChat - API - rooms/message](https://www.hipchat.com/docs/api/method/rooms/message)

## あわせて読みたい

* [Engine Yard Cloudでデプロイした時Lingrに通知する - komagata](http://docs.komagata.org/5075)
* [hipchat/hipchat-rb · GitHub](https://github.com/hipchat/hipchat-rb#engine-yard)
【javascriptを使う人に知って貰いたい（エンジニア、デザイナ問わず）】karmaを使ったテスト駆動開発入門（ついでにJasmineも）

## Karmaって何？

簡単に言うとnode.jsで作成された、テスト実行環境
間違ってたら(m´・ω・｀)m ｺﾞﾒﾝ…

## Jasmineって何？

Karmaはあくまでの実行環境なので
テストの実処理を行うライブラリが必要
それがこれ
他にもmocha + (chai or expect)とかあるけど
とりあえず、今回はJasmine

## 能書きはいいから、実際の作業をはよ

以下の２つは、インストール済みである事。
* node
* npm

### ではでは

作業用ディレクトリ作成＆移動

```bash
$ mkdir -p karma/spec
$ mkdir -p karma/src
$ cd karma
```

グローバル領域にkarmaをインストール
※- gがないと動かない事が多いため、修正しました。

```bash
$ npm install -g karma
```

karma初期化

```bash
$ karma init

Which testing framework do you want to use ?
Press tab to list possible options. Enter to move to the next question.
> jasmine

Do you want to use Require.js ?
This will add Require.js adapter into files.
Press tab to list possible options. Enter to move to the next question.
> no

Do you want to capture a browser automatically ?
Press tab to list possible options. Enter empty string to move to the next question.
> Chrome
> 

Which files do you want to test ?
You can use glob patterns, eg. "js/*.js" or "test/**/*Spec.js".
Enter empty string to move to the next question.
> 

Any files you want to exclude ?
You can use glob patterns, eg. "**/*.swp".
Enter empty string to move to the next question.
> 

Do you want Testacular to watch all the files and run the tests on change ?
Press tab to list possible options.
> yes
```

karma.conf.jsってファイルが出来ました。

修正します。

```bash
$ vim karma.conf.js
```

```karma.conf.js
files: [
  'spec/*.js'
],
```


簡単なテストケースを作成します。

```bash
$ vim spec/HelloSpec.js
```

```spec/HelloSpec.js
/**
 * http://pivotal.github.io/jasmine/
 */
describe("Hello Test", function() {

  it("test", function() {
    var a = 'test1';//actual テストする値
    var e = 'test';//expect 期待値
    expect(a).toEqual(e);
  });
});
```

別ターミナルで次のコマンドを実行

```bash
$ cd work/karma
$ karma start karma.conf.js
````

するとbrowserが立ち上がり、ターミナルにテスト結果が！！

```bash
$ karma start karma.conf.js 
INFO [karma]: Karma server started at http://localhost:9876/
INFO [launcher]: Starting browser Chrome
INFO [Chrome 27.0 (Mac)]: Connected on socket id FqwLPzInsYRW6baEegdg
Chrome 27.0 (Mac) Hello Test test FAILED
	Expected 'test1' to equal 'test'.
	Error: Expected 'test1' to equal 'test'.
	    at null.<anonymous> (work/karma/spec/HelloSpec.js:9:15)
Chrome 27.0 (Mac): Executed 1 of 1 (1 FAILED) (0.107 secs / 0.02 secs)
```

テスト駆動開発は、まずはerrorを起こすことから始まります。
では、次はテストを成功させてみましょう。
karmaのいいところは、テストファイルを修正して、保存すれば
テストが実行されることです。

#監視最高！！！

では、修正

```spec/HelloSpec.js
/**
 * http://pivotal.github.io/jasmine/
 */
describe("Hello Test", function() {

  it("test", function() {
    var a = 'test';//actual テストする値
    var e = 'test';//expect 期待値
    expect(a).toEqual(e);
  });
});
```

今回は、var aの値を変更しました。
これで、a = eとなります。
そして、karmaを実行したターミナルを見ると

```bash
INFO [watcher]: Changed file "/work/karma/spec/HelloSpec.js".
Chrome 27.0 (Mac): Executed 1 of 1 SUCCESS (0.293 secs / 0.011 secs)
```

#SUCCESS

Javascriptでのテストをもっと流行らせたいです。J

# 参考
Karma 公式ページ
http://karma-runner.github.io/0.8/index.html

Jasmine コマンド一覧
http://pivotal.github.io/jasmine/
if文をきれいに書く方法


kotaziです。
- [kotazi.com](http://kotazi.com)


##速度記号を返す関数(getDaCapo)
*****************************************

よくあるif文で書く。

```JavaScript:dacapo.js

var getDaCapo = function(tempo) {
  var dacapo = null;
  
  if(tempo < 30) {
    //error
  }else if(tempo >= 30 && tempo < 60) {
    dacapo = "largo";
  }else if(tempo >= 60 && tempo < 66){
    dacapo = "larghetto";
  }else if(tempo >= 66 && tempo < 76){
    dacapo = "adagio";
  }else if(tempo >= 76 && tempo < 108){
    dacapo = "andante";
  }else if(tempo >= 108 && tempo < 120){
    dacapo = "moderato";
  }else if(tempo >= 120 && tempo < 168){
    dacapo = "allegro";
  }else if(tempo >= 168 && tempo < 200){
    dacapo = "presto";
  }else if(tempo >= 200 && tempo < 300){
    dacapo = "prestissimo";
  }else{
    //error
  }
};
```

上記の場合、条件文が直感的に分かりにくい。



そのため、以下のように
return値で値を返すようにすると、
パッと見て何が書いてあるかを理解しやすくなる。


```JavaScript:dacapo.js


var getDaCapo = function(tempo) {
  var dacapo = null;

  if(tempo < 30) {
    //error
    return;
  }
  if(tempo < 60) {
    dacapo = "largo";
    return dacapo;
  }
  if(tempo<66){
    dacapo = "larghetto";
    return dacapo;
  }
  if(tempo<76){
    dacapo = "adagio";
    return dacapo;
  }
  if(tempo<108){
    dacapo = "andante";
    return dacapo;
  }
  if(tempo<120){
    dacapo = "moderato";
    return dacapo;
  }
  if(tempo<168){
    dacapo = "allegro";
    return dacapo;
  }
  if(tempo<200){
    dacapo = "presto";
    return dacapo;
  }
  if(tempo<300){
    dacapo = "prestissimo";
    return dacapo;
  }
  if(tempo>300){
    //eroor
    return dacapo;
  }

};
```
WakeLock の状態を確認する


どのアプリが WakeLock を取得しているかを見る方法。

```sh:
adb shell dumpsys power
```

を実行して、ずらっと出力される中から "Wake Locks:" を探す。
出力されるのはこんな感じの情報。

>
>POWER MANAGER (dumpsys power)
>
>Power Manager State:
>  mDirty=0x0
>  (中略)
>
>Settings and Configuration:
>  mDreamsSupportedConfig=true
>  (中略)
>
>Screen off timeout: 30000 ms
>Screen dim duration: 6000 ms
>
>Wake Locks: size=1
>  SCREEN_BRIGHT_WAKE_LOCK        'WindowManager' ON_AFTER_RELEASE (uid=1000, pid=389, ws={WorkSource: uids=[10070]})
>
>(以下省略)


"Wake Locks: size=1" となっており、
'WindowManager' という TAG で ``SCREEN_BRIGHT_WAKE_LOCK`` が取得されているのが分かる。

## 参考

* [adb各種コマンド - 肉になるメモ](http://kazumeat.hatenablog.com/entry/20110814/1313295257)
CentOS 環境に flex SDK のインストール


Adobe から flex SDK をダウンロード
http://www.adobe.com/devnet/flex/flex-sdk-download.html

/opt/flex の配下に ダウンロードした flex_sdk_4.6.zip を展開

```
$ sudo su -
# cd /opt
# mkdir flex
# cd flex
# unzip flex_sdk_4.6.zip
# cd ..
# chmod -R a+rx /opt/flex/
```

chmod しないとちゃんと、以下のようなエラーが出て実行できないので注意

```
$ mxmlc
設定ファイル "/opt/flex/frameworks/flex-config.xml" をロードしています
Adobe Flex Compiler (mxmlc)
Version 4.6.0 build 23201
Copyright (c) 2004-2011 Adobe Systems, Inc. All rights reserved.

/opt/flex/frameworks/flex-config.xml(416): エラー: 'libs/mx/mx.swc' を開くことができません

        </runtime-shared-library-path>

```

あと、必要に応じて .bashrc などで bin に path を通す。

以上で完了。
iOSでPocoを使うメモ

C++の[Poco Complete Edition](http://pocoproject.org/)をiOSで使うための手順を書きます。

#下準備
※ターミナルで作業します。

1. workディレクトリを作成する。このディレクトリで作業を行います。
* Opensslのビルド
    * [OpenSSL-for-iPhone](https://github.com/x2on/OpenSSL-for-iPhone)からダウンロードして、workディレクトリにOpenSSL-for-iPhoneというディレクトリ名で解凍します。
    * OpenSSL-for-iPhone/build-libssl.shを実行します。
    * OpenSSL-for-iPhoneにカレントディレクトリに移動して、`OPENSSLDIR=$PWD`を実行します。
* work/usr_x86ディレクトリを作成します。
* work/usr_armディレクトリを作成します。
* work/pocoにPocoを解凍します。

# Pocoのビルド
Pocoをシュミレータで使用できるようにarmv7とx86のsoファイルをビルドします。

## armv7のsoファイルをビルド
1. pocoディレクトリに移動します。
* build/config/iPhoneを編集して、armv6をarmv7に修正します。
* `./configure --config=iPhone --static --omit=Data,PageCompiler --prefix=../usr_arm --include-path=$OPENSSLDIR/include  --library-path=$OPENSSLDIR/lib --no-samples --no-tests`を実行します。
* `make -s -j 4`を実行します。
* `make install`を実行します。

## x86のsoファイルをビルド
1. `make distclean`を実行します。
* `./configure --config=iPhoneSimulator --static --omit=Data,PageCompiler --prefix=../usr_x86 --include-path=$OPENSSLDIR/include --library-path=$OPENSSLDIR/lib --no-samples --no-tests`を実行します。
* `make -s -j 4`を実行します。
* `make install`を実行します。

## Universal Binaryを作成

workディレクトリに移動して、以下のスクリプトを実行します。

```bash:pocolipo.sh
#!/bin/bash

lipo -create -arch armv7 ./usr_arm/lib/libPocoCrypto.a -arch i386 ./usr_x86/lib/libPocoCrypto.a -output libPocoCrypto.a
lipo -create -arch armv7 ./usr_arm/lib/libPocoCryptod.a -arch i386 ./usr_x86/lib/libPocoCryptod.a -output libPocoCryptod.a
lipo -create -arch armv7 ./usr_arm/lib/libPocoFoundation.a -arch i386 ./usr_x86/lib/libPocoFoundation.a -output libPocoFoundation.a
lipo -create -arch armv7 ./usr_arm/lib/libPocoFoundationd.a -arch i386 ./usr_x86/lib/libPocoFoundationd.a -output libPocoFoundationd.a
lipo -create -arch armv7 ./usr_arm/lib/libPocoNet.a -arch i386 ./usr_x86/lib/libPocoNet.a -output libPocoNet.a
lipo -create -arch armv7 ./usr_arm/lib/libPocoNetd.a -arch i386 ./usr_x86/lib/libPocoNetd.a -output libPocoNetd.a
lipo -create -arch armv7 ./usr_arm/lib/libPocoNetSSL.a -arch i386 ./usr_x86/lib/libPocoNetSSL.a -output libPocoNetSSL.a
lipo -create -arch armv7 ./usr_arm/lib/libPocoNetSSLd.a -arch i386 ./usr_x86/lib/libPocoNetSSLd.a -output libPocoNetSSLd.a
lipo -create -arch armv7 ./usr_arm/lib/libPocoUtil.a -arch i386 ./usr_x86/lib/libPocoUtil.a -output libPocoUtil.a
lipo -create -arch armv7 ./usr_arm/lib/libPocoUtild.a -arch i386 ./usr_x86/lib/libPocoUtild.a -output libPocoUtild.a
lipo -create -arch armv7 ./usr_arm/lib/libPocoXML.a -arch i386 ./usr_x86/lib/libPocoXML.a -output libPocoXML.a
lipo -create -arch armv7 ./usr_arm/lib/libPocoXMLd.a -arch i386 ./usr_x86/lib/libPocoXMLd.a -output libPocoXMLd.a
lipo -create -arch armv7 ./usr_arm/lib/libPocoZip.a -arch i386 ./usr_x86/lib/libPocoZip.a -output libPocoZip.a
lipo -create -arch armv7 ./usr_arm/lib/libPocoZipd.a -arch i386 ./usr_x86/lib/libPocoZipd.a -output libPocoZipd.a
```

Universal Binaryの.aファイルができますので,実機とシュミレータで使用できます。
SublimeText2でVintage Modeが有効にならなかった。

今Sublime Text2（Ver2.0.2）を落としてきてVintage Modeを有効にしようとしたらできなかった。
Setting - Defaultのignored packagesは外したのになー。
なんでだろうなーって思って色々見てたら、どうやらSetting - Userにも
"ignored_packages": ["Vintage"]が記述されてる模様。
"Vintage"の記述を削除してあげて無事に動くなるようになりましたとさ。
google-translate.el と popwin.el で翻訳作業が捗った件

## できるようになること

英語の文字列を選択して C-x C-t したら日本語訳が表示される。

## 環境など

Ubuntu 13.04 と Mac OS X Lion 上の Emacs 24.3 で確認しました。

## 設定

google-translate.el と popwin.el をインストールします。
どちらも package.el でインストールできるのでそれで。

```
M-x package-install google-translate
M-x package-install popwin
```

インストールできたら、次のように設定を書きます。

```el:
;; google-translate.el
(require 'google-translate)

;; キーバインドの設定（お好みで）
(global-set-key [(C x) (C t)] 'google-translate-at-point)

;; 翻訳のデフォルト値を設定（en -> ja）
(custom-set-variables
  '(google-translate-default-source-language "en")
  '(google-translate-default-target-language "ja"))

;; popwin.el
(require 'popwin)
;; おまじない（よく分かってない、、）
(setq display-buffer-function 'popwin:display-buffer)
;; ポップアップを画面下に表示
(setq popwin:popup-window-position 'bottom)

;; google-translate.elの翻訳バッファをポップアップで表示させる
(push '("*Google Translate*") popwin:special-display-config)
```

これで英文を選択して C-x C-t したら日本語訳がポップアップで表示されるようになります。
ポップアップした翻訳バッファにフォーカスが移ってるので、そのまま訳文をコピーしてもとのバッファに戻ってペーストしたりするといいと思います（そのとき翻訳バッファは勝手に閉じるので邪魔にならない！）。

## 課題・問題点など

* 訳文をいちいちコピペするのが面倒なので、直接いまのバッファのカーソル位置に挿入したい。
* デフォルトの翻訳言語を設定したせいか、他の言語が選べなくなった気がする。

## 参考ページ

* http://skalldan.wordpress.com/2012/09/30/emacs-%E3%81%8B%E3%82%89-google-translate-%E3%82%92%E4%BD%BF%E3%81%86/
* http://aikotobaha.blogspot.jp/2013/04/popwinel.html
JavaScriptCore.framework のまとめ

## JavaScriptCore.framework とは

Mac/iOS アプリケーション内に JavaScript 実行環境を組み込める。
Objective-C クラスをエクスポートしたり、JavaScript で処理させて結果を取り出したりできる。
要は Lua みたいに JavaScript を組み込み言語として使えちゃう！

## 準備

* MacOS SDK 10.9 または iOS SDK 7.0 以降が必要。
* Xcode プロジェクトに JavaScriptCore.framework を追加する。

## 使い方

### クラスの定義とエクスポートの指定

Vector2 というクラスを JavaScript から利用できるようにするには、JSExport プロトコルに準拠したプロトコルを定義し、ここにエクスポートするメソッドやプロパティを記述する。

```objc:
@class Vector2;
@protocol Vector2JSExport <JSExport>
+ (id)new;
+ (Vector2*)vector2WithX:(float)x andY:(float)y;
+ (Vector2*)vector2WithArray:(NSArray*)array;
+ (Vector2*)vector2WithObject:(NSDictionary*)dict;
- (NSString*)description;
@property (nonatomic, assign) float x;
@property (nonatomic, assign) float y;
@end

@interface Vector2 : NSObject <Vector2JSExport>

+ (Vector2*)vector2WithX:(float)x andY:(float)y;
+ (Vector2*)vector2WithArray:(NSArray*)array;
+ (Vector2*)vector2WithObject:(NSDictionary*)dict;

@property (nonatomic, assign) float x;
@property (nonatomic, assign) float y;

@end
```

### JavaScript 実行環境を作る

JS 仮想マシンとコンテキストを作成。
例外ハンドラも設定しておくとよい。

```objc:
    JSVirtualMachine* vm = [[JSVirtualMachine alloc] init];
    JSContext* ctx = [[JSContext alloc] initWithVirtualMachine:vm];
    // 例外ハンドラを設定
    ctx.exceptionHandler = ^(JSContext* ctx, JSValue* error) {
        NSLog(@"JS Exc: %@", error);
    };
```

コンテキストにエクスポートしたいクラス定義を投入。
ブロックや値を投入することも可能。

```obj-c:
    // Vector2 クラスを投入
    ctx[@"Vector2"] = [Vector2 class];
    // log 関数を追加
    ctx[@"log"] = ^(JSValue* value) { NSLog(@"%@", value); };
```

### 試してみる

```obj-c:
    // log() を呼んでみる
    [ctx evaluateScript:@"log('xxxxx');"];
    // Vector2 をインスタンス化してみる
    [ctx evaluateScript:@"var v1 = Vector2.new();"];
    // プロパティに代入してみる
    [ctx evaluateScript:@"v1.x = 1.0; v1.y = 2.0;"];
    // description() の戻り値を取得してみる
    NSLog(@"%@", [ctx evaluateScript:@"v1.description();"]);
    // 2 つ以上の引数があるメソッドの呼び出し方はこんな感じ
    [ctx evaluateScript:@"Vector2.vector2WithXAndY(30, 40);"];
    // 配列の扱い
    [ctx evaluateScript:@"Vector2.vector2WithArray([500, 600]);"];
    // 辞書の扱い
    [ctx evaluateScript:@"Vector2.vector2WithObject({x: 7000, y: 8000});"];
    // コンテキストから値を取得してみる
    NSLog(@"v1 = %@", ctx[@"v1"]);
```
Androidでchromeからアプリを開くか、なければPlayストアを開く方法

Androidにおいて、ブラウザからアプリを開くが、もし、アプリがインストールされていなかったらgoogle playを開きたい、という動作は下の方法で対応していた。

[アプリがインストールされてなかったらApp Storeへ誘導する](http://jsdo.it/kyo_ago/4DMg)

しかし、chromeでは、セキュリティ対策のため、iframeを使った方法では動作しなくなったようだ。
対応策は[ここ](https://developers.google.com/chrome/mobile/docs/intents)

JavaScript使ってややこしいことをする必要がなく、下のようなタグを作れば良い。

~~~
<a href="intent://sample#Intent;scheme=foo;package=jp.example.foo;end">OPEN</a>
~~~

アプリがあれば、アプリ(foo://sample)を開き、無ければ jp.example.fooで登録されたアプリのページをPlayストアで開いてくれる。
Rails+RspecでSSL・非SSLのテストするときはshared_context使うと捗る

RailsのコントローラのSSL・非SSLのときの振る舞いをテストするには `request.env['HTTPS']` に `'on'` か `'off'` を代入すればいい。

```rb:
describe SomeController do
  describe 'GET new' do
    context 'access using SSL' do
      before { request.env['HTTPS'] = 'on' }
      it do
        get :new # SSLでアクセスする
      end
    end

    context 'access not using SSL' do
      before { request.env['HTTPS'] = 'off' }
      # この中は非SSL
    end
  end
end
```

毎回 `before` ブロックを書くのは面倒くさいので `shared_context` を使うと捗る。以下の様なコードを用意する。

```rb:
shared_context 'SSL', ssl: true do
  before { request.env['HTTPS'] = 'on' }
end

shared_context 'not SSL', ssl: false do
  before { request.env['HTTPS'] = 'off' }
end
```

すると以下のように書ける。

```rb:
describe SomeController do
  describe 'GET new' do
    context 'access using SSL', ssl: true do
      it do
        get :new # SSLでアクセスする
      end
    end

    context 'access not using SSL', ssl: false do
      # この中は非SSL
    end
  end
end
```
WordPress (on Debian squeeze) の編集画面のフォントを強制的に変える

WordPressの設定なんてつまらなすぎるのでやりたくないんですが……

# 症状

とりあえず唯一どうしても日々の更新に不具合が生じる面がありました

![bad_font_on_wordpress.png](https://qiita-image-store.s3.amazonaws.com/0/14365/c6e85331-a478-c12d-97b0-db5302e4866e.png)

これはひどいなー、ということで直すんですが

# これはテーマの一部ではないね

公開されない画面ですので

# 13px Georgia フォントだね。

Chromeの要素検証を丁寧に使って発見します。ありがたやありがたや

Georgia フォントの方そのものを殺す、というアイディアもあるんですが (fontconf)、13pxって正直なんだよ、と思います。これはWordPress側のヘボだと考えました

# content.css だね

/usr/share/wordpress/wp-includes/js/tinymce/themes/advanced/skins/wp_theme/content.css に当該の設定があります。

# 変更しても読み込まれないね

TynyMCE というWordPress内のエディタはバージョンを見ていて、最新のcssを読み込みません

# 345-20111127 だね

どうもWordPressはテーマ以外のファイル、cssのバージョンに至るまで管理しており、TinyMCEの構成も全部どっか別の場所に保存してるようなのですね。

で、アクセスするcssのファイルの末尾に ver=345-20111127 というquery stringが混じっていて、これのせいで編集結果が反映されないのです。

# $tinymce_version なんて死んでしまえ

ああもう、WordPressの設定なんかやりたくないんだよ……

/usr/share/wordpress/wp-includes/version.php にtinymce_versionという変数があり、これを使っているようです。

消せ

# 設定は上書きされた

![ok_font_on_wordpress.png](https://qiita-image-store.s3.amazonaws.com/0/14365/c5964d9f-a2ca-4565-19c1-6175b878f118.png)

これが良いかはともかく書いてる時に見やすいは見やすい。

以上

# 感想

たまにしか使わないブログツールの設定でここまで時間をかけるのは正直人生の無駄だと思います
play2.1 HTMLのテンプレートでvalidateエラーを表示する方法

#ヘルパーを使用せずにテンプレートを書く
というか書かざるをえないような場合があるとして、
フィールドコンストラクタを自作してもどうしようもないとか自作したくない場合に

```input.scala.html
@(item:Form[Item])(implicit  flash:Flash,lang:Lang)

@main("新規追加"){
    <h2>〇〇入力画面的な</h2>
　　<form method="post" action="@routes.Sample.save()">
　　<div class="controls">
              <input type="text" id="id" name="id" value="@item.data.get("name")"  >
    </div>
　　　　　・
　　　　　・
　　　　　・
```

という感じの入力ページのHTMLがあるとしてvalidat結果のエラーメッセージを表示するには

`@Messages(item("name").errors.map(_.message).mkString(", "))`
か
`@if(item("name").hasErrors){@Messages(item("name").error.get.message)}`
でエラーメッセージを出力できる
※上記はconf/messages.jaがある場合に日本語化している


コントローラでも同じような呼び出し方でエラーメッセージを取れるっぽいので
何かしらのハンドリングが必要な場合に使えるな
zsh の vcs_info の check-for-changes 周りのまとめ

.zshrc に記載する場合

```
# 基本フォーマット
#   %b=ブランチ名, %s=VCS名 などが入る
zstyle ':vcs_info:*' formats '[%b]%c%u'

# 何かが発生した際の特殊フォーマット
#   コンフリクト中などはこちらの書式になる
#   %a へ原因となったアクション名が入る
zstyle ':vcs_info:*' actionformats '[%b|%a]%c%u'

# 作業コピー変更時に出現するマーク, %c に対応
zstyle ':vcs_info:*' unstagedstr '?'

# インデックス変更時に出現するマーク, %u に対応
zstyle ':vcs_info:*' stagedstr '+'

# 上記 %c,%s の反映を Git の場合のみ有効にしている
zstyle ':vcs_info:git:*' check-for-changes true

# Mercurial ではまだ動かないため有効にしていない（デフォルト false）
#zstyle ':vcs_info:hg:*' check-for-changes true
```
OpsWorksでuserのpassword設定方法

```rb:user_add.rb
#この記述だとうまく行かない
#gem_package "ruby-shadow" do
#    action :install
#end

#passwordの実行時はopsworks側のgemを使うため下記の記述が必要
OpsWorks::InternalGems.internal_gem_package "ruby-shadow"

user "hoge" do
  #openssl passwd -1 "hogehoge"
  password '$1$7pX3AIBp$9PvEI3.4itiZdUYMMx78g1'
end
```
NSURL と bookmark と Sandbox の関係

# Bookmark とは
Snow Leopard から、 `NSURL` に bookmark という機能が加わった。 Bookmark はあるファイルシステムリソース（つまりファイルやフォルダ）を指す一種の URL であり、そのリソースのパスを表す `NSURL` から生成できる。 Bookmark は**参照しているリソースが移動しても有効**であり、 bookmark から移動先のパスを表す `NSURL` を取得することができる。

```objc
// NSURL からbookmark を生成
- (NSData *)bookmarkDataWithOptions:(NSURLBookmarkCreationOptions)options includingResourceValuesForKeys:(NSArray *)keys relativeToURL:(NSURL *)relativeURL error:(NSError **)error;

// Bookmark を解決して NSURL を取得
+ (id)URLByResolvingBookmarkData:(NSData *)bookmarkData options:(NSURLBookmarkResolutionOptions)options relativeToURL:(NSURL *)relativeURL bookmarkDataIsStale:(BOOL *)isStale error:(NSError **)error;
```

# Security-scoped bookmark
Sandbox が有効な環境では、ユーザーが Open Panel などで与えた URL は Sandbox 内から読み書き可能になるが、アプリケーションを終了すると読み書きの権限は失われる。だがそのような URL から生成した bookmark はアクセス権限の情報を保持するので、これを保存しておくことで、アプリケーションを次に起動したときに読み書き可能な URL を取得できる。アクセス権限の情報を持つ bookmark を security-scoped bookmark といい、そこから生成された URL は security-scoped URL と呼ばれる。 Security-scoped URL が指すリソースに Sandbox 内からアクセスするには、アクセスする前に `-startAccessingSecurityScopedResource` を呼び、アクセスを終えたら必ず `stopAccessingSecurityScopedResource` を呼ぶ：

```objc
NSURL *URL = <#Resolve bookmark#>;
[URL startAccessingSecurityScopedResource];
NSString *contents = [NSString stringWithContentsOfURL:URL];
[URL stopAccessingSecurityScopedResource];
```

# App-scoped bookmark と document-scoped bookmark
ある Sandbox 化アプリケーションから見てリソースが読み書き可能であるという情報を記録した bookmark は app-scoped bookmark と呼ばれる。

対して、ある**ドキュメント**から見てリソースが読み書き可能であるという情報を記録した bookmark は document-scoped bookmark と呼ばれる。この種の bookmark は、複数の外部リソースへの参照を持つファイルを作るときに有効である。

外部の画像ファイルへの参照を埋め込んだリッチテキスト文書を考えてみよう。あるワープロソフトAは、リッチテキスト文書ファイルの中に画像ファイルへの document-scoped bookmark を記録する。別のワープロソフトBは、リッチテキスト文書ファイルを開き、画像への document-scoped bookmark を解決することで、画像ファイルの読み書き権限も得ることができる。

Document-scoped bookmark を生成するには、`-bookmarkDataWithOptions:includingResourceValuesForKeys:relativeToURL:error:` の `relativeToURL` に基準となるドキュメントの URL を指定する。
ログを色つけて見やすくする君

ログを見るとき白黒だと辛いですよね。
そこで、色つけて見やすくする君を作りました。

## 使い方
$ tail -f /var/log/apache2/*log | colorizer.sed
$ pserve development.ini 2>&1 | colorizer.sed

## before
![before.png](https://qiita-image-store.s3.amazonaws.com/0/25728/17d88413-5f43-e16c-d841-3dc939b70827.png)

## after
![after.png](https://qiita-image-store.s3.amazonaws.com/0/25728/5707ebc6-3da2-8c67-29dc-7cb6a7aeb8ff.png)

## download
[download](https://github.com/tukiyo/colorizer "download")
git push で jenkins ビルドする


# jenkins の設定

Jenkinsのプロジェクトの設定で、ビルド・トリガ>リモートからビルド を選択し、ビルド用のトークンを設定する。
ここでは仮に"hogehoge"としたとする。

ためしにURLを叩いてみる

```
$ curl http://localhost:8080/job/git-test/build?token=hogehoge
```

これでビルドが実行されればOK

ちなみに、トークンを使用するのは「セキュリティを有効」に設定している場合のみ。

まちがってユーザ設定しないまま、セキュリティを有効にして管理画面を閉じてしまうと何もできなくなってしまう（復帰方法はるのかな？）ので注意。

その場合、以下のページを参考に「セキュリティを有効にする」を無効化することができた。

http://d.hatena.ne.jp/okinaka/20120404/1333524730



# git リポジトリのフックスクリプトに追加する

※サーバ側のリポジトリで設定する

hook/post-update ファイルを用意

```
#!/bin/sh

curl -s http://localhost:8080/job/git-test/build?token=hogehoge
echo "jenkins build run."
```

実行権限を与えるのを忘れずに

```
$ chmod +x post-update
```

# 試しにpushしてみる

試しに該当リポジトリをローカルで修正・コミット、リポジトリサーバへpush してみて、jenkinsのビルドが実行されればOK

```
$ git push
Counting objects: 5, done.
Writing objects: 100% (3/3), 281 bytes, done.
Total 3 (delta 0), reused 0 (delta 0)
remote: jenkins build run.
To git@vagrant:testing
   4f72d57..805e344  master -> master
```
よく使う日付書式変換（自分用メモ）

# 日付書式を表現する文字

（自分が）よく使う言語の、よく使う日付書式。微妙に違うので覚えていられない。
* PHP は date 関数の引数（ということはWordPressも）
* ○○.NET は ToString メソッドの引数
* Linux は date コマンドの +"format" 引数
* MySQL は DATE_FORMAT 関数の引数
* Access は FORMAT 関数の引数


|日付書式| PHP |○○.NET | Linux | MySQL|Access|
|:--------|:-----------:|:------------:|:------------:|:------------:|:------------:|
|西暦年4桁|Y|yyyy|%Y|%Y|yyyy|
|西暦年2桁|y|yy|%y|%y|yy|
|月2桁（01～12）|m|MM|%m|%m|mm|
|日2桁（01～31）|d|dd|%d|%d|dd|
|時2桁（00～23）|H|HH|%H|%H|hh|
|時2桁（01～12） + AM/PM|h A|hh tt|%I %p|%I %p|hh AM/PM|
|分（00～59）|i|mm|%M|%i|nn|
|秒（00~59）|s|ss|%S|%s|ss|
|月末日|t|なし|なし|なし|なし|

## 簡単な覚え方
* PHP と MySQL は「1文字で表現」や使う文字など、わりと似ている（OSSの文化圏だからか？）。
* 【2013-06-19追記】Linuxのdateコマンドも↑と似ている。↑はたぶんdateコマンドに合わせているのだろう。
* .NET と Access もなんとなく似ている（MicroSoft製だから？・・・だったら完全に同じにしやがれ！）
* …やっぱり簡単に覚えるなんて無理。

## その他（主に愚痴）
* 分が m i n の3通りもあって嫌になる。
* 月末日はよく使うのにPHPにしかない（どの言語でも「翌月1日の前日」でできるけど面倒）。
* SQL Server は 2012 からはFORMAT関数が使えるらしいけど、客先の都合で当分2008しか使えないので、今のところまだ書かない。
* SQL Server 2008 に関しては、CONVERT関数でやるしかなく、あまり自由な形式には出せない。呼び出し側のプログラムで変換するのがよいだろう。

## 変更履歴
* Linux の date コマンドを追記（2013-06-19）
rbenvでCocoaPodsをセットアップ


OS Xには標準でRubyがセットアップされていてこれを使ってCocoaPodsがインストールできる。ただ標準で入っているRubyは/usrディレクトリ以下に入っているためRubyGemsで何か入れようとするといちいち管理者権限(sudoでの実行)が必要になって面倒。

RubyではrbenvやRVMなど複数のバージョンのRubyを管理するためのツールがある。これらのツールは主にユーザのホームディレクトリにrubyをインストールするので管理者権限が不要でシステムディレクトリを汚さないというメリットがある。

能書きはこれくらいにして早速コマンドの列挙。ちなみにgitはXcode Command Line Toolsをインストールすると入る。

```
git clone https://github.com/sstephenson/rbenv.git ~/.rbenv
git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile
echo 'eval "$(rbenv init -)"' >> ~/.bash_profile
exec $SHELL -l
rbenv install 1.9.3-p327
rbenv rehash
rbenv global 1.9.3-p327
```
これでrbenvでRuby 1.9.3が使える。``ruby -v``でバージョンが、``rbenv which ruby``でインストールされた場所が確認可能。ホームディレクトリに入っていれば勝ち。

1.9.3-p327は単にrbenvのドキュメントにあったまま入れただけ。

次にCocoaPodsのインストール

```
gem install cocoapods
rbenv rehash
pod setup
```

``pod --version``が動いていればok。

``rbenv rehash``などrbenvについては http://qiita.com/items/cc73b628c9ef039f6e6f にメモ書いています。
パスワード認証でログインするサーバに対してserverspecでテストを実行する

 __2014/2/7
本投稿の内容はserverspec本家のTipsへ掲載されることとなりました。
http://serverspec.org/advanced_tips.html
(k1LoWさん、ありがとうございます！)__ 


パスワード認証でログインするサーバに対してserverspecでテストを実行する際、ログインパスワードを指定する方法がないような気がするので、できるようにします。
(もし他の方法をご存知の方いらっしゃいましたら教えて下さいm(_ _)m)

## 編集

spec_helper.rbを編集します。

```diff:spec_helper.rb
@@ -1,13 +1,13 @@
 require 'serverspec'
 require 'pathname'
 require 'net/ssh'
+require 'highline/import'

 include Serverspec::Helper::Ssh
 include Serverspec::Helper::DetectOS

 RSpec.configure do |c|
   if ENV['ASK_SUDO_PASSWORD']
-    require 'highline/import'
     c.sudo_password = ask("Enter sudo password: ") { |q| q.echo = false }
   else
     c.sudo_password = ENV['SUDO_PASSWORD']
@@ -25,7 +25,11 @@
       c.host  = host
       options = Net::SSH::Config.for(c.host)
       user    = options[:user] || Etc.getlogin
-
+      if ENV['ASK_LOGIN_PASSWORD']
+        options[:password] = ask("\nEnter login password: ") { |q| q.echo = false }
+      else
+        options[:password] = ENV['LOGIN_PASSWORD']
+      end
       c.ssh   = Net::SSH.start(c.host, user, options)
     end
   end
```

## 実行

上記、編集がされている状態で以下のように実行します。
（serverspecのSudoパスワード指定の実行方法とほとんど同じです。）

パスワードをプロンプトで入力する場合

```text:
ASK_LOGIN_PASSWORD=1 rake spec
```

パスワードを明示する場合

```text:
LOGIN_PASSWORD=hogehoge rake spec
```
groongaのtokenizeコマンドを使ってマッチしない理由を確認するには

> もっとgroongaを知ってもらおう!ということで週刊groongaをはじめました。毎週木曜にgroongaやmroonga、rroongaのトピックを投稿予定です。

いよいよ、[gihyo.jp](http://gihyo.jp/)さんでgroongaの隔週更新連載が始まりました!! 
第5回の記事も公開されたので、一読をおすすめします。

* [「第1回 全文検索エンジンgroongaを紹介します！」](http://gihyo.jp/dev/clip/01/groonga/0001)
* [「第2回 groongaをRuby On Railsでも使ってみた ～chikamap.comの事例から」](http://gihyo.jp/dev/clip/01/groonga/0002)
* [「第3回 すべてのMySQLユーザに高速な全文検索機能を！ - mroongaの紹介」](http://gihyo.jp/dev/clip/01/groonga/0003)
* [「第4回 rroongaを使ったソースコード検索エンジンMilkode」](http://gihyo.jp/dev/clip/01/groonga/0004)
* [「第5回 Rubyでサーバ要らずの高速全文検索！ - rroongaの紹介」](http://gihyo.jp/dev/clip/01/groonga/0005)

連載は始まりましたが、利用事例をどんどん紹介していきたいです。(利用事例のストックが尽きたら終了してしまいます。)
groongaやmroonga、rroongaを実際に使っていて利用事例記事を書いてもいいよ、という人をまだまだ募集しています。
詳細は[groonga普及のための協力のお願い](http://sourceforge.jp/projects/groonga/lists/archive/dev/2013-February/001186.html)を参照してください。

# はじめに

オープンソースの[カラムストア機能付き全文検索エンジンgroonga](http://groonga.org/ja/)を公開しています。

最新のバージョンは2013年5月29日にリリースした[3.0.4](http://groonga.org/ja/docs/news.html#release-3-0-4)です。

今回は、``tokenize``コマンドを使ってマッチしない理由を確認する方法を紹介します。

# ``tokenize``コマンドとは

groongaでは3.0.4からトークナイズした結果を確認する方法として``tokenize``コマンドをサポートしました。

例えば、本のタイトルを検索するときのことを考えてみましょう。
``Books`` テーブルがあって、``Books`` テーブルにはタイトルを保持する``title`` カラムがあるとします。

サンプルのスキーマ定義は以下のようになるでしょう。

```
table_create Books TABLE_HASH_KEY UInt32
table_create Lexicon TABLE_HASH_KEY ShortText --default_tokenizer TokenMecab
column_create Books title COLUMN_SCALAR ShortText
column_create Lexicon index_title COLUMN_INDEX --type Books --source title

```

上記サンプルのためのサンプルデータを用意します。

```
load --table Books
[
{"_key":1,"title":"東京旅行"},
{"_key":2,"title":"京都旅行"},
{"_key":3,"title":"東京都案内"},
]
```

``title``から東京都を検索してみましょう。

```
select Books --query title:@東京都
```

この結果は以下のようになります。

```
[
  [
    [1],
    [
      ["_id","UInt32"],["_key","UInt32"],["title","ShortText"]
    ],
    [3,3,"東京都案内"]
  ]
]
```

では次に、``title``から東京を検索してみましょう。

「東京旅行」と「東京都案内」がひっかかりました。

```
[
  [
    [2],
    [
      ["_id","UInt32"],["_key","UInt32"],["title","ShortText"]
    ],
    [1,1,"東京旅行"],
    [3,3,"東京都案内"]
  ]
]
```

今度は、``title``から京都を検索してみましょう。

この結果は以下のようになります。

```
[
  [
    [1],
    [
      ["_id","UInt32"],["_key","UInt32"],["title","ShortText"]
    ],
    [2,2,"京都旅行"]]]
  ]
]
```

「京都旅行」がひっかかりました。
でも、タイトルの一部に「京都」が含まれる「東京都案内」はひっかかりませんでした。

どうしてでしょうか。これはMeCabのトークナイズのしかたによるものです。

tokenizeコマンドでMeCabによるトークナイズを試すことができます。以下のようにして使います。

```
tokenize トークナイザー 文字列
```

"東京都案内"をトークナイズするには以下のコマンドを実行します。


```
> tokenize TokenMecab "東京都案内"
```

[tokenize](http://groonga.org/ja/docs/reference/commands/tokenize.html)コマンドの詳細はドキュメントを参照してもらうとして、「東京都案内」をトークナイズした結果は以下のようになります。

```
[{"value":"東京","position":0},{"value":"都","position":1},{"value":"案内","position":2}]
```

"東 京都 案内"ではなく"東京 都 案内"とトークナイズされていますね。
なので、"京都"にはマッチしなかったことがわかりました。

# まとめ

今回は、groongaの``tokenize``コマンドを使ってマッチしない理由を確認する方法を紹介しました。

groongaに興味を持ったなら、まずは[インストール](http://groonga.org/ja/docs/install.html)して試してみてください。

groongaの基本的な動作を知るための[チュートリアル](http://groonga.org/ja/docs/tutorial.html)もあります。インストールしたら試してみてください。
Mockito 初めの一歩

テストコードでは必須と言ってもいいくらいにお世話になっているモックライブラリ「Mockito」

最低限の使い方というか、実際よく使っているパターンを紹介します。

# モックって？
モックライブラリを使ったことがない方は、モックするという事自体に馴染みがないと思います。

例えば、テスト対象のクラスAが別のクラスBに依存している場合に、クラスAのテストコードなのにクラスBを初期化する処理を長々と書いたりするのは余計な手間です。もしクラスBがビジネスロジックなら目も当てられないテストコードが出来上がります。
モックライブラリでは、クラスBをクラスB自身の実装に依存しないmock(ハリボテ)として生成し、更にそのメソッドの戻り値を任意に設定するという事ができます。これにより「クラスBがこういう状態でこういう値を戻す場合のクラスAのテスト」が容易に書けます。

そしてそのモックライブラリの注目株が **Mockito** です。

# mock
Mockito#​<b>mock</b>メソッドを使うと、そのクラスの実装に依存しないモックオブジェクトを生成します。
各メソッドの戻り値はモックオブジェクトになりますが、指定したメソッドの戻り値だけを任意に設定できます。

## 任意の値を戻すようにモックする
Hogeクラスをモックし、Hoge#getFooメソッドの戻り値を任意のFooにします。
Hogeが抽象クラスやインターフェースの場合でも同じようにモックはできます。

```java:
Hoge hoge = mock(Hoge.class);
Foo foo = new Foo();
when(hoge.getFoo()).thenReturn(foo);
assertThat(hoge.getFoo(), is(foo));
```

### 引数に応じて戻り値を分ける
引数を受け取るメソッドなら、引数に応じて戻り値を変えるようにモックできます。
引数には具体的な値を指定するか Mockito#<b>any〜</b> メソッドを使いましょう。
各プリミティブ型・ListやSetなどCollection系・可変長引数・任意のクラス、それぞれに対応した<b>any〜</b>メソッドがあるので使い分けてください。

```java:
Hoge hoge = mock(Hoge.class);
when(hoge.getFuga(anyInt())).thenReturn(-1); // どんな数が来ても -1 を返す
when(hoge.getFuga(1)).thenReturn(100); // ただし、1の時は100を返す
when(hoge.getFuga(2)).thenReturn(null); // ただし、2の時はnullを返す
assertThat(hoge.getFuga(1), is(100));
assertThat(hoge.getFuga(2), is(nullValue()));
assertThat(hoge.getFuga(999), is(-1));
```

## ネストしたオブジェクトをモックしたい
mockメソッドの第2引数では各種オプションを設定できます。
Mockito#<b>RETURNS_DEEP_STUBS</b>を使うと、Hoge#getFooの戻り値のFooの各メソッドもモックオブジェクトを返すようになります。
これを用いると、Hoge#getFooとFoo#getBarの実装を気にせずに、Foo#getBarの戻り値を任意に設定できます。

```java:
Hoge hoge = mock(Hoge.class, RETURNS_DEEP_STUBS);
Bar bar = new Bar();
when(hoge.getFoo().getBar()).thenReturn(bar);
assertThat(hoge.getFoo().getBar(), is(bar));
```

※再帰的な構造のオブジェクトをRETURNS_DEEP_STUBSでmockして再帰メソッドに食わせると、無限ループになります。思いの外やってしまうミスなので注意して下さい。

# spy
Mockito#<b>spy</b>メソッドを使うと、任意のインスタンスの一部だけモックできます。
これは、完全なハリボテを作るmockとは異なり、対象のクラスの実装に依存しつつ、指定したメソッドだけをモックします。

## doSomethingの中で呼ばれるsomeMethodだけをモックしたい
spyで得たオブジェクトは、モックしたメソッドの他は元々の実装で動作します。
mockでモックオブジェクトを生成した場合と、メソッドのモックの仕方が異なるので注意が必要です。
例えば、Hoge#someMethodに依存するHoge#doSomethingをテストしたい時、以下のようにHoge#someMethodの戻り値を任意に設定します。

```java:
Hoge hoge = spy(new Hoge());
Piyo piyo = new Piyo();
doReturn(piyo).when(hoge).someMethod(any(Bar.class));
Result result = hoge.doSomething();
verify(hoge).someMethod(any(Bar.class)); // someMethodが呼ばれた事をassert
```

# privateなフィールドを任意に設定
## dependerが依存しているdependeeフィールドをモックする
Mockitoにはprivateなフィールドをリフレクションで任意に設定するユーティリティが付属しています。

```java:
Whitebox.setInternalState(depender, "dependee", dependee);
```

# その他
Mockitoはモックする他にもテストに有用な機能を持っています。

上でもちょっとだけ出てきましたが、メソッドがどのように呼び出されたかをテストするverifyなどです。
verifyでは、対象のメソッドが、どういう順序で、どういう引数で、何回呼び出されたか、といったことをテストできます。
KeyRemap4MacBookでControl+hjklをカーソル移動に設定して快適コーディング


みなさん、プログラミングをするときや、ブログの文章、レポート、はたまたKobitoでQiita向けにTipsを書いているとき、カーソルの移動ってどうしていますか？
僕は、例えばXcodeやeclipseでコーディングするときはキーバインドの設定を変更してCtrl+hjklをカーソル移動に割り当てています。
これで、わざわざカーソルキーに手を移動しなくても、ホームポジションに手を置いたままカーソル移動ができるわけです。
このようなキーバインドの設定をXcodeやeclipse、Sublime Textなどエディタごとにいちいち設定していたのですが、もうこれならシステム全体でCtrl+hjklをカーソル移動に割り当ててしまおうと。
そうすると、わざわざ設定する手間が省けるばかりか、ブログの文章を書いているときなど、ブラウザからテキストを編集しているときや、そもそもキーバインド設定が出来ないエディタを使ったときでもこの設定を使うことができます！
では、さっそく。

##KeyRemap4MacBookをインストール
[KeyRemap4MacBook - OS X用のソフトウェア](https://pqrs.org/macosx/keyremap4macbook/index.html.ja "KeyRemap4MacBook - OS X用のソフトウェア")
公式ページからKeyRemap4MacBook をダウンロード、インストールしましょう。

##Control+hjklをカーソル移動に設定する
![スクリーンショット 2013-06-13 12.50.31.png](https://qiita-image-store.s3.amazonaws.com/0/21397/d6600872-3896-82f4-f5e5-dd50a0623529.png "スクリーンショット 2013-06-13 12.50.31.png")

KeyRemap4MacBookを起動し、

* Vi Mode → Control_L+hjkl to Left/Down/Up/Right

をクリックしてください。
これで終わりです！

##Macのcaps lockキーをControlキーにしよう
番外編として。

![スクリーンショット 2013-06-13 12.12.23.png](https://qiita-image-store.s3.amazonaws.com/0/21397/917ba27f-f060-f00f-093a-c297a2912341.png "スクリーンショット 2013-06-13 12.12.23.png")

MacのUSキーボードでは非常に打ちやすい位置に、一番使用することがない、いや、むしろ誤動作の原因になるcaps lockキーが配置されています。
これを、Controlキーに変更することで、今回設定したControl+hjklカーソル移動がより快適になります。

![スクリーンショット 2013-06-13 12.31.39.png](https://qiita-image-store.s3.amazonaws.com/0/21397/0cde7dbb-168e-8767-baf3-716697051153.png "スクリーンショット 2013-06-13 12.31.39.png")

* システム環境設定 → キーボード → 修飾キー

ここから変更することができます。

##まとめ
デフォルトの設定は結構クソなのでいろいろいじろう！
国土交通省のデータを使って、緯度経度から市区町村までを取り出す

FrogApps 技術ブログ始めました！
RailsやiOS、HTML5の情報を発信中!! → http://qiita.com/teams/frogapps

----

ここ数年、位置情報を使ったアプリ・サービスが増えましたが、GPSから取得出来る緯度経度だけではデータとして使いにくい事があります。

GoogleのGeocodingサービスなどで、緯度経度から住所への変換ができますが、件数や速度の問題があります。

そこで、国土交通省のデータを元に、緯度経度から住所への変換を行ってみましょう。

## 国土数値情報ダウンロードサービス
- http://nlftp.mlit.go.jp/ksj/gml/datalist/KsjTmplt-N03.html

から全都道府県を選択。最新の情報を全都道府県分選択します。


## PostGISのセットアップ
```
http://trac.osgeo.org/postgis/wiki/UsersWikiPostGIS20Ubuntu1204 を参考にPostGISをインストールしてください。

sudo -u postgres psql template1
CREATE USER vagrant WITH PASSWORD 'vagrant';
CREATE DATABASE gis WITH ENCODING = 'UTF-8'
    LC_CTYPE = 'en_US.utf8' LC_COLLATE = 'en_US.utf8'
    TEMPLATE template0;
GRANT ALL PRIVILEGES ON DATABASE gis TO vagrant;

sudo -u postgres psql gis -f /usr/share/postgresql/9.1/contrib/postgis-2.0/postgis.sql
sudo -u postgres psql gis -f /usr/share/postgresql/9.1/contrib/postgis-2.0/spatial_ref_sys.sql 
```

## shpファイルからPostGISへ取り込み
```
sudo aptitude install unzip nkf

# すべてのZIPファイルを解凍
find ./ -name "*.zip" -type f -print0 | xargs -0 -I {} unzip {}

# shpファイルからSQLへ変換
shp2pgsql -c N03-13_01_130401.shp shapes > geo.sql
find ./ -name "*.shp" -type f -print0 | xargs -0 -I {} shp2pgsql -W "SHIFT-JIS" -a {} shapes | nkf -W >> geo.sql

# 取り込み
psql gis < geo.sql 
```

## 検索

#### 時計台の位置情報

```
psql gis

SET client_encoding = 'UTF8';
SELECT n03_001,n03_002,n03_003,n03_004 FROM shapes WHERE ST_Within(ST_GeomFromText('POINT(141.35358861111  43.062555)'), geom);

 n03_001 | n03_002 | n03_003 | n03_004 
---------+---------+---------+---------
 北海道  |         | 札幌市  | 中央区
```

## テーブルへ変換

PostGISを使えば比較的簡単にできるのですが、変換の為にProduction環境にPostGISを配置するのは面倒です。

なので、先に緯度経度から行政区の変換マップを作りました。
https://github.com/FrogAppsDev/jpcities からダウンロードしてください。

検索がしやすいようにGeohashでインデックスしています。精度は荒いですが大体の位置を把握するには役にたつと思います。
commandlinefuをコマンドラインで検索する君

[www.commandlinefu](http://www.commandlinefu.com/ "www.commandlinefu")
をcliで検索する君。色付けもします。

## windows
![poderosa.png](https://qiita-image-store.s3.amazonaws.com/0/25728/a3e7ad9a-a631-1931-72ac-76605101f2bd.png)

## linux
![linux.png](https://qiita-image-store.s3.amazonaws.com/0/25728/de74a8bc-b3e6-3cca-940f-1d8298fa715b.png)

## download
[commandlinefu-cli](https://github.com/tukiyo/commandlinefu-cli "commandlinefu-cli")
CoffeeScript で関数をエクスポートするには

```coffeescript:foo.coffee
foo = () ->
  ...
```

を JavaScript に変換すると、通常は次のようにラップされたコードが出力される。

```js:foo.js
(function() {
  foo = function() {
    ...
  };
}).call(this);
```

このため foo() は外から呼び出すことができない。
foo() を呼び出せるようにするには次のいずれかの方法がある。

### 変換時に --bare オプションを指定する方法

```
$ coffee --bare -c foo.coffee
```

ラップされないコードが出力されるが、全てグローバルスコープに展開されるのであまり良くない。

```js:foo.js
var foo;

foo = function() {
  ...
};
```

### 関数定義を変更する方法

関数定義を次のように変更する。

```coffeescript:foo.coffee
@foo = () ->
  ...
```

これにより出力される JavaScript コードは次のようになる。

```js:foo.js
(function() {
  this.foo = function() {
    ...
  };
}).call(this);
```

this == window なので、結果的に関数 foo はグローバルスコープにエクスポートされる。

### クラスのエクスポート

クラス名の前に @ を付けるだけ

```coffeescript:
class @Klass
  ...
```
SublimeText Control+hjklでカーソル移動

![スクリーンショット 2013-06-13 12.12.23.png](https://qiita-image-store.s3.amazonaws.com/0/21397/f5c42ceb-2a71-5303-e7fc-1778d94e343a.png "スクリーンショット 2013-06-13 12.12.23.png")

僕はMacのUSキーボードでcaps lockキーをControlキーに割り当てなおして運用しています。
一番小指で押しやすいキーがなんでcaps lockなんだよ、という感じですが、これをControlなどに変更するとコーディングが劇的に快適になって、例えば、今回のネタのようにカーソル移動のキーバインドをControl+hjklなどに設定するといい感じになります。
ということで、Sublime Text 2において、Control+hjklを使ったカーソル移動を実現するためのキーバインド設定ネタです。

##キーバインドを変更する
Sublime Text 2 → Preferences → Key Bindings - User
と選択すると、キーバインドを設定するための設定ファイルがエディタ上に表示されます。そのファイルに以下の設定テキストを挿入して保存してください。

```
[
 	{ "keys": ["ctrl+l"], "command": "move", "args": {"by": "characters", "forward": true } },
 	{ "keys": ["ctrl+h"], "command": "move", "args": {"by": "characters", "forward": false } },
  	{ "keys": ["ctrl+k"], "command": "move", "args": {"by": "lines", "forward": false } },
  	{ "keys": ["ctrl+j"], "command": "move", "args": {"by": "lines", "forward": true } }
]
```

設定は以上です。

##Macのcaps lockキーを無効化し、別のキーに設定する
![スクリーンショット 2013-06-13 12.31.39.png](https://qiita-image-store.s3.amazonaws.com/0/21397/0cde7dbb-168e-8767-baf3-716697051153.png "スクリーンショット 2013-06-13 12.31.39.png")

システム環境設定 → キーボード → 修飾キー
ここから変更することができます。
ActiveAdminのfliterをプルダウンからテキストへ変更する

ActiveAdminではfilterがデフォルト設定の場合、データ量が増えると重くなってしまいます。
そこで、filterのカスタマイズをするのですが、プルダウンをテキストに変更するのが意外と厄介だったのでメモ。

    filter :テーブル名_カラム名, :as => :string

例えば、Userテーブルのemailで検索できるようにしたいならば、

    filter :user_email, :as => :string

とする。