OmniAICreator/Qiita-1.07M huggingface dataset:
Amazon SES を利用してメールを送信する


## Amazon SES の設定

2015/2/15 現在、Tokyo リージョンでは利用できないようなので、リージョンは US East を選択する。

### FROM メールアドレスの登録

- AWS コンソールから、Services > SES > Email Addresses ページにアクセスする
- 「Verify a New Email Address」ボタンから、使用するメールアドレスを登録する
- 確認メールが飛んでくるので、メールに記載されているリンクをクリックする
- 登録したメールアドレスの Status が verified となればOK

### メール送信用の IAM ユーザーの登録

- Services > SES > SMTP Settings ページにアクセスする
- 「Create My SMTP Credentials」ボタンから、IAM ユーザーを登録する
- Services > IAM > Users ページにアクセスし、追加した IAM ユーザーを選択する
- 「Manage Access Keys」ボタンから、アクセスキーを新規に登録する (後ほどコード上で指定するキーとなる)
- 「Edit Policy」リンクから、ポリシーに `ses:SendEmail` を追加する
	- IAM 新規登録時は `ses:SendRawEmail` のみが登録されているため、ポリシーを追加する必要がある

```
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "ses:SendRawEmail",
      "Action": "ses:SendEmail",
      "Resource": "*"
    }
  ]
}
```

## Java コードサンプル

aws-java-sdk-ses 1.9.19 を利用したサンプルコード。

```
	Destination destination = new Destination().withToAddresses(new String[]{"TO メールアドレス"});

	Body body = new Body().withText(new Content().withData("本文"));
	Message message = new Message()
		.withSubject(new Content().withData("件名"))
		.withBody(body);

	SendEmailRequest request = new SendEmailRequest()
		.withSource("FROM メールアドレス")
		.withDestination(destination)
		.withMessage(message);
 
	AmazonSimpleEmailServiceClient client = new AmazonSimpleEmailServiceClient(new 	BasicAWSCredentials("アクセスキー", "シークレットアクセスキー"));
	client.setRegion(Region.US_EAST_1);
	client.sendEmail(request);
```
Hubotをherokuにdeployし、slackと連携してみた


# はじめに
最近、周りでHubotの話をちらほら聞いて気になっていたので試してみました。
以前、twitter botを作成した事がありますが、Hubotではbotのcore機能と、twitter,各種chatツールとの連携機能をモジュール化しているので、新しいchatサービスが出てきたら、そのchatと連携するadaptorを用意する事で簡単に、新サービス対応する事が可能です。

