OmniAICreator/Qiita-1.07M huggingface dataset:
vimrc を githubで管理したい

私はWindows7 で Vim を使ってます。主にgvim
最近windows を 再インストールする機会がありまして
環境も新たにしたいなぁと思いまして、
そういえば、githubでdotfilesを管理してる人がいたなぁ
ということで、やってみました。

# Git インストール

http://holypp.hatenablog.com/entry/20110321/1300722152

http://ngyuki.hatenablog.com/entry/2013/01/01/222816

ここらへんを参考にインストール。
私は ssh に putty を使っているので、plink.exeを使う設定に。

# vimrc を github に

http://holypp.hatenablog.com/entry/20110515/1305443997

http://holypp.hatenablog.com/entry/20110516/1305552171

http://teppeis.hatenablog.com/entry/20080705/1215262928

ここらへんを参考に設定

### The server's host key is not cached in the registry なるエラーが出てpushできない

dotfiles へのコミットで認証エラーが続出してなかなかpushができない事態に、そのメモを以下に書きます。

http://blog.recyclebin.jp/archives/2641

ここらへんを参考に解決。putty で一度github.comにログインしないといけなかったみたいです。

### FATAL ERROR: Disconnected: No supported authentication methods available (server sent: publickey) エラーがでて push できない

http://blog.shinichy.com/2012/05/cygwingitgithubssh.html

ここらへんを参考に解決。pageant.exe を起動して、タスクトレイに表示された pageant から Add Key して 秘密鍵を追加してやる必要があるみたいでした。

### reject されて push できない

http://d.hatena.ne.jp/snaka72/20100602/

ここらへんを参考に解決。なんか変に修正してしまってたみたいです。


----

ということで、同じ過ちを起こさないために主に私用の備忘録として残しておきますが、皆さんのお役にも立つ情報であることをお祈りしております。
RSpec で一度定義したスタブを解除する

RSpec で一度定義したスタブをある条件下で解除したい場合は `unstub` を使う。

```rb:Ruby
foo.stub(:bar).with(any_args).and_return(true)
````

のように定義していた場合、

````rb:Ruby
foo.unstub(:bar)
````

で解除する。

参考：
https://www.relishapp.com/rspec/rspec-mocks/docs/method-stubs/stub-on-any-instance-of-a-class
なぜD言語にはSFINAEが無いのか

D言語 Advent Calendar 2013の七日目の記事です。

なんと、D言語にはテンプレートがある一方、 __SFINAEがありません！！__ これについて、多くのC++erの方々が疑問に思うはずです。では、C++でSFINAEを使って実現できることは、D言語ではどのように実現されているのでしょう？

# __traits(compiles)
D言語の[Trait](http://kmonos.net/alang/d/traits.html)には、[compiles](http://kmonos.net/alang/d/traits.html#compiles)なる命令があります。これは、 __意味的に正しい（コンパイルが通る）シンボルや型や式が渡された時、trueを返す__ というものです。文を渡したい時はラムダ式が、宣言を渡したいときには無名クラスnew式が、それぞれイディオム的に使われます。

```d:invalid.d
pragma(msg, __traits(compiles, hoge));
pragma(msg, __traits(compiles, 3[1]));
pragma(msg, __traits(compiles, { const int i = 1; i = 2; }));
pragma(msg, __traits(compiles, new class{ void f(){ return 0; } }()));
pragma(msg, __traits(compiles, new class{ void f(){} void f(){} }()));
```

pragma(msg)は、コンパイル時にメッセージを出力するものです。

```bash:shell
$ dmd -main invalid.d
false
false
false
false
false
```

正しくないコードが渡されると、falseになっていることが分かります。

# テンプレートの制約
テンプレートには、制約と呼ばれる式を付けることが出来ます。制約がtrueになる時のみ、そのテンプレートにマッチします。

```d:constrait.d
import std.stdio;

template abs(int i) if(i >= 0)
{
    enum abs = i;
}

template abs(int i) if(i < 0)
{
    enum abs = -i;
}

void main()
{
    writeln(abs!(-1));
    writeln(abs!(1));
}
```

D言語のテンプレートは、C++で例えるとテンプレート名前空間なので、気をつけてください。さらに、テンプレート内部でテンプレート名と同名のシンボルがあった場合、そのシンボルの指定を省略する必要があります。上のコードの場合、本来は`abs!(-1).abs`と書く場所を、`abs!(-1)`と省略する必要があるというわけです。

```bash:shell
$ rdmd constraint.d
1
1
```

ちゃんとマッチするテンプレートを制御できています。

# 組み合わせる
上の2つの機能を組み合わせると、C++のSFINAEで実現していることが、D言語でも実現できます。例として、引数なしで呼べる関数が渡されたらそれを呼び、そうでなければ適当になにかをするテンプレート関数を作ってみます。

```d:call.d
import std.stdio;

template call(alias func) if(__traits(compiles, func()))
{
    void call()
    {
        func();
    }
}

template call(alias func) if(!__traits(compiles, func()))
{
    void call()
    {
        writeln("cannot call");
    }
}

void func1(int i)
{
    writeln("func1");
}

void func2()
{
    writeln("func2");
}

void main()
{
    call!(func1)();
    call!(func2)();
}
```

上と同様に、`call!(func1).call()`と書く部分を`call!(func1)()`と省略して書く必要があります。

```bash:shell
$ rdmd call.d
cannot call
func2
```

ちゃんと動いています。

# まとめ
まとめると、__traits(compiles)とテンプレート制約を組み合わせて使うと、 __まさにC++のSFINAEのようなことが可能になります！！やった！！！__
windows上でSpiderMonkeyコマンドライン環境を構築

ソースからコンパイルするのではなく、バイナリを落とせばOK。
の筈だったのですが、ちょっとはまったのでメモしておきます。

基本的なやり方はここに書いてあります。
https://developer.mozilla.org/en-US/docs/SpiderMonkey/Introduction_to_the_JavaScript_shell?redirectlocale=en-US&redirectslug=Introduction_to_the_JavaScript_shell

１．http://ftp.mozilla.org/pub/mozilla.org/firefox/nightly/latest-trunk/
から
jsshell-win32.zipまたはjsshell-win64-x86_64.zipをダウンロードする。

２．展開してjs.exeを実行する

でOKの筈だったのですが、こんなメッセージがでます。（28.0a1時点）


> js.exe - システム エラー
> 
> コンピューターに icuin50.dll がないため、プログラムを開始できません。この問題を解決するには、プログラムを再インストールしてみてください。 


icuとはオープンソースの文字コード変換ライブラリなのですが、これが存在しないようです。
icuの本家から落としてもよいのですが、バージョン違いがあるとハマるだけですので以下のようにするのが良いです。

３． 隣にあるfirefox本体をダウンロードし、解凍します
firefox-28.0a1.en-US.win32.zip　または　firefox-28.0a1.en-US.win64-x86_64.zip をダウンロードし、解凍します

４．中にicu*.dllが入っているので、これをjsshellを展開したディレクトリにコピーします。

５．js.exeを実行します。問題がなければプロンプトが表示されます。
```
js>
```
[GroovyとProcessing]正射影投影法

正射影投影法で描画する。
Processing公式のサンプルは立方体を描画している。
今回は動画に沿って三角形を描画する。

動画リスト：[LWJGLのチュートリアル](http://www.youtube.com/playlist?list=PL19F2453814E0E315)
動画は[ココ](http://www.youtube.com/watch?v=8ryJMO6rBT4)

```groovy
package episode015

import processing.core.PApplet

class DisplayTest extends PApplet {

    def void setup() {
        size(640, 480, P3D)
        frameRate(60)
    }

    def void draw() {
        background(0, 0, 0)

        // 正射影投影法
        ortho()
        // (0, 0)を中央へ
        translate(width / 2, height / 2, 0)

        noStroke()
        fill(255, 255, 255)
        triangle(320, 240, -320, 240, 320, -240)
    }

    def static void main(args) {
        PApplet.main('episode015.DisplayTest')
    }
}
```

![grocessingGL015.png](https://qiita-image-store.s3.amazonaws.com/0/17179/230f802f-df89-c848-271b-60aaefaf37c2.png)
Xcode5でカバレッジをJenkinsに表示する

##はじめに
Xcode5になってからか、iOS7になってからかは不明ですが
 .gcdaファイルが出力されなくなったので、カバレッジが出せなくなりました。
ネット上で色々調べたのですが、なかなか上手く行かず試行錯誤したので、自分の環境でやったことをまとめておきます。


##環境
+ Xcode5
+ iOS7


#Xcode側でやったこと

###1.Build Settings から次の設定をする。
・Generate Test Coverage Files を YES にする。
![setting1.jpg](https://qiita-image-store.s3.amazonaws.com/0/1333/9b7a2265-280b-e602-8ffa-2c720ce255bf.jpeg)


・Instrument Program Flow を YES にする。
![setting2.jpg](https://qiita-image-store.s3.amazonaws.com/0/1333/9dce0ec4-1a62-7e72-9d3b-0ea75feefc66.jpeg)


###2.以下のコードを追加

**・AppDelegate に追加**

```objc:AppDelegate.m
#ifdef DEBUG
+ (void)initialize {
    [[NSUserDefaults standardUserDefaults] setValue:@"XCTestLog,GcovTestObserver"
                                             forKey:@"XCTestObserverClass"];
}
#endif

  //途中省略

