OmniAICreator/Qiita-1.07M huggingface dataset:
【Markdown】9.9秒で3x3の表を作るChrome拡張を作った。

# 【Markdown】9.9秒で3x3の表を作るChrome拡張を作った。

```
時間測定2: 9971.44091796875ms
```

ボルト並みの速度ですね。

![Peek 2019-08-30 11-30.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112929/fca1b2fc-d368-8b20-5e51-cbe117376b4f.gif)

作った表。

|  |  |  |
| :-: | :-: | :-: |
|  |  |  |
|  |  |  |

## ちゃんとした表

```
時間測定: 40985.581787109375ms
```

40.9秒なので、`400m ウェイド・バンニーキルク` さんくらいの記録でしょうか。

![Peek 2019-08-30 11-28.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112929/a6fa5572-ccd0-d840-0372-fee08ea187ba.gif)

|  | 緊急度（高） | 緊急度（低） |
| :-: | :-: | :-: |
| 重要度（高） | 1 | 2 |
| 重要度（低） | 3 | 4 |

## 拡張へのリンク

https://chrome.google.com/webstore/detail/table-to-markdown-creater/hhahknpikfglcfiepppleiobpgdfaank?hl=ja

## ちょっとした技術解説

GitHub https://github.com/ykhirao/apps/tree/master/Md2Html


- `Vue create` で作った普通のVue.jsアプリ
- `build` で `dist/` というディレクトリにバンドルしています
- `cp:contents` で、その時に必須のファイルをコピーしてます(webpackに任せる方法でやっても可だと思います)
- `zip` でChrome拡張配布ようにZIPファイルに変換しています

```package.json
  "scripts": {
    "serve": "vue-cli-service serve",
    "lint": "vue-cli-service lint",
    "build": "vue-cli-service build && npm run cp:contents",
    "zip": "bestzip TableToMd.zip dist/*",
    "cp:contents": "cpx src/manifest.json dist/ && cpx src/icon-128.png dist/"
  },
```

## 開発してちょっと詰まったところ

```manifest.json
{
  "manifest_version": 2,
  "version": "0.1",
  "name": "Table To Markdown Creater",
  "short_name": "TableToMd",
  "description": "Chrome and Firefox exetension",
  "browser_action": {
    "default_icon": {
      "19": "icon-128.png"
    },
    "default_popup": "index.html",
    "default_title": "TableToMd"
  },
  "homepage_url": "https://github.com/ykhirao/TableToMd",
  "icons": {
    "128": "icon-128.png"
  },
  "permissions": [
    "activeTab"
  ]
}
```

`permissions` は `http://*` とかにすると審査が伸びるみたいな雰囲気でした。途中で `activeTab` に変更して、3日で審査追えました。
`manifest_version` は `2` 固定みたいですね。

ちゃんと公式を確認してから開発始めたほうがいいと思います。

## Gsuite使っている人向け

Chrome拡張の開発と公開は普通5ドルの課金が必要ですが、同じGsuite内だけの配布なら課金なしで始めれるので、社内ツールとか作るのはとてもよいと思いました。

## ゆる募

- スタイルあててくれる人
- アイコン作ってくれる人

## 最後に

読んでいただきありがとうございました！！
gitignoreに入れたのにファイルが差分表示され続ける問題を解決した

# 概要
- gitignoreに入れたのに、差分が出た時にコミット対象に表示され続ける
- 一度コミットしてしまっている

ビルドしたり、新しいパッケージを入れたり、マイグレートしたりすると、
自動生成されるあのファイルとかこのファイルとかをコミットするのは結構不毛です

# 解決法：追跡を停止する

## コマンド
```git
git rm --cached path/to/filename
```

- `--cached`オプションで、インデックスのみ削除し、作業ツリーにファイルを残す。
- その後コミットする


## SourceTreeの場合
- 対象ファイルを右クリック → 「追跡を停止する」を選択
- 削除状態になるのでコミットする（ローカルのファイル自体は消えてない）

# まとめ
- 無視したいファイルをコミットしてしまった場合は、追跡を停止しよう

