OmniAICreator/Qiita-1.07M huggingface dataset:
Windows11 24H2  VirtualBox インストール/起動時のエラー対応

# 解決方法
1. インストール済みのVirtualBoxをアンインストール
2. バージョン 6.1.50　インストール
3. バージョン 6.1.50　アンインストール
4. バージョン 6.0.0　インストール
5. バージョン 7.1.6　インストール ※6.0.0を入れた状態で実施

旧バージョンインストーラー
https://www.virtualbox.org/wiki/Download_Old_Builds

:::note info
アンインストールはインストーラーから実行。
:::
# エラー時に発生した内容
インストール後
` Installation failed! Error:インストール中に致命的なエラーが発生しました。 `

終了コード
`E_FAIL (0X80004005)`

VBoxHardening.log
`Error opening VBoxDrvStub:  STATUS_OBJECT_NAME_NOT_FOUND`

# 最後に
バージョンアップさせるという事が肝なようですが、直接的な要因はわかりません。
正常に動いているのか保障できません。
ヘッドレスモードでも起動できました。
24H2の環境で正常にインストールできるようになってほしい。
C#のコンソールアプリでSystem.Windows.Formsのコントロールを使いたい

# 1. はじめに
* C#のコンソールアプリでSystem.Windows.Formsのコントロールを使いたい

# 2. 開発環境
* C#
* .NET Framework
* Visual Stduio 2022
* Windows 11

# 3. 参照設定の追加
## 3.1. ソリューションエクスプローラーから ```参照``` > ```参照の追加``` を選択する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852081/841286e2-e797-4ebb-aa40-0fd1ccc6bd17.png)

## 3.2. アセンブリから ```System.Windows.Forms```にチェックを追加する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852081/fccdd421-2796-4686-abc3-9c054f3c4507.png)

# 4. 動作確認
* using で ```System.Windows.Forms```が選択できるようになった
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852081/25bf9b7d-98bd-4af3-82ed-26b70cb6d233.png)

# 5. 参考文献

https://ameblo.jp/oregano-blog/entry-10490453493.html
AWS初学者が、2週間でAIFとSOAの2資格に合格した話

# 2週間でAIFとSOAの2資格に合格した話

## はじめに
初めまして！
新卒一年目のHiroと申します。
私はAWSのSysOpsに業務で携わったことはありませんし、AI・統計を学んだことすらありません。
しかし先月2週間で2つのAWS資格（AIF、SOA）に合格しましたので、その体験記を記述します。
- AWS SOA - AWS Certified SysOps Administrator - Associate
- AWS AIF - AWS Certified AI Practitioner
- 
本記事では学習方法や試験当日の流れを紹介します。  
**学習量0から、最短日数で合格したい方々**の参考になりましたら幸いです。

## 外観
私は受験の時点でCLFとSAAを所持していました。
試験内容としては以下のような能力が求められておりました。
- **AWS SOA** - SysOpsカテゴリにおけるSAAレベルのAWS知識に加え、想定される運用シナリオに対して有効なサービスを選択する力
- **AWS AIF** - CLFレベルのAWS知識に加え、AI・統計の知識

SOAに関しては元々はラボ（ハンズオン試験）も筆記試験に加えて行われていたようですが、筆者の受験した時点では一時的に中止となっていました（2025年2月上旬時点）
AIFに関してはAWS知識のみならず、AIや統計の知識も求められていました。

## 学習方法
学習法としては、双方ともにWeb問題集を解くことを中心に試験対策を行いました。
また、私はAI・統計の手法等を学んだことがありませんでしたが、
理解の浅い部分は後述するYoutubeチャンネルの動画で学びを深めることができました。

## 使用した学習教材
使用した教材は、以下の2点です。

- Cloud Tech（有料web問題集）
https://kws-cloud-tech.com/
- スタビジ（Youtubeチャンネル。初学者にもわかりやすくAI関連の解説を行っている。）
https://youtube.com/@aiby8596?si=IsILKg7nwSITuz8v

## 学習スケジュール
平日：1日**3~5時間程度**の勉強を**2週間**続けました。  
休日：1日**8時間程度**の勉強をおこないした。  
基本的にはCloud Techをメインに、以下の流れで学習します。
- ① 1〜2周目：全問題を解く。
    - 時間がかかっても良いので、ここでは解説を読み込み、理解を重視して学習を行う。
    - 解説だけで理解の難しい問題は、Youtube動画等で理解する。
    - 2周目で間違えた問題・苦手な問題はラベルを貼っておく。
- ② 3周目：ラベルを貼った問題のみを一気に解く。
- ③ 試験直前(ⅰ)：全問題を1周する。
    - ここで間違えた問題や不安な問題については改めてラベルを貼る。
- ④ 試験直前(ⅱ)：ラベルを貼った問題を解く。

## 試験対策のポイント
- **考えても理解できない部分は、後回しにする。理解できる部分をどんどん増やす。**
    -　特に時間がない場合は念頭におきたいですが、解答時点では理解のし辛い問題に直面した場合、一旦別のことを考えたり他の知識を学ぶことで後にわかるようになることもあります。一旦放置することを恐れず、全体的な知識をどんどん増やしましょう。
- **アウトプット重視の学習を行う**
    - インプット重視の学習では飽きてしまう。（私はすぐに飽きた。）
    - 問題を解いたり、Qiita記事にまとめるなどして、アウトプットを通じて知識を定着させると良い。
- **似たような分類分け・統計手法の違い**を図や表にしてまとめて理解すると良い。（例：ROUGE vs F1 vs BLUE, etc...）    
- **自分にとって、わかりやすい教材を選ぶこと**が大切。
    - 「古くから使われている」「皆が使っている」等の言葉は、教材を探す手掛かりに過ぎない。
    - 学習の初期段階で軽く様々なものに触れてみて、**自分の理解しやすい教材を選ぶこと**にこだわろう。（私は、上記Youtubeチャンネルが非常に参考になった。）
## 試験当日の流れ
- テストセンターで受験しました。
- 時間は130分でした。
- 考えるというよりも知識を問う問題が多いため、
時間には余裕があると思います。

## 結果と感想
- 両方とも無事**合格**しました
    - AIF　（863点/700点合格）
    - SOA（722点/720点合格）
- 試験対策をしっかりすれば、私のようなAI・統計実務未経験者、IT初心者でも合格できました。  

## 合格のコツ
- **範囲が広いため、飽きにくい学習方法を見つけて取り組むことが大切！**
- 受験の申し込みを先に行い**締切を設定**することで、学習意欲up！
- **似たような分類分け・統計手法の違いをまとめ、理解することが大切** 
---
- 時間のある方は、理解を大切にゆっくり学習を行ってください！

- 去年にはCLFとSAAに合格しています。（別記事にまとめております。）
- 時間のある人は、**AWS Skill Builder**（無料の公式トレーニング）に触れてみても良いかもしれません。
- また、ハンズオンを経験するとより一層知識が深まり、その他AWS資格学習にも役立つと思います！

以上、AWS SOA、およびAIFの合格体験記でした！  
参考になれば嬉しいです。
ASTERIA Warpフローの作成前にフォルダ構成を検討する

### フォルダ構成

フローを作成する前に、プロジェクト単位でフォルダを構成するか、事業部単位でフォルダを構成するかに正解はありません。組織の規模や開発体制、プロジェクトの性質などに応じて適切な方法を選択する必要があります。

当社では、事業部ごとにフォルダを作成し、各プロジェクトごとにデータやログなどのサブフォルダを設けて運用しています。参考になれば幸いです。

#### 一つの環境をフォルダで分けて、テスト環境と本番環境を運用
```
/production
/development
```

#### 事業部ごとにフォルダを作成
|事業部|英語|
|:-:|:-:|
|営業部|sales|
|財務部|finance|
|経理部|accounting|
|人事部|humanresources|
|マーケティング部|marketing|
...... |略|

| 項目 | 命名規則 | 例 |
|:-:|:-:|:-:|
|環境フォルダ|小文字|production, development|
|事業部フォルダ|小文字、スペースなし|sales, finance|
|プロジェクトフォルダ|小文字、ハイフン使用|project-aaa|
|フロー名|小文字、プロジェクト名/略語|project-aaa.xfp|
|データファイル|目的+日付|sales-data-20250301.csv|
|ログファイル|目的+日付|logs-20250301.csv|

### フォルダ構成
```
/production
├ /sales
│   ├ /project-aaa
│   │   ├ /data
│   │  　 └ sales-data-20250301.csv
│   │   ├ /logs
│   │  　 └ logs-20250301.csv
│   │   └ project-aaa.xfp
│   └ /project-bbb
│    　   ├ /data
│    　   ├ /logs
│    　   └ project-bbb.xfp
├ /finance
│   └ /project-ccc
│    　   ├ /data
│    　   ├ /logs
│    　   └ project-ccc.xfp
├ /accounting
│   └ /project-ddd
│    　   ├ /data
│    　   ├ /logs
│    　   └ project-ddd.xfp
├ /humanresources
│   └ /project-eee
│    　   ├ /data
│    　   ├ /logs
│    　   └ project-eee.xfp
├ /marketing
│   └ /project-fff
│    　   ├ /data
│    　   ├ /logs
│    　   └ project-fff.xfp

/development
├ /sales
│   ├ /project-aaa
│   │   ├ /data
│   │  　 └ sales-data-20250301.csv
│   │   ├ /logs
│   │  　 └ logs-20250301.csv
│   │   └ project-aaa-dev.xfp
│   └ /project-bbb
│    　   ├ /data
│    　   ├ /logs
│    　   └ project-bbb-dev.xfp
├ /finance
│   └ /project-ccc
│    　   ├ /data
│    　   ├ /logs
│    　   └ project-ccc-dev.xfp
├ /accounting
│   └ /project-ddd
│    　   ├ /data
│    　   ├ /logs
│    　   └ project-ddd-dev.xfp
├ /humanresources
│   └ /project-eee
│    　   ├ /data
│    　   ├ /logs
│    　   └ project-eee-dev.xfp
├ /marketing
│   └ /project-fff
│    　   ├ /data
│    　   ├ /logs
│    　   └ project-fff-dev.xfp
```




