OmniAICreator/Qiita-1.07M huggingface dataset:
SensorBeeとは何か？

オフィシャルサイト： http://sensorbee.io/
GitHub： https://github.com/sensorbee/sensorbee

とりあえず、公式サイトの英語を日本語でサマってみました。

オフィシャルサイトでは、"An open source stream processing engine for IoT"、"Stream processing in IoT environment"。
GitHubのREADME.mdでは、"Lightweight stream processing engine for IoT"、と書いてあるので、「IoT向けの軽量なストリーム処理エンジン」と思われる。

特徴としては、低レイテンシが謳われている。

また、次の３つを軸に設計が行われているらしい。

## ステートフル
* 機械学習などでは非構造化データから有益な情報を抽出したりするが、SensorBeeはそのようなオンライン機械学習に効果的
* ChainerやJubatusの幾つかのコンポーネントなど様々な機械学習のツールキットをサポート
* SensorBeeのクエリー言語は、ステートフルな一時的データハンドリングができる

## 表現力
* 操作やクエリーは継続クエリー言語の一種であるBQLで記述
* BQLはとてもパワフルな言語でSQLに親しんでいる人たちに取っては学びやすいものである
* BQLはスキーマレスで、JSONっぽいデータ構造を持つ
* JSONを扱うための使いやすい色々な機能も提供

## 軽量
* 最小フットプリントは30MB未満なので、Raspberry Piなどの小型コンピュータ上でも実行することが可能
* まだまだ、十分に小さいわけではないので、今後、もっと小型のコンピュータ上でもBQL文を実行できるようにしていくことを目指している

逆に、次の３つは設計に盛り込まれていないらしい。

* 超大規模データ処理
* 巨大な並列ストリーミングデータ処理
* エラーが何もない正確な数値計算


ちょっとおまけで実行した際のコンソール出力も。

```lang:引数なし
>sensorbee                                                                                                                               NAME:
   sensorbee - SensorBee

USAGE:
   sensorbee [global options] command [command options] [arguments...]

VERSION:
   0.3.2

COMMANDS:
   run		run the server
   shell	BQL shell
   topology, t	manipulate topologies on SensorBee
   exp		experiment BQL statements
   runfile	run a BQL file
   help, h	Shows a list of commands or help for one command

GLOBAL OPTIONS:
   --help, -h		show help
   --version, -v	print the version
```

```lang:引数あり
>sensorbee run
INFO[0000] Setting up the server context                 config={"logging":{"log_dropped_tuples":false,"min_log_level":"info","summarize_dropped_tuples":false,"target":"stderr"},"network":{"listen_on":":15601"},"storage":{"uds":{"params":{},"type":"in_memory"}},"topologies":{}}
INFO[0000] Starting the server on :15601
```

次回は、実際にチュートリアルを実行してみようと思います。
emacs on Yosemite で github-browsefile が開かないときの対処方法

デフォルトブラウザを Google Chrome にしているのだけれど、ある時から `github-browsefile` を実行してもブラウザの初期ページが表示されるようになってしまっていた。
以下の様にブラウザを直指定することで解決することを確認できた。


```lisp
;; openからだとうまく開けないのでブラウザを直指定する
(setq browse-url-browser-function 'browse-url-generic
      browse-url-generic-program "/Applications/Google Chrome.app/Contents/MacOS/Google Chrome")
```

別マシンの emacs-24.5 だと問題なかったので、もしかすると emacs-24.5 以降だと問題ないのかもしれない

環境
---------

- emacs 24.4.1
- OS X Yosemite
- Google Chrome 48.0.2564.116

調査
---------

- `browse-url` という組み込みコマンドが使われている
  - `browse-url-browser-function` で実行する関数を指定できる
  - `browse-url` では emacs 24.4 以前では osx の `open` コマンドに対応できていない・・・のか？？
      - 前はちゃんと動いていたような気がするのだが・・・
      - 別マシンの 24.5 on El Capitan だと特に問題なく動作する
      - 再現環境についてはもう少し切り分けれそう
- https://github.com/rolandwalker/osx-browse を使うと 24.4 以前でももう少しましに対応できそう・・・と思ったがあまりうまくいかなかった
	- `osx-browse-url-chrome` だとなんかうまくうごかなかった。。。
	- `osx-browse-url-safari` は大丈夫だった
	- `osx-browse-url-firefox` は safari が起動する・・・どういうこと
first_or_initializeとfind_or_initialize_by


この２つのメソッドは同じような用途で使えますが、どのような使い分けをすればいいのかをまとめてみました。

## find_or_initialize_by

```rb
# File activerecord/lib/active_record/relation.rb, line 222
def find_or_initialize_by(attributes, &block)
  find_by(attributes) || new(attributes, &block)
end
```
`find_by`と`new`の引数に同じ`attributes`が渡される。
なので、下記のようなJOINしたテーブルを検索条件に含めると`ActiveRecord::AssociationTypeMismatch`の例外が発生する。

```rb
A.joins(:bs).find_or_initialize_by(bs: {id: 1})
```

## first_or_initialize
```rb

# File activerecord/lib/active_record/relation.rb, line 161
def first_or_initialize(attributes = nil, &block)
  first || new(attributes, &block)
end
```
`first`がない場合、`first_or_initailize`の第一引数でオブジェクトを初期化するので、下記のように検索した条件とは別にAttributeで初期化することができる。

```rb
A.where(name: "foo").first_or_initialize(name: "bar")
```

引数を省略すると、もちらんAttributeはなにも設定されないまま初期化される。

## まとめ
- `join`をして、検索条件に`join`したテーブルが含んでいる場合は`first_or_initialize`
- 検索条件と初期化したいオブジェクトのAttributeと違う場合は`first_or_initialize`、同じ場合は`find_or_initialize_by`

