OmniAICreator/Qiita-1.07M huggingface dataset:
NSURL で file URL にパラメータを付加する

`+[NSURL fileURLWithPath:]` は、 `+[NSURL URLWithString:]` と違って path に含まれる URL 特殊文字をエスケープする（`?`→`%3F`など）。またそれが返す NSURL オブジェクトは `-isFileURL` が真になっていて、 `-URLByAppendingPathComponent:` などの引数も同様にエスケープする。File URL にパラメータ文字列（例：`?key=value`）を含めるには、次ように `+[NSURL URLWithString:relativeToURL:]` を使う：

```objc:FileURLWithParam.m
// こうする
NSURL *fileURL = [NSURL fileURLWithPath:path];
NSURL *URLWithParam = [NSURL URLWithString:@"?key=value" relativeToURL:fileURL];

// これはだめ
// path に `?` や `#` が含まれている場合、それらはエスケープされるべきだが、
// +[NSURL URLWithString:] はエスケープしてくれない
NSURL *URLWithParam = [NSURL URLWithString:[path stringByAppendingString:@"?key=value"]];

// これもだめ
// `?key=value` の `?` までエスケープされる
NSURL *URLWithParam = [NSURL fileURLWithPath:[path stringByAppendingString:@"?key=value"]];
```

正確には、この手順で得られる `URLWithParam` は file URL ではなくなる（`-isFileURL` が偽になる）ので気をつけること。

また、 `-URLWithString:relativeToURL:` の string 引数内の URL 特殊文字は一切エスケープされないので、必要ならあらかじめエスケープすること。

# 蛇足：なぜこうしたかったか

WebView で HTML を表示するとき、ローカルの JS や CSS を _キャッシュを回避して_ 参照したかったから。

WebView に表示する HTML からは `file://` スキームでローカルファイルを参照できるが、キャッシュがあるためファイルを書き換えて WebView をリロードしても古い内容が読み込まれてしまう。キャッシュをクリアしてもいいが、リモートから取得した画像などのキャッシュはできれば保持しておきたい。

そこで、ローカルファイルの URL のパラメータにタイムスタンプを追加し、キャッシュが効かないようにしたという次第。

```objc
- (void)reloadWebView {
  // ローカルの CSS の URL にタイムスタンプを追加
  NSURL *cssURL = [NSURL fileURLWithPath:@"/path/to/local.css"];
  NSString *timestamp = [NSString stringWithFormat:@"?timestamp=%lf", [[NSDate date] timeIntervalSince1970]];
  cssURL = [NSURL URLWithString:timestamp relativeToURL:cssURL];

  // WebView に HTML を表示
  NSString *HTMLFormat = (
    @"<html><head><link type='text/stylesheet' href='%@'></head>"
    @"<body>%@</body></html>"
  );
  NSString *HTML = [NSString stringWithFormat:contentFormat, [cssURL absoluteString], self.content];
  [self.webView.mainFrame loadHTMLString:HTML baseURL:self.baseURL];
}
```
CocoaPodsからKIFを導入する

※CocoaPodsのインストール〜 pod setup まで完了している前提です。
インストール方法はこちら↓が参考になります。

