OmniAICreator/Qiita-1.07M huggingface dataset:
SoftLayerのVirtual Serverを立ち上げるbash

最近SoftLayerのVirtual Serverを作っては落としとしているので、DC、ホスト名、OSを引数にしてSoftLayerにVirtual Serverを立ち上げるスクリプトをSL CLIを使って書いた。
ドメイン名やSSHキー名、CPU数とメモリ量は決め打ち。

そのDCに既にVLANが作成されていた場合、そのVLANに明示的に所属させる。

※ `sl vlan list`がPUBLICかPRIVATEかを返してくれないので、VLANが持つIPの数で判別している。微妙。。。
※ VLANが二本以上ある場合は未テスト
※ VLANの割り当て数を超えた場合にどうなるのかも未テスト

```bash:create_vs.sh
#!/bin/bash

if [ $# -ne 3 ]; then
  echo "usage: $0 DATACENTER HOSTNAME OS"
  exit 1
fi

DC=$1
HOSTNAME=$2
OS=$3

DOMAIN="your.domain.name"
SSH_KEY="your_ssh_key_registername"
CPU="1"
MEM="1024"

CMD="/usr/local/bin/sl vs create --hourly --really"
CMD="$CMD --datacenter=$DC --domain=$DOMAIN --hostname=$HOSTNAME"
CMD="$CMD --cpu=$CPU --memory=$MEM --os=$OS --key=$SSH_KEY"

PRIVATE_VLAN=`/usr/local/bin/sl vlan list | grep $DC | grep " 61 " | cut -d " " -f1`
if [ -n "${PRIVATE_VLAN}" ]; then
  echo "use private vlan ${PRIVATE_VLAN}"
  CMD="$CMD --vlan_private=${PRIVATE_VLAN}"
fi

PUBLIC_VLAN=`/usr/local/bin/sl vlan list | grep $DC | grep " 13 " | cut -d " " -f1`
if [ -n "${PUBLIC_VLAN}" ]; then
  echo "use public vlan ${PUBLIC_VLAN}"
  CMD="$CMD --vlan_public=${PUBLIC_VLAN}"
fi

set -x

$CMD
```

ついでに、全てのVirtual Serverを問答無用でCancelするスクリプト。

```bash:cancel_all_vs.sh
#!/bin/bash

for vs in `/usr/local/bin/sl vs list | cut -d " " -f1`; do
  echo cancel $vs
  /usr/local/bin/sl vs cancel $vs --really
done
```
Redmine で絶対入れるプラグイン３選

<h3>No.1</h3>
Redmine Theme Changer plugin
https://bitbucket.org/haru_iida/redmine_theme_changer/overview

まずは絶対これ。
気分でテーマを変えたい。
優先度が目立つテーマを使うとプロジェクトによっては心がやられるので、おしゃれテーマを用意しておくのがおすすめ。


<h3>No.2</h3>
Redmine Local Avatars plugin
https://github.com/ncoders/redmine_local_avatars
0.0.3-forked 版を使っている。

管理者権限にあかせて、活動タブで確認したい人 数名に画像をつけていった。
つけると視認性が上がるのでおすすめ。
今は、若いのがネタ自画像作ったりして楽しんでいる。
絶対そういうことをしないおじさま方には、「Gravatarのアイコンを使用する」を有効化して
デフォルトのGravatarアイコンを「Identicons」を選択。
「Identicons」はいいですね。嫌味がなくて。


<h3>No.3</h3>
Redmine Absolute Dates plugin
https://github.com/suer/redmine_absolute_dates

初めてこのプラグインを知った時には、天才か！と思いました。
いやー便利。ありがたい。
技術英語 > Could it be ... > Could it be the modem?

何か調子がおかしい。「モデムが悪いんじゃないの」という時に
Could it be the modem?
のように使う。

<hr>
A「Something strange is going on here.」
B「What's the culprit?」
A「Could it be the modem?」

上記の訳
A「何か変だな」
B「犯人はどれだ?」
A「モデムじゃないの?」
C11 / C++11 > C11:2011年のC言語の規格 / C++11:2011年のC++のISO標準

http://ja.wikipedia.org/wiki/C11_(C%E8%A8%80%E8%AA%9E)

http://ja.wikipedia.org/wiki/C%2B%2B11

「C/C++ セキュアコーディング 第2版 by Robert C. Seacordら」という本に時々出てくる「C11」は「C++11」の間違いかと思っていたら、同じ年(2011年)にC言語の規格もできていたようでした。
SQLアンチパターン@Rails③クエリのアンチパターン

パターン13:恐怖のunknown(フィア・オブ・ジ・アンノウン)
=
NULLをある種の値のように扱ったり、あるいはnullに当たるような一般値を独自に定義するのは良くない、という話。Railsにおいては直接DBにふれることはないし、nilを返すようなカラムに何かしらの操作をしようとした場合はちゃんと例外出してくれるので心配ないと思う。

パターン14:曖昧なグループ(アンビギュアスグループ)
=
グループ内の最大（小、平均）値の値だけでなく、そのレコードの他カラムも取得するようなクエリを実行したい。
Railsでは`group`でグルーピングのみを行え、そこから`order`するといいと思う。

