OmniAICreator/Qiita-1.07M huggingface dataset:
sassc-railsでsassのコンパイルを高速化

## 課題：sassのコンパイルが遅い

Railsのプロジェクトで、css(scss)を修正するたびにコンパイルが行われて非常に遅くて辛い思いをしていました。基本的にはChromeのデベロッパーツール側で入力して試してから反映しているので、間違うことは基本的にはないのですが、bootstrap-sassを使ったgridの幅の計算や、sassの計算を使うような処理の場合は試行錯誤するので困ります。
今では1回のコンパイルに25秒近くかかるようになっていました。

## 検討:sassc-railsを使いたい

okayama-jsで発表するためにJS周りでのsassを調査しているときに、libsassの存在を知りました。これをrailsでも使えたらいいのではないか？と思い、調査してみたところ、sassc-railsというgemがあることがわかりました。これを使えないか調査してみました。

### さらなる課題:compassが使えない

libsassだとcompassが使えないという情報を見ました。確かに、`compass-rails`を使っていると、scssのコンパイルでこけてしまいました。compassで使っている処理がruby-sassに依存したものになっているからのようです。

### 解決:compass-mixinを導入

さらに調査したところ、compass-mixinがあるよという記事を見かけました。これをプロジェクトに置き、`@import "compass";`文で指定していたところを、compass-mixinのものに変えればよさそうです。

## 実際の作業内容

### libsassのインストール

libsassがまだ入ってない場合は入れておきます。
私の環境はMacなので、homebrew経由でインストールしました。

```bash
brew install libsass
```

### Gemfileの変更

次に、RailsプロジェクトのGemfileの変更です。`sassc-rails`を追加して、`sass-rails`と`compass-rails`を削除します。

```rb:Gemfile
# 以下の2行は削除
# gem 'sass-rails'
# gem 'compass-rails'
gem 'sassc-rails' # 追加
```

そして、`bundle install`しておきます。

### config/environments/development.rb の編集

sassc-railsのreadmeに書いてありますが、sourcemapを作るために、以下を追記しておきます。

```rb:development.rb
config.sass.inline_source_maps = true
```

### compass-mixinの導入

次に、compass-mixinを導入します。
今回は、compass-mixinをzipで落としてきてvendorディレクトリに設置しています。
npmを使っている場合は`npm install compass-mixin`とかでできるかもしれません（未検証）。

