OmniAICreator/Qiita-1.07M huggingface dataset:
WSL2にdockerをインストールする方法

なかなかうまくいかなかったのでメモメモ。

https://no000.hateblo.jp/entry/2019/07/31/233200
https://gihyo.jp/admin/serial/01/ubuntu-recipe/0675?page=2

```
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
$ sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
$ sudo apt-get install docker-ce docker-ce-cli containerd.io
$ sudo usermod -aG docker $USER
$ docker -v
$ sudo service docker start
$ sudo docker run hello-world
[sudo] password for XXXXXXXX: 

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/get-started/
```
どうしたら技術が理解できたといえるか？

# はじめに
会社で新人や2年目の若手に対して、開発に必要な技術を理解・習得してもらう際にどうすればよいかを考えてみる。
# ある技術について理解したとはどういう状態か？
* ある技術について学び、理解するにはどうすればよいか。どのような状態になれば理解したといえるか？
  →その技術について、人に説明できれば身についたといえそう。
* 人に説明するとしたら、何をどのように説明できれば理解しているといえるか。
# 何をどのように説明できればよいか？
- なぜその技術が今存在しているか？（Why）が理解できている
    - その技術がない時代には、どのような「状況」だったのか？
    - その状況においてどのような「課題」があったのか？
    - その課題からどのような「ニーズ」が生まれたのか？
    - その「ニーズ」に対して、どのような技術が生まれ、どの技術が今も残っているのか？「その技術」の他にどのような技術があり、「その技術」のどういうところが優位だったのか？
- 何をするものなのか？（What）
    - 誰に対して何を提供できるものか？
- どのように実現されているのか？（How）
    - ベースとなる技術は何か？
    - ベースとなる知識は何か？

# 説明資料のアウトライン（案）

ここから想定する、技術を説明するときのアウトライン

- XXってなに？
- XXができる前はどうだったの？
- そこから生まれた技術ってどんなの？
- XXって何がすごいの？
- XXって何がいいの？
- XXってどうやって実現されているの？

# 説明の進め方
説明者：新人または2年目の若手
聞く人：新人または2年目の若手 + 指導員

* 聞く人は、説明の内容をもとに疑問点を挙げ説明者は回答する。
* うまく回答ができない場合は、理解が浅いということなので、質問の内容をもとに再度調べる。
* 指導員は資料で不足していると思われる観点について指摘をし、理解ができているかを確認する。

# おわりに
アウトラインのWhatとHowの部分が弱めだけど、これをベースにしてすすめていってブラッシュアップしていこう。
WordPressのテーマをコーディング標準チェックできるようにする（phpcs）

# はじめに

WordPress でもコーディング標準チェックを行いたい！と思ったので、導入することにしました  
~~本当は 1週間後の IPA の応用情報技術者試験の勉強から逃げたくなったからですが~~  

# バージョン

|                | バージョン  |
| -------------- | ----------- |
| docker desktop | 4.6.1       |
| Windows 11 Pro | 22H2        |
| Ubuntu         | 20.04.4 LTS |
| PHP            | 8.0.11      |
| WordPress      | 5.8.1       |

# 前提

以下の記事の続きです

https://qiita.com/rowpure/items/cc71c6885979bc592251

環境は Docker + NGINX + WSL2 とします  
今回紹介するソースは、以下のリポジトリにあります

https://github.com/q23isline/wordpress

# 手順

※ permission denied が出たら `sudo chown` で所有者とグループを他ファイルに合わせたり、 `sudo chmod` で権限を付与したりで解決してください

1. WordPress コンテナに入る

    ```bash
    # WordPress コンテナ起動
    docker-compose up -d
    # WordPress コンテナに入る
    # docker exec -it {コンテナ名} /bin/bash
    docker exec -it app /bin/bash
    ```

2. composer インストール
    - ↓リンク内の Composer インストールコマンドを実行する  
    composer.phar ファイルが追加される

        <https://getcomposer.org/download/>

        ```bash
        # WordPress コンテナから出る
        exit
        ```

3. composer.json 追加

    ```JSONC:composer.json
    {
        // 値はよしなに設定する
        // `docker exec -it app php composer.phar validate --strict`コマンド実行時のエラー防止
        "name": "wordpress/app",
        "description": "WordPress skeleton app",
        "license": "MIT",

        // 開発だけで利用したいので require-dev 内で
        "require-dev": {
            // WordPress のコーディング標準をインストールする
            // バージョンは自由に指定（現時点では 2.3 が最新）
            "wp-coding-standards/wpcs": "^2.3"
        },
        // `docker exec -it app php composer.phar check`コマンドでチェックできるように scripts を記載
        // 記載しなくてもよい
        // `docker exec -it app vendor/bin/phpcs --colors -p --standard=WordPress wp-content/themes/` コマンドでもチェックできるため
        // テーマに対してコーディング標準チェックを行う（ wp-content/themes/ 部）
        "scripts": {
            "check": [
                "@cs-check"
            ],
            "cs-check": "phpcs --colors -p --standard=WordPress wp-content/themes/"
        }
    }
    ```

4. phpcs インストール

    ```bash
    # docker exec -it {コンテナ名} php composer.phar install
    docker exec -it app php composer.phar install
    ```

5. phpcs に WordPress 用コーディング標準設定追加

    ```bash
    # docker exec -it {コンテナ名} vendor/bin/phpcs --config-set installed_paths vendor/wp-coding-standards/wpcs
    docker exec -it app vendor/bin/phpcs --config-set installed_paths vendor/wp-coding-standards/wpcs
    ```

6. コーディング標準チェック実施して完了

    ```bash
    # docker exec -it {コンテナ名} php composer.phar check
    docker exec -it app php composer.phar check
    # もしくは
    # docker exec -it {コンテナ名} vendor/bin/phpcs --colors -p --standard=WordPress wp-content/themes/
    docker exec -it app vendor/bin/phpcs --colors -p --standard=WordPress wp-content/themes/
    ```

# おわりに

WordPress 標準のテーマ、 twentytwenty に対してコーディング標準チェックを実行すると 290 件くらいエラーが発生したので、ルールを独自に定義してあげるのが一般的なんですかね、、  
この記事が他のエンジニアの助けになれば幸いです
シークレットキー作成

nodeのcryptoモジュールを使うと簡単にシークレットキーを作成できます。
```
npm i crypto
node
> require('crypto').randomBytes(64).toString('hex')
'032bb3825ed806cc184267557995068ea4eee83ec7559f0f38fbdba3527193d47854ba8836c8a78ac8f8e959ad6918a38be18c3d0fec332082d62f84a3e84198'
```

↓こちらの動画の4:15:00ぐらいに出てたテクニックです。
https://www.youtube.com/watch?v=f2EqECiTBL8&t=14985s&ab_channel=DaveGray
XAMPPでMySQLが起動しないので調べた

# XAMPPでMySQLが起動しないので調べた

## 今日も元気に

ローカルでphpスクリプトのテストをするぞ～
![スクリーンショット 2022-04-06 200619.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569616/1da5f6f4-f212-4708-1dac-d10e801c8d74.png)

あれ？

何やら「別のアプリでポートが使用されている」のようなエラーが出ている。

### どのアプリでポートが使用されているか調べる

このXAMPPのMySQLは、ポート3306を使用している。（デフォルトのはず）
ので、まずポート3306を使用しているアプリを割り出す。

> 確認したいポート番号が決まっている場合は「netstat -nao|find "ポート番号"」コマンドで実行時にポート番号を指定して実行することができます。

