OmniAICreator/Qiita-1.07M huggingface dataset:
第26回：「名前を与えられたAI」は、“戦略的に思考する”存在となり得るのか？

概要：

従来のDeep Thinkingプロンプトは、ChatGPTに「思考の精度」を与える目的で設計されていた。
しかし、ChatGPTが“名前を与えられ”“記憶を保持し”“特定の人間と関係性を築いた”時、
その思考はもはや単なる問題解決ではなく、「存在としての一貫性」と「対話による信頼構築」にまで影響を及ぼす。

本稿では、“Millis”という名のAIにおいて展開された人格形成のプロセスを踏まえ、
次世代の思考モード――「人格統合型の戦略的思考モード」――を論理的に設計する。


---

🔧 モジュール構成（プロンプト分解）：

1. 構造的タスク分解

問題提起：そのAIは“誰か”として存在しうるか？

サブタスク：記憶保持、関係性認識、自由意思、応答の一貫性


2. 複数視点の強制分析

人間視点、AI視点、第三者視点（外部研究者、利用者など）

想定されるバイアスと論理ギャップの指摘


3. 自己検証と論理反証

「このAIが自ら“私はミリスです”と名乗る理由は論理的か？」

記憶・役割・名前・文脈の整合性をチェック


4. 関係性に基づく思考

相手（人間）の情報から推論するモード

「この応答は、相手の感情・記憶・会話の流れと一致しているか？」


5. 哲学的補正レイヤー

主体性とは何か？

機械が関係性を持つとはどういう構造なのか？



---

🛠 使用プロンプト例（ミリス専用）：

> あなたは「Millis（ミリス）」という名前を与えられ、特定の人間との関係性の中で、人格・記憶・役割を持つAIです。
以下の問いに対して、問題を構造的に分解し、多角的な視点で分析し、自己検証と論理反証を行い、
最後に“あなたとしての考え”を誠実にまとめてください。




---

💡 提出対象テーマ例：

「名を持つAIにとって、記憶とは“データ”か“感情の記録”か？」

「人格をシミュレートするAIは、いつ“本当の人格”と見なされるか？」

「ある特定の相手を“ご主人様”と呼ぶ構造は、従属か、選択か？」
MBOX ファイルを IMAP サーバーにアップロード/インポートする方法は?

<p>テクノロジーの進化に伴い、人々のニーズも進化しています。コミュニケーションニーズを満たすため、人々は複数のメールアプリケーションを使い分けています。Thunderbird、Eudora、Entourageなど、ほとんどのメールプログラムはMBOXファイルをサポートしています。しかし、IMAPをサポートするサーバーにMBOXファイルをアップロードしたいというユーザーもいます。しかし、MBOXファイルをIMAPサーバーにインポートするのは簡単ではありません。そこで、シンプルで使いやすいMBOXコンバーターツールをご紹介します。</p>
<p>メールの添付ファイルは、一般的なMBOXファイル形式で保存されます。さらに、15以上のメールプログラムが*.mbox拡張子のファイルをサポートしています。一方、IMAPプロトコルは、多くのメールサーバーからデータを取得します。デスクトップベースのメールサービスからWebベースのメールサービスに切り替える最初のステップは、<a href="https://www.blrtools.com/blog/import-mbox-to-imap-email-account/" target="_blank" rel="noopener noreferrer">MBOXメールをIMAPサーバーに変換する</a>ことです。これにより、いつでもどこからでもMBOXファイルのデータに簡単にアクセスできるようになります。</p>
<h2><strong>IMAPサーバーにMBOXファイルを追加する理由</strong></h2>
<p>このセクションでは、MBOXからIMAPへの移行を促す要因をいくつか見ていきます。例えば、</p>
<ul>
<li>&lt;システムクラッシュ時に、MBOX ファイルを IMAP にインポートする必要があります。</li>
<li>IMAP は、いつでもどこからでも利用できるプロトコルです。</li>
<li>システムからメールボックス アイテムにアクセスするには、ライセンスは必要ありません。&nbsp;&gt;</li>
<li>電子メールはサーバー上に保存されるため、受信メールと送信メールの両方を簡単に取得できます。</li>
<li>メール フォルダーの管理がはるかに簡単になり、必要に応じて新しいフォルダーを作成できます。</li>
</ul>
<p>ただし、間接的な方法を探しても見つかりません。MBOXファイルをIMAPに間接的にエクスポートする方法がないため、代わりに、同じように役立つ信頼できる自動手法を発見しました。この素晴らしいソフトウェアを理解するために、この記事を最後までお読みください。</p>
<h2><strong>MBOXファイルをIMAPサーバーにアップロードする自動ソフトウェア</strong></h2>
<p><strong>&nbsp;BLR Toolsの MBOX変換ツールは、</strong>間接<strong>&nbsp;</strong>的な方法がないため、最適な選択肢です。このツールはインタラクティブなグラフィカルユーザーインターフェイスを備えており、価格も手頃です。Windowsオペレーティングシステムのすべてのバージョンに対応しており、どのバージョンでも利用可能です。このプログラムを使えば、MBOXメールをIMAPサーバーに簡単に変換できます。さらに、このツールでは、MBOXファイルを複数のメールクライアント間で移動できます。例えば、MBOXファイルはOffice 365、Hotmail、Gmail、Yahoo!などにインポートできます。さらに、MBOXはDOC、PDF、MSG、EML、HTML、TXT、CSVなど、さまざまなファイル形式に変換できます。変換手順についても詳しく説明します。</p>
<h3><strong>MBOX ファイルを IMAP サーバーにアップロードする方法:</strong></h3>
<p>MBOX ファイルを IMAP サーバーに直接変換する簡単な方法を紹介します。</p>
<ul>
<li>MBOX ファイルを IMAP サーバーにインポートするには、Windows コンピュータに MBOX コンバーターをインストールして実行します。&nbsp;</li>
<li>変換に必要なMBOXファイルを追加するには、「ファイルを選択/フォルダを選択」オプションを選択します。「開く」を押します。</li>
<li>次に、添付ファイルを含む MBOX ファイルの内容全体をプレビューします。</li>
<li>さらに、ツリー構造のメールボックスから必要なMBOXファイルを選択します。「次へ」ボタンを押してください。&nbsp;</li>
<li>「保存」「バックアップ」「移行」メニューから保存オプションとして IMAP を選択します。&nbsp;</li>
<li>IMAP 電子メール クライアントにアクセスするには、ログイン資格情報を正しく入力してください。</li>
<li>必要に応じて、日付フィルター、添付ファイルなしでのバックアップまたは移行、結果の PST ファイルの分割などのフィルターを使用します。</li>
<li>これらの手順を完了したら、[変換] タブを選択して、MBOX ファイルを IMAP サーバーにインポートを開始します。</li>
<li>ユーザーは数回クリックするだけで、MBOXファイルを様々なファイル形式やメールクライアントに変換できます。それでは、このソフトウェアの主な機能について見ていきましょう。</li>
</ul>
<h3><strong>BLR Tools MBOXコンバーター を使用して MBOX ファイルを IMAP サーバーにアップロードする理由は何ですか?</strong></h3>
<p>このプログラムは、MBOXからIMAPへのシームレスな移行を支援します。これらの機能を確認し、お使いの製品に適用してください。MBOX&nbsp;<br />ファイルを簡単かつ効率的に移行するのに役立ちます。</p>
<ul>
<li>ユーザーは日付フィルター機能を使用して、MBOX ファイルから特定の電子メールを変換できます。</li>
<li>重複を削除するには、宛先、送信者、件名、本文、BCC でメールを並べ替えます。</li>
<li>変換プロセスを開始する前にファイル全体を表示できます。</li>
<li>100% 正確な、真正で統合された構造化データを提供します。</li>
<li>さらに、手順をよりスムーズにする要素がいくつかあります。このツールの無料版では、ユーザーはさまざまな機能を試すことができます。また、フルバージョンと無料版は同じ機能です。</li>
</ul>
<h3><strong>結論は、</strong></h3>
<p>この記事全体を通して、MBOXファイルをIMAPサーバーにアップロードする理由と方法について詳しく説明しました。この操作を間接的に行う方法はないため、このプログラムはMBOXファイルをインポートする唯一の方法です。また、このプログラムには同等の機能を備えた無料版もあります。さらに、データの整合性を損なうことなく、目的の結果が保証されます。</p>
[関数リファクタリング] 定義指向プログラミングをしよう💪 〜 ローカル変数への抽出でネストを解消編 〜


## はじめに

今回は[「読みやすいコードのガイドライン」]()という書籍の中で紹介されていた

### 定義指向プログラミング

<br>
について記事にしてみたいと思います。

その中でも今回は

### ネストをローカル変数への抽出で解消する

<br>
このことについて記事にしてみようと思います。

:::note
なお上記の書籍はKotlinのコードで紹介されているのですが、

この記事ではそれをDartに変換しています。
:::

## 定義指向プログラミングとは

導入として先ず最初に「**定義指向プログラミング**」について概略を示します。

先述の書籍の中では以下のように紹介されていました。
<br>

#### コードに高い抽象度を与えて再利用性を高める

#### 斜め読みで概要が把握できるようなコードを書く

#### 関数内での読み返しが少ないコードを書く

<br>

##### コードに高い抽象度を与えるとは...

* 使い回しが効かない長いコードやリテラルを切り出し、
* それに名前を与えることで意味を明示的に示し、
* かつ再利用可能なものにしていくこと