---
参考：

https://qiita.com/Aloha2691/items/df9dde9e8dffd1d6be84

https://data.library.arizona.edu/data-management/best-practices/data-project-organization

https://github.com/goldbergyoni/nodebestpractices/blob/master/README.md
Next.js App Router のフォルダ構成 ― 実践的なノウハウとちょっとした豆知識

Next.js の App Router は、すごく自由度が高い反面、「こうしなきゃ！」という決まったルールがないため、プロジェクトごとに「最適な形」を見つけ出さなければならないところが魅力でもあり悩みの種でもあります。この記事では、実際に開発していて感じたこと、そして「こんな豆知識もあるよ！」という話をしてます！
参考になれば幸いです！

⸻

## 1. 基本の構成などない

まず最初に言いたいのは、Next.js の App Router には「これが基本！」という決まり文句はないということ。
	•	シンプルに始めよう
プロジェクトの最初は、app/page.tsx と app/layout.tsx だけで十分です。あとは、必要に応じて機能が増えるたびに、どんどんフォルダを細かく分けていくスタイルで大丈夫です。
	•	プロジェクトごとのアレンジ
規模や目的に合わせて、後から「こんな感じにしよう」とフォルダを整理していけばいいので、初めから完璧にしようとせず、柔軟に対応していくことが大切です。

⸻

## 2. レイアウトやコンポーネントの置き場所

### グローバルと局所のレイアウト
	•	グローバルレイアウト
全ページ共通のデザインは、app/layout.tsx にまとめます。ここにヘッダー、フッター、共通ナビゲーションなんかを置けば、どのページも同じ雰囲気に仕上がります。
	•	局所レイアウト
例えば、dashboard や about といった特定のセクションだけ、全体とは違うデザインにしたい場合、そのディレクトリ内に layout.tsx を置くことで、個別にレイアウトを設定できます。

豆知識：
複数の layout.tsx があるとき、Next.js は一番近い階層のレイアウトを優先するので、意図しない挙動にならないよう注意が必要です。共通パーツは別のコンポーネントに切り出して、components/ フォルダにまとめると整理しやすいですよ。

⸻

## 3. パスと命名に関するちょっとした裏技

### () で囲むとパスに現れない

これ、結構知られていない豆知識なんですが、フォルダ名を丸括弧 () で囲むと、そのグループは URL パスに反映されなくなるんです。
	•	例：
app/(marketing)/page.tsx とすると、実際の URL には「marketing」が表示されません。
→ この仕組みを使えば、内部の整理やグループ分けはしながらも、URL をシンプルに保つことができるんです。

### 角括弧 [ ] で動的ルート

動的ルートを作るときは、フォルダ名を角括弧 [ ] で囲みます。
	•	例：
app/dashboard/users/[id]/page.tsx は、/dashboard/users/123 のような URL を自動生成してくれます。
→ これは非常に便利なので、ユーザーごとのページや商品詳細ページなどに活用できます。

### その他の命名の注意点
	•	予約済みのファイル名
page.tsx、layout.tsx、loading.tsx、error.tsx、not-found.tsx などは Next.js が特別扱いしているので、名前はそのまま使いましょう。
	•	アンダースコアで始まるフォルダ
一部の開発者はアンダースコアを使って内部用ファイルを区別することがありますが、App Router ではアンダースコアが付いていてもルーティングに含まれるので注意してください。
	•	大文字・小文字
OS によっては大文字小文字が区別されるので、命名規則は一貫性を持たせるようにしましょう。

⸻

## 4. API ルートの整理と注意点

API ルートは、app/api/ 配下に整理します。
	•	例：

app
 └── api
     ├── auth
     │   └── route.ts  // /api/auth
     └── posts
         └── route.ts  // /api/posts


豆知識：
API ルートは必ず route.ts というファイル名にする必要があります。また、HTTP メソッドごとにエクスポートされた関数（GET、POST など）で実装するので、実装方法は公式ドキュメントを参考にしてみてください。
階層が深くなりすぎると URL が冗長になりがちなので、必要に応じて整理することも大事です。

⸻

## 5. プロジェクト規模に合わせた柔軟な整理方法
	•	最初はシンプルに
プロジェクト開始時はシンプルな構成から始め、機能が増えるに従って徐々にコンポーネントやユーティリティを components/ や lib/ などのフォルダに分けていくと良いでしょう。
	•	ドメインごとの分割
ビジネスロジックや機能ごとにフォルダを分ける「ドメイン駆動設計」を採用すると、チーム全体での理解や保守性が高まります。
例：app/dashboard/ や app/marketing/ など、機能別にディレクトリを作ると見通しが良くなります。
	•	ドキュメントの整備
チームで開発している場合、どのフォルダがルーティングに含まれるか、どのフォルダは内部整理用かを README や Wiki にまとめておくと、後から参加したメンバーにも親切です。

⸻

## 6. まとめ

Next.js App Router のフォルダ構成は、決まった正解がない分、自分たちの開発スタイルに合わせて自由に設計できるのが魅力です。
	•	() で囲むとパスに反映されない 仕組みは、内部整理と URL のシンプルさを両立できる強力なツールです。
	•	角括弧 [ ] を使って動的ルートを実装し、予約済みファイル名や命名規則を守ることで、Next.js の仕組みを最大限に活用できます。
	•	プロジェクトが成長するにつれて、柔軟にフォルダ構成を見直し、チーム内でルールを共有することで、より効率的な開発環境を作り上げていくことができます。

こんな感じで、日々の開発の中で「こんな裏技もあったんだ！」と実感しながら、試行錯誤して自分たちにぴったりのフォルダ構成を見つけていってください。開発は決して一本道ではなく、柔軟性と工夫が成功へのカギです。
windows serverに機能追加できない！

# windows serverに機能追加できない！
### エラーの概要
エラーID：0x80010111
機能追加・削除しようとすると上記エラーIDが出てインストール、そもそも追加・削除できる機能の一覧が出てくれませんでした。

### 結論
cortexを無効化してPC再起動したらインストールできました！
一応下記も試していましたが、あまり関係ないかも、、、
``` bash
Get-WindowsFeature
```

cortexを停止する場合は皆様の運用手順をご確認ください。
XDRをとめることになるので、ご注意ください


## 環境
OS:windows server 2022 standard
hyper-Vの仮想サーバーで、入れているものはcortexくらいだったはず。。。
今思うと、怪しいのはcortexくらいですが、IT初心者でHyper-Vを初めて使ったのと、
cortexがwindows server2022に対応しているバージョンだったので、考えが及ばず＞＜

あまり同様のエラーはないかもですがご参考になれば嬉しいです＾＾
uv 利用時に仮想環境を作成しない

uv を使用するとプロジェクトフォルダに仮想環境として `.venv` ディレクトリが作成されるのがデフォルトの動作となっているが、Docker コンテナ内で uv を使用している場合はすでにコンテナによって隔離された環境が作られているにも関わらず、さらに venv によって仮想環境を作られてしまうことになる。これは二重で環境を隔離することになっていてなんだか気持ち悪いし、PATH を通したりするのも面倒くさいのでできればやめたい。

Poetry のときは `poetry config virtualenvs.create false` によって仮想環境を作らない選択ができたが、uv の場合はバージョン 0.4.4 で追加された環境変数 `UV_PROJECT_ENVIRONMENT` を設定することで同じことが実現できるようだ。

https://docs.astral.sh/uv/concepts/projects/config/#project-packaging

以下の Dockerfile では、環境変数 `UV_PROJECT_ENVIRONMENT` にシステム Python がインストールされているパス `/usr/local` を指定することで仮想環境を作成せずにシステム Python 環境に直接パッケージをインストールするようにしている。

``` Dockerfile:Dockerfile
FROM python:3.13

ENV UV_PROJECT_ENVIRONMENT /usr/local

RUN pip install uv
```

どうやらこの機能自体が Docker や CI といった既に隔離されている環境で使用することを想定して作られたらしい。

https://github.com/astral-sh/uv/pull/6834

この PR にも書いてあるが、`uv sync` はプロジェクト依存関係に存在しないパッケージを削除する挙動をするので、適切に隔離できていない (≒ 他の Python プロジェクトから参照されるような) Python 環境でこの設定を使うと環境が壊れてしまうことになりかねないので注意されたい。
CaLang初回テスト

