OmniAICreator/Qiita-1.07M huggingface dataset:
UnityでMySQLを使用する

# UnityでMySQLを使用する #

実行環境 : 
MacOS 10.7.5, Windows8.1
Unity4.3.1

### MySQL Connectorのダウンロード ###

http://dev.mysql.com/downloads/connector/net/
こちらよりMono用のMySQL Connectorをダウンロードします.

Select Platform: で **.NET & Mono** を選択

### ConnectorをUnityにインポート ###
ダウンロードして得られたファイルの中で、
mysql-connector-net-x.x.x-noinstall > v2.0 > **mysql.data.dll**
をUnityAsset内の **Plugins** フォルダに入れる.

### Api Compatibility Level を変更 ###
Player Settings > Optimization > Api Compatibility Level を
.NET 2.0 に変更

### コード例 ###

```csharp

using UnityEngine;
using System;
using System.Collections;

using MySql.Data;
using MySql.Data.MySqlClient;

public class MySQLTest : MonoBehaviour {

	string SERVER    = "localhost";
	string DATABASE  = "database";
	string USERID    = "root";
	string PORT      = "3306";
	string PASSWORD  = "pass";
        string TABLENAME = "hoge";
	
	void Start () {

		StartCoroutine ( SelectData () );
			
	}

	IEnumerator SelectData () {

		MySqlConnection con = null;

		string conCmd = 
				"server="+SERVER+";" +
				"database="+DATABASE+";" +
				"userid="+USERID+";" +
				"port="+PORT+";" +
				"password="+PASSWORD;

		try {

			con = new MySqlConnection( conCmd );
			con.Open ();

		} catch (MySqlException ex){
			Debug.Log ( ex.ToString() );
		}

		string selCmd = "SELECT * FROM TABLENAME LIMIT 0, 1200;";
		
		MySqlCommand cmd = new MySqlCommand( selCmd, con );
		
		IAsyncResult iAsync = cmd.BeginExecuteReader ();
		
		while ( !iAsync.IsCompleted ){
			yield return 0;
		}
		
		MySqlDataReader rdr = cmd.EndExecuteReader ( iAsync );
		
		while ( rdr.Read() ) {
			if( !rdr.IsDBNull ( rdr.GetOrdinal ("ID") ) ){
				//Debug.Log ( "ID : " + rdr.GetString ("ID") );
			}
		}
		
		rdr.Close ();
		rdr.Dispose ();
		con.Close ();
		con.Dispose ();
	}
}


```

※非同期で動きません (> <)
Glances (Pythonのコマンドラインモニタリングツール）を入れてみる。

たまたまTwitterのTLで拾ったので、入れてみました。

- https://pypi.python.org/pypi/Glances
 - A cross-platform curses-based monitoring tool

理由は、pipyでのスクリーンショットが良かったから、です^^;

## Install

CentOSではrpmが提供されているので、yumでインストールできます。（python-glance-2012.2.4-3.el6.noarch)