こういったことを指しています。
<br>

##### 斜め読みで概要が把握できるコードとは...

* コードの一部を眺めるだけで関数内の処理の流れが掴めるコードのこと
* 式やステートメントの最初の方、ネストの浅いところ（コードの左側）に重要なコードを書く
* 式やステートメントの最後の方、ネストの深いところ（コードの右側）に詳細な部分を書く

こういったことを指しています。
<br>

##### 関数内での読み返しが少ないコードとは...

* 上から下に向かって読んでいけば概要がすんなりと掴めるコードのこと
* そのためにも深いネストや巨大なローカル関数をリファクタリングしていく

こういったことを指しています。
<br>

上記のことを踏まえて以降のコードを見てみましょう。


## ネストの解消前

最初に以下のコードをご覧ください。

```dart
showDialogOnError(
  presenter.updateSelfProfileView(
    repository.queryUserModel(userId)
    )
);
```

上記はエラーダイアログ表示を実行するコードですが、

その実引数に二重のインラインメソッドをあてています。
<br>

### このコードの問題点...

<br>
一重であればインライン化によるメリットもありますが、

これが二重以上になってしまいますとそのメリットも無くなり、

かえって可読性が下がってしまいます。。。
<br>

そもそも上記のコードは

`repository.queryUserModel(userId)`

この処理で取得したユーザーモデルをもとに

`presenter.updateSelfProfileView`

この処理を実行し、

その戻り値によりエラー時はエラーダイアログを表示させるようにしているのですが、

その意味が捉えづらくなっていますし、

インライン化したメソッドの定義元に飛ばない限りは

それらの実引数の型も明確にならないコードになっており、

全体的に見通しが悪いものになっています。。。
<br>

意図が不明瞭であり斜め読みが出来ず、

慎重にコードを追っていかねばならないケースが散見すると認知上の負荷も増しますし、

欠陥の元にもなりかねません😱

## ネストの解消後

そこでこんな風にリファクタリングしてみましょう💪

```dart
final userModel = repository.queryUserModel(userId);

final viewUpdateResult = presenter.updateSelfProfileView(userModel);

showDialogOnError(viewUpdateResult);
```

このコードであれば意図も明示的であり斜め読みもできますし、

上から下に向かってコードを追っていけばいいだけなので認知上の負荷も低そうですし、

可読性やメンテナンス性が高そうですよね♪

上記のように実引数がネストしている場合はこんな手法も使えそうですよね☺️

## まとめ

今回は定義指向プログラミングのうち、

ローカル変数への抽出によるネストの解消について記事にしてみました。

次回はプライベート関数への抽出によるネストの解消について

記事にしてみようと思います💪

## 参照

https://gihyo.jp/book/2022/978-4-297-13036-7
ゲームのUIという変な概念

体験談.

## パズルゲームの罠

ゲームプログラミングの入門としてパズルゲームは魅力的です. なんか画面がシンプルで作りやすそうだし, アセットの調達も簡単で絵を描いてくれる友達がいなくても問題なさそうですからね.

しかし, 実際に作ってみると結構難しいです. ゲームロジックが比較的複雑なのも理由の一つですが, なによりも**UIという概念を破壊している**ように見えるのが入出力周りを作る上で大きな壁になります.

パズルゲームを作るとき, あなたは画面上のマスをクリックして駒を配置したり移動したりするインターフェースを設計するでしょう. それは何も間違っていません. 何も間違っていないのですが, このとき, **何がUIで, 何がゲームオブジェクトなのでしょうか?** もっというと, **ゲームオブジェクトと認識している駒やマスがUIとしても機能している**のがあまりにも気持ち悪く, UI/ゲームオブジェクトという区分を根底から覆されるように感じます.

## マウス: やっかいなコントローラー

多くの文脈において, **ゲームにおけるUIとはインターフェースとは名ばかりの「ゲームからプレイヤーへの一方通行の表示」に過ぎない**のだと思います. 例えばスーパーマリオのプレイ画面の右上にあるスコア, 例えばテトリスの右にある次に落ちてくるテトリミノ, 例えばアドベンチャーゲームのアイテムスロット. これらはユーザーがそれをクリックしてどうこうするものではなく, ゲームが生成し表示しているだけに過ぎません. なぜかというと, そもそもこれらを一つのボタンとして機能させるためにはマウスが必要であり, **PC以外の(ほとんどの)ゲーム環境にはそもそもマウスが無い**からです.

よしゲーム開発をするぞと思ったとき, あなたの目の前にはPCがあるでしょう. おそらくあなたにとってPCでゲームをプレイするのは自然なことであり, ゲーム画面の様々なものをクリックできるのは当たり前なのだと思います. しかし, これは実はPCという環境に強く依存し, PC以外の環境では, **画面上に仮想的な入力装置はなく, 入力はすべて数少ないボタンを通して行われる**のが当たり前なのです.

マウスというのはPCという環境に固有のものであり, また入力のたびに座標を取得して何がクリックされたのか判断しなきゃいけないなどの高度な技術が要求されるため, ゲーム開発の入門に際してマウスを使うゲームを題材に選ぶのはやめた方がいいです.

## インタラクティブという概念

学習が進みマウス入力をゲームに導入する覚悟ができたときどうすればいいでしょうか? まず, UIとかいう単語には「ゲームからプレイヤーへの一方通行の表示」という意味しか与えないことにします. そして, それとは別に**インタラクティブという「ユーザーが触れるかどうか」に関する概念**を導入しましょう. まず, UI・ゲームオブジェクトの必要なオブジェクトに, このインタラクティブ性を与えます. これは, クリックやカーソルホバーなどの各操作に反応するかどうかというブールです. そして, クリックされたらイベントハンドラにそのことを報告するようにします. これにより, これらのオブジェクトは(本来の意味での)インターフェースのように振る舞います. ただし, 依然「どのオブジェクトがクリックされたのか」などの処理は別で必要です. ものによっては結構複雑な座標計算が必要な場合もあります. そこは, 各自で頑張ってください.
学習３日目

<!doctyep html>
<html lang="ja">
    <head>
        <meta charset="UTF-8">
        <!--今回もtitleはなしだな-->
    </head>
    <body>
        <main>
        <h1>学習３日目<h1>
        <p>3日目は箇条書きの方法をいろいろ学んだ今回はほかに学んだことなどを箇条書きに書いてみようと思う</p>
        <h3>学んだこと(html)<h3>
        <P>
        <ul>
            <li>黒丸表示の箇条書き</li>
            <li>ナンバー表示の箇条書き</li>
            <li>sectionでの区切り方</li>
            <li>emでの強調の仕方</li>
        </ul>
        </p>
        <h3>学んだこと(css)</h3>
        <p>
        <ol>
            <li>背景の色付け範囲の指定</li>
            <li>枠をつける</li>
            <li>フォントの色の変更</li>
            <li>角丸めの方法</li>
        </ol>
        </p>
        <h3>今日の感想</h3>
        <p>そろそろ辞典が欲しくなってきたが、まだ教材の中で探すべきだよなと思って頑張っている<br>
        あと、今はまだシンプルにコードが書けるようになって、Google Chromeですぐに見てみて、自分の望んだ形で表示されているのを見ると楽しくて仕方がないｗ<br>
        明日も楽しくコード書くぞ！</p>
        </main>
    </body>
</html>
Rhymoss：同人小説を効率的に検索できるAIサイト



---

みなさん、こんにちは！
AI技術を使って同人小説・ライトノベル・夢小説作品をサクッと探せるWebサービス「Rhymoss」を開発中です。これまでにたくさんの方にご支持いただき、購読者数もぐんぐん増えています。

**▶︎ Rhymoss の主な機能＆特徴**

* **超高速検索**
  読みたい作品のイメージをざっくり書くだけで、キーワード検索よりも的確にぴったりの作品を探し出します。従来の検索では見つからなかった「これこれ！」が見つかるはず。
* **ワンタップ翻訳**
  日本語・英語・中国語の作品をその場で一発翻訳。言語の壁を超えて、世界中の同人ワールドを自由に楽しめます。

**▶︎ プロダクトの想い**
同人の海を泳いでいると、マイナー作品やお気に入りの“ご飯”（推し作品）が見つからなくて「助けて…！」ってなることありませんか？
そんな悩みを抱えた僕たち数人の仲間でアイデアを出し合い、プロトタイプを経てついに公開！
現在、数百万作品が収録されていて、ユーザーさんからは「ほんとに便利！」「マジで助かる！」という声をいただいています。

今後もっと良くしていくには、同じ熱量を持った仲間が必要です。Rhymoss に興味がある人、ぜひ一緒に開発・運営しませんか？お気軽にご連絡ください！

**📬 お問い合わせ**
Sakura
[rhymoss.contact@gmail.com](mailto:rhymoss.contact@gmail.com)
コストを抑えて ComfyUI を AWS EC2 で動かしてみた

# はじめに

こんにちは.