# Calang初回テスト
初めましてCaLang_Labのじゅぴです
**計算特化型言語CaLang**の第一回目のテストです
## テスト内容
python ~~・node.js・C#との計算速度の比較~~
(PythonでNumpyに大差で負けたためnode.js以降は打ち切り)
計算速度を計測するにあたり以下の計算を行います
**・フィボナッチ数列の再帰的計算(n=40)**
**・巨大素数の計算(10万桁)**
# フィボナッチ数列の再帰的計算
CaLangでは計算速度の測定は実装していないのでpythonでsubprocessをつかいコマンドラインを操作し、時間を測定します。
```python
import time
import subprocess

def run_command_and_measure_time(command):
    start_time = time.time()
    result = subprocess.run(command, shell=True, capture_output=True, text=True)
    end_time = time.time()
    elapsed_time = end_time - start_time
    print(f"Command Output:\n{result.stdout}")
    print(f"Command Error (if any):\n{result.stderr}")
    print(f"Time taken: {elapsed_time:.10f} seconds")

if __name__ == "__main__":
    command = "D:\\mast\\lexer.exe main.ca"
    run_command_and_measure_time(command)

```
```bash
PS D:\mast> python3 main.py
Command Output:
Result: 102334155

Command Error (if any):

Time taken: 0.5435197353 seconds
```
結果は0.5435197353秒でした
続いてPythonやそのほかの言語でも計測します
# pythonでのフィボナッチ数列の再帰的計算
```python
import time

def fib(n):
    if n <= 1:
        return n
    return fib(n - 1) + fib(n - 2)

if __name__ == "__main__":
    n = 40 
    start_time = time.time()
    result = fib(n)
    end_time = time.time()
    elapsed_time = end_time - start_time
    print(f"fib({n}) = {result}")
    print(f"Time taken: {elapsed_time:.10f} seconds")

```
```bash
PS D:\mast> python3 main.py
fib(40) = 102334155
Time taken: 12.9329898357 seconds
```
結果は12.9329898357とかなり遅かったです。
Numpyなどのモジュールを使って検証してみます
```python
import time
import numpy as np
def fib(n):
    if n <= 1:
        return n
    memo = np.zeros(n + 1, dtype=int)
    memo[0], memo[1] = 0, 1
    for i in range(2, n + 1):
        memo[i] = memo[i - 1] + memo[i - 2]
    return memo[n]
if __name__ == "__main__":
    n = 40
    start_time = time.time()
    result = fib(n)
    end_time = time.time()
    elapsed_time = end_time - start_time
    print(f"fib({n}) = {result}")
    print(f"Time taken: {elapsed_time:.10f} seconds")
```
```bash
PS D:\mast> python3 main.py
fib(40) = 102334155
Time taken: 0.0000257492 seconds
```
0.0000257492秒....
CaLangは0.5435197353秒だったのでNumpyに負けてしまいました。
次回のテストまでにNumpyの計算速度に近づけたいと思います。
以上第一回テストでした!
プレリリースα0.0.1は3/17にリリース予定なのでお楽しみに
【Rails】エラー「uninitialized constant ActiveSupport::LoggerThreadSafeLevel::Logger (NameError)」の解消

# 記事概要
Railsの新規アプリ作成時に発生するエラー`uninitialized constant ActiveSupport::LoggerThreadSafeLevel::Logger (NameError)`を解消する方法について、記述する。

# 事象
1. Railsの新規アプリを作成するために、`rails _7.0.0_ new [アプリ名] -d mysql`を実行
1. 下記エラーにより、新規アプリが作成されない
    ```
    uninitialized constant ActiveSupport::LoggerThreadSafeLevel::Logger (NameError)
    ```

# エラー原因
コマンドで指定したバージョンが古いため

# エラー解消方法
1. バージョンを指定せず、下記コマンドでRailsを新規作成する
    ```
    rails new [アプリ名] -d mysql
    ```
2. コマンドが正常に実行され、最新バージョンのRailsアプリが作成される

# 参照した記事
- [🚀 Rails で rails new 実行でエラー？解決策](https://qiita.com/irochi/items/61329a6e6909a911dbe1)
    - アップグレードするリスクがあるため、アップグレードは回避する
    - バージョンを指定しないことで、エラーが解消された
- [【Rails】uninitialized constant ActiveSupport::LoggerThreadSafeLevel::Logger (NameError)の対処法](https://qiita.com/Taira0222/items/89fe772eb8d752da4db7)
    - bundle installのスキップオプションでRailsの新規作成を試みたが、エラーが解消されない
- 参照記事不明
    - activesupportをupdateしたが、エラーが解消されない
    - loggerをupdateしたが、エラーが解消されない
JAWS-UG初登壇体験記（『非IT学部新卒社員、AWSへの挑戦！』）

# JAWS-UG 2025新年LT大会 登壇体験記

## はじめに

こんにちは！AWSを学び始めて4ヶ月の新人エンジニア（？）のHiroです
遅ればせながら、今年の1/14(火)に大崎のLIXIL様の本社で行われた
「JAWS-UG初心者支部＋千葉支部合同で re:Invent 2024 re:Cap オフラインイベント！＠大崎！」
における登壇体験記を記載します。
筆者は今年の新入社員で当イベントが社外内含めての登壇経験であり、非常に緊張しておりました。
きっかけや準備、当日の様子、得たことについて振り返ります。

イベントリンク
↓
https://jawsug-chiba.connpass.com/event/339121/

## 登壇のきっかけ

私は新人の1年間における様々な挑戦を通じて、AWSの知識・技術のみならず発信能力を身につけたいと考えておりました。
また、技術的にはまだまだ未熟ではありましたが、早いうちから登壇経験を積むことによって、人前で臆さず発表できる力を身につけられると考えました。
そこで、「初心者LT枠」という募集があるのを見て、思い切って応募しました。

## 登壇準備
- 資料作成
- 10分で収める練習

### テーマ選定

登壇するにあたり、私が行っている社内での取り組みをもとにテーマを決めました。
今回は「社内におけるAWS関連の取り組みと、今後の展望」について話すことにしました。

### リハーサル

事前に何度もリハーサルを行い、時間内に収まるように調整しました。
また、話す内容を簡単なメモにまとめ、スムーズに話せるように準備しました。
当日は想いを伝えるため一切メモを見ないで話せるように、プレゼン内容を体に染み込ませていきました。


## 当日の様子

当日は50人弱の参加者の方々がいらっしゃったかと思います。
登壇の順番が近づくにつれ、緊張が高まりました。
しかし、一緒に来てくださった会社の先輩や会場の温かい雰囲気のおかげで、なんとか発表を終えることができました。
登壇後は、多くの方に「勉強になった。」「新人なのにすごい！」なかには、「感動しました！」と声をかけてくださる方もおり、とても嬉しく学習のモチベーションも高まりました。

## 登壇を通じて得たこと

- **アウトプットの大切さ**
  - 自分の学びを整理し、人に伝えることで理解が深まる。
- **コミュニティの力**
  - JAWS-UGの温かさを実感し、今後も積極的に関わりたいと思った。
- **自信の向上**
  - 初めての登壇は不安だったが、実際にやってみると達成感があった。

## まとめ

JAWS-UGへの登壇は、AWS学習の大きなステップになりました。
もし新人の方や、技術力を持っていない方がいらっしゃっても、「登壇してみたい！」という気持ちに従って、ぜひ挑戦してみてください。
どんな発表を行なっても、JAWSというコミュニティは暖かく受け入れてくれると思います！
また、ご自身の成長にもきっと繋がると思います。

私自身、初めての参加でわからないことが多く、当日含めたくさん質問をいたしましたが、快くサポートいただけたことで不安なく登壇を行えました。
改めて、運営の皆様や応援してくださった方々に感謝します。
ありがとうございました！
DBeaverでのER図表示に関するメモ

DBeaverでER図を表示する時の操作をメモしておく。
バージョン25.0のWindows版で確認。バージョンによってUIや画面構成が変わる場合があるので注意。

:::note
関連記事
[DBeaverの使い方メモ](https://qiita.com/12345/items/48f6856e32fd618ea307)
[DBeaverでフォントを変更する設定のメモ](https://qiita.com/12345/items/fe68c08bbae4b4b37d90)
:::

 **[データベースナビゲータ]** のツリービューの **[テーブル]** をダブルクリック
<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/181011/589fdc57-a88f-41c0-a1f6-a1aecb82c7dc.png width=50%>

**[図]** タブをクリック
<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/181011/f402c7a5-5f5a-4eaa-a3ea-b65473e616a1.png width=50%>

ER図が表示される。
<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/181011/90101a4b-ec95-4be5-95a6-99d519d0e722.png width=60%>

記法は`IDEF1X`と`Crow's Foot`が選べる。デフォルトは`IDEF1X`。
記法を変更するにはER図の空白のエリアを右クリックしてポップアップメニューの **[Notation]** から変更したい記法を選択する。
<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/181011/cfea3117-6ada-45c5-bcef-eadc4f9f00e0.png width=80%>

Crow's Footに切り替えたところ。Crow's Footの時だけカーディナリティが表示される。
<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/181011/d5322460-26ad-421a-a469-501a6a16eeb9.png width=60%>

表示フォントはテーブル名・カーディナリティ・その他で別々に設定・変更できる。変更方法は関連記事（本記事冒頭のリンク）参照。
Android 10以上で壁紙の履歴を削除する方法

Androidで壁紙の履歴を削除する方法です。
# 事始め
XPERIA XZ 3の背景に猫の写真を設定。
その後、気分が変わって元の画面へと戻すことに。
しかしここで**壁紙の履歴が残る**ことに気が付く。
これは困った。
勝手に写真が残るのは気持ち悪い。
そこで、履歴を削除することにした。
# 失敗例
以下は失敗例です。
## その1 壁紙フォルダを探る
`adb shell`でシェルへ。
その後、以下の場所を`ls -a`するも無し。
 - `/storage/emulated/0/Wallpaper/` -> Not Found
 - `/data/system/users/0/wallpaper/` -> Permission denied
 - `/sdcard/Wallpaper/` -> Not Found

冷や汗が出る。
まずい。
そして以下の場所を`ls -a`するも無し。
 - `/sdcard/DCIM/`
 - `/sdcard/Pictures/`
 - `/storage/emulated/0/Pictures/`
 - `/storage/emulated/0/DCIM`

## その2 wallpaperアプリを探る
同じくshellで、`pm list packages | grep wallpaper`。
出てきたやつを片っ端から`pm clear`していく。
そして最後に`adb reboot`。

...だーめ。
猫ちゃんはその愛くるしい寝姿とともに蘇ってきた。
まずい。
そしてここで寄り道。
`com.android.settings`とかを関係しそうなものを`am start -n`していく。
意味もなく`adb shell dumpsys package com.android.settings | grep wallpaper`してみたり。
隠し設定がないか探る自分が相当焦っているのが分かった。


# 成功例
そしてついに成功例を導き出す。
ヒントは最初のほうに実行していた`pm clear`だった。
<details><summary>こたえ＆Why？</summary>

ヒントは最初の`pm clear`。
「ホーム画面を管理してるのはホームアプリだから、これのデータを削除したらいいのでは？」と思いつく。
そこで、`pm list packages | grep home`をしてみるといくつかのアプリとともに`com.sonymobile.home`が出てきた。
そしてホームレイアウトを犠牲にした。
```Shell
adb shell pm clear com.sonymobile.home
```
祈りながらEnterキーを押した。
その瞬間、XPERIAの画面が真っ暗になった。
約3秒後、`Success`という文字とともにホーム画面が戻ってきた。
</details>

...そして壁紙を探してみると...ない！
あれほど苦労していた壁紙の履歴が消えている！
ほっと一息つくことができた瞬間だった。

# まとめ
壁紙の履歴を消すには、
 - ADBデバッグを使う
 - `pm clear`を使う

...ネタバラシしたくないのでここまでで止めておく。(上にこたえ書いてる)
自分で考えてから答えを開いてみてね。
Linuxコマンド入門：「cd」「ls」「cat」の基本コマンドを自分なりに体系的にまとめてみた

## はじめに
Linuxを扱う上で、基本的なコマンドを理解することはとても重要です。

:::note info
**本記事では、特によく使われる「cd」「ls」「cat」の3つのコマンドについて解説します。**
:::

初心者の方でもスムーズに使えるよう、基本的な使い方と実践例を紹介します。

## 書こうと思ったきっかけ
Linuxの操作を効率的に行うためには基本コマンドの理解が不可欠です。


:::note warn
***初心者の方がスムーズに学習できるように、よく使うコマンドを整理しました。***
:::

特に「cd」「ls」「cat」は頻繁に使用するため、詳しく解説します。

## 1. `cd` コマンド（ディレクトリの移動）
`cd`（change directory）コマンドは、現在の作業ディレクトリを変更するために使用します。

### 使い方
```
cd ディレクトリ名
```

### 使用例
- ホームディレクトリに移動
  ```
  cd ~
  ```
- `/var/log` に移動
  ```
  cd /var/log
  ```
- 親ディレクトリへ移動
  ```
  cd ..
  ```
- 直前のディレクトリに戻る
  ```
  cd -
  ```

**実際のターミナル画面**

![Screenshot 2025-03-11 at 20.51.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/bb930631-214e-4216-8363-1ea92988b46e.png)

## 2. `ls` コマンド（ファイルやディレクトリの一覧表示）
`ls` コマンドは、ディレクトリ内のファイルやサブディレクトリを一覧表示するために使用します。

### 使い方
```
ls [オプション] [ディレクトリ名]
```

### 主なオプション
- `-l` ：詳細情報を表示
- `-a` ：隠しファイルを含めて表示
- `-h` ：ファイルサイズを人間が読みやすい形式で表示

### 使用例
- 現在のディレクトリの一覧表示
  ```
  ls
  ```
- 詳細情報を表示
  ```
  ls -l
  ```
- 隠しファイルを含めて表示
  ```
  ls -a
  ```
- サイズを人間が読みやすい形式で表示
  ```
  ls -lh
  ```

**実際のターミナル画面**

![Screenshot 2025-03-11 at 20.53.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/39da353c-cc2f-4c1e-9b51-f8bab5572a5f.png)

## 3. `cat` コマンド（ファイルの内容を表示）
`cat`（concatenate）コマンドは、ファイルの内容を表示するために使用されます。

### 使い方
```
cat ファイル名
```

### 使用例
- ファイルの内容を表示
  ```
  cat sample.txt
  ```
- 複数のファイルを結合して表示
  ```
  cat file1.txt file2.txt
  ```
- 行番号を付けて表示
  ```
  cat -n sample.txt
  ```

**実際のターミナル画面**

![Screenshot 2025-03-11 at 20.54.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/fd50537c-5403-4bbf-96af-3fd251893995.png)

## まとめ
- `cd`：ディレクトリの移動
- `ls`：ディレクトリ内のファイルやフォルダを表示
- `cat`：ファイルの内容を表示

これらの基本コマンドを覚えておくことで、Linuxの操作がよりスムーズになります。
Notify関数でアプリ上部に通知を表示する


Notify関数で画面上部に通知を表示することができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3880604/82d8cc81-32d5-458e-94c8-15fd6a5cf577.png)

```
Notify("メッセージ")
```
▲OnSelectプロパティなどに上記のように記述することで使用できます。
シンプルで使いやすい関数です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3880604/cc9f3d23-9ea2-45a5-bea2-57fee246bf17.png)
複数行テキストはこのように表示されました。


さらに第2引数を以下のように設定することで、通知のアイコンと色を変えることができます。
 
▼警告（黄色）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3880604/f973df07-c8da-4109-9884-3008b92465ca.png)

```
Notify("メッセージ",NotificationType.Warning)
```

▼失敗（赤）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3880604/73835a2b-e309-4265-bfdc-c8ff29f7c153.png)

