OmniAICreator/Qiita-1.07M huggingface dataset:
Swift：AVPlayerでシンプルな動画プレイヤーをつくる

再生/停止ボタンと再生位置をコントロールするスライダーのみを備えたシンプルな動画ファイル再生機．

# こんな感じ

![demo.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/67153/1c6d6096-4d58-a321-6628-ba7aeb1915d0.png)

# プロジェクト
GitHubにソース上げてあります． → [VideoPlayer](https://github.com/Kyome22/VideoPlayer)

# 要点

- import AVKit
- AVPlayerに動画のURLを渡して初期化
- AVPlayerLayerを任意のViewのレイヤーに差し込む
- AVPlayer.play/stopで再生停止
- AVPlayer.currentItem!.asset.durationで総再生時間の取得
- AVPlayer.currentItem!.currentTime().secondsで現在の再生位置取得
- AVPlayer.seek(to:, toleranceBefore:, toleranceAfter:)で再生位置の制御
- AVPlayer.addPeriodicTimeObserver(forInterval:, queue:, using:)で再生中の位置を逐次取得してスライダーに反映

# ポイント
## 再生中かどうかチェック

```swift
var isPlaying: Bool {
    return player?.rate != 0 && player?.error == nil
}
```

## .seekの罠
`AVPlayer.seek(to: )`では表示されるコマは更新されない．`AVPlayer.seek(to:, toleranceBefore: .zero, toleranceAfter: .zero)`を使うこと．

## CMTimeの作り方
`CMTime(seconds:, preferredTimescale:)`でつくる際の`preferredTimescale`は小数点第何位までみるかの指定．1000を入れたら小数点第3位までみる（0.001秒とか）

## CMTimeから00:00:00形式の文字列で現在の時間を取得する

```swift
extension CMTime {
    var positionalTime: String {
        let floorSeconds: TimeInterval = floor(seconds)
        let hours = Int(floorSeconds / 3600)
        let minute = Int(floorSeconds.truncatingRemainder(dividingBy: 3600) / 60)
        let second = Int(floorSeconds.truncatingRemainder(dividingBy: 60))
        if hours > 0 {
            return String(format: "%d:%02d:%02d", hours, minute, second)
        }
        return String(format: "%02d:%02d", minute, second)
    }
}
```
# 備考
Storyboardのコンポーネントとしてある`AVKit Player View`を用いた場合は，開発版ではちゃんと動くのに配布版だとビューが読み込まれなくなるようだった．何か設定が足りないのだと思うが...
vue-good-tableをTypeScriptで使おうとして TS7016: Could not find a declaration file for module 'vue-good-table'.

# 使用バージョン
```bash
$ npm list vue typescript vue-good-table
app@1.0.0
├── typescript@3.8.3
├── vue@2.6.11
└── vue-good-table@2.19.1
```

# 問題
Vue.jsをTypeScriptで使っていて、以下ドキュメントどおりに進めたところ、コンパイルエラー発生。
> https://xaksis.github.io/vue-good-table/guide/#installation

#### エラー内容
```bash

TS7016: Could not find a declaration file for module 'vue-good-table'. 
'[app]/node_modules/vue-good-table/dist/vue-good-table.cjs.js'
implicitly has an 'any' type.
```

# 解決
[app]/@types/以下にファイル作成。

```typescript:vue-good-table.d.ts

declare module 'vue-good-table'
```

TypeScriptまだ良く分からないですが、moduleを宣言すれば良いらしい。
@types/に関しては、d.tsファイルをそこに置くとコンパイル時に読み込んでくれるよう。
> ※ tsconfig.json の typeRoots のデフォルト設定が @types ディレクトリになっています。
> https://qiita.com/Nossa/items/726cc3e67527e896ed1e

VueGoodTableはanyだけど、とりあえずコンパイルはできました！
[Microsoft] デスクトップエクスペリエンス(GUI)なしWindows Serverのオレ的初期設定

以前も似たようなことを書きましたが、すっかり忘れてしまいましたのでまたまとめてみます。

環境は Windows Server 2019 Standard です。

何台も同じようなことをやるのであればDesired State Configurationを使うべきですが、一台だけなので。

# パスワードの複雑さポリシーを無効にする

こちらへどうぞ。

[コマンドラインから「パスワードは、複雑さの要件を満たす必要がある(Password must meet complexity requirements)」ポリシーを無効にする](https://qiita.com/sengoku/items/5de27e00ec5ffa8b76a9)

# ログイン時のCtrl+Alt+Delを不要にする

PowerShellからレジストリを変更します。

```powershell
cd hklm:\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System
Set-ItemProperty -Path . -Name disablecad -Value 1popo
```

メッセージは相変わらず表示されますが、なんでもいいのでキーを押せばOKです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59475/8945ae46-250e-5fa8-25e5-d1cfd3204915.png)


# コンピュータ名を変更する

`sconfig.cmd`からメニュー形式で設定できます。

# Windows Updateを自動にする

`sconfig.cmd`からメニュー形式で設定できます。

# リモートデスクトップを有効にする

`sconfig.cmd`からメニュー形式で設定できます。

# ドメインへ参加する

`sconfig.cmd`からメニュー形式で設定できます。
【備忘録】M5Stack/Stick-CのMicroPythonでリセットをかけたいとき

# MicroPythonでプログラムからリセットをかける
M5Stackを使っている中で，条件分岐でリセットを掛けたくなるタイミングもあるでしょう．
しかし，UIFlowのBlocklyのブロック一覧を見てもリセットのブロックは見当たらない．
そこで，検索してみると[こちら](http://itoi.jp/M5Stack.html)のサイトに記述があった．
# リセットはないがリセットと同等のものはある
DeepSleepという節電用(?)の機能がある．
こちらを使用するとメモリの初期化が行われるようである．(少なくとも起動時間はリセットされた．)

```Python:deepsleeptest
from m5stack import *
from m5ui import *
from uiflow import *
from time import sleep
import machine

setScreenColor(0x111111)

while True:
  if time.ticks_ms() > 5000:
    machine.deepsleep(10)
  lcd.print((time.ticks_ms()), 0, 0, 0xffffff)
  wait_ms(2)
```

こちらのサンプルコードをM5Stick-Cで実行すると以下のような動作になる．
[![youtube](https://youtu.be/NpiLNVbBYog)](https://youtu.be/NpiLNVbBYog)

これで定期的に再起動してくれるM5のプログラムが書けるね！
C言語　ALDS1_9_A　Complete Binary Tree　完全二分木

##問題
http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=ALDS1_9_A

##コード
```c
#include <stdio.h>
#define MAX 100000

int parent(int i)
{
    return i / 2;
}

int left(int i)
{
    return 2 * i;
}

int right(int i)
{
    return 2 * i + 1;
}

int main(void)
{
    int N, i, A[MAX + 1];

    scanf("%d", &N);
    for (i = 1; i <= N; i++)
        scanf("%d", &A[i]);

    for (i = 1; i <= N; i++)
    {
        printf("node %d: key = %d, ", i, A[i]);
        if (parent(i) >= 1)
        {
            printf("parent key = %d, ", A[parent(i)]);
        }
        if (left(i) <= N)
        {
            printf("left key = %d, ", A[left(i)]);
        }
        if (right(i) <= N)
        {
            printf("right key = %d, ", A[right(i)]);
        }
        printf("\n");
    }

    return 0;
}
```


##ポイント
完全二分木の各節点番号は下記の計算式で求めることができる。

- 親
    - i / 2
- 左の子
    - 2 * i
- 右の子
    - 2 * i + 1

##所感
- そういうもんなんだろうくらいの理解
- 所要時間　１０分
Pythonで仮想環境を作ろう！

Pythonの機能で、仮想環境を作成することができやす。

仮想環境で開発するメリットとして

```ruby:メリット
・プロジェクトごとにまっさらな環境を作ることができる（わかりやすい。）
・Pythonのパッケージやバージョンを使い分けれる。
（このバージョンでないとできないといった問題も解決するかも…）
・不必要なライブラリ等に干渉されない。
```
私が仮想環境を作成してみた感想としては、非常にシンプルになり、わかりやすかったです。作成方法も簡単ですので、作ってみます:relaxed:

##作成方法

コマンドプロンプトを開いて、カレントディレクトリで作りたい場所に行く。
作りたい場所のディレクトリで下記のコードを実行しやす。

```ruby:仮想環境作成
virtualenv かそうかんきょう
```
これだけで、「かそうかんきょう」という名の仮想環境ができます。

もしも、pyhtonのバージョンを指定したいときは、

```ruby:仮想環境作成（Pythonバージョン指定）
virtualenv -p python3.7 かそうかんきょう
```

バージョンを指定することも可能。

##使用方法
仮想環境を使用するときに「有効化（activate）」。
使い終わったら「無効化（deactivate）」をします。


```ruby:有効化
C:\かそうかんきょう>Scripts\\activate
```
```ruby:無効化
C:\かそうかんきょう>Scripts\\deactivate
```

大まかな流れとしては、
仮想環境を作る→有効化→プログラムの実行やライブラリのインストール
→最後に無効化→何かするときは再度有効化
といった流れ。

いらなくなったら、環境（かそうかんきょうのフォルダ）ごと削除してください。
Laravel-Adminで外部スクリプトを読み込む

# 外部スクリプトを読み込んで色々やりたい

- app/Admin/bootstrap.phpを編集

```bootstrap.php
Encore\Admin\Form::forget(['map', 'editor']);

app('view')->prependNamespace('admin', resource_path('views/laravel-admin'));
Admin::js('admin-external/app.js'); // 追加
```

## 参考

- [How to add an external javascript file in Laravel-Admin](https://github.com/z-song/laravel-admin/issues/4094)
PythonGUIによる簡易営業ツール作成:社員番号検索(ラジオボタン)

#PythonGUIによる簡易営業ツール作成:社員番号検索(ラジオボタン)
以前投稿したものをラジオボタン方式にして変更しました。社員数が少ない場合はこちらの方が良さそう。Spyder(python3.7)を使ってます。

```
#ラジオボタンで社員番号検索
import tkinter as tk

root = tk.Tk() 
root.geometry('300x150')
root.title('社員')
radioValue = tk.IntVar() 
 #textには社員名、valueには社員番号入力
rdioOne = tk.Radiobutton(root, text='田中',
                             variable=radioValue, value=101)
rdioTwo = tk.Radiobutton(root, text='鈴木',
                             variable=radioValue, value=202) 
rdioThree = tk.Radiobutton(root, text='野村',
                             variable=radioValue, value=303)
rdioOne.grid(column=0, row=0)
rdioTwo.grid(column=0, row=1)
rdioThree.grid(column=0, row=2)
#社員番号表示方法
labelValue = tk.Label(root, textvariable=radioValue)
labelValue.grid(column=2, row=0, sticky="E", padx=40)
root.mainloop()
```
matplotlibでカラーバーを表示させずにカラーレンジを設定する

# やりたいこと
matplotlibのquiverをつかって流速場（ベクトル場）を表示するときにベクトルの色を流速の大きさにしてカラー表示する。かつ、色のレンジを設定しつつもカラーバー自体は表示させない。

## 動機
なんでこんなことしたいかというと、時刻を変えた流速場を複数論文に載せたいのですが、スペースの都合上、カラーバーは１個だけ表示させればいい。すべての図でカラーバーも一緒に出して、後から加工してもいいです。けど面倒なので後加工を避けるために、カラーレンジは揃えつつ、カラーバー自体は表示させない図を作ろうとしました。

# やり方
ポイントはNormalizeを使うこと。以下コード。

``` python
import matplotlib.pyplot as plt
from matplotlib.colors import Normalize
import numpy as np

for i in range(len(timeList)):
    fig = plt.figure(figsize=(fig_width,fig_height))
    ax1 = fig.add_subplot(111)
    umag = np.sqrt(Ux[i]**2 + Uy[i]**2 + Uz[i]**2)
    image = ax1.quiver(y[::vec_skip], z[::vec_skip], Uy[i][::vec_skip], Uz[i][::vec_skip], 
                    umag[::vec_skip], width=0.002, headwidth=3, headlength=3, scale=5, 
                    cmap="jet", norm = Normalize(vmin=0,vmax=.7))
```

umagが速度の大きさで、ここのレンジを設定しようとしてます。norm = Normalize(vmin=0,vmax=.7)でカラーレンジを0から0.7に設定してます。

ちなみにカラーバー表示させて、カラーレンジ設定するなら以下のコードでOK。

``` python
import matplotlib.pyplot as plt
from matplotlib.colors import Normalize
import numpy as np

for i in range(len(timeList)):
    fig = plt.figure(figsize=(fig_width,fig_height))
    ax1 = fig.add_subplot(111)
    umag = np.sqrt(Ux[i]**2 + Uy[i]**2 + Uz[i]**2)
    image = ax1.quiver(y[::vec_skip], z[::vec_skip], Uy[i][::vec_skip], Uz[i][::vec_skip], 
                    umag[::vec_skip], width=0.002, headwidth=3, headlength=3, scale=5, 
                    cmap="jet")
    cb = fig.colorbar(image, ax=ax1, label="Umag", )
    cb.mappable.set_clim(0.0,0.7)
```

最初この記事 https://qiita.com/kumamupooh/items/c793a6781a753eca6d8e
を参考にしてカラーバーのレンジを設定しようとしましたが、最近のmatplotlibだとmappable.set_climにしろって警告がでました。

Normalizeも使わず、colorbarも表示させないと、表示してるデータで自動にカラーレンジが設定されます。速度場のデータが変わるとレンジが変わるという悲しいことになります。

ちなみにmappable.set_climとNormalizeを同時に設定すると、mappable.set_climの設定が優先されて、Normalizeの設定は無視されます（無視されてるように見える）。
raspberry pi にpiCoreを入れる

http://tinycorelinux.net/9.x/armv6/releases/RPi/

SDにいれて、起動後

```
tc@box:~$ sudo fdisk -u /dev/mmcblk0

Command (m for help): p　←★
Disk /dev/mmcblk0: 489 MB, 513277952 bytes, 1002496 sectors
489 cylinders, 64 heads, 32 sectors/track
Units: sectors of 1 * 512 = 512 bytes

Device       Boot StartCHS    EndCHS        StartLBA     EndLBA    Sectors  Size Id Type
/dev/mmcblk0p1    4,0,1       37,63,32          8192      77823      69632 34.0M  c Win95 FAT32 (LBA)
/dev/mmcblk0p2    38,0,1      48,63,32         77824     100351      22528 11.0M 83 Linux

Command (m for help): d　←★
2　←★

Command (m for help): n　
Command action
   e   extended
   p   primary partition (1-4)
p　←★
Partition number (1-4): 2　←★
First sector (32-1002495, default 32): 77824　←★２番めのStartLBAの値
Last sector or +size or +sizeM or +sizeK (77824-1002495, default 1002495): Using default value 1002495　←★デフォルトでOK

Command (m for help): w　←★
The partition table has been altered.
Calling ioctl() to re-read partition table
fdisk: WARNING: rereading partition table failed, kernel still uses old table: Device or resource busy
tc@box:~$ sudo reboot　←★
```

```
sudo resize2fs /dev/mmcblk0p2
```

#ホスト名
```
sudo vi /opt/bootsync.sh
```
/usr/bin/sethostname box
を
/usr/bin/sethostname hogehoge
に


#usb-camera

```
tce-load -wi v4l-dvb-4.9.22-piCore.tcz
tce-load -wi libv4l2.tcz
tce-load -wi fontconfig.tcz
tce-load -wi ffmpeg.tcz
ffmpeg -f video4linux2 -s 640x480 -i /dev/video0 -vframes 1 ./test.jpg
```

#ssh
```
sudo vi /usr/local/etc/ssh/sshd_config
```

#ラズパイカメラ

```
sudo mkdir /boot && sudo mount -t vfat /dev/mmcblk0p1 /boot/ && sudo vi /boot/config.txt
```

[ALL]の直後に下記を追記

```
gpu_mem=128
start_file=start_x.elf
fixup_file=fixup_x.dat
```

```
sudo vi /opt/bootlocal.sh
```

で

```
chmod 777 /dev/vchiq
chmod 777 /dev/vcsm
```
を追記

```
filetool.sh -b
```


```
tce-load -wi rpi-vc.tcz
raspistill -o test.jpg
```


https://github.com/Linkaan/Fagelmatare/blob/master/INSTALL.md


#python
```
tce-load -iw python3.6
```

```
wget https://bootstrap.pypa.io/get-pip.py
sudo -E -H python3.6 get-pip.py
sudo -E -H pip3.6 install requests
```

```
tce-load -wi python3.6-RPi.GPIO.tcz 
>>> import RPi.GPIO as GPIO
```

```
vi /opt/.filetool.lst
```

で

```
usr/local/lib/python3.6/site-packages/
```
を追記

```
filetool.sh -b
```

#音
```
tce-load -wi alsa-utils.tcz
aplay -l
amixer cset numid=3 1
aplay --duration=5 crows1.wav 
```



#X系
```
tce-load -iw TC.tcz
startx
```




#参考
https://github.com/SergiSM/Raspberry/wiki/piCore
https://shrimp.marokun.net/wiki/?TinyCoreLinux



#apt的なもの
```
tce
```

busybox-httpd　をいれても良いかも

#ログインメッセージを変える

```
vi /etc/motd
```

でイジってから

```
vi /opt/.filetool.lst
```

で

```
etc/motd
```
を追記して

```
filetool.sh -b
```
個人レベルの感染予防をポアソン過程で議論

※私には医学的知識はありませんであくまで参考程度に捉えてください

## 要約


- 感染者数ではなく、個人レベルの予防策として、人との接触時間をどれくらい減らしたらよいのか議論した
- ミクロ(個人)なモデルとしてマルコフ過程で議論
- 接触は5分程度にしよう

## モチベーション

新型コロナウィルスの感染に関して、感染者数の増加予測が色々な方法で議論されています。よく目にするのはSIRモデルというもので、Qiitaでは例えば[こちら](https://qiita.com/kotai2003/items/ed28fb723a335a873061)が最初期の頃の記事の様です。

ただ、感染者数というと集団(マクロ)に対する議論なので、個人(ミクロ)での意識としてどれくらい何をすれば良いのか直接的に感じられないかもしれません。

そこで、個人個人としての努力目標を具体的に理解するため、ミクロな視点で議論してみたいと思います。ここでは、個人が感染するリスクを抑えるために、「連続した会話(接触時間)をどれくらい減らせばよいか」をマルコフ過程を使って議論したいと思います。

## ミクロなモデル：マルコフ過程での感染

**仮定１：ミクロな議論として、感染はマルコフ過程で起こると仮定する**

次のように考えてみましょう。非感染者が、感染者と周囲2m以内などのある条件（三密状態）になってからの経過時間を$t$とします。このとき、感染の確率密度を$p$とすると、時刻$t$から$t+dt$の間に感染する確率は
$$
p_n dt+O(dt^2)
$$
で与えられます。このとき、$O(dt^2)$は$dt \rightarrow 0$において第1項よりも早く0に収束すると仮定する。すなわち、三密状態にある状態で時間$dt$を経過した時に感染する確率は、以後は$pdt$とすればよい。

三密状態になってからある時刻$t$経過した時に「感染していない」確率を$Q(t)$とすると、次の瞬間の時刻$t+dt$においても感染していない確率は
$$
Q(t+dt)=(1-p dt)Q(t)
$$
となります。これより、次の微分方程式が得られます。
$$
\frac{dQ(t)}{dt}=-p Q(t)
$$
この解は次のようになります。
$$
Q(t)= \exp (-p t)
$$
ただし、$Q(0)=1$としました。

ここで$Q(t)$は感染していない確率ですので、あらためて、時刻$t$までに感染してしまう確率$P(t)$は
$$
P(t) = 1-Q(t) = 1 - \exp(-p t)
$$
になります。

（知っている人には回りくどい書き方をしていますが。）

## パラメータの決定

さて、$p$は確率密度といいましたが、アバウトに言えば「感染力」ともいうべき量でしょう。感染者がいない状態で三密状態になっても感染しないので$p=0$ですが、三密状態の中の感染者数が増加すれば$p$も増加すると思います。ただし、複雑さを避けるために、まずは感染者と接触状態においては$p$はある定数パラメータとして議論を続けます(ポアソン過程)。

日本でのクラスター感染をパラメータ決定に使うことにします。スポーツジムや夜の食事でクラスター感染していますが、だいたい1時間程度の接触としましょう。ここから、おおざっぱですが次の仮定をします。

**仮定２：感染者と濃厚接触が1時間続いたとき、感染する確率を50%とする**

つまり、$t=1$ (以後、時間$t$の単位はhourとしましょう)が経過した時点での、感染確率は
$$
P(t=1)=1/2
$$
を仮定したことになります。これを、先のモデルの解に代入すると、パラメータ$p$が求まり、
$$
p=\ln 2
$$
となります。

## 予測

上記の過程から得た$p=\ln 2$を代入して、あらためて、感染確率の式を書き直すと
$$
P(t) = 1 - \exp[ - (\ln 2 ) t] = 1 - (1/2)^t
$$
です。時間$t$の単位は[hour]です。

時間$t$に具体的な数値を代入してみましょう。

5分の接触なら、$t=1/12$を代入して、
$$
P(1/12) = 0.0561
$$
ということで、約5%。つまり、1時間の会議を5分で済ませれば、感染率は50%→5%と、10分の1まで減らせます。

20分$(t=1/3)$接触していた場合は、
$$
P(1/3)=0.206
$$
と約20%の感染率です。満員電車での通勤時間がこれくらいとすると、電車通勤を控えることは効果がありそうです。

興味のある人は適当な数字を入れてみたり、グラフで可視化してみてください。

## 議論

今回の個人の感染確率の予測では2つの仮定を用いました。

まず仮定１の感染がマルコフ過程に基づくという点については、医学的な知識がないので妥当性は分かりません。数理モデル系の人ならこう考えるかなと思って採用しました。コメント頂ければ幸いです。

仮定2も議論の余地があります。そもそも1時間一緒の店にいたら半分くらいの人が感染していそう、という完全に想像で決めています。これは具体的なデータからもっと最適なパラメータ$p$を決めれるでしょう。

また、$p$は定数としましたが、窓を開けているか、マスクをしているか、三密状態にある接触者の中の感染者の数などにも応じて変化すると思います。ですのであくまで参考までに。

こういうミクロなモデルを作ると、マクロなモデル(今回の場合は感染者数)との繋がりを問われますが、それは今回に限らず難しい話になります。ただ、今回はあくまで「感染者と接触している時間」についての議論です。つまり、接触相手が感染者である場合を仮定しています。ですので、実際には接触相手が感染者であるかどうかを、マクロモデルの感染者／非感染者の割合に応じて変えてやれば、ミクロとマクロの接続は出来そうですね。

## まとめ

個人個人の感染防止のために、マルコフ過程（ポアソン過程）を用いて個人の感染率と接触時間の関係を議論してみました。

医学的知識が無い中で何かを発信して良いものか悩みましたが、**個人個人の接触を減らそうという意識を促す**意味はあるかなとポジティブに捉えて投稿しました。

用語の使い方等、間違いも多いと思いますので、ご指摘ありましたらよろしくお願いします。
Raspberry Pi 4 + GPSモジュール + OS設定メモ

# はじめに

Amazonで安価に買える[GPS拡張ボードシールド](https://www.amazon.co.jp/gp/product/B072XF6MDR/ref=ppx_yo_dt_b_asin_title_o05_s00?ie=UTF8&psc=1 GPS拡張ボードシールド)を使ったGPSロガーを作成する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44282/dbe87623-a8b4-a72b-8b80-765e09c6e116.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44282/e3d39017-ee2f-c535-24bc-6138193d264d.png)

# OSセットアップ

Raspianが動作している状況で下記の設定をする。

```/boot/config.txt
enable_uart=1
dtoverlay=pi3-disable-bt
```

```/boot/cmdline.txt
dwc_otg.lpm_enable=0 console=tty1 root=/dev/mmcblk0p7 rootfstype=ext4 elevator=deadline rootwait fbcon=map:10 fbcon=font:ProFont6x11 logo.nologo
```

```/lib/systemd/system/hciuart.service
[Unit]
Description=Configure Bluetooth Modems connected by UART
ConditionFileNotEmpty=/proc/device-tree/soc/gpio@7e200000/bt_pins
Before=bluetooth.service
After=dev-serial1.device

[Service]
Type=forking
ExecStart=/usr/bin/hciattach /dev/ttyAMA0 bcm43xx 115200 noflow -

[Install]
WantedBy=multi-user.target
```

```text:/etc/default/gpsd
START_DAEMON="true"
USBAUTO="false"
DEVICES="/dev/ttyAMA0"
GPSD_OPTIONS=""
```

# 外部GPSアンテナ

この[アンテナ](https://www.amazon.co.jp/gp/product/B07DFFB7LZ/ref=ppx_yo_dt_b_asin_title_o04_s00?ie=UTF8&psc=1 アンテナ)は外部アンテナとして動作確認しています。基板から内蔵アンテナとのケーブルを取り外し入れ替えてやることで動作しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44282/72cf06c9-1bab-6e49-7bbd-fa7565b4704e.png)
Visual Studio Code(VSCode)のインストールからextensionsの導入まで for mac

## 前書き
自分の調べたことまとめ用の記事。

## 環境
MacBook Pro (15-inch 2018)
macOS Catalina(ver 10.15.4)

## そもそもVisual Studio Codeって何？

- Microsoft社製の無料の多機能エディタ
- 略して「VS Code」
- 以下の特徴があるため、人気がある
 - 軽量で高速
 - 多数のプログラミング言語をサポート
 - デバッグ機能
 - Gitを使える
 - 拡張機能で機能追加ができる

参考：

- [【初心者必見！】Visual Studio Codeの使い方を分かりやすく解説！](https://www.sejuku.net/blog/40607) 
- [Pythonを開発するエディタVisual Studio Codeについてとそのインストール手順](https://tonari-it.com/python-vscode-install/) 

**eclipseみたいな統合開発環境かと思って勉強コストかかるなぁって使うのビビってたけど、sublime textみたいな感じっぽい！**気楽に行こう。

## インストール
1. [Visual Studio Codeのページ](https://code.visualstudio.com/)からダウンロード
<img width="1160" alt="スクリーンショット 2020-04-14 12.02.52.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/270898/908a1831-f042-cd1d-6837-04619a38357b.png">

2. ダウンロードファイルのダブルクリック&Applicationへのドラッグandドロップ
3. 開いてみる。
4. 以上。

## 機能説明
重要なことは以下の二つのみ。

- 「command + shift + P」でコマンドパレットを開くことができる。
- コマンドパレットから、VSCodeの全ての機能にアクセスすることができる。

あとは、随時使いたい機能を入れていけばいいのかね。

参考：[Python初心者に知ってもらいたいVS Codeのコマンドパレットとその使い方](https://tonari-it.com/python-vscode-command-palette/)

### terminalから実行できるようにする
1. [command + shift + P]でコマンドパレットを開く
2. 「shell」と打ち込み、installを選択、実行
<img width="618" alt="スクリーンショット 2020-04-14 12.34.38.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/270898/73103c47-3c45-506f-36f5-d734e3588ad1.png">
3. オッケー！


参考:[ターミナルからVisual Studio Codeを起動する方法【公式の方法】](https://qiita.com/naru0504/items/c2ed8869ffbf7682cf5c)

### extensionsを入れてみる

以下のページに従って、色々入れてみる。


- [【VSCode】拡張機能をインストール・削除する方法と、有効・無効を切り替える方法](https://blog-and-destroy.com/21376)
- [Visual Studio Codeの拡張機能を使ってみよう (1/2)](https://www.atmarkit.co.jp/ait/articles/1511/27/news029.html)
- [Visual Studio Code 拡張機能のインストール](https://jp.infragistics.com/products/indigo-design/help/codegen/installing-vs-code-extension.html)

gitも使えるって書いてあったので、そのうち入れて使ってみたい。

## 設定ファイル(setting.json)の編集方法

- VSCodeから編集する場合は、以下のページ参照。
 - [VS Codeのsettings.jsonの開き方](https://qiita.com/y-w/items/614843b259c04bb91495)
- command lineから設定する場合は、以下のファイルを編集
 - `~/Library/"Application Support"/Code/User/setting.json`
AWS EC2でサーバを構築 5 - MySQL + phpMyAdmin

## 記事一覧

- [AWS EC2でサーバを構築 1 \- Amazon Linux 2 準備編](https://qiita.com/ryu-blacknd/items/23b86d9ad768d58ff161)
- [AWS EC2でサーバを構築 2 \- 各種インストール編](https://qiita.com/ryu-blacknd/items/36ccfcf96da7b0c981cf)
- [AWS EC2でサーバを構築 3 \- Apache \+ Let's Ecnrypt \+ PHP\-FPM編 \(脆弱性診断「A\+」を狙う\)](https://qiita.com/ryu-blacknd/items/77eebe43a18a69e7c1e5)
- [AWS EC2でサーバを構築 4 \- Nginx \+ Let's Ecnrypt \+ PHP\-FPM編 \(脆弱性診断「A\+」を狙う\)](https://qiita.com/ryu-blacknd/items/4049f04e445eb1d60e4d)
- [AWS EC2でサーバを構築 5 \- **MySQL \+ phpMyAdmin**](https://qiita.com/ryu-blacknd/items/03030d11eeef65e3cf67)
- [AWS EC2でサーバを構築 6 \- PostfixとDovecot \(SSL対応とSPAM対策\)](https://qiita.com/ryu-blacknd/items/8e0c28065af3f9b8a06d)
- [AWS EC2でサーバを構築 7 \- セキュリティ対策](https://qiita.com/ryu-blacknd/items/20e5540195501e16e90e)

## 概要

Amazon Linux 2を含むRHEL (RedHat Enterprise Linux) 系のOSでは、MySQLから派生したMariaDBがデフォルトで採用されています。これについての経緯は省きますが、Oracleによる買収後も従来通りに利用可能であるため、互換性重視でMySQLを採用します。

> MySQLはサーバリソースを食うため、アクセス数や負荷が増えたらRDSへのリプレースも検討した方が良いでしょう。

## MySQL

デフォルトのキャラセットを変更します。

今回、特にパフォーマンスチューニングは行いません。

**/etc/my.cnf**

```ini
character-set-server = utf8
```

以下は最初に行う儀式的なコマンドです。root@localhostのパスワードを変更します。

```bash
mysql_secure_installation
```

MySQLを停止します。

```bash
systemctl stop mysqld
```

デフォルトでは難解なパスワードしか認められずエラーになるのでこれを回避する設定です。

```bash
mysql -u root -p

> set global validate_password_policy=LOW;
> quit
```

改めてMySQLを起動します。

```bash
systemctl start mysqld
```

## phpMyAdmin

設定ファイルのサンプルをコピーして設定ファイルを作成します。

```bash
cd /var/www/html/www.example1.com/public_html/phpmyadmin
cp config.sample.inc.php config.inc.php
```

**/var/www/html/dev.netartz.com/public_html/config.inc.php**

phpMyAdminはすぐにセッションが切れてしまい再ログインが手間なので、セッションが24時間持続するようにします。

```php
$cfg['blowfish_secret'] = '{記号を含む長いランダムな文字列}'; /* YOU MUST FILL IN THIS FOR COOKIE AUTH! */

$cfg['LoginCookieValidity'] = 86400;
```

phpMyAdminにログインして`phpmyadmin`データベースを作成し、SQL文をインポートします。

```bash
mysql -u root -p phpmyadmin < ./sql/create_tables.sql
mkdir tmp
chmod 777 tmp
```
私は今！Qiitaへの第一歩を踏み出した！

# 私は今！Qiitaへの第一歩を踏み出した！
はい、よくやるネタです。
Qiitaのそもそも使い方が分かっていないので練習として書いてみました。
（Markdownって何ぞ…レベル）
備忘録として使えたらいいなと思っています。

- 超基本のQiita記事の書き方について（超初心者向け）

# 参考
皆さん分かりやすい記事を作っていて素晴らしいなと思います
https://qiita.com/cloversoft/items/0f12f3a739312d35cb8f

# コードの挿入
結局やりたいのはこれですよね。
これは調べるとすぐにできました。
バッククオート（`）３つでコードの挿入ができます。

また、「Python:test.py」のように言語名：ファイル名とすると
言語に合わせて表示してくれるらしい

>
\`\`\`Python:test.py
txt = 'Hello World!'
\`\`\`

```Python:test.py
txt = 'Hello World!'
```

# コードを挿入せずに表示させる方法
>
\`\`\`Python:test.py
txt = 'Hellow World!'
\`\`\`

↑のように表示させる方法で、思った以上にハマった。
３連バッククオート（\`\`\`）をそのまま表示できない。
どうもMarkdownのエスケープ（\\）を挟んでいくと表示できそう。
（\\\`\\\`\\\`）←こんな感じ
エスケープ（\\）は１記号毎に使う感じなんですね。

# 他人が書いた記事のMarkdownの見方
URLに「.md」を追加すれば見ることができる。
ということで最初からこれで見ておけば良かったです。

# あとがき
IT技術者にとっては当たり前かもしれませんが、
素人は予期しないところで躓きます。
一歩ずつ進んでいこうと思います。
貿易統計を学び合う会 （資料）アビガンの原料の輸入は？

# 貿易統計を検索するだけでも、面白い。アビガンの原料はどこから輸入しているのかな？

[貿易統計を学び合う会](https://www.kaggle.com/zanjibar/manabiai-2/)の資料です。貿易統計の検索だけでも結構面白いこと（私の価値基準ですが）がわかるという例です。技術的なスキルはほぼ不要です。企画的な発想があれば良いだけです。この資料では、コロナウイルスへのアビガンの原料がどこから輸入されているかを追ってみます。

オープンデータが話題になって久しいですが、実際に使ってみて面白いと思われた方はどのくらいいるのでしょうか？　どこが面白くないかというと

- **データが大きくない** : データが小さいと新しい分析の切り口の工夫できません。
- **データが古い** : 2年前のデータだと古すぎます。せめて一か月前
- **話題性に乏しい** : ニュースでしばしば話題になるオープンデータは少ない

# 貿易統計は、大きくて、新しく（一か月前）、話題性があります。

貿易統計のページには、検索機能もあります。それを使うだけでも結構面白い（私はそう思う）ことができます。
ここで選んだのは、今、話題のアビガンの原材料です。現在、日本でつくられておらず、中国から輸入しているそうです。それで、アビガンの原料となるマロン酸ジエチルの輸入を調べてみましょう。

### 貿易統計で分かること(国、品目、数量、税関）

- 貿易している品目　コードがふられています。[HSコード](https://www.jetro.go.jp/world/qa/04A-010701.html)といいます。日本は、9桁で、上6桁は世界で共通です。最初に0がついているので、CSVとしてインポートするときに、数字として認識されることがあるので、注意が必要です。
- 貿易相手国 [国コード](https://www.customs.go.jp/toukei/sankou/dgorder/a1.htm)がふられています。CSVとしてインポートするときには、自動的に数字として認識されることが多いです。データとして扱うときに注意が必要です。
- [単位](https://www.customs.go.jp/toukei/sankou/howto/faq.htm#13) 2種類あります。２のことが多いです。
- 金額 1000円です。
- [税関コード](https://www.customs.go.jp/toukei/sankou/dgorder/TU-S59k1048.pdf) 税関別のときに使われるコード

### アビガンの原料マロン酸ジエチルを調べる(キーワード + HSコードで検索）

- HSコードを使って検索してみます。[貿易統計で国別品目](https://www.customs.go.jp/toukei/srch/index.htm?M=01&P=0)というのを使います。

- HS コードは多分 29171990(8桁なので、6桁として [291719](https://www.tariffnumber.com/2020/291719)) 日本語情報では、その他になります。おそらく違う物質もまざっていますね。でも、これだろうにしておきます。
- [貿易統計検索ページで検索](https://www.customs.go.jp/toukei/srch/index.htm?M=01&P=1,1,,,,,,,,4,1,2019,0,0,0,2,291719,,,,,,,,,,1,,,,,,,,,,,,,,,,,,,,,,50)　金額順にはならんでいませんが、ＣＳＶダウンロードして、エクセルに取り込めばいいです。

-
C言語　ALDS1_7_C　Tree Walk　二分木の出力３パターン

##問題
http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=ALDS1_7_C&lang=ja

##コード
```c
#include <stdio.h>
#define MAX 10000
#define NIL -1

typedef struct
{
    int parent;
    int left;
    int right;
} Node;

Node Tree[MAX];

/* 先行順巡回 preorder tree week */
void pre_parse(int node_id)
{
    if (node_id == NIL)
        return;
    printf(" %d", node_id);
    pre_parse(Tree[node_id].left);
    pre_parse(Tree[node_id].right);
}

/* 中間順巡回 inorder tree week */
void in_parse(int node_id)
{
    if (node_id == NIL)
        return;
    in_parse(Tree[node_id].left);
    printf(" %d", node_id);
    in_parse(Tree[node_id].right);
}

/* 後行順巡回 postorder tree week */
void post_parse(int node_id)
{
    if (node_id == NIL)
        return;
    post_parse(Tree[node_id].left);
    post_parse(Tree[node_id].right);
    printf(" %d", node_id);
}

int main(void)
{
    int N;
    int i, node_id, left, right, root;

    scanf("%d", &N);

    /* initialize */
    for (i = 0; i < N; i++)
        Tree[i].parent = NIL;

    for (i = 0; i < N; i++)
    {
        scanf("%d %d %d", &node_id, &left, &right);
        Tree[node_id].left = left;
        Tree[node_id].right = right;
        if (left != NIL)
            Tree[left].parent = node_id;
        if (right != NIL)
            Tree[right].parent = node_id;
    }

    for (i = 0; i < N; i++)
        if (Tree[i].parent == NIL)
            root = i;

    printf("Preorder\n");
    pre_parse(root);
    printf("\n");
    printf("Inorder\n");
    in_parse(root);
    printf("\n");
    printf("Postorder\n");
    post_parse(root);
    printf("\n");

    return 0;
}
```

##所感
- 所要時間　２０分
AWSとLINE BOTを使って簡単にコロナウイルス感染者数をチェックする


# 経緯

コロナウイルス感染者数が増幅していく世界で、不安におびえつつ感染者数をチェックする自分に呆れながらも、いちいちサイトを見に行く手間にうんざりしたので、都道府県名を入力すれば情報を教えてくれる**LINE BOT**を作ってみた。

# Demo

![20200414_022946000_iOS.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283351/b1d31cb1-aae8-804a-ef13-1829b3f49715.jpeg)

**※画像は4/14日時点の情報です。**

# Architecture

![Untitled Diagram.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283351/95b7c9ee-1a18-64f4-19f3-e3a91545fdea.jpeg)


# LINE Devlopersに登録

- 登録してプロバイダーを作成、チャネル作成を行う。
- [Messaging API設定タブ] でチャネルアクセストークンを発行する。

# Lambdaを作成する

コロナウイルス情報が公開されているのでそれを取得するLambdaと、
LINE BOT用のLambdaを作成する。Githubで拙いコードを公開しているのでこちらを参考にしてください。

https://github.com/5hintaro/linebot-covid19-checker

**※注意点**

- **[LINE_CHANNEL_ACCESS_TOKEN]** と **[LINE_CHANNEL_SECRET]** の環境変数を作成したLambdaで必ずセットしてください。
- 多くの記事で [LINE_CHANNEL_ACCESS_TOKEN] の頭に **[Bearer ]** を付けるとありましたが、逆にこれがあったせいでできなかったので、シンプルにアクセストークンのみを環境変数にセットしてください。 

**★参考にしたデータ**

東洋経済オンラインさんのサイトで公開されているものを今回利用しました。
とても助かりました。

https://toyokeizai.net/sp/visual/tko/covid19/

# API Gatewayの設定

- REST APIを作成
- リソース作成
- メソッド作成（Lambdaを関連付ける）

![2020-04-14_11h46_27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283351/56d4156d-d6a0-27b1-764b-36e2ec4f115d.png)

![2020-04-14_11h45_24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283351/bd3bd3b6-aa7f-4457-0d95-24221f52028d.png)


- デプロイ後、ステージで発行されたURLをコピーする
- LINE Devlopersの [Messaging API設定タブ] ＞ [Webhook URL] に先ほどコピーしたURLを張り付ける。このとき、必ず**[amazon.com:443/test]**のようにポート番号を付けてあげる。


ちなみにWebhook URLの検証は失敗しても大丈夫です。問題なく動きます。
以下のようなエラーが私の場合出ました。

![2020-04-14_11h54_50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283351/62ac5439-9b02-299a-eea7-c8b17460bed4.png)


# 感想

LINEのMessaging APIはめんどくさい。




**Thanks.**
parquet-tools が  java.lang.ExceptionInInitializerError するので java8 で動くようにした話

# 概要

parquetの確認用に `parquet-tools` をインストールしたのですが、今どきの環境だと java8 より高いバージョンが入ってしまって動かないと思うので、 java８ をいれて使えるようにしました。

# 事象

とりあえずどんなインストールしたらエラー出るのか

```
% brew install parquet-tools
```

```
% parquet-tools meta ファイルパス
java.lang.ExceptionInInitializerError
```

軽くググると java8 じゃないと動かないよとのこと

```
% java -version
openjdk version "14" 2020-03-17
OpenJDK Runtime Environment (build 14+36-1461)
OpenJDK 64-Bit Server VM (build 14+36-1461, mixed mode, sharing)
```

# 対応

java8 をインストールして、実行時にjavaのバージョンを切り替えるようにしようううう

```
% brew tap homebrew/cask-versions
% brew cask install adoptopenjdk8
% /usr/libexec/java_home -v "1.8"
/Library/Java/JavaVirtualMachines/adoptopenjdk-8.jdk/Contents/Home
% export JAVA_HOME=`/usr/libexec/java_home -v "1.8"`
% PATH=${JAVA_HOME}/bin:${PATH}
% parquet-tools meta ファイルパス
file:              file:ファイルパス 
creator:           parquet-mr 

file schema:       hive_schema 
--------------------------------------------------------------------------------
hoge:            OPTIONAL BINARY O:UTF8 R:0 D:1
…

row group 1:       RC:87 TS:4687 OFFSET:4 
--------------------------------------------------------------------------------
hoge:             BINARY SNAPPY DO:0 FPO:4 SZ:1281/3193/2.49 VC:87 ENC:BIT_PACKED,PLAIN,RLE ST:[no stats for this column]
…
```

めでたしめでたし
情報セキュリティとは


#情報セキュリティとは
ISO/IEC27001に、明確に定義されています。

**情報の機密性，完全性及び可用性を維持すること**

# セキュリティの三要素
情報セキュリティの定義に記載されている3単語を指します。
### 機密性
権限をもつ限られた者のみが、情報や資産を見たり触れたりできるように保護・管理されていること
　例）権限でアクセスが制限されているため機密性が高い

### 完全性
データの内容が正しい状態であること
　例）データの内容が改ざんされてないことが証明できたため完全性が高い
### 可用性
システムが継続して稼働できること
　例）障害が発生しても、システムが停止していないので可用性が高い

# 脆弱性を定量的に評価する方法
IPAが作成しているCVSS（共通脆弱性評価システム）を使って
脆弱性を定量的に評価することによって
開発者やシステム担当者に依存せず脆弱性の深刻度を知ることができる

# 対策
####入口対策
様々な攻撃を受けても侵入を防ぐこと
しかし、**人的要因を踏まえると完全に防ぐことは難しい**

- ファイアウォール
 - ネットワークとの境目に設けて、セキュリティ上の理由により「通過させてはいけない通信」を阻止する
- IDS(侵入検知システム)
 - システムを監視・分析する事で、ホストやポートをスキャンするなどのインシデントの兆候を検知し、管理者に通知する
- IPS(侵入防止システム)
 - IDSで検知した通信を制限する
 - ※IDSとIPSを合わせて、IDPSともいう
- ウイルス対策ソフト
- 電子メールフィルタリング

####内部対策・出口対策
主に侵入された後の、拡大防止・監視強化をする

- 不正なログの監視
- ネットワーク分離設計
 - 1.インターネット、2.外部公開、3.内部のみ　の3領域に分けて考える
 - インターネットと、内部ネットワークの中間に位置する領域を **DMZ(非武装地帯)**と呼ぶ
- 管理者権限の最小化
- ファイル共有の制限
- MACアドレスフィルタリング
- ファイアウォールの外向通信遮断ルール設定

#### 参照元、用語集
[IPA](https://www.ipa.go.jp/index.html)
[IPA-『高度標的型攻撃』対策に向けたシステム設計ガイド](https://www.ipa.go.jp/files/000046236.pdf)
[IPA-侵入検知および侵入防止システム（IDPS）に関するガイド](https://www.ipa.go.jp/files/000025364.pdf)
[CVSS](https://jvndb.jvn.jp/cvss/index.html)
[総務省](https://www.soumu.go.jp/main_sosiki/joho_tsusin/security/intro/security/index.html)

#### wikipedia
[情報セキュリティ](https://ja.wikipedia.org/wiki/情報セキュリティ)
[最小権限の原則](https://ja.wikipedia.org/wiki/最小権限の原則)
[完全性](https://ja.wikipedia.org/wiki/データ完全性)
[可用性](https://ja.wikipedia.org/wiki/可用性)
[ファイアウォール](https://ja.wikipedia.org/wiki/ファイアウォール)
[侵入検知システム](https://ja.wikipedia.org/wiki/侵入検知システム)

#### 参考文献
[増井 敏克　「図解まるわかり セキュリティのしくみ」　翔泳社
](https://www.shoeisha.co.jp/book/detail/9784798157207)
#Rails + rake で複数行のDescriptionを設定する、表示する ( display multiple lines description / describe with heredoc newlines )

# rake 

lib/tasks/some_job.rake

```rb
desc <<~DESC
  This job
  is so
  Great job
DESC

task some_job: :environment do
  # do something
end
```

# describe

descript オプションで全行表示される

```
bin/rails --describe some_job

rails some_job
    This job
    is so
    Great job
```

# tasks

一覧だと一行だけ表示される

```
bin/rails --tasks

...
rails some_job                           # This job
...
```

# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/3070








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
#Ruby Heredoc remove newline and indents ( ヒアドキュメントで改行とインデントを削除する )

Heredocを閉じたあとにメソッドチェーンするのではなくて、始まりにメソッドチェーンを書けることに驚いた

```rb
<<~DESC.gsub("\n", "")
  FOO
  BAR
DESC

=> "FOOBAR"

```

# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/3069








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Atcoder ABC160 A-EをPythonで

#A Coffee
2文字目=3文字目かつ4文字目=5文字目ならYes、それ以外はNo

```ABC160a.py
s=input()

if s[2]==s[3]:
    if s[4]==s[5]:
        print("Yes")
        exit()
print("No")
```

#B Golden Coins
貨幣価値の高いものから順に入れていけばOK。[AOJの問題](http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=DPL_1_A&lang=jp)みたいにうまくいかないパターンかなと思ったら違った。

```ABC160b.py
n=int(input())

a=n//500
b=(n%500)//5

print(1000*a+5*b)
```

#C Traveling Salesman
終点と始点区間を含む$n$区間のうち、最も距離の長い区間を除いた和を出力する

```ABC160c.py
k,n=map(int,input().split())
a=list(map(int,input().split()))
b=[]
for i in range(1,n):
    b.append(a[i]-a[i-1])
b.append(k-a[n-1]+a[0])

b=sorted(b)
print(sum(b[:n-1]))
```

#D Line++
2点$(i,j)$を結ぶパスは以下の2通り。最も少ないものを数え上げていく。$x-y$間の1を足すことを忘れずに。
・$i$と$j$を直結する（$j-i$）
・$i=>x=>y=>j$と回る

```ABC160d.py
n, x, y = map(int, input().split())

ans = [0] * n
for i in range(n-1):
  for j in range(i+1, n):
    d = min(j-i, abs(i-x+1)+abs(j-y+1)+1)
    ans[d] += 1

ans=ans[1:]#区間長0の場合を除く

for a in ans:
    print(a)
```
解説ではDFS使うって言ってたけどまだ理解できてない。。

#E Red and Green Apples
赤リンゴと緑リンゴをそれぞれ$X$個、$Y$個ずつ降順にソートして混ぜてまた降順にソートしたものと、ソートした無色リンゴの2つのリストを用意する。
その後無色リンゴがある限り赤＋緑リンゴリストの最大値と無色リンゴリストの最大値を比較して大きいものを一つずつansに足していき、リストから消していく。これを$X+Y$回繰り返す。

```ABC160e.py
x,y,a,b,c=map(int,input().split())

p=list(map(int,input().split()))
q=list(map(int,input().split()))
r=list(map(int,input().split()))
p=sorted(p,reverse=True)[:x]
q=sorted(q,reverse=True)[:y]
r=sorted(r)

p.extend(q)
p=sorted(p)

ans=0
for i in range(x+y):
    if len(r)>0:
        if p[-1]<r[-1]:
            ans+=r[-1]
            r.pop(-1)
        else:
            ans+=p[-1]
            p.pop(-1)
    else:
        ans+=p[-1]
        p.pop(-1)
        
print(ans)
```
vimのタブ幅を変更する

vimでコードを書いているときに、他のテキストエディタのノリでtabでインデントつけようとしたら、結構なスペースが挿入されたので流石に使いづらいと思って調べました。

## ちなみに
viのデフォルトのタブ幅は「8」らしいです。
これだとあまりにも広すぎるので、今回はタブ幅を「2」にしようと思います。
↓デフォルトの場合
<img width="500" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480714/2a161331-e0a9-e1b6-d6b1-fbc86c3c2e6e.png">

## 1. あるファイルを開いている時限定の設定
編集するファイルを開いて、「i」でINSERTモードにせずに以下を記述後にEnter

```
:set tabstop=2
```
↓ファイル先頭
<img width="300" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480714/be0a2c71-373a-5691-2517-011cdb2fd076.png">
↓ファイル末尾
<img width="200" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480714/edc99e75-2f85-2958-bb88-071cf2211bad.png">
これでタブ幅が狭くなりました。
__ただし、__この方法だとファイルを開いてる間しか設定が反映されず、開きなおしたときにはタブ幅が8に戻っています。
そのため、すべてのファイルに適用させようと思います。

## 2. 全てのファイルに適用する
ホームディレクトリに移動後に以下を入力

```
vi ~/.vimrc
```
ここに設定を記述します。

```
set tabstop=2
```

これによってどのファイルを開いてもタブ幅を2で固定できます。
Blender2.8xをマウスではなくペンタブで使うときの設定

# はじめに
マウスの中ボタンの代わりに、ペンタブのペンでオブジェクトをぐりぐりすることが出来るようになったので、シェアします。

# 環境
PC: MacBookPro 2017
OS: Catalina 10.15
ペンタブ：Wacom Intuos CTH-690/K
アプリ：Blender2.82

# 設定
## Blenderを起動する
この後の設定で、Blenderを選択出来るようにするためです。起動だけでOK。

## Macの設定で、ペンタブの設定画面を選択
「システム環境設定」→ 「ワコム」を選択
<img width="651" alt="スクリーンショット 2020-04-14 10.52.34.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83787/d566610f-b784-adff-cc15-d66d1b4f56e3.jpeg">


## Blenderを選択
<img width="655" alt="スクリーンショット 2020-04-14 10.54.19.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83787/b6e1ae5b-fdba-cc63-1120-2312b3ebb339.jpeg">

## 「ペン」を選択＆設定
<img width="652" alt="スクリーンショット 2020-04-14 10.55.51.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83787/39c4f1bd-defa-713d-45ed-2d5a506949aa.jpeg">
###1. ペンの上ボタンを「中ボタンクリック」にする
###2. ペンの下ボタンを「Shift　＋　中ボタンクリック」にする


## 「タブレット」を選択＆設定
<img width="655" alt="スクリーンショット 2020-04-14 10.59.17.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83787/4c3e6404-f0fb-28bc-7644-a9665e28996a.jpeg">
###1. 左上ボタンを「ホイール」にする
###2. 左下ボタンを「右ボタンクリック」にする
###3. 右上ボタンを「やり直し」にする
###4. 右下ボタンを「取り消し」にする

## 動作確認
ペンの下ボタンを押しながらペンを動かす→ 視点移動
ペンの上ボタンを押しながらペンを動かす→　視点回転
タブレットの左上ボタンを押しながらペンを動かす→ズームイン、ズームアウト

# この記事を書いたきっかけ
マウスのカチカチ音が気になる。そういえば最近、利き腕が疲れてて、肩こりもつらい。
→マウスを新しく買おう！
　→「エルゴノミクス かつ　静音　かつ　Macの中ボタン（ホイール）対応」の気に入ったマウスになかなかたどりつけない
　　→そういえばLogicoolのゲームパッドがあった。使ってみよう
　　　→思ったよりも手指の移動が多くて不便
　　　　→あとは入力デバイスといえば... ペンタブ！？
　　　　　→やってみたら予想以上に快適。これはシェアしよう！
わかりやすくBIG-IPの用語を説明する

## 概要
BIG-IPとは、ロードバランスをするための管理ツールである。
使うために必要な知識をわかりやすく説明したいと思います。


## 用語
### ノード
 ノードは
- 「サーバ（IP情報含む）名」
です。
サーバ名などを設定しておくと良いでしょう。
例）adminServer1 や　adminServer2 など

### プール
プールは
- 「ロードバランスしたいグループ名」
ポートなどによってグループ化されることが多いのでサーバの概略名とポート等にすると良いでしょう。
例）adminServer_8080


#### ノードとプールの補足説明
プールにノードを参加させることによって、プール単位にバランシングすることができます


## 参考
https://docs.oracle.com/cd/E26853_01/coh.371/b65027/appendix_f5.htm
「エラー0x8007003B：予期しないネットワークエラーが発生しました。」の解決法

##「エラー0x8007003B：予期しないネットワークエラーが発生しました。」

NASからローカルPCにファイルをコピーした時に、上記メッセージが表示されコピーが失敗に終わった。複数のファイルをコピーしていたのだが、どうやら大きいサイズのファイルだけが失敗しているみたいで、色々調べて解決できたのでメモ書きしておく。

##解決策：レジストリエディタ追加
タイムアウトしているのが原因なので、タイムアウトの時間を延長させることで解決。

1. Windowsキー　+　「R」を同時に押す
2. 「ファイル名を指定して実行」が表示されるので、「**regedit**」と入力しEnterを押す（「このアプリがデバイスに～と表示されるが、はいを押して進む」）
3. 「**HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\LanmanWorkstation\Parameters**」まで移動する
4. Parametersを右クリックし、「新規」→「DWORD(32ビット)値」を選択し、「**SessTimeout**」と名前を付ける
5. 「SessTimeout」をダブルクリックし、「値のデータ」を**300**にする（300は5分のことを指す）

以上、これにて解決！
Xplenty : Curl Functionを使ったデータ更新 


#シナリオ説明
今回のテーマは「多様なデータ連携」に関するトピックです。昨今クラウド時代の到来により、データの抽出方法や保存先へのデータ更新方法は非常に多様になりました。クラウドアプリケーションのほとんどがAPIによるデータ抽出や更新方法をサポートしていたりします。

今回は、APIを利用したデータ更新について紹介してみたいと思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65461/d14c8a63-aef0-e597-7a12-2ab201221fb9.png)


ETLツールがAPIの仕様に合わせて相手先アプリケーションにデータ書き込むことができるってご存知だったでしょうか？昨今のETLでは、それが可能な製品もいくつか出てきているのですが、意外と知らない方も多いのではないかと思います。

では、どうやってXplentyでは実現できるのでしょうか？
まず今回作るパッケージ（データ取得から更新までの一連の処理）の概要を紹介します。 

早速、言い訳になりますが、この処理自体は、ビジネス的には全く意味がないデータ連携処理です。
ここでは、どのようにソースシステムからデータが連携され、データ保管先に書き込まれるかの流れを見ていただければと思います。

#パッケージ作成
**1.データ取得処理**

まずNHKのAPIに対してデータを取得するための設定です。
XplentyのSourceのリストにある「Rest API」コンポーネントを使用します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65461/78da65e8-a001-8df6-692e-ef6f68b7f507.png)

コンポーネントで以下のようにURLを設定していきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65461/fa84660a-e7b8-963c-f2a6-2e2c272b09e6.png)

さらに取得する項目「title(番組名)」と「subtitle(番組サブタイトル)」をセットします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65461/1b6a7de4-d876-d466-9208-a73fb8d9175a.png)

これでデータ取得側の設定は完了です。


**2.データ更新処理**

次はデータ更新処理を設定します。

Transformationで「Select」コンポーネントを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65461/61a0ee99-b83a-0992-a52a-b3adecc13407.png)

Selectコンポーネントの式エディタを開き、Trello側のAPIの仕様に合わせて、以下の式をセットします。

コマンドとしては以下のようになります。
Curl(CONCAT('https://trello.com/1/cards?key=$mykey&token=$mytoken&idList=xxxxxxxxx&name=',URLEncode(title),'&desc=',URLEncode(subtitle)),'POST','{"Accept":"text/json"}')

さらにCurlコマンドの結果のうち、 Status部分を取得し、ログとして出力できるように上記の式にプラスで<font color="red">赤字部分</font>を設定しています。

Curl(CONCAT('https://trello.com/1/cards?key=$mykey&token=$mytoken&idList=xxxxxxxxx&name=',URLEncode(title),'&desc=',URLEncode(subtitle)),'POST','{"Accept":"text/json"}')#'status'

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65461/c3bb5202-fa88-bfae-818d-573d0e398eb8.png)


リクエスト結果（statusのみ取得）をセットする列の名称をALIASにセットします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65461/81502ebb-76d0-bf58-f754-3370f79c6d1d.png)

あとは結果をストレージなど、Destinationにある任意のコンポーネントを選択し、Curlの結果ログ（今回は「Status」のみ）を保存するだけです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65461/a70e514d-0515-905c-6eb9-7e676d8a34d9.png)

最終的なパッケージは以下のようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65461/d7fc9acd-4367-bab9-d745-27859b0e5fe7.png)

**3.結果を確認**

実際にデータを実行してみましょう。

狙い通り、指定したリストに連携したデータに基づいて作成されたカードががセットされていることを確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65461/3969c93f-3c43-cd58-c553-4d385734c8a9.png)

#最後に
今回はRest APIで取得したデータをRest APIを使って更新してみました。
[Xplenty](https://www.xplenty.com/jp/)はG2 Crowdにて2020年SpringのETLツールカテゴリにおいて「Leader」に選ばれています。（G2 Crowdのレビューページでは、ユーザーの声がビデオで紹介されており、変換の多様性、すぐに使えるコネクタの豊富さ、サポートのレスポンスの良さ、学習が容易といった点を評価していただいてます。）

是非、この機会にクラウドETL「Xplenty」を**[1ヶ月間無償トライアル](https://try.xplenty.com/jp/)**で体験してみてください。
[PM] プロジェクトマネージメント

PMのあるべき形をここに書きます。

# プロジェクトマネージメントとは

期限内に予算金額内で期待レベルの技術成果のもと割り当て資源を有効活用して顧客が満足する状態で完了するために活動すること。

プロジェクトマネジメントの手法を使用することで技術の伝達や標準化が可能になり、プロジェクトの成果が高まることが期待されている。

## 活動内容

プロジェクトマネージメントでは下記の活動を行う。

* プロジェクトの企画
* リスク測定
* 利用できる資源の見積り
* 作業の系統化　WBS (Work Breakdown Structure)の作成
* 必要な人的・物的資源の確保
* 費用の見積
* チームメンバーへの作業の割り振り
* 進捗管理
* 目的に沿った結果が出るように作業の方向性を維持する
* 達成した結果の分析

## プロジェクト

プロジェクトとは、明確に定義された目標があり、必ず開始時点と終了時点があり、永続的でない一時的な組織が担当する1人のリーダ（プロジェクトマネージャ）と複数のメンバーから構成され、目的達成のための予算が与えられ、いくつかの工程から成り立ち、ライフサイクルの各段階で必要資源が変化し、予期できない事態が発生することがあり、後工程ほど変更・修正の困難度が増すもの。

#プロジェクトのプロセス郡

## 立上げプロセス
* プロジェクト存在の認識
* プロジェクトが達成すべき事柄の認識
* ゴールの設定
* 利害関係者の期待の明確化
* プロジェクトスコープの明確化
* プロジェクトメンバーの選定

## 計画プロセス
* バランスを考慮したプロジェクトスコープの詳細化
* 作業のリストアップ
* 作業の順序付け
* スケジューリングと予算
* 利害関係者からの承認の獲得

## 実行プロセス
* チームの統率
* メンバーとの面接
* 利害関係者とのコミュニケーション
* 問題を解決する闘争心
* 必要な資源（カネ、ヒト、モノ、時間等）の確保

## 監視・コントロール・プロセス
* チェックと是正をまとめて監視プロセスと言われる
* 計画のずれを把握
* 計画の修正活動
* 利害関係者からの変化項目の受理と評価
* 必要に応じたスケジュール変更
* 必要に応じた資源量の変更調整

## 終結プロセス
* プロジェクト実施結果と成果物の確認
* 作業の終了とチームの解散
* プロジェクト経験から得た教訓のまとめ
* プロジェクトプロセスの結果の反省
* 最終報告書の作成

# PMにまつわる資格

PMにまつわる資格は下記（他にもありますが、一旦これらの資格を取得したいと思います）

プロジェクトマネージャ試験(PM)
https://www.jitec.ipa.go.jp/1_11seido/pm.html

Project Management Professional, PMP
https://www.pmi.org/certifications/types
coverage で _sqlite3 のエラーが起こったとき

この前まで coverage で python の unittest のカバレッジをを評価していたのに、急にビルド環境が変わったらcoverageでエラーが出るようになった。

調べてみたら coverage のパッケージのエラーらしい。
参考　https://github.com/nedbat/coveragepy/issues/887

$ sudo pip uninstall coverage
$ sudo pip install -U "coverage < 5"

で5以下のバージョンがインストールできる。
curl で HTTP レスポンスを監視してログに記録するシェルスクリプト


サーバーの設定切替時、本番への新しいコードのデプロイなどで、サイトの死活監視を臨時で行いたい時用の死活監視シェルスクリプトを作成しました。

目的は、どの期間にエラーが発生して解消したかログにすることで、どの時間帯でエラーが発生したかを後で見返せるようにするためです。

Qiita 記事では、cron での起動、メールや Slack で通知できるサンプルもあるので、メール通知が希望の人はそちらを参考にしても良いかも。

# 使い方


下記サンプルコードを
「sh_checkurl.sh」
として保存。

Mac/UNIX系などのターミナルで、

```
$ sh sh_checkurl.sh http://example.com checkurl.log 10
```

みたいな感じで実行します。
実行したら、ctlr+c で終了するまでひたすら実行され続けます。

また、セキュリティシステムを導入している方は、アクセスのし過ぎでブロックされないように秒間隔を調整しましょう。

## 書式

```shell
$ sh sh_checkurl.sh [監視対象URL] [ログ保存先] [間隔 (秒)]
```

## 結果サンプル

```log
2020/04/14 11:20:28,200,http://example.com
2020/04/14 11:20:38,200,http://example.com
2020/04/14 11:20:48,200,http://example.com
2020/04/14 11:21:00,200,http://example.com

```


# サンプルコード

```bash
#!/bin/sh

## Original https://qiita.com/Kakimoty_Field/items/754df3a181187fbb517c

## Example: sh sh_checkurl.sh http://example.com checkurl.log 10
### Check status of http://example.com every 10 seconds and save the result into ./checkurl.log
## $1 = Target URL
## $2 = Log Txt Filename (path from shell script)
## $3 = Interval seconds


## 引数が3つより多かったらスクリプトを実行しない
if [ $# -gt 3 ]; then
 exit 0
fi

## 値の設定
targetUrl=$1
logFilename=$2
IntervalSec=$3

echo " -- -- -- -- -- -- -- -- -- -- --"
echo "  Check HTTP Status"
echo " -- -- -- -- -- -- -- -- -- -- --"
echo "Tareget URL  : ${targetUrl}"
echo "Log File Name: ${logFilename}"
echo "Interval     : ${IntervalSec}"
echo " -- -- -- -- -- -- -- -- -- -- --"
echo "[y]. Proceed?"
echo "[q]. Quit?"
read -p "Enter your selection:  (y/q): " yesno
case "$yesno" in [yY]*) ;; *) echo "Sorry, see you soon!" ; exit 0 ;; esac

while :
do
    ## target_url へのアクセスを試みる
    datetime="$(date "+%Y/%m/%d %H:%M:%S")"
    message=`curl -o /dev/null -s -w %{http_code} $targetUrl`

    ## ログ出力
    message="${datetime},${message},${targetUrl}"
    echo ${message} >> ${logFilename}
    echo ${message}
    sleep ${IntervalSec}
done
```

# 謝意

下記を参考にさせていただきました。
ありがとうございます！
https://qiita.com/Kakimoty_Field/items/754df3a181187fbb517c
windowsでPathを通す

#PowerShellを管理者として実行
普通に環境変数を開いても、ユーザー環境変数は変更できますが、システム環境設定は変更できません。
PowerShellを管理者として起動します。次のコマンドを打つことで、システム環境変数も変更できるようになります。
`$ Start C:\Windows\system32\rundll32.exe sysdm.cpl, EditEnvironmentVariables`

#Pathを選択して編集
リストからPathを選択して編集ボタンを押します。
![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/618385/6919e79b-37f5-033b-51f6-925bbf4de4c0.png)

新規ボタンを押して、追加したいアプリケーションがあるディレクトまでのパス（アドレス）を追加します。
###これで完了です！
コマンドプロントからアプリケーション名（拡張子なし）でアプリケーションを起動できるようになります。

#再起動が必要
あれ？起動しないけど？という場合はPCを再起動してください。
それでも起動しないけど？という場合は同じくシステム環境変数にある**PATHEXT**を確認してみてください。
![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/618385/1f1586c7-ac5d-3b33-c67a-fc5e31d33f1b.png)
こちらに起動したいアプリケーションの拡張子はありますか？
なければ追加をお願いします。
Golang - MySQL Scan Error

# Problem
```
sql: Scan error on column index 5, name \"time\": unsupported Scan, storing driver.Value type []uint8 into type *time.Time]"}
```

# Solution
You need added string "parseTime=true" in mysql connection setting.

```
db, err := sql.Open("mysql", "root:@/?parseTime=true")
```

https://stackoverflow.com/questions/29341590/how-to-parse-time-from-database/29343013#29343013
https://stackoverflow.com/questions/45040319/unsupported-scan-storing-driver-value-type-uint8-into-type-time-time
Dockerのコンテナを削除する方法

- 環境
    - CentOS Linux release 7.6.1810 (Core)
    - Docker Version:18.09.6


```bash:コンテナを削除する
$ docker rm {コンテナID or コンテナ名}
```

# 削除する方法

```bash
# 停止しているコンテナを含めて全コンテナを表示する
$ docker ps -a
CONTAINER ID        IMAGE              COMMAND             CREATED             STATUS              PORTS                                              NAMES
dffe12345678        host_delete-target "/usr/sbin/init"    24 hours ago        Up 3 hours          0.0.0.0:18080->8080/tcp, 0.0.0.0:18082->8081/tcp   delete-target
93abcdefghij        host_hoge          "/usr/sbin/init"    4 months ago        Up 3 hours          0.0.0.0:8088->3389/tcp, 0.0.0.0:8089->8080/tcp     hoge

# 起動していたら停止する
$ docker-compose stop delete-target
Stopping delete-target ... done

# もう一回状態を見ておく
$ docker ps -a
CONTAINER ID        IMAGE              COMMAND             CREATED             STATUS                        PORTS                                             NAMES
dffe12345678        host_delete-target "/usr/sbin/init"    24 hours ago        Exited (137) 52 seconds ago                                                     delete-target
93abcdefghij        host_hoge          "/usr/sbin/init"    4 months ago        Up 3 hours                    0.0.0.0:8088->3389/tcp, 0.0.0.0:8089->8080/tcp    hoge

# 削除する
$ docker rm delete-target
delete-target

# 削除したコンテナがいなくなったことを確認する
$ docker ps -a
CONTAINER ID        IMAGE                               COMMAND             CREATED             STATUS              PORTS                         NAMES
93abcdefghij        host_hoge       "/usr/sbin/init"    4 months ago        Up 3 hours          0.0.0.0:8088->3389/tcp, 0.0.0.0:8089->8080/tcp    hoge
```


# Stop the container before attempting removal or force remove
```bash
$ docker rm dffe12345678
Error response from daemon: You cannot remove a running container dffe... Stop the container before attempting removal or force remove
```

- 原因 : コンテナを停止していないから
- 対応 : コンテナを停止してから削除する

# Can't find a suitable configuration file in this directory or any parent.
```bash
$ docker-compose stop delete-target
ERROR:
        Can't find a suitable configuration file in this directory or any
        parent. Are you in the right directory?

        Supported filenames: docker-compose.yml, docker-compose.yaml
```

- 原因 : `docker-compose.yml`のないディレクトリで操作するから
- 対応 : 削除対象の`docker-compose.yml`のあるディレクトリで操作する
そこそこなスペックのサーバにおけるnginxチューニングの一例

# はじめに
## 対象読者
* nginx 使ってる人／これから使おうとしている人
* nginx のチューニングどんな感じにしたら良いのかわからない
    * 最強の nginx チューニング！　……といわれても、サーバのスペック／用途と合うものかどうかわからない
    * サーバのスペック／用途に合わせた例を知りたい

## 今回とりあつかうサーバのスペック
* ConoHa VPS
* OS : Ubuntu 18.0.4
* CPU : 4 core
* メモリ : 4GB

## 今回とりあつかうサーバの用途
* リバースプロキシ用


# チューニング
## 例
``` nginx.conf

user www-data;
worker_processes auto;
worker_rlimit_nofile 50000;
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;

events {
  worker_connections 4096;
  use epoll;
}

http {
  charset UTF-8;
  sendfile on;
  tcp_nopush on;
  tcp_nodelay on;
  keepalive_timeout 20;
  client_header_timeout 20;
  client_body_timeout 20;
  send_timeout 20;
  reset_timedout_connection on;
  types_hash_max_size 2048;
  server_tokens off;

  include /etc/nginx/mime.types;
  default_type application/octet-stream;

  ssl_protocols TLSv1.2 TLSv1.3;
  ssl_prefer_server_ciphers on;

  access_log /var/log/nginx/access.log;
  error_log /var/log/nginx/error.log;

  gzip on;
  gzip_vary on;
  gzip_disable "MSIE [1-6]\.";
  gzip_proxied expired no-cache no-store private auth;
  gzip_min_length 1024;
  gzip_comp_level 6;
  gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;

# 後略
```

## 各項目の説明
### 親
- worker_rlimit_nofile
    - 設定のため OS 全体でのファイルディスクリプタ数を確認
    - ここで表示された値の 1/8 くらい = 50,000 を割り当てておけば、バランス良さそう

```
cat /proc/sys/fs/file-max
> 396419
```


### events ディレクティブ

- worker_connections
    - worker_rlimit_nofile に設定した値のさらに 1/10 くらい = キリよく 4,096 で

- multi_accept
    - そこまでカツカツにしたいわけではないので、むしろここは余裕をもって off のままにしておく
    - デフォルト off なので記述しないでおけばよい

- use
    - I/O の多重化についてシステムコールとして何を使うか
    - epoll が一番効率的


### http ディレクティブ
- tcp_nopush
    - パケット送信の効率化
    - デフォルト off なので設定する

- server_tokens
    - on だと nginx の ver. を喧伝してしまうことになる
    - デフォルト on なのでセキュリティ対策として off にする

- keepalive_timeout
    - これ以下タイムアウト関連 4 つ
    - さすがに 20 秒も待てば十分かな
- client_header_timeout
    - 同上
- client_body_timeout
    - 同上
- send_timeout
    - 同上

- reset_timedout_connection
    - タイムアウトしたやつはすぐ消してよい

- ngx_http_limit_conn_module
    - 同一 IP address からの同時接続制限。悩んだけれど、今回は設定しないことにした

- ssl_protocols
    - TLS 1.3 まで含めたい場合、含めておく
    - TLS 1.1 以下は消してしまおう

- gzip_vary
    - on にすることで Vary: Accept-Encoding が付加される

- gzip_disable
    - MS IE の 1 - 6 までは非対象とする
    - "MSIE [1-6]\.";

- gzip_proxied
    - キャッシュされないリクエストにのみ gzip 圧縮
    - expired no-cache no-store private auth;

- gzip_min_length
    - 最小ファイルサイズ指定
    - 1024 でよいかと

- gzip_comp_level
    - 圧縮率。デフォルトの 6 のままで

- gzip_types
    - 画像などは既に圧縮されていることが多いので、デフォルトのままで良い


# おわりに
* それならこっちの設定の方が良いのでは？　というご意見ご指摘ありましたら、コメントいただけますと嬉しいです！