OmniAICreator/Qiita-1.07M huggingface dataset:
生成AIに仕事を奪われると恐れる若手プログラマーへ


このポッドキャストが、あなたの不安を和らげる処方箋になるかもしれません。
https://open.spotify.com/episode/42WwVydvgCO0dWvAfn6nin?si=fanlnSE6RpeQ6VJjyvrphA

---

## 📌 3行まとめ

- **技術の賞味期限は約8年**（歴史的に見ても8年ごとに主流が変わる）
- **生成AIの有無にかかわらず、今の技術が将来も食えるとは限らない**
- **「今」プログラマーとして価値を出せることに集中しよう**

---

## 💭 雑感

### 技術の賞味期限は8年

序盤では、覇権を握った技術でも約8年で賞味期限が切れたというkarino2さんの体験が語られます。例えばWindowsのGUIプログラムやSpring以前のサーバーサイドJavaなど。

中盤以降では、

- **賞味期限が切れた技術では価値を出しにくい**
- **次に来る技術を予測するのはリターンが少ない**

といった話が展開されます。

特に、若手プログラマーは技術の賞味期限を経験していないため、「今使っている技術に終わりが来る」という感覚がわからず、不安になりがちだという指摘は鋭いですね。


### 未来の技術を予測する難しさ

「次に来る技術」を予想するのは難しいという話もごもっともだと思いました。でも、いろいろ試しておくと、将来役に立つことがあると。この話はポジティブだと思いました。点と点がつながる体験は、すごくいい成功体験になりますよねj

興味がある技術には、どんどん触れていくべきだと感じました。

### 例外的に賞味期限が長い技術

一部の技術は異様に長い寿命を持っています。
例えば、
- **Unix**
- **HTML, CSS, JavaScript**

「HTMLなんて今どき書かない」と思うかもしれませんが、ReactやSvelteも本質的にはHTML, CSS, JSのラッパーです。

こうした長寿命の技術の基礎ができていると応用が利くので、学ぶコスパが良いと改めて感じました。

---

# 生成AIに関する私の意見
ここからはPodcastの感想ではなく、私見です。

## 🤖 生成AIが仕事を奪うのか？

完全ブラックボックス開発で生まれたプロダクトが社会で通用するようになれば、コーディングという仕事は不要になるでしょう。しかし、10年後にAIがそこまで進化しているかというと、そうは思えません。

これはAIの問題というよりも、人間側のルールが整えられなかったりや文化的に受け入れられないことがボトルネックになるのではないかと想像しています。

ただ少なくとも10年後の仕事の仕方は今と全然違うと思います。
パンチカードを使っていたり、とにかくメモリの節約を優先してプログラミングしていたり、そういった時代が過去にあったのと同じように、今の仕事は未来から見たら「そんな仕事してたんですね...」と言われるでしょう。

~~あわよくば仕事しないでいい世界にしてくれ~~

---

## 🎯 「プログラマー」というアイデンティティ

「AIに仕事を奪われるのでは？」と恐れるのは、ソフトウェア開発という仕事にアイデンティティを感じているからだと思います。

それなら、そのアイデンティティを持てる幸せを味わいながら、日々を過ごすのが素敵なプログラマーライフではないでしょうか。

> **今、賞味期限がまだ来てないことをやって、それですごい価値を生み出す方がいいと思いますと。それしかやれることは無いと思うんですよね。プログラマーっていうのは。**
— karino2
kotlinのList<T>.fastZip()ってなんぞ？（個人的な覚書）

とりあえずの覚書です。

```kotlin:イメージ
import androidx.compose.ui.util.fastZip

～省略～

    val hogeHogeList = listOf("テスト", "TEST", "1要素多い")
    val hugaHugaList = listOf("です～！", "だお(・ω・)")
    hogeHogeList.fastZip(hugaHugaList) { hoge, huga ->
        println(hoge + huga)
    }
```
↓実行結果↓
```
テストです～！
TESTだお(・ω・)
```
↑要素数が少ないhugaHugaListの長さに合わせるため、hogeHogeListの"1要素多い"の分は出ない



