OmniAICreator/Qiita-1.07M huggingface dataset:
LoRaWANを試す - デバイス編

# はじめに

前回設置したLoRaWANのゲートウェイの続き。実際にデバイスをLoRaWANでAWS IoTに繋いでみます。

LoRaWANデバイスの認証プロセスは、OTAA:Over The Air Authentication と ABP:Authentication By Personalization の2種類ありますが、今回はABPを利用します。

- 今回使用するデバイス
  SenseCAP T1000-A LoRaWAN Trakcer

https://www.seeedstudio.com/SenseCAP-Card-Tracker-T1000-A-p-5697.html

https://www.switch-science.com/products/9320

# デバイスの準備

デバイスの準備はこちらのガイドを参考に行います。スマホにSenseCAPアプリをインストールして、Bluetooth経由でデバイスの設定を行います。

https://files.seeedstudio.com/products/SenseCAP/T1000_Tracker/SenseCAP_Tracker_T1000-AB_User_Guide_v1.2.pdf

- スマホにSenseCAPアプリをインストール
- デバイス裏面のQRコードを読み取ってデバイスを追加する
- 以下を設定し、NwkSKey、AppSKeyをメモする
  - Platform: Other Platform
  - Frequency Plan: AS923
  - Activation Type: ABP
  - DevAddr: 任意

  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555397/79063ad0-9b31-db68-543f-b717c0347c82.png)


# AWS IoT準備

AWS IoTの準備はこちらのガイドを参考に行います。

https://files.seeedstudio.com/products/SenseCAP/M2_Multi-Platform_Gateway/Connect%20M2%20Multi-Platform%20Gateway%20to%20AWS%20IoT.pdf

デバイスをAWS IoTのLPWANデバイスとして登録する前に、プロファイル（デバイスプロファイル、サービスプロファイルの2つ）と送信先を準備します

- AWSコンソールにログイン
- サービス一覧から IoT > IoT Core を選択して AWS IoT に移動
- LPWAN デバイス > プロファイル に移動し、「デバイスプロファイルを追加」。
- ワイヤレスデバイスの仕様はABP v1.0.x、EUIは筐体の裏に記載、その他はデバイスに設定された値を設定します

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555397/917a462b-3786-f606-657f-1857a92351bc.png)

- LPWAN デバイス > プロファイル から、「サービスプロファイルを追加」。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555397/ae98b043-7984-5e88-e9b5-5e61f9dfde3b.png)

- LPWAN デバイス > 送信先 から、「送信先を追加」。デバイスから送信されるデータがこの画面で指定したトピックに送信される

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555397/ec401c37-e9de-28d7-5219-9aefc9a76c85.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555397/d7cc881a-7150-e70b-1cfc-6dc82faee8d7.png)

# デバイスの登録

- LPWAN デバイス > デバイス から、「ワイヤレスデバイスを追加」。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555397/dd334cc5-1773-29f6-a586-70e5816dd49d.png)

接続の確認は以下の画面からできます

- LPWAN デバイス > デバイス から、デバイスの情報で最後のアップリンク受信日時が更新されていること
- デバイスの情報でデバイストラフィックが表示される
- MQTTテストクライアントで、送信先にしていしたトピックをサブスクライブする（以下のような画面）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555397/c0e1fc98-34e3-e774-26df-d1389cb64844.png)

# さいごに

OTAAも試しましたが、今のところうまくいっていません。引き続き、OTAAでの接続を試行したい
【Ruby on rails】Aws::S3::Errors::RequestTimeTooSkewed

# はじめに
プログラミングを勉強して3か月ほどです。
プログラミングスクールを卒業し、現在就職活動をしています。

今回はオリジナルアプリにS3を導入した際に発生したエラーの対処法を共有したいと思います。
下記の記事を参考にさせていただきました。

https://zenn.dev/karaage0703/articles/47838858dd3107