- (void)applicationWillTerminate:(UIApplication *)application
{
#ifdef DEBUG
    extern void __gcov_flush(void);
    __gcov_flush();
#endif
}
```

**・GcovTestObserver.m をテスト用ターゲットに作成して、以下のコードを追加。**

```objc:GcovTestObserver.m
#import <XCTest/XCTestObserver.h>

@interface GcovTestObserver : XCTestObserver
@end

@implementation GcovTestObserver

- (void) stopObserving
{
    [super stopObserving];
    UIApplication* application = [UIApplication sharedApplication];
    [application.delegate applicationWillTerminate:application];
}

@end
```

と、ここまででテストを実行すると以下の場所に *.gcda が作成されます。
※シミュレータでのテスト終了時に出力されます。

```

/Users/UserName/Library/Developer/Xcode/DerivedData/アプリ名-XXXXXXXX/Build/Intermediates/アプリ名.build/Debug-iphonesimulator/アプリ名.build/Objects-normal/i386
```

Jenkinsでグラフィカルに表示させる必要がない方は、CoverStory等のツールで上のファイルを開いてやればカバレッジを取得することができます。

#Jenkinsでの設定
###まず最初に
* Git や SVNのリポジトリからソースを取得する設定をしてください
* Jenkinsの管理 > プラグインの管理 より 「Jenkins Cobertura Plugin」をインストールしてください

###ビルド設定
ビルド手順の追加 > シェルの実行 を選択して、以下を入力してください。

```
xcodebuild test 
 -scheme "テスト用スキーム名" 
 -sdk iphonesimulator
 -project アプリ名.xcodeproj 
 -configuration Debug 
 -destination "platform=iOS Simulator,name=iPad,OS=7.0" 
 OBJROOT=build 
 SYMROOT=build
```

さらに、シェルの実行を追加します。

```

/usr/local/bin/gcovr -r . --object-directory build/アプリ名.build/Debug-iphonesimulator/アプリ名.build/Objects-normal/i386/ --exclude '.*Tests.*' --exclude '.*ExternalFrameworks.*' --xml > build/coverage.xml
```

###カバレッジレポートの設定
ビルド手順の追加 > Cobertura カバレッジ・レポートの集計 を追加。
Cobertura XMLレポート パターンに以下を入力して下さい。

```

build/coverage.xml
```


最後に、ビルド実行すると下のようなカバレッジが表示されます。
（まだテストケースが殆ど入ってない状態なのでアレですが・・・）

![coverage.png](https://qiita-image-store.s3.amazonaws.com/0/1333/b8fc1dfc-96a4-886a-7375-db78c95e1c1b.png)

#参考にしたサイト
[Generate gcda-files with Xcode5, iOS7 simulator and XCTest](http://stackoverflow.com/questions/19136767/generate-gcda-files-with-xcode5-ios7-simulator-and-xctest)
Adobe AIRでiOS7のUIStatusBarStyleを変更する


この記事は[Adobe AIR Advent Calendar 2013](http://www.adventar.org/calendars/182 "Adobe AIR Advent Calendar 2013") 7日目の記事です。
大したことは書いていませんが、飛び込みで参加せていただきます。

さて、iOS7ではステータスバーが透明になり、コンテンツの上に表示されるようになりました。
そのため、フルスクリーンではないアプリの場合、
コンテンツの背景が明るければデフォルトの黒い文字、明るければUIStatusBarStyleをUIStatusBarStyleLightContentにして白い文字に設定します。

ただ、iOS7のバグ？なのか、ステータスバーの文字色を白にしていても、カメラロールを表示した後は黒い文字に変わってしまいました。

AIRのAPIからステータスバーの設定なんて出来ないよなぁって思ったので（ちゃんとドキュメント探してないですが）、ステータスバーの色を切り替えるANEをつくりました。

ANEとプロジェクト一式ははGithubに公開してあります。
https://github.com/kazutoyo/StatusBarStyleANE

さて、使い方は次のような感じです。

```actionscript3:StatusBarStyle.as
import jp.kazutoyo.ane.StatusBarStyleANE;
if(StatusBarStyleANE.getInstance().isSupported()) {
	StatusBarStyleANE.getInstance().setStatusBarStyle(StatusBarStyleANE.STATUS_BAR_STYLE_LIGHT_CONTENT);
}
```
白い文字にするときはStatusBarStyleANE.STATUS_BAR_STYLE_LIGHT_CONTENT、
黒い文字にするときはStatusBarStyleANE.STATUS_BAR_STYLE_DEFAULTをsetStatusBarStyleに指定します。

これで下の画面のような感じに切り替えができます。
![uistatusbarsample.png](https://qiita-image-store.s3.amazonaws.com/0/8932/85348cb8-0640-319f-4c41-02dacbb2fe63.png "uistatusbarsample.png")

AIRは便利な部分もありますが、OS側のバグやAIRのバグがあるとANEで対応しないといけないことがたびたびあります。
マルチプラットフォームに対応したAIRの宿命なので仕方ないですが、もうちょっとこういう対応が減らないかなーって思ってます。
パーフェクトRuby Advent Calendar 2013(7日目)　　スルメのような本

この記事は[パーフェクトRuby Advent Calendar 2013 - Adventar](http://www.adventar.org/calendars/198) の７日目です。前の日のエントリーは[http://d.hatena.ne.jp/joker1007/20131205/1386261276](http://d.hatena.ne.jp/joker1007/20131205/1386261276)でした。

私自身、本業はプログラマではありません。ですのでド素人から見た、この本のよさを語りたいと思います。

##パーフェクトRubyとの出会い
今年の６月末くらいから趣味でRubyを触り始めました。
`たのしいRuby 第4版`で簡単に全体像を掴んだあと、`メタプログラミングRuby`に挑戦してRubyって自由だなとあらためて思いました。ですが、いざ実用的なソフトを書こうとするとお作法がよく分からなくて、困っていまいました。せっかくRubyをはじめたのだから、`github`でコードの書き方を勉強しようとしても、`Gemfile`とか`Rakefile`とかが、よく分からない状態ですし・・・
そんなときに出会ったのがこの本でした。
他の方も書いておりますが、`Part4　標準添付ライブラリ`と`Part5　実践プログラミング`が実用的ですごく役立っています。

##読み返す度に発見のある本
自論ですが良い本は読み返す度に新たな発見がある本だと思います（その点、この本は噛むほど味のでるスルメのような本だと思います）。
最近読んでいて、へぇと思ったところを何か所か紹介します。

+ 12-5-13 インストールしたgemパッケージを元に戻す(p.435)
`gem pristine <package>`でインストール時点まで戻すことができます。このおかげで`pry`とか仕込んでコードを変えてしまっても大丈夫というわけです。

+ 13-5-5 C APIの情報(p.454)
C言語でRubyの拡張ライブラリを書くときに参考になるサイトが紹介されています。最近少しCの実装を見る機会があったときに重宝しました。なかなかまとまった情報が得にくかったので、助かりました。

+ 14-1-3 Bundler  binstubsオプション(p.464)
`bundle install`したときは`bundle exec`しないといけないのですが、`bundle install`時に`--binstubs`オプションを渡すことで`bundle exec`なしで実行できるようになります。使うかどうかは分かりませんが、こんな機能があったのだなぁと。

知っている方々にとっては当然かもしれない細かな部分って、なかなか勉強しにくかったりするのではないでしょうか。そういったところも上手くフォローしれくれているという印象の一冊です。冬休みにざっと目を通してみると、新しい発見があるかもしれませんよ！
私も全部は読み切れていないので、また冬休みに読んでみようと思います。

次のAdvent Calendarはtachi1982さんです。よろしくお願いします。
カメラプレビューとBitmapの色フォーマット

それぞれ画素データってどう格納されているんだっけ、というメモ。

## カメラプレビュー
カメラプレビューのコールバックである `onPreviewFrame(byte[] data, Camera camera)` の引数 `byte[] data` に入っているデータのフォーマットの話。

これは Android Developers にも記載してあるがデフォルトで NV21、すなわち YVU420 SemiPlanar である。
http://developer.android.com/reference/android/graphics/ImageFormat.html#NV21

なのでプレビューデータを Bitmap クラスにセットして表示しようとする場合、YUV から RGB への変換が必要になる。そもそも YUV が何かとか RGB との変換式とか SemiPlanar って何だとかそういう点はここでは言及しない。

今までそれなりの機種数で試したけど、デフォルトが YVU420 SemiPlanar 以外だった経験はない。カメラまわりは落とし穴が多いけど、ここは変な動きする端末は出てこないと予想している。

なお API level 12 からは YV12、つまり YVU420 Planar も端末がサポートすることが保証されるようになったとのこと。個人的には YVU420 Planar に変更する必要に迫られたことがないので試したことはない。
http://developer.android.com/reference/android/graphics/ImageFormat.html#YV12

## Bitmap クラス
ピクセルデータを直接処理したいときの話。また `Bitmap.Config` で設定できる色フォーマットはいくつかあるけど `ARGB_8888` の場合。

### Java 層
これは int の上位から A->R->G->B。文字通りでOK。

### Native 層
Froyo 以降では `android/bitmap.h` を include して Bitmap オブジェクトに対して `AndroidBitmap_lockPixels()` すればピクセルデータを取得して直接処理できる。が、このときの順序が上位から実は R->G->B->A になっている。実際、bitmap.h を読めば分かるが

```cpp:bitmap.h
enum AndroidBitmapFormat {
    ANDROID_BITMAP_FORMAT_NONE      = 0,
    ANDROID_BITMAP_FORMAT_RGBA_8888 = 1,
    ANDROID_BITMAP_FORMAT_RGB_565   = 4,
    ANDROID_BITMAP_FORMAT_RGBA_4444 = 7,
    ANDROID_BITMAP_FORMAT_A_8       = 8,
};
```

と定数の名前自体もそう定義してある。

エンディアンの影響という変わり方には見えないので、Skia ライブラリ（OS ソースコードでいう /external/skia 以下）で色の順序変化が発生していると予想している。が、Skia のコード量はそれなりにあるのでさらっと目を通した程度では当該箇所を見つけることはできなかった。

とりあえず Bitmap を Native 層でいじりたいときは要注意。
Ngramのサイズに応じたMroonga/Groongaの全文検索性能について

# はじめに

Mroonga/Groongaでは、トークナイザにより文章が分割されて、分割されたトークン（語句）で転置インデックスが作成されます。
Mroonga/Groongaでは、様々な環境に柔軟に対応できるよう、多数の[トークナイザ](http://mroonga.org/ja/docs/userguide/storage.html#how-to-specify-the-parser-for-full-text-search)が用意されています。
Ngramトークナイザは、文章の意味合いを考慮せず文字列的に漏れの少ない検索を行うことができます。
Mecabトークナイザは、文章の意味合いを考慮して意味的なノイズの少ない検索を行うことができます。
トークナイザの種別に応じて、分割ルールが異なり、転置インデックスの語句のサイズや、種別数および出現回数が異なってきます。
Ngramトークナイザでは、Nのサイズが大きくなればなるほど、転置インデックスの語句のユニーク性が増し、転置インデックスの語句の種別が増え、語句ごとの出現回数が減ります。
そこで、NgramのNのサイズを1～5まで変化させてみて、転置インデックスの語句の種別数、出現回数、および全文検索の性能がどのように変化するかを実験してみます。

[続きを読む](http://createfield.com/Ngram%E3%81%AE%E3%82%B5%E3%82%A4%E3%82%BA%E3%81%AB%E5%BF%9C%E3%81%98%E3%81%9FMroonga/Groonga%E3%81%AE%E5%85%A8%E6%96%87%E6%A4%9C%E7%B4%A2%E6%80%A7%E8%83%BD%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6 "Ngramのサイズに応じたMroonga/Groongaの全文検索性能について")
QueryBuilderなどのqueryを確認する

テンプレートに埋め込みます

```js:
    var queries = {{json_encode(DB::getQueryLog())}};
    console.log('/****************************** Database Queries ******************************/');
    $.each(queries, function(id, query) {
        console.log('   ' + query.time + ' | ' + query.query + ' | ' + query.bindings[0]);
    });
    console.log('/****************************** End Queries ***********************************/');