[github: Igosuki/compass-mixins](https://github.com/Igosuki/compass-mixins) にアクセスして、ブランチのところからタグの0.12.10を選んでzipでダウンロードして、`vendor/assets/stylesheets`以下に置きました。
解凍後のフォルダにはバージョン名が付いているので、その部分は削除します。

### application.scssの編集

あとは、compassの読込をcompass-mixinsのほうに向けます。

```scss
// 以下の1行を削除
// @import "compass";

// 追加
@import "compass-mixins/lib/compass";
// 他にcompassのアニメーションなどを使っている場合は追加
@import "compass-mixins/lib/animation/core";
```

これで終わりです。

## 測定:本当に4倍速かった

一応、ベンチマークをとりました。
やったのは、ベンチマークする度にとあるクラスのpadding-topの値を1ずつ上げていく、というものです。

||sass-rails & compass-rails|sassc-rails & compass-mixin|
|---|:------------------------:|:-------------------------:|
|1回目| 24933 ms | 6349 ms |
|2回目| 25854 ms | 6455 ms |
|3回目| 24828 ms | 6471 ms |
|4回目| 24551 ms | 6391 ms |
|5回目| 24070 ms | 6276 ms |

25秒近くかかっていたsassのコンパイルが6.4秒程度になりました！
sassc-railsのページに４倍速いと書かれていましたが、確かに4倍近く速くなってます。
これならまだ耐えられる気がします。

## まとめ

sassc-railsは確かに速い！
しかし、libsassは最新のsassの機能が全て使えるわけではない点に注意が必要です。
最新機能に依存していないのだったら、sassc-railsに移行するのはありだと思います。

### 参考URL

- https://github.com/sass/sassc-rails
- https://github.com/Igosuki/compass-mixins
- [C/C++のSass Compilierのlibsassを試してみた - 69log](https://blog.kazu69.net/2015/02/21/try-sass-compilier-c-c-libsass/)
git-ftpで、特定のサブフォルダだけPush（デプロイ）する

プリプロセッサ（pug,scss等）を使ってコーディングしていると、

* proj_dir
    * dist
        * css
            * app.css
        * index.html
    * dev
        * pug
            * index.pug
            * _elements
                * _header.pug
                * _footer.pug
                * _sidebar.pug
        * scss
            * app.scss
            * _partials
                * _toppage.scss
                * _subpage.scss
                * _header.scss
                * _footer.scss
    * node_modules

こういうことになると思います。

で、distだけ、FTPでデプロイしたいとき、git-ftpでは、どうやるのかな、と。

# やり方
こうでした

```bash:bash
git config git-ftp.syncroot dist/
```

# 参考
* https://github.com/git-ftp/git-ftp/issues/46
[obsolete] CentOS に Heroku Toolbelt をセットアップ

#内容が古くなりました

新バージョンのリリースにより本記事の内容が通用しなくなっています。
新バージョンを利用する場合は下記記事を参照してください。

http://qiita.com/teruo-oshida/items/54f46b91590a3497949e

- - -


#まえおき

Heroku を操作するにはシェルで heroku コマンドを利用する必要があります。
heroku コマンドを利用するには事前にインストールする必要があります。　←当たり前

https://devcenter.heroku.com/articles/heroku-command-line

Ubuntu ではパッケージやリポジトリが用意されていて簡単にインストールすることが可能ですが、CentOS でも特に難しくありません。
本記事では、ユーザの home にセットアップした際の手順を紹介します。


#成功した環境

- CentOS 6.8 x86_64
- ユーザの home に rbenv がセットアップされている
- rbenv に ruby 2.3.1 がセットアップされている

具体的には、下記手順で構築した環境を利用しました。
https://github.com/matsueoss/hiyaoroshigo/wiki/Minimal-steps-to-install-our-Rails


#しくみ

"Standalone version" のインストーラを覗いてみると、単にアーカイブを展開しているだけでした。
そのアーカイブを、フツーに ~/ に展開して、フツーにパスを通すだけで、使えるようになります。


#手順概要

1. Standalone インストーラをダウンロード
1. Standalone インストーラ内で利用しているツール本体のアーカイブをダウンロード
1. アーカイブを展開
1. パスを通す


#実践

```
$ wget https://toolbelt.heroku.com/install.sh
$ grep tgz ./install.sh # ここでツール本体の URL を確認して、次に進みます。
$ wget https://s3.amazonaws.com/assets.heroku.com/heroku-client/heroku-client.tgz
$ tar xf heroku-client.tgz
$ sed -i -e "/^export PATH$/i PATH=\$HOME/heroku-client/bin:\$PATH" ~/.bash_profile
$ export PATH=$HOME/heroku-client/bin:$PATH
```

`heroku --version` でエラーが出なければ成功です。
install.sh と heroku-client.tgz は消してしまって問題ありません。
文字列の先端からBOMを省く

BOM(バイトオーダーマーク)死すべし。慈悲は無い。

# BOM って何？
こちらが [Wikipedia](https://ja.wikipedia.org/wiki/%E3%83%90%E3%82%A4%E3%83%88%E3%82%AA%E3%83%BC%E3%83%80%E3%83%BC%E3%83%9E%E3%83%BC%E3%82%AF) です。

# なんで消すの？
csv.DictReader とか使ってるとヘッダの頭に BOM がつくので、1行目 seq とかで取り込むと思ってたら `<0xEF>seq` みたいなヘッダが出来上がりますね。

# どうやって消す？
- nkf で消せばいいと思います。
- プログラム側で消してもいいかもしれません。


## コマンドラインで消す
```
$ nkf --overwrite -oc=UTF-8 filename
```
こっちが王道だと思います。読み込む前から消しておけばどうということはない。

## アプリケーション側で消す
必ずしも取り込み前に消せるとは限らないので。

```
import codecs
def strip_bom(s):
    s = s.encode('utf8')
    if s.startswith(codecs.BOM_UTF8):
        return s[len(codecs.BOM_UTF8):].decode('utf8')
    return s.decode('utf8')
```

`codecs` モジュールに `BOM_UTF8` という定数が用意されてるのに `open` のオプションとかで消せないの何故なんだぜ？
chromeのデベロッパーツールにsourceとconsoleを両方表示する

##はじめに
　最初は出てるはずなんですけど。
　いつの間にかsourceタブからconsoleが消えてたときのために。Escとか押すと意図せず消えてたりします。

# やること
　Esc押し直すか
　右上の点が縦に3つならんだメニューが出てきそうなやつ 
 (chrome本体の方じゃなくてデベロッパーツールの方。×マークの左にあるかも？）
　をクリックして 'Show console Drawer'クリック。
HTMLデザイン検収に、WEBページを直接WYSIWYGできる「jQuery Console」を利用する

```
「jQuery Console」 を機能別に小出しでご紹介しております。
```
# ケース：HTMLデザイン検収に
```
本題は次項です。こちらはあくまで「使用例」としてご覧ください。
```
WEBサイト制作において、HTMLのコーディングまではデザイン会社。システムへの組み込みはシステム会社の分担で作業を行う際、
デザイン会社より納品いただいたHTMLデザインをシステム会社でチェックする時のお話。（WEB担当者・デザイナーの方にも寧ろおすすめです）

納入していただいたHTMLコードデザインをチェックする時、致命的になりがちなのが、**「幅考慮の不足」**の見逃しだったりします。
> 「幅考慮の不足」：HTMLデザインはきれいな表示なのに、いざ、システムに組み込むと、「動的に変化する要素（金額・名称・説明文等）」の幅によってデザインが崩れてしまう事

要件定義で決められていても、検収期間を過ぎてしまい、修正が依頼できない自体になる事も・・
「説明文」であれば一定文字数で切り捨てる等の対応できますが、「コード・番号」、「金額」等はそうもいかず、やむなくHTMLをいじってしまう事態に陥ります。
そうならない為にも、おすすめなのが以下。

# 既存WEBページだってWYSIWYG(直接編集)できる「jQuery Console」

ひとまず手軽にチェックできるのが**「jQuery Console」**の**「直接編集」**機能。

![jqc001n.gif](https://qiita-image-store.s3.amazonaws.com/0/65983/0c4728a3-40ec-fac6-069c-e33705770ec4.gif)
上記の様に簡単なテキスト修正であれば可能です。（SSL環境下でも、ローカルのhtmlファイルにも対応しています）
F12開発者ツールでHTMLを探る手間もなく、その場で的確かつ直感的にレビュイーに指摘することができるでしょう。

# 使い方
http://ltside.com/jqc/
を参照。指定のリンクをブックマークに登録し、対象のページでブックマークを開くと右の操作画面がポップアップで開きます。詳細な説明は、リンク先参照。
C++プログラマがWindows上でCaffeを使ってDeep Learningするお話（８）　識別（詳細）編

いよいよ最終回の「classification.exe」の中の処理の解説です。
WindowsネイティブでCaffeを使った認識アプリを作る場合は、これを知っておくのが一番手っ取り早いです。

では始めます。

# 準備

## モデルの準備
認識処理を行う前に、まずモデルの準備をします。
引数で指定した、認識用のモデルと、学習済みのモデルを読み込みます。

```
/* Load the network. */
net_.reset(new Net<float>(model_file, TEST));
net_->CopyTrainedLayersFrom(trained_file);
```

「net_」は

```
shared_ptr<Net<float>> net_;
```

と宣言されている、ネットワーク全体を表すクラスのオブジェクトとなります。

## 入力画像の準備
次に、ネットワークから入力画像設定のため、ブロブを取り出します。
そして、そのブロブから入力データの情報を取得します。

```
Blob<float>* input_layer = net_->input_blobs()[0];
num_channels_ = input_layer->channels();
input_geometry_ = cv::Size(input_layer->width(), input_layer->height());
```

## 平均画像の設定
次に、平均画像ファイルをネットワークに設定します。
平均画像ファイルはバイナリのProtocol Buffersになっていますので、Caffeで利用できる形式に変換します。

変換処理はOpenCVで書かれているので、順を追ってみていけばわかりやすいと思います。
（ここではコードは省略）

## ラベルの読み込み
これは「必要であれば」の処理になりますが、このサンプルでは認識した結果を、分類番号ではなく分類名で表示するため、分類名の一覧を読み込んでいます。

## 出力分類番号の準備
最後に評価結果を取得するためのブロブを、ネットワークから取得します。
（入力と対になるイメージです）

```
Blob<float>* output_layer = net_->output_blobs()[0];
```

# 認識

## 対象画像の読み込み
認識させたい画像を読み込みます。
OpenCVのimread()で読み込んでいますので、多くの画像フォーマットに対応していることになります。

## 画像の認識
ネットワークに認識させたい画像を設定します。
実際には、まず入力用のブロブを取得し、全レイヤーで使用するチャンネル数、画像サイズを調整します。

```
Blob<float>* input_layer = net_->input_blobs()[0];
input_layer->Reshape(1, num_channels_, input_geometry_.height, input_geometry_.width);
/* Forward dimension change to all layers. */
net_->Reshape();
```

次に、入力画像を読み込むためのバッファを用意し、そこに入力画像を設定します。
設定する際に、フォーマット変換やリサイズなどの処理を行います。
この処理もOpenCVで書かれているのでわかりやすいです。

その後、順方向に処理を行います。

```
net_->Forward();
```

最後に、認識結果として出力された上位5つ（デフォルト）の確率と分類名の組み合わせで一旦保存します。

# 出力
認識した結果を出力します。
認識結果として一旦保存された確率と分類名を、標準出力に表示します。

# 備考
これで、WindowsネイティブでCaffeを使った認識アプリを作れるようになったと思います。
できればGUI付きにしたいと思いますので、今後は、MFCや.NETと組み合わせたアプリを開発し、そのノウハウを公開していきたいと思います。

# 関連記事
[C++プログラマがWindows上でCaffeを使ってDeep Learningするお話（１）](http://qiita.com/mine820/items/37862e45aa66c2ad8b80)
[C++プログラマがWindows上でCaffeを使ってDeep Learningするお話（２）](http://qiita.com/mine820/items/9ea5812fc25a70419f31)
[C++プログラマがWindows上でCaffeを使ってDeep Learningするお話（３）](http://qiita.com/mine820/items/f4395a3ac734085e5ed1)
[C++プログラマがWindows上でCaffeを使ってDeep Learningするお話（４）](http://qiita.com/mine820/items/41347cd99278d0dc6715)
[C++プログラマがWindows上でCaffeを使ってDeep Learningするお話（５）](http://qiita.com/mine820/items/e8857fee3fa0b4ada170)
[C++プログラマがWindows上でCaffeを使ってDeep Learningするお話（６）](http://qiita.com/mine820/items/01a275d1065d299702fc)
[C++プログラマがWindows上でCaffeを使ってDeep Learningするお話（７）](http://qiita.com/mine820/items/1e100330d163f9959c65)
SPAによって動的に生成されるページのHTML IDタグの扱い方

#問題
html+javascriptでSinglePageApplicationを組んだら状態が遷移しなくて困ったという話。

#前提
htmlとjavascriptに関する経験と知識がまったくなし。
とにかくやりたかったことをなんとか実現できたので、そのメモ。
解決策はただ常識かもしれない。
もっといい実装があればアドバイスを求む。

#ハマりどころ
##事の初め
動的にhtmlページを編集するためにjavascript/jQueryを使用。
いくつかのページ間の切り替えを、ページをpushすることで表示させるSPAを組んだ。
そのうちの一つのページ内で、ボタンをクリックすることで、リストに項目を追加する機能を実装したかった。
##不測の事態
一度目のpushでは問題なく機能。
ページを再pushするとボタンが動作しなくなった。

#原因
ボタンとリストのhtml idタグを使ったことが問題。
再度pushすることでhtml idが衝突して、新しく表示されているページを操作できなくなった。

#解決策
##idタグのまま行きたい場合
ボタンのクリック制御を.click(function{})から.on('click',function{})にする。

ダメなやつ

```js:button-notworking.js
$('#button').click(function {doSomething!})
```

動くやつ

```js:button-working.js
$('#button').off('click')
$('#button').on('click', function {doSomething!})
```

この方法はイベントについては何とかなるが、リストの.appendには使えない（？）

##classタグを使用
idタグを諦めて、classタグを使って制御すれば衝突を回避できる。

ダメなやつ

```js:list-notworking.js
$('#list').append(Something!)
```

動くやつ

```js:list-working.js
$('.list').last().append(Something!)
```

同名classのうち一番最後のものが表示されているものなので、.lastで取得してきた。

#参考
[jQuery.on()は追加式なのでイベントの重複登録に注意しよう](http://qiita.com/nekoneko-wanwan/items/3d3da95f1127f743397d)
docker の node イメージは Debian なので apt-get で ansible をインストールできない

docker 公式の node イメージから派生して ansible を入れたい要件があって、[Installation — Ansible Documentation](http://docs.ansible.com/ansible/intro_installation.html#latest-releases-via-apt-ubuntu) に書いてある方法で ansible をインストールしようとしたらうまくいかなかった。

原因は node イメージが Ubuntu ではなく Debian だったからで、下記のように easy_install + pip を使うようにしたらうまく入った。

```
RUN apt-get update && apt-get install -y python-setuptools python-dev
RUN easy_install pip
RUN pip install ansible
```

入ったバージョンは 2.2.0.0 だった。

```
root@8526546a807c:/opt# ansible --version
ansible 2.2.0.0
  config file = 
  configured module search path = Default w/o overrides
```

[ansibrest/Dockerfile at master · muddydixon/ansibrest](https://github.com/muddydixon/ansibrest/blob/master/Dockerfile) にも反映されている。
PlantUML導入手順

#plantUMLとは
テキストベースでUMLを記述でき、その結果を画像として出力できます。テキストベースなのでGitなどのバージョン管理ツールで世代管理できたり、記述が簡便などのメリットがあります。出力形式はpng,svg?に対応しています。PDFにはデフォルトでは未対応ですが、設定で[svgから変換可能](http://plantuml.com/pdf)です。

![image](https://qiita-image-store.s3.amazonaws.com/0/94585/24e0aa2c-f3b9-67bb-dd93-8863457cd128.png)
(出典：http://yohshiy.blog.fc2.com/blog-entry-152.html)



#インストール
私はwindows10でインストールをしました


http://yohshiy.blog.fc2.com/blog-entry-152.html
上記を参考に進めていきます

　０．Javaのインストール
　　https://www.java.com/ja/download/manual.jsp
![image](https://qiita-image-store.s3.amazonaws.com/0/94585/df27f839-9d65-9e31-c638-0b779129c89f.png)

　　ダウンロードしてきたインストーラーでJavaの実行環境をインストールをします

　１．PlantUMLのダウンロードとインストール
　　http://plantuml.com/download
![image](https://qiita-image-store.s3.amazonaws.com/0/94585/4aeb3be6-ee87-3865-0e7e-fa6c723e155e.png)
広告がたくさんあってダウンロードリンクがわかり辛いですが画像で示したところにあります

「plantuml.jar」というファイルがダウンロードされます
これが実行ファイルになりますので、インストール作業は不要です

#使用方法
テキストでUMLを記述します


```:uml.txt
@startuml sample.png
Foo -> Bar : message
Foo <-- Bar
@enduml
```

「plantuml.jar」を起動してディレクトリを指定すると uml.txt を読みこみます
読み込みが終わると特に操作をせずとも sample.png という名前でUMLの画像ファイルが作成されます

![image](https://qiita-image-store.s3.amazonaws.com/0/94585/b5041bdf-8d67-a9cf-0610-d01830535424.png)



#参考
http://plantuml.com/
http://yohshiy.blog.fc2.com/blog-entry-152.html
ESLint対応物語 ~no-script-url~

ESLintでair_bnbとか入れたらたくさん怒られた！
ルールの内容自体は検索すれば出てくるけど、具体的にどうすればいいのよ！？
っていう場面が何度かあったので、具体的な対応方法をまとめていきたいシリーズです。

今回は**「no-script-url」**＝**「hrefに "javascript:" を入れてはいけない」**というルールの紹介と対応方法をまとめたいと思います。


## 具体的にはどんなもの？
一番引っかかるのが、aタグのリンクを無効化するための下記かと思います。

```html
<a href="javascript:void(0)" onClick={hoge}>クリック</a>
```


## 何故いけないのか
簡単に書くと、

 - 重い
 - 汚い
 - 危ない（XSS脆弱性）

から、だそうです。
[参照：What is the matter with script-targeted URLs?](http://stackoverflow.com/questions/13497971/what-is-the-matter-with-script-targeted-urls)


## 対応例1、hrefを取ってしまう
一番手っ取り早いのがhrefを取ってしまうことです。
後述の2つのデメリットをクリアできるなら、こちらで対応するのが良いかと思います。

```html
<a href="javascript:void(0)" onClick={hoge}>クリック</a>
 ↓
<a onClick={hoge}>クリック</a>
```

### メリット：とにかく簡単
すぐにできます。

### デメリット1：htmlとして適切で無い場合がある
html5では、hrefの無いa要素を "プレイスホルダ" と定義され、まだリンク先がまだ存在しない、あるいは存在したが削除された場合などに使うものとされています。
単純にJavaScriptを動かしたいだけでこちらを使うのは目的があっていません。

### デメリット2：CSSがうまく当たらなくなる場合がある
次の場合に起こります。

```css
.pageContents a {
    color : green;
}
.pageContents a:link, a:visited {
    color : blue;
}
```

```html
<div class="pageContents">
    <a href="javascript:void(0)" onClick={hoge}>クリック</a>
</div>
```

この状態で、hrefを消すと、青色だった "クリック" は緑色になってしまいます。
linkとvisitedの擬似要素はhrefに依存しており、hrefがなくなることで効かなくなってしまいます。
これにより、緑色と青色の使い分けができなくなってしまうのです。


## 対応例2、buttonタグに変える
そもそもaタグはanchar（アンカー＝錨）の略です。
あるリソースから別のリソースへ錨を降ろすことで、2つのリソースを繫ぎ止めるために使われます。
ですのでaタグのリンクっぽい見た目をクリックさせたいからといって、aタグ本来の役割を殺す「href="javascript:void(0)"」は正しい使い方とは言えません。
そこで「それを押して、何かしらの機能が動くもの」としてより適切なbuttonタグに差し替える、というものです。

具体的な記述例です。

```sass
.linkText {
    color : blue;

    background: none;
    border: none;
    cursor: pointer;
    display: inline;
    font: /* リンクで使っているフォント */
    height: auto;
    width: auto;
    padding: 0;
    margin: 0;

    &:hover {
        text-decoration: underline;
    }
}
```

```html
<div class="pageContents">
    <button class="linkText" type="button" onClick={hoge}>クリック</button>
</div>
```

cssではaタグっぽい見た目にするための記述、ボタンっぽさをなくす記述を入れます。
また、buttonタグでは「type="button"」とすることで、formと連動させないようにできます。

### メリット：html的に正しい
ブラウザフレンドリーです。
用途にもよりますが、tabキーでフォーカスが当たるのも良いところです。

### デメリット：CSSが大変
古いブラウザも対応しようとすると大変かもしれません。。。


## まとめ
- no-script-urlの対応として2つの具体的な方法を紹介しました。
- メリ・デメを考慮してやりやすい方法を選ぶと良いかと思います。

## 参考資料
- [eslint no-script-url](http://eslint.org/docs/rules/no-script-url)
- [HTML5 Tag Reference](https://reference.hyper-text.org/html5/element/a/)
- [HTMLクイックリファレンス](http://www.htmq.com/html5/a.shtml)
SQLServer: クエリの初回実行だけやたらと遅いときに考えられる原因

SQLを初めて実行するときだけ、やたら重いという経験ありませんでしょうか？
同じSQLの2回目以降の実行はめちゃ速いのに。。。みたいな。

まさにその状況が発生したのですが、「統計情報の自動作成」が原因でした。
（業務で使用するSQLのため載せられませんが、ちょっと複雑なSELECT文です。）

アドホッククエリなので初回のコンパイル時間も疑ってみましたが、option(recompile)つけても高速でした。（もちろんクエリキャッシュにヒットするよりはコンパイルの分だけ時間かかりますが、気にならない程度でした）


![captha.png](https://qiita-image-store.s3.amazonaws.com/0/148310/6c11ed40-9858-426e-2c63-e75cdf66b535.png)

SqlServerProfiler でのキャプチャ結果


このAuto Stats(統計情報の自動更新)が走るとどうなるかというと、該当のテーブルの統計に新しい統計情報が作成されます。(「_WA_Sys_00000008_0T12DVFAG」　みたいなやつ)

SQLの述語の中で使われているカラムに対して自動作成されるっぽいです。
が、_WA系の統計が作成されるのは無駄、という意見もあるようです（http://ryuchan.hatenablog.com/entry/2014/03/23/184242）

ためしにAuto Statsおきないように設定変えてから、同様のクエリを実行したところ一回目から高速でした。なので確かに_WA系の統計はいらないのかも。。。少なくとも、統計情報は非同期更新されるように設定しておいたほうが良いのかもしれません。

とにかく原因は分かったので、これでクエリの初回実行時にめちゃくちゃ時間かかっても焦ることはなくなりそうです！

_Waな統計に関する情報は以下が詳しそうでした。（深堀するとどうしても日本語の文献が少ない。。。）
https://www.mssqltips.com/sqlservertip/2734/what-are-the-sql-server-wasys-statistics/
Keras image_dim_ordering について

Kerasをバージョンアップしたら、それまで動いていたコードが動かなくなりました。以前使っていたKerasのバージョンは 0.8.0 とかで、現在の最新は 1.1.1 です。
image_dim_orderingが変更([バックエンドが変更](https://github.com/fchollet/keras/commit/82318263a1e270ff5412609964bfa31a886558e9))になっていたので、[このコメント](http://qiita.com/mkisono/items/f19a0efe94b6e6d5d7c5#comment-58b68c28bfc1c138727d)に書いたように、コードを変更すれば動くはずです。

ところが、複数ある環境のうち、モデルのコンパイルがうまくいく環境とそうじゃない環境があり、私にとっては、しばらく謎の現象でした。
ようやく分かった原因は、~/.keras/keras.json ファイルでした。
古いバージョンからバージョンアップした場合は、keras.jsonファイルは書き換えられず

```
 "image_dim_ordering": "th", 
```

のままになっていました。
これを

```
 "image_dim_ordering": "tf", 
```

に変更することで、モデルのコンパイルがうまくいくようになりました。

これまではどうしていたかというと、以下のコードを追加してました。

```py
from keras import backend as K
K.set_image_dim_ordering('tf')
```

環境ごとに異なっていた Keras動作違いの原因が分かってスッキリしました。
\# TheanoとTensorflowを切り替えたりする人は面倒ですね。
シングルヘッダでつくるアクターモデルライブラリ

C++でアクターモデルを実現するためのライブラリをシングルヘッダファイルで作成しました。
アクターモデルと聞くとムズカシイ印象を受けるかもしれませんが、仕組みを実現するだけならそんなに難しくない、ということが伝える目的で書いてみました。

ポイントは以下のとおり。

- C++の標準ライブラリのみで実装(thread,chrono,mutex,atomic,queue)
- 性能よりも構成要素の小ささを優先

[MiniActor](https://github.com/toshimana/MiniActor)

# アクターモデルとは

アクターモデルは並列計算の数学的モデルの一種です。並列処理指向と言われるErlangや関数型言語Scalaでも使われています。
ざっくりとですが特徴をあげておきます。

- あるアクターオブジェクトは同時に高々一つの(スレッド、プロセス、PC)上で動作する。
- アクター同士はメッセージによる非同期通信を行う。
- アクターは個別にメッセージボックスを持っている。
- アクターはメッセージの送受信でのみ他のアクターとデータのやり取りを行う。

以下、Wikipediaより引用。
> アクターモデル（英: actor model）とは、1973年、カール・ヒューイット、Peter Bishop、Richard Steiger が発表した並行計算の数学的モデルの一種[1]。アクターモデルでは、並行デジタル計算の汎用的基本要素として「アクター」という概念を導入している。アクターモデルは並行性の理論的理解のフレームワークとして使われるほか、並行システムの実装の理論的基礎としても利用されてきた。

[https://ja.wikipedia.org/wiki/%E3%82%A2%E3%82%AF%E3%82%BF%E3%83%BC%E3%83%A2%E3%83%87%E3%83%AB]

# アクターモデルは何が嬉しいのか

個人的に感じるアクターモデルの利点を書いておきます。

- アクターの受け取ったメッセージに対する処理は逐次的に記載できる。(メッセージボックスへのデータ入出力部などは同期処理が必要だが容易に隠蔽できる)
- 同期処理による不必要な待ち時間を減らすことができる。
- ロックをほとんど使わないのでデッドロックの心配がない。
- メッセージ以外の入力がないため処理が把握しやすい。

# 「MiniActor」

アクターモデルに基づいたプログラムを実現するために作成したシングルヘッダライブラリです。
VC2015,GCC4.8.1,clang3.4で動作確認済み。

## できること

- C++標準ライブラリのみの使用による、他の外部ライブラリを用いない導入
- スレッド単位のアクター動作
- 任意の型によるメッセージ送受信(Template引数によるメッセージの型の指定)
- スレッドを立てないメッセージ送受信(GUIスレッドなどで利用)
- Two-Phase Termination(スレッドの停止→オブジェクト破棄)

## できないこと

- 高速処理(性能より読みやすさを重視)
- たくさんのアクターを立てる(OSのスレッド数に依存)
- 高度な例外処理(例外に対してはほぼ無考慮)

## 使い方

MiniActorの使い方例です。

### Example01 : 文字列を送る

文字列を受け取って、標準出力に出力するアクター(EchoActor)の例です。

- MiniActor::Actorを継承したアクタークラスを定義します。そのさい、テンプレート引数にはメッセージの型を指定してください。
- 受け取ったメッセージの処理内容はprocess_message関数に定義します。
- アクターにメッセージを送るには、send関数を利用してください。
- アクターを停止するときは、halt関数を実施してください。アクターは終了状態となり、メッセージ処理を終了して自身のスレッドを停止します。


```cpp:example01.cpp
include <iostream>
#include <string>

#include <MiniActor.hpp>

struct EchoActor : public MiniActor::Actor<std::string>
{
	void process_message(const Message& msg)
	{
		std::cout << "received message: " << msg << std::endl;
	}
};

int main()
{
	EchoActor actor;
	actor.send("Test");
	actor.send("Hello");
	actor.send("World");
	
	std::this_thread::sleep_for(std::chrono::seconds(1));

	actor.halt();

	return 0;
}
```

### Example02 : アクター同士での通信

2つのアクターがそれぞれ受け取った値をインクリメントし、相手側に返す例です。

```cpp:example02.cpp
#include <iostream>
#include <string>

#include <MiniActor.hpp>

struct CountActor;
using SpCountActor = std::shared_ptr<CountActor>;
using WpCountActor = std::weak_ptr<CountActor>;

struct CountActor : public MiniActor::Actor<std::pair<int,WpCountActor> >, std::enable_shared_from_this<CountActor>
{
	void process_message(const Message& msg)
	{
		std::cout << std::this_thread::get_id() << " : " << msg.first << std::endl;

		SpCountActor sp = msg.second.lock();
		if (sp) {
			sp->send(std::make_pair(1 + msg.first, shared_from_this()));
		}
	}
};

int main()
{
	SpCountActor actor1 = std::make_shared<CountActor>();
	SpCountActor actor2 = std::make_shared<CountActor>();

	actor1->send( std::make_pair(0, actor2));
	
	std::this_thread::sleep_for(std::chrono::seconds(1));

	actor1->halt();
	actor2->halt();

	return 0;
}
```

### 後で書き足したいモノ
- メインスレッドでメッセージを受け取る例
- Boost.Variantを利用して、メッセージを型で定義する例
- Boost.MSMを利用して、アクターの状態遷移を定義する例
ZendFramework2(ZF2) でExceptionをcatch

前回のプロジェクトはなんとか無事終わって、今度はPHPでZendFrameworkの案件をやっています。
(ZendどころかPHPすらやったことないので、毎日手探り状態です）

幸い、新規開発ではなく機能追加開発なのでベースソースがあるのですが、そのソースがいけてなさすぎ。。
ビジネスロジックがすべてControllerに書かれていて各Actionがとにかく長い。

そして、ある機能の調査中なぜかExceptionをcatchできな現象に遭遇しました。

```
try {
    // DBアクセスなど
}
catch (Exception $e) {
    // エラー処理
}
```

ソース上はちゃんとExceptionをcatchするように記述されているので？？？でしたが、なんどやってもcatchできません。
ただ、Eclipse上でF3キーやカーソル合わせてCtrl押下してもExceptionクラスに飛べないのでなんでかな～と思って調べていたらStack Overflowに同じ質問が

http://stackoverflow.com/questions/13108482/how-to-catch-exceptions-in-your-zf2-controllers

zendでExceptionを使う場合は¥Exceptionと書く必要あるようです
BINDの脆弱性対応手順マニュアル

以前自身のブログでまとめたものを、いただいたリプライや後から知った情報を含め
かきなおしたものです。すでに日常的に脆弱性対応されている方というよりは、「なんかしらんけどDNSサーバの管理者になっていた。とりあえずBINDというソフトウェアで動いていることは知っている」という方向けだと思います。

#１．BINDの脆弱性の発表をキャッチする 
BINDの脆弱性について、世の中で一番早く発信するのはBINDの開発・保守を行っているISC（Internet Systems Consortium）です。そこからの情報をキャッチする主な手段としては以下があげられます。

**・[ISCが提供しているメーリングリストへの登録](https://lists.isc.org/mailman/listinfo)
・ISCが提供しているRSSを利用する
・ISC公式twitterをチェックする(@ISCdotORG)**

ISCはBIND Subsprictionという有料サポートを提供していて、それに加入していると５日～３日早く脆弱性情報が提供されるそうですが・・・とてもお高いそうなので加入を選択肢に入れることはないでしょう(；´Д｀)
そのほかにも問い合わせに早く回答してくれたり、トレーニングを実施してくれたりという恩恵があるそうなので気になる方はのぞいてみてください。
[BIND Support, Insurance for your DNS](https://www.isc.org/bind-subscription-2/)

英語なのでパッと見わかりにくいですし、個人的にはISC本家について必ずしもびんびんにアンテナを張っていなくてもいいんじゃないかなと思います。理由は後述します。

BINDの脆弱性について、次に発信してくれるのはJPRSです。日本の.jpドメインの管理をしている会社です。緊急性の高いBINDの脆弱性が発表されると迅速にアナウンスを出してくれます。
上司や客先に説明するときに、JPRSのアナウンスを印刷して持って行くと説明がしやすいです。JPRSはBIND以外のDNSのソフトウェアについてもアナウンスを出しています。

[JPRS DNS関連技術情報](https://jprs.jp/tech/)
その他JPCERT/CCが出すアナウンスもあります。JPCERT/CCはDNS関係だけではなく脆弱性全般について取り扱っているので、普段からチェックしておいて損はないと思います。
[Japan Vulnerability Notes](http://jvn.jp/)

ISC本家について必ずしもビンビンにアンテナを張っている必要はない、と言ったのは、このJPRSやJPCERT/CCのアナウンスがあるからです。

#２．対応するかどうかを決める
これは、環境によって異なるのでなんとも言えないのですが、私の場合はJPRSが反応しているものは即、対応の対象にすると決めています。JPRSからのアナウンスでは、緊急性の高いものはタイトルに（緊急）とついています。

あとは以下の観点から判断しています。

**・対象のサーバが外に出ているかどうか**
→FWで守られているかどうか。~~外に出ているものであれば、一刻も早く対処しないといけないです。~~(ただし、FWの内側にいても、外部に自由に名前解決できる状態で攻撃を受ける例もあるそうで…そのへんは分かったら追記しますね。）リモートで攻撃可能な脆弱性だといつ攻撃を受けるかわかりません。脆弱性が公表された後すぐに攻撃ツールが出回ることもあります。過去の脆弱性には「BINDコロリ」と称されるものも・・・。

[攻撃ツールが出回ったことが追記されたJPRSからのアナウンスの例](https://jprs.jp/tech/security/2016-09-28-bind9-vuln-rendering.html)
[BINDコロリだった例](https://jprs.jp/tech/security/bind9-vuln-dynamic-update.html)
参考：[BINDコロリの定義](https://mobile.twitter.com/orangemorishita/status/780983049186082817)

**・脆弱性によって受ける影響が大きいかどうか**
→JPRSのアナウンスを読むと、どのような条件でどのような影響を受けるかがわかります。サービス停止だと、会社の業務が停止する可能性もあると思います。（DNSに限って言えば個人情報漏洩などはあんまり考えられないですけど・・・ゾーンがまるまる取られることがあると、動作しているサービスが予測されるのでやはり良くないですね）
基本的には脆弱性にはすべて対応すべきだと思っています。ただし、実際に対応するか、いつまでに対応するかどうかは実際の環境や、対応にかかる工数とリスクを天秤にかけて、上司や客先と相談して判断すべきだと思います。

#3.対応作業を実施する
私はlinux系のOSでしかDNSサーバを運用したことがないので、linux系に限って書きます。

**・BINDをソースでインストールした場合**
ISCが提供している修正版のソースを落としてきて、configure→make→make installのいつもの流れで修正版をインストールします。make installをする前に、named.confなどの設定ファイルのバックアップをとっておく、修正版のソースを展開したあとに、修正版のnamed-checkconfを使って動作中のBINDのnamed.confのコンフィグチェックを実施するとより安心です。
私自身BINDの脆弱性対応で、make installしたあとに、BINDを起動させたら、全然起動してこなくてすごーく焦った経験があります。バージョンアップにより動作が変わり、新バージョンでは今まで使用していたnamed.confの設定を受け付けなくなったことが原因でした。

**・BINDをパッケージでインストールした場合**
ディストリビューションが修正版をリリースするまで待つことになります。リリースされたらパッケージのアップデートをすればOKだと思います。ただし、念のために、named.confなどの設定ファイルとかはバックアップをとっておいたほうがいいかもしれません。

twitterのフォロワーさんであるまこぴさんがRHEL互換OS向けの書いてくださっています。
つまづくポイントしっかり書いていらしてすばらしいです。
https://twitter.com/makopicut/status/690936951642279936

長くなりましたが、私はこんな感じで脆弱性対応をしています。
って、年に5～6回こんなことをするのも面倒なので・・・・BIND以外のソフトウェアにシフトしていきたいですね(；´Д｀)
技術英語 > That's not for you or me to decide. / I cannot protect you from the natural conclusion of life, [nor would I try].

@ Star Trek Voyager > INNOCENCE

言い合いをしているTuvokと異星人。

Tuvokの反論に対して異星人のリーダーが

> <font color=red>That's not for you or me to decide</font>. This is a normal biological process...

それを決めるのは「あなたでも私でもない」。

納得したTuvokがTressaに対して

> I cannot protect you from the natural conclusion of life<font color=red>, nor would I try</font>.

意訳「xxxはできないし、そうしようともしない」
任意の場所からtar.gzアーカイブをつくって、任意の名前で展開する


ソースコード（ローカルのgitレポジトリ）のバックアップとかに。

# 圧縮

- `~/hello_world`の中身を`/tmp/app.tar.gz`にアーカイブする
- `.git`は除外する

```bash
~$ ls -a hello_world/
.		..		.git		.gitignore	Procfile	README.md	app.py
~$ tar -C hello_world -czf /tmp/app.tar.gz --exclude .git .
```


# 展開

- `/tmp/app.tar.gz`を`/tmp/app`に展開する

```bash
~$ mkdir /tmp/app && tar xzf /tmp/app.tar.gz -C /tmp/app --strip-components 1
~$ ls -a /tmp/app
.		..		.gitignore	Procfile	README.md	app.py
```


参考: http://qiita.com/naoyes/items/a218a137b1a978ef59ce
ブラウザでsay PPAP🍍🍎✑

帰ってきた[WebSpeechSynthesisAPI版](http://qiita.com/kimama1997/items/1e605c0942c715230cc2)

ふと気がつくと[JavaでPPAP](http://qiita.com/hmhmsh/items/a9c1848437b765e538d3)してる人がいた。

Siriに聞いても歌ってくれるしダウンロードランキングに何故かいるうちにChromeに~~喋って~~歌ってもらおう。

思いつきで書いてしまった。(結果寝れなかった)

```js
let finished = false;
const s = new SpeechSynthesisUtterance();
const ppap = [
  'ペン',
  'パイナップル',
  'アップル',
];
/**
  0: undef,
  1: p
  2: pp
  3: ppa
  4: ppap
*/
let state = 0;

const next = ()=>{
  if(finished)return;
  const n = Math.floor(Math.random()*3);
  let item = ppap[n];
  if (state === n || state === 3 && n === 0) {
    state++;
  } else if (state === 4) {
    finished = true;
    item = 'Pen Pineapple Apple Pen!';
  } else {
    state = 0;
  }
  const p = document.createElement('p');
  p.textContent = item;
  document.body.appendChild(p);
  s.text = item;
  speechSynthesis.speak(s);
};

s.addEventListener('end', next);
next();
```

コードがクソ。

前回とは違ってちゃんと喋り終わってからインクリメントするようになりました。
終わんねぇ

デモ：http://codepen.io/hinaloe/full/bBWPMp/

注意点としてはmacOSのデフォルト音声である**Kyoko**に「**Apple Pen**」を読み上げてもらうと有無を言わずにブラウザがクラッシュする問題があるようです。
(sample: http://codepen.io/hinaloe/pen/XNRveG )

なお、Chromeに付属の**Google 日本語**ではこの問題は発生しませんでした。

自社製品の名前で死ぬってどういうことなんだ……「Apple Pencil」でも同様に死にます。というかこれ「Apple なんとか」で必ず死ぬしどうなってるんだ……
※sayコマンドでこの問題は発生しません

 あ、ちなみにFirefoxだとそのままでは動きません。Firefoxは`SpeechSynthesisUtterance`を使いまわせないみたい。(こっちが正しい挙動？)[=>修正版](http://codepen.io/anon/pen/ENmqOY)
Firefoxでもクラッシュはしない模様。

P.S.
Chrome canaryでも大丈夫だった。環境問題かもしれないしキャッシュかなんか壊れてるのかなぁ(?)、それとも既知の修正住みバグ踏んだ？
わずか8ドルのRaspberryPi互換機 NanoPi NEO でpipを使う


毎度のことですみませんが互換性は一部ピンコンパチなだけです・・・。

最初aptでpython3-pipをいれたんだけど挙動がおかしくなったので、

```bash
sudo apt-get purge python3-pip
wget https://bootstrap.pypa.io/get-pip.py
sudo python get-pip.py
```

としました。

参考: http://blog.mwsoft.jp/article/107122454.html
VSCodeのMarkdownでチェックボックスを表示

これをドキュメントの後ろに追加するだけ！

```
<script>var d=document.body;d.innerHTML=d.innerHTML.replace(/<li>\[(x| )\]/g,m=>`<li>${m=="<li>[x]"?"🔳":"◻️"}`);</script>
```
<img width="630" alt="スクリーンショット 2016-11-24 4.15.15.png" src="https://qiita-image-store.s3.amazonaws.com/0/3057/7429a729-7865-a74e-ea8b-a96d47252608.png">
Android Studioの起動メモリの設定

最近、AndroidStudioの再インストールが増えて、その度に毎回しらべるのがめんどくさくなったので...

## 設定ファイルの場所1

### Mac
`~/Library/Preferences/AndroidStudio/studio.vmoptions`

注意 : `AndroidStudio`のあとにversionがつきます
（自分の現環境では、`AndroidStudio2.2/studio.vmoptions`でした）

## 設定ファイルの場所2

AndroidStudioのメニューの`Help`から`Edit Custom VM Options...`を選ぶと、AndroidStudio上に表示されます。

![スクリーンショット 2016-11-24 2.42.30.png](https://qiita-image-store.s3.amazonaws.com/0/150615/4a505961-d06e-5a56-4e41-c7f48dba46a8.png)

## 設定ファイルの変更

### default

```
# custom Android Studio VM options, see http://tools.android.com/tech-docs/configuration
```

### Custom

```
-Xms1024m
-Xmx4096m
-XX:MaxPermSize=1024m
-XX:ReservedCodeCacheSize=256m
-XX:+UseCodeCacheFlushing
-XX:+UseCompressedOops
```

## 参考
http://dev.classmethod.jp/smartphone/android/android-studio-vm-options/
http://d.hatena.ne.jp/takeR/20150730/1438229352
Riot 3.0.0 でclassが更新されないバグの対応

※ 2016.11.27 追記
ver3.0.1で修正されたようです。
https://github.com/riot/riot/issues/2082

---

Riot v2.* で動作していたシンプルなtodoアプリが、v3.0.0 になって動かなくなりました。

下記のコードは、リストの項目をクリックすると完了フラグをセットしてスタイルを更新する定番のtodoアプリです。

```todo.tag
<todo>
  <ul>
    <li each={items} onClick={toggle} class={completed: isCompleted}>{name}</li>
  </ul>

  <script>
    this.items = [
      {name: 'task1', isCompleted: false},
      {name: 'task2', isCompleted: false},
    ]

    toggle(e) {
      console.log(e)
      e.preventDefault()
      e.item.isCompleted = !e.item.isCompleted
    }
  </script>

  <style scoped>
    li.completed {
      text-decoration: line-through;
      color: #666;
    }
  </style>
</todo>
```

``class={completed: isCompleted}`` は、item.isCompletedがtrueの場合にclass="completed"とレンダリングされるRiotのショートカットです。

動作するサンプル (Riot v2.6.7)
http://plnkr.co/OGrcvQXR10FebdR9PjK7

動作しないサンプル (Riot v3.0.0)
http://plnkr.co/zKfpa1hlEQOWfCwB5ILT

itemsオブジェクトは更新されており、isCompletedがtrueなら再レンダリングされるのですが、falseの時は再レンダリングされずclassが更新されません。

### 既に報告済み
人生初のオープンソースプロジェクトでのissueを立てようかと思ったのですが、既に上がっていました。
https://github.com/riot/riot/issues/2082

issueにもありますが、
`` class={ isCompleted ? 'completed' : '' }``
のような三項演算子を使っても解決できないようです。

### 解決策

三項演算子のfalse側に空文字以外を入れると正しくレンダリングされるようです(スペースでも可)。
`` class={ isCompleted ? 'completed' : ' ' }``
JavaでPPAP

ちょうどPPAPがCMで流れてたので。

## enumを定義

```
enum PPAP_STATE {
    UNKNOWN,
    PEN,
    PINEAPPLE,
    APPLE,
    PPAP;

    static PPAP_STATE getState(PPAP_STATE state, int talking) {
        if (state == UNKNOWN && talking == 0) {
            return PEN;
        } else if (state == PEN && talking == 1) {
            return PINEAPPLE;
        } else if (state == PINEAPPLE && talking == 2) {
            return APPLE;
        } else if (state == APPLE && talking == 0) {
            return PPAP;
        } else {
            return UNKNOWN;
        }
    }
}
```

## 処理部分
enumのおかげで本処理はすっきり！

```
PPAP_STATE state = PPAP_STATE.UNKNOWN;
Random random = new Random();

while (true) {
    int talking = random.nextInt(3);
    Log.i("talk: ", new String[]{"ペン", "パイナップル", "アップル"}[talking]);

    state = PPAP_STATE.getState(state, talking);
    if (state == PPAP_STATE.PPAP) {
        Log.i("finish: ", "Pen Pineapple Apple Pen!");
        break;
    }
}
```

## 結果
![Screenshot_1479921556.png](https://qiita-image-store.s3.amazonaws.com/0/150615/1ded69fe-0dba-89cb-3424-9ac502dedc1b.png)

## 追記
(本当は、 `PPAP_STATE.getState()` の処理を `switch文` でやりたかった...)

```
switch(int a, int b) {
    case (0, 0):
        // do
    case (1, 1):
        // do
    default:
        // do
}
```

Javaでこんな形でかけるのかがわからなくて断念した...

## GitHub Gist
https://gist.github.com/hmhmsh/e7b3bf994a89f0853ae44ed05bc08ad9

## 参考
[Swift3でPPAPキヨシ](http://qiita.com/on0z/items/ef32f79bde5452a2ccec)
Pentahoとは

# Pentahoとは

## Pentahoとは
**Pentaho** とは、[Pentaho](http://www.pentaho.com/)社の社名であるとともに、Pentaho社が提供する **データ統合・BI/BAツール** の総称です。

### データ統合
**データ統合** とは、 複数のデータソースからデータを集めてくる処理 、集めたデータをきれいにする処理、 集めたデータを結合する処理 、 集めたデータを理解できる形に変換する処理 、そして最後に 様々な処理結果を格納する処理 からなります。
上記の領域をカバーするPentahoのツールである **Pentaho Data Integration** の起動画面を下図に示します。GUIでアイコンをつなぐことでETL処理を作ることができます。
![spoon.png](https://qiita-image-store.s3.amazonaws.com/0/37377/eca92189-31d5-90c4-b98f-3dff264af129.png)

### BI/BA
**BI/BA** とは、それぞれBusiness IntelligenceとBusiness Analyticsの略称です。BI/BAの主要な機能は、 **定型分析** (表形式のデータ表示、グラフ形式のデータ表示、OLAP分析)、 **Adhocな分析** (データマイニング、テキストマイニング)、 **レポーティング** (PDFやHTMLでのレポート出力、ダッシュボード)、 **プランニング** (予測分析)などがあります。
BIとBAを分けて考えてもよいのですが、重なる部分も多いため両者のカバーする機能を列挙しました。

上記の領域をカバーするPentahoのツールである **Pentaho Business Analytic Server** の起動画面を下図に示します。ブラウザ上でOLAP分析やダッシュボード作成を行うことができます。
![ba.png](https://qiita-image-store.s3.amazonaws.com/0/37377/8e7af937-9a69-2362-5b40-619d65192afc.png)


### Pentahoの構成
Pentahoは、OSSソフトウェアの組み合わせで構成されているため、[Community Edition](http://community.pentaho.com/)であれば無償で利用することができます。有償の[Enterprise Edition](http://www.pentaho.com/download)と比べると機能やサポート面で見劣りするところはありますが、十分使えるようです。
Pentaho社は買収により日立のグループ会社になりましたが、すでに使っているOSSを見る限り、急にすべてクローズドにすることは難しいでしょう。

## Pentahoで何ができるのか
Pentahoで何ができるのかについて詳しい話は、公式の[Product Overview](http://www.pentaho.com/product/product-overview)や[日立製作所 - Pentahoソフトウェア](http://www.hitachi.co.jp/products/it/bigdata/platform/pentaho/)に譲るとして、ここではPentahoの主要なツールに何ができるかを説明します。なお、斜体のものはEnterprise Editionのみの機能です。


|ツール名|できること|
|----|-----|
|Pentaho Data Integration|ETL処理全般/ビッグデータソースとの接続/OLAPに特化したETL処理/ *RやWeka* やPythonとの連携/コードスニペットによる細かい挙動の制御/プラグインによる拡張|
|Pentaho Business Analytic Server| *GUIによるOLAP分析/Web上でのレポート作成/GUIで作成できるダッシュボード* /Ctoolsによる洗練されたダッシュボードの作成/AppBuilderによるWebアプリケーションの作成|
|Pentaho Metadata Editor|ビジネスのデータモデルと論理データモデルを結びつける/ビジネスのデーモデルへのクエリを論理データモデルへのクエリに変換する|
|Pentaho Report Designer|紙やPDF/HTMLに出力する定型レポートを作成する|
|Pentaho Schema Workbench|OLAPのスキーマ(Mondrianスキーマ)の作成を支援するツール|
|Pentaho Aggregation Designer|性能向上のために、計算時間がかかるが頻繁にアクセスされる列をあらかじめ集計するための補助ツール|



## 次回

今回はここまでです。
[次回](http://qiita.com/intermezzo-fr/items/83a2b93a2be9dc5e2cb7)は、 ~~Pentahoでできることとできないことを説明した後、~~ インストールからHello Worldまでやってみたいと思います。
記事の修正や記事にしてほしい話題がありましたら、連絡をいただければと思います。

## 参考
* [Pentaho](http://www.pentaho.com/)
* [Pentaho Community](http://community.pentaho.com/)
* [KSKアナリティクスのPentahoに関するHP](http://www.pentaho-partner.jp/)
* [日立製作所 - Pentahoソフトウェア](http://www.hitachi.co.jp/products/it/bigdata/platform/pentaho/)
* [Think IT - オープンソースBI「Pentaho」徹底解説](https://thinkit.co.jp/article/1153/1)
enum の最後で列挙子の数を定義することの是非

※この記事は http://k_satoda.users.sourceforge.net/article/cxx-enum-last-num.html を元に実験的に転載したもので、内容は基本的に同じです。

# 何の話？

C, C++ での列挙宣言 enum について、列挙子の数が欲しいことがよくあります。例えば各列挙子に対応する情報を取り出すためのテーブルを以下のように簡単な配列で定義して対応付けを行いたい場合などです。

```cpp
int PriceOf(enum Item x)
{
  static int const price[NumItems] = {
    123, // Item_A の値段
    456, // Item_B の値段
    789, // Item_C の値段
  };
  return price[x];
}
```

この列挙子の数 `NumItems` を下記のように定義する手法があります。

```cpp
enum Item
{
  Item_A,
  Item_B,
  Item_C,
  NumItems
};
```

このように `NumItems` を定義すると、このあと `Item_D`, `Item_E`, ... などが増えていっても `NumItems` が最後においてある限り `NumItems` は「列挙子の数」として正しい値であり続けます。わずらわしいメンテナンスが不要であり、便利です。

この手法は便利なのでよく見かけるのですが、僕はこの手法には見落とされがちなデメリットがあると考えています。


# 何が問題？

  - `enum Item` 型の引数を受け取る関数に `NumItems` が渡されてもエラーにならない。
  - `NumItems` を関数テンプレートの引数に渡すと `enum Item` で特殊化されてしまう。
  - [`-Wswitch`](https://gcc.gnu.org/onlinedocs/gcc-6.2.0/gcc/Warning-Options.html#index-Wswitch-380) が有効利用できない。


# じゃぁどうすれば？

ここでは下記のような手法を提案します。（コメントも「手法」に含みます。）

```cpp
enum Item
{
  Item_A,
  Item_B,
  Item_C
  // ※最後に追加するときは↓も更新してね。
};
int const NumItems = Item_C + 1;
```

ここで `Item_C` の後ろにカンマを置いていないのは意図的なもので、コメントを見ないで追加するような迂闊なプログラマにコンパイルエラーを見舞って注意を促すための策です。


# それはちょっと・・・どうだろうか？

提案の手法では明らかに、最初に挙げた手法が解決してくれたはずの列挙子の数のメンテナンスが問題として復活しています。しかしどちらの手法でもそれぞれに問題があるのであれば、どちらにするかはそれらの問題の大小で考えるべきでしょう。

まず最初に挙げた手法の問題は、列挙型を利用する箇所の数に比例して大きくなります。次に提案の手法の問題（更新ミスを起こす可能性）は、列挙の最後に追加などの編集が加えられる回数に比例して大きくなります。

僕の結論は、列挙型を利用する箇所の数は時間が経つにつれて発散していくのに対して列挙の最後が編集される回数は時間が経つにつれて収束していくので、提案の手法を基本として使うほうが問題は小さくなることが多いだろう、というものです。

理想を言えば、コンパイラから `NumItems` みたいな情報を取り出せるようになっててくれたらいいんですけどね。
#13 【攻略】RubyWarrior Level4 ~中級編~

今回は中級編Level4です。
動ける範囲が広くなってきて難しい。

#概要
囲んでくる敵の方へ進み、bindしつつ倒し終えたら、バックして捕虜助ける。忙しい。
新技warrior.listenで索敵しつつ、捕虜の場所を把握しましょう。

#スクリプト

```
class Player
  def play_turn(warrior)

    #近くに敵がいるかの判定
    def enemy_near?(warrior)
      if warrior.feel(:right).enemy?
        return :right
      elsif warrior.feel(:left).enemy?
        return :left
      elsif warrior.feel(:forward).enemy?
        return :forward
      elsif warrior.feel(:backward).enemy?
        return :backward
      else
        return :none
      end
    end

    #近くに捕虜がいるかの判定
    def captive_near?(warrior)
      if warrior.feel(:right).captive?
        return :right
      elsif warrior.feel(:left).captive?
        return :left
      elsif warrior.feel(:forward).captive?
        return :forward
      elsif warrior.feel(:backward).captive?
        return :backward
      else
        return :none
      end
    end


    
    if warrior.listen.any? {|space| space.enemy?}         #部屋に敵がいるか判定
      dir = enemy_near?(warrior)                          #周囲に敵がいるか判定
      case dir 
      when :right, :left, :forward
        warrior.bind!(dir)
      when :none
        warrior.walk!(:forward)　　　　　　　　　　　　　　　　#いない場合接近
      end


    elsif warrior.feel.captive?
      dir = captive_near?(warrior)
      if warrior.health < 15
        warrior.rest!
      else
        warrior.attack!(dir)
      end

    elsif warrior.listen.any? {|space| space.captive?}    #部屋に捕虜がいるか判定
      dir = captive_near?(warrior)                        #周囲に捕虜がいるか判定
      case dir 
      when :right, :left
        warrior.rescue!(dir)
      when :none
        warrior.walk!(:backward)                          #いない場合接近
      end
      

    else 
      stairs = warrior.direction_of_stairs                #全て終了後、階段へ向かう
      warrior.walk!(stairs)
    end  
    
  end
end

```

#解説

部屋全域を調査してくれるlisten(配列出してくれる)とany?(配列をチェックしてブロックが真返したらtrue返す)の組み合わせが便利。敵も捕虜もこれでいるかどうか判断できる。
WordpressでXML-RPCを利用した記事投稿用ライブラリをPHPで作った(サムネイル付)


だれか作っている人いるかなと思ったのですが、意外にもいなかった(探せなかった)ので、自分が使っていたWordpressへ自動投稿するスクリプトを切り出して、記事投稿用ライブラリを作ってみました。

https://github.com/YuzuruS/post-to-wp


### Wordpress記事投稿プログラムって何が良いの？
普通に自分の知見を書く分には、記事投稿プログラムは全く使う場面はありません。

例えばアフィリエイトサイトを作る際に、AmazonAPIなどと組み合わせて使う事によって、自動で記事が生成され、苦労せずページ数を増やすことが出来ます。（もちろんGoogleに評価されるためには工夫は必要ですが。）

### 他のライブラリと何が違うの？
あまり記事投稿用ライブラリを見たことがありませんが、主にカテゴリ投稿やサムネイル投稿が簡単に出来ることが挙げられます。

### インストール方法
[packagist](https://packagist.org/packages/yuzuru-s/post-to-wp)に登録したので、composerで簡単にインストールできます。

```composer.json
{
    "require": {
       "yuzuru-s/post-to-wp": "1.0.*"
    }
}
```

```
composer install
```


これでインストール完了です。

### 使い方

以下がサンプルプログラムになります。

```
<?php
require __DIR__ . '/vendor/autoload.php';
use YuzuruS\Wordpress\Post;

$wp = new Post('wordpress_user_name', 'wordpress_passwd', 'example.com');

// カテゴリ事前登録
$res = $wp->makeCategories([
    ['name' => 'かて1', 'slug' => 'cate1'],
    ['name' => 'かて2', 'slug' => 'cate2'],
]);

// 記事投稿
$wp
    ->setTitle('たいとる')
    ->setDescription('本文')
    ->setKeywords(['key1','key2'])
    ->setCategories(['かて1','かて2'])
    ->setDate('2016-11-11')
    ->setWpSlug('entry')
    ->setThumbnail('https://www.pakutaso.com/shared/img/thumb/SAYA160312500I9A3721_TP_V.jpg')
    ->post();
```

1. 自身のwordpressで設定したID,PASSWORD,サイトのドメインを設定
2. 設定したいカテゴリを事前登録。記事投稿時に存在しないカテゴリを登録された場合、「未分類」とされてしまいます。
3. タイトル、本文、キーワード（あれば）、カテゴリ(あれば)、投稿日(省略すれば現在時刻)、設定したいサムネイルURL(あれば)をメソッドチェーンで設定しpostする。

これだけで、ご自身のwordpressに記事が投稿されます。

### まとめ
手前味噌ですが、私が作った[マルコフ連鎖ライブラリ](http://qiita.com/yudsuzuk/items/b49b8f3ced76d9c48297)を組み合わせて使うと幸せになるかもしれません。
【Unity】TileMap関連、Release 2での破壊的変更【2D Experimental Preview 】

Unityの2D機能の実験的ベータ版、Unity 2D Experimental Preview。

実験的機能を試す場であるUnity 2D Experimental Previewでは、[公式フォーラム](Welcome! Get access to the latest in-development and experimental 2D features)でも名言されていますが、バージョンアップにより破壊的変更が入ります。

Release 1からRelease 2のバージョンアップにおける、TileMap関連の破壊的な変更をまとめました。（[Release2のスレッドより](https://forum.unity3d.com/threads/2d-experimental-preview-release-2.427253/)）

* Tile Map APIは、UnityEngine名前空間 -> UnityEngine.TileMap名前空間 に
* 名前変更 VirtualTiles -> EditorPreviewTiles に
* 名前変更 BaseTile -> TileBase に
* 名前変更 TileFlags
   * OverrideColor -> LockColor に
   * OverrideTransform -> LockTransform に
   * OverrideSpawnGameObjectRuntimeOnly -> InstantiateGameObjectRuntimeOnly に
   * OverrideAll -> LockAll に
* TileData
   * TileData.gameobject -> TileData.gameObject に
* TileAnimationData
   * TileAnimationData.animationTimeOffset -> TileAnimationData.animationStartTime に
* TileMap向けのコライダーのPolygonCollider2Dは無くなりました。代わりにTileMapCollider2Dを使います

「[UniBook6](http://www.unity-bu.com/2016/08/unibook-6-info.html)」で、『Hello Programmable Tile!』という章を書きました。執筆当時の最新版はRelease 1でしたが、2016年11月24日現在内容が古くなっています。この内容を参照して、適宜読みかえてください。
Raspberry Pi ロボットに顔識別と感情認識をしてもらう。

Raspberry Pi と Arduino でつくったロボットに顔識別と感情認識が出来るようにしてみました。

[![RaspberryPi-Robot face recognition ](http://img.youtube.com/vi/4r9U_CgCDhM/0.jpg)](https://www.youtube.com/watch?v=4r9U_CgCDhM)

[RaspberryPi-Robot face recognition  - YouTube](https://www.youtube.com/watch?v=4r9U_CgCDhM)

「感動詞」に対して、顔識別と感情認識をします。挨拶してみます。

「こんばんは。」

![2016-11-23 23_32_11.gif](https://qiita-image-store.s3.amazonaws.com/0/47128/d62de114-0e0f-50df-1e4a-74c26add1c86.gif)

「感動詞」をオウム返しするのと同時にカメラのシャッターを切ります。

![PonBot03 2016-11-23 23-25-16.png 2016-11-23 23-25-47.png](https://qiita-image-store.s3.amazonaws.com/0/47128/65ee44ae-433c-ea77-7057-76684d56c89a.png)

ロボット側から見るとこんな感じです。`pon_dad`の確率20%、感情はかなり引きつった笑顔ですが`Happy`76%と認識されています。

![2016-11-23 23_33_03.gif](https://qiita-image-store.s3.amazonaws.com/0/47128/0b0a6d45-a960-668a-4203-b9537587da5f.gif)

私のハンドルネーム「ポンダッド」を呼び、こちらの（引きつった）笑顔に答えます。

## 仕組み

ロボットは[OpenCV](http://opencv.jp/)を利用して顔認識をします。

切り取った画像を元に顔識別しますが、これは[FACE++](http://www.faceplusplus.com/)のAPIを利用して私である事を識別します。

![IMG_8885.MOV 2016-11-24 00-00-44.jpg](https://qiita-image-store.s3.amazonaws.com/0/47128/4bf8766d-5bd9-abfa-b83d-128916f3b0ec.jpeg)

顔認識は3名、「私」と「サミュエル・L・ジャクソン（のフィギュア）」と「ジョン・トラボルタ（のフィギュア）」を登録してあります。トラボルタの顔で認識して見ると、

![PonBot03 2016-11-23 21-27-04.png 2016-11-24 00-02-14.png](https://qiita-image-store.s3.amazonaws.com/0/47128/06d81ae6-00ba-be85-b99e-43775113453d.png)

こんな風に`travolta`49%と出ます。

感情認識は[indico](https://indico.io/)のAPIを利用しています。ここではニュートラル27%と認識されました。

## ご参考

過去、RaspberryPiロボット作りをまとめてきたので、ご参考までリンクを貼っておきます。

### 音声認識・発話

- [Raspberry Pi をNode.jsを使ってブラウザから喋らせる。](http://qiita.com/PonDad/items/ef22c9b6cef15a791643)
- [Raspberry Pi で node-openjtalk を使う](http://qiita.com/PonDad/items/b5ab96520627ea2ac08b)

### 形態素解析 

- [Node.jsとMeCabで品詞抽出してBotに返信させてみる。](http://qiita.com/PonDad/items/81b85d76b1a89ee2598b)
- [Raspberry Pi で mecab-ipadic-NEologd をNode.jsから使う](http://qiita.com/PonDad/items/2214c1b6211ab2513323)

### ロボット作り

- [Raspberry Pi ロボットと会話する。](http://qiita.com/PonDad/items/05dba9e65533e8c98694)

### 顔認識と機械学習API

- [Raspberry Pi のカメラモジュールとOpen CV3で顔認識する](http://qiita.com/PonDad/items/8f255b0dbec25c591cd6)
- [Raspberry Pi のカメラモジュールとFACE++で顔識別する](http://qiita.com/PonDad/items/4d4352fa16c92a16ac3d)
- [Raspberry Pi のカメラモジュールとindicoで感情認識する](http://qiita.com/PonDad/items/ac1fa4a45a29d19ecce1)

### Gist

汚いコードでお恥ずかしいのですが、サンプルとしてGistを貼っておきます。

- [PonBot - face recognition - Gist](https://gist.github.com/PonDad/ecc0db7cd024cd3a6c13622a535a1b4f)

## まとめ

簡単なオウム返しと合わせて、こちらの顔判断して名前を呼んだり、表情を読み取って話しかけたりといった事が出来る様になりました。

子供向けに何か出来ないかと思って作り始めたのですが、もう少しコンパクトにして外見を可愛くすれば我が家の娘（双子・５歳）も遊んでくれるかな。などと思います。

あと、どうでも良い話なんですが、Macの写真アプリでは双子を大体半分位間違えるんですよね。

娘達の写真がこの５年間で15,000枚位溜まっているので、機械学習に掛ければ上手く判別出来るのだろうか…などど思う今日この頃です。ではまた。
Ridgepoleを使ってみた

# はじめに
RailsでのDBスキーマ管理としてRidgepoleを勧められたため、触ってみました。
↓こちらの方の記事を参考にさせていただきました。
[さらば「rails migrate」、よろしく「ridgepole」](https://re-engines.com/2017/05/03/370/)
# 導入
Gemfileに追記します。

```rb:Gemfile
gem 'ridgepole'
```

```shell
$ bundle install
```
## 今回使用するテーブル

```rb
class CreateItems < ActiveRecord::Migration[5.0]
  def change
    create_table :items do |t|
      t.string :name
      t.integer :price
      t.text :description

      t.timestamps
    end
  end
end
```
# Schemafileの作成
そして、下記のコマンドでテーブルを分割します。
`--export`コマンドで対象ディレクトリに`Schemafile`を出力します。

```shell
$  ./bin/bundle exec ridgepole -c config/database.yml -E development --export --split --output db/schemas/Schemafile
Export Schema
  write `db/schemas/items.schema`
  write `db/schemas/Schemafile`
```
これで、各テーブルのスキーマファイルと大元の`Schemafile`が作成されます。

```rb:Schemafile
require 'items.schema'
```

```rb:items.schema
create_table "items", force: :cascade do |t|
  t.string   "name"
  t.integer  "price"
  t.text     "description"
  t.datetime "created_at",  null: false
  t.datetime "updated_at",  null: false
end
```
# インデックスを追加してみる

```diff:items.schema
create_table "items", force: :cascade do |t|
  t.string   "name"
  t.integer  "price"
  t.text     "description"
  t.datetime "created_at",  null: false
  t.datetime "updated_at",  null: false
end
+ add_index :items, :price
```
実行するためには、以下のコマンドを叩きます。

```shell
$ ./bin/bundle exec ridgepole -c config/database.yml -E development --apply -f db/schemas/Schemafile
Apply `db/schemas/Schemafile`
-- add_index("items", ["price"], {})
   -> 0.0113s
```
これだけで、`index_items_on_price`というインデックスが作成されました。
# カラムを追加してみる

```diff:items.schema
create_table "items", force: :cascade do |t|
  t.string   "name"
  t.integer  "price"
  t.text     "description"
+ t.integer  "category", null: false, default: 0
  t.datetime "created_at",  null: false
  t.datetime "updated_at",  null: false
end
  add_index :items, :price
```
わざわざマイグレーションを作成しなくてもカラムが追加できました。

```shell
$ ./bin/bundle exec ridgepole -c config/database.yml -E development --apply -f db/schemas/Schemafile
Apply `db/schemas/Schemafile`
-- add_column("items", "category", :integer, {:null=>false, :default=>0, :after=>"description"})
   -> 0.0151s
```
# おわりに
これだけ簡単にテーブル構造が変えられるのは非常に楽だと思います。
はじめは、テーブル構造の変遷を追いづらくなるのかな、と思いましたが、それはソース管理すれば良いだけの話なので、そこまで問題にはならないかと思います。
もう少し機能や使い方、運用ルールなどを考えていきます。
公式ドキュメント：[https://github.com/winebarrel/ridgepole](https://github.com/winebarrel/ridgepole)
ディレクトリ構造を無視して圧縮する場合はzipコマンドの-jオプションを使う


たとえばディレクトリ`/foo/bar`の直下に`a.xml`/`b.xml`/`c.xml`という3つのxmlファイルがあり、この3つだけをおさめたzipファイルを作りたいとします。つまり__「zipファイルを解凍すると、解凍ディレクトリの直下に3つのxmlファイルが格納されている」__という状態にしたいわけです。

さてこのとき思わず次のようなzipコマンドを打ち込みたくなります。

```bash
zip /foo/bar/hoge.zip /foo/bar/*.xml
```

この結果によってディレクトリ`/foo/bar`直下に生成された`hoge.zip`を解凍してみると、__ディレクトリ構造が温存されている__ことがわかります。つまり`hoge.zip`を解凍すると、まず`foo`というディレクトリがあり、その直下に`bar`があって、そこをさらに潜って初めて`a.xml`/`b.xml`/`c.xml`が現れます。言い方を変えるとzipファイルには`/foo/bar/a.xml`, `/foo/bar/b.xml`, `/foo/bar/c.xml`が圧縮されたような形になっています。

__これを回避する、つまりディレクトリ構造を無視してファイルだけをzipとして圧縮したい場合は`-j`オプションを使います。__

```bash
zip -j  /foo/bar/hoge.zip /foo/bar/*.xml
```

こうすると`hoge.zip`を解凍したディレクトリの直下に`a.xml`/`b.xml`/`c.xml`の3つが格納されています。
負荷テストツール Siege

## Siege
https://github.com/JoeDog/siege
**Siege** は、ページ内の画像や CSS、JavaScript なども同時にリクエストしたり、URL リストからランダムでアクセスしたり、POST リクエストを投げたりすることができる負荷テストツール。

## インストール
CentOS にインストールする場合、 EPEL リポジトリからインストールできる。
バージョンは最新の 4.0.2 がインストールされる。

```bash
yum install epel-release
yum install siege
```
設定ファイルは `~/.siege/siege.conf` に生成される。

## テスト実施
```bash
siege -c 3 -t 3S http://example.com/
```
省略|オプション|内容
---|---|---
 -c| --concurrent=NUM     |同時接続ユーザー数。デフォルト値は 10
 -r| --reps=NUM           |REPS, number of times to run the test.
 -t| --time=NUMm          |TIMED testing where "m" is modifier S, M, or H<br>ex: --time=1H, one hour test.
 -H| --header="text"      |リクエストヘッダーの追加 (複数指定可)
 -A| --user-agent="text"  |User-Agent の指定
 -T| --content-type="text"|Content-Type の指定
 -g| --get                |GET, pull down HTTP headers and display the transaction. Great for application debugging.
  -d| --delay=NUM          |Time DELAY, random delay before each requst
  -b| --benchmark          |BENCHMARK: no delays between requests.
  -i| --internet           |インターネットユーザーシミュレーション。URLへランダムアクセス
  -f| --file=FILE          |URL一覧ファイルの指定
  -R| --rc=FILE            |siegerc ファイルの指定
  -l| --log[=FILE]         |ファイルへのログ出力。FILE が未指定の場合のデフォルト値は PREFIX/var/siege.log
  -m| --mark="text"        |MARK, mark the log file with a string. between .001 and NUM. (NOT COUNTED IN STATS)
 -V| --version            |バージョン番号の表示
 -h| --help               |ヘルプの表示
 -C| --config             |現在の設定を表示
 -v| --verbose            |画面に通知を表示
 -q| --quiet              |冗長表示をオフにして出力を抑止

## 結果
```
** SIEGE 4.0.2
** Preparing 10 concurrent users for battle.
The server is now under siege...
HTTP/1.1 200     0.21 secs:     606 bytes ==> GET  /
HTTP/1.1 200     0.22 secs:     606 bytes ==> GET  /
HTTP/1.1 200     0.23 secs:     606 bytes ==> GET  /
.
.
.

Lifting the server siege...
Transactions:                     14 hits
Availability:                 100.00 %
Elapsed time:                   2.34 secs
Data transferred:               0.01 MB
Response time:                  0.27 secs
Transaction rate:               5.98 trans/sec
Throughput:                     0.00 MB/sec
Concurrency:                    1.63
Successful transactions:          14
Failed transactions:               0
Longest transaction:            0.43
Shortest transaction:           0.21
```

項目                   |内容|出力例
-----------------------|---|---
Transactions           |リクエスト数|                     14 hits
Availability           |成功率|                 100.00 %
Elapsed time           |処理時間|                   2.34 secs
Data transferred       |データ転送量|               0.01 MB
Response time          |レスポンス時間|                  0.27 secs
Transaction rate       |秒間リクエスト数|               5.98 trans/sec
Throughput             |スループット(秒間処理データ量)|                     0.00 MB/sec
Concurrency            |平均同時接続数|                    1.63
Successful transactions|成功したリクエスト数|          14
Failed transactions    |失敗したリクエスト数|               0
Longest transaction    |最長リクエスト秒|            0.43
Shortest transaction   |最短リクエスト秒|0.21
ライブラリで良くある語尾の4jの意味

#結論
気になって調べてみましたが、以下の意味らしいです。
>for Java


**for**と音が同じだからだそうですが(下記のアドレス参照)、
詳細に関しては現状不明で、わかり次第追記致します。


#他の言語で見つけたもの

|4〇〇|使用言語|
|:---|:------|
|4c|C|
|4cxx|C++|
|4js|JavaScript|
|4Net|.Net|
|4perl|Perl|
|4php|PHP|
|4plsql|Oracle PL/SQL用|
|4py|Python|
|4python|Python|
|4ruby|Ruby|
|4scala|Scala|

発見次第、追記します。
ほとんどが、log4〇〇でした。

#予想
下記の参考記事にも記載されているが、ほぼlog4〇〇で使われているため、
このライブラリの対象言語を区別するために考えられた語尾ではと予想しています。

#参考
http://stackoverflow.com/questions/1826014/what-does-4j-mean