OmniAICreator/Qiita-1.07M huggingface dataset:
[Python]小ネタ集

## はじめに
pythonの小ネタ集的な何かです
まだ完全に理解しきれてないので間違った情報乗っけてたらごめんなさい

### 文字列を任意の回数繰り返し表示させる


```python
# 文字列を十倍にする
print("hoge"*10)
# 出力>hogehogehogehogehogehogehogehogehogehogehoge
```

pythonは文字列に対しても一部の算術演算子が使えます。

```python
#文字列を付け足したい場合は
s="hoge"
s+=" fuga"
print(s)
# 出力結果>hoge fuga
```

### リストの最後の値を指定する

```python
list = ["a","b","c","d"]
print(list[-1])
# 出力結果>d
print(list[-2])
# 出力結果>c
```

リストのインデックスにマイナスを付けると後ろから値を指定できます。
リストに格納されている値がわからないときに一番後ろの値を取得したいといった状況で使えるんじゃないですかね？(実際に使ったことはあんまりないです)

### 二つの変数の値を入れ替える

```python
a = "apple"
b = "banana"
a, b = b, a
print(a)
# 出力結果 banana
print(b)
# 出力結果 apple
```
C言語とかだと一時的にaの値を保持する編巣を用意したりでめんどくさかったうえに三行のコードが必要だったのでこれで入れ替えれるのはだいぶ楽だと思います

### 複数の変数に一定の値を格納

```python
a = b = "apple"
print(a)
# 出力結果 apple
print(b)
# 出力結果 apple
```

=でつなげると一括で同じ値を格納できる

### 複数の変数に複数の値を一括で格納する

```python
a,b = "apple","banana"
print(a)
# 出力結果 apple
print(b)
# 出力結果 banana
```
ちなみに変数より値の数が多いと最後の変数がタプルの型に変換されて値が格納される
（タプルの使いかたあんまわかってないです)

```python
a , b = "apple","banana","orange"
print(a)
# 出力結果 apple
print(b)
# 出力結果 ("banana","orange")

```

### 変数の型を調べる方法

```python
s = "apple"
i = 1
b = False
print(type(s))
# 出力結果 <class 'str'>
print(type(i))
# 出力結果 <class 'int'>
print(type(b))
# 出力結果 <class 'bool'>
```

typeで変数の型を取得できる

###代表的な型のリスト

|型|説明|
|:--|:--|
|int|整数|
|float|小数|
|str|文字列|
|tuple|タプル|
|list|リスト型|
|bool|論理値True/False|
|dict|辞書型|
これ以外にもまだ結構あるらしい

## 変数に値が入っているか(Noneかどうか)の確認

```python

if l is None:
    print("lは空")
```

変数が空かどうかは```変数 is None```でチェックできる```変数 == None```で比較することはできない-PEP8に反している(PEP8:pythonのコーディング規約)

空じゃないかどうかは```if 変数```でチェック可能

## おわり
最後まで読んでくださいありがとうございました
ネタにできそうな仕様はまだ山ほどあるので気が向いたら追加していこうかなぁと思います
まだまだ初心者なんで間違ったコードや説明等があったらコメント欄で指摘してくれると助かります。
あといいねしてくれるとモチベーションの維持にいつながるのでよかったらいいねしていってくださいm(__)m
TD-PSOLAの実装

「TD-PSOLA」とは時間領域でピッチの調節を行う方法です。
実装に関しての詳しい内容はソースコードのコメントに書いています。

```c++
#include <vector>

std::vector<float> PSOLA(const std::vector<float>& data, const float& rate)
{
    //相関関数範囲
    const unsigned int size = (info.sample * 0.01) * info.channel;
    //ずれ最小値
    const unsigned int min  = size / 2;
    //ずれ最大値
    const unsigned int max  = size * 2;

    //変換データ格納用
    std::vector<float>convert(data.size() * 2);

    //元データの配列インデックス
    unsigned int offset0 = 0;
    //変換データの配列インデックス
    unsigned int offset1 = 0;

    while (offset0 + max < data.size())
    {
        //自己相関関数
        float peak = 0.0;
        int index = min;
        for (unsigned int i = min; i <= max; ++i)
        {
            float tmp = 0.0f;
            for (unsigned int n = 0; n < size; ++n)
            {
                tmp += data[n] * data[i + n];
            }

            //ピーク値更新
            if (peak < tmp)
            {
                peak  = tmp;
                index = i;
            }
        }

        //伸縮率を適応したブロックサイズ
        int tmp = index * rate;
        //ピーク位置を中心にしたブロックサイズ分の配列を作成
        std::vector<float>cut(&data[std::fmax(int(offset0 + index - tmp), 0)], &data[offset0 + index + tmp]);

        //クロスフェード処理
        for (size_t i = 0; i < cut.size(); ++i)
        {
            //ハニング窓関数はwikiに載っている公式をそのまま使用
            cut[i] *= okmonn::Hanning<float>(i, cut.size());
        }
        for (size_t i = 0; i < cut.size(); ++i)
        {
            convert[offset1 + i] += cut[i];
        }

        //元データの配列インデックス更新
        offset0 += index;
        //変換データの配列インデックス更新
        //ピークから次のピークまでの区間をクロスフェードするので更新は半分だけで大丈夫
        offset1 += cut.size() / 2;
    }

    return convert;
}

//エントリーポイント
int main(void)
{
    //テスト用の波形「ラ」の音
    std::vector<float>data(44100 * 2);
    for(size_t i = 0; i < data.size(); i += 2)
    {
        data[i] = std::sin(2.0f * std::acos(-1.0f) * 440.0f * i / 44100.0f);
        data[i + 1] = data[i];
    }
    
    //ピッチを2倍に設定
    auto psola = PSOLA(data, 2.0f);
    /*
    波形のサンプリング周波数を2倍に設定する
    前回の記事に書いたリサンプリングの処理を行えばOK
    */
    return 0;
}
```
ピッチだけをn倍にするには、再生時間をn倍にして再生速度を1/n倍にすれば良いみたいです。
自己相関を行う部分で結構な処理時間を要してしまうので注意してください。