```

使用するときは、開発環境のみにしましょう
##本番環境では絶対に使用しないこと！
*要jquery
Ruby で行列演算するなら NMatrix を使った方が 100 倍速い

釣りっぽいタイトルをつけてみました

今回使用したファイルや詳細な情報は Github に公開しているので興味のある方はご覧ください

[catatsuy/ruby_matrix_bench](https://github.com/catatsuy/ruby_matrix_bench)

Ruby で行列演算をしたくなることがあると思います
Ruby の場合は標準で `matrix` ライブラリが用意されているのでこれを使うことが多いと思います

しかし `matrix` ライブラリは pure ruby 実装で逆行列なども私が見た限りは普通に掃き出し法によって実装されているようです
掃き出し法は大学一年生レベルの知識ですし，理論も実装も大して難しくないですが，ひたすら for 文を回していくことになるので LL だと遅い気がします

私が調べた限りは PHP には C 拡張による行列演算ライブラリ存在しないようですが（もしあるなら教えて欲しいです），Ruby には C 拡張を使用した gem がいくつか公開されているようです
その中で現在でも活発に開発が進めている `NMatrix` がとても良さそうな気配がします

[SciRuby/nmatrix](https://github.com/SciRuby/nmatrix)

ということでベンチマークをとってみました

試す演算は 28x28 次元の正方行列の逆行列を求めて，その後ベクトルと掛けるものです
入力値である行列は事前に用意した乱数に基づいて生成します
極力正確な値を取るために入力値を 42837 個準備しました

以下にベンチマークの ruby ファイルの一部を上げます

```ruby:bench.rb
Benchmark.bm do |x|
  x.report do
    cc_n_a.each.with_index do |cc_n, index|
      cc_n.invert.dot NMatrix.new([term, 1], cs[index])
    end
  end
  x.report do
    cc_a.each.with_index do |cc, index|
      Matrix.rows(cc).inv * Vector.elements(cs[index])
    end
  end
end
```

上が `NMatrix` で下が `matrix` です

これを 3 回実行したときの結果です

    % bundle exec ruby bench.rb
           user     system      total        real
       6.460000   0.070000   6.530000 (  6.982642)
     666.870000   1.180000 668.050000 (694.251381)

    % bundle exec ruby bench.rb
           user     system      total        real
       6.540000   0.090000   6.630000 (  6.942445)
     683.680000   6.830000 690.510000 (786.069864)

    % bundle exec ruby bench.rb
           user     system      total        real
       7.070000   0.060000   7.130000 (  7.923331)
     667.280000   1.500000 668.780000 (700.111114)


約 100 倍ほど実行時間に差があります

ということで `NMatrix` をおすすめしたいですが，残念ながら `NMatrix` は依存パッケージがあったり，環境変数を通さなければいけなかったりとインストールが少々面倒です
詳しくは公式のドキュメントをお読みください

[Installation · SciRuby/nmatrix Wiki](https://github.com/SciRuby/nmatrix/wiki/Installation)

今回は特殊なケースなので完全なる公平なベンチマークではないので，参考程度にどうぞ
Laravel4でページネーションとbootsrap3への対応

PHPフレームワークのLaravelにはあらかじめ、
ページネーションの機能が備わっているので簡単に使用する事ができます。
ただ、僕のインストールした段階では、
bootstrap3に対応していなかったので、少しハマったので、
その部分を合わせて説明したいと思います。

##Viewにページネーションの値を渡す

今回は、routes.phpにからViewに渡してみます。
※DBの設定はあらかじめconfig/datebase.phpで行っておいてください。
※テンプレートエンジンでbladeを使用しています。

```php:routes.php
//対象のURLはhttp//:hoge.com/testsとします。
Route::get('tests', function()
{
    $data = DB::table('カラム名') -> paginate(1ページに表示したいデータ数：int型);
    //並び替えをしたい場合はorederByを使用する。
    $data = DB::table('カラム名') -> orderBy('列名', 'descもしくはasc') ->paginate(1ページに表示したいデータ数：int型);
    //例
    $data = DB::table('user') -> orderBy('id', 'desc') ->paginate(20);

    //viewファイルはtest.blade.php
    return View::make('test',array('data' => $data));
})
```

view側

```php:test.blade.php
@foreach ($data as $value)
   //データを表示するコードを書く
@endforeach

//ページネーションを表示したい場所で
{{$data->links()}};
```


##bootstrap3に対応していない場合

上記の手順でページネーションの機能が実装されますが、
表示が崩れている場合、bootstrap3に対応していない場合があります。

その場合は、/app/config/view.phpを書き換えます。

```php:/app/config/view.php
   'pagination' => 'pagination::slider-3',
```

これで、bootstrap3に対応することができます。
grunt watch で変更したファイルに関連するテストだけ実行する

たとえば、 `app/models/hoge.coffee` を編集したときに、 `test/app/models/hoge_test.coffee` だけ、テストを実行したいときってありますよね。自分は以下のような感じでやっています。

Gruntfile.coffee

~~~coffeescript
module.exports = (grunt) ->
  grunt.initConfig
    pkg: '<json:package.json>'

    mochacli:
      options:
        timeout: 3000
        ui: 'bdd'
        reporter: 'spec'
        compilers: ['coffee:coffee-script']
      app:
        src: 'test/app/**/*_test.coffee'

    watch:
      test:
        options:
          spawn: false
        files: [
          'app/**/*.coffee'
          'test/app/**/*.coffee'
        ]

  grunt.loadTasks 'tasks'
  grunt.loadNpmTasks 'grunt-mocha-cli'
  grunt.loadNpmTasks 'grunt-contrib-watch'
~~~

tasks/watch-test.coffee

~~~coffeescript
fs = require 'fs'
_ = require 'lodash'

module.exports = (grunt) ->
  lastModified = 0

  runAllTests = _.throttle ->
    grunt.task.run 'mochacli:app'
  , 30000

  grunt.event.on 'watch', _.throttle((action, filepath, target) ->
    return unless target is 'test'

    currentTime = new Date().getTime()
    if currentTime - lastModified < 2000
      runAllTests()
      return
    lastModified = currentTime

    if _.startsWith(filepath, 'app')
      testpath = 'test/' + filepath.replace(/\.coffee$/, '_test.coffee')
    else
      testpath = filepath
    return unless fs.existsSync(testpath)

    grunt.config 'mochacli.changed.src', testpath
    grunt.task.run 'mochacli:changed'
  ), 200
~~~

短い間隔でファイルを更新すると、テスト全実行されたり、Git で branch を切り替えたりしたときに、たくさんテストが実行されないように、_.throttle で実行間隔を絞ってるのがポイントです。
【Mac】Google Chromeでローカルファイル参照時のエラー回避

Google ChromeでJSONなどのローカルなデータを読み込もうとするとエラーが表示されます。

```
Failed to load resource: No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'null' is therefore not allowed access. 
```

ターミナル.appから以下のようにchromeを起動すると良いです。

```
open -a /Applications/Google\ Chrome.app --args -allow-file-access-from-files index.html
```

今後起動しやすいように.bash_profileに以下の記述をしました。

```
alias google_chrome_dev="open -a /Applications/Google\ Chrome.app --args -allow-file-access-from-files"
```

これで、`$ google_chrome_dev`と起動するとエラーが出ない状態のChromeが立ち上がります。
JSONを用いたアプリケーションの開発等で役にたつことでしょう。
railsアップをproduction serverでデプロイしたら、 ActionController::RoutingError (No route matches [GET] "/"):

すげー悩んだけど、publicにindex.htlml置いたら解決した。

http://qiita.com/seltzer/items/d52a31c558a30c857a3f
とか
qa itに質問したりしたけど、たいした問題じゃなかったの巻
ただ、こんな対応でいいのかちょっと不明ww
第16回オフラインリアルタイムどう書く 不完全です ruby

解答までたどり着いていません（悲）。

```hena16line.rb
# 18:27まで
# 入力値と正解値
input2result = {
"060276724276"=>"6,2,1,1,0,1",
"770175454177"=>"2,3,0,3,1,0",
"743733377170"=>"9,3,1,0,0,0",
}

