OmniAICreator/Qiita-1.07M huggingface dataset:
Rails の module ClassMethods がやっている事

Rails のコードを読んでいると、`module ClassMethods` って多く書かれている事が分かると思いますが、こいつが何をやっているのかを話していきます。

`module ClassMethods` を説明する前に、まず、以下のような Module と Class を定義します。

```rb
module ModuleA
  def self.class_method_a
    'class_method_a'
  end

  def instance_method_a
    'instance_method_a'
  end
end

class ClassA
  include ModuleA
end
```

そして、次に `include` した、インスタンスメソッドとモジュールメソッドを実行してみると

```rb
ClassA.new.instance_method_a #=> "instance_method_a"
ClassA.class_method_a        #=> NoMethodError
```

このように `class_method_a` は `NoMethodError` になる事が分かります。
`class_method_a` はあくまで ModuleA の特異メソッドなので、利用することが出来ないのです。

そこで、以下のようにします。

```rb
module ModuleB
  def self.included(klass)
    klass.extend ClassMethods
  end

  module ClassMethods
    def class_method_b
      'class_method_b'
    end
  end
end

class ClassB
  include ModuleB
end

ClassB.class_method_b #=> "class_method_b"
```

`included` をオーバーライドして、`ModuleB` を `include` する際に、`ClassB` を `ClassMethods` で `extend` しています。こうすることで、クラスメソッドとして使えるようになります。

ちなみに、`class_method_b` は `extend` するために Module で囲っているだけなので、Module 名に意味はありません。ただ、慣習的に `module ClassMethods` とするそうです。

以上が `module ClassMethods` の意味です。

しかし、Rails のコードを読んでいると、`included` を使って `ClassMethods` を `extend` している箇所は見つかりません。

```rb
module ActiveSupport
  module Configurable
    extend ActiveSupport::Concern

    ...

    module ClassMethods
      ...
```

そして、代わりに `ActiveSupport::Concern` を `extend` していることに気がつきます。そこで、実際にマネして Module を次のようにしてみると、

```rb
module ModuleC
  extend ActiveSupport::Concern

  module ClassMethods
    def class_method_c
      'class_method_c'
    end
  end
end

class ClassC
  include ModuleC
end

ClassC.class_method_c   #=> "class_method_c"
```

確かにクラスメソッドとして、使えます。

これは `ActiveSupport::Concern` の `append_features` 内で `ClassMethods` を `extend` するようにオーバーライドしているためです。（`append_features` は `include` の手前で呼び出されるメソッドです）
そのため、Module に `ActiveSupport::Concern` を `extend` すれば、自動的にその Module が `include` された際に、`ClassMethods` を `extend` します。

つまり、`extend ActiveSupport::Concern` としておけば、`ClassMethods` は全てクラスメソッドとして、使えるようになります。

ちなみに、Rails 4.2 以降は以下のように `class_methods` で囲みます。

```rb
module ModuleD
  extend ActiveSupport::Concern

  class_methods do
    def class_method_d
      'class_method_d'
    end
  end
end

class ClassD
  include ModuleD
end

ClassD.class_method_d   #=> "class_method_c"
```

便利ですね。

長々と書きましたが、最後に、誤解を恐れずに一言で結論づけると `module ClassMethods` は `include` した際にクラスメソッドとして、利用できるというサインです。
Android 5.1 (Nexus 5) で SMS をブロックする方法

Google Hangout を使用していると仮定します。

1. 着信メッセージのビューに移動する
2. 右上の ... をタップする
3. 「People & options」を選択する
4. 「Block XXXX」 を選択する

基本的な機能なはずだけど、メニューを探すのに時間がかかったのでメモ。
SwiftでCSVファイルを読み込み→配列に格納する

1. CSVファイルをプロジェクト内にドラック＆ドロップして取り込む
2. 下記コードで取り出し、配列に変換する

```swift
var result: [[String]] = []
if let csvPath = NSBundle.mainBundle().pathForResource("resource", ofType: "csv") {
    let csvString = NSString(contentsOfFile: csvPath, encoding: NSUTF8StringEncoding, error: nil) as! String
    csvString.enumerateLines { (line, stop) -> () in
        result.append(line.componentsSeparatedByString(","))
    }
}
println(result)
```

version:swift1.2

※ 下記の@takabosoft さんのコメントにあるようにデータにカンマが含まれていたり、不明なcsvを扱う場合には不十分ですので、ご注意ください。
Ubuntu 15.04のApache2.4でhttps設定

## SSLモジュール有効化

```bash:SSLモジュール有効化
cd /etc/apache2/mods-enabled/
ln -s ../mods-available/ssl.conf .
ln -s ../mods-available/ssl.load .
ln -s ../mods-available/socache_shmcb.load .
```

## webサイトの設定

```bash:
cd /etc/apache2/sites-available/
grep -v \# default-ssl.conf ssltest.conf

cd /etc/apache2/sites-enabled/
ln -s ../ssltest.conf .
```

```diff:/etc/apache2/sites-enabled/ssltest.conf
- SSLCertificateFile    /etc/ssl/certs/ssl-cert-snakeoil.pem
- SSLCertificateKeyFile /etc/ssl/private/ssl-cert-snakeoil.key
+ SSLCertificateFile    /etc/ssl/2015/testssl.pem
+ SSLCertificateKeyFile /etc/ssl/2015/testssl.key.nopass
```

## restart

```bash:
apachectl -S
systemctl restart apache2
```

https://sslのドメイン名/ にアクセスし応答があることを確認。

# トラブル集

## apache2起動時パスワードが求められる

> Enter passphrase for SSL/TLS keys for 127.0.1.1:443 (RSA): 

SSLCertificateKeyFileで指定した秘密鍵がパスワードを抜いていないことが原因。


## 秘密鍵と署名された公開鍵とが一致しない

> AH02565: Certificate and private key 127.0.1.1:443:0 from /etc/ssl/2015/testssl.cer and /etc/ssl/2015/testssl.key.nopass do not match

SSLCertificateFile で指定した公開鍵にCA鍵が同梱されていないことが原因。
署名してもらった機関のWebページからCA鍵をとってきて
cerにくっつけ、ファイルの拡張子はpemにしましょう。


## ssl_error_bad_cert_domain

証明書で申請したURLとアクセスしたURLが異なることが原因。
テスト環境で確認したい場合はhostsの127.0.0.1などにドメイン名を書き
自分自身にアクセスしましょう。


## ssl.confでsyntax errorが出ていると言われた場合

