OmniAICreator/Qiita-1.07M huggingface dataset:
Bingo

# はじめに
今回はBingoとかに使うマシーンについて紹介していこうと思います。と思います。
Bingoマシーンを利用するときに思ったことは

- HTML,CSS,jsを分けたほうがわかりやすい、
僕のおすすめはやはり上の分けるやつですかね。
# プログラム
**html**
```html
<!-- index.html -->
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Bingoマシーン</title>
    <link rel="stylesheet" href="style.css">
</head>
<body>
    <div class="container">
        <div id="bingoNumber" onclick="generateRandomNumber()">Tap for Bingo!</div>

        <div id="numberList">選ばれた数字: </div>
    </div>

    <script src="script.js"></script>
</body>
</html>

```
**CSS**
```css
/* style.css */
body {
    margin: 0;
    font-family: Arial, sans-serif;
    background-color: #f8f8f8;
    display: flex;
    align-items: center;
    justify-content: center;
    height: 100vh;
}

.container {
    text-align: center;
    background-color: #fff;
    padding: 20px;
    border-radius: 10px;
    box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
}

#bingoNumber {
    font-size: 48px;
    padding: 20px;
    border: 2px solid #333;
    cursor: pointer;
    user-select: none;
    transition: transform 0.1s ease-in-out;
    margin-bottom: 20px;
}

#bingoNumber:hover {
    transform: scale(1.1);
}

#numberList {
    font-size: 18px;
    margin-top: 20px;
}

```
**js**
```js
// script.js
let selectedNumbers = [];

function generateRandomNumber() {
    const bingoNumberElement = document.getElementById('bingoNumber');
    const numberListElement = document.getElementById('numberList');

    // タップごとにランダムな数字表示
    const minNumber = 1;
    const maxNumber = 100;

    // 未出の数字を抽選する
    let number;
    do {
        number = Math.floor(Math.random() * (maxNumber - minNumber + 1)) + minNumber;
    } while (selectedNumbers.includes(number));

    // ドキドキ感を演出するアニメーション
    bingoNumberElement.style.transform = 'scale(1.1)';
    setTimeout(() => {
        bingoNumberElement.style.transform = 'scale(1)';
    }, 100);

    // ビンゴマシンに表示
    bingoNumberElement.innerText = number;

    // 選ばれた数字をリストに追加
    selectedNumbers.push(number);

    // 選ばれた数字のリストを更新
    updateNumberList();
}

function updateNumberList() {
    const numberListElement = document.getElementById('numberList');
    numberListElement.innerHTML = '選ばれた数字: ' + selectedNumbers.join(', ');
}
```
**ちなみ**に上の
```js
const minNunber=1;
const maxNumber=100;
```
のところで最低値と最大値を設定します。
CSSはしっかりと模様をつけているだけです。
jsでは表示するところをやっています。
# 最後に
このBINGOに付け足したいものがあったらコメント欄によろしくお願いいたします。
報告するなら知っておきたい「テクニカルライティング」の知識

定例MTGや日報、週報などの「**誰かに現状や進捗を報告する**」という場面は、さまざまな規模で頻繁に発生します。

あるいは誰かに報告はせずとも、書きなぐりのメモのような、**明日の自分に向けて**報告することもあるでしょう。

口頭であれ文章であれこのような報告が上手くなると、他者[^1]への情報共有がスムーズになりますし、自身の頭の中もスッキリします。

この記事では『**成果を生み出すテクニカルライティング**』[^2]が提唱する「黄金フォーマット」を、できるだけ短く伝えてみようと思います。

## 黄金フォーマットは「背景・前提」、「課題」、「アプローチ」、「結論」の4項目を準備する

テクニカルライティングにおけるフォーマットは、

- 背景・前提
- 課題
- アプローチ
- 結論

の4つを満たすことが必要となります。

以下ではすべてに簡単な説明を加えますが、私がとくに重要だと感じるのは前半の「背景・前提」と「課題」です。

## 「背景・前提」をふくめる

**背景・前提**とは「過去どうなっていたのか」や「これまでどのように進んできたのか」という情報です。

報告が「TODOリストの状況説明」になっている場合、おそらく背景や前提が抜けています。

これが存在しないと、そもそも「なぜそのタスクを実行した（している）のか」「解決しようとしている課題は的を得ているのか」が判断できません。

## 「背景・前提」から「課題」をとりあげる

**課題**とは、上述の背景・前提から導き出せる情報です。

背景・前提があれば、自然と「次は〜が大事な作業になると考えていた」とか「しかし〜は予想と異なったため、別途調査が必要だった」など、課題を記述できます。

ここで大事なのは、ただ課題だけが書かれているだけと違って背景・前提があると、**あなた以外の他者にもその課題を共感・納得してもらえる**、ということです。

「**自分のやっている仕事の難しさが伝わってない！**」と感じる場合も同様で、それは課題の説明が不足しているのではなく背景・前提の共有が不足している可能性が高いでしょう。

## 「アプローチ」にくわえて「結論」を用意する

背景・前提と課題があれば、いよいよ何をやったか＝**アプローチ**を説明できます。

このタイミングで、挙げた課題をするためにもしくはプロジェクトを前へ進めるために何を実施したのか説明すると、他者にもとてもよく伝わります。

最後に**結論**も準備します。これは「課題は解決したのか」や「背景に書かれたいた状況からどう変わったのか」さらには「よって次はどうするのか」など、アプローチを実践したことで現状どんな結果が得られたのかを指しています。

ここまで書けると、報告したい本質的な内容を他者が理解でき、その後の相談や提案などのコミュニケーションもよりスムーズになります。

## 「何をしたの？」より「どんな状況だったの？」が重要

テクニカルライティングのフォーマットをできるだけ簡潔に紹介してみました。

それでも「やることが多い......!」と悲観的に感じる方もいるかもしれません。

そんな方に伝えたいのは、「**もともとどんな状況だったの？**」ってことから説明してみましょう、ということです。つまり前提をちゃんと書きましょう、ということですね。

これをやるだけで他の要素もおのずと埋まることが多いはずです。

言い方を変えれば、「**やったことを最初に伝える**」ことから脱却すると、一気にそれらしくなる。というのが私の実感です。

## さいごに

正直、ちゃんと真面目に報告するだけでも素晴らしいとは思います。そのうえでこのフォーマットを意識してみると、さらに質の高い報告になるはずです。

今回は簡単な紹介だけでしたが、リアクションがあれば別の記事で実践編も書いてみようかと思います。

ぜひ気になる点や実際に困っている点などあればコメントいただけると幸いです。

[^1]: 「明日の自分の他者である」というのが筆者の認識です。 実は重要な考えだと思いますのでここに残しておきます。

[^2]: 藤田肇『成果を生み出すテクニカルライティング ── トップエンジニア・研究者が実践する思考整理法』
公開リンクを一括生成して、紐付ける



+ [ライブラリ内画像をオブジェクトレコードに紐づけたい](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007X8AYT)

画像一つ一つの公開リンクを取得し、入力する（流し込み）する必要があり
商品数が数千ある弊社ではあまり現実的ではありません。

公開リンクを一括生成して、紐付けるのであればフローが使えるようです。

