OmniAICreator/Qiita-1.07M huggingface dataset:
C_TS422_2023 SAP Certified Application Associate SAP S/4HANA Production Planning and Manufacturing対策（6/100）

【6日目】
トピック 1：SAPS/4HANAサプライチェーン計画の概要（6/6）

≪問題6≫
資材所要量計画と能力計画に対する説明で正しいものはどれですか。
□資材所要量計画では、品目の内部調達と外部調達の両方を計画する。能力計画では、作業区の利用可能能力に基づいて作業を計画する。
□資材所要量計画では、品目の内部調達と外部調達の両方を計画する。能力計画では、作業区の独立所要量に基づいて作業を計画する。
□資材所要量計画では、品目の内部調達を計画する。能力計画では、作業区の利用可能能力に基づいて作業手順を計画する。
□資材所要量計画では、品目の内部調達を計画する。能力計画では、作業区の独立所要量に基づいて作業手順を計画する。

≪解答≫
■資材所要量計画では、品目の内部調達と外部調達の両方を計画する。能力計画では、作業区の利用可能能力に基づいて作業を計画する。
□資材所要量計画では、品目の内部調達と外部調達の両方を計画する。能力計画では、作業区の独立所要量に基づいて作業を計画する。
□資材所要量計画では、品目の内部調達を計画する。能力計画では、作業区の利用可能能力に基づいて作業手順を計画する。
□資材所要量計画では、品目の内部調達を計画する。能力計画では、作業区の独立所要量に基づいて作業手順を計画する。

≪解説≫
資材所要量計画(MRP)は、品目の内部調達と外部調達の両方を計画するプロセスです。この計画では、材料の供給が途切れないようにすることが目的です。MRPを通じて、資材の在庫状況と供給計画を立て、内部または外部からの供給を考慮して生産に必要な資材を確保します。
C_TS422_2023 SAP Certified Application Associate SAP S/4HANA Production Planning and Manufacturing対策（5/100）

【5日目】
トピック 1：SAPS/4HANAサプライチェーン計画の概要（5/6）

≪問題5≫
需要管理の計画独立所要量が他の所要量によって利用されるかどうかを決定する要因は以下のどれですか。
（２つ選択）
□指図タイプ
□計画方針
□所要量プロファイル
□所要量タイプ

≪解答≫
□指図タイプ
■計画方針
□所要量プロファイル
■所要量タイプ

≪解説≫
需要管理において計画独立所要量（PIR：PlannedIndependentRequirements）は、生産計画に基づいて設定される予測需要です。PIRの利用方法は「計画方針」と「所要量タイプ」によって決まります。
計画方針：これは、需要の計画および管理方法を設定します。たとえば、計画方針によって、PIRを確定需要として使うか、補充生産として考えるかが決まります。
所要量タイプ：所要量タイプは、需要の種類を区別します。例えば、独立所要量と従属所要量があり、これによりどのプロセスに所要量を使うかが決定されます。
RiderでLINQのメソッドチェインの途中結果を確認する

C#のLINQメソッドチェインで思った通りの結果にならない時、途中結果を確認できたら便利ですよね。

この投稿では、RiderでLINQのメソッドチェインの途中結果を確認する方法を紹介します。

* この投稿のスクリーンショットは、Rider 2025.1 RC1のものです
* この投稿では、次の様なコードを使って説明します


```csharp
var persons = new List<Person>
{
    new ("田中太郎", 35),
    new ("鈴木花子", 28),
    new ("佐藤一郎", 42),
    new ("山田梅子", 29),
    new ("田中二郎", 32)
};

var names = persons
    .Where(p => p.Age > 30)
    .Select(p => p.Name)
    .Order();

foreach (var name in names)
{
    Console.WriteLine(name);
}

record struct Person(string Name, int Age);
```

---

LINQの処理をする前の行でブレークポイントを貼り、デバッグ実行し、LINQの処理をステップオーバーします。

![スクリーンショット 2025-04-12 14.42.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4125/a076d947-2a1b-4320-9191-fbc545a0b5c2.png)

するとDebug Windowの「Thread & Variables」タブに、LINQのメソッドチェインごとの結果が表示されます。次のスクリーンショットは、該当の「Thread & Variables」タブを拡大した様子です。

![スクリーンショット 2025-04-12 14.34.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4125/5aea16bc-5742-4b2f-88cb-6d082b6041c5.png)

Exploreボタンをおし、Results要素を開くと、各要素を確認することができます。（スクリーンショット中に、「Expanding will force enumaration of the object」と注意があることに気をつけてください。）


![スクリーンショット 2025-04-12 14.33.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4125/78b33eb1-15f6-4c1f-a397-fb8bb14aedd6.png)

---

この様にRiderでは、LINQのメソッドチェインの途中結果を確認できます。

---

Rider 2025.1以降を使うのであれば、「Debug LINQ expressions」が便利です。

https://qiita.com/RyotaMurohoshi/items/6e36c6fff56e8582d30d

（Rider 2025.1 RCの段階では、Top-level statementsで使えないかもしれません。）
[Blender]ショートカットキーが効かなくなった時に確認する手順

# 概要
突然、特定のショートカットキーが効かなくなって困った事がありました。その時解決した手順を共有します。
# 本文
## 前置き
例えばGキーでの移動が効かなくなった場合を例にしてみます。

## 確認
Edit > Preferences > Keymap > Key-Bindingタブ > 検索欄に「G」を入力します
![change1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/d7b2eb7a-cd9f-4f53-bfaf-8e95ea259f6f.png)

本来なら、Gキーの移動が表示されるはずですが
![change2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/3dd9c751-55eb-4fef-92c5-79bf1544502b.png)

今回はそれが見当たりませんでした。代わりにRestoreボタンがあります。つまり、そのグループ内のショートカットキー設定がデフォルトから変更されていることがわかりました。
![change3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/021e1fe6-2467-413c-a10c-81e92a0c2ee8.png)

あとはその変更されたショートカットキーを直接元に戻してもいいですし、Restoreボタンを押して一発でデフォルトのショートカットキーに戻すこともできます


:::note info
Restoreボタンを使う場合、そのグループ内で他に変更したショートカットキーがあったらそれも一緒に元に戻されます。ご注意ください！
:::
【PHP】モデルデータのクリーニングと検証

# モデルのデータの検証

フレームワークを使えないレンタルサーバーで、生の`$_POST`を検証する場合。
`$_POST`はユーザーからの投稿データであり信用できないものである。
そのため検証やサニタイズが必要になる。

## intデータのバリデーション

`int`のデータはコメントで教えてもらった`filter_var`で検証できそう。

```php:
$valid = filter_var($_POST['age'], FILTER_VALIDATE_INT);
if ($valid === false) {
    die("invalid age");
}
```

この関数はパースに失敗すると`false`を返す。
`$_POST['age']`が整数でない場合はパースに失敗し、`$valid`が`false`になる。

## floatデータのバリデーション

floatの場合は`FILTER_VALIDATE_FLOAT`を使う。

## モデル

データモデルのクラスを作る。
フレームワークは使えないので自前で作る。

```php:
class PersonModel {
    function __construct() {
        $this->age = null;
        $this->weight = null;
    }

    function clean() {
        $this->age = filter_var($this->age, FILTER_VALIDATE_INT);
        $this->weight = filter_var($this->weight, FILTER_VALIDATE_FLOAT);
    }

    function validate() {
        $this->clean();
        if ($this->age === false || $this->age < 0 || $this->age >= 200) {
            throw new \Exception('invalid age value');
        }
        if ($this->weight === false || $this->weight < 0 || $this->weight >= 500) {
            throw new \Exception('invalid weight value');
        }
    }
}
```

こんなクラスを作ったらPOSTデータを突っ込んでクリーニングと検証を行う。

```php:
$person = new PersonModel();
$person->age = $_POST['age'];
$person->weight = $_POST['weight'];

try {
    $person->validate();
} catch (\Exception $e) {
    die($e->getMessage());
}

try {
    $person->save();
} catch (\Exception $e) {
    die($e->getMessage());
}
```

## クリーニングとバリデーションは分けてやるべきなのか？

この`PersonModel`ではデータのクリーニングと検証を分けて行っている。
`validate()`内では`clean()`を呼び出しているので、検証の時はデータのクリーニングを必ずやるようになる。

`filter_var()`の性質上、値をフィルタしてその返り値で検証するというものなので、検証とクリーニングを切り離すのは2度手間になりそう。

またクリーニングではメンバ変数に直接クリーンした値を入れているが、これは別の`cleaned_data`などを作ってそこに入れた方が、元のデータを損失しないで済む。これはDjangoなどの設計ではそうなっている。

## しかしこういうのを突き詰めていくと・・・

しかしこういうことを考えると、今度は`IntField`クラスとか`FloatField`クラスとかが欲しくなる。
そうなるとフレームワーク作り始めてしまうのだが、こわいので手は出さず・・・。
うーん、プログラミングは時間泥棒、はまるとどこまでも吸い取られる！

## おわりに

今まで整数の検証は`intval`でやっていたが、`filter_var`なるものを教えてもらったのでよかった。
おわり。
個人的備忘録：BootstrapからTailwindまで！CSSフレームワークをざっくり整理してみた

## はじめに

WebアプリケーションやWebサイトを効率的に開発するために、CSSフレームワークは欠かせない存在となっています。

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

デザインの統一性を保ちながら、手間を省いてスタイリングができるため、フロントエンド開発者にとって非常に重宝されています。

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

開発中の個人アプリでUI設計に時間がかかってしまい、もっと効率的にスタイリングできる方法を探していたところ、CSSフレームワークの活用が効果的であると感じたため、主要なCSSフレームワークについて整理しておこうと思いました。

## CSSフレームワークとは？

CSSフレームワークとは、あらかじめ定義されたクラスやスタイルを使って、HTML要素を手軽に装飾できるツール群のことです。レイアウト、タイポグラフィ、ボタン、フォームなどのスタイルが標準で用意されており、再利用性と開発効率を高めることができます。

