OmniAICreator/Qiita-1.07M huggingface dataset:
ターミナルでvim/emacsがつらい人向けのSublime風エディタslap

みなさん、ターミナルではどのエディタを使っていますか？
私は専ら、vimを使っていますが、ターミナルの作業に慣れていない人に勧めるにはちょっとためらってしまいます。
他の候補にnanoも悪くないのですが、見た目がよさげなslapがあったので紹介します。

# slapとは

NodeJSで作られたSublime風のターミナルで動作するエディタです。
100以上の言語のハイライト表示が可能です。
https://github.com/slap-editor/slap

![2016-12-20_00h39_33.png](https://qiita-image-store.s3.amazonaws.com/0/8995/56add61e-4f03-b904-8a54-58691a932b5f.png)

左がファイルブラウザ、右がエディタです。

## インストール

NodeJS製なのでこれ一発です。
NodeJSがない場合は各環境のパッケージなどでインストールしてください。

```txt
npm install -g slap@latest
```

## キーバインド

* 終了: `Ctrl+Q`
* 移動: `PageUp/PageDown`/`Home`/`End`
    * 選択: `Shift`を押しながら移動キー、もしくはマウスドラッグ。`Ctrl`/`Alt`も一緒に押すと高速移動します。
* 保存: `Ctrl+S`
* Undo: `Ctrl+Z`, redo: `Ctrl+Y`
* タブ一覧: `Ctrl+L`
* 次のタブ/前のタブ: `Ctrl+Alt+PageUp/PageDown`
* タブを閉じる: `Ctrl+W`
* 検索: `Ctrl+F`
* 行番号を指定して移動: `Ctrl+G`
* 対応する括弧: `Ctrl+]`
* ファイルを開く(ファイルブラウザに移動): `Ctrl+O`、もしくはファイルブラウザをクリック
* 新規ファイル: `Ctrl+W`
* ヘルプ: `F2`

置換ができないのですが、[PR](https://github.com/slap-editor/slap/pull/374)が出ているのでそのうち取り込まれるかもしれません。

## 最低限の設定

デフォルトのままだとファイルブラウザのファイル名がアスキーコード以外、?になってしまうのでUNICODEを有効にします。
また、ファイルブラウザの幅がちょっと狭いので広げます。

```ini:~/.slap/config
; This is your customizable slap configuration. Defaults are located here:
; https://github.com/slap-editor/slap/blob/master/slap.ini
; https://github.com/slap-editor/editor-widget/blob/master/editor-widget.ini
; https://github.com/slap-editor/base-widget/blob/master/base-widget.ini
; https://github.com/slap-editor/slap-clipboard-plugin/blob/master/slap-clipboard-plugin.ini

[logger]
level = "info"

[screenOpts]
fullUnicode = true

[fileBrowser]
width = 15
```

以上、これなら苦手意識も減らせると思いませんか？
js 文章のタイトルケース変換

##お題
文章をタイトルケース変換する。
*Title Case　頭文字だけが大文字の単語

```script.js
function titleCase(str) {
 //write your code.
}
titleCase("i'm a little tea pot");
```


##出力結果　例

```script.js
("sHoRt AnD sToUt") // "Short And Stout"
("I'm a little tea pot") // "I'm A Little Tea Pot"
("HERE IS MY HANDLE HERE IS MY SPOUT") // "Here Is My Handle Here Is My Spout"
```




##主に使った関数
[charAt()](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/String/charAt)
[substring()](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/String/substring)
[join()](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/join)

##最初に試したコード

```script.js
function titleCase(str) {
  var t = str.split(' ');
  var a =[];
  for(var i= 0; i < t.length;i++){
  a.push(t[i].charAt(0).toUpperCase() + t[i].substring(1).toLowerCase());
  } 
    return a.join(" "); 
}
titleCase("i'm a little tea pot");
```

##考え方
・split(' ')で文章を単語に切り分けて変数tに入れる。
・charAt(0).toUpperCase()で単語の一文字目を大文字にして用意した配列aにpushする。
・substring(1).toLowerCase()で単語の二文字目から残り部分を小文字にして配列aにpushする。
・for文　i で文章の単語数だけ処理を繰り返す。
最後に配列aの単語をjoin(' ')で文章にする。

##mapを使ったコード

```script.js
function titleCase(str) {
  var convertToArray = str.toLowerCase().split(" ");
  var result = convertToArray.map(function(val){
      return val.replace(val.charAt(0), val.charAt(0).toUpperCase());
  });
  return result.join(" ");
}

titleCase("I'm a little tea pot");
```

##正規表現を使ったコード

```script.js
function titleCase(str) {
  return str.toLowerCase().replace(/( |^)[a-z]/g, (L) => L.toUpperCase());
}
```


###他にもコードが浮かんだ方、コメントお待ちしてます。
ACPIをOFFにしたマシンでディスプレイの電源OFF

PriusGear GN33K という古いノートPCにDebian8を入れたのですが、おそらくチップセットの問題でACPIを有効にしているとまともに動かないかったので、仕方なくカーネルオプションに`acpi=off`を追加して。ACPIを無効にして回避してました。
デスクトップPCならモニタの電源を切れば済むのですが、ノートPCだと物理的な電源OFFスイッチはないので、電源入りっぱなしであきらめていたのですが、`vbetool`なるものが有ることを知りました。
早速`aptitude`でインストールしてから `$ sudo vbetool dpms off`とすると、見事コンソールの電源がOFFになりました～。
`$ sudo vbetool dpms on`で再度電源ON。

本体のキーボード触っても電源ONにならないのは残念ですが、基本的にはssh経由でしか使わないので良しとします。
緊急時の最低限の対応用という事で、一応rootユーザの`~/.profile`に

```bash
if [ $(tty) = '/dev/tty1' ]; then
  vbetool dpms on
fi
```
を追記して、tty1からrootでログインした時にはディスプレイの電源ONにするようにしました。

参考サイト
https://yaasita.github.io/2010/06/18/6325.html
GPD WINの画面輝度をあれこれするAutoHotkeyスクリプト

# はじめに
GPD WINという小型ノートPCがあります。小型故に持ち運ぶ頻度が高いのですが、そうすると困るのが画面の明るさ。
もちろんWindowsのチャームから変更できますが、わざわざチャームを出す1動作が手間な上に、明るさが25%刻みで非常に大雑把です。

また、GPD WINにはスリープ周りに不具合が多く、スリープを使わないこともあります。
その場合、蓋を閉じた場合にはバッテリー持ちを良くするために輝度を0%にしておきたい。

なのでそんなスクリプトを書きました。

# 機能
* Win+Volume Up: 輝度を10%上げます。
* Win+Volume Down: 輝度を10%下げます。
* 蓋閉じ: 輝度を0%にします。
* 蓋開け: 輝度をもとに戻します。

# スクリプト
蓋の開閉を検出するために、[こちらのライブラリ](https://autohotkey.com/board/topic/92888-lidwatcher-monitor-the-state-of-your-laptop-lid/)を使用しました。
リンク先の[LidWatcher\.ahk](https://raw.githubusercontent.com/LinearSpoon/AHK/master/LidWatcher.ahk)をダウンロードし、次のスクリプトと同じフォルダに保存してください。

```ahk:GPDWINBrightness.ahk
#Include LidWatcher.ahk

prev_brightness := GetBrightness()
r := Start_LidWatcher()
OnExit, cleanup

Return

cleanup:
  Stop_LidWatcher(r)
  ExitApp
Return


GetBrightness()
{
    WMI := "winmgmts:{impersonationLevel=impersonate}!\\.\root\WMI"
    MonitorBrightness := ComObjGet(WMI).ExecQuery("SELECT * FROM WmiMonitorBrightness WHERE Active=TRUE")

    for i in MonitorBrightness {
        brightness := i.CurrentBrightness
        break
    }
    
    Return, %brightness%
}

SetBrightness(value)
{
    WMI := "winmgmts:{impersonationLevel=impersonate}!\\.\root\WMI"
    MonitorBrightnessMethods := ComObjGet(WMI).ExecQuery("SELECT * FROM wmiMonitorBrightNessMethods WHERE Active=TRUE")

	if value < 0
		value := 0
    for i in MonitorBrightnessMethods {
        i.WmiSetBrightness(5, value)
        break
    }
}


; 蓋の開閉で明るさの変更
LidStateChange(newstate)
{
	global prev_brightness
	if(newstate == "opened")
	{
		SetBrightness(Round(prev_brightness, -1))
	}
	else if(newstate == "closed")
	{
		prev_brightness := GetBrightness()
		SetBrightness(0)
	}
}


; キーボードで明るさの変更
#VOLUME_DOWN::SetBrightness(Round(GetBrightness()-10, -1)) ; 0%でもGetBrightness()で返ってくるのが何故か1なので適当に丸める
#VOLUME_UP::SetBrightness(Round(GetBrightness()+10, -1))
```

# おわりに
私自身はスリープを普通に使うので、キーボードによる輝度変更しか使ってませんが、2ch見てるとどうやらこういうスクリプトに需要がありそうだったので公開します。
Xcode、"Framework Search Paths"が見つからない！！！という場合。

経緯：  
とあるSDKを組み込むテストをしようと思い、
Xcodeプロジェクトを作成し、Frameworkを追加してパスを設定しようとした所で...
 大問題発生！
Frameworkのパスを設定する"Framework Search Paths"の項目が見当たらない 
・・・(ｱｾﾘ 
ググってもでてこない状況、 

以下の通り解決しました。  
Basicと、Allというスイッチで表示する項目を制御してたんですね。  
　　Build Settingsにしては項目が少ないな変だなと思ったんだけど、気づかないよ。  
　　Allにしたら全部表示されました。  
　　

<img width="618" alt="xcodeBuildSetting切り替えボタン.png" src="https://qiita-image-store.s3.amazonaws.com/0/47947/d2e0346e-8504-a3fd-46db-714c7735c779.png">  



  

(´・ω・`)はぁ・・・・・・・・・・・・
cdを改造して、11文字速くコマンドを打つ! (フロントエンド向け)

`gulp`やら`eslint`に`browser-sync`やら、日々20か30種類のコマンドを`npm`からインストールして使っている気がします。でも、これらのツールはプロジェクトごとにインストールされるので、グローバルにインストールされる普通のUNIXコマンドと同じ扱いはできません。グローバルにはインストールするべきでないし、毎度npm scriptsを経由する↓のもまどろっこしいです。

```bash
$ npm run eslint -- index.js
```

次のようにも書けますが、どちらにしろ **11文字も余計に打たないといけない**。

```bash
$ $(npm bin)/eslint index.js
```

実は、補完が効く分、素直にパスを打った方がまだ速いですが、それでも `n` `tab` `.` `b` `tab` で **少なくとも5ストローク余計**です。

```bash
$ node_modules/.bin/eslint index.js
```

なんとか、これだけ↓で動くようにできないものか。

```bash
$ eslint index.js
```

## エイリアスで解決する

そうだ。`cd`を改造すればいいじゃないか。

```sh
# .bashrc
DEFAULT_PATH=$PATH;

add_local_node_modules_to_path(){
  NODE_MODULES='./node_modules/.bin';
  if [ -d $NODE_MODULES ]; then
    PATH=$DEFAULT_PATH:$NODE_MODULES;
  else
    PATH=$DEFAULT_PATH;
  fi
}

cd () {
  builtin cd "$@";
  add_local_node_modules_to_path;
}

add_local_node_modules_to_path;
```

これで、`cd`で移動するたびに`$PATH`を変えることができました。
めでたし、めでたし。

(ただし、改造していることを忘れないように。to 自分)

## こちらも忘れずに

もし、普段`.bashrc`を使っていない場合、`.bash_profile`の最後にも一行入れる必要があるかもしれません。

```sh
# .bash_profile
test -r ~/.bashrc && . ~/.bashrc
```

## サーバではNG

あと、これセキュリティーの穴になるので、サーバでは使っちゃダメなやつです。念のため。
数字消し（思考型ゲーム）

■数字消し（思考型ゲーム）
　カーソルを移動させて数字を加算していきます。10になると0に戻りますが、11以上では移動できなくなります。移動不能になっても自動的に判別しないため行き詰まったらescキーでゲームを終了させてください。
　10行目で画面と変数とキャラクタをクリアしています。20行目ではカーソルの座標と点滅用変数の値を設定しています。30行目で数字をランダムに発生させ画面を埋め尽くすようにします。
　40行目でカーソル位置にある文字を読み出し48を引きます。これは数字の文字コードが48から始まるためです。文字が0なら0に、文字が5なら5に、文字が9なら9の数字になります。120行目〜150行目がカーソルの移動処理です。170行目では移動先の文字と現在の値と加算し移動できない場合は100行目に戻ります。移動可能な場合は値を0にしてカーソル位置を空白にします。あとは100行目に戻ってゲームを繰り返します。

●プログラム
10 CLS:CLP:CLV
20 X=15:Y=10:B=0
30 FOR I=1 TO 640:PRINT RND(4)+1;:NEXT
40 C=SCR(X,Y)-48
100 LOCATE X,Y
110 B=B+1:IF B%40<20 THEN PRINT C; ELSE PRINT CHR$(1);
120 K=INKEY()
130 IF K=0 THEN GOTO 100
140 E=X-(K=28)+(K=29)
150 F=Y-(K=30)+(K=31)
160 D=SCR(E,F)-48
170 IF D<0 OR (D+C)>10 THEN GOTO 100
180 IF (D+C)=10 THEN C=0:D=0:LOCATE E,F:PRINT " ";
190 C=C+D
200 LOCATE X,Y:PRINT " ";
210 X=E:Y=F
220 GOTO 100

●変数表
B	カーソル点滅用のタイマー変数
X	カーソルのX座標
Y	カーソルのY座標
E	カーソルの移動先のX座標
F	カーソルの移動先のY座標
I	繰り返し（ループ）用変数
C	数字の合計
D	カーソルの移動先の位置にある文字コード（変数Cに加算する数値）
K	入力されたキーコード
chromeの拡張機能でAMPページ検出ツールを作ってみた


## モチベーション

「このページってAMPページなのかな」って調べることが多く、面倒だった。

## 手作業の場合

1. 適当なURLを開く
2. デベロッパーツール
3. Elements
4. Command + f「amphtml」
5. 見つかった。-> URLをコピペして貼り付け
6. なかった。。。 -> 終了。。。

このなかった場合が、けっこう意気消沈するので、その辺りもなんとかなれば。

## 機能（できたもの）

### 機能1. 拡張機能のバッジでAMPページの有無を確認できる。

| AMPページあり | AMPページなし |
|:-----------:|:------------:|
|    ![スクリーンショット 2016-12-20 0.22.38.png](https://qiita-image-store.s3.amazonaws.com/0/153088/b76cfa33-ad6d-b17c-c3b2-4d0655b2807a.png "スクリーンショット 2016-12-20 0.22.38.png")    | ![スクリーンショット 2016-12-20 0.24.55.png](https://qiita-image-store.s3.amazonaws.com/0/153088/bd8f7208-141d-f82f-1903-208d0b6b50bc.png "スクリーンショット 2016-12-20 0.24.55.png")  | 
|Amp Project News|Google Developers Blog|


### 機能2. バッジクリックで、AMPページを新規タブで表示

| クリック前 | クリック後 |
|:-----------:|:------------:|
|![スクリーンショット 2016-12-20 0.22.38.png](https://qiita-image-store.s3.amazonaws.com/0/153088/9fec7dac-4ce5-06c5-1837-b959bba1bf07.png "スクリーンショット 2016-12-20 0.22.38.png")|![スクリーンショット 2016-12-20 0.29.08.png](https://qiita-image-store.s3.amazonaws.com/0/153088/2b69330d-000f-8747-2ee9-e890413fdab2.png "スクリーンショット 2016-12-20 0.29.08.png")|
クリック前：https://amphtml.wordpress.com/2016/12/05/amp-cache-updates/
クリック後：https://amphtml.wordpress.com/2016/12/05/amp-cache-updates/amp/

Wordpressのampプラグインは末尾に「amp/」がつくので、上記のような形になります。

## 公開について

はじめて拡張機能を作ってみましたが、公開の仕方がイマイチ分からなかったので、また時間があるときに調べてみます。
あと、ちょっと機能的に微妙な箇所と無駄なコードがいろいろあるきがするので、当面は自分のchromeのみで仕事で使おうと思います。

## 作り方

機能と参考URLだけ紹介。

・link rel="amphtml"からhref=""の中身を取得
[javascript:正規化された(canonical)URLを取得する](http://upa-pc.blogspot.jp/2015/03/javascript-canonical-url-get.html)

・background.jsとmyscript.jsのデータの受け渡し
[Chrome機能拡張のイベントページについて](http://oxynotes.com/?p=8928)
 - 今回はmyscript.jsでamphtmlのhrefを取得して、background.jsにhrefの値を送った。

・chrome.tabs.onUpdated.addListener
 - タブが更新されるたびにbackground.js起動
 
・chrome.browserAction.onClicked.addListener
 - 右上の拡張機能ボタンクリックでURLを新規タブで開く

・chrome.browserAction.setBadgeText
 - バッジに「AMP」と表示

いろいろ整理したら、またちゃんと紹介します！

## 最後に

だいぶハマって寝るのが遅くなりましたが、とても勉強になったのと、AMPの拡張機能を作れてとても嬉しいです。
また、改良して公開できるようにしたいです。

## そもそも公式のプラグインがありました。
（追記：2016年12月30日金曜日）

AMPページがしっかりと機能しているかどうかを判断するために、前々から[AMP validator](https://chrome.google.com/webstore/detail/amp-validator/nmoffdblmcmgeicmolmhobpoocbbmknc?hl=ja)の拡張機能は入れていたのですが、このプラグインにそもそも、自分が欲している機能があることに今気づきました。

なので、今回、上で取り上げたプラグインを使いたい方は、公式の[AMP validator](https://chrome.google.com/webstore/detail/amp-validator/nmoffdblmcmgeicmolmhobpoocbbmknc?hl=ja)プラグインを利用することをオススメします。

ちなみに公式の拡張機能のbackground.jsがどのように動いているかは、chromeの拡張機能の管理から確認することができるので、詳しい仕様を知りたい方はこちらを確認するのがお勧めです。

![スクリーンショット 2016-12-30 13.52.30.png](https://qiita-image-store.s3.amazonaws.com/0/153088/68d6ea60-f1d3-b10e-e7bd-284804d00abd.png "スクリーンショット 2016-12-30 13.52.30.png")


こんな感じで確認できます。
![スクリーンショット 2016-12-30 13.54.31.png](https://qiita-image-store.s3.amazonaws.com/0/153088/2e1697f8-f127-0a57-59d4-c6a97655f3e6.png "スクリーンショット 2016-12-30 13.54.31.png")

便利
GoでAESアルゴリズム(CBCモード)+PKCS7パディング+HMACを使った実装をする

[GoでAESアルゴリズム(CBCモード)+PKCS7パディング+HMACを使った実装をする](http://qiita.com/ken5scal/items/538febf69f9ac98ab292)の続きです。

さて、前回はAES+CBC+PKCSパディングを使った実装例を紹介した。パディングを使って、任意の平文をブロック型暗号で暗号化することが可能になったが、一方で脆弱性がうまれてしまった。暗号文+パディングを繰り返し送ることで平文を一部推測できてしまうような脆弱性だ。この脆弱性の根本原因は、誰もが復号できてしまう部分にある。従って、復号処理のための暗号文を入力するものを認証することで解決できる。その仕組がMAC(Message Authentication Code)であり、今回はHMAC(keyed-hash MAC)を使った実装例が今回のものになる。

# AES暗号化によるHMACとは
暗号文をHMAC用の共有鍵とハッシュ関数で導きだされるもの。復号をするまえにHMACを検証することで、サブジェクトの真性正を認証することができる。こ

# GoにおけるHMACは？
標準パッケージ内のcrypt/hmacで実装されている。パディングは実装されていなかったのに、なぜなのか。謎である。実装自体はシンプルになる。

```暗号化.go
func EncryptByCBCMode(key []byte, plainText string) ([]byte, error) {
	block, err := aes.NewCipher(key); if err != nil {
		return nil, err
	}

	paddedPlaintext := PadByPkcs7([]byte(plainText))
	cipherText := make([]byte, len(paddedPlaintext)) // cipher text must be larger than plaintext
	iv := make([]byte, aes.BlockSize)// Unique iv is required
	_, err = rand.Read(iv); if err != nil {
		return nil, err
	}

	cbc := cipher.NewCBCEncrypter(block, iv)
	cbc.CryptBlocks(cipherText, paddedPlaintext)
	cipherText = append(iv, cipherText...)

        // MAC作成
	mac := hmac.New(sha256.New, []byte("12345678912345678912345678912345")) // sha256のhmac_key(32 byte)
	mac.Write(cipherText)
	cipherText = mac.Sum(cipherText)
	return []byte(cipherText), nil
```

```復号.go
func DecryptByCBCMode(key []byte, cipherText []byte) (string, error) {
	if len(cipherText) < aes.BlockSize + sha256.Size {
		panic("cipher text must be longer than blocksize")
	} else if len(cipherText) % aes.BlockSize != 0 {
		panic("cipher text must be multiple of blocksize(128bit)")
	}

　　　　// macの取り出し
	macSize := len(cipherText) - sha256.Size
	macMessage := cipherText[macSize:]

        // 暗号文から想定macを計算
	mac := hmac.New(sha256.New, []byte("12345678912345678912345678912345")) // sha256のhmac_key(32 byte)
	mac.Write(cipherText[:macSize])
	expectedMAC := mac.Sum(nil)

        // MACによる認証
	if !hmac.Equal(macMessage, expectedMAC) {
		return "", errors.New("Failed Decrypting")
	}

	iv := cipherText[:aes.BlockSize]
	plainText := make([]byte, len(cipherText[aes.BlockSize:macSize]))
	block, err := aes.NewCipher(key); if err != nil {
		return "", err
	}
	cbc := cipher.NewCBCDecrypter(block, iv)
	cbc.CryptBlocks(plainText, cipherText[aes.BlockSize:macSize])

	return string(UnPadByPkcs7(plainText)), nil
}

```

# その他
AES +CBC +パディング + hmacでためしたが、 AES +GCMで全てやりたかったことが出来るみたいなので、次回はそちらを試してみる.
Docker laravel redisをつなげてみる

#はじめに
lumenでRedisをつなげようとした時、うまくいかなかったので、
段階を分けて接続を試みようとした時のメモ

laravelでやってみる

#構成

```
laravel
 |_docker-compose.yml
 |_app.docker
 |_vhost.conf
 |_web.docker
 |_www
```

#yml

```docker-compose.yml
version: '2'
services:
    web:
        build:
            context: ./
            dockerfile: web.docker
        volumes:
            - ./www:/var/www
        ports:
            - "8000:80"
        links:
            - app
    app:
        build:
            context: ./
            dockerfile: app.docker
        volumes:
            - ./www:/var/www
        links:
            - redis
    redis:
        image: redis:latest
        ports:
            - "6379:6379"
        command: redis-server --appendonly yes
```

#appサーバー
##Dockerfile

```app.docker
FROM php:7-fpm

RUN apt-get update && apt-get install -y libmcrypt-dev mysql-client \
    && docker-php-ext-install mcrypt pdo_mysql && \

    #zip,unzip
    apt-get install -y zip unzip && \

    #vim
    apt-get install -y vim && \

    #composer
    curl -sS https://getcomposer.org/installer | php && \
    mv composer.phar /usr/local/bin/composer && \

    #user追加
    useradd -m -s /bin/bash -u 1000 meidaimae && \

    #www.conf修正
    sed -i 's/user\ \=\ www-data/user\ \=\ meidaimae/g' /usr/local/etc/php-fpm.d/www.conf && \
    sed -i 's/group\ \=\ www-data/group\ \=\ meidaimae/g' /usr/local/etc/php-fpm.d/www.conf
WORKDIR /var/www

```

##共有ディレクトリ

```
mkdir www
```

#webサーバー
##Dockerfile

```
FROM nginx:latest

RUN useradd -m -s /bin/bash -u 1000 meidaimae && \
#nginx.conf
sed -i 's/user\ \ nginx\;/user\ \ meidaimae\;/g' /etc/nginx/nginx.conf

ADD ./vhost.conf /etc/nginx/conf.d/default.conf
WORKDIR /var/www
```
##confファイル

```vhost.conf
server {
    listen 80;
    index index.php index.html;
    root /var/www/laravel/public;

    location / {
        try_files $uri /index.php?$args;
    }

    location ~ \.php$ {
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass app:9000;
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PATH_INFO $fastcgi_path_info;
    }
}
```

##起動

```
docker-compose up -d
```


#プロジェクト作成

```
#とりま、appサーバーに入る
docker exec -it laravel_app_1 bash

#んで、meidaimaeになってlaravelプロジェクト作成 

chown -R meidaimae:meidaimae /var/www
su meidaimae
composer create-project --prefer-dist laravel/laravel laravel

#redis
cd laravel
composer require predis/predis

#/var/www以下ののディレクトリとファイルのアクセス権を変更
find /var/www -type d -exec chmod 770 {} \;
find /var/www -type f -exec chmod 770 {} \;
 
```

#redis疎通確認

```
ping laravel_redis_1 #ここでhostを確認
```

#続けて以下の箇所を.env編集

```
REDIS_HOST=172.20.0.2#上記で確認したhostを入力
SESSION_DRIVER=redis
CACHE_DRIVER=redis
```
#routesにとりあえず

```
Route::get('/testCache', function() {
    Cache::put('name', 'aaa',100);

    return Cache::get('name');
});

```
#ブラウザで確認
http://localhost:8000/testCache

#おわりに
ここまでたどり着くのにめちゃくちゃ長かった。。
ふぅ〜
GulpでRollup

[gulp-rollup](https://github.com/mcasimir/gulp-rollup)を使ってgulpでrollupを利用する方法を紹介します。

# Rollupとは

この記事が参考になります。

[Rollupがちょうどいい感じ](http://qiita.com/cognitom/items/e3ac0da00241f427dad6)

# gulp-rollupの導入

### gulp-rollupをインストール
 
```bash
$ npm install --save-dev gulp-rollup
```

### プラグインをインストール

たとえばこのあたり

* rollup-plugin-babel
* babel-preset-es2015-rollup
* rollup-plugin-node-resolve
* rollup-plugin-commonjs

```bash
$ npm install --save-dev rollup-plugin-babel babel-preset-es2015-rollup rollup-plugin-node-resolve rollup-plugin-commonjs
```

### babelの設定

```json:.babelrc
{
  "presets": [
    ["es2015", { "modules": false }]
  ]
}
```

# gulpfile.jsの設定

```js:gulpfile.js
"use strict";

var gulp = require('gulp'),
    rollup = require('gulp-rollup'),
    nodeResolve = require('rollup-plugin-node-resolve'),
    commonjs = require('rollup-plugin-commonjs'),
    rename = require('gulp-rename'),
    babel = require('rollup-plugin-babel');

gulp.task('rollup', function() {
  return gulp.src('./src/**/*.js')
    .pipe( rollup( {
      entry: './src/main.js',
      format: 'umd',
      moduleName: 'sample_module',  // formatがumd/iifeのとき必須。
      plugins: [
        nodeResolve(), // node_modulesから読み込む
        commonjs(),    // CommonJSをES6モジュールに
        babel()        // バベル
      ]
    } ) )
    .pipe('bundle.js')
    .pipe(gulp.dest('./dist'));
} );
```

gulp-rollupを使う上で注意することは、
rollupをJavaScript APIで実行した場合出力する方法として以下の2種類があります。

* bundle.write(): 上記のようにファイルに出力
* bundle.generate(): ファイルに出力せず、文字列を返す

gulp-rollupでは上記のbundle.generate()で出力しているのでgulp.destを使ってファイルとして出力する必要があります。

ファイル名を変えたい場合はgulp-renameで。

参考: http://qiita.com/cognitom/items/e3ac0da00241f427dad6#2-javascript-api%E7%B7%A8

## オプション

一般的なrollupのオプションに加えて、rollupオプションを指定することで任意のrollupのバージョンで実行することができます。

```js:gulpfile.js
gulp.src('./src/**/*.js')
  .pipe(rollup({
    rollup: require('rollup'), // 任意のバージョン
    entry: './src/main.js'
  }))
  //...
```
UE4におけるUMLの使い方、ステートマシン図、クラス図、シーケンス図

# 概要
この記事は[Unreal Engine 4 (UE4) Advent Calendar 2016](http://qiita.com/advent-calendar/2016/ue4)の20日目の記事です。

UMLを使用して開発する際特に重要なダイアグラム
ステートマシン図
クラス図
シーケンス図
についての解説をします。

# 使用したソフト
[astah* community](http://astah.change-vision.com/ja/)を使用しています。
仕事で使わなければ無料で良いソフトが使えます。
仕事の場合それなりの値段（初回3万円、維持1万円/年）します。

# 実装するもの
https://youtu.be/XatNfbloN-M

完成予想図
色の付いてるボールが仮想敵
HPが３になっていて、３回弾がヒットすると赤(死亡状態)になります。
もう一回ヒットするとHPが回復し、通常の色へ戻ります。

# １、設計
UMLを使用する場合、３つの段階に分かれます。
設計、コンパイル、微調整、の順番で行います。
まずは設計の段階の説明になります。
三つの図を使用してプログラム全体を大雑把に設計します。
・ステートマシン図
・クラス図
・シーケンス図
各図にはそれぞれ役割が有り、適切に図を使用して設計する必要があります。

![設計.jpg](https://qiita-image-store.s3.amazonaws.com/0/32364/2c603412-b5f0-1978-930c-b96da3f7b7f7.jpeg)



## １－１、ステートマシン図による設計
まずはステートマシン図でスケッチです。
キャラがどのように動いて欲しいかをイメージしながら書きます。

![マトA.jpg](https://qiita-image-store.s3.amazonaws.com/0/32364/3923018e-aa3c-3539-8b82-d410821b70cb.jpeg)
・●はスタート地点
・緑に入るとHPが回復
・HP0で赤
・HP-1で緑へ戻ります。


## １－２、クラス図による設計
次にクラス図を書きます。
前の項目で作成したステートマシン図はマトキャラＡが所有しています。
各クラスが周りのクラスとどのように関連しているかを記述します。

![クラス図.jpg](https://qiita-image-store.s3.amazonaws.com/0/32364/bd9cc5fe-30c4-f64d-3fc6-22fb991a2eaf.jpeg)

## １－３、シーケンス図による設計の妥当性検証
次にシーケンス図でクラス図、ステートマシン図で
書いた物が成立するかの確認をします。
シーケンス図は作成する前にシナリオを考えます。
この図では
１、メインキャラが弾発射
２、弾が空中を進んでいく
３、弾がマトキャラＡにヒット
４、マトキャラＡのＨＰが減る。
以上のシナリオを考えました。
「このタイミングでステートマシン図はこう遷移する」
「このタイミングでクラス図のこの機能を使う」
と言った事に注意しながらシーケンス図を作成してください。
繰り返しますが、シーケンス図の目的は各図の妥当性検証です。

![シーケンス図.jpg](https://qiita-image-store.s3.amazonaws.com/0/32364/30dae170-3767-9967-fa16-ff0d81c78c27.jpeg)


# ２、コンパイル
ＵＭＬで設計した物を言語に直します。
ＵＭＬで設計したモデルを
BlueprintのVisualScriptやＣ言語へ変換します。
ここの引き出しの数により、設計の幅が広がります。
図の表記１個　＝　実装方法１個
を意識して作成します。

![コンパイル.jpg](https://qiita-image-store.s3.amazonaws.com/0/32364/94e55054-16d4-d1cb-50ca-672fa9de9b92.jpeg)

## ２－１、ステートマシン図のBlueprintコンパイル
幾つか図は有りますが特にステートマシン図のコンパイルは
頻出、かつ汎用性が高いので説明させていただきます。

![ステートマシン.jpg](https://qiita-image-store.s3.amazonaws.com/0/32364/9c00086e-2972-1af9-a35b-9eb5867c3e96.jpeg)
ステートマシン図の実装例
他にも色々なコードの書き方を用意しておくと設計の精度が上がります。

## ２－２、ステートマシン図の遷移条件チェック
![Do拡大.jpg](https://qiita-image-store.s3.amazonaws.com/0/32364/878f004d-ac84-c9c9-22e1-72371cb08b32.jpeg)
これがBluePrintでのステートマシン図実装例の一部です。
HPが0になると変数(State)に1(死んでる状態へ遷移)を書き込みます。
HPがマイナスになると変数(State)に0(生きてる状態へ遷移)を書き込みます。
これはステートマシン図上での遷移条件の実装であると確認できます。

## ２－３、ステートマシン図の遷移した時、Enterの処理
![Enter拡大.jpg](https://qiita-image-store.s3.amazonaws.com/0/32364/aa9f1787-8813-36f1-c5d8-953630990d58.jpeg)
Stateが0になったタイミングでマテリアルをgreenに変更、HPが3に回
Stateが1になったタイミングでマテリアルをredに変更

## ２－４、ステートマシン図に対して1対1で対応
１－１で書いたステートマシン図のどの部分が
どのようにコンパイルされているかが分ると思います。
「図を書くと自動的にコードが決まる」事が理想です。

# ３、微調整
全てのＵＭＬ図をコンパイルだけで行えれば良いのですが
そう理想的には行きません。
その場に合わせて必要な部分を付け足します。
ただし、これは決まったやり方は有りません。
![微調整.jpg](https://qiita-image-store.s3.amazonaws.com/0/32364/a3a37b23-dbec-ddfc-1023-1907c0051090.jpeg)
すみません。
微調整は状況によって好きに実装するだけなのでサンプルらしいサンプルは無いです。


# サンプルコード
[サンプルコード](https://bowlroll.net/file/123362)
上記ＵＭＬの図を実装してみたコードです。

# 注意
ＵＭＬをコード化することをコンパイルと言ってるのは我流のやり方で、
一般的ではないかもしれません。
正しい言い方が有ったら教えていただけると助かりますです。
あと、ＵＭＬをこのように使う方法（シーケンス図を妥当性検証としちゃう辺りとか）
も我流で、一般的かどうかは知りません。
VMwareのIPv6 NATを使ってみたら、IPv4 onlyホストにつながらなくなる(from Windows 10 VM)

# はじめに

VMware Fusion 8, Workstation 12, Player 12 には、IPv6 NAT (NAPT)機能が提供されている。NAT配下のVMにULAを配布して、ホストOS IPv6アドレスを1つだけ持っていれば、ポート変換まで通信する事ができる。


![スクリーンショット 2016-12-19 15.38.33.png](https://qiita-image-store.s3.amazonaws.com/0/154037/24aeeaf0-c99c-f4dc-cd97-262d2f9e11ea.png)



```
   |
   | 2001:db8::xxxx (GUA)
[VMware]
[ NAT  ] ↓↓↓↓↓ホストOS内の仮想ネットワークの世界
   | 
   | RA     fd01:2::/64 (IPv6 ULA)
   | DHCPv4 192.168.46.0/24 (IPv4プライベート)
---+-----------------------+---
                           |
                     [VM: Windows10]
```


NAT配下にWindows 10のVMをおいて、RAでULAを配布してみたら、IPv4 onlyのサイト(例えばgithub.com) につながらなくなってしまった。ULAの配布をやめれば問題なくつながる。

# アプリケーションの動作

FireFoxとVisutal Studio 2015 にバンドルされる git for Windows の動作例。どちらも名前解決に失敗して動作が止まる。しかしIPv4インターネットにはつながっているし、DNSサーバはAクエリに対してA応答を返してくる。

![スクリーンショット 2016-12-19 15.50.48（2）.png](https://qiita-image-store.s3.amazonaws.com/0/154037/627728ab-d4df-066b-e7b3-b43390530dcc.png)



# 名前解決API getaddrinfo() の動き

## テスト

呼び出しの前提として、github.com に２つのAレコードがついているとする

```
github.com.  IN A 192.30.253.112
github.com.  IN A 192.30.253.113 
```

IPv6デュアルスタック、VMwareのDNSプロキシを使用、かつ下記の引数で github.com の名前解決を試みると

```
int getaddrinfo(hints, ai0, nodename, servname)

IN hints
     .ai_family = PF_UNSPEC;
     .ai_socktype = SOCK_STREAM;
     .ai_flags = 0;
OUT ai0
IN nodename = "github.com";
IN servname = "https";
```


呼び出し関数戻り値（結果）は

|OS|IPv6あり (デュアルスタック)|IPv6なし (IPv4 only)|
|:-----------|------------:|:----------:|
| Windows 10 Pro|**失敗(EAI_FAIL)**※1|成功※2|
| Ubuntu 16.04 LTS|成功※3|成功※3|
| FreeBSD 11.0-RELEASE|成功※4|成功※4|


## 分析＆推測


### ケース　※1 (Windows デュアルスタック)

getaddrinfo() 自身が失敗で終わるのでIPv4アドレスも取れない。CNAMEのループを処理できなくなりEAI_FAILが返すのではないかと思う。EAI_FAILのテキスト表現、gai_sterror() の出力は "non-recoverable failure in name resolution"

### ケース　※2 (Windows IPv4 only)

Windows Vista以降では、IPv4 onlyの環境ではAAAAクエリの生成しないので、AAAAクエリの応答に対する回答を解釈しない。CNAMEのループを処理する必要がないため、成功を返すと推測している。

### ケース　※3 (Linux glibc)

名前解決は成功するが同じアドレスが２つ重なったアドレスリストが得られる。

1. 192.30.253.**113**
2. 192.30.253.112
3. 192.30.253.**113**

最初の一つ目は、AAAAクエリに対して得たA応答から作った要素、後者の２つがAクエリに対して得たA応答から要素を作り、全体のリストを作っていると推測する。

### ケース　※4 (FreeBSD libc)

名前解決は成功して返却されるアドレスリストも

1. 192.30.253.112
2. 192.30.253.113

重複はない。ちなみに、syslogには gethostby*.getanswer: asked for "github.com IN AAAA", got type A と出力される。

# 原因

VMwareのDNS proxyがAAAAクエリを適切に処理できないため。動作の詳細を下記のノートのまとめてある。

- VMware Fusion 8のDNSプロキシ, AAAAクエリに対する不正な応答 (たぶん Workstation, Player 12も), http://qiita.com/ip6/items/e82279656837fa474589


# workaround

VMware NATのDNSプロキシを使わない。
インフラエンジニアとしてやっていくと決めた理由

この記事は、 株式会社アイスタイル [Advent Calendar 2016](http://qiita.com/advent-calendar/2016/istyle)の20日目の記事です。

クリスマスまで後5日！皆様クリスマスの予定はもう決まってますか。

本日は弊社ポケモン部部長~~(インフラの女神)~~が、壮大な自分語りをします。
この記事にポケモンは一切出てきません。期待していた方々いらっしゃいましたらすみません。

どうぞ最後までお付き合い下さいませ。

# ポケモン部部長から、はじめに
「**インフラ関連の技術的な話を書こう！**」
と、一ヶ月前には思っていました。思ってたんです…

ですが、約1年のニート期間を経て、2016年7月1日に晴れて脱ニートした私は技術力もまだ未熟すぎて、自信を持って書けるような内容が思いつきませんでした。

ということもあり、今回は
「インフラエンジニアとしてご飯を食べていく覚悟を決めた話」
を書くことにしました。

2回目ですが、**壮大な自分語り**です。
どうぞお付き合い下さい。

# ひとことで
なんで覚悟を決められたか、それは

・アイスタイルでのインフラ業務が楽しかったから

# IT関連の技術者になろうと思ったきっかけ
## ひとことで

・パソコンをいじるのがとにかく好きだった

## くわしく
小～中学生の頃から、ホームページの作成をしていました。HTMLタグを自分で調べて、作ってました。今では黒歴史です、つくったホームページは見せられません。

情報系の大学へ進み、3年間で一通りの情報系基礎知識を学んだあと、卒業研究はC言語を使用した自動チューニングに関する検証をやりました。コーディングするのが本当に楽しかった。

そして、将来はプログラマーになりたい！と思い、新卒就活を開始しました。

# 晴れて就職、なぜかインフラエンジニアに
## ひとことで
・配属先の希望が通らなかった

## くわしく
ご縁があった会社に、私の希望(**開発やりたい！**)とも合った形で入社させていただくことが決まりました。

2014年新卒として入社し、研修を経て配属先が決定。人事の方々に「開発が出来るような現場にしたよ～！」と言われ、ワクワクしながら向かったが、、
そこでの業務内容がインフラエンジニアでした。

プログラマーになりたかった自分にとって、現実と理想のギャップに悩んだ時期もありました。「社会人とはこういうものだ」「新卒は何がなんでも我慢しなければいけない」「みんな悩んでるんだ」と、自分自身に沢山言い聞かせて、なんとか乗り切りました。
でも、どんどんインフラエンジニアが嫌いになりました。

# ニート期間を経て転職へ
## ひとことで
・結局インフラエンジニアとして転職

## くわしく
色々あってニートをしていましたが、働く気になったので転職活動を始めました。

今まで自分がやっていた業務内容はインフラエンジニア。どうしたってそれを武器にして転職活動をする他ありませんでした。でも、元々自分がなりたかった技術者はプログラマー。なので、「将来は開発もやってみたい、でも今はインフラをマスターしたい」という体で転職活動をしました。

「開発業務未経験でも開発者として育てたい」という心優しい企業も含め、何社か内定をいただけました。その中で自分が決めた転職先は、
インフラエンジニアとして内定を頂いたアイスタイルでした。

# 結局楽しかったインフラエンジニア
## ひとことで
・インフラエンジニアの新しい価値観を見た

## くわしく
約1年間も離れていたインフラ業務、というか、そもそも社会人としての生活。まず馴染めるかが不安でした。
でも、そんなの一瞬で打ち消されました。
それはなにより、インフラ含めシステムアーキのメンバーに、あたたかく迎えてもらえたからです。(たぶん、、そう信じたい、、、)

アイスタイルのインフラ業務は、前職のインフラ業務とは全く違っていました。私に、インフラエンジニアの新しい価値観を与えてくれました。
それは多分、WebのインフラとSier(前職がSier)のインフラで考え方、捉え方が異なっているところに起因するんだと思います。
現在、日々の中で教えてもらう全ての業務がとにかく楽しい状態です。~~時には辛いこともありますけど。~~

それがきっかけでもあり、アイスタイルでインフラエンジニアを任せてもらえた約半年間で、私は**インフラエンジニアとして食べていく覚悟**が出来ました。

# まとめ
「インフラエンジニア」と一言で表しても、色々なカラーがあります。
アイスタイルに入社したことで、そのカラーと自分自身がピッタリとはまりました。そのおかげで、「これからもインフラエンジニアとして働いていきたい」という気持ちが自分自身に芽生えました。

今後は、なにがあっても、頼れるインフラエンジニアの一人として日々精進していきます！


明日は[@nakahararuu](http://qiita.com/nakahararuu)さんです！よろしくお願いします～！
Nginxでコンテンツに対してgzip圧縮をかける


# このページでわかること
Nginxでgzip圧縮をかける方法

# 目的
text/html以外のコンテンツにもgzip圧縮をかけることで
ネットワークの負荷を低減する。

# 設定方法
nginxの設定ファイルで任意の場所(serverディレクティブ配下など)に
以下の記述を設定します。

```text:gzip圧縮の有効化
gzip on;
gzip_types コンテンツタイプ;
```

## 設定例

```text:gzip圧縮の有効化
gzip on;
gzip_types text/css application/javascript application/json application/font-woff application/font-tff image/gif image/png image/jpeg application/octet-stream;
```

`text/html` については、[常に圧縮されるようです](http://nginx.org/en/docs/http/ngx_http_gzip_module.html#gzip_types)。重複していると警告が出るので書かないようにしましょう。

また、 `image/jpeg` などすでに圧縮されているフォーマットについては圧縮率が高くならない場合があります。 `gzip` することで削減できる通信量と、圧縮することによって増える負荷とのバランスを検討すべきかもしれません。

# 設定結果

HTTPレスポンスヘッダー内のContent-Encodingで
gzipが設定されていればgzip圧縮有効。

![Kobito.lKN0Mz.png](https://qiita-image-store.s3.amazonaws.com/0/40692/92443d06-d024-0367-0bf2-2a6a8030e95f.png "Kobito.lKN0Mz.png")
Google Apps Scriptでテスト品質管理できる仕組みを作ろう〜第３章 PB曲線〜

この記事は[フロムスクラッチ Advent Calendar 2016](http://qiita.com/advent-calendar/2016/fromscratch)の12日目の記事です。

# もう一度自己紹介
1987年の三重県人です。関西の人間（特に大阪）からはよく虐げられます。くやしいのぅ。現在は[フロムスクラッチ](https://f-scratch.co.jp/)の開発部隊にいます。主にはテストチームのマネージメントをしていますが、要件定義のお手伝いをしたり、AIのためのデータモデルの設計のお手伝いをしたり、テストデータ自動生成の仕組み考えたり、などとやってることは様々です。なんでもやったるぞと。
今回は[前回](http://qiita.com/ddddbird/items/0abf08a0a54094506d28)に紹介したテスト品質管理できる仕組みの第3段！品質情報表についてお話します。最終回です！

# 前回までのおさらい
[前回](http://qiita.com/ddddbird/items/0abf08a0a54094506d28)は、WBS・テストケースとその結果・不具合報告書をインプットとして、テスト進捗状況表をアウトプットするという話をしました。そして今回は品質情報表についてお話します。

前回のシステム構成同様にDBにはFusion Tablesを、データのインプット・加工・アウトプットにはGPSを用います。

# 今回、表現する品質情報
品質情報を可視化するためのツールはいくつかあるとは思いますが、前回作成したテーブル情報（テスト進捗状況テーブル）と相性が良いことからPB曲線を出力したいと思います。

システム構成としては以下のとおりです。

<img width="802"  src="https://qiita-image-store.s3.amazonaws.com/0/103674/ddccca65-5e49-f9c0-75d6-3e833bdacaa6.png">


## PB曲線とは
PB曲線はPCL（プログラム・チェックリスト）消化曲線とバグ検出曲線が合わさったものです。テストケースの完了具合とバグ検出の収束度合いを見てテスト品質が適切か判断します。
## PB曲線を表現するために
PCL（プログラム・チェックリスト）消化を確認する変数として残テストケース数を、またバグ検出を確認するための変数として総不具合検出数と不具合修正完了数をみることにします。残テストケース数と総不具合検出数と不具合修正完了数は[前回](http://qiita.com/ddddbird/items/0abf08a0a54094506d28)作成したテスト進捗状況表から取得することが可能です。

取得した残テストケース数・総不具合検出数・不具合修正完了数をそれぞれ日次で並べます。表にすると以下のようになります。

<img width="784" src="https://qiita-image-store.s3.amazonaws.com/0/103674/4dff375d-effa-05bb-328e-4f102fb43f6a.png">


## 取得したデータのグラフ化

縦軸を数、横軸を日次として先程作成したデータをグラフ化します。
<img width="604" src="https://qiita-image-store.s3.amazonaws.com/0/103674/00c6628e-73b1-a913-bd65-7210f2b4d6c2.png">

このようにしてPB曲線を表すことができました。

# まとめ
連載形式でアドベントカレンダーに書き連ねていきました。『テスト品質管理できる仕組みを作ろう』のコーナー。まぁそれなりに楽しかったです。ちゃんと運用に載せたいですねぇ。せっかく作ったのだから。。
あと、PB曲線いがいにも出していきたい。たとえば、次はバグ密度とかとってみたいけど、FPとかSLOCってどうやって管理しようか、うーん。。

# ということで
クリスマスまでもう１週間もないよー！
DockerでGitHubに置いた全てのソースコードを検索できるようにする

この記事は[Groonga Advent Calendar](http://qiita.com/advent-calendar/2016/groonga)20日目の記事です。

![docker-milkode-01.png](https://qiita-image-store.s3.amazonaws.com/0/3885/748fe4cf-6ea4-f45c-29c3-ae55cd12e1ac.png)

http://mycode.ongaeshi.me/

リンク先は私が[GitHub](https://github.com/ongaeshi/)にUPしている全てのソースコードを検索できるようにしたサイトです。GitHubが苦手な[行単位のAND](http://mycode.ongaeshi.me/home?query=def+test_)もできます。[ブログの原稿](http://mycode.ongaeshi.me/home/ongaeshi.hatenablog.com?query=Ruby&shead=package)もGitHubにあげているので昔書いたことをさくっと検索できて便利です。

内部にGroongaを使ったMilkodeというソフトウェアを使って構築されています。Groonga(Rroonga)はとても性能がよいので数千、数万のくらいのファイル数なら一瞬で検索できます。

MilkodeはRubyで書かれているのですが、最近Dockerを使って簡単に構築、保守できるようなDockerfileを書きました。のでご紹介です。

## docker-milkode
[ongaeshi/docker-milkode: Milkode's Dockerfile](https://github.com/ongaeshi/docker-milkode)

- Dockerをあらかじめインストールしておいてください
- READMEを上から順に実行します
- [Use Data Volume Container](https://github.com/ongaeshi/docker-milkode)はオプションですが設定しておくことをおすすめします
- アプリケーションコンテナ(milkode)とデータコンテナ(milkode-data)を分けておくことで、アプリケーションコンテナを作り直しても<b>データの再構築が不要</b>になります。以下のようなときに便利です
  - 新しいデータを追加するとき
  - milkodeをバージョンアップしたいとき
- データコンテナにGitHubのデータを注入したいときは[ongaeshi/mycode](https://github.com/ongaeshi/mycode)の`add_all.sh`あたりが参考になると思います

## 外部に公開したい
http://mycode.ongaeshi.me はnginxを使っています。robots.txt を作ってロボットの巡回を防いでおかないとそこそこ負荷がかかるので注意。

```
server {
    listen 80;
    server_name mycode.ongaeshi.me;
    proxy_set_header Host $host;

    location /robots.txt {
        alias /etc/nginx/robots.txt;
    }

    location / {
        proxy_pass http://127.0.0.1:9292;
    }
}
```

## そのうち
- cron

自分のローカルマシンに、社内のイントラネットに、クラウドサーバーにどうぞ。
JISキーボーダーもErgodoxを使いたいんです

# 概要
初めまして。本記事では、ErgodoxをどうしてもJIS環境で使いたい人間が、「JIS配列とUS配列の差異を吸収するマクロを作ればいいのではないか」と気づいてヘッダファイルを作るまでの思考の流れを公開します。[開発者のgitリポジトリ](https://github.com/jackhumbert/qmk_firmware)をダウンロードし、自分で`make`できる人に向けて書いています。この記事でJISキーボードユーザにとっての敷居を少しでも下げることができたら嬉しいです。

# デスクトップの様子
![Cz3zsk9UcAAYY0S.jpg](https://qiita-image-store.s3.amazonaws.com/0/155429/de85d6b0-0564-b8a0-37dd-77ecd2fdcfa6.jpeg)

上記が僕のErgodox環境です。Ergodox EZを購入し、F,Jキーを突起付きのものに変更しています。見ての通り、JIS配列がデフォルトのノートPCにErgodoxをつないで使っています。
僕のようなユーザは、Ergodoxを使い始めてからしばらくはある大きな問題に悩まされることになります。

# 刻印と入力がかみ合わない！

OSが、接続されているキーボードがJIS配列であると思い込んだ状態でEUSキーボードを使うと、刻印と入力がかみ合わないという面倒な現象が起こります。例えば"@"を入力したいのに"["が入力されたり、"="を入力したいのに"_"が入力されたりするわけです。(参考:http://www.nagasaki-gaigo.ac.jp/toguchi/pc/multilingual/keyboard_us_jis.htm)
これは、Ergodoxが想定しているユーザー層のUSキーボードと、日本人になじみの深いJISキーボードとで文字の割り当てが異なっていることによる問題です。解決するにはどういった方法があるか考えてみました。

## 案その１．OSのキーボードの種類を変更する

OSがキーボードの種類を勘違いしていることが原因ですから、正しいキーボードを教えてあげればいいわけです。　http://freesoft.tvbok.com/win10/tips/keyboard.html などを参考にしてキーボードの設定を変更すれば入力が食い違うことはなくなります。

しかし、**僕は20年間JISキーボードに慣れ親しんで育ってきている**わけです。この積み重ねを無視するわけにはいきません。それに、今度は備え付けのJISキーボードが使えなくなる可能性もあります。
他の方法を考えてみましょう。


## 案その２．フリーソフトを使って解決する

Windowsならば例えば[DvorakJ](http://blechmusik.xii.jp/dvorakj/)のようなフリーソフトを使うことで、キーボードによって使う配列を変える、という要件を満たせそうな気がします。
> DvorakJ は、Windows XP, Windows Vista, Windows 7, Windows 8 で動作する持ち運び可能なキー･リマップ・ソフトです。当初は DvorakJPや高速タイピング JLOD配列 (Japanese Layout on Dvorak)といった Dvorak配列の派生への切り替えに特化していましたが、現在はさまざまなキーボード配列に対応しています。

Macならkanabirarが近いんでしょうか。これでも、一応解決はしそうです。

しかし、**我々はErgodoxユーザである**という前提を忘れてはいけません。**これだけ柔軟なキーボードを使っていて、外部ソフトウェアに頼るのでは本末転倒**だと言えましょう。なんとかErgodox内で完結できないか考えてみます。

## 案その３．US-JISキーボードの食い違いを理解する

**刻印と入力がかみ合わない！**ことについての理解を掘り下げていきましょう。デフォルトの`keymap.c`では、キートップの刻印の"["の位置には`KC_LBRC`と記述されています。もちろん"]"の位置には`KC_RBRC`です。それぞれ、*left-bracket*と*r-bracket*の略でしょう。実際にこのキーを入力すると、JIS環境では
`KC_LBRC->"@"キー`
`KC_RBRC->"["キー`
に割り当てられていることが分かります。**この調子でKC_XXXと実入力を紐づけていけば、なんとかJIS環境でも使うことができそう**ですね。**Ergodoxだけで完結させたい**という、これまでの目標も達成しています。

しかし、この方法は**若干保守性が悪い**ですよね。
**「KC_QUOTはJISキーボードの":"キーだな」**とか、**「"^"を入力したいから、keymap.cにはKC_EQLを記述しよう」**というのを毎回やるのはちょっと億劫です。
また、実はこの方法では**どうしても入力できないキー**が存在します。それが**「ろ」キー**です。番号で言うと**0x87**、`KC_INT1`あたりに存在するのですが、普通に見つけるのは無理だと思います。

## 正解：キーコードをJIS向けに再定義しよう！

**JIS配列とUS配列には差異があり**、**定義されたキーコードのずれ**によるものだと、これまでの調査で分かってきました。この差異は、**コンピュータで吸収**できないでしょうか。**できますよね！**

##### マクロを定義しよう

`keycode.h`を確認すると、我々が`keymap.c`で使っているKC_HOGEはすべてそこで定義されているマクロだと分かります。**我々も同じことをやればいい**わけです。案その３で突き止めたキーコードをマクロに反映していきます。

```
＃define JIS_ATMK KC_LBRC
```
などと見えるところに書いておけば、"@"は`JIS_ATMK`で入力できます。

##### 車輪の再生産はよくない

JIS配列として使いたいユーザー**全員が上の作業をする**のは**明らかにムダ**ですよね。Ergodoxでアップしたはずの生産性をこんなところで無駄遣いするわけにはいきません。誰か一人が調べれば、それは全員で共有できてしかるべきです。
そんなわけで、必要な分の定義をヘッダファイルにまとめました。
[sugarAsalt/keymap_JIS](https://github.com/sugarAsalt/keymap_JIS)


この定義を使うには、Ergodoxユーザであれば、`qmk_firmware/keyboards/ergodox/`以下（`ergodox.h`や`ergodox.c`が置いてあるフォルダ）に置き、自身の`keymap.c`の冒頭に`＃include "keymap_JIS.h"`と書きます。

ついでに僕のキーマップもアップロードしてみました。職場ではMac,家ではwindowsの二重生活なので、どちらでもなるべく同じ使用感になるように調整してあります。

拙文失礼しました。特に混乱を招く記号類は記述した文ですべてだと思うんですが、足りないものがあったら教えていただければ修正もします。

どこかに、qmk_firmwareに同梱されてるDockerfileの使い方を教えてくれるサンタさんは居ないかな～。
NativeCallを使ったプログラムの一部だけを最小構成で再現する方法

こんにちは、Perl 6 Advent Calendar 2016の20日目の投稿になります。

# イントロダクション

皆さん、NativeCallを触ったことありますか？
NativeCallはPerl 6の世界とC/C++の世界をつなぐインタフェース、および、その実装です。
NativeCallを使った代表的なプログラムは、[何度か紹介したInline::Perl5](http://qiita.com/titsuki/items/0ee508c93d7bff149916)でしょう。

NativeCallを利用したプログラムを書いていると、エラーに遭遇した時にいったいどこに問題があるのかわけがわからなくなってしまうということがよくあると思います。
今回は、そんな時のために、NativeCallを使ったプログラムの一部だけを最小構成で再現する方法を紹介しようと思います。
具体的には、引数として与えられた文字列をそのままかえす`echo`関数をCで実装して、Perl6から呼び出してみます。

# 準備

+ ディレクトリの作成

```
$ mi6 new MyNative # mi6 はpandaかzefで入れてください
$ mv MyNative p6-MyNative
$ cd p6-MyNative
```

+ rakudoのリポジトリの中の、`CompleTestLib.pm` (※)を`wget`でとってきましょう

```
$ cd t
$ wget https://raw.githubusercontent.com/rakudo/rakudo/nom/t/04-nativecall/CompileTestLib.pm
```

+ エディタで`CompileTestLib.pm`を開いて編集します
 + `t/04-nativecall/$name` となっているところをすべて　`t/$name` に置き換えます。

+ 保存します

+ C言語のヘッダファイルとコード本体を生成します

```
$ touch example.c
$ touch example.h
```

+ ディレクトリ構成を確認すると、このようになっているはずです:

```
$ tree
.
├── LICENSE
├── META6.json
├── README.md
├── bin
├── lib
│   └── MyNative.pm6
└── t
    ├── 01-basic.t
    ├── CompileTestLib.pm
    ├── example.c
    └── example.h
```

# コードを書いていきましょう

+ 下記の例では、入力された文字列をそのまま返すだけの単純な関数`echo`を実装しています

## t/01-basic.t

+ `01-basic.t`を下記のように編集して保存してみましょう

```
use v6;
use Test;
use MyNative;
use NativeCall;
use lib <lib t>;
use CompileTestLib;

compile_test_lib('example');

my sub echo(Str $msg) returns Str is native('./example') { * }

is echo("Qiita"), "Qiita";

done-testing;
```


## t/example.h

+ `example.h`を下記のように編集して保存してみましょう

```
#if ! defined(HEADER_EXAMPLE_H)
#define HEADER_EXAMPLE_H

#ifdef __cplusplus
extern "C" {
#endif

const char* echo(const char* msg);

#ifdef __cplusplus
} /* closing brace for extern "C" */
#endif

#endif /* HEADER_EXAMPLE_H */
```

## t/example.c

+ `example.c`を下記のように編集して保存してみましょう

```
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "example.h"

#ifdef _WIN32
#define DLLEXPORT __declspec(dllexport)
#else
#define DLLEXPORT extern
#endif

const char* echo(const char* msg) {
    return msg;
}
```

# 実行

+ 実行してみましょう

```bash:実行コマンド
$ mi6 test -v t/01-basic.t
```

```bash:結果
...
t/01-basic.t .. 
ok 1 - 
1..1
ok
All tests successful.
```

よさそうです。このような要領で、挙動を確認してみたい箇所のコードだけをコンパイルして実行するということが可能になります。

# 脚注

(※) [CompleTestLib.pm](https://github.com/rakudo/rakudo/blob/nom/t/04-nativecall/CompileTestLib.pm) is licensed under the Artistic License 2.0


以上、Perl 6 Advent Calendar 2016の20日目の投稿でした。
21日目は@magnolia_k_ さんの担当となります。それではお楽しみに！
Golangで書いたCLIツールのビルド済みバイナリをbrew tapでインストールできるようにする

# はじめに
最近趣味でGoで書いてる[myaws](https://github.com/minamijoyo/myaws)というツールにbrew tapを作った。

ビルド済みバイナリを[ghr](https://github.com/tcnksm/ghr)などでGitHubのReleasesページにあらかじめアップロードまでしてたけど、自分の周りの人々に使ってもらうのにインストールの敷居を下げるためにbrewでインストールできるようにしようかなと。brewの本家に登録するほどのものでもないので、とりあえずbrew tapで個人リポジトリで運用。

Goだとビルド済みのバイナリダウンロードして展開するだけなので、思いのほか簡単だった。

# 手順
まずhomebrew-myawsというリポジトリを作って、

https://github.com/minamijoyo/homebrew-myaws

myaws.rbというファイルを作って、ビルド済みのバイナリを取ってきて展開するだけなら中身これだけ。

```myaws.rb
require "formula"

class Myaws < Formula
  homepage "https://github.com/minamijoyo/myaws"
  url "https://github.com/minamijoyo/myaws/releases/download/v0.0.7/myaws_v0.0.7_darwin_amd64.tar.gz"
  sha256 "8857fb781417eb6ed370084a27de57993272d19e35df8db180c41f8cecf632a3"
  head "https://github.com/minamijoyo/myaws.git"
  version "0.0.7"

  def install
    bin.install "myaws"
  end
end
```

sha256のダイジェストはtar.gzのファイルをダウンロードしてきて、opensslで確認。

```
$ openssl dgst -sha256 ~/Downloads/myaws_v0.0.7_darwin_amd64.tar.gz
SHA256(/Users/m-morita/Downloads/myaws_v0.0.7_darwin_amd64.tar.gz)= 8857fb781417eb6ed370084a27de57993272d19e35df8db180c41f8cecf632a3
```

これで、以下のようにしてインストールすることができるようになった。

```
$ brew tap minamijoyo/myaws
$ brew install myaws
```

```
$ which myaws
/usr/local/bin/myaws

$ myaws version
myaws version: v0.0.7, revision: c24f7f2
```

うん。よさげ。

# まとめ
意外と簡単なので、俺々コマンドをbrewで入れたくなったらどうぞ。

(2017/02/04追記)プライベートなGitHubリポジトリでやる方法は以下に書いた。
[HomebrewでプライベートなGitHubリポジトリのReleaseページから社内ツールを配布する](http://qiita.com/minamijoyo/items/8bb3c80974b77b8ae81f)
Vimscriptでヴィジュアル系ソートアルゴリズムを実装してみた

[Vim (その2) Advent Calendar 2016](http://qiita.com/advent-calendar/2016/vim2) 20日の記事です。

Vim Scriptでバブルソート、クイックソート、マージソート、挿入ソートを可視化してみました。

(Vim Script 初心者なので至らぬ点が多々あると思われます。予めご了承ください。)

ソースコードは[GitHub](https://github.com/yasuo-ozu/sorting-vim)にあります。

# 動作の様子

- bubble sort

![bubble.gif](https://qiita-image-store.s3.amazonaws.com/0/153096/b3c6e262-ab15-9749-f631-41d5a2738c69.gif)

- merge sort

![merge.gif](https://qiita-image-store.s3.amazonaws.com/0/153096/55d94b99-1620-41dc-b4ec-e5061005c07c.gif)

- insert sort

![insert.gif](https://qiita-image-store.s3.amazonaws.com/0/153096/ecfae955-a0d4-ee9a-ce52-fe315c897d87.gif)

- quick sort

![quick.gif](https://qiita-image-store.s3.amazonaws.com/0/153096/165d8d84-3b13-ce2a-5337-55bfc3d42d5c.gif)

# 解説

## 入力データを作る

シェルコマンドでやろうとしたけれどうまく行かなかったので、perlを使ってズルをします。(無駄が多い気がしますが、気にしない。)

```
seq 1 40 | xargs -I{} perl -e 'print int(rand(1000)) . "\t" . "*"x{}; print "\n"'|sort|sed -e 's/^.*\t\(\**\)$/\1/'>input.txt
```

すると以下のようなランダム出力が得られます。

``` [input.txt]
****************
******************
**************************
***************************************
*******************************
*****************
*
( ... 略 ... )
***********
********************************
**************
```

これを、以下のように(行ごとの文字列の長さで)ソートするのがスクリプトの目的です。

``` [output.txt]
*
**
***
****
*****
******
*******
********
*********
**********

( ... 略 ... )

**********************************
***********************************
************************************
*************************************
**************************************
***************************************
****************************************
```

## アニメーションでの表示

このスクリプトでは、行からの読み込み/行への書き込み(マージソートでは行の挿入および削除)を行うたびに行を反転表示させ、10ミリ秒待機することでアニメーション表示を行っています。そのために使っているコードを以下に示します。

```
function! Getval(line)
	call cursor(a:line, 1)
	normal! V
	let val = getline(".")
	redraw
	sleep 10ms
	return val
endfunction
function! Setval(line, val)
	call cursor(a:line, 1)
	normal! V
	call setline(".", a:val)
	redraw
	sleep 10ms
endfunction
```

すなわち、カーソルを移動した後、<S-V>を送信し、`:redraw`を行い、`:sleep 10ms`を行っています。

## 時間計測機能

これはほとんどオマケ機能ですが、一応アルゴリズムの実行時間を計測できます。

以下のように実装されています。

```
let stime = reltime()
call Quicksort(1, line("."))
echomsg reltimestr(reltime(stime))
```

ソート完了後、`:mes`とすると計測した時間を表示できます。

ちなみに、手元の環境では以下のようになりました。(入力データは毎回ランダムに与えています)

| 種類 | 時間[s] |
|:-:|:-:|
| bubble  | 27.260499 |
| merge | 5.799719 |
| insert | 11.273425 |
| quick | 5.781766 |

このプログラムはあくまで観賞用なので、実行時間を測ることにあまり意味を見いだせないのですが、まあ**何か**の役には立つのでしょう。

# さいごに
Vim Script はアルゴリズムを可視化するのにも便利だと思います。
Rubyのmail gemを使う

#はじめに
この記事は、[SLP_KBITその2 Advent Calendar 2016 - Qiita](http://qiita.com/advent-calendar/2016/slp_kbit2)の20日目の記事です。
[SLP_KBIT Advent Calendar 2016 - Qiita](http://qiita.com/advent-calendar/2016/slp_kbit)の21日目にも、なんかしら記事を書く予定ですので良かったらそちらも読んでくださいな。頑張ってネタ作ります。(当日中に出せばきっと遅刻じゃないよね！)

それじゃそろそろ本題へいきますか。

最近諸事情ありまして、RubyでGmailのメアドからメールを送りたいなぁってなりました。いろいろ調べてやってみたのでそれを書きたいなぁと思います。
というわけで、以下Gmailを例にして書いていきます。
一応送信できることは確認していますが、間違えてることがあったら教えてください！

#mail gem
Rubyの***mail***というgemを使ってメールを送ることができるみたいです。
GmailのAPIを使うことも考えましたが、~~なんかむずそう~~サクッと送信だけしたかったのでmail gemを使うことにしました。

`$ gem install mail`
これでインストールできます。

#メールを作る
メールを作ります。

~~~ruby:mail.rb
require 'mail'
mail = Mail.new do
    from     '送信元メールアドレス'
    to       '送信先メールアドレス'
    subject  '件名'
    body     '本文'
end
~~~

#メールの送信情報
メールの送信情報を決めます。


~~~ruby:mail.rb
options = { :address               => 'smtp.gmail.com',
            :port                  => 587,
            :domain                => 'gmail.com',
            :user_name             => '送信元メールアドレス',
            :password              => 'パスワード',
            :authentication        => :plain,
            :enable_starttls_auto  => true  }
~~~

#メールの送信
メールの送信をします。

~~~ruby:mail.rb
mail.charset = 'utf-8'
mail.delivery_method(:smtp, options)
mail.deliver
~~~

#実行
プログラムを実行します。
`$ ruby mail.rb`
メールが送信されると思います。

#Gmailの場合
Gmailを用いる場合、初めて送信しようとした時に、安全性の低いアプリからのアクセスを有効にしないといけません。送信元のメールアドレス対して
「ブロックされたログインについてご確認ください」
という件名のメールが届きます。
本文中のリンクからアクセスを許可することで、晴れてメールを送ることができるようになります。

#最後に
今回はmail gemを使ってメールを送る方法について簡単に書きました。
ただ、Gmailに関しては、可能であればAPIを使用した方が良いかと思います。
安全性の低いアプリからのアクセスを有効にしないといけないですし、ラベルや下書きの作成、修正、削除など、送受信以外のこともできるようです。
Taskutterをつくりました。

この記事は[Hamee Advent Calendar 2016](http://qiita.com/advent-calendar/2016/hamee)の20日目の記事です。

こんにちわ。
開発部の@yaginuuuです。
ネタがなかったので、Chrome拡張を作ってみました。

# 背景
弊社では日々ChatWorkでコミュニケーションをとっています。
そして、作業を依頼するときや忘れてはいけない作業や情報をとどめて置くためにタスク機能つかっています。

しかし、社内全体チャットルームや部内全体チャットルームなどでは自分のタスクを気軽に作成しようと思っても、
タイムラインが汚れるのでなかなかできません。(タスク化してメッセージ削除してっていうのもちょっと...)

# 目的
タイムラインを汚さず、人に迷惑をかけず、タスク化してスマートなタスク管理を実現

# 手段
タイムラインのメッセージを選択して、選択部分をマイチャットのタスクに貼り付ける

# つくったもの
[Taskutter](https://chrome.google.com/webstore/detail/taskutter/cahkjpfeopdclfcbnblnifinpmodcbdh?utm_source=chrome-ntp-icon) (Task + Cutterの意です)

# 使い方
1. Taskutterのアプリアイコンをクリックして、ChatWorkのマイチャットIDを入力
![image](https://qiita-image-store.s3.amazonaws.com/0/30891/5006e2cb-8dc8-6373-3ab7-a732e8717086.png)

1. タスク化したいメッセージを選択
![image](https://qiita-image-store.s3.amazonaws.com/0/30891/5891906f-6c79-7a44-0250-551d27d957f1.png)

1. 「マイチャットにタスク化」をクリック
  - マイチャットに遷移し、タスク欄には選択した文字列が挿入される

# 所感
Chrome拡張を初めて作りましたが、簡単に実装・テストできて楽しかったです。
今回作った拡張は日々の作業でとても使いそうなので、今後アップデートしていきたいと思います。

# REF
[アドカレのChrome拡張を10分で作って公開する](http://qiita.com/yamamoto_hiroya/items/8ec3db3c47a03911aa7f)

アドベントカレンダーも残す所あと5日ですね！
明日は[junya108](http://qiita.com/junya108)さんです！
Redmine(ニコカレ)を使ったプロジェクトメンバの体調管理

[SRA Advent Calendar 2016](http://qiita.com/advent-calendar/2016/sra)の20日目です。
関西事業部のなんぶです。

私事ですが、先日(12/19)に40歳になりました。
私を知っている方には、
「まだ40歳になってなかったの？」
とびっくりされる方もいるかと思いますが、ようやく40歳になりました。
昔からフケ顔ですが、少しずつ顔年齢と実年齢が近づいてきた今日この頃です。

さて、今回は私が所属しているプロジェクトでの取り組みを紹介したいと思います。

私はある組込み系の開発プロジェクトにリーダーとして参画しているのですが、
ある日、メンバーが体調不良で休んだので、お客様に「XXが体調不良で1日休みます」と勤怠連絡をしました。
するとお客様から、
「XXさん、先月も月曜日に休みましたよね？体調管理出来ているのですか？」
と言われました。

今思えば、別に会社として体調管理に取り組めだとか言われてなかったと思うのですが、当時の私は会社としてメンバーの体調管理をしてと言われたと勘違いしました。

さぁ、大変です。
全員で寮生活を始めるだとか、いろいろ考えましたがいいアイデアは浮かびませんでした。しかし、その時たまたま読んでいたSCRUMの本に「ニコニコカレンダー」について書いてあり、それを参考に、体調管理の方法を思いつきました。

ニコニコカレンダーは通常、1日の終わりに各メンバが自分の気持ち(笑顔、普通、泣き顔)を登録し、翌朝の朝礼などで、泣き顔メンバへのヒアリングを実施するなど、メンバーの気持ちの見える化を目的に使用するのが一般的だとは思うのですが、
私のプロジェクトでは、コレを体調でやってみました。

ルールは以下です。
**■ルール**
1.毎朝出社時に、出社時点での体調を登録する

| 表情 | 意味 |
|:--|:--|
| 笑顔 | 通常  |
| 普通 | 仕事に支障はないが、少し調子が悪い  |
| 泣き顔  | 無理している |

2.笑顔以外を登録した場合は、コメントを入力する

たったこれだけです。結果はこんな感じです。
**■結果**
![図1.png](https://qiita-image-store.s3.amazonaws.com/0/154223/2bf5adfa-a1e3-b532-b516-6ca6768bcd5f.png)

コメント入力がめんどくさくて、もっと笑顔だらけになるかと思っていましたが、意外にみんなまじめに入力してくれました。

**■わかったこと**
**・泣き顔メンバーに対し、周りのメンバーが話しかけるなど、コミュニケーションが増えた**
・月曜日に体調不良者が多い
・全員体調がいい日がない
・お腹が弱いメンバーが多い(コメントから)

とメンバーの体調を把握することが出来ました。
体調管理とは少し違う気もしますが、みんなが声を掛けたり、心配し合っているところを見ると一定の効果はあったのではと考えています。
導入から2年半たった今も継続しており、メンバーの体調把握に役立っています。
ループ以外の文にラベルは付けられるか？

## 問題

Javaにおける**ラベル**は通常、ループ文（do文、for文、while文）に付けられる。

```java
LOOP1:for (String str1 : list1) { // ラベルを付けたfor文
    for (String str2 : list2) {
        if (str1.equals(str2)) {
            found(str1);
            break LOOP1; // 外側のforから抜ける
        }
    }
}
```

それでは、ループ文**以外**の文にラベルを付けることはできるか？

 1. ループ文以外の文にラベルを付けることはできない（コンパイルエラーになる）。
 2. ループ文以外の文にラベルを付けられる場合もあるが、そのラベルを参照する文が書けないので結局無意味である。
 3. ループ文以外の文にラベルを付けられる場合があり、かつ、そのラベルを参照する文が書ける場合もある。

![jaba-2.png](https://qiita-image-store.s3.amazonaws.com/0/14550/db7a2863-20a6-17e8-3a2c-7762c326f822.png)

## 正解

**3． ループ文以外の文にラベルを付けられる場合があり、かつ、そのラベルを参照する文が書ける場合もある。**

## 解説

Javaのほとんどの文にはラベルを付けられる。

```java
// ラベル付式文!
FOO: a = 42; // OK
// ラベル付if文!
BAR: if (a > 0) b = 1;
else b = -1; // OK
```

※ただし変数宣言文などラベルが付けられない文もある[^statement-1]。

[^statement-1]: Java言語仕様にある形式定義において、“Statement”に相当する文にラベルが付けられる。局所変数宣言文（“LocalVariableDeclarationStatement”）は“Statement”の一種ではない。

```java:コンパイルエラー
// ラベル付変数宣言文??
FOO: int a = 42; // NG!
```

そして、ブロック文およびブロック文を従属させた制御文（ループに限らず、if文やtry文等も含む）にラベル（例えば `LABEL:`）が付けられた場合、そのブロックの中で `break LABEL;` を実行することで `LABEL:` を付けた文から脱出することができる。

```java
FOO: if (val > 1000) { // ラベル付if文!
    big = true;
    if (val % 2 == 0) break FOO; // ブロックを抜ける
    bigOdd = true;
}
```

例えば、関数の中の特定の領域に対して“早期脱出”をしたい、という場面で活用できるだろう。

```java
BLOCK:{ // 素のブロック
    Foo foo1 = stor.findFoo(fooName1);
    if (foo1 == null)
        break BLOCK; // ブロックを抜ける
    Foo foo2 = stor.findFoo(fooName2);
    if (foo2 == null)
        break BLOCK; // ブロックを抜ける

    foo2.setBar(foo1.getBar());
    // 以降処理が延々と続く...
}
```

## 補足

  * ラベル無しのbreak文の対象になるのはループ文とswitch文に限られる。
  * continue文の対象になるのは、ラベルの有無に関わらず、ループ文に限られる。

## 蛇足

実は、ブロックのない文に付けたラベルであっても、それを参照するbreak文は書ける、らしい。

```java
FOO: break FOO; // OK!!!!
```

まあ、全く有用性はないのだが……。
[Qiita改善案 AdventCalendar]見出し3以降のスタイルがイマイチ

見出し3以降のスタイルが本文のスタイルとほとんど変わらないので
太字にする、下線を入れるなどして見出しらしいスタイルにして欲しいです。

↓現在の見出しのスタイル

![](https://i.gyazo.com/7c0f29d0a134fe9554faafff9c18b081.png)
Groovyで非整数刻みの数列を作る

需要が無いのか、整数刻み以外の方法が検索で出てこなかったのでまとめておく。

# TD;DR

例えば、0.5刻みで0から5までの数値の配列を得る方法。

# こうする

```groovy
def a = []

0.step(5.1, 0.5) { a << it }

println a
```

```shell-session:output
[0, 0.5, 1.0, 1.5, 2.0, 2.5, 3.0, 3.5, 4.0, 4.5, 5.0]
```

# ポイント

* Groovy-jdk Numberクラスの<a href="http://docs.groovy-lang.org/latest/html/groovy-jdk/java/lang/Number.html#step(java.lang.Number, java.lang.Number, groovy.lang.Closure)">stepメソッドを使う</a>
* 終端の値を欲しい値よりも少し大きめに取る
* 終端の値、刻みともに数値型ならばなんでもOK

## stepメソッド

* 第一引数が終端(ただしこの値を**含まない**半開区間)
* 第二引数が刻み(数値型全て使える)


# こんなこともできる

```groovy
def b = []

0.step(-5.1, -0.5) { b << it }

println b
```

```shell-session:output
[0, -0.5, -1.0, -1.5, -2.0, -2.5, -3.0, -3.5, -4.0, -4.5, -5.0]
```

# thanks for

GroovyのRangeメモ http://qiita.com/saba1024/items/75f507b0de843255d2fa