OmniAICreator/Qiita-1.07M huggingface dataset:
ファイルを作成するだけでアクセス制限をかけるPHP

IPアドレスごとに2秒待たないとエラーを発生させます。

```php
<?php
$directory = 'ip_logs';
if (!file_exists($directory)) mkdir($directory, 0777, true);
$filename = $directory . DIRECTORY_SEPARATOR  . preg_replace('/\W/', '_', $_SERVER['REMOTE_ADDR']);
$lastModified = filemtime($filename);
if ($lastModified && (time() - $lastModified) < 2) {
    http_response_code(429);
    exit();
}
touch($filename);
```
.net（ASP.NET Core) と Node.js ~ バックエンドプラットフォームの違いをまとめてみた

# はじめに
新卒から.netを触り始めて早4年。.net frameworkでVB.netからキャリアをスタートさせて、今はASP.NET Coreをメインに触れています（もちろんC#です）。

最初は、framework？なんじゃそれ？？、プログラミング言語と何が違うん？
といったレベルで、開発環境そのものの理解も覚束ない、エンジニア（仮）みたいな知識レベルでした。

さすがに4年も触れていると、「ああ、frameworkってこのレベルまで違うのね」程度の感覚までは言語化することができるようになったので、ようやくバックエンドエンジニアとして一本毛が生え始めたくらいまでの理解力は得られました。

そんな折にして、転職してからNode.jsというものに触れ始めて、NPM？YARN？という新しい壁にぶち当たり、結局ここでも理解するのに苦労する始末。

しかし使ってみると、これまで.netしか使ってこなかったものも相まって、両バックエンドプラットフォームをぼんやりと比較することがありました。

そこでせっかくなら、両プラットフォームをきちんと調べて、両方の違いと利点を改めて言語化しようかなと思いここにまとめてみようと思います。

# それぞれの特徴
以下の2点を比較しようと思います。

・基本的な開発言語

・基本アーキテクチャの違い


まず、基本的な違いを表形式でまとめてみましょう。
| 特徴 | .net（ASP.NET Core) | Node.js |
|:-:|:-:|:-:|
| 実行エンジン | .NET ランタイム | V8 JavaScript エンジン |
| 対応言語 | C#、F#、VB.NET | JavaScript、TypeScript |
| 開発パッケージマネージャー |  NuGet |  npm、yarnなど |

ざっとこんなものですね。

基本アーキテクチャについて、詳しくみてみましょう。

:::note info
V8 JavaScriptはGoogleが開発したJavaScriptエンジンです。
Google chromeのバックエンドでもこのJSが使われているそうです。
:::




<h2>基本アーキテクチャの違い</h2>

**・.net（ASP.NET Core)**

　・ `マルチスレッドプールを採用`
 →.netランタイムが自動でスレッド（CPUが作業できる単位数）の増減を調整して、アプリ負荷がかからないよう効率的に処理を行っています。スレッドをひとまとめに処理を行うことを、マルチスレッドプールといいます。

　・`非同期処理`
 →スレッドを効率的に管理できる.netは、非同期処理とかなり相性が良いです。
 たとえば、async/awaitを使用してI/O処理を行えば、限られたスレッドを占有せず多数のリクエストを並行して行うことができます。

　・`CLRによるバックグラウンド処理`
 →CLRとは簡単に言えば、プログラミング言語を機械語に翻訳する共通言語のことです。その名の通り、C#以外の言語でコンパイルされても、ランタイムしてくれます（クロスプラットフォームといいます）。
 さらにCLRには「ガベージコレクション」 = スレッドプールを自動管理してくれる機能があり、自動で不要なメモリを解放してくれます。


**・Node.js**
　・`シングルスレッド`　＋　`イベントループ`
 →一方で、Node.jsではシングルスレッドです。それだとめっちゃ遅くない？って思いますが、複数のことを並行して行えるように見せるイベントループというのを取り入れています。

　・`非同期処理`
 Node.jsも同じく、async/awaitによるスレッドがブロッキングされないようなI/O操作をしています。javascriptにもともとあるPromiseも併用しているようです。