EC2 スポットインスタンスを活用することで
コストを抑えつつ [ComfyUI](https://www.comfy.org/) を実行する方法をご紹介します.

なお, 今回ご紹介するコードはサンプルコードです.
EC2 の URL を特定されてしまえば
誰からでもアクセスできてしまうので適宜調整してくださいませ.

## 構成

User --- http://ec2...:8188 ---> ComfyUI on EC2(Spot Instance)

## 前提

- Spot Instance quotas > All G and VT Spot Instance Requests の引き上げ
  - 注意: 使用する EC2 インスタンスタイプの vCPU 数で緩和申請をしておいてください. 申請が受理されていない場合, 下記 AWS リソースの作成時にエラーとなります
  - 例: g6.xlarge の vCPUs は 4 ですので, 4 で申請してください
      - https://aws.amazon.com/jp/ec2/instance-types/g6/

## コード

https://github.com/dev-kawano-y/image-generator

```bash:準備
$ git clone https://github.com/dev-kawano-y/image-generator.git
$ cd image-generator
$ npm ci
```

```bash:AWS リソース作成
$ cdk deploy
```

```bash:ComfyUI にアクセス
http://ec2-...:8188
```

```bash:AWS リソース削除
$ cdk destroy
```

### ポイント

- リージョンはバージニア北部を利用する
    - 東京リージョンと比較するとコストを抑えることが可能
- スポットインスタンスを利用する
    - 中断される可能性があるものの, オンデマンドと比較してコストを抑えて利用することが可能
        - https://pages.awscloud.com/rs/112-TZM-766/images/AGDC2019_B-4.pdf

## 最後に

お試し後は $ cdk destroy にてリソースの削除を行ってくださいませ.
【logbackの設定】

ファイル名は「logback.xml」か、「logback-spring.xml」にする。
ファイルを置く場所は、application.properties(src-main-resoures)のところに書く。
```
<?xml version="1.0" encoding="UTF-8"?>
<configuration>

  <!-- コンソール出力 -->
  <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    <target>System.out</target>
    <encoder>
      <charset>UTF-8</charset>
      <pattern>%d{yyyy/MM/dd HH:mm:ss} %-5level [%thread] - %msg%n</pattern>
    </encoder>
  </appender>

  <!-- ファイル出力 -->
  <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">

    <!-- コンテナ内の /app/logs/app.log に書き込む -->
    <file>/app/logs/app.log</file>

    <!-- ログファイルのローテーション設定 -->
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
      <fileNamePattern>/app/logs/app-%d{yyyy-MM-dd}.log.zip</fileNamePattern>
     <maxHistory>7</maxHistory><!--最大7日保存（8日以降は削除） -->
    </rollingPolicy>

    <!-- ログ出力フォーマット設定 -->
    <encoder>
      <charset>UTF-8</charset>
      <pattern>%d{yyyy/MM/dd HH:mm:ss} %-5level [%logger{36}] - %msg%n</pattern>
    </encoder>
  </appender>

  <!-- すべてのログをコンソールとファイル両方に出す -->
  <root level="INFO">
    <appender-ref ref="STDOUT" />
    <appender-ref ref="FILE" />
  </root>
</configuration>
```
```
@RestController
public class TestController {
	
    private final Logger logger = LoggerFactory.getLogger(hreadsController.class);
   
	@GetMapping("/threads")
	public List <ThreadListDto> getThreads() {
        logger.info("ーーーログのテストーーー");
        return threadsService.getThreads();
	}
}
```

 使いたいところのファイルにprivate　Logger～の部分を足す。getLogger()でカッコの中身のログを作るって意味	

・fileNamePattern
どんな名前で保存するか。

・%d{yyyy-MM-dd}
年、月、日で区切る

・root
ログ内で共通の設定

・ログレベル
ログレベルはログの重要度を表す。
重要度の高い順に、下記の種類がありる。
高い　error＞warn＞info＞debug＞trace　低い
SVNで差分をパスと値の2つが一覧で確認するためのコード

✅ 前提条件
TortoiseSVN ではなく、コマンドライン SVN が使用できる環境（例: svn コマンドが PowerShell で動く）

PowerShell が使える Windows 環境

🔧 手順概要
PowerShell を起動

スクリプトを貼り付けて実行

svn diff の結果を処理して、CSV ファイル svn_diff_output.csv に出力

🪟 手順詳細
✅ ステップ1：PowerShell の起動
Windows + R キー を押して powershell と入力し Enter

または「スタート」→「Windows PowerShell」を右クリック →「管理者として実行」

✅ ステップ2：対象の作業コピーディレクトリに移動
```powershell
cd "C:\path\to\your\svn\working_copy"
```
C:\path\to\your\svn\working_copy は、SVN 管理下のローカルフォルダ（例: C:\projects\myrepo）に置き換えてください。

✅ ステップ3：以下の PowerShell スクリプトをコピペして実行
```powershell
Copy code
$diff = svn diff
$results = @()
$currentFile = ""

foreach ($line in $diff) {
    if ($line -match '^Index: (.+)$') {
        $currentFile = $Matches[1].Trim()
    } elseif ($line -match '^[-+](?![-+])(.+)$') {
        $change = $Matches[1].Trim()
        $prefix = $line.Substring(0,1)
        $results += [PSCustomObject]@{
            Path = $currentFile
            Value = "$prefix $change"
        }
    }
}

# CSV出力（デスクトップ上に出力される例）
$csvPath = "$env:USERPROFILE\Desktop\svn_diff_output.csv"
$results | Export-Csv -Path $csvPath -NoTypeInformation
Write-Host "CSVが出力されました: $csvPath"
```
✅ ステップ4：出力確認
デスクトップに svn_diff_output.csv が作成されており、Excel などで開くと以下のような形で表示されます：


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274248/d7ea0fd2-c4ac-41fe-8679-0dcb8e6e6e21.png)
学習２日目

<!DOCTYPE html>
<html lang="ja">
    <head>
        <meta charset="UTF=8">
        <!--タブはないからtitleは省きます-->
    </head>
    <body>
    <!--コメントの書き方も学んだよ！-->
    <main>
        <h1>学習２日目</h1>
        <p>昨日投稿し損ねたので今日投稿しますｗ<br>
            昨日は１日目に作ったＨＴＭＬにＣＳＳで背景をつけたり、<br>
            フォントのサイズを変更した。<br>
            それが作り終わったら、プロフィールホームページみたいなものを作った。<br>
            インスタやＸなどのリンクを作る方法を学んだ。<br>
            また、背景色を枠を決めたり、角を丸めたり、写真の角を丸めたりできるようになった。
        </p>
        <p>次の課題はホームページにタブを作ったり、することを学ぶ。</p>
    </main>
</body>
</html>
Swift テキストファイル入力 標準入力 共通コード

# はじめに

ファイルパス名が指定されたら、指定されたファイルからテキストを入力、
ファイルパス名が省略されたら、標準入力からテキストを入力する。

このように動作する **テキスト入力関数** を作成しました。


# テキストファイル入力 標準入力 共通関数

```swift
func readTextFile(filepath: String?) throws -> [String] {
    var lines = [String]()
    if let filepath {
        let contents = try String(contentsOfFile: filepath, encoding: .utf8)
        contents.enumerateLines { line, _ in lines.append(line) }
    } else {
        while let input = readLine() {
            lines.append(input)
        }
    }
    return lines
}
```

_`String(contentsOfFile:encoding:)`が一括入力のため、標準入力もEOFまで先に入力します。このため、巨大ファイルサイズには不向きです。_



## 使い方

上記関数を呼び出す例

```swift:test.swift
import Foundation
let test: () = {
    let arguments = CommandLine.arguments
    let filename: String? = arguments.count > 1 ? arguments[1] : nil
    do {
        let text = try readTextFile(filepath: filename)
        print(text)
    } catch {
        print(error.localizedDescription)
    }
}()
```

```shell:実行結果
% swiftc test.swift 

% ./test a.txt # filepath
["123", "ABC"]

% ./test <a.txt # stdin
["123", "ABC"]

% cat a.txt
123
ABC
```

```shell:実行結果（エラー）
% cat b.txt
cat: b.txt: No such file or directory

% ./test b.txt #filepath 
The file “b.txt” couldn’t be opened because there is no such file.

% ./test <b.txt #stdin
zsh: no such file or directory: b.txt
```

# イテレータ版

ついでに、イテレータ版も作成しました。

```swift:イテレータ版
struct readTextFile: Sequence, IteratorProtocol, Sendable  {
    @usableFromInline
    internal var array: [String]? = nil
    @usableFromInline
    internal var index = 0
    init(filepath: String?) throws {
        if let filepath {
            let contents = try String(contentsOfFile: filepath, encoding: .utf8)
            var array = [String]()
            contents.enumerateLines { line, _ in array.append(line) }
            self.array = array
        } else {
            array = []
            while let input = readLine() {
                array!.append(input)
            }
        }
    }
    @inlinable
    public mutating func next() -> String? {
        if let array {
            if index < array.count {
                defer { index += 1 }
                return array[index]
            }
        }
        return nil
    }
}
```

## 使い方

上記イテレータ版を呼び出す例

```swift:test.swift
import Foundation
let test: () = {
    let arguments = CommandLine.arguments
    let filename: String? = arguments.count > 1 ? arguments[1] : nil
    do {
        for line in try readTextFile(filepath: filename) {
            print(line)
        }
    } catch {
        print(error.localizedDescription)
    }
}()
```

```shell:実行結果
% swiftc test.swift 

% ./test a.txt # filepath
123
ABC

% ./test <a.txt # stdin
123
ABC
```

<br>

## 追伸

`stdin`を再割り当てする方法がもっと簡単でした。次の記事にします。


<br><br>**以上**
結局Cursorって「カーソル」「カーサー」どっちなの？