**参考文献**

https://qiita.com/ngtnysk/items/551fd63d818388c3f951

https://freelance.bizlink.io/tips/css-framework

## 代表的なCSSフレームワーク

### Bootstrap
- 世界で最も利用されているCSSフレームワークの一つ。
- グリッドシステムやコンポーネントが豊富。
- デフォルトデザインが強めでカスタマイズには工夫が必要。

https://getbootstrap.jp/

### Tailwind CSS
- ユーティリティファーストなCSSフレームワーク。
- クラスを直接HTMLに記述することで柔軟なデザインが可能。
- カスタマイズ性が高く、デザイン自由度も高い。

https://tailwindcss.com/

### Bulma
- シンプルで直感的なクラス名が特徴。
- モダンな見た目で、Sassベース。
- JavaScriptに依存しない。

https://bulma.io/

## 選び方のポイント

- **デザインの自由度**：カスタマイズしたいならTailwind CSS。
- **導入の手軽さ**：BootstrapやBulmaはすぐに使える。
- **JSの使用有無**：純粋にCSSだけで使いたいならBulma。
- **チームの習熟度**：チームでの採用なら、情報が豊富なBootstrapが無難。

## まとめ

CSSフレームワークを使うことで、開発のスピードとデザインの一貫性を両立することができます。それぞれに特徴があるため、プロジェクトの目的や開発体制に応じて最適なフレームワークを選ぶことをおすすめいたします！
GitにおけるDatabricks AI/BIダッシュボードのソース管理

こちらの機能です。

https://docs.databricks.com/aws/ja/dashboards/git-support

> ダッシュボードに Databricks Git フォルダーを使用すると、変更と履歴の可視性が向上し、コラボレーションがより効率的になります。 また、ダッシュボードの本番運用へのデプロイが簡素化され、以前のバージョンの復元が可能になり、信頼性の高いバックアップソリューションとして機能します。



# 有効化