わたしの場合は、VagrantのCentOS6.5に追加してみました。(yumではなく、easy-installでも、pipでも簡単に入ります）


## 起動してみます

コマンドを打つだけです。

```source:bash
% glances 
```

## スクリーンショット

起動してしばらくすると、一括でリソース状況が描画されます。

![glances-capture.png](https://qiita-image-store.s3.amazonaws.com/0/27976/8b20d94a-44ac-0646-6e55-fdaccaf4ed05.png "glances-capture.png")

ヘルプ画面。
デフォルトでいろんな情報を一画面に表示なのですが、オプションで絞りこんだり出来るようです。

![glances-help-capture.png](https://qiita-image-store.s3.amazonaws.com/0/27976/1766ac6e-c8f7-8c0d-882a-e380328f4a03.png "glances-help-capture.png")


## クライアント＆サーバモードで起動

ドキュメントを参照すると、何やらクライアント＆サーバモードがあるようです。
表現を確認すると、

- リソース情報を提供する側：サーバ
- リソース状況を取得する側：クライアント

となります。
また、どちらの環境にも、Glancesをインストールしておくのが前提になります。

今回は、VagrantでのCentOS側をサーバ、MacOS側をクライアントにしてみました。

```source:bash
[vagrant@centos-tare ~]$ glances -s # vagrant側 / IPを192.168.33.11に割り当て中。
% glances -c @192.168.33.11 # MacOS側
```

こんな感じで、ポート:61209を通して、クライアント側から情報が取得できます。

![glances-server-client-capture.png](https://qiita-image-store.s3.amazonaws.com/0/27976/f83d2bc6-a69d-8763-648a-89b983e92e84.png "glances-server-client-capture.png")

とくに負荷もかかっていない状況だと、グリーンで表示されます。

### 忙しく働いている時は？

なにか負荷がかかっている場合は、その状況に応じて、ターミナル上に色が付いて視覚化されるようです。

負荷かけるにしてもあまり良い案が無かったのですが、bonnie++ というディスクIOのベンチマークツールでVagrant側のOSに書き込みの負荷をかけてみることにしました。
＃性能測定が目的ではないです(^^;

やってみると、bonnie++のプロセスがブンブン回って、CPUの値が上がっていき、緑 -> ピンク -> 赤に変わりました。

![glances-check.png](https://qiita-image-store.s3.amazonaws.com/0/27976/de757991-2513-db08-8e58-c1e024e96df2.png "glances-check.png")



## APIがあります

さて、サーバモードでlistenしている、に加えて、XML-RPCでのAPIも備えている模様。
pythonであればjson形式でデータが取れるようです。

- https://github.com/nicolargo/glances/wiki/The-Glances-API-How-To

ListenするPortは、同じく61209です。

MacOS側クライアントのプロセスを立ち上げながら、tcpdumpを取ってみると、こんな感じで情報が覗き見れます。
(Aオプションで文字列を拾ってみます）

```source:bash
% sudo tcpdump -i vboxnet1 -A

# 中略
…
"host": {"linux_distro": "CentOS 6.5", "platform": "64bit", "os_name": "Linux", "hostname": "centos-tare", "os_version": "2.6.32-431.el6.x86_64"}, 

```

シンプルですが、CSVやHTMLに書き出すオプションもありました。
ソースをちゃんと読んで勉強するのも良いかと思いました。
 
ということで、簡単ですが、Glancesについての記事でした。
SQLで@より前の文字をマスキングする

よくテストデータを作成する時に、

* ドメインは残しておきたい
* でも@より前のアカウントはマスキングしたい

なんていうリクエスト結構ないですかね？昔、ガラケーなのではあったのですが、今そんなにそんなリクエストないのかな？
なんて思いつつ、ドメインは残しつつ、アカウントをマスクするＳＱＬのサンプルを作ってみました。


* サンプルSQL

```
set @MAIL = 'hit@abc.def.com' ;

select
  replace(@MAIL,left(@MAIL,instr(@MAIL,'@')- 1),'秘密') as mail ;
```

* 結果

```
+--------------------+
| mail               |
+--------------------+
| 秘密@abc.def.com   |
+--------------------+
```
Pull Request Builder PluginをJenkinsに導入する

## Pull Request Builder Pluginとは?

Jenkins Pull Request Builder Plugin(以下ghprb)とは、GitHubの指定したリポジトリにpull requestが作成されると、予め設定しておいたJobを実行し、実行結果をGitHubに通知し、記録してくれるプラグインです。

pull requestを作成すると導入すると、下記の問題を回避できるでしょう。

- 間違えてコンパイルエラーが起こるコードをpushしてしまった
- テストが失敗するコードをpushしてしまった

そもそも「上記の問題が起きるコードなんか糞だ！pushするんじゃないよ！」という意見はこれまでもありました。しかし、僕らは人間です。間違いを犯すことがあるのが人です。

例えば、pull requestは、コードレビューの場面でとても役に立つ便利なもので、いろいろ指摘があったりしたとしましょう。GitHub上のエディタはとても便利なので、その場で修正してみたら、コンパイルエラーが！みたいな事故が起きないとも限りません。

そういう場面で、Jenkinsさんが、そっと「このコミットはコンパイルエラーが起きますよ？修正しておいてくださいね。」と教えてくれるのです。さすが執事さま！

## 導入方法

このプラグイン、便利な反面、少々導入が煩雑です。ここでは導入するときのポイントをわかりやすく解説します。

### a. GitHubでの設定

#### 1. GitHubにbot用のアカウントを追加する

ご自身のアカウントをJenkinsに設定してもよいです。しかし、ghprbがGitHubに設定したアカウントでコメントをしていたりするので、別途bot用アカウントがを用意したほうがよいでしょう。

#### 2. 監視対象のリポジトリのContributorに追加する

ghprbがGitHubにアクセスするアカウントを対象のContributorとして追加します。

Organizationのリポジトリの場合は、チームを作成することになると思います。必ず作成したチームに **Write Access** 権限を与えてください。 **Write Access** 権限がないと、Jobの実行結果などをpull requestに記録できません。

### b. Jenkinsでの設定

#### 1. 「アップデートセンター」からGitHub Pull Request Builderをインストールする

Jenkinsのプラグインマネージャからインストールします。プラグインの名前は「GitHub Pull Request Builder」です。

#### 2. 「システムの設定」にてGitHub pull request builderプラグインの設定を行う

1. Jenkinsの「Jenkinsの管理」から「システム設定」を開き、GitHub pull requests builder節を開きます。
1. GitHub Enterpriseを利用している場合は、「GitHub server api URL」を適切なURLに変更してください。
1. botアカウントのアクセストークンを設定します。 **GitHub上で発行することもできますが、ghprbの設定から発行したほうが確実です。** GitHub pull requests builder の **高度な設定** を開くと、一番下に username と password があります。そこにbotアカウントを入力し、「Create Access Token」を押してください。アカウントが間違っていなければ、アクセストークンが発行されます。
1. 「Admins list」にbotアカウントを追加します。

#### 3. Jobを作成する

pull requestを受け付けて実行するJobを作成します。

1. Jobを作成する。
1. "GitHub project"フィールドに対象のリポジトリのURLを記述する
1. Git SCMを選択する(Multi RepositoryでもGitリポジトリならOK)
1. Repository URLにGitHubのリポジトリURLを入力
1. 「高度な設定」を開き、「Refspec」に「 +refs/pull/*:refs/remotes/origin/pr/\* 」と入力する
1. 「Branch Specifier」に「 ${sha1} 」と入力する
1. 「ビルド・トリガ」の「Github pull requests builder」にチェックを入れる
1. whitelistにあるユーザーのpull requestのみ自動的にビルドされる。そのため、予めユーザーを追加しておくか、Organizationで利用している場合は「List of organisations. Their members will be whitelisted.」に対象のorganizatioを加える。

これで設定は完了です。以降設定したリポジトリにpull requestが作成されると自動でビルドが行われるようになるでしょう。なお、 **pull request対象のブランチがpushで更新されても、ここで設定したJobが実行されます。**

## FAQ

### Q. 既存のpull requestを対象にするには？
A. ok to testとコメントしてください。

### Q. botアカウントのコメントがうっとおしいです。なんとかなりませんか？
A1. botアカウントがリポジトリにWrite Access権限がないからです。設定してあげてください。設定するとコメントはおとなしくなると思います。
A2. システムの設定で「Published Jenkins URL」にURLが設定されているとghbprが色々とコメントします。逆に設定されていないとコメントが減ります。

### Q. ghprbからのコメントを日本語化したいです。できませんか？
A. 公式ドキュメントや設定を見る限り、できそうな感じです。しかし設定してみましたが変わりませんでした。時間があるときにコードを追いかけてみて、pull requestしてくださると僕も助かります。
Javascript で uuid

```js
	$.fn.uuid = function() {
		this.each(function(i,element) {
			;
			var _uuid = "";
			var _dobj = new Date();
			var _yy = (_dobj.getFullYear()).toString(16).substring(1,3); // yyyy
			var _mm = "0" + (255 - _dobj.getMonth()    ).toString(16); //  mm
			var _dd = "0" + (252 - _dobj.getDate()     ).toString(16); // dd
			var _hh =       (240 - _dobj.getHours()    ).toString(16); // hh
			var _mi =       (192 - _dobj.getMinutes()  ).toString(16); // mi
			var _ss =       ( 16 + _dobj.getSeconds()  ).toString(16); // ss
			var _r1 = Math.pow(Math.random()+1, 3) % 1;
			var _r2 = Math.pow(Math.random()+1, 3) % 1;
			var _d1 = Math.floor(_r1 * Math.pow(16,4)).toString(16); 
			while (_d1.length < 4 ) _d1 = "0" + _d1;
			var _d2 = Math.floor(_r2 * Math.pow(16,12)).toString(16); 
			while (_d2.length < 12 ) _d2 = "0" + _d2;
			
			_uuid += _yy + _mm + _dd + "-" + _hh + _mi + "-" + _ss + "00" 
			      + "-" + _d1 + "-" + _d2;
			$(element).data("uuid" , _uuid);
			console.log(_uuid);
		});
		return this;
	};
```

## 参考

|name|calc|ex.: 2014/3/24 10:20:30|
|:---|:---|:---|
|_yy | (年).toString(16).substring(1,2)|de|
|_mm | (255-(月)).toString(16)         |fd|
|_dd | (252-(日)).toString(16)         |e4|
|_hh | (240-(時)).toString(16)         |e6|
|_mi | (192-(分)).toString(16)         |ac|
|_ss | (16+(秒)).toString(16)          |2e|
|_r1 | 乱数1 | 0af6 |
|_r2 | 乱数2 | 216da69ff61c |
|_uuid| 結果 | de0fd0e4-e6ac-2e00-0af6-216da69ff61c |
SublimeでもINSERTモード時jkhl移動を可能にする

vimを使っている人はINSERTモードでもjkhlで移動出来るようにすべく以下の様なキーマップ設定をしている人が多いのではと(勝手に)思っています。
私はCtrlキーとjkhlを組み合わせています。

```
inoremap <C-j> <Down>
inoremap <C-k> <Up>
inoremap <C-h> <Left>
inoremap <C-l> <Right>
```

最近、Sublime TextをVimキーバインドで使っているのですが、上記に該当する設定なしに使っていたところストレスが半端無かったのでKey Bindingsを設定しました。

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

これでINSERTモード時(厳密にはコマンドモード以外の時)にCtrl + jkhlでカーソル移動が可能になります。
Kobito風のAtom用のプラグイン？


Gistを取ってくるプラグインを作ったので勉強の為に別のプラグイン作ってみようかな！？

[Atom](https://atom.io/)用に面白そうなプラグインを作りたいと思っているが、なかなか面白いのが思いつきません。

MagentoやWordpress用の開発プラグインを作りたいと思っているが、ちょっとPHP言語の構文解析が手間かかりそう。

PHPStorm用で[Magento用のプラグイン](http://www.kodokux.com/mageman/index.html)を作った事あるのですがPHPStormは、構文解析が簡単にできる仕組みがあるので、正しいオブジェクトに対して正しい補完ができたりします。

Atomは、そんな事はないので作る場合は自分で解析しないといけないかも、、、それもそれで面白いかもね。

そこで、勉強の為にAtom用のKobitoを作ったら面白そうなだと思っています。
流行るかどうか別として、、、笑

作ろうかな〜ってな話でした。
AngularJSのモバイル対応と、他まとめ

モバイル対応にあたり、こういうことを考慮した方が良いというメモ。

## モバイル対応

- METAタグ

```html
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
```

- PC等も対応するならBootstrapいれる(レスポンシブ)
- タッチイベントの最適化とスワイプ対応
	- ngTouchを導入
- 必要あらば UIライブラリ導入
	- ionic、onsen ui など。この２つはそれ自体が AngularJSベース
- 遅延読み込み（画像の Lazy Load）を導入
- AngularJSのファイルサイズが大きいことへの対応
	- minifyする .. Gruntで
	- gzipで圧縮
		- 手作業で圧縮 and .htaccess等で振り分け
		- または Grunt で
		- または mod_deflateなど（Apacheモジュール）
	- 端末側にキャッシュさせる
		- HTTPレスポンスの Cache-Control ヘッダ、Expires ヘッダ
	- CDNを使う（AWSでいうと CroudFront）

## 他まとめ

AngularJSを使う理由や今後の展望、また学習するにあたっての参考サイトなど諸々について、Qiitaに過去に書いたもの含めてスライドにまとめました。よろしければ参考にしてください。

[【ABC2014Spring資料】AngularJSでWEBアプリ開発](http://www.slideshare.net/hiroyukikusu/abc2014-spring-ltangularjsweb)

また下記はスライドにも書いてありますが、これから学習を始めようとする方は参考にするといいんじゃないかな、というサイトや書籍です（書籍はまだまだ少ないですね）。

- 参考URL（公式系）
	- http://angularjs.org
	- https://github.com/angular/angular.js
	- http://docs.angularjs.org/api
	- http://angular-ui.github.io/bootstrap/
- 参考URL（学習）
	- http://js.studio-kingdom.com/angularjs/guide
	- http://d.hatena.ne.jp/Kazzz/20131207/p2
	- http://www.walbrix.com/jp/blog/2014-01-angularjs-bootstrap.html
	- http://8th713.github.io/LearnAngularJS/#/
	- http://dev.classmethod.jp/tool/angularjs_getting_started/
	- http://angularjsninja.com
	- http://blog.asial.co.jp
- 参考書籍
	- WEB+DB vol.79 特集
	- はじめてのAnglarJS（http://www.amazon.co.jp/dp/4777518086）
BlocksKitもどきの作り方

=====================

色々面倒なdelegate(callback)をBlockで記述できるBlocksKit。これを実装する方法を考えます。

実はBlocksKitを使ったことがないため色々違いはあると思われますが、 **各種callbackをBlockで受け取れるようにする** というのが本題です。


目標
----

これらを実装することを目的としています。

* delegateをBlockで書かえるようにする。標準SDKのクラスもそれ以外も、プロトコルのメソッドをcallbackするタイプ全てをBlockで書けるようなものを作る
* SDKのよく使うクラス(UIAlertViewやUITextField等)のdelegateをBlockで簡単に書けるようにする
* UIControl, UIGestureRecognizer, KVO, NSTimer, target/selecterをBlockで書けるようにする


作り方を考える
------------

各種callbackはどれもインスタンスを登録しメソッドを呼び出すような形になっています。この部分を使わざるをえません。そこで通常のcallbackの受け取り方で受け取るオブジェクトを間に挟み、そのオブジェクトからBlockを呼び出すような仕組みを考えます。

ひとつは単純にオブジェクトでcallbackを受け取り、プロパティで保持しておいたBlockを呼び出す方法です。もうひとつは動的にメソッドを実装する方法です。callbackを受け取るメソッドを動的に実装し、そのメソッドからBlockが呼び出されるようにします。

どちらの場合も問題となるのが、そのオブジェクトをどこで管理するか？　ということです。callbackを受け取るBlockを生成するところ(大抵はインスタンス)で管理する方法が思い浮かぶかもしれませんが、これだと少々面倒です。callbackの通知元と通知先の生存期間が異なるため、片方が無効になっても不正な動きをしないよう対策が必要となります。

そこで **callbackの通知元自身にそれらのオブジェクトを管理(保持)させてしまいます**。こうすると、callbackの通知元と通知先の生存期間が同じになり、通知元インスタンスが解放されそれ以上callbackされなくなるタイミングで、そのオブジェクト(と関連するBlock)も解放されます。

最後になってしまいましたが、これらの機能を実装するために **callbackの通知元を継承して拡張するようなことはしたくありません**。もちろんそうしてしまったほうが実装は簡単ですが、NSTimerならまだしもKVOのためにNSObjectを継承したクラスを作るのは非現実的です。カテゴリを使えば既存のクラスを変更せずメソッドを追加できます。カテゴリではインスタンス変数を追加できませんが、そこはAssociatedObjectの機能を使って解決します。

作り方
-----

全部をひとつの記事にするとかなり長くなってしまうため、いくつかの記事にわけます。

1. 既存クラスを継承せず、そのインスタンスにオブジェクトを保持する機能が必要となります。runtimeのAssociatedObjectという機能を使うと実現可能です。
    * [クラスを継承せず既存クラスにオブジェクトを保持する機能を追加する](http://qiita.com/ryota-ku/items/3fe7218b93d8e2a61a2b)  

2. メソッドを動的に実装し、そのメソッドが呼ばれた時にBlockを実行するようなクラスが必要です。これもruntimeの機能で実現可能です。
    * [Blockで動的にメソッドを実装できるクラスの作り方](http://qiita.com/ryota-ku/items/e674615a613061c08cae)

3. _2_ のメソッドの動的な実装をより正確に説明すると、「classに対してメソッドを追加する」となります。インスタンスにメソッドが追加されるわけではありません。よって何も考えず動的にメソッドを実装した場合、ありとあらゆる _2_ のクラスのインスタンスがそのメソッドを実装していることになってしまいます。今回の場合それだと使いにくいため、自動で動的にサブクラスを登録しインスタンスを生成するようにします。このサブクラスにメソッドを追加すれば上記問題を解決できます。これもruntimeの機能で実現可能です。
    * [動的にサブクラスを登録しインスタンスを生成する](http://qiita.com/ryota-ku/items/45e89348974e39f4f3b9)

4. 様々なdelegate(プロトコルで定義されたメソッドをcallbackするもの)をBlockで書くための汎用的なクラスを作成します。またcallbackの通知元にその汎用クラスのインスタンスを管理(保持)させるため、カテゴリで既存のクラスを拡張します。。
    * [あらゆるdelegateをBlockで実装するためのクラスの作り方](http://qiita.com/ryota-ku/items/8b6dcf1c545fa95b36c9)

5. _4_ では少々冗長な記述になってしまう部分を、ある特定のクラスのdelegateに限定することで簡単に書けるようにします。カテゴリを使ってUIAlertView等を拡張します。
    * [標準クラス(UIAlertView等)のdelegateをBlockで書く](http://qiita.com/ryota-ku/items/90f65a46336fcf686137)

6. UIControl等、標準のクラスでcallbackがあり、よく使うものをBlockで書けるようにカテゴリを使って拡張します。
    * [callbackをBlockで書く(UIControl, UIGestureRecognizer, KVO, NSTimer の場合)](http://qiita.com/ryota-ku/items/8e71ed2eaccceea1cc95)



完成品
-----

既に実装したものが以下にあります。「使えればいいよ」「解説いらないよコード見れれば」という場合はこちらをどうぞ。

_メイン部分_
https://github.com/siagency/SIATools/tree/master/SIATools/Blocks

_NSObject+SIAToolsやSIAIDも使っています_
https://github.com/siagency/SIATools/tree/master/SIATools/Extensions
クラスを継承せず既存クラスにオブジェクトを保持する機能を追加する

=====================================================

Objective-Cはruntimeの力を借りて動いています。runtimeはObjective-Cのオブジェクト指向の各種機能、クラスを扱ったりメソッド呼び出しを対応するC言語関数を呼び出しに変換したりといったことをしています。

このruntimeを活用し、インスタンスにオブジェクトを保持する機能を追加します。この機能を追加すると、元のソースコードに手を加えたり、継承して新たなクラスを作成しなくてもオブジェクトを保持することが可能になります。


runtime関数
-----------

runtime関数を使う場合以下のファイルをインポートします。

```objectivec
#import <objc/runtime.h>
```

今回はAssociatedObjectの機能を使用します。

```objectivec
// objectからkeyに対応するオブジェクトを取得します。
id objc_getAssociatedObject(id object, void *key);

/*
  objectにkeyをキーとしてvalueを設定します。
  objc_AssociationPolicy は保持する値をretainするかしないか、nonatomicにするかどうかといったフラグです。
*/
void objc_setAssociatedObject(id object, void *key, id value, objc_AssociationPolicy policy);
```

void *型のキーを使いNSMutableDictionaryに近い使い方をします。


NSObjectをカテゴリで拡張する
-------------------------

runtime関数をそのまま使用してももちろん問題ありませんが、今回はNSObjectにAssociatedObjectの機能を追加してみます。

```objectivec:NSObject+SIATools.h
@interface NSObject (SIATools)

- (id)sia_associatedObjectForKey:(const void *)key;
- (void)sia_setAssociatedObject:(id)object forKey:(const void *)key;

@end
```

```objectivec:NSObject+SIATools.m
@implementation NSObject (SIATools)

- (id)sia_associatedObjectForKey:(const void *)key
{
    return objc_getAssociatedObject(self, key);
}

- (void)sia_setAssociatedObject:(id)object forKey:(const void *)key
{
    objc_setAssociatedObject(self, key, object, OBJC_ASSOCIATION_RETAIN);
}

@end
```

実装ファイル(.m)ではobjc/runtime.hをインポートします。

短いコードですので、カテゴリをわざわざ作らず必要に応じてruntime関数で実装してもいいかもしれません。ですがカテゴリにした場合、コード中に唐突にruntime関数が現れるということは避けられるので自分はこれを使用しています。


例 UIViewを拡張
--------------

AssociatedObjectの機能を使った例として、UIViewにデータを保持できるようにしてみます。
カテゴリを使うと既存クラスにメソッドを追加できますが、インスタンス変数は追加できません。そこでAssociatedObjectを使うことでインスタンス変数が追加されたのと同等の機能が実現できます。

```objectivec:UIView+SIATools.m
#import "NSObject+SIATools.h"

#define UIVIEW_USERINFO_KEY "UIVIEW_USERINFO_KEY"

@implementation UIView (SIATools)

- (NSDictionary *)userInfo
{
    return [self sia_associatedObjectForKey:UIVIEW_USERINFO_KEY];
}

- (void)setUserInfo:(NSDictionary *)userInfo
{
    [self sia_setAssociatedObject:userInfo forKey:UIVIEW_USERINFO_KEY];
}

@end
```

AssociatedObjectのキーとしてC言語文字列を使用しています。文字列リテラルはメモリ上に1個だけ作られるため、同じ文字列であれば必ず同じポインタの値となります。


例2
-------

この記事は[BlocksKitもどきの作り方](http://qiita.com/ryota-ku/items/76e050fd71e9b1be214e)の一部として書いています。興味のあるかたはこちらも御覧ください。

AssociatedObjectを使うとこんなことができるという一例です。
指定日時までロールフォワードリカバリする

たとえば

* 間違ってデータ一括で消しちゃったとか
* 間違って一括で更新しちゃったとか
* 間違えてテーブルをtruncateしちゃったとか

等のヒューマンエラーの際に役に立ったりする

ちなみに、いくつかメモ程度に書いたものですが、何かやらかす前にバックアップ（バイナリログとdumpファイル）がキチンと取られていることが大前提なので、そのあたりは注意

## コマンドサンプル

### 2012-06-11 02:10:00 から 2012-06-12 10:30:00 のデータをリカバリするSQLファイルを生成する

```
mysqlbinlog --start-datetime="2012-06-11 02:10:00" --stop-datetime="2012-06-12 10:30:00" mysql-bin.*1 > recovery.sql
```

### 2012-06-11 02:10:00 から最後のログまで、schema1のスキーマ限定でリカバリするSQLファイルを生成する  

```
mysqlbinlog  --database=schema1 --start-datetime="2012-06-11 02:10:00" --to-last-log mysql-bin.*1 > recovery.sql
```

ほかにもいっぱいオプションがあるのですが、細かい話は、オンラインリファレンスを読んでいただくとして・・
Macにmecabインストール


## インストール

```
$ brew install mecab
$ brew install mecab-ipadic
```

```
$ mecab
(入力) 毎日が土曜日だと良いのになあ
毎日	名詞,固有名詞,組織,*,*,*,毎日,マイニチ,マイニチ
が	助詞,格助詞,一般,*,*,*,が,ガ,ガ
土曜日	名詞,副詞可能,*,*,*,*,土曜日,ドヨウビ,ドヨービ
だ	助動詞,*,*,*,特殊・ダ,基本形,だ,ダ,ダ
と	助詞,接続助詞,*,*,*,*,と,ト,ト
良い	形容詞,非自立,*,*,形容詞・アウオ段,基本形,良い,ヨイ,ヨイ
の	名詞,非自立,一般,*,*,*,の,ノ,ノ
に	助詞,格助詞,一般,*,*,*,に,ニ,ニ
なあ	助詞,終助詞,*,*,*,*,なあ,ナア,ナー
EOS
```

こんな感じで形態素解析ができるように。

## 辞書追加

### 本来入っている辞書を追加

上記のやり方だと、`/usr/local/Cellar/mecab/0.996/lib/mecab/dic`下にipadicが入る。

brewでインストールしたせいなのか、辞書の構成が最小限のものになってしまっているので、[こちら](http://sourceforge.net/projects/mecab/files/mecab-ipadic/2.7.0-20070801/)からオリジナルをダウンロード。

```
$ cp ~/Downloads/mecab-ipadic-2.7.0-20070801/* /usr/local/Cellar/mecab/0.996/lib/mecab/dic/ipadic/
```

これで移せばOK。

### wikipediaのタイトルを辞書に追加

[こちら](http://dumps.wikimedia.org/jawiki/latest/)からwikipediaのタイトルリストをダウンロード。`jawiki-latest-all-titles-in-ns0.gz`みたいな名前。

Rubyでとりあえず以下の様なスクリプトを書く。単語のコスト（スコア）部分の公式は、ネットに落ちているのを拾ったので要確認。

```ruby:store_wikipedia_title_to_csv.rb
open($*[0]).each do |title|
  title.strip!
  next if title =~ /[\+\-\.\$\(\)\?\*!"'_,]+/

  title_length = title.split(//u).length
  score = [-36000.0, -400 * (title_length ** 1.5)].max.to_i

  if title_length > 3
    print"#{title},0,0,#{score},名詞,固有名詞,*,*,*,*,#{title},*,*,wikipedia,\n"
  end
end
```

さっきダウンロードしてきたファイルを引数にして実行、CSVに出力。

```
$ ruby store_wikipedia_title_to_csv.rb jawiki-latest-all-titles-in-ns0 | nkf -e > wikipedia_title.csv
```

※nkfコマンドはMacになかったので、homebrewでインストールした
※フォーマットに関しては、EUC-JPに敢えてする必要があるのかはよくわからない

## 辞書の再構築
`/usr/local/Cellar/mecab/0.996/lib/mecab/dic/ipadic/`下に辞書用のCSVを移す

```
$ cd /usr/local/Cellar/mecab/0.996/lib/mecab/dic/ipadic/
$ /usr/local/Cellar/mecab/0.996/libexec/mecab/mecab-dict-index -f euc-jp -t utf-8 
```

これでwikipediaのタイトルもmecabの形態素解析で利用できるようになる

## 参考
* 辞書の追加については公式ページに書かれてる
http://mecab.googlecode.com/svn/trunk/mecab/doc/dic.html
シンボリックリンクだけを検索

サーバを移転したり、ステージングと本番と開発を別けたり、構築したりする時に忘れがちなのが、マウントしたフォルダのシンボリックリンク漏れ。
そんな時に一括で検索できる方法です。

 find /var/www/ -exec ls -ld {} \; | grep lrwxrwxrwx
Mac OSXでIEの各バージョンを稼働させる


[modern.IE](http://loc.modern.ie/ja/virtualization-tools#downloads)というサイトで提供されている、VMイメージを利用することで、Max OSX環境でもIEの各バージョンを稼働させることができる。

![kobito.1395618627.959748.png](https://qiita-image-store.s3.amazonaws.com/0/30521/98d669c1-c54b-5064-7643-b030fd95407d.png "kobito.1395618627.959748.png")


## 事前準備

VMイメージで提供されているので、VirtulBox or VMWareのインストールをしておく。

## VMイメージのダウンロード

１．[modern.IE](http://loc.modern.ie/ja/virtualization-tools#downloads)からVMイメージをダウンロードする。

２．インストールするOSと仮想環境のプラットフォームを選択する。(ここでは、MacとVirtul Boxを選択する)

![kobito.1395068690.527704.png](https://qiita-image-store.s3.amazonaws.com/0/30521/4bbe4ffb-0c03-722c-8d5b-af61b0dd64db.png "kobito.1395068690.527704.png")

３．IEとWindowsのバージョンの組み合わせが表示されるので、ダウンロードする組み合わせの「Grab them all with cURL」を選択する。

![kobito.1395068718.888707.png](https://qiita-image-store.s3.amazonaws.com/0/30521/8f83553b-e9f8-c5c3-4f02-c724dc9f8b2a.png "kobito.1395068718.888707.png")

４．選択すると、ダウンロード用のコマンドが表示されるので、コピーしてターミナルで実行する。環境によっては、数時間かかる。

![kobito.1395402773.765366.png](https://qiita-image-store.s3.amazonaws.com/0/30521/22dedbd2-9eff-8253-a291-4f9b3be113f1.png "kobito.1395402773.765366.png")

```
$ curl -O -L "http://www.modern.ie/vmdownload?platform=mac&virtPlatform=virtualbox&browserOS=IE7-Vista&filename=VirtualBox/IE7_Vista/Mac/IE7.Vista.For.MacVirtualBox.part{1.sfx,2.rar,3.rar,4.rar}"

[1/4]: http://www.modern.ie/vmdownload?platform=mac&virtPlatform=virtualbox&browserOS=IE7-Vista&filename=VirtualBox/IE7_Vista/Mac/IE7.Vista.For.MacVirtualBox.part1.sfx --> IE7.Vista.For.MacVirtualBox.part1.sfx
--_curl_--http://www.modern.ie/vmdownload?platform=mac&virtPlatform=virtualbox&browserOS=IE7-Vista&filename=VirtualBox/IE7_Vista/Mac/IE7.Vista.For.MacVirtualBox.part1.sfx
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   231  100   231    0     0     90      0  0:00:02  0:00:02 --:--:--    90
100 1000M  100 1000M    0     0  1310k      0  0:13:01  0:13:01 --:--:-- 2261k
```

５．ダウンロード完了後、.sfxの拡張子に実行権限を付与して実行する。


```
$ chmod 777 IE7.Vista.For.MacVirtualBox.part1.sfx
$ ./IE7.Vista.For.MacVirtualBox.part1.sfx
```

実行すると、「IE7 - Vista.ova」というVirtulBoxのイメージファイルが生成される。

## VMイメージの取り込み

１．生成された「IE7 - Vista.ova」をダブルクリックすると、Virtul Boxへの取り込みウィザードが表示されるので、インポートする。

![kobito.1395466826.549100.png](https://qiita-image-store.s3.amazonaws.com/0/30521/0f14894d-9a5a-4ca9-4961-fd0c63f80d25.png "kobito.1395466826.549100.png")


２．インポートされたVMを起動すると、選択したIEがインストールされたWindows環境が起動する。

![kobito.1395467840.996126.png](https://qiita-image-store.s3.amazonaws.com/0/30521/491929e2-a50b-d650-e081-9019881d45e9.png "kobito.1395467840.996126.png")
iOS UIデバッグツールSpark InspectorとRevealを比較してみた

iOSのUIデバッグを効率的に行うことができるツールに、[Spark Inspector](http://www.sparkinspector.com/)と[Reveal](http://revealapp.com/)があります。
大体できることは同じなのですが、どっちが使えるか検討材料をまとめてみました。
両方とも30日間の無料トライアルが可能になっています。

# ざっくり比較表

ざっくり比較を表にしてみました。
Revealの方が後発で、価格が高いです。
機能的にはSpark Inspectorの方が充実しています。
UIや安定性はRevealの方が良いと感じました。

|比較ポイント|Spark Inspector|Reveal|
|:-:|:-:|:-:|
|比較時のバージョン|1.2.2|1.0.3|
|1.0リリース時期|2013/5|2013/10|
|価格|$39.99|$89 (Personal)|
|システムビューの再現率|△|○|
|ビューの書き変え|○|◎|
|レイヤーの書き変え|○|◎|
|2D/3D表示|○|○ ※左右のみ|
|Zoom To Fit|○|○|
|ダイナミックロード(Xcode plugin)|○|-|
|cocoapods|○|○|
|自動更新|○|-|
|フォーカス|○|○|
|キーボードショートカット|△|○|
|Bounds clipping切替|○|-|
|システムビュー表示ON/OFF|○|-|
|3D時のZ軸間隔調整|○ ※スライダー|○ ※メニュー|
|Notification|○|-|
|外部ディスプレイ|○|-|

# UIの比較

並べてみるとわかるように、3ペインの画面構成はほぼ同じです。
左にビューのツリー構造、真ん中に画面イメージ、右側に選択したビューの詳細情報が表示されるようになっています。

### Spark Inspector
![Spark Inspector](https://qiita-image-store.s3.amazonaws.com/0/6527/c3e1c0a9-160e-665b-71ec-b63f42a8c51f.png)

### Reveal
![Reveal](https://qiita-image-store.s3.amazonaws.com/0/6527/6ca4bafa-4a29-3dcb-9e32-36bc2d2bf2e1.png)

# ダイナミックロードについて

Spark Inspectorには、明示的にライブラリをリンクせずに、起動時にSparkを有効にする機能（ダイナミックロード）があります。
Revealには今のところこの機能はないので、Podfileに設定を書く必要があります。
ダイナミックロードはちょっと試す場合にはとても便利ですが、実際の開発を想定するとあまり必要ないかもしれません。
なぜかというと、Xcodeから通常実行した場合はSparkで見ることはできないからです。Sparkで見るためには常にInspect with Spark（プラグイン）経由で実行する必要があるので、通常実行していて後でやっぱりインスペクトしたい、という時に使えないのです。
なので結局cocoapodsで入れてしまうのではないかと思いました。

```
pod 'SparkInspector'
pod 'Reveal-iOS-SDK'
```

# Notificationについて

こちらもSpark Inspector限定の機能ですが、NSNotificationをウォッチすることができるようになっています。今のところ使うシチュエーションがないのでちゃんと見てませんが、NSNotificationを多様している人には便利だと思います。

![Notification](https://qiita-image-store.s3.amazonaws.com/0/6527/0cd02bf3-7ec0-45e2-f07d-e7576f2e4b39.png)

# シミュレータ画面の更新について

Spark Inspectorは自動更新オプションがあり、定期的に画面を最新に更新してくれます。これはかなり良いです。
Revealは自動更新は対応していませんが、Ctrl+Rで更新できるので然程不便には感じませんでした。

# ビュー/レイヤー編集

右ペインでビューとレイヤーの編集ができるようになっています。
編集できる項目は同じではなく、Revealの方が多くなっています。
細かくチェックはしてないので、Spark Inspectorでしか編集できない項目があるのかどうかは不明です。
ビューのプロパティ変更しようと思ったら項目がない、ということがあるので実際に触って確認すると良いです。

例えばUIButtonを選択した状態のキャプチャが以下になります。
SparkはUIViewのプロパティしか触れませんが、RevealではUIButtonのプロパティが触れます。

### Spark Inspectorの編集可能プロパティ
![Spark](https://qiita-image-store.s3.amazonaws.com/0/6527/68a67980-c6ce-ce3d-4f3b-17f2ea52d0a2.png)

### Revealの編集可能プロパティ
![Reveal](https://qiita-image-store.s3.amazonaws.com/0/6527/757f3284-3d8b-2294-8579-281875b142fb.png)

# 使用感の比較

機能が限定されているからというのもあると思いますが、1週間くらい使った感じだとRevealの方が安定していました。Sparkは度々クラッシュすることがありましたが、Revealは一度もクラッシュしませんでした。
UIは好みもありますが、Revealの方が細かい作りが丁寧に仕上がっていると感じました。（Sparkが使いにくいということはないです）

# まとめ

3Dの時の角度記憶やZ軸間隔を記憶して欲しいとか、シミュレータ再起動しても選択していたビューがリセットされないようにして欲しい、とかいろいろ要望はあります。
両者ともまだ新しいツールなので今後の進化に期待しています。
個人的には大分Revealに傾いている感じですが、まだトライアル期間が残っているのでもう少し検討してみたいと思います。
Node.js超入門


##はじめに
Node.jsを触りたいけど、けど、
黒い画面が。。
なんてこと聞いたりするんですよね。

そこで、何も考えずパパっとNode.jsを動かしてみようってのが、
今回の記事です。

とりあえず、やってみてください。
本当に簡単にできちゃいますので。

##nodebrewが便利
nodebrew?
nodebrewっていうのは、Max/Linux向けのnodeのバージョンを管理してくれる便利toolです。
例えば、v1.0.0を入れてたけど、v1.2.0にあげたいなってときとかに、さっとバージョンの切り替えとかができます。

まずは、インストール。

```
$ curl -L git.io/nodebrew | perl - setup
..

Add path:
export PATH=$HOME/.nodebrew/current/bin:$PATH
```

pathを追加してくれと言われます。
pathを通して、どこでも`nodebrew`のコマンドが使えるようにします。

とりあえず、cdで~ディレクトリに移動して、
viでエディタを開いて、追記します。

```
$ cd
$ vi .bash_profile

# nodeのpath設定
export PATH=$HOME/.nodebrew/current/bin:$PATH
```

```
$ source ~/.bash_profile
```

このファイルをもう一度実行して、パスを通します。
これで、試しに`nodebrew`と打てば、コマンドが実行されます。

```
$ nodebrew
```

## nodeのインストール

現在の安定板の最新はv0.10.26なので、それをインストールします。

```
$ nodebrew install v0.10.26
```

これだけです。
試しにインストールが完了し、`nodebrew ls`コマンドを実行すると、

```
$ nodebrew ls
v0.10.26
```

今の指定したバージョンが入っていますね。
ほかにも、

```
$ nodebrew ls-remote
```

で、installできる一覧のバージョンが表示されるので、
いくつか落としてみるといいかもしれません。
落とした分だけ、`nodebrew ls`で手元にある一覧のバージョンが増えていきます。

ちなみにインストールはバイナリですると、展開するだけなので早いです。

```
$ nodebrew install-binary v0.10.26
```

##nodeの準備

```
$ nodebrew use v0.10.26
use v0.10.26
```

バージョンを確認します。


```
$ node -v
v0.10.26
```

これでnodeの準備が完了しました。

##ここからはお試しWebアプリケーション

とりあえず、あまり考えずにWebアプリケーションを立ち上げましょう。
nodeの定番フレームワーク「express」を使います。

expressをどこでも使えるようにglobalでインストールします。

```
$ npm install -g express
```

```
$ express TestApp

   create : TestApp
   create : TestApp/package.json
   create : TestApp/app.js
   create : TestApp/public
   create : TestApp/routes
   create : TestApp/routes/index.js
   create : TestApp/routes/user.js
   create : TestApp/views
   create : TestApp/views/layout.jade
   create : TestApp/views/index.jade
   create : TestApp/public/javascripts
   create : TestApp/public/images
   create : TestApp/public/stylesheets
   create : TestApp/public/stylesheets/style.css

   install dependencies:
     $ cd TestApp && npm install

   run the app:
     $ node app
```

テンプレートが作成されました。
次にTestAppに移動して、
必要なモジュールをインストールします。

```
$cd TextApp
$npm install
```

あとは、起動します。

```
$node app.js
Express server listening on port 3000
```

これでできあがりです。

デフォルトではポートが3000番で立ち上がるので、
http://localhost:3000
に、ブラウザからアクセスすると、
`Welcome to Express`
が表示されます。

# 外部アカウント

技術情報のみつぶやくアカウント作成しました。Nodejsは最新情報も追っていきます。
[Twitterはこちら]
(https://twitter.com/takeharumikami)
[Feedlyのフォローはこちら]
(http://cloud.feedly.com/#subscription%2Ffeed%2Fhttp%3A%2F%2Fqiita.com%2Ftakeharu%2Ffeed)

# おすすめの記事
入門者がつまづく、thisの挙動を4種類に分けて簡単に学ぶならこれ。Apply, callの挙動までわかる。
[JavaScriptの「this」は「4種類」？」](http://qiita.com/takeharu/items/9935ce476a17d6258e27)

JavaScriptでは関数型言語の一部の機能？実践的なJavaScriptの関数型とは。
[JavaScriptで関数型プログラミングの入門](http://qiita.com/takeharu/items/cf98d352ff574c5ac536)

主にnodeで使用されている、javascriptの非同期を扱うライブラリ。フロントエンドでもゲーム作りには必須。
[JavaScriptのasync.jsでwaterfallとseries、parallelの違い](http://qiita.com/takeharu/items/84ffbee23b8edcbb2e21)
Action Pack Variants がキター！けど rspec どうすんの

variant 用の view spec が書けないよー。
# OK だった方法

```ruby
render template: 'main.index.html+phone'
```
て書く。

# ダメだったこと
## describe 'main/index.html+smp'
rspec-rails の ```lib/rspec/rails/example/view_example_group.rb``` に describe のファイル名から render option を取得する処理があるのだけど variant 全く考慮されてない。
rspec-rails 2.99.0.beta2 と 3.0.0.beta2 で確認。
rails 4.1 対応!って書いてあったから入れてみたけど対応されてないっぽい。
## request.variant = :phone
```before(:each)``` に書いても request is nil
## render variant: :phone
controller には書けるんだけど、なんか実装されてるレイヤーが違ってて rspec の render からは効かない。
(これが効かない為に ```lib/rspec/rails/example/view_example_group.rb``` への簡単な修正では済まないっぽくて本家に pullreq 送るまでの気力が出ない)
Vagrantメモ


### Box の置き場

http://www.vagrantbox.es/

### Box (テンプレート) の取得

```bash
$ vagrant box add [boxの名前] [OSパッケージのパス]
```

### Box のリストを表示

```bash
$ vagrant box list
```

### 仮想環境 の初期化

例: box (centos65) をもとに仮想環境を構築する。

```bash
$ mkdir centos65
$ cd centos65
$ vagrant init centos65
```

### 仮想環境の起動

```bash
$ vagrant up
```

### 仮想環境を終了する。

```bash
$ vagrant halt
```


### 仮想環境をスリープさせる。

```bash
$ vagrant suspend
```

### 仮想環境をスリープから復帰させる。

```bash
$ vagrant resume
```

### 仮想環境を削除する。

```bash
$ vagrant destroy
```

### 仮想環境にログインする

```bash
$ vagrant ssh
```

### ディレクトリの共有

ゲスト側の以下のディレクトリが、ホスト側との共有ディレクトリになる。

```bash
/vagrant
```

### box を作る

Vagrantファイルのあるディレクトリで以下のコマンドを実行する。

```bash
$ vagrant package
```

package.box をいうファイルができるので、box に追加する。

```bash
$ vagrant box add [box名] package.box
```
Macにeclipse(pleiades)をインストールする

# 前置き
ググってもいくつかのサイト巡らないとセットアップできないのでメモ。
今回はJAVAですが、他の言語でも同じやり方でいけるかもしれない。

# ダウンロード
その１
[eclipse](http://www.eclipse.org/downloads)本体をダウンロード。
![スクリーンショット 2014-03-24 2.31.37.png](https://qiita-image-store.s3.amazonaws.com/0/19374/d5acc2f4-8e12-a3d4-45a0-d998ca176104.png)
右の `Mac OS X 64 Bit` をクリックしてダウンロード。

その２
[pleiades](http://mergedoc.sourceforge.jp/)本体をダウンロード。
今回は `Kepler` を選びます。
![スクリーンショット 2014-03-24 2.37.49.png](https://qiita-image-store.s3.amazonaws.com/0/19374/b2cfad5a-a55f-809f-4107-a511664bd154.png)
![スクリーンショット 2014-03-24 2.41.46.png](https://qiita-image-store.s3.amazonaws.com/0/19374/28e51822-3a3b-c8fd-d767-e011715f2723.png)
`Java 64bit Full Edition` をダウンロード。

# セットアップ
eclipse本体を解凍し、中身を `/Applications/Kepler/java/eclipse` に移動。

```
mkdir -p /Applications/Kepler/java
mv ~/Downloads/eclipse /Applications/Kepler/java
```

次にpleiadesを解凍。
`dropins` の中身だけを、eclipseの `dropins`に移動。

pleiadesの `plugins` `features` の中身だけを、eclipseのそれぞれのフォルダの中に移動＆上書き。
（フォルダごと上書きすると、元の中身が消えて動かなくなります）

pleiadesの `jre` `tomcat` `java` をeclipseに移動

`/Applications/Kepler/java/eclipse/Eclipse.app/Contents/MacOS/eclipse.ini` を編集
最後尾に下記追記

```
-javaagent:../../../plugins/jp.sourceforge.mergedoc.pleiades/pleiades.jar
-Dfile.encoding=utf-8
```

最後にコマンドから下記実行
`/Applications/Kepler/java/eclipse/eclipse -clean`

なんかエラー出るけどとりあえず動きます。
```
INFO  04:06:20.931 [main] (PropertySet) load  0.001 秒 -     14 エントリー config.ini
処理中のエラー: org.eclipse.equinox.internal.provisional.p2.directorywatcher.RepositoryListener@78d03350: java.lang.IllegalArgumentException
処理中のエラー: org.eclipse.equinox.internal.provisional.p2.directorywatcher.RepositoryListener@546ec21a: java.lang.IllegalArgumentException
```
なんだろうこれ

[ここに解答のようなもの](https://bugs.eclipse.org/bugs/show_bug.cgi?id=318046#c22)がありましたが、長くて読む気に。。
どうやら `/System/Library/Java` にある `Extensions` を `Extensions.old` とかにリネームしてから `eclipse -clean` すると解決するみたいだけど、どういう理由なのかは調べてないです。


# 最初にアイコンから起動するとき
開発元が不明です的なエラーが出るので、出たら環境設定の `セキュリティとプライバシー` に警告が出ていると思うので許可するボタンを押してください。
次回から出なくなります。
Rubymotionでマルチスレッドでの処理を行う方法

NSOperationQueueとNSOperationについて調べた際のメモ。

まず、"NSOperationQueue"、"NSOperation" を使用する事で、バ一連の処理をまとめてバックグラウンド実行することが出来る。


逐次実行するときは、下記のように実装。

```hoge.rb
queue = NSOperationQueue.mainQueue
queue.addOperationWithBlock(->{
  p "1つめのタスクです"
})
queue.addOperationWithBlock(->{
  p "2つめのタスクです"
})
```

```
(main)> "1つめのタスクです"
(main)> "2つめのタスクです"
```

NSOperationQueueクラスのmainQueueメソッドでオブジェクトを生成し、そこにaddOperationメソッドでタスクを追加していく。
※addOperationWithBlockはブロックをそのままタスクとして追加していける。

一方で並列にするには、NSOperationQueueのオブジェクトを生成してタスクを追加していくだけ。うん、簡単w

```hoge.rb
queue = NSOperationQueue.alloc.init
queue.addOperationWithBlock(->{
  p "1つめのタスクです"
})
queue.addOperationWithBlock(->{
  p "2つめのタスクです"
})
```

ちなみに実際にあった入れ子にするケース。

```hoge.rb
queue = NSOperationQueue.alloc.init
queue.addOperationWithBlock(->{
  p "外部のapiに繋いでデータ取得"
  NSOperationQueue.mainQueue.addOperationWithBlock(->{
    p "取得後データの書き換え"
  })
})
```

データを取得するのは並列で行い、その後のデータの書き換えはメインスレッドで行う。
万が一メインスレッドでやってしまうと、外部のapiに繋いでいる際はアプリが固まってしまうので大変ですね。

よくある、tableViewのreloadを行う際は上記のように実装するとできます。
100万行扱えるグリッドw2ui GridとHandsontableの紹介

# はじめに

100万行扱えるJavaScriptのグリッドライブラリとしては[SlickGrid](https://github.com/mleibman/SlickGrid)もあるのですが、ソースコードが複雑で、理解したりカスタマイズしたりするのが相当困難な印象でした。

そこで、他にも良いグリッドライブラリは無いかと探していた所、機能的に良さそうなのを2つ見つけたので紹介します。コードはまだパッと見ただけです。

# w2ui Grid

[w2ui](http://w2ui.com/web/home)というJavaScriptで書かれたUIライブラリにGridが含まれています。

IE9以上、Chrome、Firefox、Safariで動きます。Operaも文中には書いてないですがアイコンが貼ってあるので動くようです。MITライセンスです。

[デモページのトップ](http://w2ui.com/web/demo/grid)に、機能概要が書かれています。[More Demos]のボタンからさらに様々なデモを試せます。

* [全カラムにまたがった検索のデモ](http://w2ui.com/web/demos/#!grid/grid-16)
    * 検索ワードを入れてリターンを押すとマッチした箇所が黄色くハイライト表示されます。
* [複数カラムでのソートするデモ](http://w2ui.com/web/demos/#!grid/grid-12)
* [カラム幅調整のデモ](http://w2ui.com/web/demos/#!grid/grid-22)
* [2つのグリッドを左右に並べて行を移動するデモ](http://w2ui.com/web/demos/#!grid/grid-19)

左のツリーでGrid以外にもCombinationのところにもグリッドのデモがあります。

* [無限スクロールのデモ](http://w2ui.com/web/demos/#!combo/combo-9)
    * 最終行を超えてスクロールしようとするとデータがロードされて追加されます。

デモページの下の質問スレッドでの[作者のコメント](http://w2ui.com/web/demo/grid#comment-1164123298)によると、無限スクロールをサポートしたのでページングは廃止したそうです。

[JavaScript Grid with One Million Records | JavaScript UI - w2ui](http://w2ui.com/web/blog/7/JavaScript-Grid-with-One-Million-Records)のブログ記事を見ると100万行のデータでも問題なく動くようです。

デモページをChromeのデベロッパーツールで確認した所、w2uiのGridはHTMLのtable要素を使っていますが、td要素内のセルはdiv要素でラッピングするという方式になっていました。

スクロールバーはブラウザネイティブのUIを使っています。

# Handsonable

[Handsontable - jQuery grid editor. Excel-like grid editing with HTML & JavaScript](http://handsontable.com/index.html)

[GitHubのレポジトリwarpech/jquery-handsontable](https://github.com/warpech/jquery-handsontable)によるとIE8〜11、Firefox、Chrome、Safari、Operaで動き、MITライセンスです。

SlickGridとw2ui Gridは列のみヘッダがあって行ヘッダはありませんが、Handsontableは行ヘッダもつけることが出来て、Excelライクなグリッドを実現しています。

HandsontableのグリッドはHTMLのtable要素で実装されていて、セルも単にtd要素となっています。スクロールバーはブラウザネイティブのUIではなくHTMLで実現しています。

* [スクロールのデモ](http://handsontable.com/demo/scroll.html)
    * 100万行のデータでもスクロールバーで軽やかにスクロールできます。
* [単一カラムソートのデモ](http://handsontable.com/demo/sorting.html)
    * [Understanding column sorting plugin · warpech/jquery-handsontable Wiki](https://github.com/warpech/jquery-handsontable/wiki/Understanding-column-sorting-plugin)を見ると複数カラムソートは標準では非対応のようです
* [カラム幅調整のデモ](http://handsontable.com/demo/column_resize.html)
* [固定行・固定列ありのスクロールのデモ](http://handsontable.com/demo/fixed.html)
    * 上2行、左2列が固定になっています。
* [列の順序をドラッグで入れ替えるデモ](http://handsontable.com/demo/sorting.html)
    * 列ヘッダの左端付近でマウスが十字矢印カーソルになったときにドラッグできます。
* [ページングのデモ](http://handsontable.com/demo/pagination.html#6)
* [Backbone.jsのモデルを扱うデモ](http://handsontable.com/demo/backbone.html)
* [Polymerを使ったWeb Componentのデモ（ベータ）](http://handsontable.com/demo/web_component.html)
* [Live search filter for jquery handsontable](http://my-waking-dream.blogspot.jp/2013/12/live-search-filter-for-jquery.html)
SublimeText2でOpenFLを含むHaxeのコンパイル


## 何があった
SublimeText2でOpenFLを含むHaxeのコードを書いてたところ、SublimeText2上でのビルドが通らなくて泣いた。

## 何がしたかった
ちゃんとしたビルドはlimeを通すんですが、コンパイルエラーが無いかチェックしたいためにビルドしたいのです。

## build.hxmlにどう書いたら良いねん
### １回目
とりあえず、まずやりたい事をbuild.hxmlに書いてみる。

```build.hxml
-cp Source
-main CompileOnly
--no-output
-cpp No output
```

で、ビルド

```
You cannot access the flash package while targeting cpp (for flash.media.Sound)
```

駄目でした。

### ２回目
まあ、libの設定しないと駄目だよね、HAHAHAHA。ってことで。

```build.hxml
-cp Source
-main CompileOnly
--no-output
-lib lime
-lib openfl
-lib openfl-native
-lib actuate
-cpp No output
```

で、ビルド

```
You cannot access the flash package while targeting cpp (for flash.media.Sound)
```

あれ？なんで？

### ３度目の正直

情報探すと、それっぽい答えを発見。

http://stackoverflow.com/questions/21391833/macro-include-is-recursively-including-packages-not-appropriate-for-build-targ

どうやら、Haxeが最初から持ってるFlashのパッケージが同じ名前で、そいつがFlash出力しか許可してないためっぽい。

で、それを回避するのにallowPackageでパッケージの使用を許可させる必要があると。

で、最終的に。

```build.hxml
-cp Source
-main CompileOnly
--no-output
-lib lime
-lib openfl
-lib openfl-native
-lib actuate
--macro allowPackage("flash")
-cpp No output
```

これで、通りました。

### OpenFLのバージョンアップでやり方が変わりました

OpenFLのバージョンアップに伴いパッケージ構成が変わったので以前のやり方では上手く出来なくなっています。

最新版のOpenFLを使う場合は次のようにしましょう。

ちなみに、CompileOnlyはstatic mainを定義し、対象ソースをインポートしたダミーファイルになります。

```build.hxml
-cp Source
-main CompileOnly
--no-output
-lib openfl
--macro openfl.Lib.includeBackend("native")
--remap flash:openfl
-cpp No output
```
Percona Server 5.6のインストール


最近MySQLももっと使いこなせないといかん！と思い
[ハイパフォーマンスMySQL](http://www.amazon.co.jp/%E5%AE%9F%E8%B7%B5%E3%83%8F%E3%82%A4%E3%83%91%E3%83%95%E3%82%A9%E3%83%BC%E3%83%9E%E3%83%B3%E3%82%B9MySQL-%E7%AC%AC3%E7%89%88-Baron-Schwartz/dp/4873116384)をちょこちょこ読んでいるのですが
本書にも出てくる(著者の誰かが作ってる？)し、最近担当してる案件でもPerconaを導入しているため
PerconaをつかってMySQLのお勉強をしてみようということでインストールメモです。

環境はMacにvagrantを入れてCentOS6.4(64bit)を使っています。
vagrantのインストールや使いかたはドットインストールの
[ローカル開発環境の構築](http://dotinstall.com/lessons/basic_local_development_v2)や[Vagrant入門](http://dotinstall.com/lessons/basic_vagrant)を参考にするとわかりやすいかと思います。

# Percona Server

Perconaは並列処理やディスクI/Oに配慮した設計になっていたり
Toolkitなど通常のMySQLよりも色々と機能が充実しているようです。
いいものならがんがん使っちゃおうぜ！ということでとりあえずインストール。


# インストール手順

## リポジトリの追加

今回はyumでインストールするのでRPMをインストールしてリポジトリを追加します。

```
rpm -Uvh http://www.percona.com/redir/downloads/percona-release/percona-release-0.0-1.x86_64.rpm
```

上記のコマンドを実行で/etc/yum.repos.d以下にPercona.repoが
追加されます。

## インストール

あとはyumでインストールするだけ。
適当にいりそうな物をインストール

```
yum install Percona-Server-server-56 Percona-Server-client-56 Percona-Server-shared-56 Percona-Server-shared-compat percona-toolkit xtrabackup -y
```

phpとかと連携する場合は適宜必要なモジュールをつっこんでください。
また既にMySQLが入ってる場合は消しておいてください。

## 起動

起動は通常のMySQLと一緒です。
yumで突っ込んでるので適当にserviceで起動してやれば動きます。

```
service mysql start
```

起動に成功したら後はmysqlのコンソールを立ち上げていつものように
使えば完了です。

```
mysql -u root -p
```


これでとりあえずPerconaが動きます。
Node.jsでもsource mapを使おうとしたらびっくりするくらい簡単だった

まずは作業内容から。

必要なモジュールをインストールして、

```shell-session
npm install --save source-map-support
```

メソッド一つ叩けば出来上がり。

```ts:index.ts
require('source-map-support').install();

// 以下ユーザーコード
:
:
```

これだけ。

これでビルド時にsource mapを吐いておけば、スタックトレースは.tsでの行数が出ます。
AWS認定ソリューションアーキテクト アソシエイト 受験用メモ


## 参考サイト
◇AWS 認定ソリューションアーキテクト – アソシエイト レベル試験に合格する方法
http://dev.classmethod.jp/etc/how-to-get-a-certification-aws-architect-associate-level/

◇シリーズインフラエンジニアに贈るAmazon VPC入門
http://dev.classmethod.jp/series/vpcfor-infra-engineer/

◇AWS　クラウドサービス活用資料集
http://aws.amazon.com/jp/aws-jp-introduction/
→ Slideshareのリンクあって便利

◇ blueprint(jp)
http://d36cz9buwru1tt.cloudfront.net/jp/certification/AWS_certified_solutions_archtect_associate_blueprint-jp.pdf

## ポイント

http://xoxo-infra.hatenablog.com/entry/2013/10/25/184258

### マスト(A)

* VPC
* S3
* IAM
* CloudFront

### マスト(B)

* EC2
* EBS
* Elastic Load Balancing
* Auto Scaling
* SQS

### 普通

* Route 53
* RDS
vagrant up でopenstackをセットアップ

主にopenstackのコンポーネント開発用のオールインワンVMの作成です。

https://github.com/tnaoto/openstack-vagrant

OSイメージは、リポジトリ内のものを使って、veeweeあたりで作ってくださいpackaerでもいいです。

veeweeで作ると、cinder-volumesの名前が"cindervolume"になってるので、起動後の手動調整で直してください（pvrenameコマンドあたり）

あとは、box作っておけば、作って壊してし放題です。

また、eth1でいろいろやるのですが（ゲストOSも）、virtualboxの場合eth1は外に出れないのご注意を。

answerfilewのeth1の箇所を全部eth0にして、192.168.65.11の部分を、適切なIPにすれば、物理マシンでNIC１つしかなくても動きます。
Laravel 4でログの出力項目を追加するワンライナー

Laravel 4でログの出力項目を追加するワンライナー。

`app/start/global.php`あたりに次のように書くと、ログの出力項目にリクエストURI、リクエストメソッド、クライアントIPアドレスを追加できる。

```php
Log::getMonolog()->pushProcessor(new Monolog\Processor\WebProcessor);
```

また、次のように書くとプロセスIDを追加できる。

```php
Log::getMonolog()->pushProcessor(new Monolog\Processor\ProcessIdProcessor); 
```

両方書くこともできる。（ワンライナーではなくなるけど（汗））

```php
Log::getMonolog()->pushProcessor(new Monolog\Processor\WebProcessor);
Log::getMonolog()->pushProcessor(new Monolog\Processor\ProcessIdProcessor); 
```

この他にも`pushProcessor()`するオブジェクトに応じて出力項目を追加できる。
詳しくは[Monolog](https://github.com/seldaek/monolog#processors)ライブラリを参照。
cssで設定可能なheightのブラウザごとの最大値を調べてみた

# はじめに

[README](https://github.com/mleibman/SlickGrid)で"Support for millions of rows"と謳っているSlickGridですが、全ての行のDOM要素を作るのではなく画面上に見える分だけを作る方式をとっています。

行のDOM要素を載せるコンテントペインは1行の高さ×行数の高さを持つdiv要素として実現しています。

が、div要素の高さはブラウザ毎に限界があります。それを超えると設定しても、その後高さを取得すると0になってしまったりします。

SlickGridでは以下のコードで限界値を調べています。

https://github.com/mleibman/SlickGrid/blob/33e75b07bfd769349525dc084d987c406fc03e24/slick.grid.js#L437-L455

# 自分でも実際に調べてみた

これを参考にしつつ、1px単位で限界値を調べるプログラムを書いて試してみました。

デモ: https://hnakamur.github.io/jquery-examples/height-scrolltop-limit.html
ソース: https://github.com/hnakamur/jquery-examples/blob/gh-pages/height-scrolltop-limit.html

# 実はもっと行けるらしい

[JavaScript Grid with One Million Records | JavaScript UI - w2ui](http://w2ui.com/web/blog/7/JavaScript-Grid-with-One-Million-Records)の"Browser Limits"のセクションを見ると、もっと大きな値になっています。

また[StackOverflowでのSlickGridの作者のコメント](http://stackoverflow.com/questions/2402953/javascript-data-grid-for-millions-of-rows/2569488#2569488)を見るとコンテントペインに高さ1メガピクセルとかのdiv要素を敷き詰めれば、空のdiv要素より高さの限界値を上げることができるそうです。
【技術者の知的生産性向上】を読んでみた（技術KI理論)


技術者として生きてきて、あのときはうまくいったのになんで今回うまく
いかないんだろ？とか思うこと多々あったり。

忙しい忙しいというけど、何で忙しいのかわかんなくなってたり。

仕事の取り組み方が明確でなくて、なんだかふわふわしてしっくりこない。

そんなこと感じていた今日この頃でしたが、 __技術KI計画__ とその理論を解説する
  [【技術者の知的生産性向上】](http://www.amazon.co.jp/gp/product/4820709992/ref=as_li_ss_tl?ie=UTF8&camp=247&creative=7399&creativeASIN=4820709992&linkCode=as2&tag=cyanproject-22"【技術者の知的生産性向上】")を紹介してもらいました。


 __技術KI計画__は技術者としてなぜ生産性が上がらないのか。
生産性上げるためにはどうしたらいいのか？を理論化したもの。

その理論の解説は開発の現場でトラブルが頻発するのは __悪魔のサイクル__に
陥ってしまっている、というところから話ははじまります。

### 悪魔のサイクル

1.  見えない計画
2.  問題が事前に見えない
3.  個人で問題を抱え込む
4. トラブルが発生
5. もやもやする

ああ、これだけでココロが痛い・・・(笑）


そしてなぜ **悪魔のサイクル**が起こる問題を考察していきます。

### 悪魔のサイクルが起こる3つの問題
1.  負荷の調整がとれてないのに **やらねばならない**という精神論で進んでしまう **マネジメントの問題**
2.  仕様変更・技術検討不足による設計変更・突発業務多発で計画通りに進まなかったりなどの **技術検討不足の問題**
3.  ゆとりがなかったり、開発外の雑務、行き当たりばったりの検討で進んで結局やり直しさせられるなど達成感・成長感がえられない **活性化問題**

これも思い当たるフシが・・・

そして **悪魔のサイクル**を断ち切るためには **「見える計画」**を行うことと続いていきます。

ここまでの話は **当然やるべき** こととして語られていて、やれないと非難さ
れる話だったりします。

**なんでできないの？** ということを  __技術KI計画__では考察していきます。


この理論と解説は、端から端まで、今までの自分の **ダメ**さ（泣）とこ
れからやるべきことのヒントが詰まっていて・・・全部語りたいのですが、
多すぎるので、改善するための考え方抜粋します。

### 悪魔のサイクルから脱して改善するために
* 技術KIでやるべきは **「見える計画」**
* **「見える計画」**とは大中小の日程計画と作業計画（技術検討）と負荷計画がセットになった計画
* 作業計画アウトプットから考えて **「するために」**必要なことを検討
* **突発業務**は起こるものとして、1日 **30%**の時間を計画に組み込む
* 全体計画の **13%** を計画業務を日程に組み込むと計画達成率が向上する。
* 計画は本来業務そのもので、計画した業務を完遂するための **絶対不可欠の条件**

以降はマネジメントをロジカルに考えていこう、という話になっていきます。


これを読んで、なんで仕事でうまくいくいかないとかばらつきがでるのかよ
ーーくわかりました。

**場当たり的**に仕事をして、 **とりあえず**やってみて試行錯誤するので手戻り
が多く、 負荷も考えず多くの業務を受けてしまって **思考停止**を引き起こし
てた。


 __技術KI計画__ とその理論を解説する[【技術者の知的生産性向上】](http://www.amazon.co.jp/gp/product/4820709992/ref=as_li_ss_tl?ie=UTF8&camp=247&creative=7399&creativeASIN=4820709992&linkCode=as2&tag=cyanproject-22"【技術者の知的生産性向上】")は、わから
ない・できないの原因を考察・改善していくことの重要性を悟らせてもら
え、今後のバイブルとなる一冊でした。

いま仕事で **もやもや**してる人は、読んだほうがいいぜー！！
Node+ExpressでPOSTパラメータをechoする


書き方自体はgetと大して変わらないみたいですね。
リクエストオブジェクト`req`の`body`で取得できます。

```js
app.post('/test', function(req, res) {
  res.send(req.body);
});
```

使う側は`http://SERVER:PORT/test`にPOSTアクセスします。
非同期の例外処理する時に jQuery.Deferred を使う

よくある例外処理

```coffeescript
try
  myfunc()
catch e
  console.log "Error:", e
```

ここで `myfunc()` の中でAjaxなどの非同期処理がある場合、その戻り値次第で例外を発生させたい場合があるが、これではキャッチできない。

こういう時は jQuery.Deferred を使う。
`myfunc` を

```coffeescript
myfunc: () ->
  d = new $.Deferred

  # Ajaxでなにか呼び出して結果をcallbackに格納
  $.get "/nanika", (callback) -> 
    if callback == 200
      # 成功
      d.resolve()
    else
      # 例外
      d.reject()

  return d.promise()
```

こんな感にしておけば

```coffeescript
promise = myfunc()
promise.done ->
  # 成功した場合の処理
promise.fail ->
  # 失敗した場合の処理
```

と書ける。
あと `resolve(), reject()` はそれぞれ引数を持つことが出来、`done(), fail()` がそれを受け取る。
IE専用サイトをsafari対応するメモ

##テキストの全選択

```js
$('#sample').focus(function(){
  $(this).focus();
  $(this).select();
});
```

select()の代わりに、selectionStart,Endを使う。

```js
$('#sample').focus(function(){
  $(this).focus();
  $(this)[0].selectionStart=0;
  $(this)[0].selectionEnd=999;
});
```

##スクロールが変？
div内部のスクロール要素がガクガクする場合

```css
-webkit-overflow-scrolling:touch;
```

を入れる。


##フルスクリーン

ホームに置いてフルスクリーン化するときは入れておく。

```html
<meta name=”apple-mobile-web-app-capable” content=”yes”>
```

ホームに置くとフォーカスの制御ができるようになるっぽい。
[iOSのMobile Safari上でのfocus()が妙な件を調べてみた](http://alpha.mixi.co.jp/2012/10807/)

Aタグがあるとsafariに飛ばされてしまうので、AタグはJavascriptにしてしまわないといけない。

```js
        $('a').click(function(){
            location.href = $(this).attr('href');
            return false;
        });
```

[iOSでウェブサイトをフルスクリーン表示させる](http://mawatari.jp/archives/web-apps-like-native-apps)


全画面化している画面操作中にホームボタンを押してしまうと戻れない。どうしたらいいんだろうか。

##ユーザエージェント判別

[ユーザエージェント条件分岐便利スニペット](https://w3g.jp/blog/tools/js_browser_sniffing)

```js
if(_ua.Webkit && _ua.Mobile){
  alert('モバイルサファリですよねー');
}
```

##画面の縦横変更

[jQueryでiPhone/iPadの向きを検出する](http://blog.webcreativepark.net/2010/08/17-200704.html)

```js
$(window).bind("load orientationchange",function(){
		if(Math.abs(window.orientation) === 90){
			//横向き
			$('#contents').height(500);
		}else{
			//縦向き
			$('#contents').height(1000);
		}
	})
```
##未解決の問題
###画面の描画がおかしいことがある

https://discussions.apple.com/thread/4145775

[↑に出てるよく似た現象の画像](https://discussions.apple.com/servlet/JiveServlet/downloadImage/2-19091724-139989/450-281/safari issue [mountain lion].jpg)

```html
<meta name="viewport" content="width=1000"> 
```
とすることで一部改善した。
ホームに登録してフルスクリーン状態にしなければ、画面の一部が白くなる現象は発生しない模様。


###入力制限

Javascriptのキーダウンイベントで数字と矢印だけとかやってたけど、ソフトウェアキーボードから@や(などが入力できる。


###clickイベントがもっさりする。

fastclick.jsを入れるとよいというのを見かけて入れてみたが、タップ位置が入れる前よりもずれてしまう感じ。保留。


##asp.netのとき

###ラベルが普通のテキスト入力エリアに見える。

Web.configにbrowserCapsを追加するそうな。

http://internetcom.jp/developer/20051025/26.html

### document.Form1.elements("XXX").valueが動かない？

```jsjs
document.getElementById("XXX").value
document.Form1.elements["XXX"].value
```
置き換えるならgetElementsByIdが楽そうだけど。どうなんだろこれ。

###ソフトウェアキーボードを数字モードに

```html
<input type="tel">
<input type="text" pattern="[0-9]*">
```

みたいな設定だと、数字が初期状態で出てくる。


###documentのclickイベントが反応しない。

http://kimizuka.hatenablog.com/entry/2013/12/20/075448


```js
$('#contents').click(function(e) {
  return false;
});
```
なにか子要素にclickイベントを張っておくとよいらしい。

##selectのonchangeでalertやconfirmを出すと固まる。

##ソフトウェアキーボードでの確定・開くの制御
IEだとenterで次のフィールドへ移るなどやってる部分。
Ruby on Rails コマンド覚書


#アプリケーション作成時

## プロジェクトディレクトリ作成

```sh
$ mkdir project1
$ cd project1
```

## Railsアプリケーション作成

```sh
$ rails new application1
$ cd application1
# デフォルトのテストを使わないならば-Tオプションを付ける
$ rails new application1 -T
```

## Gemfile編集

```sh
$ vi Gemfile
```

```Gemfile
# gem 'gem name', 'version'
gem 'rails', '4.0.4'
gem 'sqlite3'

...

```

## gemのインストール

```sh
# systemのほうにインストールする場合
$ bundle install
# プロジェクト配下にインストールする場合
$ bundle install --path vendor/bundle
```

# Model作成時

## データベースの設定

```sh
$ vi config/database.yml
```

```database.yml
development:
	adapter: sqlite3
	database: db/development.sqlite3
	pool: 5
	timeout: 5000

test:
	adapter: sqlite3
	database: db/test.sqlite3
	...

production:
	adapter: sqlite3
	database: db/production.sqlite3
	...

```

## データベースの作成

```sh
$ rake db:create
```

## Modelファイル作成

```sh
$ rails g model Person name age:integer sex:boolean
```

その後以下ファイルを直接編集しても良い。

```sh
$ vi db/migrate/xxxxxxxx_create_xxxxxx.rb
```

## 生成済みマイグレーションファイルにインデックス追加

```
$ rails g migration add_index_to_<モデル名s>_<カラム>
```



## DBマイグレーション

```sh
$ rake db:migrate
# 間違った場合はリセット
$ rake db:migrate:reset
```


## テスト用DB作成

```sh
$ rake db:test:prepare
```

# Controller作成時

## Controllerファイル作成

```sh
# rails g controller コントローラー名 [アクション名]
$ rails g controller Projects index
```

## Routes設定

```sh
$ rake routes
```



# 実行時

## サーバー起動

```sh
# 通常起動
$ rails s
# デーモンとして起動
$ rails s --d
# 本番として起動
$ rails s -e production
```

## railsコンソール起動

```
# 変更が反映されないサンドボックス状態でコンソール起動
$ rails c --sandbox
# 変更が反映されるモードでコンソール起動
$ rails c
```

# その他


## 注釈コメント挿入


```
# annotateを導入する
$ gem i annotate
# モデル変更のたびに実行し直す
$ bundle exec annotate
```



## 正規表現作成

以下のサイトで確かめてから作る

[Rubular](http://www.rubular.com/)