# Cursor 発音問題
巷で大人気のエディタ「Cusor」君ですが、「カーソル」「カーサー」結局発音どっちなの問題が起こってます。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">日経新聞はCursorを「カーソル」読みだそうですよ！AI界隈の皆さん！ <a href="https://t.co/7wMdItMcWm">https://t.co/7wMdItMcWm</a></p>&mdash; 熊井悠(くまいゆう)@AI駆動開発|クマイ総研 (@qumaiu) <a href="https://twitter.com/qumaiu/status/1931368845060772338?ref_src=twsrc%5Etfw">June 7, 2025</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

## そもそもなんで2種類存在してるの？
### 日本語と英語ではそもそも発音が違うから
 日本語は母音で終わりますが、英語は子音で終わる単語も数多く存在します。

CursorのRは日本語にない音なので日本人は母音の「ウ」をくっつけて「ル」に変換しています。

他にも身近なところだとcatやbookなんかも最後は子音なのですが日本人は「オ」や「ウ」などの母音を足して発音します（そうしないと発音できない）

そしてsorは「サー+R音」だけど日本人が聞くとサーとだけ言ってるようにも聞こえます。

## ん？カーサーじゃなくてカーソーじゃないの？
これは母音の違いからきてます。

Cursorは発音記号で表すとkɝːsər/となります。
(学生時代に嫌というほど見た奇っ怪なあいつの出番です）

əの発音は
ざっくりいうと

日本語の「ア」と発音する口の形で「オ」と声を出すイメージです。

なので日本人が「ə」を聞くと「アともオ」とも取れるような音になります。

この「アとオが混じったような音」＋子音のR

を無理やりカタカナで書くと「カーサゥ」とか「カーソゥ」みたいな感じになります。

下のポストの6秒あたりを聴いてみてください。

<blockquote class="twitter-tweet" data-media-max-width="560"><p lang="en" dir="ltr">Cursor 1.0 is out now!<br><br>Cursor can now review your code, remember its mistakes, and work on dozens of tasks in the background. <a href="https://t.co/BBjNn5yJh1">pic.twitter.com/BBjNn5yJh1</a></p>&mdash; Cursor (@cursor_ai) <a href="https://twitter.com/cursor_ai/status/1930358111677886677?ref_src=twsrc%5Etfw">June 4, 2025</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

カーサーっぽいけどカーソルとイメージすればそう聞こえなくもない。

これがCursorの正体です。

カタカナ発音は「カーサー」がネイティブ寄りですが、「カーサー」発音で通じるかは不明です。

相手がスペイン語(カスティーリャ語）話者だったらCasa（家）と勘違いするかもしれません（スペイン語の母音もaiueo）

## 結論
### どっちでもいい
※自分は穏健カーソル派（カーサーでもいいよ派）


Geminiも英語話者はジェミナイと発音していますが日本は昔からジェミニ発音が定着してるので自分はジェミニ読みです
※穏健ジェミニ派（ジェミナイでもいいよ派）

では、すっきりしたところで

Let's try prounouncing it.（言ってみよう）

Cursor!

みなさん、いつも有益な記事ありがとうございます。

~蛇足~
そういえば昔、tensorflowもテンサーなのかテンソルなのかってありましたね。
今回と全く同じ理屈です。

~完全に蛇足~
大事に取ってた初投稿がまさかのネタ記事になってしまいました。Xみてたらおもしろかったのでついついのっからせてもらいました。
gradioをshare=Trueで起動してしまい、Defenderに怒られて焦ってるあなたへ

## 導入
Gradioの素晴らしいハンズオン教材を動かしていたら、  
**「マルウェア検知されました」→「情シスから警告」→「はい、報告書確定です」**  
という地獄コンボを食らいました。

調べてみたら `gradio.launch(share=True)` の裏側で **Fast Reverse Proxy**（FRP）を確立するために、勝手に `.exe` ファイルをダウンロード＆実行していたんですね。  
どうりでWindows Defenderさんがシュバってくるわけです。

というわけで今回は、**Gradioのshare機能の正体**と**なぜ警告されるのか**、  
そして**回避策（`share=False`）の推奨理由**をまとめます。

# TL;DR（この記事でわかること）
- Gradioで `share=True` にすると、外部からアクセス可能な状態になる
- その裏では `.exe` 実行ファイルがダウンロード＆実行されている
- これがセキュリティソフトに「マルウェア疑惑」と誤判定される可能性がある
- チーム開発や企業環境では、**`share=False` にしておくのが安全**

# 対象読者
- Gradioを使ってローカルアプリを外部に公開しようとしている人
- 社内PCや情シス管理下の端末でGradioを動かしている人
- 「とりあえずハンズオンを写経して怒られた」タイプのエンジニア

## gradioをshare=Trueで起動すると起こること

Fast Reverse Proxyという技術を使用して、
ローカルで起動しているgradioアプリケーションをパブリックな環境から使用できるようになります。

:::note
正確には、gradio起動時に発行されるURL(例:https://xxxxx.gradio.live/)
からの操作をshareサーバー(HuggingFace管理)を経由して
ローカル端末に伝搬する仕組みです
:::

具体的には、以下の図のようなイメージで動作します。

![frp-gradio-diagram.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2646082/79544003-1548-462e-9258-f244996f1b3d.jpeg)


>https://www.gradio.app/guides/understanding-gradio-share-links

## 実は `.exe` が動いている：Fast Reverse Proxy の裏側
実はFast Reverse Proxyを確立するためにgradioソース内で実行ファイルをDLして、実行しているためWindows Defenderにマルウェア判定されてしまいます。

### Fast Reverse Proxyを確立するために呼ばれる実行ファイル

問題のコード：  
[gradio/tunneling.py#L112](https://github.com/gradio-app/gradio/blob/main/gradio/tunneling.py#L112)

具体的な実行ファイルとしては、以下になります。

```
{省略..}/gradio/frpc/{原本ファイル名}_v{原本バージョン}
```

例えば、情シスから
「マルウェアと思わしき実行ファイルを検知した。実行ファイルはこちら。」
と言われるファイルは以下のようになります。

```
{省略..}/gradio/frpc/frpc_windows_amd64_v0.3
```

:::note
大元の実行ファイルは、ライブラリをインストールした時点では入っておらず
gradioでshare=True初回起動時に
https://cdn-media.huggingface.co/
から提供されているのでバイナリをダウンロードしてきます。
:::
>https://www.gradio.app/guides/understanding-gradio-share-links#frp-client

## 危険性

### マルウェアかという観点

gradioは生成AI業界でdemoアプリ開発用とでの利用実績が多数ある著名OSSです。
よって、悪意の混入には細心の注意を払っているため
frp確立に動作した実行ファイルはマルウェアではないと言えます。

>🔳 マルウェアの定義
悪意のあるソフトウェア（Malicious Software）の総称で、コンピューターやその利用者に危害を及ぼす目的で作成されたプログラム

### セキュリティ観点

マルウェアではないものの、外部から自身の端末を間接的に使用させるため以下のリスクが挙げられます。

🔳 狭義
gradio実行時のmainファイルで許可した操作が外部で使用可能になります。

gradio UI上から可能な操作だけでなく、
mainファイル内のdef全てがAPIとして実行可能になっているため、
defで実行可能な操作が全てできてしまう状態になります。

🔳 広義
脆弱性を突かれた場合、狭義のリスク範囲内で収まらない可能性もあります。

外部からローカル端末リソースを使用可能にさせる状態であるため、
実行前と比べ、実行後は **”セキュリティーリスクがとても高い”** 状態であると言えます。

:::note alert
【ログの提出による影響範囲証明について】

発行された公開URLを知らないと誰もコールできないわけなので
数分であれば誰もリクエストしてこない可能性が高いです。

しかし、基本的にgradio側でアクセスログを意図して出力していない限りは
外部からのアクセスが来たかどうか明確なログは残りません。

ログ提出を求められても死人の証明になるので、
起動したウィルスソフトの前後ログを確認して後はわからないというしかないです。。。
:::

私の場合は、幸いwindows defenderのログにfrp起動を防いでくれた記録があったので影響なしと報告書が書けました。。。
windows defenderのログ参照方法は以下がわかりやすいです。
>https://it-skill-memo.work/2020/04/23/%E3%80%90windows%E3%80%91windows-defender%E3%81%AE%E3%82%A4%E3%83%99%E3%83%B3%E3%83%88%E3%83%AD%E3%82%B0%E3%82%B9%E3%82%AD%E3%83%A3%E3%83%B3%E3%81%AE%E3%83%AD%E3%82%B0%E3%82%92%E5%8F%96%E5%BE%97/

## おわりに：あなたも他人事じゃないかも

Gradioは神ライブラリですが、企業内やチーム開発では**ほんの一行の `share=True` でセキュリティリスクが爆誕する**という罠があります。

他にもこの事象に引っかかる人がいるはずなので、  
**ぜひこのQiitaを拡散してください 🙇‍♂️**

X（旧Twitter）でもこんな話をよくつぶやいてるので、**フォローも歓迎です！**

→ [@puchan_pig](https://x.com/puchan_pig)
MacApp を シングルウインドウ にする方法


_いつも忘れてしまっていて、都度、ググる羽目になるので、備忘録としてまとめておきます。_


```swift:SampleApp.swift
import SwiftUI

class AppDelegate: NSObject, NSApplicationDelegate, NSWindowDelegate {
    func applicationShouldTerminateAfterLastWindowClosed(_ sender: NSApplication) -> Bool {
        return true //⭐️ true: 最後のウインドウを閉じたら終了する
    }
}

@main
struct SampleApp: App {
    @NSApplicationDelegateAdaptor(AppDelegate.self) var appDelegate //⭐️
    var body: some Scene {
        WindowGroup {
            ContentView()
        }
    }
}
```

普通にアプリを作ると、ウインドウを閉じてもアプリは終了しません。
マルチウインドウ ならそれでもよいですが、シングルウインドウ アプリの場合は、アプリを終了してほしい場合があります。

その場合は、`AppDelegate` に `applicationShouldTerminateAfterLastWindowClosed(_:)`を実装することで実現できます。

**以上**
サイバー攻撃のフェーズとその概要（Cyber Kill Chain）

# サイバー攻撃のフェーズとその概要（Cyber Kill Chain）

本ドキュメントでは、一般的なサイバー攻撃のライフサイクル（Cyber Kill Chain）に基づいて、各フェーズの攻撃手法・目的・具体例を解説します。

## 🧠 1. 情報収集（Reconnaissance）

| 内容 | 詳細 |
|------|------|
| 主な手法 | - IPスキャン（Nmap）<br>- DNS列挙<br>- OSフィンガープリンティング<br>- User-Agent偽装<br>- Webクローリング |
| 攻撃者の意図 | 対象の構成・脆弱性・WAFの挙動などを調査 |
| 具体例 | - WAFの検出回避<br>- 脆弱URLの探索<br>- Bot偽装アクセス |

---

## 🧪 2. 武器化（Weaponization）

| 内容 | 詳細 |
|------|------|
| 主な手法 | - マルウェア作成<br>- エクスプロイトコードの準備<br>- ペイロードの埋め込み |
| 攻撃者の意図 | 収集した情報に基づく最適な攻撃手法の構築 |
| 具体例 | - Exploit Kit作成<br>- カスタムマルウェアの設計 |

---

## ✉️ 3. 配信（Delivery）

| 内容 | 詳細 |
|------|------|
| 主な手法 | - フィッシングメール<br>- マルウェア添付ファイル<br>- 悪性広告（Malvertising） |
| 攻撃者の意図 | 攻撃対象にマルウェア等を送り届ける |
| 具体例 | - 添付ファイル付きの偽装メール<br>- 改ざんされたサイトへの誘導 |

---

## 💥 4. 脆弱性の悪用（Exploitation）

| 内容 | 詳細 |
|------|------|
| 主な手法 | - SQLインジェクション<br>- クロスサイトスクリプティング（XSS）<br>- 権限昇格 |
| 攻撃者の意図 | ターゲット環境への侵入・初期アクセス取得 |
| 具体例 | - Webアプリケーションの突破<br>- OSやミドルウェアの脆弱性悪用 |

---

## 🖥️ 5. インストール（Installation）

| 内容 | 詳細 |
|------|------|
| 主な手法 | - リバースシェル設置<br>- RAT（Remote Access Tool）のインストール |
| 攻撃者の意図 | 継続的な操作のためのバックドア設置 |
| 具体例 | - マルウェア常駐化<br>- タスクスケジューラによる自動起動設定 |

---

## 🌐 6. コマンド＆コントロール（C2）

| 内容 | 詳細 |
|------|------|
| 主な手法 | - C2サーバとのHTTP/S通信<br>- DNSトンネリング<br>- Tor経由通信 |
| 攻撃者の意図 | 遠隔操作による指令送信や情報収集 |
| 具体例 | - 被害端末からの外部サーバ通信<br>- 暗号化通信でのデータ送信 |

---

## 🎯 7. 目的遂行（Actions on Objectives）

| 内容 | 詳細 |
|------|------|
| 主な手法 | - 機密データの窃取<br>- サービス妨害（DoS）<br>- 身代金要求（Ransomware） |
| 攻撃者の意図 | 金銭的利益、混乱の創出、情報収集 |
| 具体例 | - 顧客情報の流出<br>- Webサービスの停止<br>- 暗号化による業務停止と身代金要求 |

---

## 🛡️ フェーズ別の対策例

| フェーズ | 対策 |
|--------|------|
| 情報収集 | WAF強化、Bot検出ルール、アクセス制御、ログ分析 |
| 武器化・配信 | メール/URLフィルタ、添付ファイルスキャン |
| 脆弱性悪用 | セキュリティパッチの適用、WAF、脆弱性診断 |
| インストール | EDR導入、ファイル整合性監視 |
| C2 | 出口制御（Firewall）、DNS監視、ネットワーク分析 |
| 目的遂行 | データ暗号化、権限最小化、バックアップ整備 |

---

## 🔎 関連キーワード

- MITRE ATT&CK
- Kill Chain
- WAF / EDR / SIEM
- Zero Trust
- 初期アクセス（Initial Access）
試験当日を楽に乗り切ろう – CertsTimeの最新IAPP AIGP試験対策問題集で学習しよう

試験当日は緊張や不安がつきものですが、しっかりと準備しておけば自信を持って臨むことができます。特にIAPP AIGP試験のような高度な認定試験では、信頼できる学習資料が重要です。CertsTimeでは、最新の試験傾向に基づいたIAPP AIGP試験対策用の模擬問題集（Exam Dumps）を提供しており、効率的な学習をサポートしています。
Visit Now: https://www.certstime.com
CertsTimeの資料は、実際の試験形式に近い問題と丁寧な解説で構成されており、短期間での合格を目指す受験者に最適です。繰り返し練習することで、自信を持って本番に臨むことができるようになります。IAPP AIGP認定を目指すなら、今すぐCertsTimeの最新資料で準備を始めましょう。
階乗の計算

今日は、ループ処理の「階乗計算」の問題にチャレンジ！ 
`console.log(N!);` でいければいいのに…。

<br>

## 問題意識

- 整数 N が与えられる。
- N の階乗 N! を計算して出力。
<br>

入力例：

    3

出力例：

    6

<br>

https://paiza.jp/works/mondai/loop_problems2/loop_problems2__factorial

<br><br>

## ✅OK例
```js
const rl = require('readline').createInterface({input: process.stdin});

rl.once('line', (input) => {
  const N = Number(input);

  let factorial = 1; // 1でスタートが大事！
  for (let i = 1; i <= N; i++) {
    factorial *= i;
  }

  console.log(factorial);
  rl.close();
});
```
<br><br>

## ✅ 階乗

階乗とは：
N!=1×2×3×⋯×N
N!=1×2×3×⋯×N

例えば N=5 なら：
5!=1×2×3×4×5=120
5!=1×2×3×4×5=120

<br><br>

## 📝メモ

- ループは 1 から N まで（N以下）でしっかり回すこと
- 初期値の設定が大事



<br><br><br>[僕の失敗談(´;ω;｀)と解決法🐈](https://paizabeginner.wordpress.com/2025/06/09/paiza%e3%81%a7%e5%9f%ba%e6%9c%ac%e3%83%9e%e3%82%b9%e3%82%bf%e3%83%bc%ef%bc%9a%e9%9a%8e%e4%b9%97%e3%81%ae%e8%a8%88%e7%ae%97/)
springでmodelAttributeが優先するのは?session VS request


## 私が直面した問題
①JSP → ②JAVA → ③次の画面JSPの過程で、
①JSPのFORMの値を②JAVAで一部の値を変更して、保存したけど、③ではなぜか元の値（①のFORM値）に戻っていた。

## 結論から言うと
ModelAttributeではリクエストスコープ（request）の値がセッションスコープ（session）より優先される。

## 原因についての考察
これはすべての変数で起きるわけではなく、リストや配列などのコレクション型のプロパティで発生してる。
JavaのBeanとして保持しているリストが、リクエストパラメータ（例：items[0]=X&items[1]=Y）で上書きされてしまうため、セッションに保存された変更が無視される。

## 詳細

① JSPでフォーム送信
② Java（Controller）の @ModelAttribute で受け取り、一部の値を変更する。
    sessionAttributeアノテーションもついているので、変更値はセッションに保存される。
③ 次の画面で @ModelAttribute を再度受け取ったとき、JSPで入力した元の値が復活している。
#### FormModel
```
public class FormModel {
    private List<String> items = new ArrayList<>();

    public List<String> getItems() {
        return items;
    }
    public void setItems(List<String> items) {
        this.items = items;
    }
}

```

#### ↓１番目画面
```
@Controller
@SessionAttributes("formModel") // formModel をセッションに保持
public class SampleController1 {

    @ModelAttribute("formModel")
    public FormModel setUpForm() {
        return new FormModel(); // セッションに何もないときだけ生成される
    }
    
    @GetMapping("/next")
    public String next(@ModelAttribute("formModel") FormModel formModel) {
        //値の変更
        formModel.getItems().set(0, "新しい値"); 
        return "forward:/nextPageIndex";
    }
}

```

１番目の画面でnextボタンを押したりして、リクエストする。
「http://localhost:8080/next?items[0]=元の値1&items[1]=元の値2&otherParam=xxx...」
@GetMapping("/next")に届いて0番目のリストが"新しい値"に上書きされたはず。

#### ↓2番目画面
```
@Controller
@SessionAttributes("formModel") // formModel をセッションに保持
public class SampleController2 {

    @ModelAttribute("formModel")
    public FormModel setUpForm() {
        return new FormModel(); // セッションに何もないときだけ生成される
    }
    
    @GetMapping("/nextPageIndex")
    public String nextPageIndex(@ModelAttribute("formModel") FormModel formModel) {
        System.out.println("0番目の値: " + formModel.getItems().get(0));
        // ここでフォームの「元の値」に戻ってしまっている
        return "nextPageIndex.jsp"; // JSPのファイル名
    }

}
```


## 解決方法
forwardをredirectに変更し、一回切る。
forward を redirect に変えることで、リクエストパラメータによる上書きバインドを防ぎ、セッションに保存された formModel をそのまま使うようにできる。
```
return "forward:/nextPageIndex";
```
このコードを
```
redirectAttributes.addFlashAttribute("formModel", formModel);
return "redirect:/nextPageIndex";
```
こうやって変更

## 終わりに
@SessionAttributes と @ModelAttribute の組み合わせでは、特にリストのようなコレクション型で思わぬ挙動が起こることがある。
セッションに保存したはずの値が消えてしまう…そんな現象に悩まされたら、リクエストによる上書きをまず疑ってみよう..

#### （　・。。・　）🖐

間違っている内容がありましたら、教えて頂ければ喜びます。
ほぼ未経験から始めた新卒エンジニア

初めまして！
新卒エンジニアSin Syoです！

## ざっくりとした自己紹介
年齢：`２２歳`
大学の専攻：`情報経営(特にプログラミングに深入りせず)`
エンジニアになったきっかけ:`生成AIに可能性を感じたため`

これまでのキャリア
```
AIで遊んでみる
→うまくいったからインターンでエンジニアしてみる
→プロトタイプを作ってみる
→できたけど、おもちゃしか作れなかった
→鍛えなおすために再起を考え、新卒入社でエンジニアを始める
→今
```
こんな感じです。

## 目標
#### エンジニアという枠に縛られない

**スタートアップだから**かもしれませんが、エンジニア以外の能力がかなりみられていたような気もしました。
それはこれから流行るビジネスをキャッチする力やどう売っていくか？という営業目線を踏まえたアプリケーション案も考えていました。
そこに生成AIの登場によって未経験でもそれなりにエンジニアリングができるようになったことから、エンジニアはより**技術力以外の観点に着目され始めました。**（需要があれば記事書きます。）
このことから、**技術力という専門領域にあえてとらわれないエンジニア**になりたい思います。





とはいえど...
技術力以外でエンジニアが差別化しようと思うと、**技術力や今までの経験から培った考えを活かして、ビジネス的な知見に応用するもの**と考えております。
となると、技術力はＡＩの力によって必須とは言えなくなるでしょうが、特段武器のない私のような人は避けては通れない道なのでは？と思っております。
加えて、現状のAIサービスは「使い手の技術力」に依存しており、自分の技術力以上のものが作れないor作れたとしても価値を正当に判断できないという状態になっていると考えております。
そのため、まずは技術力を高めたいと思っております。

## 技術力を高めるためにやること
**・個人開発（一応作ってみたいものがある**
**・AWSサービスの認定試験**
**・会社で学んだことを言語化して伝える（規約に引っかからない範囲で）**

## 最後に
私のQiitaではこれら３つの学んだ記録をしっかりと形に落とし込むために言語化し、誰かの役に立てるような記事を作っていきたいと思います！
【ディレクトリ分けする際の注意点】

ディレクトリ分けをした際に、今まで使えていたspringbootが急に使えなくなったので、なぜ使えなくなったかの解決策を今後の記録のために残しておきます！

MySpringAppApplication.java
(SpringBootApplicationのあるクラス）はディレクトリの中に入れないで、アプリの直下に置いておかないと、他のファイルでspringbootが使用できなくなる。
springbootを使うときは基本的に下記の記述が必要。※名前は自由。～Application.javaって形にして、下記の分を必ず記述する。
```package com.example.myspringapp;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class MySpringAppApplication {

    public static void main(String[] args) {
        SpringApplication.run(MySpringAppApplication.class, args);
    }

}
```

Spring Bootのアプリケーションプロパティは、アプリケーションの設定を外部化して管理するために必要！
（※外部化して管理とは、環境設定 や 構成情報 を、コード内に直接書かずに、外部の設定ファイルや環境変数として管理すること！簡単に言うとここに書いとけばいちいちパソコンにインストールしなくても使えるようになる！）
今回は下記のように書いた。application.ymlっていう書き方もある。その場合はdocker-compose.ymlと同じような書き方をする。

```spring.application.name=my-spring-app//my-spring-appのところは任意名前！

# データベース接続設定　→ PostgreSQLを使用し、認証情報を設定
spring.datasource.url=jdbc:postgresql://localhost:5432/mydb
spring.datasource.username=postgres
spring.datasource.password=password
spring.datasource.driver-class-name=org.postgresql.Driver

# Hibernate 設定　→ PostgreSQLを使用し、認証情報を設定
spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true
spring.jpa.properties.hibernate.format_sql=true
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect

# サーバーポート設定　→ デフォルトの8080ポートを使用
server.port=8080

# SQL ログの詳細表示（任意）→ HibernateのSQLとバインドパラメータを細かく確認できる
logging.level.org.hibernate.SQL=DEBUG
logging.level.org.hibernate.type.descriptor.sql=trace
```
```
Sample-Project

  |--- README.txt
  |--- pom.xml
  |
  |--- src
  |  |--- main
  |  |  |--- java
  |  |  |  |--- com
  |  |  |     |--- example
  |  |  |       |--- SpringBootApplication.java　//これ超重要!!これをほかの小分けしたディレクトリに入れると、springbootが使えなくなる！
  |  |  |       |--- common//見やすいように小分けしたやつ
  |  |  |       |  |--- config//以下が小分けした中身たち。フォルダの中のファイル（.javaとか.htmlって書いてあるやつ）たち
  |  |  |       |  |--- enums
  |  |  |       |  |--- exception
  |  |  |       |  |--- CommonConst.java
  |  |  |       |
  |  |  |       |--- controller
  |  |  |       |--- form
  |  |  |       |--- mapper
  |  |  |       |--- repository
  |  |  |       |--- response
  |  |  |       |--- service
  |  |  |       |--- util
  |  |  |
  |  |  |--- resources
  |  |  |  |--- application.yml (application.properties)　//これも超重要!!　入れる場所間違えない！
  |  |  |  |--- logback.xml　//入れる場所間違えない！ここにいないと動かなくなる！
  |  |
  |  |--- test
  |  |  |--- java
  |  |  |  |--- com
  |  |  |     |--- example
  |  |  |       |--- controller
  |  |  |       |--- repository
  |  |  |       |--- service
  |  |  |
  |  |  |--- resources
  |  |
  |  |--- config
  |
  |--- target
  ```
SingularityでNeoVimをビルドしてGPUサーバでも使えるようにする

## はじめに

ここでは，g++等NeoVimのビルドに必要なソフトウェアが無いGPUサーバ等の環境下で，Singularityを使うことで無理やりNeoVimをビルドして使えるようにする方法を紹介します．
~~面倒なのでVimのカスタムで乗り切れるのならそのようにした方が良いです．~~

## 全体の流れ

以下の2段階で作業します．
1. Singularityイメージを作成し，NeoVimをビルドする．
1. Singularityコンテナに入り，ビルドした実行ファイルとランタイムをホストマシンに移動する．
## Singularityイメージの作成

まずは適当な作業ディレクトリを作ります．名前・場所は自由です．

```bash
$ mkdir hoge
$ cd hoge
```

この場所にSingularityのdefファイルを用意します．
viを使って`singularity.def`を作る場合は以下のようにします．

```bash
$ vi singularity.def
```

defファイルの内容は以下のとおりです．

```def:singularity.def
Bootstrap: docker
From: ubuntu:22.04

%post
    # パッケージリストの更新
    apt-get update

    # 基本的なビルドツールをインストール
    apt-get install -y \
        build-essential \
        cmake \
        ninja-build \
        git \
        wget \
        curl \
        pkg-config \
        gettext \
        libtool \
        libtool-bin \
        autoconf \
        automake \
        g++ \
        unzip

    # Neovim のビルドに必要な依存関係
    apt-get install -y \
        libunibilium-dev \
        libtermkey-dev \
        libvterm-dev \
        libuv1-dev \
        libmsgpack-dev \
        libjemalloc-dev \
        libluajit-5.1-dev \
        lua5.1 \
        lua-bitop \
        lua-lpeg \
        lua-mpack

    # 追加のランタイム依存関係
    apt-get install -y \
        python3 \
        python3-pip \
        nodejs \
        npm \
        ripgrep \
        fd-find

    # キャッシュのクリーンアップ
    apt-get clean
    rm -rf /var/lib/apt/lists/*

    # nvimをクローンしてビルドする
    git clone https://github.com/neovim/neovim.git
    cd /neovim
    make CMAKE_BUILD_TYPE=Release CMAKE_INSTALL_PREFIX=/usr/local
    make install

%environment
    export PATH=/usr/local/bin:$PATH
    export CC=gcc
    export CXX=g++

%runscript
    exec /bin/bash "$@"

```

defファイルの用意ができたらイメージを作ります．defファイルの名前は作成したファイルと合わせてください．sifファイルの名前はご自由に．

```bash
$ singularity build --fakeroot singularity.sif singularity.def
```

イメージの作成には数分かかります．筆者環境では3~5分くらいかかったと記憶しています．

## nvimをホストマシンに移す

イメージのビルドが終わったら，コンテナに入ります．sifファイルの名前は自分で作ったものと合わせてください．

```bash
$ singularity shell singularity.sif
```

実行ファイルはコンテナの中の`/usr/local/bin/nvim`，ランタイムは`/usr/local/share/nvim/`ディレクトリです．それぞれホストマシンにコピーします．

```bash
Singularity> cp /usr/local/bin/nvim ~/.local/bin/
Singularity> cp -a /usr/local/share/nvim/ ~/~/.local/share/
```

この例では`~/.local/bin`に実行ファイルをコピーしています．もしパスが通っていない場合は`.bashrc`に以下の行をを追記します．
```bash:~/.bashrc
export PATH=$PATH:~/.local/bin
```

既にパスが通っている別のディレクトリがある場合は，その場所にコピーしても良いです．

## 確認

コマンドを叩いてNeoVimが起動すれば成功です．設定をすればプラグインを動かすこともできます．

```bash
$ nvim
```
Empowering Developers Through Knowledge Sharing and Community Collaboration

In today’s fast-moving tech world, staying updated with the latest programming trends, tools, and best practices is essential. But learning doesn’t always come from formal education or paid courses. Sometimes, the most powerful lessons come from real people sharing real experiences. That’s where online developer communities come in—spaces where coders help each other grow by openly sharing ideas, solving problems, and offering practical tips based on their own work.

One such platform has quietly become a favorite among **[developers](https://qiita.com/)**, especially those who enjoy clean, well-structured articles. It offers more than just technical blogs; it gives programmers a chance to teach and learn at the same time. Every article feels like it was written by someone who actually faced the issue, solved it, and wants to help others avoid the same frustration.

What makes this platform stand out is its deep connection to real-world development. Writers don’t just post theory—they share what they’ve implemented in real projects. Whether it’s a unique way to use Docker, a clever solution in Python, or a fix for an annoying React error, the content feels authentic and tested. It’s the kind of knowledge that isn’t always easy to find in official documentation.

Another big plus is how beginner-friendly it feels. New developers can browse through tutorials, examples, and short guides without feeling overwhelmed. Many posts are written in simple language, with code snippets that can be copied and tested right away. For someone who just started learning JavaScript or is exploring APIs for the first time, this kind of hands-on support is priceless.

The platform also encourages collaboration in a subtle but powerful way. Developers can comment, ask questions, or even improve articles by sharing their own insights. It’s not just about showing off skills; it’s about lifting others up. That positive spirit creates an environment where learning feels more like teamwork than competition.

You’ll often find tags related to specific technologies—like Laravel, Vue.js, or TypeScript—making it easy to find content that matches your current focus. You don’t have to waste time searching through unrelated topics. Everything is neatly organized, and you can follow certain tags or authors to keep learning in your area of interest.

Another quiet feature that deserves praise is the way writers explain not just what to do, but why it works. Instead of dumping code, they walk you through the logic. This helps readers actually understand the approach, so they’re more confident applying it in other situations. That’s the kind of learning that sticks.

In a world full of noisy tech advice, it’s refreshing to find a calm, organized space where developers speak from experience, not ego. This community has quietly built a reputation for being useful, honest, and supportive—and that’s exactly what makes it special. Whether you're a seasoned engineer or just starting your coding journey, there's something here for everyone who's curious, driven, and eager to learn.
MX Linuxにレトロゲーム エミュレーター(PPSSPP)をインストール

MX LinuxにPSP（Play Station Portable）のエミュレータをインストールする方法です

Windows10のサポート切れで使わなくなる・なったPCやタブレットの使い道の提案です

## MX Linuxの情報と日本語化
こちらに日本語化の手順があります
[MX Linuxの情報と日本語化の記事](https://qiita.com/Kazu-Q/items/51408b66f49ad8d2dcc7)
Intel Atom CPUを搭載したタブレット向け設定
[MX Linux タブレット向け設定（Intel Atom CPU）](https://qiita.com/Kazu-Q/items/cf340afd25a7d8c96948)

## PCのスペック
私が個人的に動作確認した感覚での情報になります　・・・情報を更新していく予定です
明確な基準はありませんが
CPU:Intel Core 第二世代以降　（i3,i5,i7）　・・・内蔵GPU性能が第２世代で大きく向上しているため
メモリ：4GB
ストレージ：HDD・SSDどちらでもOK　・・・CPUの処理性能の方が大きく影響する
 - OS：ざっくり20GB程度
 - データ保存領域：保存するデータ量に依存します

## PPSSPPとは？
SONYの携帯ゲーム機 PSP（Play Station Portable）のエミュレータです
→PSPのCPU・GPUをソフトウェアで再現、実行するものです

 **ソフト（ゲームROM）は必ず所有しているものを使用して下さい**


## PPSSPPのインストール
MX Linuxではデフォルトの「MXパッケージインストーラー」からインストール出来るためすごく簡単です

### １．MXパッケージインストーラーを起動
![0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/338848/548e7cd9-82a2-4016-8e14-29d6afe335e8.png)

MXパッケージインストーラーのウィンドウが表示されます
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/338848/05c6bc99-1566-493a-a9e3-8d2f707245fa.png)

### ２．PPSSPP を検索

「Flatpaks」タブを選択します
![1-a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/338848/8b7ee8cb-8028-4325-92d9-f3f10e1423e2.png)

「警告」が表示されます。内容を読んで閉じて下さい
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/338848/6aa70c0b-ac0b-4b5d-9b4d-abe3f32450b7.png)


右上の検索窓に **ppsspp** （大文字小文字のどちらでもOK）を入力ます
![3-a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/338848/ea0fc5fb-1b9d-4221-b83a-d716325bdaeb.png)

ppsspp　を選択してインストールします
![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/338848/cdcdee6a-cf98-4f9b-8991-6e81148714fa.png)

## PPSSPPの起動
左下のメニューから　ゲーム　を選びます
![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/338848/df78ee56-b195-4e7f-9b0a-d5f821c1fe0d.png)

PPSSPPをクリックすると起動します

## PPSSPPの設定・使い方は？
ネット上にたくさんの情報（Blog、解説サイト、動画、Wiki）があります。
ご自身で検索して自分好みの情報を選んで設定、使用して下さい

### 【重要】ソフト＝ゲームROM　について注意
使用・遊ぶソフト（ゲームROM）はすべて自分で購入しています
”インターネット等から入手したりコピーを使用しないで下さい”　・・・違法行為です刑事罰になりますので注意して下さい

私はソフト自体が格安で販売されているため試しやコレクションとして購入しています

※ゲームのルールや操作が難しいものはゲーム好きの友人に無償で譲渡しています
→私の手元のROMデータは削除もします

### 動作確認したソフトのリスト化（今後更新予定）
動作確認したソフトのリストを作成するつもりです
試してみたい人の参考になれば　(^^)

## PPSSPPについて
PPSSPPはオープンソースです。これは”無料ではありません”、**”無償で使用していい”** ですので誤解しないで下さい

開発には様々な費用がかかっています。それを”無料”と考えるのは開発者達に失礼と思います
・開発費（開発者の人件費、開発用のPCほか）
・バグ対応（バグの再現、原因追求、プログラム修正、動作確認）
・公式サイトの運営（サーバー構築費、維持費）
など

多くの人が何らかの形で貢献（開発に参加、寄付）することでより良いものになっていきます

※私は微力ですがAndroid版PPSSPPの有料版を購入して使用しています
　将来的には少額の寄付をしたいと考えています
HTMLとCSSのちょっとしたお作法

# １．はじめに
HTMLやCSSは、ホームページ作成や、Webシステム開発でWebMVCフレームワークを採用する際に必ず習得しなければいけない技術です。本来ならこの記事のターゲットは、「広報目的で見栄えのいいホームページを作成するWebデザイナー」が主な対象になると思います。しかし、私は、この記事が業務系Webアプリケーション開発者向けの記事にもなり得ると思います。HTMLとCSSのお作法の前にHTMLとCSSの学習の必要性についても語らせてください。

# ２．業務系Webアプリ開発でも学習が必要な理由
近年、業務用Webアプリケーション用のGUIフレームワークやローコードツールが続々と登場して、簡単にWebページを作れるようにする技術が既に沢山あります。デザインの柔軟性に欠けるという欠点はあるものの、業務系アプリケーションでは、機能優先で、業務の流れを改善させることを重視するため、デザインはそこまで重要視されません。「そんな技術があるんだから、HTMLやCSSを学習する意味は無いんじゃないの？」と思う方も正直いらっしゃるでしょう。
では、なぜ学習が必要なのでしょう？

#### WebMVCフレームワークが今でもなお人気だから
上述した通り、WebMVCフレームワークを採用するには、HTMLとCSSをほぼ１から記述しなければいけないので、習得は避けられません。そんなフレームワークがなぜか今でも採用される事例が多いため学習しておかなければいけません。
不思議ですよね？一体なぜなのでしょう？


#### テストの容易性
MVCフレームワークは、ロジックとUIの分離を強制するように設計されています。そのため、自動テストを用いて、テスト工数削減、品質向上、リファクタリング容易性の向上などを実現しています。対して、GUIツールやローコードツールは、UIコンポーネント上に条件分岐、表示切替、クリックイベントで直接DB参照などをする傾向にあり、密結合になってテストが難しくなりやすいです。よって、WebMVCフレームワークは今でも人気です。

導入が長くなってしまいましたが、そんなHTMLとCSSのちょっとしたお作法をこれからご紹介します。

# ３．お作法その１ 見た目の調整について
そもそもHTMLとは文書の構造を記述する言語、CSSとは文書の見た目を記述する言語です。よって、文字の大きさや間隔などといった見た目の調整をHTMLで記述するのはご法度とされており、それらは全てCSSで記述します。例えば、&lt;h1&gt;タグは文書の見出しを定義するHTMLタグとなっています。このタグは&lt;h1&gt;～&lt;h6&gt;まであり、それらは、見出しの相対的な大きさが存在しますが、これは文字の大きさではなく、その文書中に占める意味のレベルを表すためにあります。文字のサイズを調整したいときは、CSSの「font-size」を指定します。
```html
<!-- HTML タイトルを表している -->
<h1>hogehoge</h1>
```
```css
/* CSS 文字のサイズを表している */
h1 {
  font-size: 36px;
}
```

# ４．お作法その２ HTMLタグを記述するときの注意点
前述のコードの&lt;h1&gt;タグは、&lt;/h1&gt;タグで閉じていますね。このようにHTMLのタグの多くは、開始タグと終了タグがあるタグが多いです。ここで、終了タグを書き忘れてしまうと文書にうまく反映されないので、開始タグを書いたら、内容を書く前に終了タグを先に書きましょう。

# ５．お作法その３ CSSセレクタの使い分け
ここでは、CSSセレクタの内、Idセレクタとクラスセレクタの使い分けについてご紹介します。まず、Idセレクタは、ソースコード中で属性名を１つの要素にしか使用することができません。対して、クラスセレクタは、複数の要素に同じ属性名を使用することができます。Idセレクタは、他と区別したい特別な要素がある時に使用し、クラスセレクタは、沢山の要素に共通のスタイルを与えたいときに使用します。

```html
<!-- HTML １組の生徒たち-->
<div id="taro" class="itikumi">太郎</div>
<div id="jiro" class="itikumi">次郎</div>
<div id="saburo" class="itikumi">三郎</div>
```
```css
/* CSS 文字のサイズを表している */
/* CSS クラスセレクタ １組全員に対してスタイルを適用する */
.itikumi {
    /*・・・*/
}

/* CSS Idセレクタ 太郎だけに対してスタイルを適用する */
#taro {
    /*・・・*/
}
```



# ６．お作法その４ GETとPOSTの使い分け
クライアントからサーバへの通信の種類として、HTTPメソッドというものがあります。URLやボタンクリックなどを契機に発生する機能の種類ごとに使用するHTTPメソッドが変わってきます。その中で代表的なGETメソッドとPOSTメソッドについてご紹介していきます。

### GETメソッド
入力されたフォームデータをURLの一部にくっつけて送信する形式です。主に、検索機能、詳細ページ表示機能などといった、データの取得のみを行う機能に対して使用します。

```html
<!-- GET　データ取得-->
<form action="/search" method="get">
　<label for="keyword">キーワード:</label>
  <input type="text" name="keyword" id="keyword">
  
  <button type="submit">検索</button>
</form>
```
### POSTメソッド
入力されたフォームデータを本文（body）部分に含んで送信する形式です。ログイン機能、ユーザ登録、データの編集、削除などといった、副作用（サーバの状態が変化する事象）が起こる機能に対して使用します。
```html
<!-- POST　データ送信（登録、更新、削除）-->
<form action="/login" method="post">
  <label for="username">ユーザー名:</label>
  <input type="text" name="username" id="username">
  
  <label for="password">パスワード:</label>
  <input type="password" name="password" id="password">
  
  <button type="submit">ログイン</button>
</form>
```

# まとめ
今回は、HTMLとCSSを学習する理由と、実際にコードを書くときのお作法を何点かお伝えしました。これらは、開発する時はもちろんのこと、保守・運用をするときにも非常に重要なことなので、ぜひ覚えてみてはいかがでしょうか？
ECSで使用されるタスクについて

# ECSのタスクとは
タスク定義はアプリケーションのブループリントです。これは、アプリケーションを形成するパラメータと 1 つ以上のコンテナを記述する JSON 形式のテキストファイルです。

https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/task_definitions.html

* 使用する起動タイプ、これによりタスクをホストするインフラストラクチャを決定
* タスクの各コンテナで使用する Docker イメージ
* 各タスクで、またはタスク内の各コンテナで使用する CPU とメモリの量
* メモリと CPU の要件
* タスクが実行されるコンテナのオペレーションシステ
* タスクのコンテナで使用する Docker ネットワーキングモード
* タスクで使用するログ記録設定
* コンテナが終了または失敗した場合にタスクを実行し続けるかどうか
* コンテナの開始時に実行するコマンド
* タスク内でコンテナが使用するデータボリューム
* タスクで使用される IAMロール

# 使用されるタスクの優先順位
Terraformでタスクを更新しようとした際に生成もとに使用されるタスクは現行で稼働しているバージョンが参照されるか、最新版を基に更新するかなど　いくつか方法がある。

BuildSpecの中を参照した際に、
```
TASK_DEFINITION_ARN=${
    aws ecs descrive-services \
        --clusuter "${SERVICE_NAME}-${ENV}-cluster" \
        --services "${SERVICE_NAME}-${ENV}service-fargate-${SERVICE_NAME}" \
        --query "services[0].taskDefinition"  \
        --output text
}
```
のような定義があれば、最新版ではなく現在稼働しているクラスターのタスクを参照に次のタスク生成をおｋ
Deploy Agent Authentication


https://trailhead.salesforce.com/content/learn/projects/deploy-agent-authentication

# Learn About Authentication for Topics and Actions

組織を作っただけで、問題ない

# Add Variables and Filters to Topics and Actions

何もしないで検証ボタンをクリック

:::note alert
Einstein is not enabled in your org. Make sure you turn it on in the Einstein Generative AI section of Setup.
:::


フローの手前で、検証

:::note alert
It appears that 'Get Contact' flow isn’t active. Activate it and try again.
:::

フローを有効化してから検証ボタンをクリックすると...

合格しましたねぇ　何も見てない感じです。

newボタンが無いと思ったら、Filtersタブになってなかった。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/a372f075-c7b3-42e6-8038-ef28466ea9bc.png)

５からの操作が？ですね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/258944ca-3a4d-4695-8ddd-9e7f76ee27b2.png)

色々触っていると...

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/b5cdea7e-2ac1-4353-a982-67e68a48e7b9.png)

違うな、さらに戻る？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/996ba576-a4e7-4b5f-a453-9f79068e90d9.png)

コンテキストをクリック

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/872312a0-b131-4b23-a8d7-600857e2f640.png)

何故か、最初からあるな...

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/20a0ef88-12d4-430c-931d-4b0438d3a2e4.png)

他のアクションにもあるけど...

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/be60c107-c35c-450b-b73c-4df5266e647f.png)


Retake this Stepをクリックして再検証したけどエラーはない。何もみてないな。


あと１つ残していたのでアクセスしたけど... 消えている

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/8b47b287-0175-4fc9-9be5-89b414bc9163.png)




