OmniAICreator/Qiita-1.07M huggingface dataset:
【Windows】Unity6の環境構築が全くうまくいかなかった話

## はじめに
　先日Unityをインストールしようと思ったら、全然うまく行かず丸一日取られたので、他に犠牲者が出ないように記事にしたいと思います（Windows向け）

:::note warn
　この記事は、あくまでも筆者がうまく行った方法を、一例として紹介するものです。うまく行かなかった原因の検証などは行っていません。
　また、ネット上にある他の解説記事について、筆者の場合は全くと言っていいほど手順通りにいきませんでしたが、その内容が嘘だと思っているわけではないです。
:::

## それは無理だ、待つな
　いきなり強い言葉を使って申し訳ありませんが、あえて言わせてもらいます「待つな」と。もちろん5分とか10分程度でやめろと言っているわけではなく、長時間放置してダメなら、それは大概の場合にはダメだという事が言いたいのです。目安としては30分くらいでしょうか。
 
 　この記事にたどり着いた人の多くは、今まさにインストールがうまくいっていない人だと思います。時間がかかる場合もあるから待ってみろ、という意見を目にしませんでしたか？残念ながら、今待っているその方法では無理です。実際、筆者は出かけている間に６時間放置しましたが駄目でした。
  
 　この記事の内容についてもそうです。筆者はこの方法で行けましたが、万人がこの方法で行けるか保証はできません。もしもこれから説明するもので、上手くいかない場面があれば、ブラウザバックして違う方法を探してください。

:::note
方法の一つとして、「待つ」というのを試すのは当然ありです。何でもかんでも待つのではなく、どっちみちしばらく触れないな～というタイミングで試してみるのが、精神衛生的にも良いと思います。
:::

## 手順１：UnityHubをインストールする
ありがたいことに、筆者の場合、この過程は何の問題もなくパスできました。

https://unity.com/ja/download

このページからインストーラーがダウンロードできるので、特に設定は弄らずに、インストーラーの指示通りに進めてください。

### 日本語化

![スクリーンショット 2025-01-17 135600.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3922095/659081c7-1ddb-b8c1-df8d-eebfc64de57d.png)

歯車を押すとApperanceというのがあるので、そこから日本語化や色の変更もスムーズにできました

## 手順２：Unityのエディタをインストールする
　ココが問題です。本来はUnityHubからインストールできるはずなのですが、一向にインストールが進みませんでした。

![スクリーンショット 2025-01-17 135600.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3922095/659081c7-1ddb-b8c1-df8d-eebfc64de57d.png)

　さらに問題だったのが、ダウンロードだけは完了するんですよね。一回やるごとに7GBずつ容量が減っていくのですが、どこにあるかも分からず、とても焦りました。
 
　ここで詰まって検索した人は、おそらく容量が圧迫されていると思うので、以下の方法を試してみてください。
 
　画像の歯車を押すと環境設定というのが出てくるので、インストールという項目からダウンロード場所のパスを確認しましょう。そのディレクトリから`unity-hub`で始まるものを削除したら対処できます。（ゴミ箱からも消しましょう）

### インストールできた方法 
Unityエディタを個別にインストールできるページがあるので、そちらからインストールしましょう。

https://unity.com/ja/releases/editor/whats-new/6000.0.34#installs

　このページからインストーラーがダウンロードできるのでWindowsを選んでダウンロードしましょう。こちらもインストーラの指示通りに進めていけば、インストールができました。

　上手くいっていれば`Local Disk`の`Program Files`の直下に`Unity 6000.0.34f1`というフォルダがあると思います。その中の`Editer`を開いて、`Unity.exe`というのを探してみてください。見つけたら、そこから実行してみていいと思います。筆者は何となく実行してみたら、勝手にUnityHubとも連携してくれていました。インストールした時点なのか、実行した時点なのかトリガーが分かりませんが、とりあえずこの流れでインストールできることを確認しました。

## 最後に
　ここまで読んで下さりありがとうございました。この方法でインストールができた人は、プロジェクトから新しいプロジェクトを作って、Unityを始められます。最初はサンプルを使ってみるのが良さげな気がします。Unityについては筆者も未だよくわかっていませんが、メダルゲームを作ったりして遊んでいます。
未経験エンジニアがFlutterを始めて8ヶ月… 次の案件ではFlutter使えるの、私だけ!? 参画前にやるべきことを調べてみた


## **はじめに**

こんにちは、未経験エンジニア1年目です！

4月から未経験でエンジニアになって、研修を2ヶ月やった後にFlutterの案件に入って約8ヶ月。

そしたら次の案件で **「Flutterできるの、私だけ」** という状況に…。

しかも **案件はまだ始動していない** ＝ **要件定義から関わる可能性大**。

**「え、私1人でやるの…？」**

**「要件定義って何すればいいの？」**

**「コードは書けるけど、プロジェクトの進め方とか全然分からない…」**

って感じで不安だったので、

「**案件参画前に何を準備すればいいのか？**」を **ひたすら調べてみた**。

---

## **1. 要件定義ってめちゃくちゃ大事らしい**

まず、調べてみて分かったのは、

**「要件定義で何を決めるかで、開発の進めやすさが全然違う」** ということ。

要件定義とは **「何を作るかを決めるフェーズ」** のこと。

ここを適当にすると、**「開発フェーズで仕様変更が連発して地獄を見る」** らしい。

そこで、**Flutterエンジニアとして最初に確認すべきこと** をリストアップしてみた👇

| 項目 | 事前に確認すること |
| --- | --- |
| **UIデザイン** | デザインツールはFigma？Flutter標準Widgetで作る？ |
| **APIの仕様** | REST？GraphQL？Firestore？認証はJWT？ |
| **状態管理** | Riverpod？Bloc？ |
| **データの保存** | ローカルDBはHive？SQLite？Firestore？ |
| **対応プラットフォーム** | iOS/Androidだけ？Webやタブレットも対応？ |
| **ネイティブ機能** | カメラ・通知・位置情報とか使う？ |

**開発が始まってから「仕様が曖昧です」ってなると辛いので、最初に確認すべきポイントを洗い出しておくのが大事とのこと**。

---

## **2. プロジェクトの技術スタックを確認しないと詰むらしい**

Flutterエンジニアが私1人 = **「技術選定を丸投げされる可能性がある」** ということ。

調べた感じ、**最初にこれを決めておくと後で楽になるらしい** 👇

:earth_asia: Flutterのバージョン（2.x？3.x？）

:earth_asia: **状態管理** → Riverpod？Bloc？Provider？

:earth_asia: **API通信** → Dio？http？GraphQL？

:earth_asia: **ローカルデータ管理** → Hive？SQLite？Firestore？

:earth_asia: **パッケージの選定** → 認証、課金、通知など

ここが曖昧なままだと、開発途中で「やっぱりこれに変えよう」ってなって**詰む** らしいので、

最初に「こういう方針でいいですか？」と確認しておくのが大事っぽい。

---

## **3. Flutterの基本を復習しないと詰むらしい**

「ちょっとFlutterのコードが書ける」レベルだと、

**実装フェーズに入ってから詰まるポイントが結構ある** らしい。

:earth_asia: **状態管理（Riverpod, Bloc）**

:earth_asia: **Navigator 2.0（ルーティング）**

:earth_asia: **非同期処理（async/await, Future, Stream）**

:earth_asia: **Dartの基礎（mixin, extension, typedef など）**

:earth_asia: **テスト（Unitテスト, Widgetテスト）**

「**ここを事前に勉強しといたほうがいい**」っていうのを見たので、

公式ドキュメントやQiita記事を読んで **サンプルコードを1つ書いてみる** くらいはやっておこうと思った。

---

## **4. プロジェクトのディレクトリ構成を事前に確認すべきらしい**

「いざ開発が始まったときに **「どこに何を置くの？」** ってなりがち」

っていう話を見たので、プロジェクトのディレクトリ構成もチェックしておくといいらしい。

**🔹 クリーンアーキテクチャ型**

```

lib/
 ├── presentation/  ← UI（Widget）
 ├── domain/        ← ビジネスロジック
 ├── data/          ← API, DB, Repository

```

**🔹 Feature分割型**

```

lib/
 ├── features/
 │   ├── home/
 │   │   ├── home_page.dart
 │   │   ├── home_view_model.dart
 │   │   ├── home_repository.dart
 
```

**事前に「どういう構成でやるか決まってますか？」って聞けるようにしておくのがいいとのこと**。

---

## **5. エラーの調査スキルがないと詰むらしい**

「Flutterはエラーにハマると抜け出せなくなることがある」

という話を見かけたので、**調査スキルを鍛えるのがめっちゃ大事っぽい**。

:earth_asia: **エラーメッセージをGoogle検索**（Stack Overflow, GitHub Issues）

:earth_asia: **Flutter公式フォーラム or Medium記事を読む**

:earth_asia: **試しに `print()` でデバッグしてみる**

英語で検索できると情報量が増えるらしいので、**英語の検索ワードも練習しておくのがいい** っぽい。

---

## **まとめ**

私みたいに **「Flutter経験8ヶ月で案件1人」** になったら、**これをやる！**

:pushpin: **要件定義に向けて、質問リストを作る**

:pushpin: **プロジェクトの技術スタックを確認する**

:pushpin: **Flutterの基礎を復習（状態管理・非同期処理・ルーティング）**

:pushpin: **エラーの調査スキルを鍛える（Google検索 & GitHub Issues）**

:pushpin: **チームとのコミュニケーション準備をする**

---

## **最後に**

