OmniAICreator/Qiita-1.07M huggingface dataset:
Riot@2.0.8 雑感

Riotjs の 2.0.8 がリリースされました。

https://muut.com/riotjs/release-notes.html#2-0-8-em-feb-10-2015-em-

バグフィックスが中心で細かい機能追加もある感じです。

個人的には以前の[記事](http://qiita.com/jgs/items/afa7bca6d4d88812b7e4)でも書いた `<input type='text' />` がバグる問題が修正されたのが大きいです。

```html:test.tag
<sample>
  <form>
    <input type='text' />
    <button>submit</button>
  </form>
</sample>
```

コンパイルすると

```js:tag.js
riot.tag('sample', '<form> <input type=\'text\'> <button>submit</button> </form>', function(opts) {

});
```

以前は `</form>` が2つ出るコンパイラだったんですが改善されました。バグフィックスでいうと `if` の挙動やグローバルの変数(`location` とか)がサポートされたりしました。

CLI では `.tag` の拡張子しかコンパイルされなかったのですが `--ext html` というようなオプションをつけることで任意の拡張子をコンパイルできるようになりました。どこで問題になるのかまだ分かってないんですけど、単純に引数で与えたファイルをコンパイルするんではダメなんですかねえ。

テンプレートの方では、JS 側の変数を埋め込むブラケット(`<p>{ hoge }</p>` こういうやつ)を任意のものに書き換えることができるようになりました。

```js
riot.settings.brackets ='{{ }}'
```

こういう風に設定を書いてやれば

```html
<p>{{ hoge }}</p>
```

と書けるようになりました。全世界の Mastache ファンの皆さん待望(?)の機能かもしれないですね。僕は `{ }` の方がタイプ数が少なくて済むのでデフォルトをそのまま使い続けるとおもいます。

というわけで、バグも直ったし改めておすすめです。拙作の gulp プラグインの[gulp-riot](https://github.com/e-jigsaw/gulp-riot)も既に追従していますので併せてどうぞ。

# 追記(2015/02/12)

issue に上げてある (https://github.com/muut/riotjs/issues/338) んですが、`update` 関数で値を書き換えたときに子コンポーネントへ値が渡るタイミングが遅延するバグが含まってました。html で `<p>{ data }</p>` のような感じで埋めてる場合は遅延せず更新が反映されるのですが、`.on 'update'` でなんか処理したりとか、`<ul each='{ data }'>` のようにループさせたりする処理が遅延します。時間をみつけてコード読んでみてるんですが、どこが原因なのかまだ分かってないです。コンパイラ的な意味では `2.0.8` がいいんですが、ランタイムは `2.0.7` のままの方がよさげです。
HttpURLConnectionを使用するときにはまったこと

#java.io.IOException: stream closed が発生

##AndroidでHTTPを使ったPOST
通常のJAVAでもおそらく同じ症状が出るのではないかと思われる。

通常HttpURLConnectionを使用したPOSTを行う際に以下のような注意点が良く見られました。
(参考サイトは忘れました。すみません。)

・OutputStreamにデータを書き込む前にsetDoOutput(true)を設定する。
・読込を開始する前にOutputStreamをクローズ乃至フラッシュする。
・書き込み後にInputStreamを読みこまないと正常に通信が終了しない。

私が以上の点を踏まえてコードを書いてみたときに
```java:error
java.io.IOException: stream closed
```
が発生。

しばらく見直して、以下の点が原因だとわかった。

* OutputStreamへの書き込みが終了する前に、HttpURLConnection.getInputStream()を呼び出していた。

HttpURLConnectionで使用しているコネクションは1本なので、Streamは1つだけということらしい。
HttpURLConnection.getInputStream()を呼び出した時点で、OutputStreamがクローズされてInputStreamに切り替わっていたので、書き込み処理でエラーが発生していた模様。
ちゃんとした検証はしていないが。

考えてみれば単純で、もったいないことをしてしまった。
[MySQL] AUTO_INCREMENTカラム変更がめんどくさい・・

たとえば、こんなテーブルがあるじゃないですか、このテーブルってidっていうのが、プライマリーキーなのですが

```sql
CREATE TABLE `users` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `seq_id` int(10) unsigned NOT NULL ,
  `name` varchar(50) NOT NULL DEFAULT '',
  PRIMARY KEY (`id`)
)
;
```

これを、こういうふうにseq_idをPRIMARY KEYにして、そいつに、AUTO_INCREMENTをしかけようとしても簡単にいかない・・・あぁ・・

```sql
CREATE TABLE `users` (
  `id` int(10) unsigned NOT NULL ,
  `seq_id` int(10) unsigned NOT NULL NULL AUTO_INCREMENT,
  `name` varchar(50) NOT NULL DEFAULT '',
  PRIMARY KEY (`seq_id`)
)
;
```

流れ的にこういうふうにやるとは思うのですが

まずは、PRIMARY KEY のDROP 

* オートインクリメントが設定されているからダメだってさ

```
ALTER TABLE users DROP PRIMARY KEY ;
>ERROR 1075 (42000): Incorrect table definition; there can be only one auto column and it must be defined as a key
```

なので、結構めんどうな手順を踏みます。それが以下の手順

* オートインクリメントの属性のカラムを変更して、はずす！

```sql
ALTER TABLE users CHANGE COLUMN `id` `id` int(10) unsigned NOT NULL ;
```

* 次に既存のプライマリーキーをドロップする！！

```sql
ALTER TABLE users DROP PRIMARY KEY ;
```

* 新しいカラムにプライマリーキーを設定する

```sql
ALTER TABLE users ADD PRIMARY KEY (seq_id) ;
```

* 新しいカラムの属性を、AUTO_INCREMENTにする

```sql
ALTER TABLE users CHANGE COLUMN `seq_id` `seq_id` int(10) unsigned NOT NULL NULL AUTO_INCREMENT;
```

## ここまでやって、やっと変更ができるようになる！めんどくさい！！

```sql
 CREATE TABLE `users` (
  `id` int(10) unsigned NOT NULL,
  `seq_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(50) NOT NULL DEFAULT '',
  PRIMARY KEY (`seq_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ;
```

・・という、ほぼ愚痴です

## とにかく面倒なので・・

### shell 作ってみました

例えば、該当テーブルが一律idと、seq_idっていうフィールドがあるのだったら、こんなSQL実行すれば、いとも簡単に実行することができます。（動かしてないけど、きっと動くでしょう）

```bash
#!/bin/bash

_schema=test

mysql -vvv -uroot -p << _EOT_ 
  SELECT 
  'USE ${_schema} ; ' ||
  ' ALTER TABLE ' || TABLE_NAME || ' CHANGE COLUMN id id int(10) unsigned NOT NULL ;' ||
  ' ALTER TABLE ' || TABLE_NAME || ' DROP PRIMARY KEY ;' ||
  ' ALTER TABLE ' || TABLE_NAME || ' CHANGE seq_id seq_id  bigint(20) AUTO_INCREMENT ;'
  AS STRSQL  
  FROM 
    information_schema.TABLES
  WHERE
    TABLE_SCHEMA = '${_schema}'
_EOT_


exit 0
```
JSON Schema Core+Hyper spec v4の理解に読んで役に立ったリンク

JSON-Schemaのサンプル見ても何がキーワードでどこまでが何のルールで書かれてんのかわからんかったから、仕様書読んだりした。

この[エントリ](https://brandur.org/elegant-apis)、どう考えても最強の解説記事だった


## リンク集

仕様書を読んでこれは後でまた見るなと思ったところのリンク

- [typeに指定できるものリスト](http://json-schema.org/latest/json-schema-core.html#anchor8)
- [$schemaに指定できるものリスト](http://json-schema.org/latest/json-schema-core.html#anchor23)
- [キーワードidと#のあつかい](http://json-schema.org/latest/json-schema-core.html#anchor27)

併せて読みたいやつだと思ったやつ

- [JSON Reference](http://json-schema.org/latest/json-schema-core.html#json-reference)



ここからHyper Schema
------------------------------------
- [URI Template](http://tools.ietf.org/html/rfc6570)
   - {?hoge,moge} みたいなやつ
- [links.relプロパティ](http://json-schema.org/latest/json-schema-hypermedia.html#anchor27)
    - なんかクソ難しくね
    - hrefとかの基準パスが変わったりするっぽい
    - ちゃんと分かってないと表現したいURLと別のものうみだす


周辺ライブラリ
------------------------------------
公式ページのsoftwareに貼ってあるやつもふくむ

- [orderly](https://github.com/lloyd/orderly)
    - JSON Schema用簡略化言語
    - さらに言語覚えるってどうなんよ、ってきもするけど、JSON Schemaはかなり書くこと多い感じなのでありか


その他の記事
----------------------------------
- [JSON Schema で Web API のスキマを埋めよう](https://speakerdeck.com/co3k/json-schema-de-web-api-falsesukimawomai-meyou)
    - 以下のことが出来るよっていう紹介
        - ドキュメントの更新
        - 出力のバリデーション
        - 入力のバリデーション
- [Schemer](http://redaktor.circinus.uberspace.de/schemer/)
    - GUIでJSON Schema書くやつ wipとのこと
- [JSON SchemaからStatusつきAPI Documentをつくる](http://izumin.hateblo.jp/entry/2015/01/16/235500)
    - こういう細かいとこの確認エントリまじたすかる
 

やりたいこと
--------------------------------
WebAPIのテストとか。テストケースの自動生成とか。
間違えて違うブランチで開発を始めてしまったときに、別のブランチに編集中のソースを移行する方法（git stash）

# 前提
開発の続きをmasterブランチで始めてしまったことに気づいたとき、
今の状態を残したまま他のブランチに切り替えたい
（まだコミットしてないことが前提）

例：

```terminal
$git branch
*master
issue1
```
master:マスターブランチ
issue1:作業ブランチ

# 手順
1. git stash
 コミットしない状態で `$git stash` を実行
　→書きかけのコードが一時的に退避される



2. 開発ブランチに移動する `git checkout issue1`
 新しくブランチを作るのもOK（ex:`git checkout -b 新しいブランチ名`）


3. 退避したコードを適用する
`$git stash apply`で、最後に退避していたコードが適用される

もし既に`git stash`を実行していたら`$git stash list`で確認。

```terminal
$git stash list
stash@{0}: WIP on master: 049d078 added the index file
stash@{1}: WIP on master: c264051... Revert "added file_size"
stash@{2}: WIP on master: 21d80a5... added number to log
```

番号を指定して適用する場合
`$git stash apply stash@{2}`



引用：http://sessan.hatenablog.com/entry/2014/02/06/100935
コンテンツの評価を可視化するWordPressプラグインを作った

## WP One Metric
[WP One Metric](https://wordpress.org/plugins/wp-one-metric/)っていうコンテンツの評価を可視化するWordPressプラグインを作りました。[Github > WP One Metric](https://github.com/horike37/wp-one-metric)
[Webコンテンツの成果を評価するたった1つの指標「One Metric」](http://web-tan.forum.impressrd.jp/e/2015/01/05/19010)の記事に書いてある指標の計算ロジックをそのままWordPressプラグインにしてます。

![スクリーンショット 2015-02-10 16.27.10.png](https://qiita-image-store.s3.amazonaws.com/0/65478/af657b56-2a86-78b9-3e50-f563a07300ee.png)
縦軸が評価指標、横軸が各記事です。縦軸の50を基準に良し悪しの判断の指標とすればよいです。


## 使い方
![スクリーンショット 2015-02-10 16.39.03.png](https://qiita-image-store.s3.amazonaws.com/0/65478/b3b6326f-9eac-f766-cd52-e93b3242d99a.png)
使い方は「設定＞WP One Metric」からGAに関する情報を設定するだけです。
View IDはGoogle Analyticsの「アナリティクス設定 > ビュー設定」にあるビューIDに記載してある数字を入れてください。

そして。「ダッシュボード＞WP One Metric」からAnalyzeボタンを押すと解析が走ってグラフが表示されます。
解析は過去40記事分について実施されます。その後は1日に1回解析が走って自動更新されていく仕組みです。

解析自体は以下の数値を指標として実施しています。
- Google Analyticsのユニークページビュー
- facebookの拡散数
- Twitterでの拡散数

使ってもらってフィードバックもらえると非常に嬉しいです！
ファイルの所有者を現在のユーザーに変更する



### 現在ログオン中のユーザーを確認

whoamiというコマンドで現在のユーザー名が表示される。

```
$ whoami
hogetaro
```

### chownコマンドで所有者変更


fugafileファイルの所有者をhogetaroに変更する。

```
$ sudo chown hogetaro fugafile
```


fugadirディレクトリ以下のファイルすべての所有者をhogetaroにする。

```
$ sudo chown -R hogetaro fugadir
```
nginx+Rails+unicorn 環境下で タイムアウト値を設定

nginx + Rails + unicorn の環境で、レスポンスタイムが最大 120 秒の外部 API を実行した際、
Rails ( nginx ) からはタイムアウト ( 60秒 ) が返ってきているにもかかわらず、
実行された外部 API 側では処理されてしまうという現象が発生したので、タイムアウト値を設定した。

unicorn　側は、外部 API の 120 秒から余裕を持って 150 と設定

```rb:config/unicorn.rb
worker_processes 4
timeout 150
root = File.expand_path(File.dirname(__FILE__) + '/../')

listen      '/tmp/hoge.sock'
pid         '/tmp/hoge.pid'
stderr_path "#{root}/log/unicorn_error.log"
stdout_path "#{root}/log/unicorn.log"
```

`nginx.conf` については、unicorn のタイムアウトから更に余裕を持って 160 とし、
下記ディレクティブを追加

```
proxy_read_timeout    160;
```

これで、アクセスすると、150 秒経つと、unicorn のタイムアウトが発生し、
`502 Bad Gateway` が返ってくる 

ちなみに、nginx 側のタイムアウトの場合は、`504 Gateway Time-out` が返ってくる

後、外部 API 実行する処理の部分にも、TIME_OUT の処理も必要ですね。
Herokuにデプロイ後にinternal server errorでハマった原因

Herokuにデプロイ後に「internal server error」でハマった原因は
dist/server/config/express.jsの35行目

```express.js
app.use(session({
    secret: config.secrets.session,
    resave: true,
    saveUninitialized: true,
    store: new mongoStore({ mongoose_connection: mongoose.connection })  }));
```

を以下のように修正すると解決した。

```express.js
app.use(session({
    secret: config.secrets.session,
    resave: true,
    saveUninitialized: true,
    store: new mongoStore({ db: mongoose.connection.db })
  }));
```

参考サイト
[https://github.com/DaftMonk/generator-angular-fullstack/issues/416](https://github.com/DaftMonk/generator-angular-fullstack/issues/416)
特定ディレクトリ以下を除外し、特定日付より新しいファイルを合算させてみた

もっといい方法教えてください( *´Д⊂ ｸﾞｽﾝ…
MB表示とかyyyy-yyyy間だけ拾う方法とか・・・・


```
# touch -t yyyymmddxxxx.xx ファイル名
# find ./ -name "除外ディレクトリ" -prune -o -print -type f -newer /tmp/dateファイル -printf "%s\n"  |perl -ne '$sum += $_; print "\r$sum"' 
```
kitchen-vagrantでプロビジョニングしたゲストマシンとrsyncで同期する.kitchen.ymlの書き方


- `test-kitchen (1.3.1)`,`kitchen-vagrant (0.15.0)`で確認

```.kitchen.yml
diff --git a/.kitchen.yml b/.kitchen.yml
index 204f7fd..4c733d7 100644
--- a/.kitchen.yml
+++ b/.kitchen.yml
@@ -4,7 +4,7 @@ driver:
     cpus: 2
     memory: 4096
   synced_folders:
-    - ['.', '/path/to']
+    - ['.', '/path/to', 'type: "rsync", rsync__exclude: [".git/", "vendor/"]']
```

- `synced_folders`の設定の3つめの引数の中に`type: "rsync"`のような形で書けます
- さらに同期したくないディレクトリを`rsync__exclude`に指定もできます
- 同期されるのはは`ホスト -> ゲスト`への1方向のみのようです
ランダム文字列を手軽に作る

#アルファベット小文字からランダムに1文字を取得

```rb
[*"a".."z"].sample
```
#ランダム文字列を取得
3文字のランダム文字列

```rb
3.times.inject("") { |str| str.concat([*"a".."z"].sample) }
```
#応用：3文字のひらがなランダム文字列
```rb
3.times.inject("") { |str| str.concat([*"ぁ".."ん"].sample) }
```
#応用2：3文字のひらがな・カタカナランダム文字列
```rb
3.times.inject("") { |str| str.concat([*"ぁ".."ん", *"ァ".."ヴ"].sample) }
```
ひらがなとカタカナをくっつけます。
#おまけ：3文字のロシア語アルファベット小文字ランダム文字列
```rb
3.times.inject("") { |str| str.concat([*"а".."я", "ё"].sample) }
```
[ロシア語アルファベット](http://ja.wikipedia.org/wiki/%E3%83%AD%E3%82%B7%E3%82%A2%E8%AA%9E%E3%82%A2%E3%83%AB%E3%83%95%E3%82%A1%E3%83%99%E3%83%83%E3%83%88)は
> абвгдеёжзийклмнопрстуфхцчшщъыьэюя

の33文字、だそうです。
MySQLでレシート作成

#MySQLのレシート作成

レシートの商品と料金をテーブルに入力し小計、内税、合計を表示させる。

##テーブルの作成
    create table receipt(
    id int(11) not null primary key auto_increment ,
    Product_name varchar(45) ,
    Fee int(11));

#商品名　料金の入力

##入力コマンド

    insert into receipt(id , product_name , Fee)
    values('' , 商品名 , 料金);

##参照レシート
![Selection_014.png](https://qiita-image-store.s3.amazonaws.com/0/59356/b2a38319-d5f1-608e-7f98-037f74beeadf.png)


##テーブルの内容

| id | Product_name | Fee |
----+-----------------------+------
| 6 | せんべい | 300 |
| 7 | ゴボウ | 500 |
| 8 | ラッキョウ | 200 |
| 9 | メガミコビン | 900 |
| 10 | ヨウセイコビン | 900 |
| 11 | アクマコビン | 900 |

![Selection_015.png](https://qiita-image-store.s3.amazonaws.com/0/59356/70533c7e-71aa-638b-5a15-f0ba1bc94969.png)


#表示と合計の計算
消費税率８％でそれぞれ計算する。

税込金額の計算　　sum(Fee)*1.08,0
内税の計算　　　　sum(Fee)*0.08,0)
小計の計算　　　　sum(Fee),0)

##表示コマンド

     select format(sum(Fee)*1.08,0) "税込み合計",
     format(sum(Fee)*0.08,0) "内税",
     format(sum(Fee),0) "小計" from receipt;

##表示結果

| 税込み合計 | 内税 | 小計 |
-----------------+--------+--------
| 3,996 | 296 | 3,700 |

![Selection_016.png](https://qiita-image-store.s3.amazonaws.com/0/59356/a191184f-36bd-1e7d-ddf3-04d166008a8a.png)
node.jsでamazon apiを叩く時にapac.jsで気をつけること。



apac.js(amazonのAPIを簡単に使えるようになるよ!!)
https://github.com/dmcquay/node-apac

けど、そんなにも簡単に行かなかったお話。

apacのドキュメントを見てもらうと以下の様に書かれている。

```javascript
var opHelper = new OperationHelper({
    awsId:     '[YOUR AWS ID HERE]',
    awsSecret: '[YOUR AWS SECRET HERE]',
    assocId:   '[YOUR ASSOCIATE TAG HERE]'
    // xml2jsOptions: an extra, optional, parameter for if you want to pass additional options for the xml2js module. (see https://github.com/Leonidas-from-XIV/node-xml2js#options)
});
```

ここでendPointの指定が可能なんです。
(endPointの指定によって、どこの国の情報を得たいか指定する。)

apacのソースを見ると、defaultのendPointの指定がある。
｢お、日本のendPointだ!じゃあ指定しなくていいやー!!｣
と思って処理をしてたら。

```レスポンスのエラーメッセージ
465610 is not a valid value for BrowseNodeId. Please change this value and retry your request.
```

って延々言われるという。
(465610は、日本の書籍ID)

endPointが上手く反映されないのかなーってUSのBrowseNodeIdを指定したら、ちゃんととれた。

｢なんだ、渡す値は合ってるっぽいじゃん!!｣

で、よくよく見たら、日本のendPointでなく、
ドメインに **com** とありました…。

そらそうですよ…。
日本製でも無いライブラリが日本の情報をデフォルトで取るようになんかなっているわけないんですよ!!

というわけで。

```javascript
var opHelper = new OperationHelper({
    endPoint: 'ecs.amazonaws.jp', //日本のendPointを追記
    awsId:     '[YOUR AWS ID HERE]',
    awsSecret: '[YOUR AWS SECRET HERE]',
    assocId:   '[YOUR ASSOCIATE TAG HERE]'
    // xml2jsOptions: an extra, optional, parameter for if you want to pass additional options for the xml2js module. (see https://github.com/Leonidas-from-XIV/node-xml2js#options)
});
```

#教訓
ソースは、しっかり読め。
scikit-imageで画像を(途中で怒られながらも)Normalized Cutしてみる

![coffee.png](https://qiita-image-store.s3.amazonaws.com/0/44464/4bd08bb9-4665-b16b-501e-28a10c555e85.png)

![plot_ncut_1.png](https://qiita-image-store.s3.amazonaws.com/0/44464/dbefa750-0798-b8b4-8146-8c64e19d66c0.png)

![plot_ncut_2.png](https://qiita-image-store.s3.amazonaws.com/0/44464/6312ef19-79f9-d0e1-b215-634f2a99ba09.png)

http://scikit-image.org/docs/dev/auto_examples/plot_ncut.html

こちらのサイトを参考にscikit-imageを動作テストさせてみた。
pipからインストールさせるとstable版がインストールされてしまうので、
gitから落としてpython setup.py install developするのが良いと思う。

インストールはこちらから。

http://scikit-image.org/docs/dev/install.html

ただ単にcoffeeでやっても仕方ないので、何か手持ちの画像で試してみる。
コードを下記のように書き換えた。

```py
from skimage import graph, data, io, segmentation, color
from matplotlib import pyplot as plt


#img = data.coffee()
img = io.imread('test.jpg')

labels1 = segmentation.slic(img, compactness=30, n_segments=400)
out1 = color.label2rgb(labels1, img, kind='avg')

g = graph.rag_mean_color(img, labels1, mode='similarity')
labels2 = graph.cut_normalized(labels1, g)
out2 = color.label2rgb(labels2, img, kind='avg')

io.imsave('test_out1.png',out1)
io.imsave('test_out2.png',out2)

#plt.figure()
#io.imshow(out1)
#plt.figure()
#io.imshow(out2)
#io.show()
```

さっそく実行してみると・・・

<pre>
‘module’ object has no attibute ‘rag_mean_color’
</pre>

なんだコレ・・・。
しかもググっても解決策っぽいのが無い。

仕方ないのでscikit-imageのコードを見てみよう。
/to-site-packages-path/scikit_image-0.11dev-py2.7-linux-x86_64.egg/skimage/

graphの中をみてみると、\_\_init\_\_.pyにrag_mean_colorが書いてあるものの、肝心のメソッド本体がみっからない。
素直にgithubにあるdoc読んでみると

https://github.com/scikit-image/scikit-image/tree/372ea53cc94bda31edeabfc6443fa73c5b89f3fe/doc/examples

サンプルあるね・・・

<pre>
plot_rag_mean_color.py
</pre>

というファイルに

<pre>
from skimage.future import graph
</pre>

futureパスェ・・・
同じように指定してみる。

```py
from skimage import data, io, segmentation, color
from skimage.future import graph
from matplotlib import pyplot as plt


#img = data.coffee()
img = io.imread('test.jpg')

labels1 = segmentation.slic(img, compactness=30, n_segments=400)
out1 = color.label2rgb(labels1, img, kind='avg')

g = graph.rag_mean_color(img, labels1, mode='similarity')
labels2 = graph.cut_normalized(labels1, g)
out2 = color.label2rgb(labels2, img, kind='avg')

io.imsave('test_out1.png',out1)
io.imsave('test_out2.png',out2)

#plt.figure()
#io.imshow(out1)
#plt.figure()
#io.imshow(out2)
#io.show()
```

無事動作。
iOSアプリの課金検証環境


# 背景

iOSアプリでは、開発中に課金検証可能な環境がいくつかある。
develop版・adhoc版・TestFlight・リリース版(AppStore経由)での違いをメモ。

# 環境まとめ

実際に試してみたまとめ。

|| develop |  adhoc  | TestFlight |     リリース版    |
|:--|:-------:|:-------:|:----------:|:----------:|
|ビルド| Develop | Release | Release | Release |
|環境| sandbox | sandbox | production(?) | production |
|対象| Sandboxテスター | Sandboxテスター | TestFlight ベータ版テスター | 制限なし |
|請求| 無し | 無し | 無し | 有り |

(TestFlightの環境だけ確信が持てるレベルで調査しておらず...sandbox環境とproduction環境ではレシートが異なるのでそこを調べれば分かるはず。)

# 参考

TestFlightで課金テストは出来るのか!! iOSアプリ内課金の購入料と外部テスター配信の審査について
http://bribser.co.jp/blog/testflight/ 


In-App Purchaseプログラミングガイド - Apple Developer
https://developer.apple.com/jp/documentation/StoreKitGuide.pdf
みんなの為のMySQLまとめ（８）

#目的
今回は「test」テーブルの「money」カラムを使って「合計」と「消費税」と「消費税込み合計」を求める練習をしました。
>使用する「test」テーブルの中身↓
![スクリーンショット 2015-02-10 14.41.33.png](https://qiita-image-store.s3.amazonaws.com/0/59354/05939d18-0a0f-516a-963c-9d28b2b81f13.png "スクリーンショット 2015-02-10 14.41.33.png")

##1,「money」の合計を求める。
参考
http://db.yulib.com/mysql/000027.html
合計を求めるMySQL書式は```SUM(列名)```です。
SUM関数は列の合計を求める事ができます。
![kobito.1423547476.711646.png](https://qiita-image-store.s3.amazonaws.com/0/59354/025aba1b-2ad2-0eb0-735e-041e6da42dcf.png "kobito.1423547476.711646.png")

##2,「money」の消費税を求める。
参考
http://db.yulib.com/mysql/000006.html
・消費税を求めるには「money」の合計に今の消費税8%(0.08)を掛けてあげます。
![kobito.1423547937.773098.png](https://qiita-image-store.s3.amazonaws.com/0/59354/957c3259-ddb4-aa87-bb95-bae120af2e33.png "kobito.1423547937.773098.png")

この時に、小数点以下第一位を四捨五入したいと思ったら```FLOOR(数値)``` を使うと奇麗になります。
![kobito.1423548780.671473.png](https://qiita-image-store.s3.amazonaws.com/0/59354/eddd1d85-5745-be09-be9f-37717f729769.png "kobito.1423548780.671473.png")

##3,「money」の消費税込みの合計を求める。
参考
http://db.yulib.com/mysql/000022.html
・消費税込みを求めるには「money」の合計と「money」の消費税を足してあげるだけです。
![kobito.1423549085.828932.png](https://qiita-image-store.s3.amazonaws.com/0/59354/e9c84536-a016-548b-5333-ea3a4fc3fcce.png "kobito.1423549085.828932.png")

・三桁目にカンマを入れて見やすくしてみましょう、三桁目にカンマを入れるには```FORMAT(数値X,数値Y)```を使います。
![kobito.1423549512.629233.png](https://qiita-image-store.s3.amazonaws.com/0/59354/503ed679-7410-0ddc-400b-e87170efa9b6.png "kobito.1423549512.629233.png")
FORMAT関数を使った時、小数点第一位は四捨五入されるので、floor関数を使う必要はありません。
　

最後に「合計」「消費税」「消費税込み合計」を並べて表示して終わります。
![kobito.1423550031.982311.png](https://qiita-image-store.s3.amazonaws.com/0/59354/90ac4ec6-3a46-7877-dd52-a4b365893539.png "kobito.1423550031.982311.png")
![kobito.1423550063.674674.png](https://qiita-image-store.s3.amazonaws.com/0/59354/b67d89c9-5c0f-e64c-7182-46353ffe73a9.png "kobito.1423550063.674674.png")
Ember.Handlebars.helpers.eachでindexを使って何かする方法

以前は```each```のループ内で```@first```とか```@last```を使えたようなのですが、現在（2015年2月10日時点）では使えなくなっています。

indexを取る方法といえばこれしかありません

```html:templates/items.hbs
{{#each item in items}}
  index: {{_view.contentIndex}}
{{/each}}
```

この```_view```とかprivate感バリバリであんまり使いたくないんですけど…。
arrayを回して```link-to```して最後以外はコンマを出力したかったので大分悩みました。

たどり着いた方法はこれです

```html:templates/items.hbs
{{#each item in items}}
  {{link-to item.name 'item' item}}{{unless-last ',' item items}}
{{/each}}
```

```js:helpers/unless-last.js
Ember.Handlebars.helper('unless-last', function(str, item, array) {
  var result = item === array[array.length - 1] ? '' : str;
  return new Ember.Handlebars.SafeString(result);
})
```

出来てみれば案外あっさりでしたが、ハマると怖い。```if```ヘルパーには引数を１つしか渡せないし、ブロックを渡すヘルパーはviewを作らなくちゃいけないので今回の場合はコンマ表示したいだけで大げさな実装です。
この方法を応用すればいろいろ出来そうです。

あー解決してよかった。
fluentd copyプラグイン条件分岐


今更だけど、fluentdで一つのタグ(一部条件マッチする)に対して、条件分岐的に複数のアウトプットを行いたい時に少しはまったのでメモ。
要は、copyプラグインのstore句にタグ条件が書ける事を知ったという話です。

##やりたい事
複数サーバから出てくる一つ一つのイベントに対して、一部マッチする複数のタグ条件で異なる処理を行いたい。
例えば、アクセスログを集めてきて、

①web.a.bというタグのものは、file出力とs3保管
②xweb.a.bというタグのものは、file出力のみ

こんな時、下記のようなフィルタを何も考えずに書くと、#1のファイル出力だけ処理され、#2のs3への処理は行われない。

####個人的にはちょっと忘れがちだけど、fluentdは一つのイベントに対して、先にマッチするものがあると後のmatch句は効かない。。

```
#1
<match *.a.b>
  type file
  path /tmp/aaa
</match>

#2
<match web.a.b>
  type s3
  ・・・
</match>
```



で、そんな時どうするか。

~~下記のように、copyを使ってstoreにマッチングするタグパターンを記述すれば実現出来る。~~　という嘘情報を書いたところ　@tatsu-yam に勘違いを指摘いただいたので修正


```
<match web.a.b>
  type copy
  <store> 
    type file
  </store>
  <store>
    type s3
  </store>
</match>
<match *.a.b>
   type file
</match>
```

~~store句の条件を指定出来ると知らずに、どうフィルタリングしようかとか結構迷ってしまった。~~
もっといい方法あるのかな。。

タグルーティングが冗長になりすぎてかなり長くなるのが悩ましい。。

久々に触ると色々忘れてるなと実感。。
改めて、fluentdはタグの設計が大事だなと思いました。
ipython notebookでRの関数を手軽に使いたい

ipython で Rの関数を使いたいとき%%Rを使うか、

```py:python
import pyper as pr
r = pr.R(use_pandas =True)
```

これだと%%Rよりも変数スコープを気にせず

```py:python
def sample(lambda_target, sample_size):
    return r('rpois(%d, %f)'%(sample_size, lambda_target))
```
こういったpythonのメソッドを作れて便利

しかしこれだと戻り値が

'try({rpois(50, 8.000000)})\n [1]  8  6 11  8 10  9  8 10  5 11  8  4 13 11  4 10  5 14  5  9 11 10  7  9  1\n[26]  8  6 10  4  8 14 13  3  8 13  2  9  6  6  7 11  7  5  6  5  8  7 10  5  8\n'

というRコンソール的な出力の文字列になってしまう。

```py:python
re.sub(r' +',  ',' ,(re.sub(r'\[.+?\]', '', return_str.split(')')[-1].replace('\n','')).strip())).split(",")
#結果はstringなのでキャスト必須
```
なのでこれを毎回かませている

戻り値をもっと使えるような形にするやり方はあるのだろうか。。
スクラム開発まとめ

##**スクラム開発とは**
#### プロダクトバックログ（Product Back Log 以下PBL）
* そのPJに関するエンジニアのtodoが全て入っている
* ユーザーストーリーを集めたものがプロダクトバックログ
* 項目は以下6項目
  * 大カテゴリ（どのページか（URLベース））
  * 誰が（どのユーザーが）
  * 何をする（なんの行動をする機能か）
  * Sprint数（どのSprintにて行う予定のものか）
  * 工数（工数見積もりを予測×1.5倍程度でつける）
  * ステータス
      * Todo:タスク
      * OnGoing：進捗中
      * Inreview：責任者の確認中
      * Done：終了

#### スプリントバックログ（Sprint Back Log　以下SBL）
* 現在のスプリントのtodoが全て入っている
* mtgや面談などの時間も加味してSBLを設計
* その週したいtodoを優先順位高い順に、ベロシティ消化するまで入れる

#### ユーザーストーリー
* 要求仕様を自然言語で分かり易く書いたもの
* 曖昧な言葉はさけて誰でも理解出来る言葉で書く
* PJメンバー全員に通じる会話のための道具であること

#### ユーザーストーリーのひき方
* 上記ルールに従って全部出す
* 工数の見積もりが可能な粒度で分ける
* 互いに独立している（依存関係はなるべく排除）
* 全てのストーリーを長くても半日程度にする

#### ベロシティ
* そのチームで消化可能な工数（/日・チーム or /日・人）

##**スクラム開発のルール**
####開発初め
* PBLを以下2点作成
  1. env.PBL：開発以外のtodoを入れるもの
  2. deb.PBL：ユーザーストーリー（開発todo＝テスト仕様書）を入れるもの
* 各ストーリーにストーリーポイントを当てはめる
　* 開発者皆でやること

####週次
* 1Sprintを1週間とする
* 毎週頭にPBLからSBLにその週のtodoを移動
  * その週したいtodoを優先順位高い順に、ベロシティ消化するまで入れる
    * env.PBL：該当日時の項目をそのまま入れる
    * dev.PBL：ユーザストーリーをある程度のtodoに分解して入れる
* spread sheet運用の場合、上から順番に優先度高く入れて、上から消化する

####日次
* 毎朝エンジニアだけの朝礼で、本日のtodo確認を行う
* 毎朝全体朝礼で、前日までの進捗共有と本日のtodo共有を行う
* バグが出た場合、何を学んだか、何が原因で起きたかを、記載する
* Todo - OnGoing - Inreview - Done のルール
  * 取り組んでいる行を「Ongoing」にして、そこへ自分の名前を記入
  * ひと通り終了したらcommit→pushをして項目を「Inreview」にする
  * 責任者が動作+コードを確認して、ダメならコメント付きで突き返し、okならmergeして、該当する行を「Done」にする

####**その他**
* 初めに書いたSBLはそのままテスト仕様書にする
* 必須項目で出たバグはdoneにせずにバグの理由だけ書いてtodoに戻す
* 追加機能は項目として追加する
* 完成後出てきた軽いバグはバグリストに入れる

####**スクラム開発に関する良記事**

[nanapiでスクラム開発を半年やってみて分かった事まとめ](http://nanapi.co.jp/blog/2013/07/03/nanapi-scrum/)

[スクラムガイドを読む（第２回）](http://iti.hatenablog.jp/entry/2014/09/22/095406)

[SCRUM/アジャイル開発の入門資料を全力でまとめてみた]
(http://morizyun.github.io/blog/scrum-agile-xp-book-review/)

[スプリントのタスクに関するTips29個](http://www.ryuzee.com/contents/blog/3959)

[SCRUMによる実践的アジャイル開発手法（寺本隆彦）](http://www.cyberagent.co.jp/technology/ca_tech/report/8990174.html)

[社内スタートアップによる組織の成長に伴い発生する痛みとその解決策(スクラム＆リーンスタートアップ導入)について](http://www.slideshare.net/i2key/ss-38266796)
MySQLメモ

##設定ファイルの場所を確認
> $ mysql --help | grep my.cnf
                      order of preference, my.cnf, $MYSQL_TCP_PORT,
/etc/my.cnf /etc/mysql/my.cnf /usr/etc/my.cnf ~/.my.cnf

* 設定ファイルの重複について
これらのディレクトリにmy.cnfが存在するとそれが設定ファイルとして読み込まれます。読み込まれる順番は左からとなります。
注意が必要なのは”my.cnf”が複数ある場合は後から読み込まれたファイルで値が上書きされていく点です。
したがって、”my.cnf”を編集したのに内容が反映されていない場合は意図しないディレクトリにmy.cnfが存在し、その値が読み込まれている可能性があります。

* mysqld起動時に引数で”–defaults-file”というオプションで設定ファイルを直接指定することができます。
この場合はそこで指定したファイル以外は読み込まないので、上記のような問題の解決策として有効です。
なお、このオプションは引数の先頭で指定する必要があります。

> $ /etc/init.d/mysql --defaults-file=/etc/mysql/debian.cnf --user=mysql    ○ 正しい引数の指定方法
$ /etc/init.d/mysql --user=mysql --defaults-file=/etc/mysql/debian.cnf    × アンチパターン

* mysqld起動時に”–defaults-file”オプションで直接ファイルを指定することができる
* MySQLの設定ファイルは複数読み込まれることがあり、値が重複した場合は後から読み込んだファイルが優先される
* mysqld起動時に引数で直接指定した値は設定ファイルより優先される

## MySQL インストール
[参考資料](http://changineer.info/server/mysql/mysql_installation_linux.html#MySQL_8211)
認証付きプロキシを強要されるOSXユーザがsquildで幸せになれた話

* 要はsquildに認証をやらせて、ネットワーク設定に登録するプロキシは認証なしにするという話です
    * AppStoreやアップデートなど、認証付きプロキシだと何かと不便するのがOSXというのが私の印象です

### 環境
* OSX

### 作業
##### 0) Homebrewのインストール
* 入れてない方は [公式](http://brew.sh/index_ja.html) からどうぞ
* brew入れるのにもプロキシ設定必要なので環境変数HTTP_PROXY,HTTPS_PROXYなどは適宜設定してやって下さい

##### 1) squidのインストール
* brewがあれば簡単

```
$ brew install squid
```

##### 2) squidの設定
* /usr/local/etc/squid.conf
    * 例として私の設定を当たり障りない形にぼかして晒しておきます

```
$ diff /usr/local/etc/squid.conf{,.default}
74,84d73
< 
< visible_hostname unknown
< hosts_file /etc/hosts
< cache_peer 上位プロキシのIPアドレス parent 上位プロキシのポート番号 icpポート番号 no-query login=プロキシのユーザ名:プロキシのパスワード
< never_direct allow all
< 
< acl hogehoge dstdomain hogehoge.co.jp
< acl fugefuge dstdomain fugefuge.hogehoge.co.jp
< always_direct allow localnet
< always_direct deny fugefuge
< always_direct allow hogehoge
```
* squid.confの書き方については沢山書かれているので詳細は割愛します
* http://www.geocities.jp/gronlijus/skill/other/squid/squid-forward.html などが参考になります

##### 3) squidの起動
```
$ /usr/local/sbin/squid
```

* ログイン時に自動的に起動するようにしておくと便利です
    * システム環境設定>ユーザとグループ>*ユーザ名*>ログイン項目 にsquidを追加

##### 4) ネットワーク設定の変更
* 起動したsquidを システム環境設定>ネットワーク からプロキシに設定します
* デフォルトだと localhost:3128 となるはずです
今何行目? (C-x l)

## count-lines-page

Emacs で、今使っているバッファが全部で何行あって、今何行目かを知りたいときには `M-x count-lines-page` コマンドで調べることができる。このコマンドはデフォルトでは `C-x l` にバインドされているため、今、何行目かを調べたいときには `C-x l` をタイプするだけでよい。

`C-x l` をタイプするとミニバッファに次のように表示される。

```
Page has 3210 lines (274 + 2936)
```

これは、バッファが全 3210 行で、今 274 行目で残り 2936 行あることを示している。

## line-number-mode

モードラインに現在行番号を表示させれば `C-x l` が不要となる。

```el
(line-number-mode 1)
```

これで、常にモードラインに現在行番号が表示される。バッファの全行数を調べたいときには `end-of-buffer` コマンド（デフォルトでは `M->` だったような気がする）などを使って、バッファの終端に移動してからモードラインを見れば確認できる。

これを使えば、わざわざ `C-x l` で `count-lines-page` を呼び出す必要もなくなるので、`count-lines-page` に `C-x l` から立ち退いてもらうことができる。空き地となった `C-x l` には、たとえば、`count-lines-page` と同種の機能である `count-lines-region` をバインドするとよいだろう。このコマンドは、コマンド名から想像できるとおり、リージョン内の行数を数えるものである。加えて、`count-lines-page` には無かった単語数と文字数を数える機能があるので、就活生がお世話になるエントリーシートなど、文字数制限のある文書を作成する際に便利である。
Sensuでスイッチの通信量を取得


研究室でL2スイッチを2台，L3スイッチを1台使っています．
どれもSNMPに対応しているので，[Sensu](http://sensuapp.org)を使って監視してみました．

## 監視スクリプト

Rubyの`gem 'snmp'`を使ってスクリプトを書きました．
対象スイッチ(IPアドレスをカンマ区切り)とSNMPコミュニティを指定して使います．

スイッチを複数指定可能にしたのは，Sensuの設定を簡素にするためです．
スイッチごとにスレッドを作って，マルチスレッドで処理します．

MIB`1.3.6.1.2.1.2.2.1.10`以下に各ポートの起動後の累計通信量があります．
今回はそれらを合計して，秒間の通信総量を取得するようにしました．

```ruby:snmp-traffic-metrics.rb
#!/usr/bin/env ruby

require 'sensu-plugin/metric/cli'
require 'snmp'

class SNMPTrafficMetrics < Sensu::Plugin::Metric::CLI::Graphite
  option :hosts,
    short: '-h HOSTS',
    long: '--hosts HOSTS',
    default: 'localhost,127.0.0.1'

  option :community,
    short: '-c COMMUNITY',
    long: '--community COMMUNITY',
    default: 'public'

  option :sleep,
    long: '--sleep SLEEP',
    proc: proc {|a| a.to_f },
    default: 1

  def get_all_traffic(host, community)
    manager = SNMP::Manager.new host: host, community: community
    i = 1
    traffic = 0

    loop do
      response = manager.get ["1.3.6.1.2.1.2.2.1.10.#{i}"]
      begin
        response.each_varbind { |vb| traffic += vb.value.to_i }
      rescue NoMethodError
        break
      end
      i += 1
    end

    traffic
  end

  def run
    timestamp = Time.now.to_i
    threads = []

    config[:hosts].split(',').each do |host|
      threads << Thread.new do
        net_traffic_before = get_all_traffic(host, config[:community])
        sleep config[:sleep]
        net_traffic_after = get_all_traffic(host, config[:community])

        all_traffic = net_traffic_after - net_traffic_before
        output "#{host}.snmp.all.traffic", all_traffic, timestamp
      end
    end

    threads.each do |thread|
      thread.join
    end

    ok
  end
end
```

## sensu-serverの設定

スイッチ上でsensu-clientは動かせないので，別のホスト上から監視します．
上で書いた通り，カンマで区切って複数スイッチを監視することができます．

スクリプトはsubscription`"snmp"`のホスト上で実行されます．
ここでは，結果のMetricsをElasticsearchに投げています．

```json:/etc/sensu/conf.d/metrics_snmp.json
{
  "checks": {
    "snmp-traffic-metrics": {
      "type": "metric",
      "handlers": [ "elasticsearch_metrics" ],
      "command": "/etc/sensu/plugins/snmp-traffic-metrics.rb -h 192.168.1.1,192.168.11.254",
      "interval": 60,
      "subscribers": [ "snmp" ]
    }
  }
}
```

## Kibanaで可視化

Elasticsearch + Kibanaで可視化してみました．
実験すると大きな通信があるので，すぐ分かりますね．

![switches.png](https://qiita-image-store.s3.amazonaws.com/0/58742/21b9ff56-6028-3c9c-7638-0dd36c2da54e.png "switches.png")
chefspec で libraries で定義した mixin のテストをする

こんな libraries を書いたとする

```ruby:libraries/awesome_mixin.rb
module Awesome
  module Mixin
    def foo
      node['foo']
    end
  end
end

Chef::Recipe.send(:include, Awesome::Mixin)
Chef::Resource.send(:include, Awesome::Mixin)
```

node なんかを使っていなければ[chefspecでlibraries内のメソッドをテストする](http://qiita.com/koemu/items/c6e15be2e107e048b1ae)のやり方で十分なのだが、node を使っている場合は次のようにする

```ruby:spec/spec_helper.rb
require 'chefspec'

def cookbook_root
  File.expand_path("../..", __FILE__)
end

def cookbook_name
  'mycookbook'
end
```

```ruby:spec/libraries/awesome_mixin_spec.rb
require_relative '../spec_helper'
require_relative '../../libraries/awesome_mixin'

describe Awesome::Mixin do
  let(:cookbook_collection) do
    cookbook_version = Chef::CookbookVersion.new(cookbook_name, cookbook_root)
    cookbook_versions = { cookbook_name => cookbook_version }
    Chef::CookbookCollection.new(cookbook_versions)
  end

  let(:events) do
    Chef::EventDispatch::Dispatcher.new
  end

  let(:node) do
    Chef::Node.new.tap {|node|
      node.set['foo'] = 'yay!'
    }
  end

  let(:run_context) do
    run_context = Chef::RunContext.new(node, cookbook_collection, events)
  end

  let(:recipe) do
    Chef::Recipe.new(cookbook_name, "test", run_context)
  end

  it do
    expect(recipe.foo).to eql('yay!')
  end
end
```

長い！！
Active Jobについて


## 非同期処理とは
必ず時間のかかってしまう重い処理もしくは、時間のかかる可能性のある処理を「あとでやる処理リスト」に登録する。

###ざっくり手順
1.非同期で実行したい処理をジョブとして登録
2.ワーカ(ジョブを処理するプログラム)が登録されたジョブを実行
3.(必要であれば)成功、失敗の記録、失敗時のリトライといったジョブ実行の後処理を行う

## 色々ある非同期処理ライブラリ
### Resque
####・特徴
・ジョブを持つキューを複数持てる。
・特定の種類のジョブに優先度をつけることができる。
・ジョブデータの保存場所：Redis
####・ジョブの登録から実行まで
**ジョブの処理を登録**

```ruby:export_user_items.rb
class ExportUserItems
  @queue = :high #ジョブの優先度を設定
  def self.perform(user_id)
    user = User.find_by(id: user_id)
    user.export_items  if user
  end
end
```

**ジョブの実行を登録**

```rb
Resque.enqueue(ExportUserItems, user_id)
```

**ワーカを立ち上げる**

```
QUEUE=* rake resque:work # *と記述すると全てのジョブを実行
```

```
QUEUE=high,low #優先度順に実行
```



### Sidekiq
####・特徴
・スレッド処理により省メモリで実行
・ジョブデータの保存場所：Redis

####・ジョブの登録から実行まで
**ジョブの処理を登録**

```ruby:export_user_items.rb
class ExportUserItems
  include Sidekiq::Worker #Workerモジュールをinclude
  sidekiq_options queue: :high
  
  def perform(user_id)
    user = User.find_by(id: user_id)
    user.export_items if user
  end
end
```

**ジョブの実行**

```rb
ExportUserItems.perform_async(user_id)
```

**ワーカを立ち上げる**

```
bundle exec sidekiq
```

## Rails 4.2から標準搭載となったActive Jobってなんぞや
色々ある非同期ライブラリに対して同じインターフェースを提供するライブラリです。

あくまでアダプター的な役割しか果たさない。
Active Job単体での非同期処理は出来ません。

####サポートしている非同期処理ライブラリ
・Resque
・Sidkiq
・Delayed Job

###

####Active Jobを通してResqueを使用する

```ruby:environment.rb
ActiveJob::Base.queue_adapter = :resque
```

以下のコマンドでJobクラスを作成できます。
`rails g job test`

####ジョブクラスの作成
```ruby:app/jobs/test_job.rb
class TestJob < ActiveJob::Base
  queue_as :default

  def perform(*args)
    # Do something later
  end
end
```

###ジョブの実行登録
`test.perform_later user`
`test.set(wait_until: Date.tomorrow).perform_ later #時間を指定する場合`

###Global ID
Active Jobを使うと以下のように#ActiveRecordのオブジェクトを直接引数に渡すことができます。

```test_job.rb
class TestJob < ActiveJob::Base
  queue_as :default

  def perform(*args)
    # Do something later
  end
end
```

ResqueやSidekiqはジョブ内でレコードオブジェクトを使用する場合、以下のステップを踏みます。
1.idを引数として渡して、Jsonにシリアライズし、Redisに保存。
2.ジョブクラス内で、レコードを取得(find_byなどを使って)

```rb
def self.perform(user_id)
  user = User.find_by(id: user_id)
  user.export_items if user
end
```

Active Jobでは、引数として渡させれたオブジェクトがActive Recordのインスタンスだった場合、Global IDという、モデルオブジェクトを識別するURIに変換し、それをジョブデータとして保存します。

Global IDとは、 **アプリケーション名、モデルのクラス名、idの値** を使い、モデルオブジェクトをグローバルに識別できるURIのことです。

ちなみに、`.to_global_id`メソッドでモデルオブジェクトをGlobal IDに変換することができます。
逆に、Global IDからモデルオブジェクトに変換する場合は、`GlobalID::Locator.locate Global_ID`を実行します。

また、Global IDでは、一定期間を超えると無効になる **Signed Global ID** を生成することも可能です。デフォルトでは1ヶ月後に無効になるように設定されています。
Signed Global IDを生成する場合は、`.to_signed_global_id(expires_in: 期間)`で生成することができます。

###まとめ
・Active Jobを通してResqueやSidekiqなどの非同期処理ライブラリを利用することで、ジョブの登録や実行を共通のインターフェースに統一できるので、書きやすい&可読性も向上。
・Global IDにより、セキュアでかつ効率よくデータを取得できるようになった。
バイナリファイルに特定の文字列が含まれているか確かめる



Android/iOS開発をしていて、特定の成果物の中に対象のメソッドが利用されているかざっくり調べたい時など便利だった。

# やりかた

    $ cat <something_binary> | strings | grep <search_word>

標準入力にbinaryの中身を吐き出し、stringsメソッドで文字列のみを抽出できる。それに grep をかければ、なんとなく調べられる。


## 例: apkに含まれているOpenSSLのバージョンチェック


    $ unzip -p hoge.apk | strings | grep OpenSSL
    ...
    AES part of OpenSSL 1.0.1h 5 Jun 2014
    ...


## 例: .a ファイルで非公開APIを使用しているかチェック


    $ cat library.a | strings | grep failWithError:




stringsコマンドは、考え方次第でいろいろ応用がききそうです。
MySQLでデータをエクスポートする



# 基本

DBまるごとではなく、テーブルだけダンプしたい時

```
$ mysqldump -u user DB名 テーブル名A テーブル名B > dump.sql
```


上記の場合DROP TABLEやCREATE TABLEが同時に作成される。これらが必要ない時は「-t」オプション


```
$ mysqldump -u user -t DB名 テーブル名A テーブル名B > dump.sql
```

これでINSERT文だけとれる



# テーブルの構成情報・スキーマのみ欲しい場合

```
$ mysqldump -u user --no-data DB名 > dump.sql
```

# WHEREで指定したレコードのみダンプしたい
「--where（-w）」オプションを指定すると、whereが使える。指定テーブルだけではレコード数が多すぎて困るという場合や、予め必要なデータだけに絞ってダンプしたい場合に使う。かなり便利。

```
$ mysqldump -u user DB名 --where 'is_delete = 0' > dump.sql
```
C# webBrowserコントロール：invokeScript使用例

■C# webBrowserコントロール：invokeScript使用例

C#コードからwebページ上でjavascriptを実行するメソッド「invokeScript」の例

```csharp

// ●単純にScript実行例
public void invokeScriptExampleSimple()
{
    webBrowser.Document.InvokeScript("$('#target').click();");
}

// ●引数無し実行例（名前空間/オブジェクト内の関数呼び出し）
public void invokeScriptExampleArgNone()
{
    webBrowser.Document.InvokeScript("eval", new object[] { "NameA._NameB.callSample();" });
}

// ●引数有り実行例（ポイントはdataを'で囲んでいる点。data内に"が含まれている場合を考慮している。）
private void invokeScriptExampleArg(string data)
{
    webBrowser.Document.InvokeScript("eval", new object[] { "$('#target').text('" + data + "');" });
}

```


※逆に上記メソッドをjsから呼ぶ場合は以下のように実装する。

```js
window.external.invokeScriptExampleArg(sendData);
```
公開作業などで、WordPressをWebサーバ上でおひっこしする時の話

業務で、WordPressを使って開発していたWebサイトの公開をしたので
その時のおひっこし（または移植）作業まとめ。

SQL文の編集があります。

<h3>０：引越し元から用意するもの</h3>
＜直接アップロードするもの＞
・画像などのコンテンツ
　wp-content/uploads/ 以下に存在する。丸ごとアップでよさそう
・インストールしたプラグイン
　wp-content/plugins/ 配下に存在。デフォルトで入っている
　akismetなどは不要
＜加工作業が必要になる可能性あり＞
・使用するテーマ
　wp-content/themes/ 配下に存在
・DBの中身をダンプしたもの
　※phpMyadminのエクスポートでやる方が良い。

<h3>１：URLなど、引越し先に合わせたデータ修正をする。</h3>
 下記のように、URLなどが変わるはずです。
　引越し元：http://localhost/wpsite/
　引越し先：http://hogefuga.com/wpsite/

　あと、データベースの接頭辞を、引越し先に合わせる必要もあり
 例）　引越し元：wp5_ →　引越し先　wp_
　
　基本的にはテキストエディタやスクリプトで、一気に置換でおk。
　（固有の処理などがあるときを除く）

　DBのダンプ結果のうち、テーブルを作る部分のSQLは
　基本的に不要。
　（WordPressのインストール作業時に、テーブルが生成されるため）

<h3>２：引越し先にWordPressを設置</h3>
　簡単インストールなどを使って設置。
　まっさらなWordPress環境を用意。

<h3>３：引越し先のDBの中身のうち、不要なものを削除</h3>
　ユーザなどは新規に設定し、それ以外は引き継ぐという場合は
　(接頭辞）_users,（接頭辞）_usermeta　以外を全て削除
　極論を言えば、全部（！）

<h3>４：ファイルをアップロード</h3>
　・画像などのコンテンツ、プラグイン、テーマなど使用するものを
　　引越し元の時と同じディレクトリにアップロードする。

<h3>５：記事などのデータを流し込む。</h3>
　インポートするSQL文と２：の実施時に引越し先のDBに設置された
　WordPressの、各テーブルの内容が一致していることを確認した上で

　phpMyAdminのインポート機能などで、ダンプしたデータを流し込む。
　（WordPressのインポート機能でないところがポイント）


余談

DB出力など、データ出力は下記リンクが参考になるかもです。
http://viral-community.com/wordpress/wordpress-backup-5336/
ファイル名をローマ字に変更する

## romaji.bash
引数以下のファイル及びディレクトリを再帰的に探索してローマ字に変更するスクリプトです。
実行には[kakasi](http://kakasi.namazu.org/)が必要です。`apt`や`yum`で各自インストールして下さい。

```bash:romaji.bash
#! /bin/bash
function main () {
for kana in $(find $1 -mindepth 1 -maxdepth 1 -type f);do
local roman=${kana%/*}/$(basename $kana \
| kakasi -Ha -Ka -Ja -Ea -ka -i utf-8 -o utf-8)
mv "$kana" "$roman";done
for kana in $(find $1 -mindepth 1 -maxdepth 1 -type d);do
local roman=${kana%/*}/$(basename $kana \
| kakasi -Ha -Ka -Ja -Ea -ka -i utf-8 -o utf-8)
mv "$kana" "$roman";main "$roman";done
}
main $1 
```

ネタ元( http://ta2gch.hateblo.jp/ )自分のブログです。
Rails で CSV ファイルを View を使って生成する

利用明細、売上系のデータを、CSV でダウンロードする機能が必要になったので、
色々調べて実装した時のメモ。

色々調べると、モデルに `self.to_csv` とクラスメソッド作ってやってるのが多かったんだけど、
「CSV 出力 ( 何の attribute を出力する云々 ) は View の責務だろ！！！！！！」と思い、
Rails4 から View のテンプレートに `.ruby` が使えるようになったので、それを利用して View で出力するように実装。

利用イメージは、下記 URL にアクセスすると、csv のダウンロードが開始するイメージ。

http://hoge.hogehoge.com/sales/:target_month/donwload.csv
`:target_month` はダウンロードする対象の月(YYYYMM)が入る。
  
`routes.rb` には、URL から `:target_month` として、params で受けられるよう記述

```rb:config/routes.rb
Hoge::Application.routes.draw do
  resources :sales, only: [] do
    collection do
      get ':target_month/download', to: 'sales#download'
    end
  end
end
```

```ruby:app/controllers/sales_controller.rb
class SalesController < ApplicationController

  def download
    
    @sales = Sales.target_month(params[:target_month]) # 対象月の売上を取得
  
    respond_to do |format|
      format.html { redirect_to :action => 'download', :format => 'csv' } # .csv がなくアクセスした場合はリダイレクト
      format.csv { render :content_type => 'text/csv' }
    end
  end
end
```

CSV ファイルは、SHIFT-JIS じゃなきゃマズイだろうと思い、NKF で変換かけておく。

```rb:app/views/users/download.csv.ruby
require 'csv' # config/application.rb に書いてもいいけど、こっちにした
require 'nkf'

csv_str = CSV.generate do |csv|
  # I18n で CSV のカラム名を取得
  cols = {
    Sales.human_attribute_name(:id)              => ->(s){ s.id },
    # 'ID'                                       => ->(s){ s.id }, # key をそのまま指定する場合
    Sales.human_attribute_name(:created_at)      => ->(s){ s.created_at },
    Sales.human_attribute_name(:sales_amount)    => ->(s){ s.sales_amount },
    Sales.human_attribute_name(:sales_tax)       => ->(s){ s.sales_tax },
    Sales.human_attribute_name(:sales_sum)       => ->(s){ s.sales_amount + r.sales_tax },
  }

  # header の追加
  csv << cols.keys

  # body の追加
  @sales.each do |sale|
    csv << cols.map{|k, col| col.call(sale) }
  end
end
# 文字コード変換
NKF::nkf('--sjis -Lw', csv_str)
```

もし、関連するモデルから値を取得したい場合も、いつもの記述方で法普通に取得できるのが便利

```
'ユーザー名' => ->(s){ s.user.name },
```
2015/2/10勉強したこと

ドットインストール

YouTubeでジュークボックスを作ろう
http://dotinstall.com/lessons/youtube_jukebox_js

■やった理由
前からyoutube apiを使用したbgm.meとか良いなと思っていたから。
apiを利用して何か作ってみたかったから。

■得た点
5回までやってみてHTMlについてはだいたいわかっていることを再認識できた。
youtubeAPIのさわりをしれた。

■問題点

APIのfeedから情報を情報を取り出すｊｓの書き方が理解できない。

わからないところを飛ばしてそのまま進めようとも思ったが
理解が少ないまま分かった気なるのは良くないと思うので

JSの基礎からまた始めてみよう。
Vagrant + docker内のコンテナとVMホスト間でファイルを共有する

開発環境としてdockerコンテナを使うためにVagrantと組み合わせているんだけど、開発にはIDEなどを使いたいというとき、Vagrantのsynced folder機能とdockerのvolume機能を組み合わせることで、dockerコンテナ内のファイルを共有化してVMのホストからアクセスすることができる。

以下はVagrantでCoreOSのVMを立ち上げて、その中でubuntuイメージを利用した場合なので、適宜記述を読み替えて欲しい。

## 手順

まず、Vagrantfileに以下の記述を行う。

```rb
config.vm.synced_folder "./share", "/home/core/share"
```

これで`vagrant up`すれば、VM内の`/home/core/share`がVMのホストの`./share`にマウントされる。
次にVM=dockerのホスト側で以下のコマンドを実行。

```bash
docker run -v /home/core/share:/home/app/share -t ubuntu /bin/bash
```

これでdockerコンテナの`/home/app/share`がVM=dockerホストの`/home/core/share`にマウントされる。かくして、VMホスト <-> dockerホスト <-> dockerコンテナ間でファイルが共有化され、IntellijでもSourceTreeでも、お好きなGUIツールが使えるようになった（たぶん）。めでたし。
SolrのRandomSortFieldはシード値変更以外でも順番が変わる


RandomSortFieldはダイナミックフィールドに設定するシード値以外に次の場合にも順番が変わります

* ドキュメントが追加されたとき
* ドキュメントが更新されたとき

要は **commitがあってインデックスのversionが上がったとき** です。

# 実装はどうなってるか 
`org.apache.solr.schema.RandomSortField`のソースを読んでみると、

```java
...
  /**
   * Given a field name and an IndexReader, get a random hash seed.
   * Using dynamic fields, you can force the random order to change
   */
  private static int getSeed(String fieldName, AtomicReaderContext context) {
    final DirectoryReader top = (DirectoryReader) ReaderUtil.getTopLevelContext(context).reader();
    // calling getVersion() on a segment will currently give you a null pointer exception, so
    // we use the top-level reader.
    return fieldName.hashCode() + context.docBase + (int)top.getVersion();
  }
...
```

という部分があります。この`top.getVersion()`は **コミットごとに変わる値** です。

>public abstract long getVersion()
>
>Version number when this IndexReader was opened.
>
>This method returns the version recorded in the commit that the reader opened. This version is advanced every time a change is made with IndexWriter.
>
>https://lucene.apache.org/core/4_0_0/core/org/apache/lucene/index/DirectoryReader.html#getVersion()


なので、RandomSortFieldでいうシード値とはフィールド名に指定するものだけではなく、 **フィールド名のハッシュ＋インデックスのバージョン番号** ということになります。



# クソ仕様なの？

はじめてこの仕様をみたときは「ランダムゆーてんならフィールド名で指定したシードだけに依存しろや」と思いましたが、よくよく考えてみると理由は推測できます。

Solrをリアルタイムに頻繁に更新するのではなく、 **定期的なバッチで更新する場合** はこの仕様のほうが便利です。

シード値を変えるにはクライアント側のコードor設定ファイルを変える必要があります。それにいちいち工数をとるより、データを投入したらランダムソートも一緒に更新されたほうがSolrの管理者としては便利でしょう。

自分の感想はSolr開発側の想定する利用シーンに合ってない使い方をした結果だったわけですね。ま、しょうがないね。


FieldTypeは独自に作ることは自由なんだから、 **利用シーンに合わないなら自分でつくりましょう** って結論です。フィールド名のみに依存するRandomSortField、つくってるんで完成したら公開しまーす。

**追記：自作ランダムソートプラグインの使い方を書きました**
[更新が多い運用でも使いやすいSolrのランダムソートプラグインを作りました - Qiita](http://qiita.com/deltam/items/8772a5c082a6ae2fbade)
R データフレーム データ抜き出し

subset関数
subset(元のデータフレーム、select=抜き出す列)

&gt; d0
  Age BW Sex
1  60 66   M
2  70 57   F
3  65 78   F
4  23 88   M
5  66 90   M
6  77 57   M
&gt;subset(d0,select=BW)
  BW
1 66
2 57
3 78
4 88
5 90
6 57
&gt;
Rails で指定日から前月までの月の一覧を生成する

特定の日付から前月までの月の一覧を取得したかった時に、
簡単なやり方ないかなーと調べた時のメモ

### 当初の思いついたやり方

```ruby
target_months = ('2014-02-10'.to_date..Time.zone.now.to_date.prev_month.end_of_month).map { |date| date.strftime("%Y%m") }.uniq
```

このやり方だと、起算日から経過日数分ループがまわるのがなんか気に入らなかったので、
下記のやり方に修正した。
記述は増えたけど、ループの数は、月数分だけになった。

### 修正後のやり方

```ruby
# 変数名はテキトーです。
target_months = []
start_date = '2014-02-10'.to_date
end_date = Time.zone.now.to_date.prev_month.end_of_month

diff_month_count = ( end_date.year * 12 + end_date.month ) - ( start_date.year * 12 + start_date.month ) + 1
diff_month_count.times {|n| target_months << end_date.months_ago(n).strftime('%Y%m') }
```

月の差分を計算して、その分 target_months に突っ込むように変えました。
月の差分でプラス1したのは、`times` の `n` が 0 から始まるので、追加してます。

う〜ん。どっちにしてもスマートじゃない…
icloud.comやme.comやhotmailにメールが届かない時

iCloudの場合下記が原因のことが多いようです。

mail.add_x_headerがONだと届かない模様

vi /etc/php.ini

mail.add_x_header = On
↓ 変更 ↓
mail.add_x_header = Off

/etc/rc.d/init.d/httpd reload

確認

php -i |grep mail.add_x_header
mail.add_x_header => Off => Off

qmailで、icloud.com や me.com や hotmail.com などにメールが届かない時。

/var/log/maillog

に

deferral: CNAME_lookup_failed_temporarily

こんなログが残る。qmailのパッチをあてて、DNSパケットのサイズが大きくても受け取るようにしたら治るらしいのですが、パッチを適用しても、メールがとどかない場合が有ります。

参考URL
http://mocha.exblog.jp/11442682/

本来の使い方ではないと思いますが、その場合にどうにかしてメールを、送信する方法

/var/qmail/control/smtproutes

こちらに下記を追記

nifty.com:smmx.nifty.com
icloud.com:mx1.mail.icloud.com
hotmail.com:mx1.hotmail.com

なぜか届くようになります。
Excel で一人かんばん

１．Excelを起動します
２．B:E列の幅を30程度にします
３．2行目のB:E列に以下のとおり記載します
　　B2:Backlog
　　C3:WorkInProgress
　　D3:UnderReview
　　E3:Done
４．レーンがわかりやすくなるよう、セルに背景色を付けます
５．抱えているタスクを図形として記載します
６．適宜図形を右のほうに移動させます

すっきりー
Unity5 Canvasの中に対してブラーとか使うとき

内容が冗長なので、近日中に更新します。
３のCameraは必要ないです、Canvasに投影するカメラを
写したいカメラにすればOKです。

そのカメラがあるオブジェクトにエフェクト系のコンポーネントを追加してください。
BlurコンポーネントのenabledをOn/OffするだけでBlurがかかったり、かからなかったりします。


ユニティテクノロジージャパンの高橋さんに教えていただきました。

１．まず構成を親側からCamera→Canvas→Image　とする
２．ImageオブジェクトのImageにSpriteをはる
３．ImageオブジェクトにVortexを追加、自動的にCameraが追加されるので
　　CameraのClearFlagをDepthOnlyにする、Depthは必ず１番手前大きい値に設定
４．CanvasオブジェクトのCanvasのRenderModeをScreenSpace-Cameraに変更
５．CanvasオブジェクトのRenderCameraに親オブジェクトのCameraを設定する。
６．できたーーー

**（注）なぜかはわからないがCameraコンポーネントよりも下に
　　　Blur系コンポーネントがいないと設定が反映されない、めっちゃはまった**


下記イメージとファイル

![Image.png](https://qiita-image-store.s3.amazonaws.com/0/17904/c87dc1fa-2925-0f5e-83c8-e810f5fe3c22.png)

![Canvas.png](https://qiita-image-store.s3.amazonaws.com/0/17904/ab95c201-3d55-6099-8cf9-db52364a7b1a.png)

![Camera.png](https://qiita-image-store.s3.amazonaws.com/0/17904/f8b61d18-a682-dad1-cbaa-7020a1945258.png)
力試し：SwiftのOptionalでこれできますか？　に挑戦


[こちら](http://qiita.com/koher/items/627a90017e3d4be1dd5b)に挑戦してみました。
`Optional.map`を使いたかったのでQ3, 4あたりは簡潔かどうかは怪しいですが。。。


```swift:playground
// Playground - noun: a place where people can play

import UIKit

func Q1() {
    
    func ans(a: Int?) -> Int? {
        return a.map { $0 * $0 }
    }
    
    println(ans(2))
    println(ans(nil))
}

func Q2() {
    
    func ans(s: String?) -> Int? {
        return s?.toInt()
    }
    
    println(ans("2"))
    println(ans("a"))
    println(ans(nil))
}

func Q3() {
    
    func safeSqrt(x: Double) -> Double? {
        return x < 0.0 ? nil : sqrt(x)
    }
    
    func ans(x: Double?) -> Double? {
        return x.map(safeSqrt) ?? nil
    }
    
    println(ans(4))
    println(ans(0))
    println(ans(-4))
    println(ans(nil))
}

func Q4() {
    
    func ans(#a: Int?, #b: Int?) -> Int? {
        return a.map { a0 in b.map { b0 in a0 + b0 } } ?? nil
    }
    
    println(ans(a: 1, b: 2))
    println(ans(a: nil, b: 2))
    println(ans(a: 1, b: nil))
    println(ans(a: nil, b: nil))
}

func Q5() {
    
    func ans(a: Int?) {
        a.map(println)
    }
    
    ans(1)
    ans(nil)
    ans(2)
}

println("\nQ1")
Q1()
println("\nQ2")
Q2()
println("\nQ3")
Q3()
println("\nQ4")
Q4()
println("\nQ5")
Q5()
```


```console

Q1
Optional(4)
nil

Q2
Optional(2)
nil
nil

Q3
Optional(2.0)
Optional(0.0)
nil
nil

Q4
Optional(3)
nil
nil
nil

Q5
1
2
```
[bat][ネタ]バッチファイルでハイアンドロー作ってみた

セーブデータも作ってみた
暗号化などはしていない。

rand.batのソースはこちら

[batch - 【バッチ】乱数を取得する【備忘録】 - Qiita](http://qiita.com/koryuohproject/items/e6eb3e484f4d36e4fa4c)

```bat
@echo off
setlocal

if exist savedata_%USERNAME%.bat (call savedata_%USERNAME%.bat) else set COIN=20

if %COIN% LEQ 0 set COIN=20

:ENTRY

echo =============================================
echo YOUR COIN %COIN%
echo =============================================
set /p BET="Choose your bet "
set /a BET="%BET%"

if %BET% LSS 0 goto LAST
if "%BET%" EQU "" goto NOBET
if %BET% EQU 0 goto NOBET
if %BET% LEQ %COIN% goto ROLL

echo ERROR
echo %BET% ^> %COIN%

goto ENTRY

:NOBET

echo BET please. Game end is Less than 0

goto ENTRY


:ROLL

call rand.bat 1 13

set /a SHOW=%ROLL%

call rand.bat 1 13

set /a TGT=%ROLL%

echo =============================================
echo YOUR COIN %COIN%	BET %BET%
echo =============================================
echo high and low
echo %SHOW% ? B
echo high 1 low 0

set /p RET="HI AND LOW ? "

if %SHOW%	==	%TGT%	goto EQ
if %SHOW%	LSS	%TGT%	goto HIGHERTGT
if %SHOW%	GTR	%TGT%	goto HIGHERSHOW

:HIGHERTGT
echo HIGHERTGT
echo %SHOW% ^< %TGT%

if "%RET%" == "1" (goto WIN) else goto LOSE

goto ERROR

:HIGHERSHOW
echo HIGHERSHOW
echo %SHOW% ^< %TGT%

if "%RET%" == "0" (goto WIN) else goto LOSE

goto ERROR

:WIN
echo you win

set /a COIN="%COIN%+%BET%"

goto LAST

:LOSE
echo you lose
set /a COIN="%COIN%-%BET%"
goto LAST

:EQ
echo %SHOW% : %TGT%
echo you win
set /a COIN="%COIN%+%BET%"
goto LAST

:ERROR
echo ERROR

:LAST
set /a BET=0

if %COIN% LEQ 0 goto GAMEOVER
echo ENDGAME?
echo yes == 1
set /p ISEND="END GAME ? > "

if "%ISEND%" EQU "" goto ENTRY
if %ISEND% EQU 1 goto GAMEOVER

goto ENTRY

:GAMEOVER

echo GAMEOVER

echo GAME SAVED

echo set COIN=%COIN% >> savedata_%USERNAME%.cmd

endlocal
```
ORMLiteは、(デフォルトでは)beginTransactionNonExclusive(またはbeginTransactionWithListenerNonExclusive)が実行できない

かなり驚いたのでメモ。

ORMLiteの4.48で確認したが、1年以上更新されていないので、恐らく今後とも同じ仕様だろう。
結論から言うと、**ORMLiteはマルチスレッドでは使わない方がいい。**
ORMLiteはトランザクション管理にTransactionManagerクラスを使用している。
まず、このクラスにはトランザクションの種類を指定するパラメータが存在しない。

そして使用しているコネクションの実態は、AndroidDatabaseConnectionのインスタンスだ。
このクラスの中でtransactionを開始しているのは以下の通りだ。

```lang:java

	public void setAutoCommit(boolean autoCommit) {
		/*
		 * Sqlite does not support auto-commit. The various JDBC drivers seem to implement it with the use of a
		 * transaction. That's what we are doing here.
		 */
		if (autoCommit) {
			if (db.inTransaction()) {
				db.setTransactionSuccessful();
				db.endTransaction();
			}
		} else {
			if (!db.inTransaction()) {
				db.beginTransaction();
			}
		}
	}

	public Savepoint setSavePoint(String name) throws SQLException {
		try {
			db.beginTransaction();
			logger.trace("{}: save-point set with name {}", this, name);
			return new OurSavePoint(name);
		} catch (android.database.SQLException e) {
			throw SqlExceptionUtil.create("problems beginning transaction " + name, e);
		}
	}
```

見ての通り、beginTransactionNonExclusiveやbeginTransactionWithListenerNonExclusiveは存在しない。
そもそも、ライブラリのソース内に一度も出てこない。

これはちょっとまずい。ORMLiteは非同期で動作するのに全く向いていないんじゃないだろうか。
つか、俺の開発どうしよう。