OmniAICreator/Qiita-1.07M huggingface dataset:
ScrapyでのJson出力を日本語にする

##問題

ScrapyでJson出力をした際に、
ターミナルでは日本語で出力されていたが、Jsonでは日本語で出力されなかったので
その時の対応したもののメモ

ターミナルの表示

```
{'subcategory': 'IT総合',
'title': '【動画あり】簡単操作でドリフト可能な「ドリフトスティック」がスゴい！ ケン・ブロックも太鼓判',
 'url': 'https://gunosy.com/articles/RJoAa'}
2017-11-04 16:45:01 [scrapy.core.scraper] DEBUG: Scraped from <200 https://gunosy.com/categories/7>
```

Jsonの表示

```
{"title": "\u30b9\u30c8\u30ea\u30fc\u30c8\u30d5\u30fc\u30c9\u5927\u56fd\u30aa\u30e9\u30f3\u30c0\u306e\u77e5\u3089\u308c\u3056\u308bB\u7d1a\u30b0\u30eb\u30e1", "url": "https://gunosy.com/articles/a9fpc", "subcategory": "\u30b0\u30eb\u30e1\u7dcf\u5408"},
```

##解決策
setting.pyに以下を追加すると日本語で出力できる様になります。

```
FEED_EXPORT_ENCODING='utf-8'
```
Atom ショートカット 一覧 チートシート 厳選

#Atomのショートカット
これだけ知っていたら非常に便利で
すぐにでもAtomのユーザになりたくなります。
Macユーザ向けのショートカットですが
Windowsの方も設定を開いてキーバインドというところを開けば
全て書いてあります。

##ショートカット一覧
まずは、基本

| ショートカット | 動作 |
|:----------:|:-----------:|
| Cmd + c | コピー |
| Cmd + v | 貼り付け|
| Cmd + z | 戻る |
| Cmd + y | 戻るの取り消し|
| Cmd + f | 文字列検索 & 文字列変換 |


###Atomの便利なショートカット
カーソルのある行をまとめてコピーペーストしたり削除できます。
以下ではカーソルのある行を行で書きます。

| ショートカット | 動作 |
|:----------:|:-----------:|
| Cmd + / | 選択した行全てをコメントアウト |
| Shift + Cmd + d | 行のコピー+ペースト|
| Shift + Ctrl + k | 行の削除 |
| Cmd + Enter | 行から改行(カーソルはどこでもOK)|
| Cmd + Shift + Enter | 行の一つ上の行を改行 |
| Cmd + d | 選択した単語を一つずつ<br>検索して足して行く|

<br>
裏技っぽい業でマルチカーソルというものがあります！

| ショートカット | 動作 |
|:----------:|:-----------:|
|Cmd + 左クリック | マルチカーソル|
|ESC or 左クリック| キャンセル | 
これは、本当にオススメ
複数の場所を選択して同時に編集できる
<br>
Atom側の表示などのショートカット

| ショートカット | 動作 |
|:----------:|:-----------:|
| Cmd + alt + \ | ファイルツリーの表示,非表示 |
| Cmd + , | 設定ファイルの表示,非表示 |
| Cmd + Shift + p | コマンド検索の表示,非表示 |
| Cmd + t | ファイル検索の表示,非表示 |

##終わりに
これらは、全てデフォルトでできます。
基本的に標準で予測変換もついてるのでtabキーでコーディング保管してくれます。

これらを使用すれば、コーディングが非常に速くなります。
Atomは、プラグインが豊富なので、もっと便利なものも見つかると思います。

ショートカットなどは覚えるのが大変かもしれませんが
非常に便利で無駄がないです。
これがAtomが人気な証拠なんだと思います。
Node.jsでParrotのミニドローンのBLE情報を探す