「**私もまだやったことないけど、調べたらこうすればいいらしい！**」

実際に参画してみて、**「これはマジでやっといてよかった」** と思ったことがあれば、

また記事に追記しようと思う！:fire:

同じような状況の人、一緒に頑張りましょう :raised_hands:
Einstein Data Libraryでアップロードできない


+ [【ヘルプ】Agentforce データライブラリ](https://help.salesforce.com/s/articleView?id=ai.data_library_parent.htm&type=5)

>Agentforce機能にデータライブラリを割り当てることで、Gen AIの応答精度を向上させ、パーソナライズ機能を追加し、信頼性を高めることができます。Agentforceデータライブラリは、ナレッジ記事やフィールド、ファイルのアップロード情報をグラウンディングによってインデックス化し、AIエージェントがどの情報に基づいて応答すべきかを判断します。このインデックスにより、AIエージェントは組織の情報に対するLLM応答の精度を確保し、最適な結果を得ることができます。


# We couldn’t upload your file. Try again.

+ [File upload failing in Einstein Data Library!](https://trailhead.salesforce.com/trailblazer-community/feed/0D5KX00000KfOEz0AN)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/e58c42b0-bfbf-c93a-6871-13f7da6831da.png)

:::note
I opened a SF case this morning for the same issue while setting up client org. Case resolution: To upload the file in Einstein Data Library there must be at least one CRM Connection ( Setup -> Under Data Cloud, select Salesforce CRM) in active state. Once I had a Standard Connection active, I was able to uploaded PDF successfully. 

今朝、クライアント組織の設定中に同じ問題が発生したため、SF ケースを開きました。ケースの解決方法: Einstein データ ライブラリにファイルをアップロードするには、少なくとも 1 つの CRM 接続 ([設定] -> [データ クラウド] で[Salesforce CRM]を選択) がアクティブ状態である必要があります。標準接続をアクティブにすると、PDF を正常にアップロードできました。 
:::

+ [Trying to upload file Unable to upload PDF into Einstein Data Library. Error: We couldn’t upload your file. Try again.](https://trailhead.salesforce.com/trailblazer-community/feed/0D5KX00000KCu6n)

+ [Unable to upload PDF into Einstein Data Library. Error: We couldn’t upload your file. Try again.](https://trailhead.salesforce.com/trailblazer-community/feed/0D5KX00000KCtyY0AT)

+ [【未解決】Unable to Setup Einstein Data Library](https://trailhead.salesforce.com/trailblazer-community/feed/0D5KX00000J8Y4Q)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/98c01392-5b8c-d4e0-58ac-b5110916d41d.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/13415072-dbb1-bc7c-52bf-fa213724b065.png)

:::note
私の組織では、ケース管理とボットにのみニーズが集中していることを考慮して、Service Cloud バンドルのみをインストールしました。今回はエラーなしでデータ ライブラリを正常に保存できました。  


データ ライブラリを利用して Einstein ボット内で AI サマリー記事を生成すると、常に記事が見つからないというエラーがスローされるという問題が発生しています。一方、「すべてのナレッジ レコードとフィールド」オプションを使用すると、記事が生成されます。これは、Einstein データ ライブラリが適切に保存されていないことにまだ関連しているのではないかと考えています。「Agentforce デフォルト エージェントの使用」権限セットを追加しました。これで、すべての Copilot アクションがこれを活用するようになりました。  

したがって、ユースケースに応じて、不足している権限セットを確認する価値があります。 
:::


+ [Einstein Data Library - File Upload](https://trailhead.salesforce.com/trailblazer-community/feed/0D5KX00000J79Sa0AJ)

制限がある？

テキストまたは HTML ファイルの場合は最大 4 MB、PDF ファイルの場合は最大 100 MB までアップロードできます。

+ [アップロードするファイルを選択](https://help.salesforce.com/s/articleView?id=ai.data_library_file_upload.htm&type=5)
【🔰初心者向け】Python 資格取得していたんだった【資格】【備忘録】

## 対象者
- Pythonをはじめて触るかた
- お久しぶりのかた
- 資格GETTERなあなた
- 私……？


## 試験概要
https://cbt.odyssey-com.co.jp/pythonic-exam/python3basic.html

## 勉強方法
資格を取る ことが目標だったので
参考書を半分も読まないうちから
問題集をループしていました。
学習期間はひと月くらい。
昼休みや通勤中のスキマを全集中して
狂ったように問題を解いておりました……

https://www.pythonic-exam.com/exam/basic

## 当日のこと
有楽町のテストセンターにて受験。
地理が壊滅的な私は迷子になりました。
時間に余裕を持ってお出かけください……

## その他
試験前の糖分補給、結構効きます
羊羹をもぐもぐしておりました。

## 最後に
資格取得はあくまで案件獲得の「入口」に過ぎませんが
必ずやあなたの血となり《肉》となることでしょう。
Good Luck！

※個人の見解です！！！！世界はやさしい……
Sakana AIによる新手法「TAID」を用いた小規模日本語言語モデル「TinySwallow-1.5B」をMacBook(M2)で動かしてみた

[Supership](https://supership.jp/)の名畑です。[Dr.STONE](https://dr-stone.jp/)のアニメは好きで1期からずっと見続けています。ぜひ原作ラストや読切版までやってほしい。

## はじめに

2024年の4月に「[Sakana AIによる日本語基盤モデルEvoLLM-JPをMacBook(M2)で動かしてみた](https://qiita.com/nabata/items/3e402ba5cd0c538da518)」という記事を書きました。
[Sakana AI](https://sakana.ai/)による日本語基盤モデル**EvoLLM-JP**をMacBook(M2)で動かすという内容でした。

あれから一年足らず、再び**Sakana.AI**から興味深いリリースがされました。

>・高性能な大規模言語モデル（LLM）が持っている知識を、小規模な言語モデル（SLM）に効率的に転移するための新技術「TAID (Temporally Adaptive Interpolated Distillation)」を提案しました。
>・TAIDの実用性を示す試みとして、日本語SLM「TinySwallow-1.5B」を開発し、同規模帯では最高水準の日本語ベンチマークスコアを達成しています。TinySwallow-1.5Bを使えば、スマートフォンなどのエッジデバイスでオフラインで言語モデルを利用できます。
>・TAIDを提案した論文は、機械学習と人工知能分野におけるトップ国際会議であるICLRに採択されました。
>
> 参考：[新手法「TAID」を用いた小規模日本語言語モデル「TinySwallow-1.5B」の公開](https://sakana.ai/taid-jp/)

ということで今回はこの**TinySwallow-1.5B**を手元のMacBook(M2)で動かしてみます。

## 環境構築

まず前提としまして、Mac特有の内容は今回ありません。強いて言えば他OSだとPythonがデフォルトでインストールされていない等はあるかもしれませんが。

[README](https://github.com/SakanaAI/TinySwallow-ChatUI/blob/main/README.md)に書かれている通りの手順で進めます。

### リポジトリのclone

まずターミナル上で任意のフォルダに移動し、ファイル一式を持ってきます。

```shell-session
$ git clone https://github.com/SakanaAI/TinySwallow-ChatUI.git
```

そしてそのフォルダ内に移動します。

```shell-session
$ cd TinySwallow-ChatUI
```

### HTTPサーバを起動

```shell-session
$ python -m http.server 8000
```

**http://localhost:8000** を任意のブラウザで開きます。
するとChatUIが表示されます。

![2025_02_sakana_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/869934/30026375-ca98-610a-cd5f-e9e33fe9edaa.png)

### モデルのダウンロード

「**チャットを始める**」を押すとモデルのダウンロードが始まります。進行状況は以下スクリーンショットのように詳しく示されます。親切です。

![2025_02_sakana_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/869934/c837d2f2-cd7b-abf1-d5bb-b90c5b98062e.png)

容量としては非常に軽く1GBを切っているので、そこまでダウンロードに時間はかからないかと思います。

ちなみにですが、あらかじめモデルが含まれた[TinySwallow-ChatUI-Local](https://github.com/SakanaAI/TinySwallow-ChatUI-Local)もありますので、ブラウザ起動以降のネットワーク通信を避けたい方はこちらをご利用ください。

## 実行

ダウンロード完了後、過去記事「[Googleによる生成AIモデル「Gemma 2」をMacBook(M2)で動かしてみた](https://qiita.com/nabata/items/428e8882651e8bc677f1)」で試したのと同じプロンプト「**日本の都道府県を5つ教えてください**」を実行してみました。

回答は以下でした。

![2025_02_sakana_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/869934/8a9714eb-1359-e5f6-9b66-4a0035bf8e32.png)

バッチリです。

## 最後に

生成AIも用途に合わせて使いこなすようになってきた昨今、一つの選択肢として素晴らしいと感じました。

余談ですが[ブラウザ版](https://pub.sakana.ai/tinyswallow/)もございますので、環境を用意せずに試してみたい方はどうぞ。

## 宣伝

[SupershipのQiita Organization](https://qiita.com/organizations/supership-inc)を合わせてご覧いただけますと嬉しいです。他のメンバーの記事も多数あります。

Supershipではプロダクト開発やサービス開発に関わる方を絶賛募集しております。
興味がある方は[Supership株式会社 採用サイト](https://supership.jp/recruit/)よりご確認ください。
［ServiceNow］XMLについて（基礎知識）

※この記事はServiceNow初心者が学習用のために記載した記事です。内容について誤っている場合がございます。不足点などございましたらコメントいただけますと幸いです。


# XML (eXtensible Markup Language) とは
データを構造化して保存・交換するためのマークアップ言語

# 特徴
- タグ (<tag>～</tag>) を使ってデータを整理
- 人間にも機械にも読みやすい
- データの意味を持たせるためのルールを自由に定義できる

# 例
例 (ユーザー情報をXMLで表現)
```
<user>
    <name>山田太郎</name>
    <email>yamada@example.com</email>
    <age>30</age>
</user>
```

# 用途
データの保存・転送 (Web API, 設定ファイル, 更新セット など)
HTMLと異なり、見た目ではなくデータの構造を定義する

# XML・HTML・JSON の比較
| 項目       | XML                           | HTML                         | JSON                         |
|------------|------------------------------|------------------------------|------------------------------|
| 目的       | データの構造化・保存・交換    | ウェブページの表示           | データの軽量な保存・交換     |
| タグ       | 独自のタグを定義できる        | 定義済みのタグを使用         | タグなし (キーと値のペア)    |
| 可読性     | やや冗長だが意味が分かりやすい | 人間に読みやすい              | シンプルでコンパクト         |
| データ構造 | 階層構造を厳密に定義可能      | 文書の見た目を定義           | 配列・オブジェクトが得意     |
| 軽量性     | 冗長になりやすい              | 比較的軽量                   | 軽量でデータ転送向き         |
| 拡張性     | 高い (自由にタグを定義可能)   | 低い (決まったタグのみ使用)   | 高い (柔軟なデータ構造)      |
| 主な用途   | 設定ファイル、Web API、更新セット | ウェブサイトの構築            | Web API、データ通信、設定ファイル |


# ServiceNow における XML の使用用途
ServiceNow では XML を主にデータの保存・移行・設定の管理 に使用する

### 更新セット (Update Set) のエクスポート / インポート
- 更新セット (sys_update_set) は ServiceNow のカスタマイズを移行するための仕組みで、そのデータは XML 形式で保存される
- 更新セットを XML として保存すると、以下のような内容が含まれる

```
<update_set>
    <name>Incident_Customization</name>
    <updates>
        <update>
            <table>sys_script</table>
            <name>Auto Close Resolved Incidents</name>
            <action>update</action>
            <payload>
                <![CDATA[
                (function executeRule(current, previous) {
                    if (current.state == 'Resolved') {
                        current.close_notes = 'Closed automatically';
                    }
                })();
                ]]>
            </payload>
        </update>
    </updates>
</update_set>
```
### データのエクスポート / インポート
- ServiceNow では、任意のテーブルのレコードを XML 形式でエクスポート / インポート できる
- エクスポート手順
    - テーブルのリストビュー (incident.list など) で右クリック
    - Export > XML を選択
    - XML ファイルがダウンロードされる
- エクスポートされた XML の例 (インシデントデータ)
```
<incident>
    <sys_id>abc123</sys_id>
    <number>INC0012345</number>
    <short_description>System down</short_description>
    <priority>1</priority>
    <state>New</state>
</incident>
```
［ServiceNow］Customer Updates（sys_update_xml）について

※この記事はServiceNow初心者が学習用のために記載した記事です。内容について誤っている場合がございます。不足点などございましたらコメントいただけますと幸いです。

# Customer Updates（sys_update_xml）とは
- sys_update_xml テーブルは、ServiceNow 内の更新セット (Update Set) に関連する変更を管理するテーブル
- フォームやスクリプト、ビジネスルールなどのカスタマイズが加えられると、その変更がこのテーブルに記録される

### 補足：更新セットとは
- 更新セット(sys_update_set)は、カスタマイズや設定変更をグループ化し、別の環境に移行するためのコンテナ
- イメージ: フォルダ のようなもの
- 1つの更新セットには、複数の変更 (Customer Updates[sys_update_xml]) が含まれる
- 更新セット (sys_update_set) と Customer Updates (sys_update_xml) は、1対多の関係

# sys_update_xml の主な役割

| 項目 | 説明 |
|------|------|
| 変更の追跡 | 更新セットに含まれる各変更 (フォーム、スクリプト、ルールなど) を記録 |
| エクスポート / インポート | 更新セットをエクスポートすると、XML データとして出力 |
| リビジョン管理 | 変更履歴を保持し、特定のバージョンにロールバック可能 |
| 適用対象の特定 | どのカスタム要素がどの更新セットに含まれているかを確認 |


# Customer Updatesの主なフィールド
| フィールド名 | 説明 | 型 | 例 |
|------------|------|----|----|
| sys_id | レコードの一意識別子 | String (GUID) | 46d44f42db98a010bb07f84b5e9619c7 |
| name | 変更されたオブジェクトの名前 | String | Incident Form |
| update_set | 更新セットの sys_id | Reference (sys_update_set) | 2b3f8c52db98a010bb07f84b5e9618c2 |
| type | 更新の種類 (フォーム, スクリプトなど) | String | form, script_include, business_rule |
| payload | 変更されたデータの XML | XML | <xml>...</xml> |
| action | 変更の種類 (insert, update, delete) | String | update |
| application | 変更が属するアプリケーション | Reference (sys_application) | Global |
| sys_created_on | レコードの作成日時 | Date/Time | 2024-02-01 12:34:56 |
| sys_updated_on | 最終更新日時 | Date/Time | 2024-02-02 09:12:45 |

- payload
    - ここに関しては、別の記事で記載する

# sCustomer Updatesの活用例
- 更新セットのトラブルシューティング
    - ある変更が適用されない場合、sys_update_xml で記録された内容を確認し、適切に更新セットを管理
- 変更のロールバック
    - 変更前の XML データをエクスポートしておけば、問題が発生した際に元の状態に戻すことが可能
- 特定のカスタマイズを検索
    - 例えば、「特定のビジネスルールがどの更新セットで変更されたか」を特定できる

### payloadカラムでSys IDを検索する
レコードについて検索する際に使用したことがある
macOSシステム設定：ターミナルをIcebergでカスタマイズ

## はじめに
MacのデフォルトのターミナルをIcebergカラースキームでスタイリッシュにカスタマイズします。
たった1分で、おしゃれなターミナル環境を構築できます。

---

## Icebergのインストール

まず、Icebergのカラースキームをダウンロードします。

🔗 https://cocopon.github.io/iceberg.vim/#macosTerminalApp

---

## ターミナルに取り込む
1. **ターミナル**を開く
2. `設定` → `プロファイル`
3. `読み込む` を選択
4. ダウンロードした **Iceberg.terminal** を選択
5. `Iceberg` をクリックし、デフォルトに設定

これで、ターミナルのカラースキームがIcebergに変更されます。

---

## プロンプトをカスタマイズ

より見やすくするために、ターミナルのプロンプトをカスタマイズしましょう。
以下のコマンドで `~/.bash_profile` もしくは `~/.zprofile` を編集します。

`$ vi ~/.bash_profile`

```bash
PS1='\e[0;32m\h:\e[0;37m\W\e[0;31m\$ \e[0m'
alias ls='ls -G'
alias lsa='ls -aG'
alias lsl='ls -lG'
alias lsla='ls -laG'
```
## vim のカラースキーム

カラースキームをダウンロードします。

🔗 https://github.com/cocopon/iceberg.vim/blob/master/colors/iceberg.vim


```bash
mkdir -p ~/.vim/colors
cd ~/.vim/colors
mv ~/Downloads/iceberg.vim ~/.vim/colors/
```

以下のコマンドで `.vimrc` を編集します。

`$ vi .vimrc`
```
colorscheme iceberg
syntax on
```

設定を反映させるには、以下のコマンドを実行してください。
`$ source ~/.bash_profile`

これで、ターミナルがより快適でスタイリッシュになりました！
paizaラーニングレベルアップ問題集の「引き算・掛け算」をやってみた。

paizaラーニングレベルアップ問題集の[引き算・掛け算](https://paiza.jp/works/mondai/d_rank_level_up_problems/d_rank_level_up_problems__accompanied_by_stdin_2)をやってみました。
- - -
###### 問題
https://paiza.jp/works/mondai/d_rank_level_up_problems/d_rank_level_up_problems__accompanied_by_stdin_2
- - -
###### C
```c
#include <stdio.h>

int main() {
	int a, b;
	scanf("%d %d", &a, &b);
	int d = a - b;
	int p = a * b;
	printf("%d %d\n", d, p);
	return 0;
}
```
- - -
###### C++
```cpp
#include <iostream>
using namespace std;

int main() {
	int a, b;
	cin >> a >> b;
	int d = a - b;
	int p = a * b;
	cout << d << ' ' << p << endl;
	return 0;
}
```
- - -
###### C#
```cs
using System;

class Program
{
	public static void Main()
	{
		int[] ab = Array.ConvertAll(Console.ReadLine().Split(), int.Parse);
		int d = ab[0] - ab[1];
		int p = ab[0] * ab[1];
		Console.WriteLine(d + " " + p);
	}
}
```
- - -
###### Go
```go
package main
import "fmt"

func main() {
	var a, b int
	fmt.Scanf("%d %d", &a, &b)
	d := a - b
	p := a * b
	fmt.Printf("%d %d\n", d, p)
}
```
- - -
###### Java
```java
import java.util.*;

public class Main {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int a = sc.nextInt();
		int b = sc.nextInt();
		int d = a - b;
		int p = a * b;
		System.out.println(d + " " + p);
		sc.close();
	}
}
```
- - -
###### JavaScript
```js
const [a, b] = require("fs").readFileSync("/dev/stdin", "utf8").trim().split(' ').map(Number);
const [d, p] = [a - b, a * b];
console.log(d, p);
```
- - -
###### Kotlin
```kotlin
import java.util.*

fun main() {
	val sc = Scanner(System.`in`)
	val a = sc.nextInt()
	val b = sc.nextInt()
	val d = a - b
	val p = a * b
	println("" + d + " " + p)
	sc.close()
}
```
- - -
###### PHP
```php
<?php
	[$a, $b] = array_map("intval", explode(" ", trim(fgets(STDIN))));
	[$d, $p] = [$a - $b, $a * $b];
	echo "$d $p", PHP_EOL;
?>
```
- - -
###### Perl
```pl
my ($a, $b) = map { int($_) } split(' ', <STDIN>);
my ($d, $p) = ($a - $b, $a * $b);
print "$d $p$/";
```
- - -
###### Python3
```py
a, b = map(int, input().split())
d, p = a - b, a * b
print(d, p)
```
- - -
###### Ruby
```rb
a, b = gets.split.map(&:to_i)
d, p = a - b, a * b
print d, ' ', p, "\n"
```
- - -
###### Scala
```scala
import scala.io.StdIn._

object Main extends App{
	val Array(a, b) = readLine().split(' ').map(_.toInt)
	val Array(d, p) = Array(a - b, a * b)
	println("" + d + " " + p)
}
```
- - -
###### Swift
```swift
let ab = readLine()!.split(separator: " ").map { Int($0)! }
let d = ab[0] - ab[1]
let p = ab[0] * ab[1]
print(d, p)
```
[GitLab]メンバー一覧にダイレクトメンバーが表示されない問題

gitlabの小ネタなのですが、１時間ほど考え込んでしまった事象がありましたので、記事にしてみました。

:::note warn
本記事に登場するGitLabは本記事用に立ち上げた環境です。
そのため、ユーザ名および、プロジェクト名などは適当です。
:::

# 悩んだこと

直面した悩みとしては、「ダイレクトメンバーの1名が表示されない」というものです。

## 再現した画像と手順を以下に記載します。

GitLabのグループの保守作業。親グループ(parentGroupA)配下に属する、サブグループ（subGroupB）に存在しているダイレクトメンバーの削除を以下の手順で実施していました。

まず、subGroupBのアイコンを確認し、ダイレクトメンバの人数を見たところ3人存在することを確認しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/124955/47db0bd6-ec71-0137-816d-b6d365cf1f1b.png)

つづいて、subGroupBのメンバー一覧を見たところ。管理者の(私)を含めても２名しか表示されていませんでした。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/124955/07b71f7a-b9ee-9f04-87e1-c2727e392ac7.png)


冒頭に記載しました通り、3名いるはずのダイレクトメンバーが2名しか見えないという状態のご紹介でした。

# 結論（解決策）
グループのメンバーの一覧にあるフィルターを使い、`メンバーシップ = ダイレクト`を検索し、表示した結果、ダイレクトメンバーが３名分表示されました。これでメンバーを削除が無事にできました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/124955/371c17d5-c2b3-d9d9-bde0-e82e2d459157.png)


# 原因(事実からの推測)

調べたところ、`taro.yamada`は、
* サブグループ（subGroupB）でダイレクトに`taro.yamada`へ与えた権限
* 親グループ(parentGroupA)で`taro.yamada`へ与えた権限が継承された権限※

※ 通常、GitLabで親グループの権限はそのままサブグループへ継承される

後者である親グループとして与えた権限のほうが、<b>強権限</b>だった。
つまり、gitlabでは、メンバーに対して重複した権限付与がなされている場合は、強権限が優先されて表示されるようだ。

裏どりのために、試しに、親グループ(parentGroupA)で`taro.yamada`へ付与している権限を、サブグループ（subGroupB）でダイレクトに`taro.yamada`へ与えている権限より下げたところ、subGroupBのメンバー一覧で`taro.yamada`が表示された。(`メンバーシップ = ダイレクト`で絞り込みをせずとも表示された。)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/124955/6ad05366-166d-43a9-b806-abf464f2aae1.png)

# 推察
GitLabのマニュアルのsubgroupsを見ると、
https://docs.gitlab.com/ee/user/group/subgroups/
> You can’t give a user a role in a subgroup that is lower than the roles the user has in parent groups. To override a user’s role in a parent group, add the user to the subgroup again with a higher role. 

とあるので、上記のケースが生じていること自体がレアなんだと推察される。ただし、以下に記載したように、ダイレクトメンバー付与のオペレーション次第(権限の付与の順番次第)で本事象は起きるので注意。

## 権限付与途中でエラーになりはじかれるケース
１、親グループ(parentGroupA)で`taro.yamada`に強権限を付与（サブグループ（subGroupB）へ継承される）
２、サブグループ（subGroupB）で`taro.yamada`に弱権限を付与
→２の時点で`taro.yamada`には既に強い権限を持っているのでダイレクトメンバとして登録できない旨のエラーが生じる

## 権限付与途中でエラーにならず上記の`taro.yamada`になるケース
１、親グループ(parentGroupA)で`taro.yamada`に弱権限を付与（サブグループ（subGroupB）へ継承される）
２、サブグループ（subGroupB）で`taro.yamada`に強権限を付与
３、親グループ(parentGroupA)で`taro.yamada`に2で与えた権限よりもさらに高い権限を付与（サブグループ（subGroupB）へ継承される）
４、サブグループ（subGroupB）のメンバ一覧で`taro.yamada`がダイレクトメンバとして表示されなくなる

# 学び
ルールなしで無暗に権限やロールを直接付与するのはやめましょう。（数年前の私に送る言葉）

# 環境
GitLab CE v17.6.1
［ServiceNow］フローデザイナー（Flow Designer）について１ 概論

※この記事はServiceNow初心者が学習用のために記載した記事です。内容について誤っている場合がございます。不足点などございましたらコメントいただけますと幸いです。

# フローデザイナーとは
- ServiceNowのノーコード/ローコードの自動化ツール
- GUIベースでワークフローを作成・管理できる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3624279/1ad4eb94-3a72-1a18-21b6-86e5e0a512c8.png)
※https://qiita.com/phenyo_dikgomo/items/379f2fcbdb0b9556eea2さんの画像参照

# フローデザイナーの特徴
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3624279/f3716e97-7fd7-f9bd-b16d-04768fc2c525.png)


#### 1. トリガー (Trigger)  
フローを開始する条件を定義する要素
レコードの変更や時間指定、外部システムのイベントなどがトリガーとして使用可能

| トリガーの種類 | 説明 | 例 |
|--------------|------|----|
| レコードベース | テーブルのレコードが作成・更新・削除された時に発火 | インシデントの優先度が「重大」になったら通知 |
| スケジュールベース | 指定した日時や間隔でフローを実行 | 毎週月曜に定期レポートを送信 |
| 外部イベント | Webhook や Integration Hub からのイベント | Salesforce で新しいリードが作成されたら通知 |

詳細
- レコードベーストリガー
  - 特定のテーブル (incident, task など) を対象に設定  
  - 条件を追加し、特定のフィールド変更時のみ発火も可能  
- スケジュールベーストリガー  
  - 毎日、毎週、毎月 などのスケジュール実行  
  - 今後1年間の毎月1日 などの詳細なスケジュール設定も可能  
- 外部イベント  
  - Webhook で外部システムのイベントを受信  
  - Integration Hub で外部 API 呼び出し時に発火  

---  

#### 2. アクション (Action)  
トリガーの発生後に実行される処理を定義する要素
データの取得・変更、通知の送信、承認ワークフローの開始などが可能  

| アクションの種類 | 説明 | 例 |
|--------------|------|----|
| 標準アクション | レコードの作成・更新・削除、通知送信など | ユーザー作成時に歓迎メールを送る |
| カスタムアクション | スクリプトを使用して独自の処理を実行 | データを整形して別のフィールドに格納 |
| Integration Hub | 他のシステムと連携 | Slack に通知を送る、Salesforce にデータを登録 |

詳細  
- 標準アクション  
  - レコードを作成: 例) インシデント作成時に関連タスクも自動作成  
  - レコードを更新: 例) 承認済みのリクエストにステータスを自動設定  
  - 通知を送る: 例) 承認依頼メールをマネージャーに送信  
- カスタムアクション  
  - JavaScript を記述可能 (Script Action)  
  - 複雑なデータ処理や条件分岐が必要な場合に使用  
- Integration Hub  
  - 外部システムとの API 連携 (REST API, SOAP API)  
  - ServiceNow から Slack、Teams、Salesforce へ通知・データ送信  
  - プラグインとして提供され、別途ライセンスが必要な場合あり  


#### 3. データピル (Data Pill)  
アクションの実行結果やレコード情報を、後続のアクションで利用するための変数のような要素
右側の「データ (Data)」パネルから取得し、ドラッグ＆ドロップで使用可能

| データピルの種類 | 説明 | 例 |
|--------------|------|----|
| トリガーデータ | トリガーによって発生したレコードのデータ | 作成されたインシデントの Number を取得 |
| アクションデータ | 実行済みのアクションの出力データ | User のメールアドレスを取得して通知を送信 |
| スクリプトデータ | スクリプトで処理したカスタムデータ | 2つのフィールドを結合して新しい値を作成 |
| スコープデータ | ループや条件分岐内で使う一時データ | ループ内で現在の担当者を取得して通知 |

詳細  
- トリガーデータ  
  - incident.number や task.state など、トリガー時のレコード情報を取得  
- アクションデータ  
  - ユーザー作成のアクション後に User ID を取得して次の処理に利用  
- スクリプトデータ  
  - カスタム JavaScript で処理したデータを後続のアクションで利用  
- スコープデータ  
  - ループ処理 (For Each) 内で現在のループ要素を取得するために使用  


### まとめ  

Flow Designer の3つの要素がある 

| 要素 | 役割 | 例 |
|------|------|----|
| トリガー (Trigger) | フローの開始条件を決める | インシデントが重大になったら実行 |
| アクション (Action) | 実行する処理を定義 | 担当者にメール通知を送る |
| データピル (Data Pill) | アクション間でデータを受け渡す | インシデント番号を取得して通知に含める |

# 参考
https://qiita.com/phenyo_dikgomo/items/379f2fcbdb0b9556eea2
https://mekeblog.com/servicenow-csa-flow-designer/
個人的な備忘録：ITスクールのハッカソンでECS on Fargateを選択したため、そのメリットを整理してみた

## はじめに

現在、受講しているITスクールのハッカソン活動の一環として、AWS環境への本番デプロイを行うことになりました。その際、EC2ではなく **ECS on Fargate** を採用することを決定しました。

:::note warn
***前回の記事でも紹介しているので、ぜひ参考にしてみてください。***
:::

https://qiita.com/free-honda/items/77b0971ff2485ada13e1

本記事は個人的な備忘録としてのメモですが、最後まで温かい目で見守っていただけると嬉しいです。

## 今回作成したAWS構成図について
詳細は割愛しますが、今回は受講しているITスクールで、以下のようなAWSインフラ構成をコード化しています。

![Screenshot 2025-01-25 at 1.44.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/c06d3316-95b7-4b5d-61e1-67827deee5e2.png)

Terraformによる実装も完了しており、以下の記事でコードの全体像をご紹介しています。

https://qiita.com/free-honda/items/6fdfddf33576b122cf6f

##  ECS on Fargateとは？
ECS on Fargateは、AWSが提供するサーバーレスコンテナ実行環境です。

![Screenshot 2025-02-03 at 7.36.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/6c26a765-5994-fae6-5c38-87eadba9e436.png)
引用画像：https://www.simform.com/blog/aws-fargate-pricing/

従来のECSではEC2インスタンスを管理する必要がありましたが、Fargateを利用するとEC2のプロビジョニングや管理が不要になります。

## ECS on Fargateのメリット

**インフラ管理不要**
- EC2インスタンスの管理が不要になり、OSのパッチ適用やセキュリティ対応が不要
- 必要なリソースだけを指定すれば、自動的に適切なコンピューティングリソースが割り当てられる

**スケーリングが容易**
- タスク単位でのスケーリングが可能（EC2のようにインスタンスの起動・停止を気にする必要なし）
- **AWS Auto Scaling** と統合すれば、トラフィックに応じて自動でスケールアップ・ダウン

**コスト最適化**
- **使用した分だけ課金**（EC2のようにインスタンスを常時起動する必要なし）
- 短時間のバッチ処理やイベント駆動型のワークロードにも最適

**ネットワークのシンプル化**
- タスクごとに **ENI（Elastic Network Interface）** を割り当て可能
- **ALB（Application Load Balancer）** や **NLB（Network Load Balancer）** と簡単に統合

**CI/CDとの統合が簡単**
- **AWS CodePipeline、CodeBuild、CodeDeploy** と連携し、コンテナの自動デプロイが可能
- Dockerイメージを **ECR（Elastic Container Registry）** に保存し、ECS on Fargateへ簡単にデプロイ

## ECS on Fargateを使うべきケース

| シナリオ | Fargateのメリット |
|----------|------------------|
| **EC2管理をなくしたい** | サーバーレスで運用できる |
| **スケールを柔軟にしたい** | タスク単位で自動スケール |
| **コストを最適化したい** | 使用分のみの従量課金 |
| **CI/CDを導入したい** | AWSのCI/CDサービスと統合可能 |
| **イベント駆動のワークロード** | 短時間の処理に最適 |

## 結論：ECS on Fargateはどんなときに最適？

- **EC2の管理負担をなくしたい**
- **スケーリングを自動化したい**
- **一時的なワークロード（バッチ処理、イベント駆動）を効率的に実行したい**
- **AWSのマネージドサービスとの連携をスムーズにしたい**

:::note info
**Fargateを使うことで、インフラ管理の負担を減らし、よりアプリ開発に集中できる環境を実現できます。**
:::

## まとめ

ここまで読んでいただき、ありがとうございました。体系的にまとめることで、**ECS on Fargateがどんなときに最適なのか** を自分の中で明確に言語化できました。

今後も、このような基礎的な内容について **わかりやすく整理していこう** と思います。
Gitで毎回`git push --set-upstream origin master`を求められるのを防ぐ方法

みなさんgit操作をコマンドで行っていますか？コマンド勢の方なら`push --set-upstream`を一度は見たことありませんか？．gitで新しいブランチを作成して`git push`を実行すると，次のようなメッセージが表示されることがある．

```bash
git push fatal: The current branch feature/sample has no upstream branch. To push the current branch and set the remote as upstream, use

git push --set-upstream origin feature/sample
```
これは，現在のブランチに対応するリモートブランチが存在しないため，手動で`git push --set-upstream origin <branch>`を実行してローカルブランチに対応するリモートブランチを設定するように促している．

一度`git push --set-upstream origin <branch>`をすれば，次回以降の`git push`は通常通り動作するが，新しいブランチを作成するたびに同じ手順を踏むのは面倒だ．そこで，この設定を自動化する方法を紹介する．

gitがわからない方は以下の記事を参照してください．

https://qiita.com/JavaLangRuntimeException/items/6b46551f56e0def76eba

## `push.default`の設定を確認する

Gitには，デフォルトのpush動作を制御する`push.default`という設定がある．これを変更することで，`git push --set-upstream`を手動で実行する必要がなくなる．

まず，現在の設定を確認する．
```bash
git config --global push.default
```
この状態は`simple`と呼ばれる状態で，リモート追跡ブランチが設定されていることを前提とし，リモートのブランチ名とローカルのブランチ名が異なる場合に警告を出す設定だ．

## `push.default`の設定を変更する
`push.default`を`current`に設定する．

```bash
git config --global push.default current
```

この設定を行うことで，`git push`を実行した際に現在のローカルブランチと同じ名前のブランチがリモートに存在すれば，そのブランチにpushする．もし存在しなければ，新しく作成してpushする．

## `push.default`の設定値の種類

`push.default`にはいくつかのモードがある．それぞれの動作は次の通り．

- `nothing`  
  デフォルトではpushを行わず，明示的に指定されたブランチのみをpushする

- `current`  
  現在のローカルブランチをリモートブランチにpushする（リモートに存在しなければ作成する）

- `upstream`  
  現在のローカルブランチの`upstream`（追跡）ブランチが設定されていれば，そのブランチにpushする

- `simple`（Git 2.0以降のデフォルト）  
  `upstream`に似ているが，現在のブランチ名とリモートのブランチ名が一致する場合のみpushを許可する

- `matching`  
  ローカルとリモートで同じ名前のブランチすべてをpushする

この中でも，`current`が最も直感的で便利な設定だ．特に個人での開発では，新しいブランチを作成してそのままpushすることが多いため，`git push --set-upstream`を省略できるのは大きな利点になる．
Ubuntuにnginxをインストールするだけです。

## Ubuntuにnginxをインストールします。

まずは、最新の状態に更新しておきます。
権限に応じて頭にsodoとかつけてください。
```
apt update
sudo apt upgrade -y
```

続いてnginxをインストールします。
```
apt install nginx -y
```
インストールできたか確認します。
```
nginx -v
```
こんな感じで出力されたら成功です。
```
nginx version: nginx/1.18.0 (Ubuntu)
```

せっかくなんで起動してみましょう
```
systemctl start nginx
```
起動したか確認です
```
systemctl status nginx
```
acticeってところがrunningになったら成功です。
ちなみにrunning状態で、webからサーバーからアクセスすると、このようになります。
![スクリーンショット 2025-02-03 070930.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3890669/72dac20b-ae07-3209-d148-847accbbf066.png)

以上です。
MSI MPG 274URF QD の DPMS のバグ (?) を迂回する

DPMS はディスプレイを繋いだまま画面をオフにできるためリモートゲーミングの時などに便利な技術ですが、4Kディスプレイの MSI MPG 274URF QD には DPMS にバグ (?) があるようです。しかしながらこのバグを迂回する方法を見つけたのでここに記しておきます。なおPC本体との接続は HDMI1 で行っています。

まずディスプレイのボタンを押してOSDメニューを出して、「設定」→「電源ボタン」という謎オプションを「スタンバイ」に設定してください。これを設定しないとDPMSでディスプレイをoffにしたあとonにできないようです。

まずは必要なパッケージをインストールします。Ubuntu 24.04では以下のような感じです。
```sh
sudo apt install ddcutil ddccontrol
```

ディスプレイのi2cパスを調べるには以下で行います。
```sh
$ sudo ddcutil detect
Display 1
   I2C bus:  /dev/i2c-4
   DRM connector:           card1-HDMI-A-1
   EDID synopsis:
      Mfg id:               MSI - Microstep
      Model:                MPG 274URF QD
      Product code:         48322  (0xbcc2)
      Serial number:        
      Binary serial number: 1 (0x00000001)
      Manufacture year:     2024,  Week: 16
   VCP version:         2.1
```

画面をoffにするには以下で行います（環境変数はdbusのLimitsExceeded問題の回避です）。/dev/i2c-4の部分は上で検出したパスを使用してください。
```sh
DDCCONTROL_NO_DAEMON=1 ddccontrol -r 0xd6 -w 4 dev:/dev/i2c-4
```

画面をonにするには以下で行います。これは誤記ではなく書き込む値は 1 (DPM On) や 0 (?) ではダメで 2 (DPMS Standby) でないと復帰できないようです…。
```sh
DDCCONTROL_NO_DAEMON=1 ddccontrol -r 0xd6 -w 2 dev:/dev/i2c-4
```
【自分用】EKS構築〜EC2接続

EC2からEKSに操作するためには、以下のポリシーが必要

```
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "AllowDescribeCluster",
      "Effect": "Allow",
      "Action": "eks:DescribeCluster",
      "Resource": "*"
    },
    {
      "Sid": "AllowGetCallerIdentity",
      "Effect": "Allow",
      "Action": "sts:GetCallerIdentity",
      "Resource": "*"
    }
  ]
}

```


eksctlコマンドで実行する時に必要なロール
以下のカスタムロール以外にマネージドポリシーが必要
・AWSCloudFormationFullAccess
・AmazonVPCFullAccess
・AmazonEKSWorkerNodePolicy
・AmazonEKSFargatePodExecutionRolePolicy
・AmazonEKSClusterPolicy
・AmazonEC2FullAccess
```
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "eks:DescribeClusterVersions",
                "eks:DescribeCluster",
                "eks:ListClusters",
                "eks:UpdateClusterConfig",
                "eks:DescribeNodegroup",
                "eks:CreateNodegroup",
                "eks:DeleteNodegroup",
                "eks:UpdateNodegroupConfig",
                "eks:DescribeUpdate",
                "eks:ListUpdates"
            ],
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "eks:CreateCluster",
                "eks:DeleteCluster"
            ],
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "eks:TagResource",
                "eks:UntagResource"
            ],
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "eks:CreateFargateProfile",
                "eks:DeleteFargateProfile",
                "eks:DescribeFargateProfile",
                "eks:ListFargateProfiles"
            ],
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "cloudformation:CreateStack",
                "cloudformation:DescribeStacks",
                "cloudformation:DescribeStackResources",
                "cloudformation:ListStacks",
                "cloudformation:DeleteStack"
            ],
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "iam:CreateRole",
                "iam:TagRole",
                "iam:AttachRolePolicy",
                "iam:PutRolePolicy",
                "iam:PassRole"
            ],
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "ec2:CreateVpc",
                "ec2:CreateSubnet",
                "ec2:CreateInternetGateway",
                "ec2:AllocateAddress",
                "ec2:DescribeInstances"
            ],
            "Resource": "*"
        }
    ]
}
```
個人的な備忘録：ITスクールのハッカソンでEC2ではなくECS on Fargateを選んだ理由を解説してみた

## はじめに
現在、受講しているITスクールのハッカソン活動の一環として、AWS環境への本番デプロイを行うことになりました。その際、EC2ではなくECSを採用することに決定しました。

:::note warn
***そこで、AWSの本番環境でECSを使用するメリットや、EC2との違いについて体系的に整理してみようと思います。***
:::

個人の備忘録としてのメモになりますが、最後まで温かい目で見ていただけると幸いです。

## 1. ECSとEC2の基本的な違い

| 項目         | Amazon EC2 | Amazon ECS |
|--------------|-----------|------------|
| 実行環境     | 仮想マシン（VM）を直接管理 | コンテナを管理 |
| デプロイ     | アプリケーションをOSにインストール | Dockerコンテナでデプロイ |
| スケーリング | 手動またはAuto Scaling | Service Auto Scaling（タスク単位でスケール） |
| 運用管理     | OSの管理が必要（パッチ適用、セキュリティ対応） | コンテナレベルでの管理、OS管理不要（Fargate利用時） |
| コスト       | 常時起動のため高コストになりがち | コンテナ単位で管理可能（Fargate利用時は従量課金） |

## 2. ECSを使うメリット

ECSを採用することで、EC2を直接管理するよりも多くのメリットがあります。

### (1) インフラ管理の簡素化
**EC2の場合**
- OSの管理（セキュリティパッチ、アップデート）
- アプリの依存関係の管理（ライブラリ、ミドルウェア）

**ECSの場合**
- コンテナベースのためOS管理不要（Fargate使用時）
- アプリをコンテナにまとめることで、環境依存を最小化

### (2) スケーリングの柔軟性
- EC2はインスタンス単位でのスケーリング（起動・停止に時間がかかる）
- ECSはタスク単位でスケール可能で、即座に増減可能
- ECSのService Auto Scalingを利用すると、負荷に応じた自動スケールが可能

### (3) デプロイの高速化
- ECSではBlue/Greenデプロイやローリングアップデートが容易
- コンテナの再起動のみでアプリ更新が完了するため、ダウンタイムを最小限に抑えられる

### (4) コスト最適化
- EC2はサーバーを常時起動するため、リソースをフルに使わないとコストが割高
- ECSはFargateを利用することで、実行した分だけ課金（サーバーレス運用）
- スポットインスタンスを活用すればEC2よりも安価に運用可能

### (5) CI/CDとの親和性
- ECS + CodePipeline + CodeDeploy で継続的デプロイが簡単に実装可能
- DockerイメージをECR（Elastic Container Registry）に保存し、ECSにデプロイする流れが標準化

## 3. ECSを導入する際の考慮点

ECSを使う際にはいくつかの選択肢があります。

### (1) 実行基盤の選択

| 実行方法 | 説明 | メリット | デメリット |
|----------|------|----------|------------|
| ECS on EC2 | EC2上にECSをセットアップしてコンテナを実行 | 既存のEC2環境を活用できる | EC2の管理が必要 |
| ECS on Fargate | AWSが管理するコンテナ基盤でサーバーレス実行 | OS管理不要、リソース管理不要 | 高頻度利用時のコスト増 |
| EKS (Kubernetes on AWS) | マネージドKubernetes | Kubernetesのエコシステムを活用可能 | 運用負担が増える |

➡ 基本的には **ECS on Fargate** が最も運用コストが低い選択肢

### (2) ネットワーク設計
- ECSのコンテナはVPC内の **ENI（Elastic Network Interface）** を利用
- **ALB（Application Load Balancer）** と統合して、トラフィックを分散可能
- **VPCのIP枯渇問題** に注意（特にFargate利用時）

### (3) ログ管理
- **CloudWatch Logs** と統合可能
- **Datadog** や **New Relic** などのAPMツールとも連携可能

### (4) モニタリング
- **AWS CloudWatch Metrics** でECSのリソース使用状況を監視
- **AWS X-Ray** でトレース分析が可能

## 4. ECSを使うべきケース

以下のような場合は、ECSの導入が特に有効です。

| シナリオ | ECSのメリット |
|----------|--------------|
| アプリのコンテナ化を推進したい | Dockerベースで運用できる |
| スケーラブルなWebサービス | 自動スケールでコスト最適化 |
| 継続的デプロイをしたい | CI/CDとの統合が容易 |
| オンプレミスからクラウド移行 | 既存アプリをコンテナ化しやすい |
| イベント駆動型の短時間の処理 | Fargateの従量課金でコスト削減 |

## 5. ECSとEC2の使い分け

| 利用ケース | EC2 | ECS |
|------------|----|----|
| フルコントロールが必要な場合 | ✅ | ❌ |
| コンテナアプリの運用 | ❌ | ✅ |
| 可用性を確保したい | △（冗長構成が必要） | ✅ |
| スケールの柔軟性 | △ | ✅ |
| 運用コストを抑えたい | ❌（常時起動コスト） | ✅（Fargateなら従量課金） |
| CI/CDを導入したい | ❌（手間がかかる） | ✅（CodePipelineと連携） |

## まとめ：ECSを使うべき理由

- **コンテナ管理の自動化**（スケール、デプロイ、ヘルスチェック）
- **Fargateを使えばOS管理が不要** になり運用負担が大幅に軽減
- **コスト最適化**（必要な分だけリソースを確保できる）
- **CI/CDとの連携が容易** で、本番環境へのデプロイがスムーズ
- **AWSのマネージドサービスと統合しやすい**（ALB, CloudWatch, RDSなど）

私の結論としては、特にFargateを活用することでEC2の管理負担がなくなり、より効率的に運用できると考えました。
【拡張機能】ウェブページのフォントを濃くする「Font-Weighter」【習作2】

# はじめに
前回に引き続き拡張機能の習作を作りました。
今回は、文字を太くして読みづらいWebページを読みやすくするものです。
たまに文字が細かったり色が薄かったりして読みづらいページに遭遇することが多々あったので、それを解消するために作りました。
習作ゆえ前回と同じく非常にシンプルな機能となっています。
よければ使ってみてください。
ついでに前回の習作もどうぞ↓↓

https://qiita.com/syab-syab/items/559c2262aefccf56b8f7

# 拡張機能に追加する方法
- [zipファイル](https://drive.google.com/file/d/1yTM9b2HIsXMO3LcswzcpOSpEpBX1cFR8/view?usp=sharing)をダウンロードして解凍する
- [chrome://extensions/](chrome://extensions/)にアクセス
- デベロッパーモードにする
- パッケージ化されていない拡張機能を取り込むをクリック
- 解凍したフォルダを選択する
- すべての拡張機能の欄に「Font weighter
0.0.1」追加されるので、右下のスイッチを青にして有効にする
- アドレスバーの右にあるパズルのピースのようなアイコンをクリックしてポップアップを出す
![パズルのピースcapスクリーンショット (548).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2634870/b0abffaf-4078-88a6-4709-090c78b788c0.png)
- 画鋲のようなアイコンをクリックして青(有効)にする

# 使い方
- アドレスバーの右側に追加されたアイコンをクリックしてポップアップを出す
![jisakuアイコンcapスクリーンショット (548).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2634870/8e9d2790-218d-e087-ee86-b6eb4f898d01.png)
![ポップアップを出すver2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2634870/e3a1f2cb-9944-1d99-b3a1-a4755327675f.png)
- 「はい」を選択
![はいを選択.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2634870/0f0ced41-63f8-8af6-9cdc-9978207667f5.png)
- 文字が太くなって読みやすくなる
<strong>Before</strong>
![before.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2634870/9a5c3892-4884-e894-592e-9dd14237e191.png)
<strong>After</strong>
![After.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2634870/0e1c6ebd-e57b-568c-cc0f-3d8325b465fc.png)




# まとめ
種を明かすと、Webページのbody要素にfont-weight: bold;をかけただけです(笑)。
今まではいちいちデベロッパーツールでやっていたのですが、いい機会なので拡張機能として作ってみた次第です。
Webアプリと比べてアイディアがどんどん湧いてくるし作るのも比較的簡単なので、役に立ちそうな拡張機能をどんどん作っていこうという意欲が湧いてきます。
Plasmoの使い勝手が本当に良いので助かります。
ちなみに状態管理はJotaiやReduxといったReactお馴染みのライブラリも使えるのですが、前回も今回もuseStorageというlocalStorageに状態を保存できるものを使っています。特にこだわりはないけど、Webアプリを作っていたときも何かとlocalStorageに円があるのですっかりなれしたしみまし
習作をもう一、二作ほど公開したら、chromeウェブストアでよりも使いやすく多機能にしたものを作って配布できたらいいなと考えています。
M5StampS3、SNTPで時間を取得して遊ぶ。(3.1.1)


参考


https://www.autumn-color.com/archives/839


x 過去ログを見よ!!
x 3.1.1
x なぜか、なんかいか「ツール」-「シリアルモニター」を開くと成功する(Windows系)

目的
時間を取得する


各自、書き換える

```c++

const char *ssid = "ご自宅のSSID";
const char *password = "ご自宅のパスワード";

```



結果
----

![o_coq790.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/cdd2b90e-04c0-21df-e723-fa9148ef652f.jpeg)



プログラム
----


```c++


//ser_time_h_1_esp32_s3_1
//
//https://www.autumn-color.com/archives/839
//


//インクルド
#include <WiFi.h>
#include <time.h>

//定義
#define JST  3600*9

const char *ssid = "ご自宅のSSID";
const char *password = "ご自宅のパスワード";


void setup() {

  //WiFiの初期化
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);

  //シリアルの初期化 esp32-s3 usb-serial
  Serial.begin(9600);
  Serial.println();
  //シリアルの待ちが0.5*9
  //delay(3000);//決め打ちなので、おかしかったら調整してね! wifiの待ち0.5*6
  for (int i = 0; i < (9+6); i++) {
    delay(500);  //接続待ち
    Serial.print('.');
  }  //for
  Serial.println();

  Serial.println("\nSTART\n");
  
  Serial.println();
  Serial.printf("Connected, IP address: ");
  Serial.println(WiFi.localIP());

  configTime( JST, 0, "ntp.nict.jp", "ntp.jst.mfeed.ad.jp");

}//setup


void loop() {

  time_t t;
  struct tm *tm;
  static const char *wd[7] = {"Sun","Mon","Tue","Wed","Thr","Fri","Sat"};

  t = time(NULL);
  tm = localtime(&t);
  Serial.printf(" %04d/%02d/%02d(%s) %02d:%02d:%02d\n",
        tm->tm_year+1900, tm->tm_mon+1, tm->tm_mday,
        wd[tm->tm_wday],
        tm->tm_hour, tm->tm_min, tm->tm_sec);
  delay(1000);
    
}//loop



```
2025/2/3主にITとかセキュリティの記事

WhatsApp新型スパイウェア攻撃が発覚 – イスラエルParagon社製ツールで90名のジャーナリストを標的に(2/1)
https://innovatopia.jp/cyber-security/cyber-security-news/47450/

GoogleのAI「Gemini」が犯罪組織に悪用される実態が明らかに ー イラン政府関連組織が最多(2/1)
https://xenospectrum.com/googles-ai-gemini-revealed-to-be-misused-by-criminal-organizations/

クラウドに関する記事のまとめ(2025.1.27～2025.2.1）
https://blogs.itmedia.co.jp/business20/2025/02/2025127202521.html?ref=rss

Androidユーザー必見。手動で有効にしないと使えない盗難防止機能の設定方法(1/31)
https://www.lifehacker.jp/article/2501-pixel-galaxy-owners-should-enable-android-identity-check-anti-theft-feature/

DeepSeek利用のリスクを2人の専門家が指摘、収集データの「多さ」と「扱い」を注視(1/31)
https://xtech.nikkei.com/atcl/nxt/column/18/03084/013100007/

中国AIディープシーク、悪意ある質問にも回答
サイバー攻撃やテロに悪用リスク(2/1)
https://www.nikkei.com/article/DGKKZO86454460R30C25A1EA5000/

PDFに関する新たなサイバー攻撃、スマホで本物と確認せずに開くな(2/1)
https://forbesjapan.com/articles/detail/76801
https://forbesjapan.com/articles/detail/76801?module=toppage_new

Rails 8で本番利用可能になったSQLiteをつかうとGoogle Cloudでほぼ無料で運用ができそうな件(1/30)
https://zenn.dev/kiyokato/articles/6d4b6f629768b7

OpenAIが最新推論モデル「o3-mini」を無料で提供開始 ―― STEM分野で高精度化(2/1)
https://xenospectrum.com/openai-launches-its-latest-reasoning-model-o3-mini-for-free/

2024 年に実施した Android アプリのエコシステムを安全に保つための取り組み(1/31)
https://blog.google/intl/ja-jp/products/android-chrome-play/google-play-safety-in-2024/

彼らは私たちに何を考えるべきかを教えるだけでなく、”どのように”考えるべきかを教え込む　ケイトリン・ジョンストン+いくつかの考察(2/1)
https://alzhacker.com/they-dont-just-tell-us-what-to-think-they-train-us-how-to-think/

世界経済フォーラム (WEF) AIに関連する文書 (White Papeer) (2025.01.21)(2/1)
http://maruyama-mitsuhiko.cocolog-nifty.com/security/2025/01/post-c400f6.html

欧州連合 競争力コンパス (2025.01.29)(2/2)
http://maruyama-mitsuhiko.cocolog-nifty.com/security/2025/02/

Google Playで「違反アプリ236万件」をブロック、Google(2/1)
https://news.mynavi.jp/techplus/article/20250201-3119686/

第7回 日本のAI関連の法律、規制、ガイドライン AIガバナンスの最前線(1/31)
https://www2.deloitte.com/jp/ja/blog/ai-institute/2025/ai-governance-07.html

高校生によるクレジットカード情報の不正取得事案についてまとめてみた(1/31)
https://piyolog.hatenadiary.jp/entry/2025/01/31/235432

伊万里市から受託の旅行業者　誤って移住ツアー申込者情報をサイトに掲載(2/1)
https://www.saga-s.co.jp/articles/-/1401156

いじめアンケートの結果も閲覧可能に…富山県内の学校で相次ぐ教育用クラウド巡る問題 DXが進む現場の今(1/31)
https://www.fnn.jp/articles/-/822758

福岡県の税務システムで障害発生　税金記録の参照・更新できず　納付書による納税に影響なし　復旧の見通し立たず(1/31)
https://newsdig.tbs.co.jp/articles/-/1701375?display=1
https://newsdig.tbs.co.jp/articles/rkb/1701375?display=1

能動的サイバー防御の危うさ　平時から監視するのは通信の秘密侵害？(1/31)
https://www.chunichi.co.jp/article/1019063?rct=tokuho

解雇された元職員の“逆襲”？　大英博物館のシステム障害から学ぶ内部脅威対策(1/31)
https://techtarget.itmedia.co.jp/tt/news/2501/31/news08.html

経済産業省 産業データの越境データ管理等に関するマニュアル (2025.01.27)(2/1)
http://maruyama-mitsuhiko.cocolog-nifty.com/security/2025/01/post-0bbedc.html

【2025年地政学リスク展望】～2025年、注目すべき地政学リスクとエネルギー産業への影響～(1/31)
https://www.pwc.com/jp/ja/knowledge/newsletters/electricity/202501.html

EUのAI法は“時期尚早”なのか？　専門家が懸念するこれだけの理由(1/31)
https://techtarget.itmedia.co.jp/tt/news/2501/31/news09.html

2月1日〜3月18日は「サイバーセキュリティ月間」、特設サイトはすでにオープン(1/31)
https://nordot.app/1257969639155597444?c=1179248089549373591

「2025年の崖（がけ）」に直面している日本企業の問題とその先にあるもの(1/31)
https://www.am-one.co.jp/warashibe/article/chiehako-20250131-1.html
確率はコイントス問題で表現すると分かりやすい説


## はじめに

例えば、0.1%と言われてもいまいちピンと来ない。

これを大体コイントスで10回中10回表が出る確率と言われれば、肌感覚でその確率が分かりやすいのではないだろうか？

というのが、この記事を書こうと思ったきっかけ。

## コイントス問題への変換方法

結論から書くと2進数で表記すれば分かる。

例えば、0.05%はコイントス問題ではどう表されるだろうか？

まず0.05%は割合としては0.0005である。

そして0.0005を2進数に変換すると大体
$0.0000000000100000110001001$
となる。[^1][^2]

[^1]:これは近似値
[^2]:次のサイトで求めた → https://mathwords.net/syosuu2sin

これは次の数の和でもある。

```
0.00000000001
0.00000000000000001
0.000000000000000001
0.0000000000000000000001
0.0000000000000000000000001
```

そして、これらを10進数で表すと以下のようになる。

```math
\begin{align}
(0.00000000001)_2 &= \left( \frac{1}{2} \right)^{11} \\
(0.00000000000000001)_2 &= \left( \frac{1}{2} \right)^{17} \\
(0.000000000000000001)_2 &= \left( \frac{1}{2} \right)^{18} \\
(0.0000000000000000000001)_2 &= \left( \frac{1}{2} \right)^{22} \\
(0.0000000000000000000000001)_2 &= \left( \frac{1}{2} \right)^{25}
\end{align}
```

という訳で、0.05%は

大体、裏が出るまでコイントスをして
10回表がでるか、
16回表がでるか、
17回表がでるか、
21回表がでるか、
24回表がでる確率だよ～[^3]

と説明できる。

[^3]:マイナス1しているのは最後に裏が出る確率も考慮しているから。

## チラ裏

なんか思ってたのと違う。
N回中M回表がでる確率みたいなのがよかったなあ。

あとカスミナーフしろ！
用語解説　プロになるためのWeb技術入門

プロになるためのWeb技術入門を読んで自身で調べたり、解釈した内容を解説していきます。

## リクエスト
例えば、GoogleChromで何か調べたい用語等を入力してEnterを押下したり、ECサイトで欲しい商品をクリックするなどクライアント側（Webサイトを見たり、パソコン・スマホを操作する側）が何かの情報を求めるあるいは何かの処理を依頼した際、サーバー側に情報が送られることをリクエストといいます。

## レスポンス
例えばECサイトで欲しい商品をクリックするとその商品の詳細ページが表示されたり、ユーザー新規登録で情報を入力して新規登録ボタンを押下したらユーザー情報が登録されたりなど、リクエストに沿ったファイルの表示や入力情報の登録などクライアントからのリクエストに対する結果をレスポンスといいます。

## プロトコル
コンピュータにおけるプロトコルとはコンピュータ同士が通信する際の通信方法の取り決め（ルール）のことです。
Webページを閲覧する際に使われる通信プロトコルで代表的ものは「HTTP」（Hypertext Transfer Protocol）というのですが、IETF (Internet Engineering Task Force) というインターネット関連の技術標準を策定する非営利団体が管理をしています。
代表的なメソッドでサーバーから情報を取得する「**GETメソッド**」やサーバーにデータを送信する「**POSTメソッド**」があり、代表的なステータスコード（リクエストの成功/失敗等の結果を表す3桁の数字）は「**200 OK**」や「**404 Not Found**」、「**500 Internal Server Error**」など様々なルールが取り決めされています。

もしHTTPについてより詳しく知りたい方がいましたら下記HPをご参照ください。
<a href="https://developer.mozilla.org/ja/docs/Web/HTTP">HTTP - MDN Web Docs</a>

## ポート番号
ポート番号とは通信をする際にホストと組み合わせて指定されるもので、コンピューター内（ホスト）の特定のアプリケーションを識別するための番号です。例えば郵便物（データ）を届ける際に建物（ホスト）だけでは届かないので部屋番号（ポート番号）を組み合わせることで郵便物（データ）が正しい場所に届くということです。
ポート番号は65,536個（0〜65535)あり、「http」では**80番**、「https」では**443番**といった具合に標準で利用すべきポート番号がプロトコルごとに決められています。
ポート番号はIANA（アイアナ）という機関が管理しています。

## ステートレス
ステートレスとは通信の送受信が独立しており、前後のリクエストや送信元に関係なく処理され、状態を持たないやりとりです。（代表例：HTTP）
人間同士のコミュニケーションに例えると手紙のやりとりです。
手紙は１通ごとにのやりとりが独立しており注意深く自身で管理しておかない限り、前後関係や内容がわからなくなるような状態になるというイメージです。

## ステートフル
ステートフルはステートレスと反対の状態で、通信の開始と終了が明確で、その間の一連の通信が識別できるようになっています。（代表例：WebSocket　詳しく知りたい方は<a href="https://developer.mozilla.org/ja/docs/Web/API/WebSockets_API">こちら</a>)
一連の通信を「セッション」と呼びます。
かなりイメージしづらいと思うのですが、人間のコミュニケーションに例えると電話のやりとりになります。
電話の場合は通話を開始すると通話を切るまで会話ができるので前後関係も内容も把握した状況でのやりとりだと思うのですが、これがセッションでありステートフルである状態といえます。
- 手紙のやりとりが「**ステートレス**」
- 電話のやりとりが「**ステートフル**」

## クッキー
HTTPにはセッションの考え方がないためHTTPサーバとHTTPクライアントの間で状態を管理するために考えられたメカニズムです。
Webサイト側がユーザーの情報を一時的に保存するための仕組みとなっております。
例えばECサイトでログインしていない状態でりんごを買い物かごに入れたとします。一旦離れて再度同じECサイトでバナナを買い物かごに入れたとしてもクッキーによって前回買い物かごに入れたりんごの情報が残っているといったことです。（基本的にブラウザを終了したらクッキーも消去されるのですが、タブの復元やクッキーの種類によっては、ブラウザを終了しても消去されないものもあるみたいです。）


読んだ内容、調べた内容をなるべく自身の言葉で書かせていただきました。
わかりづらい部分もあるかと思いますが、参考になれば幸いです。

**書籍の引用**
> 小森 裕介. ［改訂新版］プロになるためのWeb技術入門 (第2版). 技術評論社, 2024.

**Webサイトの引用**
>HTTP - MDN Web Docs. 2025年2月2日最終アクセス.
> https://developer.mozilla.org/ja/docs/Web/HTTP
> WebSocket API (WebSockets) - MDN Web Docs. 2025年2月2日最終アクセス.
> https://developer.mozilla.org/ja/docs/Web/API/WebSockets_API
kinoはCentOS8からVSCodeを開きたい

これは、「CentOSからVSCode開いてみたいじょ～」と語る一人の男の物語・・・

# 章一：VSCode本体のダウンロード

「はいdnfで落として入れて、code .って打ちゃいいのねヨユーヨユー」

**起動せんが？**

いやちょっと待てよ話が違うじゃんか先人たち。えっなんか見落としてる？エラーすら出ないから無理ゲーなんですがこれ。

エラーが出てないなら起動はしてんのか・・・

**じゃあなんか前提があんだろ、書かれてないだけで。**

# 章二：Xvfbとの出会い

「あれかー・・・そもそもがCLIオンリーだからなんか必要なのか・・・」

```cli:エラー
Missing X server or $DISPLAY
```

でぃすぷれー・・・あぁやっぱ要るんじゃん。

と思ってたらGithubの方でおんなじエラーやってんじゃん！勝ったな風呂食ってくる。

```Git:翻訳
これをリモートで実行していますか、それとも表示するディスプレイがない VM で実行していますか? 
この問題は通常、Chromium が GUI を起動しようとしているが、接続するディスプレイがない場合に発生します。
Linux では、通常、などのソフトウェアを使用してこの問題を解決できますxvfb。
```

**風呂うめぇ～！**

さっそくインストールしよか、そんでまたcode .でっと・・・

**起動せんが？くそ不味ぃわこれ。**

えっえっなんで？解決できるゆーてるやん。解決せんやんこんなら。どないせーちゅんや。

そもそもXvfbイズ何？

```Wiki:Wiki
XvfbまたはX 仮想フレームバッファは、 X11ディスプレイ サーバ プロトコルを実装したディスプレイ サーバです。
他のディスプレイ サーバとは異なり、Xvfb は画面出力を表示せずにすべてのグラフィック操作を仮想メモリ内で実行します。
```

**画面出力ないんかいや。**

ということは、あとはでぃすぷれーがあればいいんだな？

# 章三：邂逅、VcXsrv

えーわかりません。ないです。でぃすぷれー。

いったん他あたるか・・・、おっ、これいいんじゃないか。VcXsrv。

Windows側にインストールして、いろいろ設定してcode .打って、

**ようやく映った！長かった！**

・・・これさぁ、Xvfbいるのか？消してみっか。

**起動せんが？必要なのオマエ？？？**

# ざっくり用途

というわけで、ここまで使ったものがどういったものかまとめてみる。

**VSCode**
いわずもがな。なんだけど、CentOS上で動いてても見せる場所がないと輝けないよねってことで。

**Xvfb**

```
Xvfb は画面出力を表示せずにすべてのグラフィック操作を仮想メモリ内で実行します。
```

ということは、ざっくりヘッドレスブラウザを指してるっぽい。こいつを投入した時点で、VSCodeをGUI表示する準備はできてた・・・ってコト！？

**VcXsrv**
主役です。こいつでGUI表示が可能になります。

# 雑記

マジで詰まってました。code --verbose打って格闘してたり、これ要るんかなぁ・・・とかやってたり、xvfb-run firefox打って「コマンドが見つかりません」⇒「はぁそうですか・・・」やってたり。

ちなみに今回の一連のキーワードは「X Window System」もとい「X Server」というらしいです。UNIX、Linuxではド基礎らしいです。やめてください初めに言っといてください初耳なので。