OmniAICreator/Qiita-1.07M huggingface dataset:
今更ながらPHPでスクレイピングをしてみる


以前は、PHP Simple HTML DOM Parserってのを使っていましたが、久しぶりに調べてみると、phpQueryというのがあるようなので、それを使ってみる。

オリジナルのものは[ここ](https://code.google.com/archive/p/phpquery/downloads)からダウンロードできるようです。
が、しばらくメンテされてないようです。[ForkしてComposerに対応したもの](https://github.com/zomberg/phpquery)もあるようです（試してません）。

なお、あまりTableを対象としたサンプルが無かったのでテーブルのスクレイピングを中心に書きます。

##シンプルなデモ

このようなHTML(test.html)があるとすると、

```html
<!doctype html>
<html>
<head>
	<title>scraping test</title>
</head>
<body>
<h1>hoge</h1>
<!-- table1 -->
<div id="greeting">Hello</div>
<table>
	<tr>
		<td>name</td>
		<td>hoge</td>
	</tr>
	<tr>
		<td>email</td>
		<td>hoge@hoge.com</td>
	</tr>
</table>

<!-- table2 -->
<table>
	<tr>
		<td>address</td>
		<td>tokyo</td>
	</tr>
	<tr>
		<td>tel</td>
		<td>03-1234-5678</td>
	</tr>
	<tr>
		<td>image</td>
		<td><img src="hoge.png" atl="sample"></td>
	</tr>
	<tr>
		<td>detail</td>
		<td><a href="http://xxx/">more..</a></td>
	</tr>
</table>

<div class="btn">aaa</div>
<div class="btn">bbb</div>

</body>
</html>
```

例えば、タイトルを取得するのは、 下記のように取れるようである。

```php
<?php

	//require
	require_once('phpQuery-onefile.php');
	
	//ページ取得
	$html = file_get_contents('./test.html');
	
	//DOM取得
	$doc = phpQuery::newDocument($html);

	//要素取得
	echo $doc["title"]->text();
```

なお、要素は、pq()メソッドを使って、

```php
echo pq("title")->text();
```

と書くこともできるようです。
pq()は、jQueryの$()と等価であると共に、DOMをphpQueryで処理できるよう構造化する機能もあるようです。

##基本的な使い方

$doc[""]（もしくはpq(""))の""の中身はjQueryのセレクタが使えるので、基本、jQueryと同じように利用すればいいのですが、ちょっとしたクセもあるので、基本的な使い方のメモ。

必要な要素にidが振られていれば、操作に苦労はあまりないのですが、一意なidが振られていない場合は、要素の指定に少々工夫が必要です。

###idで指定する

```php
echo $doc["#greeting"]->text();
```

###classで指定する

クラスの場合は複数の要素が存在するので、必要に応じて取得する要素を限定するようにします。

```php
echo $doc[".btn:eq(1)"]->text();
```

###静的に指定する

先述のHTMLには2行2列の2つのテーブルがあります。その2つ目のテーブルの1行目の2列目の要素（tokyo)を取得する場合は、

```php
echo $doc["table:eq(1) tr:eq(0) td:eq(1)"]->text();
```

のように指定する。find()を利用して、

```php
echo $doc["table:eq(1)"]->find("td:eq(1)")->text();

```
とも書けるようす。


###foreachで回す

複数の値が返ってくる要素は、原則としてforeach()が利用できるようです。
ただ、tableの場合は、各td要素の値を個別に取得することができないようで、あまり使い勝手は良くありません。

```php
foreach($doc["table:eq(0) tr"] as $row)
{
	//各要素取得
	$key   = pq($row)->find("td:eq(0)")->text();
	$value = pq($row)->find("td:eq(1)")->text();
	
	//表示
	echo $key . " " . $value . "<br>";
}
```

実務では、後述のcontains等を利用するこの方が多くなります。

##利用サンプル

ここでは実開発で利用するサンプルを随時の記述していきます。

###特定の行の値を抽出

実運用では、テーブルの場合、特定の要素を抜く需要が多いかとおもいます。
例えばemailという項目を値を取得する場合は、containsと+を利用して、となりの要素を指定したりします。

```php
echo $doc["table"]->find("td:contains('email') + td")->text();
```

###HTMLをそのまま取得

->text()ではなく、->html()を利用すれば、そのままのHTMLが取得できる。

```php
$html = $doc["table:eq(1)"]->find("td:contains('image') + td")->html();
```

###アトリビュートを取得

```php
$src = $doc["table:eq(1)"]->find("td:contains('image') + td img")->attr("src");
$href = $doc["table:eq(1)"]->find("td:contains('detail') + td a")->attr("href");
```
d3.jsのtransitionでスタイルプロパティを変更する際の注意

IE9に手こずったので、ここに備忘録。今更IE9なんざどうだっていいよ！という皆様にはなんの意味もない情報です。

d3.jsのtransition処理でstyleを変更することはよくあることだと思います。その際、IE9の場合、IE10以降では出ないエラーが出ることがわかりましたので、下に記載します。

エラーが出るのは、z-indexをtransitionしようとした場合です。例えば、

``` 
d3.select('#hoge').transition().style({'opacity': 0, 'z-index': -100})
```

のように、透明にしつつ、要素を背面に移動する、というパターンです。この場合、d3側でtransitionのアニメーションに即して、徐々にスタイルプロパティの値を増減するのですが、z-indexのように、値がfloat型に対応しない場合、エラーがでます。

これはIE9のみの問題です。opacityなどのプロパティは、floatを許容しているので、問題はありません。
z-index以外にも、もしかしたらあるかもしれませんね。


取り急ぎ、eachを利用して下記のようにすることで目的の動作が実現します。

``` 
var hoge = d3.select('#hoge');
hoge.transition().style('opacity', 0).each('end', function(){
    hoge.style('z-index', -100);
});
```
※もちろん、複数の要素（例えばセレクタにクラスを指定した場合）に対してeachを実行する場合は、eachの処理を目的に応じて調整してください。
Pythonで簡単にHTTPサーバを作る

ちょっとした動作確認にさくっとHTTPサーバを作る場合の方法です．

```py:CallbackServer.py
#!/usr/bin/env python

import requests
from BaseHTTPServer import HTTPServer
from BaseHTTPServer import BaseHTTPRequestHandler
import urlparse

def start(port, callback):
    def handler(*args):
        CallbackServer(callback, *args)
    server = HTTPServer(('', int(port)), handler)
    server.serve_forever()

class CallbackServer(BaseHTTPRequestHandler):
    def __init__(self, callback, *args):
        self.callback = callback
        BaseHTTPRequestHandler.__init__(self, *args)

    def do_GET(self):
        parsed_path = urlparse.urlparse(self.path)
        query = parsed_path.query
        self.send_response(200)
        self.end_headers()
        result = self.callback(query)
        message = '\r\n'.join(result)
        self.wfile.write(message)
        return
```

HTTPServerをベースにしてコールバック関数を設定しているクラスを定義しています．requestsはpip等でインストールしてください．

使い方はこんな感じ．

```py:simple_test.py
#!/usr/bin/env python
# coding:utf-8

import sys
import CallbackServer

def callback_method(query):
    return ['Hello', 'World!', 'with', query]

if __name__ == '__main__':
    port = sys.argv[1]
    CallbackServer.start(port, callback_method)
```

ポート番号だけ受け取って，ポート番号とHTTPアクセスがあった場合に呼び出されるメソッド（`callback_method`）を渡せば後は勝手にHTTPサーバが上がってくれます．
`callback_method`は引数にGETクエリ（URLの?より後ろ側）を受け取って，Responseとして返す文字列をreturnで返します．
文字列のリストを返せば勝手にCRLFで改行されます．

起動は

```zsh
./simple_test.py 12345
```

という感じで実行して，後はブラウザから`http://localhost:12345/?hoge=123`とかにアクセスすると

```
Hello
World!
with
hoge=123
```

が出力されます．
ActiveJobでのRSpec


