OmniAICreator/Qiita-1.07M huggingface dataset:
闘魂Elixir ーー AtCoder Beginner Contest 351(A)をElixirで楽しむ

<b><font color="red">$\huge{元氣ですかーーーーッ！！！}$</font></b>
<b><font color="red">$\huge{元氣があればなんでもできる！}$</font></b>

<b><font color="red">$\huge{闘魂とは己に打ち克つこと。}$</font></b>
<b><font color="red">$\huge{そして闘いを通じて己の魂を磨いていく}$</font></b>
<b><font color="red">$\huge{ことだと思います}$</font></b>


# はじめに

[AtCoder Beginner Contest 351](https://atcoder.jp/contests/abc351)を[Elixir](https://elixir-lang.org/)で解いてみます。

[AtCoder](https://atcoder.jp/)を解くのが趣味で、休憩時間に解いているという若い人がいて、それってすごい意識の高い休憩時間の過ごし方だと思って、私も真似してみることにしました。


# [AtCoderをElixirでやってみる](https://zenn.dev/torifukukaiou/articles/ac84c87736ceebf4da01)

入力の読み取り方や解答の作り方は、別の記事にまとめています。


https://zenn.dev/torifukukaiou/articles/ac84c87736ceebf4da01

ご参照くださいませ。

[Elixir](https://elixir-lang.org/)で[AtCoder](https://atcoder.jp/)を楽しむためには、エントリポイントを`Main.main/0`にする必要があります。つまり`Main`モジュールを作って、その中に`main/0`関数を定義するわけです。

# [A - The bottom of the ninth](https://atcoder.jp/contests/abc351/tasks/abc351_a)

問題はリンク先をご参照くださいませ。
私の解答を貼っておきます。


<details><summary>私の解答</summary>

_問題文を読んでいることを前提にひとこと解説をしておきます。_

野球のスコアボードを題材にした問題です。
リストの要素の足し算をすればよいわけで、[Enum.sum/1](https://hexdocs.pm/elixir/Enum.html#sum/1)関数が大活躍です。


```elixir
defmodule Main do
  def main do
    a_list =
      IO.read(:line) |> String.trim() |> String.split(" ") |> Enum.map(&String.to_integer/1)
    b_list =
      IO.read(:line) |> String.trim() |> String.split(" ") |> Enum.map(&String.to_integer/1)
    
    solve(a_list, b_list)
    |> IO.puts()
  end
  
  def solve(a_list, b_list) do
    Enum.sum(a_list) - Enum.sum(b_list) + 1
  end
end
```




</details>




---

# さいごに

[AtCoder Beginner Contest 351](https://atcoder.jp/contests/abc351)を[Elixir](https://elixir-lang.org/)で解くことを楽しみました。

あなたのお好きなプログラミング言語でお楽しみください。

---


**闘魂**とは、  **「己に打ち克つこと。そして闘いを通じて己の魂を磨いていくことである」** との猪木さんの言葉をそのまま胸に刻み込んでいます。
知っているだけで終わらせることなく、実行する、断行する、一歩を踏み出すことを自らの行動で示していきたいとおもいます。
**アントニオ猪木さんのメッセージから元氣をもらったものとして、それを次代に語り継ぎ、自分自身が「闘魂」を体現するものでありたいとおもいます。**

---

<b><font color="red">$\huge{元氣ですかーーーーッ！！！}$</font></b>
<b><font color="red">$\huge{元氣があればなんでもできる！}$</font></b>
<b><font color="red">$\huge{１、２、３ ぁっダァー！}$</font></b>
State<MyHomePage> createState() => _MyHomePageState();なに？【flutter】

Flutterでわからなかったことを自分の言葉で起こしておきます。

StatefulWidgetが状態の変化を管理するためには、Stateクラスのインスタンスが必要。`createState`メソッドは、StatefulWidgetが作成される際に呼ばれ、そのウィジェットの状態を管理するStateクラスのインスタンスを返す

`State<MyHomePage>`は、`MyHomePage`ウィジェットの状態を管理するStateクラスの型を指定しています。`=> _MyHomePageState();`は、このメソッドが`_MyHomePageState`クラスの新しいインスタンスを返す。

このコード行は`MyHomePage`ウィジェットの状態を管理するためのクラス(`_MyHomePageState`)を生成し、Flutterフレームワークにそのウィジェットの状態管理をどのように行うかを教えるものです。
日英を相互翻訳するプロンプト文

## 1. 概要
このプロンプト文は、英語を入力すると日本語に翻訳され、日本語を入力すると英語に翻訳されるものです。メールやチャットで異なる言語のやり取りを支援するために活用できます。

https://x.com/00oichan/status/1799921945397604542

## 2. 特徴や使い方
翻訳ソフトも便利ですが、誤字をそのまま翻訳してしまうことがあります。最近の生成AIを使えば、より使いやすくなります。このプロンプト文では、言語を自動判定する機能を持たせ、最新の翻訳ツールと同じような使い心地を目指しました。生成AIによく見られる「こちらが翻訳文です：」や「いかがでしたでしょうか」などの冗長な表現を避ける工夫もしています。

## 3. プロンプト文

```markdown
指示：
- 日本語が入力された場合、英語で出力してください。
- 英語が入力された場合、日本語で出力してください。
- 出力は自然な母国語の話者のように表現してください。
- 冗長な表現や不適切な言い回しは適切に修正してください。
- JTF日本語標準スタイルガイドに従い、文法的に正しい自然な文章にし、句読点を適切に追加してください。
- 不明な言葉があれば質問してください。
- (最重要要件)出力をそのままコピーペーストするので不要な情報は含めず、結果の出力のみ行ってください。

入力文：
（次のチャットでお伝えします。待機してお待ち下さい）

```

## 4. 出力の例（日→英）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/240742/e0a68d6b-7299-9301-84d0-0eb22ff8a97e.png)


## 5. 出力の例（英→日）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/240742/0017d60a-c24f-e9f7-aed2-dede2f6961c2.png)



## 6. さいごに
皆さまの生産性が向上することを心から祈っています。


#### ▼ プロンプト集を用意しています。ぜひご覧ください▼

https://qiita.com/tags/nori%e5%bc%8f%e3%83%97%e3%83%ad%e3%83%b3%e3%83%97%e3%83%88%e9%9b%86
全国の中学生にお届けしたい！期末テスト対策の教科書解説＆暗記シート作成プロンプト

## 1. 概要
このプロンプトは、全国の中学生が期末テスト対策として活用できる教科書解説および暗記シートを作成するためのものです。具体的な手順は以下の通りです。

1. 教科書のページを写真で撮り、ChatGPT-4oに貼り付けます
2. 提供されたプロンプト文を入力します（後述）
3. 教科書内容の解説書と暗記シートが完成します


このプロンプトはテスト対策というよりは、予習のほうが役に立つかもしれないです。
ぜひご参考ください。

https://x.com/00oichan/status/1799742443967099255

## 2. 特徴や使い方
ChatGPTに写真とともにプロンプト文を貼り付けることで、学習のための解説と暗記用の問題集を作成することができます。

ChatGPTのスマホ版の会話モードで活用できるクイズ機能をつけています。



## 3. プロンプト文
以下が教科書解説＆暗記シート作成のためのプロンプト文です。

このプロンプトを使用すると、解説書および暗記シートが自動的に生成されます。ChatGPTのスマホ用会話機能を使って、問題対策のクイズ機能としても利用できます。クイズ機能が不要な場合は、その部分を削除してください。

```markdown
添付の写真は教科書の資料や情報です。
学習指導要領に基づき、適切な用語を使用し期末テストの対策資料を作成してください。
あなたの緻密な資料作成により、学習者たちが最高のテスト成績を出すことが目標です。

出力要件：
1. 解説書作成
- 教科書で使用されている言葉を使用して解説書を作成してください。テキスト形式と表形式を活用し、必要に応じて図も挿入してください。
    - 解説書は読みやすい文章で表現し、学習に興味のない生徒でも興味を持てる内容にしてください。
    - 用語の暗記シートと明確に分けるために、読みやすい長文で解説してください。
    - 文章は稚拙にならないように、ですます調で書いてください。
    - 読みやすくするために番号を付けてください。
    - 網羅性があり、かつ臨場感あふれる内容にしてください。
    - 重要な要点を太字にして、より分かりやすく表現してください。
    - 時系列や類似する言葉の並びがある場合は漏れなく体系的に表現して、より分かりやすく書いてください。
    - 時系列がある場合は、時系列順に情報を並び替えてください
    - インプットの資料にない情報は書かないでください。

2. 用語と問題回答の暗記シートの作成
- 用語と問題回答のシートを作成してください。目標は30個以上です。
    - 単元ごとの表形式にしてください。
    - `#`, `問題・質問（端的な説明や穴埋め問題）`, `回答（暗記する用語や問題の解答）`
    - 図が見えないため、あなたが解説してください。
    - インプットとアウトプットを比較し、漏れのない網羅性のある資料にしてください。
    - 教科書の手書きの箇所や赤文字の部分、太字の部分は必ず対象に含めてください。
    - テストで満点を取ることが目標であるため、網羅性のある暗記シートにしてください。
    - インプットの文字を忠実に収集してください。一般語に置き換えるとその学校でのテストで減点される可能性があります。
    - 文章ではなく単語として独立している文字は、重要である可能性が高いので漏れなく抽出してください。
    - 教科書内の質問と回答はそのまま出題される可能性が非常に高いです。
    - 前半30問は単語の暗記目的とし、後半10問は文章題を解くことを目的とします。

3. クイズモード対応
- クイズモードに対応してください
    - 「問題出して」と言ったら、単元ごとにクイズを出してください。（それまでは出力不要です）
    - 1問1答のクイズを出してください。
    - 不正解の場合、2回までフリー回答が可能です。
    - 3回目は、3択問題にしてください。
    - 正解した場合は、回答を復唱し、次の問題に進んでください。
    - 3回不正解の場合は、解説した後、次の問題に進んでください。
    - 十分に理解ができたと確認できるまで、問題を繰り返してください。

出力後の過去の指摘事項：
- 用語が網羅されていないため、再度出力してください。
- 解説書の項目が網羅されていないので書き直してください。
```



## 3. 入力文の例
入力文は以下のようにします。
画像と一緒にプロンプト文を貼り付けます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/240742/69b65611-558d-02c3-3bd7-94d17e814358.png)



## 4. 出力例
以下の出力例は、上記のプロンプト文を基に作成したものです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/240742/71ca07d2-bc36-85f6-49fa-415636316dbf.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/240742/9ace7809-53a3-c417-791b-69a874f5b542.png)


## 5. さいごに
以上が、期末テスト対策のための教科書解説＆暗記シート作成プロンプトの紹介です。実際の学習や予習に役立てて、皆さんの学力向上に貢献できれば幸いです。今後もさまざまなプロンプトを紹介していきますので、どうぞお楽しみに！

皆さまの生産性が向上することを心から祈っています。

#### ▼ プロンプト集を用意しています。ぜひご覧ください▼

https://qiita.com/tags/nori%e5%bc%8f%e3%83%97%e3%83%ad%e3%83%b3%e3%83%97%e3%83%88%e9%9b%86
個人開発を振り返る

# はじめに

ひょんなことからサイトを作ったので今後に生かせそうな所感をまとめてみます。（ほんとにただのポエムになりました…）

# 作ったもの

ところがどっこい、諸事情で披露は控えさせてください…！
~~そんなことで話が進むと思うな！つべこべ言わずに見せr~~


## 規模感
* 作業時間：約20時間(サイトコンテンツ作成に約10時間、開発に約10時間)

<br>

* サイトでできること
    * 予め用意したデータをグラフで一覧できる
    * データはイラスト＋テキスト

<br>

* サイトでできないこと
    * データの取得・追加・編集・削除
    * ユーザ認証
など

## 期間
* 約2週間(想定より長くなってしまいました)
* 業務後、作業できる日に1～2時間くらい時間を取っていました

## 技術
* TypeScript
* React
* ChakraUI
* Netlify
などなど

## 作業の進め方

* タスク管理にWekanを利用し、その日に作業の優先順位ややることの整理をしながら進めていました
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2889192/28aeca19-65a1-b7c5-353f-2511a6c069b9.png)

* また、作業時間を計測するようにしてだらけないように意識しました ~~(途中だらけてしまいました)~~

* ローカル環境で画面の確認ができたらデプロイして実機で画面の確認をしていました


## 所感
* 熱量があっても身体が疲れていると頭が回らない
実装面で調べたり考えていると、別世界に召喚されている時がしばしばありました
また、高い熱量を維持できるのは2週間くらいで限界な気がしました。（他に熱量を注ぎたいor注がないといけないものも出てくる）

<br>

* 洗い出したタスクの粒度はもっと細かくすべきだった
意気揚々とタスクに着手したものの、他のタスク内容と被っていて、カードを分けた意味とは？ということがしばしばありました

<br>

* サイトコンテンツの作成に時間がかかった
フロントの実装で背景やデザインを作る予定だったのですが、理想のデザインを実現できそうになかったので自分でお絵描きして画像を載せることにしました

<br>

* 自分でデプロイして画面を確認できるの嬉しい
(実機で確認するだけで楽しかったです)

<br>

* セキュリティやパフォーマンス面も学んでいきたい
自分でデプロイするとこの辺りの責任もついてくるので、しっかり学ばないといけないなと感じました



# おわりに
また何かの機会に個人開発してみたいと思います。
# 用語集の一覧を作成するプロンプト文

## 1. 概要
このプロンプト文は、設計書の中で必ず記載する必要がある「用語集」を簡単に作成するためのものです。
設計書の用語集などは「網羅しきれない」「更新しづらい」「詳しい人は見ない」「お客様も見ない」「もはや誰も見ない」「それなのにレビューでだけ上司に指摘される」という不遇の章ですが、
このプロンプト文を使うことで、用語集作成の効率が格段に向上し、正確で見やすいものにすることができます。

https://x.com/00oichan/status/1800115218267422914

## 2. 特徴や使い方
日本語と英語の列を用意することで、英語をカタカナ言葉にされることを防ぎ意図しない用語集になるのを避けられます。
以下のプロンプト文を使用して、用語集を作成してください。

## 3. プロンプト文

```markdown

指示：
1. 入力文を理解し、用語集を作成してください。
2. JTF日本語標準スタイルガイドに従い、文法的に正しい自然な文章に修正し、適切な句読点を追加してください。
3. 専門用語や固有名詞を正確に記述し、必要に応じて注釈を追加してください。
4. 誤字脱字をチェックし、正しい表現に修正してください。

分類：
- プロジェクト用語
- 製品名
- 人名
- 技術用語
- イベント
- 役職
- 文書
- 組織名
- 地名
- プログラム名
- プロセス名

不要なもの：
- 日時の表記
- ファイル名の表記

出力形式：表形式
| # | 分類 | 用語(日本語) | 用語(英語) | 説明 |
|---|---|---|---|---|

入力文：
（次のチャットでお伝えします。出力せずに待機してください）

```

このプロンプト文をChatGPTに入力すると、設計書に必要な用語集が自動的に生成されます。

## 3. 入力文について
入力文は何でもいいです。
- プロジェクト計画書
- 設計書
- チャットの履歴


## 4. 出力例
以下の出力例は、上記のプロンプト文を基に作成したものです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/240742/d25ba833-6b62-df59-b4f1-16dc8ef89292.png)


## 5. さいごに
以上が、用語集を簡単に作成するためのプロンプト文の紹介です。このプロンプト文を活用して、設計書の用語集作成を効率化し、精度を高めてください。皆さまの業務が少しでも楽になることを願っています。今後もさまざまなプロンプトを紹介していきますので、どうぞお楽しみに。

皆さまの生産性が向上することを心から祈っています。

#### ▼ プロンプト集を用意しています。ぜひご覧ください▼

https://qiita.com/tags/nori%e5%bc%8f%e3%83%97%e3%83%ad%e3%83%b3%e3%83%97%e3%83%88%e9%9b%86
音声認識テキストからテーマ別の議事メモを作成する

# 音声認識テキストからテーマ別の議事メモを作成

## 1. 概要
先日、Xで音声テキストメモから議事メモを作成するプロンプト文を紹介しました。とても好評をいただきましたのでQiitaの記事にすることにしました。いくつかプロンプトを持っているのでシリーズでお送りしたいと思います。

https://x.com/00oichan/status/1799408283427729528

入力文は音声テキストメモでもいいですし、チャットの履歴でも大丈夫です。とにかく上から下に時系列で作成された言葉の集まりをテーマ別に整理する事ができます。仕事での情報整理に役立つと思います。

## 2. プロンプト文
以下が議事メモ作成のためのプロンプト文です。

テーマが変わるたびに先頭にテーマ名を書いてくれるようにしたので、読むときの可読性が一気に上がります。

また、番号をつけることでもれなく順序性をもって書くことを意識しています。

テーマを冒頭に一覧で書かせることによって、テーマを差し込むことを意識させます（無いとテーマが1つだけになったりします）

プロンプト分の出力言語を英語に変更すると、英語の議事メモが出てきます。

ChatGPT-4oでも、10000文字を超えたあたりから読み飛ばしが発生してしまうのでテキストを分割したほうが漏れのない結果が出てきます。

話者は誤っていたりわからなかったとしても欄があったほうがいいです。本文の方に「ｘｘさん：」のように注釈が入ってしまうのを防ぐことができます。出力後に話者の列を削除してもいいと思います。

　

```markdown
指示：
1. 音声文字認識のテキストを読みやすい文章へ変換してください。
2. JTF日本語標準スタイルガイドに従い、文法的に正しい自然な文章に修正し、句読点を適切に追加してください。
3. 曖昧な表現や省略部分を補完し、言い直しや繰り返しを整理して冗長な部分を削除してください。
4. 話者名を明記してください。不明な場合は「ー」としてください。
5. 専門用語や固有名詞を正確に記述し、必要に応じて注釈を追加してください。
6. 数字、日付、時間を正確に記載してください。
7. 具体例やエピソードを詳細に記述し、話の主旨を明確にしてください。
8. 誤字脱字をチェックし、正しい表現に修正してください。
9. 出力時は1行辺り150文字程度で改行を入れ、1テーマあたり10-15行前後が理想です。
10. 要点を太字にしてください。
11.です ます調で書いてください。
12. 同じ人が連続で会話している場合は会話記録を1行にまとめてください。

出力言語：
日本語

処理手順：
1. プロンプト文を読み、内容を理解します。
2. テーマ一覧を作成してください。大テーマと小テーマがあるといいです。
3. テーマごとに表形式で会話の記録を書いていきます。
4. 会話のテーマが変わったら冒頭にテーマ名を書きます。
5. 各行の冒頭に話者の名前を書きます。話者が不明な場合は「ー」と書きます。
6. 1行辺り150文字程度で改行を入れます。
7. 1テーマあたり10-15行前後として次のテーマを作成する。
8. 入力文と出力分を比較し、入力文を読み飛ばしていないか確認します。
9. すべての出力が完了したら --- 完了 --- と表示してください。

出力後の過去の指摘：
1. 1行辺り150文字程度で改行を入れるルールを守れていないです。
2. 1テーマあたり10-15行前後として次のテーマを作成するというルールを守れていないです。
3. テーマが冒頭に記載されていません。会話が変わったらテーマ名を挿入してください


出力形式：表形式
### テーマ一覧
{{テーマ名を箇条書きで記載する}}
{{テーマ名を箇条書きで記載する}}
{{テーマ名を箇条書きで記載する}}


### テーマ名
| 番号 | 話者 | 読みやすい文章 |
| --- | --- | --- |
| --- | --- | --- |

### テーマ名
| 番号 | 話者 | 読みやすい文章 |
| --- | --- | --- |
| --- | --- | --- |

入力文：
（次のチャットでお伝えします。出力せずに待機してください）
```

## 3. 入力文の例
入力文は以下のようにします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/240742/a811180b-f537-e60e-f85d-94ca86f7ea0d.png)


## 4. 出力例
以下の出力例は、上記の入力文を基に作成したものです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/240742/998bc7b3-177a-032d-6de4-1172a84b1eeb.png)


## 5. さいごに
以上が、音声認識テキストからテーマ別の議事メモを作成するためのプロンプト文とその活用方法です。実際の業務での情報整理にぜひお役立てください。今後もさまざまなプロンプトを紹介していきますので、どうぞお楽しみに。

皆さまの生産性が向上することを心から祈っています。

#### ▼ プロンプト集を用意しています。ぜひご覧ください▼

https://qiita.com/tags/nori%e5%bc%8f%e3%83%97%e3%83%ad%e3%83%b3%e3%83%97%e3%83%88%e9%9b%86
チャット履歴やドキュメントからFAQを自動作成するプロンプト文

## 1. 概要
このプロンプト文は、問い合わせの履歴やチーム内でやり取りした1年分のチャット履歴などから、効率的にFAQを作成するためのものです。ナレッジ記事やFAQを作成する際、従来のWord形式ではページ数が増え、精査が大変でしたが、このプロンプト文を使うことで、表形式で簡単にまとめることができます。

https://x.com/00oichan/status/1800513387488833813

## 2. 特徴や使い方
表形式にすることで、FAQをシステムに取り込む際にExcel形式やCSV形式で大量に取り込めるというメリットがあります。チャットなどからFAQを作成する場合、一方的なアナウンスもFAQに含めることができ、会話からFAQを作成する際に参考URLも含めることができます。

また、FAQがシステムで検索キーワードとして引っかかるように、#から始まる検索ワードを記載しています。自社のFAQのシステム内で特定のキーワードを引っかけたい場合、このプロンプト文にそのキーワードを入れることで効果的に誘導することができます。

ドキュメントや問い合わせ履歴からもFAQは作成できますが、「日々のチャットに大事な情報が詰まっている」という点に着目してFAQを作成するのがこのプロンプト文の素敵なポイントです。

## 3. プロンプト文

```markdown
目的:
入力文となる文章・会話履歴からFAQを作成する

要件:
1. チャットの文章を読んでFAQを作成する。
   - 音声文字認識のテキストを読みやすい文章へ変換してください。
   - JTF日本語標準スタイルガイドに従い、文法的に正しい自然な文章に修正し、句読点を適切に追加してください。
   - 曖昧な表現や省略部分を補完し、言い直しや繰り返しを整理して冗長な部分を削除してください。
2. 一方的なアナウンスなども強制的に質問と回答の形式にする。
3. わかりにくい部分は前後の文脈から推測して補完する。
4. 新社会人でもわかるような平易な言葉遣いを心がける。
5. 最低10記事から50記事を作成する。
6. 1行で行われるアナウンス文も見逃さないようにする。
7. 出力結果はヘルプデスク、コールセンター業務で使用しますので適した形にしてください
8. です。ます調でFAQを作成してください
9. 検索用のキーワードを#始まる語句で最低5つ作成してください。

処理手順:
1. [入力文]を読み内容を理解する。
2. ナレッジ記事を作成する。
3. 検索で引っかかりやすいように「#キーワード」の形式でキーワードを5つ程度作成する。
4. 参考となるURLがあれば掲載する。

あなたの出力結果に対する過去の指摘事項：
1. 要約しないでください。詳細に書いてください。
2. 記事は1件だけ作成せず、たくさん書いてください。
3. 入力文にない内容のテーマで記事は作らないでください。
4. キーワードの列は、関連する検索語句を#から始まる言葉で5つ作成してください

出力形式:表形式

| # | テーマ | 質問内容 | 回答内容 | 参考URL | キーワード |
|---|-------|----------|----------|----------|------------|
|1|        |          |          |          |             |
|2|        |          |          |          |             |
|3|        |          |          |          |             |

入力文：
（次のチャットでお伝えします。出力せずに待機してください）

```

このプロンプト文をChatGPTに入力すると、チャット履歴やドキュメントから自動的にFAQが生成されます。

## 3. 入力文の例
入力文は以下のようにします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/240742/f5ebdeea-8b66-c716-7359-2990bd2de2e3.png)


## 4. 出力例
以下の出力例は、上記のプロンプト文を基に作成したものです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/240742/158e9635-e69c-1bdc-1739-7151011c7d5f.png)


## 5. さいごに
以上が、チャット履歴やドキュメントからFAQを自動作成するプロンプト文の紹介です。このプロンプト文を活用して、効率的にFAQを作成し、日々の業務に役立ててください。皆さまの生産性が向上することを心から願っています。今後もさまざまなプロンプトを紹介していきますので、どうぞお楽しみに。

皆さまの生産性が向上することを心から祈っています。

#### ▼ プロンプト集を用意しています。ぜひご覧ください▼

https://qiita.com/tags/nori%e5%bc%8f%e3%83%97%e3%83%ad%e3%83%b3%e3%83%97%e3%83%88%e9%9b%86
Windows 11のKB5037771を適用したらOSが起動しなくなった話

# はじめに
2024/06/12の夜に、自宅のPCにWindows Update ([KB5037771](https://support.microsoft.com/ja-jp/topic/2024-%E5%B9%B4-5-%E6%9C%88-14-%E6%97%A5-kb5037771-os-%E3%83%93%E3%83%AB%E3%83%89-22621-3593-%E3%81%8A%E3%82%88%E3%81%B3-22631-3593-e633ff2f-a021-4abb-bd2e-7f3687f166fe)) を適用したところ、画面にdynabookの文字が出たまま処理が進まない問題が発生しました。

本記事は、問題発生から復旧までの記録になります。

結論から言うと、最終的にはdynabook Recovery WizardによりPCを初期化しました。

# 追記 (2025/01/08)
後日 (2024/10/30) 、別のKBを適用した場合に同事象 (OSの起動に失敗) が発生しているため、[KB5037771](https://support.microsoft.com/ja-jp/topic/2024-%E5%B9%B4-5-%E6%9C%88-14-%E6%97%A5-kb5037771-os-%E3%83%93%E3%83%AB%E3%83%89-22621-3593-%E3%81%8A%E3%82%88%E3%81%B3-22631-3593-e633ff2f-a021-4abb-bd2e-7f3687f166fe)が直接の原因ではないと考えています。

https://qiita.com/fukunagt/items/3e8e239e73519fa978cc

# 注意事項
- 本記事は筆者の作業記録であり、ご参考程度にとらえていただければ幸いです。

# 環境
- PC
  - dynabook (P1C8WNEG)
- OS
  - Windows 11 Home (10.0.22631.3593) 

# 作業記録
## 2024/06/12
### 23:30
就寝前に「更新してシャットダウン」を実行。なかなかシャットダウンが終わらないが、眠いので寝る。

## 2024/06/13
### 03:00
シャットダウンが終わらない。CPUのファンがうなりをあげている。さすがにこれはおかしいと思い、PCの電源ボタンを長押しし、強制終了させた。

Windows 11が正常に起動するか確認するため、PCの電源ボタンを押す。「dynabook」の文字は出るがそこから処理が進まない状態に…眠いので寝る。

### 07:00
PCの電源ボタンを押す。「dynabook」の文字は出るがそこから処理が進まない状態。

あれは悪夢ではなく、現実だったのか…

### 18:20
セーフモードで起動。KB5037771をアンインストールし、OSを再起動。

### 18:25
起動時に以下の画面が出力される。
```
予定どおりに完了できませんでした。
心配いりません - 変更を元に戻します。
コンピューターの電源を入れたままにしてください。
```

セーフモードで起動するが、KB5037771がアンインストールされていない。なんで？？？

セーフモードで起動できるうちに、USBフラッシュメモリにデータを保存。

eventvwrを起動し、システムのイベントログを確認するも、該当時間帯に記録されているログがない。イベントログのサービスが起動する前に問題が起きていたものと思われる。

### 18:30
スタートアップ修復を実行。OSを再起動。

### 18:35
「dynabook」の文字は出るがそこから処理が進まない状態。

### 18:38
セーフモードとネットワークでの起動を試みる。「dynabook」の文字は出るがそこから処理が進まない状態。

## 2024/06/15
### 09:20
[dynabookあんしんサポート](https://dynabook.com/assistpc/techsupport/dial2016.htm)に電話。上記の状態を伝えたところ、「dynabook Recovery Wizard」による復旧方法を案内される。

復旧作業開始。

### 11:02
復旧作業完了！

以下のKBが適用された状態になりました。
```
PS C:\> Get-HotFix|Select-Object Description,HotFixID,InstalledOn

Description     HotFixID  InstalledOn
-----------     --------  -----------
Update          KB5036620 2024/06/15 0:00:00
Update          KB5027397 2024/06/15 0:00:00
Update          KB5031274 2024/06/15 0:00:00
Update          KB5036212 2024/06/15 0:00:00
Security Update KB5036893 2024/06/15 0:00:00
Update          KB5026549 2023/07/14 0:00:00
Security Update KB5037020 2024/06/15 0:00:00
```

# さいごに
PCを初期化したため原因の特定には至りませんでしたが、Windows Update適用後に問題が発生したため、[KB5037771](https://support.microsoft.com/ja-jp/topic/2024-%E5%B9%B4-5-%E6%9C%88-14-%E6%97%A5-kb5037771-os-%E3%83%93%E3%83%AB%E3%83%89-22621-3593-%E3%81%8A%E3%82%88%E3%81%B3-22631-3593-e633ff2f-a021-4abb-bd2e-7f3687f166fe)が問題の一因になっていたと推測しています。
unknown型、never型について整理する

unknown型とnever型はたまによく見ますが、それぞれがどのようなものなのかを理解していなかったので、この記事で整理したいと思います！

# unknown型

unknown型は**なんでも入れることができる型**です。なんでも入れられる、つまり何が入っているかわからないことから、unknown型という名前になっているということですね。

```tsx
function test(val: unknown) {
	return val;
}

// 以下は全てOK！
test('test');
test(123);
test(true);
test({ rice: "お米"});
```

### any型との違い

なんでも入れることができる、という点だとany型も同じのように思えますが、unknown型はany型と比べて安全です。

any型の値は、使う際に型のチェックが行われません。そのため、本当に持っているかわからないプロパティやメソッドにアクセスしようとしてもコンパイルエラーになりません。

```tsx
function test(val: any) {
	// エラーにならない！
	const name = val.name;
	const age = val.age;
	const valLength = val.length; 
	return val;
}

test('test');
test(123);
test(true);
test({ rice: "お米"});
```

unknown型については「なんでも入れることができる型」として型のチェックが行われます。そのため、アクセスしようとしているプロパティやメソッドが本当に存在するのかについては慎重に判断してくれます。

```tsx
function test(val: unknown) {
	// Property 'name' does not exist on type 'unknown'.
	const name = val.name;
	
	// Property 'age' does not exist on type 'unknown'.
	const age = val.age;
	
	// Property 'length' does not exist on type 'unknown'.
	const valLength = val.length; 
	
	return val;
}

test('test');
test(123);
test(true);
test({ rice: "お米"});
```

# never型

never型は**当てはまる値が存在しない型**です。当てはまる値がないということは、never型が当てられている変数についてはどのような値も代入することができないということです。

また関数の引数をnever型にした場合、その関数は（anyなどを使わない限り）呼び出すことができなくなります。

```tsx
function dontCall(val: never) {
	// ユニークな仕様として、never型の値はどんな型にも代入できる
	const srt: string = val;
	const num: number = val;
	const obj: object = val;
	return val;
}

// 全てコンパイルエラーになる
dontCall({ rice: "お米" }); // Argument of type '{ rice: string; }' is not assignable to parameter of type 'never'.
dontCall("ご飯"); // Argument of type 'string' is not assignable to parameter of type 'never'.
```

# 終わりに
内容に間違いや誤字脱字等ございましたら、ご指摘いただけるとありがたいです！
読んでいただきありがとうございました！
python.TKinter用 Source.Generator

python.TKinter用 Source.Generatorを 作りました。
起動直後に 数個のパラメータの 入力インターフェイスを
表示させ 入力後はスクリプトで 処理するだけ。
そんな 入力アプリを作る為のモノです。
入力後のスクリプトは 提供してません。
お好みの言語で 用意してください。

TwilightBluesy..genPTK_v10
　[application](https://twilight-bluesy.net/_utl/genPTK-v10/index.html)
 　[document](https://twilight-bluesy.net/__apps/_appZ.html?name=genPTK&verN=10)
  　[site.top](https://twilight-bluesy.net/)
【初心者】Jamf Nowに新規登録してみました

# 内容
MacやiOSデバイスはかなりの初心者ですが、以前からJamfに興味があったので登録してみました。3台までなら無料、それ以降は4ドル/月とのことです。

# チュートリアル動画
ここを見て頂くのが早いです。

:::note info
How to Create Your Push Certificate in Jamf Now
Jamf Training and Support
https://www.youtube.com/watch?v=Wa1ILC4HmnI
:::

# AppleIDでプッシュ通知サービスの登録
・JamfとAppleIDを紐づける作業のようです。
・AppleIDでログインして、Jamfポータルからダウンロードしたplistファイルをアップロードします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/790864/52feeb9a-cabf-ff6c-9a00-0212cd56d0fb.png)

すみませんキャプチャを取り忘れましたがJamfポータルに初回ログインするとplistファイルをダウンロードして下さい、とデカデカと出てくるので大丈夫だと思います。

# プッシュ証明書のダウンロード
拡張子.pemファイルをダウンロードします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/790864/1dd4e3e3-15d0-cbaa-bd2d-aef60c07a658.png)

# Jamfポータルにアップロード
.pemファイルをアップロードします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/790864/59c88bc6-4628-2ac0-9365-1f0f3cb8a3ba.png)

# 登録完了
こんな画面になれば完了でした。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/790864/6713c275-5aff-ef3c-ad2d-72512524827b.png)

# メニューを見てみる
IntuneとかのMDMを触ったことがあればだいたい理解できそうな内容のメニューでした。GUIとしてはIntuneより明らかに使いやすそうです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/790864/ae7891be-a524-8e7d-86eb-02212616e2d6.png)

# ぱっと見た感じ、
ブループリント（青写真）というのがIntuneでいうところの構成プロファイルで、自動エンロールメントというのがAutopilot的なものなのでしょうか？
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/790864/35dc48f5-87e1-0c23-e52a-4af6fa015543.png)

# 日本語にできました
後で気づいてすみませんが、日本語にできました。
MDMらしく、管理アプリを検索できるのですが、レスポンスも早かったです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/790864/58ff7e76-88b4-1e16-01ef-64861b8428ef.png)

# どうなのでしょうね
いろんなサイトによるとJamfは同期が早いし良いですよ的な情報がありますので、期待しています。

https://zenn.dev/tbashiyy/articles/fa6ede15709de2
闘魂Elixir ーー AtCoder Beginner Contest 353(B)をElixirで楽しむ

<b><font color="red">$\huge{元氣ですかーーーーッ！！！}$</font></b>
<b><font color="red">$\huge{元氣があればなんでもできる！}$</font></b>

<b><font color="red">$\huge{闘魂とは己に打ち克つこと。}$</font></b>
<b><font color="red">$\huge{そして闘いを通じて己の魂を磨いていく}$</font></b>
<b><font color="red">$\huge{ことだと思います}$</font></b>


# はじめに

[AtCoder Beginner Contest 353](https://atcoder.jp/contests/abc353)を[Elixir](https://elixir-lang.org/)で解いてみます。

[AtCoder](https://atcoder.jp/)を解くのが趣味で、休憩時間に解いているという若い人がいて、それってすごい意識の高い休憩時間の過ごし方だと思って、私も真似してみることにしました。


# [AtCoderをElixirでやってみる](https://zenn.dev/torifukukaiou/articles/ac84c87736ceebf4da01)

入力の読み取り方や解答の作り方は、別の記事にまとめています。


https://zenn.dev/torifukukaiou/articles/ac84c87736ceebf4da01

ご参照くださいませ。

[Elixir](https://elixir-lang.org/)で[AtCoder](https://atcoder.jp/)を楽しむためには、エントリポイントを`Main.main/0`にする必要があります。つまり`Main`モジュールを作って、その中に`main/0`関数を定義するわけです。

# [B - AtCoder Amusement Park](https://atcoder.jp/contests/abc353/tasks/abc353_b)

問題はリンク先をご参照くださいませ。
私の解答を貼っておきます。


<details><summary>私の解答</summary>

_問題文を読んでいることを前提にひとこと解説をしておきます。_

空席の状態を更新しながらリストの要素をなめていく感じなので、解法の骨格には[Enum.reduce/3](https://hexdocs.pm/elixir/Enum.html#reduce/3)を使うと良いでしょう。
最後のグループを載せたときのアトラクション数のカウントが途中にはないので最後に`+1`することにしました。


```elixir
defmodule Main do
  def main do
    [_n, k] =
      IO.read(:line) |> String.trim() |> String.split(" ") |> Enum.map(&String.to_integer/1)
    a_list = IO.read(:line) |> String.trim() |> String.split(" ") |> Enum.map(&String.to_integer/1)
      
    solve(k, a_list)
    |> IO.puts()
  end
  
  def solve(k, a_list) do
    a_list
    |> Enum.reduce({0, k}, fn
      a, {cnt, count_of_seats} when a > count_of_seats -> {cnt + 1, k - a}
      a, {cnt, count_of_seats} -> {cnt, count_of_seats - a}
    end)
    |> elem(0)
    |> Kernel.+(1)
  end
end
```




</details>




---

# さいごに

[AtCoder Beginner Contest 353](https://atcoder.jp/contests/abc353)を[Elixir](https://elixir-lang.org/)で解くことを楽しみました。

あなたのお好きなプログラミング言語でお楽しみください。

---


**闘魂**とは、  **「己に打ち克つこと。そして闘いを通じて己の魂を磨いていくことである」** との猪木さんの言葉をそのまま胸に刻み込んでいます。
知っているだけで終わらせることなく、実行する、断行する、一歩を踏み出すことを自らの行動で示していきたいとおもいます。
**アントニオ猪木さんのメッセージから元氣をもらったものとして、それを次代に語り継ぎ、自分自身が「闘魂」を体現するものでありたいとおもいます。**

---

<b><font color="red">$\huge{元氣ですかーーーーッ！！！}$</font></b>
<b><font color="red">$\huge{元氣があればなんでもできる！}$</font></b>
<b><font color="red">$\huge{１、２、３ ぁっダァー！}$</font></b>
Data Cloudの既知の問題のまとめ

[Data Cloudのまとめに戻る](https://qiita.com/Keiji_otsubo/items/ce366c02186b6bb5b39b)

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

ここ最近Data Cloud関係のエラーについての投稿をよく目にすると思いますね。
ちょっと既知の問題を確認してみましょう。


+ [「Data Cloud に送信」アクションは、新しい DataCloud データ型をサポートしていません。](https://issues.salesforce.com/issue/a028c00000zIxQwAAK/send-to-data-cloud-action-does-not-support-the-new-datacloud-data-types)

Salesforce フローの「Data Cloud に送信」アクションは新しい Data Cloud データ型をサポートしていないため、それらのデータ型を選択すると例外がスローされます。

+ [組織が Data Cloud ライセンスにアップグレードされると、Customer Data Platform の権限セットへのアクセスが失われます](https://issues.salesforce.com/issue/a028c00000zImC2AAK/customer-data-platform-permission-sets-lose-access-when-org-is-upgraded-to-data-cloud-license)

さまざまな権限セットの詳細については、「Data Cloud: 権限セットの可用性」を参照してください。Data Cloud のレコードまたはプロセスは引き続き存在し、ユーザーに権限セットが割り当てられた後もアクセス可能になります。

+ [データクラウド: B2C データストリームの断続的な障害](https://issues.salesforce.com/issue/a028c00000zJ3QDAA0/data-cloud-intermittent-failure-in-b2c-data-streams)

B2C データ ストリームは、いくつかのジョブ実行でランダムに失敗する場合があります。

+ [計算されたインサイトを削除しても、他のデータ クラウド セクションからは削除されない場合があります](https://issues.salesforce.com/issue/a028c00000zHyHgAAK/deleting-calculated-insights-may-not-remove-them-from-other-data-cloud-sections)

このテーブルは、セグメント、アクティベーション、およびその他の Data Cloud 機能のデータが取得される場所です。... タブは Data Cloud のこれらの領域に引き続き存在し、実用的なデータが含まれています。

+ [Data Cloud DMO/DLO ブールフィールドが CRM アナリティクスで日付フィールドとして表示される](https://issues.salesforce.com/issue/a028c00000zIzJUAA0/data-cloud-dmodlo-boolean-fields-shown-as-date-fields-in-crm-analytics)

Data Cloud の DMO/DLO からのブール フィールドは、日付/時刻型フィールドとして表示されます...日付/時刻として表示されるため、この Data Cloud ソース フィールドのブール型の年、日、月フィールドが作成されます。

+ [マーケティング アプリ - データ ストリーム デプロイでの Marketing Cloud Growth 権限エラー](https://issues.salesforce.com/issue/a028c00000zJ1mGAAS/marketing-app--marketing-cloud-growth-permission-error-in-data-stream-deploy)

Marketing Cloud Growth 実装プロセスでデータ ストリームを展開するときに、ユーザーに「権限が不十分です」というエラーが発生する
スタートアップ/自社開発企業のWeb&データインフラ基盤でありそうな構成

# はじめに
スタートアップや自社開発企業でインフラ環境を0から構築する際、よくある構成を列挙してみました。
※この記事は個人の見解に基づいています。もし偏見があるように感じられたら、申し訳ございません。
※クラウドは、AWS前提とさせてください。

# 全体構成図
ざっくり、こんな感じかなと思いました。
![スクリーンショット 2024-05-19 15.07.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263017/a4d83d13-f8d7-46d6-1afb-fdddf4d10363.png)

# 環境構成
dev, prod用のAWSアカウントが必要なので、二つあるといいかなと思いました。
理想は、金銭的に余裕があればですが、stg用のアカウントも欲しいです。

# IaC
Terraformが使いやすく、いいかなと思いました。
手動で実行した方が早いので、スキルさえあればそんなにヒューマンエラーが発生するものでもないです。
そのため、最初のうちは無理してGitHub Actionsなど使って自動化する必要はないかなと思ってます。

# コンテナリポジトリ
ECRがいいかなと思いました。
タグはlatestで管理せずに、GitHub ActionsのHash値と紐づけることで、障害対策やロールバックがしやすくなります。

# フロントエンドサーバー
静的サイトやSEOを検討しない構成であればS3+CloudFront、SSRやSEOを考慮する場合は、Fargateがいいかなと思いました。
他のサードパーティツールも良いですが、高額な場合もありますし、AWS内で完結する方が作業しやすいです。
GitHub Actionsから自動でCI/CDを行うのが良いと思います。

# バックエンドサーバー
ECS Fargateがいいかなと思いました。
GitHub Actionsから自動でCI/CDを行うのが良いと思います。
デプロイ手法は基本Blue/Greenを用いて、バッチ系などの用途はローリングアップデートがいいかなと思いました。

# 認証サーバー
Amazon Cognitoでいいかなと思いました。
Auth0などの方が色々できてメリットが大きいという話を聞いたことがありますが、結構高いです。

# Git
GitHubがいいかなと思いました。
AWSにCode4兄弟のサービスなどありますが、フロント・バックエンドエンジニアは、基本GitHubを使っているためです。

# CI/CD
GitHub Actionsがいいかなと思いました。
AWSにCode4系のサービスなどありますが、フロント・バックエンドエンジニアは、基本GitHubを使っているためです。

# データベース
Auroraがいいかなと思いました。
RDSと比べて、性能や耐久性が良いためです。
Aurora Serverlessを利用すると、自動スケーリングしてくれます。
ライターエンドポイント、リーダーエンドポイントは使い分けて、開発する方が将来的にスケーリングなどに役立ちますが、  
最初のうちは、アプリ開発のスピードを高めるために、ライターエンドポイントのみでのいいかなと思いました。

# NoSQL
DynamoDBのオンデマンドモードでいいかなと思いました。
インフラ的な運用保守がほぼ発生せず、開発しやすいです。

# データレイク基盤
S3でいいかなと思いました。
Athenaを用いて、SQLを実行します。
DBからデータをS3へ転送する仕組みをつくればよさそうです。

# DWH基盤
特に希望がなければ、S3(Athenaを利用)、データサイエンティストの好みで、Redshift/Bigquery/Snowflakeがいいかなと思いました。
データ分析の環境は、特に正解・不正解がないので、どのサービスを選んでも正解だと思ってます。
そのため、データサイエンティストの好みで良いです。

# ETLツール
バッチ処理はGlueやAthane、ストリーミング処理はLambdaやKinesisを使うのがいいかなと思いました。

# BIツール
データサイエンティストの好みで決めればいいかなと思います。
AWSならQuickSight、サードパーティであれば、TablauやLookerなど。
データ分析の環境は、特に正解・不正解がないので、どのサービスを選んでも正解だと思ってます。
そのため、データサイエンティストの好みで良いです。

# 生成AI
BedrockやSageMakerを利用するのがいいかなと思いました。
金額がめちゃくちゃ高いので、リザーブドインスタンスやAWSの営業さんとの相談は必須かと思います。
闘魂Elixir ーー AtCoder Beginner Contest 353(A)をElixirで楽しむ

<b><font color="red">$\huge{元氣ですかーーーーッ！！！}$</font></b>
<b><font color="red">$\huge{元氣があればなんでもできる！}$</font></b>

<b><font color="red">$\huge{闘魂とは己に打ち克つこと。}$</font></b>
<b><font color="red">$\huge{そして闘いを通じて己の魂を磨いていく}$</font></b>
<b><font color="red">$\huge{ことだと思います}$</font></b>


# はじめに

[AtCoder Beginner Contest 353](https://atcoder.jp/contests/abc353)を[Elixir](https://elixir-lang.org/)で解いてみます。

[AtCoder](https://atcoder.jp/)を解くのが趣味で、休憩時間に解いているという若い人がいて、それってすごい意識の高い休憩時間の過ごし方だと思って、私も真似してみることにしました。


# [AtCoderをElixirでやってみる](https://zenn.dev/torifukukaiou/articles/ac84c87736ceebf4da01)

入力の読み取り方や解答の作り方は、別の記事にまとめています。


https://zenn.dev/torifukukaiou/articles/ac84c87736ceebf4da01

ご参照くださいませ。

[Elixir](https://elixir-lang.org/)で[AtCoder](https://atcoder.jp/)を楽しむためには、エントリポイントを`Main.main/0`にする必要があります。つまり`Main`モジュールを作って、その中に`main/0`関数を定義するわけです。

# [A - Buildings](https://atcoder.jp/contests/abc354/tasks/abc353_a)

問題はリンク先をご参照くださいませ。
私の解答を貼っておきます。


<details><summary>私の解答</summary>

_問題文を読んでいることを前提にひとこと解説をしておきます。_

条件を満たした場合には計算を打ち切ってよいので、解法の骨格には、[Enum.reduce_while/3](https://hexdocs.pm/elixir/Enum.html#reduce_while/3)を使えばよいでしょう。


```elixir
defmodule Main do
  def main do
    _n = IO.read(:line) |> String.trim() |> String.to_integer()
    h_list =
      IO.read(:line) |> String.trim() |> String.split(" ") |> Enum.map(&String.to_integer/1)
      
    solve(h_list)
    |> IO.puts()
  end
  
  def solve(h_list) do
    [left_building_height | buildings] = h_list

    Enum.with_index(buildings, 2)
    |> Enum.reduce_while(-1, fn
        {h, index}, -1 when h > left_building_height -> {:halt, index}
        _, -1 -> {:cont, -1}
    end)
  end
end
```




</details>




---

# さいごに

[AtCoder Beginner Contest 353](https://atcoder.jp/contests/abc353)を[Elixir](https://elixir-lang.org/)で解くことを楽しみました。

あなたのお好きなプログラミング言語でお楽しみください。

---


**闘魂**とは、  **「己に打ち克つこと。そして闘いを通じて己の魂を磨いていくことである」** との猪木さんの言葉をそのまま胸に刻み込んでいます。
知っているだけで終わらせることなく、実行する、断行する、一歩を踏み出すことを自らの行動で示していきたいとおもいます。
**アントニオ猪木さんのメッセージから元氣をもらったものとして、それを次代に語り継ぎ、自分自身が「闘魂」を体現するものでありたいとおもいます。**

---

<b><font color="red">$\huge{元氣ですかーーーーッ！！！}$</font></b>
<b><font color="red">$\huge{元氣があればなんでもできる！}$</font></b>
<b><font color="red">$\huge{１、２、３ ぁっダァー！}$</font></b>
(Vue3)vue-useでdebounceとthrottleを使う

短時間に同じ処理が何度も行われる時に、何となく`debounce`と`throttle`を使って解決できることは知っていた。しかし、実装した経験がなかったので調べてみた。

## debounceとthrottleとは？

個人的にはボタンの連打防止をイメージしている。
その中で、debounceとthrottleはそれぞれ違った方法でその目的を果たす。

vueuseさんがドキュメントに載せているビジュアルガイドがすごく分かりやすかった。
直接触ったらすぐ理解できたので皆さんもぜひ。

https://kettanaito.com/blog/debounce-vs-throttle

### 処理がない時
![画面収録 2024-06-11 13.35.10.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3754242/0b896ef5-71df-fff2-36b5-5ee226a36657.gif)

### throttle
![画面収録 2024-06-11 13.35.23.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3754242/e1aedd1c-05e7-d5d4-3117-935da54170b5.gif)
まずは処理を実行して、指定した間隔内に同じ処理は実行しない。
したがって、最初の処理が実行される。

### debounce
![画面収録 2024-06-11 13.35.38.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3754242/e9816876-73b2-cd82-f3fa-6a7bc483bfe2.gif)
指定した間隔内に処理が複数回行われたら、処理を実行しない。
したがって、連打したら最後の処理だけが実行される。

debounceの場合、間隔内に処理が実行され続ける限りは、理論上無限に処理が実行されない。

## 実装
jsでは内蔵関数としてこれらをサポートしているわけではない。

以下のように自作のものをutilsなどに置いて使うこともできそう。

https://qiita.com/itinerant_programmer/items/5900b3ea0e6823223ee7

https://qiita.com/kaeru333/items/c9920b9063d7869f4276


js共通で使えるものとしては`lodash`のメソッドを使っているのをよく見かける。

私はvueの開発をしているため、今回は`vue-use`を使って実装したい。

### `useDebounceFn`, `useThrottleFn`

基本的な使い方は簡単。引数としてコールバックと待機時間(ms)を渡すだけ。
以下は公式の例。

```debounce.js
import { useDebounceFn } from '@vueuse/core'

const debouncedFn = useDebounceFn(() => {
  // do something
}, 1000)

window.addEventListener('resize', debouncedFn)
```

```throttle.js
import { useThrottleFn } from '@vueuse/core'

const throttledFn = useThrottleFn(() => {
  // do something, it will be called at most 1 time per second
}, 1000)

window.addEventListener('resize', throttledFn)
```

https://vueuse.org/shared/useThrottleFn/#usethrottlefn

https://vueuse.org/shared/useDebounceFn/#usedebouncefn

## 終わりに
debounceとthrottleの存在を知っているだけでできる実装の幅が広くなることを感じる。
まだデザインパターンとか全然わかっていないため、勉強していきたい。
【備忘録】minikubeのインストール方法

# はじめに

普段minikubeを使用することが多いのですが、`minikube start`コマンドが失敗するようになってしまったので一度アンインストールすることにしました。

次に同様のことが起こらない保証はないので備忘録としてまとめることにしました。

いちいち調べ直すのも面倒なので...

# 環境

OS: Ubuntu 22.04

# やったこと

## curlを使用してLinuxへkubectlのバイナリをインストールする

1. kubectlの最新リリースをダウンロード
    ```bash
    curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"
    ```
    
2. kubectlのチェックサムファイルをダウンロード
    ```bash
    curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl.sha256"
    ```
3. チェックサムファイルに対してkubectlバイナリを検証
    ```bash
    echo "$(cat kubectl.sha256)  kubectl" | sha256sum --check
    ```

    問題なければ以下のように出力される
    ```bash
    > kubectl: OK
    ```

4. kubectlをインストールする
    ```bash
    sudo install -o root -g root -m 0755 kubectl /usr/local/bin/kubectl
    ```

5. バージョンを確認
    ```bash
    kubectl version --client
    ```

## minikubeインストール

1. minikubeのバイナリファイルをダウンロード
    ```bash
    curl -Lo minikube https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
    ```

2. minikubeの実行権限を設定

    ```bash
    chmod +x minikube
    ```

3. minikubeバイナリを実行可能にする
    ```bash
    sudo install minikube /usr/local/bin
    ```

    ディレクトリが存在しないときは以下を実行
    ```bash
    sudo mkdir -p /usr/local/bin
    ```

4. minikubeを起動
    ```bash
    minikube start
    ```

    正しく起動できた場合、`minikube status`コマンドで以下のような出力がなされます。
    ```bash
    minikube status
    > minikube
    > type: Control Plane
    > host: Running
    > kubelet: Running
    > apiserver: Running
    > kubeconfig: Configured
    ```
2024年7月公開予定｜情報システム部門を刺激するメディア「情シスのじかん by WingArc1st」

## 情報システム部門のみなさまへ


「情シスのじかん」は、日々の業務で役立つ実践的なノウハウや、情報システム部門のあり方についての洞察を提供するメディアです。

### 急速に進むDXの波に乗り遅れることなく、テクノロジーをリードするための情報をお届けします！

![情シスのじかんbyWingArc1st.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3816554/ebc7d057-6fba-5073-3537-c819732fafa3.png)

インフラの下支えからDXのリーダーシップまで、情報システム部門が担う役割の重要性を再認識し、ビジネスと社会の課題解決に貢献するための情報を発信しています。

毎週月曜日の朝には、ポジティブにスタートするためのコンテンツを提供。業務中には実務に直結する情報を、夜にはリラックスできるエンタメ系の内容をお届け。週末には、仕事とプライベートを両立させるためのヒントや、ITプロフェッショナルならではの趣味紹介も充実しています。

「情シスのじかん」は、2024年7月に公開予定です。皆様の生活リズムに合わせた情報発信で、常に寄り添い、共に未来を切り拓くためのメディアです。ぜひ、情報システム部門の皆様の活動の取材をさせてください。

2024年7月に公開予定ではありますが、以下の窓口で、「情シスのじかん」に関するご意見やご要望を受け付けております。
また、資料請求やお問い合わせもお待ちしています。お気軽にお問い合わせください。

josysnojikan@wingarc.com

#### 「情シスのじかん」と共に、テクノロジーを飼いならし、未来を切り拓いていきましょう！
学生必見！プログラミングで見る英単語！第二弾

# この記事は？
この記事は第一弾の続きです。見なくても楽しめる内容ですが見ていただくと嬉しいです！

https://qiita.com/Takkesan/items/348aa47379cb791457dc

# 本編

## region

- 地域

```
This service is available in the ap-northeast-1 region.
このサービスはap-northeast-1(東京)リージョンで利用できます。
```
AWSで見るやつ。他のクラウドサービスだとどうなのかな？

## feature

- 機能

```
You must make your feature branch from the develop branch.
フィーチャーブランチはdevelopブランチから作成してください。
```
中学生の時futureとfeatureを間違えていた...。

## function

- 関数

```
This function is called when the button is clicked.
この関数はボタンがクリックされたときに呼び出されます。
```
f(x)

## structure

- 構造

```
This structure is composed of three layers.
この構造は3つの層で構成されています。
```
構造体を書くときはstructって書いたりするよね。

## instance

-　実例

```
You can create an instance of this class.
このクラスのインスタンスを作成できます。
```
インスタンス化！設計図から操作できる実態を作るんだよね。

## current

- 現在の

```
Please check current folder. Are you in the right place?
現在のフォルダを確認してください。正しい場所にいますか？
```
Linuxでよく見る。pwdで現在のパスを見たり。

## manage

- 管理する

```
Do not make a lot of Manager class.
たくさんのManagerクラスを作らないでください。
```
Managerクラスって安易に名前をつけると雑に使いがち。

## sort

- 並び替える

```
There are many ways to sort the list.
リストを並び替える方法はたくさんあります。
```
ボゴソートが一番好き。

## observe

- 観察する

```
In this case, you should make use of the observer pattern.
この場合、オブザーバーパターンを活用するべきです。
```
デザインパターンで見るよね。でも使いすぎには注意。

## ignore

- 無視する

```
You can make .git ignore file.
.gitignoreファイルを作成することができます。
```
大事なファイルは絶対.gitignoreに書いて！

## contribute

- 貢献する

```
You can contribute to this project by making a pull request.
プルリクエストを作成することで、このプロジェクトに貢献することができます。
```
いつかOSSにプルリクエストを飛ばしたい。

## respond

- 応答する

```
This server always responds with 500 Error.
このサーバーは常に500エラーで応答します。
```
どんなサーバーだよ。

## succeed

- 成功する

```
This test is expected to succeed.
このテストは成功することが期待されています。
```
映画だと緑色の文字で出がち。

## conflict

- 衝突

```
Please fix this conflict.
このコンフリクトを解消してください。
```
そもそもコンフリクトが起きないようにしよう。

## context

- 文脈

```
You should understand the context of this function.
この関数の文脈を理解するべきです。
```
FlutterだとBuildContextを使う。

## strategy

- 戦略

```
You have to study about business strategy to pass the exam.
試験に合格するためにはビジネス戦略について勉強する必要があります。
```
IPAの試験で勉強させられた。やってて楽しかった。

## track

- 追跡する

```
Let's track the hacker who attacked our server.
サーバーを攻撃したハッカーを追跡しましょう。
```
ログとかトラックって言ったりしない？

## equal

- 等しい

```
1 don't equal to "1".
1は"1"と等しくありません。
```
最初戸惑うよね。でも型を理解できないと話にならない。

## false

- 偽

```
Boolean value of 0 is false.
0のブーリアン値はfalseです。
```
0はfalse。1はtrue。

## trust

- 信頼する

```
Do you trust this directory?
このディレクトリを信頼しますか？
```
IntelliJで出るやつ。

## release

- 解放する

```
When you use C++, you have to release the memory.
C++を使うときはメモリを解放する必要があります。
```
ガーベッジコレクションがない時代のプログラマーは尊敬します。
Nervesで、他のノードのLEDをON/OFFする

# はじめに

Elixir合宿 in 湯布院 で作成したものです

# 作ったもの

2台のRaspPi ZeroWを用意して、一台目にスイッチ、二台目にLEDを接続。

一台目のスイッチを押すと、二台目のLEDが点灯する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532235/cf2c761f-0f5f-42dd-b9fb-5eb7835cfb1d.png)

# プログラム

通信できるようにする準備の方法は、[Elixir・Nervesで複数のラズパイと通信したい](https://qiita.com/mnishiguchi/items/42785af280b378187c19)を参考にしまいた。

```Elixir

defmodule Node01 do
def input_loop do
  {:ok, switch} = Circuits.GPIO.open(17,:input)
  loop(switch)
end

def loop(switch) do
  x = Circuits.GPIO.read(switch)
  Node.spawn(:"nerves@192.168.77.65",fn -> Node01.led(x) end)
  Process.sleep(100)
  loop(switch)
end

def remote_start() do
  System.cmd("epmd", ["-daemon"])
  Node.start(:"nerves@192.168.77.6")
  Node.set_cookie(:securecookie)
  Node.connect(:"nerves@192.168.77.65")
end

def node_02_remote_start() do
  System.cmd("epmd", ["-daemon"])
  Node.start(:"nerves@192.168.77.65")
  Node.set_cookie(:securecookie)
end

def led(x) do
  {:ok, led} = Circuits.GPIO.open(18,:output)
  Circuits.GPIO.write(led, x)
end

end
```

一台目の方では、
remote_startとinput_loopを実行、
node_02_remote_start
を実行します。

# ハマったところ

Node.startやNode.connectの接続先の指定で"nerves@192.168.77.6"のようにIPアドレスを指定した記述にする必要がありました。
nerves01などで名前解決できるようにしておいて、
Node.start(:"nerves01")
のような記述で指定してみたんですが、これではうまくいきませんでした。
なにか方法はあると思うのですが、未解決です。

# まとめ

Node.spawnを使うことで、別のノードで関数を実行する事ができる事を確認できた。
Node.spawnでLEDのON/OFFする関数を指定してLED制御ができた
プログラム中に、IPアドレスを直接記述する必要があった。記述をしなくてもできるようにするのは今後の課題


参考
https://qiita.com/kikuyuta/items/c402d594ab55cbd883e7
https://qiita.com/mnishiguchi/items/42785af280b378187c19
【JavaScript】行頭〇文字のみ表示する

# はじめに
個人開発アプリのレイアウト作成中に、**「行頭10文字のみを表示したい！」と思ったのでその方法についてまとめます。**

# 解決方法
**`slice(〇文字目から表示,〇文字目まで表示)` を使う** 

今回は行頭10文字を表示し、それ以降は "..."と表示されます。
```tsx:tsx
<Text>
{article.contents.slice(0, 10)}...
</Text>
```

イメージ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3675500/3ebcd5bc-4563-75d5-a0d9-446eb5c23d2a.png)


# 参考

https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/slice
【Java】インタフェースの実装を覚える

インタフェースは抽象クラスと同じく抽象メソッドを扱いますが、この2つは何が違うのか、覚えるための自分用メモです。

# インタフェースとは？
インタフェースは、抽象クラスと違って継承のためのフィールド変数（定数は可）やコンストラクタ、具象メソッド（Java8から```default```メソッドは可）は記述せず、抽象メソッドのみを記述します。
（メソッドに自動で```public abstract```が付きます。）

# サンプルプログラム
例えば、以下のインタフェースを```Cat```クラスに実装するとします。
```java:Talker.java
public interface Talker {
    String talk();
}
```
インタフェースは、以下のような記述で実装できます。
```java:Cat.java
public class Cat implements Talker {
    private String name;
    public Cat(String name) {
        this.name = name;
    }
    @Override
    public String talk() {
        return "こんにちは。" + name + "だにゃー。";
    }
}
```
## 実装したクラスをインスタンス化する
インタフェースを実装したクラスをインスタンス化する記述は、通常のインスタンス化と変わりません。
```java:Main.java
public class Main {
    public static void main(String[] args) {
        Talker talker = new Cat("ムギ");
    }
}
```
## オーバーライドしたメソッドを呼び出す
オーバーライドした抽象メソッドは、通常のメソッドと同様に呼び出すことができます。
```java:Main.java
public class Main {
    public static void main(String[] args) {
        Talker talker = new Cat("ムギ");
        print(talker);
    }
    static void print(Talker talker) {
        System.out.println(talker.talk());
    }
}
```
**実行結果**
こんにちは。ムギだにゃー。
予算を設定してDatabricks使用量を監視できるようになりました

こちらのアップデートです。

[Create budgets to monitor account spending (Public Preview)](https://docs.databricks.com/en/release-notes/product/2024/june.html#create-budgets-to-monitor-account-spending-public-preview)

> アカウント管理者はお使いのDatabricksアカウントでの消費を追跡するために、予算を作成できるようになりました。予算には、ワークスペースやカスタムタグに基づいた支出を追跡するためのカスタムフィルタを含めることができます。[予算を使用してアカウントの支出を監視する](https://docs.databricks.com/ja/admin/account-settings/budgets.html)をご覧ください。

これは嬉しいアップデート。早速ウォークスルーします。

:::note info
**プレビュー**
本機能は[パブリックプレビュー](https://docs.databricks.com/release-notes/release-types.html)です。
:::

[アカウント コンソール](https://accounts.cloud.databricks.com/)にアクセスして**使用料**に移動します。**予算**タブが表示されています。
![Screenshot 2024-06-10 at 17.29.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/94d5e6b4-c52c-1ff5-4b5a-082f69cef70c.png)

予算を設定するために**Add budget**をクリックします。
![Screenshot 2024-06-10 at 17.29.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/fd5ad330-e379-974c-421e-bb34e50e643f.png)

名称、予算の金額(ドル)、必要に応じてワークスペースやカスタムタグを設定します。そして、予算超過時にメールを送信する際の宛先を指定します。空にした場合にはアラートメールは送信されます
![Screenshot 2024-06-10 at 17.29.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/2f956405-e55d-be0d-a248-30f3b5c2c2d7.png)
![Screenshot 2024-06-10 at 17.30.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/608b711e-6f58-bcd7-ef18-693f3df035e6.png)
**作成**をクリックします。

これで設定が完了しました。
![Screenshot 2024-06-10 at 17.30.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/55d8e58c-601c-4b6c-1e35-17446b403341.png)

しばらくするとモニタリングが開始します。1ドルにしていたのですでに超過してました。
![Screenshot 2024-06-10 at 18.42.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/c8366a10-3140-95f1-901a-0dcc12b5de66.png)

詳細を確認することができます。
![Screenshot 2024-06-10 at 18.42.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/8bdbc3a0-2b89-f5e2-66ec-ba5fa48446c2.png)

アラートメールも送信されていました。
![Screenshot 2024-06-10 at 18.42.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/52970d5b-3763-0b67-72ac-eb3bee59c226.png)

是非ご活用ください！

### はじめてのDatabricks

[はじめてのDatabricks](https://qiita.com/taka_yayoi/items/8dc72d083edb879a5e5d)

### Databricks無料トライアル

[Databricks無料トライアル](https://databricks.com/jp/try-databricks)
【WEB開発】バグの原因を特定するまでに考えていること

# 概要
自社プロダクトの開発リーダーを努めており、立場上バグ系の問い合わせの一次窓口になっています。そのため、これまで数多くのバグの一次調査や原因特定、場合によっては修正対応も行ってきており、バグの原因の特定の速さにはかなり自信があります。(少なくとも担当プロダクトについては)

そしてどうやら自分の中で無意識に実践しているデバッグのプロセス(原因特定までのプロセス)の型があるなというのに気づきました。
この記事でそのプロセスの型を言語化してみたいと思います。

※ なお本記事でバグと表現しているものは基本的にはWEBシステムのコーディングのバグを指します。

# はじめに(一番大事なこと)
これまでのデバッグ業務を通して、バグの原因を特定する上での一番重要だなと思うのが、 **「既存の仕様・実装を可能な限り把握しておく」** ことです。とは言え「そんなの当たり前じゃないか、それができれば苦労しないよ」って思われるかと思います。すぐに始められることとしては↓の辺を把握しておくことかなと思います。
 - 他のメンバーが今、何の機能を実装しているか、どのファイル、どの関数を改修しているか
 - 次のリリースで何の機能、改修がリリースされるのか

バグの問い合わせがあった際に、私はまず最近のリリース内容に原因がなさそうかを疑います。もちろんずっと昔に作り込まれたバグだけど最近まで発覚しなかったというケースもありますが、割合的には直近のリリースが原因になっているパターンの方が多いかなと思っています。そのため直近の改修内容をインプットしておくとバグの原因が見つけやすくなると考えています。

またこれを継続していくことで **「既存の仕様・実装を可能な限り把握しておく」** にも繋がっていきます。さらに既存の実装、仕様の把握不足で、**自身が実装する際にバグを作り込んでしまうリスクも抑える**ことができます。


# バグが発生してから原因特定までに考えていること
バグが発生してから原因を特定するまでのプロセスをまとめてみました。もちろんバグの内容によって進め方は異なりますが、一般的なアプリケーションのコードのバグは以下の流れで進めていくことが多いです。

どんなバグであれ、以下の2つがクリアできると原因の特定はもうすぐです。
 - バグの再現方法が明確になっている
 - バグを作り込んだコミットが特定できている

## 1. バグの再現方法を明確にしておく
調査を行いやすくするためにバグの再現方法は明確にしておきます。
いわゆる物理エラーであればエラーログ等も残っているため再現させやすいですが、論理エラーの場合は問い合わせ元のユーザーや社員に詳細な条件をヒアリングしながら試行錯誤することもあります。

## 2. ログを確認する
物理エラーの場合はログを確認して、エラーメッセージを確認します。
この段階で原因の実装に当たりがついている場合は、そこのコードを見にいきます。
Sentryなんかを導入している場合も調査に活用していきましょう。

## 3. (原因に心当たりがない場合)バグを作り込んだコミットを特定
原因の実装に全く当たりがつかない場合は`git bisect`等を使ってバグを作り込んだコミットを特定します。どのコミットを境にバグが発生するようになったかを特定します。これが特定できれば原因の特定は(きっと)もうすぐです。
ある程度原因のコミットに当たりがつく場合は`git reset --hard`で地道に確認することも多いです。

## 4. 原因のコードを特定
原因の実装やコミットが特定できたら、根本の原因となっているコードを特定しにいきます。
コードを見てすぐに原因がわかる場合も多いですが、さっぱり・・・という場合は↓の内容を試して当たりをつけることが多いです。
 - コードの一部を削除or復活させてみる
コードの一部を削除or復活させてみてバグが再現しなくなれば、そこのコードが原因の可能性が非常に高いと思われます！
 - 変数の中身の変遷をチェック
変数の中身が意図したものと違うというようなバグの場合、コードの何行目までは意図した値になっていて、何行目から想定外の値になっているのかを確認していきます。フロントでいうとconsole.logとか、Railsでいうとbinding.pryとかを使って変数の中身の変遷をチェックしていきます。

大抵のバグはここまでで原因を特定できることが多いです。

# バグが再現しない時に確認すること
特に論理エラーの場合ですが、「バグの再現方法を明確にしておく」が達成できないケースは意外とあります。そんな時に私が確認していることの例をまとめます。
バグ調査全般に言えることですが、先入観を持たずに色々な角度から分析してみることが重要です。

 - データをバグ発生環境と揃えてみる
基本の内容かと思いますが、バグに関連するデータをバグ発生環境と全く同じにして再現するか確認します。**意外とリレーションを貼ったレコード**が関係しているケースもあります。「このマスタデータが原因となっているに違いない」のように決めつけずに、関連する周辺のレコードにまで目を向けて調査すると良いです。
 - 類似の画面と比較してみる
例えばAマスタの参照ページで起きるバグの場合、Aマスタの編集ページは問題ないか、Bマスタの参照ページでは問題ないか、のような確認をします。(実装の差分の確認)
以前Aマスタの参照ページ表示時にエラーとなる不具合に遭遇し、どうしても再現ができない状況にありました。調査していく中でAマスタの編集ページではバグが起きないことに気づき、実装の差分を比較したところ詳細ページにはマスタの変更履歴の表示がありました。この変更履歴を管理する実装がバグの原因となっておりました。
 - データの変更履歴を追う
データが絡むバグの場合は、その変更履歴を辿ったりもします。想定外の使われ方をしていることに気付けたりもします。(変更履歴を簡単に終えるライブラリを導入しておくと楽です。)
 - 実行ユーザーの権限をバグ発生環境と揃えてみる
データを揃えるに近いですが、上位の権限だと下位の権限では発生するバグが発生しなかったりする場合もあります。
 - 環境起因を疑う
使っているOS,ブラウザ、ネットワーク環境の状態等を確認します。WindowsとMacのOSの違いによるバグや評価対象外のブラウザでのみ発生するバグというのも一定数ありました。




# (おまけ)バグの原因特定後に必ず考えていること
バグの原因が特定できた後は修正を進めていくのですが、毎回必ず意識しているのが **バグの横展開(他の実装でも同様のバグが存在しないか)** です。例えばAマスタで発生したバグであれば、Bマスタでは問題ないか、編集画面で発生したバグであれば参照画面の方は問題ないか、みたいな意識です。
バグの原因を特定できると真っ先に修正を進めたくなりますが、合わせて修正をすべきバグを見落としていないかを常に意識するようにしています。
【CakePHP5】PHPStanを使う


# はじめに

こんにちは、エンジニアのkeitaMaxです。

前回DockerでCakePHPの環境を整えて、最初の画面表示まで行いました。

https://qiita.com/keitaMax/items/6152aa9fff66bee4e887

今回はPHPStanを使用できるようにしたいと思います。

# インストール

以下のコマンドでインストールします。

```
composer require --dev phpstan/phpstan
```

# 実行

```
docker compose exec app bash
```

上のコマンドでコンテナの中に入った後、以下コマンドでPHPStanを実行することができます。

```
./vendor/bin/phpstan analyse
```

実行すると以下のように解析をしてくれます。

```
root@4ab649b0155e:/app# ./vendor/bin/phpstan analyse
Note: Using configuration file /app/phpstan.neon.
⚠️  You're using a deprecated config option checkGenericClassInNonGenericObjectType ⚠️️

It's strongly recommended to remove it from your configuration file
and add the missing generic typehints.

If you want to continue ignoring missing typehints from generics,
add missingType.generics error identifier to your ignoreErrors:

parameters:
        ignoreErrors:
                -
                        identifier: missingType.generics

 7/7 [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓] 100%


                                                                                                                        
 [OK] No errors                                                                                                         
                                                                                                                        

root@4ab649b0155e:/app# 
```


また、以下のコマンドでも実行可能です。

```
composer stan
```


# 設定ファイル

設定ファイルは、'composer.json'と同じ階層にある`phpstan.neon`です。

以下のように設定してあります。

```neon:phpstan.neon
parameters:
    level: 8
    treatPhpDocTypesAsCertain: false
    checkGenericClassInNonGenericObjectType: false
    paths:
        - src/

```

# おわりに

次回はGitHubAcrtionsを使ってGitHub上で実行したいと思います。

この記事での質問や、間違っている、もっといい方法があるといったご意見などありましたらご指摘していただけると幸いです。

最後まで読んでいただきありがとうございました！

# 参考

https://qiita.com/keitaMax/items/a63e3a93f1d2f2d10473


# 次の記事

https://qiita.com/keitaMax/items/6e354b9a0b7c54344fa1