# Hubotをlocal環境で動かしてみる
下記を参考に、localで動かしてみました。記事通りの手順で動きました。
独自スクリプトの作成方法も、こちらの説明で大体把握できます。多くのサンプルがあるので、こちらを参考にしていきます。
[GitHub社謹製！ bot開発・実行フレームワーク「Hubot」](http://gihyo.jp/dev/serial/01/hubot)

# HubotをHerokuにdeployし、slackと連携してみる
個人的な開発環境でslackの利用を検討していたので、slackとの連携を試します。
サーバーとしてはHerokuを利用します。個人的に利用するには無料分で十分に使え、コードをgitでpushするだけなので、とにかく手軽です。  
手順は下記を参考にしました。
[Slack上のボットをHubotで作ってHerokuにデプロイしてみた](http://nanapi.co.jp/blog/2014/06/04/slack_with_hubot/)  

上記だけだと上手く動作しなかったので、調べてみたら、Procfileにslack用の記述が必要でした。  

```Procfile
web: bin/hubot --adapter slack
```

[Github slackhq/hubot-slack](https://github.com/slackhq/hubot-slack)

最後に、slack上で動作を確認。いくつか、サンプルを参考にスクリプトを追加し、それぞれ正常動作を確認できました。
![general___WA_Slack.png](https://qiita-image-store.s3.amazonaws.com/0/4779/1bae0980-895e-c279-b0ac-b7cb01c598ad.png "general___WA_Slack.png")


# まとめ
* 単なるbotとしても、今後でてくる新サービスに簡単に対応できそうなので、Hubotを使う事で、将来の心配は減らせそうですね。
* 開発のサポートツールとしては、かなりいろいろとできそうです。ただ、現在の開発用サービスの標準の連携機能だけでも、いろいろとできそうなので、まずはこちらを試してみて、自分たちに足りないところを、Hubotで作っていく感じでしょうか。
「アピアリーズ Developers Workshop for Android」勉強会に参加しました

# 概要
* 時間：2015/02/14 14:00 ~ 18:00
* 場所：株式会社アピアリーズ　1F会議室
* 共催：
 * 株式会社アピアリーズ
 * 株式会社インターネットイニシアティブ
* ワークショップ概要：
 * ワークショップ形式でアピアリーズを用いたアプリ開発の実践講義を行います。
 * アピアリーズを利用することで、サーバサイド機能を使ったアプリケーションを簡単に作成できるようになります。
 * 本講義で配布するサンプルアプリのプロジェクトを利用することで、最終的には、自分自身のオリジナルアプリが作成できます。

# 内容
### アピアリーズの概要紹介
* http://www.appiaries.com/jp/
* アピアリーズは、BaaSです。　様々な機能をAPIとして提供するクラウド
* メリット
 * 会員認証、PUSH通知、ジオロケーション、ファイルストレージなどアプリ制作に必要なサーバサイド機能を標準搭載
 * appiariesを使うことで、よくあるサーバ機能の開発は不要に
 * OS、Android、Windows Phone、PCブラウザ。どれでもOK
* 分かっている提供機能
 * データストア(JSONコレクションを利用)
 * ・通信処理を気にせずJSONを送受信する
 * ・HashMap化されたJSONを扱う
 * プッシュ
 * ・サーバとアプリ?紐付けを数行で行う  
 * ・アピアリーズ?サーバからPUSHを送信

### 開発環境の準備
* サンプルアプリ「MeetFriend」のダウンロード、体験
 *  https://play.google.com/store/apps/details?id=jp.co.teamegg.meetfriend 
* Android studioのインストールとSDKダウンロード
 * http://developer.android.com/sdk/index.html
* Android実機がないので、Genymotionを準備しよう
 * https://sites.google.com/a/teamegg.co.jp/android/home/android-get-started/03
 * 補足：　VirtualBoxをインストールしないといけない
* Google Play servicesの導入
 * https://sites.google.com/a/teamegg.co.jp/android/home/android-get-started/08

### アピアリーズ利用
#### アピアリーズ登録
 * https://admin.appiaries.com/p/register
#### アプリを設定する
 * ログインして、アプリ一覧画面に、「アプリ新規作成」をクリックする
 * 「アプリID」と「アプリ名」を入力する
 * 無料体験版は、データストアが、datastore sandbox (_sandbox) になっているけど、変更できない
 * 作成した後に、アプリID、アプリトークン、データストアIDが表示されて、アプリ実装時に、利用できる
#### アプリ側に、SDKを使う
 * SDKダウンロード：　http://docs.appiaries.com/?p=160
 * アプリケーションのlibフォルダ下に、追加する
 * build.gradleへ?追記

```
dependencies {
......
compile files('libs/apis-android-1_4_0.jar')
compile 'org.apache.httpcomponents:httpcore:4.3.2'
compile 'org.apache.httpcomponents:httpmime:4.3.4'
compile 'org.codehaus.jackson:jackson-core-asl:1.8.3'
......
```

#### サーバー側に、データ登録アクションの実装
* ￼コレクション
 * コレクションというのは、JSONデータなどを保管する仕組み、データ管理?基盤 ￼
* コントロールパネル?利用方法
 * アプリ一覧画面に、選択されたアプリの「このアプリを編集」をクリックする
 * 次の画面に、「データを管理」 を選択する
 * コレクションを作成して、コレクションIDを利用できる
* コレクションのアクセス権限があるので、要注意
 * http://docs.appiaries.com/?p=70
* 次は、オブジェクトを一つ作りましょう
 * オブジェクトIDとJSONデータ{}を入力してOK 

#### アプリ側実装
* 初期化

```
APIS.initialize("_sandbox",アプリID,アプリトークン, getApplicationContext());
```

* データ送信

```
new APISJsonDataTask() { 
    @Override 
    protected void onPostExecute(APISResult result, APISException e) { 
        super.onPostExecute(result, e); 
        Toast.makeText(PickPlaceMapActivity.this, "onProcessEnd", Toast. LENGTH_SHORT).show(); 
    } 
}.getJsonData(COLLECTION_ID, OBJECT_ID);
```

# 今後
* アピアリースは、いろいろな機能があるので、勉強続く
* そのほかのBaaSを調査する
最新版のCRIUビルド

* yaourtだと1.2までしかパッケージがなかったのと、ビルドに失敗するのでソースから入れることにした。。

```bash:
pacman -Sy protobuf-c
```

```bash:
wget http://download.openvz.org/criu/criu-1.4.tar.bz2
tar -jxf criu-1.4.tar.bz2
make -C criu-1.4
cp -a criu-1.4/criu /usr/local/bin/
```
Spinnerだけ動かして、OnItemSelectedは実行させない簡単な方法

Spinnerを動かすと、SpinnerにセットされたOnItemSelectedListenerからonItemSelectedが実行されます。初回起動時にSpinnerのpositionだけ任意の値に動かして, OnItemSelectedは動かさないようにする方法が意外に思いつかなかったので、Tipsとしてメモ。

###やりかた

Spinnerにlistenerをsetする前にsetSelectionします。また、setSelectionでonItemSelectedを起動しないように、falseオプションをつけることがミソです。

```java
//listenerの設定
mListener = new AdapterView.OnItemSelectedListener() {

    @Override
    public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
        //やりたいことやる
    }

    @Override
    public void onNothingSelected(AdapterView<?> parent) {
       
    }
};

mModeSpinner = (Spinner)findViewById(R.id.spinner_nav);
SpinnerAdapter spinnerAdapter = ArrayAdapter.createFromResource(this, R.array.spinner_mode, android.R.layout.simple_spinner_dropdown_item);
mModeSpinner.setAdapter(spinnerAdapter);

//falseを設定して、onItemSelectedを呼ぶanimationを回避
mModeSpinner.setSelection(position, false);
//ここでリスナーをつける
mModeSpinner.setOnItemSelectedListener(mListener);
```

ついでですが、初回起動時以外でSpinnerを動かしつつonItemSelectedを起動しないためには、listenerを外してやります。

```java
mModeSpinner.setOnItemSelectedListener(null);
mModeSpinner.setSelection(position, false);
mModeSpinner.setOnItemSelectedListener(mListener);
```

以上です。
最近のMV*フレームワークを分業体制/複数ベンダーのプロ管の視点から考えた

#結論：

 - **MV*なんてエンジニアのオナニーだから採用できん**
 - **jQueryでがんばろう**

#記事の内容

しばらく前からAngularJSやらが流行して、ブラウザjsでViewとModelのバインディングがクールみたいな流れがあった。わたし、複数ベンダーで分業体制のプロジェクト管理するひと。ゆえ、その視点から考察してみた。根っこはエンジニアである。

##複数ベンダーの分業体制とは？

この記事で言う複数ベンダーの分業体制というのは、ウェブサイトをつくる際、大雑把にいえば次の3つフェーズを別の人がやって、場合によっては別会社という前提

 - デザイン：主にPhotoShopとか使う（担当：デザイナー）
 - HTMLコーディング：主に出来上がったデザインをHTML化する（担当：HTMLコーダー）
 - システム開発：動的なウェブサイトに仕上げる（担当：プログラマー）

で、経験上キャンペーン系ウェブサイトでこの体制になるかな。制作会社とシステム開発会社という組み合わせが典型的かもしれない。もちろん、全部まるごと一社がやることもある。

##プロジェクト進行上の特徴

キャンペーン系ウェブサイトの例：

 - 何故かリリース日は決定済みで絶対遵守
 - CMとかリアル店舗での告知とかあって日程はずらせない
 - 上流工程の遅れで後半のシステム開発及びテストが力任せになりがち（デスマーチ）
 - お互いに「ふざけんな死ね」ぐらい思ってる（特に別会社だと）
 - 打ち合わせで「目に涙を浮かべながら」相手を批判することも（それぐらいつらい）
 - 軽いデスマーチが定期的に繰り返される（ただし、役所や金融系の機関に近いシステムと比較したら軽いデスマーチで済むので参加者に求められるマッチョ度合は中の上ぐらいだ）

##仕事の流れとそれぞれの言い分

||デザイナー|HTMLコーダー|プログラマー|
|---|---|---|---|
|役割|クライアントの言い分をきいて綺麗なデザインをつくる|クライアントからOKが出たデザインをHTML化する、jQuery使って簡単なエフェクト入れる|会員登録とかポイント付与とか、SNS連携とか、動的な感じに仕上げる|
|初期段階|わがままな芸能人とか動物とかマジ勘弁して！キービジュアル決まりません :cry: でもクライアントの言うことはきかないと|仮の画像でいいからキービジュアル決めてーー！ワイヤーフレームだけでも出してーー :cry:|はやくしろ！|
|中期|チョイ遅れが出たけど、デザインできたから後はよろしくねー|徹夜でHTMLつくるだ|はやくしろ！|
|後期|今日はゆっくり寝られる :heart: |HTMLもクライアントからOK出たし、エンジニアさん後はよろしく、今日から寝られるわ :zzz:  あはーん|リポDを箱で用意しろ！結局遅れてるからリリースまで徹夜じゃ！ふぅ :fire: |
|リリース直前|次の仕事が入ってきた|エンジニアさん見た目がずれてるし、このエフェクト効いてないけどどうなってんの？|テストだ、実機動作検証だ、徹夜だ、ふざけんな :fire: |

##MV*フレームワークをどう使うか？

こんな感じのプロジェクトでHTMLコーダーとプログラマーが関係してくる中でうまい採用方法はあるだろうか？と考えたものの、難しいっす！ってのが結論

###HTMLコーダーの言い分

 - それ、プログラマーの都合でしょ？
 - 毎日忙しくて新しいフレームワーク勉強する時間無い
 - 徹夜続きなんで仕事増やさないでください
 - ディレクティブ？何それ？気持ち悪いし責任持てない
 - javascriptはjQueryでおなか一杯です
 - そもそもプログラマーじゃないし
 - jQueryじゃダメなんですか？

###プログラマーの言い分

 - 新しい技術だし使いたい
 - 作業負荷が軽減できたらうれしい
 - このディレクティブ入れておいてもらえると助かるみたいな・・・でも強制できないし・・・

##というわけで

みんな忙しいし、新しい技術の採用は見送られるわけです。みんなが一体のチームで、責任の切り分けが不明瞭でOKな体制ならうまくいきそうな感じなものの、会社が違ったり組織が違ってみんなが忙しいと、jQueryでいいじゃんとなったりします。わたしもjQueryも十分だと思ってますし、jQueryのスクリプト側からHTMLへの一方通行の参照ってのはとても綺麗だと思うのです。

```.js
$('#myid').click(funciton(){
  // 何かする
});
```

みたいな。セレクター万歳 :smile: 

結局、HTMLコーディングが完成した時点で、その工程での納品物・成果物として邪魔にならないディレクティブとかバインディングなら可能性はあると思うのだが、AngularJSはそうじゃないんだよね。

##理想論

以前、github.com の開発リーダーと「デザイナーとプログラマーがうまくコラボレーションするコツは何だ？」という議論をしたことがある。そのとき、

> デザイナーがコーディングを学ぶことだ

と言う理想論で決着したものの、理想論に過ぎない。

##現実的な落としどころ

「HTMLコーディングのフェーズに、プログラマーを派遣して、その後のプログラミング作業負荷を軽減できるように仕事の邪魔にならない程度にHTMLに手を入れさせてもらう」

ということで、お互いが理解しているjQueryがいいんじゃないのかな、というのが落としどころ。

ちゃんちゃん
LXCでCentOS5.11 i386

* lxcで`uname -m` : i686
* dockerで`uname -m` : x86_64
  * dockerでは気をつけないとx86_64のパッケージが入る。

## 作成

```bash:
lxc-create -n centos5 -t centos -- --release 5 --arch i686
```

失敗する場合は以下を適用しておくこと。

* [no such option: --releasever on CentOS5's yum by tukiyo · Pull Request #444 · lxc/lxc](https://github.com/lxc/lxc/pull/444)

## ネットワーク設定

* 以下のように設定。

```bash:/var/lib/lxc/centos5/config
lxc.network.type = veth
lxc.network.flags = up
lxc.network.link = br0
lxc.network.ipv4 = 192.168.100.7/24
lxc.network.ipv4.gateway = 192.168.100.1
lxc.network.name = eth0

lxc.network.type = veth
lxc.network.flags = up
lxc.network.link = br1
lxc.network.ipv4 = 192.168.0.7/24
lxc.network.name = eth1
```

* ifcfg-eth0が存在しDHCP設定が入っているのでどける

```bash:
cd /var/lib/lxc/centos5
mv rootfs/etc/sysconfig/network-scripts/ifcfg-eth0{,.bak}
```


## 起動

```bash:
lxc-start -n centos5
lxc-attach -n centos5
export PATH=$PATH:/bin
```

```bash:
yum groupinstall -y Core
yum install -y \
  python-simplejson bash sudo patch wget make gcc screen curl net-tools
```

OpenVzのイメージを動かすには [lxc で CentOS 5 コンテナ - TenForwardの日記]( http://d.hatena.ne.jp/defiant/20101008/1286524702) もありだと思った。
OHHTTPStubs関連のメモ

iOSのアプリケーション開発で、ネットワーク関連の処理をユニットテストする際には[OHHTTPStubs](https://github.com/AliSoftware/OHHTTPStubs)を使うことが多いと思います。

この記事では、試したことやハマったことを備忘録的に書いていきます。

# 注意点
## バックグラウンドで動作する機能のUTには使えない
バックグラウンドで動作する通信は、以下の理由でスタブすることができません。
* カスタマイズされた`NSURLProtocol`を使うことができない
* バックグラウンド転送はiOSがハンドリングしている

## アップロードには対応していない
`NSURLProtocolClient`は、データが送信されたということを検知する手段がないため、アップロード関連の処理をスタブすることができません。

そのため、`NSURLRequest`の`httpBody`や`-[NSURLSession uploadTaskWithRequest:fromData:] `などのデータを送っても、何も起こりません。
また、`-URLSession:task:didSendBodyData:totalBytesSent:totalBytesExpectedToSend: `も呼び出されません。

## NSURLSessionと組み合わせる時の注意点
[こちらの記事](https://github.com/AliSoftware/OHHTTPStubs/wiki/Testing-for-the-request-body-in-your-stubs)に書かれている通り、`NSURLSession`を使って`POST`のリクエストを送るときに、`NSURLRequest`の`httpBody`にアクセスすることができません。
この現象はAppleのバグによるものです……。

そのため、以下のように`httpBody`に埋め込まれたパラメータを元にスタブしたレスポンスの内容を変えたい、という処理が書きづらくなっています。

```objc
[OHHTTPStubs stubRequestsPassingTest:^BOOL(NSURLRequest *request) {
    return [request.URL.host isEqualToString:@"127.0.0.1"];
} withStubResponse:^OHHTTPStubsResponse*(NSURLRequest *request) {
    NSData *data = request.httpBody;
    NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil];
    NSDictionary *responseHeader = @{@"Content-Type":@"application/json"};
    if (dict[@"key"] == @"hoge") {
        return [OHHTTPStubsResponse responseWithData:succeedResponseData statusCode:200 headers:responseHeader];
    } else {
        return [OHHTTPStubsResponse responseWithData:failedResponseData statusCode:200 headers:responseHeader];
    }
}];
```
対策として、以下のような選択肢が挙げられると思います。

- [こちらの記事](https://github.com/AliSoftware/OHHTTPStubs/wiki/Testing-for-the-request-body-in-your-stubs)に書かれている、`AFNetworking`を使う回避策を試してみる。
- [gamakoさん](http://qiita.com/gamako)の[記事](http://qiita.com/gamako/items/d71c03d88f7d8bde506b)を参考に、`NSURLSession`と`NSURLSessionTask`をモックしてみる。
- 厳しい現実を見つめなおす。回避策は諦め、テスト対象コードをもう少しテストしやすい設計になるよう見なおしてみる。（個別のリクエスト送信ごとにテストできる設計にするとか）

（この現象は、iOS8.1で確認した現象です。これ以降のiOSでは改善されているかもしれませんが……手元で確認してみましょう。）

## `[OHHTTPStubs removeAllStubs]`はレスポンスの処理が終わってから実行しましょう
`[OHHTTPStubs removeAllStubs]`は、必ず`OHHTTPStubs`のレスポンスの処理が完了してから呼び出しましょう。
非同期なテストケースでレスポンスが完了していない場合に`[OHHTTPStubs removeAllStubs]`を実行すると、
正常にスタブを解除できないため、別なテストケースで使うときに失敗してしまう場合もあります。

なので、[この記事](https://github.com/AliSoftware/OHHTTPStubs/wiki/Remove-stubs-after-each-test#warning)にも書かれている通り、レスポンスの処理が終わってからテストを終了する、という形に書きましょう。
さもないと、「`tearDown`で正常に解除しているのに！」という羽目に陥りかねません。
作成したEclipseプラグインをデバッグすると、メソッドが存在するのにNoSuchMethodErrorが出る場合

Eclipseのプラグイン開発における小ネタ。

## 何回かデバッグしていたらNoSuchMethodErrorが出て、実行できなくなった

プラグイン実行時に叩くActionクラスのIFを変更したり、色々試行錯誤していたら、何度目かのデバッグで
IViewPartを実装したクラス中に存在するメソッドの実行時にNoSuchMethodErrorが出るようになった。
Actionクラス、Viewクラス、どちらのメソッド名を変更してみても、状況は変わらなかった。

## 対策

以下に存在した「.snap」ファイルを削除することで、正常に動作させることができた。
※runtime-Eclipseアプリケーションは、デバッグ中に起動するEclipseのworkspace。

    runtime-Eclipseアプリケーション\.metadata\.plugins\org.eclipse.core.resources
    runtime-Eclipseアプリケーション\.metadata\.plugins\org.eclipse.core.resources\.projects
    runtime-Eclipseアプリケーション\.metadata\.plugins\org.eclipse.core.resources\.projects\<各サブディレクトリ>

サブディレクトリに存在する「.snap」のファイル名は、「.markers.snap」や「.syncinfo.snap」になっている。

全て削除後、再度デバッグを実行するとNoSuchMethodErrorが発生しなくなった。

### 参考

- http://sleepinghacker.blog.fc2.com/blog-entry-8.html


## ちなみに

Eclipseのプラグインは、フォルダに配置しても認識されないことがある。
「エラー・ログ」ビューを表示することで原因がわかることもあるが、エラーすら出ていない場合もある。
その場合、（もしかしたらどうにかすることができるのかもしれないが、）Eclipseを新しくセットアップして対応するしかなくなるときがあるので、大きめのプラグイン導入前は、Eclipseをworkspaceごとコピーして、バックアップを作成しておくと、万が一の事態に対処できるのでお奨め。

> だが、もしかしたらこのプラグインが認識されない問題も「.snap」を削除することで対応できる場合があるのかもしれない。プラグインがうまく認識されなくなった場合は、「.snap」ファイルができていないか確認してみるのは、対処としてありだと思う。
TPL Dataflowのサンプル

#はじめに
SQL Serverに大量のデータを変換しながら出力したい場合、１テーブルなら[IEnumerable から IDataReader へ変換](http://qiita.com/st450/items/831d90990658e023a679)で出来る。
１つのテーブルから複数のテーブルへ出力する場合、効率よく変換する方法はないかと調べたところ、Microsoft TPL Dataflow を見つけた。
なぜ非同期を使うのか？

1. メモリの負担をかけないためにはIEnumerableを使いたい（それしか知らない）
2. IEnumurableを使うとテーブルを出力する度にデータを読む（効率がよくない）
3. 非同期にすることで入力と出力が同時に動かせることが出来る

TPLをどのように使えば良いのか試行錯誤して、非同期でIEnumurableを返すクラスを作成してみた。
これで、IDataReaderに変換して、SqlBulkCopyに渡すことができる。

#準備
Microsoft TPL Dataflow は[Nuget](https://www.nuget.org/packages/Microsoft.Tpl.Dataflow/4.5.24)で取得する。

#サンプルコード
```csharp
using System;
using System.Collections;
using System.Collections.Generic;
using System.Threading.Tasks;
using System.Threading.Tasks.Dataflow;
using System.Threading;

class DataflowReadWrite
{
    class OutBuffer<T>
    {
        private BufferBlock<T> buf = new BufferBlock<T>();

        private bool isEnd = false;

        public void Post(T val)
        {
            buf.Post(val);
        }

        public void Complite()
        {
            isEnd = true;
        }

        public IEnumerable<T> AsEnumerable()
        {
            // 0.5秒待ってもデータがない場合終了の判断をする
            var tsLimit = new TimeSpan(0, 0, 0, 0, 500);
            while (!isEnd || buf.Count > 0)
            {
                T val;
                try
                {
                    val = buf.Receive(tsLimit);
                    Console.WriteLine("recive val:{0}", val.ToString());
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.Message);
                    continue;
                }
                // yield return はtryの中にはかけない
                yield return val;
            }

        }
        

    }

    static void Main(string[] args)
    {

        var buf1 = new OutBuffer<int>();
        var ite1 = buf1.AsEnumerable();
        var buf2 = new OutBuffer<int>();
        var ite2 = buf2.AsEnumerable();

        var reder = Task.Run(() =>
        {
            for (int i = 0; i < 10; i++)
            {
                buf1.Post(i);
                buf2.Post(i);
                Thread.Sleep(1000);
                Console.WriteLine("send val:{0}", i);
            }
            buf1.Complite();
            buf2.Complite();

        });
        var writer1 = Task.Run(() =>
        {
            foreach (var val in ite1)
                Console.WriteLine("Write1 val:{0}", val);
        });
        var writer2 = Task.Run(() =>
        {
            foreach (var val in ite2)
                Console.WriteLine("Write2 val:{0}", val);
        });
        Task.WaitAll(reder, writer1, writer2);

    }
}

```
メモ：ブックマーク

オブジェクト モデル リファレンス (Excel 2013 開発者用リファレンス) - https://msdn.microsoft.com/ja-jp/library/office/ff194068.aspx
Enumerable クラス (System.Linq) - https://msdn.microsoft.com/ja-jp/library/system.linq.enumerable(v=vs.110).aspx
enchant.jsとtmlib.jsを使ったゲーム作成フレームワーク「enforce」チュートリアル（１９）バーチャルゲームパッド

ここでは、「**game01**」というディレクトリ内で作業しているという前提で説明しています。

※**2015.02.21 バーチャルゲームパッドの仕様を変更しました。**

# バーチャルゲームパッドを表示する
「**PADAXES**」や「**PADBUTTONS**」を使用するとキーボードとゲームパッドでの操作が可能になりますが、スマホなどではどちらも接続することが難しいので、キャラクタを操作するゲームなどが作りにくくなっています。
そこで、オンスクリーンに方向指示と最大8つのボタンを表示出来るようにしました。

**※1 2015.2.15以前にclone/pullしたフレームワークにはバーチャルゲームパッドは入っていません。**

方向指示はそのまま「**PADAXES[0]**」に、8つのボタンは「**PADBUTTONS[0][0〜7]**」にそのまま対応してるので、パソコンのキーボードやジョイパッドで操作出来るように作ったものが、そのままバーチャルゲームパッドで操作出来るようになります。
表示させる方法は、ゲームソースのどこでもいいので、

```coffeescript
    createVirtualGamepad()
```
と記述するだけで画面の左下にバーチャルゲームパッドが表示されます。
ひとつ注意する点は、このバーチャルゲームパッドは重なり順ではどのスプライトよりも最上位に表示されるということです。
この方向指示をクリック（タップ）した結果は、「**PADAXES[0]**」にそのまま反映されます。
表示には下記のオプションがあります。

|パラーメーター名|意味         |デフォルト値|
|:-------------|:------------|:----------|
|scale         |サイズ        |1.0       |
|x             |表示x座標     |<strong>※2</strong>|
|y             |表示y座標     |<strong>※2</strong>|
|buttonscale   |ボタンのサイズ|1.0        |
|coord         |ボタンの座標  |[]         |

**※2 画面の左下に表示される座標に設定されます。**

方向指示のサイズは「**100x100**」に対して何倍なのかを指定します。
x座標、y座標は省略すると画面の左下に表示されます。
ボタンのサイズは「**64x64**」に対して何倍なのかを指定します。
ボタンの座標は、ボタンの数だけ指定します（最大8個）。

**例）**

```coffeescript
  createVirtualGamepad
    scale: 3
    x: 50
    y: 50
    buttonscale: 3
    coord: [
      undefined
      [SCREEN_WIDTH - (64 * 2 * 3) / 2, SCREEN_HEIGHT - (64 * 3) / 2]
      [SCREEN_WIDTH - (64 * 1 * 3) / 2, SCREEN_HEIGHT - (64 * 3) / 2]
    ]
```
上記の例は、「コントローラー部を3倍の大きさ、(x, y)=(50, 50)の位置に表示し、ボタンのサイズも3倍でボタン番号2と3を表示しろ」ということになります。
ボタンの数は、パラメーター「**coord**」に設定されている有効な座標の数だけになります。
上記の例では、ボタン番号1の座標設定が「**undefined**」となっています。
ですので、ボタン1は表示しません。
ボタン番号2と3の座標値が入っていますので、画面にはボタンが2つ表示され、それぞれボタン2とボタン3になります。
ボタンの座標の計算式で、3倍しているのはボタンのサイズが3倍なので、拡大したサイズで位置を計算しているためです。
最後に2で割っているのは、座標指示は画像の中心だからです。
ボタン番号はそのまま、**PADBUTTONS[n][0]〜[n][7]**に対応します。

# バーチャルゲームパッドの表示制御
画面に表示したゲームパッドの表示制御は「**dispVirtualGamepad(bool)**」という関数で行います。

```coffeescript
  dispVirtualGamepad(false)
```
で、非表示にすることが出来ます。

```coffeescript
  dispVirtualGamepad(true)
```
で、表示させることが出来ます。

[チュートリアル（１８）](http://qiita.com/digitarhythm/items/6e2bbbb80fa4fbb6acda) <--- ⬛︎

---

[enforceチュートリアル一覧](http://qiita.com/digitarhythm/items/9e75c871f5ce582a4d01)
パス文字列を画像に置換する

　えー、今回のネタはコンタクトシート作り用にやってみたネタでございます。

　コンタクトシートってのは簡単に言うと画像の一覧です。InDesignのJavascriptサンプルの中にもあるので使用されている人もいるかと思います。

　単純な画像一覧であればサンプルスクリプトを使っちゃうのも手ですが仕事で画像のリネームをした際の「確認用リスト」なんかを作る時には超絶面倒なわけです。

　Htmlなんかを使ってさくっと好きな一覧を作ってもいいんですが、何枚もの用紙にまたがるような一覧を綺麗に印刷するのは大変です。そこで今回は、

「InDesign で作成された表のセルに書かれたパス文字列を画像に置換する」

　という方法をとってみることにします。これならタグテキストなんかでさくっと好きな体裁の表を作成し、あらかじめ記述しておいた文字列をリンク画像に変換することで画像を手軽に配置できます。

　こーんな表を作っておいて、

![imageTable1.png](https://qiita-image-store.s3.amazonaws.com/0/4000/159f23da-b556-ce33-e832-61631001cc34.png)


　表を選択してスクリプトを実行すると、

![imageTable2.png](https://qiita-image-store.s3.amazonaws.com/0/4000/f1c8c31a-442e-6c75-06f9-542a5c9c59aa.png)

　こんな感じになっちゃいますよ。さてそれでは肝心のスクリプトをば、

・エラー処理とかはいつもどおり省略しております
・今回はサンプル画像にあるような表に対しての決め打ち処理で作ってます
・動作確認はWindows版CS6で行いました

```js:path2image.jsx
//　パスが書かれているセルのパス文字列を
//　リンク画像に置換する
//　Date 2015/2/4 by happyscript

//選択されている表組を対象とします
var myTable = app.selection[0];

//今回対象となる表の一行目はヘッダーなので無視（i=1)
for (var i=1;i<=myTable.bodyRowCount;i++) {
		//列の１番目cells[0]にパス文字列が記述されています
        var myObj = myTable.rows[i].cells[0];
        
        //段落テキストを取得
        var linkPath = myObj.paragraphs[0].texts.item(0).contents;
        
        //文字列消去（ここでparagraphsがnullになります）
        myObj.paragraphs[0].texts.item(0).contents = "";
        
        //アクティブセルにフレームを追加
        var myFrm = myObj.insertionPoints.item(-1).textFrames.add(); 
        
        //フレームのサイズを整えます
        myFrm.visibleBounds = ["1cm","1cm","4cm","5cm"];
        
        //フレームに画像を配置します
        myFrm.place(linkPath);
}
```
　終わった。はいこれだけす。すみません。画像のフィット処理やなんやかんやはご自由に変更してお楽しみくださいませ～!
boostのサンプルを解読していく



### Asio
|sample|version|lang|memo|
|:---|:---|:----|:----|
|[buffers](http://qiita.com/YukiMiyatake/items/f4641c54151a18c362f9)|1.57.0|C++11|Asioではコールバックでハンドラを登録するため、メモリの制御が難しい。ここでは shared_ptrをrambda関数にキャプチャさせ制御を行う方法を使っている|
|[buffers](http://qiita.com/YukiMiyatake/items/bba135483889d6fd3f9f)|1.57.0|C++03|上記のC++03版。C++11ではラムダキャプチャでshared_ptrを保持していたが、C++03ではboost::bindで保持するのが良さそう|
|[allocation](http://qiita.com/YukiMiyatake/items/36bd59171f39b6bef6b3)|1.57.0|C++11|async命令のハンドラー登録時に ハンドラコピー用メモリのallocate deallocateが発生するが、custom_handlerを作成し allocate deallocateを制御できる|
doxygenでbaserCMS用プラグインのドキュメントを生成してみた


doxygen というドキュメント生成に興味が湧いたので、作成したbaserCMS用プラグインのドキュメント生成やってみました。
パッケージ管理に Macports 使ってるんで、それにないか検索してみたらあったのでそれを利用。


## 環境
- mac OS X: 10.8.5
- macports: 2.3.3

＠2015/02/15 の port install で入ったバージョン

- doxygen: 1.8.7_0
- graphviz: 2.38.0_0+pangocairo+x11


## 手順

### 手順.1

```
$ sudo port install doxygen graphviz
```

結構な数の関連ライブラリが併せてインストールされました。


### 手順.2
完了したら、出力したいプロジェクトのルートに移動して以下。

```
$ doxygen -g
```

doxygen 用の設定ファイルが生成されます。
> Configuration file `Doxyfile' created.
> Now edit the configuration file and enter
> doxygen Doxyfile
> to generate the documentation for your project


### 手順.3
生成された設定ファイルの内容をそれなりに編集。
変更してみた内容は以下。
※ 全て変更しなきゃいけないルールはないです。必要に応じて調整すると良いです。

|オプション名|デフォルト値|変更した値|内容|
|----|----|----|----|
|PROJECT_NAME|My Project|OptionalLink|プロジェクト名を設定|
|OUTPUT_DIRECTORY||doc|ドキュメントを出力するディレクトリを指定|
|OUTPUT_LANGUAGE|English|Japanese|出力言語指定|
|RECURSIVE|NO|YES|再帰的なソースディレクトリの解析|
|FILTER_SOURCE_FILES|NO|YES|ソースコードページを生成する|
|STRIP_CODE_COMMENTS|YES|NO|ソースコードページではソース内のコメントを削除する|
|SOURCE_BROWSER|NO|YES|ソースファイルのリストが生成されます。|

#### 手順.3-1
以下を設定するとクラス階層が図で出力されました。すごい見やすい。

|オプション名|デフォルト値|変更した値|内容|
|----|----|----|----|
|HAVE_DOT|NO|YES|Graphviz で出力するための DOT ファイルを作る|
|CALL_GRAPH|NO|YES|コールグラフ（呼び出す側）を作成する|
|CALLER_GRAPH|NO|YES|コールグラフ（呼び出される側）を作成する|


#### 手順.3-2
他にも設定すると良いんじゃないかな？という項目

|オプション名|デフォルト値|変更した値|内容|
|----|----|----|----|
|EXTRACT_ALL|NO|YES|要素は全てドキュメント化する|
|EXTRACT_PRIVATE|NO|YES|private メンバーを全てドキュメントに出力する|
|EXTRACT_STATIC|NO|YES|static メンバーを全てドキュメントに出力する|


### 手順.4
出力したいプロジェクトのルートに移動し、ドキュメント出力用のコマンドを実行。

```
$ doxygen
```

これで doc ディレクトリ内にドキュメントが生成されました。
中の html/index.html をブラウザで開くと確認できます。

![クラス階層図](https://farm8.staticflickr.com/7426/16341926019_4179324ec6_n.jpg)


![クラス継承関係図](https://farm8.staticflickr.com/7441/16528247745_a3cb9af7a0_n.jpg)

▼ 生成したドキュメントのサンプルはこっちの記事に置いてます。
http://www.materializing.net/archives/2015/02/15011711.php


### 参考記事

- Doxygen http://www.doxygen.jp/config.html


### 追記@2015/02/18

- git clone した baserCMSを使ってそのまま出力してみた
 - 684.6MBのドキュメントになった（56,832ファイル）。所要時間は1時間くらい
https://twitter.com/arata/status/567712199569715200
milkcocoaでみんなでできる対戦落ちゲーを作ってみた


長年やってみたかったことがあります。

ぷ○ぷよというゲーム、同じいろのぷ○ぷよを４つつなげると消えるという単純なルールですが、とても人気があり面白いです。これがオンラインで出来たら楽しそうじゃありませんか？もちろん本家にオンラインバージョンもありますが、今回やりたいのは数十人でもできるぷ○ぷよです。

ぷ○ぷよ改め、ぽよぽよと名付けましょう。

http://syuhei176.github.io/pencil-battle/

画面に表示されている、ボタンクリックでぽよを移動します。真ん中のボタンは回転です。連鎖を決めると、同時にプレイしている他のプレイヤーにぽよが落ちてきます。ぽよは４つ集まると消えます。

他の人に連鎖したことを伝える部分やスコアの保存にmilkcocoaを使用しています。

milkcocoa：https://mlkcca.com/

ソースコードはこちらです。
https://github.com/syuhei176/pencil-battle

いままでオンラインで３人以上で対戦できる、落ちゲーをやってみたい、どんなカオスな感じになるんだろう、と考えていました。しかしリアルタイムに対戦できるゲームを作るとなると、サーバの用意などいろいろめんどくさいので、今まで機会を逃していました。

milkcocoaを使うと、サーバの用意が必要なく、Web APIを使う感覚でリアルタイム通信を実現できます。今回も半日で仕上げることが出来ました。

具体的な実装の説明は、またの機会にします。[milkcocoa](https://mlkcca.com/)をよろしくお願いします。
Reactで子要素を渡せるコンポーネントを作りたい


Reactでこんな感じのやつを作りたい。

```html:jsx
<ButtonGroup selected={this.state.selected} onSelect={this.onSelect}>
  <Button>foo</Button>
  <Button>bar</Button>
  <Button>baz</Button>
</ButtonGroup>
```

![Screen Shot 2015-02-14 at 11.01.10 PM.png](https://qiita-image-store.s3.amazonaws.com/0/12262/3034e378-0aff-9e0e-18e2-f49fbf2d9ed9.png "Screen Shot 2015-02-14 at 11.01.10 PM.png")

ButtonにButtonGroupからpropsを指定するためのいい方法がイマイチわからないんだけど、[React Bootstrap](http://react-bootstrap.github.io/)とかのコード読んでると`cloneWithProps`で複製してpropsを渡してるみたいだった。

こんな感じになった。

http://jsfiddle.net/hokaccha/a95sjyqz/

```javascript
var ButtonGroup = React.createClass({
  onSelect: function(index) {
    this.props.onSelect(index);
  },
  render: function() {
    var children = this.props.children.map(function(child, i) {
      return React.addons.cloneWithProps(child, {
        key: i,
        index: i,
        onClick: this.onSelect,
        selected: +this.props.selected === i,
      });
    }, this);

    return <div className="btnGroup">{children}</div>;
  }
});

var Button = React.createClass({
  onClick: function() {
    this.props.onClick(this.props.index);
  },
  render: function() {
    var cls = this.props.selected ? 'btn selected' : 'btn';
    return <span className={cls} onClick={this.onClick}>{this.props.children}</span>;
  }
});
```

でも @koba04 さんの記事に`cloneWithProps`はあんまり使いたい場面が思い浮かばないって書いてあるのでもっといい方法があるのではと思っている。

http://qiita.com/koba04/items/9709510cc68256557f2e#clonewithprops
PhoneGap アプリかWebか判別

##概要
PhoneGap(Cordova)アプリでとWebブラウザの両方で提供をする場合、それを判別する

##コード
アプリ化したときに組み込まれる cordva のオブジェクトがあるかどうかで判別する。
JavaScriptで、`ondeviceready` 発火後に以下のコードで判別できます。

```js
if(typeof cordova==="undefined"){
	alert("web browser");
}else{
	alert("phonegap");
}

```
UbuntuでSublimeTextをインストールする為のメモ

![sublime_text_icon_2181.png](https://qiita-image-store.s3.amazonaws.com/0/12499/6f807828-9988-037c-a3e1-9fff651f6b6c.png)

http://www.sublimetext.com/

#sublime Text3 をインストールする。

Pythonの開発が増えたので、そろそろTabでの記述から卒業かなと思い、エディターを探してsublimeに出会ったのでまとめました。

多分、この先長くお付き合いするだろうエディターなのでメモ残しておきますね。慣れるとヤバいw

sudo add-apt-repository ppa:webupd8team/sublime-text-3
sudo apt-get update
sudo apt-get install sublime-text-installer

#起動する

コマンドで

 subl

#Package Controllを入れて拡張する。

自分の環境ではスクリプトでのインストールに失敗したため（urllib2で何故かエラー)だったので、マニュアルでインストール

1)  Preferences > Browse Packages… をクリックしてフォルダーを表示

2) https://packagecontrol.io/Package%20Control.sublime-package でダウンロードしたパッケージを(1)で開いたフォルダーにそのままぶち込む。

3) Sublimeを再起動する。

4) Ctrl+Shift+P で何かが出てくるので、そこに install と打ち込んでInstall PackegがあればOK

#日本語で入力できるようにする。

1)関連パッケージをインストールする。 

sudo apt-get install ibus-mozc

sudo apt-get install emacs-mozc

2) Ctril+Shift+P でAdd Repository　を打ち込んで選択し、下に出てきた箇所に

https://github.com/yasuyuky/SublimeMozcInput

を入れてURLを覚えさせる。

3) Ctril+Shift+P でinstall pakegより「SublimeMozcInput」を選択する

4) Ctril+\で日本語テキストをテキストに入力してみる。

5) 自分はCtril+スペース派なので、キーショートカットを編集する。


Preferences > Key Binding-User をクリックし、
{ "keys": ["ctrl+space"], "command": "toggle_mozc" }を追加する

6) うまくいけば超ハッピー



#日本語メニューにする。


1) Ctril+Shift+P でinstall pakegより「Japanize」を選択しインストール

2) 再起動すれば日本語化される。

#　先人達に感謝

http://qiita.com/wakaba260/items/b2a1b40ccabc820917cb
http://qiita.com/lunatea/items/53f4adcc6ea3f316e781
http://qiita.com/kanpou_/items/bc739c1215fc222f17c8
https://github.com/yasuyuky/SublimeMozcInput

#Sublimit を細かくチューニングする。

http://qiita.com/lunatea/items/7101572e159f98369bc9

JSONでエディターの設定を変えられるのヤバい。
テーマもテキスト側とメニュー側で別々に設定出来たので、テキストは黒カラーでメニューは白カラーでって設定が出来て最高。
と言うか、このGUIの作り方、ものすごく勉強になる。
実はSublimeは有料エディターらしく、ちょくちょく募金サイト？に飛ぶが、これは払っても良い気がしてならない。よく作ったなぁ・・・w
FinderでファイルをコピーしてからTerminalにペーストすると絶対パスがペーストされる

タイトルで完結してるんですが、補足などを。

# Finderからファイルの絶対パスを取得したかった
探したらこんなのが見つかりました。

- [How to copy a file path in OS X - CNET](http://www.cnet.com/how-to/how-to-copy-a-file-path-in-os-x/)
- [【Mac便利ワザ】Finderでファイルのパスをコピーする方法 - すりゴマ・ドットコム](http://ground-sesame.hatenablog.jp/entry/2013/12/10/074044)

で、CNETの方の記事でFinderからTerminalにドラッグアンドドロップで絶対パスを取得できる、って書いてあったので、普通にコピペしたらどうなるのか？と思ってやってみたら期待通り動いたのでした。

# ペーストした時の絶対パスの形式について
シェルの入力としてエスケープされた状態でコピペされます。

つまり例えば以下の様なファイルがあった時

```
$ ls '/Users/takc923/hoge fuga ? #'
/Users/takc923/hoge fuga ? #
```

Finderでコピーしてターミナルにペーストするとこうなります

```
$ /Users/takc923/hoge\ fuga\ \?\ \#
```

空白等がエスケープされます。これはペーストするときシングルクォーテーションで囲った場所へペーストしたとしても同様です。

```
$ '/Users/takc923/hoge\ fuga\ \?\ \#'
```

ちなみにzshで以下の設定をしてあると、URLを自動でエスケープしてくれるんですが、ファインダでコピー＆ペーストした時のエスケープも似たような仕組みかな？と思ったので上記のような検証しました。

```
autoload -U url-quote-magic
zle -N self-insert url-quote-magic
```

# エスケープされてない絶対パスが欲しい場合

- ファイルを右クリック→情報を見る→「一般情報」の「場所」と、「名前と拡張子」をそれぞれコピーして組み合わせる
- shift+command+gで絶対パス指定でディレクトリ移動するフォームを呼び出して、そのフォームに目当てのファイルをドラッグアンドドロップ
- Automatorでサービスを作る

あたりの方法があるようです。詳細は参考URLのページ参照。
個人的には絶対パスが必要なのってターミナルで何かしらしたい時なので、エスケープされてない絶対パスが必要なことがあんまりないです。

# その他補足
- 動作はOSX10.9.5のFinder, Terminal, iTerm2, zsh, bashで確認してます。

# 参考URL（再掲）
- [How to copy a file path in OS X - CNET](http://www.cnet.com/how-to/how-to-copy-a-file-path-in-os-x/)
- [【Mac便利ワザ】Finderでファイルのパスをコピーする方法 - すりゴマ・ドットコム](http://ground-sesame.hatenablog.jp/entry/2013/12/10/074044)
!importantが最優先されない。なぜ？

文章全体を中央揃えしようとしています。
しかし、style内に入れている!importantでなぜか最優先されません。
idやclassはstyle内で対応してありますが省略。
!importantはここしか書いてません。
また、
> margin:0 auto;

でも試しましたが、できませんでした。なぜでしょうか？

```html:naze.html
<head>
<style>
　p { text-align: center !important; }
</style>
</head>

<body>
<section id="main">
　<h1>ほのかの挨拶</h1>
　<p class="item">ジャンボだよ！</p>
</section>
<section id="sub">
　<h2>まきちゃんの挨拶</h2>
　<p>アニョハセヨー！</p>
　<ul>
　　<li>live</li>
　　<li>live</li>
　　<li>live</li>
　　<li>live</li>
　　<li>live</li>
　　<li>live</li>
　　<li>live</li>
　</ul>
</section>
</body>
```
PowerDNS Recursorで特定ドメインだけ別のDNSサーバに名前解決させる

# これってつまり？
某回線事業者の閉鎖NWへのアクセス用。我が家では[Sophos UTM](http://www.sophos.com/ja-jp/products/free-tools/sophos-utm-home-edition.aspx)を使っていますが、ポリシールートがUTM自身に効かなかったので、時間かける程のものでもないし、仕方なく。

手順はとりあえずUbuntuのものなので、CentOSなどのRHEL系は適当に読み替えてください。

## 導入手順
### 1. インストール
標準パッケージで。

```
apt-get install -y pdns-recursor
```

### 2. 設定
LAN内でセキュリティ考慮もいらないので、以下のように設定。変更したのは2点で、forward-zones-recurseを追加して、local-addressを0.0.0.0にしてLISTENできるようにしました。（デフォは127.0.0.1のLISTENなので、外部から通信できない）

```
root@server:~# cat /etc/powerdns/recursor.conf |grep -v ^#|grep -v ^$
forward-zones-recurse=flets=123.107.190.5;123.107.190.6
local-address=0.0.0.0
local-port=53
quiet=yes
setgid=pdns
setuid=pdns
```

### 3. 設定反映
設定反映すると、forward設定したzoneについて言及してくれた。わかりやすい。

```
root@snakehead:~# service pdns-recursor restart
 * Restarting PowerDNS recursor pdns-recursor                                                                           Feb 15 00:12:02 Redirecting queries for zone 'flets.' with recursion to: 123.107.190.5:53, 123.107.190.6:53
     
```

### 4. 動作確認
適当な端末からdigって終了

```
$ dig www.flets

; <<>> DiG 9.9.5 <<>> www.flets
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 44345
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;www.flets.                     IN      A

;; ANSWER SECTION:
www.flets.              49982   IN      A       123.107.190.14

;; Query time: 16 msec
;; SERVER: x.x.x.x#53(x.x.x.x)
;; WHEN: 日 2月 15 00:12:07 JST 2015
;; MSG SIZE  rcvd: 54

```

## あとがき
ポイント交換するのに仕方なく。。。
ちなみにSophos UTM側の設定は、PPPoEインターフェースを複数上げてフ○ッツスクエア側をデフォルトG/Wなしで同時接続。あとはスタティックルート→ポリシールートで振り分け可能です。こっちの設定の方が需要あるのかな？
Oracleのテストデータを大量に作成する

#はじめに
バックアップの時間計測などの検証を行う際に、なんでもいいからデータが欲しい！ということで、色々調べて実験してみました。

#ユーザの作成
他に影響を与えたくないので、テスト用のユーザを作成します。

```
CREATE USER test IDENTIFIED BY "パスワード"
default tablespace USERS
temporary tablespace TEMP
profile default;
```

#テーブルの作成

```
CREATE TABLE test.A
(
DT            DATE,
EIJI          VARCHAR(120),
KANA          VARCHAR(50),
CD            VARCHAR2(10),
KIN           NUMBER(9,0)
);
```

#データの投入
以下のデータを投入するSQLです。
ひらがな以外はランダムです。これだけあればそれっぽいかなぁ～と・・・
・日付
・半角英数字
・ひらがな
・コード
・整数

```
INSERT /*+ APPEND */ INTO TEST.A NOLOGGING
SELECT 
--DT 2004/01/01から2014/12/31のランダム日付を取得
  TO_DATE('20040101','YYYYMMDD')
  +MOD(ABS(DBMS_RANDOM.RANDOM())
  ,TO_DATE('20150101','YYYYMMDD')-TO_DATE('20040101','YYYYMMDD')) DT
--EIJI 大文字のアルファベット文字と数字で文字列
  ,DBMS_RANDOM.STRING('X', 100)
--KANA かなを固定入力
  ,'あいうえおかきくけこさしすせそ'
--CD ランダムコードを取得
  ,TO_CHAR(ABS(DBMS_RANDOM.RANDOM()),'FM0000000000') CD
--KIN (-99,999から99,999)の間のランダム整数を取得
  ,MOD(DBMS_RANDOM.RANDOM(),100000) KIN
FROM
(SELECT 0 FROM ALL_CATALOG WHERE ROWNUM <= 1000) 
,(SELECT 0 FROM ALL_CATALOG WHERE ROWNUM <= 1000)                      
--1000×1000=100万件
;
commit;
```

ついでにインデックスも作成

```
CREATE INDEX test.idx_test_A_table ON test.A(DT);
```
Swift,AFNetworkingでQiitaAPIv2の認証



# 認証から利用までの流れ

1. https://qiita.com/settings/applications でアプリを登録し、Client ID, Client Secretを利用します。

2. このような認証URLをUIWebViewで表示する
`https://qiita.com/api/v2/oauth/authorize?client_id=***&scope=***`

3. リダイレクトURLの例
`http://qiita.com/roana0229?code=xxx`

4. 上記のcode部分を使ってPOSTする

```Login.swift
let URL: String = "https://qiita.com/api/v2/access_tokens?client_id=***&client_secret=***&code=リダイレクトされたURLに付加されているcode部分xxx"
var manager: AFHTTPRequestOperationManager = AFHTTPRequestOperationManager()
manager.POST(URL, parameters: params, success: { (requestOperation: AFHTTPRequestOperation!, response: AnyObject!) in
    // requestOperation.response.statusCode
    // requestOperation.responseString
}, failure:{ (requestOperation: AFHTTPRequestOperation!, response: AnyObject!) in
})
```

5\. success:requestOperation.responseStringの内容
　 `{"client_id":"~","scopes":"[~]","token":"xxx"}`

6\. これでトークンの取得が完了したので、GETなどで利用する

```GetWithBearer.swift
// urlStringは任意のURL
let token: String = "4で取得したtoken"
let url: NSURL = NSURL(string: urlString)!
let request: NSURLRequest = NSURLRequest(URL: url)
let requestOperation: AFHTTPRequestOperation = AFHTTPRequestOperation(request: request)
requestOperation.setRedirectResponseBlock({ (connection: NSURLConnection!, request: NSURLRequest!, redirectResponse: NSURLResponse!) in
    let fields: AnyObject = request.allHTTPHeaderFields!
    if fields.objectForKey(AUTH_FIELD) != nil {
        return request
    }
    var urlResuest: NSMutableURLRequest = NSMutableURLRequest(URL: request.URL, cachePolicy: request.cachePolicy, timeoutInterval: request.timeoutInterval)
    let authValue: NSString = NSString(format: "Bearer %@", token)
    urlResuest.setValue(authValue, forHTTPHeaderField: "Authorization")
    return urlResuest
})

requestOperation.setCompletionBlockWithSuccess( { (requestOperation: AFHTTPRequestOperation!, responseObject: AnyObject!) in
    //requestOperation.response.statusCode
    //requestOperation.responseString
}, failure: { (requestOperation: AFHTTPRequestOperation!, error: NSError!) in
    //requestOperation.response.statusCode
    //requestOperation.responseString
})

requestOperation.start()
```

# ちなみにAlamofireの場合

https://github.com/Alamofire/Alamofire のREADME.md
***CRUD & Authorization***の部分のようにして利用できるようです。
webサイトの脆弱性

##XSS（クロスサイトスクリプティング）
クロスサイトスクリプティングはユーザーからの入力をそのままエコーバック（オウム返し）するようなアプリケーションに対する、悪意のあるスクリプトを送信する攻撃。

###原理

```php
$userInput = （ユーザーから入力された値）;
echo $userInput;
```

上記のようなアプリケーションで、下記のような入力を受け取るとJavascriptのアラートが表示されてしまう。

```js
<script>alert('悪意ある文章')</script>
```

###対策

これはHTML出力時にHTMLエスケープをしてやることで対策が可能。

```php
echo htmlspecialchars($userInput, ENT_QUOTES, 'UTF-8');
```

##CSRF（クロスサイトリクエストフォージェリ）
クロスサイトリクエストフォージェリ（Cross site request forgeries、略記：CSRF、またはXSRF）は、www における攻撃手法のひとつである。具体的な被害としては、掲示板に意図しない書き込みをさせられたり、オンラインショップで買い物をさせられたりするなどが挙げられる。

###原理
1. 攻撃者がwww上に攻撃用のwebサイトを作成する
2. ユーザーがそのサイトを開く
3. ユーザーは攻撃者が用意した任意のHTTPリクエストを送信させられる
4. 攻撃者が意図した操作が行われる

下記が攻撃用のサイト例

```html
<!DOCTYPE html>
<html lang="ja">
<head>
  <title>攻撃用のページ</title>
</head>
<body onload="document.attackform.submit();">
<form name="attackform" method="post" action="http://example.com/bbs/register.cgi">
  <input type="hidden" name="title" value="攻撃者が指定した題名">
  <input type="hidden" name="article" value="攻撃者が指定した本文">
  <input type="submit" value="送信">
</form>
</body>
</html>
```

javascriptで`onload`が書いてある部分がミソで、ページが表示されると同時にフォームの内容が送信される。このwebサイトを1×1ピクセルのiframe内に表示させたものが以下のサイト。

```html

<!DOCTYPE html>
<html lang="ja">
<head>
  <title>誘導用のページ</title>
</head>
<body>
<p>ようこそいらっしゃいました。</p>
<iframe width="1" height="1" src="attack.html"></iframe>
</body>
</html>

```

![スクリーンショット 2015-02-10 1.05.58.png](https://qiita-image-store.s3.amazonaws.com/0/34879/6d9bf34e-cd28-882b-0108-43353e553850.png)


ユーザーは1×1ピクセルなど見えないので、実際に何か送信したことに気づきにくい。iframeの代わりにimgタグがつかわれることもある。

```html
<html>
<body>
<img src="http://example.com/bbs/register.cgi?title=攻撃者が指定した題名&article=攻撃者が指定した本文">
</body>
</html>
```

こちらは前述のPOST送信と違ってGET送信になるため、文字数などが限られるが、ひとつのサイト上に複数仕込む事が可能。

###対策
ユーザーが入力フォームから情報を入力して、送信していることを保証できれば、この問題は解決する。そのために入力フォームを表示させるときに下記のようなコードを仕込んでおく。

```html
 <input type="hidden" name="sessionid" value="セッション追跡用cookieの値"> 
```

この値をユーザーに保持させておいて、送信ボタン押下と同時にサーバーに送り返し、サーバーに保持してあるセッションと突き合わせることで認証が可能となる。


##SQLインジェクション
アプリケーションのセキュリティ上の不備を意図的に利用し、アプリケーションが想定しないSQL文を実行させることにより、データベースシステムを不正に操作する攻撃方法。

###原理
```sql
SELECT * FROM user WHERE name = '(入力値)'
```

ここで入力値に`t' OR 't' = 't';`と入力したとする。
すると、

```sql
SELECT * FROM user WHERE name = t' OR 't' = 't';
```

となり後半の条件がすべてのレコードにおいて真のため、全データが抽出される。

###対策
入力値のメタ文字`'`を`''`（単一引用符2つ）にエスケープしてあげることで意図したname`t' = 't'`を探すことができる。

```sql
SELECT * FROM user WHERE name = t' OR 't'' = ''t'';
```
WinSCPを使って特定ディレクトリにファイルを転送する

Windows用のFTP/SCP用ソフトとして割と有名なものにWinSCPというソフトがあります。エクスプローラー風にサーバーのフォルダにアクセスし、ファイルを配置したり、ミラーリングアップロードなどが行えるという優れものソフトです。

で、このソフトにはスクリプトでの動作という機能があります。コマンドラインオプションとして`/script=[スクリプトファイル名]`を指定してやると、スクリプトファイルを読み込み、定型的な動作を行ってくれます。開発中のプログラムファイルをサーバーに自動アップロードするバッチなどが組めるので良い感じです。

たとえば、以下のファイルは開発用テストサーバーにアクセスし、ローカルの特定フォルダと同期を行うスクリプトです(なお、.gitフォルダについては、アップロードしてしまっては困るので、除外しています)。開発中すぐに呼び出せるようにしておくと、デプロイの手間が省けますね。

```bat:mirror.bat(実際に実行するバッチファイル)
@echo off
set LOCAL="%~dp0"
set REMOTE="[リモートサーバー上で、ファイルを展開するフォルダ]"
set SESSION="[リモートサーバーの名前(あらかじめ一度WinSCPをGUIで起動しておき、接続先としてサーバーの情報を保存しておく必要があります)]"
winscp.exe /script=upload.txt /parameter %SESSION% %LOCAL% %REMOTE% /console
```

```winscp:upload.txt
option exclude ".git\"
open %1%
lcd %2%
cd %3%
synchronize remote -delete -criteria=time
exit
```

upload.txtの引数は、次の通り

 * 第一引数：リモートサーバーの名前
 * 第二引数：ローカルフォルダのパス
 * 第三引数：リモートサーバー上でファイルをアップロードするディレクトリのパス

コマンドラインオプションで引数を指定するときは、`/parameter`オプションを利用します。

一つだけ注意する点としては、スクリプトコマンドの`synchronize`コマンド。リモートサーバーのファイル構成をローカルフォルダの構成にあわせたい場合はremote、逆の場合はlocalを第二引数に指定します。間違えるとローカルフォルダ上にせっかく作ったファイルやフォルダが消されてしまうことになるので注意してください。
ruby雑学

####メソッド呼び出しの括弧を省略した時に第一引数が文字列リテラルかシンボルリテラルか前置コロンならスペースも省略できる

```rb
def hoge obj
  obj
end

hoge"piyo"
hoge:piyo
hoge:'piyo'
```

他のリテラルはダメっぽい
代入する時もダメっぽい

####レシーバのメソッドを呼ぶ時は . の前後にスペースがあってもOK
(改行を入れることがあるので当たり前と言えば当たり前)

```rb
1      .     succ
```

####シンボルリテラルの間にコメント

```rb
sym = :#piyopiyo
piyo

sym #=> :piyo
```

####ヒアドキュメントを引数にする時の挙動

```rb
puts(<<STR, "tyun")
piyopiyo
STR

#出力は
# piyopiyo
# tyun
```
なんかよく分からないけど良い感じに動く
Rubyのinjectには初期値を明示的に指定したほうがいい


~~ruby injectの第一引数のデフォルト値は配列の先頭の値になるため、平方和などを計算するときは初期値を明示指定する必要がある.~~
ruby injectの第一引数を指定した場合と指定しない場合では、配列走査の動きが異なるので、平方和などを計算するときは初期値を明示指定する必要がある.
http://docs.ruby-lang.org/ja/2.1.0/class/Enumerable.html#I_INJECT

総和の場合は問題ない

```rb
[1,2,3].inject {|sum,n| sum+n }
  # => 6
[3,2,1].inject {|sum,n| sum+n }
  # => 6
```

平方和の場合は問題あり

```rb
[1,2,3].inject {|sum,n| sum+n*n }
  # => 14
[3,2,1].inject {|sum,n| sum+n*n }
  # => 8
```

和の計算などで使う場合は初期値0を指定する

```rb
[1,2,3].inject(0) {|sum,n| sum+n }
  # => 6
[1,2,3].inject(0) {|sum,n| sum+n*n }
  # => 14
[3,2,1].inject(0) {|sum,n| sum+n }
  # => 6
[3,2,1].inject(0) {|sum,n| sum+n*n }
  # => 14
```

# Environment

```
% uname -a
Linux *** 2.6.32-431.el6.x86_64 #1 SMP Fri Nov 22 03:15:09 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux

% ruby -v
ruby 2.1.1p76 (2014-02-24 revision 45161) [x86_64-linux]

% cat /etc/issue
CentOS release 6.5 (Final)
Kernel \r on an \m
```
Gitリポジトリのホスト先を移行する方法

# 概要
- Gitリポジトリのホスト先を移行する方法です。(例：GitLab -> GitHub)
- 先に行っておくと[mirrorオプションを使うともっと簡単にできるようです。](http://tanacasino.hatenablog.com/entry/2013/08/03/233427)

```
$ git clone --mirror <SOURCE_REPOSITORY_URL>
$ cd <REPOSITORY>
$ git push --mirror <DESTINATION_REPOSITORY_URL>
```


# 方法
## 1. 移行元のリポジトリをclone

```
$ git clone 移行元のリポジトリ
```

## 2. ブランチをcheckout

```
$ cd リポジトリ名
$ sh git.sh (※)
$ rm git.sh
```

※git.shの中身

```
for i in `git branch -r|grep -v HEAD|grep -v master|sed 's:origin/::g'`
do
        git checkout --track -b $i origin/$i
done
git checkout master
```

## 3. 移行元のリモートリポジトリの登録削除+移行先のリモートリポジトリの登録
```
$ git remote rm origin
$ git remote add origin 移行先のリポジトリ
$ git remote -vで確認
```

## 4. push
```
$ git push --all
$ git push --tags
```
 
以上です:)
[swift]Web APIで取得した日付をNSDateに変換するextension

`2014-09-04T09:54:49+00:00`の形式の文字列をNSDate型に変換、表示するときは読みやすい文字列に変換するためのextension

``` DateExtension.swift
import Foundation

extension NSDate {
    class func parse(dateString:String) -> NSDate {
        let formatter = NSDateFormatter()
        formatter.locale = NSLocale(localeIdentifier: "en_US_POSIX")
        formatter.dateFormat = "yyyy'-'MM'-'dd'T'HH':'mm':'ssxxx"
        formatter.timeZone = NSTimeZone(forSecondsFromGMT: 0)
        let d = formatter.dateFromString(dateString)
        return NSDate(timeInterval: 0, sinceDate: d!)
    }
    
    func toString() -> String {
        let formatter = NSDateFormatter()
        formatter.dateStyle = NSDateFormatterStyle.MediumStyle
        formatter.timeStyle = NSDateFormatterStyle.ShortStyle
        return formatter.stringFromDate(self)
    }
}
```

最近のWebAPIだと`2014-09-04T09:54:49+00:00`のフォーマットで対応出来ると思うが、別のフォーマットの場合でもここを参考に変換できるはず。
http://userguide.icu-project.org/formatparse/datetime
RailsInstaller on Windows 8.1 検証メモ

Rails Girls Shiojiriに向けた、RailsInstallerを用いたRails環境構築の確認。
Windows 8.1環境で検証。

* Rails GirlsのGuideに従って、インストールから動作確認まで
  * http://railsgirls.jp/install/
  * http://railsgirls.jp/app/

# インストールについて

* `railsinstaller-3.1.0.exe`を用いた
	*  基本的にそのままウィザードを進めればＯＫ
	* Gitも同梱されている


# 注意事項

railsinstallerでインストールするRubyに環境変数(PATH)が上書きされるので、既にRuby環境が整っている人は、それまで使っていたRuby環境が使えなくなるので注意。（パスを変えないといけない）

# Railsのアップグレード

* 標準で同梱されているRailsは4.1.8
* 一応最新のものにupdate
	* 今回は4.2.0
	* 新しいRailsがリリースされたときに挙動が変わらないように、-vオプションできちんと指定した方が良いかも？
* Rubyで初めてネットワーク通信を行うので、Windowsファイアーウォールの警告が出る場合がある
	* ネットワーク接続時に「パブリックネットワーク」として接続した場合、「パブリックネットワーク」にもチェックが必要
* 例によってSSLエラーが発生する
	* [参考](http://qiita.com/shimoju/items/394818b4989b94680aaf)
	* [ここ](https://raw.githubusercontent.com/rubygems/rubygems/master/lib/rubygems/ssl_certs/AddTrustExternalCARoot-2048.pem)からダウンロードした証明書を`C:\RailsInstaller\Ruby2.1.0\lib\ruby\2.1.0\rubygems\ssl_certs`に移動(ブラウザでは右クリックで保存する。.txtがつく場合があるので「すべてのファイル」を選択してから保存)
	* rubygemsへのパスは`gem which rubygems`で確認できる

# Railsプロジェクトの作成

* `C:\Sites`内にプロジェクトを作成

```
rails new railsgirls
# bundle installで少し時間が掛かる
cd railsgirls
rails server
# 遅い：`INFO  WEBrick::HTTPServer#start: pid=**** port=3000`が表示されるまで待つ
```

# Scaffoldの作成

* http://railsgirls.jp/app/
	* に従ってscaffoldの発行は問題なし
* `http://localhost:3000/ideas`アクセス時に**エラー発生**
	* CoffeeScriptの変換に依存する部分が動作しない

# ExecJSのエラー

Windows上でCoffeeScriptの変換時にエラーが出る。

## 再現環境

* Windows 8.1
* Rails 4.2.0
* 原因となるgem（coffee-railsの依存gem）
	* coffee-script-source (1.9.0)
	* execjs (2.3.0)
		

## 内容

scaffold後のページにアクセスするとエラーが発生する。
CoffeeScriptのコンパイル時にエラーが発生。

```
ActionView::Template::Error (TypeError: オブジェクトでサポートされていないプロパ
ティまたはメソッドです。
  (in C:/RailsInstaller/Ruby2.1.0/lib/ruby/gems/2.1.0/gems/turbolinks-2.5.3/lib/
assets/javascripts/turbolinks.js.coffee)):
```

## 原因

CoffeeScriptのコンパイラはJavaScriptで実装されている。
このコンパイラのJavaScriptを実行するために、WindowsではWindows Script Host(以下WSH)という処理系が用いられる。（ExecJSというGemで自動的に環境判定を行って呼び出している）
CoffeeScriptのコンパイラ内で、WSHで対応していないJavaScriptのAPIが呼び出されていることが原因。

* 参考
	* http://qiita.com/scivola/items/ec7625118fcf6de5203a
	* http://www.oiax.jp/rails3book/execjs-runtime-error-on-windows8.html

## 対処

* JavaScriptの処理系にWSHを使わず**Node.js**を使う
* Node.jsをインストールするだけでOK

## Node.js のインストール

1. 以下のURLにアクセス
	* http://nodejs.org/
2. 「INSTALL」をクリックしてインストーラをダウンロード
	* おそらく自動的に適切なインストーラがダウンロードされるが、32bit, 64bit別々なので 
3.  ダウンロードしたインストーラを実行
	* ウィザードに従って特に変更無しで

※Node.jsインストール後に、**コマンドプロンプトを再起動すること** （`node`コマンドへのパスが通らないのでエラーが解消されない）


ここまでで、Scaffoldアプリの動作は全て問題なし。
PonyDebuggerを使ってみたい


詳しい人助けてください。

この辺を参考にしながらインストールしてponydを起動

https://github.com/square/PonyDebugger
https://github.com/square/PonyDebugger/issues/126

```bash
ponyd serve --listen-interface=127.0.0.1
```

アプリを起動すると、http://localhost:9000/ に端末の情報が来ていた。

![アプリ立ち上げたところ](https://qiita-image-store.s3.amazonaws.com/0/35008/3a20042d-d358-f057-b910-8a32f83acf10.png "スクリーンショット 2015-02-14 21.25.40.png")

が、これ以上なにも情報が出ない。
アプリ側の設定はこう。
ネットワークとビューの階層構造を監視する設定にしているんだけど。。

```AppDelegate.swift
  func setupPonyDebugger(launchOptions: [NSObject: AnyObject]?) {
    let ponyDebugger = PDDebugger.defaultInstance()
    ponyDebugger.enableNetworkTrafficDebugging()
    ponyDebugger.enableViewHierarchyDebugging()
    ponyDebugger.setDisplayedViewAttributeKeyPaths(["frame", "hidden", "alpha"])
    ponyDebugger.forwardAllNetworkTraffic()
    ponyDebugger.connectToURL(NSURL(string: "ws://localhost:9000/device"))
  }
  func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
    setupParse(launchOptions)
    setupPonyDebugger(launchOptions)
    return true
  }
```

```Podfile
platform :ios, "8.1"
pod 'AAShareBubbles', '~> 1.0.3'
pod 'FontAwesomeKit'
pod 'PureLayout'
pod 'Facebook-iOS-SDK'
pod 'PonyDebugger'
```

うーんと唸りながらリポジトリのREADMEをよく見ると、既知の問題としてこんな記述が。

> CoreData.framework must be linked, even if you do not use the Core Data browsing functionality.

お、これか？
ということでCoreData.frameworkを追加。

![＋ボタンを押して追加](https://qiita-image-store.s3.amazonaws.com/0/35008/0c31da4d-3ac6-b072-9b7e-03e306b85756.png "スクリーンショット 2015-02-14 21.33.54.png")

再起動。

状況変わらず。結局よくわからなかった。。

Xcode6.1.1