# 参考
- [gitで、追跡対象ファイルの外す（追跡をやめる）方法。](http://www-creators.com/archives/1748)
VSCodeを快適に使うためのコマンド類

最近見つけたいい感じのコマンド類

# 分割したエディタグループ間でのカーソル移動
`Ctrl + K + Ctrl + 各種方向キー:Focus XXX Editor Group`
エディタ分割時に利用。
非常に便利な機能なのだが、ショートカットキーのが非常に押しにくい。
左手でCtrlを押しながら右手でK=>方向キーと押す想定だろうか。

# サイドバー周り
## サイドバーをToggleする
`Ctrl + B:Toggle Side Bar View`
画面を広く使いたい時に

## サイドバーの右左を切り替える
`ショートカットキーなし:Toggle Side Bar Position`
最初は何だこれと思った機能ですが、使ってみると非常にいい感じ。
アドレスバーを右に縦置きしたいがためにVivaldiを使っている私のような人間にはお勧め。

## サイドバーにフォーカス
`Ctrl + 0:Focus on Side bar`

# TerminalなどがあるPanelを閉じる
`ショートカットキーなし:Close Panel`
結構使いそうな気がものの、ショートカットキー無し。
エディタを縦にも分割する場合、不要な時に閉じるだけで大分快適になる。
ちなみに、Panelを閉じるだけでそこに表示されるTerminal等は生きているのでご安心

# 文字列のケース変換
実は、かなりのパターンがデフォルトで実装されている。

* Change Case Camel
* Change case pascal
* Change Case snake
* Change Case Upper First 
* Change Case title

など。

# エディタのパンくずリストを使う
`Ctrl+shift+. :Focus on breadCrumb ` 
これはかなり便利。
languageモードに応じて自動でパンくずリストを作成して任意の場所に移動できる。

# 検索/置換周り
キーボードだけで行けないかなと思っていたら検索窓のほぼ全ボタンにショートカットキーがついていた。

* Ctrl + F で検索
* Ctrl + H で置換
* Alt + R で正規表現 ON/OFF
* Alt + L で選択行のみ
* F3　で次のマッチ
* Alt + C Case Sensitiveかどうかの切り替え         
* Shift + F3で前のマッチ
* Ctrl＋Shift+1で一件置換
* Ctrl⁺Alt+Enterで全件置換
* Escで閉じる

微妙に法則性というか一貫性がないキー配置なのが気になるものの覚えればなかなか便利。
azコマンドで使うAzureサブスクリプションの変更

## サブスクリプションの変更

Azureの試用期間が終わり「無料試用版」を「従量課金」サブスクリプションに切り替えたがazコマンドで従量課金のサブスクリプションが適用されず今まで使っていたazコマンドが動かない。

次のようなメッセージがでる。

```text
The subscription 'XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX' is disabled and therefore marked as read only. You cannot perform any write actions on this subscription until it is re-enabled.
```

デフォルトのサブスクリプションの変更方法が[複数の Azure サブスクリプションの使用](https://docs.microsoft.com/ja-jp/cli/azure/manage-azure-subscriptions-azure-cli?view=azure-cli-latest)に載っている。

```shell-session
$ az account list --output table --all                                                                                                                                                
Name        CloudName    SubscriptionId                        State     IsDefault
----------  -----------  ------------------------------------  --------  -----------
無料試用版  AzureCloud   XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX  Disabled  True
従量課金    AzureCloud   YYYYYYYY-YYYY-YYYY-YYYY-YYYYYYYYYYYY  Enabled   False
$
```

デフォルトの変更

```shell-session
$ az account set --subscription YYYYYYYY-YYYY-YYYY-YYYY-YYYYYYYYYYYY                                                                                                                 
```

これでデフォルトが切り替わりました。

```shell-session
$ az account list --output table --all                                                                                                                                               
Name        CloudName    SubscriptionId                        State     IsDefault
----------  -----------  ------------------------------------  --------  -----------
無料試用版  AzureCloud   XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX  Disabled  False
従量課金    AzureCloud   YYYYYYYY-YYYY-YYYY-YYYY-YYYYYYYYYYYY  Enabled   True
$
```
MySQL(5.7以降)のパスワードポリシーが厳しいので変更する。Your password does not satisfy the current policy requirementsの対処法

# 概要

タイトルの通り

ポリシーに準拠していないパスワードは設定できない

```
mysql> ALTER USER 'root'@'localhost' identified BY 'password'
    -> ;
ERROR 1819 (HY000): Your password does not satisfy the current policy requirements
```
# MySQLのパスワードポリシー

|レベル|長さ|文字種類|単語一致|
|:-----------------|------------------:|:------------------:|:------------------:|
| LOW|8文字以上|||
| MIDEUM|8文字以上|アルファベット大文字、アルファベット小文字、数字、記号の4種を含める||
| HIGH|8文字以上|アルファベット大文字、アルファベット小文字、数字、記号の4種を含める|4文字以上の部分文字列が辞書ファイル内の単語と一致してはならない|

# 手順

1.デフォルトのパスワードポリシーの設定を確認する

```
mysql> SHOW VARIABLES LIKE 'validate_password%';
+--------------------------------------+--------+
| Variable_name                        | Value  |
+--------------------------------------+--------+
| validate_password.check_user_name    | ON     |
| validate_password.dictionary_file    |        |
| validate_password.length             | 8      |
| validate_password.mixed_case_count   | 1      |
| validate_password.number_count       | 1      |
| validate_password.policy             | MEDIUM |
| validate_password.special_char_count | 1      |
+--------------------------------------+--------+
7 rows in set (0.03 sec)
```

2.パスワードポリシーをLOWに変更する

```
mysql> set global validate_password.policy=LOW;
```

3.変更後のパスワードポリシーの設定を確認する

```
mysql> SHOW VARIABLES LIKE 'validate_password%';
+--------------------------------------+-------+
| Variable_name                        | Value |
+--------------------------------------+-------+
| validate_password.check_user_name    | ON    |
| validate_password.dictionary_file    |       |
| validate_password.length             | 8     |
| validate_password.mixed_case_count   | 1     |
| validate_password.number_count       | 1     |
| validate_password.policy             | LOW   |
| validate_password.special_char_count | 1     |
+--------------------------------------+-------+
7 rows in set (0.00 sec)
```

これで完了

# 環境

Mac OS: Mojave Version10.14.6
MySQL: Version8.0.17
MySQLはHomebrewでinstallした。
ubuntu18.04 + OWASP ZAP でWEB脆弱性診断

##OWASP ZAP
無料でWebアプリケーションの脆弱性を診断できるアプリ

##手順
1. Java 8 以上をインストール(OWASP ZAPの 2.8.0以上を動かすために必要なため)

2. OWASP ZAP を[インストール](https://github.com/zaproxy/zaproxy/wiki/Downloads)

##JDKのインストール

aptコマンドでJDKをインストールする。

```bash
$ sudo apt install default-jre openjdk-11-jre-headless
```

念の為Javaのversionを確認
8以上が入っていたらOK

```bash
$ java -version
openjdk version "10.0.1" 2018-04-17
OpenJDK Runtime Environment (build 10.0.1+10-Ubuntu-3ubuntu1)
OpenJDK 64-Bit Server VM (build 10.0.1+10-Ubuntu-3ubuntu1, mixed mode)
```

##OWASP ZAPのインストール

前述のリンクから"Linux Package"をインストールする。

インストールしたファイルを解凍

```bash
$ tar xvfz ~/Downloads/ZAP_2.8.0_Linux.tar.gz
```

ZAPは zap.shを呼び出して起動できる。

##ZAPを起動
解凍したZAPのディレクトリに移動

```bash
$ cd ~/ZAP_2.8.0
```

```bash:/ZAP_2.8.0
$ sh ./zap.sh
```

無事ZAPが起動できた！！

![Screenshot from 2019-08-30 11-19-47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/470166/13d413d8-aff8-8f6e-face-8832689d678a.png)

##実際にOWASP ZAPを使って脆弱性診断

###簡易スキャン
下記の画像の簡易スキャン(Automated Scan)をクリックする。
![Screenshot from 2019-08-30 11-19-47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/470166/99f7e17e-b4bd-6d7a-0b67-9aea3d116079.png)

脆弱性を診断したい自分の保持しているWebサイトのURLを入力して攻撃ボタンを押す。

![Screenshot from 2019-08-30 12-33-18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/470166/42e41e71-6f04-8c0f-ae68-e9ede1a2703d.png)

Webサイトの規模により実行時間は異なるが、脆弱性が見つかれば警告欄に問題になっているURLと脆弱性の種類が報告される。

![Screenshot from 2019-08-30 12-30-48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/470166/7ccb9139-a74e-29f1-56b1-defc8f55f32b.png)



###静的スキャン
先程のクイックスタート画面から静的スキャン(Manual Explore)をクリックする。

自分の保有しているWebサイトのURLをクリックして
ブラウザを起動する(Launch Browser)ボタンをクリックする。

![Screenshot from 2019-08-30 12-32-51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/470166/487f87c6-3ae7-49e1-9694-296c50fb6586.png)

するとZAP経由でブラウザが開き、先程入力したURLにアクセスされる。そこで、実際にWebサイトのリンクをクリックしたり、様々な操作を行う。そこで行った操作に対してZAPが脆弱性を検出していく。

検出された脆弱性は簡易スキャンと同じように警告欄に表示される。



###動的スキャン

![Screenshot from 2019-08-30 12-56-36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/470166/19cacc01-56b3-99b7-853a-af7f9e51042b.png)

画像の"Sites"以下から自分の保有しているWebサイトのURLを探し、右クリック、攻撃(Attack)、動的スキャン(Active Scan)を選択する。

するとダイアログが表れるのでStart Scanを実行する。

静的スキャンを行った結果を元にZAPが動的にスキャンしてくれる。簡易スキャンに比べて膨大な量のリクエストが送られる。




##参考
https://qiita.com/thestewedrabbit/items/1518f12eb12abee7f8d6

https://github.com/zaproxy/zaproxy/wiki/Downloads

https://www.shadan-kun.com/blog/vulnerability/2961/
wordpressのビジュアルエディタで見出し付けをマークダウン形式でする方法

以前こちらの記事でwordpressのビジュアルエディタでショートカットで見出し付けをする方法をメモしましたが
https://qiita.com/a-nishimura/items/287c04a4fbc8142a6961
マークダウン形式でも見出し付けできたので追加でメモです。

## マークダウン形式で見出し付け

``` ## 見出し２サンプル ```と入力する
<img width="375" alt="スクリーンショット 2019-08-30 11.10.59.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/452135/183a3949-fb58-ecb8-983a-c87a676078a7.png">
で、改行箇所でEnter
<img width="414" alt="スクリーンショット 2019-08-30 11.11.29.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/452135/de8f617f-33fa-db57-9128-f3dce8b98c34.png">

h2タグに自動変換されます

次に、#3つで```### 見出し３test```と入力する
<img width="395" alt="スクリーンショット 2019-08-30 11.11.45.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/452135/dcad41e4-329d-ad3a-ddee-73bacd9248a1.png">

で、Enter
<img width="422" alt="スクリーンショット 2019-08-30 11.11.51.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/452135/2eee33f6-5d96-f9d2-bcd8-9a6b80f1b476.png">
h3タグもいけました

<img width="401" alt="スクリーンショット 2019-08-30 11.13.17.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/452135/9bc4ee10-8a46-8da1-31ac-1eefc8f6882c.png">

ちなみに見出し２〜見出し６はできました。7以降はないのでそのまま「#」文字として認識されます。

ただ、
見出し１（h1タグ）だけは効かなかったので「#」１個の形式は見出しと認識すると通常のシャープとして使いたい場合に問題があるので対応していないのかもしれません。

まあh1タグは執筆中に頻繁に使わないので問題なし。h2以降が使えるだけでも十分便利です！
iTunes Search APIを使ったWEBサービスの備忘録

Apple社が提供するiTunes Search APIを使ったWebサービスを作ったのでその際のちょっとした覚書をまとめておく。

作ったサイトはこちら
[Bestap -ベスタップ- iOS,Androidの人気アプリのランキング分析サイト](https://www.bestap.net/)

iTunes Search API(https://affiliate.itunes.apple.com/resources/documentation/itunes-store-web-service-search-api/) はAppleのiTunes上の様々なメディアを検索することのできるAPI。アプリや音楽はもちろん、映画や電子書籍の検索も可能。
取得できる情報はタイトルや作者名はもちろん、価格や星の数にリリース日、説明文やスクリーンショットまでiTunes上に表示されるほぼ全ての情報をカバーしている。

APIを使用する際にはAPIのパッケージをインストールしたり、キーを登録したりするなどの手続きは不要で、APIのURLにアクセスすればJSON形式のデータを受け取ることができる。

特定のキーワードに関連するアプリを取得するときは
https:// itunes.apple.com/search?term=検索語句

アプリの詳細情報を取得するときは
https:// itunes.apple.com/lookup?id=アプリのID

言語や検索結果の数などはオプションで細かく指定できるので、詳しくは本家のマニュアルや関連サイトをご参照いただきたい。

アイコンやスクリーンショットのURLも網羅されているのでiOSアプリ関連の情報を集めるにはこれひとつあれば完璧といえる。

呼び出し制限は明示的にはないものの、実質的には制限があるという情報もあるので常識的な範囲での呼び出しを心がけたい。
社内環境からEC2のSSH(備忘録)

# きっかけ
社内環境からAWSを利用しようとしたのですが、自分の社内環境がどうも、SSH(22ポート)を許してないみたいだったため、何かやる方法がないかと調べてみた内容(昔調べて忘れてたの忘れていたので)を備忘録として残してます。

# 参考サイト
https://blue21neo.blogspot.com/2015/08/aws-443-ssh.html

# やり方
「手順 3: インスタンスの詳細の設定」のところにある「高度な詳細」で、EC2インスタンスを起動するときにコマンド実行を設定できるそうなので、以下の設定をいれておく。

```bash:sshd_config
#!/bin/bash
echo            >> /etc/ssh/sshd_config
# https(443)に設定
echo "Port 443" >> /etc/ssh/sshd_config　
```

# 感想
(社内だと使えるツールの制限があるから便利でした)
GORM エラーハンドリング


```golang

user, err := module.Configure.Repositories.UserRepository.FindByID(id)
// データがない時のエラー
if err == gorm.ErrRecordNotFound {
	c.JSON(http.StatusNotFound, gin.H{"error": fmt.Sprintf("reservation number not found")})
        return
}
// その他のエラー
if err != nil {
　　　c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
　　　return
}
```


``` err == gorm.ErrRecordNotFound ``` の時は　```http.StatusNotFound```
``` http.StatusInternalServerError```
``` http.StatusBadRequest```

```go

http.StatusNotFound  404 
// 欲しいデータが見つからない。
http.StatusBadRequest 400
// リクエストがおかしい
type reqParams struct {
    user_id  uint64
}
なのにstring でパラメーターを送ってしまったとか。

http.StatusInternalServerError  500
// サーバーと接続ができない
//サーバーがダウンしているなど。
EclipseでGitを使う stash編

# 背景・対象
- 弊現場ではEclipse上でGitの操作を行う運用となっており、そもそもcommitとpushくらいしか分からないという人も少なくない。
- その他の細かな操作のマニュアルが欲しいということで少し調べてみたが、Eclipseでの利用を前提としたGit関連の詳細な記事が意外と少ない。
- ほぼ弊現場向けではあるが、同じく悩んでいる~~レガシィ環境下の~~エンジニアは少なくないだろうと思い、せっかくなので記事として残すことにした。
- commitとpushくらいしか使ってない、ブランチの概念はなんとなく知ってる程度の人向け。
- 環境構築、リポジトリの初期設定などは済んでいる前提。
- Pleiadesのバージョン4.5.2で説明する。
- シリーズ記事になるかもしれないしならないかもしれない。

# スタッシュ(stash)とは？
スタッシュそのものの説明に関してはこちらの記事が大変わかりやすい。
[『変更を一時的に退避！キメろgit stash』](https://qiita.com/fukajun/items/41288806e4733cb9c342)
要するに変更をコミットせずに退避する。
コミットしていないファイルが存在しているとブランチの切り替えができない。作業中のブランチとは別のブランチの作業が入ってしまった際などに使える。割り込みタスクはよくあること。

# スタッシュってどこにある？
プロジェクトを右クリック -> チーム -> Stashes で出てくる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254259/7fb49f20-736b-ff77-6fe8-1370aa3a17f8.png)

# つかいかた
1. プロジェクトに変更がある状態で、**｢変更をスタッシュ｣**を選択する。
2. スタッシュの名前を入力する。**｢未追跡ファイルを含む｣**にチェックを入れない場合、新規追加されたファイルはスタッシュに含まれないので注意。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254259/1a0702ee-2e60-6c0b-3ed4-27d6a235411a.png)
3. プロジェクトの変更状態マークが消えるので、別のブランチに切り替えて割り込みタスクを片付ける。
4. スタッシュを行ったブランチに戻り、先ほど作成したスタッシュを選択する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254259/bea24479-a4ee-c577-996b-be67455726fd.png)
5. 退避された変更ファイルの一覧が出るので、確認して右上の適用ボタンを押す。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254259/fa17b723-4d59-f0ba-4594-477e390bbf13.png)
6. 適用しただけではスタッシュの削除は行われない。作業を続行しコミットが済んだらスタッシュを削除しよう。

# 注意事項
- プロジェクト全体でスタッシュを作成するため、ファイル単位でのスタッシュはできない。ただしEclipseでは｢未追跡ファイルを含む｣のチェック有無で変更ファイルと追加ファイルでスタッシュを分けることは可能。
- スタッシュは作成ブランチに紐づいているため、異なるブランチで作成したスタッシュを適用することはできない。そういうことをしたいのならチェリー・ピック(cherry-pick)でも使ったほうがよい。
- スタッシュ作成時とブランチの状態が変わっていると適用に失敗する可能性がある。例えばスタッシュしてからブランチのリベースを行った場合など。Eclipseの場合、スタッシュの適用に失敗すると中途半端に適用された状態になってしまい、マージツール無しの手作業での修復が必要となる。まだしもマージツールが使える苦肉の手段として、作業途中でもコミットしてしまってからリベースしてコンフリクトを解消し、リベースが済んだらリセットでコミットを取り消すという手も。
- 以上の内容は弊現場での環境下で確認されている事象であり、Eclipseならば必ずこうなるという話ではないのであしからず。また表現に関して厳密でない点へのマサカリはお手柔らかに。
- スタッシュは、退避してそのまま戻す使い方さえしていれば普通は特に問題が起こることがない。それ以外の使い方はしないほうが良い。

# その他参考になりそうな記事
[『EGit逆引きリファレンス（ブランチ操作関連）』](https://qiita.com/t-mito/items/977013ca3c30db7450ec)
Pleiadesではないがスクショ付きでさらっと解説してあり見やすい。
MySQLでrootユーザーのパスワード忘れてしまった際に初期化・再設定する方法【Mac OS】

# 環境

Mac OS: Mojave Version10.14.6
MySQL: Version8.0.17
MySQLはHomebrewでinstallした。

# 手順

1.MySQLサーバープロセスを停止する（起動していなかったら不要）

```
# mysql.server stop
```

2.MySQLサーバープロセスをセーフモードで起動するその際プラグインをロードしない
（パスワードなしでのログインが可能になる）

```
# /usr/local/bin/mysqld_safe  --skip-grant-tables
```

3.MySQLへrootユーザーでログインする
※「2.」を行ったためパスワードの入力が不要

```
# mysql -u root
```

4.パスワードを空で設定する

```
mysql> UPDATE mysql.user SET authentication_string=null WHERE User='root';
```

5.MySQLをログアウトする

```
mysql> exit
```

6.MySQLサーバープロセスを再起動する

```
# mysql.server restart
```

7.MySQLへrootユーザーでログインする

パスワードは先程設定した空なので何も入力せずエンターを押下する

```
# mysql -u root -p
Enter password:
```

8.rootユーザーのパスワードを変更する
※ 'password'の部分にMySQLのパスワードポリシーに準拠した任意のパスワードを入力する

```
mysql> ALTER USER 'root'@'localhost' identified BY 'password';
```
コンテンツブロッカー設定がWebViewの異常動作の原因になることがある

対応に地味に時間がかかったので、備忘録として。

### TL; DR
1. コンテンツブロッカーで強力なブロック設定をされると、JavaScript(JS)無効化と同等の状態になることがある
2. `SFSafariViewController`もその影響を受けるため、異常動作の原因になる

### 経緯
1. `SFSafariViewcontroller`を利用している画面での不具合について問い合わせがあった
1. 設定アプリ内でJSが無効化[^1]されていると当該事象が発生することを確認
1. 対処方法を案内したところ、無効化設定はしていないとの回答
1. 各種設定の変更を試した結果、コンテンツブロッカーで強力なブロック設定(※)をしていると、JS無効化時と同様の事象が発生

- ※: Firefox focus[^2](v8.1.2)の場合、環境設定 > トラッキング防止 > 他の追跡コンテンツをブロック
    - 画面内一番下の項目でデフォルトでオフ。さらに、オンにする際は正常に表示できなくなる危険性を伝えるアラートが出る

### 対応
このケースの場合、対応は**コンテンツブロッカーの無効化**をお願いすることのみ
ただし、方法は２通りある

1. コンテンツブロッカーの設定を一時的に変更してもらう
  - 対象となる項目は使用しているものにより異なるが、JS無効化と同等の状態になるような設定は上述の通り比較的深い階層にある
1. ページを表示中にリロードボタン長押し > 「コンテンツブロッカーなしで再読み込み」 をタップ  
<img width="375" alt="IMG_5364.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/124121/c4384600-93a8-70f3-617b-c15e88afd5c2.png">

画面が１ページしかないような場合には後者の方法が簡便だが、複数ページに渡るような導線の場合には、前者の方法での対応が良いと思われる

### 参考
[^1]: 設定 > Safari > 詳細 > JavaScript をオフ
[^2]: https://apps.apple.com/jp/app/id1055677337
debファイルをダウンロード

Cydia等のインストーラでインストールすればdebファイルを意識する必要がありませんが、気に入ったAppをバックアップしたい場合はdebファイルを保存しておけば安心なこともあると思います。

インストーラがリポジトリからdebファイルをダウロードして、インストールが終わってもリスプリングするまでならdebファイルが削除されずに残ってるので、リスプリングする前に別な場所へ保存しとくという方法もありました。

### リポジトリから直接ダウンロードする。
あるJBTweakのdebファイルを探していたら、素敵な記事を見つけたのでメモを残すことにしました。
[リポジトリから直接debダウンロード | NEXTi4HACK.com](https://nexti4hack.com/%E3%83%AA%E3%83%9D%E3%82%B8%E3%83%88%E3%83%AA%E3%81%8B%E3%82%89%E7%9B%B4%E6%8E%A5deb%E3%83%80%E3%82%A6%E3%83%B3%E3%83%AD%E3%83%BC%E3%83%89/)

- リポジトリ
    - http://tigisoftware.com/cydia/
- パッケージの情報
    - Packages
        - http://tigisoftware.com/cydia/Packages
    - Packages.gz
        - http://tigisoftware.com/cydia/Packages.gz
    - Packages.bz2
        - http://tigisoftware.com/cydia/Packages.bz2
- debファイル
    - filename:に続く`./`以降をリポジトリURLに加えます。
    - ./xxxx.debだった場合次のようにつないだのがdebファイルのURLになります。
        - http://tigisoftware.com/cydia/xxxx.deb
    - Filza File Manager 64-bitの場合は、`./com.tigisoftware.filza_3.7.0-18_iphoneos-arm.deb`なのでdebファイルのURLは次のようになります。
        - http://tigisoftware.com/cydia/com.tigisoftware.filza_3.7.0-18_iphoneos-arm.deb
Firefox70以上で上タブを非表示にする

## ①プロファイルを開く
**about:support**から**フォルダを開く**
![スクリーンショット 2019-08-30 10.08.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112460/de11e23c-c769-b391-b13b-4d32fd2fedd2.png)

## ② userChrome.cssの作成
**chrome**フォルダの作成。
その中に**userChrome.css**を作成し以下のコードを追加
> *#**tabbrowser-tabs* {
>   visibility: collapse !important;
>   }

## ③userChrome.cssを有効にさせる
**about:Config**から**toolkit.legacyUserProfileCustomizations.stylesheet**の値を**true**に変更
![スクリーンショット 2019-08-30 10.11.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112460/73304449-a4ea-eb00-e9d7-40a3ab767530.png)

## はい完成
![スクリーンショット 2019-08-30 19.11.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112460/d3f12daa-ea5f-b687-5331-a435f5a4c396.png)
PyCharmを使ってdocker-composeのinterpreter上でDjangoのカスタムコマンドをデバッグする

# やりたいこと
- PyCharm上でdocker-composeをinterpreterに指定している状態で、<br>
そのコンテナ内でDjangoのカスタムコマンドを起動してブレークポイントなどのデバッグをしたい

# 前提
- Docker Composeで構築されるコンテナがInterpreterに指定されていること。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167177/bd93e6ad-f900-9d8c-9f70-362cb2302eb0.png)

# 手順
- `[Run / Debug Configuration]` に設定を追加します。
    - `[Edit Configurations...]` を選択して、`[Run / Debug Configuration]`の設定画面を開きます。
- 左上の + ボタンから `[Add New Configuration]` のリストを開き、 `Django server` を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167177/bd15a4a8-2435-66d1-f895-e483493adbba.png)

- 以下のように、`Custom run command:` に実行したいコマンド名を入れます。
- コマンドに渡す引数があれば、`Additional options:`に追加します。
- HostやPortは環境に合わせて設定してください。 (私の環境下だとどちらも空で問題ありませんでした。)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167177/d6fe4b27-8008-b77c-3ddf-b70cf733f711.png)

- ここまで設定できたら、`Apply` してデバッグ実行することで、通常のrun_serverと同様にブレークポイントで止めたりといったデバッグが可能になります:tada:
Firebase Test Labのcloudtestingscreenshotter_libでスクリーンショット名に日本語を使ったらダメだった件

Firebase Test Labでスクリーンショットを撮るために cloudtestingscreenshotter_lib というライブラリが提供されています。（ライブラリのDL、導入方法などは下記公式ページへ→ [Firebase Test Lab インストゥルメンテーション テストのスクリーンショットを作成する](https://firebase.google.com/docs/test-lab/android/test-screenshots)）

```kotlin
ScreenShotter.takeScreenshot("main_activity", activity)
```
↑のようなコードでスクリーンショットを撮ることができるのですが、引数で指定しているスクリーンショット名（上記のコードでは `"main_activity"`）に日本語を使ったらダメだったというお話です。

# 何故かテストが「不確定」となって終わってしまう
Firebase Test Labを定期実行させているのですが、いつぞやのタイミングから「不確定」というステータスでテストが終わってしまうようになりました。

<img width="965" alt="スクリーンショット 2019-08-30 8.04.14.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/995/76215b30-8bcc-305b-60e0-3e2759b6bdba.png">

CI上のログから **ERROR: (gcloud.firebase.test.android.run) Firebase Test Lab infrastructure failure: Exhausted test run attempts** というエラーメッセージが出ており、Freeプランで使っているから何か制限をオーバーしたのかな？と思ったりしたので、数日様子見。
しかし数日経っても状況は変わらずで、Consoleからもこれ以上の情報を得ることができず、途方にくれてました。

# Firebase Slackコミュニティで質問してみた
どうしようもないので、*「明確な結果が得られずお困りの場合は、Firebase Slack コミュニティの #test-lab チャンネルにご参加ください。」* とあったのでSlackで質問してみました。

[Firebase Community Slack](https://firebase.community/)には、各サービスごとにチャンネルがあり、そこの **#test-lab** で質問をしました。

内容としては
> `ERROR: (gcloud.firebase.test.android.run) Firebase Test Lab infrastructure failure: Exhausted test run attempts` というエラーが出てしまっています。フリープランで使ってるけど、上限はオーバーしてないんだけど :thinking: 

みたいな感じです。（ちなみにめっちゃ拙い英語で送りました:baby:）

# Googlerから返信が来た :smile: 
1日もしないうちに返信が来ました。
内容としては
>「スクリーンショット名をasciiにして、もっかい試してほしい」

みたいな感じで、 `This is the error we see on our side: （エラー文）` とFirebase側のエラーの内容も添付してくれました。（SlackのDM）

エラーの内容を見ると、いつぞやのタイミングで追加したテストで、スクリーンショット名に日本語が含まれているやつが原因っぽいことがわかりました。

# スクリーンショット名はASCII文字で
すぐさまスクリーンショット名に日本語を指定しているところを直して、Firebase Test Labでテストを走らせたら、問題なく実行されました。
**スクリーンショット名には日本語など含ませず、ASCII文字でやる必要がある** ということがわかりました。

# まとめ
- `cloudtestingscreenshotter_lib` でスクリーンショットを撮るときは、スクリーンショット名に日本語を指定してるとダメだった:warning:
- FirebaseでわからないことがあったらSlackで質問をするとGooglerが返信してくれる:relaxed:
GStreamer備忘録

# デバイスを探す

```bash
gst-device-monitor-1.0 
```
{device-path}の値を探す

インストーラーで`complete`を選択していないと、Video/Sourceが見つからないようです。

# windowsでUSBカメラからRTPストリームを転送する

```bash
./gst-launch-1.0 ksvideosrc device-path="{上で見つけたPath}"
! videoscale ! video/x-raw,width=320,height=240,framerate=4/1
! videorate ! videoconvert ! timeoverlay
! vp8enc error-resilient=1 ! rtpvp8pay 
! udpsink host={転送先アドレス} port={port}
```

**video/x-raw**

YUY形式など無圧縮の生データを取り出す

**width=320,height=240,framerate=4/1**

幅320px高さ240pxフレームレート1/4=4fps

**vp8enc**

VP8でエンコードしたものを出力
【速報】Ruby 2.7 の Numbered parameters が @1 から _1 に変更され、pipeline 演算子が見送りになった

[ブログ記事](http://secret-garden.hatenablog.com/entry/2019/08/29/204108)からの転載です。


## Numbered parameters の記号が `@1` から `_1` へ変更へ

表題通りなんですが Ruby 2.7 で導入予定であった Numbered parameters の記号が `@1` から `_1` へと変更になりました。

* [Misc #15723: Reconsider numbered parameters - Ruby master - Ruby Issue Tracking System](https://bugs.ruby-lang.org/issues/15723#note-126)

> After discussion and consideration, we picked _1, _2... as numbered parameters. I investigated replaced examples, the current @1 etc. are too confusing with instance variables. So I picked underscore for numbered parameters (a la Scala). We didn't choose Scala's default parameter (_), because it is confusing from my view.
>
> The whole parameter (e.g. |a|) can be captured using _0. The _0 part is kind of compromise, but I think it's acceptable.
>
> The bare _1 etc. in the current code will be warned. You can use those identifiers as local variable names or method names, but they are not recommended from 2.7 and later. And they might be prohibited in the future.
>
> Matz.

と、言う感じに matz の意向により Numbered paramters が `@1` から `_1` へと変更（予定）となりました。
個人的にはまあ〜〜〜〜 `it` よりはマシなんだけど〜〜〜既存のコードに対して破壊的変更になるのがな〜〜〜やっぱり嫌だな〜〜〜〜。
っていう気持ち。
<del>ぶっちゃけ自作 gem で `_1` とか使っているのでホントやめてほしい破壊的変更やめろ！！！！</del>
まあでも matz がいうならしょうがないかなあ〜〜〜〜〜〜という気持ちしかないにゃんねえ…。
少なくとも Numbered parameters 自体が削除されるよりは…。
細かい挙動とか `@1` と差異があるのでそのうちまとめたい。


## pipeline 演算子がお蔵入り

Ruby 2.7 で pipeline 演算子が導入される予定だったんですが、いろいろとあり Ruby 2.7 に入ることは断念されました。

* [Feature #15799: pipeline operator - Ruby master - Ruby Issue Tracking System](https://bugs.ruby-lang.org/issues/15799#note-46)

> After experiments, |> have caused more confusion and controversy far more than I expected. I still value the chaining operator, but drawbacks are bigger than the benefit. So I just give up the idea now. Maybe we would revisit the idea in the future (with different operator appearance).
>
> During the discussion, we introduced the comment in the method chain allowed. It will not be removed.
>
> Matz.

pipeline 演算子に関しては[こちら](http://secret-garden.hatenablog.com/entry/2019/06/14/002651)を参照。
まあ〜〜〜これも機能としてはほしいので pipeline 演算子ではなくて全然別の機能として復活してほしい気持ちですねえ。
果たして Ruby 2.7 は最終的にどうなるのか…。
PHP CodeSnifferでエラーは検出するが警告は黙らせたい場合

CIでPHP CodeSnifferでチェックするとき、
エラーは検出したいけど、警告は対象としたくないという場合があるかと思います。
ググったところすぐにやり方が見つからなかったのでここに記しておきます。

いろいろやり方はあるかと思いますが、コマンドのオプションを指定することで解決するやり方を紹介します。
コマンドのオプションに`--warning-severity`を指定すれば警告を黙らせることができます。

たとえば`Line exceeds 120 characters;`の警告を対象から外したい場合、

```
vendor/bin/phpcs --warning-severity=6 --standard=PSR2 ./src
```

というようにwarning-severityのレベルを6以上を設定すると黙らせることができます。
もちろん警告だけでなくエラーのレベルも`--error-severity`で指定することができます。

詳しくは [公式のドキュメント](https://github.com/squizlabs/PHP_CodeSniffer/wiki/Advanced-Usage#filtering-errors-and-warnings-based-on-severity) をご参照ください。
Nextcloud 17 ベータ3 がリリースされました

Nextcloud の次期メジャーバージョンである Nextcloud 17 の実装機能が凍結され、ベータ版がリリースされておりますが、早くも3つ目のベータ版である **Nextcloud 17 Beta3** がリリースされました。

※ダウンロードはここから: [Nextcloud 17 beta 3](https://download.nextcloud.com/server/prereleases/nextcloud-17.0.0beta3.zip)

今後はバグ修正や洗練を重ねて、予定では、2019年9月26日に正式リリース予定となっております。

### Nextcloud 17 今後のリリーススケジュール

* Beta 1: 2019-08-15
* Beta 2: 2019-08-22
* Beta 3: 2019-08-29　**← NOW !!**
* Beta 4: 2019-09-05
* RC 1: 2019-09-12
* RC 2: 2019-09-19
* Release: 2019-09-26

Nextcloud 社では、自動テストや動作確認のためのスモークテストは行っているものの、無数の使い方をテストすることを置き換えることはできないとして、引き続きテストの支援を求めています。バグ修正はもちろん、小さな UI 改善、細かい修正などのため多くのみなさまのテスト支援を求めています。

早速ダウンロードしてインストールしてみました。Beta 2 から目立った変化はありませんでしたが、新規ユーザーが追加できない不具合があるようです。
`password_policy` プラグインでエラーが発生しているようですので、`occ app:disable password_policy` と本プラグインを無効化すれば登録できるようになります。  

**(実行例) Webサーバとして Nginx を利用している場合**

```
sudo -u nginx php /var/www/html/nextcloud/occ app:disable password_policy
```
またアプリについては、グループフォルダ、外部ストレージ連携、ファイルアクセスコントロール、カレンダーなどよく利用されると思われる公式アプリでも引き続き未対応のものが多く、これから少しずつ対応するものが増えてくると思われます。

★参考： [Nextcloud 17 ベータ1 がリリースされました](https://qiita.com/S_Katz/items/b9cf53efc0df27f0b21d)

**★この記事は、[スタイルズ社のNextcloudサイト](https://nextcloud.stylez.co.jp/) の [Nextcloudブログ](https://nextcloud.stylez.co.jp/nextcloudblog)にも公開しております！**
SynchRoid（BizRobo/KAPOW）で動きが遅いと感じたら

PCのメモリはそこそこあるのに、動きが遅いとか、止まってしまうと言われたときに、
言われてからいつも多い出す　DesignStudio.conf　（memory.conf）

インストール時の初期値はこちら↓

◆DesignStudio.conf
　#wrapper.java.maxmemory=1024

◆memory.conf
　wrapper.java.maxmemory=1024


PCのスペックに関わらず「1024」しか使わない（？）状態になってます。。。
メモ帳等で開いて、「1024」を「2048」や「4096」に変えて保存することで
使用メモリを増えるようで動きが良くなる様です。

◆DesignStudio.conf
　wrapper.java.maxmemory=4096

◆memory.conf
　wrapper.java.maxmemory=4096

confファイルの書き換えなので、すべての方に案内して良いのか悩みどころです。。。

目にされた方、アドバイスをお願いします<(_ _)>
「あ」を UTF-8 エンコード

## 概要

- Unicode のことを調べて、何かわかった。
- UTF-8 のことを調べて、何かわかった。
- 試しに「あ」を手動で UTF-8 エンコードしてみようと思った。

そういうことになった。


## Unicode

Unicode は全世界の文字の `文字:コードポイント` セットのこと。一覧表は Wikipedia にありました。

- [Unicode一覧 0000-0FFF](https://ja.wikipedia.org/wiki/Unicode%E4%B8%80%E8%A6%A7_0000-0FFF)

Python では以下のように変換できます。

```python
# ord: 文字 -> コードポイント
ord('あ')   # 12354

# chr: コードポイント -> 文字
chr(12354)  # 'あ'
```


## UTF-8

上述した Unicode コードポイントを、**特定のルール**によって、バイト列に変換する方式です。バイト列については先日調べました。([バイト列ってなんなの](https://qiita.com/midoriiro/items/14f7eb963960bfb5d603#%E3%83%90%E3%82%A4%E3%83%88%E5%88%97%E3%81%A3%E3%81%A6%E3%81%AA%E3%82%93%E3%81%AA%E3%81%AE))

Python では以下のように変換できます。

```python
'あ'.encode('UTF-8')  # b'\xe3\x81\x82'
```

### 特定のルールとは

- まず文字のコードポイントを取得する。
- つぎに、以下のパターンに従ってバイト列(8桁2進数の連なり)をつくる。

|   コードポイントの値   |                                   バイト列の作り方                                   |
|------------------------|--------------------------------------------------------------------------------------|
| `7f(127)` まで         | コードポイントを7桁の2進数にし、<br>`0xxxxxxx` に当てはめる。                               |
| `7ff(2047)` まで       | コードポイントを11桁の2進数にし、<br>`110xxxxx 10xxxxxx` に当てはめる。                     |
| `ffff(265535)` まで    | コードポイントを16桁の2進数にし、<br>`1110xxxx 10xxxxxx 10xxxxxx` に当てはめる。            |
| `10ffff(1114111)` まで | コードポイントを21桁の2進数にし、<br>`11110xxx 10xxxxxx 10xxxxxx 10xxxxxx` に当てはめる。   |

- そして、完成したバイト列を16進数化することでエンコードの完了。


## 「あ」

Python で `'あ'` の UTF-8 エンコードを再現してみます。

```python
# 文字のコードポイントを取得します。 'あ' -> 12354
codepoint = ord('あ')

# 12354 だと「ffff まで」の分類になるので
# コードポイントを16桁の2進数にし、 1110xxxx 10xxxxxx 10xxxxxx に当てはめます。

# コードポイントを16桁の2進数にします。 12354 -> '0011000001000010'
codepoint_bin = '{:016b}'.format(codepoint)

# x に2進数を当てはめます。
bytes_bin = [
    '1110' + codepoint_bin[  : 4],  # '1110xxxx' -> '11100011'
    '10'   + codepoint_bin[ 4:10],  # '10xxxxxx' -> '10000001'
    '10'   + codepoint_bin[10:  ],  # '10xxxxxx' -> '10000010'
]

# 各バイト列を16進数に変換します。
def hex_(b):
    return '{:02x}'.format(int(b, 2))
bytes_hex = map( hex_, bytes_bin )  # '11100011' '10000001' '10000010' -> 'e3' '81' '82'

# くっつけます。
bytes_ = ''.join(bytes_hex)  # 'e3' '81' '82' -> 'e38182'

# bytes 型にします。
bytes_ = bytes.fromhex(bytes_)  # 'e38182' -> b'\xe3\x81\x82'

# 本当に UTF-8 になっているのか? デコードして確認してみよう。
print( bytes_.decode('UTF-8') )  # b'\xe3\x81\x82' -> 'あ'
```

やったあ。できました。このコードは、 `'あ'` でエンコードを試す実験なので汎用性はもちろんありません。
uITRON（FreeRTOSベース）Windowsシミュレータ

# はじめに

**QEMUでTOPPERS/ASPカーネルを動かす - 本編 - Qiita**
https://qiita.com/imagou/items/e532c00b3c0a0a800cda

にて、LinuxでRTOSをエミュレートすることには成功しました。万歳。

しかし、Windows環境しかない人に

**Ubuntuをインストールしてね！そしたらRTOSが疑似れるよ！**

というのは酷だなあ、ということで、Windowsシミュレータを作りました！
（厳密には「作る」というほど大袈裟ではないですが・・・）

# 本編

## 1. 準備

### 1-1. 環境

以下

- Windows環境

    Win10 Pro 64-bitで動作確認

- Visual C++ 2019

    Microsoft Visual Studio Community 2019 Version 16.2.3 で動作確認

- FreeRTOS v10.2.1

    特別ダウンロードしなくてもOKです


### 1-2. FreeRTOSとして動かす

（あえてURLは載せませんが）
FreeRTOSのサイトからダウンロードしたデモプログラムが、まんま動きます。

しかし、

**FreeRTOSのAPIは超絶わかりにくい、やっぱりuITRONだろ**

と思いました。
いや実際のところ、FreeRTOSはシンプルで非常によくできていると思うのですが、、、やはりuITRONへの馴染みは深いのであります。

## 2. 成果 - uITRONぽいもの

ということでいきなり成果物です（雑）。

ずばり、単純にuITRONのI/Fを間に挟んだものを用意しました。

**imagou/uITRON_based_on_FreeRTOS**
https://github.com/imagou/uITRON_based_on_FreeRTOS

ライセンスはGNU GPL v2です。FreeRTOSと同じですね。

## 3. 解説

### 3-1. ビルド方法

`uITRON_based_on_FreeRTOS\Demo\WIN32-MSVC-uITRON\WIN32.sln`
をVC++で開いて、ビルドするだけです。

### 3-2. 使い方

起動時のウインドウで、"help"と入力してください（雑）。

```Console
[TimerTask]: DELAY 3000ms
[TimerTask]: DELAY 3000ms
help

uTITRON (based on FreeRTOS) Demo Program
   1 - 15の数値    :   数値メッセージの送受信
   stop            :   受信タスクの一時停止
   start           :   受信タスクの再開
   lock            :   受信タスクのロック
   unlock          :   受信タスクのアンロック
   cyclic          :   周期ハンドラの開始/停止（初期状態は停止）
   alarm           :   アラームハンドラの開始/停止（初期状態は停止）
   exit            :   デモの終了
   help            :   このメッセージを表示
```

### 3-3. 解説

以下のタスク・ハンドラ（と機能）で構成されています。

* コマンドタスク（コマンドを受けてイベント発行）
* 送信タスク（イベントを受けてメッセージ送信）
* 受信タスク（メッセージ受信）
* タイマタスク（3000msec周期でログを出すだけ）
* 周期ハンドラ（1000msec周期でイベント発行）
* アラームハンドラ（5000msecで満了）

uITRONの以下の機能を有します。

* タスク関連（完璧ではない）
* イベントフラグ
* メールボックス
* ミューテックス
* 周期ハンドラ
* アラームハンドラ

ということで、まだまだ開発途上です。
（機会があれば、充実度を上げていきたいとは思っています・・・）

### 3-4. 注意

~~1msecのタイマティックがうまくないようで、かなり長いです。~~
~~時間があれば追ってみます。~~
2020/4/27追記：
補正機能追加により、（ミリオーダーの誤差はありますが）期待通り動作するようになりました！

# おわりに

言わば
**単なるuITRONラッパー**
なので、繰り返しですが大したことはしていません。笑

しかしながら、
**誰しも簡単に（uITRONベースの）RTOSが動かせる**
は、十分に満たしているものと思います！

# 続きの記事

**Windowsシミュレータで学ぶuITRON (1) - タスク操作 - Qiita**
https://qiita.com/imagou/items/de102b81d0049b819532

**Windowsシミュレータで学ぶuITRON (2) - イベントフラグ - Qiita**
https://qiita.com/imagou/items/80ec6e4970de31540524

**Windowsシミュレータで学ぶuITRON (3) - メールボックス - Qiita**
https://qiita.com/imagou/items/f407f6ec32a693584842

**Windowsシミュレータで学ぶuITRON (4) - ミューテックス - Qiita**
https://qiita.com/imagou/items/32ceff3e963f7fc070b2

**Windowsシミュレータで学ぶuITRON (5) - 周期ハンドラ - Qiita**
https://qiita.com/imagou/items/f6c50d8e01a5f8d86141

**Windowsシミュレータで学ぶuITRON (6) - アラームハンドラ - Qiita**
https://qiita.com/imagou/items/edd79187091773c6a43f

# 参考

**Micro-ITRON4.0 Specification (in Japanese)**
http://www.ertl.jp/ITRON/SPEC/mitron4-j.html

（以下は内部仕様）
**FreeRTOS API categories**
https://www.freertos.org/a00106.html
RailsでAws::Sigv4::Errors::MissingCredentialsError というエラーが出たら

## エラー文の例
Rails6の新機能である、Action_textやActive_Storageを利用する際に、awsなどの認証情報を`EDITOR=vi rails credentials:edit`で書き込んでいると思います。しかし、それだけだとローカルでは動作しますが本番環境では動きません。

```
...
/var/www/app-name/shared/bundle/ruby/2.6.0/gems/aws-sigv4-1.1.0/lib/aws-sigv4/signer.rb:612:in `extract_credentials_provider': Cannot load `Rails.config.active_storage.service`: (Aws::Sigv4::Errors::MissingCredentialsError)
missing credentials, provide credentials with one of the following options:
  - :access_key_id and :secret_access_key
  - :credentials
  - :credentials_provider
	from /var/www/app-name/shared/bundle/ruby/2.6.0/gems/aws-sigv4-1.1.0/lib/aws-sigv4/signer.rb:122:in `initialize'
	from /var/www/app-name/shared/bundle/ruby/2.6.0/gems/aws-sdk-s3-1.46.0/lib/aws-sdk-s3/plugins/s3_signer.rb:190:in `new'
	from /var/www/app-name/shared/bundle/ruby/2.6.0/gems/aws-sdk-s3-1.46.0/lib/aws-sdk-s3/plugins/s3_signer.rb:190:in `build_v4_signer'
	from /var/www/app-name/shared/bundle/ruby/2.6.0/gems/aws-sdk-s3-1.46.0/lib/aws-sdk-s3/plugins/s3_signer.rb:13:in `block in <class:S3Signer>'
	from /var/www/app-name/shared/bundle/ruby/2.6.0/gems/aws-sdk-core-3.64.0/lib/seahorse/client/configuration.rb:70:in `call'
	from /var/www/app-name/shared/bundle/ruby/2.6.0/gems/aws-sdk-core-3.64.0/lib/seahorse/client/configuration.rb:213:in `block in resolve_defaults'
	from /var/www/app-name/shared/bundle/ruby/2.6.0/gems/aws-sdk-core-3.64.0/lib/seahorse/client/configuration.rb:57:in `each'
	from /var/www/app-name/shared/bundle/ruby/2.6.0/gems/aws-sdk-core-3.64.0/lib/seahorse/client/configuration.rb:57:in `each'
...
```

## 解決方法

おそらく大抵の場合、credentialsが読み込まれていないのが原因だと思われるのですが、そもそも読み込むように対処していないのでこのようなエラーが出るのは必然的です。そこで、上手く認証情報が読み込まれるように設定する必要があります。

```deploy.rb
# 以下を追記
append :linked_files, 'config/master.key'
```

次に、サーバー側にログインして、`shared/config`の配下にローカルと同じmaster.keyファイルを作成します。
自分の場合ec2を使用しており、pathは`/var/www/アプリケーション/shared/config/master.key`といった感じでした。

master.keyの内容はローカルと同じく認証コードをコピペして貼れば大丈夫です。

作業例

```
$ cd /shared/config
$ vi master.key
```

master.keyには`123456abcde78910`みたいなコードが書かれているはずなのでそれをコピーしてペーストすれば完了です。

後はデプロイすれば無事に認証情報が通り、動くはずです。


## 参考リンク先
・secrets.ymlや環境変数をRails 5.2のEncrypted Credentialsに移行する
https://qiita.com/d-mato/items/aab2b6b2f587a8582631

・Rails 5.2の新機能Credentialsでパスワード等を管理する
https://thr3a.hatenablog.com/entry/20180408/1523156956
failed assertion `For depth attachment, the render pipeline's pixelFormat (MTLPixelFormatInvalid) does not match the framebuffer's pixelFormat (MTLPixelFormatDepth32Float). の解決方法

### failed assertion `For depth attachment, the render pipeline's pixelFormat (MTLPixelFormatInvalid) does not match the framebuffer's pixelFormat (MTLPixelFormatDepth32Float).

このエラーは、MetalViewをStoryboardで`@IBOutlet`接続を行うときに、Object Library から新たにMetalViewを作成していると発生してしまうようです。

以下、[Apple Develper Forums](https://forums.developer.apple.com/thread/99273)よりの引用です。(翻訳済み)
> デフォルトでは、オブジェクトライブラリのMetalKitビューはMTKView.depthStencilPixelformatをMTLPixelFormatDepth32Floatに設定します。

なので、superViewであるViewのクラスを`MTKView`に設定します。
その後、`@IBOutlet接続`をsuperViewに対して行うとこのエラーは解消できました。参考までに。

<img width="1408" alt="スクリーンショット 2019-08-30 7.47.11.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/300444/07a61e9e-46cf-27f5-9525-ceab14cd9f81.png">
NavigatioBarとViewControllerに同じ色を設定したのに同じ色にならない時の解決法


#前提

`self.view.backgroundColor`と`self.navigationController?.navigationBar.barTintColor `に同じ色を設定してあげるがnavigationBarが思った色にならない
#原因

どうやらtranslucentという設定でNavigationBarが半透明になっているらしい

###translucentとは
>A Boolean value indicating whether the navigation bar is translucent (true) or not (false)

translucent(半透明)のそのままの意味でNavigationBarの半透明かどうかを表すProperty


・ナビゲーションバーにカスタムの背景画像がない場合、または背景画像のピクセルのアルファ値が1.0未満の場合、このプロパティのデフォルト値は**true**です。 
・背景画像が完全に不透明な場合、このプロパティのデフォルト値は**false**です。 

・このプロパティを**true**に設定し、カスタム背景画像が完全に不透明な場合、UIKitは画像に1.0未満のシステム定義の不透明度を適用します。 
・このプロパティを**false**に設定し、背景画像が不透明でない場合、UIKitは不透明な背景を追加します。

*Google翻訳より*

自分の場合NavigationBarに背景画像を設定していなかったためtrueになってたみたいです

#解決法

### Xcode

![スクリーンショット 2019-08-30 6.43.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/300780/6bbacc39-c9be-6619-da2f-afd74133d4c7.png)

Transclucentのチェックを外してあげる

###Code

```swift
self.navigationController?.navigationBar.isTranslucent = false
```

flaseにしてあげる

#まとめ

備忘録として

#参考リンク

[translucent](https://developer.apple.com/documentation/uikit/uinavigationbar/1624928-translucent?language=objc)
.NET Core SDK 3.0 Preview 8をWSLにサクッとインストールする

# 手順

下記のコマンドを実行する。

```sh
$ sudo apt install -y libicu60 openssl1.0
$ wget https://download.visualstudio.microsoft.com/download/pr/a0e368ac-7161-4bde-a139-1a3ef5a82bbe/439cdbb58950916d3718771c5d986c35/dotnet-sdk-3.0.100-preview8-013656-linux-x64.tar.gz
$ mkdir -p $HOME/dotnet && tar zxf dotnet-sdk-3.0.100-preview8-013656-linux-x64.tar.gz -C $HOME/dotnet
```

~/.bash_profileの末尾に環境変数を追加する。

```sh
$ vi ~/.profile 
```

追加する内容は下記の通り。

```conf
export DOTNET_ROOT=$HOME/dotnet
export PATH=$PATH:$HOME/dotnet
```

端末を再起動するか、下記のコマンドを実行し環境変数を読み込む。

```sh
$ source ~/.profile 
```

# 備考

WSL(Ubuntu)にSnapを使って.NET Core SDK 3.0 Preview 8をサクッとインストールしようと試みたが、うまくいかなかった。(参考: [Ubuntu snap not working #2972](https://github.com/microsoft/WSL/issues/2972))

そのため、バイナリをダウンロードして利用する方法で対応した。

# 参考

+ [UbuntuのPATHの設定方法](https://qiita.com/takanemu/items/6027291be8a2a6af9adc)
+ [.NET Core 3.0 SDK - Linux x64 Binaries (v3.0.100-preview8)](https://dotnet.microsoft.com/download/thank-you/dotnet-sdk-3.0.100-preview8-linux-x64-binaries)
+ [Linux System Prerequisites for .NET Core](https://github.com/dotnet/core/blob/master/Documentation/linux-prereqs.md)
AndroidのIMEI取得

```
echo "[device.imei]: [$(adb shell service call iphonesubinfo 1 | awk -F "'" '{print $2}' | sed '1 d'| tr -d '\n' | tr -d '.' | tr -d ' ')]"
```

参考）https://stackoverflow.com/questions/6852106/is-there-an-android-shell-or-adb-command-that-i-could-use-to-get-a-devices-imei/37940140#37940140
Unity Shader における Color プロパティの色空間

# 概略
Unity の Shader Property は [Color を持つことができる](https://docs.unity3d.com/ja/current/Manual/SL-Properties.html) 。また `[HDR]` Attribute を付与することで HDR Color の指定もできる。
しかしこれらの Color Property が実際にどのような値で保存され、Inspector 上で表示され、そしてどういった値としてシェーダに渡されるのかは詳細には書かれていない。
本記事ではその点を明らかにする。

# 結論

表で結論を示す。

| プロパティ | Material に記録される値 | Inspector 上の見た目 | Shader に渡される値 (Linear ColorSpace) |
|:--|:-:|:-:|:-:|
| 通常の RGB チャンネル | 0.5 [sRGB]  | 0.5 [sRGB]  | 0.217 [Linear]  |
| HDR の RGB チャンネル  | 0.5 [Linear]  | 0.73 [sRGB]  | 0.5 [Linear]  |
| Alpha チャンネル  | 0.5 [Linear]  | バーの半分  | 0.5 [Linear]  |

# 通常の RGB チャンネル
`[HDR]` Attribute の付いていない普通の Color Property は sRGB 空間の値を格納することを目的としている。
したがって Inspector 上で `#808080` の sRGB ハーフグレイを指定すると `0.5 [sRGB]` という値がそのまま記録される。
また Inspector 上における色のプレビューも、人間の直感的に中間色に近い sRGB ハーフグレイとなる。
そして Linear ColorSpace 設定のプロジェクトの場合 `0.5 [sRGB]` を sRGB2Linear 変換した `0.217 [Linear]` の値がシェーダに渡される。

# [HDR] Attribute の RGB チャンネル
`[HDR]` Attribute の付いた Color Property は HDR な Linear 空間の値を格納することを目的としている。
したがって Inspector 上で `HSV = (0, 0, 50)` を指定すると `0.5 [Linear]` という値がそのまま記録される。
また Inspector 上における色のプレビューは sRGB ハーフグレイより明るめのグレイが表示される。これは `0.5 [Linear]` を Linear2sRGB 変換した `0.73 [sRGB]` だ。
ここで 1 点注意すべきなのは HDR Color のカラーパレットにおける `#808080` は sRGB ハーフグレイではなく Linear 空間の `0.5` になるということだ。
この仕様は正直どうなのだろうかとは思う。
そして Linear ColorSpace 設定のプロジェクトの場合、値は無変換のまま `0.5 [Lienar]` がシェーダに渡される。

# Alpha チャンネル
アルファチャンネルは `[HDR]` Attribute の有無に関わらず Linear 空間の値が格納されている。
Inspector 上で `50%` を指定すればそのまま `0.5 [Linear]` の値が記録される。
そして Linear ColorSpace 設定のプロジェクトの場合、値は無変換のまま `0.5 [Linear]` がシェーダに渡される。

# さいごに
これらの仕様は Material を設定する側の人間は意識する必要はない。Shader を深く設計する必要のある人間だけが意識する必要のある挙動である。
通常は Inspector 上における色のプレビュー、そして最終的な描画結果をみて判断すると良いだろう。
ただ前述したように HDR Color のカラーパレット指定においては Web カラー指定（例 `#808080` ）が意図しない明るい色になってしまうということは覚えておくと便利だろう。
Go言語+VSCodeで"run test"を押したときにも.envの環境変数を適用


# はじめに

VSCodeでGoのコードを書いている場合、任意の関数・メソッド内で右クリックメニューから
`Go: Generate Unit Tests For Function` を押すだけでテーブルテスト形式のテストが
`編集中ファイル名_test.go` に自動生成され、さらにテスト関数の上に出るコードレンズのリンク
 `run test` をポチるだけでテスト実行できます。
ドチャクソ便利ですね。
<img width="475" alt="スクリーンショット 2019-08-30 2.47.48.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/128115/f949bb55-f7cb-c720-3028-86092b0148ab.png">
↑これ

でも上記テストを実行する環境はVSCodeを開いた環境なので、
 `.env` 等で環境変数を管理していると適用されません。

# .envを使用するように設定を変更

Goのextentionには標準で設定項目が用意されているので、
そこに.envファイルのパスを指定するだけでOKです。

(開いているワークスペース直下に`.env`ファイルが有ると仮定します。)
VSCodeの設定画面を開き、Go configurationの `Test Env File`
テキストフィールドに `${workspaceFolder}/.env` と指定しましょう。

<img width="747" alt="スクリーンショット 2019-08-30 2.38.10.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/128115/7014785e-bcff-8017-1d55-6a52001ebb69.png">

これだけでOKです。

あ、これはユーザー設定というよりPJに依存した設定であることが多いと思うので
User SettingsではなくWorkspase Settingsの方に書いたほうがいいかもしれません。

# おまけ

スクショに見えている`Test Env Vars`を編集でもテスト開始前に環境変数をセットできます。 
また、`Test Flags`を`settings.json`上で編集(`"go.testFlags": ["-v"],`を追加)して
`-v`をつけておけば、テスト中に標準出力に吐かれたログを見ることができるので
テストがサイレント落ちして理由わかんねーよって時には威力を発揮します。
伝わったことを伝えるプルリクを出そう！

よくコミュニケーションの研修などで、
**“「どう伝えたか」より「どう伝わったか」が大切なんだ！”**
って言われますよね。

逆に言えば、
**“どんなに熱心に伝えても、伝わっていなければ意味がない”**
ということになります。

これをプログラマ的に置き換えてみましょう！
**“どんなに完璧な設計書でも、読み手(作り手)次第で不出来になる！”**
……そんな経験ありませんか？

# 一方通行だから祖語が出る

コミュニケーションは互いに意思伝達をしなくては成り立ちません。

例えば、貴方が（自分の中では）完璧な設計書を作ったとしましょう。
実装者に「設計書通りに作れば大丈夫だから！」と丸投げすると、
大抵想像したものと異なるものが出来上がります。

最悪なケースだと

>「いっぱい」の1文字目の「い」を「お」に変えてください。

という単純な指示ですら

>「おっぱお」

と返ってくることがあります。
当然どうしてこうなった？となるわけですが、

> 『い』を『お』に変えろって指示だったので…

ちゃんと文章を読みましょう。

> 横展開で最後の『い』も『お』に変えておきました！

笑顔で言われても苦笑いしかできません。

これが会社の同僚など近しい間柄なら笑い話で済みますが、
顧客やお金が絡んでくると大問題です。

# 作業者からレビュワーに伝えることが大切

話をタイトルまで戻しましょう。
**「伝わったことを伝えるプルリクを出そう！」**とはどういうことか。
簡単な話です。
作業者が**「自分はこの設計書をこう読み解きました」を記入**すれば良いのです。
例えプロジェクトルールが『プルリクのコメントは設計書や課題管理のURLなどを貼り付けておけば良い』だったとしても書いてみましょう。
だって **設計書はおっぱお** なんだから。

難しく考えなくても、大体以下のシンプルなテンプレートで事足ります。

### 機能実装時

``` 
## 修正内容を一文にまとめる
- 設計書を確認しながらひとつずつ
- 処理の流れを意識しながら順番に
- やったことを列挙していく(コピペ厳禁)
#### 動作確認
- [x] 上記を確認しながら（動作確認しつつ）列挙する
- [ ] 後で確認することも記載しておく
```
実際にGitHubで書くとこんな感じになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/182494/79a8ac5e-c2af-b3d9-9bb7-266c309520cf.png)

### バグ修正時

```
## バグの内容を一文にまとめる
#### 原因
- 直接的な原因
- 間接的な原因
- どのような経緯で発生したのか
#### 対応方針
- 〇〇という理由から（←重要）以下の修正をおこなった
- ここも Files changed 等を見ながら
- やったことを列挙していく
#### 動作確認
- [x] 上記を確認しながら（動作確認しつつ）列挙する
- [ ] 後で確認することも記載しておく
```
「こういう点を考慮して、このような処理にしました」といった理由は、ぜひ残すようにして欲しいですね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/182494/38dd7a3e-2020-e52e-fc74-04018f5b7d47.png)


# 誰が助かるのか

こんなの時間の無駄じゃないか！と思う方もいるでしょう。
**『おっぱお』になった原因をヒアリングする方がよっぽど無駄だよ！**

さて、こんなことをして、誰が助かるのか。

まず何より、**レビュワーが助かります**。
大抵作業者よりレビュワーの方が少数で、「レビュー待ち」が発生するほど忙しいです。
このコメントを見るだけで、作業者がちゃんと設計書を読めているか確かめられます。
「やったこと」が少なかったり余分なものがあったりしたら、その時点で目を皿にしてコードを読む必要がなくなります。
（作業漏れがある場合、コードの差分がないのでコードレビューだけでは気付きにくい問題もある）

そして、**作業者も助かります**。
作業漏れや確認漏れがないか、書きながらちゃんと確認してください。
ここが**他人に迷惑をかけない最終ライン**です。

さらに、**未来の参画者も助かります**。
どのような修正をしたのかが一目でわかりますし、Gitなら履歴も探しやすいです。
一番ツラいのが、Historyからバグの原因となる修正のcommit見つけてプルリク表示したら、
仕様書や課題管理のURLが書かれていて、**遷移したら参照権限がない**パターンですね。
この状態でプルリクのタイトルがブランチ名になってると完全に詰むので、必ずきちんと書きましょう。

# 誰も救われない結論

伝えたいことは伝わったでしょうか？
「おっぱお」でいっぱいになっていないでしょうか？
爆発時に「爆発オチなんてサイテー！」と鳴るように改修しても良かったと思います。

実は「やること」と「確認したこと」のメモをMarkdownで装飾しただけで、作業者云々は後付けになります。
途中にも書きましたが、コードレビューでは作業者の作業漏れが一番困るので、作業者はひとつずつ「ヨシ！」と指差し確認しましょう。
審査に出したiOSアプリが ITMS-90809 としてAppleから問題を指摘される話

## "Your app has one more issues" という Apple からのメール

拝啓。皆様，iOS 開発はお楽しみでしょうか?

1日も立たないうちに，GitHub上の多くのRepositoryに対し，[数々のissue](https://github.com/search?q=ITMS-90809&type=Issues)が立てられました。これは何でしょうか?

これまで通り App Store Connect へアプリを提出していた開発者の元に，新たなメールが届くようになりました。

> **ITMS-90809: Deprecated API Usage** - Apple will stop accepting submissions of apps that use UIWebView APIs . See https://developer.apple.com/documentation/uikit/uiwebview for more information.

## ITMS-90809 について

急にこんなメールが来ると焦りますよね。結論は「今対応する必要はないけれどもうすぐ対応してね」です。

引用部の通りなのですが，こちらは UIWebView に関する API が deprecated になっており，Apple 側が近々これらを利用するアプリの許可しなくなるという旨のメールです。親切ですね。

[UIWebView のドキュメント](https://developer.apple.com/documentation/uikit/uiwebview)には iOS 12.0 の時点で deprecated とされており，iOS 8 以上からは [WKWebView](https://developer.apple.com/documentation/webkit/wkwebview) を利用するように促しています。

これらの経緯や重要性については deprecated となった当時に多く語られている都合，ここでは省略させていただきます。

## なぜ我々のアプリに対して警告のメールが届いたのか

「UIWebView が deprecated? そんなの知っているし，既に対応済みだよ」

と思われたあなたにも届くかも知れません。何故なら，これらは未だ多くのライブラリに含まれているのだから......


[RxSwift (正確には RxCocoa)](https://github.com/ReactiveX/RxSwift/issues/2055) はもちろん，[AFNetworking](https://github.com/AFNetworking/AFNetworking/issues/4428)，[flutter](https://github.com/flutter/flutter/issues/39470)，[react-native](https://github.com/facebook/react-native/issues/26255)，[facebook-swift-sdk](https://github.com/facebook/facebook-swift-sdk/issues/519)，[ionic](https://github.com/ionic-team/ionic/issues/19229) など，アプリのコアとなるライブラリのほとんどから issue が挙げられている状況です。
現時点 (執筆時 8/30 AM 2:12 時点) では [firebase-ios-sdk](https://github.com/firebase/firebase-ios-sdk/issues/3722) については既にマージされているようです。

[~~これだけの規模，先日の大規模障害を彷彿とさせますね。~~](https://aws.amazon.com/jp/message/56489/)

## 我々はどうすれば良いのか

メールが届いたから対応しなければならない，ということではないため，現時点での早急な対応は不要です。Pull request や issue を出したり眺めつつ待ちましょう。

**一方で，このメールは審査に出していない状態でも，App Store Connect にアップロードする度に送信されます (問題が解決していない状態のバイナリに対して警告されるので妥当ですね)。**

解決するには，該当のソースコードをコメントアウト等してから Archive しましょう。

[↓RxCocoa の場合はこのあたりなど](https://github.com/ReactiveX/RxSwift/blob/6b2a406b928cc7970874dcaed0ab18e7265e41ef/RxCocoa/iOS/Proxies/RxWebViewDelegateProxy.swift)
<img width="860" alt="screenshot 68.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/195913/98fe2201-aa73-edbb-7d02-16254dd3404b.png">

## 終わりに

iOS エンジニアには苦悩が多いですね。今回もその1つに挙げられると思います。筆者は問題発生時 [cocoaPods-binary](https://github.com/leavez/cocoapods-binary) を使用していたため，新規開発にも関わらずソースが見当たらず，問題に気がつくまでに多くの時間を費しました。皆様にはそのようなことがないよう，ここに書き留めておきます。
gRPCの認可用Tokenについて

# この記事の読者

- 私並みに頭悪い人
- メモ書きでも怒らない人

# gRPCの認可について

gRPC使って何かやろうとした時、呼び出し元が悪者でも使えちゃうので
Tokenを払い出して、呼び出し時のHeaderにつけてもらおうっていう話になった。

でも、Tokenってどうやって作るんだ？
有効期限ってどうすんだ？

# 要約

- JWT(JSON Web Token)使うとセッション管理用テーブルが要らない
    - 有効期限を更新するとTokenを更新する必要がある
        - 何かアクションを起こす度、Tokenをもらうのは面倒
    -  割り切って有効期限を1日限定にしてしまえば、Tokenの変更はない
- セッション管理用テーブルを使う
    - Token払い出したら、セッション管理テーブルに有効期限(1時間後まで、とか)を入れる
    - アクセスがある度、セッション管理テーブルの有効期限を延ばす
    - Tokenの変更はない。

# 有効期限

Tokenに有効期限を設定しないと、盗まれた時いつまでも悪用されてしまう。
なので、有効期限を設定しておくと、万が一盗まれても被害を最小限に留めることが出来る。

## JWT

JWTは `Header` `Payload` `Signature` の3要素を`.`で繋げて一つのTokenとする。
`Payload`部に有効期限を設定できる。こんな感じ。

```json:payload
{
  "exp": 12345789
}
```

`exp`に有効期限をUNIX時間で設定する。
`Payload`部を更新すると、`Signature`部も変わるのでToken全体に影響がある。
気軽に更新できない。

## セッション管理テーブル（ZABBIXの場合）

ZABBIX APIはセッション管理テーブルとユーザテーブルで有効期限判定をしている

1. ログインAPIが叩かれるとUUIDを発行、クライアントに返す。UUIDがTokenになる
2. UUIDはセッションテーブルに保持。最終アクセス時間を同テーブルに入れておく。
3. クライアントから、別のAPIが叩かれた時、付与されてるUUIDを確認
4. UUIDがセッションテーブルにあれば、次
5. (ユーザテーブル.`autologout` + セッションテーブル.`最終アクセス時間`) < 現在時刻 であることを確認
6. セッションテーブル.`最終アクセス時間`を現在時刻で更新

# まとめ

セッション管理とか基本中の基本なんだけど、先達の知恵やフレームワークに頼り切りで、よく分かってなかったなぁ、という。。
セッション管理用のテーブルを作るのが正解かな？

でも、もうJWTで実装しちゃった。。