```
Notify("メッセージ",NotificationType.Error)
```

▼成功（緑） 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3880604/d8b3115e-6465-4521-955a-039a1d584bb5.png)
```
Notify("メッセージ",NotificationType.Success)
```

表示出来るのは文字列に限られますが、関数のテストなどにも活用しています。
【AWS】Fargate → App Runner に移行したらifame内のコンテンツが Mixed Content エラーになる

# 経緯
PoC案件でLaravelアプリケーションを開発している際、もともとFargateでデプロイしていたのですが、ほとんどアクセスがないためコストの関係でAppRunnerに移行しました。
移行に当たっては、nginx + php-fpmのマルチコンテナ構成だったのをphp-apacheのシングルコンテナに変えたりしたものの、その他はかなりシンプルに移行することができましたが・・・。

# 起きたこと
開発中のアプリはGoogleWorkSpaceのアドオンが含まれており、iframe内で動作します。
移行前は問題なくiframe内で動作していたのですが、移行後からは以下のコンソールエラーが出るようになりました・・・。
> Mixed Content: The page at '<URL>' was loaded over HTTPS, but requested an insecure frame '<URL>'. This request has been blocked; the content must be served over HTTPS.

# 調査
### まずは通信内容を確認や！
まずはブラウザの開発者ツールでネットワークの確認をしてみます。
コンソールエラーでhttpになっていると怒られた通信を確認したところ、301リダイレクトが発生していました。
レスポンスヘッダのLocationを確認すると、`http://～`となっていることが分かりました。コンソールエラーが出た直接原因はこのアクセスにあるようです。

### どこでリダイレクトしている？
アドオン自体はかなりシンプルな作りなので特定は簡単でした。どうやらhtaccessの以下の設定のようです。
```.htaccess（中略）
# Redirect Trailing Slashes If Not A Folder...
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} (.+)/$
RewriteRule ^ %1 [L,R=301]
```
なるほど、urlの末尾が`/`で終わる場合は削除する設定があるんですね（特に気にしてなかった）。
iframeに埋め込むURLを確認すると、確かに末尾が`/`で終わっていました。

### なんでリダイレクトするとhttpになったんだ？
おそらくインフラ構成を変えたことで内部通信の挙動が変わった結果起きたと推測します。確認のためデバッグを仕込んでみます。

```php:public/debug.php
<?php
header('Content-Type: text/plain');
echo "X-Forwarded-Proto: " . ($_SERVER['HTTP_X_FORWARDED_PROTO'] ?? 'NOT SET') . "\n";
echo "REQUEST_SCHEME: " . ($_SERVER['REQUEST_SCHEME'] ?? 'UNKNOWN') . "\n";
echo "SERVER_NAME: " . ($_SERVER['SERVER_NAME'] ?? 'UNKNOWN') . "\n";
?>
```

デプロイ後、アクセスしてみます・・・。
```
X-Forwarded-Proto: https
REQUEST_SCHEME: http
SERVER_NAME: xxxxxxxxxxxxxxxx.com
```
なるほど。httpになっているみたいです。AppRunnerの内包しているLB（envoy）がSSL終端になっていて、コンテナ内部ではhttpで通信しているんですね。

だからhtaccessでのリダイレクトで生成されたURLがhttpになってしまっていたようです。

## 解決方法
いろいろあるとは思いますが、そもそもリダイレクトしないよう内部リライトだけするように修正しました。アプリ自体SEOを気にしなくてよかったので・・・。
```.htaccess
# Redirect Trailing Slashes If Not A Folder...
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.+)/$ /$1 [L]
```

### なんでFargateだと起きなかったんだ(-_-;)
Fargateでは nginx + php-fpm のマルチコンテナにしていました。nginxではそもそもhtaccessを使わないので、リダイレクトが起きていなかったようです。
今回AppRunnerに移行したことで、シングルコンテナにする必要があり、php-apacheをイメージとして使った結果、htaccessのリダイレクトルールが適用されるようになったのが原因のようです。

## おわりに
正直nginxやapacheなどは普段ほとんど意識せずに開発しているので、こういうトラブルがあると勉強になってかえって嬉しかったです！（血涙）
コンテナ化したSpringWebアプリケーションのログを永続化する

## はじめに

前回の記事で、SpringBootWebアプリケーションをコンテナ化しました。

https://qiita.com/y-hys/items/1a5c69ad055a12a3c5a8

ここで作成したコンテナでは、このままだとアプリケーションログが永続化されないので、コンテナ外に保存し永続化します。

## application.propertiesを修正

`<project-root>\src\main\resources\application.properties`にてログ出力先を指定します。

以下を追記します。
`/app/logs/application.log`にログが出力されるようになります。
※コンテナ内のパスになります

```properties
logging.file.name=/app/logs/application.log
```

デフォルトでは`[INFO]`レベルのログしか出力しないので`[ERROR]`以上を出力したいのでさらに以下記述を上記同様に`application.properties`に追加します。

