OmniAICreator/Qiita-1.07M huggingface dataset:
Android 画面回転時にActivityを再起動させない方法

# Android 画面回転時にActivityを再起動させない方法
最近記事を書いていなかったので、自分のメモブログから一本投稿。古いネタですけど。

## Androidは画面を回転させるとActivityを再描画する

Androidは画面を回転させた際に画面の再描画が走ります。
Activityが再起動するわけなのですが、ダイアログなどを出してる途中でActivityの再起動が走ると**Window leek Exceptionが起こってしまい、アプリがクラッシュしてしまいます。**

この画面回転時のActivityの再起動を防ぐ方法があります。

## Activityの再描画を防ぐ方法

AndroidManifest.xmlで画面の再描画をさせたくないActivityに対して以下を加えます。

```xml
<activity
            android:name=".MainActivity"
            android:label="@string/app_name"
            android:uiOptions="splitActionBarWhenNarrow"
            android:configChanges="orientation|screenSize"><!--←コレ-->
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
```

これを書くことによって
onDestroy→onCreateの代わりに、
Activity#onConfigurationChanged() が呼ばれるようになります。

画面回転時に何か処理をさせたい場合はここにその処理を書くようです。

```java

@Override
public void onConfigurationChanged(Configuration newConfig) {
   super.onConfigurationChanged(newConfig);
   Log.d("TEST", "onConfigrationChanged()");
}
```