どうしたもんやらと悩んでいたんだけど [have_enqueued_job matcher](https://relishapp.com/rspec/rspec-rails/v/3-4/docs/matchers/have-enqueued-job-matcher) ってのがあった！
これで勝つるっ！

## 簡単な使い方（enqueueされたかどうかだけを確認したい時）

```
RSpec.describe TestScheduleJob do
  ActiveJob::Base.queue_adapter = :test
  it {
    expect {
      TestScheduleJob.perform_later
    }.to have_enqueued_job(TestJob)
  }
end
```

## enqueueされた件数をテストしたい時

```
RSpec.describe TestScheduleJob do
  ActiveJob::Base.queue_adapter = :test
  it {
    expect {
      TestScheduleJob.perform_later
    }.to have_enqueued_job(TestJob).exactly(1)
  }
end
```

``exactly`` には数字が入ったり ``:once`` やら ``twice`` が入ったりするらしい。けど、日本人的には数字が入ってる方がわかりやすい気がする。まぁ、そこはお好みで。
（once, twice の次ってなんだっけ？ってので悩むぐらいなら...みたいな

``exactly`` 以外にも、最低でもx件とか最高でもx件の時は ``at_least`` とか ``at_most`` でいけるっぽい
AmazonAWSで、MySQL がよく落ちる？ そんな時はSWAP領域をチェック！

Amazon AWSにてt1microサービスを利用していますが、MySQLがよく落ちるんです。  
それで、ログを確認したところ。。。

```
[Note] InnoDB: Initializing buffer pool, size = 128.0M InnoDB: mmap(137363456 bytes) failed; errno 12
[ERROR] InnoDB: Cannot allocate memory for the buffer pool
[ERROR] Plugin 'InnoDB' init function returned error.
[ERROR] Plugin 'InnoDB' registration as a STORAGE ENGINE failed.
[ERROR] Unknown/unsupported storage engine: InnoDB
[ERROR] Aborting
```


メモリを確認すると、Swapが０でした。。。

```
[root@ip-xxx ~]# free
             total       used       free     shared    buffers     cached
Mem:       1018504     949092      69412      31980      28740     695944
-/+ buffers/cache:     224408     794096
Swap:            0          0          0

```

要するに、AWSのt1microサービスだと、Swap領域が無かった訳です。
やることは、Swap領域を作成してあげれば、問題解決ですね。

まずは、ddコマンドで指定サイズの空のファイルを作成します。
とりあえず、サイズは1024MBで。

```
[root@ip-xxx ~]# dd if=/dev/zero of=/swapfile bs=1M count=1024

1024+0 records in
1024+0 records out
1073741824 bytes (1.1 GB) copied, 14.8488 s, 72.3 MB/s
```

mkswapで、スワップ領域を作成します。

```
[root@ip-xxx ~]# mkswap /swapfile
mkswap: /swapfile: warning: don't erase bootbits sectors
        on whole disk. Use -f to force.
Setting up swapspace version 1, size = 1048572 KiB
no label, UUID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxxx
```

swaponコマンドで、スワップ領域を有効にします。

```
[root@ip-xxx ~]# swapon /swapfile
```

freeコマンドで、確認すると、Swap領域が作成されました。

```
[root@ip-xxx ~]# free
             total       used       free     shared    buffers     cached
Mem:       1018504     950208      68296      31980      28772     697060
-/+ buffers/cache:     224376     794128
Swap:      1048572          0    1048572
```

あとは、MySQLを再起動するだけです。

```
[root@ip-xxx ~]# service mysqld restart
mysqld を停止中:                                           [  OK  ]
mysqld を起動中:                                           [  OK  ]
```

上記設定のままだと、再起動した時にマウントされないので、 `/etc/fstab` に以下の1行を追加。

```
/swapfile    swap       swap    defaults        0   0
```

お疲れ様でした。
Git | push の前に任意のプログラムを走らせてミスを減らす 

# 解決

git のエイリアスとして、push 前に走らせたいコマンドを登録しておく。

```bash:~/.gitconfig
[push]
  default = current
[alias]
  before-push = !bundle exec rubocop && bundle exec rake notes && echo 'sleep 10 seconds and you will push' && sleep 10

  gentle-push = !git before-push && git push
```

そして `$ git gentle-push` とコマンドすれば良い。

上は rubocop ( Ruby の文法チェッカ ) と、 notes ( アノテーションを見つけてくれるタスク ) を走らせている例。

# 結果

こんな感じ。

![image](https://qiita-image-store.s3.amazonaws.com/0/90607/2ed4d064-9ab5-d4c1-b7a4-b5ee3239174e.png)

↓

![image](https://qiita-image-store.s3.amazonaws.com/0/90607/dc48099b-4e9c-7347-8017-b1005da06cf5.png)


# 説明

- 10秒スリープしているのは、何かエラーが起きた時に、Command+C で抜けられるようにするため。自動では止まらないので注意。
- 必要な部分は適時書き換えて欲しい。たとえば、push を push -f にしたり。

# 組み合わせ

before-push に [現在のブランチを1コマンドで「最新のマスター」にリベースするエイリアス](http://qiita.com/Yinaura/items/562b09ec4c7ad93ed2ab) も入れておくと素敵だ。

```:~/.gitconfig
[push]
  default = current

[alias]
new-world = !git checkout master && git pull origin master && git checkout - && git rebase master

before-push = !git new-world && bundle exec rubocop && bundle exec rake notes && echo 'sleep 5 seconds and you will push' && sleep 5
```
 
# 問題

push 前に走らせるべきものを、忘れてしまうことが多い。 間違いは手元で分かったほうが良い。

# 環境

- git version 2.3.8 (Apple Git-58)
- Mac OSX Yosemite



<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ


# メンター受付


https://menta.work/user/5694

<!-- Update From Qiita API -->
kintone上で JavaScriptが開発できる『JSEdit for kintone』

kintoneの JavaScript開発は、ファイルのアップロードかまたは外部のサーバー領域に配置した JavaScriptファイルを読み込ませるしかありません。しかし、『JSEdit for kintone』を利用するとこれが解消できました。

# ファイルのダウンロード

まずは、以下のサイトからファイルをダウンロードします。

- [kintone上でカスタムJSやCSSを編集できるプラグイン「JSEdit for kintone」を使ってみよう – cybozu.com developer network](https://cybozudev.zendesk.com/hc/ja/articles/205452613)

# インストール

kintoneにログインしたら、「kintoneシステム管理→プラグイン」メニューから、左上の「読み込む」ボタンをクリックして、ダウンロードしたファイルを指定します。

続いて、利用したアプリに移動して「アプリの設定を変更」メニューをクリックし、「詳細設定→プラグイン」をクリックし、左上の「プラグインを追加」ボタンをクリックします。

# JSEditを利用する

プラグインをインストールすると、プラグインリストにJSEditが表示されるので、「設定」の歯車アイコンをクリックすると、プラグインが起動します。

「新規作成」ボタンをクリックすると、ファイルを作成することができます。これならファイルの編集が非常に簡単です。

- [kintone導入・開発支援 \| H2O space](https://h2o-space.com/service/kintone/)
Bayes LinuxのGalaxyでRNA-seq解析を行う

# はじめに
ここでは Bayes Linuxには Galaxy がインストールされています。Galaxy上には、RNA-seq解析ワークフローが、組み込まれています。ここではデモデータを利用してRNA-seq解析を実施する方法を述べます。

# ワークフローの概要
RNA-seqで得られた配列から遺伝子発現を定量します。発現量の定量には2つの方法があります。ひとつはゲノムに配列をマッピングする方法、もうひとつはトランスクリプトームへマッピングする方法です。Galaxyには後者の方法を採用したワークフローが登録されています。デモデータはマウスES細胞の1細胞RNA-seqのデータになります。

# デモデータの入手
まず、以下のいずれかを読み、Bayes Linuxを起動させます。

* [Bayes Linuxを完成した仮想マシンイメージから起動する](http://qiita.com/dritoshi/items/1d95480022feb25cb5ac)
* [Bayes Linuxでバイオインフォマティクス解析環境を簡単に再現良く構築する](http://qiita.com/dritoshi/items/707d3dd1fe9ed4f3b5b6)

次にデモデータをインストールします。デモデータは理研上のサーバから入手されます。環境によって数時間程度かかります。

Bayes Linuxにログインするか、VirtualBox上から、以下のコマンドを入力します。

```
curl -ssL https://bioinformatics.riken.jp/bayes/vm/dl.sh | bash -s
```

このコマンドにより ```/data``` にデータが保存されます。
保存されるデータは以下の通りです。

* adapter_primer (混入が予想されるPCRプライマー配列)
* bowtie2_index (Ensembl transcriptのbowtie2インデックスファイル)
* quartz_div100_rename (RNA-seqデータ, fastq)
* sailfish_index (Ensembl transcriptのsailfishインデックスファイル)
* transcriptome_ref_fasta (Ensembl transcript, FASTA)

# Galaxyへのデータの配置
デモデータをGalaxyのデータライブラリへの登録します。

1. Galaxyに、
ID: admin@galaxy.org
パスワード: admin
でログインする

2. 上部のAdminをクリックする
![image00.png](https://qiita-image-store.s3.amazonaws.com/0/3890/1ef30a89-3179-28d8-8e7a-f390bbbfc985.png)

3. 左メニューの中の、Data Libraryをクリックする
![image01.png](https://qiita-image-store.s3.amazonaws.com/0/3890/7b826b73-4dc3-49d5-d78f-d41a68ffb718.png)

4. 右上の、Create new data libraryをクリックする
![image02.png](https://qiita-image-store.s3.amazonaws.com/0/3890/8d43388d-9700-5369-7e87-f964daea9ef1.png)

5. Nameにadapter_primerと入力し、Createをクリックする
![image03.png](https://qiita-image-store.s3.amazonaws.com/0/3890/a78e4e59-78ee-6e08-d377-c17d0fc22c2e.png)

6. 右上Add datasetsをクリックする
![image04.png](https://qiita-image-store.s3.amazonaws.com/0/3890/03d895b8-52da-346e-9f66-7e52823fc0d0.png)

7. 以下の情報を入力し、Upload to libraryをクリックする
![image05.png](https://qiita-image-store.s3.amazonaws.com/0/3890/1052e2fc-2458-4491-0e3e-4c0c238cd811.png)

* Upload: directory of filesを選択
* File Format: fastaを選択
* Server Directory: adapter_primerを選択
* Copy Data into Galaxy?: Link to files without copying into Galaxy を選択

transcriptome_ref_fastaのデータを入れるために、もう１度、３から７まで作業する。ただし、５で入力するNameはtranscriptome_ref_fasta.

７で入力する内容は以下の通り。

* Upload options: Upload direcoty of filesを選択
* File Format: fastaを選択
* Server Directory: transcriptome_ref_fastaを選択
* Copy Data into Galaxy?: Link to files without copying into Galaxy を選択

quartz_div100_rename　のデータを入れるために、もう１度、３から７まで作業する。ただし5で入力する内容は、quartz_div100_rename,７で入力する内容は以下の通り。

* Upload options: Upload direcoty of filesを選択
* File Format: fastqsangerを選択
* Server Directory: quartz_div100_renameを選択
* Copy Data into Galaxy?: Link to files without copying into Galaxy を選択

# Galaxyでワークフローを実行する
つづく。
Karma/Jasmineで（jsonの）fixtureを使う

一度、うまく行かなかったので整理をするために記事にしました。

[ES6+Karma+Jasmine環境のテンプレート](http://qiita.com/110chang/items/4e9326773ea871ec9d2c)の続きです。

# [jasmine-jquery](https://github.com/velesin/jasmine-jquery)

KarmaのことはほっといてJasmineのjQuery拡張を使用。

via http://qiita.com/ngyuki/items/d36e500b55e1f627acab

ほぼ上記の記事のとおり。

現在ではkarma-jasmineのjasmineは2.x系のようなので特に問題ない。

```js:karma.conf.js
module.exports = function(config) {
  config.set({
    ...
    files: [
      '/path/to/jquery/dist/jquery.min.js',
      '/path/to/jasmine-jquery/lib/jasmine-jquery.js',
      ...
      { pattern: '/path/to/fixtures/**', included: false }
    ],
    ...
  });
};
```

dependenciesはこんな感じ

```js:package.json
{
  ...
  "devDependencies": {
    ...
    "jasmine-core": "^2.4.1",
    "jasmine-jquery": "^2.1.1",
    "jquery": "^2.2.1",
    "karma": "^0.13.15",
    "karma-browserify": "^4.4.2",
    "karma-chrome-launcher": "^0.2.2",
    "karma-jasmine": "^0.3.6"
  }
}
```

試してみる

```js
describe('Sample', () => {

  beforeEach(() => {
    jasmine.getFixtures().fixturesPath = 'base/path/to/fixtures';
  });

  it('can use fixtures', () => {
    let fixture = readFixtures('path/to/fixture');
    expect(fixture).toBe('[{"this":"is","a":"json","fixture":"!"}]')
  });
});
```

# [karma-jasmine-jquery](https://github.com/bessdsv/karma-jasmine-jquery)

Karma用のjasmine-jqueryプラグインを使用。

```js:karma.conf.js
module.exports = function(config) {
  config.set({
    ...
    frameworks: [..., 'jasmine-jquery', 'jasmine'],
    ...
    files: [
      ...
      { pattern: '/path/to/fixtures/**', included: false }
    ],
    ...
    plugins: [..., 'karma-jasmine-jquery', 'karma-jasmine', ...],
    ...
  });
};
```

`frameworks`に`'jasmine-jquery'`。また、公式には記載がないが、`plugins`に`'karma-jasmine-jquery'`が必要だった。

via http://stacksolve.com/lvO2xkgLp1BY/no-provider-for-jasminejquery.html

```js:package.json
{
  ...
  "devDependencies": {
    ...
    "jasmine-core": "^2.4.1",
    "karma": "^0.13.15",
    "karma-browserify": "^4.4.2",
    "karma-chrome-launcher": "^0.2.2",
    "karma-jasmine": "^0.3.6",
    "karma-jasmine-jquery": "^0.1.1"
  }
}
```

`files`への記載が少ない分、楽かも。

# karma-fixture/karma-json-fixtures-preprocessor

テストスイートはmochaでないとダメな模様。

# サンプルのレポジトリ

https://github.com/110chang/babel-starter

こうして、まとめてみると大したハマりどころもないが、なぜなのか…
ズンドコキヨシ with Ruby

参考: http://qiita.com/y__sama/items/7c451dfd706f9b36729d

ひとまず１つめの実装を張っておきます
他に思いついたら足していきます

## 単にループ

```rb
def zundoko
  z, d = zd = ['ズン', 'ドコ']
  w1, w2, w3, w4, w5 = 5.times.map { nil }

  until [w1, w2, w3, w4, w5] == [z, z, z, z, d]
    w1, w2, w3, w4, w5 = w2, w3, w4, w5, zd.sample.tap(&method(:print))
  end

  print 'キ・ヨ・シ！'
end

zundoko
```

## Enumerator

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr"><a href="https://twitter.com/yancya">@yancya</a> 無限に「ズン」「ドコ」のどちらかを出し続けるEnumeratorを作って、each_consがスマートだと思う。</p>&mdash; joker1007に宜しく (@joker1007) <a href="https://twitter.com/joker1007/status/708184964034985984">2016年3月11日</a></blockquote> <script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

なるほど

```rb
def zundoko
  z, d = zd = ['ズン', 'ドコ']

  loop.lazy.map { zd.sample }.each_cons(5).with_index do |nominees, i|
    i.zero? ? nominees.each(&method(:print)) : print(nominees.last)
    break if nominees == [z, z, z, z, d]
  end

  print 'キ・ヨ・シ！'
end

zundoko
```

その２

```rb

def zundoko
  z, d = zd = ['ズン', 'ドコ']

  loop.lazy.map { zd.sample }.reduce([]) do |nominees, w|
    break print('キ・ヨ・シ！') if nominees == [z, z, z, z, d]
    nominees.last(4) + [w.tap(&method(:print))]
  end
end

zundoko
```

## 再帰

```rb
Z, D = ZD = ['ズン', 'ドコ']

def zundoko(nominees = [])
  return print('キ・ヨ・シ！') if nominees == [Z, Z, Z, Z, D]

  zundoko(nominees.last(4) + [ZD.sample.tap(&method(:print))])
end

zundoko
```
Googleカレンダーの予定に通知を追加

iPadのカレンダーからは通知は2つまでしか登録できず、しかも細かい指定ができないので、とりあえず予定だけ作っておいて、このスクリプトを回して通知を追加する。
（iPadからGoogle App Scriptにアクセスするのはちょっとつらいけれども。）

Google Apps Scriptへは下記からアクセス
https://www.google.com/script/start/

```js
function addReminder() {
  var calendar = CalendarApp.getCalendarsByName("カレンダー名")[0];
  var now = new Date();
  var yearsFromNow = new Date();
  yearsFromNow.setYear(now.getYear() + 1 );
  // 今から１年後までの予定を検索
  var events = calendar.getEvents(now, yearsFromNow, {search: '予定の名前'})
  for (i= 0; i < events.length; i++) {
    events[i].removeAllReminders();  // 既存の通知をすべて削除
    events[i].addEmailReminder(1440 + 600);  // Eメール通知。通知時間は分で設定
    events[i].addEmailReminder(1440 * 6 + 600);  // 6日＋10時間前というような指定も可能
    events[i].addEmailReminder(1440 * 13 + 600);
  }
}
```

ちなみに1つの予定にEメール通知は5個まで。それ以上はエラーになる。
【C# 6.0】Dapper 1.42.0 + read-only 自動プロパティ ⇒ マッピングされない…

C# 6.0 から自動プロパティの初期化が簡単に行えるようになりました。
なので、今までコンストラクタからのみセットしていた`public string Hoge { get; private set; }` のような（プライベートセッター）プロパティも全部置き換えたら、Dapper さんに無視されてしまったお話です。

## read-only 自動プロパティ
```C#:read-only_auto_property
public class Person {
    public string name { get; } = "さやかちゃん";
    public int age { get; set; } = 14;
}
```

これですね。
でも 2016/3/11 現在の Dapper 1.42.0 は read-only 自動プロパティへのマッピングが行われませんので、

```csharp
var sql = "select 'ほむほむ' as name, 20 as age";
var person = dbConnection.Query<Person>(sql).FirstOrDefault();
// person.name: さやかちゃん
// person.age: 20
```
↑ の結果、`name` は `ほむほむ` にマッピングされず `さやかちゃん` のままです。
~~可愛い女の子だと思った？残念、さやかちゃんでした！~~

## 既に修正済み？
この事は２週間ほど前にスタックオーバーフローで指摘されており、さっそく Marc Gravell 氏によって修正版がコミットされてました。
[Does Dapper support c# 6 read-only properties in POCOs?](http://stackoverflow.com/questions/35634434/does-dapper-support-c-sharp-6-read-only-properties-in-pocos)

デプロイは次回ビルド時との事です。
Macでsl


疲れたとき、行き詰まったとき、全てを投げ出してかけだしたいとき、ふと眺めて癒されたいslについて。

## 通常版

```sh
brew install sl
sl
```

![Screen Shot 2016-03-11 at 14.41.43.png](https://qiita-image-store.s3.amazonaws.com/0/74328/a86eab84-3a51-3f7e-232c-6538cf5027de.png)


ふつうに癒されますね。

## MacOSX版

sl(1) Mac OS X version
http://home.hiroshima-u.ac.jp/nyoho/sl.html


```sh
git clone https://github.com/Nyoho/SLMacOSXVersion
cd SLMacOSXVersion
make
cp ./sl /usr/local/bin/
sl
```

![Screen Shot 2016-03-11 at 14.38.32.png](https://qiita-image-store.s3.amazonaws.com/0/74328/7f7ec269-0b58-779b-6253-703666f28f3a.png)


ターミナルの枠を超えて力強く走るsl。
さらに癒されますね。
CentOS7でSQLite3を有効にする

前提条件がよくわからないが、CentOS7で稼働しているWebサーバーでSQLite3が利用したいがうまく稼働しないらしい。

検索して調べると、CentOS7 での情報、というのが探しにくいが、最終的に効果があったような気がするのは、下記の手順。
（ただし途中まであれこれしていた環境なので、これだけで完了ではないとは思う）

`/etc/php.d/sqlite.ini`

ファイルを作成する。中身は以下の通り

    extension=pdo.so
    extension=sqlite.so
    extension=pdo_sqlite.so

php-pdo をインストールする

`yum -y install php-pdo`

Apacheを再起動する。

`systemctl restart httpd`

（sudo必要な人は適宜）

参考：
[PHP: インストール手順 - Manual](http://jp2.php.net/manual/ja/sqlite.installation.php)
のコメント「Otto Monnig omonnig [at] gmail [dot] com」
mongodが起動しない場合の確認点

### 症状

yumでmongodbをインストール、その後にサービスを起動するが失敗する。
失敗に関するログ等の出力は無い。

```
$ service mongod start
Starting mongod:                                           [FAILED]
```

### 環境
- CentOS release 6.5 (Final)
- MongoDB shell version: 2.6.11

### 確認点
1.   logpathへの書き込み権限
2.  Locale設定


### 1. logpathへの書き込み権限

logpathの所有者がrootになっていて書き込みに失敗しているケース。

```lang:/etc/mongod.conf
# default
logpath=/var/log/mongodb/mongod.log
```

所有者をmongodにするか書き込み権限を付与する。





### 2. Locale設定

Localeの設定が問題で発生するケース。


```lang:エラー内容
SEVERE: Failed global initialization: BadValue Invalid or no user locale set. Please ensure LANG and/or LC_* environment variables are set correctly. 
[FAILED]
```

言語設定まわりの環境変数の見直し。
環境変数を定義する。

```lnag:一時的な変更
$ export LC_ALL=C
```

システム全体に適用する場合は`/etc/sysconfig/i18n`、ユーザごとに適用する場合は`~/.bashrc`に定義。




### 補足：2. Locale設定でのエラー確認方法

デバックモードで起動スクリプトを実行。

```
$ bash -x /etc/init.d/mongod start
```

```
+ runuser -s /bin/bash mongod -c 'ulimit -S -c 0 >/dev/null 2>&1 ;  /usr/bin/mongod  -f /etc/mongod.conf >/dev/null 2>&1'
+ '[' 1 -eq 0 ']'
+ failure '/usr/bin/mongod startup'
```

runuserで失敗。
エラー内容を出力するように変更して再実行。

```lang:/etc/init.d/mongod
- runuser -s /bin/bash mongod -c 'ulimit -S -c 0 >/dev/null 2>&1 ;  /usr/bin/mongod  -f /etc/mongod.conf >/dev/null 2>&1'
+ runuser -s /bin/bash mongod -c 'ulimit -S -c 0 >/dev/null 2>&1 ;  /usr/bin/mongod  -f /etc/mongod.conf'
```
PHPでネットワーク上のMySQLにアクセスする

職場のPC（Mac）と自宅のPC，持ち歩き用の2in1 PCと，あちこちでプログラミングをしています．
PCの数だけデータを複製するのもばかばかしいので，某VPSにMySQLをインストールし，そこにデータをぶち込んでアクセスすることにしました．

MySQLの環境構築は別に説明するとして，ネットワーク上にあるMySQLにPHPでアクセスしてみました．

とりあえずはこんなもんで

```php
function opendb($user, $password) {

	try {
		$dsn = 'mysql:dbname=foo;host=bar.com';
		$conn = new PDO ( $dsn, $user, $password );
	} catch ( PDOException $e ) {
		print ('Connection failed:' . $e->getMessage ()) ;
		die ();
	}
	return $conn;

}
```

ネットワーク上のbar.comにデータベースfooがあったとして，PDOを作ってデータベースにアクセスするためのユーザー名とパスワードを与えます．念のためtryでくるんで例外処理をさせます．

しかしPHPのPDOは便利ですね．
もう15年以上前になりますが，PostgreSQLとPHPでWEBデータベースを作っていたときにはまだPDOは無くて，pg_connectとかでデータベースに接続していました．

PDOを使えばデータベースの種類に依存しないプログラムが書けるので大変便利です．例えば簡易的にSQLiteを使いたいときにはこんなふうにします．

```php
function opendb($user, $password) {

	try {
		$dsn = 'sqlite:foo.sqlite';
		$conn = new PDO ( $dsn );
	} catch ( PDOException $e ) {
		print ('Connection failed:' . $e->getMessage ()) ;
		die ();
	}
	return $conn;

}
```

SQLiteはユーザーという概念がないため，$dsnに直接SQLiteのファイル名を指定するだけです（この場合はfoo.sqlite）．
また，SQLiteはメモリにデータベースを構築することができます．

その場合は$dsnの部分を` $dsn = 'sqlite:memory:';` とすればOKです．
Androidでcolorを配列で指定してリソースIDを取得する方法

単純にgetResources().getIntArray(R.array.color_list)だとリソースIDの配列として取得ができなかった。。。

以下のカラー配列をcolors.xmlに定義

```xml:colors.xml
    <array name="color_list">
        <item>@android:color/white</item>
        <item>@android:color/gray</item>
        <item>@android:color/black</item>
        <item>@android:color/red</item>
    </array>
```

javaコードからカラー配列を取得して、リソースIDを取得する

```java:ColorListActivity.java
private int[] getColors() 
{
        int[] colorList;
        // colors.xmlからカラー配列を取得する
        TypedArray colors = getResources().obtainTypedArray(R.array.color_list);
        if (colors.length() <= 0) {
            return null;
        }

        // リソースID用の配列を準備
        colorList = new int[colors.length()];
        for (int ii=0; ii<colors.length(); ii++) {
            // TypedArrayから指定indexのTypedValueを取得する
            TypedValue colorValue = new TypedValue();
            if (colors.getValue(ii, colorValue)){
                // TypedValueからリソースIDを取得する
                colorList[ii] = colorValue.resourceId;
            }
        }
        return colorList;
}
```

取得したリソースIDでカラー設定してあげれば色が反映される
例
各要素.setColor(resourceId);

もっと簡単なやり方があれば、教えて下さーーい。
Nginxで 504 Gateway Time-outが出た時の対応

nginx.conf に以下を追加すればOK

```lang:nginx
server {
	# 秒数を指定
	fastcgi_read_timeout 180;
}
```
この対応に至った経緯

とあるアドテク案件でAPIでキャンペーン一覧を取得するシーンがありました

１万件以上のキャンペーンが必要なのですが、なぜか1リクエストで２００件しかとれず・・・

リクエスト数がやばいので一応API改善の要求

せめて１０００件！文字数制限にかかったらサーバーの設定変更して下さい

でもそれでもこれを使って下さいということなので、仕方なくページングしてキャンペーン取得のAPIを叩きまくった！

Nginxの504 Gateway Time-outが発生！デフォルトのままだったので、fastcgi_read_timeoutを300秒に変更！まだ取れない！

API実装者から悲鳴が上がったｗ

こうしてAPI実装者とのタスク攻防は、僕のドス攻撃により幕を閉じたのであった（笑）
gitのリモートブランチを全てチェックアウト

リモートと同じ名前でチェックアウトするなら、下記でいけました。
あまり使う場面はないですが、メモとして。

```
$ git fetch
$ for branch_name in `git branch -r | grep -v master`;do
> git checkout -t $branch_name
> done
```

## 参考サイト

http://qiita.com/datsnet/items/3394d50cce56b41e9aef

http://qiita.com/d6rkaiz/items/e14aaf63ecd8aa9f715b
macにVisualSFMをインストールする

VisualSFMは、structure from motion　するフリーソフトです。
http://ccwu.me/vsfm/

macへのインストールはここに書いてあるリンクをたどって
http://ccwu.me/vsfm/install.html#mac
こちらのshスクリプトを利用します。
https://github.com/luckybulldozer/VisualSFM_OS_X_Installer

zipをダウンロードして、
```
$ sh vsfm_os_x_installer_mavericks.sh
```
これで進むがままで完了となるはずですが、エラーが出る場合は、
https://github.com/luckybulldozer/VisualSFM_OS_X_Installer/issues/23

ここにあるように
```
brew install --with-x11 --devel cairo
```
として、再度shコマンドを打ちます。
```
$ sh vsfm_os_x_installer_mavericks.sh
```

あと、cmakeがないというエラーも出る場合は以下コマンドを打ちます。
```
brew link cmake
```

コンパイル終了したら、.bash_profile にパスを追加してね！と出るので、追加後以下コマンドで変更を反映します。
```
source .bash_profile
```
vsfm/bin/VisualSFMをターミナルから起動すればできあがり！

なお、Finderから起動すると、ライブラリー関連にパスが通ってなくて途中でエラーになるので注意。
例のキヨシチェックを Enumerator を使ってスマートに書いてみましょう

こういう状態遷移が絡む系のチェックは Enumerator の仕組みを使うといい感じに書けそうですね。

# というわけでできたもの

```csharp
IEnumerator<string> RandomZunDoko()
{
	for (;;) {
		yield return Random.Range(0, 2) == 0 ? "ズン" : "ドコ";
	}
}

IEnumerator<string> KiyoshiCheck(IEnumerator<string> source)
{
	for (;;) {
		Retry:
		for (int i = 0; i < 4; ++i) {
			if (!source.MoveNext()) {
				yield break;
			}
			yield return source.Current;
			if (source.Current != "ズン") {
				goto Retry;
			}
		}
		if (!source.MoveNext()) {
			yield break;
		}
		yield return source.Current;
		if (source.Current != "ドコ") {
			goto Retry;
		}
		break;
	}
	yield return "キ・ヨ・シ！";
}
```

# 使い方

```csharp
IEnumerator<V> SafetyLimit<V>(IEnumerator<V> source, int n)
{
	for (var i = 0; i < n; ++i) {
		if (source.MoveNext()) {
			yield return source.Current;
		} else {
			yield break;
		}
	}
}

IEnumerator<string> Counter(IEnumerator<string> source)
{
	var c = 0;
	while (source.MoveNext()) {
		yield return source.Current;
		++c;
	}
	yield return string.Format("({0}回ズンドコしました)", c - 1);
}

string Result(IEnumerator<string> source)
{
	var s = "";
	while (source.MoveNext()) {
		s += source.Current;
		s += " ";
	}
	return s;
}

void Start()
{
	Debug.Log(Result(Counter(KiyoshiCheck(SafetyLimit(RandomZunDoko(), 1000)))));
}
```

# 結果

![image](https://qiita-image-store.s3.amazonaws.com/0/112019/8fbb848a-bebf-b428-9dee-553772aacc52.png)

# 解説

`RandomZundoko` は `"ズン"` か `"ドコ"` をランダムに無限に返し続ける Enumerator です。Enumerator は実は有限でななくても成り立ちます。

```csharp
IEnumerator<string> RandomZunDoko()
{
	for (;;) {
		yield return Random.Range(0, 2) == 0 ? "ズン" : "ドコ";
	}
}
```

`KiyoshiCheck` は `string` を返す Enumerator `source` を受け取り、その内容を返しつつ、さらにズンドコがいい感じに続いた場合は `"キ・ヨ・シ！"` を返して完了する Enumerator です。

```csharp
IEnumerator<string> KiyoshiCheck(IEnumerator<string> source)
{
	for (;;) {
		Retry:
		for (int i = 0; i < 4; ++i) {
			if (!source.MoveNext()) {
				yield break;
			}
			yield return source.Current;
			if (source.Current != "ズン") {
				goto Retry;
			}
		}
		if (!source.MoveNext()) {
			yield break;
		}
		yield return source.Current;
		if (source.Current != "ドコ") {
			goto Retry;
		}
		break;
	}
	yield return "キ・ヨ・シ！";
}
```

まず最初に 4 回連続ズンのチェックをします。`source` を `MoveNext()` で一個進めて、`Current` で値を取ってきます。とりあえずそれを返します。そして、それが `"ズン"` だった場合はループを続けます。違った場合は、`Retry:` へ戻ります。これによって、最初から 4 連続ズンチェックがやり直されます。無事 `for` ループを抜けると、4 連続ズンが成立しことになり、次へ進みます。

こういうチェックをループでサクッと書けてしまうのは面白いですね。

```csharp
for (int i = 0; i < 4; ++i) {
	if (!source.MoveNext()) {
		yield break;
	}
	yield return source.Current;
	if (source.Current != "ズン") {
		goto Retry;
	}
}
```

同様の原理で、次に `"ドコ"` が続いているかチェックします。

```csharp
if (!source.MoveNext()) {
	yield break;
}
yield return source.Current;
if (source.Current != "ドコ") {
	goto Retry;
}
break;
```

合格すれば、`"キ・ヨ・シ！"` を返して終わります。

```csharp
yield return "キ・ヨ・シ！";
```

ね、簡単でしょう？

順序通りにチェックが書けてしまうのがこのやり方の面白いところですね。今回は無かったですが、分岐が入ったりするとさらに威力を発揮します。皆さんも是非。
パーミッションを変えてしまって ssh でログインできなくなった時

root で

```shell-session
chmod -R 777 /
```

とかやってしまうと、秘密鍵が他のユーザーでも読めてしまうため ssh でログインできなくなってしまいます。

以下のように `-vvv` をつけると、 ssh のログが表示できます。パーミッションの不備の場合は、 `key_load_public: No such file or directory` と表示されたりします。

```sh
ssh -vvv -l username example.com

OpenSSH_7.1p2, OpenSSL 1.0.2d 9 Jul 2015                                        
debug1: Reading configuration data /home/user/.ssh/config           
debug1: Reading configuration data /etc/ssh/ssh_config                          
debug1: Connecting to example.com [xxx.xxx.xxx.xxx] port 22.               
debug1: Connection established.                                                 
debug1: key_load_public: No such file or directory                              
debug1: identity file /home/user/.ssh/id_rsa type -1                                                                      
debug1: key_load_public: No such file or directory                              
debug1: identity file /home/user/.ssh/id_rsa type -1                                                                 
debug1: Enabling compatibility mode for protocol 2.0                            
debug1: Local version string SSH-2.0-OpenSSH_7.1                                
ssh_exchange_identification: Connection closed by remote host            
```

こうなったら、ひとつずつパーミッションを修正していくしかありません。

まず、ホームディレクトリ。 ~/.ssh は 700 中のファイルは 600 が良いでしょう

```
chmod 700 ~/
chmod 700 ~/.ssh
chmod 600 ~/.ssh/*
```

次に /etc/ssh 以下のファイル。ディレクトリは 755、 *_key.pub ファイル は 644、 *_key ファイルは 600 です。ここは root 権限で行います。

```
chmod 755 /etc/ssh
chmod 644 *_key.pub
chmod 600 *_key
```

最後に特権分離用のディレクトリです。ここは world-writable でなければ良いので、 711 などで大丈夫です。 ここも root 権限で行ないます。

```
chmod 711 /var/empty/sshd
```

ちなみに、ここのパーミッションが不備だと、 **/var/empty/sshd must be owned by root and not group or world- writable** とか言われて sshd が起動しません。

ここまでやれば、 ssh でログインできるはずです。
【パズル８】ほとんどのエンジニアには解けるパズル８（Puzzle-M）

ほとんどのエンジニアには解けるパズル８を公開した。
タイトルは「Puzzle-M｣ タイトルのMが何を示しているかは、[サイト](http://challenge-your-limits8.herokuapp.com/)でご確認ください。トップページはこれ。（スマフォはキツい）
<img width="512" alt="20160311124713.png" src="https://qiita-image-store.s3.amazonaws.com/0/108761/0b26607a-4fc0-5ee3-2cc7-e019f4f7c6fd.png">

そう。これはあの映画へのオマージュだ。ハッカーにとって「黒い画面に緑色の文字が降ってくる」といえばもうアレしかない。
公開時刻になったら、パズルの入り口が出て、その中へ入ると意味不明な緑の文字がずらーっと降って来る。その文字羅列の中にある意味を見つけてパズルを解くという、さながらネオになったような気分を満喫していただければ、と。

現在のトップページに降っている緑色の文字はハッシュタグを[#puzzlematrix](https://twitter.com/intent/tweet?hashtags=puzzlematrix)としてTwitterにつぶやかれた内容になっている。これはパズルのネタバレ用の掲示板としてもお使いいただける仕組み。
今回のパズルは映画のテーマにも合わせて少しハッカー的でそれらの知識が無ければ解くのが少し難しいレベルだ。（やたら難しい訳ではない）なので人によっては「訳の分からん緑の文字だけで、さっぱり分からんぞ」となってしまうかもしれない。その場合は時々流れてくるTwitterのつぶやきを眺めていれば、既にパズルを解いたハッカーが投稿したヒントが見つかるかもしれない。
好きなだけハッシュタグ[#puzzlematrix](https://twitter.com/intent/tweet?hashtags=puzzlematrix)を付けてつぶやいていただきたい。内容は本パズルの感想、批評、罵倒、ネタバレでもなんでもOk。あえて注文つけると全角よりも半角カタカナで入力いただいた方が雰囲気合ってるかな、と。

公開直後はヒントが無い状態なので特にトップ１０に入るような方はほぼヒント無しで解くことになる。ただそんな方々だけでなく、いろんな方にも解いていただきたいので、[#puzzlematrix](https://twitter.com/intent/tweet?hashtags=puzzlematrix)の内容が充実するにしたがってパズルが簡単になる仕組みとした。

実はまだトップページだけでパズルの全体まで完成してないのだけど、もう今の時点で大いに満足。こういうのが好きなのだ！！

【パズル８】ほとんどのエンジニアには解けるパズル８（Puzzle-M）
http://challenge-your-limits8.herokuapp.com/

ご興味あればぜひ解きに来てください。

【詳細を書いたブログ】
http://tango-ruby.hatenablog.com/entry/2016/03/11/130040
jQuery.cookie.jsでクッキー名（キー）が内部でencodeURIComponentされている事実

# 現象

ちょっと特殊な状況ですが、
```hoge[fuga]``` というキーに ```1``` が入っているとする

うまく動かない例

```js
console.log($.cookie('hoge[fuga]')); // undefined
```

# なぜ？

```hoge[fuga]``` が、内部で ```encodeURIComponent``` されて 
```hoge%5bfuga%5d```と解釈されてしまっているから。

FYI: [carhart/jquery-cookie - README](https://github.com/carhartl/jquery-cookie#raw)

# 解決策

```$.cookie.raw = true``` を使う

```js
$.cookie.raw = true
console.log($.cookie('hoge[fuga]')); // 1
```

# リンク

- [carhart/jquery-cookie](carhartl/jquery-cookie)


# 個人的な感想

普段あまり意識していなかっただけにハマった…。
初心者から始めるiOS SDK - Core OS Layer Frameworks

# Core OS Layerのフレームワーク一覧
## [Accelerate](https://developer.apple.com/library/ios/documentation/Accelerate/Reference/AccelerateFWRef/)
ベクトル・行列・デジタル信号処理・画像処理のAPI

## [CoreBluetooth](https://developer.apple.com/library/ios/documentation/CoreBluetooth/Reference/CoreBluetooth_Framework/)
BluetoothLEデバイスとの通信

## [ExternalAccessory](https://developer.apple.com/library/ios/documentation/ExternalAccessory/Reference/ExternalAccessoryFrameworkReference/)
Lightning・30ピンコネクタ・Bluetoothで接続した外部デバイスとの通信

## [LocalAuthentication](https://developer.apple.com/library/ios/documentation/LocalAuthentication/Reference/LocalAuthentication_Framework/)
Touch IDなどを使ったローカル認証

## [NetworkExtension](https://developer.apple.com/library/ios/documentation/NetworkExtension/Reference/Network_Extension_Framework_Reference/)
ネットワーク機能のカスタマイズ・拡張

## [Security](https://developer.apple.com/library/ios/documentation/Security/Reference/SecurityFrameworkReference/)
セキュリティ

## [System](https://developer.apple.com/library/ios/navigation/#section=Frameworks&topic=System)
BSD・POSIXの機能提供
Elixirのloggingライブラリlogger_file_backendを見て、改めてLoggerのAPIを眺めてみた

## 1. やりたいこと

Elixirでアプリケーションを実装していて、ロギングをどうするのかな、となりました。
単純にやりたいことは、`Logger`で出力する内容を標準出力ではなく、特定のファイルに書き込みたい、ということだけでした。

[awesome-elixir#logging](https://github.com/h4cc/awesome-elixir#logging)でいいのないかなー、と思ったのですが、最初はシンプルなのがいいな、ということで、以下を利用してみました。

* https://github.com/onkel-dirtus/logger_file_backend

## 2. 使い方

[README.md](https://github.com/onkel-dirtus/logger_file_backend#configuration)にある通り、いたって使い方はシンプルです。

`config/config.exs`にロギングしたいパスを通すだけです。

```config/config.exs
config :logger,
  backends: [{LoggerFileBackend, :info},
             {LoggerFileBackend, :error}]

config :logger, :info,
  path: "/path/to/info.log",
  level: :info

config :logger, :error,
  path: "/path/to/error.log",
  level: :error
```

## 3. どう実装されてるのか

ちょっと気になったので覗いてみました。

https://github.com/onkel-dirtus/logger_file_backend/blob/master/lib/logger_file_backend.ex

ポイントは、[GenEvent](http://elixir-lang.org/docs/stable/elixir/GenEvent.html)を利用して、event_handlerでロギングされた内容をファイル書き込みする、というものでした。

下記抜粋でちょっと割愛しています。

```logger_file_backend.ex
  def handle_event({level, _gl, {Logger, msg, ts, md}}, %{level: min_level} = state) do
    if is_nil(min_level) or Logger.compare_levels(level, min_level) != :lt do
      log_event(level, msg, ts, md, state)
    else
      {:ok, state}
    end
  end


  # helpers

  defp log_event(level, msg, ts, md, %{path: path, io_device: io_device, inode: inode} = state) when is_binary(path) do
    if !is_nil(inode) and inode == inode(path) do
      IO.write(io_device, format_event(level, msg, ts, md, state))
      {:ok, state}
    else
      File.close(io_device)
      log_event(level, msg, ts, md, %{state | io_device: nil, inode: nil})
    end
  end
```


[GenEvent](http://elixir-lang.org/docs/stable/elixir/GenEvent.html)はまだ利用したことがないので、これを機に覚えてみようと思います＾＾

## 4. というかElixir本体のLoggerだけではできないんだっけ？

[Loggerのドキュメント](http://elixir-lang.org/docs/stable/logger/Logger.html)のと、[Loggerのソースコード](https://github.com/elixir-lang/elixir/blob/v1.2.3/lib/logger/lib/logger.ex)を見てみたのですが、そういう機能はなさそうに？見えました。

[Loggerのドキュメント](http://elixir-lang.org/docs/stable/logger/Logger.html)では、developperは`Custom backends`を作成できるよ、とあるので、`GenEvent`でhandleして自前でファイル書き込みとかをすることになるのでしょうか。


と、思いつつもPR, issuesを見てみたら、過去にこの手のPRもあったみたいですが、リジェクトされてますね。。

https://github.com/elixir-lang/elixir/pull/2735

phoenixを利用したアプリケーション等などではどう実装したりしてるのか探してみようと思います。

---

ちょっと調査途中で消化不良ですが本日は以上となります。
UIViewアニメーションをPlaygroundで検証する


```swift

import UIKit
import XCPlayground

let view = UIView(frame: CGRect(x: 0, y: 0, width: 320, height: 580))
view.backgroundColor = UIColor.whiteColor()
XCPShowView("preview", view: view)

let v = UIView(frame: CGRect(x: 0,y: 0,width: 44,height: 44))
v.backgroundColor = UIColor.redColor()
view.addSubview(v)

UIView.animateWithDuration(0.5) { () -> Void in
  v.center = view.center
}

```

XCPlaygroundをインポートするとXCPShowViewで指定したUIViewのアニメーションを検証出来る

<img width="1721" alt="スクリーンショット 2016-03-11 12.39.44.png" src="https://qiita-image-store.s3.amazonaws.com/0/24979/877dfbac-b5c9-8d65-97ad-d4fb9b17c1a5.png">
初心者から始めるiOS SDK - Cocoa Touch Layer Frameworks

# Cocoa Touch Layerのフレームワーク一覧

## AddressBookUI
非推奨 -> Contants・ContactsUIへ

## [ContactsUI](https://developer.apple.com/library/ios/documentation/ContactsUI/Reference/ContactsUI_Framework/)
アドレス帳

## [EventKitUI](https://developer.apple.com/library/ios/documentation/EventKitUI/Reference/EventKitUIFrameworkRef/)
カレンダー

## [MapKit](https://developer.apple.com/library/ios/documentation/MapKit/Reference/MapKit_Framework_Reference/)
地図

## [MessageUI](https://developer.apple.com/library/ios/documentation/MessageUI/Reference/MessageUI_Framework_Reference/)
メール・SMS

## [NotificationCenter](https://developer.apple.com/library/ios/documentation/NotificationCenter/Reference/NotificationCenter_Framework/)
通知センター

## [PhotosUI](https://developer.apple.com/library/ios/documentation/PhotosUI/Reference/PhotosUI_Framework/)
写真

## [ReplayKit](https://developer.apple.com/library/ios/documentation/ReplayKit/Reference/ReplayKit_Collection/)
アプリ画面録画・録音

## Twitter
-> Socialへ

## [UIKit](https://developer.apple.com/library/ios/navigation/#section=Frameworks&topic=UIKit)
UI

## [WatchKit](https://developer.apple.com/library/ios/documentation/WatchKit/Reference/WatchKit_framework/)
Watch app

## [iAd](https://developer.apple.com/library/ios/documentation/UserExperience/Reference/iAd_ReferenceCollection/)
広告
初心者から始めるiOS SDK - iOS Layers

# iOS Layer 一覧
[G's Academy](http://gsacademy.tokyo/)の学生・卒業生によるiOSアプリ開発勉強会の記録
全員初心者からのスタートです。
各自の作りたいアプリに関係することを中心に進めていくので、すべての項目が埋まるとは限りません。

## iOSのLayerとは
複数のレイヤーがあり、上位（浅い）レイヤーが使いやすいインターフェースを、下位（深い）レイヤーが細かいところまで調整できる機能を提供しているらしいです。

[作りたいアプリ・機能を一発逆引き！iOS SDK機能、フレームワーク概要まとめ](https://codeiq.jp/magazine/2014/07/13476/)

勉強の進め方としては、やりたいことを実現できそうな機能を上位レイヤーで探して試してみて、もっと細かいところまで制御したいなど物足りなければ下位レイヤーに進むというのがいいのかもしれません。

## Webkit
公式ドキュメントに従って並べましたが、ここはレイヤーというよりフレームワークかもしれません。
アプリ内でWebページなどを表示するのに使えるみたいです。

[[iOS 8] WebKit Frameworkってなに？](http://dev.classmethod.jp/references/ios8-webkit-intro/)

## Cocoa Touch Layer
アプリの見た目・基本的な機能・マルチタスク・タッチジェスチャー・プッシュ通知・その他様々な機能を提供しているレイヤー

[Cocoa Touch Layer](https://developer.apple.com/library/ios/documentation/Miscellaneous/Conceptual/iPhoneOSTechOverview/iPhoneOSTechnologies/iPhoneOSTechnologies.html)（公式ページ）

詳しくは[Cocoa Touch Layerのフレームワーク一覧](http://qiita.com/shngt/items/dc332497949317024e0e)

## Media Layer
グラフィック・オーディオ・ビデオの機能を提供するレイヤー

[Media Layer](https://developer.apple.com/library/ios/documentation/Miscellaneous/Conceptual/iPhoneOSTechOverview/MediaLayer/MediaLayer.html)（公式ページ）

詳しくは[Media Layerのフレームワーク一覧](http://qiita.com/shngt/items/089e710aa855fd260839)

## Core Services Layer
基本的なシステムサービスを提供するレイヤーで、位置情報・iCloud・ソーシャルメディア・ネットワーク通信の機能も提供
このへんになると説明だけ読んでもよくわかりません

[Core Services Layer](https://developer.apple.com/library/ios/documentation/Miscellaneous/Conceptual/iPhoneOSTechOverview/CoreServicesLayer/CoreServicesLayer.html)（公式ページ）

詳しくは[Core Services Layerのフレームワーク一覧](http://qiita.com/shngt/items/500e4a7e535f35a9a10a)

## Core OS Layer
直接触れることは少なそうですが、普段使うフレームワークが利用する機能を提供するレイヤーで、セキュリティや外部のハードウェアを使用するための機能も提供

[Core OS Layer](https://developer.apple.com/library/ios/documentation/Miscellaneous/Conceptual/iPhoneOSTechOverview/CoreOSLayer/CoreOSLayer.html)（公式ページ）

詳しくは[Core OS Layerのフレームワーク一覧](http://qiita.com/shngt/items/de7f343677cc756e41c9)
fluentdプラグインを作ろうとしたらrake testでエラー出た

#前置き
Rubyとかよくわからないbashishiです。bundle とか rake とかも何が何やらです。
fluentプラグインを作る必要がでてきたのでインターネット上の情報を基に作業を開始しました。

- http://tagomoris.hatenablog.com/entry/20120221/1329815126

#事象
rake test を実行したらエラーになった。
```
MiniTest::Unit::TestCase is now Minitest::Test. From /usr/share/ruby/2.1/test/unit/testcase.rb:8:in `<module:Unit>'
/usr/share/ruby/2.1/test/unit.rb:676:in `<class:Runner>': undefined method `_run_suite' for class `Test::Unit::Runner' (NameError)
```

#原因
参考サイトの手順で設定を行うと最新のMinitestがインストールされるっぽい。
Minitestがバージョン5になり後方互換性がなくなったため、Test::Unit向けのコードでは動かないようだ。
 - http://qiita.com/jnchito/items/ff4f7a23addbd8dbc460#%E3%81%82%E3%82%8Cruby%E6%A8%99%E6%BA%96%E3%81%AE%E3%83%86%E3%82%B9%E3%83%88%E3%83%95%E3%83%AC%E3%83%BC%E3%83%A0%E3%83%AF%E3%83%BC%E3%82%AF%E3%81%A3%E3%81%A6minitest%E3%81%98%E3%82%83%E3%81%AA%E3%81%8B%E3%81%A3%E3%81%9F%E3%81%A3%E3%81%91

#解決方法
バージョン4.x.xのMinitestをインストールする。
gemspecファイルに以下を追加もしくは変更して bundle update を実行する。5.0.0より小さいなら4.x.xの最新でしょ？っていう雑な設定です。
```spec.add_development_dependency "minitest", "< 5.0.0"```

bundle update 終わったら rake test でテスト実行。
```
Finished tests in 0.121391s, 8.2378 tests/s, 0.0000 assertions/s.
1 tests, 0 assertions, 0 failures, 0 errors, 0 skips
```
通った！
スケルトンができました。
[Gemfileに追加→bundle install]と[gem install]の違い

[Gemfileに追加→bundle install]
「アプリに」Gemをインストールするイメージ。
GemとそのGemの実行に必要なモノ(dependencies)をまとめてインストールできる。
後でWebアプリに使いたい場合など、こっちで入れておいたほうが無難。

[gem install Gem名]
「環境に」Gemをインストールするイメージ。

以下、読んだ感じどっちでもいいけれど、
Dependenciesまで持ってきてくれることを考えるとbundle installの方が無難っぽい。

Difference between bundle and gem install?
http://stackoverflow.com/questions/6162047/difference-between-bundle-and-gem-install
centos6でFLIFを試してみた

ロスレス圧縮ソフトのFLIFを、centosに入れて試してみたので、入れ方とか、結果とかをメモっておきます。


# FLIFとは？

pngファイルとかを画質をほぼ落とさずに圧縮できる画像フォーマットです。
pngファイルに比べて40%以上も圧縮可能らしい！

# 公式サイト

http://flif.info

### github
https://github.com/FLIF-hub/FLIF


# インストール

flifのコンパイルにc++11がコンパイル可能なgcc-c++が必要ですが、yumでgcc-c++を落としても4.4.7が最新です。
ということで、この辺を参考に、sclでgcc-c++4.8をインストール

http://abyssluke.hatenablog.com/entry/2014/07/07/202702

終わったら、flifのバイナリをダウンロードします

```bash
$ pwd
/usr/local/src

$ wget https://github.com/FLIF-hub/FLIF/archive/v0.1-alpha.tar.gz

$ tar xvfz v0.1-alpha.tar.gz
```

解凍するとFLIF-0.1-alphaというディレクトリができるので、移動してmake

```bash
$ cd FLIF-0.1-apla

$ make flif
```

これでカレントディレクトリにflifというファイルができます。

公式では、make installすればglobalにインストールされるよと書いてありますが、現状でやると、そんな引数ない！って怒られるので、lnで対応

```bash
$ ln -s /usr/local/src/FLIF-0.1-alpha/flif /usr/loca/bin/flif
```

取り敢えず引数なしで叩いてみる

```bash
$ flif
Usage: (encoding)
   flif [encode options] <input image(s)> <output.flif>
   flif [-d] [decode options] <input.flif> <output.pnm | output.pam | output.png>
General Options:
   -h, --help           show help
   -v, --verbose        increase verbosity (multiple -v for more output)
Encode options:
   -i, --interlace      interlacing (default, except for tiny images)
   -n, --no-interlace   force no interlacing
   -a, --acb            force auto color buckets (ACB)
   -b, --no-acb         force no auto color buckets
   -p, --palette=P      max palette size=P (default: P=512)
   -r, --repeats=N      N repeats for MANIAC learning (default: N=3)
   Input images should be PNG, PNM (PPM,PGM,PBM) or PAM files.
   Multiple input images (for animated FLIF) must have the same dimensions.
   -f, --frame-delay=D  delay between animation frames, in ms (default: D=100)
   -l, --lookback=L     max lookback between frames (default: L=1)
Decode options:
   -q, --quality=Q      lossy decode quality at Q percent (0..100)
   -s, --scale=S        lossy downscaled image at scale 1:S (2,4,8,16)
```

ヘルプがいっぱいでてきました。

取り敢えずインストールはできたようです。

# 試してみる

元はこんな感じの画像ファイル

```bash
$ ls -ltr
合計 24
-rw-r--r--. 1 vagrant vagrant 15645  3月 11 02:38 2016 test.png
```

実行

```
$ flif test.png out.flif
```

結果

```
$ ls -ltr
合計 24
-rw-r--r--. 1 vagrant vagrant 15645  3月 11 02:38 2016 test.png
-rw-rw-r--. 1 vagrant vagrant   295  3月 11 02:49 2016 out.flif
```

がっつり圧縮されてます！

ついでに戻してみます

```
$ flif -d out.flif out2.png

$ ls -ltr
-rw-r--r--. 1 vagrant vagrant 15645  3月 11 02:38 2016 test.png
-rw-rw-r--. 1 vagrant vagrant   295  3月 11 02:49 2016 out.flif
-rw-rw-r--. 1 vagrant vagrant   897  3月 11 02:49 2016 out2.png
```

戻った！
戻しても結構な圧縮度合いですね
！

まだ0.1-alphaなんでどうなるかわかりませんが、結構役立ちそう！
Rで距離行列の生成とクラスター分析（Matrixパッケージ対応）

クラスター分析は

1. 距離行列の生成（類似度行列ではない！）
2. クラスタリングの実行

という流れになる。

それぞれのステップで、採用する

- 距離の種類
- クラスタリングの方法

がチューニング変数となる。
この順に手順を見ていく。


続きを読む
https://www.marketechlabo.com/r-distance-clustering/
テンプレートを使って指定したbranchに向けてコマンドラインからPull Requestを出す

# 1. hubコマンドをインストール
```bash
$ brew install hub
```
# 2. templateを作成
リポジトリのrootディレクトリに置く

```PULL_REQUEST_TEMPLATE.md
### Release Note

### Changes

### How to confirm

### Remarks
```

# 3. .git/configにaliasを追加
```bash:.git/config
[alias]
    pr = "!f () {\
              branch_name=$1;\
              template_path=$(git rev-parse --show-toplevel)/PULL_REQUEST_TEMPLATE.md;\ 
              if [ -z ${branch_name} ]; then\
                  branch_name='master';\
              fi;\
              hub browse -- compare/${branch_name}'...'$(git symbolic-ref --short HEAD)'?'expand=1'&'body=$(cat ${template_path} | perl -pe 'encode_utf8' | perl -pe 's/([^ 0-9a-zA-Z])/\"%\".uc(unpack(\"H2\",$1))/eg' | perl -pe 's/ /+/g');\
          };f"
```

# 4. Pull Requestを出す
**例**

```bash
$ git pr      #masterブランチに向けてpull requestを出す
$ git pr hoge #hogeブランチに向けてpull requestを出す
```

### 参考
http://qiita.com/tos-miyake/items/dcbec2fe610b505ff472
ローカルなのにWe're sorry, but something went wrong.と言われる

railsをローカルで実行した時，特に環境を指定してなくてもdevelopment環境で実行されるはずです．`We're sorry, but something went wrong.`と怒られるはずがないので原因がわかりませんでした．

とりあえず`log/development.log`を覗くと

```
ActionView::Template::Error: :ja is not a valid locale
```

...はい

## 原因
railsで用意してないlocaleを`config/application.rb`に設定していた

```rb

config.i18n.default_locale = :ja

```

##  解決策

`config/locales`以下に`ja.yml`を置く


## 感想
画面に`ActionView::Template::Error: :ja is not a valid locale`って出してくれたら嬉しい...（localeなくても英語で出してほしい）
CakePHP3でChronosを使う

CakePHP3.2で採用されたChronosを使ってみます。
Chronosは日時に関するライブラリです。

参考：
[Cookbook 3.x Chronos](http://book.cakephp.org/3.0/en/chronos.html)
[Cookbook 3.x Date & Time](http://book.cakephp.org/3.0/en/core-libraries/time.html)

今までTimeで書いていたものをChronosで書き換えてみます。

```php
use Cake\I18n\Time;
public function getArticlesByDate($dateStr) {
    $date = Time::parse($dateStr);
    $date->hour(0)->minute(0)->second(0);
    $this->log('getArticlesByDate:' . $date->i18nFormat('yyyy-MM-dd'));
    $endDate = clone $date;
    $endDate->addDay(1);
    $query = $this->Articles->find('all', [
        'conditions' => [
            'created >=' => $date->i18nFormat('yyyy-MM-dd HH:mm:ss'),
            'created <' => $endDate->i18nFormat('yyyy-MM-dd HH:mm:ss'),
        ]
    ]);
    return ['date' => $date->i18nFormat('yyyyMMdd'), 'articles' => $query->all()];
}
```

↑これが

```php
use Cake\Chronos\Chronos;
public function getArticlesByDate($dateStr) {
    $date = Chronos::parse($dateStr);
    $this->log('getArticlesByDate:' . $date->toDateString());
    $endDate = $date->addDay(1);
    $query = $this->Articles->find('all', [
        'conditions' => [
            'created >=' => $date->toDateTimeString(),
            'created <' => $endDate->toDateTimeString(),
        ]
    ]);
    return ['date' => $date->format('Ymd'), 'articles' => $query->all()];
}
```

↑こうなります。
少しすっきりしたかな。

Chronosはimmutable(不変)なオブジェクトなので、`addDay()`とかしても元の値は変わらず、新しいオブジェクトを返します。

あと、時刻無しで日を指定すると、時刻は00:00:00になります。ただしCake\Chronos\DateなどのdateオブジェクトはタイムゾーンがUTCになるので、日付の比較をしたりする場合は注意が必要です。
(【追記・修正】 全部UTCになるのかと思ったのですが、bootstrap.phpでtimezoneを指定してあれば、時間を含むものは指定したtimezoneになっていました。)

formatも`date()`で指定する時の形なのでわかりやすい(私は)ですし、よく使う`Y-m-d`や`Y-m-d H:i:s`はそれぞれ`toDateString()`と`toDateTimeString()`で出せます。

主観だけど、Timeより使いやすいかな〜。