OmniAICreator/Qiita-1.07M huggingface dataset:
JavaでJavaScriptが動く"Rhino"を使う

# 目的
　**Java製のJavaScriptエンジン"Rhino(ライノ)"の利用**について、自身の備忘録と情報共有のため作成します。
　対象は、JavaおよびJavaScriptの基礎知識がある方とします。

# 内容
　以下の3セクションに分けて説明します。なお、実行環境はWindows 7です。

1. [Rhinoとは？](#rhinoとは)
2. [導入方法](#導入方法)
3. [実行](#実行)

## Rhinoとは？

　**RhinoはオープンソースのJava製JavaScript実装**です。通常、EUCを提供するためにJavaアプリケーションに組み込まれます。（私訳）

> Rhino is an open-source implementation of JavaScript written entirely in Java. It is typically embedded into Java applications to provide scripting to end users.
> ["Rhino": MDN](https://developer.mozilla.org/en-US/docs/Mozilla/Projects/Rhino)

## 導入方法
　**Rhinoインタプリタ**を使って、使用方法を学習します。
　まず、以下のページからjarファイルをダウンロードします。

> ["mozilla/Rhino Releases": GitHub](https://github.com/mozilla/rhino/releases)

　コマンドライン上でjarファイルを実行します。

```js
> java -jar rhino-1.7.7.1.jar
```

　以下が表示されれば成功です。

```js
Rhino 1.7.71 2016 02 01
js>
```

## 実行
　Javaのコレクションクラス(ArrayList)を生成し、アクセスしてみます。

```js
Rhino 1.7.71 2016 02 01
js> var list = java.util.ArrayList(); // インスタンスを生成
js> list.add("hoge"); // ArrayList.addメソッド
true
js> list.add("piyo"); // ArrayList.addメソッド
true
js> list.add("fuga"); // ArrayList.addメソッド
true
js> for (var i = 0; i < list.size(); i++) { print(list.get(i)); } // ArrayList.getメソッドをJavaScriptのforループから実行
hoge
piyo
fuga
```

　**JavaクラスのインスタンスにJavaScriptでアクセスできました。**Rhinoの動作確認完了です。

# 所見
* 業務でRhinoの存在を初めて知りました。[Java8では、Rhinoから**"Nashorn(ナースホルン)"に置き換えられた**](https://blogs.oracle.com/wlc/entry/javaee_c117)らしい。違いについては未勉強です。
* JavaScriptを使って、Javaのクラスの呼び出しやインスタンス生成できるのは、コラボ企画のような不思議な気持ちになります。
* **サーバサイド(のJava上)でJavaScriptを実行でき**、**独自のJavaクラスを作っておいてエンドユーザ(開発者)に提供できる**のがメリットでしょうか？

# 参考
1. ["mozilla/Rhino Releases": GitHub](https://github.com/mozilla/rhino/releases)
2. ["ArrayList": JavaSE7 API Reference](http://docs.oracle.com/javase/jp/7/api/java/util/ArrayList.html)
3. ["Nashorn(Java 8のJavaScriptエンジン)の実力": Qiita](http://qiita.com/ukiuni@github/items/bb8105bd1edc40cc82a0) @ukiuni@github 氏
nasa space apps challenge その３

概要
nasa space apps challenge に行けないので、勝手にハッカソンしてみる。
2016の熊本地震をgooglemapにプロットしてみる。

#写真

![](http://jsdo-static-contents.s3.amazonaws.com/images/capture/6/l/b/6lbt.jpg?t=1461842654)


#成果物

http://jsdo.it/ohisama1/6lbt
いまどきのAndroid Emulatorの/systemをリマウントしhostsを書き換える

やりたいことは、
「[俺達のAndroid Emulatorでローカルに立てたサーバにアクセスする方法](http://qiita.com/norisu0313/items/4f24ef4eea5fdac3ad5f)」
そのものなんですが、いまどき(SDK 25.3.0)のエミュレーターだとそのままでは書き込めないみたいです。

まず、普通に。

```
$ adb shell
$ su
# mount -o rw,remount /system
# mount 
/dev/block/vda on /system type ext4 (rw,seclabel,relatime,data=ordered)
```

一瞬リマウントできたかのように見えるけど、結局書き換えられずリードオンリーに戻ってる。リトライしてみると、

```
# mount -o rw,remount /system
'/dev/block/vda' is read-only
```

と怒られたりもする。

[この](http://android-tricks.blogspot.jp/2009/01/mount-filesystem-read-write.html)あたりにでていたように

```
# mount -o rw,remount -t ext4 /dev/block/vda /system
```

とやっても同じでした。

ググってできたのが結局これ。
[How to edit /etc/hosts file in Android Studio emulator running in nougat?](http://stackoverflow.com/questions/41117715/how-to-edit-etc-hosts-file-in-android-studio-emulator-running-in-nougat/42829461#42829461)

```
$ adb root && adb remount && adb push ./hosts /system/etc/.
```

合わせ技でやらないとだめっぽいです。

ただし、Emulator(adb)を再起動するともとに戻っちゃいますのであらからず。
Slackの絵文字(emoji)を一括エクスポート＆インポートする

Slackの所属チームが増えてきたりすると、他チームで使っているemojiが欲しくなったり、まとめてemojiを移行したくなったりすることはよくあります。いろいろ調べてみると素敵なツールが公開されていたので、今回はそれらを使ったemojiの一括インポート＆エクスポートする手順をまとめました。

※Windows10で動作確認済み。

## 更新履歴
2018/01/12: `.png` 以外の拡張子のemojiもエクスポートできるようにスクリプトを修正 (@daik さん、ありがとうございます！)

## 現在のチームのemojiをエクスポート

こちらの記事を参考に進めます。
[Qiita: Slackのカスタム絵文字を全てダウンロードする](http://qiita.com/kure/items/7938d92532bb7577d8b8)

### 1. [Node.js](https://nodejs.org/ja/)をインストール
インストール後、 `node --version` コマンドで動作確認できます。
今回は下記バージョンを使いました。

```
λ node --version
v6.10.0
```

### 2. 必要なモジュールをインストール

```
λ npm install slack-node
λ npm install request
λ npm install fs
```

### 3. エクスポート元のSlackチームのAPIトークンを取得

**[ここ](https://api.slack.com/custom-integrations/legacy-tokens)** でAPIトークンを発行する。

![20170322_slack-api-token.png](https://qiita-image-store.s3.amazonaws.com/0/167943/e300f247-d605-2da2-80db-8360f156995d.png)

### 4. スクリプトファイルを配置

メモ帳やらに下記をコピペして、 `"<apitoken>"` の部分に発行したAPIトークンを貼り付ける。
その後 `slack-emoji-export.js` という名前で保存（何でも良い）。

```js

var Slack = require('slack-node');
var request = require('request');
var fs = require('fs');

apiToken = "<apitoken>"; // ここにAPIトークンを貼り付ける。
slack = new Slack(apiToken);

slack.api("emoji.list", function (err, response) {
    for(key in response.emoji){
        url = response.emoji[key];
        //エイリアスは無視
        if(url.match(/alias/)){
            continue;
        }

        // 取得対象の拡張子
        extention = url.match(/\.[^\.]+$/);

        request
        .get(url)
        .on('response', function (res) {
        })
        .pipe(fs.createWriteStream('image/' + key + extention));
    }
});
```

### 5. 保存先ディレクトリを作成する
`slack-emoji-export.js` を配置した同階層に `image` というディレクトリを作成する。

### 6. 実行
コマンドプロンプトからスクリプトを実行する。

```
C:\Users\emoji-export>node slack-emoji-export.js
```

### 7. 完了
imageディレクトリにカスタム絵文字が保存されているはず。

## emojiを一括インポート

GoogleChromeのエクステンション、 [Slack Emoji Tools](https://chrome.google.com/webstore/detail/slack-emoji-tools/anchoacphlfbdomdlomnbbfhcmcdmjej) を使う。

こちらの記事を参考。
[Hatena Blog: Slack Emoji （絵文字） を一括登録できるツールが素敵すぎました](http://bhind.hatenablog.com/entry/2016/08/03/165645)

### 導入後、UIから一括登録できるようになる

![20170322_slack-emoji-bulk.png](https://qiita-image-store.s3.amazonaws.com/0/167943/55b97676-8a07-662f-debf-adaefc5bd5d4.png)

チームのemoji追加画面 (https://チーム.slack.com/customize/emoji) に行くと、一括登録できるようになっている。
ファイル名がそのままemojiの名前になる。

## おわり
おかげでとっても楽に移行できました。各作者様に感謝。
MySQLのbackup script(mysqldump)スクリプトに一工夫

MySQLのバックアップ、cronで実行させていると
本当に厄災が起きた時に対応できるのか不安である。

本当はバックアップ実行毎にリストア走らせて問題がないか確認したいが
最低限 `mysqldump` 自体が正常に終わっているかどうかは確認するようにしていた。

```bash
# dumpファイル(zip)がちゃんと取得できているかチェック
function check_dumpfile() {
    _dump_complete_check=`zcat /data/backup/mysql/${date}_${_dbname}_mysqldump.zip | tail -n1 | grep 'Dump completed'`

    # 結果が空文字じゃなければOK
    if [[ "${_dump_complete_check}" != '' ]]; then
      echo 'DUMP FILE CHECK OK'
    else
      echo 'DUMP FILE CHECK NG'
    fi
}
```

バックアップされたファイルの中身見て
 `Dump completed` っていう文字があるかないか確認するようにしていた。
OSX上にxhyveでminikubeを構築

OSX上にminikubeを構築した際のメモ
xhyveを使ったほうがVirtualBoxより軽快な動作かなと思ったので、xhyveを使ってます。

#Versions
OSX 10.11.6
minikube v0.17.1

# xhyveとは
https://github.com/mist64/xhyve
OSX用のHypervisor。
VirtualBoxより動作が軽快？

# Install xhyve driver
公式から引用 https://github.com/kubernetes/minikube/blob/master/DRIVERS.md#xhyve-driver

```
$ brew install docker-machine-driver-xhyve

# docker-machine-driver-xhyve need root owner and uid
$ sudo chown root:wheel $(brew --prefix)/opt/docker-machine-driver-xhyve/bin/docker-machine-driver-xhyve
$ sudo chmod u+s $(brew --prefix)/opt/docker-machine-driver-xhyve/bin/docker-machine-driver-xhyve
```

# Install Kubernetes
公式から引用 https://kubernetes.io/docs/tasks/kubectl/install/

```
curl -LO https://storage.googleapis.com/kubernetes-release/release/$(curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/darwin/amd64/kubectl

```

# Install minikube


```
curl -Lo minikube https://storage.googleapis.com/minikube/releases/v0.17.1/minikube-darwin-amd64 && chmod +x minikube && sudo mv minikube /usr/local/bin/
```

# Start minikube

--vm-driverでxhyveを指定

```
minikube start --vm-driver=xhyve
```

# get nodes

get nodesをしてminikubeが動いているかを確認します。

```
kubectl get nodes
```

動いていれば下記のような結果が出力されるはずです。

```
NAME       STATUS    AGE
minikube   Ready     23h
```
Chromeアップデート後JointJSのportsが変な所にある

# JointJS
## Chromeアップデート後JointJSのportsが変な所にある

Transform list APIが変な動作をするせいで起こるらしい
改善はVectorizer `transform`をオーバーライドすればいい

```js
V.matrixToTransformString = function(matrix) {
   matrix || (matrix = true);
   return 'matrix(' + [
       matrix.a || 1,
       matrix.b || 0,
       matrix.c || 0,
       matrix.d || 1,
       matrix.e || 0,
       matrix.f || 0
   ] + ')';
};

 V.prototype.transform = function(matrix, opt) {

   var node = this.node;
   if (V.isUndefined(matrix)) {
       return (node.parentNode)
           ? this.getTransformToElement(node.parentNode)
           : node.getScreenCTM();
   }

   if (opt && opt.absolute) {
       return this.attr('transform', V.matrixToTransformString(matrix));
   }

   var svgTransform = V.createSVGTransform(matrix);
   node.transform.baseVal.appendItem(svgTransform);
   return this;
};


```


coffee version

```js

V.matrixToTransformString = (matrix)  ->
  matrix || (matrix = true)
  return 'matrix(' + [
      matrix.a || 1,
      matrix.b || 0,
      matrix.c || 0,
      matrix.d || 1,
      matrix.e || 0,
      matrix.f || 0
    ] + ')'


V.prototype.transform = (matrix, opt) ->
  node = this.node
  if V.isUndefined(matrix)
    if (node.parentNode)
      return this.getTransformToElement(node.parentNode)
    else
      return node.getScreenCTM()


  if (opt && opt.absolute)
    return this.attr('transform', V.matrixToTransformString(matrix));

  svgTransform = V.createSVGTransform(matrix);
  node.transform.baseVal.appendItem(svgTransform);
  return this

```
Terraformで循環参照のエラーが出た時

これは、リソースを変数で参照して整合性？を保とうとしたときに良くなる。

```hcl
variable "env" {
  type = "string"
  default = "dev"
}
variable "service" {
  type = "string"
  default = "foo"
}

resource "aws_cloudfront_origin_access_identity" "origin_access" {
  comment = "access-identity-${var.env}-${var.service}.s3.amazonaws.com"
}

data "template_file" "s3_policy" {
  template = "${file("s3-bucket-policy.json")}"

  vars {
    bucket_name            = "${var.env}-${var.service}"
    origin_access_identity = "${aws_cloudfront_origin_access_identity.origin_access.id}"
  }
}

resource "aws_s3_bucket" "foo" {
  bucket = "${var.env}-${var.service}"
  acl    = "private"
  policy = "${data.template_file.s3_policy.rendered}"

  tags {
    Name        = "${var.env}-${var.service}"
    Environment = "${var.env}"
    ServiceName = "${var.service}"
  }
}

```

となっている場合、循環参照が発生する。

```bash
❯ terraform plan
Error configuring: 1 error(s) occurred:

* Cycle: data.template_file.s3_policy, aws_s3_bucket.foo, aws_cloudfront_origin_access_identity.origin_access
```

もう、わけわかんないし辛い気持ちになるけど、Terraformには便利な機能がある。

依存グラフの出力である。

```bash
terraform graph -draw-cycles | dot -Tpng > graph.png
```

![graph.png](https://qiita-image-store.s3.amazonaws.com/0/23980/a806a625-6b85-19ae-eb16-4c817ea9df8e.png)

`-draw-cycles`をつけると赤くなるので、分かりやすい。
後は、その依存関係を解決していけば良いだけ。

今回のケースは、`aws_cloudfront_origin_access_identity`でバケット名を参照しているが、バケット名は`"${var.env}-${var.service}"`で置き換え可能なため、

```
resource "aws_cloudfront_origin_access_identity" "origin_access" {
  comment = "access-identity-${var.env}-${var.service}.s3.amazonaws.com"
}
```

とすると直る。

![graph2.png](https://qiita-image-store.s3.amazonaws.com/0/23980/3303abe3-e839-d88a-84e4-d981890c359d.png)

## References
- [Command: graph - Terraform by HashiCorp](https://www.terraform.io/docs/commands/graph.html)
MTのダッシュボードウィジェットの並び順が変

Movable Typeではウェブサイトやブログのダッシュボードに表示するウィジェットの種類をプラグインで増やすことができます。そうやって増やしたウィジェットをダッシュボードに複数個追加すると、追加順でもない名前順でもない何ともいえない順番で表示されます。このよく分らない挙動は何とかならないのだろうかと調べてみたところ、どうやらバグのようです。

ダッシュボードウィジェットの並び順を決めている処理は、lib/MT/App.pmの``update_widget_prefs``メソッドの中[^1]にあります。

```pl:lib/MT/App.pm
            # Renumbering widget order
            my $widget_count = keys %$these_widgets;
            foreach my $widget_id ( keys %$these_widgets ) {
                if ( my $widget = $all_widgets->{$widget_id} ) {
                    my @widget_scopes = split ':', $widget_scope;
                    my $order = $widget->{order};
                    $order
                        = $order && ref $order eq 'HASH'
                        ? $widget->{order}{ $widget_scopes[1] }
                        : $order * 100;
                    if ($order) {
                        $these_widgets->{$widget_id} = { order => $order };
                    }
                    else {
                        $these_widgets->{$widget_id}
                            = { order => $widget_count++ * 100 };
                    }
                }
            }
```

ややこしいのですが、``$all_widgets``が全ウィジェットの定義の配列、``$these_widgets``がダッシュボードに追加されたウィジェットの設定のハッシュです。公式のドキュメントには記述はありませんが、実はダッシュボードの定義の方で表示順序を指定できるようになっています。この処理では、定義の方で表示順が指定されていればそれを使い、無ければ先頭から順に100刻みの連番を振っています。つまり処理としては定義で表示順序が指定されていないものは追加順で表示するということを意図しているのだと思われますが、実際はそうなっていません。

なぜダメなのか。それはこのループがハッシュのキーに対するものだからです。

```pl
            foreach my $widget_id ( keys %$these_widgets ) {
```

Perlのハッシュのキーの順序は不定なので、このループはウィジェットの追加順とは異なる可能性があります。ウィジェットの追加や削除をするとハッシュのキーの順序に並べなおされてしまうので、何ともいえない順序になってしまうというわけです。

何ともいえない順序はイヤという場合は、ウィジェットの定義に以下のような記述を追加して表示順序を固定します。

```yaml
    order:
        blog: 1100
```

[^1]: https://github.com/movabletype/movabletype/blob/2948d26dd1917d3c506f40ee227799e44e7cb867/lib/MT/App.pm#L3667
シリアル端末用GNU Screenチートシート

# 起動

```bash
$ screen <デバイスファイル> [オプション]
```

screen(1)にはstty(1)のオプションがそのまま使用できる。よく使うものは以下の通り。

| オプション | 機能  | 
| --------- | ---- |  
| parenb/-parenb | パリティビットあり/なし |
| parodd/-parodd | パリティビットODD/EVEN |
| cs<数字> | 文字サイズ |
| cstopb/-cstopb | ストップビット2ビット/1ビット|

デバイスファイル/dev/ttyS1、ボーレート115200、パリティなし、8ビット、ストップビット1、だと次のようになる

```bash
$ screen /dev/ttyS1 115200,cs8,-parenb,-cstopb
```

# 操作

デフォルトのプレフィックスは <kbd>Ctrl</kbd>+<kbd>a</kbd>（以下C-a）

ウィンドウ操作や画面分割については省略。

| 機能 | キー操作 |
| --- | ------- |
| ヘルプ | C-a ? |
| 終了 | C-a \ |

参考: http://aperiodic.net/screen/quick_reference
Cognos Report Authoring 逆引き辞典 D5 レポートをローカルに保存したい

**レポートをローカルに保存したい**

![image](https://qiita-image-store.s3.amazonaws.com/0/147246/72d5d8b5-8a76-9f42-8b87-cb79982d6252.png)

■詳細手順
https://www.slideshare.net/ShinsukeYamamoto/cognos-reportauthoring-d5localsave

■Cognos Report Authoring 逆引き辞典 - 目次一覧
http://qiita.com/shinyama/items/756cb4a40d31f6cee9f8
Cognos Report Authoring 逆引き辞典 D4 作成したレポートをメールで送信する

**作成したレポートをメールで送信する**

![image](https://qiita-image-store.s3.amazonaws.com/0/147246/3f790e78-4ab2-3b83-2919-da8bd083815b.png)

■詳細手順
https://www.slideshare.net/ShinsukeYamamoto/cognos-reportauthoring-d4mail

■Cognos Report Authoring 逆引き辞典 - 目次一覧
http://qiita.com/shinyama/items/756cb4a40d31f6cee9f8
AWS メンテナンス対象を抽出するスクリプト

* redmine 貼り付け用
* region は適宜

```
#! /bin/bash
echo "|_. Name|_. ID|_. Event|_. Start|_. End|";aws ec2 describe-instance-status --region us-east-1 --filters "Name=event.code,Values=*" --query 'sort_by(InstanceStatuses[].[InstanceId,Events[0].Code,Events[0].NotBefore,Events[0].NotAfter],&[2])' --output text|xargs -I{} bash -c 'line="{}";id=$(echo $line|cut -d" " -f1);name=$(aws ec2 describe-instances --instance-ids $id --query "Reservations[].Instances[].[Tags[?Key==\`Name\`].Value|[0]]" --output text);echo -e "|$name|${line//     /|}|"'
```
Cognos Report Authoring 逆引き辞典 D3 オフラインでも、プロンプト選択などができインタラクティブに変更できるレポートを作成する

**オフラインでも、プロンプト選択などができインタラクティブに変更できるレポートを作成する**

![image](https://qiita-image-store.s3.amazonaws.com/0/147246/ea5da8ff-796e-8b4d-8951-50e2245e4d09.png)

■詳細手順
https://www.slideshare.net/ShinsukeYamamoto/cognos-reportauthoring-d3activereport

■Cognos Report Authoring 逆引き辞典 - 目次一覧
http://qiita.com/shinyama/items/756cb4a40d31f6cee9f8
Cognos Report Authoring 逆引き辞典 D2 国別、商品ライン別など複数のキーでレポートを分割して保存する

**国別、商品ライン別など複数のキーでレポートを分割して保存する**

![image](https://qiita-image-store.s3.amazonaws.com/0/147246/27d73c37-589d-ae1c-0b0c-8ed384e1021b.png)

■詳細手順
https://www.slideshare.net/ShinsukeYamamoto/cognos-reportauthoring-d2burst2

■Cognos Report Authoring 逆引き辞典 - 目次一覧
http://qiita.com/shinyama/items/756cb4a40d31f6cee9f8
Terraformでテンプレートを使ってポリシーを定義する

Terraformにはテンプレート機能がある。よく使われるのは、[ポリシーの設定](https://www.terraform.io/docs/providers/aws/r/iam_policy.html)などで、ヒアドキュメントで記述されるようなものを、別ファイルに記述し変数を与えて埋めていく（IAMポリシーに限定するならばHCLで記述できる[AWS_IAM_POLICY_DOCUMENT](https://www.terraform.io/docs/providers/aws/d/iam_policy_document.html)があります）。

## ポリシーを定義する
例えば、ユーザやグループにポリシーを設定するために、まずポリシーを定義する。
ここで、 `bucket_name` は変数になっている。ポリシーの意味は `${bucket_name}` 以下にあるオブジェクトに対しての操作を全て許可するというもの。リソースの最後に `/*` をつけないとバケットの操作<sup>[1](http://docs.aws.amazon.com/ja_jp/AmazonS3/latest/dev/using-with-s3-actions.html)</sup>になってしまうので注意。
これを、 `s3_bucket_policy.tpl.json` というファイルに保存しておこう。拡張子を `json` とかにしておいたほうがシンタックスハイライトの恩恵が受けられる（と個人的には思う）。

```json
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "*",
      "Resource": [
        "arn:aws:s3:::${bucket_name}/*",
      ]
    }
  ]
}
```

## IAM Policy リソースの定義
次に、リソースを定義しよう。
今までは `policy` に `<<EOF ... EOF` などを書いてポリシーを埋め込んでいたと思う。
ココも変数にする。

```terraform
resource "aws_iam_policy" "developer" {
    name = "developer_policy"
    path = "/developer"
    description = "Developer IAM policy"
    policy = "${data.template_file.foo.rendered}"
}
```

## Template データの定義
最後にテンプレートの定義をしていこう。`data`で`template_file`を定義する。
`template` には最初で作成したファイルを指定する。`file`メソッドを使うとファイルを引っ張って来ることができ、引数にはパス、ファイル名を与えよう。最初に作成したファイル名は`s3_bucket_policy.tpl.json`なので、それを指定する。

テンプレート内に`bukcet_name`という変数があったが、それをここで埋める。
`vars`のマップを記述すると、そのままテンプレートに渡され、埋められる。

```terraform
data "template_file" "foo" {
  template = "${file("s3_bucket_policy.tpl.json")}"

  vars = {
    bucket_name = "bar"
  }
}
```

`bukcet_name` をTerraformで作成したバケットにしたい場合は、`vars`に変数を与えればいい。

```terraform
resource "aws_s3_bucket" "bar" {
  bucket = "dev-var-bucket"
  acl    = "private"
}

data "template_file" "foo" {
  template = "${file("s3_bucket_policy.tpl.json")}"

  vars = {
    bucket_name = "${aws_s3_bucket.bar.bucket}"
  }
}
```

## Appendix
### AWS_IAM_POLICY_DOCUMENT resource
AWS IAMポリシーの作成はHCLで記述できることを @mia_0032 さんから教えていただきました。 Terraform version 0.7.0 から [`aws_iam_policy_document` リソース](https://www.terraform.io/docs/providers/aws/d/iam_policy_document.html)が入っていた([CHANGELOG](https://github.com/hashicorp/terraform/blob/master/CHANGELOG.md#070-august-2-2016))。

> **New Data Source**: `aws_iam_policy_document` [(#6881)](https://github.com/hashicorp/terraform/issues/6881)

これのメリットをちょっと考えてみると次のような感じだと思う。

- HCLのシンタックスハイライトを使ってポリシーを書ける
- `plan` 実行時にある程度の構文チェックができる
- 書くものが減りすこしスッキリする（テンプレートの方式だと、 `json` ファイル、 `data` ソース、 `aws_iam_policy` リソースを用意しないといけない）

結構、多くのメリットがありそう。

ぼくがポリシーを書くときは、AWSコンソールで直接ポリシーを作成して、検証しながらJSONを組み立てていく。整ったところで、JSONをコピーし、変数になる部分の記述を変換してテンプレートを仕上げている。

JSONのポリシーをHCLに変換してくれる何かがほしい。
ちょっと調べてみた感じだとありそう（[kvz/json2hcl](https://github.com/kvz/json2hcl)）。


## References
- [ポリシーでのアクセス許可の指定](http://docs.aws.amazon.com/ja_jp/AmazonS3/latest/dev/using-with-s3-actions.html)
- [Provider: Template - Terraform by HashiCorp](https://www.terraform.io/docs/providers/template/)
Cognos Report Authoring 逆引き辞典 D1 ユーザー属性毎にレポートを分割して保存する

**ユーザー属性毎にレポートを分割して保存する**

![image](https://qiita-image-store.s3.amazonaws.com/0/147246/11cc1da5-d0f4-4301-6c84-00947ccf01f6.png)


■詳細手順
https://www.slideshare.net/ShinsukeYamamoto/cognos-reportauthoring-d1burst

■Cognos Report Authoring 逆引き辞典 - 目次一覧
http://qiita.com/shinyama/items/756cb4a40d31f6cee9f8
Minikubeでgcloud上のDocker imageを使う方法

gcloud上のdocker imageをどうやってminikube上で使えばいいのか困ったので、解決手順をメモ。

# versions
minikube v0.17.1
Google Cloud SDK 146.0.0

# 手順

## dockerの環境変数をminikubeのdockerに設定

```
eval $(minikube docker-env)
```

## gcloudでpull 
```
gcloud docker pull gcr.io/sample-project/sample:r43
```

## docker imagesで確認
```
docker images
```

ここでgcloud docker pullしたimageが一覧に表示されるはず。
PyQt5で作成したアプリケーションをPyInstallerでEXE化する

## ざっくり言うと
- PyQt5を用いたGUIアプリケーションをPyInstallerでWindowsのEXE化する際にハマった
- ビルド時にPyQtのパスを指定することで、ビルドが通る

## 状況
PyQt5を用いてGUIアプリケーションを作成していた。
アプリケーションは、ウインドウにドラッグアンドドロップされたファイルの解析を行い、エクセル形式でファイルを出力するというものである。
配布するために、EXE化しようと思ってPyInstallerを用いたところ、ビルドは成功するが実行できない。

実行時のエラーメッセージは ***failed to execute script pyi_rth_qt5plugins***

環境については、

- Windows 10
- Python (3.5.3)
  - future (0.16.0)
  - PyInstaller (3.2.1)
  - pypiwin32 (219)
  - PyQt5 (5.8.1)
  - sip (4.19.1)
  - XlsxWriter (0.9.6)

## 対策
`pyinstaller`実行時にPyQtのパスを設定する。

例

```
pyinstaller simple_tool.py --onefile --noconsole -p "C:\Users\ユーザ名\AppData\Local\Programs\Python\Python35-32\Lib\site-packages\PyQt5\Qt\bin"
```

`-p`でsite-packages以下のPyQtライブラリファイルのディレクトリを指定する。

Pythonがインストールされているディレクトリは環境によりけりなので、適宜参照。
Terraform で変数を使う

Terrafromでは変数が利用でき、`variable`を定義して、値を注入する。
一番シンプルな例は次の通り。

```terraform
provider "aws" {
  region = "ap-northeast-1"
}

variable "foo" {}

resource "aws_s3_bucket" "s3_bucket" {
  bucket = "${var.foo}"
  acl = "private"
}
```

`variable` で `foo` を宣言し、S3バケットのところで `${var.foo}` 利用している。


## 値の注入方法

値の指定方法は次の4通りある。

1. 実行時に指定
2. コマンド引数による指定
3. 環境変数による指定
4. 設定ファイルによる指定

### 実行時に指定
変数を宣言した後に、`terraform plan`などを実行すると、コンソールでどんな値を指定するか聞かれるので、そこで指定する。

```bash
❯ terraform plan
var.foo
  Enter a value: bar

...

+ aws_s3_bucket.s3_bucket
...
    arn:                 "<computed>"
    bucket:              "bar"
    force_destroy:       "false"
...

Plan: 1 to add, 0 to change, 0 to destroy.
```

### コマンド引数による指定
コマンド実行時 `-var` オプションを利用して値を指定する。
試しに `terraform plan -var 'foo=test-bucket'` を実行してみると、ちゃんと注入されている。

### 環境変数による指定
`TF_VAR_` のプレフィックスを付けて環境変数を設定すると、その値が変数にロードされる。
`TF_VAR_foo='env-test' terraform plan` を実行すると同様の結果が得られる。

### 設定ファイルによる指定
変数の値を指定する設定ファイルを作成し、`-var-file`で指定すると同様のことが出来る。

#### vars.tfvars
```hcl
foo = "tfvars-file"
```

`terraform plan -var-file=vars.tfvars` を実行すると同様の結果が得られる。

## 変数戦略/設計

Terrafromは `*.tf` ファイルを全て読み込むので、
変数定義を`variables.tf`などに記述しておき、
実行時に`-var-file`で値ファイルを指定して環境などを切り替えると良いかもしれない。

- `terrafrom plan -var-file=dev.tfvars`
- `terrafrom plan -var-file=prod.tfvars`

ディレクトリとか、ファイルはこんな感じにすると雰囲気はつかめると思う。

### `main.tf`
```hcl
provider "aws" { region = "ap-northeast-1" }
resource "aws_s3_bucket" "s3_bucket" {
  bucket = "${var.foo}"
  acl = "private"
}
```

### `variables.tf`
```
variable "foo" {}
```

### `dev.tfvars`
```
foo="dev-var"
```

### `prod.tfvars`
```
foo="prod-var"
```


## その他Tips

`default` を記述するとファイルを指定しなくてもそれになる。
また、`type` などで型も指定できる。
`description`で、変数の説明もかけるので書いたほうがいい。

```
variable "foo" {
  type = "string"
  default = "default-var"
  description = "Sample Variable"
}
```

## References
- [Input Variables - Terraform by HashiCorp](https://www.terraform.io/intro/getting-started/variables.html)
- [Terraformでmappingをmoduleに渡す方法 ｜ Developers.IO](http://dev.classmethod.jp/cloud/aws/pass-mapping-to-module-in-terraform/)
- [Terraform 0.7でterraform\_remote\_stateはdeprecated扱い - kikumotoのメモ帳](http://kikumoto.hatenablog.com/entry/2016/08/04/182210)
- [Terraformの出力を別のTerraformで利用する - Qiita](http://qiita.com/atsaki/items/d4678c1d62093fef47ec)
- [オレオレterraformディレクトリ構成ベストプラクティス - Qiita](http://qiita.com/eigo_s/items/02264a5a7ad0ff6c5387#global%E7%92%B0%E5%A2%83%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6)
- [terraform使い方(超基礎編) - Qiita](http://qiita.com/kohey18/items/38400d8c498baa0a0ed8)
Mac | docker: Cannot connect to the Docker daemon at ... への対応

# エラー

```
docker ps 

docker: Cannot connect to the Docker daemon at tcp://xxx.xxx.xxx.xxx:xxx. Is the docker daemon running?.
```

# 対応


docker-machine を立ち上げておく。

```
docker-machine start
```

シェルのコンフィグに以下を追加して、反映。

```:~/.zshrc
eval "$(docker-machine env default)"
```

その後、再実行。

```
docker ps

CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
```

# 環境

- Docker version 17.03.0-ce, build 60ccb22
- mac OS Sierra

# 参考

- https://github.com/docker/kitematic/issues/1010








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
swift

###ちょっと待つ

試しに雑に投稿。


一定時間待つswift3.0





``` sample.swift

       let runLoop = RunLoop.current 
        while keepAlive &&
            runLoop.run(mode: RunLoopMode.defaultRunLoopMode, before: NSDate(timeIntervalSinceNow: 0.1) as Date) {
                
        }
```
Interface Builderとソースコードで共通のカラーパターンを利用する方法

## 概要
iOSにおいて、定義したカラーパターンをInterface Builderからでもソースコードからでも利用する方法です。ソースコードからの利用には、[R.swift](https://github.com/mac-cain13/R.swift)を利用します。また、Interface Builderからの利用には、[ColorTools](https://github.com/ramonpoca/ColorTools)にあるHtml2Clrを利用します。

## 用語説明
### R.swiftとは？
AndroidにおけるRクラスのように、ViewやStoryboard, Stringsなどのリソースをソースコードから利用できるようにしたものです。Identifier等を文字列で使用する必要もなく、タイポによるバグを防ぎます。

### Html2Clrとは？
定義したカラーパターンをclrファイルに変換します。clrファイルはMacで読み込むことのできるカラーパターン定義用のバイナリファイルです。

## 導入手順
### 1. R.swiftのインストール
[R.swift](https://github.com/mac-cain13/R.swift)をインストールします。

### 2. Html2Clrのインストール
[ColorTools](https://github.com/ramonpoca/ColorTools)よりHtml2Clrをビルドし、プロジェクトのルートディレクトリ等に実行ファイルを置きます。もしくは、[Color-Palette-Pattern@github](https://github.com/ayakix/Color-Palette-Pattern)より導入してください。

### 3. カラーパターンの定義
1行につき、`16進数RGB 名前`の形でカラーパターンを定義し、Xcodeプロジェクトにインポートします。

![color](https://github.com/ayakix/Color-Palette-Pattern/raw/master/images/color.png)

### 4. R.swift用Run Scriptの定義
ターゲットの[Build Phases]-[左上の+]-[New Run Script Phase]より、ビルド時にR.swiftを起動するようにします。

![color](https://github.com/ayakix/Color-Palette-Pattern/raw/master/images/run_rswift.png)

下記はCocoaPodsを利用してR.swiftをインストールした場合のパスになります。パスは実行環境に合わせて変更してください。また、このRun Scriptは必ず`Compile Sources`よりも上に定義する（先に実行する）必要があります。

```sh
"$PODS_ROOT/R.swift/rswift" "$SRCROOT/$PROJECT_NAME"
```

### 5. clr出力用Run Scriptの定義
4で定義したRun Scriptよりも一つ上に（先に）カラーパターン変化用のRun Scriptを定義します。3で用意したカラーパターンファイルからclrファイルを出力し、`~/Library/Colors`にコピーします。Html2Clr等のパスは環境に合わせて書き換えてください。

![color](https://github.com/ayakix/Color-Palette-Pattern/raw/master/images/run_color.png)

```sh
FILE_NAME="mytheme"
# Generate color palette file
"./Html2Clr" "$SRCROOT/$PROJECT_NAME/$FILE_NAME.txt"
# Copy to user's color palette directory
"cp" "$SRCROOT/$PROJECT_NAME/$FILE_NAME.clr" "$HOME/Library/Colors/"
```

### 6. ビルド
プロジェクトを一度ビルドし、`clrファイル`と`R.generated.swift`を出力します。

### 7. ファイルのインポート
出力されたclrファイルとR.generated.swiftをプロジェクトにインポートします。

![color](https://github.com/ayakix/Color-Palette-Pattern/raw/master/images/import_files.png)

### 8. ビルド
再度ビルドします。これにより、clrファイルを読み取り、R.generated.swiftにcolorの定義が自動生成されます。

### 9. カラーパターンの編集→ビルド→Xcode再起動
カラーパターンを編集した際には、ビルドをし、その都度Xcodeを再起動する必要があります。これは、Xcodeの起動時に、`~/Library/Colors`ディレクトリの中にあるclrファイルを読み込むためです。

## 使い方
### ソースコードから使う

`R.color.{clrファイル名}`の中で定義されています。

![color](https://github.com/ayakix/Color-Palette-Pattern/raw/master/images/use_from_code.png)

### Interface Builderから使う
Colorsより作成したテーマを選ぶと利用できます。

![color](https://github.com/ayakix/Color-Palette-Pattern/raw/master/images/use_from_xib.png)

## デメリット
ソースコードとInterface Builderから共通したカラーパターンを利用できるようになりましたが、結局のところInterface Builderでは変数のように利用できないため、カラーパターンを変更した場合には、再度Interface Builderから色を設定する必要があります。動的にアプリのカラーテーマを変えたい場合には、やはりソースコードから修正する必要があります。

## サンプル
[Color-Palette-Pattern@github](https://github.com/ayakix/Color-Palette-Pattern)に動作するプロジェクトがあります。
Angular2 ひな型 ver.0.0.4

#Angular2 ひな型 ver.0.0.4

##概要
Angular2 ひな型 ver.0.0.3 を元に以下の変更を加える。
- 認証用サービスの修正
- ログイン画面の修正
- プロフィール画面の修正
- パスワード変更画面の修正
- ※ユーザー認証用のWebApi環境の準備が必要

### WebApiインターフェース

#### 認証用WebApi
- URL:http://localhost/mmsb/api/users/auth
- Param1：email=[ログインID（メールアドレス）]
- Param2：password=[パスワード]
- Param3：callback=JSONP_CALLBACK

レスポンスサンプル

```json
{
    "id": 1,
    "name": "山田 太郎",
    "email": "yamada_taro@local.co.jp",
    "created_at": "2016-12-27 05:48:07",
    "updated_at": "2017-02-28 13:24:31"
}
```

※認証失敗の場合空のjson文字列が返される。

#### パスワード変更用WebApi
- URL:http://localhost/mmsb/api/users/changepassword
- Param1：id=[ユーザID]
- Param2：old_password=[旧パスワード]
- Param3：new_password=[新パスワード]
- Param4：callback=JSONP_CALLBACK

レスポンスサンプル（正常時）

```json
{
    "status": true,
    "message": "パスワードは正常に更新されました。"
}
```

レスポンスサンプル（異常時）

```json
{
    "status": false,
    "message": "旧パスワードが異なります。"
}
```

```json
{
    "status": false,
    "message": "旧パスワードが異なります。"
}
```

### ソース参照
詳細は GitHubより以下のバージョンのソースを参考にしてください。

[ver.0.0.4ソース](https://github.com/nissato-hitoshi/angular2-sample01/tree/ver.0.0.4)

以上
iphone7 ではブラウザキャッシュがうまく効かない？


http://www.psi-net.co.jp/blog/?p=1121
Etag と Last-modified ヘッダを使って動的コンテンツでもブラウザキャッシュさせるため、上記サイトを参照してやってみるも、iphone7ではうまくいきませんでした。

特徴としては、iphone7でアクセスすると

## 下記値がとれない（ことがある）
```php
filter_input(INPUT_SERVER, 'HTTP_IF_MODIFIED_SINCE')
filter_input(INPUT_SERVER, 'HTTP_IF_NONE_MATCH')
```

## 下記環境変数が$_SERVERに設定される
```
[REDIRECT_no-gzip] = 1
[REDIRECT_dont-vary] = 1
[HTTP_CACHE_CONTROL] = max-age=0
```

解決できなかったので、
「上記ヘッダーが設定されているときは、キャッシュさせない」
という方針としました。教えて詳しい方！

```php
    if (empty($_SERVER['HTTP_CACHE_CONTROL'])
and ($if_modified_since === $last_modified || $if_none_match === $etag)) {

        header('HTTP', true, 304);
        exit;
    }

```
javascript 日本語チェックです

## .match()を使い正規表現をチェックします。
漢字・ひらがな・カタカナ以外の文字を含んでいたら「false」が返ります。

```js
function ja2Bit ( str ) {
  return ( str.match(/^[\u30a0-\u30ff\u3040-\u309f\u3005-\u3006\u30e0-\u9fcf]+$/) )? true : false
}

ja2Bit('あいうえお') //true
ja2Bit('アイウエオ') //true
ja2Bit('漢字') //true
ja2Bit('abcdefg') // false
ja2Bit('あいうえおアイウエオ漢字') // true
ja2Bit('あいうえおアイウエオ漢字abcdefg') //false

```
カタカナ
\u30a0-\u30ff

ひらがな
\u3040-\u309f

々, 〆（記号）
\u3005-\u3006

CJK統合漢字
\u30e0-\u9fcf

「々」って記号なんですね～

### 参考
http://www.tohoho-web.com/js/regexp.htm
備忘録 Chef　ファイルコピー

最近、別の仕事が忙しくて、去年勉強していたChefからすっかり離れていたので、いろいろ忘れています。
なので、自分用に備忘録として残すことに。

```ruby:環境
 (Chef Server) OS: REHL 7.2 , Chef Server:12.6.0.1
 (Chef Client) OS: CentOS 7.2 , Chef Client:chef-12.10.24-1

```


#**Chefでのファイルコピー**

以前は、ミドルウェアのインストールメディアが複数あるし、サイズも大きいので、
scriptリソースを利用し、scpコマンドを実行してました。
が、これがまあめんどくさく。
製品ごとにcookbookを分けていたので、共通のユーザーでscpコマンドを実行するためにdata bagつかったりとか。

今回、PostgreSQLとかApacheとかの導入cookbookを作成しているので、前みたいなやり方やめて、すなおに cookbook_file　リソースを使用することに。
※今回は PostgreSQL9.6.2が事例

## rpmファイルを fileディレクトにコピー

PostgreSQLのcookbookディレクトリのfile/defaultディレクトリに以下のファイルを保管

- libxslt-1.1.28-5.el7.x86_64.rpm　　※前提ファイルセット
- postgresql96-9.6.2-2PGDG.rhel6.x86_64.rpm
- postgresql96-contrib-9.6.2-2PGDG.rhel6.x86_64.rpm
- postgresql96-libs-9.6.2-2PGDG.rhel6.x86_64.rpm
- postgresql96-server-9.6.2-2PGDG.rhel6.x86_64.rpm

## attributeを作成

```ruby:default.rb
default['psgl']['work_dir'] = '/tmp/_work'
default['psgl']['pre_package_name'] = ["libxslt-1.1.28-5.el7.x86_64.rpm"]
default['psgl']['psgl_package_name'] = [
    "postgresql96-libs-9.6.2-2PGDG.rhel6.x86_64.rpm",
    "postgresql96-9.6.2-2PGDG.rhel6.x86_64.rpm",
    "postgresql96-contrib-9.6.2-2PGDG.rhel6.x86_64.rpm",
    "postgresql96-server-9.6.2-2PGDG.rhel6.x86_64.rpm"
]
```
## cookbookを作成

やりたいことは、
 - Chef Server上のクックブックディレクトリのfile/defaultに保存したファイルを、Chef Node上の/tmp/_workディレクトリへコピー
 - 前提ファイルと、PostgreSQLのファイルは別々でコピー

```ruby:prewrk.rb
# ファイルのコピー先ディレクトリを作成
directory "#{node['psgl']['work_dir']}" do
    action:create
end

# PostgreSQLの前提ファイルをコピー
node['psgl']['pre_package_name'].each do |file|
    remote_file = File.join(node['psgl']['work_dir'],file)
    cookbook_file " copy #{file}" do
        source "#{file}"
        path "#{remote_file}"
    end
end

# PostgreSQLのモジュールをコピー
node['psgl']['psgl_package_name'].each do |file|
    remote_file = File.join(node['psgl']['work_dir'],file)
    cookbook_file " copy #{file}" do
        source "#{file}"
        path "#{remote_file}"
    end
end

```


やりたいことができた！
定期的にさわっておかないと、中年になるとすぐにわすれてしまいますね。


[公式マニュアル](https://docs.chef.io/resource_cookbook_file.html)
VirtualBox のネットワーク設定をいつも忘れるのでメモ

VirtualBox のネットワーク設定をいつも忘れるのでメモ

https://www.virtualbox.org/manual/ch06.html

Machine > Settings > Network

| Attached to: | 意味 | Guest から Host | Guest から 外部 | Host から Guest | 外部から Guest | 欠点 |
|--------------|-----|-----------------|----------------|----------------|---------------|-----|
| NAT | Host が NAT になる | 可能 | 可能 | Port Forwarding 必要 | Port Forwarding 必要 | 外部や Host からアクセスできない |
| NAT Network | NAT だがゲスト同士が通信可能 | 可能 | 可能 | Port Forwarding 必要 | Port Forwarding 必要 | 外部や Host からアクセスできない |
| Bridged networking | ゲストが別の IP を持つ | 可能 | 可能 | 可能 | 可能 | Guest の IP が変わる |
| Internal networking | Guest だけのネットワークに参加する。何のためにあるのか不明 | 不可能 | 不可能 | 不可能 | 不可能 | 何も出来ない |
| Host-only networking | Guest と Host 間でのみ通信 | 可能 | 不可能 | 可能 | 不可能 | 外部にアクセスできない |

これらを組み合わせて
* Adapter 1 を NAT
* Adapter 2 を Host-only にする
のようにすると、Guest から Host、Guest から外部 Host から Guest へのアクセスを有効に出来る。

http://qiita.com/hnw/items/77be84138f5ec48353da
和暦に関するメモ

## 暦が和暦かどうかを判定

```swift:NSCalendar
extension Calendar {
   func isJapaneseCalendar() -> Bool {
        return self.identifier == Calendar.Identifier.japanese
    }
}
```

## 元号を得る

カレンダーを `japanese`, フォーマットに `G` を用いると、平成時代なら「**平成**」「**Heisei**」が得られる。

```swift
let f = DateFormatter()
f.locale = Locale.current
f.calendar = Calendar(identifier: .japanese)
f.dateFormat = "G" // 平成, Heisei
```

`y` を用いて和暦の年数を得る。和暦表記では零埋めをしないだろうから、通常は `Gy` で十分かもしれない。

```swift
let f = DateFormatter()
f.locale = Locale.current
f.calendar = Calendar(identifier: .japanese)
f.dateFormat = "Gy" // 平成2, Heisei2
f.dateFormat = "Gyy" // 平成02, Heisei02
```

上記だとOS設定言語に依存するので、例えば英語環境だと `Heisei` という具合になる。常に日本語にするなら Locale を固定する。

```swift
f.locale = Locale(identifier: "ja")
```

### おまけ：「西暦」「AD」を得る

```swift
let f = DateFormatter()
f.calendar = Calendar(identifier: .gregorian)
f.dateFormat = "Gy" // 西暦2017, AD2017
```

## 和暦の日付表記を得る

```swift
let f = DateFormatter()
f.locale = Locale(identifier: "ja")
f.calendar = Calendar(identifier: .japanese)
f.dateFormat = "Gy年M月d日"
let dateStr = f.string(from: date) // "平成29年3月22日"
```

## OSの暦設定・言語設定に合わせる（手っ取り早い方法）

```swift
let f = DateFormatter()
f.locale = Locale.current
f.dateStyle = .medium
f.timeStyle = .none
let dateStr = f.string(from: date) // "H29/03/22" "2017/03/22"
```

## OSの設定に依存せず常に西暦表記・24時間表記にする

暦が和暦の環境で `0029/3/22` といった具合になってしまう、日付バグあるあるを防止する方法。Locale を `en_US_POSIX` 固定にすれば良い。

普段使っている iPhone の暦設定を和暦にしていると、和暦（というか国際化）にきちんと対応しているアプリ、対応が甘いアプリが一目瞭然で面白いのでオススメ。

```swift
let f = DateFormatter()
f.locale = Locale(identifier: "en_US_POSIX")
f.dateFormat = "yyyy.MM.dd HH:mm:ss"
let dateStr = f.string(from: date) // "2017.03.22 23:59:59"
```
[Swift] デバッグ時にだけ実行

## デバッグ時にだけ実行

### 時間がかかるんだけどデバッグ時には計算したい何かを実行したいときに使う

```swift
class Debug {
	class func execute(_ f: () -> Void) {
		#if DEBUG
		f()
		#endif
	}
}

Debug.execute {
	// デバッグ時にだけ実行したい時間がかかる何か
	let data = ...
	print(data)
}
```

クラスにしているのは検索しやすくしているためだけです。別の方法でネームスペースを変えてもよいです。
また、`#if DEBUG` ではなくUserDefaultsなどを使用して切り替えてもいいと思います。
今更ながらのNAS導入(その1) NATテーブル溢れにハマる

非常に今更ながらNAS購入

会社で使っていたこともあり慣れてるQNAPのTS-231P

初期導入は適当に済ませたのだが、同時期にインターネットの新規接続が出来なくなる事象が発生。

RTX1200の統計情報を眺めていたらNATセッション数が異常に跳ね上がっっていることに気づいたので何だろうと思ってNAS止めたら解消。
(マンションのインターネット接続サービスなのでローカルIPが割り振られており2重NAT、外側のNATルーターの割り当てが超えたと思われる)

ダウンロードアプリが原因じゃないかと言うことに仕様を眺めていたら気づいたので今日はそこから確認。

最終的にはiPhoneの写真をglacierにバックアップするところがゴールなのに、のっけから悲惨。

(つづく
[iOS] AutolayoutでLabelを揃えて配置する一つの方法

いろんなやり方があるかと思いますが、AutolayoutでLabelを揃えて配置する一つの方法です。
忘れがちなので、自分用にメモ。

## バージョン

Xcode8.2.1 

## 前準備

右ペインにPreviewを出しておくと確認しやすいです。
また、デバイスを追加する場合は、青丸の＋ボタンで追加します。

<img width="1653" alt="preview.png" src="https://qiita-image-store.s3.amazonaws.com/0/32215/21302f91-5532-932f-35ab-72ffcbd6231d.png">


## ラベルを中心に配置する

Horizontally in center/ Vertically in center をチェックして制約を追加する。
動かない場合は、UpdateFrameをする 

<img width="1733" alt="center.png" src="https://qiita-image-store.s3.amazonaws.com/0/32215/3f52dc8d-e6b4-a2a6-cf2f-6834e4e1c77d.png">


## ラベルを追加してトップの中心に配置する

Add New Alignment Constraints > Holizontally in center  をチェックして制約を追加する。

Labelを選択した状態で、Controlで上にハンドルを伸ばして、Vertical Spacing to Top Layout Guideをチェック

UpdateFrameをする 


![toplabel.gif](https://qiita-image-store.s3.amazonaws.com/0/32215/b453ece1-0857-9f5a-e34d-f905f8351e15.gif)


## ラベルを追加してボトムの中心に配置する

Add New Alignment Constraints > Holizontally in center  をチェックして制約を追加する。

Labelを選択した状態で、Controlで下にハンドルを伸ばして、Vertical Spacing to Bottom Layout GuideVertical Spacing to Bottom Layout Guideをチェック

UpdateFrameをする 


![buttom.gif](https://qiita-image-store.s3.amazonaws.com/0/32215/20071f36-7a2d-81b0-483a-40d9da095368.gif)


## トップラベルの下に中央揃えでラベルを追加する


Add New Alignment Constraints > Holizontally in center  をチェックして制約を追加する。

Labelを選択した状態で、Controlで上のラベルにハンドルを伸ばして、Vertical Spacing をチェック

UpdateFrameをする 


![next.gif](https://qiita-image-store.s3.amazonaws.com/0/32215/a7bd82ce-1cf2-7a8f-39ba-ab6271e046f1.gif)



## コーナーにラベルを配置する

Labelを選択した状態で、Controlで横にハンドルを伸ばして、Leading Space to Container Margin をチェック

Labelを選択した状態で、Controlで下にハンドルを伸ばして、Vertical Spacing to Bottom Layout Guide をチェック

UpdateFrameをする 


![corner.gif](https://qiita-image-store.s3.amazonaws.com/0/32215/8a90e79f-4509-f22d-3790-b4e8525626d7.gif)
PHPでカラーコードを正規表現チェック

`#ffffff` や `#fff` などのカラーコード形式チェックをしたかったのでメモ。
6桁／3桁両方対応。

```php
/**
 * Color code regular expression check.
 *
 * @access  private
 * @param   string $color
 * @return  boolean
 */
private function is_color_code( $color ) {
	if ( preg_match( "/^#([a-fA-F0-9]{6}|[a-fA-F0-9]{3})$/", $color ) ) {
		return true;
	} else {
		return false;
	}
}
```

関数化しておくと便利。
損失関数について、ざっくりと考える

あまり深く考えたくない性格なもので、出来ればざっくりと感覚的に理解したいと常々思っています。
そこで、この損失関数についても、直観的に理解できるように、ちょっと調べてみます。

# 損失関数ってなによ？
そもそも損失関数ってなんでしょう？
いろいろ調べるとやたら難しい説明が出てきますが、ようは2つの値の差が小さくなるような関数のことのようです。
Deep Learningの識別等では、学習時に、いかに答えに近い値になるように重みパラメータを調整するのかがメインとなるのですが、この「答えに近い値になるように」の部分を担うのが、この「損失関数」というわけです。
![u0o686000002d7d8.jpg](https://qiita-image-store.s3.amazonaws.com/0/130771/801933de-d8ba-729f-9b2c-6bbe3bd64212.jpeg)
「値＝損失」ということで、この損失をいかに少なくするのかということで「損失関数」となります。

# 損失関数の種類
では、損失関数にはどういった種類のものがあるのでしょうか。
ざっと調べてみても、結構な種類があります。

- ヒンジ損失関数
- ε許容誤差関数
- Huber関数
- 指数損失関数

Deep Learningではこういった難しそうなやつではなく、「交差エントロピー誤差」や「二乗誤差」を使用したりします。
重要なのは、この後の処理である「誤差逆伝播」ができる関数であることのようです。
何でなのか、とか、ではどうするのか、などは難しいことが書かれているサイトとかを見ていただくとして、ここではもう上記2つと決めてしまいます。もし勉強するうちに他の関数が出てきたら、こっそり追加します（爆）

## 交差エントロピー誤差
どう説明しても難しいお話になってしまうので式を載せちゃいますが、一般的にはこんな感じです。
![010.png](https://qiita-image-store.s3.amazonaws.com/0/130771/2be8c070-86d7-f4c6-1766-e6aa12170e7d.png)

で、これがある条件（分類問題）になると簡単になります。
![011.png](https://qiita-image-store.s3.amazonaws.com/0/130771/3d411f31-17de-ad02-9088-c59c549dcef4.png)

これをTensorFlowで記述するとこうなります。

```python
cross_entropy = tensorflow.nn.softmax_cross_entropy_with_logits(labels=y_, logits=y)
```

「y_」は正解のラベルで、「y」は学習した結果。この差が小さくなるような処理になります。

なお、比較するにも正規化されてないとまずいということで、「softmax_cross_entropy_with_logits()」の場合は、この中でsoftmaxしているようです。

すでに「y」がsoftmaxで正規化されていれば、こんな感じに書くようです。

```python
cross_entropy = -tensorflow.reduce_sum(y_ * tf.log(y), reduction_indices=[1])
```

「reduce_sum()」は足し算で、「log()」はそのものズバリで自然対数を求める関数です。


## 二乗誤差
最小二乗法ってやつも、これのことのようです。
こちらは単純で、差の二乗を求め、それを全クラスで足すだけです。
（その結果が最小になるように調整するイメージ）
![LeastSquareMethod-1.png](https://qiita-image-store.s3.amazonaws.com/0/130771/d46a6db7-82e1-4d79-4398-50ca9d9eb41b.png)

TensorFlowでの書き方はいっぱいあるようですが、差の二乗を「tensorflow.nn.reduce_sum()」で加算したり、そもそも「tensorflow.nn.l2_loss()」という関数があったり、二乗も「tensorflow.square()」を使ったり、などなどなど。

# まとめ
で、なんか知らないですけど、求めた結果は平均を取るみたいです。
交差エントロピー誤差の場合は、こんな風に書くようです。

```python
cross_entropy = tensorflow.reduce_mean(tensorflow.nn.softmax_cross_entropy_with_logits(labels=y_, logits=y))
```

あぁ、次は誤差逆伝播を理解しないと．．．
Sublime Text 2 > 検索から特定フォルダ(例:notUsed/)を除外する > Where:に-notUsed/を追加する

```txt:動作環境
Sublime Text 2
Windows 7 pro (32bit)
```

フォルダ内検索をするとき、特定のフォルダを検索対象からはずしたい。
例として`notUsed`という名前のフォルダをはずす。

参考: https://coderwall.com/p/bk90bw/exclude-a-directory-from-searching-in-sublime-text-2

`Where:`に`-notUsed/`を入れて除外できた。
Windows7+PowerShell+もろもろでUNIXライクなコマンド操作環境をつくる

# PowerShell 3.0にバージョンアップ
Windows8以上にはPowerShell 3.0がインストールされていますが、Windows7の場合はPowerShell 2.0(Windows Management Framework 2.0)がデフォルトでインストールされているので、バージョンアップします。
まずは、windows + r　powershellで立ち上げて、バージョン確認をしましょう。

    PS> Get-Host | Select-Object Version

    Version
    -------
    2.0

表示されたバージョンが3.0ではない場合、[ここ](https://www.microsoft.com/en-us/download/details.aspx?id=34595)からWindows Management Framework 3.0をインストールします。

# vimを入れよう

#### ①vimのダウンロード
Windows用vimが入っていない場合、[KaoriYa](https://www.kaoriya.net/software/vim/)さんからダウンロードします。
適当なところにバイナリを解凍すればOKです。

#### ②viコマンドの設定
先ほど解凍した実行ファイルのパスをエイリアスに設定してviコマンドを使えるようにします。

    PS> Set-Alias vi C:\DownloadPath\vim.exe
    PS> vi


![2017-03-22_132535.png](https://qiita-image-store.s3.amazonaws.com/0/154267/73d18f27-d013-4ff0-69ac-913633437306.png)

vimが起動するようになったよ！！

### パーマネントなエイリアスを設定したいとき
#### ③スクリプトの実行許可
viコマンドを使用可能にする準備のため、スクリプトの実行許可設定を行います。
デフォルトではスクリプト実行不可となっているので、以下のコマンドで実行ポリシーを「ローカルのスクリプトは実行可能」に変更します。

    PS> Set-ExecutionPolicy RemoteSigned

#### ④起動時に読み込むスクリプトを設定
PowerShellは、起動時にデフォルトで読み込むファイルをPowerShellスクリプト形式で定義することができます。
.bashrcや.bash_profileのようなアレです。
ファイルパスは$PROFILE変数に定義されています。

    PS> $PROFILE
    C:\Users\UserName\Documents\WindowsPowerShell\Microsoft.PowerShell_profile.ps1


上記のファイルですが、すでに存在しているわけではないので、以下のコマンドでファイルを作っちゃいましょう。

    PS> New-Item -Path $profile -ItemType file

Test-Pathコマンドを入力すれば、ファイルの存在確認もok

    PS> Test-Path $PROFILE
    True

あとはviコマンドでファイルを編集しちゃいましょう。

以下の行を追加して保存します。

    New-Alias vi C:\DownloadPath\vim.exe

PowerShellを起動し直して、viコマンドが使えればok！！

# その他、$PROFILEに設定しておくと良いこと
### grepしたい！

    New-Alias grep Select-String

### find -nameしたい！

    function find([string] $path, [string] $name) {
        if($name) {
            ls $path -r | ? {$_.Name -match $name}
        } else {
            ls $path -r
        }
    }
ちなみに、、findの検索条件はこんな感じで再現できます

    # -mtime
    ($(Get-Date) - $_.LastWriteTime).Days -eq 10

    # -size k
    $_.Length -eq KB

    # -type d
    $_.PSIsContainer

    # -type f
    ! $_PSIsContainer

### tailが使いたい！

    function tail ([string] $file, [int] $n, [switch] $f) {
        if ($f){
            cat -Wait -Tail $n $file
        } else {
            cat -Tail $n $file
        }　　
    }

## あると便利な関数とか
### 固定IP割り当て
    function setip([string] $addr, [string] $mask, [string] $gw) {
        netsh interface ipv4 set address "ローカル エリア接続" static $addr $mask $gw
        ipconfig /all
    }

### DHCP割り当て
    function dhcp() {
        netsh interface ipv4 set address "ローカル エリア接続" dhcp
        netsh interface ipv4 set dns "ローカル エリア接続" dhcp
        ipconfig /all
    }

githubにソースあります
https://github.com/manaminakamura/PowerShell/blob/master/Microsoft.PowerShell_profile.ps1
IL2CPPがマネージドライブラリのビルドでよく分からないエラーを出す

Unity 5.5.1fでiOS版をビルドしたところ、こんなエラーが出ました。

>stdout:
IL2CPP error (no further information about what managed code was being converted is available)
Additional information: Build a development build for more information. Exception has been thrown by the target of an invocation.
il2cpp.exe didn't catch exception: System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation. ---> System.NullReferenceException: Object reference not set to an instance of an object
  at Unity.IL2CPP.GenericsCollection.Inflater.ConstructGenericMethod (Unity.IL2CPP.GenericsCollection.GenericContext context, Mono.Cecil.TypeReference declaringType, Mono.Cecil.MethodDefinition method, IEnumerable`1 genericArguments) <0x10f7b04f0 + 0x00065> in <filename unknown>:0 
...

…ここからは「内部でエラーが出た」くらいしか分からない。

結局、バージョン管理でビルド失敗するようになった直前の差分を見て分かったんですが、使用しているマネージドライブラリのプロジェクトのプロパティの"対象のフレームワーク"がなぜか".NET Framework 4.5.2"に変えられていました。UnityというかMonoが対応しているのは3.5まで(バージョンによる)なので、こんなよく分からないエラーが出たものと思われます。

で、なぜこの問題が発生したのかというと、

**プロジェクトを更新した人の環境にVisual Studio Tools for Unityがインストールされていなかった**

からでした。これがインストールされていると"対象のフレームワーク"に"Unity 3.5 .net full Base Class Libraries"などが指定できるようになるんですが、インストールされていないと、VisualStudioが気を遣って勝手に適当なバージョンに変更してしまうようです。で、そのまま気付かずにSubmitしてしまったわけです。

それでもマネージドライブラリ自体のビルドは通りますし、UnityビルドでもEditorからビルドした場合はXcodeプロジェクトは生成されるので(もちろんコンソールにはエラーが出る)、"Build And Run"じゃなくて"Build"してXcodeでビルドする人だと気付かないこともあるかと思います。今回はJenkinsでコマンドラインビルドしたときに発見されたのでした。

なお、この原因以外でも似たようなエラーが出ることがあるようですが、その場合は

>il2cpp.exe didn't catch exception:

以降に、存在しないAPIをコールしていたり、だいたい読めば分かるような内容が書かれているようです。今回は全く分かりませんでしたが…。
Hyperledger iroha 0.75 を動かす on ubuntu with docker

2017/3/22現在の情報です。
irohaは日々開発が進んでいるので、最新の情報はレポジトリから読み解いてください。

## 目指すところ

- AWS上にirohaのサーバーが動作している状態を作る
    - dockerで動作
    - iroha1台の構成
    - branchはmasterが対象
- 外部から、50051(gRPC)へ接続できる

## AWSのインスタンス作成
ここでは、AWSにて構築します。選択したイメージはubuntu
> Ubuntu Server 16.04 LTS (HVM), SSD Volume Type

インスタンスタイプは、t2.medium を選択。buildが必要なのを考慮して。もっと小さくてもいけるかも。

### AWSのネットワーク設定
インバウンドのTCPの５００５１ポートを開ける。
送信元はよしなに。

## build環境を整えbuildする
https://github.com/hyperledger/iroha/blob/master/docs/how_to_build.rst

を参考に。
ubuntu環境を想定して書かれているので、だいたいそのままでいけます。
> ~ubuntu/iroha

にて作業。
sudoはご自身のポリシーで。build手順では、make installのみにするのが良いかと思います。あと、dockerが以下の手順だとsudo必要です。

以下、手順の中で留意事項(TIPS)

### pythonにpathが通ってないと言われる
> $ sudo ln -s /usr/bin/python3 /usr/bin/python

### javaのヘッダファイルが読めないと言われる
> $ sudo ln -s /usr/lib/jvm/default-java/include/linux/jni_md.h /usr/lib/jvm/default-java/include/
> $ sudo ln -s /usr/lib/jvm/default-java/include/linux/jawt_md.h /usr/lib/jvm/default-java/include/

## docker 構築
### dockerをインストール
https://docs.docker.com/engine/installation/linux/ubuntu/
この辺

## docker イメージを作成する
> $ cd ~/iroha
> $ sudo env IROHA_HOME=/home/ubuntu/iroha ./docker/build.sh

## docker 起動

> $ sudo docker run -d -it --name=iroha -p 50051:50051 hyperledger/iroha-docker

出来上がり。

動作確認としては、クライアントサイドが、iroha-pythonが追随しているので、それを使うのが吉。
https://github.com/hyperledger/iroha-python

また書けたら書く。

## 参考リンク
- オープンソースのブロックチェーン Hyperledger iroha をDockerで試してみた
    - http://qiita.com/takagerbera/items/130d3737bb34e9392166
LAN内PCのサブドメインにアクセスする方法（Nginx + xip.io）

LAN内のサブドメインにアクセスするには xip.io という便利ドメインと、Nginxの `server_name` に xip.io のURLを入れればいいのですよー、というメモ。

# LAN内のサブドメインにアクセスするには……？

サイト制作のためにローカルPC内にサブドメインを作って確認することがよくあります。しかしスマホから確認する時にサブドメインを使う方法がわかりませんでした。

仕方なくディレクトリ指定で確認しているのですが、Wordpressの確認ができずに困っていました。

```
# ローカルPCでの確認
http://hoge.localhost/wordpress/

# スマホから確認
# エラーになる
http://localhost/hoge/wordpress/
```

# xip.io を使うとLAN内PCのサブドメインにアクセスできる

xip.io という便利ドメインを使うと、**http://サブドメイン + IPアドレス + xip.io/** でアクセスできます。

[≫iOS シュミレータ・実機からローカルの開発サーバに繋いで開発する](http://qiita.com/hotchpotch/items/e36529fd354e225a306f)


## Nginxのサーバー設定で server_name に追記する

すでにローカル環境でサブドメインにアクセスできている前提で話を進めます。

Nginxのサーバー設定ファイルを編集します。
環境によりますが、`/usr/local/etc/nginx/servers/`あたりにあると思います。

localhost 設定の後ろに xip.io の設定を追加します。

```:server.conf
server{
  listen       8080;
  # server_name  hoge.localhost; ←変更前
  server_name  hoge.localhost hoge.192.168.0.100.xip.io;
```  

Nginxの設定リロードを忘れずに。

```
# sudo nginx -s reload
```

- ローカルPCのIPアドレスは`192.168.0.100`と仮定しています。
- Apacheと共存するためポートは`8080`にしています。
- hosts は特に変更していません。


## サブドメイン + IPアドレス + xip.io でアクセス

```
# ローカルPCでの確認
http://hoge.localhost:8080/wordpress/

# スマホから確認
# xio.io がIPアドレスを返してくれる
http://hoge.192.168.0.100.xip.io:8080/wordpress/
```

以上の設定でLAN内PCのサブドメインにアクセスできます。

DHCPを使っている場合は、再起動したときにIPアドレスが変わる可能性がありますので注意してください。
【git】直前のコミットやコミットメッセージを修正する

### コミットメッセージを修正したいとき

```bash
$ git commit --amend

# エディタが開くので、メッセージを修正、保存
```

このコマンドでエディタが開き、コミットメッセージを修正できます。
修正後、保存すると、新しいコミットIDでコミットされます。


### コミットを修正したいとき

```bash
# 修正したいファイル等を修正する

$ git commit --amend

# エディタが開くので、必要があればメッセージを修正、保存
```

こちらも新しいコミットIDでコミットされます。
現在のブランチの先頭のコミットを上書きします。
nasa space apps challenge その２

#概要
nasa space apps challengeに行けないので、勝手にハッカソンしてみる。
準天頂衛星「みちびき」の軌道をcesiumとleafletとgooglemapでプロットしてみる。

#写真
![](http://jsdo-static-contents.s3.amazonaws.com/images/capture/0/Z/o/0ZoA.jpg?t=1490152245)

#成果物
http://jsdo.it/ohisama1/0ZoA

#写真
![](http://jsdo-static-contents.s3.amazonaws.com/images/capture/I/b/7/Ib7P.jpg?t=1490098811)

#成果物
http://jsdo.it/ohisama1/Ib7P

#写真
![](http://jsdo-static-contents.s3.amazonaws.com/images/capture/i/9/c/i9cs.jpg?t=1490085129)

#成果物
http://jsdo.it/ohisama1/i9cs
Mac & Rails でreadlineなエラーが起きた時に対応したこと


ある日のこと、rspecを走らせたらエラーが発生

```
siukaido@siukaidos-MBA:~/sample$ bundle exec rspec
    Sorry, you can't use byebug without Readline. To solve this, you need to
    rebuild Ruby with Readline support. If using Ubuntu, try `sudo apt-get
    install libreadline-dev` and then reinstall your Ruby.
```

readline のバージョンが古いのかなぁと思い、brew upgrade をためしてみる

```
siukaido@siukaidos-MBA:~$ brew upgrade readline
Error: readline 7.0.3_1 already installed
```

・・・が、最新バージョンだった。
んー、どういうことだろうと思って info で見てみる。

```
siukaido@siukaidos-MBA:~$ brew info readline
readline: stable 7.0.3 (bottled) [keg-only]
Library for command-line editing
https://tiswww.case.edu/php/chet/readline/rltop.html
/usr/local/Cellar/readline/6.3.8 (46 files, 2.0MB)
  Poured from bottle on 2015-09-11 at 23:22:41
/usr/local/Cellar/readline/7.0.1 (46 files, 2MB)
  Poured from bottle on 2017-01-20 at 15:05:12
/usr/local/Cellar/readline/7.0.3_1 (46 files, 1.5MB) *
  Poured from bottle on 2017-03-22 at 11:26:03
From: https://github.com/Homebrew/homebrew-core/blob/master/Formula/readline.rb
==> Caveats
This formula is keg-only, which means it was not symlinked into /usr/local.

macOS provides the BSD libedit library, which shadows libreadline.
In order to prevent conflicts when programs look for libreadline we are
defaulting this GNU Readline installation to keg-only.


For compilers to find this software you may need to set:
    LDFLAGS:  -L/usr/local/opt/readline/lib
    CPPFLAGS: -I/usr/local/opt/readline/include
```

いくつかバージョンがあったので、とりあえず 6.3.8 にダウングレード。

```
siukaido@siukaidos-MBA:~$ brew switch readline 6.3.8
Cleaning /usr/local/Cellar/readline/6.3.8
Cleaning /usr/local/Cellar/readline/7.0.1
Cleaning /usr/local/Cellar/readline/7.0.3_1
Opt link created for /usr/local/Cellar/readline/6.3.8

```

したっけ、うまく動きましたとさ。
（ちなみに 7.0.1 だとダメでした）