OmniAICreator/Qiita-1.07M huggingface dataset:
nodejsからAmazon pollyを操作するサンプルスクリプト

ES6記法頑張る

# describeVoices


```javascript:index.js
'use strict';

import aws from 'aws-sdk';
aws.config.loadFromPath('credential.json');

let polly = new aws.Polly({apiVersion: '2016-06-10',region:'us-west-2'});

// describeVoices
let descParams = {
    LanguageCode: 'ja-JP'
};

polly.describeVoices(descParams, (err, data)=>{
   if(err){
       console.log(err);
   } else {
       console.log(JSON.stringify(data))
   }
});
```

### 結果

```json:結果
{"Voices":[{"Gender":"Female","Id":"Mizuki","LanguageCode":"ja-JP","LanguageName":"Japanese","Name":"Mizuki"}],"NextToken":null}

```

CLIと同様問題なく取得できました

# synthesizeSpeech

コールバックにネストして書きます

```javascript:script
let textMsg = 'パンツァーフォー';
       let speechParams = {
           OutputFormat: 'mp3',
           VoiceId: voiceId,
           Text: textMsg,
           SampleRate: '22050',
           TextType: 'text'
       };

       polly.synthesizeSpeech(speechParams).promise()
           .then(data => {
               console.log(data);
           })
           .catch(err => {
               console.log(err);
           });
       });
```

### 結果

```json:結果
{ ContentType: 'audio/mpeg',
  RequestCharacters: '8',
  AudioStream: <Buffer 49 44 33 04 00 00 00 00 00 23 54 53 53 45 00 00 00 0f 00 00 03 4c 61 76 66 35 37 2e 34 31 2e 31 30 30 00 00 00 00 00 00 00 00 00 00 00 ff f3 60 c4 00 ... > }

```

ちゃんと帰ってきました。
CLIでやったときのようにmp3ファイルを取得するには

```javascript:script
polly.synthesizeSpeech(speechParams), (err, data) =>{
    .then(data => {
        console.log(data);
        fs.writeFile('audio/polly.mp3', data.AudioStream, (err) => {
            if (err) {
                console.log(err);
            } else {
                console.log('Success');
            }
        })
    })
    .catch(err => {
        console.log(err);
    });
});
```
こんな感じにすると手元に落ちてきます

# まとめ
SDKで使うのもCLI同様そんなに難しいサービスではないですね
実際は落としたものをS3にUPして何かするのがよいのでしょうか

# スクリプト全体

```javascript:index.js
'use strict';

const aws = require('aws-sdk');
const fs = require('fs');

aws.config.loadFromPath('<クレデンシャルへのパス>');
let polly = new aws.Polly({apiVersion: '2016-06-10',region:'us-west-2'});


// describeVoices
let descParams = {
    LanguageCode: 'ja-JP'
};

polly.describeVoices(descParams)
    .then(data => {
        //console.log(JSON.stringify(data));
        let voiceId = data.Voices[0].Id;

        // synthesizeSpeech
        let textMsg = 'あんずのうた';
        let speechParams = {
            OutputFormat: 'mp3',
            VoiceId: voiceId,
            Text: textMsg,
            SampleRate: '22050',
            TextType: 'text'
        };

        return polly.synthesizeSpeech(speechParams).promise();
    })
    .then(data => {
        console.log(data);
        fs.writeFile('polly.mp3', data.AudioStream, (err) => {
            if (err) {
                console.log(err);
            } else {
                console.log('Success');
            }
        });
    })
    .catch(err => {
        console.log(err);
    });
});
```

# 参考
http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/Polly.html#synthesizeSpeech-property
Amazon Dash Button 利用案

Amazon Dash Button(以下ADB)を改造してこんなのあればいいなと思うもの。

## お年寄り緊急通知システム

- ADBを身に着けておく
  - または、よく行く複数の場所にそれぞれにADBを置いておく
- WiFiを設置しておく
- 緊急時にADBボタンを押すと、管理センターに通知が届き、対応者がかけつける

## クイズシステム

- 答案者が各自2つのADBを持つ
- ADBの１つはYes, もう１つはNo
- 問題の回答Yes, Noを各自選択する
- (100人などの)大規模クイズ大会で使うというのも面白そう
  - アメリカ横断ウルトラクイズ

## 登山者緊急通知システム

ほとんどが「お年寄り緊急通知システム」。
落石、滑落などの緊急時にボタンを押す。

問題はモバイルルーターの電源が入っていないといけない。

通信ができた時は、WiFiの場所を三角測量により位置を特定する(triangulation)。そして、山岳救助隊がかけつける。

## 寺社鎮火システム

- 火事の時に、寺院の管理者がADBを押す
- 設置していた鎮火システムが起動して、鎮火作業をする
- 同時に消防署への通報も行う
docker_image が吐くエラーが文字化けして読めなかった件

（単に自分用のメモです。お急ぎの方は次行っちゃってください。でも初心者の方には役立つ情報もあるかも？）