```properties
logging.level.root=INFO
logging.level.org.springframework=ERROR
```

さらにスタックトレースも出力してほしいので以下も追記します。

```properties
logging.exception-conversion-word=%wEx
```

ロギングのフォーマットもここで設定可能ですが、今回はスキップします。

## コンテナ起動
コンテナ外部のディレクトリをマウントした状態でコンテナを起動します。

```terminal
docker run -d -p 8080:8080 -v /logs/test-container:/app/logs --name my-app test-container
```

上記コマンドにより、ホスト側の`/logs/test-container`に`application.properties`にて指定したログの出力先がマウントされます（永続化される）。

## 確認

```terminal
$ cat /logs/test-container/application.log
2025-03-10T13:55:07.857Z  INFO 1 --- [backend] [main] com.example.demo.BackendApplication      : Starting BackendApplication v0.0.1-SNAPSHOT using Java 21 with PID 1 (/app/backend-0.0.1-SNAPSHOT.jar started by root in /app)
2025-03-10T13:55:07.863Z  INFO 1 --- [backend] [main] com.example.demo.BackendApplication      : No active profile set, falling back to 1 default profile: "default"
2025-03-10T13:55:09.357Z  INFO 1 --- [backend] [main] o.apache.catalina.core.StandardService   : Starting service [Tomcat]
2025-03-10T13:55:09.358Z  INFO 1 --- [backend] [main] o.apache.catalina.core.StandardEngine    : Starting Servlet engine: [Apache Tomcat/10.1.36]
2025-03-10T13:55:09.399Z  INFO 1 --- [backend] [main] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring embedded WebApplicationContext
2025-03-10T13:55:10.062Z  INFO 1 --- [backend] [main] com.example.demo.BackendApplication      : Started BackendApplication in 3.147 seconds (process running for 4.078)
```

WARN以上を確認できませんでしたが、問題なく取れました。
デフォルトでは`org.springframework.web`は404NotFoundなどはWARNレベルに出力しないようです。
以下を設定すれば取れました。
```properties
logging.level.org.springframework.web=WARN
```

```
2025-03-10T14:12:01.981Z  WARN 1 --- [backend] [http-nio-8080-exec-2] .w.s.m.s.DefaultHandlerExceptionResolver : Resolved [org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: Cannot deserialize value of type `int` from String "a": not a valid `int` value]
```

## おわりに
やっぱり手を動かしながらだと理解度が桁違いですね
atcoder_水色精進記録15_ABC235e

# Atcoder水色精進記録
ABC235
E - MST + 1
https://atcoder.jp/contests/abc235/tasks/abc235_e

# アルゴリズム・データ構造
クラスカル法,UnionFind,クエリ並列化

# 考察
最小全域木になる辺の選び方は、全ての辺をコストが昇順になるようにsortし、
辺の両端が同じrootでなければその辺を利用、既に同じrootであればその辺は利用せずに、次の辺を確認する。利用する辺がN-1まで上記を実施すればOK
計算量はO(MlogM)

各クエリで追加される辺がMSTに含まれるかどうかをMSTが完成している状態から判定するのは難しいので、最初にクエリで追加される辺を全て辺に加えておいて考える。
クエリで追加される辺がMSTに選ばれた場合は、次のクエリに影響を与えないように、MSTには加えずにスキップする処理を追加すれば一度のMSTの構築で全クエリの結果を計算することができる。

# 提出
https://atcoder.jp/contests/abc235/submissions/63652007

# 感想
クエリを先読みして並列で考える方法が思い浮かんだのは成長を感じる。
QRコードの画像からデータを読み取る

## はじめに
QRコードの読み取りはiOSアプリで頻繁に登場する機能です。
カメラをQRコードに向けて読み取る方法一般的です
しかし、画面に表示されているQRコードはカメラ向けられず、困った経験のある方もいるのではないでしょうか?
今回は、画像データとしてのQRコードを読み取る方法を紹介します。

## 環境
- OS: macOS Sonoma 14.7.1
- XCode: 16.2.0

## 実装方針
Visionフレームワークにある[NVImageRequestHandler](https://developer.apple.com/documentation/vision/vnimagerequesthandler)と[VNDetectBarcodesRequest](https://developer.apple.com/documentation/vision/vndetectbarcodesrequest)を利用します。
VNDetectBarcodesRequestでは、処理を待つためにクロージャーを利用しなければなりませんが、今回は`withCheckedThrowingContinuation`を利用してasync関数として定義することにします。

### VNImageRequestHandler
VNImageRequestHandlerを利用すると、単一の画像に対して1つ以上の処理をリクエストできます。
イニシャライザに画像データを渡す形で初期化し、`perform`メゾットを利用することで処理をリクエストできます。
イニシャライザは、渡す画像データの型によって複数種類用意されており、`CIImage`、`UIImage`, `Data`などを利用できます。

### VNDetectBarcodesRequest
`VNDetectBarcodesRequest`はVisionフレームワークによって提供されており、画像内のバーコード検出機能を提供しています。
このクラスをVNImageRequestHandler.performの引数とすることで、画像データの解析時に任意の処理を指せることができます

## 実装
サンプルとして、引数にQRコード画像をData型に変換したものを渡すと、QRコードのPayloadを返す関数を作成してみます。

```Swift
func detectQRCode(imageData: Data) async throws -> String {
    // withCheckedThrowingContinuationを利用して、asyncな関数に変換
    return try await withCheckedThrowingContinuation { continuation in
        // VNDetectBarcodesrequestを利用して、画像解析時の処理を定義する
        let request = VNDetectBarcodesRequest { request, error in
            if let error {
                continuation.resume(throwing: error)
                return
            }

            guard let results = request.results as? [VNBarcodeObservation],
                let payload = results.first?.payloadStringValue else {
                    continuation.resume(throwing: HogeError.payloadNotFound) // 読み込めない場合には任意のえらーをthrowする 
                    return
                }
            continuation.resume(returning: payload)
        }

        // VNImagerequestHandlerのイニシャライザに、解析したいQRコード画像のデータを渡す
        let handler = VNImageRequestHandler(data: imageData, options: [:])
        do {
            // perform関数の実行によって解析を開始し、NVDetectBarcodesRequestに定義した内容に従って処理が行われる
            try handler.perform([request])
        } catch {
            continuation.resume(throwing: error)
        }
    }
}
```

## まとめ
要件によってはカメラからのQRコード読み込みと合わせて実装することで、よりQRコード読み込みを便利にできると思います！
実装コストも低いので是非試してみてください！
【Mac】Macでもslコマンドを使う方法

slコマンドってご存知ですか？
Linuxコマンドの一種で、lsコマンドをタイプミスした時にSL（蒸気機関車）が走るという遊び心満載のコマンドです。

一方、MacbookのTerminalなどでは搭載されておらず、slと入力しても、`command not found`と言われてしまいます。

そんなのは面白くない（個人差あり）ので、Macにもslコマンドを追加してあげましょう。

# インストール
```zsh
$ brew install sl
```
:::note info
Homebrewのインストール方法は以下を参照してください
https://qiita.com/sora81dev/items/d3ce9bbfc2bb8595f6c5
:::

これだけです。

# 実演
https://youtu.be/WVwpxokMBa0


では楽しいCUIライフをお過ごしください。
逆求人イベントレポート 春休みアドカレ７日

## 概要
春から3年生に上がると言うことで、いよいよ就活が始まります。
そこで爆速スタートを切るべく、**<a herf="https://careerselect.jp/">キャリアセレクト<a/>の逆求人1on1イベント**に参加しました！

このイベントは、企業側から話をしてみたいと言う指名を貰い、30分の間でカジュアルな面談を行います。

**普通の就活イベントと違い1日に何社もの企業と密接に話すことができます**
<!-- 参加の厳しさ -->
イベントの形式上、参加人数が20名のみとなっているので選考があります。
ただ選考と言っても技術力が高いかどうよりも、イベントや就活への積極性ややる気のほうが見られていると感じています。


https://careerselect.jp/event-offers/event-detail/1208/


## 準備

<!-- 選考のために必要なこと -->
### 選考前
まずイベントへの参加の条件として、プロフィール欄を埋める必要があります。
その際に技術スタックからアピールポイント、これまでやってきたことなどの他に**企業選びの軸やキャリアビジョン**などを記入します。

<!-- **企業選びやキャリアビジョンは、企業側がマッチするかどうかの参考にするのでしっかり書いてください**
また私は技術面よりもイベントなどの参加履歴と積極性をアピールしました。-->

<!-- スライドの作成とメリット -->
### 参加確定後
イベントへの参加が決まったら、事前に企業に見てもいかつ当日使う**自己紹介スライド**を作成します。
先程記入した事をまとめて、5分程度のプレゼンができるようなスライドを作成します。
今後も使えるので、かなり時間をかけて作成しました。(資料作りは苦手な方です)


## 当日について
<!-- 面談の流れ -->
### 当日の流れ
当日は午前中に各企業から企業説明があります。その後の面談で役立つ他、当日話せない企業の情報も知ることができます。

その後お昼休憩を挟みます。その間にマッチする企業とスケジュールが公開されるので、昼食後は先程のメモと資料をみて何を聞くか考えて準備しました。
<!-- 面談の様子 -->
### 面談の様子
面談については、最初こそ緊張しましたが全体に楽しく和やかに話せました。
最初に作ったスライドを用いて自己紹介をして、そこから企業の人からフィードバックを貰います。**その後は大抵こちら側から質問するか、より深堀りしてもらうか選べます。**

自分の良い点を褒めてもらえたり、どのように企業とマッチするかやこちらに興味を持った点を質問して貰えるのでとても自己肯定感があがりました。

<!-- 面談後 -->
### 面談終了後
**面談終了直後に、企業からのフィードバックが読めるようになります。**
文書でまとめらているので、読んで自己肯定感が上がるだけでなく自身の強みやキャリアでの今の立ち位置などを見返す事ができます。

## よかったところ
- ともかく自己肯定感が上がり、自分は十分戦えるという自信が付いた
- **自分のどのような経験やマインドが強みなのかを知れた**
- 企業選びの軸が明確に定まった
- **インターン選考のスキップなど、就活自体が大きく進んだ**

なかなか普段自分の立ち位置を知ることはできないので、とてもいい経験になりました。
また準備から当日を通して、**企業選びに自分が本当に欲している事**を見つけられたと思います。

## 反省
- もっと事前に企業を調べて質問事項を考えればよかった
- **最初から正直に一番やりたいことを言うべきだった**

２つ目に関して補足すると、企業側は入った先のキャリアをしっかり考えてくださるので、正直にやりたいことを話したほうがよりそこで仕事をしたいと思える魅力を聞き出せたと感じています。
## まとめ
**どの企業も入って終わりではなく、その先を見据えたキャリアを共に考えて提案してくださりました。**

話せた企業との繋がりのみならず今後の就活に活かせるような話ができたと思います。
特に自分の現在の立ち位置や強みを知りたい人にも強く勧めたいです。

是非この記事をみて興味を持った人は公式サイトからイベントをチェックしてみてください。
また27卒の人は4月にも同じイベントが有り、締切は3/22までなので是非応募してください。

https://careerselect.jp/event-offers/event-detail/1209/

https://careerselect.jp/
【Servicenow】Fix Scriptの使い方について

# Fix Scriptとは？

**Fix Script** は、ServiceNowにおいてデータの修正や一括更新を行うためのスクリプトです。主に以下のような場面で使用されます：

- **データ移行後の整合性チェックと修正**
- **システムエラーによる不正データの修正**
- **特定条件に基づいたデータの一括更新**

## Fix Scriptの作成方法

1. **アプリケーションナビゲーターで「Fix Scripts」を検索し、開く**
2. **「New」ボタンをクリック**
3. **必要な情報を入力**
   - **Name**：スクリプト名
   - **Active**：スクリプトを有効にするかどうか
   - **Record for rollback**：レコードのロールバックを可能にするかどうか
4. **スクリプトを記述する**
   
以下はサンプルコードです：

```javascript
// インシデントテーブルで「category」が空のものを更新する
var gr = new GlideRecord('incident');
gr.addNullQuery('category');
gr.query();

while (gr.next()) {
  gr.category = 'inquiry';
  gr.update();
}

gs.log('Fix Script: 空のカテゴリを更新しました');
```

5. **スクリプトを保存し、「Run Fix Script」ボタンを押す**
6. **実行結果を確認する**

## Fix Scriptのロールバック方法
https://support.servicenow.com/kb?id=kb_article_view&sysparm_article=KB1588181


## 参考
https://www.servicenow.com/docs/ja-JP/bundle/yokohama-application-development/page/build/applications/concept/c_FixScripts.html
【Teams電話】ボイスメールの既定の言語

# はじめに

Teams のボイスメールは、設定していると着信があった際に「○○さんは現在電話に出ることができません。発信音の後にメッセージを録音してください。」と自動的に応答メッセージを再生して録音できる便利な機能です。

この記事では、ボイスメールについてこの応答メッセージの言語がどのように決まるのかについてまとめました。

# 応答メッセージの言語はどうやって決まるのか？

ボイスメールでは、特に応答メッセージを指定していなければ既定の応答メッセージが再生されます。

既定の応答メッセージは [多数の言語](https://learn.microsoft.com/ja-jp/microsoftteams/languages-for-voicemail-greetings-and-messages) で用意されていて、Teams クライアントから応答メッセージの言語を選択することができます。

しかし、Teams クライアントの [設定] - [通話] - [ボイスメールの管理] から確認すると、初期状態では応答メッセージの言語が設定されていません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2680397/60375f70-3c04-4f55-bcc2-229b98d0e6ad.png)

この場合、ボイスメールの言語はどこで設定されているのでしょうか。

## 優先順位

ボイルメールの応答メッセージがどの言語で再生されるかは、以下の優先順で決定されます。

1. ボイスメールポリシー
1. Teams クライアントの設定
1. テナントの既定の言語

（参考：応答メッセージとメールに使用する既定の言語を変更する）
https://learn.microsoft.com/ja-jp/microsoftteams/change-the-default-language-for-greetings-and-emails

### 優先度 1. ボイスメールポリシー

ボイスメールポリシーをユーザーに割り当てることで、ユーザーのボイスメールに関する動作を制御することができます。

ボイスメールポリシーでは、応答メッセージの言語をプライマリとセカンダリの 2 つ設定することができます。

::: note
プライマリとセカンダリ両方の設定されたポリシーを割り当てられたユーザーは、応答メッセージが 2 つの言語で交互に再生されます。
:::

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2680397/3b6b9c9f-1a0d-4b2a-8ade-31cd2de9de33.png)

