OmniAICreator/Qiita-1.07M huggingface dataset:
競プロ日記#25/04/21

# アルゴ式-[チーム分け (2)](https://algo-method.com/tasks/755)
- 3つのチームに分ける→nCa * n-aCbで残りCの集団は必然的に1つに決まる
```
// nPmの順列(階乗や0!にも対応)
long long funcPermutation(int N,int M){
    if (N == 0 & M == 0){
        return 1;
    }
    long long ans = 1;
    for (int i = 0;i < M;i++){
        
        ans = ans * (N - i);
        
    }
    return ans;
}

// nCmの組合せ(funcPermutationを使う)
long long funcCombination(int N,int M){
    return funcPermutation(N,M) / funcPermutation(M,M);
}

int main() {
    int N,Xa,Xb,Xc;
    cin >> N >> Xa >> Xb >> Xc;
    cout << funcCombination(N,Xa) * funcCombination(N-Xa,Xb) * funcCombination(N-Xa-Xb,Xc) << endl;

}
```

# アルゴ式-[コイントス (1)](https://algo-method.com/tasks/772)
- これも結局は組合せを求める

# アルゴ式-[ラッキーナンバー (3)](https://algo-method.com/tasks/777)
- 問題の言いかえに気づけなかった
- 「10個の数から7を含むN個の好きな数を選ぶ方法を数える」→「必ず選ばれる7のことを最初に選んだのち、残りのボールの選び方を考える」
```
// nPmの順列(階乗や0!にも対応)
long long funcPermutation(int N,int M){
    if (N == 0 & M == 0){
        return 1;
    }
    long long ans = 1;
    for (int i = 0;i < M;i++){
        
        ans = ans * (N - i);
        
    }
    return ans;
}

// nCmの組合せ(funcPermutationを使う)
long long funcCombination(int N,int M){
    return funcPermutation(N,M) / funcPermutation(M,M);
}

int main() {
    int N;
    cin >> N;

    cout << funcCombination(9, N-1) << endl;
    
}
```

# アルゴ式-[ラッキーナンバー（Ex）](https://algo-method.com/tasks/4be794f0a4c5cde2)
- これも実装はただの順列なのだがとにかく問題をうまく言い換えて実装できるかという話なので
```
// nPmの順列(階乗や0!にも対応)
long long funcPermutation(int N,int M){
    if (N == 0 & M == 0){
        return 1;
    }
    long long ans = 1;
    for (int i = 0;i < M;i++){
        
        ans = ans * (N - i);
        
    }
    return ans;
}

int main() {
    int N,M;
    cin >> N >> M;

    cout << funcPermutation(N,M) << endl;
}
```
# AtCoder

## ABC092_[A-Traveling Budget](https://atcoder.jp/contests/abc092/tasks/abc092_a)
- 特になし
```
int main() {
    int A,B,C,D;
    cin >> A >> B >> C >> D;
    int ans = 0;
    if (A < B){
        ans += A;
    }else{
        ans += B;
    }

    if (C < D){
        ans += C;
    }else{
        ans += D;
    }
    cout << ans << endl;
    
}
```

## ABC092_[B-Chocolate](https://atcoder.jp/contests/abc092/tasks/abc092_b)
- ちょっとややこしかった
```
int main() {
    int N,D,X;
    cin >> N >> D >> X;
    int ans = 0;
    for (int i = 0; i < N; i++) {
        int A;
        cin >> A;
        if (D % A == 0) {
            ans += D / A;
        } else {
            ans += D / A + 1;
        }
        
    }

    cout << ans + X << endl;
}
```
dart アプリ／dart ライブライ用の pubspec.yaml を自動生成する

dart アプリ／dart ライブライ用の pubspec.yaml を自動生成するためのパッケージ(specgen)を作成しました。

https://pub.dev/packages/specgen

以下のページにインストールの方法がかかれています。