画面の再描画を防ぐだけなら↑は必要ないです。
### 引用元
[Android 画面回転時にActivityを再起動させない方法](https://wandering-engineer.tech/android-%E7%94%BB%E9%9D%A2%E5%9B%9E%E8%BB%A2%E6%99%82%E3%81%ABactivity%E3%82%92%E5%86%8D%E8%B5%B7%E5%8B%95%E3%81%95%E3%81%9B%E3%81%AA%E3%81%84%E6%96%B9%E6%B3%95)
127という数字について

この記事は、AdventCalendarの12月7日の記事です。

唐突ですが、「すべてがFになる」という小説をご存知でしょうか。
森博嗣さんのデビュー作の推理小説です。
ファンは理系の方が多いでしょう。
その小説内に65535(16進表記でFFFF)を使用したトリックが使われています。

それをふまえて、127が何かっていうと、察しの良い方はお分かりだと思いますが、「すべてが1になる」ができるんです。

2進数についての説明は省きますが、2進数での表記は以下のようになります。

2進数 : 10進数
00000001 : 1
00000010 : 2
00000011 : 3
00000100 : 4
00000101 : 5
00000110 : 6
00000111 : 7
00001000 : 8
　|
00010000 : 16
　|
00100000 : 32
　|
01000000 : 64
　|
10000000 :128


では、127がどういった値かというと、"1111111"と表されるです。

スケジュールカレンダーの中に「すべてが1になる」という一文を書いて、自作したシステムにタイムカウンターを付けて、稼働し始めたときからカウントダウンが始まり、2進法で使用可能な7乗の最大値128より1つ小さい数で10進法で表した時の単精度型整数の最大値127[^1]、これを2進法に変換した時の値1111111になるまでカウントされ、すべて桁が1になると何か起こるイベントを作れば、これであなたも真賀田四季だ。

[^1]: タイムカウンターの単位は、秒である必要はないと思うので、日、時間にすれば、現実的だと思う。

明日は、弊社のシリ・ティー・オー[肥後](http://adish-hr.hatenablog.com/entry/2016/04/29/1529049)さんです。
コンソールで動くエディタを作る(7日目) マルチバイト文字にハマる

本稿は[自作エディタをつくる Advent Calendar 2016](http://qiita.com/advent-calendar/2016/make_editor)の7日目です、レポジトリは[こちら](https://github.com/tinyco/tiny_code_editor)

このアドベントカレンダーは、コンソール上で動くエディタを25日間で1から自作することを目標としています。

# 文字列の持ち方を変える

```string_type.c
typedef struct _line {
	int byte_count;//実際にstringに入ってる文字のバイト数
	char string[BUFFER_SIZE];
	struct _line *next;
} line;

typedef struct _text {
	line* line;
	struct _text *prev;
	struct _text *next;
} text;
```

改行するまでをline(単方向リスト)として、そのlineを双方向リストにつないだものをtextとします。
意図として、カーソル移動するたびに改行位置を探すのは、後で実装するときに困りそうだという点と、
1行に最大でもxx文字しかこない、という閾値を見積れなかった点を考慮しました。
合わせて、ファイルからリードするところも変更します。

```mbchar.c
typedef char* mbchar;//PUBLIC

mbchar mbchar_malloc(void)//PUBLIC;
{
  return malloc(sizeof(char) * MB_CUR_MAX);
}

void mbchar_free(mbchar mbchar)//PUBLIC;
{
  return free(mbchar);
}

mbchar mbcher_zero_clear(mbchar mbchar)//PUBLIC;
{
  int i = MB_CUR_MAX;
  while(i--)
  {
    mbchar[i] = '\0';
  }
  return mbchar;
}

int mbchar_size(mbchar mbchar)//PUBLIC;
{
  return mblen(mbchar, MB_CUR_MAX);
}

int isLineBreak(mbchar mbchar)//PUBLIC;
{
  return (mbchar[0] == '\n' ? 1 : 0);
}
```

```file_read.c
text* file_read(char* filepath)//PUBLIC;
{
	FILE *fp;
	if((fp = fopen(filepath, "r")) == NULL)
	{
    printf("[error]can't open file\n");
    exit(EXIT_FAILURE);
	}

	text* head = text_malloc();

	text* current_text = head;
	line* current_line = head->line;

	mbchar buf = mbchar_malloc();
	char c;
	mbcher_zero_clear(buf);
	int len = 0;
	while(1)
	{
		c = (char)fgetc(fp);
		if (feof(fp))	break;
		buf[len] = c;
		if(mbchar_size(buf) > 0) {
			line_add_char(current_line, buf);
			if(isLineBreak(buf)) {
				current_text = text_insert(current_text);
				current_line = current_text->line;
			}
			mbcher_zero_clear(buf);
			len = 0;
		} else if (mbchar_size(buf) <= 0) {
			len++;
		}
	}

	mbchar_free(buf);
	fclose(fp);
	return head;
}
```

これで、マルチバイト文字がリストの途中で分断されないようにリストに分割される・・・はず。
と思ったのですが、分断されてしまいました。

<img width="441" alt="スクリーンショット 2016-12-07 7.07.41.png" src="https://qiita-image-store.s3.amazonaws.com/0/151926/96e99365-f1d5-a980-db5f-453686ba798b.png">

悲しい・・・。ただ、データの持ち方は上手く変更されてそうですね。

# 原因を調べる

「私」の文字を対象にprintfデバッグをしていきます。
ネットで調べると、私はE7・A7・81の3バイト文字のようです。

MB_CUR_MAXを出力すると、どうやら1になってしまっているらしい。
`setlocale( LC_CTYPE， 'jpn' );`
を追加しても1のままです。

そのため、mblenで長さを正しく取ることができず、1バイトの長さと扱われて、
mbcharに格納されるときにE7・A7・81の3文字として扱われてしまっているようです。

ハマったところとしては
`printf("[%x]\n",mbchar[0]/*私*/);` -> [ffffffe7]
`printf("[%d]\n",mbchar[0]/*私*/);` -> [-25]
が出力されるため、頭の中で上手く`E7`と結びつけられず、余計なバイト(私の前に入ってる文字？)が
入っていると疑ってしまって時間がかかりました。

printfのときは0埋めされないんですね。ただ、
`printf("[%d]\n",mbchar[0] == (char)0xe7 ? 1 : 0);` -> [1] 
をみると、正しく`E7`が入っているとわかります。

# 今日のまとめ

- カーソル移動に備えて、文字列を2次元リストとして持つことにした
  - あわせてファイル読み込み部分も実装

- カーソル移動に備えて文字のバイト数を取得しようとしたが上手くいかなかった

明日は、[ここ](http://qiita.com/masakielastic/items/abf8e54344034f9b089c)を参考に、mblenを使わずに
「後続文字があるかどうかわかる」「後続文字がないときに、何バイトの文字かわかる」関数を自作してmblenと差し替えていきます。
それが済んだら、カーソル移動まで進めるようになるはず٩(๑òωó๑)۶
numpy > 2次元配列から値を取得 > iterator / index

```txt:動作環境
GeForce GTX 1070 (8GB)
ASRock Z170M Pro4S [Intel Z170chipset]
Ubuntu 14.04 LTS desktop amd64
TensorFlow v0.11
cuDNN v5.1 for Linux
CUDA v8.0
Python 2.7.6
IPython 5.1.0 -- An enhanced Interactive Python.
```

二次元配列から要素を取り出してみる。

```list_print.py
import numpy as np

array2d = np.array([[1,2],[3,4],[5,6]])
print (array2d.shape)

print ("---iterator---")
for aline in array2d:
	for elem in aline:
		print (elem)

print ("---index---")
print array2d[1,0]
```

```txt:結果
$ python list_print.py
(3, 2)
---iterator---
1
2
3
4
5
6
---index---
3
```

sine curveの学習結果を使う時はiteratorとindexを使うことになりそう。
技術英語 > Note that [the converse] of this example presents a similar problem. / converseとopposite

@ Code Complete (18280 / 36077)

> Note that **<font color=red>the converse</font>** of this example presents a similar problem.

https://www.merriam-webster.com/dictionary/converse
> :  something reversed in order, relation, or action: as

<hr>
oppositeとの違いは何か気になった。

https://www.quora.com/Debate-What-is-the-difference-between-inverse-converse-opposite-etc

> Sreeram Ramasubramanian
Written Mar 10, 2014
>
The words **inverse, converse, contrapositive** and so on are used only for Conditional statements and are pretty rigorously defined in Mathematics. Whereas words like **'opposite', 'reverse'** etc. are generally used more flippantly in regular parlance to mean different things in different situations. 

意訳「数学で厳密に条件記述の時に使われるのが inverse, converse, contrapositiveなど」

意訳「opposite, reverseはより一般的な用語として異なる状況で異なる物を意味するときに使う」
Amazon Dash Button でSlackにリセットボタンを設置する

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

昨日は [JohnEstropia](http://qiita.com/JohnEstropia) さんの [Slack×Swift×Fastlane：iOSアプリ配信ボット](http://qiita.com/JohnEstropia/items/8883984f4e1047c978b9) でした。

別の記事を書こうと思ったのですが、Amazonから[Dash Button](https://www.amazon.co.jp/b?ie=UTF8&node=4752863051)が届いてしまったのでこれをいじります。


![IMG_2199.JPG](https://qiita-image-store.s3.amazonaws.com/0/50056/b3ecbfc4-01ba-729f-193c-8adf18df689b.jpeg)



普通にアリエールを注文しようと思ったんですが、いじってる方の記事を見て面白そうだったので。

- [Amazon Dash ButtonをただのIoTボタンとして使う](http://qiita.com/jsoizo/items/3b8bba4160f41aef20f4)

# Slackのチャンネルをキレイにしたい
botが暴れて通知が溜まったときなど、なんとなく画面を一旦まっさらにしたくなる時があります。
![reset.gif](https://qiita-image-store.s3.amazonaws.com/0/50056/2a454424-2922-acdc-5f0e-10878ff4cf91.gif)


現状はhubotで `clear` コマンドを実装して使用しています。
MacやLinux等のターミナルで `clear` コマンドを叩くとコマンドや標準出力の履歴を消し去ってくれますが、アレのSlack版ですね。

今回はこれを物理ボタンで実現してみようと思います。

# 作り方
さて、見た目はちょっとインパクトあるこの機能ですが実装は簡単です。
単純にSlackのIncoming Webhookに大量の改行を投げるだけです。

先程のエントリでそこまでのやり方は書かれていたので、ここでは差分のdasherのconfigファイルのみ記載します。


```json:config/config.json
{"buttons":[
  {
    "name": "clear",
    "address": "12:34:56:78:9a:bc",
    "url": "https://hooks.slack.com/services/xxxxx/xxxxxx/xxxxxxxxxxxxxx",
    "method": "POST",
    "json": true,
    "body": {"text": "リセットします。\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n *リセットしました。* "}
  }
]}

```

改行コードの前後にわざわざ文字列を追加しているのは、Slackの仕様で改行コードだけだと一行しか表示されないからです。
うん、 **これはひどい。**

動いている様子(YouTube)。
[![](http://img.youtube.com/vi/Uu6OLG7EOns/0.jpg)](http://www.youtube.com/watch?v=Uu6OLG7EOns)

さくっと作れすぎて書くことが他にないですが、以上。

# 触って感じたこと
- やはり物理ボタンは面白い
    - 物理ボタンにフィードバックがあるのはただそれだけで楽しい
- リアルタイムな反応が求められる用途には厳しい
    - 今回のリセットボタンはタイムラグがあるので **気持ちよさ** は無い
        - 元が発注用途だから当然か
        - 家庭内の電気を付ける、とかの用途にもちょっとストレスかも
    - とはいえ用途は無数にありそう
        - 開発周りで言えばデプロイボタン等そもそもの処理にある程度時間がかかるものならタイムラグは気にならないかも

# 備考
- 余談だが、Unix系ターミナルでの `clear` はWindowsのコマンドプロンプトでは `cls` 。2文字少ない。
    - 数少ないコマンドプロンプトの良いところ
- リセットボタンというよりはclearボタンだ
- 予告していた記事とまったく別のものになってしまった
    - しかも内容の薄い記事になってしまい猛省である
- 初Qiita
CapSense基板を自作して嫁を触ろう

# はじめに
[KUTアドベントカレンダー](http://www.adventar.org/calendars/1872)7日目担当のringoです。
普段は音ゲーしてるかFPGA触ってます。最近はTensorFlowが熱い！
今回は夏休みに製作したことりちゃん基板とPSoCのCapSense(静電容量センサー)の紹介をしたいと思います。
今回は画像の編集→KiCadに取り込み→感光で基板作製→PSoCで動かす
といった手順で実装しました。

# PSoCのCapSenseについて
* CY8CKIT-042 PSoC® 4 Pioneer Kit  
[![PsoC4](https://cloud.githubusercontent.com/assets/9606695/20935364/c1047e32-bc21-11e6-8ccc-96087087df36.png)](http://japan.cypress.com/documentation/development-kitsboards/cy8ckit-042-psoc-4-pioneer-kit)  
今回はPSoC4のPioneerKitを使って作製した痛CapSense基板を動かします。  
なぜPSoCかというと自分がよく使っているからというのもあるけど、CapSenseのモジュールが用意されていて使いやすいからが一番の理由だと思います。  
PSoCのCapSenseはiPodのクルクルホイールにも採用されています。  
今回はスライダーですが指の静電容量に反応させるという点では同じ仕組みです。  
ここらへのことは[Cypressのデザインガイド](http://japan.cypress.com/documentation/application-notes/an64846-getting-started-capsense)に詳しく乗ってるので興味のある方は読んでみてください。

# 画像の準備
まず素材となる画像を適当な画像編集ソフトで2値化します。  
![kotori_binary.png](https://qiita-image-store.s3.amazonaws.com/0/147601/dafa47bc-af48-c7b1-8296-f2829021b457.png)
ここにスライダーを書き込んで画像データして保存  
![kotori_slider.png](https://qiita-image-store.s3.amazonaws.com/0/147601/817da6b4-cdfd-c76a-3b32-619bfc65af88.png)

今回はGIMPで編集しました。腕の部分が切れているのは配線を出すためですが、両面基板にしてビアを作るほうがきれいに見えると思います。

# KiCadに取り込む
KiCadには標準でビットマップからコンポーネントへの変換機能が搭載されているので今回はこれを使います。サイズの決定が面倒だった記憶があるけど、そこは生成されたフットプリントとにらめっこしながら設定した気がする。
フットプリントが生成されたら適当なライブラリのディレクトリに追加して、プリント基板エディタを開いてフットプリントの追加から追加します。
![kicad.png](https://qiita-image-store.s3.amazonaws.com/0/147601/d2785e9f-ed9c-c8b3-2546-e6d32bcffc00.png)
こんな感じで配線を伸ばしてピンに接続すればパターンは完成！

![kotori_capsense](https://cloud.githubusercontent.com/assets/9606695/20936868/a5c58c32-bc27-11e6-8b3a-1dad307b6d01.jpg)
感光してエッチングしたものがこれ
思ったよりきれいにエッチングできたのでよかった
少しショートしてしまったのでパターンをカットしている

# PSoCで動かす
Slider Designのサンプルを参考にプロジェクトを作ります。
![psoccapsense](https://cloud.githubusercontent.com/assets/9606695/20939613/d575c09a-bc32-11e6-9883-bb6e4d27da5f.png)
CapSenseのモジュールの設定を開くとスライダーの他にもボタンやタッチパッドも使えますが今回はスライダーを使います。
モジュールを追加したらピン配置を決めてプログラムへ。
プログラムと言っても実質20～30行ぐらいで使い方は

```
CapSense_CSD_Start();
CapSense_CSD_InitializeAllBaselines();
```

でモジュールを初期化して

```CapSense_CSD_UpdateEnabledBaselines();
CapSense_CSD_ScanEnabledWidgets();
while(CapSense_CSD_IsBusy() != 0);    
Pos = CapSense_CSD_GetCentroidPos(CapSense_CSD_LINEARSLIDER0__LS);
```
で値を取得しています。

# 完成！
<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">動いてるところ、マイコンはPSoC4のボードを使ってます<a href="https://twitter.com/hashtag/%E5%8D%97%E3%81%93%E3%81%A8%E3%82%8A%E7%94%9F%E8%AA%95%E7%A5%AD?src=hash">#南ことり生誕祭</a> <a href="https://t.co/eHGfbGoeRf">pic.twitter.com/eHGfbGoeRf</a></p>&mdash; ringo+1/2 (@Malus_Mill_ ) <a href="https://twitter.com/blackapple626/status/775722238100115456">2016年9月13日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>
スライダーの値をUARTでPCの画面上に表示するプログラムを作製しました。よく見るとボード上のフルカラーLEDの色も変わっているのがわかります。


# まとめ
* PSoCはいいゾ～
* ことりちゃんかわいい

今回はCapSense基板の自作とPSoCでの実装について書きました。
元ネタは[はやしよのすけさん](http://ameblo.jp/aretaumitohirunosunahama/entry-12189720221.html)にC90でお会いして製作意欲を刺激されたからというのと、自分の好きなキャラで何か作りたかったってところが始まりだったので、今回アドベントカレンダーでかけて良かったです。
次はTensorFlowで書けたらいいな～と思う
hubotでAdventarから記事を取得しSlackに表示する

アドベントカレンダーの季節ですね。
わたしたちの研究室でも、Adventarで絶賛アドベントカレンダー中です。

- [Adventar](http://www.adventar.org/)

さて、チャットツールにSlackを活用しているのですが、アドベントカレンダーの情報がSlackに流れれば便利ですね。

![スクリーンショット 2016-12-07 04.08.58.png](https://qiita-image-store.s3.amazonaws.com/0/15319/1b170476-3e83-e60e-3bf4-ac76afc38ca0.png)


cronで更新があるか回せばいいんですが、手動でチェックするのも侘び寂びがあるので今回はその方法を紹介します。

![スクリーンショット 2016-12-07 04.08.08.png](https://qiita-image-store.s3.amazonaws.com/0/15319/14fa1660-f903-64ee-1ff4-d63c82c6b5e9.png)



## hubotスクリプト
Adventarからデータを取得するためのパッケージがあるので、これを使います。

[akameco/adventar: Retrieve articles from adventar](https://github.com/akameco/adventar)

### インストール

```
$ npm install --save adventar
```

### 使い方

リンクかアドベントカレンダーのidを引数にとり、`{date: ?string, user: ?string, title: ?string, url: ?string}`のオブジェクト25個の配列を返します。

```js
adventar('1536').then(res => {
  const {date, user, title, url} = res[2];
  console.log(`今日(${date})は${user}さんの「${title}」です\n${url}`);
});
// => 今日(12/03)はatsuo1203さんの「岩井研残留日誌 - あつおの日常~あつおと過ごした365日~」です
// => http://atsuocps.hatenablog.com/entry/zanryuDiary
```

### hubot
もちろんCoffeeScriptを使ってる人はもういないので、JavaScriptでbotのコードを書きます。
`scripts`以下に任意の名前で配置すれば動きます。

```js
'use strict';
const adventar = require('adventar');

const id = '1536';

module.exports = robot => {
	robot.hear(/今日のアドベントカレンダー/, msg => {
		const d = (new Date()).getDate();
		adventar(id).then(res => {
			const {user, url} = res[d - 1];
			const mes = url ? url : `まだ記事がないようです担当は${user}です`;
			msg.send(mes);
		});
	});
};
```


以上です。
みなさまのアドベントカレンダーが完走できることを願っています。
Emacsバッファ内のRustコードを手軽に実行する

[シュッと実行する](http://qiita.com/woxtu/items/ab8be6a93237346e8aff)という記事を読んで、掲題のようなことをやりたかったことを思い出し、`cargo-script`のインストールを試してみたところ、手元のWindows環境だとgccがないために失敗してしまったので、代替物を作ってみた、という話。

まあ、これだけであればgccをインストールすれば良いだけなのですが、自分の要件的にはcargo-scriptほど本格的なものは必要なく、逆により手軽な記述ができた方が嬉しかった、というのも作った理由(後付け)の一つ。

作成物は[evalrs](https://github.com/sile/evalrs)。コード行数的には100行くらいの短いもの。

以降は使い方などの簡単な説明。

インストール
-----------

コマンドのインストールは`cargo`を使えばOK:

```bash
$ cargo install evalrs
````

使い方
------

コマンドとしては標準入力から受け取ったRustコードを評価・実装するだけの単機能なもの:

```bash
$ echo 'println!("Hello World!")' | evalrs
   Compiling evalrs_temp v0.0.0 (file:///tmp/evalrs_temp.zseDeaC77GHQ)
    Finished debug [unoptimized + debuginfo] target(s) in 0.22 secs
     Running `target\debug\evalrs_temp.exe`
Hello World!
```

`extern crate ${CRATE}`がコード中に含まれる場合には`${CRATE}`の最新バージョン("*")を使用して実行される:

```bash
$ echo 'extern crate num_cpus; println!("{} logical CPUs", num_cpus::get())' | evalrs
    Updating registry `https://github.com/rust-lang/crates.io-index`
 Downloading num_cpus v1.2.0
 Downloading libc v0.2.18
   Compiling libc v0.2.18
   Compiling num_cpus v1.2.0
   Compiling evalrs_temp v0.0.0 (file:///tmp/evalrs_temp.4alAAhU4VF8J)
    Finished debug [unoptimized + debuginfo] target(s) in 0.57 secs
     Running `target\debug\evalrs_temp.exe`
4 logical CPUs
```

一度取得およびビルドされたcrateは`std::env::temp_dir().join("evalrs_cache/")`以下に保存され、次回以降はそれが再利用される (正確にはダウンロードのキャッシュは`cargo`の標準機能に含まれているので、`evalrs`が行っているのはビルド物のキャッシュのみ):

```bash
$ echo 'extern crate num_cpus; println!("{} logical CPUs", num_cpus::get())' | evalrs
    Updating registry `https://github.com/rust-lang/crates.io-index`
   Compiling evalrs_temp v0.0.0 (file:///tmp/evalrs_temp.R9D7QQUinyBM)
    Finished debug [unoptimized + debuginfo] target(s) in 0.23 secs
     Running `target\debug\evalrs_temp.exe`
4 logical CPUs
```

Emacsから使う
-------------

[quickrun](https://github.com/syohex/emacs-quickrun)パッケージを使う場合の方法の紹介。
まず上のリンク先のドキュメントに従って、Emacsにインストールしておく。

その後、(例えば)以下の設定を`.emacs`ファイルに追加し`evalrs`コマンドがquickrun経由で実行可能なようにする:

```lisp:.emacs
(quickrun-add-command
 "evalrs"
 '((:command . "evalrs")
   (:exec . ("cat %s | %c %a")))
 :default "evalrs")

; ビルド or 実行に時間が掛かる(10秒以上)場合は、以下の行をコメントアウトしてタイムアウト時間を延ばす
; (setq-default quickrun-timeout-seconds 180)
```

これで準備は整ったので、後は適当なEmacsバッファにRustのコードを入力し、quickrunを叩けばOK:

```rust:*rust-eval-buffer*
fn fib (n: usize) -> usize {
    if n < 2 {
        n
    } else {
        fib(n - 1) + fib(n - 2)
    }
}

println!("fib(10) = {}", fib(10));

// 以下を実行:
//     M-x quickrun RET evalrs RET
//
// 出力結果:
//   Compiling evalrs_temp v0.0.0 (file:///tmp/evalrs_temp.PCwV9N95yi5o)
//    Finished debug [unoptimized + debuginfo] target(s) in 0.26 secs
//     Running `target\debug\evalrs_temp.exe`
// fib(10) = 55
```

---

現状はかなり限られた機能しかないですが、とりあえずこれでEmacs上から手軽にcrateや関数の挙動が試せるようになったので、結構満足しています。

追記: 2016-12-07
================

quickrunの実行を以下のようにキーボードショートカットに登録したら、だいぶ利便性が上がりました。
(ついでにrustfmtも合わせて適用)

```lisp
(global-set-key
 (kbd "C-c C-c C-q")
 '(lambda ()
    (interactive)
    (rust-format-buffer)
    (quickrun :source
              '((:command . "evalrs")
                (:exec . ("cat %s | %c %a"))))))
```
GitHubで自動生成コードをDiffに表示しない方法

## 結論

ここに書いてある

https://github.com/github/linguist/blob/master/lib/linguist/generated.rb

## 注意事項

だいぶ懐かしい記事ですが…突然、「Diffに表示しないなんてGitHubの価値を損なうものだから記事を非公開にするべきだ」というご指摘をいただいたので、念のため追記。

Diffに表示しない、ってことは当然PRにも見えません。
レビューされない怪しいコードが紛れ込むリスクを抱えることになります。
せいぜい自動生成分だけを非表示にして、CIの中で再生成、差分が出ないチェックを入れるなど、ガードの手は考えておいたほうが良いでしょうね。はい。ご利用は計画的に。

## 背景

`mockery`だったり、`swagger-codegen`だったり、`go-bindata`だったり…
GitHub上に自動生成されたコードを載せている場合、PRやcommitの詳細画面でDiffが邪魔になることがあります。

* .gitignoreでそもそも自動生成コードをリポジトリに載せない
* generatedコードに冪等性を持たせてDiffを最小限にする

など対策は色々ありますが、 **どうしても生成分をリポジトリに載せたいがGitHub上ではdiffとして見えなくていい** 場合もあります。

今までさんざん色々探したんですが、いい対策方法が見つからず・・・
ところがどっこい、GitHub公式の方法で実現できたので記事にしてみました。

## GitHubのdiffで特定のファイルを隠す方法

そんなときは、例えばgoの場合はファイルの先頭に

```sample.go
// Code generated by xxx
:
```

と一行コメントしてやるだけで、Diffに表示されなくなります。

https://github.com/kyoh86/qiita/commit/1e151528d570c3613b478245d88aeb168ead2874

![https___qiita_com_items_0d9f70d9970ae086f0ce_·_kyoh86_qiita_1e15152_·_GitHub.png](https://qiita-image-store.s3.amazonaws.com/0/31053/0abacbe8-f551-b148-e7dd-f23e744389b1.png)

## その他の言語でも

色々な言語で対応しているようです。
判定方法はrbのソースを見ればひと通りわかりそう…。

https://github.com/github/linguist/blob/master/lib/linguist/generated.rb

## いつからできたんだろう？

結構探したんですが、GitHubのドキュメントやリリースノートも見つけられてません。
そんなん常識だが、とかここで書かれてたやん、みたいな話があったら教えてくれると嬉しいです。
【ゲリラアドカレ】UE4ゲーム実装　進捗報告 1日目(企画)

【非公式】某会社設立記念ゲリラ Advent Calendar 2016 1日目です。

ゲーム企画～プロジェクト立ち上げまで書きます。
プログラミング的なことを書かないとさすがにQiitaさんに怒られるので、企画の紹介はこの記事だけにします。

#企画

どういうゲームを作りたいか書きます。

ズバリ言います。とあるゲームのイベントを別のゲームエンジンで実装してみるという話です。
オリジナルを作るのは素材作成も含めてあまりにも期間が短いため、イベントを一本のゲームにしてみるという形をとらせていただきました。

さすがに他社のを使うわけにはいかないので、やるのは完全オリジナルＩＰのみです。
ちょっと悩んで、ゲーム化するイベントを決めました。

それは別のチームがやってるラグナブレイク・サーガの

![hunting100_top_logo.png](https://qiita-image-store.s3.amazonaws.com/0/104377/e00e4965-3f0d-aa26-7aa2-3db103632be4.png)

というイベントです。これを一本のゲームとして２５日までに作ります。

ラグナブレイク・サーガがどういうゲームかは[ここから](http://yahoo-mbga.jp/game/12015542/detail)確認してください。

ラグナブレイク・サーガはFlashPlayerで動くソーシャルゲームです。これをUnreal Engine 4で実装します！
つまり、**FlashゲームをUE4で再実装する**というお話です。
たぶん、めったにない話になるとは思います。

ラグナブレイク・サーガはプラットフォームでリリースされているゲームなので、Web接続が必須です。
とはいえ、ここのAPIにイベント期間外、おまけに許可も証明書も無しに接続したら間違いなく自分のクビが飛びます。

なので、このアドカレで実装するHunting101は**「完全オフライン」**です。当然本家のラグナブレイク・サーガのデータ共有もできません。というかしたら殺されます。
また、FlashからUE4に移植するにあたり、スキル演出とかswfを読み込んでいるものは基本的に使えない（色々と大人の事情がありまして……）ので、足りない部分はすべてマーケットプレイスで買ったアセットで補う予定です。

そういうことで、オリジナルのHunting101とはかなり違うゲームになると思います。

#簡単なゲーム仕様

対応プラットフォーム：Windows PC
ゲームエンジン:Unreal Engine 4.14.0
完全オフライン
２Ｄゲーム

#プロジェクト立ち上げ

立ち上げの話を。UE4よちよちレベルです。
アカウント作成済み、ランチャーはインストール済みであると仮定します。

ランチャーを立ち上げたら、左上の黄色いボタンを選びます。エンジンがインストールされてなければ、ここでインストールします。
![2016-12-07.png](https://qiita-image-store.s3.amazonaws.com/0/104377/43e69521-7c64-ed5e-727e-054ab4a8b593.png)

Engineのロードが始まります
![2016-12-07 (1).png](https://qiita-image-store.s3.amazonaws.com/0/104377/dbc71219-6d16-0906-4ab7-65c7ddc0da69.png)

ロードが終わったら新規作成です。空のプロジェクトを選んで名前付けて終わりです。
![2016-12-07 (2).png](https://qiita-image-store.s3.amazonaws.com/0/104377/9cc6e57a-8ca3-bb2f-c5b5-850d88f92358.png)

以上、とても簡単な内容でした。
この記事が書いてるときは自分のＰＣですが、作業はすべて会社のＰＣになります。

#まとめ

というわけで、ここからUE4でゲームを作ります。初日はプログラミングも何も書かなくてすみません。
本当に完成保証もなければ、許可も取ってないのでリリースされる保証も皆無なので、あんまり期待しないでください。
次の日はUE4に素材をインポートするお話です。次も初心者レベルです。
Vertica でパターンマッチングしてみる。

# Vertica とは

高速な分析が可能な列指向DB。

[公式サイト](http://www8.hp.com/us/en/software-solutions/advanced-sql-big-data-analytics/index.html)

最近良く使うので便利だな〜〜〜これいいわ〜〜〜と思ったことを書いていきます。

# やりたいこと

たとえば、
ECサイトでページビュー、コンバージョン（購入完了とか）を何かしらのログに出力していたとして、
そのログデータから、

- コンバージョンしたユーザーのよく通るページビューの経路を抽出する。（例１）
- コンバージョンしていないけど、コンバージョンしたユーザーとよく通るページビューの経路を抽出する。（例２）
- コンバージョンしていないけど、コンバージョンしたユーザーとよく通るページビューの経路を抽出する。（例３）

（例１）
○　コンバージョン←ページA←ページB
○　コンバージョン←ページA←ページB←ページC
×　コンバージョン←ページA←ページD←ページB
　↓
　ページA←ページB の経路がよく通るページビューの経路

（例２）
○　（コンバージョンしてない←）ページA←ページB
○　（コンバージョンしてない←）ページA←ページB←ページC
×　（コンバージョンしてない←）ページA←ページD←ページD
　↓
　ページA←ページB の経路がよく通るページビューの経路

（例３）
○　（コンバージョンしてない←）ページA←ページB
×　（コンバージョンしてない←）ページA←ページB←ページC
×　（コンバージョンしてない←）ページA←ページD←ページD
　↓
　ページA←ページB の経路がよく通るページビューの経路

# やってみる

参考にした [myVerticaのドキュメント](https://my.vertica.com/get-started-vertica/pattern-matching/)

※ 最近は、「これ君のmyVerticaでどうにかならないかなぁ〜？」というのが口癖。

（例１）
・・・作業中

``` sql
=> SELECT
	uid,
	sid,
	ts,
	refURL,
	pageURL,
	action,
	event_name(),
	pattern_id(),
	match_id()

FROM clickstream_log
MATCH
(PARTITION BY uid, sid ORDER BY ts
 DEFINE
	entry AS refURL NOT ILIKE '%website2.com%' AND pageURL
		ILIKE '%website2.com%',
	onsite as pageURL ILIKE '%website2.com%' and action='V',	
	purchase AS pageURL ILIKE '%website2.com%' AND
		action='P'
PATTERN P as (entry onsite* purchase)
ROWS MATCH FIRST EVENT);
```


（例２）
・・・作業中


（例３）
・・・作業中


# 課題

- もっと簡単にできないか？
- 複雑なパターンをもっと増やしてやってみてもこのSQLでいけるか？

# APPENDIX

- サンプルデータ
Meterial Design LiteでチェックボックスをJavaScriptでON/OFFするときにハマったこと

# ハマったこと

[Material Design Lite（MDL）](https://getmdl.io/)を使ったHTMLで、JavaScriptを使ってチェックボックのON/OFFを操作したい。
ただそれだけ。
ただそれだけだけど、ハマりました。

# 注意

MDLについての基本的なところは割愛します。
あと以下のサンプルコードは動作確認してないので、雰囲気だけ感じ取ってください。

# まずはMDLの基本的な書き方

Material Design Liteではチェックボックスはこう書きます。

## HTMLで書く場合

```html
<div id="checkboxes">
  <label class="mdl-checkbox mdl-js-checkbox mdl-js-ripple-effect" for="sample-expandable">
    <input class="mdl-checkbox__input" type="checkbox" id="sample"> Check me!
  </label>
</div>
<button type="button" class="mdl-button" id="toggle">Toggle</button>
<button type="button" class="mdl-button" id="check">Check</button>
<button type="button" class="mdl-button" id="uncheck">Uncheck</button>
```

## JavaScriptで書く場合

```javascript
// labelタグ作成
var label = document.createElement('label');
label.id = 'sample-label';
label.className += ' mdl-checkbox mdl-js-checkbox mdl-js-ripple-effect';

// inputタグ作成
var input = document.createElement('input');
input.type = 'checkbox';
input.id = 'sample';
input.className += ' mdl-checkbox__input';

// labelのテキスト作成
var labelText = document.createTextNode('Check me!');

// 作成した要素をlabelタグに追加
label.appendChild(input);
label.appendChild(labelText);

// MDL用に要素をアップデート
componentHandler.upgradeElement(label);

// 作成したlabel要素をbodyに追加
document.getElementById('checkboxes').appendChild(label);
```

# ボタンを押してチェックのON/OFFをしたい

## 通常は。。。

こうですね？

```javascript
document.getElementById('check').addEventListener('click', function () {
  document.getElementById('sample').checked = true;
}, false);

document.getElementById('uncheck').addEventListener('click', function () {
  document.getElementById('sample').checked = false;
}, false);

document.getElementById('toggle').addEventListener('click', function () {
  var checkbox = document.getElementById('sample');
  if (checkbox.checked) {
    checkbox.checked = false;
  } else {
    checkbox.checked = true;
  }
}, false);
```

ただMDLでは動きません。

## MDLでは。。。

操作対象となる要素はinput要素ではなくlabel要素になります。
つまりこういう構成になっていないやつは動作しない。

```javascript
document.getElementById('check').addEventListener('click', function () {
  document.getElementById('sample-label').MaterialCheckbox.check();
}, false);

document.getElementById('uncheck').addEventListener('click', function () {
  document.getElementById('sample-label').MaterialCheckbox.uncheck();
}, false);

document.getElementById('toggle').addEventListener('click', function () {
  var label = document.getElementById('sample-label');
  if (label.className.split(' ').indexOf('is-checked') !== -1) {
    label.MaterialCheckbox.check();
  } else {
    label.MaterialCheckbox.uncheck();
  }
}, false);
```

# 最後に

久しぶりにライブラリやフレームワークに頼らずにJavaScriptを書きました。
やっぱちょっとめんどくさいなと思いました。
Rubyのバッククォート(`)は再定義できるらしい


[Ruby Advent Calendar 2016](http://qiita.com/advent-calendar/2016/ruby)の3日目が空いてたので、代わりに投稿してみました。Rubyのちょいネタです。

Rubyでは演算子の多くが再定義可能です。

[Ruby 2.2.0 リファレンスマニュアル > 演算子式 ](https://docs.ruby-lang.org/ja/2.2.0/doc/spec=2foperator.html)

再定義可能な演算子の中にバッククォート(`)があるのですが、バッククォートの再定義ってどんな挙動になるのかちょっと想像できません。

なので色々試してみました。

## コマンド出力リテラルが再定義できた

結論から言うと、コマンド出力のリテラルが再定義できました。バッククォートで囲まれた文字列をコマンドとして実行するアレですね。

```rb
p `pwd` # カレントディレクトリのパスを文字列として出力
```

以下のように再定義可能です。

```rb
def `(x)
  何らかの処理
end
```

バッククォートで囲まれた内側の値が、引数として渡るようです。

## 有効な活用方法を考えてみる

正直、有意義な活用方法が思い浮かびません・・・
強いて言うなら、

```rb
def `(x)
  eval x
end

`puts "hello world"`
```

とかでしょうか。

ちなみに、バッククォートを再定義した場合は**%記法も再定義**されるようです。

```rb
def `(x)
  x.split.map(:&to_i).reduce(:+)
end

p %x{1 2 3 4 5} # => 15
```

うまく活用すれば面白いことができそうです。

## 残された謎

バッククォートの再定義時には、引数を複数指定することができます。

```rb
def `(x, y)
  x + y
end
```

しかし、**この記法に第二引数を渡す方法が分かりません**。色々試しましたが、いずれもSyntaxErrorになってしまいました。同様に、ブロックを渡すのも無理でした。もし、何らかの方法で第二引数やブロックを渡すことができれば夢が広がるんですけど・・・
PHP で未使用の use import を削除する方法

## 方法1: PhpStorm の整形機能を使う

IDE の PhpStorm を使う場合、メニューバーの Code メニューの中にある `Show Reformat File Dialog` ( `⌥⇧⌘L` ) を表示して `Optimize imports` にチェックを付けて実行すると、未使用の use import を削除できます。

![Reformat Code ダイアログ](https://qiita-image-store.s3.amazonaws.com/0/59802/d0b1626e-9ad6-a25a-a600-ff73104eeb8b.png)

一度チェックを入れて実行すると次以降は `Reformat Code` ( `⌥⌘L` ) をするだけで削除できるようになります。

追記: コード整形をせずに use 一覧の最適化だけを行いたい場合は `Optimize Imports` ( `⌃⌥O` ) で出来ます。

## 方法2: PHP-CS-Fixer を使用する

コード整形ツールの [PHP-CS-Fixer](https://github.com/FriendsOfPHP/PHP-CS-Fixer) で整形ルールを設定して実行することでも削除できます。

コマンドラインで実行できるため、PhpStorm 以外のエディタを使っている場合でも削除できます。

### PHP-CS-Fixer とは

> The PHP Coding Standards Fixer tool fixes most issues in your code when you want to follow the PHP coding standards as defined in the PSR-1 and PSR-2 documents and many more.

ref. https://github.com/FriendsOfPHP/PHP-CS-Fixer/

コーディング規約の PSR-1, PSR-2 に沿ってコードを整形してくれるコマンドラインツールです。

### 削除するコマンド例

```bash
# PHP-CS-Fixer 2.0 以降を使う場合
php-cs-fixer fix target.php --rules=@PSR2,no_unused_imports
```

```bash
# PHP-CS-Fixer 1.x を使う場合
php-cs-fixer fix target.php --level=psr2 --fixers=unused_use 
```

PSR-2 ( `--level=psr2` ) のルールでは未使用 use の削除は行われないため、 `--fixers` オプションで削除するためのルールを追加しています。

[バージョン2.0以降からそのルール名が変更されている](https://github.com/FriendsOfPHP/PHP-CS-Fixer/blob/f3baf72eb2f58bf275b372540f5b47d25aed910f/UPGRADE.md#renamed-rules)ため、注意が必要です。

- 1.x: `unused_use`
- 2.0以降: `no_unused_imports`


## PHP ユーザーズグループはいいぞ

この記事の内容は Slack の PHP ユーザーズグループで質問して頂いた情報を元に解決して書かれたものです。多謝。

誰でも参加できるので是非どうぞ。

- [日本語で PHP の話をする Slack のグループを作ったよ【参加者募集】 - 頭ん中](http://www.msng.info/archives/2016/02/phpusers-ja-on-slack.php)
機械学習論文読みメモ_19

[Model-Free Trajectory Optimization for Reinforcement Learning](https://arxiv.org/pdf/1606.09197.pdf), ICML2016
局所線形近似とconservativeな更新を通して従来のtrajectory optimizationは行われる。
そのため最適なpolicyへの収束が難しい。
本論では、局所二次線形、時間依存のQ関数を用いる事で,policyの更新を閉形式で可能にした。
この手法は対象システムを簡易化する事なく、KL距離において確実にバウンドされた形で解を求める事が出来る。

[Deep Speech 2: End-to-End Speech Recognition in English and Mandarin](http://jmlr.org/proceedings/papers/v48/amodei16.pdf), ICML2016
englishとmandarin Chineseの全く異なった言語双方を認識可能なdeep learning構造を提案する。
これにより様々な言語に対応可能な構造を実現する。
high performance computingの活用で７倍の高速化を実現した。
構造には、connectionist temporal classification、Batch normalization、RNNなどが使われている。

[Why Most Decisions Are Easy in Tetris—And Perhaps in Other Sequential Decision Problems, As Well](http://jmlr.org/proceedings/papers/v48/simsek16.pdf), ICML2016
テトリスにおける意思決定プロセスを解析した。
ほとんどの場合において、その意思決定は簡単であり、高得点を取るための具体的な評価関数を知ることなく、より良い選択を行う事が出来る。
特に今回発見した３つの条件分けが結局ゲームの決定付けに影響している事から導かれる。
これらの条件を利用する事でより早く効率的な手法を提案出来る。
fluent-plugin-s3と大体互換なfluent-plugin-gcsの紹介

全国のGCSのファンの皆さんこんにちは。今日は皆さんお待ちかねのFluentプラグインを紹介したいと思います。

私はAWS・GCP等のクラウドサービスの中でも、一二を争うくらいにオブジェクトストレージが好きです。オブジェクトストレージはクラウド上でシステムを構築する上で要となる、とても重要なコンポーネントだと思っているからです。

S3には [fluent-plugin-s3](https://github.com/fluent/fluent-plugin-s3) というFluent公式でサポートされている便利なプラグインがあり、AWSでFluentを使用しているのであれば使ったことがある人も多いと思います。只、GCSには現状だといくつかプラグインが存在しているのですが、GCPの進化が早いため複数のアカウント認証にちゃんと対応出来ていなかったり、fluent-plugin-s3ほど機能が充実しているわけでは無かったりと、デファクトとなるプラグインがまだない状態だと思います。(私が見つけられなかっただけならごめんなさい :pray: )

今回、仕事でGCPをガッツリと使う機会が出来たので、基本的な機能はfluent-plugin-s3互換で、且つGCSの機能も出来るだけ取り入れたFluentプラグインを作ったので紹介します。

## fluent-plugin-gcs

https://github.com/daichirata/fluent-plugin-gcs

```
<match pattern>
  @type gcs

  project YOUR_PROJECT
  keyfile YOUR_KEYFILE_PATH
  bucket YOUR_GCS_BUCKET_NAME
  object_key_format %{path}%{time_slice}_%{index}.%{file_extension}
  path logs/
  buffer_path /var/log/fluent/gcs

  time_slice_format %Y%m%d-%H
  time_slice_wait 10m
  utc
</match>
```

基本的な機能に関しては、ほとんどS3プラグインと互換性があります。各種設定に関してはREADME.mdを参照してくださいませ。

* bucket
* store_as
* path
* object_key_format
* format
* auto_create_bucket
* overwrite
* acl

### 認証

**project**
GCSのプロジェクトIDです。これらは以下の順番に検索されます。

* 設定で指定した`project`
* 環境変数 `STORAGE_PROJECT`, `GOOGLE_CLOUD_PROJECT`, `GCLOUD_PROJECT`
* GCE credentials

**keyfile**
GCSをプログラムから使う上での認証方式は幾つかあるのですが、下記3つに対応しています。p12キーによる認証は非推奨となっているのでサポートしていません。

* JSON key 形式
* Cloud SDK
  * gcloud auth loginを実行した際に~/.gcloudの中に生成される認証ファイルを読み込みます
* GCE credentials
  * GCE上で権限があれば、鍵の設定が要らない奴でapplication_defaultなどと呼ばれています

各種認証情報は、以下の順番に検索されます。

* 設定で指定した`keyfile` (ファイルパス)
* 環境変数(ファイルパス) `GOOGLE_CLOUD_KEYFILE`, `GCLOUD_KEYFILE`
* 環境変数(JSON) `GOOGLE_CLOUD_KEYFILE_JSON`, `GCLOUD_KEYFILE_JSON`
* Cloud SDKの認証ファイル
* GCE credentials

GCEやGKE(Docker image)上で動かす場合には、特に何も設定しない形で問題ないと思います。

### 固有機能

GCSの固有機能に関しても幾つか対応しています。

**transcoding**
GCSにはgzip圧縮ファイルのトランスコーディングという機能があります。具体的には、gzip圧縮されたファイルを、`Content-Encoding: gzip`でアップロードすることで有効となり、ファイルをダウンロードする際にGCS上でファイルが解凍されてダウンロード出来るようになります。また、詳細は[公式](https://cloud.google.com/storage/docs/transcoding?authuser=0&hl=ja)を見てもらうと良いと思うのですが、設定で`store_as`をgzip、`transcoding`をtrueにすることでこの機能が有効になります。

**encryption_key**, **encryption_key_sha256**
GCSにデータを保存する際にGCSサーバー上で暗号化処理が行われているのですが、そのkeyをこちらで指定することが出来ます。注意する点としては、暗号化キーをユーザー指定でオブジェクトを保存した場合、ダウンロードする際にも同じキーが必要になります。こちらも設定から指定することで、ログのアップロード時に有効になります。

**ObjectMetadata**
オブジェクトに対してメタデータを付与することが出来ます。これらのデータはコンソール上か又は、レスポンスヘッダーの`x-goog-meta-`で返却されます。

```
<match *>
  @type gcs

  <object_metadata>
    key KEY_DATA_1
    value VALUE_DATA_1
  </object_metadata>

  <object_metadata>
    key KEY_DATA_2
    value VALUE_DATA_2
  </object_metadata>
</match>
```

fluent-plugin-forestでタグ情報を埋めるなどするともしかしたら何かユースケースがあるかもしれません。

## TODO

残念ながら、内部で使用しているRubyのgoogle-api-clientの関係上、今はファイル単位でのストレージクラスの設定が出来ません。バケットのストレージクラスが有効になるので、もし変更したい場合には事前にバケットを作成しておいたほうが良いと思います。

## おわり

ということで簡単にですが、GCSのFluentプラグインについて紹介させてもらいました。ユースケースとしては単にログの保存や、1分単位でGCSにログを転送して、1時間単位でBigQueryにロードするなど色々な所で使っていく予定です。最初はStackdriverを使用することも考えたのですが、データ量の制限や汎用性、有料化などがあるので今回はFluentで実現することにしました。しばらくは本番環境でガンガン使っていく予定なので、是非使ってみてフィードバックなど貰えると嬉しいです :smile:
Advent of Code の紹介

:gift:[Advent Calendar 紹介 Advent Calendar 2016](http://qiita.com/advent-calendar/2016/advent-calendar) の 7 日目の記事です．（もう7日かぁ……．）

技術系のアドベントカレンダーはもともと [Perl Advent Calendar](http://www.perladvent.org/2016/)[^1]を発祥としているようですが，その後日本語圏で独自の華やかな発展を遂げ[^2]，ここ数年は百花繚乱の趣があります．一方海外系のものは，例えば Haskell 界隈では 24 days of Hackage ([2012](https://ocharles.org.uk/blog/pages/2012-12-01-24-days-of-hackage.html) / [2013](https://ocharles.org.uk/blog/pages/2013-12-01-24-days-of-hackage.html) / 別の人による [2015](http://conscientiousprogrammer.com/blog/2015/11/30/haskell-tidbits-24-days-of-hackage-2015-day-1-introduction-and-stack/))や [24 Days of GHC Extensions](https://ocharles.org.uk/blog/pages/2014-12-01-24-days-of-ghc-extensions.html)などがありますが，2016年のは今のところ（僕は）知らないとかそんな感じで，業界全体のお祭りというよりは「全部俺」系のカレンダーが散発的に出現しどれも良く書けてる，というのが主流という印象があります[^3]．

閑話休題．というわけで今日は，海外系 advent calendar のひとつ :christmas_tree:[Advent of Code](http://adventofcode.com/) を紹介します．これは12月の25日まで毎日1問ずつ，プログラミングの問題が出題され，順に回答を submit していくというもので，問題を解く毎に星がもらえ，飾り付けも華やかになります（下は昨年の様子）．
![](https://qiita-image-store.s3.amazonaws.com/0/63937/fb0eb071-ac83-1f52-01b6-5ad0143262b7.png "昨年の様子")

各日問題文 (Part 1 とそれを解いたら出てくる Part 2)と input が提示され，答えだけを submit するもので，形式としては Project Euler が近いです[^4]．気になる難度ですが，[/about](http://adventofcode.com/about)に

> Advent of Code is a series of small programming puzzles for a variety of skill levels. They are self-contained and are just as appropriate for an expert who wants to stay sharp as they are for a beginner who is just learning to code. Each puzzle calls upon different skills and has two parts that build on a theme.

とある通り，日によって様々なジャンル・題材の問題に出会えるので日めくりの楽しみがあり，難易度もそれなりにちゃんと難しいのもある一方で，はじめのうちは（特に Part 1は）初心者でも手が動かせる，いいくらいの調整になっていると思います．

また reddit の [/r/adventofcode](https://www.reddit.com/r/adventofcode/)がたいへん活発で，解答の見せ合いや質問はもちろん，誰かが背景の解説や問題文の格好いい可視化をしたり，Upping the Anteというflairではその日の問題に条件やinputを追加して高難易度の問題にしてわいわいやっていたりします．解けない初心者や物足りない上級者，または人間一般は覗きに行ってみましょう．

昨年始まり，好評に後押しされてか2年めに突入した Advent of Code は幅広いひとが楽しめるイベントです．毎日いろんな題材でちょっとした（あるいは真剣な）コードを書く愉快というのもなかなかのものです．github/google/twitter/reddit で簡単にログインもできますので，是非ひとついかがでしょうか．

→[Advent of Code 2016](http://adventofcode.com/)

[^1]: 過去年分は http://www.perladvent.org/archives-Yd.html にあるようです．
[^2]: [日本における技術系アドベントカレンダーの歴史 - 近＆況](http://yhara.jp/2016/12/01/history-adcal-jp)
[^3]: 僕の勘違いかも知れない．色々知ってる方は教えてください．
[^4]: input は人によって変わっているらしい．
zypperでisoファイルからパッケージを導入する

#早速本題
適宜sudoしてください。
##既存のレポジトリのバックアップ

```
mkdir /etc/zypp/repos.d/old
mv /etc/zypp/repos.d/*.repo /etc/zypp/repos.d/old
```

##isoレポ追加
前提：``/path/to/iso/Tumbleweed_x86_64.iso``で導入します。

```
zypper ar -c -t yast2 "iso:/?iso=/path/to/iso/Tumbleweed_x86_64.iso" "hogehoge"
```


hogehogeは任意ですが、このレポがisoだということがわかる名前に変えましょう。この名前は他のレポの名前とかぶるとエラーを履くので"今日の日付_iso"とつけるのがおすすめです。

##インストール
通常と同様
うまく行かないときはキャッシュが原因かもしれません。


##用済みになったら

```
mv /etc/zypp/repos.d/old/hogehoge.repo
mv /etc/zypp/repos.d/old/*.repo /etc/zypp/repos.d/ 
```
#参考
https://www.suse.com/communities/blog/create-iso-your-opensuse-dvd-and-add-it-installation-source-command-line/
本当の意味でGetWild駆動開発を行う方法

[Get Wild Advent Calendar 2016](http://qiita.com/advent-calendar/2016/getwild) の7日目です。

#GetWildから開発を始めるにはどうしたらいいのか？

GetWildといえば印象的なイントロがまずはみなさん頭に浮かぶのではないでしょうか。シティハンターのEDはこのイントロ部分が本編に被る形で曲が始まります。というわけで同様にプログラム開発においてもGetWildのイントロを実際に弾くところから始められるようにしました。

具体的にはMIDIキーボードでGetWildのイントロを間違えずに弾けるとリポジトリからpullするようにします。

##用意するもの

* node.jsが動く環境
* MIDIキーボード(今回は[Novation LaunchKey Mini MK2](http://www.h-resolution.com/novation/launchkeyminimk2.php)を使いました)
* MIDIで音の出せるアプリ(GarageBandやableton liveなど)

[node-midi](https://github.com/justinlatimer/node-midi)を使うと比較的簡単にMIDI信号を取り扱うことができるので今回はこちらを使います。

## GetWild駆動してみる

こんな感じのプログラムをまずは用意します。
intromelodyの値はMIDIキーボードによってマッピングが異なりますのでお手持ちの環境に合わせてください。
誤動作防止のため、一定の強さで弾かないと受け付けないようにしています。

```js:getwild.js
var midi = require("../midi.js");
var intromelody = [63, 61, 59, 63, 61, 59, 59, 59, 61, 63, 63, 64, 63, 59, 63, 63, 61, 59];
var introrefrain = [];

var input = new midi.input();
input.on('message', function(deltaTime, message) {
    var mydream = message;

    if (mydream[0] == 144 && mydream[2] > 50) {
        introrefrain[introrefrain.length] = mydream[1];
        console.log(introrefrain);
        console.log(intromelody);

        var yourpain = JSON.stringify(intromelody);
        var mypain = JSON.stringify(introrefrain);

        if (yourpain == mypain) {

            var exec = require('child_process').exec;
            exec('git pull', function(err, stdout, stderr) {
                console.log(stdout);
            });

            console.log('Get wild and tough!');
        } else {
            return false;
        }

    }
});
input.openPort(0);
```

### 音の出るアプリケーションを起動する
せっかくなので音の出るアプリケーションを使って実際に音を出して弾きましょう。MacならGarageBandが入ってると思いますので起動して適当にお好きな音源を選択してください。この時実際にMIDIキーボードを叩いて音が出ることも忘れずに確認しておいてください。

### あとは本能の赴くままにGetWildするだけ
```$ node getwild.js```で実行してイントロをうまく弾ければリポジトリがpullされて開発が始められます。

## 最後に
Get Chance and Luck!!
初心者による初心者のためのとりあえず実装してみよう。〜 UILabel編 〜

#とりあえず初めてみませんか？
iPhoneのアプリ作ってみたいな〜、難しいのかな〜？って思っているそこのあなた！
僕もつい数ヶ月前まではそんな一人でした。え？それでどんなことしてたかって？
いや〜、実はやろうやろうと思って何もしてなかったんですよね〜。
なので、そんな僕のようにならないように簡単なところから
一歩踏み出してみませんか？

#ってことで手っ取り早く実装してみよう！
え？いきなり過ぎないかって？
大丈夫大丈夫、思ってより簡単なんでやってみましょう♪
今回はUILabelに好きな文字を表示させてみましょう！
あ、UILabelは文字列を表示する時に使うものです。
上がObjective-C、下がSwiftです！


まずはストーリーボードでUILabelを配置します。
そこからわからねーよという方は、他のサイトでちょっと調べてみてください。
分かりやすいのが沢山あります。
（分かりやすいスクショが撮れなかったので、、）

ここから実装↓
試しに3種類ほどラベルを用意してみました。

```objc:ViewController.m

@interface ViewController ()

@property (weak, nonatomic) IBOutlet UILabel *SampleLabel1;
@property (weak, nonatomic) IBOutlet UILabel *SampleLabel2;
@property (weak, nonatomic) IBOutlet UILabel *SampleLabel3;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    
    //ここから下を追加してみましょう！
    //文字を表示
    _SampleLabel1.text = @"SampleLabel1";
    
    //文字を表示して、テキストの色を変更
    _SampleLabel2.text = @"SampleLabel2";
    _SampleLabel2.textColor = [UIColor blueColor];
    
    //文字を表示して、背景色を変更
    _SampleLabel3.text = @"SampleLabel3";
    _SampleLabel3.backgroundColor = [UIColor lightGrayColor];
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

@end
```

```swift:ViewController.swift

class ViewController: UIViewController {

    @IBOutlet weak var SampleLabel1: UILabel!
    @IBOutlet weak var SampleLabel2: UILabel!
    @IBOutlet weak var SampleLabel3: UILabel!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        
        //ここから下を追加してみましょう！
        //文字列の表示
        SampleLabel1.text = "SampleLabel1"
        
        //文字列を表示して、テキストの色を変更
        SampleLabel2.text = "SampleLabel2"
        SampleLabel2.textColor = UIColor.blueColor()
        
        //文字列を表示して、背景色を変更
        SampleLabel3.text = "SampleLabel3"
        SampleLabel3.backgroundColor = UIColor.lightGrayColor()
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
}
```

完成イメージはこんな感じです！
![UILabel.png](https://qiita-image-store.s3.amazonaws.com/0/134329/2ed9c57d-24d1-5137-5c6d-2be82b9d7ffb.png)


#やってみた感想。。
どうですか？思ってより簡単だったでしょう？
やってみたいなー、でも何からやったらいいか分からないなーって方は
こんな感じで、ちょっと実装してみると意外とすんなり一歩を踏み出せるんじゃないでしょうか。

#最後に
今回このような基礎的なことを書いてみたのは、自分が勉強し始めの頃にあったら嬉しいなと思ったのと、
もっと分かりやすい記事もありますが、一人でも初学者の助けになればと思い、
復習も込めて書いてみました。
（あとでストーリーボードのことも追記しときます。）

「お、意外と自分でも作れるんじゃね？」と思ったら勝ちですよ！(笑)

次回もまた別の基礎的な事を書いていこうと思います。
モチベが続けば、、、、（笑）
MySQLでタブ区切りのファイルを作成する

## まずはSQLを作成する

コマンドラインで実行したいSQLを先に作成してしまいましょう。
ポイントは見出し行をカラム名のエイリアスで作成するところ。

```sql
SELECT id AS ID番号
      ,name AS 氏名
  FROM table
 ORDER BY 1 ASC;
```
## 次にmysqlコマンドを作成する

実際に試してみたんですが、パスワード指定がうまく行かなかったので ```--password=``` オプション指定にしてます。

```bash
mysql -u username --password=pass -h hostname -P 3306 databasename -e "
SELECT id AS ID番号, name AS 氏名 FROM table ORDER BY 1 ASC;"
```

ちなみにパスワードを隠したい人は下記URLが参考になるかもです。
[MySQLのコマンドラインで-pオプションを使わずにパスワードを指定する方法](https://heartbeats.jp/hbblog/2010/03/mysql-p.html)
（試してません）

**MEMO**
単純なSQL文ならファイルに保存して入力リダイレクトする方がメンテナンス性が上がるかもしれません。

```bash
mysql -u username --password=pass -h hostname -P 3306 databasename < select.sql
```

## 処理結果をリダイレクトしてファイルにする

コマンドを実行すると通常、表形式に整形された文字列が出力されます。

```bash
mysql databasename -e "SELECT * FROM hoge;"
```
```
+------+-----+
|ID番号|氏名 |
+------+-----+
|     1|阿部 |
|     2|伊藤 |
.....
```

これをリダイレクトするだけでタブ区切りのファイルにすることができます。

```bash
mysql databasename -e "SELECT * FROM hoge;" > result.txt
```

```
ID番号	氏名
1	阿部
2	伊藤
```
Cognos BI レポートで「レポートの再実行」ボタンを実装する

Cognos BI のレポート開発で、プロンプトボタンに「終了」や「再プロンプト」があると思いますが、実際に使っていると思うような動きにならず、いわゆる「レポートの再実行」の機能をプロンプトボタンで実装したくなる時があります。

そんな時は、以下のコードをHTML Itemに置いて下さい。
プロンプトとのパラメーターのやりとり、レポートへの反映で、思うような動きにならない時にお試し下さい。


\<script type="text/javascript">

function do_refresh() {
var fW = (typeof getFormWarpRequest == "function" ? getFormWarpRequest() : document.forms["formWarpRequest"]);
if ( !fW || fW == undefined) { fW = ( formWarpRequest_THIS_ ? formWarpRequest_THIS_ : formWarpRequest_NS_ ); }

var preFix = "";

if (fW.elements["cv.id"]) {
preFix = fW.elements["cv.id"].value;
}

var nameSpace = "oCV" + preFix;
eval(nameSpace + ".getRV().RunReport()");
}

\</script>
\<input type="button" value="再実行" onClick="do_refresh()">
Mithril.jsでバリデーションをどこに書くか？

Mithrilでバリデーションをどこで行うか、という話ですが、戦略はいくつかあると思います。

# バリデーションを書ける場所

## ``<input>`` タグの min/max/patternなどの属性値を使う

```js
controller: function() {
    var self = this;
    this.message = m.prop('message');
},
view(ctrl) {
    return m('input[min=3][max=6]', {
        onchange: m.withAttr('value', ctrl.message),
        value: ctrl.message()
    });
}
```

### メリット 

* 入力前にチェックできる。後工程に想定外のデータが渡っていかないのでシンプル

### デメリット 

* タグで指定できるようなチェックしかできない 

## ``oninput`` のコールバックの中で仕込む

```js
controller: function() {
    var self = this;
    this.message = m.prop('message');
    this.validateAndStore = (value) {
        // 何かしらチェックしてから格納
        self.message(value);
    }
},
view(ctrl) {
    return m('input', {
        oninput: m.withAttr('value', ctrl.validateAndStore),
        value: ctrl.message()
    });
}
```

### メリット 

* 入力前にチェックできる。後工程に想定外のデータが渡っていかないのでシンプル

### デメリット 
* 中途半端な状態でもチェックルーチンが呼ばれてしまうので、「NGです！」みたいな表示がで続けてユーザのストレスになる可能性も

## ``onchange`` のコールバックの中に仕込み、エラー表示する

```js
controller: function() {
    var self = this;
    this.message = m.prop('message');
    this.validateAndStore = (value) {
        // 何かしらチェックしてから格納
        self.message(value);
    }
},
view(ctrl) {
    return m('input', {
        onchange: m.withAttr('value', ctrl.validateAndStore),
        value: ctrl.message()
    });
}
```

### メリット 
* 入力した瞬間に実行。タグで設定できるよりも細かいバリデーションが行える。
* 入力が短く、エラーが明確な場合はプロパティに代入せずに単純に無視(入力内容は消える)
* 半角全角変換とかもやるならこのタイミングがベスト

### デメリット 
* ちょっとレスポンスが遅い

## 送信ボタンとかのタイミングで行う

### メリット 

* チェック箇所が一箇所にまとまる

### デメリット 

* フィードバックが遅い
* ダメだった時に、元の値に戻すとかの処理をサポートするといろいろ手間が増える

# 結局何処にかくべきか？

なるべく多くの所で書くほうがいいかなと思ってます。フィードバックが早いの大事。あと、ロボット的な更新がされることもあるので、クライアントでチェックしたとしても、サーバサイドのチェックは省略はできません。まあサーバサイドはバリデーションというかアサーションですかね。当然、クライアントとサーバのチェックは矛盾してはいけません。

あと、バリデーションはドメイン知識なのか？問題。DDDだと、ドメインは集約すべき、バリデーションはドメインのもの、分離するとドメインモデル貧血症になるぞ！という説明もあれば、バリデータークラスを作るみたいな説明もみかける。どっちかわからん。

バリデーションをドメイン知識だとして、ドメインレイヤーにおしこめてしまうと、フィードバックが遅くなったりするので、書けるところにはガンガンかけばいいかなと思ってます。

JSONスキーマを作り出すのはドメイン層かもしれないけど、JSONスキーマの確認を行うのは別レイヤーでいいじゃん、という解法もあるかもしれないけど、ユーザに親切なエラーメッセージ、特に具体的な解決方法を出すには自動チェックじゃどうしようもならないことも多いですよね。結局バリデーションにはロジックが必要になることが多い気がします。
MessageBoxの使い方

[Siv3D Advent Calendar 2016](http://qiita.com/advent-calendar/2016/siv3d) 7日目の記事です。

#初めに
Siv3Dにはたくさんの機能があります。しかし、あまり使用されない機能も存在します。
そこで、今回はそんな機能のひとつの、MessageBoxを紹介したいと思います。
#MessageBoxとは
パソコンを使っていると警告音とともに出てくるあれです。
![image](https://qiita-image-store.s3.amazonaws.com/0/102316/d99b1411-701f-b23c-4935-4118ef8acd10.png)

MessageBoxを使うと、簡単な選択肢を表示したり、エラーを表示したりすることができます。

#Siv3DのMessageBox

```C++:表示
MessageBox::Show(L"Hello");
```

これでMessageBoxを表示することができます。
![image](https://qiita-image-store.s3.amazonaws.com/0/102316/a56a3064-be96-fc2c-6da8-1492ff1f62da.png)

#選択の取得

```C++:取得
MessageBoxCommand com = MessageBox::Show(L"Hello");
```

MessageBox::Showの戻り値で、何が選択されたのか取得できます。

```C++:条件分岐
#include <Siv3D.hpp>


void Main() {

	const MessageBoxCommand com = MessageBox::Show(L"Hello");

	if (com == MessageBoxCommand::Ok)
	{
		MessageBox::Show(L"Okが押されました");
	}

}


```

#細かな設定
MessageBoxには「タイトル・本文・スタイル・既定のボタン」を設定することができます。

```C++:疑似コード
MessageBox::Show(タイトル, 本文, スタイル, 既定のボタン);
```

```C++:一例
MessageBox::Show(L"質問", L"嘘つきですか？", MessageBoxStyle::YesNo, 0);
```

スタイルを変更することで、表示されるボタンが変わります。
以下の表にスタイルの表示形式をまとめました。

| スタイル | 表示形式 | 戻り値 |
|:--|:--:|:--|
| Ok | ![image](https://qiita-image-store.s3.amazonaws.com/0/102316/4f20171d-fe2c-4b26-6808-4cdb38ee8f44.png) | Ok |
| OkCancel | ![image](https://qiita-image-store.s3.amazonaws.com/0/102316/a0103902-3d6e-6e7a-8624-c766fc7f89ae.png) | Ok・Cancel |
| YesNo | ![image](https://qiita-image-store.s3.amazonaws.com/0/102316/65206927-2898-e9f6-899e-785c8549f758.png) | Yes・No |
| YesNoCancel | ![image](https://qiita-image-store.s3.amazonaws.com/0/102316/65cafc7b-804c-4f2d-6939-f50dfda18c29.png) | Yes・No・Cancel |
| RetryCancel | ![image](https://qiita-image-store.s3.amazonaws.com/0/102316/868b0e96-9657-d65d-0c1f-7b6b5c3262d2.png) | Retry・Cancel |
| CancelRetryContinue | ![image](https://qiita-image-store.s3.amazonaws.com/0/102316/043174ae-4649-bc6c-1e2a-b4c9a5277dd5.png) | Cancel・Retry・Continue |
スタイルによって戻り値のパターンが変化します。

既定のボタンは、表示されたときに、どのボタンにカーソルを合わせているかを設定します。
例えば、スタイルがCancelRetryContinueの場合
0ならばキャンセルに
1ならば再実行に
2ならば続行に
カーソルが選択されます。

#使用例
ここでは、終了確認を行うプログラムを紹介します。

```C++:終了確認
#include <Siv3D.hpp>

void Main() {

	System::SetExitEvent(WindowEvent::Manual);

	while (System::Update())
	{
		if ((System::GetPreviousEvent() & WindowEvent::CloseButton)
			|| (System::GetPreviousEvent() & WindowEvent::EscapeKey))
		{
			const auto com = MessageBox::Show(L"確認", L"終了しますか?", MessageBoxStyle::YesNo, 1);

			if (com == MessageBoxCommand::Yes)
			{
				System::Exit();
			}
		}
	}

}

```

#注意事項
MessageBoxを表示させると、メインウィンドウが予期せぬ描画になる可能性があります。

```C++:予期せぬ描画
#include <Siv3D.hpp>

void Main() {

	while (System::Update())
	{
		Circle(Mouse::Pos(), 50).draw({ 255, 0, 0, 127 });

		MessageBox::Show(L"");
	}
}
```
このコードを実行すると、はじめだけ真っ白な画面が表示されます。
(おそらく直前の画面が表示されるため？要検証)

また、Windows.hをSiv3D.hppの後に追加すると、MessageBoxがマクロに置き換えられ、使用できなくなります。

```C++:マクロによる置き換え
#include <Siv3D.hpp>
#include <Windows.h>

void Main() {

	//MessageBox::Show(L"");使用できない
	MessageBox(nullptr, TEXT("Hello"), TEXT("Title"), MB_OK);//置き換えられる

}

```

#終わりに
MessageBoxの使い方を紹介しました。また、注意事項を2つ紹介しました。

明日は @LPC1768_ さんの記事です．よろしくお願いいたします．
配列の最小値を求める


正の整数が格納された配列があり、その最小値を求めることを考えます。まずawk厨のわたしとしては、awkを利用する方法が思いつきます。

```bash
numbers=(34 65 112 98 11)
echo ${numbers[@]} | awk '{
	min = $1
	for(i = 2; i <= NF; i++) min = $i < min ? $i : min;
	print min
}'

#=> 11
```

この書き方のよいところは__「配列を先頭からなめていき、最小値を見つけるたびに更新する」という処理の中身が見えやすい__ところでしょうか。フローの見えやすさは応用のしやすさにもつながります。ただしやや冗長なのは欠点でしょう。

次に`sort`コマンドを利用する場合は以下のようになります。

```bash
numbers=(34 65 112 98 11)
for number in ${numbers[@]}; do
	echo $number
done | sort -n | head -n 1

# => 11
```

__空白区切りの数字を改行区切りに並び替えたあと、昇順に並び替え、最後にその先頭だけを取り出しています。__最初の例に比べるとシェルスクリプト感はぐっと強くなりますが、冗長さはあまり変わっていません。awkに依存しないため、awkを可能な限り避けたい人にはお勧めです。

なお上記の例において「空白区切りの数字を改行区切りに並べ替え」る処理をawkに担わせることもできます。

```bash
numbers=(34 65 112 98 11)
echo ${numbers[@]} | awk '{while(++i <= NF) print $i;}' | sort -n | head -n 1

#=> 11
```

可読性はかなり悪くなりますが、全体としてはかなり短くなります。一行野郎も満足できるはず(´・ω・`)
Nimでファイル内文字列置換ツールを作る

# 概要

任意のファイルを開いて、コマンドラインで渡したパラメータ(キー・値)で置換し、コンソールに出力するツールです。
bashとかなら、ヒアドキュメントで済むんですけど。

## ソース

```nim:rep.nim

# ファイル内の文字列置換ツール

import os
import parseopt2
import tables
import queues
import strutils

proc rep_files(files:Queue[string],params:Table[string,string]) : bool =
  result = true
  # ファイルを取り出す
  let f:string = files[0]
  # ファイルの存在チェック
  if f.existsFile :
    # ファイルを１行ずつ読み込む
    for line in f.lines() :
      var work = line
      # パラメータで置換する
      for k,v in params :
        work = work.replace(k,v)
      echo work
  else: 
    result = false

# メインモジュールとして起動しているかチェック
if isMainModule :
  var files = initQueue[string]()
  var params = initTable[string,string]()
  # イテレータで取得    
  for kind, key, val in getopt() :
    # (余談)kindは、enum型なので、case文ではすべてのenum値
    # を網羅していないとコンパイルエラーとなります
    case kind
    of cmdArgument:
      # ファイル名として保存
      if files.len == 0 :
        files.add(key)
      else :
        echo "指定できるファイルは１つだけです"
        quit(1)
    of cmdLongOption, cmdShortOption:
      # 置換パラメータを保存(大文字版も追加)
      params[ [ "${" , key , "}"].join("") ] = val
      params[ [ "${" , key.toUpperAscii , "}"].join("") ] = val.toUpperAscii
    of cmdEnd:
      discard
  
  discard rep_files(files,params)
```

実行結果

```shell-session
$ cat hello.txt
hello ${hoge} ${HOGE}
こんにちは ${hoge} ${HOGE}
さようなら ${hoge} ${foo}-${bar}

$ rep hello.txt --foo=a --bar=b -hoge:6in
hello 6in 6IN
こんにちは 6in 6IN
さようなら 6in a-b

```