OmniAICreator/Qiita-1.07M huggingface dataset:
fluentdのforwardの出力を即時行わせる

# 初めに

この記事は目の前の問題を解決するために手っ取り早く設定だけコピペしたくてググって来た人のための記事です。

# 状況

Fluentdから出力された何かでゴニョゴニョしたいときは多くあります。
でもfluentdを使い始めて1分もしないエンジニアが良く引っかかるケースが

**「あれっ？fluentdのプロセスを殺した瞬間にしかデータを送ってくれないぞ？」**

というものです。
fluentdはリソース消費量の効率化のために、ある程度データが貯まるか、ある程度時間が経過しないとデータを送ろうとしません。（少なくともforwardは）
プロダクション環境では便利そうですが、デフォルトで60秒というのは開発時に不便なこともあります。

# 対策

[**ドキュメントに書いてある**](http://docs.fluentd.org/articles/out_forward#flushinterval)
読めば秒殺。結論としては

```:before
<match hoge.**>
  type forward
  host localhost
  port 9800
</match>
```

こんな感じにする。

```:after
<match apache.**>
  type forward
  host localhost
  port 9800
  flush_interval 0.1s
</match>
```

簡単ですね。ドキュメント読みましょう。
GraphQL概要（React Europe2015での発表の簡易まとめ）

## GraphQL

* [Lee Byron - Exploring GraphQL at react-europe 2015 - YouTube](https://www.youtube.com/watch?v=WQLzZf34FJ8)

React Europe 2015内でGraphQLの[working draft]((http://facebook.github.io/graphql/#sec-Response))と[GraphQLサーバのtechnical preview](https://github.com/graphql/graphql-js)の公開が発表されました。[GraphQLのアイデア自体は以前に発表されていたようですが](http://facebook.github.io/react/blog/2015/05/01/graphql-introduction.html)、今回のReact Europe 2015で初めて具体的な仕様と実装が発表されました。

GraphQLはFacebookが開発した、クライアントとサーバ間のデータのやりとりを簡単にするための言語です。
言語だけではなく、GraphQLを使うクライアントとサーバの仕様も含んで「GraphQL」と表現していました。

### 参考資料

* [GraphQL](http://facebook.github.io/graphql/#sec-Response)
  * GraphQLのworking draft
* [graphql/graphql-js](https://github.com/graphql/graphql-js)
  * GraphQLサーバのtechnical preview
  * この実装はあくまでtechnical previewとのことです。現在このリポジトリにはバックエンドからデータを取得するような記述はないです
* [RisingStack/graphql-server](https://github.com/RisingStack/graphql-server)
  * Node.jsとMongoDBを使ったGraphQLサーバとクライアントの実装
  * これを先に見たほうがイメージがつきやすいかもしれません

### GraphQL利用イメージ

以下の図は、クライアントとサーバ間でデータをやりとりする場合の

* REST APIなどを利用するデザイン
* GraphQLを利用するデザイン

をあらわしています。

![graphql-compare.png](https://qiita-image-store.s3.amazonaws.com/0/5882/883e3c58-e01d-7dbe-c8e3-fdf3ddc33260.png)

今回の発表や[GraphQL Introduction](http://facebook.github.io/react/blog/2015/05/01/graphql-introduction.html)では、REST APIやAd Hoc Endpointsを使ってクライアントとサーバ間でのデータのやりとりを行うと、複雑性が増したり非効率な処理になるという指摘がされています。

GraphQLは以下の特徴をもっているため

* 統一されたAPI（Endpoints）
* 型
* metadata

APIのバージョン管理、エンドポイント管理、クライアント側で取得したデータの管理…など、複雑で面倒な部分が解決できるのではないでしょうか。

### GraphQLの書き方

GraphQLの言語は、以下のように書くことができます。以下のサンプルコードは[working draft](http://facebook.github.io/graphql/#sec-Types-on-fragments)からの引用です。

```
query FragmentTyping
{
  profiles(handles: ["zuck", "cocacola"]) {
    handle
    ...userFragment
    ...pageFragment
  }
}

fragment userFragment on User {
  friends { count }
}

fragment pageFragment on Page {
  likers { count }
}
```

`query`以下は取得するデータ（`field`）をあらわしています。この例では、`profiles: { handle, friends/likers  }`を取得しようとしています。

`fragment`を使って、GraphQLでデータの構成をあらかじめ指定しておくことができます。また、`fragment`によってオブジェクトに含まれる`field`を変えることもできます。

この例の場合、サーバ側からは`Page`か`User`が返ってきます。上記のように複数`fragment`を指定しておけば、対象となるデータの型にあわせて適切なオブジェクトを作成することができます。
上記の実行結果は、クライアント側に以下のようなオブジェクトとして返されます。

```
{
  "profiles" : [
    {
      "handle" : "zuck",
      "friends" : { "count" : 1234 }
    },
    {
      "handle" : "cocacola",
      "likers" : { "count" : 90234512 }
    }
  ]
}
```

### 【番外】GraphQLへの移行方法についての質問と回答

Facebookチームへの質問コーナーで、

> 既存のREST APIをGraphQLサーバでラップするのはヤバイですか？

という質問がありました。開発者の1人であるLeeさんは、これに対する回答として以下のようにコメントされていました。

  > よいやり方だと思わない。REST APIをそのまま使ったほうがよい。移行するつもりなら、GraphQLサーバを用意しつつREST APIから段階的に移行するのがよいと思う。
[jsRender] Template tag: {{if ...}} について最近知ったこと

``JavaScript``のテンプレートエンジンである``jsRender``を愛用してますが
``if``文について、最近知ったことをちょっと。

[公式APIリファレンス](http://www.jsviews.com/#iftag)には

```html:sample
<h4>{{:title}}</h4>
{{if members && members.length}}
  <ul>
    {{for members}}
      <li>{{:name}}</li>
    {{/for}}
  </ul>
{{else standby && standby.length}}
  Standby only:
  <ul>
    {{for standby}}
      <li>{{:name}}</li>
    {{/for}}
  </ul>
{{else}}
  No members!
{{/if}}
```

のように、``true/false``や``undefined``で評価するんだよふうに書かれているけど

なんのことはなく

```html:sample2

{{if number === 1234}}
  <span>6億円！！</span>
{{else number === 1233}}
  <span>1億円！</span>
{{else number === 1235}}
  <span>1億円！</span>
{{else}}
  <span>はずれ</span>
{{/if}}
```

と書けるです。
（見逃してるだけだろうと思いますが…）
復元ポイントを作成する

下記から手動で作成できる復元ポイントをプログラムから作成する。
コントロールパネル
└システム
　└システムの保護
![image](https://qiita-image-store.s3.amazonaws.com/0/85010/291ac8b8-bb93-ebbc-cab6-e2b02c115613.png)

* * *

参照を追加。

```lang:C#
System.Management
```

復元ポイントの作成。

```lang:C#
var obj = new System.Management.ManagementClass(@"root\default:SystemRestore");
obj.InvokeMethod("CreateRestorePoint", new object[] {"さんぷる", 0, 100});
```

```lang:第一引数
画面に表示する文字列
```
```lang:第二引数
0：APPLICATION_INSTALL
1：APPLICATION_UNINSTALL
10：DEVICE_DRIVER_INSTALL
12：MODIFY_SETTINGS
13：CANCELLED_OPERATION
```
```lang:第三引数
102：BEGIN_NESTED_SYSTEM_CHANGE
100：BEGIN_SYSTEM_CHANGE
103：END_NESTED_SYSTEM_CHANGE
101：END_SYSTEM_CHANGE
```

[CreateRestorePointの詳細についてはこちらを参照](https://msdn.microsoft.com/en-us/library/aa378847(v=VS.85).aspx)

#追記 2018年5月8日

上記のサンプルだとWin10 Fall Updateで動作しないことが判明。
なぜか、Sprint 2018 Updateだと動いた。

```lang:C#
var obj = new System.Management.ManagementClass(@"root\default:SystemRestore");
obj.InvokeMethod("CreateRestorePoint", new object[] {"さんぷる", 7, 100});
```

上記のように引数を「0」から「7」に変更するとWin10 Fall Updateでも動作した。
Win7でも動作確認済み。
けれども、復元ポイントの一覧で説明が「さんぷる」とならずに「自動復元ポイント」となってしまう。
なんでやorz
そもそもリファレンスに「7」なんて引数は載ってないのだけども。

#追記 2019年9月5日
@bigston666 さんから情報をいただきました。ありがとうございます！
default:SystemRestoreの引数の「7」「6」はそれぞれ下記の通りらしい。
「7」CheckPoint
「6」System Restore
aws-sdkでアップロードする時にmd5を取り出す

aws-sdkでs3にファイルをアップロードする時、マルチパートアップロードだとEtagがmd5にならない。
なので、Transform経由で横取りして算出する。

```js:digeststream.js
'use strict';

var util = require('util');
var Transform = require('stream').Transform;
var createHash = require('crypto').createHash;

function DigestStream(algorithm, opts) {
  if (!(this instanceof DigestStream)) {
    return new DigestStream(algorithm, opts);
  }

  opts = opts || {};
  opts.objectMode = false;

  Transform.call(this, opts);

  this._hash = createHash(algorithm);
}
util.inherits(DigestStream, Transform);

DigestStream.prototype._transform = function(chunk, encoding, callback) {
  this.push(chunk);
  this._hash.update(chunk);

  callback();
};

DigestStream.prototype._flush = function(callback) {
  this.emit('digest', this._hash.digest('hex'));

  callback();
};

module.exports = DigestStream;
```

#使用例

```js:app.js
var fs = require('fs');
var zlib = require('zlib');
var AWS = require('aws-sdk');
var config = require('./config.json');
var s3 = new AWS.S3(config.s3);
var DigestStream = require('./digeststream.js');

var digestStream = new DigestStream('md5');
digestStream.on('digest', function(value) {
  console.log(value);
});

var stream = fs.createReadStream('./bigdata').pipe(zlib.createGzip()).pipe(digestStream);

var params = {
  Bucket: 'bucket',
  Key: 'key',
  Body: stream
};

s3.upload(params, function(err, data) {
  if (err) console.log(err, err.stack); // an error occurred
  else     console.log(data);           // successful response
});
```
bashで[ -v "$VAR" ]を使わずに変数が未定義か判定する


変数が未定義かどうか知りたい！`test`コマンドに`-v`ってオプションがあるらしい！`test`コマンド最高！
と思って実行したらbashが古くて`-v`非対応でした。代替案をつくらざるをえない。

## 結論＆解説（2020/02/13更新）

@mattintosh4 さんから[コメント](https://qiita.com/ymdymd/items/51bf4145ec58654eaffc#comment-c0d6797898d85edf3562)を頂きまして、記事を書き直しました。
読みやすさを優先して、古い記事はバッサリ削除してしまいました。ご了承ください。

### 結論

以下が真なら`VAR`は定義済みまたは空文字列、偽なら未定義です。

```
[ "${VAR+foo}" ]
```

空文字列の場合も偽として扱いたい場合は、
以下が真なら`VAR`は定義済み、偽なら未定義または空文字列です。

```
[ "${VAR:+foo}" ]
```

### 解説

bashのパラメータ展開を使います。
[Man page](http://linuxjm.osdn.jp/html/GNU_bash/man1/bash.1.html#lbBB)の記述では以下になります。

> 部分文字列展開以外の場合、以下の形式で、 bash はパラメータが設定されているか、空ではないかを調べます。 コロンを省略した場合には設定されているかどうかのみを調べます。

> ${parameter:+word}
> 別の値を使用します。 parameter が空文字列または設定されていなければ、空文字列に置換されます。 そうでなければ word を展開したものに置換されます。

パラメータ展開の指定方法と展開結果は以下の通りです。

|指定           |`VAR=bar`|`VAR=` |`unset VAR`|説明 |
|:--            |:--      |:--    |:--        |:-- |
|`"${VAR+foo}"` |`'foo'`  |`'foo'`|`''`       |`VAR`が未定義なら空文字、そうでなければ`foo`になる |
|`"${VAR:+foo}"`|`'foo'`  |`''`   |`''`       |`VAR`が空文字列または未定義なら空文字、そうでなければ`foo`になる |

`[ '' ]`は偽となるので、`[ "${VAR+foo}" ]`や`[ "${VAR:+foo}" ]`で判断できるというわけです。
PHPでメモリ上に一時ファイルを作る

#概要
PHPでファイルを変換したり、ダウンロードさせる処理を作る場合がある。
その時に、例えばダウンロードさせる処理の場合。
ユーザーにダウンロードさせた後はもういらない場合がよくある。
cronなどで自動的に消してもいいが、どうせなら最初から一時ファイルとして
扱ってしまえばいいのじゃないかと。
そんな時に便利なTips的な感じ。



```php:サンプルphp
/*
 例えば文字コードを変換してダウンロードさせる場合
  変換後のファイルは別にサーバーに残しておく必要がない
 （今回は、キャッシュの事はまた別次元として考える）
*/

//ローカルのファイルを読む
$data = file_get_contents("data.csv");

// 文字コード変換
$data = mb_convert_encoding($data, "UTF-8", "Shift_JIS"); 

//ここでメモリ上にファイルを作成する
$fp = fopen('php://memory', 'r+'); 

// 一時ファイルに書き込む
fwrite($fp, $data); 

// 書き込んだデータを読み込みなおす
rewind($fp); 

// 適当な処理を行い・・・
while ($row_value = fgetcsv($fp, 10000)) {
    print_r($row_value);
}

// 最後にクローズする
fclose($fp); 
```

一時ファイルであること以外は、
普通のファイルのように扱えるので処理が終わった後は自動的に消える。
Nodeでつくたwebappをherokuで公開

<h1>Nodeでつくったwebappをherokuで公開する</h1>

<h2>Herokuにデプロイ</h2>

まず`$ node app.js`で動かしていた場合はProcfileに`web:node app.js`と記入する

次に

```json:package.json
"script":{
        "start":"node app.js"
         }
``` 

を追加する、これでnpm startで動く

アプリ内にURLがある場合はhttpを消す
　　　例：`http://~~~~` ---> `~~~`とする

そしたら

`$ heroku create`

` $ git add .`

`$ git commit -m "comment"`

`$ git push origin master` 

`$ git push heroku master`でherokuにデプロイする

`$ heroku ps:scale web=1` ＊web=2にすると有料になるので注意


<h2> Addonsの追加 </h2>

`$ heroku addons:create [addonsname]`

自分の場合はmongoDBをつかってるから

`$ heroku addons:create mongolab`

さらにPORTの追加をする

![alt](https://gyazo.com/b86e7527409154c496d7bebefaa0a7ab.png)

でOK

<h2>HerokuとGithubを連携させる</h2>

![alt](https://gyazo.com/ea5ce9c9f54e4f423407999421283b15.png)

でできる。
cocos2d-js備忘録

#cc.LabelTTF

##高さ・幅変更
`setContentSize(size, height)`

##位置指定の基準点変更
`setAnchorPoint(point, y)`
`(0, 0)`は左下基準
`(0, 1)`は左上基準
`(0.5, 0.5)`は真ん中基準(デフォルト)
`(1, 1)`は右上基準

##内容の位置揃え
###水平方向
setHorizontalAlignment(alignment)
引数候補
`cc.TEXT_ALIGNMENT_LEFT`
`cc.TEXT_ALIGNMENT_CENTER`
`cc.TEXT_ALIGNMENT_RIGHT`

###垂直方向
`setVerticalAlignment(verticalAlignment)`
引数候補
`cc.VERTICAL_TEXT_ALIGNMENT_TOP`
`cc.VERTICAL_TEXT_ALIGNMENT_CENTER`
`cc.VERTICAL_TEXT_ALIGNMENT_BOTTOM`
mongodbが起動しない

## mongodbに接続できなくなった

```
$ mongo
MongoDB shell version: 2.6.3
connecting to: test
2015-07-06T16:37:10.218+0900 warning: Failed to connect to 127.0.0.1:27017, reason: errno:61 Connection refused
2015-07-06T16:37:10.219+0900 Error: couldn't connect to server 127.0.0.1:27017 (127.0.0.1), connection attempt failed at src/mongo/shell/mongo.js:146
exception: connect failed
```

強制終了とかすると mongod.lock というファイルが残り、起動できなくなるらしい

## 解決法
mongod.lock を削除して mongod --repair を実行する

## 解決できなかった
```
$ sudo mongod --repair
~
*********************************************************************
 ERROR: dbpath (/data/db) does not exist.
 Create this directory or give existing directory in --dbpath.
 See http://dochub.mongodb.org/core/startingandstoppingmongo
*********************************************************************
, terminating
2015-07-06T17:04:45.439+0900 [initandlisten] dbexit: 
2015-07-06T17:04:45.439+0900 [initandlisten] shutdown: going to close listening sockets...
2015-07-06T17:04:45.439+0900 [initandlisten] shutdown: going to flush diaglog...
2015-07-06T17:04:45.439+0900 [initandlisten] shutdown: going to close sockets...
2015-07-06T17:04:45.439+0900 [initandlisten] shutdown: waiting for fs preallocator...
2015-07-06T17:04:45.439+0900 [initandlisten] shutdown: closing all files...
2015-07-06T17:04:45.440+0900 [initandlisten] closeAllFiles() finished
2015-07-06T17:04:45.440+0900 [initandlisten] dbexit: really exiting now
```
/data/db がないよとエラーが出た
[こちら](http://qiita.com/hidesuke/items/56a87d827708c8c770da)を参考にもともとのデータがあった場所とシンボリックリンクを作成させた
```
mongod -dbpath /usr/local/var/mongodb
```

## 再度解決
mongod --repair させてmongod起動した後mongoコマンド実行したら接続できた

## 参考
http://azwoo.hatenablog.com/entry/2014/04/19/224644
http://qiita.com/hidesuke/items/56a87d827708c8c770da
test-kitchen+chef-zero環境でchef-shellを起動してレシピをデバッグする方法

test-kitchen+chef-zero環境でchef-shellを起動するオプションが複雑だったので調べたメモ。

chef-shellはchef-clientのインタプリタ環境です。chefレシピの開発してると毎回全部のレシピを実行するには何かと時間がかかるので、こーゆーインタプリタをうまく使いこなせると、chefレシピ開発が捗って良い感じですね。

基本的なchef-shellの使い方は公式のドキュメントを参照。
https://docs.chef.io/chef_shell.html

このエントリでは、test-kitchen+chef-zero環境で構築中のインスタンス内で、chef-shell起動するにはもろもろ色々なオプション指定してやらないといけないのですが、これが割りと複雑だったのでオプションのコピペ用のメモとしてまとめておきます。

まず、chefで構築対象のインスタンス内にログインし、chef-zeroのプロセスを起動します。

```
[ec2-user@myhost ~]$ sudo /opt/chef/embedded/bin/chef-zero
>> Starting Chef Zero (v4.2.1)...
>> WEBrick (v1.3.1) on Rack (v1.5) is listening at http://127.0.0.1:8889
>> Press CTRL+C to stop
```

もう一枚別のターミナルを開いて、knife uploadしてcookbookのデータを送り込みます。この時、/tmp/kitchen配下にtest-kitchenが送り込んだデータのキャッシュが残っているので、これを使います。

```
[ec2-user@myhost kitchen]$ cd /tmp/kitchen/
[ec2-user@myhost kitchen]$ sudo knife upload ./ -s http://127.0.0.1:8889 --chef-repo-path ./ -c client.rb
```

upload出来たら、chef-shellを-zのclientモードで起動します。client.rbとdna.jsonを一緒に渡すと.kitchen.ymlで指定しているattributesも読み込まれて、test-kitchenで実行しているのと同じ状態が再現できます。

```
[ec2-user@myhost kitchen]$ sudo -E /opt/chef/bin/chef-shell --config /tmp/kitchen/client.rb --json-attributes /tmp/kitchen/dna.json -z -S http://127.0.0.1:8889
loading configuration: /tmp/kitchen/client.rb
Session type: client
(略)

This is the chef-shell.
 Chef Version: 12.3.0
 http://www.chef.io/
 http://docs.chef.io/

run `help' for help, `exit' or ^D to quit.

Ohai2u ec2-user@myhost.example.com!
chef >
```

こんなかんじでchef>のプロンプトが出てきたら読み込み完了です。
後はrecipe_modeに入れば、レシピの書き方とか合ってるか対話的にデバッグできます。

ちゃんとchef-clientの実行コンテキストを理解しているので、例えばこのようにEncrypted Data Bagからの読み込みとかも出来ます。

```
chef > recipe_mode
chef:recipe > data_bag = Chef::EncryptedDataBagItem.load("db_servers", "dev-db01")
chef:recipe > decrypted_config = data_bag.to_hash
 => {"id"=>"dev-db01", "host"=>"dev-db01.example.com", "port"=>3306, "name"=>"database_dev", "user"=>"root", "password"=>"pass"}
```

これでレシピのデバッグが捗りますね。
Happy Chef Cooking !!
phoenixでmix releaseしたときにメモリが溢れるのを解決

# 問題
phoenixではデプロイするときにExrm（Elixir Release Manager）を使ってビルドする方法が推奨されているようで公式にも記載されている。
http://www.phoenixframework.org/v0.14.0/docs/advanced-deployment

上記のドキュメントに従って以下のように実行して

```
$ rel/hello_phoenix/bin/hello_phoenix start
```

wrk等のツールで以下のように負荷をかけて

```
$ wrk -t4 -c100 -d30S "http://localhost:4000/"
```

topでみてると天井知らずでメモリを食い潰して落ちる。
プロセス単位のGCが云々とはいったいなんだったのか。

# 解決
以下のようにdetachedオプションを付けて実行する。

```
$ rel/hello_phoenix/bin/hello_phoenix start -detached
```

## 考察
プロセスを見てみると以下のようになっている。

```
/your_directory/rel/hello_phoenix/erts-7.0/bin/run_erl -daemon /your_directory/rel/hello_phoenix/tmp/erl_pipes/hello_phoenix/ /your_directory/rel/hello_phoenix/log exec "/your_directory/rel/hello_phoenix/bin/hello_phoenix" "console"
```

startサブコマンドは具体的にはconsoleサブコマンドをdaemonオプションを付けて実行しているっぽい。

いったん話それて、Exrmを使わずに起動する別の手順が公式に載っていて
そっちには以下のような記述がある。

>```
>MIX_ENV=prod PORT=4001 iex -S mix phoenix.server
>```
>
>We can run our application detached from the iex console. This effectively daemonizes the process so it can run independently in the background. The command to do that looks like the following.
>
>```
>MIX_ENV=prod PORT=4001 elixir --detached -S mix phoenix.server
>```
>
>http://www.phoenixframework.org/v0.14.0/docs/deployment

これの前者で実行すると同様にメモリが溢れる。これはコンソールにログを出力し続けるのでわかる。
つまりstartサブコマンドもdaemon化されてはいるけど裏側でログをバッファに（？）出力し続けてる様子。

Exrmを使わない方の後者ではdetachedオプションが使われてるので同様のことをすれば解決できるっぽい。
erlドキュメントを見てみるとdetachedオプションが載っている。
http://erlang.org/doc/man/erl.html

付けてみたら仮説通りメモリが溢れなくなった。
公式よ、書いといてくれ。
CoffeeScriptの書き方


##基礎

###変数の宣言

```
string = 'abc'
float = 123
boolean = true
```

varとセミコロンが消えます

###コメント

```
# １行のコメント

###
複数行のコメント複数行のコメント複数行のコメント複数行のコメント複数行のコメント複数行のコメント複数行のコメント複数行のコメント複数行のコメント複数行のコメント複数行のコメント複数行のコメント複数行のコメント複数行のコメント複数行のコメント複数行のコメント複数行のコメント複数行のコメント複数行のコメント複数行のコメント複数行のコメント複数行のコメント複数行のコメント複数行のコメント複数行のコメント複数行のコメント
###
```

###配列

```
array = [
	'aaa'
	'bbb'
	'ccc'
]
```
カンマの代わりに改行を使う

###オブジェクト

```
obj = {
	a: 111
	b: 222
	c: 333
}
```
配列と同様にカンマの代わりに改行を使う

###制御文

```
val = 10
if val is 10
	console.log '10'
else
	console.log 'not 10'
```

条件式を()でくくらない、if文の中身を{}でくくらない

```
array = [
	a
	b
	c
]

for string in array
	console.log string
```

###関数

```
test = -> 
	console.log 'test'
```
test変数に無名関数を代入することで、test関数として実行できるようになる。

```
number = '2'

test = (number)->
	console.log 'test' + number
	
test(number)
```
引数を指定したい場合は ->の前に()をつけ、引数を指定します。

###->と=>の違い

```
class Hello
  constructor: (@name) ->
    result = $('#result')
    result.on 'click', ->
      alert 'こんにちは'+@name

h = new Hello('Aさん')
```
これの結果は、こんにちはundefinendになってしまいます。原因は、初めの@はオブジェクト自身を指しているが、次の@はイベントの発生元である、要素オブジェクトを指しているからです。
この問題を解消するのが=>です。これを使うと=>の外側で使っている@をそのまま関数の内側でも使えるようになります。
EC2でBundle Installすると、io/consoleエラーになる


# 問題1

Amazon Linux AMI 2015.03 (HVM), SSD Volume Type - ami-cbf90ecbのAMIで起動したインスタンスで、`bundle install`したら、`cannot load such file -- io/console (LoadError)`がでた

```
$ gem install bundler
$ git clone [Your Repository]
$ cd [Your Repository]
$ bundle install
```

```
/usr/share/ruby/vendor_ruby/2.0/rubygems/core_ext/kernel_require.rb:55:in `require': cannot load such file -- io/console (LoadError)
	from /usr/share/ruby/vendor_ruby/2.0/rubygems/core_ext/kernel_require.rb:55:in `require'
	from /home/ec2-user/.gem/ruby/2.0/gems/bundler-1.10.5/lib/bundler/vendor/thor/lib/thor/shell/basic.rb:2:in `<top (required)>'
	from /usr/share/ruby/vendor_ruby/2.0/rubygems/core_ext/kernel_require.rb:55:in `require'
	from /usr/share/ruby/vendor_ruby/2.0/rubygems/core_ext/kernel_require.rb:55:in `require'
	from /home/ec2-user/.gem/ruby/2.0/gems/bundler-1.10.5/lib/bundler/vendor/thor/lib/thor/shell/color.rb:1:in `<top (required)>'
	from /home/ec2-user/.gem/ruby/2.0/gems/bundler-1.10.5/lib/bundler/vendor/thor/lib/thor/shell.rb:17:in `shell'
	from /home/ec2-user/.gem/ruby/2.0/gems/bundler-1.10.5/lib/bundler/ui/shell.rb:14:in `initialize'
	from /home/ec2-user/.gem/ruby/2.0/gems/bundler-1.10.5/lib/bundler/cli.rb:12:in `new'
	from /home/ec2-user/.gem/ruby/2.0/gems/bundler-1.10.5/lib/bundler/cli.rb:12:in `rescue in start'
	from /home/ec2-user/.gem/ruby/2.0/gems/bundler-1.10.5/lib/bundler/cli.rb:10:in `start'
	from /home/ec2-user/.gem/ruby/2.0/gems/bundler-1.10.5/bin/bundle:20:in `block in <top (required)>'
	from /home/ec2-user/.gem/ruby/2.0/gems/bundler-1.10.5/lib/bundler/friendly_errors.rb:7:in `with_friendly_errors'
	from /home/ec2-user/.gem/ruby/2.0/gems/bundler-1.10.5/bin/bundle:18:in `<top (required)>'
	from /home/ec2-user/bin/bundle:23:in `load'
	from /home/ec2-user/bin/bundle:23:in `<main>'
```

## 解決

```
$ sudo yum install -y ruby-devel
```

# 問題2

`bundle install`したらまたこけた。

```
Building native extensions.  This could take a while...
ERROR:  Error installing io-console:
	ERROR: Failed to build gem native extension.

    /usr/bin/ruby2.0 extconf.rb
*** extconf.rb failed ***
Could not create Makefile due to some reason, probably lack of necessary
libraries and/or headers.  Check the mkmf.log file for more details.  You may
need configuration options.

Provided configuration options:
	--with-opt-dir
	--without-opt-dir
	--with-opt-include
	--without-opt-include=${opt-dir}/include
	--with-opt-lib
	--without-opt-lib=${opt-dir}/lib64
	--with-make-prog
	--without-make-prog
	--srcdir=.
	--curdir
	--ruby=/usr/bin/ruby2.0
/usr/share/ruby/2.0/mkmf.rb:434:in `try_do': The compiler failed to generate an executable file. (RuntimeError)
You have to install development tools first.
	from /usr/share/ruby/2.0/mkmf.rb:549:in `block in try_compile'
	from /usr/share/ruby/2.0/mkmf.rb:502:in `with_werror'
	from /usr/share/ruby/2.0/mkmf.rb:549:in `try_compile'
	from /usr/share/ruby/2.0/mkmf.rb:789:in `macro_defined?'
	from extconf.rb:6:in `<main>'
```

## 解決
Ruby2系で必要なyumパッケージがない

```bash
$ sudo yum install -y ruby20-devel gcc-c++
```
Amaznon EC2でRailsを動かすときに必要なパッケージ


# 前提条件
AMIは、Amazon Linux AMI 2015.03 (HVM), SSD Volume Type - ami-cbf90ecb
Databaseは、MySQLを使っている
Rubyは、バージョン`2.1.6`を使う。執筆時点の２.1系の最新版

# Gemfile

Gemfileに以下を追記

```
ENV['NOKOGIRI_USE_SYSTEM_LIBRARIES'] = 'YES'
```

# Package
一部のGemでコンパイルが必要ライブラリがあるため、以下のyumパッケージをインストールする

```
$ sudo yum install -y ruby-devel ruby20-devel gcc-c++
$ sudo yum install -y install libxml2-devel
$ sudo yum install -y install libxslt-devel
$ sudo yum install -y mysql-devel
$ sudo yum install -y readline-devel
```

`ruby`と`ruby20`は、`io/console`のため
`libxml2`と`libxslt`は、`nokogiri`のため
`mysql-devel`は、`mysql2`のため
`readline`は、コマンド系のスクリプトの実行のため


# rbenvとruby-buildをインストールする
AMIには、あらかじめRubyが入っているがrubygemsのバージョンが古いため、最新版のRails(4.2.2)では動かない。rubygems-updateも使ってもいいが、無難にrbenv/ruby-buildを使って閉じられた環境で最新版を利用する。

rbenv/ruby-buildは、以下の記事を参考にインストールする（手抜き）
[rbenv を使って ruby をインストールする(CentOS編)
](http://qiita.com/inouet/items/478f4228dbbcd442bfe8)を実行する

## Install Ruby

```
$ rbenv install -v 2.1.6
$ rbenv local 2.1.6
```


# Bundler

```
$ gem install bundler
```

あとは、自分のRailsプロジェクトを作って、`bundle install`すれば動くはず。

```
$ rails new your_project --database=mysql
$ cd your_project
$ bundle install
```
gitのブランチをまとめて削除する方法

gitのブランチをタスク毎に切っていくと、
気がついたときには500個くらい作業済みのブランチがたまってました。

```bash
$ git branch
TASK-101
TASK-102
TASK-103
TASK-104
TASK-105
TASK-106
TASK-107
master
develop
```

悲しいことにgitにはまとめて削除してくれるようなコマンドはないっぽい。

なのでxargsで１個１個削除していくコマンド
masterとdevelopは削除したくないので、grep TASKをつけることでTASKのブランチだけを削除できます。

```bash
$ git branch --merged | grep TASK | xargs git branch -d
```

これでスッキリ！
keyupの場合コピペがだめ。changeの場合入力してすぐ反映ができない。IE8対応版追記

たぶん、もう当たり前なんだろうけど若干つまったのでメモ。
・keyupの場合コピペでイベント発火ができない。
・changeだと入力してフォーカス外れないとイベント発火できない。
上記両方を回避するためにonのinputイベントでコピペでも発火するし
keyupのようにも発火するしという状態にしました。

```js
$(document).on('input', 'input[name=title]', function() {
//ここに処理
});
<input type="text" name="title" value="">
```

IE8非対応でした。

```js
$(document).on('input keyup blur', 'input[name=title]', function() {
//ここに処理
});
<input type="text" name="title" value="">
```
上記でIE8対応。
何故しないのか、超カンタンにUIlabelアニメーション

UIがアニメーションするとそれだけで高まります。
また、アニメーションによって数が積まれたり、引かれたり、捨てられたりと、直感的に理解出来る様になるなどカッコイイ以外にも重要な役割があります。

じゃあ何故しないのか。
大抵はカスタムビューの中でUILabelを２つ作ってインクリメントのたびにアニメーションして…あーめんどくせーなーーーー
っていうのが原因かと思います。

そしてこういうUIになります。

![before.gif](https://qiita-image-store.s3.amazonaws.com/0/24979/6317442f-6e68-5808-8a46-9688d783141b.gif)

が、そういう人こそ今すぐCAAnimationを使うべきです！

UILabelの更新前にこの魔法の５行を追記すると…

```objc

    CATransition *Anim = [CATransition animation];
    [Anim setType:kCATransitionMoveIn];
    [Anim setSubtype:kCATransitionFromBottom];
    [Anim setDuration:0.2f];
    [self.label.layer addAnimation:Anim forKey:nil];
```

![after.gif](https://qiita-image-store.s3.amazonaws.com/0/24979/b734ceae-b51f-6470-e99a-aa5b034560f4.gif)


このとおり！！

大袈裟なタイトルにしちゃったんですが、超カンタンですね！
ちょっと一塩かけてUIUXを向上しましょう！では！！
Heroku: RedisにCLIでアクセスし、コマンド操作する

# Heroku上のRedisに、CLIから繋いでRedis操作のコマンドを直接実行するまでのメモです。

HerokuのAdd-onでRedisを使ってみたのですが、Redisにローカルから直接つなぐ方法を中々見つけられず
あっぷあっぷしてしまいました。。
Herokuは便利なんですが、ドキュメントが探しづらい。。

## HerokuのAdd-onsといして、いくつかのRedisホスティングサービスがあります。
* [Add-ons](https://elements.heroku.com/addons)

![DB種類.PNG](https://qiita-image-store.s3.amazonaws.com/0/15448/cfa8b68c-2267-2c06-6f21-22c478e1589c.png)

* 今回は、Redis To Go を使いました。


## コマンドラインからRedisにつなぐ

### 自分のHerokuアプリのフォルダに移動して、heroku-redisプラグインをインストールする
プラグインのページは、[こちら](https://devcenter.heroku.com/articles/heroku-redis#using-the-cli)
Redis To Go用のプラグインではなく、Heroku Redis用のプラグインなのですが、
CLIツールはRedis To Goでも使えました。

```
heroku plugins:install heroku-redis
heroku redis:cli
```
だけです！

すると・・・

```bash:hogehogeは各自のアプリ名が入ります。
heroku redis:cli
 ▸    WARNING: Insecure Action
 ▸    All data, including the redis password, will be unencrypted.
 ▸    To proceed, type hogehoge or re-run this command with --confirm hogehoge

> hogehoge

Connecting to: REDIS_URL
ec2-54-221-206-137.compute-1.amazonaws.com:6379> PING
PONG
ec2-54-221-206-137.compute-1.amazonaws.com:6379>
```

みたいな形で、ローカルからHeroku上のRedisに直接アクセスできました。
環境変数のREDIS_URLを読み込んで、繋ぎにいくので、アプリごとのフォルダでコマンドを打つことで、
自動的にアプリが使用しているRedisにアクセスできます。

あとは、お好きなコマンドをなんなりと。

* [コマンドリファレンス](http://redis.shibu.jp/commandreference/)
AWSのLambdaを使ってお手軽な分散処理をする


## これはなにか
AWSのLambdaを使って分散処理をします。
今回はAWS SNSのsubscribe追加をS3へのアップロードをトリガーにしたいと思います。

## 仕組み
1. s3に登録したいsubscribeの情報を上げる
2. Lambdaでその情報を解析する
3. 解析した情報を元にSNSに登録していく

## この構成のメリット
よくあるパターンとしてAWS SNSの登録に時間がかかってしまいメルマガやPush通知を打つのに時間がかかるというケースがあります。
この構成の場合、複数のサーバからSNSの登録が行われるため高速になります。

## 登録したい内容
protocol: http
endpoint: http://example.com/[任意の文字]

## s3にアップロードする内容
```
1
b1
bb1
bbb1
bbbb1
bbbbb1
bbbbbb1
bbbbbbb1
bbbbbbbb1
bbbbbbbbb1
bbbbbbbbbb1
bbbbbbbbbbb1
```

## Lambdaの準備
```sample.js
var AWS = require('aws-sdk');

var sns = new AWS.SNS({
  apiVersion: '2010-03-31',
  region: 'ap-northeast-1'
});
var s3 = new AWS.S3({
  apiVersion: '2006-03-01',
  region: 'ap-northeast-1'
});

exports.handler = function(event, context) {
  var bucket = event.Records[0].s3.bucket.name;
  var key = event.Records[0].s3.object.key;
  var params = {
    Bucket: bucket,
    Key: key
  };

  s3.getObject(params, function(err, data) {
    if (err) {
      context.fail("Error getting file: " + err);
    } else {
      var objectBody = data.Body.toString();
      var lines = objectBody.split(/\r\n|\r|\n/);
      for (var i = 0; i < lines.length; i++) {
        var params = {
          Protocol: 'http',
          TopicArn: 'arn:aws:sns:ap-northeast-1:*************:lambda_to_sns',
          Endpoint: 'http://example.com/' + lines[i]
        };
        sns.subscribe(params, function(err, data) {
          console.log(data);
        });
      }
    }
  });

  // 終了条件若干適当なので、運用する場合はちゃんとするように
  setTimeout(function(){
    context.succeed();
  }, 10000);
};
```

## ファイル作成
1000ファイルぐらい作ってみる

```
for i in {1..1000} ; do echo "$i\nb$inb$i\nbb$i\nbbb$i\nbbbb$i\nbbbbb$i\nbbbbbb$i\nbbbbbbb$i\nbbbbbbbb$i\nbbbbbbbbb$i\nbbbbbbbbbb$i\nbbbbbbbbbbb$i" > ./hoge$i.txt ; done
```

## S3にアップロード
bucketにさっき作ったファイルを全部投げる

![スクリーンショット 2015-07-06 16.34.05.png](https://qiita-image-store.s3.amazonaws.com/0/53224/94256dc8-5f65-ef49-8ab9-e89536aa6629.png)

## 結果
![スクリーンショット 2015-07-06 16.32.44.png](https://qiita-image-store.s3.amazonaws.com/0/53224/0bfb3b4d-489c-2a42-90cf-527e139e714e.png)

## 注意すべき点
この辺りのLambdaの上限を気にすること
http://aws.amazon.com/jp/lambda/faqs/
> Q. 一度に実行可能な AWS Lambda 関数の数に制限はありますか?
> AWS Lambda では、特定のリージョンのアカウントごとの同時実行可能数が、デフォルトで 100 に制限されています。

あと今回はIAMの登録とか省略しているのでその辺りもちゃんと設定すること

## 最後に
ちゃんと運用するのであればエラーのハンドリングもするように
CakePHP3のプラグインのテストについて

# CakePHP3のプラグインのテストについて

CakePHP3でも当然テストというものが存在するわけですが、プラグインのテストは通常のテストとやや事情が違うようです。

##通常のテスト
通常のテストは特に気になるようなことはないですね

①テストケースの記載

(例) (ほぼbake)

```
<?php
namespace App\Test\TestCase\Model\Table;

use App\Model\Table\AccountsTable;
use Cake\ORM\TableRegistry;
use Cake\TestSuite\TestCase;

class AccountsTableTest extends TestCase
{

    public $fixtures = [
        'app.accounts',
    ];

    public function setUp()
    {
        parent::setUp();
        $config = TableRegistry::exists('Accounts') ? [] : ['className' => 'App\Model\Table\AccountsTable'];
        $this->Accounts = TableRegistry::get('Accounts', $config);
    }

    public function tearDown()
    {
        unset($this->Accounts);
        parent::tearDown();
    }
    public function testInitialize()
    {
        //テスト内容の記載
    }

}

```

## プラグインテストのお困り事

プラグインのテストについてですが、こちらのテストはできればプラグイン単体でテストしたいわけですね。(CakePHPのcreate-projectをしない)

理由としては
- 単に不要
- プラグイン内のdevの内容も反映した状態でないとテストできないが、**CakePHPのcomposer updateではプラグイン内のcomposer.jsonのdevは反映されない**(当たり前)

というわけです。

さてそうしたときに、通常のテストではapp.phpにテスト用のデータベースの設定を記載していたわけですが、**プラグインの場合**どこに書けばいいんでしょうか・・・

とりあえず私には見つけられなかったので自力で何とかしました・・・。

※因みに、bakeのテストなどではmockを使っているっぽいので公式も参考にならず・・・。

## やったこと
詳しくは[プラグインテスト用のプラグインを作成](https://github.com/satthi/plugin-test-support)したのでそっちを見てもらうとして、簡潔に

### データベースの接続を手動で設定など
はい、これが一番メインですね。

やっていることは
1. データベース接続設定
2. cacheを無効に
3. APPの定数設定

```
    public static function setUpBeforeClass(){
        parent::setUpBeforeClass();
        //データベース接続設定
        $connectionInfo = self::$_connectionInfo;
        
        //cacheの設定はしておらず、エラーになるためcacheを無効にする
        Cache::disable();
        
        //defaultは使わないがいないとエラーになるのでテストと同じものを設定する
        Configure::write('Datasources.default',$connectionInfo);
        Configure::write('Datasources.test',$connectionInfo);
        ConnectionManager::config(Configure::consume('Datasources'));
        
        //APPが定義されていないとエラーになるため。(逆に何か適当に設定してあればとりあえず動くみたい？)
        if (!defined('APP')){
            define('APP', self::$_appInfo);
        }
    }


```
もうすでにごり押し感が・・・

### fixtureを手動で実行

fixtureが自動で実行しなかったので(Datasourcesが設定されたタイミングが問題？)手動で実行します。

```
    public function setUp()
    {
        parent::setUp();
        //fixtureManagerを呼び出し、fixtureを実行する
        $this->fixtureManager = new FixtureManager();
        $this->fixtureManager->fixturize($this);
        $this->fixtureManager->loadSingle('Accounts');
    }

```

## まとめ
**本当にこんな~~糞面倒くさい~~事をしないといけないのか！？**

いや実際、この対応が本当に正しいか結構疑問なのですが・・・。
Mongo DB操作をcommand lineから行う

### 初めに
Mongo DBを操作する一番てっとり早い方法は、[Mongo shell (cli)](http://docs.mongodb.org/manual/reference/mongo-shell/)を操作する方法です。
`show dbs` `use xxx(dbの名前)` `show collections`などです。

```
#mongo
MongoDB shell version: 2.6.0
connecting to: test

> show dbs
admin     (empty)
local     0.078GB
hoge_db   0.078GB

> use hoge_db
switched to db local

> show collections
fuga_col
system.indexes
```

この作業をBat化したい！　という時に、`mongo localhost:27017/hoge_db mongobat.js`みたいに、jsファイルの中に処理内容をjavascriptで書くと、javascriptの内容をMongo cliが解釈してBat処理してくれるのですが、このjavascriptに関して自分にずばり参考になる取っ掛かりのSample Codeがうまく見つからなかったので、ご参考までにCodeをチラシの裏しておきます。

以下のような環境/手順を想定しています。

* Mongoが`localhost:27017`で動いている
* `hoge_db`というDatabaseの下に、`fuga_col`というCollectionがある
* 各例にあるような`mongobat.js`を作り、`mongo localhost:27017/hoge_db mongobat.js`と実行する


#### Case#1 CollectionのRecordを全部消す

```js:mongobat.js
print ("Record num for fuga_col: " + db.fuga_col.count());
db.fuga_col.remove({})
print ("Record num for fuga_col: " + db.fuga_col.count());
```

#### Case#2 Collectionを一旦削除して、再度作る

```js:mongobat.js
db.fuga_col.drop();
db.createCollection("fuga_col");
print ("Record num for fuga_col: " + db.fuga_col.count());
```

#### Case#3 Recordの中身を1つ出力する

```js:mongobat.js
print (JSON.stringify(db.fuga_col.findOne(), null, "  "));
```

#### Case#4 Query条件に当てはまるRecordの要素を出力する
ここでは、`type`、`user_count`というfieldがRecordに存在するという想定

```js:mongobat.js
var query = {type:"new_user"};
db.fuga_col.find(query).forEach(function(x){ print(x.user_count); });
```
javascriptのオブジェクト


###オブジェクトの書き方
 
 ```
 var  hoge = {
 	a: 123,
 	b: 'abc',
 	c: function(){
 		return 'xyz';
 	},
 	d: [4,5,6]
 };
 ```
 
 上記のオブジェクトhogeにはa, b, c,dの4つのプロパティがあり、aには123という整数、bには'abc'という文字列、cには文字列'xyz'を返す関数、dには配列[4,5,6]が定義されている。
 
 ```
 hoge.a = 789;
 ```
 
 このように書き換えたり
 
 ```
 var l = hoge.b;
 ```
 参照したり
 
 ```
 hoge.c();
 ```
 関数を実行したり
 
 ```
 var m = hoge.d[0];
 ```
 
配列の中身を参照したりすることができる。

```
hoge.e = function(){
	return 'new';
}

hoge['f'] = function(){
	return 'new2';
}
```

また、オブジェクトに新しい関数等を追加することも可能　(キーを指定して追加も可)
f.luxで画面を暗くし眼を守ろう

https://justgetflux.com/

windows版にもある様子。

Darkroomオプションはなかなかいいかも
![スクリーンショット 2015-07-06 15.58.29.png](https://qiita-image-store.s3.amazonaws.com/0/25728/a6b56647-996b-7f5e-0152-5c8c91bfd157.png)
MacでImageMagickをインストール


homebrewからインストールするとうまく動かず、悪戦苦闘したので覚書。
結果的にはパッケージからインストールすることにしたらうまくいきました。

パッケージ：http://cactuslab.com/imagemagick/

ターミナルで以下のコマンドを入れてファイルが開けばOK。

```
display
```

convertも試してみる。以下の様な感じで出たら成功。

```
convert
>> Version: ImageMagick 6.9.1-0 Q16 x86_64 2015-03-22 http://www.imagemagick.org
>> Copyright: Copyright (C) 1999-2015 ImageMagick Studio LLC
```

### convert失敗の場合
最初convertコマンドを入れたら、以下のように表示されました。パスが通っていないようです。

```
-bash: /usr/local/bin/convert
Command not found
```

$User/.bashrcを開き以下を追加

```
export LD_LIBRARY_PATH=/usr/local/lib
```

ターミナルで以下のコマンドを打つ。

```
source ~/.bashrc
```

再度convertを試してバージョンなどが表示されればOK。
css3 animation


***animation***プロパティには、 ***name, duration, timing-function, delay, iteration-count, direction***の６つのプロパティを組み合わせて指定することができます。省略された場合は初期値が入る。

#@keyframesを使ったアニメーション基礎

***@keyframes***とはアニメーション中に到達すべきポイントであるキーフレーム（通過点）を明示することで、アニメーションの流れの中間地点を制御することを可能にします。

##文字をバウンドさせるサンプル

```jade
div
	span.textbound SAMPLE
```

```sass
.textbound
	animation: bound 1.8s ease-in-out
	
@keyframes bound
	0%
		transform: scale(0) translate(0,-500px)
	50%
		transform: scale(2) translate(0,200px)
	70%
  		transform: scaleY(.5) translate(0,-100px)
	90%
       transform: scaleX(1.5) translate(0,50px)
	100%
       transform: scal(1) translate(0,0)
```

###transformプロパティで使える４つのメソッド

```txt
transform: scale(.5, 2)
```
scale(x,y)はサイズを大きくしたり小さくしたりするメソッド、最初の値でx(左右方向)、次の値でy(上下方向)のサイズを指定。
上の例では、横幅が半分に、縦には２倍になる。


```txt
transform: translate(300px, 0px)
```
translate(x,y)は上下左右に動くようにするメソッド、x(左右方向)、y（上下方向）で移動する距離をピクセルで指定。

```txt
transform: rotate(360deg)
```
rotate()は要素を回転させるメソッド。()内に回転させる角度を記述。正の値を代入すると時計回り、負の値を代入すると反時計回りで回転する。

```txt
transform: skew(20deg, 30deg)
```
skew(x, y)は斜めに歪ませるメソッド。最初の値でx(左右方向)、次の値でy(上下方向)に歪ませる角度を指定。
Eclipseでpythonスクリプトのデバックができない

Eclipse4.5（MARS）で pythonスクリプトの デバックしようと思っています。
パースペクティブを設定した後、インクプリタの設定のところで悩んでます。
画面左部のナビゲータのところでは the interpreter configured does not exist in the file system.というエラー表示
新規にインクプリタを選択し、名前およびインタープリターの実行可能ファイルを入力のところでは、
unable to get info on the interpreterというエラー表示が出ます。
この後はプロジェクトを作成し、スクリプトをインポートし、デバックの実行だと思うのですが。
お手数をかけますがよろしくお願いいたします。
Reactでthisがundefinedになるのを解決したい

詳しくは[React Componentでthisがundefinedになる問題の解決策]でまとめたのですが、React Componentで`this`が`undefined`になる解決する方法は4つあります。


1. XML内で`onClick={this.onClick.bind(this)}`の様に書く。
2. Autobinding: コンストラクタに`this.onClick = this.onClick.bind(this);`の様に書く。
3. ES7で@autobindデコレーター
4. ES7のFunction Bind Syntax: `onClick={::this.onClick}`の様に書く。

個人的にはFunction Bind Syntaxが一番シンプルなので気に入っています。


[React Componentでthisがundefinedになる問題の解決策]: http://blog.shouldbee.at/2015/07/06/prevent-undefiend-this-in-react/
Swiftでnkfみたいに文字コード推測

参考文献：ソースコードのコメント、Foundation->NSString(Jump to Definition of NSString)で到達可能
Apple API Reference: CFString Rerence, Working With Encoding
CFStringConvertEncodingToIANACharSetNameを検索


```swift:foo.swift
import Foundation                                                               

func detectEncoding(data: NSData) -> NSStringEncoding {
  return NSString.stringEncodingForData(
    data, encodingOptions: nil, convertedString: nil, usedLossyConversion: nil)
}

func encodingNameFromNSStringEncoding(encoding: NSStringEncoding) -> String {
  return String(CFStringConvertEncodingToIANACharSetName(
                CFStringConvertNSStringEncodingToEncoding(encoding)))
}

let testSet = [NSData(base64EncodedString: "44GT44KT44Gr44Gh44Gv",
               options: NSDataBase64DecodingOptions.IgnoreUnknownCharacters)!,
               NSData(base64EncodedString: "grGC8YLJgr+CzQ==",
               options: NSDataBase64DecodingOptions.IgnoreUnknownCharacters)!,
               NSData(base64EncodedString: "pLOk86TLpMGkzw==",
               options: NSDataBase64DecodingOptions.IgnoreUnknownCharacters)!]

for data in testSet {
  let encoding = detectEncoding(data)
  let name = encodingNameFromNSStringEncoding(encoding)
  let decoded = NSString(data: data, encoding: encoding)!
  print("\(encoding):\(name):\(decoded)")
}
//4:utf-8:こんにちは
//8:cp932:こんにちは
//3:euc-jp:こんにちは
```

Swift1.2, Swift2.0共にOK!!
~~（この原稿は書きかけです。）~~
NSString.stringEncodingメソッドはバイト列(Data)から文字列を生成を試みる事によってエンコードを特定します。どのエンコードでも文字列を生成出来ないと0が返ります。utf-8なら4が返ります。生成を試みる際にあらかじめエンコードの種類が分かっているならそれをメソッドの引数に与えてやることで特定に要するコストを下げる事ができます。

note: ずいぶん長く書きかけで放置してしまった。Swift5.10でも動作する様にしました。
```swift:nkf.swift
import Foundation                                                               

typealias NSStringEncoding = UInt
 
func detectEncoding(data: NSData) -> NSStringEncoding {
  let encOpt: [StringEncodingDetectionOptionsKey: Any] = [.suggestedEncodingsKey
  : [4, 8, 3]]
  return NSString.stringEncoding(for:
    data as Data, encodingOptions: encOpt, convertedString: nil, usedLossyConversion: nil)
}

func encodingNameFromNSStringEncoding(encoding: NSStringEncoding) -> String {
  return String(CFStringConvertEncodingToIANACharSetName(
                CFStringConvertNSStringEncodingToEncoding(encoding)))
}

let testSet = [NSData(base64Encoded: "44GT44KT44Gr44Gh44Gv",
               options: NSData.Base64DecodingOptions.ignoreUnknownCharacters)!,
               NSData(base64Encoded: "grGC8YLJgr+CzQ==",
               options: NSData.Base64DecodingOptions.ignoreUnknownCharacters)!,
               NSData(base64Encoded: "pLOk86TLpMGkzw==",
               options: NSData.Base64DecodingOptions.ignoreUnknownCharacters)!]

for data in testSet {
  let encoding = detectEncoding(data: data)
  let name = encodingNameFromNSStringEncoding(encoding: encoding)
  let decoded = NSString(data: data as Data, encoding: encoding)!
  print("\(encoding):\(name):\(decoded)")
}
//4:utf-8:こんにちは
//8:cp932:こんにちは
//3:euc-jp:こんにちは
```
YumでElasticsearchセットアップ

忘備録

【OS】
今回はCentOS6.6_x86_64版を使用。詳細は以下を参照。
http://centos.server-manual.com/
事前準備
セットアップに必要なパッケージを事前に設定しておく必要がある。以下を全て設定する。
システム変更が発生するので管理者権限が必須。rootにsuしておく事。

【YUMパッケージ管理】
yum -y install yum-plugin-fastestmirror
yum -y update
yum -y groupinstall "Base" "Development tools" "Japanese Support"
[RPMforgeリポジトリ追加]
rpm --import http://apt.sw.be/RPM-GPG-KEY.dag.txt
rpm -ivh http://apt.sw.be/redhat/el6/en/x86_64/rpmforge/RPMS/rpmforge-release-0.5.3-1.el6.rf.x86_64.rpm
[EPELリポジトリ追加]
rpm --import http://dl.fedoraproject.org/pub/epel/RPM-GPG-KEY-EPEL-6
rpm -ivh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
[ELRepoリポジトリ追加]
rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
rpm -Uvh http://www.elrepo.org/elrepo-release-6-6.el6.elrepo.noarch.rpm
[Remiリポジトリ追加]
rpm --import http://rpms.famillecollet.com/RPM-GPG-KEY-remi
rpm -ivh http://rpms.famillecollet.com/enterprise/remi-release-6.rpm

【SELinux無効化】
getenforce
Enforcing ←SELinux有効
setenforce 0
getenforce
Permissive ←SELinux無効
vi /etc/sysconfig/selinux
SELINUX=enforcing 
SELINUX=disabled ←変更(起動時に無効にする)

【iptablesでHTTPを許可】
vi /etc/sysconfig/iptables
-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 9200 -j ACCEPT ←追加
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT
Iptables再起動
service iptables restart

【JAVA】
CentOS構築時にデフォルトでインストールされたバージョンをアンインストール。
yum erase java*
最新版をネットより入手(rpm版)しインストール
rpm –ivh jdk-8u45-linux-x64.rpm
バージョン確認
java –version
java version "1.8.0_45"
Java(TM) SE Runtime Environment (build 1.8.0_45-b14)
Java HotSpot(TM) 64-Bit Server VM (build 25.45-b02, mixed mode)
■JAVA_HOME設定
vi /etc/profile
<pre>
export JAVA_HOME=/usr/java/default
export PATH=$PATH:$JAVA_HOME/bin
export CLASSPATH=.:$JAVA_HOME/jre/lib:$JAVA_HOME/lib:$JAVA_HOME/lib/tools.jar
</pre>

【Elasticsearch】
■リポジトリ作成
rpm --import https://packages.elastic.co/GPG-KEY-elasticsearch
vi /etc/yum.repos.d/elasticsearch.repo
[elasticsearch-1.6]
name=Elasticsearch repository for 1.6.x packages
baseurl=http://packages.elastic.co/elasticsearch/1.6/centos
gpgcheck=1
gpgkey=http://packages.elastic.co/GPG-KEY-elasticsearch
enabled=1
■インストール・起動
yum install elasticsearch
service elasticsearch start
chkconfig elasticsearch on
■確認
curl 'localhost:9200/_cat/health?v'

<pre class="programlisting prettyprint lang-sh">epoch      timestamp cluster       status node.total node.data shards pri relo init unassign
1436159102 14:05:02  elasticsearch green           1         1      0   0    0    0        0</pre>


【kuromoji】
日本語が検索できるように、kuromoji をインストールして設定。
最新版はhttps://github.com/elastic/elasticsearch-analysis-kuromoji
cd /usr/share/elasticsearch
bin/plugin --install elasticsearch/elasticsearch-analysis-kuromoji/2.6.0

vi /etc/elasticsearch/elasticsearch.yml
index.analysis.analyzer.default.type: custom
index.analysis.analyzer.default.tokenizer: kuromoji_tokenizer

elasticsearch再起動
service elasticsearch restart
git pullでコンフリクトが起きるときに片方の変更だけ適用する

* merge時については情報があったけどpullについては見つからなかったので
 * merge: http://qiita.com/nantekkotai/items/2ed17c3d774211d234a4

----

* -Xours/-Xtheirsを指定する
   * 基本的にはmergeのオプションと同じ
   * この際に--no-commitオプションもつけるとマージコミットを行わなくなるのでマージ後の入力を省くことが出来そう
       * その際は別途commitを行う必要がある
       * commitには-mオプションがあるので、エディタからのコミットメッセージの入力は回避可能

#### 手元の変更を適用する場合

> $ git pull -Xours *repo* *refspec*

#### pull先の変更を適用する場合

> $ git pull -Xtheirs *repo* *refspec*
Flow & Mortar で AlertDialog を出す

Flow と Mortar で Screen を作っていく時、ダイアログを出したい時、以下のような特別なクラスを使って AlertDialog を出します。

## Popup で AlertDialog を管理する

`Popup<I, R>` が AlertDialog を保持し、表示を行います。

ジェネリクスの1番目のパラメータは、AlertDialog に表示する内容を保持する Entity のような型を、2番目のパラメータは AlertDialog での選択結果を表す Entity のような型を指定します。

AlertDialog の選択結果を返すときは、`show`メソッドにわたってくる`PopupPresenter#onDismissed(R)`を呼び出します。この時、AlertDialog の各ボタンのイベントコールバック内で、フィールドに保持している AlertDialog のインスタンスを null クリアします。これによって、表示しているかどうかを管理できます。

```java

public class AlertPopup implements Popup<InfoEntity, Result> {
  private final Context mContext;
  private AlertDialog mDialog;

  public AlertPopup(Context context) {
    mContext = context;
  }

  @Override
  public void show(InfoEntity info, boolean withFlourish, PopupPresenter<InfoEntity, Result> presenter) {
    if (mDialog != null) {
      throw new IllegalStateException("Already showing, can't show " + info);
    }

    mDialog = new AlertDialog.Builder(mContext, R.style.Theme_Popup)
        .setView(contentView)
        .setCancelable(true)
        .setPositiveButton(android.R.string.ok, (dialog, which) -> {
          mDialog = null;
          presenter.onDismissed(Result.OK);
        })
        .setNegativeButton(android.R.string.cancel, (dialog, which) -> {
          mDialog = null;
          presenter.onDismissed(Result.CANCEL);
        })
        .setOnCancelListener(d -> {
          mDialog = null;
          presenter.onDismissed(Result.CANCEL);
        }).show();
  }

  @Override
  public boolean isShowing() {
    return mDialog != null;
  }

  @Override
  public void dismiss(boolean withFlourish) {
    mDialog.dismiss();
    mDialog = null;
  }

  @Override
  public Context getContext() {
    return mContext;
  }
}

public enum Result {
  OK, CANCEL
}
```

## PopupPresenter で表示と結果の受け取りをハンドルする

`Popup`専用に`PopupPresenter`というPresenterが用意されています。
自分たちで実装する部分は、結果を受け取ってどうするのか、という部分だけです。

```java

public class PopupScreen extends Path {
  public static class PopupPresenter extends mortar.PopupPresenter<InfoEntity, Result> {
    @Inject
    public PopupPresenter() {}

    @Override
    protected void onPopupResult(Result result) {
      // TODO implement your own code here
    }
  }
}
```

最終的に、この PopupPresenter 経由でダイアログを表示することになります。

```java

public class PopupView extends FrameLayout {
  @Inject
  PopupScreen.PopupPresenter mPresenter;

  @Override
  protected void onAttachedToWindow() {
    super.onAttachedToWindow();
    Button button = (Button) findViewById(R.id.button);
    InfoEntity e = InfoEntity.create(); // AlertDialog に出す情報を持つ
    button.setOnClickListener(v -> mPresenter.show(e));
  }
}
```
AndroidStudioでVolleyを使おうと思ったら「Project with path ':modules:volley' could not be found in root project hogehoge」とか言われた。OpenFileとか言われても。

自分用メモ。

AndroidStudioで、Volleyを使ってたら、ある日突然こんな事言われた。

> 「Project with path ':modules:volley' could not be found in root project hogehoge」

こんな感じ。
![WS000012.JPG](https://qiita-image-store.s3.amazonaws.com/0/55730/ded7b018-1093-a672-f3dc-1f0c7c1d9a31.jpeg)

先週の金曜日までは普通に使えてたのに・・・と思ったら、
settings.gradle が修正されていた。どうもどこかで選択肢を間違えたらしい。バージョン管理してなかったら解らなかった。

settings.gradle に以下の記述を追加。

> include ':app'
include ':modules:volley'

これで解決。
似たようなトラブルに会う人の役に立てばいいなあ。
0-dimension array問題


numpyのndarrayには0次元配列（以下、0-dim array）という、不思議な挙動をする配列が存在する。
これは、`numpy.array`にスカラー値を渡すと生成できる。

```
numpy.array(1, numpy.float32)
```

0-dim arrayはほとんどスカラー値（`float`, `numpy.float32`など）と同じ挙動である。

- 型はndarrayである
- `shape`は`()`である
- 通常のスカラー値とほとんど同じ振る舞いをする（ブロードキャストなど）
- 計算結果がスカラー（`numpy.float32`など）に変換される

以下に詳細を書く。

# numpyの挙動
## スカラー変換問題

0-dim arrayはある日突然スカラー値に変換される。

```
>>> type(numpy.array(1, numpy.float32) + 1)
<class 'numpy.float64'>  # ndarrayではない
```

numpyの仕様によれば、返却値が0-dimのときはスカラーに変換されるということである。
すなわち、ndarrayの演算の結果がndarrayでないときは、0-dim arrayに変換する処理が必要である。

## float64昇格問題

`numpy.float32`は、pythonの通常の`int`や`float`と演算すると、結果は`numpy.float64`が返される。
これらは64ビットである可能性があるからだとおもわれる。

```
>>> (numpy.float32(1) + 1).dtype
dtype('float64')
```

もちろん、ユーザーは気をつけて全ての値を`float32`にすれば、この問題は発生しないが、大変面倒である。

この問題は、0次元配列にも伝搬する。

```
>>> (numpy.array(1, numpy.float32) + 1).dtype
dtype('float64')  # float32ではない
```

ちなみに、1次元以上の配列ではこの問題は実は発生しない。先にアロケーションしてから`__iadd__`的な処理をしているからと推測している。

```
>>> (numpy.array([1], numpy.float32) + 1).dtype
dtype('float32')
```

また、既存の静的型付け言語でこの問題は発生しにくい。何故か。

```
float x = 1.0;  // floatになる
float y = x + 1.0;  // float + double だが、floatに変換される
```

最終的に代入先の変数に変換されるからである。
ただし、途中過程で`double`を経由することはあり得る。
あくまで、最後に型を強制されるから問題にならない。

# chainerにおける注意点

chainerでは`Variable`の中身は`ndarray`に限定している。これは、複数の型を許すと、型ごとに処理を切り替える必要が現れる可能性があるためである。

また同時に、原則的に現状では`float32`に限定している。これはCUDAのコードではメモリ配置がどうなっているか事前に把握した状態で処理する必要があるため、`float64`と`float32`でことなるカーネルを用意する必要が有るためである（将来的に、ここをテンプレート展開する用に処理することはあり得る）。

## forward計算でfloat32を返す

特に損失関数の`Function`では、正確に`float32`を返す必要がある。
これは、`xxxLoss`などのクラスで注意する。
以下の様なコードは危険である。

```
return numpy.array(loss),  # たぶんfloat64になる
```

必ず`float32`にする。

```
return numpy.array(loss, numpy.float32),
```

## numpyに処理を委譲する場合

numpyの振る舞いを考慮して実装する必要がある。
例えば`Add`の実装には注意が必要である。

```
def forward_cpu(self, inputs):
    return inputs[0] + inputs[1],
```

この処理は、仮に`inputs[0]`が0-dim arrayで`inputs[1]`が`int`のときに、`float64`昇格問題を引き起こす。
cesiumで「みちびき」の軌道をプロットした。

![michibiki.PNG](https://qiita-image-store.s3.amazonaws.com/0/18104/55ed06fd-2026-86d4-efaf-bcf91231dd4b.png)


[サンプルコード](http://jsdo.it/ohisama1/hpSR/edit)
この軌道が正しいか検算できる、学のある方、ご指導願います。
はてなブックマークへの追加を自動的にpinboardやdeliciousにも登録する

# 概要
はてなブックマークへブックマークを追加すると、自動的にpinboardやdeliciousにも登録されるようにします

# 追記
この記事は、はてなブックマークの外部連携サービス機能に含まれるWebhook機能を用いた事例の紹介でしたが、[この機能は2018年末に終了][1]しました。よって、この記事の内容はもう有効ではありません。
[1]:https://bookmark.hatenastaff.com/entry/2018/10/29/180645

# 必要なもの
- 何らかのWebサーバ
- perl動作環境
- Net::Delicious
- Config::Pit

# インストール
- 何らかのWebサーバを用意します。
- Net::Delicious, Config::Pitをインストールします。
- hatena2pinboard.pl <https://gist.github.com/mrmt/4564284> をcgi scriptとして設置します。

```pl:hatena2pinboard.pl
#!/usr/bin/perl
# from http://d.hatena.ne.jp/amachang/20090603/1244025898
use utf8;
use strict;
use warnings;
use CGI;
use Net::Delicious;
use Config::Pit;

use constant {
	PINBOARD_ENDPOINT => 'https://api.pinboard.in/v1/',
};

my $config = pit_get('hatena2pinboard',
		     require => {
			     hatena_webhook_key => 'xxx',
			     pinboard_username => 'xxx',
			     pinboard_password => 'xxx',
	     });
die 'pit_get failed.' unless %$config;

my $req = CGI->new;
$req->charset('utf-8');
print CGI::header('text/plain');

if($req->param('key') eq $config->{hatena_webhook_key}){
	if($req->param('status') eq 'add'){
		my $url = $req->param('url');
		my $title = $req->param('title');
		my $comment = $req->param('comment');
		post_pinboard($url, $title, $comment);
	}
}
print 'ok';
exit;

################################################################
sub post_pinboard{
	my $url = shift;
	my $title = shift;
	my $comment = shift;

	my $pinboard = Net::Delicious->new({
		user => $config->{pinboard_username},
		pswd => $config->{pinboard_password},
		endpoint => PINBOARD_ENDPOINT
	});
	$pinboard->add_post({
		url => $url,
		description => $title,
		extended => $comment,
		replace => 0,
	});
}

__END__
```

## hatena2pinboard 側の個人設定
- 以下の使い捨てスクリプト`set_pit`を用意
- `hatena_webhook_key` に適当なキー文字列を、`pinboard_username`にはpinboard.inのユーザ名、`pinboard_password`にはpinboard.inのパスワードを記入
- 実行
- `~/.pit` というディレクトリが出来ます。このディレクトリをWebサーバの実行ユーザのホームディレクトリにコピーします。

```pl:set_pit
#!/usr/bin/perl
use strict;
use warnings;
use Config::Pit;

Config::Pit::set('hatena2pinboard',
		 data => {
		     hatena_webhook_key => 'mogemoge',
		     pinboard_username => 'yourname',
		     pinboard_password => 'foobar'
		 });
```

## はてなブックマーク側の個人設定
- はてなブックマークの「設定」から「外部サイト連携」のタブを選びます
- 「Web Hook(開発者さま向け, 3つまで登録できます)」の項目にて、「イベント通知を受け取るURL」にはhatena2pinboard.plを設置したurl, 「キー」には、先ほど決めて`set_pit`で設定したキー文字列を記入します。
- ![ad1e81fe7899dfa3456f3f30f72ac95b.png](https://qiita-image-store.s3.amazonaws.com/0/36428/38d4912a-02c0-d091-42be-fe04acb0d848.png)

# ほか
- この例では, はてなブックマークのWeb Hookを受けてブックマーク登録する対象がpinboard.inですが、pinboard.inのAPIはdelicious互換らしく、そもそも使っているライブラリもNet::Deliciousですので、APIのエントリポイントをdeliciousのものに書き換えてやれば、deliciousに対しても動くと思います。