OmniAICreator/Qiita-1.07M huggingface dataset:
[Java：備忘録]JavaからAccessMDBに接続する


**概要：**
　　MDBにアクセスし、データを引っ張ってくるPG。
　　未だ蔓延るMDBと戦いで作成。

**目的：**
　　業務で個別PG組む際に偶に使うから。
　　バッチ起動でデータ変換とかデータチェックとかする場合とか。

　　以下ではMDBに接続、値をゲットしてから呼び出し元へ返却する想定です。

　　ぐぐれば、もっと分かりやすく出てくるけど、自分が使う場合はこれで充分なので。
　　つまり、備忘録。

**ソース：**

```java
/**
 * MdbSetuzoku.
 * SAMPLEMDBは各自で個別に設定してね.
 */
private StringBuffer MdbSetuzoku() {

	StringBuffer buf = new StringBuffer();

	try {
		// ドライバオブジェクトのロード
		Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");

		// 日本語対応
		Properties prop = new java.util.Properties();
		prop.put("charSet", "SJIS");

		// データベースへの接続
		// DB名は直に書いているが、引数から渡してあげると良い
		Connection conn = DriverManager.getConnection("jdbc:odbc:SAMPLEMDB", prop);

		// ステートメントオブジェクトの生成
		Statement st = conn.createStatement();

		// クエリを実行してデータを抽出する.
		// GetDataSqlは個別に用意するSQL群。今回は省く。
		ResultSet res = st.executeQuery(GetDataSql().toString());

		// データ存在チェック
		// 普通はTrue/Falseだけど、当時は何故かこうなった
		Integer chkNum = 0;

		// ヘッダーの表示
		// 以下は別になくても良いです。
		buf.append("通番,ジョブID,ジョブ名称,ジョブステータス,開始時間\n");

		// 取得結果を編集
		//　取得結果が0件の場合はループしません。
		while (res.next()) {
			buf.append(res.getString(1) + "," + res.getString(2) + "\n");
			chkNum = 1;
		}

		// 出力対象データの存在有無を確認
		// ループ処理が発生しなかった場合はここで処理が終了します。
		// 作成当時は必要だと思い作成するも、今は他に手がなかったのかと思案。
		if (chkNum != 1) {
			return null;
		}

		// 接続解除
		conn.close();

	// 業務で使うなら、きちんとしたエラーハンドリングにしましょう。
	} catch (SQLException s) {
		System.out.println("SQL Error: " + s.toString() + " " + s.getErrorCode() + " " + s.getSQLState());
	} catch (Exception e) {
		// エラーメッセージのみ表示
		System.out.println(e.getMessage() + " States Check Error");
	}

	return buf;
}
```

**備考：**
　　System.out.printlnはSystem.err.printlnでもいいです。
　　上記PGでは処理結果を全てテキストに出力させているので、System.out.printlnになっています。
　　# 専用にログ出力クラス用意せーやと思ったけど、めんどくさかった。

　　あと、エラーハンドリングはきちんと作ってください。
PushStateとPopSatateを使った暗黒魔術

顧客情報とか秘匿したままページ遷移したい場合、Ajax とPushState+PopState のPjax が便利ですよね(*IE? ヤツは死んだよ。*)

で、まあ今作ってるサイトもそれでいけるかなーと思ったんですがなかなかくせ者でした。
上記ライブラリ自体が後付けって理由もなきにしもあらずなんですが、PHPフレームワークを使用しながらモーダルからAjax でページ更新する場合,

> http://[host_name]/#

\#はあってもなくてもいいんですがこの形なら正常にHTMLの上書きができるのですが

> http://[host_name]/index/index/index

みたいな形だと何故かAjax処理の部分で失敗してうまく動いてくれません。
なので
**PushStateのURI書き換え機能を利用して**
URIを書き換えて
> http://[host_name]/#

としてページのリロードをしてます。

逆にPopStateでブラウザバックする場合、

> http://[host_name]/index/index/index

の形式ならうまくページ遷移してくれるんですが

> http://[host_name]/#

の形式になっていると今度はこちらが上手く遷移してくれない。
はい、逆の発想ですね。

**PushStateのURI書き換え機能を利用して**
URIを
> http://[host_name]/index/index/index

に変換してからページをリロードです。
ソースにするとつまりこういうこと

モーダルから次画面遷移

```js:
if (window.history && window.history.pushState){
    state = document.title;
    history.pushState(state, "", url);
    location.reload();
}
$("#target-element").html(data);    //target-elementには実際に書き換えたい要素(IDなど) を入力
```

ブラウザバックでインデックスに戻る

```js:
function loadContents(url) {
    $.get(url, { push_state: 'true' }).then(function(content) {
        if(document.URL.match(/..#/)) {
            var url = 'index/index';
            history.pushState("", "", url);
            location.reload();
        } else {
            $('html').html(content);
            location.reload();
        }
    });
}
// handlling popState event
read = false;
previous_location = location.href;
$(window).on('popstate', function(e){
    // prevent scanning below code twice or more
    if (read == false && previous_location != location.href) {
        if(location.href != location.pathname) {
            loadContents(location.pathname);
        }
            read = true;
    }

});
```

こんなクソコード書くのに半日かかりましたとさ。
めでたしめでたし。
Laravel4 動的スコープ

ex)http://laravel4.kore1server.com/docs/eloquent#query-scopes

#Laravel4動的スコープ

クエリーを構築するときにパラメータがあったら条件をつける形で動的にクエリーを構築するようにしたかった。

```model.php

public function scopeAddWhere( $query, $input )
{
    foreach( $input as $key => $value ){
        if( empty( $value ) ) continue;
        switch( $key ){
            case 'pref':
                $query->where( $key, '=', $value);
            break;
    }
    return $query;
}

```

```controller.php

Model::addWhere( $input )->get()

```

呼び出し時には、「scope」を外す。

OK
treeコマンド


lsはカレントディレクトリのファイルを表示してくれますが、
カレントディレクトリ以下の階層も表示したい場合にtreeコマンドを使うと便利です。


##インストール
まずはHomebrewからインストールします。

```
brew install tree
```

##確認
インストールされていれば、下記のコマンドでtreeのバージョンが表示されます。

```
tree --version
```

##実行
ターミナルで下記のコマンドを実行すると、カレントディレクトリ以下の階層が表示されます。

```
tree
```

##オプション
####ーL = 階層を指定する
treeコマンドだけではカレントディレクトリ以下、全てのディレクトリ/ファイルが表示されますが、
階層を指定することが出来ます。

```
tree -L 3
```

カレントディレクトリを含めて3階層下まで表示してくれます。


####-P = ファイル名でフィルタリングする
-Pオプションを付けるとファイル名でフィルタリングして表示してくれます。
ファイル名の指定にはワイルドカードも使用できます。

```
tree -P 'index.html'
```

```
tree -P '*.js'
```

####-I = 除外するファイル名を指定する
-Iオプションを付けると表示したくないファイル名を指定できます。
ファイル名の指定にはワイルドカードも使用できます。

```
tree -I 'index.html'
```

```
tree -I '*.js'
```


####-d = ディレクトリのみ表示する
-dオプションを付けると、ディレクトリのみ表示してくれます。

```
tree -d
```
Makefileのログを取る


#やりたいこと
- 画面に出力したい
- make.logにログを残したい(標準出力も標準エラーも)

##sh・bashの場合

```sh
make 2>&1 | tee make.log
```

##csh・tcshの場合

```sh
make |& tee make.log
```

2>&1は標準出力と標準エラー両方をパイプで渡す方法
Windows Azure の Webサイト作成(Djangoプロジェクト)で pipインストールを可能にする

# 経緯

