OmniAICreator/Qiita-1.07M huggingface dataset:
PCから開業申請できるようにした

## ブラウザ版からはできない
これまで確定申告ではe-taxのブラウザ版を使用してきたが、ブラウザ版個人事業の開業届は申請できないと知る。
これが分かるまで結構時間がかかった。。。

https://www.nta.go.jp/taxes/tetsuzuki/shinsei/annai/shinkoku/annai/04.htm

から下記リンク

https://www.e-tax.nta.go.jp/tetsuzuki/tetsuzuki6.htm

の`所得税関係`の下記PDF（イメージデータにより・・・のほうではない）

https://www.e-tax.nta.go.jp/tetsuzuki/shinsei/shinseip01_1.pdf

を`開業`で検索してたどり着いた。字がちーせーじゃろ。

PC版をインストール、の前に、カードリーダ持っていないので下記を実施

### スマホをカードリーダにする

https://www.jpki.go.jp/download/pdf/startupguide.pdf

に従って実施。下記は実施時差分のメモ。

※上記で出てくるPCの利用者クライアント（ソフト）の実体は「JPKI利用者ソフト」。ちょっと混乱する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3916302/f535a718-78c0-2c19-9918-550bfe2fc46f.png)

#### ⑥パソコンの利用者クライアントを起動しよう
Win11のスタートメニューの検索窓で`jpki`とか`icカード`とか打てば起動対象ソフトが出てくる。
アイコンが違うし、起動方法もなんか違う気がする、のでとても混乱する。

Bluetooth接続時に下記エラーになった。
スマホ側からペアリングを試みてもWin11画面の右下に接続しなさい的なポップアップが出るところまでは行くけど、その後のPIN入力のような期待する画面が出てこない。
素直にPC再起動してリトライしたらOKだった。
<img width=200 src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3916302/8d5cf998-559d-81a0-2b60-c9189e4128da.png>

なお、ICカードリーダライタ設定では自動検出の選択肢があったので試したが動作しなかった。

#### ⑦スマホの利用者クライアントを起動しよう
Android用利用者クライアントソフトの実体は`JPKIMobile`という名前なので注意。アイコンは同じなのでまあ許容範囲。

#### ⑧準備が整いました
スマホ側でカードをずっと接触させて読み込んだ状態（下記画面）でPC側を操作するという流れじゃないと動かない模様。考えてみればフツーのカードリーダではそうなのだから当たり前だけど、説明が無く不親切。
ただ、スマホとカードを接触した状態で固定するのが結構ムズイ。
<img width=200 src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3916302/86b79deb-f1a1-ea10-058e-131e86a88d3a.png>

:::note info
マイナンバーカードは透明なケース（かな？カード作ったときに付帯してたもの）のままでも読めることを発見
:::

### PC版インストール

https://www.e-tax.nta.go.jp/e-taxsoft/index.htm

からインストール。特にひっかかるところはなかった。
初期設定的なところでナイナンバーカードをスマホから読み取れたので目標達成。

### 申請だ！

ちょっと疲れたのでまた今度。
プログラミングは魔法のよう

# はじめに
こんにちは、なにわかメソッドです (@Naniwaka-Method) です！
今回は、プログラミング初心者・初学者の方がスムーズにプログラミングの世界に入れるような記事をお届けします

# 専門用語が多くて難しい？
プログラミングを始めたばかりの人は、専門用語の多さに驚くことが多いですよね。
「変数」「関数」「属性」「メソッド」など、聞き慣れない単語が次々と出てきます。

そこで今回はプログラミングが「魔法」と似た性質を持っていることを活用し、
少しでも分かりやすく理解できるように解説していきます。

# プログラミングは魔法のよう
プログラミングと魔法には共通点があります。
それを実感するために、まずは文字を出力してみましょう。
### 実際にコードを書いてみる
コンソール（画面）に「Hello World!」を表示するプログラムを書いてみます。
#### コード
```java
System.out.println("Hello World!");
```
#### 実行結果
```
Hello World!
```

無事「Hello World!」と画面に表示されました。
## 魔法とプログラミングの共通点
魔族を殺す魔法（ゾルトラーク）
![ゾルトラーク.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3687802/7c371f91-3e52-9e2a-7eb2-83fe00008678.png)
出典：葬送のフリーレン

ここで、ファンタジー作品に登場する魔法を思い浮かべてみてください。
例えば、『葬送のフリーレン』に出てくる魔法「魔族を殺す魔法（ゾルトラーク）」他にも「だいたいなんでも切る魔法（レイルザイデン）」や「花畑を出す魔法」などがあります。

このような魔法があるなら、プログラミングの System.out.println も「画面に文字を表示する魔法」と考えられないでしょうか？

この考え方をすることで、難しそうに見えた System.out.println も単なる「魔法」だと捉えられるようになります。

これで今まで流れ作業で書いていた`System.out.println`について少しだけ理解できたかと思います。

## 魔法を分解して考えてみる
![詠唱と発動.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3687802/fefef3b6-5b7f-eab9-a26b-2a45109f0368.jpeg)
### 魔法を分解してみる
魔法を分解すると **「詠唱」** と **「発動」** に分けられます 
**詠唱**：魔法・呪文を唱える
**発動**：唱えた魔法の効果が発動する
#### プログラミングで考えると
**詠唱**：コードを書く
```java
System.out.println("Hello World!");
```
**発動**：画面に出力される

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3687802/2d6a97bf-ebdf-6c0c-4ce7-7aa9ef21c635.png)

これなら、プログラミングがどんな仕組みで動いているのか、感覚的に理解しやすくなりますね。

#### もし詠唱にミスがあると...
魔法であれば不発だったり失敗しますよね
プログラミングでも同様の事象が起こります

**詠唱を間違えてみる**
例えば、次のコードでは println を書き忘れてみます
```java
//printlnを書かないでみる
System.out("Hello World!");
```

**エラーが（失敗）起こる**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3687802/b9c9810b-50fb-0d45-cead-292b8c23aba5.png)
このように、正しい「詠唱（コード）」を覚えることが大切です。

# おわりに
このように、プログラミングは魔法のような特性を持っていると考えると「難しそう……」と思っていたものが少し身近に感じられるのではないでしょうか？

そして、この「魔法」はプログラミングの世界では「関数」や「メソッド」と呼ばれます。

Webサイト、ツール、ゲームなども、こうした小さな「魔法（関数・メソッド）」の積み重ねで動いています。

プログラミングに苦手意識を持っている方も、「魔法を覚える」つもりで取り組んでみると、きっと楽しくなってきますよ！
【第６回 富士通株式会社 浦井祐次郎さん】2024 Japan AWS Jr. Champions インタビュー企画

こんにちは！
2024 Japan AWS Jr.Championsの @Toyo_Daichi です！

AWS Japanが6月に開催したAWS Summit Japanにて、2024 Japan AWS Jr. Championsが発表されました。Jr.Championsは、AWSを積極的に学び、アクションを起こし、周囲に影響を与えている若手エンジニア向けの表彰プログラムとなっております。

Jr.Championsについて多くの方に知ってもらいたいため、表彰された方々にインタビューをしていきます。

第６回目は、富士通株式会社の浦井祐次郎さんです！

https://aws.amazon.com/jp/blogs/psa/2024-japan-aws-jr-champions/

![IMG_5992.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/420620/97d86105-ba30-e2e1-7ccc-7ec412a67496.jpeg)

# 質問１：これまでの経歴、現在の業務、AWSを知った経緯を教えてください。
2022年に大学を卒業後、従業員30名規模のスタートアップでコンサル業務に従事し、その中でAWSに出会い、クラウド技術の可能性を実感しました。その後、富士通に入社し、入社2年目でJr.Championsに選出されました。
現在は100台規模のオンプレミス環境からAWSへの移行プロジェクトを中心に、移行後のクラウド環境の最適化や効率化に取り組んでいます。

# 質問２：Jr.Championsを目指した理由、選出につながったと考える活動があれば教えてください。
上司から紹介を受けたことをきっかけに、資格要件を満たしていたことや自身のプロジェクトでの取り組みが評価される可能性を感じ、挑戦しました。
選出につながった活動としては、1000個規模のセキュリティグループをスクリプトやIaCを用いて自動化するなどプロジェクト効率化に貢献したほか、AWS初心者であるグローバルメンバーをゼロから育成し、海外メンバーと協力してプロジェクトを推進しました。

# 質問３：Jr.Championsとして現在どのような活動をしていますか。

現在は、大阪を拠点にコミュニティの立ち上げと企画運営を行っています。関西の若手を中心としたエンジニアがAWSを学び、成長するための場づくりに力を入れています。

# 質問４：Jr.Championsに選出されてよかったことはありますか。

社内での認知度向上し、経営層含めて活動を認識してもらえ、直接声をかけてもらう機会が増えました。受賞をきっかけにre:Inventをはじめとするイベントに参加する機会などが得られ、視野を広げるきっかけになりました。

# 質問５：Jr.Championsの活動で大変だったことはありますか。

Jr.Championsとして表彰されたことで、AWSの有識者としてプロジェクトレビューを担当する機会が増え、周囲から期待される役割と自身のスキルセットの間にギャップを感じることがありました。また、Jr.Championsの活動意義を社内で理解してもらい、活動を支援してもらうための働きかけも必要で、大きなチャレンジでした。
しかし、このような経験を通じて、自分のスキルをさらに磨くきっかけとなり、周囲と連携しながら課題を乗り越える力が身についたと感じています。結果として、若手エンジニアとしての成長を実感できる貴重な機会となり、これからの活動への自信につながっています。

# 質問６：今後の夢や目標はありますか。