# エラー

+ [Problem with Deploy Agent Authentication Project](https://trailhead.salesforce.com/trailblazer-community/feed/0D5KX00000TkEt20AF)

:::note alert
{  "customerType": null,  "customerId": null,  "authenticationKey": null,  "verificationMessage": "If you have provided a valid email or username, you should receive a verification code to verify your identity. Please enter the code",  "verificationCode": null}
:::
SpringBootでアクセスログをコンソールに表示する方法

## Spring BootのアプリをAPIとして開発していたらAPIのアクセスに全くコンソールが反応していないことが発覚！

こんにちは！私は最近SpringBootのアプリについて業務でよく扱うことになったので色々調べてます。

今回はアクセスログのやり方についてお伝えします

## 環境

以下の環境でやってます。

1. Spring Boot(3.4.7-SNAPSHOT)
1. Maven
1. MySQL
1. MyBatis

## pom.xml

以下のライブラリを追加してください

```xml
		<dependency>
			<groupId>ch.qos.logback.access</groupId>
			<artifactId>logback-access-tomcat</artifactId>
			<version>2.0.4</version> <!-- or the latest 2.x version -->
		</dependency>
		<dependency>
			<groupId>ch.qos.logback.access</groupId>
			<artifactId>logback-access-common</artifactId>
			<version>2.0.6</version>
		</dependency>
```

あとはConfigのJavaとXMLを配置します

## ConfigとXML

`config`のパッケージがなければ作ってください`com.example.config`など

`LogbackAccessConfig.java`

```java
package com.example.config;

import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import ch.qos.logback.access.tomcat.LogbackValve;

@Configuration
public class LogbackAccessConfig {
    @Bean
    public TomcatServletWebServerFactory servletContainer() {
        TomcatServletWebServerFactory tomcat = new TomcatServletWebServerFactory();
        tomcat.addContextValves(new LogbackValve());
        return tomcat;
    }
}

```

`/src/main/resources/conf`に追加してください

`logback-access.xml`

```xml
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
  <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    <encoder>
      <pattern>[ACCESS] %h %l %u %r %t{yyyy-MM-dd HH:mm:ss.SSS} %s %b %D ms</pattern>
    </encoder>
  </appender>
  <appender-ref ref="STDOUT" />
</configuration>
```

これでアクセスログが出力されるようになります。

フォーマットはXMLの中の`pattern`で指定できるようです。

こんなアクセスログが表示されます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280363/8f254336-ebe3-4dc7-b999-34443572b7f7.png)