ワークスペースの[Preview](https://docs.databricks.com/aws/ja/admin/workspace-settings/manage-previews)ページで**Support Dashboards in Git Folder**を有効にします。

![Screenshot 2025-04-13 at 9.08.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/b1eba2d2-eb33-40c6-89db-fb5d17deed9b.png)

# 準備

GitHubなどでリポジトリを作成します。

![Screenshot 2025-04-13 at 9.09.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/61736a62-8106-4b44-abaf-8ec31734ed39.png)

# ダッシュボードのソース管理

Databricksワークスペースで、上のリポジトリをポイントする[Gitフォルダ](https://docs.databricks.com/aws/ja/repos/)を作成します。

![Screenshot 2025-04-13 at 9.09.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/02e27d78-79bf-40f3-90e6-39d303483194.png)

Gitフォルダでダッシュボードを作成します。

![Screenshot 2025-04-13 at 9.09.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/54ab4181-5a57-4236-baed-43dfa4edaf6c.png)

![Screenshot 2025-04-13 at 9.12.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/e6fe88f8-1ec2-4851-94cc-834d86b18a00.png)

ダッシュボードが保存されているGitフォルダにアクセスし、**main**をクリックします。

![Screenshot 2025-04-13 at 9.12.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/4eb5e4f9-558d-4954-8696-2b0131f241aa.png)

ダッシュボードはJSONとして取り扱われるので、そのままコミット & プッシュできます。

![Screenshot 2025-04-13 at 9.12.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/c20088de-fd9f-48de-83d2-4e8b40921435.png)

これでGitにプッシュされました。

![Screenshot 2025-04-13 at 9.13.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/0183cc73-78eb-48a5-af48-3f3df34a1b24.png)

# 変更管理

GitでJSONが管理されるので、レイアウト変更なども追跡できます。

![Screenshot 2025-04-13 at 14.50.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/afb0aa24-778a-4b92-a180-63a24b675283.png)
![Screenshot 2025-04-13 at 14.51.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/e2b8a7ba-79f1-4ea9-a2c7-817988b0b9fa.png)

なお、Gitフォルダで管理されているダッシュボードを表示した際にも、コミット&プッシュを行うボタンが表示されます。

![Screenshot 2025-04-18 at 17.25.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/7274d472-41c2-47df-af33-a97d1e393d28.png)



リポジトリはこちらです。

https://github.com/taka-yayoi/dashboard_in_git/tree/main

### はじめてのDatabricks

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

### Databricks無料トライアル

[Databricks無料トライアル](https://databricks.com/jp/try-databricks)
【色変記事】13歳で入緑するまでにしたこと

こんにちは！ナツアカネと申します。AtCoderのIDはtombo_です。先日のABC401で入緑することができたので、したことを簡単にまとめてみます。

# 自己紹介
- 現在中学二年生
- 中学校の数学はそこそこ得意
- プログラミングは小学四年生くらいから始めた
- 競プロは2024年の11月ごろから始めた
- 使える言語はC++ Python Rust C# など
- 競プロではC++を主に使用　時々python3を使う

![スクリーンショット 2025-04-13 8.51.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3572788/dd6b0232-9413-42e2-b476-bd17d26ab7b2.png)

# 入緑時点でできること・できないこと
素数判定や最大公約数などは[アルゴ式](https://algo-method.com/topic_themes)の「整数論的アルゴリズム」というトピックで主に勉強しました。
## アルゴリズム
### できる
- 全探索（線形探索、ビット全探索など）
- 二分探索
- 深さ優先探索
- 幅優先探索
- クラスカル法（最小全域木）
- ダイクストラ法
- ベルマン・フォード法
- ワーシャル・フロイド法
- ナップザックDP
- GCD・LCM
- 素数判定
- 素因数分解
- 累積和
- いもす法
- しゃくとり法
### できないことはない
- トポロジカルソート
- プリム法（最小全域木）
- bitDP
### できない
- 木DP
- 区間DP
- 拡張ユークリッドの互除法
- フォード・ファルカーソン法
- 他にもここに書かれていないものはほとんどできない
## データ構造
標準ライブラリのものはC++を元にして書きます。
### できる
- 配列・vector
- 双方向リスト・list
- set
- map
- unordered_set
- unordered_map
- stack
- queue
- priority_queue
- deque
- グラフ（無向/有向・重み付き/重みなし）
- UnionFind
### できないことはない
- 重み付きUnionFind
- multiset
### できない
- Segment Tree
- Binary Indexed Tree

# 入緑するまでにしたこと
## 競プロ典型90問を解く

https://atcoder.jp/contests/typical90

★4までのすべてと★5の5問、合わせて46問を解きました。解説を見なければわからなかった問題もありましたが、二分探索法や動的計画法などの基本を押さえるのにとても役立ちました。
## Yukicoderへの参加

https://yukicoder.me/

コンテストに3回くらい参加しました。時間があまりなかったので、難しい問題をじっくり解くことよりも自分のレベルに合った問題を早く解くこと目指して取り組みました。
今後は参加回数をもっと増やしていきたいです。

## アルゴ式の問題を解く
![スクリーンショット 2025-03-27 8.38.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3572788/1843506e-cb25-4498-bd69-c88ae39130b2.png)
アルゴ式の主にグラフや木関係と整数論的アルゴリズムの問題を解きました。特に整数論的アルゴリズムの素数や約数関係の問題はとても役に立ちました。ただ、動的計画法の問題などはまだまだ解けていないので、勉強していきたいと思います。

# 環境
## エディタ
エディタには、UIのシンプルなZedを使用し、vim_modeという設定をオンにしています。つまり、Zed上でvimのコマンドを使ってコーディングしています。
いつか[こたつがめさん](https://www.youtube.com/watch?v=ImVYMpTuXiY&t=2729s)のような速さで実装できるようになりたいです。
## SNS
X(旧Twitter)はやっていませんが、おすすめしている記事が多いので、始めてみたいとは思っています。
Discordで競プロ系のサーバーに入っています。

# 入緑までに取ったパフォーマンス
一回だけABC400にて水パフォを取りました。
| 色  | 回数 | 
| :-: | :--: | 
| 水  | 1    | 
| 緑  | 6    | 
| 茶  | 9    | 
| 灰  | 6    | 

# 精進グラフ
![スクリーンショット 2025-04-13 9.14.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3572788/e7e17d9f-b5d1-4e99-bf68-cceaa6a39497.png)
まだまだです。緑diff、水diffを中心に解いていこうと思います。

# 最後に
入水するために、もっと精進しようと思います！あと、学校ではAtCoder人口を増やすために努力しています（笑）
fortranの基本


## 環境

- OS:windows11
- ターミナル:bash

## 参考記事
- https://www.nag-j.co.jp/fortran/
  
詳細は上記記事を参照してほしいのですが、自分で使ってみて最低限必要だなと思える知識のみを以下で示します。


## プログラムの基本
### 暗黙型宣言をキャンセル
```fortran:f90
implicit none
```
fortranは何も宣言しなくても変数名の文頭の数字やアルファベットに則して型がついてしまいます。なので、上記のように宣言することでそのようなエラーのもととなる動作をキャンセルしておきます。（慣れている人は別ですが）
### プログラム全体の例
```fortran:f90
program calc
  implicit none
  integer a, b, c, d
  real e, f

  a = 1+3           ! a に 1+3 の結果（4）を代入
  b = a-2           ! b に a-2 を代入
  c = a*2           ! c に a*2 を代入
  d = 1/a           ! d に 1/a を代入（小数点以下切り捨て）
  print *, a, b, c, d
  e = 6.0/2.0       ! e に 6÷2 を代入
  f = e**3.0        ! e の 3 乗を f へ代入

  print *, e, f, g

  ! === 結果出力 ===
  call calc_g()

contains
  subroutine calc_g()
    double precision g
    g = 4d0*(2d0+1d0) ! かっこを使って足し算を先に行う例
    print *, g
  end subroutine calc_g

end program calc

```
メインプログラムはprogramからend programである。また、サブルーチン（関数）を書くこともできる。また、matlabと同じでfor文は0ではなく1から始まります。

## プログラムの実行

dockerなどでgfortranの設定をしたのち、以下のコマンドを打つと、コンパイルできる。
```bash:bash
gfortran hello.f90
./a.out
```


## 最後に
スーパーコンピュータで今でも使われているfortranですが、昔の言語ということがあってあまり記事が見つからなかったので、自分で記事を書いてみることにしました。どなたかの参考になれば幸いです。
direnvを使ってディレクトリごとに環境変数を柔軟に設定しよう！

## 概要
direnvを使うことで特定のフォルダに指定した環境変数を柔軟に設定できます
今回はインストール方法、使用方法等について解説します

## 前提
- Macおよびzshrcを使用する前提でインストール方法について解説しています

## インストール
homebrewでインストールできます
```
brew install direnv
```

zshにhookを設定します
```
eval "$(direnv hook zsh)"
```

Oh my zshのプラグインが用意されているので以下のように記載できます

```.zshrc
plugins=(... direnv)
```

## 環境変数の設定
対象のディレクトリに.envrcを作成し、以下のようにexportも含めた上で記述します

```.envrc
export GCP_PROJECT=project_name
export FIRESTORE_COLLECTION_NAME=collection
```

direnv allowコマンドで環境変数を対象のディレクトリで使用できるようロードします

```
direnv allow
direnv: loading ~/project/app/.envrc
direnv: export +FIRESTORE_COLLECTION_NAME +GCP_PROJECT
```

以下のようにechoコマンドで環境変数が設定されていることが確認できれば成功です

```
echo ${GCP_PROJECT}
my-project
```

## 参考
https://github.com/direnv/direnv

https://direnv.net/docs/hook.html

https://formulae.brew.sh/formula/direnv#default

https://qiita.com/kompiro/items/5fc46089247a56243a62
ABC401の振り返り

最近他の中学生勢が強くなってきていて自分ももっと頑張ろうと感じる
そしてCがどんどん簡単になってDが難しくなっていくのやめてください
## [A問題](https://atcoder.jp/contests/abc401/tasks/abc401_a)(diff:8) ##
前回より簡単(出力する文字列が長いのが面倒)
$2 \times 10^2 \le S \cap S < 3 \times 10^2$ かを判定するだけです。
計算量は $O(1)$ となります。
ACコード(pypy55ms,C++1ms)
```python
S, h = int(input()), 10 ** 2
if S >= 2 * h and S < 3 * h:
  print("Success")
else:
  print("Failure")
```
AC時間:1:27
## [B問題](https://atcoder.jp/contests/abc401/tasks/abc401_b)(diff:20) ##
見掛け倒し!
最初、フラグ $f$ を $0$ としておき、<code>login</code>が出たら $f = 1$ とし、<code>logout</code>が出たら $f = 0$ とし、$f = 0$ かつ <code>private</code>が出たら答えを一増やす、とすれば良いです。
計算量は $O(\sum_{i = 1}^N len(S_i))$ です。
ACコード(1ms)
```c++
#include <bits/stdc++.h>
using namespace std;

int main() {
  int N, f = 0, ans = 0;
  cin >> N;
  for(int i = 0; i < N; i++) {
    string S;
    cin >> S, f = (S == "login" ? 1 : f), f = (S == "logout" ? 0 : f), ans += (1 - f) * (S == "private");
  }
  cout << ans << endl;
}
```
AC時間:4:29
## [C問題](https://atcoder.jp/contests/abc401/tasks/abc401_c)(diff:248) ##
[前回のC](https://atcoder.jp/contests/abc400/tasks/abc400_c)よりかは簡単だけど、典型問題ではあるので解くべき
スライド総和のようなことをすることが公式解説には載っていますが、累積和をとっても良いです。
まず、$N < K$ の時は明らかに $1$ です。それ以外の時について考えます。
$A_i = \sum_{j = i - K}^{i - 1}A_j$ です。ここで、累積和をとっておけば、$A_i$ を $O(1)$ で求めることができます。$A_i$ を求めたらそこまでの累積和もとっておくようにしましょう。
計算量は $O(N)$ です。実装上の注意として、例えばC++なら負の値を割ったときの余りが(数学的に)正しいとは限らないので、$10^9$ を足してから余りを求めれる必要があります。
ACコード(21ms)
```c++
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
//library end

ll inf = (ll)1e9;

int main() {
  int N, K;
  cin >> N >> K;
  vector<ll> A(N + 1, 0), sum(N + 1, 0);
  for(int i = 0; i < min(N + 1, K); i++) {
    A[i] = 1, sum[i] = ((i ? sum[i - 1] : 0) + 1) % inf;
  }
  for(int i = min(N + 1, K); i <= N; i++) {
    A[i] = (sum[i - 1] - (i > K ? sum[i - K - 1] : 0) + inf) % inf, sum[i] = (sum[i - 1] + A[i]) % inf;
  }
  cout << A[N] << endl;
}
```
AC時間:8:11
## [D問題](https://atcoder.jp/contests/abc401/tasks/abc401_d)(diff:1148) ##
場合分けはできましたが、そこから進みませんでした
## [E問題](https://atcoder.jp/contests/abc401/tasks/abc401_e)(diff:1270) ##
なんとなーく構想が立つこともなく、少しだけ考察ができただけでした
## 感想 ##
悪くはない(パフォ941,レート746)
緑まであと54レートとなりました。多分水パフォが出せたら入れると思うので、得意系のE問題やらが来ることを願わんばかりです。
Windows の物理ドライブを列挙する

# 1. はじめに
需要があるかどうかはわかりませんが、Windowsの物理ドライブを列挙するプログラムです。
呼び出すと "\\\\.\\PhisycalDriveX" が vectorに入って返ってきます。

QueryDosDevice に必要なサイズが事前にわからないので、十分なサイズになるまでループするようにしています。たいていは1回で済むはずです。

``` C++:EnumPhisicalDrive.cpp

std::vector<std::string> EnumPhysicalDrive()
{
    // 結果を保存するベクタ
    std::vector<std::string>    enumResult;

    static std::string  search = "PhysicalDrive";
    static std::string  prefix = "\\\\.\\";

    // デバイス名を保存するバッファ
    std::unique_ptr<char[]> buffer;
    const DWORD maxBufferSizeStep = 32768;
    DWORD maxBufferSize = maxBufferSizeStep;

    DWORD dwQueryResult;
    do {
        buffer.reset(new char[maxBufferSize]);
        dwQueryResult = QueryDosDeviceA(NULL, buffer.get(), maxBufferSize);
        maxBufferSize += maxBufferSizeStep;
    } while (dwQueryResult == 0 && GetLastError() == ERROR_INSUFFICIENT_BUFFER);

    char* deviceName = buffer.get();
    while (*deviceName) {
        std::string strDevice = deviceName;
        if (strDevice.find(search) != std::string::npos) {
            enumResult.push_back(prefix + strDevice);
        }
        // 次のデバイス名へ移動
        deviceName += strlen(deviceName) + 1;
    }
    return enumResult;
}
```
3さんじのパワポのつかいかた　How to use PowerPoint for children aged 3.

# パワポ：Power Point

# おもいをしめす idea processor
Power Point is an idea processor.
パワポはおもいをしめします。

Share your idea with others
あなたのおもいをほかのひとにつたえよう。

## わたしはだれ？ Who am I.
わたしがしたいこと　What I want to do.
わたしがすきなこと　What I love.
わたしがよいとおもうこと　What I think is good.
わたしがうれしいこと　What makes me happy.
わたしがたのしいこと　What I enjoy.
わたしがとくいなこと　What I am superior.
わたしがほしいもの What I want to be.
わたしがなりたいもの What I want to be.
### わたしがしたいこと　What I want to do.
### わたしがすきなこと　What I love.
### わたしがよいとおもうこと　What I think is good.
### わたしがうれしいこと　What makes me happy.
### わたしがたのしいこと　What I enjoy.
### わたしがとくいなこと　What I am superior.
### わたしがほしいもの What I want to have.
### わたしがなりたいもの What I want to be.

## あなたはだれ Who are you.
あなたがしたいこと　What You want to do.
あなたがすきなこと　What You love.
あなたがよいと思うこと　What You think is good.
あなたがうれしいこと　What makes you happy.
あなたがたのしいこと　What You enjoy.
あなたがとくいなこと　What You am superior.
あなたがほしいもの What You want to have.
あなたがなりたいもの What You want to be.
### あなたがしたいこと　What You want to do.
### あなたがすきなこと　What You love.
### あなたがよいと思うこと　What You think is good.
### あなたがうれしいこと　What makes you happy.
### あなたがたのしいこと　What You enjoy.
### あなたがとくいなこと　What You am superior.
### あなたがほしいもの What You want to have.
### あなたがなりたいもの What You want to be.
# いまからなにする What are you going to do now?

# まとめ　summary

やったこと　What I did

やってないこと　What I didn't do

わかったこと　What I learned

わからなかったこと　What I didn't know

# 回答例
### わたしがとくいなこと　What I am superior.
　つうしんちえんをはかる
　コンパイラをよくする
　せいぎょモデルのけいさん

### わたしがすきなこと　What I love.

　音楽（ジャズ：楽器歴、オルガン１年、クラリネット２年。エレフエ所有。）
　絵画（１０歳から３年油絵。配色：デッサンを習っていない。美術科進学をあきらめた。）　
　サッカー（主に観戦。息子が小学校でサッカーやってたころは四級審判員）
　猫　上着に猫の毛がついていることを入社してまもないころに、指摘された。
　猫のぱらぱら動画をTickTokにあげた。ticktokが閲覧できない人のためにFace bookにもあげた。Youtubeはこれから。
https://www.youtube.com/@kiyoshiogawa

　海外旅行：中国３、香港、マカオ、韓国３、タイ３、マレーシア、シンガポール、インド、イスラエル、アメリカ１０、カナダ３、メキシコ、ペルー、ブラジル、イギリス、アイスランド、フランス２、デンマーク、スウェーデン、フィンランド、オランダ、ドイツ４、オーストリア、イタリア３、スペイン３、ロシア２，南アフリカ２、オーストラリア２。
　　
### わたしがなりたいもの What I want to be.
　テスラの社外取締役（ネットにも書いている。）https://qiita.com/kaizen_nagoya/items/a77a81da08b17194699f


### わたしがしたいこと　What I want to do.
　プログラミング
　コンパイル
　プログラムだけでいきる。にほんごはチャットだけ。
 
えいご、にほんご、プログラミングをとくいなじゅんにならべてください。
　アセンブラ（X86）、えいご、C、にほんご、Python
BigQuery内のDatasetから最新の日付のPrefix/Suffixのテーブル名を取得するには？

## 概要
Dataset内の履歴テーブルから最新のPreffixもしくはSuffixのテーブル名(例えば、history_20250202)を取得したいニーズがあるかと思います
INFORMATION_SCHEMAを使えば実現できるのでその方法について解説します

## INFORMATION_SCHEMAとは？
BigQueryに関するメタデータ情報を提供するシステム定義の読み取り専用のViewです
BigQueryに限らず、MySQLやPostgresにも存在します
INFORMATION_SCHEMA.TABLESのViewからデータセット内の各テーブルまたはViewが表示されます
今回はINFORMATION_SCHEMA.TABLESを使ってテーブルの一覧を取得し、MAX関数とREGEXP_CONTAINS関数を使って該当するREGEXと日付の形式(YYYYMMDD)のテーブルから最新の日付のテーブル名を取得するクエリを作成します

https://cloud.google.com/bigquery/docs/information-schema-tables?hl=ja#schema

## 最新の日付のPrefix/Suffixのテーブル名を取得できるクエリ
最新の日付のPrefixのテーブル名は以下のように取得できます
```
SELECT MAX(table_name) FROM project.dataset.INFORMATION_SCHEMA.TABLES
WHERE REGEXP_CONTAINS(table_name,"[0-9]{8}_history")
```

また、最新の日付のSuffixのテーブル名は以下のように取得できます

```
SELECT MAX(table_name) FROM project.dataset.INFORMATION_SCHEMA.TABLES
WHERE REGEXP_CONTAINS(table_name,"history_[0-9]{8}")
```

## 実際に実行してみよう！
今回はSuffixに日付をつけた履歴テーブルを作成してみました

![スクリーンショット 2025-04-13 8.35.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/625980/dfeb022c-b9b0-40d3-9f99-287d2fab412c.png)

クエリを実行し、最新の日付のテーブル名を取得できれば成功です

![スクリーンショット 2025-04-13 8.37.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/625980/b04ec496-8607-4f38-a878-0c4849c3a08e.png)

また、MIN関数を使って一番古い日付のテーブル名も取得できます

![スクリーンショット 2025-04-13 8.38.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/625980/cb80ddf1-97dc-4e43-9ee1-c9d5801de81c.png)

## 参考
https://cloud.google.com/bigquery/docs/information-schema-intro?hl=ja
個人的備忘録：FastAPIに合うORMはどれ？特徴と選び方をざっくりまとめてみた

## はじめに

PythonでWeb APIを開発する際に注目されているFastAPIは、軽量かつ高速なフレームワークとして知られています。

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

本記事では、FastAPIと一緒に使用できるORM（Object Relational Mapping）ライブラリについて整理します。

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

FastAPIでAPI開発をしている中で、どのORMを選ぶべきか悩む場面がありました...。

https://sqripts.com/2022/06/16/20408/

公式ドキュメントにも複数の選択肢があるため、それぞれの特徴を整理して比較したいと思ったのがきっかけです。

## FastAPIとORMライブラリの関係について

プログラミング言語には、データベース操作を効率化するためのORM（Object Relational Mapping）ライブラリがいくつか用意されています。中にはWebフレームワークに内包されているものもあり、選択するフレームワークによって使用するORMがある程度決まっているケースもあります。

以下は代表的なORMライブラリの一例です。

| ORM          | 言語   | Webフレームワーク     |
|--------------|--------|------------------------|
| SQLAlchemy   | Python | FastAPI など           |
| DjangoORM    | Python | Django                 |

FastAPI は Python の Web フレームワークのひとつですが、Djangoのように特定のORMを内包しているわけではありません。そのため、FastAPIでは開発者が自由に ORM を選択することができます。中でも最も一般的なのが SQLAlchemy で、FastAPIの公式ドキュメントでも推奨されています。

## FastAPIにおすすめのORMライブラリ

FastAPIで使用するのにおすすめのORMを紹介します。

### SQLAlchemy（+ Alembic）
- 特徴：高機能で柔軟性が高く、業務開発でも広く使われている。
- メリット：
  - ドキュメントが豊富。
  - Alembicと組み合わせることでマイグレーション管理も可能。
- デメリット：
  - 初期設定がやや複雑。
  - 学習コストが少し高い。

FastAPI公式ドキュメントでもSQLAlchemyの使用が推奨されています（個人調べ）。

**参考文献**

https://zenn.dev/shimakaze_soft/scraps/bfa75df3e51258

### Tortoise ORM
- 特徴：Django ORMに似た直感的な書き方ができる非同期対応ORM。
- メリット：
  - `async/await`ベースの非同期処理に対応。
  - 軽量で扱いやすい。
- デメリット：
  - 高度な機能や柔軟性はSQLAlchemyに劣る。
  - ドキュメントや事例が少ない。

**参考文献**

https://qiita.com/sand/items/074866157635b50eb447

## まとめ

FastAPIはORMを内包していない分、自由度が高く、プロジェクトの性質に応じてORMを選べる点が魅力です。

- 業務向け・拡張性重視なら：SQLAlchemy + Alembic
- 軽量・非同期重視なら：Tortoise ORM や Ormar

学習コストと開発目的のバランスを見ながら、自分に合ったORMに参考にしてみてください！！
#atcoder #プログラミング #AHC045 # 町連結アルゴリズム

# 概要
問題の条件に、グループ内の町(2次元空間に散在)が道路で連結(全ての町に道路で到達できる)されていることというのがある。
グラフでよくある問題だと思うので最適アルゴリズムというのがあると思うが、一応自分で考え出したものを載せておく。
ちなみに、厳密には、その道路総長がより短い方が良い。
また、自分の場合は効果より安全を重視するので簡単を考慮している。

# 案1
直近を踏まえた一筆書き。

0. 全ての町で、直近の町を総当たりで求める。
0. その長さで町を降順ソートする。
0. ソート後を連結する。

# 案2

0. 案1の手順2まで行う。
0. 各町の有効状態を用意する。
0. 各町で次の処理をする。
その町が直近になっている町を、その町のブランチ扱いとする。
追加した町の有効状態を無効にする。
0. 各町で次の処理をする。
ブランチ扱いの町を元の町と連結する。
有効な町を一筆書きで連結する。

# イメージ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397476/ce546311-9859-4ff3-8fcb-519d4d1b6fc3.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397476/90a1e6cf-7377-4d6c-b3c0-a5a84f117a98.png)
個人的備忘録：エンドポイントって何？クラウド時代に欠かせない基礎知識としてまとめてみた

## はじめに

実務や学習の中で "このURLって何？" "この宛先どこを指してるの？" といった疑問を持つことがあり、整理しておきたいと思ったためです。

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

特にクラウドやAPIに触れる機会が増える中で、エンドポイントの概念を正確に理解しておくことは重要だと感じました。

## エンドポイントとは？

エンドポイント（endpoint）とは、ITやWeb開発の分野において「通信の接続先」や「サービスが提供される場所」を指します。APIやネットワーク、クラウドなど、さまざまな文脈で登場する用語です。

---

## エンドポイントの使われ方

### 1. APIエンドポイント
REST API や GraphQL API などで、特定のリソースにアクセスするためのURL。

例：
- `https://api.example.com/users` （ユーザー情報取得用）
- `https://api.example.com/items/123`（特定の商品情報取得）

**参考文献**

https://www.cloudflare.com/ja-jp/learning/security/api/what-is-api-endpoint/

### 2. ネットワークエンドポイント
TCP/IP通信などにおける、送信先や受信元を表すもの。IPアドレス＋ポート番号の組み合わせが典型的です。

例：
- `192.168.1.10:80`（Webサーバー）

**参考文献**

https://www.microsoft.com/ja-jp/security/business/security-101/what-is-an-endpoint#:~:text=%E3%82%A8%E3%83%B3%E3%83%89%E3%83%9D%E3%82%A4%E3%83%B3%E3%83%88%E3%81%A8%E3%81%AF%E3%80%81%E3%82%B3%E3%83%B3%E3%83%94%E3%83%A5%E3%83%BC%E3%82%BF%E3%83%BC,%E3%83%87%E3%83%90%E3%82%A4%E3%82%B9%E3%80%81%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E3%81%AA%E3%81%A9%E3%81%8C%E3%81%82%E3%82%8A%E3%81%BE%E3%81%99%E3%80%82

### 3. クラウドサービスのエンドポイント
AWSやAzure、GCPなどのクラウドサービスでも、各サービスへアクセスするためのエンドポイントが定義されています。

例：
- AWS S3：`https://s3.ap-northeast-1.amazonaws.com`
- AWS RDS：`mydb.cluster-123456789.ap-northeast-1.rds.amazonaws.com`

**参考文献**

https://www.cloud-for-all.com/m365/blog/what-is-cloud-endpoint

---

## エンドポイントを設計・利用する際の注意点
- **認証と認可**：APIエンドポイントは基本的に認証が必要。
- **URLのバージョニング**：`/v1/` などでバージョン管理をすることが多い。
- **HTTPSの利用**：セキュリティの観点からHTTPではなくHTTPSを使う。
- **リージョンの確認**：クラウドのエンドポイントはリージョンごとに異なることがある。

---

## まとめ
エンドポイントは「通信の入り口」であり、API、ネットワーク、クラウドなど幅広い場面で登場します。

:::note warn
***特にクラウド時代の今、意識的に理解を深めておくことで、トラブルを防ぎ、設計や開発の質も向上します！***
:::

個人的な備忘録としてまとめましたが、参考になれば幸いです！
個人的備忘録：cat と grep コマンドに関するちょっとしたコツを、記事としてアウトプットしてみた

## はじめに

Linuxのコマンドはシンプルながらも非常に強力である一方、細かな記述ミスによって思わぬ結果を招くこともあります。

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

本記事では、初学者がつまずきやすいポイントを例に挙げて解説します。

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

実際に学習の中で遭遇したコマンドの記述ミスを振り返りながら、正しい記述方法を整理しておきたいと思い、備忘録としてまとめることにしました。

---

## cat greetings.txt | grep “world” greetings.txt について

このコマンドでは、`grep` の後に再度 `greetings.txt` を指定してしまっており、意味のない繰り返し指定になっています。

※**また、引用符が全角（“”）になっているため、シェル上では正しく動作しません。**

✅ 正しくは以下のようになります：

```bash
cat greetings.txt | grep "world"
```

ただし、そもそも `cat` コマンドを使わずに `grep` だけで目的を達成する方がよりシンプルで推奨されます：

```bash
grep "world" greetings.txt
```

---

## echo "Hello,world!" > greetings.txt について

このコマンドでは、"Hello, world!" の中の半角スペースが抜けており、本来意図したメッセージと異なる出力になる可能性があります。

✅ 正しくは以下のようになります：

```bash
echo "Hello, world!" > greetings.txt
```

---

## まとめ

どちらも細かい点ではありますが、実務の現場ではこうした小さなミスが意外と大きな不具合につながることがあります。

:::note warn
***正確なコマンドの記述を心がけることが大切です。***
:::

今後も小さな気づきを大切にしながら、Linuxの習得を深めていきたいと思います！
Wio BG770Aの省電力化！delay関数で驚きの実現!?

# 省電力化の実現方法
Wio BG770Aでの省電力化は、非常にシンプルです。
基本的には、delay関数を呼ぶだけです。delay関数を使用することで、マイコンが低消費電力に移行し、消費電力を大幅に削減することが出来るボードです。

どれぐらい省電力なのかは、以下のサイトでも詳しくは掛かれていますが、ここでの待機はdelay関数を呼ぶだけで簡単に実現できます。

https://seeedjp.github.io/Wiki/Wio_BG770A/power-consumption.html

https://note.com/susa_lab/n/n5e0658980707


# 背景
マイコンボードで省電力化を実現しようとしたときに、ちょっと詳しい人であれば、「何も処理をしないときはスリープモードに移行して、必要なときにIOやタイマーを割り込みに復帰させて、処理としてまたスリープに移行」という流れが思い付くと思います。
なので、Wio BG770Aで省電力化を実現しようと、まずは割り込み処理を実装してみたのが以下の記事です。

https://qiita.com/yukima77/items/536867589f62a82ef480

そして、次に省電力化のためにスリープモードなどに移行する方法を調べていて、上記のdelay関数を呼ぶだけで十分省電力化が実現されていることに気が付きました(笑)

# ちょっと考察
ArduinoIDEの環境でさまざまな開発ボードが使用できて、その多くは、delay関数を呼び出すことができて、単純に時間待ちをする処理を実現することができます。ただ、それは単純に時間を待っているだけで、CPUも動作しているので、特に電力が削減されることはあまりないです。
ただ、今回のWio BG770Aの場合は、delay関数を呼ぶだけで省電力化を簡単に実現することが出来ます。もちろん、そもそもマイコンが省電力である点や、delay関数を呼び出した先でおそらく何かしらの工夫がいろいろされているのだと思いますが、Wio BG770Aをシンプルに使いたいユーザーにとっては、delay関数を呼ぶだけで省電力化が実現されているのはとてもすごいことだと思います！

さらに、通常のマイコンの場合は、省電力化のためにDeepSleepモードまで移行すると、内部のプログラム変数が保持されないことが多いので、DeepSleepモードに移行するときにデータを保持したい場合は、何かしら工夫をすることが一般的だと思います。ただ、今回のWio BG770Aについては、delay関数を呼び出して省電力化されるため、内部のプログラム変数が保持できないといったことは当たり前ですが発生しません。なので、とても簡単に省電力化が実現できるとともに、プログラム自体もあまり難しいことを考える必要がないので、とても簡単に省電力化して使うことができます！

# まとめ
Wio BG770Aの場合は、delay関数を使うことで十分に省電力化することができます！
なので、難しいことはあまり考えずに、とりあえず、delay関数を使っていろいろ実装しましょう！



# その他参考リンク

https://qiita.com/yukima77/items/e45a44720cd7fffade3d

https://qiita.com/yukima77/items/45793e72b2347ecbb18b
ABC401振り返り

## はじめに

AtCoder Beginner Contest 401に参加しましたので報告します。

## 結論

- 今回も解いたのはA問題B問題のみ
- パフォーマンスは215、現在のレートは31(参加2回目)
- レート147の壁は越えられそうだが入茶は現状無理そう
- (ABC400と比べて)全体的に簡単な印象を受けた

## A - Status Code

200以上299以下の数値が入力されたらSuccess、それ以外の場合はFailure。
簡単です。

```cpp:A.cpp
#include <bits/stdc++.h>
using namespace std;

int main() {
  int s;
  cin >> s;
  if (200 <= s && s <= 299) {
    cout << "Success" << endl;
  } else {
    cout << "Failure" << endl;
  }
  return 0;
}
```

## B - Unauthorized

publicなんて無かったんや。

ログイン中のログイン、ログアウト中のログアウトに対して何も行わないということから、login、logoutはフラグを立てるだけです。

そして、privateが来た時にログインしていなければカウントを増やす、と。
それだけです。

publicなんて無かったんや。

```cpp:B.cpp
#include <bits/stdc++.h>
using namespace std;
using ll = long long;

int main() {
  string s;
  ll N, ec = 0;
  bool is_login = false;
  cin >> N;
  for (ll i = 0; i < N; i++) {
    cin >> s;
    if (s == "login") is_login = true;
    if (s == "logout") is_login = false;
    if ((s == "private") && (is_login == false)) ec++;
  }
  cout << ec << endl;
  return 0;
}
```

## その後の問題

- C問題から急に難度アップ
- C問題は翌朝起きた後に見当がつき、解説を見るとその見当通りだった
- D問題は問題文・解説文共に読んだんですが、まだ理解できない
- E問題以降は現時点ではまだ一切触れていない

## レーティング変動

9→31(+22)。
前回と同じでAB問だけですが、時間短縮により今回のパフォーマンスは215に上がりました。
ただ茶色にはほど遠いです。

## 今後の課題

- 『問題解決のための「アルゴリズム×数学」が基礎からしっかり身につく本』を購入したので、問題を解きつつ読み進める
- 高校数学が弱いので、高校数学の書籍を理解する
- A問題B問題の解答時間が遅いので、スピードアップを図るために練習を行う
- AtCoder Daily Trainingに参加する。現状はEASYだが、いずれはALLに参加したい所存
- 過去問(主にA問題〜C問題)を解く

## おわりに

慣れていない環境ですが、少しずつ進んでいるようです。
これからも精進しますので、よろしくおねがいします。
windows11で、sketchup6 その69

# 概要
windows11に、sketchup6を入れてみた。
rubyで、3Dを書く。
Three.jsでobjビュアーを作って、objファイルを埋め込んだHTMLをcodepenに上げてみた。

# Three.jsでobjビュアーを作って、objファイルを埋め込んだHTML

<p class="codepen" data-height="900" data-default-tab="html,result" data-slug-hash="JojgLxo" data-pen-title="sketchup" data-user="ohisama" style="height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;">
  <span>See the Pen <a href="https://codepen.io/ohisama/pen/JojgLxo">
  sketchup</a> by ohisama (<a href="https://codepen.io/ohisama">@ohisama</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://public.codepenassets.com/embed/index.js"></script>

以上。
読書感想文「実践！プロジェクト管理入門」　ch1~2

# 書籍名「実践！プロジェクト管理入門」　ch1~2
著者：梅田 弘之
翔泳社


# 読もうと思った動機
スケジュール管理に苦手意識があり改善したいと考えているため



# 印象に残った部分


## p15 プロジェクト失敗に慣れっこになってはいけない
「決められた期間と予算内に狙いどおりの効果をもたらす品質の良いシステムを構築する」
ということは、「プロジェクト」という生き物を相手にするので、難しい側面があるのは確かだ。
業界内にも、納期遅延や予算オーバー、予算の発生などが「仕方のないこと」として暗黙的に認められるような甘い風潮がある。きちんとしたプロジェクト管理をやっていないのにそういうことを失敗の原因とするのは、単なる「言い訳」だと思われても仕方がない。


## p14 プロジェクト管理の３要素
「スケジュール管理」、「コスト管理」、「品質管理」

## p20 ２つのプロセスモデル

### ウォーターフォールモデル
　
プロジェクトをフェーズに区切り、段階的に開発を進めるというものだ。
プロジェクト全体を、基本設計、詳細設計、プログラム設計、プログラミング、単体テスト、結合テストの順で進めるプロセス。
メリットとしては、スケジュールを立てやすい
デメリット：手戻りがあることを想定していない。

### スパイラルモデル
各ラウンド内の作業ステップはウォーターフォールモデルと同じ流れだが、100％完成してから、次のステップに進むのではなく　ある程度の完成度で次のステップに進むプロセス。



## p22 23 プロジェクト計画を立てる
・テンプレートを持つ
　プロジェクトは計画を立てる城で、大切なことは「早く書く」ということだ

・できるだけ早くメンバー全員に目指すゴールを認識してもらうためには　プロジェクトスタート時に書けるところでも書いて、追加　修正するという姿勢が大事なのだ


## P30 プロジェクトの失敗に学ぼう
どうしても、失敗をゼロにすることはできない。
であれば、大切なのは失敗した後の対応対策と言えよう。
情けないのは同じ失敗を繰り返すことだ。
あるプロジェクトで納期遅延したのに次のプロジェクトで同じようにオーバ欄を繰り返してしまう。

## p34 テンプレートを持ち、使用を義務付ける
エンジニアという職種は、職人気質で我流を好む。自己フォーマットは綿密すぎてメンテナンスが大変だと思われるものもあれば、シンプルすぎて「これで何を管理できるのか」と思わせるものもある。
組織として効率化を実現するには、スケジュール表のテンプレートを用意しすべてのプロジェクトで記述管理することである。

## p34 スケジュール表の種類p34-36
### 総合スケジュール
プロジェクト全体のスケジュール。
できるだけ一覧性を重視してまとめることが大切

### 詳細スケジュール
サブシステム毎に作成する
作業内容の詳細設定と進捗管理に使うのは「詳細スケジュール」である。

### 機能別スケジュール
担当者毎の作業管理
プログラム単位の進捗管理に使う。


# 実践できること or 感想

## 感想
・20年以上前の本ですが、実践できる箇所が多く読見応えがありました。
・スケジュール表にも種類があることが勉強になりました。（今まで種類とか意識したことがなかった（汗）
・梅田さんの本は本当にお世話になりますね。販売管理、JSTQBの本も出してて本当に勉強になりますね。

## 実践すること
・過去担当したプロジェクトを思い出して以下資料を作成してみる。
p32 失敗リストチェックリスト
p85 プロジェクト計画書

・個人開発でスパイラルモデルを実践してみる。
競プロ日記#25/04/12

# アルゴ式-[キューを配列で実装](https://algo-method.com/tasks/881dLlu)
- [競プロ日記#25/04/11](https://qiita.com/Gettei/items/ba291fe70fd87f0215a4)で扱ったように結局vectorの方が使い勝手が良い
```
int main() {
   int N,Q; 
   cin >> N >> Q;
   vector<int> A(N,-1);
   int head,tail;
   head = 0;
   tail = 0;

    for (int i = 0;i < Q;i++){
        int n;
        cin >> n;
        if(n == 0){
            int v;
            cin >> v;
            A[tail] = v;
            tail++;
            if(tail == N){
                tail = 0;
            } 
        }
        if(n == 1){
            A[head] = -1;
            head++;
            if(head == N){
                head = 0;
            }
        }
    }
    for (int i = 0;i < N;i++){
        cout << A[i] << endl;
    }

}
```

# アルゴ式-[タスクリスト](https://algo-method.com/tasks/613Zsiv)
- [キューを配列で実装](https://algo-method.com/tasks/881dLlu)の応用
```
int main() {
   int Q; 
   cin >> Q;
   vector<string> A(100000,"");
   int head,tail;
   head = 0;
   tail = 0;

    for (int i = 0;i < Q;i++){
        int n;
        cin >> n;
        if(n == 0){
            string v;
            cin >> v;
            A[tail] = v;
            tail++;
            if(tail == 100000){
                tail = 0;
            } 
        }
        if(n == 1){
            cout << A[head] << endl;
            A[head] = "";
            head++;
            if(head == 100000){
                head = 0;
            }
        }
    }
}
```

# アルゴ式-[貯金計画](https://algo-method.com/tasks/650)
- 公差を求めれば答えは簡単に求められるがこれで良いのか感あった（解説も公差dからX - A*Xしてるのであってた）
- 念のためFocusGold2Bを引っ張ってもっといい求め方ないか考えたが微妙
```
int main() {
    int A,B,X,Y;
    cin >> A >> B >> X >> Y;
    int d = (Y - X) / (B - A);
    cout << X - (A * d) << endl;
}
```

# アルゴ式-[等差数列の和 (1)](http://algo-method.com/tasks/652)
- 高校数学で学ぶ一般的な等差数列の和の導出からやる感じで面白かった。
[解説](https://algo-method.com/tasks/652/editorial)
- オーバーフローを考慮してlong long型で

# アルゴ式-[等差数列の和 (2)](https://algo-method.com/tasks/653)
- 項数N、初項a、公差dの等差数列の和を求める関数を以下の公式を用いて作成すれば
// 公式：S = N * (2a + (N-1)d) / 2
を使えば解説のような末項を使うパターンじゃなくても答えを出せる

```
long long func(long long N,long long a,long long d){
    return N * (2 * a + (N-1) * d) / 2;
}
```
良いコード／悪いコードで学ぶ設計入門 第１０章

# 第10章 名前設計 ―あるべき構造を見破る名前―

ソフトウェア開発において、設計や実装の中核を担う「名前」に対するアプローチとして、「目的駆動名前設計」という考え方が本章では提示されている。これは単なる命名ではなく、名前を設計し、ソフトウェアの構造や意図を明確に表現することを目的とする。

特にビジネス目的に根ざした名前を与えることが、密結合の防止やロジックのカプセル化、可読性の向上に寄与する。UIやDBから逆算して設計を考えるようなアプローチでは、こうした「目的」が入り込む余地がなくなり、設計の柔軟性や拡張性を損なうこともある。

---

## 悪魔を呼び寄せる名前

抽象的で曖昧な名前は、あらゆるロジックを吸い寄せる「目的不明オブジェクト」になりやすい。たとえば、「商品」という言葉に様々な意味を詰め込んでしまうと、実際の業務で必要な「注文品」や「在庫品」といった違いが曖昧になる。関心事ごとにクラスを分離し、それぞれにふさわしい名前を設計することで、影響範囲を限定し、変更にも強くなる。

このアプローチをとるには、開発フェーズにおけるドメイン理解の深さが問われる。特に、ウォーターフォール型のプロジェクトであっても、新しい概念が登場した際には柔軟に名前と構造を見直すべきであり、データベースのリファクタも視野に入れる必要があるだろう。

---

## 名前を設計する ―目的駆動名前設計

プログラミングにおける名前の役割は可読性の確保だけではない。目的に特化した名前によって、疎結合高凝集な設計が可能になる。設計とは「課題を解決するための構造を考えること」であり、名前もその一部として重要な設計要素である。

### 名前設計の原則

- **具体的かつ意味範囲の狭い名前を選ぶ**  
  「金額」よりも「請求金額」「消費税額」といった特化した名前が適している。こうすることで、ロジックの分離や仕様変更への対応がしやすくなる。

- **存在ベースより目的ベースで考える**  
  「ユーザー」や「人」といった存在ベースの名前ではなく、「注文者」「受取人」のような目的に基づいた命名が望ましい。

- **関心事の分析と会話による言語化**  
  チームでの会話の中で意図や目的を擦り合わせることが、自然と分析につながる。実際、プロジェクト初期にこうした議論がなされないまま開発が進むと、仕様の解釈にずれが生じ、曖昧な名前が蔓延することになる。

- **ユビキタス言語の活用**  
  ドメインエキスパートと開発者が共通の言葉を持ち、それをコード・会話・ドキュメントで一貫して使用することが重要。とはいえ、これを維持・運用していくにはかなりの労力が必要である。

- **利用規約の言葉を参考にする**  
  サービスのルールを正確に記述する利用規約は、ビジネス目的に即した名称の宝庫である。普段見逃しがちだが、一度目を通しておくと、設計にも役立つヒントが得られる。

- **類語や表現の検討を怠らない**  
  意味を狭める言い換えができないか常に検討し、「なんとなく」つけた名前が妥当かどうかを問い直す姿勢が求められる。

- **疎結合高凝集の観点から点検する**  
  名前が広義になって結合度が高まっていないか。関連するクラスが増えていないか。これらは設計のメンテナンス性に大きく影響する。

---

## 設計時に注意すべきリスク

- **命名に無頓着にならない**  
  チーム開発において、名前の精度は全体の設計品質に直結する。命名とロジックの対応付けが曖昧になると、保守性も一気に下がる。

- **仕様変更による意味範囲の変化**  
  名前の意味が変更と共に変化したら、名前自体を見直す必要がある。見直しを怠ると、異なる概念が混入し、バグの温床となる。

- **会話に出るのにコードに存在しない名前**  
  重要なドメイン概念が名前として登場しないと、コードを読むだけでは理解できなくなり、属人性が高くなる。名前が存在しないロジックはクラスやメソッドに構造化するべき。

- **形容詞で区別する状況は設計の見直しポイント**  
  たとえば「仮の」「確定した」など、口頭で形容詞を使って区別しているなら、それらを個別のクラスとして分けるチャンス。単なる bool やプリミティブでの管理を避け、構造で違いを表現することで理解しやすくなる。

過去に悩んだ命名の問題も、本章の考え方を知ることで解像度が上がり、言語の選び方に新たな指針が見えた。特に「形容詞を避け、構造で表現する」という点は、今後の設計判断に活かしていけそうである。

---

## 意図がわからない名前のリスク

「tmp」や「cache」といった技術駆動の命名は、意図が読み取れず混乱を招く可能性がある。ただし、目的が明確に技術寄りであれば、技術的語彙も適切に活用してよい。たとえば「productListCache」など、用途と文脈が伝わる名前であれば問題ない。

また、`shouldXxx()` のような命名は、英語的な曖昧さに注意しつつも、意図を明確に伝える良い手段となる。文脈と一貫性を保った命名が重要だ。

---

# まとめ

第10章は、命名に対する意識を「単なる名前付け」から「構造を支える設計行為」へとシフトさせることの重要性を強く訴えていた。名前は可読性のためだけでなく、ソフトウェアの構造や責務、ドメイン知識そのものを表現するものである。

命名をおろそかにすると、密結合やロジックの分散を招き、変更に弱いコードとなってしまう。逆に、ビジネス目的に即した具体的で特化された名前を設計することで、疎結合高凝集を実現し、開発の見通しを大きく改善できる。

現場で起きがちな「曖昧な命名」や「形容詞での説明」などにも明確な改善策が示されており、実務に直結する知見が満載だった。ドメインの深い理解とチームでの対話を通じて、名前を「設計」する文化を育てていくことが、より良い開発体験と成果につながると確信できる内容だった。

---
JP1認定エンジニア V13（HMJ-130E） に合格しました。

# JP1認定エンジニア（V13）合格体験記

## はじめに

Qiitaを含め、JP1認定エンジニアに関する受験体験記はあまり見かけなかったため、感想を中心に情報共有しようと投稿しました。

---

## 受験情報

- **受験時期**：2025年3月上旬  
- **合否結果**：合格（正答率75%）  
- **スキル感**：JP1の使用経験なし。競合製品でのジョブ運用は少し経験あり

---

## 学習内容

### 使用した参考書

- 『IT Service Management教科書 JP1認定エンジニア V13対応』  
  https://www.amazon.co.jp/dp/4798181927

### 学習方法

- 参考書を1周読破  
- 巻末の模擬試験（全4回分）を3周実施

学習期間：7日間（計14時間）で、8日目にテストセンターで受験しました。

参考書では「ジョブ管理（JP1/Automatic Job Management System）」のように製品名が明記されていることが多いのですが、正式名称までしっかり暗記しておくと安心だと思います。

---

## 感想、開発者には正直おすすめしづらい

正直、
**開発や運用を担当するエンジニアにとって、実務的な価値を感じませんでした。**

参考書の記述は「〇〇ができます」といった説明が多く、まるで**有料カタログ**のようでした。コンセプト的にも当然ですが...。

---
- 具体的な設定手順が書かれていない  
- 操作感やUIの紹介はない※ 

（※画面のハードコピーは記載がありますが、実務レベルでの解説はなし。）

実際にJP1を使用するエンジニアは、物足りなさを感じるはずです。

私自身、JP1導入のタイミングでこの資格を取得したため、「何ができそうか」の把握に役立ちましたが、
いざ「ジョブを管理しよう」「画面を操作しよう」となると、この参考書だけでは対応できません。結局はググるか、ベンダーを頼ることになりそうです。

## まとめ

- 約15時間の学習で合格可能  
- 参考書＋受験費用で1万円前後 
- コスパは良好。内容はカタログ的

短期間で取得できる資格としては悪くありませんが、**価値を発揮するのは導入検討フェーズくらい**という印象です。  
若手開発者は、もっと実務に直結する資格に時間を使ったほうが良いかもしれません。

- JP1導入を検討している情シス担当者
- 提案を行う導入ベンダーの営業担当者

　にとっては 「**何ができるか**」をざっくり把握するには有効だと思います。


---

批判的に書いてしまいましたが、私自身はJP1導入の担当者として受験し、
少ない時間でざっくりポテンシャルを把握できたことは良かったと感じています。
Redis(Valkey)でお店にいる人の数を数える

## Valkeyとは

Valkeyは、オープンソース（BSD）の高性能キー/バリュー型データストアです。

https://valkey.io/blog/introducing-bloom-filters/

## なぜ、インメモリなのか。なぜ、Valkeyなのか

- インメモリは、コストに対するリソース&コスト効率が高い
- インメモリで人気があったのはRedisだが、Valkeyのほうがより安価かつAWSの影響が大きいValkeyを推奨

## 実際にやってみよう-イメージ図：ショップにいる人は何人ですか？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/161516/efc8773b-ff86-44f1-bf3f-71fada3cbe1c.png)

## セットアップ

手っ取り早く開始するためには、dockerをお勧めします。

### 宣伝：dockerはどうやってインストールすればいいんだっけ？

下記の記事をご利用ください。

https://qiita.com/KO_YAmajun/items/41ea85d30f143b25135c

準備が整ったら、下記のコマンドで開始する

```bash
docker run -d --name valkey -it --rm  valkey/valkey:latest
docker exec -it valkey valkey-cli
```

## REDIS

### 初期状態

朝、顧客はいませんでした。

```
127.0.0.1:6379> ZMSCORE STORE_1 "CUSTOMER1" "CUSTOMER2" "CUSTOMER3"
1) (nil)
2) (nil)
3) (nil)
127.0.0.1:6379> ZCARD STORE_1
(integer) 0
```

### 追加とカウント

朝、一人の顧客が来ました

```
127.0.0.1:6379> ZADD STORE_1 GT 202404120000 "CUSTOMER1"
(integer) 1
127.0.0.1:6379> ZMSCORE STORE_1 "CUSTOMER1" "CUSTOMER2" "CUSTOMER3"
1) (double) 202404120000
2) (nil)
3) (nil)
127.0.0.1:6379> ZCARD STORE_1
(integer) 1
```

### 値の更新

また次の日、一人の顧客が来ました。前回と同一人物だったので、値を上書きます。

```
127.0.0.1:6379> ZADD STORE_1 GT 202404110000 "CUSTOMER1"
(integer) 0
127.0.0.1:6379> ZMSCORE STORE_1 "CUSTOMER1" "CUSTOMER2" "CUSTOMER3"
1) (double) 202404120000
2) (nil)
3) (nil)
127.0.0.1:6379> ZADD STORE_1 GT 202404130000 "CUSTOMER1"
(integer) 0
127.0.0.1:6379> ZMSCORE STORE_1 "CUSTOMER1" "CUSTOMER2" "CUSTOMER3"
1) (double) 202404130000
2) (nil)
3) (nil)
```

### 別の値をカウントする

二人目の顧客が来ました

```
127.0.0.1:6379> ZADD STORE_1 GT 202404130000 "CUSTOMER2"
(integer) 1
127.0.0.1:6379> ZMSCORE STORE_1 "CUSTOMER1" "CUSTOMER2" "CUSTOMER3"
1) (double) 202404130000
2) (double) 202404130000
3) (nil)
127.0.0.1:6379> ZCARD STORE_1
(integer) 2
```

### 特定のレンジの値だけをカウントする

20240414にいたお客は何人でしょうか？

```
127.0.0.1:6379> ZMSCORE STORE_1 "CUSTOMER1" "CUSTOMER2" "CUSTOMER3"
1) (double) 202404130000
2) (double) 202404140000
3) (nil)
127.0.0.1:6379> ZCOUNT STORE_1 202404140000 Inf
(integer) 1
127.0.0.1:6379> ZCOUNT STORE_1 202404140001 Inf
(integer) 0
```

### 値を消す

お客様が帰ってしまいました。

```
127.0.0.1:6379> ZREM STORE_1 "CUSTOMER1"
(integer) 1
127.0.0.1:6379> ZMSCORE STORE_1 "CUSTOMER1" "CUSTOMER2" "CUSTOMER3"
1) (nil)
2) (double) 202404140000
3) (nil)
```

### 値のクリーニング

4/14は終わりました。全員顧客がいなかったので、古いデータを消しましょう

```
127.0.0.1:6379> ZMRANGEBYSCORE STORE_1 202404140000 202404150000
(integer) 1
127.0.0.1:6379> ZMSCORE STORE_1 "CUSTOMER1" "CUSTOMER2" "CUSTOMER3"
1) (nil)
2) (nil)
3) (nil)
```

# 参考文献

## [公式docs]コマンド関連


### 要素の追加・削除・カウント

https://valkey.io/commands/zadd/

https://valkey.io/commands/zrem/

https://valkey.io/commands/zcount/

### メンテナンスその他

https://valkey.io/commands/hello/

https://valkey.io/commands/zremrangebyscore/
LightsailのDBが急に「アップグレード中」になり接続できなくなった

## 結論
あなたのバージョンはサポート対象外だから、アップグレードしとくね😘

> Q. Amazon RDS DB のエンジンバージョンが廃止されるとどうなりますか?
A. Amazon RDS でデータベースエンジンのマイナーバージョンが廃止される場合、発表から自動アップグレード開始まで 3 か月の期間が設定されます。この期間が終了すると、廃止されるマイナーバージョンを実行しているすべてのインスタンスには、スケジュールされたメンテナンスウィンドウ内に、サポート対象となっている最新のマイナーバージョンへの自動アップグレードスケジュールが設定されます。

引用 [AWS よくある質問](https://aws.amazon.com/jp/rds/faqs/)





## 対策
MySQLのバージョンがAWSで[サポート](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/MySQL.Concepts.VersionMgmt.html)されているか確認しましょう。
サポートが切れている場合は、アップグレード執行日時が設定されます。

:::note warn
lightsailのコンソールには表示されないので、ご注意ください😊
:::

アップグレード執行日時は、AWS CLIで確認できます。
```
~~~
"pendingMaintenanceActions": [
    {
        "action": "db-upgrade",
        "description": "Automatic minor version upgrade to mysql 8.0.40",
        "currentApplyDate": "2025-04-18T04:40:00+09:00"
    },
],
~~~
```
1. [AWS CLIの設定](https://docs.aws.amazon.com/en_us/lightsail/latest/userguide/lightsail-how-to-set-up-and-configure-aws-cli.html)
1. [ポリシーの追加](https://docs.aws.amazon.com/ja_jp/lightsail/latest/userguide/amazon-lightsail-managing-access-for-an-iam-user.html)
1. コマンド実行
`aws lightsail get-relational-databases`


## 最後に
lightsailで本番運用が2年も続くと思わなかった😘
ChatGPT への口頭試問（GPS・衛星測位）

こんにちは。
ChatGPT へ、今回は GPS・衛星測位に関する口頭試問を行いました。問答を繰り返すと、より正確な答えへ近づくと感じました。

その今回の私の質問文だけを順に並べますと：

1. GPS・衛星測位の原理を光円錐の表現を用いて説明してください。
1. 「地上受信機の位置と時刻」の部分については「時刻」ではなく「受信時刻」とすると、より正確です。
1. それらを数式的にも視覚的にも説明して下さい。
1. t は未知数であり、「受信機の内部クロックでの受信時刻を t とします」は不正確ですので、「受信機での受信時刻を未知数 t とします」が正確です。
1. 御回答中の「（疑似距離）」は不正確ですので消去して下さい。また慣性系に基づく説明である旨を付加してください。さらに補記として、実用上は、光円錐の歪みが大気圏伝播中に生じ、修正項が必要と加えてください。
1. 正確に言うと、「光円錐が理想形から歪む」原因は、「大気圏による遅延」と「地球の重力による僅かな一般相対論効果」の二つのみです。
1. その視覚図を生成してください。
1. 頂点（発信点）近傍ではなく、地球への到達の近傍で歪みます。
1. 丁寧な御回答を頂き有難うございました。

* ご参考：

https://qiita.com/kkdd/items/d19a2366981e5e2eeeca

https://qiita.com/kkdd/items/0cef615445d41d1fa669
AIに信頼を与える」時代へ：企業と政府のリアルな挑戦



### ✅ 信頼できるAIとは何か？

信頼できるAIとは、単に「動くAI」や「高精度なAI」ではなく、**倫理的で、安全性が高く、説明可能かつ公正であるAI**のことです。  
欧州委員会はすでに2019年の時点で、以下の7つの要件を提示しています：

1. 人間の介在と監視  
2. 技術的堅牢性と安全性  
3. プライバシーとデータ管理  
4. 透明性  
5. 多様性・非差別・公平性  
6. 社会的・環境的福祉  
7. アカウンタビリティ（説明責任）

---

### 🏛 政府レベルの取り組み

#### 🇪🇺 欧州：AI法（AI Act）の策定
- 高リスクAIを分類・規制  
- 不正確な顔認識や差別的スコアリングの制限  
- 罰則：最大で年間売上の6%という厳格な制裁

#### 🇯🇵 日本：AI戦略2022・生成AIガイドライン（経産省）
- 「人間中心のAI」を掲げ、企業のガバナンス強化を支援  
- 生成AI時代における「偽情報」「著作権」「差別的出力」への対策を明示  

#### 🇺🇸 米国：AI権利憲章（Blueprint for an AI Bill of Rights）
- 偏見のないアルゴリズム開発と、AI利用者への説明責任を重視

---

### 🏢 企業の取り組み：での現場体験より

では、**AI Principles（AI原則）**に基づいて開発プロセス全体が構築されています。  
以下は、私が携わったプロジェクトでの実践例です：

#### ① 説明可能性（Explainability）への挑戦
- **医療用AIモデル**において、画像診断の「なぜこの判断か？」を示すために**Grad-CAMやAttention Map**を導入。
- 医師との共同レビューを通じて、AIの信頼性と納得感を向上。

#### ② 差別の回避（Fairness）
- 音声認識モデルにおいて、特定のアクセントや性別・年齢での**誤認識率の差異**を分析。
- データ収集段階から多様性を確保し、Fairness Indicatorsを継続モニタリング。

#### ③ データプライバシーと匿名化
- スマートホーム製品では、オンデバイス処理と差分プライバシー技術を併用し、個人情報を外部に出さずに学習。

---

### 🔎 現場で学んだ「信頼されるAI開発」の３つの真実

1. **精度が高い ≠ 社会に受け入れられるAI**  
　→ ユーザーは「なぜそう判断したのか」を理解できないAIを**本能的に不信感**で見る。

2. **多様な視点を設計段階から取り入れる必要性**  
　→ エンジニアだけで完結せず、**倫理学者、法律家、ユーザー代表**と共創することが鍵。

3. **TrustはUX（ユーザー体験）の一部**  
　→ 「透明性」や「フィードバック機能」をプロダクトに組み込むことが、信頼につながる。

---

### 🌐 業界横断の連携が次のステージ

今後は、政府・企業・学術界・市民が連携した**「AI信頼性エコシステム」**の構築が不可欠です。

#### 期待される動き：
- **オープンな監査可能性**（AI Auditability）の枠組み  
- **第三者検証機関**の創設（AI版ISO）  
- **国際的な基準の調和**（G7やOECDを中心に）

---

### ✍️ まとめ：信頼されるAIは「社会との対話」から生まれる

技術だけでなく、**社会的価値観・透明性・多様な声**が反映されたAIこそが、本当に「信頼されるAI」です。  
私たち開発者一人ひとりが、「コードの向こうに人がいる」ことを忘れずに設計していく責任があります。



ご希望があれば、このシリーズを続けて記事化したり、YouTubeやポッドキャスト用に構成を変えることも可能です！やってみたい形式があればぜひ教えてください！
AIの判断に“なぜ”を問う時代へ：透明性と説明可能性のリアル





### ✅ AIの「説明責任」は技術課題であると同時に、社会課題でもある

AIが出した予測や判断に対して、**「なぜそう判断したのか？」**という問いに答える力――それが「説明可能性」です。  
透明性とは、AIが何をどう処理し、どのような前提を持って判断を行っているかを**人間が追跡・理解できる状態**を指します。

この2つは、特に以下のような分野で極めて重要です：

- 医療診断  
- 自動運転  
- 金融リスク分析  
- 採用AI・スコアリングシステム  
- 司法判断補助ツール

---

### 👩‍⚕️ 医療AIの実例：説明できないAIは“怖い”

私が過去に取り組んだ**がん診断支援AI**の開発では、初期段階でモデルの精度は非常に高く、医師チームからも期待されていました。  
しかし、ある時点で「**なぜこの患者が“陽性”と判断されたのか、説明できない**」という大きな課題に直面しました。

結果的に、精度よりも**説明可能性のなさ**が原因で、臨床試験の承認が下りませんでした。  
この経験から学んだのは、**「信頼性＝精度の高さ」ではない**という事実です。

---

### 🛠 現場で活きたXAI（説明可能なAI）の技術

私たちが実装してきた中で有効だった説明技術を3つ紹介します。

#### 1. LIME（Local Interpretable Model-agnostic Explanations）  
- モデルに依存せず、**各予測に対する特徴量の影響度を局所的に可視化**  
- 実務では「この患者の画像で、どの領域がリスク判定に影響したか」を視覚的に提示可能

#### 2. SHAP（SHapley Additive exPlanations）  
- 特徴量の貢献度を**ゲーム理論的に公平に計算**  
- 金融業界の信用スコアAIなどで透明性担保に有効

#### 3. Counterfactual Explanations（反事実的説明）  
- 「もしこの変数が〇〇だったら結果は変わっていたか？」を提示  
- 採用・ローン審査など、個人にフィードバックを与える文脈で強力

---

### 📉 説明可能性が“ない”ことによるリスク

1. **コンプライアンス違反**（EUのAI Act、GDPRの「説明を受ける権利」）  
2. **バイアスの温床**（例えば性別や人種による判断偏り）  
3. **ユーザー不信・導入拒否**（現場の医師・エンドユーザーからの拒絶）

とくに最近では、**「AIによる判断はブラックボックスだから信じない」**という企業も多く、説明可能性の有無は**採用率・導入速度に直結**しています。

---

### 🧠 個人としての気づき：なぜ私たちは「説明」にこだわるべきか？

AIエンジニアの視点で言えば、**説明性は開発コストが増す要素**でもあります。  
しかし、私は次のように考えています。

> 「**説明できないAIは、科学ではなく魔法だ。**」  
> ― AIが社会インフラとなる今、その“魔法”を取り除く責任は、私たち開発者にある。

**信頼できるAI**とは、透明で、説明ができて、間違った時に正せるAIです。

---

### 🚀 今後への提言

- 初期設計段階から**XAIを設計に組み込む**
- エンドユーザーにとって「分かりやすい説明」を目指す（エンジニア用の専門用語で終わらせない）
- 自律的なAI判断が行われる領域では、**必ず「説明責任レイヤー」を持つ**
useEffectの２回レンダリングを抑えるには

ReactでuseEffectでマウントを行おうと思った時に２回useEffectが実行されたことはありませんか？

今回はその問題を解決する方法を探そうと思います。

# useEffectとは
Reactコンポーネントを外部システムと同期させるためのHooksです。

https://ja.react.dev/reference/react/useEffect

:::note
### Hookとは
Reactに標準で使えるようにされているstateやrefなどをクラスを書かずに使えるようになります。
:::


外部との通信は副作用(サイドエフェクト)と呼ばれます。

Reactは純粋関数で実装することが定説となっています。
そのためコンポーネント関数は、あるprops(入力)に対して、予測可能なJSXが返ってくるようになっています。

しかし、外部のシステム、例えばAPIを叩いてリソースを取得してDOMを構築するとなるとAPIから何が返ってくるか等はReactアプリケーションのコードだけでは予測できません。

そのため、予測できない動作である副作用を引き起こす`useEffect`はあまり使い回さないようにすることが推奨されています。

# マウントとは
Reactを使ったブラウザの描画において、必要なコンポーネントのインスタンスとDOMノードの作成、それらをDOMを挿入するプロセスを`マウント`と言います。
簡単にいうとコンポーネントの初期化、コンポーネントを最初に描画することになるページの遷移時における描画プロセスのことを`マウント`と言います。

Reactのライフサイクルには、マウント、更新、アンマウントの3種類があると言われています。

|ライフサイクルの種類|トリガー
|---|---
|マウント|コンポーネントの初期化
|更新|propsやstateの更新
|アンマウント|コンポーネントの破棄

useEffectを行うとこれらをまとめて行うことができるようになります。

# useEffectが2回行われる理由
ReactにはStrictModeと呼ばれる機能があります。

https://ja.react.dev/reference/react/StrictMode

StrictModeがオンになっているとマウントが2回行われるようになっています。

これはアプリケーションの潜在的なバグを見つけるために開発環境ではデフォルトでオンになっています。

StrictModeをオフにすることも可能ですが、毎回プロジェクトの立ち上げごとにオフにするのもめんどくさいと思うのでStrictModeがオンの状態でも問題ないコードを書くべきだと思います。

# useEffectが2回行われないようにするには
クリーンアップ関数をうまく使うことで2回マウントを実行されることを防ぐことができます。

下のようにすることで一度マウントすることでignoreがtrueになり、一度しか実行できなくなります。
```tsx
let ignore = false;
useEffect(() => {
  async function startFetching() {
    const json = await fetchTodos(userId);
    if (!ignore) {
      setTodos(json);
    }
  }

  startFetching();

  return () => {
    ignore = true;
  };
}, [userId]);
```