OmniAICreator/Qiita-1.07M huggingface dataset:
Gitのメッセージフックでブランチに対応するJIRAのチケットタイトルを自動入力する

## 必要なもの

* [go-jira](https://github.com/Netflix-Skunkworks/go-jira)

### プロジェクトにインストール

* [husky](https://github.com/typicode/husky) - `devDependencies` にインストールしましょう。

## 最初にやること

当たり前ですが、JIRAにログインしておきます。

```shell-session
$ jira login
```

## フックファイルを作成

プロジェクトの任意の場所に `prepare-commig-msg` を作成します。場所やファイル名は何でもいいですが、**実行時の作業ディレクトリは `package.json` があるディレクトリになります。**

```
(git root)
 └── app
     └── package.json
```

今回はこのように、レポジトリのルートディレクトリが `package.json` でなく、ブランチ名が `category/ticket-(チケット番号)` のように命名されていると仮定します。

```sh:prepare-commit-msg
#!/bin/sh

# husky の作業ディレクトリに注意してください。
# COMMIT_EDITMSG はレポジトリのルートディレクトリが作業ディレクトリである場合を想定しているので、今回は少しいじります。
COMMIT_EDITMSG="../${1}"
TYPE="$2"

[ -n "$TYPE" ] && exit

# .git ディレクトリが作業ディレクトリに存在しないのでオプションで指定します。
ticket_ref="$(git --git-dir=../.git symbolic-ref HEAD | grep -Poe '(?<=/)ticket-\d+$')"
[ -z "$ticket_ref" ] && exit

ticket_summary=''
# jira が PATH に含まれている場合
if command -v jira 1>/dev/null
then
  # go-jira の標準出力からサマリーを抜き出しています。JQLなどでもっと賢くできるかもしれない。
  ticket_summary="$(jira view "$ticket_ref" 2>/dev/null | grep -Poe '(?<=summary: ).*$')"
fi

sed -i "1i${ticket_ref} ${ticket_summary}\n" "$COMMIT_EDITMSG"
```

## フックの設定

`package.json` にスクリプトを追加します。フックファイルへのパスは適宜読み替えてください。

```json
{
  "scripts": {
    "preparecommitmsg": "path/to/prepare-commit-msg ${GIT_PARAMS}"
  }
}
```

## 使ってみる

```shell-session
$ git commit
```

コミットメッセージの入力がこのようにタイトル付きで始まります。

```
ticket-01234 チケットのタイトルゴニョゴニョ


# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
# ...
```

## 困ったこと

* Node経由なので、フックの起動自体が非常に遅い。JIRAのチケット情報の取得も遅い。しかし自分でブラウザを開いてコピペするよりマシ。
* コミットしたくない場合には通常はコミットメッセージを編集せずに閉じるのだが、メッセージが空ではないため、そのまま閉じるとコミットされてしまう。(キャンセルが面倒くさい)
Cisco Routerにおける、OSPF設定の手順

![cap.PNG](https://qiita-image-store.s3.amazonaws.com/0/124948/e358e9d6-26bc-5a0d-f9ed-91e60a78a67c.png)
こんな感じのネットワークを想定します。
Cisco Packet tracerにて作成。
前提として
○routerの各interfaceはip address 割り当て済み
○routerの各interfaceにno shutdownコマンド入力済み
○各ホストにはdhcpでip addressを割り当て済み。default gatewayも割り当て済み

この状態から、OSPFを用いてroutingを行う場合は、各routerに以下のコマンドを入力します。

```
>enable
#conf t
(config)#router ospf 1
//ospfプロセスを有効化するコマンド。1はprocess-idであり、一つのrouter上で複数のOSPFプロセスを実行する際に使用されます。

(config-router)#network 192.168.1.0 0.0.0.255 area 1
//ospfを有効にするinterfaceをネットワークアドレスによって指定するコマンド。0.0.0.255はワイルドカードマスクです。area 1 はospfのarea指定。
```

以上のコマンドをそれぞれのrouterに打ち込めば、OSPFでのroutingができて、host同士の通信が行えるはずです。
正規表現オブジェクト&Regexpの意味がわからなかったけどなんとなくわかった

例えば

   Regexp.new("abc")

こいつの後ろのかっこ内にぶち込まれた輩は正規表現にされる。
すなわち「("abc")」は

/abc/

となるのじゃあああああああああああああああああああああああ(あってるか微妙だが多分こういうこと)！！！！！！！！！！！！！！！！！！
【学習メモ】 macからwindowsへリモートデスクトップしてバックスラッシュを正しく入力する

#結論
- 英字キーボードとして使う。
- 英字キーボードの配列を覚える。
- リモートしたWindows上で英字キーボードを使ったIMEの切り替え方法を覚える。

#環境
```bash:
MacBookAir(10.13.2,日本語キーボード)+Microsoft Remote Desktop Beta (8.2.40)、クラムシェルモード。
外付け日本語用109キーボード
リモート先:Windows10Pro(1708)
```

#はじめに
WindowsのPoderosa4を使うのに、Macからリモートしていました。
Windows上のエディタでシェルスクリプトやコマンドを書き出していると、バックスラッシュを書く機会があります。
しかしながら、バックスラッシュがUnicodeの円で入力されてしまい、エディタでバックスラッシュ(円マーク)が入力されているように見えても、Unicodeの円マークが入力されてしまいます。

```bash:エラーの例
$ sleep ¥
sleep: invalid time interval `\302\245'
Try `sleep --help' for more information.
```
- 実際に¥は見えません。8進数の302と245＝16進のC2A5。

|見た目|内容|
|:--:|:--:|
|\|0x5c|
|¥|0xC2A5|

Macでは、日本語入力時にバックスラッシュの入力を円```¥```にするか```\```にするか設定できますが、リモートデスクトップで接続すると、設定にかかわらずBackspace横のキーは円になっているようです。

#手順
##1.Mac側を整える
日本語キーボードを英語キーボードとして認識させます。
環境設定→keyboard→Change keyboard type→
そのまま画面通りの作業をして、ANSI (United States and others)を選択します。

##2.Windows側を整える
リモートデスクトップで接続したとき、英字キーボードとして動作するようにします。
Microsoft Remote Desktop Betaでアクセスしたら、レジストリを確認します。
```
コンピューター\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\KeyboardType Mapping\JPN
```

DWORD 00000000のデータが英字キーボード```kbd101.dll```であることを確認します。他の値になっているときは、kbd101.dllへ変更し、再起動します。（サインオフでもかまいません）
上記だけで変更されないときは、DWORD 00010002も```kbd101.dll```へ変更します。


参考資料
WindowsマシンにつないだUSBキーボードは、レジストリの別キーを変更することでレイアウトを変更できるようです。こちらをリモートの場合の修正先としている記事も見かけました。
[コンピューターに USB キーボードを接続したときに Windows で正しいキーボード レイアウトが使用されないことがある(microsoft.com)](https://support.microsoft.com/ja-jp/help/927824/windows-may-not-use-the-correct-keyboard-layout-when-you-connect-a-usb)

##3.アクセスする
Mac側の入力は、International等を追加する必要はなく、ひらがなのままでかまいません。
サインインすると、IMEが日本語のみのときと、日本語＋英語(ENG)の2パターンがあります。
サインオフ状態からサインインするとき、コンソールではなくリモートでアクセスする必要があります。

##4.ショートカットを確認して覚える
メモなどで以下の入力ができるか確認します。
必ず外付けのキーボードで確認します。
キー配列はWindowsキーボードを使っているものとします。

MacとWindowsでの操作(英字キーボードとしての動作確認)

|内容|Macの正しい結果|Windowsの結果|
|:--:|:--:|:--:|
|MacのInputsourceの切り替え|Alt+Space *1| - |
|WindowsのIMEの切り替え| - |Alt+Shift+Space *2|
|Windowsの直接入力とひらがな切り替え| - |Win+半角/全角 *3|
|}」]む の刻印されたキー|\|\ *4|
- リモートデスクトップを利用すると、キーボードのWinキーとAltが逆になります。(Winキーがオプション、Altキーが⌘になるため)
- *1 基本的に1回ずつしか入力しないので、HiraganaとRomajiを行き来します。
- *2 IMEが日本語と英語の2つ表示されているときに使います。Shiftを除いて操作すると、Mac側のInputsourceが切り替わるだけでWindows側が変更できません。
- *3 日本語Windowsを英字キーボードで送信するコマンドと同じ(Alt+半角/全角)です。IMEが日本語のみのときはShift+CapsLockでも切り替えることができますが、IMEにENGがあるときは切り替えられないので使わない方が良いと思いました。
- *4 Windows側ではバックスラッシュが入力されることを確認します。コマンドプロンプト等でドライブの移動やエクスプローラーから共有にアクセス(¥¥192.168.xxx.xxx)してみます。円が入力されていると、正常な挙動になりません。
- ＠、アスタリスク、アンダーバー、イコールなど、固有の入力方法が英字キーボードの通り動作するか確認します。


#あとがき
Karabiner-ElementsやKeyRemap4MacBookを使う記事が多くありましたが、何も使わない記事は見つからなかったのでメモを残しました。
それらの記事は手元の環境ではうまくいかず、円記号と縁もゆかりもない英語のキーボードを使っている体でバックスラッシュを入力するのが間違いないだろうというところで落ち着きました。。
慣れないうちはスタートとAltで迷いますが、英字キーボードに慣れている人ならば特殊な設定が不要なので楽だと思います。
Tenforflow-1.4.1 のビルド

ビルド前に curl のビルド設定を修正する必要がある。

```
$ git diff
diff --git a/third_party/curl.BUILD b/third_party/curl.BUILD
index 882967d..805a30d 100644
--- a/third_party/curl.BUILD
+++ b/third_party/curl.BUILD
@@ -477,7 +477,6 @@ genrule(
         "#  define HAVE_RAND_EGD 1",
         "#  define HAVE_RAND_STATUS 1",
         "#  define HAVE_SSL_GET_SHUTDOWN 1",
-        "#  define HAVE_STROPTS_H 1",
         "#  define HAVE_TERMIOS_H 1",
         "#  define OS \"x86_64-pc-linux-gnu\"",
         "#  define RANDOM_FILE \"/dev/urandom\"",
```

HAVE_STROPTS_H の行を削除。

また、CUDAを利用する場合は、以下のシンボリックリンクを作成しておく。

```
$ sudo ln -s /usr/local/cuda/include/crt/math_functions.hpp /usr/local/cuda/include/math_functions.hpp
```

ビルド開始。

```
$ PYTHON_BIN_PATH=/usr/local/bin/python3 ./configure
$ bazel build --config=opt //tensorflow/tools/pip_package:build_pip_package
$ bazel-bin/tensorflow/tools/pip_package/build_pip_package /tmp/tensorflow_pkg
$ sudo pip3 install /tmp/tensorflow_pkg/tensorflow-1.4.1-cp36-cp36m-linux_x86_64.whl
```

ビルドした Tensorflow のディレクトリ以外の場所に cd してから動作確認。

```
$ python3
Python 3.6.3 (default, Dec 15 2017, 16:04:49) 
[GCC 4.8.5 20150623 (Red Hat 4.8.5-16)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import tensorflow as tf
>>> hello = tf.constant('Hello, TensorFlow!')
>>> sess = tf.Session()
>>> print(sess.run(hello))
b'Hello, TensorFlow!'
```
Photoshopでパッケージ機能で共通ファイルをリンクする

Photoshopでデザインした際、ヘッダーやフッター等の共通ファイルを相対パスでリンクする方法です。

# まずはじめに

ファイルをリンクする場合、ドラッグ＆ドロップか「メニュー > リンクを配置...」を使用している場合があるかと思います。
この際、Photoshop内ではパスは**絶対パス**となってしまい、
自分のローカル環境以外では以下のような警告が出てしまいます。
![5f1c77e0-e999-d455-148d-5ab48ee88373.png](https://qiita-image-store.s3.amazonaws.com/0/54478/ba73010b-7219-c0c9-4fad-961e3776cec1.png)
※伏せてて分からないですが、社内共有のディレクトリを参照したパスになっている状態です

警告が出ても、「リンクを再設定」することでその場はしのげますが
この現象はパスが変わる度に発生し、
バージョン管理などでファイルを社内共有していたり、何度も直面していると大変しんどくなります。


# 解決方法

そこで、絶対パスから**相対パス**に変更するために、Photoshopの「パッケージ」機能を利用します。
以下は、既にリンク済みのファイルをパッケージ機能を使い相対パスに変更する方法です。


## ファイルを開き、リンクを再設定する

まず、社内共有のパスを自分のローカルのパスになるようリンクを再設定します。
![f7c8bea2-1e16-fcd1-6d2a-bc0210dba896.png](https://qiita-image-store.s3.amazonaws.com/0/54478/d4d1bc02-01c8-6c9c-cdda-233483cf66a7.png)


レイヤー上のエラー表示が消えていることも確認
![e680685e-8814-c3ad-f60d-84a826e829e7.png](https://qiita-image-store.s3.amazonaws.com/0/54478/a51cbec6-5b1a-c9e0-b479-c18aaf1039ae.png)
↓
![29feac8a-f34f-d511-ec98-07e4d592ebee.png](https://qiita-image-store.s3.amazonaws.com/0/54478/8278cc0f-1075-558e-60a8-2fcbfce473f0.png)



## パッケージを実行
メニュー：ファイル > パッケージ

![dd104457-5397-989c-adce-dacb2d97a60f.png](https://qiita-image-store.s3.amazonaws.com/0/54478/0729e5d6-babb-bee4-2b49-a5edd2146cb8.png)


**「サポートされてないカラースペースを…」というエラーが出た場合**
稀にこんなエラーがでます。
その場合は、PSDを一度保存し閉じてから、再度開きましょう。
![5854fba2-f4e5-9987-936d-f6ab594bcc4d.png](https://qiita-image-store.s3.amazonaws.com/0/54478/09e55bfd-f661-87be-ce47-6c1e529725cb.png)


## 保存します

保存先を指定し、保存します。
![293844af-c94b-664f-f268-9df4b277fe2f.png](https://qiita-image-store.s3.amazonaws.com/0/54478/0ce119b7-0d8f-4df2-7604-523bad363783.png)


保存すると、『「PSDファイル名」＋フォルダー』というディレクトリが出来上がります。
リンクしていたファイルは「Links」内に格納されます。
![dc2b104a-9e37-e624-a083-91c4cae91439.png](https://qiita-image-store.s3.amazonaws.com/0/54478/d3626dd7-b1a5-fcc3-f62c-98b057fc4b22.png)



## ディレクトリ内を整理します

パッケージを１つ作る度に、『「PSDファイル名」＋フォルダー』というディレクトリが増えていくので、サイト制作時、下層ページが増えるごとに煩雑になるので整理します。
まず、データを管理したいディレクトリ階層にPSDを移動します。

### 上書きします

データを移動すると以下の様なエラーが出ますが思い切って置き換えます。
![9b8af43a-c057-0d4f-4d3e-be03a89baf04.png](https://qiita-image-store.s3.amazonaws.com/0/54478/bf61dbe8-25c3-140f-17f5-c22d47d87979.png)
※心配な方はバックアップを取ったりバージョン管理を利用しましょう

### Linksディレクトリを移動します
ページごとのPSDと同階層にLinksが配置されるよう移動します。
![6b7c423e-9c8b-1c0b-1c50-4cd67dce1bac.png](https://qiita-image-store.s3.amazonaws.com/0/54478/8192595a-916e-5a09-a82d-95dafc33aced.png)


### データを確認する

データを開いて問題ないことを確認します

『メニュー：ウィンドウ > 属性』から、Linksにリンクされていることを確認します。
![5daf4e9e-4cf6-72a2-1e8e-587a236a4c00.png](https://qiita-image-store.s3.amazonaws.com/0/54478/0346195f-ed89-4920-007e-6473b341dffc.png)



### 他のデータもパッケージ化する

他のデータも同じようにパッケージ化したら、同階層に格納していきます。
パッケージ化の度に同じ「Links」ディレクトリが生成されますが、
これは１箇所にまとめることができるので、
どんどん「Links」に格納することでまとめることが出来ます。


以上で終わりです
BracketsでPHPの構文チェックを行うには一筋縄では行かなかった

<p>自動的にプログラムの構文チェックを行ってくれる、便利な機能「linter」、エディタによっては標準装備されているものが多くなっているが、PHPの場合はサーバーサイドであるために、設定には一筋縄で行かないものが多い。</p>

<p>特に、自分が愛用しているAdobe Bracketsについてはなかなか日本語サイトでの説明がなく、色々と手探りで調べた結果、苦心の末にXAMPPでlinterを起動させることができたので、ここにメモ。</p>

<h3>手順は以下の通り</h3>
<ol>
<li>作業環境のphp.exeにPATHを通して、PCを再起動</li>
<li><a href="https://getcomposer.org/">公式ページ</a>からComposerをインストールし、php.exeを関連付け。</li>
<li>Bracketsを起動し、拡張機能マネージャーからPHP Code Quality Toolsをインストール</li>
<li>ツールバーから表示→PHP Code Quality Tools Settingsを選択し、設定する。</li>
<li>ツールバーからデバッグ→拡張機能付きでリロードでBracketsを再起動し、右下にlinterのチェックマークが緑色になったら設定OK。</li>
</ol>

<p>要はPATHを設定してあげるだけでなく、Composerによる機能の関連付けも必要だったわけです。うまくいけば、以下のようなエラーリストが出て警告してくれるようになります。そのリストの上でクリックすると、エラーが発生している行をフォーカスしてくれるので、かなりコーディングの助けにはなるはず。また、設定オプションによってCode SnifferやWordPress用の構文にも対応させることができます。</p>

![brackets_phplint.png](https://qiita-image-store.s3.amazonaws.com/0/227291/d094fc2a-ed13-d378-17c4-88eede71ce61.png)


<h3>補足１：PATHの通し方</h3>
ここあたり参考になると思います。
<a href="https://qiita.com/sta/items/6d29da0dc7069ffaae60">Windows で環境変数 PATH をいじる方法のまとめ</a>

<dl>
<dt style="font-size: 26px">Windows７の場合</dt>
<dd>Window→コントロールパネル→システム→システムの詳細設定→環境変数→システム環境変数の欄からPathを探し出し、編集し、php.exeの場所のパスを貼り付ける。OKの後、PCを再起動。</dd>

<dt>Windows10の場合</dt>
<dd>Window→Windowsシステムツール→コントロールパネル→システム→システムの詳細設定→環境変数→システム環境変数の欄からPathを探し出し、編集→新しい欄をクリックし、php.exeの場所のパスを貼り付ける。OKの後、PCを再起動。</dd>
</dl>

<h3>補足２：Composerのインストール方法</h3>
ここあたり参考になると思います。
<a href="https://qiita.com/mikoski01/items/266469535e860312145d">Composerインストール手順(Windows)</a>
sshでLinuxに接続したら、日本語表示になる

#sshでLinuxに接続したら、日本語表示になる

linux自身にログインした場合はデフォルトの日本語設定になるが、sshでログインした場合は、日本語になってしまっていた。気になって調べたのでメモ。

Linux自身ログインでの言語設定確認→LANG設定が英語になっている
![キャプチャ1.PNG](https://qiita-image-store.s3.amazonaws.com/0/158138/7506c83a-dbd6-df3b-2a7a-3ffb025e4a1b.png)

MacからSSH接続時の言語設定確認→LANG設定が日本語になっている
![キャプチャ2.PNG](https://qiita-image-store.s3.amazonaws.com/0/158138/04a84e76-d212-afe4-ecb2-2f3e06a49719.png)

**なんでやーーー！！！**
ググってみると以下のサイトを発見
https://dev.classmethod.jp/server-side/os/changed-lang-by-ssh/

Macのssh_config設定変更して再度ssh接続
まだ日本語になってる。。。
**どないやーーー！！！**

結論linux側のおおもとの設定が日本語になってました。笑
```
[root@rhel-6-7-001 ~]# cat /etc/sysconfig/i18n
LANG="ja_JP.UTF-8"
```
viで設定を英語にして。。。
再度Macからsshで接続

やっと英語になりました。

![キャプチャ3.PNG](https://qiita-image-store.s3.amazonaws.com/0/158138/f3f03d31-3684-6666-9bcb-c5d89ca962f6.png)

もう少しググっていくとi18nか環境変数に設定している言語を選ぶからは、システムロケールというもので制御している模様でした。勉強になりました。
https://access.redhat.com/ja/node/1562183
オープンソースのSwiftプロジェクト 5選 [12/23~12/29トレンド]

GitHubで公開されているオープンソースの人気Swiftプロジェクトを紹介していきます🌟
# No.1
#### [SoySauceLab / CollectionKit](https://github.com/SoySauceLab/CollectionKit)  
![d3ee28bfeb925e231375a3904d6481c7.jpg](https://qiita-image-store.s3.amazonaws.com/0/200848/8bfcfee8-0f21-b79e-f729-b15d7338b75a.jpeg)
再利用可能なデータ駆動型コレクションコンポーネントを構築するための最新のSwiftフレームワーク。
Star:1,627🌟  

# No.2
#### [efremidze / Shiny](https://github.com/efremidze/Shiny)  
![68747470733a2f2f7468756d62732e6766796361742e636f6d2f4e657747726f7465737175654b697474656e2d73697a655f726573747269637465642e676966.gif](https://qiita-image-store.s3.amazonaws.com/0/200848/d67a0ee2-ee0b-e8e2-35ec-49e04bfecaca.gif)
Iridescent Effect View (Apple Pay Cash）
Star:300🌟 

# No.3  
#### [EyreFree / EFQRCode](https://github.com/EyreFree/EFQRCode) 
![EFQRCode.jpg](https://qiita-image-store.s3.amazonaws.com/0/200848/e99f5e18-1802-272a-ccab-e9e840c97fe0.jpeg)
Swiftで迅速な応答コードを操作するためのより良い方法。
Star: 2,370🌟 


# No.4  
#### [kmikiy / SpotMenu](https://github.com/kmikiy/SpotMenu)
<img width="558" alt="28494133-1a10dab8-6f26-11e7-8830-118bfd780bf7.png" src="https://qiita-image-store.s3.amazonaws.com/0/200848/a75ce4e2-1f26-255a-b191-233ac03ff90a.png">
メニューバーにSpotifyとiTunesを追加。
Star:540🌟 

# No.5  
#### [lhc70000 / iina](https://github.com/lhc70000/iina)  
![256-1.png](https://qiita-image-store.s3.amazonaws.com/0/200848/b8e1a830-5f03-8e53-8783-2abaa5c61296.png)

MacOS用の最新のビデオプレーヤー。
Star: 9,803🌟

---

Curated by [Boostnote](https://boostnote.io/ja)
[GitHub](https://github.com/BoostIO/Boostnote/issues)
[Twitter](https://twitter.com/boostnoteapp)
[Facebook group](https://www.facebook.com/groups/boostnote)
マイクロサービスの統合

# 概要
マイクロサービスアーキテクチャを読んだ記録

# 第4章
## アーキテクチャ
- オーケストレーション
    - 中央集権・わかりやすい
- コレオグラフィ
    - イベントをパブリッシュ
    - 各サービスがサブスクライブ
    - 疎結合で柔軟、変更を受け入れやすい
    - プロセスの監視と追跡に追加の作業が必要

## サービスインターフェース
- RPC
- REST
    - HATEOAS
        - JSON
            - 殆どの人が選択する
        - XML
            - 著者は好き
            - XPathを使う
    - HTTPはサポートツールやエコシステムが充実
    - 欠点
        - クライアントスタブが使えない
        - 遅延
        - REST in Practice (O'Reilly)
            - https://restinpractice.com/book/

## 非同期イベントベース連携
- 技術
    - RabbitMQ
    - Atom
        - やめておけ
    - SQSもこのあたり？
- 複雑さ
    - 「壊滅的フェイルオーバー」
        - http://bliki-ja.github.io/CatastrophicFailover/
    - リトライ
    - ワーカの停止
    - 「メッセージ病院」
        - 不正な状態の最終的な処理
    - 適切な監視、相関IDの利用
        - 追跡可能性の担保
    - Enterprise Integration Patterns
        - http://www.enterpriseintegrationpatterns.com/

## マイクロサービスでのDRY
- 共有コードをサービス境界外で使うと結合が発生する
- 1つのマイクロサービス内ではDRYを守る
- マイクロサービス間ではDRYの違反には寛大に対処する
- 例外
    - ロギングなどの共通はOK

## 参照
- メールサービスに発送通知メールの依頼をかけるとき
    - 注文詳細を渡すのでなく、注文の状態を確認できるリソースのURIを渡すことを考える
        - リソースの状態が変わりうるため
- リソースへの問い合わせが増えるので、キャッシュを活用する

## バージョニング
- ポステルの法則
    - http://www.yamdas.org/column/technique/19laws.html
- セマンティックバージョニング
    - https://semver.org/lang/ja/
- 異なるエンドポイントの共存が合理的である場合
    - 呼び出し元が複数ある場合、それらすべての改修が完了するまで
    - デプロイ時の短期間のもの
- 3つ以上の共存は明らかに間違い
- 共存が長期化する場合は、同じサービスに両方のエンドポイントを持つようにする
- バージョン番号をどのようにリクエストに含めるかは悩ましいとしている
    - バージョンをクライアントにハードコードさせないのが著者の好み
    - URIにバージョンを含めると、ルーティングは簡素となるメリットもある

## UI
- API合成
    - UIが直接各サービスに問い合わせる
    - UI側でマッピングする
    - API呼び出しが増える
- UI部品合成
    - サービス側がUIの部品を提供する
    - デバイスごとのUIを提供しにくい
- BFF
    - UIからのリクエストを受けるレイヤーを設け、そこが各サービスに問い合わせる
    - モノリシックなゲートウェイになりがち
    - サービスにあるべきビジネスロジックが、集約レイヤに入り込みがち

## まとめると
- コレオグラフィを選ぶ
    - ここに向かって変えていく
- 非同期処理は複雑であり、同期処理時とは異なる配慮が必要
    - 異常系の考慮、監視についても先に考えておく必要がある
- HTTP、JSONでやり取りすることをまず考える
- UIは合成レイヤ
Excel アドインでSQLiteを操作する

Aotori for Excel6 (AFE6)のインストールすれば、
ExcelからノープログラムでSQLiteを利用して、
情報共有できるようになります。

インストール手順&方法は下記のサイトを参照：
https://aotoriexcel.blogspot.com/2017/04/aotori6-7.html

使い方は簡単です。会員管理を例として纏めてあります。
https://aotoriexcel.blogspot.com/2018/10/aotori-for-excel_2.html

入力画面、データをデータベースに保存して共有、帳票出力など
一番簡単の方法は、このようなノープログラムで、迅速に構築できるツールは
ベスト方法ではないかと感じています。

参照になれれば幸いです。
なるべくシンプルなcssで左floatエリアを作る

表題、オレオレレスポンシブでけっこう使うのですがすぐ忘れちゃうので備忘録。

内容的には大体[この記事](https://qiita.com/shuntaro_tamura/items/dff7a2aba7e3f17fe9bc)の焼き直しです。古いブラウザ対応などはざっくり抜いたので、厳密にやりたい場合は元記事参照したほうがいいかもしれません。ていうか最新のMacOS Safariでしか動作確認してないので注意。

# コード

## HTML

```html

<div class="inner-this-area-is-float-left">
   <div>hoge</div>
   <div>fuga</div>
</div>

```

## CSS

```css
.inner-this-area-is-float-left > * {
    float: left;
}
.inner-this-area-is-float-left:after
{
    display: block;
    content: "";
    clear: both;
}
```

### Sass

```sass
.inner-this-area-is-float-left {
    > * {
        float: left;
    }
    &:after
    {
        display: block;
        content: "";
        clear: both;
    }
}
```

# 補足事項

* 指定classの直下のうちタグで囲まれている要素にしかfloatはきかないので注意。
* このケースではbeforeの指定はなくていい。
* 
afterから「content: "";」抜いてもなんかいけた。（しつこいようですがMacOS Safariでは、の話）
 →よくよく確認したらいけなかったですごめんなさい。「content: ""」必要！
OSM日本のマッピング状況を県別に比べてみた(2017年版)


1年前の記事「[OSM日本のマッピング状況を県別に比べてみた](https://qiita.com/higa4/items/7d44c4090a71aa9656a8)」では、道路と建物のマッピング状況についてその後の時系列での定点観測を目論んでいたのだけれど、道路距離数が計算されないという[issue](https://github.com/hotosm/osm-analytics/issues/63)がいつまで経っても解決されないという残念な状態が続いている。ともあれ年末ということで建物数だけ拾って去年と比較してみることにした。

## 都道府県別OSMマッピング状況表_20171229

[去年の表](https://docs.google.com/spreadsheets/d/1DUT0pCpLjb7JtO4tcN5NeTTHclHsRrQHOOhQBso04UM/edit?usp=sharing)に建物数(2017/12/29現在)を追記したものが[こちら](https://docs.google.com/spreadsheets/d/1ZAjf7utJxXDBaPE26zoKJ8Xb1cQwoVsH9sISAjCFoTg/edit#gid=0)。
![都道府県別OSMマッピング状況表_20171229 - Google スプレッドシート.png](https://qiita-image-store.s3.amazonaws.com/0/35320/c344a760-f439-2f83-2339-b679fea29565.png)
なんと建物数が合計で昨年比130.35%、3割も増えている。1年間で3割も増えたのはすごい。衛星画像などからのトレースを始めて以来、最大の伸び率ではないだろうか。

伸び率の大きい都道府県の順に見てみるとこんな感じ。
![伸び率順.png](https://qiita-image-store.s3.amazonaws.com/0/35320/a707964a-40e5-45ea-2fee-011b901d4fbf.png)
福岡、栃木など、これまで（少なくとも私自身は）あまりマッパーが思い浮かばない地域の伸び率がすごい。薄々感じておられる方もいると思うが、何かのきっかけで今年初めてOSM編集をやってみた人が増えたんじゃね？（もしかしてアレ？）

## PascalさんのOSMStats
じゃあ、ユーザーの内訳を見てみよう、ということで最近どんな人が活発に編集しているか[OSMStats](http://osmstats.neis-one.org/?item=countries&country=Japan)
![OSMstats - Statistics of the free wiki world map.png](https://qiita-image-store.s3.amazonaws.com/0/35320/f2920567-c9f8-63fd-a939-ddf91a53efa9.png)
でJapanを選ぶと直近の2ヶ月間でのOSM編集量の多い人Top500が表示される。
![OSMstats - Statistics of the free wiki world map (1).png](https://qiita-image-store.s3.amazonaws.com/0/35320/0225e300-2dcb-324f-6945-90e902c98700.png)

2017/12/28現在のこれの一覧をもとに、「[How did you contribute to OpenStreetMap?](http://hdyc.neis-one.org/)」と紐付けながら分析してみたのが以下。

## OSMStats分析
時間と労力の都合でTop500のうち[Top100](https://docs.google.com/spreadsheets/d/1ycMWHrH509nIgi9ST9RVofia3v8gpELSTLFq5xMYPLs/edit#gid=1998337170)だけピックアップして、都道府県別にアクティブさの度合いに応じて分類してみたのが[こちら](https://docs.google.com/spreadsheets/d/1ycMWHrH509nIgi9ST9RVofia3v8gpELSTLFq5xMYPLs/edit#gid=523724974)。
![都道府県別.png](https://qiita-image-store.s3.amazonaws.com/0/35320/ac9be007-af59-b708-8435-cdaa2dfadff6.png)

Newbie,Casual Mapperなどマッパーの分類の意味は下記参照。
![OSMStats分析 - Google スプレッドシート (1).png](https://qiita-image-store.s3.amazonaws.com/0/35320/3424982c-3c5c-df17-d50a-ad2ce48c688a.png)
![OSMStats分析 - Google スプレッドシート (2).png](https://qiita-image-store.s3.amazonaws.com/0/35320/cc54990c-dd91-ff30-afc4-ace1c8eec27a.png)

こうして見ると、NewbieやCasual Mapperに分類される、割と最近マッピングを始めた人たちが全国に満遍なく散らばっている様子が窺える。これはやっぱ最近背景地図に採用されたゲームの影響が大きいのかな。あるいはシビックテックなどの流れで目的別のマップを作る活動も広がっていたりもするので、いろんな取り組みの相乗効果なのかな。Top500を全て拾えばより正確なことが分かるかもしれない。ということでかなりアバウトではあるがいったん今年のまとめとしたい。

## おまけ
主な利用エディタごとに集計してみた表は[こちら](https://docs.google.com/spreadsheets/d/1ycMWHrH509nIgi9ST9RVofia3v8gpELSTLFq5xMYPLs/edit#gid=1923163553)。
![OSMStats分析 - Google スプレッドシート (3).png](https://qiita-image-store.s3.amazonaws.com/0/35320/39a61ed3-fe5b-ceba-ca00-ffd52cf3109d.png)

当然ではあるが、やはりiDエディタから始める参加者が多い。なお、Casual Mapperなどマッパーの分類は「変更セット数」が基礎となっている。iDエディタは常時オンラインでの作業となるためこまめの保存が推奨されており、結果的にiDエディタの利用者は変更セット数が増え、相対的に上位の種別に分類されているという面はあるようだ。

詳細分析してみたい方は各スプレッドシートをコピーしてご自由にどうぞ。CC0としています。
Vim で Prettier を使って自動的に整形する

vim-prettier を使えと prettier 公式が言っている。

https://github.com/prettier/vim-prettier

が、不要な機能が入っているので軽く使いたい場合に面倒だなあと思って ftplugin を書いた。

https://github.com/januswel/prettier.vim

`SearchPrettier` は Windows を考慮していないが `\` に置き換えれば動くと思う。

https://github.com/januswel/prettier.vim/blob/master/autoload/prettier.vim#L18

npm を使いながら開発しているとそもそもプロジェクトごとにツールチェインが違うので問答無用でグローバルインストールされるのは困る。なので、プロジェクトローカルから親階層に遡っていって最初に見つかった prettier と、そこから近い .prettierrc を使うようにしている。なければグローバルにフォールバック。それでも見つからない場合は動かない。
CentOS7のインストールの際、同時にGNOME環境を設定する。

仮想環境(VMWare)においてCentOSをインストールする方法については、その関連記事がインターネット上で多く見つかりますが、では__このインストールと同時にGNOMEをセットアップするにはどうすればよいでしょうか?__

後述する通り、実のところは大したことでもないのですが、関連する記事が意外に見つからず、はまりにはまった結果、環境を壊しては構築するを3回ほど繰り返す羽目に(´・ω・｀) インフラ力が低めなアプリ屋さんとして、せっかく苦労したので、その方法を共有しておきたいと思います。

まず「インストールの概要」において「ソフトウェアの選択」を押下します。

![インストールの概要 _edit.png](https://qiita-image-store.s3.amazonaws.com/0/105859/4863c7f0-9344-d99e-db0e-ab6ff1cdae4e.png)

その後表示される「ソフトウェアの選択」画面において、左ペイン「ベース環境」の「GNOME Desktop」のラジオボタンをチェックし、画面左上部の「完了」を押下します。

![ソフトウェアの選択_edit.png](https://qiita-image-store.s3.amazonaws.com/0/105859/343afae7-43f2-c778-e11d-d6ac89df0f76.png)

あとは画面に表示されるセットアップ手順通り進めていくだけ。基本的に大変親切なウィザードなので、迷うことはないと思います(´・ω・｀)
外部js,cssを動的に読込(PageSpeedInsights対策)

# メモとして

Google PageSpeed Insights
https://developers.google.com/speed/pagespeed/insights/?hl=ja

これでスピードを測った時に驚愕な数値を出したので、それの対策用に入れました。
入れたことにより20~30ポイント程度上昇しました。

本当はこんな小細工に頼らずにできるのが一番なんでしょうけど。。

# 動的に読込むスクリプト
```index.js
window.site = {};
lazy_list = null;
value = null;
temp = null;
cnt = 'ture';

site.onReady = function() {
  wid = $(window).width();

  // 読み込むファイルを並べる
  lazy_list = [
    '/xxxxxxxxx.css',
    '/xxxxxxxxx.js',
    '/xxxxxxxxx.js',
  ];
  require_onload(lazy_list);
}

function require_onload( arg ) {
  if(cnt == 'ture'){
    if (is_array(arg)){
      var element = [];
      for(var i=0; i<arg.length; i++){
        if ( arg[i].match(/\.css$/) ){
          add_child_css(arg[i]);
        }
        else if ( arg[i].match(/\.js$/) ){
          add_child_js(arg[i]);
        }
          else{ alert('check url : ' + arg[i]) }
      }
    }
    else{
      if ( arg.match(/\.css$/) ){
        add_child_css(arg);
      }
      else if ( arg.match(/\.js$/) ){
        add_child_js(arg);
      }
      else{ alert('check url : ' + arg[i]) }
    }
    cnt = 'false';
  }
}
function add_child_js(src){
  var js_element = document.createElement("script");
  js_element.src = src;
  // document.body.appendChild(element);
  var h = document.getElementsByTagName('head')[0];
  h.parentNode.insertBefore(js_element, h);
}
function add_child_css(src){
  var css_element = document.createElement('link');
  css_element.rel  = 'stylesheet';
  css_element.href = src;
  // document.body.appendChild(css_element);
  var h = document.getElementsByTagName('head')[0];
  h.parentNode.insertBefore(css_element, h);
}
function is_array(obj) {
  return Object.prototype.toString.call(obj) === '[object Array]';
}
```
How to use numpy.genfromtxt in python3

```python
from io import BytesIO
def _genfromtxt(s,delimiter,dtype):
 Z = np.genfromtxt(BytesIO(s.encode('utf-8')), delimiter=delimiter, dtype=dtype)
 print(Z)
 try:
  print(Z[1])
  print(Z[1][3])
 except IndexError as e:
  print(e)

s = """1, 2, 3, 4, 5\n
                6,  ,  , 7, 8\n
                 ,  , 9,10,11\n
		12,13,14,,15\n"""
Z = _genfromtxt(s,",",np.int)
Z = _genfromtxt(s,",",np.float)
Z = _genfromtxt(s,";",np.int)
Z = _genfromtxt(s,";",np.float)
```
```
[[ 1  2  3  4  5]
 [ 6 -1 -1  7  8]
 [-1 -1  9 10 11]
 [12 13 14 -1 15]]
[ 6 -1 -1  7  8]
7
[[  1.   2.   3.   4.   5.]
 [  6.  nan  nan   7.   8.]
 [ nan  nan   9.  10.  11.]
 [ 12.  13.  14.  nan  15.]]
[  6.  nan  nan   7.   8.]
7.0
[-1 -1 -1 -1]
-1
invalid index to scalar variable.
[ nan  nan  nan  nan]
nan
invalid index to scalar variable.
```
* The delimiter seems to be "\n" in the other cases.

# Refs.
* [StringIO](http://docs.python.jp/2/library/stringio.html)
* [csv/tsv の読み込み](http://www.mwsoft.jp/programming/numpy/csv.html)
* [Python2.7与Python3.6的不兼容性体现-Numpy.genfromtxt](http://blog.csdn.net/weixin_39029779/article/details/77511758)
* [例外](https://qiita.com/Usek/items/53527feba2adcb386aa8)
Webアイコンフォントの作り方 - ①ベクターツールでアイコンを作る

Webアイコンフォントとは、サイト上で使われるアイコンをWebフォントとして利用できるようにしたものです。

レスポンシブサイトのアイコンなどに利用されることが多く、
PCでもスマホでも劣化することなく表示することができます。

※Webアイコンフォントの利用例
![Webアイコンフォントの利用例のキャプチャ](https://qiita-image-store.s3.amazonaws.com/0/54478/b9844998-8ecc-8f66-1ad9-5b9d34bd3d80.png)


# Webアイコンフォントを作るには？

Webアイコンフォントを作るには、ざっくり３つの工程が必要です。

1. ベクターツール（Illustratorなど）でアイコンを作る
2. [アイコンをWebアイコンフォントに変換する](https://qiita.com/m-nakamura/items/abc871b1da6cfaf4db42)
3. [SASS/CSS、HTMLを設定する](https://qiita.com/m-nakamura/items/0ec1b4144c514914d73f)

この記事ではまず、1つ目の「ベクターツール（Illustratorなど）でアイコンを作る」について説明したいと思います。

# ベクターツールでアイコンをアイコンを作る

今回は、Illustratorで作成する場合で説明します。

正方形のアートボードやガイドを作り、その中に収まるサイズでアイコンを作ります。
※キャプチャはアートボードでの例
![アートボードでの例のキャプチャ](https://qiita-image-store.s3.amazonaws.com/0/54478/1fc07877-74d8-2179-dc86-56c15ef2b9c9.png)


## デザイン時の注意点

以下のことに気をつけてデザインデータを作るとGoodです。

- パスは必ずアウトライン化する
- アンカーポイントの数が多いとデータが肥大化するので不要なものは削除する
- パスファインダーで型抜きすると背面に透明なパスが隠れている場合があるので、アウトラインモード(⌘+y）で確認しつつ削除する
- デザインに関係ない、不要なアンカーポイントは必ず削除しましょう

![3385a554-2dbd-8d68-e9b9-e27329e2fba3.png](https://qiita-image-store.s3.amazonaws.com/0/54478/ec84ac09-aa32-cbb7-3bfb-be2998b69ed9.png)


## アイコンをSVGで書き出す

作成したアイコンをSVG形式で書き出します。
今回は、[「アセットの書き出し」](https://helpx.adobe.com/jp/illustrator/using/collect-assets-export-for-screens.html)機能を利用して書き出してみます。

まず書き出したいアイコンを１つだけ選択します。
※複数のアイコンを一気に選択するとそれが１つのSVGにまとまってしまうので注意
![5f2a1e25-ae45-db38-e1f3-4e1871bc124c.png](https://qiita-image-store.s3.amazonaws.com/0/54478/0d21ff60-d469-700f-260d-0388525c474a.png)


「アセットの書き出し」パネルに選択したアイコンをドラッグ＆ドロップ、もしくはパネル内の「追加」アイコンをクリックして追加します。
![8a7acfb0-ca6c-6da6-dd6a-02682d0549da.png](https://qiita-image-store.s3.amazonaws.com/0/54478/2ff8b8e1-2754-6291-5c87-03718efc6cce.png)


ここでのアセット名＝SVGファイル名になるのできちんと名前を設定します。
この時、プロジェクトの命名規則が決まっている場合、それに従った命名をしておくとトータルの工数が節約できて楽です。
![4d02b1e6-db18-7829-058e-d1aeb66f7f08.png](https://qiita-image-store.s3.amazonaws.com/0/54478/4ceb614d-7cd3-1d4c-8509-631ae07205fc.png)

書き出したい画像をパネル内で全て選択し、
「▼書き出し設定」から「SVG」に変更し、「書き出し...」を押します。
![34580f44-82c3-55d7-5705-8bfdb19b3a75.png](https://qiita-image-store.s3.amazonaws.com/0/54478/834d8bef-b312-3a28-c79f-46d0b94e6462.png)


SVGが書き出されます。
![1704c043-2ba6-482f-5899-b0cf98fa4d3e.png](https://qiita-image-store.s3.amazonaws.com/0/54478/36c6c056-f098-3b11-ce71-7c3fd18bcef1.png)



## なぜ「アセットの書き出し」なのか

理由は主に２つになります。

1. 「別名で保存」とは異なり、大元のファイル名が先頭に付かない
2. 「別名で保存」より、ファイルサイズが小さい

以下キャプチャを見てみると、「アセットの書き出し」では大元のファイル名が先頭に付かないことがわかります。
また、「アセット書き出し」の方がファイルサイズが小さいのがわかります。
![e32e6722-bf6a-939c-4982-23f97b06b8e2.png](https://qiita-image-store.s3.amazonaws.com/0/54478/ba536155-8727-6010-1a80-55ae4ce4645e.png)


さらに、テキストエディタで開くと圧縮されているのがわかります。
![780d65ae-881a-9635-d348-508c2e674086.png](https://qiita-image-store.s3.amazonaws.com/0/54478/a126a89b-7eb1-63a3-a774-d709f02dc88a.png)



SVGはなるべく軽量な状態で書き出していますが、別途圧縮ツール（[SVGOMG](https://jakearchibald.github.io/svgomg/)など）を利用する場合もあります。

以上が、ベクターツールでのアイコンの作り方です。
次回は「[アイコンをWebアイコンフォントに変換する](https://qiita.com/m-nakamura/items/abc871b1da6cfaf4db42)」を説明したいと思います。
開いているWebページへのリンクをMarkdown形式でコピーするブックマークレット

# やりたいこと
Webブラウザで開いているWebページへの、Markdown形式のリンクをワンタッチでコピーしたい。

# 環境
- Google Chrome

# Bookmarklet
```js
javascript:
(function(){
var text = document.createElement('div');
text.appendChild(document.createElement('pre')).textContent = '[' + document.title + ']( ' + location.href + ' )';
document.body.appendChild(text);
document.getSelection().selectAllChildren(text);
document.execCommand('copy');
document.body.removeChild(text);
})()
```

上記ソースコードをブックマークレット登録する。
Chromeの場合(改行そのままで `URL` 欄にコピペ可):

![copy_mdlink_bookmarklet.PNG](https://qiita-image-store.s3.amazonaws.com/0/107537/f8e732d9-a6d0-419a-f147-735c189aa3f0.png)


# ブックマークレット実行後のコピー形式例
```md
[開いているWebページへのリンクをMarkdown形式でコピーするブックマークレット - Qiita]( https://qiita.com/vmmhypervisor/items/099582feb9f9615c5b8b )
```


# おまけ: reStructuredText形式でコピーするブックマークレット
```js
javascript:
var text = document.createElement('div');
text.appendChild(document.createElement('pre')).textContent = '`' + document.title + ' <' + location.href + '>`__';
document.body.appendChild(text);
document.getSelection().selectAllChildren(text);
document.execCommand('copy');
document.body.removeChild(text);
```
初めてgithubを使ってみる

先日windowsパソコンに、
ubuntu on windows 環境を構築し
Ruby on Rails環境まで構築できました。


そこで、どうやってバージョンを管理するのか
会社の仕事ではsvnを使ってるんだけど
githubをつかってみたーい！


家のパソコンと外でも使うパソコン、
どちらでもソースを見たい。
だからWebサービスで管理したい！


Bitbucketは、
Railsチュートリアルで経験してるんだけど

githubを使ってみたーい！


そして、私はgithubを使いこなせるカッコいいエンジニアになるんです！

そんな理由使ってみたので、手順をまとめました。
初めてなので間違いなどあるかもしれません。
（もし気づいたお優しい方は教えていただけると助かります）


■環境
Windoes10 home の
Ubuntu on bash on windows
を使用してUbuntu環境から繋ぎます。



##手順
####①githubのアカウント登録
こちらから新規登録をしました。
[githubのトップページ](https://github.com/)

有料プランも（7$(日本円で800円くらい？)/月）もありますが、今回は無料アカウントで登録しました


登録が完了すると、メールが届きますので、
届いたメールのURLを押下しアカウントを認証させます。


####②リポジトリの作成
[start a project]を選択しリポジトリ作成
<img width="583" alt="②_1.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/215529/30300dd2-e76f-feb8-40c9-d83698cf5839.png">

とりあえずこんな設定で

<img width="469" alt="②_2.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/215529/9fc34679-7839-9b51-4bfb-ec928df03776.png">
[create repository]をクリック



これでソースを管理するためのリポジトリが
出来たのだろうと思います。



####③サンプルのHTMLファイル作成

```
$mkdir github_test
$cd github_test
$touch hello.html
```

とコマンドを入力しHTMLファイルを作成。

ソースを大好きな「Hello, World!」と表示するように修正

```hello.html
<!DOCTYPE HTML>
<html>
	<head>
		<title>hello, world!</title>
	</head>
	<body>
		Hello, World!
	</body>
</html>
```


####④ローカルgitにリポジトリ作成

git管理したいHTMｌファイルを作ったためそのディレクトリの階層にローカルのgitリポジトリを作成します。

```
$git init
```


####⑤ローカルリポジトリに追加
git管理したい先ほど作ったHTMLファイルをローカルリポジトリに追加します。

```
$git add hello.html
```

全部追加する場合は以下のコマンドを実行するとできます。

```
$git add --all
```


####⑥ローカルリポジトリにコミット
続いては、リポジトリに追加されているのでコミットを行います。

```
$git commit -m "gitへ初めてのコミット"
```

[-m]を付けることで、エディターを起動せずにコミットメッセージを指定できるそうです。
後ろについてるダブルクォート（""）で囲まれている内容がコメントです。
※ダブルクォート、ダブルクォーテーションは同じ意味です。


補足：ファイルが本当に追加されたのか確認してみる
gitにファイルが追加されているのかは、以下のコマンドで確認できます。

```
$git status
```

以下のようなメッセージが表示されれば全てコミット済みなのだと思います。
□□□□□□□□□□□□□□□□□□□□□
On branch master
nothing to commit, working directory clean
□□□□□□□□□□□□□□□□□□□□□


####⑦リモートリポジトリに追加する
bithubでリポジトリを作成したと思いますが、
そこに書いてあった以下の示す部分をコマンドで実行します。
<img width="420" alt="⑦_1.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/215529/ca17d11e-e7ea-78e4-c237-1b1f80fb0ffe.png">



####⑧githubへプッシュする
ローカルリポジトリで変更した内容を
githubのリモート環境へ反映させます。

```
$git push origin master
```

githubに登録したユーザー名と
パスワードが聞かれますので入力してください。
<img width="276" alt="⑧_1.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/215529/251792b9-4854-ccf6-fb4b-cb6369aea6f6.png">



これで、githubのマイページを確認したら、
ちゃんと登録されていましたー！
山形の言語距離

# 山形には地方が４つ
Twitterでこんな記事を見た。

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">多民族国家・山形の地域別言語比較です。ご査収ください。 <a href="https://t.co/8eeXGNe479">pic.twitter.com/8eeXGNe479</a></p>&mdash; そ (@g_glider0714) <a href="https://twitter.com/g_glider0714/status/780343328134934528?ref_src=twsrc%5Etfw">2016年9月26日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

山形県には村山、置賜、最上、庄内の4つの地方があり、それぞれ山形市、米沢市、新庄市、酒田/鶴岡市が中心都市である。（酒田と鶴岡はほら、ツインシティだから・・・）

庄内は他の3つの地方とは山で隔てられていて1つだけ海沿いである。当然言語も庄内とそれ以外に分かれてるんだろうと思ったら、なんかそうでもないようだった。面白そうなので、どの地方が言語的に近いのか測ってみようじゃないか。

# どうやって測るか
それぞれの標準語について、4つの地方の単語の音声学的な近さを測ればよい。それには、単語を音素表記して、音素列同士の近さを測り、それをすべての項目について足し合わせればよいだろう。

# データの準備
元のデータが画像だったので、泣きながら入力した。[Yamagata.csv](http://aitoweb.world.coocan.jp/data/Yamagata.csv)

```R
yam <- read.csv("http://aitoweb.world.coocan.jp/data/Yamagata.csv",as.is=T,fileEncoding="UTF-8")
```

# 音素表記
こんなこともあろうかと、[カタカナを音素のベクトルに変換するR package](http://github.com/akinori-ito/kana2phone)を作っておいたのじゃ。

```R
> library(devtools)
> install_github("akinori-ito/kana2phone")
> kana2phone("ツクッテオイタノジャ")
 [1] "ts" "u"  "k"  "u"  "q"  "t"  "e"  "o"  "i"  "t"  "a"  "n"  "o"  "j"  "a" 
```

# 音素ベクトル間距離
こういうときは[レーベンシュタイン距離](https://ja.wikipedia.org/wiki/%E3%83%AC%E3%83%BC%E3%83%99%E3%83%B3%E3%82%B7%E3%83%A5%E3%82%BF%E3%82%A4%E3%83%B3%E8%B7%9D%E9%9B%A2)を使うのが定番だろう。Rにはレーベンシュタイン距離を測る関数がいくつかあるが、残念ながら文字列用なのだ。音素は1音素1文字ではないので、1音素1文字に無理やり変換して文字列間のレーベンシュタイン距離を測るか、自前でレーベンシュタイン距離を測る関数を書くかのどちらかだ。自前で距離関数を書くのも難しくないのだが、怠けて前者のアプローチで行くことに。

1音素1文字にするために、"sh"=>"S"みたいな変換を定義する。ついでに話を簡単にするため、hashパッケージを使う（listを使うだけでもよかったかも）。

```R
library(stringr)
library(hash)
phn <- str_split("N a a: i i: u u: e e: o o: w y b by ch d f g gy h hy j k ky m my n ny p py q r ry s sh t ts z"," ")[[1]]
str <- str_split("NaAiIuUeEoOwybBCdfgGhHjkKmMn=pPqrRsStTz","")[[1]]
phn2str <- hash(phn,str)
```

こんな感じでカタカナから1音素1文字の音素列に変換可能。

```R
> paste(sapply(kana2phone("シャチョーサン"),function(x){phn2str[[x]]}),collapse="")
[1] "SaCOsaN"
```

レーベンシュタイン距離を求めるのはadist()。文字ベクトルを与えると、全部の組み合わせの距離を測ってくれる。便利だね。

```R
> adist(c("abc","ade","bcd"))
     [,1] [,2] [,3]
[1,]    0    2    2
[2,]    2    0    3
[3,]    2    3    0
```

これを使って距離を蓄積する。

```R
dst <- matrix(0,4,4)
rownames(dst) <- colnames(dst) <- names(yam)[2:5]
for (k in 1:nrow(yam)) {
  s <- rep("",4)
  for (i in 1:4) {
    s[i] <- paste(sapply(kana2phone(yam[k,i+1]),function(x){phn2str[[x]]}),collapse="")
  }
  dst <- dst+adist(s)
}
```

# クラスタリング
相互の距離がわかればクラスタリングができる。ここではstatsパッケージのhclustを使おう。

```R
library(stats)
d <- as.dist(dst)
h <- hclust(d)
plot(h)
```

表示されるデンドログラムがこちら。意外にも村山と置賜より村山と庄内のほうが近い。米沢・・・

![クリップボード.png](https://qiita-image-store.s3.amazonaws.com/0/219428/59c4a91c-1e32-f6e5-8dfd-04db6e606ae8.png)


（おわり）
Ubuntu 16.04 から Epson PM-A890 にアクセスして印刷したい

# 方法
1.  <div>[EPSON Download Center](http://download.ebz.epson.net/dsc/search/01/search/)にアクセスし、型番を入力して必要ソフトウェア・ドライバを検索します。

![EPSON Download Center.png](https://qiita-image-store.s3.amazonaws.com/0/226891/86cba1fb-a4a8-9115-28e9-fb5d17e9f388.png)


 今回はプリント機能だけを使いたかったので、

- ESC/P-R Driver (generic driver) : ドライバー本体
- Epson Printer Utility : GUIの日本語化？(これを入れて再起動掛けたら日本語化されたので)

のみをダウンロードしました。
</div>
2. 依存関係を考えてインストールするのが面倒くさいので、gdebi を使って .deb をインストールしました。
<div>

```bash
# 32bit OSの場合
sudo gdebi "epson-inkjet-printer-escpr_1.6.18-1lsb3.2_i386.deb"
sudo gdebi "epson-printer-utility_1.0.2-1lsb3.2_i386.deb"

# 64bit OSの場合
sudo gdebi "epson-inkjet-printer-escpr_1.6.18-1lsb3.2_amd64.deb"
sudo gdebi "epson-printer-utility_1.0.2-1lsb3.2_amd64.deb"
```
</div>
3. 再起動します。


楽ちんでイイね！

# 参考文献
[debファイルからインストールする際に依存関係で悩んだら](https://qiita.com/yanoshi/items/5faf97012bf7889feccf)
[Android][Kotlin]Base64をデコードして画像URIを作成する

Base64でエンコードされた画像データを他アプリ等に共有できるようにURIを生成する方法です。

# 手順
1. Base64をデコード
2. Bitmap画像を作成
3. URIを作成

## Base64をデコード
画像データの場合、`image/jpeg;base64,`がBase64化した文字列の前についているので除外してデコードします。
※ `jpeg`の部分は適宜 `png`等に変えてください。

```
val decodedBytes = Base64.decode(
  base64Str.substring(base64Str.indexOf(",") + 1),
  Base64.DEFAULT
)
```
## Bitmap画像を作成
デコードしたデータからBitmap画像を作成します。
作成は `BitmapFactory`の `decodeByteArray`を使用します。

```
BitmapFactory.decodeByteArray(decodedBytes, 0, decodedBytes.size)
```
## URIを作成
作成したBitmap画像からURIを作成します。
ストレージに画像を保存するので、 AndroidManifestに `android.permission.WRITE_EXTERNAL_STORAGE`を追加しておきます。

```
val bytes = ByteArrayOutputStream()
bitmapImage.compress(Bitmap.CompressFormat.JPEG, 100, bytes)
val path = MediaStore.Images.Media.insertImage(context.getContentResolver(), bitmapImage, "Title", null)
val uri = Uri.parse(path)
```

一度もストレージを使用したことがない場合、エラーが発生してしまうのでディレクトリの有無を確認してなければ作成しておきます。

```
val sdcard = Environment.getExternalStorageDirectory()
if (sdcard != null) {
  val mediaDir = File(sdcard, "DCIM/Camera")
  if (!mediaDir.exists()) {
    mediaDir.mkdirs()
  }
}
```

# コード全文
以下に今回使用したコードを載せておきます。

```
// Base64 to Bitmap
@Throws(IllegalArgumentException::class)
fun convert(base64Str: String): Bitmap {
  val decodedBytes = Base64.decode(
    base64Str.substring(base64Str.indexOf(",") + 1),
    Base64.DEFAULT
  )

  return BitmapFactory.decodeByteArray(decodedBytes, 0, decodedBytes.size)
}

// Bitmap to URI
private fun getImageUri(context: Context, bitmapImage: Bitmap): Uri {
  val bytes = ByteArrayOutputStream()
  bitmapImage.compress(Bitmap.CompressFormat.JPEG, 100, bytes)
  val sdcard = Environment.getExternalStorageDirectory()
  if (sdcard != null) {
    val mediaDir = File(sdcard, "DCIM/Camera")
    if (!mediaDir.exists()) {
      mediaDir.mkdirs()
    }
  }
  val path = MediaStore.Images.Media.insertImage(context.getContentResolver(), bitmapImage, "Title", null)
  return Uri.parse(path)
}
```

こんな感じで呼び出して使用して頂ければと思います。

```
val uri = getImageUri(applicationContext, convert(base64Str))
```
気付いたらvagrant sshでssh_exchange_identification: Connection closed by remote hostと言われるようになっていたので対処



ググる。

- [ssh_exchange_identification: Connection closed by remote host と言われたときにクライアント側でできる対処 - Qiita](https://qiita.com/sky_y/items/84a73578f94693f6a8dd)

~/.ssh/known_hostsの削除。
効果なし。

- [configを利用したssh接続時エラーの対処法 - 気軽に楽しくプログラムと遊ぶ](http://tamata78.hatenablog.com/entry/2016/01/07/110156)

ユーザーとか鍵のパーミッションとか。
身に覚えがない……。

- [「ssh_exchange_identification: Connection closed by remote host」というエラーの対処 - くらげだらけ](http://kudakurage.hatenadiary.com/entry/20090324/1237878523)
	- [「E20: Mark not set」と表示されいくつかのViコマンドが使えない。](http://kajuhome.com/cgi-bin/patio/patio.cgi?mode=view&no=697&p=2)
	英字キーボードのためコロンはセミコロンのシフトに配置されている。
	- [SSH - sshでログイン出来ない ssh_exchange_identification: Connection closed by remote host(6476)｜teratail](https://teratail.com/questions/6476)
	サーバー再起動も必要だよとのこと。

virtualboxから停止して再度vagnrant upしたら接続できた。
これが原因なのかもしれないけど普通に再起動で直るやつだったのかもしれない。

同時期にgitでもsshを使っていたので、その設定とぶつかったのかも。
困ったら再起動というのは
Photoshopで写真をジオラマ風に加工しよう

#はじめに

写真をジオラマ風に加工する方法を紹介します。
参考になれば幸いです。

#写真を加工する

フリー素材サイトで見つけたこのビルの写真を加工していきます。
![01.jpg](https://qiita-image-store.s3.amazonaws.com/0/202257/dbf7d55c-d91b-58cd-de0f-04530a0044ad.jpeg)

***


フィルター→ぼかしギャラリー→チルトシフトを選択します。

![スクリーンショット 2017-12-28 22.13.42.png](https://qiita-image-store.s3.amazonaws.com/0/202257/de53acc3-7322-8fc7-2f3e-a132136440b9.png)

このぼかしは基準の位置から上下をぼかしてくれるフィルターになります。
今回は基準の位置はそのままで設定を下記にしました。

![スクリーンショット 2017-12-28 22.12.37.png](https://qiita-image-store.s3.amazonaws.com/0/202257/bd3e7d08-87e4-e0bc-236b-778340142e03.png)

こんな感じになります。

![02.jpg](https://qiita-image-store.s3.amazonaws.com/0/202257/55d60870-37af-b13e-2b57-907d805e6c40.jpeg)

***

ジオラマ感をさらにだすためにトーンカーブを下記のように設定しぱきっとさせます。

![スクリーンショット 2017-12-28 22.13.01.png](https://qiita-image-store.s3.amazonaws.com/0/202257/b0d4a5fc-bcd4-e59b-358d-e1517e999ae1.png)

![03.jpg](https://qiita-image-store.s3.amazonaws.com/0/202257/562079a2-1ef5-52a5-612d-9af53422d241.jpeg)

***

もう少しおもちゃな感じを出したいので、フィルター→ Camera Rawフィルターを選択します。

![スクリーンショット 2017-12-28 22.14.02.png](https://qiita-image-store.s3.amazonaws.com/0/202257/1e86a64e-9430-2f1f-4450-6f637bf4a741.png)

白レベルやシャドウを上げ、よりのっぺりさせます。
※写真をアニメ風に加工するときもこのフィルターは便利です。

![スクリーンショット 2017-12-28 22.14.30.png](https://qiita-image-store.s3.amazonaws.com/0/202257/0bbd4566-11bc-14b9-02b0-4314d58fd548.png)

# 完成

![04.jpg](https://qiita-image-store.s3.amazonaws.com/0/202257/618e6443-5ba7-d07d-0c59-043eda64c110.jpeg)


こんな感じに仕上がりました。

# おわりに

光の感じも室内のライトに当たったようになり、だいぶジオラマ感がでました。
チルトシフト以降の色調補正などはお好みでだいぶ雰囲気も変わりますので、ぜひいろいろ試してみてください。
サービス開発はクローズからリリースに向かっても一度考えるべき

サービスを開始する前から、クローズする事を考えるなんてなんて奴だと、
思われる方もいるかと思いますが、
一度クローズ⇒リリースに向かってをシミュレーションする事で対応抜け漏れが少なくなります。

### クローズ事前
- ユーザへの告知
- 関係者への連絡
- 決済処理の停止
- プラットフォームのアイテム販売停止
- プロジェクトに関わるメンバーフォロー
- sorryページの用意と、リダイレクトさせる期間方針の決定
- 返金方針の決定

### クローズ当日
- 対象サービスへのアクセス制限、sorryページへのリダイレクト
- ユーザへの終了完了連絡
- 関係者への連絡

### クローズ後
- 関連サービスの停止
- データの移行、削除
- 返金


いくつか上げてみましたが、クローズ時だけ必要な機能でしょうか？
（他にも色々やる事があると思いますが）
決まってからやるべき事と決まる前からもできる項目があるかと思いますが、
告知、処理の制限などはサービス中でも必要な事があるかもしれません。
この時開発メンバーだけでなく、どんな人が関わる必要があるか考えられます。
管理部や経理部といった開発には直接関係の無い部署の人と開発開始時に話せると良いですね。
規約部分とか後手になりがちなので、最初に解決しておいた方が良いです。
（返金額の小数点以下の切り捨て、切り上げ等）


### 環境縮小
- サーバのスケール変更（イン、ダウン）
- 人員の削減、担当者の変更
- 一部機能の制限

人員の削減、担当者の変更などはよくある事ですよね。
担当が誰に変わってもコンフル等に初期構築手順等まとめられていれば、すぐに業務が始められると思います。
一部機能の制限は、全体のメンテナンス以外でも、各項目ごとにメンテナンスができるようになっている事で
サービス中でも問題発生した際に使用する事ができます。
決済で障害が発生したのであれば、購入メニューをメンテナンスにするなど。


### IT監査
- ガチャの確率提出
- 管理画面のアクセスユーザ制御（追加・変更・削除）
- 管理者からの仮想通貨の付与、減算
- ログ提出（確立を誰がどう変えた？誰が付与した？減算した？）
- リリースフロー
- 権限管理

サービス時に不要でしょうか？
ガチャの確率が想定通りになっているかプランナーさんは当然知りたいですよね。
必要か？と言わないと必要と言わない人が多いですが。
サービスが忙しくなっているときに、なかなか準備が面倒なものですので、
後回しにせずしっかりと用意したほうが良いですね。
リリースフロー、権限管理などは、決済が絡むサービスでないと監査からは求められませんが
しっかりと準備しておくと安心です。


### サービスが盛り上がってきて大きな広告投下時
- サーバのスケール変更（アウト、アップ）
- サービスのメンテナンスIn、Out
- メンテナンス時の突破ユーザー管理
- 社内IPからの突破の有無

サービス開始時に不要でしょうか？そんな事ないですよね。全て必要です。
ただ、サービスの主なコンテンツ、ゲームならゲーム自体の構築が最も大切な為忘れがちになるだけですよね。

### サービスリリース
ここはいつも考えている通り必要なコンテンツを頑張って用意します。

この様にクローズ→リリースの流れで一度考えてみると、
完璧に準備してきたと思っても意外と対応漏れが見つかるものです。
MacのEclipseにてCompareMergeでSVN比較する

[CompareMerge](https://itunes.apple.com/jp/app/comparemerge/id478570084)をインストールの上、以下で動きました。
情報が見つからなかったので書いておきます。
（SVNなんて使わないということでしょうか...）

```text
-a /Applications/CompareMerge.app ${base} ${mine}
```

環境設定 > チーム > SVN > Diff ビューアー
<img width="472" src="https://qiita-image-store.s3.amazonaws.com/0/106259/bea3aec7-2426-979e-c8fe-9ca4384ce43c.png">

<img width="1255" src="https://qiita-image-store.s3.amazonaws.com/0/106259/f650809b-433f-cfda-51d7-e35eed9e2d71.png">
[Laravel5.5]Package Auto Discoveryを理解する


## はじめに
2017年8月にLaravel5.5がリリースされました。
以前LaraLabというLaravel勉強会にて「Package Auto Discovery」に関して[LT](https://speakerdeck.com/k_kurikuri/laravel5-dot-5-package-auto-discoverywoli-jie-suru)したのでQiitaにも投稿してみます。

## Package Auto Discoveryとは
Laravel5.5で導入された新しい仕組み。
直訳すると「パッケージの自動検出」ですが、ここでいうパッケージとは「Composerパッケージ」に該当します。
LaravelではServiceProviderやFacadeをサービスコンテナに登録をしますが、この機能を使用するとcomposer install (update)すると自動でロードしてくれます。

さらにcomposer remove時には自動でロードしなくなります。

この機能はアプリケーション側で無効にする事も可能ですが、使用するメリットが高いため無効にするケースはあまりないのではないでしょうか。

## 具体例でメリットを確認する
[laravel-debugbar](https://github.com/barryvdh/laravel-debugbar)というプロファイラがあります。Laravelユーザーの方はご存知の方も多いのではないでしょうか。
laravel-debugbarはPackge Auto Discoveryに対応しているのですが、この機能を使用する前のインストール手順は以下のようになります。

* `composer require -dev laravel-debugbar`
* app.phpのprovider, aliasesキーにServiceProvider, Facadeを追加する
* `php artisan vendor:publish`する

laravel5.5からは以下のように`composer require`した後、
`php artisan vendor:publish`するだけでインストールできます。

* `composer require -dev laravel-debugbar`
* ~~app.phpのprovider, aliasesキーにServiceProvider, Facadeを追加する~~
* `php artisan vendor:publish`する

※注 `php artisan vendor:publish`はlaraveldebugbarを使用するのに必要なコマンドであり、Package Auto Discoveryとは関係ありません

## Package Auto Discoveryの仕組み
`composer.json`内の**"extra":"laravel"**フィールドにServiceProviderとFacadeが定義されています。


```composer.json
{
	"extra": {
	    "laravel": {
	        "providers": [
	            "Barryvdh\\Debugbar\\ServiceProvider"
	        ],
	        "aliases": {
	            "Debugbar": "Barryvdh\\Debugbar\\Facade"
	        }
	    }
	}
}
```

composer install後に作成される、`vendor/composer/installed.json`がLaravel起動時にロードされ、
既存で読み込まれる`ServiceProvider`と`Facade`の配列リストにマージされます。

## Package Auto Discoveryを無効にしたい
アプリケーション側の`composer.json`に`dont-disover`というフィールドがあります。
`*`をつけると全て無効になり、特定のpackageのみ無効にする場合はpackage名を付けて記述します。

```composer.json
{
	"extra": {
    	"laravel": {
       		 "dont-discover": [
				"barryvdh/laravel-debugbar"
	        ]
    	}
	}
}
```


## まとめ
* composerライブラリを使う際に、Package Auto Discoveryの仕組みを意識する必要は特にない
* composer.jsonに**"extra":"laravel"**フィールドが存在しないライブラリには対応していないため、5.4までのようにServiceProvider, Facadeなどを`app.php`などに追加する必要がある
* 自身でcomposerライブラリをOSSとして提供する場合は、**"extra":"laravel"**フィールドを追加してあげるとユーザーフレンドリーになる
date +%Y%m%d%H%M%S

よく利用する date command ですが、よく使うオプションを忘れるのでメモしておきます。
日時付きのファイル名を作る際に便利です。

```bash:console
$ date +%Y%m%d%H%M%S
20171229122952
$ echo dummy > `date +%Y%m%d%H%M%S`.log
$ ls | grep 2017
20171229123027.log
```
Interface Builderの静的解析ツール「IBLinter」のセットアップ方法

## 「IBLinter」とは？

Interface Builder（以下「IB」と呼ぶ）用の静的解析ツールです。

## 環境

- OS：macOS Big Sur 11.1
- Xcode：12.3 (12C33)
- Swift：5.3.2
- IBLinter：0.4.25

## セットアップ

### インストール

Mintからインストールします。

```diff:Mintfile
+ IBDecodable/IBLinter@0.4.25
```

```shell-session
$ mint bootstrap
```

### ビルド時に静的解析を行うようにする

Xcodeで対象のプロジェクトファイルを開く>TARGETS
→対象のターゲットを選択>[Build Phases]タブ
→左上にある[+]をクリック>New Run Script Phase
Run Scriptに以下のスクリプトを記述すると、ビルド時に静的解析されるようになります。

```shell-session
if which mint >/dev/null; then
  mint run IBDecodable/IBLinter iblinter lint
else
  echo "warning: Mint not installed, download from https://github.com/yonaskolb/Mint"
fi
```

### ルールの詳細設定

プロジェクトのルートディレクトリに `.iblinter.yml` を作成し、その中にルールの詳細を記述します。
設定の書き方は[公式ページ](https://github.com/IBDecodable/IBLinter/blob/master/Rules.md)に詳しく載っています。

私の設定ファイルも公開します（随時更新）。

```yaml:.iblinter.yml
# デフォルト有効で無効にするルール
disabled_rules:
  #- enable_autolayout
  #- duplicate_constraint
  #- duplicate_id
  #- custom_module
  #- ambiguous

# デフォルト無効で有効にするルール
enabled_rules:
  #- custom_class_name # ファイル名は末尾の `ViewController` を省略したいため
  - relative_to_margin
  - misplaced
  #- storyboard_viewcontroller_id # IDは末尾の `ViewController` を省略したいため
  - stackview_backgroundcolor
  - image_resources
  - use_base_class
  - view_as_device
  - reuse_identifier
  - color_resources
  - use_trait_collections

# 対象外のファイル・フォルダ
excluded:
  - Pods
  - Carthage
  - SourcePackages
  - Generated

view_as_device_rule:
  device_id: retina6_1 # iPhone 11
```

## 静的解析

ここまで設定したら、ビルドするたびに静的解析が行われます。
警告やエラーが出たら、コードを修正するか、ルールを緩和するかしましょう！

## 参考リンク

- [Interface Builder用のLinterを作ってみた - Qiita](https://qiita.com/kateinoigakukun/items/404ac398385272fd6ab3)
- [IBDecodable/IBLinter: A linter tool for Interface Builder](https://github.com/IBDecodable/IBLinter)
- [Setup IBLinter · Issue #163 · uhooi/UhooiPicBook](https://github.com/uhooi/UhooiPicBook/issues/163)
- [Feature/setup iblinter by uhooi · Pull Request #165 · uhooi/UhooiPicBook](https://github.com/uhooi/UhooiPicBook/pull/165)
prmdのrakeタスクのオプションの使い方

# 概要
prmdにおけるドキュメント生成のrakeタスクを作成する際のオプションの付け方。

# バージョン
prmd 0.13.0

# prmdとは何か？
こちらの記事を参考にしてください。

[prmd を利用して JSON Schema を簡単に管理しよう](https://qiita.com/fakestarbaby/items/90144d8bc3dead46e65c)
[JSON Schemaを上手く運用出来そうなprmdとその周りのお話](https://qiita.com/taizo/items/2528c16a2a48deb1c2e5)
# rakeタスク
READMEのサンプルに載っているrakeタスクは以下の通り

```zsh:schema.rake
# Rakefile
require 'prmd/rake_tasks/combine'
require 'prmd/rake_tasks/verify'
require 'prmd/rake_tasks/doc'

namespace :schema do
  Prmd::RakeTasks::Combine.new do |t|
    t.options[:meta] = 'schema/meta.json'    # use meta.yml if you prefer YAML format
    t.paths << 'schema/schemata/api'
    t.output_file = 'schema/api.json'
  end

  Prmd::RakeTasks::Verify.new do |t|
    t.files << 'schema/api.json'
  end

  Prmd::RakeTasks::Doc.new do |t|
    t.files = { 'schema/api.json' => 'schema/api.md' }
  end
end

task default: ['schema:combine', 'schema:verify', 'schema:doc']
```

ドキュメント生成のオプションにあるtoc(table of contents)を利用したかったので、

```
{
  "doc": {
    "url_style": "default", // can also be "json"
    "disable_title_and_description": false, // remove the title and the description, useful when using your own custom header
    "toc": false // insert the table of content for json scheme documentation to the top of the file. (default disable)
  }
}
```

以下のように設定すると使える。

```diff

Prmd::RakeTasks::Doc.new do |t|
  t.files = { 'schema/api.json' => 'schema/api.md' }
+  t.options[:doc] = { toc: true } # ここ
end
```

# 出力例
ドキュメントの最初にエンドポイントの一覧が表示される。


![image.png](https://qiita-image-store.s3.amazonaws.com/0/164998/837b0ad9-e6f7-2d43-683a-3fa412e6b501.png)
通信の保護について

通信の保護について

#　想定する脅威モデル
-　なりすまし
-　情報漏洩（盗聴）
-　データの改ざん
-　否認

##　情報漏洩（盗聴）

-　暗号化で対策
　-　共通鍵暗号方式
　-　公開鍵暗号方式
　-　ハイブリッド暗号方式（SSLプロトコルで使用）

###　共通鍵暗号方式
共通の鍵を使って暗号化と復号化をおこなう。

1.　２者（アリスとボブ）間で暗号化アルゴリズムを決めて「共通鍵」を作成
2.　アリスは「共通鍵」を使ってデータを暗号化してボブに送る
3.　ボブは暗号化されたデータを受け取った後、「共通鍵」を使って復号化してデータを読む

メリット
-　暗号化、復号化の処理が高速

デメリット
-　そもそもどうやって鍵を渡すのか？
-　他の人とやりとりする場合、このやりとりで使った鍵とは別の「共通鍵」を作成する必要がある
-　人が増えれば増えるほど、鍵が増える。＞＞＞「n(n-1)個」
-　増えた鍵の管理コストが高い

###　公開鍵暗号方式
暗号化する鍵と、復号化する鍵が異なる。

1. アリスは暗号化する鍵を公開しておく＝「公開鍵」
2. ボブはアリスが公開している鍵でデータを暗号化してアリスに渡す
3. アリスは受け取ったデータを「公開鍵」とは別の鍵＝「秘密鍵」で復号化して読む

メリット
-　鍵の数が少なくて済む
-　鍵の管理コストが低い
-　鍵の受け渡し時のセキュリティを気にしなくて済む

デメリット
-　暗号化、復号化の処理に時間がかかる

### ハイブリッド暗号方式
共通鍵暗号方式と公開鍵暗号方式の組み合わせ

1.　アリスは、２者の「共通鍵」でデータを暗号化する
2.　アリスは１で使用した「共通鍵」をボブの「共通鍵」で暗号化し、１で暗号化したデータと一緒にボブに送る
3.　ボブは自分の「秘密鍵」で暗号化された「共通鍵」を復号化する
4.　ボブは復号化した「共通鍵」でデータを復号化する

※SSLプロトコルではハイブリッド暗号方式を使用している

メリット
-　やりとり後に鍵を破棄すれば鍵の保管に配慮する必要がない
-　やりとりの多くを共通鍵暗号方式で行うため、処理が高速化する

##　データの改ざん
-　メッセージ認証符号>MAC（Message　Authentication　Code）で対策

###　メッセージ認証符号
データの完全性を保証するもの

1.　任意のデータ（＝メッセージ）と「共通鍵」を使って、ある関数（MAC関数）を利用して計算した値（MAC値）をつくる
2.　データとMAC値を合わせて送信する
3.　受信者は受け取ったデータからMAC関数を使用してMAC値を作り、送られてきたMAC値と一致していればデータは改ざんされていないことが判断できる

##　なりすまし、否認　
デジタル署名で対策

###　デジタル署名
公開鍵暗号方式の逆で自身を証明する

1.　アリスがボブにデータを送るときに、「秘密鍵」で暗号化をする
2.　ボブはデータを受け取って、アリスの「公開鍵」で復号化をする
3.　アリスの「公開鍵」で復号できるデータを作れるのはアリスの「秘密鍵」持っている、アリスだけ
4.　アリスの「公開鍵」で復号できる＝アリスが送ってきたデータとなり、送信者を特定できます

これにより、なりすましができなくなり、且つ否認（誰が送ったかの証拠）もできなくなる