参考サイト,本
・[タイムストレッチ、ピッチシフトのアルゴリズム](http://ackiesound.ifdef.jp/tech/timestretch.html)
・[恋声の技術に迫る](https://www.youtube.com/watch?v=LurW8FhK8oA)
・[C言語ではじめる音のプログラミング―サウンドエフェクトの信号処理](https://www.amazon.co.jp/C%E8%A8%80%E8%AA%9E%E3%81%A7%E3%81%AF%E3%81%98%E3%82%81%E3%82%8B%E9%9F%B3%E3%81%AE%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E2%80%95%E3%82%B5%E3%82%A6%E3%83%B3%E3%83%89%E3%82%A8%E3%83%95%E3%82%A7%E3%82%AF%E3%83%88%E3%81%AE%E4%BF%A1%E5%8F%B7%E5%87%A6%E7%90%86-%E9%9D%92%E6%9C%A8-%E7%9B%B4%E5%8F%B2/product-reviews/4274206505)
【画像・音処理用】Jetson Nanoのセットアップ方法

自分の備忘録で書いておきます。

![PA230016.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264781/e169076e-ace6-4e37-4fbc-7363ab2cbe22.jpeg)

（左は**jetson Nano**。右はRaspberry Pi3 model B。）

#ハード関係
ハード関係の購入品は@karaage0703 さんのブログを参考にさせていただきました。
https://karaage.hatenadiary.jp/entry/2019/04/29/073000
https://karaage.hatenadiary.jp/entry/2019/08/19/073000

中でもお気に入りはモニタ。ある程度大きくて、組立も楽なので重宝しています。
HDMIケーブルも付属しているので、追加でケーブルを購入する必要もありません。

##ファン
ファンは5V用を購入しましょう。
https://qiita.com/yamamo-to/items/bf77048b6f650aad346f

取り付けボルトには**罠があります。**M3は入りません。
![PA230014.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264781/ac1910a7-6ac4-1fea-09ef-47f605a6ff49.jpeg)
（どう頑張ってもM3は入らない。）

ネジを「あなたにおススメ」とかで購入するとエライ目に合います。

[M3用の穴を加工する方法](https://blog.goo.ne.jp/pearlwing/e/d417de4edb9390b88f3e8eb8323ceea7)もありますが、私は不器用なので素直に
M2のボルトを買うことにしました。（まだ、買っていないので、買って
付けたら追記する予定です。）

##Wifi関係
私はドングルを使ってWifiに接続しました。基本的にjetson Nanoに挿せば認識して
くれますが、何故か**再起動しないと**ネットにつながりませんでした。

#ソフト関係

##JetCardで楽々インストール
[JetCard](https://qiita.com/tomo_makes/items/859c4f8aa71d3209d591)を使えば主要なライブラリ・モジュールが普通に付いてきますので
是非使いましょう。主に以下が添付されています。

+ Numpy
+ TensorFlow
+ matplotlib
+ OpenCV など

##環境構築
JetCardに入っていないものは手動でインストールします。

コンソールの立ち上げはJetson Nanoのデスクトップから右クリックを
して「Open Terminal」（英語版）から立ち上げます。

まずは、いつものアップデートから。

```
sudo apt-get update
sudo apt-get upgrade
```

###scikit-learnなどのインストール

```py
#sudo pip3 install scikit-learn
sudo apt-get install -y python3-sklearn
#sudo pip3 install pandas
sudo pip3 install pandas==0.25.3
sudo pip3 install Jetson.GPIO
```

↑@daisukelab さんの情報提供により更新しました。(2020/5/18)
pandasのインストールは30分くらいかかります。

GPIOはお好みで。
私は、異常検知の良否判定でLEDを光らせたいのでインストールしました。

###Kerasのインストール
KerasはTensorFlowに内蔵されているので、特にインストールは必要なく
```tensorflow.keras```とすればKerasを使うことができます。（[こちら](https://qiita.com/karaage0703/items/b09f3c65eb3913d087e4#keras%E3%81%AE%E3%82%BB%E3%83%83%E3%83%88%E3%82%A2%E3%83%83%E3%83%97%E6%96%B9%E6%B3%95
)を参照）

ただ、私はKerasを主体に使うので、```tensorflow.keras```とするのが
面倒くさい！なので、Keras単体をインストールすることにしました。

```
sudo apt install libatlas-base-dev gfortran
sudo pip3 install -U cython
sudo pip3 install keras
```

###音関係のインストール
FFT変換はscipyを使うので、インストールします。

```
sudo apt-get install python3-scipy
```

また、録音やリアルタイムな音の処理はpyaudioを使っています。
こちらもインストールします。

```
sudo apt-get install portaudio19-dev
sudo pip3 install pyaudio
```

###pyqtgraphのインストール
FFTの波形を高速に描画したい場合、matplotlibでは**処理が追いつきません。**

pyqtgraphを使えば、高速に描画ができます。pyqtgraphの威力は[こちら](http://takeshid.hatenadiary.jp/entry/2015/11/27/045123)をご覧
いただければ分かるかと思います。

```
sudo pip3 install pyqtgraph
```

#まとめ
+ ファンは「電源」と「取り付けボルト」を確認して購入する。
+ JetCardは凄く便利。
Alacrittyを0.3.0から0.3.3にアップデートしたきのWarn対応

## 前回
[ターミナルをiTerm2からAlacrittyに乗り換えてみた \- Qiita](https://qiita.com/ume3_/items/f52221614f4818aadf9e)
インストールして使っていた。

## 今回
Alacrittyをアップデートしてみたところ以下の警告が出た。
`$XDG_CONFIG_HOME/alacritty/alacritty.yml` の変更が必要と判断。
修正箇所を記載する。

なお、環境はMacOSX。バージョンは0.3.0 -> 0.3.3とする。
[Releases · jwilm/alacritty](https://github.com/jwilm/alacritty/releases)

`brew cask upgrade alacritty` の後に起動するとまず以下の警告

### [WARN] window.start_maximized is deprecated
> [WARN] Config window.start_maximized is deprecated; please use window.startup_mode instead

[Macos deprecation warning · Issue \#2756 · jwilm/alacritty](https://github.com/jwilm/alacritty/issues/2756)
現象はこちらの公式のやりとりと同様だった。

公式のymlを確認すると以下の差分があったので、修正して適用した。

```diff
@@ -51,8 +51,16 @@
   #     - buttonless: Title bar, transparent background, but no title bar buttons
   decorations: full

-  # When true, alacritty starts maximized.
-  start_maximized: false
+  # Startup Mode (changes require restart)
+  #
+  # Values for `startup_mode`:
+  #   - Windowed
+  #   - Maximized
+  #   - Fullscreen
+  #
+  # Values for `startup_mode` (macOS only):
+  #   - SimpleFullscreen
+  startup_mode: Maximized

 scrolling:
   # Maximum number of lines in the scrollback buffer.
```

`startup_mode`を選ぶとよさそうであった。

### [WARN] Config render_timer is deprecated
> [WARN] Config render_timer is deprecated; please use debug.render_timer instead
> [WARN] Config persistent_logging is deprecated; please use debug.persistent_logging instead

loggingの扱いも変わっていた。 `debug` が新規に追加。
こちらも設定を確認して以下変更箇所を修正した。デフォルトのままでもよさそう。もしくは `ture` 。

```diff
@@ -167,11 +167,29 @@
   # effect.
   use_thin_strokes: true

-# Display the time it takes to redraw each frame.
-render_timer: false
+#debug:
+  # Display the time it takes to redraw each frame.
+  render_timer: false

-# Keep the log file after quitting Alacritty.
-persistent_logging: false
+  # Keep the log file after quitting Alacritty.
+  persistent_logging: false
+
+  # Log level
+  #
+  # Values for `log_level`:
+  #   - None
+  #   - Error
+  #   - Warn
+  #   - Info
+  #   - Debug
+  #   - Trace
+  #log_level: Warn
+
+  # Print all received window events.
+  #print_events: false
+
+  # Record all characters and escape sequences as test data.
+  #ref_test: false

 # If `true`, bold text is drawn using the bright color variants.
 draw_bold_text_with_bright_colors: true
```

今回は部分修正をしたが、常に新しい `$XDG_CONFIG_HOME/alacritty/alacritty.yml` に置き換えて修正したほうがいいぐらいまだまだバージョンアップによる変更が頻繁なツールに思う。
コマンドでのProxy設定


#ブラウザのProxy
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315938/a0ee5106-ec3f-e4b2-98eb-c2b5abb02fba.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315938/c425af82-464a-f322-d587-d61503d8bb33.png)



## 設定を自動的に検出する
レジストリを弄ればできるが、難易度高い

##自動構成スクリプトを使用する/セットアップスクリプトを使う
設定

```
reg add "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings" /v "AutoConfigURL" /t REG_SZ /d "http://aaaa.local/proxy.pac" /f
```


削除

```
reg delete "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings" /v "AutoConfigURL" /f
```

##LANにプロキシサーバーを使用する/プロキシサーバーを使用する
設定

```
reg add "HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Internet Settings" /f /v ProxyEnable /t reg_dword /d 1
```


削除

```
reg delete "HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Internet Settings" /f /v ProxyEnable
```
##アドレス、ポート
設定

```
reg add "HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Internet Settings" /f /v ProxyServer /t reg_sz /d Proxyアドレス:8080
```


削除

```
reg add "HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Internet Settings" /f /v ProxyServer
```
##例外
設定
`<local>`を入れることで、「ローカルアドレスにはプロキシサーバーを使用しない」にチェックが入る

```
reg add "HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Internet Settings" /f /v ProxyOverride /t reg_sz /d "192.168.*;*.test.local;<local>"
```


削除

```
reg delete "HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Internet Settings" /f /v ProxyOverride
```



#OSのProxy


##WinHTTPProxy
設定

```
netsh winhttp set proxy proxy-server="Proxyアドレス:8080" bypass-list="*.local;<local>"
```

設定(IEの設定を引き継ぐ)

```
netsh winhttp import proxy source=ie
```

確認

```
netsh winhttp show proxy
```

削除

```
netsh winhttp reset proxy
```
初めてのVulkanプログラミング step5 vertex シェーダーの作成。

Vulkanのシェーダーコードは、GLSL、HLSLなどの人間の読み取れる構文ではなく、バイトコード形式で指定する必要があります。このバイトコード形式は、SIR-Vと呼ばれVulkanとOpenCLの両方で使用するように設計されています。

## バイトコードを使用する利点
バイトコードを使用する利点は、シェーダコードをネイティブコードに変換するためにGPUベンダーが作成した**コンパイラーの複雑さが大幅に軽減されること**です。GLSLのような人間の読める構文では、一部のGPUベンダーでは、動作できても、他のドライバーでは、実行を拒否したり、コンパイラーのバグのために異なったシェーダーを実行されたりする可能性があります。SPIR-vのような単純なバイトコード形式を使用することで回避することができる場合があります。

バイトコードを作成するには、GLSLをSPIR-Vをコンパイルする方法があります。KhronosはGLSLをSPIR-Vに変換する独自のコンパイラをリリースしました。すでにVulkanSDKに含まれているため追加のダウンロードは、必要ありません。

## GLSL
GLSLには、C言語スタイルの構文を持つシェーダー言語です。そこで書かれたプログラムには、すべてにmain関数があります。入力に引数と、出力に戻り値を使用します。C言語との違いは、グローバル変数を使用して、入出力を取り扱います。もちろんグラフィックスプログラムを支援する様々な関数を用意しています。

## vertex-shader 頂点シェーダ
頂点シェーダは、各頂点を処理します。ワールドの位置、色、法線、テクスチャの座標などの属性を受け取ります。出力には、クリップ座標の位置と、色やテクスチャ－の座標など、フラグメントシェーダに渡す必要がある属性です。これらの値は、ラスタイザーによって、フラグメント上で補完され、滑らかになります。

座標軸は、次のように見える中心をゼロとした[-1,1][-1,1]座標系にフレームバッファをマッピングする同次座標です。
![](https://vulkan-tutorial.com/images/normalized_device_coordinates.svg)
最初に作成する三角形では、3つの頂点位置を直接指定して以下の形状を作成します。
![](https://vulkan-tutorial.com/images/triangle_coordinates.svg)
通常これらの座標は、頂点バッファーに格納されますがVulkanで頂点バッファーを作成し埋めることは、簡単では、ないので画面に三角形をポップアップするまで直接シェーダー内で座標を決定します。
コードは、次のようになります。新しくshader.vertファイルに以下を書き込みます。
コードの記法は、GLSLの記法にのっとりコーディングしていきます。

```glsl
#version 450

vec2 positions[3] = vec2[](
    vec2(0.0, -0.5),
    vec2(0.5, 0.5),
    vec2(-0.5, 0.5)
);

void main() {
    gl_Position = vec4(positions[gl_VertexIndex], 0.0, 1.0);
}
```

- vec2 position[3]

これに三角形の頂点の座標(x軸,y軸)を指定している。

- main 関数

main関数は、すべての頂点に関して呼び出されます。gl_vertexIndexには、現在の頂点インデックスが含まれています。これは、通常頂点バッファーのインデックスですが、今回は、直接定数で定義され,ダミーのz,w,座標と統合されクリップ座標の位置を生成します。組み込み変数gl_Positionは、出力となります。

## コンパイル
コマンドプロンプトもしくは、パワーシェルで以下のように入力します。
シェーダファイルはたくさんできると思いますのでできる方は、batファイルを作成すると楽にコンパイルできるかもしれません。

VulkanSDK内のglslangValidator.exeに-vのオプションをつけてコンパイルするファイル名を指定します。

```powershell
C:\VulkanSDK\1.1.82.1\Bin32\glslangValidator.exe -V shader.vert
```
Chrome 78がクラッシュする

Google Chrome 78へのアップデート後にクラッシュして何も見れない現象が発生しているようです(2019/10/23 朝~)。エンジン自体が起動していないためか、設定画面含めてほぼすべて開けなくなります。また、再インストールしても最新バージョンがインストールされるため解消されません。

※現象がハッキリしてきたので対応方法を更新しました(19/10/24 19:00)

<img width="482" alt="chrome.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14768/06792e83-8cf8-adef-7cd1-861e58aac29e.png">



# 検証環境
- Windows 10 Pro
- Chrome 78.0.3904.70
- Endpoint Protection 12.1 RU6 MP7

※[PCMatic](https://pcmatic.jp/)でも不具合報告有

# 対応方法

バグでは無く互換性の問題のようなので下記のいずれかが正しい対処のようです。

+ Symantec Endpoint Protectionをアンインストールもしくは、v14.2以降にバージョンアップする
+ PcMaticをアンインストール（アップデート？

その他の類似ソフトでも発生する可能性があります。

入れ替えなどが難しい場合や、すぐに使いたい場合は次の暫定方法で起動可能になります。

# 対応方法（暫定

全てのChromeを閉じたのを確認してから、コマンドラインを開き以下を実行します。

```:cmd.exe
"C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" --disable-features=RendererCodeIntegrity
```

起動してしまえば、全てのタブを閉じて終了するまで使えます。chromeのプロセスが一つでも残っている場合は有効になりません。

暫定的に起動用バッチでも作った方が良さそうです。

# 追加情報(19/10/23 15:40)

Symantec Endpoint ProtectionのVersionが14.2より古いとRender Integrity機能との互換性がなくて発生する不具合のようです。

# 追加情報2(19/10/24 9:00)

[PCMatic](https://pcmatic.jp/)でも同様の現象になるとの情報をいただいています。また、Endpointでスキャン除外にChrome.exeを入れると良いとの情報もいただいていますが、自分の環境では除外では解消できていません。

# 参考

https://mspoweruser.com/latest-google-chrome-canary-build-is-crashing-on-windows-10-devices/

# メモ

「RendererCodeIntegrity」による実行時チェックが問題のようですが、不具合の対象や環境については特にリリースは出ていません(19/10/23 12:00現在)

自動アップデート停止はmsconfigしたりしないといけないしリスクもあるので、せめて一時的に前のバージョンに戻す方法が本当は欲しいですよね...。

現象がハッキリしてきたので対応方法を更新しました(19/10/24 19:00)
Rails6 のちょい足しな新機能を試す98（add_autoload_paths_to_load_path編）

# はじめに

Rails 6 に追加された新機能を試す第98段。 今回は、 `add_autoload_paths_to_load_path` 編です。
Rails 6 では、 `zeitwerk` mode で不要なパスを $LOAD_PATH に追加するかどうかを設定するために `add_autoload_paths_to_load_path` が追加されました。
後方互換性を保つ(Rails 5以前と同じ動作にする)ため、デフォルト値は、 `true` になってます。

Ruby 2.6.5, Rails 6.0.0 で確認しました。

```shell
$ rails --version
Rails 6.0.0
```

今回は、スクリプトを書いて確認します。

# Rails プロジェクトを作る

```
$ rails new rails_sandbox
cd rails_sandbox
```

# config/application.rb を変更する。

`add_autoload_paths_to_load_path` を true にしてみます。

```ruby:config/application.rb
...
module App
  class Application < Rails::Application
    ...
    config.add_autoload_paths_to_load_path = false
  end
end
```

# 簡単なスクリプトを書く

`$LOAD_PATH` の情報を出力するスクリプトを書きます。

```scripts/load_path.rb
puts $LOAD_PATH.count
pp $LOAD_PATH
```

# 動作確認する

実行してみます

```shell
$ bin/rails runner scripts/load_path.rb
95
["/app/lib",
 "/app/vendor",
 "/usr/local/bundle/gems/turbolinks-5.2.1/lib",
...
```

`add_autoload_paths_to_load_path` を true に変更してから、再度、実行すると以下のように `$LOAD_PATH` に追加された PATH が増えていることがわかります。

```shell
$ bin/rails runner scripts/load_path.rb
113
["/app/lib",
 "/app/vendor",
 "/app/app/channels",
 ...
```

Zeitwerk を使っている場合は、 `app` ディレクトリの直下のサブディレクトリが autoload の対象のPATHとなるため、 `$LOAD_PATH` に追加する必要がありません。このため、autoload されるPATH を`$LOAD_PATH` に追加する必要はないので、 `add_autoload_paths_to_load_path` を `false` に変更することが推奨されています。

# 試したソース

試したソースは以下にあります。
https://github.com/suketa/rails_sandbox/tree/try098_add_autoload_paths_to_load_path

# 参考情報

* [new config to opt-out from adding app directories to $LOAD_PATH](https://github.com/rails/rails/commit/668673f7793be1ce318a32bb622ed411029d00a9)
* [Autoloading and Reloading Constants (Zeitwerk Mode)](https://guides.rubyonrails.org/autoloading_and_reloading_constants.html)
7月17日は世界絵文字デーらしい。ジョブズも関係している！？

7/17にチャットワークでリアクション機能がリリースされましたが、
（この機能便利ですね）
これは同日の「世界絵文字デー」にあわせたリリースだそうです。

## 世界絵文字デーとは

日本で人気が出た「絵文字」は世界中で使われる共通語となり、すっかり定着しています。
「世界絵文字デー」は、絵文字文化を世界に広める趣旨で創設された絵文字の記念日で、毎年7月17日に、世界中で絵文字に関するイベントなどがおこなわれているそうです。

## なぜ7.17なのか

World Emoji Dayとも言うそうですがなぜ7月17日になったのかというと
由来は「iOSの「カレンダー」絵文字の日付が7月17日だから」だそうです。

ほほぅ、

改めてiPhone確認してみると確かにそうでした。

普段気にしていないと全然気づかないものですね。

となると、なぜiOSの絵文字が7.17なのかと気になりました。

## 7.17はスティーブ・ジョブズが関係していた

2002年、Appleはニューヨークで開催されたMacworld Expoで、Mac向けのカレンダーアプリ「iCal」をリリースしました。
その日付こそ、2002年7月17日だったそうです。
そしてこのプレゼンはスティーブ・ジョブズでした。

世界絵文字デーというもの自体を初めて知りましたが、こんなところまでスティーブ・ジョブズが関係しているとは驚きました。
自己参照 多対多 関連アーティストテーブルに関連アーティストを紐つけて保存する

```.php
//関連アーティスト更新
//            dd((int)$request->artist_id[0]);
            if (isset($request->artist_id) && count($request->artist_id)) {
                for ($i = 0; $i < count($request->artist_id); $i++) {
                    $ArtistParams[] = [
                        'artist_id' => $request->id,
                        'related_artist_id' => $request->artist_id[$i],
                        'sort_order' => $i + 1,
                    ];
                    $this->model->related_artist()->sync($ArtistParams);

                }
            } else {
                $this->model->related_artist()->detach();
            }
```

`$ArtistParams[]`のとこ！！あと、saveじゃなくてsyncじゃないとうまくいかん。
DartでHTTPリクエストを送信する

DartでHTTPリクエストを送信するサンプルです。レスポンスで受け取ったテキストを画面に表示します。

```dart
import 'dart:convert';
import 'dart:io';

main(List<String> args) async {
  var request = await HttpClient().getUrl(Uri.parse('http://www.kirinsan.org'));
  var response = await request.close();
  var responseBodyText = await utf8.decodeStream(response);

  print(responseBodyText);
}
```
InnoDBのファイルフォーマット、行フォーマットについてまとめ(Mysql5.6の話)

以前調べてまとめた内容になります。

**mysql５．６時代にまとめているので、現在の最新バージョンと違う箇所もあるかもしれないので注意してください**
**間違いがあったらご指摘いただけるとありがたいです**

InnoDBではテーブル作成時に指定されるファイル形式と行フォーマットによって、
データ格納時のストレージの使用率が変動する。


## ファイルフォーマット
	・Antelope
		MySQL 5.6までのデフォルトファイルフォーマットで、可変長カラム(VARBINARY, VARCHAR, BLOB, TEXT)
		の先頭768バイトを B-tree ノードのインデックスレコードに格納し、残りをオーバーフローページに格納する。

	・Barracuda
		可変長カラム(VARBINARY, VARCHAR, BLOB, TEXT)の全てを外部のオーバーフローページに格納し、
		クラスタインデックスレコードにそのページへのポインタ(20B)のみを格納する。
		所謂８kbの壁の中で、Antelope以上に多くのカラムを指定することができるようになる。
		また、Barracudaにしても行フォーマットでCOMPACTなどを選択していると、
		そのテーブルはAntelopeのファイル形式が適用される



## 行フォーマット
	・REDUNDANT
		古いフォーマットでchar系での消費ストレージは指定した文字数×charasetの最大サイズになる
		char(8)のutf-8で指定すれば8*3=24が固定で消費されるということ

	・COMPACT
		UTF-8 文字列の最適化などにより REDUNDANT よりもデータサイズが小さくなる。
		REDUNDANTと違い消費されるストレージは入力された文字のバイト数が計算される。
		つまりアルファベットが入力されれば１バイトしか消費されない。

	・DYNAMIC
		Barracudaでないと指定できない。
		上記したクラスタインデックスレコードにそのページへのポインタ(20B)のみを格納することで、
		8kbの壁を超えて(正確には実際に超えている訳ではなく、２０Bだけインデックスレコードに登録することで、
		データの保存量を増やす)データを登録出来るようになる。
		Barracudaを選択してもDYNAMICかCOMPRESSEDを使用しないとこれは使えない。
		またDYNAMICの場合はデータ容量が少ない場合はオフページではなくBツリーノードに残る可能性がある。
		データの圧縮を行わない。

	・COMPRESSED
		Barracudaでないと指定できない。DYNAMICと同じ仕様を持ちさらにデータの圧縮を行う。
		圧縮を行うことで、I/Oが軽減され、スループットが改善される。
		ただし、CPUの使用率が増加するという問題があるので、サーバーのスペック次第というところもある。
		また、圧縮機能はメモリが多く搭載されている場合で読み込み負荷の高いアプリケーションを実行する場合特に有効



## 行の最大サイズ
InnoDBには１行あたりインラインに登録できるデータは8kbまでという決まりがあるが、
そもそも指定したフィールドのデータ型のサイズの合計が65535バイトを超えてはならないという決まりがある。これはvarcharなどで文字列を指定した場合に適用される。text型などはこの範疇には入らない。
なので、想定文字数が多い場合はvarcharではなく、text型にすべき


## Index column size too large. The maximum column size is 767 bytesについて
フィールドの文字コードをutf8mb4にすると、文字列あたりの最大byte数が４byteになるので、utf8では指定できたindexがサイズオーバーで登録出来ない場合ある。indexの最大サイズはデフォルトで767であるが、行フォーマットをDYNAMICかCOMPRESSEDに変更することで、innodb_large_prefixオプションでindexのサイズを最大3072byteまで拡張できる。


以下参考サイト
[InnoDBの制限とファイルフォーマットAntelopeとBarracudaの違い - かみぽわーる](https://blog.kamipo.net/entry/2014/12/05/235641)
[MySQL :: MySQL 5.6 リファレンスマニュアル :: 14.2.13.7 物理的な行構造](https://dev.mysql.com/doc/refman/5.6/ja/innodb-physical-record.html)
[MySQL :: MySQL 5.6 リファレンスマニュアル :: 14.8.3 使用されているファイル形式の識別](https://dev.mysql.com/doc/refman/5.6/ja/innodb-file-format-identifying.html)
プログラミングの種類とプログラミングパラダイム

##はじめに
[未来電子テクノロジー](https://www.miraidenshi-tech.jp/intern-content/program/)でインターンをしているRanです。
プログラミング初心者であるため、内容に誤りがあるかもしれません。
もし、誤りがあれば修正するのでどんどん指摘してください!


##確認：そもそもプログラミングとは？
人の意図した行為をするように、パソコンに処理の指示を出すことです。

#宣言型プログラミングとは?
処理方法ではなく、欲しいもの（目標物）の性質を特定することで、プログラミングすることです。

#関数型プログラミングとは?
処理を重ねていくことで、プログラミングすることです。

#手続き型プログラミング
実行すべき処理を順に記述していくことで、プログラミングすることです。

※関数型との違い
関数型は複数のパラメータとその関係性を利用したもので、主にローカル変数を使用しており副作用はありませんが、
それに対して対して手続き型は、変数書き換えなどの副作用を駆使してプログラミングしていきます。

#命令型プログラミング
手続き型とほぼ同義です。

大概的に、
関数型≒手続き型＝命令型　↔️　宣言型
と言えます。



#構造化プログラミングとは?
ソースコードが長くなった際、混乱を避けるために生まれた手法です。
以下３つ制御に則って、全体を整理してます。

①順次構造：上から順番に処理を実行する
②選択構造：条件で分岐させて、いずれからの処理を実行する
③繰り返し構造：条件が満たされるまで、同じ処理を繰り返す

#オブジェクト指向プログラミングとは？
処理命令の内容が人に伝わりやすいよう、変数名やクラス名を新しく定義していきながらプログラミングするもので、手続き型よりコードは長くなってしまうが、処理命令内容の構造がわかりやすくなります。

以下の３つの流れに沿って記述していきます。
①対象(オブジェクト）のクラスを定義する
②クラスからインスタンス(具体的なオブジェクトの実体）を表現する
③オブジェクト間でのメッセージのやり取りを定義する


#プログラミングパラダイムとは？
解決したい問題に対して、どのようにプログラミングコードしていけばいいか、その考え方や手法スタイルのことです。
１つの言語が複数のプログラミングパラダイムを持ち合わせていることを、マルチパラダイムと言います。


##参考URL
・構造化プログラミング
https://itmanabi.com/structured-objectoriented-prog/

##さいごに
これから新しい言語を学習していく際には、その言語が上記のどの性質を持ち合わせているのか、意識しながら進めていきたいと思います。
ずんだの1桁足し算問題 PHP編

[ずんだの1桁足し算問題 Ruby編](https://qiita.com/tbpgr/items/6c75930566dda97bb5b6) をPHPで書いたものです。

ちなみに, ずんだ成分ゼロです
※ずんだ＝ずんだまるさん = https://twitter.com/edamametsubu318

```php
<?php

for($i=1; $i<10; $i++) {
    for($j=1; $j<10; $j++) {
        $total = $i + $j;
        echo("{$i}+{$j}=" . str_repeat('~', $total) . $total . "\n");
    }
}
```

# 出力
```
1+1=~~2
1+2=~~~3
1+3=~~~~4
1+4=~~~~~5
1+5=~~~~~~6
1+6=~~~~~~~7
1+7=~~~~~~~~8
1+8=~~~~~~~~~9
1+9=~~~~~~~~~~10
2+1=~~~3
2+2=~~~~4
2+3=~~~~~5
2+4=~~~~~~6
2+5=~~~~~~~7
2+6=~~~~~~~~8
2+7=~~~~~~~~~9
2+8=~~~~~~~~~~10
2+9=~~~~~~~~~~~11
3+1=~~~~4
3+2=~~~~~5
3+3=~~~~~~6
3+4=~~~~~~~7
3+5=~~~~~~~~8
3+6=~~~~~~~~~9
3+7=~~~~~~~~~~10
3+8=~~~~~~~~~~~11
3+9=~~~~~~~~~~~~12
4+1=~~~~~5
4+2=~~~~~~6
4+3=~~~~~~~7
4+4=~~~~~~~~8
4+5=~~~~~~~~~9
4+6=~~~~~~~~~~10
4+7=~~~~~~~~~~~11
4+8=~~~~~~~~~~~~12
4+9=~~~~~~~~~~~~~13
5+1=~~~~~~6
5+2=~~~~~~~7
5+3=~~~~~~~~8
5+4=~~~~~~~~~9
5+5=~~~~~~~~~~10
5+6=~~~~~~~~~~~11
5+7=~~~~~~~~~~~~12
5+8=~~~~~~~~~~~~~13
5+9=~~~~~~~~~~~~~~14
6+1=~~~~~~~7
6+2=~~~~~~~~8
6+3=~~~~~~~~~9
6+4=~~~~~~~~~~10
6+5=~~~~~~~~~~~11
6+6=~~~~~~~~~~~~12
6+7=~~~~~~~~~~~~~13
6+8=~~~~~~~~~~~~~~14
6+9=~~~~~~~~~~~~~~~15
7+1=~~~~~~~~8
7+2=~~~~~~~~~9
7+3=~~~~~~~~~~10
7+4=~~~~~~~~~~~11
7+5=~~~~~~~~~~~~12
7+6=~~~~~~~~~~~~~13
7+7=~~~~~~~~~~~~~~14
7+8=~~~~~~~~~~~~~~~15
7+9=~~~~~~~~~~~~~~~~16
8+1=~~~~~~~~~9
8+2=~~~~~~~~~~10
8+3=~~~~~~~~~~~11
8+4=~~~~~~~~~~~~12
8+5=~~~~~~~~~~~~~13
8+6=~~~~~~~~~~~~~~14
8+7=~~~~~~~~~~~~~~~15
8+8=~~~~~~~~~~~~~~~~16
8+9=~~~~~~~~~~~~~~~~~17
9+1=~~~~~~~~~~10
9+2=~~~~~~~~~~~11
9+3=~~~~~~~~~~~~12
9+4=~~~~~~~~~~~~~13
9+5=~~~~~~~~~~~~~~14
9+6=~~~~~~~~~~~~~~~15
9+7=~~~~~~~~~~~~~~~~16
9+8=~~~~~~~~~~~~~~~~~17
9+9=~~~~~~~~~~~~~~~~~~18
```
exiftoolでファイルの変更日時を写真の撮影日にする方法

ファイルの変更日時(modify date)を写真の撮影日時に変更する方法です。

exiftoolというEXIF情報を扱えるCLIツールを入れます。

```
brew install exiftool
```

画像の日付情報を確認する方法:

```bash
$ exiftool -time:all -a -s CIMG2461.JPG
FileModifyDate                  : 2019:10:23 10:38:14+09:00
FileAccessDate                  : 2019:10:23 10:42:15+09:00
FileInodeChangeDate             : 2019:10:23 10:38:15+09:00
ModifyDate                      : 2015:03:15 09:21:53
DateTimeOriginal                : 2015:03:15 09:21:53
CreateDate                      : 2015:03:15 09:21:53
```

2015年撮影のものですが、ファイルの更新日が2019年になっています。

写真ファイルの更新日を撮影日に合わせる:

```bash
exiftool "-FileModifyDate<DateTimeOriginal" CIMG2461.JPG
```

これで、ファイルの更新日が変更されます。

ちなみに、ファイル名をワイルドカードで指定すれば、更新日変更を一括で行えます:

```bash
$ exiftool "-FileModifyDate<DateTimeOriginal" *.JPG
  882 image files updated
```
Amazon EC2 無料利用枠

Windows HomeでDockerを使うためにAmazon EC2を利用した話
https://qiita.com/Grandge/items/f92def265e42a11e5971

の後追い(追試)をするため、
https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/concepts.html
に接続し、
Amazon EC2 無料利用枠
を押した。

https://aws.amazon.com/jp/free/?all-free-tier.sort-by=item.additionalFields.SortRank&all-free-tier.sort-order=asc&awsf.Free%20Tier%20Types=tier%23always-free&awsm.page-all-free-tier=3

#３種類
無期限無料
１２ヶ月間無料
トライアル

![amazon.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51423/efe3778c-c1ec-c26a-657b-d2000b101810.png)

将来お金が払える目度はたっていない。

##無期限無料
無期限無料を選んでも何十個と候補がでてきて何を選べばいいかわからず。

![amazon2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51423/ecadb989-1244-c5ae-f26b-0523b1237be2.png)

##開発者用ツール
ひとまず開発するのに使うつもりのはずなので「開発者用ツール」を選ぶ。
![amazon3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51423/4fb201de-231d-3c94-7098-737ff6200d60.png)

5つ出てきて迷うのは次の２つ。

AWS CodeBuild
>1 か月あたり 100 ビルド分のビルド。build.general1.small コンピューティングタイプを使用

AWS CodeCommit
>1 か月あたり 5 人のアクティブユーザー, 1 か月あたり 50 GB/月のストレージ, 1 か月あたり 10,000 Git のリクエスト

比較対象が違い、選べない。

全部選んでも無料なら選んでやってみようと思っているけど、、、。


# 文書履歴(document history)
ver. 0.01 初稿 20191023
ver. 0.04 URL追記　20230228

### 最後までおよみいただきありがとうございました。

いいね　💚、フォローをお願いします。

####  Thank you very much for reading to the last sentence.

Please press the like icon 💚　and follow me for your happy life.
SERPOSCOPEのネットワークエラー解消手順(ERROR_NETWORK)

無料の検索順位取得ツールをAWS(EC2)上で運用しはじめました。
サーバー上で運用できるため、PCを開いていなくても検索順位の定時実行ができることは魅力的なのですが、いくつかのエラーの壁を超える必要があります。

本記事では、ネットワークエラーの解消手順について解説します。

# 環境
- SERPOSCOPE 2.10.0
- AWS EC2

# エラーの確認方法
トップページを確認すると、検索がうまくいっていませんね。(Failure)
<img width="891" alt="ScreenShot 2019-10-23 10.49.53.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/331354/96af5373-0661-7484-319e-e25870f30a33.jpeg">

検索順位がうまくいっていない時はエラーを確認します。

ログよりエラーの種類を確認できます。`トップページ > Logs`
<img width="940" alt="ScreenShot 2019-10-23 10.42.05.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/331354/691450ea-ab09-eed6-d378-42071071d4cb.jpeg">

私が遭遇した主なエラーは下記の2種類です。

- ネットワークエラーなら`ERROR_NETWORK`
- キャプチャ認証エラーなら`ERROR CAPTCHA NO SOLVER`
    - [SERPOSCOPEのキャプチャ認証エラー解消手順 – AntiCaptcha](https://labcoat.jp/serposcope-error-anticaptcha/)

# ネットワークエラーの解決方法
Githubにネットワークエラーの解決方法の記載がありました。


> These errors are due to Google restrictions / captchas. Solutions are : increase the pause between request, add proxies, add credit to all captcha solver API because they are always overloaded so serposcope can fallback on an API which work
> https://github.com/serphacker/serposcope/issues/180#issuecomment-381414112

ざっくりと日本語に訳すと、

>ネットワークエラーはGoogleの規制によるもので、解決策は下記の通り
> - リクエストの待ち時間を増やす
> - プロキシを追加する
> - 全てのキャプチャ認証のクレジットを追加する

とのことです。

それぞれの解決策を見ていきます。

# リクエストの待ち時間を増やす
`ADMIN > GENERAL > NETWORKING OPTIONS > Pause`
<img width="573" alt="ScreenShot 2019-10-23 9.51.40.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/331354/65961257-ff18-c365-fb00-569ac99670af.jpeg">

リクエストの待ち時間とは、キーワード1個あたりのGoogleの検索順位を取得するための時間のことで、元々 `MIN 120, MAX 130`でしたが増やしました。

# プロキシを追加する
運用している、AWSのサーバーではなく代理のサーバーから検索順位を取得できるように代理（プロキシ）サーバーを追加します。

`ADMIN > PROXIES > Add proxy`

無料のhttpプロキシサーバーを利用する場合はログインユーザー名やパスワードは不要なので、`http proxy : http#127.0.0.1#80`の型で入力すれば良いです。
無料のプロキシ[FREE PROXY LISTS](http://proxy.moo.jp/ja/?c=JP&pr=HTTP&u=30&s=pr)を調べ追加します。(下記は追加例)
<img width="593" alt="ScreenShot 2019-10-23 10.58.39.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/331354/51a33adc-2cf6-6c0c-8ffd-7dd859bafe56.jpeg">

追加できましたね。

<img width="1166" alt="ScreenShot 2019-10-23 10.37.25.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/331354/d0d5b35f-4bd8-044e-4bb5-d7a4ce528498.jpeg">

# 全てのキャプチャ認証のクレジットを追加する
意外にもキャプチャ認証のクレジットがネットワークエラーと関係しているようですね。
私は下記の記事を参考に、AntiCaptchaのみ導入しました。

- [SERPOSCOPEのキャプチャ認証エラー解消手順 – AntiCaptcha](https://labcoat.jp/serposcope-error-anticaptcha/)

# まとめ
3点全ての対策を施し、様子を見たいと思います。
【Heroku】1つのリポジトリで複数のアプリをデプロイする

「初心者がRailsアプリをHerokuにデプロイする方法」のような情報はたくさん出回っています。

しかし、表題のような「1つリポジトリで複数のアプリをデプロイ」みたいな情報は日本ではあまり出回っていません。

ある程度経験を積んでいくと、「DBとのやり取りはAPIサーバー、フロントエンドはWebサーバー」みたいな構成で開発を行う機会が出てくると思います。

今回はその方法を簡単に解説していきます。

### こんな人向けの記事

- 簡単なWebアプリをHerokuでデプロイした経験がある
- 複数のアプリケーションを1つのリポジトリでデプロイする必要が出てきた



# 【結論】 Buildpackを使えば簡単

「1つのリポジトリ、複数のApp」のためのBuildpackが2つほど提供されているので、どちらかをBuildpackに含めれば難なくデプロイすることが可能です。

### ※Buildpackとは

- Pushしたソースコードをコンパイルするためのスクリプトを集めたもの
- 今回の表題のような、特殊な用途に対応してくれるスクリプトもある

## 利用できるBuildpack

### [heroku-buildpack-multi-procfile](https://elements.heroku.com/buildpacks/heroku/heroku-buildpack-multi-procfile)

Herokuが公式に提供しているBuildpackですね。

Pushされた時点で環境変数`PROCFILE`に書かれたPathを参照し、そのディレクトリにある`Procfile`をルートディレクトリにコピーしてくれます。

なので、各Appそれぞれに対応するようなPathを環境変数`PROCFILE`に記述しておけば、「1つのリポジトリ、複数のApp」が可能なわけです。


### ※Procfileとは

- Appの起動時に行なってくれるコマンドを指定するためのファイル
- `プロセスタイプ: command`の形式で記述する


### [heroku-buildpack-monorepo](https://elements.heroku.com/buildpacks/lstoll/heroku-buildpack-monorepo)

こちらも公式(?)だと思います。

前者とは違い、環境変数`APP_BASE`に書かれたPathを参照し、**そのディレクトリ丸々をルートディレクトリにコピーしてくれます**。

筆者はGolangでAPI側の開発も行なっていたのですが、前者のBuildpackだと`Go modules`を読み込んでくれず、デプロイできませんでした。
一方、後者は指定ディレクトリがルートディレクトリとなっているため、そのような問題を被ることなくデプロイできました。

# 終わりに

個人的には`heroku-buildpack-multi-procfile`がおすすめですが、他にも利用できるBuildpackがあると思うので、自身で探してみるのもいいかと思います。
Laravelのマルチauthで認証済みの独自定義ユーザを取得する方法・Nuxt SSR時のログイン状態維持

`php artisan make:auth`で作成できるユーザの認証状態は`Auth::user()`で取得できますが、
マルチauthでの独自に定義したユーザは上記の方法では認証状態を取得することはできません。

そこで、認証済み独自ユーザを取得する方法をadminという独自ユーザを例に解説します。
早速ですが、以下コードになります。

```php
Auth::guard('admin')->user()
```

Authファサードのguardメソッドを使って、使用したい独自ユーザのガードを指定することで、
マルチauthでの認証済の独自ユーザの取得を実現しています。

今回はadminを指定しているので、認証済adminの取得になります。

## 利用例（Laravel × Nuxt）
実際に使うときは、routesのapi.phpなどで以下のように利用しています。

```php:/routes/api.php
Route::get('/admin', function () {
  return Auth::guard('admin')->user();
})->name('admin');
```

Nuxtでログイン状態の維持のために以下のように使えます。

```js:/store/index.js
export const actions = {
  async nuxtServerInit ({ commit }, { app }) {
    await app.$axios.$get('/admin')
      .then(admin => commit('auth/setAdmin', admin))
      .catch(() => commit('auth/setAdmin', null))
  }
}
```

SSR時のログインチェックを行わせることで、Nuxt側で認証をstoreにセットして、ログイン状態を維持できるわけですね。

LaravelとNuxtでの認証周りの開発の参考になれば幸いです。

## マルチauth作成で参考にさせていただいたページ
https://qiita.com/PKunito/items/a8300db38ce7d6949106
Dockerfileではまったことや最近したことまとめ

docker buildをしていてうまく動かないことや新たにもった知見などがあったのでまとめる。

## ARG 
外部から値を注入できる

下記Dockerdileから一部抜粋

``` Dockerfile
ARG copy_path

# 使うとき
COPY ${copy_path} /path/to/use

```

buildするとき

```
docker build ./ --build-arg copy_path=./script
```


## ADD
COPYとの違いとして、解凍、展開をしてくれると記載されていることが多いが、zipファイルは解凍されないので注意。
解凍、展開はtar、gzの場合に行われる。

## docker build時の注意点

### context
一番ハマったやつ


```
sample
 |- docker
 |  |- web
 |      |- Dockerfile
 |
 |- config
     |- web
        |- nginx.conf
```

上記のようなディレクトリ構造でプロジェクトルートにてdokcer buildを行う際、


`docker build -f docker/web/Dockerfile docker/web` とすると `nginx.conf` を参照（ADDやCOPY）することはできなくなる。

これは　`docker/web` と指定している部分（context）で参照スコープを絞っているため、 `docker/web` よりも上位階層から枝分かれしたディレクトリを見れなくなってしまうからということらしい。


 言われてみるとなるほど！となるんだけど別リポジトリのDockerfileやMakefileをコピってきてちょちょで使おうとするとハマりやすそうなところだったのでまとめてみました。

以上
コードフォーマッターの導入

# コードフォーマッターとは

- ソースコードを整形してくれるツール
- イケてる環境は何かしら導入されてるはず

## 導入することの利点

- レビュー時に細かい指摘をしなくて済む
- ソースコードの品質を最低限担保することが出来る

## この記事で紹介しない事

- `babel`や`node-sass` 等のトランスパイルの環境には触れません

## 完成形

最終的な内容はこちらのリポジトリにあります

[リポジトリへのリンク](https://github.com/kkkaoru/lint-demo/tree/49ecf71f3d9d7aff47c7e79c66f8d15caa603f45
)


## 紹介するフォーマッターの一覧

- [Prettier](https://github.com/prettier/prettier)
- [ESLint](https://github.com/eslint/eslint)
- [stylelint](https://github.com/stylelint/stylelint)


## 導入
作業ディレクトリの作成と移動

``` sh
$ mkdir lint-demo && cd lint-demo
```

ディレクトリの初期化

``` sh
$ npm init -y
```

ライブラリのインストール

``` sh
$ yarn add -D prettier eslint stylelint
```

## 設定ファイルの追加

設定ファイルが無いとLintタスクの実行が出来ないので設定ファイルの追加を行う

### Prettier

プロジェクトのルートディレクトリで`.prettierrc`ファイルを追加

[Prettierの設定可能な項目](https://prettier.io/docs/en/configuration.html)

以下は設定の一例


``` .prettierrc
{
  "singleQuote": true,
  "trailingComma": "all",
  "htmlWhitespaceSensitivity": "css",
  "printWidth": 120
}
```

### ESLint

Parserを追加

```
$ yarn add -D babel-eslint
```

Prettier と併用する為に以下のpackagesを追加

``` sh
$ yarn add -D eslint-plugin-prettier eslint-config-prettier
```

Google の推奨設定を利用する為に下記のpackageを追加

``` sh
$ yarn add -D eslint-config-google
```

ESLintの設定ファイルはpackage.jsonに追加可能なので以下の用に記載

``` package.json
{
  "eslintConfig": {
    "parser": "babel-eslint",
    "env": {
      "browser": true
    },
    "extends": [
      "google",
      "plugin:prettier/recommended"
    ]
  }
}
```

### stylelint

Prettier との併用の為に下記のpackageを追加

``` sh
$ yarn add -D stylelint-config-prettier
```

SCSS で利用出来るように下記のpackagesを追加

``` sh
$ yarn add -D stylelint-scss stylelint-config-recommended-scss
```

スタイルのプロパティの並べ替えを行えるように以下を追加

``` sh
$ yarn add -D stylelint-order stylelint-config-rational-order
```

displayによって無効になるプロパティを検知する為に、以下のpluginを追加

``` sh
$ yarn add -D stylelint-declaration-block-no-ignored-properties
```

以下の用にpackage.jsonに追加すると設定を読み込んでくれる

``` package.json
{
  "stylelint": {
    "plugins": [
      "stylelint-declaration-block-no-ignored-properties"
    ],
    "extends": [
      "stylelint-config-rational-order",
      "stylelint-config-recommended-scss",
      "stylelint-config-prettier"
    ],
    "rules": {
      "plugin/declaration-block-no-ignored-properties": true
    }
  }
}
```

## 実行環境の構築

Lintの実行にはnpm scriptsを利用する

Lint用にファイルを追加

``` sh
# ディレクトリの作成
$ mkdir -p src/{scss,html,js}
# 空のファイルを追加
$ touch src/{html/index.html,js/main.js,scss/main.scss}
```

Git hooks でLintのタスクが実行される用に以下のパッケージを導入

``` sh
$ yarn add -D husky lint-staged
```

package.json に以下を追加

```
{
  "husky": {
    "hooks": {
      "pre-commit": "lint-staged"
    }
  },
  "lint-staged": {
    "src/html/**/*.html": "prettier --write",
    "src/js/**/*.js": "eslint --fix",
    "src/scss/**/*.scss": "stylelint --fix"
  }
}
```

これでGitのコミットを実行すると、ファイルに合わせてLintのタスクが自動で実行されます。

レガシー環境を撲滅する参考にご利用下さい :muscle:
【jQuery】snowfallプラグインで複数画像対応

画面に雪を降らせることができる、JQueryプラグイン「JQuery-Snowfall」は、
簡単設置ができるが、デフォルトでは降らせる画像を複数設定できない。
羽を降らせる演出を行うために、複数の種類の羽画像を用いるためのカスタマイズを行った

#使用するプラグイン
####github
https://github.com/loktar00/JQuery-Snowfall
####詳しい説明
http://www.north-geek.com/entry/jquery-snow

#カスタマイズ
2011年にすでに詳しい方法が紹介されている。参考にさせていただきました。
https://wispblog.tree-web.net/data/1/page_1_1951.html

##手段は参考サイトと同じ
#####やりたいこと
呼び出し側のimageオプションに、複数のパスを記述できるようにし、その複数画像をランダムに配置する。
###ランダムな数値を呼び出す関数設置（参考そのまま）

```js
// Randam Array Tree-Web custom 2011/10/29

function randArray(_str){
   var i = _str.length;
   while (i) {
      var y = Math.floor(Math.random()*i);
      var t = _str[--i];
      _str[i] = _str[y];
      _str[y] = t;
   }
   return _str;
}
```
元記事では、
>「//random fuction for generating random vals」と書かれているソースの下

という表記でしたが、プラグインが新しくなったのか、その箇所は消えていたので、
// Snow flake object　の上に配置しました。（123行目あたり）


###プログラム修正
```js
if(options.image){
                    flakeMarkup = document.createElement("img");
                    flakeMarkup.src = options.image; //←この行
                }else{
                    flakeMarkup = document.createElement("div");
                    $(flakeMarkup).css({'background' : options.flakeColor});
                }
```
flakeMarkup.src = options.image;　を編集します。

```js
if(options.image){
                    flakeMarkup = document.createElement("img");
                    flakeMarkup.src = randArray(options.image)[0];
                }else{
                    flakeMarkup = document.createElement("div");
                    $(flakeMarkup).css({'background' : options.flakeColor});
                }
```

###呼び出し/設定

```html
<script type='text/javascript'>
    $(document).ready(function () {
        $(document).snowfall({
            image : [
                '/sp/common/images/hane.png',
                '/sp/common/images/hane2.png',
                '/sp/common/images/hane3.png',
                '/sp/common/images/hane4.png'
            ],
            flakeCount: 35,
            maxSpeed: 2,
            minSpeed: 1,
            maxSize: 150,
            minSize: 80,
            shadow : false
        });
    });
</script>
```

###まとめ
参考にさせていただいたサイトをただ参考にしただけですが、
汎用性のある使いやすいプラグインなので、これからも要所で使えればと思います。
iOS13 アンドロイド端末でも問題なく動作しました。
Slackメッセージの書式設定まとめ

#Slackメッセージの書式設定まとめ

テキストの前後を下記記号囲むと、指定フォーマットに表示されることができます。

・「 \* 」（アスタリスク）で囲むと **太文字**  で表示されます。
・「 _ 」（アンダーバー）で囲むと  斜体  で表示されます。
・「 ~ 」（チルダ）で囲むと   ~~取り消し線~~  が引かれます。
・「 \` 」（バックフォート）で囲むと、背景あり赤文字は<font color="Red">赤色</font> で表示されます。
・「 \` 」（バックフォート）3つで囲むと、```テキスト``` の背景に囲いをつくることができます。

##太文字　ctrl+B

テキストを太字にするには、対象のテキストの前後を次のように * (アスタリスク) で囲みます : 
**\*対象のテキスト\***

デスクトップのショートカット :
テキストを選択し、 (Mac) §+Bか  (Windows/Linux) ctrl+Bを押します。


##斜体　ctrl+i
テキストを斜体にするには、対象のテキストの前後を次のように _ (アンダースコア) で囲みます :
 **\_対象のテキスト\_**

デスクトップのショートカット :
テキストを選択し、 (Mac) §+i か  (Windows/Linux) ctrl+iを押します。


##取り消し線　ctrl+X

テキストに取り消し線を設定するには、対象のテキストの前後を次のように ~ (チルダ)で囲みます : 
**\~対象のテキスト\~**

デスクトップのショートカット :
テキストを選択し、 (Mac) §+Xか  (Windows/Linux) ctrl+Xを押します。

>
注意 : 残念ながら「取り消し線」の場合は、日本語 (全角) 入力ができません。また「斜体」の場合は、日本語 (全角) 入力はできますが、装飾記号で囲んだテキストブロックの前後にスペースを入れてください。


##引用　ctrl+>
引用するには、文頭に次のように大なり (>) 記号を入れます。
**\> 一文を引用
\>>> 複数の文を引用**

デスクトップのショートカット :
テキストを選択し、 (Mac) §+>か  (Windows/Linux) ctrl+> を押します。


##インラインコード　 ctrl+shift+C

インラインコードを設定するには、対象のテキストを次のようにバッククォート  (\`) 記号で囲みます。
**\` 1 つの単語や 1 行の文を設定\`
\`\`\` ひとまとまりのテキストを設定```**

デスクトップのショートカット :
テキストを選択し、 (Mac) §+shift+Cか  (Windows/Linux) ctrl+shift+Cを押します。

>注意 : 太字や斜体など他の書式はインラインコードには表示されません。より高度にコードをシェアする場合には スニペットの作成をおすすめします！


#リスト　ctrl+shift+7　ctrl+shift+8

箇条書きにするには、文頭に番号か黒点 (•) を入力します。**shift+enter**を押すと、フォーマット済みの新しい行が作成されます。

デスクトップのショートカット :
**番号付きのリストの場合 :
Mac : §+shift+7
Windows : ctrl+shift+7
黒点による箇条書きの場合 :
Mac : §+shift+8
Windows : ctrl+shift+8**

>Tip :  (Mac) か  (ほとんどの Windows マシンでテンキーを使用) を押すと黒点 (•) が簡単に入力できます。また、アステリスク (*) で箇条書きを書き始めると、自動的に黒点に変換されます。 

>注意 : これらの装飾記号は、英数 (半角) と日本語 (全角) のどちらのモードでも入力することが可能です。(一部例外あり)ですが、英数 (半角) 入力をする場合は、装飾記号で囲んだテキストブロックの前後にスペースを入力する必要があります。

参照元：https://slack.com/intl/ja-jp/help/articles/202288908-%E3%83%A1%E3%83%83%E3%82%BB%E3%83%BC%E3%82%B8%E3%81%AE%E6%9B%B8%E5%BC%8F%E8%A8%AD%E5%AE%9A
【Ansible】多次元の辞書型変数の参照方法(AnsibleUndefinedVariableのエラー対処)

例えば、以下のような変数定義をしている場合、

```yaml
foo:
    bar: XXXXXXXX
```

参照時には、`.`を使うか、キーを`'`で囲みます。

```yaml
var: "{{ foo.bar }}"
```

```yaml
var: "{{ foo['bar'] }}"
```

以下のような`'`無しの記述だと、

```yaml
var: "{{ foo[bar] }}"
```

`'bar'`が未定義として、`AnsibleUndefinedVariable`のエラーとなります。

```
fatal: [hogehoge]: FAILED! => {"changed": false, "msg": "AnsibleUndefinedVariable: {{ foo[bar] }}: 'bar' is undefined"}
```

# 環境

- ansible 2.4.2
2019-10-23 Windows 7 > Windows Update > コード 80092004 Windows Updateで不明なエラーが発生しました。

```txt:動作環境
Windows 7 Professional (32bit)
```

### 症状

Windows Updateを適用するが、何度も失敗する。

> コード 80092004 Windows Updateで不明なエラーが発生しました。

### 対処

- [Windows Update のエラー 80092004、80073701の対処法（メモ）](https://freesoft.tvbok.com/tips/update_error_code/80092004-80073701.html)
    - ぼくんちのTV別館 KEN(tvbok)様

情報感謝です。

1. [Microsoft Updateカタログ](https://www.catalog.update.microsoft.com/Home.aspx)より KB4474419とKB4490628を取得
    - Windows7(x86)用
2. KB4474419を適用
    - 適用済だった
3. KB4490628を適用
4. Windows Updateを実施して再起動
    - KB4516033適用成功
    - KB4516065適用成功
    - KB4512486適用失敗
5. Windows Updateを実施して再起動
    - KB4512486適用成功
    

以上で「最新の状態」になった。
Taproot updates

# はじめに

以前「[bip-taproot](https://qiita.com/tnakagawa/items/0ca27450331183ea3509)」という投稿をしましたが、その後論議がなされて更新されています。

Pieter Wuilleがメーリングリストでまとめていますので、内容を確認していこうと思います。
https://lists.linuxfoundation.org/pipermail/bitcoin-dev/2019-October/017378.html

## Indexesは２バイト?４バイト?（Using 2 or 4 byte indexes）

これは、トランザクションダイジェスト（Transaction digest）という、署名する時のメッセージを作成する時に、インプットインデックス（input_index）が以前は2byteで記述されていましたが、これを4バイトにした方が良いのでは？という、提案を受け入れたものです。
既知ではあると思いますが、トランザクションのインプットは、トランザクションIDとインプットインデックスで構成されています。
トランザクションでは、トランザクションIDが32バイト、インプットインデックスは4バイトとなっています。
ブロックの大きさなどを考えた場合、インプットインデックスを4バイト使う事が出来ないので、2バイトにしたみたいです。
論議の中で、そこのコンセンサスルールを変えるのは良くないのでは？という意見により、インプットと同じ4バイトとしたようです。
<font color=gray>
確かに、ブロックサイズ変更とか可能性は薄いですが、なんらかの変更があった場合に対応できない為、基本的なコンセンサスルールに合わせるというのは合理的な気がします。
</font>

詳細は、以下のメールに書かれています。
https://lists.linuxfoundation.org/pipermail/bitcoin-dev/2019-June/017046.html

## 32バイトの公開鍵(32-byte public keys)

これは、公開鍵を32バイトにしようというものです。
Bitcoinでは楕円曲線暗号（ECC/Secp256k1）を利用しているので、公開鍵は楕円曲線上の点となります。
X座標は32バイトの数値として扱われるのですが、楕円曲線はX軸に対して対称となる曲線の為、X座標に対するY座標が2つ出てきてしまいます。
通常は、Y座標が偶数か奇数かを示すバイトを追加するのですが、1バイト減らす為に偶数固定にするというものです。
<font color=gray>
他への影響力や、セキュリティ面なんかも考えながら、1バイトを減らす努力をしているわけです。
</font>

詳細は、以下のメールに書かれています。
https://lists.linuxfoundation.org/pipermail/bitcoin-dev/2019-August/017247.html

## リソース制限(Resource limits)

これは、Taprootで実行されるスクリプトの制限を緩和しようというものです。
スタックの数、オペレーションの回数、スクリプトのサイズなどを、最初の規定よりも緩和しています。
<font color=gray>
Bitcoinでは、わざとチューリング完全ではないスクリプトにしています。
これは、各ノードが検証する際にリソースを枯渇しないようにする為です。
さらに、いろいろな制限が設けられています。
例えば、TaprootはSchnorrの署名検証を採用しているので、まとめて検証する事も可能となっています。
そういった事も考慮して、ある程度の緩和をさせてみたということです。
</font>

詳細は、以下のメールに書かれています。
https://lists.linuxfoundation.org/pipermail/bitcoin-dev/2019-September/017306.html

## P2SHのサポート有無(P2SH support or not)

これは、TaprootではP2SHをサーポートしないというものです。
不必要な互換性を排除するということです。
<font color=gray>
論点はずれていますが、P2PKH、P2SHなどは、全てSegwit型の方へ移行していった方が良いと思っています。
</font>

詳細は、以下のメールに書かれています。
https://lists.linuxfoundation.org/pipermail/bitcoin-dev/2019-September/017297.html

# さいごに

このように、Taprootなどはまだまだ論議が続いている状態です。
一旦のまとめとして、Updateした事をPieter Wuilleがまとめたものです。
OSSではあるものの、論議を継続して行い、まとめ上げている、BitcoinのDveloperの意識の高さを感じます。
【Python】geventライブライリについて簡単なことを整理する

# はじめに

Pythonのgeventライブラリを「入門Python3」で知ったきっかけに，公式ドキュメントなどを参考にしながら，学んだことを備忘録のようにまとめる．

# geventライブラリについて
`gevent`ライブラリはイベント駆動で，通常の命令型のコードを書くと，`gevent`が手品のように部品を**コルーチン**(注1)に変換する．
互いに通信して相手がどこにいるのかをつねに把握できるジェネレータのよう動く．
`gevent`はsocketなどのpythonの標準オブジェクトの多くを書き換え，ブロックせずに`gevent`のメカニズムを使うようにする．

>(注1.)コルーチンとは処理を中断や再開する仕組みのこと
特徴として通常の関数のとは異なり、
処理を途中で抜けて任意のタイミングで中断部分から処理を再開する．

### イベント駆動プログラミングについて
以下の資料がわかりやすく参考になった．

>イベント駆動プログラミングとI/O多重化
https://www.slideshare.net/mizzy/io-18459625

>Apache Kafka on Herokuを活用したイベント駆動アーキテクチャの設計と実装
https://www.slideshare.net/DeveloperForceJapan/apache-kafka-on-heroku

### What is gevent?
geventはコルーチンベースのpythonネットワーキングライブラリ．

本稿では，geventの以下の機能について，サンプルコードを確かめながら理解を深める．

* グリーンレットに基づく軽量の実行ユニット
* サードパーティのモジュールに対してモンキーパッチを適応


## サンプルコード

###  グリーンレットの機能
```gevent_sample.py
import gevent
from gevent import socket

if __name__ == "__main__":
    hosts = ['www.google.com','www.yahoo.co.jp','www.qiita.com']
    jobs = [gevent.spawn(gevent.socket.gethostbyname,host) for host in hosts]
    gevent.joinall(jobs,timeout=5)

    # ホスト名のIPアドレスを出力
    for job in jobs:
        print(job.value)

```

```console
$ python gevent_test.py
216.58.197.196
182.22.25.252
52.196.217.245
```

#### 説明
`socket`モジュールの`gethostbyname()`関数は,ドメイン名に対応するIPアドレスを返す．同期的なので，世界中のネームサーバーを捕まえて．そのアドレスを解決しようと競い合うときに待ちに入る．しかし,geventバージョンを使用すれば，非同期的に実行し複数のサイトを独立で解決できる．

`gevent.spawn()`は個々のgevent.socket.gethostbyname(url)を実行するために，**グリーンレット(グリーンスレッド，マイクロスレッド)**を作る.
通常のスレッドとの違いはグリーンレットならブロックしないこと．ブロック処理とは他のスレッドがその資源にアクセスできないようする処理で，排他処理や排他制御ともいう．通常のスレッドをブロックしてしまうようなことが起きても，geventはほかのグリーンレットのどれかを制御を切り替える．

`gevent.joinall()`メソッドは派生させたすべてのジョブが終了するのを待つ．


### geventのモンキーパッチ機能
geventバージョンのsocketではなく，モンキーパッチング関数を使うことができる．
これらはgevetnバージョンのモジュールを呼び出すのでなく，`socket`などの標準モジュールがグリーンレットを使うように書き換える．
Pythonコードには機能するが，Cで書かれたライブラリには適用しない．


#### モンキーパッチングについて
* 元のコードを変更することなく、動的にコードを拡張/変更する事の総称のこと．(メタプログラミングの一種)
* ライブラリのコードを直接変えたくない時とかに利用される
* テスト系ライブラリでよく利用される

```gevent_monkey.py
import gevent
from gevent import monkey;monkey.patch_all()
import socket
import time

if __name__ == "__main__":
    
    hosts = ['www.google.com','www.yahoo.co.jp','www.qiita.com']
    #gevent.spawn()の引数にはsocket.gethostbynameを指定しているが，ここがモンキーパッチング対象
    jobs = [gevent.spawn(socket.gethostbyname,host) for host in hosts]
    gevent.joinall(jobs,timeout=5)
    gevent.spawn()

    for job in jobs:
        print(job.value)
```


#### 説明

`genvent_test.py`では,`gevent.socket`モジュールを明示的にインポートしていた．
一方，`gevent_monkey.py`では，標準ライブラリである`socket`モジュールを明示的インポートした．`monkey.patch_all()`を使用しない場合，`import socket`の段階では，gevent版のsocketモジュールではなく，標準ライブラリとしてのsocketモジュールである．
モンキーパッチング関数(サンプルコードでは`monkey.patch_all()`)を使用することで，標準ライブラリをgevent版(gevent.socket)に書き換えることができる．

#所感
ここに記述したことは全然実践的でないし，もっと調べていきたい．
知らべてわかったことを追加していく予定．

# 参考文献
* 入門Python3
* http://www.gevent.org/
#VsCode でシンタックスハイライト ( コードの色 ) を変更するショートカットはコマンドパレットを開いて Change Launguage Mode を選ぶ

Syntax とか Highlight とか 入力しても何もヒットしないのが罠。

![image](https://user-images.githubusercontent.com/13635059/67340757-19849000-f569-11e9-8d57-28d18fa2438e.png)
![image](https://user-images.githubusercontent.com/13635059/67340758-1a1d2680-f569-11e9-8047-f91d394fc29a.png)


# Original by Github issue

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








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Windows10 HomeでDockerを使うためにAmazon EC2を利用した話

#はじめに
本記事は，「量子アニーリングの基礎」を読む，という勉強会（読書会）での不都合解消のために書いたものです。
##不都合
@kaizen_nagoya さんが用意してくれている検証用の[Dockerコンテナ](https://qiita.com/kaizen_nagoya/items/09a52b25d54091c8db6f) があるのですが，手持ちのノートPCがWindows10 Homeであったため~~Dockerがインストールできません。~~ HomeでもDocker Toolboxを使えば利用できるようになりますが，Windows10以前のバージョンを利用している方もいましたので，Amazon EC2にLinuxインスタンスを立ててDocker使えるようにすればいいじゃない，と思いつき，動かすまでの作業を記録することにしました。

#Amazon EC2
初めて使う場合料金が心配かと思いますが，勉強会用に利用するだけなら**無料枠**で十分です。
[ここ](https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/concepts.html)にアカウント作成からインスタンスの起動までに必要なことが一通り書いてあります。


Linuxインスタンスとの接続は[ここ](https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/AccessingInstances.html)に手順が記されています。

ちなみに，私の場合インスタンスの種類はubuntuを選択しました。（単に自分が使い慣れてるディストリビューションだったため）
接続手段としてPuTTYを選びました。
ファイル転送ソフトはWinSCPを選びました。
ubuntuへのDockerインストールは[この記事「Ubuntuにdockerをインストールする」](https://qiita.com/tkyonezu/items/0f6da57eb2d823d2611d)を参考にしました。

#主な作業内容
・アカウントを作成する
・インスタンスを起動する
　・プライベートキーの作成と保存
　・インスタンスIDの把握
　・パブリックDNSを把握する
　・デフォルトユーザー名の把握
・接続端末(TTY)を用意する
　・[PuTTYの準備](https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/putty.html)
　　・PuTTYの場合は，プライベートキーの変換
　　・PuTTYの接続設定
・ファイル転送できるようにする
・インスタンスへの接続
・[Dockerのインストール](https://qiita.com/tkyonezu/items/0f6da57eb2d823d2611d)
・[Dockerコンテナの取得](https://qiita.com/kaizen_nagoya/items/09a52b25d54091c8db6f)

#参考文献
Qiita記事[「docker(28) Openjij チュートリアルをdockerで」](https://qiita.com/kaizen_nagoya/items/09a52b25d54091c8db6f)
Qiita記事[「Ubuntuにdockerをインストールする」](https://qiita.com/tkyonezu/items/0f6da57eb2d823d2611d)