OmniAICreator/Qiita-1.07M huggingface dataset:
Doctrine2で日付を更新したはずなのに更新されない場合

Symfony2とDoctrine2を使っているあるシステムにおいて、
日付の更新処理でハマったのでメモ。

ある処理を行ったら、
有効期限を１年延長する、という処理を以下のコードで実装しようとしました。

```NGHoge.php
$em = $this->getDoctrine()->getManager();
$entity = $em->getRepository(Hoge::class)->find($id)
$expiryAt = $entity->getExpiryAt()->modify('+1 years');
$entity->setExpiryAt($expiryAt);
$em->flush();
```

上記のコードを実行したところ、
DBに保持されている有効期限はそのままで更新されていませんでした。

調べてみると、Doctrineはオブジェクトが同じ参照だと
更新しないようです。

$entityのgetExpiryAt()はDateTime型のオブジェクトを返します。
そのため同じオブジェクトのDateTimeに＋１年してもデータが変更されなかったようです。

ですので以下のコードに変更しました。

```OKHoge.php
$em = $this->getDoctrine()->getManager();
$entity = $em->getRepository(Hoge::class)->find($id)
$expiryAt = (clone $entity->getExpiryAt())->modify('+1 years');    // ★この行を変更
$entity->setExpiryAt($expiryAt);
$em->flush();
```

cloneして新しいオブジェクトを作るようにしました。
こうすることで更新されるようになりました。

オブジェクトをEntityにセットする箇所は注意が必要です。
CentOS7のhttpdはそのままだと（mod_php経由などで） /tmpに書き込もうとすると実は別のディレクトリに書き込まれる

これはSystemdのPrivateTmpという機能が有効になっているからですね。

## PrivateTmp

Systemdで管理しているサービスにおいて `/tmp` と `/var/tmp` をサービスごとに作るための機能です。

（セキュリティの面から共有しそうなファイルシステムを分離するためだと思います。）

具体的にどこに保存されるかというと

/tmp/systemd-private-xxxxx-httpd.service-xxxx/tmp/

になります。

このPrivateTmpがデフォルトでOnになっているため上記のような現象が発生します。

### 解除する方法

PrivateTmpをOffにすれば良いです。

```sh
# mkdir /etc/systemd/system/httpd.service.d
# echo "[Service]" >  /etc/systemd/system/httpd.service.d/privatetmp.conf
# echo "PrivateTmp=false" >> /etc/systemd/system/httpd.service.d/privatetmp.conf
# systemctl daemon-reload
# systemctl restart httpd
```

できればOffにせずに運用したいですね。

## 参考URL

http://enakai00.hatenablog.com/entry/20130917/1379374797
http://upwork.link/apache2/centos7-how-do-disable-privatetmp-for-apache-with-systemd/
幅広い範囲に適応可能なレビュー記録表の指摘分類について検討

#初めに
某プロジェクトでプロジェクトの立ち上げを行った際に、
ドキュメントや議事録のフォーマット、連絡体制など全く白紙の状態から
作り上げた時に色々調べていた時に
これはなるほどなと思ったところをまとめています。

今回は、レビュー記録表に記載する、指摘分類と原因のリストは
どういうものを残しておけば、分析などに使いやすいんだろうか？？

という疑問から調べて行ったものです。


# レビュー指摘分類リストを検討する

レビュー指摘分類リストのありがち例
 - 指摘
 - 質問
 - Typo

これは私の行った経験上の指摘分類リストです。
これでは「指摘が多かった」「少なかった」ということしかわかりません。