### 優先度 2. Teams クライアントの設定

ボイルメールポリシーで言語が制御されていないユーザーは、次の優先度として Teams クライアントから設定された言語で応答メッセージが再生されます。

::: note
Teams クライアントにおける応答メッセージの言語設定は、管理者側から Teams 管理センターまたは Teams PowerShell で変更することもできます。
* Teams 管理センター
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2680397/81b972f7-3938-48a9-9eff-9ca6195298bf.png)
※ ユーザーが Teams クライアントから設定していない場合は、テナントの既定の言語が表示されます。

* Teams PowerShell
```PowerShell
Set-CsOnlineVoicemailUserSettings -Identity "user01@atsmin.net" -PromptLanguage "ja-JP"
```
:::

### 優先度 3. テナントの既定の言語

ボイスメールポリシー、Teams クライアントの設定のいずれでも応答メッセージの言語が指定されていない場合は、テナントの既定の言語が使用されます。

テナントの既定の言語は、Microsoft 365 管理センターで [設定] - [組織設定] - [組織のプロファイル] から確認することができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2680397/f6560971-8ca3-4bf4-b943-2cd75a3bb948.png)

::: note warn
テナントの既定の言語はテナントの [国または地域] によって自動的に決定されます。
:::

# おわりに

ボイルメールの応答メッセージの言語について、少し分かりにくかったのでまとめてみました。上記のほか、ユーザー自身が設定できる Microsoft 365 の [設定] - [優先する言語] もありますが、この設定が応答メッセージの言語使用されることはありませんでした。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2680397/d624d338-c3d5-4043-a7b4-3c02e857bfa9.png)
Pythonでのトランザクション管理方法

## Pythonでのトランザクション管理方法
Pythonでデータベーストランザクションを管理する際、SQLAlchemyなどのORM（Object-Relational Mapping）ライブラリを使うことが一般的です。トランザクションは、データベースに対して一貫性のある操作を保証するために非常に重要です。ここでは、デコレーターを使ったトランザクションの張り方を紹介します。

### トランザクションとは？
トランザクションは、データベースへの一連の操作を一つの単位としてまとめたものです。これにより、途中でエラーが発生した場合に全ての変更を元に戻したり、逆に全ての変更を確定させたりできます。これを実現するために、commit と rollback を使います。

### トランザクション管理の基本
以下のコードは、SQLAlchemyを使用してトランザクションを管理するためのデコレーター関数です。このデコレーターを使うことで、関数内で自動的にトランザクションを開始し、成功すればコミット、失敗すればロールバックを行います。

```python
from functools import wraps
from flask_sqlalchemy import SQLAlchemy

db = SQLAlchemy()

def transactional(func):
    @wraps(func)
    def decorator(*args, **kwargs):
        # すでにトランザクションが開始されている場合は再度トランザクションを開始しない
        if db.session.info.get("in_transaction"):
            return func(*args, **kwargs)
        else:
            # トランザクション開始
            db.session.info["in_transaction"] = True
            try:
                # トランザクション内での処理を実行
                result = func(*args, **kwargs)
                # 成功したらコミット
                db.session.commit()
                return result
            except Exception as e:
                # エラーが発生した場合はロールバック
                db.session.rollback()
                raise e
            finally:
                # トランザクション終了処理
                db.session.info["in_transaction"] = False
                db.session.close()
    return decorator
```

### 解説
#### @wraps(func)
これは、デコレーターを使用した際に元の関数の名前や docstring を保持するためのものです。これにより、デコレーターが関数をラップしても、元の関数が保持されます。

#### db.session.info.get("in_transaction")
この部分では、現在のセッションが既にトランザクション中かどうかを確認しています。もしトランザクションが既に開始されている場合、再度トランザクションを開始しないようにしています。これは、ネストしたトランザクションを防ぐためです。

#### db.session.commit()
関数内の処理が成功した場合、commit() を呼び出して変更をデータベースに確定します。

#### db.session.rollback()
エラーが発生した場合は、rollback() を呼び出して、トランザクション内の変更を元に戻します。

#### db.session.close()
最後にセッションを閉じます。これにより、トランザクション後のリソースが解放され、次のリクエストに備えることができます。

### 使用例
以下は、このデコレーターを使った例です。デコレーターを使うことで、トランザクション管理が簡単になります。
```python
@transactional
def update_user(user_id, new_name):
    user = db.session.query(User).filter_by(id=user_id).first()
    if not user:
        raise ValueError("User not found")
    user.name = new_name
    db.session.add(user)
```
### まとめ
上記のように、デコレーターを使うことで、トランザクションの開始から終了までを一元的に管理することができ、コードの可読性と保守性が向上します。また、トランザクションの失敗時に自動的にロールバックされるため、エラー処理をシンプルに保つことができます。

デコレーターを使うアプローチは、特にFlaskやDjangoなどのウェブフレームワークでトランザクションを扱う際に非常に役立ちます。
Python の .get() メソッドについて