- zipってのが、要素数が少ない方のListに要素数を合わせてくれるやつ
    - [IndexOutOfBoundsException](https://docs.oracle.com/javase/jp/7/api/java/lang/IndexOutOfBoundsException.html)が起きないため、安全に処理ができる
- .mapだと1つの引数（「{ hoge, huga ->」←ココ）で1つのListの要素しか使えないが、.fastZipを使うと、ラムダ式で2つのListの要素を使うことができる

![2025-02-20_00h34_03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2330584/3a4917f9-1e29-4517-909f-4ab25d06c962.png)

# 参考サイト

https://zenn.dev/airiswim/articles/b9748acace6df2

https://kotlinlang.org/api/core/kotlin-stdlib/kotlin.collections/map.html

https://kotlinlang.org/api/core/kotlin-stdlib/kotlin.collections/zip.html

https://kotlin-study.com/lambda-expressions/
> ラムダ式の書式
ラムダ式の書式は以下のようになります。
```{ 引数 -> 関数の本体や処理内容 }```

https://qiita.com/Nabe1216/items/8c574e06ea96a6a7598d

https://qiita.com/Molly95554907/items/c221331457690f541524
Raspberry PiでのTime Machineバックアップ：複数メディアのローリング運用のすすめ

![DALL·E 2025-02-20 00.41.36 - A hand-drawn style illustration depicting a Raspberry Pi connected to an external SSD for Time Machine backups. The Raspberry Pi is shown with a netwo_opt.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184128/0dbb55fe-269a-4bfd-a63e-2cb8fb095906.jpeg)

## はじめに（背景）

自宅のRaspberry Piに外付けSSDを接続し、OpenMediaVault（OMV）でTime Machineバックアップ環境を構築しました。OMVはNASサーバーを簡単に構築できるLinuxディストリビューションです。しかし1年ほど運用したところ、バックアップが「準備中」のまま進まなくなってしまいました。この問題を解決するため、様々な対策を試みました。

## まず結論：現時点でのベストの対応

以下の対応で問題が解決しました：

### 1. 問題の特定

- スパースバンドル（sparsebundle）の破損が主要な原因と判明
- バックアップが「準備中」の状態で進まない
- 既存のスパースバンドルの修復が困難

### 2. 現在のベストな対応策

- 複数の外付けメディアをローリング方式で使用
- 問題発生時はデータを用いてTime Machineに入れるかを検証
- 検証後、新しいメディアでバックアップを新規に再開

## やってダメだったこと

下記を実施しましたが、どれもダメでした。

### 1. Raspberry PiおよびOMVのアップデート:

- `sudo apt update`および`sudo apt full-upgrade`コマンドを用いてRaspberry PiとOMVのシステムを最新の状態に保つ試みを行いました。しかし、これにより一時的な改善は見られたような気がしたものの、根本的なバックアップ問題は解決しませんでした。

### 2. SAMBA設定の調整:

- Time Machine用のSMB設定（`fruit:time machine = yes`や`vfs objects = catia fruit streams_xattr`）を再確認・再設定しましたが、これらの調整だけではバックアップの安定化には至りませんでした。

### 3. 各レイヤーでの修復試行:

- 物理ディスクレベル: S.M.A.R.T.情報の確認とディスクの健全性チェック
- ファイルシステムレベル: `fsck_apfs`コマンドによるAPFSファイルシステムの整合性チェックと修復
- スパースバンドルレベル: `hdiutil verify`コマンドによるイメージファイルの検証
   これらの異なるレイヤーでの修復を試みましたが、いずれの方法でも問題を根本的に解決することはできませんでした。

### 4. 別のSSDでの検証:

- 外付けSSDの物理的な健康状態を確認するため、別のSSD（SanDisk PortableSSD 2TB）を使用し、既存のスパースバンドルファイルを複製して継続バックアップを試みましたが、スパースバンドルの複製では問題が解決せず、ゼロからの新規バックアップの方が安定して動作することが判明しました。


## Time Machineバックアップの長期運用における問題点と今後の運用の方向性

スパースバンドルはTime Machineのバックアップ方式として非常に便利ですが、以下の理由により破損しやすい特徴があります：

### 1. バンドル構造の複雑さ

- 多数の小さなファイル（バンドル）で構成される複雑な構造
- 各バンドルファイルの整合性管理が必要
- 一つのバンドルの破損が全体に影響する可能性

### 2. ネットワーク転送時の脆弱性

- ネットワーク接続の不安定さによるデータ転送の中断
- 転送中の予期せぬ切断によるファイル破損
- 特にWi-Fi接続での信頼性の低さ

### 3. 長期使用による劣化

- メタデータの肥大化
- ファイルシステムの整合性低下

これらの要因が重なり、スパースバンドルの破損は比較的頻繁に発生し、一度破損すると修復が困難になります。今回もこれらの要因が複合的に作用してバックアップ失敗を引き起こしたと考えられます。

今回のケースでは物理メディアの問題にたどり着くまでに時間がかかりました。ネットワーク設定やSAMBAの調整、OSのアップデートなどの問題である可能性をつぶしていたからでもありますが、いちばん大きな理由は、バックアップデータは数百GBから数TBと大容量なため、1回の検証に時間がかかることです。原因を特定して解決するまでに、かなりの時間を無駄にしてしまいました。Time Machineバックアップを使う場合は、うまく動かなくなってきたら、早く諦めてバックアップメディアを交換し、複数のメディアをローテーションで使う、というシンプルな方法が実用的、との結論に至りました。

## おわりに

Raspberry PiとOpenMediaVaultによるTime Machineバックアップでは、スパースバンドルの破損が最大の課題であることが分かりました。この問題に対しては、以下の対策が有効です：

- 複数の外付けSSDをローテーションで使用
- バックアップの不具合が出始めたら、早めに新しいメディアへ切り替え
- 定期的なバックアップの動作確認

この結論は、2013年頃からの10年以上にわたるTime Machineバックアップの運用経験から得られた知見です。この間、外付けHDDやNAS、Raspberry Piなど様々なプラットフォームでTime Machineバックアップ体制を構築し、その都度技術的な解決を試みてきましたが、テクニカルに問題解決を図るより、運用面での対処が現実的ではないかという判断に至りました。特に最近の1年8ヶ月は、OpenMediaVaultでの実装に焦点を当てて検証を重ねてきました。

Time Machineバックアップは「うまく動かなくなってきたら、早めに新しいメディアに切り替える」というシンプルな運用で十分そうです。技術的な解決にこだわりすぎて時間を無駄にするより、複数のSSDをローテーションで使う方が、実用的だと考えるようになりました。
F#でHaskellのgroupぽいものを作る

# はじめに
HaskellのData.Listライブラリには関数"group"があります。この関数は、リスト内の隣接してる値が同じ場合、隣接した同じ値でリストにまとめてくれます。
この関数をF#でも使いたいなと思い作成したものをメモとして載せときます。

# コード
```fsharp

let rec group (list: seq<'a>)  =
    match Seq.toList list with
        | [] -> []
        | x::xs ->
            let head = x :: List.takeWhile ((=) x) xs
            let tail = List.skipWhile ((=) x) xs
            head :: group tail

```

# 実行結果
```fsharp
group "abbccca" |> printfn "%A"
//実行結果: [['a']; ['b'; 'b']; ['c'; 'c'; 'c']; ['a']]
group [1;2;2;3;3;3;1] |> printfn "%A"
//実行結果: [[1]; [2; 2]; [3; 3; 3]; [1]]
group [|1;2;2;3;3;3;1|] |> printfn "%A"
//実行結果: [[1]; [2; 2]; [3; 3; 3]; [1]]
```
VSCodeの左下のボタンの色を変えたい！

## まずはじめに
VSCodeの左下のボタンってなんぞ？って感じだと思いますが、リモートウィンドウを開くためのボタンのことです！

↓↓↓これの青いところ↓↓↓
![スクリーンショット 2025-02-19 23.55.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2605527/50f6bada-db29-449c-bf83-a40113550070.png)

これVScodeでは青色がデフォルトで設定されてるんですよね。自分は業務ではCursorを使ってるんですが、Cursorの文字の配色が好きでCursorではこのボタンが紫っぽい色で好きでした。
なのでVScodeでもCursorと同じ配色テーマ(Anysphere Dark)に設定したんですけど、ここのボタンの色だけ変わらなくて色々調べてみた結果変えることができたので、備忘録もかねて記事にしました^^

## やり方
1. まずVScodeでsettings.jsonを開きます。(settings.jsonの開き方は[こちら](https://qiita.com/y-w/items/614843b259c04bb91495)を参考にしてみてください)
1. settings.jsonに以下のコードを書く
    ```settings.json
    "workbench.colorCustomizations": {
            "statusBarItem.remoteBackground": "#784B84",
            "statusBarItem.remoteForeground": "#ffffff",
        }
    ```
1. 以上！簡単ですね^^

ちなみに`Background`が背景色で`Foregroud`がボタン内の`>` `<`の色のところですね

簡単にできるので試してみてください

完成系
![スクリーンショット 2025-02-20 0.21.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2605527/35d702c5-c66a-429e-8b90-ee57f1f5905f.png)


## 余談ですが
この好きな配色をさがす旅をしていた時に友達のエンジニアと配色テーマの好みが違いすぎて面白かったです^v^
よければ好きな配色テーマやこのボタンの配色だったりエディタのこだわり設定があればコメントしてくれるとうれしいです！

素敵なhappy hackig life を！
【git】リモートにプッシュできなくなった

リモートにプッシュしようとしたらこんなエラーが、、、
```
% git push origin develop
remote: Permission to hm/dividend-manager.git denied to h-0308.
fatal: unable to access 'https://github.com/hm/dividend-manager.git/': The requested URL returned error: 403
```

githubのアカウント2つ持ってるんだけどそのせいかな。
h-0308は別のアカウントです。

ChatGPTに聞いてみるとこのコマンドでGithubの認証情報をGitのキャッシュから削除できるみたい。
```
echo url=https://github.com | git credential reject
```

その後
```
git push origin develop
```
で無事リモートにプッシュできました。
ユーザ名とパスワード求められたのですが、その対応方法は別記事にあげます。

ありがとうございました。
Spring Menu Manager - Spring Boot用のシンプルなメニュー管理ライブラリ

# Spring Menu Manager - Spring Boot用のシンプルなメニュー管理ライブラリ

## はじめに

Spring Bootアプリケーションでナビゲーションメニューを簡単に管理できるライブラリ「Spring Menu Manager」を紹介します。

## 主な機能

- 階層構造のメニュー管理
- RESTful APIによる操作
- H2データベースによるデータ永続化
- Flywayによるマイグレーション管理
- Spring Boot 3.2.2との完全な互換性

## 必要条件

- Java 17以上
- Gradle 8.5以上
- Spring Boot 3.2.2

## セットアップ方法

### Gradleの設定

```groovy
repositories {
    maven {
        url = uri("https://maven.pkg.github.com/shizuya-aishima/spring-menu-manager")
    }
}

dependencies {
    implementation 'com.github.shizuya-aishima:spring-menu-manager:0.0.1-SNAPSHOT'
}
```

### アプリケーションの設定

```java
@SpringBootApplication
@ComponentScan(basePackages = "com.github.shizuyaaishima.menu")
@EntityScan(basePackages = "com.github.shizuyaaishima.menu.entity")
@EnableJpaRepositories(basePackages = "com.github.shizuyaaishima.menu.repository")
public class YourApplication {
    public static void main(String[] args) {
        SpringApplication.run(YourApplication.class, args);
    }
}
```

## API仕様

### 主要エンドポイント

- `GET /api/menu`: 全メニュー項目の取得
- `GET /api/menu/root`: ルートメニュー項目の取得
- `GET /api/menu/sub/{parentId}`: サブメニュー項目の取得

### レスポンス例

```json
[
  {
    "id": 1,
    "name": "ホーム",
    "url": "/",
    "displayOrder": 1,
    "parentId": null,
    "icon": "home",
    "enabled": true,
    "createdAt": "2024-02-20T10:00:00",
    "updatedAt": "2024-02-20T10:00:00"
  }
]
```

## データベース構造

### menu_items テーブル

| カラム名 | 型 | 説明 |
|----------|------|------|
| id | BIGINT | 主キー |
| name | VARCHAR(255) | メニュー項目名 |
| url | VARCHAR(255) | リンク先URL |
| display_order | INT | 表示順序 |
| parent_id | BIGINT | 親メニューのID |
| icon | VARCHAR(255) | アイコン名 |
| enabled | BOOLEAN | 有効/無効フラグ |
| created_at | TIMESTAMP | 作成日時 |
| updated_at | TIMESTAMP | 更新日時 |

## 開発者向け情報

### ビルドとテスト

```bash
# ビルド
./gradlew build

# テスト実行
./gradlew test

# コード品質チェック
./gradlew spotlessCheck
./gradlew pmdMain pmdTest
./gradlew jacocoTestReport
```

### サンプルアプリケーション

```bash
./gradlew :menu-sample:bootRun
```

## まとめ

Spring Menu Managerは、Spring Bootアプリケーションにおけるメニュー管理を簡単に実現できるライブラリです。階層構造のメニュー管理やRESTful APIの提供、データベースマイグレーションなど、必要な機能が揃っています。

## 参考リンク

- [GitHub リポジトリ](https://github.com/shizuya-aishima/spring-menu-manager)
- [サンプルアプリケーション](https://github.com/shizuya-aishima/spring-menu-manager/tree/main/menu-sample)

## ライセンス

MIT License

---

タグ: `Java` `Spring Boot` `ライブラリ` `メニュー管理` `データベース`
【jest エラー】Configuration error: Could not locate module ./App.css mapped as: identity-obj-proxy.

# はじめに
jestでテスト実装中に以下のエラーが出ました。

# 問題
```plaintext: エラーメッセージ
Configuration error:
    
    Could not locate module ./App.css mapped as:
    identity-obj-proxy.
    
    Please check your configuration for these entries:
    {
      "moduleNameMapper": {
        "/\.(css|less)$/": "identity-obj-proxy"
      },
      "resolver": undefined
    }
```
![スクリーンショット 2025-02-19 23.28.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3775597/1cab2a84-97f9-416b-9f3f-98de64d3f86c.png)

# 解決方法
```plaintext: 以下コマンドを実行
// テスト実行時のスタイルファイル（CSS/SCSS/LESS）をモック化するためのパッケージを追加
npm install --save-dev identity-obj-proxy
```
```diff_javascript: jest.config.js
export default {
  preset: "ts-jest",
  testEnvironment: "jsdom",
  setupFilesAfterEnv: ["./jest.setup.ts"],
  transform: {
    "^.+\\.(ts|tsx)$": "ts-jest",
  },
  moduleNameMapper: {
    "\\.(css|less|scss)$": "identity-obj-proxy", //scssを追加
  },
};

```

# おわりに
テスト実行時のスタイルファイル（CSS/SCSS/LESS）をモック化するためのパッケージがないために起きたエラーでした。

今回は記事を見つけることができなかったのでCopilotに`@workspace`でエラーについて聞くと一瞬で解決できました。
【Shell】標準出力と標準エラー出力を次のコマンドに渡す方法

以下のように記述すると標準出力と標準エラー出力を次のコマンドに渡せます。

```sh
some_command 2>&1 | next_command
```

zshの場合以下のようにも記述できます。

```shell
some_command |& next_command
```

fishの場合以下のようにも記述できます。

```shell
some_command &| next_command
```
「目的を持った資格取得には価値がある」と信じたい。

# 入社月に3つの資格を取ってから考えたこと。

昨年の11月に転職し、あるITコンサル企業に中途入社しているのですが、
入社してから取得推奨資格にMicrosoft認定資格があることを知り、入社月に3つ取りました。
ちなみに前職では基本的なWord,ExcelなどのMicrosoftツールしか使ったことしかなく、
エンジニアでもありませんでした。

取得した資格は以下です。
（本記事ではこれらがどんな資格か〜とかどんなふうに勉強したか〜とかは省略します。）

- Microsoft Certified: Azure Fundamentals (AZ-900)
- Microsoft Certified: Power Platform Fundamentals (PL-900)
- Microsoft Certified: Azure AI Fundamentals (AI-900)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3780099/b175c4b5-1daa-45e9-a841-e995fd78e2f2.png)


一応Credyプロフィールリンクも。

https://www.credly.com/users/username.6d3f0074


# 前提、取得難易度は低い。

まず上記3つの資格は取得難易度自体はかなり低いです。
特に根拠は挙げませんが、合格率や合格者数、合格体験記の数を調べていただくと理解いただけるかと思います。

900シリーズはMicrosoft・Azureへの入り口の役割を果たしているものであるため、内容や暗記項目もかなり少ないです。単純比較はできませんが私の体感としても、ITパスポートの難易度を数段下げた感覚です。



# 転職先に、”行動力”をアピールしたかった。

私が上記資格を取ったのは **「転職先に自分の行動力をアピールしたかったから」** です。
そしてそのアピールが少しでもインパクトを持てるよう、
**「入社月1ヶ月以内」に「複数取得」** ということを目指しました。

私は職種未経験としてコンサル職に転職しているのですが、転職を決断した理由を一言で言うと「キャリアアップ」です。
職務内容は未経験ですが、「自分は動けるやつですよ！」と周りに証明したかったんですよね。


資格取得は結果が見えてわかりやすいですし社内でも公表されるので、良い機会だと思いました。

また資格取得というイベントを抽象的に考えると、**「旗を立てた小山にいかに早く効率よく登れるか」** というゲームみたいなものだと思います。
スピーディーに情報をキャッチアップしてアウトプットする力はどの業務でも土台になると思っていますし、特に幅広い業界に足を踏み入れるコンサル業務にも再現性を持つアクションだと思っています。

自分の資格取得までのスピード感が、そうした「アイツの行動力すげぇ」という評価につながり、実業務を任せてもらいたいと思い、行動していました。


# 「目的を持った資格取得には価値がある」と信じたい。

先ほど述べたように上記3資格の取得難易度が低いというのは事実かもしれませんが、
「取得 **"難易度"** が低いこと」と「取得 **"価値"** が低いこと」は決して結びつかないと信じています。


なぜなら、今時点で私は上記の「やる気と行動力のアピールする」という目的を達成できているからです。実際にに上記資格取得の事実は、社内メンバーからもかなり認知してもらえています。

それも「地頭がいいやつ」とか「知識豊富なやつ」とかの見方ではなく、
**「なんか、めっちゃやる気あるやつ」** 
みたいに認知していただいていると思っています。

その評価が本当なのかとかやる気っていう概念はなんやねんとかはさておき、
私はそんなふうに見て欲しいなと思っていましたし、その認知に意味を見出しているため、やはりあの1ヶ月頑張って良かったなと今思います。


# ただし、確信はないからあとで正当化する。

「資格取得に価値がある！」と断言せず、「資格取得に価値があると信じたい。」というふにゃふにゃ表現を使ったのは、まだ本当の意味では目的を達成できたことを確証できないからです。
そもそもの資格取得の目的を深掘りしていくと、転職をはじめとするキャリアの話や自分の市場価値についての話になります。

その辺の規模の話はまだわかっていません。というより、わかるわけがありません。
なんなら今回のMicrosoft認定資格の内容が自分のキャリアにどう繋がるかなんて、私自信が1番わかりません。

それでも「目的を持ってチャレンジし、成功したこと」はどんなに小さいことでも、いつかなんらかの役に立てられると思っています。
もしかしたら正当化っぽくするかもしれませんが、成功体験がないと正当化すらできません。

「正解を選び続ける考え方」よりは、「自分が選び続けたアクションを正解にしていく考え方」が幸せになれると考えています。


# "資格不要論者"も自分が勉強していないことを正当化しているだけ。

大なり小なりなんらかの資格をビジネスでアピールしたことがある方なら共感いただけると思うのですが、世の中には逆の正当化をしている方達もいます。

資格取得している人たちを見て、「資格を取得していない自分」を正解だと考える方達、
いわゆる **「資格不要論者」** です。

**「その資格は何の意味があるの？」**
**「私たちに資格は求められていないよ。」**
**「今持っている仕事が忙しくてそんな時間はないな〜。」**

上記は実際に私が職場で言われた言葉たちです。
前職では基本情報・G検定・統計検定2級を取得しているのですが、その際にもリーダーや先輩からはかなり言われました。決して怒ってるとか根に持っているとかではないですよ。
（と言いながら、いつ誰に言われたかとかめっちゃ覚えてる笑）

今ならわかるのですが、彼らも自分を正当化したいのだと思います。
そういう意味では私と彼らは同じ考えですし、資格を取る人も取らない人も同じ生き物だな〜と感じます。
もちろん本当に時間のなかった方や資格の内容価値を本当に理解していない方もいるのかもしれませんが。

ただ、資格を取ったことを正当化する難易度と資格を取らなかったことを正当化する難易度は結構異なる気がします。どうせするのであれば、説得力のある正当化をして、少しでも自分の幸せを最大化させたいな〜と思います。
「正当化の難易度＝説得力」になると思うのですが、みなさんはどちらの正当化の方が説得力あると思わますか？
怠惰なのでひとまずポートフォリオを作り始めてみる

## やる気が出ませんね？
どうも少しだけやる気が出たら執筆するかくらいの感覚で書いてます。
さて、2回目の投稿ですが折角なのでポートフォリオになるサイトでも作ろうかなと思います。

今回はひとまず環境の準備からやろうかな

## 技術スタック
今回は触りたい、この方面で仕事がしたいという意志の元技術選定します。

それぞれの仕様や解説などは今後残していきますので箇条書きに

* Vite
* Astro
* React or Solid
* Tailwind
* microCMS
* CloudFlare

とりあえず浮かんだものから順に書いたので後で並べ替えます。

ちなみに最後の二つは既にアカウントが用意してあるのでそちらを用います。

気分で変わるかもしれませんがこれらを用いて個人ブログにもなるように作っていこうかと...

## コンセプト
サイトのコンセプトは決めてはいますが頭の中のイメージにしかなってないので形にできたら記事にしようと思います。


## 短いですがこんかいはここまで
では、次回はAstro周りのセットアップについて書いていきます。
やっと技術っぽい記事になるかな
Webデザイン開発フロントエンドエンジニアを目指す未経験の雑魚です。

2025.2.19水曜日学習記録
HTML初級編をプロゲートにて学習しました。
主な学習内容としては、タグ、見出し、リンク、段落、コメント、画像の表示を学びました。実践的に、学習を行った後にコードを打ち込み、アウトプットを行いました。
その場では理解したつもりですが、1回では忘れてしまうことがありますので、予習をしたいと考えております。
ここで質問なのですが、プロゲートにて学習したのですが、復習方法として良い意見、効率の良い復習方法などがあれば教えて頂きたいです。返信よろしくお願いします！
30分記事＜2025/02/19＞

# 1.はじめに
・この記事は記載者の自己満足による物です。
・30分で完全に切り上げるために、完全に途中で切れても終わります！笑
（このはじめにを書くのは毎回テンプレとし、このコピペの時間帯は時間に入れないものとする。）
・間違えている可能性あり！！！あまりこの記事信用しないほうがいい気がする！笑

# 2.なんで始めようと思ったか？
・「時間がないから記事が書けない」を言い訳に書いていなかった自分を律するため
・「意味もない記事でもいいから30分で書いて、書く練習をしてみよう！そうすりゃアウトプットにもなる」と思ったため。

# 内容がなくともとにかく書こう。
・いいんですよ。中身すっからかんでも。練習になりゃぁ。

ってことで2025/2/19からスタート！！


# 30分アウトプット開始
ひとまず間違っていようがとにかく記載。


・・・さて何書こう？　→今日の勉強の一部を書くか。
db/migrate/YYYYMMDDhhmmss_create_xxxx.rb　に書いてある内容を復習。それしか思いつかん。

どう書くかなーとか思ってたらそれだけで時間が数分かかりそうなので、とにかくアウトプット。

```
class CreateXxxxxs < ActiveRecord::Migration[5.2]
  def change
    create_table :users do |t|
      t.string :name, null: false
      t.string :crypted_password
      t.integer :role, default: 0
      t.timestamps
      t.datetime :deleted_at

      t.index :name
      t.index :deleted_at
    end
  end
```
```
class CreateYyyyyys < ActiveRecord::Migration[5.2]
      create_table :Yyyys do |t|
      t.string     :name,     null: false
      t.references :record,   null: false, polymorphic: true, index: false

      t.datetime :created_at, null: false

      t.index [ :record_type, :record_id, :name, :blob_id ], name: "index_active_storage_attachments_uniqueness", unique: true
    end
end
```

基本的にMigrateファイルを追加する場合の一つとして、
Classには「CreateXxxxxs < ActiveRecord::Migration[5.2] 」となり、
テーブル名が「Xxxxxs」になる。（Yyyyy)も同じ。

その下には「def change」があり、
「create_table :users do |t|　」で「users」とするテーブルを作成し、tという名前に省略するよ。と言った意味で書いてある。

基本的には
「t.xxxxx :カラム名, 条件」で記載していく。
```
xxxxxに当たる部分を書いていくと、
string　：文字列
text　：文字列（stringより、より多くの文字列を記載可能。詳細は割愛）
integer　：整数(32bit　2の31乗　※頭の01は正負を表す　４桁の頭で言うと→「0」000）
bigint　：整数(32bit　2の63乗　※頭の01は正負を表す　４桁の頭で言うと→「0」000）
datetime　：日付
references　：1対多で、このテーブルが多の時に使う。上記のコードだとt.references :recordだね。

別枠）
index　：stringとかで設定したカラムを検索しやすく並べ替える。そのため検索しやすくしてくれる。

```

やばい残り15分。早いｗ


:カラム名　に当たる部分を書いていくと
```
基本的には３種類と考えていいかも？（コレで固めるのは頭硬いかもしれんけど）-
１　：:カラム名
（もうそのまんま。上にある「:name」とか「:role」とか。データベースに登録されるのもそのまんまと考えていいと思っている）

２　：t.referencesの場合。上にある「:record」とか「：blob」とか。
（
　・このファイルに書くときは特に気にしなくてもいい。
　・実際にこいつは、書いてあるrecordやblobってやつのテーブルから情報を持ってくるにあたって、そのテーブル情報のIDを持ってきている。そのため、ER図やデータベースで保存されるときは、基本的にinteger（数字）で登録されている認識。
　・問題は、ER図に書くときやカラムに登録された時のカラム名は「Xxxxxx_id」と後ろに「_id」がつく。
）

３　：t.references :カラム名, の後にくる「polymorphic: true」
　・こいつが入る行を見る。
 　t.references :record,   null: false, polymorphic: true, index: false

  →作られるカラムは「record_id」と「record_type」の2つ。
  　ポリモーフィックと呼ばれるやつで使うやつらしいけど、そこまではわからず。
   とにかくこの二つを出すんだなーと。
   （なんか1対多で相手のテーブルが１、自分が多、そのテーブルが複数あるのに関係あるっぽい？
   　とにかく引き続き勉強だー）
```
と言ったところかな。


最後に
def up：テーブル作成、カラム作成
def down：ロールバック用の削除するメソッド。

ここまで30分。しゅうりょーーーーーー
様々なDockerコンテナイメージを作成するサンプル集

# Dockerコンテナ作成のサンプル集
Dockerの学習で以下のコンテナイメージを作ったので自分用の備忘録です。
Docker Composeではなくdocker runで起動する例です。
- Apache
- nginx
- MySQL
- WordPress

#### Apacheのコンテナを作成する例
```bash
# runコマンドを実行
docker run --name apachesample -d -p 8080:80 httpd

# 実行後コンテナの稼働を確認する
docker ps
# apachesampleというコンテナが起動していることを確認する
# ブラウザを起動して「localhost:8080」にアクセスしてページが表示されること

# コンテナを停止する
docker stop apachesample

# コンテナを削除する
docker rm apachesample

# コンテナの削除を確認する
docker ps -a
# apachesampleというコンテナが消去されていることを確認
```

#### nginxのコンテナを作成する例
```bash
# runコマンドを実行
docker run --name nginxsample -d -p 8080:80 nginx

# 実行後コンテナの稼働を確認する
docker ps
# nginxsampleというコンテナが起動していることを確認する
# ブラウザを起動して「localhost:8080」にアクセスしてページが表示されること

# コンテナを停止する
docker stop nginxsample

# コンテナを削除する
docker rm nginxsample

# コンテナの削除を確認する
docker ps -a
# nginxsampleというコンテナが消去されていることを確認

```

#### MySQLのコンテナを作成する例
```bash
docker run --name mysqlsample -dit -e MYSQL_ROOT_PASSWORD=password mysql

# 実行後コンテナの稼働を確認する
docker ps
# mysqlsampleというコンテナが起動していることを確認する

# コンテナを停止する
docker stop mysqlsample

# コンテナを削除する
docker rm mysqlsample

# コンテナの削除を確認する
docker ps -a
# mysqlsampleというコンテナが消去されていることを確認
```

#### WordPressのコンテナを作成する例
```bash
# Dockerネットワークを作成
docker network create wordpressNet1
# MySQLのコンテナを作成
docker run --name mysqlWordPress -dit --net=wordpressNet1 -e MYSQL_ROOT_PASSWORD=myrootpass -e MYSQL_DATABASE=wordpressdb -e MYSQL_USER=wordpresskun -e MYSQL_PASSWORD=wkunpass mysql:8.1 --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci --default-authentication-plugin=mysql_native_password
# WordPressのコンテナを作成
docker run --name wordpressSample -dit --net=wordpressNet1 -p 8080:80 -e WORDPRESS_DB_HOST=mysqlWordPress -e WORDPRESS_DB_NAME=wordpressdb -e WORDPRESS_DB_USER=wordpresskun -e WORDPRESS_DB_PASSWORD=wkunpass wordpress:5.5
# ブラウザを起動して「localhost:8080」にアクセスしてページが表示されること

# コンテナの停止
docker stop wordpressSample
docker stop mysqlWordPress

# コンテナの削除
docker rm wordpressSample
docker rm mysqlWordPress

# イメージの削除
docker image rm wordpress
docker image rm mysql

# ネットワークの削除
docker network rm wordpressNet1
```
input type="email"で前後に半角スペース入力時の挙動がちょっと変

## 概要
`<input type="email" />`で、先頭や末尾に半角スペースを入力しても、内部的には半角スペースなしとして扱われている模様。

## 経緯
Vue.jsで、type="email"を指定したinput要素で[v-model.trim](https://ja.vuejs.org/guide/essentials/forms#trim)しようとした。
しかし、画面上は半角スペース除去されなかった。
一方で、内部で保持している値には半角スペースが含まれていない様子だった。

## Issue
だいぶ前にたっていた。
https://github.com/vuejs/vue/issues/5471

<dt>要約: </dt>
<dd>Chromeの仕様なので、Vueなしで再現できるよ</dd>
<dd>Issueたてるならそっちにたててね</dd>

EdgeやFirefoxでも再現したのでChromeというよりブラウザの仕様なのかな。

## 動かして確認
Issueに2つjsFiddleのサンプルが載っている。

自分が理解しやすいように[2つめ](https://jsfiddle.net/k4n77nnf/)に以下を加え、いろいろ入力を試し、コンソールの出力を見て理解、納得した。

```javascript
document.querySelector('input').addEventListener('input', (event) => {
  console.log(event.target.value)
})
```

## 仕様
https://html.spec.whatwg.org/multipage/input.html#email-state-(type=email)

> The value sanitization algorithm is as follows: Strip newlines from the value, then strip leading and trailing ASCII whitespace from the value.

仕様としてもあえてそうしているみたい。
画面上も変えてくれるとわかりやすいが、HTMLの仕様としてはそこまでやらない、と理解した。
ブラウザ側でよしなにやってくれてもいい気はするけども。

## 結論
バグではなく、HTML側(とその表示を実装するブラウザ側)の仕様。
ubuntu にiPhone の画像を取り入れ壁紙にする

# Ubuntu に iPhone の画像を取り込んで壁紙にする方法

Ubuntu を使っていて、iPhone の写真を壁紙にしたいと思ったことはありませんか？この記事では、iPhone の画像を Ubuntu に転送し、壁紙として設定する方法を詳しく解説します。

## 1. iPhone から画像を Ubuntu に転送する方法

### 方法 1: USB ケーブルを使う
1. **iPhone を Ubuntu に接続**し、iPhone 側で「このコンピュータを信頼しますか？」と表示されたら「信頼」をタップ。
2. **必要なパッケージをインストール**（初めての接続時）。
   ```bash
   sudo apt update
   sudo apt install libimobiledevice6 ifuse
   ```
3. **iPhone をマウントして画像を取得**。
   ```bash
   mkdir -p ~/iPhone
   ifuse ~/iPhone
   ```
   その後、`~/iPhone/DCIM/` フォルダ内の画像をコピーできます。
4. **マウント解除する場合**。
   ```bash
   fusermount -u ~/iPhone
   ```

### 方法 2: クラウドを利用する
- **iCloud** に画像をアップロードし、Ubuntu のブラウザでダウンロード。
- **Google ドライブや Dropbox** に保存し、Ubuntu でアクセスしてダウンロード。

### 方法 3: メールやメッセージで送信
- 自分の **Gmail** に画像を送信し、Ubuntu で受信してダウンロード。
- **LINE や Slack** に送信し、Ubuntu でダウンロード。

## 2. Ubuntu で画像を壁紙に設定する方法

### 方法 1: GUI で設定
1. **画像を「ピクチャ」フォルダなどに保存**。
2. **デスクトップを右クリック**し、「背景の設定」を選択。
3. 「画像を追加」または「他の画像を選択」で、iPhone の画像を選択。

### 方法 2: コマンドラインで変更
画像を `~/Pictures/iphone_wallpaper.jpg` に保存した場合、次のコマンドで壁紙を変更できます。
```bash
gsettings set org.gnome.desktop.background picture-uri "file:///home/$USER/Pictures/iphone_wallpaper.jpg"
```
もし `file://` で設定できない場合は、以下のコマンドを試してください。
```bash
gsettings set org.gnome.desktop.background picture-uri-dark "file:///home/$USER/Pictures/iphone_wallpaper.jpg"
```

## まとめ
以上の方法で、Ubuntu に iPhone の画像を取り込んで壁紙として設定できます。USB を使う方法が最も直接的ですが、クラウドやメール経由の方法も便利です。ぜひ試してみてください！
GitHub ActionsでSSH接続（ECDSA）をする方法

# `appleboy/ssh-action`を使用したSSH接続

GitHub Actions上でSSH接続するために`appleboy/ssh-action`を利用します。

- **公式リポジトリ**: [https://github.com/appleboy/ssh-action](https://github.com/appleboy/ssh-action)

以下のワークフローを作成し、リモートサーバーにSSH接続して `git pull` を実行します。

```yaml
name: Deploy to Remote Server

on:
  push:
    branches:
      - main # デプロイをトリガーするブランチ

jobs:
  deploy:
    runs-on: ubuntu-latest

    steps:
      - name: Checkout code
        uses: actions/checkout@v2

      - name: Execute remote SSH commands
        uses: appleboy/ssh-action@v1.2.0
        with:
          host: ${{ secrets.REMOTE_SERVER_HOST }}
          username: ${{ secrets.SSH_USER }}
          key: ${{ secrets.SSH_PRIVATE_KEY }}
          port: 22
          script: |
            cd /path/to/your/project
            git pull origin main
```

# GitHub Secretsの設定

SSH接続に必要な情報をGitHubリポジトリの**Secrets**に登録します。

1. GitHubでリポジトリの**Settings**に移動
2. **[Security]** → **[Secrets and variables]** → **[Actions]** を選択
3. **[New repository secret]** をクリックし、以下のシークレットを追加

| シークレット名         | 内容                              |
|----------------------|--------------------------------|
| `REMOTE_SERVER_HOST` | リモートサーバーのホスト名またはIPアドレス |
| `SSH_USER`          | SSH接続用のユーザー名 |
| `SSH_PRIVATE_KEY`   | **ECDSA秘密鍵の内容** |

`SSH_PRIVATE_KEY` には、ローカルで作成したECDSA秘密鍵の内容を貼り付けます。  
この情報はGitHub Actions内でのみ使用され、ログには出力されません。

- **GitHub公式ドキュメント**: [https://docs.github.com/ja/actions/security-guides/using-secrets-in-github-actions](https://docs.github.com/ja/actions/security-guides/using-secrets-in-github-actions)

# **注意点**

:::note warn
`appleboy/ssh-action` は **パスフレーズ付きのECDSA秘密鍵には対応していません**。  
もしパスフレーズ付きの鍵を使用すると、認証エラーが発生します。
:::



対策として、**パスフレーズなしのECDSA鍵** を作成して使用してください。
また`shimataro`などはECDSAに対応していないので注意が必要です。
GA4カスタムイベントにオプション情報を付与して追加の情報を得る方法

## GA4でカスタムイベントにオプションパラメータを設定

GoogleAnalyticsで以下のように進みます。

管理 > プロパティ設定 > データの表示 > カスタム定義 > カスタムディメンションを作成

ディメンション名にオプションパラメータの論理名を設定。
範囲は「イベント」
イベントパラメータは`gtag`関数で設定する内容を設定。
※半角英数字とアンダーバーのみで構成

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2779836/3f470e9b-a19c-4196-af4b-6d7a9e3297a8.png)

## gtag関数にオプションパラメータを追加

```
gtag('event', '<event_name>', {
    '<custom_paramater>': 'hoge'
})
```

`custom_paramater`はGoogleAnalytics側で設定した値。

これを発火させたいポイントに埋め込みます。
今回は`east` `west` `north` `south`の情報を付加してみます。

```
gtag('event', 'rendering_first', {
    'user_group': 'east'
})
```

データの取得や反映までに数日かかるので気長に待ちましょう。

反映された後に、フィルタリングしてよしなに利用しましょう。

## レポートの確認

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2779836/27bb2f98-def7-474f-ad5f-45e5340dc32e.png)

レポート > エンゲージメント > イベント > フィルタを追加

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2779836/00a87997-41dc-4e04-87d7-af4a4624afe0.png)

フィルタリングしたい値を選択。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2779836/081e2c80-d435-4980-9213-31651054d2f5.png)

以上
Comparatorを使った複数条件のソート

JavaのリストでComparatorを使った複数条件のソートを行います。

今回は以下のデータクラスのDateSとDateEの2つの日付型で並び替えを行ってみます。
```java
public class MyData {
	public int Sort;
	public String Name;
	public Date DateS;
	public Date DateE;

	public MyData() { }

	public MyData(String name, int sort, Date dates, Date datee) {
		this.Sort = sort;
		this.Name = name;
		this.DateS = dates;
		this.DateE = datee;
	}
}
```

並び替えは以下の仕様で行ってみます。

**仕様**

1. 最初にDateEの昇順で並べる、nullの場合は後ろ
2. 次にDateEの昇順で並べる、nullの場合は後ろ

**ポイント**

- `(MyData e)` と型指定をする必要がある
- nullを後ろにしたい場合は `Comparator.nullsLast` を利用する
- 複数条件は `thenComparing` で繋げる

```java
//バラバラの順番のリストを作成する
List<MyData> myList = new ArrayList<>();
myList.add(new MyData("name1", 1, null, null));
myList.add(new MyData("name2", 2, null, null));
myList.add(new MyData("name3", 3, Date.valueOf(LocalDate.of(2020, 1, 10)), null));
myList.add(new MyData("name4", 4, Date.valueOf(LocalDate.of(2020, 1, 9)),Date.valueOf(LocalDate.of(2020, 1, 9))));
myList.add(new MyData("name5", 5, Date.valueOf(LocalDate.of(2020, 1, 8)),Date.valueOf(LocalDate.of(2020, 1, 8))));
myList.add(new MyData("name6", 6, Date.valueOf(LocalDate.of(2020, 1, 7)),Date.valueOf(LocalDate.of(2020, 1, 7))));
myList.add(new MyData("name7", 7, Date.valueOf(LocalDate.of(2020, 1, 1)),Date.valueOf(LocalDate.of(2020, 1, 1))));

//comparingとthenComparingで複数条件で並び替えを行う
List<MyData> sorted = myList.stream().sorted(
    Comparator.comparing((MyData e) -> e.DateE, Comparator.nullsLast(Comparator.naturalOrder()))
    .thenComparing((MyData s) -> s.DateS, Comparator.nullsLast(Comparator.naturalOrder())))
    .collect(Collectors.toList());

//表示して確認する
sorted.stream().forEach(f -> System.out.println(f));
```
結果は以下のようにDateEの次にDateSで並び替えができました。
```
Name[name7] Sort[7] DateS[2020-01-01] DateE[2020-01-01]
Name[name6] Sort[6] DateS[2020-01-07] DateE[2020-01-07]
Name[name5] Sort[5] DateS[2020-01-08] DateE[2020-01-08]
Name[name4] Sort[4] DateS[2020-01-09] DateE[2020-01-09]
Name[name3] Sort[3] DateS[2020-01-10] DateE[null]
Name[name1] Sort[1] DateS[null] DateE[null]
Name[name2] Sort[2] DateS[null] DateE[null]
```
適当ですが目的は達成できました。
AIで英単語を漫画化するけど、つまらない内容なので人間が面白くする「コミ単」開発事例

こんにちは、エンジニアの皆さん！今回は生成AIを活用した英単語学習アプリ「コミ単」の開発事例をシェアします。

▣「コミ単」の概要
「コミ単」は英単語学習×生成AIを組み合わせたWebアプリです。中高生の「英単語がなかなか覚えられない」「単語帳がつまらない」という課題に対し、入力した英単語からAIが漫画を生成することで楽しく学習できる...と思ったけど、AIが生成する漫画の内容が面白くないので”自分で面白くする”仕組みにすることで、生成AIへの興味喚起と英単語学習の両方を実現しました。
![スクリーンショット 2025-02-19 22.03.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3991729/5b34dd95-d16f-4985-96b8-a834a3fc076c.png)


▣技術スタック
CopyFrontend: JavaScript (Next.js)
Backend: Python (Firebase Functions)
Infrastructure: GCP/Firebase
Image GenAI: Stable Diffusion Ultra
Text GenAI: GPT-4o

▣技術選定の苦労
プロジェクト初期は画像生成にDALL-E 3を採用していましたが、日本の漫画表現に課題がありました。ユーザーテストで「アメコミ調になる」との指摘を受け、社内AI部門と連携してStable Diffusionへ切り替え、日本のアニメ風グラフィックの再現性を向上させました。
サーバーレス構成で工数削減
少人数高速開発という条件下で、使い慣れたFirebaseを採用。Authentication、Firestore、Functionsを組み合わせたサーバーレス構成により、バックエンド構築の工数を大幅削減し、一人でのフルスタック開発を実現しました。

![スクリーンショット 2025-02-19 22.03.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3991729/c9e17ce4-49f4-4c25-9b74-ea9ee79d4dee.png)


AIが生成したストーリーをベースに中高生が自分なりにアレンジできる機能を実装。ユーザーからは「AIが出したものを元にするなら想像しやすい」との好反応を得ました。
詳細な実装方法や生成AIとの連携手法について、弊社テックブログで詳しく解説しています。興味を持たれた方はぜひご覧ください！

https://techblog.reazon.jp/entry/2024/11/25/140757
DB設計時に意識すること

## 概要
DB設計時に意識しておきたいことをまとめました。
アンチパターンを採用しないために一般的な事柄をまとめています。

本記事は「SQLアンチパターン」を参考に作成しています。

https://www.oreilly.co.jp/books/9784873115894/

## ENUMは値が可変となる場合、アンチパターンとなりうるので注意

### デメリット
- 値が変更となった場合に、メタデータの変更が必要
- ENUMが取りうるすべての値を確認するには、SQLのメタデータを参照する必要

### 解決策
- 参照テーブルを用意する
    - 値の変更時は`INSERT`で対応できる
    - すべての値セットを`SELECT`で取得できる

### まとめ
ENUMの値が可変となる可能性を考慮する。
可変となる場合は、参照テーブルを利用するパターンを採用する。

> [reference] SQLアンチパターン P.111 サーティワンフレーバー

## DB インデックスの使用を最適化

### デメリット
- インデックスを定義しない、闇雲に使用することで無駄なオーバーヘッドが生まれる

### 解決策
- WHERE, JOIN, ORDER旬が多く利用されるカラムにインデックスを採用する
- 最適なインデックス管理を行うための指標「MENTOR」を採用する

> [reference] SQLアンチパターン P.129 インデックスショットガン

## ポリモーフィック / EAV (Entity Attribve Value)の利用

### ポリモーフィック
1つのコメントテーブルが複数のテーブル（投稿や写真など）を参照する

#### posts テーブル
| id | title         | content             |
|----|---------------|---------------------|
| 1  | First Post    | This is a post.     |
| 2  | Second Post   | Another interesting post. |

#### photos テーブル
| id | image_url    | description         |
|----|--------------|---------------------|
| 1  | photo1.jpg   | A sample photo.     |
| 2  | photo2.jpg   | Another sample image.|

#### comments テーブル
| id | commentable_type | commentable_id | comment             |
|----|------------------|----------------|---------------------|
| 1  | Post             | 1              | Great post!         |
| 2  | Photo            | 2              | Amazing shot!       |

### EAV
属性をレコードとして管理することで柔軟な属性追加を実現

#### products テーブル
| product_id | name     |
|------------|----------|
| 1          | T-Shirt  |
| 2          | Mug      |

#### product_attributes テーブル (EAVパターン)
| id | product_id | attribute_name | attribute_value |
|----|------------|----------------|-----------------|
| 1  | 1          | color          | red             |
| 2  | 1          | size           | M               |
| 3  | 2          | material       | ceramic         |
| 4  | 2          | capacity       | 300ml           |


### デメリット
- メタデータではなく、アプリケーションコードへの依存が強くなる
- 必須属性を指定できない
- 単一カラムで複数のデータを管理するため、SQLのデータ型を利用できない
- 参照整合性を強制できない

### 解決策
以下いずれかのパターンを用いる。
- シングルテーブル継承(STI)
- 具象テーブル継承
- クラステーブル継承
- 構造化データ(XML, JSON)

### まとめ
ポリモーフィック / EAVパターンはなるべく利用せず、既存テーブルと関連付けるパターンを採用するのが望ましい。

> [reference] SQLアンチパターン P.51 EAV（エンティティ・アトリビュート・バリュー）
> [reference] SQLアンチパターン P.67 ポリモーフィック関連

## 隣接リストの利用

階層構造を実現する際、隣接リストを使用したくなるケースがあると思いますが、アンチパターンになり得ます。

#### categories テーブル
| id | name           | parent_id |
|----|----------------|-----------|
| 1  | Root           | NULL      |
| 2  | 子カテゴリ A  | 1         |
| 3  | 子カテゴリ B  | 1         |
| 4  | 孫カテゴリ A1 | 2         |


### デメリット

- 階層が深い場合、多くのJOINが必要になってしまう

### 解決策
以下パターンの採用を検討する
- 経路列挙（`1/`, `1/2`）
- 入れ子集合
- 閉包テーブル

### まとめ
書くパターンのメリ・デメを理解した上で適切に使い分けましょう。

> [reference] SQLアンチパターン P.13 ナイーブツリー

## 最後に
以上です。
自分向けにまとめた記事であるため、少し読みづらいかもしれませんが、ご了承ください🙏
パスワードの定期更新は非推奨です

その昔、特に業務システムにおいて、ログイン用のパスワードを定期的に更新するように求められることが一般的でした。もしかしたら、今でもそういうシステムが残っているかも知れません。

しかしながら、このような**パスワードの定期更新は現在では非推奨**となっています。日本やアメリカの公的な組織からも、パスワードを定期更新するべきではないという見解が示されています。

この記事では、パスワードの定期更新が非推奨である理由と、そうなった経緯についてご紹介したいと思います。

# なぜパスワードの定期更新は非推奨なのか？
パスワードの定期更新を非推奨とする理由については、以下のものが挙げられます。

+ パスワードの定期更新には**パスワードを破られにくくする効果がない**。
+ パスワードの定期更新を強要することで**パスワードが簡単になったり、使いまわしをするような問題が増える**。

パスワードを定期更新するよりも、**推測されにくく安全なパスワードを使う、パスワードを使いまわさない／他人に教えない／複数人で共有しない**といった対策をする方が大切です。

パスワードを破られにくくするにはパスワードの長さや複雑さの方が重要であり、その更新頻度は重要ではありません。また、パスワードの定期更新を強要すると人々がパスワードを使い回すような問題が起こりやすくなります。

パスワードの変更は定期的に行うのではなく、それが必要になったタイミングで実施するべきです。

>なお、利用するサービスによっては、パスワードを定期的に変更することを求められることもありますが、実際にパスワードを破られアカウントが乗っ取られる等のサービス側から流出した事実がない場合は、パスワードを変更する必要はありません。むしろ定期的な変更をすることで、パスワードの作り方がパターン化し簡単なものになることや、使い回しをするようになることの方が問題となります。定期的に変更するよりも、機器やサービスの間で使い回しのない、固有のパスワードを設定することが求められます。
>
>安全なパスワードの設定・管理 | 国民のためのサイバーセキュリティサイト
>https://www.soumu.go.jp/main_sosiki/cybersecurity/kokumin/security/business/staff/06/

# いつからパスワードの定期更新は非推奨になったのか？
ひと昔前まではパスワードの定期更新は推奨される行為でした。しかし現在では、日本やアメリカの公的な組織によって「定期更新は必要ない」という方針が示されています。

+ **2017年: 米国国立標準技術研究所（NIST）** から「パスワードの定期的な変更を要求するべきではない」とガイドラインが示される。
+ **2018年3月**: 日本の**内閣サイバーセキュリティセンター**からパスワードの変更をする必要はない旨が示される。

このように**2017年頃から公的にパスワードの定期更新が否定されている**のですが、**情報セキュリティに通じた人々から疑問の声が上がったのはもっと昔**のことでした。

例えば、**2008年**に投稿された**徳丸浩**氏のblogでは、パスワードの定期更新について疑問を呈する記事が書かれています。

>一般に、パスワードのブルート・フォース攻撃や辞書攻撃に対する備えとしてはアカウント・ロックが有効であり、重ねて定期的なパスワード変更を義務付ける必要はまったくないと私は考える。
>
>パスワードの定期変更は「神話」なのか? – ockeghem’s blog
>https://ockeghem.hatenablog.jp/entry/20080226/p1

また2011年に **＠IT**に掲載された**辻伸弘**氏の記事でも、盲目的にパスワードを定期更新することの危険性について触れられています。

>昨今のセキュリティ事情を考慮すると、「パスワードの定期な変更」は、いまやあまり意味をなさなくなってきている。にもかかわらず、守るべき情報資産の質（＝前述の短期的か、長期的か）を考慮せず、おまじないのように定期的なパスワード変更を要求するシステムは少なくない。
>
>しかし、この無批判な運用がかえって、パスワードの質を低下させる危険性を含んでいるのだ。
>
>パスワードの定期変更という“不自然なルール”：セキュリティ・ダークナイト（6）（3/4 ページ） – ＠IT
>https://atmarkit.itmedia.co.jp/ait/articles/1102/04/news117_3.html

# まとめ
パスワードの定期更新は、昔は「やって当たり前」のセキュリティ対策でした。しかし、その有効性を疑問視する声が専門家の方々から上がってくるようになりました。

それから長い議論の末、パスワードの定期更新は一般的に非推奨のものとして扱われるようになったのでした。

# 参考サイト
+ [国民のための サイバーセキュリティサイト](https://www.soumu.go.jp/main_sosiki/cybersecurity/kokumin/index.html)
+ [パスワードの定期的な変更は本当に不要なのか – 情シス事情を知る | NECネクサソリューションズ](https://www.nec-nexs.com/sl/security/it/24.html)
+ [世の中に満ち溢れる「パスワードの定期的変更」についてまとめてみた。 – piyolog](https://piyolog.hatenadiary.jp/entry/20130907/1378520586)
新卒エンジニアがJAWS-UGのBedrockイベントに参加した話

## はじめに
2024年卒でKDDI株式会社に入社し、サーバ系のシステム開発・運用を行う部署に配属された自分が、AWSが提供するクラウドコンピューティングを利用する人々のコミュニティであるJAWS-UG東京支部主催で開催されたBedrock系のイベントに参加した話をしようと思います！！

https://jaws-ug.jp/

## 自分の経歴
大学・大学院時代ともに、コンピュータビジョンと呼ばれる、人間の目の機能を機械にも実現しようという研究分野で、画像×AIという軸で、1枚の人物画から顔の三次元形状の推定、植物画像の生成、画像の高解像度化をしていました。

また、研究室の計算機サーバ管理について、教員のフォローの下、1年間管理を行っており、サーバ管理についてもそれなりの知識が身に付いていました。

そういった経歴の中で、AI開発というよりは、人の生活が便利になるものを作りたい＝アプリケーション開発に興味がわき、入社後から今の部署を志望したという経歴です。

## きっかけ
弊社の現在の事業戦略として、「サテライトグロース戦略」があります。これは、5G・データドリブン・生成AIを軸に様々な付加価値サービスを提供することで、事業を成長させるというものです。そして、自分の配属先では、生成AIやデータドリブンの取り組みやイベントも多くあり、自分もこの波に取り残されたくないという思いで、業務でAWSを使っていることから、Bedrockに注目しました。
生成AI自体については元々専門分野ではあったのですが、Bedrock自体は完全初心者なので以下の疑問を解消したくてイベントに参加することを決めました。
- Bedrockって色々な生成AIモデルを使えるとはいえ、結構それらを使ったシステム構築って結構難しそう...。
- 社内でも多くの取り組みがされていたので、社外の方から何か取り組むことが出来るヒントを得たいな...。

## イベントの探し方
上司からも「何か興味があるもののイベントは色々行って来たらいいよ」というお言葉をいただいており、「どういうので探したらいいですか？」と聞いてみたところ、「connpassが良いよ！」とのことで、ここからBedrockイベントを探しました。本当に色々なイベントの募集があり、自分の疑問を解消できるイベントも開催されていました。

https://connpass.com/explore/

## 参加したイベント

自分が参加したイベントは2つです。

### 1. Bedrockでマルチエージェントを作ろう！

https://jawsug.connpass.com/event/344024/

これは、オンラインで開催されたハンズオン形式のイベントです。
マルチエージェントってなんぞやという話ですが、簡単に言えば、ある分野の専門家 (＝AIエージェント) が多数いてそれらの意見を踏まえてより良い回答を作り出してくれる聞くだけでワクワクするBedrockの機能です。

参加してみてですが、個人的には「こんな簡単に出来ちゃうんだ！」と驚きました。途中、設定項目がミスって応答してくれないところがあり、やはり手順書をしっかり確認し、1つ1つの手順を消化する大事さを痛感しました（）。
また、参加者も500人以上いたというところも非常に驚きでした。こんなに使ってみようという人がいるとは。

このイベントで作成したマルチエージェントは、イベント主催者のみのるんさんの方で、Qiitaの記事にもなっています！ハンズオンを聞かずとも手順が凄い丁寧に示されているのでAWSアカウントさえ用意すれば構築出来ちゃいます (繰り返しですが、しっかり設定項目は確認しましょう笑)

https://qiita.com/minorun365/items/1f4dbf5842a47bd175cc

### 2. Bedrock Night 2025

https://jawsug.connpass.com/event/344030/

これはオンラインではなく、AWS合同会社の目黒オフィスで行われるイベントで、自分はオフラインイベントに参加したいという気持ちもあり、上司に相談したうえで参加することが出来ました。
雰囲気はこんな感じで、非常に多くの人がいて、生成AIの注目度の高さを実感することが出来ました。今、参加できて本当によかったなと思います。

![IMG_0168.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3942158/b2dfd884-93df-4076-b013-5bf7d9351fe0.jpeg)

2つのパートに分かれていたのですが、前半がLT大会で、後半がAWSの社員さんを招いたお悩み相談会でした。LTパートは、面白い話をたくさん聞くことができ、勉強になる部分も非常に多かったです。お悩み相談会パートは、自分がBedrockを触ったことがない身ということもあり、少し置いていかれる内容が多々ありました笑 が、非常に参考になる情報もいくつかあり、有意義な時間を過ごすことが出来ました！

## まとめ
- KDDIアジャイル開発センター (ここ大事) のみのるんさん主催のイベントに2回も参加してました笑。色々なイベントを開催されていて、すごすぎです。
- こういうことが気になるなと思ってから参加するイベントは、非常にためになりました。今回の参加するきっかけでもあった2つの疑問点は解消されました。
- 参加してこい！と背中を押してくださった上司に感謝です。直接まだ言えていないのでしっかり言おうと思います。
- これからも色々なイベント (特にBedrock) に参加して情報をキャッチアップ&アウトプットしていきたいです！
日本語ModernBERTをJMTEBで測る

[2月13日の記事](https://qiita.com/KoichiYasuoka/items/defc967e0d552b7ae864)の続きだが、[modernbert-ja-130m](https://huggingface.co/sbintuitions/modernbert-ja-130m)を[JMTEB](https://www.sbintuitions.co.jp/blog/entry/2024/05/16/130848)で評価してみた。python3.9のlinux環境だと、こんな感じ。

```
#! /bin/sh
model="sbintuitions/modernbert-ja-130m"
pip3.9 install sentence-transformers accelerate datasets jsonnet jsonargparse smart-open openai loguru tiktoken triton
test -d JMTEB || git clone --depth=1 https://github.com/sbintuitions/JMTEB
NAWK=nawk
if [ -x /usr/bin/gawk ]
then NAWK=/usr/bin/gawk
elif [ -x /usr/bin/mawk ]
then NAWK=/usr/bin/mawk
fi
find JMTEB/src -type f -print |
( while read F
  do T=`echo $F | sed 's?/src/?/src9/?'`
     mkdir -p `dirname $T`
     case $T in
     *.py) $NAWK '
{
  if(f!=1){
    if($0!~/__future__/){
      printf("from typing import Union\n");
      f=1;
    }
  }
  s=$0;
  while(match(s,/[A-Za-z]+(\[[A-Za-z ",]+\])?( \| [A-Za-z]+(\[[A-Za-z ",]+\])?)+/)>0){
    u=substr(s,RSTART,RLENGTH)
    gsub(/\|/,",",u);
    s=substr(s,1,RSTART-1)"Union["u"]"substr(s,RSTART+RLENGTH);
  }
  print s;
}' $F > $T ;;
     *) cp $F $T ;;
     esac
  done
)
( cd JMTEB/src9 && python3.9 -m jmteb --embedder SentenceBertEmbedder --embedder.model_name_or_path $model --save_dir ../../result/$model )
echo '***' $model
cat result/$model/summary.json
echo ''
```

NVIDIA A100-SXM4-40Bだと、約5時間で以下の結果が出力された。

```
*** sbintuitions/modernbert-ja-130m
{
    "Classification": {
        "amazon_counterfactual_classification": {
            "macro_f1": 0.7950890220234579
        },
        "amazon_review_classification": {
            "macro_f1": 0.5487820868146802
        },
        "massive_intent_classification": {
            "macro_f1": 0.7846780827802187
        },
        "massive_scenario_classification": {
            "macro_f1": 0.8773959115883739
        }
    },
    "Reranking": {
        "esci": {
            "ndcg@10": 0.8912429272483781
        }
    },
    "Retrieval": {
        "jagovfaqs_22k": {
            "ndcg@10": 0.2023059628411459
        },
        "jaqket": {
            "ndcg@10": 0.004896766886316614
        },
        "mrtydi": {
            "ndcg@10": 0.0010101371072516164
        },
        "nlp_journal_abs_intro": {
            "ndcg@10": 0.6066659482790582
        },
        "nlp_journal_title_abs": {
            "ndcg@10": 0.04250008352802152
        },
        "nlp_journal_title_intro": {
            "ndcg@10": 0.0283856529293545
        }
    },
    "STS": {
        "jsick": {
            "spearman": 0.6866891606396426
        },
        "jsts": {
            "spearman": 0.7251711023967391
        }
    },
    "Clustering": {
        "livedoor_news": {
            "v_measure_score": 0.47841250764829696
        },
        "mewsc16": {
            "v_measure_score": 0.3174619711273742
        }
    },
    "PairClassification": {
        "paws_x_ja": {
            "binary_f1": 0.6239830208701804
        }
    }
}
```

`Retrieval`が低いのは、まあ、仕方ないだろう。あとは、まあまあの評価値かな。
【ポータブルスキル】～～よりよいコミュニケーションを求めて～～

いつも記事を読んでいただきありがとうございます！
モブエンジニア（[@mob-engineer](https://qiita.com/mob_engineer))です！

プライベートで所属している**PMOコミュニティ**内でコミュニケーションのベストプラクティスについて考えるセッションがありましたので、私個人が考えている**より良いコミュニケーション**についてざっくりと整理してみました。

## なぜコミュニケーションが必要なのか？

何かしらの仕事を行うなかで、相手とのコミュニケーションを行いながら仕事を行っているかと思います。そのうえで、**そのコミュニケーションは本当に必要なのか**について意外と意識が向いていないのではないかと思いました。

例えば、キッティング作業などの比較的相手とのコミュニケーションが必要ない作業などであれば、極論、**コミュニケーションなくても進めらられる**と思います。

そのうえで、**コミュニケーションを通じて何が得られるのか**といった視点で私個人の考えですが次のメリットがあると思います。

- 相手との相互理解
    - プロジェクトなどの相手との協力が必要な仕事をよになに進められる
- 仕事への解像度を上げられる
    - コミュニケーションを通じて、**自分が持っていない考え**をキャッチする機会を得ることが出来る
- 周囲から認識してもらえる
    - 周囲から認識してもらうことで、**この人には○○の持ち味を持っている**と知ってもらえる

## 仕事を進める上でのきつい口調の是非

プロジェクトを進めていく上で、きつい口調で相手を動かしていく場面が多くあるかと思います。PM、PMOなどのプロジェクト管理をになっている方だけでなく、技術職、事務職の方でも、仕事をよしなに進めていく場面ではきつい口調が求められるかと思います。

ただ、きつい口調を行うことによる**心理的安全性の低下**もあるので、**きつい口調はやめた方がいい**といった場面が多くあると思います。

そのうえで、私の個人的意見として、**目的達成を主体的に出来る組織であればきつい口調はしなくていい、主体的に出来ない組織であれば行った方がいい**という考えを持っています。

主体的に出来ない組織の場合、**規律と統制を行う人がいないと、目的達成に向けてアクションを行うことが難しい**と考えています。

## やる気のある人材のコミュニケーション

きつい口調の是非につながりますが、やる気のある人材が仕事を熱意を持って進めていくことで、**周囲の方からのひんしゅくを買ってしまう場面**があるかと思います。

私個人もやる気のある人材側として熱量を持って取り組んでいたときに、周りの方からひんしゅくを買ってしまう（なぜ、やり方を変えてしまうのだなど）経験をしているので、この点は考える必要があるかと思います。

私個人も最適解を持っているわけではないですが、
**やる気のある人材が周囲のそこまでやる気の無い人たちの考えをくみ取る**ことが大切なのかなぁと思いました。

## よりよいコミュニケーションを求めて

今回のセッションでコミュニケーションのベストプラクティスについて明確な解を見つけることが出来なかったですが、ヒントとなる情報を得ることが出来ました。

そのうえで、**コミュニケーションとは何か**を深掘りして考えてみることが大切だと思います。（もしかしたら、本記事も読者とのコミュニケーションの一種かもしれませんが）

今後、ブログでもコミュニケーションなどのポータブルスキルに関しても取り上げていきたいと思いました。


最後まで記事をお読み頂きありがとうございました！
DockerでColdFusion2023の開発環境構築

## はじめに

ColdFusionで開発の話が出てきたので、環境構築をdockerでやってみました。
とくに何も考えず作っています。

とりあえずですが、ColdFusion2023を使いました。

## フォルダ構成

フォルダ構成は以下のような感じにしています。

```
ルートフォルダ
 | docker-compose.yml #composeファイル
 | Dockerfile #Dockerfile
 |ーapp
    |
    index.cfm #indexの表示ファイル

```

![スクリーンショット 2025-02-19 212027.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/544972/aba25d5b-36c4-4422-863a-f2130d5d9e65.png)


## appフォルダのindex.cfm

ひとまず、**index.cfm** のファイルを作成しappフォルダに置くことにします。

```html
<html>
  <head>
    <meta charset="utf-8">
    <title>はろーわーるど</title>
  </head>
  <body>
    ハローワールド
  </body>
</html>

```


## いつものファイルを作成する

まずは、**docker-compose.yml** を作成する

```yaml
services:
    coldfusion: 
        container_name: cf
        build:
          context: ./
          dockerfile: Dockerfile
        image: app
        ports:
          - 8500:8500
        environment:
          - acceptEULA=YES
          - password=admin
          - language=ja
          - LANG=C.UTF-8
        volumes:
          - .:/app

```
## Dockerfileを作成する

**Dockerfile** ファイルを作成する

ColdFusion2023のイメージをダウンロードするようにしておきます。

```dockerfile
FROM adobecoldfusion/coldfusion:latest
```

## docker compose を実行する

```shell
docker-compose up -d
```


## 動作確認

こちらのURLを叩くと先ほど作成の**index.cfm**ファイルが表示できます。

http://localhost:8500/app/

こんな形でブラウザに表示されます。

![スクリーンショット 2025-02-19 211428.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/544972/89306451-95a4-4d99-a49c-f40227adbbb0.png)



## 管理画面

パスワードはdocker-compose.ymlで設定した**admin** でログインできます。

http://localhost:8500/CFIDE/administrator/

![スクリーンショット 2025-02-19 211220.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/544972/94ed50cc-443f-417b-9bb0-4c3da36c42c9.png)
ロジック思考を身に付けたい

# 概要
毎日PaizaのC~B問題をやっているが、一向に上達しない！
なぜ上達できないのか？なぜ自信を持ってプログラミングできないのか？
悔しいので、プログラミングを上達するための考え方を備忘録として記載します。

# 1. 問題を「言葉」で分解して理解する
まず、 「問題を日本語で考える」
プログラムを書く前に、手順や動作を言葉で説明してみる。

例：

「入力で与えられた数字を読み込む」
「各投票番号について、当選番号リストに含まれているか確認する」
「含まれていれば、IDをメモする」
「含まれていなければ-1を出力する」

このように 自然言語で書くことで、コードの全体像 が見えてくる。

💡ポイント
問題の処理が ステップごとに何をすればいいか がはっきりすれば、ロジックも組みやすくなるのではないか。
「分解する→シンプルにする→コードにする」 という流れを意識してみる。

# 2. 小さな単位に分解して考える
問題を解くときに 「一気に解こう」としない。

例：

「まずデータを読み込む」
入力されたデータを、リストや変数に格納する。
「当選番号リストを用意する」
「投票番号を1つずつ調べる」
「当選していればIDを出力する」
これを1つ1つ 正しく動くか確認しながら進める。
すべてを一度に解決しようとすると、エラーやバグに対応しきれなくなる！

# 3. サンプルを作って実験する
ロジックを考えるときは、 具体的な数字で頭の中でシミュレーションする。

例：
当選番号リスト = [765, 876, 961, 346, 315, 283]
投票番号リスト = [13, 39, 52, 346, 190, 49, 283, 28]
手作業で「346」と「283」が当選することを確認する。

頭の中で一度「結果はこうなるはず」と明確にしておくことで、ロジックを組む際の迷いが減る。

# 4. 書いたコードを段階的にテストする
「最後まで書いてから実行する」 という方法は、バグを見つけにくい。
途中経過を出力しながら進める ことで、エラーの原因を早めに発見できる。

まずは、読み込んだデータが正しく表示されるかチェック
次に、1つの投票番号が当選しているか確認
すべての投票番号を調べるループが動いているか確認
途中で print() 文を使って、現在の状態を確認する 習慣を！

# 5. エラーや間違いを成長のチャンスにする
エラーが出たり、解けなかったりするのは誰でもある（はずw）。
重要なのは 「なぜそのエラーが出たのか」を考えること。

NameError → 変数や関数名を間違えている
IndexError → リストの長さを超えたインデックスを参照している
TypeError → 型の違う値を操作している
エラーを 「バグのヒント」 として活用すると、エラーの原因に強くなれ！

# 6. 同じ問題を何度もやる
1度解いた問題を、 1週間後や1か月後にもう一度やることで、考え方を定着させる。
ただやみくもに新しい問題を解くより、 反復して頭の中にロジックを刻む。

# まとめ
- 問題を言葉で説明して、分解して考える
- 小さな単位に分けて順番に処理する
- 実験しながら正しい動きを確認する
- エラーをヒントにして改善していく
- 同じ問題を繰り返してロジックを鍛える
2ヶ月で情報処理安全確保支援士試験に一発合格した勉強法2025

情報処理安全確保支援士試験（RISS）は、日本における情報セキュリティ分野の国家資格であり、難易度の高い試験として知られています。しかし、適切な学習計画と戦略を立てれば、2ヶ月という短期間でも合格を目指すことが可能です。本記事では、2025年版の最適な勉強法を紹介します。
https://hao.cnyes.com/post/135645
https://www.usmle-forums.com/threads/2025-%F0%9F%92%AFverified-salesforce-pdii-exam-pdf-dumps.633165/

1. 学習計画の立て方

まず、試験までの2ヶ月間を以下のように計画します。

1ヶ月目（基礎固め）

試験範囲の把握：過去問や公式サイトの試験シラバスを確認し、どの分野が出題されるかを理解する。

基本書の読み込み：『情報処理安全確保支援士試験対策書』や『公式テキスト』などを使い、基礎知識を習得する。

https://boosty.to/www.passitcertify.com/posts/da80acd3-b6d8-482f-82ed-320ea63de468?share=success_publish_link
https://forums.ngames.com/forum/league-of-angels/community-ab/general-discussion-ab/106322-%F0%9F%92%AFverified-qlik-qsda2024-dumps-exam-questions-2025

用語の暗記：セキュリティ関連の専門用語をしっかり覚える。

過去問演習（午前対策）：5〜10年分の午前問題を解き、出題傾向を掴む。

2ヶ月目（応用と実践）

午後問題の対策：論述問題の解答方法を学び、過去問を解いて練習する。

模擬試験の実施：時間を計って模試を解き、本番の時間配分を意識する。

苦手分野の克服：間違えた問題を分析し、重点的に復習する。
https://ordasoft.com/Forum/Joomla-Real-Estate/49663-First-class-Sitecore-XM-Cloud-Developer-Dumps.html#49663
https://deepstash.com/article/280919/eccouncil-212-89-exam-dumps

2. 効率的な勉強方法

① スキマ時間の活用

通勤時間や休憩時間を活用し、スマホアプリやWebサイトで午前問題を解く。

音声講義を聞き流して、知識の定着を図る。

② アウトプット重視

学んだことをノートにまとめ、視覚的に整理する。

他人に説明するつもりで内容を理解する。
https://www.tapatalk.com/groups/renotalkfr/viewtopic.php?f=49&t=246512&from_new_topic=1
https://armstrong815.pixnet.net/blog/post/176373361
③ グループ学習

SNSやオンライン勉強会を活用し、他の受験者と情報交換を行う。

複数人で議論しながら午後問題の解答を考える。

3. おすすめの参考書・教材

午前対策：

『情報処理安全確保支援士 試験対策テキスト＆問題集』

『過去問道場』（オンライン無料ツール）
https://forum.elonx.cz/viewtopic.php?f=88&t=4131&p=8200#p8200
https://www.zybuluo.com/hapek47186/note/2579339
午後対策：

『情報処理安全確保支援士 午後問題の重点対策』

『論述対策講座』（動画教材）

模試・総合演習：

『情報処理安全確保支援士 模擬試験集』

『オンライン模試』（IT系資格試験サイト）

4. 本番直前の対策

試験直前の1週間は、総仕上げの期間として以下のことを重点的に行いましょう。

午前問題の総復習：直近5年分の過去問を解き直す。

午後問題の記述練習：論述問題の型を再確認し、解答を素早く書く練習をする。

試験当日のシミュレーション：本番と同じ時間割で勉強し、集中力を鍛える。

体調管理：十分な睡眠を取り、試験当日に万全の状態で臨む。

5. まとめ

情報処理安全確保支援士試験は難関資格ですが、戦略的に学習を進めることで、2ヶ月でも合格を目指せます。計画的に勉強し、過去問演習やアウトプットを重視して取り組みましょう。

試験に挑戦する皆さんの成功を願っています！