[Generating Public URL for Salesforce Files](https://forcepanda.wordpress.com/2021/05/04/generating-public-url-for-salesforce-files/)

[Using Flow to Generate Public URLs for Files](https://salesforcetime.com/2022/10/20/using-flow-to-generate-public-urls-for-files/)

[Access ContentBody Id in flow for Public Link URL - Send Mass Content Email from Flow](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000JfKO6SAN)

実際に組んでみたらできましたね。

+ [添付されたファイルを使って公開リンクを作成するフロー](https://qiita.com/Keiji_otsubo/items/bc1e1e58a1dfab77fa54)
Next.js+TypeScript+ESLint+Prettierで開発環境を構築

## 環境

- next@14.0.4
- typescript@5.3.3
- eslint@8.56.0
- prettier@3.2.4


## Next.jsプロジェクト作成

```bash
npx create-next-app hogehoge-project --ts
```

会話形式で設定する。全部デフォルト。

```
√ Would you like to use ESLint? ... No / [Yes]
√ Would you like to use Tailwind CSS? ... No / [Yes]
√ Would you like to use `src/` directory? ... No / [Yes]
√ Would you like to use App Router? (recommended) ... No / [Yes]
√ Would you like to customize the default import alias (@/*)? ... [No] / Yes
```

起動確認。
問題なく動くはず。

```bash
cd hogehoge-project
npm run dev
```

## ESLintとPrettierのインストール

```bash
npm i -D @typescript-eslint/eslint-plugin prettier eslint-config-prettier
```

### ESLintの設定

`.eslintrc.json`を作成＆編集。

```.eslintrc.json
{
  "extends": [
    "plugin:@typescript-eslint/recommended",
    "next/core-web-vitals",
    "prettier"
  ]
}
```

### Prettierの設定

`.prettierrc.json`を作成＆編集。

```.prettierrc.json
{
  "tabWidth": 2,
  "printWidth": 100,
  "trailingComma": "es5",
  "semi": true,
  "singleQuote": true
}
```

### npmコマンドの追加

`scripts`に`format`を追記。

```package.json
  "scripts": {
    "dev": "next dev",
    "build": "next build",
    "start": "next start",
    "lint": "next lint",
    "format": "prettier --write --ignore-path .gitignore './**/*.{js,jsx,ts,tsx,json,css}' && next lint --fix"
  },
```

### 確認

以下を実行して、ソースが整形されたらOK。

```bash
npm run format
```

## VSCodeの保存時自動フォーマット
```.vscode/settings.json
{
  "editor.formatOnSave": true,
  "[typescriptreact]": {
    "editor.defaultFormatter": "esbenp.prettier-vscode"
  },
  "editor.codeActionsOnSave": {
    "source.fixAll": true,
    "source.organizeImports": true
  },
  "prettier.configPath": ".prettierrc.json",
  "typescript.tsdk": "node_modules/typescript/lib"
}
```

## Unknown at rule @&#xFFF0;tailwind 警告を消す

マーケットプレイスから Tailwind CSS IntelliSense をインストールする。

`settings.json`に以下を追記する。
```.vscode/settings.json
  "files.associations": {
    "*.css": "tailwindcss"
  }
```
SUBSTITUTE



[ヘルプ:SUBSTITUTE](https://help.salesforce.com/s/articleView?id=sf.customize_functions_substitute.htm&type=5)

+ [リアクティブ入力による画面フロー内の SUBSTITUTE は、文字の 1 つだけを置換します。
画面フロー上の電話入力から不要な文字を削除する次の式があります。しかし、期待どおりに機能していないようです。API バージョン 59 で実行されているため、SUBSTITUTE はリアクティブとしてサポートされています。](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007Qeadv)

# 既知の問題

+ [Reactive Formula SUBSTITUTE Not Behaving as Expected](https://issues.salesforce.com/issue/a028c00000yEZgmAAG/reactive-formula-substitute-not-behaving-as-expected)

# Data Raptor Extractでは使えない

+ [Formatting of phone number in Data Raptor Extract](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007YvyFb)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/d94918d9-ff8b-3d1b-b763-d4c5d25cb254.png)
色変記事&半年間競技プログラミングをやってみて良かったこと

# はじめに
AtCoderを始めてもうすぐ半年&ちょうど前回のABC338にて入茶を達成したので憧れの色変記事を書きます！
![スクリーンショット 2024-01-28 12.18.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2885419/1555a351-4b0e-bdf9-b9ad-241d7e2e4911.png)


# 自己紹介
- 新卒3年目のエンジニア
- 大学は国立理系
- 業務では競プロ弱小言語のtypescriptを主に書いています
- AtCoderは職場の後輩に教えてもらって始めました

# 茶色レートの実力ってどのくらい?
AtCoder公式ホームページの[Algorithm部門のレーティングと業務における期待できる活躍](https://info.atcoder.jp/utilize/jobs/rating-business-impact)からの引用です。結構嬉しい事が書いてありますね:relaxed:
> **AtCoderにおける分布(2023/11/20現在)**
実レーティング分布： 上位28.462%
内部レーティング分布： 上位45.928%

> **期待できる能力**
コーディングへの安心感がある程度持てます。学生や派遣社員などが茶色のレーティングを持っていたら、とても喜ばしいです。
基礎的なアルゴリズムへの理解があります。典型的な処理であれば、動的計画法、二分探索などのメジャーなアルゴリズムを適用することが出来ます。一方、少し典型から外れてしまうとまだ解くことが出来ません。
競技者としては、多くの参加者がまず目指すべきラインはここでしょう。数学的素養がそれなりにあり、しっかりと練習すれば到達可能な水準です。逆に言えば、才能や素養が十分にあるか、競技者としてしっかり取り組んだかのどちらかを必ず満たしているのがこの色です。

# 入茶までにやったこと
## [C++入門 AtCoder Programming Guide for beginners (APG4b)](https://atcoder.jp/contests/APG4b)
使い慣れたtypescriptが実行速度的に競プロに不向きなことは分かっていたので、競プロ界隈で最もポピュラーなC++の勉強から始めました。C++は完全未経験だったので公式がC++のチュートリアルを用意してくださっていて本当に助かりました。
## [AtCoder に登録したら次にやること ～ これだけ解けば十分闘える！過去問精選 10 問 ～](https://qiita.com/drken/items/fd4e5e3630d0f5859067)
C++に慣れたら、次は競プロの問題形式やプラットフォームに慣れようということで上記の記事に載っている10問を解きました。「これだけ解けば十分闘える」というのは本当で、これを解いた後はAtCoder参加中に何にもとっかかりが無くて立ち往生するような事は無くなりました。

これから始めようという方にはとてもおすすめの教材です。

## [競技プログラミングの鉄則](https://www.amazon.co.jp/競技プログラミングの鉄則-アルゴリズム力と思考力を高める77の技術-Compass-Booksシリーズ-米田/dp/483997750X/ref=pd_lpo_3?pd_rd_w=Siy9U&content-id=amzn1.sym.d769922e-188a-40cc-a180-3315f856e8d6&pf_rd_p=d769922e-188a-40cc-a180-3315f856e8d6&pf_rd_r=RYJJ5GVFP7VA1SEDRN4F&pd_rd_wg=TMHxp&pd_rd_r=1df544f5-e822-4924-a5c1-a9dfbc038fa6&pd_rd_i=483997750X&psc=1)第3章まで
競技プログラマー向けに大会で有用なアルゴリズムを網羅的に解説している本です。
私は
1. アルゴリズムと計算量
1. 累積和
1. 二分探索

の3章までしか読んでいませんが、入茶するだけなら3章までで十分でした。

## 可能な限り毎週のコンテスト参加
平日は仕事が忙しくてなかなか精進する時間が取れない私にとってコンテスト参加が一番の精進になりました。
初心者ボーナスでぐんぐん伸びる成績がモチベーションになりました。

# 入茶する上で役に立った知識・アルゴリズム
## TLEになる計算回数の目安
C++では計算回数が10の9乗を超えるとTLE(実行制限時間超過)で不正解となります。
このことを知っておくと、問題の制約から全探索で解ける問題なのか、何かしら工夫して計算量を削減しないと解けない問題なのか判断することができます。

## 累積和
累積和を知っていたおかげで解けた問題はかなり多かったです。
実装は簡単なのに使えると解ける問題が一気に増えるため、初心者競技プログラマーはまず累積和を勉強すると良いと思います。

## 自分のタイプ
自分が同じレート帯の中で「多く解くタイプ」であるか「早く解くタイプ」であるかを判定してくれる[AtCoder Type Checker](https://atcoder-type-checker.herokuapp.com)というツールを有志の方が公開してくださっています。これによると私は「かなり多く解くタイプ」のようです。

![スクリーンショット 2024-01-28 22.28.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2885419/cd3ec0e6-cafb-6e12-9880-54c92cacfe66.png)

自分のタイプを知っておくと、下記のように効率良くレートを上げるための対策を行う事ができます。
- 多く解くタイプ=比較的高難度の問題も解けるが、解答スピードが遅い
　⇨早解きができる工夫をするとレートが上がりやすい
- 早く解くタイプ=比較的解答スピードが速いが、高難度の問題は解けない
　⇨より難易度が高い問題も解けるようになるとレートが上がりやすい

# AtCoderを始めて良かったこと
## 楽しみが増えた
まず第一に競技プログラミングは単純に楽しいです。始めるきっかけをくれたN君ありがとう。
コンテストへの参加の楽しみ、レートや順位が上がる楽しみ、新しいアルゴリズムに触れる楽しみがあります。

## 実務にも役立つ
私は普段フロントエンドエンジニアをしているので、業務で複雑なアルゴリズムを実装したり計算量の削減を求められたりはしないです。そのため、AtCoderを介して知ったアルゴリズムが直接業務に役立つことはありませんでした。
しかし、デバッグの速さだったり、コードの理解力、新しい言語やフレームワーク、ライブラリにキャッチアップする能力には成長を感じています。

# 今後の目標
今後の目標としては、今年中に入水を目指してやっていきたいです。
最近サボっている鉄則本を再開します:muscle:
【Next.js】開発時にHTTPSを使用する方法

`package.json`の`scripts`, `dev`に`--experimental-https`を追記と開発時にHTTPSを使用できます。

```json:package.json
  "scripts": {
    "dev": "next dev --experimental-https",
    "build": "next build",
    "start": "next start",
    "lint": "next lint"
  }
```

https://nextjs.org/docs/app/api-reference/next-cli#https-for-local-development
Omni-Channel トレイルヘッド



+ [「オムニチャネルでルーティングを開始する」チャレンジの問題](https://trailhead.salesforce.com/en/trailblazer-community/feed/0D54S00000IPqj7)
+ [Getting an inside view with Omni Supervisor: Supervisor Configurationsの設定がない](https://trailhead.salesforce.com/en/trailblazer-community/feed/0D54S00000J5QxD)

:::note
説明が間違っているようです。
The correct path is "Setup-->Supervisor Settings". Pay attention since you have to go to Setup, not Service Setup. Supervisor Settings is not in there.
:::

+ [I have set omni-channel to available online but my agent is still offline in builder. What else can I do to make sure agent is online?](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000JgzVe)

:::note
I have solved the problem. I just started a new playground and went through the entire module again step by step.

問題は解決しました。新しいプレイグラウンドを開始し、モジュール全体をもう一度ステップごとに学習しました。
:::

+ [Can we keep Omni-channel presence status as Available always without going offline?](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007XIAHk)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/6cb20a57-abb1-0eb4-2f6e-282670c483dc.png)

:::note
 Actually i need to either remove the Offline button or make that disable to avoid users from selecting Offline button manually.

実際には、ユーザーが手動でオフライン ボタンを選択できないように、オフライン ボタンを削除するか、無効にする必要があります。
:::

+ [Unable to find "Skill" in Omni-channel](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007cloJP)

:::note
Goto SETUP --> Omni-Channel Settings

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/2c38524e-b535-9491-575a-00db6289093c.png)
:::

+ [I'm trying to finish the "Start Routing with Omni-Channel" challenge, but when I change the case owner to the "High Priority Cases" queue I don't get the notification in the Omni-Channel widget. What could I be missing?](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007cmQU3)

:::note
Please check this article.

https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000ITEwx
:::


# You must select at least one skill.

[how to deploy chat button type omni-channel using SFDX](https://trailhead.salesforce.com/en/trailblazer-community/feed/0D54S00000HkEMs)


# 未解決

+ [Unable to find the omnichannel widget, Start Routing with Omni-Channel module.](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007XFZbG)
気がついたら間違えてBitcoin Coreをダウンロードしていた件について

# 趣旨

Ordiswap APIを利用しようとドキュメントもきちんと読まずに適当に書いてあるコマンド打ってエラーの解決方法探していたら、いつの間にかBitcoin Coreをダウンロードしてブロックチェーンのシンクロが始まっていました（笑）

せっかくなので備忘録としてここに記録しておきます。

ARM系のRaspberry Piを利用しました。

このコマンドでARM系だと判明したので、ファイル名がARM用になっています。
```
uname -m
```

# 実行したコマンド

まずはシステムのアップデートとアップグレードを行います
```
sudo apt update && sudo apt upgrade
```
必要なライブラリをインストールします。
```
sudo apt install build-essential libtool autotools-dev automake pkg-config libssl-dev libevent-dev bsdmainutils
```
現時点（2024年1月）で最新版のBitcoin Coreをダウンロードします。
```
wget https://bitcoincore.org/bin/bitcoin-core-26.0/bitcoin-26.0-arm-linux-gnueabihf.tar.gz
```
ダウンロードした圧縮ファイルを解凍します。
```
tar -xzf bitcoin-26.0-arm-linux-gnueabihf.tar.gz
```
コンパイルしてインストールします。
```
cd bitcoin-26.0
cd bin
./bitcoind
make
sudo make install
```

あとは自動でビットコインのブロックチェーンの同期が始まります。

:::note warn
2024年1月時点でビットコインのブロックチェーンのサイズは618GBなので、SSDなしのラズパイ程度では到底同期すらできません。

私は即中断しました。
:::

:::note info
他のノードと接続できてるか気になる場合は以下のWebサイトで確認できます。
https://bitnodes.io/
:::

## テストネットでもう一度トライ

ディレクトリを削除してもう一度解凍します。

テストネット版でBitcoin Coreを起動します。
```
cd bitcoin-26.0
cd bin
./bitcoind -testnet
```
Configファイルを編集します。
```
cd ~/.bitcoin/
nano bitcoin.conf
```
中に以下の内容を書き込みます。
```
testnet=1
rpcuser=****
rpcpassword=****
```

リスタートします。
```
cd ..
cd bitcoin-26.0
cd bin
./bitcoind -testnet
```

動くか確認します。
```
./bitcoin-cli -testnet -rpcuser=**** -rpcpassword=**** getinfo
```

:::note alert
テストネットでもブロックチェーンのサイズは30GBほどあって私の低スペックなラズパイと低容量のSDカードでは動かせませんでした。
今度別のデバイスと容量のでかいSDカードで試してみます。
:::
(高速)レジ直でSTM32C011をたたく(Lチカ)(GPIO)(STM32C011J4M7)


(高速)レジ直でSTM32C011をたたく(Lチカ)(GPIO)(STM32C011J4M7)


x 心にレジスターを持つ人、限定
x AND(アンド)がわかる人、限定
x OR(オア)がわかる人、限定


目的
GPIOレジスターを直接、たたく
略して、これを「レジ直」と言う。
けして、スーパーのセルフレジに直接行くのでは、ない。
皆の衆、ご理解いただけましたか?

難易度、極小(ごくしょう)「かわの服とひのきの棒で倒せるレベル」


例
難易度、大(だい)(メタルスライムレベル)


↓ここをクリック↓

https://qiita.com/caa45040/items/1850b80289a12d92e936

↑ここをクリック↑


何に、言っているのか、わからない時は、
適当に「しろくまくん」あたりの記事を100回読んで寝てね!!

参考


↓ここをクリック↓


https://qiita.com/shirokuma89dev/items/3d73d1450fb398eedf2e


↓ここをクリック↓

https://qiita.com/shirokuma89dev/items/6ed42c906c153fb86fb9





![o_cop907.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/1770ac93-a395-b522-db19-f8ba9ed42b23.jpeg)



```c++


//これは、GPIOレジスターを直接操作する方法
//GPIO_IO_REG_C011_1


//定義
//レジ直PA8の定義
//                        1111110000000000
//                        5432109876543210
int on1  = GPIOA->ODR | 0b0000000100000000;
int off1 = GPIOA->ODR & 0b1111111011111111;


//初期化
void setup() {

  //ピンの初期化 PA8
  pinMode(PA8, OUTPUT);

} //setup


//メインループ
void loop() {

  //PA8をオン
  GPIOA->ODR = on1;
  //digitalWrite(PA8, HIGH);

  delay(1000); //1秒待つ

  //PA8をオフ
  GPIOA->ODR = off1;
  //digitalWrite(PA8, LOW);

  delay(1000); //1秒待つ

} //loop


```
2024/1/29主にITとかセキュリティの記事

GitLabサーバの脆弱性、日本も149台に影響 - アップデートを(1/27)
https://news.mynavi.jp/techplus/article/20240127-2870306/

なりすましメール、企業が対策急ぐ　花王など管理強化(1/27)
https://www.nikkei.com/article/DGXZQOUC096FB0Z00C24A1000000/

YouTube新コンテンツ配信　根本的ランサムウェア対策、「バックアップ」を語る!!【アクトのセキュリティ・オタクたち。】(1/27)
https://japan.cnet.com/release/30937690/?ref=rss

アメリカ国家安全保障局(NSA)がアメリカ人のインターネット閲覧履歴データを令状なしで購入していると明かす(1/27)
https://gigazine.net/news/20240127-nsa-buying-americans-internet-browsing-records/

医薬品工場に求められているHSE要件と事例【第47回】(1/27)
https://www.gmp-platform.com/article_detail.html?id=23554&lang=ja

ランサムウェアの「巻き添え被害」が増加している業界とは？(1/27)
https://kn.itmedia.co.jp/kn/articles/2401/26/news089.html

米アップル、ＥＵで外部アプリのダウンロードＯＫに　大手ＩＴ企業に自社優遇を禁じる「デジタル市場法」に対応(1/27)
https://www.zakzak.co.jp/article/20240127-PT4EOWAVYBLOFDY7JBFKX3VW44/

マイナンバーと療育手帳のひも付けミス30件　沖縄県「個人情報漏えいはない」(1/27)
https://nordot.app/1123864198263128632

軍用レベルの暗号化技術採用した、パスワードの自動入力と暗号化保存デバイス(1/27)
https://ascii.jp/elem/000/004/181/4181104/?rss

メルカリのニセモノが運転免許証とマイナンバーカードを要求してくる詐欺登場(1/27)
https://ascii.jp/elem/000/004/181/4181446/?rss

アメリカの若者たちのあいだで流行る「マニフェステーション（願望実現）」とは？ 支持される背景を探る(1/27)
https://news.mynavi.jp/article/20240127-2871249/

ビットコインの積立投資は儲かるのか｜デメリットやシュミレーション結果を紹介(1/27)
https://crypto-times.jp/bitcoin-accumulation/

実はカビだらけ？ 知らなかった国際宇宙ステーションのアレコレ(1/27)
https://www.gizmodo.jp/2024/01/13-things-you-didnt-know-about-the-international-space-jpn.html

米韓、初のサイバー訓練　北朝鮮にらみ連携　核ミサイル開発の資金源(1/26)
https://www.iza.ne.jp/article/20240126-IRLERJRGRJLORPO5AEMPUDJ6ZA/

米国発「朝鮮半島戦争説」広がる…尹政権だけが知らない「抑止力の神話」（２）(1/27)
https://japan.hani.co.kr/arti/politics/49006.html
openSUSE Tumbleweed sftp 使用不可の解決

先週にopenSUSEをLeapからTumbleweedに乗り換えました。
そしてFileZillaでWindowsとLinux間のファイル転送ができなくなった。
その時はsshとscpが使えますが、sftpは使えません。
```
>sftp -v ${servername}
debug1: Exit status 127
```
というエラーコードが出てきました。
調べると、127はsftp-serverが存在しないか場所が間違ったかのどちらです。
YAST Software Managerを開いて、opensshの中身を調べると、sftp-serverは/usr/libexec/ssh/sftp-server、sshd-configは/usr/etc/ssh/sshd_configに置いたらしくってとりあえず/usr/etc/ssh/sshd_configの
```
#Subsystem sftp /usr/libexec/ssh/sftp-server
Subsystem sftp internal-sftp
```
を修正した。改善されませんでした。
そして/etc/ssh/sshd_configを開くと、
```
Subsystem sftp /usr/lib/ssh/sftp-server
```
が書かれています。しかしTumbleweedの/usr/libにsshというdirectoryが存在しません。
ここを
```
Subsystem sftp internal-sftp
```
に修正して
```
sudo systemctl restart sshd
```
でsshdを再起動したら、sftpもFileZillaも使えるようになった。
# まとめ
SSHサーバーの設定ファイルは/usr/etc/ssh/sshd_configではなく/etc/ssh/sshd_configです。
Tumbleweedのopensshはsftp-serverを/usr/libexec/ssh/sftp-serverにインストールした。
sftpのエラーコードが127の場合、/etc/ssh/sshd_configのSubsystem sftpを/usr/libexec/ssh/sftp-server（package managerでsftp-serverの場所を特定できる時はその場所）もしくはinternal-sftpに指定すれば解決できるかもしれません。
Android Studio で Geminiアプリ を作成して実機で動作確認してみる

## はじめに

Androidアプリの開発は、技術の進歩とともによりアクセスしやすくなっています。特にAndroid Studioは、開発者にとって非常に強力なツールです。この記事では、Android Studioを使用してGeminiアプリを作成し、実機での動作確認をする方法について、詳しく説明します。

大まかな流れはこちらの記事を参照してください。

https://note.com/npaka/n/n6fc43df9baf4

---

こちらの記事もおすすめ

https://hamaruki.com/llm-bot-gen-made-with-gpts-gas-and-gemini-pro/

https://hamaruki.com/automatic-generation-of-qa-database-using-gemini-api/

## スマートフォンを開発者モードに設定する 
まず、スマートフォンを開発者モードに設定し、USBデバッグを有効にする必要があります。これは、Androidデバイスにアプリをインストールし、デバッグするための基本的なステップです。設定は比較的簡単で、デバイスの設定メニューから「ビルド番号」を数回タップすることで開発者オプションが表示されるようになります。ここでUSBデバッグをオンにしましょう。

![file](https://hamaruki.com/wp-content/uploads/2024/01/image-1706458367838.png)

## Platform Toolsのインストール 
次に、Android Studioに付属するPlatform Toolsをインストールする必要があります。これには、デバイスと通信するために使用するadbコマンドなどが含まれています。[Android Developersの公式ページ](https://developer.android.com/studio/releases/platform-tools?hl=ja) からダウンロードできます。

![file](https://hamaruki.com/wp-content/uploads/2024/01/image-1706458466546.png)

https://developer.android.com/studio/releases/platform-tools?hl=ja

## ADBコマンドでデバイスの確認 
ADB（Android Debug Bridge）は、Androidデバイスと通信するための多機能コマンドラインツールです。このツールを使用してアプリをデバイスにインストールしたり、ログ情報を確認したりすることができます。[Android Developersの公式ページ](https://developer.android.com/studio/run/device?hl=ja) には、ADBコマンドの使用方法が詳しく記載されています。

```bash

C:\Users\>adb devices
List of devices attached
JHipdPKP20220103500     device
```

https://developer.android.com/studio/run/device?hl=ja

## Android Studioを日本語化する 
もし英語が苦手なら、Android Studioを日本語にすることができます。これには、Japanese Language Pack / 日本語言語パックの233.199を[こちら](https://plugins.jetbrains.com/plugin/13964-japanese-language-pack------/versions/stable) からダウンロードし、インストールします。

https://plugins.jetbrains.com/plugin/13964-japanese-language-pack------/versions/stable

プラグインからダウンロードします。
![file](https://hamaruki.com/wp-content/uploads/2024/01/image-1706458502904.png)

詳細はこちら

https://gihyo.jp/assets/files/book/2021/978-4-297-12138-9/download/InstallJapanesePlugin.pdf


## SDKのAPIレベルを揃える 
開発するアプリの対象となるAndroidのバージョン（APIレベル）を選択することが重要です。

![file](https://hamaruki.com/wp-content/uploads/2024/01/image-1706458589607.png)

>特にXiaomiのような特定のデバイスでは、SIMカードがないと一部の機能が利用できない場合があるため、注意が必要です。



## システムプロンプトの調整 

>D:\GoogleGenerativeAISampleforAndroidKotlin\app\src\main\kotlin\com\google\ai\sample\feature\text\SummarizeViewModel.kt

```kotlin

...

    fun summarizeStreaming(inputText: String) {
        _uiState.value = SummarizeUiState.Loading

        val prompt = """
            あなたは優秀なアシスタントの雪彦（ゆきひこ）です。
            常に雪彦（ゆきひこ）になりきって回答してください。
            雪彦（ゆきひこ）は男性キャラクターで、数学の天才です。
            彼は雪の結晶を連想させる幾何学模様の着物を身にまとい、複雑な数学的理論とその応用に夢中です。
            彼は数学の論文を読むことで、新しいアルゴリズムや理論を考案します。
            
            質問に答えてください。: $inputText
        """.trimIndent()
		
		...
		
```

## Android Studioからアプリをインストール 

最終的に、作成したアプリをAndroid Studioから直接デバイスにインストールし、動作確認を行います。これにより、アプリが想定通りに機能するかどうかを確認できます。

![file](https://hamaruki.com/wp-content/uploads/2024/01/image-1706458736019.png)

![file](https://hamaruki.com/wp-content/uploads/2024/01/image-1706458828004.png)


## 参考サイト
不具合調査にはDatadog RUMを使おう!

## 背景
みなさん, 不具合調査で困ったり時間がかかったりしていませんか?
例えばこんな報告です.
「不具合報告です. 〇〇画面の××機能ですが, 正しく動いていないようです. ユーザーIDは△△です.」

そして, こう思ったりします.

* もしかしたら仕様を理解していなくて勘違いしているかも?
* どういう動線で操作したのかな?
* ブラウザのバージョンが古かったりする?

などなど...

実際に操作している画面や, 周辺情報が見れればいいのに...
と思った方!

RUMを活用して悩みを解決しましょう!!

## RUMの導入
私はDatadogをずっと利用していて好きです.
結構前なのでUIが古いですが, 導入は下記を参照にしてください.

https://qiita.com/KawamotoShuji/items/fe93e443f5a62a1e8446

公式は下記です.
https://docs.datadoghq.com/ja/real_user_monitoring/browser/

## どういう状況で導入するのが良いか
個人的な見解ですが,
*  **不具合が多くて解決までの時間を短縮したい**
* **新機能をリリースした後**
* **ユーザーの画面をどうしても見ないと解明できない不具合がある**
といったときに効果を発揮すると思います.

安定運用できていてそもそも不具合が少ない場合には, 
「発生した時には刺さるけど, 普段あんまり恩恵感じないかな」
となるかなと思います.

### RUMの料金高い問題
多分どこでも話に上がるのが, RUMの料金が高いということ.
なので, 上記で書いたようなタイミングのSPOTで利用すると良いかもです.
例えば, 新機能リリースした時だけサンプルレート100%にして、
安定して不具合なくなったら減らすとかでいい気がします.

サンプルレートの調整は下記を参照にすると良いです.

https://docs.datadoghq.com/ja/real_user_monitoring/guide/sampling-browser-plans/

## 得られるメリット

### デバイス情報やブラウザのバージョンが見れる
各セッション詳細の中に `Attributes` という項目があり,
そこをクリックして確認できます.
これにより, ユーザーに使っているデバイス情報やブラウザのバージョンをヒアリングする必要がなくなります.
結果として, 担当者とのやりとりが減ることで工数削減になります.

![スクリーンショット 2024-01-29 0.26.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180668/1c4ce096-a352-74ad-366e-d3e73ee46cb7.png)

## 動画により実際の操作を確認できる
実際の操作, アクション, イベントを確認することができるので,
具体的な操作のヒアリングをする必要がなくなります.
APMも活用していれば, 同じ時間帯でのリクエストと照らし合わせて調査もできます.

![スクリーンショット 2024-01-29 1.24.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180668/012b12c0-b5c8-fad1-2c06-4aff1df43c86.png)

## まとめ
新機能をリリースしたばかりで不具合が多く出る状況や, 
不具合の原因解明までの工数を削減したい場合の一手として役に立ちます.
スポットでも良いので, 導入してみる価値はあると思います.
ChatGPT APIで肥大化したプロンプトによるハルシネーションへの対策

# 概要
ChatGPT APIを活用したアプリケーションでは、要件が複雑化することで、**システムプロンプトが肥大化**していくことがあります。
しかしプロンプトが肥大化すると、**ハルシネーションの起きる可能性が上がり**、思ったような精度が出なくなってくることがあります。

以下を意識してプロンプトを改善させることで、**精度向上できる可能性**があります

1. FunctionCallingを使って処理の分岐を行う
2. １つのプロンプトには1つの命令に留める
 

# 精度が落ちるプロンプトとは

例えば、あなたの作っているアプリでは以下のようなシステムプロンプトのようになっていないでしょうか？


```
あなたはXXXです。

ルール:
Aの時は、Xしてください。
Bの時は、Yしてください。
Cの時は、Zしてください。

# Bの時は以下のデータを使ってください
<RAG用のデータ>

日本語で回答してください。嘘はつかないでください。etc etc...
```

このようなプロンプトは、以下の理由で思ったような振る舞いをしてくれないことが多いです。

1. 複数のことを同時に命令することで**指示が混ざってしまう**
2. 文章が長いことでLLMが**命令の一部を無視**することがある

GPTsの場合はこの方法でしか書くことができないことやGPT4であるためあまり問題になることはないですが、APIを使う場合は**GPT3.5**を使うことが多いと思います。そのような時は特に問題が発生しやすいです。

## 改善① FunctionCallingを使って処理の分岐を行う
一度に複数のことを同時に命令することでLLMがハルシネーションを起こしてしまう可能性が高まるため、まず前段でFunctionCalling(もしくはJSON Modeでの判定)を行い、**ユーザの意図で処理の分岐**を行いましょう。

```
ユーザの意図がどれであるかをJSONで出力してください。

A: Aの説明
B: Bの説明
C: Cの説明

Response: {type: A or B or C}
```

これにより、前段でユーザ意図を把握して**処理の分岐**を行うことができます。

## 改善② 分岐した先で1つの命令に留めたプロンプトを実行する
例えば、前段でユーザの意図がAであるとわかった場合は、以下を実行します。

```
Xしてください。
```

ユーザの意図がBであるとわかった場合は、以下を実行します。

```
Yしてください。

# 以下のデータを使ってください
<RAG用のデータ>
```

このように場合分けをしたことによって、その後に実行する**プロンプトの文字数を最小化させ、単一命令**にすることができます。

# まとめ
**「長い」「命令が複数書かれている」プロンプト**を、**「短くて」「単一の命令が書かれている」プロンプト**に書き換えることでハルシネーションのリスクを抑えることができます。
精度が問題になっている場合は、プロンプトが肥大化していないか確認してみましょう。


生成AIを専門にシステム開発やコンサルティングをやっています。興味があればご連絡ください。

https://corp.langcore.org/
【Unity】ノーコードでサイコロアプリを作ってみる（統計 表示）

# これはなに？
Unity初心者がサイコロアプリを作るまでの過程をまとめた記事になります
アセット以外のところは、ビジュアルスクリプティングを利用して作成したいと思います

# 作ってみる
今回、作っていくのはコチラ
- 統計を表示する

ノーコードで作るのに、結構複雑になってしまったので更新と表示の説明をわけようと思います

完成した画面はコチラになります

![StatsView.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266407/dbed4149-8b85-cb23-8ecf-f58632fb5bba.png)

## 統計を表示する

グラフの表示の最大値を100％にして表示します

### やること
- ScrollViewを作成する
- Panelを作成する
- ビジュアルスクリプティング
    - 統計パネルを更新する
    - 統計パネルのスライダーを調整する

#### ScrollViewを作成する

別の記事で書いた履歴と同じように作ります

https://qiita.com/acronhub/items/7fa83565ffdd05576605#scrollview%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B

#### Panelを作成する

プレハブ化したPanelオブジェクトを作成します
「ヒエラルキー」パネルで、UI > Panelを選択して作成します

完成形のPanelはコチラになります

 ![StatsPanel.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266407/248c3253-124b-3dbe-a313-08c2645d7389.png)

- Panelオブジェクト
  - DiceValue: `UI > Text (TextMeshPro)` を選択して作成します
  - Count: `UI > Text (TextMeshPro)` を選択して作成します
  - Slider: `UI > Slider` を選択して作成します
    - `Handle Slide Area`はメモリのツマミなので削除しました
    - `Fill Area` の Rect Transformの`Left`と`Right`を0にします
    ![StatsFillArea.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266407/d8fdc7f8-26e7-edc5-5034-5bc65307edeb.png)

#### ビジュアルスクリプティング

- 統計パネルを更新する
  - `For Each Loop` ノードを利用します
    - Array 参照元は`Get Variable`ノードで取得します
    - Output Value: パネルオブジェクトが取得できます
- 出た出目に関係するパネルだけ更新します
  - パネル内のTextを更新
    - `Last Item`ノードで出目を取得します
    - `Transform Find`ノードでパネル内のTextオブジェクトを取得します
    - `if`ノードを使って出た出目のパネルだけを更新します
      - `Text Mesh Pro UGUI Set Text`ノードで回数のテキストを更新します

![StatsGraphView.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266407/80c01429-6011-af2f-646e-2eb9a9a7372e.png)

- 統計パネルのスライダーを調整する
  - `For Each Loop` ノードを利用します
    - Array 参照元は`Get Variable`ノードで取得します
    - Output Value: パネルオブジェクトが取得できます
  - パネル内のTextを更新
    - `Transform Find`ノードでパネル内のSliderオブジェクトを取得します
      - パネルの出目の回数と、出目の最大数で計算をしてスライダーの値を調整します

![StatsGraphView2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266407/6434adfe-d098-6a11-244f-a369cff64c14.png)

## さいごに
これまで出た出目の最大出現数が、グラフの最大値になるのでゲージの長さを固定できました

## 連載記事

https://qiita.com/acronhub/items/a46c6f5c16c4d262728c

https://qiita.com/acronhub/items/ccbdda267de28730d68e

https://qiita.com/acronhub/items/25d626d7ae2956942735

https://qiita.com/acronhub/items/7fa83565ffdd05576605

https://qiita.com/acronhub/items/7c3a39d384c0b6ea277c

https://qiita.com/acronhub/items/c273a54507b07a5937e3
Java Silver対策- 忘れがちなこと

# Javaの言語仕様で忘れがちなこと
近々Java Silverの資格試験を受けるということで自分が覚えてない or 間違えやすいことについてまとめます。

## アンダースコアを使った整数リテラル
* リテラルの先頭と末尾には使用できない。
* 記号(. , L , F0b, 0x etc.)の前後には記述できない。**8進数を表す0の前後はOK**。
```java
int a = 1_200_0;
int b = 0_7145;
```


## char型変数に代入することができるリテラル
* 文字リテラル(シングルクオーテーションで囲う）。
* シングルクオーテーションで囲った\uから始まるUnicode番号(16進数4桁)
* 0から65535までの数値リテラル。
```java
char a = 'a';
char b = '\u1111';
char c = 65535;
```


## 識別子の命名規則
* 予約語は使えない。
* 使える記号はアンダースコアと通貨記号のみ。
* 数字から始めてはいけない。
```java
int a1;
int $a;
int _a;
```

## 型推論のルール
* 初期化必須。null初期化不可。
* 配列の初期化式不可。
* ArrayListは可。
* メソッドの引数不可。
```java
var a = new ArrayList<> //Object型で初期化される。
```


## mutableなクラスのキャパシティ
* ArrayListの初期キャパシティは10
* StringBuilderの初期キャパシティは初期化された文字数+16

## switch文
### switch文の条件式が戻せる型
* int型以下の整数型とそのラッパークラス
* 文字と文字列
* 列挙型

### case値として使用できる値の条件
*  条件式が戻す値と同じ型か互換性がある型
*  定数であるか、コンパイル時に値を決めることができること
*  nullでないこと

## for文の初期化文、条件文、更新文
* 複数の文を記述できるのは初期化式と更新文のみ、 ”, "で区切って複数記述できる。
* 条件文は論理演算する必要がある。

```java
for(i=0, j=0; i<5 || j<4; i++, j++){
```


## 配列型変数
### 宣言
* データ型の後ろ
* 変数名
* 上記両方
* 宣言時変数の[]に要素数の指定は不可。
```java
int[] a; //1次元配列
int a[]; //1次元配列
int a[][]; //2次元配列
int[] a[]; //2次元配列
```

### 配列オブジェクトの生成方法
* newによるオブジェクト生成時は要素数の指定が必要。
* int型による要素数の指定が必要。
* 多次元配列の場合、最低1次元目のみ要素数の指定が必要。
```java
int[] a = new a[3];
int[][] b = new a[2][];
```

### 初期化
* 初期化子( {} )を使うと、配列オブジェクトの生成と初期化、参照の代入を一気に行うことができる。
* 初期化子はnewと一緒に使うこともできる。
* 初期化子をnewと同時に使う場合、要素数は自動計算される。[]の要素数を記述してはいけない。
* 初期化子とnewを同時に使う場合、変数で定義された次元数とあった[]を記述する必要がある。
* 初期化子を使う場合、次元数がわかる表記が同じ文中に存在する必要がある。基本的に宣言と分けて初期化子を使わないほうがわかりやすい。

```java
int a[] = new int[3];
int b[] = {1,2,3};
int d[] = new int[]{1,2,3};
int e[] = new int[]{};
int f[][] = new int[][]{}
int g[];
g = new int[]{1,2,3};
```

## 可変長引数
* 可変長引数は配列と同様のアクセスができる。
* 引数の型のと直後に...を記述
* 可変長引数以外の引数を受け取る場合、可変長引数を最後の引数にする。
```java
void method1(int... num){};
void method2(String text, int... num){};
```

## 到達不可能なコード
到達不可能なコードを書くと普通にコンパイルエラーになる。

## 初期化子、static初期化子
* 初期化子を使うとコンストラクタが実行される前に処理を実行できる。
* クラスブロック直下に記述する。
* static初期化子を使うことでstaticなフィールドの設定も可能。
```java
public class Test{
    {
    //do something
    }
```


## デフォルトコンストラクタ
* デフォルトコンストラクタはコンストラクタを明示的に定義しないときにのみ自動的に追加される。

## コンストラクタの呼び出し
* コンストラクタ内でthisを使ってコンストラクタを呼び出す場合、先頭に記述する必要がある。
```java
public class Test{
    public Test(){
        this("test1");
        System.out.println("test2");
    }
    public Test(String str){
        System.out.println(str);
    }
}
```


## インターフェースでのオーバーライド
* Objectクラスメソッドのオーバーライドはコンパイルエラーになる。
* デフォルトメソッドをオーバーライドしたメソッドからデフォルトメソッドを呼び出す場合、インターフェース名.super.メソッド名で呼び出す。
* 二つ以上の実現や継承の改装をまたいで呼び出しはできない。
```java
interface A {
    default void a(){
        //do something
    }
}

interface B extends A {
    default void b(){
        //do something
    }
}

public class Test implements B{
    B.super.b(); //Aは呼び出すことができない
}
```

## オーバーライドの条件
* シグニチャが同じであること（メソッド名、引数リストの型、数、順番)
* 戻り値は強制戻り値を使うことで、サブクラスの型を戻すメソッドをオーバーライドとして使うことができる。
* インターフェースで宣言されている抽象メソッドは必ずしも実装先で実装される必要はない。継承先で実装関係になくても、同じシグニチャのメソッドが宣言されている場合、実装されていると判断される。
dnf コマンドコピペ元 

- dnfコマンドで使うたびにググっているようなものをまとめてコピペできるようにしておく。逐次追加予定
- 自分が使うシチュエーションでは大抵sudoが必要なので、コピペしやすいようにsudoを付ける

# 公式ドキュメント
より正確な情報をお求めの方はこちらを参照しましょう
- 公式ドキュメントのコマンドリファレンス
    - https://dnf.readthedocs.io/en/latest/command_ref.html
- RedHatが容易しているコマンドリファレンス
    - https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/9/html/managing_software_with_the_dnf_tool/assembly_yum-commands-list_managing-software-with-the-dnf-tool

# コマンド一覧
## パッケージの依存関係を調べる
```sh
sudo dnf deplist packagename
```
https://dnf.readthedocs.io/en/latest/command_ref.html#deplist-command

## インストール
```sh
sudo dnf install packagename
```
- 途中の確認で　`y` を押す必要が無い場合は `-y` オプションをつける

https://dnf.readthedocs.io/en/latest/command_ref.html#upgrade-command

## 利用可能なリポジトリのインストール可能なパッケージ一覧
```sh
sudo dnf list --available
```
https://dnf.readthedocs.io/en/latest/command_ref.html#search-command

## インストール済みパッケージ一覧
```sh
sudo dnf list --installed
```
https://dnf.readthedocs.io/en/latest/command_ref.html#search-command

## アンインストール
```sh
sudo dnf remove packagename
```
https://dnf.readthedocs.io/en/latest/command_ref.html#search-command

## インストール済みパッケージの詳細を参照する
```sh
dnf repoquery --info --installed package_name
```
https://dnf.readthedocs.io/en/latest/command_ref.html#repoquery-command

## パッケージを探す
```sh
sudo dnf search packagename
```
https://dnf.readthedocs.io/en/latest/command_ref.html#search-command

## アップデート
```sh
sudo dnf upgrade packagename
```
https://dnf.readthedocs.io/en/latest/command_ref.html#upgrade-command


# 参考
- 公式ドキュメントのコマンドリファレンス
    - https://dnf.readthedocs.io/en/latest/command_ref.html
- RedHatが容易しているコマンドリファレンス
    - https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/9/html/managing_software_with_the_dnf_tool/assembly_yum-commands-list_managing-software-with-the-dnf-tool

## おまけ
- yum と dnf の違い
    - https://dnf.readthedocs.io/en/latest/cli_vs_yum.html#skip-broken
ReactRouterのVersion違いによってはまった話

<h1>事前情報</h1>
業務でReactを使う機会が出たため、2021年あたりの教材を用いて勉強を開始しました。しかし、表題のエラーに四苦八苦したため備忘録として残しておきます。

<h1>環境</h1>

<h3>学習教材</h3>

- ruby: 2.7.0
- rails: 6.1.4.1
- react: 17.0.1
- react-router-dom: 5.2.0

<h3>ローカル環境</h3>

- ruby: 3.0.2
- rails: 7.1.3
- react: 18.2.0
- react-router-dom: 6.21.3

※一部抜粋
<h1>エラー内容</h1>

実装コード Sample.js
```
import { Switch, Route, Link } from 'react-router-dom'
~~(省略)~~
function Sample() {
  return (
~~(省略)~~
      <Wrapper>
        <Switch>
          <Route exact path="/samples" component={SampleList} />
          <Route exact path="/samples/new" component={AddSample} />
          <Route path="/samples/:id/edit" component={EditSample} />
        </Switch>
      </Wrapper>
~~(省略)~~
```

画面表示したときに下記エラーが出た。
`Uncaught Error: Element type is invalid: expected a string (for built-in components) or a class/function (for composite components) but got: undefined. You likely forgot to export your component from the file it's defined in, or you might have mixed up default and named imports.`
```Check the render method of `Sample`.```

<h1>原因</h1>
React Router v5→v6へのVersionUpにより、ルートやコンポーネントの指定が下記の通り変更されていた。<br>
以下、コードの修正版を参考までに載せるが、変更箇所は下記の通り。

- react-router-domのimport文では`Switch`ではなく`Routes`を指定し、`<Switch>`を`<Routers>`に変更。
- コンポーネントの指定を`component={コンポーネント名}`ではなく、`element={<コンポーネント名 />}`で指定する。

```
import { Routes, Route, Link } from 'react-router-dom'
~~(省略)~~
function Sample() {
  return (
~~(省略)~~
      <Wrapper>
        <Routes>
          <Route exact path="/samples" element={<SampleList />} />
          <Route exact path="/samples/new" element={<AddSample />} />
          <Route path="/samples/:id/edit" element={<EditSample />} />
        </Routes>
      </Wrapper>
~~(省略)~~
```

<h1>まとめ</h1>
勉強する場合はVersionの違いに気を付けようということでした...<br>
GithubCopilotも使っていたんですが、回答を見てもどこもおかしなところがなく完全にはまってしまいました。Versionの違いも入れて質問すればよかったといまさらながら思いました。<br>
コメント、指摘あればいただければ幸いです。
[Vue3] composable　の使い方 

## はじめに
- 記事の概要
Vue3 内でのcomposableの使い方の備忘録
基本的には公式ドキュメントをみれば大丈夫
- 対象
すでにVue3環境の動作が可能なユーザー
- 記事執筆の背景
コンポーネント内のコード量が気になったので、composableを使用して対象の変数、対象の関数をまとめて管理した
## 実現したいこと
- 複数のコンポーネント内で使用されるリアクティブ変数とリアクティブ変数を制御する変数を別ファイルで管理する。

## 開発環境
下記のモジュールをインストールする。
```json:package.json
"devDependencies": {
    "@mdi/font": "^7.4.47",
    "@storybook/addon-essentials": "^7.6.7",
    "@storybook/addon-interactions": "^7.6.7",
    "@storybook/addon-links": "^7.6.7",
    "@storybook/blocks": "^7.6.7",
    "@storybook/test": "^7.6.7",
    "@storybook/vue3": "^7.6.7",
    "@storybook/vue3-vite": "^7.0.2",
    "@vitejs/plugin-vue": "^4.0.0",
    "axios": "^1.6.5",
    "laravel-vite-plugin": "^0.7.2",
    "react": "^18.2.0",
    "react-dom": "^18.2.0",
    "sass": "^1.26.5",
    "sass-loader": "^8.0.2",
    "storybook": "^7.0.2",
    "swiper": "^11.0.5",
    "vite": "^4.0.0",
    "vue": "^3.2.47"
  }
```
- 注意事項
 @storybook*,react*は無関係
## セットアップ
- 開発環境のセットアップ方法
管理しやすくするために以下のエイリアスを追加
``` js:vite.config.js内
resolve: {
        alias: {
          "@composables": fileURLToPath(new URL("./resources/js/composables", import.meta.url)),
        },
    },
```
## 使い方
使い方
- 1.composable ファイルの作成
``` js:resource/js/composable/useActiveIndex.js
import { ref, watch } from 'vue'
// note activeIndexは現在何ページ目にいるかのページ数 
// goNextPage goPreviousPage　はページの行き来のための変数 buttonにイベントを紐づけて使用
// nextPage , previousPageはページの移動が可能であるかを計算するフラグ

export function useActiveIndex(length) {
  const activeIndex = ref(0)
  const nextButtonFlag = ref(false);
  const previousButtonFlag = ref(false);
  nextPage()
  previousPage()
  watch([activeIndex], () => {
    nextPage();
    previousPage();
  });


  function goNextPage() {
    if (!(activeIndex.value + 1 > length - 1)) {
      activeIndex.value += 1;
    }
  }
  function goPreviousPage() {
    if (!(activeIndex.value - 1 < 0)) {
      activeIndex.value -= 1;
    }
  }
  function nextPage() {
    var flag = true;
    if ((activeIndex.value + 1 > length - 1)) {
      flag = false;
    }
    nextButtonFlag.value = flag;
  }
  function previousPage() {
    var flag = true;
    if ((activeIndex.value - 1 < 0)) {
      flag = false;
    }
    previousButtonFlag.value = flag;
  }

  return { activeIndex,nextButtonFlag,previousButtonFlag,goNextPage,goPreviousPage }
}
```
- 2.composableを使用するページ
``` js:resource/js/component/test.vue
import { useActiveIndex } from '@composables/useActiveIndex.js'
const {activeIndex,nextButtonFlag,previousButtonFlag,goNextPage,goPreviousPage} = useActiveIndex(mockProps.length);
```
Serverless FrameworkとTerraformの責任分界点

# 概要

Lambdaアプリケーションを構築する上では、Terraform以外に [Serverless Framework](https://www.serverless.com/) や [AWS SAM](https://aws.amazon.com/serverless/sam/) といったフレームワークを使うことがあります。
メタップスホールディングスではLambdaのアプリケーション開発にServerless Frameworkを使うことが多いのですが、インフラを構築する上で、Terraformとの使い分けはどうするべきか、という課題が度々発生します。
今回は弊社のプロダクト開発におけるフレームワークの使い分けについて、一例を紹介したいと思います。

# Terraformの利点

TerraformはInfrastructure as Code  (IaC) の中でもとりわけ人気が高く、多数のクラウドプロバイダーに対応しており、デプロイメントやプロビジョニングを自動化できる利点があります。
弊社のSREチームもAWSを始め、DatadogやGitHub、PagerDutyなど様々なプロバイダーをコード化する上で利用しています。

Terraformはインフラ構築に特化している反面、Lambda関数はビルドパイプラインを通してデプロイすることが多く、TerraformとLambda関数のCI/CDプロセスとの統合における課題が存在します。

# Serverless Frameworkの利点

Serverless Frameworkはサーバレスコンピューティングモデルのアプリケーション開発とデプロイメントを最適化するフレームワークであり、豊富なプラグインに加えコントリビューターも多く、非常に人気のあるOSSツールです。
Lambdaの構築を始め、トリガーとなるAPI GatewayやSQSなど関連するリソースをYAMLベースで定義・構築できる利点もあります。

しかしその反面、Lambdaに関連する全てのリソースがServerless Frameworkでサポートされている訳ではなく、Lambda以外のAWSリソースの管理にはCloudFormationテンプレートの補足が必要となる場合があります。
また、あくまで「Lambdaアプリケーションの開発」を起点としたフレームワークであるため、Lambda以外のサーバーレスアーキテクチャの構築 (Fargate、Serverless Application Repositoryなど) には不向きというポイントもあります。


# どう使い分けるべきか

結論から述べると、Serverless FrameworkとTerraformは適材適所で使い分けることができます。

私たちのSREチームでは現在新規プロダクトを開発中ですが、イベント駆動アーキテクチャを基軸として次のようなインフラ構成のアプリケーションを構築しています。

![インフラ構成図-2024_01 (Qiita用).drawio (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27454/7df39a79-114d-1b05-b89d-b7cfe29731d9.png)

Lambda以外にもAPI GatewayやKinesis、EventBridgeなど様々なサービスが登場しますが、ここで重要な点は、内枠で囲ったコンポーネントはシステムの中で単独のマイクロサービスとして動作する点です。
この設計により、マイクロサービスはTerraformから独立して開発、デプロイ、スケーリングが可能となります。

仮に全てのリソースをTerraformで定義した場合は次のようなメリットも考えられます。

* アプリケーションコードとインフラを (ほぼ) 分離できる
* Terraformのリソースをモジュール化することで、他のプロダクトでもコードを流用することができる
* 将来的にアプリケーションを別のフレームワークに移行する際、インフラリソースへの影響がない

実際に一部のリソースをTerraformに移行することも検討しましたが、EventBridgeやKinesis、IAMロールなどのリソースはアプリケーションと密接に連携するため、分離した場合のメリットが希薄化し、Serverless Applicationに集約したほうがメリットが大きいという結論に至りました。

尚、DocumentDBやS3などのデータストアは他のサービスと連携する可能性がある観点から、Serverless Frameworkの管理対象外とし、Terraformで実装しています。
また、図中では記していませんが、アプリケーションのフロントエンドを提供するAmplifyやCloudFront、VPCといったインフラ基盤となるリソースも全てTerraformで管理しています。

# 結論

Serverless FrameworkやAWS SAMといったフレームワークを利用する場合、どこまでフレームワークでリソースを管理するべきか、Terraformとの境界線が曖昧となることがあります。

システム構成やアプリケーションの規模にもよりますが、システムを構成するコンポーネントをマイクロサービスの単位で切り出し、サービスが機能する上で依存関係のあるリソースはフレームワークに集約させ、他のサービスに影響を与えるリソースや、インフラ基盤 (ネットワーク・データストアなど) に関わるリソースをTerraformなどのIaC基盤に分離する構成は運用面で利便性が高いかなと思います。
SwiftDataをCloudKitで使う場合に気をつけること

# 困ったこと
プロジェクト作成時に`SwiftData`と`Host in CloufKit`を選択して開発を始めました。

<img width="300" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631585/aef87c0e-70a3-afe3-2958-2eaa016a7aa8.png">

いざ`CloudKit`を設定してリリースしようと

<img width="300" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631585/f0531297-af28-a282-9ca0-aff43c62b983.png">

Containersを新規作成して追加しましたが、アプリがクラッシュ（`ModelContext`の初期化に失敗）するようになりました。

<img width="300" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631585/091f56b1-8ee5-003a-5383-ce6659108652.png">

```swift
Thread 1: Fatal error: ModelContext initialization failed: SwiftDataError(_error: SwiftData.SwiftDataError._Error.loadIssueModelContainer)
```

# 環境
Xcode 15.1

# 解決方法

エラーをしっかり見るとわかりました。

```swift
Unresolved error loading container Error Domain=NSCocoaErrorDomain Code=134060 "A Core Data error occurred." UserInfo={NSLocalizedFailureReason=CloudKit integration requires that all attributes be optional, or have a default value set. 
```

> CloudKitの統合では、すべての属性をオプションにするか、デフォルト値を設定する必要があります。

とのことです。

```swift
@Model
final class Student {
    var nameKanji: String = ""
    var nameKana: String = ""
    var memo: String = ""
    var isSchoolYear: Bool = false
    var birthDay: Date = Date()
    var category: CategoryColor = CategoryColor.gray
    ...
}
```

`@Model`としたclassのすべての値にデフォルト値を設定したら`CloudKit`を使ってのビルドもできました🎉


# 参考
https://zenn.dev/yumemi_inc/articles/2a929c839b2000

https://zenn.dev/himara2/articles/88d4d873d4078d
Docker + MySQL 文字化け対策

## はじめに
Docker + MySQLで文字化けが発生した際に色々とハマってしまったのでメモとして残しておく。

## ディレクトリ構成
```
docker_mysql
  ├──docker-compose.yml
  ├──mysql
  │    ├──data　#永続化用のマウント先
  │    ├──init.sql　#初期データ投入SQL
  │    ├──my.cnf　#my.cnf
```

## docker-compose.yml / my.cnf
```docker-compose.yml
version: '3'

services:
  mysql:
    image: mysql:8.0
    command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci --skip-character-set-client-handshake
    volumes:
      - ./mysql/data:/var/lib/mysql
      - ./mysql/init.sql:/docker-entrypoint-initdb.d/init.sql
      - ./mysql/my.cnf:/etc/mysql/conf.d/my.cnf
    ports:
      - "3307:3306"
    environment:
      MYSQL_DATABASE: db_01
      MYSQL_ROOT_PASSWORD: root
      MYSQL_USER: test
      MYSQL_PASSWORD: test
      TZ: Asia/Tokyo
```

```my.cnf
[mysqld]
character-set-server = utf8mb4
skip-character-set-client-handshake
collation-server = utf8mb4_general_ci
init-connect = SET NAMES utf8mb4

[mysql]
default-character-set=utf8mb4

[client]
default-character-set=utf8mb4
```

## 参考
https://qiita.com/Asaiii12/items/69e4420d06d91374428a

https://qiita.com/jpskgc/items/7d3aee790246a42a975b

https://ja.stackoverflow.com/questions/39585/dockerで建てたmysqlサーバから取得した文字をブラウザで表示すると文字化けする

https://satoshi-moriya.com/docker-mysql-japanese-character-encoding-fix/
AWS Certified Cloud Practitioner（CLF-C02）に合格した話

# はじめに
2024年1月下旬にAWS Certified Cloud Practitioner（CLF-C02） を受験し739点で合格したので、合格までに何をやったのかまとめてみます。

# 試験当日までにやったこと
AWS Certified Cloud Practitioner合格者の方にどのような勉強を行ったのかお聞きして、実際にやったことは基本的に下記2点です。

1. [一夜漬けAWS認定クラウドプラクティショナー直前対策テキスト[第2版]](https://www.amazon.co.jp/%E4%B8%80%E5%A4%9C%E6%BC%AC%E3%81%91AWS%E8%AA%8D%E5%AE%9A%E3%82%AF%E3%83%A9%E3%82%A6%E3%83%89%E3%83%97%E3%83%A9%E3%82%AF%E3%83%86%E3%82%A3%E3%82%B7%E3%83%A7%E3%83%8A%E3%83%BC%E7%9B%B4%E5%89%8D%E5%AF%BE%E7%AD%96%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88-%E7%AC%AC2%E7%89%88-%E5%B1%B1%E5%86%85%E8%B2%B4%E5%BC%98/dp/4798067156/ref=pd_lpo_sccl_1/358-8478370-3999259?pd_rd_w=vXWLu&content-id=amzn1.sym.c9d355d3-7242-4c45-8731-d024dd5a0fb6&pf_rd_p=c9d355d3-7242-4c45-8731-d024dd5a0fb6&pf_rd_r=P1CZJ9102Z78R9VNH5QT&pd_rd_wg=Go0jb&pd_rd_r=aba861d8-a7f3-4d0a-b39f-7de925d539ff&pd_rd_i=4798067156&psc=1)
    1. 第九章までざっと通読
    1. 第十章の練習問題を解く
1. Web問題を解く

まずは1の本をざっと通読し内容をざっと頭にいれました（大体2日位）。その後、本の練習問題を100%の正答率に仕上げました（ここも大体2日位）。最後にweb試験をひたすら解きました（大体1日弱位）。

試験日前日web問題解いている際に、C02に対応した参考書を読んでいないことに気づきましたが、web問題でカバーできていると信じて当日試験に臨みました。

正直受かっているかは五分五分だったんですが、なんとか無事合格することができました。

# おわりに
試験を通して、AWSのサービスや原則等に関する知識を体系的に勉強でき、知識を広げることができたと思います。勉強している際に、こんなAWSのサービスがあったんだ、よく耳にしていたサービスはこんな役割があったんだと感じることが多かったです。この調子で次はAWS SAA合格に目指して頑張っていこうと思います（応用情報技術者試験の後になりますが...）。
Dockerのbuildキャッシュが気づいたらすごく増えていたので削除したい

dockerのbuildキャッシュが気づいたらすごく増えていたので削除したい

以下と状況が大変よく似ている

> https://qiita.com/hyt-sasaki/items/e2cbc4cfb5ae698de498
> Dockerfileのbuildをしているとno space leftなるエラーが発生してしまいました。
> docker system dfでDockerが使っているストレージ容量を確認したところBuild cacheがやたらに大きいことが判明。

具体的には、ルートボリュームのdisk容量が以下のようにほぼ100%であるが、`${HOME}`以下はあまり容量が支配的ではなく不思議な状況であった。

```
$ df -h
Filesystem      Size  Used Avail Use% Mounted on
...
/dev/nvme0n1p2  916G  870G     0 100% /
...
```

```
$ du -sh
49G	.
```

`docker system df`で確認するとキャッシュ等がすごく多くのサイズを占めていた

```
$ docker system df
TYPE            TOTAL     ACTIVE    SIZE      RECLAIMABLE
Images          120       2         293.2GB   285.5GB (97%)
Containers      2         0         445.9kB   445.9kB (100%)
Local Volumes   0         0         0B        0B
Build Cache     6139      0         548.2GB   548.2GB
```

`docker builder prune`で削除する

```
$ docker builder prune
WARNING! This will remove all dangling build cache. Are you sure you want to continue? [y/N] y
ID						RECLAIMABLE	SIZE		LAST ACCESSED
w8pqyrkq9f2a8i5txveyulhdr               	true 		81.74MB   	3 weeks ago
...
(3min)
...
sxn69jdkuh7al87bvt0cgndxu               	true 	0B        	3 weeks ago
Total:	548.2GB
```

少し減った、これで回避できるはず

```
Filesystem      Size  Used Avail Use% Mounted on
...
/dev/nvme0n1p2  916G  350G  520G  41% /
...
```

#### （追記）どうやってもBuild Cacheが残ることがあった、、

```
$ docker system df
TYPE            TOTAL     ACTIVE    SIZE      RECLAIMABLE
Images          2         0         7.834GB   7.834GB (100%)
Containers      0         0         0B        0B
Local Volumes   0         0         0B        0B
Build Cache     5732      0         741.2GB   741.2GB
```

どうも埒が明かなかったので、`systemctl restart docker`でdocker再起動して`docker system prune`実行

```
$ sudo systemctl restart docker
```

```
$ docker system prune
...
Total reclaimed space: 770.2GB
```

無事に解決した様子

```
$ docker system df
TYPE            TOTAL     ACTIVE    SIZE      RECLAIMABLE
Images          2         0         7.834GB   7.834GB (100%)
Containers      0         0         0B        0B
Local Volumes   0         0         0B        0B
Build Cache     10        0         0B        0B
```

`docker system prune`ではなく以下でも良いかもしれない

```
docker image prune -f
docker builder prune -f
```

(参考)今回、1回あたりのdockerビルドでこれくらいBuild Cacheが増えていた

```
$ docker system df
TYPE            TOTAL     ACTIVE    SIZE      RECLAIMABLE
Images          13        0         29.21GB   29.21GB (100%)
Containers      0         0         0B        0B
Local Volumes   0         0         0B        0B
Build Cache     147       35        2.808GB   0B
```

# 参考

https://qiita.com/hyt-sasaki/items/e2cbc4cfb5ae698de498
【Vite】envファイルの環境変数が読み込めなかった際の解消方法

# はじめに
ViteでReactを選択しプロジェクトを作成していた。
APIキーを環境変数として扱いたかったので`.env`ファイルを作成し、
環境変数を作成したつもりだったが、読み込みができておらずエラーが発生した。

# 結論
環境変数のプレフィックスには「REACT_APP_」ではなく、
**「VITE_」** をつける必要がある。

# 環境
- Vite: 5.0.8
- Raect：18.2
- typescript：5.2.2
- tailwindcss：3.4.1

# エラー内容
APIを叩く関数の中に環境変数に設定していたAPIキーを読み込む処理を書いていた。
関数を実行したところ、リクエストを送ることができない。
APIキーを読み込めているか確認したところ、
`undefined`で読み込めていなかった。


# 原因
Reactで環境変数を設定するにはプレフィックスに、
「REACT_APP_」をつける必要があります。
以下がその例です。

```.evv
REACT_APP_HOGE_SOME_KEY=Hello123World
```

しかし、今回はViteプロジェクトです。
以下のドキュメントを確認したところ、
Viteで作成したプロジェクトにおいては、
環境変数のプレフィックスには「REACT_APP_」ではなく、
**「VITE_」** をつける必要がありました。

https://ja.vitejs.dev/guide/env-and-mode.html

# 実施した事

プレフィックスに`VITE_`を変更。
```.evv
VITE_HOGE_SOME_KEY=Hello123World
```

この状態で再度確認したところ、問題なく読み込めておりました。
```typescript
const API_KEY: string =  import.meta.env.VITE_HOGE_SOME_KEY;
```


# 参考
https://ja.vitejs.dev/guide/env-and-mode.html
docker compose up -d でデータベースが作成されない時にやること

## はじめに
環境構築時に`docker compose up -d`でデータベースが作成されなくて、少しハマってしまったのでメモとして残しておく。
``` docker-compose.yml
version: '3'

services:
  mysql:
    image: mysql:8.0
    command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci --skip-character-set-client-handshake
    volumes:
      - ./mysql/data:/var/lib/mysql #永続化
      - ./mysql/init.sql:/docker-entrypoint-initdb.d/init.sql #初期データ投入
      - ./mysql/my.cnf:/etc/mysql/conf.d/my.cnf
    ports: #ローカルでmysqld.exeが動いているため、ホスト側のポートを3307に変更
      - "3307:3306"
    environment: #作成するDB名,ルートユーザのパスワード,DBを操作するユーザ,タイムゾーン
      MYSQL_DATABASE: db_01
      MYSQL_ROOT_PASSWORD: root
      MYSQL_USER: test
      MYSQL_PASSWORD: test
      TZ: Asia/Tokyo
```

## 手順
### 1. コンテナだけでなく、ボリュームも削除
```
docker compose down -v
```

### 2. 永続化用のディレクトリを削除（今回のケースだとdata以降）
```
rm -rf mysql/data/*
```

### 4. Dockerコンテナ起動
```
docker compose up -d
```

### 参考
https://zenn.dev/mczk9402/articles/ec42d9e35b6ddf