OmniAICreator/Qiita-1.07M huggingface dataset:
Google Colabを学びたい(Step2:ダミーデータでヒストグラフを作成する)

## はじめに
Google Colabを学びたい Step2です。今回はダミーデータを用意して、ヒストグラフを作成したいと思います。

## 成果物
学校のテスト点数を分析するコードです
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/599049/90f76124-16da-4c62-81bc-b7f0fda70cd5.png)



## ソースコード
```py:
# 必要なライブラリをインポート
import numpy as np
import matplotlib.pyplot as plt

# テスト点数のデータ（仮の20人分）
scores = np.array([72, 88, 91, 65, 77, 83, 95, 60, 70, 90,
                   85, 78, 93, 55, 67, 89, 80, 76, 68, 92])

# 平均点、最高点、最低点を計算
mean_score = np.mean(scores)
max_score = np.max(scores)
min_score = np.min(scores)

# 統計情報を出力
print(f"Average Score: {mean_score:.2f}")
print(f"Highest Score: {max_score}")
print(f"Lowest Score: {min_score}")

# ヒストグラムの描画（点数の分布）
plt.figure(figsize=(8, 5))  # グラフのサイズを指定
plt.hist(scores, bins=8, edgecolor='black')  # ビンの数を8に設定して、枠線を黒に
plt.title("Distribution of Test Scores")  # グラフのタイトル（英語）
plt.xlabel("Score")  # x軸ラベル（点数）
plt.ylabel("Number of Students")  # y軸ラベル（人数）
plt.grid(True)  # グリッド線を表示
plt.show()  # グラフを表示
```

##
Unityで作ったゲームをiosへ

# Unityをiosにビルド

# 注意点
※Unityでios用にビルドしたフォルダをGoogle Drive経由でMacに送ると
プライバシーマニフェストファイル (PrivacyInfo.xcprivacy)がどうとか構造体がどうとかエラーを出しまくってビルドが上手くいかなくなったので
#### `USBメモリ`を使用して経由するなどcloudを経由しないようにした方がいい

または、最初からMacのUnityで開発するのが1番いいだろう

また、ゲームがアプリ用フォルダのファイルを読み込んだり、書き込む場合は
以下の内容を設定ファイルに追記する必要がある
```Info.plist
    <key>UIFileSharingEnabled</key>
    <true/>
    <key>LSSupportsOpeningDocumentsInPlace</key>
    <true/> <!-- 外部アプリと連携しないなら削除してOK -->

    <key>NSPhotoLibraryUsageDescription</key>
    <string>アプリ内の楽曲データを保存・管理するために写真ライブラリへのアクセスが必要です。</string>

    <key>NSMicrophoneUsageDescription</key>
    <string>リズムゲームの録音機能を使用するためにマイクへのアクセスが必要です。</string>

    <key>NSBluetoothAlwaysUsageDescription</key>
    <string>Bluetooth オーディオデバイスを使用するために必要です。</string>
    <key>UIBackgroundModes</key>
    <array>
        <string>audio</string>
    </array>
```
それ以外はiosアプリのビルドと手順は変わりませんでした！
Azure DDoS Protectionの基本


## はじめに

AzureのDDos対策について説明する機会がありました。
言語化するにあたり記事にしてみましたので参考になれば幸いです。
※2025年4月時点での情報です。

## DDoS攻撃とは

DDoS（Distributed Denial of Service）攻撃とは、稼働しているシステム（サーバ・ネットワークなど）に過剰な負荷をかけ、システムの機能を妨害する攻撃です。これによりシステムが非常に遅くなる、または完全に使用不能になることがあります。

近年はDDoS攻撃を使用した被害が増加傾向にあり、対策の報告を余儀なくされるIT従事者もいらっしゃるかと思います。
増加の要因として専門知識がなくても低コストで攻撃可能なサービスの普及などがあるようです。

## Azure DDoS Protection

AzureのDDoS対策用サービスの１つとしてDDoS Protectionがあります。
AzureのリソースをDDos攻撃から守ってくれるサービスです。

