OmniAICreator/Qiita-1.07M huggingface dataset:
ダイアログ (対話) のやり方

ダイアログとは？
----
端的に言うと「お互いの理解を深めるためのコミュニケーション方法」です。組織が学習し、高いパフォーマンスを得るための手法として、近年注目されています。

### ディスカッションとの違い

ダイアログ（対話）は、よくディスカッション（議論）と比較されます。以下のような違いがあります。

| | ディスカッション | ダイアログ |
|-----|----|----|
|目的|合意を作り出す / 優れたアイディアを選び出す|相互理解を深める|
|勝者|より優れたアイディアの発案者|全員|

ダイアログとディスカッションは、異なる2つの対話方法です。どちらが優れているというわけではなく、場面によって両方の手法を使い分けることが重要です。

### ダイアログの効果

- チームの一体感や信頼感を深める
- 他者の思考を通じて、自分の思考を観察する
  - →固定観念や偏見に気づく
  - →「[推論のはしご](http://starclubseminars.com/writings/entry102.html)」そのものに気づき、思考の癖を直す機会を得られる
- 関係の質、思考の質の向上
  - →行動の質、結果の質の向上
- 結果として、組織学習の土台や風土が形成される


どんな時に実施する？
----
### チームの成熟度が低い時

新しいプロジェクトチームが誕生した直後や、組織構成が変わった時など。[タックマンモデル](http://heart-quake.com/article.php?p=396)でいう「形成期～混乱期」を乗り越え、チームビルディングを進めるために有用です。

### ふりかえり時

私はスクラムのふりかえり (レトロスペクティブ) の中で、ブレスト代わりによく使っていました。ふりかえり前半でダイアログを行って不満やムダを発見し、後半でディスカッション行い具体的な改善アクションを決めました。

### その他、どんな時でも

定期ミーティングの余った時間や、ランチタイムに。


ダイアログのやり方
----
漠然と「ダイアログやろうぜ！」と言っても、慣れていないと自然とディスカッションになってしまったり、十分な深い会話に達せないことがあります。うまく進めるために、以下のような基本ルールを定めます。

### ファシリテーターを立てる

- ファシリテーターは喋らない
    - ただし、自分しか知らない情報があるときは話しても良い
- ファシリテーターは、チームがディスカッションに向かっていたら指摘し、ダイアログに戻す
- チーム全体がダイアログに習熟したら、ファシリテーターは少しずつ参加者になってもよい
  - 成熟したチームはファシリテーターなしでダイアログが成立する

### 参加者は自分の前提を保留（吊り下げ）する

- 自分が出した意見に対し、誰でも質問することを許容する
  - その意見の前提や根拠を聞いてよい
- 批判や不満を出しても良く、その根拠を尋ねても良い

### 参加者はお互いを仲間と考える

- 役職の上下、年齢などの差を意識しない
- 自分とは反対の意見をもつ相手でも「異なる意見をもつ仲間」と考える
- 常に相手に好奇心を持つように努める

### 遊び心と、新しい意見を検証する意欲をもつ

- 「誰が何を言ったか」を気にしない
- バカなことを言ってもよい


ダイアログの検査
----
### うまくいっている兆候

- 「カッカとする話題」「ぶっちゃけ思ってたこと」が議題に上がる
- チームの仕事にとって不可欠な、最も難しく、最も捉えにくく、最も摩擦のある問題を提起している。また、そうした問題の提起が奨励されている
- お互いに「聞いてもらっている」という実感が得られる
- 実施後、新しい行動が生まれる

### うまくいっていない兆候

- 新しい意見や、知らなかった事実が出てこない
- 感情的になってしまったきり、その理由や根拠を深掘りできない
- 意見が集約される
  - ディスカッションでは意見が集約されるべきだが、ダイアログでは発散したままで良い
- 出てきた意見に正しい／正しくないの評価がされたり、答えをあてがおうとする
  - ダイアログでは探求し続けることが重要


TIPS
----
- ダイアログ前に、参加者が一言ずつ喋るチェックインを行う
  - これをやるだけで意見が出やすくなる
- 特定の人だけが詳しくなってしまう小さなテーマではなく、全員が対等になる広めのテーマを選ぶ
- はじめは上手く行かなくても良い
  - ダイアログ自体、修練によって高度化する
  - 「安全な場」という認識を全員で維持すること
- 話者が衝突しやすい場合は、「トーキング・オブジェクト」を用意する
  - 例えばボールを持っている人だけが発言できるようにする
- 誰かを名指しで批判する「あなたが言葉」が出たら、「私は言葉」に直すよう促す
  - 「あなたが言葉」はしばしば攻撃的・感情的になる
  - 例: 「あなたの○○は迷惑だ」 → 「私は○○が迷惑だと感じた。なぜなら、...」


おわりに
----

> 「対話では勝利を得ようとするものはいない。もし、誰かが勝てば、誰もが勝つことになる。」 -- 『ダイアローグ』デヴィッド・ボーム著

> 「対立や選択による痛みを通過して生まれる対話の場には、ほんとうのやさしさがある。」 -- 『ニッポンには対話がない』北川達夫、平田オリザ著

こんな世界観を実現できた組織があれば、それは素敵ですよね。たぶんできるので、やってみましょう。


参考リンク
----
- [ダイアログ～探求を深め、新たな価値を生成する話し合いのあり方～ - HUMAN VALUE](http://www.humanvalue.co.jp/report/magazine_list/dialogue.html)
- [ダイアログで未来を創ろう: 学習するにはダイアログ（対話）が必要](http://smartquest.jp/learning/dialogue/)
- [対話（ダイアログ）をもっと広めよう｜日本総研](https://www.jri.co.jp/page.jsp?id=6007)
- [学習する組織――システム思考で未来を創造する | ピーター M センゲ, Peter M. Senge, 枝廣 淳子, 小田 理一郎, 中小路 佳代子 |本 | 通販 | Amazon](http://amzn.to/2kcRvnX)
- [学習する組織とは – SoL Japan](http://www.soljapan.org/?page_id=9)
- [ダイアローグ 対立から共生へ、議論から対話へ | デヴィッド・ボーム, 金井真弓 |本 | 通販 | Amazon](http://amzn.to/2kcTecL)
- [Discussion | Define Discussion at Dictionary.com](http://www.dictionary.com/browse/discussion)
- [わたしたちの中での「対話」とは？ | ワールド・カフェ・ネット](http://world-cafe.net/about/about-03.html)
remote origin already exists の時の対処法(自分用)

## remote origin already exists の時の対処法 
bitbucketへうまく繋がらなかったので
対処法を調べました。

$ git remote rm origin
$ git remote add origin git@github.com:ユーザ名/リポジトリ名.git
$ git push -u origin master

細かいことは追記します。
ちょっとした正規表現のおはなし　後編

前編は[こちら](http://qiita.com/nao20010128nao/items/5382db9b315e6e26ce6e)から
# おことわり
前編のプロローグの一部は事実ですが、後編の登場人物の発言についてはフィクションです。

# 前編から
前回、「ゆらちゃんかわいい」を探すために正規表現を作りました...が
![Screenshot_20170113-001102.png](https://qiita-image-store.s3.amazonaws.com/0/111609/e1a4c616-186b-02eb-1ec1-bdd70a491c11.png)
あっちゃー
やられましたね
もやさんも**「検索避けも対策する」**と言っています
こうして、また新たな正規表現を作るのでした

# 本題
## はじめに
前編の`E`は、前編としての結果であり、後編では使いません。
このため欠番とします。
それ以外は前編から継承します。
参考とするサイトは、前編と同じ[ここ](http://www.javadrive.jp/regex/)とします。

## 検索避け
やりましょう。

と言いたい所ですが、よく見てみて下さい。
`[`も`]`も使ってるじゃないですか。予約文字ですよ?
`.*`(`D`)とすれば楽だとは思うのですが、検索避けに使われる文字だけを指定しようと思います。(とは言っても定義が曖昧で、かつ色々な文字が使われるので、適当に思いつくものだけとします。)
やはり[これ](http://www.javadrive.jp/regex/char/index1.html)を使うのですが、エスケープ(`\\`)は使えるのでしょうか?

結論から言うと、[できます](http://ideone.com/kFscAZ)。
なので、[ここ](http://www.javadrive.jp/regex/char/index5.html)も参考に`F`を定義します。
F=`[\[\]\/\\\s]`
あとは`B`と`C`(「い」2連続処理前)に入れるだけですね
B=`[ゆゅユュﾕ][\[\]\/\\\s][らラﾗ][\[\]\/\\\s]([ちチﾁ][\[\]\/\\\s][やゃヤャﾔｬ][\[\]\/\\\s][んンﾝ]|[ゆゅユュﾕ][\[\]\/\\\s][らラﾗ])`
C=`[かカヵｶ][\[\]\/\\\s][わゎワヮﾜ][\[\]\/\\\s][いぃイィｲ][\[\]\/\\\s][いぃイィｲ]`
長い。
それでは、前編で最後にやった事と同じ事をします。
`B+D+C`と`C+D+B`を同時に検索できる正規表現となるよう、合成します。
こうなります。(以下F)
F=`([ゆゅユュﾕ][\[\]\/\\\s][らラﾗ][\[\]\/\\\s]([ちチﾁ][\[\]\/\\\s][やゃヤャﾔｬ][\[\]\/\\\s][んンﾝ]|[ゆゅユュﾕ][\[\]\/\\\s][らラﾗ]).*[かカヵｶ][\[\]\/\\\s][わゎワヮﾜ][\[\]\/\\\s][いぃイィｲ][\[\]\/\\\s][いぃイィｲ]|[かカヵｶ][\[\]\/\\\s][わゎワヮﾜ][\[\]\/\\\s][いぃイィｲ][\[\]\/\\\s][いぃイィｲ].*[ゆゅユュﾕ][\[\]\/\\\s][らラﾗ][\[\]\/\\\s]([ちチﾁ][\[\]\/\\\s][やゃヤャﾔｬ][\[\]\/\\\s][んンﾝ]|[ゆゅユュﾕ][\[\]\/\\\s][らラﾗ]))`
~~もう意味不明~~
これでよろしいのではないでしょうか

# 最後に
~~これだけ?と思った方もいらっしゃると思いますが、**ネタが尽きました**。~~
案があれば、コメントで言って頂ければ多分やります。
sshでポートの違う2つのHostで多段階


```:.ssh/config
Host hostA
    Hostname host-a.com
    Port 1010
    User test-user

Host hostB
    Hostname host-b.com
    Port 2020
    User test-user-2

Host hostB-through-A
    Hostname host-b.com
    Port 2020
    User test-user-2
    ProxyCommand ssh -W %H:%p hostA
```

これで以下のコマンドでオッケー

```bash
ssh hostB-through-A
```
iOS開発入門〜storyboardでのScrollViewの配置法〜

##Scroll Viewの配置

1. ViewControllerを配置する<br>

2. ViewController内のViewにScrollViewを配置する

3. ScrollViewに上下左右のマージンが0ptの制約を設定する
<img width="269" alt="スクリーンショット 2017-01-20 13.28.28.png" src="https://qiita-image-store.s3.amazonaws.com/0/22680/2dbee0d7-825e-706a-b21f-f182534b2038.png">

4. ScrollViewに新たなViewを配置する

5. わかりやすいようにScrollView内に配置したViewの名前をContentViewとしておく。
![スクリーンショット 2017-01-20 13.08.51.png](https://qiita-image-store.s3.amazonaws.com/0/22680/fdf0a12f-22c8-ff91-e8d8-4461fd59d7ab.png)

5. ContenViewを選択して上下左右のマージンが0ptの制約を設定する。
![スクリーンショット 2017-01-20 13.10.43.png](https://qiita-image-store.s3.amazonaws.com/0/22680/d5c0253c-12ed-7827-e787-65165bd45ea1.png)

7. ContentViewをCtrlを押しながらViewにドラッグし、「Equal Widths」と「Equal Heigths」の制約を設定する。
![スクリーンショット 2017-01-20 13.15.02.png](https://qiita-image-store.s3.amazonaws.com/0/22680/2f3e053f-b3e5-16b8-3a8f-70de81fa98de.png)

8. 「Equal Heigth」のConstaraintsを選択してサイズインスペクタを開きPriorityを 250 に設定。
<img width="341" alt="スクリーンショット 2017-01-20 13.37.46.png" src="https://qiita-image-store.s3.amazonaws.com/0/22680/af9b25f6-2598-1e32-5478-84b3354b7bf3.png">

9. ContentViewの高さの制約を設定する、今回は1000ptにしておく。
<img width="268" alt="スクリーンショット 2017-01-20 13.39.12.png" src="https://qiita-image-store.s3.amazonaws.com/0/22680/c541ed24-bf19-db49-a01b-d375b952274d.png">

10. コントロールを配置しやすいようにView ControllerのSimulated SizeをFreedomに設定して、Content Viewと高さを合わせる。今回は1000pt。

<img width="546" alt="スクリーンショット 2017-01-20 13.41.43.png" src="https://qiita-image-store.s3.amazonaws.com/0/22680/faf2703c-5a2d-be7d-7944-aea422d01d4d.png">

11.Content Viewの上端と下端にLabelを配置してみる。
<img width="250" alt="スクリーンショット 2017-01-20 13.43.55.png" src="https://qiita-image-store.s3.amazonaws.com/0/22680/0c2d9580-57b1-ff69-874f-3ae70d1c17d6.png">

※ 制約を追加した後は適宜UpdateFramesを行う。
URLSession.shared.dataTaskで画面遷移しようとしたら、エラーが出た




```
 let task = URLSession.shared.dataTask(with: request, completionHandler: {data, response, error in
            if (error == nil) {
                do{
                    let json = try JSONSerialization.jsonObject(with: data!) as! [String: AnyObject]
                    print(json["spToken"])
                    if TokenStore.setSpToken(token: json["spToken"] as! String){
                
                        
                        
                        //ここで画面遷移しようとする
                            self.navigationController?.popViewController(animated: true)

                        

                    }else{
                        print("login error")
                    }
                    
                }catch{
                    print(error.localizedDescription)
                    
                }
                print("ok")
            } else {
                print(error)
            }
        })
        task.resume()


```

URLSession.shared.dataTaskの中で画面遷移しようとしたら、めちゃくちゃ時間がかかり
こんなログが出てきました


```
This application is modifying the autolayout engine from a background thread after the engine was accessed from the main thread. This can lead to engine corruption and weird crashes.
```

どうやら、メインスレッドではないところで呼び出してしまったのが原因のようです

```
  DispatchQueue.main.async {
                            self.navigationController?.popViewController(animated: true)

                        }

```

これで解決
CanVec+のGML拡張の歴史

CanVec+はカナダのベクタ地図配布形式である。
ベースはGMLを使用している。

CanVec+の前身であるCanVecの時代には、GMLの拡張にfmeを使用していた。
fmeは[Safe Software](!http://www.safe.com/)による定義である。
fmeはオーストラリアの官製GMLでも使われているので、英連邦では普及しているようだ。

CanVec＋になったときにはgml2という名前空間が使用されていた。

現在では、名前空間がcanvecになっている。きっと気兼ねせず変更を加えていきたいんだろう。

またgml2の頃までは座標の記述がcrsだったが、srsに変更された。
こういったちょっとした変更が毎年行われている。

対応するのが面倒だ。
2つのセレクトボックスを連動させるjQuery

# やりたいこと
2つのselect要素を連動させる。
1つめの選択肢を選ぶと、2つめの選択肢が動的に変わる。

色々なサイトを見てみたが、スマホだとうまく動かないコードがあったりした。
こちらのコードがシンプルでいい感じ。
[プラグイン不要！ jQueryで複数のセレクトボックスの選択肢を連動させる](https://try-m.co.jp/blog/jquery/936/)

ほぼ上記サイト通りだが、optgroupを使いたかったので少しだけ変更した。
→[動作デモ](http://codepen.io/bass-inu/pen/jyBeym)

# HTML
1つめのセレクトボックス
selectにparent、初期値になるoptionにはmsgというクラスをつけておく。

```html
<select class="parent" name="日付" required>
 <option value="" class="msg" disabled selected>-----日付を選択-----</option>
 <option value="1/11(水)">1/11(水)</option>
 <option value="2/5(日)">2/5(日)</option>
 <option value="3/3(金)">3/3(金)</option>
</select>
```

２つめのセレクトボックス
selectのクラスはchildren
data-valに1つめのvalueに対応する値を入れる。

```html
<select class="children" name="講座名" disabled required>
 <option value="" class="msg" disabled selected>-----講座名を選択-----</option>
 <optgroup label="音楽">
  <option value="餅つき大会" data-val="1/11(水)">餅つき大会</option>
  <option value="音楽理論" data-val="1/11(水)">音楽理論</option>
  <option value="エレキギター講座" data-val="1/11(水)">エレキギター講座</option>
  <option value="エレキギター講座" data-val="2/5(日)">エレキギター講座</option>
  <option value="ドラム講座" data-val="2/5(日)">ドラム講座</option>
  <option value="エレキベース講座" data-val="3/3(金)">エレキベース講座</option>
  <option value="ボイストレーニング" data-val="3/3(金)">ボイストレーニング</option>
 </optgroup>
 <optgroup label="ウェブ">
  <option value="HTMLとCSS" data-val="1/11(水)">HTMLとCSS</option>
  <option value="JavaScript" data-val="1/11(水)">JavaScript</option>
  <option value="HTMLとCSS" data-val="2/5(日)">HTMLとCSS</option>
  <option value="PHP" data-val="2/5(日)">PHP</option>
  <option value="Qiita" data-val="3/3(金)">Qiita</option>
 </optgroup>
</select>
```

#JavaScript(jQuery)
ほぼ参考サイト通り。変更したのは、.not()のところ。

```js
$(function() {
  var $children = $('.children');
  var original = $children.html();

  $('.parent').change(function() {
    var val1 = $(this).val();

    $children.html(original).find('option').each(function() {
      var val2 = $(this).data('val');
      if (val1 != val2) {
        $(this).not('optgroup,.msg').remove();
      }
    });

    if ($(this).val() === '') {
      $children.attr('disabled', 'disabled');
    } else {
      $children.removeAttr('disabled');
    }

  });
});
```
go installで気楽に最新版のGoを試す

beta や RC が発表されると、公式サイトのダウンロードページで特別なインストール方法が紹介されます。

この方法を使うと、go install で beta/RC のバイナリをインストールし、普段使っている go コマンドとは別のコマンドとして、ダウンロードしたバイナリを使うことができるようになります。

※go1.16 までは、`go install` となっている箇所を `go get` で読み替えてください。また、後で出てくるコマンドラインのうち、`@latest` は除去する必要があるかもしれません。


# 利用までの手順

実際には、go install の後に go1.25rc1 download が必要です。

## go install

まずは、公式ページにあるように、go install します。

```shell-session
go install golang.org/dl/go1.25rc1@latest
```

これで、$GOPATH/bin/go1.25rc1 が使えるようになります。

ただし、これだけでは、ダメです。
実際に go1.25rc1 コマンドを実行してみると分かりますが、go1.25rc1 download しろと言われます。

## go1.25rc1 download

```shell-session
go1.25rc1 download
```

これで、go コマンドの代わりに go1.25rc1 コマンドが使えるようになります。

# 感想

最新版の変更点やパフォーマンス改善を試してみたいという方には、ぴったりなインストール方法だと思います。

CI 環境等で「この CI サービスを使ってみたいけど、最新の Go が使えないから諦めよう…」というケースでは便利に使えるかもしれません。

割とメジャーな CI サービスでも、古いバージョンが入っていることがあります。
その際、バイナリを落として、展開して、GOPATH と PATH を設定して…という手間がないのは、（最終的にやることが変わらないとしても）気が楽に思えます。
エックスサーバーでPython+mySQL+Flask

大手レンタルサーバーの[エックスサーバー](https://www.xserver.ne.jp/)で、pythonベースのWEBサーバーを構築した時の手順についての記録です。

エックスサーバーはPythonがインストールされているものの、Flaskなどは全然入っていないので、自分でインストールする必要があります。
また、/etcへのアクセス権がなく、pipを使うとpipの中のos.listdir(_UNIXCONFDIR)で失敗します。
、、、など、色々ハマりながら、サンプルレベルのWEBサーバーを構築出来たので、覚えているうちにまとめます。
終わったあとに、記述しているので、途中手順がぬてけている事があるかもしれません。

なお、WEBアプリの開発は、趣味レベルで本職ではないので、知識が不足している上での記述であることを予めお断ります。
また、参考にさせていただいたサイトは、数知れず、どこからどう参照したのか、わからなくなっています。ごめんなさい。

## easy_installを入れる
pipが使えないのですが、easy_installだとうまくいきました。

> \$ mkdir src
> \$ cd src
> \$ wget http://peak.telecommunity.com/dist/ez_setup.py
> \$ python ez_setup.py

## pyenvを入れる
gitでpyenvを持ってきます。
gitは予めインストールしてありました。
https:ではうまくいかないのでgit:を使いました。

> \$ git clone git://github.com/yyuu/pyenv.git ~/.pyenv

~/.bash_profileに下記の行を追加して、bashを再起動します。

```text:.bash_profile
export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"
```

### pythonをインストール
pyenvの管理下にpythonをインストールします。

 > \$ pyenv install 2.7.11　
 > \$ pyenv global 2.7.11

~/.bash_profileに下記の行を追加して、bashを再起動します。

```text:.bash_profile
eval "$(pyenv init -)"
```

### Flaskをインストール

> \$ easy_install Flask

### MySQL-pythonをインストール

> \$ easy_install MySQL-python

--------------------
ここまでで、入れるべきもののインストールは終わりです。

## テスト用の環境の構築
### データベースの準備

1. エックスサーバーのサーバーパネルにログインして、[データーベース]-[MySQL設定を選びます]
2. [MySQL追加]タブでデータベースを追加します。
3. [アクセス所有権ユーザー]でテスト用のユーザーを登録しておきます。
4. 画面の左の[phpmuadmin(<バージョン>)]を押して、phpmuadminが画面を出します。
5. なんでもいいので、作成したDBに、とりあえず２つフィールドを作成しておきます。
　　　（サンプルプログラムが２フィールドに書き込むからです）

### ディレクトリの準備

/home/<ユーザーID>/<ドメイン名>.xsrv.jp/public_html/の下にディレクトリを作ります。
> \$ mkdir /home/<ユーザーID>/<ドメイン名>.xsrv.jp/public_html/hoge

.htaccess,index.cgi,testFlask.pyの３つのファイルを作成します。

```text:.htaccess
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ /hoge/index.cgi/$1 [QSA,L]
```

```text:index.cgi
from wsgiref.handlers import CGIHandler
from testFlask import app
CGIHandler().run(app)
```

```text:index.cgi
# -*- coding: utf-8 -*-
from flask import Flask
import MySQLdb

app = Flask(__name__)

@app.route('/')
def hello_world():
    return "Hello world!"

@app.route('/db')
def db_save():
    connector = MySQLdb.connect(host="<MySQL5.5 ホスト名>, db="<作ったDB名>", user="<登録したユーザーID>", passwd="<パスワード>", charset="utf8")
    cursor = connector.cursor()
    sql = u"insert into testTable values('1','python')"
    cursor.execute(sql)
    connector.commit()
    cursor.close()
    connector.close()

    return "DB saved!"
```
<MySQL5.5 ホスト名>はサーバーパネルのMySQL設定画面で確認できます。
<作ったDB名><登録したユーザーID><パスワード>は、「データベースの準備」の項目で設定した文字列を記載します。

index.cgiはパーミッションを変更します
> \$chmod 700 index.cgi

これで、
http://home/<ユーザーID>/<ドメイン名>.xsrv.jp/hoge
にアクセスしたらHello world!が表示され
http://home/<ユーザーID>/<ドメイン名>.xsrv.jp/hoge/db
にアクセスしたらDB saved!が表示されたら成功です。

phpmuadminでDBの内容を確認してください。
Go 言語の Web フレームワーク Martini を Docker で試す

[Martini](https://github.com/go-martini/martini) は Go 言語の Web フレームワークのひとつ。

公式で日本語のドキュメントもあります。

これを気軽に試すための Dockerfile を作りました。

https://github.com/okashoi/docker-martini

## 使い方

README にも書いた通り

```
git clone https://github.com/okashoi/docker-martini
cd docker-martini
docker build -t martini .
docker run -it -p 3000:3000 -d -v $PWD/app:/usr/src/myapp --name martini martini
```

このあと `localhost:3000` にアクセスして Hello World が表示されれば OK。

（そのうち docker-compose.yml 書く）


app 以下のファイルを変更した際は再実行等は特に必要ありません。
参考メモ/Javaに組み込めるIn-MemoryなLDAPサーバ

ふと Java でLDAPの実験をしたくなったのだが、一々 OpenLDAP サービスなどを立ち上げて設定するのは面倒くさい。
Javaなのだから、例えばxUnitの最中に、In-Memory の組み込みLDAPサーバを立ち上げて初期化して、そこに接続することができればクールじゃね？

というわけで、Javaに組み込めるIn-MemoryなLDAPサーバ・・・を、「ググっただけ」メモです。
まだ手を動かして実際に組み込んだりJavaから接続したりしてません。後日の宿題です。

結論として、2017年1月時点で使えそうなOSSなJavaのLDAP製品としては ApacheDS と UnboundID LDAP SDK がある、ただしどちらも最新stableバージョンを使ったときのIn-Memory組み込み方法がドキュメント不足で詳細不明。
もうちょっと突っ込んで調べればわかりそうだけど、それは後日、実際に触るときがきたらの宿題で残しておきます。

ググって見つかったOSSなJavaのLDAP製品：

- [Welcome to Apache Directory — Apache Directory](http://directory.apache.org/)
  - http://directory.apache.org/
  - Apache プロジェクトで、LDAPサーバ・クライアント・APIなどの関連OSSプロジェクトをまとめている。
  - このうち、ApacheDS がJavaコードにIn-Memoryでembedすることも可能なLDAPサーバ。(もちろんstandaloneで起動することもできる)
  - ライセンス : Apache License 2.0
  - 組み込むためのドキュメントは以下らしいが、"TODO..."になってて空っぽ・・・。(´・ω・｀)
  - http://directory.apache.org/apacheds/advanced-ug/7-embedding-apacheds.html
- [UnboundID LDAP SDK for Java](https://www.ldap.com/unboundid-ldap-sdk-for-java)
  - https://www.ldap.com/unboundid-ldap-sdk-for-java
  - JavaのLDAPサーバ/クライアント SDK
  - ライセンス : GPLv2 / LGPLv2.1 / 独自の "the UnboundID Free Use License"
  - 多機能なため、必要な機能だけに絞って利用できるよう、Standard/Minimal/Commercial と3種類のエディションに分かれている。
  - In-Memoryで組み込むためのドキュメント -> https://docs.ldap.com/ldap-sdk/docs/in-memory-directory-server.html
- [— Project Kenai](https://opends.java.net/)
  - https://opends.java.net/
  - java.net で開発されていたOSSの Directory Service.
  - ライセンス : Common Development and Distribution License (CDDL)
  - ここ数年、ほとんど活動してないみたい。


Stack Overflow からの参考：

- [java - Running Apache DS embedded in my application - Stack Overflow](http://stackoverflow.com/questions/1560230/running-apache-ds-embedded-in-my-application)
  - http://stackoverflow.com/questions/1560230/running-apache-ds-embedded-in-my-application
- [web applications - What is a good embeddable Java LDAP server? - Stack Overflow](http://stackoverflow.com/questions/337756/what-is-a-good-embeddable-java-ldap-server)
  - http://stackoverflow.com/questions/337756/what-is-a-good-embeddable-java-ldap-server
- [Embedded/memory LDAP server solution - Stack Overflow](http://stackoverflow.com/questions/7269697/embedded-memory-ldap-server-solution)
  - http://stackoverflow.com/questions/7269697/embedded-memory-ldap-server-solution

その他参考：

- [LDAP: In-Memory Directory Server using UnboundID LDAP SDK | Diaries, Triumphs, Failures, and Rants](https://ff1959.wordpress.com/2011/11/01/ldap-in-memory-directory-server-using-unboundid-ldap-sdk/)
  - https://ff1959.wordpress.com/2011/11/01/ldap-in-memory-directory-server-using-unboundid-ldap-sdk/
  - UnboundIDのLDAP SDKでLDAPサーバを組み込みで使ってみた記事。
  - 肝心の Java コードが google code にあったらしく、今はロストしてる。(´・ω・｀)
- [29. LDAP Authentication](http://docs.spring.io/spring-security/site/docs/4.2.1.RELEASE/reference/html/ldap.html#using-an-embedded-test-server)
  - http://docs.spring.io/spring-security/site/docs/4.2.1.RELEASE/reference/html/ldap.html#using-an-embedded-test-server
  - Spring Security では、LDAP認証のテスト機能として Apache DS のIn-Memory機能をサポートしている。
  - 今使うとなれば、ココらへんのコードを読み解いてみるしかないんだろーなー・・・。
型定義で`typeof T`したくなった時は {new ():T}

型定義でジェネリクスの型変数Tを使いつつ、インスタンス化する前のTそのもの[^1]を定義するときのTIPS。

[以前の記事で型クエリと組み合わせられたらなあ(`typeof T`)](http://qiita.com/ConquestArrow/items/e85ea06ac14ab39e94fa)と書いていた。


同様に思う人は多かったらしく、いつの間にかTypeScriptの公式WIKIのFAQにやり方が書いてあった。
オブジェクトリテラル型の __型表現で `{new ():T}` とすればよい__ らしい。

```ts
function create<T>(ctor: { new(): T }) {
    return new ctor();
}
var c = create(MyClass); // c: MyClass
```
出典：[Why can't I write typeof T, new T, or instanceof T in my generic function?](https://github.com/Microsoft/TypeScript/wiki/FAQ#why-cant-i-write-typeof-t-new-t-or-instanceof-t-in-my-generic-function)


厳密にやるなら次のissueに紹介されていた方法もある。

```ts
/** Generic class type. */
type Constructor<T> = { new (...args: any[]): T } | ((...args: any[]) => T) | Function;
```

https://github.com/Microsoft/TypeScript/issues/204#issuecomment-257722306



[^1]: 何と呼べばいいのか。
Xcodeでプロジェクト名を途中で変えた後にライブラリを加えてlinker command failedになった人へ

自分の体験談です。忘備録がわりですが同じような症状の人にもわかるように。
linker command failedエラーが発生した状況はこんな感じでした。
#発生状況
- 名称「A」というプロジェクト名、アプリ名で開発開始して、ビルドやシミュレーターで開発をした
- 途中でアプリ名を「B」に変えて「Display　Name」や「Indentity and Type」、その他プロジェクトフォルダの名称も「B」に変更した
- cocoapodsをインストールし、追加したいライブラリをPodfileに書き込んで、該当プロジェクトフォルダ内で```pod install```をした
- 該当の.xcworkspaceファイルをXcodeで開き、シミュレーターなどでビルドを試みるも、build Faildになる
- ```linker command failed with exit code 1 (use -v to see invocation) ```エラーが発生
<img width="529" alt="スクリーンショット 2017-01-21 17.07.42.png" src="https://qiita-image-store.s3.amazonaws.com/0/80100/f331b3ad-8e21-5984-b228-b9270e40b686.png">

このエラーは様々な要因で起こります。```Build Active Architecture Only```などの設定がおかしかった、という例などもありこれらを試してみてもうまくいかない･･･という人もいるかと思います。

あくまでもこれは私の1つの解決法です。
#解決法
通常、１度でもビルドをすると、
/Users/[ユーザー名]/Library/Developer/Xcode/DerivedData/Debug-iphoneosあたりに[アプリ名].appというアプリケーションが出来ますが、
途中でアプリ名を変更するとここに変更前と変更後の2つ(今回は「A.app」と「B.app」の2つ)が出てきてしまうことがあります。
Xcodeのプロジェクトの「Build Settings」の中の「Bundle Loader」を見てみると変更前の「A」が残っているのことが今回のエラーの元凶です。
<img width="749" alt="スクリーンショット 2017-01-21 17.17.46.png" src="https://qiita-image-store.s3.amazonaws.com/0/80100/84a5180c-ffe2-11aa-726c-441d9c6afb4c.png">

ここの欄を```${BUNDLE_LOADER}```と入力してあげましょう。これでビルドが通るはずです。

どうやらアプリ名を変更するときに必要な変更箇所を見逃していたようですね。やっぱりアプリ名を途中で変更するのは極力控えた方が良さそうです。

ちなみに見つかったうちの古い方アプリケーション(今回は「A.app」)は削除しても問題なさそうです。
PHPの設定をコマンドラインで確認する

実行環境構築中などで頻繁に叩くコマンドをピックアップしてみました。
`php -r 'phpinfo();'`なんてする必要はありません。

# -v バージョンの表示

phpのバージョン表示

```
PHP 7.0.8-0ubuntu0.16.04.3 (cli) ( NTS )
Copyright (c) 1997-2016 The PHP Group
Zend Engine v3.0.0, Copyright (c) 1998-2016 Zend Technologies
    with Zend OPcache v7.0.8-0ubuntu0.16.04.3, Copyright (c) 1999-2016, by Zend Technologies
```

# -i PHPインフォメーション

`phpinfo()`の出力をしてくれます。全情報が出てくるので出力が大きくて使いづらいかも。出力のサンプルも省略します

# -m モジュールのリスト表示

非常によく使います。出来上がったphpアプリがエラー吐くのは大体エクステンションが足りてないパターンなんで。

```
[PHP Modules]
calendar
Core
:
(略)
:
yaml
Zend OPcache
zlib

[Zend Modules]
Zend OPcache
```


# --ini コンフィグファイルの表示

読み込んだコンフィグファイルを全部出力します

```
Configuration File (php.ini) Path: /etc/php/7.0/cli
Loaded Configuration File:         /etc/php/7.0/cli/php.ini
Scan for additional .ini files in: /etc/php/7.0/cli/conf.d
Additional .ini files parsed:      /etc/php/7.0/cli/conf.d/10-opcache.ini,
/etc/php/7.0/cli/conf.d/10-pdo.ini,
/etc/php/7.0/cli/conf.d/15-xml.ini,
:
(略)
:
```

# --ri extension名

各機能ごとに設定の詳細を出力します。設定値まで出てくれるのでこれもよく使います。

```

Core

PHP Version => 7.0.13-0ubuntu0.16.04.1

Directive => Local Value => Master Value
highlight.comment => <font style="color: #FF8000">#FF8000</font> => <font style="color: #FF8000">#FF8000</font>
highlight.default => <font style="color: #0000BB">#0000BB</font> => <font style="color: #0000BB">#0000BB</font>
highlight.html => <font style="color: #000000">#000000</font> => <font style="color: #000000">#000000</font>
highlight.keyword => <font style="color: #007700">#007700</font> => <font style="color: #007700">#007700</font>
highlight.string => <font style="color: #DD0000">#DD0000</font> => <font style="color: #DD0000">#DD0000</font>
display_errors => Off => Off
display_startup_errors => Off => Off
enable_dl => Off => Off
expose_php => On => On
docref_root => no value => no value
docref_ext => no value => no value
html_errors => Off => Off
:
(略)
:
exit_on_timeout => Off => Off
error_reporting => 22527 => 22527
zend.assertions => -1 => -1
zend.enable_gc => On => On
zend.multibyte => Off => Off
zend.script_encoding => no value => no value
zend.detect_unicode => On => On
```

# 最後に

この記事書いてて`--ini`の存在に気が付きました。たまにはヘルプも読みなおすのもいいですね。
WebJarsで欲しいものがないのーと

# WebJarsについて

js/cssをjarで提供してくれるもの。
配布されているものをそのまま使うのであれば使えます。

* http://www.webjars.org/
* [WebJars 使い方メモ](http://qiita.com/opengl-8080/items/c8c5f787613c230a9827)参照

# 状況

新しいバージョンがリリースされたばかりなど、MavenCentralRepositoryに欲しいものがない。Bowerにはあるのに。

# 解決

Bowerから自動デプロイする。
トップページに次のような記述がある。ようするに「誰でもリリースできるよ」です。

<img width="438" alt="Bower WebJars" src="https://qiita-image-store.s3.amazonaws.com/0/158796/05c44dce-fb23-6f54-1675-54da9abe5d94.png">

## 手順

1. 上記ボタンを押す
2. 使いたいライブラリのバージョンの横の <img width="42" alt="プラス" src="https://qiita-image-store.s3.amazonaws.com/0/158796/66957b05-1fe5-9dad-e1db-3153c116a6ad.png"> を押す
3. バージョンを選択してデプロイボタンを押す
4. しばらく待つとデプロイが完了する
5. しばらく待つとMaven Centralに反映される

4はサイズ次第で数分、5は数時間かかりることがあります。

## デプロイできた画面

<img width="609" alt="デプロイできた画面" src="https://qiita-image-store.s3.amazonaws.com/0/158796/73e5d3f7-10b0-cb14-968a-a2df31b0a0d4.png">

終わったら反映されるまで気長に待ちましょう。
VirtualBoxの設定と仮想サーバ構築

久々にVirtualBoxを触ったら、すっかり設定方法が頭から抜け落ちていたので、覚書きとして書いておきます。

# ネットワーク構成
今回、下図で示すネットワークを構成しました。
![20170121_Virtualbox.png](https://qiita-image-store.s3.amazonaws.com/0/107228/35d164e5-2c36-b6a8-78ce-4682fdd36447.png)

VirualBoxの各ネットワークは以下のようにしました。

* NATネットワーク：
NATネットワークは、仮想サーバ（VM01、VM02）から外部への通信のみを許可し、外部からの通信は許可しません。

* ホストオンリーネットワーク：
ホストオンリーネットワークはホスト端末（HOST01）から仮想サーバの通信のみを許可し、仮想サーバからホスト端末への通信は許可しません。

* 内部ネットワーク：
仮想サーバ間のみ通信が可能なネットワークとして、内部ネットワークを設定しました。

各ネットワークの詳細を以降に示します。

##NATネットワーク
通常、VirtualBoxでアダプタをNATにすると、VirtualBoxのネットワーク設定がそのままであれば10.0.2.2がゲートウェイアドレスとなり、10.0.2.15がサーバのアドレスとなります。複数の仮想サーバがあったとしても、NAT用のサーバアドレスはすべて10.0.2.15となります。このため、NATアダプタではサーバ間通信ができません。そこで、NATネットワークを使います。

NATネットワークは「環境設定」⇒「ネットワーク」から「NATネットワーク」タブを選択し編集します。今回は仮想サーバに任意のアドレスを振るため、「DHCPのサポート」は無効にしています。
![1.png](https://qiita-image-store.s3.amazonaws.com/0/107228/5757f60b-0090-a14e-9b84-9b7eac182e3e.png)

NATネットワークを構成した場合、ゲートウェイとなるIPアドレスは基本的に「xxx.xxx.xxx.1」が割り当てられるようです。試しにゲートウェイアドレスを仮想サーバのNICに振ってみたところ、今度は「xxx.xxx.xxx.2」がゲートウェイとなりました。[参照リンク](https://www.virtualbox.org/manual/ch08.html#vboxmanage-natnetwork)を見てもイマイチ動きが解らなかったので、難しい設定をしないで素直に.1をゲートウェイとして考えた方がいいかもしれませんね。

NATネットワークのゲートウェイは、VBoxManageをひっぱたけばわかります。

```bat:test.bat
C:\PROGRA~1\Oracle\VirtualBox>VBoxManage.exe list natnetworks
NetworkName:    NATNET
IP:             10.0.2.1
Network:        10.0.2.0/24
IPv6 Enabled:   No
IPv6 Prefix:    fd17:625c:f037:2::/64
DHCP Enabled:   No
Enabled:        Yes
loopback mappings (ipv4)
        127.0.0.1=2
```

## ホストオンリーネットワーク
NATネットワーク + ホストオンリーネットワークを構成する際、デフォルトゲートウェイはNATネットワークのみとし、ホストオンリーにデフォルトゲートウェイは設定しないようにします。当たり前といえば当たり前ですが、2つのゲートウェイが混在すると通信ができなくなってしまうので。

## 内部ネットワーク
クラスタ構成を組むため共有領域が必要な場合（CTDBのような）、仮想サーバ間のみの通信ができれば他の通信に影響を与えなくて済みます。



次回、この構成を生かした仮想インフラを作ってみます。
ArchLinuxでタッチパッド設定


# 概要

ノートPCでタッチパッドを使っていたら１本指タップでクリックが効かない。。。
というときの設定。

# 解決法

```shell-session
synclient TapButton1=1
```

とすれば効くようになります。

~/.xinitrcに記述しておけばデスクトップ環境を起動した際に自動で有効になります。
ArchLinuxで無線LAN設定（WPA/WPA2）

# 概要

ArchLinuxで無線LANの設定をします。

# 手順

## wpa_supplicantインストール

WPA/WPA2の場合はwpa_supplicantが必要です。

```shell-session
pacman -S wpa_supplicant
```

でインストールします。

## 無線インターフェイスを確認

```shell-session
ip link
```

上記コマンドで無線インターフェイスを確認します。wlan0, wlp2s1, ath0 などがあるらしいです。私の場合は```wlp2s0```でした。


## 接続用プロファイルの作成

```/etc/netctl/examples```配下に接続用プロファイルのサンプルが置いてあります。  これをコピーして接続用プロファイルを作成します。今回はWPA/WPA2ですので、```wireless-wpa```を使用します。

- プロファイルをコピーします。

```shell-session
cp /etc/netctl/examples/wireless-wpa /etc/netctl/[プロファイル名]
```

- 必要な部分を変える

```shell-session
vim /etc/netctl/[プロファイル名]
```

最初こんな感じになっている思います。

```
Description='A simple WPA encrypted wireless connection'
Interface=wlan0
Connection=wireless

Security=wpa
IP=dhcp

ESSID='MyNetwork'
# Prepend hexadecimal keys with \"
# If your key starts with ", write it as '""<key>"'
# See also: the section on special quoting rules in netctl.profile(5)
Key='WirelessKey'
# Uncomment this if your ssid is hidden
#Hidden=yes
# Set a priority for automatic profile selection
#Priority=10
```

このファイルの中の

```
Interface=[無線インターフェース]
```

```
ESSID='[APのSSID]'
```

```
Key='[APのパスワード]'
```

の部分を変更して保存します。

## 接続

root権限で

```shell-session
netctl start [プロファイル名]
```

で接続します。
二足歩行ロボット Rapiro を Node.js で制御 [3.5] A6/A7ピンを使う

# 問題
[前回](http://qiita.com/mkoku/items/e04289eafd86ea64f28d)まで順調に進んできた Rapiro の JavaScript 制御化ですが、距離センサを追加しても値が取得できず、かなりハマりました。自己解決できましたので、レポートしておきます。

## 問題の詳細

* Rapiroのメイン基板にStandardFirmataを書き込んで、Raspberry Pi から Node.js (johnny-five) で制御することはできている
* 距離センサ（[GP2Y0A21YK](https://www.switch-science.com/catalog/40/)）を搭載して、メイン基板の拡張ピンのA6（またはA7）で値を取得しようとするも、できない
* Arduino IDE 1.8 で普通に StandardFirmata（または StandardFirmataPlus）をそのまま（Arduino Uno設定で）書き込んだ状態だと、A6を認識してくれず、計測そのものができない
* Arduino Uno はそもそもA5までしかないため、StandardFirmata の冒頭で「#define TOTAL_ANALOG_PINS 8　／　#define TOTAL_PINS 22」として、Boards.hで定義されたアナログ入力ピン数をオーバーライドした状態で StandardFirmata を書き込んだところ、距離センサの値を取得することができたが、今度は、RapiroのサーボやLEDが制御できなくなってしまう

# 解決策

Arduino IDE の boards.txt に、以下のように Rapiro 専用の記述を加えました。
こうすることで、Arduino IDE のボードの選択肢から「Rapiro Control Board」が選べるようになります。それを選び、StandardFirmataPlus を書き込むことで、バッチリでした。
重要なのは一番下の行の「eightanaloginputs」です。これでアナログ入力を8個使えるようになるようです。通常の Arduino Uno はこの指定が「standard」です。コンパイル時の定数の設定で、具体的には、pins_arduino.h 内の NUM_ANALOG_INPUTS の値を「8」にする設定です。

```text:boards.txt
rapiro.name=Rapiro Control Board

rapiro.vid.0=0x0403
rapiro.pid.0=0x6015

rapiro.upload.tool=avrdude
rapiro.upload.protocol=arduino
rapiro.upload.maximum_size=32256
rapiro.upload.maximum_data_size=2048
rapiro.upload.speed=115200

rapiro.bootloader.tool=avrdude
rapiro.bootloader.low_fuses=0xFF
rapiro.bootloader.high_fuses=0xDE
rapiro.bootloader.extended_fuses=0x05
rapiro.bootloader.unlock_bits=0x3F
rapiro.bootloader.lock_bits=0x0F
rapiro.bootloader.file=optiboot/optiboot_atmega328.hex

rapiro.build.mcu=atmega328p
rapiro.build.f_cpu=16000000L
rapiro.build.board=AVR_UNO
rapiro.build.core=arduino
rapiro.build.variant=eightanaloginputs
```

なお、通常はこの boards.txt は、Arduinoのインストールディレクトリ内の「hardware\arduino\avr」内にあります。が、以前に別のボード定義などをインストールしていると、Windowsの場合「C:\Users\\(ユーザ名)\AppData\Local\Arduino15」内にボードの定義ファイル群がコピーされていて、そちらが優先されるようです。その場合、インストールディレクトリ内の boards.txt を書き換えてもダメなようです。それに気づくのに時間がかかり、ハマりました。さらに、AppData内のArduino15フォルダは、Arduino IDEをアンインストールしても残るので、要注意です。
私は、いったんArduino IDE をアンインストールし、残った Arduino15 フォルダを手動で削除して、新たに Arduino IDE をインストールして、インストールディレクトリ内の boards.txt に上記を加えました。

# まとめ
できてしまえば単純なことでしたが、今回のトラブルのおかげで、Arduino のハードウェアやソフトウェアについて少し勉強になりました。

これでようやく、[次（センサの追加等）](http://qiita.com/mkoku/items/d559d7286ecd156f70aa)に進むことができます。
japandas.DataReaderの代替モジュールを作った

# 概要
japandasのリモートデータアクセス機能を使うとYahoo! ファイナンスから国内株式の情報を取得できますが、いろいろ改善したいと思う点があったので、前から作っていたやつをfin-pyもくもく会#2のあいだで完成させました。

## 課題
- 株式分割の際に余計なレコードが取得されてしまう
- 会社情報もほしい
- 決算情報もほしい

japandasの実装では、```pd.read_html()```でHTMLをスクレイピングしていますが、単純に画面上の表をそのまま拾ってきているだけなので取得期間によっては分割イベントを拾ってしまいます。

```py:japandasで取得してみた例
import japandas as jpd
jpd.DataReader('8411', 'yahoojp', '2008-12-15', '2009-01-15')
```

実行結果

|         | 始値                | 高値   | 安値   | 終値   | 出来高    | 調整後終値* |
|------------|---------------------|--------|--------|--------|-----------|-------------|
| 日付       | 　                  | 　     | 　     | 　     | 　        | 　          |
| 2008/12/19 | 259400              | 270600 | 253200 | 259900 | 281076    | 259.9       |
| 2008/12/22 | 266400              | 276000 | 265800 | 270200 | 164024    | 270.2       |
| 2008/12/24 | 262200              | 268100 | 254400 | 257700 | 96027     | 257.7       |
| 2009/1/5   | 分割: 1株 -> 1000株 | NaN    | NaN    | NaN    | NaN       | NaN         |
| 2009/1/5   | 283                 | 294    | 279    | 292    | 91382100  | 292         |
| 2009/1/6   | 297                 | 299    | 287    | 289    | 112779100 | 289         |
| 2009/1/7   | 293                 | 298    | 289    | 296    | 79444700  | 296         |

いまいちですね…
四本値をチャートに表示させたい場合、終値以外も修正しないといけません。

## できたもの
というわけで作ったのがこちら。japandas同様にpandas_datareaderを継承していますので、ほぼ同様に使えます。
[sawadyrr5/YahooJapanDataReader](https://github.com/sawadyrr5/YahooJapanDataReader)

Jupyterの%timeitで計測してみても20%程度高速化したようです。内部処理をXPathでパースするようにしたからでしょうか？
Amazon AlexaとPhilips Hueを連携させる

Philips HueとはLedの電球で、Wi-Fiに接続できスマフォや専用のスイッチから操作できるものです。
![image-hue-pack.jpg](https://qiita-image-store.s3.amazonaws.com/0/36184/2add0354-9d6d-e457-567b-a803dac7326a.jpeg "image-hue-pack.jpg")

http://www2.meethue.com/en-us/about-hue/


Amazon Echoが登場した頃から、同じネットワーク上に存在するHueを検出して操作するということができました。しかし、AVSを利用して作られた自作のAlexaからは利用することはできませんでした。
[Amazon Echoで照明を操作する](http://qiita.com/sparkgene/items/540098204f8f4edbc90a)

しかし、去年Home Skill APIが公開されHueが対応したことにより、Amazon Echo以外のAlexa搭載デバイスからも繋ぐことが可能になりました。
[Smart Home Skillsを使ってみる](http://qiita.com/sparkgene/items/055d7864c92a80b0c040)

自作Echoからも使えるということで、高いと思いつつも[Philips Hue LED Starter Kit](http://amzn.asia/3OlcdBJ)を購入したので、実際に使ってみました。（Alexaと連携できるHueはv2のものです）

## Hueのセットアップ

Hue日本に対応しているので、日本語の取扱説明書やサイトがあるので、それを見ながら設定しました。
やることとしては
- Hueの電球を付ける
- ブリッジと呼ばれるコントローラをLanに繋ぐ
- iPhoneアプリをダウンロードして手順位沿ってセットアップ
と非常にかんたんです。

## AlexaとHueの連携

Alexaから使うにはHueのSkillを有効にする必要があります。

![スクリーンショット 2017-01-20 12.51.14.png](https://qiita-image-store.s3.amazonaws.com/0/36184/3d20d222-f786-4d68-bea5-aba43462b9fc.png "スクリーンショット 2017-01-20 12.51.14.png")

`Enable`をクリックすると、HueのアカウントとAlexaのアカウントをリンクさせるために、Hueのログイン画面が表示されます。
![スクリーンショット 2017-01-20 12.51.24.png](https://qiita-image-store.s3.amazonaws.com/0/36184/e53c04e0-498e-9bd3-6c34-d28c4881cb63.png "スクリーンショット 2017-01-20 12.51.24.png")

ログインするとアクセス権を要求されるので許可します。
![スクリーンショット 2017-01-20 12.51.38.png](https://qiita-image-store.s3.amazonaws.com/0/36184/e519217b-97ad-a0de-66f7-a56ee083c497.png "スクリーンショット 2017-01-20 12.51.38.png")

連携が終わるとリンクしましたメッセージが表示されます。
![スクリーンショット 2017-01-20 12.51.48.png](https://qiita-image-store.s3.amazonaws.com/0/36184/40ff129d-0f84-bef1-2c4a-8ead19a5a536.png "スクリーンショット 2017-01-20 12.51.48.png")

メッセージの画面を閉じてAlexa Appに戻ると、デバイスを検索するかの確認画面が表示されるので、 `Discover Devices`をクリックして検索させます。

![スクリーンショット 2017-01-20 12.51.56.png](https://qiita-image-store.s3.amazonaws.com/0/36184/5b084dd3-b01b-2e6b-50d7-c5e6c1e980c1.png "スクリーンショット 2017-01-20 12.51.56.png")

20秒ぐらいで検索が終わります。

![スクリーンショット 2017-01-20 12.52.06.png](https://qiita-image-store.s3.amazonaws.com/0/36184/089a77f2-ec73-8332-422a-1a7de22e7edf.png "スクリーンショット 2017-01-20 12.52.06.png")

検索が終わると、見つかったデバイスが表示されます。
![スクリーンショット 2017-01-20 12.53.01.png](https://qiita-image-store.s3.amazonaws.com/0/36184/56c360b0-094d-0858-0a60-0b267f0b9c05.png "スクリーンショット 2017-01-20 12.53.01.png")

電球2個なので、登録されるデバイスは2つかと思いきや、大量に追加されました。
ここに大量に追加されたのは、デバイスではなくSceneと呼ばれるもので、デバイス単体を操作するのではなく、とあるシーンが定義されているものです。

例えば、就寝(Good Night)のシーンだとしたら照明を落としてカーテンを閉めてみたいな事を定義しておくと、`Alexa, turn on Good Night in the Bedroom` と話しかけることによって、実行することができます。

今回追加されたシーン `くつろぐ in リビング` はHueの電球が優しい色に変わるはずですが、シーン名が日本語となっているためAlexaが認識しません。

そこで、Hueのアプリですべてのシーンを英語にリネームして、再度デバイスのディスカバリーを行います。
![スクリーンショット 2017-01-21 16.06.22.png](https://qiita-image-store.s3.amazonaws.com/0/36184/8ad1603e-95b8-e5d3-872c-01af461a516f.png "スクリーンショット 2017-01-21 16.06.22.png")

これで、 `Alexa, turn on relax in the living` 話しかければ、relaxシーンに合った照明になります。
[Unity]Shaderでかっこよさげな(?)シーン遷移 ~その3~

#できるもの
![1月-21-2017 16-02-11.gif](https://qiita-image-store.s3.amazonaws.com/0/113509/14b67169-e17f-ed72-d73d-a48cde0733c7.gif)
バトルシーンへの遷移に使えそう。
少なくとも一瞬でパッと変わるよりはマシかなぁ?
この三角形っぽく見えるものが個人的には好きです。
(スクリプトから進行度合いの値を入れる必要があります。詳しくは[ここ](http://qiita.com/torumu106/items/20fcb7590f653695f26f))
(それが嫌なら_Time.yに演算を少し施して使うといいかもです。)
#コード
```
Shader "Original/NewImageEffectShader 2"
{
	Properties
	{
		_MainTex ("Texture", 2D) = "white" {}
		percent ("percent", Range(0.0, 1.0)) = 0.5
	}
	SubShader
	{
		// No culling or depth
		Cull Off ZWrite Off ZTest Always

		Pass
		{
			CGPROGRAM
			#pragma vertex vert
			#pragma fragment frag
			
			#include "UnityCG.cginc"
			uniform float percent;

			struct appdata
			{
				float4 vertex : POSITION;
				float2 uv : TEXCOORD0;
			};

			struct v2f
			{
				float2 uv : TEXCOORD0;
				float4 vertex : SV_POSITION;
			};

			v2f vert (appdata v)
			{
				v2f o;
				o.vertex = mul(UNITY_MATRIX_MVP, v.vertex);
				o.uv = v.uv;
				return o;
			}
			
			sampler2D _MainTex;

			fixed4 frag (v2f i) : SV_Target
			{
				fixed4 col = tex2D(_MainTex, i.uv);
				float2 r = 2.0 * (i.uv - 0.5);
                float aspectRatio = _ScreenParams.x / _ScreenParams.y;
                r.x *= aspectRatio;
                fixed4 bgCol = fixed4(0.0, 0.0, 0.0, 0.0);

                float hight = floor(r.y * 10) / 10 + 2;
				if(hight % 0.2 < 0.1){
					if(r.x < hight + percent * 6 - 5){
						col = bgCol;
					}
				}else{
					if(r.x > -hight - percent * 6 + 5){
						col = bgCol;
					}
				}

				return col;
			}
			ENDCG
		}
	}
}

```
#仕組み
高さをfloor()で0.1単位に切り下げしてその値とpercentを使って黒をぬっています。
windows10 uwsc 関連付け追加方法

windows10で拡張子 uws が見つからんし、関連付けできない場合
https://www.ipentec.com/document/document.aspx?page=windows-registry-add-extension-relation

の方法で

キーが作成されます。関連付けしたい"."を含む拡張子名でキーを作成します。今回はキー名を".uws"として新規追加。

で
スタートメニュー > 歯車アイコン > windowsの設定 > システム >規定のアプリ > ファイルの種類ごとに規定のアプリを選ぶ

で関連付けする。
Electronでrenderer.jsで定義したfunctionをindex.htmlから呼び出せるようにする

とりあえずこうしたら動くよ程度なので、ベスプラ教えてください。。

```js:renderer.js
function hoge() {
  console.log('hoge');
}
```

これを

```html:index.html
<button onclick="hoge()">hoge()</button>
```

としても動きません。

一つの直し方として、hoge関数をwindowオブジェクトに登録したらうまく行きました。

```js:renderer.js
function hoge() {
  console.log('hoge');
}

window.hoge = hoge;
```
MacのGoogle Chromeの固定幅フォントのデフォルトが等幅ではないOsakaな件

プログラムのコードのインデントやエラー箇所の表示など、位置が重要なときは等幅フォントで表示してほしいが、「設定」-「ウェブ コンテンツ」

![image.png](https://qiita-image-store.s3.amazonaws.com/0/58084/1b8e26d7-c302-3b97-2050-2508ce9a6411.png)

の「フォントをカスタマイズ…」を表示すると

![image.png](https://qiita-image-store.s3.amazonaws.com/0/58084/9e1731d0-317a-81a4-0ca4-de9497ee2cb7.png)

固定幅フォントはOsakaになっている。これによって、CSSで

```css
font-family: monospace;
```
のようにはっきりとフォントが指定されてない場合に、等幅ではないOsakaが使われてしまう。

固定幅フォントのプルダウンメニューを見ても、Osaka-等幅は出てこない。

Osaka-等幅が出てこない問題は2011年に報告してあり、パッチもあるようだが、取り込まれてないようだ[^1]。

Osaka-等幅を使いたい場合は[Mac OS X でOsaka-等幅を使う方法 - Qiita](http://qiita.com/TaikiHirose/items/28d61a6db684faf0a708)に書いてあるようにOsakaのレギュラーを使用停止にする。

[^1]: [86734 - Japanese font 'Osaka-mono', not 'Osaka', should be in the fixed-width font list. - chromium - Monorail](https://bugs.chromium.org/p/chromium/issues/detail?id=86734)

等幅ならいいのであれば、「固定幅フォント」でmonacoなりRictyなりを選んでやる。

[Courier、Courier New、Consolas · terkel.jp](http://terkel.jp/archives/2009/11/courier-courier-new-and-consolas/)によると、Courier Newがいいようだ。
GuetzliとMozjpegは、どっちが高性能か。

#始めに
[GoogleがJPEGエンコーダー「Guetzli」をオープンソースで公開](http://gigazine.net/news/20170113-google-guetzli/)というネットニュースを見て、HDDを圧迫している画像ファイルを小さくできたらいいなと思い調べてみました。
検索してみると[次世代jpegエンコーダのGoogle製「guetzli」とMozilla製「mozjpeg」を比較してみる](http://qiita.com/osamu1203/items/bf4c1e905d27adbe2c80)というブログを発見しました。
googleの作ったguetzliだけではなく、Mozillaの作ったmozjpegというツールがあるみたいです。
ブログでは、現時点のバージョンでは、mozjpegの方が優れているという結果になっています。
ブログで比較に使われたバージョンは、
Google/guetzli v0.1
mozilla/mozjpeg v3.1
ですが、guetzliはv0.2になっており、使ってみると驚くほど縮小されるので、もしかすると大幅に改善された可能性もあるなと思い比較してみました。
##Mozjpegの準備
[How to Install mozjpeg](https://blarg.co.uk/blog/how-to-install-mozjpeg)を参考にしてインストールします。

```:bash
$ sudo apt-get install git
$ git clone https://github.com/mozilla/mozjpeg.git
$ sudo apt-get install autoconf automake libtool nasm make
$ cd mozjpeg
$ autoreconf -fiv
$ mkdir build && cd build
$ sh ../configure
$ sudo make install
```

シンボリックリンクを貼って使いやすくします。
```:bash
$ sudo ln -s /opt/mozjpeg/bin/jpegtran /usr/local/bin/mozjpeg
```

使い方は、こんな感じです。
```:bash
$ mozjpeg -optimize -copy none image.jpg > compressed.jpg
```
##Guetzliの準備
guetzliは、ビルド済みの実行プログラムが用意されているので、[guetzli_linux_x86-64](https://github.com/google/guetzli/releases/download/v0.2/guetzli_linux_x86-64)をダウンロードします。
ダウンロードしたファイルに、シンボリックリンクを貼って使いやすくします。

```:bash
$ sudo ln -s /opt/guetali/guetzli_linux_x86-64 /usr/local/bin/guetzli
```

使い方は、こんな感じです。
```:bash
$ guetzli -quality 84 image.jpg compressed.jpg
```
##比較
[次世代jpegエンコーダのGoogle製「guetzli」とMozilla製「mozjpeg」を比較してみる](http://qiita.com/osamu1203/items/bf4c1e905d27adbe2c80)ブログと同じ条件で比較しようかと思ったのですが、何故かmozcjpegに、qualityオプションが見つからない（？）
なので、同じ画質オプションでの比較はやめて、デフォルト設定での比較にしました。

###オリジナル画像
![IMG_ORIGIN.jpg](https://qiita-image-store.s3.amazonaws.com/0/7839/eda8a873-517d-845b-167d-07e4ea89a15b.jpeg)
サイズ：305.9 kB (305,919 bytes)

###Mozjpeg画像
![mozjpeg.none.jpg](https://qiita-image-store.s3.amazonaws.com/0/7839/aa054b66-b80d-1c4d-9f85-a4c6128a30ff.jpeg)
サイズ：289.5 kB (289,477 bytes)

###Guetzli画像
![guetzli.95.jpg](https://qiita-image-store.s3.amazonaws.com/0/7839/c4271eb4-5c40-735f-1e90-50ac319aca23.jpeg)
サイズ：273.1 kB (273,145 bytes)

###結果
どちらも目視で分かる劣化は認められませんでした。
変換速度は、Guetzliが比較にならないほど遅く画像によってはエラーになるようです。
しかしながら圧縮能力は、Guetzliの方が優れています。
osamu1203さんの比較とは逆の結果となりました。
まだ、v0.2ですし変換速度と安定度が改善されたらGuetzliが、オススメです。

#再検証
osamu1203さんからmozjpegには、可逆版コマンド(jpegtran)と不可逆版コマンド(cjpeg)が分かれているとの指摘がありましたので、再検証してみました。
バージョンは、guetzli(v0.2)/mozjpeg(v3.1)です。
##蜂の画像(bees.png)
まず[guetzliの蜂のサンプル画像](https://github.com/google/guetzli/releases/download/v0.1/bees.png)を使って検証しました。

| -quality | guetzli | mozjpeg |
|:--------:|:-------:|:-------:|
|    100   | 148.4kB |  75.3kB |
|     95   |  37.9kB |  34.9kB |
|     90   |  25.8kB |  25.2kB |
|     85   |  20.3kB |  20.0kB |
osamu1203さんの実験結果と同じで、mozjpegの方が優秀という結果になりました。
バージョンの違いによる性能アップは、今のところ無さそうですね。

##猫稲荷の画像
ついでなので、前回使った猫稲荷の画像も試してみました。
オリジナル画像のサイズは、3.4MBです。

| -quality | guetzli | mozjpeg |
|:--------:|:-------:|:-------:|
|    100   |   3.3MB |   5.2MB |
|     95   |   3.1MB |   3.9MB |
|     90   |   2.6MB |   3.3MB |
|     85   |   2.3MB |   2.8MB |
こちらの画像では、guetzliの方が優秀という結果になりました。
画像によって、得意不得意がでてくるのかも知れません。
guetzliの速度はとても実用に耐えないのですが、改善されたらもう少し色々な画像で試して見たいと思います。
他人のElectronアプリをexe化し直す

他人が作って公開しているElectronアプリが便利だったけど、Chromiumのバージョンが古かったので、（中華フォントいや...）最新のElectronバージョンでパッケージし直すためにやったこと。
（nativifierにすべてお任せ状態からも卒業したかったので）
環境はWindows。

# 0. node.jsのインストール
Windowsではnodistを使うとよい。（別稿に譲る）
# 1. git clone
# 2. package.jsonを書き換える。
```json:package.json(変更前)
...
  "devDependencies": {
    "electron-prebuilt": "^0.35.1"
  }
...
```
ってあったので、[ここ](https://github.com/electron/electron/releases)で最新バージョンを確認して書き換える。

```json:package.json(変更後)
...
  "devDependencies": {
    "electron": "^1.4.15"
  }
...
```
package.jsonにversion指定がないときは、electron-packageのオプションで指定できる。

## jsの書き換え
今回electron-prebuiltをelectronに変更したが、その際の注意点として、appやbrowser-windowがimport(or require)できなくなっているので、そういうことをしているjsを書き換える。

```js:(変更前)
import app from 'app';
import BrowserWindow from 'browser-window';
import electron from 'electron';
```
```js:(変更後)
import electron from 'electron';
const app = electron.app;
const BrowserWindow = electron.BrowserWindow;
```

（参考）[ElectronのクイックスタートでCannot find module 'app'にハマった件](http://qiita.com/koga1020/items/6733de8ae1b8b6782e1c)


# 4. フォルダに移動してnpm install
これによりnode_modulesフォルダが作られて、Electron本体など必要なライブラリがダウンロードされる。
途中```index.js```と表示されたまま動かなくなるのはElectronのダウンロードに時間が掛かるため。

# 5. 動作確認のためnpm start
フォルダ内にlaunch.shとかあって、案の定動かなかったので、```electron .```で実行。

# 6. electron-packagerのインストール
```
npm install electron-packager -g
```
# 7. パッケージ作成
```
electron-packager . --platform=win32 --arch=x64 --asar --icon=[フォルダの中にあったpngファイル]```
```
32bitなら```--arch=ia86```で。
しばらく待つと、「アプリ名-win32-x64」というフォルダができあがっていて、中にExeが入っている。
```--electronVersion```は、このアプリではpackage.jsonから判定されるので不要。
またアプリ名も、package.jsonのproductNameのままでよければ不要。
ビルドし直す時は```--overwrite```をつけるとよい。出力フォルダを手で消してもいいが、アプリがエラーで落ちた場合に、残ったプロセスがファイルをロックしたりして面倒。このオプションをつけるとその辺をいい感じにやってくれる。

# おまけ
GitHubで公開されているアプリは、他の人が同じようにビルドできるかどうかなんてちゃんと確認していないことがままあるようで。
今回のアプリも、babel-coreとかがdevDependenciesに入っていてアプリの実行時にcannot find moduleエラーになったりしていたので、dependenciesに移動してやって、ちゃんと動くアプリを作成できた。

趣味アプリでもGitHubに上げるときは誰でも実行、ビルドできないといけないと思っていたんだけど、自分本位でガンガンあげていいんだな…。（裏を返すと、向こうもそうしてくるから気をつけろということ）
bottleで文字列を取得しようとすると日本語が文字化けする -> 解消

#0.はじめに
bottleの詳しい使い方等は他に良い記事を書いている方が大勢いらっしゃいますので、導入方法や解説はそちらにおまかせします。

**[New!! getunicode を使う方法 （2019/03/19 追記）](#getunicode)**

###私の環境（一応）
macOS Sierra 10.12.2
Python 3.5.2
bottle 0.13-dev

#1.現象
こんな感じの入力フォームを作って、

```html:index.html
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <title>Artist Search</title>
</head>
<body>
<b>検索語句を入れてください。</b>
<form action="/" method="post" accept-charset="UTF-8">
    アーティスト名 :<input type="text" name="artist_name" />
    ジャンル :<input type="text" name="genre" />
    <input type="submit" value="送信" /> <input type="reset" value="取り消し" />
</form>
</body>
</html>
```
適当にページ配置して、

```py:routing_to_"/"
from bottle import route, template

@route('/')
def html_index():
    return template('index')
```

こんな感じになりますね。
![入力フォーム](https://qiita-image-store.s3.amazonaws.com/0/151205/e9760ae9-9da7-ab52-85fb-d3ea13bef811.png)


```py:普通にPOSTからforms.getすると
from bottle import route, template, request

@route('/', method='POST')
def search():
    artistname = request.forms.get('artist_name')
    genre = request.forms.get('genre')
    return template('{{name}}, {{genre}}', name=artistname, genre=genre)
```
日本語を入れて送信すると、
![日本語入れてみる](https://qiita-image-store.s3.amazonaws.com/0/151205/1006171e-03d6-ff8c-b97d-774646bd9f09.png)

こうなっちゃいますね。
![文字化け乙](https://qiita-image-store.s3.amazonaws.com/0/151205/59dd5561-aa34-6fff-5cc3-133a6364ae5f.png)

#2.じゃあどうするか
結論から言うと、

```py:こうする
from bottle import route, template, request

@route('/', method='POST')
def search():

    # get使わずにそのまま取ってくる
    artistname = request.forms.artist_name
    genre = request.forms.genre

    return template('{{name}}, {{genre}}', name=artistname, genre=genre)
```

ちゃんと取得できました。
![うまくいった](https://qiita-image-store.s3.amazonaws.com/0/151205/79e58f75-ea3a-76d9-2f3e-074b92fb262e.png)

#### getunicode
*2019/03/19追記*

`request.forms.getunicode()` なるメソッドを使えば、getと同じような書き方で文字化けを解消できるようです。

```py:getunicode使う
from bottle import route, template, request

@route('/', method='POST')
def search():

    # forms.get => forms.getunicode
    artistname = request.forms.getunicode('artist_name')
    genre = request.forms.getunicode('genre')

    return template('{{name}}, {{genre}}', name=artistname, genre=genre)
```

ちなみに、`request.query` にも使えます。 `request.query.getunicode('queryname')`

#詳しくは…
詳しい話はここに書いてありますのでさらに深く知りたい方はどうぞ

ソース（英語）
[stack_over_flow: How to get utf-8 from forms in Bottle?](http://stackoverflow.com/questions/33445155/how-to-get-utf-8-from-forms-in-bottle)
AndroidプロジェクトにRxJava2を導入する

AndroidプロジェクトにRxJava2 + retrolambdaを導入するメモ

```build.gradle

repositories {
    jcenter()
    maven {
        url "https://plugins.gradle.org/m2/"
    }
}

dependencies {
    classpath "gradle.plugin.me.tatarka:gradle-retrolambda:3.4.0"
}
```

```app/build.gradle

apply plugin: "me.tatarka.retrolambda"

android {
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
}

dependencies {
    compile "io.reactivex.rxjava2:rxjava:2.0.1"
}
```
tcpdumpの基本的な使い方


## tcpdumpとは
- ネットワーク通信の生データを収集し結果を出力(=パケットキャプチャ)してくれるCUIの解析ツール
- いつ、どこからどこへ、どんなフラグ(SYN,ACK,FIN等)のパケットが送られたか等が分かる。
  > UDP
  > 01:49:27.734570 IP 10.121.97.2.ddi-udp-1 > 224.0.0.2.ddi-udp-1: UDP, length 20
  > TCP
  > 02:33:08.725216 IP 127.0.0.1.50430 > 127.0.0.1.12345: Flags [S], seq 1798840789, win 65495, options [mss 65495,sackOK,TS val 338968857 ecr 0,nop,wscale 7], length 0
02:33:08.725238 IP 127.0.0.1.12345 > 127.0.0.1.50430: Flags [S.], seq 2503952955, ack 1798840790, win 65483, options [mss 65495,sackOK,TS val 338968857 ecr 338968857,nop,wscale 7], length 0
02:33:08.725254 IP 127.0.0.1.50430 > 127.0.0.1.12345: Flags [.], ack 1, win 512, options [nop,nop,TS val 338968857 ecr 338968857], length 0

- 他解析ツールと比べてリソース消費が少ない。

## 使い方
- 用途によってフィルタをかける
    - フィルタ無しだと集計結果が膨大すぎるので必ずフィルタを掛けます。
    - フィルタリングの方法は以下
        - ホストで絞る
          > tcpdump host xxx.xxx.xxx.xxx #特定IPでフィルタ
          > tcpdump host 1.1.1.1 or 2.2.2.2 #複数IPでフィルタ
          > tcpdump src host xxx #特定IP(送信元のみ)でフィルタ
          > tcpdump dst host xxx #特定IP(送信先のみ)でフィルタ
        - ネットワークで絞る
          > tcpdump net 192.168.2.0/24 #特定ネットワークでフィルタ(送信元、送信先両方が対応）
          > tcpdump src net 192.168.2.0 mask 255.255.255.0 #送信元ネットワークでフィルタ
          > tcpdump dst net 192.168.2.0 mask 255.255.255.0 #送信先ネットワークでフィルタ
        - ポートで絞る
          > tcpdump port 80 #単一ポート
          > tcpdump port 80 or port 443 #複数ポート
          > tcpdump dst port 80 #送信先ポート
        - インターフェースで絞る
          > tcpdump -i eth0 #eth0の通信のみ対象
        - TCPフラグで絞る
          > tcpdump "tcp[tcpflags] & (tcp-syn|tcp-fin)!=0" #SYNorFINパケットにマッチするものが対象
- よく使うオプション
    - -n  
    アドレス変換(192.168.1.123=>examplehost)やポート番号変換(80=>http)をしない。
    - -w 書き出すファイル名
    収集結果をファイルに書き出す
    - -r 読み込むファイル名
    指定したファイルからパケット収集結果を読み込む

    
## 参考
- 超絶初心者むけtcpdumpの使い方 - Qiita
    - https://goo.gl/keIySm
- tcpdumpやwiresharkでTCP制御フラグを指定してパケットを収集する方法
    - https://goo.gl/M9dXr2
Certbotを利用した証明書作成について

### 概要

iOSのATSに対応したサイト側の証明書について、[Certbot](https://certbot.eff.org/)で作成した証明書を使っても大丈夫そうなので作成方法を記載します。

### 詳細

今回作成するCertbotの証明書はドメイン認証（Domain Validation）と呼ばれるもので、指定したドメインのサイトについて存在確認できれば証明書が作成できます。
Certbotのスタンドアローンモードを使って、Certbot内でWebサーバを起動し、外部からそのサーバにアクセスできれば存在確認OKで証明書を発行してもらいます。
とりあえず、証明書発行までをDockerを使って自動化したものです。

### 取得方法

githubにスクリプトをアップしています。
https://github.com/yoneDev01/certbot-test
利用方法はQuick Startを見ていただければと思います。

作成される証明書と秘密鍵について、
例えばnginxであればssl_certificateにfullchain.pemを、ssl_certificate_keyにprivkey.pemを設定すればよいかと思います。


### 注意
・外部からDockerの443ポートへアクセスできるようにすること