# 今回のエラー内容
今回のエラーはS3導入後に画像を保存しようとした際に発生しました。
エラーの内容は、リクエストを行うクライアントとリクエストを受信するサーバーとの間の時間のズレに問題があることを示します。
[![Image from Gyazo](https://i.gyazo.com/31f3193a16ea29a8075139fadf75fe4a.png)](https://gyazo.com/31f3193a16ea29a8075139fadf75fe4a)
このエラー原因としては大きく2つ挙げられます。
1つ目は、AWS側の地域設定に誤りがあり、時刻がズレてしまっている。
2つ目は、システムの時間が合っていない。
今回は後者に該当したため、その対処法を共有します。

# エラー対処法
まずは、現在の時刻がズレていないか確認します。（ターミナルで実行）
`date`を入力して実行すると、下記のように時間が表示されます。
[![Image from Gyazo](https://i.gyazo.com/ad936530c511e27690145e0c5338637e.png)](https://gyazo.com/ad936530c511e27690145e0c5338637e)

確認後、時刻のズレを修正します。（2023年11月19日18時30分に修正する場合）
`sudo date --set "2023-11-19 18:30:00"`を入力して実行します。
[![Image from Gyazo](https://i.gyazo.com/3fe7459935fad15db5459a7430adb901.png)](https://gyazo.com/3fe7459935fad15db5459a7430adb901)

これで時刻のズレが修正されたので画像の保存ができるはずです。

# 終わりに
今回はS3導入後のエラー対処法について共有させていただきました。
この記事が誰かの役に立てば幸いです。

最後まで読んでいただきありがとうございました！！！
データサイエンス・データサイエンティストとは？

## 0. 投稿の背景
- 私自身は機械学習エンジニアの肩書きで仕事をしているが、同じ会社で働くビジネスサイドの方から、タイトルの質問を直近でいただいた。
- そもそもどうだったかな？と思ったので、考えを整理する傍ら、記事を書くことにした。

## 1. データサイエンスとは？
- [AWSのHP](https://aws.amazon.com/jp/what-is/data-science/)によれば、ビジネスにとって意味のあるインサイトを抽出するためのデータの研究とある。
- 上記は最も一般的で中立的な定義だと思うが、実態としては、仕事において少しでもデータの中身について考えたり、手を加えることがあれば、データサイエンスと見なされている感はある。

## 2. データサイエンティストとは？
- データサイエンスを専門に扱う技術者のことで、統計学、プログラミング、機械学習などのスキルを持ち、データ分析や予測モデルの構築などを行う。
- ただ、こちらもあくまで一般的かつ中立的な定義で、ビジネスの現場では、会社やプロジェクトによって解釈に大きな違いがあると思っている。

## 3. データサイエンティストの実務
- メインは、下記5項目あたりではないか。

    **1. データ収集と前処理**: 
        　データを収集し、必要な形式に整えるための前処理を行う。データベースからのデータ抽出やAPIの利用などが含まれる。

    **2. データ分析と可視化**:
        　収集したデータを分析し、有益な情報やパターンを見つける。統計学の知識を用いた手法やデータ探索技術（データマイニング）を用いてデータを解釈し、可視化することで結果をわかりやすく伝える。
    
    **3. 予測モデルの構築と評価**:
        　機械学習や統計モデルを使用して、将来の予測や意思決定のためのモデルを作成する。その後、作成モデルのパフォーマンスを評価し、フィードバックを行うことでモデルのブラッシュアップを行う。
    
    **4. データベース設計と管理**:
        　データベースの設計や管理、データのセキュリティと品質管理を行う。データの保管、アクセス、バックアップなどの管理業務も含まれる。

    **5. ビジネスインテリジェンスのサポート**: 
        　ビジネス上の課題や要件に基づいて、データ分析や予測モデルの結果をビジネス目標に結び付けるサポートを行う。マーケティング戦略の策定や売上予測など、ビジネスの意思決定をサポートする。

## 4. データサイエンスで用いられる具体的な手法
- データサイエンスの実務でよく使用される手法の例は下記。
- データサイエンティストは、下記手法を適切に組み合わせることで、データから価値ある情報を抽出し、ビジネス上の意思決定や問題解決に活用する。

    **1. 統計分析**:
        　データのパターンや関係性を調査するための統計的手法。具体的な手法としては、回帰分析、t検定、分散分析など。統計分析を用いることで、データの特徴や相関関係を明らかにすることが可能。
    
    **2. 機械学習**:
        　データからパターンや予測モデルを学習するための手法。代表的な手法としては、教師あり学習（回帰、分類）、教師なし学習（クラスタリング、次元削減）、強化学習などがある。機械学習を用いることで、データからの情報抽出や予測モデルの構築が可能。
    
    **3. データマイニング**:
        　大量のデータから有益な情報を抽出するための手法。具体的な手法としては、異常検知、関連ルールの抽出、顧客セグメンテーションなどがある。データマイニングを用いることで、データの隠れたパターンや傾向を見つけ出すことができる。
    
    **4. 予測分析**:
        　過去のデータを元に将来のイベントや現象を予測するための手法。具体的な手法としては、時系列解析、回帰分析、ニューラルネットワークなどがある。予測分析を用いることで、将来のトレンドや需要予測などを行うことができる。

## 5. データサイエンティスト・データ基盤エンジニア・機械学習エンジニアの役割の違い
- タイトルで挙げた職種以外にも類似のものはあるが、ひとまずここでは上記3職種について触れる。
- データ基盤エンジニアは、分析よりもそれを行う前提となるインフラ構築に重きを置き、その基盤を用いてデータサイエンティスト・機械学習エンジニアが分析を行い、その分析結果を基にビジネスサイドに提案を行う。
- データサイエンティストはビジネスサイドとの関わりも含め、データ分析全般について広く携わるのに対し、機械学習エンジニアは機械学習のモデリングにより特化した業務に携わる。
    - **データサイエンティスト**:
        　データを分析し、洞察を得るための統計的手法や機械学習アルゴリズムを利用する。
    - **データ基盤エンジニア**:
        　データ基盤を構築し、データの収集、保存、処理、管理を担当する。
    - **機械学習エンジニア**:
        　機械学習アルゴリズムの設計、モデルのトレーニングと評価、実装を行う。

|職種|業務内容|
|---|-------|
|データサイエンティスト|・データ収集と前処理<br>・データ分析と可視化<br>・予測モデルの構築と評価<br>・データベース設計と管理<br>・ビジネスインテリジェンスのサポート|
|データ基盤エンジニア|・データ基盤の設計と構築<br>・データフローの管理と最適化<br>・データのセキュリティと品質管理<br>・スケーラビリティとパフォーマンスの最適化|
|機械学習エンジニア|・機械学習モデルの設計と開発<br>・モデルの評価と改善<br>・モデルのデプロイと運用

## 最後に
　なるべく誤りや偏りのない情報発信を心掛けていますが、私自身、社会人になってから学び始めた身ですので、齟齬がある場合はぜひとも指摘をお願いしたいです。
Netrwで現在のディレクトリを変更する方法

https://pc.oreda.net/software/filer/netrw

とか、

https://hagure-beans.hatenablog.com/entry/20100603/1275591475#f1

を読ませてもらいながら、netrwを練習していたが、cコマンドがうまく動かなかった。　netrwが古いものであまりうまいこと動かないことがあるなどの記事があるため、しょうがないのかなと思っていたが、

:help netrw-cd

で調べると

``
 netrw-cd : このマップ名は "c" から cd に変更されました (netrw-cd を参照)。
               この変更は netrw-cb および netrw-cB を使えるようにするためのもの
               です。
``

というふうに、変更されたらしい。

やってみたがうまくいかない。

.vimrcを書き換えて、netrwとterminalのカレントディレクトリが一致する記述も入れてみたがうまくいかない。
ペアの数値の入った表を罫線入りで出力 (paizaランク C 相当)

今回の問題はこれ
https://paiza.jp/works/mondai/stdout_primer/stdout_primer__specific_format_step4

自然数 H, W, A, B が与えられるので
ヨコW行、縦H行の(A,B)を " | " で区切ることという問題。

```
2 3 7 8なら

(7, 8) | (7, 8) | (7, 8)
========================
(7, 8) | (7, 8) | (7, 8)
```
というふうに出力する

まずは１行目を出力してみる

```py
Arr = input().split()
H = int(Arr[0])
W = int(Arr[1])
A = int(Arr[2])
B = int(Arr[3]) 

for i in range(1,W+1):
    if i != W:
        print(f"({A}, {B})",end=" | ")
    else:
        print(f"({A}, {B})")

```
次にH行分出力

```py
Arr = input().split()
H = int(Arr[0])
W = int(Arr[1])
A = int(Arr[2])
B = int(Arr[3]) 

for j in range(1,H+1):
    for i in range(1,W+1):
        if i != W:
            print(f"({A}, {B})",end=" | ")
        else:
            print(f"({A}, {B})")

```
次に縦の罫線を引く方法だが九九と同じ考え方で
(A, B)　＝　６文字（間は,と半スペで２文字）
 | 　＝３文字
あわせて９文字
それをW-1分繰り返し、最後は（A, B)だけなので６文字だから
count = 9 * (W -1) + 6
これを＝でかければOK

```py
Arr = input().split()
H = int(Arr[0])
W = int(Arr[1])
A = int(Arr[2])
B = int(Arr[3]) 

for j in range(1,H+1):
    for i in range(1,W+1):
        if i != W:
            print(f"({A}, {B})",end=" | ")
        else:
            print(f"({A}, {B})")
    if j < H:
        count = 9 * (W -1) + 6
        print(f"{'='*count}")

```
一発合格でした。
Flask-Migration時にアプリケーションファイルとモデリングファイルを分けたい

## Migrationを実施する際にモデルファイルを分けたい。

ディレクトリ階層

```terminal
.
├── app.py
├── models.py
```

この場合、SQLAlchemyインスタンス化をmodel.pyで記載し、そのインスタンスを各モデルClassに継承する。

例えば下記の通り。

```python
# model.py

from flask_sqlalchemy import SQLAlchemy

# ここに記載
db = SQLAlchemy()


class Todo(db.Model):
    __tablename__: str = "todo"

    id = db.Column(db.Integer, primary_key=True)
    title = db.Column(db.String(255), nullable=False)
    description = db.Column(db.String(1000))
    completed = db.Column(db.Boolean, default=False)

    def __init__(self, title, description, completed) -> None:
        self.title = title
        self.description = description
        self.completed = completed

    def __str__(self) -> str:
        return f"title={self.title},description={self.description},completed={self.completed}"
```

こうすることでトップ層でアプリケーションを実行するファイルと分割し、DBモデリングを別のファイルで実施することができ、管理が簡単となる。

あとはapp.pyでdbインスタンスを呼び出し、初期化・マイグレーションをしてあげればDatabaseを作成できる。

```python
# app.py

from flask import Flask
from flask_migrate import Migrate
from models import db

app = Flask(__name__)

# database定義に必要な設定
app.config["SQLALCHEMY_DATABASE_URI"] = "sqlite:///app.sqlite3"
app.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = False

# 初期化、マイグレーション
db.init_app(app)
migrate = Migrate(app, db)


if __name__ == "__main__":
    app.run(debug=True, port=8080)
```

あとは下記コマンドを打ち込むだけ。(.flaskenvにapp.pyの登録必須。)

```terminal
flask db init

flask db migrate

flask db upgrade
```
JetpackComposeでCheckboxの色を変更する方法

JetpackComposeでCheckboxの色を変更する方法です。

Checkboxを使用する機会があったので、共有しようと思います。

# サンプルコードはこちら
```CheckboxSample.kt
@Composable
fun CheckboxSample() {
    val checked = remember { mutableStateOf(true) }
    Checkbox(
        modifier = Modifier
            .size(24.dp),
        checked = checked.value,
        onCheckedChange = { checked.value = it },
        colors = getCheckboxColors()
    )
}

/**
 *　チェックボックスの色指定
 */
@Composable
private fun getCheckboxColors(): CheckboxColors {
    return object: CheckboxColors {
        @SuppressLint("UnrememberedMutableState")
        @Composable
        override fun borderColor(enabled: Boolean, state: ToggleableState): State<Color> {
            return mutableStateOf(colorResource(id = R.color.black))
        }

        @SuppressLint("UnrememberedMutableState")
        @Composable
        override fun boxColor(enabled: Boolean, state: ToggleableState): State<Color> {
            return mutableStateOf(colorResource(id = R.color.white))
        }

        @SuppressLint("UnrememberedMutableState")
        @Composable
        override fun checkmarkColor(state: ToggleableState): State<Color> {
            return mutableStateOf(colorResource(id = R.color.black))
        }
    }
}
```

`CheckboxColors`というのがあるので、こちらを設定していきます。
こちらで設定できるのは枠の色、チェックの色、枠の中の色です。
ONの状態とOFFの状態で色を変更したい場合は`ToggleableState`でON状態かOFF状態か判定できます。
今回はシンプルな白と黒のみで作成しました。
お好みで色を変えてみてください。

![スクリーンショット 2023-11-19 18.07.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274615/15726567-ddc8-08a0-d96d-9cd4b9c1fc04.png)
Laravelのメンテナンスモード

Laravelのメンテナンスモードの使い方。
```
php artisan down --secret="hogehoge"
```

こうすれば、https://****/hogehogeにアクセスして、secretキーを知っている人は普通に使える。知らない人は使えない。

メンテナンスモードから復旧するには
```
php artisan up
```
九九表を罫線入りで出力

今回はこの問題。今までの集大成に入った感じがする
- 九九表を、横の数値間では | (半角スペース 2 つとバーティカルライン)、縦の数値間では = で区切って出力
- 数値を出力する際は 2 けたになるよう半角スペース埋めで出力
- 縦の数値間で = を出力する際は、その上の行と文字数が等しくなるように出力


まずは九九表を罫線なしで出力してみる
```py
for i in range(1,9+1):
    for j in range(1,9+1):
        if j != 9:
            print(i * j, end=" ")
        else:
            print(i * j)
```
ひとまずここまではできた
次に、ヨコの数値間は、普通にendのほうに、` | `に変えればいいはず
そして数字は2桁になるように半スペ梅でやる必要があるので
```py
for i in range(1,9+1):
    for j in range(1,9+1):
        if j != 9:
            print(f"{i * j:>2}", end=" | ")
        else:
            print(f"{i * j:>2}")
```

ここまでは予定通り。次の問題は縦の数値間で`=`を出力するにはどうするかだが
必ず数字は半スペ含めて必ず2桁、そして半スペ＋|+半スペで、5文字分なので
それをj-1分繰り返し、最後の９は二桁だけで２文字なので、
5x(j-1)+２ 文字分を＝出力すればよいので改行したあとにprintする
そして＝＝＝は最後はやらないので場合分けをしておく


```py
for i in range(1,9+1):
    for j in range(1,9+1):
        if j != 9:
            print(f"{i * j:>2}", end=" | ")
        else:
            print(f"{i * j:>2}")
            if i != 9:
                count = 5 * (j - 1) + 2
                print(f"{'=' * count}")
```
これで正解しました
最後のif（＝をひくやつ）は、ロジック的に下の方が良いかもしれないです
（indentを２つあげる。）
```py
for i in range(1,9+1):
    for j in range(1,9+1):
        if j != 9:
            print(f"{i * j:>2}", end=" | ")
        else:
            print(f"{i * j:>2}")
    if i != 9:
        count = 5 * (j - 1) + 2
        print(f"{'=' * count}")
```
Google ColabでGoogle Drive内のCSVファイルのパスを確認する方法

Google ColabでGoogle Drive内のCSVファイルのパスを確認する方法は以下の通りです:

1. まず、Google Driveをマウントします。以下のコードを実行してください:

```python
from google.colab import drive
drive.mount('/content/drive')
```

2. 次に、左側のパネルで「ファイル」タブをクリックします。これにより、ファイルエクスプローラが表示されます。

3. 「drive」→「My Drive」を開き、目的のCSVファイルが保存されているフォルダまで移動します。

4. ファイルを右クリックし、「パスをコピー」を選択します。これにより、ファイルのパスがクリップボードにコピーされます。

5. コピーしたパスを、Pythonの文字列としてコードセルに貼り付けます。例えば:

```python
file_path = '/content/drive/My Drive/folder/myfile.csv'
```

以上の手順で、Google Drive内のCSVファイルのパスを取得し、それをGoogle Colabで使用することができます¹³。このパスは、pandasの`read_csv()`関数などで使用できます。ただし、Google Driveのファイルはセッションが終了するとアクセスできなくなるため、毎回パスを取得する必要があります。また、Googleアカウントへのアクセスを許可する必要がありますので、指示に従ってください。
VSCodeとCursor両方のエディタをインストールした時のトラブル (Windows版：CursorはOSSのVSCodeをforkしてAIを追加したエディタ)

原因は、アプリインストール時におけるWindowsの環境変数の優先順位設定に問題がありました。
なので、その優先順位を変えれば解決します。



# 以下詳細。

Macでの問題解決は↓こちらを参考にしてください。

[備忘録]Cursorで間違ってcodeコマンドをinstallしちゃった時の話 #VSCode - Qiita

https://qiita.com/Kazu634/items/28c3f87e91cf52a940c0

↓Windows版での問題解決方法

# 問題
VSCode を使っていて、Cursorも同時に使おうとインストールをしました。
そして、VSCodeエディタを使っている時に VSCode の別ウィンドウを開きたいと思って Terminalで `code .` コマンドを実行したが Cursor のウィンドウが開いてしまう。

※ `code .` コマンドはVSCodeの新しいウィンドウを開くコマンドです。
ただし、このコマンドはすでにウィンドウが開いている場所で実行しても、新しいウィンドウは開きません。



# 問題の再現手順

VSCodeをインストール後に Cursor をインストールをする、という順番で実行をします。

両方をインストール後に VSCode のTerminalで `code .` を実行すると Cursorエディタが立ち上がります。



# 原因
Windowsの環境変数の優先順位に問題がありました。
"Code" はVSCodeから派生したアプリケーションで、その実行ファイルが"code"と重複していました。これが原因で、環境変数の優先順位に問題が生じていました。
(Cursor側は VSCodeをインストールしていなくてもcode コマンドを実行できるようにサポートしていたつもりだったと思います。)



# 解決策

パスの優先度を変えれば解決します。

Windowsでシステムのプロパティから環境変数を開きます。
そこでパスの優先順位を変更します。

(もしくは、VSCodeとCursorのどちらかをアンインストールします。(強引))

## デフォルトのインストール先

### VSCodeのインストール先の環境変数
＊＊＊のユーザー環境変数
`C:\Users\(userName)\AppData\Local\Programs\Microsoft VS Code\bin`



### Cursorのインストール先の環境変数
システム環境変数
`c:\Users\(userName)\AppData\Local\Programs\cursor\resources\app\bin`

実行ファイル名が被っているので優先順位を変えれば問題は解決できます。



Windowsでの優先順位はシステム＞＞ユーザー
Cursorはシステムの方にパスが設定されているので、
VSCodeのパス設定をシステム環境変数の中のCursorで設定してある場所よりも上位に持ってくれば良いことになります。

※設定パスは移動ではなくコピーにしたほうがいいと思います。



# その他

Cursor で 新しいCursorウィンドウを開きたい時は
`code` ではなくて `cursor`で立ち上がります。

Cursorから `code .` を実行するとVSCodeの新しいウィンドウが立ち上がってしまいます。

※同じ場所で実行しても、新しくウィンドウは開きません。



# 終わりに

Windos版ではMac版での解決方法が使えなかったので調べてみました。
また、この解決方法が最適ではないことは確かです。
Cursorからは `code .` を実行すると VSCodeが立ち上がってしまいます。
アンインストール時等にトラブルになる可能性があります。
Gradleのコマンドが実行できない

プログラミング初学者です。
Gradleのインストールにつまずいたので、備忘録を共有します。

## 対象の読者
Gradleをインストールしたはずが、コマンドの実行がうまくいかない
Gradleの環境変数の設定が分からない

## 発生した問題

正しく環境変数を設定したはずなのに、コマンドプロンプトでGradleコマンドを実行するとエラーが出ました。

## 環境変数設定の際参考にした記事

https://qiita.com/quwahara/items/9c4e5fbda421cfcb09ad

この通りに設定したはずで、誤字脱字もありませんでした。

## エラーメッセージ
```
Error opening zip file or JAR manifest missing: C:\gradle-8.2.1/lib/agents/gradle-instrumentation-agent-8.2.1.jar
Error occurred during initialization of VM
agent library failed to init: instrument
```
## 原因
**参照しに行ったディレクトリが存在しなかった**
C:\\gradle-8.2.1/lib/agentsディレクトリにgradle-instrumentation-agent-8.2.1.jarというjarファイルがないことが原因と、エラーメッセージを見ると読み取れます。

## 解決のためにやったこと
**①ディレクトリの存在を確認**
エラーメッセージに出たパスをもとにlibディレクトリの直下を見に行きましたがagentsディレクトリが存在しませんでした...
(なぜなのかはわからない。展開途中で中断でもしてしまったのか...)

**②再度`gradle-8.2.1-bin.zip`をダウンロードして展開**
ダウンロードしたzipを展開し直し中身を確認したらagentディレクトリが存在し、jarファイルもありました。

**③環境変数の設定を再度確認し、cmdでgradleコマンドを打ってみる**

```
Welcome to Gradle 8.2.1!
```

キターーー！解決です。
何はともあれGradleが使えるようになりそうで、よかったです。
Cloudinaryを使用し画像をアップロードした際に出てきた⚠️

[![Image from Gyazo](https://i.gyazo.com/57290ade50e032a6c71fc37d9da80362.png)](https://gyazo.com/57290ade50e032a6c71fc37d9da80362)
[![Image from Gyazo](https://i.gyazo.com/4374e5eebd3e620466b7dfe9e67b0983.png)](https://gyazo.com/4374e5eebd3e620466b7dfe9e67b0983)
この警告は「混合コンテンツ」と呼ばれるもので、HTTPSページがHTTPリソースを読み込んでいることを示しているそうです。ブラウザはこのような状況でセキュリティの観点から警告を発していました。

## 原因
cloudinaryからの画像がHTTPでリクエストされていることが問題でした。



```ruby:cloudinary.yml
---
development:
  cloud_name: <%= ENV['CLOUDINARY_CLOUD_NAME'] %>
  api_key: <%= ENV["CLOUDINARY_API_KEY"] %>
  api_secret: <%= ENV["CLOUDINARY_API_SECRET"] %>
  enhance_image_tag: true
  static_file_support: false
production:
  cloud_name: <%= ENV['CLOUDINARY_CLOUD_NAME'] %>
  api_key: <%= ENV["CLOUDINARY_API_KEY"] %>
  api_secret: <%= ENV["CLOUDINARY_API_SECRET"] %>
  enhance_image_tag: true
  static_file_support: true
  secure: true     #ここを追加
test:
  cloud_name: <%= ENV['CLOUDINARY_CLOUD_NAME'] %>
  api_key: '<%= ENV["CLOUDINARY_API_KEY"] %>'
  api_secret: <%= ENV["CLOUDINARY_API_SECRET"] %>
  enhance_image_tag: true
  static_file_support: false
```

これで⚠️は出なくなりました！

### 参考
[![Image from Gyazo](https://i.gyazo.com/d80259eda862c211fb72a88945ea19df.png)](https://gyazo.com/d80259eda862c211fb72a88945ea19df)
↑↑↑
https://cloudinary.com/documentation/ruby_rails_quickstart
lumeで作成したサイトにBasic認証をかける

- 静的サイトジェネレータとしてDeno製の[lume](https://lume.land/)を利用しています。
- Deno製なので設定ファイル数が少なく高速に動作するので重宝しています。
- 今回はlumeでBasic認証をかける方法を記録いたします。

## 環境
- macOS 13.5.2
- deno 1.38.2

## 準備
- 以下でlumeプロジェクトを用意します。
    - **※用意済みであれば次のステップに進みます。**

```shell
# ディレクトリ作成&移動
mkdir hoge
cd hoge

# lumeプロジェクト作成
deno run -Ar https://deno.land/x/lume/init.ts

# indexページ作成
touch index.md
echo "# こんにちは" > index.md

# 開発サーバー起動
# localhost:3000で確認
deno task serve
```

![image](https://github-production-user-asset-6210df.s3.amazonaws.com/44114228/284044981-930370bf-aedf-4b5f-9797-44053eb6f1dc.png)

## サーバー設定
- lumeにはデフォルトとは別にサーバー設定を[カスタマイズすること](https://lume.land/docs/core/server/)が可能です。
- まずルートディレクトリに`server.ts`ファイルを作成します。

```shell
touch server.ts
```

- 中身を以下にします。

```typescript
import Server from "https:/deno.land/x/lume/core/server.ts";

const PORT = 8000;
const server = new Server({
  port: 8000,
  root: `${Deno.cwd()}/_site`,
});

server.start();

console.log(`Listening on http://localhost:${PORT}`);
```

- 編集後、以下のコマンドで起動して別ポートで表示できることを確認します。
    - **※こちらはホットリロードはしないので、開発時は`deno task serve`を利用するのが便利です。**

```
deno run --allow-net --allow-read server.ts
```

- 次にBasic認証の設定を追加します。
- lumeではBasic認証は[middleware](https://deno.land/x/lume@v1.19.3/middlewares/basic_auth.ts)として実装されているので、こちらを利用します。
- `server.ts`の中身を以下に変更します。

```typescript
import Server from "https:/deno.land/x/lume/core/server.ts";

// 追記
import basicAuth from "https:/deno.land/x/lume/middlewares/basic_auth.ts";
import "https://deno.land/std@0.207.0/dotenv/load.ts";

const PORT = 8000;
const server = new Server({
  port: 8000,
  root: `${Deno.cwd()}/_site`,
});

// 追記
const username = Deno.env.get("USERNAME") ?? "";
const password = Deno.env.get("PASSWORD") ?? "";
if (!username && !password) {
  throw new Error("not env USERNAME or PASSWORD");
}

// 追記
server.use(basicAuth({
  users: {
    [username]: password,
  },
}));

server.start();

console.log(`Listening on http://localhost:${PORT}`);
```

- 変更後、環境変数設定として`.env`ファイルを作成します。
    - **※開発時は`.env`ファイル、本番にあげるときは対象のホスティングサービス(例: Deno Deploy)の環境変数を利用するようにしましょう。**

```shell
touch .env
```

- 中身を以下にします。

```conf
USERNAME=user1
PASSWORD=hogehoge
```

- 編集後、再度以下のコマンドで起動してBasic認証がかかっていることを確認します。

```shell
deno run --allow-net --allow-read --allow-env server.ts
```

![image](https://github.com/Kamekure-Maisuke/Kamekure-Maisuke/assets/44114228/9b6ed836-8602-4f14-b3fb-4a52825ebff3)

![image](https://github-production-user-asset-6210df.s3.amazonaws.com/44114228/284044981-930370bf-aedf-4b5f-9797-44053eb6f1dc.png)

- 以上です。

## 参考
- https://lume.land
- https://lume.land/docs/core/server
- https://lume.land/docs/core/server/#basic_auth
爆誕！童心をくすぐる！ポケモン図鑑！

## はじめに
昔、ゲームの攻略本とかで武器や防具、アイテムが一覧で載っているページってワクワクしませんでしたか？
今回、下記記事で[「Poke API」](https://pokeapi.co/)という存在を知りまして、触ってみようと思い`React`、`TypeScript`でポケモン図鑑を制作しました。

https://qiita.com/hato_code/items/e75f215ef2d5191341dc

この記事からコードの一部を参考及びファイルを拝借（ポケモン名の和訳jsonファイル）させていただきました。

:::note info
2023/11/24 追加更新
和訳ファイルを使用せず、APIデータからポケモンの和名を直接取得・反映させるようにしました。
ピカチュウって今、こんなに色々なバリエーションあるんですね……。

![スクリーンショット 2023-11-24 175650.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3368730/dd627786-9c98-a507-92eb-1e2a4173d294.png)
:::

## 作ったもの
https://pokeview-pi.vercel.app/

![254aef95e2d6ff58f5ce88c980716aa4.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3368730/cc14854c-e8dd-adf5-38cf-6be3139f87a8.gif)
~~※画質悪し。~~ @hato_code さんにご教授いただいた動画キャプチャーサービス[Gyazo](https://gyazo.com)を利用して再アップしました。

各ポケモンを選択すると以下のように詳細情報が確認できます。
カラカラの紹介文……切なすぎますね泣。幸せになってくれ泣。
![スクリーンショット 2023-11-19 113819.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3368730/e2faa725-4107-3da4-8992-f0487e716783.png)

## こだわり
- 1：ポケモンが動く
筆者が幼き頃、ポケモンで遊んでいて衝撃を受けたのが**ポケモンが動いている**ことでした。確かクリスタル？とかから動くようになった記憶が……あまり話過ぎると年齢がバレそうですね（まぁバレても何の問題もないのですが）。
今回「童心をくすぐる」ということなので、ポケモンたちには動いてもらうことにしました。結構ノスタルジックな思いになりましたが、これはまさしく自己満仕様です。
![45d72efbd96e315772ab9e4726d09170.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3368730/1e2fbf51-1a2a-85ff-b634-381816ac3f9a.gif)
~~※画質悪し。~~ @hato_code さんにご教授いただいた動画キャプチャーサービス[Gyazo](https://gyazo.com)を利用して再アップしました。

ついでの説明になりますが、図鑑なので検索機能も設けました。上記はルギアを検索したところですね。<font color="lightgray">タイトルも「爆誕」ですし……</font>

- 2：背景画像のランダム表示
これも昔、ポケモンをポケモンセンターに預けてボックス（でしたかね？）で確認する時「確かポケモンが並んでいた背景画像が随時切り替わっていたような……」という記憶から実装することを決意。
スマートフォン閲覧時は全く分かりませんが（笑）、ページ遷移するたびに背景画像がランダム表示される仕組みになっています。もちろんこれも自己満仕様です。

ちなみに、これらの背景画像は Bing の[`Image Creator`](https://www.bing.com/create)に生成してもらいました。

![スクリーンショット 2023-11-16 160017.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3368730/466c1f06-3056-3d43-b34e-e5137ce832f1.png)
![スクリーンショット 2023-11-15 204322.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3368730/5750191b-4b1d-a9e4-1865-01897654a883.png)

<font color="lightgray">ピカチュウとかむっちゃピカチュウなんですけど良いんでしょうかね？
</font>

:::note info
話が逸れるので深入りしませんが、「Image Creator」には DALL・E 3 が使用されていています。OpenAI の ChatGPT と違って商用利用不可になっているのでご注意ください。
:::

https://forest.watch.impress.co.jp/docs/serial/yajiuma/1543573.html

- 3：モンスターボールを使ったインタラクション
ページ送り時にモンスターボールが「うにょっ」と動くのが個人的にお気に入りです！
![pokeView.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3368730/cb3a27ce-4cb5-2069-1d4d-27dca74c44b6.gif)

- 4：自作のページネーション（ページ送り）機能
以前自分が作ったサイト（不動産取引情報取得サイト）から応用できるのでは？と思い、その機能を持ってきました。
`React`はコンポーネントベースなので融通が効いていいですね！

https://qiita.com/benjuwan/items/4a3207fb9fc5fddba9d4

## さいごに
今回制作したポケモン図鑑の`GitHub`を載せておきます。
気になる方は自由にダウンロードしてご使用ください。

https://github.com/Benjuwan/pokeView

ここまで読んでいただいて、ありがとうございました！
JavaScriptの非同期処理について

### はじめに

個人開発メモ📝
なんとなく知っているけどしっかり理解できていなかったので、備忘録として残します。

### 非同期処理が誕生した簡単な歴史

例えば、あるショッピングサイトを閲覧する際にそのサイトを表示するには、
▪️商品データや諸々必要データをバックエンドに取りに行く
　↓
▪️ビューに反映させる
こんな流れだが、「商品データや諸々必要データをバックエンドに取りに行く」この処理を待っている間、ビューは反映されない。
つまりその間ユーザーを待たせてしまう＝　表示速度が遅く、ユーザーが離れる　といった課題が生まれた。
その課題を解決すべく、考案されたのが、「先にビューだけ反映させて、商品データが取得できたら表示しているビューに当てはめる」といった非同期処理の挙動である。

参考サイト⇨https://www.youtube.com/watch?v=kbKIENQKuxQ

### 非同期処理の様々な課題

上記の非同期処理を実施するため、コールバック関数を使用して毎秒毎に表示させる処理を発明したが、
![スクリーンショット 2023-11-19 16.26.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3513569/eaf8167c-6f47-5923-97be-2f1ee9347ab9.png)
このように、ネストが深くなり読みづらくなってしまった。

この課題の対策として次に誕生したのが、「Promise」である。
![スクリーンショット 2023-11-19 17.04.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3513569/5e242d6a-0d57-2dae-252c-fac4d887dd2c.png)
.thenで繋げることにより、上記のネストの状態よりは分かりやすくなるが、読みにくさは残ってしまう...

読みにくさを解決し、シンプルにしたものが、「async/await」である。
```js
const handleInputSubmit = async (event) => {
    event.preventDefault();
    // csrfトークン取得
    const csrfToken = document.querySelector('meta[name="csrf-token"]').getAttribute('content');
    // responseに、バックエンドからのレスポンスが代入される
    const response = await postFormData({
      csrfToken,
      data: scheduleFormData,
    });
    if (response != null) {
      console.log('渡ってきたデータ：', response);
      await passToResponseData(response);
    } else {
      console.log('データがありません');
    }
  };
```
handleInputSubmit()を裏側で動かし、postFormDataが実行され結果が代入されたら、if文の処理にうつる。awaitを書かないと、postFormDataの処理を待たずに次のif文の判定が行われるため「データがありません」と返ってきてしまう。

参考サイト⇨ https://www.youtube.com/watch?v=Vhnz1V-v1cU

ざっと書きましたが、都度更新していきます。
2OS授業解説: C++入門

# はじめに
この記事は, 同じ学科の2年生向けに書かれたものです.
掲載されているコードなどは, 2023年度の授業スライドに基づいています.

また, 授業後の復習以降, 全く手を加えていないため,
「もっと上手く書けるんじゃないの..?」等あるかと思いますが,
ご了承ください🙏



# リンク集
OS2年　第1回

https://qiita.com/tusoscocoa/private/c91bf047d2b4b0d10dad

OS2年　第2回

https://qiita.com/tusoscocoa/private/93d8703556641fee29fa

OS2年　第3回

https://qiita.com/tusoscocoa/private/6bf14bb315ce62aeb307

OS2年　第4回

https://qiita.com/tusoscocoa/private/addcfff9377e00fdec27

OS2年　第5回

https://qiita.com/tusoscocoa/private/13317195e5a01b407dbe

OS2年　第6回

https://qiita.com/tusoscocoa/private/b16107926d957333dd59

OS2年　第7・8回

https://qiita.com/tusoscocoa/private/de50947e1dbcd04e8fd9

OS2年　第9回

https://qiita.com/tusoscocoa/private/94461081500ee296394a

OS2年　第10回

https://qiita.com/tusoscocoa/private/f9594d2ad6e69026c97a

OS2年　第11回

https://qiita.com/tusoscocoa/private/7aa9f6fdfa1435552527

OS2年　第12回

https://qiita.com/tusoscocoa/private/bf8788916107a43400ab
rex0220 計算式プラグインの使い方をGPTsに学習させてみる（その１２）Error saving draft

[rex0220 計算式プラグインの使い方をGPTsに学習させてみる（その１１）チェックボックスの処理を学習](https://qiita.com/rex0220/items/efa8f4a7891a14f553e3)の続きです。

学習テキストそアップロードすると、Error saving draft のエラーが発生。
アップロードするファイル数に制限があるのかも？

# 概要

ユーザー情報関連のテキストをアップロードすると、Error saving draft のエラーが発生した。
ユーザー情報関連のテキストを削除すると、エラーが解消される。
テキストの中身を他のテキスト「文字列計算について.txt」にコピペして、アップロードすると問題なく処理されるので、内容は問題ないと思われる。
とりあえず、ファイル数を増やさないことで対応する。

![2023-11-19_16h59_18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/81d0f056-dbaa-c714-4400-0f6c2fe0f595.png)

# ユーザー情報関連のテキスト

ユーザー情報関連のテキストの内容

```ユーザー情報について.txt
ユーザー情報について

・ログイン中のユーザー名を取得
LOGIN_CODE()    // ログイン中のユーザー名を取得

・ログイン中のユーザーコードを取得
LOGIN_CODE()    // ログインユーザーのユーザーコードを取得

・ログイン中ユーザーのEメールを取得
LOGIN_EMAIL()    // ログイン中ユーザーのEメールを取得

・ユーザー選択項目のユーザーコードを取得
SEL_CODE(ユーザー選択,"array")  // ユーザー選択項目からユーザーコードを配列で取得
ARRAY_COUNT(SEL_CODE(ユーザー選択,"array")) // ユーザー選択項目に指定されているユーザ数を取得
SEL_CODE(ユーザー選択,"text")  // ユーザー選択項目からユーザーコードをカンマ区切りの文字列で取得

・ユーザー選択項目のユーザー名を取得
SEL_NAME(ユーザー選択,"array")  // ユーザー選択項目からユーザー名を配列で取得
SEL_NAME(ユーザー選択,"text")  // ユーザー選択項目からユーザー名をカンマ区切りの文字列で取得

・ユーザー選択項目にユーザーをセット
SET_CODE(SEL_CODE(ユーザー選択1,"array"))   // ユーザー選択項目に、ユーザー選択1のユーザーコードをセット
SET_CODE(LOGIN_CODE())  // ユーザー選択項目に、ログインユーザーをセット

・文字列計算におけるユーザー選択項目は、カンマと半角スペース区切りのユーザー名となる
ユーザー選択項目に、"user1", "user2" が設定されている場合、"user1, user2"
"ユーザー名：" & ユーザー選択1 -> "ユーザー名：user1, user2"
```

# アップロード後の configre

Error saving draft のエラーが発生しない。

![2023-11-19_17h15_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/3cfd6b3b-f5e1-bba2-2ee5-cdaf254b44bb.png)
機械学習入門③重回帰分析を学ぼう

# はじめに

ひつじ橋です🐑

今回は, 

<font color = "Blue">重回帰分析</font>を扱います.


# 重回帰分析とは？
・・・ある結果（<font color = "Red">目的変数</font>）を説明したい.

そのとき, 
「複数の要因（<font color = "Red">説明変数</font>）のうち, どの変数がどの程度, 結果に関わっているか」

を関数を用いて数値化, 両者の関係を表す.

それを元にして, 将来の予測を行う手法をいいます.

##### WORD
🌟<font color = "Red">単回帰分析</font> ・・・ 1つの要因から結果を予測すること.

## ①重回帰分析の強み
### 1. データに基づくので説得力がある
実際の分析結果をもとに予測するので, 根拠を数値で示すことができます.

### 2. 未来の予測ができる
計画上の数値を当てはめれば, <font color = "Blue">将来の見通しを立てる</font>ことができます.

### 3. 実用性が高い
<font color = "Blue">現実の問題には, 複数の原因が絡んでいる</font>ことが多いです.
その際に, 重回帰分析が役立ちます.

## ②重回帰分析の弱み
### 1. 計算が複雑
<font color = "Red">重回帰式</font>を立てる必要があるため, Excelや専用のソフトウェアの利用を考えます.
(別の記事を書きます)

### 2. 剰余変数が紛れることも
<font color = "Red">剰余変数</font>(説明変数ではないが, 結果の原因となりかねない要素)の影響を受けかねないという点です.

### 3. 多重共線性の発生のおそれ
「説明変数と目的変数の相関をみたい」わけですが,<font color = "Blue"> 「説明変数同士に相関がある」ケースも</font>考えられます.

##### (参考)

https://www.intra-mart.jp/im-press/useful/multi-regression_analysis


## ③活用できる場面
ビジネスでは, 主に

・説明変数から結果を予測する
・各説明変数がどのくらい目的変数に影響しているかを計る

場面で用いられるそう.

重回帰分析は, 前者のように, <font color = "Blue">既存データが無かったり少なかったりするとき</font>にも活躍します.

一方, 実際には

各要素の影響度を測るマーケティングリサーチの一環

として, 後者の目的で用いられます.

##### (参考: 例あり)

https://gmo-research.jp/research-column/multiple-regression-analysis

## ④Pythonで実装してみた

以下GitHubに置いてあります🔽

https://github.com/letstocotocoproject/Data_analysis_practice

# おわりに
今回は, 重回帰分析の概要をまとめました.

これから授業で習うようで, ちょっと楽しみだったりもします!
addEventListener('resize')をレスポンシブ対応で使うときの注意

この記事は [ここのえ Advent Calendar 2023](https://qiita.com/advent-calendar/2023/99no_exit) Day 21 の記事です。

# 超忙しい人向けの要約

Resizeイベントは `height`がガンガン変わるので `width` を見ておいた方がよい

# ブラウジングしているだけでResizeイベントが走る？

今回はJavascriptのレスポンシブ対応に関するちょっとしたTipsです。

レスポンシブ対応などの関係で、ブラウザのサイズが変更された際にアニメーションを再発生させる、といった何かしらの処理を行うことがあります。そんな時に`addEventLisnter`で`resize`のイベントを取り扱います。

```sample.js
window.addEventListener('resize', () => {
  console.log("on resize")
})
```

開発環境にiPhoneで接続し、Safariで開きます。iPhone上ではコンソールを確認できないので、Macbook側からWebインスペクタを確認してみましょう。

![スクリーンショット 2023-11-19 16.33.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3617021/ef04469a-2625-2e16-01b9-76875b7bff8b.png)

おや？スマホを横画面にしたりせず、ただページを見ていただけなのに何故かResizeイベントが大量に発生しています……　~~何もしてないのに壊れちゃった……~~

# メニューバーにはご用心

結論から言うと、犯人はこれです。

![名称未設定 1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3617021/4f6b3864-ecc2-8e4d-494c-3c8a5a5322ee.png)

`Safari`でも`Chrome`でも同様の事が言えますが、上下方向にスクロールした際に下のメニューバーが出たり入ったりします。

これが動くとブラウザの表示領域が変わるので、**heightがResizeされ、イベントが発生します**。

<br/>
シンプルな対策として、ビューポートの`width`を保持しておき、Resizeイベントの発生時に幅が変更されているか確認することで、不要なコールバック処理が起きないようにします。

```js
let w = window.innerWidth

window.addEventListener('resize', () => {
  if (w === window.innerWidth) return
  w = window.innerWidth
  
  // callback

})
```

大抵レスポンシブへの対応で問題になるのは、ブラウザの横幅が変わった時なので、これだけやっておけば9割9分問題は解決できると思います。

特にアニメーションを発火させる場合や、DOMを一気に張り替えるような場合はコールバックが肥大化する場合もあるので、これをやっておくとある程度パフォーマンスの改善に繋がると思います。

この問題の厄介な点として、ChromeのDevToolsなどを使ってPCでレスポンシブ対応をしている場合、当然メニューバーは存在しないので、実機テストしたら変な挙動が…という事になりがちです。

別界隈からWebフロントに転向すると結構引っかかりがちな問題だと思うので、困ったらぜひ試してみてください。
文字列と N 個の整数の出力 Python3編

次はこれ
https://paiza.jp/works/mondai/stdout_primer/stdout_primer__specific_format_step2
文字列中に指定された整数を埋め込み、出力するという問題

間違ってないはずだったが間違っていたので調べてみると、
（）と（）の間はコンマだけだと思ってたら半スペも入ってたから。

```py
Arr = input().split()
N = int(Arr[0])
A = int(Arr[1])
B = int(Arr[2])
for i in range(1,N+1):
    if i != N:
        print(f"({A}, {B})",end=", ")
    else:
        print(f"({A}, {B})")

```
MF2023 Event Stormingワークショップに参加しました

## この記事について

Modeling Forum 2023のEvent Stormingワークショップに参加したことについての記事です。ワークショップの学びを整理する流れで、参加した動機やきっかけ、感想などがざっくばらんに記事にしました。

:::note warn
この記事でしないこと
- Event Stormingそのものについての説明
:::

## Modeling Forum 2023とワークショップについて

2023年11月22日（水）に [Modeling Forum 2023](https://umtp-japan.org/event-seminar/ss-mf/13438)（以下 MF2023）が開催されます。
（この記事の執筆時点ではまだ開催されていません。）

その本会とは別に、11月10日（金）に開催されたワークショップ『ドメインモデリングの強力なツール: Event Stormingを体験しよう』に参加してきました。

https://umtp-japan.org/event-seminar/ss-mf/13506

ワークショップのファシリテーターは[加藤潤一](https://twitter.com/j5ik2o)さんと[成瀬允宣](https://twitter.com/nrslib)さんです。
（無料で大丈夫なんですかね・・・）

## Event Stormingのワークショップに参加した動機

エンジニアとして技術的負債を始めとした開発に関わる問題について考えることが多く、それを解決するためにモデリングに可能性を感じているところがあります。エヴァンス本のまえがきに「モデルと動作する実用的なソフトウェアとの間にある溝を埋める」[^1]とありますが、モデルとソフトウェアの間に限らず、開発に関わる様々なところに大きな溝があるように思えます。開発に関わるさまざまな問題も、そうした溝に真因があるような気がしており、その溝を埋めるためにモデリングが有効なのではないかと考えています。
[^1]: 『エリック・エヴァンスのドメイン駆動設計』 まえがき > 本書の構成

> エリック・エヴァンスは（DDDで）乖離を解決したかった [^2] --t_wadaさん

[^2]: [1. Software Development in 2003 | texta.fm](https://open.spotify.com/episode/1Ka5Fnoe89SyRLPea5twPA) 5:35～


しかしながら、モデリングに関する知識は学ぶことはできても、モデリングをしながら議論する機会はなかなかありませんでした。そんな時に、こちらのワークショップの存在を知りました。

https://twitter.com/iwaoRd/status/1716669568712851918

こんな機会はまたとないので、すぐに申し込みをして、北海道から東京行きの計画を始めました。

## ワークショップ参加前の状態

「Event Stormingなんもわからん・・・」

「Event Storming」という名前くらいしか知らなかったので、早速紹介されている『Learning Domain-Driven Design』[^3] を買い、Event Stormingについての章を翻訳して読みつつ大まかな流れを把握し、「あとは実際に体験してみよう」という気持ちでワークショップに臨みました。

[^3]: https://www.oreilly.com/library/view/learning-domain-driven-design/9781098100124/

## 体験して得たこと

ワークショップの目的としても「形式や厳密さよりも感覚を掴む」とあり、実際に体験して得た感覚であったり、講師の方がの経験則からくるアドバイスなどを聞けたのが大きな収穫でした。

### イベントの起票について

最初は全員でとにかく貼り出していったのですが、精査している時に慣れが必要だと感じました。不足しているイベントや抽象度の高いそうなイベントについて議論していることが多かったと思います。
また、今回のワークショップではドメインエキスパートがいなかったので、判断が難しい（正解が決められない）という点もありました。ドメインエキスパートが参加することで議論がスムーズにいくのか、あるいは別の問題が出てくるのか、このあたりも体験してみたいところです。

### ハッピーケースのタイムラインから作る

イベントのタイムラインを作っていく際に、まず注目するのはハッピーケースとのことです。起点となる最初と最後のイベント決め、その間を埋めていくことに集中します。その際に議論をしていると想像力が働いていろいろな観点が出てくるのですが、そういう時はホットスポットとしてメモしておくことで、議論が脇道にそれずに進めていけそうです。

### ツールについて

「物理的な付箋は粘着力が落ちてくるので、安い付箋は避けたほうが良い」というお話がありました。こういったところは実際に経験しないとわからない部分ですね。ワークに集中したいので、こうしたツールはストレスが少ない良いものを選んだほうが良さそうです。
ちなみにワークショップはMiroを使ったので、付箋の粘着力で困ることはありませんでした。『Learning Domain-Driven Design』でもMiroは注目すべきツールとして出てきます。

### 大きな画面で同じところに注目する

ワークショップでは個人のPCでMiroを使っていたのですが、プロジェクターで壁に映して議論するのもメリットを感じました。個人のPCで作業をしている状況よりも、同じ画面を見ることで注目しているところを揃えやすい点があると思いました。できれば大きなディスプレイやプロジェクターを用意して、全員が同じところに注目できるようにできる環境を整えたほうが良さそうです。

## 感想など

こうした新しい仕組みを現場に導入するにあたっては、「導入していい結果になるイメージが持てるか」というのはというのは重要なことだと思うので、今回のワークショップはそうしたイメージを持つための貴重な経験だったと思います。はるばる北海道から参加してよかったです。

ファシリテーターのお二人、運営の皆様、同じチームや参加者の皆様、ありがとうございました。
複雑なDeepLinkをJetpackComposeで実装するPart2

# はじめに
今回は、複雑なDeepLinkが来たときやDeepLinkの内容によってホーム画面で出しわけないといけない時の実装を紹介していきます

### 本文
本パートではMainActivityで取得したDeepLinkを利用してUIを表示しているMainViewの実装を紹介していきます
MainViewではViewModelを持ってDeepLinkの遷移先を判定します。
判定方法はプロジェクトやリンクによって変わるので省略しますがよしなに実装をしてください。
```kotlin:MainView
@Composable
fun MainView(
    viewModel: MainViewModel,
    navController: NavHostController = rememberNavController(),
    deepLink: Uri?
) {
    Scaffold() {
        MainNavGraph(navController, navigateScreenType = viewModel.checkDeepLink(deepLink))
    }
}
```
### 最後に
今回は、DeepLinkのMainView部分を紹介してみました
次の記事は下記になります

どなたかのお役に立てれば幸いです
2 つの文字列を出力 Python3編

今回の問題はこれ
https://paiza.jp/works/mondai/stdout_primer/stdout_primer__specific_format_step1

X
Y
と順番に文字列が出力されるのでそれを
X ＋ Y ＝ XYという形で出力せよという問題

```py
S = input()
T = input()
print(f"{S} + {T} = {S}{T}")

```
fstringはformatと比べて直感的に書けて便利だな、と思う

でもとりあえずformatでもかけるようにはしておこう（どこかで、、、役に立つ、、、はず）
formatの書き方は覚えにくいが、置き換える箇所を{}で書いて、あとで、順番に置き換える箇所のフォーマットを引数としていく感じで考えればいい
```py
S = input()
T = input()
print("{} + {} = {}".format(S, T, S + T))

```
【Day 6】Web環境構築 - GraphQL モックサーバー

## はじめに

![スライド7.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2985550/824ec2b4-bb8a-b85c-b644-6d338a2327d5.png)

---

**2023年アドベントカレンダー6日目**です。

https://qiita.com/advent-calendar/2023/life-sync-app

前回の続きで「開発者はWebの開発を進めることができる」を進めていきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2985550/13e79272-8479-39f1-e857-a04f2bfcc4b1.png)

## Apollo Server

### Apollo Serverとは

- Apollo Serverは、GraphQL APIを構築するためのオープンソースのWebサーバーです

https://www.apollographql.com/docs/

### Install & Start

ApolloServer + TypeScriptで起動していきたいと思います。

```bash:web/mock/
npm init --yes && npm pkg set type="module"
npm install @apollo/server graphql
npm install --save-dev typescript @types/node @graphql-tools/load
```

```json:tsconfig.json
{
  "compilerOptions": {
    "rootDirs": ["src"],
    "outDir": "dist",
    "lib": ["es2020"],
    "target": "es2020",
    "module": "esnext",
    "moduleResolution": "node",
    "esModuleInterop": true,
    "types": ["node"]
  },
  "include": ["src"],
  "exclude": ["node_modules"]
}
```

```diff_json:package.json
  "scripts": {
-   "test": "echo \"Error: no test specified\" && exit 1",
+   "compile": "tsc",
+   "start": "npm run compile && node ./dist/index.js"
  }
```

### Create Schema

Schemaファイルを設定していきます。

:::note info
後々ここはGraphQL Code Generatorによって、自動生成に変更予定です。
動作確認のために設置しておきます
:::

```graphql:schema.graphql
type Blog {
  author: String!
  body: String!
  createdAt: String!
  title: String!
}

type Query {
  blogs: [Blog!]!
}
```

### Create Index.ts

サーバー起動用のTSファイルを作成します。

```typescript:src/index.ts
import { ApolloServer } from '@apollo/server'
import { loadSchemaSync } from '@graphql-tools/load'
import { GraphQLFileLoader } from '@graphql-tools/graphql-file-loader'
import { startStandaloneServer } from '@apollo/server/standalone'
import { join, dirname } from 'path'
import { fileURLToPath } from 'url'

const __filename = fileURLToPath(import.meta.url)
const __dirname = dirname(__filename)

const schema = loadSchemaSync(join(__dirname, '../schema.graphql'), {
  loaders: [new GraphQLFileLoader()],
})

const resolvers = {
  Query: {
    blogs: () => [],
  },
}

const server = new ApolloServer({
  typeDefs: schema,
  resolvers,
})

const { url } = await startStandaloneServer(server, { listen: { port: 4000 } })

console.log(`🚀 Server listening at: ${url}`)
```

### Let's Start

起動してみましょう

```bash
npm run start
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2985550/8286965e-efc1-47c9-cf2d-e1ce64effce5.png)

これでモックサーバーが立ち上がりました

明日はGraphQLの開発を進めやすくするためにGraphQL Code Generatorの設定をしていきます
S3のURL叩いた時に出るAccessDeniedはカスタムできりゅ

## はじめに
らしいです。

## 手順
1. htmlやxmlを頑張って作る
1. エラードキュメントとして指定する
![gs-開発チーム_-_トライト-マーケティング本部_-_Slack.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278897/079d0350-1937-fad2-1adc-d1e5024a8591.png)

良い感じに動作確認してエラードキュメントが表示されればOK！

## おわりに
検証してなくて申し訳ないですが、たぶんこれで実現できそうですね。
CloudFrontが前段にある場合はどうなるのかなーと思うので、いつか業務で設定した際は追記。。したいけど忘れてそうwどんまいどんまい！

## ご参考
- AWS神より
https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/CustomErrorDocSupport.html

以上です！:fist:
WPS Officeで文字が極端に太くなって■のようになる（too-bold, Fakebold）

# 概要
Linux版のWPS Officeで、太字が極端に太くなり、黒い■のように表示される。

コミュニティにも問題として記載されている。

https://home.wps.cn/topic/3137

Arch WikiではFreetypeのダウングレードを推奨している。

https://wiki.archlinux.org/title/WPS_Office

Fedoraではリリースベースであり、かつ依存性などの問題があるので、ダウングレードを避けライブラリを直接追加する方法で解決する。

# 解決方法（Fedoraの場合）
1. Fedora 38の```freetype-2.13.0-2.fc38```を落としてくる。（Fedoraじゃない場合、自分のディストリのFreetype 2.13.**0**が手に入ればなんでもよい。）

    https://kojipkgs.fedoraproject.org//packages/freetype/2.13.0/2.fc38/x86_64/freetype-2.13.0-2.fc38.x86_64.rpm

1. 解凍する。
    ```bash
    mkdir freetype
    cd freetype
    rpm2cpio '/home/yuto/ダウンロード/freetype-2.13.0-2.fc38.x86_64.rpm' | cpio -id
    ```
1. 解凍したフォルダの中の```/usr/lib64```の中身の2つのファイルを、```/opt/kingsoft/wps-office/office6```にコピーする。
    ```bash
    cd ./usr/lib64
    sudo cp * /opt/kingsoft/wps-office/office6
    ```
1. 正常に起動するか確かめる。

以上で正しく表示されれば正解。
数値を半角スペース、０埋めで出力 Python3編

今回はこれ（半スペ埋め３桁）
https://paiza.jp/works/mondai/stdout_primer/stdout_primer__print_width_step1

fstringでこれも攻略
```py
N = int(input())
print(f"{N:>3}")
```
次はこれ（０埋め３桁）
https://paiza.jp/works/mondai/stdout_primer/stdout_primer__print_width_step2

```py
N = int(input())
print(f"{N:>03}")
```
その後も問題を解いたが、残り3問は全部今までの復習・応用問題だったので
一発合格だった
ローカル環境でrails newする際に -d postgresql オプションでエラーが出る際の対処法 & PostgreSQLのインストール【Rails 7, Mac OS】

:::note warn
PostgreSQLがインストールされていないために発生するエラー対処の記事となります。PostgreSQLの使い方の記事ではありませんので、ご了承くださいませ。
:::

## はじめに
Railsのハンズオンや環境構築資料でよく見かける以下の rails new コマンド。
```zsh
$ rails new test_app -d postgresql

# --database=postgresql と読み替えていただいて問題ありません。
```

データベースオプションである、`-d postgresql` を指定することで、Railsと同時にPostgreSQLのセットアップをすることができます。※デフォルトはsqlite3が指定される。

しかし、ローカル環境にPostgreSQL自体をインストールしていない場合、pg gem（PostgreSQLのRubyライブラリ）のインストール中にエラーが発生する可能性がありますので、以下備忘録として、手順を残したいと思い記事にしてみました。

※ 現在プログラミングスクールに通っております。カリキュラムではDockerを使用しているため、ローカルでの環境構築の機会が少ないかつ慣れないエラーが多発しやすいため、少しでも参考になりましたら幸いです。

## 実行環境
- Mac OS
- Homebrew
- Ruby 3.2.2
- Ruby on Rails 7.0.8

## PostgreSQLをインストールしていない状況での rails new
```zsh
$ rails new test_app -d postgresql
```
エラー内容（一部抜粋）：
```
Gem::Ext::BuildError: ERROR: Failed to build gem native extension.

...

checking for pg_config... no
checking for libpq per pkg-config... no
Using libpq from
checking for libpq-fe.h... no
Can't find the 'libpq-fe.h header
*****************************************************************************

Unable to find PostgreSQL client library.

Please install libpq or postgresql client package like so:
  brew install libpq
```
こちらは、PostgreSQLのクライアントライブラリ（libpq）が見つからないため、`pg` gemのインストールに失敗している旨のエラーとなります。libpqは、PostgreSQLへの接続等を行うために使用されるため、インストールをする必要がありますが、PostgreSQL自体のパッケージに含まれているため、PostgreSQLをインストールすれば自動的に利用可能になります。
以下、具体的な手順を記載します。

## PostgreSQLのインストール
まず、Homebrewを使用して、ローカルにPostgreSQLをインストールします。
```zsh
$ brew install postgresql
```
PostgreSQLのバージョンを確認します。
```zsh
$ postgres --version

postgres (PostgreSQL) 14.10 (Homebrew)
```

## PostgreSQLサービスの起動
PostgreSQLをインストール後、サービスを起動する必要があります。
```zsh
$ brew services start postgresql
```

※ サービスを停止したい場合
```
$ brew services stop postgresql
```

## Railsアプリケーションのセットアップ
PostgreSQLがインストールされ、サービスが起動していることを確認したら、再度 `rails new` コマンドを実行します。
```zsh
$ rails new test_app -d postgresql
```

## データベースの作成
Railsアプリケーションのセットアップが完了したら、次はRails内でデータベースを作成します。
```zsh
$ rails db:create
```

## Railsサーバーが立ち上がることを確認して、http://localhost:3000/ にアクセスする
```
$ rails s
```
以上となります。ありがとうございました。

## PostgreSQLサービスを起動していない場合
サービスを起動していない場合は以下のようなエラーが出ます。
```
ActiveRecord::ConnectionNotEstablished
connection to server on socket "/tmp/.s.PGSQL.5432" failed: No such file or directory
Is the server running locally and accepting connections on that socket?
Extracted source (around line #87):
              
            raise ActiveRecord::DatabaseConnectionError.hostname_error(conn_params[:hostname])
          else
            raise ActiveRecord::ConnectionNotEstablished, error.message
          end
        end
      end
```

サービスを起動することで解決します。
```zsh
$ brew services start postgresql
```
登壇！「技術的負債に向き合う Online Conference - Rookies LT」

## はじめに
こんにちは！[HITOTSU株式会社](https://hitotsu.co.jp/)の河村康治と申します。

11/21(火)に開催されるオンラインイベント登壇の告知です。
RookiesLT RoomBの16時30分より登壇します。

https://findy.connpass.com/event/297813/

## 登壇予定テーマ
「**ServiceWorker、indexedDBを活用したオフライン機能開発**」のテーマで登壇致します。今年7月リリースの「Webシステムでのオフライン機能」を実現したため、そのご紹介となります。詳しくは下記記事を見てね！！

https://note.com/hitotsu_life/n/n5bb6531d5986

### さいごに
久しぶりの登壇なので、楽しんで行こうと思います！！
アジャイル×トヨタ生産方式：革新的開発手法の探求

# はじめに
先日のAIテックに大企業内でスクラム開発をリードしている方のLTでアジャイル開発にトヨタ生産方式（TPS)を取り入れているという発表があり、工業のトップの「トヨタ式」とアジャイル開発を組み合わせるという興味深い発表がありました。
アジャイル開発とトヨタ生産方式を組み合わせることでアプリ開発の効率性と品質はどのように向上できるのでしょうか

# アジャイルとは
アジャイル開発は、柔軟性と速さを重視する開発手法です。短いイテレーションと連続的なフィードバックを通じて、迅速かつ柔軟に顧客のニーズに応えることを目的としています。このアプローチは、変化に富んだ現代の開発環境において非常に効果的です。

# トヨタ生産方式（TPS）の原則
TPSは、無駄を排除し、効率を最大化することに焦点を当てた生産管理システムです。TPSの核心は、「カイゼン（改善）」、「ジドーカ（自働化）」、そして「ジャストインタイム」の原則にあります。

# アジャイル×トヨタ生産方式のメリット
### 1.継続的改善（カイゼン）の採用
アジャイルのイテレーションごとに、プロセスの改善を図ります。これは、TPSのカイゼンの原則と一致し、開発プロセス全体の効率と品質を継続的に向上させることができます。

### 2.無駄の排除
TPSで重視される無駄の排除をアジャイルプロセスに応用することで、非効率な作業を特定し、改善することが可能です。

### 3.自働化の利点
TPSの自働化原則に倣って、テストやデプロイメントのプロセスを自動化することで、エラーを減らし効率を向上させます。

# 実践的なアプローチ
### 1.チーム文化の構築
まず、両方の手法の原則を理解し、チーム内で共有することが重要です。

### 2.プロセスの評価と改善
現在の開発プロセスを評価し、TPSの原則に基づいて改善点を特定します。

### 3.小規模からの実施
小さなプロジェクトやチームでこの統合を試し、徐々に規模を拡大することが効果的です。

### 4.定期的なレビュー
定期的に進捗をレビューし、カイゼンのサイクルを繰り返します。

# おわりに
アジャイルとTPSの組み合わせは、ソフトウェア開発において大きな可能性を秘めています。このアプローチは、効率性と品質の向上を目指すすべての開発チームにとって、大いなるインスピレーションとなるでしょう。この革新的な方法論を取り入れることで、開発の未来を切り開く一歩となるかもしれません。

# 備考
### アジャイルソフトウェア開発宣言
>私たちは、ソフトウェア開発の実践
あるいは実践を手助けをする活動を通じて、
よりよい開発方法を見つけだそうとしている。
この活動を通して、私たちは以下の価値に至った。
>
>プロセスやツールよりも個人と対話を、
包括的なドキュメントよりも動くソフトウェアを、
契約交渉よりも顧客との協調を、
計画に従うことよりも変化への対応を、
>
>価値とする。すなわち、左記のことがらに価値があることを
認めながらも、私たちは右記のことがらにより価値をおく。

(https://agilemanifesto.org/iso/ja/manifesto.html より引用)

### アジャイルソフトウェアの12の原則
>顧客満足を最優先し、
価値のあるソフトウェアを早く継続的に提供します。
>
>要求の変更はたとえ開発の後期であっても歓迎します。
変化を味方につけることによって、お客様の競争力を引き上げます。
>
>動くソフトウェアを、2-3週間から2-3ヶ月という
できるだけ短い時間間隔でリリースします。
>
>ビジネス側の人と開発者は、プロジェクトを通して
日々一緒に働かなければなりません。
>
>意欲に満ちた人々を集めてプロジェクトを構成します。
環境と支援を与え仕事が無事終わるまで彼らを信頼します。
>
>情報を伝えるもっとも効率的で効果的な方法は
フェイス・トゥ・フェイスで話をすることです。
>
>動くソフトウェアこそが進捗の最も重要な尺度です。
>
>アジャイル･プロセスは持続可能な開発を促進します。

一定のペースを継続的に維持できるようにしなければなりません。
>
>技術的卓越性と優れた設計に対する
不断の注意が機敏さを高めます。
>
>シンプルさ（ムダなく作れる量を最大限にすること）が本質です。
>
>最良のアーキテクチャ・要求・設計は、
自己組織的なチームから生み出されます。
>
>チームがもっと効率を高めることができるかを定期的に振り返り、
それに基づいて自分たちのやり方を最適に調整します。
(https://agilemanifesto.org/iso/ja/principles.html より引用)
Reactで簡単なWebアプリを作ってみた

こちらのアプリの機能追加をした記事があります！
->[ReactのWebアプリに機能追加してエディタアプリ風にしてみた](https://qiita.com/Oyuhaat/items/5c0fc52e0555fb7e8498)
## はじめに
Reactで簡単なWebアプリを作りました。（実務でもReact使っています）
動機としては、転職のこと等を考えて積極的に自分の技術をアウトプットしようと思ったことと、自分のGithubアカウントに再利用可能性が高いコードを追加していきたいと考え、自分が使ったことが無い技術を取り入れて個人開発していきたいと思ったからです。今回は、Color-Picker関連を使ったことが無かったので使いたいと思い、それを中心に機能を考えました。
![all.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3620936/643e4acd-5cf8-abc0-20e1-2719f1740287.gif)


## 概要
- サイトは[こちら](https://y-o-shi.github.io/color-pickers/)、Githubリポジトリは[こちら](https://github.com/y-o-shi/color-pickers)
- ボタンデザインを自分で作れるサイト
- 開発環境はReact, Typescript, Vite, MUI
- 所要時間は20時間程度 (約1週間)
- レスポンシブは600px以上(スマホ横画面、タブレット縦画面程度)対応

#### 機能
- ランダムなテキスト・色のボタンを追加、選択中のボタンを複製、Reactコードを表示、色を変更、選択中のボタンを削除
- ＋ボタンを押すとランダムなテキスト、ランダムな色のボタンを作ってくれます。色は完全ランダムだとめちゃくちゃなボタンばかりできてしまうので、いい感じのを種類化して作りました。テキストは200種類ほど、色が60パターン程なので、全パターン数は12000種類程度。

#### 技術
- グローバル状態管理はuseRecoilを使用
useStateだとバケツリレーが辛く、Redux使うほどでもないのでちょうどいいuseRecoilにしました。RecoilはuseContext + useStateと機能的にはほぼ同じですが、書き方やデータ管理がより楽です。
- UI系は基本的にMUIを使用
MUIからはButton, IconButton, TextField, Tooltip、他はコード表示部分でreact-syntax-highlighterを使用しました。MUIは実務でよく使っていて慣れていたので、細かい調整等もそこまで大変ではありませんでした。
- デプロイは、gh-pagesを使ってGithub pagesにデプロイしました。CIはGithub Actionsで、ビルドが通るかの確認だけしています。

#### 工夫した部分
- ユーザのアクションは全てアイコンボタンにして、カーソルを合わせると説明が表示されるようにしました（以下画像参照）。はじめはテキストが入ったボタンにしようとしたのですが、ここのゾーンがかなりごちゃごちゃする印象になったのでこのようにスッキリさせました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3620936/4ed9bc77-6a00-fe56-5075-e6d7856b2a72.png)

## まとめと感想
きちんとアウトプットした個人開発としては初でした。このアプリでもまだ加えたい機能が少しあるので追加実装しつつ、別のものにも挑戦したいと思います。

こちらのアプリの機能追加をした記事があります！
-> [ReactのWebアプリに機能追加してエディタアプリ風にしてみた](https://qiita.com/Oyuhaat/items/5c0fc52e0555fb7e8498)
GoogleColabでRuntimeError: PytorchStreamReader failed reading zip archive: failed finding central directory

## エラー
学習済みモデルhoge.pthをフォルダに置いた後、コードを実行するとエラーが生じる
## 環境
Google Colab
Python 3.10.12
## 対処法
まだhoge.pthが完全にダウンロードできていない

<img width="400" alt="yolox_x.pthの読み込み中" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3134179/d423d285-ea28-8888-87e2-0e91c5519f52.png">

気長に待ちましょう
## 参考
https://stackoverflow.com/questions/71617570/pytorchstreamreader-failed-reading-zip-archive-failed-finding-central-directory