input2result.each { |input, answer|
  #puts input + "---" + answer
  in8 = input.unpack("a2" * (input.length/2)) # 2文字ごとに分ける
  #p in8
  
  in2_array = Array.new
  
  in8.each { |in8part, index|
    in2 = "%08b" % (in8part.to_i(8))  
    #puts in2
    in2_array.push(in2.split(//))
  }  
#  p in2_array
  
  line = Array.new(6, 0).map{Array.new(5,0)}
  
  for tate in 0..5
    for yoko in 0..4
      if(in2_array[tate][yoko + 2] != in2_array[tate][yoko + 2 + 1])
        line[tate][yoko] = 1
      end      
    end
    p line[tate] # 縦の線分の表示
  end
  
  # 縦線の長さによる分類分け
  # 横線も同じようにする

  output = "6,2,1,1,0,1"
  
  # 結果と解答の確認
  if output == answer
    res = 'OK'
  else
    res = 'mismath!!!!!!!!!!!'
  end
  
  puts input + "=>" + output + " " + res
}
```

最後まで出来ませんでした。
時間がもっとあっても解けなかったかもしれません。
どうやれば導けるか手順が思いつかなかったです。

無念。
第16回オフラインリアルタイムどう書く rubyで解く(未完)

全然間に合いませんでした...

時間内に書いたところまで。

```rb
class LineCounter
  attr_reader :field

  def initialize(input)
    @field = build_field(input)
  end

  def v_edge_field
    target = field.transpose

    before = [[nil] * target.first.count, *target[0..-2]]
    after  = [*target[1..-1], [nil] * target.first.count]

    ans = []

    before.zip(target, after).each do |b_r, t_r, a_r|
      ans << []

      b_r.zip(t_r, a_r).each do |b, t, a|
        if (b == 0 || a == 0) && t == 1
          ans.last << 1
        else
          ans.last << 0
        end
      end
    end

    ans.transpose
  end

  private

  def build_field(input)
    f = input.each_char.map {|c| '%03d' % c.to_i(8).to_s(2) }.join
    f = f.split('').each_slice(6).to_a
    f.map {|row| row.map(&:to_i) }
  end
end
```

```rb
require 'spec_helper'

describe LineCounter do
  describe '#count_lines' do
    subject { described_class.new(input).count_lines }

    context do
      let(:input) { '060276724276' }

      it { should eq '6,2,1,1,0,1' }
    end
  end

  describe '#field' do
    subject { described_class.new(input).field }

    context do
      let(:input) { '060276724276' }

      it {
        should eq(
          [[0, 0, 0, 1, 1, 0],
           [0, 0, 0, 0, 1, 0],
           [1, 1, 1, 1, 1, 0],
           [1, 1, 1, 0, 1, 0],
           [1, 0, 0, 0, 1, 0],
           [1, 1, 1, 1, 1, 0]]
        )
      }
    end
  end

  describe '#v_edge_field', :focus do
    subject { described_class.new(input).v_edge_field }

    context do
      let(:input) { '060276724276' }

      it {
        should eq(
          [[0, 0, 1, 0, 1],
           [0, 0, 0, 1, 1],
           [0, 0, 0, 0, 1],
           [0, 0, 1, 1, 1],
           [1, 0, 0, 1, 1],
           [0, 0, 0, 0, 1]]
        )
      }
    end
  end
end
```
第16回オフラインリアルタイムどう書く rubyで解く

問題はこちらのリンクから。
http://qiita.com/Nabetani/items/6a9f5593d0f3d7e0568c

```rb
def count_line(bd)
  ct = [0]*6

  lines = []
  5.times{|y|
    w = Array.new(5,false)
    6.times{|x|
      w[x] = true  unless bd[y][x] == bd[y+1][x]
    }
    lines << w
  }

  lines.each{|row|
    c = 0
    row.each{|cell|
      if cell
        c += 1
      else
        if c > 0
          ct[c-1] += 1
          c = 0
        end
      end
    }
    ct[c-1] += 1 if c > 0
  }
  ct
end

def solve(q)
  bd = q.scan(/../).map{|e| e.to_i(8)}.map{|e| ("%06b"%e).split('')}

  h_line_count = count_line(bd)
  v_line_count = count_line(bd.transpose)

  h_line_count.zip(v_line_count).map{|c1,c2| c1 + c2}.join(',')
end

DATA.readlines.each do |line|
  no,q,a,d = line.chop.split(/\s+/)
  ans = solve(q)
  print no + "\t" + ans
  puts ans == a ? ' o' : ' x'
end
__END__
0	060276724276	6,2,1,1,0,1	
1	770175454177	2,3,0,3,1,0	
2	743733377170	9,3,1,0,0,0	
3	724212121273	5,2,1,1,1,1	
```
第16回オフラインリアルタイムどう書く rubyで


オフラインでリアルタイムに「どう書く」をやるイベント( http://atnd.org/events/45016 )の、実装。

問題は「境界線分」という名前で、詳細は
http://nabetani.sakura.ne.jp/hena/ord16boseg/
です。

他の方の解答は

http://qiita.com/Nabetani/items/6a9f5593d0f3d7e0568c

から辿れると思います。

```ruby
#!ruby
#tested with "ruby 2.0.0p247 (2013-06-27 revision 41674) [x86_64-darwin12.4.0]"

def horz_segments( val )
  vh = val ^ ( val>>6 )
  ("%030b" % (vh & 0o7777777777))
    .chars
    .each_slice(6)
    .map{ |s| s.join.scan( /1+/ ).map{ |e| e.size } }
    .flatten
end

def flip_xy( val )
  ( "%036b" % val ).chars.each_slice(6).to_a.transpose.flatten.join.to_i(2)
end

def solve( src )
  val = src.to_i(8)
  r=horz_segments( val ) + horz_segments( flip_xy( val ) )
  (1..6).map{ |x| r.count(x) }.join(",")
end

DATA.map{ |line|
  num, src, expected = line.split( /\s+/ )
  actual = solve( src )
  ok = actual == expected
  puts [ (ok ? nil : "***NG***" ), src, actual, ( ok ? nil : expected ) ].compact.join("  ")
  ok
}.all?.tap{ |x| puts( x ? "succeeded." : "***FAIL***" ) }

__END__
0 060276724276  6,2,1,1,0,1 
1 770175454177  2,3,0,3,1,0 
```

いつも通り、テストデータの大半は省略。

問題制作のために最初に書いた実装。

会場では C++ での実装を試みたんだけど、20分では書けなかった。
悔しい。

上の行と xor を取ると、境界線が 1 になる。2進数36桁にしてから6桁ずつに分割し、1の連なりを抽出。連なりの長さを集める。
というもの。

それだけだと縦の線分が収集できない。
というわけで、transpose で向きを変えてもう一回。

ruby便利。
gnuwin32のsedコマンド使用時に半角記号や文字コードで気をつけること

gnuwin32のsedコマンドを使ってみて、少し実用的に使ってみとうかと思ったら、半角記号のエスケープ方法や、文字コードの扱いに、気をつけなければならないことがあったので、メモしておきます。

#単純な変換
単純な変換は次のようにできすね。
※変数「%infile%」「%outfile%」には、ファイル名が定義されていることとします。

```bat:sed_sample001.bat
sed s/abc/ABC/g %infile% > %outfile%
sed s/朝/昼/g %infile% > %outfile%
```

複数まとめて変換したいときは、次ですね。

```bat:sed_sample002.bat
sed -e s/abc/ABC/g -e s/def/DEF/g %infile% > %outfile%
```

sedスクリプトファイルを使う場合は、次ですね。

```bat:sed_sample003.bat
sed -f sedscriptfile.sed %infile% > %outfile%
```
```text:sedscriptfile.sed
s/abc/ABC/g
```

#半角記号の変換
半角記号の中には、特殊な意味を持つものがあるので、エスケープが必要であることはわかっていましたが、エスケープの仕方が、記号によって異なったり、コマンドラインから実行する場合とバッチファイルから実行する場合で異なったりするので、扱いが難しいです。
ネットを探してみると、すぐに情報が見つかるのですが、自分の環境では上手く行かない部分もあったりしました。

私の環境で、Windowsバッチファイルから、gnuwin32 sedコマンドを使う場合に、半角記号のエスケープは、次のように行えば上手くいきました。

* 「$」「.」「/」「[」「]」「\」は、「\」（円記号またはバックスラッシュ）でエスケープが必要でした。
* 「%」は、「%」でエスケープが必要でした。
* 「&」「<」「>」「|」は、「"」で括って、エスケープ（？）しました。
* 「^」は、前に「\」を付けて、「"」で括る必要がありました。
* 「"」は、エスケープ方法がわかりませんでした。コマンドラインから実行する場合は、「\」でエスケープ出来たのですが、Windowsバッチファイルから実行する場合は、方法がわかりませんでした。

※たぶん、この辺の話は、sedというより、Windows側の仕様の話ですよね。

#日本語（UTF-8）の変換
gnuwin32 sedコマンドは、SJISを前提に動作しているようですので、UTF-8のテキストファイルを変換する場合には、文字コードの変換が必要でした。
次のようにして、事前にUTF-8→SJIS変換し、sedを実行、さらにSJIS→UTF-8して元の文字コードに戻すと上手くいきました。

※文字コードを変換せずに、UTF-8のファイルをそのままsedに渡すと、sedの処理が止まってしまうようで、応答が戻ってこなくなりました。（その場合は、Ctrl+Cで停止させることが出来ました。）

```bat:sed_sample010.bat
iconv -f UTF-8 %infile% | ^
sed s/朝/昼/g | ^
iconv -t UTF-8 > %outfile%
```

※ここでは「^」を使って、複数行に分けて記述していますが、「^」を削除して1行にしても実行可能です。

#動作確認環境
私が動作確認した環境は次です。（これ以外の環境で、動かしたら、また異なる動きになるんだろうか？う～ん、わからない。）

* Windows 7 64bit
* gnuwin32 sed 4.2.1
* gnuwin32 iconv (GNU libiconv 1.11)

動作確認に使用したサンプルファイル類は、次の場所に登録しておきました。

* [kurukurupapa/TryWindowsBatch](https://github.com/kurukurupapa/TryWindowsBatch)のSedTest.bat
nautilusからairstationのNASに接続する方法


01. airstationに付属してるsmbのサーバ名を確認する
----

smbclientの中に下記コマンドが含まれています。

`$ sudo smbtree`

```d:console
    WORKGROUP
	\\UbuntuPC		UbuntuPC server (Samba, Ubuntu)
		\\UbuntuPC\IPC$           	IPC Service (token-VPCEB2AFJ server (Samba, Ubuntu))
		\\UbuntuPC\print$         	Printer Drivers
	\\iMacPC        		iMac
	\\AE4CE678C3D2D2
		\\AE4CE678C3D2D2\IPC$           	IPC Service ()
		\\AE4CE678C3D2D2\storage2
		\\AE4CE678C3D2D2\storage
```

**AE4CE678C3D2D2**がairstationのsmbサーバ名です。

02. nautilusから接続する
---

`FIle` -> `サーバへ接続` 

* サーバー情報
 * サーバー名：[ AE4CE678C3D2D2 ]
 *  種類：[ Windows 共有 ]
 *  共有する場所：[ storage2 ]
 * フォルダー： [ / ]
* ユーザー情報
 * airstation側の設定次第

これで、nautilusの左サイドバーに`AE4CE678C3D2D2 上のstorage2` が追加されて、接続できるようになる。
ContentProviderでランダムに一件取得するクエリを叩くメモ

ContentProviderを使ってランダムに一件だけデータ取得したい機会があったのでメモ。

---

Stack Overflow先生によると、こんな感じでSELECT文書けば良いとのことです。
http://stackoverflow.com/questions/1253561/sqlite-order-by-rand

```java
SELECT * FROM table ORDER BY RANDOM() LIMIT 1;
```
---

RANDOM()はSQLiteの関数です。
http://www.sqlite.org/lang_corefunc.html

---
ContentProviderの場合はsortOrderのところに書いちゃえばＯＫ。

	Cursor c = context.getContentResolver().query(
			Hoge.CONTENT_URI,
			new String[]{Hoge._ID}, 
			null, 
			null, 
			"RANDOM() LIMIT 1");

おしまい。
境界線分

外周以外の罫線について、1つずつ「その罫線の上下(または左右)が異なるかどうか」を見る。連続して真である数を線分の長さとして記録する。

```rb
#!/usr/bin/env ruby
#http://qiita.com/Nabetani/items/6a9f5593d0f3d7e0568c
#http://nabetani.sakura.ne.jp/hena/ord16boseg/
STDOUT.sync=true
while gets
	a=[0]*7
	#b=('%036b'%$_.to_i(8)).split('').each_slice(6).to_a
	b=$_.scan(/../).map{|e|('%06b'%e.to_i(8)).split('')}
	[b,b.transpose].each{|l|
		0.step(4){|y|0.step(5).map{|x|l[y][x]!=l[y+1][x] ? '1' : ' '}.join.split.each{|e|a[e.size]+=1}}
	}
	puts a[1,6]*','
end
```

ビットマップ演算版

```rb
#!/usr/bin/env ruby
#http://qiita.com/Nabetani/items/6a9f5593d0f3d7e0568c
#http://nabetani.sakura.ne.jp/hena/ord16boseg/
STDOUT.sync=true
while gets
	a=$_.scan(/../).map{|e|e.to_i(8)}
	r=[0]*(a.size+1)
	[a,a.size.times.map{|e|a.size.times.reduce(0){|s,f|s+=a[f][e]<<f}}].each{|e|
		(a.size-1).times{|y|('%b'%[e[y]^e[y+1]]).split('0').each{|f|r[f.size]+=1}}
	}
	puts r[1,a.size]*','
end
```

Pythonに移植

```py
#!/usr/bin/env python
#http://qiita.com/Nabetani/items/6a9f5593d0f3d7e0568c
#http://nabetani.sakura.ne.jp/hena/ord16boseg/
import sys,itertools
if sys.version_info[0]>=3:
	from functools import reduce
	raw_input=input

def solve(s):
	a=[int(s[i:i+2],8) for i in range(0,len(s),2)]
	r=[0]*(len(a)+1)
	for e in (a,[reduce(lambda s,f: s+(((a[f]>>e)&1)<<f),range(len(a)),0) for e in range(len(a))]):
		for y in range(len(a)-1):
			for f in format(e[y]^e[y+1],'b').split('0'): r[len(f)]+=1
	print(','.join([str(e) for e in r[1:]]))
	sys.stdout.flush()

try:
	while True:
		s=raw_input()
		solve(s)
except EOFError:
	pass
```
第16回オフラインリアルタイムどう書くの問題


オフラインでリアルタイムに「どう書く」をやるイベント( http://atnd.org/events/45016 )を行っています。

問題は「境界線分」という名前で、詳細は
http://nabetani.sakura.ne.jp/hena/ord16boseg/
です。

実装ができた方はこちらのコメント欄からリンクを張っていただくと見つけやすくて助かります。

[宣伝]
CodeIQ で、これとは全然関係ない問題出してます。
https://codeiq.jp/ace/nabetani_takenori/q595
こちらもよろしく。
Go の可変長引数に直接 slice を渡す


例えば `template` パッケージに [template.ParseFiles()](http://golang.org/pkg/text/template/#Template.ParseFiles) という `string` の可変長引数をとる関数があります。これにファイル名が入った `slice` を直接渡したいとすると？

引数の後に `...` を付けると良い模様。ググってもなかなか見つからなかったんですが、適当に試してみたらいけました。

```go
filenames := []string{"foo.html", "bar.html", "baz.html"}
tmpl, err := template.Must(template.parseFiles(filenames...))
```
ActiveSupport::OrderedOptions をYAMLに変換出来なくて、生きているのが辛い


とりあえず、to_yamlで
=================

```ruby
hoge = ActiveSupport::OrderedOptions[:foo => 1]
puts hoge.to_yaml
```

```yaml
--- !ruby/object:ActiveSupport::OrderedOptions {}
```

＿人人人人人人人人＿
＞ ご覧の有様だよ! ＜
￣Y^Y^Y^Y^Y^Y^Y￣

Hashに変換してから to_yaml
========================

```ruby
puts hoge.to_h.to_yaml
```

```yaml
---
:foo: 1
```

＿人人人人人人人＿
＞ 先頭のゴミ `:` ＜
￣Y^Y^Y^Y^Y^Y￣

とりあえずこれは後で考える。

ネストした ActiveSupport::OrderedOptions
================================

```ruby
hoge =
  ActiveSupport::OrderedOptions[
    :foo =>
      ActiveSupport::OrderedOptions[:bar => 1, :baz => 2],
    :zot =>
      ActiveSupport::OrderedOptions[:qux => 3, :quux => 4],
  ]
puts hoge.to_h.to_yaml
```

```yaml
---
:foo: !ruby/object:ActiveSupport::OrderedOptions {}
:zot: !ruby/object:ActiveSupport::OrderedOptions {}
```

＿人人人人人人人人＿
＞ 振り出しに戻る ＜
￣Y^Y^Y^Y^Y^Y^Y￣

もうこれでいいんじゃない?
===================

無駄だけど、先頭のゴミ (`:`) も無くなったし…

```ruby
puts JSON.parse(hoge.to_json).to_yaml
```

```yaml
---
foo:
  bar: 1
  baz: 2
zot:
  qux: 3
  quux: 4
```

最初のハイフンが邪魔なら
==================

削ればいいと思うよ。

```ruby
puts JSON.parse(hoge.to_json).to_yaml.sub(/\A-+\n/, "")
```
Ceylonでの名前付き引数やタプル

[前回](http://qiita.com/newta/items/37e1ae9ec9bc79146c7c) はJavaのHTTPサーバを作った流れでここまで書いてない記述方法で
Ceylonのコードを書いてました。

その解説などをしてみようと思います。

#関数の内容が１行の時の書き方

まず普通の関数です。

```ceylon

void hello() {
	print("hello world!");
}

````

普通にコンソールにhello worldが出力されるコードです。
関数内容が１行のときは宣言をこのようにも出来ます。

```ceylon

void hello() => print("hello world!");

````

記述が簡単になりますね。
クラスのメソッドのときにもこのような記述方法が使えるので
オーバーライドの時やメソッド引数に単純な関数を渡すときにはよく使われます。

scalaでもよくある記述ですねー。


#名前付き引数での呼び出し

このような関数があるとします。

```ceylon

Integer sum(Integer x, Integer y) {
	return x + y;
}

````

普通に呼び出すときはこうですね。


```ceylon

Integer answer = sum(1 , 2);

````

名前付き引数で呼び出すと


```ceylon

Integer answer = sum { x = 1 , y =2 };

````

こんな感じで呼び出せます。
括弧が変わっているのにちょっと注意。

名前付きであれば順番が反対になっていても大丈夫です。

```ceylon

Integer answer = sum { y = 1 , x =2 };

````

ただメソッドを呼ぶだけのときはあまり使わないかもしれませんね。

でも、コンストラクタ呼び出しのときも同様に名前付き引数を使えます。
[前回の記事](http://qiita.com/newta/items/37e1ae9ec9bc79146c7c) のときにも使っていました。

場合によって使い分けたら良いかなーと思います。

この辺もscala使いの人にはすでにお手の物かもしれませんね。


#タプル

なんかバリューオブジェクトのクラスを新しく作るほどでもないけど
メソッドで複数値を返したくなるときってたまにありますよね？
Javaだとその辺かなり堅いのでクラスを作るか
List<Object>とかMap<String,Object>とかって言うダメな戻り型を指定して
作ってしまう場合があります。

そんなときに使えるタプル。

```ceylon

[Integer, String , Integer, Float] tuple() {
	
	return [1 , "TWO" , 3 , 4.0];
	
}

````

こんな感じで返せます。
List<Object>とかで返してたときは型が消えてしまっていましたが
そんなことも無いし、使うときはこんな感じです。

```ceylon

	value result = tuple();
	
	print(result[0]); // 1
	print(result[1]); // TWO
	print(result[2]); // 3
	print(result[3]); // 4.0

````

まあこれもscalaな人にはおなじみですね。

ただscalaと違うのは
scalaではtuple22問題があって
最大22個の要素までしかタプルを作れず
23個以上の要素を持ったタプルを作ることが出来ませんが
Ceylonでは要素が23個以上でも作ることが出来ます！ヤッター！
（でも普通そんなに使わないけどね。。。）

#まとめ

今回はscalaとかの関数型言語で普通によくある
表現や機能がCeylonでも使えるところを紹介してみました。

Scalaをやりたい人もJavaに似た記述のCeylonを使ってみてから
Scalaをすると機能を順番に理解出来るかもかも？

そんな感じでまた次回。
とにかく簡単に JSON データを確認したい

ファイルに保存された JSON データを端末上で確認する方法はたくさんあります

しかしちょっと確認したいだけなのに何かをインストールするのは面倒なので大抵の環境で入っているものを使いたいです

調べたら stackoverflow にありました

[unix - How can I pretty-print JSON from the command line? - Stack Overflow](http://stackoverflow.com/questions/352098/how-can-i-pretty-print-json-from-the-command-line)

    cat output.json | python -mjson.tool

こんな感じにすれば良さそうです

Python2.6 以上が必須のようですが，入っている環境なら便利！！
Cross Platform MIDI Tools Advent Calendar #5: Gtk#バージョンの作成

（まさか2日ばかり遅れた程度でこのAdvent Calendarごっこが終わるはずがない。というわけで何事もなかったかのように続きを書くことにしよう。）

最初にXWTで作成したバージョンは、描画まわりが著しく不安定だったので、その原因を追及しなければならなくなった。不安定の原因は描画パフォーマンスにありそうだった。MIDIファイルの演奏はもちろんmp3などのデコード処理に比べると軽量だが、リアルタイムで処理すべきメッセージは少なくない。ひとつのチャネルでノートオンを実行する前に、エクスプレッションなどCC/RPN/NRPNの変更命令が入り、それからノートオンが処理される。場合によってはノートオフとノートオンは同じタイミングで必要になる（ゲートタイムが無い音の場合）。

描画命令は、それぞれのMIDIメッセージを受信したタイミングで行われていた。実際には、XwtではCanvasオブジェクトに対してQueueDraw()というメソッドを呼び出し、それ自体は描画スレッドに描画イベントをトリガーするよう指令を送る。これを受信したスレッドが、OnDraw()を呼び出す、という流れだ。（実際には、QueueDraw()の実装はBackendのフレームワークのメッセージをディスパッチするだけだし、メッセージはそのフレームワーク側から発生したイベントにフックされたXwtのBackendのイベントが、必要に応じてユーザーコードからフックされたイベントを呼び出しているだけだ。）

このQueueDraw()の呼び出しは、何も考えずに実装されたコードでは、一度に処理するMIDIメッセージにつきひとつ存在したので、16鍵盤合わせておそらくこれだけでFPS…framesと言うべきか…はある。真面目に描画命令がダブルバッファリングされている必要がある。

とは言え…本来ならこれはGtk#のレベルで解決していて、従ってXwtのレベルでも解決しているはずの問題だ。gtk+は2.10の時点で[デフォルトでダブルバッファリングを行う](https://people.gnome.org/~federico/misc/gtk-drawing-model/index.html#automatic-double-buffering)ようなコードが入っているはずだ。ただ、XwtがGtk#と何かしら異なる仕組みをもっているかもしれないし、ダブルバッファリングが有効になった上でこのような体たらくなのかもしれない。

仕方ないので、Xwtはいったん放棄して、Gtk#バージョンのブランチを作って開発することにした。Gtk#用のコードは、[gtk-sharpブランチ](https://github.com/atsushieno/xmdsp/tree/gtk-sharp)にpushしてある。

gtk#版の開発は、それなりにスムーズに行われた。まだUIのコードがほとんど無かったということもあるけど、実際にはMVCの亜種のような設計にしていたからだ。コード中にはViewModelという名前のクラスが存在する。それらはいずれのGUIフレームワークにも依存しない形になっている。なぜそのような設計になっているかというと、もちろんGUIフレームワークを簡単に切り替えて検証できるようにするためだ。

具体的には、PointやColorのような型を独自に定義して、各ViewModelクラスが座標周りの数値を保持している。スケーリングに優しい設計を行っているわけではない。16鍵盤という画面の構成上、かなり幅広く領域を確保する必要があり、それを可能にするために要素が10ピクセル以下のものが多く、単純な拡大縮小計算で何とかなる気がしないためだ。

また、現状このアプリケーションは visualizer であり、ユーザー入力を受け付けるものではないため、いわゆるMVVMのようなデータバインディングやUIコンポーネントの状態変化によるイベント通知を行っているわけではない。（入力を受け付けたとしても、Canvas全体に対する入力として処理せざるを得ないだろう。）　現状はとりあえず困っていない。Viewの状態変化により大きく影響するのは、演奏状態や演奏制御命令に応じる部分の方が大きい。

もっとも、そうは言っても、このアプリケーションはほとんどがViewに属する部分で出来ているので、ViewModelのようなものを切り離しても、それなりの作業量・コード差分にはなった。

ともあれ、Gtk#版は起動するようになった。そこで確認できたことは、Gtk#でも手動で GdkWindowの
BeginPaintRect() / EndPaintRect() を呼び出した上でContextへの描画処理を行わなければ重い、ということだった。具体的には https://github.com/atsushieno/xmdsp/blob/gtk-sharp/Xmdsp/View.Xwt/KeyboardList.cs#L90 が決め手となって、描画パフォーマンスの問題が一気に解決したわけである。

どうやらGtk#であれば少なくとも現状のモデル（C#/自作MIDIレイヤー/クロスプラットフォーム）で動作するものが作れそうだとわかった。次は、これをXwtのコードベースで実現できるようにする話を書く。
cocos2d-xの各言語における基本アプリ容量の比較

#概要
cocos2d-xを利用したアプリは開発言語にC++, Lua, JavaScriptの3種類があり、開発者は好みや用途に応じて言語を選択することができます。
cocos2d-x自体はC++で開発されていることは良く知られていますが、LuaやJavaScriptで開発を行う場合はC++へ変換するためのエンジンが搭載されており、それにより適宜変換が行われます。
そのエンジンが搭載されていることで、ある程度アプリの容量が増えることが予想されますが、実際に確認されたことがある方は少ないのではないでしょうか？そこで実際に確認を行ってみました。

#確認方法
まず最初に、cocos2d-x 3.0 alpha1のproject_creatorで各言語別にプロジェクトを作成しました。そしてお馴染みの中央に「HelloWorld.png」が表示されているシーンのみとし、IPAファイルを作成しました。C++とJavaScriptのプロジェクトは何もしなくてもこの画面が表示されますが、Luaは別のサンプルが表示されるため「HelloWorld.png」が表示される画面に修正し比較を行っています。
一番気になるのは、3G回線でもダウンロードできるサイズですので、IPAファイルとして出力したサイズを確認しました。（Organizer > Archives > 各プロジェクト > Estimated App Store Size）
おまけでUnity（フリー版）でも同様な画面を作成しIPAを作成してみました。しかしUnityはまだまだ初心者なので参考程度にとどめて頂ければと思います。
![IMG_1076.PNG](https://qiita-image-store.s3.amazonaws.com/0/15393/3e02c65d-e42e-134d-885f-8040e513a13f.png)

#IPAファイルサイズ比較
結果は次の通りです。C++で作成したアプリは3.3MBと非常にコンパクトです。一方、LuaはC++の4倍弱、JavaScriptに至ってはC++の5倍弱と、非常に大きなサイズになっています。さらにUnityはcocos2d-x(C++)の約6倍です。
アプリ起動後にリソースをダウンロードするのであればあまり気になりませんが、全てのリソースを最初から持っておくのであれば、約10MBは非常に大きいです。

| Language | Size |
|:-----------|------------:|
| C++       |        3.3MB |
| Lua      |        11.6MB |
| JavaScript       |        15.8MB |
| Unity       |        19.2MB |

#最後に
ここ最近では、高い解像度のイラストやフレームアニメーション、多くの音声ファイルが多くなっているので、リソースサイズは非常に大きなものになっています。画像や音声ファイルのサイズを押さえるためのテクニックもありますが、画像の減色や音声のサンプリング周波数を必要以上に落として対応しているアプリもありました。これでは折角いいものを作ってくれたイラストレータさんや作曲家さんがかわいそうです。ファイルサイズが大きくなることが最初から予想されるのであれば、根本的にベースが軽いフレームワークを選択する方が良いのではないかと思います。
Middlemanでbuild時にassets類をCDNへのパスにしよう


アドベントカレンダー2013 3日目の記事です。
[Middleman Advent Calendar 2013 - Adventar](http://www.adventar.org/calendars/251)

----

画像やcssだけcdnにします、というのはよくある話。それに対応しましょう。

# いきなりまとめ
* build時に、set :css_dirなどでCDNへ書き換え
* リラティブプロトコルじゃないとうまくいかない


# ググると答えがある

[ruby - middleman - asset path for CDN at build time - Stack Overflow](http://stackoverflow.com/questions/17434053/middleman-asset-path-for-cdn-at-build-time)

``` config.rb
configure :build do
  set :css_dir, '//cdn.domain.com/assets'
end 
```

これでbuild時のみパスを変更できる。


# ディレクトリを動的に設定したい。例えば日付ディレクトリ。
CDNへのデプロイは、

* キャッシュが効き過ぎる
* なんかあったら、戻りにくい

というのがあって、だいたい日付のディレクトリを作ってそこにassetsをほりこむようにしている。

	http://hoge.com/assets/2013-12-07_12-34-56/

↑ こういうディレクトリを作ってそこに画像やcssなどを入れている。最終的には`hoge.com/index.html`を差し替えるだけですむようにしている。


これをMiddlemanでやってみよう。

``` config.rb
configure :build do
  releaseTime = Time.now().strftime("%Y-%m-%d_%H-%M-%S")
  set :css_dir, "//hoge.com/assets/#{releaseTime}"
end
```
``` layout.slim
== stylesheet_link_tag "all"
```

``` index.html
<link href="//hoge.com/assets/2013-12-07_15-08-52/all.css" media="screen" rel="stylesheet" type="text/css" />
```

# 注意: Relative Protocol (src="//hoge.com/"みたいな書き方)にしないとうまくいかない

`set :css_dir, "http//hoge.com/assets/#{releaseTime}"`みたいにhttpから始めると、

``` html
<link href="/http://hoge.com/assets/2013-12-07_15-08-52/all.css" media="screen" rel="stylesheet" type="text/css" />
```

↑こんな感じで`/http`というおかしなことになります。なんとかする方法は知らないので教えてください！
Vert.xで自作エンティティクラスをJSONにシリアライズする

Vert.xって「基本JSONでイベント送信する」みたいなムードが漂っていますが、
Vert.xのJSONは[org.vertx.java.core.json.JsonObject](https://github.com/eclipse/vert.x/blob/master/vertx-core/src/main/java/org/vertx/java/core/json/JsonObject.java)(または[JsonArray](https://github.com/eclipse/vert.x/blob/master/vertx-core/src/main/java/org/vertx/java/core/json/JsonArray.java))という、Vert.x独自のJSONクラスです。
そのため、自分が作ったエンティティを送信したい場合は、JsonObjectに変換する必要が出てきます。

そんなときに使うのがコレ。
[org.vertx.java.core.json.impl.Jsonクラス](https://github.com/eclipse/vert.x/blob/master/vertx-core/src/main/java/org/vertx/java/core/json/impl/Json.java)にシリアライズ／デシリアライズするメソッドが用意されています。
用意されているのは、以下のstaticメソッド。endoceでObject→JSON文字列に、decodeValueでJSON文字列→Objectに変換できます。

+ public static String encode(Object obj) throws EncodeException
+ public static String encodePrettily(Object obj) throws EncodeException 
+ public static <T> T decodeValue(String str, Class<?> clazz) throws DecodeException

シグネチャで見たままに動きます。
例えば、MyEntityクラスをJsonObjectにする場合は、以下のように書きます。

```java
        MyEntity entity = ...
        JsonObject json = new JsonObject(Json.encode(entity));
```

これで、自分が作ったエンティティからJsonObjectに変換できました。
このJsonObjectをEventBusに送信してあげれば、OK。
ちなみに、Vert.xは内部で[Jackson](http://wiki.fasterxml.com/JacksonHome)を使っています。

※でも、これだと、エンティティ→String→JsonObjectという変換になっています。直接、エンティティ→JsonObjectとできないのかな。。。
ModelSimASE+clangでSystemVerilog DPI-Cをシミュレーションする

こんにちわ@ginnyu_teiです。  
今更ですがModelSimASEで初めてDPI-Cを動かしたので投稿します。


有償の(お高い)RTLシミュレータは大体以下のコマンドでDPI-Cが使えます。

```
<シミュレータコマンド> <+svとか-sverilog必要だったり不要だったり> hoge.sv hoge.c
```

ModelSimもお金を出せばシミュレータコマンドとしてqverilogが使えます。    
しかしAlteraStarterEdition(以下ASE)にはqverilogコマンドが実装されていないので  
<del>面倒ですが</del>vlib、vlog、vsimを使います。  
(Linuxではqverilogのシンボリックだけはあったのでコマンド補完で出てきますがリンク先がなくなってます。)  

## テスト環境
gccの代わりにclangが使えるか試したかったのでLinuxにしました。  

* VMWare + Fedora 64bit  
* ModelSimASE 10.1d  

##ソースコード
シンプルにSV上から値を渡してCで表示するだけのコード

```verilog:hoge.sv
module hoge();
    import "DPI-C" function void c_func_hello(int in_dat);

    int i;

    initial
        i = 32'd100;

    initial begin
        #1;
        c_func_hello(i);
    end

endmodule
```

```c:hoge.c
#include <stdio.h>
#include "svdpi.h"

void c_func_hello(int in_dat) {
   printf("Hello DPI-C input = %d\n",in_dat);
}
```

## Makefile
折角なのでビルドからシミュレーション実行までできるMakefileを作りました。

```make:Makefile
#Source
SV_FILE = hoge.sv
TOP_NAME = hoge
SRC = hoge.c
DPI_OBJ = svdpi
#Tool
MODELSIM_HOME = /mnt/sdb1/altera/13.1/modelsim_ase/
VLIB = vlib
VLOG = vlog
VSIM = vsim
#CC = gcc
CC = clang

OBJ = $(SRC:%.c=%.o)

run : vlib vlog vsim

vlib:
    $(VLIB) work

vlog:
    $(VLOG) -sv -dpiheader dpiheader.h $(SV_FILE)

vsim: $(DPI_OBJ).so
    $(VSIM) -c -sv_lib $(DPI_OBJ) $(TOP_NAME)  -do "run -all; quit -f"

.c.o:
    $(CC) -c -fpic -m32 -I$(MODELSIM_HOME)/include $<

$(DPI_OBJ).so :$(OBJ)
    $(CC) -shared -m32 $(OBJ) -o $(DPI_OBJ).so

clean:
    rm -rf work dpi.so $(DPI_OBJ).so $(OBJ)  transcript *.wlf dpiheader.h

```
64bitLinuxを使っている場合はclangのオプションに`-m32`が必要です。  
何故ならModelSimASEは32bitモードしか対応していないので  
ライブラリも32bitにしなければならないからです。

ちなみに64bitLinux上で`-m32`を付けないと下記の様なエラーになります。

```
# vsim -do {run -all; quit -f} -c -sv_lib svdpi hoge 
# Loading sv_std.std
# Loading work.hoge
# Loading ./svdpi.so
# ** Error: (vsim-125) The shared library ./svdpi.so being loaded was built on a 64-bit machine. A 64-bit shared library cannot be loaded in a 32-bit simulation. Please use compatible machines to build and load the library
# ** Error: (vsim-3197) Load of "./svdpi.so" failed: ./svdpi.so: wrong ELF class: ELFCLASS64.
# ** Fatal: (vsim-3748) Failed to load DPI object file "./svdpi.so" while trying to resolve 'c_func_hello'.
# FATAL ERROR while loading design
# Error loading design
Error loading design
```
##シミュレーション
`make`を実行するだけの簡単操作

```
[ginnyu-tei@localhost svdpi_test]$ make
vlib work
vlog -sv -dpiheader dpiheader.h hoge.sv
Model Technology ModelSim ALTERA vlog 10.1d Compiler 2012.11 Nov  2 2012
-- Compiling module hoge

Top level modules:
	hoge
clang -c -fpic -m32 -I/mnt/sdb1/altera/13.1/modelsim_ase//include hoge.c
clang -shared -m32 hoge.o -o svdpi.so
vsim -c -sv_lib svdpi hoge  -do "run -all; quit -f"
Reading /mnt/sdb1/altera/13.1/modelsim_ase/tcl/vsim/pref.tcl 

# 10.1d

# vsim -do {run -all; quit -f} -c -sv_lib svdpi hoge 
# Loading sv_std.std
# Loading work.hoge
# Loading ./svdpi.so
# run -all 
# Hello DPI-C input = 100
#  quit -f 
```
## まとめ
* clangでもDPI-Cは使える   
* ModelSimASEは32bitモードのみ  
* そもそもqverilogが使えれば一行で済む話
あいまい時間軸検索の結構なところが空間DBで実現できるんじゃないかという話


空間DBマニアのkochizufanです。
今回は、空間DBは単にツールとして考えれば、他にもいろんな事に使えるんじゃないかという話。

### 歴史研究等における時間検索の必要性

歴史や考古学の分野、或いは歴史史料アーカイブの現場等で、時間軸での検索が非常に重要視されてて、
それは単純に時間を単なる点として蓄積して範囲で篩をかけるというような普通のスケジュールデータ的時間データと違い、データの時間メタデータが範囲を持っていて（例えば鎌倉時代の事物とか）、それだけでも割と普通にテーブルDBだとデータ形式それなりに考えないといけないのに、
さらにその範囲も定義や期間があいまいだったり諸説あったりといった揺らぎがあって、そんなのどうやってデータを蓄積管理するのよ、といったところが問題になっているようです。
関西では[時間GIS研究会](https://sites.google.com/a/doshisha-bkj.net/temporal-gis/)といった集まりも開かれていて、そこのメンバーを中心に、空間参照系ならぬ時間参照系といった概念の提唱と実装も研究されているようです。

### 年表のような検索 … それ、空間DBの流用でできるんじゃね？

私はアカデミックなところの外野にいる者なので、学術上で満たさないといけない要件とかは全く議論出来ないのですが、そういったところの方と話をしていると、たまに聞くのが、
![timetable.jpg](https://qiita-image-store.s3.amazonaws.com/0/10108/ee4f96b9-3fde-fe21-e3a5-aa6c656b481c.jpeg "timetable.jpg")
(世界史年表・地図(吉川弘文館)から引用)
こんな感じの歴史年表をそのままDBに突っ込んで、それで検索出来ればいいね、みたいな話です。

…それ、空間DBの流用でできるんじゃね？
例で上げた年表を見ても、年表というのは横軸時間軸、縦軸何らかのメタデータ軸（上の年表でいうと、空間を地域という離散的データ形式に投影した軸）の2次元データで、その上に記された各王朝の存在期間データ等も、その2次元座標上のポリゴンとして表現出来る訳で、であれば、その2次元ポリゴンを空間DBに突っ込んでやって、求めたい結果を得る条件の検索バウンダリとの衝突判定検索をしてやれば、普通に検索出来そうです。
例えば、上記年表のポリゴンの入った空間DBテーブル上で、検索条件として横軸A.D.1年〜200年、縦軸日本、朝鮮、満州のバウンダリで検索してやれば、「大和朝廷、弁韓、馬韓、辰韓、四郡、楽浪郡、高句麗、夫余」あたりが検索出来る形にするのは、空間DBであれば簡単にできるでしょう。
空間DBに突っ込まれる座標軸が、WGS84やメルカトルでないといけない等、誰が決めたのでしょうか…。

逆にこの定義された時代区分をベースにした検索も可能でしょう。
素人なので実際に即した例は挙げられないのですが、仮に「2世紀の東アジアで特徴的な刀剣の形状」データがあるとして、その存在範囲をポリゴンとしてその刀剣のメタデータに登録しておいてやれば、「魏」や「高句麗」で検索するとその刀剣は得られるけれど、「東晋」や「新羅」で検索しても出て来ない、といった事はできるでしょう。

### 曖昧検索はポリゴン定義を斜線にして、正規化インデックス値を求めればいけそう

「〜時代は何時始まるねん？」的な曖昧な検索についても、ある程度は対応出来ると思います。
別に時代等の区分線、蓄積においても検索においても、垂線で区切られる必要はないのですから、区分線を斜めにしてしまえばいいのです。
イメージ的にはこんな感じ。
![kamakura_check.png](https://qiita-image-store.s3.amazonaws.com/0/10108/c74a1f1a-3dfc-7bee-c876-40ce803fb813.png "kamakura_check.png")
平安時代と鎌倉時代の境界に諸説あって曖昧なのであれば、その揺らぎの範囲として斜め線で区切ってやればいいのです。
その上で、検索条件にせよ蓄積条件にせよ、マッチさせる条件の方も点等ではなくウィンドウとしてマッチさせ、マッチした範囲の面積を、全体がマッチした場合の面積で割ったインデックス値を求めてやれば、確実に鎌倉時代に属する事物と言えるもの、鎌倉時代に属するか否か議論の分かれるもの、誰が見ても鎌倉時代に属してるとは言えないもの、といった重み付け検索は可能です。

別に斜め線に限る必要はなく、マルチポリゴンしかり穴開きポリゴン然り、オリジナルの縦軸と横軸で表される座標空間の中で、曖昧さも含め検索条件としたい条件を図形として表現し、蓄積或いは検索条件としてやれば、かなりいろんな条件に対応する事ができるでしょう。

### 空間DBはしょせんツール、利用を空間検索に限定する必要はない

空間DBはGISから発展した技術ではありますが、しょせん「ツール」でしかありません。
別にGIS以外でも、空間データ以外でも、

* 複数座標軸からなる座標空間上に存在する、離散値連続値問わないものの存在範囲に対して、範囲を指定して高速に検索をかける事ができる。
* 座標系の変換が定義できれば、座標系間の変換を行って出力することもできる。  
さらに、変換結果にインデックスをかければ、変換結果で検索する事もできる。
* 検索した存在範囲結果の合成、加減算、変型、或いは存在範囲の面積、距離等、座標空間内での演算を行う事ができる。

といった空間DBの特性が活かせるデータ形式、ユースケースであれば、何にでも利用できると思います。
たとえば、適用した事はありませんが、店舗や医療機関POIの検索において、曜日毎の営業/診療時間と現在時刻の間での検索を行うのに、空間DBを使うと面白いんじゃないか？とかも思ったりします。

空間DBだから空間情報処理だけに、とかではなく、特性を利用できるところならばどんな用途にでも、アイデア次第で使えばいいんじゃね？と思います。
しょせん、情報処理アプリなんて、道具に過ぎないのですから。
[Ruby] system() で stdout, stderr を得る。

Open3.capture() をつかえば、外部コマンド実行結果の stdout, stderr, 実行ステータスは得られる。
しかし コマンド実行で stdout, stderr に大量に出力される可能性がある場合、この方法ではメモリーを圧迫してしまう危険がある。

そこで、出力結果をメモリーに展開せずに、 stdout, stderr を得る方法を検討してみた。

発想としては、
* system() を使う。system() の return 値で実行ステータスを判定する。
* stdout, stderr はファイルにリダイレクトする。必要に応じて、ファイルの中身を参照する。

以下にコードを書いてみた。　（ ruby 1.9.3-p484)
このコード例では、 system() の  return 値は 常に true か falseになる。
( リダイレクトをしないなら、 該当コマンドが無い時などは nil が返るのだが )
このコード例では、該当コマンドが無い時は、false が返り、stderr に "command not found" が記録される。

```ruby:call_system.rb
def call_system(command)
  stdout_txt = 'stdout.txt'
  stderr_txt = 'stderr.txt'

  ret = system "#{command} 2> #{stderr_txt} 1> #{stdout_txt}"
  if ret
    puts "# --- success [#{command}]"
  else
    puts "# --- error [#{command}]"
  end
  puts "# --- srdout: #{`wc -l #{stdout_txt}`.to_i} line(s), srderr: #{`wc -l #{stderr_txt}`.to_i} line(s)"

end

commands = [
  'ls -algt /',       # success
  'xxxx -algt ~',     # error
  "ruby -e 'exit 0'",  # success
  "ruby -e 'exit 1'",  # error
  "ruby -e 'exit 2'",  # error
  "ruby -e '100.times{puts \"1\"; warn \"2\\n\"};0'", # success
]

commands.each do |c|
  puts '# =========================='
  call_system(c)
end
```

実行結果は次のようになる。

```
 ruby call_system.rb
# ==========================
# --- success [ls -algt /]
# --- srdout: 41 line(s), srderr: 0 line(s)
# ==========================
# --- error [xxxx -algt ~]
# --- srdout: 0 line(s), srderr: 1 line(s)
# ==========================
# --- success [ruby -e 'exit 0']
# --- srdout: 0 line(s), srderr: 0 line(s)
# ==========================
# --- error [ruby -e 'exit 1']
# --- srdout: 0 line(s), srderr: 0 line(s)
# ==========================
# --- error [ruby -e 'exit 2']
# --- srdout: 0 line(s), srderr: 0 line(s)
# ==========================
# --- success [ruby -e '100.times{puts "1"; warn "2\n"};0']
# --- srdout: 100 line(s), srderr: 200 line(s)
```