socache_shmcb.load モジュールを読み込んでいない場合、${APACHE_RUN_DIR}が未定義扱いになります。
[以下のように修正する例が見つかりました](http://serverfault.com/questions/400089/apache2-sslsessioncache-running-but-not-working)が修正不要です。

```diff:/etc/apache2/mods-enabled/ssl.conf
- SSLSessionCache hmcb:${APACHE_RUN_DIR}/ssl_scache(512000)
+ SSLSessionCache hmcb:/dev/shm/ssl_scache(512000)
```

## 他の端末(IE6など)からページが見れない場合

* インターネットオプションを開き、
  * SSL2.0, SSL3.0 のチェックを全部外し、TLS1.x のチェックをつけましょう。

## SSL received a record that exceeded the maximum permissible length

VirtualHostで指定するアドレスが間違っていないか確認

```apache:/etc/apache2/sites-enabled/ssltest.conf
<VirtualHost 192.168.10.22:443>
```
c# 指定した順番に引数をチェックして最初に空以外の文字列を返却する関数

以下の自作関数、自分としては便利で多用しているのですが、関数名がしっくりこなくて悩む毎日です。
カスケードっていうと最後のもので上書きされそうなので意味が逆ですよね。。。
FirstStringとかでしょうか。

```csharp:関数
public static string GetCascade(params string[] args)
{
    return args
        .Where(o => !o.IsNullOrEmpty())
        .FirstOrDefault() ?? string.Empty;
}
```

```csharp:呼び出し
var a = GetCascade("", null, "abc", "def");
```

結果: "abc"
Effective C++ (3rd) > 31項 > インタフェースクラス > ファクトリ関数create

引用: Effective C++ 第3版

> また、インタフェースクラスを使うには、オブジェクトを生成しなければなりません。そのために、派生クラスのオブジェクトを生成する関数がよく使われます。そのような関数は、一般にファクトリ関数(13項を参照)とか仮想コンストラクタと呼ばれます。これはインタフェースクラスのインタフェースを持つオブジェクトを動的に生成し、そのポインタ(...)を戻す関数です。

```cpp
class Person {
public:
  ...
  static std::tr1::shared_ptr<Person>
    create(const std::string& name,
           const Date& birthday,
           const Address& addr);
  ...
};
```

> このクラスを使うコードは次のようになります。

```cpp
std::string name;
Date dateOfBirth;
Address address;
...
// Personのインタフェースを持つオブジェクトを生成し、それを指し示すポインタを生成
std::tr1::shared_ptr<Person> pp(Person::create(name, dateOfBirth, address));
...
std::cout << pp->name()
  << "が誕生した。日付は"
  << pp->birthDay()
  << "で、住所は"
  << pp->address();
...
```

> もちろん、どこかで、インタフェースクラスのインタフェースを持つ具体クラスを定義し、そのコンストラクタを呼び出すようにしなければなりません。しかし、それは仮想コンストラクタの定義を書くファイルの中に隠されるのです。
レスポンシブWebデザイン



## レスポンシブWebデザインとは

・ユーザーが閲覧する端末の画面サイズに合わせて、ページのデザインやレイアウトを自在に操るウェブ制作の手法

## 歴史

・アメリカの Ethan Marcotte 氏が考案、命名したウェブ制作の手法
・日本でも2011年後半から、この手法を取り入れたウェブサイトが登場し始めた

## レスポンシブWebデザインを支える3つの手法

・フレキシブル・グリッドをベースとしたレイアウト
　レイアウト幅が可変する段組みレイアウト

・フレキシブル・イメージ／メディア
　フレキシブル・グリッド内でサイズが可変するイメージやビデオ等のメディア

・メディアクエリ
　画面サイズを判別してスタイルを指定できるCSS3の機能

## レスポンシブWebデザインの5つのレイアウトパターン

以下にまとめています
[レスポンシブWebデザインの5つのレイアウトパターン](http://qiita.com/nakoro/items/f5370cbf2067c8ac38dd)

## コンテンツを起点に考えるウェブ制作とコンテンツ戦略

ユーザが求めるコンテンツを提供するには、最低限、以下の3つを知る（または想定できる）必要がある

1. 提供する相手は誰か
2. 提供するコンテンツの目的は何か
3. ユーザーは、いつ、どこで、どのようにコンテンツを消費するのか

これらを考え、調査し、想定することで、ユーザーに喜ばれるコンテンツが提供できる

## レスポンシブWebデザインの特徴

### 実装の流れ

画面サイズとして扱われるデバイスの横幅を設定する

```viewportの設定例.html
<meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1, maximum-scale=1, user-scalable=no">

```
| プロパティ| 内容|デフォルト値|
|:------|:-------|:-----|
| width | viewportの横幅| 980px|
| height| viewportの縦幅| 横幅とスペクと火から計算される値|
| initial-scale| 倍率の初期値| 表示範囲から計算される値|
| minimum-scale| 倍率の最小値| 0.25|
| maximum-scale| 倍率の最大値| 1.6|
| user-scalable| 拡大縮小の可否| yes|

### プレークポイント

* 特定のウィンドウサイズを境としてスタイルを切替るポイント幅のこと
* 〜480px：ちょっと古いスマートフォン
* 480〜780px：現在よく使われるスマートフォン
* 768px〜：タブレットやPC、高解像度のスマートフォン

参考サイト

[レスポンシブWebデザインにおけるブレイクポイント設定調査（2012年10月29日発表）](http://www.supotant.com/research/r121029.html)

[ブレークポイント参考サイト Asial BLOG](http://blog.asial.co.jp/1010)

### デバイス特性の判別方法

#### CSS3のメディアクエリ

* PC用のCSS、スマホ用のCSSと、読み込むCSSを振り分ける

3つの記述方法

CSSソース内に記述する場合

```モバイル用のスタイルを記述例.css
@media screen and (max-width: 768px) {
}
```

```タブレット用のスタイルを記述例.css
@media screen and (min-width: 768px) {
}
```

`<head>`内のlink要素のCSSに記述する場合

```ウィンドウ幅768px以下の場合にmobailecssを読み込む例.css
<link rel="stylesheet" media="screen and (max-width: 768px)" href="mobile.css" />
```

```ウィンドウ幅768px以上の場合にtabletcssを読み込む例.css
<link rel="stylesheet" media="screen and (min-width: 768px)" href="tablet.css" />
```

CSSの@importに記述する場合

```ウィンドウ幅768px以下の場合にmobailecssを読み込む例.css
@import url("mobile.css")screen and (max-width: 768px)
```

```ウィンドウ幅768px以上の場合にtabletcssを読み込む例.css
@import url("tablet.css")screen and (min-width: 768px)
```

### レスポンシブWebデザインのメリット・デメリット

| メリット|デメリット |
|:------|:-------|
| メンテナンスがしやすい | 設計／開発の難しさ|
| 一貫性のあるデザイン| 異なるデバイスの異なる利用方法|
| URLの統一化| IE8以下で動かない|
| 検索に強い|-|
| スマートフォン非対応のCMSでも対応できる|-|

## 参考書籍

レスポンシブWebデザイン　テクニックブック
技術英語 > 念のため > Just in case.

念のため、と言いたい時
Just in case.
を使う。

関連して思い出したものとして
<font color=red>To be on the safe side,</font>...
<font color=red>I would like to make sure if</font> I understand you correctly.
など

<hr>
オックスフォード現代英英辞典で"Just in case"を検索すると以下のものが出てくる
> (just) in case (...)
> because of the possibility of sth happening
> - You'd better take the keys in case I'm out.

<hr>
http://hun-blog.com/article/12807135.html
> just in caseは普通「～するといけないから、～の場合に備えて」の意味で使われます。
また、後ろを省略して「念のため」と言う意味でも使います。

just in caseだけなのか、後ろに文が続くかで違うようだ。

<hr>
just in caseとto be on the safe sideの使い分けは?
http://www.alc.co.jp/speaking/article/question/090701.html
> どちらも「念のため」という意味で、同じように使うことができます。厳密に言うと、just in caseは「もしものときのために」、to be on the safe sideは「大事を取って」というニュアンスですが、交換可能なことが多いのも事実です。
CreateJS とりあえず画像表示

CreateJS研究中。とりあえず画像表示できたのでメモ


```html:sample.html
<canvas id="canvas" width="500" height="500"></canvas>
<script src="//code.createjs.com/easeljs-0.8.0.min.js"></script>
<script>
;(function(){

  document.addEventListener('DOMContentLoaded', function(){

    // image読み込んでキャンバス上の描画
    var canvas = document.getElementById('canvas');
    var stage = new createjs.Stage(canvas);
    var img = new createjs.Bitmap('img/hoge.png');
    img.x = 100;
    img.y = 100;
    stage.addChild(img);

    // 静止表示させるだけでもくるくる回さなきゃだめなんですね。
    createjs.Ticker.setFPS(60);
    createjs.Ticker.addEventListener('tick', update , false);

    function update(){
        stage.update();
    }

  }, false);

})();
</script>
```
ginza.rb 23th Rails API


（勉強会中でメモっただけなのでめっちゃ生煮え…あとでちゃんとしないと…）

# Rails API

APIサーバって単独で運用することが少ないのでは…

JBuilderを使わなかったのは、Viewレベルのだから？
Viewレベルの機能がだいぶ削られてるし。

プルリクにrails guideがある
https://github.com/spastorino/rails/blob/rails-api/guides/source/api_app.md

なんでsinatraじゃないの？
railsはいろんなmiddlewareがあるよ

すげーはやい

運用サイトはいるから、どうやってビジネスロジックを共有しよう？
Rails engine? / gem ?

数値、参考値かも


プルリクを読む

コントローラでわざわざjsonを指定しているのは、JBUilderじゃないから

class API < Metal

abstract!ってなんだろう？

ほとんどコードがない。middlewareを減らしただけ。

actionpack/lib/action_dispatch/routing/mapper.rb

new edit がデフォルトで作られなくなってる。

actionpack/lib/action_dispatch/routing/route_set.rb

railties/lib/rails/generators.rb

テンプレートエンジンがnilになってる

def delete_non_api_initializers_if_api_option

わざわざ消してる。ホントは作らないのが正解だけれど。
もとがgemだから？あとからAPI仕様にされたことを考慮？

protect from forgeryが省かれてる


APIなに使ってる？

jbuilder
render json
  rabl
  active model serializer

auth系は入ってない
独自か、doorkeeper?

APIサーバ建てた人、管理画面どうしてる？

* microservice化して、管理画面をAPI

Rails EngineにAPIを載せる？？複雑になりそうかな？
  そこにモデルをおいて、エンジンで共有？

サービスが育ったあとから、Rails APIを使うようにする？

action cable???

http://tech.misoca.jp/entry/2015/05/08/170112

http://techlife.cookpad.com/entry/2014/11/06/100000

http://mwdesilva.com/posts/111-rails-5-action-cable-demystified

rails5の話

turbolinks
  スマホはつらい？
  部分更新
  jsライブラリどうするか問題。。。
rails runner
  test
  rake から rails testになる
https://intercityup.com/blog/upcoming-changes-in-rails-5-0.html

attribute api?
https://speakerdeck.com/sgrif/designing-a-great-ruby-api-how-were-simplifying-rails-5
gruntでEMFILE: Too many opened files. と出るとき



デフォルトでは、ウォッチ可能なファイル数が低く設定されているため、
ちょっと開発規模が大きくなってくると上記のエラーが出てしまいます。

そんなときは、

```
ulimit -n 1024
```

というコマンドを入力しましょう。

それでもエラーが出てしまう場合は、

```
launchctl limit maxfiles 10480 10480
```

を入力すると、だいたい解決します。
HTML5アプリをiOS／Androidで動かすいくつかの方法

HTML5で作ったアプリを、iOS／Androidで動かす方法をいくつか紹介します。
私自身がゲーム開発で使いたいために調べたものなので、少しゲーム寄りの情報になっています。
なお、HTML5で開発したアプリを対象としているため、独自のAPIをJavaScriptで
バインディングした方式のものは除外しています。(Titaniumとか)

＃間違った記載がある場合や、他に良いものがあるよ、という場合はコメントいただけると嬉しいです。


#Apache Cordova (PhoneGap)
https://cordova.apache.org/

Cordovaは老舗で有名なのであまり書くことがありませんが。。。

CordovaはHTML5のAPIに加え、Cordova APIが追加されており、それによってネイティブの機能を呼び出すことができます。
オープンソースなので拡張がしやすく、Cordovaをベースにしたツールが数多く存在します。
（[Monaca](https://ja.monaca.io/)とか、[Intel XDK](https://software.intel.com/en-us/intel-xdk)とか）

Cordova標準では組み込みのWebViewを使うので、パフォーマンスが悪くゲームにはあまり向きません。
このWebViewのパフォーマンス対策として、[Crosswalk](https://crosswalk-project.org/)というランタイムが開発されています。
これはBlinkをベースにしたWebViewで、AndroidでこのCrosswalkのWebViewを使用することで、
パフォーマンスが改善されるようです。
上記のXDK、MonacaではこのCrosswalkを選択することができます。

なお、iOSはWKWebViewが代替策となりますが、これはiOS8以上である必要があります。





#CocoonJS
https://www.ludei.com/cocoonjs/

CocoonJSはCordova同様、モバイル環境でHTML5アプリを動かすためのフレームワークです。
HTML5アプリが動作する環境を、用途に合わせて以下の3つから選択することができ、
そらによってCordovaよりも高速に動作することが可能です。
Cordovaを内蔵しており、*System Webview*を選択した場合はCordovaを使うようです。

* **Canvas+**
> WebGL、Canvasを使ったゲーム向けの環境です。
Canvas周りのAPIが高速に動作しますが、代わりにDOM操作系のAPIが制限され、
一部が使用できません。
私の勝手な想像ですが、以下で紹介する**Ejecta**のような実装ではないかと思います。

* **WebView+**
> Androidの場合はChromiumベースのWebViewを使用し、Android4.0以上で動作します。（Crosswalk？）
iOSの場合はWKWebViewを使用し、iOS8.0以上で動作します。
システム組み込みのWebViewよりも高速に動作します。

* **System WebView**
> Cordovaです。

CocoonJSは基本的にクラウド環境でビルドします。
CocoonJSの"DEV PORTAL"ページにログインし、端末の種類、実行環境等を選択して
「Compile project」ボタンを押すと、数分後にダウンロードできるようになります。

中に含めるHTML5のソース一式をZIPでアップロードするのですが、30MBまでの制限があります。
Premiumユーザは500MBまでの制限にアップするようですが、Premiumユーザになるには
[フォーム](https://cloud.ludei.com/cloud/extras/extensions/)から問い合わせる必要があるようです。

上記のクラウドビルド以外に、CLIが用意されているのですが、これはCanvas+には対応していないようです。


# **Ejecta**
http://impactjs.com/ejecta

Ejectaは[Impact](http://impactjs.com/)というJavaScriptゲームエンジンで使用されているフレームワークです。
Impact自体は有料のツールでソースも公開されていませんが、Ejectaは[オープンソースで公開](https://github.com/phoboslab/Ejecta)されています。

EjectaはWebGLをWebViewのCanvasではなく、そのままOpenGLで描画します。
WebViewを介さないため、無駄がなく高速に動作します。
ただし、DOM自体が存在しないため、DOM系のAPIは大きく制限され、使えないものが多いです。
（最低限のAPIは呼び出せるようにエミュレートされています）
Ejectaは残念ながらiOS用となり、Androidでは動作しませんが、Androidで動くように実装された
Ejecta-XというプロジェクトがGitHubに存在しています。
https://github.com/Wizcorp/Ejecta-X

ただ、これは個人が作っているもののようで、最近は更新も滞っているようです。
Ejecta、Ejecta-X共に動かしてみましたが、どちらもサンプルは問題なく動作しました。


#おわりに
結局はオープンソースで拡張もしやすいCordovaが使いやすいです。
CrosswalkやWKWebViewを使うことでパフォーマンスも向上します。
個人的にはEjecta、Ejecta-Xには是非頑張ってほしいです。
git pullで”error: corrupt loose object”を解決した話

`git pull`すると突然以下のエラーが出てきた
> error: corrupt loose object

見慣れないエラーなので、調べるとstackoverflowの以下にたどり着きました。
http://stackoverflow.com/questions/4254389/git-corrupt-loose-object

読み進めると、どうやら.gitフォルダが壊れているっぽいので、正しいものに差し替えなさいとのこと。

そこで、他の場所で
`git clone`
して、作成された.gitフォルダを丸ごとコピー

再び、`git pull`すると成功しました。
SASSコントラストジェネレータ

**背景色に合わせて、自動でコントラストついたテキストカラーにする。**

```lang:sass
//-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
//
//  Color contrast Generator
//  Usage
//  background-color: $c;
//  color: contrast($c, darken($c, 80), lighten($c, 80));
//
//-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
$dark_default: #333333 !default;
$light_default: #EEEEEE !default;
@function brightness($color) {
  @return ((red($color) * .299) + (green($color) * .587) + (blue($color) * .114)) / 255 * 100%;
}

@function contrast($color, $dark: $dark_default, $light: $light_default) {
  @if $color == null {
    @return null;
  }
  @else {
    $color_brightness: brightness($color);
    $light_brightness: brightness($light);
    $dark_brightness: brightness($dark);

    @return if(abs($color_brightness - $light_brightness) > abs($color_brightness - $dark_brightness), $light, $dark);
  }
}

```
VBAHaskellの紹介 その14（変数のムーブ）

Haskellと全く関係ない話題だが、VBAHaskellでは効率上の理由からVariant変数のムーブ・セマンティクスを実装して利用している。APIにある `moveVariant` 関数だ。[^1]
効率とは、関数で配列を返す時に発生するローカル変数のコピーなどのことである。

```vbnet
' 0 から n までの自然数配列を返す関数（簡略化版）
Function iota_(ByVal n As Long) As Variant
    Dim ret As Variant, i As Long
    
    ReDim ret(0 To n - 1)       ' ローカル変数をReDimする
    For i = 0 To n - 1: ret(i) = i: Next i
    iota_ = ret                 ' 普通に返すか
    iota_ = moveVariant(ret)    ' ムーブして返すか
End Function
```

VBAには return 文がなく、関数名 = 値 とすることによって値を返す。しかし 関数名を直接 `ReDim` することはできない。上記の例だと、`ReDim iota_(0 to n - 1)` とはできないので、配列を返すためにはローカル変数を`ReDim`し、関数名 = ローカル変数 とする。
ここで `iota_ = ret` とするとき Variant変数のコピーが発生するため、大きな配列の場合や頻繁に呼び出される場合にはコストが無視できない。
どうせローカル変数は捨てられるのだから、ムーブしてしまえばよい。

```cpp
//sourceのVARIANT変数をtargetのVARIANTへmoveする
VARIANT __stdcall  moveVariant(VARIANT* source)
{
    VARIANT target;
    ::VariantInit(&target);
    std::swap(target, *source);
    return target;
}
```
実装はこれだけで、'std::swap' の VARIANT への特殊化はもちろんしていない。
（その後、`moveVariant`は`swapVariant`関数を使って実装する形に変更した。変数のスワップの方が汎用性が高いのだ。）
これは実測してかなり効果があることが分かった。元の変数はきれいさっぱり消えてしまうので注意が必要だが、「配列を受け取って何かして返す」というとき、Sub プロシージャでなく Function プロシージャにできるというメリットがある。

```vbnet
' 単に配列の最初の要素をインクリメントするだけ
Function moveIt(ByRef x As Variant) As Variant
    x(0) = x(0) + 1
    moveIt = variantMove(x)
End Function

'aは大きな配列
a = moveIt(a)
b = moveIt(a)    ' こうすると a は消えるが一瞬で処理できる

```
こうすれば、引数を渡すのも返すのもコストを気にせずに済む。API内でも functionExpr::eval で使用している。

[VBAHaskellの紹介 その13 （プレースホルダの追加： _1 と _2 ）](http://qiita.com/mmYYmmdd/items/2988b653c3dc3d5e01e0)
[VBAHaskellの紹介　その1　（最初はmapF）](http://qiita.com/mmYYmmdd/items/c731edf943acc0a0ebe9)


[^1]: 後述のように、API側は`swapVariant`という関数に変更し、`moveVariant`はVBA側に移動した。
Reactをdependenciesに含むnpmライブラリを使用するとReact.findDOMNodeがたまに死ぬ

__React v0.13.3 時点での情報です (findDOMNode実装から0.0.3しか経っていません)__
_https://facebook.github.io/react/blog/2015/05/08/react-v0.13.3.html_

# 結論
__Reactをdependenciesに含めたnpmライブラリを使用するとReact.findDOMNodeが死ぬ可能性がある__
※ npmライブラリが独自でReact持っててその中でrenderしてたらアウト

# 事の発端
<blockquote class="twitter-tweet" lang="ja"><p lang="ja" dir="ltr">React.findDOMNode(this)するとfirstChildが見つからないつって落ちるんだけど…</p>&mdash; morisuke (@morisuke_tec) <a href="https://twitter.com/morisuke_tec/status/600630326763782144">2015, 5月 19</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

# 現象
コンポーネント内部で```React.findDOMNode```しようとすると、__```Cannot read property 'firstChild' of undefined```__で死ぬ。
マウントタイミングの問題かと思って場所を```componentDidMount ```より後ろにずらしてみてもやっぱダメ。

# 調査してみた
落ちるのは[findComponentRoot](https://github.com/facebook/react/blob/52752446760dee0bc7232b4146f5a309ac57f065/src/renderers/dom/client/ReactMount.js#L804-L810)。

```js:ReactMount.js
findComponentRoot: function(ancestorNode, targetID) {
    var firstChildren = findComponentRootReusableArray;
    var childIndex = 0;

    var deepestAncestor = findDeepestCachedAncestor(targetID) || ancestorNode;

    firstChildren[0] = deepestAncestor.firstChild;
...
```

ここで既にfindComponentRootReusableArrayが空になっている。
ソースを追っていくと[findReactContainerForID](https://github.com/facebook/react/blob/52752446760dee0bc7232b4146f5a309ac57f065/src/renderers/dom/client/ReactMount.js#L714-L716)にたどり着きます。


```js:ReactMount.js
findReactContainerForID: function(id) {
    var reactRootID = ReactInstanceHandles.getReactRootIDFromNodeID(id);
    var container = containersByReactRootID[reactRootID];
...
```

__```containersByReactRootID```__はコンポーネント初期化の際に親コンポーネントが随時登録されていく場所です。
今回はこの ```containersByReactRootID``` が空配列になっていました。
以上の状況は、__コンポーネントをrenderしたReactオブジェクトとfindDOMNodeしたReactオブジェクトが違う__と発生します。

# どうしてこんなことになったのか
原因は昨晩自分で公開した[react-provider](http://qiita.com/morisuke/items/c44610a4af08d3246af3)でした。
このライブラリはReactとreact-toolsとlodashに依存しているので、軽い気持ちで取り敢えず全部入れとけ、とpackage.jsonのdependenciesにこう書きました。

```json:package.json
 "dependencies": {
    "lodash": "~3.8.0",
    "react": "^0.13.3",
    "react-tools": "^0.13.3"
  },
```

npmの依存解決の仕組みをよく知らなかったので、__既に親のnode_modulesに入っているものはスキップして、そっちを使ってくれるだろう__ 程度に考えていたのですが実際は、__node_modulesに必ずdependenciesの内容がインストールされ、ライブラリはそこから依存するモジュールを呼び出す__ようです。

つまりここにReact本体が含まれていたことにより、
__アプリケーション部分が使用しているReactオブジェクトとライブラリの使用しているReactオブジェクトが違う__
という先ほどのエラーを生む状況が発生しました。

ちなみに__react-providerは中でReact.renderをおもっくそ走らせているので完全にアウトです。__
本当にありがとうございました。

# 直し方
ライブラリのpackage.jsonのdependenciesからreactを削除してnode_modulesを消し、
```npm install```をやり直せば綺麗に動くようになります。

こうすると親のnode_modulesからreactを呼び出して動作してくれるようになります。
要はdependenciesにさえ書かなければ大丈夫。

# 終わりに
そもそもライブラリのdependenciesにreactを含めて公開するのが作法として間違っていたような気がします。（知っている方がいらっしゃったら教えて下さい）
万が一 __```Cannot read property 'firstChild' of undefined```__ に遭遇した時はこの記事のことを思い出してやって下さい。

# 補足
Q. プルリク送らないの？
__A. たぶんこれ解決するの結構難しいし、しなくても良いやつ__
GitHubのリポジトリ統合で旧リポジトリに取り残されたPRを新リポジトリに移動したい

うちのチームでは、ひとつのシステムをサービスごとに複数のリポジトリに分割して運用していたのですが、リポジトリがひとつのほうが都合がいいということになり、分かれていたリポジトリをひとつのリポジトリに統合しました。

統合するに当たって、旧リポジトリに残されたプルリクエストがあり、それが置き去りになっていたので、新リポジトリに持ってきたいと思います。リポジトリ統合に当たって、ファイルパスが変わっていたりするので、ファイルパスの調整が必要になります。


旧リポジトリをcloneしてくる。

```
git clone 旧リポジトリ
```

PRリクエストのブランチをチェックアウトする。

```
git checkout issues/21
```

パッチファイルを作る。

```
git show master issues/21 > patch.txt
```

新リポジトリでPR用のブランチを作る

```
git checkout -b issues/14
```

そのままではパッチが当てられないようなら、マージできそうな時点まで戻す。

```
git reset  e47ec1a2f10b8fb2d87bd212cc55d95c745feffe --hard
```

パッチファイルをエディタで開き、パスが変わっている部分を修正する。

修正したらパッチを当てる。

```
git apply patch.txt
```

コミットする。

```
git commit -a
```

masterブランチをrebaseする。

```
git rebase master
```

ここでコンフリクトするものがあれば、解消していく。

全て終わったら、GitHubにPRを作成する。

```
hub pull-request -i 14 -h issues/14
```
Aureliaのsample環境構築

# 概要
* Aureliaのsample環境を動かしてみたのでその際のメモです。
* Aureliaサイト : http://aurelia.io/
* 参考URL : http://aurelia.io/get-started.html

# 環境設定

```bash

# gulp
npm install -g gulp

# jspm 
npm install -g jspm

# generator-aurelia 
npm install -g yo generator-aurelia

```

# スケルトンの生成

```
yo aurelia
```

# Install

```bash
npm install
jspm install -y

# たぶんいらないはず。 (でも実行したので、一応記載)
# jspm install aurelia-http-client

```

# 起動

```bash
gulp watch
```

* 以下URLにアクセスして画面が表示されたら成功
* URL : http://localhost:9000/#/
複数GitHubアカウントのSSH設定方法

# 概要
* GitHubのアカウントが複数あり、それぞれのリポジトリを分ける方法のメモ
* GitHubにはSSHのキーは、それぞれ登録されている事が前提です。

# SSH設定

* 以下のファイルにSSHの設定内容を記述する

### 編集ファイル
```bash
vim ~/.ssh/config
```

### 編集内容

```bash
Host github-company
  User git
  Port 22
  HostName github.com
  IdentityFile ~/.ssh/id_rsa_company
  TCPKeepAlive yes
  IdentitiesOnly yes
Host github-private
  User git
  Port 22
  HostName github.com
  IdentityFile ~/.ssh/id_rsa_private
  TCPKeepAlive yes
  IdentitiesOnly yes
```

# リポジトリの設定

* リボジトリのURLを上記で設定したURLの設定に置きかえる

### リモートリポジトリの設定

```bash

# 変更前
git remote -v

origin	git@github.com:[account]/sample.git (fetch)
origin	git@github.com:[account]/sample.git (push)

# 設定 (すでに設定済みの場合)
# git remote set-url [name] [url]
git remote set-url origin github-private:[account]/sample.git

# 設定 (未登録の場合)
# git remote add [name] [url]
git remote add origin github-private:[account]/sample.git

# 変更後
git remote -v 

origin	github-private:[account]/sample.git (fetch)
origin	github-private:[account]/sample.git (push)

```

# アカウントの設定

* 以下の設定をしないとglobalで設定されている名前が使われてしまう(コミットユーザー名が意図しない名前になります。)為、設定。
* 設定は、対象のGitHubアカウント名とメールアドレスを指定。

```bash

git config --local user.name "name"
git config --local user.email "e-mail"

```
条件演算子（三項演算子）を可読性低いとか言わせない

C系構文規則の言語で出てくる、単に三項演算子とも呼ばれる条件演算子という演算子があります。

```
【真偽値式】 ? 【真の場合に評価する式】 : 【偽の場合に評価する式】
```

この条件演算子、可読性を損なうとして使用を禁止とするコーディング規約が定められることがあり、そのたび議論を呼びます。このくらい読めないでプログラマかよ、いや実際読みにくいよ、などなど。

しかし、改行とインデントでこういう書き方をすれば可読性は良好なんじゃないですかねというご提案。

単独で使う場合
--
```
= 【真偽値式】
    ? 【真の場合に評価する式】
    : 【偽の場合に評価する式】
```

真の場合、偽の場合の式がボリュームのあるものの場合に可読性が落ちません。
行コメントも加えやすくなります。

入れ子で使う場合
--
条件演算子の入れ子など論外、という方もいらっしゃると思います。でもこんな書き方なら？

```
= 【真偽値式1】 ? 【真偽値式1が真の場合の式】
: 【真偽値式2】 ? 【真偽値式2が真の場合の式】
: 【真偽値式3】 ? 【真偽値式3が真の場合の式】
: 【真偽値式4】 ? 【真偽値式4が真の場合の式】
: 【真偽値式5】 ? 【真偽値式5が真の場合の式】
              : 【すべて偽だった場合の式】
```

switch文や連想配列で微妙に表現しきれない多条件分岐があっても、if-elseを連ねることなくさらっと表現できます。しかもこれも行コメントが加えやすいですね。

入れ子で使う場合その2・単独使用タイプの応用
--
前項のswitch的な入れ子でなく本当に複雑な入れ子になったビジネスロジックというのもあって、まあそういうのはどう書いたって可読性は悲惨なんですが、最初の方式のインデンテーションだとまあ最低限の読みやすさは確保できるんじゃないですかねという例。

<blockquote class="twitter-tweet" lang="ja"><p lang="ja" dir="ltr">よく読んだらもっと難解だった。正確にはOR(NOT(オートロックがある),NOT(施錠された場所にある),AND(一戸建て,NOT(鍵が閉まっている)))　→はい RT <a href="https://twitter.com/kenkawakenkenke">@kenkawakenkenke</a>: 東京ガスの説明が難解。 <a href="http://t.co/dRVoDqe7Hv">pic.twitter.com/dRVoDqe7Hv</a></p>&mdash; Ken Kawamoto（ガリのほう） (@kenkawakenkenke) <a href="https://twitter.com/kenkawakenkenke/status/597598445864554497">2015, 5月 11</a></blockquote>

これが

```
boolean 立ち会いの必要性 = 
    一戸建てである
        ? 門や戸の鍵が締まっている
        : オートロックである
          && 開けてくれる管理人がいない
          && ガスメーターが屋内にある;
```

と、こんな感じ。東京ガスの説明よりは可読性高くありません？

重要な注意：PHPではネストの結合則が違う
--
たった今twitterでいただいた重要なコメントの反映。

「C系の構文規則の言語」にはおそらくPHPも含まれることになると思いますが、PHPの条件演算子はほかのほとんどの言語のものと違い、左結合です。
なので、この記事の方式で「読みやすく」した入れ子記述をすると見た目とまったく違った解釈をされます。この記事の記法提案に関してPHPだけは例外とお考えください。
oh my zsh + iterm2 に乗り換えたよ


これやっとけばいい感じのzsh環境ができるよっていう記録になる予定。

# zsh

まずzshのパスの確認

```.bash
vi /etc/shells
```

デフォルト化する

```.bash
chsh -s [zshのパス]
```

## peco

[ここ](http://wayohoo.com/unix/zsh-oh-my-zsh-peco-of-installation-procedure.html)見ながらやるとインストールできる。

[oh−my−zshと一緒に使うにはこれが必要らしい！](http://qiita.com/uchiko/items/f6b1528d7362c9310da0)

## ggpullとか使えるようにしたい

oh-my-zshでつかえた。意味知らなかったけど `git pull origin current_branch` らしい！ここにちゃんとまとめられている。えらい
http://qiita.com/takc923/items/45f005d700895907ecf5

## llってなんぞや

oh-my-zshでつかえた。lsの詳細みれるやつ。

## 他の環境に持って行きやすいようにしたい
[TBA](http://www.quicktranslate.com/blog/2013/11/%E8%8B%B1%E8%AA%9E%E3%81%AE%E8%B3%87%E6%96%99%E3%81%AB%E5%87%BA%E3%81%A6%E3%81%8F%E3%82%8B%EF%BC%88tbc%EF%BC%89%E3%82%84-%EF%BC%88tbd%EF%BC%89%E3%81%AF%E4%BD%95%E3%81%AE%E7%95%A5%EF%BC%9F/)

## tmuxいれたい
[TBA](http://www.quicktranslate.com/blog/2013/11/%E8%8B%B1%E8%AA%9E%E3%81%AE%E8%B3%87%E6%96%99%E3%81%AB%E5%87%BA%E3%81%A6%E3%81%8F%E3%82%8B%EF%BC%88tbc%EF%BC%89%E3%82%84-%EF%BC%88tbd%EF%BC%89%E3%81%AF%E4%BD%95%E3%81%AE%E7%95%A5%EF%BC%9F/)

## cd したら ll
[TBA](http://www.quicktranslate.com/blog/2013/11/%E8%8B%B1%E8%AA%9E%E3%81%AE%E8%B3%87%E6%96%99%E3%81%AB%E5%87%BA%E3%81%A6%E3%81%8F%E3%82%8B%EF%BC%88tbc%EF%BC%89%E3%82%84-%EF%BC%88tbd%EF%BC%89%E3%81%AF%E4%BD%95%E3%81%AE%E7%95%A5%EF%BC%9F/)

# iTerm

## テーマカラー

[Seti](https://github.com/mbadolato/iTerm2-Color-Schemes/blob/master/schemes/Seti.itermcolors)にした。

preference > Profile > colors > import > リンク先のファイル選択 でOK

## ショートカットキー変えたい

Preferenceのkeysから以下を+ボタンで登録する。

### タブ移動

`⌘←`とかになってるのをを`⌘+⌥+←`とかにした。

### 単語ごとにカーソル移動

左方向

* Action は Send Escape Sequence
* Esc+ には小文字の「b」を入力

右方向

* Action は Send Escape Sequence
* 「f」を入力

### コマンド+矢印で行頭、行末にカーソル移動

* [このページにのってる]( http://superuser.com/questions/585518/how-to-make-commandarrow-go-to-begining-and-end-of-line-in-iterm2)

### 注意

Preferenceのkeysと、⌘+iで開くメニューは別のものみたい。
Preference編集する。
Ninety-Nine Scala Problems奮闘記4

# P05 Reverse a list.

再帰でリストを入れ替える問題。

だいぶ考え方が分かってきた。

```scala:myAnswer.scala
  def myAnswer[A] (ls:List[A]): List[A] = ls match {
    case h::Nil => h::Nil
    case h::tail => myAnswer(tail):+h
    case _ => throw new NoSuchElementException
  }
```

ただ、これだと行列の長さが0の時NoSuchElementExceptionのcaseが実行されてしまう。

それに模範解答よりもコードが冗長だった。

```scala:suggestedAnswer.scala
  def suggestedAnswer [A](ls: List[A]): List[A] = ls match {
    case Nil       => Nil
    case h :: tail => suggestedAnswer(tail) ::: List(h)
  }
```

これなら、Listのtailを取り続けて最終的にNilしか入っていないListが渡されたら再帰が折り返す。NilがListの最後に結合されても結果は変わらないし、これなら空のListに対しては空のListが返却され、美しい。

#P06 Find out whether a list is a palindrome.

解説いわく、「自分で実装するなら元のリストの前半分と反転したリストの前半分を比較すれば良いけど複雑になるから簡単な例だけ残しておくね」とのことで

```scala:suggestedAnswer.scala
  def isPalindrome[A](ls: List[A]): Boolean = ls == ls.reverse
```
親の親の親の...親からGetComponentしたい！！そんな拡張

```csharp

using UnityEngine;
using System.Collections;

public static class GameObjectExtensions
{
	public static T GetComponentInParents<T>(this Transform obj) where T : MonoBehaviour, new()
	{

		Transform parent = obj.transform.parent;
		while(parent != null)
		{
			T res = parent.GetComponent<T> ();
			if (res != null)
				return res;
			parent = parent.parent;
		}

		return null;
	}
}
```

無限に親を探し続けるので注意…
ムーブされた後のオブジェクトについて

こんにちは。この頃はじめじめして嫌な季節の訪れを感じますね。

今回は、ムーブ後のオブジェクトがどのような状態になるのか、あるいは、ムーブの処理を書くときにどのような状態を保証するべきか、ということを長々と書いていきたいと思います。
また、途中紹介する規格の文章はわたしの解釈で日本語訳したものであり(直訳ではありません)、正式な引用ではありません。引用元を同時に載せますので、原文を確認する場合はそちらを参照ください。

ムーブする、というのはその変数をもう使わないからムーブする、というのが基本的な考え方ではありますが、ムーブした後でも操作が加えられることはあります。例えば、デストラクタがそうですね。ムーブされた後のオブジェクトにもデストラクタは走ります。或いは、汎用的なswapを書こうとしたら、再度その変数へオブジェクトを割り当てることになるでしょう。
もう使わないからといっても、最低限の動作は保証することが望ましいのです。

ムーブ後の変数の状態について、規格では要求はありません。ただし、標準ライブラリに渡される場合はムーブされたされないに拘らずその要求を満たす必要があります。(N3337 17.6.3.1 Table 20 [NOTE])

それでは、結局わたしたちはどの程度の保証をムーブ後のオブジェクトにしたらよいのでしょうか。
標準ライブラリに定義されるクラスのムーブ後の状態は、有効だが未規定とされています。(一部例外としてより厳しい条件を持つ物もある)

標準ライブラリのクラス群が満たすべきムーブ後の保証なら、倣っておいて損はないんじゃないじゃないか、ということで、有効だが未規定という状態を見てみましょう。

オブジェクトの有効性が保証されていて、かつオブジェクトに対する操作が定義通り行われる、ということを除き一切の状態が保証されない状態。
例えば、std::vector\<int\>のxというオブジェクトが有効だが未規定の状態だとすると、x.empty()は無条件に呼び出すことができるし、もしx.emptyがfalseでなければx.front()を呼ぶこともできる。(N3337 17.3.26)

なるほどなるほど。
有効だが未規定の状態であればoperator=やassign()などは使えて然るべきですし、ムーブを利用したswapも安全に使えると考えてよいでしょう。デストラクタもちゃんと動くはずです。

余談ですが、ムーブ後のオブジェクトのデストラクタに関して、C++03とC++11の間に重大な互換性の問題があります。
C++03ではコピーが呼ばれていたが、C++11では暗黙的にムーブが呼ばれるような場面において、C++11で新たに生成される暗黙のムーブがメンバ変数を自動的に全てムーブしてしまい、ムーブを考慮しないC++03のデストラクタがムーブ後のメンバ変数を参照してしまう、という重大なものです。

この場合当該クラスのムーブ後のオブジェクトは有効だが未規定という状態を満たさないので注意してください。
またC++11でこのようなミスを起こすことを防ぐために、はデストラクタを書くときは必ずムーブやコピーの処理を宣言しましょう。(定義するか、default指定するか、delete指定するかしましょう)
ボタンのロングタップ対応UniRx版 v0.3 [パフォーマンスに難有り]

できること。
短いタップだったらShortTapを呼ぶ
IntervalAction秒長押しするとLongTapが呼ばれる。

ちょっとまだスマートじゃないのとこれだとﾁｮﾝｯってタップしただけでShortTapが呼ばれちゃうのでそこも何とかしたい。
あと長押ししていても指やカーソルが動きながらPressしてたらLongTapもShortTapも呼ばないようにしたい。
むずいぞ！

```csharp
using UnityEngine;
using System.Collections;
using System;
using UniRx;
using System.Collections.Generic;


[RequireComponent(typeof(UIButton))]
public class UIButtonLongTapComponent : ObservableMonoBehaviour
{
	
	[SerializeField]
	float intervalAction = 3.0f;
	public UIScrollView scroll = null;
	float firstTapTime = 0f;
	bool isHoldAction = true;
	// 押しっぱなし時に呼び出すAction
	public Action OnLongTap = null;
	public Action OnShortTap = null;
	
	Vector3 tapPosition = Vector3.zero;
	
	BoolReactiveProperty isPressing = new BoolReactiveProperty();
	bool IsPressing { get { return isPressing.Value; } set { isPressing.Value = value; } }
	
	void Start()
	{
		scroll = this.transform.GetComponentInParents<UIScrollView> ();
		IsPressing = false;
		
		var tapInStream = this.UpdateAsObservable().Select(_=>IsPressing).Where (_ => _);
		var tapOutStream = this.UpdateAsObservable().Select(_=>IsPressing).Where (_ => !_);
		var tapInOutStream = this.UpdateAsObservable ().SkipUntil (tapInStream).TakeUntil (tapOutStream).Repeat ();
		
		var moveStream = tapInOutStream
			.Select(x=>scroll.currentMomentum.magnitude)
				.Scan((sum,current)=>sum+current)
				// .Do(x=>Debug.Log("currentMomentum: "+x))
				.FirstOrDefault(x=>x>0.1f)
				.Select(_=> "Move");
		
		var longTapStream = 
			tapInOutStream.TakeUntil(moveStream).SelectMany(_ => Observable.Timer(TimeSpan.FromSeconds(intervalAction))).Select(_ => "LongTap");

		
		longTapStream.Subscribe (_ => IsPressing = false);
		moveStream.Subscribe (_ => IsPressing = false);

		tapInStream.TakeUntil(moveStream).Timestamp()
			.SelectMany(_ => tapOutStream.Timestamp(), (s, e) => (e.Timestamp - s.Timestamp).Seconds >= intervalAction)
				.Select(x => x ? "LongTap" : "ShortTap")
				.Merge(longTapStream)
				.FirstOrDefault()
				.RepeatUntilDestroy(gameObject)
				.Subscribe(x =>{
					Debug.Log(x);
					if (x == "LongTap")
						LongTap();
					if (x == "ShortTap")
						ShortTap();
				});
		
	}
	
	void OnPress (bool pressed)
	{
		IsPressing = pressed;
	}
	
	public void SetButtonAction(Action shortTap, Action longTap, bool isHoldLongTap) {
		isHoldAction = isHoldLongTap;
		OnLongTap = longTap;
		OnShortTap = shortTap;
	}
	
	public void CleanAction()
	{
		OnLongTap = null;
	}
	
	public void LongTap()
	{
		Debug.Log ("LongTap!!");
		if (OnLongTap != null)
			OnLongTap ();
	}
	public void ShortTap()
	{
		Debug.Log ("ShortTap!!");
		if (OnShortTap != null)
			OnShortTap ();
	}
	
}
```
Riot の微妙そうな点


* カスタムタグファイルでインデントが崩れるとカスタムタグファイルの parse に失敗する [#725](https://github.com/muut/riotjs/issues/725)
  * なぜかといえば、正規表現ベースの parser を使っており、難しいことはできない
  * [Syntax Checker](http://cognitom.github.io/riot-checker/) を開発中
* データバインディングの部分の parser も正規表現
  * [tmpl.js](https://github.com/muut/riotjs/blob/v2.0.15/lib/tmpl.js), [compiler.js](https://github.com/muut/riotjs/blob/v2.0.15/lib/compiler.js) を眺めてみて、大丈夫だ問題ないって自信をもって言える？
* 正規表現ベースなのはサイズを保つための design choice であり、完全な parse はあきらめているらしい。
* jshint などの lint がかけられない。油断していると簡単にグローバル空間に名前をリークしたり。。
* テストの仕組みが用意されていない
  * 複雑なロジックは Riot 外で書いてテストし、Riot は UI 部分にのみ利用するのが良さそう
CentOS6上のTomcatが1リクエストで受け取れるパラメータ数の上限

が、あるらしいです。ぶつかりました。

###症状
CentOS6.5+Tomcat6で動いてるアプリが謎のエラーで落ちていました。
ログを調べるとこんなエラーが

```catalina.out
java.lang.IllegalStateException: Parameter values exceeded allow maximum: 512
```

初めて見るエラーで、なんのこっちゃと思って調べてみたところ、どうやら現行のRedHat系OSに乗ってるTomcat6では
**受け取れるパラーメータ数の上限が512に設定されている**そうです。

何やらセキュリティ上の理由らしいですが、Javaはよく知らないので詳細は割愛。




###対処法
そもそもそんなにパラメータを投げる実装をしなければいいんですが、既存のアプリはしょうがないのでTomcatの設定を変更します。

/etc/tomcat6/tomcat6.confに以下の1行を追記。パラメータ数の上限を2048個にしてみます。

```/etc/tomcat6/tomcat6.conf
JAVA_OPTS="$JAVA_OPTS -Dorg.apache.tomcat.util.http.Parameters.MAX_COUNT=2048"
```
tomcatっていうか、javaのvmに渡すオプションなんですね。

続いてtomcatを再起動

```
sudo /etc/rc.d/init.d/tomcat6 stop
sudo /etc/rc.d/init.d/tomcat6 start
```

とりあえずこれでエラーが出なくなって一安心。

512個ってなかなか多いですけど、ページの作り方によっては超えちゃう可能性もある微妙な数字ですね。実際超えちゃったし。
今後はCentOS上に環境構築する時はこの設定も忘れないようにしないとですね。
CentOS7も同じなのかな？


###参考にさせていただいたページ
[http://stackoverflow.com/questions/12277231/maximum-number-of-parameter-passed-in-a-post]()
[http://d.hatena.ne.jp/stealthinu/20140916/p1]()
CentOS 6.6にMariaDB10.0.19を入れて起動確認まで



```bash:bash
sudo vim /etc/yum.repos.d/MariaDB.repo
sudo yum -y install  mariadb mariadb-server
sudo  /etc/init.d/mysql start
mysql -u root

```

mysqlに入って下記の表示になっていればインストールが成功している。
![スクリーンショット 2015-05-19 22.08.52.png](https://qiita-image-store.s3.amazonaws.com/0/5472/836fa971-8e47-d558-ca23-a51d4480de37.png "スクリーンショット 2015-05-19 22.08.52.png")

OSごとのリポジトリの確認は下記から確認できる
https://downloads.mariadb.org/mariadb/repositories/#mirror=yamagata-university&distro=CentOS&distro_release=centos6-amd64--centos6&version=10.0
VMware vSphere で物理アダプタの無い仮想スイッチを作成する

# 背景
この間、サーバのNICが壊れました。NICは2つあって冗長構成を取っているから大丈夫だろうと思ったら、NICとマザーボードをつなぐ部分が壊れたらしく、要するにNICが2つとも同時に壊れたのと同じ状況になりました。サーバは冗長構成を取っていましたが、このときうまくフェイルオーバーしませんでした。

原因はNIC以外は正常に動いていたことによるスプリット・ブレイン問題で、要するにノードの生死判定の設計が甘かったということです。

なぜ設計・試験段階で判明しなかったかというと、NICの同時故障（あるいはケーブルの断線、HUBの故障）を想定した試験をとある理由で実施できなかったためでした。

それで設定は修正したのですが、同じ事象を想定した物理的な試験（ケーブルを引っこ抜く等）は今回もどうやら出来そうにありません。さらに手持ちの検証環境も1台だけで物理的なクラスタ構成を組めません。

じゃあ仮想マシン上で似たようなことをしようというのが本題です。

# 実現方法
今回のようにNICが壊れた場合、 VMware vSphere では同じホストの同じ仮想スイッチに接続されている仮想マシン同士であれば通信できますが、外部ネットワークからは孤立します。

つまり物理アダプタが紐付いていない仮想スイッチに仮想マシンを接続すれば、同じように外部ネットワークから孤立した、内部で折り返し通信が可能な状態が再現できます。

ただし、それが Management Network がつながっている仮想スイッチだと、物理アダプタを削除してしまうと元に戻すには物理サーバに直接つなげた画面・キーボードが必要になります。そうなると色々面倒なので、新しく物理アダプタが付いていない仮想スイッチを作り、そこに仮想マシンの接続を切り替えようと思います。

今回は VMware vSpehre Client を使ってこれを行います。

## 手順 1. ホストの構成タブからネットワークを選択

![ss1.png](https://qiita-image-store.s3.amazonaws.com/0/58889/d6ebbec8-fb9c-ab70-995f-fdcdc499f957.png)

## 手順 2. 「ネットワークの追加…」から仮想マシンネットワークを追加

![ss2.PNG](https://qiita-image-store.s3.amazonaws.com/0/58889/3abec5df-45d8-f6a4-eded-717e6859a2ee.png)
蛍光ペンでマークした部分をクリック

![ss3.png](https://qiita-image-store.s3.amazonaws.com/0/58889/da7ede08-6947-b4df-e2e2-89c211597205.png)
仮想マシンを選択して次へ

![ss4.png](https://qiita-image-store.s3.amazonaws.com/0/58889/aea15d4a-7767-0eb5-9ef0-5a62aa9188df.png)
vSphere 標準スイッチの作成を選択して次へ

![ss5.png](https://qiita-image-store.s3.amazonaws.com/0/58889/1e98347d-cd9f-0e85-d543-8f23f18d33dc.png)
ネットワークラベル（任意）を入力して次へ

![ss6.png](https://qiita-image-store.s3.amazonaws.com/0/58889/c37f7730-cbe4-b938-d310-a39fca6da17c.png)
終了

![ss7.png](https://qiita-image-store.s3.amazonaws.com/0/58889/69288638-bc9a-e594-bfd7-1eea7cdb89ba.png)
アダプタのない仮想スイッチが作成された

## 手順 3. 仮想マシンのネットワーク接続を切り替える（マシン動作中でも実施可能）

![ss8.png](https://qiita-image-store.s3.amazonaws.com/0/58889/9dd99daa-9796-e18d-5c34-15479b85cf89.png)
仮想マシンの設定の編集から、ネットワークアダプタのネットワークラベルを先ほど作成した仮想スイッチに切り替え

# おわり
とりあえず簡単にできそうなこの方法で試してみます。
行数、列数が不均一なデータをRで読み込む


Rはテーブルなどの行列になっている情報を読み込むことに長けたソフトウェアでread.table, read.delimを用いてテキストデータを読み込むことが常ですが、異なる行数、列数を持つデータを扱うときはreadLinesが使えます。[こちらの記事](http://sessan.hatenablog.com/entry/2013/08/06/222927)を参考にしました。読み込んだ後のデータはリスト化しています。

testデータは、[GSEA](http://www.broadinstitute.org/gsea/msigdb/index.jsp)からgene setのsymbolリストを取得しています。

```　　　　

rl <- readLines(con="./c3.all.v5.0.symbols.gmt.txt")　#readlineによる行データの読み込み
gs_list <- list()　　#list準備　

for(i in 1:length(rl)){
	dl <- unlist(strsplit(rl[i], "\t"))　#strsplitでdelimitorとして\tで分割
	gs_list[[dl[1]]] <- dl[3:length(rl)]　#dl[1]とdl[2]には、motif名、urlなどの情報があるので除いておく
}

#1番のリストから遺伝子名を取り出す。
na.omit(unlist(gs_list[[1]]))
```

リストの出力結果　　

```
==========================出力=======================================
  [1] "MEF2C"     "ATP1B1"    "RORA"      "CITED2"    "APP"       "MAP3K4"   
  [7] "ATP2B4"    "GRIN2B"    "PHTF1"     "TLK1"      "PHOX2B"    "MYH2"     
 [13] "SKP2"      "ZHX3"      "TGIF1"     "LUC7L3"    "PPARGC1A"  "TSC22D4"  
 [19] "SPAG9"     "MAPK3"     "PDGFRB"    "EFNA5"     "RAB10"     "NEK6"     
 [25] "LOC148872" "EPHB2"     "TBC1D8B"   "DMD"       "EGFLAM"    "DYNC1I2"  
 [31] "MAML3"     "TRAM1"     "CDC42EP3"  "OLFM1"     "CDC42EP5"  "KLF12"    
 [37] "RSPO2"     "KLF14"     "NTRK3"     "EPHA7"     "SEMA6C"    "SFRP2"    
==========================出力=======================================

```

readLines、知らずに適宜shellでパースしてましたが、簡単にできますね。
Azure 各種機能とPower BIを使って、IoTデータのリアルタイム可視化をやってみた

Azure StreamAnalysisからPower BI Dashboard(まだ今はPreview)にデータを出力できるようになり、
Azureでリアルタイム可視化する機能群がそろったとのことで、さっそくやってみました。

どんなことかっていうと
①多数のIoT機器が生成したデータを
②リアルタイムに更新されるグラフで可視化する

航空管制塔とか鉄道の管制室が、リアルタイムに飛行機とか電車のデータを見てるよね？
あんな感じのリアルタイムの可視化が
数時間で低難易度でできるようになったことが新しい。
運用コストもめちゃくちゃ安し。
クラウドってすごいねーっていつも思います。

今回初めてやってみましたが、5時間くらいで一通りの流れが作れました。
たぶん２，３回やれば、1時間以内で作れるようになりそうな気がします。

●アーキテクチャはこんな感じ

①IoT機器(たとえばセンサーにBluetooth接続したWindowsタブレット)の.NETアプリ(コーディングする)
　|
(REST APIにJsonでPost)
　↓
②Azure Service Bus EventHub （これは大量データを受けられるキュー)
　|
　(接続してくれるAdapterが用意されている)
　↓　
③Azure StreamAnalysis （これがキューのデータを加工して、BIツールに渡す)
　|
　(接続してくれるAdapterが用意されてい
る)
　↓　
④PowerBI Dashboard (これはBIツール。StreamAnalysisからデータくるとPush型の更新がかかる)


●実装後

①.NETアプリでこんな感じにJSONをPOST
※今回WIndows端末でやりましたが、次はRaspberry PiとかIoT用機器でやりたい(ラズパイ用のWindows10も使えるようになったし。） 
![sendEventHub.jpg](https://qiita-image-store.s3.amazonaws.com/0/74428/967d90b7-3736-5742-650f-a38915ab745e.jpeg)

②するとこんな感じにグラフに反映される
![powerbi.jpg](https://qiita-image-store.s3.amazonaws.com/0/74428/7a9ecec1-e692-fc08-16fb-7fbdb2a33386.jpeg)

Webだけどリフレッシュせずとも、グラフにピョコってデータが増えていきます。
タイムラグは10秒ないくらいかなー
これくらいなら多くの業務で許される範囲じゃないかな。



データの加工について
今回は.NETアプリからのデータを、そのまま加工せずPowerBIに送ったけど、
10分単位とかでサマリーしたいならStreamAnalysisで加工できる
StreamAnalysisには以下のようにSQLっぽいコードがかけて、
Group BYで「10秒間のデータをグループバイ」って時間を意識したSQLがかけるのが、
StreamDataっぽくてなんだか新鮮です

ただ、受け取ったデータをPowerBIに流すだけなら以下のようなSLQを書きます
```lang:Azure StreamAnalysis Query
SELECT
    DeviceId,SendTime,Temperature,EventProcessedUtcTime,EventEnqueuedUtcTime,PartitionId
INTO
    powerBI
FROM
    eventHub
```
[Azure Stream Analytics 開発者ガイド](http://azure.microsoft.com/ja-jp/documentation/articles/stream-analytics-developer-guide/)



今日は疲れたのでここまでで、また今度、コンポーネント別の説明を書きます。
003 - Blocklyを使ったオリジナルVisual Programming Editorを作ってみる


## カスタムブロックを作ってみる
標準で用意されているブロック以外を作りたい場合、カスタムブロックを作ることになります。例えば矩形を描画するような処理を実行するブロックなどです。

## 定義する手段
カスタムブロックを定義する方法は３つあるようです。

1. [Block Factoryを利用して定義する](https://developers.google.com/blockly/custom-blocks/block-factory)
2. [BlocklyのAPIを手書きして定義する](https://developers.google.com/blockly/custom-blocks/defining-blocks)
3. [Mutatorsで動的に作る](https://developers.google.com/blockly/custom-blocks/mutators)

### Block Factory
Block FactoryはBlocklyに同梱されるツールです。Blocklyの以下のパスにあります。

```
/blockly/demos/blockfactory/index.html
```

このindex.htmlを開くとツールが起動します。

### APIを手書きする
JavaScriptで手書きしてブロックを定義します。よほどの事がない限りはBlock Factoryで事足りるようなので、特殊な場合の実装手段のようです。

### Mutators
こちらは高等な実装手段なようです。標準Blockで歯車の付いているブロック(ifブロックとか)のようなものを定義する場合はこちらを使うようです。ユーザーの歯車メニューでの選択によってブロックの形状が変化するやつですね。

## Block Factoryで作ってみる
ひとまずはツールを使ってやってみます。ページに表示されているテキストの色を変更するブロックを作ってみます。公式のドキュメントには動画による解説しかないのが辛い…。字幕を追いながらまずは色を指定するColorブロックを作ってみます。

![colorブロック](http://f.st-hatena.com/images/fotolife/h/heyhachi/20150519/20150519234559.png "colorブロック")

こんな感じです。そして、Language CodeとGenerator Stubに表示されている内容をファイルに保存します。

```text
/blockly/blocks/color_block.js
/blockly/generators/javascript/color_block.js
```


次は文字の色を変更するブロックを作ります。

![settingブロック](http://img.f.hatena.ne.jp/images/fotolife/h/heyhachi/20150519/20150519234600.png "settingブロック")

こんな感じでしょうか。先ほどと同じくコードをファイルに保存します。


```text
/blockly/blocks/setting_block.js
/blockly/generators/javascript/setting_block.js
```

## とりあえず表示してみる
blockly/build.pyを実行します。ビルドが正常に完了したら、自分のアプリケーションのindex.html(/index.html)のtoolboxに今作成したブロックを登録してみます。

```xml
<category name="カスタムブロック">
  <block type="color"></block>
  <block type="foreground_setting"></block>
</category>
```

index.htmlを開くとツールボックス内に「カスタムブロック」というカテゴリが作成され、先ほど作ったブロックが現れているはずです。もちろんワークスペースへ設置も可能です。まだ、ジェネレータを作成していないのでコードは生成されませんが、カスタムブロックの作成はできました。

## まとめ
ブロックの作成は基本的にBlock Factoryで良さそうです。次回は各ブロックのジェネレータを実装したいと思います。
raspberry Pi の CLI 基礎

# 起動関連

## 再起動

```lang:command
$ sudo shutdown -r now
```

## 終了

```lang:command
$ sudo shutdown -h now
```

### 引用
[【 shutdown 】 システムをシャットダウン・再起動する](http://itpro.nikkeibp.co.jp/article/COLUMN/20060227/230883/)

# 便利なので入れたソフトなど
【CakePHP】CakeRequest

コントローラーで$this->requestで扱うことができるCakeRequestを通してリクエスト情報にアクセスすることができる。CakeRequestのメソッドをまとめる。

##data()
POSTデータを取得する。

```php
$id = $this->request->data('id');
//=> POSTデータidの値
```

##get()
クエリストリングの値を取得する。

```php
$page = $this->request->query('page');
//=> クエリストリングpageの値
```

##is()
リクエストタイプを判別する。

例）リクエストがajaxの場合に処理を行う。

```php
if($this->request->is('ajax')){
  //ajaxの場合の処理
}
```

| タイプ名 | 説明 | 
|------|-----| 
|get  |GETメソッドか判別する   | 
|post |POSTメソッドか判別する   | 
|ajax |ajaxか判別する   | 


ちなみに、ajaxの値はHTTPヘッダのHTTP_X_REQUESTED_WITHにXMLHttpRequestが含まれているかで判別している。

##referer()
リファラを取得する。

例）リファラを取得して、ポスト元のページを再描画する。

```php
$this->redirect($this->request->referer();
```

##clientIp()
クライアント側のIPアドレスを取得する。

```php
$ip = $this->request->clientIp();
```

デフォルトでは、env('HTTP_CLIENT_IP')を、存在しない場合は、env('REMOTE_ADDR')を返却する。
パラメータにfalseを設定すると、env('HTTP_X_FORWARDED_FOR')を返却する。

##header()
HTTPヘッダを取得できる。
HTTP_*の*部分をパラメータで渡す。

例）HTTP_User-Agentを取得する。

```php
$user_agent = $this->request->header('User-Agent');
```

##here()
http://ドメイン/ルート/コントローラ名/アクション名
上記のルート以下を取得する。

例）アクセスログ出力のためアクセス先を取得する。

```php
$path = $this->request->here;
```

プロパティのhereはクエリストリングを含めないが、here()はクエリストリングを含む。
CakePHP 3.xでカスタムバリデーション追加（例:画像幅チェック）


## カスタムバリデーションクラス作成

src/ModelにValidationフォルダを作成し、その中にCustomValidation.phpを作ります。

```php:src/Model/Validation/CustomValidation.php
<?php
namespace App\Model\Validation;

use Cake\Validation\Validation;

class CustomValidation extends Validation
{
    public static function imageSize($check, $width, $height)
    {
        $size = getimagesize($check['tmp_name']);
        return ($size[0] == $width) && ($size[1] == $height);
    }
}
```

 * メソッドはpublic staticにします

## $validatorに定義

先ほどのメソッドを使うTableを編集します。

```php
   public function validationDefault(Validator $validator)
    {
        $validator->provider('custom', 'App\Model\Validation\CustomValidation');
        $validator
            ->allowEmpty('thumbnail', 'update')
            ->add('thumbnail', [
                'uploadedFile' => [
                    'rule' => ['uploadedFile', ['types' => ['image/jpeg'], 'maxSize' => '16MB']],
                    'last' => true,
                    'message' => 'JPEG file is required (max size is 16MB).'
                ],
                'imageSize' => [
                    'rule' => ['imageSize', 100, 200],
                    'provider' => 'custom',
                    'message' => '100x200 JPEG file is required.']
            ]);
        return $validator;
    }
```

* allowEmpty('thumbnail', 'update')で、新規追加のみ必須項目としています
* $validator->providerでカスタムクラスを指定します
* 上記サンプルでは先にファイルサイズ及びMime-Typeのチェックをし、image/jpegでなければ'last'=>trueによりチェックが止められます
* カスタムメソッドを使う際、忘れず'provider' => 'custom'の指定を入れること
iOS Safariで全体のscrollイベント取得

モバイルサイトで無限スクロールを取り入れようとしてJavaScriptで実装してみた…のですが、AndroidはいいとしてiOSですんなり動かなくなってしまいました。調査して回避策も見つけたので、それを含めて書き進めていきます。

# 素直にできなくて
無限スクロール実装というのは、分解すれば3要素から成っています。

1. スクロール中にブラウザの高さをチェックする
2. 適切な高さに来ていれば次のコンテンツを読み始める
3. 読み込んだコンテンツを末尾に追加

ということですが、iOSで素直に実装してみると、ブラウザの末端に当たってから読み込みを開始する、なんていう現象が多発してしまいました。調べてみると、iOSのSafariでは、**ブラウザ全体のスクロール中にJavaScriptが止まってしまう**らしく、そのままではうまくいかなさそうな感じでした。

# ライブラリはあるけれど
[他のQiita記事](http://qiita.com/masuidrive/items/daa29d49b00b82ed2239)でも紹介されていた[iScroll](http://iscrolljs.com/)というライブラリがあるとのことだったので、試してみることにしました。このライブラリ、動作原理としては

1. すべてのスクロールをJavaScriptで乗っ取って、ブラウザ側には伝えない。
2. スクロール量を自前で計算して、自前で表示を動かす

というようなものです。使ってみると…**かなり重くて**、スクロール感はネイティブのものに対して大きく見劣りするものでした。ブラウザ内アプリのような感じで短いページなら実用できるのかもしれませんが、無限スクロールのような長いページに取り入れると、ページ全体の操作が重すぎて操作感が台無しとなってしまいました。

# 探し求めれば道が開けた
さらに調べてみると、「ページ全体のスクロールではJavaScriptが止まるけど、ページの一部のスクロールなら問題なく動作する」という情報が得られました。そこで、

1. ブラウザ全体に広がるような`<div>`を作る
2. `overflow-y:auto;-webkit-overflow-scrolling:touch`というようなCSSをかけて、慣性スクロールするようにする
3. コンテンツ全体をこの`<div>`の中に移動させる
4. ブラウザ全体がスクロールしないように、CSSやJavaScriptで調整する
5. `scroll`イベントはこの`<div>`へ割り当てる

というようにすることで、ブラウザネイティブなスクロールを行いつつ、JavaScriptイベントも発生する環境を作ることができました。
昔のUNIX使いがWindows用キーボードをMacで使うときの便利設定

Windows用キーボード[Realforce91](http://www.topre.co.jp/products/elec/keyboards/)をMac miniにつなげた際に設定して便利だったものをまとめてみました。
Mac用の良いキーボードが世の中にあれば、こんな苦労もしないですむんですけどねー。


# 「Caps Lock」を「⌘Command」に入れ替え
標準の設定から行います。真のUNIX使いであれば「⌘Command」ではなく「^Control」を割り当てるべきだと思いますが。。。

1. `設定` > `キーボード` > `装飾キー`を開く
2. Caps Lockキーに`⌘Command`を割り当てます

![スクリーンショット_2015-05-19_16_06_33.png](https://qiita-image-store.s3.amazonaws.com/0/32789/99f0e19e-09df-0b5a-ae5c-9e1743c9ed8f.png)


# 「E/J（半角/全角）」を「Esc」に入れ替え
Escは1の横にないと落ち着かないのでKarabinerを使って設定します。

1. [Kanabiner](https://pqrs.org/osx/karabiner/index.html.ja)をインストール
2. 「Change Backquote」から`Backquote to Escape`にチェックを入れる

![スクリーンショット_2015-05-19_16_18_25.png](https://qiita-image-store.s3.amazonaws.com/0/32789/3c6efed1-6bbb-2718-43de-c54b9d7de78b.png)


# 「無変換」を「英数」、「変換」を「かな」に入れ替え
IMEのON/OFFをMac純正キーボードと同様にスペースキーの両横でやりたいでのSeilを使って設定します。

1. [Seil](https://pqrs.org/osx/karabiner/seil.html.ja)をインストール
2. 「For Japanese」から下記２つにチェックを入れる
    - `Enable NFER Key on PC keyboard`
    - `Enable XFER Key on PC keyboard`

![スクリーンショット_2015-05-19_16_24_20.png](https://qiita-image-store.s3.amazonaws.com/0/32789/f05a4836-462a-2e3b-c44d-e81e5284bccf.png)


# ターミナルを使う時だけ「A」の横を「^Control」に変更

Karabinerでは特定アプリのときだけキーバインドを自動的に切り替えることができます。この機能を使って、Terminalを使う時だけControlとCommandを入れ替え、「A」の左がControlとなるようにします。

- Karabinerを開き、「Misc&Uninstall」をクリック
![スクリーンショット 2015-06-17 14.38.15.png](https://qiita-image-store.s3.amazonaws.com/0/32789/187e94db-45f8-d1d3-181c-2363b6a298ff.png)

- 「Open private.xml」をクリック
![スクリーンショット_2015-06-17_14_38_26.png](https://qiita-image-store.s3.amazonaws.com/0/32789/2efc939a-734c-0d66-627a-0979fc944847.png)

- private.xmlを編集する
```xml
<?xml version="1.0"?>
<root>
  <appdef>
    <appname>TERMINAL</appname>
    <equal>com.apple.Terminal</equal>
  </appdef>
  <item>
    <name>Command_L to Control_L (TERMINAL ONLY)</name>
    <only>TERMINAL</only>
    <identifier>remap.app_term_commandL2controlL2</identifier>
    <autogen>--KeyToKey-- KeyCode::COMMAND_L, KeyCode::CONTROL_L</autogen>
  </item>
  <item>
    <name>Control_L to Command_L (TERMINAL ONLY)</name>
    <only>TERMINAL</only>
    <identifier>remap.app_term_contolL2commandL2</identifier>
    <autogen>--KeyToKey-- KeyCode::CONTROL_L, KeyCode::COMMAND_L</autogen>
  </item>
</root>
```

- 「Change Key」タブをクリックし、「Reload XML」をクリック
![スクリーンショット_2015-06-17_14_38_42.png](https://qiita-image-store.s3.amazonaws.com/0/32789/0b947645-7a68-c5ca-473e-50b51e1e31c6.png)

- 3のprivate.xmlに定義した下記の設定にチェックを入れ、有効にします
  - `Command_L to Control_L (TERMINAL ONLY)`
  - `Control_L to Command_L (TERMINAL ONLY)`

![スクリーンショット 2015-06-17 14.38.58.png](https://qiita-image-store.s3.amazonaws.com/0/32789/06f4907d-5f55-6a3b-d68c-532b77f979ee.png)


# おまけ

## アプリケーションの切り替えをウィンドウ単位で設定できるようにする
WindowsではAlt+Tabでウィンドウ単位でアプリケーションの切り替えができますが、Macのデフォルトショートカット⌘Command+Tabではアプリケーション単位での切り替えになります。

Excelなどを複数ウィンドウで開いている時に、ウィンドウ単位で切り替えたらたらなーと思うことがよくありますが、HyperSwitchを入れるとショートカットキーでウィンドウ単位での切り替えが可能になります。

[Macアプリ「HyperSwitch」ウインドウ単位で切り替え](http://pc-karuma.net/mac-app-hyperswitch/)
[Macに入れた！ウインドウごとにアプリを切り替えるHyperSwitch](http://xenontenter.com/hyperswitch/)