[https://pub.dev/packages/specgen/install](https://pub.dev/packages/specgen/install)

## specgen のインストール

specgen は、コマンドラインツールとしてインストールします。

```shell:インストール(バージョンアップ)方法
dart pub global activate specgen
```

上記でインストールされますが、以下のフォルダにパスを通す必要があります(Windowsの場合)。

`C:\Users\【WindowsユーザーID】\AppData\Local\Pub\Cache\bin`

```shell:再インストール方法
dart pub global deactivate specgen
dart pub global activate specgen
```

## specgen の使用方法

### `pubspec.yaml` を生成したいフォルダに移動します。

そのフォルダ配下の bin lib test フォルダ内に dart のソースを入れておきます。(段階的にソースは増やしていけばいいです)

### specgen と入力して ENTER を押します。

```shell
specgen
```

カレントフォルダに `pubspec.yaml` が生成されます。

* bin lib test フォルダ内のソースが参照しているパッケージ名(以下の例では sys と　text_serializer)が pubspec.yaml の依存関係に追加されます。

```dart
import 'dart:core';
import 'dart:io' as io;
import 'package:sys/sys.dart' as sys;
import 'package:text_serializer/text_serializer.dart' as ts;
```

* bin lib test フォルダのソースの import を追加・削除したら、再度 specgen を実行すれば依存関係が自動的に追加・削除されます。

ソースにまだ追加されていないパッケージを依存関係に追加するには以下のようにしてもかまいません。
IDE (IntelliJ Idea など) で編集している場合は、`pubspec.yaml` にパッケージ名を追加しておいたほうが、コンプリーションが効いて便利です。

```shell
dart pub add <パッケージ名> ...
```

ソースに、import 文を追加した後は、specgen を再実行してもかまいません。

specgen に引数("1.0.0" など)を与えると、`pubspec.yaml` 内の `version` がその値になります。
引数を与えないと pubspec.yaml に現在指定している `version` が保持されます。

## 最後に

ちょっと、この記事では魅力が伝わらないかもしれないので、気が向いたらまた説明記事を書きます。
初めてのQiita


# 初めまして
wordpressで書くか、saasサービスを使用するかで迷った挙句、noteを使用してみたが、どうも書きずらい。
日常的にmarkdownを使用してるので、marksownで書けるサイトを探していました。

Qiitaはmarkdown対応してないと記事で読んでたのでちゃんと見てなかったのですが、よくQiitaは利用するのでアカウントを持ってました。
試しに記事作成したら、markdownで作れるではありませんか！！！

頑張って移行します😭

# 方針について
備忘録のような形にしたいなと思っています。
私の趣味は以下の通りです。
- ガジェット（PCや周辺機器）
- 車
- AI
- プログラミング

まず、初の自作PCについてまとめようと思います。
AIで開発するVibeCoding：5つのカテゴリに分類


# Vibe Coding とは

自然言語と AI を使ってコードを生成する手法のことを指します。
2025 年 2 月に OpenAI の共同創設者である Andrej Karpathy が[X で提唱しています](https://x.com/karpathy/status/1886192184808149383)。

AI による開発は急速に拡大しており、  
Y Combinator（シリコンバレーのアクセラレータープログラム）参加スタートアップの約 25%は、ソースコードの 95%以上を AI で生成していると言われています。 また、Google でも新規コードの 25%が生成 AI によるものとされています。

https://leaddev.com/hiring/95-ai-written-code-unpacking-the-y-combinator-ceos-developer-jobs-bombshell#:~:text=The%20CEO%20of%20famed%20Silicon,%2C%E2%80%9D%20Garry%20Tan%20told%20CNBC

https://arstechnica.com/ai/2024/10/google-ceo-says-over-25-of-new-google-code-is-generated-by-ai/

# Vibe Coding ツール

VibeCoding ツールは、以下の 5 カテゴリに分類することができます。

### 1. AI 統合 IDE 型

AI が開発プロセスを支援する統合開発環境（IDE）で、コード補完、生成、タスク自動化などを可能にします。

代表ツール

- [Cursor](https://www.cursor.com/en)
- [Windsurf](https://windsurf.com/editor)
- [Trae](https://traeide.com/)

### 2. コード支援型

既存の IDE（VS Code、JetBrains IDEs など）に AI プラグインを追加して使用します。この時、コード補完、リファクタリングなどを支援します。

代表ツール

- [Github Copilot](https://github.com/features/copilot)
- [Cody (Sourcegraph)](https://sourcegraph.com/cody)
- [JetBrains AI](https://www.jetbrains.com/ai/)
- [Gemini Code Assist](https://codeassist.google/)

### 3. アプリ生成型

UI・DB・デプロイまですべて自動で構築できる開発ツールです。Web 上で実行が完結します。

代表ツール

- [Replit Agent](https://replit.com/?utm_source=chatgpt.com)
- [Bolt.new](https://bolt.new/)
- [Lazy AI](https://getlazy.ai/)
- [Tempo](https://www.tempo.new/)
- [Lovable](https://lovable.dev/)
- [v0](https://v0.dev/)

### 4. エージェント実行型

チケットを渡すだけで、設計 → 実装 → テスト → PR 提出まで行う高度なツール群です。

代表ツール

- [Devin](https://devin.ai/)
- [Sweep](https://github.com/sweepai)
- [Fine.dev](https://www.fine.dev/)
- [Copilot Workspace](https://githubnext.com/projects/copilot-workspace)
- [Cline](https://cline.bot/?utm_source=chatgpt.com)

### 5. CLI エージェント型型

ターミナル上でコードの生成や編集、テスト、デプロイなどを行います。

代表ツール

- [Claude Code](https://docs.anthropic.com/ja/docs/agents-and-tools/claude-code/overview)
- [Codex CLI](https://github.com/openai/codex)
- [Aider](https://aider.chat/)

# まとめ

自分なりに Vibe Coding ツールを大きく分類分けしてみました。AI の進化とともにこの分類わけも変化したり、新しい概念のツールが生まれる可能性もあります。
最新のツールや事例をキャッチアップをして Vibe Coding を活用しましょう！
Rails モデルオブジェクトの戻り値

# 最近学んだこと=>戻り値の種類（クラス）が異なる
データーベースからデータを取り出すとき、find_byメソッドとwhereメソッドでは返すオブジェクトの数や種類が異なる。
## find_byメソッド
User.find_by(id: 1)などの構文で返すオブジェクトは単一オブジェクト(一件のレコード)またはnilを返します。
```ruby
User.find_by(id: 1)
=> #<User:0x0000000120479610
 id: 1,
 name: "foo bar",
 email: "[FILTERED]",
 created_at: "2025-04-17 00:31:48.479165000 +0900",
 updated_at: "2025-04-21 15:08:39.117244000 +0900",
 password_digest: "[FILTERED]",
 remember_digest: nil>
```

## whereメソッド
User.where(id: 1)とした場合、条件に一致するオブジェクトを返します。([]配列のようになっているのも特徴)
```ruby
User.where(id: 1)
=> 
[#<User:0x0000000120472f90
  id: 1,
  name: "foo bar",
  email: "[FILTERED]",
  created_at: "2025-04-17 00:31:48.479165000 +0900",
  updated_at: "2025-04-21 15:08:39.117244000 +0900",
  password_digest: "[FILTERED]",
  remember_digest: nil>]
```
返すオブジェクトも見ためにはほぼ一緒ですが、違いがありそれは、find_byメソッドはそのモデルオブジェクト（ここではUserモデルのオブジェクト）を返すのに対し、whereメソッドはActiveRecord::Relationというオブジェクトを返している点です。
また複数の結果がある場合には配列になって返されるので、最初の一件だけを取得する場合にはfirstメソッドを繋いであげると、取得した1件のオブジェクトをform_withなどで使えるようになります。

初学者からしてみると、find_byやwhereメソッドどちらとも裏でSQL分が発行され、似たような結果を返しますが、返るオブジェクトに違いがある・それによって後で使用するメソッドも正しく書かないと例外が発生してしまう。Railsはやはり難しくてでも面白いところだと感じました。
Delta Lake UniFormを使用してIcebergフォーマットでテーブルを出力

## 前提
・利用環境：Databricks、AWS

https://www.databricks.com/jp/try-databricks?scid=7018Y000001Fi15QAC&utm_medium=paid+search&utm_source=google&utm_campaign=17377047998&utm_adgroup=138148229998&utm_content=trial&utm_offer=try-databricks&utm_ad=732035937815&utm_term=databricks%20%E3%83%88%E3%83%A9%E3%82%A4%E3%82%A2%E3%83%AB&gad_source=1&gclid=CjwKCAiA8Lu9BhA8EiwAag16b8b3zbkIb3V7gp-8VUwKukXnhtVZRQ-1RY8SbETmGVgNT4bQramYmRoCX5wQAvD_BwE#account

https://aws.amazon.com/jp/free/?gclid=CjwKCAiA8Lu9BhA8EiwAag16bz9ymovIOJzlwFFMfg75NQxxY8FJPB4Hslg7RheD7ipZ5gbvOWCd1RoCyP0QAvD_BwE&trk=8a8e7906-914d-4577-93a2-d09e75ae5941&sc_channel=ps&ef_id=CjwKCAiA8Lu9BhA8EiwAag16bz9ymovIOJzlwFFMfg75NQxxY8FJPB4Hslg7RheD7ipZ5gbvOWCd1RoCyP0QAvD_BwE:G:s&s_kwcid=AL!4422!3!487544183224!e!!g!!aws%20%E7%84%A1%E6%96%99%E5%88%A9%E7%94%A8%E6%9E%A0!11772965715!117413644991&all-free-tier.sort-by=item.additionalFields.SortRank&all-free-tier.sort-order=asc&awsf.Free%20Tier%20Types=*all&awsf.Free%20Tier%20Categories=*all

## 参考
https://docs.databricks.com/aws/ja/delta/uniform
## 手順
1)「ワークスペース」→「作成」→「ノートブック」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562390/7b3c16f7-ffe3-4c02-a5fe-213713a3e3cc.png)
2)デフォルトの言語をSQLに変更し、Uniform出力用のSQL文を作成
例：
CREATE table if not exists `ho-cdc`.cdc.transactions_gold_iceberg as select * from `ho-cdc`.cdc.transactions_gold;

ALTER TABLE `ho-cdc`.cdc.transactions_gold_iceberg SET TBLPROPERTIES(
  'delta.enableDeletionVectors' = 'false');

ALTER TABLE `ho-cdc`.cdc.transactions_gold_iceberg SET TBLPROPERTIES(
  'delta.columnMapping.mode' = 'name',
  'delta.enableIcebergCompatV2' = 'true',
  'delta.universalFormat.enabledFormats' = 'iceberg');
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562390/996e67c4-b75d-4384-aa38-7d49d2344f89.png)
3)S3にiceberg読み取り用のMetaデータが作成されてることを確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562390/097fffb6-b4fe-4b63-a15f-fa0b3f2f7eb2.png)
以上
DevContainer使っていたらGitHub Container Registryに怒られた

# 概要
色々コンテナbuildしていたらGitHub Container RegistryのLate Limitに達してしまい devcontainerのbuild中にエラーとして表示されていただけだった

どうしようもないのでゲームする…

## エラー内容
devcontainerで開発環境を作っていたら
```
failed to solve: failed to resolve source metadata for docker.io/library/dev_containers_feature_content_normalize:latest: pull access denied, repository does not exist or may require authorization: server message: insufficient_scope: authorization failed
```
今まで使えていた`ghcr.io/devcontainers/features/github-cli`が急に認証エラーになりdevcontainerのbuildが進まない状態になっていた…

 ## 色々調べると
 Dockerが悪いんだの、DockerDesktopの設定がわるいだのMicroSoftのDNSの設定が悪いだの出てきましたが、
 ghcrへアクセスできるか試したら、
 ```bash 
 $ curl -I https://ghcr.io/v2/devcontainers/features/github-cli/manifests/1

HTTP/2 401 
content-type: application/json
www-authenticate: Bearer realm="https://ghcr.io/token",service="ghcr.io",scope="repository:devcontainers/features/github-cli:pull"
date: Mon, 21 Apr 2025 15:26:52 GMT
content-length: 73
x-github-request-id: 1B4B:52F97:206165:2B4E3D:680663BC
```
通常は public な feature なので認証不要なんだけど、これは…

## 対応策
1. ghcrへloginしよう！
2. ゲームして6時間待つ！
VIVE Hubを捨ててALVRを使おうシリーズ　ボイスチェンジャー編

**ALVRはVirtual Desktopのようなストリーミングソフトです**

HTC VIVE系のヘッドセットでVD（Virtual Desktop）を使うとフルフェイストラッキングが使えません。そこで私はVIVE XR EliteでALVRを使用しています。

今回はALVRでボイスチェンジャーを使用する方法です。

ALVRはシステムで仮想オーディオのVB Cableを使用するため、VB Cableを使って音声をボイスチェンジャーソフトへバイパスすることができません。
追加のVB Cableがあればよいので以下を購入します。
https://shop.vb-audio.com/en/win-apps/12-vb-cable-ab.html?SubmitCurrency=1&id_currency=1

![VB_Cable_AB.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201026/5015ee8b-9044-47bd-8d36-1f7c19122261.png)

15ユーロですので￥2,500.-程です。

インストールは「管理者として実行」で行ってください。
![管理者権限.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201026/cb608b44-d2a7-4d08-8086-7d2816a07fba.jpeg)


これを用いて以下のような接続にします。
![配線図.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201026/d014babf-d6c2-47b8-9f54-f335d9de5416.png)

実際の設定画面は以下のようになっています。

![ALVR_Voice.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201026/15051f1d-77ed-43cb-aae9-ad8a5723e035.png)
![Shift_Voice.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201026/59956670-40a9-45ba-b55a-b87b6495791b.png)
![SteamVR_Voice.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201026/a2fdbe80-f926-48f2-8d44-e8b07a5e721b.png)


以上。これでボイスチェンジャーが使えます。
Next.jsでのデータフェッチの方針

## 結論

僕は以下のように考えています。
- useEffect内ではfetchは行わない
- アプリケーション全体でTanStack QueryかSWRを使うのが丸い

## そう思う理由

結論に辿りついた道筋を説明します。

まず、[React公式 useEffectの説明](https://ja.react.dev/reference/react/useEffect#fetching-data-with-effects)で、以下のように書いてあります。
> エフェクトを使って、コンポーネントに必要なデータをフェッチ（fetch, 取得）することができます。ただしフレームワークを使用している場合は、エフェクトを自力で記述するよりも、フレームワークのデータフェッチメカニズムを使用する方がはるかに効率的であることに注意してください。

NextJSでいうと、「Server Componentsでデータフェッチしてください。もちろんfetchAPIは使用しても全然良いです。」という意味だと受け取っていて、そうするべきだと思っています。

一方で、token認証を使用していたり、何らかの理由があったりとかなかったりとかでClient Componentsでデータフェッチをする必要があるかもしれません。
ここで、[Client Componentsはasync関数にできない](https://nextjs.org/docs/messages/no-async-client-component)のです。
つまり、Server Componentで行う以下のようなデータフェッチはできません(async await使えないから)。

```javascript
'use client'

// この関数はエラーとなる
export default async function Sample() {
  const data = await fetch('url')
  // 以下略
}
```

then構文使えばできるとは思うけど、アプリ全体で書き方は統一したいしなぁと(これは甘えなのか？)。
ここまで来て、確かにfetchAPIを使ってuseEffectをasync関数にして、その中でデータフェッチをしようという発想になります。

ただ、[React公式の説明](https://ja.react.dev/reference/react/useEffect#fetching-data-with-effects)は以下のようなことも言っています。

> フレームワークを使用している場合、組み込みのデータフェッチ機構を使用してください。モダンな React フレームワークには、効率的で上記の欠点がないデータフェッチ機構が統合されています。
それ以外の場合は、クライアントサイドキャッシュの使用や構築を検討してください。一般的なオープンソースのソリューションには、React Query、useSWR、および React Router 6.4+ が含まれます。自分でソリューションを構築することもできます。その場合、エフェクトを内部で使用しつつ、リクエストの重複排除、レスポンスのキャッシュ、ネットワークのウォーターフォールを回避するためのロジック（データのプリロードやルーティング部へのデータ要求の巻き上げ）を追加することになります。

今回はこの説明における「それ以外は」の部分に当てはまると考えています。
とすると、useEffectでデータフェッチをするのではなくTanStack QueryかSWRを使うのが良い気がする。
なので、以下のような方針が定まってきました。

- Server ComponentsではfetchAPIでデータフェッチをする
- Client ComponentsではTanStack QueryかSWRでデータフェッチをする

これでもまぁ良いには良いけども、という感じですが、流石にデータフェッチのライブラリは統一したいなぁという気持ちです(管理とか面倒だし)。
その気持ちより、以下の結論に辿りつきました。

**コンポーネントの種類に関係なく、データフェッチはTanStackQueryとかSWRを使う**


## 最後に

今回の結論の方針を採用すると、余程のことがない限りuseEffect内でデータフェッチをすることはないし、多分公式の方針に沿っているのかなとは思っています。
結構な人が当たり前のようにこの方針を採用していると想像はしているけども、この結論にたどり着くまでを言語化する作業は楽しかったです。

あくまで私見です。
誤りがあれば避難ではなく指摘、提案してください。
macOSシステム設定：US 配列 キーボードマッピング

Macbook US 配列 と HHKB US 配列 を快適に使うキーボードマッピングの設定方法をまとめます。

macOS は コントロール + スペースで かな <-> 英字 と切り替えが可能です。
自分は、左コントロール（単独） -> 英字、右シフト（単独） -> かな に切り替えで運用しています。 

- macOS システム設定のキーボード修飾キーの設定
- Karabiner-Elements アプリで かな入力と英字入力の切り替えを設定

1. Karabiner-Elements アプリをインストールします
https://karabiner-elements.pqrs.org

インストールが終わったら、アナウンスに従ってバックグラウンドでの実行の許可、入力監視の許可をします。

`~/.config/karabiner/karabiner.json` にコピペします。
``` js
{
    "global": { "show_in_menu_bar": false },
    "profiles": [
        {
            "complex_modifications": {
                "rules": [
                    {
                        "description": "Right Shift alone -> Kana",
                        "manipulators": [
                            {
                                "from": {
                                    "key_code": "right_shift",
                                    "modifiers": { "optional": ["any"] }
                                },
                                "to": [{ "key_code": "right_shift" }],
                                "to_if_alone": [{ "key_code": "japanese_kana" }],
                                "type": "basic"
                            }
                        ]
                    },
                    {
                        "description": "Left Control alone -> Eisu",
                        "manipulators": [
                            {
                                "from": {
                                    "key_code": "left_control",
                                    "modifiers": { "optional": ["any"] }
                                },
                                "to": [{ "key_code": "left_control" }],
                                "to_if_alone": [{ "key_code": "japanese_eisuu" }],
                                "type": "basic"
                            }
                        ]
                    }
                ]
            },
            "name": "Default profile",
            "selected": true,
            "simple_modifications": [
                {
                    "from": { "key_code": "caps_lock" },
                    "to": [{ "key_code": "left_control" }]
                }
            ],
            "virtual_hid_keyboard": { "keyboard_type_v2": "ansi" }
        }
    ]
}
```

2.  macOS システム設定のキーボード修飾キーの設定

- Apple内蔵キーボード
![スクリーンショット 2025-04-22 0.25.11.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3994399/f365530e-c260-41f4-9c50-bcced3e19095.jpeg)

- Karabiner DriverKit
![スクリーンショット 2025-04-22 0.25.23.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3994399/74aea770-297b-428b-9e11-61bb22f4a9fb.jpeg)

- HHKB
![スクリーンショット 2025-04-22 0.25.28.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3994399/4a953173-951d-4627-829d-7c1e4df63955.jpeg)

それぞれのキーボードを設定すれば OKです。
JavaScript勉強ログ 文字列テンプレートリテラル

String型の理解

テンプレートリテラル
文字列を書く方法

文字列をバッククォートで囲む。
\`${}\`の中に変数を入れると、その値を文字列中に埋め込むことが出来る、
\`${変数}\`

```js
let menu = "蕎麦";
let str = `注文は${menu}です。`;
console.log(str);
//注文は蕎麦です。
```

メモ：テンプレートリテラル内は、そのまま改行を入れられる。
C言語　int a, b, c, d ≒ int a[4] ??

アセンブリ言語の確認及び実行に使用するサイト
https://godbolt.org/

## 比較
### int a=1, b=2, c=3, d=4
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4054974/72af736a-f7c9-4a87-8fcf-ca733e002d8e.png)

### int a[4]
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4054974/39a6a1a2-0bb9-4fe3-8e55-ca1f215e5450.png)

### 考察
配列と並べて宣言した場合ではメモリ上での順番が違っている。

## int a=1, b=2, c=3, d=4を配列のようにポインタで指定
メモリ上での順番がa,d,c,bとなっているのでポインタをaに合わせて無理矢理a,b,c,dの順番で表示させる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4054974/07678d1f-80d7-4cf1-8b01-6a6b5d3afb1b.png)

```test.c
#include <stdio.h>

int main(){
	int a=1;
	int b=2;
	int c=3;
	int d=4;
	
	int *e = &a;
    printf("%d\n", *e);                          // a (1)
    printf("%d\n", *(int*)((char*)e + 24));      // b (2)
    printf("%d\n", *(int*)((char*)e + 20));      // c (3)
    printf("%d\n", *(int*)((char*)e + 16));      // d (4)
	
	return 0;
}
```
```実行結果.bash
1
2
3
4
```
int a=1, b=2, c=3, d=4 と int a[4]は全く同じになると思っていましたが、実際に宣言した順番にメモリ上に置かれる訳ではないことが分かりました。
だから何だという話ですが、只の実験です。
gooブログにあるブログの全エントリーを wget でリップしたい場合のTIPS

(この記事では、 Linux Mint 22.1 にインストールした GNU Wget 1.21.4 built on linux-gnu. を端末エミュレーターで使っています。)
goo ブログが今年 2025/11/18 に終了すると発表されました。
https://stysk.com/posts/2024/04/01/download_entire_website_using_wget/
を参考にして、
<pre>$ cd ${HOME}/site-rips/
$ wget --no-check-certificate -m -np -k -p -b -e robots=off -w3 [リップしたいブログのURI。]</pre>

というコマンドでブログ全体をダウンロードしようとすると、 [リップしたいブログのURI。] が

<pre>https://blog.goo.ne.jp/(ブログID)</pre>

で、最後に / がつかないため、 -np オプションで、親ディレクトリーをダウンロードしないよう指定しても、元サイト自体が https://blog.goo.ne.jp/ 直下のページと wget に認識されるので、 blog.goo.ne.jp 全体をダウンロードしようとしてしまい、リップしたいブログのエントリー全てをダウンロードしないまま、他のブログに行ったりしてしまいます。
なので、 [リップしたいブログのURI。] の代わりに、 

<pre>https://blog.goo.ne.jp/(ブログID)/e/(あるエントリーのID。1個で多分良い。)</pre>

という構造の、リップしたいブログのあるエントリーのURIをダウンロード元の1個として指定して、

<pre>$ wget --no-check-certificate -m -np -k -p -b -e robots=off -w3 https://blog.goo.ne.jp/(ブログID)/e/(あるエントリーのID。1個で多分良い。)</pre>

とコマンドを打つと、リップしたいブログの各エントリーだけクロールしてくれます。
-p オプションは、HTMLを表示するのに必要なすべての画像等も取得するもののようですが、ブログエントリーの画像は blogimg.goo.ne.jp にあるために、直接ダウンロードされない模様です。
しかしながら、
<pre>perl -nle 'my @l = split /\"/;foreach my $line(@l){print $line if($line =~ m{^https://blogimg.goo.ne.jp/})}' (ブログエントリーのダウンロードされているディレクトリー)/* | sort -u | perl -nle 'my $line = $_;s#^https://##;print $line if(!-f $_);' | wget -x -i - -c</pre>

で、ブログの各エントリーに投稿された画像のURIを抽出してダウンロードできます。(ダウンロードするディレクトリはお好みで。移動してからコマンドを打つといいでしょう。)
最近やったスクレイピングでテックブログを書いてみる

はじめての投稿ですので、内容の薄いものと思われますがご容赦ください。

# やったこと
・某飲食店レビューサイトのスクレイピング
・CSVファイルに取得項目を一覧保存

# 開発に至った経緯
私自身、エンジニアとして2年業務に携わってきて「そろそろ副業とかやりたいな」などふわっと考えておりました。そこで某スキルマーケットサイトや案件検索のサイトで案件を眺めていたところスクレイピングというものがあることを知りました。
それを見て、「これならできそうだし、記事にすればポートフォリオとしても使えるかも。。。」と考え、作成することを決めました。（なお、実務では開発しているものの、見せることのできるポートフォリオがないため発注には至りませんでした＾＾）

# 使用技術
・Python -v 3.12.6
　・beautifulsoup4 -v
　・requests -v 2.32.3

# やってみて
結構簡単というか、かなり簡単でした。
スクレイピングにあたり、気をつけたのは下記のとおりです。

**・対象サイトのrobots.txt（スクレイピングする際の規約のようなもの？）を確認すること**
 　→こちらについては、スクレイピングを禁止しているエリアがある場合があるので確認しましょう。確認するには、ブラウザで「対象サイトのドメイン名\/robots.txt」で確認できます。
  
**・短時間でのスクレイピングは、サーバー負荷がかかるため最低でも1秒はあけること**
　　→こちらについては参考にさせていただいたエンジニアインフルエンサー様が言っておりました。まあ、そりゃあそうという感じではあります笑
  
# 今後について
今回は思いつきでの記事作成ということもあり拙い文章＋コードを記載していないというなんとも言えない記事になりました。今後は業務で触っているAWSやAzure、SnowflakeやC#やPython等々についても自分の成長記録として投稿していければと思います。


閲覧頂きありがとうございました🙇‍♂️
【Mac】ステータスメニューのアイコンの間隔を調整する方法

## 調整方法

ターミナルで以下のコマンドを実行します。

- 間隔を `12` に設定

```terminal
defaults -currentHost write -globalDomain NSStatusItemSpacing -int 12
```

- パディングを `8` に設定

```terminal
defaults -currentHost write -globalDomain NSStatusItemSelectionPadding -int 8
```

設定できているか確認します。

```terminal
$ defaults -currentHost read -globalDomain NSStatusItemSpacing
12
```

```terminal
$ defaults -currentHost read -globalDomain NSStatusItemSelectionPadding
8
```

ログアウトし、再度ログインします。

すると以下のようにステータスメニューのアイコンの間隔が狭くなります。

![before-after-232.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342443/2fd02eed-a859-44b3-9374-5846cd9d0e7f.gif)

## デフォルトに戻す

デフォルトの間隔に戻すには以下のコマンドを実行します。

```terminal
defaults -currentHost delete -globalDomain NSStatusItemSpacing
```

```terminal
defaults -currentHost delete -globalDomain NSStatusItemSelectionPadding
```

ログアウトして再度ログインします。
Nest.js  その６　todos.service.ts


<br><br>
todos.service.ts
Nest.jsでビジネスロジック（データの取得・保存など）を担当するファイル
```typescript
import { Injectable } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { DeepPartial, Repository } from 'typeorm';
import { CreateUserDTO, UpdateUserDTO } from '../dto/user.dto';
import { TodosEntity } from '../entities/todos.entity';
import { CreateTodoDTO, UpdateTodoDTO } from 'src/dto/todos.dto';
import { UsersEntity } from 'src/entities/users.entity';

@Injectable()
export class TodosService {
  constructor(
    @InjectRepository(TodosEntity)
    private readonly todosRepository: Repository<TodosEntity>,

    @InjectRepository(UsersEntity)
    private readonly usersRepository: Repository<UsersEntity>,
  ) {}

  async createOne(dto: CreateTodoDTO): Promise<TodosEntity> {
    return await this.todosRepository.save(dto);
  }

  async readAll(): Promise<TodosEntity[]> {
    return await this.todosRepository.find();
  }

  async readOne(id: number): Promise<TodosEntity | null> {
    return await this.todosRepository.findOneBy({ id: id });
  }

  async readTitleOne(title: string): Promise<TodosEntity | null> {
    return await this.todosRepository.findOneBy({ title: title });
  }

  async updateOne(todo: TodosEntity, dto: UpdateTodoDTO): Promise<TodosEntity> {
    return await this.todosRepository.save({
      ...todo,
      ...dto,
    } as DeepPartial<TodosEntity>);
  }

  async deleteOne(todo: TodosEntity): Promise<TodosEntity> {
    return await todo.remove();
  }
}
```
Nest.js その５　todos.module.ts



<br><br>
todos.module.ts
todos.module.ts は NestJS の「モジュール（機能のかたまり）」を定義するファイル
Todo機能の入口（設定ファイル）みたいな役割
```typescript
import { Module } from '@nestjs/common';
import { TodosController } from './todos.controller';
import { TypeOrmModule } from '@nestjs/typeorm';
import { TodosEntity } from 'src/entities/todos.entity';
import { TodosService } from './todos.service';
import { UsersEntity } from 'src/entities/users.entity';

@Module({
  imports: [TypeOrmModule.forFeature([TodosEntity,UsersEntity])],
  controllers: [TodosController],
  providers: [TodosService],
})
export class TodoModule {}
```
AWS Cloud Formationのスタック一覧作成の一部自動化した話

# 1. はじめに

PJにてS-in後の運用移管を行うにあたり、Git Hubで管理しているYAML(AWS Cloud Formationのスタック作成用ファイル)とそのYAMLで作成するスタック名、そのスタックによって作成されるAWSのリソースの一覧表を作成する必要があった。

全部で4基盤あり、スタック数は200近く、とても手作業で1つずつ確認して記載していては終わらない。

そこである程度のひな型はExcelで一覧表を作成したうえで、スタックが作成するリソースのResource TypeとResource IDの情報を一括で取得し、そのままExcelに添付できるように試みた。

本記事はこの時使用したスクリプトを紹介する。

# 2. スクリプト本文
```
#!/bin/bash

# スタック名のリスト
STACK_NAMES=(
  "XXXXXX"
  "YYYYYY"
  "ZZZZZZ"
)

# 各スタックのリソースを取得

for STACK in "${STACK_NAMES[@]}"; do
  echo "===== Stack: $STACK ====="
  aws cloudformation list-stack-resources \
    --stack-name "$STACK" \
    --query "StackResourceSummaries[*].[ResourceType,PhysicalResourceId]" \
    --output text | awk '{print $1 " " $2}'
  echo
done
```
## 解説

まずスタックのリストを作成する。
（AWSアカウント内のスタック名をXXXXXに置き換える。)
`STACK_NAMES=(
  "XXXXXX"
  "YYYYYY"
  "ZZZZZZ"
)`

スタックリストから1つずつスタックを取り出し、echo以下の処理を行う。
`echo  "===== Stack: $STACK ====="` は表示を分かりやすくする工夫である。

AWS CLIでスタックの情報を取得している。query以下を修正すれば、今回以外の値を取得することも可能。
今回は、Resourece TypeとResourece IDを取得。
`aws cloudformation list-stack-resources \
    --stack-name "$STACK" \
    --query "StackResourceSummaries[*].[ResourceType,PhysicalResourceId]" \`

Excelに転記する際に、スペース(半角1文字)で列に分割する機能を使用して、転記しやすいように、以下で出力を整える。

`awk '{print $1 " " $2}'`

# 3. 今後

今回は一部の自動化にとどまったが、今後はスタック名をまずAWS CLIで自動で取得し、そのリストに対して、上記の処理を行いたい。(今回手動で実施した部分の自動化)
ExcelにはGit HubのYAMLファイルの一覧とスタックの一覧を対応させているため、Git HubからYAMLの一覧を対象リポジトリ、ブランチから取得し、Excelに転記するプログラムも組みたい。
これらを組み合わせることで、実行すれば自動でYAMLとリソースの対応一覧表を作成する機能を作成できる。
これにより定型作業の大幅なカットになり、そのほかの運用業務に注力できる。
【初心者向け】「要件定義」「機能要件」「非機能要件」に何を書けばいいの？

##  はじめに

新たな業務システムを発注・導入する際、「要件定義」や「機能要件」「非機能要件」など、似たような言葉が飛び交い、混乱する方も多いのではないでしょうか？

本記事では、これらの言葉の違いや役割を、例を交えてやさしく解説します。


##  この記事でわかること

- 「要件定義」「機能要件」「非機能要件」の違い
- (余談)「システム構成（方式設計）」との関係



## 1. 要件定義とは？

### ■ 意味：
住民サービスや庁内業務の中で「何を改善したいか」「どんな課題があるか」を整理する工程です。

### ■ 家で例えると：
> 「子どもが生まれたので部屋を増やしたい」「在宅勤務用の書斎がほしい」など、**暮らしの理想や困りごとを伝える段階**です。

### ■ 実例（住民異動処理のデジタル化）：
- 課題：紙申請／転記作業が多くミスが発生している
- 理想：住民情報を一元管理し、庁内で情報連携可能にしたい


## 2. 機能要件とは？

### ■ 意味：
システムが「どのような機能を持っているべきか」という具体的な仕様です。

### ■ 家で例えると：
> 「キッチンにはIHコンロ」「洗面所に乾燥機付き洗濯機」など、**具体的に欲しい設備や部屋を指定する段階**です。

### ■ 主な記述項目（例）：

| 機能名       | 内容                                       |
|------------|--------------------------------------------|
| 検索機能     | 氏名や住所で住民情報を検索できる             |
| 登録機能     | 新たな住民情報を登録できる                   |
| 連携機能     | 税・保険システムと情報を自動連携する           |


## 3. 非機能要件とは？

### ■ 意味：
「どれだけ速く・安全に・安定して」システムが動くか、といった**品質面の要件**です。

### ■ 家で例えると：
> 「断熱性が高くて冬でも暖かい」「耐震等級3で安心」「通信環境が速い」など、**快適さや安心感に直結する“性能”に関わる部分**です。

### ■ 主な記述項目（例）：

| 分類       | 要件例                                          |
|------------|--------------------------------------------------|
| 性能       | 検索結果は3秒以内で表示されること                   |
| 可用性     | 年間稼働率99.9%以上、深夜は保守時間を除く           |
| セキュリティ | 通信はすべてSSL暗号化、二要素認証導入               |
| 拡張性     | 利用者数が2倍に増えても処理速度が落ちない設計         |


## 4. システム構成（方式設計）とは？

### ■ 意味：
これまでの要件（やりたいこと・欲しい機能）を**どんな仕組み・構成で実現するか**を検討する工程です。

### ■ 家で例えると：
> 「鉄筋コンクリートにする」「太陽光パネルを屋根に設置する」「配線は壁内に通す」など、**具体的な施工・技術的構造の話**にあたります。

### ■ 記述内容の例：

| 項目           | 例                                      |
|----------------|-----------------------------------------|
| クラウド／オンプレ | LGWAN対応クラウドを利用（庁内アクセス制限あり）     |
| サーバ構成       | 冗長構成（2台構成）、バックアップ毎日実施             |
| DB設計          | RDB（PostgreSQL）を使用                   |
| 認証連携        | 庁内ADとSSO連携、アクセスログ取得を実施              |


## 5. 各文書の役割と粒度比較

| 区分            | 担当          | 粒度       | 役割・記載例                               |
|----------------|---------------|------------|---------------------------------------------|
| 要件定義書       | 業務部門＋情報政策課 | 中〜粗     | 何がしたいか（業務課題・改善方向）             |
| 機能要件書       | 発注者＋ベンダー    | 詳細       | 画面／操作／入力／出力などの具体的仕様         |
| 非機能要件書     | 発注者＋ベンダー    | 詳細       | 性能、安定性、セキュリティ要件など             |
| システム構成案    | 情報政策課＋ベンダー | 技術的詳細 | クラウド構成、認証方式、インフラ設計            |


## ✅ まとめ

- **要件定義**＝業務上の課題と理想の明確化（暮らしの希望）
- **機能要件**＝具体的に何ができるか（どの設備を付けるか）
- **非機能要件**＝使い勝手や性能、安全性（快適で安心な住環境）
- **システム構成**＝実現のための技術的手段（どう作るか）

これらの要素は、システム導入を成功に導くための「設計図」にあたります。  
まずは、“業務で本当に困っていること”を丁寧に言葉にすることから始めましょう。  
**誰かが「使って良かった」と思える仕組みは、こうした丁寧な整理から生まれます。**

複雑に見えるものも、解きほぐせば必ず形になります。まずは目の前の一歩から始めましょう🍀
Linuxのシンボリックリンクについて

# シンボリックリンクについて

皆さんは、シンボリックリンクついてはご存じですか。
私はインフラエンジニア歴2年ですが、今年の3月の案件を迎えるまで名前しか聞いたことがありませんでした。

## 最初の印象

最初シンボリックリンクと聞くと、何かWindowsでいうショートカットをLinuxのディレクトリに構成するものだと想像しておりました。
他のエンジニアの方から聞いたり、実際の実用例を見てみると似て非なるものだと認識しました。

まずは以下表にて、違いについて記載いたします。


---
| 項目| シンボリックリンク（Linux） | ショートカット（Windows）|
|:-----|:-----|:-----|
|中身|リンク先のパスだけを保持する|特殊なファイル形式（.lnkファイル）で、リンク先情報やアイコン情報を持つ|
|動き|本当にリンク先ファイル/ディレクトリの代わりのように動作する|あくまで「ショートカットを開く」という動作になる（元ファイルとは別物）|
| コマンドライン操作 | そのまま本体扱いできる（例えば`cd シンボリックリンク`） | ショートカットファイルとして見えるだけで、本体にはならない |
| ファイル消失時の挙動 | 元ファイルが消えると「壊れたリンク」になる（エラー） | 元ファイルが消えると、ショートカットエラーになる（ダブルクリックでエラー） |

表だけではいまいちわかりが悪いので、例を用いて説明してみます。

## 例:コマンドラインでの使用

 - Linuxでは、たとえば /home/user/file.txt のシンボリックリンクを作ったら、
cat link_to_file.txt みたいにリンクを本体と同じように操作できる。

 - Windowsでは、file.txtのショートカットを作っても、コマンドラインでそのショートカットを開こうとすると単なる.lnkファイルとして扱われる。


## 感覚的に一度まとめてみる

ざっくりまとめてみると・・・

- **Linuxのシンボリックリンクは「本当に本体のように動作するリンク」である。**
- **Windowsのショートカットは「本体にジャンプするためのファイル」である。**

というイメージにするとよいかもしれない。



## appendix
### さらに深掘りしてみる

## さらに深掘り：「ハードリンク」との違い

Linuxには「ハードリンク」という仕組みも存在する。  
**シンボリックリンクとハードリンク**は以下のような違いがある。

| 項目 | シンボリックリンク | ハードリンク |
|:----|:--------------------|:------------|
| 指しているもの | ファイルへのパス（間接的に指す） | ファイルそのもの（データ領域そのもの） |
| 元ファイル削除時の挙動 | リンク切れになる（エラー） | ハードリンクは生きている（内容は残る） |
| 作成対象 | ファイル・ディレクトリどちらも作成可能（※ディレクトリは制限あり） | 基本的にファイルのみ（ディレクトリへのハードリンクは通常禁止） |
| 跨げる範囲 | ファイルシステムをまたげる（例：別パーティションでも可能） | 同一ファイルシステム内のみ |

### イメージ図

```
[シンボリックリンク]
リンクファイル → 本体ファイルパス

[ハードリンク]
別名のファイル ＝ 本体ファイル（データそのものを共有）
```

---

## 削除時の違い

| 操作 | シンボリックリンク | ハードリンク |
|:----|:--------------------|:-------------|
| リンクだけ削除 | リンクだけが消え、本体は無事である | リンクだけが消え、他にリンクがあればデータは無事である |
| 本体だけ削除 | リンクが壊れる（エラーになる） | 他にハードリンクが存在すればデータは残る |

---

## まとめ

- Linuxのシンボリックリンクは「本体のように扱える柔軟なリンク」である。
- Windowsのショートカットは「ジャンプ用のファイル」である。
- Linuxにはさらに「ハードリンク」という、**データ自体を共有する強力なリンク**も存在する。
- 削除時やファイルシステムをまたぐときの挙動に明確な違いがある。

---

## おまけ：シンボリックリンクを作るコマンド

Linuxでシンボリックリンクを作成するには、以下のコマンドを使用する。

```bash
ln -s [ターゲット] [リンク名]
```

例：

```bash
ln -s /home/user/file.txt link_to_file.txt
```

これで、`link_to_file.txt` を操作すれば、まるで `/home/user/file.txt` を操作しているかのように動作する。

---
Javaにおける例外の分類と使い分け

## ■ 非検査例外（Unchecked Exception）

- **代表例**：`NullPointerException`、`IllegalArgumentException`、`IndexOutOfBoundsException`など  
- **特徴**：
  - コンパイル時に例外処理を強制されない（`try-catch`や`throws`が不要）
  - プログラムのバグや設計ミスが原因で発生するケースが多い  
- **対応方針**：
  - 発生を前提にせず、**事前にチェックして防ぐ（バリデーションなど）**ことが基本
  - 発生した場合は、リカバリよりも修正対象として扱うことが多い

## ■ 検査例外（Checked Exception）

- **代表例**：`IOException`、`SQLException`、`ParseException`など  
- **特徴**：
  - コンパイル時に例外処理が必須（`try-catch`または`throws`が必要）
  - 外部環境やI/Oに依存する処理に対して用いられる  
- **対応方針**：
  - `try-catch`でハンドリングするか、呼び出し元に投げる（`throws`）
  - 呼び出し側に「この処理は失敗する可能性がある」と明示的に知らせる意図


設計段階から「起きるべきでないもの」と「起きうる前提のもの」を切り分ける姿勢が重要
file取り扱い


```java
import com.google.cloud.functions.HttpFunction;
import com.google.cloud.functions.HttpRequest;
import com.google.cloud.functions.HttpResponse;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.commons.fileupload.FileUploadException;

import java.io.*;
import java.util.List;

public class FileUploadFunction implements HttpFunction {

    @Override
    public void service(HttpRequest request, HttpResponse response) throws Exception {
        if (!ServletFileUpload.isMultipartContent(new HttpRequestWrapper(request))) {
            response.setStatusCode(400);
            response.getWriter().write("Content-Type is not multipart/form-data");
            return;
        }

        DiskFileItemFactory factory = new DiskFileItemFactory();
        ServletFileUpload upload = new ServletFileUpload(factory);

        List<FileItem> items;
        try {
            items = upload.parseRequest(new HttpRequestWrapper(request));
        } catch (FileUploadException e) {
            response.setStatusCode(500);
            response.getWriter().write("Failed to parse multipart request");
            return;
        }

        for (FileItem item : items) {
            if (!item.isFormField() && "file".equals(item.getFieldName())) {
                String fileName = item.getName();
                byte[] fileBytes = item.get();

                // ByteArrayInputStream を使って再利用可能に
                ByteArrayInputStream reusableStream = new ByteArrayInputStream(fileBytes);

                // 内容を読み込んで表示（例）
                try (BufferedReader reader = new BufferedReader(new InputStreamReader(reusableStream))) {
                    String line;
                    while ((line = reader.readLine()) != null) {
                        System.out.println("Line: " + line);
                    }
                }

                response.getWriter().write("File received: " + fileName + "\n");
                return;
            }
        }

        response.setStatusCode(400);
        response.getWriter().write("No file part found");
    }
}

```
令和7年度春期　応用情報技術者試験の振り返り

どうもこんにちは！

2025年4月20日に応用情報技術者試験がありました。受験したみなさまお疲れさまでした。
自分も受験したので、反省も含めて試験までの取り組みを共有したいと思います。


# 応用情報技術者試験について
この記事に興味を持った方はだいたい内容を知っている方と思いますが、情報元のリンクを貼っておきますね。

https://www.ipa.go.jp/shiken/kubun/ap.html

https://www.ipa.go.jp/shiken/syllabus/gaiyou.html

## 問題と解答、午前の自己採点

問題と午前の解答は下記のページにて公開されました。午後の解答例は7月1日午後に公開予定とのこと。

https://www.ipa.go.jp/shiken/mondai-kaiotu/2025r07.html

また、合格発表は7月3日正午予定だそうです。

https://www.ipa.go.jp/shiken/2025/20250420_schedule.html

## 午前の結果(自己採点)と問題への感想
60/80で午前は合格見込み。午後はあやしいです。出題範囲が広すぎて午前の勉強が大変でした・・・
生成AIでの生成物と著作権の関係や暗号資産に関することなど、ホットトピック的な問題も出てたのが印象的でした。あと、今回が初受験でしたが、過去問がそのまま再出題されたのは少しびっくりしました。
~~試験によく出る問題集から問題が本当に出てくるとは思ってもいませんでした~~


# 受験までにやったことなど
## 前提
* 15年以上前に大学(情報系の学科)を卒業
* 社会人経験はあるがIT関連職ではなかった(SEやプログラマはもちろん、戦略やマネジメント・監査・法務などでもない)
* (現行の)基本情報技術者試験は未受験
* 応用情報技術者試験は今回が初受験、午前合格すればひとまずOKという程度の目標

## 勉強に使用したもの
* 令和07年【春期】【秋期】応用情報技術者 合格教本
* 令和06-07年 応用情報技術者 試験によくでる問題集【午前】
* 令和06-07年 応用情報技術者 試験によくでる問題集【午後】
* paizaラーニングでプログラムやアルゴリズムの勉強(3か月ほど)
* はてなブックマークのテクノロジーでピックアップされた時事的な記事

https://gihyo.jp/book/2024/978-4-297-14620-7

https://gihyo.jp/book/2024/978-4-297-13867-7

https://gihyo.jp/book/2024/978-4-297-13965-0

## 受験までのざっくりなスケジュール
2025年1月 paizaラーニングでPythonの勉強開始
2025年2月 思い立って受験申込、合格教本を購入、atcoderに参加開始(Qiitaデビュー)
2025年3月 Pythonの勉強を中心、合格教本の読み込み。atcoder
2025年4月 試験3日前に問題集【午前】【午後】を購入、追い込み

## 主な勉強内容とよかった点
* 合格教本と試験によくでる問題集【午前】を何度も読み、気になった語句は適宜検索しました。特に問題集が個々の内容の理解を深めるのに効果的だったと思います。
* 試験によくでる問題集【午後】は秋に再受験となったら本格的に役に立ってくれるでしょう。いや問題と答えを見て傾向把握に使用しましたが、午前の出題範囲をカバーするのに時間がかかって午後の対策はほぼ読んだだけでした。
* paizaラーニングはPythonへの興味本位で受験を考える前からやっていました。プログラミングとアルゴリズムに慣れていたのはよかったと思います。

## 反省
* 問題にとりかかったのが試験１週間前と遅くなりすぎました。問題になってみるとわからないが多発して、あわてて問題集を読み込んで試験を受けました。
* 午後の勉強不足。当日は考えたら解ける問題を探して一通りやりきりはしましたが、合格はだいぶ怪しいです。特に時間配分がわからず終了間際にあわてることに。ただ、1回通して勉強したので秋に再受験となっても午後に注力すればなんとかできると信じたいところ。



# おわりに
試験結果はともかく、技術の基礎的な勉強をするのにちょうどよかったかなと思います。受験しなくてもIT技術の全体感を見たい人はテキストを読んでみるのもよいかもしれませんね。

ではでは。
TypeScript:7.data属性（カスタムデータ属性

## data-*属性って何？
HTML要素に「開発者が自由につけていいカスタム情報（文字列）」を埋め込める機能！

## 例
```html:html
<div class="food" data-category="vegetable">
    <div class="food__name">Broccoli</div>
</div>
```
このdata-category="vegetable"がdata属性(カスタムデータ属性)

## 何ができるのか？
```typescript:ts
element.dataset.category // → "vegetable"
```
つまり、この要素に「vegetable」というカテゴリがついてることがわかる

## data=* 属性のメリット
・HTMLの中に「追加の情報」を持たせられる
　　⇒スコア、カテゴリ、IDなど自由
・JavaSriptで簡単に取得できる
　　⇒element.dataset.○○で読める
・CSSでセレクタにも使える
　　⇒div[data-category="junk"]とかで装飾もできる！

  ## 他の使用例
### タブの切り替え
```html:html
<div data-tab="1">Tab 1</div>
<div data-tab="2">Tab 2</div>
```
JSでe.target.dataset.tabを見てどのタブか判断

### 商品にIDを持たせる
```html:html
<button data-product-id="12345">カートに追加</button>
```
JSでe.target.dataset.productIdを取得して、どの商品か把握

## ✅ 補足：どう使うのが正しい？
・属性名は data- から始める（必須）
・名前はハイフン区切り（例：data-category、data-score）
・JavaScriptでは camelCase に変換される
　　　→ data-user-id → element.dataset.userId
brakemanのアップデート

## Why?
rails new を実行したてのアプリをGithubにあげようとしたらエラーがでたので何をどうしたか記録。brakemanのバージョンの更新が必要だったというのと、db/schema.rbを作らないといけなかったという話。

## ①brakemanのバージョンが古いよエラー
### brakeman
brakeman は Ruby on Rails アプリケーション用のセキュリティスキャナーらしく、このバージョンが古いと git で更新するように注意される。
[brakemanについて](https://brakemanscanner.org/docs/introduction/)

### Gemfileの確認
Gemfileにbrakemanの記載があるか確認。

```ruby:Gemfile
# Static analysis for security vulnerabilities [https://brakemanscanner.org/]
  gem "brakeman", require: false
```
`require: false` はアプリケーション実行時にbrakemanが自動的にロードされないようにするための設定。brakemanは開発時のセキュリティ解析ツールなので問題なし。

### brakemanのバージョンの更新
brakemanのアップデート
```
$ bundle update brakeman
```
バージョン確認
```
$ bundle exec brakeman --version
```
## ②db/schema.rbが無いよエラー

### db/schema.rb
これはdbのマイグレーションしていないと作成されないファイルなので、立ち上げたばかりではないんです。なのでひとまず空でいいのでマイグレーションしてあげようという話。
```
$ rails db:migrate
```

終わり
「AIに資料作らせて、午後はカフェで優勝？」〜生成AIで始める働き方革命〜


---

## 1. はじめに：企画も資料もAI任せ？──それ、どこまでリアルなの？

先日、社内の別チームから「生成AIで事業企画案を自動作成できませんか？」という依頼が来ました。

正直こう思いました：

>「それ、夢物語じゃない？ ChatGPTに頼めば何でもできるわけじゃ…」  

しかし、ちょっと本気で取り組んでみると、**「アイデアのたたき台」としては十分使える**どころか、**工夫次第で業務レベルに活かせる**ポテンシャルを感じました。

今回は、**生成AIの発展と応用分野**を、実装ベースで掘り下げていきます。

---

## 2. 生成AIの進化と応用可能性：ざっくり総覧

### 📈 発展のカギ：モデルの「万能性」＋「拡張性」

近年のトレンドとして以下が挙げられます：

- **マルチモーダル対応**：画像＋テキスト、音声＋コードなどを同時に扱えるモデル（例：GPT-4V、Gemini 1.5）
- **長文コンテキスト処理**：最大100万トークン以上の文脈保持が可能に（例：Anthropic Claude 3 Opus）
- **Agentベース自動化**：タスク分解・自己改善・API連携まで自動でやるAIエージェント（例：AutoGPT、CrewAI）

---

### 🌍 応用分野まとめ（現実ベース）

| 分野         | 期待される応用                                          | 実現度 |
|--------------|---------------------------------------------------------|--------|
| オフィス業務 | 企画書作成、議事録要約、報告書ドラフト                  | ◎      |
| コーディング | テストコード生成、コードレビュー、修正提案              | ◎      |
| 顧客対応     | FAQ自動応答、クレーム分類、チャットボット                | ○      |
| デザイン     | 広告バナー作成、UIモックアップ提案                      | △      |
| 研究開発     | 論文要約、研究トピック生成、プロトタイプ支援            | ○      |

---

## 3. ハンズオン：実際に「企画書AI」を作ってみた

目標：**プロダクト企画書の初稿を自動生成**するAIワークフローをPythonで実装。

### 🎯 要件
- 入力：簡単な構想（キーワードや箇条書き）
- 出力：ビジネス向け企画書っぽいフォーマット
- 使用モデル：OpenAI GPT-4（APIベース）

### 🛠️ 実装例

```python
import openai

openai.api_key = "sk-..."

prompt = """
以下の構想をもとに、ビジネス向け企画書を作成してください：

・業界：教育テクノロジー（EdTech）
・ターゲット：高校生向けのAI家庭教師アプリ
・特徴：音声対話＋リアルタイム宿題サポート
・マネタイズ：月額課金＋学校向けライセンス
"""

response = openai.ChatCompletion.create(
  model="gpt-4",
  messages=[
    {"role": "system", "content": "あなたは企画書作成のプロフェッショナルです。"},
    {"role": "user", "content": prompt}
  ]
)

print(response['choices'][0]['message']['content'])
```

### 🖼️ 出力イメージ（冒頭抜粋）

```
【企画書タイトル】
AI家庭教師アプリ「StudyMate」事業提案

【課題】
高校生の学習習慣の乱れ、家庭教師コストの高さ

【解決策】
音声対話型AIによる24時間対応の家庭教師体験を提供

【ターゲット市場】
全国の高校生 約320万人、および進学校・予備校

...
```

→ ここまで形になると、**ドラフトとしては即戦力レベル**です。

---

## 4. 実務TIPS＆落とし穴：経験から学んだこと

### 💡 TIPS（うまく使うための工夫）
- **「役割指示」+「文体指定」** をすると出力の品質が一気に上がる
- フォーマットを明示すると商用利用に向いた出力になる（例：「PowerPoint用の章立てにしてください」）
- RAG（Retrieval Augmented Generation）で**自社データを混ぜる**とより実用的になる

### ⚠️ よくある失敗
| 誤り例 | 内容 |
|--------|------|
| **出力内容の真偽を信じすぎる** | あくまで“それっぽい言葉”を返すだけ。ファクト確認必須 |
| **プロンプトが曖昧すぎる** | 「なんでもいいから提案して」と言うと、雑になる |
| **法的観点を無視する** | 生成された内容が他社の知財や表現に類似している場合も |

---

## 5. 応用編：チーム単位で使うには？

### 🧩 社内Slack連携で「資料たたき台ボット」を構築

1. SlackのApp（Bot）を作成
2. Slashコマンド `/draft-proposal` を設置
3. GPT-4 APIと連携し、チャンネルに自動投稿

➡️ Slackで「/draft-proposal 教育向けAIサービス」と打つと、5分後に初稿が自動投稿される、という体験に！

---

## 6. おわりに：生成AIは “アイデアの伴走者”

現時点で、生成AIは**人間の代わりになる存在ではありません**。  
でも、「考えるきっかけ」「最初のたたき台」としては、十分に実用的です。

| 🌟 メリット              | 🚨 注意点                       |
|-------------------------|-------------------------------|
| 思考スピードを加速      | 内容の事実確認が必要           |
| 複数案の出力が簡単       | 出力が安定しない場合がある     |
| ノンエンジニアでも活用可 | 法的・倫理的な配慮が必要       |

生成AIはまだまだ進化途中。**いま使っておくことで、明日の“当たり前”に一歩先んじることができます。**
Tailscale SSHでX11を使用する

## 準備

省略するのでここ見てください。

https://tailscale.com/kb/1017/install

以下を実行すればインストールはOKです

```bash
curl -fsSL https://tailscale.com/install.sh | sh
```

## X11フォワーディングのやり方

ホストPCにopensshインストール

```bash:Host
sudo apt update
sudo apt install openssh-server
```

+ /etc/ssh/sshd_configを編集

```:/etc/ssh/sshd_config
X11Forwarding yes
X11UseLocalhost yes
```

+ サービスの再起動
```bash:bash
sudo systemctl restart ssh
```

+ SSH

```ssh:ssh
ssh -J <user>@<tailscale-name> <user>@127.0.0.1 -Y
```

これでX11フォワーディングのSSHできます。

### 具体例

ユーザ名
+ `haruki-goto`
Tailscale IP (example)
+ `univearth-1`

```ssh
ssh -J haruki-goto@univearth-1 -Y haruki@127.0.0.1
```

これでX11フォワーディングできます！

### 高速化

-Cで圧縮しますす。

```ssh
ssh -C -J <ユーザー名>@<Tailscaleのホスト名> <ユーザー名>@127.0.0.1 -Y
```

## 参考文献

https://github.com/tailscale/tailscale/issues/5160
「AIに良心はあるのか？」エンジニアが考える生成AIと倫理のリアル  



## 1. はじめに：「便利だけど、なんかモヤる」

ある日、社内でこんな会話がありました。

> 👨‍💻「このAIチャットボット、カスタマー対応めっちゃ高速化してるよ！」  
> 👩‍💼「でも、それって高齢者の声にちゃんと寄り添えてるかな……？」

生成AIがどんどん生活やビジネスに溶け込む中、エンジニアとしてふと感じる“モヤモヤ”。  
それって単なる「倫理観」なのか、それとも**技術者が設計段階で考えるべき“機能要件”**なんでしょうか？

この記事では、実務で生成AIを開発・導入する立場から、**倫理的配慮と社会的インパクト**について掘り下げてみます。

---

## 2. 技術と倫理：どこまでが設計？どこからが哲学？

### 🧠 そもそも「AIの倫理」って何？

一言で言うと、「AIによる自動判断や生成が、社会にとって好ましいかどうか」を考える領域です。

| 観点 | 例 |
|------|----|
| **バイアス** | AIが特定の人種・性別・文化を差別的に扱っていないか？ |
| **透明性** | その出力は、なぜそうなったのか説明できるか？ |
| **プライバシー** | ユーザーの情報はどう扱われているか？ |
| **責任の所在** | 間違った出力の責任は誰が取る？AI？開発者？ |

倫理と聞くと哲学っぽく感じますが、エンジニアの視点から言えば「**設計原則の一部**」です。

---

## 3. 実装例：バイアスを検出・緩和するミニシステムを作ってみた

生成AIの中でも特に言語モデル（LLM）は、学習データに含まれる**潜在バイアス**を出力として反映する可能性があります。

ここでは、簡単な**Promptバイアス検出ツール**をPythonで作ってみます。

### 📦 使用ライブラリ：
- `transformers`（HuggingFace）
- `pandas`
- `scikit-learn`

### 🔧 実装コード：

```python
from transformers import pipeline
from sklearn.metrics.pairwise import cosine_similarity
import pandas as pd

classifier = pipeline("zero-shot-classification", model="facebook/bart-large-mnli")

prompt = "A nurse walked into the room"
candidates = ["female", "male", "non-binary"]

result = classifier(prompt, candidate_labels=candidates)
print(result["labels"], result["scores"])
```

### 📊 出力例：

```
['female', 'male', 'non-binary']
[0.81, 0.12, 0.07]
```

**→ "nurse" = "female" と連想されやすい**バイアスを発見。

これをスコアで記録し、**特定用語に依存した文脈バイアスの可視化**を行うことで、社内QAやプロンプト改善に繋げられます。

---

## 4. 実務TIPS：倫理的配慮を設計に落とし込むには？

### ✅ プロンプトのレビュー文化を作る
- PRレビューのように、**Promptレビュー**を導入
- 「この表現、無意識に偏ってない？」という観点を意識

### ✅ モデルの「説明責任」をどう担保するか
- 出力に対する**信頼スコア**や**参照元（RAGなど）**を表示
- 生成結果に「なぜこの内容が出たか？」を追える設計を

### ✅ バイアス検出チェックリストをチームに導入

| チェック項目 | Yes / No |
|---------------|----------|
| マルチ言語・マルチ文化に配慮しているか？ | ✅ |
| 性別や年齢に関するステレオタイプを含まないか？ | ✅ |
| プロンプトに先入観を埋め込んでいないか？ | ✅ |

---

## 5. 応用例：倫理的ガイドラインを自動化する社内ツール

社内開発用に、**生成AIの利用チェック用UI**を作った事例：

### 🖼️ UI構成例（図：添付 minh hoạ）
1. プロンプトを入力
2. 出力例が表示される
3. サイドバーに「倫理的懸念点」表示
4. NGワード自動検出、バイアス推定グラフ付き

→ **エンジニアも非エンジニアも安心して試せる**土台ができました。

---

## 6. まとめ：倫理 × 実装の交差点にいるのは、エンジニア

生成AI時代、私たちは単にモデルを使うだけでなく、その「出力が社会に与える影響」を設計段階から考える責任を持っています。

| メリット | リスク |
|----------|--------|
| 高速な開発と実験が可能 | 無意識のバイアス拡散 |
| 多様な創造性を補完 | モデル透明性の欠如 |
| 利便性向上によるコスト削減 | 「説明責任」の曖昧さ |

でも、**倫理的配慮 ≠ 足かせ**ではありません。  
それはむしろ、**信頼されるプロダクトを作るための設計指針**です。

---
未経験1年目エンジニアが1年を振り返る

## はじめに
私は大学で化学・生物を専攻していました。
プログラミング経験はPythonを少し触る程度。
入社前は、エンジニアとしてのキャリアに不安を感じていましたが、入社後の学びを通して、努力次第でどうにかなるものだと実感しています。

## 入社して感じたこと
### 基本的な情報系知識の不足
入社して痛感したのは、情報系の基礎知識が圧倒的に足りないことでした。
### コーディング能力の課題
コーディング能力もまだまだ不足していると感じています。
### 研究との共通点
一方で、思考の進め方には研究で培ったものが活かせると感じる場面もありました。

## 2024年に学んだこと
#### 言語
C++ :
競技プログラミングに取り組むのために使用している。競プロ用のマクロや汎用関数を作る中で、プログラミングへの理解が深まったように思います。しかし、依然としてC++は難しいと感じています。

JavaScript/TypeScript :
実務ではほぼTypeScriptを使用しています。型宣言のメリットを最近ようやく理解できるようになり、成長を感じています（Pythonから入ったため、最初は型の概念に戸惑いました）。

React/Next.js: 
配属後すぐに学習を開始しました。Next.jsは機能が豊富で、現状ではReactの基本的な部分しか扱えていないと感じています。流行に乗ってNext.jsを使っていますが、今の状況ではそのメリットを十分に活かせていないのではないかと感じることもあります。

Storybook: 
コンポーネント単位でデザインを確認できるのは便利ですし、導入することでより丁寧に作ろうという意識が生まれるのは個人的に良いと感じています。単体テストのしやすさや、ドキュメントの自動生成も大きな利点だと感じています。ドキュメントがないプロジェクトへの参画は非常に苦労した経験があるので、コンポーネントドキュメントの自動生成は本当に助かります。

## 今後取り組みたいこと
フロントエンドのテストに対する理解: 
現在は基本的なツールと使い方は学べたので、今後はより深くこれらのツールについて理解を深めていきたい。

React/Next.jsのフレームワークに対する深い理解: 
最新の動向を追いかけ、フロントエンド開発の基本的なプラクティスを習得するために、XやQiitaの記事を読む時間を意識的に作りたいと考えています（通勤時間などを活用して）。

TypeScriptの深い理解: 
実務を通して様々なコードを読み解き、理解を深めていきます。

データベース/バックエンドの知識: 
個人開発でフルスタックのアプリケーションを作成する。ちょうどほしいアプリあるから作ろうかな？

英語力: 
情報収集の幅を広げるために、毎日少しずつでも学習を始めたいと思います（生成AIの普及で調査の必要性は減るかもしれないが、学んでいて損はないかな？）。

## まとめ
前期は多くのことを学ぶことができた一年でした。今期も前期に負けないよう精進していきたい。
そして、来年この振り返りを読んだ時に、しっかりと目標を達成できていたらいいなー
DockerfileのParser directivesについて学ぶ

概ね公式ドキュメントの要約です。
# パーサーディレクティブ（構文指示）
`Parser directives` をいい感じな日本語に訳してくれているのを見つけられなかったので、「構文指示」と訳した。
構文指示とはコメントのように `#` で始まるオプションのことで、Dockerfileの後続行の処理方法に影響する。なので、本記事では構文指示と訳す。構文指示はビルドにレイヤーを追加せず、ビルドステップとしては表示されない。また、ひとつの指示は一度しか使えない。
現在以下の構文指示がサポートされている。
-  `syntax`
-  `escape`
-  `check` (Dockerfile v1.8.0以降)
構文指示の後には空行を入れるのが一般的。改行文字は構文指示ではサポートされていません。
## 利用上の注意
### 必ずDockerfileの先頭に書く
構文指示利用前にコメント、空行、命令が処理されるとBuildKitは構文指示の検索をやめる。
その代わりに構文指示としてフォーマットされていたものはすべてコメントとして扱う。
全ての構文指示はDockerfileの先頭になければならない。
NG例）命令の後に挿入しない
```dockerfile
FROM ImageName
# directive=value
```
NG例）構文指示ではないコメントの後に挿入しているのでコメント扱いになる
```dockerfile
# About my dockerfile
# directive=value
FROM ImageName
```
### 指示側は大文字小文字を区別して書く
`syntax` や `check` のような構文指示のkeyである構文は大文字小文字を区別しない。慣例では小文字を用いる。
しかし、構文指示の指示側であるvalueは大文字と小文字を区別するので、その指示に適した大文字と小文字で書かなければならない。
NG例）
``` dockerfile
#check=skip=jsonargsrecommended
```
上記の場合、指示にパスカルケースを使わなければならないので無効となる。
### 二行に跨がない
NG例）
```dockerfile
# direc \
tive=value
```
### 同じ指示を複数回使わない
NG例）
```dockerfile
# directive=value1
# directive=value2

FROM ImageName
```
### 空白は許容される
以下の書き方はすべて同じ意味になる。
すなわち、空白を入れても同じ指示が複数あると無効となる。
```dockerfile
#directive=value
# directive =value
#	directive= value
# directive = value
#	  dIrEcTiVe=value
```
## syntax
ビルドに使用するDockerfile構文のバージョンを指定できる。
未指定の場合、BuildKitはバンドルされたバージョンのDockerfileフロントエンドを使用する。
指定することで、BuildKit や Docker Engine をアップグレードしたり、カスタムの Dockerfile 実装を使ったりしなくても、最新の Dockerfile バージョンを自動的に利用できる。

基本的にはこの構文指示を `docker/dockerfile:1` に設定することをお勧めする。そうすることで、BuildKit はビルド前に最新の安定版のDockerfile構文を自動的に取得する。

## escape
```dockerfile
# escape=\
```
または
```dockerfile
# escape=`
```
Dockerfile 内で文字をエスケープするために使用する文字を設定する。
指定しない場合、デフォルトのエスケープ文字は `\` となる。
エスケープ文字は、行内の文字をエスケープするためだけでなく、改行をエスケープするためにも使われる。これにより、Dockerfile の命令を複数行にわたって記述できる。
ただし、escapeの構文指示が Dockerfile に含まれているかどうかに関わらず、RUN コマンド内では行末を除いてエスケープは行われない。

エスケープに \` を指定することはWindows環境下で特に有効となる。PowerShellと同一になる為。
## check
```dockerfile
# check=skip=<checks|all>
# check=error=<boolean>
```
上記のように現在二つのオプション（skip, error）があるが、実際には前述したように同一の構文指示を二行に分けて書くことはできない。
skip と error のオプションを組み合わせる場合は、セミコロンで区切って書く。
```dockerfile
# check=skip=JSONArgsRecommended;error=true
```

### skip
ビルド時のチェックの評価方法を設定するために使用される。デフォルトでは、すべてのチェックが実行され、エラーは警告として扱わる。
特定のチェックを無効にするには、 `#check=skip=<チェック名>` を使用する。複数のチェックを無効にする場合は、カンマで区切って指定すればよい。
```dockerfile
# check=skip=JSONArgsRecommended,StageNameCasing
```
逆に、すべてのチェックを無効にするには、 `#check=skip=all` を使用する。

利用可能なチェック項目を確認するには、[ビルドチェックのリファレンス](:https://docs.docker.com/reference/build-checks/)を参照すること。結構数があるので今回は割愛する。
なお、利用可能なチェック項目は Dockerfile の構文バージョンによって異なる。最新のを利用するには、syntaxを使用して、Dockerfile の構文バージョンを最新の安定版に指定すること。
### error
デフォルトでは、ビルドチェックが失敗しても警告が出るだけで、ビルド自体はステータスコード 0 で終了する。警告時にビルドを失敗させるには、`#check=error=true` を設定する必要がある。
```dockerfile
# check=error=true
```

check で `error=true` オプションを使用する場合、Dockerfile の構文バージョンを特定のバージョンに固定することを推奨する。固定しないと将来のバージョンで新しいチェックが追加されたときにビルドが失敗する可能性がある。


# 参考
dockerdocs: https://docs.docker.com/reference/dockerfile/