Jr.ChampionsではAWSの表彰プログラムJapan AWS Top Engineers、Japan AWS Ambassadorsになることが期待されているので選出を目指していきたいです。
特に弊社では現在Ambassadorsがいないので、自身が選出に向けて貢献できるようにしたいと考えています。道のりはだいぶ長そうです笑

# 質問７：Jr.Championsを目指す若手に向けてメッセージをお願いします。

初めてアウトプットするときは緊張や不安を感じるかもしれませんが、まずは一歩を踏み出すことが重要です。選ばれることで社内外からの注目が集まり、新たな挑戦の機会が増えるので、Jr.Championsは若手にとって大きなアドバンテージになると思います！

# 質問８：全体を通しての質問
- 今、注目しているサービスは何ですか？
現在注目しているのは、Bedrockを活用した生成AIのOpsへの応用です。さまざまな検証を進めており、これからの可能性を模索しています。

# 最後に
浦井さんのインタビューを通じて、Jr.Championsが若手エンジニアの挑戦や成長を後押しする素晴らしい場であることがよくわかりました。また浦井さん自身の行動でも選出後も積極的にコミュニティ活動を進めたり、社内での啓発活動を行ったりと、まさに若手エンジニアのロールモデルとして活躍されています。

これからも、浦井さんのようなリーダーシップを持ったエンジニアがAWSの世界を広げ、より多くの人がその魅力に触れられるようになることを期待しています！

次回もぜひご覧ください。

![画像.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/420620/ddf4a758-817f-fc1b-7ba2-6007f5464d2c.png)
MDFフォーマットの測定データをPythonで読み込む

# 測定データフォーマットの１つであるMDFファイルをPythonで読み込む．
**チャンネル名の取得およびそのデータプロット用サンプルプログラム**
このプログラムのポイントは，ファイル内のチャンネルをターミナルウィンドウに一覧表示してくれるので，グループとチャンネルを指定して，何度でも任意のチャンネルデータをプロット表示させることができる．
```read_mdf_file.py
from asammdf import MDF
import numpy as np
import matplotlib.pyplot as plt

# MDFファイルを読み込む
mdf_file = 'test_data.mdf'
mdf = MDF(mdf_file)

# 利用可能なチャンネルの一覧を表示
try:
    print("利用可能なチャンネル:")
    # グループごとのチャンネル情報を取得
    for group_index, group in enumerate(mdf.groups):
        for channel_index, channel in enumerate(group.channels):
            if channel.name:  # チャンネル名が存在する場合のみ表示
                print(f"- Group {group_index}, Index {channel_index}: {channel.name}")

    # 特定のグループとインデックスを指定してチャンネルを取得
    # 例: 最初のグループ(3)の2番目のチャンネル(0)を取得
    signal = mdf.get(group=3, index=0)
    
except IndexError as e:
    print(f"エラー: {e}")
    exit(1)
    
# データをプロット
plt.figure(figsize=(10, 6))
plt.plot(signal.timestamps, signal.samples)
plt.title(signal.name)
plt.xlabel('Time [s]')
plt.ylabel(f'{signal.name} [{signal.unit}]')
plt.grid(True)
plt.show()

# データを配列として取得
timestamps = signal.timestamps  # 時間データ
values = signal.samples        # 測定値データ
```
かな入力 長音 ろ ー 原因不明だけど Linux mozc anthy

分からん。
だが解決した。
```
anthy
```

をInstallしたら、[|]...AE13 キーを入力しても
ちゃんと長音「ー」が入力される様になった。
でも原因は分からない。

---
<h3>【症状】
</h3>
MozcのDefaultだと、かな入力で長音「ー」を入力する時、
[SHIFT]を押さないと「ー」が入力されない。
キーボードのキーの印刷では[SHIFT]無しの位置に書いてあるし、Windowsでも[SHIFT]無しだ。(Macでも)

色々やった。
/usr/share/X11/xkb/symbols/jp
も編集したりしたが、しかし既にちゃんと
prolongedsound
と書いてある。
RSpec入門：テックキャンプで学んだテストの基礎と実践

## はじめに

Rubyでのテスト駆動開発（TDD）において、RSpecは最も人気のあるテストフレームワークの一つです。本記事では、実際のプロジェクトで使用した経験を基に、RSpecの基本的な概念から実践的な使い方まで解説します。

## 目次
1. RSpecの基本概念
2. よく使用するRSpecの構文と機能
3. 実践的なテストコード例
4. システムテスト（E2E）の実装
5. テスト駆動開発での学び

## 1. RSpecの基本概念

RSpecは、テストコードを自然言語に近い形で記述できる「BDD（Behavior Driven Development）」スタイルのテストフレームワークです。

### 特徴
- 直感的な文法で可読性が高い
- テストの構造化が容易
- Railsとの親和性が高い

## 2. よく使用するRSpecの構文と機能

### 基本的な構文

```ruby
RSpec.describe User, type: :model do
  # テストの対象を記述
  describe 'バリデーション' do
    # 特定の状況や条件を定義
    context '正常な入力の場合' do
      # 具体的なテストケース
      it 'ユーザーが作成できる' do
        # テストの内容
      end
    end
  end
end
```

### 主要なマッチャー（検証メソッド）

| マッチャー | 説明 | 使用例 |
|------------|------|---------|
| `be_valid` | モデルのバリデーションをチェック | `expect(user).to be_valid` |
| `include` | 配列・ハッシュの要素確認 | `expect(array).to include('要素')` |
| `change` | 値の変化を検証 | `expect { action }.to change(Model, :count).by(1)` |
| `have_content` | ページ内の文字列確認 | `expect(page).to have_content('文字列')` |

## 3. 実践的なテストコード例

### モデルスペック

```ruby
RSpec.describe User, type: :model do
  describe 'バリデーション' do
    let(:user) { build(:user) }  # FactoryBotを使用

    context '正常な入力の場合' do
      it 'ユーザーが作成できる' do
        expect(user).to be_valid
      end
    end

    context '異常な入力の場合' do
      it 'メールアドレスが重複していると無効' do
        create(:user, email: 'test@example.com')
        user.email = 'test@example.com'
        user.valid?
        expect(user.errors[:email]).to include('has already been taken')
      end

      it 'パスワードが6文字未満だと無効' do
        user.password = '12345'
        user.valid?
        expect(user.errors[:password]).to include('is too short (minimum is 6 characters)')
      end
    end
  end
end
```

## 4. システムテスト（E2E）の実装

```ruby
RSpec.describe 'ユーザー登録機能', type: :system do
  before do
    driven_by(:rack_test)
  end

  it 'ユーザーが新規登録できる' do
    visit new_user_registration_path
    
    fill_in 'user[email]', with: 'test@example.com'
    fill_in 'user[password]', with: 'password123'
    fill_in 'user[password_confirmation]', with: 'password123'
    
    expect {
      click_button '登録'
    }.to change(User, :count).by(1)
    
    expect(page).to have_content('アカウント登録が完了しました')
  end
end
```

## 5. テスト駆動開発での学び

### メリット

1. **品質の向上**
   - バグの早期発見
   - リファクタリングの安全性確保
   - 仕様の明確化

2. **開発効率の向上**
   - 変更による影響範囲の把握が容易
   - デバッグ時間の削減
   - ドキュメントとしての役割

### 実践的なTips

1. **テストの粒度**
   - 一つのテストケースでは一つの機能のみを検証
   - 境界値のテストを忘れずに実装

2. **テストデータの管理**
   - FactoryBotを活用したテストデータの作成
   - 必要最小限のデータセットの準備

3. **テストの保守性**
   - DRYな記述を心がける
   - 適切な名前付けとコメントの追加

## まとめ

RSpecを使用したテスト駆動開発は、単なるバグ防止以上の価値があります。コードの品質向上、仕様の明確化、そして開発効率の向上に大きく貢献します。

特に印象的だったのは、テストを書くことで自然とコードの設計が改善されていく点です。テストが書きづらいコードは、往々にして設計に問題がある場合が多く、テストを書く過程で自然とリファクタリングの機会が得られます。