```.rb
BugReport.group(:product_id).order(:created_at).first
```
パターン15:ランダムセレクション
=
[take](http://railsdoc.com/references/take)を使えばいいと思う(実装を読んでるわけではないので、もしかすると良くないのかもしれないけど、今のところ非推奨という話は聞いたことない)

パターン16:貧者のサーチエンジン
=
全文検索を行いたい。なるほど確かになかなか難しいかもしれない。Railsの元々の機能としては提供されていない（と思う）ので、単純に紹介されているようなパターンマッチ述語を含むクエリを投げるしかないように見える。
ググったらいろいろ出てきた。やっぱりそれなりにありふれた問題なので、すでにソリューションはあるんだと思う。

- [Railsで全文検索まとめ](http://easyramble.com/rails-full-text-search-libraries.html)

- [Mroonga](https://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&cad=rja&uact=8&ved=0CB0QFjAA&url=http%3A%2F%2Fblog.createfield.com%2Fentry%2F2015%2F02%2F25%2F105440&ei=UTc0VZGlM8a_mAWb9oGgAQ&usg=AFQjCNEM0gxV5lA718DirzRrov9mnGK5oA)

- [Solr](https://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&source=web&cd=3&cad=rja&uact=8&ved=0CCkQFjAC&url=http%3A%2F%2Fruby-rails.hatenadiary.com%2Fentry%2F20150223%2F1424695504&ei=UTc0VZGlM8a_mAWb9oGgAQ&usg=AFQjCNH0xQd7dNsfgTQMbftxHJL3st-ejw)

- [Elastic Search](https://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&source=web&cd=6&cad=rja&uact=8&ved=0CDwQFjAF&url=http%3A%2F%2Fqiita.com%2Fk-shogo%2Fitems%2F8657e0a5fdf20a25bba0&ei=UTc0VZGlM8a_mAWb9oGgAQ&usg=AFQjCNFmBL1OA2_j2uqoqUJ3HdVx33sTAw)

今結構hotな話題なので勉強してもいいかもしれない。

本に名言があって、「問題を解決するために必ずしもSQLを使う必要はありません」

パターン17:スパゲッティクエリ
=
超絶技巧みたいなクエリを書くのはやめろ、という話。特にRailsにおいてはなかなかそんなことにはならないと思うので、心がけたい。たとえばwhereで死ぬほど長い条件を書くよりかはscopeを分割してチェーンする方が可読性も良いし、各scopeは違う場所で再利用できる。DRYの精神にも合致してて良い。

```.rb
Model.where(condition1 and condition2 and condition3 and ...)
```
より

```.rb
Model.condition1.codition2...
```

パターン18:暗黙の列(インプリシットカラム)
=
`select *`に見られるようなワイルドカードをなるべく使用するな、という話。主にパフォーマンスの問題と(そんなに大きな問題ではないと思うけど)コードとの整合性の問題。

[pluck](http://railsdoc.com/references/pluck)を使えばいいと思う。パフォーマンスはかなりいいよう。
技術英語 > as needed > 必要な時に > They are put in [as needed] and taken out after they are used.

as needed
で「必要な時に」と言える。

---
「必要な時に加えられ、使用後は取り外される。」
They are put in [as needed] and taken out after they are used.

@ Code Complete > divide-and-conquer method

```txt:snippet
#ifdef DEBUG
    std::cout << "Witdth " << width << "Height " << height << '\n';
#endif
```
WerckerでMiddlemanのBuild,Deployを自動化する

##werckerとは

[wercker](http://wercker.com/)は、ホストしたリポジトリのビルドとかデプロイを自動で行ってくれるサービスです。ちなみに、[middleman](https://middlemanapp.com/)は、ruby製のサイトジェネレーターです。

ここでいう自動化というのは、ローカルのファイルをcommitし、pushすれば、build,deployされるという意味で使います。

##middlemanの使い方

https://middlemanapp.com/

middlemanの使い方は、とても簡単です。publicへのuploadまでの手順は、まず、テンプレートをダウンロードしてきて、`bundle`し、build, `git`で管理している場合は、pushまたは、deployを済ませれば良いだけです。

```bash:
$ git clone https://github.com/syui/middleman

$ cd middleman

$ rvm install 1.9.3
$ rvm use 1.9.3

$ gem i bundler

$ bundle

$ middleman build

$ middleman preview
$ curl localhost:4567

$ vim config.rb

$ middleman deploy
```

仕組みは簡単で、`middleman build`コマンドが実行されると、`build`フォルダができますので、それをWeb Serverの方に、Uploadすれば、サイトを公開する形になります。

ここで、ビルドからサーバーへのアップロードまでを実行するコマンドが`middleman deploy`になります。

私の場合、GitHubのGitHub Pagesへホスティングしていますので、その形式で、`config.rb`が書かれています。

ここで、GitHub Userは、`username.github.io`というリポジトリでホスティングしている場合には`master`にbuildを`push`することになり、それ以外のrepositoryで公開したい場合は、`gh-pages`ブランチに`push`します。この場合は、URLが`username.github.io/repo`で公開されます。

大体、初歩的な説明が終わりましたので、次にwerckerについて解説します。

##werckerの使い方

http://wercker.com/

GitHubアカウントがある場合、そのアカウントを使いログイン登録できます。

Apps > Add an application でアプリを追加します。ここには、GitHubのリポジトリを指定します。

Settings > Deploy targets > Add deploy target > Custom deploy でデプロイ対象を追加。Auto deploy はチェックして、ソースの方のブランチ名を指定します。


Deploy pipleline > Add new variable にて、werckerで使う環境変数を設定します。ここでは、GitHubのAPIを使えるようにしたいと思います。変数名は、`GITHUB_TOKEN`にしておいてください。設定ファイルの記述が変わってきます。




GitHubで Settings > Applications > Personal Access Tokens で生成し、キーをWerckerのところに記述します。


あとは、gitで管理してるsourceのルートディレクトリに、`wercker.yml`を置きます。

```yaml:wercker.yml
box: wercker/rvm

build:
    steps:
        - rvm-use:
            version: 1.9.3

        - bundle-install

        - script:
            name: build with middleman
            code: bundle exec middleman build --verbose

deploy:
    steps:
        - lukevivier/gh-pages:
            token: $GITHUB_TOKEN
            basedir: ./build
            repo: syui/middleman
```

それをpushすると、buildされ、deployされるしくみです。

したがって、middlemanでblogを更新する際にも、記事を書いて、それをpushすればいいので、楽です。

```bash
$ middleman article test

$ cd source/blog

$ vim test.md

$ git add test.md
$ git commit -m "update"
$ git push
```

これでwerckerがリポジトリをbuild,deployしてくれるので、blogが自動更新されると思います。
POSIX > strdup() > 文字列のコピー > C99にもC11にも含まれていない

引用: C/C++ セキュアコーディング 第2版 by Robert C. Seacordら
> strdup()は文字列へのポインタを受け取り、新しく確保したメモリに複製した文字列へのポインタを返す。このメモリを解放するためには、戻り値のポインタを指定してfree()を実行すればよい。

> ...
> ISO/IEC TR 24731-2[ISO/IEC TR 24731-2:2010]で定義されているが、C99にもC11にも含まれていない。

http://fernweh.jp/b/c-allocation/#id-3
にサンプルコードが掲載されている。

[ideone](http://ideone.com/RV17Md)にて実際にコーディングしてみた。
QiChatの変数参照タイミングを調べてみる

Pepperでは[QiChat Script](http://qiita.com/Atelier-Akihabara/items/34488f5bc99213bfb16d)という、対話に特化した独自のスクリプト言語で人間とPepperの会話を実装することができます。

Communityに投稿されていた [ALMemoryの格納と取得のタイミングが合わない](https://community.aldebaran.com/ja/forum/almemory%E3%81%AE%E6%A0%BC%E7%B4%8D%E3%81%A8%E5%8F%96%E5%BE%97%E3%81%AE%E3%82%BF%E3%82%A4%E3%83%9F%E3%83%B3%E3%82%B0%E3%81%8C%E5%90%88%E3%82%8F%E3%81%AA%E3%81%84-4020) を見て、変数参照の置き換えタイミングってどんな感じなんだろう？と思ってドキュメントをざっと見たが、それらしき記述は見つからず。簡単な範囲で動作確認してみたのでメモ。


#実験内容

実験に使ったファイルはGitHub https://github.com/yacchin1205/pepper-dialog-tests の **VariablesTest** にあります。

アニメーションの前後で変数を参照した場合、どのようなタイミングで変数が参照されるのかを確認するために、

1. メモリに、0.1秒ごとに1増える変数 `MyCount` を用意
    ![count.png](https://qiita-image-store.s3.amazonaws.com/0/28770/4cf240f0-ff6c-89ef-d1dd-76367c26b2ca.png)

2. MyCountをアニメーションの前後でしゃべるようなQiChatのルールを記述

    ```
    u:(アニメーション) 今は $MyCount ですよ。^mode(disabled) 1つめのアニメーションしますね。 ^run(animations/Stand/Gestures/Hey_1) 1つめのアニメーション終了後は $MyCount ですよ。2つめのアニメーションしますね。 ^run(animations/Stand/Gestures/Explain_11) 2つめのアニメーション終了後は $MyCount ですよ。
    ```

といった処理を用意してみました。

#結果

それぞれ `animations/Stand/Gestures/Hey_1`, `animations/Stand/Gestures/Explain_11` は1秒以上はあるようなモーションですが、これを実行し、「アニメーション」と話しかけると、

```
ロボット：今は57ですよ。1つめのアニメーションしますね。 1つめのアニメーション終了後は57ですよ。2つめのアニメーションしますね。 2つめのアニメーション終了後は57ですよ。
```

と、ダイアログビューに表示され、上記の内容でPepperがモーション再生をおこないながらしゃべりました。

何度か動作確認しましたが、`$MyCount` の値はアニメーション前後で同じ値になりました。これは、**u:のルールにマッチした時点で、出力中のすべての変数が置き換えられている**のだと考えられます。

APIの観点では、`$変数`は**ALDialog**がサポートする記法で、`^run`は**ALAnimatedSpeech**がサポートする記法なわけですが、おそらくALDialogはALAnimatedSpeech向けの記述に関知せず、`$変数`の置き換えなどALDialogの責任分のみの処理をおこなって、あとはALAnimatedSpeechに委譲し、`^run`の解釈、実行はALAnimatedSpeechの責任でおこなわれるという分担で行われているように見えます。

QiChatは`$変数=値`のような記述ができたり、出力内で簡単なロジックを書けそうに思えるので、一瞬「？」という動作ではありますが、これはこれで仕様として妥当性がありそうに思えます。というのも、よくある変数参照の用途として、

```
u:(e:イベント) $イベント
```

みたいな感じで、イベントをフックしてその値をしゃべらせるといった記述があるわけですが、`$イベント`の前に演出としてモーションなどを入れたくなってくることを考えると、ルールがマッチした瞬間の値を参照してくれるほうが意図しない動作を起こしにくそうにも思えるため・・・この辺のダイナミックな部分は、ドキュメントとして書ききるのは難しいですねえ・・・

変数設定についても調べたんですけど、時間を見てまた結果を書きます。
gets() > 改行文字かファイル終端(EOF)に達するまで読込みを行う | C99では非推奨

gets()の例

```sample.c
#include <stdio.h>
#include <stdlib.h>

int main()
{
   char buf[20];

   printf(">");
   gets(buf); 
   ...
}
```

以下、引用: C/C++ セキュアコーディング 第2版 by Robert C. Seacordら
> gets()はC99では使用が推奨されておらず、C11からは削除されている。
Xcode6.3でStoryboardを開いているときにほかのファイルを開こうとするとXcodeがフリーズする


`Xcode freeze`とかでぐぐってると以下のStackOverflowが見つかった。

http://stackoverflow.com/questions/29544738/xcode-6-3-freezes-hangs-after-opening-xib-file

現象は似てるんだけど、IB_DESIGNABLEとか指定した覚えがない。

```sh
grep -r IB_DESIGNABLE ./
```

とかやってみると、CocoaPodsで入れている[SZTextView](https://github.com/glaszig/SZTextView)で`IB_DESIGNABLE`が使われていた。
SZTextViewはUITextViewでプレースホルダーを表示してくれるライブラリなので、開発中はとりあえずなくてもそこまで困らない。
Appleさんが対処してくれるまでしばらくSZTextViewをはずしておくことにした。

それにしても`IB_DESIGNABLE`で複雑なUIつくるのちょっとは楽になるかと思ってたんだけど残念無念。
Heroku で node-canvas を使ってみる

Heroku で [node-canvas](https://github.com/Automattic/node-canvas) を使って Hello World してみます。

## 事前準備

事前に Heroku のアカウント取得と [Heroku Toolbelt](https://toolbelt.heroku.com/) をインストールしてコマンドラインから Heroku コマンドを使えるようにしておきます。

また、ローカルで開発も行えるように [Macでnode-canvasをインストールする方法](http://qiita.com/maru_cc/items/ea483477d7ed7df6a9cc) を参考にローカル環境に Cairo をインストールしておきます。

## Node.js でアプリケーションを作るためのひな形を clone する

```
git clone https://github.com/heroku/node-js-getting-started.git
cd node-js-getting-started
npm install
```

参考: [Getting Started with Node.js on Heroku](https://devcenter.heroku.com/articles/getting-started-with-nodejs#deploy-the-app)

## アプリケーションを新規作成

```
heroku create
```

## node-canvas をインストール

npm を使って node-canvas をインストールします。

```
npm install --save canvas
```

## Cairo をインストールする

node-canvas を利用するためには Cairo が必要となるので、
custom buildpack を使ってインストールするための準備をします。

```
heroku buildpacks:set https://github.com/ddollar/heroku-buildpack-multi.git

cat << EOF > .buildpacks
https://github.com/mojodna/heroku-buildpack-cairo.git
https://github.com/heroku/heroku-buildpack-nodejs.git
EOF
```

参考: [heroku-buildpack-cairo](https://github.com/mojodna/heroku-buildpack-cairo)

## Hello World するために index.js を書き換えておく

そのままデプロイしても node-canvas が使えるようになったのかがわからないので、プロジェクトルートに置かれている index.js に Node-canvas の処理を書き加えて Hello World ができるようにしておきます。

```javascript:index.js
var express = require('express');
var app = express();

var Canvas = require('canvas');
var canvas = new Canvas(200,200);
var ctx = canvas.getContext('2d');

ctx.font = '30px Impact';
ctx.rotate(.1);
ctx.fillText("Hello World!", 50, 100);

app.set('port', (process.env.PORT || 5000));
app.use(express.static(__dirname + '/public'));

app.get('/', function(request, response) {
	response.send('<img src="' + canvas.toDataURL() + '" />');
});

app.listen(app.get('port'), function() {
  console.log("Node app is running at localhost:" + app.get('port'));
});
```

## アプリケーションをデプロイする

```
add .
git commit -m "node-canvas on Heroku"
git push heroku master
```

## アプリケーションを実行する

```
remote: Verifying deploy... done.
```

というログが表示されていれば無事でデプロイが完了していますので、アプリケーションを実行させます。

```
heroku ps:scale web=1
```

## アプリケーションにアクセス

```
heroku open
```

ブラウザが立ち上がって,node-canvas から吐出された以下のような画像が表示されていれば無事完了です。

![node-canvas on Heroku](http://i.gyazo.com/01ceca66df0705a239122eabc85b5535.png)

DEMO: https://rocky-eyrie-7538.herokuapp.com/
READMEに書いてあることは守ってくれ頼む

自戒です。

先日自分が書いた gem を自分で使おうとして README をコピペしたら間違っていて残念な気持ちになったので、README のサンプルをテストコードの中で実行する gem 作りました。

README のサンプル間違ってると大変萎えるのでご活用下さい。

- https://github.com/gong023/readme_spec

## インストール

rubygems からインストールします

`gem install readme_spec`

## 使い方

まず RSpec.configure に README のファイルパスを渡してあげて下さい。

```ruby:spec_helper.rb
RSpec.configure do |c|
  c.readme_file_path = File.dirname(__FILE__) + '/../README.md'
end
```

次にいい感じの README を書きましょう。

<pre>
Your awesome description.

Your sample code.

```ruby
class YourClass
  def do_something
    true
  end
end
your_class = YourClass.new
expect(your_class.do_something).to be_true
```
</pre>

README の中に `ruby` で囲まれたサンプルコードがあります。以下の様な呼び出しをテストコードから行うと、README に埋め込んだサンプルコードを rspec とかで実行できるようになります。

```rb
expect { ReadmeSpec.evaluate(binding) }.not_to raise_error
```

失敗した場合のメッセージは例外そのままです。つまり今回の例だと普通に rspec を実行した時のエラーメッセージを得ることができるのでわかりづらいということはないと思います。

```
Failure/Error: it { expect { ReadmeSpec.evaluate(binding) }.not_to raise_error }
  expected no Exception, got #<RSpec::Expectations::ExpectationNotMetError:
  expected #<Fixnum:3> => 1
       got #<Fixnum:7> => 3
```

## 注意点とか

内部実装見ていただけるとわかるのですが普通にサンプルコードを eval してるだけなのでお気をつけ下さい。rspec の DSL をそのまま README に書いてその正しさも保証できるのでそこそこ便利かと思います。

また、テスト対象のコードですが github が qiita のような markdown 書き方（ruby:hogeってかけるやつ）をサポートしてくれていれば良いのですが、そうではないので雑に `ruby` で囲まれたところは一括で実行するようになっています。

<pre>
github が以下の書き方サポートしてない

```ruby:spec1
expect(true).to be true
```

```ruby:spec2
expect(1).to be 1
```
</pre>

気が向いたら一行目のコメントみるとかそういう実装入れます。
AtomのTerm2が調子出ない

atomを使いこなそうと思考錯誤していますが
最近、本体のアップデートがよくあるのですが、パッケージで入れているTerm2の動きが最近変です。  

1. 画面スクロールができなくなっている
2. キーバインドで cmd+v=ペーストの設定なっているが、実行するとGNU nanoという テキストエディターの画面に切り替わってしまう そんな設定した記憶はないけどな~



**とにかく今は使える状態じゃありません**

shellやらzshやらvimやらの設定を色々試していたのが原因だったらと思うと、気が遠くなる
もう少し確認作業が必要みたいだ

atom+term2のアップデートで改善してくれるといいのにな~

2015/04/21追記
iTerm.appでは、opt+v でGNU namoが開くことがわかったため、Atomのキーバインドの設定で cmd+v →　ctrl+v へ変更してみたが、しかしペーストはできないし、なおかつメニュー/編集/コピー及びペーストの操作でも反映されない。

やはりterm2の不具合かな〜

---

追記2015/07/22

随分と時間が経ってしまいましたが、その間にもAtom及びパッケージもかなりアップデートが進み、かなり安定してきたように感じてます。

Atom自体は1.0となり安定版となったようですね。

問題のiTerm2ですが、自分自身の設定がメインターミナルとして使っているiTermの起動と同時にTumxが起動するようにしていたため、AtomのTerm2とTumxの相性が悪かったのかなと思っています。

Tumxが起動する設定を.zshrcから外してAtomのTerm2を使ってみたところ、問題なく(多少操作に癖ありかな？)使えています。

ペーストもctl+vで問題なくできることを確認しました。

**とにかく今は使える状態じゃありません**なんて、生意気にもど素人があたふたとしていた感がありますが、なんとかかんとか試行錯誤しながら使い慣れていくよう努力していきたいと思っています。

あとデフォルトのシェルがzshの場合はスクロール機能が使えないみたいです(zshで設定しているのにどうしよう)bashを推奨しているみたいですね、悩ましい。


今までもそうですが今も **Atom** お気に入りのエディタです。
babel + Node.js をvim-quickrunで実行する


最近, ちょいちょいbabelを触ることが増えてきた.

[babel](https://babeljs.io/)はEcma 6th, 7thで書かれたコードをコンパイルして, ブラウザやNode.jsが実行できる形式のJavaScriptコードに変換してくれるツール(transpiler)だ.

一方, 僕はJavaScript開発時, ちょっとしたJavaScriptのスニペットは[vim-quickrun](https://github.com/thinca/vim-quickrun.git)を使ってVimから実行している.

しかし, babelでtranspileしないと動作しない.jsのコードを`:QuickRun`としても, 当然Node.jsに怒られてしまう.
そこで, babeってからNode.jsで実行するようにQuickRunの設定を書いてみた.

<!-- {{{ -->

```vim:.vimrc
let g:quickrun_config['babel'] = {
      \ 'cmdopt': '--stage 1',
      \ 'exec': "babel %o %s | node"
      \ }
```

<!-- }}} -->

こうしておけば, `:QuickRun babel` とすることで, babelでコンパイル→Node.jsで実行ができる.
(勿論, 事前に`npm -g install babel`でbabelをinstallしておくこと)

この段階で殆ど当初の目的は達成できているけど, 実行の度に`:QuickRun babel`のようにcommandを叩くのがちょいと欝陶しい.
fileTypeデフォルトの設定であれば, `<Leader>r` にQuickRunの実行が割り当てられているが, .jsだからと言って必ずしもbabeる訳でもないので, babel設定をファイルタイプデフォルトにするのも気が引ける.

そこで, `b:quickrun_config`を使うことにした.
`b:quickrun_config`はバッファローカルな設定なので, そのバッファでのみデフォルト挙動を変更することができる.

というわけで, `g:quickrun_config`の値を`b:quickrun_config`に設定するためのコマンド`QuickRunSwitch`を用意した.

1. .jsファイルを開く
1. `:QuickRunSwitch babel` でバッファ内におけるデフォルトの typeを変更(一応補完も効くようになってる)
1. `<Leader>r` でサックリ実行

.vimrcは下記のようになる.

<!-- {{{ -->

```vim:.vimrc
let g:quickrun_config = {}
function! s:quickrun_switch(...)
  if a:{0} && has_key(g:quickrun_config, a:{1})
    let type_name = a:{1}
    echo 'Quickrn switch type: '.type_name
    let b:quickrun_config = g:quickrun_config[type_name]
  endif
endfunction
function! s:quickrun_switch_complete(ArgLead, CmdLine, CursorPos)
  let key_list = keys(g:quickrun_config)
  let matched = []
  for key_str in key_list
    if stridx(key_str, a:ArgLead) == 0
      call add(matched, key_str)
    endif
  endfor 
  return matched
endfunction
command! -nargs=? -complete=customlist,s:quickrun_switch_complete QuickRunSwitch : call s:quickrun_switch(<f-args>)

" babelの設定
let g:quickrun_config['babel'] = {
      \ 'cmdopt': '--stage 1',
      \ 'exec': "babel %o %s | node"
      \ }
```

<!-- }}} -->

こいつは便利だぜー、とか思ってたら, 似たようなことを考える人はいたようで, [unite-quickrun-config](https://github.com/osyo-manga/unite-quickrun_config) というのが公開されてました. 最初からこっち使っときゃよかったかなー。

ま、command or uniteのsourceで多少違い出てるので良しとするか。
Facebook JS share

```js

	(function(d, s, id) {
		var js, fjs = d.getElementsByTagName(s)[0];
		if (d.getElementById(id)) return;
		js = d.createElement(s); js.id = id;
		js.src = "//connect.facebook.net/en_US/sdk.js#xfbml=1&version=v2.3&appId=***";
		fjs.parentNode.insertBefore(js, fjs);
	} (document, 'script', 'facebook-jssdk'));
	
	$('.btn').click(function() {
		FB.ui({
			method: 'feed',
			message: 'user msg',
			name: 'lego.com',
			caption: '',
			description: '',
			link: '',
			picture: 'http://xxx.png'
		},
		function (response) {
			if (response != null) {
				alert(432);
			}
		});
	});

```
BigQueryのセキュリティについて考えた

#このあたりでセキュリティのことも考えてみた
先に言っておきます。セキュリティ論を語るつもりはありません。
どんなことが出来るのか？そもそも色んな角度がありますが、私が知っている情報を整理してみたいと思います。

##Googleとしてのセキュリティ
CloudServiceなので、物理などどうしても手が出せない部分があったり、blackboxであるがゆえに不安なところもあります。しかし、Googleでは以下のような認証を受けて担保されていると私は考えています。
・ISO27001
・HIPAA
（参考）https://support.google.com/work/answer/6056694

ここには記載されていませんが、PCIDSSも取得しているようです。
http://japan.zdnet.com/article/35057333/

##アカウントに対するセキュリティ
アカウントに対してのセキュリティとBigQueryに対しての２種類があると思っています。
それぞれに対して解説していきます。
###Apps for workのセキュリティ
少し前までは、結構ゆるい感じを私自身も受けていました。メールサービスがあって、そしてスプレッドシートとかもおまけで使えるよ。そんな感じでした。（すいません・・・・）
しかし、今となってはアクセスする端末を指定したり二段階認証、アカウントに応じた様々な設定ができます。アクセスログなんかも取ってくれてこれは非常に便利だと私は思っています。

###BigQueryに対してのセキュリティ
dataset単位でアクセス権を設定できます。そして、そのアクセス権もowner・editor・readと３種類設定できます。
例えば、元データが入っているdatasetはreadで、勝手にviewを作りたい場合は違うdatasetを用意してあげて、そこはeditorにしてあげるとか。そんな使い方ができます。

###そして組み合わせる
Apps for workとBigQueryの組み合わせが一番最適だと思っています。それはApps for workでグループを作成して、そのグループ単位でアクセス権を設定できます。
例えば、Apps for workでhanbaiというグループを作成し、それをBigQueryのdatasetにreadで権限を付与します。そうすることで、Apps for work側でそのグループに人を追加するだけで、そのデータを見ることができます。うちの場合は、総務部や人事部がこのあたりで設定してくれるので、エンジニアは必要ありません。つまり「あっちもこっちも」なアカウント管理をしなくても良いのです。
（※GAも早くそうなってほしいもんですが・・・・・愚痴）

##監査について
ISMSやISO27001、PCIDSS、内部統制などを経験された方は、その審査で言われるのが「監査」ではないでしょうか？
誰が、いつ、どこで、どういうデータにアクセスしたのか？便利だからこそ、こういうところが非常に重要だと私は思っています。
BigQueryではこれをJobというカタチで残っているようです。APIで取得できます。（ここは中の人に聞きました）
https://cloud.google.com/bigquery/docs/reference/v2/jobs/list
ただし、非常に面倒で自分もまだ全てを理解していないのが実際です。
おそらく、このapiで取りながらbqで取っていくということになりそうですが、このあたりを次回で紹介したいと思います。

#最後に
『ど〜しよっかなぁ〜？（中邑風味）』でカジュアルに書こうかと思いましたが、ことがことなだけにちょいとまじめに書いてみました。
あと、監査の部分はどうしてもクリアしたいと思っていますので、先ほども書きましたが、このあたりをしっかり検証してまた書きます。
C++ メモリモデル メモ

C++ のメモリモデルについてのメモ。

# 評価

このメモでは以下の２つを評価と呼ぶ。

* オブジェクト M に対する読み込み (値の計算)
* オブジェクト M に対する書き込み (副作用)

規格上はこれら以外の評価もあるが、このメモで扱わない。

# happens before

*happens before* は評価と評価の間に定義される半順序関係。

感覚的に言えば、A happens before B であるとは、評価 B が始まる前に必ず評価 A が完了しているということ。

詳しくは後で。

# conflict

オブジェクト M と M に対する評価 A, B が以下の 3 条件を満たすとき、A と B は *conflict* しているという。

1. A happens before B でない。
2. B happens before A でない。
3. A, B の少なくとも一方が書き込み。

# atomic

`std::atomic<T>` テンプレートによってアトミックに読み込み、書き込みが可能なオブジェクトを作成できる。アトミックなオブジェクトは data race を起こさない。

アトミックオブジェクトに対する読み込み、書き込みには memory_order を指定することができる。

# happens before 再び

* 同じスレッド上で実行される評価の間には、プログラム上で表現されている通りの順序で happens before が入る。
* アトミックオブジェクト M に対する読み込み R と、M に対する書き込み W が以下の条件を満たすならば、W happens before R である。
    1. R が acquire operation.
    2. W が release operation.
    3. R が読んだ値が W によって書かれた値である。

(3番目の条件はもっと緩和できる。W から始まる release sequence のどれかの値なら OK）

// TODO: release sequence

# data race

オブジェクト M と M に対する評価 A, B が以下の 2 条件を満たすとき、プログラムに *data race* があるという。

1. M がアトミックでない。
2. A と B が conflict している。

プログラムに data race があるとき、その挙動は undefined behavior である。

# modification order

アトミックはオブジェクトは modification order という全順序を持っている。

アトミックオブジェクト M に対する全ての書き込みの集合を S とすると、M の modification order `<` は S の上の全順序。

アトミックオブジェクト M に対する読み込みと書き込みは、この modification order と矛盾しないように制約される。具体的には以下の 4 つの制約が入る。(制約に含まれる読み込みや書き込みは全て M に対するものとする。)

1. *(write-write coherence)* A, B を書き込みとする。A happens before B ならば A `<` B である。
2. *(read-read coherence)* A, B を読み込みとし、X を書き込みとする。A happens before B かつ A が X の値を読んだとすると、B は X の値か「X `<` Y であるような 書き込み Y」の値を読む。
3. *(read-write coherence)* A を読み込み、B を書き込みとする。A は「X `<` B であるような書き込み X」の値を読む。
4. *(write-read coherence)* A を書き込み、B を読み込みとする。A happens before B であるとき、B は A の値を読むか「A `<` X であるような書き込み X」の値を読む。

要するに、アトミックオブジェクトに対する書き込みは reorder してはいけない。（reorder したことが外部から観測可能であってはいけない）

# visible side effect

1. アトミックオブジェクト M に対する読み込み R が読む値は、次の条件を満たすある書き込み W が書いた値である。
   1. M に対する書き込みである。
   2. R happens before W でない。
2. アトミックでないオブジェクト M に対する読み込み R は、以下の2条件を満たす M に対する書き込み W によって書かれた値を読む。(W は一意に決まる)
   1. W happens before R
   2. W happens before X かつ X happens before R であるような M への書き込み X が存在しない。

アトミックでないオブジェクトを読み込んだときに、値の候補が複数ある（「一つ前」の書き込みが複数ある）ような場合は、必ず undefined behavior になる。つまり、値の候補を書き込んだ 2 つの書き込み A, B の間に happens before 関係が存在しないということなので、A と B は conflict している。よって data race が存在する。
lessで名前リスト変数からセレクタを作る(解説付き)

CSSで次のような同じようなクラスをたくさん定義したいときがあります。あれ、ない？とりあえず、自分の環境でそんなことがありました。

```css:css
.color_beige {
  background-image: url('/img/beige.png');
}

.color_beige:active {
  background-image: url('/img/beige_on.png');
}

.color_black {
  background-image: url('/img/black.png');
}

.color_black:active {
  background-image: url('/img/black_on.png');
}

.color_blue {
  background-image: url('/img/blue.png');
}

.color_blue:active {
  background-image: url('/img/blue_on.png');
}

/* ・・・ 以下同じようなクラス定義がたくさん ・・・ */
```

こういう同じようなコード、エディタのマクロ機能などを使えば量産も可能ですが、面倒くさいですし、あとあとメンテナンスが大変です。
そこでLESSを使うと、変数を使ってセレクタを作ることができます。とりあえず、こんな感じ。

```css:less
@colors: beige, black, blue, brown, gold, gray, green, navy, orange, pink, purple, red, silver, white, yellow;

.myMixin(@whichPseudo) {
  @pseudo-selector: ~".color_@{whichPseudo}";
    &@{pseudo-selector} {
      background-image: url('/img/@{whichPseudo}.png');
      &:active{
        background-image: url('/img/@{whichPseudo}_on.png');
      }
    }
}

.loop (@i) when (@i > 0) {
  .loop(@i - 1);
  .myMixin(extract(@colors, @i));
}

.loop (length(@colors));
```

コード自体の長さはそれほど変わりませんが、重複がかなり減りました。それではこの仕組みについて、以下で解説します。

なお、自分が使用しているのは、Brackets(バージョン1.2)のLESS AutoCompile(バージョン1.1.8)です。他の環境だとコンパイルエラーが出るかもしれませんのでご注意を。

# セレクタの為の変数を作る
まずは、作成したいセレクタの名前を変数に列挙します。上記lessコードの一行目。

```css:less
@colors: beige, black, blue, brown, gold, gray, green, navy, orange, pink, purple, red, silver, white, yellow;
```

lessの言語仕様には、一応リスト型変数というものがあります。実体はただのカンマ区切り文字列で、これをこのまま文字列として表示することもできるのですが、lessの組み込み関数、lengthとextractでリストのように扱うことができます。これをループ処理と組み合わせて使うことで、セレクタを量産していきます。

# ループで使用するmixinを定義する

実はこの辺よくわかってないのですが、mixin機能を使って生成するセレクタを定義します。以下のサイトを参考にしました。

 * [css less adding a variable to the selector](http://stackoverflow.com/questions/13266828/css-less-adding-a-variable-to-the-selector)

```css:less
.myMixin(@whichPseudo) {
  @pseudo-selector: ~".color_@{whichPseudo}";
    &@{pseudo-selector} {
      background-image: url('/img/@{whichPseudo}.png');
      &:active{
        background-image: url('/img/@{whichPseudo}_on.png');
      }
    }
}
```

この場合、冒頭の`@pseudo-selector: ~".color_@{whichPseudo}";`で指定したとおりのセレクタ(と、そのオブジェクトがアクティブなときのセレクタ)が作成されます。

# ループ処理

そしてループ処理です。ループ処理の中で先ほど定義したmixinを呼び出すことで、実際のセレクタを作成します。

```css:less
.loop (@i) when (@i > 0) {
  .loop(@i - 1);
  .myMixin(extract(@colors, @i));
}

.loop (length(@colors));
```

最後の`.loop (length(@colors));`で、`@colors`に指定した配列の要素ぶん、ループを実行します。結果的に、リストに含まれるすべての要素を使ったセレクタが生成されます。
直接Vagrant用のBoxをatlasからダウンロードする

ときにBoxを`vagrant init boxname`の代わりに、ローカルに保存し導入するケースが想定されるかもしれない。

http://www.vagrantbox.es/ はBoxのURLが表示されているので、そのままダウンロードできますが、実はオフィシャルサイトatlasにも直接Boxダウンロード可能。

例えば、https://atlas.hashicorp.com/chef/boxes/centos-7.0 はcentos 7.0のBox、ダウンロードするとき、URLにバージョンとプロバイダをつけることでhttps://atlas.hashicorp.com/chef/boxes/centos-7.0/versions/1.0.0/providers/virtualbox.box になります、これは実際のBoxのURLです。
Subversionでコミットメールを送信する

## 概要
svnコミット時にコミットログをメール送信する。
mailer.pyでやるやり方ではうまくいかなかったので、mailコマンドでやってみた。


## 環境
* Mail version 8.1 6/6/93.

## 手順

#### hookスクリプトをコピーし、実行権限を付与

```
$ cd /path/to/repository/hooks
$ cp -p post-commit.tmpl post-commit
$ chmod +x post-commit
```

#### post-commitを編集

```bash:post-commit
# 文字化け対策
export LANG=ja_JP.utf8

REPOS="$1"
REV="$2"

TITLE="Subversion committed to repos ${REV}"
FROM_ADDR="no-reply@hoge.com"
TO_ADDR="hoge@hoge.jp"

# コミットユーザ
COMMIT_AUTOER=`svnlook author -r ${REV} ${REPOS}`
# コミットログ
COMMIT_LOG=`svnlook log -r ${REV} ${REPOS}`
# コミットファイル
COMMIT_FILES=`svnlook changed -r ${REV} ${REPOS}`

echo -e "${COMMIT_AUTOER}\n\n${COMMIT_LOG}\n\n${COMMIT_FILES}" | mail -s "${TITLE}" ${TO_ADDR} -- -f ${FROM_ADDR}

```
pry の中でも利用されている method_source gem を試す #ruby

## :gem: 概要
pry の中でも利用されている method_source gem を試します

## <i class="fa fa-cloud-download" style="font-size:1em;"></i> インストール

pry を利用している方はインストール不要

~~~bash
$ gem install method_source
~~~

## <i class="fa fa-flask" style="font-size:1em;"></i> サンプル
### サンプルコード: `Methods#source_location`

~~~ruby:source_location.rb
require "set"
require "method_source"

class Hoge
  # hoge method header
  def hoge
    # before hoge
    "hoge"
    # after hoge
  end
end

class Child
  include MethodSource::ReeSourceLocation
end

# 自ファイルの source_location
print Hoge.instance_method(:hoge).source_location, "\n"

# source_location gem の source_location
print Child.new.method(:source_location).source_location
~~~

* 出力確認

~~~bash
# 自ファイルの source_location
["source_location.rb", 6]
# source_location gem の source_location
["/path/to/ruby/gems/2.1.0/gems/method_source-0.8.2/lib/method_source/source_location.rb", 5]%
~~~

### サンプルコード: `Methods#source`, `Methods#source.comment`

~~~ruby
require "set"
require "method_source"

class Hoge
  # hoge method header
  def hoge
    # before hoge
    "hoge"
    # after hoge
  end
end

puts Hoge.instance_method(:hoge).source
puts Hoge.instance_method(:hoge).comment
~~~

* 出力

~~~bash
  def hoge
    # before hoge
    "hoge"
    # after hoge
  end
# hoge method header
~~~

## :books: 外部資料
* <i class="fa fa-external-link" style="font-size:1em;"></i> [method_source GitHub](https://github.com/banister/method_source)
* <i class="fa fa-external-link" style="font-size:1em;"></i> [method_source RubyGems](https://rubygems.org/gems/method_source)
Font Awesomeで回転したいときfa-spinが便利

こんな感じのコードをかく

```html
<div>
<span class="fa fa-spin">く
<span class="fa fa-spin">る
<span class="fa fa-spin">く
<span class="fa fa-spin">る
<span class="fa fa-spin">く
<span class="fa fa-spin">る
<span class="fa fa-spin">く
<span class="fa fa-spin">る
<span class="fa fa-spin">く
<span class="fa fa-spin">る
<span class="fa fa-spin">く
<span class="fa fa-spin">る
<span class="fa fa-spin">く
<span class="fa fa-spin">る
<span class="fa fa-spin">く
<span class="fa fa-spin">る
</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span>
</div>
```

いいかんじにまわる
<p data-height="265" data-theme-id="0" data-slug-hash="KqayLz" data-default-tab="html,result" data-user="hanachin" data-embed-version="2" data-pen-title="KqayLz" class="codepen">See the Pen <a href="https://codepen.io/hanachin/pen/KqayLz/">KqayLz</a> by Seiei Miyagi (<a href="https://codepen.io/hanachin">@hanachin</a>) on <a href="https://codepen.io">CodePen</a>.</p>
<script async src="https://production-assets.codepen.io/assets/embed/ei.js"></script>
Selenium Webdriver：wd.jsでselect boxの選択

Selenium Webdriverを使うのに[wd.js](https://github.com/admc/wd)を使っているのですが、node.jsだとどうやってselect boxを選択するのか分からなくて調べたので結果をメモしておきます。

Javaだとelementに対してselectByVisibleText()を使うことで選択可能みたいだったんだけど、[wd.js](https://github.com/admc/wd/blob/master/doc/api.md)のAPIマニュアルを見るとそんなのも無いし・・・という感じで調べていたらURLは忘れましたがstackoverflowでpythonの場合のやり方を聞いている人がいて、回答にxpathを指定すればOKというのを見つけて、なるほどね！ということでwd.jsでもやってみたところ上手くできました。

下はyahooの路線検索で、22日の13時20分着の電車を調べるサンプルコードです。

```js
"use strict";

var wd = require("wd");

require('colors');
var chai = require("chai");
var chaiAsPromised = require("chai-as-promised");
chai.use(chaiAsPromised);
var should = chai.should();
chaiAsPromised.transferPromiseness = wd.transferPromiseness;

describe("Select box test", function () {
  this.timeout(300000);
  var driver;

  before(function () {
    var serverConfig = {
      host: 'localhost',
      port: 4444
    };

    driver = wd.promiseChainRemote(serverConfig);

    var desired = {
      browserName: 'chrome',
      platformName: 'mac',
    };
    return driver.init(desired);
  });

  after(function () {
    return driver
      .quit();
  });

  it("should get the url", function () {

    return driver
      .get('http://www.yahoo.co.jp')
      .waitForElementByLinkText('路線')
        .click()
      .waitForElementByCssSelector('#sfrom')
        .type('秋葉原')
      .waitForElementByCssSelector('#sto')
        .type('新宿')
      .waitForElementByXPath('//*[@id="d"]/option[22]')
        .click()
      .waitForElementByXPath('//*[@id="hh"]/option[13]')
        .click()
      .waitForElementByXPath('//*[@id="mm"]/option[20]')
        .click()
      .waitForElementByXPath('//*[@id="tsArr"]')
        .click()
      .waitForElementById('searchModuleSubmit')
        .click()
      .waitForElementByClassName('title')
        .text().should.eventually.equal('秋葉原→新宿')
      .saveScreenshot('test_result.png');
  });

});

```

実行結果はこのように。

![test_result.png](https://qiita-image-store.s3.amazonaws.com/0/22325/7c7580c7-1f41-57c3-6062-c49fec42ff65.png)
uGUIに当たっているかを調べる

Physics.Raycastで調べたいオブジェクトとuGUIが混在している場所で、
UIに当たっていたらRaycastを除外したい時などに利用できます。

```
public static bool IsUGUIHit(Vector3 _scrPos){ // Input.mousePosition
	PointerEventData pointer = new PointerEventData (EventSystem.current);
	pointer.position = _scrPos;
	List<RaycastResult> result = new List<RaycastResult> ();
	EventSystem.current.RaycastAll (pointer, result);
	return (result.Count > 0);
}
```

UI Imageなど、UIの当たりを検出したくない場合は
該当のUIに下記のスクリプトをアタッチすることで実現できます。

```
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;

public class UIIgnoreHit : Button, ICanvasRaycastFilter {
	public bool IsRaycastLocationValid (Vector2 sp, Camera eventCamera){
		return false;
	}
}
```
Incoming WebHooksを使ってslackにPOSTするシェルスクリプト

## やりたいこと
任意のファイル /tmp/hoge の中身を slack に POST する。

## ソース

```bash:slack_post.sh
#!/bin/bash

WEBHOOKURL="slackのIncoming WebHooksの設定にて取得するURL"
MESSAGEFILE=$1
CHANNEL="POSTしたいチャンネル名"
BOTNAME="slack側のbotの名前"
FACEICON=":raising_hand:"
TMPFILE=$(mktemp)
 
cat ${MESSAGEFILE} | tr '\n' '\\' | sed 's/\\/\\n/g' > ${TMPFILE}
WEBMESSAGE=$(cat ${TMPFILE})
 
curl -s -S -X POST --data-urlencode "payload={ \
    \"channel\": \"${CHANNEL}\", \
    \"username\": \"${BOTNAME}\", \
    \"icon_emoji\": \"${FACEICON}\", \
    \"text\": \"${WEBMESSAGE}\" \
    }" ${WEBHOOKURL} >/dev/null
 
if [ -f "${TMPFILE}" ] ; then
    rm -f ${TMPFILE}
fi

exit 0
```


## 使い方
引数にPOSTしたい内容が記載しているファイルを指定

```
./slack_post.sh /tmp/hoge
```

## 参考サイト
[[10分で出来る]シェルスクリプトの結果をslackに投稿](http://blog.cloudpack.jp/2015/03/25/10-minutes-to-send-result-of-shell-script-to-slack/)
ほぼこちらのサイト様の内容を用いて作成させて頂きました。
Node.jsからDynamoDBを操作する際に便利そうなやつを試す。


# 1. dynamodb-marshaler

データを登録したりするときに、いちいち下記のように "S": とか書くのがめんどくさい。
取り出したデータも同様の形になってて使うのがめんどくさい。

```js
Item: {
    'id':       {"S": "1003"},
    'name':     {"S": "orange"},
    'price':    {"N": "210"}
}
```

なので、DynamoDBの求めるデータ型と、json形式を相互変換してくれるやつを試す。

https://github.com/CascadeEnergy/dynamoDb-marshaler


## インストール:

```
$ npm install dynamodb-marshaler --save
```

## プログラム:

```
var marshaler = require('dynamodb-marshaler');

data = {
    name: "John",
    birth: {
        "year": 1980,
        "month": "January",
        "day": 14
    }
}

// 元データ表示
console.log(data);

// 変換後
var res = marshaler.marshalItem(data);
console.log(res);

// 元に戻す
var orig = marshaler.unmarshalItem(res);
console.log(orig);
```

## 出力:

```
{ name: 'John',
  birth: { year: 1980, month: 'January', day: 14 } }
{ name: { S: 'John' },
  birth: { M: { year: [Object], month: [Object], day: [Object] } } }
{ name: 'John',
  birth: { year: 1980, month: 'January', day: 14 } }
```

ちゃんと、変換して元のデータに戻しても同じ状態。
LIST と StringSet の扱いが注意が必要そう。

あと、便利そうなのが、mapで一括でハッシュの配列にするやつ。

## プログラム: 

```
var data = dynamodb.scan({
    TableName: 'json_test'
}, function(err, data) {
    var items = data.Items.map(marshaler.unmarshalItem);
    console.log(items);
});
```

## 出力: 

```
[ { name: 'delete_item!', id: '1010', price: 222 },
  { name: 'batch-put-item-2!', id: '2002', price: 9991 },
  { name: 'batch-put-item-1!', id: '2001', price: 9990 },
  { name: 'banana', id: '1002', price: 80 },
  { name: 'apple', id: '1001', price: 120 },
  { name: 'orange', id: '1003', price: 30 } ]
```

これは良さそう。
Aureliaのdocs.mdに書いてある機能を試す(1)


skelton-navigationも動作したので、docs.md に書いてある機能を試していくことにします。docs.md は機能の説明はあるんですが、動くコードが見当たらなかったりすることもしばしばあるので、skelton-navigationをベースにdocs.md の機能を確認していくことにします。

## 初期化時の設定スクリプト

Aureliaの初期化時にフレームワークの設定を変更したり、任意のコードを実行したりします。これは、最新のskelton-navigationにはanimationのサンプルとして入っています。[skelton-navigationの補足](http://qiita.com/bohnen/items/8e634f3be48dc06d5399) を見ていただけると使い方がわかると思います。

注意しなければならない点として、この機能を使うとAureliaの初期化は行われなくなり、自分で必要な初期化を行わなければなりません。
サンプルのconfigureスクリプトのうち

```javascript
  aurelia.use
    .standardConfiguration()
    .developmentLogging()
```

この部分だけが、必要な初期化になります。`standardConfiguration` は標準の初期化を行うための便利関数です。中で何をやっているかは、[bootstrapperのソース](https://github.com/aurelia/bootstrapper/blob/master/src/index.js) を見ると良いでしょう。

## ロガー

上記では合わせてロガーの設定(`developmentLogging`)をしています。中ではコンソールアペンダーをセットしています。
docs.mdでは、ログの出し方やログレベルの設定もわかるだろ? って書いてあるんですが、分からないです。はい。

先ほどのbootstrapperのソース中でも使っているので分かりました。使い方は

* LogManagerをimport
* debug / info / warn / error の各メソッドでレベルを指定
* 引数を渡せる

ログをapp.js に組み込んでみたのが下記です。

```javascript
// Logmanagerのimport
import {inject,LogManager} from 'aurelia-framework';
import {Router} from 'aurelia-router';
import 'bootstrap';
import 'bootstrap/css/bootstrap.css!';

// ロガーの取得。この時出力するクラス名をセット
var logger = LogManager.getLogger('app');


@inject(Router)
export class App {
  constructor(router) {
    //debugログ
    logger.debug('start app constructor');
    
    this.router = router;
    this.router.configure(config => {
      config.title = 'Aurelia';
      config.map([
        { route: ['','welcome'],  moduleId: './welcome',      nav: true, title:'Welcome' },
        { route: 'flickr',        moduleId: './flickr',       nav: true },
        { route: 'child-router',  moduleId: './child-router', nav: true, title:'Child Router' }
      ]);
    });
    
    // infoログ。ここではES6のtemplate stringや、引数も試している
    logger.info(`router configured : ${router.title}`,[router]);
  }
}
```

Javaやっている人はお馴染みの使い方ですね。ただ、出力フォーマットは固定です。
こんな感じでコンソールに出力されます。

![スクリーンショット 2015-04-20 21.40.00.png](https://qiita-image-store.s3.amazonaws.com/0/12495/ebbdff4a-2546-fcf5-1b02-53186c48cc92.png "スクリーンショット 2015-04-20 21.40.00.png")



最後のinfoでは、[template string](https://babeljs.io/docs/learn-es6/)を使って変数を文字列にしてみたり、引数にオブジェクトを渡してコンソールに出力したりしています。
javascriptでサーバーからJSON取得



```javascript:JSON.js
var xmlHttpRequest = new XMLHttpRequest();
xmlHttpRequest.onreadystatechange = function()
{
    if( this.readyState == 4 && this.status == 200 )
    {
        if( this.response )
        {
            console.log(this.response);
            // 読み込んだ後処理したい内容をかく
            
        }
    }
}

xmlHttpRequest.open( 'GET', 'ここにURL', true );
xmlHttpRequest.responseType = 'json';
xmlHttpRequest.send( null );
```
API Blueprintでハッピードキュメントライフ

# API Blueprint

API Blueprintは、APIドキュメントを記述するためのMarkdown拡張です。おおくのツールが公開されており、htmlに変換したり、mock-serverを立てたりできます。

また、Markdown likeなのでそのままでもGithub等で読めます。便利！

つまり、**ルールに従ってMarkdownを書くと、モックやhtmlが出来上がる** ということです。最高ですね。

# 他の方法との比較

公式サイトには、他の方法と比較した時の以下の様な利点が挙げられています。

## API Blueprint vs. DIY

車輪の再発明をしてる暇があったらAPI開発しようぜ！

API Blueprintは君にヤバいツールを提供する。それを使ってみんなと議論すれば、あとはドキュメントやテスト、Railsのコードすら自動生成できるんだ。

## API Blueprint vs. JSON

JSONって人間が書くものじゃないでしょ？ そんなのプログラムに任せればいいんだよ。

君が書いたドキュメント、来年になったら誰が管理するの? API Blueprintなら誰だって管理できるんだ。デザイナやコピーライターでもね。

## API Blueprint vs. Google Docs

コードは進化し、分岐して行く。バージョンが付けられ、テストされる。そしてそれはコードだけでなく、ドキュメントだってそうあるべきだ。

API Blueprintは、リポジトリの中でコードと共存する。そして、コードと同じライフサイクルを持ち、君の大好きなCIやワークフローに乗せることができるんだ。

# とりあえずはじめよう

[Apiary](https://apiary.io/)というサービスがあります。
Blueprintを書くと、モックサーバーとドキュメントのサイトが生成される超絶便利なサービスです。

しかもなんと、Githubと連携して既存のリポジトリに追加することができます。

それ以外にも、わざわざcurlを叩かなくてもサービス上からレスポンスを確認できたりと、めちゃくちゃ便利です。

# ローカルで使いたい

## node環境で使いたい

### ドキュメント生成・プレビュー

```bash
$ npm install -g aglio
$ aglio -i api.md -o api.html # convert to html
$ aglio -i api.md --server # preview server
```

プレビュー用のサーバーは、ファイルを更新するとリロードしてくれたりと、結構高機能です。

gulpを使いたい場合はこんな感じ。

```bash
$ npm install aglio-gulp
```

```
var aglio = require('gulp-aglio');
gulp.task('docs', function () {
  gulp.src('_docs/*.md')
    .pipe(aglio({ template: 'default' }))
    .pipe(gulp.dest('docs'));
});
```

### モックサーバー

```bash
$ npm install -g api-mock
$ api-mock api.md
```

こちらはファイルを変更すると、サーバーを立ち上げ直さないと変更が反映されません。
モックサーバーを利用しながらAPIを変更するということは無いと思うので大丈夫だと思いますが。

## その他の環境で使いたい

[公式サイト](https://apiblueprint.org/)に、ツールのリストがあるので、そちらを参照するとよいでしょう。

# Blueprintの書き方

ざっくり書こうと思ってたんですが、思ったよりも柔軟でいろいろと複雑だったのでそのうち別の記事を書きます。

# まとめ

あなたもいますぐ、API Blueprintでハッピードキュメントライフを送りましょう！

# 参考

- [danielgtaylor/aglio](https://github.com/danielgtaylor/aglio)
- [gulp-aglio](https://www.npmjs.com/package/gulp-aglio)
- [api-mock](https://www.npmjs.com/package/api-mock)
- [API Blueprint - API Documentation with powerful tooling](https://apiblueprint.org/)
MacでVimでPlantUMLの編集環境を作る

![スクリーンショット 2015-04-20 19.56.58.png](https://qiita-image-store.s3.amazonaws.com/0/2382/f9585601-4f9c-364d-605e-02b5fa731cc4.png)

今でもクラス図やパッケージ図などはAstahなどを利用することが多いですが、シーケンス図に関して言えば圧倒的に[PlantUML](http://plantuml.sourceforge.net/)が便利だと感じています。シーケンス図は、レイアウトに関しては機械的なレイアウトが有効的なことが多いので、こっちの方が便利ですね。

シンタクスハイライトだけならやることは簡単、vimに[aklt/plantuml-syntax](https://github.com/aklt/plantuml-syntax)を導入するだけです。

[NeoBundle](https://github.com/Shougo/neobundle.vim)を利用しているのであれば、

```vim
" pluntumlのシンタクスハイライトと:makeコマンド
NeoBundle "aklt/plantuml-syntax"
```

を書いて`:NeoBundleInstall`でとりあえず、 *.pu か *.uml か *.plantuml でシンタクスハイライトが効くようになります。

あとは`:make`で画像の出力と表示をするようにしましょう。
まず、`$HOME/local/lib/`に`plantuml.jar`を置いておき、

```sh
#!/bin/bash
java -jar $HOME/local/lib/plantuml.jar -tpng $@
open ${@%%.*}.png
```
上記のシェルスクリプトを`$HOME/dotfile/plantuml`というファイル名として実行権限を付けおいておきましょう。そして、`.vimrc`に

```vim
" plantumlスクリプトの設定
let g:plantuml_executable_script="~/dotfiles/plantuml"
```

以上を記述しておけば`:make`を実行することで、画像を出力し、.pngファイルの拡張子が関連付けられたビュアーで自動的にその画像を開いてくれるようになります。

![スクリーンショット 2015-04-20 20.05.28.png](https://qiita-image-store.s3.amazonaws.com/0/2382/a534f549-42a3-86bc-c012-8329994a63cb.png)

以上のような感じでビュアーで開かれます。とても便利です。

なお、他の開発環境に関しては、[こちら](http://plantuml.sourceforge.net/running.html)にもまとまっていますが、ちょっとしたものを書くときにはvimが大変便利です。

# 追伸
以上の例のために書いたシーケンス図を張っておきます。あと、この設定がされたdotfilesは[こちら](https://github.com/sifue/dotfiles)に上がっています。

```
@startuml
title 家計簿アプリの家計簿取得シーケンス

participant "ユーザー"

box "家計簿システム" #LightBlue
    participant "Play"
    participant "Redis"
    participant "MySQL"
end box

"ユーザー" -> "Play" : 家計簿を取得
"Play" -> "Redis" : ユーザーID、今月という時間をキーに取得
    alt キャッシュヒット
        "Play" <-- "Redis" : 家計簿情報または家計簿がないという情報
    else キャッシュミス
        "Play" <-- "Redis" : キャッシュされていないという情報
        "Play" -> "MySQL" : 家計簿取得
        "Play" <-- "MySQL"
        alt 家計簿情報あり
            "Play" ->> "Redis" : 非同期に\n家計簿情報を格納
        else 家計簿情報なし
            "Play" ->> "Redis" : 非同期に\n家計簿がないという情報を格納
        end
    end
"ユーザー" <-- "Play" : 家計簿情報または家計簿がないという情報
@enduml
```
Visual Studio Community 2013 消していいファイル

ソリューションのフォルダ内に生成されるファイルのうち，消してよいものと悪いもの．

# 消してよい
* *.sdf
* debug, releaseフォルダ (x64プラットフォームの場合は，x64フォルダ以下全て)

# 消してはだめ
* *.sln
* *.vcxproj
* *.vcxproj.filters 消しても起動するが，ソリューションエクスプローラ内で，拡張子によるファイルの分類がなされなくなる．

(随時追記します)
Swig でデータバインディングして静的HTMLを生成する

### データ

```json:data.json
{
  "myData" : "Hello",
  "myNumber" : 42
}
```

### テンプレート

```html:template.html
<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8">
  <title>Title of the document</title>
</head>
<body>
  {{myData}} ----- {{myNumber}}
</body>
</html>
```

### コンパイルスクリプト

```js
var fs = require('fs');
var swig = require('swig');
var data = require('./data.json');
var html = swig.renderFile('template.html', data);
fs.writeFileSync('output.html', html);
```

### 出力結果

```html:output.html
<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8">
  <title>Title of the document</title>
</head>
<body>
  Hello ----- 42
</body>
</html>
```
Ruby - LotusのControllerをRailsっぽく1ファイルにまとめたい

routingの設定で少し悩んだのでメモ

```rb
# apps/web/config/routes.rb
get '/', to: 'home#index'
get '/show', to: 'home#show'
```

このようにroutingに記述した場合、1画面ごとに対応するファイルを作った。
個人的に、これファイル多すぎと感じたので下記のように記述したところ動作した。

## before
- apps/web/controllers/home/index.rb

```rb
module Web::Controllers::Home
  class Index
    include Web::Action

    def call(params)
    end
  end
end
```

- apps/web/controllers/home/show.rb

```rb
module Web::Controllers::Home
  class Show
    include Web::Action

    def call(params)
    end
  end
end
```

- apps/web/views/home/index.rb

```rb
module Web::Views::Home
  class Index
    include Web::View
  end
end
```

- apps/web/views/home/show.rb

```rb
module Web::Views::Home
  class Show
    include Web::View
  end
end
```

- apps/web/templates/home/index.html.erb
- apps/web/templates/home/show.html.erb

## after

- apps/web/controllers/home/index.rb

```rb
module Web::Controllers::Home
  class Index
    include Web::Action

    def call(params)
    end
  end

  class Show
    include Web::Action

    def call(params)
    end
  end
end
```

- apps/web/views/home/index.rb

```rb
module Web::Views::Home
  class Index
    include Web::View
  end
  
  class Show
    include Web::View
  end
end 
```

- apps/web/templates/home/index.html.erb
- apps/web/templates/home/show.html.erb

あんましっくりきてないけどとりあえずはこれで行こうと思う。
もっといい書き方あったら教えてください。
音声対話システムの評価方法

音声対話システムは個々のシステムの評価とシステム全体の評価があり、的確に評価をするのが難しい。

そこで下記の資料を参考に音声対話システムの評価法をまとめた。

#システム個々の評価

音声認識、言語理解は答えを用意して評価

音声認識部：文認識率、単語認識率
言語理解部：意味理解率、意味スロット認識率

#システム全体の評価

１：対話ログなどを用いた客観的な評価

メリット：大規模にタスク達成率、平均ターン数によってシステムの状態や効率を評価可能
デメリット：タスクの達成率の定義が難しい。

２：ユーザーアンケートによる主観評価

メリット：ユーザーの満足度を直接図れるので、タスク達成率、平均ターン数では捉えきれない要因を探れる
デメリット：大規模に行うことが難しい。

#その他の評価の試み

##シミュレーションによる評価方法
ユーザーの振る舞いを模擬するシミュレーションを作成、シミュレーターと対話システムのログを収集して性能を評価
音声対話システムに適用するためにシミュレーターが出力する文に乱数で誤認識と生じさせたり、実際の録音音声を用いる手法

##ユーザー満足度の分析的な評価手法

PARADISEというフレームワーク

目的：ユーザー満足度を最大化
タスク達成率を最大化し、対話に伴うコストを最小化

![Screenshot from 2015-04-20 19:17:25.png](https://qiita-image-store.s3.amazonaws.com/0/10496/c86e3649-929e-ace0-3616-2a2de936d1e1.png)

１：タスク達成率をタスクのシナリオと実際に行われた対話ログを比較することによって作成された属性・値の混同行列から得る。

混同行列を算出する手順

![time table.png](https://qiita-image-store.s3.amazonaws.com/0/10496/4832f8bb-27aa-7612-d4e7-15dffa2d6433.png)

上記のようなタイムテーブルドメインにおいて、

下記のようなエージェントの会話を100回行ったとき

エージェントＡ

![dilogue1.png](https://qiita-image-store.s3.amazonaws.com/0/10496/161b0014-2167-f9b3-2946-b5157a7c9d77.png)


エージェントＢ

![dilogue2.png](https://qiita-image-store.s3.amazonaws.com/0/10496/ed79b9d5-9f4f-6e9b-8698-c4fd7c45260e.png)

下記の図はKEYの値が
DEPART CITYの”Milano,Roma,Torino,Trento”の４つのラベルが何回観測されたか
同様に
ARRIVAL CITYの”Milano,Roma,Torino,Trento”の４つのラベルが何回観測されたか

DEPART RANGEの”morning,evening”の２つのラベルが何回観測されたか

DEPART TIMEの”6am,8am,6pm,Spm”の４つのラベルが何回観測されたか

を各値において表している。

![confusion matrix.png](https://qiita-image-store.s3.amazonaws.com/0/10496/bb2ec293-be30-9e19-01ce-c4cffdc1ee05.png)

TはM(t1...tn)の和
tiは各列の総頻度
iは各列を表す
各キーにおいてどれだけ値が一致したかを判断する指標

```math
\begin{aligned}
P(E) & = \sum_i^n (\frac{t_i}{T})^2 \\
\end{aligned}
```

M(i,i)は対角線上の値
シナリオのキーとの一致率

```math
\begin{aligned}
P(A) & =  \frac{\sum_i^nM(i,i)}{T} \\
\end{aligned}
```


タスクの達成率は混同係数で計測される。

```math
\begin{aligned}
κ & = \frac{P(A) - P(E) }{ 1 - P (E) } \\
\end{aligned}
```


２：コストを対話ログから

発話数、総対話時間のような効率性を測る要素
応答遅延、不適切応答率のような対話の質

得る

３：上記のタスク達成率とコストに正規化関数をかけ、平均０、標準偏差１に揃える

４：アンケートによって得られたユーザーの満足度と上記のようにして得られた各種の要因に対して重回帰文s系を行い、ユーザー満足度に寄与する重みを求める。

```math
\begin{aligned}
Performance & = (a * N (k))-\sum w_i * N(c_i) \\
\end{aligned}
```

これによって、どの要因が最もユーザー満足度を高めるのに寄与しているか分かるとともに、対話戦略の変更などによる全体的なシステムの質の工場が客観的な尺度で評価できるようになる。

参考
http://www.aclweb.org/anthology/P97-1035

http://www.amazon.co.jp/%E9%9F%B3%E5%A3%B0%E5%AF%BE%E8%A9%B1%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0-%E7%9F%A5%E3%81%AE%E7%A7%91%E5%AD%A6-%E6%B2%B3%E5%8E%9F-%E9%81%94%E4%B9%9F/dp/4274203050
D言語でプログレスバーを表示するためのライブラリを作ったよ

# はじめに

こんにちは。皆さんD言語使っていますか？
コンソールに簡単にプログレスバーを表示する [progress-d](https://github.com/kazoo04/progress-d) を作ったので紹介します。

**追記: dubにも progress-d で登録してあります**

## どんな感じなの

こんな感じ。終わりまでの予想時間 (ETA: Estimated Time of Arrival) も表示されて便利。

![progress-d_screenshot.png](https://qiita-image-store.s3.amazonaws.com/0/11852/b72b2295-30d0-dda6-b200-856f32a7356d.png)

## なんで作ったの

機械学習系ではたくさんのファイルに対して重い処理を行ったりするので、今どれくらい終わったのか、どれくらい待てば終わるのかがわかりません。
いままでは「42/10000」のように割合は表示していたのですが、これだと終わりまでどれくらい時間がかかるのかわからないし、表示方法も味気ないのでプログレスバーが表示できるようにしました。


# 使いかた

使い方は簡単で、`Progress` のインスタンスを作って、あとは `next()` を呼ぶたびにプログレスバーが表示されます（100% になるまでの予想時間も表示されます）。

`title` プロパティをいじるとヘッダ部分に表示する文字列を変えられます。

```d
import std.stdio;
import std.datetime;
import core.thread;
import progress;

void main(string[] args) {
  size_t iteration = 100;
  Progress p = new Progress(iteration);
  p.title = "Downloading";

  for(int i = 0; i < iteration; i++) {
    p.next();
    Thread.sleep(dur!("msecs")(80));
  }
  writeln();
}
```

# 今後

コンソールの幅を簡単に取る方法がわからなかったので、今はLinux専用です。
近いうちにOSXやその他のプラットフォームにも対応させるかもしれません。
まあ、うまく取得できない環境では固定幅表示でも良いのですが。
python から jar を使いたい

# python から jar を使いたい

JNIだとCPython使わないとならないみたいなので、
[py4j](http://py4j.sourceforge.net/) とかいうのがよさげ。
別プロセスでjavaを起動してソケット通信でpythonとブリッジする的なやつ。

`kuromoji`と自作のjarで試してみた。
っていうか、pythonから`kuromoji`が使えると嬉しかったので、いろいろ試してみた結果。

## 準備

* py4jの中から `py4j0.8.2.1.jar` を取り出して用意しておく
* `kuromoji-0.7.7.jar` を用意しておく

## コード

### まず自作のやつ

```java:org/kuryu/Sample.java
package org.kuryu;

public class Sample {
  public String foo() {
    return "FOO!!!!!!!!";
  }

  public static String bar() {
    return "BAR!!!!!!!!";
  }
}
```

```bash:jarにする
$ javac org/kuryu/Sample.java
$ jar cvf kuryu.jar org/kuryu/*.class
```

### py4jのjava側のコード

```java:J4Py.java
import py4j.GatewayServer;

public class J4Py {
  public static void main(String[] args) {
    J4Py app = new J4Py();
    GatewayServer server = new GatewayServer(app);
    server.start();
  }
}
```

manifestに自作のjarとkuromojiも加えておく。

```text:manifest.mf
Main-Class: J4Py
Class-Path: py4j0.8.2.1.jar kuromoji-0.7.7.jar kuryu.jar
```

```bash:jarにする
$ javac -cp py4j0.8.2.1.jar J4Py.java
$ jar cvfm J4Py.jar manifest.mf J4Py.class
```

#### GatewayServerの起動

classpath通して起動すれば、py4j側からも使えるらしい。

```bash:jarで起動する場合
$ java -jar J4Py.jar
```

```bash:classで起動する場合
$ java -cp py4j0.8.2.1.jar:kuromoji-0.7.7.jar:kuryu.jar:. J4Py
```

### py4jのpython側のコード

javaのGatewayServerを起動した状態で、こう。

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

from py4j.java_gateway import JavaGateway

gateway = JavaGateway()

# java.util.Random
random = gateway.jvm.java.util.Random()
n1 = random.nextInt(10)
n2 = random.nextInt(10)
print "%d + %d = %d" % (n1, n2, n1+n2)

# 自作のjar
kuryu = gateway.jvm.org.kuryu.Sample
print kuryu.bar()
ins = kuryu()
print ins
print ins.foo()

# kuromoji の Tokenizer
KuroTokenizer = gateway.jvm.org.atilika.kuromoji.Tokenizer
tokenizer = KuroTokenizer.builder().build();
a = tokenizer.tokenize(u"寿司が食べたい。")
for token in a:
    print token.getSurfaceForm() + "\t" + token.getAllFeatures()
```

## 参考にしたとこ

主にこのへん。

http://www.atilika.com/ja/products/kuromoji.html
http://py4j.sourceforge.net/py4j_java_gateway.html
http://qiita.com/mojaie/items/f16b97b1388f73e56b86