[Objective-C - CocoaPodsでPodの利用＆作成のメモ - Qiita [キータ]](http://qiita.com/makoto_kw/items/edf758a67bd4c2ba5b7a )

## CocoaPodsを使ったKIFの導入方法

* メインのTargetをDuplicateします。

![スクリーンショット 2013-09-18 19.23.12.png](https://qiita-image-store.s3.amazonaws.com/0/2082/36bea649-6ff4-6180-4380-32809c56754e.png)


* 新しいTargetに任意の名前をつけます。XXXIntegrationTestsのような名前がいいかも。

* .xcodeprojと同じディレクトリにPodfileを作成します。

```rb
# Podfile
target :XXXIntegrationTests do
    pod 'KIF'
end
```

* Podfileのあるディレクトリから下記のコマンドを打ちます。

```bash
$ pod install
```

* Product Nameを変更します。

 ![スクリーンショット 2013-09-18 19.26.17.png](https://qiita-image-store.s3.amazonaws.com/0/2082/613ecf09-5e78-603f-ea27-c014d4e25d65.png)


あとはReadMeのExample以降を参考にテストを書いていきます
https://github.com/kif-framework/KIF
Railsで規約に沿わない古いデータを扱う

### 背景

railsでは`rails g scaffold`などでModelを作成すれば、
自動的にidが付与されます。
しかもprimary_keyでauto_incrementでかつindexも張られるので、
普段はidを気にする必要はありません。

railsを使い、自分でデータ構造を決める場合はrailsの流儀に則った方が楽で、問題も起こりません。
しかし、古いデータを活用した場合、流儀にそぐわない事もあり得ます。

今回は規約に沿わない場合の対応について大きく分けて2つの場合について説明します。
なお環境は以下の物で検証しています。
* ruby 2.0.0p247 (2013-06-27 revision 41674) [x86_64-darwin12.4.0]
* Rails 4.0.0
* composite_primary_keys (6.0.0)

### 主キーがidではない

主キーがidではない場合として、
具体的に商品（Item）テーブルの主キーが文字列である場合を考えます。

主キーがidで無い場合のポイントは
`create_tabel`の`id: false`です。
これによってidが自動生成されることはなくなります。
他のオプションで`primary_key`と言う物もありますが、
これはinteger型で名前をidから変更するだけの物です。

下記の例では`null: false`とする事でnot nullな制約を追加し、
`add_index :items, :code, unique: true`でユニーク制約を定義しています。

#### Migrationファイル

```ruby
class CreateItems < ActiveRecord::Migration

  def change
    create_table :items, id: false do |t|
      # 商品コード
      t.string :code, limit: 8, null: false
      # 商品名
      t.string :name
    end
    add_index :items, :code, unique: true
  end

end
```

モデル側には`self.primary_key`で主キーを設定します。
これによって`find`メソッドで主キーによる取得が可能になります。

#### Item Model

```ruby
class Item < ActiveRecord::Base
  # 主キー設定
  self.primary_key = :code
end
```

### 複合主キーを扱いたい

次は複合主キーを扱う場合についてです。
具体的に先ほど使った商品（Item）について、
各商品に任意のタグ（Tag）がついているとします。
タグは商品コード（item_code）とタグコード（code）の複合主キーを持っています。

railsで複合主キーを扱う場合、
[composite_primary_keys](https://github.com/composite-primary-keys/composite_primary_keys)のgemを使用します。
composite_primary_keysの準備として`Gemfile`に`gem 'composite_primary_keys'`を追加し`bundle install`します。

Migrationファイルのポイントは、
`:item_code`と`:code`の組み合わせがユニークである制約の定義です。
複合主キーがユニークである制約は`add_index :tags, [:item_code, :code], unique: true`だけでも十分です。
複合主キーが2つ3つと長くなる場合、インデックス名が長すぎてエラーが発生する事もあるので、
その場合は`name`でインデックス名を指定してあげましょう。

#### Migrationファイル

```ruby
class CreateTags < ActiveRecord::Migration
  def change
    create_table :tags, id: false do |t|
      # 商品コード
      t.string :item_code, limit: 8
      # タグコード
      t.string :code, limit: 8
      # タグ名称
      t.string :name
    end
    add_index :tags, [:item_code, :code], unique: true, name: 'composite_index'
  end
end
```

モデルに関しては、
先ほどは`self.primary_key`を使いましたが、
複合主キーの場合は`self.primary_keys`を使います。
これによって`Tag.find 'item_code', 'code'`と、
findメソッドで複合主キーを扱うことが可能になります。

また、`foreign_key`によって、どのカラムが外部キーなのかを指定することで、
関連を定義することが可能です。

#### Tag Model

```ruby
class Tag < ActiveRecord::Base
  # 主キー設定
  self.primary_keys = :item_code, :code

  # 商品との関連
  belongs_to :item, foreign_key: :item_code
end
```

#### Item Model

```ruby
class Item < ActiveRecord::Base
  # 主キー設定
  self.primary_key = :code

  # タグとの関連
  has_many :tags, foreign_key: :item_code
end
```

### 問題

composite_primary_keysによって複合主キーを取り扱うことが出来るようになりました。
しかし、少し問題が発生する場合もあります。
それはModelに対して`to_json`を呼び出した場合などで、以下のエラーが発生します。

```
TypeError: ["item_code", "code"] is not a symbol
```

根本では`serializable_hash`を呼び出すところでのエラーなので、
モデルでserializable_hashをオーバーライドする事で解決します。

```ruby
def serializable_hash(options={})
  options = {
    :only => [:item_code, :code, :name_code]
  }.update(options)
  super(options)
end
```
Node.jsでCSVをパースする

日本語環境で作成されたcsvはシフトJISなので，Node.jsで扱うにはUTF-8に変換する必要がある．今回使うモジュールはnode-csvとiconvで，内部はstreamが実装されているから，素直にこれを使う．

```
npm install csv iconv
```

```js
var fs = require('fs')
  , csv = require('csv')
  , Iconv = require('iconv').Iconv;

var iconv = new Iconv('SHIFT_JIS', 'UTF-8//TRANSLIT//IGNORE');

csv()
  .from.stream(fs.createReadStream('sample.csv').pipe(iconv))
  .on('record', function(row, index) {
    console.log(index, row.join(','));
  });
```

http://qiita.com/toshirot/items/b8137a66ca35e1b6a729 ではチャイルドプロセスでiconvを呼び出していた．これを参考にパースした結果を変換しようとしたが，pipeを使えばスッキリと記述できた．
GPUImageViewのコンテンツのフィット方法を変更する


GPUImageを使ってカメラアプリなんかを作っている時の話。
GPUImageViewはデフォルトではコンテンツを自身のフレーム内にアスペクトを維持した状態で全体を表示するようになっている。
そのため、表示するコンテンツ(GPUImageStillCameraとか)の画角とGPUImageViewの画角が違うと、上下or左右にviewの背景色が見えてしまう。
それを、view全体を埋めるように表示するには、GPUImageViewのfillModeを設定してやるとよい。

```
GPUImageView *imageView = [[GPUImageView alloc] initWithFrame:self.frame];
gpuimageView.fillMode = kGPUImageFillModePreserveAspectRatioAndFill;
```
GPUImageView.fillModeに設定できる値は以下の通り。

```GPUImageView.fillModeに設定できる値
typedef enum {
    kGPUImageFillModeStretch, 					// アスペクト比を変更して、画像の高さと幅をviewに合わせる
    kGPUImageFillModePreserveAspectRatio,		//アスペクト比を保持して、 画像をviewの中に収める。隙間はviewの背景色で埋められる
    kGPUImageFillModePreserveAspectRatioAndFill	//アスペクト比を保持して、隙間なくviewを埋めるようにスケールを調整する 
} GPUImageFillModeType; 
```


ちなみに、普通のUIViewの場合は、UIViewのcontentModeを設定してやればいい。

```
UIImageView *imageView = [[UIImageView alloc] initWithFrame:self.frame];
imageView. contentMode = kGPUImageFillModePreserveAspectRatioAndFill;
```

``` UIView.contentModeに設定できる値
typedef NS_ENUM(NSInteger, UIViewContentMode) {
    UIViewContentModeScaleToFill,
    UIViewContentModeScaleAspectFit,      //アスペクト比を保持して、 画像をviewの中に収める。余白が透明になるのが、GPUImageFillModeTypeと違うところ
    UIViewContentModeScaleAspectFill,     //アスペクト比を保持して、隙間なくviewを埋めるようにコンテンツのスケールを調整する
    UIViewContentModeRedraw,              //boundsが変更されるたびに再描画する
    UIViewContentModeCenter,              //コンテンツのサイズは保持したまま、位置が調整される
    UIViewContentModeTop,
    UIViewContentModeBottom,
    UIViewContentModeLeft,
    UIViewContentModeRight,
    UIViewContentModeTopLeft,
    UIViewContentModeTopRight,
    UIViewContentModeBottomLeft,
    UIViewContentModeBottomRight,
};
```
GPUImageの時もこれで出来ると思ってたらダメだったという話。
AndroidSDKをrev22.2へアップデートしたらAndroid新規プロジェクトが作れなくなった

新規プロジェクト作ろうと思ったら
=====

![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/20506/5fe235b9-33e0-0fc8-fb16-a348a4479ca7.png)

って表示されて作れない！

### どうやらSDK r22.2のバグっぽい

# 解決

[Android-SDK]/tools/templates/activities/BlankActivity/template.xml
の
&lt;dependency name="appcompat" version="v7" /&gt;
をコメントアウトする．
FullScreen ActivityもMaster/Detail Flowも多分おんなじ感じで修正すれば大丈夫っぽい．

### 情報元
http://stackoverflow.com/questions/18839428/issues-when-create-new-android-application-project-in-eclipse
Guard で起動時に一度実行するプラグインを作る

## 経緯

現在 PHP で開発を行っているのですが、ローカルでのテスト自動実行やファイルの同期は Guard を利用しています。
その工程の中で、Guard 起動時に一度ローカル環境からVM上へrsyncで同期を取りたくなったので、その方法記述します。

## ソース

```rb
require 'guard/guard'

notification :growl

module ::Guard
  # 起動時に同期を行う Guard のプラグイン
  class SyncronizeAll < Guard
    def start
      hostname="172.0.0.1"
      username="eccyan"
      application_path="/home/eccyan/devel/project/web"
      current_path="/var/www/project/current"

      # 同期を実行する
      puts "Starting syncronize all to #{hostname}"
      if result = `rsync -rvz --delete --omit-dir-times \
          '#{application_path}/' '#{username}@#{hostname}':'#{current_path}'`
        if $?.success?
          ::Guard::Notifier.notify("Syncronized", :title => 'Syncronize All')
        else
          ::Guard::Notifier.notify("Failed", :title => 'Syncronize All', 
                                             :image => :failed)
        end 
      end 

      # start は処理の成否を返さなければならない
      $?.success?
    end 
  end 
end

group :your_group do
  # 作成したプラグインを定義しておけば、初回起動時に実行される
  guard :syncronize_all
end

```

## 解説

まず、Guard からイベントとして呼ばれるメソッドは以下のものしかありません

* ``start``
* ``stop``
* ``reload``
* ``run_all``
* ``def run_on_changes(paths)``
* ``run_on_additions(paths)``
* ``run_on_modifications(paths)``
* ``run_on_removals(paths)``

この中の ``start`` メソッドが Guard 起動時に呼ばれるので、ここへ処理を書きます。

しかし、 __いちいちプラグインを作るのは面倒くさい__ため Guardfile 内にインラインで記述しています。
これなら気軽にローカル環境が構築できますね。

### _Ruby 最高！Ruby イエス！_

## 参考

https://github.com/guard/guard/wiki/Create-a-guard
RSpecでFailure時にEncoding::UndefinedConversionErrorが出るときの対処法

以前Blogにも書いたけど、こっちにも...。

割と最近のRuby + 割と最近のRSpec など、特定の組み合わせで発生するっぽい。
自分の環境は Ruby 1.9.3p327 + RSpec 2.14.4 だった。

臭いものにはフタを...な感じの修正だけど、とりあえず下記のようにすれば直る。
gems/rspec-expectations-{version}/lib/rspec/expectations/differ.rb の該当部分を修正。

```ruby
# 変更前
def matching_encoding(string, source)
        string.encode(source.encoding)
end

# 変更後 (まぁ実際には直書きじゃない方がいいよね)
def matching_encoding(string, source)
        string.force_encoding('UTF-8')
end
```

なお、encodeの第2引数に「:undef => :replace」を書いてもエラーは出なくなるが、
日本語が読めなくなるのでNG。
ログファイルをnfsへ保存するときに気をつけること

サーバ削除するのでログファイルをnfsへ保存したい。

* シムリンクだけ移動してる事に気づきにくいので、別のサーバから保存できたか確認する癖をつける
* cpするときはタイムスタンプも保存するようにaオプションをつけておく
nginxでSSLを立てるまで


とある事情でSSL通信をさせて内部的にリダイレクトさせないとならなかったのでその手順をまとめる。

##サーバ証明書を生成

今回はデバッグ目的のみなのでちゃんとした証明書ではなくとりあえず動くものを生成する。

```shell
#opensslのインストール
$ brew install openssl

#続いてopensslから証明書の生成
$ openssl req -new -days 365 -x509 -nodes -keyout cert.key -out cert.crt
```

##nginxの設定

続いてnginxの設定。
設定ファイルは`/etc/nginx/conf.d/ssl.conf`に保存。
（ここは*.confが普通は全部読み込まれるので同じディレクトリならOK）

```ssl.conf
#エイリアス？の設定。なんか動かなかったのでコメントアウト。
#upstream server_clusters {
#    server http://localhost:80
#}

server {
    listen       443;

    ssl                  on;
    ssl_certificate      /etc/nginx/cert.crt;
    ssl_certificate_key  /etc/nginx/cert.key;

    ssl_session_timeout  5m;

    ssl_protocols  SSLv2 SSLv3 TLSv1;
    ssl_ciphers  HIGH:!aNULL:!MD5;
    ssl_prefer_server_ciphers   on;

    location / {
        proxy_set_header Host             $host;
        proxy_set_header X-Real-IP        $remote_addr;
        proxy_set_header X-Forwarded-For  $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-User $remote_user;
        proxy_pass http://localhost:8080;
    }
}
```

##nginxを再起動

nginxを再起動。configのチェックをして問題なければrestart。

```shell
#configファイルのテスト
sudo /etc/init.d/nginx configtest

#OKだったらrestart
sudo /etc/init.d/nginx restart
```
DeployGateをWindowsで使う

それでもわたしはWindowsを使うのだ。

# 環境構築
とりあえず環境のダウンロード

1. Cygwinをインストールし、パッケージとしてrubyを含める(たぶんこちらは他のRubyディストリビューションでも良いです)
1. `gem install --remote "httpclient"`コマンドでhttpclientをインストール
1. DeployGateのサイトで配布されている[Push用のシェルスクリプト](https://deploygate.com/docs/cli)をダウンロード・任意のフォルダに解凍する
1. 解凍したファイルの「dgate(拡張子なしファイル)」を「dgate.sh」にリネーム

次に環境変数をいじる

1. Cygwinのbinフォルダ(C:\Cygwinにファイルをインストールしていた場合、C:\Cygwin\bin)にパスを通す
1. DeployGateをインストールしたフォルダにパスを通す
1. ユーザー環境変数としてHOMEを設定。値は「C:\Users\○○(○○は自分のユーザー名)」。
1. PATHEXTに「.sh」を追加

ここで、アプリケーションプロジェクトのbinフォルダをコマンドプロンプトで開いて、`dgate push ○○(アップロードしたいapkファイル名)`と入力すると、dgateコマンドが実行できます。

## CygwinのRubyを使うときの追加注意点
CygwinのRuby(Cygwinのインストーラからインストールできるruby.exe)を使う場合、gemは拡張子のないrubyスクリプトなので、Windows標準のコマンドプロンプトではそのまま起動できません。

* Cygwinコンソール（CygwinがインストールされたフォルダのCygwin.bat）を開いて操作する
* ruby [Cygwinインストールフォルダ]\bin\gemとコマンドを書いてやる

のいずれかの方法でgemを起動する必要があります。

# dgateコマンド利用の注意点

たぶん説明があまりないので皆さん当然のごとく使われているものなのでしょうが。dgateコマンド利用の注意点。

基本的にdgate push ○○でapkファイルをアップロードするだけです。dgate logoutというコマンドもありますがたぶん使いません(環境設定を消すだけなので)。

* 最初にEMAILとパスワードを聞かれますので、DeployGateに登録したものを入力します。この設定をスキップしたい場合は、DeployGateのdgate.rbを開き、11行目の$settings変数に直接メールアドレスとAPIトークンを入力します。
* - DeployGateプランによってはhttpsでのAPI接続が出来ません。その場合ログイン時にエラーが出ますので、dgate.rb9行目のAPI_BASE_URLをhttpsからhttpに変更してください。 -
** そんなことありませんでした。Freeプランでもhttps使えます。
* dgateコマンド実行時に「DL is deprecated, please use Fiddle」というメッセージが出ますが、これはRuby内部で使用しているライブラリが古いためなので、動作には特に問題がないそうです。無視しましょう。

# Eclipseの外部ツールからdgateコマンドを呼び出す

本当はJenkinsなどのツールを使うべきだそうですが。

外部ツールの新規作成で、次の設定を入力

* ロケーション：[Cygwinインストールフォルダ]\bin\sh.exe
* 作業フォルダ：${project_loc}
* 引数："[DeployGateインストールフォルダ]\dgate.sh" push "${project_loc}\bin\${project_name}.apk"

これで、このツールを実行すると最後にビルドした時点(おそらく最新版)のapkをプッシュすることが出来ます。
has-a継承が便利な場合、あるいはprotected継承は必要

<p>JavaというかAndroidとかでListenerを使うような場合、C++ではhas-a継承が使える。</p>
<p>まず、一々記述するのが面倒なのでlistenされる側をlisteneeと呼ぶことにする。</p>
<p>listenerを使うのは(listen)erが(listen)eeから何かイベントを受け取りたい場合だ。ここで、イベントを通知するメソッドをeeに純粋仮想関数として定義して、これをerが継承する。erでは通知メソッドを実装しなければならないし、当然イベントがあればerの通知メソッドが呼ばれる。</p>
<p>Listenerはeeからerの何かを呼ぼうとするとeeがerの実装に依存してしまうという逆依存問題を解消する方法でもあるが、この方法でもeeはerに依存していない。listenerの登録だのがクラスの構造に固定化されているのでlistenerの煩雑さもない。</p>
<p>これがhas-a継承が便利な場合。Javaだと多重継承が許されていないので汎用性を考えるとListenerなインターフェイスをimplementして使う方が向いているが、C++は多重継承できるのでただクラスを継承してハンドラを書くだけでいい(思うにJavaの方がいろいろ言われているC++より失敗言語っぽい。デストラクタがないからメモリ解放以外の後始末をまったく自動化できないし。例えばRAIIみたいにロックの解除とか)。</p>
<p>しかし、ここで普通にpublic継承してしまうとerはeeの一種扱いになってしまう。これは間違った関係なのでprivate継承かprotected継承にしてis-a関係を消す。ここでさらにer自体が抽象クラスでその子クラスの通知メソッドを置きたい場合もあるが、そんな場合はprotected継承で素直に実装できる。</p>
<p>これは **要らない子扱いされているprotected継承が必要になる稀有な例** だな。</p>

まだ試してないけどな(ぉぃ

# てかもっと単純に「has-a継承が便利な場合」

コールバックがある場合、代わりに仮想関数を使える、これは継承である必要があるのでhas-a継承が便利。でないとコールバックの登録や解除に(面倒というのも含めて)悩まされる。関係が固定なのでさらに安全だ。

もっとも、継承先でコールバックを止める必要があるので完全に安全というわけではないけれど、コールバックするくらいなら継承するほうがずっとマシ。さらに多重継承できないと実際に使うのは難しいのでC++専用に近いけど。
MacPortsでaws-cliをインストールする


いつの間にか正式リリースされていたのでまとめておきます

#前提
* macportsがインストールされていること
* Pythonがインストールされていること(Python versions 2.6.x 以上　3.3.x以下)
 *  git-coreをインストールしていれば、Pythonが入っているはず

#インストール

###### インストールされているPythonを確認する

```
$ sudo port installed | grep py
  git-core @1.8.4_0+credential_osxkeychain+doc+pcre+python27 (active)
  python27 @2.7.5_1 (active)
  ・・・
```
###### pythonのバージョンに対応するpipをmacportsでインストール(setuptoolsも依存しているので入る)

```
$ sudo port install py27-pip
```

###### パッケージ管理システムからpipモジュールをインストール

```
$ sudo easy_install pip
```
###### aws-cliをインストール

```
$ sudo pip install awscli 
```

# 設定

###### サブコマンドのオートコンプリートを有効にする

```
 $ complete -C aws_completer aws
```

###### awsの設定を確認する
1. AWS Management Consoleを開く
2. Security Credentialsなどで、Access Key ID と Secret Access Keyを確認
3. EC2 DashboardのAvailability Zone Statusなどからリージョン名を確認(例：ap-northeast-1aの末尾を取った値、ap-northeast-1がリージョン名)

###### いずれかの方法を行う
* Environment variables
* Config file
* IAM Role

###### Environment variablesの場合

```
$ export AWS_ACCESS_KEY_ID=<access_key>
$ export AWS_SECRET_ACCESS_KEY=<secret_key>
```
###### Config fileの場合
この方法だとporfile指定でそれぞれの環境用に記述できる

```/path/to/config_file
[default]
aws_access_key_id=<default access key>
aws_secret_access_key=<default secret key>
# Optional, to define default region for this profile.
region=<リージョン名>

[profile testing]
aws_access_key_id=<testing access key>
aws_secret_access_key=<testing secret key>
region=<リージョン名>
```
```
$ export AWS_CONFIG_FILE=/path/to/config_file
```

###### IAM Roleの場合
EC2インスタンス上でaws-cliをインストールして利用する場合で、且つIAMを利用している場合は、自動的にAccess Key ID と Secret Access Keyを使用してくれるようです。

# 試しに実行
###### Environment variables,　IAM Roleの場合
```
$ aws ec2 describe-instance-status --region <リージョン名>
```

###### Config fileの場合
* profile testingを利用する場合

```
$ aws ec2 describe-instance-status --profile=testing
```

# 公式サイト
https://github.com/aws/aws-cli
AAモードがあったらいいな

こういう記法を使えたら良いなー。

```
　```aa
　　 ∧＿∧
　　（　´∀｀）
　　（　　 　 ）
　　│ │ │
　　（＿_）＿）
　```
```

↓こんな風に

![AAモードでちゃんと表示されるモナー](https://qiita-image-store.s3.amazonaws.com/0/10765/0967211e-b756-bf51-451e-903f3727abe5.png) ※これは画像

```css
.aa {
    font-family: 'MS Pgothic', 'ＭＳ Ｐゴシック', 'Mona', 'IPAMonaPGothic', sans-serif;
    font-size: 16px;
    line-height: 18px;
}
```
csv2table.jsのデフォルトCSSをリセットし、自由にCSS設定できるバージョンをリリース

csv2table.jsは最近ほとんどいじってなかったのですが、最近CSSの適用が難しいという質問が増えているので、この際、デフォルトCSSをリセットし、自由にCSS設定可能にできるバージョンを作りました。

http://jsgt.org/lib/jquery/plugin/csv2table/v002/test.htm#nview0

csv2tableで作成されるテーブルの各HTML要素にはそれぞれ下記のようなクラス名がついていますので、リセット後はその名前で指定します。

```text
      className_div      : 'csv2table-div',                  //className 
      className_table    : 'csv2table-table',                //className 
      className_table_th : 'csv2table-table-th',             //className 
      className_table_td : 'csv2table-table-td',             //className 
      className_hoboNum  : 'csv2table-hoboNum',              //className 
      className_sortMark : 'csv2table-sortMark',             //className 
      className_legends  : 'csv2table-legends'               //className
```

で、リセットのおまじないは、こうです。

```html
<script>
  //デフォルトCSSをリセットする
  $.csv2table.cssReset();
</script>
```

 リセット後はたとえば下記のようなCSSで設定してください

```html
<style>
div.csv2table-div {
  padding           : 10px; 
  margin            : 1px;
}
table.csv2table-table {
  border-collapse   : collapse;
  border-spacing    : 0px;
  margin-bottom     : 10px;
}
th.csv2table-table-th{
  border-color      : #eee #999 #777 #bbb;
  border-style      : solid;
  border-width      : 1px;
  background-color  : rgba(124,100,0,0.5); 
  padding           : 12px;
  font-size         : 12px;
  text-align        : center;
}
td.csv2table-table-td{
  border-color      : #eee #999 #777 #bbb;
  border-style      : solid;
  border-width      : 1px;
  padding           : 12px;
  font-size         : 12px;
  text-align        : center;
}

/*先頭列のTD背景色をorangeにする*/
td.csv2table-table-td:nth-child(1){
  background-color  : orange;
}

th.csv2table-sortMark{

}
td.csv2table-hoboNum{

}
</style>
```

これ以外は、今までと同じです。

```html
<script src="./js/jquery-1.7.2.min.js" type="text/javascript"></script>
<script src="./js/jquery.csv2table-0.02-b-4.4.js" type="text/javascript" charset="utf-8"></script>

<script>
$(function(){
  $('#view0').csv2table('./data/Book12.csv');
});
</script>
```

これで、次のようなCSVを読み込んで下記のようなテーブルが表示されます。

```text
ＮＯ,名前,種類,年齢,金額
1,アイ,さる,10,"100,000 "
2,タマ,ねこ,5,"80,000 "
3,チヤー,いぬ,12,"5,000,000 "
4,ピー,とり,1,"3,000 "
```

<div id="view0"></div>![csv2table.png](https://qiita-image-store.s3.amazonaws.com/0/7103/9a7e005f-9643-09ff-9d04-7ffdb05e3ea1.png)
意外と知られていないxibのこと



意外と知られていない？　使われていない？　xibの解説です。やっぱりUI関連はxib(Storyboard)がとても便利です。

コードから読み込み
---

![NibTest.xcodeproj_—_Objects.xib-2.png](https://qiita-image-store.s3.amazonaws.com/0/27407/d0c34d10-50b8-eeab-3dff-441d3c991a2f.png "NibTest.xcodeproj_—_Objects.xib-2.png")

これをこのように読み込みます。

```objc
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    // Override point for customization after application launch.
    
    UINib *objectsNib =[UINib nibWithNibName:@"Objects" bundle:nil];
    NSArray *objects = [objectsNib instantiateWithOwner:nil options:nil];
    NSLog(@"%@", objects);
    
    // NSBundleから読み込むほうが簡単
    NSLog(@"%@", [[NSBundle mainBundle] loadNibNamed:@"Objects" owner:nil options:nil]);
    
    return YES;
}
```

---

2017-06-20 追記
上記パフォーマンスの観点から `UINib` がいいと[コメントいただきました。](http://qiita.com/ryotapoi/items/3e3485baed79842c51f2#comment-8839c5f0e3313fe2c25d)
ありがとうございます🙏

---


`instantiateWithOwner:options:`の戻り値はxibのObjectsの内容です。

xibを読み込むとObjectsが取得できます。(Objectsはクラスではなくインスタンス)
更に同時に以下の様なことも行われます。

* Attributes Inspectorで指定した値等の設定
実際には`setProperty:`されるのではなく`initWithCoder:`でオブジェクトが読み込まれているようです。xibはインスタンスをシリアライズしたものを保存しているんですねきっと。  
  
* Action/Outletの接続
オブジェクトのシリアライズだけでは表現できない、他のオブジェクトとの関連も設定してくれます。  
  
* UIViewの構造の生成
addSubview:やsetFrame:、それにAutoLayout関連の設定等も行ってくれます。

Files Owner
---

Files Ownerとは、xibで生成されず、外部から与えられます。外部から与えられますので **Attributes Inspectorで設定することはできません**。
しかし **Action/Outletの接続はできます**


![NibTest.xcodeproj_—_Objects.xib.png](https://qiita-image-store.s3.amazonaws.com/0/27407/90fde33b-beac-07a6-1e0a-9714632e6dcf.png "NibTest.xcodeproj_—_Objects.xib.png")
Classの設定は、Files Ownerとして与えられる予定のクラスが何でAction/Outletで何が接続できるかを判断するためのものとなります。  
  
![NibTest.xcodeproj_—_Objects.xib.png](https://qiita-image-store.s3.amazonaws.com/0/27407/44e21b53-40bd-17de-94d2-a832c17decc7.png "NibTest.xcodeproj_—_Objects.xib.png")
Attributesには何もでません。  


コードで指定する時はこうなります。

```objc
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    // Override point for customization after application launch.
    
    UIViewController *controller = [[UIViewController alloc] init];
    UINib *objectsNib =[UINib nibWithNibName:@"Objects" bundle:nil];
    NSArray *objects = [objectsNib instantiateWithOwner:controller options:nil];
    NSLog(@"%@", objects);
    
    return YES;
}
```

initWithNibName:bundle:
---

UIViewControllerでxibを使う場合が多いと思いますが、`initWithNibName:bundle:`は **自身をOwnerとしてxibを読み込み初期化する** メソッドとなります。

xibの読み込みにUIViewControllerは不要
---

通常xibを使うのはUIViewControllerの生成に関連する部分が多いため、UIViewControllerが必須と思っている方もいらっしゃるかもしれません。ですが上記のようにそれが必要なわけではありません。   
`setFrame:`や`setBackgroundColor:`等のviewの組み立てコードを外に追い出し、`addTarget:action:forControlEvents:`のようなコードも追い出して、xibをロードするだけで全て済んだカスタムビューを取り出すといったことができます。
最近はnibをUITableViewに設定すると自動でそれを使ってくれるなど色々便利で、直接xibを読み込むことは少なくなったのですが…知っていれば役に立つ場面もまだあると思います。


その他
---

Storyboardはxibの集合と、xib同士の関連をひとまとめにしたものです。Storyboardを複数作って云々…という手もありますが、ちょっとした部品をメインのStoryboardとは別に作りたいならxibいいですよ。
net-ssh-multi gemを使ってみる

* rubyからsshで複数サーバーに対して操作がしたかったのでnet-ssh-multi gem(1.2.0)を使ってみた
 * capistranoはコマンドラインツールとしては引数がわかりにくいけどnet-ssh-multi + trollopあたりだと気楽にコマンドラインツール作れるかな？

* サンプルスクリプト
 * SOCKS5プロキシを利用する環境なので指定
 * concurrent_connectionsで最大コネクション数を指定

```rb
require 'net/ssh/multi'
require 'net/ssh/proxy/socks5'                                                  

socks5 = Net::SSH::Proxy::SOCKS5.new('host', 1080, :user => 'user', :password => 'password')

Net::SSH::Multi.start(concurrent_connections => 1) do |session|
  session.use "[ec2のPublicDNS1]", 
              "[ec2のPublicDNS2]",
              :user => 'ec2-user',
              :proxy => socks5,
              :keys => ["/private/key/path"]
  session.exec "echo hoge"
  session.loop
end
```

* 実行結果

```bash
$ bundle exec ruby test.rb
[ec2のPublicDNS1] hoge
[ec2のPublicDNS2] hoge
```
package.json は .yaml で準備して json に直すワンライナーでエクスポートする

毎回スクリプト書くのも面倒だし、ワンライナーにしてエイリアス登録しておくといい

```bash
$ perl -MJSON -MYAML -wl -e 'print JSON->new->utf8(1)->pretty(1)->encode(YAML::LoadFile(shift))' package.yaml > package.json
```



細かいところはこのあたりを参照
* [JSON - search.cpan.org](http://search.cpan.org/~makamaka/JSON-2.59/lib/JSON.pm)
* [YAML - search.cpan.org](http://search.cpan.org/~mstrout/YAML-0.84/lib/YAML.pm)
【バッチファイル】文字列を改行なしで表示【備忘録】

文字列を改行なしで表示

```bat:
@rem 表示
SET /P X=文字列<NUL
@rem ファイルに上書き
SET /P X=文字列<NUL >ファイル
@rem ファイルに追記
SET /P X=文字列<NUL >>ファイル
```
Amazon RDS で max_connections が変わらなかった

# 今北産業

max_connections がおかしい時は、
一旦適当な数字に変えてから
戻してみよう

# kwsk

m1.medium の RDS インスタンスを動かしてるのに、なぜか

```sql
select @@max_connections;
```

が 151 という結果を返してきた。RDS での max_connections は、デフォルトでは `{DBInstanceClassMemory/12582880}` になるはずなんだけど、151 という数字は少なすぎる。 [m1.medium のメモリは 3.75 GB](http://aws.amazon.com/jp/rds/) だから、値としては 3.75 * 1024 * 1024 * 1024 / 12582880 = 320 になるはず。

とりあえず値を直接 320 と指定してみたところ、先ほどの select 文は 320 を返すようになった。なんだ変わるじゃん。ってことで、再度 `{DBInstanceClassMemory/12582880}` に戻したら、今度は 296 になった。多少の違いは気にしないとして（気にするなら直接指定すべき）、一旦適当な値に変えてから戻せば、デフォルトの値を再計算するっぽい。

もしかしたら、途中でインスタンスクラスを変えた場合にはこうなっちゃうのかもしれない。
golang で簡単なベンチをとる

えっ、 golang で簡単なベンチマークを取りたい？そんな時にはこのスニペットがあなたのお役に立つはずです。

```go
import (
  "time"
  "fmt"
)

func bench(label string, f func()) {
  now = time.Now()
  f()
  fmt.Println(label, ":", time.Now().Sub(now))  
}
```

あとはこんな感じで呼び出すだけ。

```go
bench("process", func() { object.process() })
```

クロージャっぽいことできるから簡単ですね。
HAMLで複数のclassを付与する書き方

下記は全て同じ意味になる。

```haml
%div{:id => "id_name", class => "class1 class2 class3"}
```

```haml
%div(id="id_name" class="class1 class2 class3")
```

```haml
%div#id_name.class1.class2.class3
```
カレントディレクトリ以下にあるファイルの文字コードや改行コードを一括変換

カレントディレクトリ以下にあるファイルの文字コードをUTF-8に一括変換

```bash
find . -type -f -name "*.cpp" -print0 | xargs -0 nkf -w --overwrite
```

カレントディレクトリ以下にあるファイルの改行コードをLFに一括変換

```bash
find . -type -f -name "*.cpp" -print0 | xargs -0 nkf -d --overwrite
```
Vim上でビジュアルモードで選択した範囲を、awkで処理して結果を貼付ける

Vimには、外部コマンドの実行結果でテキストを置換する機能がある。
これを使えば、コマンド上ではawkでサクッとやりたくなるようなテキスト処理もVim上でできる。

例えば、以下のようなテキストをawkで処理する場合を考える。

```
1  2  3  4  5
6  7  8  9  10
11 12 13 14 15
```

これらの行をビジュアルモードで選択し、その状態から`:!awk `を押下し処理を記述することで、選択行を任意のawkスクリプトに食わせて処理した結果に置換できる。

```vim
:'<,'>!awk '{print $2}'
```

数値の羅列の中から、2列目の平均値を算出するなどの場合でも楽に記述可能。

```vim
:'<,'>!awk '{ sum += $2; num++ } END { print sum/num }'
```

ビジュアルモードからでは無く、コマンド中で処理する行を指定してもOK

```vim
:1,3!awk '{print $2}'
```
jsonを取得、表示するアプリケーション　その６

リクエストパラメータに日本語が使用できなかったのでURLエンコードをかける

```groovy:json_client.groovy
import groovy.swing.SwingBuilder
import groovy.json.JsonOutput
import javax.swing.*
import java.awt.*
import java.net.*

def cbMethod
def txtUrl
def txtParam
def txtJson

def tabPane

def prettyPrint = { text ->
	def result = JsonOutput.prettyPrint(text)
	(result =~ /\\u[0-9a-zA-Z]{4}/).each { match ->
		def code = match[2..5]
		def encTxt = new String([Integer.parseInt(code, 16)] as int[], 0, 1)
		result = result.replaceAll(/\\u${code}/, encTxt)
	}
	result
}

def sendRequest = {
	def method = cbMethod.selectedItem
	def url = txtUrl.text
	def params = URLEncoder.encode(txtParam.text, 'utf-8').replaceAll('%3D', '=').replaceAll('%26', '&')
	if (method == 'GET') {
		url = "${url}?${params}"
	}
	
	def conn = url.toURL().openConnection()
	conn.requestMethod = cbMethod.selectedItem
	if (method == 'POST') {
		conn.doOutput = true
		conn.outputStream << txtParam.text
	}
	
	txtJson.text = prettyPrint(conn.inputStream.getText('utf-8'))
	tabPane.selectedIndex = 1
}

new SwingBuilder().frame(title:'jsonを取得、表示するアプリケーション', defaultCloseOperation:JFrame.EXIT_ON_CLOSE,
						size: [800, 600], show:true) {
	lookAndFeel('nimbus')
	borderLayout()
	hbox(constraints: BorderLayout.NORTH) {
		cbMethod = comboBox(items:['GET', 'POST'])
		txtUrl = textField()
		button(text:'送信', actionPerformed:sendRequest)
	}
	tabPane = tabbedPane(constraints: BorderLayout.CENTER) {
		scrollPane(name:'パラメータ') {
			txtParam = textArea()
		}
		scrollPane(name:'レスポンス') {
			txtJson = textArea(editable:false)
		}
	}
}
```
確認: special binding は 関数空間には作用しない


```cl

(in-package :cl-user)

(defun fn ()
  1)

(print (fn))

;; --> 1

(defun fn2 ()
  (flet ((fn ()
           2))
    (fn)))

(print (fn2))

;; --> 2


(defun fn3 ()
  (flet ((fn ()
           2))
    (fn3-sub)))

(defun fn3-sub ()
  (fn))

(print (fn3))

;; --> 1

(defun fn4 ()
  (flet ((fn ()
           2))
    (declare (special fn))
    (fn4-sub)))

(defun fn4-sub ()
  (fn))

(print (fn4))

;; --> 1
```

よく見たら[hyperspecに書いてありました。](http://www.lispworks.com/documentation/HyperSpec/Body/d_specia.htm) さすがhyperspec。仕様についてはほぼすべて辞書のように載ってます。

     special declarations never apply to function bindings.
【質問】AndroidでEditTextを絵文字対応したのにIMEに絵文字タブがでない。どうしたらいいの？

```
		EditText editor = (EditText)findViewById(R.id.edittext);
        Bundle b = editor.getInputExtras(true);
        if (b != null) {
           b.putBoolean("allowEmoji",true);
        }

```
と記述して、EditTextを絵文字対応にしたのですけど、
編集しようとしても、IMEに絵文字タブが出ません。
どうすれば絵文字が入力できるのでしょうか？

端末は au GALAXY II (OS 4.0.3）を使っています。
IMEはsamsung 標準日本語入力です。

標準メールソフトで絵文字を入力して、コピーして貼り付けたんですけど、
絵文字は張り付きませんでした。

自作アプリでも絵文字が使用したいです。どうすればいいのでしょうか？

困っています。助けて下さい。

![result.jpg](https://qiita-image-store.s3.amazonaws.com/0/29720/acc755f1-3520-c5c7-3df2-6bdc7d4f361c.jpeg)
mozcをコンパイルしてインストールする（Linux）

MozcはOSSな日本語IMEですが、使うには自前でコンパイルしなくてはいけませんね

https://code.google.com/p/mozc/

ver1.5辺りまではソースにdebパッケージを作成するための設定ファイルなどが含まれていましたが、いつの間にかなくなっており、最新ソースではbuildまではできますが、そのあとは「各自やれや」という漢仕様です。

https://code.google.com/p/mozc/wiki/LinuxBuildInstructions

LinuxでのBuildは上記ページを参照すれば問題ありません。問題はBuildしたあとのInstallです。

## どこに入れる？

`make install`もできなければdebuildでパッケージングもできません。ならもう手動で配置するしかありませんね。上記手順でbuildしたあと、out_linux配下はだいたいこんな感じでバイナリが作成されているはずです。

```

-rwxrwxr-x   1 misty misty   238692 Sep 16 14:35 gen_collocation_data_main
-rwxrwxr-x   1 misty misty   238747 Sep 16 14:35 gen_collocation_suppression_data_main
-rwxrwxr-x   1 misty misty   244514 Sep 16 14:35 gen_mock_segmenter_bitarray_main
-rwxrwxr-x   1 misty misty   244512 Sep 16 14:35 gen_oss_segmenter_bitarray_main
-rwxrwxr-x   1 misty misty   234682 Sep 16 14:35 gen_suggestion_filter_main
-rwxrwxr-x   1 misty misty   286036 Sep 16 14:35 gen_symbol_rewriter_dictionary_main
-rwxrwxr-x   1 misty misty   357783 Sep 16 14:35 gen_system_dictionary_data_main
-rwxrwxr-x   1 misty misty   253183 Sep 16 14:35 gen_usage_rewriter_dictionary_main
-rwxrwxr-x   1 misty misty  2060993 Sep 16 15:01 ibus_mozc
-rw-rw-r--   1 misty misty        0 Sep 16 15:01 linker.lock
-rwxrwxr-x   1 misty misty  1787397 Sep 16 15:01 mozc_emacs_helper
-rwxrwxr-x   1 misty misty  1905648 Sep 16 15:01 mozc_renderer
-rwxrwxr-x   1 misty misty 21400759 Sep 16 15:01 mozc_server
-rwxrwxr-x   1 misty misty  4395213 Sep 16 15:01 mozc_tool
drwxrwxr-x   3 misty misty     4096 Sep 16 14:33 obj
drwxrwxr-x  39 misty misty     4096 Sep 16 14:46 obj.host
drwxrwxr-x 120 misty misty     4096 Sep 16 15:01 obj.target
-rwxrwxr-x   1 misty misty  1611536 Sep 16 14:33 protoc
```

これを以下のように配置します

```

/usr/lib/ibus-mozc
  ibus_mozc

/usr/lib/mozc 
  gen_collocation_data_main
  gen_collocation_suppression_data_main
  gen_mock_segmenter_bitarray_main
  gen_oss_segmenter_bitarray_main
  gen_suggestion_filter_main
  gen_symbol_rewriter_dictionary_main
  gen_system_dictionary_data_main
  gen_usage_rewriter_dictionary_main
  mozc_renderer
  mozc_server
  mozc_tool
  protoc

/usr/local/bin
  mozc_emacs_helper

```


バイナリはこんな感じでいいでしょう。次にibusで使うために`mozc.xml`を配置します

```
$ cp obj/gen/unix/ibus/mozc.xml /usr/share/ibus/component
```

この`mozc.xml`は若干修正が必要なので修正します。

```xml
<component>
  <version>0.0.0.0</version>
  <name>com.google.IBus.Mozc</name>
  <license>New BSD</license>
  <exec>/usr/lib/ibus-mozc/ibus_mozc --ibus</exec>  <!--  ここを修正 -->
  <textdomain>ibus-mozc</textdomain>
  <author>Google Inc.</author>
  <homepage>http://code.google.com/p/mozc/</homepage>
  <description>Mozc Component</description>
<engines>
<engine>
  <rank>80</rank>
  <description>Mozc (Japanese Input Method)</description>
  <language>ja</language>
  <icon>/usr/share/ibus-mozc/product_icon.png</icon>
  <setup>/usr/lib/mozc/mozc_tool --mode=config_dialog</setup>
  <layout>jp</layout>
  <name>mozc-jp</name>
  <longname>Mozc</longname>
</engine>
</engines>
</component>
```

これで再起動してibusの設定画面がIMEが選択できるはずです
Rails4時代の高速テスト環境 Rspec+Guard+FactoryGirl+Spring[NEW!]

Railsのテスト環境の定番といえば

+ Rspec
+ Guard
+ FactoryGirl
+ Spork

このへんの組み合わせが定番だったんではないでしょうか。
Sporkでテスト環境をプリロードして、Guardでファイルを監視してガンガンテストを回してと。

今回はこのSporkを最近メキメキと頭角を現してきているSpringに置き換えて
よりモダンな高速テスト環境の作り方を説明します。

## Springのいいところ
このSpringなにがいいって、設定がすごく簡単。
おまけにGuard+Rspec以外にもrails generateやrake routesなど他のコマンドも高速化してくれます。

一度体験したらもう戻れません。

## 必要なGem
+ rspec-rails
+ guard-rspec
+ factory_girl_rails
+ spring

```rb:Gemfile
group :development, :test do
  gem 'rspec-rails'
  gem 'guard-rspec'
  gem 'factory_girl_rails'
  gem 'spring' # これを新しく追加
end
```

## spec_helperの設定
基本的にいつもどおり。

FactoryGirlを使用する場合は、この記述がないとfactoryの変更が反映されません。

```rb:spec_helper.rb
config.before(:all) do
  FactoryGirl.reload
end
```

参考までに全文掲載。

```rb:spec_helper.rb
require File.expand_path('../../config/environment', __FILE__)
require 'rspec/rails'
require 'rspec/autorun'
require 'factory_girl'

Dir[Rails.root.join('spec/support/**/*.rb')].each { |f| require f }

ActiveRecord::Migration.check_pending! if defined?(ActiveRecord::Migration)

RSpec.configure do |config|
  config.use_transactional_fixtures = true
  config.infer_base_class_for_anonymous_controllers = false
  config.order = 'random'
  config.include FactoryGirl::Syntax::Methods

  config.before(:all) do
    FactoryGirl.reload # これがないとfactoryの変更が反映されません
  end
end
```

## Guardの設定
これもほとんど今まで通りでOKです。
変更箇所は、下の一行目のspring: trueの部分だけ。

```rb:Guardfile
guard :rspec, spring: true do
  watch(%r{^spec/.+_spec\.rb$})
  watch(%r{^lib/(.+)\.rb$})     { |m| "spec/lib/#{m[1]}_spec.rb" }
  watch('spec/spec_helper.rb')  { 'spec' }

  watch(%r{^app/(.+)\.rb$})                           { |m| "spec/#{m[1]}_spec.rb" }
  watch(%r{^app/(.*)(\.erb|\.haml)$})                 { |m| "spec/#{m[1]}#{m[2]}_spec.rb" }
  watch(%r{^spec/factories/(.+)\.rb$})                { 'spec/factories_spec.rb' }
  watch(%r{^spec/support/(.+)\.rb$})                  { 'spec' }
  watch('config/routes.rb')                           { 'spec/routing' }
  watch('app/controllers/application_controller.rb')  { 'spec/controllers' }
end
```

## それでは実行 

```
bundle exec guard
```

よきテストライフを！

## おまけ

途中で触れたように、このへんのコマンドも高速に実行できます。

```
bundle exec spring rails g model Hoge
bundle exec spring rake routes
```

## さらにおまけ
Rails4っぽくbinstubつくっておくと、より便利

```
bundle binstub spring
./bin/spring xxx
```

***
弊社ブログ記事からの転載です
[Rails4時代の高速テスト環境 Rspec+Guard+FactoryGirl+Spring[NEW!]](http://lab.heathrow.co.jp/2013/09/17/3421) @ [heathrow.lab](http://lab.heathrow.co.jp)
PlayでOpenIDのサンプルが間違っていた件


http://www.playframework.com/documentation/2.1.x/ScalaOpenID

```
def loginPost = Action { implicit request =>
  Form(single(
    "openid" -> nonEmptyText
  )).bindFromRequest.fold(
    error => {
      Logger.info("bad request " + error.toString)
      BadRequest(error.toString)
    },
    {
      case (openid) => AsyncResult(OpenID.redirectURL(openid, routes.Application.openIDCallback.absoluteURL())
          .extend( _.value match {
              case Redeemed(url) => Redirect(url)
              case Thrown(t) => Redirect(routes.Application.login)
          }))
    }
  )
}

def openIDCallback = Action { implicit request =>
  AsyncResult(
    OpenID.verifiedId.extend( _.value match {
      case Redeemed(info) => Ok(info.id + "\n" + info.attributes)
      case Thrown(t) => {
        // Here you should look at the error, and give feedback to the user
        Redirect(routes.Application.login)
      }
    })
  )
}
```
の中に```OpenID.redirectURL(openid, routes.Application.openIDCallback.absoluteURL())
          .extend```みたいな所あるけど、2.1のFutureにextendなんてないので適宜書き換えましょう。
jqGridのフォーム入力で日付ピッカーを使う方法


## モーダルダイアログフォームでjQuery-UIのDatepickerを使う

tableを直接編集する場合のカレンダーピッカー使用方法はググれば直ぐ見つかるのですが、
モーダルダイアログフォームでDatepicker使う場合は、一手間必要みたいです。


以下の方法で実装できました。

```
$("#TABLE").jqGrid(

	//....中略....

	,afterShowForm:function(){
		// 入力フォーム表示直後のイベントハンドラ
		// カレンダーピッカー生成
		$("#DATE_FIELD").datepicker({dateFormat:"yy/mm/dd"});
	}

);
```

モーダルダイアログが動的生成になるので、フォーム生成直後にDatepickerUIを生成してやります。


## 参考

[jqGrid に jQuery Datepicker(カレンダー)を表示するサンプル](http://www.northwind.mydns.jp/samples/jqgrid_sample16.php "jqGrid に jQuery Datepicker(カレンダー)を表示するサンプル")
[ccchart]  Easingでccchartのアニメーション実装中

#ccchartのEasingアニメーションテスト 

https://ccchart.com/test/anim/test-1.3.htm 

チャートが表示される時にびよよよ～ん、とアニメ表示されるエフェクトを追加するテスト中です。

今まで、ccchartはリアルタイムな処理の速度と軽量さに命をかけていたので、チャート自身とは関係のないアニメな装飾は後回しにしてました。

が、

最近は他のチャートの多くは実装してて、ccchartはこのびよよんアニメが無いので見劣りするとか言われてしまったので（がびーん）ちょっと悔しくて試してみることにしたわけです。

まぁ、まだ実装中で、このベータバージョンも固定されてませんが、まぁ大体こんな感じかなぁ。どうかなぁ。

で、他のチャートはデフォルトで動作してるわけなので、ccchartとしても、これをデフォルトにするかどうか？
アニメ如きではありますが、まぁリアルタイム処理には使わず静的チャートのみなので負荷はほとんどないとは思います。

さて。。。



p.s. easing.jsは再発明を避けて、これをカスタマイズしました。https://github.com/danheberden/easing.js
findでアスタリスクを使うときに’’で括らなければならない理由

foo.pdf というファイルにマッチさせたくて `$ find . -name *.pdf` だと

`find: paths must precede expression`

というエラーメッセージになる。もしくは何も表示されない事もある。

これは何でかというとディレクトリに foo.pdf, bar.pdf, hoge.pdf とあった時に

`$ find . -name *.pdf` とするとシェルがワイルドカードを展開してしまうため

`$ find . -name foo.pdf bar.pdf hoge.pdf` と等価になってしまうから。

## 参考

linux - "find: paths must precede expression:" How do I specify a recursive search that also finds files in the current directory? - Stack Overflow
http://stackoverflow.com/questions/6495501/find-paths-must-precede-expression-how-do-i-specify-a-recursive-search-that
iTunes アフィリエイト、リンクシェアからPHGへ移行時の収益面での注意点


linkshareからPHGへiTunes アフィリエイトは移行されます。
2013年10月1日までに移行しなければなりません。

報酬はlinkshare 4% → PHG 7% になるため、喜んでいる人も多いと思いますが大きな落とし穴があります。

linkshareでは全アプリ内課金が報酬となっていましたが、PHGでは
関係のないアプリ内課金は報酬外となります。

例えば、パズドラへのアフィリエイトリンクをクリックしたユーザーがLINEの
スタンプを購入した場合は報酬対象外になります。

この影響で僕のアプリでは実際の報酬は半分程度になってしまいそうです。

急いでPHGへ乗り換えるよりギリギリまでlinkshareで粘ったほうが得策かもしれません。
ユーザーエージェント判定(JS)


自分用のメモ。
試していないのもあるので、正しいかどうかは未検証です。

``` javascript
var cmn = [];

// ユーザーエージェントの取得
cmn.ua = window.navigator.userAgent.toLowerCase();


// 各ブラウザ(PC)
cmn.ua_ie7 = (cmn.ua.indexOf('ie 7.') > 0) ? true : false;
cmn.ua_ie8 = (cmn.ua.indexOf('ie 8.') > 0) ? true : false;
cmn.ua_ie9 = (cmn.ua.indexOf('ie 9.') > 0) ? true : false;
cmn.ua_ie10 = (cmn.ua.indexOf('ie 10.') > 0) ? true : false;
cmn.ua_chrome = (cmn.ua.indexOf('chrome') > 0 && cmn.ua.indexOf('safari') > 0) ? true : false;
cmn.ua_safari = (cmn.ua.indexOf('chrome') === -1 && cmn.ua.indexOf('safari') > 0) ? true : false;
cmn.ua_firefox = (cmn.ua.indexOf('firefox') > 0) ? true : false;
cmn.ua_opera = (cmn.ua.indexOf('opera') > 0) ? true : false;

// IEバージョン判別
cmn.ua_ie = (cmn.ua_ie7 === true || cmn.ua_ie8 === true || cmn.ua_ie9 === true && cmn.ua_ie10 === true) ? true : false;
cmn.ua_ie8lte = (cmn.ua_ie7 === true || cmn.ua_ie8 === true) ? true : false;
cmn.ua_ie9lte = (cmn.ua_ie7 === true || cmn.ua_ie8 === true || cmn.ua_ie9 === true) ? true : false;

// ブラウザエンジン
cmn.ua_webkit = (cmn.ua.indexOf('webkit/') > 0) ? true : false;   // Safari, Chrome系
cmn.ua_gecko = (cmn.ua.indexOf('gecko/') > 0) ? true : false;   // Firefox系
cmn.ua_presto = (cmn.ua.indexOf('Presto/') > 0) ? true : false;   // Opera系


// 各ブラウザ(TB)
cmn.ua_iPad = (cmn.ua.indexOf('iPad') > 0) ? true : false;
cmn.ua_AndroidTab = ((cmn.ua.indexOf('Android') > 0 && cmn.ua.indexOf('Mobile') === -1) || cmn.ua.indexOf('A1_07') > 0 || cmn.ua.indexOf('SC-01C') > 0) ? true : false;    // A1_07とSC-01CはタブレットにもかかわらずMobileのUAが付与される(2013/02現在)

cmn.ua_TAB = (cmn.ua_iPad === true || cmn.ua_AndroidTab === true) ? true : false;

// 各ブラウザ(SP)
cmn.ua_iPhone = (cmn.ua.indexOf('iPhone') > 0) ? true : false;
cmn.ua_iPod = (cmn.ua.indexOf('iPod') > 0) ? true : false;
cmn.ua.Android = (cmn.ua.indexOf('Android') > 0 && cmn.ua.indexOf('Mobile') > 0) ? true : false;
cmn.ua_WinPhone = (cmn.ua.indexOf('Windows Phone') > 0) ? true : false;
cmn.ua_Blackberry = (cmn.ua.indexOf('Brackberry') > 0) ? true : false;

cmn.ua_SP = (cmn.ua_iPhone === true || cmn.ua_iPod === true || cmn.ua_Andorid === true || cmn.ua_WinPhone === true || cmn.ua_Blackberry === true) ? true : false;

```
PHP5.5.3 with phpbrew


```
phpbrew install php-5.5.3 +xml
...
configure: error: XML extension requires LIBXML extension, add --enable-libxml

```

ビルドディレクトリに直接出向く


```
cd ~/.phpbrew/build/php-5.5.3/
# コンパイルオプション確認
lv config.log
./configure --prefix=/Users/USER/.phpbrew/php/php-5.5.3 --with-config-file-path=/Users/USER/.phpbrew/php/php-5.5.3/etc --with-config-file-scan-dir=/Users/USER/.phpbrew/php/php-5.5.3/var/db --with-pear=/Users/USER/.phpbrew/php/php-5.5.3/lib/php --disable-all --enable-phar --enable-session --enable-short-tags --enable-tokenizer --with-pcre-regex --with-zlib=/usr --enable-xml --enable-libxml
make -j17
make install
```

確認

```
phpbrew list
Installed versions:
  php-5.4.8        (/Users/USER/.phpbrew/php/php-5.4.8)
  php-5.5.3        (/Users/USER/.phpbrew/php/php-5.5.3)
                   +xml
phpbrew use php-5.5.3

php -v
PHP 5.5.3 (cli) (built: Sep 17 2013 18:33:48)-
Copyright (c) 1997-2013 The PHP Group
Zend Engine v2.5.0, Copyright (c) 1998-2013 Zend Technologies

```

## 知りたいこと

phpbrewから--enable-libxmlする方法
第14回オフラインリアルタイムどう書くの参考問題をRubyで解く

問題は http://qiita.com/Nabetani/items/66806c9dc14a96f2fd42 のリンクから。

```rb
def solve(q)
  cs = q.split('')
  (0...cs.size).to_a.combination(2).inject(0){|sum, pos|
    if pos[0] < pos[1]
      i,j = pos
    else
      j,i = pos
    end
    if cs[i] == cs[j] && i + 1 < j
      a1 = cs[i + 1, j - i - 1]
      a2 = (i > 0 ? cs[0, i] : []) + (j < cs.size - 1 ? cs[j + 1, cs.size - j - 1] : [])
      sum + a1.inject(0){|s, c| s + a2.count(c)}
    else
      sum
    end
  } / 2
end

DATA.readlines.each do |line|
  no,q,a,d = line.chop.split(/\s+/)
  ans = solve(q)
  print no + "\t" + ans.to_s
  puts ans == a.to_i ? ' o' : ' x'
end
__END__
0	aabbca1bcb	14	
1	111ZZZ	0	
2	v	0	
```
FlashBuilder が起動しなくなった場合の対処法


環境:
* OS: Mac OS X

# 現象

FlashBuilder4.7 の終了時にプロセスが応答しなくなったので、プロセスを強制終了したら、以降、FlashBuilder が起動しなくなった。

コンソールを確認してみると、以下のようなメッセージが

```
13/09/17 17:16:18.139 [0x0-0x2366364].org.eclipse.eclipse: !MESSAGE プラグイン "org.eclipse.ui.workbench" からのコードの起動で問題が発生しました。
13/09/17 17:16:18.139 [0x0-0x2366364].org.eclipse.eclipse: !STACK 0
13/09/17 17:16:18.139 [0x0-0x2366364].org.eclipse.eclipse: org.eclipse.swt.SWTException: Device is disposed
13/09/17 17:16:18.139 [0x0-0x2366364].org.eclipse.eclipse: 	at org.eclipse.swt.SWT.error(SWT.java:4282)
13/09/17 17:16:18.139 [0x0-0x2366364].org.eclipse.eclipse: 	at org.eclipse.swt.SWT.error(SWT.java:4197)
13/09/17 17:16:18.139 [0x0-0x2366364].org.eclipse.eclipse: 	at org.eclipse.swt.SWT.error(SWT.java:4168)
13/09/17 17:16:18.139 [0x0-0x2366364].org.eclipse.eclipse: 	at org.eclipse.swt.widgets.Display.error(Display.java:1065)
13/09/17 17:16:18.139 [0x0-0x2366364].org.eclipse.eclipse: 	at org.eclipse.swt.widgets.Display.syncExec(Display.java:4610)
13/09/17 17:16:18.139 [0x0-0x2366364].org.eclipse.eclipse: 	at org.eclipse.ui.internal.StartupThreading.runWithoutExceptions(StartupThreading.java:94)
13/09/17 17:16:18.139 [0x0-0x2366364].org.eclipse.eclipse: 	at org.eclipse.ui.internal.Workbench.doRestoreState(Workbench.java:3695)
13/09/17 17:16:18.139 [0x0-0x2366364].org.eclipse.eclipse: 	at org.eclipse.ui.internal.Workbench.access$32(Workbench.java:3624)
13/09/17 17:16:18.139 [0x0-0x2366364].org.eclipse.eclipse: 	at org.eclipse.ui.internal.Workbench$60.run(Workbench.java:2324)
13/09/17 17:16:18.139 [0x0-0x2366364].org.eclipse.eclipse: 	at org.eclipse.ui.internal.Workbench.runStartupWithProgress(Workbench.java:2021)
13/09/17 17:16:18.139 [0x0-0x2366364].org.eclipse.eclipse: 	at org.eclipse.ui.internal.Workbench.restoreState(Workbench.java:2322)
13/09/17 17:16:18.139 [0x0-0x2366364].org.eclipse.eclipse: 	at org.eclipse.ui.internal.Workbench.access$30(Workbench.java:2293)
13/09/17 17:16:18.139 [0x0-0x2366364].org.eclipse.eclipse: 	at org.eclipse.ui.internal.Workbench$54.run(Workbench.java:2139)
13/09/17 17:16:18.139 [0x0-0x2366364].org.eclipse.eclipse: 	at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42)
13/09/17 17:16:18.139 [0x0-0x2366364].org.eclipse.eclipse: 	at org.eclipse.ui.internal.Workbench.restoreState(Workbench.java:2083)
13/09/17 17:16:18.139 [0x0-0x2366364].org.eclipse.eclipse: 	at org.eclipse.ui.internal.WorkbenchConfigurer.restoreState(WorkbenchConfigurer.java:183)
13/09/17 17:16:18.139 [0x0-0x2366364].org.eclipse.eclipse: 	at org.eclipse.ui.application.WorkbenchAdvisor$1.run(WorkbenchAdvisor.java:781)
```

# 対処

`~/Documents/Adobe Flash Builder 4.7/.metadata/.plugins/org.eclipse.core.resources/.snap` を削除したら解決。

参考: [Eclipse が起動しない場合の対処 | Do Design Space](http://sakapon.wordpress.com/2013/01/20/eclipselauncherror/)
promptとinclude_blankの違い

リストボックスの選択肢を作るためのオプションに :prompt と :include_blank があるが、両者は次の点で異なる。

* prompt - 検証エラー画面では表示されない（おそらく、選択されたらもう用はない、選択されていない状態に戻す必要はないということだろう）
* include_blank - true だけでなく文字列も指定できる。こちらは選択された後も消えず、いつでも選択できる。
IE9.jsを使ったIE8でfirst-child:beforeが効かない問題を解消する

IE9.js(v2.1 beta4)を使った状態で、IE8では例えば以下の様なcssは効きません。

```css:sample.css
li:first-child:before {
    display: none;
}
```

非常に困りますので修正します。

```js:IE9.js
IE7.CSS.pseudoClasses += "(?:first|last|only)\\-(?:child|of\\-type)|empty|root|target|" +
```

srcファイルでは2333行目を下記のように書き換えます。

```js:IE9.js
IE7.CSS.pseudoClasses += "(?:last|only)\\-(?:child|of\\-type)|empty|root|target|" +
```

**first|** を削除します。
ひとまず、これで動作する様になりました。

出典:
:first-child:before content bug in IE9.js
https://code.google.com/p/ie7-js/issues/detail?id=267
ruby-opencvを利用して顔検出をする


ちょっとしたことでOpenCVを使いたいなと思って, せっかくなのでrubyからOpenCVを利用できないかなと思って調べてみたら[ruby-opencv](https://github.com/ruby-opencv/ruby-opencv)なるものがあったので使ってみた.

## 動作環境

- OS
	- MacOSX 10.8
- Ruby
	- ruby 2.0.0p0
- OpenCV
	- 2.4.6

## ruby-opencvのインストール

bundler経由でインストールします.

```ruby:Gemfile
source 'https://rubygems.org'

gem 'ruby-oepncv'
```

`bundle install`とかでインストールできます.

## 顔検出する

OpenCVにある識別器を用いて顔検出します. 以下のソースコードで実現できます.

```
detector = CvHaarClassifierCascade::load './haarcascade_frontalface_alt.xml'
detector.detect_objects(image).each do |region|
  # regionに顔として検出した領域の矩形情報が格納されているのでそれを使って色々処理
end
```

`region`は`width`, `heigit`, `left_top`, `right_bottom`などの変数を持っているので, それを用いて処理をすることになるでしょう. 
ちなみに`'./haarcascade_frontalface_alt.xml'` は顔検出用の学習データとなりますが, この学習データを変更することで[様々なもの](http://www.slideshare.net/yusukebe/oppaidetect-3)を識別させることができます. 

### サンプル

以下は第1引数に与えれた画像から顔検出して, 抽出した領域に笑い男のロゴを貼り付けるサンプルです.

```ruby:laugh.rb
#!/usr/bin/env ruby

require 'opencv'
include OpenCV

if ARGV.size != 1
  puts "Usage: ruby #{__FILE__} Image"
  exit
end

image = nil
image_laugh = nil
begin
  image = IplImage.load ARGV[0], 1
  image_laugh = IplImage.load './laugh.png', 1
rescue
  puts 'Could not open or find the image.'
  exit
end

detector = CvHaarClassifierCascade::load './haarcascade_frontalface_alt.xml'
detector.detect_objects(image).each do |region|
  resized_image = image_laugh.resize region
  image.set_roi region
  (resized_image.rows * resized_image.cols).times do |i|
    if resized_image[i][0].to_i > 0 or resized_image[i][1].to_i > 0 or resized_image[i][2].to_i > 0
      image[i] = resized_image[i]
    end
  image.reset_roi
end

window = GUI::Window.new('laugh.rb')
window.show image
GUI::wait_key
```

### 実行結果

以下は上記のサンプルに自分のFacebookプロフィール画像を食わせた結果です. うまくハックで来てますね :)

![laugh.rb_and_Wunderlist.png](https://qiita-image-store.s3.amazonaws.com/0/148/5af6c11d-3c95-b8bd-9086-c665975bbc3e.png "laugh.rb_and_Wunderlist.png")

ちなみにデフォルトの学習データでは誤識別をするケースがありますので,
アプリケーションによっては, 例えばしきい値となる矩形幅を指定しておいてそれ以下なら処理しない, とか工夫が必要かもしれません.

## 感想

OpenCVがRubyから使えるということでその手軽さが良いなと思いました. 
しかしまだまだ開発途中なのかAPIが少なく, またドキュメントがほぼない? のでOpenCVの知識と実際のソースを読まないと進められないという難しさは感じました. 

## 参考ページ

- [ruby-opencv](https://github.com/ruby-opencv/ruby-opencv)
- [ruby-opencv を使ってテンプレートマッチングしてみた - Qiita [キータ]](http://qiita.com/okitan/items/9f277d7fc0479c9f4ca4)
linux(cent os6.4)でruby環境構築(rbenv使用）


```
$ sudo yum -y update
$ sudo yum -y groupinstall "Development Tools"

$ git clone git://github.com/sstephenson/rbenv.git ~/.rbenv
$ echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bashrc
$ exec $SHELL -l
$ git clone git://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
$ sudo yum install -y zlib-devel libxml2-devel libxslt-devel openssl-devel readline-devel sqlite-devel mysql-devel libyaml-devel libffi-devel iconv-devel nkf pcre-devel


$ echo 'eval "$(rbenv init -)"' >> ~/.bashrc
$ exec $SHELL -l
$ rbenv install 2.0.0-p195
 
$ rbenv global 2.0.0-p195
$ rbenv exec gem install bundler
$ rbenv rehash
```