私は、[JISの品質特性、副特性を利用](http://www.it-innovation.co.jp/2015/09/29-125421/)してしまうという記事を見つけました。


## JIS品質特性、副特性とは

[IPA 独立行政法人 情報処理推進機構](https://www.ipa.go.jp/files/000005106.pdf)のP8-P9
に書かれています。

ソフトウェア品質を評価するための指標に当たるもの。
不具合の指摘をする場合、ソフトウェアの品質に欠陥が発生するから
指摘があるわけで、必ずこの分類のどこかに当てはまると考えられます。


# 原因分類リストを検討する

このぐらいのリストで分類

 - 上位文書の漏れ
 - 上位文書が曖昧
 - 上位文書の認識誤り
 - 設計の誤り
 - 設計の抜け
 - 誤記

これらのリストも[IPA 独立行政法人 情報処理推進機構](https://www.ipa.go.jp/files/000005106.pdf)に書かれている
ソフトウェア品質低下する事例としてあげられているものを原因文類に変換しました。



# まとめ

JISのソフトウェア品質を流用したレビュー記録表の指摘分類リストと原因分類リストは、
幅広いプロジェクトでそのまま横展開可能で使用者へ説明も行いやすく、
ほぼ抜け漏れが無いリストになっていると感じました。

強いてあげれば、どうしても分類できない場合のために
「その他」でもつけてあげればいいのでは無いでしょうか。
Javascript での 正規表現 の エスケープ について

## Javascript ： 正規表現 の エスケープ について

* `. * + ^ | [ ] ( ) ? $ { } `などの文字を文字列として正規表現の判定内で使いたい場合エスケープしなければならない。  
* 正規表現リテラルで表す場合は、スラッシュ`/`もエスケープしなければ区切り文字として認識されるので気をつける。


### 文字列リテラル(new RegExp("~")) の場合は、バックスラッシュは２つ必要。

`"\\."`  `"\\*"` `"\\+"` ... となる。

下記の例では、バックスラッシュは１つでエスケープしたものは、文字列の「.」としてみなされず、正規表現のドット（改行文字以外のどの 1 文字にもマッチ）として判定される。[X]

```
"a".match(new RegExp("\."))
-> ["a"]
```

バックスラッシュ２つの場合は、ドットが文字列として認識されるので、下記の例で "a" とはマッチしない。[◯]

```
"a".match(new RegExp("\\."))
-> null
```

### 正規表現リテラルの場合は、バックスラッシュは１つでよい。

match(/~/)

`"\."` `"\*"` `"\+"` ... となる。

下記の例は、正規表現リテラルでドット（改行文字以外のどの 1 文字にもマッチ）を表したもので、"a" とマッチする。

```
"a".match(/./)
-> ["a"]
```

下記の例は、ドットを文字列としてエスケープしているので、"a" とはマッチしない。

```
"a".match(/\./)
-> null
```
よく使う Sketch のショートカットキー

意外と便利なショートカット一覧、随時更新予定です。

### アートボード

|操作名|ショートカットキー|
|---|---|
アートボードを移動|fn + [←, →]
ページを移動|fn + [↑, ↓]

### レイヤー

|操作名|ショートカットキー|
|---|---|
レイヤー名を変更 | command + [R]
下のレイヤーを選択 | tab
上のレイヤーを選択 | shift + tab
下層レイヤーを選択 | return
上層レイヤーを選択 | esc
レイヤーを上・下に移動 | command + option + [↑, ↓]
レイヤーを最上・最下に移動 | command + option + control + [↑, ↓]
レイヤーをグループから出す | command + option + shift + [↑]

レイヤー名を変更できる状態で上下レイヤーを選択（tab キーを押下）すると、
そのまま対象のレイヤーの名前も変更できます。

### オブジェクト

|操作名|ショートカットキー|
|---|---|
1px 移動 | [↑, →, ..]
10px 移動 | shift + [↑, →, ..]
サイズを 1px 調整（左上基準） | command + [↑, →, ..]
サイズを 10px 調整（左上基準） | command + shift + [↑, →, ..]
カラーピッカー（背景色） | control + [C]
フォントサイズを変更 | command + option (+ shift) + [=]
ボーダーの追加・ON/OFF | [B]
テキストの左寄せ | command + shift + [
テキストの中央寄せ | command + shift + ¥
テキストの右寄せ | command + shift + ]
Google ドキュメントのクォーテーション

Google ドキュメント(docs)にシングルクォーテーション、ダブルクォーテーションを入力すると
きれいなクォーテーションが挿入されることがあります。
![google-docs_smart.PNG](https://qiita-image-store.s3.amazonaws.com/0/15783/c8f27f86-85c7-4af2-6fb3-8dd5ddd5f7af.png)

文章を書く分には問題ないのですが、コードを入力し、別のエディタに貼り付けるとクォーテーションと認識されず、コンパイルエラー等になります。
それは、このクォーテーションが通常のクォーテーションではなく、Unicodeの\u2018, \u2019, \u201C, \u201Dに変換されているためです。

これを防ぐには、
1. 別のエディタ等からコピー＆ペーストする
か、
2. メニューの"ツール"⇒"設定"で、"スマート クォートを使用"のチェックを外す ![google-docs_settings.PNG](https://qiita-image-store.s3.amazonaws.com/0/15783/0eda1735-a60f-5b20-724e-20c2de47e866.png)

ことで解消できます。
設定を変更して入力したのがこちらです。
![google-docs_not-smart.PNG](https://qiita-image-store.s3.amazonaws.com/0/15783/56ecea42-a176-8dd3-2f0e-ad0517572533.png)
R > LETTERS[-(2:25)] > "A" "Z" / ベクトルから特定のインデックスのものを除外

```txt:動作環境
RStudio 0.99.903 on Windows 7 pro
R version 3.3.1 
```

ビルトインのLETTERSというものには"A"から"Z"までのアルファベットが入っている。
これはオブジェクトのタイプとしては「ベクトル」らしい。
@ Rで学ぶデータ・プログラミング入門 by 石田基広さん

その中で、除外の方法を以下に試した。

```R
> LETTERS[-(2:25)]
[1] "A" "Z"
```

"B"から"Y"までを除外。
Swift3.0でコンパイル出来ない型n選

Xcode8、並びにSwift3.0がリリースされました。めでたい🎉

しかし、Swift2.2まではコンパイルに通っていたが、Swift3.0では通らなくなった型があります。
全体的にちゃんと調べてないので、それが仕様なのかバグなのかについては親切な人が教えてくれると思います。

## 制約付きassociatedtypeを束縛するGenerics関数
制約に他のprotoclを持つassociatedtypeを宣言したprotocolを2つ定義し、Generics関数でassociatedtype同士を束縛します。

```swift
protocol A {}
protocol B {
    associatedtype X: A
}

protocol C {}
protocol D {
    associatedtype Y: C

    func hoge<Z: B>(v: Z) where Z.X == Y
}
```

Generics関数を持つprotocol (D) の具体型を実装すると、コンパイルが通らなくなります。

```swift
// 素直に実装してみる。🙅
class O<P: C>: D {
    typealias Y = P

    func hoge<Z: B>(v: Z) where Z.X == P {

    }
}

// protocol extensionに実装を逃がしてみる。🙅
extension D {
    func hoge<Z: B>(v: Z) where Z.X == Y {

    }
}

class Q<R: C>: D {
    typealias Y = R
}
```

### workaround

Genericsの対象となるprotocolのassociatedtypeから束縛を外せば、コンパイルが通るようになります。

```swift
// everything is ok! 🎉
protocol A {}
protocol B {
    associatedtype X //: A
}

protocol C {}
protocol D {
    associatedtype Y: C

    func hoge<Z: B>(v: Z) where Z.X == Y
}

class O<P: C>: D {
    typealias Y = P

    func hoge<Z: B>(v: Z) where Z.X == P {

    }
}

extension D {
    func hoge<Z: B>(v: Z) where Z.X == Y {

    }
}

class Q<R: C>: D {
    typealias Y = R
}

```

或いは、protocolから関数の宣言を取り除けばコンパイルが通るようになります。

```swift
protocol A {}
protocol B {
    associatedtype X: A
}

protocol C {}
protocol D {
    associatedtype Y: C

//    func hoge<Z: B>(v: Z) where Z.X == Y
}

class O<P: C>: D {
    typealias Y = P

    func hoge<Z: B>(v: Z) where Z.X == P {

    }
}

extension D {
    func hoge<Z: B>(v: Z) where Z.X == Y {

    }
}

class Q<R: C>: D {
    typealias Y = R
}
```

protocol extensionに生やした関数を他の型で再実装した時の挙動を考えると、associatedtypeの制約をゆるくしたほうが安全だと思います。
ただ、`B.X`の制約がないと困るケースが考えられますが、それについては`B`を拡張した別のprotocolで束縛して、そこから下にextensionで実装をぶら下げるしか無さそうです。


## 同じprotocolを制約に持つassociatedtype
ひとつ前のパターンの凶悪なやつです。workaroundが減ります。
この場合は、protocolにおける関数の宣言の有無に関わらず、Generics関数を持つ具体型が実装出来なくなります。

```swift
protocol A {}
protocol B {
    associatedtype X: A
}

protocol C {
    associatedtype Y: A
}

// 🙅
class O<P: C>: C {
    typealias Y = P

    func hoge<Z: B>(v: Z) where Z.X == P {

    }
}

// 🙅
extension C {
    func hoge<Z: B>(v: Z) where Z.X == Y {

    }
}

class Q<R: C>: C {
    typealias Y = R
}

// global func は 🙆
func hoge<S: B, T: C>(v1: S, v2: T) where S.X == T.Y {

}
```

### workaround

この場合はassociatedtypeからprotocolを取り外す他にないでしょう。
associatedtypeの束縛は、宣言した大元のprotocolのサブセットに任せ、具体的な実装はglobal funcに持たせるしか無さそうです。とてもつらい




## 以下見つけ次第追記
R > Link > naming conventionへのリンク

2012年のPDF資料
https://journal.r-project.org/archive/2012-2/RJournal_2012-2_Baaaath.pdf

4つほどのnaming conventionsへのリンクがある。

そのconventionsでcamelCaseがいい、とかunderscore separatedがいい、とかあるので迷うところである。
FacebookのBOTで何度も同じレスポンスが返ってくる時の対処法

# Facebook Messangerにおけるエラー
Facebook Messanger上でBOTを開発し始めた矢先、奇妙なエラーに長い時間はまってしまった。

この下の画像が証拠の画像なのだが、一つのメッセージのリクエストに対して、一定時間ごとに同じレスポンスが返ってきてしまっている。

<img width="375" alt="IMG_1151.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/78362/02c27a18-34b3-07b8-5409-184582e1b295.jpeg">

このエラーを**いかに対処したかという方法**をシェアしたいと思う。


#書いていたコード
こちらが書いていたコードの一部抜粋である。一見トークンもちゃんとリクエストで送られていたりとしっかりしているように見える。
しかし、上記の通り何度も同じレスポンスが返ってきてしまっていた。

```js:before
http.createServer(function (req, res) {
    if (!req.url.match(/\/zip|\/\?hub\.mode/)){
        res.statusCode = 404;
        res.setHeader('Content-Type', 'text/plain');
        res.end('error');
        return;
    } else if (req.url.match(/\/\?hub\.mode/)){
        var param = url.parse(req.url,true);
        if (param.query['hub.verify_token'] === '***') {
            res.end(param.query['hub.challenge']);
        } else {
            res.end('Error, wrong validation token');
        }
        return;
    }
    if(req.method=='POST') {
        var body='';

        req.on('data', function (data) {
            body +=data;
        });
        req.on('end',function(){

            qs.parse(body);

            //決められたテキストや画像や音声を送るメソッド
            sendResponse(JSON.parse(body), res);
        });
    }else if(req.method=='GET') {
        res.end('');
    }
}).listen(process.env.PORT || 5000);


```


# Facebookのリファレンスを見ると
[Stackoverflow](http://stackoverflow.com/questions/39432669/facebook-messenger-bot-with-trouble-receiving-the-same-responses-every-minute)で質問してみたところ、[リファレンス](https://developers.facebook.com/docs/messenger-platform/webhook-reference)をよく見ろとの言葉が。(海外エンジニアの優しさが身にしみます)

要するに、**「webhookのコールバックではFacebookからのレスポンスがちゃんと来たことを知らせるために、200のステータスコードを持つレスポンスを送る必要がある」**と書いてある。
>Response
Your webhook callback should always return a 200 OK HTTP response when invoked by Facebook. Failing to do so may cause your webhook to be unsubscribed by the Messenger Platform.

Facebookとしてみたら、いつまでたっても**ちゃんと届いたというレスポンスがないため**に、同じメッセージが何度も送られていたようである。


こちらが修正したコードである。

```js:after
if(req.method=='POST') {
        var body='';

        req.on('data', function (data) {
            body +=data;
        });
        req.on('end',function(){

            qs.parse(body);
            sendResponse(JSON.parse(body), res);

            //以下追記したコード
            res.statusCode = 200;
            res.end('');


        });
```


#まとめ
たった2行のコードがないために、ちょっとしたエラーが起きてしまった。BOT開発に慣れていないために、少し戸惑ってしまった。困ったらリファレンスに戻る癖をつけていこうと再認識した。
R > _test<-1:5 > Error: unexpected input in "_" > オブジェクト名の最初に"_"は使えない

```txt:動作環境
RStudio 0.99.903 on Windows 7 pro
R version 3.3.1 
```

以下の実行をしてエラーが出た。

```
> _test<-1:5
Error: unexpected input in "_"
```

オブジェクト名の最初に"_"が付くとエラーが出る。

一方で、オブジェクト名の途中に"_"が付くのはいいようだ。

```
> a_b<-1:5
```

"_"をオブジェクト名の途中に使うかどうかは、複数見つかる「Rのnaming convention」で賛成と反対の意見があるようだ。
Packerでansible-vaultのパスワードをoption引数で渡す方法

## 背景
packerでansible-vault使ってami生成したかった。
ansible-vaultの復号化passwordはgithubなどにあげたくないので、コマンド入力時に入力したかった。
イメージは以下のような使用方法。

```bash:打ちたいコマンド

packer build -var 'vault_pass=some-pass' packer.json
```

ansible-vaultの複合化パスの渡し方は2つ。
1. --ask-vault-pass オプションでプロンプトで入力する
2. --vault-password-file オプションでパスが書いてあるファイルパス渡す

2を使って無理やり実現できるようにしたのでメモ。もっといい方法あったら教えてください。

## packerのjsonファイル

```json:packer.json

{
  "variables": {
    "aws_access_key": "HOGE",
    "aws_secret_key": "FUGA",
    "vault_pass": ""
  },
  "builders": [{
    "type": "amazon-ebs",
    "access_key": "{{user `aws_access_key`}}",
    "secret_key": "{{user `aws_secret_key`}}",
    "region": "ap-northeast-1",
    "source_ami": "ami-374db956",
    "instance_type": "t2.micro",
    "ssh_username": "ec2-user",
    "ami_name": "name"
  }],
  "provisioners": [{
    "type": "shell",
    "inline": [
      "sudo yum -y update",
      "sudo yum -y --enablerepo=epel install ansible",
      "mkdir -p /tmp/packer-provisioner-ansible-local/",
      "touch /tmp/packer-provisioner-ansible-local/vault.txt",
      "echo {{user `vault_pass`}} > /tmp/packer-provisioner-ansible-local/vault.txt"
    ]},{
    "type": "ansible-local",
    "playbook_file": "playbook.yml",
    "extra_arguments": ["--vault-password-file vault.txt"]
    }]
}
```

これでコマンド叩くとうまくいった

##参考
http://docs.ansible.com/ansible/playbooks_vault.html
https://www.packer.io/docs/provisioners/ansible-local.html
https://www.packer.io/docs/templates/user-variables.html
AWSを使って、サーバレスアーキテクチャで、問合せフォームを作った

# ■実際のフォーム画面
* 諸事情により公開できません。。。 :bow: 

# ■なぜこれをやったか
* サーバレスアーキテクチャによる何かを作ってみたかった

# ■利用技術
* Lambda
* API Gateway
* S3 bucket and static web hosting
* Cloud Front
* Node.js 4.3
* Bootstrap3.3.6 / Jquery 1.12.4
* npm
    * nodemailer
    * async
    * aws-sdk
    * date-utils
    * https
    * jwt-simple
    * querystring
    * validator

# ■アーキテクチャ
![9ec0b8d2-9163-7121-8b6f-e12394466a65.png](https://qiita-image-store.s3.amazonaws.com/0/14268/817ae65a-e53a-54ad-c32a-566b8c764382.png)

# ■改善点
* メールやChatWorkへ通知ができるならもう、電話(Twilioとか使って) :calling: しちゃいたい
    * そしたら障害連絡とかにも使えそう :grin: 
* さらにすぐに対応が必要なチケットとして、Redmineなどのツールへ障害対応チケットを作成するとかもいいかも？

# ■参考サイト 
- [nodemailerでNode.jsからメールを送る - ZeBeVogue別館](http://d.hatena.ne.jp/zebevogue/20120812/1344733747)
- [CloudWatchのAlermをLambda通じてchatworkにPOSTする - Qiita](http://qiita.com/zaru/items/bab992b9438f07740eb9)
- [Amazon S3の画像をAWS Cloudfrontで配信するキャッシュコントロールをAWS Lambdaで自動化する ｜ Developers.IO](http://dev.classmethod.jp/cloud/aws/s3-cache-control-by-using-lambda/)
- [Amazon CloudFrontとRename Distributionパターンの実装 ｜ Developers.IO](http://dev.classmethod.jp/cloud/amazon-cloudfront-rename-distribution-impl/)
- [問い合わせフォームもサーバレスでDevOps!　(Github,CircleCI,AWS lambda/cognito/ses)　後編 - Qiita](http://qiita.com/toguma/items/a30dc43f6bfad7088bcd)
Go 言語のチャネル型の宣言で矢印が付いているものと付いていないものの違いとは

# 前提
* チャネル型の宣言で矢印が付いていないものとは `var c chan int` とかのこと
* チャネル型の宣言で矢印が付いているものとは `func foo() <-chan int` とか `var c chan<- float32` とかのこと

# 結論
* `chan T` は T 型の値を送受信可能 
* `chan<- T` は T 型の値を送信のみ可能
* `<-chan T` は T 型の値を受信のみ可能

# 補足
* [Goプログラミング言語仕様](http://golang.jp/go_spec#Channel_types) に記載はあるが知らずに出くわした時にググラビリティが低くちょっと困ったのでメモ
MSYS2のログインシェルをzshに変更する（msys2-launcher対応版）


## はじめに

久々にMSYS2の更新を行ったところ、どうやら`exe`経由での起動方法に変更されたようだ。

参考: [pacman -Syu で更新したら msys2 や mingw32/64 が起動しなくなった…(震え声](http://qiita.com/xerespm/items/d9175ec7c21154c19564)

`cmd`経由での起動であれば[MSYS2でWindowsにzsh環境を導入する](http://qiita.com/magichan/items/7702d7865deaaca2ad44#zshをログインシェルに設定する)や[MSYS2でデフォルトシェルをzshにする](http://qiita.com/ymotongpoo/items/8583529c660b2443526b)にある方法でログインシェルの変更が出来たが、`exe`経由となったためこれらの方法は使えなくなってしまった。

調べてみると割と簡単に変更できたので、変更方法を共有したい。

## 情報元

[elieux/msys2-launcher](https://github.com/elieux/msys2-launcher/)のIssueを見てみると、以下のような投稿が見つかった。

> You can either set the login shell of everyone using your MSYS2 installation using nsswitch.conf or use mkpasswd -c to create an /etc/passwd entry that you can modify.

(引用元: [Add an ability to configure default shell #3](https://github.com/elieux/msys2-launcher/issues/3#issuecomment-193978781)）

## 方法1: `/etc/nsswitch.conf`を修正する

`/etc/nsswitch.conf`を何かしらのエディタで開き、下記のようになっているところを、

```
db_shell: cygwin desc
```

こう変える。

```
#db_shell: cygwin desc
db_shell: /usr/bin/zsh
```

変更後に`exe`を再度起動すると、`zsh`が立ち上がる。

## 方法2: `/etc/passwd`を作成して修正する

デフォルトでは`/etc/passwd`がないため、`mkpasswd -c`でファイルを作る。

```shell-session
$ mkpasswd -c > /etc/passwd
```

その後、行末の`/usr/bin/bash`を`/usr/bin/zsh`に修正すればよい。

## 蛇足: `/etc/nsswitch.conf`と`/etc/passwd`ではどちらが優先される？

試してみたところ、`/etc/passwd`に書いたほうが立ち上がるようだ。
Vagrantのglobal-statusを高速かつBoxのバージョンも確認できるようにする

Vagrantで複数環境を管理するとvagrant global-statusを多用するのですが、遅くていらいらさせられるのと、Boxの名前やバージョンが分からないので、[jq](https://stedolan.github.io/jq/)と[q](http://harelba.github.io/q/)で代替品を作成しました。Windows用ですが、他の環境でも参考になると思います。

下記の内容で vagrant-global-status.bat を作成します。

```bat:vagrant-global-status.bat
@ECHO OFF
jq -r ".machines | to_entries[] | \"\(.key[0:7]) \(.value.name) \(.value.provider) \(.value.state) \(.value.vagrantfile_path) \(.value.extra_data.box.name) \(.value.extra_data.box.version)\"" < %USERPROFILE%\.vagrant.d\data\machine-index\index | q -b -E cp932 "SELECT * FROM - ORDER BY c5"
```

#### 実行例 ####

vagrant global-statusとvagrant-global-status.batの実行結果の比較です。vagrant-global-statusはboxの名前とバージョンが確認できます。

```
C:\home>vagrant global-status
id       name    provider   state    directory
-------------------------------------------------------------------------
de09131  default virtualbox poweroff C:/home/docker
123ecfb  default virtualbox running  C:/home/vagrant-oracle12.1

The above shows information about all known Vagrant environments
on this machine. This data is cached and may not be completely
up-to-date. To interact with any of the machines, you can go to
that directory and run Vagrant, or you can use the ID directly
with Vagrant commands from any directory. For example:
"vagrant destroy 1a2b3c4d"

C:\home>vagrant-global-status
de09131 default virtualbox poweroff C:/home/docker             boxcutter/ubuntu1604 2.0.21
123ecfb default virtualbox running  C:/home/vagrant-oracle12.1 boxcutter/ol72       3.0.7

```
AmazonS3にAkamai-DSDをつなぎこんだ話


Appleの規定のおかげで、CDNをhttpsに対応させなきゃならなくなったのでAkamaiとS3を使った形を作ってみたお話。
※つらつらと備忘録のつもりで書いたのでわかりにくかったらごめんなさい

# 前提
- Akamaiでhttpsを使おうとするとオリジン側もhttpsに対応していることが前提だそうな。<br>Client-Edge間をSSL化するならオリジンもSSL化して、OriginからClientまでSSL通信のがセキュリティ上望ましい・・・のはわかる。
- AmazonS3のStatic Website Hostingはhttpsに対応していない。

## さてどうすっかー(選択肢)
1. CloudFrontに切り替える。<br>
AWS同士なので一番楽。けど、残ったAkamaiどうするという問題が。
2. AkamaiとS3の間にELB-EC2を挟んでOrigin化する。<br>
コスト増＋運用面倒だが、nginxのReverseProxyによるOriginアクセスの担保とELBによるSSL対応が可能。
3. AkamaiとS3の間にCloudFrontを挟む。<br>
CloudFront単体で配信できるっしょｗ
4. AmazonS3のLinkアドレスを使う。<br>
S3のファイルプロパティの所にhttpsのアドレスが書いてある。<b>これ使えそう。</b>

## S3のhttpsアドレスでやってみよう
1. まずはオリジンとなるS3の確認<br>
![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/96605/275673fb-0078-4928-5e10-878169543a8d.png)<br>
https://s3-ap-northeast-1.amazonaws.com/[BucketName]/ がオリジンになる。
2. Akamaiのオリジン設定に放り込む
![Akamai_OriginSetting.PNG](https://qiita-image-store.s3.amazonaws.com/0/96605/d2aae247-426f-6695-0db0-1e3f4954ad5f.png)<br>
![Akamai_OriginBasePath.PNG](https://qiita-image-store.s3.amazonaws.com/0/96605/20621134-e55a-3e51-ac13-183bbeaccee5.png)<br>
オリジンサーバのホスト名を、上記のドメイン部分を設定<br>
[s3-ap-northeast-1.amazonaws.com]を設定<br>
オリジンベースパスにディレクトリ部分<br>
[BucketName]<br>
<br>
オリジンの設定はこれだけ。S3へのhttpsアクセスが解放されていればAkamaiからもアクセス可能になっているはずです。

## 結果こうなった
![https化.png](https://qiita-image-store.s3.amazonaws.com/0/96605/73fd7fcd-f5ee-ac2e-570b-d929f8d2e1c1.png)

## <b>注意点</b>
- このオリジン設定だとDirectoryIndexが効きません。<br>
そのため全てのパスを絶対指定してください。<br>
ディレクトリ指定で終わる場合は403が返ってきます。
- クライアントとアカマイ間の設定は、ここに書いていません。
rsyncとtar+mvで作るmac上のThunderbirdのデータバックアップ

今更感はありますが、mac+thunderbird使い向けのメールデータのバックアップ設定を、自身の備忘録として書き出します。LAN内でsambaで接続可能なサーバがある環境下でのご活用の参考になればと。

 # "{}"で囲んだ値は各自のローカル環境に併せて変更して下さい。

#1.rsyncを用いた同期バックアップ

```vim:/Users/{ローカルユーザ}/rsync_thunderbird.sh
#!/bin/sh

# mount @{サーバIP}
/sbin/mount_smbfs //{ユーザ}:'{パスワード}'@{サーバIP}/{サーバdir} {ローカルマウントdir}

# rsync files to @{サーバIP}
/usr/bin/rsync -rlopgtu --delete /Users/{ローカルユーザ}/Library/Thunderbird {ローカルマウントdir}

# unmount @{サーバIP}
/sbin/umount {ローカルマウントdir}
```

#2.tar+mvを用いた世代管理バックアップ

```vim:/Users/{ローカルユーザ}/archive_thunderbird.sh
#!/bin/sh

# mount @{サーバIP}
/sbin/mount_smbfs //{ユーザ}:'{パスワード}'@{サーバIP}/{サーバdir} {ローカルマウントdir}

# move to work dir
/usr/bin/cd /Users/{ローカルユーザ}/Library/

# archive Thunderbird DIR
/usr/bin/tar -czvf /Users/{ローカルユーザ}/Library/`date "+%Y%m%d"`_Thunderbird.tar.gz /Users/{ローカルユーザ}/Library/Thunderbird/

# move archive file to @{サーバIP}
/bin/mv /Users/{ローカルユーザ}/Library/`date "+%Y%m%d"`_Thunderbird.tar.gz {ローカルマウントdir}

# unmount @{サーバIP}
/sbin/umount {ローカルマウントdir}
```
 ※/Users/{ローカルユーザ}/Library/」に移動するのは余剰なディレクトリを介さない様にするちょっとした手間を加えただけです。

shファイルへの実行権限追加もお忘れなく。

```
chmod +x /Users/{ローカルユーザ}/rsync_thunderbird.sh
chmod +x /Users/{ローカルユーザ}/archive_thunderbird.sh
```

あとはcrontabに登録します。

```
00 09 * * * /bin/sh /Users/{ローカルユーザ}/archive_thunderbird.sh 1>/dev/null 2>/dev/null
00 09,12,17 * * * /bin/sh /Users/{ローカルユーザ}/rsync_thunderbird.sh 1>/dev/null 2>/dev/null
```

「標準出力/標準エラー」の各ログを残しておきたいのであれば「/dev/null」に突っ込まず、適切に書き出し先を指定しておく様にしましょう

他のバックアップの実装より仕様用途を広げて使えるのではないかと思います。
また、Thunderbirdのみとせず、他のバックアップにも用途として向くのであれば利用してみては如何でしょうか？

以上。
Android addViewするときにフェードインなどのアニメーションを付けたいときの方法

検索フォームでフォーカスが当たったらあるviewに入れ替えるってやつを

```
view.addView(otherView);
```

で実装していたんですが、ある日

> フェードインで表示して欲しい

って要望が来たのでどうやればいいのかなって思って調べたんですが、やり方はいろいろあるっぽい。

## パターン1 AnimationUtils
```
view.addView(otherView);
Animation animation = AnimationUtils.loadAnimation(getContext(), R.anim.fade_in);
otherView.startAnimation(animation);
```

## パターン2 AlphaAnimation
```
view.addView(otherView);
// フェードアウトの場合はnew AlphaAnimation(1, 0);
AlphaAnimation animation = new AlphaAnimation(0, 1);
animation.setDuration(500);
otherView.startAnimation(animation);
```

## パターン3 ObjectAnimator
```
view.addView(otherView);
otherView.setAlpha(0.0f);
ObjectAnimator animation = ObjectAnimator.ofFloat(otherView, "alpha", 1.0f);
animation.setStartDelay(500);
animation.start();
```

意外と簡単にできる！

### 参考URL
http://stackoverflow.com/questions/7432375/how-to-animate-an-adding-of-a-view-in-android
http://qiita.com/kazy/items/0ef55e1d750a49a9192f
http://cleanings.jp/develop/2807
http://blog.ch3cooh.jp/entry/20130122/1358846834
Apache Mesos 入門してみた


<img src="https://mesosphere.com/wp-content/themes/mesosphere/library/images/views/why-mesos/mesos-logo.png?v1" width="50%">
他の記事の引用まとめメモみたいになってます。
__これからも随時編集していきます__

##Mesosとは
カリフォルニア大学バークレー校の研究機関AMPLabのプロジェクトを起源としてるらしい`Spark`とおなじところ

http://blog.livedoor.jp/sonots/archives/35421955.html

>リソース効率の高い分散システムを簡単に作れる。
Apache Mesos は、分散アプリケーション or フレームワークに対して、効率的なリソース分離、共有を提供するクラスタ管理ソフトです。Mesos を使うと、ノードの動的共有プール上で Hadoop, MPI, Hypertable, Spark, その他のアプリケーションを走らせることができます。

https://oss.sios.com/guest-blog/guest-bog-20150915

> 特にMesosが注目され始めた理由には、話題のインメモリ処理基盤ソフトウェアのApache Sparkやコンテナー管理ソフトウェアのDockerへの対応があげられます。
> インメモリの分析基盤ソフトウェアであるApache Sparkのリソース管理のソフトウェアとして、Mesosを選択することができますし、資源管理ソフトウェアを使って、管理対象の物理サーバー上で稼働するDockerコンテナーでアプリケーションを実行することができます。このように、Mesosは、ヘテロな分散環境における資源管理ソフトウェアとして、ビッグデータ、コンテナー技術、HPCなどの異業種を巻き込んでいます。(画像も上記サイトより引用)
![image2](https://oss.sios.com/guest-blog/guest-blog-image/guest-bog-20150915_05/@@images/b39c6fdd-952c-40ca-a3c7-07f0b0f31353.png)

```
[特徴]
ZooKeeper を使ったフォールトトレラントな複製マスター
10,000 ノードのスケーラビリティ
Linux コンテナとタスク間の分離
マルチリソーススケジューリング (メモリとCPU)
新しい並列アプリケーションを開発するための Java, Python, C++ のAPI
クラスタの状態を表示するためのWeb UI
```

##YARNとMesosの違い
http://kimutansk.hatenablog.com/entry/20131104/1383496192

> Mesosはリソースの割り振りをLinuxコンテナ（LXC）を用いて実現している。
YARNは単にLinuxのプロセスを制御しているのみ。

https://www.hadoop-times.com/press-release-mapr-2015-0310.html

これは`Immutable Infrastructure`を考えるとき、`Mesos`の方がいいのかなという印象

##Immutable Infrastracture

http://www.publickey1.jp/blog/14/immutable_infrastructure_1.html
http://blog.mirakui.com/entry/2013/11/26/231658

> Windowsって調子が悪くなると再インストールしてすっきりさせるじゃないですか。OSにいろんなソフトウェアをインストールしたりカスタマイズしたりすると調子が悪くなりますが、再インストールすれば戻ります。
だったら、そもそも毎回作り直せばシステムはすっきりするよね、というのが簡単なImmutable Infrastructureの説明です。

##アーキテクチャ
http://kimutansk.hatenablog.com/entry/20131012/1381570285

##Mesos × HPC
https://oss.sios.com/guest-blog/guest-bog-20150915

> Mesos は、Apacheコミュニティが手掛けるオープンソースのプロジェクトで、クラスター管理システムのソフトウェアとして位置づけられています。日本では、「クラスター」というと、データベースなどが共有ストレージと共に稼働する高可用性(*1)クラスター（HAクラスター）を思い浮かべる方もいるかもしれませんが、Mesosにおけるクラスターとは、高可用性クラスターのことを意味するのではなく、分散ヘテロ環境の計算資源をひとまとめにしたものを意味します

```
(*1):高可用性（こうかようせい、英: High Availability; ハイ・アベイラビリティ、HA）は可用性が高いことを示すIT用語。
システムなどにおいて、サービス提供が出来なくなる事態の発生頻度が少ないことを指す。
また、そのようなシステムをHA構成などと呼称する。
```

##Mesos × Spark

http://blog.katty.in/6716

環境構築
http://kimutansk.hatenablog.com/entry/20131007/1381102379
http://kimutansk.hatenablog.com/entry/20131008/1381184646
http://kimutansk.hatenablog.com/entry/20131010/1381359054
CakePHP3.xでControllerの一部メソッドをモック化する

動機はこちらと全く一緒。メール送信処理メソッドで`exec()`してるので
Controllerのテストではそのメソッドの処理を実行したくなかった。
http://qiita.com/ran/items/85e39821f856deb537a4

```php:HogeController.php
/**
 * 確認依頼.
 *
 * @param  string|null $id
 * @return \Cake\Network\Response|null
 * @throws \Cake\Network\Exception\MethodNotAllowedException When illegal method.
 * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found.
 */
public function confirm($id = null)
{
    $this->request->allowMethod(['put', 'patch', 'post']);

    $this->loadModel('Content');
    $feed = $this->Content->get($id);
    $data = $this->request->data;

    $validator = new HogeValidator();
    if (count($validator->confirm->errors($data)) === 0) {
        // DB登録とか
        if ($this->hogefuga($data)) {
            $this->Flash->error(__('HOGE'));
            return $this->redirect(['action' => 'edit', $id]);
        } else {
            // メール送信処理
            $this->sendMail($id);
            $this->Flash->success(__('FUGA'));
            return $this->redirect(['action' => 'list']);
        }
    } else {
        $this->render('edit');
    }
}

/**
 * メール送信
 *
 * @param int $id
 * @return void
 */
protected function sendMail($id)
{
    exec('php ' . ROOT . DS . 'bin' . DS . 'cake.php send_mail ' . escapeshellarg($id) . ' > /dev/null &');
}
```

```php:HogeControllerTest.php
/**
 * confirm-01
 *
 * [テストケース]
 * ・確認依頼
 * [期待結果]
 * ・確認依頼が完了し、一覧画面にリダイレクトすること
 */
public function testConfirm01()
{
    $params = [
        'title' => 'hoge hoge',
    ];

    // create Request.
    $request = new Request(['post' => $params]);    //POSTデータセット

    // これ両方ないと、POSTとして送信してくれない
    $request->env('REQUEST_METHOD', 'POST');
    $request->env('ORIGINAL_REQUEST_METHOD', 'POST');
    //DB登録時にSession情報が必要なので付与
    $request->session()->write('Auth.User.login_id', 1);

    // create Response.
    $response = new Response();

    // create mock.
    $mock = $this->getMockBuilder('App\Controller\HogeController')
        ->setMethods(['sendMail'])
        ->setConstructorArgs([$request, $response])
        ->getMock();

    // メール送信メソッドは1回だけ呼ばれる
    $mock->expects($this->once())
        ->method('sendMail')
        ->with($this->equalTo(5))
        ->will($this->returnValue(null));

    $result = $mock->confirm(5);

    // assertion.
    $this->assertEquals($result->statusCode(), 302);
    $this->assertEquals($result->location(), '/list');
}
```

だいぶ無理やり感がある。
GCP service accountを利用してgoogle container registryにpushする

# tl:dr

gcr.ioにサービスアカウントでpushする方法がわかんなかったので調べた。

1. サービスアカウント(JWT)発行
1. containerが保存されているbucketのWrite権限を与える
1. `$ gcloud auth activate-service-account --key-file $json_file`
1. `$ gcloud docker push ${image}`

- - -

# 概要

同一GCP Projectなら何も考えずに docker pushできるけど
別プロジェクトだと出来ないからservice account使ってよろしくやる。

## 結局IAMにどのpermissionが必要か？

サービスアカウントにどんな権限が必要なのか調べたら

### containerが保存されているgoogle strageのRead/Write権限

とのこと

google container registryを利用してるProjectの
bucket listを覗いてるとなんかそれっぽいbucketができてる

### container bucketに作ったサービスアカウントのWrite権限を追加する

e.g. `artifacts.your_project.appspot.com`

![gcr_bucket.png](https://qiita-image-store.s3.amazonaws.com/0/24105/c94bd8df-70d8-9d5d-3c95-a17213806133.png)

# docker push

~~~
$ docker build -t gcr.io/your_project/sugoi-container:latest  .
$ gcloud auth activate-service-account --key-file $json_file
$ gcloud docker push gcr.io/your_project/sugoi-container:latest
~~~

- - -

# Jenkins Pipelineでやる場合

おまけ

### 前提

* jenkinsにsecret fileとしてサービスアカウントのJWTを登録しておく
  * e.g. `gcr-key`
* jenkinsは`gcloud` commandが実行可能


~~~groovy
  def imageTag = "gcr.io/your_project/image:build-${env.BUILD_NUMBER}"
  docker.build("${imageTag}")


  withCredentials([[$class: 'FileBinding', credentialsId: 'gcr-key', variable: 'JSON_KEY']]) {
    sh 'gcloud auth activate-service-account --key-file $JSON_KEY'
  }
  sh("gcloud docker push ${imageTag}")
~~~

jenkinsにgcloudコマンド入れたくないよって場合 docker login使う方法もある。

# 追記

gcloud auth activate-service-accountすると
gcloud commandのアカウントが切り替わった状態になるので注意すること。

# 参考資料

docker login使う方法とかも書いてる
https://cloud.google.com/container-registry/docs/advanced-authentication
VB.NET超初心者用メモ

# はじめに
ひと月前ほどから仕事でVisualBasic(2015)を使い始めたので、その時にVisualBasic特有(?)で困った事など、超初心者用のメモです。VisualBasicとは関係なくVisualStudio全般の話も混じってるかもしれませんが、ご容赦下さい。
参考までに、これまで経験してきた言語としてはC/C++/Java(Android)です。学生時代(遠い昔ですが・・・)に.NETになる以前のVBを触った事も少しありました。

# Intellisense(入力候補)の決定は「Tab」
これ、つい「Enter」で決定したくなるのですが、「Enter」で候補を決定してしまうと文字はきちんと入力されるので良いのですが、直後に改行されてしまいます。「Tab」で決定すれば改行されずに入力候補の決定ができると気が付くまで非常に不便でした。まぁ設定で変えられそうですけどね。

# AndやOrは基本的には使わない
普通に考えたら```And```や```Or```を使って条件式を書くと、式の途中で確定した場合は後続する式を評価しないものだと思ってしまいがちですが、```And```や```Or```では全ての式を評価してしまうようです。```AndAlso```や```OrElse```を使う事で全ての式を評価しないようにできるので、特別な理由がない限り```AndAlso```や```OrElse```を使いましょう。これは過去のVBとの互換性のためでしょうか？

# Stopが予約語
Enumの値に```Stop```を使用しようとしたら怒られる。なんでだろうと思ったら予約語に```Stop```が。結構一般的な名前だからこれは困るんじゃないの？と思ったけど、「エスケープ識別子」ってやつで定義できるようになるらしい。

```vbnet
Public Enum type
    Hoge
    Fuga
    [Stop]
End Enum
```

みたいな感じで角カッコで括ってやるといいらしいです。

# SelectCaseマジ有能
SelectCaseとは、いわゆるSwitchCaseのようなものという認識なのですが、VisualBasicでは以下のような書き方もできるようなのです。

```vbnet
Select Case True
    Case func1()
        ' 処理1
    Case func2()
        ' 処理2
    Case func3()
        ' 処理3
End Select
```

おわかり頂けるでしょうか。通常のSwitchCaseでは式を書くべき場所に```True```という値が入っていて、逆に後に続く```Case```では通常値を書くべきですが、式が書かれています。すなわち通常のSwitchCaseと式と値が逆に書けるようなのです。私にはこの発想自体が全然なくて、こうやって書ける事を知った時には衝撃でした。

# 最後に
VisualBasicを1ヶ月触ってみて、最初は変数宣言する時の

```vbnet
Dim hoge as Integer
```

って書き方がすごい面倒だなとか、波括弧```{}```無いのが不便だなとか、何でわざわざ```function```と```Sub```を使い分けなきゃいけないの？とか、もうクソ言語が！って感じだったのですが、恐らく私がクソなだけだっただけで言語自体はとても良い言語なのでは無いかと思います。私も仕事でVBを扱う事が無かったら、もう一生機会がなかったかもしれませんが、良い経験させてもらいました。今VBやるならC#やるよ、なんて言わず、皆さんも是非VB使ってみて下さい！
Docker 1.13新機能(チェックポイント，HAスケジューラ..)

2016/9/14時点でのgithubの動向に基づく予想．
確定情報ではない．

正式リリース時期はおそらく10月後半か11月前半．


## マージ済み

### Checkpoint (experimental)

https://github.com/docker/docker/pull/22049#issuecomment-245984317

```console
$ docker checkpoint create container1 checkpoint1
```
を実行するとコンテナが停止してスナップショットが撮られる．
内部的にはCRIUを使っている．

後で再開できる．

```console
$ docker start --checkpoint checkpoint1 container1
```

live migrationにつかうべきものではないことに注意．

> This feature is currently focused on single-host use cases for checkpoint and restore. Here are a few:
>
>- Restarting the host machine without stopping/starting containers
>- Speeding up the start time of slow start applications
>- "Rewinding" processes to an earlier point in time
>- "Forensic debugging" of running processes
>
>Another primary use case of checkpoint & restore outside of Docker is the live migration of a server from one machine to another. This is possible with the current implementation, but not currently a priority (and so the workflow is not optimized for the task).

なお，TTY (`docker run -t ..`)はサポートされていない．https://github.com/docker/docker/pull/26515

### `MAINTAINER`廃止

https://github.com/docker/docker/pull/25466

Dockerfile中の`MAINTAINER`命令は廃止される．今後は`LABEL`が推奨される．
既存のDockerfileとの互換性は保たれる．

## マージされそう (主にmilestone:1.13のラベルがあるもの)

### Swarmkit: HA scheduler

https://github.com/docker/swarmkit/pull/1446

タスクをなるべく異なるノードに配置するスケジューリング．
1.13ではデフォルトになる．https://github.com/docker/docker/issues/26259#issuecomment-245472484

### Prometheusサポート

https://github.com/docker/docker/pull/25820

metricsがとれるようになる

### `docker build --squash` (experimental)

https://github.com/docker/docker/pull/22641

イメージのレイヤーをまとめることができるようになる

### Solarisサポート

https://github.com/docker/docker/pull/23397

### CLI整理

https://github.com/docker/docker/pull/26025

## マージされるかも(予想)

### zombie reaper

https://github.com/docker/docker/pull/26061

コンテナ内にinitがいないことによるzombie問題が解消される．
([tini](https://github.com/krallin/tini)に似ている)

### `docker system prune`

https://github.com/docker/docker/pull/26108

使っていないコンテナやイメージをまとめて削除できるようになる．
地味ではあるが，実はユーザに最も恩恵のある新機能かもしれない．

### OCI imageサポート

https://github.com/docker/docker/pull/26369

### Swarmkit: secret store

https://github.com/docker/swarmkit/pull/1511

secretは環境変数やファイルの形で，タスクに露出される

### Swarmkit: topology-aware scheduling

https://github.com/docker/swarmkit/pull/1473
https://github.com/docker/swarmkit/pull/1512

複数のavailable zoneにまたがるようにタスクを配置できるようになる

### Swarmkit: deviceサポート

https://github.com/docker/swarmkit/pull/1355

GPUとかが使えるようになる．

### libnetwork: IPVS NAT

https://github.com/docker/libnetwork/pull/1379

iptablesのルールがuser-definedなものと被る問題が解消される

### Introspection volume

https://github.com/docker/docker/pull/26331

メタ情報がボリュームとしてマウントされるようになる．
例えば`cat /docker/task/slot`を実行するとタスクのスロット番号(nginx.1,nginx.2,..とかの末尾の番号)が見えるようになる．
クエリ結果を新しいテーブルに格納する

個人的備忘録。

#### PostgreSQLの場合…

```sql
select * into [temp] new_table from hoge ...
```

または

```sql
create [temp] table new_table as select * from hoge ...
```
(yancya様、ご指摘ありがとうございます。)

#### MySQLの場合…

```sql
create [temporary] table new_table select * from hoge ...
```
俺は今macでvim8が使いたいんだ

### 追記
homebrewに来ました:angel:

とりあえず、el capitanのdein.vim+powerline.vim環境が動いた。
homebrewに来たらそっちにのりかえよう。

```
cd /usr/local/src/
git clone https://github.com/vim/vim
cd vim
./configure --with-features=huge --enable-multibyte --enable-pythoninterp=yes --enable-fail-if-missing
make
make install

# brewでvim入れてたからなんかエラー吐いた。設定ファイルがないみたい
mv /usr/local/share/vim /usr/local/share/vim.bk
cp -rp /usr/local/share/vim.bk/vim74 /usr/local/share/vim
```
AtCoderに挑戦_ABC045_D問題

# 事始め
[AtCoder](https://atcoder.jp/)というプログラムコンテストがあるのを最近知り, ちょっと挑戦してみた(初級コースですが)のですが, 
時間内にどうしても解決しなかった問題があったので, 復習がてら解いてみたいと思います.

# 問題
今回, 挑戦する問題は[こちら](http://abc045.contest.atcoder.jp/tasks/arc061_b)
(本文引用したいのですが, 引用についての既定がわからなかったのでリンクを貼るだけにしておきます)

問題を読み, もっとも単純な, W * Hの配列を実際に作って, 入力に従ってマスを塗りつぶした後に
全ての3*3エリア(以下単にエリアと呼ぶ)について黒マスの数を数えという総当り的な方法について考えてみたのですが
入力値の最大値は, 縦横両方共10^9, つまりエリアは最大で10^18個くらいできることになる.
流石にこれをループで回すのは処理終わりそうにないので, この方法は使えそうにありません.

しばらく考えて, あるマスを黒塗った際に影響を受けるエリアは, そのマスをふくむ周辺9エリア（最大）のみだろうから,
マスを塗るたびに, その周辺エリアの黒マス含有数を変えていけばいいんじゃないかな？
という発想を得ることができたので, そのまま実装してみることに.

書いたコードはこんな感じ（提出時はもっとごちゃごちゃした書き方でしたが）

```ruby:
h, w, n = gets.chomp.split.map(&:to_i)

areas = Hash.new(0)

n.times {
  i, j = gets.chomp.split.map(&:to_i)

  for y in (i-2..i) do
    if y < 1 || (h - 2) < y then
      next
    end

    for x in (j-2..j) do
      if x < 1 || (w - 2) < x then
        next
      end

      areas[x.to_s + '_' + y.to_s] += 1

    end
  end
}

result = [(h - 2) * (w - 2), 0, 0, 0, 0, 0, 0, 0, 0, 0]
areas.each{|key, value|
  result[0] -= 1
  result[value] += 1
}

puts result

```

(x, y)はエリアの左上の座標を意味しており, 取りうる値はそれぞれ

- 1 <= x <= w - 2
- 1 <= y <= h - 2

なことにだけ気をつけつつベタに書く.
(0オリジンじゃなくて気持ち悪いと思ったらごめんなさい)
問題についてきたサンプル・データで動かしてみてエラー吐かないことだけを確認後提出.

結果は・・・TLE(TimeLimitExceeded)

最後の結果をまとめているループを, 前半のループに含めれば多少処理時間は短くなるかな?
と思い

```ruby
h, w, n = gets.chomp.split.map(&:to_i)

areas = Hash.new(0)

result = [(h - 2) * (w - 2), 0, 0, 0, 0, 0, 0, 0, 0, 0]

n.times {
  i, j = gets.chomp.split.map(&:to_i)

  for y in (i-2..i) do
    if y < 1 || (h - 2) < y then
      next
    end

    for x in (j-2..j) do
      if x < 1 || (w - 2) < x then
        next
      end

      result[areas[x.to_s + '_' + y.to_s]] -= 1
      areas[x.to_s + '_' + y.to_s] += 1
      result[areas[x.to_s + '_' + y.to_s]] += 1
    end
  end
}

puts result

```

と書き換えてみたけどやっぱりダメ.


しばらく考えた後, 諦めて解説やら他の人の解答やらを見てみると, 同じくrubyで解いて正解している人のコードでは
areasを文字列をキーとする連想配列ではなく, 整数をキーとする二次元配列にしていることに気がつく.
さっそく真似して書き換えてみると...

```ruby
h, w, n = gets.chomp.split.map(&:to_i)

areas = Hash.new{|h, k| h[k] = Hash.new(0)}

result = [(h - 2) * (w - 2), 0, 0, 0, 0, 0, 0, 0, 0, 0]

n.times {
  i, j = gets.chomp.split.map(&:to_i)

  for y in (i-2..i) do
    if y < 1 || (h - 2) < y then
      next
    end

    for x in (j-2..j) do
      if x < 1 || (w - 2) < x then
        next
      end

      result[areas[x][y]] -= 1
      areas[x][y] += 1
      result[areas[x][y]] += 1

    end
  end
}

puts result

```

今度は無事Accept！

# 教訓
- rubyでは文字列をキーとするHashへのアクセスは速度が出ない可能性がある. 出来る限り数値のキーを使うデータ構造を考える.
- 他の解答を見た感じ, 速度を求めるならばC++か, あるいはJavaが良さそう.  
  ガチるなら言語を変えるのも考えるべきかも.(とは言え, 速度的にはRubyと対して変わらない印象のPythonもちらほら見えるんだよなあ)


# 参考
AtCoder: https://atcoder.jp/
markdown-stylesとinotify-toolsで、最高のドキュメント執筆環境を整えた

下記全てを満たす方法を考えました。

- Markdownで手軽にドキュメントを書きたい。MSオフィスは（ry
- 常用しているPCがUbuntuなのでKobitoは使えないし、何よりお気に入りのエディタで書きたい。
- 余計なソフトを入れたくないので、ブラウザでプレビューできると嬉しい。
- Markdown => HTML の変換を自動でやってほしい。
- シンタックスハイライトしてほしい。

試行錯誤の結果、`markdown-styles`と`inotify-tools`、それに`Emacs`で納得のいくものができました。

この記事も、この方法で記述しています。

![Screenshot_2016-09-14_10-13-09.png](https://qiita-image-store.s3.amazonaws.com/0/103885/085dd270-9353-6527-a87d-6e08173a90e3.png)

# 準備

## markdown-styles

MarkdownをHTMLに変換してくれるコマンドラインツールです。NodeJSで動いている模様。

https://github.com/mixu/markdown-styles

```sh
sudo npm install -g markdown-styles
```

## inotify-tools

Linuxが標準で装備している、ファイルの変更を検知してくれる機能です。

拙作で恐縮ですが、下記の記事で`exec_on_change`コマンドを作って下さい。

http://qiita.com/acro5piano/items/006674d2bc79ce9c7b78

## エディタ

好きなのを使って下さい。自分は折りたたみ機能が便利なのでEmacsを使っています。

# やってみる

まずは、普通にMarkdown => HTMLの変換をしてみます。

```sh
mkdir input/
echo "# Hello world\n YOLO" > input/index.md
generate-md --layout github --input ./input --output ./output
google-chrome ./output/index.html
```

次に、ファイルの変更を検知して、自動的に変換するようにします。

ターミナルの別ウィンドウを開いて、下記コマンドを実行して下さい。
ファイルの監視が始まります。

```sh
exec_on_change input/ 'generate-md --layout github --input ./input --output ./output'
```

元のMarkdownを編集します。

```sh
emacs input/index.md
# 編集して保存する
```

保存した後、ブラウザを更新すると、Markdownの変更が適用されているはずです。

# 惜しいところ

ブラウザが自動更新されてくれれば・・・
AxB でのテーブルを挿入が動作しない

3x2 ← テーブルを挿入が動作しない

![sample](http://cdn.qiita.com/assets/table-dd5879120ce2f80c8443515d9f864ef3e52c1032c0682333daa0008b3f29c563.gif)

IE11 Update : https://support.microsoft.com/ja-jp/kb/3175443
Elasticsearchの運用は大変（冷凍庫のガリガリ君食ったのは誰だ編）

GYAOの窓際エンジニア　玉利です。

休日返上で仕事をするようになると、家計が大変です。

まずは、弁当をつくらなくなります。仕入れも仕込みもできないので仕方ありません。今は夏だから食中毒こわいし。。。とか適当な理由をつけますが、単に家に帰ってくると抜け殻でなにもできないからです。１日800円x25くらいになるので月2万円近くアップ。

そして、ヨメの面倒を見るのがおざなりになるため、PKO(Peace Keeping Operation)活動として、なぜかヨメの軍事費（主に服）が増大します。これで10万円の出費。

自分も、細々したものを通販でポチってしまうので、今月マジでやばい。定時で効率よく仕事をするように、残業代の規定は雀の涙になるように設定されているので、普段はいいけれど炎上案件に関わると無事死ねます。

そして、我々の作ったESクラスタも、同様にメモリという家計をどうやってバランスさせるかが問題でした。

HEAPメモリ問題にもうすこしお付き合いください

<img width="700" alt="JVM_-_New_Relic.png" src="https://qiita-image-store.s3.amazonaws.com/0/113049/631823ae-fdb2-ef0c-f072-761c5c3815a3.png">



# 設定をいじりまくる（失敗）

Quiteに先人たちがたくさんの資料を残してくれていました。公式資料も英語ですが、なんとか我々でも読める優しい英語です。

まずはHEAPサイズをいじりました。ESの資料では、実メモリの半分以下、なおかつ32GBを超えないことと書いてあります、しかしそんなに強力な実機をぶちこんでるわけではないので、メモリはインスタンス半分の6GBに設定しました。これを「もしかしたらGCが早めに反応するかも」と、4GBとか少なめにもしてみましたが、死期が早くなるだけでした。素直に実メモリの半分を設定しましょう。

```/etc/init.d/elasticsearch
# 12GMEMのインスタンスを利用しているので、半分をESに割当
ES_HEAP_SIZE=6g
MAX_OPEN_FILES=65535
```

# shard/replicaの数を調整する

初めてのES運用ということで、保守的に手厚い設定をしたのですが、ドキュメント数が増えるだけメモリには厳しいものになりました。shardが増えるとレスポンスが改善しますが、その分メモリを圧迫します。最速を目指すのではなく、困らない程度にshardの数を減らすのが良さそうです。

当初は20 shard(サーバ数= shard数）に設定しました。これだとちょっとHEAPメモリ消費が速いので、BCP片系を設定しながら、減らすことにしました。


１クラスタ20台構成で、10 shard 2replicaにしました。BCP構成をとっているので、6面ミラーとなり安全性は担保できてると思います。このあたりは正解は無いので、ビジネス要件に合わせた設計を行ってください。

```elasticsearch.yml
## パフォーマンスのためシェードはサーバ数の半分で10,安全のためレプリカは1 -> 2 に増やす。BCP構成でトータル6面のミラー
index.number_of_shards: 10
index.number_of_replicas: 2
```

これで、ずいぶんメモリが楽になりました。

# なんか1台だけ、やばいやつがいる

我々のチームには、CICEO(Chief ICE Officer)という要職のメンバー、二次元氏がいます。メンバーが消費するアイスキャンディーの在庫について責任を持っているのです。だいたい1 issueを3アイス(3人日)などと計算しています。アイスが切れるとパフォーマンスが低下するので、我々にとっては非常に大切なロジスティクス担当です。

で、アイスをかじりながら火照ったアタマを冷やしつつ仕事をしています、もう2週間以上、綱渡りの運用をしているのですがどうしよう。。。オフィス移転でアイスのまとめ買い出しが難しくなったのでピンチです。

そして、elasticsearch[01-20]という20台1クラスタx2のサーバを運用しているのですが、片系の01だけ微妙にメモリの消費が速いのです。このサーバには、企画さんが使うKibanaと、Kibanaに依存したMarvelプラグインが入っていました。

記事に紹介があるMarvelは強力なモニタリングツールだと思います。ただし現在、ESの監視はNewRelicのElasticsearchプラグインで行っています。たぶんMarvelはなくても大丈夫そうなので、思い切って外すことにしました。

# まだ、メモリ盗み食いしてるやつがいる

これで少し改善しました。marvelのインデックスが毎日増えていって運用が大変ということもなくなりました。

しかし、やはりメモリを消費する速度が速いのです。そして27日のトラブルで、クラスタ全体が重くなった時に全台リスタートをかけたのですが、elasticsearch01だけリスタートしただけで速度がガクンと改善しました。


「01が足引っ張ってるんじゃね？」

その時は再起動でなんとかなったのですが、どうやらkibanaが足を引っ張ってるのが読めてきました。散々悩んだ結果、ついに先達の資料を見つけました。

マスタカの ChangeLog メモ
https://masutaka.net/chalow/2016-06-26-1.html


マスタカ氏は、「Node.JSがメモリを1.5GB食う」と書いておられます。私がHEAPの動きを見てる限り一致しました。

というわけで、手動で起動スクリプトに以下設定を入れ、設定スクリプトにもメモを書きました。

これで、01のメモリが厳しい問題が解決できました。他のサーバとたいして差のない利用率になっています。冷蔵庫のアイスを盗み食いしたメモリイーターはnode.jsでした。nodeには別案件でも過去２回ひどい目に遭わされていて、できれば避けて通りたいとしみじみ感じました。

```
# Please add following couple of lines in /etc/init.d/kibana
+ NODE_OPTIONS="--max-old-space-size=256"
+ export NODE_OPTIONS
```

しかし、elasticsearchにしろkibanaにしろ、/etc/init.d以下をいじるというのはなんとかしてもらえないものですかね。設定が手動になってしまうので構成管理上めんどくさすぎます。

# とりあえず、メモリ対策は以下２個

結論としては、我々の運用において以下２点が運用ノウハウと思いました。定期的再起動は、できればなくしたいのですが、どなたか良いプランお持ちでないでしょうか？

* 定期的再起動(月火・木金でcronで回してます＞毎日再起動を入れることにしました)
* kibanaの設定見直し
Android Support Repository 37.0.0 にアップデートしたら必ずしなければならないこと

# 2016/09/20追記

Android Support Repository rev.38.0.0 がリリースされ、`24.2.0`が復活しました。

# 概要

Android Support Repository が 36.0.0 から 37.0.0 にアップデートされました。
これに合わせて必ずしなければならないことがあります。

# サポートライブラリのバージョンをあげる

各サポートライブラリの`24.2.0`に依存している場合、37.0.0のアップデートで`24.2.0`がリポジトリから姿を消すため、そのままではビルドが失敗します。最新の`24.2.1`へ変更しましょう。
Quantum Chemistry - Hermitian Operators

関連 http://qiita.com/7of9/items/d3a1799928734375f34f

CG分野で使われるSpherical Harmonics。自分の数値シミュレーション計算に用いたいと思い調べると、量子化学の講義にたどり着く。

短く分かりやすそうな159本のビデオを少しずつ消化中。

Quantum Chemistry - Hermitian Operators
https://www.youtube.com/watch?v=0Q_KmTOy07E&list=PLm8ZSArAXicL3jKr_0nHHs5TwfhdkMFhh&index=30

- 緑の文字
  - postulate
     - [このビデオから](https://www.youtube.com/watch?v=ppvk2hSYcG4&index=24&list=PLm8ZSArAXicL3jKr_0nHHs5TwfhdkMFhh)
         - trueとして証明されていない
         - trueとして考えられている(given)
         - predictionの妥当性を見てチェックされる
  - 観測できる特性は固有値である
- 紫の先
  - 固有値関数
     - 関数プサイnにオペレータAを作用させた値は
     - 関数プサイnに係数a_nがかかった値となる
- ピンクの式
  - Aのaverage value
  - Aの期待値とも言う
  - その定義は オペレータAの前後にプサイn*とプサイnをかけたものの積分
     - プサイn*はプサイnの複素共役
          - v=a+biの複素共役v*はa-bi
  - 紫の式を使ってオペレータAとプサンnの積をa_nとプサイnの積に置き換え
  - プサイ*とプサイの積の全空間での積分は1となるので
     - 全空間での粒子の存在確率 = 100%
  - aだけが残る
  - すなわち、Aのaverage value = a
- 黄色の文字
  - postulate
  - 物理的に観測可能なものは実数である
  - 係数a_nは実数 (Rの太字 @ 工学における特殊関数 p10)
  - a_nは実数なので (a_n = a + 0i)、その複素共役はa_n* = (a - 0i) = a
- 水色の式
  - 紫の式の複素共役をとったもの
  - a_n = a_n* なのでこのような式になる
- オレンジの式
  - average value of Aの複素共役を取る
  - オペレータAの複素共役に対してプサイとプサイ*の積の積分
     - プサイ*の複素共役 = プサイ
     - プサイの複素共役 = プサイ*
     - が考慮されている
  - それは水色の式を用いて係数a_n*の式となる
  - 係数a_n*は積分と関係なく外に出せるので
  - プサイとプサイ*の積だけ積分となり、それは1なのでa*だけが出る
  - 黄色の式からa* = a
- もしHermitian であれば
  - オペレータAのプサイ*とプサイの積の積分は
  - オペレータAの複素共役のプサイとプサイ*の積の積分に等しい
- 紫の式
  - ピンクの式、オレンジの式、緑の式から求まる
- 右上のピンクの式
  - Eigenfunction(固有関数)に関しては、ピンクの式が成り立つ
  - これまでの導出から
- 黄色の式
  - General(一般の関数)に関しては
  - オペレータA、関数f(x)の関係式としてこの式が有効になる
  - その積分空間は実数 (Rの太字)
- 水色の式
  - オペレータA, ほとんどの一般関数、関数fm(x), 関数fn(x)に対して成り立つ
  - その積分空間は実数 (Rの太字)
Quantum Chemistry - Commutators

関連 http://qiita.com/7of9/items/d3a1799928734375f34f

CG分野で使われるSpherical Harmonics。自分の数値シミュレーション計算に用いたいと思い調べると、量子化学の講義にたどり着く。

短く分かりやすそうな159本のビデオを少しずつ消化中。

Quantum Chemistry - Commutators
https://www.youtube.com/watch?v=aG_L3gym0uU&index=29&list=PLm8ZSArAXicL3jKr_0nHHs5TwfhdkMFhh

- Commutators
  - オペレータの順番を変えることができるかどうか、の話
- 緑の式
  - オペレータAとオペレータBが関数f(x)に作用する場合
  - オペレータBが作用した後に、オペレータAが作用する
    - 行列の計算と同じように「右のものから先に作用する」
- 紫の式
  - もしオペレータAとオペレータBがcommuteであれば
  - オペレータの作用順番を交換しても同じとなる
     - commute: 可換と訳すことがある
- ピンクの式
  - commutatorsという定義
- 黄色
  - もしオペレータAとオペレータBがcommuteであれば
  - 作用の順番を変えても同じなので、ピンクの式は0となる
- 水色
  - commutators [オペレータA, オペレータB]が0でない時は「不確実性」が存在することを表す
- オレンジの式
  - standard deviationの式
    - [こちらのビデオ](https://www.youtube.com/watch?v=sCeUFzxowuQ&list=PLm8ZSArAXicL3jKr_0nHHs5TwfhdkMFhh&index=20)の右側中段紫の式 sigma_A squaredとして導出されているもののrootを取った
- 紫の式
  - sigma_Aとsigma_Bの積は
    - commutators: [オペレータA, オペレータB]の
    - <> : average value (もしくは期待値)の
    - || : 絶対値の
    - 1/2倍の値である
  - この式の出自は不明だったが、ビデオの人に聞いたら以下の情報を教えていただいた
     - Robertson uncertainty relation と関連がある
         - [Wikipedia](https://en.wikipedia.org/wiki/Uncertainty_principle#Robertson.E2.80.93Schr.C3.B6dinger_uncertainty_relations)
     - Ozawa uncertainty relationとも関連あり
         - 小澤正直(Ozawa Masanao)さん
  - この式は
    - commutators: [オペレータA, オペレータB]の
    - 前後にプサイ*()とプサイ()をかけたものの積分(dtau)の
    - 1/2倍の値である
- 右上の緑の式
  - momentumのオペレータと位置xのオペレータ
- 紫の式
  - オペレータpxとオペレータxのcommutatorをf(x)に作用させたもの
  - commutatorの定義は左のピンクの式にあるので
  - 紫の式の右側のように展開できる
- ピンクの式
  - 紫の式に、右上緑の式(オペレータpx、オペレータx)を代入した
- 黄色の式
  - ピンクの式を整理
- 水色の式
  - 黄色の式をiヘイチバーで整理
  - 第二項と第三項がプラスマイナスで消えてオレンジとなる
- 紫の式
  - 右上の紫の式と、中段のオレンジの式からf(x)を消した式
- 緑の不等式
  - 左下の紫の式にオペレータpx、オペレータxを代入したもの
- ピンクの式
  - 緑の式に中段の紫の式を代入
- 黄色の式
  - ピンクの式で積分に関係ないiヘイチバーを出した
  - プサイ*とプサイを全空間で積分すると1となる
     - 全空間での粒子の存在確率 = 100%
  - 1/2 |-iヘイチバー|の計算
     - [複素平面](http://www.dbkids.co.jp/popimaging/seminar/complex/complexplane.htm)において虚軸の負方向にヘイチバーとなった図
     - その絶対値というのは(大きさを取るだけなので)ヘイチバーとなる
     - 結果として、ヘイチバー/2が求まる
- 水色の式
  - 右下緑の式がヘイチバー/2より大きい
  - Heisenberg Uncertainty Principleが求まった
     - [このビデオ](https://www.youtube.com/watch?v=cZbVl14wNkk&index=8&list=PLm8ZSArAXicL3jKr_0nHHs5TwfhdkMFhh)の左下の水色の不等式
プログラムの改修作業の流れ(詳細設計-実装-単体テスト)

#<Font color="navy">記事について</Font>
今回は例として、お客さんとか上司とかから要望を聞いて、既存のWebアプリケーションの画面を改修していく作業を行う場合を想定しています。取り扱う範囲は詳細設計-実装-単体テストとします。

普段の仕事のやり方の備忘録として記載しますが色々と抜け漏れがあるので、加筆していく予定です。


#<Font color="navy">大まかな順序</Font>

1.要望の聞き取り

2.調査
　2.1画面概要調査
  
3.詳細設計
　3.1詳細設計見積もり
　3.2詳細設計

4.実装
　4.1実装見積もり
　4.2実装整理
　4.3実装
　4.4実装漏れ確認
　4.5動作確認

5.単体テスト
　5.1単体テスト仕様書作成
　5.2単体テスト実施時間見積もり
　5.3単体テスト

#<Font color="navy">1.要望の聞き取り</FONT>#
改修内容の背景や目的、概要などを整理して、聞き取った内容をメモにまとめます。

#<Font color="navy">2.調査</FONT>#
##2.1画面概要調査##
大体以下のものにまとめてます。
設計書に書かれていない場合は設計者や実装者にヒアリングです。

<使用目的・機能概要>

<機能詳細>

<使用シーン 業務フロー>

<用語>

<インターフェイス>

<使用テーブル CRUD>

<特記すべき仕様>

参考
[既存システムを分析するための考え方と対処法](http://codezine.jp/article/detail/6566)

#<Font color="navy">3.詳細設計</Font>#
##3.1詳細設計見積もり##
要件の内容から、設計書の修正場所のあたりをつけ、調査すべき事と、単純作業でできる物を洗い出し、所要時間を計算します。

##3.2詳細設計##
詳細設計書を修正していきます。


#<Font color="navy">4.実装</Font>#
##4.1実装見積もり##
前回、掛かった作業時間や詳細設計書の修正箇所の個数から実装にかかる時間、実装で出るであろうバグの個数と解決にかかる時間を参考にし、計算します。

##4.1実装整理##
画面がまずどう動くか、及びメソッドの呼び出し順序の整理を行います。
次にソースにコメントをつけていき、修正箇所を絞りこんでいきます。
修正箇所を特定出来たら、詳細設計書を参考にして、日本語で処理を追記していきます。
もしも関連ソースに参考となる処理が無かった場合、他の画面の動きを見て、参考となるソースを探します。

##4.2実装##
4.1で書いた日本語で書いた処理を基にソースに処理を追加していきます。

##4.3実装漏れ確認
実装に漏れが無いかを確認するために詳細設計書と要望を再度確認します。
また、コピペ漏れが無いかをgrepを使い、調査を行います。

##4.4動作確認##
要望でまとめた機能、詳細設計書に記載した処理が正しく動いているかを確認します。

#<Font color="navy">5.単体テスト</Font>#
##5.1単体テスト仕様書作成##
画面のイベントごとにテストケースを書いていきます。
主にマトリクスで組み合わせを網羅したり、境界値を意識したケースを心掛けます。
また、次回の単体テストのためにテストケースごとに作業の予定時間と実績時間を記載します。

##5.2単体テスト実施時間見積もり##
5.1で単体テストのテストケースが出そろうので、テストケースの作業予定時間を合計します。
また、単体テストで出るであろうバグの個数と解決にかかった時間を参考にします。
やはりここでも前回の単体テストでかかった時間が作業の見積もりをするのに重要になります。

##5.3単体テスト
単体テストを実施していきますが、単体テスト仕様書の期待値があいまいだと何が正解が判断に困るので、
出来るだけ明確に書くことが必要になります。
作業は前工程で決まるといっても過言ではないと思います。

#<Font color="navy">最後に</Font>#
詳細設計、実装、単体テストの各フェーズごとに予定と実績を記録することは欠かせない作業です。
後で記録を参考にして、見積もりを作ろうと思っても物がないと参考には出来ないです・・・。
技術英語 > [For the record], here's how the code looks when it uses a while loop: / Just between us, ...

@ Code Complete (No. 12510 / 36077)

> <font color=red>For the record</font>, here's how the code looks when it uses a while loop:

http://eow.alc.co.jp/search?q=%22for+the+record%22
> `1 記録する［正確を期する・念の］ために
> `2 はっきり言って、公式に述べると
> `3 実際には、現実には

上記の文章では「具体的には」のような意味合いで使われているようだ。

<hr>
関連して思い出したのは

> Just between us, ...

意訳「我々だけの話だが。。。」

http://www.ensenada-realestate.com/article/382028377.html

バリエーションとして

> This is just between us, but ...