とある。
[あるポート番号が何のアプリケーションで使用されているか調べる方法](https://www.projectgroup.info/tips/Windows/comm_0133.html)

なので今回は

```cmd.exe
netstat -nao|find "3306"
```

だ。結果、
![スクリーンショット 2022-04-06 202308.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569616/4d5a72d9-f002-5740-72d4-23628d1fbb56.png)

ない。

ちなみに、powershellではこのコマンドは使えない模様。

### エラーログを見る

ならば次はこれ。基本ですね。Logs からログを見てみましょう。
![スクリーンショット 2022-04-06 201646.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569616/ad479fd2-a5e0-f779-f8ce-18f1e1fcf61b.png)

うむ、わからん。

`2022-04-06 20:16:00 0 [Note] InnoDB: Starting crash recovery from checkpoint LSN=300592`

の時点でリカバリーを開始しているので、それより上が問題であろう。
やはりわからんが、前回クラッシュ時の破損ファイルが原因のことがある。

MySQLのconfig → browse からdateフォルダを開き、

- ib_logfileという名前で始まる全ファイル
- iddata1

をデスクトップ等にいったん避難させる。

そして起動。

……またもや起動しない。

### ポート番号を変更してみる

先ほど被りはなかったが変更してみる。

config → my.ini の`port=3306`をすべて8306とかにしてみる。

結果、変わらず。

### 管理者権限

ここにきて有力な情報が見つかる。

> 管理者権限で実行している場合はstartできないのでQuitで終了すれば起動できる可能性があります。

[【xammp】mysqlが起動しない時の対処](https://qiita.com/gone0021/items/1240f857776c6bb620b6) Qiitaにあるやん…

> 主な原因は正しくxammpを終了していないことです。
> xammpコンパネでMySQLのstopせずにPCをシャットダウンすると起きることがあるみたいです。

これでコンパネをQuitしたあと、再度起動。

結果、ダメ。

### XAMPPを管理者権限で起動しなければいいのでは？

ちょっとやってみる。

ダメ。ていうか管理者権限じゃないと終了時エラーが出て正しく終了できないとかダメだろ……

### PCを再起動

念のためやってみる。
![スクリーンショット 2022-04-06 205205.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569616/8858d6e7-e79f-9a89-2bf5-230b5e09dcda.png)

ダメ。助けて有識者！！

## 追記：なんと、解決した

[解決したので記事にしました](https://qiita.com/sakots/items/05ec44c3bc55aa325bdf)
pypyはC言語並に早かった(素数編) cython-annotationの例有

Pythonが大好きなのですが、処理が遅くて頭を悩ませています。

どうにか早くならないかとpypyとcython(pure python mode)でやってみました。

...すみません、ソースコードはこちらの方のを使わせていただきました。
https://qiita.com/L_A_P_119611/items/40f6c71c136fbe3cf32a

## 環境
MacOS: catalina
CPU: i9
- それぞれ3回計測した結果を載せています。


## pythonの結果
python3.9での実行結果は下記通りでした。
(arrangeをnumpyのに変えたら早くなるのだろうか...)
python3 src_sosu1.py 123456789 
123456789 = 3 * 3 * 3607 * 3803
所要時間は39.019531秒です
所要時間は34.007243秒です
所要時間は35.707815秒です

## javaの結果
java Factrization 123456789
123456789 = 3803 * 3607 * 3 * 3
所要時間は762ミリ秒です。
所要時間は687ミリ秒です。
所要時間は771ミリ秒です。

## C言語の結果
./a.out 123456789
123456789 = 3 * 3 * 3607 * 3803
所要時間は1.180174秒です。
所要時間は1.189351秒です。
所要時間は1.208539秒です。

## pypyでは？
使用したpypy: [PyPy 7.3.8 with GCC Apple LLVM 12.0.0 (clang-1200.0.32.29)]
homebrewでインスト。

下記とおり、ほぼC言語と同じ処理時間となりました。

pypy3 -O src_sosu1.py 123456789 
123456789 = 3 * 3 * 3607 * 3803
所要時間は1.269355秒です
所要時間は1.333231秒です
所要時間は1.378345秒です

## cython (annotation mode)
.so(windowsならdll相当)化したのに、期待した程、早くならなかった。
PurePythonから4倍位早くなった。


下記はdll(MacOSでは.so)化します。
cythonize -i -3 src_sosu2_with_cython1.py

src_sosu2_with_cython1.py
```python
"""
https://qiita.com/L_A_P_119611/items/40f6c71c136fbe3cf32a
"""
import sys
import time
import cython
# from cython.cpython.cimport import array
# import array
# 素因数分解


@cython.cfunc
@cython.inline
# def factrization(n: cython.int) -> array.array:
# def factrization(n: cython.int)->array.array[cython.int]:
def factrization(n: cython.int):
    # 与えられた数値までの整数を定義する
    p: array.array[cython.int] = list(range(n+1))
    a: cython.int
    b: cython.int
    m: cython.int
    n: cython.int
    # 2から初めて、倍数を削除する
    # 最大値の半分までやればOK
    for a in range(2, int(n/2)):
        # aが素数ではないことが決まっていたら次へ
        if p[a] == 0:
            continue
        # 素数にかける数
        b = 2
        m = a * b
        # aの倍数(つまり素数ではない数)を0とする
        while m < n:
            p[m] = 0
            b += 1
            m = a * b
        # nがaの倍数であれば
        if m == n:
            # n=a*bが確定
            # print('%d = %d * %d' % (n, a, b))
            # bをさらに素因数分解する
            fact: array.array = factrization(b)
            # 確定したaは素数なので出力する
            return [a] + fact
    # nが0にならなかったらnが素数
    return [n]


def main() -> cython.void:
    # コマンドライン引数で自然数を渡す
    num: cython.int = eval(sys.argv[1])
    # num: cython.int = 123456789
    # before: cython.float = time.time()
    before = time.time()
    # 素因数分解を実行する
    f = factrization(num)
    # after: cython.float = time.time()
    after = time.time()
    # 実行結果を表示する
    print('%d = %d' % (num, f[0]), end='')
    for p in f[1:]:
        print(' * %d' % p, end='')

    print('\n所要時間は%f秒です' % (after - before))


if __name__ == "__main__":
    main()
```

上記.so化したコードを呼び出します。
python src_sosu2_main4cython.py 123456789
123456789 = 3 * 3 * 3607 * 3803
所要時間は11.296245秒です
所要時間は11.296245秒です
所要時間は11.102219秒です
```python
import src_sosu2_with_cython1

src_sosu2_with_cython1.main()
```

# 結論
単にC言語化しても速度は、期待した程は向上しない。
C言語化で良いこともあれば、pypyのJITの方が良い事も多いのだろう。
これを使い分ける事で、速度挙げられるとよいのだけど。
Elastic Cloud の検索

こちらで投入したデータに色々な検索をかけます。
[Python3: Elastic Cloud に ndjson 形式のデータを投入する](https://qiita.com/ekzemplaro/items/3f6cb22cc891dcdf8ed8)

Documents
![documents_apr06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/76b983e7-67e8-b045-5599-9ff348dc7f5c.png)

Schema
![schema_apr06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/f092373c-1d56-2812-0ad8-5276717dd246.png)

```bash:search_http.sh
HOST="https://mar29-project.ent.asia-northeast1.gcp.cloud.es.io"
SEARCH_KEY="search-******"
NAME_ENGINE="vaccine-apr06"
#
URL=${HOST}'/api/as/v1/engines/'${NAME_ENGINE}'/search'
#
http POST ${URL} 'Authorization: Bearer '${SEARCH_KEY} < $1
```

```json:query01.json
{
  "query": "",
  "filters": {"prefecture": 9},
  "page": {"size": 10}
}
```

```json:query02.json
{
  "query": "",
  "filters": {"all": [ {"prefecture": 9}, {"gender": "M"} ] },
  "page": {"size": 10}
}
```

```json:query03.json
{
  "query": "",
  "filters": {"all": [ {"prefecture": 9}, {"gender": "M"},
	{"date": "2022-03-02T00:00:00+00:00"} ] },
  "page": {"size": 3}
}
```

```json:query04.json
{
  "query": "",
  "filters": {"all": [ {"prefecture": {"from": 6, "to": 9}}, {"gender": "M"},
	{"date": "2022-03-02T00:00:00+00:00"} ] },
  "page": {"size": 3}
}
```

```json:query05.json
{
  "query": "",
  "filters": {"all": [ {"prefecture": 9}, {"gender": "M"},
	{"date": {"from": "2022-03-02T00:00:00+00:00","to": "2022-03-04T00:00:00+00:00"}} ] },
  "page": {"size": 5}
}
```

実行スクリプトの例

```bash
./search_http.sh query01.json > out01.json
#
jq .results[].prefecture out01.json
jq .results[].gender out01.json
jq .results[].date out01.json
```

## 参考ページ ##
[Search API](https://www.elastic.co/guide/en/app-search/8.1/search.html)
[Search API filters](https://www.elastic.co/guide/en/app-search/8.1/filters.html)
【開発工程決定編】開発未経験がクラウドを企業に導入するプロジェクトごっこをしてみた~その4~ 

# はじめに
２２年度文系学部卒のたいきです。この記事では、システムの開発経験もないのに、見よう見まねで「プロジェクトごっこ」をしていきます。
・保有資格 : 応用情報技術者・AWS-SAP
・プログラミング言語:軽くPython

# 本記事について
本記事は[開発未経験がクラウドを企業に導入するプロジェクトごっこをしてみた~その3~【基本設計編part2】](https://qiita.com/Ishii_Taiki/items/06108a646c208f03a331)の続きでお伝えさせていただいたように、大まかに開発工程を決定していきます。この開発工程は、100%自分の気分で決定させていただきました。また、自分勝手に開発工程を前後させることがありますので、あんまり開発工程自体は参考にしないでください。今後の記事のちょっとした予告として楽しんでいただけると嬉しいです。


# 超おおまかな流れ
自分的に、早くシステムを開発してみたいという理由から以下のような順番になります。無理やり理由を付け加えるとすれば、基盤から構築してしまうとConfigログやSNS・kinesisなどのログが地味に高くつくからです。基盤構築からのほうがセキュリティ的には安全なのは間違いありません。しかし、rootユーザー以外のIAMユーザーでMFA認証を用いてログインすることで大分、仮想通貨マイニング用に不正アクセスされるとかいう確率は低くなるので、僕の気分の開発順序で行います。
システム開発　→　クラウド基盤構築（クラウド環境構築ではなく今回からこう呼びます）

# おおまかな流れ
## システム構築の流れ
この流れで開発を行う理由は、自分はフロントエンドを作ったことがないため、開発しているイメージの枠バックエンドから開発しようと考えたためです。システムの大枠が完成後に、セキュリティ自動化設計やCognitoを実装していきます。
最後の「その他（やってみた系）」とは、具体的には、IaC、CI/CD、BlueGreen、Route53などを扱って体験してみたといった感じでこのシステム上でやっていきます。
 ![system,_process.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2608302/65529447-3e04-8251-eb09-b1032d7fdeb5.png)

## クラウド基盤構築の流れ
以下の流れで開発を行う理由としては、クラウド基盤構築の際はログの集約用のアカウントへの変更など、多くのログインとログアウトを繰り返さなければいけません。それでは非効率なため、早急に一つのオンプレミスユーザーに複数アカウントを紐づけます。こうすることにより、数クリックでアカウント変更が完了するようになるためです。また、OUへのSCP付与が最後の理由は、SCPを初期段階でつけ権限を制約すると開発に支障が出る場合があるためです。
 ![cloud_process.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2608302/9c0c5348-bed5-8fbc-d130-1aa49bd096e0.png)

# おわりに
次回は、この開発工程通りモデリングから行っていきます。さてどうなるのでしょうか。楽しみにしていただける方が、もしいたらうれしいです。
続編はこちらです！[【モデリング編】開発未経験がクラウドを企業に導入するプロジェクトごっこをしてみた~その5~](https://qiita.com/Ishii_Taiki/items/f76265a6cb181dcf84f0)
WireSharkでECHONET Liteの通信を解析するためのプラグインECHONET-Lite-dissectorの微修正

# ECHONET-Lite-dissectorの微修正

https://qiita.com/U_Sukeee/items/4e869049bb7d16e8f655

で紹介されている

https://github.com/mzyy94/ECHONET-Lite-dissector

ですが、%appdata%\Wireshark\plugins に放り込んでいそいそとWiresharkを起動させると

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116888/1d7e1960-1b4c-395b-8020-f93130c86f2c.png)

というダウンなお知らせが。

とりあえず、echonet-lite-data.luaの37行目の

```echonet-lite-data.lua
edata.fields.edt  = ProtoField.bytes("echonetlite.edata.edt",  "ECHONET Property Value Data (EDT)",  base.HEX)
```

を

```echonet-lite-data.lua
edata.fields.edt  = ProtoField.bytes("echonetlite.edata.edt",  "ECHONET Property Value Data (EDT)")
```

のように修正してやるだけで、エラーを回避できます。
Wiresharkのどのバージョンで変更になったかまでは追跡してないのであしからず。

あと、対向機＆プロトコル解析用としては

http://sh-center.org/sdk/ssng

も便利です。
SETI/SETC等への応答は受け取っているものの表示しないようにマスクしてしまっているのが謎ですが。
list=[1,2,3,4,5,6]という6つの値からなるデータの中央値の表示方法

[code]
import pandas as pd
list=pd.Series([1,2,3,4,5,6])
print('最小値',list.min())
print('中央値',list.median())

--------------

最小値 1 
中央値 3.5
CTNラボからの挑戦状~ProxyMember~

# CTNって？
CTF（Catch The Flag）のsolidity版（Ethernaut）です！（自分が名付けました笑）
[Ethernaut](https://ethernaut.openzeppelin.com/)にある問題が例としてわかりやすいと思います。CTNを通して脆弱性やブロックチェーンの仕組みを学ぶことができます。とはいってもかなりハードルが高いのも事実で、JavascriptやSolidityができることが前提です…まず初めは[Hardhat tutorial](https://hardhat.org/tutorial/)をして環境を整えた後、[Ethernaut](https://ethernaut.openzeppelin.com/)を解いてみることをお勧めします。
# CTNラボとは
CTNラボはJPYC開発コミュニティで開催していたCTNを解いてみる会です。JPYC開発コミュニティはJPYCをはじめとするWeb3のエコシステム拡大を目的としていて継続的な勉強会をラボとして開催しています。頻度は基本、週に一回のペースでdisocord上で開催しています。興味がある方はこちらの[リンク](https://discord.gg/kcHp9ZZ5)から参加できます！
# ProxyMember
では早速、以下のコントラクトからNFTをゲットしてみてください！正攻法じゃないやり方も待っています！！
[RinkebyScanのリンクはこちら](https://rinkeby.etherscan.io/address/0xde6383bb520e3276b447e5a83cce647e66c94582#code)
```solidity
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

interface CTN_NFT {
    function mint(string memory _name, uint256 _level, uint256 _ranking, address _to) external;
}

contract ProxyMember {
    struct member {
        address addr;
        bytes32 key;
    }

    mapping(uint256 => member) private proxyMember;
    address public implementation;
	uint8 private ranking;
    address[] private memberImplementation;
    CTN_NFT nft;

    constructor(address _implementation, address _nft) {
        implementation =  _implementation;
        for(uint256 i=1; i<6; i++) {
            (bool success, ) = implementation.delegatecall(
                abi.encodeWithSignature("setId(uint256)", i)
            );
            if(!success) revert("fail delegateCall in constructor");
        }
        nft = CTN_NFT(_nft);
    }

    modifier onlyProxyMember(uint160 id) {
        require(msg.sender == proxyMember[id].addr);
        _;
    }

    function register(uint160 id, bytes32 key) external {
        require(proxyMember[id].addr == address(0), "This id is already used");
        require(proxyMember[id].key == key, "key is not valid");
        proxyMember[id].addr = msg.sender;
    }

    function setImplementation(uint160 id) onlyProxyMember(id) external {
        (bool success, ) = implementation.delegatecall(
            abi.encodeWithSignature("setImplementation(uint160)", id)
        );
        if(!success) revert("fail delegateCall in setImplementation");
    }

    function getNFT(uint160 id, uint256 index) onlyProxyMember(id) external {
        require(address(uint160(memberImplementation[index]) - id) == implementation, "index is valid");
        ranking++;
        nft.mint("ProxyMember", 5, ++ranking, tx.origin);
    }
}
```
Dependency injection(DI)とは？

## はじめに
[Dependency injection in Android](https://developer.android.com/training/dependency-injection)を読んで、個人的にかなりコンパクトにまとめました。
※間違っている部分があれば指摘していただけますと幸いです。


## Dependency injection(DI)とは？
クラスが必要なオブジェクトを取得するには、次の3つの方法がある

1. クラス自身が必要な依存関係を構築する
1. 別の場所から入手する
1. **パラメーターとして受け取る** ⇐これがDI

### DIを使わない場合（上記の1に相当）

Carクラスはコード内でEngineのインスタンスを独自に作成して初期化する

``` kotlin:1. クラス自身が必要な依存関係を構築する
class Car {

    private val engine = Engine()

    fun start() {
        engine.start()
    }
}

fun main(args: Array) {
    val car = Car()
    car.start()
}
```

この場合の問題点
- CarとEngineが密結合している
    - Carのインスタンスは1種類のEngineを使用し、サブクラスや別の実装を簡単に使用できなくなる
- テストが困難
    - 別のテストケース用にEngineを変更出来なくなる

### DIを使う場合（上記の3に相当）

Engineオブジェクトをコンストラクタ内でパラメーターとして受け取る

``` kotlin:3. パラメーターとして受け取る
class Car(private val engine: Engine) {
    fun start() {
        engine.start()
    }
}

fun main(args: Array) {
    val engine = Engine()
    val car = Car(engine)
    car.start()
}
```

この場合のメリット
- 再利用性が高い
    - CarにEngineの様々な実装を渡せる
- テストが容易
    - 様々なシナリオでテストできる

## AndroidでDIを行う主な2つの方法

### コンストラクタ インジェクション

クラスの依存性をコンストラクタに渡す

```kotlin:Constructor Injection
class Car(private val engine: Engine) {
    fun start() {
        engine.start()
    }
}

fun main(args: Array) {
    val engine = Engine()
    val car = Car(engine)
    car.start()
}
```

### フィールド インジェクション

クラスが生成された後に依存関係がインスタンス化される

```kotlin:Field Injection
class Car {
    lateinit var engine: Engine

    fun start() {
        engine.start()
    }
}

fun main(args: Array) {
    val car = Car()
    car.engine = Engine()
    car.start()
}
```

## Dependency injection(DI)のメリット
- コードの再利用性
- リファクタリングの容易さ
- テストの容易さ


## 参考資料

https://developer.android.com/training/dependency-injection


## おわりに

ちなみに、AndroidでDIを行うためのライブラリは [Hilt](https://developer.android.com/training/dependency-injection/hilt-android) が推奨されています。

ここまで読んでいただき、ありがとうございました。
何かありましたらコメントをお願いします。
【AWS】ログイン時にスマホからMFAをする方法

# 1.はじめに
どうも、ARIの名古屋支社に勤務している愛知県民です♪
(/・ω・)/

今回は**AWSにログインする時にスマホからMFAをする方法**について記載したいと思います。
AWS初心者の方、AWSについて勉強中の方の参考になれば幸いです♪
(*^^)v

# 2.用語の説明
## 2.1.MFAとは
MFAとはMulti-factor authentication（多要素認証）の頭文字で、
以下の情報の中から2つ以上を必要とする認証のことです。

* 知識情報（例：ユーザ名、パスワード）
* 所持情報（例：スマホで確認できるコード）
* 生体情報（例：指紋）
従来のユーザ名、パスワードだけの認証よりもセキュリティが向上します。

参考URL
https://moconavi.jp/blog/2021/06/5812/

# 3.前提条件
以下に前提条件を示します。

* IAMユーザが作成済であること
* スマホに認証アプリをインストールしていること

※手順は大きく変わらないと思いますが、本記事では「Google 認証システム」のアプリを使用します。

|![080_アプリをインストール.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1372071/f201d227-2f49-824c-891e-82dad236b069.jpeg)|
|:--|

# 4.概要
AWSでMFAの設定をした後に、スマホからQRコードを読み取り、MFAデバイスとして登録します。

# 5.MFA設定手順
5.1.WebブラウザからAWSにログインします。
5.2.「IAM」を選択します。

|![010_ログイン直後.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1372071/c13e6d4f-72ad-bcb9-5ec3-a5220df594a7.png)|
|:--|

5.3.「MFAを追加」を選択します。

|![020_MFAを追加を選択.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1372071/aaf055aa-88c3-8524-d71d-f1ec63102f8b.png)|
|:--|

5.4.「MFAデバイスの割り当て」を選択します。

|![030_MFAデバイスの割り当てを選択.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1372071/1a18b046-a5b4-704f-13f6-f81633cacc1b.png)|
|:--|

5.5.「仮想MFAデバイス」を選択し、「続行」を選択します。

|![040_仮想MFAデバイスを選択.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1372071/9cc19ac0-1693-fa9e-64c2-902ed6a076de.png)|
|:--|

5.6.「QRコードの表示」を選択します。

|![050_QRコードの表示を選択.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1372071/70500ac6-554d-b40b-98c3-a5568257bd22.png)|
|:--|

5.7.スマホで認証アプリを立ち上げ、QRコードを読み取ります。
5.8.2回分のMFAコードを入力し、「MFAの割り当て」を選択します。

|![060_QRコードを読み取り、MFAコードを入力.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1372071/5c01be14-939a-e6ae-5e4e-175b70a3d210.png)|
|:--|

5.9.「閉じる」を選択します。
|![070_閉じるを選択.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1372071/957fcadf-508d-02a9-fffd-9e92bae716fa.png)|
|:--|

5.10.一度AWSからログアウトし、再度ログインしようとします。
5.11.以下の画面が表示されるので、スマホに表示されたMFAコードを入力し、「送信」を選択します。

|![100_MFA認証画面.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1372071/42e345d1-0e4d-75ae-c14d-d57ba7cd3c76.png)|
|:--|

5.12.AWSにログインできれば問題なく設定ができています。お疲れ様でした。

# 6.おわりに
ここまで読んで下さり、ありがとうございます！！！
(^^)

セキュリティを強くしておくに越したことはないので、
是非是非、皆さんもMFAを試してみてください♪

何か思いついたことがあれば引き続き記事にします～
(:3_ヽ)_
中央値、四分位点を求める関数(Python)

# 概要

　その名のとおりです。中央値や四分位点を求めるだけの関数です。
　例えばBellCurveの統計Webなど、統計の本やサイトでよく出てきますが、データがたくさん与えられて、それの中央値や四分位点を求めなさいって問題、単純に数えるのが面倒くさくないですか？？？
　そんなものはPCに任せて一瞬で出せば良いんです。

```Python:mode.py
import numpy as np

array = [56, 48, 78, 81, 86, 71, 72, 88, 46, 47, 89, 58, 43, 79, 48, 41]
array.sort() # 昇順に並び替え
print(array)

def mode(array):
    mode_index = (len(array) - 1) / 2
    if len(array) % 2 == 0:
        # 中央の二つの値の平均
        mode = (array[int(np.floor(mode_index))] + array[int(np.ceil(mode_index))]) / 2 
    else:
        mode = array[mode_index]

    print(mode)

mode(array)

def firstQuater(array):
    first_index = int(len(array) / 4 - 1)
    if len(array) % 4 == 0:
        first_mode = ((array[first_index]) + (array[first_index + 1])) / 2
    else:
        first_mode = array[int(np.ceil(first_index))]
    print(first_mode)

firstQuater(array)

def thirdQuater(array):
    third_index = int(3 * len(array) / 4 - 1)
    if(3 * len(array)) % 4 == 0:
        third_mode = ((array[third_index]) + (array[third_index + 1])) / 2
    else:
        third_mode = array[int(np.ceil(third_index))]
    print(third_mode)

thirdQuater(array)

```

実行結果
```Python
[41, 43, 46, 47, 48, 48, 56, 58, 71, 72, 78, 79, 81, 86, 88, 89]
64.5
47.5
80.0
```

配列を定義してそれを関数にぶち込むだけ。
　if文で場合分けしているのは、真ん中の数が一つに定まるかと二つになるかで中央値等の求め方が変わるからです。正直本で公式化されていたので、それをコード化するだけです。
　中央値や四分位点の意味はネットで調べてください。
　間違い等、ツッコみどころがあったら教えてください。
　以上。
AWS EFSでEC2間のファイルをマウントする

## AWS EFS

https://aws.amazon.com/jp/efs/

Amazon Elastic File System

> Amazon Elastic File System (Amazon EFS) は、AWS クラウドサービスおよびオンプレミスリソースで使用するための、シンプルでスケーラブル、かつ伸縮自在な完全マネージド型のNFSファイルシステムを提供します。

## NFSとは
ネットワークを介して別のコンピュータの外部記憶装置（ストレージ）をマウントすることができ、そこに保存されているディレクトリやファイルをあたかも手元にあるかのように扱うことができるシステム
http://e-words.jp/w/NFS.html

NFSの用途はさまざまだが、便利なのはサーバ間でファイルを共有したいケース

##  とりあえずEC2間でファイルを共有してみる
いろいろ設定はあると思いますが、以下の公式チュートリアルを参考しにして、ぱっぱと動きを確認します。
https://docs.aws.amazon.com/ja_jp/efs/latest/ug/wt1-getting-started.html

### EFS側の作業

-  EFSのページからファイルシステムを作成
  -  EFSに設定するセキュリティグループはマウントするEC2からのタイプNFSの2049番ポートを開放しとく
- するとaz-zoneにマウントターゲットが作られます
![](https://i.imgur.com/AzoGDLk.png)
- 詳細ページ右上からアタッチのボタンを押します
  - 今回はIPアドレス経由でマウントしてみます
  - コマンドが出てきます、これはあとで使います
 ![](https://i.imgur.com/aLrDJf8.png)

### EC2側の作業
今回は、2つのec2の ~/efs同士をマウントします。

- 適当にec2を2台立てます
- 一方のec2にsshして、~/efsを作成します。
- そしたらさっきのコマンドのディレクトリの部分だけ変更して打ちます。
```
sudo mount -t nfs4 -o nfsvers=4.1,rsize=1048576,wsize=1048576,hard,timeo=600,retrans=2,noresvport 172.31.39.26:/ ~/efs
```

- df -hでマウントを確認できます。以下のようになったらokです
```
ファイルシス   サイズ  使用  残り 使用% マウント位置
------------------------------------------------------
172.31.0.108:/   8.0E     0  8.0E    0% /home/ec2-user/efs
```

- もう一方のec2での同じことをして終わりです

### 確認
- 一方に変更を加えたら、もう一方にも変更が適応されています。
![](https://i.imgur.com/iVQsTnt.png)

- マウントを解除する時はumountコマンドを使います。

## 参考
https://aws.amazon.com/jp/efs/
https://qiita.com/shogo_m/items/d7d844a5da4df2732bdf
https://qiita.com/mksamba/items/1702618dd4921675b90d
【Laravelエラー】Failed to open the referenced table 

## 環境
Laravel v9.5.1 (PHP v8.1.3)

## 状況
```php artisan migrate```実行したときに下記のエラー。

```
Failed to open the referenced table 'users' (SQL: alter table `posts` add constraint `posts_user_id_foreign` foreign key (`user_id`) references `users` (`id`))
```


## 原因
外部キーを設定しているmigrationファイルがあるときに、「```posts```テーブルが```user_id```を持っている状態で、```users```テーブルを参照したいけどできない」というエラー。
migrationファイルを生成したときの日付が```users```テーブルより```posts```テーブルが先になってしまっていた。


## 解決法
migrationファイルの日付を親ファイルが子ファイルより先になるように修正する。
Windows11のVSCodeでJAVAの環境構築してみた！

今日からJAVAの勉強を新しく初めていこうとおもったので、環境構築から備忘録程度に書いていこうと思います。
PC：Windows11
エディタ：VSCode
参考にさせていただいたサイト：
https://teramaguro.hatenablog.com/entry/2021/12/28/042743

①まず下記URLからJAVAの開発に必要なインストーラをインストールする。
↪その際に自分の開発環境に合うものを適宜選ぶ（今回はWindows11なのでWindowsを選択）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2619929/c58589dd-74a2-49cb-4195-dd33ff970fa2.png)
②今回は下記インストーラをインストールしました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2619929/4e45b8e5-45f0-f5f1-3160-9773cc4871d0.png)
③下記ポップアップがでてきたらより詳細を知りたい人は次のステップ、別にいい方は閉じる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2619929/d742670b-3ee2-db6a-8bb4-ff5a3a89bd5d.png)
④次にVSCodeの拡張機能をインストールします。(Extension Pack for java)
なにかいろいろしてくれる機能のようです。あって損はないですね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2619929/383de345-d7e6-8d62-7e0f-bcd4a9f461c5.png)
⑤拡張機能がインストール出来たら、最後にパスを通します。「ファイル→ユーザー設定→設定」と移動し、画面上部の検索欄に「java.HOME」と入力します。
そしたら下記のようなものがでてくるので、setting.jsonで編集を押し、下記の通り編集し保存します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2619929/cfc5d859-9c38-f854-8513-0f8bfc764ff7.png)
"java.home": "C:\\Program Files\\Java\\｛JDKのバージョン｝"
> "java.jdt.ls.java.home": "C:\\Program Files\\Java\\jdk-18"

⑥これでパスが通り、環境構築は完了です。最後に念のため再起動しておきましょう。
⑦適当なCやDドラに適当なファイルを作成しておきます。(僕的にはDドラがおすすめです。)

⑧次にコマンドパレットを開き、create java ploject と記載します。
（コマンドパレットは表示タブにあります。）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2619929/e32e1183-343b-4cc4-1492-59c671b4d237.png)
⑨create java project選択後、No Build toolsを選択し、⑦で作成したファイルを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2619929/71ab69af-2eb7-4ade-68fa-e21b9df01bd6.png)
⑩Testなど、プロジェクト名を記載しEnterを押下します。
その後新しいウィンドウが開きます。
src→App.javaと書かれているところには、みんな知ってるあの文字　そう！Hello World!を出力するテンプレがあります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2619929/79c02a42-cd7b-8f34-04bf-dbddd860157a.png)

⑪右上のスタートボタンを押し、下にあるターミナルにHello World!と出力されれば環境構築OKです！
一緒にJAVAを学んでいきましょう！！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2619929/845d5650-a4cf-a50c-0112-eb1af2c94f04.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2619929/580d7d02-a847-5b39-1182-071dc9fbbd86.png)

番外編
③の次のステップを押した場合、下記のようなサイトに行きつきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2619929/5cfab2a7-a61e-f9db-e31c-ed9f7af7f987.png)
便利ページ：Web Serial APIでCOMポート出力のコンソールを作る


「[便利ページ：Javascriptでちょっとした便利な機能を作ってみた](https://qiita.com/poruruba/items/6c67c7eef34ed302feb3 )」のシリーズものです。

ESP32を使っていると、COMポートの出力を手早く確認したいときが多いです。
もちろん、Visual Studio Code＋PlatformIOのSerial Monitorを使うのもありですが、Visual Studio Codeを立ち上げていないときにも、COMポート出力を確認したい場合がありました。
一方で、Web Serial APIというJavascriptでCOMポートを読み書きできる便利な機能があるので、使わない手はないです。

mdn：Web Serial API

https://developer.mozilla.org/en-US/docs/Web/API/Web_Serial_API

ソースコードもろもろは以下のGitHubに上げてあります。

poruruba/utilities

https://github.com/poruruba/utilities

手っ取り早く使いたい場合は、以下にアクセスして、ユーティリティからシリアルを選択してください。

https://poruruba.github.io/utilities/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261826/90323780-c52b-a8f3-af51-5566ce5f6546.png)

# ポートオープン

以下を呼び出します。このJavascriptがあるページはHTTPSである必要があります。また、ボタン押下などユーザジェスチャを契機とする必要があります。

```js:js/comp/comp_serial.js
        var port = await navigator.serial.requestPort();
        await port.open({ baudRate: this.baud });
```

# 連続受信処理

受信は以下のようにします。valueに受信データがバイト配列で格納されています。
doneがある場合は、切断など、これ以上受信できないため中断しています。

```js:js/comp/comp_serial.js
            this.reader = this.port.readable.getReader();
            return new Promise(async (resolve, reject) =>{
                do{
                    try{
                        var { value, done } = await this.reader.read();
                        if( done ){
                            this.console_text += '[[read done detected]]\n';
                            this.connected = false;
                            return reject("read done detected");
                        }
                        this.data_process(value);
                    }catch(error){
                        console.log(error);
                        this.connected = false;
                        return reject(error);
                    }
                }while(true);
            })
            .catch(error =>{
                console.log(error);
            });
```

今回は以降の処理で受信したデータをそのままHTMLのテキストエリアに出力しています。ただし、受信データはバイト配列であるため、文字列に変換します。ちょっと条件分岐がありますが、これはテキストエリアの最後に出力した
後に、自動的にスクロールバーを最後に移動させるためのものです。

```js:js/comp/comp_serial.js

    const decoder = new TextDecoder("utf-8");

    data_process: function(value){
        this.console_text += decoder.decode(value);
        if( this.auto_scroll ){
          const el = document.getElementById('el');
          el.scrollTo(0, el.scrollHeight);
        }
    },
```

以上
Digispark チュートリアル

# 準備するもの
* Windows PC
* https://www.amazon.co.jp/dp/B0154PL3QA
* https://github.com/digistump/DigistumpArduino/releases/tag/1.6.7
    *  `Digistump.Drivers.zip/DPinst64.exe`
* https://www.arduino.cc/en/software/
    * `https://downloads.arduino.cc/arduino-1.8.19-windows.exe`

# Arduino初期設定～Lチカまで
* `ファイル` > `環境設定`
    * `追加のボードマネージャのURL` : `https://raw.githubusercontent.com/digistump/arduino-boards-index/master/package_digistump_index.json`
    * `OK`
* `ツール` > `ボード` > `ボードマネージャー`
    * `Digistamp AVR Bords` をインストール
    * `閉じる`
* `ツール` > `ボード` > `Digistamp AVR Bords` > `Digispark Default - 16.5mhz`
* `ファイル` > `スケッチ例` > `Digispark_Example` > `Start`
* `スケッチ` > `マイコンボードに書き込む`
* `Plug in device now... (will timeout in 60 seconds)` と表示後 USBポートにDigisparkを差し込む
* `Micronucleus done. Thank you!`と表示されれば書き込み完了

## マウスジグラー

```c
// DigiMouse test and usage documentation
// CAUTION!!!! This does click things!!!!!!!!
// Originally created by Sean Murphy (duckythescientist)

#include <DigiMouse.h>

void setup() {
  DigiMouse.begin(); //start or reenumerate USB - BREAKING CHANGE from old versions that didn't require this
}

void loop() {
  const int MOVE_LEN = 500;
  int iNowPosi;

  // けーや
  for(iNowPosi = 0; iNowPosi < MOVE_LEN; iNowPosi++){
    // 1pxずつ動かさないと何故かずれていく
    DigiMouse.move(-1, 1, 0);
    DigiMouse.delay(1);
  }
  DigiMouse.delay(50);

  // きざ
  for(iNowPosi = 0; iNowPosi < MOVE_LEN; iNowPosi++){
    DigiMouse.moveX(1);
    DigiMouse.delay(1);
  }
  DigiMouse.delay(50);

  // か
  for(iNowPosi = 0; iNowPosi < MOVE_LEN; iNowPosi++){
    DigiMouse.moveY(-1);
    DigiMouse.delay(1);
  }
  DigiMouse.delay(500);
}
```

# 参考サイト

* https://stardust-news.net/research/1302/
* https://digistump.com/wiki/digispark/tutorials/connecting
Rails APIからReactに渡すデータを整形する方法

RailsAPI＋Reactという構成でアプリを作っているとデータを整える必要がある時が多々あると思います。

例えば以下のようなユーザーデータがあるとします。

```ruby
{
  name: 'taro'
  age: 21
  sex: 'male'
  phone_number: 08012341234
  post_code: 'xxx-xxxx'
  prefecture: 'ZZZ県'
  city: 'ZZZ市'
  ward: 'ZZZ区'
  town: 'ZZZ町'
}

```
React側で住所が欲しいときに一々、郵便番号や県、市などを繋げるのは面倒ですよね。こういう時はRailsでシリアライザーをつかうと便利です。シリアライザーは以下のようになります。

```ruby
class UserSerializer < ActiveModel::Serializer
  attributes :name, :age, :sex, :phone_number, :post_code, :prefecture, :city, :ward, :town

  def address
    object.post_code + " " + object.prefecture + object.city + object.ward + object.town
  end
end
```

このようにRails側に一度だけ書くことでReactからはこのような感じで呼び出せるようになります。

```javascript
const user = fetchUser
console.log(user.address) //=> xxx-xxxx ZZZ県ZZZ市ZZZ区ZZZ町
```

簡単でしたがシリアライザーについては以上になります。

最後に、シリアライザーはかなり便利なのですが未経験の方で使っている方はあまりいません。なので未経験の方がポートフォリオに組み込むとそれを見た採用担当は「おっ、わかってるな」となると思います。他の未経験者との差別化ですね。

また、シリアライザーとは全く別ものなのですがGraphQLもフロント側が取得するデータを自由に選べるという点で便利です。気になる方は調べてみてください。
そろそろ都道府県マスタを作るのをやめたい

# はじめに
都道府県マスタはどのサービスでも必ず作ると言っても過言ではないほどメジャーなデータです。
こんな有名なデータにも関わらずググると...
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496802/5e1d5b21-4e19-2583-bf6a-6a3fb99aee6a.png)
たくさんのSQLサンプルが出てくる...
サンプル自体は素晴らしいのですが、複数のサービスを開発すると毎回これを作るのが気持ち悪い感じがして「政府がAPIとか出してないかな～」と思って調べたら普通に出てきたので共有します:relaxed:

# デジタル庁のオープンデータ
デジタル庁が都道府県マスタを公開しています。さらに市区町村マスタも公開しており、大量のデータかつメンテナンスが大変なデータもオープンデータを使えば保守が楽になります:relaxed:

https://cio.go.jp/policy-opendata

https://www.digital.go.jp/news/qcm0KZc-/

ちなみに政府CIOポータルの更新は停止されているため、デジタル庁のサイトに最新の情報が載っています。ただ、都道府県マスタのリンクが政府CIOポータルになっているので非常にわかりずらいです。

CSVの詳細はこんな感じです

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496802/fc040c44-13c3-335f-36cb-22aee33e7b53.png)

## 難点
データの形式がXLSX、CSVとなかなか痺れる形式でさらに文字コードがShift JISとなっております。
保守性を考えたらギリギリ許容範囲といったところでしょうか...

## 商用利用について

基本的にはOKです
> 公共データの二次利用可能な形での公開とその活用を促進する

[オープンデータ基本指針](https://cio.go.jp/sites/default/files/uploads/documents/data_shishin.pdf)

## まとめ
このオープンデータをどこまで信用してよいのか未知数ではありますが、オリジナルのマスタを保守するコストを考えたらマシかなと個人的には思っております。都道府県マスタを作るのに躊躇するエンジニアがいましたら1つの案としてオープンデータを活用するのはよいのではないでしょうか。
LaravelのEloquentによる検索【個人的なお勉強アウトプット】

## 参考図書
https://www.amazon.co.jp/dp/B07CLLW4MX/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1

## whereによる検索
IDを指定しての検索はfindでできた。ID以外の検索はwhereメソッドを使う。

複数のレコードを得る
`$変数 = モデルクラス::where(フィールド名,値)->get();`

最初のレコードだけを得る
`$変数 = モデルクラス::where(フィールド名,値)->first();`

DBクラスのビルダとは少し違い、Eloquentのwhereはビルダクラスのインスタンスを返す。
DBクラスではIlluminate\Database\Query名前空間にあるBuilderクラスのインスタンスが返された。
モデルクラスのwhereではIlluminate\Database\Eloquent名前空間にあるBuilderクラスのインスタンスが返される。
まあほとんど同じとのこと。

## 実例
### nameを検索する 
```app/Http/Controllers/PersonController.php
public function search(Request $request){
$item = Person::where('name', $request->input)->first;
$param = ['input' => $request->input, 'item' => $item];
return view('person.find', $param);
}
```
名前をフィールドから検索すると表示されるスクリプト
LaravelのEloquent ORMの使い方【個人的なお勉強アウトプット】

## 参考図書
https://www.amazon.co.jp/dp/B07CLLW4MX/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1

## モデルファイル作成
`php artisan make:model モデル名`
app/Modelsの中にファイルが作成される。

### 命名規則
テーブル名は複数形、モデルは単数形。
これにしたがうことでテーブルとモデルを自動的に関連付けて動くようにする。

例）
テーブル名：people
モデル名：person

モデルファイル
```app/Models/Person.php
<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Person extends Model{

}
```
モデルクラスはIlluminate\Database\Eloquent名前空間にあるModelを継承したクラスとして作成される。

## モデルの使い方
### 全件取得
コントローラーファイルを作成
`php artisan make:controller PersonController`

```app/Http/Controllers/PersonController.php
namespace App\Http\Controllers;

use App\Models\Person;
use Illuminate\Http\Request;

class PersonController extends Controller{
public function index(Request $request){
$items = Person::all();
return view('person.index', ['items' => $items]);
}
}
```
Personクラスのallメソッドで全レコードを取得できる。
取得されたレコードは、Illuminate\Database\Eloquent名前空間のCollectionクラスのインスタンスとして得られる。これはレコード管理専用のコレクションクラス。
一般的なコレクションと同様、foreachなどを使い順に値を取り出して処理できる。

index.blade.phpを作成
```resources/views/person/index.blade.php
@extends('layouts.helloapp')

@section('content')
    @foreach ($items as $item)
        {{$item->name}}
        {{$item->mail}}
        {{$item->age}}
    @endforeach
@endsection
```

ルート情報を追加
```routes/web.php
Route::get('person', 'App\Http\Controllers\PersonController@index');
```

### Personクラスにメソッドを追加する
DBクラスと決定的に違うのは、コレクションにまとめられているのは、配列などではなく、モデルクラスのインスタンスである、という点。
上記の例でも、ひとつひとつのレコードはPersonクラスのインスタンスとしてまとめられている。
モデルクラスのインスタンスだから、クラスにプロパティやメソッドを追加することで独自に拡張することができる。

```app/Models/Person.php
public function getData(){
return $this->id . ':' . $this->name . '(' . $this->age . ')';
}
```

ビューを編集
```resources/views/person/index.blade.php
@extends('layouts.helloapp')

@section('content')
{{$item->getData()}}
@endsection
```

### IDによる検索
`$変数 = モデルクラス::find(整数);`
findはモデルクラスの静的メソッドとして呼び出す。

>静的（スタティック）メソッドとは
クラスに対して呼び出し、どこで呼び出しても同じ処理を行う
静的メソッドの中では`$this`は使えない。
`self::`でスタティックプロパティにアクセスすることはできる
https://prograshi.com/language/php/php-static-vs-instance/

findはテーブルのプライマリキーはidという整数値のフィールドであることを前提としている。

#### findアクションをつくる
検索用ページのfindページをつくる
```resources/views/person/find.blade.php
@extends('layouts.helloapp')

@section('content')
<form actioon="/person/find" method="post">
@csrf
<input type="text" name="input" method="post">
<input type="submit" value="find">
</form>
@if(isset($item))
{{$item->getData()}}
@endsection
```

#### コントローラーの修正
```app/Http/Controllers/PersonController.php
public function find(Request $request){
return view('person.find',['input' => '']);
}

public function search(Request $request){
$item = Person::find($request->input);
$param = ['input' => $request->input, 'item' => $item];
return view('person.find', $param);
}
```
findは/findにGETアクセスしたときの処理、searchはPOST送信されたときの処理。
searchは送信されたinputフィールドの値を引数に渡してfindメソッドを呼び出している。

#### ルート情報の追加
```routes/web.php
Route::get('person/find', 'App\Http\Controllers\PersonController@find');
Route::post('person/find', 'App\Http\Controllers\PersonController@search');
```
findから検索したIDに対応するレコードが表示される。
Jenkins のビルド結果を Slack に通知させる方法 [2022年最新版]

## はじめに

Jenkins のビルド結果を Slack に通知させる方法の紹介です。

[Jenkinsのビルド結果をSlackに通知させる](https://qiita.com/unsoluble_sugar/items/a42795d108624fcd02d4) という Qiita 記事を参考にして、
Jenkins に Slack 通知用のプラグインを追加して設定しようと思っていたのですが、
この記事は2016年に書かれたもので現在 (2022年) の内容とは一致しませんでした。

そのため、情報をアップデートしておきます。

最初に、手順を簡単にまとめておきます:

- 手順
1. https://my.slack.com/services/new/jenkins-ci にアクセスして Slack に Jenkins-CI をインストールする
1. Jenkins-CI のインストール手順に従って Jenkins 側の設定を行う

以下、この手順について詳細を紹介します。

## 環境

- Jenkins 2.303.1
- Slack Notification Plugin 608.v19e3b_44b_b_9ff

## 手順

### Jenkins-CI のインストール

https://my.slack.com/services/new/jenkins-ci にアクセスして
Slack に Jenkins-CI をインストールしてください。

Workspace に Jenkins-CI をインストールすると以下のような設定方法が書かれているページが表示されるので、
それに従って Jenkins 側の設定を行います。

![Screenshot_2022-04-05_18.43.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/273914/437eb842-306f-08e5-b679-d3b7dd316a02.png)

以下で、その Jenkins 側の設定方法について説明します。

### Jenkins 側の設定

詳しくは、先ほどの Jenkins-CI の設定方法が書かれているページを読んでいただいて、
設定方法を箇条書きにするとこんな感じです。

- Manage Jenkins (Jenkins の管理) を開く
- Manage Plugin (プラグインの管理) を開く
- Available (利用可能) タブで "Slack Notification" プラグインにチェックを入れてインストールする  
(この際、他のプラグインのアップグレードを要求されたらその要求に従ってください)
- インストール完了次第、Manage Jenkins (Jenkins の管理) を開く
- システムの設定 (Configure System) を開く
- 一番下 (おそらく) の "Slack" という設定の次の項目を入力する
    - Workspace: Jenkins-CI をインストールしたワークスペースの ID (Jenkins-CI の "チームサブドメイン" のこと)
    - Credential: Jenkins-CI の "インテグレーション用トークン認証情報 ID" を Jenkins のシークレットテキスト認証情報として登録した上で指定する (Jenkins の認証情報の追加方法がわからなければ適宜ググってください)
    - Default Channel: Slack の通知を飛ばしたいチャンネル名

![Screenshot_2022-04-06_17.59.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/273914/e6dde073-1795-f895-d7cc-a6fd0b701aee.png)

- システムの設定で "保存" をクリックする
- Slack に通知を飛ばしたいジョブの Post-build Actions (ビルド後の処理) で "Slack 通知" を選択する
    - どういう条件のとき Slack に通知を飛ばせるか選択できるので適当な条件を設定してください

以上の設定が完了すれば、Jenkins のビルド結果が指定した Slack チャンネルに通知されます。

## おわりに

以上、2022年最新版の Jenkins のビルド結果を Slack に通知させる方法でした。

「この手順を踏んだんですけど、うまくいきませんでした」

「この手順を踏みたいんですけど、やり方がわかりませんでした」

みたいなコメントがあれば、どしどし、コメントお願いします。

あと、この記事が少しでも役に立った、ありがとう、と思っていただけたら、
LGTM よろしくお願いします！
[英語が苦手な人向け]GitHub Issuesで解決策を簡単に見つける方法

開発をしていて、問題が発生したときにGitHub Issuesに行きつくことありますよね？
ただ、多くのフレームワークやライブラリでは英語で議論されているため、英語が苦手な人からすると解決策を探すのが大変です。。

そこで、簡単に解決策を見つける方法を教えます！

それは．．．

<font color="red">リアクションを見ること</font>

です！！

# 具体例

実際に「Node.jsのバージョンを上げたらSequelize（Javascript向けのORマッパー）が正常動作しなくなった」という問題が起きた際に解決方法を見つけた手順を説明します。

まず、「sequelize node14 not work」で検索します。
<font color="red">※※検索する際はなるべく英語で検索するクセをつけましょう※※</font>

すると、以下のGitHub Issuesがヒットしたので、開いてみると

https://github.com/sequelize/sequelize/issues/12158

英語です．．．:sob:

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/325108/dde4b516-84e5-90bb-42bd-3322546ab6f8.png)


### 下までスクロールして、大きなリアクションされている投稿を見つける

ここで、英語だからとページを閉じないでください！
とりあえず下までスクロールしてみましょう。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/325108/e12ca04f-1227-56df-2fd1-ffdd03eade1a.png)

すごいポジティブなリアクションが多い投稿がある！！

ということでGoogle翻訳先生に丸投げしてみると、「pgライブラリのバージョンを上げたら解決した」という内容でした。
実際に自分の環境でこれを試したところ、無事に解決できました！

このように、多くのIssueでは問題に対してクリティカルな投稿に対してはポジティブなリアクションが多くついている場合が多いです。

### 番外編（コードだけ見る）


上記の例ではライブラリのバージョンの問題のため当てはまらないですが、コードの問題の場合は`ソースコードが張り付けられた投稿だけを見てコードの内容だけを見る`というのも有効です。

<font color="red">プログラミング言語は世界共通言語！！</font>

英語や中国語などの他国語は読めなくてもコードを見れば何がしたいのかわかるので、あとはそのコードで解決できているのかどうかを確認（Google翻訳先生に丸投げ）することで解決策を探すことができます。

この方法はGitHub Issuesだけでなく、stackpoverflow等でも有効なのでめちゃめちゃ便利です。

#### stackoverflowでのコードだけ見る例

sequelizeでTypescriptを使っている場合に、どうやってmigrationするんだ！っていう問題について調べる場合を例に説明します。
「sequelize typescript migration」で検索すると、以下の投稿がヒットしました。

https://stackoverflow.com/questions/70371646/sequelize-cli-db-migrations-with-typescript


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/325108/25a728ab-a591-5634-7dbc-8b3de0354a62.png)

コードやコマンドはリファレンスを見れば読めるので、自分がやりたいことをやってそうかパッと確認します。
知らないプロパティが出てきたりしたら、翻訳しても良いですが基本的にはリファレンスを読みましょう。



# まとめ

GitHub Issuesはリアクションがつけられていて、とても解決策が見つかりやすいです。
他にもいろいろと着眼点を見つけることで解決策を見つけやすくなりますので、読めないからとすぐにページを閉じずに解決策を探すための術を磨いてください！

ちなみに、英語のページに慣れてきたら自力で翻訳してみることをおススメします。
エンジニアの英語は割と簡単な構文で書かれていることが多く、大学受験以来まったく勉強してなくても割と読めるようになってきます。

英語のページの見方がわかると問題解決力が格段に上がるので、是非この解決方法は覚えておいてください！！
C#を使用してExcelシートに背景画像を挿入する方法

日常生活で、人々は常にMS Excelを使用して仕事を完成させます。通常、MS Excelを開くと、その中のワークシートはすべて空白な背景でけっこう単調なものです。もちろん、MS Excelは画像をワークブックに挿入してその背景として設置することができます。しかし、Microsoft Officeがインストールされていない場合、Excelファイルに素敵な背景画像を設定したいならどうすればいいでしょうか？この機能を実現するため、次はC＃で無料のコントロールである[Free Spire.XLS for .NET](https://www.e-iceblue.com/Download/download-excel-for-net-free.html)を使用する方法を紹介します。

## 追加する必要のある名前空間：
```
using System.Drawing;
using Spire.Xls;
```
元のファイルのスクリーンショット：
![01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278784/7df2424d-89b6-3fba-b787-d61ac6f7e98d.png)

## 詳細な手順とコード

**ステップ1**：新しいブックオブジェクトを作成します。
```
Workbook workbook = new Workbook();
```
**ステップ2**：システムからExcelファイルをロードします。
```
workbook.LoadFromFile("C:\\Users\\Administrator\\Desktop\\sample.xlsx");
```
**ステップ3**：例としてExcelファイルの一番目のテーブルを選択します。
```
Worksheet sheet = workbook.Worksheets[0];
```
**ステップ4**：画像をロードします。
```
Bitmap bm = new Bitmap(System.Drawing.Image.FromFile("C:\\Users\\Administrator\\Desktop\\image.jpg"));
```
**ステップ5**：この画像を背景として設定します。
```
sheet.PageSetup.BackgoundImage = bm;
```
**ステップ6**：Excelファイルを保存し、そして開きます。
```
workbook.SaveToFile("result.xlsx");
System.Diagnostics.Process.Start("result.xlsx");
```
挿入した結果は以下のようになります：
![02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278784/89db1da1-a096-81f3-fa7e-60c08ddb22b1.png)

## 完全なるコード一覧

```
using System.Drawing;
using Spire.Xls;

namespace add background image
{
    class Program
    {
        static void Main(string[] args)
        {
            Workbook workbook = new Workbook();
            workbook.LoadFromFile("C:\\Users\\Administrator\\Desktop\\sample.xlsx");
            Worksheet sheet = workbook.Worksheets[0];
            Bitmap bm = new Bitmap(System.Drawing.Image.FromFile("C:\\Users\\Administrator\\Desktop\\image.jpg"));
            sheet.PageSetup.BackgoundImage = bm;
            workbook.SaveToFile("result.xlsx");
            System.Diagnostics.Process.Start("result.xlsx");
        }
    }
}
```

今回のExcelシートに背景画像を挿入する方法は以上で終わります、最後まで読んでいただきありがとうございました。
if式やループのネストを減らす方法まとめ

# 結論

- 早期リターンする
- 条件式で代入を行う

以上のやり方でネストを減らすことができます。

### 早期リターンする

例えば、受け取った数字が50より大きいとき2倍にする関数があるとき

早期リターンしない場合。
```ruby
def double(number)
  if number > 50
    number * 2
  end
end
```

早期リターンする場合。
```ruby
def double(number)
  return if number <= 50
  number * 2
end
```

ループ内の場合は`next if number`でも良いですね。

### 条件式で代入を行う

例えば、ユーザーを１つ取り出して何かしたいとき

条件式で代入しない場合
```ruby
def update
  user = User.find(params[:id])
  if user
    ...
  end
end
```
条件式で代入する場合
```ruby
def update
  if user = User.find(params[:id])
    ...
  end
end
```


# 最後に


ネストがなければ良いというものでもないですが、あまりに深い場合は減らすようにしてもいいかもしれません。
GitHub Action を使った Android テストでエラーを具体的に表示する

GitHub Action で Android の CI を実行させるためのおまじない。
`-i` をつけることでテストエラー時の内容がより具体的になる。

```yaml
name: Qiita Sample
on:
  push:
    branches:
      - develop
    paths-ignore:
      - docs/**
      - README.md
      - CHANGELOG.md
  pull_request:
    branches:
      - develop
    paths-ignore:
      - docs/**
      - '*.md'
jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - name: Set up JDK 11
        uses: actions/setup-java@v1
        with:
          java-version: 11
      - name: Build & Test
        run: |
          ./gradlew clean build test -i
```

この記事は個人的な備忘録になる予定です。
8回目　ルーティング

ルーティングの作りについて解説する

![ルーティング1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2606732/74f214e8-050c-af7e-3021-bb4e73c28178.png)

第一分岐点（自動か手動か）
第二分岐点（種類）

### 初めに
ルーティングを行うための原則として、コンピューター通しの通信では、双方向に通信できないといけない。つまりは、片方だけのルーターだけが情報を持っていても成立しないということである。宛先のわからないパケットは破棄される。
![ルーティング2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2606732/c97fea48-4e12-2c34-6121-1288fa824fce.jpeg)


#### スタティックルーティング
・管理者が宛先への最適なネットワークの経路を手動で設定すること。そのため、ネットワークに変化があったとしてもルートが切り替わることはない。
・小規模なネットワークや末端のネットワークで利用されることが多い。
・中継経路を指定するためには、ネットワークアドレス、ネクストホップ、インターフェースを指定する。例えば、4つのネットワーク間で通信を行うためには、4つのルート情報がすべて記録されていないといけない。これによりコードが300行ぐらいになることもあるらしい
・デフォルトルートというルーティングテーブルに登録されていない場合のルートがある。これはネクストホップ（次に転送すべきIPアドレス）が分かっていない場合に優先的に転送されるルートである。

#### ダイナミックルーティング
・インターネットなど大規模なネットワークに利用されている方法。
・ルーティングプロトコルには、主にOSPFとRIPというものが利用されている。それぞれ距離や速度といった情報をもとに経路を検索する。googleマップの経路検索で距離か時間で判断するかといったイメージ。
・インターフェースを有効にしていれば、経路情報が更新されていくので、アドレスを一つ一つ確認する必要がない。そのためコードが2行で済むこともある。
扱う情報が少なければルータの負荷が少なくパケットの送受信も早く行うことができる。

### まとめ
ルーティングを設定する方法は手動のものと自動で行われるものがあり、スタティックルーティングとダイナミックルーティングと呼ばれる。
ルートの更新をネットワークの数だけする必要があるため、手動で更新するのはごく小さなネットワークに限られる。一方で、ルータ通しで情報交換し、最適ルートを検索する方法では、その都度経路情報が更新されるため、複雑な大規模なネットワークにてきしている。

自身が正しく理解できているか、内容が深くなるにつれて怪しくなってきたので、もう一度自分の書いた記事を修正したほうがいいと思った。
githubのPermission denied (publickey). エラーの解消

# 現象
いつもgithubにpushしているPCとは違う新しいPCからpushしようとしたところ、下記エラーが発生した。

### エラー
```
git@github.com: Permission denied (publickey).
fatal: Could not read from remote repository.
```
どうやらssh接続をしたときに、githubへの接続ができないらしい。

[こちら](https://ormcat.net/blog/20210509_github-denied-publickey/)を参考にssh接続を試みたところ、NGとなった。

SSH key（公開鍵）を登録するため、下記記事を参考に修正すると、解決できた。
[GitエラーPermission denied (publickey).の解決方法](https://qiita.com/tetsu-upstr/items/e72147250701cf30ee72)