## 参考資料
- [RSpec公式ドキュメント](https://rspec.info/)
- [Better Specs](https://www.betterspecs.org/)
- [Everyday Rails - Testing with RSpec](https://leanpub.com/everydayrailsrspec)
【TyeScript】never型を使った網羅性チェック

# はじめに
この記事では、TypeScript の never型を使った網羅性チェックについて記載します。
網羅性チェックとは、ロジックがすべてのパターンを網羅しているかをコンパイラにチェックさせることです。

なお、never型の概要については、別途以下の記事で記載しています。

https://qiita.com/Yasushi-Mo/items/33b417c4d9464c827465

# never型を使った網羅性チェック
ユニオン型の分岐処理時、default に never型を使って網羅性チェックができます。

```sample.ts
type PaymentMethod =
  | { type: "credit_card"; cardNumber: string }
  | { type: "paypal"; email: string }
  | { type: "bank_transfer"; accountNumber: string };
```

上記のユニオン型の2パターンのみ対応した分岐処理の default に never型を使うとエラーになります。

```sample.ts
function processPayment(method: PaymentMethod): string {
  switch (method.type) {
    case "credit_card":
      return `Processing credit card payment for card: ${method.cardNumber}`;
    case "paypal":
      return `Processing PayPal payment for email: ${method.email}`;
    default:
      // Exhaustive check using never
      const _exhaustive: never = method;
      throw new Error(`Unhandled payment method: ${_exhaustive}`);
  }
}
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318188/2ad05ca3-1d29-1d74-1c46-af865d709216.png)

エラーが出ることで網羅性がないことに気がつくことができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318188/3bc26da3-3d99-14fa-2b7c-581256777c0e.png)


:::note
never型を使わないと、網羅性がなくてもエラーになりません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318188/67fb7431-0a09-0d8a-fcb2-86793e4bab2f.png)

:::

# 参考
- [never](https://www.typescriptlang.org/docs/handbook/2/functions.html#never)
- [never型](https://typescriptbook.jp/reference/statements/never)
- [Type Compatibility](https://www.typescriptlang.org/docs/handbook/type-compatibility.html#any-unknown-object-void-undefined-null-and-never-assignability)
#0007（2024/01/07）プライベートIP・パブリックIPアドレスの調べ方

# モチベーション
- 最近、パブリックIPアドレスを聞かれたので、そのときの調べ方を記録する
- ついでに、プライベートIPアドレスの調べ方も記録する

# プライベートIP
- mac の場合

``` bash
ifconfig # en0の結果を見る
```

```
en0: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500
	options=6460<TSO4,TSO6,CHANNEL_IO,PARTIAL_CSUM,ZEROINVERT_CSUM>
	ether [MACアドレス]
	inet6 [IPv6アドレス] prefixlen 64 secured scopeid 0xb
	inet6 [IPv6アドレス] prefixlen 64 autoconf secured
	inet6 [IPv6アドレス] prefixlen 64 autoconf temporary
	inet [IPv4アドレス] netmask 0xffffff00 broadcast 192.168.11.255
	nd6 options=201<PERFORMNUD,DAD>
	media: autoselect
	status: active
```

# パブリックIPアドレス

## WEBサービス
- [WhatIsMyIP](https://www.whatismyip.com/)
- [WhatIsMyIPAddress](https://whatismyipaddress.com/)

## コマンド
- macの場合
```
curl ifconfig.me
curl icanhazip.com
```

# 参考
- chatgptの回答
サーバーレスデータ基盤Upstashの全貌 - 4つの主要サービスの特徴と実装例

# はじめに

本記事では、Upstashが提供する主なサービス（Redis、Vector、QStash）について、各サービスの概要と使用例をまとめています。

サーバーレス環境との相性が良く、導入が容易な点が魅力です。ぜひ参考にしてみてください。

## Upstashとは？
Upstashはサーバーレスに特化したデータプラットフォームです。  
データベースやメッセージング、スケジューリングなどをクラウド環境で手軽に利用できるように設計されており、インフラ管理の負担を大幅に軽減しつつ、拡張性の高いアプリケーション開発をサポートします。

## Upstash Redis
### 特徴
- REST APIでアクセス可能
- 8つ以上のリージョンでグローバルレプリケーション
- サーバーレス環境に最適化された設計
- 従量課金制で使用量に応じた料金体系

### 使用例
1. **セッション管理**  
   - REST APIを使い、サーバーレス環境でユーザーログイン情報をキャッシュ
   - 一時的なデータを高速に読み書きできる
2. **レート制限**  
   - リクエスト数のカウント用データをRedisに保存
   - 簡単なRedisコマンドで瞬時にカウント更新・チェックが可能
3. **LLMアプリケーション連携**  
   - 高速なデータ処理とセッション管理
   - リアルタイムレスポンスの実現

```bash
# 例：REST APIを用いた簡単な書き込み例（cURLを利用）
curl -X POST https://<UPSTASH_REDIS_URL> \
  -H "Authorization: Bearer <YOUR_TOKEN>" \
  -H "Content-Type: application/json" \
  -d '{
    "command": "SET",
    "args": ["greeting", "Hello Upstash!"]
  }'
```

## Upstash Vector
### 特徴
- AIやLLM向けに最適化されたベクターデータベース
- DiskANNとFreshDiskANNアルゴリズムを採用
- コサイン類似度、ユークリッド距離、内積などの類似度関数をサポート
- JSONメタデータの保存機能

### 使用例
1. **類似画像検索**  
   - 画像特徴量をベクトル化して保存
   - 類似する画像を高速に検索し、ECサイトやSNSでのレコメンドに活用
2. **テキスト埋め込み検索**  
   - 文書を埋め込みベクトル化して保存
   - FAQ検索やドキュメント検索で高い検索精度を実現

```python
# 例：ベクトル登録の疑似コード例 (Python)
from upstash_vector import Index

index = Index(url="your-url", token="your-token")

index.upsert(
    vectors=[{
        "id": "doc123",
        "embedding": [0.12, 0.98, 0.35],
        "metadata": {
            "title": "Upstash Vector Example"
        }
    }]
)
```

## Upstash QStash
### 特徴
- HTTPベースのメッセージングとCRONスケジューリング機能
- デッドレターキュー（DLQ）による失敗処理
- メッセージの重複排除機能
- LLM APIのネイティブサポート
- 最大2時間の実行時間制限

### 使用例
1. **定期実行タスク**  
   - CRONスケジューリング機能を使い、バッチ処理やレポート生成などを自動化
   - REST APIを呼び出すだけで定期実行をセットできる
2. **サーバーレス間メッセージ連携**  
   - LambdaやCloud Functionsなど複数のサーバーレス環境へHTTPで通知
   - 新規リソース作成や更新があった場合に即座に関連処理を実行
3. **LLM処理の非同期実行**  
   - タイムアウト制限を回避
   - 自動リトライによる安定性向上

```bash
# 例：定期実行設定の簡単な作成例（cURLを利用）
curl -X POST https://qstash.upstash.io/v2/publish/<YOUR_ENDPOINT> \
  -H "Authorization: Bearer <YOUR_TOKEN>" \
  -H "Upstash-Cron: 0 * * * *" \
  -d '{"task": "executeBatchJob"}'
```

## まとめ
Upstashは、サーバーレスアーキテクチャに最適化されたデータプラットフォームとして、**Redis**・**Vector**・**QStash**など多様なサービスを提供しています。  
小規模のPoCから本番運用まで、インフラ管理の手間を抑えて高い拡張性が得られるのが魅力です。  
従量課金制の料金体系により、使用量に応じた柔軟な運用が可能です。

--- 

### 参考
- [1] Upstash: Serverless Data Platform <https://upstash.com>  
- [2] Get Started - Upstash Documentation <https://upstash.com/docs/introduction>

---
### 会社紹介

**株式会社 Mosaica**  
最先端テクノロジーで社会課題を解決し、持続可能な未来を創造する IT カンパニー。
AI ソリューション、クラウド統合、DX 推進、経営コンサルティングなど包括的なサービスでビジネス変革を支援しています。  

詳しくは [公式サイト](https://mosaica.co.jp/) までお気軽にご相談ください。
公式サイト： https://mosaica.co.jp/
順序回路の作法 その15

# 概要
順序回路を理解する。
D-FF、書いてみた。

# 成果物

https://embed.plnkr.co/plunk/JmtAUhTkGsIJbQFL

https://plnkr.co/edit/Oqs8pUKJumx5ts4j?preview

# 写真


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/5cee77f8-e296-cd4e-910b-d3a95ee4b766.png)

以上。
AWS Certified Cloud Practitioner取得に向けて

# はじめに

今回初めて記事を投稿することになりました。
至らない部分もございますがお手柔らかにお願いします。

私はインフラエンジニアとして日々業務にあたっていますが、社会人として避けては通れない「なんらかの資格取得」をする必要が出てきました。

そこで、普段使用しているAWSの資格を調べていた所「AWS Certified Cloud Practitioner」を発見したため挑戦することにしました。

# 受験する試験

AWS Certified Cloud PractitionerはAWSの認定資格の中で一番ベースとなる資格です。

![スクリーンショット 2025-01-07 3.03.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3582887/15723a94-debd-b4bb-739a-de788a044d80.png)
[参照](https://d1.awsstatic.com/ja_JP/training-and-certification/docs/AWS_certification_paths.pdf)

久しぶりの試験なので"感覚を取り戻したい"＋"AWSの認定資格試験の傾向を見る"ために
この試験を受けることにしました。

# 合格までのスケジュール

1. 試験日を決める
先に決定することで自分を追い込む
↓
2. 試験予約をする
試験費用を支払うことで自分を追い込む
↓
3. 試験範囲の把握
公式が出している[ドキュメント](https://d1.awsstatic.com/ja_JP/training-and-certification/docs-cloud-practitioner/AWS-Certified-Cloud-Practitioner_Exam-Guide.pdf)を確認
↓
4. ひたすら勉強！！！！
問題演習をして解説を読み込む

### 補足
* 試験はオンラインで受けることが可能ですが、試験官のスケジュールによって予約できる日時が限られます（24時間365日いつでもOK！ではない）
* 予約後も試験日は変更することもできます（2回まで）
* オンライン試験は[ピアソンVUE](https://www.pearsonvue.com/jp/ja/test-takers/log-in.html)にて実施されます
* ピアソンVUEでは「Amazon Web Services (AWS) | AWS 認定」を指定してAWSのアカウントを作成する必要があります
* 試験中は試験官がカメラとマイクでチェックしています。 

試験予約やPCの試験環境を整えるのに思ったより時間がかかるため余裕を持って計画しましょう


# 勉強ツール

AWSのコンソールは普段触っていますが、試験勉強が久しぶりだったので
講座よりも実践的な問題がたくさん解けるものを探していました。
色々調べて**Udemy**を使用している先輩方の記事を見つけたため、自分でも使用してみることにしました。

私が使用した問題集はこちらです。
>【CLF-C02版】この問題だけで合格可能！AWS 認定クラウドプラクティショナー 模擬試験問題集（6回分390問）
https://www.udemy.com/course/aws-4260/?couponCode=NEWYEARCAREERJP

この他にも講師の方の説明が視聴できる講座もあるようです。
>【CLF-C02版】これだけでOK! AWS認定クラウドプラクティショナー試験突破講座（豊富な試験問題300問付き）
https://www.udemy.com/course/ok-aws-e/?couponCode=NEWYEARCAREERJP


### そしてなんとUdemyでは新年のビッグセール開催中のようです！
**1/10までのため、気になるものを購入されてみてはいかがでしょうか？**

私が購入した問題集は83%OFFでした。ショックです…
買い物上手な皆様はこの機会に購入をおすすめします。


# Udemyの問題集を使用して

AWSはAmazonが開発しているクラウドサービスのため、公式ドキュメントでも日本語訳が用意されていなかったり、様子がおかしい場合が散見されます。

ネットに落ちている無料の問題は問題文の日本語訳が怪しいものもあるのですが、比較的違和感なく使用することができました。
また解説に図解が載っていたり、AWSの公式ドキュメントへのリンクがあるので間違えた点の理解を深めることができました。

### 補足
* 同じ模擬試験を何度も繰り返し解くと、問題文に対する答えを覚えてしまうので時間を置いて解くようにしましょう。

* 模擬試験は本番と同様に65問で「基本レベル2つ＋本番レベル4つ」です。

* 基本レベルはAWSのサービス名を聞かれることが多く、本番レベルは仮定の環境に対して最適なサービスを選択するような問題が多いように感じました。
実際試験を受けてみて後者の問題が多かったため、基本レベルはサービス名を覚える用途で使用すると良いと思います。

* 試験範囲としてAWSのサポート体制や料金体系なども含まれており、そういった問題も意外と出題されていました。

# 最後に
先日試験を受けた所、無事合格することができました！
754点/1000点 でしたので高得点では有りませんが、ひとまず合格して安心しました。

普段からAWSの特定のサービスを使用していたり、AWS請求代行に関わる業務に当たっていたため、一部の試験範囲は理解している内容でしたが
普段使用しないサービスも多数存在するため幅広い知識が必要になると実感しました。
一番ベースとなる初級の資格試験とはいえ、ある程度のITの知識が必要となる試験だと思いました。
エンジニアでは無く、AWSを使用しない方が合格するには講座を受けてしっかり勉強した方が良さそうです。

特に開発が目覚ましい生成AI系サービスは、受験する時期によって出題されるサービスも変わっていくと思うので、購入してから時間を置かないほうがよいかもしれません。
問題集に出てきた生成AI系サービスは出題されました！
（ネットで調べた生成AI系サービスは情報が古かったのか出題されませんでした。）

[Udemy](https://www.udemy.com/)の新年のビッグセールのタイミングで次に挑戦する
「AWS Certified Solutions Architect – Associate」の講座や問題集を購入しました。
引き続き資格試験の取得を頑張って行きたいと思います。
合格できたらまた記事を書きたいです。

最後まで読んでいただきありがとうございました！
Spring Frameworkの@ComponentでDIを最大活用する方法


**依存性注入（DI: Dependency Injection）**は欠かせない技術の一つです．中でも`@Component`は、DIをシンプルに管理するための基本的なアノテーションです．本記事では、`@Component`の役割と使い方を解説し、その便利さを活かした開発手法について少し掘り下げてみます．

### `@Component`の基本と役割

`@Component`は、Springがクラスを管理するためのアノテーションです．このアノテーションをクラスに付与すると、Springコンテナがそのクラスを**Bean**として登録し、必要な場所でインスタンスを自動的に注入できます．

#### 主な役割
- **インスタンス管理**: アプリケーション全体で使用可能なSingletonインスタンスを生成します．
- **依存関係の解決**: 他のクラスから利用できるようにし、依存関係を簡単に解決します．

#### 使用例

以下は、`@Component`を使ったシンプルな例です．

```kotlin:UtilityService.kt
import org.springframework.stereotype.Component

@Component
class UtilityService {
    fun calculate(value: Int): Int = value * 2
}
```

このクラスは、Springコンテナが管理するBeanになります．他のクラスで以下のように利用できます．

```kotlin:AnotherService.kt
@Component
class AnotherService(private val utilityService: UtilityService) {
    fun executeLogic(input: Int): Int = utilityService.calculate(input) + 10
}
```

`AnotherService`は`UtilityService`に依存していますが、明示的にインスタンスを生成する必要がなく、**Springが自動的に注入**してくれます．

---

## `@Component`と他のアノテーションとの比較

`@Component`はSpringの基礎となるアノテーションですが、**より具体的な用途**に応じた派生アノテーションがあります．

### `@Service`
- **主にビジネスロジックを持つクラス**で使用されます．
- 例えば、データ処理や複雑な計算処理などの責務を持つクラス．

### `@Repository`
- **データアクセス層（DAO: Data Access Object）**に使用されます．
- データベースとのやり取りを担当するクラスに付与することで、例外の変換などSpring固有の機能を有効にします．

### `@Controller`/`@RestController`
- **Webリクエストを処理するクラス**で使用されます．
- HTTPリクエストとレスポンスを扱い、MVCアーキテクチャにおけるコントローラーの役割を果たします．

これらのアノテーションは、すべて`@Component`を継承しており、機能面では同じですが、**意図を明確にするために使い分け**るのが一般的です．


## 開発の効率を上げる`@Component`の利点

### **1. インスタンス管理の一元化**
手動でオブジェクトを管理する必要がなく、Springが生成とライフサイクルの管理を自動化します．

### **2. コードの再利用性向上**
`@Component`で登録したクラスはアプリケーション全体で利用可能です．これにより、同じ機能を複数箇所で再利用する際のコストが削減されます．

### **3. モジュール化の促進**
`@Component`を活用してクラスを適切に分割することで、**単一責任の原則（SRP: Single Responsibility Principle）**に基づいた設計が容易になります．



## 実際に利用してみての感想

個人的に`@Component`の一番の利点は、その**柔軟性と拡張性**にあると感じます．クラスをリファクタリングしてもSpringが適切に管理してくれるため、依存性の変更が発生しても影響を最小限に抑えられます．

また、`@Component`を基本に、用途に応じて`@Service`や`@Repository`を使い分けることで、クラスの役割が明確になり、**可読性の向上**にも繋がります．


## まとめ
Spring Frameworkの`@Component`は、DIを活用するための強力なツールです．これを使うことで、インスタンス管理の煩雑さから解放され、開発効率やコードの品質が向上ができます．用途に応じてアノテーションと組み合わせて利用することで、より洗練された設計が可能になります．意識して実際に取り組んでいきたいですね．
gradleとdockerで環境構築してみた

# new article body
ソフトウェア開発において、効率的な環境構築は重要なテーマです。本記事では、**Docker Compose** と **Gradle** を用いてアプリケーション環境を構築する手順を備忘録として残す.

---
## 環境構築の基本: Docker ComposeとGradleの導入

まずは、環境構築の核となる **Docker Compose** と **Gradle** について説明します.

### Docker Composeのセットアップ

Docker Composeを使用すると、複数のコンテナを連携して管理できます。今回のプロジェクトでは、以下の2つのサービスを構築.

- **MySQL**: アプリケーションのデータベースとして使用
- **アプリケーションコンテナ**: Spring BootとKotlinを動作させる環境

以下が基本的な `docker-compose.yml` の例です。

```yaml:docker-compose.yml
version: '3.8'

services:
  mysql:
    image: mysql:8.0
    container_name: mysql
    ports:
      - "3306:3306"
    environment:
      MYSQL_ROOT_PASSWORD: 
      MYSQL_DATABASE: 
      MYSQL_USER: 
      MYSQL_PASSWORD: 
    volumes:
      - ./db_data:/var/lib/mysql

  app:
    build:
      context: .
      dockerfile: Dockerfile
    container_name: app
    ports:
      - "8080:8080"
    depends_on:
      - mysql
```
この設定では、MySQL が動作する環境を提供し、アプリケーションと接続できるように設定されています.

## Gradleの初期化
Gradleは、プロジェクトビルドを管理するツールです。以下のコマンドを使用してGradleプロジェクトを初期化します.

```
docker run --rm -v "$(pwd):/app" -w /app gradle:7.5-jdk17 gradle init --type kotlin-application --dsl kotlin --project-name my_project
```
このコマンドにより、基本的なGradle設定ファイルが生成できる.

### よくある課題とその解決法
環境構築時に遭遇しがちな課題とその対処法を紹介します。

環境変数の管理
エラー例:

```
WARN[0000] The "MYSQL_PASSWORD" variable is not set. Defaulting to a blank string.
```
このエラーは、docker-compose.yml 内で環境変数が設定されていない場合に発生.

解決方法: .env ファイルを使用することで環境変数管理できる.

```
MYSQL_ROOT_PASSWORD=my_password1
MYSQL_DATABASE=my_database
MYSQL_USER=my_user
MYSQL_PASSWORD=my_password2
```

docker-compose.yml に以下のように記述します。
```
environment:
  MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
  MYSQL_DATABASE: ${MYSQL_DATABASE}
  MYSQL_USER: ${MYSQL_USER}
  MYSQL_PASSWORD: ${MYSQL_PASSWORD}

build:
  context: .
  dockerfile: Dockerfile
```

## Gradleの設定
## Gradleの設定

Gradleのデフォルト設定を基に、プロジェクトに応じたカスタマイズを行うことで、より効率的なビルドプロセスが実現できます。この章では、Gradle設定の具体例と、その利便性について解説します。

---

### デフォルトの`build.gradle.kts`のカスタマイズ

以下は、Kotlin DSLを使用した`build.gradle.kts`の基本構成例
このファイルをカスタマイズすることで、依存関係やビルドタスクを簡単に拡張できる.

```kotlin:build.gradle.kts
plugins {
    kotlin("jvm") version "1.8.0"
    kotlin("plugin.spring") version "1.8.0"
    id("org.springframework.boot") version "3.1.0"
    id("io.spring.dependency-management") version "1.1.0"
}

group = "com.example"
version = "0.0.1-SNAPSHOT"
java.sourceCompatibility = JavaVersion.VERSION_17

repositories {
    mavenCentral()
}

dependencies {
    implementation("org.springframework.boot:spring-boot-starter-web")
    implementation("org.jetbrains.kotlin:kotlin-reflect")
    implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8")
    testImplementation("org.springframework.boot:spring-boot-starter-test")
}
```

## DockerとGradleを使うメリット
この方法にはいくつかのメリットがある.

### 再現性のある環境
Docker Composeを使うことで、同じ環境をチーム全員が再現可能.

### スケーラビリティ
他のサービスを簡単に追加できる.

### 柔軟なビルド管理
Gradleによる依存関係管理やタスクの自動化が可能.

## 感想とまとめ
今回の環境構築を通じて、Docker ComposeとGradle の強力さを再確認しました。特に、エラー対応やディレクトリの整理を行うことで、環境構築の効率が大幅に向上しました。
Seederの作成で、insertとinsertOrUpdateとcreateの使い分けについて

Laravelでデータベースの初期データを投入する際に役立つ**Seeder**ですが、データの挿入方法として`insert`、`insertOrUpdate`、`create`など複数の手法があります．
どの場面でどのメソッドを使うべきか、使い分け方について具体的に解説します．

## Seederでの基本的なデータ挿入方法
Seederを利用することで、テストや開発時に必要なデータを簡単にデータベースへ投入できます．  
`insert`、`insertOrUpdate`、`create`はそれぞれ異なる特徴を持ち、目的や要件に応じて適切に選ぶことが重要です．

### 1. `insert`メソッド
`insert`メソッドは**複数行のデータを一括で挿入**するのに適しています．
Laravelのクエリビルダーを用いると以下のように記述できます．

```php:DatabaseSeeder.php
use Illuminate\Support\Facades\DB;

DB::table('users')->insert([
    ['name' => 'Taro', 'email' => 'taro@example.com', 'created_at' => now()],
    ['name' => 'Hanako', 'email' => 'hanako@example.com', 'created_at' => now()]
]);
```

**特徴**  
- **複数レコードを一度に挿入**できるのでパフォーマンスが良い．  
- `insert`では**IDの自動生成（auto-increment）**が考慮されないため、データの重複には注意が必要です．  
- レコードが既に存在する場合でも、挿入されてしまいます．

**使い所**  
- データが完全に新規で、存在するレコードとの重複チェックが不要な場合．  
- テストデータを一括で投入する場合．

---

### 2. `updateOrInsert`メソッド
**レコードが存在すれば更新、存在しなければ挿入**する便利なメソッドです．

```php:DatabaseSeeder.php
use Illuminate\Support\Facades\DB;

DB::table('users')->updateOrInsert(
    ['email' => 'taro@example.com'], // 検索条件
    ['name' => 'Taro', 'updated_at' => now()] // 更新内容
);
```

**特徴**  
- **レコードの存在チェックを内部で行う**ため、データの重複を防ぎます．  
- `updateOrInsert`と似ていますが、**updateOrInsertは単一レコード**に対してのみ動作します．

**使い所**  
- 特定の条件でデータが存在する場合のみ更新、存在しない場合は挿入する場合．  
- 主キーやユニークキーを基準に重複チェックが必要なケース．  

**注意点**  
- 複数レコードを一度に処理することはできません．性能面で`insert`よりやや劣ります．

---

### 3. `create`メソッド

`create`メソッドはEloquentモデルを通してレコードを挿入する方法です．

```php:DatabaseSeeder.php
use App\Models\User;

User::create([
    'name' => 'Taro',
    'email' => 'taro@example.com',
    'password' => bcrypt('password123')
]);
```

**特徴**  
- **モデルのインスタンスを利用**するため、`created_at`や`updated_at`などのタイムスタンプが自動で設定されます．  

**使い所**  
- Eloquentモデルを活用したい場合．  
- 単一のレコードを追加する場合やタイムスタンプが必要なケース．  
- データのバリデーションやアクセサ/ミューテータを利用したい場合．

---
- `fillable`プロパティを設定することで、セキュリティリスクを軽減します．  
```php:User.php
protected $fillable = ['name', 'email', 'password'];
```
---

## 個人的な感想とベストプラクティス

個人的には**開発中のSeeder**では、`insert`を使うことが多いです．
`insert`では`created_at`や`updated_at`が設定されないため、管理が面倒です．
ただし、大量のデータを一括で投入する場合は**`insert`が高速です．
本番環境のデータ投入など、性能を重視する場面ではこちらを選ぶべきだと思います．

---
### **テスト環境では`updateOrInsert`が便利**
一方で、**テスト環境のデータベース作成**を考えると、`updateOrInsert`を利用する方が良いケースも多いと思います．  

**理由**  
- データの重複を避けつつ、すでに存在するレコードを更新できる．  
- テストデータの投入が何度も行われる場合でも、同じデータが重複して挿入されることを防げる．  

具体例として、テスト時に特定の条件のレコードを保持したまま、データを追加・更新する場合に役立ちます．

```php:DatabaseSeeder.php
DB::table('users')->updateOrInsert(
    ['email' => 'taro@example.com'], // 条件
    ['name' => 'Taro', 'updated_at' => now()] // 更新・挿入内容
);
```

このように`updateOrInsert`を使えば、**テスト環境でシンプルかつ安全にデータを管理**できるため、特に繰り返しSeederを実行するシーンではおすすめです．

---

このように、**使う場面や目的に合わせて`insert`と`updateOrInsert`を使い分ける**ことが、効率的なSeeder作成のポイントだと思います．


## まとめ

LaravelのSeederにおける`insert`、`insertOrUpdate`、`create`の使い分けについて解説しました．  

- **`insert`**：高速だが重複チェックはない．  
- **`insertOrUpdate`**：重複を避けつつ更新or挿入する．  
- **`create`**：Eloquentモデルを活用し、タイムスタンプが自動設定される．

場面に応じて使い分けることで、効率よくデータを投入できるようになります．
Riderが複数行のTODOコメントをサポートした

JetBrains社の.NET向けIDE、[Rider](https://www.jetbrains.com/ja-jp/rider/)が2024.3から複数行のTODOコメントをサポートするようになりました。

---

コメント行で「TODO」と書くと、通常のコメントとは異なるハイライトがされ、TODOリストウィンドウで一覧することが可能です。

https://www.jetbrains.com/help/rider/Navigation_and_Search__Navigating_Between_To_do_Items.html

Rider 2024.3から、複数行のTODOコメントも適切にハイライトするようになりました。一つ以上スペースをインデントとして挿入すると、複数行のTODOコメントとして認識されます。

![スクリーンショット 2025-01-06 23.25.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4125/81df73a9-1071-ea0c-5ee8-f8d4b49e98ef.png)

 TODOリストウィンドウでも複数行のコメントが、全行表示されます。

![スクリーンショット 2025-01-06 23.07.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4125/56ff5889-6bdd-e9b3-4246-585005b266d1.png)

複数行TODOに未対応の2024.2と、対応済みの2024.3で比較すると次のようになります。

| | 2024.2(未対応) | 2024.3(対応済み) |
|:---:|:---:|:---:|
| 全体 | ![スクリーンショット 2025-01-06 23.07.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4125/d433a807-6bd6-d773-51d8-c5960d718477.png) | ![スクリーンショット 2025-01-06 23.25.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4125/81df73a9-1071-ea0c-5ee8-f8d4b49e98ef.png) | 
| TODOリストウィンドウ| ![スクリーンショット 2025-01-06 23.07.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4125/d367dcb2-7bb5-2a85-b1c7-3a84d6893575.png) | ![スクリーンショット 2025-01-06 23.07.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4125/56ff5889-6bdd-e9b3-4246-585005b266d1.png) |

複数行のTODOは、設定のEditor > TODOで、次のチェックボックスを無効にすることができます。

![スクリーンショット 2025-01-06 23.28.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4125/5a1577ed-17dd-b1e1-2a4f-312a3d032239.png)

RiderはTODO関連の機能として、TODOのグルーピングやフィルタリング、パターンマッチ、ナビゲーションなどの便利な機能を備えています。ぜひ活用してみてください。
OutSystemsの例外時トランザクションについての自分メモ

# 初めに
OutSystemsのWebDeveloperの認定試験勉強において、例外とトランザクションの学習をした。知識としては知っているが、きちんと試しておきたいと思ったので備忘録代わりに書き留めておくものである。

# 環境
Outsystems O11
Service Studio Version 11.54.37

# 学習していて気になった点
以下のドキュメントを呼んでいて気になった点を挙げていく。

[Handling transactions](https://success.outsystems.com/ja-jp/documentation/11/reference/outsystems_language/data/database_reference/handling_transactions/)

## トランザクションの開始
> While processing a web request, OutSystems begins a database transaction on its first access to the database. The transaction is committed before OutSystems sends the response to the user.（Webリクエストの処理中、OutSystemsはデータベースへの最初のアクセス時にデータベーストランザクションを開始します。トランザクションは、OutSystemsがユーザーに応答を送信する前にコミットされます。）

中途半端な知識で、ActionのExceptionHandler毎にCommitとAbortを設定できると聞きかじっていたため、Action毎にトランザクションが開始されているものと思っていた。
web request毎、つまりClientAction、ScreenActionからServerActionが呼ばれた後、そのAction内で初めてデータベースへ最初のアクセスが発生したときにトランザクションが始めると理解した。web requestとあるが、Timerで呼び出された場合なども同様と考えてよさそう。

## トランザクションを再度開始する
> You can manage transactions explicitly through the CommitTransaction and AbortTransaction actions:
> CommitTransaction: Issues a database COMMIT statement that makes effective all changes done on the database since the beginning of the current transaction. It also ends the current transaction and starts a new one. After a CommitTransaction, the action flow continues.
> （現在のトランザクションの開始以降にデータベースに対して行われたすべての変更を有効にするデータベースCOMMITステートメントを発行します。また、現在のトランザクションを終了し、新しいトランザクションを開始します。CommitTransactionの後、アクションフローは続行されます。）
> AbortTransaction: Issues a ROLLBACK statement that undoes all changes performed on the database since the beginning of the current transaction. It also ends the current transaction and starts a new one. After an AbortTransaction, the action flow continues.
> （現在のトランザクションの開始以降にデータベースで実行されたすべての変更を元に戻すROLLBACKステートメントを発行します。また、現在のトランザクションを終了し、新しいトランザクションを開始します。AbortTransactionの後、アクションフローは続行されます。）

> The transactions are always sequential, they cannot be nested.（トランザクションは常に連続しており、ネストすることはできません。）

一つの処理の中でトランザクションの開始後、そのトランザクションが終了するまで再度トランザクションを開始することはできない。
さらに、何らかの理由で例外が発生してしまった場合、CommitTransactionかAbortTransactionが実行され新たにトランザクションが開始されるため。例外をまたいでトランザクションを維持することができない。
今はまだ困ったことがないが、実装によってはここでつまずく可能性がありそうだなと感じた。

# 確認のため実装してみた

## 実装
1. ParentActionはScreenActionより呼び出される
1. ParentActionは例外処理をしない
1. ChildActionは例外処理をし、AbortTransactionをYesに設定している
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3796185/5f7fecdf-293b-9c2e-1a89-a9567e476d75.png)

## 実行
ParentAction内やChildAction内で例外を発生させてみた。

### ①の直後で例外を発生させた場合
TestEntityへの新しいレコードは１件も追加されない。

### ②のActionのCreate直後で例外を発生させた場合
①と②のレコードは追加されず、③と④のレコードは追加される。

### ②のActionのCreate直後で例外を発生させた場合
①と②と③のレコードは追加されず、④のレコードは追加される。

### ④の直後で例外を発生させた場合
TestEntityへの新しいレコードは１件も追加されない。

### ②と③のActionのCreate直後で例外を発生させた場合
①と②と③のレコードは追加されず、④のレコードは追加される。

## 結果
あたりまえだが例外が発生した時点までのCreateがすべてロールバックされることを確認できた。
細かい制御を行いたい場合はSystemのCommitTransactionやAbortTransactionを使う必要がありそうだ。

# まとめ
例外処理のトランザクション処理には大まかなルールがあり、ルールを理解したうえで使えば大抵の処理には対応できるが確認できた。しかし細やかな処理を書こうとするとSystemのCommitTransactionやAbortTransactionを明示して処理を書かなくてはならないことを確認できた。
ルールを頭に入れて設計・コーディングをしていきたい。
AZ-305で覚えておきたいサービスまとめ その1

AZ-305の学習の際に知ったサービスなどをまとめています。どの端末からも見返すことが出来るので意外と便利です。基本的に自分の資格勉強のためだけに書いていますが、もし誰かの為になったら嬉しいです。

## Azure File Sync
* Azureファイル共有（Azure StorageのFile）に保存しているデータをオンプレミスなどのWindows Serverにキャッシュして利用できるサービス
    * Azureファイル共有は、Azure File Syncをデプロイするのと**同じリージョン**に必要

### メリット
* オンプレミスのファイルサーバをクラウドに拡張できる
* クラウドで一元管理して複数拠点で共有できる
* バックアップや災害対策

## Azure Migrate
* オンプレや他社クラウドからAzureへの移行を支援してくれるサービス
* Azure Migrateの評価ツールを使うと、オンプレにあるサーバを検出し、Azureに対応できるかどうかなどの評価を行うことができる

## Azure Logic Apps
* アプリケーション、データ、システム、およびサービスを簡単に統合するためのワークフローの自動化を提供するサービス
* 視覚的なデザイナーを使用してワークフローを作成できるため、ローコード/ノーコード開発が可能

### メリット
* コーディング不要でプロセスを迅速に自動化
* カスタマイズ可能で幅広いシナリオに対応
* Azureのスケーラブルな基盤を活用

### 料金モデル
* ワークフローの実行数に基づく従量課金制


## Azure Functions 　プランまとめ
| 特徴                | **従量課金プラン**        | **Flex従量課金プラン**    | **プレミアムプラン**            | **専用プラン**                    |
|---------------------|-----------------------------------------|-----------------------------------------------|-----------------------------------------------|-----------------------------------------------|
| **料金モデル**       | 実行時間とリクエスト数に基づく従量課金   | 実行時間とリクエスト数に基づく従量課金 (柔軟性強化) | 従量課金 + 専用リソースの課金                 | 仮想マシンの課金に含まれる                   |
| **スケーリング**     | イベントに応じて自動スケーリング         | イベントに応じたスケーリング、柔軟な割り当て調整が可能 | より高速なスケーリング (常にインスタンスが準備済み) | 仮想マシンに依存                              |
| **最大スケール数**   | 無制限                                 | 無制限                                       | 無制限 (課金が適用されるリソース内で)          | 仮想マシンのリソースに依存                    |
| **コールドスタート** | あり                                   | あり (ただし改善オプションあり)               | なし（常に「ウォーム」状態のインスタンスが確保） | なし                                        |
| **仮想ネットワーク統合** | 一部制限あり（送信のみ対応）            | 一部制限あり（送信のみ対応）                   | 完全にサポート                                | 完全にサポート                                |
| **最大実行時間**     | 5分（延長設定で10分）                   | 5分（延長設定で10分）                         | 無制限                                       | 無制限                                       |
| **主なユースケース** | 小規模アプリ、イベント駆動型のワークロード | イベント駆動型アプリ、柔軟なリソース管理が必要な場合 | ミッションクリティカルなアプリ、高いパフォーマンスが必要な場合 | 常に稼働しているアプリ、大規模なシステム     |

## Azure Event Grid
* パブリッシュ/サブスクライブ モデルを使用した画一的なイベントの使用を可能にする、フル マネージド イベント ルーティング サービス
* AWSでいうEventBridge

## Azure Front Door
* アプリケーション レイヤーにインテリジェントなルーティングとキャッシュの機能を備えたグローバル コンテンツ配信を提供する Azure サービス
* AWSでいうCloudFront
* StandardとPremiumの違いはセキュリティ系のオプションがあるか
    * Premiumは以下が利用できる
        * Microsoftマネージドルールセット
        * ボット保護
        * 配信元へのプライベートリンク接続

## Azure Cosmos DB の整合性レベル
* Azure Cosmos DB では、5 つの明確に定義されたレベルが提供され、最強から最弱の順に、次のレベルがある
    * 厳密（強固）
    * 有界整合性制約
    * Session
    * 一貫性のあるプレフィックス
    * 最終的
無線LANルーター（Ubuntu）のパッケージを整理してみた。

# 概要

無線LANルーター（Ubuntu）のパッケージを整理してみました。
保留にされているパッケージがいくつかあったので、
いらないものは消し、いるものはアップグレードしました。

# 保留にされていたパッケージ

```
以下のパッケージは保留されます:
  alsa-utils apache2-bin coreutils geoip-database grub-common grub-pc
  grub-pc-bin grub2-common hfsplus iptables-persistent libapache2-mod-dnssd
  libaprutil1-dbd-sqlite3 libaprutil1-ldap libjxr-tools liblouisutdml-bin
  libzmq5 netfilter-persistent ntfs-3g poppler-data ufw wireless-tools
アップグレード: 0 個、新規インストール: 0 個、削除: 0 個、保留: 22 個。
```

# 消したりアップグレードしたりしたパッケージ

以下の順番で実行しました。

```
sudo apt upgrade alsa-utils
sudo apt remove apache2-bin
sudo apt upgrade coreutils
sudo apt upgrade geoip-database
sudo apt upgrade grub-common
sudo apt upgrade hfsplus
sudo apt upgrade iptables-persistent
```

一度再起動しました。

```
sudo apt remove libaprutil1-dbd-sqlite3
sudo apt upgrade file-roller
sudo apt remove libaprutil1-ldap
sudo apt upgrade libjxr-tools

sudo apt upgrade liblouisutdml-bin
sudo apt upgrade libzmq5
sudo apt upgrade ntfs-3g
sudo apt remove poppler-data

sudo apt upgrade wireless-tools
sudo apt upgrade ufw
```

最後も再起動しました。念の為。

# まとめ

何かの役に立てばと。
circuitjsの作法 その4

# 概要
circuitjsを調査してみた。
サンプル回路が凄い。
ALU ７４１８１を見つけた。

# 手順

メニュー>電子回路>組み合わせ回路>74181ALUをクリックする。

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/b7c1cd3c-f52b-bef6-7ab2-62ad4520b37c.png)

以上。
MacからGPUSOROBANへSSHしようとしたら公開鍵が通らない時の対処

VSCODEに下記のエラーが出る
>Permission denied (publickey,keyboard-interactive)

実はこれパーミッションがガバガバだから怒られている。（元のエラーを握りつぶすVSCODEの残念動作により根本原因がわからない。おこです。こまんどSSHすればエラーを読めます。下記。）

参考サイト
https://umebius.com/dev/permissions-0644-for-xxx-key-are-too-open-%E6%A8%A9%E9%99%90%E3%82%92%E3%81%A9%E3%81%86%E3%81%99%E3%82%8C%E3%81%B0%E3%81%84%E3%81%84%EF%BC%9F/

>Permissions 0644 for ‘xxx.key’ are too open.
It is required that your private key files are NOT accessible by others.
This private key will be ignored.

下記で解決
> chmod 600 ~/.ssh/*.txt
良いコード／悪いコードで学ぶ設計入門 第3章

# 第3章 クラス設計 ―すべてにつながる設計の基盤―

保守や変更がしやすいコードを実現するためには、**関心の分離**が重要です。  
オブジェクト指向は、この関心の分離を実現するのに適した手法といえます。

本章では、オブジェクト指向そのものの理論ではなく、**実務での具体的な活用方法**を中心に解説します。特に、クラス設計について詳しく取り上げます。また、**「データクラス＝悪魔」という考え方**も紹介します。

---

## 3.1 クラス単体で正常に動作するよう設計する

クラス設計の基本は、**単体で正常に動作するように設計すること**です。

### 設計のポイント
- **初期設定不要**で、最初から利用可能な状態にする。
- バグを防ぐため、**正しく操作できるメソッド**のみを外部に公開する。

### 良いクラスの構成要素
- **インスタンス変数**
- **インスタンス変数を保護し、正常に操作するメソッド**

これらを分けて実装すると、相互関係を把握するのが難しくなります。

---

### データクラスが問題となる理由
- **他のクラスがデータクラスの準備や検証を担う必要が生じる**。

### 解決策：データクラスを改善する
- **自己防衛責務**を持たせ、正常な値のみ扱うメソッドを定義します。

---

## 3.2 成熟したクラスへ成長させる設計術

クラスを成熟させるためには、以下のポイントを押さえる必要があります。

### コンストラクタで確実に正常値を設定する
- **メンバ変数をすべて設定可能**にする。
- **入力値のバリデーション**を行う。

### ガード節を設ける
- **不正値を初期段階で除外**し、不正なオブジェクトが存在しないようにする。

### インスタンス変数は不変にする
- 変数を**上書きしない**ことで、コードの理解が容易になる。
- 値を変えたい場合は、**新しいインスタンス**を作成する。

### その他の推奨事項
- **引数やローカル変数も不変**にする。
- **引数の型を明確に定義**し、値の渡し間違いを防ぐ。
- 必要なメソッド以外は**定義しない**（例：金額 × 金額のような意味のない操作を避ける）。

---

### 所感
- C++ではコンストラクタで例外を投げるとメモリリークの原因になるため、**言語ごとに設計の工夫が必要**。
- メンバ変数が多い場合、**コンストラクタの引数が複雑化する問題**がある。
- Setterを排除する設計には疑問もあり、状況に応じた柔軟な対応が求められる。

---

## 3.3 悪魔退治の効果を検証する

### 問題点とその解決
| 問題点           | 3.2 の取り組みの結果                     |
|-------------------|-------------------------------------------|
| 重複コード       | 必要なロジックが一つのクラスに集約された |
| 修正漏れ         | 重複コード解消で修正漏れが減少           |
| 可読性低下       | ロジックを探し回る必要がなくなった       |
| 生焼けオブジェクト | コンストラクタで初期化され、未初期化状態がなくなった |
| 不正値の混入     | ガード節により防止                       |
| 思わぬ副作用     | Immutable設計で副作用を排除             |
| 値の渡し間違い   | 型指定によりコンパイル時に防止可能       |

### 用語解説
- **低凝集**: 関連ロジックが散在している状態。
- **高凝集**: 関連ロジックが一箇所に集約されている状態。
- **カプセル化**: データとその操作ロジックをクラスにまとめ、必要なメソッドのみ外部に公開する。

---

## 3.4 プログラム構造の問題解決に役立つ設計パターン

### 設計パターンの例
- **完全コンストラクタ**
- **値オブジェクト**
- 他の例
  - ストラテジ
  - ポリシー
  - ファーストクラスコレクション
  - スプラウトクラス

### 完全コンストラクタ
インスタンスをすべてコンストラクタで初期化することで、不正状態から防護する設計パターン。  
Setterを用意しないことで、未初期化のリスクを排除します。

### 値オブジェクト (Value Object)
値をクラス（型）として表現する設計パターン。  
例: 金額、日付、注文数など。これにより、ロジックの高凝集化が可能となります。

---

### Column: 言語ごとの差異
言語によって提供される機能や思想は異なりますが、基本的な考え方は活かせます。  
例: `freeze()`のような不変化機能は多くの言語で提供されていますが、独自実装が必要な場合もあります。

---

### 所感
- 言語や環境によって異なる特性を考慮しながら設計を進める必要があります。
- 値オブジェクトを設計する際、ドメイン知識が欠けると適切な設計が難しい場合もあります。

---

# 方針
社内メンバと勉強会を行った結果、下記の方針で実装を行うこととなった
* 少しずつ Value Object を作っていく
    * 完全コンストラクタを意識するようにする
    * 状態の Value Object を持つ Instance 変数は変更可能
    * 値を利用する際には Getter を経由して、ORM 経由でも必ず Value Object で扱うようにする
* 意識的新しい Class (Value Object) をつくるようにしていく
* 上記方針で運用した結果の振り返りを行う
Rubyの文字列リテラルの連結と表示の仕様について 🤔

こんにちは！九兵衛です。今回は、Rubyでちょっと面白い挙動を見つけたので、その考察を共有します

## 今回の議題 ✨ (2025/01/10 修正)

Ruby技術者技能検定のGoldを目指して最初から総復習をしている時に本で見つけた記述です。

```ruby
a = "ab"'cd'
puts a  #=> abcd
p a #=> "abcd"
```
一見何気ない文字列の結合ですが、興味深い点があります。特に p メソッドを使用した場合、結果が "abcd" とダブルクオーテーションで囲まれて表示されます。これは p メソッドが内部で String#inspect を呼び出すためです。実際の文字列自体はクオーテーションの種類を保持していません。

~~一見何気ない文字列の結合なのですが、シングルクオーテーションで囲まれた文字列が、最終的にダブルクオーテーションに変換されているんです。これって、なんで？🧐~~

## 技術的に考えてみた(2025/01/10 修正)

この挙動はRubyの文字列リテラルの扱い方に深く関係していそう。
Rubyでは、隣接する文字列リテラルは自動的に結合されます。これは文字列リテラルの暗黙的な連結です。

```ruby
# 以下は全て同じ結果になります
# 以下は全て同じ文字列を生成します
# puts での出力
puts "ab" "cd"    #=> abcd
puts "ab"'cd'     #=> abcd
puts 'ab'"cd"     #=> abcd
puts 'ab''cd'     #=> abcd

# p での出力（String#inspect の結果）
p "ab" "cd"    #=> "abcd"
p "ab"'cd'     #=> "abcd"
p 'ab'"cd"     #=> "abcd"
p 'ab''cd'     #=> "abcd"
```

重要な点として、p メソッドの出力でダブルクオーテーションが表示されるのは、あくまで String#inspect メソッドの表示仕様であり、実際の文字列オブジェクトがダブルクオーテーション文字列に「変換」されているわけではありません。

## 歴史的背景を探る 📚

この挙動の歴史的背景を調べてみると、とても興味深いことがわかりました。

### C言語からの影響

実は、この機能はC言語から影響を受けています。C言語では、文字列リテラルの連結は以下のように行われます：

```c
printf("Hello " "World"); // "Hello World"と同じ
```

### 実装上の理由

Rubyの内部実装を見てみると、文字列オブジェクトの作成時に最適化が行われています。結合された文字列は新しい1つの文字列オブジェクトとして生成され、その際にデフォルトでダブルクオーテーションが使用されるようになっています。

[Ruby本体のソースコード(parse.y)](https://github.com/ruby/ruby/blob/master/parse.y)
Rubyの構文解析器の実装が格納されているファイルが **parse.y** です。ここでは、隣接する文字列リテラルを1つにまとめる処理が行われています。具体的には、C言語で書かれたパーサジェネレータ用のコードで、`"foo" "bar"` のように空白しかない2つのリテラルは一つにマージされます。

[例えばこの部分](https://github.com/ruby/ruby/blob/5698f4f2e1b8221a68989f881c03a41175736a8a/parse.y#L5957)
```
string: tCHAR
       | string1
       | string string1
         {
           $$ = literal_concat(p, $1, $2, &@$);
           /*% ripper: string_concat!($:1, $:2) %*/
         }
       ;
```
- **tCHAR**
単一の文字（例えば ?a のような Ruby の文字リテラル）を扱うルール
- **string1**
通常の文字列リテラルを扱うルール（"foo" のようなもの）。
- **string string1**
すでにパース済みの string（= 連続または単体の文字列リテラル）と、新たにパースした1個の string1 を結合し、literal_concat(p, $1, $2, &@$) で文字列を一つにまとめるロジック。

内部ではこのような処理をすることで文字列の結合を行っているようです。
(あんまり自信ないけど多分そう)

## なぜダブルクオーテーションなのか？ 🤓

ダブルクオーテーションが選ばれた理由については、以下のような要因が考えられます：

1. ダブルクオーテーションの方が、文字列の式展開（interpolation）に対応しているため、より柔軟性が高い
2. 多くのプログラミング言語でダブルクオーテーションが標準的
3. 可読性の観点から、長い文字列や複雑な文字列の場合はダブルクオーテーションの方が視認性が良い

でもぶっちゃけ本当のことはわからないのでこれは推測です。

## 実務での影響と注意点 ⚠️

この挙動は普段のコーディングではあまり問題になりませんが、以下のようなケースでは注意が必要です：

- 文字列の厳密な比較を行う場合
- 文字列の内部表現に依存する処理を書く場合
- レガシーコードのメンテナンス時

## まとめ 💡

今回のようなRubyの言語仕様の細かい部分を理解することは、より良いコードを書く上で重要だと感じました。みなさんも普段何気なく使っている機能の背景を探ってみると、新しい発見があるかもしれません！

PS: この記事に関するご意見やご指摘がありましたら、コメントやDMでお気軽にお声がけください！🙌
Javaで「パネルで使用するレイアウトマネージャーを設定する」の動作を確認してみた。

# 概要

Javaで「パネルで使用するレイアウトマネージャーを設定する」の動作を確認してみました。
以下のページを参考にしました。

https://www.javadrive.jp/tutorial/jpanel/index4.html

# 実装

以下のファイルを作成しました。

```Sample.java
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JButton;
import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.awt.Dimension;

class Sample extends JFrame{
  public static void main(String args[]){
    Sample frame = new Sample("MyTitle");
    frame.setVisible(true);
  }

  Sample(String title){
    setTitle(title);
    setBounds(100, 100, 728, 400);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    setLayout(new FlowLayout());

    JPanel panel = new JPanel();
    panel.setPreferredSize(new Dimension(300, 200));

    panel.setLayout(new BorderLayout());

    JButton button1 = new JButton("NORTH");
    JButton button2 = new JButton("WEST");
    JButton button3 = new JButton("SOUTH");
    JButton button4 = new JButton("EAST");

    panel.add(button1, BorderLayout.NORTH);
    panel.add(button2, BorderLayout.WEST);
    panel.add(button3, BorderLayout.SOUTH);
    panel.add(button4, BorderLayout.EAST);

    add(panel);
  }
}
```

以下のコマンドを実行しました。

```
$ javac Sample.java 
$ java Sample
```

# まとめ

何かの役に立てばと。
C++ Tips

# c言語オブジェクトをc++のコードにリンクさせる

以下をmain.cppにリンクさせる
```c:libmyprint.c
#include <stdio.h>
#include "libmyprint.h"

void print(void)
{
	printf("This is libmyprint\n");
}

```
```c:libmyprint.h
#pragma once
void print(void);
```

## NG
```c++:main.cpp
#include <iostream>
#include "libmyprint.h"

using namespace std;

int main()
{
	cout << "This is main" << endl;
	print();
	return 0;
}

```
ビルドすると以下のエラーが出る
```bash
$ gcc -c libmyprint.c -Wall
$ g++ -c main.cpp -Wall
$ g++ main.o libmyprint.o -o main
/usr/bin/ld: main.o: in function `main':
main.cpp:(.text+0x34): undefined reference to `print()'
collect2: error: ld returned 1 exit status
```
main.o内にprintというシンボルがないから
※C++コンパイラが名前マングリングを行い、print→_Z5printvへシンボルが変わってる
```bash
$ nm *.o

libmyprint.o:
0000000000000000 T print
                 U puts

main.o:
                 U __cxa_atexit
                 U __dso_handle
                 U _GLOBAL_OFFSET_TABLE_
0000000000000095 t _GLOBAL__sub_I_main
0000000000000000 T main
000000000000003f t _Z41__static_initialization_and_destruction_0ii
                 U _Z5printv
                 U _ZNSolsEPFRSoS_E
                 U _ZNSt8ios_base4InitC1Ev
                 U _ZNSt8ios_base4InitD1Ev
                 U _ZSt4cout
                 U _ZSt4endlIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_
0000000000000000 b _ZStL8__ioinit
                 U _ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc
```

## OK

extern "C" {}で、関数プロトタイプ宣言を囲む
※C++から呼び出させるモジュールをCリンケージに登録

```c++:main.cpp
#include <iostream>
extern "C"
{
#include "libmyprint.h"
}

using namespace std;

int main()
{
	cout << "This is main" << endl;
	print();
	return 0;
}
```
C++コンパイラの場合のみ、有効にする場合は以下。
```c++:main.cpp
#include <iostream>

#ifdef __cplusplus
extern "C"
{
#include "libmyprint.h"
}
#else
#include "libmyprint.h"
#endif

using namespace std;

int main()
{
	cout << "This is main" << endl;
	print();
	return 0;
}
```


ビルド通る
```bash
$ gcc -c libmyprint.c -Wall
$ g++ -c main.cpp -Wall
$ g++ main.o libmyprint.o -o main
$ ./main 
This is main
This is libmyprint
```
main.oにprintというシンボルがあるから

```bash
$ nm *.o

libmyprint.o:
0000000000000000 T print ★
                 U puts

main.o:
                 U __cxa_atexit
                 U __dso_handle
                 U _GLOBAL_OFFSET_TABLE_
0000000000000095 t _GLOBAL__sub_I_main
0000000000000000 T main
                 U print ★
000000000000003f t _Z41__static_initialization_and_destruction_0ii
                 U _ZNSolsEPFRSoS_E
                 U _ZNSt8ios_base4InitC1Ev
                 U _ZNSt8ios_base4InitD1Ev
                 U _ZSt4cout
                 U _ZSt4endlIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_
0000000000000000 b _ZStL8__ioinit
                 U _ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc
```

# 参考
* [CとC++が混在したプログラムでの注意点](https://zenn.dev/nomunomu0504/articles/3588befa51e54d)
* [マングリングとは](https://qiita.com/7_zidan_/items/3915218f8fda142a6b71)
ローカル環境でPHPを簡単にテストする

# PHPの環境構築をいちいち行うのは面倒

<br>

PHPのコードで作ったファイルを実行していく。

そのファイルの拡張子は「〇〇.php」となるわけだ。

これをローカル環境だけで実行してみようというお話。

いつもやり方を忘れてしまい、検索するはめになるので

自分のための忘備録としてざっくばらんに記録しておく。

<br>

<br>

# 実行までの手順書

<br>

<br>

その①　PHPをインストールしておく

<br>

パスをちゃんと通しておくこと

<br>

その②　コマンドプロンプトの起動

<br>

実行ファイル「〇〇.php」の入っているディレクトリまで移動する。

ここでは「index.php」というファイル名にした。

<br>

このファイルが入っている「フォルダ名」にまで移動。

「test」というフォルダ名にしておいた。

<br>

<br>

その③　ここが一番肝心だが

php -S localhost:3000

と入力しましょう。

※ -S という具合に

php -Sは大文字じゃないといけない。

（反映されずエラーになってしまいます）

ローカルホストのポート番号は、

任意なので

別に3000じゃなくたっていい。

いや、8080にポート番号はするべきなのか？

8080にしてるのは一体なんだろうか。

もし記事が間違ってたら、突っ込んでやってください。

コマンドプロンプト

入力例

<br>

<br>

<br>

```


cd desktop/test

php -S localhost:3000

[Tue Jan  7 04:23:19 2025] PHP 8.4.2 Development Server (http://localhost:3000) started




```

<br>

コマンドプロンプトで入力し終わったら

次にlocalhost:3000　まで移動します。

コードに書いた　Hello World! とか結果が出力されていれば

PHPの実行自体は成功しているはずです。

<br>

##  結論

<br>

私のような超初心者がPHPで書いたコードを

簡単にテストしてみたい程度なのであれば、

XAMPPをわざわざインストールなんかしなくても

これだけで十分なんですから。

やれやれ。

以上であります。

ここまで読んで頂いてありがとうございました。

php -S localhost:〇〇〇〇　で

専用のサーバーインストール不要で

ローカルホストを利用するだけでも

PHPがテストできちゃうんだよという

テーマ（ポエム）でございました。

また機会があれば次回お会いしましょう。

それではこの辺で失礼いたします。

<br>

参考文献：

<br>

https://macoblog.com/php-localserver/
2025/1/7主にITとかセキュリティの記事

国家安全保障をブロックチェーンとデジタル資産は強化できるか──CIA、FBI、シークレットサービス出身者が語る(1/5)
https://www.coindeskjapan.com/269102/

「パソコンがウイルスに感染」　北九州市門司区でサポート詐欺未遂事案(1/5)
https://news.livedoor.com/article/detail/27886312/

zkTLSの可能性と課題｜次世代暗号技術で実現するデータポータビリティとプライバシー(1/5)
https://hashhub-research.com/articles/2024-01-05-zktls-overview

米国 CISA パブコメ 国家サイバーインシデント対応計画更新案 (2024.12.16)(1/5)
http://maruyama-mitsuhiko.cocolog-nifty.com/security/2025/01/post-1431e2.html

2025年気になる通信業界トレンド（後編）(1/3)
https://qiita.com/Assie61400886/items/38c7dfebb48286044159

ミャンマー、VPNの使用制限を目的としたサイバーセキュリティ法を施行(1/4)
https://www.myanmar-news.asia/news_eNNaSCzA1a_816.html

スペイン データ保護庁 ブログ 人工知能におけるデータと情報 (2024.12.03)(1/5)
http://maruyama-mitsuhiko.cocolog-nifty.com/security/2025/01/post-285264.html

【イベントレポート】M365セキュリティ&ゼロトラスト勉強会 21(1/4)
https://qiita.com/mob_engineer/items/314f19b70d3f60fb3394

AIを使わない日本人、注目の技術“自律型AI”で利用は広がるか(1/4)
https://news.goo.ne.jp/article/ntv_news24/nation/ntv_news24-2025010409364234.html

金融機関かたり電話でアドレス聞き出し偽メール　巧妙な手口「ボイスフィッシング」(1/5)
https://news.infoseek.co.jp/article/sankein__affairs_crime_Y4DNYYH4YRMLJKIP3WES7Q3YXA/?tpgnr=poli-soci

SOC2を取ろうが、人はやはり脆弱性(1/5)
https://ascii.jp/elem/000/004/243/4243814/