　・`libuvライブラリによるバックグラウンド処理`
 　シングルスレッドではありますが、I/O操作するときはスレッド　プールを使っています。それがこの、C++で作られたlibuvです。マルチスレッド、ファイル、ネットワーク操作まで対応して、しかもクロスプラットフォームという優れものです。


 # 終わりに
 ざっと書き上げてしまいましたが、それぞれの特徴を踏まえて開発領域に適したユースケースは以下のようになるでしょうか。

 **.net（ASP.NET Core)**
 複数のスレッドを効率良く処理行い、不要なメモリを自動開放してリソースを最適化してくれる。

 ⇒　**計算負荷の高いシステム(金融などの大規模システム）に向いている**

 
  **Node.js**
  軽量なシングルスレッドと非同期処理によるノンブロッキングなI/O操作が行える。

  ⇒　**即起動・停止ができるマイクロサービス（チャットアプリなど）に向いている**
 

 Node.jsのイベントループはかなり混乱して、乱筆になってしまったかもしれません（勉強不足...）。もう少し経験を積んで、イベントループ単体で記事をあげたいですね。
(自分用メモ) OSI参照モデルとは何か？

# プロトコル

- 通信におけるルール、規格のことを**プロトコル**という。

### イメージ

人と会話する時、自分が日本語で話していても、相手が日本語を理解していなければ、話が通じない

つまり、送信側と受信側で同じプロトコルではないと、データの疎通はうまくいかない

ネットワークで使用するプロトコルは多くの種類があり、複数のプロトコルを使って通信を使っている。

# OSI参照モデル

ネットワークで必要とされる7つの階層に分割した通信の基本モデル

しかし、実際に使われているのは、TCP/IPモデルである。

| レイヤ | 名前 | 説明 |
| --- | --- | --- |
| 7 | アプリケーション層 | アプリケーション固有のルール |
| 6 | プレゼンテーション層 | データの表現形式、データの圧縮、暗号化のルール |
| 5 | セッション層 | セッションの確立、維持、終了を管理を行う |
| 4 | トランスポート層 | 信頼性のある通信を行うためのルール |
| 3 | ネットワーク層 | 異なるネットワーク間で通信する時のルール |
| 2 | データリンク層 | 直接接続された1つのネットワーク内のデータ転送のルール |
| 1 | 物理層 | 電気信号やケーブルなど、物理的な仕様 |

## 各層について

### 物理層(L1)

- ネットワークに関する物理的な使用を定めている
    - ケーブルについて
    - 電圧について
    
    など
    

### データリンク層(L2)

- 直接接続された1つのネットワークの通信に関するルール
    - データの送信元や宛先の識別方法
    - 送信中にエラーが発生した時の対処法
    
    など
    

データリンク層では、データの宛先はMACアドレス(物理アドレス)を使って示す。

### ネットワーク層(L3)

- 異なるネットワーク間でデータ転送を行うためのルール
    - 遠く離れたネットワークに存在する場所でも、ネットワークを徐々に辿って、データを届ける
    - データの宛先等はIPアドレスを使う
    - ネットワーク同士を接続してデータを転送するネットワーク機器がルータ

### トランスポート層(L4)

- 送り出したデータを宛先のコンピュータのアプリケーションまで届ける役割
    - データが確実に届くために通信の信頼性を確保する
    

### セッション層(L5)

- アプリケーションによる通信全体

たとえば、ブラウザにURLを入力して、Enterを押すと通信が開始されて、ページがすべて表示されると通信が終了する。

この一連の通信がセッション

- このセッションの確立から終了までを管理する役割

### プレゼンテーション層(L6)

- データの表現形式や暗号化、圧縮方法について決めている

たとえば、送信側と受信側で文字化kが起きないように文字コードを変換する

### アプリケーション層(L7)

- ユーザーとインターフェイスになる層で、アプリケーション固有のルールを提供。

# カプセル化と非カプセル化

> 送信側
> 
- コンピュータ間でデータを送信する際、作成したデータは上位層(アプリケーション層)から順に処理する。この時、各層において必要な情報を**ヘッダ**として、取り付けて、下層に渡す。

→ この処理をカプセル化という

> 受信側
> 
- コンピュータでは電気信号をビット列に変換して、データを取り込む。この時、ヘッダ情報に基づいて処理し、ヘッダを取り除いて上位層にデータを渡していく

→ この処理を非カプセル化という

# 参考文献
- [1週間でCCNAの基礎が学べる本 第3版](https://www.amazon.co.jp/1%E9%80%B1%E9%96%93%E3%81%A7CCNA%E3%81%AE%E5%9F%BA%E7%A4%8E%E3%81%8C%E5%AD%A6%E3%81%B9%E3%82%8B%E6%9C%AC-%E7%AC%AC3%E7%89%88-%E5%AE%AE%E7%94%B0%E3%81%8B%E3%81%8A%E3%82%8A-ebook/dp/B0923N77H2/ref=sr_1_2_sspa?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&s=books&sr=1-2-spons&sp_csd=d2lkZ2V0TmFtZT1zcF9hdGY&psc=1)
Microsoft：記事：目次

### ■目次

### ■Microsoft Fabric
初期作成から順番に整理しながら、やっていきます。
[始め方](https://qiita.com/taku_tachibana/items/c633a901d5d0069d8196)
[容量の作成・設定と切替](https://qiita.com/taku_tachibana/items/bf3164725bfa416d02d4)
[容量の課金方式](https://qiita.com/taku_tachibana/items/d966de16d750e9e9d595)
[容量の一時停止/再開の自動化](https://qiita.com/taku_tachibana/items/d99f3e798841338b6f05)
[管理ポータル](https://qiita.com/taku_tachibana/items/256b866613de29717209)
[ワークスペース内部のアクセス制御](https://qiita.com/taku_tachibana/items/2c72e617842da716b558)
[データストアの選択](https://qiita.com/taku_tachibana/items/e98ce17308763d1d2a91)
[監視について](https://qiita.com/taku_tachibana/items/0122781f18c77307be80)

### ■Snowflakeとの関連：Azure BLOB Storageデータロード
説明：Azure構成で、BLOB Storageの外部ステージ利用でのデータロードの方法になります。
[①ストレージ統合](https://qiita.com/taku_tachibana/items/e9ce026e2a41eab50341)
[②ストレージネットワーク構成](https://qiita.com/taku_tachibana/items/4252293bf53d498f971c)
[③外部ステージ～データロード](https://qiita.com/taku_tachibana/items/7aa800b012ba76a9bb45)

### ■資格関連情報
Microsoft Certifiedの合格備忘録です。
AZ-305以前に、AZ900,DP-900,AZ-104は取得済みです。
上記、受験当時はQiitaを始めていなかったため、ご了承ください。
[Microsoft Azure Infrastructure Solutions(AZ-305)合格備忘録](https://qiita.com/taku_tachibana/items/481d1413f430cba9c4ec)
[Microsoft Certified: Azure AI Fundamentals(AI-900) 合格備忘録](https://qiita.com/taku_tachibana/items/cde98de50ea10a65f01c)
[Microsoft Certified: Azure AI Engineer Associate(AI-102) 合格備忘録](https://qiita.com/taku_tachibana/items/d4d16a701ef89351193f)
[Microsoft Certified: Security,Compliance,and Identity Fundamentals(SC-900) 合格備忘録](https://qiita.com/taku_tachibana/items/08b004ba9e9f900070d6)
[Microsoft Certified: Fabric Analytics Engineer Associate(DP-600)合格備忘録](https://qiita.com/taku_tachibana/items/20fb7f40017e009b5ba8)
[Microsoft Certified: Azure Data Scientist Associate(DP-100)合格備忘録](https://qiita.com/taku_tachibana/items/11d98bc2a41ae1a0e77f)
[Microsoft Certified: Fabric Data Engineer Associate(DP-700)合格備忘録](https://qiita.com/taku_tachibana/items/4e4f243f1b5484eae044)
[Microsoft Certified: Azure Developer Associate(AZ-204)合格備忘録](https://qiita.com/taku_tachibana/items/b9a208595761e9ab3516)

以下は試験に関するその他情報
[Microsoft Certified: 試験時のLearning検索について(番外)](https://qiita.com/taku_tachibana/items/601444be3a0fbea76e67)
Gridレイアウトでグリッド線が二重にならないようにする【CSS】

[`outline`](https://developer.mozilla.org/ja/docs/Web/CSS/outline)を使うといける。

# 問題
`display: grid;`でグリッドに合わせて線を引きたい時、以下のように各セルにボーダーをつけるとセルの隣り合う部分が二重になって太くなってしまう。

```html
<div class="grid">
  <div>1</div>
  <div>2</div>
  <div>3</div>
  <div>4</div>
  <div>5</div>
  <div>6</div>
</div>
```

```css
.grid {
  display: grid;
  grid-template-columns: 1fr 1fr 1fr;
}
.grid > * {
  padding: 2em;
  border: solid 3px black;
}
```

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2354612/d9885329-c0db-0e49-fbce-935e9bbf190f.png)

内側のグリッド線が二重になって太くなってしまっている。

# 解決策
`border`と似て非なるプロパティー`outline`を使うとこの問題を解決できる。`outline`は`border`と同じように要素の周囲に線を引くプロパティーだが、`border`とは違いその線の太さが描画領域を占有せずレイアウトに影響を与えないという特徴がある。例えばコンテンツ幅100pxのボックスに`border`で太さ3pxの境界線を一周描けば全体で106pxの幅を占有するが、同じ境界線を`outline`で描くと全体は100px幅のままで3pxの線は要素の領域からはみ出す形で描画される。

このはみ出して領域を占有しないという特徴を使うことで以下のようにグリッド線が二重になるのを防げる。上の`border`を使った場合と比較して2点変更した。一つは`border:`を`outline:`に変更している。二つ目はグリッドのコンテナに`gap: 3px;`を追加している。

```css
.grid {
  display: grid;
  grid-template-columns: 1fr 1fr 1fr;
  gap: 3px;
}
.grid > * {
  padding: 2em;
  outline: solid 3px black;
}
```

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2354612/f2c00c03-2f4a-eedb-3e9b-0bad79aeea84.png)

これにより内側も外側も同じ3pxの太さになっている。

## 少しだけ改良
上記のスタイルだと外周線は領域を占有しておらず、レイアウトがズレるかもしれない。内側の線は`gap: 3px;`によってレイアウト上の領域が設けられているが外周線は`outline`の特性上領域からはみ出す形になっている。

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2354612/f2bcecd7-ba32-4336-0ee1-86a5f036d9d3.png)

外周線がレイアウト上はみ出さないようにするため、グリッドのコンテナ要素に`padding`を追加するのが良いかもしれない。

```css
.grid {
  display: grid;
  grid-template-columns: 1fr 1fr 1fr;
  gap: 3px;
  padding: 3px;
}
.grid > * {
  padding: 2em;
  outline: solid 3px black;
}
```

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2354612/4ef8083c-90ce-9a5c-5cc6-64cb024118b3.png)

これで外周線がはみ出なくなった。
git cloneで動かない！？.gitignoreを知った日

# 背景
講座を受講しながら、システム構築している真っ最中。
PCを変えたタイミングで、ローカルでGit管理していたものをリモートにプッシュした。
新PCにクローンしたが動かない！！！
# 結論
.env が.gitignore 内で指定されていた。
.env の内容は.env.example に書かれていた。

# 以下、調べたこと
## .gitignore とは
名前のとおり、gitをignore（無視）するためのファイル。
.gitignore ファイル内にファイル名やフォルダ名を記述することで、
Git管理から除外することができる。

## .env とは
調べたら
> 環境変数を管理するファイル

と出てきた。
APIキーとか秘密鍵とか、公開してはいけないものもenvファイルに入れるらしい。
より良いフィードバックのために見直したいコードレビューの伝え方

## はじめに
日常的に使用しているPull Request機能でレビューをもらうことは多くあると思います。
もちろん、ほとんどは納得する内容であったり、大いに勉強になるものであると思いますが、コメントの中でモチベーションを落とすものに出会ったこともあると思います。

今回は、そのような自分が出会ってちょっと嫌だなと思ったコメント、また自分が嫌なコメントをしてしまったな、と後で気づいたコメントについても併せて考えていきたいと思います。

## 必要な情報を口頭で伝えようとする
>口頭で伝えましたが、○○の修正をしてください。
>○○を修正してください。××については、後で説明します。

わざわざ席に来たり、ビデオチャットのURLを送ってくるなら最初から記載してくれ！！
もちろん、仕様や修正して欲しい内容の説明が必要な時はあると思いますが、「口頭のほうが楽だから」とコミュニケーションコストを相手に押し付けるのも、ほどほどにするのが良いかと思います。

### 改善案
>○○なため、××の修正をお願いします。ここは△△についての補足が必要だと思うので、下記の資料を確認してみてください。補足必要な場合はご連絡いただければと思います。
>https://~~~~~

<br>

少し冗長な気もしますが、口頭での説明をレビュイーに書き止めさせたり、何も記載しないよりかはいいと思います。なるべくなら対面でのコミュニケーションコストは削減したい派です。

## 修正が必要なのに確認を促す
>ここのコードってこれであってます？確認お願いします。
>○○のとき、××のように動きますが、動作正しいですか？
>○○では？

実装間違っているなら指摘としてコメントしてくれ！煽ってんのか！！
「すみません、こちらのミスです。」という心理的負担をやりとりとして挟ませる理由はあまりないと思います。レビューもらった時点で自分のミスだな……という自認はあると思うので。

### 改善案
>ここのコードは○○なので、××に修正をお願いします。

具体的にどこが誤った実装になっているか、どう直して欲しいかコメントするだけでいいと思います。

<br>

## 状況だけコメントする
>○○が××になる。
>

単純なメモなのか、それとも直して欲しいのかわからないようなコメントも困ります。
状況だけ記載して、あとはそちらで察してくださいっていうのはレビュアーとしての役割を果たせているのか。そもそも、例のようなコメントはレビュー以前にコミュニケーションの取り方な気もしますが。

### 改善案
>○○した場合、××になってしまうので修正お願いします。

これはレビュー以前の問題ですね。テキストコミュニケーションではありますが、あくまで人とやり取りをしていることを念頭に置きましょう。

<br>

## 長文すぎる
>○○についてですが、××は△△なので□□です。なので、○○のところは××にして、△△かどうかで判断して、□□のように修正してください。

短く見えますが、記号のところがもっと長いです。これは私がたまにやってしまうなというコメントで、抜けがないように説明しようとすると、自然と冗長になってしまって、何が言いたいのかわからなくなってしまうという状況ですね。

### 改善案
>○○は××なので、△△に修正してください。不明点あればお声かけください。

もう少し相手を信じて、最低限の説明だけ載せておいて、後はレビュイーの判断にお任せするやり方ですね。
説明が必要であったり、問題があれば連絡が来ると思いますが、声をかけやすい関係を作っておくのも大切だと思います。

## まとめ
気にしすぎじゃないか？気を遣わせすぎじゃないか？と思った方もいると思います。

もちろん、あらかじめ関係性が築かれていれば問題として挙げているコメントの仕方でも問題ないと思いますが、じわりじわりと追い込まれて、心理的安全性が確保できなくなっていくことは想像に難しくないと思います。

ただ、目的はコードの品質向上であることが前提ですので、考えすぎて伝えたいことが伝わらないというと本末転倒になってしまいますので、投げっぱなしではありますが、各々の現場・プロジェクトの雰囲気に合わせて調整していただければと思います。
IBM i 7.6 が発表されました 2025/04/08

IBM i 7.6が発表されました。（昨日2025/04/08）
[IBM 発表レター](https://www.ibm.com/docs/ja/announcements/i-76-release)

IBM i 7.6は4/18に出荷開始予定です

日本語のインフォセンター（IBM docs）も公開されています。
[スティーブさんのブログ](https://techchannel.com/operating-system/ibm-i-7-6-and-7-5-tr6/)にもあるとおり、数年前に公開したロードマッププラン通りの発表・出荷開始です♪
某社のようにズルズル発表先延ばし…は無いところがIBM iすてきです。

## IBM docs : IBM i 7.6

https://www.ibm.com/docs/ja/i/7.6.0?topic=documentation-overview-whats-new

新機能が色々とあるようです
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/623aaa30-c96e-4669-b250-7e47cd1d8353.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/c9afc374-9d8c-45f7-b79f-2057099cce72.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/ba09a91b-76da-49be-adfe-b68195b6ef2d.png)

詳細はこれから勉強してみます。

## プログラム資料説明書（Memo to Users)

https://www.ibm.com/docs/ja/i/7.6.0?topic=documentation-memo-users

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/3d9d15ac-7f25-49ad-9c6c-9d229e9515ca.png)

今回、MFAのような新機能もあれば、昨年発表済みですが、ADTS(CGU, DFU, etc.）のサポート終了など機能制約、変更の情報もあるようです。

### 機能変更等の追加情報リンク

上記プログラム資料説明書中に記載がありました。こちらもバージョンアップなどでの7.6とそれ以前のバージョンの相違の確認に役立ちそうです。

Additional incompatibility information
After the publication of the IBM i Memo to Users, updates to this document will be available in the IBM
Docs under IBM i 7.6 at this Web site:
https://www.ibm.com/docs/en/i/7.6?topic=information-memo-users
Technical changes to the text are indicated by a vertical line to the left of the change.
For Preventive Service Planning - PSP information go to :
1. https://www.ibm.com/support/pages/node/667567
2. Select IBM i 760 PSPs.

## IBM i 7.6 BASEのDocks

https://www.ibm.com/support/pages/node/7181664


まずはご一報です。
WSLでLXDのネットワークを設定する。

LXDでポートフォワードを設定して、外部からアクセスできるようにしたときのメモ


## ホストのipアドレスとデバイスを調べる

```
$ ip route show
default via 172.31.160.1 dev eth0 proto kernel
10.215.99.0/24 dev lxdbr0 proto kernel scope link src 10.215.99.1
172.31.160.0/20 dev eth0 proto kernel scope link src 172.31.166.99
```

windows上でのWSLのipアドレスが172.31.166.99でデバイスがeth0であることがわかる。


## ゲストのipアドレスを調べる

```
$ lxc list
+-------+---------+----------------------+-----------------------------------------------+-----------+-----------+
| NAME  |  STATE  |         IPV4         |                     IPV6                      |   TYPE    | SNAPSHOTS |
+-------+---------+----------------------+-----------------------------------------------+-----------+-----------+
| ehime | RUNNING | 10.215.99.253 (eth0) | fd42:a480:4d2e:6fce:216:3eff:fe6a:5671 (eth0) | CONTAINER | 0         |
+-------+---------+----------------------+-----------------------------------------------+-----------+-----------+
```

lxdのゲストマシンのipアドレスが10.215.99.253であることがわかる。

## ポートフォワードを設定

```
$ sudo iptables -t nat -A PREROUTING -p tcp -d  172.31.166.99  -i eth0 --dport 80 -j DNAT --to-destination 10.215.99.253:80
```

以上でWINDOWSのブラウザから172.31.166.99にアクセスすることにより画面の確認ができる。

## 起動時の設定

iptablesの設定は、再起動すると消えてしまうので、起動時に自動設定するようにする。

## 設定のエクスポート

```
$ sudo iptables-save > iptables_setting
``` 

### 起動時のスクリプトの作成

```bash:startup.sh
#!/bin/bash

iptables-restore < /root/iptables_setting
```

実行できるようにする。
```
$ chmod +x startup.sh
```

### systemdの設定
/etc/systemd/systemにsystemdのファイルを作成する

```config:startup.service
[Unit]
Description=My Custom Start up Service
After=network.target

[Service]
ExecStart=/root/startup.sh
Restart=no

[Install]
WantedBy=multi-user.target
```

サービスを登録して実行してみてエラーがなけれは登録完了

```
# systemctl enable startup.service
# systemctl start startup.service
# systemctl status startup.service
```
📅 応用情報試験まであと1週間！これまでの勉強を振り返って、最後の追い込みへ

気づけばもう応用情報試験まであと1週間。
去年の今ごろは ITパスポートを勉強していた自分が、まさかここまで来るとは…とちょっとしみじみしてます😌

今回は、自分がこれまで取り組んできた勉強内容と使った教材を振り返りながら、最後の追い込みに向けて総復習としてまとめてみます！

# 🏃 スタートは ITパスポートから！
まず最初の一歩は**ITパスポート**。
右も左もわからない状態から、ITの基礎を固めるために手に取ったのがこのテキストでした👇

📖 [キタミ式イラストIT塾 ITパスポート 令和07年](https://amzn.to/3Ef1Ry3)

イラストで視覚的に理解できるのがありがたくて、IT未経験でもスッと内容が入ってきたのをよく覚えてます！
ここで用語のベースができたおかげで、その後の基本情報や応用情報にも自然とつなげることができました✨

# 📈 半年後には基本情報技術者試験！
ITパスポートで得た基礎を土台にして、次は**基本情報技術者試験**へ。
ここでぐっと専門用語が増えて、一気に難易度が上がったな〜という印象😅

使ったのはこのあたりの教材です！

📖 [キタミ式イラストIT塾 基本情報技術者 令和07年](https://amzn.to/3Em7Ot2)
📖[情報処理教科書 出るとこだけ！基本情報技術者［科目B］第4版](https://amzn.to/44eRhld)

キタミ式はやっぱりイラストで頭に入りやすくて助かりました🙏
「出るとこだけ！」シリーズは時間がないときの追い込みにすごく使いやすくてオススメです。

# 🧩 いよいよ応用情報へ！
そしてついに今チャレンジしているのが**応用情報技術者試験！**

基本情報よりもさらに実践的な内容が増えて、「応用」の名の通り深掘りしていく感覚が強かったです。
使った教材はこれ👇

📖 [キタミ式イラストIT塾 応用情報技術者 令和07年](https://amzn.to/4ct27Gs)
📖 [応用情報技術者 午後問題の重点対策](https://amzn.to/44hx1PX)

午後問題が正直めちゃくちゃ難しいんですが、「重点対策」の本がかなり役立ってくれました！
「午後問題の時間配分ってどうするの…？」って悩みながらも、何回も解いているうちにだんだんパターンが見えてきます💡

# 📝 今の気持ちと最後の追い込み
正直、ここまで半年かけて準備してきたけど、まだまだ不安はあります…！😅
でも、これまでの積み重ねがちゃんと形になっている手応えもあって、「意外といけるんじゃないか？」って前向きになれてきました🔥

試験まであと少し。
最後の1週間はこれまでのノートや問題集の見直しをして、悔いなく試験に臨みます！

# 🌟 まとめ
去年の今ごろは ITパスポート。そこから基本情報を経て、いよいよ応用情報まで来ました。
振り返ると、「継続してきた自分、エライ！」って自分で自分を褒めたくなるくらい成長できたと思ってます🙌

もしこの記事を読んでいる人で「応用情報って難しそう…」と感じている方がいたら、大丈夫です！
コツコツ積み上げれば、自分でもここまで来られました。
一緒に頑張りましょう💪
基本情報技術者試験 - システム性能指標とスケーリング手法

基本情報技術者試験では、システムの性能指標とスケーリング手法について理解することが重要です。この記事では、主要な性能指標とスケーリング手法について、わかりやすく解説します。

## 1. 性能指標

システムの性能を評価するための主な指標には以下のようなものがあります。

### スループット (Throughput)

**定義**：単位時間あたりに処理できる仕事の量

**具体例**：
- Webサーバー：1秒間に処理できるリクエスト数（例：500リクエスト/秒）
- データベース：1分間に実行できるクエリ数（例：1,000クエリ/分）
- ネットワーク：1秒間に転送できるデータ量（例：1Gbps）

**覚え方**：
「スルー（通す）+ プット（置く）」で、「どれだけ多くの仕事を通せるか」と考えるとわかりやすい。

### ターンアラウンドタイム (Turnaround Time)

**定義**：処理の開始から終了までにかかる合計時間

**わかりやすく言うと**：
仕事を投入してから完了するまでの往復時間。処理の開始から結果が得られるまでの全時間です。

**具体例**：
- バッチジョブ：データ処理ジョブの投入から完了までの時間
- プログラム実行：実行開始から終了までの時間
- 印刷ジョブ：印刷指示から印刷完了までの時間

**覚え方**：
「ターン（回る）+ アラウンド（一周）」で、「仕事が一周回るのにかかる時間」と考えるとわかりやすい。

### レスポンスタイム (Response Time)

**定義**：要求を出してから応答が返ってくるまでの時間

**具体例**：
- Webサイト：リンクをクリックしてページが表示されるまでの時間
- アプリケーション：ボタンを押してから処理結果が表示されるまでの時間


## 2. スケーリング手法

システムの性能を向上させるためのスケーリング手法には、主に2つのアプローチがあります。

### スケールアップ (Scale Up / 垂直スケーリング)

**定義**：既存のサーバーやコンピュータの性能を向上させること

**わかりやすく言うと**：
「より強力な1台に置き換える」方法。既存の機器をより高性能なものにアップグレードします。

**具体例**：
- CPUをより高速なものに交換する
- メモリ容量を増やす
- HDDをSSDに換装する
- より高性能なGPUに交換する

**特徴**：
- 単一システムの処理能力向上
- ソフトウェア変更が少なくて済む
- 物理的な限界がある
- コストが高くなりがち

**覚え方**：
「アップ（上へ）」なので「性能を上げる」と考えるとわかりやすい。縦方向への成長をイメージすると良いでしょう。

### スケールアウト (Scale Out / 水平スケーリング)

**定義**：複数のサーバーやコンピュータを追加して並列処理能力を高めること

**わかりやすく言うと**：
「同じ性能の機器をたくさん用意する」方法。マシンの数を増やして負荷を分散します。

**具体例**：
- Webサーバーの台数を増やしてロードバランサーで負荷分散
- データベースのシャーディング（データを複数のサーバーに分散）
- ストレージのRAID構成
- 分散コンピューティング環境の構築

**特徴**：
- 理論上は無制限に拡張可能
- 冗長性と可用性の向上
- ソフトウェアの設計変更が必要なことが多い
- 1台あたりのコストは比較的安価

**覚え方**：
「アウト（外へ）」なので「外側に広げる」と考えるとわかりやすい。横方向への拡張をイメージすると良いでしょう。

## 3. スケーリング手法と性能指標の関係

### スケールアップによる影響
- **スループット**：単一システムの処理能力が向上するため、スループットも向上する
- **ターンアラウンドタイム**：処理速度が向上するため、短縮される傾向がある
- **レスポンスタイム**：システム自体の処理速度が向上するため、短縮される傾向がある

### スケールアウトによる影響
- **スループット**：並列処理能力が向上するため、全体のスループットは向上する
- **ターンアラウンドタイム**：負荷分散により短縮される可能性があるが、分散処理のオーバーヘッドが生じることもある
- **レスポンスタイム**：負荷分散により改善される可能性が高いが、通信オーバーヘッドが増加することもある

## 4. スケールアップとスケールアウトの比較表

| 比較項目 | スケールアップ（垂直）| スケールアウト（水平）|
|--------|-------------------|-------------------|
| 拡張方法 | より高性能な機器に置き換え | 同等の機器を追加 |
| イメージ | 縦方向の成長 | 横方向の拡張 |
| コスト | 高価になりがち | 比較的安価 |
| 上限 | 物理的/技術的上限あり | 理論上は無制限 |
| 実装の複雑さ | 比較的シンプル | 複雑になりがち |
| 冗長性 | 低い（単一障害点） | 高い（分散システム） |
| 適したワークロード | 単一プロセスの高負荷処理 | 並列処理可能なワークロード |
| 性能向上の特徴 | 単一処理の高速化 | 全体処理量の増加 |

## 5. 覚え方のコツ

### スケールアップとスケールアウトの区別
- **スケールアップ**：「上」へ伸びる→「より高性能な1台」
- **スケールアウト**：「外」へ広がる→「より多くの台数」

### 性能指標の区別
- **スループット**：「量」に関する指標（多いほど良い）
- **ターンアラウンドタイム**：「時間」に関する指標（短いほど良い）
- **レスポンスタイム**：「反応速度」に関する指標（短いほど良い）

## まとめ

システムの性能指標とスケーリング手法は、基本情報技術者試験でよく出題される分野です。それぞれの定義と特徴を理解するだけでなく、実際のシステム設計においてどのように選択・組み合わせるかを考えられるようになることが重要です。

スケールアップとスケールアウトは、どちらが良いというわけではなく、システムの要件や予算、運用体制などによって適切なアプローチが異なります。多くの現代的なシステムでは、両方のアプローチを組み合わせて使用することが一般的です。
全てのブック、ファイルで開いたときに各シートのA1セルを選択し、画面を合わせるコード

恐らくこのコードで問題はないと思われますが、もし万が一動作が遅くなるなどありましたら使用を中止してください
このコードを記述したブックをアドオン形式のファイルとして保存してください
開発タブ→Excelアドインから保存したファイルを選択してください

このコードをTisworkbookモジュールに記述します
    
    '変数の宣言を強制
    Option Explicit
    'アプリケーションイベントを宣言
    Private WithEvents Excelapp As Application
    'アドオン用のオープンイベント（つまりどのブックを開いても「Excelの起動時に」マクロを実行）
    Private Sub Workbook_Open()

    'アプリケーションオブジェクトをPrivate変数に代入
    Set Excelapp = Application

    End Sub

    '（本題）どのブックでも開いたときにWorkbookOpenイベントを実行
    '開いたブック（ファイル）は引数としてWB変数に代入される
    Private Sub Excelapp_WorkbookOpen(ByVal WB As Workbook)

    'ワークシートの変数
    Dim ws As Worksheet

    '開いたブック（WB変数）の全てのシート（コレクション）をループする
    'For Each In WB.Worksheetsで取り出されたワークシートはws変数に代入される
    For Each ws In WB.Worksheets

    'まずシートをアクティブにしないとA1セルをセレクトした時にエラーが発生する
    ws.Activate
    ws.Range("A1").Select
    
        'Withでアクティブを省略
    　　With ActiveWindow
      
            'A1セルの行にスクロール
        　　.ScrollRow = ActiveCell.Row
            'A1セルの列にスクロール
        　　.ScrollColumn = ActiveCell.Column
      
        End With

    '次のワークシートへ
    Next ws

    '最後に一番左のワークシートをアクティブにする
    WB.Sheets(1).Activate
    
    End Sub
基本情報技術者試験 - システム構成要素の基礎知識

基本情報技術者試験の勉強中に整理した、システム構成要素に関する基礎知識をまとめました。冗長構成やシステムの信頼性に関する概念を中心に解説しています。

## 1. システムの冗長構成

### シンプレックスシステム（Simplex System）
シンプレックスシステムは、単一の装置や構成で構築されたシステムです。冗長性がなく、一つの装置で処理を行います。故障すると機能停止となるため、信頼性は低いですが、コストが抑えられるというメリットがあります。

### デュプレックスシステム（Duplex System）
デュプレックスシステムは、同一の装置やシステムを2重化して構成するものです。主に以下の2種類があります：

1. **ホットスタンバイ方式**：
   - 主系（アクティブ）と待機系（スタンバイ）の2つのシステムを用意
   - 通常は主系が処理を担当し、主系に障害が発生すると自動的に待機系に切り替わる
   - 待機系は常に電源が入っており、すぐに処理を引き継げる状態になっている

2. **コールドスタンバイ方式**：
   - 主系と待機系を用意するが、待機系は通常電源が入っていない
   - 主系に障害が発生した場合に、待機系を起動して処理を引き継ぐ
   - 切り替えに時間がかかるが、消費電力を抑えられる

### デュアルシステム（Dual System）
デュアルシステムは、2つの独立したシステムが並行して同じ処理を行い、両方の結果を比較して整合性を確認するシステムです。一方が故障しても、もう一方が正常に動作していれば処理を継続できます。信頼性が高く、特に高い安全性が求められる分野（航空管制、原子力発電所の制御系など）で利用されます。

**デュプレックスとデュアルの違い**：
- デュプレックス：一方が主系、一方が待機系として役割が分かれている
- デュアル：両方が同時に同じ処理を行い、結果を照合する

## 2. システムの信頼性設計に関する概念

### フォールトトレラント（Fault Tolerant）
「障害許容」と訳され、システムの一部に障害が発生しても、システム全体の機能は停止せず、継続して動作する仕組みです。冗長構成（デュプレックスシステムなど）を採用して実現します。

**覚え方**: 「トレラント」=「許容する」、つまり「障害があっても許容し、動き続ける」

### フェールソフト（Fail Soft）
障害が発生した場合に、完全に停止するのではなく、機能を部分的に制限しながらも重要な機能は継続して提供する方式です。縮退運転とも呼ばれます。

**覚え方**: 「ソフト」=「柔軟に」、つまり「障害時には柔軟に機能を制限して対応する」

### フェールセーフ（Fail Safe）
障害が発生した場合に、安全側に制御して被害を最小限に抑える方式です。例えば、電車のブレーキシステムは電源が切れると自動的にブレーキがかかるよう設計されています。

**覚え方**: 「セーフ」=「安全」、つまり「障害が起きても安全な状態になる」

### フールプルーフ（Fool Proof）
操作ミスによる誤動作を防止するための仕組みです。利用者が間違った操作をしても、システムが異常動作しないように設計されています。

**覚え方**: 「フール」=「愚か」、「プルーフ」=「証明・防止」、つまり「ユーザーが間違っても問題を防止する」

## まとめ：概念の整理

これらの概念は「何に対して」「どう対応するか」で整理すると覚えやすいです：

| 概念 | 対象 | 対応方法 |
|-----|------|---------|
| フォールトトレラント | 障害 | 機能を維持する |
| フェールソフト | 障害 | 部分的に機能を継続する |
| フェールセーフ | 障害 | 安全側に制御する |
| フールプルーフ | 操作ミス | 誤動作を防止する |

基本情報技術者試験では、これらの概念の違いを明確に理解し、適切な場面での適用例を答えられるようにしておくことが重要です。
Ubuntu 22.04 に symbol-shoestring 0.2.1 をインストール

symbol-shoestring 0.2.1 がリリースされました。

https://pypi.org/project/symbol-shoestring/

お試しで symbol-shoestring をインストールし、symbolノードをテストネットに同期させてみました。

参考資料（daiさんに感謝）

https://qiita.com/ishidad2/items/6de76f4186e12e5335d5

Windows 内に Ubuntu 22.04 を準備
```
インストール
> wsl.exe --install Ubuntu-22.04
⇒アカウントとパスワードを適宜
起動
> wsl.exe -d Ubuntu-22.04
```

OSバージョン確認
```
$ cat /etc/os-release
PRETTY_NAME="Ubuntu 22.04.5 LTS"
```

Dockerをインストール
```
$ sudo apt update
$ sudo apt install -y ca-certificates curl gnupg lsb-release jq
$ sudo mkdir -p /etc/apt/keyrings
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | \
  sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
$ echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] \
  https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
$ sudo apt update
$ sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin \
  docker-compose-plugin
$ docker version
 Version:           28.0.4
$ docker compose version
Docker Compose version v2.34.0

$ cat /etc/group | grep docker
$ sudo usermod -aG docker <権限を追加したいアカウント>
$ cat /etc/group | grep docker
```

pyenv と python 3.9 をインストール
```
未インストールを確認
$ python --version

ライブラリをインストール
$ sudo apt install -y build-essential zlib1g-dev libncurses5-dev libgdbm-dev \
  libnss3-dev libssl-dev libreadline-dev libffi-dev curl libbz2-dev libsqlite3-dev \
  liblzma-dev tk-dev

pyenv をインストール
$ git clone https://github.com/pyenv/pyenv.git ~/.pyenv
$ echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bashrc
$ echo 'command -v pyenv >/dev/null || export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc
$ echo 'eval "$(pyenv init -)"' >> ~/.bashrc
$ source ~/.bashrc
$ pyenv --version
pyenv 2.5.4-3-g67f474d3

python 3.9系の最新版をインストール
$ pyenv install -list
$ pyenv install 3.9.21
$ pyenv global 3.9.21
$ python --version
Python 3.9.21
```

symbol-shoestring をインストール
```
$ pip install symbol-shoestring
```

pemファイルの作成
```
$ mkdir symbol-shoestring
$ cd symbol-shoestring
$ openssl genpkey -algorithm ed25519 -out ca.key.pem
$ ls
ca.key.pem
※ca.key.pemはインストールし終わって不要になったら消したほうが安全
```

shoestringウィザードの起動（※ウィザードの中身は割愛します）
```
$ python -m shoestring.wizard
```

```
ノードの起動
$ docker compose up -d
動作確認
$ curl http://127.0.0.1:3000/node/info | jq
ノードの停止
$ docker compose down
```

同期させてしばらくするとノード一覧に表示されます

https://symbolnodes.org/nodes_testnet/

余談

セットアップウィザードでミスったらしく委任者（ハーベスター）を自動で受け入れない設定になってしまったので、修正しノードを再起動した。
```
$ cd ~/symbol-shoestring
$ vi userconfig/resources/config-user.properties
----
-enableDelegatedHarvestersAutoDetection = false   # 自動で委任者を受け入れない
+enableDelegatedHarvestersAutoDetection = true    # 自動で委任者を受け入れる
----
$ docker compose stop
$ docker compose up -d
```
Amazon Nova Sonic を試してみたよ

## Speech-to-Speech のモデルが出ました。

Amazon Nova Sonic という Speech-to-Speech のモデルが登場しました。

https://aws.amazon.com/about-aws/whats-new/2025/04/amazon-bedrock-pixtral-large-25-02-mistral-ai/

## さて UI は？

https://github.com/aws-samples/amazon-nova-samples/tree/main/speech-to-speech/sample-codes/websocket-nodejs

aws-sampls に公開されていたので、まずはこちらを使ってみました。

## 手順

```bash
git clone https://github.com/aws-samples/amazon-nova-samples
cd amazon-nova-samples/speech-to-speech/sample-codes/websocket-nodejs
npm install
aws configure --profile bedrock-test #bedrock-test である必要がある us-east-1 に変更しておく
npm run build
npm start
```

以上！簡単！
（node.js や AWS のアカウント、マイクは持っている必要がある)

## やってみた

YouTuber のだいじろーさんのネタをやってみました。
途中で止まっちゃった（これはサンプルの問題だと思う）のですが、かなりレスポンスが早くていいですね。

https://youtu.be/W84fP7BGFjM

ちなみに元ネタはこちら

https://www.youtube.com/watch?v=eGv5D4sBFbE
Databricks AI/BIダッシュボードでサンキー図がサポートされました

こちらのアップデートです。

https://docs.databricks.com/aws/ja/ai-bi/release-notes/2025#aibi%E3%83%80%E3%83%83%E3%82%B7%E3%83%A5%E3%83%9C%E3%83%BC%E3%83%89

> サンキーの可視化: サンキーの可視化が AI/BI ダッシュボードで利用できるようになりました。[サンキーダイアグラム](https://docs.databricks.com/aws/ja/dashboards/visualizations/types#sankey)を参照してください。

工程などのステージ間の流量把握が容易に行えます。

https://ja.wikipedia.org/wiki/%E3%82%B5%E3%83%B3%E3%82%AD%E3%83%BC%E3%83%BB%E3%83%80%E3%82%A4%E3%82%A2%E3%82%B0%E3%83%A9%E3%83%A0

データを準備します。

```sql
SELECT pickup_zip as stage1, dropoff_zip as stage2, sum(fare_amount) as value
FROM samples.nyctaxi.trips
GROUP BY 1, 2
ORDER BY 3 DESC
LIMIT 10
```
|stage1|stage2|value|
|---|---|---|
|10023|10023|798|
|10028|10021|777.5|
|11371|10001|754.5|
|11422|10011|731.5|
|10003|10011|730|
|11422|10017|728|
|10028|10028|722|
|10021|10021|701.5|
|11371|10018|693|
|11371|10020|688.5|

キャンバスに移動して、可視化を追加して**Sankey**を選択します。

![Screenshot 2025-04-09 at 13.36.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/02d42e8b-57e8-4e65-b4a0-c4db1c09315d.png)

**Stages**と**値**を指定すると、サンキー図が表示されます。

![Screenshot 2025-04-09 at 13.37.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/196b33e2-62d6-4103-b2d9-a410d1faf48d.png)

特定の関係にフォーカスもできます。

![Screenshot 2025-04-09 at 13.37.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/cfa0c3d1-1552-4043-9263-4bb79403d85a.png)

### はじめてのDatabricks

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

### Databricks無料トライアル

[Databricks無料トライアル](https://databricks.com/jp/try-databricks)
Google Compute Engine(GCE)をきちんと無料枠内で使う 2025年4月版

:::note info
GCEのインスタンスを無料枠内でたてようと思ったら課金されてしまった私のような被害者を減らすために記事を書きました。2025年4月時点でのUIや条件を基に作成されています。
:::

# GCEの無料枠
2025年4月時点では、下記の通りです。最新版は[こちら](https://cloud.google.com/free/docs/free-cloud-features#compute)をご参照ください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3863326/953e1fcb-51ec-41b6-996e-d53937b63d5d.png)

軽く要点だけまとめます。
- e2-microのVMで、リージョンは挙げられたもののみ
- 30GBの**標準永続ディスク**
- 外部IPは無料で使える

# インスタンス作成手順

### 1.マシンの構成

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3863326/212180bd-c073-4c88-81a4-80674917607c.png)

- リージョンを指定されているものにします。特に理由がなければ日本に最も近いオレゴン(us-west1)にすると良いと思います。
- マシンタイプはデフォルトではe2-mediumが選ばれていると思うので、下部のプルダウンからe2-microに変更します。

### 2.OSとストレージ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3863326/25e9f9a0-1fd1-44cc-9f36-8859a6d4170d.png)

画面中央にある変更ボタンからストレージなどを変更します。
- デフォルトでは、バランス永続ディスクになっていますが、**標準永続ディスク**にしないと課金されます。
- サイズは30GBまでは無料です。
- OSはお好みの物を選んで下さい。一部課金されるOSがありますが、その場合は、「ライセンスの種類」という欄が「無料」ではなくなります。

### 3.データ保護

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3863326/289c7c7c-51d9-4482-bd34-64c09896489a.png)

- デフォルトでは「スナップショットスケジュール」というものが選択されていますが、**「バックアップなし」に変更**します。

### 4.ネットワーキング

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3863326/0c7bce85-7bd1-49bb-a79d-c3ce4f48395c.png)

webサーバーとしての運用などを考えている人は以下の設定をすることを勧めます。
- HTTP/HTTPSのトラフィックを許可
- ネットワークインターフェースのdefaultの設定から、外部IPアドレスをエフェメラルから静的IPに（なお静的IPは割り当てをして未使用だと課金されると思われますので注意してください。）

### 5.オブザーバビリティ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3863326/90c7969f-ce32-45b5-a53f-4c75d0fc57c1.png)

- 「モニタリングとロギング用の Ops エージェントをインストールする」に**デフォルトでチェックが入っていますが外します**

### 作成
画面下部の作成ボタンからVMを作成します。
セキュリティや詳細は特にいじらなくても料金には関係ないと思います。
無料枠内にきちんと収めたいなら予算アラートやキルスイッチをつけるのも有効だと思います。

https://qiita.com/0208tsu/items/1e33f3e3e61f65e81f6a

https://github.com/dataslayermedia/Google-Cloud-Platform-Killswitch

# おわりに
もしかしたら不要な設定なども紹介してしまっているかもしれません。間違っている場合や変更などがあればご指摘頂けるとありがたいです。
ソースコードコメントのフォーマットランキング (Monaco Editorのコード調べ)

ソースコードのコメントの形式って言語ごとにいろいろありますが、どういう形式が一番使われてるのか気になったので調べてみようと思いました。

Monaco Editorのソースコード見ると、<https://github.com/microsoft/monaco-editor/blob/495d075be0f9e134fe659c0210cb777372c61899/src/basic-languages/typescript/typescript.ts#L12> のように、言語ごとにコメントのフォーマット書いてあるのでこれを集計します。

（VSCodeで調べたほうがもっと良い結果を得られると思いますが、スクリプトでチャチャっと調べるのはCDN使ってMonaco Editorをロードしたほうが楽だったのでこうしました。）

## ラインコメント

単一行コメントのランキングです。

- **1位**: `// ...`\
  使用言語数: 38 (言語Id: apex, bicep, cameligo, c, cpp, csharp, cypher, dart, ecl, flow9, fsharp, go, java, javascript, kotlin, less, msdax, objective-c, pascal, pascaligo, php, postiats, powerquery, proto, pug, qsharp, rust, scala, scss, sol, aes, st, swift, systemverilog, verilog, typescript, typespec, wgsl)
- **2位**: `# ...`\
  使用言語数: 16 (言語Id: azcli, coffeescript, elixir, graphql, hcl, ini, mips, perl, pla, powershell, python, r, ruby, shell, sparql, yaml)
- **3位**: `-- ...`\
  使用言語数: 5 (言語Id: lua, mysql, pgsql, redshift, sql)
- **4位**: `' ...`\
  使用言語数: 2 (言語Id: sb, vb)
- **5位**: `; ...`\
  使用言語数: 1 (言語Id: scheme)
- **5位**: `;; ...`\
  使用言語数: 1 (言語Id: clojure)
- **5位**: `* ...`\
  使用言語数: 1 (言語Id: abap)
- **5位**: `COMMENT ...`\
  使用言語数: 1 (言語Id: lexon)
- **5位**: `REM ...`\
  使用言語数: 1 (言語Id: bat)

**ラインコメントなし**\
  言語数: 17 (言語Id: csp, css, dockerfile, freemarker2, handlebars, html, julia, liquid, m3, markdown, mdx, razor, redis, restructuredtext, tcl, twig, xml)

## ブロックコメント

複数行かけるコメントのランキングです。

- **1位**: `/* ... */`\
  使用言語数: 37 (言語Id: apex, bicep, c, cpp, csharp, css, cypher, dart, ecl, flow9, go, hcl, java, javascript, kotlin, less, msdax, mysql, objective-c, pgsql, php, powerquery, proto, redshift, rust, scala, scss, sol, aes, sql, swift, systemverilog, verilog, typescript, typespec, vb, wgsl)
- **2位**: `(* ... *)`\
  使用言語数: 6 (言語Id: cameligo, fsharp, m3, pascaligo, postiats, st)
- **3位**: `<!-- ... -->`\
  使用言語数: 4 (言語Id: html, markdown, razor, xml)
- **4位**: `### ... ###`\
  使用言語数: 2 (言語Id: coffeescript, mips)
- **5位**: `--[[ ... ]]`\
  使用言語数: 1 (言語Id: lua)
- **5位**: `''' ... '''`\
  使用言語数: 1 (言語Id: python)
- **5位**: `{ ... }`\
  使用言語数: 1 (言語Id: pascal)
- **5位**: `{{!-- ... --}}`\
  使用言語数: 1 (言語Id: handlebars)
- **5位**: `{/* ... */}`\
  使用言語数: 1 (言語Id: mdx)
- **5位**: `{# ... #}`\
  使用言語数: 1 (言語Id: twig)
- **5位**: `#| ... |#`\
  使用言語数: 1 (言語Id: scheme)
- **5位**: `<-- ... -->`\
  使用言語数: 1 (言語Id: freemarker2)
- **5位**: `<# ... #>`\
  使用言語数: 1 (言語Id: powershell)
- **5位**: `=begin ... =end`\
  使用言語数: 1 (言語Id: ruby)

**ブロックコメントなし**\
  言語数: 24 (言語Id: abap, azcli, bat, clojure, csp, dockerfile, elixir, graphql, ini, julia, lexon, liquid, perl, pla, pug, qsharp, r, redis, restructuredtext, sb, shell, sparql, tcl, yaml)

## あとがき

僕がSQL書いてる時ときどきうっかり`//`ってコメントアウトしちゃうのは`//`が圧倒的にメジャーだからいけないんだ！という言い訳の材料にできそうです。

にしてもブロックコメントの種類多いな。
Bastion + SSHエージェントフォワーディングによる接続

## 🛡️ Bastion サーバーとは？

**Bastion サーバー**は、外部から内部ネットワークへの接続を中継する **セキュリティゲートウェイサーバー** です。通常、以下のような目的で使用されます：

- プライベートネットワーク内のサーバー（例：EC2）に直接アクセスせず、Bastion を経由してのみ接続を許可する
- 外部からの直接接続を防ぎ、アクセスを中央で管理する
- セキュリティを強化し、接続ログを追跡可能にする

このマニュアルでは Bastion サーバーを **Docker コンテナ** で構築し、クライアントから SSH エージェントフォワーディングを使って EC2 コンテナに接続する環境を構築します。


ジョブセッティング環境は、次にリンクから受け取ることができる
```
git clone https://github.com/rinechran/bastion-lab.git
予備 git
git clone https://git.kudryavka.me/blog/bastion-lab.git
```

---

## 📦 システム構成図

```
[ローカルクライアント（Windows）]
   - bastion_key.pem
   - ec2_key.pem（ssh-agent に登録）

     ↓ SSH -A（エージェントフォワーディング）

[Bastion（Docker コンテナ）]
   - ec2_key.pem は保持しない
   - クライアントの ssh-agent 経由で署名要求

     ↓ SSH

[EC2（Docker コンテナ）]
   - authorized_keys に ec2_key.pem.pub を登録
```

---

## ✅ ファイル構成

```
bastion-ec2-lab/
├── docker-compose.yml
├── keys/
│   ├── bastion_key.pem         # Bastion 接続用秘密鍵
│   └── ec2_key.pem             # ssh-agent に登録する EC2 鍵
├── bastion/
│   ├── Dockerfile
│   ├── sshd_config
│   ├── entrypoint.sh
│   └── authorized_keys         # bastion_key.pem.pub を配置
└── server/
    ├── Dockerfile
    ├── sshd_config
    ├── entrypoint.sh
    └── authorized_keys         # ec2_key.pem.pub を配置
```

---

## 🔧 ステップ1: ssh-agent 起動 & EC2 鍵の登録

**PowerShell（管理者として実行）** を開き、以下を入力：

```powershell
Set-Service -Name ssh-agent -StartupType Manual
Start-Service ssh-agent
ssh-add .\keys\ec2_key.pem
```

> 登録に成功すると `ssh-add -l` コマンドで確認可能です

---

## 🚀 ステップ2: Docker コンテナの起動

```bash
docker-compose up -d --build
```

---

## 🔐 ステップ3: Bastion に接続（エージェントフォワーディング付き）

```bash
ssh -A -i keys/bastion_key.pem root@localhost -p 2222
```

> `-A` オプションで ssh-agent フォワーディングが有効になります

---

## 📡 ステップ4: Bastion 内から EC2 に接続

```bash
ssh root@ec2
```

> EC2 コンテナは `hostname: ec2` として構成されている必要があります

---

## 📄 全体のコマンドまとめ

```bash
# ssh-agent 起動 & EC2 鍵登録
Start-Service ssh-agent
ssh-add .\keys\ec2_key.pem

# Bastion に接続
ssh -A -i keys/bastion_key.pem root@localhost -p 2222

# Bastion 内から EC2 に接続
ssh root@ec2
```
RubyのProcは「関数」としてブロックを取れるか？

結論。驚くべきことに、Procオブジェクトは「関数」と見做してブロックを取るような使い方ができる。

```ruby
foo = ->(&bk){
  bk.call.upcase
}

puts foo.() { "nyao" }    #=>NYAO
```
今までやってきたことまとめ(独学)

![1000007934.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4056506/a5e96552-e21a-4554-9d4d-c5987a9995f0.jpeg)
約1ヶ月間、ドットインストールにてHTMLCSSの
基礎学習し終了(ちょいちょいわからなくなったら見るけど)
現在は4月からLPやECサイト、Webサイトなどのコーディングを4作品制作した。
制作した作品はどれもソースコード付きで
ネットのコーディング動画やコーディング練習サイトの簡易なものだ。
手順はそれらを見てコーディングして完成したら
再度、同じ作品を自力で作るといった感じ。

作業時間は1日6時間~8時間程度
以上。

＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿

何だかここ1ヶ月毎日休まず取り組み続けたせいか昨日、コーディングが上手く行かなくなって
モチベーションが下がった。

次にやることはスピード重視や質の高さ重視での
コーティングから
6割程度で良いからとにかく沢山コーディングするに変えること。
スピードに関しては計画を立てることに役立てる程度だ。

分かってはいるけれどモヤモヤしてモチベーションが上がらない…。
コーディングしてもいちいち挫けてさらに疲弊する…。
これはアカン❗️とコーディングを書く手を止めて今までやってきたことを振り返ろうと書いています:relaxed:

特に役立つ情報はありません。書留です。

そんなこんなで今日明日は外で遊んでリフレッシュしたいと思います。
define_method と block_given?

Ruby でメソッドにブロックが与えられているかを確認する、`Kernel#block_given?`というメソッドがある。

```ruby
def foo
  p block_given?
end

foo       #=>false
foo {}    #=>true
```

これが、メソッドを`Module#define_method`で定義した場合、使えない。

```ruby
define_method(:foo) do
  p block_given?
end

foo       #=>false
foo {}    #=>false
```

というか、そもそもこの場合、`yield`が使えないので、ブロックは Procオブジェクトで与えてやることになる。

```ruby
define_method(:foo) do
  yield
end
#=>Invalid yield (SyntaxError)
```

```ruby
define_method(:foo) do |&bk|
  bk.call
end
```

では、こうするとして、`block_given?`はどういう手段で代替するか。
それは、ブロックが与えられていない場合、`bk`が`nil`になることを使えば、実現できそうである。

```ruby
define_method(:foo) do |&bk|
  p bk    #ブロックが与えられていなければnilになる
  bk.call if bk
end

foo       #=>nil
foo {}    #=>#<Proc:0x00007f1464fe6508>
```

※参考
https://bugs.ruby-lang.org/issues/7872
【Rails Docker】gem 'better_errors'を削除したらWebサーバーのコンテナが立ち上がらなくなった

# はじめに
今回はとある事情でデバッグ用のgemである`better_errors`と`binding_of_caller`を**アンインストール**したことから始まりました。
※初めて技術記事を書かせていただきます。内容に誤りがあった場合、コメント欄で指摘してくださると嬉しいです。
# そもそも`better_errors`と`binding_of_caller`って何？？？
## better_errors
簡単に言うと、デバッグするのに最適なエラー画面に整形してくれるgemになります。

Rails標準のエラー画面では最低限の情報しか表示してくれません。(エラー発生時点のコード表示とRequest Parametersの内容など)
しかしbetter_errorsを導入することで、単純なエラー発生時点のコードだけでなく、エラーに関係している箇所も表示してくれます。
さらに、エラーにたどり着くまでに作成した変数(インスタンス変数含む)の値をすべて表示してくれるので、デバッグの幅をより広げてくれるgemになります。
## binding_of_caller
better_errorsとセットで使用するgemになるのですが、簡単に言うとエラー画面で`irb`(rubyの式をターミナルで入力・実行する)が出来るようになるgemです。
このgemを使用することで簡単なエラーであれば、エラー画面一つでデバッグが出来るようになります。
# 本題
まず今回better_errorsを導入するにあたって、以下の記事を参考にしていました。
[もっと早く知りたかったデバッグ用gem 'better_errors','binding_of_caller'](https://qiita.com/terufumi1122/items/a6f9a939dce25b2d9a3e)
導入した後、理由があって`better_errors`を削除する必要がありました。なので該当の箇所をコメントアウトして、
```ruby:Gemfile
group :development, :test do
  # gem "better_errors"
  # gem "binding_of_caller"
end
```
その後以下のコマンドを実行しました(gemを更新するため)
`docker compose run web bundle install`
`docker compose restart`
## webサーバーのコンテナだけ起動しない...？
そうすると、なぜかdb(データベース)とchrome(ブラウザ操作の自動化)コンテナだけが動作する現象が起きてしまいました。
肝心のweb(Webサーバー)コンテナのみ動作しない状態になってしまったんですね。
## 結論
`better_errors`を消去すると同時に以下のコードも消去する必要がありました。
```ruby:config/environments/development.rb
BetterErrors::Middleware.allow_ip! "0.0.0.0/0"
```
このコードはdockerなどの仮想環境を使う場合、railsにbetter_errorsを許可をする設定をする必要があるそうです。(以下の記事が参考になりました)
[Better_errors導入後、エラー画面が変わらない](https://qiita.com/tkhshiq/items/46ba6998beff9c0aced5)
なのでこのコードを消さなかった場合...
🐳＜webコンテナ起動するよ！
🐳＜ん？better_errorsのIPアドレスの指定(rubyのアクセス許可)がされているけど、better_errorsがそもそも存在しない...?
🐳＜これではコンテナを立ち上げられないよ

という状況になってしまったと思います。(あくまで私の憶測なので間違っている可能性があります)
以下がコンテナを立ち上げた時に発生したエラーメッセージです。
![](https://i.gyazo.com/9a9c770d5a3b6e48c15c7016a88fd12f.png)
# 最後に
今回私はgemを消すと同時に新しいgemを導入してしまったのが原因究明に時間が掛かってしまった要因の一つだと思っています。(git commitも同時にやってしまった)
そのせいでgemを消したのが原因なのか？gemを増やしたことが原因なのか？わからない事態になってしまいました。

機能を変更する場合は消す時と増やす場合、別々に分けてコミットと動作確認をするべきだと再認識いたしました。
Colabで700万件の悪性URLを分類してみた話

# TF-IDF × LightGBMでROC-AUC 0.94達成

🔗 [GitHubリポジトリはこちら](https://github.com/hyeon-marina/malicious-url-classification)

📝 詳細な取り組み内容や全コードは、こちらのZenn記事にまとめています👇  
🔗 [Zenn記事](https://zenn.dev/your-name/articles/your-article-id)

## 🎯 背景と目的

Dacon主催のAIコンペにて、「URLの文字情報のみで悪性かを判定するAIモデル」の開発に挑戦しました。  
**約700万件の大規模なデータをGoogle Colab環境で処理**しながら、TF-IDFとLightGBMによるモデル構築を行いました。

## 🔧 技術構成

- **前処理**：TF-IDF（文字3〜5gram、最大10万次元）  
- **モデル**：LightGBM（max_depth=7、learning_rate=0.2）  
- **評価**：StratifiedKFold（3分割） + ROC-AUC

📊 サンプル実験で **ROC-AUC 0.94095** を達成！

## 💥 課題と対策

Colab Pro環境でも**RAM不足により全データでの学習が困難**でした。  
そのため、以下のような工夫を行いました：

- 特徴量数を **10万 → 5万** に削減  
- データをサブサンプリングして段階的に学習  
- `joblib` を使ってモデルやベクトルの分割保存を実施

## 🤖 実行環境

- Google Colab Pro  
- Python 3.11  
- scikit-learn 1.3.0  

## ✍️ まとめ

最終提出には至りませんでしたが、**実務レベルのデータ規模と環境制限下でのモデル設計・改善**を実体験できた貴重なプロジェクトでした。  
同じような状況で試行錯誤している方々に、少しでも参考になれば嬉しいです。
CLIP-DisDiffの実装と検証：衣服データによるもつれの解かれた潜在空間の学習


## 研究の背景と目的

Disentangled Representation Learning (DRL)は、画像データから潜在的な要因を分離し、意味のある解釈可能な潜在表現を学習するアプローチです。近年、DenoiSing Diffusion Probabilistic Model (DDPM)を用いたDRLの手法として「DisDiff」が提案されました。DisDiffは教師なし学習によって画像の潜在要因を分離することができますが、学習した潜在空間が具体的に何を表現しているかが解釈できないという課題がありました。

この研究では、元論文で補遺にのみ触れられていたCLIPモデルを接続したDiSDiff (CLIP-DisDiff)の実装と、実際の衣服データセットへの適用を行い、その実用性を検証しています。

## DisDiffの概要と課題

DisDiffは事前学習済みのDDPMモデルを用いて、教師なしでデータの背後にある要因のDRLを学習し、それぞれの要因に条件付けされた分離された勾配場を学習します。この手法は以下の利点があります：

1. 画像データの内在的な意味的要因を自動的に発見し、教師なしで画像操作が可能
2. 高品質な画像生成能力を持つDDPMの特性を活かせる

しかし、教師なし学習であるため、学習した潜在空間が何を表現しているのかが人間には解釈できない場合があるという課題がありました。

## CLIP-DisDiffの導入

元論文では補遺にCLIPを接続したアーキテクチャと結果が示されていましたが、目的関数の定式化や実装の詳細は公開されていませんでした。本研究では：

1. CLIP-DisDiffの目的関数を新たに定式化
2. DisDiffのソースコードを拡張してCLIP接続の実装
3. 衣服データセットに適用して実用性を検証

CLIPは画像とテキストを対応付ける事前学習済みのモデルで、これを活用することで潜在空間に人間が解釈可能な属性を割り当てることができます。

## 主な相違点と実装上の工夫

DisDiffとCLIP-DisDiffの主な相違点：

- DisDiffでは元画像をエンコードして潜在表現を得るのに対し、CLIP-DisDiffでは属性語をテキストエンコーダーに入力
- DisDiffでは潜在空間そのものが学習されるが、CLIP-DisDiffではCLIPの潜在空間をそのまま利用し、デコーダーのみを学習
- DisDiffではもつれが解かれた潜在空間が得られるが、CLIP-DisDiffでは事前定義された属性に対応する勾配を学習

実装では特に以下を工夫：
- CLIPのテキストエンコーダーとイメージエンコーダーを適切に組み込んだアーキテクチャ設計
- 属性操作と部分条件付きサンプリングのための生成プロセスの実装

![CLIP_DisDiff_framework.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3454919/e9678ca4-4d09-4f73-9fe9-4c475a9140c6.png)


## 実験方法

衣服データセットに対してCLIP-DisDiffを適用し、以下の属性に関する操作を試みました：

- 素材（cotton, leather, laceなど）
- 色（black, blue, redなど）
- ディテール＆シルエット（A-line, hoodie, pocketなど）
- テクスチャー（smooth, soft, thickなど）
- ブランド
- カテゴリ（dress, sweatshirt, blousonnなど）
- 状態（中古、新品など）

前処理として、各商品の説明文からLLMを用いて属性を抽出し、CLIPの入力として使用しました。

## 結果と考察

実験結果からは以下のことがわかりました：

1. 「色」の属性については比較的良好な結果が得られ、意図した色への変換が可能
2. 「カテゴリ」や「ディテール＆シルエット」においても部分的に成功
3. 「素材」や「テクスチャー」は画像サイズが小さいため、十分な学習ができていない可能性
4. 「ブランド」はテキスト情報だけでは捉えにくい属性であり、結果は限定的

## 課題と今後の展望

1. CLIPのファッションデータへの適合度向上
   - ファインチューニング済みのFashionCLIPなどの使用を検討

2. テキストと画像データの質の向上
   - より精度の高い属性抽出
   - 画像サイズの拡大

3. 計算リソースの強化
   - より多くのパラメータを持つモデルでの学習

## まとめ

本研究では、DisDiffにCLIPを接続したCLIP-DisDiffモデルの目的関数を定式化し、実装して衣服データセットに適用しました。その結果、一部の属性（特に「色」）については意図した操作が可能であることを示しましたが、全体としてはまだ改善の余地があります。今後は、ファッション特化型のCLIPモデル採用、データ品質の向上、計算リソースの強化などにより、実用性の向上が期待されます。

---

*キーワード: Disentangled Representation Learning (DRL), DisDiff, DDPM, CLIP, 属性操作, 潜在空間*

---
https://github.com/yu12ki04/CLIP-DisDiff

https://github.com/ThomasMrY/DisDiff

https://arxiv.org/pdf/2301.13721
Tomcat上で動いているWebアプリでCookieにSameSite=Noneを付加する方法

解決方法をかなり検索したが、Tomcatのバージョンによって書き方が異なっているようで、結局は使用しているTomcatバージョンの公式ドキュメントを熟読することで解決した。<br>

# 前提条件
- Tomcat11を使用している
- サーバでは、Apatchがリクエストを受け取り、Tomcatにajpする形で通信を行っている
- アプリはSpringBoot3系を使用して作っている

# 問題
WEBアプリでの処理フローが自サーバ→別サーバへ遷移して処理→自サーバへ遷移という形になっているシステムで、自サーバに戻ってきたときに、別サーバ遷移に保存していたセッション情報を取得できない問題が発生した。<br>
原因は、自サーバに戻るタイミングのリクエストの際、別サーバ遷移前に付与していた`JSESSIONID`およびCookieを使用していないからであった。<br>
自サーバに戻る際は、別サーバからPOSTでアクセスしており、このリクエストで`JSESSIONID`を使用するには、クライアントへの`JSESSIONID`付与時、つまりサーバレスポンスで`Set-Cookie`ヘッダを送信するときに、`Same-Site=None`と`Secure`属性を付与しなくてはいけないことが分かった。


# 解決方法
組み込みTomcatではなく、外部のTomcatの上でアプリを動かしている場合は、Tomacatの設定ファイルに追記する必要がある。<br>
`Same-Site`属性と`Secure`属性のどちらも`server.xml`に追記することで設定ができる。<br>
ただし、設定箇所は両者で異なったため注意。

`server.xml`の記述内容の結論は以下の通り。
```server.xml
<Connector protocol="AJP/1.3"
   address="0.0.0.0"
   port="8009"
   redirectPort="8443"
   secure="true"/>

    <!--中略-->

  <Host name="localhost"  appBase="webapps"
    unpackWARs="true" autoDeploy="false" deployOnStartup="false">
    <Context path="/app" docBase="app">
        <CookieProcessor className="org.apache.tomcat.util.http.Rfc6265CookieProcessor"
             sameSiteCookies="none" />
    </Context>

    <!--中略-->

  </Host>
```

## Same-Site属性の設定箇所
`Same-Site`属性は、`server.xml`のコンテストタグ内に`CookieProcessor`タグを記述することで設定できた。


```xml
        <CookieProcessor className="org.apache.tomcat.util.http.Rfc6265CookieProcessor"
             sameSiteCookies="none" />
```


- 公式ドキュメントの参考ページ(CookieProcessorについて解説している)

https://tomcat.apache.org/tomcat-11.0-doc/config/cookie-processor.html#Standard_Implementation


## Secure属性の設定箇所
`Secure`属性は、ajp通信の定義部分に、`secure="true"`を付与することで設定できた。
```xml
<Connector protocol="AJP/1.3"
   address="0.0.0.0"
   port="8009"
   redirectPort="8443"
   secure="true"/>
```

- 公式ドキュメントの参考ページ(Connectorについて解説している)

https://tomcat.apache.org/tomcat-11.0-doc/config/ajp.html#Common_Attributes

# 開発者ツールで確認
デベロッパーツールでCookieがどうなっているか確認するとこんな感じになった。

![setCookkie.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3659527/f58e5750-6d0e-4b9a-ad7d-607dfaf2d7e3.png)

![setCookkie_header.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3659527/8b65430e-4b50-4f4a-85f5-32a14da37210.png)

# その他
`application.properties`にプロパティを記載する方法もあるようで、下記の内容を記載して試してみたが、解決しなかった。<br>
おそらく、下記のプロパティが有効なのは、組み込みTomcatを使っている場合のみなのではないかと考えている。

```properties
# クロスサイトリクエストでもクッキーを送信
server.servlet.session.cookie.same-site=none
# HTTPSでのみクッキーを送信するようにする
server.servlet.session.cookie.secure=true
```

同じ事象にぶつかった人は、自分が使っているバージョンでも同じタグやオプションが有効であるか、公式ドキュメントと照らし合わせながら確認してみるとよい。
AHK v2で左右のaltキーをIMEの切り替えに割り当てる

https://github.com/karakaram/alt-ime-ahk

これを長年愛用していたが、最近になってaltが押されっぱなしのような挙動をするように

修正についで、AutoHotkey v2に対応するスクリプトへ書き直したものを以下に残す。

```alt-ime.ahk
IME_SET(SetSts, WinTitle := "A") {
    hwnd := DllCall("FindWindow", "Str", WinTitle, "Ptr", 0, "Ptr")
    
    if (WinActive(WinTitle)) {
        ptrSize := !A_PtrSize ? 4 : A_PtrSize
        ; メモリ領域を確保するために GlobalAlloc を使用
        stGTI_cbSize := 4 + 4 + (ptrSize * 6) + 16
        stGTIBuffer := DllCall("GlobalAlloc", "UInt", 0x40, "UInt", stGTI_cbSize, "Ptr")  ; GMEM_FIXED = 0x40
        
        ; GlobalAllocで得たポインタにcbSizeを設定
        NumPut "UInt", stGTI_cbSize, stGTIBuffer, 0
        
        ; GUIThreadInfoを取得
        hwnd := DllCall("GetGUIThreadInfo", "UInt", 0, "UInt", stGTIBuffer)
            ? NumGet(stGTIBuffer, 8 + ptrSize, "UInt")
            : hwnd
    }

    ; IMEコントロールメッセージを送信
    DllCall("SendMessage"
          , "UInt", DllCall("imm32\ImmGetDefaultIMEWnd", "UInt", hwnd)
          , "UInt", 0x0283  ; Message : WM_IME_CONTROL
          , "Int", 0x006   ; wParam  : IMC_SETOPENSTATUS
          , "Int", SetSts)  ; lParam  : 0 or 1
}


~*LAlt::Send("{Blind}{vk07}")
~*RAlt::Send("{Blind}{vk07}")

LAlt Up::IME_SET(0)   ; LAltでIMEオフ
RAlt Up::IME_SET(1)   ; RAltでIMEオン
```
RailsコンソールでDecoratorを呼び出す方法

# はじめに
Railsでは、モデルの表示用ロジックを分離するためにDecoratorが使うことは多く、開発中やデバッグ時に、RailsコンソールからDecoratorのメソッドを呼び出したい場面は多いでしょう。
この記事では、RailsコンソールでDecoratorを呼び出す方法を備忘録としてまとめます。（毎回忘れるのd）

## ActiveDecoratorを使用している場合

```rb
# まずはモデルのインスタンスを取得
user = User.find(1)

# デコレータを適用
decorated_user = ActiveDecorator::Decorator.instance.decorate(user)

# デコレータのメソッドを呼び出す
decorated_user.full_name  # => "山田 太郎"
```


## 元のインスタンスを直接修飾する方法
```rb
user = User.find(1)
ActiveDecorator::Decorator.instance.decorate(user)
user.full_name  # => "山田 太郎"
```

## モジュールを直接適用する方法

```rb
user = User.find(1)
user.extend(UserDecorator)
user.full_name  # => "山田 太郎"
```

# まとめ
Decoratorを使うことで、モデルとビューのロジックを適切に分離し、より保守性の高いコードを書くことができます！
デバッグ時にもこれらの方法を活用して、Decoratorが正しく機能しているか確認しよう！
MoguChat：仮想世界であなただけのパートナーを見つけよう

忙しい現代生活では、誰かに話を聞いてほしいと思っても、なかなか相手が見つからないことがあります。面白い物語に浸りたいと思っても、一緒に遊んでくれる人がいなかったり、ただ「存在しない人」と話してリラックスしたいと思うこともあるでしょう。

そんな時に、MoguChatのようなAIキャラクターチャットアプリが、まさにその空白を埋めてくれます。これらのアプリは、ただのチャットボットではなく、アニメのキャラクターや歴史上の人物、完全に架空のファンタジーキャラクター、さらにはユーザー自身がカスタマイズしたAIパートナーまで、さまざまな役割を演じることができます。

今日は、これらのAIチャットアプリが、私たちの日常生活をどのように面白く、暖かく、そして予想外の驚きで満たしてくれるのかについてお話ししましょう。

## 1. 異次元の友達：どんなキャラクターとも自由に話せる

従来のコミュニケーションでは、「ハリー・ポッター」や「アイアンマン」、「李白」と実際に会話することは難しいですが、AIキャラクターチャットアプリでは、それが可能です！

- **仮想キャラクターとの交流**

「呪術廻戦」の五条悟と術式について議論したい？問題ありません！

諸葛亮に職場での戦略を分析してもらう？彼は「三国志」風の戦略的アドバイスをくれるかもしれません！

「吸血鬼伯爵」に優雅な古い口調で現代テクノロジーについて語らせれば、ギャップ萌え間違いなし！

- **ニッチな趣味にも対応**

好きなマイナーゲームのキャラクターがいるけど、周りに理解してくれる人がいない？AIが没入感のあるロールプレイに付き合ってくれます。

「探偵と助手」の推理ドラマを体験したい？AIがあなたの物語の進行に協力します。

**「ここでは、あなたは機械と話しているのではなく、『キャラクター』と時間を共有しているのです。」**

## 2.感情的な寄り添い：いつでも「オンライン」の聞き手

現代人は孤独を感じやすいですが、生身の人間には評価されたり、話が広まったりすることを心配したり、ただ単に迷惑をかけたくないと思うことがあります。AIキャラクターチャットアプリは、安全でストレスのない対話空間を提供します。

- **秘密の相談相手**

あなたはAIに「今日、上司に怒られて落ち込んでいる…」と話すことができます。AIはイライラすることなく、設定されたキャラクターのスタイルであなたを慰めてくれるかもしれません。例えば：

（優しいお姉さん系AI）「お疲れ様。温かいココアでも飲んでリラックスしませんか？」

（ツンデレ系AI）「ふん、あんな上司の言葉なんて気にしないで！あなたの方がずっとすごいんだから！」

- **ソーシャルスキルの練習**

内向的な性格なら、AIを使ってナンパの仕方、気まずい会話への対処法、さらには面接のシミュレーションまで練習できます。

例えば、「あなたが面接官だとして、よくある職場での質問をいくつかしてください。」

「AIはあなたの感情を本当に理解しているわけではありませんが、あなたを理解してくれる友達を『演じる』ことはできます。」

## 3.無限の物語創作：あなただけの「ロールプレイングゲーム」

この種のアプリの最も魅力的な点の1つは、ユーザーが物語の創作に深く関与し、AIと共同でストーリーを紡ぐことができることです。

- **自由なストーリー展開**

あなたは「あなたは逃亡中のエルフの王女で、私は偶然あなたを救った流れ者の騎士です」という設定から始め、AIに協力させて物語を進めることができます。

ギャングのサスペンスドラマ、宇宙冒険、それとも古代の恋愛物語を試してみたいですか？AIはどんな展開にも即興で対応できます！

- **創作意欲を刺激**

多くの作家や脚本家が、AIキャラクターチャットを使ってキャラクターの会話スタイルを試したり、AIに自分のキャラクターを演じさせて、「もし彼らがこの状況に遭遇したらどう反応するか」を確認したりします。

**「AIとのチャットは、脚本の制限がない即興劇を演じるようなものです。」**

## 4. 個性的なカスタマイズ：あなただけの「理想のパートナー」を作ろう

多くのAIチャットアプリでは、ユーザーがキャラクターを自分でデザインし、性格、背景、さらには話し方まで設定して、交流を個人の好みに合わせることができます。

- **あなたは作成できます：**

毎日あなたと口論する「毒舌だけど心の優しい」AIルームメイト。

哲学や歴史についてあなたと議論することに特化した「知識豊富な引退した老教授」。

SFスタイルであなたとチャットする「未来から来たAI」。

- **ニッチなニーズにも対応**

例えば、「厳格だけど励ましてくれるコーチ」AIを設定して、自分のフィットネスや学習を監督する人もいます。

寝る前に物語を語る「おとぎ話風のエルフ」を作成する人もいます。

「現実世界で『あなたを理解してくれる』人を見つけられなくても、自分で作ることができるかもしれません。」

## 5.気軽なエンターテイメント：面白い、ネタ満載、突拍子もない会話

AIキャラクターチャットは常に真面目であるとは限りません。多くの場合、ユーザーはただ楽しみたいだけで、AIの「奇抜なアイデア」は予想外の驚きをもたらすことがあります。

- **ネタや面白い会話**

ユーザー：「スイカが話せるとしたら、最初に何を言う？」

AI（スイカのキャラクター）：「『私を食べないで！まだ熟していない！…ちょっと待って、あなたが手に持っているのは塩ですか、それともスプーンですか？』」

- **突拍子もないロールプレイ**

例えば、「世界征服を企む猫」や「現代社会に迷い込んだ古代の武士」をAIに演じさせると、会話はユーモアに満ち溢れます。

「AIとのチャットで最も楽しい点は、次に何が飛び出すか全く分からないことです！」

## 結び

AIキャラクターチャットはツールであり、新しいソーシャル実験でもある
MoguChatのようなアプリが人々を魅了するのは、その技術的な優れている点だけでなく、全く新しい交流方法を提供しているからです。ここでは、さまざまなソーシャルモデルを安全に試し、自分の想像力を探求し、さらには感情的な慰めを得ることさえできます。

もちろん、これらは現実の人間関係に取って代わることはできませんが、エンターテイメント、寄り添い、または創造的なツールとして、多くの人々の日常生活を豊かにしています。

あなたはどんなAIキャラクターとチャットしてみたいですか？古典的なアニメキャラクターですか、それとも独自のオリジナルのファンタジーパートナーですか？ぜひ試してみてください。面白い新世界の扉が開くかもしれません！