OmniAICreator/Qiita-1.07M huggingface dataset:
asdf の使用メモ [Ubuntu18.04]

### 概要

Qiita の「[質問](https://qiita.com/99810_Jomi/questions/4ac1ef9e0b053bad8add)」を見ている中で、asdf というツールが存在するようだったので使用してみた.

本記事はその記録である.

　

### asdf とは

> asdf is a CLI tool that can manage multiple language runtime versions on a per-project basis. It is like gvm, nvm, rbenv & pyenv (and more) all in one! Simply install your language's plugin!
> https://github.com/asdf-vm/asdf#asdf--

> asdfはrubyやnodeなどの各種プログラミング言語に加え、kubectlやterraformなどの多種多様なツールのバージョン管理を行うことができるCLIツールです。
> https://dev.icare.jpn.com/dev_cat/how_to_use_asdf/


### 実行環境

環境は次の通り

```bash
Ubuntu 18.04 
bash
```
　

### インストール

[公式手順](http://asdf-vm.com/guide/getting-started.html)だと asdf_version が無い、とか色々と環境変数の有効化に失敗したので、公式手順では無い手順で実施した.

asdf を使って Python 3.10.4 を導入してみる

#### 1. 最新を取得する

```bash
$ git clone https://github.com/asdf-vm/asdf.git ~/.asdf
```


#### 2. 環境変数を有効化する

```bash
$ source ~/.asdf/asdf.sh
```

　

#### 3. python 用プラグインを追加する

```bash
$ asdf plugin-add python
initializing plugin repository...Cloning into '/home/foo/.asdf/repository'...
remote: Enumerating objects: 3796, done.
remote: Counting objects: 100% (990/990), done.
remote: Compressing objects: 100% (510/510), done.
remote: Total 3796 (delta 587), reused 855 (delta 475), pack-reused 2806
Receiving objects: 100% (3796/3796), 875.58 KiB | 11.67 MiB/s, done.
Resolving deltas: 100% (1950/1950), done.
```

　

#### 4. python 3.10.4 は導入可能か調べる

```bash
$ asdf list-all python |grep -w 10
:
3.10.4
:
```

　

#### 5. Python 3.10.4 をインストールする

```bash
$ asdf install python 3.10.4
python-build 3.10.4 /home/foo/.asdf/installs/python/3.10.4
Downloading Python-3.10.4.tar.xz...
-> https://www.python.org/ftp/python/3.10.4/Python-3.10.4.tar.xz
Installing Python-3.10.4...
WARNING: The Python bz2 extension was not compiled. Missing the bzip2 lib?
Installed Python-3.10.4 to /home/foo/.asdf/installs/python/3.10.4
```

　

#### 6. Python 3.10.4 を有効にする

```bash
$ asdf global python 3.10.4
$ python --version
Python 3.10.4
```

```bash
$ asdf current python
python          3.10.4          /home/foo/.tool-versions
```

　

### その他

#### asdf で有効化した Python 3.10.4 を使わないようにする方法 ... 不明

正式手順不明.

とりあえず `$PATH` から `$HOME/.asdf` 関連を消して再設定すれば良いだろう.


## 参考にした情報

|URL|
|:--|
|http://asdf-vm.com/guide/getting-started.html|
|https://qiita.com/kikuchi_kentaro/items/d951fa7ca7c9c29a77dc|
|https://qiita.com/dhirabayashi/items/24cb4881ceef0e37d346|
|https://qiita.com/salty-byte/items/e6fe2bbc748dff15de34#fnref1|
|https://zenn.dev/noraworld/articles/replace-anyenv-with-asdf|
empty()　remove()　中身を空・削除する　jQuery

## empty()の用途
- 中身を空にしたい時に使う
:::note warn
注意
中身だけが削除される（要素自体は削除されない）
:::

## remove()の用途
- 要素ごと削除したい時に使う
:::note warn
注意
要素自体を削除する(タグも残らない)
:::

## empty()の使用方法
```js:書き方
$('空にしたいクラスやid').empty();
```
指定したクラスやidに入っている文字などの中身が空になる。

```js:例
$('div.hoge').html("アイウエオ");
// hogeクラスに「アイウエオ」という文字を入れた。この時点では「アイウエオ」が入っている。
$('div.hoge').empty();
// hogeクラスの「アイウエオ」がなくなる。（hogeクラス自体は残る）
```

## remove()の使用方法
```js:書き方
$('空にしたいクラスやid').remove();
```
指定したクラスやid自体を削除する。

```js:例
$('div.hoge').html("アイウエオ");
// hogeクラスに「アイウエオ」という文字を入れた。この時点では「アイウエオ」が入っている。
$('div.hoge').remove();
// hogeクラス自体が削除される。
```
RubyのHashでキーと値を入れ替える

# 組み込みメソッド invert を使う
キーと値を入れ替えた新しいハッシュを作成して返す。
元のハッシュで値が重複していた場合、最後に定義されている値のみ残る。
```ruby
hash1 = {main: "hamburger", side: "potato", drink: "cola"}
hash1.invert
#=> {"hamburger"=>:main, "potato"=>:side, "cola"=>:drink}

hash2 = {main: "hamburger", side: "hamburger", drink: "cola"}
hash2.invert
#=> {"hamburger"=>:side, "cola"=>:drink}
```


詳しくはこちら
https://docs.ruby-lang.org/ja/latest/method/Hash/i/invert.html

# invert を使わない方法
あまり需要はないかもしれないが、`Hash#each_with_object` でも表現できる。

```ruby
hash.each_with_object({}) do |(key, val), object|
  object[val] = key
end
# => {"hamburger"=>:main, "potato"=>:side, "cola"=>:drink}
```
IBM Cloud: Public Accessの許可ポリシーを持っているICOS bucketを見つける方法

# はじめに

ICOSを認証なしにbucketレベルで外部公開するには、[ICOSのデータを認証なしに外部公開する方法(bucketレベル)](https://qiita.com/testnin2/items/6379e5bc5ea165212e15)で記載した通り、`Public Access`というアクセスグループに対象のbucketへのアクセスを許可するポリシーを作るだけである。
`Public Access`というグループは事前定義済みなので、



にアクセスすれば、どのリソースが`Public Access`になっているかはすぐにわかるが、CLIでも簡単にわかる。

# UIからの見つけ方

- Manage -> Access(IAM) -> Access Groupsから、`Public Access`というアクセスグループを選択する。
- https://cloud.ibm.com/iam/groups/AccessGroupId-PublicAccess を直接実行しても良い。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/fec96e9c-1620-a571-fa5c-3eda0b1dce9b.png)


# CLIでの見つけ方

```
$ ibmcloud iam access-group-policies "Public Access"
Retrieving all policies of access group Public Access under account xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx as xxxxxxx@xx.xxx.xxx...
OK

Policy ID:   05fc3787-2684-4d68-b6d4-87e94453d4a1
Roles:       Content Reader
Resources:
             Service Name       cloud-object-storage
             Service Instance   516f084d-a33d-4b4c-a419-b4812fc1b788
             Resource Type      bucket
             Resource           <bucket name>




Policy ID:   0633db79-0919-4b0b-a0c7-6e69ce413a41
Roles:       Content Reader
Resources:
             Service Name       cloud-object-storage
             Service Instance   e7c52b8d-c041-4088-8245-8e8fdc6ea779
             Resource Type      bucket
             Resource           <bucket name>




Policy ID:   42331606-dcb8-426e-82ce-a1ac4d62d627
Roles:       Object Reader
Resources:
             Service Name       cloud-object-storage
             Service Instance   4a73673e-bb33-42ba-9495-a8f098aef29a
             Resource Type      bucket
             Resource           <bucket name>




Policy ID:   65dac0cc-f0be-4da9-8551-519189e09a78
Roles:       Content Reader
Resources:
             Service Name       cloud-object-storage
             Service Instance   e7c52b8d-c041-4088-8245-8e8fdc6ea779
             Resource Type      bucket
             Resource           <bucket name>




Policy ID:   a9bf5e91-1148-48a9-98e7-867982639421
Roles:       Content Reader
Resources:
             Service Name       cloud-object-storage
             Service Instance   e7c52b8d-c041-4088-8245-8e8fdc6ea779
             Resource Type      bucket
             Resource           <bucket name>




Policy ID:   b9ed2f2b-b3a0-490e-980c-b29c3bb2ad4a
Roles:       Object Reader
Resources:
             Service Name       cloud-object-storage
             Service Instance   da76c997-112b-4dc6-9cbe-8b13a179ccb2
             Resource Type      bucket
             Resource           <bucket name>




Policy ID:   be6ed5a8-8ad5-4848-b910-31bd960a3ca2
Roles:       Content Reader
Resources:
             Service Name       cloud-object-storage
             Service Instance   2c66d594-86d5-4a50-ba34-cedb18fe3126
             Resource Type      bucket
             Resource           <bucket name>



```
物理モニタ無しでx11vnc

# 前置き
x11vnc自体は接続できるが物理モニタを外すとVNCまで固まり操作が効かない状態、仮想ディスプレイ構築で対処する覚書

# 環境
OS: Ubuntu20.04 Server
デスクトップ: LXDE
普段はsshのみでディスプレイもHIDも繋がないがグラフィックのあるソフトを常時起動しておきたい

# ダミービデオドライバインストール
xserver-xorg-video-dummyをインストール
```sudo apt-get install xserver-xorg-video-dummy```

# 設定ファイル

cvtコマンドを使用して環境に応じた値を取得
```
$ cvt 1366 768
# 1368x768 59.88 Hz (CVT) hsync: 47.79 kHz; pclk: 85.25 MHz
Modeline "1368x768_60.00"   85.25  1368 1440 1576 1784  768 771 781 798 -hsync +vsync
```
上記で取得した値を入れ込みつつ新規ファイルを作成
ファイル名の頭の数字は優先度のため同ディレクトリのファイルと被らないように
/usr/share/X11/xorg.conf.d/20-dummy.conf 
```
Section "Monitor"
    Identifier "Monitor0"
    HorizSync 5.0-200.0
    VertRefresh 5.0-200.0
    #↓これ
    # 1368x768 59.88 Hz (CVT) hsync: 47.79 kHz; pclk: 85.25 MHz
    Modeline "1368x768_60.00"   85.25  1368 1440 1576 1784  768 771 781 798 -hsync +vsync
EndSection

Section "Device"
    Identifier "Monitor0"
    Driver "dummy"
EndSection

Section "Screen"
    DefaultDepth 24
    Identifier "Screen0"
    Device "Card0"
    Monitor "Monitor0"
    SubSection "Display"
    Depth 24
    Modes "1368x768"
    EndSubSection
EndSection
```
終わったらreboot
# おまけ(x11vnc)

x11vncは
```
sudo apt-get install x11vnc

x11vnc -display :0 -forever -repeat -rfbport 5900 
```
とかで起動すると上手く行く
Create and Convert Leads

似たような２種類のエラーメッセージがあるようです。

We can’t find lead ‘Chantal Smith’ with the status ‘Working - Contacted'. **Check to be sure you have assigned the proper status to the lead.**

[Create and Convert Leads points](https://trailhead.salesforce.com/es-MX/trailblazer-community/feed/0D54S00000Gf8mGSAR)


We can’t find lead ‘Chantal Smith’ with the status ‘Working - Contacted'. **Check to be sure you have assigned the proper status to the contact.**

After making Chantal Smith’s record click on Mark Status as complete
Chantal Smithの記録を作成したら、[ステータスを完了としてマーク]をクリックします

[Create and Convert Leads as Potential Customers hands on org i got the error can anyone help me out from this](https://trailhead.salesforce.com/es-MX/trailblazer-community/feed/0D54S00000EAAJYSA5)
「事実」と「意見」を見分けよう

「このプロダクトはレガシーだ」
「このプログラムは不具合が起こりやすい」
「あの上司は気難しい」

顧客サポートや開発外部署とのやり取り。事実に基づいて議論せよというが、これらは「事実」だろうか？ という話。

## 教材 (小学生向け)

[事実？意見？～事実と意見を区別する～ | わかる国語　読み書きのツボ　５・６年 | NHK for School](https://www2.nhk.or.jp/school/movie/outline.cgi?das_id=D0005150031_00000)
[「事実」と「意見」の違いを子どもに教える方法 | ライフハッカー［日本版］](https://www.lifehacker.jp/article/215317how-to-teach-kids-the-difference-between-facts-and-opin/)

- 「事実」は、本当にあったことや、だれでも確かめられること。
- 「意見」は、その人が考えたこと。

もう少し言い換えて

- 「事実」は、その真偽を証明できること。「意見」は証明できないこと。

となるようです。

### 要点

>「光浦さんは運動が苦手だ」。この文章に対して、光浦さんは「これは事実です。わたしは運動が苦手なんですよ。わたしが言ってるんだから事実でしょ」と言います。ところがカエルくんは、「これは徳田さんの意見です。だって光浦さんはウシくんよりもずっとにげ足が速いですよ」と言いました。次の文章は、「光浦さんは頭がいい」。光浦さんの答えは、「はい、事実です」。でもカエルくんは、「これはあくまで、徳田さんの意見です」と言います。

> 次の文章は、「光浦さんは気が強い」。今度は、光浦さんが「意見」、カエルくんが「事実」だと答えました。「徳田さんがそう思っているだけですよ。実はわたし、気が弱いんですよ」と光浦さん。カエルくんは、「これはもう事実です！　今の発言を聞いてもわかるように、気が強いとしか言いようがありません」と言います。これも、どちらの言い分も正しいように思えます。ここで、徳田アナが正解を発表します。

> 今言った文章は、全部「意見」でした。
> 事実と意見、この２つをどう見分けるか整理してみましょう。

> **「事実」は、本当にあったことや、だれでも確かめられること。**
> **「意見」は、その人が考えたこと。**

> 「光浦さんは運動が苦手だ。…頭がいい。…気が強い」。これは全部、文を書いた人が考えたことです。そう考える人もいれば、そうは考えない人もいます。本当かどうか確かめることができないので、これは「意見」なのです。

この動画も分かりやすい。

<iframe width="962" height="541" src="https://www.youtube.com/embed/DwdDClWP6i4" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

https://www.pinterest.jp/teachtutors/teaching-fact-vs-opinion/



## 「事実」であることが分かりやすい書き方
- 「○時○分○秒にOutOfMemoryErrorが発生している」。
- 「担当の〇〇さんが『～』と言った」。

## 「意見」であることが分かりやすい語尾

- だと思います。
- だと感じます。
- だと考えます。
- かもしれません。
- 可能性があります。


## まとめ

> 「このプロダクトはレガシーだ」

「レガシー」を定量的に定義する必要がありそう。「Java6」で作られたなど。

> 「このプログラムは不具合が起こりやすい」

「不具合が起こりやすい」を数値で表現する必要がありそう。[循環的複雑度 - Wikipedia](https://ja.wikipedia.org/wiki/%E5%BE%AA%E7%92%B0%E7%9A%84%E8%A4%87%E9%9B%91%E5%BA%A6) など。

> 「あの上司は気難しい」

具体的エピソードを添えて、誰がそう感じたのかを表現する必要がありそう。
... です。[事実？意見？～事実と意見を区別する～ | わかる国語　読み書きのツボ　５・６年 | NHK for School](https://www2.nhk.or.jp/school/movie/outline.cgi?das_id=D0005150031_00000) にはこう書かれています。


> 文章には事実と意見が混ざっています。どれが事実でどれが意見かを意識して読むと、客観的な判断ができるようになりますよ。

どれが意見でどれが事実かをわかりやすく意識して書いてあげることができると、顧客からの問い合わせや部署間のやり取りもしやすくなるかもしれません（←これは筆者の意見です）。

### 他リンク

[上司への報告は「事実」と「意見」を分けて伝える | コクヨのMANA-Biz](https://www.kokuyo-furniture.co.jp/solution/mana-biz/2016/07/post-95.php)
Rust初心者にとってEnumは難しい！JavaのEnumと何が違うの？

# ことのあらまし

Rust入門してもうすぐ2週間のみゆきです。

Rustの列挙型は集合論では直和集合、Tagged-Union と言われたり、列挙子に値を持てる点がJavaやC#といった他の言語の列挙型と違う点と解説されています。

なんとなく雰囲気が違うのは感じ取れるのですが、私の頭では理解が追い付いてないです。

特に、RustのEnumが値を持てる点で、「そういえばJavaのenumも高機能でどんな値でも（自作型でも配列でも）持つことができたはず！」ということを思い出しました。

では、両者は一体何が違うのか実際に書いて比較してみました。

※勢いで書いているので間違ったことを書いているかもしれません　＞＜

# Rust と Java の Enum を比較

まず、確認の意味も含めて単純なenumでJavaとRustを比較してみます。

```rust:Rust
enum Hoge {
  V1,
  V2,
}

// 使い方
let hoge: Hoge = Hoge::V1;
```
```java:Java
enum Hoge {
  V1,　//ordinal() = 0
  V2,  //ordinal() = 1
}

// 使い方
Hoge hoge = Hoge.V1;
```
見た目はほとんど変わらないですね！
Java の方は列挙子の上の方から暗黙的に整数0から順番に割り振られます。
Rust の方も整数が割り振られるのでしょうか？その辺はまだわかりません。

ちなみに、Javaの方はそれぞれの列挙子は静的なオブジェクトのようになっています。
以下のようなイメージです。
```java:Java
class Hoge {
    public static final V1 = new Hoge(0); // 列挙子の値は静的に値が決まるイメージ
    public static final V2 = new Hoge(1);

    private final int id;

    private Hoge(int id) {
        this.id = id;
    }
    
    public int ordinal() {
        return id;
    }
}

Hoge hoge = Hoge.V1; //列挙型とほとんど同じ
```
つまり、列挙型の列挙子の値は定義時に静的に決まって、別オブジェクトに書き換えることもできず、実行が終わるまで固定の値(定数）というイメージです。

# 直和集合を考える
直和集合とは、 __単純に足し合わせたもの__ と考えると良さそうです。

AAという集合｛ A, B, C } と、
BBという集合 { A, B, D } があったときに、
和集合 CC は { A_V1, B_V1, C_V1, A_V2, B_V2, D_V2 } の6個の区別された集合（3個 + 3個）になるらしいです。

（複雑に見えますが _V1, _V2 という添え字をつけてるだけです）

足し合わせる前に同じ要素（AやB）があっても同じものとはみなさない（区別する）のが特徴ですね。
 
（ちなみに、和集合（AA ∪ BB) は被ったところは区別しないです。なので4個の集合{A, B, C, D} です）
```rust:Rust
enum AA { A, B, C }
enum BB { A, B, D }

enum CC {
  V1(AA),//3通り
  V2(BB),//3通り
}
// 列挙型 CC は6通りの値を表す。

let cc: CC = CC::V1(AA::A);
//使用時にAA::Aを渡してインスタンス生成している。

```

なるほどなるほど。では、Java では表せないのでしょうか？

```java:Java
enum AA { A, B, C }
enum BB { A, B, D }

enum CC {
  V1(/* 静的に値が決まってしまう...*/),
  V2(/* 静的に値が決まってしまう...*/),
}

//CC cc = CC.V1(AA.A); // こういうのがやりたかったけどできない！
//定義時点で値が決まってしまうので普通にはできなかった！
```
Java は上に書いた通りenumの値は定義時に静的に決まってしまうのですね。
（定義時にコンストラクトされちゃうから、何かしらの値を渡さないとダメ...！）

一方、Rustは列挙型は値が動的に決まる...っぽい。なるほど！
そして、列挙型なのにインスタンスを生成してるんですね。
比較してみるとよくわかります。

ただし

```java:Java
enum CC {
  V1(),
  V2();

  private AA v1;
  private BB v2;
  
  private CC(){}

  private CC(AA aa) {
    v1 = aa;
  }
  
  private CC(BB bb) {
    v2 = bb;
  }

  public CC set(AA v) {
    v1 = v;
    return this;
  }
  
  public CC set(BB v) {
    v2 = v;
    return this;
  }
}


CC cc = CC.V1.set(AA.A);
// こうすれば動的に値を変更できる。
```
Java の enum はシングルトンのようなもので、各列挙子は静的に生成されたオブジェクトなので値を動的に変更しようと思えばできます。（Javaで列挙子の値を動的に書き変えるのはよくないらしいです）

しかし、書き換えると静的なオブジェクトなので全てのCC.V1の値が変わってしまうので Rustのようにはいかないです。





# 参考ページ

https://zenn.dev/exyrias/articles/d8b56fc900900b4238a9

https://www.ruimo.com/showArticle/199

https://tourofrust.com/00_ja.html

https://zenn.dev/toga/books/rust-atcoder/viewer/34-enumerated-type
【textlint】vscode-textlintを使ってVSCodeで文章校正をする

## はじめに
　本記事は、プログラミング初学者が学習を進めていて疑問に思った点について調べた結果を備忘録も兼ねてまとめたものです。
　そのため、記事の内容に誤りが含まれている可能性があります。ご容赦ください。
　間違いを見つけた方は、お手数ですが、ご指摘いただけますと幸いです。

## `vscode-textlint`を使ってVSCodeで文章校正をする

### `vscode-textlint`の設定ファイルを作成する
任意のディレクトリで Node.js のプロジェクトを作成します。

```zsh:ターミナル
$ npm init -y
```

使用するルールプリセットをインストールします。

```zsh:ターミナル
npm install textlint-rule-preset-ja-technical-writing 
```

インストールした`textlint-rule-preset-ja-technical-writing `のルールを有効にする設定ファイルを作成します。

```zsh:ターミナル
$ npx textlint --init
```

上記コマンドを実行すると`.textlintrc`が以下のように生成されます。

```.textlintrc

{
  "filters": {},
  "rules": {
    "preset-ja-technical-writing": true
  }
}
```

### `vscode-textlint`をVSCodeにインストールする

https://marketplace.visualstudio.com/items?itemName=taichi.vscode-textlint


### `vscode-textlint`の設定をする。
上記の手順のみですとエラーとなります。
使用可能にするため、VSCodeの「拡張機能の設定」を開き、`textlint`の設定をします。
まず、 `Config Path`に`.textlintrc`の絶対パスを記入します。
次に、`Node Path`に`node_modules`の絶対パスを記入します。
![スクリーンショット 2022-04-12 4.04.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342443/28e8aa84-1d59-5dce-9c1f-d3383f3bb56b.png)

するとエラーが解消され、以下の画像のように使用できるようになります。

![スクリーンショット 2022-04-12 4.17.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342443/d11679d4-9702-bcab-bfcf-e29f84295d56.png)
2022/4/12主にITとかセキュリティの記事

2021年のランサム被害報告は146件 - 目立つVPN経由の侵入
https://www.security-next.com/135595

2021年の不正アクセス認知は1516件 - 前年から約46％減
https://www.security-next.com/135586

日邦産業の海外グループ会社にサイバー攻撃 - 生産に影響なし
https://www.security-next.com/135641

国家戦略特区に設置した「雇用労働相談センター」で「Emotet」感染
https://www.security-next.com/135625

「Emotet」感染でなりすましメール出回る - サガン鳥栖
https://www.security-next.com/135627

アクシーのRoninへの攻撃と、クロスチェーンのリスク(4/10)
https://finance.yahoo.co.jp/news/detail/20220410-00165677-coindesk-bus_all

Web3に流入するトップ人材：VCの見解(4/10)
https://finance.yahoo.co.jp/news/detail/20220410-00165998-coindesk-bus_all

スタバもウクライナ政府も取り組む「NFT」は、バブルか本物のトレンドか。(4/10)
https://news.yahoo.co.jp/byline/tokurikimotohiko/20220410-00290694

アスター上のDEX「ArthSwap」、ネイティブトークン「$ARSW」のIDO発表(4/8)
https://www.neweconomy.jp/posts/212348

オンライン診療進展も　なお残るアナログ規制(4/11)
https://xtech.nikkei.com/atcl/nxt/mag/nc/18/020600014/040500114/

スマホの契約手続き「店舗」が5割　ネット契約普及も対面の需要根強く(4/11)
https://xtech.nikkei.com/atcl/nxt/mag/nc/18/020600010/033000111/

オンラインホワイトボード（Online Whiteboard）(4/11)
https://xtech.nikkei.com/atcl/nxt/mag/nc/18/020600009/040400112/

2年猶予の改正電帳法　企業が今すべきことは(4/11)
https://xtech.nikkei.com/atcl/nxt/mag/nc/18/020600014/040400113/

Emotet感染リスクが急拡大　背景に透けるウクライナ侵攻(4/11)
https://xtech.nikkei.com/atcl/nxt/mag/nc/18/092400133/040600074/

「身代金を払うのか」とIT部門が経営陣に問う積水化学、平時の話し合いが有事に生きる(4/11)
https://xtech.nikkei.com/atcl/nxt/column/18/02007/040700006/

外付けストレージへのバックアップ、Windowsの「ファイル履歴」が役立つワケ(4/11)
https://xtech.nikkei.com/atcl/nxt/column/18/01980/030900005/
GPD WIN 3にUbuntu Linuxをインストールする

普通にUbuntuのイメージを焼いてインストールすればとりあえず動くようになるが、いくつか動かないものがある。尚、Windows 11とのデュアルブートにしてある。起動時のOS選択画面が縦画面モードで表示されてしまう以外は特に問題もなく快適。

こちらのサイトが神だった。
https://gitea.quad.moe/quad/win3-resources/src/branch/master/docs/Main-issues.md?lang=uk-UA
たぶん全部やったほうがいいのだろうけど、とりあえず下記をやっただけでもまぁ使えているのでいいか。

## Audio ##
音が鳴らない。下記のファイルを下記の内容で作成する。
```/etc/modprobe.d/alsa-base.conf
options snd-intel-dspcfg dsp_driver=1
```

## タッチスクリーン ##
まずは下記のファイルを作成。
```/usr/share/X11/xorg.conf.d/99-touchscreen.conf
Section "InputClass"
  Identifier    "calibration"
  MatchProduct  "Goodix Capacitive TouchScreen"
  Option        "TransformationMatrix"   "0 1 0 -1 0 1 0 0 1"
EndSection
```
これだけでは動かないので、下記のファイルを作成。
```/etc/modprobe.d/win3-goodix.conf
install goodix /sbin/modprobe --ignore-install goodix ; /sbin/modprobe -r --ignore-install goodix ; /sbin/modprobe --ignore-install goodix
```

## Intelのディスプレイドライバ ##
あまり良くないらしいので、下記のように。
```
$ sudo add-apt-repository ppa:kisak/kisak-mesa
$ sudo apt-get update
$ sudo apt-get upgrade
```
![CC8AE1BE-6B06-4D64-ABB0-71EEA04EB574.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/107818/6ebbda69-73de-07a1-a9ce-2d064bd231f2.jpeg)
kintoneのサブテーブル内の最新日付を取得する

# 本記事の目的
レコード保存時に、サブテーブル「作業日」内の最新日付を取得し、
別フィールド「直近作業日」に転記したい。
![スクリーンショット 2022-04-12 2.41.05.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1526064/6a7cd9ab-e2c7-bb65-fdc6-2021df11f57c.jpeg)
# JavaScript記述
レコード保存時のイベントにて、テーブルの値を取得し、
それらの複数の値から「moment.isAfter」を用いて最新日を算出、
その値を最後に書き込みます。

```javascript
kintone.events.on(['app.record.create.submit', 'app.record.edit.submit'], function(e){
  let tableRecords = e.record.テーブル.value;
  let maxDate = moment('1900-01-01').format('YYYY-MM-DD');
  
  for(let key of tableRecords){
    let date = moment(key.value.作業日.value).format('YYYY-MM-DD');
    if((moment(date).isAfter(maxDate)) && (key.value.作業日.value)) maxDate = moment(key.value.作業日.value).format('YYYY-MM-DD');
  }

  if(maxDate !== '1900-01-01'){
    e.record.直近作業日.value = maxDate;
  }

  return e;
```

# 結果
最新の日付を取得することができました。
![スクリーンショット 2022-04-12 3.26.26.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1526064/a1807864-4df1-ea4d-e2d2-42d6146dcce5.jpeg)
mouseenter, mouseover, mouseleave, mouseoutイベント、どれが発生するのか理解する

mouseenter, mouseover, mouseleave, mouseoutイベントについて、マウスポインターが要素のボックスを出入りする際にどれがどの順番で発生するのか、仕様をすぐ忘れてしまうので、自分がわかりやすいようにサンプルを作ってCodePenと記事に残すことにしました。

デモ： https://codepen.io/kaz_hashimoto/pen/qBpxMVo

ボックスは外側からid="outer", "inner", "bottom"を振ってあり、それぞれの要素に対して`addEventListener()`を呼び、上記４つのイベントを待ち受けます。

```html:html
<div id="outer">
  <div id="inner">
    <p id="bottom">Hello</p>
  </div>
</div>
```

## 外側から内側へ入る時
マウスポインターがボックスの外側から内側へ入る時に受信するイベントの様子。イベント名を色分けして見やすくしました。区切り記号「-----」までが、１回のアクションに対して受信する一連のイベントです。(GIFアニメーションです。Firefoxではクリックして再生）
![mouseenter-1.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/469745/ea586148-431d-1c72-1f42-d0e3742320e6.gif)

## 内側から外側へ出る時
マウスポインターがボックスの内側から外側へ出る時に受信するイベントの様子。(GIFアニメーションです）
![mouseenter-2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/469745/27120bff-6612-a89c-e157-b437b90d4cb2.gif)


## まとめ
静止画にまとめました。マウスポインターの位置に振られた番号と、そこに移動した時に受信するイベントとの対応を示してあります。
![mouse-enter-leave_1920.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/469745/3e57e1d6-70e3-87c6-ac6c-1bd96c11f4e8.png)
【Rust】Docker+Alpine で error: cannot produce ... `x86_64-unknown-linux-musl` does not support these crate types

> Rust 言語のソースを、Rust の Alpine ベースイメージ（`rust:alpine`）を使って Docker でビルドすると、<code>error: cannot produce ... as the target \`x86_64-unknown-linux-musl\` does not support these crate types</code> エラーが出る。

```shellsession
# cargo build --release
error: cannot produce cdylib for `block-access v0.1.0 (/feather/quill/example-plugins/block-access)` as the target `x86_64-unknown-linux-musl` does not support these crate types
```

[「rust cargo docker alpine error: cannot produce `x86_64-unknown-linux-musl` does not support these crate types」でググって](https://www.google.com/search?q=rust+cargo+docker+alpine+error%3A+cannot+produce+%60x86_64-unknown-linux-musl%60+does+not+support+these+crate+types)も Alpine 以外のイメージを使う情報しかなかったので、自分のググラビリティとして。

## TL; DR <sub><sup>（今北産業）</sup></sub>

1. 「C ライブラリのリンクに失敗した」というメッセージ
    - Alpine Linux はシステムの C ランタイム/標準 C ライブラリに、一般的な `glibc` などの代わりに `musl` を利用しています。そのため [`x86_64-unknown-linux-musl` がターゲットとして使われる](https://doc.rust-lang.org/rustc/platform-support.html#tier-2-with-host-tools)も、`musl-dev` は `cdylib`（C 互換の動的ライブラリ）の作成に対応していないためエラーになります（この例では `block-access` が作ろうとしている）
1. ビルド時、環境変数 `RUSTFLAGS` に "`-C target-feature=-crt-static`" をセットする
    - 例) `RUSTFLAGS="-C target-feature=-crt-static" cargo build --release`
1. `-crt-static`（マイナス付き）を指定すると、[クレート](https://doc.rust-jp.rs/book-ja/ch07-01-packages-and-crates.html)作成時に C ランタイムを埋め込まない（システムの C ライブラリを埋め込んだ動的ライブラリを作成しない）設定になる
    - [Specifying dynamic/static C runtime linkage](https://rust-lang.github.io/rfcs/1721-crt-static.html#specifying-dynamicstatic-c-runtime-linkage) | rust | RFCS @ GitHub

:::note warn
この設定は、標準 C ライブラリ（もしくは互換のある多言語ライブラリ）を rust で利用する場合には有効ですが、すべてのエラーにおいて有効というわけではありません。
:::

## 動作サンプル

```dockerfile
FROM rust:alpine

WORKDIR /workspace

# Alpine でコンパイルならとりま入れておけパック
# （make、musl-dev や libc-dev なども入る）
RUN apk add --no-cache \
    alpine-sdk \
    build-base

# アプリが依存するライブラリをインストール
RUN apk add --no-cache \
    cmake \
    openssl-dev \
    xcb-util-dev \
    python3-dev \
    fontconfig-dev

# アプリのソースと依存パッケージのダウンロード
RUN \
    git clone https://github.com/iceiix/stevenarella.git && \
    cd stevenarella && \
    cargo fetch

# メインパッケージのビルド
RUN \
    RUSTFLAGS="-C target-feature=-crt-static" cargo build --release
```

## 参考文献

- "[target doesn't support these crate types" error on x86_64-unknown-linux-musl host](https://github.com/rust-lang/cargo/issues/7154#issuecomment-561947609)" | Issue #7154 | Cargo | Rust-lang @ GitHub
- [Unable to find crate proc_macro on musl target](https://github.com/rust-lang/rust/issues/40174#issuecomment-538791091) | Issue #40174 | Rust | Rust-lang @ GitHub
- [パッケージとクレート](https://doc.rust-jp.rs/book-ja/ch07-01-packages-and-crates.html) | Docs @ rust-jp
- [Rust でしっかりとスタティックリンク](https://qiita.com/moriai/items/b1fa7d1b43d985d408cc) @ Qiita
- [Rust のライブラリ crate_type をまとめてみた](https://qiita.com/etoilevi/items/4bd4c5b726e41f5a6689) @ Qiita
- [Go と Rust における静的リンクのビルド方法（+ Dockerfile サンプル）](https://vlike-vlife.netlify.app/posts/golang_and_rust_statically_linked) @ Vがいる日々
Ruby を Crystal にトランスパイル して競プロ典型90問_001: Yokan Party（★4）を解いてみた

# はじめに
https://qiita.com/superrino130/items/55d602f64360d55c51e8

前回記事のview数の伸びに驚きました。~~普段の記事の10倍くらい~~

それはさておき、少しずつマッシュアップしたいものです。
# Yokan Party
https://atcoder.jp/contests/typical90/tasks/typical90_a

ご存知、競プロ典型90問の1問目。
二分探索を行います。
# Ruby 元コード（最適化前）
```rb:before.rb
def check(mid)
  cnt = 0
  cut = 0
  @a.each do |x|
    if x - cut >= mid
      cut = x
      cnt += 1
    end
  end
  cnt >= K + 1
end

N, L = gets.split.map(&:to_i)
K = gets.to_i
@a = gets.split.map(&:to_i)
@a << L
@a.unshift 0
puts (0..).bsearch{ check(_1).! } - 1
```
前回記事に比べ、`def`と`bsearch`を使用している分、難易度？がアップしています。

予め、`crystal`の`AC`コードを参照させていただきました。（以下、当社調べ）
crystalでACされたユーザ：7名 ~~少なっ~~
crystalのbsearchメソッドの使用ユーザ：3名（重複あり）
自作二分探索関数の使用ユーザ：2名（重複あり）
メソッド・関数の未使用ユーザ：3名
（メソッド・関数の未使用とは、いわゆる`while high - low > 1`を実装）

crystalの`bsearch`メソッドの認知度が低い様ですが、その理由も明らかになります？！
# 最適化
```cr:error01
 13 | N, L = read_line.split.map(&.to_i)
        ^
Error: Multiple assignment is not allowed for constants
```
はい、コンスタントやめます。

```cr:error02
 15 | @a = read_line.split.map(&.to_i)
      ^
Error: can't use instance variables at the top level
```
はい、インスタンス変数やめます。

```cr:error03
 18 | puts (0..).bsearch{ check(_1).! } - 1
                                ^-
Error: undefined local variable or method '_1' for top-level
```
はい、Numbered parameterやめます。

```cr:error04
 4 | a.each do |x|
     ^
Error: undefined local variable or method 'a' for top-level
```
はい、引数で渡します。

```cr:error05
 5 | if x - cut >= mid
                ^
Error: no overload matches 'Int32#>=' with type (Int32 | Nil)
```
はい、range`(0..)`が`Int32`を越えていました。

```cr:error06
 18 | puts (0..1000000000).bsearch{ |b| check(b, a, k).! } - 1
                                                           ^
Error: undefined method '-' for Nil (compile-time type is (Int32 | Nil))
```
はい、bsearchメソッドの戻り値が コンパイルの結果(Int32｜Nil) という型であることを知りませんでした。
# Ruby 元コード（最適化後）
```rb:after.rb
def check(mid, a, k)
  cnt = 0
  cut = 0
  a.each do |x|
    if x - cut >= mid
      cut = x
      cnt += 1
    end
  end
  cnt >= k + 1
end

n, l = gets.split.map(&:to_i)
k = gets.to_i
a = gets.split.map(&:to_i)
a << l
a.unshift 0
puts (0..1000000000).bsearch{ |b| check(b, a, k).! } - 1
```
`Ripper.lex`で`bsearch`が出現後の最初の`}`を`}.not_nil!`に変換するという力業。
# crystal トランスパイルコード
```cr:crystal
def check(mid, a, k) 
  cnt = 0
  cut = 0
  a.each do |x|      
    if x - cut >= mid
      cut = x        
      cnt += 1       
    end
  end
  cnt >= k + 1       
end

n, l = read_line.split.map(&.to_i)
k = read_line.to_i
a = read_line.split.map(&.to_i)
a.push l
a.unshift 0
puts (0..1000000000).bsearch{ |b| check(b, a, k).! }.not_nil! - 1
```
||Ruby|crystal|
|:--:|--:|--:|
|コード長(Byte)|296|360|
|メモリ(KB)|21184|10476|
|実行時間(ms)|206|36|

実行時間が一桁速くなりました。
# まとめ
+ ripper の作者さんありがとう
+ crystal の作者さんありがとう
+ プルリクよろしくお願いします

https://github.com/superrino130/crystal-on-paiza.cloud
Github ActionsでAWS EKSを使う

Web検索しても面倒な方法しか見つからなかったが、実際は簡単に使える。
kubectlのinstallも不要で、kubeconfigの内容をsecretに設定することも不要。

以下、サンプルコード。解説はコメントとして示す。

```yml
name: deploy

on:
  push:
    branches: [ main ]

jobs:
  deploy:
    # kubectlとaws-cliは"ubuntu-latest"に含まれるので、バージョン指定の必要がなければ、installやsetupもいらない。
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      # AWSにCI用のIAMユーザを作りその認証情報をSecretsに設定しておく。そして、AWS公式の認証用Actionの引数に渡す。
      - name: Configure AWS credentials
        uses: aws-actions/configure-aws-credentials@v1
        with:
          aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
          aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
          aws-region: ap-northeast-1
      - name: Configure EKS
        run: |
          # eksの認証情報を更新する。このコマンドを呼べばkubeconfigの内容をSecretに設定することは不要。
          aws eks update-kubeconfig --name your-cluster-name
      - name: Deploy to EKS
        run: |
          # サンプルなのでget pod。実際はkubectl applyなりhelm upgradeなりを呼ぶ。
          kubectl -n your-namespace-name get pod
```


[^1]: azure/setup-kubectlでkubectlをインストールする、Secretにkubeconfigの内容を設定するなど。
wslgitをalipineで使うならbashを入れろ!!

# 目次
[1.この記事は?](#1-この記事は?)
[2.結論](#2-結論)
[3."wslgit"の紹介](#3-"wslgit"の紹介)
[4.経緯](#4-経緯)
[5.まとめ](#5-まとめ)

# 1.この記事は?
タイトルにある通り、wslgitを使おうとしたら意外な落とし穴にハマったので、その事例を共有する記事です。
半分くらい備忘録みたいな位置づけです。

Qiita初投稿なので読みづらいところがあるかもしれませんが、ご容赦ください。

まずはわかる方向けに結論・解決策を提示します。

「wslgit気になってる」「ナニソレオイシイノ？」な人は[3."wslgit"の紹介](#3-"wslgit"の紹介)以降から読んでいただき、その後[2.結論](#2-結論)に戻っていただくとわかりやすいと思います。

# 2.結論
タイトルを回収します。と言っても読んだ通りなのですが、
"wslgit"を使う場合、**デフォルトディストリビューションのシェルはbashでなくてはいけません**。
よって、デフォルトディストリビューションがalpineの場合は下記コマンドで解決します。
```shell
apk add bash
```
Ubuntuなどデフォルトシェルがbashなディストリビューションは何もしなくても使えるはずではあります。
私もつい先日まではUbuntuを使っていたため、ここは盲点でした。思いっきりハマりました。
~~これを解決するのに4時間費やしたこと、みんなにはナイショだよ...~~

一応shでもイケるはずなので、alpineでもハマりポイントにはならないはずなのですが。
私の手元ではshで動かせなかったので、上の対応が最短ルートとなります。
(多分環境変数とか設定するとできるのだろうと思いますがよくわからんです。教えて~~エロい人~~)

# 3."wslgit"の紹介
さて、ここまでなんの説明もなくwslgitのお話をしてきましたが、ここできちんと**wslgit**をご紹介します。

これはWindowsにおいてGitを使用する際、Git for WindowsをインストールしなくてもGitを使えるようにする小さなソフトウェアです。
[GitHub](https://github.com/andy-5/wslgit)にて公開されています。

https://github.com/andy-5/wslgit

実装としては、gitコマンドをWSLのデフォルトディストリビューションに転送してるイメージです。(多分)
その際、Windows ↔ WSLのパス表記の違いを一部吸収 (変換)してくれます。
詳しいところはReadmeを読んで下さい。その方が正確です。

WSL2にも対応済みですので安心して使えます。
私のようにWindows環境はあまり汚したくない方や、「WSLメインだけどたまにPowershellからGit使いたい」みたいな人にオススメです。

ただ、日本語の記事や比較的新しい記事が無いように見受けられたので、情報更新と事例共有を合わせて参考情報を増やす意味で筆を取りました。
記事制作段階(2022/4/12)で最終更新が20日前なので、継続的に更新されているプロジェクトなのではないでしょうか。

ということで、この後はこうなった経緯をつらつらと書き連ねて行きます。
この先はただの読み物です。お時間ある方はぜひお付き合いください。

# 4.経緯
- ### 4-1 私とWSL
私がWSLを使い始めたのは、ちょうどWSLが正式リリースされたタイミングからです。
その時はVPSへのSSH用ターミナルとして、あるいは「CLIでLinux触る俺かっこいい」に酔いしれるために使っていました。
VPSでは自前のメールサーバを運用したり、HPを作ったり、SSL証明書を自動更新したりしてました。

ただ、環境構築も安定すればサーバーを触る機会は減り、その後はしばらく触ったり触らなかったりとなりました。
そんな中、最近とある理由からLinuxを使う必要が出てきたのですが、特に迷いなくWSLを選択、また触り始めました。

- ### 4-2 Dockerとの出会い
また、Dockerも使いたかったためDocker Desktop for Windowsも入れました。
ただ、WSLのデフォルトディストリビューションがUbuntuなためか、Docker Desktopを起動するとUbuntuも起動されます。
このUbuntu、これまで適当に使っていたため、仮想ディスクイメージが10GBと巨大です...
メモリはゴリゴリ食われますし、なにより起動が遅い。

docker-desktopをデフォルトに設定することも考えましたが、これだとWindows側でGitが使えませんし、なによりなんか気持ち悪い。
サクッとSSHしたりGitしたりするためにもなにかしらのディストリビューションは欲しかったわけです。

- ### 4-3 alpine、登場
そんなわけで、一旦Ubuntuイメージを保存しつつWSLの登録を解除し、軽量なLinuxをデフォルトディストリビューションにしようと思ったわけです。
ここで選択肢に上がるのが、軽量なことで有名な**alpine**です。
幸いなことにMicrosoft StoreにWSL用イメージがありましたので飛びつきました。

結果、これまで述べたようにwslgitの導入でコケたわけです。
alpineを使うのは初めてですし...しょうがない。
逆にQiita記事を投稿する良いきっかけを手に入れたと、前向きに捉えています。

まぁ、Docker Desktop for Windowsの一部有料化に伴い、最近のWinodows界隈では「脱・Docker Desktop」系の記事がよく見られるわけで... (検索するとQiitaとZennの記事がよく出てきます)
今構築中の環境は、もしかするとスマートではないかもしれませんが、Docker Desktopも個人利用は引き続き無料なのであまり関係ないですし。
Dockerに慣れていない私には便利なので、使う方向で環境構築しています。

このあたりの「**とある理由**」とか「**構築中の環境**」とかは、また改めて記事にしたいなぁという思いではいます。
作業メモがてらnotionに書き残しているので、Qiitaに持ってくるだけですしね。

# 5.まとめ
ということで、後半は事の経緯をざっくりとダラダラ書き殴りました。
ここまで読んでくださった方、ありがとうございます。
この記事は以上となります。

もしよければコメントを残していただけると私が喜びます。
冒頭でも書きましたが初投稿ですので、コメントをいただけるとモチベーションに繋がり、記事が増えていくかもしれません。
間違いの指摘やタイポなどありましたら、合わせてコメント頂けますと幸いです。

最後にもう一度繰り返しますが、**wslgitを使う場合はデフォルトディストリビューションにbashを入れましょう**。
そうすればWindows側からもgitコマンドが使えるようになります。

それでは皆さん、**よいLinux & WSLライフを！**
典型90問004Cross SumをPythonで解く！


   
# はじめに
AtCoder現在茶色(年内には緑が目標！）のあんこちゃん(@Chunky_RBP_chan)です。\
典型問題は抑えとかねばということで、★2〜★5に取り組んでいます。\
Pythonで取り組まれている方も多いと思うので自分の解答をシェアしたいと思います！

# 問題
https://atcoder.jp/contests/typical90/tasks/typical90_d

# 解法
列に関する和と行に関する和を持つ配列をcolsum、rowsumとします。\
i行j列で求める数はrowsum[i]+colsum[j]-A[i][j]であり、この計算をすべての要素について行えばよいです。

```python
H,W = map(int, input().split())
A = [list(map(int, input().split())) for _ in range(H)]
colsum = [0]*W
rowsum = [0]*H
for i in range(H):
    rowsum[i] += sum(A[i])
    for j in range(W):
        colsum[j] += A[i][j]

ans = [[0]*W for _ in range(H)]
for i in range(H):
    for j in range(W):
        ans[i][j] = colsum[j]+rowsum[i]-A[i][j]
for i in range(H):
    print(' '.join(map(str,ans[i])))
エックスサーバーのwordpressがログインセキュリティ強化プラグインが邪魔をしてログインできなくなったときの対処方

# これは何？
完全に自分用のメモの記事です（笑）

wordpressには、様々なログインセキュリティ強化プラグインがあります。
ID/PWに加えて、reCAPTCHAや画像認証等を行ったり、ログインURLを変更したりするプラグインです。

ただ、稀にこのプラグインがバグりまして、ログインできないことがありますｗ
過去に２度経験して、大変な目にあったので、その対処方法を備忘録として残します。

# ざっくりとしたやり方
web UIからのログインはできませんので、SSHでコンソールに入り、コマンドからプラグインをオフにします。
wordpressには、cliが用意されており、コマンドからプラグインをオフにできます。
オフにすることで、通常のID/PWでログインできるようになります。

# 流れ
## コンソールにSSH等で接続
まずは、SSHでサーバーにログインします。
やり方は、レンタルサーバーのヘルプに載っていたりします。
エックスサーバーとかだとこのあたりですね。
https://tabalog.org/xserver-ssh/

なお、qiitaだと、以下の記事が分かりやすいです。
https://qiita.com/ryo2132/items/38b5a93b3df476dd2b44

## プラグインを調べる
wordpressでは、以下の場所にプラグインが入っています。
ここで無効にしたいセキュリティプラグインを調べます
/public_html/wp-content/plugins

## プラグインを無効にする
以下を実行すると、プラグインをオフにできます。
```
wp plugin deactivate [プラグイン名]
```

# トラブルシューティング
## PHPが古いとでるぞ...
サーバー管理画面的なところで、PHPを切り替えていても、コンソールから叩くと、phpが古いバージョンを使っている時があります。
wpコマンドは、phpのバージョン指定があるため、古いphpを使っていると以下のようなエラーがでて、wpコマンドが実行できないときがあります。
```
$ wp plugin deactivate [プラグイン名]
Your server is running PHP version 5.4.16 but WordPress 5.8.4 requires at least 5.6.20
```

こういうときは、php -vをして、バージョンが古かったらphpを切り替える必要があります。
切替方法は、以下のサイトで分かりやすく解説していました。
コレ通りにやれば動きます。
https://analyzegear.co.jp/blog/1501
TryHackMeでアカウントがベリファイできなかった

## TryHackMeでアカウントがベリファイできず少し困っていた。

以前届いていたベリファイメールに返信して困っていることを伝えたけど回答が来なかったので試行錯誤して解決した。もし困っている人がいたらあれなのでメモを残しておく。

### ミス１
Becky!でベリファイメールを受信したがテキストで確認したためベリファイボタンがあることに気づかなかった。
→ 添付のHTMLファイルを開いたらボタンが表示されたのでそれをクリックでベリファイ完了。

##### テキストメール
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/277081/bf1650ed-ebb7-3e07-e0c0-c188169276d1.png)

##### HTMLメール
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/277081/b3c89fec-78a3-871d-f833-9d096a057b35.png)

### ミス２
FireFoxで以前はできたのになぜか３月以降はベリファイリンクが動作しなかった。
→ ためしにChromeでログインしてリンクをクリックしたらベリファイメールが届いた。上の方法でベリファイボタンをクリックしてベリファイ完了。
Excel　修復されたレコードがいつまでも修復される理由についての仮説と解決方法の一つについて

# 現象
[\修復されたレコード: /xl/sharedStrings.xml パーツ内の文字列プロパティ (文字列)](https://answers.microsoft.com/ja-jp/msoffice/forum/all/%E4%BF%AE%E5%BE%A9%E3%81%95%E3%82%8C%E3%81%9F/02df0072-84d4-4b3b-a415-1aa3e55082ab)
特に今回このShareStringについて、修復が成功したケースを記録する。
これは調べると文字化けしているrしいことがわかった。。
そこでいくら修復してもUTF-8にならないだけで、データに損失はなく、エクセルが強制的に文字コードを書き換えて表示するものの、保存するときにまた文字化けてしてしまうのではないかと推測された。


# 発見された解決方法
ファイルをコピーしてバックアップ（基本）
コピーしたファイルをTmpフォルダなどを作り、そこに移動
zipファイルにしてばらす。
壊れているxmlファイルは文字化けしていた。
ここでまずxlsxファイルをxmlファイルで保存する。
これをexcelで開きなおす。
これを再びxlsxで保存する。
Zip化して開き、sharedStrings.xmlを開き、文字化けが治っていることを確認する。
ファイルを比較して問題がない場合はこちらを使用する。

# 発生した原因
文字コードがutf-8であるところをShift-jisで読んでいるような状態だと思われる。Excelの修復はそうしたところまでは修復できず、文字コードを変えて表示しているらしい。
そもそもファイル自体が破損しているならば、zipで開く時点でもエラーがありうる。開けているのはファイル自体が破壊されたわけではないらしい。
xmlに出力することで文字コードとの不一致が解消し、エラーが起きなくなるということのようだ。

# SharedString
これは複数のシートのデータが入っているようなxmlで、Excelのテキストで表示されているシート名やセルの内容全体を持っているらしい。
逆にバイナリ的な内容ではないため、こうした文字コードが一致するような修復方法が有効なときもあると考えられる。

# 今後も検証
最もこの修復になる原因は一つではないため、絶対的な方法ではないが、今までなぜ起きるのかもわかっていなかったので貴重な発見となった。
開くたびに修復されるファイルというのはしばしば発生するので、この方法が有効な解決方法となるか、今後検証していく
[Zabbix]ユーザーパラメータの使い方と使用例メモ

## ●はじめに
Zabbixに独自の監視項目を追加できる機能「ユーザーパラメータ」の使い方と使用例をメモします。
ユーザーパラメータを使うと、Zabbix Agentに定義したコマンドやスクリプトを実行し、それらの標準出力をZabbixサーバーに返すことができます。

## ●環境
|項目 |詳細 |
|:-:|:-:|
|ホストOS   |macOS Monterey 12.2.1   |
|仮想化ソフト   |VMware Fusion 12.2.0   |
|ゲストOS   |Alma Linux 8.5   |
|Zabbix/Zabbix Agent ver   | 5.0.21  |

## ●基本的な使い方
### 1.監視対象ホストにて監視項目追加

```bash
# 監視対象ホストにログイン
# zabbix_agentd.confを編集
$ vi /etc/zabbix/zabbix_agentd.conf

# 以下を編集
UserParameter=キー,コマンド
あるいは
UserParameter=キー[*],コマンド

# zabbix-agent再起動
$ systemctl restart zabbix-agent
```

### 2.Zabbix WebUI側でアイテム作成
**Zabbix WebUI アイテム作成画面**
- 名前：任意
- タイプ：Zabbixエージェント
- キー:手順1で指定したキー
- データ型：コマンドの標準出力の結果に合わせる
※他は任意の設定

**補足**
- 手順1で キー[*] とすると、Zabbix WebUIのアイテムキー設定でユーザーパラメータに対して引数を渡せる（設定例参考）

## ●サービス死活監視の設定例

### 1.ユーザーパラメータの設定
```bash
# 監視対象ホストのzabbix_agentd.confを編集
$ vi zabbix_agentd.conf

# 以下の通りに記述
UserParameter=httpd.info,systemctl status httpd | awk 'NR==5{print $3}'
```
- NRの数値5は、標準出力に対し「上から5行目」を表す
- 5行目ではなく3行目、とかの場合もあるので、一旦対象ホストでsystemctl statusコマンドを実行して確かめるのを推奨

### 2.Zabbix WebUI アイテム作成
1.Zabbix WebUIにログイン
2.左ペイン[設定] - [ホスト] - 任意のホスト選択 - [アイテム] - [アイテム作成]の順に押下
3.以下の通り入力し、更新を押下
- 名前：サービス死活監視
- タイプ：Zabbixエージェント
- キー:httpd.info
- データ型：文字列

**アイテム画面**
![スクリーンショット 2022-04-11 23.59.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1359780/087e7211-4c06-9e10-f012-512061d9e469.png)

**取得結果**
![スクリーンショット 2022-04-12 0.06.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1359780/f99c4363-ab6f-4b64-81e9-cdd223c19017.png)
Gitの基礎とよく使うコマンド

# はじめに
開発現場でよく使われるツールGitについて基礎とよく使うコマンドについてまとめました。
Gitを使い始めたばかりの方やこれから使おうと考えている方の参考になれば幸いです。

# Gitの概要
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2309433/eeaa5bb7-fd73-50f2-297d-298630a8dae9.png)


### リポジトリ
Gitの管理下にあるファイルやディレクトリ（フォルダ）の変更履歴を保管する箱のようなもの。

### ローカルリポジトリ 
自分のPC上（ローカル環境）に置くリポジトリのこと。

### リモートリポジトリ
外部サーバー上に置くリポジトリのこと。
リモートリポジトリは、直接変更修正することはなく、ローカルリポジトリの変更修正を同期して更新されていく。

### ブランチ
リポジトリで管理しているファイルやディレクトリの変更の流れのこと。commitの連なり。
ブランチは、分岐させることができる。
開発では、基本的にブランチを分岐させる。分岐させることを**ブランチを切る**と言う。
ブランチ上での変更は統合されるまで他ブランチに影響しないしされない。

### commit
ファイルやディレクトリ（フォルダ）の変更修正を、リポジトリに記録すること。
commitを行う際には、基本どのような変更をおこなったかメモをつける。これを**コミットメッセージ**と言う。

### push
ローカルリポジトリでのcommitをリモートリポジトリに反映させること。

### merge
ブランチを統合すること。

### pull
リモートリポジトリの変更をローカルリポジトリに取り込むこと。

# Gitのよく使うコマンド

### リモートからクローン
```bash
$ git clone https://{GitHubのユーザー名}:{GitHubで作成したトークン}@dummydomain/path/dummyurl.html
```

### ブランチの作成・移動・削除
```bash
# ローカルブランチの作成 + 移動
$ git switch -c feature/sample-branch

# ローカルブランチの移動
$ git switch feature/sample-branch

# ローカルブランチの削除
$ git branch -D feature/sample-branch

# リモートリポジトリ上にあるブランチの削除
git push origin :feature/sample-branch
```

### ステージ
```bash
# 変更内容を全てステージする
$ git add .

# 特定のファイルをステージする
$ git add hoge/hogehoge.txt
```

### コミット
```bash
# 変更内容をコミット
$ git commit

# 変更内容を残したまま直前のコミットを取り消す
$ git reset --soft HEAD^

# 変更内容を残さずに直前のコミットを取り消す
$ git reset --hard HEAD^
```

### プッシュ
```bash
# 今いるブランチのorigin(リモートリポジトリのブランチ)にpushする。
$ git push origin HEAD

# リモートリポジトリ上にあるブランチの内容を上書きする
# 使用する際は注意
$ git push --force-with-lease origin HEAD
```

### リベース
指定したコミットをブランチを変えて作り直したり、ひとまとめにしたりして、ログを綺麗にすること。
※ 必要なログが削除されることがあるため、開発現場のルールに従い利用する。
```bash
# ブランチを最新状態から切ったことにする
$ git rebase develop
```

### マージ
```bash
# 取り込みたいブランチに移動しマージ
$ git merge feature/sample-branch
```

### プルとフェッチ
```bash
# リモートリポジトリの変更内容を取り込むだけの場合
$ git fetch

# 「fetch」　する際に自動的にリモートで削除されているブランチを削除する。
$ git fetch --prune

# 「fetch」　を　「merge」 したい場合
$ git pull
```

### スタッシュ
現在の作業を一時的に退避したい時や、退避した作業を元に戻したい時などに使用する。

```bash
# 作業中のファイルを一時退避
$ git stash

# メッセージを付けて一時退避(“message”は任意のキーワード。ブランチ名推奨。)
$ git stash save “message”

# N番目にスタッシュした内容を戻す(スタッシュは削除される)
$ git stash pop stash@{N}

# N番目にスタッシュした内容を戻す(スタッシュは保持される)
$ git stash apply stash@{N}

# スタッシュを一覧表示する
$ git stash list
```

# おまけ

### コンフリクト
あるファイルにおいてブランチごとに情報が異なり辻褄が合わない状況のこと。日本語で「競合」という意味。
複数人での開発時や、複数のブランチにまたがって作業をしていると、ファイルの同時編集が発生する。

#### コンフリクトの見方
ここでは、コンフリクト発生時の見方のみを紹介します。

```bash
<<<<<<< HEAD
自分が作業していた変更内容。
=======
取り込みたい内容。
>>>>>>> develop
```
【k8s】DeamonSetって何？ どんな時に使うリソースなの？

# はじめに
k8s(Kubernetes)の学習をしているとDeamonSetというリソースが聞くことがあるかと思います。
自分の中でDeamonSetについてあまり理解できていなかったので、記事にしてまとめたいと思います。


# DeamonSetとは？
全nodeに1 podずつ配置するリソースです。


## 実際に動作確認してみる

### 前提
- minikube が動作していること
    - `minikube start --nodes 2 -p multinode-demo`

DeploymentとDeamonSetをデプロイすることでDeamonSetが全Nodeにpodが作成されることを確認してみたいと思います。

```shell
kubectl apply -f https://gist.githubusercontent.com/Higakinn/77cbcba2a4c5160122269efe9cf93812/raw/6f733db004ac557724c507ab8c6a84d2b980062e/DemonSetDev.yaml
```

applyできたら、出来上がったリソースをみてみましょう。
```shell
kubectl get pods -o wide
NAME                          READY   STATUS    RESTARTS   AGE     IP           NODE                 NOMINATED NODE   READINESS GATES
deploy-dev-7dd88cd587-4sbbv   1/1     Running   0          10s     10.244.1.3   multinode-demo-m02   <none>           <none>
ds-dev-2fsfv                  1/1     Running   0          2m27s   10.244.0.3   multinode-demo       <none>           <none>
ds-dev-jgwb4                  1/1     Running   0          2m27s   10.244.1.2   multinode-demo-m02   <none>           <none>

```
deploymentは `multinode-demo-m02` というNodeにしかリソースが作成されていないのに対して、DeamonSetは 全てのNodeにリソースが作成されていることがわかります。

このような形で全Nodeにpodを作成したりすることができます。

## で、どんなときに使うの？

色々利用用途がありますが、以下のような場合があります。
- 各Podが出すログを収集するためのPodを用意したい
- 各Podのリソース使用状況やノードの状態をモニタリングするPodを用意したい
- 各Nodeにコンテナイメージをキャッシュさせておきたい

# まとめ
- k8s DeamonSet
    - 全nodeに1 podずつ配置するリソース
    - 全Nodeで必ず動作する必要のあるプロセスのために利用されることが多い
        - Fluentd,DataDogなど、、、
「条件付き確率(A|B)」と「論理式(A→B)の確率」の類似点

# はじめに
条件付き確率にはベイズの定理という定理があります。一方、論理式(A→B)の確率にもベイズの定理と似た定理が成り立ちます。

両者の関係は、ちょうど方程式の和積を入替えになります。実際に見てみましょう。

# ベイズの定理(復習)

まずは、条件つき確率の復習です。定義は下記の通りです。
```math
 P(A \mid B) := \frac{P(A \land B)}{P(A)}
```

この時、ベイズの定理が成立します。
```math
 P(A \mid B) = \frac{P(B \mid A)P(A)}{P(B)}
```

# ベイズの定理（もどき）

では、論理式(A→B)の確率はどう定義するべきでしょう。
例えば、下記は論理的に同値です。
```math
 A \rightarrow B \equiv \lnot A \lor B
```
従って、下記の通り定義するのが自然でしょう。（ベン図を書いてみましょう）
```math
 P(A \rightarrow B) := P(A \land B) + 1 -P( A \mid B)
```

このとき、ベイズの定理（もどき）が成立します。（計算は簡単なので省略）
```math
 P(A \rightarrow B) = P(B \rightarrow A) + P( A ) - P(B)
```

# 両者の比較

両者を比較してみましょう。初めに、ベイズの定理を式変形します。
```math
 P(A \mid B) =  P(B \mid A) \times P(A) \div P(B)
```

次に、ベイズの定理（もどき）を再掲します。
```math
 P(A \rightarrow B) = P(B \rightarrow A) + P( A ) - P(B)
```

上記の通り、両方程式は、和積を入替えの関係になっています。

## 補足1 和・積の入れ替えの例
和積の変換の簡単な例として、指数関数があります。
```math
e^{a + b} = e^{a} \times e^{b}
```
## 補足2 論理式に確率を割り当てる。（TODO)
「→」以外の論理演算についても、確率を定義します。すると、論理式の確率を具体的に計算できるようになります。例えば、、
Unity 複数の子オブジェクトを取得する方法

## 0.0　はじめに
スクリプトを使って特定のオブジェクトの子オブジェクトを取得する方法を紹介します。




準備：
下記のように　**Parent**　というオブジェクトの子オブジェクトに　**Child**　オブジェクトを4つ作っています。Childの番号はわざとバラバラにしています。
**Test**オブジェクトにはTest.csスクリプトをアタッチしています。




![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352037/a0102019-d33b-24f8-e51c-7746c31602c1.png)


















## 1.0　for文で子オブジェクトを取得
Transform.GetChild()の引数を指定することで目的の子オブジェクトを取得することができます。
GetChildの引数の順番（0から）は子オブジェクトの順番（上からの順番）と一致します。

**ポイント**👍
 Transform.childCountにて子オブジェクトの数を取得することができます。

スクリプトの例です。
```C#:Test.cs
using UnityEngine;

public class Test : MonoBehaviour
{
    GameObject parent; // 親オブジェクト
    Transform[] children; // 子オブジェクト達を入れる配列

    void Start()
    {
        // Parentという名の親オブジェクトを検索
        parent = GameObject.Find("Parent");

        // 子オブジェクト達を入れる配列の初期化
        children = new Transform[parent.transform.childCount];

        // 検索方法１
        for (int i = 0; i < parent.transform.childCount; i++) {
            children[i] = parent.transform.GetChild(i); // GetChild()で子オブジェクトを取得
            Debug.Log($"検索方法１： {i} 番目の子供は {children[i].name} です"); 
        }
    }
}
```




下記は実行結果です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352037/40c76bb2-5e37-5459-03ca-03e8c4c49ff2.png)













## 2.0　foreach文で子オブジェクトを取得
Transformコンポーネントがforeachステートメントに対応しているのでforeach分を使うと子オブジェクトを順番に取得できます。

**ポイント**👍
foreach文では 配列から取り出すオブジェクトの型名にvarを使うことがありますが、下記ではTransformの型名指定が必要です。foreach(**var** child in parent.transform)ではエラーが発生します。


スクリプトの例です。
```C#:Test.cs
using UnityEngine;

public class Test : MonoBehaviour
{
    GameObject parent; // 親オブジェクト
    Transform[] children; // 子オブジェクト達を入れる配列

    void Start()
    {
        // Parentという名の親オブジェクトを検索
        parent = GameObject.Find("Parent");

        // 子オブジェクト達を入れる配列の初期化
        children = new Transform[parent.transform.childCount];

        // 検索方法２
        int count = 0; // 番目を表示するためのもの
        foreach (Transform child in parent.transform) {
            children[count] = child; // 順番に子オブジェクトを取得
            Debug.Log($"検索方法２： {count} 番目 の子供は {children[count].name} です");
            count++;
        }
    }
}
```






下記は実行結果です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352037/65d46dab-e842-f746-6b95-5f8dc6402fef.png)
シーン別　Linuxコマンドの応用（ファイル操作）

# 概要
バックエンドの仕事でよく使う、ファイルの検索や一括編集ができる便利なコマンドをシーン別にまとめます。
細かい説明は省いてるので、中級者～の方におすすめです。

# シーン別のコマンド集
## シーン１　ファイル内の文字列を検索したい

``` bash
$ cat filename.txt | grep SEARCH_WORD
```

## シーン２　ディレクトリ内のファイルを再帰的に検索したい
適切にコマンドで検索することで、手間なく、漏れなく探し出すことができます。

カレントディレクトリでの操作を想定してます。

``` bash
# 検索ワードを含む行を一覧
$ find -type f | xargs grep "SEARCH_WORD" | less
# 検索ワードを含むファイル名を一覧 (↑で行数が多すぎる場合)
$ find -type f | xargs grep -l "SEARCH_WORD"

# 【特定の拡張子のみ操作】
# 検索ワードを含む行を一覧 (PHP拡張子のファイルのみ)
$ find -type f | grep "php$" | xargs grep "SEARCH_WORD"
```

## シーン３　検索したワードを置換したい
シーン２で検索したワードを、そのまま他のワードに置換できます。

``` bash
# 置換実行後、該当行がどうなるかを確認 (ファイルは編集されません)
$ find -type f | xargs sed -e "s/SEARCH_WORD/REPLACE_WORD/g" | grep REPLACE_WORD
# 一括で置換
$ find -type f | xargs sed -i -e "s/SEARCH_WORD/REPLACE_WORD/g"

# 【特定の拡張子のみ操作】
# 一括で置換 (PHP拡張子のファイルのみ)
$ find -type f | grep "php$" | xargs sed -i -e "s/SEARCH_WORD/REPLACE_WORD/g"
```

## シーン４　ストレージの空きが少ない
ストレージの容量不足の特定や、その解消に使えるコマンドです。

``` bash
# ストレージ全体の空きを確認
$ df -h
# カレントディレクトリのディレクトリ、ファイルサイズを大きい順に表示
$ du -ah ./ | sort -rh | less
```

## シーン５　ファイルの行数を調べたい

``` bash
$ cat filename.txt | grep -c .
```

## シーン６　ログファイルをリアルタイムで監視したい

``` bash
$ tail -f /var/log/httpd/error_log
```

## シーン７　gzファイルの中身を、展開せずに確認したい

``` bash
$ zcat filename.txt.gz | less
```
ローカルサーバー上のPlotly(Python)グラフの表示方法

## 概要

私は家では、ノートPC(Chromebook)から計算用のローカルサーバー(ubuntu)にsshで繋いで、サーバー上でプログラミングしています。この環境だと、ノートPCの気楽さとサーバーの計算力のいいとこ取りができます。

ところで、Pythonでなにか計算するときの結果の可視化にはよく[Plotly](https://plotly.com/python/)を使うのですが、サーバー上のPythonスクリプトでは `fig.show()` でグラフを表示することができません。

PlotlyはHTMLファイルを出力します。HTMLファイルならば、WEBサーバーを立ち上げて配信すればいいじゃないかと思い実際にやってみたところ、グラフを確認しながら快適に計算できました。

## 方法

以下の手順で勧めます。

1. サーバーパソコンでWEBサーバーを立ち上げる(バックグラウンドで実行)
1. サーバーパソコンで計算し、HTMLファイルを出力する
1. ノートPCからローカルサーバーにアクセスする

### WEBサーバーを立ち上げる

WEBサーバーはなんでもよいのですが、Pythonならば標準のモジュールを使って立ち上げることができます。

```shell
python -m http.server 3000 &
```

最後の&はバックグラウンドで実行するという意味です。これでポート3000番で通信ができます(ポートが開いていれば)。ここにPlotlyで作成したHTMLファイルがあれば、グラフにアクセスできます。

ただしWEBサーバーはNode.jsの[live-server](https://www.npmjs.com/package/live-server)がよりおすすめです。live-serverでサーバーを立ち上げると、Plotlyが出力するHTMLファイルが更新される度に、ブラウザの表示が自動で更新されるため、非常に便利です。

### HTMLファイルを出力する

Plotlyの基本的な書き方は今回はお話しませんが、write_htmlメソッドを使ってHTMLファイルを出力します。出力先は1でWEBサーバーを立てたディレクトリ以下であれば、どこでもいいです。

```python
import plotly.express as px
fig = px.scatter(x=[0, 1, 2, 3, 4], y=[0, 1, 4, 9, 16])
fig.write_html('some_plot.html')
```

### ローカルサーバーにアクセスする

ノートPCから、WEBサーバーにアクセスします。ブラウザから、 `http://192.168.1.xxx:3000` のようなURLでサーバーにアクセスすると、サーバーを立ち上げた場所のファイルなどが表示されると思います。
そこに出力したHTMLファイルがあれば、例えば `http://192.168.1.xxx:3000/some_plot.html` でグラフを表示することができます。

## 終わりに

そういえばJupyter Labをローカルに開放すれば、Jupyter Lab上でグラフの可視化はできますね。ですがグラフの雛形を開発するときには上記の方法が役に立つかと思います。どうぞお試しあれ^^
VPC Lambda とは

## 調査

### VPC Lambda とは

lambdaは基本的にはAWSが管理するネットワーク上に作成されますが、
ユーザが管理するVPCのリソースにアクセスしたい場合、lambdaをVPCに接続できるように設定を行います。
これを `VPC lambda` と呼ばれます。
実際にはVPC上にlambdaがあるわけではなく、VPC上に作成されたENIを経由してlambdaへ接続できるようになります。

### VPC Lambdaの注意点

- インターネットへのアクセスについて

lambdaにVPCの設定を追加しても関数でアクセスできる範囲はVPC内のみです。
ENIにはパブリックIPが付与できないので、
もしlambdaからインターネットへのアクセスが必要な場合は、同じVPC内部に
NATインスタンスまたはNAT Gatewayの設定が必要です。

- ロールの設定について

lambdaにENIの作成・削除が必要なのでlambdaにIAMのロールを設定することが必要です。
`AWSLambdaVPCAccessExecutionRole` がAWSのポリシーにあるのでこちらを当てることも可能です。

- 残IPアドレスについて

VPC lambdaはサブネットのIPアドレスを消費するので、
ギリギリで設定している人は注意してください。
ベストプラクティスでは、lambda専用サブネットを作成して他のリソースに影響が出ないように設定することが推奨されています。

- 初回起動に少し時間がかかる

lambdaを実行する際、ENIの作成・lambdaへ付与の時間が少しかかります(～数十秒)
初回のみなので、以降は問題ないですが一定時間リクエストがなければENIは自動で削除されるので注意が必要です。

## 勉強後イメージ

ENIにはGIPがつけれないのか・・・
確かにEC2でみてたら、ローカルIPをつけるやつってイメージね。
NATインスタンスとか少しめんどくさいね。

## 参考

- [AWS LambdaでVPC利用！？](https://www.acrovision.jp/service/aws/?p=1404)
- [AWS LambdaをVPC内に配置する際の注意点](https://devlog.arksystems.co.jp/2018/04/04/4807/)