## Python の .get() メソッド
Python の .get() メソッドは、主に辞書（dict）型で使用される便利なメソッドです。辞書のキーに対応する値を取得する際に使いますが、キーが存在しない場合でもエラーを避けて処理を続けることができるため、安全に値を取得することができます。

### 使い方
```python
dictionary = {'name': 'Alice', 'age': 25}

# 存在するキーを指定して値を取得
name = dictionary.get('name')  # 'Alice'

# 存在しないキーを指定してもエラーが発生しない
non_existent_value = dictionary.get('address')  # None
```

### 引数
キー: 値を取得したい辞書のキーを指定します。
デフォルト値（任意）: もしキーが辞書に存在しない場合、返す値を指定できます。デフォルトでは None が返されます。

```python
# キー 'address' は存在しないが、デフォルト値を指定
address = dictionary.get('address', 'No address available')  # 'No address available'
```

### 特徴
キーが存在しない場合の挙動が安全
通常の dictionary[key] のようなアクセスでは、キーが存在しないと KeyError が発生しますが、.get() を使うと KeyError を回避できます。

デフォルト値の設定が可能
存在しないキーに対して、あらかじめデフォルト値を返すように設定できるため、エラーを防ぎつつ、予想外の値が返ってきても扱いやすいです。

### まとめ
.get() メソッドは、辞書のキーが存在するか不安な場合に、安全に値を取得したいときに便利です。特に、デフォルト値を設定できる点が使い勝手を向上させています。
XIAO ESP32S3 Sense のお試し