[IBM MQ](http://www-03.ibm.com/software/products/ja/ibm-mq)の評価のため、[15分でWebSphere MQの環境を構築しメッセージの読み書きを行う](http://kiririmode.hatenablog.jp/entry/20160504/1462363594)というページに従ってコマンドを実行し、Docker コンテナ内で MQ が正常に動作することを確認しました。

次はこれを（練習のため）ansible に組み込もうと、[VirtualBox + Vagrant + CentOS 7.2 の環境](https://github.com/hotta/ansible-centos7)で以下のような ansible playboook を書きました（抜粋）。

```ansible
- name: Building docker container
  docker_image:
    path: "{{ ansible_user_dir }}/mq-docker/8.0.0/"
    name: mq
    tag: mq
```
（ [ ansible 2.2 では docker モジュールは deprecated](https://docs.ansible.com/ansible/docker_module.html) のようですので、[docker_image](https://docs.ansible.com/ansible/docker_image_module.html)を使いました。

で、実行してみると、以下のようなエラーが発生しました。

```bash
TASK [mq-docker : Building docker container] ***********************************
fatal: [localhost]: FAILED! => {"changed": false, "failed": true, "msg": "Error connecting: Error while fetching server API version: ('Connection aborted.', error(13, '\\xe8\\xa8\\xb1\\xe5\\x8f\\xaf\\xe3\\x81\\x8c\\xe3\\x81\\x82\\xe3\\x82\\x8a\\xe3\\x81\\xbe\\xe3\\x81\\x9b\\xe3\\x82\\x93'))"}
```

エラーメッセージが文字化けしてよくわからんので（なんとなく想像はつくけど）、PHP で解読してみました。

```bash
vagrant@mq-docker:~/temp$ cat a.php
<?php
$a = '\\xe8\\xa8\\xb1\\xe5\\x8f\\xaf\\xe3\\x81\\x8c\\xe3\\x81\\x82\\xe3\\x82\\x8a\\xe3\\x81\\xbe\\xe3\\x81\\x9b\\xe3\\x82\\x93';
echo hex2bin(preg_replace("/x/", "", preg_replace("/\\\\/", "", $a))) . "\n";
vagrant@mq-docker:~/temp$ php a.php
許可がありません
```

やはり Permission Denied でしたね。
本当は ( ansbible / python / bash / docker のいずれか）がエラーメッセージを変にエンコードしないようにできればいいのでしょうけど、自分の実力では無理なので、諦めて以下のようにしました。

```bash
vagrant@mq-docker:~$ LANG=C ansible-playbook /etc/ansible/jobs/mq-docker.yml
（略）
TASK [mq-docker : Building docker container] ***********************************
fatal: [localhost]: FAILED! => {"changed": false, "failed": true, "msg": "Error connecting: Error while fetching server API version: ('Connection aborted.', error(13, 'Permission denied'))"}
```

これで正しくエラーを認識できるようになったので、次に進めます。

結論：そもそも日本語モードとか使うな？
Verilog HDLでのノンブロッキング代入とブロッキング代入の動作の違い (授業用)

# ノンブロッキング代入
## 実習1 シフトレジスタの設計
以下のshiftregister.vで設計される回路を実習ボードの実装して、その動作を確かめること。
ただし、top-level entity はshiftregister とする。
入出力の割り当ては表のとおりにすること。

```Verilog:shiftregister.v
`default_nettype none

module shiftregister(
  input   wire        clock,
  input   wire        data,
  output  reg   [3:0] q
  );

  always @ (posedge clock) begin
    q[0] <= data; // ノンブロッキング代入 <= では
    q[1] <= q[0]; // これら4つの代入が
    q[2] <= q[1]; // 同時に実行されるような
    q[3] <= q[2]; // 回路が構築される
  end
  
endmodule
```

|shiftregisterのポート|I/Oデバイス|
|:---:|:---:|
|clock|GCLK3(プッシュスイッチ)|
|data |SA0(トグルスイッチ)|
|q[3:0]| DA3~DA0(個別LED)|

### 解説
ノンブロッキング代入(<=)を用いたshiftregister.vでは、クロック信号clockの立上りのタイミングにおいて、reg型変数q[0], q[1], q[2], q[3]への4個の代入が同時にただ一度だけ実行されるような回路が構成される。その結果、回路としては下図に示すような1bitシフトレジスタが構成される。

![non-blocking.png](https://qiita-image-store.s3.amazonaws.com/0/25656/00b655ca-5ec2-e2bd-1421-8fb15cff3da4.png)

下図にこの回路の動作例をタイムチャートで示す。

![timing-chart-nonblocking.png](https://qiita-image-store.s3.amazonaws.com/0/25656/dfcf6055-eef9-01ca-4cf2-2bc7b2b924cb.png)


# ブロッキング代入
## 実習2 Dフリップフロップの設計
以下のdflipflop.vで設計される回路を実習ボードの実装して、その動作を確かめること。
ただし、top-level entity はdflipflop とする。
入出力の割り当ては表のとおりにすること。

```Verilog:dflipflop.v
`default_nettype none

module dflipflop(
  input   wire        clock,
  input   wire        data,
  output  reg   [3:0] q
  );

  always @ (posedge clock) begin
    q[0] = data; // ブロッキング代入 = では
    q[1] = q[0]; // 上から下へ順に代入が
    q[2] = q[1]; // 行われるような
    q[3] = q[2]; // 回路が構築される
  end
  
endmodule
```

|dflipflopのポート|I/Oデバイス|
|:---:|:---:|
|clock|GCLK3(プッシュスイッチ)|
|data |SA0(トグルスイッチ)|
|q[3:0]| DA3~DA0(個別LED)|

### 解説
ブロッキング代入(=)を用いたdflipflop.vでは、クロック信号clockの立上りのタイミングにおいて、reg型変数q[0], q[1], q[2], q[3]への4個の代入が上の代入式から順に実行されるような回路が構成される。まず、q[0]がdataの値で更新され、次にq[1]が更新後のq[0]の値、すなわち、dataの値に更新される。同様にq[2], q[3]もdataの値に更新される。すなわち、clockの立上りのタイミングでq[3], q[2], q[1], q[0]のすべてが、dataの値で更新されるような回路が構成される。構成される回路図を以下に示す。

![blocking.png](https://qiita-image-store.s3.amazonaws.com/0/25656/0207a11f-a7ee-920a-04d8-bc8c9d32ad45.png)

この回路の動作例を下図に示す。

![timing-chart-blocking.png](https://qiita-image-store.s3.amazonaws.com/0/25656/d5f2b59e-1312-4db7-a092-94e2193fc76e.png)
condaで、設定されているチャンネルの確認方法など

# 概要

biocondaを使うに辺り、いくつか困ったので、それについての調査
* 設定されているチャンネルの確認
* システムワイド（個人の環境ではない）に設定されているチャンネルの設定及び確認
* 個人のチャンネル設定の情報がどこに書かれるか


# 結論

## 個人環境に設定されているチャンネルの確認

```
conda config --get channels
```


## システムワイド（個人の環境ではない）に設定されているチャンネルの設定及び確認

`--system` をつければ良いようだ

### システムワイドのチャンネル設定の確認

```
conda config --get channels --system
```

### システムワイドのチャンネルの追加

```
conda config --add channels conda-forge --system
conda config --add channels defaults --system
conda config --add channels r --system
conda config --add channels bioconda --system
```

## 個人のチャンネル設定の情報がどこに書かれるか

`~/.condarc` に書かれる

ここに、直接書いて設定をすることもできる

`~/.condarc`

```
channels:
  - bioconda
  - r
  - conda-forge
  - defaults
```
MacBook Pro（Touch Bar搭載）でやった初期設定

MacBook Pro（Touch Bar搭載）でやった初期設定とあとで調べるメモ。

# マシンスペック＆周辺機器

* MacBook Pro(13-inch, Late2016, Four Thunderbolt 3Ports)
    * macOS Sierra バージョン10.12.1
    * プロセッサ：3.3GHz Intel Core i7
    * メモリ：16GB 2133MHz LPDDR3
    * ストレージ：256GB
    * 色：スペースグレイ
    * AppleCare Protection Plan for MacBook / MacBook Air / 13" MacBook Pro
* [27UD88-W](http://amzn.to/2gwYu5I)（27"Class 4K UHD IPS LED Monitor）
* [3Q-LEVO Type-C USBハブ ウルトラスリム](http://amzn.to/2gf87Ii)


# 環境設定

## Dock

* サイズを25%程度に変更
* 拡大を有効
    * サイズを75%程度に変更
* 「Dockを自動的に隠す/表示」有効

## セキュリティとプライバシー

* 「ファイアウォール」：入

##トラックパッド

* 「タップでクリック」ON
    * 軌跡の速さ：7
* 「アプリケーションExpose」ON

## ディスプレイ

* 解像度変更：スペースを拡大（1680*1050）
    * 「このMacについて」には内臓ディスプレイ13.3インチ（2560*1600）と表記があるがこの解像度になるのか？
* 輝度100%
* 「輝度を自動調節」OFF
* 「使用可能な場合はメニューバーにミラーリングオプションを表示」OFF
* 「ディスプレイプロファイル」：Adobe RGB1998

## WalletとApple Pay

* 登録できないカードがあったのであとで調べる

## 共有

* コンピュータ名変更
* ローカルホスト名変更
* 「画面共有」ON

## Touch ID

* 右人差し指を初期登録したが、中指追加
    * Appleパーソナルセットアップで聞いた話、MacのTouch IDにはユーザーアカウント1つにつき最大3つの指紋、Macには最大で合計5つの指紋を保存することが可能とのこと。
* パスワード入力の場面をすべてTouch IDにできるか調べる。

## Siri

* 「メニューバーにSiriを表示」OFF
    * ショートカットとTouch Barにも表示されてるので。

## 日付と時刻

* 「日付を表示」ON
* 「時報をアナウンス」ON
    * 没頭防止

## App Store

* 「購入とApp内課金」→ 15分以降は要求
* 「無料ダウンロード」→ パスワードは不要

# その他

## デスクトップ

* 「表示順序」→ グリッドに沿う

* Dockから不要なアプリ削除
    * Siri、連絡先、カレンダー、メモ、リマインダー、マップ、写真、FaceTime、iTunes、iBooks、App Store
    * Launchpadが消えてしまい焦るがアプリケーションフォルダからドラッグで復活。トラックパッドのジェスチャーでもいいのだが、Windoswなどからリモートしたときにないと不便なので＾＾；

## Finder

* 表示形式を「カラム表示」にする
* タブバー表示
* パスバー表示
* ステータスバー表示

## バッテリー

* メニューバーのバッテリーから「割合（％）を表示」ON

# Appleパーソナルセットアップで聞いたこと

## Touch Barの使い方など

* 例えばFinderなどの場合は表示メニューの「Touchbarをカスタマイズ」から、Touch Barに表示したいアイコンを画面からTouch Barにドラッグすることで追加可能。← 最初この意味がわからなかったがアイコンを画面下から外に出す感じでドラッグすると追加される。なるほど！
* SafariでTouch Bar右上のグループに白丸に円グラフのようなアイコンがでる場合があるが、3秒くらいのシークバーがでて謎の音がするだけで、Appleのスタッフもこれが何なのかわからなかった。


# このあと

アプリインストール、Windowsとの連携、クラウドストレージ運用整理、フロントエンドの開発環境構築へ続く・・・（たぶん）
Facebook Messengerアプリで連絡先を登録する方法

#はじめに
約7年くらいFacebookを使っているユーザですが、先日知人に教えてもらって初めて知った、Messengerアプリで連絡先を登録する方法です。

Facebookで友達になる時って、いつも検索しなくちゃいけなくて面倒だなって思っていたのですが、実は簡単にできるのです！

#プロフィールを表示する
Messengerアプリを立ち上げて、赤い枠のところを押すとプロフィール画面になります。

![clip_now_20161201_100331.png](https://qiita-image-store.s3.amazonaws.com/0/97162/40055d93-7eb2-0d41-3a21-2194444fc87c.png)
※画像はAndroid版です。

#マイコードを表示する
真ん中の顔写真のところを押します。

![clip_now_20161201_100331 のコピー.png](https://qiita-image-store.s3.amazonaws.com/0/97162/620ff8fd-eee8-24d6-3cee-eb547deadda5.png)

#マイコード
このマイコードを、コードをスキャンのところから友達に読み取ってもらえば追加完了です！

![clip_now_20161201_100337.png](https://qiita-image-store.s3.amazonaws.com/0/97162/4e0d8d92-6fd9-6786-2bb7-95f67f3eb74c.png)

ちなみに読み取りカメラも丸いです。

#感想
QRコードって四角のイメージが強かったので、丸いコードにかなりおどろきました。
日々の仕事で疲れた心を癒す為。part1

こんちには、はじめまして。ウサゲッティです。

日々の仕事の中、パソコンに向かい疲れていませんか？

私のテーマは思考を変えまして、
そんな**疲れた心**と**体**を**リフレッシュ**する方法を記事にしようかなと。
※あくまで個人的な意見で説明します。
![uwaxa.png](https://qiita-image-store.s3.amazonaws.com/0/151953/3eb923c5-4687-a93b-629c-8a9dddccf4a6.png)


さっそくですが、皆さんがすっきりとした気持ちでプログラムできるように。
本テーマは、人が感じる五感の**「視覚」**、**「嗅覚」**に焦点を当て、
**インテリア**、**アロマテラピー**を用いて
下記5回に分けて記事にして行きたいと思います。



 - 癒しとは？

 - 眼球疲労・疲れた心→疲労回復 (癒しUP)
  
 - 仕事の効率化→集中力向上 (集中力UP)

 - 提案/プレ前の緊張→リラックス (自信UP)

 - 異性と恋がしたい！魅力的になりたいあなたへ (魅了UP)



初回は人が癒されるメカニズムをご説明します。
※あくまで個人的な意見です。 (大事な事なのでry)

「早く本題進めなよ」tkに言われそうですが、
"なぜ"人は視覚・嗅覚で癒されるのか。を自身で**認識する事**によって、
より**効果的に癒される**からと思うからです。
※あくまで個人的な意見です。 (大事な事なのでry)

癒しとは？
--------



###■香りで癒される
```
脳の大脳辺縁系が〜とか、香りを嗅ぐと香りの成分が鼻の粘膜に付着し、電気信号に〜〜〜〜。・・(某サイトから引用)
```
なんて難しいことは置いといて。

人は**「いい香り」**だという感情を**反射的に感じ**、その後、何のにおいだろう？という情報に変換されます。
単純に言うと頭を使わずに**直感で香りを感じる**事が出来るという事。
もう嗅いだ瞬間から自然とリラックスしてるんですね。
![usa3.png](https://qiita-image-store.s3.amazonaws.com/0/151953/72a98848-177b-729e-e87c-a8073e96cc61.png)


###■視覚で癒される
```
「知性に関わる新しい脳、大脳新皮質が〜・・・・ry」
```

逆に視覚で癒されるというのは**"情報から連想し癒される"**です。
例えば部屋の模様替えだと、「アジアン風、モダン風、木々を感じるような〜」と頭の中で一度考え、
**自分の好きな空間で癒される**事ができます。


結論
--------
つまり、**香り**は**直感**で**視覚**は**思考**で癒されるという事です。
※あくまで個人的な意見です。 (大事な事なry)
癒される為には、「あっ、この香り好き！」って思った香りを嗅いだり、
自分の仕事環境を好きなレイアウトにする。
それだけで良いと思います。
![usa2.png](https://qiita-image-store.s3.amazonaws.com/0/151953/6b8bc4ab-971f-8b65-23a1-50f27591fd41.png)

が・・・・・・
それでは、本テーマのお話が終わってしまうので、

次回から個人的に癒される香り・インテリアをご紹介していきます。  
不定期に。

では今日はここまで。ﾉｼ
同一端末で、複数のgithubのアカウントを使いたい(自分メモ)

1. 公開鍵、秘密鍵を作成する
```
$ ssh-keygen -t rsa -C "メールアドレス" -f ~/.ssh/新しい鍵のファイル名
```

2. ~/.ssh/configの設定  
```
Host 適当に(github-新しいアカウント名など)  
  HostName github.com  
  IdentityFile ~/.ssh/new_id_rsa # 作成した秘密鍵を指定  
  User git  
  TCPKeepAlive yes  
  IdentitiesOnly yes  
```

３．作成した公開鍵をGitHubに登録する

4.作成したリモートリポジトリをローカルに登録
```
$ git remote add origin git@.ssh/configのHostNameの名前:githubの新アカウント名/XXX.git
```
Mac ローカル環境でHerokuを使用する手順

## Mac ローカル環境でHerokuを使用する手順
http://tande.jp/lab/2012/05/1728

1. 以下でheroku toolbelt をインストール
Download and run the OS X installer.
https://devcenter.heroku.com/articles/heroku-command-line

2. heroku login
3. heroku create
Karabiner-ElementsをいじっていたらMacBookの内蔵キーボード(JIS)がUSキーボードに認識された件

##問題
macOS Sierriaにて。PHPStormで\をタイプすると¥になってしまうのでKarabiner-Elementsをいじって（アンインストール/再インストールなど）いたらMacBookの内蔵キーボード(JIS)がUSキーボードに認識されてしまいました。なかなかJISに戻せず、苦労したので共有します。日本語の入力ソースを削除→追加しても効果なし。PRAMリセットもSMCリセットも効果なし。/Library/Preferences/com.apple.keyboardtype.plistは見当たらない。
##解決策
Karabiner-ElementsのKeyboard TypeをJISにしたらとりあえずJISキーボードになりました。PHPStormではalt押さないと¥のままですがとりあえず解決しました。
<img width="912" alt="スクリーンショット 2016-12-06 13.59.49.png" src="https://qiita-image-store.s3.amazonaws.com/0/115844/25897d8b-97d0-e7a4-6115-b3ca1f7ffa45.png">
認証 Proxy 環境下な chocolatey で 407 が出まくった話

# そもそも chocolatey ってなに？

簡単に言うと Windows 版パッケージマネージャー。
Linux でいう yum とか apt-get とか。
PowerShell で簡単にインストール/アップデートができるので、コマンド大好きな人にはオススメ。
有償版もあるけど、無償版でも十分。

> https://chocolatey.org/

# 簡単なリファレンス

注：実行時は PowerShell を管理者権限で実行しましょう。

choco のインストール

```ps1:PowerShell
# スクリプトを実行できるようにポリシーを RemoteSigned にセット
Set-ExecutionPolicy RemoteSigned

# Proxy 無関係な方はこれだけ
iwr https://chocolatey.org/install.ps1 -UseBasicParsing | iex

# Proxy 環境下な方々
iwr -Proxy http://<ProxyServer>:<ProxyPort> https://chocolatey.org/install.ps1 -UseBasicParsing | iex

# 認証 Proxy 環境下な方々
$cred = New-Object pscredential("<ProxyUser>", $("<ProxyPassword>" | ConvertTo-SecureString -AsPlainText -Force))
iwr -Proxy http://<ProxyServer>:<ProxyPort> -ProxyCredential $cred https://chocolatey.org/install.ps1 -UseBasicParsing | iex
```

パッケージの検索

```ps1:PowerShell
choco search <PackageName>

# 以下、例
choco search googlechrome
choco search 7zip
choco search thunderbird
```

パッケージのインストール

```ps1:PowerShell
choco install <PackageName> -y

# choco search で返ってきた結果をコピペするのが確実
# -y オプションは confirm スキップ
```

パッケージのアップデート

```ps1:PowerShell
# 全パッケージをアップデート
choco upgrade all -y

# 特定パッケージをアップデート
choco upgrade <PackageName> -y

# 昔の版では update だったけど、いつからか upgrade に変更
# -y オプションは confirm スキップ
```

パッケージのアンインストール

```ps1:PowerShell
choco uninstall <PackageName>

# なお all も指定可能 (全パッケージのアンインストール)
```

詳細はヘルプ参照のこと

```ps1:PowerShell
choco -h
choco <Command> -h
```

# choco における Proxy 設定

最新版は v0.10.3 なのだけど、v0.9.9 から Proxy を正式サポートした。
それまでは choco のネットワークモジュール (PowerShell Script) をちょちょっと弄って、認証 Proxy でも通る様にしてた。

v0.9.9 以降では、下記コマンドで Proxy の設定ができる。

```ps1:PowerShell
choco config set proxy <ProxyServer>:<ProxyPort>
choco config set proxyUser <ProxyUser>
choco config set proxyPassword <ProxyPassword>
```

# 設定しているはずなのに 407

上述のコマンドで choco コマンドが認証 Proxy を通る様にしたのだけど、なぜか実行する度に毎回ユーザーとパスワードの入力を求められる。

さらには 407 が返ってくる。
認証情報を渡しているにも関わらず、だ。

情報が少ないこともあり、調査にいろいろ手こずっていた。

# 直ったけど原因不明

最悪ネットワークモジュールをまた弄ろうかなー、なんて思っていた今日この頃。

いじくり倒す前に、「どうせ毎回認証情報の入力を求められるなら、設定情報消すか」と思い立ち、認証情報の設定を削除。

```ps1:PowerShell
choco config unset proxyUser
choco config unset proxyPassword
```

この状態でアップデート実行。

```ps1:PowerShell
choco upgrade all -y
```

いつも通り認証情報を聞かれるので入力。

```ps1:PowerShell
User name: hogehoge
Password: ********************
```

...

407 が返ってこなくなった、、、だと？

いつも 407 が返ってくる Chrome やら SourceTree やらが次々とアップデートに成功する・・・。

以下いつも 407 が返ってきてた子たち。なんかあっさり成功しちゃってる・・・。

```ps1:PowerShell
Upgraded:
 - ccleaner v5.24.5841
 - googlechrome v55.0.2883.75
 - firefox v50.0.2
 - thunderbird v45.5.1
 - teraterm v4.93
 - sourcetree v1.9.6.2
```

もしや、、、と思い、認証情報を再度設定し、アップデート実行。

```ps1:PowerShell
choco config set proxyUser <ProxyUser>
choco config set proxyPassword <ProxyPassword>

choco upgrade all -y
```

認証情報が聞かれない・・・。マジ？

認証情報を手動入力したときに全部アプデされちゃったため、407 が返ってくるか否かはわからないけれども、直った気がする。

ちゃんとした原因は不明なんだけれども、設定が悪かったのは確実か。

# まとめ

なんだかよくわらかないまま直ってしまったので腑に落ちない。
というか気持ち悪い。

個人的な見解だけども、古い版からずっと使ってきたからゴミが残っていたのではないかと。

choco をインストールしていないマシンで試してみるか・・・。
Grape Swagger バージョン別の注意

#この辺参考に
[grape-swaggerでgrapeでつくったAPIのドキュメントを自動生成する](http://qiita.com/kazuph/items/7a63d1cf22f2c6ab509d)
[RailsAPI + Grape + Swaggerでドキュメントの自動生成可能なWebAPIをつくる](http://qiita.com/HKDnet/items/0267606d5f47fe4ffdf4#_reference-6958463d8b9a28ea6428)
[Rails + Grape + Swaggerで簡単APIドキュメント](http://qiita.com/rneuo/items/cd96694ee0f91feda50f)

#本家のバージョン新しくて動かねぇ！！！
プロジェクトで仕様でgrapeのバージョンが0.13.0を使用していた
-> grape-swaggerが0.7.２は動かず
どうやらgrapeのバージョンが上がってGrape::API.settingsがどっか行った模様
https://github.com/ruby-grape/grape-swagger
↑本家
ここを見ると各バージョンの対応表がある
ここ参考にバージョンの壁にぶつかったら適宜変える
0.13.0だったら、grape-swaggerは0.10.5を使う
grape-entityの変更もできるなら0.20~を使った方がいいかもしれない(知らん
SnackbarのActionButtonを押した時にSnackbarを表示しっぱなしにする

Snackbar.LENGTH_INDEFINITEを指定してるに、アクションボタンを押すとSnackbarが閉じてしまうが、下のコードで回避できた。

<img width="325" alt="（件名なし）_-_info_yusuke_arai_gmail_com_-_Gmail.png" src="https://qiita-image-store.s3.amazonaws.com/0/99731/e61f1a71-ce97-5786-c13a-8c27b4029473.png">

```java:MainActivity.java

FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);

final Snackbar snackbar = Snackbar.make(fab, "メッセージ" , Snackbar.LENGTH_INDEFINITE);

final Button btn = (Button) snackbar.getView().findViewById(android.support.design.R.id.snackbar_action);

btn.setText("ボタン");

btn.setVisibility(View.VISIBLE);

btn.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
         Toast.makeText(MainActivity.this, "押された", Toast.LENGTH_SHORT).show();
    }
});

fab.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        snackbar.show();
    }
});

```
Dockerでカレントディレクトリをnginxに渡してHTTPで確認する

手元の`index.html`や`foo.js`みたいなものを簡単にHTTP経由でみたい時に
Dockerのnginxイメージを利用すると簡単に確認ができる。

```
docker run --rm -v `pwd`:/usr/share/nginx/html/:ro -p 80:80 nginx
```
エスケープシーケンスを使ってロゴを動かす

エスケープシーケンスを利用して遊んでみました。
[エスケープシーケンスの詳細な使い方はこちら](https://en.wikipedia.org/wiki/ANSI_escape_code)


# 色を変更する

```bash
$ echo -e '\033[32mTEST\033[0m'
```
![color.jpg](https://qiita-image-store.s3.amazonaws.com/0/102790/d9f6651a-4db4-f942-1493-700220aec2b6.jpeg)


# カーソルを移動する

```bash
$ echo -e '\033[5BTEST'
```
![move.jpg](https://qiita-image-store.s3.amazonaws.com/0/102790/e60d31e6-ca9f-d0c8-4897-1e747e839038.jpeg)


# 両方（カーソルを移動して、色を変更）

```bash
$ echo -e '\033[5B\033[32mTEST\033[0m'
```
![color&move.jpg](https://qiita-image-store.s3.amazonaws.com/0/102790/fff79198-c1f4-1147-0189-6f0bd66068ab.jpeg)


# ロゴを動かす
これらを使って私が大好きな kintone のロゴを動かしてみました。
が、表示数が多くて目が痛い感じになりました・・・Orz
[![https://gyazo.com/ff80abaf8d9b27462433eaa28f0d25e2](https://i.gyazo.com/ff80abaf8d9b27462433eaa28f0d25e2.gif)](https://gyazo.com/ff80abaf8d9b27462433eaa28f0d25e2)

表示数が少ないといい感じです。ロゴじゃないですが・・・
[![https://gyazo.com/9e9f67d07909d8af495fa83c20bc96a8](https://i.gyazo.com/9e9f67d07909d8af495fa83c20bc96a8.gif)](https://gyazo.com/9e9f67d07909d8af495fa83c20bc96a8)


# ソース
手元で動かしたい方はこちら

```bash
$ git clone https://github.com/cy-takeuchi/kintone-fun.git
$ cd kintone-fun
$ ./kintone
```
Macでディレクトリを再帰的にファイル内の文字列を一括置換する


`find`で再帰的にファイルを検索して`grep -v`でログファイルなどの不要なファイルを除外して`sed`で置換。
Macの`sed`のiオプションがlinuxと挙動が違うので`-i`だけではなく`-i ''`とする。

```bash
find . -type f | grep -v '\.log$' | xargs sed -i '' 's/hoge/fuga/g'
```
Github 公式Desktopアプリが便利かも

GitHubが提供しているDesktopアプリが結構便利。
Socetreeとかだと、UIが複雑で何をすれば良いのかわからない。
特に一番てまになる最初の設定で戸惑ってしまう。

公式のアプリはUIがSocetreeよりも単純かされているのでわかりやすい。
※ただしiOS 10.x以降しか出ていない。

インストールはトップページからすぐにダウンロードでき、そのままアプリケーションフォルダーにインストール
https://desktop.github.com/
![スクリーンショット 2016-12-06 8.45.56.png](https://qiita-image-store.s3.amazonaws.com/0/23659/5d9a72fa-5d42-e97a-4b10-7b2014c216be.png)

##Repositoryの設定
まず、githubのメニュー「＋（プラスボタン）」から「New repository」を選択します。
次の画面でRepository名を入力します。これで、Github上でリポジトリが作成されます。
![image](https://qiita-image-store.s3.amazonaws.com/0/23659/5dd71ea1-31e6-1046-da71-14cd125b86d1.png)

多分、僕があまりSocetreeに慣れていないため、作りにくいと感じたんだと思いますが、localからこのGithub上のリポジトリにアクセスするのが大変だったので、今回は別のツールを使いました。
ターミナルでやる方法もあるみたいですが、デザイナー出身だとハードルが高かったです。

localにインストールしたデスクトップツールを立ち上げ、メニューバー「Repository」から「Repository Settings」を選択します。

![image](https://qiita-image-store.s3.amazonaws.com/0/23659/6168d711-2efc-9a85-4f4c-e7003ab9c22d.png)

そうすると、先述したGithubのリポジトリURLを入力する画面が表示され、そこにURLを入力すれば完了です。
勝手につないでくれます。
ローカル上で設定したGithub用のフォルダにファイルを入れると、そのファイルとGithubが同期した状態になります。
これで、更新したものや追加したものなどをメニュー「Repository」から「Push」でアップすることが可能です。
windows OS の各プロダクト ID 取得

# OS 自体のプロダクトID
## 自作する場合
  
  1. 拡張子を`.vbs`で保存
  1. ダブルクリック
 
```vbnet
Set WshShell = CreateObject("WScript.Shell")
MsgBox ConvertToKey(WshShell.RegRead("HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\DigitalProductId"))

Function ConvertToKey(Key)
Const KeyOffset = 52
i = 28
Chars = "BCDFGHJKMPQRTVWXY2346789"
Do
Cur = 0
x = 14
Do
Cur = Cur * 256
Cur = Key(x + KeyOffset) + Cur
Key(x + KeyOffset) = (Cur \ 24) And 255
Cur = Cur Mod 24
x = x -1
Loop While x >= 0
i = i -1
KeyOutput = Mid(Chars, Cur + 1, 1) & KeyOutput
If (((29 - i) Mod 6) = 0) And (i <> -1) Then
i = i -1
KeyOutput = "-" & KeyOutput
End If
Loop While i >= 0
ConvertToKey = KeyOutput
End Function
```
## windows 標準機能を利用する場合
```bat
> slmgr /dlv all
```

# プロダクトキー取得アプリ
- [ProduKey](http://www.nirsoft.net/utils/product_cd_key_viewer.html#DownloadLinks "ProduKey - Recover lost product key (CD-Key) of Windows/MS-Office/SQL Server")

# 参考
- [WIndowsとMicrosoft Officeのプロダクトキー確認方法 - Opensourcetechブログ(ZeusITCamp裏BLOG)](http://opensourcetech.hatenablog.jp/entry/2015/10/14/WIndows%E3%81%A8Microsoft_Office%E3%81%AE%E3%83%97%E3%83%AD%E3%83%80%E3%82%AF%E3%83%88%E3%82%AD%E3%83%BC%E7%A2%BA%E8%AA%8D%E6%96%B9%E6%B3%95 "WIndowsとMicrosoft Officeのプロダクトキー確認方法 - Opensourcetechブログ(ZeusITCamp裏BLOG)")
- [View or change the Office or Outlook Product Key - MSOutlook.info](https://www.msoutlook.info/question/537 "View or change the Office or Outlook Product Key - MSOutlook.info")
Pythonで因数分解

自然数 $n$ $(n\geq2)$ をPythonで因数分解します。

##関数 factorization()

```factorization.py
def factorization(n):
    if n > 1 and n % 1 == 0:
        for i in range(2, int(n**0.5)+1):
            if n % i == 0:
                print("%d = %i"%(n,i),end="")
                m = n // i
                j = 2
                while j <= m:
                    if m % j == 0:
                        print("*%d"%j,end="")
                        m = m // j
                        j = 2
                    else:
                        j += 1
                break
        else:
            print("%d is a prime number"%n,end="")
    else:
        print("error",end="")
    print()
```

##実行
合成数

```
>>> factorization(18)
18 = 2*3*3
```
素数

```
>>> factorization(97)
97 is a prime number
```

自然数でない場合、「error」が返されます。

```
>>> factorization(-3)
error
```
```
>>> factorization(2.1)
error
```
最後に

```
>>> for x in range(2,21):
...     factorization(x)
...
2 is a prime number
3 is a prime number
4 = 2*2
5 is a prime number
6 = 2*3
7 is a prime number
8 = 2*2*2
9 = 3*3
10 = 2*5
11 is a prime number
12 = 2*2*3
13 is a prime number
14 = 2*7
15 = 3*5
16 = 2*2*2*2
17 is a prime number
18 = 2*3*3
19 is a prime number
20 = 2*2*5
```
Testable Swift、あるいは僕らがテストを書かない理由

この記事は、「Speee Advent Calendar 2016」の6日目です。

# iosアプリエンジニアはテスト[^1]を書かない?
TDDやテストコードを書く重要性が叫ばれて久しいですが
日々業務でiosアプリ[^2]のコードを書いていると中々テストを書く機会がありません。
また、社外のエンジニアの方とお話させて頂いても、あまり積極的にテストを書くプロジェクトは少ないように感じます。

この記事ではiosアプリでテストを書かない(書きづらい)理由と、それを突破してテストを書くにはどうすればいいかを考えてみます。

# UIのテスト
XcodeにはUIテストツールが含まれています。

コードベースで動作を指定して画面操作をシミュレートすることが可能ですが
あまり有効に活用できている現場は無いように感じます。

おそらく問題点は2つあって
一つ目はシミュレータの動作の遅延などによって再現性の低いバグを引き起こすことがある(しかも実感としてけっこうある)

そのため、UIテストをCIでrequiredなテストにすると開発に不要なボトルネックになりかねないですし、
逆に「CIで落ちても良いや」と言って落ちたままにしているとオオカミ少年的なテストになってしまいます

もう一つはメンテナンスコストの問題で
UITestでテストしたい状態まで画面を進めていくのは結構面倒くさい(ログインとか)上に
画面の改修によって簡単に動かなくなるので、手間の割には効果を受けにくいテストでもあります。


# リフレクションが無い = モッククラスを作れない
Swiftにはリフレクションが無く、それ自体はわりと好評だと思う・・のですが、
ことテストに関わる部分でモッククラス(テストダブル)を非常に作りづらいです。
特に他の言語でモッククラスを作りながらテストするのに慣れていると大変な面倒くささを感じるポイントです。

# Swiftでモックテスト
Swiftでモックによるテストを実現しようとするとDIの設計を考慮する必要があります
ただDI自体もリフレクション無しで実現しようとすると、テスト対象の実装コードをDI出来る形にちゃんと設計する必要があり、場合によっては大幅な改修が発生します。
テストを書くために本体のコードを書き換えるというのはリファクタリングの一つではあるのですが、
ある程度出来上がった実装からやっていくのは中々しんどいかなとは思います。

特に通信まわりなどの低レイヤーにあるコードは、他の多くのコードから依存されるため
テストを書く際のボトルネックになりがちです(なった)。
逆にこういったコードをDI出来るような改修ができれば、一気にテストを書きやすくなるでしょう。


#マルチスレッドのテスト
iosアプリはもともとマルチスレッドを前提に作られていますが、
このマルチスレッドであるということと単体テストがとにかく相性悪いです

いわゆるレース状態による銀行口座のバグなどがよくある例ですが、
こういったマルチスレッド特有のバグを検証しようとすると

- インスタンスに変更を加える全ての処理毎に前後関係をテストする
    - 無限にテストが増えるので無理
- 大量にスレッドを生成してたまたまバグが発生するのを待つ

といったアプローチで、バグを見つける可能性を高めることは出来ますが
バグを見つけきるのは非常に難しいです。


# テストカバレッジの高さ ≠ 品質
「テストを書く」という行為はソフトウェアの品質をなんらかの形で向上させようとする行為といえます。
品質という目に見えないものを見える化するための指標(メトリクス)としてはテストカバレッジやバグ率、クラスの結合度といったものがあります


アプリのコードは上記のマルチスレッドの問題とあいまって
カバレッジが100%でも起きるバグがある(しかも結構ある)
-> カバレッジの高さ ≠ 品質
-> つまりいろんなテストを書いてカバレッジを上げる作業と品質の改善に相関が薄い


これは実感としても、テストカバレッジを頑張って向上させるよりも
さっさと実機テストのフェイズに進んで
適当に画面ポチポチしていたほうがバグの発見につながるように思います。


この部分は、基本的にシングルスレッドで動作するrailsの世界でテストカバレッジが品質指標として重視されていることと対比すると面白いです。

# iosアプリのテストを書くには

プロジェクトの客観的指標としてテストカバレッジなどを目標設定しても品質的な効果は薄いと言えます。
そうするとテストを書くモチベーションは、逆に主観的な安心感を改善させるために、「テストを書きたいときに書ける」環境つくりが重要に思えます。

以下にiosのテストを改善させるためのポイントをまとめてみました。
開発の参考にして頂ければ幸いです。

### プロジェクトとして
- まずはCIを用意してテストが実行される環境を作る
    - 主体的にテストを書きたいと思った人が書ける環境づくり
- 作ったテストは必ずメンテナンスする
- CIが落ちても実装が進むような不健全な状態を避ける
    - 逆に、費用対効果が合わずにメンテナンスできないようなテストコードは、その時点では必要以上のテストであると判断出来るはず
- プロジェクトとしてのテスト基準を作るときは慎重に決める


### マルチスレッドのテスト
- 参照透過性を意識してコードを書く
- 可能な限り変数をletで宣言しimmutableな値を参照させるようにする
- 少なくとも複数のスレッドから更新される値を極力無くす

### テストモックについて
- タイミングを見てDI可能な設計に切り替えていく
    - 工数はかかるが効果は大きい



#### 脚注
[^1]: 以下、「テスト」はXCTestやQuickを前提とした単体テストを指します
[^2]: 今回の話ではライブラリ開発ではなく、ストアに公開するiosアプリの開発者を想定しています
手書きワイヤーフレームのススメ

![main.png](https://qiita-image-store.s3.amazonaws.com/0/54596/f5172779-88a0-cc00-eb20-c0fa0c8d73ac.png)

みなさん、デザイン作り始めるときノートと鉛筆使ってますか。
私はめっちゃ使います。
今回は「紙にアウトプットすると良いことあるよ」というお話です。


#手書きワイヤーフレームを引く利点
- 推敲が楽チン（書いたり消したり）
- ノートひとつあればすぐ確認に走れる
- ページ構成の「設計」思考が身につく





#【実例】ワイヤーフレームを引かなきゃ損！

実際のお仕事の流れを追いながら、ワイヤーフレームの便利さを訴えていきたいと思います。



##まず構成案を読み解く

はじめに受け取った構成案を眺めます。
今回作成するのはLP（ランディングページ）の「FXのはじめかた」。
FX初心者（女性）に向けたHowTo記事です。

ディレクターから受け取った構成案はコレ。↓
FX初心者向けのイロハが丁寧に解説されています。

![fx0.png](https://qiita-image-store.s3.amazonaws.com/0/54596/7145ce44-09b3-bade-0a68-6beff749bf0a.png)

###<i class="fa fa-pencil-square-o" aria-hidden="true"></i>ディレクターの意図を聞く
ヒアリングの結果、ポイントは３つ。
>
- ターゲット：FX初心者の女性（主婦、OL）
- 清潔感
- 心理的ハードルを下げてもらう（こわくない／カンタン／手軽に始められる）

###<i class="fa fa-pencil-square-o" aria-hidden="true"></i>分からなかった部分をメモしておく
正直FXについての知識がないので単語の意味とかサッパリです。
ちょうどターゲットと同じ「FX初心者」の立場なので、どの辺が分かり難いのか脳内で整理します。
>
- そもそもFXって何？
- 登録〜取引まで一息に羅列してあり、頭が追いつかない
- 末尾の専門用語録（「通貨ペア」「ロット」など）が、どのステップに関わってくる単語なのか分からない

###<i class="fa fa-pencil-square-o" aria-hidden="true"></i>競合サイトを調べる
知識がないと作れなかったので、自分でも軽くFXについてレジュメを作りました。
それと並行して競合サイトやFX企業がどんな風に、どんな点を解説しているかをチェックします。




##大筋のワイヤーを引く

頭のながで大筋が立ったらワイヤーを引いて
ディレクターと擦り合わせをします。

![w01.png](https://qiita-image-store.s3.amazonaws.com/0/54596/bd44e417-c7ca-5da8-0b78-2577a67e2520.png)


ステップ毎に情報を区切ってみました。
相談して、冒頭に「そもそもFXとは何か？」を解説する導入部分を入れさせてもらいました。



##デザインを含んだワイヤーを引く

大筋の流れにOKが出たら
デザインの構成要素がわかるレベルのワイヤーを引きます。
>
- 人物写真（女性）を使ったヘッダー
- 軽めで、堅苦しくないデザイン

![w02.png](https://qiita-image-store.s3.amazonaws.com/0/54596/b0947c41-aa7f-527e-6705-5a8ce13a9263.png)


最後の擦り合わせです。
ディレクターにOKをいただいて、デザインの実制作に入ります。



##完成！
![fx_fix.png](https://qiita-image-store.s3.amazonaws.com/0/54596/32177462-894b-b9c7-b215-a90278f8ca4e.png)
http://osaifu.com/contents/fx_beginner/

###<i class="fa fa-pencil-square-o" aria-hidden="true"></i>おわりに
ワイヤーフレームからデザインをスタートさせると
大枠→項目→詳細なデザインへとデザインを詰めていくことができます。
また、webデザイナーの大切な仕事のひとつでもある
情報整理の技能も磨くことができます。

また、ワイヤーモックを見ながらディレクターと話すことで
早い段階で完成イメージを共有することができます。
「ココの訴求が弱い」「情報を追加したい」といった軌道修正も事前にできるので
結果的にデザインの手戻りを減らし、制作時間を短縮することができます。




#おまけ
ワイヤーよくわからない…引き方が分からない…という方は
有名サイトのTOPページのワイヤー（スマホ版が手軽でおすすめ）を引いてみるのをおすすめします。
慣れてきたら第二階層のページや導線の動きなんかも見てみると面白いです。

LINE

![line.png](https://qiita-image-store.s3.amazonaws.com/0/54596/c7113b80-773d-b2c3-c6f0-69d2dd6be781.png)

Sumally

![smry.png](https://qiita-image-store.s3.amazonaws.com/0/54596/21df8686-722d-b0dd-b47f-268680f037a9.png)


以上、お粗末様でした。
コンソールで動くエディタを作る(6日目) 表示部分の実装・文字コードで悩む

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

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

> 今日は淡々と実装していきます

# ひたすら実装する

いままでの回で実装していた細かい部品をひたすら設計に当てはめていきます。

あんまり書くことがない・・・・

# とりあえず、今までの部品をつなぎ終える

足りない部分がかなりありますが、表示のところは少し出来てきました。
main.cを、作成中のエディタで表示してみました。
画面上端にファイル名が表示されています。

![スクリーンショット 2016-12-06 12.41.03.png](https://qiita-image-store.s3.amazonaws.com/0/151926/ea302819-74c7-3d2f-d65b-6c4de3698cf5.png)


# マルチバイト文字のキーボード操作を考える(悩み中)

3日目にキーボード操作について調べましたが、そのときは文字が1バイトである、という前提があるコードでした。

そのままだと困るので、マルチバイト文字の長さを知る方法を調べます。

[ここ](http://qiita.com/masakielastic/items/37914cbf89c8c827d1f3)が非常に参考になりましたが、どうも自分が作成したプログラムに上手くあてはめれません。

理由は、マルチバイト文字がきちんと配列にはいっておらず、途中で他の配列(連結リストした先)や入力バッファに分断した状態で入っているためで、「ヌル終端で、マルチバイト文字が途切れていない文字列」の状態に持っていくのが難しいからです。

同じ人の[ここ](http://qiita.com/masakielastic/items/abf8e54344034f9b089c)を読みながら、文字の状態をどう扱うか悩んでいます。UTF8決め打ちでいいのかなぁ、とか。


# 今日のまとめ

- もくもくと実装しています

前回分の移植が多かったため、あまり書くことがなかったのですが、結構進んだぞ！と思っています。
覚書「git checkout .」が効かないだと！！

まだ、addもcommitもしてない内容を元に戻す秘技（？）、それが

```
git checkout .
```

のはずが...
φ（．．）ポチッ ...あれ？かわらん
φ（．．）ポチッ ...あれ？かわらん


ﾊﾞﾝﾊﾞﾝﾊﾞﾝﾊﾞﾝﾊﾞﾝﾊﾞﾝﾊﾞﾝ
ﾊﾞﾝ　　　　 ﾊﾞﾝﾊﾞﾝﾊﾞﾝ
ﾊﾞﾝ (∩`･ω･)　ﾊﾞﾝﾊﾞﾝ
　＿/_ﾐつ/￣￣￣/
　　　＼/＿＿＿/￣￣


# 結論

リポジトリのルートにいなかっただけでした。
（配下のディレクトリにいました）

```
git checkout .
```
のドットは現在いるディレクトリ配下ってことなので、全然関係ないところにいると元に戻りません。
Hyalite 2016

この記事は[Opal Advent Calendar 2016](http://qiita.com/advent-calendar/2016/opal)の5日目の投稿として書いています。

今日はこのアドベントカレンダーですっかりおなじみになったHyaliteについて近況を報告しようと思います。
なんか自分のgemばかり紹介するアドベントカレンダーになってしまっていますが、他に書くひとがいないのでしょうがないですね。
明日のyharaさんの記事に期待しましょう。
Opalのいろいろなgemを紹介したりしたいのですが、台湾での発表の熱があるうちにこの辺りのことを書いておこうと思います。

ここまで書いて、旅行つかれにより寝落ちました。公開遅れてすいません。yharaさんの記事ももう公開されていますね (> <)

さてHyaliteのアップデートですが、とはいえそれほど大きなアップデートがあったわけではありません。

* `force_update`メソッドが追加されました。[38d4119f](https://github.com/youchan/hyalite/commit/38d4119fda558e454c485365b7cf509b7e4b9186)
* `render`するだけのコンポーネントを簡単に書けるようになりました。[610bf23f](https://github.com/youchan/hyalite/commit/610bf23f154ea16550d53b547b3202711a194809)
* `class`や`for`といったプロパティは`className`,`htmlFor`などのようにキーワードと被らないような名前を使っていましたがそのままの名前でも使えるようになりました。[0c4b0dd7](https://github.com/youchan/hyalite/commit/0c4b0dd755ff02e7d658a6d5c2c89d812a69d21a)
* `Hyalite::Component::ShortHand`に`pp`メソッドを追加しました。(`p`メソッドは`<p>`タグを表すために使われているため`Kernel#p`はシャドウされてしまっています。) [cfc8b999](https://github.com/youchan/hyalite/commit/cfc8b9998661014aa9e2b0523e92af94022e6636)
* `initial_state`を`state`でDSL的に宣言できるようなり、`state`の参照方法もメソッドとして呼びだせるようになりました。[4e02842e](https://github.com/youchan/hyalite/commit/4e02842ecfdd2bea3c90d318810a1cfdc02f34b5)
* `Hyalite::Component::ShortHand`を`include`しなくてもよくなりました。[cf6e9276](https://github.com/youchan/hyalite/commit/cf6e92768f671604d4c2c5941d38ee442c17ae3a),[6f4e2266](https://github.com/youchan/hyalite/commit/6f4e22662a630e39026779de311d1a1d79b154e5)

記述方法が多少短かく書けるようになったとかそんな感じです。
結果、READMEに書かれていたサンプルは以下のように書けるようになりました。

```ruby
require 'hyalite'
require 'browser/interval'

class ExampleView
  include Hyalite::Component

  state :count, 0

  def component_did_mount
    every(5) do
      @state.count += 1
    end
  end

  def render
    div({class: 'example'},
      h2(nil, @props[:title]),
      h3(nil, "count = #{@state.count}")
    )
  end
end

$document.ready do
  Hyalite.render(Hyalite.create_element(ExampleView, {title: "Hyalite counter example"}), $document['.container'])
end
```
Google Cloud Platform（GAE, GCE）: Secret variables（環境変数）の設定方法

## 背景
主にGAE(Ruby, Flexible Environment）を用いてPaaSを構築していたところ、githubなどにコミットしたくないsecret variables（ここでは環境変数。データベースのパスワードやsecret tokenなど）の設定方法で小一時間ほどハマったのでメモ。

## なぜハマったか
Herokuで同様にPaaSを構築した際には、環境変数はGUIもしくはコマンドラインツールから簡単に設定できていた。
Herokuの場合: 

```
# 環境変数一覧
$ heroku config

# 環境変数名を指定して参照
$ heroku config:get ENV_VAR_NAME

# 追加 (一応addも使えます)
$ heroku config:set ENV_VAR_NAME="value"

# 削除 (一応removeも使えます)
$ heroku config:unset ENV_VAR_NAME
```

GAEも最近流行ってきているので、コマンドラインツールから設定できると勝手に思い込んでいたが、GAEにはHerokuのような環境変数に対するサポートがなかった（そりゃそうだ）。

## GAEでの一般的な環境変数設定方法と問題点
[公式ドキュメント](https://cloud.google.com/appengine/docs/flexible/nodejs/configuring-your-app-with-app-yaml)によると、Rubyではプロジェクトのルートディレクトリにapp.yamlを置き、このyamlファイル内で定義する。

```
You can define environment variables in app.yaml to make them available to the app:

env_variables:
  MY_VAR: 'my value'
```

ただしapp.yamlは一般に、複数人開発を行い、かつ誰でもdeployをできる場合、.gitignoreに含むファイルでもない。
仮にリードエンジニアのみがローカルからdeployする場合でも、app.yamlファイルのバックアップ問題や、ローカルコンピュータに秘密値を持つことの危険性などが存在する

## どのように解決するか

### Project metadataを利用する
公式ドキュメントは[こちら](https://cloud.google.com/compute/docs/storing-retrieving-metadata)。
GAE, GCEでは、メタデータをメタデータサーバーに格納している。このメタデータサーバーに対してクエリを投げ、インスタンスに関する情報（インスタンスのホスト名、インスタンス ID、起動スクリプトとシャットダウン スクリプト、カスタム メタデータ、サービス アカウントの情報など）を取得する。

一般には起動スクリプトやシャットダウンスクリプトと組み合わせて利用するが、メタデータはkey:valueで格納されるため、secret variablesもメタデータサーバに格納できる。

Googleによると、Compute Engine, Container Engine, Managed VMsにはmagic URLがあり 、```http://metadata.google.internal/computeMetadata/v1```にCURLするとメタデータにアクセスできる。ここでの[Managed VMsとは現在のGAE Flexible Environmentであり](https://cloud.google.com/appengine/docs/flexible/)、Rubyを使用する限りはFlexile Environmentを使用しているので、metadataへのアクセスは保証されている。

メタデータサーバーへのリクエストや、メタデータのレスポンスがインスタンスの外に出ることはなく、ホストに送信されるメタデータ情報は暗号化されるため、メタデータ情報のセキュリティが確保されている。

### app.yamlをEncryptする
GPGを用いてapp.yamlを暗号化することで、安全にapp.yamlを管理する。
具体的には、たとえばRuby gemの[dotgpg](https://github.com/ConradIrwin/dotgpg)を利用する。
ただし、app.yamlファイルには環境変数以外の情報も含まれている。
また、Deploy時にdecryptする必要があるが、GAEへのdeploy時にそのようなことができるかは不明。

## 感じたこと
GAE/Goの事例は多くみるが、GAE/Ruby(Ruby on Rails)の本番環境での事例をあまり見かけないのは、このような面倒なトラップが隠れているからかな？と思った。
他にも方法があればコメントお願いします。
文字を打ち込んでWhitespaceのコードに変換する

#文字を打ち込んでWhitespaceのコードに変換する



Whitespaceをいじくって遊んでいた時、コードを書くのがあまりにも面倒なので少しでもどうにかならないものか...と思って作ったメモ。




##Whitespaceとは何ぞや。
[Wikipedia](https://ja.wikipedia.org/wiki/Whitespace)
[リファレンス(英語)](http://compsoc.dur.ac.uk/whitespace/tutorial.html)

Whitespaceとは、その名が示す通り「空白」のプログラミング言語です。

使って良い文字は「半角スペース」「タブ」「改行」の3文字のみ。文字と言っても普段は文字数に数えないようなものばかりですね。
製作意図が、「そんな空白に対する差別を是正する」ためだったとかなんとか。
ちなみに上記3文字(?)以外は全てコメントとして無視されます。

 

他の文字が無視されるということは、Whitespaceとその他の言語を同じソースコード内で共存させることが可能な訳ですね。
HTMLあたりとは特に混ぜやすそう。



この方面で、コードにWhitespaceで書いた暗号を挿入するツールがあったら面白いかな…作ろうかな…




##使い方


 - スペース => S
 - タブ => T
 - 改行 => N

で書いたコードを正規表現で変換するってだけ。
上記以外の文字(改行含む)は無視されます。


変換したいファイル名を引数に入れて実行→ファイル名.wsとして出力
`$ruby WsConv.rb file.txt`
`>Complete! => file.ws`



```ruby:WsConb.rb
class WsConv
	def initialize(filename)
		@data = IO.read(filename)
		@data.gsub(/[^SNT]+/, '').tr("SNT", " \t\n")
		outputFile = filename.sub(/\..\Z/, '') + '.ws'
		IO.write(outputFile,@data)
		puts "Complete! => #{outputFile}"
	end

wsc = WsConv.new(ARGV[0])
```



##例

これが変換前

```HW.ws
SSSTSSTSSSN
TNSS
SSSTTSSTSTN
TNSS
SSSTTSTTSSN
TNSS
SSSTTSTTSSN
TNSS
SSSTTSTTTTN
TNSS
SSSTSSSSSN
TNSS
SSSTSTSTTTN
TNSS
SSSTTSTTTTN
TNSS
SSSTTTSSTSN
TNSS
SSSTTSTTSSN
TNSS
SSSTTSSTSSN
TNSS
SSSSSSTSTSN
TNSS
NNN
```


これが変換後

```Whitespace:HW.ws
   	  	   
	
     		  	 	
	
     		 		  
	
     		 		  
	
     		 				
	
     	     
	
     	 	 			
	
     		 				
	
     			  	 
	
     		 		  
	
     		  	  
	
        	 	 
	
  



```


（アカン、わかんねぇなこれじゃ...）
SVGのインターフェイスが面白い

# tl;dr

- SVG独自の数値プロパティのインターフェイスが面白い
- 普段は Snap.svg か D3.js 使えばいいと思う
- `setAttribute`とのベンチマーク取ってない

# SVGのプログラミング

普段JavaScriptでSVGを扱う場合、[Snap.svg](http://snapsvg.io/)や[D3.js](https://d3js.org/)を利用することで事足りたり、もしくは[React](https://facebook.github.io/react/)で構築したりすることが最近は多いと思う。

なので滅多にないと思うけど、依存性の少ないライブラリやモジュールなどを書く場合の参考にと思って、プレーンなJavaScript（VanillaJS）の書き方を、ちょっとマニアックだけどフロントエンドエンジニアのアドベントカレンダーに記しておく。

# 名前空間

```javascript
const svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');
```

`http://www.w3.org/2000/svg`が名前空間となる。`createElement`ではなく`createElementNS`を使う。

# SVGAnimatedLengthインターフェイス

`<svg>`要素（`SVGSVGElement`インターフェイス）をはじめとするSVG関連の要素は、`width` や `height` などを属性を持つモノがいくつかあるが（`<rect>``<image>``<pattern>`など）、HTMLのそれとは大きくインターフェイスが異なる。

`HTMLElement`の`width`や`height`のインターフェイスは`DOMString` なので、次の例のように文字列をそのまま代入するこができる。

```javascript
// `<img>`要素の例
const img = document.createElement('img');
img.width = '100%';
img.height = '100px';
```

一方、SVGの要素の場合、`width`や`height`は`SVGAnimatedLength`という馴染みのないインターフェイスで、しかも **readonly** なプロパティである。さらに`SVGAnimatedLength`は`baseVal`と`animVal`というreadonlyな`SVGLength`インターフェイスのプロパティをもち、`newValueSpecifiedUnits`というメソッドで数値を変更することができる。第一引数は単位を指定する。

```javascript
svg.width.baseVal.newValueSpecifiedUnits(SVGLength.SVG_LENGTHTYPE_PERCENTAGE, 100);
svg.height.baseVal.newValueSpecifiedUnits(SVGLength.SVG_LENGTHTYPE_PX, 100);
```

もしくは `valueAsString` に代入でもできる。

```javascript
svg.width.baseVal.valueAsString = '100%';
svg.height.baseVal.valueAsString = '100px';
```

## `setAttribute`でも可能

HTMLのDOMと同様に`setAttribute`メソッドを持っているので、それを使って指定することも可能。

```javascript
svg.setAttribute('width', '100%');
svg.setAttribute('height', '100px');
```

# ベンチマーク / 利点

とっていない。
ので近々とってみる予定。
なんとなーく、微々たる差で、直接的なアクセスと単位のパース分で`newValueSpecifiedUnits`が早そう。`SVGAnimatedLength`の利点はどちらかというと`animVal`にある気がするが、具体的にどういうプログラムで効果的なのかはわかっていない。来年ももっとSVGを使う機会が増えるだろうから、もっと掘り下げてみたい。
New Relic APM: アプリの重要な機能を重点的に監視して、システムの品質をあげよう

アドベントカレンダー６日目。昨日に引き続き、New Relic APM の機能の紹介です。今日は、キートランザクションです。

New Relic APM では、 Overview ページや Transactions ページで、アクセスのあったトランザクションを収集し、表示されます。基本的にパフォーマンスが遅いトランザクションがリストされます。

しかし、アプリ、サービス、ビジネスにとって、遅いトランザクションがすべて問題になるとは限りません。非常に遅い、あまり使われないトランザクションよりも、頻繁に使われるが少し遅いトランザクションの方が、ビジネス上重要であることが普通です。

そのため、そのような重要なトランザクションのパフォーマンスは継続的に監視しておきたいということはあると思います。

まさに、キートランザクションがそのような機能です。

## できること?

キートランザクションとして設定すると、そのトランザクション専用に以下のことが行えるようになります。

- 以下のような特定のトランザクションにのみ特化したパフォーマンスページ
- トランザクション専用の Apdex の設定
- トランザクション専用のアラートの設定
- X-Ray セッションによる詳細なパフォーマンスの測定

![qiita_keytransaction_overview.png](https://qiita-image-store.s3.amazonaws.com/0/46003/15c84bf1-6a41-d98a-ac28-d6b1a84c9287.png)

## 設定の仕方

キートランザクションは、Transactions ページから対象のトランザクションを選択すると、ポップアップが表示され、以下のようにその左上に「Track as key transaction」とリンクがあるので、それをクリックし、専用の名前をつけるだけです。

![qiita_keytransaction_create_link.png](https://qiita-image-store.s3.amazonaws.com/0/46003/3fccead1-c15d-7f16-7f83-21b6d7a270ad.png)


キートランザクションとして保存されているトランザクションは、APM 画面のトップオンタブからいつでも簡単にアクセスできます。

![qiita_keytransaction_menu.png](https://qiita-image-store.s3.amazonaws.com/0/46003/7012aa22-d4a9-500e-d6a6-7c6c7e5bb7fd.png)


## 専用の Apdex とは

New Relic では、ユーザー満足度を Apdex という指標で計測しています。0から1の値でスコア付され、１に近い方がユーザー満足度が高いことを示します。こｎの指標は、Browserとアプリの２つでスコアを算出します。そのため、特定の時間対で全体として、ユーザー満足度がどうなのか？というシステム全体のユーザー満足度が分かることになります。
しかし、トランザクション単位でのユーザー満足度はわかりません。そこで、キートランザクションにすると、特定のトランザクション専用のユーザー満足度を知ることができるのです。

またアラートと組み合わせることで、このトランザクションのみの Apdex スコアに合わせたアラート通知をすることができるのです。

つまり、全体としては、Apdex スコアが 0.8を下回ったらアラートを出すが、あるトランザクションは、Apdex スコアが 0.9を下回ったらアラートを出すといったことができるようになります。

## X-Ray セッションって何？

たぶん、キートランザクションを利用する多くの理由がこれを使いたいからだと思う。X-Ray セッションとは、キートランザクションとして指定したトランザクションに対して、スレッドプロファイルを実行できます。

以下のように Trace Details で表示できる以上の粒度でパフォーマンスを計測できます。これは、通常の計測よりも重い処理なので、やりすぎると負荷が大きくなる可能性がありそう。

この機能は現在、**java**, **Python**, **Ruby** のみで利用できる。

### 設定方法

X-Ray セッションは、以下のように収集回数(Requested trace count)と実行時間(Maximum duration)を指定します。どちらかの条件を満たした段階で計測は終了します。

<img width="487" alt="スクリーンショット 2016-12-06 11.00.57.png" src="https://qiita-image-store.s3.amazonaws.com/0/46003/7f3d9675-caf7-e0f8-12f7-e195c5d504a4.png">

計測が終わると以下のような結果画面が見えます。メソッド単位でのパフォーマンスを確認することができます。

<img width="948" alt="スクリーンショット 2016-12-06 12.25.30.png" src="https://qiita-image-store.s3.amazonaws.com/0/46003/401b5578-e4fb-57d9-c16b-6ba2f54251ff.png">

さらに、下の階層まで調べることができます。色の付いている処理が全体の内、処理時間を占めている箇所になりますので、とりあえずは、そこを重点的に見ていくと効率的に調べられます。

<img width="913" alt="スクリーンショット 2016-12-06 12.27.30.png" src="https://qiita-image-store.s3.amazonaws.com/0/46003/50985619-121a-11e7-89ce-7f6d5db9d0b9.png">


## 誰が使えるの？

こちらも昨日の、[サービスマップ](http://qiita.com/kumatronik/items/ddfb3b262315de94e43b)に続き、`PRO` のみで利用可能となっています。

## 併せて読みたい

詳しくは、ドキュメント「[キートランザクション: 重要なトランザクションもしくはイベントの追跡](https://newrelic.degica.com/docs/apm/transactions/key-transactions/key-transactions-tracking-important-transactions-or-events)」をご覧ください。

## まとめ

如何だったでしょうか？ 通常の概要ページやトランザクションページで、パフォーマンスの遅いトランザクションをただ追うだけでなく、キートランザクションを使うと、ビジネスに重要なトランザクションを重点的にチェックできます。効率良くサービスの品質を向上できる機能ですので、是非、うまく活用してみてください。
CoreOS/Clairのスキャン処理追ってみる(CentOS編）その1

この記事は、[Vuls Advent Calendar 2016](http://qiita.com/advent-calendar/2016/vuls)の6日目の記事です。

こんにちは、サウナおじさんです。

５日目の記事[＼( ´・ω・)／°＼(・ω・`)／ﾊﾞﾙｽ!!!](http://level69.net/archives/24785)ではイカサマを晒されて、あたしゃびっくりしたねぇ。タイトルからして、さてはネタ決まってねぇなこいつ、と思っていたけど、予感は的中するもんだねぇ。でも面白かったからまあいいや。

さて、Vulsアドベントカレンダーでは今後も何回か投稿する予定だけど、あたしのテーマは前からやろうとしていてなかなかできていなかった、他の脆弱性スキャナはどーやってスキャンしてんのさ？を追っていくよ。
今回は一発目として[coreos/clair](https://github.com/coreos/clair)のCentOSのスキャン処理を追ってみるね。

# Clairは静的スキャン、Vulsは動的スキャン

CoreOS/ClairはCoreOS社が開発している、コンテナイメージを対象とした静的な脆弱性スキャナ。静的な脆弱性スキャナなので稼働中のコンテナではなくイメージをスキャンするのが特徴。詳細は[README](https://github.com/coreos/clair)を参照してね。

なお、VulsもDockerコンテナの脆弱性スキャンは可能だが、clairと異なり動的なスキャナである。稼働中のDockerコンテナが対象であり、Docker HostにSSH接続し、docker execを使って脆弱性をスキャンする。詳細は[Vuls README](https://github.com/future-architect/vuls/blob/master/README.ja.md#usage-scan-docker-containers)を参照してね。

clairの一般的なユースケースは手動でのスキャンとContainer Registory統合の２パターン。詳細は[README](https://github.com/coreos/clair#common-use-cases)参照してね。

さて、今回はclairがどうやってCentOSの脆弱性をスキャンしているのか、どの脆弱性データソースを用いているのか、を追ってみるね。

# 脆弱性情報データソース

Clairは検知したCVE-IDをNVDやディストリビューションが提供するセキュリティ情報を用いてレポーティングしているよ。Vulsと似ているね。

- [README](https://github.com/coreos/clair#default-data-sources)に表があるよ。
- CentOS用には[ReHat Customer Portal Security Data](https://www.redhat.com/security/data/metrics/)をデータソースとして利用していると書いてあるね。

RedHatのサイトにはCVRFとOVALという２種類のデータフォーマットで脆弱性情報が提供されているね。

- CVRF Documents
    - Common Vulnerability Reporting Framework (CVRF)
    - [本家](http://www.icasi.org/cvrf/)

- OVAL Definitions
    - [IPA:セキュリティ検査言語OVAL概説](https://www.ipa.go.jp/security/vuln/OVAL.html)

あたしゃCVRFは初耳だよ。

ん？

![mateyo.jpeg](https://qiita-image-store.s3.amazonaws.com/0/22462/674f9bb6-64ee-dea2-dacb-3d2e79cedea3.jpeg)
ちょ待てよ

# 良く見たら[ReHat Customer Portal Security Data](https://www.redhat.com/security/data/metrics/)に使えそうなデータたくさんあるやんかいさ

ClairのCentOSスキャンの内部処理おっていこうと思ったけど、あたしゃ気が変わっちゃったよ。また今度でいいや。
だってVulsの検知精度、レポーティング精度向上に使えそうなお宝データ見つけちゃったんだもの。あたしゃラッキーだねぇ。

## CVE to date, CVE to severity, CVE to CVSS mapping

- https://www.redhat.com/security/data/metrics/cve_dates.txt

CVE-IDがキーで、以下の情報がある
- 公開日
- 深刻度
- CVSS V2 socre
- CVSS V2 vector
- CVSS V3 score
- CVSS V3 vector

この情報マジでぱねぇ

今まではNVD上にCVE-IDは採番されているけど情報がない、でもRedHatやUbuntuのサポートサイトなどには脆弱性情報がある、という脆弱性はVuls上では「?」として表示していたけど、この情報使えばNVDに情報ないものでもCVSS Scoreとか出せるじゃん。「？」に関しては[Vulsを使って脆弱性情報を精査していて気づいたこと](http://qiita.com/usiusi360/items/5dab6788319c355c8600)に詳しくかいてあるよ。

あと、CVSS v3はNVDのXML, JVNのXMLには情報がないので出せなかったんだけど、これ使えばいけるやん。


## RHSA to CVE and CPE mapping 

- https://www.redhat.com/security/data/metrics/rhsamapcpe.txt

VulsはCPEを指定すれば、OSパッケージマネージャ管理外のソフトウェア、たとえばコンパイルしていれたものやプログラミング言語のライブラリ、ルータなどのN/W機器のOSなどの脆弱性も検知出来るんだけど[詳細はREADME参照](https://github.com/future-architect/vuls/blob/master/README.ja.md#usage-scan-vulnerability-of-non-os-package)、現状だと、CPE-CVEの情報源として、NVDの脆弱性データベースのみを使っているんだよ。NVDの情報と合わせてこれも使えば、さらに精度高まるかも。

# というわけで

Clairの内部追うぜとやる気満々でしたが、お宝見つけちゃってそれどころじゃなくなっちゃったよ。この情報使えば、現状「?」で表示されているものが少なくなると思うよ。近い将来実装するから楽しみにしていてね！じゃ、またね！


Vuls Advent Calendar 7日目は[hogehogehugahuga](http://qiita.com/hogehogehugahuga)さんです。よろしくお願いします。
動的計画法(DP)勉強メモ

ちょっと調べたのでまとめてみます。

# 動的計画法(DP)とは？
まず、[Wikipedia](https://ja.wikipedia.org/wiki/%E5%8B%95%E7%9A%84%E8%A8%88%E7%94%BB%E6%B3%95)を見てみる。(引用は一部改変しています)
> 細かくアルゴリズムが定義されているわけではなく、下記2条件を満たすアルゴリズムの総称である。
> 1. 分割統治法：部分問題を解き、その結果を利用して、問題全体を解く
> 2. メモ化：部分問題の計算結果を再利用する

ふむ、分けること、メモ化すること、の２つを含むアルゴリズムであると。
適用するには条件があるそうな。
> 最適化問題に適用する場合、一般的に、以下の2つが適用する問題に成立していないといけない。
> 1. 部分構造最適性や最適性原理
> 2. 部分問題重複性

### 部分構造最適性
> 部分構造最適性とは、以下の2条件が成立していることをさす。
> ⅰ. 部分問題も同じ最適化問題が成立している
> ⅱ. 部分問題間が独立している

何やら漢字だらけで難しそうだが、ⅰはこんな感じだと思う。
![ok.png](https://qiita-image-store.s3.amazonaws.com/0/84917/e33d5112-36ce-916c-54a8-5fcd4f21ab6a.png)
![ng.png](https://qiita-image-store.s3.amazonaws.com/0/84917/e726d91e-9ed6-440e-93f0-aed7593c7350.png)
例えば問題を5つのステップに分割して解くとする。その際、各ステップでの最適解が、全体の最適解と一致しなければならない。NGな例の、ステップ2ではその他1(赤)、ステップ3ではその他2(黄色)が最適解だが、全体の最適解ではない。こういった性質の問題は動的計画法では解けない。

ⅱは大体そうなんじゃないかって気がするけど。。。NGな例って何があるんだろう？

### 部分問題重複性
> 部分問題重複性とは、同一の部分問題が繰り返し出現することである。

これがないとメモ化する意味がなくなってしまう、ということかな。

### 例題(フィボナッチ数列)
ボトムアップ方式とトップダウン方式それぞれ疑似コードが載っている。もうこれは見たとおり。再帰よりはループのほうが処理を思い浮かべやすい、と思った。

# 動的計画法といえば、な例題
ナップサックですよね。今度は[こちら](http://dai1741.github.io/maximum-algo-2012/docs/dynamic-programming/)を見ます。
フィボナッチ数列はメモ化のテーブルが1次元(何番目か)だったが、ナップサック問題は2次元(残りの品物*ナップサックの容量)になるのでちょっと複雑。でもやることは、問題を分割して部分解でテーブルを埋めていくのみ。
ちょっと問題が大きいので小さくする。ナップサックの容量5kg、品物は以下の4つとする。

|ID|重さ(kg)|価値|
|:--:|:--:|:--:|
|0|1|3|
|1|2|2|
|2|2|1|
|3|1|2|

今回埋めるべきテーブルは下のような感じ。求めるべきは、残り品物4、ナップサック容量5kgの場合、テーブルで言うと一番右上(0, 5)。

|↓品物/→容量|0|1|2|3|4|5|
|:--:|:--:|:--:|:--:|:--:|:--:|:--:|
|0|-|-|-|-|-|求めたいのはここ|
|1|-|-|-|-|-|-|
|2|-|-|-|-|-|-|
|3|-|-|-|-|-|まずここ|

最初に手を付けるのは一番右下(3, 5)、それから徐々に上に向かってテーブルを埋めていく。
(3, 5)ではナップサックの容量5で、品物3を入れるか入れないか決める。入れたほうが価値は大きくなるので、(3, 5)は2と決まる。

|↓品物/→容量|0|1|2|3|4|5|
|:--:|:--:|:--:|:--:|:--:|:--:|:--:|
|0|-|-|-|-|-|求めたいのはここ|
|1|-|-|-|-|-|-|
|2|-|-|-|-|-|次はここ|
|3|-|-|-|ここが必要|-|2|

次に(2, 5)を求める。そのためには、(3, 5)と(3, 3)が必要になる。(3, 5)は品物2を入れなかったパターン、(3, 3)は入れたパターン。(3, 5)は先程求めた2である。(3, 3)は(3, 5)と同様に2になる。(2, 5)は(3, 5)か(3, 3)に品物2の価値を足したものの大きい方なので、3と決まる。

|↓品物/→容量|0|1|2|3|4|5|
|:--:|:--:|:--:|:--:|:--:|:--:|:--:|
|0|-|-|-|-|-|求めたいのはここ|
|1|-|-|-|-|-|-|
|2|-|-|-|-|-|3|
|3|-|-|-|2|-|2|

同じように、(1, 5), (0, 5)と求めることで、最終的に求めたい解が得られる。

文章にすると超絶わかりにくいが、実際テーブルを手で埋めていくと理解できる。この例だと微妙だが、一応メモ化も効いていることがわかる。
この手順をプログラムにすると、[上で挙げたこちら](http://dai1741.github.io/maximum-algo-2012/docs/dynamic-programming/)のプログラムになる。
なるほどー

# 問題探してみた
[これ](http://abc011.contest.atcoder.jp/tasks/abc011_3)が易しくていい感じだった。テーブルは1次元。

# おわりに
プロコンやる上で必ずといっていいほどこやつが出てくるので、しっかり抑えたいと思い記事にしてみた。結局は演習数こなすしかないと思うけど。がんばろう。