OmniAICreator/Qiita-1.07M huggingface dataset:
Java（メモリ＆例外）


理解不足だったので調べたことをメモ。

##メモリ管理

[JVMのメモリ管理](http://d.hatena.ne.jp/shuji_w6e/20070211/1171204927, "JVMのメモリ管理")

スタックやヒープ領域の説明がわかりやすくまとめられている。

##検査例外と非検査例外

Effective Javaに記載されている言葉を引用させてもらうと
> 回復可能な状態にはチェックされる例外を、プログラミングエラーには実行時例外を使用する

Javaには以下３種類の例外が存在する。
1. チェックされる例外（検査例外）
2. 実行時例外（非検査例外）
3. エラー（非検査例外）

####検査例外を使用するケース
catch節で処理するかthrows句で外側に伝搬させることで、呼び出し側が適切に回復できるような場合。

例：IOException

####非検査例外を使用するケース
呼び出し側での回復が不可能であり、処理を継続させることが困難な場合。

例：NullPointerException, OutOfMemoryError
実行時例外はRuntime Exceptionを継承しており、エラーはErrorを継承している。
Railsからカラム削除するときにも型を書くと幸せになれるというお話


Railsのマイグレーションファイルでカラム追加ってどう書きましたっけ。

```.rb
class AddHeightToHumans < ActiveRecord::Migration
  def change
    add_column :humans, :height, :integer
  end
end
```

そうそう、こんなんでした。
では時が流れ、諸事情あってこのカラムは用済みですというお話になったとして、カラム削除はどう書きましょう？

```.rb
class RemoveHeightToHumans < ActiveRecord::Migration
  def change
    remove_column :humans, :height
  end
end
```

うろ覚えでWebのサンプル引っ張ってくるとこんな風に書くと思いますがちょっと待った。
カラム削除のマイグレーションをdb:rollbackしようとしてエラーが出たことありませんか？
こんな感じになると思います(実際のログをもとに改変,DBはpostgres)。

```
$ bundle exec rake db:migrate:rollback STEP=1
D, [2015-12-09T15:40:00.307159 #18054] DEBUG -- :   ActiveRecord::SchemaMigration Load (25.9ms)  SELECT "schema_migrations".* FROM "schema_migrations"
D, [2015-12-09T15:40:00.463394 #18054] DEBUG -- :   ActiveRecord::SchemaMigration Load (0.6ms)  SELECT "schema_migrations".* FROM "schema_migrations"
I, [2015-12-09T15:40:00.478230 #18054]  INFO -- : Migrating to RemoveHeightToHumans (201512XXXXXXXX)
D, [2015-12-09T15:40:00.493499 #18054] DEBUG -- :    (0.3ms)  BEGIN
== 20151208031040 RemoveHeightToHumans: reverting ===============================
D, [2015-12-09T15:40:00.512146 #18054] DEBUG -- :    (0.2ms)  ROLLBACK
rake aborted!
StandardError: An error has occurred, this and all later migrations canceled:



remove_column is only reversible if given a type.
```

remove_columnに型がないって怒られてしまいます。
逆に言えば型を書けばロールバックできるんですね。
上はログをまとめやすく、実際のプロジェクトの名称が出てこないように恣意的に取り出していますが、実際にはなんとなくエラーの文面を流していた人もいるのではないでしょうか（私の場合はreversibleのあたりで思考停止して「なんかダメっぽいぞ」と反射で対処してしまってました。脳筋…）
特に開発中にブランチによってカラムが違ったりしてマイグレーションで増減させるときにこの辺りで刺さるとつらいことになります。

きちんと型指定してあげればchangeメソッドをわざわざupとdownに書きなおして記述するパターンやremove_columnをコメントアウトしてロールバックしてから手でカラム追加とかいう邪法ともおさらばです。

メソッド定義も一応チェックしておきます。

http://apidock.com/rails/ActiveRecord/ConnectionAdapters/SchemaStatements/remove_column

>remove_column(table_name, column_name, type = nil, options = {}) public

モロに引数にtypeってありますね。

で、辿り着いたのが型を指定したこちら。
ぶっちゃけ、`rails g migration RemoveHeightToHumans height`ってやれば最初からこの形式で自動生成してくれますが、コマンドでのカラム指定忘れて手で書いちゃうとこれに辿りつけないことがあります。たぶん私だけじゃないはず。

```.rb
class RemoveHeightToHumans < ActiveRecord::Migration
  def change
    remove_column :humans, :height, :integer
  end
end
```

ちなみにremove_columnsは型指定できないのでこのやり方はできません。

コマンド叩いたらこんな感じです（実際の出力をもとに改変）。

```
$ bundle exec rake db:rollback 
== 201512XXXXXXXX RemoveHeightToHumans: reverting ===============================
-- add_column(:humans, :height, :integer, {:default=>false})
   -> 0.0813s
== 201512XXXXXXXX RemoveHeightToHumans: reverted (0.0815s) ======================

```

できた

remove_indexも同じ要領で、nameだけ書いても消せるけどrollbackの時に戻せなくなるので、関係するカラムを書いてあげましょう。
もっと言うならschema.rbのindex定義をコピペしてadd_indexをremove_indexに変えるだけでOK。

「基本すぎない？」と突っ込まれそうで怖いのですが、私の観測範囲での感触では削除時に型指定できてないマイグレーションファイルまだまだあるんじゃないかなあ、という認識です。
普段はあまり触らないために忘れがちになるところでもあり、なまじ型指定しなくても動いてしまうのですが、折を見て思い出してやってください。
オシャレなアラートを使用できる「SweetAlert-iOS」の使い方


オシャレなアラートを簡単に作ることのできる「SweetAlert-iOS」の使い方を紹介します。
元ソースは[Github](https://github.com/codestergit/SweetAlert-iOS)で公開されてます。

![alert5.gif](https://qiita-image-store.s3.amazonaws.com/0/88163/c3390ce7-36b3-08d2-7bfb-955657a1dca1.gif "alert5.gif")



##導入方法
Githubからソースコードをダウンロードしてフォルダの中にある「SweetAlert.swift」を自分のxcodeプロジェクトの中にコピーします。コピーが完了したらすぐに使いはじめることが出来ます。

![スクリーンショット 2015-12-15 22.45.56.png](https://qiita-image-store.s3.amazonaws.com/0/88163/8d7b2599-8622-f832-b71e-7e0e654ce5a4.png "スクリーンショット 2015-12-15 22.45.56.png")

![スクリーンショット 2015-12-15 22.46.17.png](https://qiita-image-store.s3.amazonaws.com/0/88163/c420c00b-8cc5-3c71-b57d-f160e4d60696.png "スクリーンショット 2015-12-15 22.46.17.png")


##使い方

###タイトルとボタンのみ

```swift
SweetAlert().showAlert("メッセージ!")
```

![alert1.gif](https://qiita-image-store.s3.amazonaws.com/0/88163/c9e9c728-f960-1c21-fb6f-bdc711b5b0d5.gif "alert1.gif")


###タイトルとテキストとボタン

```swift
SweetAlert().showAlert("タイトル", subTitle: "メッセージ内容", style: AlertStyle.None)
```

![alert2.gif](https://qiita-image-store.s3.amazonaws.com/0/88163/93981a11-01ba-27da-a1e7-60a06d0b6834.gif "alert2.gif")


###成功アラート

```swift
SweetAlert().showAlert("Good job!", subTitle: "良く出来ました!", style: AlertStyle.Success)
```

![alert3.gif](https://qiita-image-store.s3.amazonaws.com/0/88163/ed99de0c-b6bc-f1d2-8973-25c86333034e.gif "alert3.gif")

###ボタンが2つあるアラート

```swift
SweetAlert().showAlert("Are you sure?", subTitle: "削除してもよろしいですか？", style: AlertStyle.Warning, buttonTitle:"いいえ", buttonColor:UIColor.redColor() , otherButtonTitle:  "はい", otherButtonColor:UIColor.redColor()) { (isOtherButton) -> Void in
            if isOtherButton == true {
                
                //「いいえ」を選択した時の処理
                
            }
            else {
                
                //「はい」を選択した時の処理
                SweetAlert().showAlert("成功!", subTitle: "削除が成功しました!", style: AlertStyle.Success)
            }
        }
```

![alert4.gif](https://qiita-image-store.s3.amazonaws.com/0/88163/c094d273-e70a-5282-28d1-6c00bfb13e5b.gif "alert4.gif")


###ボタンが2つあるアラート（２）

```swift
SweetAlert().showAlert("Are you sure?", subTitle: "削除してもよろしいですか？", style: AlertStyle.Warning, buttonTitle:"いいえ", buttonColor:UIColor.redColor() , otherButtonTitle:  "はい", otherButtonColor: UIColor.redColor()) { (isOtherButton) -> Void in
            if isOtherButton == true {
                
                //「いいえ」を選択した時の処理
                SweetAlert().showAlert("Cancelled!", subTitle: "削除をキャンセルしました", style: AlertStyle.Error)
            }
            else {
                
                //「はい」を選択した時の処理
                SweetAlert().showAlert("Deleted!", subTitle: "削除が完了しました!", style: AlertStyle.Success)
            }
        }
```

![alert5.gif](https://qiita-image-store.s3.amazonaws.com/0/88163/230d0388-2d7b-9959-97c7-851b0173454c.gif "alert5.gif")
Laravel 5.xでDebugbarを使う方法 [2015]

# composer使えば楽ちん

composer.jsonを編集しなくても下記コマンドでよしなにしてくれる

```
$ cd /path/to/work/dir/
$ composer require barryvdh/laravel-debugbar
```

# config/app.phpを編集

2箇所追記すればok

```php:config/app.php 
 'providers' => [
 ~~~~~ 色々初期設定で入ってる ~~~
/*
 * debug用のService Providers
 */
 Barryvdh\Debugbar\ServiceProvider::class,

  ],
```

```php:config/app.php
'aliases' => [
 ~~~~~ 色々初期設定で入ってる ~~~
  'Debugbar'  => Barryvdh\Debugbar\Facade::class,
],
```

# 画面の下部にコレが表示されてればOK
![sample](https://cloud.githubusercontent.com/assets/973269/4270452/740c8c8c-3ccb-11e4-8d9a-5a9e64f19351.png)


# ぶっちゃけ
ここに書いてあるのを日本語にしただけ
https://github.com/barryvdh/laravel-debugbar
kintone思考への道のり

[kintone Advent Calendar 2015](http://qiita.com/advent-calendar/2015/kintone)の16日目です。
kintone初心者を公言しているのですが、勢いで Advent Calendarに参加してしまいました。
高度な事は書けませんが、初心者向けの内容になれば良いなと思っています。

# ねらい
僕自身が、なかなか kintoneに馴染めなかった（kintone思考になれなかった）過程が
誰かの役に立てば嬉しいな　と思って書いてみます。


# kintoneに取り組み始めたキッカケ

kintoneに取り組み始めたキッカケは、こちらのスライドを見ていただけたらと思います。
↓
[kintone Café 福岡 vol.6 / kintone.Promise を使ったREST API更新処理](http://www.slideshare.net/masu77/kintone-caf-vol6-kintonepromise-rest-api)

# kintoneで作りたかったもの

このスライドの中でも書いていますが
僕が作りたかったアプリは、簡単な在庫管理システムでした。

簡単に概要を説明すると
商品マスタに、在庫数の項目を持つ
出庫入力で出庫量が入力されたら、保存時にJavaScriptAPIを使って商品マスタの在庫数から差し引く
入庫も、同様。　という内容です。

各画面の項目は、下のようなイメージになります

| 商品マスタ   |    | 出庫入力    |    | 入庫入力    |
|:-----------|:---|:-----------|:---|:-----------|
| 商品コード   |    | 商品コード  |    | 商品コード   |
| 商品名      |    | 出庫数      |    | 入庫数      |
| 仕様        |    |
| 在庫数      |    |


これで、最新の商品在庫が把握できる！

と、思っていました

# ところが

実際に運用してみると
日々の入力が100件以上あり、当日に入力されないことも度々
時系列通りに、入力してもらわないと、現在在庫が把握できないのですよねぇ

ついでに
最新の在庫だけでなく、ある時点での在庫数も見たいとの要望が。。。

ログを取るように、入出庫の度に在庫データを毎回作っておこうとも思ったのですが
これも、時系列順に入力してもらわないと、破綻してしまうと気付きました。

要は、「在庫数」という項目が、状態依存してたんですね

もう、完全に　設計のミスです
２ヶ月位運用して、ようやく気付きました


# なぜ、そうなったのか？

今までの開発経験で、Railsや CakePHPなどのフレームワークを使って
ORマッピングなどを使っていれば自然な考え方ができたのだろうけれど
普段は、SQL文をガリガリ書いて、「結合だ！ 集計だ！ サブクエリだ！」と
なんでも一発で持ってこようとする考え方でした。
だから、どうしても、商品マスタの画面を開いた時に
現在庫を算出して、その画面に表示しようとする考えから離れられませんでした

でも、そういった集計は、kintoneには向いていないのですよね
だから、「入出庫のたびに 在庫数を算出しなくては」と思って
思いっきり状態依存の「在庫数」という項目に固執してしまっていました


# 失敗を経ての気付き
けど、こういうのって kintone的な考え方じゃないんですよね　きっと

あれこれ悩んだ末に気づいたのが
ステートレスなデータ構造にすることが大事なんだ！　ということです。

とにかく kintoneには、素直なデータをためていく
そして、集計などは、REST APIでExcelに 持ってきて、Excel側で集計する
（お客さんが Excelの方が安心するので）

そういう風に考えることができはじめたら
急に、kintone が使いやすくなりました。

　　※ Excelとの連携は、今回の主題ではないので、下記のページを参照しください。
　　　[第1回 Excelとkintoneを連携させよう](https://cybozudev.zendesk.com/hc/ja/articles/201861390-%E7%AC%AC1%E5%9B%9E-Excel%E3%81%A8kintone%E3%82%92%E9%80%A3%E6%90%BA%E3%81%95%E3%81%9B%E3%82%88%E3%81%86)
　　　[第2回 Excelとkintoneを連携させよう](https://cybozudev.zendesk.com/hc/ja/articles/201932564-%E7%AC%AC2%E5%9B%9E-Excel%E3%81%A8kintone%E3%82%92%E9%80%A3%E6%90%BA%E3%81%95%E3%81%9B%E3%82%88%E3%81%86)


# 辿り着いた結論

そんな過程を経て、今の僕の中では、
「kintone は、多拠点でデータを入力して一元管理するための仕組み。
　データの表示や解析は、Excelでデータを取ってきて加工する」
という、使い分けが良いように感じています。


# 最後に
う〜ん、まだまだ kintone思考になるには経験が必要だな　と思いつつも
この記事が、誰かにとって　何かの気付きになれば良いな と願っています。
Elixir初心者がOTPって結局なんなのか調べてみた

ずっとJava一筋で生きてきた僕が、最近Elixirに興味を持って色々触っています。
そんな中、色々なところで「OTPが強力」「OTPイケてる」みたいに言われていて、OTPってなんなんだろうとちょっと調べてみたんですが、結局わかったようなわからないような気持ちにしかなれませんでした。
ので、僕自身の理解向上と、そして僕みたいな迷える初心者さんたちのために一度ちゃんと調べたうえでまとめてみようと思いました。
まだまだ浅い理解で書いているので誤った記述もあるかもしれませんが、その際はご指摘いただければ幸いです。
また、具体的な活用方法など詳細については詳しい方々に譲るとして、今回はあくまで概略をざっくり書いていきます。

記事執筆にあたり、下記記事とすごいE本、『Programming Elixir』、あと公式サイトなどを参考にさせていただきました。
[[翻訳] ElixirにおけるOTPの紹介](http://qiita.com/HirofumiTamori/items/b72ad232dc3b26e87a03)
[Elixir の OTP (GenServer 編)](http://qiita.com/naoya@github/items/ae17a8166e52fc463012)

# OTPとは
OTPとは「Erlangのライブラリ集」、さらに言えば「それらを用いた並行プログラミングをしていくためのフレームワーク/デザインパターン」のようです。
正確な表現ではないかもしれませんが、そのように理解するのが個人的に一番しっくりきました。
厳密にはErlangコンパイラやErlangで書かれたリアルタイムデータベースであるMnesiaなどなども含んでいる（このへんが理解を難しくしているような気がする）のですが、通常OTPという時は前者の意味で言うのが一般的なようなので、ここではもうその前提で進めます。

ちなみにOTPはOpen Telecom Platformの略で、もともとは電話交換機のシステム構築のために作られたためこのような名前になったものの、現在では名称そのまま、より広い用途で使われるようになったという経緯があるらしい。
・・・ので、名称から意味を類推しようとするとドツボにはまる（経験者談）。

# Behavior（ビヘイビア）
OTPではOTP内のモジュールを使った便利な定番パターンのことを「ビヘイビア」という名前で定義していて、これらを使うことでElixir（本来はその派生元であるErlang）の並行処理や堅牢なプロセス監視を簡単に実現することができます。

# OTPの代表的なBehavior
これらについては参照元にも詳しく書いてあるのでサクッと流します。

- GenServer
Elixirの軽量プロセス内で状態(state)を扱うためのBehavior。
メッセージパッシングで軽量プロセスに保持しておきたい状態を送って、必要な時に（同じくメッセージパッシングで）取り出すことができる。
状態が不要になったらGenServerのプロセスごと破棄すればGCの対象になって勝手にお掃除してくれる。

- Supervisor
（例えば上記のGenServerのような）プロセスを監視するBehavior。
Elixirではプロセス上でエラーが発生したら、プロセス内でエラーハンドリングをするのではなく、もうプロセスごとクラッシュさせてしまって、それを監視するSupervisorでプロセスを再起動するなり、なにかしらエラーメッセージを吐くなりさせることが推奨されています。
つまり、実処理とエラー時の対応を完全に分離させることができるわけですね。
ちなみにSupervisorというのはシステム上にただ一つだけ存在する、というものではなく、Supervisorを監視するSupervisorを作成するなど、Tree上に監視体制を構築することが可能です。


以上、本当に簡単になってしまいましたが今回はこの辺りで。
[Linux][Vim] vimでヤンクした結果をC-vで貼り付けたい(クリップボードの共有)

表題の件になります。おそらくLinux向け。`+clipboard` であることが前提です。

# クリップボードが共有されない問題

今まで他の人の設定を参考にして以下の設定を行っていたけれども、なんでか共有されなくて困っていた。

```vim
set clipboard=unnamed,autoselect
```

# 調べた結果

調べた結果、Linuxでは `unnamed` だと中クリックでペーストされるものになるとのこと。
C-vで貼り付けたい場合は `unamedplus` を指定する。

```vim
set clipboard=unnamedplus
```

# 結論

Linuxでは `unnamedplus` を使おう。

# 参考
[vimでクリップボード連携を有効にした話 - pockestrap](http://pocke.hatenablog.com/entry/2014/10/26/145646)
[UbuntuのVimでクリップボードを使う | komagawa292's blog](http://komagawa292.net/20140907/ubuntu-vim-clipboard/)
jQueryで3桁カンマ区切り

覚書。

# やりたいこと
- テキストボックスからフォーカスが外れたタイミングでカンマ区切り。
- テキストボックスにフォーカスをあてたタイミングでカンマを除去。

## やり方

カンマ区切りさせたいテキストボックス。

```html:HTML
<input type="text" id="textBox" value="123456789" />
```

フォーカスが外れたときは、正規表現を使ってカンマ区切り。
フォーカス時はカンマを除去。

```js:jQuery
$(function() {
  
  // フォーカスアウト
  $('#textBox').on('blur', function(){
    var num = $(this).val();
    num = num.replace(/(\d)(?=(\d\d\d)+$)/g, '$1,');
    $(this).val(num);
  });
  
  // フォーカス
  $('#textBox').on('focus', function(){
    var num = $(this).val();
    num = num.replace(/,/g, '');
    $(this).val(num);
  });
  
});
```

**(2015/12/21追記)**
上記のソースだと整数しか対応できていないので、
少数入力したときに小数点以下しかカンマ区切りされない・・・

正規表現のところを書き換えます。

```js

num = num.replace(/(\d)(?=(\d{3})+(?!\d))/g, '$1,');

```

## デモ
http://codepen.io/sdym/pen/YwwpRm


## 参考
http://qiita.com/ariyo13/items/ab410a84c74b23099648
http://qiita.com/think49/items/b1bf02e5f4cfbb200b84
gulpでbrowserifyを使用したスクリプトをビルドする

gulpでbrowserifyを使用したスクリプトをビルドするための備忘録。

# gulpfile.js
```gulpfile.js
'use strict';

var gulp = require('gulp');
var uglify = require('gulp-uglify');
var glob = require ('glob');
var browserify = require('browserify');
var source = require('vinyl-source-stream');
var buffer = require('vinyl-buffer');

gulp.task('build', function() {
  // 対象のファイルをglobでまとめる
  var srcFiles = ['./js/**/*.coffee'].map(function(f){return glob.sync(f);});
  browserify({
    entries: srcFiles,
    extensions: ['.coffee', '.js'] // require時に拡張子を省略できるように
  })
  .transform('coffeeify')     // coffeeをビルド
  .bundle()
  .pipe(source('main.js'))    // browserifyで作成されたstreamをvinylに変換
  .pipe(buffer())             // browserifyをuglify()するためには必要
  .pipe(uglify())
  .pipe(gulp.dest('./assets/js'))
});
```
Ext JSのテーマ遍歴その3

前回に引き続きテーマ遍歴を見ていきましょう。
今回は、フォームパネルの部品です。

## textfield

Classic

![スクリーンショット 2015-12-15 18.32.49.png](https://qiita-image-store.s3.amazonaws.com/0/20136/7ac92966-4100-debf-4b18-7754c5c34036.png)

Neptune

![スクリーンショット 2015-12-15 18.33.06.png](https://qiita-image-store.s3.amazonaws.com/0/20136/29ab2d77-6bd3-8971-37b3-508ed762ec99.png)

Crisp

![スクリーンショット 2015-12-15 18.33.12.png](https://qiita-image-store.s3.amazonaws.com/0/20136/9062d10b-ba74-b228-7d23-536dac653495.png)

Triton

![スクリーンショット 2015-12-15 18.33.19.png](https://qiita-image-store.s3.amazonaws.com/0/20136/30afe15a-d628-8178-b838-8aa4dc5379ca.png)

Neptuneからはバリデーションエラー時の波線がなくなり、枠が赤くなるのみになりました。
ラベルが徐々に薄くなりボックスのパディングも大きくなっている印象。

## checkbox

Classic

![スクリーンショット 2015-12-15 18.28.28.png](https://qiita-image-store.s3.amazonaws.com/0/20136/87aecb3d-5c47-9650-ecfe-01b6ff24ff38.png)

Neptune

![スクリーンショット 2015-12-15 18.29.01.png](https://qiita-image-store.s3.amazonaws.com/0/20136/be2f0647-bfdd-6b28-c8bb-ab4b7b521f6a.png)


Crisp

![スクリーンショット 2015-12-15 18.29.22.png](https://qiita-image-store.s3.amazonaws.com/0/20136/6aecaa82-1e2f-ed68-be4e-a5d100a34595.png)

Triton

![スクリーンショット 2015-12-15 18.29.42.png](https://qiita-image-store.s3.amazonaws.com/0/20136/93ad27a0-1dcc-20c2-c8bc-7cc42c06c63a.png)

バージョンを重ねるごとによりフラットな感じに。
Tritonではボックスが丸みを帯びてやわらかな印象を受けます。

## combobox

Classic

![スクリーンショット 2015-12-15 18.39.25.png](https://qiita-image-store.s3.amazonaws.com/0/20136/71dfe748-e051-f814-d8a7-b47886984b7d.png)

Neptune
![スクリーンショット 2015-12-15 18.38.56.png](https://qiita-image-store.s3.amazonaws.com/0/20136/52cea057-5bef-cda6-c45b-a8a1df4579ae.png)

Crisp

![スクリーンショット 2015-12-15 18.36.44.png](https://qiita-image-store.s3.amazonaws.com/0/20136/cab1057e-7ff8-c842-4ebd-4782d93539cb.png)

Triton

![スクリーンショット 2015-12-15 18.38.26.png](https://qiita-image-store.s3.amazonaws.com/0/20136/7ecdeb8a-b54a-ed6a-0df2-974a268a42de.png)


## datefield

Classic

![スクリーンショット 2015-12-15 18.46.43.png](https://qiita-image-store.s3.amazonaws.com/0/20136/e47ff3ea-ecb8-0364-c860-e96b30601994.png)

Neptune

![スクリーンショット 2015-12-15 18.46.05.png](https://qiita-image-store.s3.amazonaws.com/0/20136/d3ba1da0-ace2-c449-ad4b-2c6a331ed051.png)

Crisp

![スクリーンショット 2015-12-15 18.45.30.png](https://qiita-image-store.s3.amazonaws.com/0/20136/2ad9130a-b458-8279-a484-9b9fc607622f.png)

Triton

![スクリーンショット 2015-12-15 18.50.19.png](https://qiita-image-store.s3.amazonaws.com/0/20136/fcd280c0-81a2-ed60-c0f4-ea01ff333ff4.png)


TritonではDatePickerが巨大化。
テーマを重ねるごとに配色が抑えられ、段々と落ち着いた雰囲気になってきている気がします。


以上、3回に渡ってExtJSのテーマの移り変わりを見てきました。
その時のトレンドを取り入れたリッチなUIが標準で備わっているのがExtJSの魅力の一つではないかと改めて感じました。
[Signagify 2] Chromecast の独自アプリ開発

この記事はファーストサーバのAdvent Calendar 2015の１６日目として書きました。
http://qiita.com/advent-calendar/2015/firstserver

内容は３日目の続きです。
http://qiita.com/vanx2/items/c2d085da324f81d41f63

独自Chromecastアプリの開発を通してmDNSやCastV2ってなんぞって話をしていきたいのですが、まずはChromecastの仕組みから説明したいと思います。前回の投稿でわかりづらいと大変好評だったので図を増やしました。

#Chromecast
前回サラッと触れましたが、ChromecastはスマホやPCで選んだ画像や動画などのコンテンツをTVに表示することができます。GoogleフォトやYouTubeなどのGoogle製だけでなくNetflixやhuluなどのアプリからTVにキャストすることができ、SDKが提供されているので独自のアプリを作ることも可能です。この独自アプリについて掘り下げていきたいと思います。

Chromecastは大きく、SenderアプリとReceiverアプリで構成されています。

![s-r-1.png](https://qiita-image-store.s3.amazonaws.com/0/12406/77a757fe-b1ac-135b-ebb9-4b30fad066d9.png)

SenderアプリはスマホやPC上で動作し、Chromecastに対してリクエストを投げるクライアント側のアプリです。ReceiverアプリはChromecast上で動作し、TVに出力する映像や音声を制御します。

###■Senderアプリ
Senderアプリの役割はアプリとしてユーザーにインターフェースを提供し、TV上にキャストしたい情報を選択されたChromecastに投げることです。

![sr2-2.png](https://qiita-image-store.s3.amazonaws.com/0/12406/945e14a6-c1c7-eb94-ac08-9bd8e9a52515.png)

提供されているSDKは、Androidアプリ用、iOSアプリ用、Chromeアプリ用の３つです。

ネットワーク内からキャストできるChromecastを見つけ出したり、ChromecastやChromecast上で動くReceiverアプリと通信を行う際にSDK使います。
※ゲストモードをオンにしてAndroidからであれば同じネットワークにいなくてもWiFi位置情報と可聴域外の高周波音を使って接続できるようです。

###■Receiverアプリ
ReceiverアプリはHTML5でTVに出力する内容を表現します。つまり、Chromecastの中身はブラウザ（Chrome）が動いていて、WEBページがTVに表示されていると捉えることができます。

![tb-2.png](https://qiita-image-store.s3.amazonaws.com/0/12406/beba2842-874b-cc15-44f2-f5c4b54b01e3.png)


Receiverアプリは用途によって３種類の中から選んで利用します。

- Default Media Receiver
- Custom Receiver
- Styled Media Receiver

#### ・Default Media Receiver
メディアの基本的な操作（再生、スキップ、一時停止など）だけで事足りる場合はこのアプリを使います。

#### ・Styled Media Receiver
メディアの基本的な操作に加えて、タイトルのフォントやプログレスバーなどの装飾をカスタマイズしたい場合はこのアプリを使います。装飾するためのCSSや画像ファイルを制作する必要があります。

#### ・Custom Receiver
独自の処理や独自の装飾を行ってReceiverアプリを自分で実装する場合はこのアプリを使います。Senderアプリとの通信やサポートされていないメディアの再生でSDKを利用します。

もちろんJSでアニメーションさせたり外部サーバと通信したりできますが、WebGLやChrome Extensionsなどは動かず、同時に再生できるvideoタグは１つまでなどの制限があります。

また、Chromecastは選択やスクロールをさせるための入力インターフェースを持たないので表示領域がTVの１画面に収まるようデザインする必要があります。メモリも小さくコンテンツのキャッシュはほぼ利いていないように思えました。

----

Styled Media ReceiverとCustom Receiverは利用するファイルをhttpsでアクセスできる場所でホスティングし、そのURLを「Google Cast SDK Developer Console」で登録する必要があります（有料：$5）。オレオレやクロスドメインはアホかって怒られます（実行しても何も表示されない）。

限られた端末でしか利用せずReceiverアプリを公に公開する必要がない場合は、「Google Cast SDK Developer Console」にChromecastのMacアドレスを登録すればhttpでホスティングすることもできます。

# というわけで
SDKを利用して実装するならこれぐらいの情報で作れるような気がします。この基礎知識を踏まえてSenderアプリを独自で実装していきたいと思います。

今回こそmDNSとCastV2の内容について触れてみようと思ったけどAdvent calenderの公開時間過ぎちゃったので次回書いてみようと思います。
インストール済みAtomパッケージとapmのスターをdiffして同期するツール「Atom Package Diff」

Atomにインストールしているパッケージと[Atom.io](https://atom.io/packages)上のスターを同期するCLIツール [Atom Package Diff](https://www.npmjs.com/package/atom-package-diff) を公開しました。

# 導入

npm経由でインストールします。

```console
$ npm install -g atom-package-diff
```

# インストール済みパッケージとスターのdiff

`apd status`コマンドでインストール済みパッケージとスターしているパッケージのdiffが見れます。

```console
$ apd status
36 packages installed
30 packages starred

# Packages only in apm
project-manager react

# Packages only in local machine
Sublime-Style-Column-Selection atom-fuzzy-grep douglas language-babel language-ini language-swift term3 travis-ci-status
```

# 同期

`apd sync --local`を実行すると、インストール済みパッケージを全部`apm star`し、それ以外を`apm unstar`します。

`apd sync --remote`でその逆の処理を行います。つまり、スターされているパッケージを全部インストールし、それ以外をアンインストールします。

```console
$ apd sync --local
Unstaring ... project-manager
Unstaring ... react
Staring ... Sublime-Style-Column-Selection
Staring ... atom-fuzzy-grep
Staring ... douglas
Staring ... language-babel
Staring ... language-ini
Staring ... language-swift
Staring ... term3
Staring ... travis-ci-status
```

ソースコードは [Github](https://github.com/uetchy/atom-package-diff) で公開しています。
i=++i+1;を読み解く

`i=++i+1;`を読み解く
====================
はじめに
--------
この記事はC11に則っています．
また，この記事の正当性を保証するものは何もありませんし，正しく読み解けているかはわかりません．むしろどこか間違っています．間違いがあったらコメントで教えてください．
[注釈84](http://port70.net/~nsz/c/c11/n1570.html#note84)が理解できない人向け．

読解
----
### 副作用完了点について．
この文の副作用完了点は文末の`;`なので，ここまでに副作用が完了していれば良い．

### `i=++i+1`
この式は，まず`i`,`=`,`++i+1`の部分式に分解され，右辺は`++i`,`+`,`1`に分解される．
部分式の評価順序は不定であることから，`i`と`++i+1`，また`++i`と`1`の評価順序は不定である．
また，オペランドの値の計算は，オペレータの結果による値の計算より前に順序付けられる．

### [単純代入](http://port70.net/~nsz/c/c11/n1570.html#6.5.16.1)
`i`は算術型(と仮定します．多分intでしょう)であり，`++i+1`も同様なので，単純代入の制約を満たす．
`i`の値を`++i+1`にする，という副作用を持ち，この副作用は[6.5.16](http://port70.net/~nsz/c/c11/n1570.html#6.5.16)より，左右のオペランドの値の計算後に順序づけられる．
しかし，単純代入の式を評価した値とこの副作用の間には，評価順序は存在しない．
すなわち，`i=4+2`という式を評価した値は6だが，実際に`i`が6になるのは`i`と`4+2`を評価した後ならいつでも良い．

### `i`と`++i+1`
`i`と`++i+1`に分解され，これらの値の計算は不定である．しかし，左辺の`i`が指し示すオブジェクトは右辺の評価によって変わらない(はず．++iしても&iには関係ないと思う)．よって，`++i+1`に注目する．

**ここまでで確定している順序**
()の中の評価順序は不定．
((`i`の値の計算，`++i+1`の値の計算)→`i=++i+1`の値の計算，`i`の値を`++i+1`にするという副作用)

### `++i`と`1`
`++i`の型は`i`と同じであり，`i`は算術型であり，`1`はint型なので[6.5.6](http://port70.net/~nsz/c/c11/n1570.html#6.5.6)の制約を満たす．
二項`+`演算子の結果は左右のオペランドの和である．
`++i`の値の計算と`1`の値の計算は`++i+1`の値の計算より前に行われる．

**ここまでで確定している順序**
((`i`の値の計算，{`++i`の値の計算，`1`の値の計算→`++i+1`の値の計算})→`i=++i+1`の値の計算，`i`の値を`++i+1`にするという副作用)

### `++i`
[6.5.3](http://port70.net/~nsz/c/c11/n1570.html#6.5.3)より，++iはi+=1と等価である．
よって最初の式は`i=(i+=1)+1`のように変形できる．
`i`は算術型なので`+=`の制約を満たし，`i+=1`は`i`が1回しか評価されないことを除き`i=i+1`と等価なので，単純代入の式に帰着し，最初の式は，`i=(i=i+1)+1`となる．

これは，`i`の値を`i+1`にする，という副作用を持ち，この副作用は左右のオペランドの値の計算後に順序付けられる．

**ここまでで確定している順序**
((`i`の値の計算，{[<`i`の値の計算，`1`の値の計算>→`i=i+1`の値の計算]，`1`の値の計算→`++i+1`の値の計算})→`i=++i+1`の値の計算，`i`の値を`++i+1`にするという副作用，<…>→`i`の値を`i+1`にするという副作用)
これが`i=++i+1`を実行した時に起こることで，すべての副作用は，副作用完了点までに実行される．

結論
----
((…，{[<…>→…]，…→…})→…，`i`の値を`++i+1`にするという副作用，<…>→`i`の値を`i+1`にするという副作用)
となり，`i`の値を`++i+1`にするという副作用と`i`の値を`i+1`にするという副作用がどのような順序で実行されるかわからないため，[6.5](http://port70.net/~nsz/c/c11/n1570.html#6.5)より未定義となる．

参考
----
[http://port70.net/~nsz/c/c11/n1570.html](http://port70.net/~nsz/c/c11/n1570.html)
[反映済み](https://twitter.com/amedama41/status/676899393908449281)
【FileMaker】ユーザレベルを脱するにはこれを観ろ！

FileMaker Advent Calendar 16日目ですね。

11月下旬に行われたFileMaker Conference Tokyoでは、FileMaker社からカンファレンスの動画が[youtubeのFileMakerチャンネル](https://www.youtube.com/playlist?list=PLTTmwgF5akKKq-RyLvYWYrzBdAXlnUdDJ)に多数アップされました。
ありがたいです。

全部今後の開発の勉強になるセッションばかりでしたが、まずは会社で「FileMakerでちょっと作ってよ」と言われたフツーの人が見よう見まねで作っていい感じになってきて、システム開発に目覚めちゃった人は、まずこれを観ましょう。

# 2015年度版は、これを観よう

## [スクリプト作成に本格的に取り組む前に、必須の知識を習得！落とし穴に落ちないツボとコツ](https://www.youtube.com/watch?v=_XVGs9vPnNY&index=10&list=PLTTmwgF5akKKq-RyLvYWYrzBdAXlnUdDJ)
スクリプトを作成するのは、ユーザにはどうやら敷居が高いらしい、というのは元々開発者の道をずーっと辿ってきたので「は！？なんで！？」という思いだったのですが、FileMakerがユーザでも扱えるということが敷居を作っているのかもしれないですね。

自分の解釈でスクリプトを作成するよりも、このような必須の知識を頭に入れておいてからでも遅くはありません。

## [目指せ！初心者からの脱却　「変数」を使いこなすとその先はパラダイス！](https://www.youtube.com/watch?v=mh5U-tCxbtk&list=PLTTmwgF5akKKq-RyLvYWYrzBdAXlnUdDJ&index=12)
こちらもスクリプトを書くには必須の知識ですよね。
変数というとちょっと数学チックで倦厭しがちですが、避けて通れませんのでぜひとも習得して楽をしてください。

## [データベースデザインレポート機能を活用して、ソリューションの品質を向上しましょう](https://www.youtube.com/watch?v=k2wUQxgRUSw&index=13&list=PLTTmwgF5akKKq-RyLvYWYrzBdAXlnUdDJ)
本格的に開発をしていこうと思ったら、FileMaker Pro Advanced Editionは必須になりますので、自分が開発しているシステムにどういうレイアウトがあってどのテーブルやオカレンスが使われているのか、あるいは使われていないかを精査するのにデザインレポートは必須のツールです。
デザインレポートで何ができて何ができないのか、どこまでシステム概略を書かなくて済むのか（これ、重要！）を判断するためにも、ぜひデザインレポートの見方と活用の仕方を習得しましょう。


# これも観ておこう

また、今年ではありませんが、2013年に開催されたFileMaker Conferenceのセッションで、今でも「これを観ておけ！」というのが、以下です。

## [中級・上級の登竜門データモデリングの理解を深めて、リレーショナルデータベース作成のスキルアップ](https://www.youtube.com/watch?v=CPfV89wWT04)
FileMaker開発の基礎知識は元より、データベースの重要なポイントを易しく解説しています。
バージョンが違ってもこの知識は必須だと思っています。
そこの人、FileMakerのテーブルとテーブルオカレンス、グローバル変数はどこまで有効か、理解していますか？
関連レコードを使いこなしていますか？
無駄なコード書いてませんか？

知識の整理のためにも、この年末年始のお休みでチェックしてじっくり観て、そして手を動かしてみてくださいね。
面倒な処理はPythonにおまかせ

# はじめに
私の前後が、PythonからHDLを生成したり、Pythonから直接ゲートを合成したり、と((((；ﾟДﾟ))))ｶﾞｸｶﾞｸﾌﾞﾙﾌﾞﾙですが、これは、至って気楽な記事です。

SystemVerilogって、ハードウェアを記述するためだけのものではないですよね? というか、社会人になって以来、HDLは使えど、ハードウェアを合成したことないです。もっぱらSystemVerilogでプログラムしたりするだけなのですが、ライブラリが少ないので(検証用のライブラリはとっても豊富ですけどね)、効率が悪いのが難点です。それ、普通の言語だったら、ライブラリで一発なのに。。。と言ったものでも、自分で書かないといけないのは結構ストレスですよね。

そういう時は、みんな大好きPythonに接続して、なるべく少ない記述で済ましてまいましょう、というものです。

# 流れ
SystemVerilogのDPIを使います。何かの本(SystemVerilog設計スタートアップ?)でDPIは、Cだけではなく、色んな言語に繋がる予定、とのことですが、現時点では、DPI-Cだけしかないので、DPI-C経由で、SystemVerilogとPythonを接続することになります。

    SystemVerilog - (DPI) - C - Python

という流れです。

今回、2次方程式の係数をSystemVerilogから、Pythonに渡して、解をSystemVerilogに返す、という流れにしたいと思います。

# Python
2次方程式は、SymPyに解いてもらいます。

```py:two_order_eq_py.py
import sympy

def calc_two_order_eq(a, b, c):
  x = sympy.symbols('x')
  f = a*x**2 + b*x + c
  solve = sympy.solve(f, x)
  return solve
```

# C
数年ぶりのCなので、あまりいい感じじゃない気がします。もっと、汎用的に作れると思うのですが。。。

```c:two_order_eq.c
#include <stdio.h>
#include <stdlib.h>
#include <Python.h>
#include <svdpi.h>

void two_order_eq(double* ary, double* answer) {
  PyObject *pName, *pModule, *pFunc;
  PyObject *pArgs, *pValue;
  int i, order=2;

  Py_Initialize();
  pName = PyString_FromString("two_order_eq_py");       
  pModule = PyImport_Import(pName);                                   
  pFunc = PyObject_GetAttrString(pModule, "calc_two_order_eq");

  pArgs = PyTuple_New(order+1);             // Pythonに渡す引数toupleを生成
  for (i=0; i<order+1; i++) {
    pValue = PyFloat_FromDouble(ary[i]);
    PyTuple_SetItem(pArgs, i, pValue);
  }

  pValue = PyObject_CallObject(pFunc, pArgs);    // Pythonの関数を実行

  for (i=0; i<order; i++) {          // Pythonの結果を回収。
    answer[i] = PyFloat_AsDouble(PyList_GetItem(pValue, i));
  }

  Py_Finalize();
}
```

# SVのコード
```systemverilog:two_order_eq.sv
module top();
real ary[3];
real answer[2];

import "DPI-C" function void two_order_eq(input real ary[3], output real answer[2]);

initial begin
  ary = {1, -1, -6};
  two_order_eq(ary, answer);
  $display("Answer is %f, %f", answer[0], answer[1]);
  $finish;
end
endmodule
```

# Make
お高いシミュレータであれば、SVのコードとCのコードをシミュレータに渡してやれば、一気にコンパイルして実行してくれます。
お高いやつじゃない場合は、*.oを作って、-sv_libで渡してやればいいんですかね?

# 実は。。。
もっと、いいサンプルが、https://github.com/rfukatani/pylink にあります。ΔΣ変調をPythonの部分で書いているようです。これを見ると、Matlabなくてもあるところまでいけるね、って感じがします。

ともあれ、これで、面倒な処理をPythonに投げることができるので、生産性が大きく向上します。SVのコードをどれだけ削減できるか、というのが、僕にとっては幸せへの第一歩です。
「防人の詩」を twitter の力を借りて拡張してみる

「防人の詩」、いい歌ですよね。

**「海は死にますか 山は死にますか」**
この世のありとあらゆる具象に対して、あまりに愚直に直球に問いかけるこの歌に、私含め衝撃を受けた人も多いのではないでしょうか。

この歌は、万葉集に蒐集されている詠み人知らずの歌がモチーフとされています。

```
鯨魚(いさな)取り　海や死にする　山や死にする
　　　死ぬれこそ　海は潮干(しほひ)て　山は枯れすれ
```

現代流行曲の世界に、万葉集の時代に歌われた詩から着想を得て曲を書く、そんなさだまさし氏は知的ですし、とてもロックな感じがします。
しかし、この曲は当時 (1980年) の軽薄短小がもてはやされた時代にはあまりに重すぎ、あまりに真摯過ぎ、「さだまさし＝暗い」という世間的なイメージを決定づけてしまった歌でもあるようです。

時代は変わり、主に NHK での某生放送番組の影響でさだまさしを暗いという人は皆無になりました。歌手というより、話の上手い芸人（たまに歌をうたう）と思われている...?
そして今の時代、twitter などでも**「〜は死にますか」**というフレーズをつぶやくときのある種テンプレートとして、「防人の詩」のフレーズは用いられることを良く見かけます。その程度には、さだまさしの価値観が世の中に普及しているともいえます。

ということで、短い詩の世界では表現できなかったであろうあらゆる具象に対する問いかけを、twitter の力を用いて収集し、「防人の詩」を拡張してみたいと思います。


# デモサイト
<https://sadatech.herokuapp.com/sakimori>

![image](https://qiita-image-store.s3.amazonaws.com/0/44364/7ddcf2b6-9130-1c69-f5d8-1921227bbd6e.png)

twitter の API を用いて、「防人の詩」っぽいフレーズが含まれているつぶやきを抽出し、それを表示しているデモです。

アイコンをクリックすると、元のつぶやきのページに飛びます。
また、皆が抱える問いは恐れ多くも人類には知り得ない壮大なものも多いのでしょうが、現在は**集合知の力**を用いることでもしかしたら答えにたどり着けるものもあるかもしれません。ということでフレーズをクリックすると**「Yahoo! 知恵袋」**へリンクするという親切設計になってます。

[一例: 「海は死にますか」という問に対する知恵袋](http://chiebukuro.search.yahoo.co.jp/search?p=%E6%B5%B7%E3%81%AF%E6%AD%BB%E3%81%AB%E3%81%BE%E3%81%99%E3%81%8B&ei=UTF-8)


# 実装
正直今回は大したことをやっていません。

## twitter search API 
情報ソースとして、twitter search API を使用して情報を取得します。
クエリーは `"は死にますか"`

## 防人の詩っぽいフレーズの解析
取得した文字列を `kuromoji` を用いて形態素解析をし、その結果を元に判定します。

* 文字列を文節単位に分解
  * 「海は死にますか 山は死にますか」⇒「海は死にますか」「山は死にますか」のような感じで 
* 「~ますか」「~ですか」で終わるセンテンスを抽出
* 余計な記号等の文字は取り除く
* 「防人の詩」の歌詞とまったく同じ内容しかつぶやいてないつぶやきは除外

## HTML, CSS
以下のサイトを参考にして若干手を加えました。
<http://vdeep.net/css-chat-design>

本当は、最新のつぶやきがあったら JS から自動的に取得して表示する、といったところまでやろうかと思ったのですが、正直そこまで更新頻度が無いのでページロードのタイミングで読み込むのみにしています。

# まとめに変えて
以上、ネタでした。
fish shell で補完の実装 - complete

## 概要

以前にコマンドラインツールを作った際、補完を`fish`にも対応したかった時にちょっと調べたので共有します。

`complete` 関数の使い方になります。

結論から言うとサブコマンドの補完の実装はめんどくさいです。


### まず [fish shell](http://fishshell.com/) ってどんな感じという方はこちら :fish_cake: 

`fish` の構文など

* [fishの使い方](https://www.gfd-dennou.org/member/hiroki/homepage/main008.html)
* [fish-shellを使ってみませんか - Qiita](http://qiita.com/mtwtk_man/items/dde92d0a6024bc61fa58)

　

環境構築や実際入れてみているスクショなど（`fish`をとりあえず入れて使ってみるというだけであれば。）

* [詳解 fishでモダンなシェル環境の構築(fish,tmux,powerline,peco,z,ghq,dracula) - Qiita](http://qiita.com/susieyy/items/ac2133e249f252dc9a34)


## 補完

### 公式ドキュメント

[Writing your own completions](http://fishshell.com/docs/current/index.html#completion-own)

```fish
complete -c myprog -s o -l output -a "yes no"
```

上記のような例が挙げられています。
上の例は `myprog` コマンドにショートオプション `o` とロングオプション `output` と引数 `yes` と `no` を補完してくれるようになります。

### 公式レファレンス

[complete - edit command specific tab-completions](http://fishshell.com/docs/current/commands.html#complete)

他にもありますが、`complete` 関数には主に以下のオプションがあります。

|オプション|意味|
|:-:|:-:|
|c|コマンド|
|s|ショートオプション|
|l|ロングオプション|
|a|引数|
|w|継承する場合|
|d|説明|

`w` に関しては以下の例がわかりやすかったです。

```
complete -c hub -w git
```

`hub`コマンドの補完に `git`コマンドの補完をそのまま実装するみたいです。

### デモ

まず `demo` という関数を作っておきます。

<img height="176px" src="https://qiita-image-store.s3.amazonaws.com/0/32636/8264cf19-c875-4432-219b-6f8cf2e4e4d0.png">

現在はカレントフォルダにあるものしか候補に上がっていません。
（`fish` のデフォルトです。）

<img height="96px" src="https://qiita-image-store.s3.amazonaws.com/0/32636/aeeb840d-9a10-f9cd-2fd8-65e91a41a581.png">

`complete`関数を実行すると `yes` と `no` も候補に入ります。

<img height="80px" src="https://qiita-image-store.s3.amazonaws.com/0/32636/7a24bfe6-8660-85ea-8be8-15a337f5b5b7.png">

しかし、カレントフォルダのファイルの候補は邪魔です。
`-f` オプションを使います。

<img height="80px" src="https://qiita-image-store.s3.amazonaws.com/0/32636/89c8f82b-5154-38e2-d9cc-81f907e9a442.png">

しかし、これでは

```
demo yes <file_path>
```

のような時に不便です。

## サブコマンドの場合分け

場合分けには `-n` オプションを使います。

`-n` オプションでは、指定した命令を実行した時に返ってくる値（ `0` か `1` ）によって、この補完をするかしないかを決めます。

```fish
function __demo_using_subcommand
  set cmd (commandline -opc)
  if [ (count $cmd) -eq 2 ]
    return 0
  else
    return 1
  end
end
```

例えば、上記のような関数を定義して `-n` オプションで使うと

![https://gyazo.com/d5e8547349d28a359a3c08784559ffb5](https://i.gyazo.com/d5e8547349d28a359a3c08784559ffb5.gif)

このように、現在のコマンドライン上の単語が２つの時のみ、補完するようなものを定義することができます。

`yes`と`no`の補完を実装する際に`-n`オプションに現在のコマンドラインの単語の数が１つの時のみ `0` を返すような関数を与えてやれば、３つ目の補完には出てきません。

という風にちょっとめんどくさいです。

###### ※ [`commandline`](http://fishshell.com/docs/current/commands.html#commandline)コマンドはもっと奥が深いと思いますので、もっとしっかり勉強します。


## 参考サイト

`fish` にデフォルトで入っている関数たちのソースです。

* [fish-shell/share/functions at master · fish-shell/fish-shell](https://github.com/fish-shell/fish-shell/tree/master/share/functions)
Karabiner(旧KeyRemap4Macbook)(Mac OS X)

Dvorak Advent Calendar 16日目．

-----

## Karabiner

https://pqrs.org/osx/karabiner/index.html.ja

キーリマップや押下時間などの調整ができるMac OS Xのソフト．
OS標準の機能で変更できないキーをこれでリマップできます．


### SandSも設定可能

[Dvorak - SandS - Qiita](http://qiita.com/dvorak__/items/506a3eb7423419e7df24)

![](https://lh3.googleusercontent.com/BFJS-WaNRuKScF5GqcvuUnj_HT7VNkXIifop7oon4NXzKQeHpwZ9iFI3mhhbCZ2_KLYpuAoOPZiUfAmcoG5PFrica_vDb5_Pa1gazVZgTEqyYS1DVA1L53y2D-SHV0uL9rydxMv0ri5XZAerdzXXlrnr7QterC2yUeAs9IS9UhHX4EziSevoBgQADQnqe31orc5-62wQpxYTJEgg6VwmsqXroUcegMVzzCu9p7rNKI5ESkndtKLrDyhPow_JzIPIjBUUOHGh7UA5vEEqS2Ie7ZJZqcLdHD_h9ZBHA06dfBLK-EIlcYOkvpI-cUqd58IRVuO8WFPsFgEJC6nJogsbWG-rGI-EKFqOczV-8djvFxomLES-9dCe_yX2sCxUB5ZqYzJY8zPKr1qmH9g2HEhqo1P8FkNNBJa9fn_TJ2ZWuw5KP9ApOhwPFPwiRFVxX9auyUZmvxHXBsC3s4dFrfQieRFIEA2M5QPV3qJ8iy5bYiyu2UakdQKZE7_xStOKoKZd1jOzzpxIKuY8D6JUIGUn74H23_FA8v-cnWGS3bdGsKBhM9PWQ6npGZLe9SQ4P3WlRq7CWg=w328-h68-no)

多分，この設定で機能すると思います．



### オリジナルキーマップ

独自のキーリマップにも対応しており，以下の様にxmlで設定可能です．
xmlの場所は `~/Library/Application Support/Karabiner/private.xml`


```private.xml
<?xml version="1.0"?>
<root>
	<item>
	<name>Change F13 to CURSOR_UP</name>
	<identifier>Change F13 to CURSOR_UP</identifier>
	<autogen>__KeyToKey__ KeyCode::F13, KeyCode::CURSOR_UP</autogen>
	</item>

	<item>
	<name>Change KEYPAD_SLASH to CURSOR_LEFT</name>
	<identifier>Change KEYPAD_SLASH to CURSOR_LEFT</identifier>
	<autogen>__KeyToKey__ KeyCode::KEYPAD_SLASH, KeyCode::CURSOR_LEFT</autogen>
	</item>

	<item>
	<name>Change HOME to CURSOR_DOWN</name>
	<identifier>Change HOME to CURSOR_DOWN</identifier>
	<autogen>__KeyToKey__ KeyCode::HOME, KeyCode::CURSOR_DOWN</autogen>
	</item>

	<item>
	<name>Change PAGEUP to CURSOR_RIGHT</name>
	<identifier>Change PAGEUP to CURSOR_RIGHT</identifier>
	<autogen>__KeyToKey__ KeyCode::PAGEUP, KeyCode::CURSOR_RIGHT</autogen>
	</item>

	<item>
	<name>Change FORWARD_DELETE to HOME</name>
	<identifier>Change FORWARD_DELETE to HOME</identifier>
	<autogen>__KeyToKey__ KeyCode::FORWARD_DELETE, KeyCode::HOME</autogen>
	</item>

	<item>
	<name>Change CONTROL_R to END</name>
	<identifier>Change CONTROL_R to END</identifier>
	<autogen>__KeyToKey__ KeyCode::CONTROL_R, KeyCode::END</autogen>
	</item>

	<item>
	<name>Change SHIFT_R to PAGEUP</name>
	<identifier>Change SHIFT_R to PAGEUP</identifier>
	<autogen>__KeyToKey__ KeyCode::SHIFT_R, KeyCode::PAGEUP</autogen>
	</item>

	<item>
	<name>Change END to PAGEDOWN</name>
	<identifier>Change END to PAGEDOWN</identifier>
	<autogen>__KeyToKey__ KeyCode::END, KeyCode::PAGEDOWN</autogen>
	</item>


</root>

```

現在のキーが何に割り当てられているのかを調査するEventViewer機能も便利です．


詳細はマニュアルを読んでみてください．
[マニュアル - Karabiner - OS X用のソフトウェア](https://pqrs.org/osx/karabiner/document.html.ja)
Amazon S3への画像アップロードツールをphpで作ってみた

# 今回の成果物はこちら

https://github.com/mynet-inc/s3-deploy-tool

# このプログラムを作った背景

「ゲームで使う大量の画像ファイルをS3にアップロードしたい」

―― はい

「しかし量が多すぎてめちゃくちゃ時間がかかる」

―― 今日も残業ですね

「水曜日の残業は今年から禁止された」

―― 特別残業申請出しましょうか？

「まて、まだ希望はある」

―― 冗談ですよ

「追加があるたびに全部アップロードするのをまずやめよう」

―― それもそうですね

「そこで差分の判定にmd5を使う」

―― 常套手段ですね

「画像ファイル自体はsubversionで管理されているから、.svn等の隠しフォルダ以下は除外したい」

―― あっ、Thumbs.db をコミットしてしまいました

「おいやめろ！！」

―― この .DS_Store というファイルはなんでしょう？

「それもアップロードしちゃいかん」

―― そういえばモンハンクロス買いましたよ

「関係ない話はあとでやれ。あとそのDSじゃない。」

―― 結局どのような実装になったのでしょうか

「まず、S3にファイルをアップロードするのが一番重い。一方でダウンロードはわりと速い。」

―― S3そういう設計ですからね

「まずローカルでmd5値を計算して、別途ファイルに保存する。２回目以降ではオリジナルファイルとmd5ファイルの更新タイムスタンプを比較して、オリジナルのほうが新しければmd5を計算しなおす。md5が一致しなければ更新されたと判定する。」

―― makeのパクりですね

「全くその通りだ。」

―― その他の工夫は？

「md5ファイルはS3にも一緒にアップロードする。ローカルのディスクがぶっ壊れることなど日常茶飯事だからだ。」

―― なるほど

「これで必要最低限の時間だけでアップロードが完了する」

―― 便利ですね

「あとはアップロード確認ツールから画像を見比べてデプロイ作業は完了だ」

―― オチはどうしましょうか？

「心配ない。不具合を作りこんでおいた。」
Seleniumで結合テスト


#はじめに
「テスト」はアプリケーション開発において非常に重要なものです。
テストが通らなければ、リリースすることは出来ません。
もちろん、テストを通す前にテストを書かなければなりませんが、テストを記述するのは、容易ではありません。
学生の頃に仲間とwebアプリケーションを作った際には挫折しました... :sob: 

一口にテストと言っても、様々な物があります。

- 単体テスト
- 結合テスト (インテグレーションテスト)
- 機能テスト
- システムテスト


今回は結合テストについて書きたいと思います。

# 結合テストとは

[単体テスト](http://e-words.jp/w/%E7%B5%90%E5%90%88%E3%83%86%E3%82%B9%E3%83%88.html)で通ったモジュール（部品）を組み合わせて行うテスト
>
主にモジュール間の接続点（インターフェース）がうまく機能するかを確認する場合と、結合した状態で外部から見て一体として正しく機能するかを確認する場合がある。 (IT用語辞典より)

らしいです。 :persevere: 
いまいちぴんとこないかも知れませんが、具体的IDCFCloudのサイトに当てはめると

- サーバに入力されたUserIDとPasswardを送信する (ブラウザ側の操作)
- UserIDとPasswordの組が正しければトップページのurlを返す(サーバー側の処理)

この2つのモジュールを連携させた際に、想定通りの（入力されたUserIDとPasswordの組が正しければトップページのurlを得る）結果が得られることを確認するテストになります。

今回は結合テストをseleniumというツールを使って行いたいと思います。

# Seleniumとは
webアプリケーション用のテストツールで、webブラウザの操作を指定することによりテストを実装する。

Seleniumというツールにも何種類かありますが、今回はSelenium IDEを使用します。
FireFoxのアドオンとして使用できます。また、ブラウザの操作を記録することができるので
簡単にテストを実装できます。

## Install方法
[Selenium IDEの導入のいろいろ](http://qiita.com/showmurai/items/eb9d2a09c584b46727aa)
この方の記事がわかりやすくて良かったです。

## テストの実装
今回は先ほど例に上げた例
**入力されたUserIDとPasswordの組が正しければトップページのurlを得る** 
というテストを記述したいと思います。

実装と言っても、今回はFireFoxのAddonから自動生成するので、プログラミングの経験がなくても大丈夫です。 :smiley: 

### 準備するもの

- IDCFのアカウント（電話認証あり :scream: ）
- SeleniumIDE導入済みのFirefox

### テストの準備

1. [IDCF Cloudログインページ](https://account.idcfcloud.com/auth/login?service=https%3A%2F%2Fconsole.idcfcloud.com%2F%3Fcl%3Dcl_top)を表示させます
![top-page.png](https://qiita-image-store.s3.amazonaws.com/0/84095/29a35ec2-d23f-5be7-4660-3f895770e957.png)

2. Selenium IDEを起動します。(ブラウザの右上の３本線の中にあると思います。)
![selenium.png](https://qiita-image-store.s3.amazonaws.com/0/84095/4247e443-939f-e818-ee69-7d4ea1745ae9.png)

下のようなウインドウが出てきます。
![スクリーンショット 2015-12-15 8.23.58.png](https://qiita-image-store.s3.amazonaws.com/0/84095/cc5a14cf-898d-809a-5c19-372d02a95b41.png)
既に操作が記録されます。
記録したくない時は右上の赤いボタンをクリックしてください。
3. UserIDとpasswordを入力してログインボタンを押してください
ログインに成功すると下の図の状態になると思います。
SeleniumのIDEの方に行動が記録されているのがわかりますね。
ログイン画面上でパスワードは*******と表示されていましたが、SeleniumIDEの方にはちゃんとfugafugaと表示されているのがわかりますね。 :smiling_imp: 
![スクリーンショット 2015-12-15 8.40.48.png](https://qiita-image-store.s3.amazonaws.com/0/84095/78f118d1-d3c4-aadb-64fd-250e4b32a50f.png)
4. SeleniumIDEウインドウの右上の赤いボタンを押して記録モードを解除してください。
5. ログアウトしてログインページに戻ってください。

ここまでで準備完了です。あとはテストを行うだけです！！！ :tada: :tada: :tada: 

### テスト開始
1. このボタンを押すだけ!!!

![スクリーンショット 2015-12-15 8.46.28.png](https://qiita-image-store.s3.amazonaws.com/0/84095/2bca07fe-d485-cb8b-1fe5-e59f3b54c288.png)
そうすると下の図の状態になると思います。

![スクリーンショット 2015-12-15 8.54.05.png](https://qiita-image-store.s3.amazonaws.com/0/84095/e8bebde7-b2a7-523d-0451-2b8c23ca0066.png)
緑のvarの状態になれば、無事テストが通っています。

# 終わりに
テストは経験がないと着手しにくいです。
Seleniumのようなツールを使えば、かなり楽になります。 :smile: 
皆さんもこれを気にガンガンテストを書いてみてください
Zabbix 3.0の新機能：ログファイルから数値を取得

**注意事項**
この記事は、Zabbix 3.0が正式リリースされる前の情報ですので、正式にリリースされた際には、詳細が変更されている場合があります。ご注意ください。

# はじめに
Zabbix Advent Calendar 2015の16日目です。
Zabbix 3.0では、ログファイルから正規表現を利用して数値を取得できるようになります。

# これまでの課題
2.2の機能で、ログファイルやテキストファイルから正規表現で値を切り出して値を取得することができるようになりました。

例えば、アイテムのキーとして、log[]を利用し、第1引数にファイル名、第2引数に正規表現、さらに第6引数の<ouput>に\1を指定すると、その正規表現に合致した文字列を取得することができます。

しかし、この機能を利用しても、ログファイルから取得した値は、ログの形式でしかZabbix上で保存することができなかったため、例えば数値を取得して、それをグラフ化するということができませんでした。

実際にlog[]を利用して数値を切り出した値を数値のアイテムとして設定して保存しようとすると、以下のようなエラーメッセージが表示されてアイテムとして登録することができませんでした。

![logval-error.png](https://qiita-image-store.s3.amazonaws.com/0/101989/986004c4-06e7-15ac-be36-de670bb3084b.png)

キーでlog[]を利用しているなら、保存するデータ型はログにしないといけなかったわけです。

# 新機能概要
Zabbix 3.0では、ログファイルから切り出した文字列を数値として保存できるようになります。

例えば、

- アプリケーションの処理時間をログファイルに出力しているような環境
- 簡易なセンサーなどが測定結果をログファイルに出力しているような環境

などで、そのログファイルから処理時間や温度など必要な数値のみを取り出し、その数値を比較したトリガーを作成したり値をグラフ化することできます。


# 設定例

## 例1
例えば、以下のようなフォーマットで処理時間がファイルに出力される環境があったとします。

```:sample.log
2015/12/08 12:34:56 Web: 2.3sec/AP: 1.2sec/Total: 5.5sec
2015/12/08 12:35:56 Web: 2.2sec/AP: 1.1sec/Total: 4.5sec
2015/12/08 12:36:56 Web: 3.1sec/AP: 2.1sec/Total: 5.8sec
```

このログファイルから以下のような正規表現を利用してTotalの時間の部分のみ切り出します。

```
Total: ([0-9]+|[0-9]+\.[0-9]*)sec
```

アイテムのキーとしては以下のような設定になります。

```
log[/tmp/sample.log,"Total: ([0-9]+|[0-9]+\.[0-9]*)sec",,,,\1]
```

アイテムのデータ型としては、今回の例であれば小数点を持った数値なので、「数値(浮動小数)」を選択して保存します。

そうすると、通常の数値のアイテムと同様にグラフを作成することができますし、トリガーを設定して一定以上の秒数以上になったらアクションを実行するというようなことができます。


# まとめ
2.4で追加されたログファイルから値を切り出す機能が改善され、数値として取り込めるようになり、新たな仕組みやシステムを構築しなくても、数値としてZabbixで監視することができます。

ログファイルから切り出した文字列の数値化に困っていた方は正規表現とoutputパラメータを活用してみてはいかがでしょうか？

# おまけ
Zabbix 2.2からできていたことですが、使っていない方もいらっしゃるかと思うので、今度は、vfs.file.regexp[]を使ってみましょう。


Linuxをよく利用されている方は、/procディレクトリ以下に、カーネルに関する様々なステータス情報が保存されていることをご存知かと思います。

そこで、/proc/meminfoを参照して特定の値を切り出してみましょう。

ファイルの中を見てみるとこんな感じです。

```:/proc/meminfo
MemTotal:        1870520 kB
MemFree:          458368 kB
MemAvailable:    1141804 kB
Buffers:             764 kB
Cached:           777352 kB
SwapCached:            0 kB
Active:           949624 kB
Inactive:         248908 kB
Active(anon):     420768 kB
Inactive(anon):    10560 kB
Active(file):     528856 kB
Inactive(file):   238348 kB
Unevictable:           0 kB
Mlocked:               0 kB
SwapTotal:       2097148 kB
SwapFree:        2097148 kB
Dirty:                 8 kB
Writeback:             0 kB
```

そこで今回は、「MemAvailable」の値を取得してみましょう。
キーは以下のようになります。

```
vfs.file.regexp[/proc/meminfo,"MemAvailable: *([0-9]+) kB",,,,\1]
```

単位がkBなので、乗数をかけてB単位にすれば、グラフなどでの単位自動変換にも対応できます。


# 参考

[Zabbix 3.0マニュアル : 5.11.2 Graphing log items](https://www.zabbix.com/documentation/3.0/manual/introduction/whatsnew300#graphing_log_items)

次はusiusi360さんですね。
よろしくお願いします。
環境ごとにファイルを分ける init.el

[Emacs のアイコンを作った人](http://www.slideshare.net/nanasess/emacs-5282932) です。
Emacs25 から、アイコンが新しくなるらしく、これも時代の流れかと、しみじみ実感しておりますが、今日は [nanasess/dot.emacs](https://github.com/nanasess/dot.emacs) で晒している init.el について書こうと思います。
emacs-lisp は、万年初心者ですので、間違いなどありましたら悪からずご了承ください。。。

最近は、 init-loader が主流のようですが、どうも使い方に馴染めず、それよりも、環境ごとの条件分岐を極力コーディングしないように工夫しています。
パッケージ管理は el-get を使用しています。

各プラットフォームの設定ファイルは [.emacs.d/init.d/arch](https://github.com/nanasess/dot.emacs/tree/master/init.d/arch) 以下に、それぞれまとめています。

こんな感じで動的に読み込むようにしています。

```el
(dolist (sys-type (list (symbol-name system-type)
			(symbol-name window-system)))

  (add-to-list 'load-path
	       (expand-file-name
		(concat user-initial-directory "arch/" sys-type)))
  (load "init" t))
```

こうすることで、 init.el の構文中で、環境ごとに条件分岐を極力コーディングしなくても良いようにしています。

あと、 SKK-jisyo は GoogleDrive で共有して、どの環境でも読み込めるようにしています。
(GoogleDrive を使っているのは、現場のセキュリティ事情です...)

そろそろ、メインの init.el が 1000行を越えてきたので、分割の必要性を感じてきました。
やはり init-loader も併用するのが良さそうですね...
Bundler入門 - Rails と バージョン指定

[クービック Advent Calendar 2015](http://qiita.com/advent-calendar/2015/coubic) の 16日目です。

http://qiita.com/kotaroito/items/52ab922f74bee83a9006 の続編（？）となります。



# Rails は いかに Bundler を呼び出すか？

端的に言えば、config/boot.rb と config/application.rb を見ればよいです。

##### config/boot.rb
```ruby
# Set up gems listed in the Gemfile.
ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../Gemfile', __FILE__)
require 'bundler/setup' if File.exist?(ENV['BUNDLE_GEMFILE'])
```

によって、$LOAD_PATHを解決し、

##### config/application.rb
```ruby
require File.expand_path('../boot', __FILE__)
Bundler.require(*Rails.groups)
```

にて、必要な gem を require しています。ちなみに、Rails.groups は RAILS_ENV=productionの時[:default, :production] となります。


なお、この辺の話は Rails Guide の [The Rails Initialization Process](http://guides.rubyonrails.org/initialization.html#config-boot-rb) でも言及されています。


## gem version 指定の仕組み

Bundler は 複数 version の gem がインストールされていても、適切に require してくれる素晴らしいツールですが、どんな仕組みか気になりますよね？

コードでは追いかけませんが、sinatra gem を使ってちょっと仕組みを覗いてみます。

まず Gemfile を用意し、bundle install --path=vendor/bundle を実行します。

```rb
source 'https://rubygems.org'
gem 'sinatra', '1.4.5'
```

次に sinatra の version を1つ上げてみます。

```rb
source 'https://rubygems.org'
gem 'sinatra', '1.4.6'
```

bundle install を再実行すると、vendor/bundle は以下のようになります。

```bash
$ ll vendor/bundle/ruby/2.1.0/gems/
total 0
drwxr-xr-x   8 kotaroito kotaroito  272  4  7 22:59 .
drwxr-xr-x   9 kotaroito kotaroito  306  4  7 22:49 ..
drwxr-xr-x  13 kotaroito kotaroito  442  4  7 22:49 rack-1.6.0
drwxr-xr-x   8 kotaroito kotaroito  272  4  7 22:49 rack-protection-1.5.3
drwxr-xr-x  23 kotaroito kotaroito  782  4  7 22:49 sinatra-1.4.5
drwxr-xr-x  23 kotaroito kotaroito  782  4  7 22:59 sinatra-1.4.6
drwxr-xr-x  13 kotaroito kotaroito  442  4  7 22:49 tilt-1.4.1
drwxr-xr-x  13 kotaroito kotaroito  442  4  7 22:59 tilt-2.0.1
```

この状態で bundle exec すると $LOAD_PATH は どうなるでしょうか？

```bash
$ bundle exec ruby -e 'puts $LOAD_PATH'
/Users/kotaroito/sandbox/ruby/sinatra/vendor/bundle/ruby/2.1.0/gems/sinatra-1.4.6/lib
/Users/kotaroito/sandbox/ruby/sinatra/vendor/bundle/ruby/2.1.0/gems/tilt-2.0.1/lib
/Users/kotaroito/sandbox/ruby/sinatra/vendor/bundle/ruby/2.1.0/gems/rack-protection-1.5.3/lib
/Users/kotaroito/sandbox/ruby/sinatra/vendor/bundle/ruby/2.1.0/gems/rack-1.6.0/lib
/Users/kotaroito/.rbenv/versions/2.1.3/lib/ruby/gems/2.1.0/gems/bundler-1.7.3/lib/gems/bundler-1.7.3/lib
/Users/kotaroito/.rbenv/versions/2.1.3/lib/ruby/gems/2.1.0/gems/bundler-1.7.3/lib
/usr/local/Cellar/rbenv-gem-rehash/1.0.0
...
```

sinatra-1.4.6 だけが $LOAD_PATH に設定されていることが分かります。

あまり大した話ではありませんが、何かのお役に立てば幸いです。
便利すぎる負荷試験テストツールGatlingの使い方~戻り値チェック編~

Gatlingテストシリーズ
[便利すぎる負荷試験テストツールGatlingの使い方~自力ソース編~](http://qiita.com/nii_yan/items/d7d0ea949abeab13aea7)
[便利すぎる負荷試験テストツールGatlingの使い方~ブラウザ操作記憶編~](http://qiita.com/nii_yan/items/9ff9db9828a7a7115215)

に続き最終編は戻り値チェックです。
基本的な使い方を知りたい方は以前の記事をチェックしてみてください。
負荷試験ツールなのに戻り値のチェックも出来るのかって？？
出来るのです、そうGatlingならね。




まずはhttpステータスのチェック。

これは簡単です。
httpステータスが「200」である事のテストはこんな感じに書けばできます

```scala
package computerdatabase
import io.gatling.core.Predef._
import io.gatling.http.Predef._
import scala.concurrent.duration._
class ApiSimulation extends Simulation {
  val httpConf = http
    .baseURL("http://localhost:8080") // Here is the root for all relative URLs
    .acceptHeader("text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8") // Here are the common headers
    .doNotTrackHeader("1")
    .acceptLanguageHeader("ja,en-US;q=0.7,en;q=0.3")
    .acceptEncodingHeader("gzip, deflate")
    .userAgentHeader("Mozilla/5.0 (Windows NT 6.1; WOW64; rv:42.0) Gecko/20100101 Firefox/42.0")

  val scn = scenario("Sample")
    .exec(http("request_1")
      .get("/")
      .check(status.is(200)))
    .pause(100 milliseconds)

  setUp(scn.inject(rampUsers(10) over(5 seconds)) .protocols(httpConf))

}
```

```
.check(status.is(200))
```

が今までより追加されてますね。

続きまして、戻り値がjsonの場合の確認行ってみましょう。

Gatlingではjsonpathを使って、jsonの値チェックを行えます。

jsonpathについてはこちら
https://github.com/gatling/jsonpath


例えばこんなjsonが返ってくるAPIがあるとします

```json
{
  "foo": 1,
  "bar": {"hoge": "baz" }
}
```

このjsonの値が正しいかチェックするには以下のように書きましょう

```scala
package computerdatabase

import io.gatling.core.Predef._
import io.gatling.http.Predef._
import scala.concurrent.duration._

class JsonSimulation extends Simulation {

  val httpConf = http
    .baseURL("http://localhost:8080/") // Here is the root for all relative URLs
    .acceptHeader("text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8") // Here are the common headers
    .doNotTrackHeader("1")
    .acceptLanguageHeader("ja,en-US;q=0.7,en;q=0.3")
    .acceptEncodingHeader("gzip, deflate")
    .userAgentHeader("Mozilla/5.0 (Windows NT 6.1; WOW64; rv:42.0) Gecko/20100101 Firefox/42.0")

  val scn = scenario("ItemViewCount")
    .exec(
      http("request_1")
      .get("/")
      .check(status.is(200),
             jsonPath("$..foo").ofType[Int].is(1),
             jsonPath("$..bar.hoge").ofType[String].is("baz")
             ))

  setUp(scn.inject(rampUsers(10) over(5 seconds)) .protocols(httpConf))
}
```

```
             jsonPath("$..foo").ofType[Int].is(1),
             jsonPath("$..bar.hoge").ofType[String].is("baz")
```

ここでjsonの戻り値をチェックしています。
ん〜、いいですね！！

xmlの場合はxpath使えばチェック出来ます。


負荷試験できて、httpステータスの確認も出来て、値の確認も出来る。
もう負荷試験だけにかかわらず、acceptance testとかから使えそうですよね！

みなさん是非ともGatling使ってみてください。
こんなことも出来るよなどのフィードバックもお待ちしています！！
Emacs for Unity

# Introduction

Unity のコーディングを Emacs で行うための設定まとめ。

# Setup

## OmniSharpServer

[OmniSharp/omnisharp-server](https://github.com/OmniSharp/omnisharp-server)

OSX の場合は [Mono](http://www.mono-project.com) が必要になるため、[Homebrew](http://brew.sh) などでインストールしてからビルド。
生成した `OmniSharp.exe` を後ほど Emacs から実行する。

```
$ brew install mono
```

```
$ git clone https://github.com/OmniSharp/omnisharp-server.git
$ cd omnisharp-server
$ git submodule update --init --recursive
$ xbuild
```

## Emacs Package

[Cask](https://cask.github.io) などで各パッケージをインストールする。

```elisp
(source melpa)
(depends-on "omnisharp")
(depends-on "flycheck")
(depends-on "csharp-mode")
```

### omnisharp

[OmniSharp/omnisharp-emacs](https://github.com/OmniSharp/omnisharp-emacs)

先ほどの `OmniSharp.exe` のパスを設定。

```elisp
(require 'omnisharp)
(setq omnisharp-server-executable-path "*/OmniSharpServer/OmniSharp/bin/Debug/OmniSharp.exe")
```

自動補完など、キーの割り当てはお好みで。

```elisp
(define-key omnisharp-mode-map (kbd "<C-tab>") 'omnisharp-auto-complete)
(define-key omnisharp-mode-map "." 'omnisharp-add-dot-and-auto-complete)
```

### flycheck

[flycheck/flycheck](https://github.com/flycheck/flycheck)

OmniSharp が対応済みなので最低限。

```elisp
(add-hook 'after-init-hook #'global-flycheck-mode)
```

### csharp-mode

[josteink/csharp-mode](https://github.com/josteink/csharp-mode)

C# モード時に OmniSharp と Flycheck を利用する。

```elisp
(require 'csharp-mode)
(add-hook 'csharp-mode-hook '(lambda () (omnisharp-mode) (flycheck-mode)))
```

# Usage

Emacs で `*.cs` を開く際にソリューションファイルを求められるので、
MonoDevelop が生成した `*-csharp.sln` を指定するだけ。

## etags

タグを利用するなら [ctags](http://ctags.sourceforge.net) で生成する。

```
$ brew install ctags
```

```
$ ctags -Re
```

タグの更新は [ctags-update](https://github.com/jixiuf/helm-etags-plus) を使うと便利。

```elisp
(source melpa)
(depends-on "ctags-update")
```

# Bonus

以上で C# については諸々解消するのだが、
Unity のコーディング時には Shader を扱う機会が多く、最適なモードが見当たらなかったため作った。

## shader-mode

[midnightSuyama/shader-mode](https://github.com/midnightSuyama/shader-mode)

シンプルなインデントとシンタックスハイライトを提供。

```elisp
(source melpa)
(depends-on "shader-mode")
```

```elisp
(require 'shader-mode)
```

各仕様について、
ShaderLab は [Shader Reference](http://docs.unity3d.com/Manual/SL-Reference.html) を、Cg は [Cg_language](http://http.developer.nvidia.com/Cg/Cg_language.html) を参考にした。
セマンティクスに関しては NVIDIA の [Cg Profile Documentation](http://http.developer.nvidia.com/Cg/index_profiles.html) を網羅し反映させた。