# はじめに
[Seeed Studio XIAO ESP32S3 Sense](https://www.seeedstudio.com/XIAO-ESP32S3-Sense-p-5639.html)を購入したのでビボログ。XIAOのESP32C6を購入して日も浅いんですが、やる気があるうちに即購入。この手のESP32-cam商品は需要があるようで日進月歩って感じですね。個人的にバッテリー駆動が好きなので、いよいよかなと思い購入。そこらへんをお触りしたい感じです。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/203949/a1f26464-ffb9-4c57-9e64-4a1c8df8d0d6.png" width=50%>


# 購入
スイッチサイエンスにて ¥2,724（税込）で購入。XIAO-ESP32S3のみが ¥1,456（税込）なので、カメラが高いんですね。

https://ssci.to/8969

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/203949/f52ae15c-84e1-43a8-982b-a7b9ab652d5a.png" width=30%>

内容物
- 1 x XIAO ESP32S3
- 1 x カメラボード
- 1 x アンテナ
- 2 x ピンヘッダー（7ピン）
- 2 x XIAO用ヒートシンク

# 実触
定番のビデオ ストリーミングを実行してみる。

- Windows10
- ArduinoIDE 2.3.4

今回も「基本設定」ー「追加のボードマネージャ」が必要です。
```
https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_index.json
```

:::note warn
ボードマネージャで espressif/arduino-esp32 のバージョンを最新の3.1.3 ではコンパイルエラーになります。3.0.7 にダウングレード。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/203949/645f05da-b252-43a7-a1ae-30d1ff103397.png" width=30%>
:::

ボードは ```XIAO_ESP32S3```

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/203949/3f350fc6-937e-4853-8fac-f7046dbc2679.png" width=80%>


ボード設定「ツール」ー「PSRAM」を［OPI PSRAM］に。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/203949/49932cea-406f-479d-9f50-23cdb981fe29.png" width=80%>


プログラムは以下よりダウンロード。

https://github.com/limengdu/SeeedStudio-XIAO-ESP32S3-Sense-camera

```<>Code``` から ZIP か git でクローン。
この中の「CameraWebServer_for_esp-arduino_3.0.x.ino」を開いて、以下を変更して、コンパイル&アップロードすれば準備完了。

```cpp
const char *ssid = "************";
const char *password = "************";
```


シリアルモニタを開くと以下のようにWiFiに繋がればOK。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/203949/1116fd53-fe59-4c59-90c8-0ab819def19a.png" width=80%>

URLをブラウザで開いて、```[Start Stream]```ボタン。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/203949/a7078dfa-3d3d-4ab9-b42d-8435d2229db1.png" width=50%>

# おわりに
ヒートシンクが付属するように、ストリーミングをするとかなり熱くなりますのでご注意。次回は、いよいよバッテリー駆動へのお触りです。
【Linux基本設定】    sudo許可設定

# 目的
・sudoers.dファイルを理解する
・特定のグループ/ユーザーにのみ、sudoを許可する
・ユーザーのsudoできるコマンドを限定する



## sudo許可グループ
ubuntuでは　『sudo』グループ
rhel  では　『wheel』グループ
に入っているユーザーはデフォルトdwsudoコマンドが可能となる


## sudo設定ファイル編集

sudoの設定ファイルは```/etc/sudoers```

しかし、このファイルは超重要であるためvi/nanoで編集できない

以下のコマンドで編集可能となる
```
sudo visudo
```

:::note
sudoers.d直下に個別にファイルを置くことでもsudo設定は可能だが本記事では触れない
:::

visudoはsudoers専用のエディタとなっており、sudoersの編集結果に構文的な誤りなどがある場合は検知してくれる

## sudoersの設定項目

### ユーザーへのsudo許可

```
ユーザー ホスト=(実行ユーザー) コマンド
```

user1に全ホスト、ユーザーとして全コマンドでsudoを許可する(パスワード不要)
```
user1 ALL=(ALL) NOPASSWD: ALL
```

user2にwebserverというホストにApacheの再起動コマンドのみでsudoを許可させる場合(パスワード必要)
```
user2 ALL=(ALL) /usr/bin/systemctl restart apache2
```

### エイリアス
ここではコマンドエイリアスのみ記載

```
Cmnd_Alias SHUTDOWN = /sbin/shutdown, /sbin/reboot
```

ファイル内でコマンドを変数みたいに扱える

sudoできるコマンドをユーザー/グループ単位で分けておくことで事故を減らせるはず
国立国会図書館の書影APIを利用して書籍情報(書影)を取得する

# １．国立国会図書館APIについて
今回はpythonと書影APIを用いて書籍情報（書影）を取得します。

ISBNにたいして書影のデータが必ずあるとは限りませんので、注意が必要です。

以下のページなどを参考にしています。

https://www.ndl.go.jp/

https://www.ndl.go.jp/jp/use/api/index.html

https://ndlsearch.ndl.go.jp/help/api/specifications

以下のような形式でブラウザにアクセスすると任意のISBNの書影を取得することができます。".jpg"を最後に付けるのを忘れずに。
https://ndlsearch.ndl.go.jp/thumbnail/9784043898039.jpg

# ２．pythonによる書影の取得例
pythonで以下のように書影を取得することができます。

request.get()ではバイナリデータが返されるので、PILで読み込めるようにするためにBytesIO()を行います。
その後、PILで画像を表示します。

コードを実行すると画像が開かれます。

```python:example01.py
import requests
from PIL import Image
from io import BytesIO

# ISBN
isbn = "9784043898039"

# NDLサムネイルAPIのURL
thumbnail_url = f"https://ndlsearch.ndl.go.jp/thumbnail/{isbn}.jpg"

# 画像を取得
response = requests.get(thumbnail_url)

# HTTPステータスが200なら画像を処理
if response.status_code == 200:
    img = Image.open(BytesIO(response.content))  # 画像データをPILで開く
    img.show()  # 画像を表示
else:
    print("画像が見つかりませんでした。")
```

# ３．pythonによる書影の取得 → 画像を保存

これでは実用的ではないので、書影を保存します。

エラー処理を加えました。

```python:example02.py
import requests
from PIL import Image
from io import BytesIO

# ISBN
isbn = "9784043898039"

# NDLサムネイルAPIのURL
thumbnail_url = f"https://ndlsearch.ndl.go.jp/thumbnail/{isbn}.jpg"

try:
    # 画像を取得
    response = requests.get(thumbnail_url, timeout=5)
    response.raise_for_status()  # HTTPエラーなら例外を発生させる

    # 画像を処理
    img = Image.open(BytesIO(response.content))
    img.show()

    # 画像を保存
    save_path = f"{isbn}.jpg"
    img.save(save_path)
    print(f"画像を保存しました: {save_path}")

except requests.exceptions.RequestException as e:
    print(f"画像の取得に失敗しました: {e}")

except IOError:
    print("画像の処理に失敗しました。")

```

# ４．留意点

ISBNのリストなどを与えて、連続で書籍情報を取得することも可能になるかと思います。

ただし、ループ処理をする場合はサーバーに負荷をかけない配慮が必要になります。

下記の留意事項を遵守する必要があります。

https://ndlsearch.ndl.go.jp/help/api

多重アクセスの禁止は明確に示されているので、単一のリクエストを適切な時間間隔ごとにリクエストするのが望ましいでしょう。

# ５．まとめ

次回は取得した画像データに書籍情報を紐づけ、データベースに格納する手法について扱いたいと思います。

何かの足しになれば幸いです。
Carrierwaveを使ったRailsアプリをKamal 2でデプロイしたときのエラー

Carrierwaveでローカルにファイル（画像）を保存するようにしていたアプリをKamalでVPSにデプロイしたら、ファイルをアップロードできなかった。

エラーは
```
Errno::EACCES: Permission denied @ dir_s_mkdir punlic/uploads
```
のようなエラーだった。

解決方法はDockerfileのgroupadd〜の行の下辺りに
```
RUN chown -R rails:rails ./public
```
を追加して所有ユーザーを変えるだけだった。
りんご vs バナナ！2次元配列ソート？（おまけ：|| 短絡評価（ショートサーキット評価））

Paizaの問題で、2次元配列のソートにハマった話。sort() は知ってたけど、配列の中に配列があると意外と難しい！ 「りんごが多い方が偉く、同数ならバナナで勝負」 というルールを実装する方法を解説！

<br>⭐**問題概要**
ペアとして与えられた「りんごの数」「バナナの数」をソートする。

📌 入力例
```
3 　//ペアの数が与えられる
2 2
2 3
3 1
```

📌 出力例
```
3 1
2 3
2 2
```

<br><Br>⭐**失敗例**

❌ 文字列のままソート
```js
const lines = ["2 2", "2 3", "3 1"];
lines.sort((a, b) => b - a);
console.log(lines);
```
→ 文字列なので数値比較ができず失敗！

<br>❌ NaN になる
```js
const numbers = lines.map(Number);
numbers.sort((a, b) => b - a);
console.log(numbers);
```
→ map(Number) では "2 2" のような複数の値を変換できず NaN！

<br><br>⭐**解決策**（OKコード）
```js
const rl = require('readline').createInterface({input: process.stdin});
const lines = [];

rl.on('line', (input) => lines.push(input));

rl.on('close', () => {
    const pairs = lines.slice(1).map(pair => pair.split(" ").map(Number));
    
    pairs.sort((a, b) => (b[0] - a[0]) || (b[1] - a[1]));

    pairs.forEach(numbers => console.log(numbers.join(" ")));
});
```
✅ 修正ポイント
・.map(pair => pair.split(" ").map(Number)) で2次元配列を作成
・ソート時に b[0] - a[0] でりんご、b[1] - a[1] でバナナを比較
・forEach + join(" ") で出力！

<br><Br>⭐**まとめ**

sort() の比較関数をしっかり書けば、2次元配列も簡単にソートできる！ NaN でハマった人は、数値変換と比較の順序を意識するとスムーズに解決！

[🔗 僕の失敗談と解決話！](https://paizabeginner.wordpress.com/2025/03/11/%e3%82%8a%e3%82%93%e3%81%94-vs-%e3%83%90%e3%83%8a%e3%83%8a%ef%bc%812%e6%ac%a1%e5%85%83%e9%85%8d%e5%88%97%e3%82%bd%e3%83%bc%e3%83%88/)


<Br>↓ **⭐おまけ** 

**`||` を使った比較関数の仕組み**
この書き方は 「短絡評価（ショートサーキット評価）」 を利用したテクニック。
`||` は論理 OR ですが、JavaScript では 、
**「左側が 0（または false 相当の値）なら右側を評価する」** という特性があります。
```js
pairs.sort((a, b) => (b[0] - a[0]) || (b[1] - a[1]));
```
✅ 動作の流れ
📌まず` b[0] - a[0]` を評価（りんごの数を降順ソート）
    `b[0] - a[0]` が `0` でなければ その値がそのまま返る（りんごの数が違う場合はここで決着）。

📌りんごの数が同じなら `b[1] - a[1]` を評価（バナナの数を降順ソート）
    `b[0] - a[0] === 0` の場合、`b[1] - a[1]` を返してバナナの数で並べ替える。

<br>**`||` の評価ルール**
```js
console.log(10 || 5);  // 10（最初の真の値を返す）
console.log(0 || 5);   // 5（0は偽なので、次を評価）
console.log(0 || -1);  // -1（0が偽なので、次を評価）
```
同様に、比較関数の `||` も 「左の比較が 0 なら右の比較をする」 という動作になる。

<br>**`if` を使った普通の書き方**
`||` を使わずに書くと、こうなる！：
```js
pairs.sort((a, b) => {
    if (a[0] !== b[0]) {
        return b[0] - a[0]; // りんごの数を比較
    }
    return b[1] - a[1]; // りんごが同じならバナナの数を比較
});
```
`||` を使うとこれが1行で書ける ということ！

<br>**`||` の注意点**
このテクニックは 「値が 0（または false 相当の値）のときだけ次を評価する」 ので、
例えば `null` や `undefined` の比較では意図しない動作になる可能性がある。
シンプルな数値比較には便利だけど、何でもかんでも `||` でつなぐのは注意！

<br>**まとめ**
・`||` は OR だけど、 左が 0 なら右の値を返す 性質を利用している！
・`b[0] - a[0] `が` 0`（同じ値）なら `b[1] - a[1]` で比較する。
・普通に `if` で書くより短くてスッキリ！

[🔗 僕の失敗談と解決話！](https://paizabeginner.wordpress.com/2025/03/11/%e3%82%8a%e3%82%93%e3%81%94-vs-%e3%83%90%e3%83%8a%e3%83%8a%ef%bc%812%e6%ac%a1%e5%85%83%e9%85%8d%e5%88%97%e3%82%bd%e3%83%bc%e3%83%88/)
コンピュータサイエンスにおける再帰の理解

再帰（さいき）は、コンピュータサイエンスの基本的な概念の一つで、初心者にとっては少し難しいと感じられるかもしれません。しかし、一度理解すれば、プログラマーにとって強力なツールとなります。このブログでは、再帰とは何か、なぜ重要なのか、どこで使うべきか（そして使うべきでないか）、そして反復関数との違いについて説明します。また、具体的なコード例を交えて解説します。

## 再帰とは？

再帰とは、関数が自分自身を呼び出すことで問題を解決するプログラミングのテクニックです。複雑な問題を、より小さな部分問題に分割し、それぞれを解決することで全体を解決します。再帰呼び出しは、ベースケース（再帰を終了する条件）に到達するまで続きます。

#### 例: 階乗の計算

再帰の古典的な例として、階乗の計算があります。非負整数`n`の階乗（`n!`と表記）は、`n`以下のすべての正の整数の積です。

```python
def factorial(n):
    # ベースケース: 0または1の階乗は1
    if n == 0 or n == 1:
        return 1
    # 再帰ケース: n! = n * (n-1)!
    else:
        return n * factorial(n - 1)

print(factorial(5))  # 出力: 120
```
この例では、`factorial`関数が自分自身を呼び出し、`n`が`0`または`1`になるまで小さな値で計算を続けます。

## なぜ再帰は重要なのか？

- **コードの簡潔化**: 再帰を使うと、特に木構造や分割統治法のような自然に再帰的な問題に対して、コードが読みやすくなります
- **エレガントな解決法**: ハノイの塔や順列生成のような問題は、再帰を使うことで直感的に解決できます
- **分割統治法**: クイックソートやマージソートのような効率的なアルゴリズムでは、問題を小さな部分問題に分割し、再帰的に解決します

## どこで再帰を使うべきか？：
- **木構造やグラフの探索**: 木構造（例: 二分木、ファイルシステム）やグラフ（例: 深さ優先探索）の探索に適しています
- **分割統治法アルゴリズム**: 問題を小さな部分問題に分割できる場合（例: ソートアルゴリズム、二分探索）に適しています
- **バックトラッキング**: すべての可能な解を探索する必要がある場合（例: 数独パズルの解決）に有用です

## どこで再帰を使うべきでないか？

- **スタックオーバーフロー**: 再帰の深さが大きすぎると、スタックオーバーフローエラーが発生する可能性があります。特に、末尾再帰最適化が行われない言語では注意が必要です
- **パフォーマンスのオーバーヘッド**: 再帰呼び出しは、関数呼び出しのオーバーヘッドにより、反復解法よりも遅く、メモリを多く消費する場合があります
- **単純な反復問題**: ループで簡単に解決できる問題（例: 配列の合計）では、再帰は過剰で非効率です

## 再帰 vs 反復
反復は、ループ（例: `for`、`while`）を使ってコードブロックを繰り返し実行する方法です。再帰と反復は同じ問題を解決できますが、それぞれに異なる長所と短所があります。

#### 例: 反復を使った階乗計算
```python
def factorial_iterative(n):
    result = 1
    for i in range(2, n + 1):
        result *= i
    return result

print(factorial_iterative(5))  # 出力: 120
```
### 反復を使うべきケース
- **パフォーマンス**: 反復解法は、関数呼び出しのオーバーヘッドがないため、一般的に再帰よりも高速でメモリ効率が良いです
- **スタックオーバーフロー**: 再帰の深さが深い問題では、反復の方が安全です。なぜなら、コールスタックに依存しないからです
- **可読性**: 単純な問題では、反復解法の方が直感的で理解しやすい場合があります

### 例: フィボナッチ数列

フィボナッチ数列も、再帰と反復の両方で解ける古典的な問題です。ただし、再帰解法は同じ計算を繰り返すため非効率です

#### 再帰を使ったフィボナッチ数列:
```python
def fibonacci_recursive(n):
    if n <= 1:
        return n
    else:
        return fibonacci_recursive(n - 1) + fibonacci_recursive(n - 2)

print(fibonacci_recursive(10))  # 出力: 55
```

#### 反復を使ったフィボナッチ数列:
```python
def fibonacci_iterative(n):
    a, b = 0, 1
    for _ in range(n):
        a, b = b, a + b
    return a

print(fibonacci_iterative(10))  # 出力: 55
```
反復バージョンは、再帰バージョンよりも効率的で、指数関数的な時間計算量を避けられます。

## まとめ
再帰は、複雑な問題を小さな部分問題に分割して解決する強力でエレガントなテクニックです。しかし、常に最適な選択肢とは限りません。再帰の深さが深い問題やパフォーマンスが重要な場合には、反復解法の方が効率的で安全です。

再帰と反復の両方を理解し、適切に使い分けることで、さまざまなプログラミングの課題に対応できるようになります。
次の記事まで、ハッピーコーディング！
(SSD1306とM5NanoC6)「デカ文字」まとめ(リンク集)


(SSD1306とM5NanoC6)「デカ文字」まとめ(リンク集)


----



![image_original (60).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/e6e5b814-f950-4f94-b8fe-a8f9676373fb.jpeg)



----


●　ノー仮想VRAM1024バイト


https://qiita.com/caa45040/items/6f486ab04dd907121aba


https://qiita.com/caa45040/items/4cecd04245d079f5e153


https://qiita.com/caa45040/items/da6e9ef1e032436f757c


https://qiita.com/caa45040/items/825e63bba9a8863e0bf6