> [RESASハッカソン 岩手](https://connpass.com/event/67430/)で記事書いてます。 `#RESAS`

![](https://i.gyazo.com/b83a96c96de04381ae5930caeb2adaac.png)


ドローンをNode.jsから制御する記事を過去に書きましたが、コードが古くなってきたので書き直します。

> [ノンプログラマでもコピペでOK！JavaScriptを使ってDroneを飛ばそう](https://liginc.co.jp/187633)

現行のParrotのミニドローン[Mambo](https://www.parrot.com/global/minidrones/parrot-mambo-mission#parrot-mambo-mission)を探します。

![](https://i.gyazo.com/5bd599fc2b5012fa16d02de247abe132.png)

## 筆者の環境

* Node.js: v9.0.0
* Mac: 10.12.6 Sierra

## 準備

```
npm init -y
npm i --save noble
```

## コード

```scan.js
'use strict';

const noble = require('noble');
const MINIDRONES_IDENTIFER = ['Maclan_','Mambo_','RS_']; //対応機種によって増えていく
let counter = 0;

//ParrotのMinidroneを見つける
const findParrotDrone = (localName) => {
    if(localName === undefined)return false;
    for(let i = 0, len = MINIDRONES_IDENTIFER.length; i < 10; i++){
        if(localName.indexOf(MINIDRONES_IDENTIFER[i]) === 0){
            return true;
        }
    }
    return false;
}

//周辺のBLE機器を検索
const startScan = () => {
    noble.startScanning();
    noble.on('discover', (peripheral) => {
        counter++;
        let mes = '';
        if (!('localName' in peripheral.advertisement)) return; //localNameがあるか判断
        if(findParrotDrone(peripheral.advertisement.localName)) mes += `発見→`; //localNameでParrotのデバイスを検索
        mes += `${counter}台目: ${peripheral.advertisement.localName} | ${peripheral.uuid} | RSSI ${peripheral.rssi}`;
        console.log(mes);
    });
}
    
if (noble.state === 'poweredOn') {
    startScan();
} else {
    noble.on('stateChange', startScan);
}
```

## 実行

Mamboの電源を付けておきましょう。

```
$ node scan.js

1台目: undefined | xxxxxxxxxxxxxxxxxxxxxxxxxx | RSSI -62
2台目: undefined | xxxxxxxxxxxxxxxxxxxxxxxxxx | RSSI -63
発見→3台目: Mambo_XXXXX | zzzzzzzzzzzzzzzzzzzzzz | RSSI -62
4台目: undefined | xxxxxxxxxxxxxxxxxxxxxxxxxx | RSSI -62
```

`zzzzzzzzzzzzzzzzzzzzzz`と書いているところがドローンのUUIDです。
行列の微分(2)

(概要)
『ゼロから作るDeep Learning』読書会＠高円寺(15)に参加してきた。
https://koenjidl.connpass.com/event/69408/
この書籍で、下記(1)式他の導出が省略されていた。
行列の微分を、スカラ値の微分の感覚で行うと
あいまいな点がのこるので、要素に分解して導出した。

(方針)
行列の微分を、要素に分解して、多変数のスカラ関数の
スカラ値による微分に、置き換えて解く。
導出した式は、少し変形すれば、一般性を失わないので
公式として利用できる。

(求める式)

```math
(1)
\begin{equation*}
\frac{\partial L}{\partial W} =X^{T} ・\frac{\partial L}{\partial Y}
\end{equation*}
```

(変数)

```math
\begin{gather*}
(2)Y=( y_{1} ,y_{2} ,y_{3})\\
(3)X=( x_{1} ,x_{2})\\
(4)W=\begin{pmatrix}
w_{11} & w_{21} & w_{31}\\
w_{12} & w_{22} & w_{32}
\end{pmatrix}
\end{gather*}
```


(前準備)


```math
(5)
\begin{equation*}
XW=\left( x_{1} w_{11} +x_{2} w_{12} ,\ x_{1} w_{21} +x_{2} w_{22} ,\ x_{1} w_{31} +x_{2} w_{32}\right)
\end{equation*}
```

```math
(6)
\begin{equation*}
y_{k} =\sum _{m} x_{m} ・w_{km} +b_{k}
\end{equation*}
```


(式展開)

```math
\begin{gather*}
\frac{\partial L}{\partial w_{11}} =\sum _{i}\frac{\partial L}{\partial y_{i}} ・\frac{\partial y_{i}}{\partial w_{11}}\\
\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ =\frac{\partial L}{\partial y_{1}} ・x_{1} +\frac{\partial L}{\partial y_{2}} ・0+\frac{\partial L}{\partial y_{3}} ・0\\
=\frac{\partial L}{\partial y_{1}} ・x_{1}\\
\frac{\partial L}{\partial w_{ij}} =\sum _{k}\frac{\partial L}{\partial y_{k}} ・\frac{\partial y_{k}}{\partial w_{ij}}\\
\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ =\sum _{k}\frac{\partial L}{\partial y_{k}} ・\left(\frac{\partial }{\partial w_{ij}}\left(\sum _{m} x_{m} ・w_{km} +b_{k}\right)\right)\\
=\frac{\partial L}{\partial y_{i}} ・x_{j}\\
\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \frac{\partial L}{\partial W} =\begin{pmatrix}
\frac{\partial L}{\partial y_{1}} ・x_{1} & \frac{\partial L}{\partial y_{2}} ・x_{1} & \frac{\partial L}{\partial y_{3}} ・x_{1}\\
\frac{\partial L}{\partial y_{1}} ・x_{2} & \frac{\partial L}{\partial y_{2}} ・x_{2} & \frac{\partial L}{\partial y_{3}} ・x_{2}
\end{pmatrix}\\
\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ =\begin{pmatrix}
x_{1}\\
x_{2}
\end{pmatrix} ・\begin{pmatrix}
\frac{\partial L}{\partial y_{1}} & \frac{\partial L}{\partial y_{2}} & \frac{\partial L}{\partial y_{3}}
\end{pmatrix}\\
\ =X^{T} ・\frac{\partial L}{\partial Y}
\end{gather*}
```
unity エラー 空白

## unityで初めて見た空白のエラー

今日、unityを起動して触り始めると対処のわからないエラーが出てきたので、対処しながら書き残しておこうと思う。

**エラーが出る前にした行動**
・windows10のアップデート
・unityでMonoBehaviourを継承していないクラスに後からMonoBehaviourを継承した

**エラー内容**
１．コンソールログ
![5.PNG](https://qiita-image-store.s3.amazonaws.com/0/176010/f476acb6-19dc-74eb-1e5c-8ee597b0d7a0.png)

２．スクリプト(Assets)
![6.PNG](https://qiita-image-store.s3.amazonaws.com/0/176010/dfdeafaa-0883-4c1c-3414-134bfb8ed9c7.png)

３．スクリプト(Hierarchy)
![4.PNG](https://qiita-image-store.s3.amazonaws.com/0/176010/30db8d5e-ca65-e445-010a-89de11782823.png)

**解決する為にやってみたこと**
まず、コンソールログは空白で良く分からない。
スクリプトで出ているエラーは「継承しているMonobehaviourがないか、名前が一致していない。」というもの。

名前はファイル名と一致している。(ちなみにこのエラーは全てのスクリプトで出ている)
なので、Monobehaviourスクリプトがないのが原因だと思うが、このプロジェクトだけないのかな、、、と調べるためにnewプロジェクトを立ち上げてテストしてみると、
![7.PNG](https://qiita-image-store.s3.amazonaws.com/0/176010/67d7745a-6d6f-ad74-2f78-3a229bfe7e60.png)
エラー内容で挙げているのが全て出た。

現在ここまで調べた状態。
次は、unityのフォルダの中身を確認していきます。

-------------------------------追記-------------------------------
フォルダ調べたけどMonobehaviourの関係ファイルがどこにあるかわからないww

###結論
○ 最終的には、unityの再インストールで対処した。
（正しい解決法ではないと思うが、まぁ解決できたということで）
ESP32 と 小型128x32OLED液晶ディスプレイ (試運転)

#はじめに
「I2CシリアルOLED液晶ディスプレイモジュール128x32」を手に入れたので試運転の記事。とりあえず試運転の結果の画像。

![OLED128x32.png](https://qiita-image-store.s3.amazonaws.com/0/203949/e45c39d1-67c5-51a7-5410-a6b72bf395df.png)

#ハード
* [ESP32](https://www.amazon.co.jp/HiLetgo-ESP32-ESP-32S-NodeMCU%E9%96%8B%E7%99%BA%E3%83%9C%E3%83%BC%E3%83%892-4GHz-Bluetooth%E3%83%87%E3%83%A5%E3%82%A2%E3%83%AB%E3%83%A2%E3%83%BC%E3%83%89/dp/B0718T232Z/ref=sr_1_5?ie=UTF8&qid=1509776884&sr=8-5&keywords=esp32-devkitc)
* [I2C シリアルOLED液晶ディスプレイモジュール 128x32](https://www.amazon.co.jp/gp/product/B01M8JV310/ref=oh_aui_detailpage_o01_s00?ie=UTF8&psc=1)
* ブレッドボード、ワイヤ...

#ソフト
* 母艦(Windows10)
* ArduinoIDE1.8.5
* Adafruit SSD1306(ライブラリ)
* Adafruit GFX Library(ライブラリ)

#組み立て
ESP32 と OLED を以下のように接続。

|ESP32|OLED|
|:--|--:|
|GND|GND|
|3.3V|VCC|
|SCL|SCL|
|SDA|SDA|

あとは、MicroUSB で PC と ESP32 に繋ぐだけ。

#ライブラリのインストール
ArduinoIDEで「スケッチ」 > 「ライブラリをインクルード」 > 「ライブラリを管理…」で "Adafruit SSD1306" を検索して 「Adafruit SSD1306 by Adafruit」をインストール。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/203949/2ace5b18-cf91-e735-9c7a-15b72f24705a.png)

同じく、"Adafruit GFX Library" を検索して「Adafruit GFX Library by Adafruit」をインストール。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/203949/9c53e263-d217-3187-b241-ca8cd4b7cb5c.png)

#スケッチ例
ライブラリの中にスケッチのサンプルが用意されているのでこれを使用します。
「ファイル」> 「スケッチ例」>「Adafruit SSD1306」>「ssd1306_128x32_i2c」

![image.png](https://qiita-image-store.s3.amazonaws.com/0/203949/15dfa062-4c7b-b638-7606-be16a4a1c659.png)

#I2Cアドレス
このOLEDにも I2Cアドレス がありますが、どうやらヘッダ<Adafruit_SSD1306.h >見ると この 128x32 は0x3C のみらしく 128x64 版は、0x3Cと0x3D があるっぽいです。さらにこのヘッダは 128x32 がデフォルトのようで 128x64 を使う場合には修正が必要みたいです。128x64 版の方は[こちら](https://qiita.com/jakalada/items/8f83d07291d984a31633)を参考にしてみてください(0x3Aという記述の箇所がありますがタイプミスかと)。

#書き込み
「ツール」>「ボード」>「ESP32 Dev Module」
「ポート」>「COM4」(環境によって異なります)
上記の通りに私の場合は、ヘッダの修正も必要なくコンパイル > 書き込みもエラーなく行うことができました。

<blockquote class="twitter-video" data-lang="ja"><p lang="ja" dir="ltr">ESP32とOLED128x32 <a href="https://t.co/z0GUcv10Ek">pic.twitter.com/z0GUcv10Ek</a></p>&mdash; nori.dev.akg (@nori_dev_akg) <a href="https://twitter.com/nori_dev_akg/status/926716547732717568?ref_src=twsrc%5Etfw">2017年11月4日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

#SpecialThanks!!
https://qiita.com/jakalada/items/8f83d07291d984a31633
firewalldコマンド ダッシュボード


## firewall稼働状態

$ firewall-cmd --state

## アクティブゾーンを調べる

firewall-cmd --get-active-zones

## 現在の設定の確認: アクティブゾーン

firewall-cmd --list-all

## 現在の設定の確認: 全てのゾーン

 firewall-cmd --list-all-zones

## サービス追加、削除

- 追加

firewall-cmd --permanent --add-service=ssh

- 削除

firewall-cmd --permanent --zone=public --remove-service=ssh

## ポート追加、削除

- 追加

firewall-cmd --zone=public --add-port=3000/tcp --permanent

- 削除

firewall-cmd --zone=public --remove-port=3000/tcp --permanent


## リッチ言語コマンド

firewall-cmd --permanent --zone=public --add-rich-rule="rule family="ipv4" source address="192.168.1.0/24" port protocol="tcp" port="22" accept"

## リロード

sudo firewall-cmd --reload
accepts nested attributes for 実装まとめ

#やろうとしていること　
多対多のテーブル構造を構築し、viewからparameterを送り、workとworkplaceに保存したい。
(placeのレコードはseedで作っているので、新規追加はしません。)
E-R図はこんな感じです。この会社が募集している仕事は、どの地域にあるのかをわかるようにしたい。

![スクリーンショット 2017-10-21 23.29.14.gif](https://qiita-image-store.s3.amazonaws.com/0/147990/5da7ae42-2a7d-a15e-12ff-4ba2a0128b11.gif)

workテーブルとplaceテーブルの中間として、work_placeテーブルを作りました。

#コード
##モデル：
```ruby

#work.rb
has_many :work_places, dependent: :destroy
has_many :places, :through => :work_places
accepts_nested_attributes_for :work_places, allow_destroy: true

#place.rb
has_many :work_places, dependent: :destroy
has_many :works, :through => :work_places

#work_place.rb
belongs_to :work
belongs_to :place

```
accepts_nested_attributes_forがキモ。上の例だと、workモデルに新しいレコードが保存された際に、そのwork_idとplace_idがwork_placeに保存されるようにする。中間テーブルを通りますよってことで、workモデルとplaceモデルに：throughを追加。


##コントローラー：

```ruby:Works_Controller.rb
def new
   @work = Work.new
　　@work.work_places.build
end

def create
 @work = Work.new(work_params)
 
end

def work_params
   params.require(:work).permit(:company)
end
```
ここではbuildが重要。workレコードが保存された際に、work_placeレコードにも保存をかけますよってことを指示する。

##ビュー：

```ruby

<%= form_for @work do |f| %>
  <%= f.label :company, "会社名" %>
  <%= f.text_area :company %>
  <%= f.fields_for :work_places do |ff| %>
  　 <%= ff.label :placename, "渋谷" %>
  　 <%= ff.check_box :place_id,{}, 1,"渋谷",nil%>
  　 <%= ff.label :placename, "新宿" %>
  　 <%= ff.check_box :place_id,{}, 2,"新宿",nil %>
  　 <%= ff.label :placename, "池袋" %>
   　<%= ff.check_box :place_id,{}, 3,"池袋",nil %>
  <%= f.submit "投稿" %>
<% end %>
```

#これでいけるかと思いきや。。。。（問題発生）
というわけでこれで保存できると思ったんですが、
work_placeモデルにplace_idが保存されない！
work_placeがunpermittedになっている。

![スクリーンショット 2017-10-22 13.54.42.gif](https://qiita-image-store.s3.amazonaws.com/0/147990/d0bdc17b-f5af-acab-ebb4-17c36bf1a227.gif)

insert work_placeは走って、work_idは保存されるのに〜！

#解決策はstrongparameterにありました！

なんと、accepts_nested_attributes_forを使うときは、strongparameterもいじらなければならないようです。

```ruby:Works_Controller.rb
def new
   @work = Work.new
　　　　　　@work.work_places.build
end

def create
 @work = Work.new(work_params)
 
end

def work_params
   params.require(:work).permit(:company, work_places_attributes:[:id,:place_id])
end
```
このように、関連させているモデル名（これはhasmanyしているのでsがついてwork_placesです）にattributesをつけて、カラムを追記してあげなければなりません。

すると。。。。

![スクリーンショット 2017-11-04 16.13.32.gif](https://qiita-image-store.s3.amazonaws.com/0/147990/234f58be-0944-ed35-19c3-60b0a3883046.gif)


place_idも保存されました！

単に、モデルにaccepts_nested_attributes_forをつければいいのかと。。。。

#まとめると。。。。

モデル＝＞accepts_nested_attributes_forを入れましょう

コントローラー＝＞newメソッドの中にbuildを入れ、strongparameterにattributesをつけましょう（ここ大事！）

ビュー＝＞fields_forで関連付け


##個人開発をされている方へ

Moverというプロダクトを開発しています。登録していただくと、開発したプロダクトのテスト利用を依頼し、フィードバックをもらうことができます。自分のプロダクトを公開して個人開発を加速させましょう！！　現在僕のアカウントも登録されているので、そちらにテスト利用依頼をいただければ実際に使ってみた感想などをお送りさせて頂きます。(アドバイスなどではなく、一人のユーザーとしての感想となります。)　もちろん無料です。
https://mover-web.herokuapp.com/



![Screen Shot 2020-05-19 at 4.36.42 PM.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147990/40822905-5a9d-6323-4318-bb475c68e887.gif)
UTF-8にはBOMを付けよう

:point_up:文字コードのUTF-8にはBOM(Byte Order Mark)という印がデータの先頭に付くものと、付かないもの、2種類があります。
:point_up:アプリケーションによってBOMありで正常に動くもの、BOMなしで正常に動くものなど色々あります。
:point_up:BOMありでコケるアプリが💩なだけなので、**しがらみがない限りは**UTF-8にはBOMを付けましょう。
Daydream開発入門 アプリを終了させる

バックキーや画面内の×ボタンを押してもアプリが終了しなかったため、終了させる方法をメモしておきます

## バックキーを有効にする
```
    void Start () {
		// バックキーを有効化
		Input.backButtonLeavesApp = true;
	}
```

## ×ボタンでアプリを終了させる
```
    void Update () {
		// ×ボタンタップでアプリを終了
		if (Input.GetKeyDown(KeyCode.Escape)) {
			Application.Quit();
		}
	}
```
オフラインリアルタイムどう書く E19 の問題

@Nabetani さんが主催するオフラインでリアルタイムに「どう書く」をやるイベント( https://yhpg.doorkeeper.jp/events/66089 )で問題を出させてもらいました。

問題は「カード当てゲーム」という名前で、詳細は
http://mtsmfm.github.io/2017/11/04/doukaku-e19.html
です。

実装ができた方はこちらのコメント欄からリンクを張っていただくと見つけやすくて助かります。
似たような問題をもっと解きたいという方は、Doorkeeper の コミュニティページ
http://yhpg.doorkeeper.jp/
に @Nabetani さんの過去問リンク集がありますので、そちらをご覧になると良いと思います。
[Reactive Extensions][Reactive Property][C#] 依存するいずれかのプロパティが変更された時に、リアクティブにプロパティを更新する

ちょっとタイトルわかりにくいですが以下のようなケースです。

> A, B, C のいずれかの変数の更新がされたら自動的に X を更新したい。
> 更新された変数以外は最後の値を使用したい。

使用例としては、ツールバーや設定画面で特定機能の有効/無効の切り替えを行った場合に画面の再描画を行なうなどが考えられます。

# どう実現するか

Reactive Property の前提技術である Reactive Extentions には `CombineLatest` というそのままの機能があります。

> ![image.png](https://qiita-image-store.s3.amazonaws.com/0/37721/5fe44d51-527e-28dc-3007-f1c014bfa8e1.png)
>[ReactiveX - CombineLatest operator](http://reactivex.io/documentation/operators/combinelatest.html)

# ReactivePropertyで利用する例

ReactiveProperty で利用する場合には以下のようにします。2つ以上の場合でも問題なく利用できます。

```csharp:ReactiveProperyで利用する例
RxPropA = model.PropA.ToReactiveProperty();
RxPropB = model.PropB.ToReactiveProperty();
RxPropC = model.PropC.ToReactiveProperty();

ReadOnlyRxPropX = RxPropA
    .CombineLatest(RxPropB, RxPropC, (rxPropA, rxPropB, rxPropC) => ConvertToX(rxPropA, rxPropB, rxPropC))
    .ToReadOnlyReactiveProperty();
```

これでA, B, Cのいずれかの状態更新でリアクティブにXを更新することができます。

# 参考
+ [Reactive Extensions再入門 その４１「どんどん合成するよ」 - かずきのBlog@hatena](http://blog.okazuki.jp/entry/20120219/1329663635)
PCF DevをWindowsで使ってみる Part-1

#はじめに
会社でPCFを使うことになっているのですが、まだ現物を見る機会がないので自分で試してみることにしてみました。

[PART-2](https://qiita.com/tworks55/items/e7f84adbad17e12691b5)でサンプルアプリをデプロイしています。

#1. 前提
以下の環境で動作した内容を記述しています。

Windows 10 Home (64bit)
VirtualBox 5.2
cf-cli-installer_6.32.0_winx64
pcfdev-v0.28.0+PCF1.11.0-windows

また、Pivotal Networkの登録(無料)も実施済です。

#2. 環境構築
##2.1 Cloud Foundry Command Line Interfaceをインストール
[こちら](https://cli.run.pivotal.io/stable?release=windows64&source=github-rel)でインストーラーをダウンロードします。zipされている場合は解凍します。

インストールは以下の通りの手順で非常に簡単です。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/131481/1a445dae-d0ca-5816-56f0-b40a2437d167.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/131481/bd39a0c6-e543-9d6a-91fa-8f1deb8e6801.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/131481/be53adbd-aafe-dde5-2dfa-e0685dc42454.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/131481/45f17069-11d1-3314-2329-091f8849cba7.png)

DOS窓を立ち上げ以下のコマンドが動作すればCLIのインストールは成功です。
`> cf`
![image.png](https://qiita-image-store.s3.amazonaws.com/0/131481/2cef3ca2-2f66-651e-f6c8-7d73ab739a49.png)

##2.2 PCF Devをインストール
[こちら](https://network.pivotal.io/products/pcfdev)からwindows版のPCF Devをダウンロードします。
ダウンロードするにはPivotal Networkの登録(無料)が必要です。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/131481/185033e2-7ac4-3154-511e-0f0ef3b4a1e4.png)

ダウンロードしたzipを解凍し、PCF Dev pluginをインストールします。
DOS窓を**管理者**として起動し、以下のようにexeを実行します。
`>pcfdev-v0.28.0+PCF1.11.0-windows.exe`
![image.png](https://qiita-image-store.s3.amazonaws.com/0/131481/84b9ed3b-dd67-1171-e4aa-87ed41c0a7d4.png)

続いて以下のコマンドで、PCF Devを起動します。
`cf dev start`
![image.png](https://qiita-image-store.s3.amazonaws.com/0/131481/b49b145d-3b80-aa22-f1b2-e2a18ddd84f4.png)

ブラウザで[https://apps.local.pcfdev.io](https://apps.local.pcfdev.io)にアクセスし、ユーザーID:admin、パスワード:adminでログインしてみます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/131481/70fd5c00-1f21-5cd6-4b9c-e1db6e29244f.png)


以下の画面が表示できれば無事インストールは完了です。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/131481/5d27a008-77d3-b78f-2f0c-4ffd3a5653a8.png)


Part-1はこれで一旦終了にします。

#注意
インストール直後でDISKは28G程度使用してしまいます。

#参考ページ
[http://docs.pivotal.io/pcf-dev/install-windows.html](http://docs.pivotal.io/pcf-dev/install-windows.html)
知っていると意外と便利♪

知っていると意外と便利♪

1. AIXでtree
```
ls ｰR | grep ":$" | sed ｰe ¥'s/:$//' ｰe 's/[^-][^\/]*\//--/g'  -e 's/^/   /' -e 's/-/|/' | head
```

2. HP-UX
```
ls -R | grep ":" | sed -e 's/://' -e 's/[^-][^\/]*\//--/g' -e 's/^/   /' -e 's/-/|/'
```

3. Linuxでtree
```
pwd;find . | sort | sed '1d;s/^\.//;s/\/\([^/]*\)$/|--\1/;s/\/[^/|]*/| /g'
```

まあ、そんなにtree表示する必要もあまりありませんが。
メールの生データの最初の空行

覚書

```php:最初の空行の位置を返す
$html_buf= file_get_contents("original_msg.txt");
$blank = '/^\r\n$/m';　//CRLF
preg_match($blank, $html_buf, $matches, PREG_OFFSET_CAPTURE);

var_dump($matches);
echo $matches[0][1] + 1;// 初めの空行の次の行を指定
```

```:出力
array (size=1)
  0 =>array (size=2)
      0 => string '' (length=2)
      1 => int 248878
248879
```

メールのMIMEヘッダとマルチパートの境目を探すやり方。ヘッダとパートの間に必ず空行(改行のみの行)が入るので境目を探してやればそこの位置以降はパートだと解る。

自分の記事リンク：[メールの生データ：メーラーの改行](https://qiita.com/next1ka2u/items/348179e9f7233c495d25)
IAMポリシーでElastic IP(EIP)の解放を許可しない

メンテナンスで、EC2インスタンスのElastic IP(EIP)を付け替える場合があります。
古いEC2インスタンスからアドレスの関連付け解除後、新しいEC2インスタンスへアドレスの関連付けする際、「アドレスの関連付け」をメニューから選択するのですが、誤って「アドレスの解放」を選択した事がありました。

![qiita20171104-1.png](https://qiita-image-store.s3.amazonaws.com/0/4962/1edf7990-9dbb-d981-1a1e-870775d10675.png)
「アドレスの関連付け」と「アドレスの解放」のメニューが上下隣り合わせにあるので間違えやすい。

![qiita20171104-2.png](https://qiita-image-store.s3.amazonaws.com/0/4962/9de5bf11-6390-a728-02e8-78b7bcb1ddf1.png)
一応、確認のダイアログは表示されるけど、うっかり「リリース」の青いボタンを押しそうに・・・。
「リリース」ボタンを押す直前で気付きました。
脳が疲れていていると、注意力が低下してミスを犯しやすくなります。

# IAMポリシーを記述する
誤ってEIPを解放すると、対象インスタンスに接続するための設定が随所にある場合、設定変更や関係者への周知が非常に手間です。
そこで、運用が安定したAWSアカウントでは、割り当て済みのEIPを解放する予定が当面無いので、IAMポリシーで解放を許可しないよう設定しました。
同様に、KeyPairやVPCの削除も同様に設定すると良いかもしれません。

```json
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "一意の識別子",
      "Action": [
        "ec2:ReleaseAddress"
      ],
      "Effect": "Deny",
      "Resource": "*"
    }
  ]
}
```

※一意の識別子＝ポリシー内で固有のID. Stmt10000000000001など。

# 検証
ポリシー作成後、ユーザやグループにアタッチして、EIPが解放できない事を検証します。
**※検証用に新規に割り当てたEIPを使用する等、実運用で使用していないEIPで検証してください。**
![qiita20171104-3.png](https://qiita-image-store.s3.amazonaws.com/0/4962/c10b1cb1-ebed-cca2-35fa-67ced0673691.png)
正しくポリシーが適用されていれば、アドレスの解放の確認ダイアログで「リリース」ボタンを押した際にエラーになります。
FaceTrackerをインストールする。 - はまった点(2017.11.04)

以下の場所からFaceTrackerをインストールする際にはまった点をメモする(2017.11.4)。

https://github.com/kylemcdonald/FaceTracker

## 環境　Ubuntu 16.04

## 症状１．makeの際にopencvのライブラリのリンクに失敗する。
対策
Makefile中のOpenCVのインストールされている部分の記載：

```
# Paths
OPENCV_PATH=/usr/local/opencv3
```

自分の環境では
$ ls /usr/local/lib/libopencv* | head -2
/usr/local/lib/libopencv_aruco.so
/usr/local/lib/libopencv_aruco.so.3.2
なので、次のように変更。

```
# Paths
#OPENCV_PATH=/usr/local/opencv3
OPENCV_PATH=/usr/local
```
build できました。

## 症状2. 実行の際に*.so ファイルが見つからなくて終了

```
$ ./face_tracker
./face_tracker: error while loading shared libraries: libopencv_core.so.3.3: cannot open shared object file: No such file or directory
```

自分のそのときのLD_LIBRARY_PATHの状況では、*.soファイルを以下のように見つけられないとなっている。

```
$ ldd ./face_tracker
	linux-vdso.so.1 =>  (0x00007ffea0ca0000)
	libopencv_core.so.3.3 => not found
	libopencv_videoio.so.3.3 => not found
	libopencv_highgui.so.3.3 => not found
	libopencv_imgproc.so.3.3 => not found
	libopencv_objdetect.so.3.3 => not found
	libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f3ea3e45000)
	libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f3ea3b3c000)
	libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f3ea3925000)
	libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f3ea355b000)
	/lib64/ld-linux-x86-64.so.2 (0x000055fa92e6f000)
$ echo $LD_LIBRARY_PATH
```

そこで、~/.bashrcを修正して、LD_LIBRARY_PATHの値に/usr/local/libも含まれるようにして解決した。

----


[ofxFaceTracker 顔のパーツの座標](https://qiita.com/39_isao/items/9dd0af3bdbe77c5f1080)
(保存版: 随時更新) 英語や数学が苦手な方がAI論文輪読するときのノウハウ集

#はじめに

Team AIでは隔週に渋谷で機械学習・深層学習論文輪読会を行なっています。
www.team-ai.com

英語や数学が苦手な方も多数いらっしゃるので、
その様な方に向けた補助ツールやノウハウ集を作り、
論文を読むという文化と裾野をもっと広げたいと思いました。
随時更新していきますので、もっと良い情報やご意見がありましたら是非コメントください。

![IMG_5220.jpg](https://qiita-image-store.s3.amazonaws.com/0/76304/d9ef7ad4-965e-be7b-b290-eb6923264826.jpeg)


#英語が苦手な方へ
ArxivのAbstractの部分だけGoogle Translate for Chromeでワンクリック翻訳
Arxiv Vanityで論文のPDFをWebsite化し、Google Translate for Chromeでワンクリック翻訳
https://chrome.google.com/webstore/detail/google-translate/aapbdbdomjkkjkaonfhkkikfgjllcleb?hl=ja

#論文リサーチに役立つWebサービス

Arxiv.org
https://arxiv.org/

Arxiv Sanity 論文のSNS。Top HypeのセクションではTwitterで流行っている論文がわかる。
http://www.arxiv-sanity.com/

Arxiv Vanity 論文のURLをインプットするとWebSiteにしてくれる
https://www.arxiv-vanity.com

GitXiv 論文のSNS
http://www.gitxiv.com/

ArxivTimes 久保タカヒロさんがやられている論文の紹介サイト
https://t.co/zyNlsCSWSc
https://twitter.com/arxivtimes

Open Review 各学会の合格論文まとめ
https://openreview.net/

How to read a paper 論文の読み方の論文 速読に役立つ
http://blizzard.cs.uwaterloo.ca/keshav/home/Papers/data/07/paper-reading.pdf

Mendeley 研究者がリサーチの生産性向上に使っているツール
https://www.mendeley.com/

PubMed 医療系の論文ならここ 機械学習系もたまにあります
https://www.ncbi.nlm.nih.gov/pubmed/
行列の微分(1)

(概要)
『ゼロから作るDeep Learning』読書会＠高円寺(15)に参加してきた。
https://koenjidl.connpass.com/event/69408/
この書籍で、下記(1)式他の導出が省略されていた。
行列の微分を、スカラ値の微分の感覚で行うと
あいまいな点がのこるので、要素に分解して導出した。

(方針)
行列の微分を、要素に分解して、多変数のスカラ関数の
スカラ値による微分に、置き換えて解く。
導出した式は、少し変形すれば、一般性を失わないので
公式として利用できる。

(求める式)

```math
(1)
\begin{equation*}
\frac{\partial L}{\partial X} =\frac{\partial L}{\partial Y} ・W^{T}
\end{equation*}
```

(変数)

```math
\begin{gather*}
(2)Y=( y_{1} ,y_{2} ,y_{3})\\
(3)X=( x_{1} ,x_{2})\\
(4)W=\begin{pmatrix}
w_{11} & w_{21} & w_{31}\\
w_{12} & w_{22} & w_{32}
\end{pmatrix}
\end{gather*}
```

(前準備)

```math
(5)
\begin{equation*}
XW=\left( x_{1} w_{11} +x_{2} w_{12} ,\ x_{1} w_{21} +x_{2} w_{22} ,\ x_{1} w_{31} +x_{2} w_{32}\right)
\end{equation*}
```

```math
(6)
\begin{equation*}
y_{j} =\sum _{k} x_{k} ・w_{jk} +b_{j}
\end{equation*}
```




(式展開)
Y=XW+Bだが、Bは定数で、微分する場合無視するので(5)(6)から

```math
\begin{equation*}
\frac{\partial y_{j}}{\partial x_{i}} =\frac{\partial }{\partial x_{i}}\sum _{k} x_{k} ・w_{jk} =w_{ji}
\end{equation*}
```

求めるのは(1)のdL/dXだから

```math
\begin{gather*}
\frac{\partial L}{\partial x_{i}} =\sum _{j}\frac{\partial L}{\partial y_{j}} ・\frac{\partial y_{j}}{\partial x_{i}}\\
\ \ \ \ \ \ =\sum _{j}\frac{\partial L}{\partial y_{j}} ・w_{ji}\\
\frac{\partial L}{\partial X} =\begin{pmatrix}
\frac{\partial L}{\partial x_{1}} & \frac{\partial L}{\partial x_{2}}
\end{pmatrix}\\
\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ =\begin{pmatrix}
\sum _{j}\frac{\partial L}{\partial y_{j}} ・w_{j1} & \sum _{j}\frac{\partial L}{\partial y_{j}} ・w_{j2}
\end{pmatrix}\\
\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ =\begin{pmatrix}
\frac{\partial L}{\partial Y} ・\begin{pmatrix}
w_{11}\\
w_{21}\\
w_{31}
\end{pmatrix} & \frac{\partial L}{\partial Y} ・\begin{pmatrix}
w_{12}\\
w_{22}\\
w_{32}
\end{pmatrix}
\end{pmatrix}\\
\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ =\frac{\partial L}{\partial Y} ・\begin{pmatrix}
w_{11} & w_{12}\\
w_{21} & w_{22}\\
w_{31} & w_{32}
\end{pmatrix}\\
\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ =\frac{\partial L}{\partial Y} ・\begin{pmatrix}
w_{11} & w_{21} & w_{31}\\
w_{12} & w_{22} & w_{32}
\end{pmatrix}^{T}\\
=\frac{\partial L}{\partial Y} ・W^{T}
\end{gather*}
```
□

つづき
https://qiita.com/krxross/private/a902d9727d89c0b81443
【Ubuntu Server 16.04 LTS】機械学習用にPCを組んでみた その2（GTX-1080TiドライバとCUDA9.0をインストール）

## GTX-1080Tiドライバをインストール

```bash
$ sudo add-apt-repository ppa:graphics-drivers/ppa
$ sudo apt update
$ sudo apt install nvidia-381
$ nvidia-smi
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 384.90                 Driver Version: 384.90                    |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|===============================+======================+======================|
|   0  GeForce GTX 108...  Off  | 00000000:02:00.0 Off |                  N/A |
|  0%   42C    P5    26W / 275W |      0MiB / 11169MiB |      2%      Default |
+-------------------------------+----------------------+----------------------+

+-----------------------------------------------------------------------------+
| Processes:                                                       GPU Memory |
|  GPU       PID   Type   Process name                             Usage      |
|=============================================================================|
|  No running processes found                                                 |
+-----------------------------------------------------------------------------+
```
上手くいけばGPUの情報が表示されるはずです。

## CUDA9.0をインストール [^1]
[ダウンロードページ](https://developer.nvidia.com/cuda-downloads) ※wgetに指定するURLを調べます
プラットフォームに合わせて選択
例）Linux >> x86_64 >> Ubuntu >> 16.04 >> deb(network)
あとは表示された手順に従います。

```bash
$ wget developer.download.nvidia.com/compute/cuda/repos/ubuntu1604/x86_64/cuda-repo-ubuntu1604_9.0.176-1_amd64.deb
$ sudo dpkg -i cuda-repo-ubuntu1604_9.0.176-1_amd64.deb
$ sudo apt-key adv --fetch-keys http://developer.download.nvidia.com/compute/cuda/repos/ubuntu1604/x86_64/7fa2af80.pub
$ sudo apt-get update
$ sudo apt-get install cuda
```

## cuDNN v7.0をインストール
[ダウンロードページ](https://developer.nvidia.com/cudnn) ※登録が必要です

```bash
$ tar -xzvf cudnn-9.0-linux-x64-v7.tgz
$ sudo cp cuda/lib64/libcudnn* /usr/local/cuda/lib64/
$ sudo cp cuda/include/cudnn.h /usr/local/cuda/include/
$ sudo rm /usr/local/cuda/include/cudnn.h
$ sudo rm /usr/local/cuda/lib64/libcudnn*
```

[^1]: 後々気づきましたがこの後導入するtensorflowにはCUDA9.0が対応していないためエラーになるという情報（[リンク先](https://devtalk.nvidia.com/default/topic/1024550/download-and-install-cuda-8-0-instead-of-cuda-9-0/)）を見ました。が、現状問題ないです。。。（？）
Unityの初期プロジェクトのGit設定(2017年末Ver)

Unityプロジェクトをチームでgit管理する際の初期設定
単純に推奨のgitignore設定入れるだけとかだと、チームメンバーがcloneした時にそのままひらけないのでその対策。

Unityで空のプロジェクトを作成し、ターミナル等でそのプロジェクトにディレクトリに移動した後に以下を実施する。

## .gitignore作成
github推奨のignore設定ファイルから.gitignoreを作成する

```bash
$ curl -o .gitignore https://raw.githubusercontent.com/github/gitignore/master/Unity.gitignore
```

一応現在の状態は以下のような中身

```
$ cat .gitignore
/[Ll]ibrary/
/[Tt]emp/
/[Oo]bj/
/[Bb]uild/
/[Bb]uilds/
/Assets/AssetStoreTools*

# Visual Studio 2015 cache directory
/.vs/

# Autogenerated VS/MD/Consulo solution and project files
ExportedObj/
.consulo/
*.csproj
*.unityproj
*.sln
*.suo
*.tmp
*.user
*.userprefs
*.pidb
*.booproj
*.svd
*.pdb

# Unity3D generated meta files
*.pidb.meta

# Unity3D Generated File On Crash Reports
sysinfo.txt

# Builds
*.apk
*.unitypackage
```

## 空のAssetsディレクトリをコミット内容に含める
チームメンバーが空プロジェクトをcloneする際にAssetsディレクトリが存在しないと、
Unityプロジェクトとして読み込んでくれないので、Assetsディレクトリに.gitkeepを設置

```bash
$ touch Assets/.gitkeep
```

これで、空のUnityプロジェクトをチームメンバーで共有できるので、
リモートリポジトリにプッシュしてcloneしてもらう。

## 環境
<table>
  <tr>
    <th>名前</th>
    <th>バージョン</th>
  </tr>
　<tr>
    <td>MacOS Sieera</td>
    <td>10.12.6</td>
  </tr>
  <tr>
    <td>Unity</td>
    <td>2017.1.1f1 Personal</td>
  </tr>
</table>
PHPを直接実行する（#!/usr/bin/php -q）

## shebang
phpファイルを実行するときは`php`コマンドの後にファイルパスを書きますが、
シェルファイルのように1行目に`#!/usr/bin/php -q`を記入すれば直接実行できます。

```
#!/usr/bin/php -q
<?
...
```
phpの場所が`/usr/bin/`とは限らないので、その場合は`/usr/bin/env`を使うといいらしいです。
[【PHP】shebang](https://qiita.com/kazu56/items/fcd1f78b89ff00c124a2)

## ハマりどころ
- ファイルに実行権限を与えること。

```
chmod +x ...
```

- 改行コードを`LF`にすること。

Windowsで書いていると`CR+LF`になっていたりするので要注意。
[PHP Shebang not working](https://stackoverflow.com/questions/32678852/php-shebang-not-working)
VimGolf 解説: 汎用なマクロ


### VimGolfとは
簡単に言うとショートコーディング、コードゴルフのVim版。実行結果でなく Start, Goal のテキストが与えられて、どれだけ短いキーストローク数で変更できるかを競う。
サイト: https://www.vimgolf.com/

過去の解説など https://qiita.com/tags/VimGolf解説

---

解説する問題はこれです
https://vimgolf.com/challenges/524e1a20b81fe50002000008


```:start
attr_reader :align, :variables, :with
attr_accessor :spaces, :to, :complete, :challenge
# vim: set expandtab:
```

```:goal
attr_reader :align,
            :variables,
            :with
attr_accessor :spaces,
              :to,
              :complete,
              :challenge
# vim: set expandtab:
```

興味ある方は是非、下の解説を見ずに挑戦してみてください。


---
以下解説

---



# 解答(現状最短解)
19 ストローク
```qq/,<CR>a<CR><Tab><Esc>Bjdwq4@qZZ```







# 解説
この19文字に詰まっているテクニックを解説する。

## `qq`
* q{0-9a-zA-Z"}: Record typed characters into register {0-9a-zA-Z"}

2ストローク目にタイプされた "q" のレジスタに記録。次に q が押されるまでにタイプした文字をマクロとして記録するので、
`/,<CR>a<CR><Tab><Esc>Bjdw` この11文字が入る。

## `/,<CR>`
* /{pattern}[/]<CR>       Search forward for the

`,` という文字列を検索、そこまで移動。

## `a<CR><Tab><Esc>`
* a: カーソル後に挿入モード。

`<CR><Tab>` を入力した編集後はこうなる。

```:
attr_reader :align,
               |:variables, :with
attr_accessor :spaces, :to, :complete, :challenge
# vim: set expandtab:# vim: set expandtab:
```


<sup>|はカーソル位置</sup>




## `Bjdw`
* B: [count] words backward.  |exclusive| motion.
* dw: delete word.

手前のWORD(非空白文字)の先頭まで飛びます。→ 下の行に移動。 → 次の文字まで空白削除。


```:
attr_reader :align,
            :variables, :with
attr_accessor :spaces, :to, :complete, :challenge
# vim: set expandtab:# vim: set expandtab:
```

<sup>|はカーソル位置</sup>


## `4@q`
* `@{0-9a-z".=*+}`: Execute the contents of register {0-9a-z".=*+}
 [count] times

qに登録したマクロを 4回実行する。

ここで**全て連続してマクロを呼び出せるようになっている**ところがポイント :+1:。

* `,` までの移動 `/,<CR>`
    * `f,` だと2行目の編集がうまくいかない。
* インデント整形 `<Tab>Bjdw`
    * スペース4つ挿入 だと2行目のインデントが崩れる。
    

## `ZZ`
保存して終了。


## 終わり
VimGolf は小さなテクニックの発見が多くてよいです。一時的なテキスト一括編集もよく行うので僕はマクロを重宝してます。
諸事情あって大きな容量のgitリポジトリを扱う必要が出た時の選択肢

# 概要
リポジトリサイズがリソースファイル含めて5GBを越える+人数は10人くらいのプロジェクトを想定しています。自宅サーバを立てて頑張る、とかが一番値段は安いですが、さすがに管理するのつらいです。
一般的なGithubとかBitbucketだと、後述する1リポジトリあたりのサイズ制限があるため、リソースが増えてきたタイミングで楽しくないメンテナンスをすることになるのが難点です。

まあ、言ってしまえばゲーム開発とかのプロジェクトや実験データが大容量なプロジェクトなどが当てはまります…

# 先に結論
## メンバー5人以下
Visual Studio Team Servicesが容量無制限でプライベートリポジトリ作り放題。
https://azure.microsoft.com/ja-jp/pricing/details/visual-studio-team-services/
http://kkamegawa.hatenablog.jp/entry/2016/12/06/000000

料金は5人なら無料です。少人数にとってはめちゃくちゃお得なんですが、6人から1人増えるごとに600円とかなので、10人だと月3000円、20人だと月9000円になります…人数増えると露骨に結構高い…

## メンバー10人以上
さくらのVPS HDDプランで契約してGitlabスタートアップスクリプト
https://vps.sakura.ad.jp/specification/

月1000円で100GB HDD
月1800円で200GB HDD

が借りられてGitlabのスタートアップスクリプトが標準で付いている(2017/8/29-)ので、出来るだけ頭を使わずに、そこそこのお金で運用できそう。
https://vps-news.sakura.ad.jp/2017/08/29/startup-gitlab/

# 検討したが、使わなかったサービス
## Github
一応ムチャ出来そうな感じはあるけど1リポジトリあたり1GB以下を"推奨"されてます。
https://help.github.com/articles/what-is-my-disk-quota/

```
File and repository size limitations
We recommend repositories be kept under 1GB each. 
```

## Bitbucket
1リポジトリサイズあたり2GBで制限が掛かります。

https://confluence.atlassian.com/bitbucket/what-kind-of-limits-do-you-have-on-repository-file-upload-size-273877699.html

## Amazon Code Commit
https://aws.amazon.com/jp/codecommit/faqs/
```
Q: CodeCommit に保存できる各ファイルの最大サイズはどのくらいですか?
リポジトリの各ファイルが 2 GB を超えることはできません。
```
→リポジトリ自体のサイズは50GBまで大丈夫で、単一ファイルが2GBを超えられない、ということな気がする。十分選択肢に入りそうです

## さくらのレンタルサーバ
容量200GBで月1500円と結構安いけど、Gitのインストールから始めるのつらいしGitlabとかインストール出来なさそう…
https://www.sakura.ne.jp/
さくらVPSから携帯キャリアにメール送信する（CentOS,Postfix）

携帯キャリア(*@docomo.ne.jp)で受信できるよう
ドメインを取得してメール送信できる環境を整えます。

インターネット上の記事を読むと、auがもっとも厳しい制約を掛けているとのことですが、自分はdocomo/softbankしか保持していないため、今回は2社で試してみます。

**参考）キャリアの情報**
https://www.nttdocomo.co.jp/service/imode_mail/notice/sender_id/
https://www.au.com/mobile/service/mail/attention/spf-record/

**実施すること**
・ドメインを取得してA、MX、TXT(spf)レコードを登録する
・gmail、docomo、softbankのキャリアメールアドレスでメールを受信する


*本Postfixの設定は、ほぼデフォルトであるためインターネット上に構築・公開する際にはリレー・送信元を自分自信のみに制御するなど注意と対策をお願いいたします。*

**環境**

```bash
$ rpm -qa | grep postfix
postfix-2.10.1-6.el7.x86_64

$ alternatives --display mta
mta - status is auto.
 link currently points to /usr/sbin/sendmail.postfix
/usr/sbin/sendmail.postfix - priority 30
 slave mta-mailq: /usr/bin/mailq.postfix
 slave mta-newaliases: /usr/bin/newaliases.postfix
 slave mta-pam: /etc/pam.d/smtp.postfix
 slave mta-rmail: /usr/bin/rmail.postfix
 slave mta-sendmail: /usr/lib/sendmail.postfix
 slave mta-mailqman: /usr/share/man/man1/mailq.postfix.1.gz
 slave mta-newaliasesman: /usr/share/man/man1/newaliases.postfix.1.gz
 slave mta-sendmailman: /usr/share/man/man1/sendmail.postfix.1.gz
 slave mta-aliasesman: /usr/share/man/man5/aliases.postfix.5.gz
Current `best' version is /usr/sbin/sendmail.postfix.
```

**DNS**

```
$ dig <domain>
;; ANSWER SECTION:
<domain>. 3600 IN A <ip>

$ dig <domain> txt 
;; ANSWER SECTION:
<domain>. 1262 IN TXT "v=spf1 +ip4:<ip> include:mail.<domain> -all"
```
**メール送信**

```bash
$ mail kai.kusakari@gmail.com
Subject:test
gmail
.
$ mail *@docomo.ne.jp
Subject:test
docomo
.
$ mail *@i.softbank.jp
Subject:test
soft
.
```

gmail、softbankにはメールが届きましたがdocomoだけメールが帰ってきました。少し情報を見ると、docomoは多くの場合メールの受信が制限されているそうです。以下の手順で制御を解除することで受信することができました。
https://dekiru.net/article/14776/

上記docomoのように、docomoのキャリアメールに対してPCのメールを受信する設定を入れている人は極めてまれだと思うので、docomoのドメインからgmailなどにメールが来たとしても別手段（電話など）で返信すべきですね。
C++で12桁のチェックデジット計算を書いてみた

#はじめに
ちょっと色々あって12桁の数字にチェックデジットを付与することになった。
その時に書いたコードの覚書。


#チェックデジット計算方法
チェックデジットの計算方法としてはモジュラス10 ウェイト2・1分割(Luhn formula)を使用。

こちらの記事を参考にさせていただいた。
https://qiita.com/yoshi389111/items/00ca7b3ed9ceac904cde


#実際のコード
で、書いたコードはこちら
https://wandbox.org/permlink/eSXajf2vfO8UvJMp


#以下、コードの解説

12桁の数字の数が何件あるか不明だったので `std::vector<std::string>` で動的配列を確保。

```

//番号格納配列
std::vector<std::string> Num;

```

次に、確保した動的配列 `Num` に12桁の数字データを格納する関数 `NumberRead` を書いた。

```

//番号読み取り関数
//NumberRead
void NumberRead(){
    
    //カード番号を配列に格納
    for(std::string num; std::getline(std::cin, num); )
        Num.emplace_back(std::move(num));
}

```

`for` で回しておいて `std::getline(std::cin, num)` で入力されたデータを確保。
その後、 `Num.emplace_back(std::move(num))` で配列に格納していく。


で、チェックデジットを計算して、元々の12桁と一緒に出力する関数 `NumberWrite` を書いた。
この辺は、ちょろっと書くのに手間がかかったかな……？

```

//チェックデジット書き込み関数
//NumberWrite
void NumberWrite(){

    //格納されている番号分だけループ
    for(auto&& d : Num){

        //番号を一時的に格納する変数
        int digit[12];

        //チェックデジット計算変数
        int temp = 0;

        //番号を一桁ずつ格納
        for(int i = 0; i < 12; i++)
            digit[i] = static_cast<int>(d[i]) - 48;

        //桁数分、チェックデジット用の計算を行う
        for(int j = 0; j < 12; j++){
            if((j + 1) % 2 == 0){
                if((digit[j] * 2) > 9)
                    temp += (((digit[j] * 2) % 10) + 1);
                else
                    temp += (digit[j] * 2);         
            } else
                temp += digit[j];
        }
        int t = (10 - (temp % 10));
        //番号とチェックデジットを表示
        std::cout << d << ((t == 10)? 0 : t) << std::endl;
    }
}

```

for(auto&& d : Num) はC++11で追加された範囲for文（The range-based for statement）というものになる。
これを使って Num に格納されたデータを一つずつ d に渡していく。
ちなみに、この範囲for文（The range-based for statement）は C++ でコンテナを使ったループを書くときに重宝するので、覚えておいて損はないね。

詳しい解説はこちらを参照されたし
https://cpprefjp.github.io/lang/cpp11/range_based_for.html


```

//番号を一桁ずつ格納
for(int i = 0; i < 12; i++)
     digit[i] = static_cast<int>(d[i]) - 48;

```

`for` を使って一文字ずつ `digit` に格納。
そいで、格納したデータの型は文字列なので `static_cast<int>` で `int` 型に変換。
`int` に変換すると `51` などの数値になるため、 `-48` ですり合わせてる。


```

//桁数分、チェックデジット用の計算を行う
        for(int j = 0; j < 12; j++){
    if((j + 1) % 2 == 0){
       if((digit[j] * 2) > 9)
           temp += (((digit[j] * 2) % 10) + 1);
       else
             temp += (digit[j] * 2);         
    } else
                temp += digit[j];
}
int t = (10 - (temp % 10));
//番号とチェックデジットを表示
std::cout << d << ((t == 10)? 0 : t) << std::endl;

```

あとは、上記のコードでチェックデジットの計算を行って画面に出力するだけ

#おわりに
今回は標準入力＆標準出力を使ったけど、std::fstream を使えばCSV形式のファイルなんかでも処理ができると思う。
なので、業務なんかでチェックデジットの計算するって時には便利かもね。

#参考記事

https://qiita.com/yoshi389111/items/00ca7b3ed9ceac904cde

https://cpprefjp.github.io/lang/cpp11/range_based_for.html
プランニングポーカー と ベロシティ で 他社との開発速度比較

「自社の開発速度は他社と比較してどうなのか？早いの？遅いの？」という話をたまに聞きます。
比べたら負け、というのもよく聞く話。ですが、上位職の人や、経営陣から聞かれたとすると、「できません」「分かりません」とか「比べたら負けです」と言うのはそれはそれで難しい。
たとえ一度は言えたとしても、何度も言い続けるのは至難の技。

[アジャイルな見積もりと計画作り](http://amzn.to/2gCofmE) に紹介されていたプランニングポーカーとベロシティを組み合わせれば
「ひょっとしたら比較できるかも？」と思い試したところ、（良いか悪いかは別の議論として）比較できたのでここに紹介。

<a target="_blank"  href="https://www.amazon.co.jp/gp/product/4839924023/ref=as_li_tl?ie=UTF8&camp=247&creative=1211&creativeASIN=4839924023&linkCode=as2&tag=yhoriuc1-22&linkId=8b0219b70bd5ef3556e64f80e5302468"><img border="0" src="//ws-fe.amazon-adsystem.com/widgets/q?_encoding=UTF8&MarketPlace=JP&ASIN=4839924023&ServiceVersion=20070822&ID=AsinImage&WS=1&Format=_SL250_&tag=yhoriuc1-22" ></a><img src="//ir-jp.amazon-adsystem.com/e/ir?t=yhoriuc1-22&l=am2&o=9&a=4839924023" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />

プランニングポーカーは簡単に言うと、見積もり対象となるストーリー（or フィーチャー）を**何人かで相対的に見積もり**を出す、ということ。群衆の知識とでもいうべきか、皆んなでやれば意外と当たる、ということだと思う。
ベロシティは、ある特定のチームが固定された期間に完了させることのできる合計ポイントのこと。

詳細な説明は上述の書籍や他の方の説明に任せて、本題のやり方を説明します。

## 速度比較手順

### 前準備
1. 比較したい他社の製品を選択。
2. 他者製品のニュースリリースやリリースノートのようなものから、リリース日と機能を一覧にまとめる。（以降、機能一覧）  
   また、リリース日とリリース日の間を「他社の開発期間」と定義する。

つまり、比較したい他社製品の機能のうち、特定の期間にリリースされた機能を元に比較する前提で考える。

### 比較手順
3. 機能一覧の項目一つずつをフィボナッチ数列（0,1,2,3,5,8,13,20,40,100）を使って、相対的にポイントで見積もる。
   * 見積もりは複数人で実施する。
   * 見積もりを行うメンバーに「自社製品に詳しくて、他者の比較対象製品のこともよく調べている」人が何人かいた方が心強い。
   * 見積もる際に、あまり時間をかけすぎない方が良い。意見が割れたり迷う場合、もっともらしいことを言った人に賛同できるかどうかで決めれば良い。
     どうしても合わない場合、平均値に近いポイントを取れば良い。
4. 見積もった機能一覧から「工数で見積もる対象」をランダムに選定する。
   * この時、大・中・小のポイントがほどよく混ざった状態で選んだ方が良い。見積もりやすいという理由で選ばない方が良い。
   * もし40や100が含まれている場合、それは特大なので見積もり不可と判断して工数見積もりの対象外にすると良い。
5. 「工数で見積もる対象」を実際に工数で見積もる。
   * 設計、実装、テストなどを実施する想定し、「工数」（人月単位）で見積もる。
   * 工数見積もりは、あくまでも「自社の開発チームが自社製品に組み込んだ場合」を想定して見積もる。  
   * ここでは前提条件などの認識を参加者でしっかりと合わせておく必要がある。認識が揃わないと、出した結果に納得感が持てない。
6. 自社の開発チームが1ヶ月で「利用可能な開発時間」を算出する。
   * 例えば、1チームが1ヶ月で開発に割ける時間は合計500時間（＝約3.1人月）みたいな感じ。
7. 工数で見積もった機能から、上記の「利用可能な開発時間」に近くなるまで選択する。
   * 上記例の場合、合計が3.1人月にできるだけ近くなるように選ぶ。(3.1人月は超えないようにする。)
8. 上記で選んだ機能のポイント数を合計し、1ヶ月のベロシティと定義する。
   * つまり、ここでの合計ポイントがチームで1ヶ月に消化できるポイント数ということになり、1ヶ月の開発速度を表すことができる。
9. 機能一覧の全ポイントを合計し、上記のベロシティで割ることで、機能一覧の全機能を開発するのに何ヶ月かかるかが算出できる。  
  「他社の開発期間」の合計と比較すれば「早い」「遅い」が比較できる。

## 最後に
改めて伝えておくと、このやり方で出した見積もりやベロシティは正確ではないし、当たっているかどうかなんて誰にもわからない。  
むしろ外れている可能性の方が圧倒的に高い。  
重要なのは見積もる際の議論や、あまり時間をかけず、タイムボックスの概念を取り入れて答えを出すことなんじゃないかと思う。
あとは、出した答えが「なんとなく早いかも」「なんとなく遅いかも」という感覚や気分だけで答えるのではなく、ある一定の根拠で説明できるようになるので、この方法自体はそんなに悪くないと感じてる。
ここで出した数字を使うなら、どのように算出したかの方法も一緒に提示し、「当たっていない」ということを前提に、作業中に行う議論の内容も踏まえて客観的に自社の開発速度を考えてみることが良いと思う。間違っても、数字や答えだけが独り歩きしないように注意したい。
エックスサーバー（Xserver）でMovable Typeの公開予約を利用すると大量のエラーが出る問題の対処

エックスサーバー（Xserver）の比較的新しいサーバーで、Movable Type6の「公開キュー」を利用して記事の公開予約をすると、チェック用のメールアドレスに、以下のようなエラーが大量に送信されることがあります。

公開処理自体は正しく行われているようです。

```
Use of uninitialized value in numeric gt (>) at /home/path/to/mt/tools/../lib/MT/Template/Tags/Asset.pm line 1179.
```

```
libpng warning: Interlace handling should be turned on when using png_read_image
```

それぞれに対する対応についてまとめます。

## Use of uninitialized value in numeric... について

Perlの文法チェックが厳格になったことによるエラーです。数値比較を行う場合、必ず初期値を指定する必要があるようです。

予約投稿時にPerlの文法エラーが表示される - MTQ | Movable Type ユーザーコミュニティ
http://communities.movabletype.jp/2017/11/perl-2.html

Movable Typeコアの、以下のファイルをテキストエディタで開き
/lib/MT/Template/Tags/Asset.pm
の、1177行目付近にある、以下のコードを探してください。

```Perl:mt6_Asset.pm
    if ( !$args->{force} ) {
        delete $arg{Width}  if $arg{Width} > $a->image_width;
        delete $arg{Height} if $arg{Height} > $a->image_height;
    }
```

これをコメントアウトして、以下の通り修正してください。


```Perl:mt6_Asset_editted.pm
#    if ( !$args->{force} ) {
#        delete $arg{Width}  if $arg{Width} > $a->image_width;
#        delete $arg{Height} if $arg{Height} > $a->image_height;
#    }

    if ( !$args->{force} ) {
        delete $arg{Width}  if (defined($arg{Width}) && $arg{Width} > $a->image_width);
        delete $arg{Height} if (defined($arg{Height}) && $arg{Height} > $a->image_height);
    }
```

## libpng warning: Interlace handling... について

Movable Typeの画像ライブラリをGDに変更していると発生するようです。

下記の記事の通り、ライブラリをGD以外に変更すると発生しなくなりますが…

エックスサーバー（Xserver）でMovable Typeに画像をアップロードできない場合の対処
https://qiita.com/webbingstudio@github/items/c374a4856411f48d7a2c

いくつかのプラグインで大量の文法エラーが出るようになってしまいます。
私の環境では、以下でエラーを確認しています。

- GetQueryParam（MailFormの関連プラグイン）
- PageBute

```
Argument "" isn't numeric in numeric eq (==) at /path/to/mt/plugins/GetQueryParam/GetQueryParam.pl line 213.
Use of uninitialized value $value_str[0] in numeric eq (==) at /path/to/mt/plugins/GetQueryParam/GetQueryParam.pl line 213.
Use of uninitialized value $value_str[1] in string eq at /path/to/mt/plugins/GetQueryParam/GetQueryParam.pl line 213.
Argument "" isn't numeric in numeric eq (==) at /path/to/mt/plugins/GetQueryParam/GetQueryParam.pl line 213.
Argument "\x{4ed5}\x{4e8b}..." isn't numeric in numeric eq (==) at /path/to/mt/plugins/GetQueryParam/GetQueryParam.pl line 213.

・・・

Use of uninitialized value in join or string at /path/to/mt/plugins/GetQueryParam/GetQueryParam.pl line 260.
Use of uninitialized value in numeric eq (==) at /path/to/mt/plugins/MailForm/MailForm.pl line 366.
・・・

Use of uninitialized value in concatenation (.) or string at /path/to/mt/plugins/PageBute.pl line 500.
Use of uninitialized value in concatenation (.) or string at /path/to/mt/plugins/PageBute.pl line 506.
Use of uninitialized value $delim in concatenation (.) or string at /path/to/mt/plugins/PageBute.pl line 499.
Use of uninitialized value in concatenation (.) or string at /path/to/mt/plugins/PageBute.pl line 500.
Use of uninitialized value in concatenation (.) or string at /path/to/mt/plugins/PageBute.pl line 506.
・・・
```

## 結論

ライブラリをGD以外にする対応は難しいため、「Use of uninitialized value in numeric...」エラーだけを修正し、Cronのメール通知を停止するしか、現状は回避策がないようです。
IBM Cloudに登録してみる(2017/11現在)

# やること

IBM Cloudに登録してみるだけです。

https://console.bluemix.net/registration/

<img width="1274" alt="Screen Shot 2017-11-04 at 13.08.54.png" src="https://qiita-image-store.s3.amazonaws.com/0/25582/0055ad97-c5c9-7926-53dd-02c78f1e2fbe.png">



# 必要事項

+ Email(*)
+ First Name(*)
+ Last Name(*)
+ Company
+ Country or Region(*)
+ Phone Number(*)
+ Password(*)

(*) 必須事項

上記を記入してアカウントを作ると、登録したEmailに確認メールが届き来ます。
![Picture-1.png](https://qiita-image-store.s3.amazonaws.com/0/25582/e00c920c-0082-a813-a67c-cbcbfefcdd01.png)


確認メールをクリックすると、アカウント登録が完了します。

<img width="327" alt="Screen Shot 2017-11-04 at 13.27.50.png" src="https://qiita-image-store.s3.amazonaws.com/0/25582/ae649078-46de-fd92-a87d-2750a9eae896.png">


次回移行は、Emailと登録パスワードでログイン出来ます。

[Sign in to IBM](https://idaas.iam.ibm.com/idaas/mtfim/sps/authsvc?PolicyId=urn:ibm:security:authentication:asf:basicldapuser)

<img width="485" alt="Screen Shot 2017-11-04 at 13.33.38.png" src="https://qiita-image-store.s3.amazonaws.com/0/25582/76f2b7f0-da54-ad7d-01e0-b4712a06fc4a.png">


<img width="633" alt="Screen Shot 2017-11-04 at 13.30.45.png" src="https://qiita-image-store.s3.amazonaws.com/0/25582/db7d6752-22bd-9ae2-355d-c5ecf9c886ef.png">

# 所感

今回はここまでです。
クレジットカードの登録が無いのでアカウント作成自体は躊躇なく作れると思います。
いつ登録するのかな？？


ちなみにIBMはよく変わるので半年後に参考になるかは謎です(；・∀・)
【小ネタ】Ruby の Struct の new を少し便利に。

```ruby
Person = Struct.new(:name, :age, :height, :weight, :blood, :eye)
```

などとしたときに、`Person.new` の引数の順序を思い出すのが大変ってことありませんか。そんな時に、

```ruby
Person = Struct.new(:name, :age, :height, :weight, :blood, :eye) do
  def initialize(name: nil, age: nil, height: nil, weight: nil, blood: nil, eye: nil)
    super(name, age, height, weight, blood, eye)
  end
end
```

としておくと、keyword 引数で設定できます。

```ruby
taro = Person.new(name: "Taro", blood: :A, eye: :black, height: 174)
=> #<struct Person name="Taro", age=nil, height=174, weight=nil, blood=:A, eye=:black>
```

という感じになります。

-----------
(追記)
より大胆に。

```ruby

class Struct
  alias _init initialize
  def initialize(*args)
    if instance_of?(Struct)
      _init(*args)
    else
      keywords = Hash[*args]
      members = members()
      keywords.each_key do |key|
        raise "illeagal key: #{key}" unless members.include?(key)
      end
      _init(*members.map(&keywords))
    end
  end
end
```

これで、いついかなる時でも、keyword 引数でしか使えなくなります。
tensorflowでfizzbuzz

#概要
tensorflowでfizzbuzzやってみた。

#サンプルコード

```
import tensorflow as tf

l = 100
r = tf.Variable([str(i) for i in range(1, l + 1)], dtype = tf.string) 

def cond(i, _):
	return (tf.less(i, l + 1))

def body(i, _):
	e = tf.cond(tf.equal(tf.mod(i, 15), 0), lambda: tf.assign(r[i - 1], 'FizzBuzz'),
		lambda: tf.cond(tf.equal(tf.mod(i, 3), 0), lambda: tf.assign(r[i - 1], 'Fizz'),
			lambda: tf.cond(tf.equal(tf.mod(i, 5), 0), lambda: tf.assign(r[i - 1], 'Buzz'), lambda: r)))
	return (tf.add(i, 1), e)

_, g = tf.while_loop(cond, body, [1, r])

sess = tf.InteractiveSession()
tf.global_variables_initializer().run()
print (g.eval())

```

以上。
プログラミング勉強中の人間がサイコロ触れるチャットツールを作りたい話【２日目】

[初回](https://qiita.com/tukiuta/items/6da261726c74285a9c9d)：自己紹介とチャットアプリの仕様
[前回](https://qiita.com/tukiuta/items/8ba36b346ae7b3cc6edb)：Vagrantの設定からkotlinインストール

前回まででkotlinのセットアップが終わったので、
今回は簡単な関数の練習から６面サイコロ二つをふり、二つの値と合計値を表示する関数を作ってみようと思います。

##今回の目標
・var、valの違い
・import　の使い方

##Hello,Worldを書き換えて簡単な式を書いてみよう
前回書いた、元となるプログラムがこちら

```Hello.kt
fun main(ages: Array<string>){
  printIn("Hello,world")
}

```

今回は、これをコピーしてtest.ktとしてプログラムを書いてみようと思う。

###var,valの違い
kotlinでは数を宣言するときに２種類の宣言のやり方があります。

```
var x=1　　//宣言した後でも値が変更できる　
   x=x*1 //値は１

val y=1
　　　　　y=y*1 //エラーを吐く
 
```
関数内で値を変更する可能性がある場合はvarをしない場合はvalを使うといいですね。

###import　とランダムな数を生成する

```test.kt
import java.util.Random
val random = Random()
fun main(args:Array<String>){
var x =Raundom.nextInt(6)
printIn("結果：$x")
}
```

このように出力すると０〜5の範囲で出力されるようです・・・
なので、xに＋１をして1~6の範囲にしてしまいます。これでしっかりと1d6が振れるようになったので、
下に変数yとしてコピペして完成させましょう。

```test.kt
var x =Raundom.nextInt(6)
x=x+1
var y =Raundom.nextInt(6)
y=y+1
printIn("結果:[$x,$y]=${x+y}")

```

このように１を足せば１から6の数までのものが作れます。もっと効率のいい方法がある気がするので探しています。
変数名を使う時は、````＄変数````と使うことで変数として認識してくれるようです。````$｛変数＋変数｝````という形はその場で式にして結果を出力する（ｘ，ｙは変化しない）ので１回しか使わない出力などにおすすめです。

##参考
[Random（Java Platform SE8）](https://docs.oracle.com/javase/jp/8/docs/api/java/util/Random.html)
###次回の目標
・「○○さんこんにちは」と出力するアプリケーションを作る。
・nDn（ex:1d100,3d10...)を出力する関数を作る。
[Google Chrome] SSL証明書の確認方法と表示リンクを有効化

毎回しらべているのでやり方をメモ。これ有効にしていろんなサイトで証明書の内容確認するのは結構面白いです。

# 検証環境
※最新だと変更されている可能性があります
Google Chrome 61.0.3163.100（Official Build） （64 ビット）

# 手順
簡単に表示できるリンクがデフォルトで無効になってるので有効化します。

## 以下のアドレスを入力
```
chrome://flags/#show-cert-link
```

## show-cert-link を有効化

![image.png](https://qiita-image-store.s3.amazonaws.com/0/37721/4b53c8e3-8747-7b38-47ba-9608e493fde8.png)

## "証明書" が選択できるようになったので、"有効" のリンクを選択
![image.png](https://qiita-image-store.s3.amazonaws.com/0/37721/28831ad7-a00e-c4ee-ecaf-41ad22a6b306.png)

## "証明書" ウィンドウが出るので内容を確認

![image.png](https://qiita-image-store.s3.amazonaws.com/0/37721/fdd711c6-18d2-7606-fc0f-d0eb56348dcf.png)

Qiitaの証明書発行元はAmazonになるんですね。
2.23.140.1.2.1 は検索してみると、GeoTrustが出てきます。

# 参考
[Google Chrome 60ではSSL証明書の確認が容易に | スラド セキュリティ](https://security.srad.jp/story/17/08/02/0512200/)