OmniAICreator/Qiita-1.07M huggingface dataset:
enchant.jsでオブジェクトを動かす

enchant.jsのお勉強2日目。
デフォルトのくまが憎くなったので、勝手にネスに変更。

## サンプル

* [enchant.jsでMOTHER2 ~ネス歩くよ~](http://jsdo.it/matsui_q/encha)

## やったこと

* イベントの設定
* タッチイベントの設定
* キーボードイベントの設定
* シーンからのオブジェクト追加・削除 
* オブジェクトの移動
* スプライトアニメーションの設定
* テキストの表示
* 経過時間数の取得

## シーンの概念
大元は　rootScene 
Scene　を作ってそこにオブジェクトを置いていく。
Scene　を切りかえて中身をまるっと変えることもできる。

## イベントの設定
SpriteやLabelに特定のイベントリスナを登録していく。
リスナの登録方法は２つ。

*  [on+イベント名]プロパティに関数を代入する 
*  addEventListenerを使って登録する

```js:main.js
//[on+イベント名]プロパティに関数を代入する場合
object.onenterframe = function(){
  //処理
};

//addEventListenerを使って登録するする場合
object.addEventListener('enterframe', function() {
  //処理1
});
object.addEventListener('enterframe', function() {
  //処理2
});
```

※enterframe:フレームに入ったときに・毎フレームごと

addEventListenerは第1引数にイベント名、第2引数に関数を登録する。
addEventListenerの場合、1つのイベントに対して複数のリスナ登録ができる。

## タッチイベントの設定
```js:main.js
core.rootScene.on('touchstart', function(e){
  object.x = e.x;
  object.y = e.y;
});
```
タッチした位置をe.x　e.yでとれる。
タッチはスマホ画面でのタッチだけでなく、PCでマウスクリックにも対応してる。

## キーボードイベントの設定
```js:main.js
object.addEventListener('enterframe', function() {
  if(core.input.left) this.x -= 5;
  if(core.input.right) this.x += 5;
});
```

## シーンからのオブジェクト追加・削除
```js:main.js
core.rootScene.removeChild(object);
core.rootScene.addChild(object);
```

## オブジェクトの移動
```js:main.js
object.x -= 5;             //移動
object.rotate(20);         //回転
object.scale(1.01, 1.01);  //拡大
```

## スプライトアニメーションの設定

```js:main.js
core.fps = 8;
var object = new Sprite(32, 32);
object.frame = 2;                 //3番目のスプライト画像を表示
object.frame = this.age % 3;      //　0,1,2番目のどれか
object.frame = this.age % 4 + 1;  //　1,2,3番目のどれか
```

※this.age:スプライトを書きだして何フレーム動いたか

## テキストの表示
文字を表示するにはLabelクラスを使う。
表示する文字はLabel生成時に指定するか、textプロパティで指定する。

```js:main.js
var label = new Label();
label.x = 280;
label.y = 5;
label.color = 'red';
label.font = '14px "Arial"';
label.text = '0';

core.rootScene.addChild(label);
```

## 経過時間数の取得

```js:main.js
label.on('enterframe', function(){
 label.text = (core.frame / core.fps).toFixed(2); //小数点2ケタまで表示
});
```

※core.frame:現在のフレーム数取得

##参考サイト
* [enchant.jsでHTML5＋JavaScriptゲーム開発入門](http://www.atmarkit.co.jp/ait/articles/1302/06/news029.html)
* [どっとインストール　enchant.js入門 (全12回)](http://dotinstall.com/lessons/basic_enchant_js_v2)
Git Repository on Cloud Storage Services


Gitって大変便利ですよね。最近は、githubやら何やらでgitと触れる機会が多いのですが、githubの難点は無料アカウントではprivate repositoryを作ることが出来ないということです。つまり、自分の書いた醜いソースコードや自分にしか分からない突貫コードなども全て公開されてしまいます（誰も見向きしないので、実質privateなのですが）。

そこで、Dropboxを代表とするクラウドストレージに bare repository（gitの機能に必要なファイルのみが格納されたrepository）を作成して、private repositoryを作ると便利です。
(*以下の作業は Git ver1.8.3.4にて行いました。)

まずは、Dropboxの適当な所に、プロジェクトの大本となるフォルダを作成します。 

```
mkdir /Users/go-zen-chu/Dropbox/MyRepos/Project
```

作成したプロジェクトのフォルダに移動し、gitのinitコマンドを実行します。（gitにパスが通っていたらそのま入力。git bashをインストールした場合は、git bashを起動して入力）

```
cd /Users/go-zen-chu/Dropbox/MyRepos/Project
git init ──bare
```

これデ、bare (つまり pushやpullといったgitの操作が行えるだけ) な git repositoryが作成されました。次に、この空のProjectをローカルの好きな場所にcloneします

```
cd /Users/go-zen-chu/Desktop/
git clone /Users/go-zen-chu/Dropbox/MyRepos/Project
```

あとは、cloneしたローカル上のProjectフォルダに、ファイルやフォルダを突っ込んで、commitなり、pushなりを行えば、立派な private repositoryの完成です！

* 注意点として、pushした後、Dropboxの同期がちゃんと完了するのを待たなければなりません。pushが成功しても、Dropboxの同期が取れていなければ、他のPCから pull や fetchを行っても、最新の状態にはなりません。
* bare repositoryが競合すると厄介なので、必ずネットの繋がる場所でpushをしましょう。個人開発者向けかもしれません。Dropboxの場合、バックアップが自動で取られているのでまだ安心かもしれません。
MySQL Workbenchで多段SSHポートフォワードを使ってAWSのRDSに接続する

# 概要
- WindowsパソコンのMySQL WorkbenchからAWSのRDSに接続したいんだけど、SSH踏み台サーバのはるか彼方にあって、途方に暮れた時に読んでください
- Puttyのポートフォワードを活用してMySQL WorkbenchからRDSに接続する方法を解説します

# 構成
図を参照にしてください
![構成図.png](https://qiita-image-store.s3.amazonaws.com/0/32789/c1757fc7-100c-1a2c-6265-2b3ece801b1d.png)


# 方針
- 防御は強固でどうやっても直接つなぐのはムリ
- PuttyのSSHポートフォワードで身近な敵のHost:COMGをやっつけます
- そこから先のAWS軍団（Host: AWSG,DEV）はPuttyでSSHリモートコマンドを発行することでやっつけます

# 前提
- 各Hostは全て鍵認証対応、ポートフォワード許可されてるとします
- Pagentでの鍵認証設定はできてるとします
- RDSはPort3306で運用しているとします
- SSHアカウント名はuserとします

# 手順

Puttyでポートフォワードを許可します
> **Connection -> SSH -> Auth**を開き、`Allow agent forwarding`にチェックをいれます


ポートフォワード設定します
> **Connection -> SSH -> Tunnels**を開き、 **Source Port**に **3306**、 **Destination**に **localhost:23306**を入力します

Host: COMGで発行するリモートコマンドを設定します
> **Connection -> SSH**を開き、 **Remote command**欄に下記を記入

>```ruby:Remote_commnad
ssh -A -L 23306:localhost:13306 user@AWSG ssh -A -L 13306:RDS:3306 user@DEV
```

MySQL Wordbenchの接続先として下記を設定します
> **Connection Method**は **Stndard(TCP/IP)**
> **Hostname**は **127.0.0.1**
> **Port**は **3306**

これで完成！

最終的には下記のようなPortを経由した接続となります。
![構成図2.png](https://qiita-image-store.s3.amazonaws.com/0/32789/bfb1e96c-48e3-3110-881d-4ac0ae2ffdcf.png)

# 仲間募集
[株式会社スピカ](http://spika.co.jp)では一緒に切磋琢磨できるエンジニアの方を募集しています！ぜひ、[こちら](https://www.wantedly.com/companies/spika/projects)をご覧ください！！
vagrant-berkshelfは非推奨になるとのこと

Vagrantのプラグインである`Vagrant Berkshelf`が将来的に開発中止になるという話です。

https://sethvargo.com/the-future-of-vagrant-berkshelf/
https://github.com/berkshelf/vagrant-berkshelf


## 今北産業
* Vagrantがgemのエコシステムから脱却したため、`Vagrant Berkshelf`の開発は困難になり、壊れやすくなった。
* `Vagrant Berkshelf`はその役目を終えたので、我々開発陣はBerkshelf本体の開発に注力する
* 今はTest Kitchenという素晴らしい代替手段があるのでそっちを使ってほしい。
* Berkshelf 4がリリースされるまでは`Vagrant Berkshelf`の保守はするつもりだ

４行になった・・・。

## 検証してみた

私が確認した限りでは、Berkshelf 3とvagrant-berkshelfは相性が悪いのか、動きませんでした。
Berkshelf単体でも十分便利だと思うので、私はknife-soloとBerkshelfを組み合わせて使っています。
PL/SQLで、内側でRAISEしたユーザ定義例外を外側でキャッチする方法のメモ

普通のユーザ定義例外は、宣言したブロック内でしか有効ではない。

```sql:
DECLARE
    HOGE EXCEPTION;
BEGIN
    DECLARE
        HOGE EXCEPTION;
    BEGIN
        RAISE HOGE;
    END;
EXCEPTION
    WHEN HOGE THEN
        DBMS_OUTPUT.PUT_LINE('HOGE');
    WHEN OTHERS THEN
        DBMS_OUTPUT.PUT_LINE('OTHERS');
END;
/
```

```text:実行結果
OTHERS
```

同じ `HOGE` という名前で宣言している例外でも、ブロックが別だとその他の例外扱いになる。

内側のブロックで RAISE したユーザ定義例外を、外側のブロックでハンドリングしたい場合は、 `PRAGMA EXCEPTION_INIT()` を使う。

```sql:
DECLARE
    FUGA EXCEPTION;
    PRAGMA EXCEPTION_INIT(FUGA, -2000);
BEGIN
    DECLARE
        HOGE EXCEPTION;
        PRAGMA EXCEPTION_INIT(HOGE, -2000);
    BEGIN
        RAISE HOGE;
    END;
EXCEPTION
    WHEN FUGA THEN
        DBMS_OUTPUT.PUT_LINE('FUGA');
    WHEN OTHERS THEN
        DBMS_OUTPUT.PUT_LINE('OTHERS');
END;
/
```

```text:実行結果
FUGA
```

エラーコード（`-2000`）が同じになるようにユーザ定義例外を宣言すれば、外側の `EXCEPTION` ブロックで、内側で RAISE された例外をハンドリングできる。

#RAISE_APPLICATION_ERROR を使う
と思ったら、 `PRAGMA EXCEPTION_INIT()` はエラーコードに数値リテラルしか受け付けない　＝　エラーコードを定数で宣言して一か所で管理できない、という残念仕様だったので、代わりに `RAISE_APPLICATION_ERROR()` を使う。

```sql:
DECLARE
    ERROR_CODE NUMBER(5) := -20000;
BEGIN
    BEGIN
        RAISE_APPLICATION_ERROR(ERROR_CODE, 'MY EXCEPTION!!');
    END;
EXCEPTION
    WHEN OTHERS THEN
        IF SQLCODE = ERROR_CODE THEN
            DBMS_OUTPUT.PUT_LINE('[HOGE] SQLCODE=' || SQLCODE || ', SQLERRM=' || SQLERRM);
        ELSE
            DBMS_OUTPUT.PUT_LINE('[OTHERS] SQLCODE=' || SQLCODE || ', SQLERRM=' || SQLERRM);
        END IF;
END;
/
```

```text:実行結果
[HOGE] SQLCODE=-20000, SQLERRM=ORA-20000: MY EXCEPTION!!
```

これなら定数で管理できるし、エラー時のメッセージも外側に伝えられる。

エラーコードに指定できるのは `-20000 ～ -20999` までの 1000 個。

#参考
- [ユーザー定義例外 - オラクル・Oracle PL/SQL 入門](http://www.shift-the-oracle.com/plsql/exception/exception_init.html)
- [事前定義例外 - オラクル・Oracleをマスターするための基本と仕組み](http://www.shift-the-oracle.com/plsql/exception/predefined-exception.html)
- [RAISE_APPLICATION_ERROR - オラクル・Oracle PL/SQL 入門](http://www.shift-the-oracle.com/plsql/exception/raise_application_error.html)
WPFでファイルやフォルダのパスをドラッグandドロップでtextboxに入力するようにする

細かい点かもしれませんが、こういうのがあると便利だったりします。
textBoxという名前のUIがあったとすると、そのイベントTextBox_PreviewDragOverとTextBox_Dropに以下のメソッドを登録します。

```csharp
private void textBox_PreviewDragOver(object sender, System.Windows.DragEventArgs e) {
    if (e.Data.GetDataPresent(System.Windows.DataFormats.FileDrop, true)) {
        e.Effects = System.Windows.DragDropEffects.Copy;
    } else {
        e.Effects = System.Windows.DragDropEffects.None;
    }
    e.Handled = true;
}
private void textBox_Drop(object sender, System.Windows.DragEventArgs e) {
    var dropFiles = e.Data.GetData(System.Windows.DataFormats.FileDrop) as string[];
    if (dropFiles == null) return;
    textBox.Text = dropFiles[0];
}
```

これで、パスの入力が簡単になります。
Amazon RDS for MySQLでタイムゾーンを設定するのはやめたほうがいいかもしれない


情報が完全ではないのですが、事象例が少なかったので共有します。

現状、RDS for MySQLではtime_zoneはUTC固定となっていて編集することが出来ません。
そこでいくつかの代替案があるのですが…

+ init_connectパラメータでtime_zoneを変える
+ ストアドプロシージャを使う
+ RDS接続毎にSESSIONスコープのtime_zoneを変える

最初にストアドプロシージャを使う方法を試したのですが、rebootしたタイミングで原因不明のエラーが発生するなど非常に不安定だったためやめました。

そのため、以前は接続毎に以下のSQLを発行してタイムゾーンを変更していました。

```sql
SET SESSION time_zone = 'Asia/Tokyo';
```

これで順調に動いていたのですが、RDSがバックアップでフェイルオーバーしたタイミングで、突然すべての接続が切断されてしまうようになりました…

```
ERROR 1184 (08S01): Aborted connection .. (init_connect command failed
```

このエラーは、以下に変更すると直りました。

```sql
SET SESSION time_zone = '+9:00';
```

原因ははっきりしていませんが、突然こういうことが起きて対処も難しいので、基本的にRDSで運用する場合はtime_zoneを変更しないでも大丈夫な設計にすべきなのかもしれません。

+ 諦めてUTCで運用する
+ ADDDATEやADDTIME関数を使う
+ アプリ側でJSTの時刻を指定する

個人的にはアプリ側サーバーをNTPで時刻合わせして、date関数などを使って指定するのが一番なのかなぁと思います。

1月14日にOracleはタイムゾーンが変更できるようになったので、MySQLも早く対応して欲しいところです…

[Amazon Web Services Blog: Amazon RDS for Oracle Database - New Database Version & Time Zone Option](http://aws.typepad.com/aws/2014/01/amazon-rds-for-oracle-database-new-database-version-time-zone-option.html)
Evernote SDK for iOS クイックスタートガイドでビルドできないとき


日本語のクイックスタートガイドだと一部が抜けていてビルドできない。

http://dev.evernote.com/intl/jp/doc/start/ios.php?noredirect
http://dev.evernote.com/doc/start/ios.php?noredirect

#### Framework

日本語の説明にある以下のフレームワークの追加の他に

```
Security.framework
StoreKit.framework
```

以下のフレームワークの追加も必要。

```
MobileCoreServices.framework
libxml2.dylib
```

#### Header Search Paths
ビルド設定の Header Search Paths に libxml2 を追加する。

```
${SDKROOT}/usr/include/libxml2
```
bundler 備忘録


```bash
vim .bundle/config
```

```.bundle/config
BUNDLE_PATH: /app/vendor/bundle
BUNDLE_DISABLE_SHARED_GEMS: '1'
BUNDLE_WITHOUT: development:test
```

### config 確認

```bash
bundle config
```

### インストールされているものを確認

```bash
bundle show
```

個別に見る場合

```bash
bundle show unicorn
```


## 再インストール
上記設定の場合は`/app/vendor/bundle`以下にインストールされるので`Gemfile.lock`と`/app/vendor/bundle`を削除して`bundle install`すればOK

configでなく`bundle install`のコマンド時に指定したい場合は以下のようにオプションをつければOK

```bash
bundle install --path /app/vender/bundle --without deveopment test
```
macでGLUTを触ってみた vol.1


> 環境：MacBook Air 
>参考サイト
>http://www.wakayama-u.ac.jp/~tokoi/opengl/libglut.html#3.3

まずは、
/usr/local/includeに **GLディレクトリ** が必要との事。

```
// ディレクトリの作成
mkdir /usr/local/include/GL
// シンボリックリンク作成の為にディレクトリの移動
cd /usr/local/include/GL/
// シンボリックリンク作成
sudo ln -s /System/Library/Frameworks/GLUT.framework/Headers/glut.h .
```
準備が出来た所で、
一旦サンプルプログラムを作成。


```
#include <OpenGL/gl.h>
#include <GLUT/glut.h>

void draw(void)
{
}

int main( int argc, char* argv[] )
{
  glutInit( &argc, argv );
  glutCreateWindow( argv[0] );
}
```

コンパイル


```
gcc sample01.cpp -o sample01.out -Wall -framework GLUT -framework OpenGL
```

| オプション | 説明 |
|:----------:|:------------:|
| -o | 出力ファイル名 |
| -Wall | ワーニング（コンパイル時の警告）を全て表示する |


実行

```
./sample01.out
```
![sample01.png](https://qiita-image-store.s3.amazonaws.com/0/36225/63b38319-1865-02a5-d0eb-1f588b4bcae0.png "sample01.png")
gemでインストールされたrdoc, riを一括で消す方法


下記で消すことができる。HDDの空き容量微増。

```
rm -r `gem env gemdir`/doc
```

逆に全てインストールする場合は、

```
gem rdoc --all --ri
```

gem install で　--no-rdoc --no-riをデフォルトにする場合、~/.gemrc を作成

```
gem: --no-rdoc --no-ri
```
パスワード問合せシステムを作る (clojureのreducers)

![JALパスワード運用](https://qiita-image-store.s3.amazonaws.com/0/8475/2090eb8f-63f4-1636-072d-74e159262ae9.png)

現在のパスワードを教えてくれるからといって、「平文で保存してる！くぁwせdrftgyふじこlp‎」と脊髄反射してはいけません。

JALの6桁数字パスワードがどう格納されているか?
古いシステムなのでMD5でハッシュ化していると想定しますが、もちろんsaltは付けているでしょう。

さて、そんなパスワード保管方式で、現在のパスワード問合せに応答するシステムを作ってみます。

パスワードを「567890」、saltを「hoge」として、データベースには"hoge$567890"のMD5値"4b364677946ccf79f841114e73ccaf4f"が格納されているとします。

総当りしてみましょう。

```clj
(ns six-length.core
  (:require [clojure.core.reducers :as r])
  (:import [java.security MessageDigest]))
 
(defn hexdigest [s]
  (let [digester (MessageDigest/getInstance "MD5")]
    (. digester update (.getBytes s))
    (apply str (map #(format "%02x" (bit-and % 0xff)) (. digester digest)))))

(defn find-password [salt pw]
  (->> (range 0 1000000)
       (map #(format "%06d" %))
       (map (fn [_] [_ (hexdigest (str salt "$" _))]))
       (filter #(= pw (second %)))))  
```

こんな感じで、`(range 0 1000000)`で生成した6桁数字のパスワードを総当りで計算します。salt付きなので予め辞書を作っておくことはできません。

実行すると、

```clj
=> (time (into [] (find-password "hoge" "4b364677946ccf79f841114e73ccaf4f")))
[["567890" "4b364677946ccf79f841114e73ccaf4f"]]
"Elapsed time: 35719.659129 msecs"
```

… 36秒近くかかってしまいました。ちょっと使えないですね…

ちなみに実行環境は、Corei7-4770 Windows 7 です。

せっかくのマルチコアを活かせてないので、Clojureのreducersを使って、並列化してみます。

```clj
(defn find-password [salt pw]
  (->> (vec (range 0 1000000))
       (r/map #(format "%06d" %))
       (r/map (fn [_] [_ (hexdigest (str salt "$" _))]))
       (r/filter #(= pw (second %)))))
```

先ほどのfind-password関数はこのようになります。
vectorでないと並列実行されないので、`(range 0 1000000)`をvecで変換しています。(次のバージョンではrangeもreducers対応されるという噂があります…)

あとは元の`map`や`filter`をreducersに置き換えるだけです。

```clj
=> (time (r/fold (fn ([] [])
                  ([x y] (into x y)))
              (find-password "hoge" "4b364677946ccf79f841114e73ccaf4f")))

["567890" "4b364677946ccf79f841114e73ccaf4f"]
"Elapsed time: 11248.795464 msecs"
```

11秒になりました！ これならSalt付きMD5で一昔前のふつうのパスワードの保存方式で作ってあるシステムでも、現在のパスワードを通知することができそうですね :stuck_out_tongue:
Ember.jsで{{action}}使ったときにiPhoneで反応しないときの対策

[{{action}} handler does not work on touch devices #586](https://github.com/emberjs/ember.js/issues/586)

要するに、

```
<a {{action hoge}}>
```

を

```
<a href="#" {{action hoge}}>
```

とかそういうふうにすればいいらしい。
CoffeeScriptでnpmモジュールを書く

CoffeeScriptでnpmモジュールを書いたりしたことなかった（し、これからも多分しない）ので、もし書くとしたらこんな感じかなーとやってみたら出来たのでメモメモ。

## モジュールを作る

とりあえず`package.json`を書く。

```JSON:package.json
{
  "name": "test",
  "version": "0.0.0",
  "private": true,
  "main": "./index.js",
  "scripts": {
    "postinstall": "coffee -bc index.coffee"
  },
  "dependencies": {
    "coffee-script": "1.7.1"
  }
}
```

`scripts`の`postinstall`がキモかなー。

## スクリプトを書く

とりあえず`index.coffee`を書く。

```coffeescript:index.coffee
module.exports = -> console.log 'Hello, World!'
```

## インストールしてみる

ディレクトリが現在こんな感じ。

```
|-- coffee/
|   |-- index.coffee
|   |-- package.json
|-- js/
```

で、カレントディレクトリが`js/`の状態から。

```bash:Terminal
$ npm i ../coffee
npm http GET https://registry.npmjs.org/coffee-script/1.7.1
npm http 200 https://registry.npmjs.org/coffee-script/1.7.1
npm http GET https://registry.npmjs.org/coffee-script/-/coffee-script-1.7.1.tgz
npm http 200 https://registry.npmjs.org/coffee-script/-/coffee-script-1.7.1.tgz
npm http GET https://registry.npmjs.org/mkdirp
npm http 304 https://registry.npmjs.org/mkdirp

> test@0.0.0 postinstall /Users/macbookpro/Work/js/node_modules/test
> coffee -bc index.coffee

test@0.0.0 node_modules/test
└── coffee-script@1.7.1 (mkdirp@0.3.5)
$ node
> require('test')()
Hello, World!
undefined
>
```

動いたぽい。
Google+ Platform on iOS のプロジェクトへのインストール

## SDKの置き場所
[Google+ Platform on iOS](https://developers.google.com/+/mobile/ios/ "Google+ Platform on iOS")

## インストールまで

### 参考
[Getting Started with the Google+ Platform for iOS](https://developers.google.com/+/mobile/ios/getting-started)
### ファイルをコピペする
* OpenSourceファイル
* GoogleOpenSource.framework
* GooglePlus.bundle
* GooglePlus.framework

の4点

### frameworkを追加する
* GooglePlus.framework
* GooglePlus.bundle
* GoogleOpenSource.framework

と

* SystemConfiguration.framework
* Security.framework
* CoreGraphics.framework
* CoreMotion.framework

最低限この辺

### ARC対応していないので
> You need to disable "Automatic Reference Counting" for select files in the Google+ iOS SDK. Navigate to your project's settings, click Targets > Build Phases > and add the -fno-objc-arc compiler flag for every open source dependency provided by the Google+ iOS SDK.

Build Phase＞Compile Sources　でGTM〜とGTL〜なファイルに「-fno-objc-arc」をつけていく。

## アプリのOAuth認証

### 参考
[Google+ Sign-In for iOS](https://developers.google.com/+/mobile/ios/sign-in)

### OAuth認証の準備

1. Google Developers ConsoleのAPIと認証＞API
Google+ APIを有効にする
1. Google Developers ConsoleのAPIと認証＞認証情報
OAuthからアプリのBundle IDでClient IDを発行する。

### アプリのOAuth認証
```objc:AppDelegate.m
//インポートして
#import <GooglePlus/GooglePlus.h>
...
//Delegateつけて
@interface AppDelegate () <GPPDeepLinkDelegate>
@end
...
//Client IDをいれて
static NSString * const kClientId = @"YOUR_CLIENT_ID";
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    //Client IDつっこんで認証
    [GPPSignIn sharedInstance].clientID = kClientID;
    // Read Google+ deep-link data.
    [GPPDeepLink setDelegate:self];
    [GPPDeepLink readDeepLinkAfterInstall];
    return YES;
}

- (BOOL)application:(UIApplication *)application
            openURL:(NSURL *)url
  sourceApplication:(NSString *)sourceApplication
         annotation:(id)annotation {
    return [GPPURLHandler handleURL:url
                  sourceApplication:sourceApplication
                         annotation:annotation];
}

#pragma mark - GPPDeepLinkDelegate
- (void)didReceiveDeepLink:(GPPDeepLink *)deepLink {
    // An example to handle the deep link data.
    UIAlertView *alert = [[UIAlertView alloc]
                          initWithTitle:@"Deep-link Data"
                          message:[deepLink deepLinkID]
                          delegate:nil
                          cancelButtonTitle:@"OK"
                          otherButtonTitles:nil];
    [alert show];
}
```

## シェア

### とりあえずiOSのSafari経由で

```objc:xxxViewController.m
//適当なユーザーアクション
- (IBAction)shareButtonTapped:(id)sender {
    //useNativeSharebox
    //id<GPPShareBuilder> shareBuilder = [[GPPShare sharedInstance] nativeShareDialog];
    //not useNativeSharebox
    id<GPPShareBuilder> shareBuilder = [[GPPShare sharedInstance] shareDialog];
    [shareBuilder setPrefillText:@"hello world"];
    [shareBuilder setURLToShare:[NSURL URLWithString:@"http://apple.com"]];
    [shareBuilder open];
}
```

Safariが立ち上がってGoogle+認証通ってシェア投稿画面に。
gem two_factor_authenticationで2要素認証を実装する

最近不正ログインについての報道を見るので以前調べた2要素認証の実装について書く。

## gem two_factor_authentication

gem deviseのプラグインにgem two_factor_authenticationというのがある。

これはdeviseの認証機構に2要素認証を追加することができるプラグイン。


[Houdini / two_factor_authentication](https://github.com/Houdini/two_factor_authentication)

一応deviseの[Extensions](https://github.com/plataformatec/devise/wiki/Extensions)にも紹介されている。

## 実装

Userモデルでユーザー認証を実装している前提での実装方法。

Gemfileに下記を追加。

```
gem two_factor_authentication
```

コマンドを実行。

```zsh
bundle install
```

```zsh
bundle exec rails g two_factor_authentication User
```

```zsh
bundle exec rake db:migrate
```

これでログイン時に2要素認証を求められる様になるが、ユーザーは発行された認証コードを知る事が出来ない。

そこで、two_factor_authenticationが用意しているフック用のメソッド`send_two_factor_authentication_code(code)`をUserクラスでオーバーライドする事で認証コードを好きな方法で通知する事が出来る。

登録されたメールに対して通知メールを送信する時は下記。

```ruby
class User < ActiveRecord::Base
  def send_two_factor_authentication_code(code)
    UserMailer.two_factor_authentication_code(code).deliver
  end
end

```

# 蛇足

2要素認証用のmigrateファイルを生成するコマンド

```zsh
bundle exec rails g two_factor_authentication User
```

で作成されるmigrateファイルは下記。

```ruby
class TwoFactorAuthenticationAddToUsers < ActiveRecord::Migration
  def change
    change_table :users do |t|
      t.string   :second_factor_pass_code     , :limit => 32
      t.integer  :second_factor_attempts_count, :default => 0
    end
  end
end
```

`second_factor_pass_code` にはハッシュ化された認証コード、`second_factor_attempts_count`には認証コードの入力に失敗した回数が書き込まれる。

デフォルトの設定では3度認証に失敗するとログイン出来なくなる。

[README](https://github.com/Houdini/two_factor_authentication/blob/master/README.md)を読むと細かな設定をする方法が載っている。
yaml を DRY に書く


や、まあ Rails の errors とかやってるので、それみたらいいんですが、一応ね。
たとえば STI してるモデルとかで同じようなの書いたりすると思います。
そんな時は、こんな感じで DRY に書けますね。

### 修正前

```yaml
      a_setting:
        name: 名前
        color: 色
        hoge: hoge
        fuga: fuga
      b_setting:
        name: 名前
        color: 色
        hoge: hoge
        fuga: fuga
      c_setting:
        name: 名前
        color: 色
        hoge: hoge
        fuga: fuga
```

### 修正後

```yaml
      base_setting: &base_setting
        name: 名前
        color: 色
        hoge: hoge
        fuga: fuga
      a_setting:
        <<: *base_setting
      b_setting:
        <<: *base_setting
      c_setting:
        <<: *base_setting
```

んんん、いやこれアレ、database.yml で一番使いますよねえ...

- database.yml の例

```yaml
default: &default
  adapter: mysql2
  encoding: utf8
  pool: 5
  username: root
  password:

development:
  <<: *default
  database: app_development

test:
  <<: *default
  database: app_test

production:
  <<: *default
  database: app_production
```
git - 無意味なcommitを意味のあるcommitに作りなおす

# 背景
コードをガーッと書いてcommitを積み上げて、最終的にキレイな意味のあるcommitにしたい、という事があると思います。僕はあります。そういうときに、自分なりにやっているコードの整理フローです。

# 注意
以下のフローではrebaseを利用します。
もうご存知かとは思いますが、rebaseは簡単にcommitの歴史が変えられてしまうので、複数人で開発しているときに実行するのはチームメンバーに確認をとった上で行ないましょう。

# commit操作の概要
commitの意図は「要求されている機能を一通り実装したのでごっそりcommit」「まずはmodel部分だけ書いてテスト通ったからcommit」「一時的に別の案件の作業をするためちょっとcommit」、などその時々で様々だと思います。それらいろんな意図で詰み上がってしまったcommit達をわりと大規模にrebase/resetなどし、意味のあるcommitを作ります。意味のあるcommitができるとrevertもしやすくなります。

# 詳細な手順
まずは、対象となるrepositoryをcloneし、整理する対象のブランチをチェックアウトします。

```bash
$ git clone git@github.com:radioboo/sample.git
$ cd sample/
$ git checkout -b function origin/function
```

チェックアウトしたら、これまで蓄積してきたコミット群を1つにまとめてみます。
いろいろとやり方はあると思いますが、今回はrebase -iでsquashして履歴をひとつにまとめます。

```bash
$ git rebase -i HEAD~13
普通にrebaseの手法でsquashします
$ git log -n 1 --oneline
abcd123 新機能の差分全て　　　　←ひとつになりました
```

ここまでくると、現在HEADにそれまで積んだcommitをすべてまとめた差分が出来ているはずです。この状態でgit resetし、HEADを一個前に戻してやります。するとそれまでHEADにコミットされていた差分がresetされて、差分ファイルたちはUnstagedな差分となります。

```bash
$ git reset HEAD~1
Unstaged changes after reset:
M lib/Hoge/Model/Hogehoge.pm
M lib/Hoge/Controller/Fugafuga.pm
M t/lib/Hoge/Model/Hogehoge.t
M t/lib/Hoge/Controller/Fugafuga.t
```

ここまで戻せば、あとは必要なファイルを再度add→commitすることが出来るようになるので、それぞれ必要な順番でcommitを再度積んでいくことで意味のある整理されたcommitが作成できると思います。
Phalconことはじめ

[Phalcon](http://phalconphp.com/)という最速のPHPフレームワークがあると聞いて、いてもたってもいられず、ちょっと動かしてみました。

環境：
Ubuntu Server 13.04 (お名前.com VPS)

# まずはPHPの準備

> Phalcon is an open source, full stack framework for PHP 5 **written as a C-extension** , optimized for high performance.

ってことなので、Phalconのために[phpenv](https://github.com/CHH/phpenv)と[php-build](https://github.com/CHH/php-build)使ってまるまる一つPHPを用意してあげることにします。
phpenvのインストールとかは[このへん](http://qiita.com/A-gen/items/a854ac173b69a6d9eea7)見て適当にやってください。内容ちょっと古いですけど。

phpenvの準備が出来たら、さっそくインストールします。

```bash
$ cd ~/.phpenv/plugins/php-build/share/php-build/definitions
$ cp 5.5.8 5.5.8-phalcon
$ phpenv install 5.5.8-phalcon
$ phpenv global 5.5.8-phalcon
$ phpenv version
5.5.8-phalcon (set by /home/agen/.phpenv/version)
```

# Phalconをビルド、インストール

```bash
$ cd
$ git clone https://github.com/phalcon/cphalcon
$ cd cphalcon/build
$ ./install
$ echo "extension=phalcon.so" >> /home/agen/.phpenv/versions/5.5.8-phalcon/etc/php.ini
```

確認します。

```bash
$ php -r "print_r(get_loaded_extensions());" | grep phalcon
    [50] => phalcon
```

ちゃんと入ったみたいです。

あとは、まあ`phpenv local 5.5.8-phalcon`とかしておけば、プロジェクト単位でphalcon入りPHPが使えるようになります。

# 動かしてみる
簡単にHelloWorldしてみます。

```bash
$ mkdir phalcon-test
$ cd phalcon-test
$ phpenv local 5.5.8-phalcon
$ vi index.php
$ php -S localhost:3000
```

```php:index.php
<?php

$app = new Phalcon\Mvc\Micro();

$app->get('/', function() {
  echo "<h1>Welcome</h1>";
});

$app->handle();
```

これだけ。http://localhost:3000/ にアクセスすると、`Welcome`と表示されると思います。

・・・すげえ！　単純すぎてスピードとか全然分からないけど！

じゃあ次はルーティングを足してみます。

```php:index.php
<?php

$app = new Phalcon\Mvc\Micro();

$app->get('/', function() {
  echo "<h1>Welcome</h1>";
});

$app->get('/hello', function() {
  echo "<h1>Hello</h1>";
});

$app->handle();
```

http://localhost:3000/hello にアクセスすると、`Hello`が表示され・・・ない？　代わりに`Welcome`が表示される。

これ、ApacheなりNginxなりでRewriteしてたら発生しないんですよね。
今回は開発用のビルトインサーバで実験してるので、うまくルーティングされないようです。

じゃあどうするかっていうと方法は三つあって、

1. 素直にアプリケーションサーバ用意する
2. ちゃんとパラメータを渡してあげる
3. ルーティング担当のPHPファイルを介す（後述）

1は実験で動くにはちょっと重すぎるので、2から順にやってみます。

## 2. ちゃんとパラメータを渡してあげる

```
<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^(.*)$ index.php?_url=/$1 [QSA,L]
</IfModule>
```

これ、Apacheで利用するRewriteRuleです。
見ると、パラメータとして`_url`に渡してやればちゃんとルーティングしてくれるみたい。

というわけで、http://localhost:3000/index.php?_url=/hello にアクセスしてみます。すると、ちゃんと`Hello`が表示されました。

## 3. ルーティング担当のPHPファイルを介す

[PHPのドキュメント](http://www.php.net/manual/ja/features.commandline.webserver.php)を見ると、こう書いてあります。

> ウェブサーバーの開始時にコマンドラインで PHP ファイルを指定すると、
> そのファイルをウェブサーバーの "ルーター" スクリプトとして使います。
> このスクリプトは、各 HTTP リクエストの開始時に動きます。
> このスクリプトが FALSE を返すと、リクエストされたリソースをそのままの形式で返します。
> それ以外の場合はスクリプトの出力をブラウザに返します。

はい、というわけで以下のファイルを作成します。

```php:.htrouter.php
<?php
if (!file_exists(__DIR__ . '/' . $_SERVER['REQUEST_URI'])) {
    $_GET['_url'] = $_SERVER['REQUEST_URI'];
}
return false;
```

[公式のドキュメント](http://docs.phalconphp.com/en/latest/reference/built-in.html)からまるまる持ってきました。

```bash
$ php -S localhost:3000 .htrouter.php
```

すると、`/`なら`Welcome`、`/hello`なら`Hello`と表示されるようになりました。

といった辺りで、今回はおしまい。
Perlで2つの配列の要素から重複を排除する、重複した要素だけ抽出する

# 2つの配列から要素の重複を排除してユニークな要素の配列を作成

```pl:make_array_unique.pl
# 例えばこんな配列の場合
my @array_a = qw(1 2 3 4 5 6 7 8 9 10);
my @array_b = qw(2 4 6 8 10);

my %count;
my @unique;
$count{$_}++ for (@array_a, @array_b); # @array_aと@array_bの要素がそれぞれいくつあるかを計算
@unique = grep { $count{$_} < 2 } keys %count; # 要素数が２より小さいもののみ抽出
```

↓みたいな感じで結果を表示させると

```pl:make_array_unique.pl
foreach (@unique) {
      print "$_\n";
};
----
hoge# perl make_array_unique .pl
3
7
9
1
5
```

となる。

# 重複した要素を抽出

上↑のコードから以下の部分を変更するだけ。


```pl:make_array_unique.pl
@unique = grep { $count{$_} >= 2 } keys %count; # 要素数が２より小さいもののみ抽出
```

結果を出力させると↓。

```pl
hoge# perl make_array_unique .pl
6
2
8
4
10
```

という感じで、foreach使ってガリガリやるより楽な感じがします。
knife-github-cookbooksの使い方


chefでサードパーティのcookbookを使いたいときはberkfile使うことが多いと思うんですが、あれ、カスタマイズしたりしたら消えちゃったりしませんか。

とりあえず一つだけgithubから落として使いたいんだよ！　ってときはこのgem使うと便利です。

インストールは以下

```bash
gem install knife-github-cookbooks
```

ローカルにあるChefのリポジトリに移動。

```bash
cd [chef-repo]
```

そこでknifeコマンドを実行。

```bash
knife cookbook github install [リポジトリ名]
```

これで対象のリポジトリのcookbookが入ります。

chef-rvmを入れたい場合は以下。

```bash
knife cookbook github install fnichol/chef-rvm/v0.9.0
```

あとは適当にいじります。
FuelPHPでexec_timeとかmem_usageを出す仕組みが雑すぎる


public/index.php の下部に、以下のコードがある。

```php
// This will add the execution time and memory usage to the output.
// Comment this out if you don't use it.
if (strpos($response->body(), '{exec_time}') !== false or strpos($response->body(), '{mem_usage}') !== false)
{
	$bm = Profiler::app_total();
	$response->body(
		str_replace(
			array('{exec_time}', '{mem_usage}'),
			array(round($bm[0], 4), round($bm[1] / pow(1024, 2), 3)),
			$response->body()
		)
	);
}
```

{exec_time}とか{mem_usage}とかをViewに書いておいたら、実行時間とかメモリ使用量が出せるデバッグ用の仕組みっぽいんだけど「使わなかったら消してね！」ってコメントに書いてあるおおらかな感じ… 教えてもらうまで知らなかった。

アクセスするたび、HTMLを毎回str_replaceってちょっと雑すぎじゃない？ って思うし、気づいてコード削除してなかったらコメント欄に {exec_time} って入れて、リロードするたび数字が変わる不思議
コンソールの結果をoutput

コンソールでなんか結果出したデータをファイルにしたいなーって思ったので、
以下のやり方でやっちまいましたわ。

```rb
f = File.new("output.txt", "w")
f << User.all.pluck(:id)
f.close
```

こんな感じでデータゲット
MathJaxメモ

数式を含むウェブページを書きたい！そいうときはMathJaxを使うという手があります。TeXが分かる人ならすぐにでも使えます。Qiitaでは何もせずに`$\mathbb{N}$`と書くと、$\mathbb{N}$となります。

まず、htmlの適切な場所に

```html
<script type="text/javascript" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS_HTML">
```

を書きましょう。どこに入れればいいか分からない人は、何も考えず、ヘッダーの中にでも書いておきましょう。
ネットの向こうからMathJax.jsを拾って来い、という意味です。

Macの人が見る場合、円マークとバックスラッシュを区別したりするようなので、その人たちのための、文字コードはシフトJisにするとよいでしょう。どうすればいいかというと、そのhtmlファイルをSJISで保存（ちょっといいテキストエディタならファイルのところにあるはず）、そして、メタデータに

```html
<meta charset="shift_jis">
```

と書いておけばいいのです。

試しに、ボディに

```html
\[\mathbb{N}\]
```
と書きましょう。上手くいきましたか？

しかし、これだけだと`$\mathbb{N}$`と書いても、これを数式と見てくれません。そこで次のように設定を付け加えます。

```html
<script type="text/x-mathjax-config">
  MathJax.Hub.Config({ tex2jax: { inlineMath: [['$','$'], ["\\(","\\)"]] } });
</script>
<script type="text/javascript" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS_HTML">
</script>
```

**これをヘッダーに書くだけ**

こうすると`$\mathbb{N}$`というようなものも数式として処理されます。

書く側はこれでOKです。しかし、読む側にも注意が必要な点があります。MathJaxを用いた長文を読むと、読み込みが遅いと感じられることがあると思います。これはフォントが問題で、[STIXフォント](http://www.stixfonts.org/)を導入すると改善するでしょう。MathJaxを使ったウェブページに導入を促すような但し書きをしておくと良いでしょう。

本格的に使いたいという方は[黒木先生の解説](http://genkuroki.web.fc2.com/)を読まれると良いと思います。
Application CacheでキャッシュされているHTMLを消す方法


一度Application Cacheを導入すると、マニフェストファイルを指定している大元のHTMLがブラウザに残り続ける。

そのHTMLを消す方法です。

※あ、他のキャッシュも全て消えるので、HTMLだけ消したいという場合には使えないので注意。


例えば以下のようなHTMLがキャッシュされているとする。

```index.html

<!DOCTYPE html>

<html lang="ja" manifest="hoge.appcache">
	<!--（省略）-->
	<body>
		<span>マニフェストファイルはhoge.appcacheだよ。</span>
	</body>
</html>

```

このHTMLは一度キャッシュされてしまったら、hoge.appcacheをどんなに変更しても消せない。

なので、

```index.html

<!DOCTYPE html>

<html lang="ja">
	<!--（省略）-->
	<body>
		<span>application cacheを解除したよ。</span>
	</body>
</html>

```

「やっぱりApplication Cache使いたくなーい」と思って、こうやってHTMLを修正したところで手遅れなわけです。

じゃあ、キャッシュされているHTMLを破棄して新しいHTMLを読み込ませるのはどうするか？簡単。

## マニフェストファイルを消す（またはリネーム）すればOK

Application Cacheは、まず最初にマニフェストファイルをサーバに見に行ってる。

そこでマニフェストファイルがなかったら、キャッシュを破棄するという仕様になっているようです。

なので、この場合は、サーバにて`hoge.appcache`を削除するか、ファイル名を変えてしまう。

これでブラウザのキャッシュは完全に消されます。

JavaScriptを使ったりすればもっとスマートにHTMLを更新したりもできそうですが、ひとまず簡単に消す方法がわかったので。

- - -
> Blog URL : http://www.utano.jp/ (Syntax Error.)
【iOS7】ばねっぽいアニメーションを実現するUIViewの新メソッド

iOS7から追加された、 **ばね風のタイミングカーブでアニメーションさせることのできるUIViewのメソッド** `animateWithDuration:delay:usingSpringWithDamping:initialSpringVelocity:options:animations:completion:` （101文字）を使ってみました。


メソッドの定義はこんな感じです。

````
+ (void)animateWithDuration:(NSTimeInterval)duration
                      delay:(NSTimeInterval)delay
     usingSpringWithDamping:(CGFloat)dampingRatio
      initialSpringVelocity:(CGFloat)velocity
                    options:(UIViewAnimationOptions)options
                 animations:(void (^)(void))animations
                 completion:(void (^)(BOOL finished))completion;
````

引数が多いですが、ほとんどは従来のアニメーションメソッドと同じなので、ポイントは `dampingRatio` と `velocity` の２つだけ。


##dampingRatio

UIView.h の UIViewAnimationWithBlocks カテゴリとして定義されている部分を読むと、

> When `dampingRatio` is 1, the animation will smoothly decelerate to its final model values without oscillating. Damping ratios less than 1 will oscillate more and more before coming to a complete stop. 

とあります。

- 1のときは振動することなく最終値に向かって滑らかに減速する
- 1以下でより小さいほど完全に停止するまでの振動が大きくなる

とのこと。


##velocity

同じく UIView.h の UIViewAnimationWithBlocks カテゴリとして定義されている部分を読むと、

> You can use the initial spring velocity to specify how fast the object at the end of the simulated spring was moving before it was attached. It's a unit coordinate system, where 1 is defined as travelling the total animation distance in a second. So if you're changing an object's position by 200pt in this animation, and you want the animation to behave as if the object was moving at 100pt/s before the animation started, you'd pass 0.5. You'll typically want to pass 0 for the velocity.

とあります。


ばねの初速を意味し、

- この値の "1" は "アニメーションで移動する距離全体を1秒で移動する" ことを意味する
- たとえばアニメーション全体で200ポイント移動する場合に、初速を100ポイント/sにしたかったら、0.5を指定する
- とりあえず0を指定しとけ

とのことです。


##サンプル

[iOS7 Sampler](http://d.hatena.ne.jp/shu223/20130924/1379990718)にサンプルコードを追加しました。

![](http://f.cl.ly/items/1S1n3w0M132q3m42430B/springanimation_r1_c1.jpg)

スライダーで `dampingRatio` と `velocity` を調整しつつ挙動を確認できます。
Mechanize.newでundefined method `user' for nil:NilClass

### 2014-2-7

[プルリクエスト](https://github.com/drbrain/net-http-persistent/pull/56)がマージされて、`Net:HTTP::Persistent`の[v2.9.3](https://github.com/drbrain/net-http-persistent/releases)がリリースされて本件は解決しました。下の`Gemfile`修正を戻して

```
   bundle update
```

で`net-http-persistente`パッケージが2.9.3にアップデートされれば解決します

----
今朝(2/6)Rubyのスクレイパーをテストしてたら急に出るようになった:

```
    NoMethodError:
       undefined method `user' for nil:NilClass
```

Mechanizeのコンストラクタで使われているNet::HTTP::Persistentのエラーっぽい。数時間前にリリースされた [v2.9.2](https://github.com/drbrain/net-http-persistent/commit/2953e7b9304abc1d5d4e5492f6611c5519939c53)の問題みたいなので修正して[プルリクエスト](https://github.com/drbrain/net-http-persistent/pull/56)。

取り込まれるまで当面は、Gemfileを以下ののようにする事で対応

```Gemfile
gem 'net-http-persistent','=2.9.2',
    :git =>'https://github.com/tumf/net-http-persistent.git',
    :branch =>'error-with-no-proxy'
```
既存プロセスの標準出力と標準エラーを奪う

http://yudoufu.hatenablog.jp/entry/2014/02/06/001440
↑この記事に触発されてスクリプト化してみた。

```bash:grabtty.sh
#!/bin/bash
# 既存プロセスの標準出力と標準エラーを奪う https://qiita.com/kawaz/items/96af6fa59fdf999b94bd

# ターゲットのPID
pid=$1
[[ -d /proc/$1/fd ]] || exit 1

# 出力先はttyやファイルを指定
out="$2"

# 出力先の指定がない場合は現在のttyを出力先にする
if [[ -z $out ]]; then
  # プロセスに紐付いたttyを取得する https://qiita.com/kawaz/items/bd33fe1e29876939dddb
  function search_tty() {
    local pid=${1:-$$} tty=""
    while [[ 1 -lt $pid ]]; do
      [[ -d /proc/$pid/fd ]] || break
      tty=$(readlink /proc/$pid/fd/1 2>/dev/null | awk '{print $1}')
      [[ -c $tty ]] && { echo "$tty"; return 0; }
      pid=$(perl -pe 's/\(.*\)/()/' /proc/$pid/stat | awk '{print $4}')
    done
    return 1
  }
  out=$(search_tty)
fi

[[ -n $out ]] || exit 1
[[ -e $out ]] || touch "$out"
[[ -e $out ]] || exit 1

# gdbスクリプトを作る
tmpfile="/tmp/$(basename -- "$0").tmp.$$"
( echo "p close(1)"
  echo "p open(\"$out\", 1)"
  echo "p close(2)"
  echo "p open(\"$out\", 1)"
  echo "detach"
  echo "quit"
) > "$tmpfile"

# ターゲットプロセスに対してgdbスクリプト実行
gdb -p "$pid" -x "$tmpfile"

# 後始末
rm -f "$tmpfile"
```

出力を奪いたいプロセスIDを指定して↓こんなふうに使える。

```bash
./grabtty.sh 12345
```

出力先をファイルにしてもOK

```bash
./grabtty.sh 12345 /tmp/output
```

この場合は`tail -F`とかで見てると増えてくのが確認できます。


# 参考
- [コンソールから切れたプロセスを標準出力につなげなおす - 絶品ゆどうふのタレ](http://yudoufu.hatenablog.jp/entry/2014/02/06/001440)
- [Linux - プロセスに紐付いたttyを取得する - Qiita [キータ]](http://qiita.com/kawaz/items/bd33fe1e29876939dddb)
テーブルの結合に関する覚え書き


LEFT OUTER JOINしたくて、下記ブログを参照しながらやってみた。

[LEFT OUTER JOINする](http://qiita.com/snaka/items/3137cf5920a5ec0c4022)

・・・なるほど！
でもうまくいかない・・・なんでーなんでー
  
   
試行錯誤した結果、やっとできました

```company.rb
includes(:apps_companies).
    where(AppsCompany.arel_table[:app_id].eq(nil))
```

って`includes`の中身は複数形にしないといけなかったのかー(ヽ´ω`)

修行します。
関連モデルを取得する際の条件の書き方


## アソシエーションの挙動のカスタマイズに関するメモ
関連モデルを取得するときの条件式の設定には ``:conditions`` を使う。
    
  
```ruby:author.rb
has_many :books, conditions: { author_id: 1 }
```

ってやると、booksテーブルの情報を取得するときは、author_idカラムが1のものに絞ってからの取得になる。
もちろん中間テーブルを挟んでデータを取得するときにも有効。

関連元のアソシエーションで

```ruby:book.rb
belongs_to :author, conditions: { author_id: 1 }
```

ってやっても取れないのに上手く行かなくて悩んだ(ヽ´ω`)
修行します。
プロジェクトをNugetパッケージにして公開する

作成したクラスライブラリなどをNugetパッケージとして公開する方法のまとめ。

## 1.Nuget Galleryアカウントの取得
Nugetパッケージを公開している[Nuget Gallery](https://www.nuget.org/)のアカウントを取得する。
パッケージを発行する際のAPIキーの取得に必要
  
## 2.Nugetをインストールする
[Nugetのインストールページ](http://docs.nuget.org/docs/start-here/installing-nuget)からCommand-Line Utilityをダウンロードする。
環境変数にパスを通し、コマンドラインから使えるようにしておく。

## 3.プロジェクトアセンブリを編集しておく
Nuget発行時にバージョンや発行者の情報が必要になります(これらはnuspecというファイルに記載される)。
プロジェクトのMy Project>アプリケーションに「アセンブリ情報」のボタンがあるので、ここからパッケージ名やバージョンなどを編集しておきます。
※なお、これらの情報は発行後パッケージの画面からWebで編集できるのでそんなに気にしなくてもいい

## 4.Nugetコマンドでパッケージ化を行う
パッケージ化を行うコマンドは以下の通り。

プロジェクトファイルをパッケージ化する(Releaseビルドを使用したい場合は、-Propオプションを指定)。
プロジェクトファイルがあるフォルダで実行すれば、パスの指定は必要ない模様。
`nuget pack [path]\MyProject.csproj`
`nuget pack [path]\MyProject.csproj -Prop Configuration=Release　`

プロジェクトのシンボル情報をパッケージ化する(これでデバッグ時ステップインできる)
`nuget pack MyProject.csproj –symbols`

## 5.Nuget Galleryに発行する
Nuget Galleryのアカウント情報にAPI KEYが出ているので、これをコピペしておく。

以下のコマンドでパッケージをNugetに発行する
`nuget push <package path> [API key] [options]`

APIキーは、事前に設定しておくことができる。

`nuget setapikey [API KEY]`

こちらの方が楽かも。

`nuget push *.nupkg`

あとは、パッケージの画面からSummaryなどを適宜編集する。

## 参考情報
Nuget Command Reference
http://docs.nuget.org/docs/reference/command-line-reference#Push_Command_Usage

パッケージを作成して NuGet で公開する
http://msdn.microsoft.com/ja-jp/magazine/hh708753.aspx

NuGet パッケージを作成して公開する
http://sakapon.wordpress.com/2013/07/16/nugetpackage/
vimを使う

win向け
既に使いこなしている人は読む必要がありません。

# インストール
http://www.vim.org/ からダウンロードしてインストール。

# vimのテーマを変更する
まずは見た目から入ります。
デフォルトだと `C:\Program Files (x86)\Vim\vim74\colors` に設定が置いてある。
![WS000036.png](https://qiita-image-store.s3.amazonaws.com/0/19374/fde13476-01a6-03ed-149f-991b69d65940.png)

blue.vimを使いたい場合だったらvim上で `:colorscheme blue` を入力。
![WS000039.png](https://qiita-image-store.s3.amazonaws.com/0/19374/701dcd00-3463-5734-1040-b035f150f43d.png)

↓　エンター！

![WS000040.png](https://qiita-image-store.s3.amazonaws.com/0/19374/6779c07d-61e1-0bdc-f94c-91aed49eb118.png)
イヤァァァ！

心臓に悪いので元に戻す。
`:colorscheme default`

# 拾ってきたテーマを使う
個人的に黒背景が好きなので、こちらのを使わせてもらうことに。
https://github.com/w0ng/vim-hybrid

zipダウンロードしたら解凍して中から hybrid.vim と hybrid-light.vim を取り出し、
さっきの blue.vim が置いてあった場所に移動。
![WS000037.png](https://qiita-image-store.s3.amazonaws.com/0/19374/4bfd095f-535b-7500-0e1e-d7932af258ac.png)

vim上で `:colorscheme hybrid` を入力。
![WS000038.png](https://qiita-image-store.s3.amazonaws.com/0/19374/468062cd-4a64-ee60-b79d-a79f332a8e92.png)
いいじゃない。
ASP.NET MVCでキャッシュ

ASP.NET MVCでキャッシュについて。
出力キャッシュ、ブラウザキャッシュ、MemoryCache。

## 出力キャッシュ

```csharp
[HttpGet]
[OutputCache(Duration = 600, VaryByParam = "foo")] /// 10分
public ActionResult SampleAction(string foo, int bar) {
```

### 条件で出力キャッシュを無効にする

```csharp
[HttpGet]
[OutputCache(Duration = 600, VaryByParam = "foo")] /// 10分
public ActionResult SampleAction(string foo, int bar) {
    if (foo == "hoge") {
        Response.Cache.SetCacheability(HttpCacheability.NoCache);
    }
```

### 出力キャッシュを削除する

```csharp
public ActionResult InvalidateCacheForSampleAction()
{
    var path = Url.Action("SampleAction");
    Response.RemoveOutputCacheItem(path);
```

### ChildActionの出力キャッシュ

これでViewの`@Html.Action("SampleChildAction")`の部分がキャッシュされます。

```csharp
[HttpGet]
[ChildActionOnly]
[OutputCache(Duration = 600)] /// 10分
public ActionResult SampleChildAction() {
```

## ブラウザのキャッシュ

以下はブラウザのキャッシュを無効にする例です。

```csharp
[HttpGet]
public ActionResult SampleAjaxAction()
{
    Response.Cache.SetCacheability(HttpCacheability.NoCache);
    Response.Cache.SetNoStore();
    var obj = new
    {
        Message = "hoge",
    };
    return Json(obj, JsonRequestBehavior.AllowGet);
}
```

## MemoryCache

[MemoryCache](http://msdn.microsoft.com/ja-jp/library/system.runtime.caching.memorycache%28v=vs.110%29.aspx)を使うには「参照の追加」で「System.Runtime.Caching」アセンブリへの参照を追加しておく必要があります。

```csharp
var cache = MemoryCache.Default;
var policy = new CacheItemPolicy();
policy.AbsoluteExpiration = DateTime.Now + TimeSpan.FromMinutes(10);
cache.Add(new CacheItem("sampleCacheKey", cachedObj), policy);
```
AWSCLI S3コマンドの些細な注意点

AWS CLI の、S3 コピーコマンドで、下記のエラーが発生。

■エラーメッセージ
usage: aws s3 cp <LocalPath> <S3Path> or <S3Path> <LocalPath> or <S3Path> <S3Path>
Error: Invalid argument type

原因はS3のパスに含まれる、「S」が大文字だったから。

誤：aws s3 cp S3://~ S3://~
正：aws s3 cp s3://~ s3://~

「s」は小文字で！！
コンソールから切れたプロセスを標準出力につなげなおす

# 詳細

http://yudoufu.hatenablog.jp/entry/2014/02/06/001440

※ 上記技術記事は私が書いたものではありません．
個人的にストックしておきたいので，Qiitaの記事にしています．
こういうのは迷惑だったりマナー違反だったりするんでしょうかね…？Qiita利用者とかブログ記事筆者とか…
cpanmでDBD::mysqlを入れる


plenvやperlbrewで`cpanm`を入れてそれでモジュールを入れるとDBD::mysqlが入らないケースがあります。手元にMySQL (libmysql) が入っていないからです。

Homebrewを使って手元に手軽にMySQLを入れてしまいましょう。

検証環境:

- MacBook Air 2013 Late
- Mavericks

なお、付記として

- Debian stable / Ubuntu stable

の場合についても言及してあります。

##HomebrewでMySQLを入れる

思いつく通りに入れれば大丈夫そうです。

```shell
$ brew install mysql
```

ここでトラブルが起きた場合は `brew doctor` を参考にするか、`brew update` を怠っていないかなどをチェックしましょう。[HomebrewでMySQL 5.6をインストール。開発用my.cnfもさらす](http://www.karakaram.com/install-mysql56-homebrew) も参考になります。

##DBD::mysqlインストール用の環境変数を設定する

[DBD::mysql - Environment Variable](http://search.cpan.org/~capttofu/DBD-mysql-4.023/lib/DBD/mysql.pm#Environment_Variables) にしたがって現在のbashに環境変数を設定します。bashでない場合も同様に環境変数を設定すればよいと思います。

    export DBD_MYSQL_CFLAGS=-I/usr/local/Cellar/mysql/5.6.16/bin/mysql
    export DBD_MYSQL_LIBS="-L/usr/local/Cellar/mysql/5.6.16/bin/mysql -lmysqlclient"
    export DBD_MYSQL_EMBEDDED=
    export DBD_MYSQL_CONFIG=/usr/local/Cellar/mysql/5.6.16/bin/mysql_config
    export DBD_MYSQL_NOCATCHSTDERR=0
    export DBD_MYSQL_NOFOUNDROWS=0
    export DBD_MYSQL_SSL=
    export DBD_MYSQL_TESTDB=test
    export DBD_MYSQL_TESTHOST=localhost
    export DBD_MYSQL_TESTPASSWORD=
    export DBD_MYSQL_TESTPORT=3306
    export DBD_MYSQL_TESTUSER=root

上記の設定を一行ずつ打っていくか、それを書いたファイルを `source` コマンドで現在のシェルに読み込ませればよいでしょう。

初期設定では test というデータベースは存在するし、root のパスワードは空文字なので大丈夫です。

パスについて、その時のHomebrewのMySQLでインストールされるパスが違うかもしれません。`brew info mysql` を参考するなどしてください。

##mysqldは起動している？

`brew info mysql` の指示に従ってmysqldを起動します。

一番簡単な方法は以下だと思います。

```shell
$ mysql.server start
```

`mysql -u root -p` して `mysql` クライアントからデータベースに接続できることを確認します。

##cpanm DBD::mysqlする

環境変数が設定されているか `env | grep DBD_` などを使って確認したあと、`cpanm DBD::mysql` します。たぶん今まで失敗していた場合も成功するのではないかと思います。

とりあえずMySQLクライアントインストール目的の場合は、この場で `brew uninstall mysql` しても大丈夫じゃないかなと思いますが、ちょっとここは自信がないです。mysqldがディスクの肥やしになっていることが気にならないのであれば、セキュリティ的に妥当な設定になっていることを確認して、そのままにしておくで良いかなと思います。

##DebianやUbuntuの場合

Debian や、その派生OSであるUbuntuの場合は、 **上記のような環境変数の設定はいりません**。そのかわり、`libmysqlclient15-dev` というパッケージが必要になります。

```shell
$ sudo apt-get install libmysqlclient15-dev
```

このパッケージは `libmysqld-dev` などの依存関係でもインストールされるもののようです。外部のDBを利用するとしても、一時的にでも`mysql-server`パッケージを入れて手元にMySQLサーバを立てた上で、`cpanm DBD::mysql` してみるとうまくいくのではないかと思います。

参考:

- [週記くらい | UbuntuでDBD::mysql のインストールに失敗](http://blog.starbug1.com/archives/1277)

Debian/Ubuntuではレアケースかと思いますが、自前でMySQLをビルドして入れているという場合には、また別の設定が必要になってくると思われます。

なお蛇足ですが、plenvやperlbrewによるユーザPerlではなく、システムPerlを使っているという場合であれば、`libdbd-mysql-perl` というパッケージを入れるだけで済みます。

##[番外編] forceモードで入れる

手元がMySQLサーバではないけど、ネットの向こう側のMySQLサーバを使いたいからクライアントを入れるんだという意思がはっきりしている場合には force モードで入れてしまうという手もあります。

```shell
$ cpanm --force DBD::mysql
```

自分がやっていることやリスクが理解できる場合は、行儀は悪いもののこの方法でも良いと思います。

##参考文献

- [HomebrewでMySQL 5.6をインストール。開発用my.cnfもさらす](http://www.karakaram.com/install-mysql56-homebrew)
hidden=YES vs alpha = 0.0（何が違うのかと使いどころ）

初投稿です。
こちらで載っていた回答そのままなのですが、見やすくまとめてみました。
http://stackoverflow.com/questions/10911696/whats-the-difference-between-views-hidden-yes-and-alpha-0-0f

【ユーザーにとっての扱いの違い】
一緒
→理由：alphaが0.02以下である場合はCocoa Touchがhiddenと同じ扱いをするらしいです。

【処理速度・重さの違い】
alphaの方が重い＝遅い。下階層viewとのブレンドグラフィック処理が必要らしいです。

【使いどころ】
アニメーションが必要な場合→alpha
アニメーションが必要でない場合→hidden

間違いや補足等あれば大歓迎です。
宜しくお願い致します。
Scala Slickでin, count

よく忘れるのでメモ。slickのバージョンは1.0.1

# in

```scala:サンプル
// typesを引数で貰ったとして
val query = (for {
  log <- Query(XXXLogTable) if (log.type inSet (types.flatMap(t => Seq(t.code))))
} yield (log.id)).list
```

# count
## count

```scala:サンプル
val c = (for {
  log <- Query(XXXLogTable) if (log.type inSet (types.flatMap(t => Seq(t.code))))
} yield(log.id.count)).first
```

```sql:生成されたSQL
select count(x2.`id`) from `xxx_log` x2 where x2.`type` in (0, 1)
```

ただ、
> method count in class ColumnExtensionMethods is deprecated: Use Query.count instead

とのことなので、やってみる。

## Query.length

```scala:サンプル
val q = Query(XXXLogTable).where(log.type inSet (types.flatMap(t => Seq(t.code))))
                          .length
q.run
```

```sql:生成されたSQL
select x2.x3 from (select count(1) as x3 from (select x4.`id`, x4.`xxx`, x4.`yyy` from `xxx_log` x4 where x4.`type` in (0, 1)) x5) x2
```

SQLが。。
ひとまずcountを使うとして、lengthの使い方は再調査が必要。
Rubyトラブルシューティング

##bundle installでgemパッケージがインストールされるpathの設定
`bundle install --path <パス名>`
とすると、好きなpathにgemパッケージが作成できる。
pathの設定はGemfileがあるのと同じフォルダに`.bundle/config`というファイルができており、その中に書いてある。

##Macにrvm経由でRubyをインストールしようとしてハマりを起こした
rvm自体は
`\curl -sSL https://get.rvm.io | bash -s stable`
(その後sources ~/.profile)
で普通にインストール出来たのだが、Rubyのインストールがうまくいかなかった。

自分の環境には過去、適当に色々とインストールしてきたのだが、
今回は"Macports"が原因だったっぽい。
`rvm install <インストールしたいRubyのバージョン>`
を実行すると
Warning: port definitions are more than two weeks old, consider using selfupdate
Error! ncursesw was replaced by ncurses a long time ago, please uninstall 'ncursesw',
         for more details check http://comments.gmane.org/gmane.os.apple.macports.user/28039
Requirements installation failed with status: 1.
というエラーが出力された。

まずはMacportsが古くなっていたので
`sudo port selfupdate`
を実行。Warningの方はこれで消えた。

問題のエラーの方だが、こっちは
sudo port -f uninstall ncursesw
でncurseswをuninstallした。

この状態で
`rvm install 1.9.3`
を実行するとrvmでRubyのインストールが進むようになる。
システムのgemにrailsをインストールせずrails newする

よく入門書で

```bash
$ gem install rails
$ rails new project
```

みたいにしろと書いてありますが、これだとシステムのgemにインストールされます。システムのgemはbundlerいっこにして、必要なものは`vendor/bundle`に格納し、`bundle exec`で呼び出すのがクリーンでいいですよね。下記のようにします。

```bash
$ gem install bundler
$ mkdir project
$ cd project
$ bundle init
Writing new Gemfile to /path/to/project/Gemfile
```

のように、Gemfileだけ生まれるので、

```bash
$ vi Gemfile
# A sample Gemfile
source "https://rubygems.org"

gem "rails"
```

のようにコメントアウトを外してやります。あとは

```bash
$ bundle install --path vendor/bundle
$ bundle exec rails new .
```

でOK。Gemfileが存在するので上書きするかどうか聞いてきますが上書きしちゃってください。
ASP.NET MVCの集約例外処理

ASP.NET MVCでの集約例外処理の実装例です。
ログの出力処理とAjaxリクエスト処理時の振る舞いの変更をします。

## HandleErrorAttribute.OnException

Controller内で起きた例外を処理する集約例外ハンドラを実装します。

Ajaxリクエストの場合はデフォルトの例外処理は何もせず、
ステータスコードを500、応答本文を例外情報を含んだJSONにして、
$.ajax().fail()で例外処理をしやすくしておきます。

なお`LogUtil.LogControllerError()`というメソッドは別途定義されているものとします。

```csharp
public class GlobalHandleErrorAttribute: HandleErrorAttribute
{
    public override void OnException(ExceptionContext filterContext)
    {
        if (filterContext == null)
        {
            throw new ArgumentNullException("filterContext");
        }

        /// 例外発生時は常にログを取っておく
        LogUtil.LogControllerError(filterContext);

        if (filterContext.HttpContext.Request.IsAjaxRequest())
        {
            /// Application_Errorは呼ばれない
            HandleAjaxRequestException(filterContext);
        }
        else
        {
            /// custom errorが有効でなければ
            /// base.OnException()でExceptionHandledがtrueにならないので
            /// Application_Errorも呼ばれる
            base.OnException(filterContext);
        }
    }

    private void HandleAjaxRequestException(ExceptionContext filterContext)
    {
        if (filterContext.ExceptionHandled)
        {
            return;
        }

        filterContext.Result = new JsonResult
        {
            Data = new {
                Message = filterContext.Exception.ToString(),
            },
            JsonRequestBehavior = JsonRequestBehavior.AllowGet
        };
        filterContext.ExceptionHandled = true;
        filterContext.HttpContext.Response.Clear();
        filterContext.HttpContext.Response.StatusCode =
            (int)HttpStatusCode.InternalServerError;
        filterContext.HttpContext.Response.TrySkipIisCustomErrors = true;
    }
}
```

FilterConfig.csのRegisterGlobalFilters()を編集します。
もともとある`filters.Add(new HandleErrorAttribute());`をコメントアウトして、
代わりにGlobalHandleErrorAttributeを登録します。

```csharp
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
    //filters.Add(new HandleErrorAttribute());
    filters.Add(new GlobalHandleErrorAttribute());
}
```

## Application_Error

Controller外で起きた例外を補足するにはApplication_Error()を定義します。

なお`LogUtil.LogError()`と`LogUtil.LogErrorSimple()`というメソッドは別途定義されているものとします。

```csharp
protected void Application_Error(object sender, EventArgs e)
{
    if (Server != null)
    {
        var ex = Server.GetLastError();
        if (ex != null)
        {
            if (ex is HttpException &&
                ((HttpException)ex).GetHttpCode() == (int)HttpStatusCode.NotFound)
            {
                /// NotFoundを相手にするとログが大変になるので無視
                return;
            }
            
            /// CustomErrorが無効な場合は
            /// Controller内でおきた例外が二重にログ出力されてしまうことに注意。
            /// CustomErrorが有効な場合は
            /// Controller外でおきた例外のみここでログ出力される。
            try
            {
                LogUtil.LogError(ex, HttpContext.Current);
            }
            catch (Exception)
            {
                LogUtil.LogErrorSimple(ex);
            }
        }
    }
}
```
htmlを取得しasyncを使ってそのままレスポンスとして返す


最近Nodeを始めました。
htmlを取得してそのままレスポンスを返す実装です。

asyncモジュールを利用しています。

```js
async.waterfall([
    function(callback) {
        http.get("http://yahoo.co.jp", function(res) {
            var htmlStr = ''

            //中間データの取得時
            res.on('data', function(str) {
                htmlStr += str;
            })

            //処理終了時
            res.on('end', function(res) {
                callback(null, htmlStr)
            })
        });
    }
], function(err, htmlStr) {
    console.log('receive html.');
    res.send(htmlStr);
})
```