2014年9月12日から9月15日まで開催された [PyCon JP 2014](https://pycon.jp/2014) の最終日に行ったPyCon JP 2014 Sprintは、 [日本マイクロソフト 品川本社セミナールーム](http://www.microsoft.com/ja-jp/mscorp/branch/sgt.aspx) に会場をお借りしました。

Azureの事をほとんど理解していなかったので改めて、PaaS版のチュートリアルを行いました。Pythonの追加モジュールを入れてみようと思ったこと、pipが使えない状態でした。

これは、なんとかしたいと思い、 pip と virtualenv を入れてみようと思い、チャレンジしました。

# 作業方法

以下から、最新版のpipインストールファイルをフォルダダウンロードする。(Azure上にダウンロードしてきてもいい)

```
https://bootstrap.pypa.io/get-pip.py
```

pip と virtualenv のインストール

```
> python get-pip.py --user
> python -m pip install --user virtualenv
```

以下にインストールされた

```
C:\DWASFiles\Sites\~1xxxxxxxxxx\AppData\Python
```

自身のフォルダに、`myenv`というPython環境を作る

```
python -m virtualenv myenv
```

今後は、以下のpipを使ってモジュールのインストールが可能。と思ったが、どうもうまくいかないみたい。継続調査が必要。

```
> myenv\Scripts\pip.exe
```


# 解説

ユーザが書き込みできない場所に、Pythonがインストールされていると、site-packagesフォルダに新しいモジュールのインストールが出来ずエラーとなります。

最新のpipでは、`--user` というオプションが使用できるようになり、自身のホームディレクトリに pipをインストールし、virtualenvも作れるようになります。

これにより、管理者(root)権限などが無くても、virtualenvで自分の好きな場所に、Python環境が作れます。

ただし、今回のAzureの環境では、activateが出来ませんでしたので、毎回フルPath指定でPythonなどを呼ぶ必要があります。(Windowsだと環境変数がグローバルに影響を与えるからか？？などの条件があるようです)

# 謝辞

パッケージング周りでは日本で一番詳しく、世界中探しても指で数えられるくらい上位にいると思われる、 [@aodag](https://twitter.com/aodag) さんに助けていただきました。
SublimeText3での日本語入力時Tabキーでの変換候補選択を有効にする

SublimeText3での日本語入力時、デフォルトのキーバインドだと変換候補が表示された際にTabキーを押しても変換候補の選択に行かず、エディタ側の挙動が優先されてしまう。

これを有効にするにはPreference->キーバインド（標準）を開いた後

```
//	{ "keys": ["tab"], "command": "insert_best_completion", "args": {"default": "\t", "exact": true} },
//	{ "keys": ["tab"], "command": "insert_best_completion", "args": {"default": "\t", "exact": false},
//		"context":
//		[
//			{ "key": "setting.tab_completion", "operator": "equal", "operand": true }
//		]
//	},
```
※自分の環境では95行目にありました
のようにコメントアウトし、Tabでの補完キーバインド設定を無効にする事で日本語入力の変換候補に移動するようになる（ただし、Emmetなどのプラグインが有効でTabキーに別のキーバインドが効いている場合はこの設定をしてあっても変換候補に移らない場合もある）。

注意点として、このキーバインドを無効にすることによりdiv->Tabキーでのスニペット機能が無効になってしまうので、これを多用する人にはお勧め出来ない。
しかし、同機能はCmd+Shift+Pのコマンドパレットから選択出来るし、HTMLタグであれば別途Emmetなどプラグインを使うという逃げ道もある。
Array<Character>をStringに変換するだけでハマってしまったので備忘録

文字の配列（Array<Charactor>）を文字列(String)に変換したい…
ただ、それだけのことで、何時間と費やしてしまいました。

同じこと処理を実装したいのに困っている人が（いたら）のために、備忘録として書いておきます。

2014-09-17の投稿からいろいろな方からコメントを頂き、変換方法が増えました。
ご協力頂いた方々ありがとうございます。

## extendメソッドで変換する方法

```extendメソッドで変換する方法.swift
let sample = Array("Hello, World!")
var str = ""
str.extend(sample)

println(sample)
println(str)
```

## イニシャライザで変換する方法
[takabosoft](http://qiita.com/takabosoft)さんに教えて頂きました。
ありがとうございます。

``` イニシャライザで変換する方法.swift
let sample = Array("Hello, World!")
let str = String(seq: sample)

println(sample)
println(str)
```

## + Operatorで変換する方法
こちらも[takabosoft](http://qiita.com/takabosoft)さんから教えて頂きました。

``` Swift
let sample = Array("Hello, World!")
let str = "" + sample

println(sample)
println(str)
```

## reduceメソッドで変換する方法
[satoshia](http://qiita.com/satoshia)さんに教えて頂きました。
ありがとうございます。

```reduceメソッドで変換する方法.swift
let sample = Array("Hello, World!")
let str = sample.reduce("") { $0 + String($1) }

println(sample)
println(str)
```

## joinとmapメソッドで変換する方法
[dankogai](http://qiita.com/dankogai)さんからもコメントで別解を教えて戴きました。ありがとうございます。

```joinとmapメソッドで変換する方法.swift
let cs = Array("Hello, World!!")
println(cs)
println("".join(cs.map{String($0)}))
```

~~引き続き，xxx.extend についてのドキュメントを探しております。~~
~~どこかで見かけた方がいらっしゃいましたら、コメントを頂けると光栄です。~~
こちらも[satoshia](http://qiita.com/satoshia)さんから
> Xcodeで定義を追っかけると，extend()はExtensibleCollectionTypeプロトコルで定義されていて，SequenceTypeを引数に取るmutatingな関数のようですね。
> 詳しいドキュメントはないようですが，機能はこれらの名前の通りかと。

コメント頂いて調べてみたところ、[こちらのブログ](http://airspeedvelocity.net/2014/08/22/filter-string-and-extensiblecollectiontype/)にExtensibleCollectionTypeについて説明が載っていました。

気が向いたら、今回の件を含めて記事を書いてみたいと思います。
[Java：備忘録]プログラムに引数を与える

**概要：**
　正確にはクラス：Mainに引数を与える。

**目的：**
　業務で個別PG組む際に割りと使うから。
　バッチ起動でデータ変換とかデータチェックとかする場合とか。

　ぐぐれば、もっと分かりやすく出てくるけど、自分が使う場合はこれで充分なので。
　つまり、備忘録。

**ソース：**

```java
　/**
 * 引数確認＆取込
 */
public class Hikisu {

	/**
	 * @param args
	 */
	public static void main(String[] args) {

		// 引数が一致しない場合は処理を終了させる.
		if (args.length != 2) {
			System.err.println("引数は2つ指定してください.");
			System.exit(1);
		}

		// 読み込むファイルの名前
		String foo = args[0];
		String hoge = args[1];	

		// 必要な処理を書く
	}
}
```

**備考**
　ちゃんと使うなら取得した引数値の内容もチェックしましょう。
　桁数とか、属性とか。
JSONが期待通りにcontrollerへ渡らない時の対処法

### 概要

Strong Parameters 対応でattr_accessible 指定が排除された環境において、
仮想属性を含んだJSON データがPOST された際に、params のネスト部分にも仮想属性を含める方法について。

※仮想属性・・・DBにカラムを持たない仮想的な属性。確認用パスワードなどがその例。

### 事の発端
Strong Parameters 対応で、Post モデルからattr_accessible 指定を排除した。

```lang:Post.rb
 class Post < ActiveRecord::Base
   acts_as_paranoid
-  attr_accessible :created_at, :deleted_at, :user_id
-  attr_accessible :image_id, :note
-  attr_accessible :status
-  attr_accessible :version
```

このとき、Api::PostsController に渡るはずのパラメータが不足していた。

送信したJSON：

```
{
  "post": {
          "image_id": "1",
          "note": "test note"    
  }
}
```

期待したparams：

```
{"image_id"=>"1", "note"=>"test note", "post"=>{"image_id"=>"1", "note"=>"test note"}}
```

実際に渡ってきたparams：

```
{"image_id"=>"1", "note"=>"test note", "post"=>{}}
```

※image_id、note は共にPostモデルの仮想属性

### 解決策
Controller に以下の要領で、JSON のルートノードとネストパラメータに含めたい仮想属性名を記載する。

```
wrap_parameters :root_node_name, include: [:hash_key_1, :hash_key_2, …]
```

上の例であれば、次のように記載する。

```lang:Post.rb
class Api::PostsController < Api::ApplicationController
  wrap_parameters :post, include: [:image_id, :note]
```

### 理由
JSON データの場合、データを扱いやすくするようにRails がparams の加工を行っており、ネストされたパラメータの部分については次のように格納するパラメータを決定している。

1. 明示的にオプション（attr_accessible、ParamsWrapper の:include や:exclude など）がある場合はそれに従ってハッシュを作る
2. そうでない無指定の場合は各モデルのクラスメソッドattribute_names を叩くと返ってくるテーブルのカラム名に基づいてハッシュを作る

仮想属性でなければ、特にオプション指定をせずともattribute_names でカラム名が返るので下記のようにネストパラメータが生成される。

```
JSON データ: {"user": {"name": "xx", "age": "yy"}}
↓
controller に渡るデータ: {"name"=>"xx", "age"=>"yy", :user => {"name"=>"xx", "age"=>"yy"}}
```

しかし、仮想属性の場合は、attribute_names を叩いてもそれら属性名が返ることは無いので、オプション未指定ではネストパラメータに含める候補からから抜け落ちてしまっていた。

オプションの指定方法は上述「結論」の通り。
Sensuを理解する


# Sensuとは
Sensuとは、オープンソース（MITライセンス）の監視フレームワークである。
sensu - http://sensuapp.org

こちらのエントリにSensuの概要からインストールまで詳しく説明されているので、非常に参考になった。
Sensuを使って自由度の高い監視システムの構築を行う方法 | Ryuzee.com http://www.ryuzee.com/contents/blog/6843

# さまざまな監視フレームワーク
Sensuの他にも、監視フレームワークにはさまざまな種類がある。有名どころだと、ZabbixやNagios、Muninなどがあげられる。
Zabbix - http://www.zabbix.com/jp/
Nagios - http://www.nagios.org
Munin  - http://munin-monitoring.org

# Sensuの特徴
* Nagiosの問題点を解決するために生まれた監視フレームワーク
* シンプルで融通が効き拡張性があるモニタリングフレームワーク
* Chefやpuppetで簡単に導入できる
* クラウドを意識して開発されている
* コミュニティが活発
* コードは[Github](https://github.com/sensu)でホストされ、テストコードは高いカバレージ。TravisCIで継続的インテグレーションを実施
* Nagiosのプラグインを再利用可能
* 設定はすべてJSONファイルで行う

# Sensuを使う際に必要そうな知識（技術）
* [RabbitMQ](http://www.rabbitmq.com)
* [redis](http://redis.io)
* [Graphite](http://graphite.wikidot.com)
* [Git](http://git-scm.com)/[Github](https://github.com)
* [Chef](http://www.getchef.com/chef/),[Puppet](http://puppetlabs.com)
* [Ruby](https://www.ruby-lang.org/ja/)

# Sensuの構造
* Handler : Handlerはメールを送信したり、他のシステムにデータを送信したりといったアクションを実施するために使われる。

* Checkスクリプト : Checkスクリプトは、例えば、Apacheのプロセスの死活監視を行ったり、ロードアベレージなどデータの収集を行うことが可能。

※ HandlerやCheckスクリプトは、どのような言語でも記述できる。

* Server : Checkを実行するにあたっての準備やCheckの結果の処理やイベントのハンドリングを行う。

* Client : 実際にCheckが行われる監視対象上にインストールする。Clientはチェック実行のリクエストを受けたり、Checkを実行したり、ServerにCheckの結果を送信。Client単体で定期的にチェックを実施するように制御することも可能。

* API : Sensuのデータに対するRESTベースのAPIを提供。このAPIをコールすると登録済みのClientの情報や現在のイベントなどを取得可能。次に紹介するDashboardはAPIを使って実装されている
* Dashboard : SensuのWebベースのダッシュボードで、Checkの結
果NGだったものを表示したりすることが可能。ただし機能は少ない。
※ http://www.ryuzee.com/contents/blog/6843 から引用


# Sensuはこういう人に向いている
Sensuは自由に監視システムを構築したい人に向いている。また、今後も新しいソフトウェアをどんどん導入していく予定で、それを監視する予定の人にも向いている。Zabbixなどようなオールインワンを好む人には向いていない。

# 参考にしたWebサイト
http://codezine.jp/article/detail/7442
http://u0sa0.hateblo.jp/entry/2014/05/18/201755
http://www.slideshare.net/s-cubism-recruit/sensu-graphite20140205
prelink使ってみた

Atom+HDDのノートPCが遅すぎでprelinkすることにした。raspberrypiにも使えそう。
プログラムやライブラリを事前に読んでおくprelinkについて。
preloadはうまくキャッシュされなかったのでやめた。

# インストール

```bash:
pacman -Sy prelink
```

# 設定

```bash:cronに登録
# fcrontab -l
@reboot prelink -amR
```

* キャッシュファイル: /etc/prelink.cache
* 設定ファイル: /etc/prelink.conf
Mac10.9 Marbericks クエリログの設定(mysql5.6)

my.cnfの場所を確認する

```
 >> mysql --help | grep -B 1 "/my.cnf"
 Default options are read from the following files in the given order:
/etc/my.cnf /etc/mysql/my.cnf /usr/local/etc/my.cnf ~/.my.cnf
```

出力されたパスの場所にファイルを作る。/usr/local/etc/フォルダの下に作る事にする。

```
>> sudo vi my.cnf
```

下記を追加

```
general_log=1
general_log_file=/var/log/mysql/query.log
```
R言語で年齢や月齢を計算する。

##目的
R言語で年齢や月齢を計算する。
（年単位や月単位で２つの日付差を計算する）

##方法
(生年月日を1981/07/05とした場合)

年齢を求める

```r
length(seq(as.Date("1981/07/05"), Sys.Date(), "year"))-1
```

月齢を求める

```r
length(seq(as.Date("1981/07/05"), Sys.Date(), "month"))-1
```

##詳細

年齢を計算するアルゴリズムとしては、

```php
age = floor((20140917 - 19810705) / 10000); // PHPの場合
```

が有名ですが、型変換を行うとコードが煩雑になってしまうケースも多いと思います。

普通、Rで日付差を計算するにはdifftime()を使いますが、残念ながら週単位までしか使えません。

ということで、連続データを生成するseq()を使い、開始日～終了日（今回で言うと誕生日から処理日）までの年行列あるいは月行列を生成し、その数をカウントして年差、月差を計算しています。seq()は開始日を行列に含めるので、-1して年齢、月齢としています。
Git submoduleで開発する手順


動作確認で親リポジトリが必要だけど親に影響を与えたくないので、親落としてサブモジュールだけを開発するまでの手順です。

### 構成(node.js)
今回はnode.jsをサンプルにしています

```
.
└── oya
    ├── app.js
    ├── package.json
    ├── routes
    │   └── index.js
    ├── src
    │   ├── common
    │   ├── submoduleA
    │   └── submoduleB
    │       └── README.md
    └── views
```

### 親取得
まずは親リポジトリをクローンしてきます

```
$ git clone oya.git
```

### サブモジュール中身を確認
この状態ではまだサブモジュールが無い事を確認します。
サブモジュールは参照だけなので落ちてきてない

```
$ ls -a oya/src/submoduleB
.	..
# まだなにもない
```
### サブモジュール取得

```
$ cd oya
$ git submodule init
$ git submodule update
```

### もう一度、サブモジュール中身を確認
今度はサブモジュールの中身があります！

```
$ ls -a oya/src/submoduleB
.		..		.git		README.md
```
### サブモジュールでブランチ作成
親に影響無くブランチができるのを確認します

```
$ cd oya/src/submoduleB
$ git branch -a
* master
  remotes/origin/master
$ git checkout -b develop_subB
$ git push origin develop_subB
$ git branch -a
* develop_subB
  master
  remotes/origin/develop_subB
  remotes/origin/master
```
### 親のgitリポジトリに影響ないか確認
サブモジュールのブランチは表示されません！

```
$ cd ../../
$ git branch -a
* master
  remotes/origin/master
```

### まとめ
* サブモジュールは初期化&更新が必要
* サブモジュールのディレクトリ以下の影響は親には伝わらない

#### 気になる事
* 親に変更入れた時に親でコミット忘れそう(ルーティング設定とか)
* .gitmodulesの変更でブランチ指定とかし始めたら混乱しそう
* 今回は担当が分かれているので親に影響が無い方がよいが運用フェーズになって横断的に修正が必要になる事が多そうならsubtreeを検討してみたい
Final Cut Pro Xを使って簡単にApp Previews(ビデオプレビュー)を作る方法

※ この記事はAppleが公開したドキュメント[Final Cut Pro X Guide for Creating App Previews](https://developer.apple.com/app-store/app-previews/final-cut-pro/Creating-App-Previews-with-Final-Cut-Pro-X.pdf)に基づくものです。
※ Final Cut Pro Xは30日間無料でお試しもできます。[こちら](http://www.apple.com/jp/final-cut-pro/trial/)から。
※ *iPhone 6, 6 Plusのサイズが追記されたので追記 (9/25/2014)*

# はじめに
Final Cut Pro XですごいApp Previewが作れますよ。まずQuickTime Playerを使ってiOS端末から画面キャプチャを録画します。次に、Final Cut Pro Xを使ってその録画を編集したり、タイトルやトランジションやサウンドを付けます。

App PreviewsについてのApp Storeガイドラインについては[App Previewウェブサイト](https://developer.apple.com/app-store/app-previews/)をご確認ください。

* システム要件
    * iOS 8のiOS端末
    * OX X YosemiteのMac
    * version 10.1.3以降のFinal Cut Pro X

# QuickTime Playerを使って画面を録画する
1. iOS端末をライトニングケーブルを使ってMacに接続します
2. QuickTime Playerを開きます
3. *File > New Movie Recording*を選びます
4. 録画ボタンの右にあるプルダウンからCameraとMicrophoneとしてiOS端末を選びます（QualityはHighでよいと思われる）
5. 録画ボタンを押すと録画が開始されます

# Final Cut Pro Xを使ってApp Previewを作る
* 録画した画面キャプチャをインポートする
    1. 新しいライブラリを*File > New > Library*から作る
    2. *File > Import > Media*からビデオをインポートする
    3. ウィンドウから録画した画面キャプチャファイルを選ぶ
* App Previewプロジェクトを作成する
    1. *File > New > Project*からNew Projectを作る
    2. 適当な名前をつけ、Video PropertiesはCustomを選択する
    3. FormatはプルダウンからCustomを選択する
    4. 解像度は画面キャプチャに合わせて以下のとおり設定する
    5. Rateは30pに変更する

    | Device | Portrait | Landscape |
    |:-----------|:-----------|:-----------|
    | iPhone 6 | 750 x 1334 | 1334 x 750 |
    | iPhone 6 Plus | 1080 x 1920 | 1920 x 1080 |
    | iPhone 5s, 5c, iPod touch 5th generation | 640 x 1136 | 1136 x 640 |
    | iPad Air, 4th generation, iPad mini with Retina display | 900 x 1200 | 1200 x 900 |

* クリップを加える　←使わなかった
* タイトルを加える　←使わなかった
* トランジションを加える
    * 中央のツールバーからTransitions Browserボタン（♫の右）を押す
    * 使いたいtransitionをタイムラインのクリップ前後にドラッグする
    * transitionアイコンの端をドラッグすることで長さを調整する
* サウンドを加える
    * 中央のツールバーから♫ボタンを押す
    * ライブラリから好きなオーディオファイルを選ぶ
    * ファイルを直接タイムラインにドラッグし、ビデオの適切な位置に並べる
* ヴォイスオーバーを録音する　←使わなかった
* エクスポートする
    * *File > Share > Master File*を選ぶ
    * Infoタブでタグが付けられるが、適当に（Gocco / FireTruck / AppPreviewとか）。たぶん要らない。
    * Settingsタブをクリックし、ビデオコーデックがH.264であることを確かめる
    * SettingsタブでInclude chapter markersのチェックは念のため外しておく
    * Nextボタンを押し、App Previewを保存する場所を選ぶ

# まとめ
* 動画初心者でしたが、これに基づいて[それっぽいもの](https://www.youtube.com/watch?v=DuPCM3kFdK8)はできました（基本的にUIキャプチャから構成すべきもので、プロモ動画ではありません）
* iPhone用, iPad用（対応している場合）それぞれが必要です
* アプリ内課金でのみ利用可能なフィーチャーはその旨明記すべしなど、注意が必要です
* *（9/25/2014追記）iPhone 6, 6 Plusのサイズを追記しました。iPhone 5用に作った動画がiPhone 6, 6 Plusでも再生できることは確認していますが、例えばiPhone 6 Plus用に作った動画がiPhone 5で再生されるかは不明です。*

# 参考
* 出典
    * [Final Cut Pro X Guide for Creating App Previews](https://developer.apple.com/app-store/app-previews/final-cut-pro/Creating-App-Previews-with-Final-Cut-Pro-X.pdf)
* 関連
    * [AppStoreに動画が載せられるようになったので、その仕様とよくある質問まとめ](http://qiita.com/exilias/items/cdd3c5f3be4760361300)
Playframework の I18N で 1st, 2nd, 3rd, 4th, ...


`conf/messages` を書くときに、引数が 1 なら 1st, 2 なら 2nd, 3 なら 3rd, 4 なら 4th を出したい。

### 何もしなかった例

````
ranking={0}th
````

これでは 1th, 2th, 3th, 4th, になる。

### 解決法

Play の I18N は [`java.text.MessageFormat`](http://docs.oracle.com/javase/jp/6/api/java/text/MessageFormat.html) を内部で使っているので、choice パターンを使うことができる。

````
ranking={0,choice,1#1st|2#2nd|3#3rd|3<{0,number,integer}th}
````

これで 1st, 2nd, 3rd, 4th, 5th, ... となる。

パターンの解釈

* `{` パターン開始
* `0,` 最初の引数を対象にする
* `choice,` 次の選択肢から選ぶ
* `1#1st` 引数が 1 なら 1st
* `|2#2nd` または引数が 2 なら 2nd
* `|3#3rd` または引数が 3 なら 3rd
* `|3<{0,number,integer}th` または引数が3より大きいなら、最初の引数を整数としてフォーマットして th をつけたもの
* `}` パターン終了

どのパターンにも当てはまらない場合にどうなるか気になる。
`choice` を指定した場合にはフォーマッタとして [`java.text.ChoiceFormat`](http://dodododo.jp/java/javase_6_docs_ja/api/java/text/ChoiceFormat.html) が使われる。 ChoiceFormat には次のように書かれているので、きっとこれと同じ挙動だろう。

> 一致するものがない場合、数値 (X) が小さすぎるのか大きすぎるのかによって、最初または最後のインデックスが使用されます。

上で挙げたパターンに対して 0 を引数に与えると、最初のパターンより小さいので 1st が返される。

### 上記解決法がダメな場合

さて、既にお気づきだと思うが、20th までは大丈夫なものの 21st が望み通りに出せない。22nd, 23rd しかり。全パターンを書き出すことは不可能（無限）。

与えられる数の上限が決まっている場合や、ある程度大きい数の場合には後置文字列が間違ってても気にしない場合には使える。

もっと素敵な解決法はきっと誰かがコメントに書いてくれるだろう。
（すみません。書いてください。おねがいします。）
仮想環境 Vagrant + VirtualBox ~ Centos6.5 (OS X Mavericks)

# 1. Vagrantのインストール

公式サイトから最新版をダウンロードしてインストール
http://www.vagrantup.com/

今回は、Vagrant-1.6.5.dmgをダウンロードし インストールしました。

* インストール確認

```
$ vagrant --version
Vagrant 1.6.5
```

# 2. VirtualBoxのインストール 

公式サイト最新版をダウンロードしてインストール
https://www.virtualbox.org/

今回は、VirtualBox-4.3.16-95972-OSX.dmgをダウンロードし インストールしました。

# 3. 仮想マシンの作成
Vagrantでは[box]という仮想マシンのイメージを作成する事で簡単に複数の仮想マシンを作成できます。

* vagrantにcentosのboxを追加

* 追加したboxから仮想マシンを作成して起動

## boxの追加

* 追加

今回は、以下からダウンロードして追加しました。

```
$ vagrant box add centos6.5 https://github.com/2creatives/vagrant-centos/releases/download/v6.5.3/centos65-x86_64-20140116.box
```

* 確認

```
$ vagrant box list
centos6.5 (virtualbox,0)
```

## VMの作成

* 作成
VMを作成する場所へ移動し、以下のコマンドを実行。

```
$ vagrant init centos6.5
```

準備が完了!

## VMの起動

```
$ vagrant up
```

## 接続
ターミナルで接続してみる。

```
$ vagrant ssh
```

vagrantユーザーでログインできていればOK!!!
※デフォルトでvagrantユーザーが用意されています。

* ログアウト

```
$ exit
```

## VMの終了

```
$ vagrant halt
```

## その他のコマンド

* VMの再起動

```
$ vagrant reload
```

* VMの状況の確認

```
$ vagrant status
```

# 4. 仮想マシンの設定

macからvagrant上の仮想マシンのにアクセスする為の設定
[Vagrantfile]というファイルが設定ファイルになる。

今回は、Railsでポート3000を使用する為のポートフォアリング設定を追加する。

※mac側の操作だよ。

```
$ vim Vagrantfile
config.vm.network "forwarded_poot", guest: 3000, host: 3000
```

後は、リロードなり、再起動すればOKです。

お疲れ様でした♪
商品アップロードAPI 利用時のファイル必須項目(特価)について

いつもお世話になっております。

商品アップロードAPIで「項目指定」でアップロードを行っていますが、以下のエラーが発生します。
・エラーコード：U-004-0003
・エラー内容：必須フィールドが足りません。

アップロードしているファイルには、以下の項目を設定しています。
・必須項目
　「パス」「商品名」「商品コード」「価格」
・その他項目
　「おすすめ商品」
※ファイルフォーマットを参照しながら設定しています。

エラー後に色々と確認をしたところ、「特価」項目を追加すると正常にアップロード(反映)されますので、「特価」項目に価格と同じ金額を設定することも考えましたが、「特価」の制限として価格より安く、１円以上ということになっており、余り設定をしたくない項目になります。

「特価」は、販売期間を設定すると必須項目になるという記述があるようですが、販売期間には何も設定していません。

お手数ですが、上記設定及び利用方法について、間違っているところがありましたら、ご指摘をいただけますでしょうか。

どうぞ、宜しくお願いいたします。
git pullせずにgit upする


git pullした時リモートに変更があると、rebaseが面倒でmergeコミットしてtreeを汚くしちゃってたんだけど、git-upというツールを使うとfast-forwardできない時は自動でrebaseしてくれて便利だった。
[aanand/git-up](https://github.com/aanand/git-up)

> git pull has two problems:
>
>It merges upstream changes by default, when it's really more polite to rebase over them, unless your collaborators enjoy a commit graph that looks like bedhead.
It only updates the branch you're currently on, which means git push will shout at you for being behind on branches you don't particularly care about right now.

`gem install git-up`したらすぐ使える。

リモートの変更を取り込む時に`git pull`ではなく`git up`を実行するようにする。

![スクリーンショット 2014-09-11 13.08.00.png](https://qiita-image-store.s3.amazonaws.com/0/7325/7bba82d0-0ffa-8ef7-4019-f4c7d3145231.png "スクリーンショット 2014-09-11 13.08.00.png")

↑masterを自動的にrebaseできた。更にカレントブランチ以外もpull/rebaseしてくれている。

またコミットしていないファイルがある状態でgit upしたときは、自動でstashして変更を取り込んだ後にunstashしてくれたりもする。
![スクリーンショット 2014-09-11 13.24.35.png](https://qiita-image-store.s3.amazonaws.com/0/7325/9fe38f9d-d5f5-637b-114f-7fb0c63672ae.png "スクリーンショット 2014-09-11 13.24.35.png")

pull/rebaseの使い分けだけならpull --rebaseオプション付けるのでも良いかなと思ったけど、それ以外にもこういった便利機能があって良い。
bash command memo

# for one liner
```for i in {3..26}; do a=`expr 100 + $i`; echo ${a};done
```

#lsof
#### TYPEが{DEL|cwd|mem|rtd|txt|}以外の件数
http://linux.die.net/man/8/lsof
```lsof | awk '{if($4 !~ /{DEL|cwd|mem|rtd|txt|}/) print}' | sed -e "1d" | wc -l
```


#grep
```find ./ -type f | xargs -I {} grep -ln "cache" {}
```
Goでは、nビットシフトは1ビットシフトをn回行ったのと同じ（CやJavaは違う）

Goの言語仕様の[シフト演算子](http://golang.org/ref/spec#Arithmetic_operators)のところを読んでみると、nビットシフトするのは1ビットのシフトをn回繰り返したのと同じ結果になると書いてある。

これはCやJavaの言語仕様とは違う。

Goのビットシフトの仕様では、無限に左側に符号拡張されたビット列をシフトしたのと同じ結果になる。たとえば`x >> n`（xは符号あり整数、nは符号なし整数）という式の結果は、nがxの幅より大きいとき、0か-1になる。xが0以上なら最上位の符号ビットが0なので全部のビットが右の方に消えて結果は0。xが0未満なら符号ビットが1なので、符号付きシフトで左から1がでてきて結果はすべて1のビット列、すなわち-1になる。

Cでは左辺値の型のサイズより大きい値でシフトしたときの結果は定義されていない。CだとCPUのシフト命令1命令にコンパイルされるのが自然だけど、レジスタサイズより大きいシフトはCPUによって違ったりするだろうから、これはまあそうだろうなという感じだ。

Javaでは左辺値の型がnビット幅なら、右辺値の下位nビットだけがシフト量として解釈されるということになっている。JavaではJavaらしくどのCPUでも同じ結果になるが、暗黙のうちに右辺値がマスクされるのと同じなのでちょっとわかりにくい。

Goの仕様はわかりやすい（少なくとも一番驚きの少ない結果になる）といってよいと思う。
VagrantのUbuntu14.04でChefをいれるときにエラーがでてきた場合の対応


VagrantのomnibusプラグインでゲストOSにChef環境をいれるようにしているのですが、最近ゲストOSがUbuntu14.04だと`vagrant provision`したら下記のようなエラーがでるようになってしまいました。

```bash
==> default: Installing Chef 11.16.2 Omnibus package...
==> default: Downloading Chef 11.16.2 for ubuntu...
==> default: downloading https://www.getchef.com/chef/metadata?v=11.16.2&prerelease=false&nightlies=false&p=ubuntu&pv=14.04&m=x86_64
==> default:   to file /tmp/install.sh.2175/metadata.txt
==> default: trying wget...
==> default: ERROR 404
==> default: Unable to retrieve a valid package!
==> default: Please file a bug report at http://tickets.opscode.com
==> default: Project: Chef
==> default: Component: Packages
==> default: Label: Omnibus
==> default: Version: 11.16.2
==> default:
==> default: Please detail your operating system type, version and any other relevant details
==> default: Metadata URL: https://www.getchef.com/chef/metadata?v=11.16.2&prerelease=false&nightlies=false&p=ubuntu&pv=14.04&m=x86_64
The following SSH command responded with a non-zero exit status.
Vagrant assumes that this means the command failed!

sh install.sh -v 11.16.2 2>&1

Stdout from the command:

Downloading Chef 11.16.2 for ubuntu...
downloading https://www.getchef.com/chef/metadata?v=11.16.2&prerelease=false&nightlies=false&p=ubuntu&pv=14.04&m=x86_64
  to file /tmp/install.sh.2175/metadata.txt
trying wget...
ERROR 404
Unable to retrieve a valid package!
Please file a bug report at http://tickets.opscode.com
Project: Chef
Component: Packages
Label: Omnibus
Version: 11.16.2

Please detail your operating system type, version and any other relevant details
Metadata URL: https://www.getchef.com/chef/metadata?v=11.16.2&prerelease=false&nightlies=false&p=ubuntu&pv=14.04&m=x86_64


Stderr from the command:
```

どうも、Chefの新しいバージョンだと問題があるようなので、応急処置的にVagrantfileでChefのバージョンを11.14.6に固定してエラーを回避するようにしました。

以下の箇所を、

```ruby:Vagrantfile
config.omnibus.chef_version = :latest
```

バージョンを指定するように変更しました。

```ruby:Vagrantfile
config.omnibus.chef_version = "11.14.6"
```

以上です。
SublimeText3での日本語検索設定メモ

SublimeText3のデフォルト設定だと、日本語での検索が可能ではあるが検索ワード入力後に確定すると検索ワード入力エリアに入らず、検索自体も中断されてしまう。

自分的にはとても不便なので調べてみたところ、どうやらデフォルトキーバインドのインクリメンタルサーチ系とバッティングしている模様なので、これを無効にすれば検索ワード入力エリアに入るようになる。

具体的には
Preference->キーバインド（標準）を開いて

```
	// Find panel key bindings
//	{ "keys": ["enter"], "command": "find_next", "context":
//		[{"key": "panel", "operand": "find"}, {"key": "panel_has_focus"}]
//	},

```

```
	// Replace panel key bindings
//	{ "keys": ["enter"], "command": "find_next", "context":
//		[{"key": "panel", "operand": "replace"}, {"key": "panel_has_focus"}]
//	},
```

```
	// Incremental find panel key bindings
//	{ "keys": ["enter"], "command": "hide_panel", "context":
//		[{"key": "panel", "operand": "incremental_find"}, {"key": "panel_has_focus"}]
//	},
```
この3カ所の3行ずつの設定をコメントアウトして無効にすれば、日本語での検索は便利になる。

ただし、インクリメンタルサーチ機能が死んでしまうので多用する人は逆に不便になってしまうかもなので、実際は使い勝手とのバランスになるので、日本語検索を結構使う人向けかなという気もします。
Rubyでスクレイピングをする場合のライブラリの選び方


## はじめに

Rubyではスクレイピングを行う場合に、利用できるライブラリが幾つか用意されている。使い分けに悩まないように、明確な基準を設けておく。

## スクレイピングとは

ここでは、以下をスクレイピングとして扱う。狭義の意味では、2だけのことを表すのかもしれない。

1.  URLにアクセスして、HTMLなどを取得する。
2.  取得したHTMLなどから、必要なデータを抽出する。

## ライブラリの選び方

ライブラリは上記の1,2別に必要となるが、「2.  取得したHTMLなどから、必要なデータを抽出する。」部分は、「Nokogiri」というライブラリがデファクトスタンダードとなっているため、Nokogiriを利用する。

「1.  URLにアクセスして、HTMLなどを取得する。」部分のライブラリは、対象とするサイトの特質によって利用すべきライブラリが異なる。


### Capybara + PhantomJS(poltergist)

JavaScriptで動的に書き換えられる部分のHTMLを取得する場合は、このライブラリの組み合わせを利用する。
インストールが少し面倒なので、JavaScriptを利用しないサイトの場合は、あえて選ぶ必要はない。

### Mechanize

JavaScriptを利用しないサイトで、下記のいずれかに該当する場合はこれ。

- POSTでFormデータの送信が必要
- Cookieの制御が必要
- リダイレクトへの対応が必要

### net/http

単純にGETして取得するだけならこれで十分。複雑なこともある程度はできるが、Mechanizeを利用したほうが簡単。
net/httpでなく、open-uriでもよい。

## まとめ

スクレイピングに必要なライブラリは以下の組み合わせから選定することになる。

１．Nokogiri + Capybara + PhantomJS(poltergist) 
２．Nokogiri + Mechanize
３．Nokogiri + net/http

JavaScriptのハンドリングが必要なら、１の組み合わせを選定するしかない。
ハンドリングが不要なら、2 or 3 の組み合わせになるが、「Mechanize」はインストールが容易であり、利用方法も簡易なので、2の構成ががおすすめ。
[第8回] HTML5でLeapMotionの体験会に参加した 

# 体験会概要
* http://www.zusaar.com/event/14597005
* 日時： 2014年9月13日 (土曜日）
* 場所： カフェ＠セレスティンホテル
* 時間： 15時 ～ 16時30分
* ☆イベント概要
 * 空間がタッチできる話題のガジェットLeapMotionを試してみましょ

### 体験会の風景
* https://theta360.com/s/Qzv

# 体験会経過
### leapjs example
* leapjsとは
 * JavaScript で開発する際に利用する LeapJS というライブラリはオープンソースである
* example
 * https://developer.leapmotion.com/leapjs/examples
* 環境構築方法
 * https://developer.leapmotion.com/leapjs/welcome

### leapmotion+ボクシングファイター
* ボクシングファイターとは
 * http://www.technologia.co.jp/18_786.html
 * 目にもとまらないすばやいパンチをくり出しながら動き回るボクサータイプのロボットである
* leapmotionとは
 * https://www.leapmotion.com/
 * 手のジェスチャーによってコンピュータを操作ができるデバイスである
* やり方
 * leapmotion -> leapjs -> nodeサーバー(websocket) -> ボクシングファイター
* 説明
 * leapmotionで、ボクシングファイターをコントロールするためのシステム
 * leapmotion(leapjs)から出力されるjsonデータが、nodeサーバーを経由して、ボクシングファイターへ送信して、リアルタイムでコントロールを実現できる

### leapmotion+DK2を触ってみる
![写真 2014-09-13 16 16 07.jpg](https://qiita-image-store.s3.amazonaws.com/0/13451/8fa36319-3c7e-da82-490d-df68361fd73a.jpeg)
![写真 2014-09-13 16 13 40.jpg](https://qiita-image-store.s3.amazonaws.com/0/13451/bc54a2cc-1d95-51fd-0bba-86d469a0b079.jpeg)
![写真 2014-09-13 16 13 48.jpg](https://qiita-image-store.s3.amazonaws.com/0/13451/4fea091d-4675-6d30-8b2c-9c72ad908202.jpeg)
![写真 2014-09-13 16 16 20.jpg](https://qiita-image-store.s3.amazonaws.com/0/13451/c9f836b4-3c44-bd3c-4b44-bce3214073bc.jpeg)

### リコーtheta vs. 12個カメラ
![写真 2014-09-13 16 45 12.jpg](https://qiita-image-store.s3.amazonaws.com/0/13451/879addff-7f5b-5c43-a268-1162ecb76a6e.jpeg)

# 今後予定
### 次回開催
* 日時： 10月11日ぐらい
* 場所、時間は、未定

### make faireイベントについて
* http://makezine.jp/event/mft2014/

# 感想
* 体験会の時間は、少ないので、Kinect2を触っていなかって、残念になったw
* 次回のイベントに、Kinect2の触ることを要望する
CSS Digを使って対象URLのCSSを解析する

[CSS Audits: Taking Stock of Your Code](http://alistapart.com/article/css-audits-taking-stock-of-your-code) という、CSS Auditという面白いトピックの記事を見ていて、その中に出てきた[CSS Dig](https://github.com/tomgenoni/cssdig)というツールがとても便利だったので紹介する。

>Peek inside CSS to uncover refactor opportunities.

CSS DigはPythonで実行するツールで、対象のURLに使われているCSSの利用状況を解析して、HTMLファイルでレポートするツール。

## 準備と使い方

Pythonは2.7.xじゃないと動かないそうなので、パスを通しているPythonを2.7系の最新にしておく。Pythonの環境構築については [pyenvを使ってMacにPythonの環境を構築する](http://qiita.com/1000ch/items/93841f76ea52551b6a97) あたりを参考にどうぞ。

### BeautifulSoupのインストール

依存しているライブラリを`easy_install`を使ってインストールする。

```bash
$ easy_install beautifulsoup4
```

### CSSDigリポジトリのクローン

リポジトリにあるPythonスクリプトを実行することになるので、クローンする。

```bash
$ git clone git@github.com:tomgenoni/cssdig.git
```

### CSSDigを実行する

クローンしてきたリポジトリにある`cssdig.py`というファイルがあるので、引数に解析したいURLを指定して実行する。
ローカルファイルもチェック出来ると良いと思うけど、今は対応してない。

```bash
$ python cssdig.py http://1000ch.net
```

解析が終わると、`report`というフォルダの配下に、解析レポートが出力されている。
`background`プロパティで何色使っているかや、`!important`が何回宣言されているか等の結果が見れる他、
そのプロパティをクリックするとCSSでどこで使われているかがハイライトされてひと目で確認することが出来る。

## 解析結果の例

![cssdig-report.png](https://qiita-image-store.s3.amazonaws.com/0/10549/1732c50a-8c20-873b-aa85-22f7266c8653.png)

## 余談

FontAwesomeとか、normalize.cssみたいなライブラリCSSだと、使わないCSS増えるので解析の対象としないような指定も出来ていいかも？（未参照のCSSは削除しておくべきと言われればそれまでだけど。）
あと、Webで使えると便利かなと思った。
oh-my-zshの大量のaliasをpecoで絞り込む


oh-my-zshで大量のaliasが作成されているのだけれども多すぎて。。。

ふとpecoでalias確認できれば使えるんじゃないかと思いやってみた。

```~/.zshrc
function peco-alias(){
  TARGET_ALIAS=$(alias | peco --query "$LBUFFER")
  BUFFER=$(echo "$TARGET_ALIAS"|awk -F '=' '{print $1}')
  CURSOR=$#BUFFER
  zle clear-screen
}
zle -N peco-alias
bindkey '^@^a' peco-alias
```

結構、良い感じに使えそうだ。

一応、設定ファイルも貼っとく。
https://github.com/astrsk-hori/dotfiles/blob/master/.zshrc.peco
EC2+S3+StorageGateway+Sambaで作るファイルサーバ

AWS公式サイトでも紹介されていた、EC2インスタンスとS3とStrageGatewayで構築するファイルサーバを試しに自分でも作成してみました。

## 手順
1. Storage Gateway用EC2インスタンスを構築する
2. 1で作ったインスタンスをもとにStorage Gatewayを立ち上げる
3. 2で作ったStorage Gatewayにキャッシュ用(100GB)とアップロード用(100GB)のEBSをアタッチする
4. Samba用EC2インスタンスを構築する
5. 4で作ったインスタンスにiSCSI経由でディスクをマウントする
6. Sambaを構築する


#### 参考URL
[memorycraft: Storage Gatewayってなんじゃ？](http://snipsnaptmae.wordpress.com/2013/03/01/memorycraft-storage-gatewayec2centoss3/)
[Stray Penguin - iSCSI](http://www.asahi-net.or.jp/~aa4t-nngk/iscsi.html)
[Windowsファイルサーバー構築(Samba)](http://centossrv.com/samba.shtml)

## 使ってみての感想と注意点
* 構築自体は非常に手軽にできる
* S3領域を使っているけど、コンソール等には現れないので一見するとわからない。
* キャッシュ及びアップロードEBSの中身やS3のインタフェース内部はブラックボックス化されていてわからない。
* Storage Gateway用インスタンスはxlarge、Samba用インスタンスはc1.mediumを使用してみたけど、思ったよりはサクサク動く。
* 購入・設定できるStorage Gateway用インスタンスのサイズが東京地域ではxlarge以上なのはなぜだろう・・・オネェちゃんのいる飲み屋レベルのボッタクリだわ。
* Windows7及びMacOSからの接続をしてみたところ、問題なく読み書き可能。
* S3領域を使っているのでディスク容量は青天井になるのでは？と震えながらdfコマンドを叩いたら、容量は500GBとなっていた。500GBという数字はどこにも出した記憶がないので、おそらくブラックボックス化されたStorage Gateway周りでよろしくやってくれた結果の数値なのかもしれない。この上限を超えたらどうなるのかは別途検証予定。

## 最後に
面白そうなので今後もいろいろ試してみたいのですが、コストおもいっきりかかるのでおさいふと相談です(´・ω・｀)
vimのステータスラインをかっこいい表示にするまでにやったこと

# 結果

![3__vim.png](https://qiita-image-store.s3.amazonaws.com/0/17353/0e40470c-1ecf-3fc6-4502-abb3966d5fa1.png)

はっぴー

# 環境

* OS X 10.9.2 (2015/09/14 追記: 10.10.3 でもできた)
* iTerm
* screen
* vundle

# やったこと

## [lightline.vim](https://github.com/itchyny/lightline.vim) をインストール

* `Plugin 'itchyny/lightline.vim'` を追加
* `set laststatus=2` を書いてなかったので追加

## screenのHEADをhomebrewでインストール

(2015/09/14 追記: homebrew/dupes/screenのバージョンが上がったため、HEADである必要はなくなった)

デフォルトのscreenが256色対応でなかったため。

```lang:shellscript
brew tap homebrew/dupes
brew install --HEAD screen
```

### 256色対応であることを確認する方法

```lang:shellscript
curl http://robotsrule.us/vim/256colors.txt | perl
```
Trello ラクラク画像添付

Mac での操作を想定していますが、Windows でも同様のことはできる・・・はず。

# 背景

ご存知のように Trello ではカードに画像を添付することができます。
添付した画像はカバーとして利用され、一覧で表示された場合でも一目で課題を探し出すことができます。

![Yknot___Trello.png](https://qiita-image-store.s3.amazonaws.com/0/7823/70efdd1e-6243-dc7b-90fb-370a3a6fe45d.png)

便利ですね。

# 方法

この画像添付機能、実はクリップボードに記録されている画像を「cmd + v」で貼り付けることができます。

1. Mac の標準ショートカット「cmd + shift + ctrl + 4」でキャプチャをクリップボードにコピー

    ![a67363c7f66823c8106fedde961d0d0a.gif](https://qiita-image-store.s3.amazonaws.com/0/7823/c67e80a2-32ad-0a62-10e8-8d80a09833bc.gif)

2. Trello でカードを開いて「cmd + v」

    ![6ca9f923d4984b6490bcde49ac65a503.gif](https://qiita-image-store.s3.amazonaws.com/0/7823/c00818fb-6f37-54ea-b739-cafb091eddeb.gif)


画像添付がはかどりますね！


# おまけ

GitHub や Qiita でも `cmd + shift + ctrl + 4` でキャプチャ → `cmd + v` でペーストできますよ！


**GitHub**

![c95f91c4c1e8d39c0b224c0ccaab87dd.gif](https://qiita-image-store.s3.amazonaws.com/0/7823/e0b394a0-6b3a-d37d-aad1-bbff4564dfee.gif)

**Qiita**

![83c877d6d5d8ac5c05d71f085f3be640.gif](https://qiita-image-store.s3.amazonaws.com/0/7823/8b4bc7bc-5c61-73b6-8e40-2a4e6e63ad32.gif)
[Xcode] 実機が認識されないときはDeployment targetを変えてみる

Xcodeから実機にアプリを転送したいのに端末が認識されていない場合は、プロジェクト設定のDeployment targetにてターゲットとなるOSのバージョンを適切に変えると端末を選択できるようになるはず。
Rails where句で日をbetweenで指定

自分向けへのメモ

```rb
# 指定した日に合致した件数を返す
def self.number_of_(date)
  self.where(created_at: date.beginning_of_day..date.end_of_day).count
end
```

----
self.number_of_date(Date.new(2014,9,1)9で生成されるSQL

```sql
SELECT COUNT(*) FROM `tbl` WHERE (`tbl`.`created_at` BETWEEN '2014-09-01 00:00:00' AND '2014-09-01 23:59:59')
```
IntelliJ IDEAでソースコードのステップ数をカウントする

IntelliJ IDEAでソースコードのステップ数をカウントする方法について紹介します。

File > Settings > Pligins を選択し、「Browse Respositories」ボタンをクリック。「statistic」で検索し、表示されるリストにある「Statistic」をダブルクリックし、インストールします。

![statistics.png](https://qiita-image-store.s3.amazonaws.com/0/43869/149a8c5b-6907-f07d-9080-bd8ab22bcb41.png)

ダウンロード、インストールしたらIntellJ IDEAを再起動します。

![statistics2.png](https://qiita-image-store.s3.amazonaws.com/0/43869/638edefc-36b1-ca2c-efc5-817ee837ad4f.png)

「Statistic」ウインドウを開くと、ソースコードのステップ数が表示されます。対象を絞り込んでカウントアップする場合は、「Project」ウインドウで対象となるディレクトリを選択して、「Refresh on selection」をクリックして下さい。
WeakキャプチャリストでOptional Chainingするとエラーになった



## 問題

Weakキャプチャリストを記述して循環参照を回避しようとしました。
`self`はOptional扱いになるので、クロージャの式で`self`をOptional Chainingにするとエラーになりました。

![WTDCommentsViewController_swift_—_Edited.jpg](https://qiita-image-store.s3.amazonaws.com/0/4943/29f842e0-51a4-b1e7-6638-c63b599b51c4.jpeg "WTDCommentsViewController_swift_—_Edited.jpg")

↓

![WTDCommentsViewController_swift.jpg](https://qiita-image-store.s3.amazonaws.com/0/4943/006b241c-561c-21be-d14a-dfa39644956f.jpeg "WTDCommentsViewController_swift.jpg")

```Error
Cannot invoke 'animateWithDuration' with an argument list of type '(NSTimeInterval, delay: FloatLiteralConvertible, options: UIViewAnimationOptions, animations: () -> () -> $T4, completion: (finished: Bool) -> ())'
```

## 原因

クロージャは式が１行の場合その式の結果を戻り値として返します。
layoutIfNeededの戻り値はVoidですが`self`がnilの場合`self?`はnilを返します。
animationsクロージャ型の戻り値はVoidですが、式がnilを返却する可能性があるためエラーになっているようです。


## 解決方法

`self`をOptional Bindingにするとコンパイルが通りました。

![WTDCommentsViewController_swift.jpg](https://qiita-image-store.s3.amazonaws.com/0/4943/ff9523ae-b1bc-c7f2-1646-c91559617559.jpeg "WTDCommentsViewController_swift.jpg")


Optional Chainingで左辺に代入するとコンパイルワーニングが出ますがコンパイルは通りました。

![WTDCommentsViewController_swift_—_Edited.jpg](https://qiita-image-store.s3.amazonaws.com/0/4943/8217ca3b-e7b8-0359-251c-07088237d1d3.jpeg "WTDCommentsViewController_swift_—_Edited.jpg")


最後に`return`を記述するとコンパイルが通りました。

![WTDCommentsViewController_swift.jpg](https://qiita-image-store.s3.amazonaws.com/0/4943/f0056f68-307f-196e-aba7-2e65f394a44c.jpeg "WTDCommentsViewController_swift.jpg")

### 追記

@mono0926 さんより以下ご指摘頂きました。
ありがとうございます。

>式が1つの場合、その式の評価結果が戻り値になってしまうんですよね。
なので、self?.view.layoutIfNeeded()の前に何か他の処理が書かれている場合もコンパイルが通ると思います。
nkfが意外と便利だった件


文字コードがアレな環境の中で色々文字コード変換やら改行コードがアレだったりするので
色々ゴニョゴニョしなくてはならなくてはいけなくなってその時にnkfで色々ゴニョゴニョした時のメモ


## 環境 

* CentOS6.4

## インストール手順

日本語環境なら標準でOSに入っています。(多分)


## 参考にしたサイト

* [4.12 日本語コードの変換 -- (nkf)](http://cns-guide.sfc.keio.ac.jp/2004/2/4/12.html)
* [文字コード変換コマンドnkfの使い方まとめ Linux](http://blog.layer8.sh/ja/2011/12/23/%E6%96%87%E5%AD%97%E3%82%B3%E3%83%BC%E3%83%89%E5%A4%89%E6%8F%9B%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89nkf%E3%81%AE%E4%BD%BF%E3%81%84%E6%96%B9%E3%81%BE%E3%81%A8%E3%82%81-linux/)
* [ファイル末尾の改行を自在にコントロールする](http://d.hatena.ne.jp/zariganitosh/20131216/end_of_file_lf_control)


## 基本コマンド


```shell:~/
nkf [オプション] [変換元ファイル]
```

## よく使うオプション

文字コードと改行コードをメインに

### 文字コード変換系

もっと色々ありますがよく使うものだけにしておく

* -e 変換結果をEUC-JPで出力する
* -j 変換結果をISO-2022-JPで出力する
* -s 変換結果をShift-JISで出力する
* -w 変換結果をUTF-8で出力する

### 改行コード変換系

* -L(文字コード)
 * -Lu LFで出力
 * -Lw CR/LFで出力
 * -Lm CRで出力

### 元ファイルを変換したい場合

* --overwrite
 * ``` nkf hoge.file > hoge.conv.file``` でもOK

## 現在のファイルの文字コードを確認したい

カレントディレクトリ全ての文字コードと改行コードの確認

```shell:~/path/to/dir
nkf -g *
# ファイル単位でも可能
nkf -g hoge.file
```



## ShiftJIsでCR/LFのCSVファイルをUTF-8でLFに変換したい

よくあるケース

```shell:~/path/to/csv.csv
cd ~/path/to/csv.csv
# UTF-8 LFで出力される
nkf csv.csv -Lu -w
```



## 最後に改行を含んだ形で出力させたい(行末に改行コードがないファイルのみ行末に改行コードを挿入する)

awkでパイプするとできる


用途としては

* mysqlのLOAD INTO FILE構文などで使いたいとき等
 * mysql LOAD INTO FILEは[行末に改行文字を含まなくてはならない](http://dev.mysql.com/doc/refman/4.1/ja/load-data.html)ので

```shell:~/path/to/csv.csv
cd ~/path/to/csv.csv
# UTF-8 LFで出力して行末に改行コード
nkf csv.csv -Lu -w | wak '1' > csv.conv.csv
```

勉強になりました。
Postgresqlに接続できなくなった時

開発環境でサーバーに接続できない様子で、下記のような状況。環境はタグの通り。

```bash
$ psql -l
psql: could not connect to server: No such file or directory
	Is the server running locally and accepting
	connections on Unix domain socket "/tmp/.s.PGSQL.5432"?
```

http://stackoverflow.com/questions/13410686/postgres-could-not-connect-to-server

によると

```
rm /usr/local/var/postgres/postmaster.pid
```

で解決。

また別のある時は、ログを見たら `/usr/local/var/postgres`のpermissionが700じゃないからと言われていたのでchmodしてOK
Unityで外部データ読み込み

###外部ファイルの読み込み

キーを押したらファイル読み込みするサンプル
印象としては、Windowsでのファイル読み込みの作りと同じですね

用途的には外部ファイルをデータとして使えると
ゲームで、スクリプトをいじらず
外部ファイルで調整が出来る点ですね

```FileOpen.cs

using UnityEngine;
using System.Collections;
using System.IO; //System.IO.FileInfo, System.IO.StreamReader, System.IO.StreamWriter
using System; //Exception
using System.Text; //Encoding

// ファイル読み込み
public class FileOpen : MonoBehaviour {

	private string guitxt = "";

	// Update is called once per frame
	void Update () {
		// スペースキーを押したらファイル読み込みする
		if (Input.GetKeyDown (KeyCode.Space)) {
			ReadFile ();
		}	
	}
	// 読み込んだ情報をGUIとして表示
	void OnGUI()
	{
		GUI.TextArea (new Rect (5, 5, Screen.width, 50), guitxt);
	}

	// 読み込み関数
	void ReadFile(){
		// FileReadTest.txtファイルを読み込む
		FileInfo fi = new FileInfo(Application.dataPath + "/" + "FileReadTest.txt");
		try {
			// 一行毎読み込み
			using (StreamReader sr = new StreamReader(fi.OpenRead(), Encoding.UTF8)){
				guitxt = sr.ReadToEnd();
			}
		} catch (Exception e){
			// 改行コード
			guitxt += SetDefaultText();
		}
	}

	// 改行コード処理
	string SetDefaultText(){
		return "C#あ\n";
	}
}

```
###外部ファイルのファイル位置
![FileOpen.png](https://qiita-image-store.s3.amazonaws.com/0/49072/bc69974f-aac5-c17a-7412-eb0b71349176.png)

実行ファイルの直下を読み込む

###結果
![FileReadTest.png](https://qiita-image-store.s3.amazonaws.com/0/49072/26e73a98-c4ed-aad0-2634-a7f47a7deb30.png)

###参考サイト
http://itouhiro.hatenablog.com/entry/20130826/unity

おすすめ本
http://amzn.to/2nkXhSX
AngularJSで$sceを使ってるフィルタなんかのテスト



$sceをDIしてるやつ、例えば[こちら](http://qiita.com/izumin5210/items/1b9fe7d2f851ba95136b)のようなののテストを書く場合。

```newlines_spec.coffee
"use strict"

describe "Filter: newlines", ->

  beforeEach module "myApp"

  newlines = {}
  beforeEach inject ($filter) ->
    newlines = $filter "newlines"

  it "\nを<br />に変換して返すこと", ->
    text = "angularjs\nnewlines"
    expect(newlines(text)).toBe ("angularjs<br />newlines")

```
単純にこんな感じに書くと、下記のようなメッセージで失敗する

```
Expected { $$unwrapTrustedValue : Function } to be 'angularjs<br />newlines'.
```

ので、$$unwrapTrustedValueでexpectしてみた。

```newlines_spec.coffee
  it "\nを<br />に変換して返すこと", ->
    text = "angularjs\nnewlines"
    expect(newlines(text).$$unwrapTrustedValue()).toBe ("angularjs<br />newlines")

```

テスト通ったけど、$sceProviderをテストの時は無効化するとか、他のやり方のほうがいいんだろうか。

```sce_provider_desable.coffee
beforeEach module 'myApp',($sceProvider)->
  $sceProvider.enabled(false)
  return
```
Macの音量をコマンドラインから指定する

# きっかけ

<blockquote class="twitter-tweet" lang="ja"><p>リモートよりMacのボリュームをコントロールできる謎JSPを開発した。 volumeControl.jsp?volume=0 でミュート、volumeControl.jsp?volume=10で最大音量 <a href="https://t.co/oE86tUFQIi">https://t.co/oE86tUFQIi</a></p>&mdash; 山本裕介 (@yusuke) <a href="https://twitter.com/yusuke/status/499084603559137280">2014, 8月 12</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

# やり方

```
osascript -e 'set Volume 4'
```

# 何故か０から７までで指定

- [CLIでMacOSXの音量調整](http://bellonieta.net/2013/01/cli%E3%81%A7macosx%E3%81%AE%E9%9F%B3%E9%87%8F%E8%AA%BF%E6%95%B4/)

# まとめ

Node.js版をNodObjCで作ったが、外部コマンド版も作ってから投稿しようと
おもって、時間が開いてしまったので忘れてないように投稿。

# 関連記事

- [コマンドラインで1秒より短い時間を指定してスリープさせるには](http://abrakatabura.hatenablog.com/entry/2015/03/11/211524)
- [mrubyでWebカメラを黒い画面にそのまま表示できるようにした](http://abrakatabura.hatenablog.com/entry/2017/02/25/080830)
- [Rustでコマンドラインアプリでキーが押されたかの判定しつつ、別の処理も進めるには](http://abrakatabura.hatenablog.com/entry/2017/09/20/065024)
- [RustでWebカメラの映像をコマンドプロンプトに出すコマンドを作った](http://abrakatabura.hatenablog.com/entry/2017/09/21/064630)
- [macOSでコマンドラインでWindowsの共有フォルダをマウントして一般ユーザーがアクセスできるようにする](http://abrakatabura.hatenablog.com/entry/2017/12/12/233940)
R言語でSQLのdistinctのような処理（特定の列で重複を取り除いたデータを得る）

##目的
R言語のデータフレームから、特定の列の値を一意にしたデータを取り出す。

##方法

```r
データフレーム[!duplicated(データフレーム$一意にしたい列名),]
```

##例
売買履歴データからユーザーのメールアドレスを一意（重複なし）にしてデータを取りたい。ついでにデータにある顧客名列と性別列も付けて取りたい(同じメールアドレスで複数の名前や性別がある場合は、そのうち一つだけ取れればいい)。

重複なしのメールアドレスだけならunique()で取れるのですが、この場合顧客名と性別は後から追加しないといけません。

コマンド例

```r
売買履歴[!duplicated(売買履歴$メール),c("メール","名前","性別")]
```

##おまけ

重複分として削除されたデータは次のコマンドで取得できます。
(duplicated()につけていた!を外しただけ)

```r
売買履歴[duplicated(売買履歴$メール),c("メール","名前","性別")]
```

以上です
Vimメモ


##### Vimの起動
`$ vim`

##### Vimの終了
`<ESC>:q`

##### 移動
左、下、上、右
`h` 
`j`
`k`
`l`

##### エクスプローラーを開く
Vim内にエクスプローラー的なものがあるので、できるだけこれを使う。Finderでファイル名を調べるとかやらない
`:Explore`
`j`,`k`で下、上移動、`<CR>`で選択

##### ノーマルモードと編集モード
起動時はノーマルモード、編集モード(文字を入力する)に移行するときには
`i`(ノーマルモード時点のカーソル直前から編集できる)
`o`(ノーマルモード時点のカーソル直後から編集できる)
ノーマルモードで色々ためしていると間違えてo押しちゃって編集モードに移行＆文字を数文字入れてしまうこと多々あり
編集モードからノーマルモードへは
`ESC`
で移行。

##### アンドゥ
ノーマルモード時に
`u`(undo)
これで１つ戻る。やっちゃったと思ったらノーマルモードに戻って`u`連打で凌ぐ。

##### ページスクロール
`C-f` 下にページスクロール(forward)
`C-b` 上にページスクロール(back)

##### 単語単位移動
`w` 次の単語の先頭へ
`b` 前の単語の先頭へ
`e` 今の単語の最後へ(既に最後だったら次の単語の最後へ)
ページスクロールと単語単位移動覚えたらスムーズにカーソル移動できるようになった。
`h``j``k``l`は微調整的に使えばよいな。

## CygwinにNeoBundleをいれた

##### ダウンロード

```
$ mkdir -p ~/.vim/bundle
$ git clone https://github.com/Shougo/neobundle.vim
$ ~/.vim/bundle/neobundle.vim
$ git clone https://github.com/Shougo/vimproc ~/.vim/bundle/vimproc
```

##### vimrcに書く

```:.vimrc
if has('vim_starting')
  set runtimepath+=~/.vim/bundle/neobundle.vim
  call neobundle#rc(expand('~/.vim/bundle/'))
endif

NeoBundle 'Shougo/neobundle.vim'
NeoBundle 'Shougo/vimproc'
NeoBundle 'VimClojure'
NeoBundle 'Shougo/vimshell'
NeoBundle 'Shougo/unite.vim'
NeoBundle 'Shougo/neocomplcache'
NeoBundle 'Shougo/neosnippet'
NeoBundle 'jpalardy/vim-slime'
NeoBundle 'scrooloose/syntastic'
```

##### NeoBundleInstallする
`:NeoBundleInstall`
エラーが出る。vimploc_cygwin.dllが無い。

##### vimploc_cygwin.dllを作る
~\.vim\bundle\vimproc
にソースがあるので、これをビルド

cygwinで上記フォルダへ移動
`make -f make_cygwin.mak`
ってすると~/.vim/bundle/vimproc/autoload
にvimproc_cygwin.dllができる

##### NeoBundleUpdateしておく
エラーでなくなる

##### vimrcに追加していく
`NeoBundle 'ctrlpvim/ctrlp.vim'`
とか。

## システム側のコマンドを呼び出す
`:!ls`

## バッファ関連

##### バッファの一覧を見る
`:ls`

% がカレントウィンドウのバッファ、 # はオルタネイトバッファを表す。

```
:ls
  1      "foo.php" 行 22
  2 %a   "bar.php" 行 7
  3 #    "hoge.php" 行 6
```

##### オルタネイトバッファへの切り替え
`:e #`
(`CTRL+^`)

##### 各バッファへの切り替え
`:b バッファ番号`

##### 次のバッファに移動する
`:bn`

##### 前のバッファに移動する
`:bp`

##### 現在開いているバッファを消す
`:bd`

## ジャンプ関連
`C-f` 次ページ
`C-b` 前ページ

##### タグジャンプ
http://vim-jp.org/vimdoc-ja/usr_29.html
↑参考になる

`C-]` タグジャンプ
`C-w ]` タグジャンプするときにウィンドウ分割
`:tags` タグスタックリスト(タグジャンプ履歴)
`C-t` バックタグジャンプ
`:tag` 前のタグジャンプ先へ

## カーソルジャンプの履歴みたいなの
上のはタグジャンプ。ジャンプの履歴は以下。
`C-o` 直前のカーソル位置
`C-i` 先のカーソル位置
`;ju` ジャンプリスト表示

## テキストオブジェクトについて
http://qiita.com/kasei-san/items/143af11bb2559cf0e540
良い。

## 検索結果のハイライト
`:set hlsearch`
`:nohl` ハイライト消す

## CygwinにSrcExplを入れる
SrcExpl：ソース見るのに便利
`:Explore`より便利。`ctrlp`との使い分け。
https://github.com/wesleyche/SrcExpl

インストールは

```:.vimrc
NeoBundle 'The-NERD-tree'
NeoBundle "taglist.vim"
NeoBundle 'wesleyche/SrcExpl'
NeoBundle 'wesleyche/Trinity'
set tags=tags
```

で終わり。
ctagsはKaoriyaではなくてapt-cyg install ctagsしたものでないとだめ。これにはまった。

##### 折り返ししない
set nowrap
データセンターにPC置いたらすごい冷えて感動した

常温で常時88℃〜90℃あたりだったが、
ラックの一番下(1Uあたり)に置いたところすごい冷えて(55℃!)感動した。

```bash:
$ sensors
k10temp-pci-00c3
Adapter: PCI adapter
temp1:        +55.5°C  (high = +70.0°C)
                       (crit = +100.0°C, hyst = +95.0°C)
```
iOS プロトタイピング - Masu

UI 設計をする際、各パーツのサイズや配置で悩むことが多々あり、そんな悩みを UIView と分かち合うためのプレースホルダもどき。

[midnightSuyama/Masu](https://github.com/midnightSuyama/Masu)

## インストール

[CocoaPods](http://cocoapods.org) でどうぞ。

	pod "Masu"

## 使用方法

### Storyboard

UIView の `Custom Class` に `Masu` の四文字を入力するだけ。
ラベル表記を望むなら、`User Defined Runtime Attributes` で `text` に String を添えて。

![storyboard.png](https://qiita-image-store.s3.amazonaws.com/0/54402/c5bd54f8-b870-fca6-75bf-cea9cfa237b8.png)

### Code

#### UIView

普通に View として利用。

``` objective-c
Masu *masu = [[Masu alloc] initWithFrame:CGRectMake(0, 300.0f, 220.0f, 100.0f)];
masu.backgroundColor = [UIColor colorWithRed:0 green:0.5f blue:0.5f alpha:1];
masu.text            = @"View";
[self.view addSubview:masu];
```

#### UIImage

UIButton などの画像として扱いたいとき。

``` objective-c
UIImage *image = [Masu imageWithSize:btn.frame.size backgroundColor:[UIColor grayColor] labelText:@"Button"];
```

#### Category

既存の View に適用したいとき。

``` objective-c
[view showMasu];
```

![category.png](https://qiita-image-store.s3.amazonaws.com/0/54402/b74e9189-3131-d2c6-62c1-9c6dd60cc685.png)

## テスト

[CocoaPods](http://cocoapods.org) のテンプレート準拠で、[Specta](https://github.com/specta/specta), [Expecta](https://github.com/specta/expecta), [FBSnapshotTestCase](https://github.com/facebook/ios-snapshot-test-case) を利用。
ビューテストのためのマッチャとして、[Expecta Matchers for FBSnapshotTestCase](https://github.com/dblock/ios-snapshot-test-case-expecta)
 も用意されているので、

``` objective-c
expect(masu).to.recordSnapshot();
```

でスナップショット作って、

``` objective-c
expect(masu).to.haveValidSnapshot();
```

で判定するだけの簡単なお仕事です。
EvilでのJコマンド

Evilで日本語の文章を書いていると、`J`コマンドで行を連結したときに、スペースが入ってしまうのが、ちょっと面倒です。英語とかソースコードを書いているときには便利なのですが...。

`evil-join-whitespace`というぴったりな関数が定義されていたので、それを`J`コマンドに割り当てるだけでした。

```el
(define-key evil-normal-state-map "J" 'evil-join-whitespace)
```

従来の`J`コマンド(evil-join)は`,j`に割り当てました。

```el
(require 'evil-leader)
(global-evil-leader-mode)
(evil-leader/set-leader ",")
(evil-leader/set-key
   "F" 'helm-for-files
   "f" 'helm-find-files
   "r" 'helm-recentf
   "b" 'helm-buffers-list
   "x" 'helm-M-x
   "e" 'eval-last-sexp
   "m" 'eval-minibuffer
   "d" 'eval-defun
   "B" 'byte-compile-file
   "j" 'evil-join
   "k" 'kill-buffer)
```

ソースコードを主体に書いているときは`,j`に`evil-join-whitespace`を割り当てるだけでもいいかもしれませんね。

追記:
`gJ`で`evil-join-whitespace`が呼べるようです。無理にキーを定義し直さないでもいいようですね。でも日本語を主体に書いているときは`evil-join-whitespace`を多用するので、そこは頻度に応じて決めればいいのだと思います。

Evilはvimのヘルプを参照するといろいろな発見がありますね。