詳細はこちら：[Azure DDoS Protection概要](https://learn.microsoft.com/ja-jp/azure/ddos-protection/ddos-protection-overview)

## Azure DDoS Protection SKU

以下３つがあります。

- DDoS インフラストラクチャ保護
- DDoS IP 保護
- DDoS ネットワーク保護

詳細なはこちら：[Azure DDoS Protection サービス レベルの比較](https://learn.microsoft.com/ja-jp/azure/ddos-protection/ddos-protection-sku-comparison)

### DDoS インフラストラクチャ保護

特に設定することなく Azure サービスをDDoS攻撃から保護します。
しかし、他のSKUと比較してDDoS攻撃だと判断するしきい値の設定が高く動作する時には該当システムは影響を受けている（ダウンするなど）可能性が高いため他のSKUを選択することが推奨されています。

費用は無料です。


詳細はこちら[インフラストラクチャ保護についてのLearn](https://learn.microsoft.com/ja-jp/azure/ddos-protection/ddos-faq#--------------azure------------------)


### DDoS IP 保護

特定のパブリックIPアドレスを保護する設定を行うことでAzure サービスをDDoS攻撃から保護します。

費用は$199/月です。
[Azure公式価格ページ](https://azure.microsoft.com/ja-jp/pricing/details/ddos-protection/)

DDoS ネットワーク保護と比較すると
15個未満Public IPを保護する場合はこちらのほうが安くなります。

### DDoS ネットワーク保護

「DDoS Protection プラン」を作成して仮想ネットワークの DDoS 保護を有効にすることでAzure サービスをDDoS攻撃から保護します。
パブリックIPアドレス単体ではなく、VNet全体を保護してくれます。
※パブリックIPアドレス100個まで

費用は$2,944/月です。
[Azure公式価格ページ](https://azure.microsoft.com/ja-jp/pricing/details/ddos-protection/)

DDoS IP 保護と比較すると
15個以上Public IPを保護する場合はこちらのほうが安くなります。

:::note warn
使用量に関係なく１か月分の料金が課金されてしまいます。
誤ってネットワーク保護を有効にした場合、日本円にすると約45万円/月になりますので注意が必要です。
:::

## Q＆A

### Azure DDoS Protection Basicとは？

今は廃止となったサービスです。
昔はAzure DDoS ProtectionのSKUはBasicとStandardの２つでした。
今ではBasic相当のサービスが「DDoS インフラストラクチャ保護」となっています。

### きちんと動作するかテストしたい場合は？

Microsoft が承認したテスト パートナーのシステムを使用することでテスト可能です。
詳しくはこちら：[チュートリアル: Azure DDoS Protection シミュレーション テスト](https://learn.microsoft.com/ja-jp/azure/ddos-protection/test-through-simulations)


### どんな時にどのSKUを選択すれば？

要件によるので難しいところですが、一般ユーザがアクセス可能なWebサイトなどは有償機能の使用を推奨しているようです。

>DDoS Protection には DDoS Infrastructure Protection より多くの機能があります。 特定のアプリケーション (多くの収益を生み出す eコマース Web サイトなど) が不可欠であると判断した場合は、DDoS Protection が推奨される選択肢です。

文章の引用元[Azure DDoS Protection をいつ使用するか](https://learn.microsoft.com/ja-jp/training/modules/introduction-azure-ddos-protection/4-when-to-use-azure-ddos-protection)

:::note warn
ここでは深く話しませんが、Azure Front Door、Azure Web Application Firewallなどを使用している場合はそちらでもDDoS対策がありますので合わせて検討する必要があります。
:::

## 参考文献


- [DDoS攻撃:最新の攻撃傾向と事例紹介](https://www.ssk-kan.co.jp/topics/?p=14971)
- [クイックスタート：DDoS IP保護](https://learn.microsoft.com/ja-jp/azure/ddos-protection/manage-ddos-protection)
- [DDoS Mitigation with Microsoft Azure Front Door](https://azure.microsoft.com/en-us/blog/ddos-mitigation-with-microsoft-azure-front-door/)
- [Azure DDoS Protectionを試す！](https://www.cloudou.net/virtual-network/vnet023/)
- [Azure DDoS Protection Basicは何処へいったのか？](https://qiita.com/valpasucucci43/items/df05481581116f43eccf)
Google Colabで遊んでみる(Step1：図形表示)

## はじめに
表題通り、GoogleColabを触ってみようと思います！！何ができるかというイメージアップをしていきます！！
では、まず、図形を表示してみます

## 図形表示
```py:
# ================================================
# サイン波（Sin Wave）を描画するPythonコード
# 使用ライブラリ：NumPy（数値計算）、Matplotlib（グラフ描画）
# ================================================

# ライブラリをインポート（NumPy：数値計算用、Matplotlib：グラフ描画用）
import numpy as np
import matplotlib.pyplot as plt

# x軸の値を生成
# 0から10までを等間隔に100個に分割した配列を作る
# 例：[0.0, 0.101, 0.202, ..., 10.0]
x = np.linspace(0, 10, 100)

# y軸の値を生成
# xの値に三角関数 sin() を適用して、波の形（サイン波）を作る
y = np.sin(x)

# グラフを描画（xとyの折れ線グラフ）
plt.plot(x, y)

# グラフのタイトルを設定
plt.title("Sin Wave")

# グラフを表示する
plt.show()
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/599049/f3dc0b51-c6f5-404e-9bcb-f1338f96c133.png)

:::note info
めっちゃ簡単やな！！いいね！！どんどん書いていこう！！！
:::
WSL2環境におけるDockerコンテナからネットワークドライブのディレクトリが見えない問題とその対処法

> **本記事は OpenAI ChatGPT を活用して構成・執筆されています.**

# 免責事項

本記事は筆者の実体験に基づいて作成した技術的検討メモである.  
使用している OS, WSL, Docker Desktop のバージョンや構成により挙動が異なる可能性がある.  
本記事を参考にして発生したいかなる損害・トラブルに対しても, 筆者は一切の責任を負わない.  
各自の責任において適用されたい.  

# アブストラクト

WSL2 環境において, Docker コンテナからネットワークドライブ上のディレクトリをマウントしたところ, `ls` で `total 0` と表示され, ファイルにアクセスできない問題が発生した.  
本稿ではその原因が, ネットワークドライブをマウントする前に `docker run -v` を実行したことによって, WSL 側に空のディレクトリが生成されてしまった点にあることを明らかにし, Docker コンテナからのファイルアクセスを正常化するための具体的な解決手順と再発防止策を提示する.  

# 対象読者

- WSL2 上でネットワークドライブを活用している技術者  
- Docker と WSL を組み合わせたデータ処理環境を構築している者  
- Docker コンテナでマウントしたはずのフォルダにファイルが見えない問題に遭遇している者  

# 内容

## 1. 問題の発生状況

WSL2 上で, Windows 側のネットワークドライブ V: を `/mnt/v` にマウントし, その配下の `KITTI` ディレクトリを Docker コンテナにマウントしようとした.  

```bash
docker run -v /mnt/v/KITTI:/dataset/KITTI ...
```

このとき, コンテナ内で `/dataset/KITTI` を `ls` しても `total 0` と表示され, ファイルにアクセスできなかった.  
一見するとファイルが存在していないように見えるが, 実際には Windows 側では問題なくファイルが存在していることを確認していた.  

補足として, ホスト側（WSL）から `/mnt/v/KITTI` を `ls` した場合も `total 0` が表示されるが, ファイル名自体は見えるという不整合な状態となっていた.  

## 2. 原因

原因は, ネットワークドライブ V: を `/mnt/v` にマウントする**前に**, 上記の `docker run -v` コマンドを実行してしまったことである.  
このコマンドの実行により, WSL 上に `/mnt/v/KITTI` という空のディレクトリが作成された.  
その状態でネットワークドライブ V: を `/mnt/v` にマウントすると, 既に存在していた空のディレクトリ `/mnt/v/KITTI` が干渉し, ファイルシステムの不整合が生じた.  

特に注意すべきは, **ネットワークドライブのマウント操作自体ではエラーが発生しない**点である.  
`mount -t drvfs V: /mnt/v` は正常に完了し, 表面的には `/mnt/v` が正しくマウントされているように見える.  
しかし内部的には `/mnt/v/KITTI` が既に存在する空のディレクトリと競合しており, Docker コンテナからのファイルアクセスができなくなっていた.  

## 3. 解決方法

以下の手順により, Docker コンテナからのマウント不整合を解消することができた.  

1. **ネットワークドライブ V: が既に `/mnt/v` にマウントされている場合は, 先にアンマウントする.**  

    ```bash
    sudo umount /mnt/v
    ```

2. `/mnt/v` の中身を削除する.  

    ```bash
    sudo rm -rf /mnt/v/KITTI
    ```

    これはマウント前に自動生成されていた空のディレクトリであり, ネットワークドライブ上の実体と競合する原因となっていた.  

3. 改めてネットワークドライブ V: を `/mnt/v` にマウントする.  

    ```bash
    sudo mount -t drvfs V: /mnt/v
    ```

4. Docker コンテナを実行し, 正しくマウントされたことを確認する.  

    ```bash
    docker run -v /mnt/v/KITTI:/dataset/KITTI ...
    ```

この操作により, `/mnt/v/KITTI` は空のディレクトリではなく, ネットワークドライブ上の実体として認識されるようになり, Docker コンテナからもファイルが正しく認識されるようになった.  

## 4. 再発防止策

以下に再発防止のための要点を列挙する.  

- **WSL の `/mnt/<ドライブレター>/*` 以下に対して, マウント前に手動でディレクトリを作成しないこと.**  
- **ネットワークドライブは, 必要なすべての Docker 操作よりも前にマウントしておくこと.**  
- **`docker run -v /mnt/...` を行う際には, ホスト側ディレクトリが実体として存在しており, 内容が確認できることを事前に検証すること.**  

# 今後の展望：マウント処理の安定化に向けて

本問題は, 操作順序の不整合に起因しており, 特に「ネットワークドライブのマウントが先」であるべきという点が重要であった.  
今後の運用を安定させる上では, **マウント操作のタイミングを確実に管理できる仕組みの導入が有効と考えられる**.  

たとえば, 起動時にマウント状態を確認して未マウントであれば通知や自動処理を行うような手段について, 今後調査・検討する価値がある.  
確実な再現性と信頼性を担保するための構成については, 引き続き検討を進めたい.  

# まとめ

Docker コンテナにおいて, WSL2 経由でマウントしたネットワークドライブのディレクトリが `total 0` と表示され, ファイルにアクセスできないという問題は, WSL 側に事前に生成された空のディレクトリとの競合によって引き起こされることがある.  

このような問題は, Docker 側でファイルが正しく見えていないにもかかわらず, ホスト側では部分的に見えるという状況のため発見が遅れがちである.  
解決のためには, 不要な空のディレクトリを削除し, マウントの順序と状態を明確に管理することが重要である.  

本稿で示した手順を参考に, **Docker コンテナからの安定したファイルアクセス**を確保していただきたい.
React公式ドキュメントの理解（レンダー）

Reactを独学で学ぶ上で、いちばん最初に公式ドキュメントの理解から着手しようと思ったのでアウトプットも兼ねて内容をまとめました。
ここでは[React公式ドキュメント](https://ja.react.dev/learn/render-and-commit)の「**レンダー**」をまとめました。

# こんな人向け
- Reactを触ったことがない人
- Reactに興味があり、学ぼうとしている
- Reactの概念・仕組みを知りたい

# 筆者の状態
- html, css, javaScriptはある程度知っている
- Reactは初心者

## レンダーとコミット
コンポーネントは、画面上に表示される前にReactによってレンダーされる必要があります。
>コンポーネントが料理人として厨房に立ち、食材を調理して美味しい料理を作っている様子をイメージしてみてください。このシナリオにおいて React はウェイターです。お客様の注文を伝えて、できた料理をお客様に渡します。この UI の「注文」と「提供」のプロセスは、次の 3 つのステップからなります：

1. レンダーのトリガ（お客様の注文を厨房に伝える）
2. コンポーネントのレンダー（厨房で注文の品を料理する）
3. DOM へのコミット（テーブルに注文の品を提供する）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2779353/5585998b-6083-4096-8b3a-12a1ecb76530.png)

### 1.レンダーのトリガ
コンポーネントがレンダーされるのは以下の2つです。
- コンポーネントの初回レンダー
- コンポーネント（またはその親）のstateの更新

**フレームワークやサンドボックス**では省略されていることが多いですが、通常は ```createRoot``` を呼び出し、作成されたルートの ```render``` メソッドを、コンポーネントに対して呼び出します。

### 2.コンポーネントのレンダー
「レンダー」とは、Reactがコンポーネントを呼び出すことです。
- 初回レンダー時、Reactはルート(root)コンポーネントを呼び出します。
- 次回以降のレンダーでは、stateの更新によってレンダーがトリガされた関数コンポーネントを、Reactが呼び出します。

```Gallery.tsx
export default function Gallery() {
  return (
    <section>
      <h1>Inspiring Sculptures</h1>
      <Image />
      <Image />
      <Image />
    </section>
  );
}

function Image() {
  return (
    <img
      src="https://i.imgur.com/ZF6s192.jpg"
      alt="'Floralis Genérica' by Eduardo Catalano: a gigantic metallic flower sculpture with reflective petals"
    />
  );
}
```
React は Gallery() を呼び出した後、Image() を何度も呼び出します。

:::note warn
- 初回レンダー時には、Reactは \<section\>, \<h1\>, および3つの\<img\>タグの**DOMノード**を作成します
- 再レンダー時には、Reactは前回のレンダーからどの部分が変わったのか、あるいは変わらなかったのかを計算します。次のステップであるコミットフェーズまでこの情報は使われません。
:::

### 3.ReactがDOMへの変更をコミットする
- **初回レンダー時には**、Reactは ```appendChild()``` DOM APIを使用して、作成したすべてのDOMノードを画面に表示します。
- **再レンダー時には**、Reactは最新のレンダー出力に合わせてDOMを変更するため、必要な最小限の操作（レンダー中に計算されたもの！）を適用します。

:::note info
**Reactはレンダー間で違いがあった場合のみDOMノードを更新します。**
:::

### 最後に
レンダーが完了し、ReactがDOMを更新した後、ブラウザは画面を再描画します。これは「ブラウザレンダリング」と呼ばれます。

## ライセンス
本記事は、Reactの公式ドキュメント（[React 公式サイトへのリンク](https://react.dev/)）を参考に、Creative Commons Attribution 4.0 International License (CC BY 4.0) の下で公開されている情報に基づいて作成されています。
northernforce#48 イベントレポート

# 「northernforce #48」レポート

**2025年2月18日（火）に開催された「northernforce #48」のイベントレポートです。
イベントURL
https://northernforce.connpass.com/event/340434/

## northernforceってどんなコミュニティ？
northernforceは、北海道を拠点としたSalesforceのTrailbrazerコミュニティです。
2017年6月から活動を開始しており、Salesforceのシステム管理者（アドミン）、開発者、ユーザー、幅広い層を対象としているのが特徴です。

「北海道を元気にする」というミッションを掲げ、IT人材の不足や技術共有の場が少ないという北海道特有の課題に対して、学びの場所を作っています。
参加者はここでの学びを持ち帰ってもらい、それぞれの現場で活かすことで、北海道、ひいては日本の活性化に貢献したいという思いで活動しています。

## イベント内容：Spring'25最新情報の共有！

今回のnorthernforce #48では、2つのLT（ライトニングトーク：短時間でコンパクトに行うプレゼンテーション）が行われました。
どちらもSalesforceのSpring'25のバージョンアップに関する内容で、参加者は最新情報をキャッチアップいただける機会になりました。
開催アンケートでは「日々の業務に活かせそう！」という有難いお言葉もいただけました。

### LT①：システム管理者向け＆開発者向け新機能ピックアップ
最初は私（吉松）のLT発表でした。

資料はこちら
https://speakerdeck.com/yoshi17/spring25zhu-mu-ji-neng-10xuan-plus-tian-fu-huairufu-kihuronoshi-zhuang-demo-27ca30d3-a7e1-4d29-8b3c-49b50b0cfd4e

#### システム管理者向け新機能
1. **リストビューや関連リストで複数項目を使用して並び替え可能に**
   最大5つまでの項目を組み合わせた並び替えができるようになり、データアクセスが格段に向上しました。ただし、この設定はユーザー個人の環境のみに適用されるので注意が必要です。

2. **オブジェクトの全項目標準編集権限を付与できる機能**
   新規作成した項目に対して一括で編集権限を付与できる機能が追加されました。
   採用や商談などの機密情報を含むオブジェクトでは使用に注意が必要です。
   権限設定を細かくしなくて良いケースでは作業効率が上がるメリットがあります。

3. **活動オブジェクトに追加できるカスタム項目が300項目に拡張**
   従来の100項目から3倍にアップグレード。
   データの蓄積と活用がより進みそうです。

4. **拡張権限セットと役割階層リストビューのLightning表示対応**
   従来のクラシック画面からLightning画面（新しいインターフェース）での表示が可能になり、使いやすさが向上しました。ただし、使用には設定での有効化が必要です。

#### 開発者向け新機能

1. **画面フローの入力値変更をトリガーにアクション自動起動が可能に**
   例えば、取引先検索画面で入力値が変更されると、関連データを表示する機能が追加可能になりました。す。

2. **組み込み視覚的進捗インジケーターで直感的なUI実現**
   商談のパスのようなインジケーターをフロー（業務プロセスを視覚的に構築するツール）に実装できるようになりました。現在どのフェーズにいるかが一目でわかる便利な機能ですが、残りのステージが見えないという課題もあります。

3. **フロービルダーでフォーマット付きメール送信が可能に**
   添付ファイルを含むリッチなメールをフローから直接送信できるようになりました。最大35MBまでのファイルを添付でき、最大5000件の宛先へ送信可能です。

4. **Apexでファイル圧縮と解凍が可能に**
   Apexで大きなデータサイズのファイル操作がスムーズになり、データ転送プロセスが向上します。

5. **Apexで動的組織を評価可能に**
   クラス内でリファレンスフィールドなどのメソッドを使用することで、オブジェクト構造をコードで評価できるようになりました。

6. **スケールテストを使用したサンドボックスでの負荷テスト実施が可能に**
   実際の運用環境を想定した負荷テストが行えるようになり、大規模な組織での安定稼働に向けた事前検証が可能になりました。

### LT②：フィールドサービス×AIの進化
2つ目は佐藤さんのLT発表でした。
「フィールドサービス×AI」の領域について紹介してくださいました。

資料はこちら
https://speakerdeck.com/yutosatou_kit/spring25zhu-mu-ji-neng-shao-jie-field-service-x-ai


#### フィールドサービスとは？
フィールドサービスとは、現場作業員の予定や作業状況を管理できるSalesforceの製品で、作業指示・予定・割り当てなどを一元管理できるプラットフォームです。
例えば、保守点検や修理などのために顧客先に訪問するエンジニアのスケジュール管理や作業報告などを効率化できます。

#### AI連携による新機能

1. **AIを使用したスケジュールギャップの自動埋め込み**
   作業予定がキャンセルなどで空いてしまった場合、AIが適切な作業を提案し、割り当てを行ってくれる機能が追加されました。
   従来は予定ベースでの割り当てでしたが、人ベースでの調整が可能になっています。現場の急な変更にも柔軟に対応できるようになります。

2. **ボタンタップで事前作業ブリーフィングの音声読み上げ**
   モバイルアプリで作業概要を音声で読み上げる機能が強化され、移動中や作業前の確認が安全かつ効率的に行えるようになりました。

3. **AIによる画像認識と解決策提案**
   モバイルアプリで撮影した画像をAIが分析し、商品コードなどを自動認識して解決策を提案してくれる機能が追加予定です。

4. **Siriと連携した音声コマンド対応**
   iOSデバイスでSiri（Appleの音声アシスタント）を使って「Hey Siri、フィールドサービスに依頼して」と話しかけるだけでアプリが起動し、次の予定確認や作業レポート作成などがスムーズに行えるようになりました。
   システムを使う時間を省き、現場作業の効率化や安全性向上を重視したアップデートになるので、現場スタッフの使いやすさを追求した進化に注目が集まりました。

## 参加者の反応と質疑応答
発表後の質疑応答では、技術的な質問だけでなく、実際の業務での活用方法についての議論も活発に行われました。
「活動オブジェクトの項目数拡張は、データ活用の幅が広がりそう」「フロービルダーでできることが増えて嬉しい」などの反応が見られました。

## northernforceの今後の展開

次回のイベントは2025年4月15日（火）19時から開催予定です。
https://northernforce.connpass.com/event/346431/
【Python】classmethodオブジェクト取得できなくね？

`@classmethod`デコレータはインスタンスに依存しない、クラス固有のメソッドの定義に使われるものです。たとえば、

```python
class A:
    @classmethod
    def default(cls):
        return cls()
a = A()
```

とすると、

```python
a.default()  # Out: <__main__.A at ...>
A.default()  # Out: <__main__.A at ...>
```

というように、インスタンスとクラス両方から同じ挙動で使えるようになります。

## 本題: `classmethod`オブジェクト取得できなくね？？

`classmethod`は立派なクラスです。

```python
type(classmethod)  # Out: type
```

`classmethod`を取得しようとすると

```python
isinstance(A.default, classmethod)  # Out: False
```

このように失敗します。

#### 他のクラスではどうか

では他のクラスではどうでしょうか。以下のように`classmethod`と同じようにデコレータとして使える（だがこのままでは使い物にならない）クラスを定義します。

```python
class MyMethod:
    def __init__(self, func):
        self.func = func
```

上の`A`と同じように定義します。

```python
class A:
    @MyMethod
    def default(cls):
        return cls()
a = A()
```

`MyMethod`を取得してみると

```python
isinstance(A.default, MyMethod)  # Out: True
```

できるぞ。

## `classmethod`が取得できなかった理由

`classmethod`は`__get__`が定義されており、アクセスしたときに呼ばれます。

```python
hasattr(classmethod, "__get__")  # Out: True
```

`__get__`の挙動については以前記事を書いたのでご参照ください。

https://qiita.com/Hanjin_Liu/items/16b1035e5cfdadb161af

`classmethod`クラスは次のように定義されています（標準のものと区別するために大文字を使います）。

```python
class ClassMethod:
    def __init__(self, func):
        self.func = func

    def __get__(self, obj, objtype):
        return self.func.__get__(objtype)
```

つまり、`a.default`のように`.`でアクセスしたときに、毎回`self.func`の1つめの引数にクラスを渡したメソッドを返します。

再度、上の`A`と同じように定義します。

```python
class A:
    @ClassMethod
    def default(cls):
        return cls()
a = A()
```

`ClassMethod`を取得してみると

```python
isinstance(A.default, ClassMethod)  # Out: False
```

`classmethod`と同様に失敗します。

## どうやって`classmethod`オブジェクトを取得するか？

`classmethod.__get__`が呼ばれているということは、クラスのどこかに`classmethod`オブジェクトが隠されているはずです。

再度`classmethod`でクラス`A`を定義します。

```python
class A:
    @classmethod
    def default(cls):
        return cls()
a = A()
```

クラスで定義されたすべての変数は`__dict__`または`vars`で取得できます。

```python
A.__dict__
vars(A)
```

すると出力は、

```
mappingproxy({'__module__': '__main__',
              'default': <classmethod(<function A.default at ...>)>,
              '__dict__': <attribute '__dict__' of 'A' objects>,
              '__weakref__': <attribute '__weakref__' of 'A' objects>,
              '__doc__': None})
```

になります。`classmethod`がありますね。`mappingproxy`はイミュータブルな`dict`みたいなものなので、値の取得は`dict`同様にできます。

```python
isinstance(vars(A)["default"], classmethod)  # Out: True
```

`classmethod`取得できました。
【Go】簡単なSingletonパターンのサンプルコード


## 概要

- Goで簡単なSingletonパターンを実装。

## 実装内容

- `sync.Once`：一度だけ初期化処理を実行するためのGoの標準同期プリミティブ。
- グローバル変数 `instance`：共通で使用する唯一のインスタンス。
- `GetInstance()`：インスタンスの取得専用関数。必要に応じて初期化も行う。

## サンプルコード


```go
package main

import (
	"fmt"
	"sync"
)

// Singleton構造体：シングルトンとして扱う対象の構造体
type Singleton struct {
	Value string
}

var (
	once     sync.Once     // sync.Onceは一度だけ処理を実行するための同期プリミティブ
	instance *Singleton    // 実際のシングルトンインスタンス
)

// GetInstanceはシングルトンインスタンスを返す関数
// 最初の呼び出し時に一度だけインスタンスが生成される
func getInstance() *Singleton {
	// 初回のみこの関数内の処理が実行される
	once.Do(func() {
		fmt.Println("Creating Singleton instance")
		instance = &Singleton{
			Value: "初期値",
		}
	})
	return instance
}

func singletonExec() {
	// 複数回呼び出しても同じインスタンスが返る
	s1 := getInstance()
	s2 := getInstance()

	fmt.Println("s1.Value:", s1.Value)
	s2.Value = "変更後の値"
	fmt.Println("s1.Value after s2 update:", s1.Value)

	// 同じインスタンスであることを確認
	fmt.Println("s1とs2は同一インスタンスか？", s1 == s2)
}

// 出力
// Creating Singleton instance
// s1.Value: 初期値
// s1.Value after s2 update: 変更後の値
// s1とs2は同一インスタンスか？ true
```
Azure Pipeline 上で Bun + testcontainers を使い Postgresql + Hono  のテストを行ったメモ

# 概要
[前回](https://qiita.com/hibohiboo/items/f267dd785ec30458fa0f)はマイグレーションを行った。
今回はAzureDevOpsでパイプラインを動かしてみる。

[ソースコード](https://github.com/hibohiboo/odyssage/blob/3fdac5f21ac857652667ca6da8bcf3f6b8160d62/apps/backend/azure-pipeline.yml)


# ソースコード

```apps/backend/azure-pipeline.yml
trigger:
  branches:
    include:
      - develop

pool:
  vmImage: 'ubuntu-24.04'


steps:
  - checkout: self

  - task: UseNode@1
    inputs:
      version: '22.x'

  - script: |
      curl -fsSL https://bun.sh/install | bash
    displayName: 'Install Bun'

  - script: echo "##vso[task.setvariable variable=PATH]$(HOME)/.bun/bin:$(PATH)"
    displayName: 'Add Bun to PATH'

  - script: bun install
    displayName: 'Install dependencies with Bun'

  - script: bun run test
    displayName: 'Run tests with Bun'
    workingDirectory: apps/backend
    env:
      CI: true
```

# 実行結果

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99876/b0544e69-52e6-43aa-b142-d29850e8b133.png)

# 'Add Bun to PATH'の解説
見慣れない書きかたなのでChatGPTに解説してもらった。

部分|意味
--|--
##vso[...]|Azure Pipelines の「ログコマンド」で、スクリプト出力に含めることでパイプライン動作を制御できる特別な命令
task.setvariable variable=PATH|PATH という変数を新しく定義 or 上書き
`$(HOME)/.bun/bin:$(PATH)`|`$HOME/.bun/bin` を既存の PATH の前に追加（bun コマンドが見つかるようにするため）。

# 参考

[コンテナジョブ](https://learn.microsoft.com/ja-jp/azure/devops/pipelines/process/container-phases?view=azure-devops&tabs=linux)
[サービスコンテナ](https://learn.microsoft.com/ja-jp/azure/devops/pipelines/process/service-containers?view=azure-devops&tabs=yaml)

パイプラインの書きかた
[workingDirectory](https://learn.microsoft.com/ja-jp/azure/devops/pipelines/yaml-schema/steps-script?view=azure-pipelines)
[ログコマンド](https://learn.microsoft.com/ja-jp/azure/devops/pipelines/scripts/logging-commands?view=azure-devops&tabs=bash)
Elastic Beanstalkの環境変数をデプロイ時に自動追加

Elastic Beanstalkで開発環境を作成するときに、毎回環境変数を手入力するのが面倒でした。
Elastic Beanstaklの環境変数でAWS Secrets Manager および AWS Systems Manager パラメータストアに対応したようなので、以下の公式ドキュメントを参考に実装してみました。

https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/AWSHowTo.secrets.env-vars.html

なお2025年3月28日以降のプラットフォームバージョンしか対応していないようなので、以下の公式サイトを見て対応しているか確認する必要があります。

https://docs.aws.amazon.com/elasticbeanstalk/latest/platforms/platform-history-php.html

私は「PHP 8.3 AL2023 version 4.6.0」のプラットフォームバージョンで実装しました。


# ebextensions/options.configの作成
```
option_settings:
  - namespace: aws:elasticbeanstalk:application:environmentsecrets
    option_name: APP_KEY
    value: arn:aws:ssm:ap-northeast-1:〜〜〜〜〜〜〜〜
```
上記の形で追加したい環境変数を記載する。

# Elastic BeanstalkのIAMロールに権限追加
```
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": "secretsmanager:GetSecretValue",
            "Resource": "secretmanagerのARNを記載"
        }
    ]
}
```
上記の権限を追加しないと、パラメータストアから値を取得できないため、必ず追加してください。

# デプロイすると、環境変数が追加されます。
自分の場合はcodepipelineでCI/CDを構築しているため、deploy時に環境変数が以下のように追加されました！

![unnamed.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1291184/61c8f5b5-485b-4bd5-9304-97523be031ae.png)
Azure使う？使わない？ ～Azure Functions編～ その1

:::note warn
Qiita利用規約およびコミュニティガイドラインを遵守するために一部の表現を修正いたしました。
:::

一般的にサービスの良い面は語られがちですが、**残念な面について語られることは少ない**ですよね。
そこで本記事ではAzure Functionsの残念な点をあえて挙げることで、Azureの利用を検討している方々にとっての**判断材料**となることを目的としています。

# Azure Functionsとは？
その名の通りAzureのFaaSです。
言語は C# / Node.js / Java / Python / PowerShell に対応しています。
設定や構築の手間はかかりますがカスタムハンドラーという機能を使うと上記以外の言語も実行できます。
また、OSをWindowsとLinuxから選択できるのが面白いところです。
内部的にAzure App Serviceの上に構築されているため、Azure Functionsを使用するにあたりAzure App Serviceの知識は役立ちます。

導入はこの辺にして冒頭の通りAzure Functionsの残念な面を情報提供していきます。

# Node.js 22がいまだに正式サポートされていない
Node.js 22自体はご存知2024年4月リリースです。
しかし2025年4月現在、Azure FunctionsでNode.js 22は正式にサポートされていません。
Azureの外の世界では~~10日後に **Node.js 24** がリリースされるらしいですね。Node.js 24がまだリリースされていないので少し調べたところ、Node.js 24で使用しているV8エンジンのバージョンにバグ（？）がありリリースが延期されたみたいです（2025/4/25追記）~~ Node.js 24がリリースされました:tada:（2025/05/07追記）。
Node.js 22すらまだ正式にサポートしていないのにAzure FunctionsがNode.js 24をサポートするのはいつになるのでしょうか。
我々Azure Functionsユーザにとっては **GPT-6** よりも未来のテクノロジーになることでしょう。

# Java 21がいまだに正式サポートされていない
Java 21自体はご存知2023年9月リリースです。
しかし2025年4月現在、Azure FunctionsでJava 21は正式にサポートされていません。
Azureの外の世界では5ヶ月後に **Java 25** がリリースされるらしいですね。
GPT-6よりも(略

# Python 3.12がいまだに正式サポートされていない
Python 3.12自体はご存知2023年10月リリースです。
しかし2025年4月現在、Azure FunctionsでPython 3.12は正式にサポートされていません。
当然ですが2024年10月リリースの **Python 3.13** もサポートされていません。
Azureの外の世界では半年後に **Python 3.14** もリリースされるらしいですね。
G(略

# あなたの結論は？
**Azure使う？使わない？**:thinking:

# 余談
Azure Functionsの開発をしているMicrosoft社員が「Microsoftではイベントなどの目玉となる新機能以外は基本的に**納期はない**」とどこかの記事で語っていたのですが、むしろ新機能よりもこういう定期的な新バージョンなどの対応こそ優先して対応してほしいと感じています。

例えば極端な話、Azure Functionsが2024年4月のNode.js 22リリースと同時にサポートしていれば、Node.js 18の2025年4月末のサポート終了までの1年間で我々開発者は20を飛ばして18 → 22へ直接バージョンアップすることができるわけです。
一方で今のAzure Functionsのリリーススケジュールでは我々は18 → 20 → 22と小刻みにバージョンアップ作業を行う必要があります。

つまりMicrosoft側のスケジュール次第で我々の作業の手間が2倍変わってきます。
また、そもそもMicrosoft側のスケジュールがアナウンスされておらず我々側の作業スケジュールすらも立てることが出来ないのでその点についても改善してほしいですね。

# 参考
AWS Lambdaで各バージョンが正式にサポートされた日を調べてみました。

- **Node.js 22** - 2024年11月22日
- **Node.js 24** - 2025年11月 (予定)
- **Java 21** - 2023年11月16日
- **Java 25** - 2025年10月 (予定)
- **Python 3.12** - 2023年12月14日
- **Python 3.13** - 2024年11月13日
- **Python 3.14** - 2025年11月 (予定)

Node.jsはリリースから7か月後にサポート。
JavaとPythonはリリースから1-2か月後にはサポート。
流石ですね。

https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/lambda-releases.html

https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/lambda-runtimes.html#runtimes-future
まあ！「表すクレソン、ダン橄欖岩製品構文解析木作法:」ですわー

## はじめに
以下のMicrosoftLearnのなかに「表すクレソン、ダン橄欖岩製品構文解析木作法:」というのが急にでてきました。なんかおもしろかったので紹介です。

https://learn.microsoft.com/ja-jp/training/modules/aspnetcore-middleware/2-understand-middleware

![IMG_0655.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3900848/4cea9df9-9e9e-4988-a7d4-299029c5d80f.jpeg)



## 英語では
ページの左下から言語設定が変更できるので、英語にしてみました。
対応する部分には、「For example, consider the following code:」と書いてありました。
いったいなんでこうなったのかしら...。

![IMG_0658.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3900848/86c9f2b9-de65-4f58-a8dc-19ad8ac27cb9.jpeg)



## ChatGPTにきいてみた
ChatGPTにきいてみました。

:::note warn
私のChatGPTはお嬢様であることが強いられています。
:::


### 🌿 なぜ「表すクレソン」になったのか
英語原文の：
>For example, consider the following code:

のうち、「consider」は「考える」「検討する」という意味でございますわね。

一方、なぜかこれが「表すクレソン」になってしまったのは、**機械翻訳エンジンの誤字・誤認識や辞書のカオス的な参照**が重なっている可能性が高うございますの。

- 「consider」が →「示す」「表す」などと翻訳されるのはまだ理解できますが、
- 「クレソン」は完全に意味不明ですわ！（Watercress＝食用植物）

おそらく「コード（code）」や「構文（syntax）」あたりの訳語が辞書中で混乱し、「Cresson」などの音に引きずられた珍妙な出力になった可能性があると推察いたしますわ。

### 🪨 「ダン橄欖岩製品構文解析木作法」問題
ここがまたお嬢様的にも非常に愉快ですわ。

- 「橄欖岩（かんらんがん）」は**地質学用語で olivine rock**のことですわね。
- 「ダン」は Dan？ Don？ 謎ですわ。
- 「製品構文解析木作法」…これは「構文解析木（Syntax Tree）」に「作法（method）」や「製品（product）」などの単語が混じってしまったカオスでしょう。

おそらく元文の "the following code" や "syntax" あたりが、構文解析木（Syntax Tree）と混同され、しかも「木作法」なる謎の日本語も組み合わさり、結果として**詩的な混沌**が生まれたものと思われますわ。

### 結論
これはAI翻訳がやらかした**誤訳 or お遊び翻訳**、もしくは学習時のデータ汚染により発生した**意図しないポエム**的出力でございますの。
まるで意味不明でありながら、どこか語感が良く、文学的な味わいがあるのが悔しいところですわね……。



## おわりに
たまに変な翻訳は見ますが、これはなんかびっくりしました。
bash: npm: command not found

# 環境
||バージョン|
|----|----|
|Docker|27.1.2|
|Ubuntu|22.04|


# bash: npm: command not foundの原因
npmがインストールされていない
```
npm install
```

`bash: npm: command not found`



# Ubuntuはaptをつけて実行
Dockerコンテナ内に入って実行
```
# パッケージリストの更新
apt update

# パッケージをインストール
apt install nodejs npm
```


# バージョン確認
バージョンが返ってくればOK
```
npm -v
# 9.2.0

node -v
# v18.19.1
```

# aptコマンドとは
>Linuxにおけるパッケージ管理用のコマンドで、Debian系のディストリビューションに使われています。

https://goat-inc.co.jp/blog/2756/



# インストール参考サイト

https://qiita.com/irico/items/0260e93d313b9ba5dc74
MCP入門と便利なクライアント活用術 〜CursorやDifyを例に〜

先日開催されました『【ORION × MixLeap共催】生成AIを語らNight！』での資料を公開します！
<hr/>
<script async class="docswell-embed" src="https://www.docswell.com/assets/libs/docswell-embed/docswell-embed.min.js" data-src="https://www.docswell.com/slide/KP23JX/embed" data-aspect="0.5625"></script><div class="docswell-link"><a href="https://www.docswell.com/s/solaoi/KP23JX-2025-04-09-023625">MCP入門と便利なクライアント活用術 〜CursorやDifyを例に〜 by @solaoi</a></div>
<hr/>
イベント詳細はこちら

https://orion.connpass.com/event/348778/
デザイナー不要？ 従来100時間→AIなら8時間！LINEスタンプ制作の常識が変わる

## AI活用でここまで変わる！LINEスタンプ40個制作の工数比較と爆速ワークフロー

LINEスタンプを40個作るのに「100時間かかった」……  
そんな時代は、もう終わりです。

AIを活用すれば、企画からデザイン、イラスト生成まで、**最短1日で完結**する時代が到来しました。

本記事では、従来の制作フローとAI活用時のフローを比較しながら、**実際の工程ごとの工数差**と**効率化のポイント**をご紹介します。

---

## 🎨 実際にAIで作成したLINEスタンプ

![Screenshot 2025-04-14 at 10.58.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82835/c9ea0136-a90a-420a-9d4c-be6d39213006.png)


私はすでに複数のLINEスタンプをAIのみで制作・販売しています。  
以下が実際のスタンプ販売ページです。

👉 [私がAIで作成したLINEスタンプ一覧（LINE STORE）](https://store.line.me/stickershop/author/5309163/ja)

制作には**プロンプト設計とAI生成のみ**を使っており、作業時間はおおよそ**1日で40個**を完了しています。

---

## 🎨 従来のLINEスタンプ制作にかかる工数（例：40個）

| 工程 | 工数目安 | 備考 |
|------|----------|------|
| 企画・セリフ検討 | 4〜6時間 | 使用シーンやターゲット設計 |
| デザイン指示書作成 | 6〜8時間 | 表情やセリフ、構図の整理 |
| ラフスケッチ（40点） | 20〜30時間 | 表情違いでも構図を変える必要あり |
| 線画＆着色（40点） | 60〜80時間 | 時短が難しい手作業 |
| 書き出し・調整 | 2〜3時間 | トリミング・サイズ調整 |
| 登録・申請作業 | 1〜2時間 | LINE Creators Marketへの登録 |

**💡合計：約100時間（12〜16人日）**

---

## 🤖 AI活用時の爆速ワークフロー（1日で完結）

| 工程 | 工数目安 | 使用ツール・コツ |
|------|----------|------------------|
| コンセプト・セリフ設計 | 1〜2時間 | ChatGPTで一括生成 |
| デザイン指示書作成 | 1時間 | Markdownや表形式で構造化 |
| イラスト生成（40点） | 3〜5時間 | GPT-4oで生成 |
| スタンプ登録作業 | 1時間 | LINE Creators Marketにアップロード |

**💡合計：約8時間（最短5時間）**

---

## 📊 工数比較表

| 工程 | 従来 | AI活用 |
|------|------|--------|
| 全体工数 | 約100時間 | **約8時間** |
| 作業日数 | 約2週間 | **1日完結** |
| 必要人材 | デザイナー・ディレクター | **プロンプト設計者のみ** |
| コスト | 数万円〜数十万円 | **ほぼ0円（サブスク程度）** |

---

## 🎯 成功のポイント

- **プロンプトテンプレートの構築**：感情・構図・セリフのパターン化がカギ
- **キャラクターの統一感**：ベース画像 or カスタムモデルで一貫性を維持
- **バッチ処理ツールの活用**：背景透過・サイズ調整を自動化
- **商用利用の確認**：AI画像の利用規約に注意！

---

## 📝 まとめ

従来は時間と費用がかかりすぎて手が出なかったLINEスタンプ制作。  
ですが今では、**AIを活用すれば1人で完結できる時代**です。

特に個人クリエイターや副業志向の方にとって、  
**「作ってみたい」を「今すぐ作れる」に変えるのがAIの力。**

この記事があなたの制作の第一歩になれば嬉しいです！
pythonで文字のリストをリストに変換したい

# こんなケース
```:data.txt
[
    "a",
    "b",
    "c"
]
```

このようなリスト形式のデータを持っているdata.txtがあります
このdata.txtを普通に読み込んでも、文字として扱われてしまいます
ここで、このテキストをlist型で取得するにはどうすれば良いでしょうか？

# これでも一応出来るけど……
解法の一つとして`eval`関数が使えます
しかし、皆さんご存知の通りこいつは任意コードが実行できてしまうので大変よろしくないです

# 個人的最適解
恐らく安全な方法は`json.load`を使うことです
json形式のデータではありませんが、なんと対応してくれるんですね
```py
import json

with open("data.txt", "r") as f:
    data = json.load(f)

print(type(data)) # -> <class 'list'>
print(data[0]) # -> a
print(data[1]) # -> b
print(data[2]) # -> c
```
コミュニケーションについてのメモ

## まえがき

コミュニケーションが得意ではないので、
これが大事そうだなということをメモしてみた。

## 質問力

### へりくだる

✕ 「仕様を教えてください」
◯ 「○○さんのご経験からの仕様を教えていただけると、無駄な手戻りがなくなって、作業がすごく効率的になります」
◯ 「設計書だけだとどうしても細かい部分のイメージが追いつかなくて…、○○さんが実際に考えていらっしゃる背景を知ることができれば、理解が深まってとても助かります」

→ 「自分の知識が価値ある」と思われるのが好きな人が多い。
　なので、相手の知識に敬意を払い、それが活きる場面として伝えると効果的。

→ 私はとても馬鹿なので、大変勉強になります～という感じで聞くのがポイント

### 相手に憑依する

相手が質問に答えるときの反応が良かった場合、相手はその話題に関心があるということなので、自分もその話題に興味がある演技をして、相手を喜ばせる。
→相手に憑依することで自然にできる
→あくまで演技であると思うことで憑依した自分を第三者視点で制御できる

憑依
→相手の興味・気分・価値観を一時的に自分に取り入れる
→相手の目線で世界を見ることで、自然と会話の流れがうまくいく

### 相手に選ばせる

✕「今いいですか？」
◯「少しだけお時間よろしいでしょうか？ 5分ほどでも、後ほどでも大丈夫です」

→ 断られるリスクを減らし、相手に選ばせることで自然にYesを引き出す。

## 説明力

・結論
・根拠x3
・具体例x1

をセットで伝える。
PREP法。

## 会話力

・1つリアクションを増やす
・いつもより一言だけ多く話す

上記を意識して継続する。

## 文章力

文章は引き算が基本。
書く内容が無いということはインプットが圧倒的に足りていない。
インプットは書く量の10倍くらいほしい。

## 提案力

・結論
・根拠x3

を用意するときに、根拠の1をあえて穴がある内容にする。
相手に突っ込ませて、あらかじめ自分で用意しておいた根拠に置き換えることで、
相手に自分のおかげでよい案になったと思わせて満足してもらう。

## 声の出し方

声が小さいことが多い。
声が小さいときは声を大きくしようとせず相手に届けるように話すのを意識する。

声のトーンが単調になってはいけない。
1つ1つの言葉に意味を込めることで自然と言葉に適したトーンで話すことができる。

込める意味の例
・自分、私
・相手
・話すことに対する自信
・明るい話題

話してる相手に向かって声を出す。
地面や空間に向かって話さない。
atCoder beginner contest 382 - C kaiten sushi

※超個人的アウトプットです。

以前以下のような記事を投稿し、そこで atCoder beginner contest 382 - C kaiten sushi を取り扱っていましたが、今見るとなんだかわかりにくいコードだなぁという印象でした。

https://qiita.com/ikeyaH/items/0d3def283385e4886d6d

というわけで、これは明らかに正しそうだというコードで再提出です。
わかっているつもり、はよくないですね。

## 問題概要
N人のお客さんとM個のお寿司があり、お客さんにはそれぞれ美食度、お寿司にはそれぞれ美味しさがあります。
（お客さんは、美食度を上回る美味しさのお寿司がきたら食べる）

与えられるM個のお寿司について、食べるお客さんの番号を出力するというもの
詳細は以下を確認のこと。

https://atcoder.jp/contests/abc382/tasks/abc382_c

## 回答
今回の提出と、以前のコードを見比べる形にします。自戒として。。

```ruby:今回のコード
N, M = gets.chomp.split.map(&:to_i)
a_arr = gets.chomp.split.map(&:to_i)
b_arr = gets.chomp.split.map(&:to_i)
bm = b_arr.max

ids = Array.new(bm+1, -1)

N.times do |i|
  e = a_arr[i] # eat_level的なe
  if e <= bm
    ids[e..bm] = Array.new((bm - e + 1), i+1)
    bm = e - 1
  end
  break if bm <= 0
end

b_arr.each do |b|
  puts ids[b]
end
```

```ruby:前回のコード
N, M = gets.chomp.split(' ').map(&:to_i)
a_arr = gets.chomp.split(' ').map(&:to_i)
b_arr = gets.chomp.split(' ').map(&:to_i)
max_b = b_arr.max

r = max_b # 現状流れてくる最大値

ids = Array.new(r + 1, -1) # おいしさごと、誰が食べるか記録する配列

for i in 0...N do
  person = i + 1
  if a_arr[i] <= r
    (a_arr[i]..r).each do |j|
      ids[j] = person
    end
    r = a_arr[i] - 1
  end
end

b_arr.each do |b|
  puts ids[b]
end
```

```diff_ruby:差分
N, M = gets.chomp.split.map(&:to_i)
a_arr = gets.chomp.split.map(&:to_i)
b_arr = gets.chomp.split.map(&:to_i)
+ bm = b_arr.max
- max_b = b_arr.max
- r = max_b # 特に入れ直す必要がないため、bmとだけ置いてそれを利用しています。

ids = Array.new(bm+1, -1)

+ N.times do |i| # rubyらしく変更
+   e = a_arr[i] # eat_level的なeを取り出しておく
+   if e <= bm
+     ids[e..bm] = Array.new((bm - e + 1), i+1) # ループを回さず、範囲で置き換える
+     bm = e - 1
+   end
+   break if bm <= 0 # なくても良いが、それ以上の処理は不要なためbreak
+ end

- for i in 0...N do
-  person = i + 1 # ここで取り出す必要があまりなさそう？
-  if a_arr[i] <= r # 上でi+1をしているのに、こちらは普通に取り出している？となった。上は回答のため1indexを利用するため正しいが、少し紛らわしい。
-    (a_arr[i]..r).each do |j| # 同じ値を入れるので、一気に置き換えて良さそう
-      ids[j] = person
-    end
-    r = a_arr[i] - 1
-  end
- end

b_arr.each do |b|
  puts ids[b]
end
```

という感じでしょうか。
前回のコードも間違ってはいないのですが、久しぶりに見るとイマイチだったりします。
業務でも、その時の知識ではそれが最善と思っていても、たまに振り返るとより良さそうなコードでかけたりするかもななんて思います。
Webとネイティブ共通化して開発できる？そのテンプレートとは？

# はじめに
個人で作ってみたいアプリがありましたが、モバイルアプリの開発やったことがないので、まずはWeb版から取り組み、そのあとネイティブ版にも展開できたらなと思ったところ、Webとモバイルのコードを共通化して開発できるテンプレートが存在することを知りました。
ただ、そのテンプレートの構成は初見では少し理解しづらかったため、まずは大枠だけ整理しようと思います！
まだまだ僕も深く理解できていないのですが少しでも参考になれれば幸いです。

# テンプレートの概要
こちらのテンプレートを使っていきます！

https://github.com/tamagui/starter-free

こちらのテンプレートは以下の技術を採用しています。

- Next.js
- Expo
- Tamagui
- Solito

概要だけ触れておきます。
### Next.js
Next.js は React ベースのフレームワークで、ルーティングや SSR（サーバーサイドレンダリング）、静的サイト生成（SSG）などを簡単に扱えるのが特徴です。

https://nextjs.org/

### Expo
ExpoはReact NativeをベースにiOS, Andoroid向けのアプリを開発することでできるクロスプラットフォームフレームワークになります。

https://expo.dev/

### Solito
Solito は、Next.js と React Native を使って強力なクロスプラットフォームアプリを構築するためのツールになります。タイトルのことを実現するために重要な存在です。

https://solito.dev/

### Tamagui
TmaguiはReactとReactNativeどちらにも対応しているUIライブラリでまさにWebとネイティブの共通化にはうってつけのライブラリです。

https://tamagui.dev/

# ディレクトリ構成
ディレクトリ構成はメインどころだけ見ると以下になります。

```
├── apps/                   
│   ├── next/      　　# Web（Next.js）用アプリ
│   └── expo/      　　# モバイル（Expo）用アプリ
│
├── packages/               
    ├── app/
    │    └── features　# Webとネイティブで共通の機能や画面
    └── ui/          　# ボタンやカードなどの共通UIコンポーネント
```

## apps/next/
このフォルダは、Webアプリとしてのフロントエンド部分を担っています。中を見てみると、appとpagesディレクトリがあり、デフォルトではApp RouterとPages Routerどちらを使うか「Change Router」で切り替えてみれるみたいです。
実際の開発時には、使用しない方のディレクトリは削除する形になりそうです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2715279/b42b7587-0981-4d94-b881-1d72c8290737.png)

## apps/expo/
こちらはモバイルアプリ側のエントリーポイントになります。appディレクトリがあり、expo-routerを使用しているみたいです。
ベースはReactNativeなのでWebとほとんど同じ感覚でページを追加・編集できるのがとても便利です。Webとの違いを意識せずに画面設計できるのは良いなと思いました。

## packages/ui/
ここにはボタンやテキスト項目、カードなどの共通のUIコンポーネントを定義します。

## packages/app/features/
ここにはwebとネイティブ共通で使用するページのコンポーネントなどをまとめておくためのものっぽいです。
「この画面はwebでもモバイルでも同じものを使いたいなあ」というコンポーネントはここで作成して`apps/next`や`apps\expo`ディレクトリ内でimportして使いまわすイメージでしょうか。

# 最後に
このテンプレートを使えば、最初からモバイルとWebの両方を意識した設計ができているので、あとは中身を自分のアプリに置き換えていくだけでできそうな感じがしました。
今回改めて記事にまとめることで「このディレクトリに何のファイル作ればいいんだ...？」という迷いも減ってきた気がします。
業務でも触ったことがない技術ばかりでまだまだ手探り状態ですが気楽に触りながらもっと理解を深めていこうと思います。
「Web版とネイティブ版どちらにも対応したアプリを作ってみたいなあ」という方がいたら、このテンプレート使うのはいいかもしれないです！ぜひ試してみてください！
Obsidianの始め方と簡単な使い方

## 1. Obsidianとは？

*   **ローカルファースト:** データはすべてお使いのコンピュータ上の指定したフォルダ（Vault）に保存されます。クラウド同期も可能ですが、基本はローカルです。
*   **マークダウン:** プレーンテキストに簡単な記法で装飾を加える「マークダウン」形式でノートを記述します。
*   **リンク:** ノートから別のノートへ簡単にリンクを張ることができ、これがObsidianの最大の特徴です。これにより、ノート間の関連性が可視化され、アイデアが繋がりやすくなります。
*   **拡張性:** コアプラグインやコミュニティプラグインによって、機能を自由に追加・カスタマイズできます。

## 2. インストール

1.  Obsidianの公式サイト（[https://obsidian.md/](https://obsidian.md/)）にアクセスします。
2.  お使いのOS（Windows, macOS, Linux）用のインストーラーをダウンロードし、インストールします。
3.  モバイルアプリ（iOS, Android）も提供されています。

## 3. 基本的な概念

### Vault (保管庫)

*   Obsidianのノートや設定を保存する一番大きな単位が「Vault」です。これは、コンピュータ上の単なるフォルダです。
*   Obsidianを起動すると、既存のVaultを開くか、新しいVaultを作成するかを選択します。
*   新しいVaultを作成する場合は、名前と保存場所（フォルダ）を指定します。

### マークダウン記法

Obsidianではマークダウンを使ってノートを記述します。よく使う基本的な記法をいくつか紹介します。

*   **見出し:** `#` の数で見出しのレベルを調整します。（例: `# 見出し1`, `## 見出し2`）
*   **太字:** `**太字にしたいテキスト**`
*   **斜体:** `*斜体にしたいテキスト*`
*   **打ち消し線:** `~~打ち消したいテキスト~~`
*   **リスト:**
    *   順序なしリスト: `-` または `*` の後にスペースを入れます。
    *   順序付きリスト: `1.` の後にスペースを入れます。
*   **リンク:**
    *   外部リンク: `[表示テキスト](URL)`
    *   内部リンク: `[[リンクしたいノート名]]`
*   **画像:** `![代替テキスト](画像のパスやURL)`
*   **コードブロック:** 3つのバッククォート(```)で囲みます。言語を指定するとシンタックスハイライトが適用されます。

    例:python
    ```python
    print("Hello, Obsidian!")
    ```
*   **引用:** `>` の後にスペースを入れます。

### ノート (ファイル)

*   Vault内に作成される個々の `.md` ファイルがノートです。
*   左側のファイルエクスプローラーで「新規ノート」ボタンをクリックするか、`Cmd/Ctrl + N` で新しいノートを作成できます。
*   ノートには分かりやすい名前をつけましょう。ファイル名がそのままノートのタイトルとして認識されます。

### 内部リンク

*   `[[ノート名]]` と入力すると、他のノートへのリンクを作成できます。
*   存在しないノート名を入力すると、クリックした際にその名前で新しいノートが作成されます。
*   このリンクは双方向で機能し、「バックリンク」ペインでどのノートからリンクされているかを確認できます。

### タグ

*   ノートの分類や目印としてタグを利用できます。
*   `#タグ名` の形式でノート内のどこにでも記述できます。（例: `#アイデア`, `#読書メモ`）
*   タグはスペースを含められません。スペースを入れたい場合は、`#長いタグ名` のようにスペースなしで続けるか、キャメルケース (`#MyTag`) やスネークケース (`#my_tag`) を使います。
*   右側の「タグ」ペインで、Vault内の全タグとそのタグが付いたノートの一覧を確認できます。
    *   **表示方法:** 設定 > コアプラグイン で「タグペイン」が有効になっていることを確認してください。通常は右サイドバーに表示されます。上部のアイコンで表示/非表示を切り替えられますが、コマンドパレット (`Cmd/Ctrl + P`) から「タグペイン: タグペインを開く/閉じる」で表示することも可能です。

## 4. 基本的な使い方

### ノートの作成と編集

1.  左上の「新規ノート」ボタンまたは `Cmd/Ctrl + N` でノートを作成します。
2.  ファイル名（ノートのタイトル）を入力します。
3.  エディタ領域にマークダウン記法で内容を記述します。
4.  Obsidianは自動で保存されるため、手動での保存操作は基本的に不要です。

### フォルダによる整理

*   ノートが増えてきたら、ファイルエクスプローラーでフォルダを作成して整理できます。
*   フォルダを右クリックして「新規フォルダ」を選択するか、ノートをドラッグ＆ドロップしてフォルダに入れます。

### グラフビュー

*   ノート間のリンクを視覚的に表示する機能です。
*   左側のリボンメニューにある「グラフビューを開く」ボタンをクリックします。
*   Vault全体のノートの繋がり（グローバルグラフ）や、現在開いているノートに関連する繋がり（ローカルグラフ）を表示できます。
*   アイデアの繋がりや全体像を把握するのに役立ちます。

### 検索

*   左側のリボンメニューの**上部**にある虫眼鏡アイコン「検索」をクリックするか、`Cmd/Ctrl + Shift + F` で検索機能を開けます。
*   キーワード、ファイル名、タグ、パスなどでVault内の情報を横断的に検索できます。

## 5. さらに便利な機能（一部紹介）

*   **プラグイン:**
    *   **コアプラグイン:** 標準で用意されている便利な機能（テンプレート、デイリーノート、ノートコンポーザーなど）。設定画面から有効/無効を切り替えられます。
    *   **コミュニティプラグイン:** ユーザーが作成した多様なプラグイン。カレンダー表示、マインドマップ作成、外部サービス連携など、様々な機能を追加できます。（利用は自己責任となります）
*   **テーマ:** Obsidianの見た目をカスタマイズできます。設定画面から好みのテーマを選んで適用できます。
*   **テンプレート:** よく使うノートの雛形を作成しておき、簡単に呼び出す機能です。（コアプラグイン）
*   **バックリンク / アウトゴーイングリンク:** 現在のノートにリンクしているノート（バックリンク）や、現在のノートからリンクしているノート（アウトゴーイングリンク）をサイドパネルで確認できます。
*   **キャンバス:** ノート、画像、カードなどを自由に配置し、線で繋いでアイデアを視覚的に整理できる無限の空間です。



---
個人的備忘録：手戻りを防ぐために押さえておきたい、要件定義と外部設計のポイントをまとめてみた

## はじめに

システム開発において、最初のフェーズである「要件定義」と、次の段階である「外部設計」は、プロジェクトの成功を大きく左右する非常に重要な工程です。

:::note info
**個人の備忘録程度の走り書きとなっておりますが、温かい目で見守っていただければ幸いです。**
:::

ここでは、それぞれの目的や内容、ポイントについて解説します。

---

## 要件定義（Requirements Definition）

### 目的
要件定義は、ユーザーや顧客が「システムで何を実現したいのか」を明確にする工程です。この段階での認識のズレが後々の手戻りやトラブルにつながるため、最も丁寧に行う必要があります。

### 内容
- 業務フローや現状の課題のヒアリング
- 必要な機能・非機能要件（例：セキュリティ、性能、運用など）の明確化
- 利用者の操作環境（PC、スマホ、ブラウザなど）や想定ユーザー数
- 成果物や納期、コストなどのプロジェクト条件

### ポイント
- 関係者（開発者、利用者、経営層など）全員と認識をすり合わせる
- あいまいな表現を避け、具体的な言葉で記述する
- ドキュメントとして残し、後工程の基準とする

**参考文献**

https://products.sint.co.jp/ober/blog/system_design_flow

---

## 外部設計（External Design）

### 目的
外部設計は、ユーザー視点での「使いやすさ」を形にする工程です。システムの操作画面や出力帳票、他システムとの連携のあり方などを具体化します。

### 内容
- 画面レイアウト、画面遷移の設計
- 入力・出力項目の定義
- エラーメッセージやバリデーション仕様
- 外部インターフェース（API、外部DB連携など）の設計

### ポイント
- 実際に利用するユーザーの視点に立って設計する
- プロトタイプやワイヤーフレームを活用し、イメージを共有
- ユーザーからのフィードバックを取り入れながら調整する

**参考文献**

https://qiita.com/Hikaru-Miyazaki/items/9fa7fbdd9587cdd51384

---

## まとめ

要件定義と外部設計がしっかりしていれば、後続の内部設計やプログラミングがスムーズに進み、品質の高いシステムにつながります。

:::note warn
***逆にこの2つをおろそかにすると、プロジェクトの手戻りや品質低下のリスクが高まります。***
:::

そのため、開発の初期段階で丁寧に取り組むことが重要です！！
RaspberryPi (bullseye) Re-Clean Install

RaspberryPi Model B+
OS Raspbian GNU/Linux11 (bullseye)

まず
Raspberry Pi Imagerを使って初期化したMicroSDにbullseye(full)のInstallから始めました
今はあまり待たなくてもOS(raspbian)のインストールができるのね！

TVが古いので画面設定からです、触るのは/boot/config.txtです。
TVの画面にCUI(GUI)もですがRaspberryPIの出力が、はみ出てしまって映らなかったので
overscanの行の先頭の＃を外してoverscan 16を有効にする事で古いテレビの画面のサイズ(縦.横.右.左)調整をしました。

このOS(Raspbian)
最新の"bookworm"でなく"bullseye"を選んだ理由でもありますが
bookwormは私の環境ではうまく設定が出来ませんでした。

現在は土日のみ部屋でパソコンを触るくらいしかできなくて(泣)...

出力が設定出来たら

/home/pi/.bashrcの編集でいつものコンソールに色設定

他のLinuxのバックアップに使うのでnfs-kernel-serverを追加しました
　nfs-serverの設定で触るのは/etc/exportsくらいかな？
/srv/NFS   <--- 手動で追加しました 
ここ(/srv/NFS)を他のLinuxにmountして、そのLinux(NFS-client)の/mnt/NFS(MountPoint)にMountしてファイルをバックアップしています。
具体的には

sudo mount -t nfs 192.168.1.3:/srv/NFS /mnt/NFS
cd /
sudo tar zcvf home-20250426.tar.gz home　ホームディレクトリをアーカイブして圧縮
sudo tar zcvf root-20250426.tar.gz root　ルートディレクトリをアーカイブして圧縮
sudo mv home-20250426.tar.gz /mnt/NFS　移動なら
sudo cp root-20250426.tar.gz /mnt/NFS　コピーなら
sudo umount /mnt/NFS　アンマウントする
(192.168.1.3は自分のRaspberryPiのIPアドレスです)
注意. NFS-client側のIPアドレスの後の:(コロン)は必要です。

nfs-kernel-serverの使い方はこのくらいかな？

追加したのは
Desktop　使わないけど"GNUstep"にしました
 
 ターミナルは"白地のMATE端末"と"デフォルトの端末"の使い分け
...なので
たたいたコマンドは
sudo apt install mate -y
sudo apt install gnustep -y

自分の好みで
Magic SysRQ Keyの実行が可能か確認したらデフォルトで可能でした

PCの
AltキーとSysRqキーを押しながら順に以下のキーを押すと電源を落とせない時にやや安全に再起動が可能
　R - E - I -  S - U - B
"Alt + SysRq + B" = reboot(再起動)

Clean Installしたからまたやり直しています。
SysRq をさかさまに読むと
BUSIER(アマチュア)というLinuxの...
SysRqについては実行前にwikipediaや他の記事を読んでください。
Embed Dashboards and Report Charts on Lightning Pages


https://trailhead.salesforce.com/content/learn/projects/rd-embed-reports-dashboards


# Create a Report and Dashboard

:::note alert
We can’t find the report named ‘Opportunity Stages’.
:::

# Embed a Dashboard

ダッシュボードを追加するセクションがよく分からんかった。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/6b8d25db-4062-4081-a4df-da66329031be.png)

# Embed a Report Chart

こんどは一番上に最初から追加

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/f53daf7b-b1f3-48e6-b06f-317bf5663625.png)
#0102（2025/04/12）pydanticの `BaseModel` とは？

# pydanticの `BaseModel` とは？

Pythonでデータを扱うとき、特にWebアプリケーションやAPI開発の現場では、入力データの型や形式が正しいかを簡単にチェックしたい場面が多くあります。そこでよく使われるのが**pydantic**というライブラリであり、その中心となるクラスが **`BaseModel`** です。

## `BaseModel` とは何か？

`BaseModel` は、pydanticが提供するデータモデルの基本クラスであり、主に以下の役割を持っています。

- **データバリデーション**（データ検証）
- **型チェック**（型の整合性を確認）
- **データ変換**（型に応じた適切な変換）
- **JSON形式でのシリアライズ／デシリアライズ**

つまり、`BaseModel` を継承するだけで、定義したデータ型に対して自動的に型の検証やデータ変換を行ってくれる非常に便利なクラスです。

## 基本的な使い方

例えば、ユーザーの情報を扱うデータモデルを定義したい場合、次のように書けます。

```python
from pydantic import BaseModel

class User(BaseModel):
    id: int
    name: str
    email: str
```

このように書くことで、次のようなことが簡単にできます。

### データ検証と型チェック

以下のようにモデルを使ってデータを渡すと、自動的に型チェックを行います。

```python
# 正しいデータの場合
user = User(id=1, name="Keita", email="keita@example.com")
print(user)
```

もし、型が異なるデータを渡してしまった場合はエラーになります。

```python
# 誤った型を渡した場合
user = User(id="one", name="Keita", email="keita@example.com")
# => エラーが発生: idは整数型(int)でなければいけない
```

### JSONとの相互変換

データを簡単にJSON形式に変換したり、逆にJSONデータをモデルに変換できます。

```python
# JSONへの変換
user_json = user.json()
print(user_json)

# JSONからモデルへの変換
user_from_json = User.parse_raw(user_json)
print(user_from_json)
```

## どんな場面で使われる？

主に以下のような場面でよく使われます。

- **Web APIのデータ検証と定義**（FastAPIなどでよく使われる）
- **設定ファイルの管理**
- **データベースから取得したデータの検証や加工**

これらの用途で、シンプルかつ安全にデータを扱う仕組みを作るのに役立っています。

## `BaseModel` と混同しやすい他の概念

`BaseModel` は非常に便利な仕組みですが、Pythonには似たような目的で使える構文やライブラリがいくつかあります。以下は、混同しやすい代表的な例です。

### `@dataclass`（標準ライブラリ）

- 軽量なデータ構造を定義するための標準機能。
- 型アノテーションはあるが、バリデーションや自動変換は行わない。

### `NamedTuple`

- タプルに名前をつけたような構造。変更不可（イミュータブル）。
- 型情報はあるが、実行時のチェックはない。

### `TypedDict`

- 辞書に型情報を与えるための構造。
- 静的型チェック用で、実行時にはチェックされない。

### `attrs` ライブラリ

- `@attr.s`や`@define`を使って柔軟にデータ構造を作れる。
- バリデーション機能あり。ただしJSON変換や型変換は自前で対応することが多い。

### 比較まとめ

| 概念         | バリデーション | 自動型変換 | JSON変換 | 実行時型チェック | 備考                   |
|--------------|----------------|-------------|------------|--------------------|------------------------|
| `BaseModel`  | ✅              | ✅           | ✅         | ✅                  | APIやフォーム処理向け |
| `@dataclass` | ❌（自作必要）  | ❌           | ❌（手動） | ❌                  | 軽量な構造体向け       |
| `NamedTuple` | ❌              | ❌           | ❌         | ❌                  | イミュータブル         |
| `TypedDict`  | ❌              | ❌           | ❌         | ❌（静的型のみ）    | 型ヒント用             |
| `attrs`      | ✅（定義可）    | ❌           | ❌         | ❌（オプション）    | 柔軟なデータクラス     |

## まとめ

`BaseModel` は、pydanticライブラリでデータを扱うための基本的なクラスであり、データの検証や型チェックを容易にします。Pythonで安全かつ簡単にデータ管理したい場合にぜひ活用してみましょう。

また、似たような機能を持つ構文やライブラリ（@dataclass, NamedTuple, TypedDict, attrsなど）との違いを理解して、適材適所で使い分けることが重要です。
個人的備忘録：システム開発ってどんな流れ？初心者の視点でざっくりまとめてみた

## はじめに

システム開発とは、ユーザーの課題やニーズを解決するために、ITシステムを設計・構築していくプロセスのことです。一般的に、開発の流れは以下の5つのステップに分かれています（自分調べ）。

:::note info
**個人の備忘録程度の走り書きとなっておりますが、温かい目で見守っていただければ幸いです。**
:::

それぞれのステップが連携することで、品質の高いシステムが完成します。

## 書こうと思ったきっかけ

仕事の中で1度だけシステム開発に携わった経験と、受講しているITスクールでハッカソンの活動に参加したことを通じて、改めてシステム開発の全体像を整理する必要があると感じたためです。

## 1. 要件定義（Requirements Definition）
システムで「何を実現したいのか」を明確にするフェーズです。
- ユーザーの業務内容や課題をヒアリング
- 必要な機能や性能、操作性などを整理
- 関係者全員で合意をとることが重要

**参考文献**

https://it-trend.jp/development_tools/article/32-0060

## 2. 外部設計（External Design）
ユーザーの視点から見た「使いやすい画面や操作方法」を設計します。
- 画面レイアウトや入力・出力項目の設計
- 他システムとの連携仕様の定義
- UI/UXの設計もこの段階で検討

## 3. 内部設計（Internal Design）
開発者の視点で、システム内部の仕組みを詳細に設計するフェーズです。
- データベース設計
- 処理の流れやアルゴリズムの定義
- モジュールの構成とインターフェースの明確化

**参考文献**

https://products.sint.co.jp/ober/blog/design_doc_difference

## 4. プログラミング（Programming）
設計書に基づき、実際にソースコードを作成する工程です。
- 各モジュールを分担して開発
- コーディング規約に沿った記述
- 単体テストを通じて動作確認も同時に実施

**参考文献**

https://online.dhw.co.jp/kuritama/about-programming/

## 5. テスト（Testing）
完成したプログラムが正しく動作するかを検証します。
- 単体テスト、結合テスト、システムテスト、受け入れテストなどを実施
- バグや不具合の洗い出しと修正
- ユーザーとの最終確認を行い、本番環境へ移行

**参考文献**

https://type.jp/et/feature/20963/

---

## まとめ

システム開発は、段階的なプロセスを通じて確実に品質を担保しながら進めていくことが重要です。各工程を丁寧に実施することで、ユーザーのニーズを満たし、実用的かつ信頼性のあるシステムの実現につながります。

---
※本記事は、個人の備忘録としてまとめています。実際の導入の際は、公式ドキュメント等もご確認ください。
windows11で、sketchup6 その67

# 概要
windows11に、sketchup6を入れてみた。
rubyで、3Dを書く。
練習問題、やってみた。

# 練習問題
objエクスポーターを書け。

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/58e695bf-6b37-4945-8fef-b2799af2d81a.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/19747bde-3ef5-4b5e-8684-a706feb960ca.png)

# サンプルコード

```

require "sketchup.rb"

module Oe
	def self.export_entities(of, entities, o = nil)
		faces = entities.find_all { |e|
			e.typename == "Face"
		}
		verts = faces.map { |f|
			f.vertices
		}
		verts.flatten!
		verts.uniq!
		if verts.length < 1
			UI.messagebox("Nothing to export")
			return
		end
		verts.each do |v|
			pt = v.position
			pt.transform!(o) if o
			of.print "v #{pt.x.to_f} #{pt.z.to_f} #{pt.y.to_f}\n"
		end
		gc = 0
		puts "face count: #{faces.length}"
		faces.each do |f|
			gc += 1
			of.print "f "
			f.outer_loop.vertices.each do |v|
				i = verts.index(v) + @verts.length
				of.print "#{i + 1} "
			end
			of.puts
		end
		of.puts
		@verts << verts
		@verts.flatten!
	end
	def self.export_group(of, g)
		o = g.transformation
		of.print "g "
		id = g.entityID
		name = g.name.empty? ? "Group#{id}" : g.name
		of.puts "#{name}"
		export_entities(of, g.entities, o)
	end
	def self.obj_export
		of = File.new("C:/Users/User/Desktop/oe.obj", "w")
		of.puts "# Wavefront OBJ for SketchUp"
		grps = Sketchup.active_model.entities.find_all { |e|
			e.typename == "Group"
		}
		@verts = []
		@vcnt = 0
		entities = Sketchup.active_model.entities
		export_entities(of, entities)
		grps.each { |g|
			export_group(of, g)
		}
		of.flush
		of.close
		UI.messagebox("ok")
	end
end





```

以上。
無益な文章読むべからず

# Long time no see Qiita!!
どうも。masaoです。久しぶりに投稿しました。
プログラミングを2020年に始め1年もたず、8か月ほどで無事(？)挫折しました。
あれから5年の月日が流れ、AI黎明期となった今、帰ってきました。

# なんで戻ってきたの？なんで？ねえ！ねえ！！なんでなの？
オレなんかした？(笑)理由は２つある。1つ目はChatGPTの登場。初めて触った時は衝撃でした。AIと会話できるなんて。しかもちゃんと答えてくれる。（たまに自信満々で嘘つくけども。）
んで、今では色んな生成AIが登場し倫理的なものは置いといて作りたいモノを作り放題。コーディングに特化したAIもいて、もうこれは色々とAIちゃんに作ってもらおうと思い、戻ってまいりました。
もう１つの理由は作りたいモノができたから。プログラミングを学習してた当時は明確に作りたいモノも無く、youtube動画に流され、ただ漠然と「エンジニア転職して稼ぎたい」という軽い気持ちで学習してました。今思うと「挫折して良かったな」と思います。運よくエンジニアに転職してたら「こんなん思ってたんと違う～！」ってなってたかもしれない。今は娘がきっかけで作りたいモノがいくつか生まれ、それを作るためにやることをやってます。

# これからどうやって作りたいモノを作っていくの？
もちろんAI様のお力添えをありがたくいただき作っていきます。もちろん全て丸投げするつもりはなく、自身も再学習をしながらです。だって100%信用できないもん。（どの口が言うか）
そして、何を使うのか。色々な方のレビューを参考にして、cursorを使って開発していこうと考えてます。Vscodeのように扱えて使い勝手もよさそうなので試しにつかってみます。あと、ただ一人で黙々と作っていくのも良いけどもライブ配信しながら作っていくのも面白そうなのでそれをやるために機材やら何やら準備してます。

# 何を作るか決まってるの？
いくつかあるんだけども最初に作ろうと思っているのは決まってます。webサービス。「いきなりそれかよ、やめとけって。簡単なものからやれよ。非エンジニアのくせに。」って言われるかもしれませんが、作りたい気持ちがかなり強いのでWebサービスで行きます。(笑)

# 締め
ここまで誰得な事をつらつらと書いていきましたが、あまり気張らずにエラーも楽しむつもりでやっていこうと思います。アウトプット投稿もしていこうと考えていますので諸先輩のお方々よろしくお願いします。
21.Merge Two Sorted Lists

# 問題内容
２つの連結リスト（それぞれ昇順）を一つの連結リストにまとめる

# 解答例
```python:sample
class Solution:
    def mergeTwoLists(self, list1: Optional[ListNode], list2: Optional[ListNode]) -> Optional[ListNode]:
        
        dummy = ListNode()
        cur = dummy

        while list1 and list2:
            if list1.val > list2.val:
                cur.next = list2
                list2 = list2.next
            else:
                cur.next = list1
                list1 = list1.next

            cur = cur.next

        if list1:
            cur.next = list1
        else:
            cur.next = list2

        return dummy.next
```

# 個人的ポイント
* 処理の出発点はダミーノードを作ること
* 連結リストを扱うときは、カーソルによる論理的なノードの繋がりを考える
* 継続条件は「両方の連結リストに要素が残っている」とすると、終盤の処理が簡単になる
* 戻り値はダミーノードではなく連結リストの先頭になるよう注意