## 参考リンク
- [first_or_initialize](http://apidock.com/rails/ActiveRecord/Relation/first_or_initialize)
- [find_or_initialize_by](http://apidock.com/rails/ActiveRecord/Relation/find_or_initialize_by)
[iOS]GitHub + Travis CI + Slack

<p>GitHubにリポジトリがあるプロジェクトのTOPディレクトリ（.gitディレクトリがあるディレクトリ）に.travis.ymlファイルを作成する。</p>

<pre><code>language: objective-c
osx_image: xcode7.2
script:
  - xcodebuild test -project Xxxx.xcodeproj -scheme XxxxTests -destination 'platform=iOS Simulator,name=iPhone 6s' ONLY_ACTIVE_ARCH=NO
  - xcodebuild test -project Xxxx.xcodeproj -scheme XxxxUITests -destination 'platform=iOS Simulator,name=iPhone 6s' ONLY_ACTIVE_ARCH=NO
notifications:
  email:
    - XXXX@XXXX.XXX
  slack: XXXXXXXXXX
</code></pre>

<p>上記の例は、単体テストとUIテストを実行する内容となっている。</p>

<p>現時点で、osx_imageを指定しないとXcode 6.1 (10.9.x)となるので、最新のXcode 7.2 (10.11.x)を設定している。</p>

<p>xctoolを使ったビルドの方が楽だと思うが、著者の環境ではビルドエラーとなったため、xcodebuildを使っている。</p>

<p>notificationsのemailには結果を通知してほしいメールアドレスを記述する。slackには結果を通知してほしいslackno
slackの場所を設定するのだが、何を設定するかは、後ろで説明する。</p>

<p>Xcodeプロジェクトを外部サービスでビルドする場合は、スキーム毎に許可を与える必要がある。</p>

<img width="192" alt="schemes.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/12540/fd74b1b4-efd1-4978-7a9c-e5a9875d3647.jpeg">

<p>slackのIntegration SettingsでTravis CIの設定を行い、Tokenを得る。</p>

<p>これを.travis.ymlに設定すると、このリポジトリにpushする度に、テストが走る。</p>

関連情報
<a href="https://github.com/">GitHub</a><br />
<a href="https://travis-ci.org/">Travis CI</a><br />
<a href="https://slack.com/">slack</a><br />

【Cocoa練習帳】
<a href="http://www.bitz.co.jp/weblog/">http://www.bitz.co.jp/weblog/</a><br />
<a href="http://ameblo.jp/bitz/">http://ameblo.jp/bitz/</a>（ミラー・サイト）<br />
<a href="https://t.co/6P3h2jtbRk</a>note<br />
<a href="http://qiita.com/m_yukio">Qiita</a><br />
URLエンコードされてない部分をURLエンコードする（RFC3986準拠）

いろいろアレですが多少不安なところもあるので晒します。

```scala
object EncodeUnencodedPart {
  private[this] val rfc3986ReservredAndUnreserved = ":/?#[]@!$&'()*+,;=ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-._~"
  private[this] val hexChars = "0123456789ABCDEF"
  private[this] def isAscii(ch: Char) = ch > 31 && ch < 127
  private[this] def isReservedOrUnreserved(ch: Char) = rfc3986ReservredAndUnreserved.contains(ch.toUpper)
  private[this] def isHex(ch: Char) = hexChars.contains(ch.toUpper)
  private[this] def percentEncode(ch: Char): String =
    ch.toString.getBytes.map(b => "%%%02x".format(b).toUpperCase).mkString

  def encode(urlString: String): String = {
    val lenMinus2 = urlString.length - 2
    (for ((c, i) <- urlString.zipWithIndex) yield {
      if (isAscii(c) == false) percentEncode(c)
      else if (isReservedOrUnreserved(c)) c.toString
      else if (c == '%') {
        //%の場合はパーセントエンコードかどうか判定
        if (i < lenMinus2 && isHex(urlString.charAt(i + 1)) && isHex(urlString.charAt(i + 2))) c.toString
        else percentEncode(c)
      } else percentEncode(c)
    }).mkString
  }
}
```

- 文字コード中にURLエンコード(percent encode)されてないと思しき箇所があればエンコードする
- 冪等性がある処理にする
- 自分なりにパフォーマンスを気にする
- `0x20` (ホワイトスペース)は `%20` とし `+` はそのまま

### 参考

- RFC3986
- http://qiita.com/suin/items/ac968464f684d92b8093
- http://www.glamenv-septzen.net/view/1170
RDBMSのデータをMongoDBに突っ込むアイディア

これってRDBMSでなくても良いんでは？みたいなテーブルがあったとして
じゃあNoSQLにデータ突っ込んでみて、パフォーマンスとか使い勝手を、ささっと検証してみたいな、というときのデータ移行のアイディアメモ

* RDBMS=MySQL
* NoSQL=MongoDB

```sql:mysqlデータイメージ
| id | name1 | name2  | name3 |
| 10 | あああああ | いいいいい | ううううう | 

```

↑このテーブルを↓こんな感じに移行したい

```sql:mongodbデータイメージ
> db.table_name.findOne();
{
	"_id" : ObjectId("56e0f29de1382344d936be92"),
	"id" : "10",
	"name1" : "あああああ",
	"name2" : "いいいいい",
	"name3" : "ううううう"
}
```

移行用の簡易PG（PHP7）

```php
<?php

// MongoDB接続
$manager = new MongoDB\Driver\Manager("mongodb://localhost:27017");

// MySQL接続
$mysqli = new mysqli('localhost', 'user_name', 'password', 'db_name');

// カウンタ
$start = 0;
$limit = 1000; //{$limit}件ずつでcommit的な

while ($cnt > 0) {

  $query = "SELECT * FROM table_name LIMIT " . $start . ", " . $limit;

  if ($result = $mysqli->query($query)) {
    $bulk = new MongoDB\Driver\BulkWrite;
    while ($obj = $result->fetch_assoc()) {
      $bulk->insert($obj);
    }
    $manager->executeBulkWrite('db_name.table_name', $bulk);
  }
  $result->free();

  $cnt = $cnt - $limit;
  $start = $start + $limit;
}

$mysqli->close();
?>
```

（注意）
* PHP7はMongoDBのExtensionの関数名とか使い方とか旧バージョンと変わってる
* 当方、MongoDBあまり触ったことないです。close処理とか大量データのbulk処理は適当
* ちゃんとした書き方は追って勉強する
* 上記PGでひとまず目的は達成できた。mbp上に作ったVM環境で、100万件の移行が10分程度
rubyでユニバーサルズンドコキヨシ


##今流行りのズンドコ節プログラムをrubyで組んでみる。
「ズン」「ドコ」をランダムに出力して、
**「ズン ズン ズン ズン ドコ」**
が完成したら**「きよし」**を出力する例のアレ。

##そのまんまなのも何なので
「(きよし)の(ズン)(ドコ)節」の形式ならなんでもズンドコできるようにする。

##実装
```ruby:universal_zundoko.rb
#実際にズンドコする処理
def zundoko(data)
    count = 0
    loop do
        #ランダムにズンドコする
        if(rand(2) == 1) then
            count += 1
            puts data[2] #ズン
        else
            puts data[3] #ドコ
            #4連続以上ズンしていたらキヨシして終了
            break if count >= 4 
            count = 0
        end
    end
    puts "＼" + data[1] + "／" #＼キヨシ／
end

#ズンドコするタイトル取得
title = ARGV[0]
#キヨシ/ズン/ドコを抽出
expStr = /^(.{3,}?)の(.{2}?)(.{2}?)節$/
matched = expStr.match(title)
if matched.nil? || matched[1,3].any?{|e| e == ""} then
    puts "これではズンドコできません"
else
    #ズンドコする
    zundoko(matched)
end
```

##実行結果
```bash:result
$ ruby universal_zundoko.rb きよしのズンドコ節
ドコ
ズン
ズン
ズン
ズン
ドコ
＼きよし／

$ ruby universal_zundoko.rb たなかのドンチキ節
ドン
チキ
ドン
ドン
ドン
ドン
チキ
＼たなか／

$ ruby universal_zundoko.rb kiyoshiのずんどこ武士
これではズンドコできません

```
五回ごとに区切った方がそれっぽいだろうか…
ズンドコキヨシ with Gradle

Gradleでズンドコキヨシやってみた！

ロジックはほぼJava。ちょっとGradle

<blockquote class="twitter-tweet" data-lang="en"><p lang="ja" dir="ltr">Javaの講義、試験が「自作関数を作り記述しなさい」って問題だったから<br>「ズン」「ドコ」のいずれかをランダムで出力し続けて「ズン」「ズン」「ズン」「ズン」「ドコ」の配列が出たら「キ・ヨ・シ！」って出力した後終了って関数作ったら満点で単位貰ってた</p>&mdash; てくも (@kumiromilk) <a href="https://twitter.com/kumiromilk/status/707437861881180160">March 9, 2016</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>


```groovy:build.gralde
defaultTasks 'zundoko'

task kiyoshi << {
    println 'キ・ヨ・シ！'
}

task zundoko << {
    description 'zundoko kiyoshi task.'
    int zun = 0
    while (true) {
        int random = (int) (Math.random() * 2)
        print random == 0 ? 'ズン' : 'ドコ'
        print ' '
        switch (random) {
            case 0:
                zun++
                break
            case 1:
                if (zun > 4) {
                    tasks.kiyoshi.execute()
                    return
                }
                zun = 0
        }
    }
}
```

`defaultTasks`を`zundoko`にしてるので実行は`gralde`だけでもOK。

```bash
➜  zundoko gradle
:zundoko
ドコ ズン ズン ドコ ズン ズン ドコ ズン ドコ ズン ズン ズン ズン ズン ズン ドコ キ・ヨ・シ！

BUILD SUCCESSFUL

Total time: 4.299 secs
```

一応Githubにもあげておいた。

https://github.com/operando/zundoko-gradle

## 葛藤

<blockquote class="twitter-tweet" data-lang="en"><p lang="ja" dir="ltr">Gradleでズンドコするうえでキ・ヨ・シ！の表示をkiyoshi taskにしようか、zundokoのdoLastでキ・ヨ・シ！を出そうかという葛藤がすごくあった。結果kiyoshi taskが勝った。</p>&mdash; shinobu.apk (@operandoOS) <a href="https://twitter.com/operandoOS/status/709392296228179968">March 14, 2016</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>
リズムに乗ってズンドコキヨシ♪ with Ruby


ふつうの(?)ズンドコキヨシは一瞬で結果が出てキヨシのありがたみが感じられないので、
リズムに乗って表示されるようにした。

最初から"ドコ"が出てきたときの切なさ、
"ズンズンズンズン"と来て最後も"ズン"だったときの絶望感、
"ドコ"始まりがしばらく続いた後にやってきた"ズン"始まりの救世主感、
そして"キ・ヨ・シ！"の爽快感（想像以上に気持ちいい）。

全ては実行した者のみが味わえる極上のひととき。

```ruby
def zundoko
  loop do
    n = rand(32)
    s = ("%05b" % n).gsub(/0/, 'ズン').gsub(/1/, 'ドコ')
    r = [0, 1.0, 0, 0.5, 0, 0.5, 0, 0.5, 0.25, 0.25]
    print_with_rythm s, r

    if n == 1
      print_with_rythm "キ・ヨ・シ！", [0, 0.25, 0, 0.25, 0, 1.0]
      break
    end

    puts
  end
end

def print_with_rythm(s, r)
  s.split(//).zip(r).each do |c, w|
    print c
    sleep(w)
  end
end

zundoko
```

リズムに乗る関係上、5個区切りの判定に。
そうなると、"ズン"->0, "ドコ"->1と考えたときに、`rand(32)`が1を出すのを待つのと意味合い的に同じになるじゃん、ってことで、それっぽくズンドコを作ってみた。
wordpress4.4から追加されたwp_termmetaを使って、カテゴリーにフィールドを足してみる


wordpressにwp_termmetaなるテーブルが存在することに気づいたで使ってみました。

## カテゴリーの編集にフィールドを追加する

ひとまずinput[type="text"]を２つほど。

`functions.php`

```php
add_action ( 'edit_category_form_fields', 'add_meta_fields');
function add_meta_fields( $tag ) {
    // 引数からterm_id取得
	$t_id = $tag->term_id;
	// 値があればvalueに入れるのでtermmetaを取得
	$cat_meta = get_term_meta($t_id);
	?>
	<tr class="form-field">
		<th><label for="add_meta_text">追加メタ - テキスト</label></th>
		<td>
		    // 後でわかりましたが、値が配列に入っているので[0]を指定してあげます。
			<input type="text" name="cat_meta_array[add_meta_text]" id="add_meta_text" size="25" value="<?php if(isset ( $cat_meta['add_meta_text'][0])) echo esc_html($cat_meta['add_meta_text'][0]) ?>" />
		</td>
	</tr>
	<tr class="form-field">
		<th><label for="add_meta_foo">追加メタ - Foo</label></th>
		<td>
			<input type="text" name="cat_meta_array[add_meta_foo]" id="add_meta_foo" size="25" value="<?php if(isset ( $cat_meta['add_meta_foo'][0])) echo esc_html($cat_meta['add_meta_foo'][0]) ?>" />
		</td>
	</tr>
	<?php
}

```

## wp_termmetaへ保存する

先ほど作ったフィールドからの値を受け取って保存します。

`functions.php`

```php
add_action ( 'edited_term', 'save_add_meta_fields');
function save_add_meta_fields( $term_id ) {
	if ( isset( $_POST['cat_meta_array'] ) ) {
		$t_id = $term_id;
		$cat_keys = array_keys($_POST['cat_meta_array']);
		foreach ($cat_keys as $key){
			// 保存する
			update_term_meta($t_id, $key, $_POST['cat_meta_array'][$key]);
		}
	}
}
```

`get_term_meta($t_id);`を出力してみると下記みたいになります。
valueもarrayになってますね。

```
array (size=2)
  'add_meta_text' => 
    array (size=1)
      0 => string 'bar' (length=3)
  'add_meta_foo' => 
    array (size=1)
      0 => string 'baz' (length=3)
```

テーブルはこんな感じ

|meta_id|term_id|meta_key|meta_value|
|:------|:------|:-------|:---------|
|1      |1      |add_meta_key|bar   |
|2      |1      |add_meta_foo|baz   |


## テンプレート側で使ってみる

例えば`single.php`で使うと

```php
while ( have_posts() ) : the_post();

	// ２つ以上カテゴリーつけるならforeachしてください
	$cat = get_the_category()[0];
	$t_id = $cat->term_id;
	// 第二引数でmeta_keyを指定できます。
	$add_meta = get_term_meta( $t_id,'add_meta_text');
	
	// やっぱり配列なので[0]を
	echo esc_html($add_meta[0]);


・
・
・
endwhile;
```

## まとめ

postmetaはあるのに、なんでtermにはないのよってずっと思ってました。
あとは`get_term_meta()`がもう少し融通聞いてくれると嬉しいですね。
`get_term_meta('','add_meta_text')`とかでmeta_key指定の取得できるかなと思ったんですが、できませんでした。
今とのころ自分で実装するしかないのかな？誰か使い方間違えていたらご指摘ください。

それでも、今までwp_optionsに無理やり突っ込んでいたのよりは明らかにスマートですね。
tmuxの基本的な操作方法のまとめ


# はじめに
## tmuxの用語と概念

- Server -> Session -> Window -> Pane
- プレフィックスキー デフォルトでは`ctrl + b`。ただし私の環境ではカスタマイズし、`ctrl + s`に変更済み。また以下の全ての記述ではプレフィックスキーは省略している。

## 参考リンク

- [tmuxの基本的な使い方とコマンドのまとめ - TASK NOTES](http://www.task-notes.com/entry/20150711/1436583600)
- [tmuxを使いこなそう（ウインドウ、ペイン、セッション、アタッチ、デタッチ） - Qiita](http://qiita.com/shoma2da/items/2e68c1e59938eb0c2f83#%E3%83%9A%E3%82%A4%E3%83%B3)
- [How can I page up or down in tmux with Terminal.app?](http://unix.stackexchange.com/questions/81540/how-can-i-page-up-or-down-in-tmux-with-terminal-app)

# tmux操作

## セッション操作

### セッション作成

名前をつけずにセッションを作成

	$ tmux

名前をつけてセッションを作成

	$ tmux new -s セッション名

### デタッチ

現在のセッションのデタッチ

	d

### アタッチ

最後にデタッチしたセッションにアタッチする

	$ tmux a

セッション名を指定してアタッチする

	$ tmux a -t セッション名

### セッション一覧

セッションの一覧を確認する

	$ tmux ls
	0: 1 windows (created Mon Mar 14 21:54:40 2016) [134x67]

### セッション名変更

セッションの名前を変更

	$ tmux rename -t 変更前セッション名 変更後セッション名
	
セッション起動中にセッション名を変える

	$
	
	コマンドモードになったら
	
	(rename-session) aho                                                                                                                  
	
	と入れる。これでセッション名が`aho`になる。

### セッション削除

セッションを削除する

	$ tmux kill-session -t セッション名
	
サーバーを削除する(全セッションを削除する)
	
	$ tmux kill-server


## ウィンドウ	操作

### ウィンドウ切り替え

直前のウィンドウに移動する

	l

ウィンドウの一覧を表示し、一覧の中から`Ctrl+p`, `Ctrl+n`でウィンドウを選択して`Enter`。

	w
	
	表示されたウィンドウ一覧の中から
	(0)  0: bash "hoge.local"                                                                                           
	(1)  1: bash- "hoge..local"                                                                                          
	(2)  2: bash* "hoge.local"     

次のウィンドウに移動する

	n
	
前のウィンドウに移動する

	p

ウィンドウを番号を指定して移動する
	
	移動したいウィンドウの番号


### ウィンドウ追加

	c

### ウィンドウ終了

	$ exit

強制終了する場合。`exit`が使えず強制的に終了させたい場合に用いる。

	&


### ウィンドウ名変更

	,
	
	以下のように画面下のバーで画面名の入力を促されたら画面を入力して`Enter`
	
	(rename-window) bash   
	

## ペイン操作

### ペイン分割

ペインを左右に分割する
	
	%
	
ペインを上下に分割する

	"

### ペイン移動

分割したペインを移動する

	o

ペインのインジケータを表示して移動

	q
	
	表示されたインジケータの番号を押下
	
	

### ペイン終了
	
ペイン強制終了（現在のペインを終了する）

	x

ペイン分割解除（現在のペインを新規ウィンドウに移動する）
	
	!

### ペイン入れ替え

現在のペインと一つ前のペインを入れ替え

	{
	
現在のペインと一つ後のペインを入れ替え

	}
	
## その他

システム情報を表示する

	t

現在のキーバインドを表示する

	?

バッファスクロールアップ/ダウン

	[
	
	Page Down
	Page Up
	
	Ctrl + Cで解除
Jupyter notebook上でautopep8によるフォーマッティング

ちゃお...†

本日、[IPythonデータサイエンスクックブック――対話型コンピューティングと可視化のためのレシピ集](https://www.oreilly.co.jp/books/9784873117485/)という本をいただきましたのでさっそく読んでます (まだ読んでる途中)。

IPythonではmagicコマンドという、セルや行に対して頻繁に行われるような処理を簡単に実行できるようにする仕組みがあります。デフォルトでいくつか入ってるのですが、自分でmagicコマンドを作ってカスタマイズすることもできます。

わたしは、仕事中の6割くらいはJupyter notebookで何かしてる人なので、コードが汚くなった時にJupyter内で解決できたらうれしいなって思いました。そこでJupyter notebookからautopep8で[PEP8コーディングスタイル](https://github.com/mumumu/pep8-ja/blob/master/index.rst)にフォーマッティングするものを書きました！

こちらにディレクトリに置いてます。
https://github.com/ikegami-yukino/misc/tree/master/misc/autopep8magic

使い方や実行例はこちら
https://github.com/ikegami-yukino/misc/blob/master/misc/autopep8magic/README.ipynb


autopep8をpipなどで入れたら、`$ sh install.sh` して入れて、Jupyter notebook内で `%%autopep8` するだけ！

![スクリーンショット 2016-03-19 0.04.57.png](https://qiita-image-store.s3.amazonaws.com/0/48207/7884f28a-74d9-9f31-753d-a1eaace7c417.png)
ばばーん！
`a=1+1` が `a = 1 + 1` になるのです。

出力結果をコピペする感じになるのが残念ですが (本当はインプレイス処理でやりたい)、これでちょっと仕事が捗ったらいいなと思います。
railsでenum型を使ったカラムのformを実装するときにつまずいたこと

<h2>Rails4.1から導入されたEnum型で、個人的に引っかかったこと</h2>
<h4 class="active">
そもそもrailsのenumとは？
</h4>
<p>
rails4.2から導入された、簡単にいうとintegerとstring型を紐付けするものです。
</p>
<p>
マイグレーションファイルは以下の通りです。
</p>

```ruby:0160225070148_create_people.rb
   class CreatePeople < ActiveRecord::Migration
     def change
       create_table :people do |t|
         t.string :name,                null: false
         t.integer :sex,                null: false, limit: 1

         t.timestamps null: false
       end
     end
   end
```

具体的な書き方としては、
</p>



```ruby:person.rb
class Person < ActiveRecord::Base
  enum sex: %i( man woman )
end

```

<p>
、、といった具合でこの場合だと0=>man,1=>womanを返す属性名、属性の値が新しく定義されるようになります。
</p>
<p>さらに具体的に見ていきます。
コマンドラインで
</p>

```command:command
$ bundle exec rails console
$ me = Person.new
$ me.sex = 1
$ me.sex 
  => "woman"
```

<p>
と、言うようにハッシュでintegerとstringを扱うことができるようになりました。
</p>
<p>
また他にも便利なメゾットがあります。
</p>
```command:command
$ me.man! 
  => "man"
$ me.sex
  => "man"
$ me.woman?
  => "false"
$ me.man?
  => "true"
```

<p>
本題に入っていきます。
</p>
<h4>
form_forでenum型を扱うときに引っかかってしまったこと(ｰ ｰ;)
</h4>

```ruby:_form.html.haml
  = form_for @person,  url:url,  html: {role: 'form', class: "form-horizontal"} do |f|

  ....

  .form-group
    = f.label :sex, class: "control-label"
    = f.number_field :sex, class: "form-control"

```
<p>
enumを使ったので、今回の場合は0か1を入力しなければなりません。
従ってnumber_fieldを使ってformを実装しようとしたのですが、、、
</p>

```command:error
'1'is not a valid sex 
```
<p>
とでてきてしまい、うまくいかない、、、<br>
原因は簡単です。formはデフォルトで""がついてしまっているためたとえnumber_fieldで１と打ってもrailsでは'1'と解釈されてしまうからです。　<br>
＃enumを使っていなかったらうまくいきます。なぜenumを使ったらうまくいかないのかわからないですm(_ _)m<br>
しかしsexはintegerがデータ型なので、どうしようか、、、
</p>
<h3 class="active">解決策</h3>

```ruby:_form.html.haml
   .form-group
    = f.label :sex, class: "control-label"
    = f.select :sex, Person.sexes.keys class: "form-control"
```

<p>
と言った具合にselectタグでmanとwomanを選択させるという方法をとることで、enumのエラーを治すことができました。
</p>
CentOsにyumを使ってnginxをインストールする

#CentOsにyumを使ってnginxをインストールする
今回はパッケージを使ってインストールします。

##nginxのリポジトリを登録する
[http://nginx.org/packages/centos/](http://nginx.org/packages/centos/)にて使用しているバージョンをたどって自分に適したリポジトリを使用します。
今回はcentos6なので下記を使用しました。

`rpm -ivh http://nginx.org/packages/centos/6/noarch/RPMS/nginx-release-centos-6-0.el6.ngx.noarch.rpm`

登録できたことを確認します。
`cat /etc/yum.repos.d/nginx.repo`

##事前確認
どのバージョンがインストールできるかを確認します。
`yum list |grep nginx`

```lang:
nginx.x86_64                          1:1.8.1-1.26.amzn1
```
こんな感じでバージョンが出てくれます。この例では1.8.1があることを示しています。

##インストール
`yum -y install nginx`

インストールできたことを確認します。
`nginx -v`

```lang:
nginx version: nginx/1.8.1
```

##その他
`cat /etc/init.d/nginx`
で見てもわかるように

```lang:
# config:      /etc/nginx/nginx.conf
# config:      /etc/sysconfig/nginx
# pidfile:     /var/run/nginx.pid
```

のように構成されているみたいです。

設定に続きます。（TODO 準備中）
React v0.14からのComponent作成について

eslintで`eslint-plugin-react`を使ってる人はすでに対処済みかもしれません。
なんか出たり出なかったりするのですが、eslintをかけると`use pure function`的なerrorかwarningが出ます。
これを消すための方法を調べました。

## 公式より

https://facebook.github.io/react/blog/2015/10/07/react-v0.14.html#stateless-functional-components
こちらにあるとおり、簡潔に表現できるようになりました。
確かにこの通り書けば良いのですが、なんでかわからないと小回りが効かないので、Sourceを見てみます。

## Sourceより

https://github.com/facebook/react/blob/master/src/renderers/shared/reconciler/ReactCompositeComponent.js#L159

```js:抜粋
var Component = this._currentElement.type;
```

ここの`this._currentElement.type`がComponentになります。
thisがwrapperElementで_currentElementはReactElementです。

https://github.com/facebook/react/blob/master/src/renderers/shared/reconciler/ReactCompositeComponent.js#L174

```js:抜粋
inst = new Component(publicProps, publicContext, ReactUpdateQueue);
```
ここが以前の`React.createClass`で作ってた時に行っていた処理。

https://github.com/facebook/react/blob/master/src/renderers/shared/reconciler/ReactCompositeComponent.js#L185

```js:抜粋
inst = Component(publicProps, publicContext, ReactUpdateQueue);
```

ここがv0.14以降の処理で、functionを実行してreturnでelementを受け取ってから
https://github.com/facebook/react/blob/master/src/renderers/shared/reconciler/ReactCompositeComponent.js#L198

```js:抜粋
inst = new StatelessComponent(Component);
```

ここでStatelessComponentとしてComponentが生まれ変わります。

以上がv0.14からのComponent作成の変更点のようです。

## StatelessComponentとは

https://github.com/facebook/react/blob/master/src/renderers/shared/reconciler/ReactCompositeComponent.js#L44

```js:StatelessComponent
function StatelessComponent(Component) {
}
StatelessComponent.prototype.render = function() {
  var Component = ReactInstanceMap.get(this)._currentElement.type;
  var element = Component(this.props, this.context, this.updater);
  warnIfInvalidElement(Component, element);
  return element;
};
```

そもそものComponentを使うというわけではないようです。newの時点ではrenderメソッドを持つだけのinstanceですね。
renderする時のcontextが重要そうです。

https://github.com/facebook/react/blob/master/src/renderers/shared/reconciler/ReactCompositeComponent.js#L236

```js:ReactInstanceMap
ReactInstanceMap.set(inst, this);
```

ここで`inst=StatelessComponent`の_reactInternalInstanceにwrapperElementが設定されます。

```js:StatelessComponement
{
  render = function () { ... }
  _reactInternalInstance: wrapperElement
}
```

`ReactInstanceMap.get(this) = _reactInternalInstance`なのでrenderすることで同じelementが呼び出され続けることになります。

だがしかし、ここで疑問が生じます。
`React.createClass`で定義していた`initialState`や`componentDidMount`はどうなるの・・と。

ここで気がついたのですが、このエラーが出るのはComponentがstateを持たない時のようです。
stateを持たして状態を変化させる時は今まで通り`React.createClass`を使います。

The・勘違い
pythonのコーディングを自動修正してくれるautopep8を導入する

便利と評判のPyCharmを使ってみたものの、やはり使い慣れたvimに戻ってしまった今日この頃。
コーディング規約PEP8に準拠しているかをチェック、修正してくれるプラグイン[autopep8](https://github.com/hhatto/autopep8)を入れることで、より快適にpythonを書ける環境を整えたい。


autopep8をインストールする

```
$ pip3 install autopep8
```

NeoBundleでvimプラグインを入れる

```
$ vim ~/.vimrc
NeoBundle 'tell-k/vim-autopep8'
```

設定追加
内容は[vimでpythonのコーディングスタイルを自動でチェック&自動修正する - ton-tech-ton](http://ton-up.net/technote/2013/11/26/vim-python-style-check-and-fix/)を参考に。

```
$ vim ~/.vimrc
function! Preserve(command)
    " Save the last search.
    let search = @/
    " Save the current cursor position.
    let cursor_position = getpos('.')
    " Save the current window position.
    normal! H
    let window_position = getpos('.')
    call setpos('.', cursor_position)
    " Execute the command.
    execute a:command
    " Restore the last search.
    let @/ = search
    " Restore the previous window position.
    call setpos('.', window_position)
    normal! zt
    " Restore the previous cursor position.
    call setpos('.', cursor_position)
endfunction

function! Autopep8()
    call Preserve(':silent %!autopep8 -')
endfunction

autocmd FileType python nnoremap <S-f> :call Autopep8()<CR>
```

以上で、 `Shift + F` を押せば、pythonコードを修正してくれるようになる。
ズンドコキヨシマシーン with Ruby

## ズンドコキヨシマシーン

カウントアップする機械、ドコ命令はカウントが4未満ならリセットするが4以上になった場合、キヨシ命令を実行する

```rb
class ZunDokoMachine
  def initialize
    @counter = 0
  end

  def ズン
    puts __method__
    @counter += 1
  end

  def ドコ
    puts __method__

    if @counter < 4
      @counter = 0
    else
      キヨシ
    end
  end

  private

  def キヨシ
    puts __method__
    exit
  end
end

ZunDokoMachine.new.instance_eval { loop { send(self.class.public_instance_methods(false).sample) } }
```

## 実行例

```console
    _╰╰,   /ﾊﾞｼｮ % ~/tmp
  _/o ŏｧ  / ﾀｲﾁｮｰ% ﾔﾊﾞｲ
∈ミ;ﾉ,ﾉ   ＼ｺﾏﾝﾄﾞ% ruby hikiyoshi.rb
ドコ
ズン
ズン
ドコ
ドコ
ズン
ドコ
ドコ
ドコ
ズン
ドコ
ドコ
ズン
ズン
ズン
ドコ
ズン
ズン
ズン
ズン
ドコ
キヨシ
```

## その他のキヨシ

- [ズンドコキヨシ Quine with Ruby](http://qiita.com/hanachin_/items/856ecb53fe486c6d4a12)
- [歌うズンドコキヨシ with Ruby](http://qiita.com/hanachin_/items/a4547d88e9008d390f58)
- [ズンドコキヨシオートマトン with Ruby](http://qiita.com/hanachin_/items/2242c7bd33af39cc6cab)
- [ズンドコキヨシワンライナー with Ruby](http://qiita.com/hanachin_/items/bad105e11ab707fbaf4c)
- [ズンドコキヨシ物語 with Ruby](http://qiita.com/hanachin_/items/055881be542afceca9d9)
Refinement で追加したメソッドが send で呼べない

Ruby 2.1 で導入された refinement は，特定のスコープ内でのみクラスやモジュール（や main）を拡張することができる。

とてもいい仕組みだと思うが，refinement で追加したメソッドが `Object#send` では呼べないことが分かった。

以下のコードでは，Integer に，〈3 の倍数か（10進で）3 が付く場合に「あほ」を返す〉ようなメソッド `nabeatsu` を追加してみたんだが，`send(:nabeatsu)` で呼ぶことはできなかった。

```rb
module Nabeatsu
  refine Integer do
    def nabeatsu
      "あほ" if modulo(3).zero? || to_s.match(/3/)
    end
  end
end

using Nabeatsu

puts 31.nabeatsu
#=> "あほ"

puts 31.send(:nabeatsu)
#=> undefined method `nabeatsu' for 30:Fixnum (NoMethodError)
```

残念。

# どこに書いてある？

この件は [公式リファレンスマニュアル](http://docs.ruby-lang.org/ja/2.3.0/method/Module/i/refine.html)には見当たらなくて，@joker1007 さんの「[Refinement関係の小技とできない事をまとめてみた](http://qiita.com/joker1007/items/68d066a12bc763bd2cb4)」にも載ってない。

が，下記の「Indirect Method Calls」にダメとハッキリ書いてあった。（「are not honored for」とか英語がイマイチ分からないけど）

http://docs.ruby-lang.org/en/trunk/syntax/refinements_rdoc.html#label-Indirect+Method+Calls

ただ，「この仕様は将来変わる可能性がある」とのことなので，`send` でもいけるようになることを期待したい。

# 2016年5月12日追記　〈ブロックの代わりに &+シンボル〉がダメ

本件の弊害は当初考えたより大きいことが分かった。

以下のコードは，数の配列から非負の数だけを抜き出そうとしたものだ。
`Numeric` クラスに，非負であることを確認する `nonnegative?` メソッドを追加している。

```rb
module NumericExt
  refine Numeric do
    def nonnegative?
      self >= 0
    end
  end
end

using NumericExt

ary = [-3, 0, 2]

# これは OK
p ary.select{|x| x.nonnegative?}
#=> [0, 2]

# これは NG
p ary.select(&:nonnegative?)
#=> NoMethodError
```

見てのとおり〈ブロックの代わりに &+シンボル を与える〉方法だと動かない。

なぜなら，`&:nonnegative?` のほうは `:nonnegative?.to_proc` が呼ばれて Proc オブジェクトが作られるのだが，その `Proc` オブジェクトでは `nonnegative?` メソッドが `send` によって呼ばれるからだ。

あらわに `send` を書いていないのに `NoMethodError` が出るので，Refinement の制限を理解していたとしても，どこが悪いのか分かりにくい。

# 2017年4月28日追記　Ruby 2.4 で OK になってた！

今頃になって気づいたが，Ruby 2.4 では `send` でも呼べるようになってた。やたー！
ggplot2でplot()的な複数グラフ表示とその闇

# 概要
ggplot2でforループを使ったplot()的な複数プロットするときは、```Rmisc::multiplot```が使える。
このとき、aesのデータフレーム引数には必ず列名を用いる。
列要素を直接指定すると、全て同一プロットになる場合があります。なんでそうなるかは分からん。

# 解説
例えば通常のplot()関数を使って、１枚に複数のグラフをプロットするには

```r
par(mfrow = c(2,3))
for(i in 1:6){
    data <- data.frame(1:10, rnorm(10))
    plot(data, main = i)
    }
```
とすればok。
![Rplot09.png](https://qiita-image-store.s3.amazonaws.com/0/111950/f208ca66-3a49-74d4-68cc-4895bdd95beb.png)


ggplot2でも同じようにやりたい。
```facet_grid,facet_wrap```を使うのが普通だと思うけど、1枚に系列全て収まらない場合、```tidyr```やらのforループを入れることになって激しく面倒くさい。軸合わせもめんどいし。
もういいから最初からplot()のようにforループ使わせろ。
(だいぶ端折りましたすいません、それうまくできるよってツッコミがあれば是非教えて下さい)

こういうとき、```Rmisc::multiplot```が使える。
multiplot自体は関数としてそのまま落っこちてる。
[Multiple graphs on one page (ggplot2)](http://www.cookbook-r.com/Graphs/Multiple_graphs_on_one_page_(ggplot2)/)
けど、CRANからRmisc落とすと入るのでそっちのほうがいいんじゃないかと。

```r
install.packages("Rmisc")
library(Rmisc)
```

[Multiple plots in one page]
(http://rstudio-pubs-static.s3.amazonaws.com/2852_379274d7c5734f979e106dcf019ec46c.html)
上記ページを参考にして、

```r
plots <- list()  # new empty list
for (i in 1:6) {
    p1 = qplot(1:10, rnorm(10), title = i)
    plots[[i]] <- p1  # add each plot into plot list
}
multiplot(plotlist = plots, cols = 3)
```

うん、できた。
![Rplot08.png](https://qiita-image-store.s3.amazonaws.com/0/111950/37cced59-962f-977b-835f-8d248342ac00.png)

ggplot()でも当然…

```r
plots <- list()
for (i in 1:6) {
  data <- data.frame(1:10, rnorm(10))
  p1 = ggplot(data,aes(data[,1], data[,2])) +
       geom_point() +
       labs(title = i)
  plots[[i]] <- p1  
}
multiplot(plotlist = plots, cols = 3)
```
![Rplot07.png](https://qiita-image-store.s3.amazonaws.com/0/111950/abe96536-4500-6510-4e88-12d5f66cd634.png)

！？？
ぜんぶおなじプロットになっとる。

死ぬほど悩んだが、```p1 = ggplot(data,aes(data[,1], data[,2]))```が原因。どうやらggplotのaesにぶち込む引数は名前でちゃんと入れる必要があるみたい。

```r
plots <- list()
for (i in 1:6) {
  data <- data.frame(a = 1:10,b = rnorm(10))
  p1 = ggplot(data,aes(a, b)) +
       geom_point() +
       labs(title = i)
  plots[[i]] <- p1
}
multiplot(plotlist = plots, cols = 3)
```
![Rplot06.png](https://qiita-image-store.s3.amazonaws.com/0/111950/a5fefca1-c795-9901-a6f8-19e9ddcfdb01.png)

そういえばggplot2の解説ではみんなデータフレームの名前で取り込んでたけど、これってマストなんですかね。
単品でプロットするときにはよく後から軸名をつけるなんてことをしてたけど、複数ではそういうことはできませんので前もって名前を付けましょう、というお話。
ズンドコきよし for VisualBasic.NET

~~(アイン君がグレイズになってしまった)~~
## 概要
なんか、最近ズンドコキヨシチェックがFizzBuzzに代わるプログラマーの腕試しだと聞いて、自分も書いてみました。（PHPで書くと何番煎じだよって話なので、大学のころお世話になったVisualBasic先輩に出てきてもらいました。今でもたまに書くんですけどね。）
~~こういうことで投稿数を稼ぐ~~
結果だけを知りたいせっかちなホモのために結果を先にしますよ。
##実行結果
![スクリーンショット 2016-03-14 21.41.42.png](https://qiita-image-store.s3.amazonaws.com/0/83578/f7709291-ee67-ec6d-8da1-4be7f200e225.png)
適当に数回実行して、キヨシるまでの時間を計ってみたら、（スマートフォンのストップウォッチだけど）
遅くて、7.25秒　早くて1.21秒　平均3.18秒
これがズンズンズンドコだったら、早くキヨシれていたなぁ。ズンが４つあるのがミソ？

| 回数 | 時間(分) |
|:----:|:----:|
|1回目|0.0725
2回目|0.0211
3回目|0.0139
4回目|0.0121
5回目|0.0611
6回目|0.0155
7回目|0.0269
平均|0.0319



## ソースコード
```vbnet:zundoko.vb
Module Module1

    Dim zundokoParts As String() = {"ズン", "ドコ"}
    Dim Zundoko As String() = {zundokoParts(0), zundokoParts(0), zundokoParts(0), zundokoParts(0), zundokoParts(1)}
    Dim generateList(4) As String
    Dim sleep As Integer = 25
    Sub Main()
        Do

            For i = 0 To Zundoko.Length - 1

                Dim seed As Integer = System.Environment.TickCount '固定じゃない数値をシード値に使う
                Dim rnd As Random = New Random(seed + 1)
                Dim rndNum As Integer = rnd.Next(zundokoParts.Length)
                generateList(i) = zundokoParts(rndNum)
                Console.WriteLine(zundokoParts(rndNum))
                System.Threading.Thread.Sleep(sleep) '連続生成したRandomクラスのシード値の重複防止

            Next
            Console.WriteLine()

        Loop While (compareList() = False)
        Console.WriteLine("キ・ヨ・シ！")

    End Sub

    Function compareList()
        Dim result As Boolean = False
        For i = 0 To Zundoko.Length - 1

            result = Zundoko(i).Equals(generateList(i))
            If (result = False) Then
                Exit For
            End If

        Next
        Return result
    End Function

End Module

```
Swift構文版 UIColor/NSColor編集 Xcodeプラグイン


![swift-color.gif](https://qiita-image-store.s3.amazonaws.com/0/8920/7114b61a-39ee-5ca2-2d22-8daf99a943b7.gif)

[ShingoFukuyama / Swift-Color-Xcode-Plugin](https://github.com/ShingoFukuyama/Swift-Color-Xcode-Plugin)

『詳解Swift改訂版』を読み終えて創作意欲が高まっていたので腕試しに、ドイツのOle Zornさん作 XcodeプラグインColorSenseをObjective-CからSwiftへ変換。

さらにSwift構文版のUIColor/NSColorのみに対応させたものを書いてみました。

Xcode PlugInを書いたのは初めてです。Xcode上で一度buildさせてXcodeを再起動すれば反映されると思います。(Xcode 7.2.1でしか試していません)

コードにおかしな部分がありましたら教えて下さい。

:link: [Objective-CプログラマがSwiftを学ぶのに最適な書籍](http://fukuyama.co/objective-c-to-swift-book)
:link: [いつかに備えてXcode Plugin作成コトハジメ](http://qiita.com/kgmyshin/items/c2e4e270a37882d3306a)
ズンドコキヨシ with パターンマッチ指向言語Egison

# パターンマッチといえばこの言語でしょう


「ズン・ズン・ズン・ズン・ドコ」のパターンにマッチしたら「キ・ヨ・シ！」と出力するものを実装する流行りがあるらしい（[ズンドコキヨシ](https://twitter.com/kumiromilk/status/707437861881180160)）。

パターンマッチといえば[Egison](http://www.egison.org/ja/)。

これはやらない手はない。

以下、私の回答。環境はMac。[ココ](http://www.egison.org/getting-started/getting-started-mac.html)からインストールし、あとは端末から下記を実行。

```bash:Terminal
# Egisonの対話スクリーンに入る
$ egison

# 実行
> ((match-lambda (list string) {[ <join $a (loop $i [1 4] <cons (& ,"ズン" $z_i) ...> (& <cons ,"ドコ" _> $d))> [a z (car d) "キ・ヨ・シ ！"]]}) (map 1#(R.car {"ズン" "ドコ"}) nats))
```

```text:結果
[{"ズン" "ズン" "ドコ" "ドコ" "ズン" "ズン" "ドコ" "ズン" "ズン" "ズン" "ドコ" "ドコ" "ドコ"} {|[1 "ズン"] [2 "ズン"] [3 "ズン"] [4 "ズン"]|} "ドコ" "キ・ヨ・シ ！"]
```

などということをGistでやっていたら[まさかのEgison作者様からコメント](https://gist.github.com/greymd/63b1b9623daa7ab1bce7)が。

以下、引用。
下記のような`kiyoshi.egi`というファイルを作成。

```lisp:kiyoshi.egi
(define $main
  (lambda [$args]
      (each print (kiyoshi (match-all (map 1#(R.car {"ズン" "ドコ"}) nats) (list string)
                              [<join _ (loop $i [1 5] <cons $z_i ...> _)> {z_1 z_2 z_3 z_4 z_5}])))))

(define $kiyoshi
  (match-lambda (list (list string))
            {[<cons (& (loop $i [1 4] <cons ,"ズン" ...> <cons ,"ドコ" <nil>>) $zs) _> {@zs "キ・ヨ・シ ！"}]
              [<cons <cons $x _> $xs> {x @(kiyoshi xs)}]}))
```

あとは実行。

```bash:Terminal
$ egison kiyoshi.egi
ドコ
ドコ
ドコ
ドコ
ドコ
ドコ
ドコ
ズン
ズン
ズン
ズン
ドコ
キ・ヨ・シ ！
```

# 解説
## Main関数
役割は2つ。
1. `(map 1#(R.car {"ズン" "ドコ"})`で延々とズン or ドコを出力。
2. その出力をマッチ節`[<join _ (loop $i [1 5] <cons $z_i ...> _)> {z_1 z_2 z_3 z_4 z_5}]`で5要素ずつずらす。

```
(define $main
  (lambda [$args]
      (each print (kiyoshi (match-all (map 1#(R.car {"ズン" "ドコ"}) nats) (list string)
                              [<join _ (loop $i [1 5] <cons $z_i ...> _)> {z_1 z_2 z_3 z_4 z_5}])))))
```

たとえば10個の整数をこれと同じマッチ節で処理すると、こんな出力になる。

```list:EgisonTerminal
> (match-all (take 10 nats) (list integer) [<join _ (loop $i [1 5] <cons $z_i ...> _)> {z_1 z_2 z_3 z_4 z_5}])
{{1 2 3 4 5} {2 3 4 5 6} {3 4 5 6 7} {4 5 6 7 8} {5 6 7 8 9} {6 7 8 9 10}}
```

### kiyoshi関数

再帰処理をしている。
Mainが出力したズンとドコをランダムに含んだコレクションのコレクション（配列の配列ようなもの）を受け取る。先頭のコレクションを取り出し、パターンにマッチしていたら"キ・ヨ・シ！"を付与して処理終了。
マッチしていなかった場合、その要素を取り除き、再度自分を呼び出して残りのコレクションを処理させる。

```
(define $kiyoshi
  (match-lambda (list (list string))
            {[<cons (& (loop $i [1 4] <cons ,"ズン" ...> <cons ,"ドコ" <nil>>) $zs) _> {@zs "キ・ヨ・シ ！"}]
              [<cons <cons $x _> $xs> {x @(kiyoshi xs)}]}))
```
jenkinsでpod install時にEncoding::CompatibilityErrorが出た場合


```pod install``` 処理のAnalyzing dependenciesで以下のエラーが出た場合です。

```
incompatible character encodings: UTF-8 and US-ASCII (Encoding::CompatibilityError)
```

よくあるのが、Podfileで「\`」 と書いてあると出るエラーです。この場合は 「‘」 に書き直すと大丈夫です。

しかし、ターミナルで pod installすると動作するのにjenkinsだけ動作しない場合がありました。
よく見ると直前に以下のエラーが出てました。

```
[33mWARNING: CocoaPods requires your terminal to be using UTF-8 encoding.
Consider adding the following to ~/.profile:
```

まずは、現在の値が何になっているかをjenkinsの「シェルの実行」で 以下を記述してみたところ ```en_US.UTF-8``` でした。

```
echo $LANG
```

直接ターミルで確認した時は、```ja_JP.UTF-8``` でした。

```
$ echo $LANG
ja_JP.UTF-8
```

# 解決方法

~/.profileを作成して、以下のように記述します。

```~/.profile
export LANG=ja_JP.UTF-8
```

以下も忘れずに追加しておきます。

```~/.bash_profile
if [ -f ~/.profile ] ; then
    source ~/.profile
fi
```

これで解決できました。
ズンドコキヨシ with Groovy

何やら流行っているようなのでGroovyでチャレンジ。
[ズンドコキヨシまとめ](http://qiita.com/shunsugai@github/items/971a15461de29563bf90)

こういうコードは凄く苦手。。。
一応末尾再帰になっている（はず）のと、`zundokoTime`の値をいじればその分ズンがドコまでズンズン続く回数を指定出来まズン。

```groovy
def rnd = new Random()
def zun = "ズン"
def doko = "ドコ" 
def zundokoTime = 4

({ lyric, lyrics = [] ->
    if (lyrics == [zun]*zundokoTime + doko) {
       print "＼キ・ヨ・シ！／"
    } else {
       print "${lyric} "     
       trampoline([zun, doko][rnd.nextInt(2)], lyrics in (1..zundokoTime).collect{[zun]*it} ? lyrics + lyric : [lyric])
    }
}).trampoline()([zun, doko][rnd.nextInt(2)])
```

実行結果：

```
ドコ ドコ ズン ズン ドコ ズン ドコ ドコ ズン ドコ ズン ドコ ズン ズン ズン ドコ ドコ ズン ズン ズン ズン ズン ズン ドコ ドコ ドコ ドコ ドコ ズン ドコ ドコ ズン ズン ドコ ズン ズン ズン ズン ズン ズン ドコ ドコ ズン ドコ ドコ ドコ ドコ ズン ズン ズン ドコ ドコ ズン ドコ ドコ ドコ ズン ズン ドコ ズン ズン ズン ズン ドコ ＼キ・ヨ・シ！／
```
JavaScriptでクリップボードの画像を取得する

## 初めに
クリップボードに格納されている画像をJavaScriptから取り出す機会があったのでメモ。
（例によってニッチなネタです。）

## 制約
クリップボードの値を取り出すには、ユーザのアクション(ペースト)が必須です。 セキュリティの関係で好き放題アクセスできないようになっているようです。この壁を乗り越えるにはFlashを使うなどの手法があるようですが、この記事ではそれらには触れません。

したがって、ここで紹介する方法の応用場所は相当限られると思います。
たとえば、Qiitaの編集画面でちょっとした画面キャプチャを添付したいときに、いちいちファイルを介さずに添付できるとか・・・どうかなぁ・・・？微妙？

まぁ、こんなアイデアもあるよってことで・・・


## サンプル
https://jsfiddle.net/2tkc99n2/1/

printscreen(macならctrl + shift + cmd+ 3)で画面キャプチャを取った後、上記ページの「paste image here」という部分でペーストを実行してください。JavaScriptで画像を取得した後、下部のimgタグとtextareaに結果が反映されます。

> サンプル画面
> ![](https://qiita-image-store.s3.amazonaws.com/0/29682/b26db675-a8d4-31ec-cf2a-f027aa79d782.png)


## 手順
ブラウザによって手順が若干異なりますが、基本的な発想は同じでです。
contenteditableな要素に画像を張り付けてそれを取ってくるという方法です。


### Firefox, IE, Safariの場合
contenteditableな要素に画像を張り付けると、エレメント内にimgタグが挿入されるので、簡単に取得できます。

~~~html
<div contenteditable="true" width="50px" height="50px">
paste image here
</div>

<img id="outputImage" border="1" width="50%">
<textarea id="outputText"></textarea>

<script>
var element =  document.querySelector("[contenteditable]");
element.addEventListener("input", function(e){
	// 仮のエレメントを作り、張り付けた内容にimgタグがあるか探す
	var temp = document.createElement("div");
	temp.innerHTML = this.innerHTML;
	var pastedImage = temp.querySelector("img");
	
	// イメージタグがあればsrc属性からbase64が得られるので
	// あとは煮るなり焼くなり
	if (pastedImage) {
		var base64 = pastedImage.src;
		
		document.querySelector("#outputImage").src = base64;
		document.querySelector("#outputText").textContent = base64;
	}
	
	// contenteditableの内容は戻しておく
	this.innerHTML = "paste image here";
})

</script>
~~~

### Chromeの場合
Chromeの場合は画像を張り付けても画像は挿入されません。しかし、pasteイベントからファイルオブジェクトして画像を取り出すことができます。若干面倒です。

~~~html
<div contenteditable="true" width="50px" height="50px">
paste image here
</div>

<img id="outputImage" border="1" width="50%">
<textarea id="outputText"></textarea>

<script>
var element =  document.querySelector("[contenteditable]");
element.addEventListener("paste", function(e){
	// 画像の場合
	// e.clipboardData.types.length == 0
	// かつ
	// e.clipboardData.types[0] == "Files"
	// となっているので、それ以外を弾く
	if (!e.clipboardData 
			|| !e.clipboardData.types
			|| (e.clipboardData.types.length != 1)
			|| (e.clipboardData.types[0] != "Files")) {
			return true;
	}
	
	// ファイルとして得る
	// (なぜかgetAsStringでは上手くいかなかった)
	var imageFile = e.clipboardData.items[0].getAsFile();
	
	// FileReaderで読み込む
	var fr = new FileReader();
    fr.onload = function(e) {
    	// onload内ではe.target.resultにbase64が入っているのであとは煮るなり焼くなり
		var base64 = e.target.result;
		document.querySelector("#outputImage").src = base64;
        document.querySelector("#outputText").textContent = base64;
	};
	fr.readAsDataURL(imageFile);
	
	// 画像以外がペーストされたときのために、元に戻しておく
	this.innerHTML = "paste image here";
});
</script>
~~~
A/Bテストは完全ではない


## A/Bテストの効果は常に一定か

![スクリーンショット 2016-03-14 21.40.52.png](https://qiita-image-store.s3.amazonaws.com/0/4585/42d3eac9-410d-3756-3b15-4968970e2cb6.png)

* 施策を出したタイミングでクリックされることは当たり前
* リリース後にコンバージョンが高いものは、ある程度落ち着くまでA/Bテストはできない

## 対象を選ぶときに影響を受けるものはあるか
* 対象を比べるときに特定の少数のデータが大きく結果を狂わす
* 特定のイレギュラーなデータを抜いて比較する必要がある
* [極端な例で考える1]
    * 応募数が1万で、応募数がAとBどちらが多いかを検証したい
    * 一人が1000応募していたとしたら、その一人を選ぶだけで、4500と5500で20%近い差が
生まれる
* [極端な例で考える2]
    * 応募数が1万で、応募数がAとBどちらが多いかを検証したい
    * 50応募している人が100人いるとすると、

=> もちろん、応募数だけでなく、応募ユーザ数でも比較すれば上のケースはうまく防げる

## A/Bテスト関連の記事の振り返り
* A/Bテストで伝えたいのは、prop.test
* 検証方法を学ぶこととだけでなく、実際に今この施策をするべきかのあたりをつけることにも利用する
* 基本的には1週間で判断できるものを実施する！判断できないものは判断できないものとして施策を回す
* 1つの施策に1ヶ月検証して、1%しか上がらないなら、その施策をしても目標達成できないし、そもそも検証できないことも多い

## 関連
* 偶然とはなにか。コインを投げてみよう http://qiita.com/reikubonaga/items/12329122772d8161439d
* p値とはなにか http://qiita.com/reikubonaga/items/c4684fcea0810441a955
* A/Bテストは完全ではない http://qiita.com/reikubonaga/items/6f12543aa2478a6ac3b4
* 乱数(モンテカルロ法)を使って確率を計算しよう http://qiita.com/reikubonaga/items/28ee2c2c8074b98b0b04
Chef で checksum エラーが出た時の対処


remote_file の checksum ではまりました。

問題点
=====

Checksum が一致しない。

    remote_file[file.tar.gz] (wordpress::default line 26) had an error: Chef::Exceptions::ChecksumMismatch: Checksum on resource (6ae44a) does not match checksum on content (650c2f)

原因
====

Chef の checksum は SHA-256
- https://docs.chef.io/resource_remote_file.html

(MD5 を指定していました。)

解決策
====

shasum コマンドで確認して解決。

    $ shasum -a 256 file.tar.gz
リスト内包表記でFizzBuzz

もう例題としては使い古された感のあるFizzBuzzを、Pythonicなリスト内包表記で書いてみる。実質ワンライナー。

```py
def fizzbuzz(N):
    """FizzBuzzのリスト内包表記での実装

    Example:
        >>> print fizzbuzz(10)
        [1, 2, 'Fizz', 4, 'Buzz', 'Fizz', 7, 8, 'Fizz', 'Buzz']

        >>> print fizzbuzz(30)
        [1, 2, 'Fizz', 4, 'Buzz', 'Fizz', 7, 8, 'Fizz', 'Buzz', 11, 'Fizz', 13, 14, 'FizzBuzz', 16, 17, 'Fizz', 19, 'Buzz', 'Fizz', 22, 23, 'Fizz', 'Buzz', 26, 'Fizz', 28, 29, 'FizzBuzz']

    """
    return [(i%3==0)*'Fizz' + (i%5==0)*'Buzz' or i for i in range(1, N+1)]
```

**ポイント**

* `(i%3==0)*'Fizz'`で、括弧内の真偽によって文字列を追加するかどうかが決まる
* `or`による短絡評価で、3か5で割り切れない数はそのまま出力


> [5. 組み込み型 — Python 2.7.x ドキュメント](http://docs.python.jp/2/library/stdtypes.html#and-or-not)
ケンシロウ進数 with C拡張 by ESP8266 + Analog Discovery 2


http://qiita.com/7of9/items/4bc0ed999ea49f4daa9d#comment-5f4f99f9825078a92c8c
> 「あ」と「た」で構成されたケンシロウ進数との夢のコラボレーションが見たいですwww

御意。


終了条件はズンドコキヨシと同じ。


- Analog Discovery 2 (以下AD2)
  - Wavegenで0-1Vのノイズ電圧を発生させる > [Qiita記事](http://qiita.com/7of9/items/8b24c7634cfdadb67e1c)
- ESP8266 (WiFi搭載マイコン)
  - AD取込をする
  - 方法に記載の処理を行いKIYOSHI判定をする
  - 表示は[ケンシロウ進数](http://www.asahi-net.or.jp/~rc4t-ishr/kensiro.html)

## code v0.2

以下のコードとした。

```eps8266_160314_kenshiro.ino
/*
 * v0.2 Mar. 14 2016
 *   - modify into "Kenshiro numeration system"
 * v0.1 Mar. 13 2016
 *   - implement Zundoko Kiyoshi algorithm
 */


// AD取り込みのためのおまじない
extern "C" {
#include "user_interface.h"
}

static const String msg[2] = {
  "Ah_",
  "Ta_",
};

static int s_zunCount = 0;
static bool s_stopCondition = false;
static int s_totalTime_sec = 0;
static int s_scrollCount = 0;
static const int kScrollCount = 30;

void setup() {
  Serial.begin(115200); // 結果出力用シリアルの設定
  Serial.println(""); // to separate line
}

void loop() {
  if (s_stopCondition) {
    return;
  }

  uint ADvalue;
  ADvalue = system_adc_read(); // 0..1024 のAD取込

  int rnd = (ADvalue % 2);
  Serial.print(msg[rnd]);

  if (rnd == 1) {
    s_zunCount++;
  } else {
    if (s_zunCount == 4) {
      Serial.println("Atah! Omaewa sudeni shinde iru");
      s_stopCondition = true;
      Serial.print("Total (atah):");
      Serial.println(s_totalTime_sec);
      return;
    }
    s_zunCount = 0;
  }

  s_totalTime_sec++;
  s_scrollCount++;
  if (s_scrollCount == kScrollCount) {
    s_scrollCount = 0 ;
    Serial.println();
  }

  delay(1000); // msec
}
```

## 結果

299アタっ！となった。
中々終わらないので皇帝サウザーかと思った。

```
Ta_Ta_Ta_Ah_Ta_Ah_Ah_Ta_Ah_Ah_Ah_Ta_Ta_Ah_Ah_Ah_Ta_Ta_Ta_Ta_Ta_Ah_Ah_Ta_Ah_Ta_Ah_Ta_Ah_
Ta_Ah_Ta_Ah_Ah_Ah_Ah_Ta_Ah_Ah_Ta_Ta_Ah_Ah_Ta_Ah_Ta_Ah_Ta_Ah_Ta_Ta_Ah_Ta_Ah_Ta_Ta_Ta_Ah_Ah_
Ah_Ta_Ah_Ta_Ah_Ah_Ah_Ah_Ta_Ta_Ah_Ta_Ah_Ah_Ta_Ta_Ta_Ah_Ta_Ah_Ah_Ah_Ta_Ta_Ah_Ta_Ta_Ah_Ah_Ah_
Ah_Ah_Ta_Ta_Ah_Ah_Ta_Ta_Ah_Ah_Ta_Ah_Ta_Ah_Ah_Ta_Ta_Ta_Ta_Ta_Ta_Ah_Ah_Ta_Ah_Ah_Ah_Ah_Ta_Ah_
Ah_Ah_Ta_Ah_Ta_Ta_Ah_Ta_Ah_Ta_Ta_Ah_Ah_Ta_Ah_Ah_Ah_Ah_Ah_Ta_Ah_Ta_Ah_Ah_Ah_Ah_Ta_Ah_Ah_Ah_
Ta_Ah_Ah_Ta_Ah_Ah_Ah_Ta_Ta_Ah_Ta_Ah_Ta_Ah_Ah_Ah_Ta_Ta_Ah_Ah_Ah_Ah_Ta_Ta_Ta_Ah_Ta_Ta_Ta_Ta_
Ta_Ta_Ah_Ah_Ta_Ah_Ta_Ah_Ah_Ta_Ah_Ta_Ah_Ah_Ta_Ah_Ta_Ta_Ah_Ta_Ah_Ta_Ta_Ah_Ta_Ta_Ta_Ah_Ah_Ah_
Ah_Ah_Ta_Ta_Ta_Ah_Ah_Ah_Ta_Ah_Ah_Ah_Ta_Ah_Ah_Ah_Ta_Ah_Ah_Ta_Ta_Ah_Ah_Ta_Ah_Ta_Ah_Ta_Ta_Ah_
Ta_Ta_Ta_Ah_Ah_Ah_Ah_Ta_Ta_Ta_Ta_Ta_Ah_Ta_Ta_Ah_Ta_Ah_Ah_Ta_Ta_Ta_Ah_Ta_Ta_Ah_Ah_Ta_Ah_Ta_
Ah_Ah_Ta_Ta_Ah_Ah_Ta_Ta_Ta_Ta_Ta_Ta_Ah_Ah_Ah_Ta_Ah_Ta_Ah_Ah_Ta_Ta_Ah_Ta_Ah_Ta_Ta_Ta_Ta_Ah_Atah! Omaewa sudeni shinde iru
Total (atah):299
```
乱数(モンテカルロ法)を使って確率を計算しよう

### 乱数を使って確率を計算
* 0から1の乱数をn個作成 ``runif(n, 0, 1)``
* 0.5%未満の数だけ取得 ``which(x<rate)``
* 0.5%未満の数を数える
* 上の施行を1万回繰り返して、分布を調べる
* quantileは、下位x%番目の数字を出している
* => コイン投げの実験結果とほぼ等しい

```
> n=100;rate=0.5;z<-c();for(i in 1:10000){x=runif(n, 0, 1);y=which(x<rate);z[i]=length(y)/n};summary(z)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
 0.3000  0.4700  0.5000  0.4996  0.5300  0.6900
> quantile(z, c(.01,.05,.25,.5,.75,.95,.99))
  1%   5%  25%  50%  75%  95%  99% 
0.39 0.42 0.47 0.50 0.53 0.58 0.61 
> n=1000;rate=0.5;z<-c();for(i in 1:10000){x=runif(n, 0, 1);y=which(x<rate);z[i]=length(y)/n};quantile(z, c(.01,.05,.25,.5,.75,.95,.99))
   1%    5%   25%   50%   75%   95%   99% 
0.463 0.474 0.489 0.500 0.511 0.526 0.536
```

### 施行数と精度の関係
* 施行数を重ねると、だんだん精度が良くなる。
* 施行数を100倍にすると10倍の精度。
=> 詳しく知りたい人は、「大数の定理」「一様分布」など調べてみて

```
n=10000;rate=0.05;z<-c();for(i in 1:10000){x=runif(n, 0, 1);y=which(x<rate);z[i]=length(y)/n};quantile(z, c(.01,.05,.25,.5,.75,.95,.99))

> n=100000;rate=0.03;z<-c();for(i in 1:1000){x=runif(n, 0, 1);y=which(x<rate);z[i]=length(y)/n};quantile(z, c(.01,.05,.25,.5,.75,.95,.99))
       1%        5%       25%       50%       75%       95%       99% 
0.0289197 0.0291700 0.0296400 0.0299700 0.0303525 0.0309700 0.0312300 
> n=100000;rate=0.03;z<-c();for(i in 1:4000){x=runif(n, 0, 1);y=which(x<rate);z[i]=length(y)/n};quantile(z, c(.01,.05,.25,.5,.75,.95,.99))
     1%      5%     25%     50%     75%     95%     99% 
0.02879 0.02911 0.02962 0.02998 0.03036 0.03088 0.03128
=> 1000回と4000回だと4倍施行数が違うので、精度が2倍になる。その差を見て、誤差だと思えるなら、その施行数で問題ない。95%だと0.0309700と0.03088で0.3%くらい誤差がある。

```


## 関連
* 偶然とはなにか。コインを投げてみよう http://qiita.com/reikubonaga/items/12329122772d8161439d
* p値とはなにか http://qiita.com/reikubonaga/items/c4684fcea0810441a955
* A/Bテストは完全ではない http://qiita.com/reikubonaga/items/6f12543aa2478a6ac3b4
* 乱数(モンテカルロ法)を使って確率を計算しよう http://qiita.com/reikubonaga/items/28ee2c2c8074b98b0b04
AWS Lambda Python版でgcloudパッケージを利用しようとするとImportError

# 現象
Kinesisから来たデータをBigQueryに登録するLambda関数をPythonで書いてアップロード後、処理を流すと下記のエラーが発生した。

```pytb
No module named google.protobuf: ImportError
Traceback (most recent call last):
File "/var/task/main.py", line 17, in kinesis_event_bigquery_handler
insert_records(records)
File "/var/task/main.py", line 29, in insert_records
from gcloud import bigquery
File "/var/task/gcloud/bigquery/__init__.py", line 24, in <module>
from gcloud.bigquery.client import Client
File "/var/task/gcloud/bigquery/client.py", line 18, in <module>
from gcloud.client import JSONClient
File "/var/task/gcloud/client.py", line 20, in <module>
from gcloud._helpers import _determine_default_project
File "/var/task/gcloud/_helpers.py", line 26, in <module>
from google.protobuf import timestamp_pb2
ImportError: No module named google.protobuf
```

# 解決策
空ファイル`__init__.py`をgoogleパッケージに追加する。virtualenvで環境構築している場合はこう：

```shell-session
$ touch lib/python2.7/site-packages/google/__init__.py
```

[lambda-uploader](https://github.com/rackerlabs/lambda-uploader)を利用している場合は、アップロードの際`--virtualenv`を忘れずに。

```shell-session
$ lambda-uploader --virtualenv=.
```

# 参考文献
https://github.com/awslabs/kinesis-deaggregation/blob/master/python/README.md